@juspay/neurolink 9.39.0 → 9.40.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.
- package/CHANGELOG.md +6 -0
- package/dist/browser/neurolink.min.js +12 -5
- package/dist/lib/neurolink.d.ts +6 -1
- package/dist/lib/neurolink.js +76 -12
- package/dist/lib/types/generateTypes.d.ts +29 -0
- package/dist/lib/types/index.d.ts +1 -1
- package/dist/lib/types/streamTypes.d.ts +7 -0
- package/dist/neurolink.d.ts +6 -1
- package/dist/neurolink.js +76 -12
- package/dist/types/generateTypes.d.ts +29 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/streamTypes.d.ts +7 -0
- package/package.json +2 -2
|
@@ -2012,19 +2012,26 @@ ${e}`,timestamp:new Date().toISOString(),metadata:{isSummary:!0,summarizesFrom:t
|
|
|
2012
2012
|
|
|
2013
2013
|
${e}
|
|
2014
2014
|
|
|
2015
|
-
Current user's request: ${t}`}
|
|
2016
|
-
Assistant: ${t}`;await o.add(n,i)}}catch(o){g.warn("Memory storage failed:",o)}})}setupHITLEventForwarding(){this.hitlManager&&(this.hitlManager.on("hitl:confirmation-request",e=>{g.debug("Forwarding HITL confirmation request",{confirmationId:e.payload?.confirmationId,toolName:e.payload?.toolName}),this.emitter.emit("hitl:confirmation-request",e)}),this.hitlManager.on("hitl:timeout",e=>{g.debug("Forwarding HITL timeout event",{confirmationId:e.payload?.confirmationId,toolName:e.payload?.toolName}),this.emitter.emit("hitl:timeout",e)}),this.emitter.on("hitl:confirmation-response",e=>{let t=e;g.debug("Received HITL confirmation response",{confirmationId:t.payload?.confirmationId,approved:t.payload?.approved}),this.hitlManager?.emit("hitl:confirmation-response",t)}),g.debug("HITL event forwarding configured successfully"))}initializeExternalServerManager(e,t,n){let o=process.hrtime.bigint();try{this.externalServerManager=new mb({maxServers:20,defaultTimeout:Math.max(1e4,Number(process.env.MCP_CLIENT_TIMEOUT)||6e4),enableAutoRestart:!0,enablePerformanceMonitoring:!0},{enableMainRegistryIntegration:!0});let s=process.hrtime.bigint()-o;g.debug("[NeuroLink] \u2705 LOG_POINT_C010_EXTERNAL_SERVER_INIT_SUCCESS",{logPoint:"C010_EXTERNAL_SERVER_INIT_SUCCESS",constructorId:e,timestamp:new Date().toISOString(),elapsedMs:Date.now()-t,elapsedNs:(process.hrtime.bigint()-n).toString(),externalServerInitDurationNs:s.toString(),externalServerInitDurationMs:Number(s)/Ml,hasExternalServerManager:!!this.externalServerManager,message:"External server manager initialized successfully"}),this.setupExternalServerEventHandlers(e)}catch(i){let a=process.hrtime.bigint()-o;throw g.error("[NeuroLink] \u274C LOG_POINT_C013_EXTERNAL_SERVER_INIT_ERROR",{logPoint:"C013_EXTERNAL_SERVER_INIT_ERROR",constructorId:e,timestamp:new Date().toISOString(),elapsedMs:Date.now()-t,elapsedNs:(process.hrtime.bigint()-n).toString(),externalServerInitDurationNs:a.toString(),externalServerInitDurationMs:Number(a)/Ml,error:i instanceof Error?i.message:String(i),errorName:i instanceof Error?i.name:"UnknownError",errorStack:i instanceof Error?i.stack:void 0,message:"External server manager initialization failed"}),i}}setupExternalServerEventHandlers(e){this.externalServerManager.on("connected",t=>{g.debug("[NeuroLink] \u{1F517} EXTERNAL_SERVER_EVENT_CONNECTED",{constructorId:e,eventType:"connected",event:t,timestamp:new Date().toISOString(),message:"External MCP server connected event received"}),this.emitter.emit("externalMCP:serverConnected",t)}),this.externalServerManager.on("disconnected",t=>{g.debug("[NeuroLink] \u{1F517} EXTERNAL_SERVER_EVENT_DISCONNECTED",{constructorId:e,eventType:"disconnected",event:t,timestamp:new Date().toISOString(),message:"External MCP server disconnected event received"}),this.emitter.emit("externalMCP:serverDisconnected",t)}),this.externalServerManager.on("failed",t=>{g.warn("[NeuroLink] \u{1F517} EXTERNAL_SERVER_EVENT_FAILED",{constructorId:e,eventType:"failed",event:t,timestamp:new Date().toISOString(),message:"External MCP server failed event received"}),this.emitter.emit("externalMCP:serverFailed",t)}),this.externalServerManager.on("toolDiscovered",t=>{g.debug("[NeuroLink] \u{1F517} EXTERNAL_SERVER_EVENT_TOOL_DISCOVERED",{constructorId:e,eventType:"toolDiscovered",toolName:t.toolName,serverId:t.serverId,timestamp:new Date().toISOString(),message:"External MCP tool discovered event received"}),this.emitter.emit("externalMCP:toolDiscovered",t)}),this.externalServerManager.on("toolRemoved",t=>{g.debug("[NeuroLink] \u{1F517} EXTERNAL_SERVER_EVENT_TOOL_REMOVED",{constructorId:e,eventType:"toolRemoved",toolName:t.toolName,serverId:t.serverId,timestamp:new Date().toISOString(),message:"External MCP tool removed event received"}),this.emitter.emit("externalMCP:toolRemoved",t),this.unregisterExternalMCPToolFromRegistry(t.toolName)})}initializeLangfuse(e,t,n){let o=process.hrtime.bigint();try{let i=this.observabilityConfig?.langfuse,s=i?.autoDetectExternalProvider===!0||i?.useExternalTracerProvider===!0;if(i?.enabled||s){g.debug("[NeuroLink] \u{1F4CA} LOG_POINT_C019_LANGFUSE_INIT_START",{logPoint:"C019_LANGFUSE_INIT_START",constructorId:e,timestamp:new Date().toISOString(),elapsedMs:Date.now()-t,elapsedNs:(process.hrtime.bigint()-n).toString(),langfuseInitStartTimeNs:o.toString(),message:"Starting Langfuse observability initialization"}),xD(i);let a=U5(),l=process.hrtime.bigint()-o;a.initialized&&a.hasProcessor&&a.isHealthy?g.debug("[NeuroLink] \u2705 LOG_POINT_C020_LANGFUSE_INIT_SUCCESS",{logPoint:"C020_LANGFUSE_INIT_SUCCESS",constructorId:e,timestamp:new Date().toISOString(),elapsedMs:Date.now()-t,elapsedNs:(process.hrtime.bigint()-n).toString(),langfuseInitDurationNs:l.toString(),langfuseInitDurationMs:Number(l)/1e6,healthStatus:a,message:"Langfuse observability initialized successfully"}):g.warn("[NeuroLink] \u26A0\uFE0F LOG_POINT_C021_LANGFUSE_INIT_WARNING",{logPoint:"C021_LANGFUSE_INIT_WARNING",constructorId:e,timestamp:new Date().toISOString(),elapsedMs:Date.now()-t,elapsedNs:(process.hrtime.bigint()-n).toString(),langfuseInitDurationNs:l.toString(),healthStatus:a,message:"Langfuse initialized but not healthy"})}else g.debug("[NeuroLink] \u{1F6AB} LOG_POINT_C022_LANGFUSE_DISABLED",{logPoint:"C022_LANGFUSE_DISABLED",constructorId:e,timestamp:new Date().toISOString(),elapsedMs:Date.now()-t,elapsedNs:(process.hrtime.bigint()-n).toString(),message:"Langfuse observability not enabled - skipping initialization"})}catch(i){let s=process.hrtime.bigint()-o;g.error("[NeuroLink] \u274C LOG_POINT_C023_LANGFUSE_INIT_ERROR",{logPoint:"C023_LANGFUSE_INIT_ERROR",constructorId:e,timestamp:new Date().toISOString(),elapsedMs:Date.now()-t,elapsedNs:(process.hrtime.bigint()-n).toString(),langfuseInitDurationNs:s.toString(),errorMessage:i instanceof Error?i.message:String(i),errorStack:i instanceof Error?i.stack:void 0,message:"Langfuse observability initialization failed"})}}logConstructorComplete(e,t,n){let i=process.hrtime.bigint()-n;g.debug("\u{1F3C1} LOG_POINT_C014_CONSTRUCTOR_COMPLETE",{logPoint:"C014_CONSTRUCTOR_COMPLETE",constructorId:e,timestamp:new Date().toISOString(),constructorDurationNs:i.toString(),constructorDurationMs:Number(i)/Ml,totalElapsedMs:Date.now()-t,finalState:{hasConversationMemory:!!this.conversationMemory,hasExternalServerManager:!!this.externalServerManager,hasEmitter:!!this.emitter,mcpInitialized:this.mcpInitialized,toolCircuitBreakersCount:this.toolCircuitBreakers.size,toolExecutionMetricsCount:this.toolExecutionMetrics.size},finalMemoryUsage:process.memoryUsage(),finalCpuUsage:process.cpuUsage(),message:"NeuroLink constructor completed successfully with all components initialized"})}async initializeMCP(){if(!(this.mcpInitialized||this.mcpSkipped)){if(this.mcpInitPromise)return this.mcpInitPromise;if(process.env.NEUROLINK_SKIP_MCP==="true"){this.mcpInitPromise=(async()=>{await this.initializeProviderRegistryInternal(),this.mcpSkipped=!0})();try{await this.mcpInitPromise}finally{this.mcpInitPromise=null}return}this.mcpInitPromise=this.performMCPInitializationOnce();try{await this.mcpInitPromise}finally{this.mcpInitPromise=null}}}async performMCPInitializationOnce(){let e=`mcp-init-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,t=Date.now(),n=process.hrtime.bigint(),o=await this.importPerformanceManager(e,t,n),i=o?o.getMemoryUsageMB():{heapUsed:0,heapTotal:0,rss:0,external:0};try{await this.performMCPInitialization(e,t,n,i),this.mcpInitialized=!0,this.logMCPInitComplete(i,o,t)}catch(s){let a=Date.now()-t,l=process.hrtime.bigint()-n;ne.warn("[NeuroLink] MCP initialization failed",{mcpInitId:e,error:s instanceof Error?s.message:String(s),errorName:s instanceof Error?s.name:"UnknownError",errorStack:s instanceof Error?s.stack:void 0,initializationTime:a,initializationTimeNs:l.toString(),initializationPhase:"performMCPInitialization",memoryUsage:process.memoryUsage(),timestamp:new Date().toISOString(),gracefulDegradation:!0})}}async importPerformanceManager(e,t,n){let o=process.hrtime.bigint();try{return(await Promise.resolve().then(()=>(z0(),$0))).MemoryManager}catch(i){let a=process.hrtime.bigint()-o;g.warn("[NeuroLink] \u26A0\uFE0F LOG_POINT_M005_PERFORMANCE_IMPORT_ERROR",{logPoint:"M005_PERFORMANCE_IMPORT_ERROR",mcpInitId:e,timestamp:new Date().toISOString(),elapsedMs:Date.now()-t,elapsedNs:(process.hrtime.bigint()-n).toString(),performanceImportDurationNs:a.toString(),performanceImportDurationMs:Number(a)/Ml,error:i instanceof Error?i.message:String(i),errorName:i instanceof Error?i.name:"UnknownError",message:"MemoryManager import failed - continuing without performance tracking"});return}}async performMCPInitialization(e,t,n,o){g.info("[NeuroLink] \u{1F680} LOG_POINT_M006_MCP_MAIN_INIT_START",{logPoint:"M006_MCP_MAIN_INIT_START",mcpInitId:e,timestamp:new Date().toISOString(),elapsedMs:Date.now()-t,elapsedNs:(process.hrtime.bigint()-n).toString(),startMemory:o,message:"Starting isolated MCP initialization process"}),ne.debug("[NeuroLink] Starting isolated MCP initialization..."),await this.initializeToolRegistryInternal(),await this.initializeProviderRegistryInternal(),await this.registerDirectToolsServerInternal(e,t,n),await this.loadMCPConfigurationInternal()}async initializeToolRegistryInternal(){await Promise.race([Promise.resolve(),new Promise((t,n)=>{setTimeout(()=>n(new Error("MCP initialization timeout")),3e3)})])}async initializeProviderRegistryInternal(){await al.registerAllProviders()}async registerDirectToolsServerInternal(e,t,n){let o=process.hrtime.bigint();try{process.env.NEUROLINK_DISABLE_DIRECT_TOOLS==="true"?ne.debug("Direct tools server are disabled via environment variable."):(await this.toolRegistry.registerServer("neurolink-direct",iJ),ne.debug("[NeuroLink] Direct tools server registered successfully",{serverId:"neurolink-direct"}))}catch(i){let a=process.hrtime.bigint()-o;g.warn("[NeuroLink] \u26A0\uFE0F LOG_POINT_M013_DIRECT_TOOLS_ERROR",{logPoint:"M013_DIRECT_TOOLS_ERROR",mcpInitId:e,timestamp:new Date().toISOString(),elapsedMs:Date.now()-t,elapsedNs:(process.hrtime.bigint()-n).toString(),directToolsDurationNs:a.toString(),directToolsDurationMs:Number(a)/Ml,error:i instanceof Error?i.message:String(i),errorName:i instanceof Error?i.name:"UnknownError",errorStack:i instanceof Error?i.stack:void 0,serverId:"neurolink-direct",message:"Direct tools server registration failed but continuing"}),ne.warn("[NeuroLink] Failed to register direct tools server",{error:i instanceof Error?i.message:String(i)})}}async loadMCPConfigurationInternal(){try{let e=await this.externalServerManager.loadMCPConfiguration(void 0,{parallel:!0});ne.debug("[NeuroLink] MCP configuration loaded successfully",{serversLoaded:e.serversLoaded,errors:e.errors.length}),e.errors.length>0&&ne.warn("[NeuroLink] Some MCP servers failed to load",{errors:e.errors})}catch(e){ne.warn("[NeuroLink] MCP configuration loading failed",{error:e instanceof Error?e.message:String(e)})}}logMCPInitComplete(e,t,n){let i=(t?t.getMemoryUsageMB():{heapUsed:0,heapTotal:0,rss:0,external:0}).heapUsed-e.heapUsed,s=Date.now()-n;ne.debug("[NeuroLink] MCP initialization completed successfully",{initTime:`${s}ms`,memoryUsed:`${i}MB`}),i>Ou.MODERATE_USAGE_MB&&ne.debug("\u{1F4A1} Memory cleanup suggestion: MCP initialization used significant memory. Consider calling MemoryManager.forceGC() after heavy operations.")}async applyOrchestration(e){let t=Date.now();try{if(!e.input?.text||typeof e.input.text!="string")return g.debug("Orchestration skipped - no valid input text",{hasInput:!!e.input,hasText:!!e.input?.text,textType:typeof e.input?.text}),{};let n=oh.classify(e.input.text),o=hb.route(e.input.text);if(!await this.hasProviderEnvVars(o.provider)&&o.provider!=="ollama")return g.debug("Orchestration provider validation failed",{taskType:n.type,routedProvider:o.provider,routedModel:o.model,reason:"Provider not configured or missing environment variables",orchestrationTime:`${Date.now()-t}ms`}),{};if(o.provider==="ollama")try{let s=await fetch("http://localhost:11434/api/tags",{method:"GET",signal:AbortSignal.timeout(2e3)});if(!s.ok)return g.debug("Orchestration provider validation failed",{taskType:n.type,routedProvider:o.provider,routedModel:o.model,reason:"Ollama service not responding",orchestrationTime:`${Date.now()-t}ms`}),{};let a=await s.json(),l=a?.models;if(!Array.isArray(l))return g.warn("Ollama API returned invalid models format",{responseData:a,modelsType:typeof l}),{};let u=l.filter(p=>p&&typeof p=="object"&&typeof p.name=="string"),d=o.model;if(d){if(!u.some(m=>m.name===d))if(g.debug("Orchestration provider validation failed",{taskType:n.type,routedProvider:o.provider,routedModel:o.model,reason:`Ollama model '${d}' not found`,orchestrationTime:`${Date.now()-t}ms`}),u.length>0)o.model=u[0].name;else return{}}else{if(u.length===0)return g.debug("Orchestration provider validation failed",{taskType:n.type,routedProvider:o.provider,routedModel:o.model,reason:"No Ollama models available",orchestrationTime:`${Date.now()-t}ms`}),{};o.model=u[0].name}}catch(s){return g.debug("Orchestration provider validation failed",{taskType:n.type,routedProvider:o.provider,routedModel:o.model,reason:s instanceof Error?s.message:"Ollama service check failed",orchestrationTime:`${Date.now()-t}ms`}),{}}return g.debug("Orchestration route determined",{taskType:n.type,selectedProvider:o.provider,selectedModel:o.model,confidence:o.confidence,reasoning:o.reasoning,orchestrationTime:`${Date.now()-t}ms`}),{model:o.model,context:{...e.context||{},__orchestratedPreferredProvider:o.provider}}}catch(n){throw g.error("Orchestration failed",{error:n instanceof Error?n.message:String(n),orchestrationTime:`${Date.now()-t}ms`}),n}}async applyStreamOrchestration(e){let t=Date.now();try{if(!e.input?.text||typeof e.input.text!="string")return g.debug("Stream orchestration skipped - no valid input text",{hasInput:!!e.input,hasText:!!e.input?.text,textType:typeof e.input?.text}),{};let n=oh.classify(e.input.text),o=hb.route(e.input.text);if(!await this.hasProviderEnvVars(o.provider)&&o.provider!=="ollama")return g.debug("Stream orchestration provider validation failed",{taskType:n.type,routedProvider:o.provider,routedModel:o.model,reason:"Provider not configured or missing environment variables",orchestrationTime:`${Date.now()-t}ms`}),{};if(o.provider==="ollama")try{let s=await fetch("http://localhost:11434/api/tags",{method:"GET",signal:AbortSignal.timeout(2e3)});if(!s.ok)return g.debug("Stream orchestration provider validation failed",{taskType:n.type,routedProvider:o.provider,routedModel:o.model,reason:"Ollama service not responding",orchestrationTime:`${Date.now()-t}ms`}),{};let a=await s.json(),l=a?.models;if(!Array.isArray(l))return g.warn("Ollama API returned invalid models format in stream",{responseData:a,modelsType:typeof l}),{};let u=l.filter(p=>p&&typeof p=="object"&&typeof p.name=="string"),d=o.model;if(d){if(!u.some(m=>m.name===d))if(g.debug("Stream orchestration provider validation failed",{taskType:n.type,routedProvider:o.provider,routedModel:o.model,reason:`Ollama model '${d}' not found`,orchestrationTime:`${Date.now()-t}ms`}),u.length>0)o.model=u[0].name;else return{}}else{if(u.length===0)return g.debug("Stream orchestration provider validation failed",{taskType:n.type,routedProvider:o.provider,routedModel:o.model,reason:"No Ollama models available",orchestrationTime:`${Date.now()-t}ms`}),{};o.model=u[0].name}}catch(s){return g.debug("Stream orchestration provider validation failed",{taskType:n.type,routedProvider:o.provider,routedModel:o.model,reason:s instanceof Error?s.message:"Ollama service check failed",orchestrationTime:`${Date.now()-t}ms`}),{}}return g.debug("Stream orchestration route determined",{taskType:n.type,selectedProvider:o.provider,selectedModel:o.model,confidence:o.confidence,reasoning:o.reasoning,orchestrationTime:`${Date.now()-t}ms`}),{model:o.model,context:{...e.context||{},__orchestratedPreferredProvider:o.provider}}}catch(n){throw g.error("Stream orchestration failed",{error:n instanceof Error?n.message:String(n),orchestrationTime:`${Date.now()-t}ms`}),n}}_extractOriginalPrompt(e){if(typeof e=="string")return e;let t=e;if(t.messages&&t.messages.length>0){let n=t.messages[t.messages.length-1];return typeof n.content=="string"?n.content:JSON.stringify(n.content)}return e.input?.text||""}getObservabilityConfig(){return this.observabilityConfig}isTelemetryEnabled(){return this.observabilityConfig?.langfuse?.enabled?!0:dE()}getTelemetryStatus(){let e=this.observabilityConfig?.langfuse,t=this.observabilityConfig?.openTelemetry;return{enabled:this.isTelemetryEnabled(),langfuse:e?{enabled:e.enabled??!1,baseUrl:e.baseUrl,environment:e.environment}:void 0,openTelemetry:t?{enabled:t.enabled??!1,endpoint:t.endpoint,serviceName:t.serviceName}:dE()||process.env.OTEL_EXPORTER_OTLP_ENDPOINT?{enabled:dE(),endpoint:process.env.OTEL_EXPORTER_OTLP_ENDPOINT,serviceName:process.env.OTEL_SERVICE_NAME}:void 0,exporters:[]}}getMetrics(){return this.metricsAggregator.getMetrics()}getSpans(){return this.metricsAggregator.getSpans()}getTraces(){return this.metricsAggregator.getTraces()}resetMetrics(){this.metricsAggregator.reset()}recordMetricsSpan(e){this.metricsAggregator.recordSpan(e)}recordMemorySpan(e,t,n,o,i){let s=this._metricsTraceContext,a=ye.createSpan("memory",e,t,s?.parentSpanId,s?.traceId);a.durationMs=n;let l=ye.endSpan(a,o);i&&(l.statusMessage=i),this.metricsAggregator.recordSpan(l);try{Ne().recordSpan(l)}catch{}}async initializeLangfuseObservability(){try{let e=this.observabilityConfig?.langfuse;e?.enabled?(xD(e),g.debug("[NeuroLink] Langfuse observability initialized via public method")):g.debug("[NeuroLink] Langfuse not enabled, skipping initialization")}catch(e){g.warn("[NeuroLink] Failed to initialize Langfuse observability:",e)}}async shutdown(){try{g.debug("[NeuroLink] Starting graceful shutdown");try{await bD(),await TD(),g.debug("[NeuroLink] OpenTelemetry shutdown completed")}catch(e){g.warn("[NeuroLink] OpenTelemetry shutdown failed:",e)}if(this.externalServerManager)try{await this.externalServerManager.shutdown(),g.debug("[NeuroLink] MCP servers shutdown completed")}catch(e){g.warn("[NeuroLink] MCP servers shutdown failed:",e)}if(this.conversationMemory?.close)try{await this.conversationMemory.close(),g.debug("[NeuroLink] Conversation memory shutdown completed")}catch(e){g.warn("[NeuroLink] Conversation memory shutdown failed:",e)}g.debug("[NeuroLink] Graceful shutdown completed")}catch(e){throw g.error("[NeuroLink] Shutdown failed:",e),e}}initializeMetricsListeners(){this.emitter.on("generation:end",((...e)=>{let t=e[0];try{let n=t.result,o=n?.usage,i=n?.analytics,s=t.provider||n?.provider||"unknown",a=n?.model||"unknown",l=t.responseTime||0,u=this._metricsTraceContext,d=ye.createGenerationSpan({provider:s,model:a,name:`gen_ai.${s}.chat`,traceId:u?.traceId,input:t.prompt,temperature:t.temperature,maxTokens:t.maxTokens});u&&(d.spanId=u.parentSpanId,d.parentSpanId=void 0);let p=t.success===!1||t.error?2:1;if(d=ye.endSpan(d,p,t.error?String(t.error):void 0),d.durationMs=l,o&&(d=ye.enrichWithTokenUsage(d,{promptTokens:o.input||0,completionTokens:o.output||0,totalTokens:o.total||(o.input||0)+(o.output||0)})),i?.cost&&i.cost>0)d=ye.enrichWithCost(d,{totalCost:i.cost});else if(o&&a!=="unknown"){let h=this.metricsAggregator.getTokenTracker().getModelPricing(a);if(h){let y=(o.input||0)/1e6*h.inputPricePerMillion,v=(o.output||0)/1e6*h.outputPricePerMillion,T=y+v;T>0&&(d=ye.enrichWithCost(d,{inputCost:y,outputCost:v,totalCost:T}))}}let m=n?.content||n?.text;m&&(d=ye.updateAttributes(d,{output:m.length>5e3?m.substring(0,5e3)+"...[truncated]":m})),this.metricsAggregator.recordSpan(d),Ne().recordSpan(d)}catch{}})),this.emitter.on("stream:complete",((...e)=>{let t=e[0];try{let n=t.metadata,o=n?.durationMs||0,i=n?.chunkCount||0,s=n?.totalLength||0,a=t.provider||"unknown",l=t.model||"unknown",u=this._metricsTraceContext,d=ye.createGenerationSpan({provider:a,model:l,name:`gen_ai.${a}.stream`,traceId:u?.traceId});if(u&&(d.spanId=u.parentSpanId,d.parentSpanId=void 0),d=ye.endSpan(d,1),d.durationMs=o,d.attributes["stream.chunk_count"]=i,d.attributes["stream.content_length"]=s,t.prompt){let f=String(t.prompt);d=ye.updateAttributes(d,{input:f.length>5e3?f.substring(0,5e3)+"...[truncated]":f})}let p=t.content;p&&(d=ye.updateAttributes(d,{output:p.length>5e3?p.substring(0,5e3)+"...[truncated]":p}));let m=n?.usage;if(m&&(d=ye.enrichWithTokenUsage(d,{promptTokens:m.input||0,completionTokens:m.output||0,totalTokens:m.total||(m.input||0)+(m.output||0)}),l!=="unknown")){let h=this.metricsAggregator.getTokenTracker().getModelPricing(l);if(h){let y=(m.input||0)/1e6*h.inputPricePerMillion,v=(m.output||0)/1e6*h.outputPricePerMillion,T=y+v;T>0&&(d=ye.enrichWithCost(d,{inputCost:y,outputCost:v,totalCost:T}))}}this.metricsAggregator.recordSpan(d),Ne().recordSpan(d)}catch{}})),this.emitter.on("tool:end",((...e)=>{let t=e[0];try{let n=t.toolName||t.tool||"unknown",o=t.responseTime||t.duration||0,i=t.success!==void 0?t.success:!t.error,s=this._metricsTraceContext,a=ye.createSpan("tool.call",`tool.${n}`,{"tool.name":n,"tool.success":i},s?.parentSpanId,s?.traceId);if(a=ye.endSpan(a,i?1:2),a.durationMs=o,!i&&t.error&&(a.statusMessage=t.error.message||String(t.error)),t.result)try{a.attributes["tool.result"]=JSON.stringify(t.result).substring(0,500)}catch{}this.metricsAggregator.recordSpan(a),Ne().recordSpan(a)}catch{}})),this.emitter.on("stream:error",((...e)=>{let t=e[0];try{let n=t.metadata,o=n?.durationMs||0,i=n?.chunkCount||0,s=n?.errorName||"UnknownError",a=t.content||"Stream error",l=t.provider||"unknown",u=t.model||"unknown",d=this._metricsTraceContext,p=ye.createGenerationSpan({provider:l,model:u,name:`gen_ai.${l}.stream.error`,traceId:d?.traceId});d&&(p.spanId=d.parentSpanId,p.parentSpanId=void 0),p=ye.endSpan(p,2),p.durationMs=o,p.statusMessage=`${s}: ${a}`,p.attributes["stream.chunk_count"]=i,this.metricsAggregator.recordSpan(p),Ne().recordSpan(p)}catch{}}))}async generate(e){return mt.sdk.startActiveSpan("neurolink.generate",{kind:jt.INTERNAL},async t=>{let n=crypto.randomUUID().replace(/-/g,""),o=crypto.randomUUID().replace(/-/g,"").substring(0,16);return H9.run({traceId:n,parentSpanId:o},async()=>{try{let i=this._extractOriginalPrompt(e),s=typeof e=="string"?{input:{text:e}}:{...e};if(s.model=yb(s.model,this.modelAliasConfig),this._disableToolCacheForCurrentRequest=!!s.disableToolCache,t.setAttribute("neurolink.provider",s.provider||"default"),t.setAttribute("neurolink.model",s.model||"default"),t.setAttribute("neurolink.input_length",typeof e=="string"?e.length:s.input?.text?.length||0),t.setAttribute("neurolink.has_tools",!!(s.tools&&Object.keys(s.tools).length>0)),!s.input?.text||typeof s.input.text!="string")throw new Error("Input text is required and must be a non-empty string");if(s.maxBudgetUsd!==void 0&&s.maxBudgetUsd>0&&this._sessionCostUsd>=s.maxBudgetUsd)throw new Ve({code:"SESSION_BUDGET_EXCEEDED",message:`Session budget exceeded: spent $${this._sessionCostUsd.toFixed(4)} of $${s.maxBudgetUsd.toFixed(4)} limit`,category:"validation",severity:"high",retriable:!1,context:{spent:this._sessionCostUsd,limit:s.maxBudgetUsd}});if((s.onFinish||s.onError)&&(s.middleware={...s.middleware,middlewareConfig:{...s.middleware?.middlewareConfig,lifecycle:{...s.middleware?.middlewareConfig?.lifecycle,enabled:!0,config:{...s.middleware?.middlewareConfig?.lifecycle?.config,onFinish:s.onFinish,onError:s.onError}}}}),s.auth?.token){let{AuthError:a}=await Promise.resolve().then(()=>(qo(),B6));if(await this.ensureAuthProvider(),!this.authProvider)throw a.create("PROVIDER_ERROR","No auth provider configured. Set auth in constructor or via setAuthProvider() before using auth: { token }.");let l;try{l=await We(this.authProvider.authenticateToken(s.auth.token),5e3,a.create("PROVIDER_ERROR","Auth token validation timed out after 5000ms"))}catch(u){throw u instanceof Error&&"feature"in u&&u.feature==="Auth"?u:a.create("PROVIDER_ERROR",`Auth token validation failed: ${u instanceof Error?u.message:String(u)}`)}if(!l.valid)throw a.create("INVALID_TOKEN",l.error||"Token validation failed");if(!l.user)throw a.create("INVALID_TOKEN","Token validated but no user identity returned");if(!l.user.id)throw a.create("INVALID_TOKEN","Token validated but user identity missing required 'id' field");s.context={...s.context||{},userId:l.user.id,userEmail:l.user.email,userRoles:l.user.roles}}if(s.requestContext){let a=s.auth?.token&&this.authProvider?{userId:s.context?.userId,userEmail:s.context?.userEmail,userRoles:s.context?.userRoles}:{};s.context={...s.context||{},...s.requestContext,...a}}if(s.workflow||s.workflowConfig)return await this.generateWithWorkflow(s);if(s.output?.mode==="ppt"){let a=await this.generateWithPPT(s);return t.setAttribute("neurolink.output_length",a.content?.length??0),a.analytics&&(t.setAttribute("neurolink.tokens.input",a.analytics.tokenUsage?.input??0),t.setAttribute("neurolink.tokens.output",a.analytics.tokenUsage?.output??0),t.setAttribute("neurolink.cost",a.analytics.cost??0)),t.setStatus({code:Ae.OK}),a}return await this.setLangfuseContextFromOptions(s,async()=>{let a=Date.now();if(this.enableOrchestration&&!s.provider&&!s.model)try{let v=await this.applyOrchestration(s);g.debug("Orchestration applied",{originalProvider:s.provider||"auto",orchestratedProvider:v.provider,orchestratedModel:v.model,prompt:s.input.text.substring(0,100)}),Object.assign(s,v),v.model&&(s.model=yb(s.model,this.modelAliasConfig))}catch(v){g.warn("Orchestration failed, continuing with original options",{error:v instanceof Error?v.message:String(v),originalProvider:s.provider||"auto"})}this.emitter.emit("generation:start",{provider:s.provider||"auto",timestamp:a}),this.emitter.emit("response:start"),this.emitter.emit("message",`Starting ${s.provider||"auto"} text generation...`);let l=QEe(s);if(l.hasFactoryConfig&&s.factoryConfig){let v=n0e(s.factoryConfig);v.isValid||g.warn("Invalid factory configuration detected",{errors:v.errors})}if(s.rag?.files?.length)try{let{prepareRAGTool:v}=await Promise.resolve().then(()=>(vU(),GJ)),T=await v(s.rag,s.provider);s.tools||(s.tools={}),s.tools[T.toolName]=T.tool;let _=[`
|
|
2015
|
+
Current user's request: ${t}`}formatMultiUserMemoryContext(e,t){let n=[];for(let[o,i]of e)n.push(`[${o}]
|
|
2016
|
+
${i}`);return`Context from previous conversations:
|
|
2017
2017
|
|
|
2018
|
-
IMPORTANT: You have a tool called "${T.toolName}" that searches through`,`${T.filesLoaded} loaded document(s) containing ${T.chunksIndexed} indexed chunks.`,`ALWAYS use the "${T.toolName}" tool FIRST to answer the user's question before using any other tools.`,"This tool searches your local knowledge base of pre-loaded documents and is the primary source of truth.","Do NOT use websearchGrounding or any web search tools when the answer can be found in the loaded documents."].join(" ");s.systemPrompt=(s.systemPrompt||"")+_,g.info("[RAG] Tool injected into generate()",{toolName:T.toolName,filesLoaded:T.filesLoaded,chunksIndexed:T.chunksIndexed})}catch(v){g.warn("[RAG] Failed to prepare RAG tool, continuing without RAG",{error:v instanceof Error?v.message:String(v)})}let u={prompt:s.input.text,provider:s.provider,model:s.model,temperature:s.temperature,maxTokens:s.maxTokens,systemPrompt:s.systemPrompt,schema:s.schema,output:s.output,tools:s.tools,disableTools:s.disableTools,toolFilter:s.toolFilter,excludeTools:s.excludeTools,maxSteps:s.maxSteps,toolChoice:s.toolChoice,prepareStep:s.prepareStep,enableAnalytics:s.enableAnalytics,enableEvaluation:s.enableEvaluation,context:s.context,evaluationDomain:s.evaluationDomain,toolUsageContext:s.toolUsageContext,input:s.input,region:s.region,tts:s.tts,fileRegistry:this.fileRegistry,abortSignal:s.abortSignal,skipToolPromptInjection:s.skipToolPromptInjection,middleware:s.middleware},d=s;(d.sessionId||d.userId)&&(u.context={...u.context,...d.sessionId&&!u.context?.sessionId?{sessionId:d.sessionId}:{},...d.userId&&!u.context?.userId?{userId:d.userId}:{}});let p=e0e(u,l);this.conversationMemory&&(p.conversationMemoryConfig=this.conversationMemory.config,p.originalPrompt=i);let{toolResults:m,enhancedPrompt:f}=await this.detectAndExecuteTools(p.prompt||s.input.text,l.domainType);f!==p.prompt&&(p.prompt=f,g.debug("Enhanced prompt with tool results",{originalLength:s.input.text.length,enhancedLength:f.length,toolResults:m.length}));let h=await this.generateTextInternal(p);this.emitter.emit("generation:end",{provider:h.provider,responseTime:Date.now()-a,toolsUsed:h.toolsUsed,timestamp:Date.now(),result:h,prompt:s.input?.text||s.prompt,temperature:p.temperature,maxTokens:p.maxTokens}),this.emitter.emit("response:end",h.content||""),this.emitter.emit("message",`Generation completed in ${Date.now()-a}ms`);let y={content:h.content,finishReason:h.finishReason,provider:h.provider,model:h.model,usage:h.usage?{input:h.usage.input||0,output:h.usage.output||0,total:h.usage.total||0}:void 0,responseTime:h.responseTime,toolsUsed:h.toolsUsed,toolExecutions:Pue(h.toolExecutions),enhancedWithTools:h.enhancedWithTools,availableTools:Oue(h.availableTools),analytics:h.analytics,imageOutput:h.imageOutput,evaluation:h.evaluation?{...h.evaluation,isOffTopic:h.evaluation.isOffTopic??!1,alertSeverity:h.evaluation.alertSeverity??"none",reasoning:h.evaluation.reasoning??"No evaluation provided",evaluationModel:h.evaluation.evaluationModel??"unknown",evaluationTime:h.evaluation.evaluationTime??Date.now(),evaluationDomain:h.evaluation.evaluationDomain??p.evaluationDomain??l.domainType}:void 0,audio:h.audio,video:h.video,ppt:h.ppt,...h.retries&&{retries:h.retries}};return y.analytics?.cost&&y.analytics.cost>0&&(this._sessionCostUsd+=y.analytics.cost),this.scheduleGenerateMemoryStorage(s,i,y),t.setAttribute("neurolink.output_length",y.content?.length||0),t.setAttribute("neurolink.tokens.input",y.usage?.input||0),t.setAttribute("neurolink.tokens.output",y.usage?.output||0),t.setAttribute("neurolink.finish_reason",y.finishReason||"unknown"),t.setAttribute("neurolink.result_provider",y.provider||"unknown"),t.setAttribute("neurolink.result_model",y.model||"unknown"),t.setAttribute("generate.retry_count",y.retries?.count||0),t.setStatus({code:Ae.OK}),y})}catch(i){t.setStatus({code:Ae.ERROR,message:i instanceof Error?i.message:String(i)});let s=typeof e=="object"&&e.provider||"unknown",a=typeof e=="object"&&e.model||"unknown";try{this.emitter.emit("generation:end",{provider:s,model:a,responseTime:0,error:i instanceof Error?i.message:String(i),success:!1})}catch(l){}throw i}finally{this._disableToolCacheForCurrentRequest=!1,t.end()}})})}scheduleGenerateMemoryStorage(e,t,n){this.shouldWriteMemory(e.memory,e.context?.userId,n.content)&&e.context?.userId&&this.storeMemoryInBackground(t??"",n.content.trim(),e.context.userId)}async generateWithPPT(e){let t=Date.now(),{generatePresentation:n}=await xke().then(()=>vke),{extractPPTContext:o,getEffectivePPTProvider:i}=await Promise.resolve().then(()=>(kU(),GCe)),s=e.provider||"vertex",a=await br.createProvider(s,e.model,!0,this),l=await i(a,s,e.model||"default",this),u=o(e),d=await n({context:u,provider:l.provider,providerName:l.providerName,modelName:l.modelName,neurolink:this});return{content:`Presentation generated: ${d.filePath} (${d.totalSlides} slides)`,finishReason:"stop",provider:d.provider||s,model:d.model||e.model||"default",usage:void 0,responseTime:Date.now()-t,ppt:d}}async generateWithWorkflow(e){let t=Date.now();g.debug("[NeuroLink] Executing workflow generation",{workflowId:e.workflow,hasInlineConfig:!!e.workflowConfig,prompt:e.input.text.substring(0,100),startTime:t});let n;if(e.workflowConfig)n=e.workflowConfig;else if(e.workflow){if(n=sU(e.workflow),!n)throw new Error(`Workflow '${e.workflow}' not found in registry`)}else throw new Error("Either workflow or workflowConfig must be provided");let o=await aU(n,{prompt:e.input.text,conversationHistory:e.conversationHistory,timeout:e.timeout,verbose:!1,metadata:e.context}),i={content:o.content,provider:o.selectedResponse?.provider||n.models[0]?.provider,model:o.selectedResponse?.model||n.models[0]?.model,usage:o.usage?{input:o.usage.totalInputTokens,output:o.usage.totalOutputTokens,total:o.usage.totalTokens}:void 0,responseTime:o.totalTime,workflow:{originalResponse:o.originalContent||o.content,processedResponse:o.content,ensembleResponses:o.ensembleResponses.map(s=>({provider:s.provider,model:s.model,content:s.content,responseTime:s.responseTime,status:s.status,error:s.error})),judgeScores:o.judgeScores?{scores:o.judgeScores.scores,reasoning:o.reasoning,selectedModel:`${o.selectedResponse?.provider}-${o.selectedResponse?.model}`}:void 0,selectedModel:`${o.selectedResponse?.provider}-${o.selectedResponse?.model}`,metrics:{totalTime:o.totalTime,ensembleTime:o.ensembleTime,judgeTime:o.judgeTime,conditioningTime:o.conditioningTime},workflowId:o.workflow,workflowName:o.workflowName}};return g.debug("[NeuroLink] Workflow generation complete",{workflowId:o.workflow,selectedModel:i.workflow?.selectedModel,score:o.score,totalTime:o.totalTime}),i}async streamWithWorkflow(e,t){g.debug("[NeuroLink] Executing workflow streaming (progressive)",{workflowId:e.workflow,hasInlineConfig:!!e.workflowConfig,prompt:e.input.text.substring(0,100)});let n;if(e.workflowConfig)n=e.workflowConfig;else if(e.workflow){if(n=sU(e.workflow),!n)throw new Error(`Workflow '${e.workflow}' not found in registry`)}else throw new Error("Either workflow or workflowConfig must be provided");let{runWorkflowWithStreaming:o}=await Promise.resolve().then(()=>(cU(),X0e)),i=o(n,{prompt:e.input.text,conversationHistory:e.conversationHistory,timeout:e.timeout,verbose:!1,metadata:e.context,streaming:!0}),s=null,a=0,u={stream:(async function*(){for await(let p of i)if(p.type==="preliminary")a=Date.now()-t,g.debug("[NeuroLink] Streaming preliminary response",{responseTime:a,contentLength:p.content.length}),yield{content:p.content,type:"preliminary"};else if(p.type==="final"){s=p.partialResult??null;let m=Date.now()-t;g.debug("[NeuroLink] Streaming final synthesis",{responseTime:m,contentLength:p.content.length}),yield{content:p.content,type:"final"}}})(),provider:n.models[0]?.provider,model:n.models[0]?.model,metadata:{streamId:`workflow-${n.id}-${Date.now()}`,startTime:t,responseTime:0}},d=u.stream;return u.stream=(async function*(){for await(let p of d)yield p;if(s){let p=s,m=Date.now()-t;p.usage&&(u.usage={input:p.usage.totalInputTokens,output:p.usage.totalOutputTokens,total:p.usage.totalTokens}),u.metadata={...u.metadata,totalChunks:2,responseTime:m,preliminaryTime:a};let f=p.ensembleResponses?.map(y=>({provider:y.provider,model:y.model,content:y.content,responseTime:y.responseTime,status:y.status,error:y.error}))??[],h=p.judgeScores?{scores:p.judgeScores.scores,reasoning:p.reasoning??"",selectedModel:p.selectedResponse?`${p.selectedResponse.provider}-${p.selectedResponse.model}`:"unknown"}:void 0;u.workflow={originalResponse:p.originalContent??p.content??"",processedResponse:p.content??"",ensembleResponses:f,judgeScores:h,selectedModel:p.selectedResponse?`${p.selectedResponse.provider}-${p.selectedResponse.model}`:"unknown",metrics:{totalTime:p.totalTime??m,ensembleTime:p.ensembleTime??0,judgeTime:p.judgeTime,conditioningTime:p.conditioningTime},workflowId:p.workflow??n.id,workflowName:p.workflowName??n.name}}})(),g.debug("[NeuroLink] Workflow streaming initialized",{workflowId:n.id}),u}async generateText(e){if(!e.prompt||typeof e.prompt!="string"||e.prompt.trim()==="")throw new Error("GenerateText options must include prompt as a non-empty string");return e.model=yb(e.model,this.modelAliasConfig),await this.generateTextInternal(e)}async generateTextInternal(e){return mt.sdk.startActiveSpan("neurolink.generateTextInternal",{kind:jt.INTERNAL},async t=>{try{let n=`generate-internal-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,o=e.context?.requestId,i=typeof o=="string"&&o?o:`req-${Date.now()}-${Math.random().toString(36).substr(2,9)}`;e.context={...e.context,requestId:i};let s=Date.now(),a=process.hrtime.bigint(),l="NeuroLink.generateTextInternal";t.setAttribute("neurolink.request_id",i),t.setAttribute("neurolink.has_conversation_memory",!!this.conversationMemory),t.setAttribute("neurolink.provider",e.provider||"auto"),t.setAttribute("neurolink.model",e.model||"default"),this.logGenerateTextInternalStart(n,s,a,e,l),this.emitGenerationStartEvents(e);try{await this.initializeConversationMemoryForGeneration(n,s,a);let u=await this.attemptMCPGeneration(e,n,s,a,l);if(u){g.info("[NeuroLink.generateTextInternal] generate() - COMPLETE SUCCESS (MCP path)",{provider:u.provider,model:u.model,responseTimeMs:Date.now()-s,tokensUsed:u.usage?.total||0,toolsUsed:u.toolsUsed?.length||0,...u.usage?.cacheCreationTokens!==void 0&&{cacheCreationTokens:u.usage.cacheCreationTokens},...u.usage?.cacheReadTokens!==void 0&&{cacheReadTokens:u.usage.cacheReadTokens},...u.usage?.cacheSavingsPercent!==void 0&&{cacheSavingsPercent:u.usage.cacheSavingsPercent}});{let p=Date.now();try{await n1(this.conversationMemory,e,u,new Date(s),i),this.recordMemorySpan("memory.store",{"memory.operation":"store","memory.path":"mcp"},Date.now()-p,1)}catch(m){this.recordMemorySpan("memory.store",{"memory.operation":"store","memory.path":"mcp"},Date.now()-p,2,m instanceof Error?m.message:String(m))}}return this.emitter.emit("response:end",u.content||""),t.setAttribute("neurolink.path","mcp"),t.setAttribute("neurolink.tokens.input",u.usage?.input||0),t.setAttribute("neurolink.tokens.output",u.usage?.output||0),t.setAttribute("neurolink.result_provider",u.provider||"unknown"),t.setStatus({code:Ae.OK}),u}if(e.abortSignal?.aborted)throw new DOMException("The operation was aborted","AbortError");if(this.conversationMemory){let p=await Bg(this.conversationMemory,e);e._originalConversationMessages=p?[...p]:void 0}let d=await this.directProviderGeneration(e);g.debug(`[${l}] Direct generation successful`),g.info("[NeuroLink.generateTextInternal] generate() - COMPLETE SUCCESS",{provider:d.provider,model:d.model,responseTimeMs:Date.now()-s,tokensUsed:d.usage?.total||0,toolsUsed:d.toolsUsed?.length||0,...d.usage?.cacheCreationTokens!==void 0&&{cacheCreationTokens:d.usage.cacheCreationTokens},...d.usage?.cacheReadTokens!==void 0&&{cacheReadTokens:d.usage.cacheReadTokens},...d.usage?.cacheSavingsPercent!==void 0&&{cacheSavingsPercent:d.usage.cacheSavingsPercent}});{let p=Date.now();try{await n1(this.conversationMemory,e,d,new Date(s),i),this.recordMemorySpan("memory.store",{"memory.operation":"store","memory.path":"direct"},Date.now()-p,1)}catch(m){this.recordMemorySpan("memory.store",{"memory.operation":"store","memory.path":"direct"},Date.now()-p,2,m instanceof Error?m.message:String(m))}}return this.emitter.emit("response:end",d.content||""),this.emitter.emit("message","Text generation completed successfully"),t.setAttribute("neurolink.path","direct"),t.setAttribute("neurolink.tokens.input",d.usage?.input||0),t.setAttribute("neurolink.tokens.output",d.usage?.output||0),t.setAttribute("neurolink.result_provider",d.provider||"unknown"),t.setStatus({code:Ae.OK}),d}catch(u){if(bK(u)&&this.conversationMemory){g.warn(`[${l}] Context overflow detected by provider, attempting smart recovery`,{error:u instanceof Error?u.message:String(u),overflowProvider:w_e(u)});try{let d=E_e(u),p=e._originalConversationMessages??await Bg(this.conversationMemory,e),m=is({provider:e.provider||"openai",model:e.model,maxTokens:e.maxTokens,currentPrompt:e.prompt,systemPrompt:e.systemPrompt}),f=d?.actualTokens??m.estimatedInputTokens,h=d?.budgetTokens??m.availableInputTokens,y=Math.floor(h*.7),v=f>0?(f-y)/f:.5,_=await new fm({enableSummarize:!1,enablePrune:!0,enableDeduplicate:!0,enableTruncate:!0,truncationFraction:Math.min(.9,v+.15)}).compact(p,y,void 0,e.context?.requestId);if(_.compacted){let S=Vx(_.messages),w=is({provider:e.provider||"openai",model:e.model,maxTokens:e.maxTokens,systemPrompt:e.systemPrompt,currentPrompt:e.prompt,conversationMessages:S.messages});if(!w.withinBudget)throw g.error(`[${l}] Recovery compaction insufficient, aborting retry`,{estimatedTokens:w.estimatedInputTokens,availableTokens:w.availableInputTokens}),new gm(`Context overflow recovery failed. Provider rejected at ~${f} tokens, recovery compaction achieved ${_.tokensAfter} tokens but budget is ${h} tokens.`,{estimatedTokens:_.tokensAfter,availableTokens:h,stagesUsed:_.stagesUsed,breakdown:w.breakdown});return g.info(`[${l}] Smart recovery verified, retrying generation`,{tokensSaved:_.tokensSaved,compactionTarget:y,verifiedTokens:w.estimatedInputTokens,verifiedBudget:w.availableInputTokens}),await this.directProviderGeneration({...e,conversationMessages:S.messages})}}catch(d){if(d instanceof gm)throw d;g.error(`[${l}] Recovery attempt failed`,{error:d instanceof Error?d.message:String(d)})}}if(hr(u)){g.info(`[${l}] Generation aborted \u2014 storing conversation turn for title generation`,{hasMemory:!!this.conversationMemory,memoryType:this.conversationMemory?.constructor?.name||"NONE",sessionId:e.context?.sessionId||"unknown"});try{let d={content:"[generation was interrupted]",provider:e.provider||"unknown",model:e.model||"unknown",responseTime:Date.now()-s};await We(n1(this.conversationMemory,e,d,new Date(s),i),5e3)}catch(d){g.warn(`[${l}] Failed to store conversation turn after abort`,{error:d instanceof Error?d.message:String(d)})}}else g.error(`[${l}] All generation methods failed`,{error:u instanceof Error?u.message:String(u)});throw this.emitter.emit("response:end",""),this.emitter.emit("error",u instanceof Error?u:new Error(String(u))),u}}catch(n){throw t.setStatus({code:Ae.ERROR,message:n instanceof Error?n.message:String(n)}),n}finally{t.end()}})}logGenerateTextInternalStart(e,t,n,o,i){g.debug(`[${i}] Starting generation`,{provider:o.provider||"auto",promptLength:o.prompt?.length||0,hasConversationMemory:!!this.conversationMemory})}emitGenerationStartEvents(e){this.emitter.emit("response:start"),this.emitter.emit("message",`Starting ${e.provider||"auto"} text generation (internal)...`)}async initializeConversationMemoryForGeneration(e,t,n){let o=process.hrtime.bigint();if(this.conversationMemoryNeedsInit&&this.conversationMemoryConfig&&await this.lazyInitializeConversationMemory(e,t,n),this.conversationMemory){g.debug("[NeuroLink] \u{1F9E0} LOG_POINT_G003_CONVERSATION_MEMORY_INIT_START",{logPoint:"G003_CONVERSATION_MEMORY_INIT_START",generateInternalId:e,timestamp:new Date().toISOString(),elapsedMs:Date.now()-t,elapsedNs:(process.hrtime.bigint()-n).toString(),message:"Starting conversation memory initialization"});try{await this.conversationMemory.initialize()}catch(a){g.warn("[NEUROLINK] Redis memory init failed, falling back to in-memory",{error:a instanceof Error?a.message:String(a),generateInternalId:e});let l=this.conversationMemoryConfig?.conversationMemory;this.conversationMemory=new Vg({enabled:!0,maxSessions:l?.maxSessions??100,maxTurnsPerSession:l?.maxTurnsPerSession??50}),await this.conversationMemory.initialize()}let s=process.hrtime.bigint()-o;g.debug("[NeuroLink] \u2705 LOG_POINT_G004_CONVERSATION_MEMORY_INIT_SUCCESS",{logPoint:"G004_CONVERSATION_MEMORY_INIT_SUCCESS",generateInternalId:e,timestamp:new Date().toISOString(),elapsedMs:Date.now()-t,elapsedNs:(process.hrtime.bigint()-n).toString(),conversationMemoryDurationNs:s.toString(),conversationMemoryDurationMs:Number(s)/Ml,message:"Conversation memory initialization completed successfully"})}}async attemptMCPGeneration(e,t,n,o,i){return!e.disableTools&&!(e.tts?.enabled&&!e.tts?.useAiResponse)?await this.performMCPGenerationRetries(e,t,n,o,i):null}async performMCPGenerationRetries(e,t,n,o,i){let s=Rn.QUICK,a=[],l=0,u=s+1;for(let d=1;d<=u;d++){if(e.abortSignal?.aborted)throw g.debug(`[${i}] Abort signal already fired before attempt ${d}, stopping retries`),new DOMException("The operation was aborted","AbortError");try{g.debug(`[${i}] Attempting MCP generation (attempt ${d}/${u})...`);let p=await this.tryMCPGeneration(e);if(p&&(p.content||p.toolExecutions&&p.toolExecutions.length>0))return g.debug(`[${i}] MCP generation successful on attempt ${d}`,{contentLength:p.content?.length||0,toolsUsed:p.toolsUsed?.length||0,toolExecutions:p.toolExecutions?.length||0,retryCount:l}),l>0&&(p.retries={count:l,errors:a}),p;g.debug(`[${i}] MCP generation returned empty result on attempt ${d}`,{hasResult:!!p,hasContent:!!(p&&p.content),contentLength:p?.content?.length||0,toolExecutions:p?.toolExecutions?.length||0})}catch(p){if(hr(p))throw g.debug(`[${i}] AbortError detected on attempt ${d}, stopping retries`),p;l++;let m=p instanceof Error?p.message:String(p),f=p instanceof Ve?p.code:p instanceof Error?p.name:"UNKNOWN";a.push({code:f,message:m.substring(0,500)}),g.debug(`[${i}] MCP generation failed on attempt ${d}/${u}`,{error:m,willRetry:d<u,retryCount:l});let h=p instanceof Error&&(p.name==="AI_NoSuchToolError"||p.name==="AI_InvalidToolArgumentsError"||p.message.includes("NoSuchToolError")||p.message.includes("Model tried to call unavailable tool"));if(bK(p)||h||Lke(p)||p instanceof Error&&p.isRetryable===!1||p instanceof Error&&p.statusCode===400){g.debug(`[${i}] Non-retryable error detected, skipping remaining retries`);break}if(d>=u){g.debug(`[${i}] All MCP attempts exhausted, falling back to direct generation`);break}if(await new Promise(v=>{let T=setTimeout(v,500);if(e.abortSignal){let _=()=>{clearTimeout(T),v()};e.abortSignal.addEventListener("abort",_,{once:!0})}}),e.abortSignal?.aborted)throw new DOMException("The operation was aborted","AbortError")}}return null}async tryMCPGeneration(e){if(e.abortSignal?.aborted)throw new DOMException("The operation was aborted","AbortError");let t=e.context?.requestId||"unknown",n=`try-mcp-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,o=Date.now(),i=process.hrtime.bigint(),s="NeuroLink.tryMCPGeneration";try{if(await this.initializeMCP(),!this.mcpInitialized)return g.warn("[NeuroLink] \u26A0\uFE0F LOG_POINT_T004_MCP_NOT_AVAILABLE",{logPoint:"T004_MCP_NOT_AVAILABLE",tryMCPId:n,timestamp:new Date().toISOString(),elapsedMs:Date.now()-o,elapsedNs:(process.hrtime.bigint()-i).toString(),mcpInitialized:this.mcpInitialized,mcpComponents:{hasExternalServerManager:!!this.externalServerManager,hasToolRegistry:!!this.toolRegistry,hasProviderRegistry:!!br},fallbackReason:"MCP_NOT_INITIALIZED",message:"MCP not available - returning null for fallback to direct generation"}),null;let a=e.provider==="auto"||!e.provider?await cm():e.provider,l=await this.getAllAvailableTools(),{tools:u,unavailableTools:d}=this.toolRegistry.getAvailableTools(this.toolCircuitBreakers),p=new Set(u.map(E=>E.name));l=l.filter(E=>p.has(E.name)),l=this.applyToolInfoFiltering(l,e);let m=l.find(E=>E.name.includes("SuccessRateSRByTime")||E.name.includes("juspay-analytics"));g.debug("Available tools for AI prompt generation",{toolsCount:l.length,toolNames:l.map(E=>E.name),unavailableToolsCount:d.length,unavailableTools:d,hasTargetTool:!!m,targetToolDetails:m?{name:m.name,description:m.description,server:m.server}:null});let f="";d.length>0&&(f=`
|
|
2018
|
+
${n.join(`
|
|
2019
|
+
|
|
2020
|
+
`)}
|
|
2021
|
+
|
|
2022
|
+
Current user's request: ${t}`}shouldReadMemory(e,t){return!(!this.conversationMemoryConfig?.conversationMemory?.memory?.enabled||!t||e?.enabled===!1||e?.read===!1)}shouldWriteMemory(e,t,n){return!(!this.conversationMemoryConfig?.conversationMemory?.memory?.enabled||!t||!n?.trim()||e?.enabled===!1||e?.write===!1)}async retrieveMemory(e,t,n){let o=this.ensureMemoryReady();if(!o)return e;let i=(n||[]).filter(u=>u.read!==!1);if(i.length===0){let u=await o.get(t);return u?this.formatMemoryContext(u,e):e}let s=[{id:t,label:"User"},...i.map(u=>({id:u.userId,label:u.label||u.userId}))],a=await Promise.all(s.map(async u=>{let d=await o.get(u.id);return{...u,memory:d}})),l=new Map;for(let{label:u,memory:d}of a)d&&l.set(u,d);return l.size===0?e:this.formatMultiUserMemoryContext(l,e)}storeMemoryInBackground(e,t,n,o){setImmediate(async()=>{try{let i=this.ensureMemoryReady();if(!i)return;let s=`User: ${e}
|
|
2023
|
+
Assistant: ${t}`,a=[i.add(n,s)],l=(o||[]).filter(u=>u.write!==!1);for(let u of l){let d=u.prompt||u.maxWords?{prompt:u.prompt,maxWords:u.maxWords}:void 0;a.push(i.add(u.userId,s,d))}await Promise.all(a)}catch(i){g.warn("Memory storage failed:",i)}})}setupHITLEventForwarding(){this.hitlManager&&(this.hitlManager.on("hitl:confirmation-request",e=>{g.debug("Forwarding HITL confirmation request",{confirmationId:e.payload?.confirmationId,toolName:e.payload?.toolName}),this.emitter.emit("hitl:confirmation-request",e)}),this.hitlManager.on("hitl:timeout",e=>{g.debug("Forwarding HITL timeout event",{confirmationId:e.payload?.confirmationId,toolName:e.payload?.toolName}),this.emitter.emit("hitl:timeout",e)}),this.emitter.on("hitl:confirmation-response",e=>{let t=e;g.debug("Received HITL confirmation response",{confirmationId:t.payload?.confirmationId,approved:t.payload?.approved}),this.hitlManager?.emit("hitl:confirmation-response",t)}),g.debug("HITL event forwarding configured successfully"))}initializeExternalServerManager(e,t,n){let o=process.hrtime.bigint();try{this.externalServerManager=new mb({maxServers:20,defaultTimeout:Math.max(1e4,Number(process.env.MCP_CLIENT_TIMEOUT)||6e4),enableAutoRestart:!0,enablePerformanceMonitoring:!0},{enableMainRegistryIntegration:!0});let s=process.hrtime.bigint()-o;g.debug("[NeuroLink] \u2705 LOG_POINT_C010_EXTERNAL_SERVER_INIT_SUCCESS",{logPoint:"C010_EXTERNAL_SERVER_INIT_SUCCESS",constructorId:e,timestamp:new Date().toISOString(),elapsedMs:Date.now()-t,elapsedNs:(process.hrtime.bigint()-n).toString(),externalServerInitDurationNs:s.toString(),externalServerInitDurationMs:Number(s)/Ml,hasExternalServerManager:!!this.externalServerManager,message:"External server manager initialized successfully"}),this.setupExternalServerEventHandlers(e)}catch(i){let a=process.hrtime.bigint()-o;throw g.error("[NeuroLink] \u274C LOG_POINT_C013_EXTERNAL_SERVER_INIT_ERROR",{logPoint:"C013_EXTERNAL_SERVER_INIT_ERROR",constructorId:e,timestamp:new Date().toISOString(),elapsedMs:Date.now()-t,elapsedNs:(process.hrtime.bigint()-n).toString(),externalServerInitDurationNs:a.toString(),externalServerInitDurationMs:Number(a)/Ml,error:i instanceof Error?i.message:String(i),errorName:i instanceof Error?i.name:"UnknownError",errorStack:i instanceof Error?i.stack:void 0,message:"External server manager initialization failed"}),i}}setupExternalServerEventHandlers(e){this.externalServerManager.on("connected",t=>{g.debug("[NeuroLink] \u{1F517} EXTERNAL_SERVER_EVENT_CONNECTED",{constructorId:e,eventType:"connected",event:t,timestamp:new Date().toISOString(),message:"External MCP server connected event received"}),this.emitter.emit("externalMCP:serverConnected",t)}),this.externalServerManager.on("disconnected",t=>{g.debug("[NeuroLink] \u{1F517} EXTERNAL_SERVER_EVENT_DISCONNECTED",{constructorId:e,eventType:"disconnected",event:t,timestamp:new Date().toISOString(),message:"External MCP server disconnected event received"}),this.emitter.emit("externalMCP:serverDisconnected",t)}),this.externalServerManager.on("failed",t=>{g.warn("[NeuroLink] \u{1F517} EXTERNAL_SERVER_EVENT_FAILED",{constructorId:e,eventType:"failed",event:t,timestamp:new Date().toISOString(),message:"External MCP server failed event received"}),this.emitter.emit("externalMCP:serverFailed",t)}),this.externalServerManager.on("toolDiscovered",t=>{g.debug("[NeuroLink] \u{1F517} EXTERNAL_SERVER_EVENT_TOOL_DISCOVERED",{constructorId:e,eventType:"toolDiscovered",toolName:t.toolName,serverId:t.serverId,timestamp:new Date().toISOString(),message:"External MCP tool discovered event received"}),this.emitter.emit("externalMCP:toolDiscovered",t)}),this.externalServerManager.on("toolRemoved",t=>{g.debug("[NeuroLink] \u{1F517} EXTERNAL_SERVER_EVENT_TOOL_REMOVED",{constructorId:e,eventType:"toolRemoved",toolName:t.toolName,serverId:t.serverId,timestamp:new Date().toISOString(),message:"External MCP tool removed event received"}),this.emitter.emit("externalMCP:toolRemoved",t),this.unregisterExternalMCPToolFromRegistry(t.toolName)})}initializeLangfuse(e,t,n){let o=process.hrtime.bigint();try{let i=this.observabilityConfig?.langfuse,s=i?.autoDetectExternalProvider===!0||i?.useExternalTracerProvider===!0;if(i?.enabled||s){g.debug("[NeuroLink] \u{1F4CA} LOG_POINT_C019_LANGFUSE_INIT_START",{logPoint:"C019_LANGFUSE_INIT_START",constructorId:e,timestamp:new Date().toISOString(),elapsedMs:Date.now()-t,elapsedNs:(process.hrtime.bigint()-n).toString(),langfuseInitStartTimeNs:o.toString(),message:"Starting Langfuse observability initialization"}),xD(i);let a=U5(),l=process.hrtime.bigint()-o;a.initialized&&a.hasProcessor&&a.isHealthy?g.debug("[NeuroLink] \u2705 LOG_POINT_C020_LANGFUSE_INIT_SUCCESS",{logPoint:"C020_LANGFUSE_INIT_SUCCESS",constructorId:e,timestamp:new Date().toISOString(),elapsedMs:Date.now()-t,elapsedNs:(process.hrtime.bigint()-n).toString(),langfuseInitDurationNs:l.toString(),langfuseInitDurationMs:Number(l)/1e6,healthStatus:a,message:"Langfuse observability initialized successfully"}):g.warn("[NeuroLink] \u26A0\uFE0F LOG_POINT_C021_LANGFUSE_INIT_WARNING",{logPoint:"C021_LANGFUSE_INIT_WARNING",constructorId:e,timestamp:new Date().toISOString(),elapsedMs:Date.now()-t,elapsedNs:(process.hrtime.bigint()-n).toString(),langfuseInitDurationNs:l.toString(),healthStatus:a,message:"Langfuse initialized but not healthy"})}else g.debug("[NeuroLink] \u{1F6AB} LOG_POINT_C022_LANGFUSE_DISABLED",{logPoint:"C022_LANGFUSE_DISABLED",constructorId:e,timestamp:new Date().toISOString(),elapsedMs:Date.now()-t,elapsedNs:(process.hrtime.bigint()-n).toString(),message:"Langfuse observability not enabled - skipping initialization"})}catch(i){let s=process.hrtime.bigint()-o;g.error("[NeuroLink] \u274C LOG_POINT_C023_LANGFUSE_INIT_ERROR",{logPoint:"C023_LANGFUSE_INIT_ERROR",constructorId:e,timestamp:new Date().toISOString(),elapsedMs:Date.now()-t,elapsedNs:(process.hrtime.bigint()-n).toString(),langfuseInitDurationNs:s.toString(),errorMessage:i instanceof Error?i.message:String(i),errorStack:i instanceof Error?i.stack:void 0,message:"Langfuse observability initialization failed"})}}logConstructorComplete(e,t,n){let i=process.hrtime.bigint()-n;g.debug("\u{1F3C1} LOG_POINT_C014_CONSTRUCTOR_COMPLETE",{logPoint:"C014_CONSTRUCTOR_COMPLETE",constructorId:e,timestamp:new Date().toISOString(),constructorDurationNs:i.toString(),constructorDurationMs:Number(i)/Ml,totalElapsedMs:Date.now()-t,finalState:{hasConversationMemory:!!this.conversationMemory,hasExternalServerManager:!!this.externalServerManager,hasEmitter:!!this.emitter,mcpInitialized:this.mcpInitialized,toolCircuitBreakersCount:this.toolCircuitBreakers.size,toolExecutionMetricsCount:this.toolExecutionMetrics.size},finalMemoryUsage:process.memoryUsage(),finalCpuUsage:process.cpuUsage(),message:"NeuroLink constructor completed successfully with all components initialized"})}async initializeMCP(){if(!(this.mcpInitialized||this.mcpSkipped)){if(this.mcpInitPromise)return this.mcpInitPromise;if(process.env.NEUROLINK_SKIP_MCP==="true"){this.mcpInitPromise=(async()=>{await this.initializeProviderRegistryInternal(),this.mcpSkipped=!0})();try{await this.mcpInitPromise}finally{this.mcpInitPromise=null}return}this.mcpInitPromise=this.performMCPInitializationOnce();try{await this.mcpInitPromise}finally{this.mcpInitPromise=null}}}async performMCPInitializationOnce(){let e=`mcp-init-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,t=Date.now(),n=process.hrtime.bigint(),o=await this.importPerformanceManager(e,t,n),i=o?o.getMemoryUsageMB():{heapUsed:0,heapTotal:0,rss:0,external:0};try{await this.performMCPInitialization(e,t,n,i),this.mcpInitialized=!0,this.logMCPInitComplete(i,o,t)}catch(s){let a=Date.now()-t,l=process.hrtime.bigint()-n;ne.warn("[NeuroLink] MCP initialization failed",{mcpInitId:e,error:s instanceof Error?s.message:String(s),errorName:s instanceof Error?s.name:"UnknownError",errorStack:s instanceof Error?s.stack:void 0,initializationTime:a,initializationTimeNs:l.toString(),initializationPhase:"performMCPInitialization",memoryUsage:process.memoryUsage(),timestamp:new Date().toISOString(),gracefulDegradation:!0})}}async importPerformanceManager(e,t,n){let o=process.hrtime.bigint();try{return(await Promise.resolve().then(()=>(z0(),$0))).MemoryManager}catch(i){let a=process.hrtime.bigint()-o;g.warn("[NeuroLink] \u26A0\uFE0F LOG_POINT_M005_PERFORMANCE_IMPORT_ERROR",{logPoint:"M005_PERFORMANCE_IMPORT_ERROR",mcpInitId:e,timestamp:new Date().toISOString(),elapsedMs:Date.now()-t,elapsedNs:(process.hrtime.bigint()-n).toString(),performanceImportDurationNs:a.toString(),performanceImportDurationMs:Number(a)/Ml,error:i instanceof Error?i.message:String(i),errorName:i instanceof Error?i.name:"UnknownError",message:"MemoryManager import failed - continuing without performance tracking"});return}}async performMCPInitialization(e,t,n,o){g.info("[NeuroLink] \u{1F680} LOG_POINT_M006_MCP_MAIN_INIT_START",{logPoint:"M006_MCP_MAIN_INIT_START",mcpInitId:e,timestamp:new Date().toISOString(),elapsedMs:Date.now()-t,elapsedNs:(process.hrtime.bigint()-n).toString(),startMemory:o,message:"Starting isolated MCP initialization process"}),ne.debug("[NeuroLink] Starting isolated MCP initialization..."),await this.initializeToolRegistryInternal(),await this.initializeProviderRegistryInternal(),await this.registerDirectToolsServerInternal(e,t,n),await this.loadMCPConfigurationInternal()}async initializeToolRegistryInternal(){await Promise.race([Promise.resolve(),new Promise((t,n)=>{setTimeout(()=>n(new Error("MCP initialization timeout")),3e3)})])}async initializeProviderRegistryInternal(){await al.registerAllProviders()}async registerDirectToolsServerInternal(e,t,n){let o=process.hrtime.bigint();try{process.env.NEUROLINK_DISABLE_DIRECT_TOOLS==="true"?ne.debug("Direct tools server are disabled via environment variable."):(await this.toolRegistry.registerServer("neurolink-direct",iJ),ne.debug("[NeuroLink] Direct tools server registered successfully",{serverId:"neurolink-direct"}))}catch(i){let a=process.hrtime.bigint()-o;g.warn("[NeuroLink] \u26A0\uFE0F LOG_POINT_M013_DIRECT_TOOLS_ERROR",{logPoint:"M013_DIRECT_TOOLS_ERROR",mcpInitId:e,timestamp:new Date().toISOString(),elapsedMs:Date.now()-t,elapsedNs:(process.hrtime.bigint()-n).toString(),directToolsDurationNs:a.toString(),directToolsDurationMs:Number(a)/Ml,error:i instanceof Error?i.message:String(i),errorName:i instanceof Error?i.name:"UnknownError",errorStack:i instanceof Error?i.stack:void 0,serverId:"neurolink-direct",message:"Direct tools server registration failed but continuing"}),ne.warn("[NeuroLink] Failed to register direct tools server",{error:i instanceof Error?i.message:String(i)})}}async loadMCPConfigurationInternal(){try{let e=await this.externalServerManager.loadMCPConfiguration(void 0,{parallel:!0});ne.debug("[NeuroLink] MCP configuration loaded successfully",{serversLoaded:e.serversLoaded,errors:e.errors.length}),e.errors.length>0&&ne.warn("[NeuroLink] Some MCP servers failed to load",{errors:e.errors})}catch(e){ne.warn("[NeuroLink] MCP configuration loading failed",{error:e instanceof Error?e.message:String(e)})}}logMCPInitComplete(e,t,n){let i=(t?t.getMemoryUsageMB():{heapUsed:0,heapTotal:0,rss:0,external:0}).heapUsed-e.heapUsed,s=Date.now()-n;ne.debug("[NeuroLink] MCP initialization completed successfully",{initTime:`${s}ms`,memoryUsed:`${i}MB`}),i>Ou.MODERATE_USAGE_MB&&ne.debug("\u{1F4A1} Memory cleanup suggestion: MCP initialization used significant memory. Consider calling MemoryManager.forceGC() after heavy operations.")}async applyOrchestration(e){let t=Date.now();try{if(!e.input?.text||typeof e.input.text!="string")return g.debug("Orchestration skipped - no valid input text",{hasInput:!!e.input,hasText:!!e.input?.text,textType:typeof e.input?.text}),{};let n=oh.classify(e.input.text),o=hb.route(e.input.text);if(!await this.hasProviderEnvVars(o.provider)&&o.provider!=="ollama")return g.debug("Orchestration provider validation failed",{taskType:n.type,routedProvider:o.provider,routedModel:o.model,reason:"Provider not configured or missing environment variables",orchestrationTime:`${Date.now()-t}ms`}),{};if(o.provider==="ollama")try{let s=await fetch("http://localhost:11434/api/tags",{method:"GET",signal:AbortSignal.timeout(2e3)});if(!s.ok)return g.debug("Orchestration provider validation failed",{taskType:n.type,routedProvider:o.provider,routedModel:o.model,reason:"Ollama service not responding",orchestrationTime:`${Date.now()-t}ms`}),{};let a=await s.json(),l=a?.models;if(!Array.isArray(l))return g.warn("Ollama API returned invalid models format",{responseData:a,modelsType:typeof l}),{};let u=l.filter(p=>p&&typeof p=="object"&&typeof p.name=="string"),d=o.model;if(d){if(!u.some(m=>m.name===d))if(g.debug("Orchestration provider validation failed",{taskType:n.type,routedProvider:o.provider,routedModel:o.model,reason:`Ollama model '${d}' not found`,orchestrationTime:`${Date.now()-t}ms`}),u.length>0)o.model=u[0].name;else return{}}else{if(u.length===0)return g.debug("Orchestration provider validation failed",{taskType:n.type,routedProvider:o.provider,routedModel:o.model,reason:"No Ollama models available",orchestrationTime:`${Date.now()-t}ms`}),{};o.model=u[0].name}}catch(s){return g.debug("Orchestration provider validation failed",{taskType:n.type,routedProvider:o.provider,routedModel:o.model,reason:s instanceof Error?s.message:"Ollama service check failed",orchestrationTime:`${Date.now()-t}ms`}),{}}return g.debug("Orchestration route determined",{taskType:n.type,selectedProvider:o.provider,selectedModel:o.model,confidence:o.confidence,reasoning:o.reasoning,orchestrationTime:`${Date.now()-t}ms`}),{model:o.model,context:{...e.context||{},__orchestratedPreferredProvider:o.provider}}}catch(n){throw g.error("Orchestration failed",{error:n instanceof Error?n.message:String(n),orchestrationTime:`${Date.now()-t}ms`}),n}}async applyStreamOrchestration(e){let t=Date.now();try{if(!e.input?.text||typeof e.input.text!="string")return g.debug("Stream orchestration skipped - no valid input text",{hasInput:!!e.input,hasText:!!e.input?.text,textType:typeof e.input?.text}),{};let n=oh.classify(e.input.text),o=hb.route(e.input.text);if(!await this.hasProviderEnvVars(o.provider)&&o.provider!=="ollama")return g.debug("Stream orchestration provider validation failed",{taskType:n.type,routedProvider:o.provider,routedModel:o.model,reason:"Provider not configured or missing environment variables",orchestrationTime:`${Date.now()-t}ms`}),{};if(o.provider==="ollama")try{let s=await fetch("http://localhost:11434/api/tags",{method:"GET",signal:AbortSignal.timeout(2e3)});if(!s.ok)return g.debug("Stream orchestration provider validation failed",{taskType:n.type,routedProvider:o.provider,routedModel:o.model,reason:"Ollama service not responding",orchestrationTime:`${Date.now()-t}ms`}),{};let a=await s.json(),l=a?.models;if(!Array.isArray(l))return g.warn("Ollama API returned invalid models format in stream",{responseData:a,modelsType:typeof l}),{};let u=l.filter(p=>p&&typeof p=="object"&&typeof p.name=="string"),d=o.model;if(d){if(!u.some(m=>m.name===d))if(g.debug("Stream orchestration provider validation failed",{taskType:n.type,routedProvider:o.provider,routedModel:o.model,reason:`Ollama model '${d}' not found`,orchestrationTime:`${Date.now()-t}ms`}),u.length>0)o.model=u[0].name;else return{}}else{if(u.length===0)return g.debug("Stream orchestration provider validation failed",{taskType:n.type,routedProvider:o.provider,routedModel:o.model,reason:"No Ollama models available",orchestrationTime:`${Date.now()-t}ms`}),{};o.model=u[0].name}}catch(s){return g.debug("Stream orchestration provider validation failed",{taskType:n.type,routedProvider:o.provider,routedModel:o.model,reason:s instanceof Error?s.message:"Ollama service check failed",orchestrationTime:`${Date.now()-t}ms`}),{}}return g.debug("Stream orchestration route determined",{taskType:n.type,selectedProvider:o.provider,selectedModel:o.model,confidence:o.confidence,reasoning:o.reasoning,orchestrationTime:`${Date.now()-t}ms`}),{model:o.model,context:{...e.context||{},__orchestratedPreferredProvider:o.provider}}}catch(n){throw g.error("Stream orchestration failed",{error:n instanceof Error?n.message:String(n),orchestrationTime:`${Date.now()-t}ms`}),n}}_extractOriginalPrompt(e){if(typeof e=="string")return e;let t=e;if(t.messages&&t.messages.length>0){let n=t.messages[t.messages.length-1];return typeof n.content=="string"?n.content:JSON.stringify(n.content)}return e.input?.text||""}getObservabilityConfig(){return this.observabilityConfig}isTelemetryEnabled(){return this.observabilityConfig?.langfuse?.enabled?!0:dE()}getTelemetryStatus(){let e=this.observabilityConfig?.langfuse,t=this.observabilityConfig?.openTelemetry;return{enabled:this.isTelemetryEnabled(),langfuse:e?{enabled:e.enabled??!1,baseUrl:e.baseUrl,environment:e.environment}:void 0,openTelemetry:t?{enabled:t.enabled??!1,endpoint:t.endpoint,serviceName:t.serviceName}:dE()||process.env.OTEL_EXPORTER_OTLP_ENDPOINT?{enabled:dE(),endpoint:process.env.OTEL_EXPORTER_OTLP_ENDPOINT,serviceName:process.env.OTEL_SERVICE_NAME}:void 0,exporters:[]}}getMetrics(){return this.metricsAggregator.getMetrics()}getSpans(){return this.metricsAggregator.getSpans()}getTraces(){return this.metricsAggregator.getTraces()}resetMetrics(){this.metricsAggregator.reset()}recordMetricsSpan(e){this.metricsAggregator.recordSpan(e)}recordMemorySpan(e,t,n,o,i){let s=this._metricsTraceContext,a=ye.createSpan("memory",e,t,s?.parentSpanId,s?.traceId);a.durationMs=n;let l=ye.endSpan(a,o);i&&(l.statusMessage=i),this.metricsAggregator.recordSpan(l);try{Ne().recordSpan(l)}catch{}}async initializeLangfuseObservability(){try{let e=this.observabilityConfig?.langfuse;e?.enabled?(xD(e),g.debug("[NeuroLink] Langfuse observability initialized via public method")):g.debug("[NeuroLink] Langfuse not enabled, skipping initialization")}catch(e){g.warn("[NeuroLink] Failed to initialize Langfuse observability:",e)}}async shutdown(){try{g.debug("[NeuroLink] Starting graceful shutdown");try{await bD(),await TD(),g.debug("[NeuroLink] OpenTelemetry shutdown completed")}catch(e){g.warn("[NeuroLink] OpenTelemetry shutdown failed:",e)}if(this.externalServerManager)try{await this.externalServerManager.shutdown(),g.debug("[NeuroLink] MCP servers shutdown completed")}catch(e){g.warn("[NeuroLink] MCP servers shutdown failed:",e)}if(this.conversationMemory?.close)try{await this.conversationMemory.close(),g.debug("[NeuroLink] Conversation memory shutdown completed")}catch(e){g.warn("[NeuroLink] Conversation memory shutdown failed:",e)}g.debug("[NeuroLink] Graceful shutdown completed")}catch(e){throw g.error("[NeuroLink] Shutdown failed:",e),e}}initializeMetricsListeners(){this.emitter.on("generation:end",((...e)=>{let t=e[0];try{let n=t.result,o=n?.usage,i=n?.analytics,s=t.provider||n?.provider||"unknown",a=n?.model||"unknown",l=t.responseTime||0,u=this._metricsTraceContext,d=ye.createGenerationSpan({provider:s,model:a,name:`gen_ai.${s}.chat`,traceId:u?.traceId,input:t.prompt,temperature:t.temperature,maxTokens:t.maxTokens});u&&(d.spanId=u.parentSpanId,d.parentSpanId=void 0);let p=t.success===!1||t.error?2:1;if(d=ye.endSpan(d,p,t.error?String(t.error):void 0),d.durationMs=l,o&&(d=ye.enrichWithTokenUsage(d,{promptTokens:o.input||0,completionTokens:o.output||0,totalTokens:o.total||(o.input||0)+(o.output||0)})),i?.cost&&i.cost>0)d=ye.enrichWithCost(d,{totalCost:i.cost});else if(o&&a!=="unknown"){let h=this.metricsAggregator.getTokenTracker().getModelPricing(a);if(h){let y=(o.input||0)/1e6*h.inputPricePerMillion,v=(o.output||0)/1e6*h.outputPricePerMillion,T=y+v;T>0&&(d=ye.enrichWithCost(d,{inputCost:y,outputCost:v,totalCost:T}))}}let m=n?.content||n?.text;m&&(d=ye.updateAttributes(d,{output:m.length>5e3?m.substring(0,5e3)+"...[truncated]":m})),this.metricsAggregator.recordSpan(d),Ne().recordSpan(d)}catch{}})),this.emitter.on("stream:complete",((...e)=>{let t=e[0];try{let n=t.metadata,o=n?.durationMs||0,i=n?.chunkCount||0,s=n?.totalLength||0,a=t.provider||"unknown",l=t.model||"unknown",u=this._metricsTraceContext,d=ye.createGenerationSpan({provider:a,model:l,name:`gen_ai.${a}.stream`,traceId:u?.traceId});if(u&&(d.spanId=u.parentSpanId,d.parentSpanId=void 0),d=ye.endSpan(d,1),d.durationMs=o,d.attributes["stream.chunk_count"]=i,d.attributes["stream.content_length"]=s,t.prompt){let f=String(t.prompt);d=ye.updateAttributes(d,{input:f.length>5e3?f.substring(0,5e3)+"...[truncated]":f})}let p=t.content;p&&(d=ye.updateAttributes(d,{output:p.length>5e3?p.substring(0,5e3)+"...[truncated]":p}));let m=n?.usage;if(m&&(d=ye.enrichWithTokenUsage(d,{promptTokens:m.input||0,completionTokens:m.output||0,totalTokens:m.total||(m.input||0)+(m.output||0)}),l!=="unknown")){let h=this.metricsAggregator.getTokenTracker().getModelPricing(l);if(h){let y=(m.input||0)/1e6*h.inputPricePerMillion,v=(m.output||0)/1e6*h.outputPricePerMillion,T=y+v;T>0&&(d=ye.enrichWithCost(d,{inputCost:y,outputCost:v,totalCost:T}))}}this.metricsAggregator.recordSpan(d),Ne().recordSpan(d)}catch{}})),this.emitter.on("tool:end",((...e)=>{let t=e[0];try{let n=t.toolName||t.tool||"unknown",o=t.responseTime||t.duration||0,i=t.success!==void 0?t.success:!t.error,s=this._metricsTraceContext,a=ye.createSpan("tool.call",`tool.${n}`,{"tool.name":n,"tool.success":i},s?.parentSpanId,s?.traceId);if(a=ye.endSpan(a,i?1:2),a.durationMs=o,!i&&t.error&&(a.statusMessage=t.error.message||String(t.error)),t.result)try{a.attributes["tool.result"]=JSON.stringify(t.result).substring(0,500)}catch{}this.metricsAggregator.recordSpan(a),Ne().recordSpan(a)}catch{}})),this.emitter.on("stream:error",((...e)=>{let t=e[0];try{let n=t.metadata,o=n?.durationMs||0,i=n?.chunkCount||0,s=n?.errorName||"UnknownError",a=t.content||"Stream error",l=t.provider||"unknown",u=t.model||"unknown",d=this._metricsTraceContext,p=ye.createGenerationSpan({provider:l,model:u,name:`gen_ai.${l}.stream.error`,traceId:d?.traceId});d&&(p.spanId=d.parentSpanId,p.parentSpanId=void 0),p=ye.endSpan(p,2),p.durationMs=o,p.statusMessage=`${s}: ${a}`,p.attributes["stream.chunk_count"]=i,this.metricsAggregator.recordSpan(p),Ne().recordSpan(p)}catch{}}))}async generate(e){return mt.sdk.startActiveSpan("neurolink.generate",{kind:jt.INTERNAL},async t=>{let n=crypto.randomUUID().replace(/-/g,""),o=crypto.randomUUID().replace(/-/g,"").substring(0,16);return H9.run({traceId:n,parentSpanId:o},async()=>{try{let i=this._extractOriginalPrompt(e),s=typeof e=="string"?{input:{text:e}}:{...e};if(s.model=yb(s.model,this.modelAliasConfig),this._disableToolCacheForCurrentRequest=!!s.disableToolCache,t.setAttribute("neurolink.provider",s.provider||"default"),t.setAttribute("neurolink.model",s.model||"default"),t.setAttribute("neurolink.input_length",typeof e=="string"?e.length:s.input?.text?.length||0),t.setAttribute("neurolink.has_tools",!!(s.tools&&Object.keys(s.tools).length>0)),!s.input?.text||typeof s.input.text!="string")throw new Error("Input text is required and must be a non-empty string");if(s.maxBudgetUsd!==void 0&&s.maxBudgetUsd>0&&this._sessionCostUsd>=s.maxBudgetUsd)throw new Ve({code:"SESSION_BUDGET_EXCEEDED",message:`Session budget exceeded: spent $${this._sessionCostUsd.toFixed(4)} of $${s.maxBudgetUsd.toFixed(4)} limit`,category:"validation",severity:"high",retriable:!1,context:{spent:this._sessionCostUsd,limit:s.maxBudgetUsd}});if((s.onFinish||s.onError)&&(s.middleware={...s.middleware,middlewareConfig:{...s.middleware?.middlewareConfig,lifecycle:{...s.middleware?.middlewareConfig?.lifecycle,enabled:!0,config:{...s.middleware?.middlewareConfig?.lifecycle?.config,onFinish:s.onFinish,onError:s.onError}}}}),s.auth?.token){let{AuthError:a}=await Promise.resolve().then(()=>(qo(),B6));if(await this.ensureAuthProvider(),!this.authProvider)throw a.create("PROVIDER_ERROR","No auth provider configured. Set auth in constructor or via setAuthProvider() before using auth: { token }.");let l;try{l=await We(this.authProvider.authenticateToken(s.auth.token),5e3,a.create("PROVIDER_ERROR","Auth token validation timed out after 5000ms"))}catch(u){throw u instanceof Error&&"feature"in u&&u.feature==="Auth"?u:a.create("PROVIDER_ERROR",`Auth token validation failed: ${u instanceof Error?u.message:String(u)}`)}if(!l.valid)throw a.create("INVALID_TOKEN",l.error||"Token validation failed");if(!l.user)throw a.create("INVALID_TOKEN","Token validated but no user identity returned");if(!l.user.id)throw a.create("INVALID_TOKEN","Token validated but user identity missing required 'id' field");s.context={...s.context||{},userId:l.user.id,userEmail:l.user.email,userRoles:l.user.roles}}if(s.requestContext){let a=s.auth?.token&&this.authProvider?{userId:s.context?.userId,userEmail:s.context?.userEmail,userRoles:s.context?.userRoles}:{};s.context={...s.context||{},...s.requestContext,...a}}if(s.workflow||s.workflowConfig)return await this.generateWithWorkflow(s);if(s.output?.mode==="ppt"){let a=await this.generateWithPPT(s);return t.setAttribute("neurolink.output_length",a.content?.length??0),a.analytics&&(t.setAttribute("neurolink.tokens.input",a.analytics.tokenUsage?.input??0),t.setAttribute("neurolink.tokens.output",a.analytics.tokenUsage?.output??0),t.setAttribute("neurolink.cost",a.analytics.cost??0)),t.setStatus({code:Ae.OK}),a}return await this.setLangfuseContextFromOptions(s,async()=>{let a=Date.now();if(this.enableOrchestration&&!s.provider&&!s.model)try{let v=await this.applyOrchestration(s);g.debug("Orchestration applied",{originalProvider:s.provider||"auto",orchestratedProvider:v.provider,orchestratedModel:v.model,prompt:s.input.text.substring(0,100)}),Object.assign(s,v),v.model&&(s.model=yb(s.model,this.modelAliasConfig))}catch(v){g.warn("Orchestration failed, continuing with original options",{error:v instanceof Error?v.message:String(v),originalProvider:s.provider||"auto"})}this.emitter.emit("generation:start",{provider:s.provider||"auto",timestamp:a}),this.emitter.emit("response:start"),this.emitter.emit("message",`Starting ${s.provider||"auto"} text generation...`);let l=QEe(s);if(l.hasFactoryConfig&&s.factoryConfig){let v=n0e(s.factoryConfig);v.isValid||g.warn("Invalid factory configuration detected",{errors:v.errors})}if(s.rag?.files?.length)try{let{prepareRAGTool:v}=await Promise.resolve().then(()=>(vU(),GJ)),T=await v(s.rag,s.provider);s.tools||(s.tools={}),s.tools[T.toolName]=T.tool;let _=[`
|
|
2024
|
+
|
|
2025
|
+
IMPORTANT: You have a tool called "${T.toolName}" that searches through`,`${T.filesLoaded} loaded document(s) containing ${T.chunksIndexed} indexed chunks.`,`ALWAYS use the "${T.toolName}" tool FIRST to answer the user's question before using any other tools.`,"This tool searches your local knowledge base of pre-loaded documents and is the primary source of truth.","Do NOT use websearchGrounding or any web search tools when the answer can be found in the loaded documents."].join(" ");s.systemPrompt=(s.systemPrompt||"")+_,g.info("[RAG] Tool injected into generate()",{toolName:T.toolName,filesLoaded:T.filesLoaded,chunksIndexed:T.chunksIndexed})}catch(v){g.warn("[RAG] Failed to prepare RAG tool, continuing without RAG",{error:v instanceof Error?v.message:String(v)})}if(this.shouldReadMemory(s.memory,s.context?.userId)&&s.context?.userId)try{s.input.text=await this.retrieveMemory(s.input.text,s.context.userId,s.memory?.additionalUsers),g.debug("Memory retrieval successful (generate)")}catch(v){g.warn("Memory retrieval failed (generate):",v)}let u={prompt:s.input.text,provider:s.provider,model:s.model,temperature:s.temperature,maxTokens:s.maxTokens,systemPrompt:s.systemPrompt,schema:s.schema,output:s.output,tools:s.tools,disableTools:s.disableTools,toolFilter:s.toolFilter,excludeTools:s.excludeTools,maxSteps:s.maxSteps,toolChoice:s.toolChoice,prepareStep:s.prepareStep,enableAnalytics:s.enableAnalytics,enableEvaluation:s.enableEvaluation,context:s.context,evaluationDomain:s.evaluationDomain,toolUsageContext:s.toolUsageContext,input:s.input,region:s.region,tts:s.tts,fileRegistry:this.fileRegistry,abortSignal:s.abortSignal,skipToolPromptInjection:s.skipToolPromptInjection,middleware:s.middleware},d=s;(d.sessionId||d.userId)&&(u.context={...u.context,...d.sessionId&&!u.context?.sessionId?{sessionId:d.sessionId}:{},...d.userId&&!u.context?.userId?{userId:d.userId}:{}});let p=e0e(u,l);this.conversationMemory&&(p.conversationMemoryConfig=this.conversationMemory.config,p.originalPrompt=i);let{toolResults:m,enhancedPrompt:f}=await this.detectAndExecuteTools(p.prompt||s.input.text,l.domainType);f!==p.prompt&&(p.prompt=f,g.debug("Enhanced prompt with tool results",{originalLength:s.input.text.length,enhancedLength:f.length,toolResults:m.length}));let h=await this.generateTextInternal(p);this.emitter.emit("generation:end",{provider:h.provider,responseTime:Date.now()-a,toolsUsed:h.toolsUsed,timestamp:Date.now(),result:h,prompt:s.input?.text||s.prompt,temperature:p.temperature,maxTokens:p.maxTokens}),this.emitter.emit("response:end",h.content||""),this.emitter.emit("message",`Generation completed in ${Date.now()-a}ms`);let y={content:h.content,finishReason:h.finishReason,provider:h.provider,model:h.model,usage:h.usage?{input:h.usage.input||0,output:h.usage.output||0,total:h.usage.total||0}:void 0,responseTime:h.responseTime,toolsUsed:h.toolsUsed,toolExecutions:Pue(h.toolExecutions),enhancedWithTools:h.enhancedWithTools,availableTools:Oue(h.availableTools),analytics:h.analytics,imageOutput:h.imageOutput,evaluation:h.evaluation?{...h.evaluation,isOffTopic:h.evaluation.isOffTopic??!1,alertSeverity:h.evaluation.alertSeverity??"none",reasoning:h.evaluation.reasoning??"No evaluation provided",evaluationModel:h.evaluation.evaluationModel??"unknown",evaluationTime:h.evaluation.evaluationTime??Date.now(),evaluationDomain:h.evaluation.evaluationDomain??p.evaluationDomain??l.domainType}:void 0,audio:h.audio,video:h.video,ppt:h.ppt,...h.retries&&{retries:h.retries}};return y.analytics?.cost&&y.analytics.cost>0&&(this._sessionCostUsd+=y.analytics.cost),this.scheduleGenerateMemoryStorage(s,i,y),t.setAttribute("neurolink.output_length",y.content?.length||0),t.setAttribute("neurolink.tokens.input",y.usage?.input||0),t.setAttribute("neurolink.tokens.output",y.usage?.output||0),t.setAttribute("neurolink.finish_reason",y.finishReason||"unknown"),t.setAttribute("neurolink.result_provider",y.provider||"unknown"),t.setAttribute("neurolink.result_model",y.model||"unknown"),t.setAttribute("generate.retry_count",y.retries?.count||0),t.setStatus({code:Ae.OK}),y})}catch(i){t.setStatus({code:Ae.ERROR,message:i instanceof Error?i.message:String(i)});let s=typeof e=="object"&&e.provider||"unknown",a=typeof e=="object"&&e.model||"unknown";try{this.emitter.emit("generation:end",{provider:s,model:a,responseTime:0,error:i instanceof Error?i.message:String(i),success:!1})}catch(l){}throw i}finally{this._disableToolCacheForCurrentRequest=!1,t.end()}})})}scheduleGenerateMemoryStorage(e,t,n){this.shouldWriteMemory(e.memory,e.context?.userId,n.content)&&e.context?.userId&&this.storeMemoryInBackground(t??"",n.content.trim(),e.context.userId,e.memory?.additionalUsers)}async generateWithPPT(e){let t=Date.now(),{generatePresentation:n}=await xke().then(()=>vke),{extractPPTContext:o,getEffectivePPTProvider:i}=await Promise.resolve().then(()=>(kU(),GCe)),s=e.provider||"vertex",a=await br.createProvider(s,e.model,!0,this),l=await i(a,s,e.model||"default",this),u=o(e),d=await n({context:u,provider:l.provider,providerName:l.providerName,modelName:l.modelName,neurolink:this});return{content:`Presentation generated: ${d.filePath} (${d.totalSlides} slides)`,finishReason:"stop",provider:d.provider||s,model:d.model||e.model||"default",usage:void 0,responseTime:Date.now()-t,ppt:d}}async generateWithWorkflow(e){let t=Date.now();g.debug("[NeuroLink] Executing workflow generation",{workflowId:e.workflow,hasInlineConfig:!!e.workflowConfig,prompt:e.input.text.substring(0,100),startTime:t});let n;if(e.workflowConfig)n=e.workflowConfig;else if(e.workflow){if(n=sU(e.workflow),!n)throw new Error(`Workflow '${e.workflow}' not found in registry`)}else throw new Error("Either workflow or workflowConfig must be provided");let o=await aU(n,{prompt:e.input.text,conversationHistory:e.conversationHistory,timeout:e.timeout,verbose:!1,metadata:e.context}),i={content:o.content,provider:o.selectedResponse?.provider||n.models[0]?.provider,model:o.selectedResponse?.model||n.models[0]?.model,usage:o.usage?{input:o.usage.totalInputTokens,output:o.usage.totalOutputTokens,total:o.usage.totalTokens}:void 0,responseTime:o.totalTime,workflow:{originalResponse:o.originalContent||o.content,processedResponse:o.content,ensembleResponses:o.ensembleResponses.map(s=>({provider:s.provider,model:s.model,content:s.content,responseTime:s.responseTime,status:s.status,error:s.error})),judgeScores:o.judgeScores?{scores:o.judgeScores.scores,reasoning:o.reasoning,selectedModel:`${o.selectedResponse?.provider}-${o.selectedResponse?.model}`}:void 0,selectedModel:`${o.selectedResponse?.provider}-${o.selectedResponse?.model}`,metrics:{totalTime:o.totalTime,ensembleTime:o.ensembleTime,judgeTime:o.judgeTime,conditioningTime:o.conditioningTime},workflowId:o.workflow,workflowName:o.workflowName}};return g.debug("[NeuroLink] Workflow generation complete",{workflowId:o.workflow,selectedModel:i.workflow?.selectedModel,score:o.score,totalTime:o.totalTime}),i}async streamWithWorkflow(e,t){g.debug("[NeuroLink] Executing workflow streaming (progressive)",{workflowId:e.workflow,hasInlineConfig:!!e.workflowConfig,prompt:e.input.text.substring(0,100)});let n;if(e.workflowConfig)n=e.workflowConfig;else if(e.workflow){if(n=sU(e.workflow),!n)throw new Error(`Workflow '${e.workflow}' not found in registry`)}else throw new Error("Either workflow or workflowConfig must be provided");let{runWorkflowWithStreaming:o}=await Promise.resolve().then(()=>(cU(),X0e)),i=o(n,{prompt:e.input.text,conversationHistory:e.conversationHistory,timeout:e.timeout,verbose:!1,metadata:e.context,streaming:!0}),s=null,a=0,u={stream:(async function*(){for await(let p of i)if(p.type==="preliminary")a=Date.now()-t,g.debug("[NeuroLink] Streaming preliminary response",{responseTime:a,contentLength:p.content.length}),yield{content:p.content,type:"preliminary"};else if(p.type==="final"){s=p.partialResult??null;let m=Date.now()-t;g.debug("[NeuroLink] Streaming final synthesis",{responseTime:m,contentLength:p.content.length}),yield{content:p.content,type:"final"}}})(),provider:n.models[0]?.provider,model:n.models[0]?.model,metadata:{streamId:`workflow-${n.id}-${Date.now()}`,startTime:t,responseTime:0}},d=u.stream;return u.stream=(async function*(){for await(let p of d)yield p;if(s){let p=s,m=Date.now()-t;p.usage&&(u.usage={input:p.usage.totalInputTokens,output:p.usage.totalOutputTokens,total:p.usage.totalTokens}),u.metadata={...u.metadata,totalChunks:2,responseTime:m,preliminaryTime:a};let f=p.ensembleResponses?.map(y=>({provider:y.provider,model:y.model,content:y.content,responseTime:y.responseTime,status:y.status,error:y.error}))??[],h=p.judgeScores?{scores:p.judgeScores.scores,reasoning:p.reasoning??"",selectedModel:p.selectedResponse?`${p.selectedResponse.provider}-${p.selectedResponse.model}`:"unknown"}:void 0;u.workflow={originalResponse:p.originalContent??p.content??"",processedResponse:p.content??"",ensembleResponses:f,judgeScores:h,selectedModel:p.selectedResponse?`${p.selectedResponse.provider}-${p.selectedResponse.model}`:"unknown",metrics:{totalTime:p.totalTime??m,ensembleTime:p.ensembleTime??0,judgeTime:p.judgeTime,conditioningTime:p.conditioningTime},workflowId:p.workflow??n.id,workflowName:p.workflowName??n.name}}})(),g.debug("[NeuroLink] Workflow streaming initialized",{workflowId:n.id}),u}async generateText(e){if(!e.prompt||typeof e.prompt!="string"||e.prompt.trim()==="")throw new Error("GenerateText options must include prompt as a non-empty string");return e.model=yb(e.model,this.modelAliasConfig),await this.generateTextInternal(e)}async generateTextInternal(e){return mt.sdk.startActiveSpan("neurolink.generateTextInternal",{kind:jt.INTERNAL},async t=>{try{let n=`generate-internal-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,o=e.context?.requestId,i=typeof o=="string"&&o?o:`req-${Date.now()}-${Math.random().toString(36).substr(2,9)}`;e.context={...e.context,requestId:i};let s=Date.now(),a=process.hrtime.bigint(),l="NeuroLink.generateTextInternal";t.setAttribute("neurolink.request_id",i),t.setAttribute("neurolink.has_conversation_memory",!!this.conversationMemory),t.setAttribute("neurolink.provider",e.provider||"auto"),t.setAttribute("neurolink.model",e.model||"default"),this.logGenerateTextInternalStart(n,s,a,e,l),this.emitGenerationStartEvents(e);try{await this.initializeConversationMemoryForGeneration(n,s,a);let u=await this.attemptMCPGeneration(e,n,s,a,l);if(u){g.info("[NeuroLink.generateTextInternal] generate() - COMPLETE SUCCESS (MCP path)",{provider:u.provider,model:u.model,responseTimeMs:Date.now()-s,tokensUsed:u.usage?.total||0,toolsUsed:u.toolsUsed?.length||0,...u.usage?.cacheCreationTokens!==void 0&&{cacheCreationTokens:u.usage.cacheCreationTokens},...u.usage?.cacheReadTokens!==void 0&&{cacheReadTokens:u.usage.cacheReadTokens},...u.usage?.cacheSavingsPercent!==void 0&&{cacheSavingsPercent:u.usage.cacheSavingsPercent}});{let p=Date.now();try{await n1(this.conversationMemory,e,u,new Date(s),i),this.recordMemorySpan("memory.store",{"memory.operation":"store","memory.path":"mcp"},Date.now()-p,1)}catch(m){this.recordMemorySpan("memory.store",{"memory.operation":"store","memory.path":"mcp"},Date.now()-p,2,m instanceof Error?m.message:String(m))}}return this.emitter.emit("response:end",u.content||""),t.setAttribute("neurolink.path","mcp"),t.setAttribute("neurolink.tokens.input",u.usage?.input||0),t.setAttribute("neurolink.tokens.output",u.usage?.output||0),t.setAttribute("neurolink.result_provider",u.provider||"unknown"),t.setStatus({code:Ae.OK}),u}if(e.abortSignal?.aborted)throw new DOMException("The operation was aborted","AbortError");if(this.conversationMemory){let p=await Bg(this.conversationMemory,e);e._originalConversationMessages=p?[...p]:void 0}let d=await this.directProviderGeneration(e);g.debug(`[${l}] Direct generation successful`),g.info("[NeuroLink.generateTextInternal] generate() - COMPLETE SUCCESS",{provider:d.provider,model:d.model,responseTimeMs:Date.now()-s,tokensUsed:d.usage?.total||0,toolsUsed:d.toolsUsed?.length||0,...d.usage?.cacheCreationTokens!==void 0&&{cacheCreationTokens:d.usage.cacheCreationTokens},...d.usage?.cacheReadTokens!==void 0&&{cacheReadTokens:d.usage.cacheReadTokens},...d.usage?.cacheSavingsPercent!==void 0&&{cacheSavingsPercent:d.usage.cacheSavingsPercent}});{let p=Date.now();try{await n1(this.conversationMemory,e,d,new Date(s),i),this.recordMemorySpan("memory.store",{"memory.operation":"store","memory.path":"direct"},Date.now()-p,1)}catch(m){this.recordMemorySpan("memory.store",{"memory.operation":"store","memory.path":"direct"},Date.now()-p,2,m instanceof Error?m.message:String(m))}}return this.emitter.emit("response:end",d.content||""),this.emitter.emit("message","Text generation completed successfully"),t.setAttribute("neurolink.path","direct"),t.setAttribute("neurolink.tokens.input",d.usage?.input||0),t.setAttribute("neurolink.tokens.output",d.usage?.output||0),t.setAttribute("neurolink.result_provider",d.provider||"unknown"),t.setStatus({code:Ae.OK}),d}catch(u){if(bK(u)&&this.conversationMemory){g.warn(`[${l}] Context overflow detected by provider, attempting smart recovery`,{error:u instanceof Error?u.message:String(u),overflowProvider:w_e(u)});try{let d=E_e(u),p=e._originalConversationMessages??await Bg(this.conversationMemory,e),m=is({provider:e.provider||"openai",model:e.model,maxTokens:e.maxTokens,currentPrompt:e.prompt,systemPrompt:e.systemPrompt}),f=d?.actualTokens??m.estimatedInputTokens,h=d?.budgetTokens??m.availableInputTokens,y=Math.floor(h*.7),v=f>0?(f-y)/f:.5,_=await new fm({enableSummarize:!1,enablePrune:!0,enableDeduplicate:!0,enableTruncate:!0,truncationFraction:Math.min(.9,v+.15)}).compact(p,y,void 0,e.context?.requestId);if(_.compacted){let S=Vx(_.messages),w=is({provider:e.provider||"openai",model:e.model,maxTokens:e.maxTokens,systemPrompt:e.systemPrompt,currentPrompt:e.prompt,conversationMessages:S.messages});if(!w.withinBudget)throw g.error(`[${l}] Recovery compaction insufficient, aborting retry`,{estimatedTokens:w.estimatedInputTokens,availableTokens:w.availableInputTokens}),new gm(`Context overflow recovery failed. Provider rejected at ~${f} tokens, recovery compaction achieved ${_.tokensAfter} tokens but budget is ${h} tokens.`,{estimatedTokens:_.tokensAfter,availableTokens:h,stagesUsed:_.stagesUsed,breakdown:w.breakdown});return g.info(`[${l}] Smart recovery verified, retrying generation`,{tokensSaved:_.tokensSaved,compactionTarget:y,verifiedTokens:w.estimatedInputTokens,verifiedBudget:w.availableInputTokens}),await this.directProviderGeneration({...e,conversationMessages:S.messages})}}catch(d){if(d instanceof gm)throw d;g.error(`[${l}] Recovery attempt failed`,{error:d instanceof Error?d.message:String(d)})}}if(hr(u)){g.info(`[${l}] Generation aborted \u2014 storing conversation turn for title generation`,{hasMemory:!!this.conversationMemory,memoryType:this.conversationMemory?.constructor?.name||"NONE",sessionId:e.context?.sessionId||"unknown"});try{let d={content:"[generation was interrupted]",provider:e.provider||"unknown",model:e.model||"unknown",responseTime:Date.now()-s};await We(n1(this.conversationMemory,e,d,new Date(s),i),5e3)}catch(d){g.warn(`[${l}] Failed to store conversation turn after abort`,{error:d instanceof Error?d.message:String(d)})}}else g.error(`[${l}] All generation methods failed`,{error:u instanceof Error?u.message:String(u)});throw this.emitter.emit("response:end",""),this.emitter.emit("error",u instanceof Error?u:new Error(String(u))),u}}catch(n){throw t.setStatus({code:Ae.ERROR,message:n instanceof Error?n.message:String(n)}),n}finally{t.end()}})}logGenerateTextInternalStart(e,t,n,o,i){g.debug(`[${i}] Starting generation`,{provider:o.provider||"auto",promptLength:o.prompt?.length||0,hasConversationMemory:!!this.conversationMemory})}emitGenerationStartEvents(e){this.emitter.emit("response:start"),this.emitter.emit("message",`Starting ${e.provider||"auto"} text generation (internal)...`)}async initializeConversationMemoryForGeneration(e,t,n){let o=process.hrtime.bigint();if(this.conversationMemoryNeedsInit&&this.conversationMemoryConfig&&await this.lazyInitializeConversationMemory(e,t,n),this.conversationMemory){g.debug("[NeuroLink] \u{1F9E0} LOG_POINT_G003_CONVERSATION_MEMORY_INIT_START",{logPoint:"G003_CONVERSATION_MEMORY_INIT_START",generateInternalId:e,timestamp:new Date().toISOString(),elapsedMs:Date.now()-t,elapsedNs:(process.hrtime.bigint()-n).toString(),message:"Starting conversation memory initialization"});try{await this.conversationMemory.initialize()}catch(a){g.warn("[NEUROLINK] Redis memory init failed, falling back to in-memory",{error:a instanceof Error?a.message:String(a),generateInternalId:e});let l=this.conversationMemoryConfig?.conversationMemory;this.conversationMemory=new Vg({enabled:!0,maxSessions:l?.maxSessions??100,maxTurnsPerSession:l?.maxTurnsPerSession??50}),await this.conversationMemory.initialize()}let s=process.hrtime.bigint()-o;g.debug("[NeuroLink] \u2705 LOG_POINT_G004_CONVERSATION_MEMORY_INIT_SUCCESS",{logPoint:"G004_CONVERSATION_MEMORY_INIT_SUCCESS",generateInternalId:e,timestamp:new Date().toISOString(),elapsedMs:Date.now()-t,elapsedNs:(process.hrtime.bigint()-n).toString(),conversationMemoryDurationNs:s.toString(),conversationMemoryDurationMs:Number(s)/Ml,message:"Conversation memory initialization completed successfully"})}}async attemptMCPGeneration(e,t,n,o,i){return!e.disableTools&&!(e.tts?.enabled&&!e.tts?.useAiResponse)?await this.performMCPGenerationRetries(e,t,n,o,i):null}async performMCPGenerationRetries(e,t,n,o,i){let s=Rn.QUICK,a=[],l=0,u=s+1;for(let d=1;d<=u;d++){if(e.abortSignal?.aborted)throw g.debug(`[${i}] Abort signal already fired before attempt ${d}, stopping retries`),new DOMException("The operation was aborted","AbortError");try{g.debug(`[${i}] Attempting MCP generation (attempt ${d}/${u})...`);let p=await this.tryMCPGeneration(e);if(p&&(p.content||p.toolExecutions&&p.toolExecutions.length>0))return g.debug(`[${i}] MCP generation successful on attempt ${d}`,{contentLength:p.content?.length||0,toolsUsed:p.toolsUsed?.length||0,toolExecutions:p.toolExecutions?.length||0,retryCount:l}),l>0&&(p.retries={count:l,errors:a}),p;g.debug(`[${i}] MCP generation returned empty result on attempt ${d}`,{hasResult:!!p,hasContent:!!(p&&p.content),contentLength:p?.content?.length||0,toolExecutions:p?.toolExecutions?.length||0})}catch(p){if(hr(p))throw g.debug(`[${i}] AbortError detected on attempt ${d}, stopping retries`),p;l++;let m=p instanceof Error?p.message:String(p),f=p instanceof Ve?p.code:p instanceof Error?p.name:"UNKNOWN";a.push({code:f,message:m.substring(0,500)}),g.debug(`[${i}] MCP generation failed on attempt ${d}/${u}`,{error:m,willRetry:d<u,retryCount:l});let h=p instanceof Error&&(p.name==="AI_NoSuchToolError"||p.name==="AI_InvalidToolArgumentsError"||p.message.includes("NoSuchToolError")||p.message.includes("Model tried to call unavailable tool"));if(bK(p)||h||Lke(p)||p instanceof Error&&p.isRetryable===!1||p instanceof Error&&p.statusCode===400){g.debug(`[${i}] Non-retryable error detected, skipping remaining retries`);break}if(d>=u){g.debug(`[${i}] All MCP attempts exhausted, falling back to direct generation`);break}if(await new Promise(v=>{let T=setTimeout(v,500);if(e.abortSignal){let _=()=>{clearTimeout(T),v()};e.abortSignal.addEventListener("abort",_,{once:!0})}}),e.abortSignal?.aborted)throw new DOMException("The operation was aborted","AbortError")}}return null}async tryMCPGeneration(e){if(e.abortSignal?.aborted)throw new DOMException("The operation was aborted","AbortError");let t=e.context?.requestId||"unknown",n=`try-mcp-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,o=Date.now(),i=process.hrtime.bigint(),s="NeuroLink.tryMCPGeneration";try{if(await this.initializeMCP(),!this.mcpInitialized)return g.warn("[NeuroLink] \u26A0\uFE0F LOG_POINT_T004_MCP_NOT_AVAILABLE",{logPoint:"T004_MCP_NOT_AVAILABLE",tryMCPId:n,timestamp:new Date().toISOString(),elapsedMs:Date.now()-o,elapsedNs:(process.hrtime.bigint()-i).toString(),mcpInitialized:this.mcpInitialized,mcpComponents:{hasExternalServerManager:!!this.externalServerManager,hasToolRegistry:!!this.toolRegistry,hasProviderRegistry:!!br},fallbackReason:"MCP_NOT_INITIALIZED",message:"MCP not available - returning null for fallback to direct generation"}),null;let a=e.provider==="auto"||!e.provider?await cm():e.provider,l=await this.getAllAvailableTools(),{tools:u,unavailableTools:d}=this.toolRegistry.getAvailableTools(this.toolCircuitBreakers),p=new Set(u.map(E=>E.name));l=l.filter(E=>p.has(E.name)),l=this.applyToolInfoFiltering(l,e);let m=l.find(E=>E.name.includes("SuccessRateSRByTime")||E.name.includes("juspay-analytics"));g.debug("Available tools for AI prompt generation",{toolsCount:l.length,toolNames:l.map(E=>E.name),unavailableToolsCount:d.length,unavailableTools:d,hasTargetTool:!!m,targetToolDetails:m?{name:m.name,description:m.description,server:m.server}:null});let f="";d.length>0&&(f=`
|
|
2019
2026
|
|
|
2020
2027
|
NOTE: The following tools are temporarily unavailable due to repeated failures: ${d.join(", ")}. Do not attempt to call these tools.`);let h=e.skipToolPromptInjection?(e.systemPrompt||"")+f:this.createToolAwareSystemPrompt(e.systemPrompt,l)+f;g.debug("Tool-aware system prompt created",{requestId:t,originalPromptLength:e.systemPrompt?.length||0,enhancedPromptLength:h.length,skippedToolInjection:!!e.skipToolPromptInjection,enhancedPromptPreview:h.substring(0,80)+"..."}),g.debug("[Observability] System prompt metadata",{requestId:t,systemPromptLength:h.length,systemPromptHash:h.length>0?`sha256:${h.slice(0,8)}...`:"empty",hasCustomSystemPrompt:!!e.systemPrompt});let y=await Bg(this.conversationMemory,e);if(g.shouldLog("debug"))try{g.debug("[Observability] Conversation history summary",{requestId:t,messageCount:y?.length||0,messages:y?.map((E,O)=>{let D;if(typeof E.content=="string")D=E.content.length;else try{D=JSON.stringify(E.content).length}catch{D=0}return{index:O,role:E.role,contentLength:D,contentPreview:typeof E.content=="string"?E.content.substring(0,200):"[multimodal]"}})})}catch{}g.debug("[Observability] Available tools for LLM",{requestId:t,toolCount:l?.length||0,toolNames:l?.map(E=>E.name)||[]});let v=is({provider:a,model:e.model,maxTokens:e.maxTokens,systemPrompt:h,conversationMessages:y,currentPrompt:e.prompt,toolDefinitions:l});g.info("[TokenBudget] Token breakdown",{requestId:t,system:v.breakdown?.systemPrompt||0,history:v.breakdown?.conversationHistory||0,tools:v.breakdown?.toolDefinitions||0,currentPrompt:v.breakdown?.currentPrompt||0,files:v.breakdown?.fileAttachments||0,total:v.estimatedInputTokens,budget:v.availableInputTokens,usagePercent:Math.round(v.usageRatio*1e3)/10,conversationMessageCount:y?.length||0,shouldCompact:v.shouldCompact});let T=y?.length||0,_=this.getCompactionSessionId(e);if(v.shouldCompact&&this.conversationMemory&&T>(this.lastCompactionMessageCount.get(_)??0)){g.info("[NeuroLink] Context budget exceeded, triggering auto-compaction",{usageRatio:v.usageRatio,estimatedTokens:v.estimatedInputTokens,availableTokens:v.availableInputTokens});let O=await new fm({provider:a,summarizationProvider:this.conversationMemoryConfig?.conversationMemory?.summarizationProvider,summarizationModel:this.conversationMemoryConfig?.conversationMemory?.summarizationModel}).compact(y,v.availableInputTokens,this.conversationMemoryConfig?.conversationMemory,t);O.compacted&&(y=Vx(O.messages).messages,this.lastCompactionMessageCount.set(_,y.length),g.info("[NeuroLink] Context compacted successfully",{stagesUsed:O.stagesUsed,tokensSaved:O.tokensSaved}));let D=is({provider:a,model:e.model,maxTokens:e.maxTokens,systemPrompt:h,conversationMessages:y,currentPrompt:e.prompt,toolDefinitions:l});if(!D.withinBudget){let U=D.usageRatio-1;g.warn("[NeuroLink] Post-compaction still over budget, attempting emergency content truncation",{requestId:t,estimatedTokens:D.estimatedInputTokens,availableTokens:D.availableInputTokens,overagePercent:Math.round(U*100),stagesUsedInCompaction:O.stagesUsed}),y=a1(y,D.availableInputTokens,D.breakdown,a);let N=is({provider:a,model:e.model,maxTokens:e.maxTokens,systemPrompt:h,conversationMessages:y,currentPrompt:e.prompt,toolDefinitions:l});if(!N.withinBudget)throw new gm(`Context exceeds model budget after all compaction stages. Estimated: ${N.estimatedInputTokens} tokens, Budget: ${N.availableInputTokens} tokens. Conversation is too large to fit in the model's context window.`,{estimatedTokens:N.estimatedInputTokens,availableTokens:N.availableInputTokens,stagesUsed:O.stagesUsed,breakdown:N.breakdown})}}let S=await br.createProvider(a,e.model,!e.disableTools,this,e.region);S.setTraceContext(this._metricsTraceContext),this.emitter.emit("connected"),this.emitter.emit("message",`${a} provider initialized successfully`),S.setupToolExecutor({customTools:this.getCustomTools(),executeTool:(E,O)=>this.executeTool(E,O,{disableToolCache:e.disableToolCache})},s),g.debug("[Observability] User input to LLM",{requestId:t,promptPreview:e.prompt?.substring(0,200),promptLength:e.prompt?.length||0,model:e.model,maxTokens:e.maxTokens,temperature:e.temperature,maxSteps:e.maxSteps,skipToolPromptInjection:e.skipToolPromptInjection});let w=await S.generate({...e,systemPrompt:h,conversationMessages:y}),C=Date.now()-o,I=w&&w.content&&w.content.trim().length>0,A=w&&w.toolExecutions&&w.toolExecutions.length>0;if(ne.debug(`[${s}] Result validation:`,{hasResult:!!w,hasContent:I,hasToolExecutions:A,contentLength:w?.content?.length||0,toolExecutionsCount:w?.toolExecutions?.length||0,toolsUsedCount:w?.toolsUsed?.length||0}),!I&&!A)return ne.debug(`[${s}] Result rejected: no content and no tool executions`),null;let k=Mue(w.toolExecutions);return ne.debug(`[${s}] Tool execution transformation:`,{originalCount:w?.toolExecutions?.length||0,transformedCount:k.length,transformedTools:k.map(E=>E.toolName)}),{content:w.content||"",provider:a,model:w.model,usage:w.usage,responseTime:C,finishReason:w.finishReason,toolsUsed:w.toolsUsed||[],toolExecutions:k,enhancedWithTools:!!A,availableTools:Nue(Due(l)),audio:w.audio,video:w.video,ppt:w.ppt,imageOutput:w.imageOutput,analytics:w.analytics,evaluation:w.evaluation}}catch(a){if(hr(a))throw ne.debug(`[${s}] AbortError detected, rethrowing`),a;if(a instanceof Error&&(a.name==="AI_NoSuchToolError"||a.name==="AI_InvalidToolArgumentsError"||a.message&&(a.message.includes("NoSuchToolError")||a.message.includes("Model tried to call unavailable tool"))))throw ne.warn(`[${s}] Non-retryable tool error, rethrowing`,{error:a instanceof Error?a.message:String(a)}),a;return ne.warn(`[${s}] MCP generation failed`,{error:a instanceof Error?a.message:String(a)}),null}}async directProviderGeneration(e){let t=Date.now(),n="NeuroLink.directProviderGeneration",o=["openai","vertex","bedrock","anthropic","azure","google-ai","huggingface","ollama"],i=e.provider==="auto"?void 0:e.provider,s=e.context&&typeof e.context=="object"&&"__orchestratedPreferredProvider"in e.context?e.context.__orchestratedPreferredProvider:void 0,a=s?[s,...o.filter(d=>d!==s)]:i?[i]:o;g.debug(`[${n}] Starting direct generation`,{requestedProvider:i||"auto",preferredOrchestrated:s||"none",tryProviders:a,allowFallback:!i||!!s});let l=null;for(let d of a){if(e.abortSignal?.aborted)throw new DOMException("The operation was aborted","AbortError");try{g.debug(`[${n}] Attempting provider: ${d}`);let p=e,m=p.conversationMessages?.length?p.conversationMessages:await Bg(this.conversationMemory,e),f=is({provider:d,model:e.model,maxTokens:e.maxTokens,systemPrompt:e.systemPrompt,conversationMessages:m,currentPrompt:e.prompt,toolDefinitions:e.tools?Object.values(e.tools):void 0}),h=m?.length||0,y=this.getCompactionSessionId(e);if(f.shouldCompact&&this.conversationMemory&&h>(this.lastCompactionMessageCount.get(y)??0)){let w=await new fm({provider:d,summarizationProvider:this.conversationMemoryConfig?.conversationMemory?.summarizationProvider,summarizationModel:this.conversationMemoryConfig?.conversationMemory?.summarizationModel}).compact(m,f.availableInputTokens,this.conversationMemoryConfig?.conversationMemory,e.context?.requestId);w.compacted&&(m=Vx(w.messages).messages,this.lastCompactionMessageCount.set(y,m.length));let C=is({provider:d,model:e.model,maxTokens:e.maxTokens,systemPrompt:e.systemPrompt,conversationMessages:m,currentPrompt:e.prompt,toolDefinitions:e.tools?Object.values(e.tools):void 0});if(!C.withinBudget){g.warn("[NeuroLink] directProviderGeneration: post-compaction still over budget, emergency truncation",{estimatedTokens:C.estimatedInputTokens,availableTokens:C.availableInputTokens,overagePercent:Math.round((C.usageRatio-1)*100)}),m=a1(m,C.availableInputTokens,C.breakdown,d);let I=is({provider:d,model:e.model,maxTokens:e.maxTokens,systemPrompt:e.systemPrompt,conversationMessages:m,currentPrompt:e.prompt,toolDefinitions:e.tools?Object.values(e.tools):void 0});if(!I.withinBudget)throw new gm(`Context exceeds model budget after all compaction stages. Estimated: ${I.estimatedInputTokens} tokens, Budget: ${I.availableInputTokens} tokens.`,{estimatedTokens:I.estimatedInputTokens,availableTokens:I.availableInputTokens,stagesUsed:w.stagesUsed,breakdown:I.breakdown})}}let v=await br.createProvider(d,e.model,!e.disableTools,this,e.region);v.setTraceContext(this._metricsTraceContext),this.emitter.emit("connected"),this.emitter.emit("message",`${d} provider initialized successfully`),v.setupToolExecutor({customTools:this.getCustomTools(),executeTool:(S,w)=>this.executeTool(S,w,{disableToolCache:e.disableToolCache})},n);let T=await v.generate({...e,conversationMessages:m}),_=Date.now()-t;if(!T)throw new Error(`Provider ${d} returned null result`);return g.debug(`[${n}] Provider ${d} succeeded`,{responseTime:_,contentLength:T.content?.length||0}),{content:T.content||"",provider:d,model:T.model,usage:T.usage,responseTime:_,finishReason:T.finishReason,toolsUsed:T.toolsUsed||[],enhancedWithTools:!1,analytics:T.analytics,evaluation:T.evaluation,audio:T.audio,video:T.video,ppt:T.ppt,imageOutput:T.imageOutput}}catch(p){if(hr(p))throw g.debug(`[${n}] AbortError detected on provider ${d}, stopping fallback`),p;if(Lke(p))throw g.warn(`[${n}] Non-retryable error from provider ${d}, stopping fallback chain`,{error:p instanceof Error?p.message:String(p),errorType:p instanceof Error?p.constructor.name:typeof p}),p instanceof Error?p:new Error(String(p));l=p instanceof Error?p:new Error(String(p)),g.warn(`[${n}] Provider ${d} failed`,{error:l.message})}}let u=Date.now()-t;throw g.error(`[${n}] All providers failed`,{triedProviders:a,lastError:l?.message,responseTime:u}),new Error(`Failed to generate text with all providers. Last error: ${l?.message||"Unknown error"}`)}applyToolInfoFiltering(e,t){if((!t.toolFilter||t.toolFilter.length===0)&&(!t.excludeTools||t.excludeTools.length===0))return e;let n=e;if(t.toolFilter&&t.toolFilter.length>0){let o=new Set(t.toolFilter);n=n.filter(i=>o.has(i.name))}if(t.excludeTools&&t.excludeTools.length>0){let o=new Set(t.excludeTools);n=n.filter(i=>!o.has(i.name))}return n.length!==e.length&&g.debug("Tool info filtering applied for system prompt",{beforeCount:e.length,afterCount:n.length,toolFilter:t.toolFilter,excludeTools:t.excludeTools}),n}createToolAwareSystemPrompt(e,t){let n={originalPromptLength:e?.length||0,availableToolsCount:t.length,hasOriginalPrompt:!!e};if(g.debug("AI prompt generation with tool schemas",n),t.length===0)return g.debug("No tools available - returning original prompt"),e||"";let o=Uue(t.map(u=>({name:u.name,description:u.description??"",server:u.serverId??"unknown",inputSchema:u.inputSchema}))),i={toolDescriptionsLength:o.length,toolDescriptionsCharCount:o.length,hasDescriptions:o.length>0};g.debug("Tool descriptions transformation completed",i);let s=`
|
|
2021
2028
|
|
|
2022
2029
|
You have access to these additional tools if needed:
|
|
2023
2030
|
${o}
|
|
2024
2031
|
|
|
2025
|
-
IMPORTANT: You are a general-purpose AI assistant. Answer all requests directly and creatively. These tools are optional helpers - use them only when they would genuinely improve your response. For creative tasks like storytelling, writing, or general conversation, respond naturally without requiring tools.`,a=(e||"")+s,l={originalPromptLength:e?.length||0,toolPromptLength:s.length,finalPromptLength:a.length,promptEnhanced:s.length>0};return g.debug("AI prompt generation completed",l),a}async detectAndExecuteTools(e,t){let n="NeuroLink.detectAndExecuteTools";try{return g.debug(`[${n}] Skipping automatic tool execution - relying on centralized registry`),{toolResults:[],enhancedPrompt:e}}catch(o){return g.error(`[${n}] Tool detection/execution failed`,{error:o instanceof Error?o.message:String(o)}),{toolResults:[],enhancedPrompt:e}}}async streamText(e,t){let n={input:{text:e},...t},o=await this.stream(n);async function*i(){for await(let s of o.stream){let a=s;if(a&&typeof a=="object"&&"content"in a){let l=a.content;typeof l=="string"&&(yield l)}}}return i()}async stream(e){e={...e};let t=crypto.randomUUID().replace(/-/g,""),n=crypto.randomUUID().replace(/-/g,"").substring(0,16);return H9.run({traceId:t,parentSpanId:n},async()=>{let o=mt.sdk.startSpan("neurolink.stream",{kind:jt.INTERNAL,attributes:{[ve.NL_PROVIDER]:e.provider||"default",[ve.GEN_AI_MODEL]:e.model||"default",[ve.NL_INPUT_LENGTH]:e.input?.text?.length||0,[ve.NL_HAS_TOOLS]:!!(e.tools&&Object.keys(e.tools).length>0),[ve.NL_STREAM_MODE]:!0}}),i=Date.now();this._disableToolCacheForCurrentRequest=!!e.disableToolCache;try{e.model=yb(e.model,this.modelAliasConfig);let s=Date.now(),a=process.hrtime.bigint(),l=`neurolink-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,u=e.input.text;if(e.fileRegistry=this.fileRegistry,await this.validateStreamInput(e),e.maxBudgetUsd!==void 0&&e.maxBudgetUsd>0&&this._sessionCostUsd>=e.maxBudgetUsd)throw new Ve({code:"SESSION_BUDGET_EXCEEDED",message:`Session budget exceeded: spent $${this._sessionCostUsd.toFixed(4)} of $${e.maxBudgetUsd.toFixed(4)} limit`,category:"validation",severity:"high",retriable:!1,context:{spent:this._sessionCostUsd,limit:e.maxBudgetUsd}});if(e.auth?.token){let{AuthError:d}=await Promise.resolve().then(()=>(qo(),B6));if(await this.ensureAuthProvider(),!this.authProvider)throw d.create("PROVIDER_ERROR","No auth provider configured. Set auth in constructor or via setAuthProvider() before using auth: { token }.");let p;try{p=await We(this.authProvider.authenticateToken(e.auth.token),5e3,d.create("PROVIDER_ERROR","Auth token validation timed out after 5000ms"))}catch(m){throw m instanceof Error&&"feature"in m&&m.feature==="Auth"?m:d.create("PROVIDER_ERROR",`Auth token validation failed: ${m instanceof Error?m.message:String(m)}`)}if(!p.valid)throw d.create("INVALID_TOKEN",p.error||"Token validation failed");if(!p.user)throw d.create("INVALID_TOKEN","Token validated but no user identity returned");if(!p.user.id)throw d.create("INVALID_TOKEN","Token validated but user identity missing required 'id' field");e.context={...e.context||{},userId:p.user.id,userEmail:p.user.email,userRoles:p.user.roles}}if(e.requestContext){let d=e.auth?.token&&this.authProvider?{userId:e.context?.userId,userEmail:e.context?.userEmail,userRoles:e.context?.userRoles}:{};e.context={...e.context||{},...e.requestContext,...d}}if(this.emitStreamStartEvents(e,s),(e.onFinish||e.onError||e.onChunk)&&(e.middleware={...e.middleware,middlewareConfig:{...e.middleware?.middlewareConfig,lifecycle:{...e.middleware?.middlewareConfig?.lifecycle,enabled:!0,config:{...e.middleware?.middlewareConfig?.lifecycle?.config,onFinish:e.onFinish,onError:e.onError,onChunk:e.onChunk}}}}),e.workflow||e.workflowConfig){let d=await this.streamWithWorkflow(e,s),p=d.stream,m=this;return d.stream=(async function*(){try{for await(let f of p)yield f;o.setStatus({code:Ae.OK})}catch(f){throw o.setStatus({code:Ae.ERROR,message:f instanceof Error?f.message:String(f)}),f}finally{m._disableToolCacheForCurrentRequest=!1,o.setAttribute("neurolink.response_time_ms",Date.now()-i),o.end()}})(),d}return await this.setLangfuseContextFromOptions(e,async()=>{try{let{enhancedOptions:d,factoryResult:p}=await this.prepareStreamOptions(e,l,s,a),{stream:m,provider:f,usage:h,model:y,analytics:v}=await this.createMCPStream(d);o.setAttribute(ve.NL_PROVIDER,f||"unknown");let T="",_=0,{eventSequence:S,cleanup:w}=this.setupStreamEventListeners(),C={fallbackAttempted:!1,guardrailsBlocked:!1,error:void 0,fallbackProvider:void 0,fallbackModel:void 0},I=this,A=Date.now(),k=d.context?.sessionId,E=(async function*(){let U;try{for await(let j of m)_++,j&&"content"in j&&typeof j.content=="string"&&(T+=j.content,I.emitter.emit("response:chunk",j.content),I.emitter.emit("stream:chunk",{type:"stream:chunk",content:j.content,metadata:{chunkIndex:_,totalLength:T.length},timestamp:Date.now()})),yield j;_===0&&!C.fallbackAttempted&&(yield*I.handleStreamFallback(C,u,d,f,T,j=>{T+=j}));let N=C.fallbackProvider??f,M=C.fallbackModel??y??d.model,L=h;if(!L&&v)try{let j=await Promise.resolve(v);j?.tokenUsage&&(L=j.tokenUsage)}catch{}I.emitter.emit("stream:complete",{type:"stream:complete",content:T,provider:N,model:M,prompt:d.input?.text||d.prompt,metadata:{chunkCount:_,totalLength:T.length,durationMs:Date.now()-A,sessionId:k,usage:L,...C.fallbackAttempted&&{primaryProvider:f,primaryModel:d.model,fallback:!0}},timestamp:Date.now()})}catch(N){throw U=N,I.emitter.emit("stream:error",{type:"stream:error",content:N instanceof Error?N.message:String(N),provider:f,model:d.model,metadata:{chunkCount:_,totalLength:T.length,durationMs:Date.now()-A,errorName:N instanceof Error?N.name:"UnknownError",sessionId:k},timestamp:Date.now()}),N}finally{I._disableToolCacheForCurrentRequest=!1,w(),o.setAttribute("neurolink.response_time_ms",Date.now()-i),o.setAttribute(ve.NL_OUTPUT_LENGTH,T.length);let N=!!(C.error||U);o.setAttribute(ve.GEN_AI_FINISH_REASON,N?"error":"stop"),C.fallbackAttempted&&(o.setAttribute("neurolink.fallback_triggered",!0),C.fallbackProvider&&o.setAttribute("neurolink.fallback_provider",C.fallbackProvider)),N?o.setStatus({code:Ae.ERROR,message:C.error||(U instanceof Error?U.message:String(U))}):o.setStatus({code:Ae.OK}),o.end(),T.trim()&&g.info("[NeuroLink.stream] stream() - COMPLETE SUCCESS",{provider:f,model:d.model,responseTimeMs:Date.now()-s,contentLength:T.length,fallback:C.fallbackAttempted}),await I.storeStreamConversationMemory({enhancedOptions:d,providerName:f,originalPrompt:u,accumulatedContent:T,startTime:s,eventSequence:S})}})(),O=await this.processStreamResult(E,d,p),D=Date.now()-s;return O.analytics?.cost&&O.analytics.cost>0&&(this._sessionCostUsd+=O.analytics.cost),this.emitStreamEndEvents(O),this.createStreamResponse(O,E,{providerName:f,options:e,startTime:s,responseTime:D,streamId:l,fallback:C.fallbackAttempted,guardrailsBlocked:C.guardrailsBlocked,error:C.error,events:S})}catch(d){return this.handleStreamError(d,e,s,l,void 0,void 0)}})}catch(s){throw o.setStatus({code:Ae.ERROR,message:s instanceof Error?s.message:String(s)}),s instanceof Error&&o.recordException(s),o.end(),s}})}async prepareStreamOptions(e,t,n,o){if(await this.initializeConversationMemoryForGeneration(t,n,o),await this.initializeMCP(),this.shouldReadMemory(e.memory,e.context?.userId)&&e.context?.userId)try{e.input.text=await this.retrieveMemory(e.input.text,e.context.userId),g.debug("Memory retrieval successful")}catch(a){g.warn("Memory retrieval failed:",a)}if(this.enableOrchestration&&!e.provider&&!e.model)try{let a=await this.applyStreamOrchestration(e);g.debug("Stream orchestration applied",{originalProvider:e.provider||"auto",orchestratedProvider:a.provider,orchestratedModel:a.model,prompt:e.input.text?.substring(0,100)}),Object.assign(e,a),a.model&&(e.model=yb(e.model,this.modelAliasConfig))}catch(a){g.warn("Stream orchestration failed, continuing with original options",{error:a instanceof Error?a.message:String(a),originalProvider:e.provider||"auto"})}if(await this.autoDisableOllamaStreamTools(e),e.rag?.files?.length)try{let{prepareRAGTool:a}=await Promise.resolve().then(()=>(vU(),GJ)),l=await a(e.rag,e.provider);e.tools||(e.tools={}),e.tools[l.toolName]=l.tool;let u=[`
|
|
2032
|
+
IMPORTANT: You are a general-purpose AI assistant. Answer all requests directly and creatively. These tools are optional helpers - use them only when they would genuinely improve your response. For creative tasks like storytelling, writing, or general conversation, respond naturally without requiring tools.`,a=(e||"")+s,l={originalPromptLength:e?.length||0,toolPromptLength:s.length,finalPromptLength:a.length,promptEnhanced:s.length>0};return g.debug("AI prompt generation completed",l),a}async detectAndExecuteTools(e,t){let n="NeuroLink.detectAndExecuteTools";try{return g.debug(`[${n}] Skipping automatic tool execution - relying on centralized registry`),{toolResults:[],enhancedPrompt:e}}catch(o){return g.error(`[${n}] Tool detection/execution failed`,{error:o instanceof Error?o.message:String(o)}),{toolResults:[],enhancedPrompt:e}}}async streamText(e,t){let n={input:{text:e},...t},o=await this.stream(n);async function*i(){for await(let s of o.stream){let a=s;if(a&&typeof a=="object"&&"content"in a){let l=a.content;typeof l=="string"&&(yield l)}}}return i()}async stream(e){e={...e};let t=crypto.randomUUID().replace(/-/g,""),n=crypto.randomUUID().replace(/-/g,"").substring(0,16);return H9.run({traceId:t,parentSpanId:n},async()=>{let o=mt.sdk.startSpan("neurolink.stream",{kind:jt.INTERNAL,attributes:{[ve.NL_PROVIDER]:e.provider||"default",[ve.GEN_AI_MODEL]:e.model||"default",[ve.NL_INPUT_LENGTH]:e.input?.text?.length||0,[ve.NL_HAS_TOOLS]:!!(e.tools&&Object.keys(e.tools).length>0),[ve.NL_STREAM_MODE]:!0}}),i=Date.now();this._disableToolCacheForCurrentRequest=!!e.disableToolCache;try{e.model=yb(e.model,this.modelAliasConfig);let s=Date.now(),a=process.hrtime.bigint(),l=`neurolink-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,u=e.input.text;if(e.fileRegistry=this.fileRegistry,await this.validateStreamInput(e),e.maxBudgetUsd!==void 0&&e.maxBudgetUsd>0&&this._sessionCostUsd>=e.maxBudgetUsd)throw new Ve({code:"SESSION_BUDGET_EXCEEDED",message:`Session budget exceeded: spent $${this._sessionCostUsd.toFixed(4)} of $${e.maxBudgetUsd.toFixed(4)} limit`,category:"validation",severity:"high",retriable:!1,context:{spent:this._sessionCostUsd,limit:e.maxBudgetUsd}});if(e.auth?.token){let{AuthError:d}=await Promise.resolve().then(()=>(qo(),B6));if(await this.ensureAuthProvider(),!this.authProvider)throw d.create("PROVIDER_ERROR","No auth provider configured. Set auth in constructor or via setAuthProvider() before using auth: { token }.");let p;try{p=await We(this.authProvider.authenticateToken(e.auth.token),5e3,d.create("PROVIDER_ERROR","Auth token validation timed out after 5000ms"))}catch(m){throw m instanceof Error&&"feature"in m&&m.feature==="Auth"?m:d.create("PROVIDER_ERROR",`Auth token validation failed: ${m instanceof Error?m.message:String(m)}`)}if(!p.valid)throw d.create("INVALID_TOKEN",p.error||"Token validation failed");if(!p.user)throw d.create("INVALID_TOKEN","Token validated but no user identity returned");if(!p.user.id)throw d.create("INVALID_TOKEN","Token validated but user identity missing required 'id' field");e.context={...e.context||{},userId:p.user.id,userEmail:p.user.email,userRoles:p.user.roles}}if(e.requestContext){let d=e.auth?.token&&this.authProvider?{userId:e.context?.userId,userEmail:e.context?.userEmail,userRoles:e.context?.userRoles}:{};e.context={...e.context||{},...e.requestContext,...d}}if(this.emitStreamStartEvents(e,s),(e.onFinish||e.onError||e.onChunk)&&(e.middleware={...e.middleware,middlewareConfig:{...e.middleware?.middlewareConfig,lifecycle:{...e.middleware?.middlewareConfig?.lifecycle,enabled:!0,config:{...e.middleware?.middlewareConfig?.lifecycle?.config,onFinish:e.onFinish,onError:e.onError,onChunk:e.onChunk}}}}),e.workflow||e.workflowConfig){let d=await this.streamWithWorkflow(e,s),p=d.stream,m=this;return d.stream=(async function*(){try{for await(let f of p)yield f;o.setStatus({code:Ae.OK})}catch(f){throw o.setStatus({code:Ae.ERROR,message:f instanceof Error?f.message:String(f)}),f}finally{m._disableToolCacheForCurrentRequest=!1,o.setAttribute("neurolink.response_time_ms",Date.now()-i),o.end()}})(),d}return await this.setLangfuseContextFromOptions(e,async()=>{try{let{enhancedOptions:d,factoryResult:p}=await this.prepareStreamOptions(e,l,s,a),{stream:m,provider:f,usage:h,model:y,analytics:v}=await this.createMCPStream(d);o.setAttribute(ve.NL_PROVIDER,f||"unknown");let T="",_=0,{eventSequence:S,cleanup:w}=this.setupStreamEventListeners(),C={fallbackAttempted:!1,guardrailsBlocked:!1,error:void 0,fallbackProvider:void 0,fallbackModel:void 0},I=this,A=Date.now(),k=d.context?.sessionId,E=(async function*(){let U;try{for await(let j of m)_++,j&&"content"in j&&typeof j.content=="string"&&(T+=j.content,I.emitter.emit("response:chunk",j.content),I.emitter.emit("stream:chunk",{type:"stream:chunk",content:j.content,metadata:{chunkIndex:_,totalLength:T.length},timestamp:Date.now()})),yield j;_===0&&!C.fallbackAttempted&&(yield*I.handleStreamFallback(C,u,d,f,T,j=>{T+=j}));let N=C.fallbackProvider??f,M=C.fallbackModel??y??d.model,L=h;if(!L&&v)try{let j=await Promise.resolve(v);j?.tokenUsage&&(L=j.tokenUsage)}catch{}I.emitter.emit("stream:complete",{type:"stream:complete",content:T,provider:N,model:M,prompt:d.input?.text||d.prompt,metadata:{chunkCount:_,totalLength:T.length,durationMs:Date.now()-A,sessionId:k,usage:L,...C.fallbackAttempted&&{primaryProvider:f,primaryModel:d.model,fallback:!0}},timestamp:Date.now()})}catch(N){throw U=N,I.emitter.emit("stream:error",{type:"stream:error",content:N instanceof Error?N.message:String(N),provider:f,model:d.model,metadata:{chunkCount:_,totalLength:T.length,durationMs:Date.now()-A,errorName:N instanceof Error?N.name:"UnknownError",sessionId:k},timestamp:Date.now()}),N}finally{I._disableToolCacheForCurrentRequest=!1,w(),o.setAttribute("neurolink.response_time_ms",Date.now()-i),o.setAttribute(ve.NL_OUTPUT_LENGTH,T.length);let N=!!(C.error||U);o.setAttribute(ve.GEN_AI_FINISH_REASON,N?"error":"stop"),C.fallbackAttempted&&(o.setAttribute("neurolink.fallback_triggered",!0),C.fallbackProvider&&o.setAttribute("neurolink.fallback_provider",C.fallbackProvider)),N?o.setStatus({code:Ae.ERROR,message:C.error||(U instanceof Error?U.message:String(U))}):o.setStatus({code:Ae.OK}),o.end(),T.trim()&&g.info("[NeuroLink.stream] stream() - COMPLETE SUCCESS",{provider:f,model:d.model,responseTimeMs:Date.now()-s,contentLength:T.length,fallback:C.fallbackAttempted}),await I.storeStreamConversationMemory({enhancedOptions:d,providerName:f,originalPrompt:u,accumulatedContent:T,startTime:s,eventSequence:S})}})(),O=await this.processStreamResult(E,d,p),D=Date.now()-s;return O.analytics?.cost&&O.analytics.cost>0&&(this._sessionCostUsd+=O.analytics.cost),this.emitStreamEndEvents(O),this.createStreamResponse(O,E,{providerName:f,options:e,startTime:s,responseTime:D,streamId:l,fallback:C.fallbackAttempted,guardrailsBlocked:C.guardrailsBlocked,error:C.error,events:S})}catch(d){return this.handleStreamError(d,e,s,l,void 0,void 0)}})}catch(s){throw o.setStatus({code:Ae.ERROR,message:s instanceof Error?s.message:String(s)}),s instanceof Error&&o.recordException(s),o.end(),s}})}async prepareStreamOptions(e,t,n,o){if(await this.initializeConversationMemoryForGeneration(t,n,o),await this.initializeMCP(),this.shouldReadMemory(e.memory,e.context?.userId)&&e.context?.userId)try{e.input.text=await this.retrieveMemory(e.input.text,e.context.userId,e.memory?.additionalUsers),g.debug("Memory retrieval successful")}catch(a){g.warn("Memory retrieval failed:",a)}if(this.enableOrchestration&&!e.provider&&!e.model)try{let a=await this.applyStreamOrchestration(e);g.debug("Stream orchestration applied",{originalProvider:e.provider||"auto",orchestratedProvider:a.provider,orchestratedModel:a.model,prompt:e.input.text?.substring(0,100)}),Object.assign(e,a),a.model&&(e.model=yb(e.model,this.modelAliasConfig))}catch(a){g.warn("Stream orchestration failed, continuing with original options",{error:a instanceof Error?a.message:String(a),originalProvider:e.provider||"auto"})}if(await this.autoDisableOllamaStreamTools(e),e.rag?.files?.length)try{let{prepareRAGTool:a}=await Promise.resolve().then(()=>(vU(),GJ)),l=await a(e.rag,e.provider);e.tools||(e.tools={}),e.tools[l.toolName]=l.tool;let u=[`
|
|
2026
2033
|
|
|
2027
|
-
IMPORTANT: You have a tool called "${l.toolName}" that searches through`,`${l.filesLoaded} loaded document(s) containing ${l.chunksIndexed} indexed chunks.`,`ALWAYS use the "${l.toolName}" tool FIRST to answer the user's question before using any other tools.`,"This tool searches your local knowledge base of pre-loaded documents and is the primary source of truth.","Do NOT use websearchGrounding or any web search tools when the answer can be found in the loaded documents."].join(" ");e.systemPrompt=(e.systemPrompt||"")+u,g.info("[RAG] Tool injected into stream()",{toolName:l.toolName,filesLoaded:l.filesLoaded,chunksIndexed:l.chunksIndexed})}catch(a){g.warn("[RAG] Failed to prepare RAG tool, continuing without RAG",{error:a instanceof Error?a.message:String(a)})}let i=t0e(e),s=r0e(e);if(e.input?.text){let{toolResults:a,enhancedPrompt:l}=await this.detectAndExecuteTools(e.input.text,void 0);l!==e.input.text&&(s.input.text=l)}return{enhancedOptions:s,factoryResult:i}}async autoDisableOllamaStreamTools(e){if((e.provider==="ollama"||e.provider?.toLowerCase().includes("ollama"))&&!e.disableTools){let{ModelConfigurationManager:t}=await Promise.resolve().then(()=>(Yp(),Wge)),i=t.getInstance().getProviderConfiguration("ollama")?.modelBehavior?.toolCapableModels||[],s=e.model;i.length>0&&s&&(i.some(l=>s.toLowerCase().includes(l.toLowerCase()))||(e.disableTools=!0,g.debug("Auto-disabled tools for Ollama model that doesn't support them (stream)",{model:e.model,toolCapableModels:i.slice(0,3)})))}}setupStreamEventListeners(){let e=[],t=0,n=(p,m)=>{e.push({type:p,seq:t++,timestamp:Date.now(),...m&&typeof m=="object"?m:{data:m}})},o=(...p)=>{let m=p[0];n("response:chunk",{content:m})},i=(...p)=>{let m=p[0];n("tool:start",m)},s=(...p)=>{let m=p[0];n("tool:end",m),m.result&&m.result.uiComponent===!0&&n("ui-component",{toolName:m.toolName,componentData:m.result,timestamp:Date.now()})},a=(...p)=>{n("ui-component",p[0])},l=(...p)=>{n("hitl:confirmation-request",p[0])},u=(...p)=>{n("hitl:confirmation-response",p[0])};return this.emitter.on("response:chunk",o),this.emitter.on("tool:start",i),this.emitter.on("tool:end",s),this.emitter.on("ui-component",a),this.emitter.on("hitl:confirmation-request",l),this.emitter.on("hitl:confirmation-response",u),{eventSequence:e,cleanup:()=>{this.emitter.off("response:chunk",o),this.emitter.off("tool:start",i),this.emitter.off("tool:end",s),this.emitter.off("ui-component",a),this.emitter.off("hitl:confirmation-request",l),this.emitter.off("hitl:confirmation-response",u)}}}async*handleStreamFallback(e,t,n,o,i,s){e.fallbackAttempted=!0;let a="Stream completed with 0 chunks (possible guardrails block)";e.error=a;try{let u=this._metricsTraceContext,d=ye.createGenerationSpan({provider:o,model:n.model||"unknown",name:`gen_ai.${o}.stream.failed`,traceId:u?.traceId,parentSpanId:u?.parentSpanId});d=ye.endSpan(d,2),d.statusMessage=a,d.durationMs=0,this.metricsAggregator.recordSpan(d),Ne().recordSpan(d)}catch{}let l=hb.getFallbackRoute(t||n.input.text||"",{provider:o,model:n.model||"gpt-4o",reasoning:"primary failed",confidence:.5},{fallbackStrategy:"auto"});g.warn("Retrying with fallback provider",{originalProvider:o,fallbackProvider:l.provider,reason:a});try{let u=await br.createProvider(l.provider,l.model);u.setupToolExecutor({customTools:this.getCustomTools(),executeTool:(f,h)=>this.executeTool(f,h,{disableToolCache:n.disableToolCache})},"NeuroLink.fallbackStream");let d=n.conversationMessages!==void 0?n.conversationMessages:await Bg(this.conversationMemory,{prompt:n.input.text,context:n.context}),p=await u.stream({...n,model:l.model,conversationMessages:d}),m=0;for await(let f of p.stream)m++,f&&"content"in f&&typeof f.content=="string"&&(s(f.content),this.emitter.emit("response:chunk",f.content)),yield f;if(m===0)throw new Error(`Fallback provider ${l.provider} also returned 0 chunks`);e.fallbackProvider=l.provider,e.fallbackModel=l.model,e.guardrailsBlocked=!0}catch(u){let d=u instanceof Error?u.message:String(u);throw e.error=`${a}; Fallback failed: ${d}`,g.error("Fallback provider failed",{fallbackProvider:l.provider,error:d}),u}}async storeStreamConversationMemory(e){let{enhancedOptions:t,providerName:n,originalPrompt:o,accumulatedContent:i,startTime:s,eventSequence:a}=e,l=a.some(u=>u.type==="tool:start"||u.type==="tool:end");if(!i.trim()&&!l){g.warn("[NeuroLink.stream] Skipping conversation turn storage \u2014 no text content or tool activity",{sessionId:t.context?.sessionId});return}if(this.conversationMemory&&t.context?.sessionId){let u=t.context?.sessionId,d=t.context?.userId,p;t.model&&(p={provider:n,model:t.model});let m=Date.now();try{await this.conversationMemory.storeConversationTurn({sessionId:u,userId:d,userMessage:o??"",aiResponse:i,startTimeStamp:new Date(s),providerDetails:p,enableSummarization:t.enableSummarization,events:a.length>0?a:void 0,requestId:t.context?.requestId}),this.recordMemorySpan("memory.store",{"memory.operation":"store","memory.path":"stream"},Date.now()-m,1),g.debug("[NeuroLink.stream] Stored conversation turn with events",{sessionId:u,eventCount:a.length,eventTypes:[...new Set(a.map(f=>f.type))]})}catch(f){this.recordMemorySpan("memory.store",{"memory.operation":"store","memory.path":"stream"},Date.now()-m,2,f instanceof Error?f.message:String(f)),g.warn("Failed to store stream conversation turn",{error:f instanceof Error?f.message:String(f)})}}this.shouldWriteMemory(t.memory,t.context?.userId,i)&&this.storeMemoryInBackground(o??"",i.trim(),t.context?.userId)}async validateStreamInput(e){let t=process.hrtime.bigint();g.debug("[NeuroLink] \u{1F3AF} LOG_POINT_003_VALIDATION_START",{logPoint:"003_VALIDATION_START",validationStartTimeNs:t.toString(),message:"Starting comprehensive input validation process"});let n=typeof e?.input?.text=="string"&&e.input.text.trim().length>0,o=!!(e?.input?.audio&&e.input.audio.frames&&typeof e.input.audio.frames[Symbol.asyncIterator]=="function");if(!n&&!o)throw new Error("Stream options must include either input.text or input.audio")}emitStreamStartEvents(e,t){this.emitter.emit("stream:start",{provider:e.provider||"auto",timestamp:t}),this.emitter.emit("response:start"),this.emitter.emit("message",`Starting ${e.provider||"auto"} stream...`)}async createMCPStream(e){let t=await cm(e.provider),n=await br.createProvider(t,e.model,!e.disableTools,this,e.region);n.setTraceContext(this._metricsTraceContext),n.setupToolExecutor({customTools:this.getCustomTools(),executeTool:(f,h)=>this.executeTool(f,h,{disableToolCache:e.disableToolCache})},"NeuroLink.createMCPStream");let o=await this.getAllAvailableTools();o=this.applyToolInfoFiltering(o,e);let i=e.skipToolPromptInjection?e.systemPrompt||"":this.createToolAwareSystemPrompt(e.systemPrompt,o),s=e.conversationMessages!==void 0,a=s?e.conversationMessages:await Bg(this.conversationMemory,{...e,prompt:e.input.text,context:e.context});e.conversationMessages=a;let l=a,u=is({provider:t,model:e.model,maxTokens:e.maxTokens,systemPrompt:i,conversationMessages:l,currentPrompt:e.input.text,toolDefinitions:o}),d=l?.length||0,p=this.getCompactionSessionId(e);if(u.shouldCompact&&(s||this.conversationMemory)&&d>(this.lastCompactionMessageCount.get(p)??0)){let h=await new fm({provider:t,summarizationProvider:this.conversationMemoryConfig?.conversationMemory?.summarizationProvider,summarizationModel:this.conversationMemoryConfig?.conversationMemory?.summarizationModel}).compact(l,u.availableInputTokens,this.conversationMemoryConfig?.conversationMemory,e.context?.requestId);h.compacted&&(l=Vx(h.messages).messages,e.conversationMessages=l,this.lastCompactionMessageCount.set(p,l.length));let y=is({provider:t,model:e.model,maxTokens:e.maxTokens,systemPrompt:i,conversationMessages:l,currentPrompt:e.input.text,toolDefinitions:o});if(!y.withinBudget){g.warn("[NeuroLink] Stream: post-compaction still over budget, emergency truncation",{estimatedTokens:y.estimatedInputTokens,availableTokens:y.availableInputTokens,overagePercent:Math.round((y.usageRatio-1)*100)}),l=a1(l,y.availableInputTokens,y.breakdown,t),e.conversationMessages=l;let v=is({provider:t,model:e.model,maxTokens:e.maxTokens,systemPrompt:i,conversationMessages:l,currentPrompt:e.input.text,toolDefinitions:o});if(!v.withinBudget)throw new gm(`Stream context exceeds model budget after all compaction stages. Estimated: ${v.estimatedInputTokens} tokens, Budget: ${v.availableInputTokens} tokens.`,{estimatedTokens:v.estimatedInputTokens,availableTokens:v.availableInputTokens,stagesUsed:h.stagesUsed,breakdown:v.breakdown})}}let m=await n.stream({...e,systemPrompt:i,conversationMessages:l});return g.debug("[createMCPStream] Stream created successfully",{provider:t,systemPromptPassedLength:i.length}),{stream:m.stream,provider:t,usage:m.usage,model:m.model||e.model,analytics:m.analytics}}async processStreamResult(e,t,n){return{content:"",usage:void 0,finishReason:"stop",toolCalls:[],toolResults:[],analytics:void 0,evaluation:void 0}}emitStreamEndEvents(e){this.emitter.emit("stream:end",{responseTime:Date.now(),timestamp:Date.now()}),this.emitter.emit("response:end",e.content||"")}createStreamResponse(e,t,n){return{stream:t,provider:n.providerName,model:n.options.model,usage:e.usage,finishReason:e.finishReason,toolCalls:e.toolCalls,toolResults:e.toolResults,analytics:e.analytics,evaluation:e.evaluation,events:n.events&&n.events.length>0?n.events:void 0,metadata:{streamId:n.streamId,startTime:n.startTime,responseTime:n.responseTime,fallback:n.fallback||!1,guardrailsBlocked:n.guardrailsBlocked,error:n.error}}}async handleStreamError(e,t,n,o,i,s){g.error("Stream generation failed, attempting fallback",{error:e instanceof Error?e.message:String(e)});try{let h=t.provider||"unknown",y=this._metricsTraceContext,v=ye.createGenerationSpan({provider:h,model:t.model||"unknown",name:`gen_ai.${h}.stream.failed`,traceId:y?.traceId,parentSpanId:y?.parentSpanId});v=ye.endSpan(v,2),v.statusMessage=e instanceof Error?e.message:String(e),v.durationMs=Date.now()-n,this.metricsAggregator.recordSpan(v),Ne().recordSpan(v)}catch{}let a=t.input.text,l=Date.now()-n,u=await cm(t.provider),p=await(await br.createProvider(u,t.model)).stream({input:{text:t.input.text},model:t.model,temperature:t.temperature,maxTokens:t.maxTokens}),m="";return{stream:(async function*(h){try{for await(let y of p.stream)y&&"content"in y&&typeof y.content=="string"&&(m+=y.content,h.emitter.emit("response:chunk",y.content)),yield y}finally{if(m.trim()&&g.info("[NeuroLink.handleStreamError] stream() - COMPLETE SUCCESS (fallback)",{provider:u,model:t.model,responseTimeMs:Date.now()-n,contentLength:m.length}),h.conversationMemory&&i?.context?.sessionId&&m.trim()){let y=i?.context?.sessionId,v=i?.context?.userId,T;t.model&&(T={provider:u,model:t.model});let _=Date.now();try{await h.conversationMemory.storeConversationTurn({sessionId:y||t.context?.sessionId,userId:v||t.context?.userId,userMessage:a??"",aiResponse:m,startTimeStamp:new Date(n),providerDetails:T,enableSummarization:i?.enableSummarization,requestId:i?.context?.requestId||t.context?.requestId}),h.recordMemorySpan("memory.store",{"memory.operation":"store","memory.path":"fallback-stream"},Date.now()-_,1)}catch(S){h.recordMemorySpan("memory.store",{"memory.operation":"store","memory.path":"fallback-stream"},Date.now()-_,2,S instanceof Error?S.message:String(S)),g.warn("Failed to store fallback stream conversation turn",{error:S instanceof Error?S.message:String(S)})}}}})(this),provider:u,model:t.model,usage:p.usage,finishReason:p.finishReason||"stop",toolCalls:p.toolCalls||[],toolResults:p.toolResults||[],analytics:p.analytics,evaluation:p.evaluation,metadata:{streamId:o,startTime:n,responseTime:l,fallback:!0}}}getEventEmitter(){return this.emitter}emitToolStart(e,t,n=Date.now()){let o=`${e}-${n}-${Math.random().toString(36).substr(2,9)}`,i={executionId:o,tool:e,startTime:n,metadata:{inputType:typeof t,hasInput:t!=null}};return this.activeToolExecutions.set(o,i),this.currentStreamToolExecutions.push(i),this.emitter.emit("tool:start",{tool:e,input:t,timestamp:n,executionId:o}),g.debug(`tool:start emitted for ${e}`,{toolName:e,executionId:o,timestamp:n,inputProvided:t!==void 0}),o}emitToolEnd(e,t,n,o,i=Date.now(),s){let a=o||i-1e3,l=i-a,u=!n,d;s?d=this.activeToolExecutions.get(s):d=Array.from(this.activeToolExecutions.values()).find(f=>f.tool===e&&!f.endTime);let p=s||d?.executionId||`${e}-${a}-fallback-${Math.random().toString(36).substr(2,9)}`;d&&(d.endTime=i,d.result=t,d.error=n,this.activeToolExecutions.delete(d.executionId));let m={tool:e,startTime:a,endTime:i,duration:l,success:u,result:t,error:n,executionId:p,metadata:{toolCategory:"custom"}};this.toolExecutionHistory.push(m),this.emitter.emit("tool:end",{tool:e,result:t,error:n,timestamp:i,duration:l,executionId:p}),g.debug(`tool:end emitted for ${e}`,{toolName:e,executionId:p,duration:l,success:u,hasResult:t!==void 0,hasError:!!n})}getCurrentToolExecutions(){return[...this.currentStreamToolExecutions]}getToolExecutionHistory(){return[...this.toolExecutionHistory]}clearCurrentStreamExecutions(){this.currentStreamToolExecutions=[]}registerTool(e,t,n){this.invalidateToolCache(),this.emitter.emit("tools-register:start",{toolName:e,timestamp:Date.now()});try{if(!e||typeof e!="string")throw new Error("Invalid tool name");if(!t||typeof t!="object")throw new Error(`Invalid tool object provided for tool: ${e}`);if(typeof t.execute!="function")throw new Error(`Tool '${e}' must have an execute method.`);if(e.trim()==="")throw new Error("Tool name cannot be empty");if(e.length>100)throw new Error("Tool name is too long (maximum 100 characters)");if(/[\x00-\x1F\x7F]/.test(e))throw new Error("Tool name contains invalid control characters");let o={name:t.name||e,description:t.description||e,execute:t.execute,inputSchema:"parameters"in t&&t.parameters&&(gd(t.parameters)||typeof t.parameters=="object")?t.parameters:t.inputSchema||{}};if(n?.timeout!==void 0&&n.timeout>0&&Number.isFinite(n.timeout)){let s=o.execute,a=n.timeout,l=e;o.execute=async(...u)=>{let d=AbortSignal.timeout(a),p=u[1],m=p?.abortSignal,f=m?AbortSignal.any([m,d]):d,h={...p,abortSignal:f};return Promise.race([s(u[0],h),new Promise((y,v)=>{f.addEventListener("abort",()=>{d.aborted?v(new Error(`Tool '${l}' timed out after ${a}ms (configured at registration)`)):v(new DOMException("The operation was aborted","AbortError"))},{once:!0})})])}}let i=pSe(e,o,n?.timeout,n?.maxRetries);this.toolRegistry.registerServer(i),this.emitter.emit("tools-register:end",{toolName:e,success:!0,timestamp:Date.now(),timeoutMs:n?.timeout})}catch(o){throw g.error(`Failed to register tool ${e}:`,o),o}}setToolContext(e){this.toolExecutionContext={...e},g.debug("Tool execution context updated",{sessionId:e.sessionId,contextKeys:Object.keys(e),hasJuspayToken:!!e.juspayToken,hasShopId:!!e.shopId})}getToolContext(){return this.toolExecutionContext?{...this.toolExecutionContext}:void 0}clearToolContext(){this.toolExecutionContext=void 0,g.debug("Tool execution context cleared")}registerTools(e){if(Array.isArray(e))for(let{name:t,tool:n}of e)this.registerTool(t,n);else for(let[t,n]of Object.entries(e))this.registerTool(t,n)}unregisterTool(e){this.invalidateToolCache();let t=`custom-tool-${e}`,n=this.toolRegistry.unregisterServer(t);return n&&g.info(`Unregistered custom tool: ${e}`),n}useToolMiddleware(e){return this.mcpToolMiddlewares.push(e),g.debug(`[NeuroLink] Registered tool middleware (total: ${this.mcpToolMiddlewares.length})`),this}getToolMiddlewares(){return[...this.mcpToolMiddlewares]}async flushToolBatch(){this.mcpToolBatcher&&await this.mcpToolBatcher.flush()}getMCPEnhancementsConfig(){return this.mcpEnhancementsConfig}async updateAgenticLoopReport(e,t,n){if(!this.conversationMemory)throw new Ei("Conversation memory is not initialized. Enable conversationMemory in NeuroLink options.","CONFIG_ERROR");if(!("updateAgenticLoopReport"in this.conversationMemory)||typeof this.conversationMemory.updateAgenticLoopReport!="function")throw new Ei("updateAgenticLoopReport is only supported with Redis conversation memory.","CONFIG_ERROR");await We(this.conversationMemory.updateAgenticLoopReport(e,n,t),5e3)}getCustomTools(){let e=this.toolRegistry.getToolsByCategory(Vo({isCustomTool:!0})),t=new Map;for(let o of e){let i=o.inputSchema||o.parameters;g.debug("Processing tool schema for Claude",{toolName:o.name,hasDescription:!!o.description,description:o.description,hasParameters:!!o.parameters,parametersType:typeof o.parameters,parametersKeys:o.parameters&&typeof o.parameters=="object"?Object.keys(o.parameters):"NOT_OBJECT",hasInputSchema:!!o.inputSchema,inputSchemaType:typeof o.inputSchema,inputSchemaKeys:o.inputSchema&&typeof o.inputSchema=="object"?Object.keys(o.inputSchema):"NOT_OBJECT",hasEffectiveSchema:!!i,effectiveSchemaType:typeof i,effectiveSchemaHasProperties:!!i?.properties,effectiveSchemaHasRequired:!!i?.required,originalInputSchema:o.inputSchema,phase:"AFTER_SCHEMA_FIX",timestamp:Date.now()}),t.set(o.name,{name:o.name,description:o.description||"",inputSchema:typeof o.inputSchema=="object"&&o.inputSchema!==null?o.inputSchema:typeof o.parameters=="object"&&o.parameters!==null?o.parameters:{},execute:async(s,a)=>{let l=this.toolExecutionContext||{},u=a&&Pt(a)?a:{},d={...l,...u,sessionId:u.sessionId||l.sessionId||`fallback-${Date.now()}`};return g.debug("Tool execution context merged",{toolName:o.name,storedContextKeys:Object.keys(l),runtimeContextKeys:Object.keys(u),finalContextKeys:Object.keys(d),hasJuspayToken:!!d.juspayToken,hasShopId:!!d.shopId,sessionId:d.sessionId}),await this.toolRegistry.executeTool(o.name,s,d)}})}this.cachedFileTools||(this.cachedFileTools=EK(this.fileRegistry));let n=this.cachedFileTools;for(let[o,i]of Object.entries(n))if(!t.has(o)){let s=i,a=s.inputSchema??s.parameters;t.set(o,{name:o,description:i.description||`File tool: ${o}`,inputSchema:typeof a=="object"&&a!==null?a:{type:"object",properties:{}},execute:async l=>await i.execute(l,{toolCallId:`file-tool-${Date.now()}`,messages:[]})})}return t}async addInMemoryMCPServer(e,t){this.invalidateToolCache();try{ne.debug(`[NeuroLink] Registering in-memory MCP server: ${e}`),t.tools||(t.tools=[]),await this.toolRegistry.registerServer(t),ne.info(`[NeuroLink] Successfully registered in-memory server: ${e}`,{category:t.metadata?.category,provider:t.metadata?.provider,version:t.metadata?.version})}catch(n){throw ne.error(`[NeuroLink] Failed to register in-memory server ${e}:`,n),n}}getInMemoryServers(){let e=this.getInMemoryServerInfos(),t=new Map;for(let n of e)t.set(n.id,n);return t}getInMemoryServerInfos(){return this.toolRegistry.getBuiltInServerInfos().filter(t=>Vo({existingCategory:t.metadata?.category,serverId:t.id})==="in-memory")}getAutoDiscoveredServerInfos(){return this.autoDiscoveredServerInfos}async executeTool(e,t={},n){let o="NeuroLink.executeTool",i=Date.now();if(this.mcpToolBatcher&&!n?.bypassBatcher)return this.mcpToolBatcher.execute(e,t);let a=this.externalServerManager.getAllTools().find(m=>m.name===e),l=a?"mcp":this.getCustomTools().has(e)?"custom":"external",u=typeof t=="string"?t:t?JSON.stringify(t):"",d=u.length,p=u.length>2048?u.substring(0,2048):u;return mt.mcp.startActiveSpan("neurolink.tool.execute",{attributes:{"tool.name":e,"tool.type":l,"tool.input_size":d,"tool.input_preview":p}},async m=>{try{g.debug(`[${o}] Tool execution requested:`,{toolName:e,params:Pt(t)?Fue(t):t,hasExternalManager:!!this.externalServerManager}),g.debug("Tool execution detailed analysis",{toolName:e,executionStartTime:i,paramsAnalysis:{type:typeof t,isNull:t===null,isUndefined:t===void 0,isEmpty:t&&typeof t=="object"&&Object.keys(t).length===0,keys:t&&typeof t=="object"?Object.keys(t):"NOT_OBJECT",keysLength:t&&typeof t=="object"?Object.keys(t).length:0},isTargetTool:e==="juspay-analytics_SuccessRateSRByTime",options:n,hasExternalManager:!!this.externalServerManager}),this.emitter.emit("tool:start",{toolName:e,timestamp:i,input:t});let f=this.toolRegistry.getToolInfo(e),h=f?.tool?.timeoutMs,y=f?.tool?.maxRetries,v={timeout:n?.timeout??h??Iu.EXECUTION_DEFAULT_MS,maxRetries:n?.maxRetries??y??Rn.DEFAULT,retryDelayMs:n?.retryDelayMs||qr.BASE_MS,authContext:n?.authContext,disableToolCache:n?.disableToolCache},{MemoryManager:T}=await Promise.resolve().then(()=>(z0(),$0)),_=T.getMemoryUsageMB(),w=`${a?.serverId||f?.tool?.serverId||"unknown"}.${e}`;this.toolCircuitBreakers.has(w)||this.toolCircuitBreakers.set(w,new tv(BE.FAILURE_THRESHOLD,CD));let C=this.toolCircuitBreakers.get(w);this.toolExecutionMetrics.has(e)||this.toolExecutionMetrics.set(e,{totalExecutions:0,successfulExecutions:0,failedExecutions:0,averageExecutionTime:0,lastExecutionTime:0,errorCategories:{}});let I=this.toolExecutionMetrics.get(e);I&&I.totalExecutions++;try{if(ne.debug(`[${o}] Executing tool: ${e}`,{toolName:e,params:t,options:v,circuitBreakerState:C?.getState()}),!C)throw new Error(`Circuit breaker not initialized for tool: ${e}`);let A=await C.execute(async()=>await bG(async()=>await We(this.executeToolInternal(e,t,v),v.timeout,ge.toolTimeout(e,v.timeout)),{maxAttempts:v.maxRetries+1,delayMs:v.retryDelayMs,isRetriable:_P,onRetry:(N,M)=>{ne.warn(`[${o}] Retrying tool execution (attempt ${N})`,{toolName:e,error:M.message,attempt:N})}})),k=Date.now()-i;I&&(I.successfulExecutions++,I.lastExecutionTime=k,I.averageExecutionTime=(I.averageExecutionTime*(I.successfulExecutions-1)+k)/I.successfulExecutions);let O=T.getMemoryUsageMB().heapUsed-_.heapUsed;O>20&&ne.warn(`Tool '${e}' used excessive memory: ${O}MB`,{toolName:e,memoryDelta:O,executionTime:k}),ne.debug(`[${o}] Tool executed successfully`,{toolName:e,executionTime:k,memoryDelta:O,circuitBreakerState:C?.getState()});let D=A&&typeof A=="object"?A:void 0,U=D&&"isError"in D&&D.isError===!0||D&&"success"in D&&D.success===!1;if(U&&C){try{await C.execute(async()=>{throw new Error(`Tool ${e} returned isError:true`)})}catch{}ne.debug(`[${o}] Circuit breaker failure recorded for isError result`,{toolName:e,circuitBreakerState:C.getState(),circuitBreakerFailures:C.getFailureCount()})}if(U){let N=A,M=N.content,L=M?.filter($=>$.type==="text"&&$.text).map($=>$.text).join(" ")||(typeof N.error=="string"?N.error:"Unknown error"),j=A2t(L),F=`[TOOL_ERROR: ${e} failed (${j})] `;if(M&&Array.isArray(M)){let $=M.map(B=>({...B}));for(let B of $)if(B.type==="text"&&B.text){B.text=F+B.text;break}N.content=$}if(m.setAttribute("tool.error.message",L.substring(0,500)),m.setAttribute("tool.error.category",j),m.setStatus({code:Ae.ERROR,message:`MCP tool returned isError: ${L.substring(0,200)}`}),I){I.failedExecutions++;let $=I.successfulExecutions;I.successfulExecutions=Math.max(0,I.successfulExecutions-1),$>1?I.averageExecutionTime=(I.averageExecutionTime*$-k)/($-1):I.averageExecutionTime=0;let B=P2t(j);I.errorCategories[B]=(I.errorCategories[B]||0)+1}}return this.emitToolEndEvent(e,i,!U,A),m.setAttribute("tool.result.status",U?"error":"success"),m.setAttribute("tool.duration_ms",k),A}catch(A){I&&I.failedExecutions++;let k=Date.now()-i;if(A instanceof Si){if(ne.warn(`[${o}] Tool blocked by circuit breaker: ${e}`,{toolName:e,breakerState:A.breakerState,retryAfter:A.retryAfter,retryAfterMs:A.retryAfterMs,failureCount:A.failureCount,executionTime:k}),I){let O="execution";I.errorCategories[O]=(I.errorCategories[O]||0)+1}return this.emitToolEndEvent(e,i,!1,void 0),m.setAttribute("tool.result.status","circuit_breaker_open"),m.setAttribute("tool.duration_ms",k),m.setAttribute("tool.circuit_breaker.state",A.breakerState),m.setAttribute("tool.circuit_breaker.retry_after_ms",A.retryAfterMs),m.setAttribute("tool.circuit_breaker.failure_count",A.failureCount),m.setStatus({code:Ae.ERROR,message:`Circuit breaker open for ${e}: ${A.message}`}),{isError:!0,content:[{type:"text",text:`TOOL TEMPORARILY UNAVAILABLE: "${e}" has been disabled after ${A.failureCount} failures. This is a circuit breaker protection \u2014 do NOT retry this tool. It will become available again after ${Math.ceil(A.retryAfterMs/1e3)} seconds (at ${A.retryAfter}). Instead, inform the user that the operation failed and suggest trying again later.`}]}}let E;if(A instanceof Ve)E=A;else if(A instanceof Error)if(A.message.includes("timeout"))E=ge.toolTimeout(e,v.timeout);else if(A.message.includes("not found")){let O=await this.getAllAvailableTools();E=ge.toolNotFound(e,Lue(O.map(D=>({name:D.name}))))}else A.message.includes("validation")||A.message.includes("parameter")?E=ge.invalidParameters(e,A,t):A.message.includes("network")||A.message.includes("connection")?E=ge.networkError(e,A):E=ge.toolExecutionFailed(e,A);else E=ge.toolExecutionFailed(e,new Error(String(A)));if(I){let O=E.category||"execution";I.errorCategories[O]=(I.errorCategories[O]||0)+1}throw this.emitToolEndEvent(e,i,!1,void 0,E),this.emitter.emit("error",E),E=new Ve({...E,context:{...E.context,executionTime:k,params:t,options:v,circuitBreakerState:C?.getState(),circuitBreakerFailures:C?.getFailureCount(),metrics:{...I}}}),TG(E),m.setAttribute("tool.result.status","error"),m.setAttribute("tool.duration_ms",k),m.recordException(E),m.setStatus({code:Ae.ERROR,message:E.message}),E}}catch(f){if(!(f instanceof Ve)){let h=f instanceof Error?f.message:String(f);m.recordException(f instanceof Error?f:new Error(h)),m.setStatus({code:Ae.ERROR,message:h})}throw f}finally{m.end()}})}async executeToolInternal(e,t,n){let o="NeuroLink.executeToolInternal",i=this.getToolAnnotationsForExecution(e),s=this.mcpToolResultCache&&!n.disableToolCache&&!this._disableToolCacheForCurrentRequest&&!i?.destructiveHint;if(s){let u=this.mcpToolResultCache.getCachedResult(e,t);if(u!==void 0)return g.debug(`[${o}] Cache HIT for tool: ${e}`),u}let a=async u=>{if(this.mcpToolMiddlewares.length===0)return u();let d=0,p=async()=>{if(d<this.mcpToolMiddlewares.length){let m=this.mcpToolMiddlewares[d++];return m({name:e,description:"",inputSchema:{},annotations:i,execute:async()=>({})},t,{toolMeta:{name:e,annotations:i}},p)}return u()};return await p()},l=async()=>{let u=this.externalServerManager.getAllTools(),d=u.filter(m=>m.name===e&&m.isAvailable),p;if(d.length>1&&this.mcpToolRouter)try{let m={name:e,description:d[0].description??"",serverId:d[0].serverId,inputSchema:{}},f=this.mcpToolRouter.route(m);p=d.find(h=>h.serverId===f.serverId)||d[0],g.debug(`[${o}] Router selected server: ${f.serverId}`,{strategy:f.strategy,confidence:f.confidence})}catch(m){g.warn(`[${o}] Router failed, falling back to first match`,{error:m}),p=d[0]}else p=d[0];if(g.debug(`[${o}] External MCP tool search:`,{toolName:e,externalToolsCount:u.length,foundTool:!!p,isAvailable:p?.isAvailable,serverId:p?.serverId}),p&&p.isAvailable)try{ne.debug(`[${o}] Executing external MCP tool: ${e} from ${p.serverId}`);let m=await this.externalServerManager.executeTool(p.serverId,e,t,{timeout:n.timeout});return g.debug(`[${o}] External MCP tool execution successful:`,{toolName:e,serverId:p.serverId,resultType:typeof m}),m}catch(m){throw g.error(`[${o}] External MCP tool execution failed:`,{toolName:e,serverId:p.serverId,error:m instanceof Error?m.message:String(m)}),ge.toolExecutionFailed(e,m instanceof Error?m:new Error(String(m)),p.serverId)}try{let m=this.toolExecutionContext||{},f=n.authContext||{},h={...m,...f};g.debug("[Using merged context for unified registry tool:",{toolName:e,storedContextKeys:Object.keys(m),finalContextKeys:Object.keys(h)});let y=await this.toolRegistry.executeTool(e,t,h);if(y&&typeof y=="object"&&"success"in y&&y.success===!1){let v=y.error||"Tool execution failed",T=new Error(v);this.emitter.emit("error",T)}return y}catch(m){let f=m instanceof Error?m:new Error(String(m));if(this.emitter.emit("error",f),m instanceof Error&&m.message.includes("not found")){let h=await this.getAllAvailableTools();throw ge.toolNotFound(e,h.map(y=>y.name))}throw ge.toolExecutionFailed(e,m instanceof Error?m:new Error(String(m)))}};try{let u=await a(l);return s&&u!==void 0&&(this.mcpToolResultCache.cacheResult(e,t,u),g.debug(`[${o}] Cached result for tool: ${e}`)),u}catch(u){let d=i?{name:e,description:"",annotations:i,execute:async()=>({})}:void 0;if(d&&r0(d)&&u instanceof Error&&_P(u)){g.debug(`[${o}] Tool ${e} is safe to retry, attempting once more`);try{let p=await a(l);return s&&p!==void 0&&this.mcpToolResultCache.cacheResult(e,t,p),p}catch{}}throw u}}getToolAnnotationsForExecution(e){if(this.toolCache?.tools){let t=this.toolCache.tools.find(n=>n.name===e);if(t?.annotations)return t.annotations}if(this.mcpEnhancementsConfig?.annotations?.autoInfer!==!1)return Qa({name:e,description:""})}invalidateToolCache(){this.toolCache=null,g.debug("Tool cache invalidated")}async getAllAvailableTools(){if(this.toolCache&&Date.now()-this.toolCache.timestamp<this.toolCacheDuration)return g.debug("Returning available tools from cache"),this.toolCache.tools;let e=`get-all-tools-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,t=Date.now(),n=process.hrtime.bigint();g.debug("[NeuroLink] \u{1F6E0}\uFE0F LOG_POINT_A001_GET_ALL_TOOLS_START",{logPoint:"A001_GET_ALL_TOOLS_START",getAllToolsId:e,timestamp:new Date().toISOString(),getAllToolsStartTime:t,getAllToolsHrTimeStart:n.toString(),toolRegistryState:{hasToolRegistry:!!this.toolRegistry,toolRegistrySize:0,toolRegistryType:this.toolRegistry?.constructor?.name||"NOT_SET",hasExternalServerManager:!!this.externalServerManager,externalServerManagerType:this.externalServerManager?.constructor?.name||"NOT_SET"},mcpState:{mcpInitialized:this.mcpInitialized,hasProviderRegistry:!!br,providerRegistrySize:0},message:"Starting comprehensive tool discovery across all sources"});let{MemoryManager:o}=await Promise.resolve().then(()=>(z0(),$0)),i=o.getMemoryUsageMB();try{let s=new Map,a=await this.toolRegistry.listTools();for(let y of a)if(!s.has(y.name)){let v=Z_(y,{serverId:y.serverId==="direct"?"neurolink-direct":y.serverId});s.set(y.name,v)}let l=this.toolRegistry.getToolsByCategory(Vo({isCustomTool:!0}));for(let y of l)if(!s.has(y.name)){let v=Z_(y,{description:"Custom tool",serverId:`custom-tool-${y.name}`,category:Vo({isCustomTool:!0,serverId:y.serverId}),inputSchema:{}});s.set(y.name,v)}let u=this.toolRegistry.getToolsByCategory("in-memory");for(let y of u)if(!s.has(y.name)){let v=Z_(y,{description:"In-memory MCP tool",serverId:"unknown",category:"in-memory",inputSchema:{}});s.set(y.name,v)}let d=this.externalServerManager.getAllTools();for(let y of d)if(!s.has(y.name)){let v=Z_(y,{category:Vo({existingCategory:typeof y.metadata?.category=="string"?y.metadata.category:void 0,isExternal:!0,serverId:y.serverId}),inputSchema:{}});s.set(y.name,v)}let p=Array.from(s.values());ne.debug("Tool discovery results",{mcpTools:a.length,customTools:l.length,inMemoryTools:u.length,externalMCPTools:d.length,total:p.length});let f=o.getMemoryUsageMB().heapUsed-i.heapUsed;if(f>Ou.LOW_USAGE_MB&&(ne.debug(`\u{1F50D} Tool listing used ${f}MB memory (large tool registry detected)`),p.length>eK.LARGE_TOOL_COLLECTION&&ne.debug("\u{1F4A1} Tool collection optimized for large sets. Memory usage reduced through efficient object reuse.")),this.mcpEnhancementsConfig?.annotations?.autoInfer!==!1)for(let y of p)y.annotations||(y.annotations=Qa({name:y.name,description:y.description||""}));let h=p;return this.toolCache={tools:h,timestamp:Date.now()},h}catch(s){return ne.error("Failed to list available tools",{error:s}),[]}}async getProviderStatus(e){let{MemoryManager:t}=await Promise.resolve().then(()=>(z0(),$0)),n=t.getMemoryUsageMB();e?.quiet||ne.debug("\u{1F50D} DEBUG: Initializing MCP for provider status..."),await this.initializeMCP(),e?.quiet||ne.debug("\u{1F50D} DEBUG: MCP initialized:",this.mcpInitialized);let{AIProviderFactory:o}=await Promise.resolve().then(()=>(Pa(),NL)),{hasProviderEnvVars:i}=await Promise.resolve().then(()=>(Ud(),FE)),s=["openai","bedrock","vertex","googleVertex","anthropic","azure","google-ai","huggingface","ollama","mistral","litellm"],a=Au(Aa.DEFAULT_CONCURRENCY_LIMIT),l=s.map(m=>a(async()=>{let f=Date.now();try{if(!await this.hasProviderEnvVars(m)&&m!=="ollama")return{provider:m,status:"not-configured",configured:!1,authenticated:!1,error:"Missing required environment variables",responseTime:Date.now()-f};if(m==="ollama")try{let _=await fetch("http://localhost:11434/api/tags",{method:"GET",signal:AbortSignal.timeout(Ks.AUTH_MS)});if(!_.ok)throw new Error("Ollama service not responding");let S=await _.json(),w=S?.models;if(!Array.isArray(w))throw g.warn("Ollama API returned invalid models format in testProvider",{responseData:S,modelsType:typeof w}),new Error("Invalid models format from Ollama API");let C=w.filter(I=>I&&typeof I=="object"&&typeof I.name=="string");return C.length>0?{provider:m,status:"working",configured:!0,authenticated:!0,responseTime:Date.now()-f,model:C[0].name}:{provider:m,status:"failed",configured:!0,authenticated:!1,error:"Ollama service running but no models installed",responseTime:Date.now()-f}}catch(_){return{provider:m,status:"failed",configured:!1,authenticated:!1,error:_ instanceof Error?_.message:"Ollama service not running",responseTime:Date.now()-f}}let y=5e3,v=this.testProviderConnection(m),T=new Promise((_,S)=>{setTimeout(()=>S(new Error("Provider test timeout (5s)")),y)});return await Promise.race([v,T]),{provider:m,status:"working",configured:!0,authenticated:!0,responseTime:Date.now()-f}}catch(h){let y=h instanceof Error?h.message:String(h);return{provider:m,status:"failed",configured:!0,authenticated:!1,error:y,responseTime:Date.now()-f}}})),u=await Promise.all(l),p=t.getMemoryUsageMB().heapUsed-n.heapUsed;return!e?.quiet&&p>20&&ne.debug(`\u{1F50D} Memory usage: +${p}MB (consider cleanup for large operations)`),p>50&&t.forceGC(),u}async testProvider(e){try{return await this.testProviderConnection(e),!0}catch{return!1}}async testProviderConnection(e){let{AIProviderFactory:t}=await Promise.resolve().then(()=>(Pa(),NL));await(await t.createProvider(e,null)).generate({prompt:"test",maxTokens:1,disableTools:!0})}async getBestProvider(e){let{getBestProvider:t}=await Promise.resolve().then(()=>(Ud(),FE));return t(e)}async getAvailableProviders(){let{getAvailableProviders:e}=await Promise.resolve().then(()=>(Ud(),FE));return e()}async isValidProvider(e){let{isValidProvider:t}=await Promise.resolve().then(()=>(Ud(),FE));return t(e)}async getMCPStatus(){try{await this.initializeMCP();let e=await this.toolRegistry.listTools(),t=this.externalServerManager.getStatistics(),n=this.externalServerManager.listServers(),o=this.getInMemoryServerInfos(),i=this.toolRegistry.getBuiltInServerInfos(),s=this.getAutoDiscoveredServerInfos(),a=n.length+o.length+i.length+s.length,l=t.connectedServers+o.length+i.length,u=e.length+t.totalTools;return{mcpInitialized:this.mcpInitialized,totalServers:a,availableServers:l,autoDiscoveredCount:s.length,totalTools:u,autoDiscoveredServers:s,customToolsCount:this.toolRegistry.getToolsByCategory(Vo({isCustomTool:!0})).length,inMemoryServersCount:o.length,externalMCPServersCount:n.length,externalMCPConnectedCount:t.connectedServers,externalMCPFailedCount:t.failedServers,externalMCPServers:n}}catch(e){return{mcpInitialized:!1,totalServers:0,availableServers:0,autoDiscoveredCount:0,totalTools:0,autoDiscoveredServers:[],customToolsCount:this.toolRegistry.getToolsByCategory(Vo({isCustomTool:!0})).length,inMemoryServersCount:0,externalMCPServersCount:0,externalMCPConnectedCount:0,externalMCPFailedCount:0,externalMCPServers:[],error:e instanceof Error?e.message:String(e)}}}async listMCPServers(){return[...this.externalServerManager.listServers(),...this.getInMemoryServerInfos(),...this.toolRegistry.getBuiltInServerInfos(),...this.getAutoDiscoveredServerInfos()]}async testMCPServer(e){try{if(e==="neurolink-direct")return(await this.toolRegistry.listTools()).length>0;let t=this.getInMemoryServers();if(t.has(e)){let o=t.get(e);return!!(o?.tools&&o.tools.length>0)}let n=this.externalServerManager.getServer(e);return n?n.status==="connected"&&n.client!==null:!1}catch(t){return ne.error(`[NeuroLink] Error testing MCP server ${e}:`,t),!1}}async hasProviderEnvVars(e){let{ProviderHealthChecker:t}=await Promise.resolve().then(()=>(Ug(),Nx));try{let n=await t.checkProviderHealth(e,{includeConnectivityTest:!1,cacheResults:!1});return n.isConfigured&&n.hasApiKey}catch(n){return g.warn(`Provider env var check failed for ${e}`,{error:n instanceof Error?n.message:String(n)}),!1}}async checkProviderHealth(e,t={}){let{ProviderHealthChecker:n}=await Promise.resolve().then(()=>(Ug(),Nx)),o=await n.checkProviderHealth(e,t);return{provider:o.provider,isHealthy:o.isHealthy,isConfigured:o.isConfigured,hasApiKey:o.hasApiKey,lastChecked:o.lastChecked,error:o.error,warning:o.warning,responseTime:o.responseTime,configurationIssues:o.configurationIssues,recommendations:o.recommendations}}async checkAllProvidersHealth(e={}){let{ProviderHealthChecker:t}=await Promise.resolve().then(()=>(Ug(),Nx));return(await t.checkAllProvidersHealth(e)).map(o=>({provider:o.provider,isHealthy:o.isHealthy,isConfigured:o.isConfigured,hasApiKey:o.hasApiKey,lastChecked:o.lastChecked,error:o.error,warning:o.warning,responseTime:o.responseTime,configurationIssues:o.configurationIssues,recommendations:o.recommendations}))}async getProviderHealthSummary(){let{ProviderHealthChecker:e}=await Promise.resolve().then(()=>(Ug(),Nx)),t=await e.checkAllProvidersHealth({cacheResults:!0,includeConnectivityTest:!1}),n=e.getHealthSummary(t),o=[];return n.healthy===0?o.push("No providers are healthy. Check your environment configuration."):n.healthy<2&&o.push("Consider configuring additional providers for better reliability."),n.hasIssues>0&&o.push("Some providers have configuration issues. Run checkAllProvidersHealth() for details."),{...n,recommendations:o}}async clearProviderHealthCache(e){let{ProviderHealthChecker:t}=await Promise.resolve().then(()=>(Ug(),Nx));t.clearHealthCache(e)}getToolExecutionMetrics(){let e={};for(let[t,n]of this.toolExecutionMetrics.entries())e[t]={...n,errorCategories:{...n.errorCategories},successRate:n.totalExecutions>0?n.successfulExecutions/n.totalExecutions:0};return e}setModelAliasConfig(e){this.modelAliasConfig=e,g.info(`[ModelAlias] Configured ${Object.keys(e.aliases).length} model aliases`)}getToolCircuitBreakerStatus(){let e={};for(let[t,n]of this.toolCircuitBreakers.entries())e[t]={state:n.getState(),failureCount:n.getFailureCount(),isHealthy:n.getState()==="closed"};return e}resetToolCircuitBreaker(e){this.toolCircuitBreakers.has(e)&&(this.toolCircuitBreakers.set(e,new tv(BE.FAILURE_THRESHOLD,CD)),ne.info(`Circuit breaker reset for tool: ${e}`))}clearToolExecutionMetrics(){this.toolExecutionMetrics.clear(),ne.info("All tool execution metrics cleared")}async getToolHealthReport(){let e={},t=0,n=await this.toolRegistry.listTools(),o=new Set(n.map(s=>s.name)),i=new Map;for(let s of n)i.has(s.name)||i.set(s.name,s.serverId||"unknown");for(let s of o){let a=this.toolExecutionMetrics.get(s),l=`${i.get(s)||"unknown"}.${s}`,u=this.toolCircuitBreakers.get(l),d=a&&a.totalExecutions>0?a.successfulExecutions/a.totalExecutions:0,p=(!u||u.getState()==="closed")&&d>=.8;p&&t++;let m=[],f=[];if(u&&u.getState()==="open"&&(m.push("Circuit breaker is open due to repeated failures"),f.push("Check tool implementation and fix underlying issues")),d<.8&&a&&a.totalExecutions>0&&(m.push(`Low success rate: ${(d*100).toFixed(1)}%`),f.push("Review error logs and improve tool reliability")),a&&a.averageExecutionTime>1e4&&(m.push("High average execution time"),f.push("Optimize tool performance or increase timeout")),a&&a.errorCategories){let h=a.errorCategories;h.timeout>0&&(m.push(`Timeout errors: ${h.timeout}`),f.push("Consider increasing the tool timeout configuration")),h.validation>0&&(m.push(`Validation errors: ${h.validation}`),f.push("Review input schemas and parameter validation")),h.network>0&&(m.push(`Network errors: ${h.network}`),f.push("Check network connectivity and endpoint availability"))}e[s]={name:s,isHealthy:p,metrics:{totalExecutions:a?.totalExecutions||0,successRate:d,averageExecutionTime:a?.averageExecutionTime||0,lastExecutionTime:a?.lastExecutionTime||0,errorCategories:a?.errorCategories?{...a.errorCategories}:{}},circuitBreaker:{state:u?.getState()||"closed",failureCount:u?.getFailureCount()||0},issues:m,recommendations:f}}return{totalTools:o.size,healthyTools:t,unhealthyTools:o.size-t,tools:e}}async ensureConversationMemoryInitialized(){try{let e=`manual-init-${Date.now()}`;return await this.initializeConversationMemoryForGeneration(e,Date.now(),process.hrtime.bigint()),!!this.conversationMemory}catch(e){return g.error("Failed to initialize conversation memory",{error:e instanceof Error?e.message:String(e)}),!1}}async getConversationStats(){let e=`stats-init-${Date.now()}`;if(await this.initializeConversationMemoryForGeneration(e,Date.now(),process.hrtime.bigint()),!this.conversationMemory)throw new Ve({code:gt.MISSING_CONFIGURATION,message:"Conversation memory is not enabled",category:"validation",severity:"high",retriable:!1});return await this.conversationMemory.getStats()}async getConversationHistory(e){let t=`history-init-${Date.now()}`;if(await this.initializeConversationMemoryForGeneration(t,Date.now(),process.hrtime.bigint()),!this.conversationMemory)throw new Ve({code:gt.MISSING_CONFIGURATION,message:"Conversation memory is not enabled",category:"validation",severity:"high",retriable:!1});if(!e||typeof e!="string")throw new Ve({code:gt.INVALID_PARAMETERS,message:"Session ID must be a non-empty string",category:"validation",severity:"medium",retriable:!1,context:{sessionId:e}});try{let n=await this.conversationMemory.buildContextMessages(e);return g.debug("Retrieved conversation history",{sessionId:e,messageCount:n.length,turnCount:n.length/2}),n}catch(n){return g.error("Failed to retrieve conversation history",{sessionId:e,error:n instanceof Error?n.message:String(n)}),[]}}async clearConversationSession(e){let t=`clear-session-init-${Date.now()}`;if(await this.initializeConversationMemoryForGeneration(t,Date.now(),process.hrtime.bigint()),!this.conversationMemory)throw new Ve({code:gt.MISSING_CONFIGURATION,message:"Conversation memory is not enabled",category:"validation",severity:"high",retriable:!1});return this.lastCompactionMessageCount.delete(e),await this.conversationMemory.clearSession(e)}async clearAllConversations(){let e=`clear-all-init-${Date.now()}`;if(await this.initializeConversationMemoryForGeneration(e,Date.now(),process.hrtime.bigint()),!this.conversationMemory)throw new Ve({code:gt.MISSING_CONFIGURATION,message:"Conversation memory is not enabled",category:"validation",severity:"high",retriable:!1});this.lastCompactionMessageCount.clear(),await this.conversationMemory.clearAllSessions()}async storeToolExecutions(e,t,n,o,i){let s=n&&n.length>0||o&&o.length>0;if(!s){g.debug("Tool execution storage skipped",{hasToolData:s,toolCallsCount:n?.length||0,toolResultsCount:o?.length||0});return}let a=this.conversationMemory;try{await a.storeToolExecution(e,t,n,o,i)}catch(l){g.warn("Failed to store tool executions",{sessionId:e,userId:t,error:l instanceof Error?l.message:String(l)})}}isToolExecutionStorageAvailable(){let e=process.env.STORAGE_TYPE==="redis",t=this.conversationMemory&&this.conversationMemory.constructor.name==="RedisConversationMemoryManager";return!!(e&&t)}async getSessionMessages(e,t){let n=`get-msgs-init-${Date.now()}`;if(await this.initializeConversationMemoryForGeneration(n,Date.now(),process.hrtime.bigint()),!this.conversationMemory)throw new Ve({code:gt.MISSING_CONFIGURATION,message:"Conversation memory is not enabled",category:"validation",severity:"high",retriable:!1});if(!e||typeof e!="string")throw new Ve({code:gt.INVALID_PARAMETERS,message:"Session ID must be a non-empty string",category:"validation",severity:"medium",retriable:!1,context:{sessionId:e}});return await this.conversationMemory.getSessionMessages(e,t)}async setSessionMessages(e,t,n){let o=`set-msgs-init-${Date.now()}`;if(await this.initializeConversationMemoryForGeneration(o,Date.now(),process.hrtime.bigint()),!this.conversationMemory)throw new Ve({code:gt.MISSING_CONFIGURATION,message:"Conversation memory is not enabled",category:"validation",severity:"high",retriable:!1});if(!e||typeof e!="string")throw new Ve({code:gt.INVALID_PARAMETERS,message:"Session ID must be a non-empty string",category:"validation",severity:"medium",retriable:!1,context:{sessionId:e}});await this.conversationMemory.setSessionMessages(e,t,n)}async modifyLastAssistantMessage(e,t,n){let o=await this.getSessionMessages(e,n);for(let i=o.length-1;i>=0;i--)if(o[i].role==="assistant")return o[i]={...o[i],content:t(o[i].content)},await this.setSessionMessages(e,o,n),!0;return!1}async addExternalMCPServer(e,t){this.invalidateToolCache();try{ne.info(`[NeuroLink] Adding external MCP server: ${e}`,{command:t.command,transport:t.transport});let n=await this.externalServerManager.addServer(e,t);if(n.success){if(ne.info(`[NeuroLink] External MCP server added successfully: ${e}`,{toolsDiscovered:n.metadata?.toolsDiscovered||0,duration:n.duration}),this.mcpEnhancementsConfig?.router?.enabled!==!1){let o=this.externalServerManager.listServers();if(o.length>=2&&!this.mcpToolRouter){this.mcpToolRouter=new Em({strategy:this.mcpEnhancementsConfig?.router?.strategy??"least-loaded",enableAffinity:this.mcpEnhancementsConfig?.router?.enableAffinity??!1});for(let i of o)this.mcpToolRouter.registerServer(i.id||e);g.debug("[NeuroLink] ToolRouter auto-initialized (2+ external servers)")}else this.mcpToolRouter&&this.mcpToolRouter.registerServer(e)}this.emitter.emit("externalMCP:serverAdded",{serverId:e,config:t,toolCount:n.metadata?.toolsDiscovered||0,timestamp:Date.now()})}else ne.error(`[NeuroLink] Failed to add external MCP server: ${e}`,{error:n.error});return n}catch(n){throw ne.error(`[NeuroLink] Error adding external MCP server: ${e}`,n),n}}async removeExternalMCPServer(e){this.invalidateToolCache();try{ne.info(`[NeuroLink] Removing external MCP server: ${e}`);let t=await this.externalServerManager.removeServer(e);return t.success?(ne.info(`[NeuroLink] External MCP server removed successfully: ${e}`),this.emitter.emit("externalMCP:serverRemoved",{serverId:e,timestamp:Date.now()})):ne.error(`[NeuroLink] Failed to remove external MCP server: ${e}`,{error:t.error}),t}catch(t){throw ne.error(`[NeuroLink] Error removing external MCP server: ${e}`,t),t}}listExternalMCPServers(){let e=this.externalServerManager.getServerStatuses(),t=this.externalServerManager.listServers();return e.map(n=>{let o=t.find(i=>i.id===n.serverId);return{serverId:n.serverId,status:n.status,toolCount:n.toolCount,uptime:n.performance.uptime,isHealthy:n.isHealthy,config:o||{}}})}getExternalMCPServer(e){return this.externalServerManager.getServer(e)}async executeExternalMCPTool(e,t,n,o){try{ne.debug(`[NeuroLink] Executing external MCP tool: ${t} on ${e}`);let i=await this.externalServerManager.executeTool(e,t,n,o);return ne.debug(`[NeuroLink] External MCP tool executed successfully: ${t}`),i}catch(i){throw ne.error(`[NeuroLink] External MCP tool execution failed: ${t}`,i),i}}getExternalMCPTools(){return this.externalServerManager.getAllTools()}getExternalMCPServerTools(e){return this.externalServerManager.getServerTools(e)}async testExternalMCPConnection(e){try{let{MCPClientFactory:t}=await We(Promise.resolve().then(()=>(X1(),LEe)),1e4),n=await t.testConnection(e,1e4);return{success:n.success,error:n.error,toolCount:n.capabilities?1:0}}catch(t){return{success:!1,error:t instanceof Error?t.message:String(t)}}}getExternalMCPStatistics(){return this.externalServerManager.getStatistics()}async shutdownExternalMCPServers(){try{ne.info("[NeuroLink] Shutting down all external MCP servers..."),this.unregisterAllExternalMCPToolsFromRegistry(),await this.externalServerManager.shutdown(),ne.info("[NeuroLink] All external MCP servers shut down successfully")}catch(e){throw ne.error("[NeuroLink] Error shutting down external MCP servers:",e),e}}async getElicitationManager(){return(await We(Promise.resolve().then(()=>(m9(),bke)),1e4)).globalElicitationManager}async registerElicitationHandler(e){(await this.getElicitationManager()).registerHandler(e)}async getMultiServerManager(){return(await We(Promise.resolve().then(()=>(y1(),G_e)),1e4)).globalMultiServerManager}async getEnhancedToolDiscovery(){let e=await We(Promise.resolve().then(()=>(v1(),V_e)),1e4);return new e.EnhancedToolDiscovery(this.toolRegistry)}async getMCPRegistryClient(){return(await We(Promise.resolve().then(()=>(y9(),Tke)),1e4)).globalMCPRegistryClient}async exposeAgentAsTool(e,t){return(await We(Promise.resolve().then(()=>(MU(),T9)),1e4)).exposeAgentAsTool(e,t)}async exposeWorkflowAsTool(e,t){return(await We(Promise.resolve().then(()=>(MU(),T9)),1e4)).exposeWorkflowAsTool(e,t)}async getToolIntegrationManager(){return(await We(Promise.resolve().then(()=>(I9(),Ske)),1e4)).globalToolIntegrationManager}async convertToolsToMCPFormat(e,t={}){let n=await We(Promise.resolve().then(()=>(LU(),F9)),1e4),o=e.map(i=>({...i,execute:i.execute??(async()=>({success:!1,error:"No execute function provided"}))}));return n.batchConvertToMCP(o,t)}async convertToolsFromMCPFormat(e,t={}){return(await We(Promise.resolve().then(()=>(LU(),F9)),1e4)).batchConvertToNeuroLink(e,t)}async getToolAnnotations(e){let{inferAnnotations:t,mergeAnnotations:n,getAnnotationSummary:o}=await We(Promise.resolve().then(()=>(Wx(),B_e)),1e4),i=this.toolRegistry.getToolInfo(e);if(!i)return null;let s=i.tool.annotations,a=t({name:i.tool.name,description:i.tool.description??""}),l=n(a,s);return{annotations:l,summary:o(l)}}convertExternalMCPToolsToAISDKFormat(){let e=this.externalServerManager.getAllTools(),t={};for(let n of e)if(n.isAvailable){let o={description:n.description,execute:async i=>{try{ne.debug(`[NeuroLink] Executing external MCP tool via AI SDK: ${n.name}`,{params:i});let s=await this.externalServerManager.executeTool(n.serverId,n.name,i,{timeout:3e4});return ne.debug(`[NeuroLink] External MCP tool execution result: ${n.name}`,{success:!!s,hasData:!!(s&&typeof s=="object"&&"content"in s)}),s}catch(s){throw ne.error(`[NeuroLink] External MCP tool execution failed: ${n.name}`,s),s}}};t[n.name]=o,ne.debug(`[NeuroLink] Converted external MCP tool to AI SDK format: ${n.name} from server ${n.serverId}`)}return ne.info(`[NeuroLink] Converted ${Object.keys(t).length} external MCP tools to AI SDK format`),t}convertJSONSchemaToAISDKFormat(e){}unregisterExternalMCPToolsFromRegistry(e){try{let t=this.externalServerManager.getServerTools(e);for(let n of t)this.toolRegistry.removeTool(n.name),ne.debug(`[NeuroLink] Unregistered external MCP tool from main registry: ${n.name}`)}catch(t){ne.error(`[NeuroLink] Failed to unregister external MCP tools from registry for server ${e}:`,t)}}unregisterExternalMCPToolFromRegistry(e){try{this.toolRegistry.removeTool(e),ne.debug(`[NeuroLink] Unregistered external MCP tool from main registry: ${e}`)}catch(t){ne.error(`[NeuroLink] Failed to unregister external MCP tool ${e} from registry:`,t)}}async lazyInitializeConversationMemory(e,t,n){try{let{initializeConversationMemory:o}=await Nke().then(()=>Oke),i=await o(this.conversationMemoryConfig);this.conversationMemory=i,this.conversationMemoryNeedsInit=!1}catch(o){throw g.error("[NeuroLink] \u274C LOG_POINT_G005_MEMORY_LAZY_INIT_ERROR",{logPoint:"G005_MEMORY_LAZY_INIT_ERROR",generateInternalId:e,timestamp:new Date().toISOString(),elapsedMs:Date.now()-t,elapsedNs:(process.hrtime.bigint()-n).toString(),error:o instanceof Error?o.message:String(o),errorName:o instanceof Error?o.name:"UnknownError",errorStack:o instanceof Error?o.stack:void 0,message:"Lazy conversation memory initialization failed"}),o}}unregisterAllExternalMCPToolsFromRegistry(){try{let e=this.externalServerManager.getAllTools();for(let t of e)this.toolRegistry.removeTool(t.name);ne.debug(`[NeuroLink] Unregistered ${e.length} external MCP tools from main registry`)}catch(e){ne.error("[NeuroLink] Failed to unregister all external MCP tools from registry:",e)}}async createEvaluationPipeline(e){let{EvaluationPipeline:t,getPreset:n}=await We(Promise.resolve().then(()=>(nv(),F_)),1e4,ge.evaluationTimeout("evaluation module load",1e4)),o;typeof e=="string"?o=n(e):o=e;let i=new t(o);return await We(i.initialize(),3e4,ge.evaluationTimeout("pipeline initialization",3e4)),g.debug(`[NeuroLink] Created evaluation pipeline: ${o.name??"custom"}`),i}async evaluate(e,t){let{EvaluationPipeline:n,getPreset:o}=await We(Promise.resolve().then(()=>(nv(),F_)),1e4,ge.evaluationTimeout("evaluation module load",1e4)),i;if(t?.pipeline&&t?.scorers)throw new Error("Cannot specify both 'pipeline' and 'scorers' options. Use one or the other.");if(t?.scorers&&t.scorers.length===0)throw new Error("The 'scorers' array must not be empty. Provide at least one scorer ID or omit the option to use the default 'quality' preset.");t?.pipeline?i={...o(t.pipeline)}:t?.scorers&&t.scorers.length>0?i={name:"SDK Evaluation",description:"Evaluation from NeuroLink SDK",scorers:t.scorers.map(u=>({id:u})),executionMode:t.executionMode??"parallel",passThreshold:t.passThreshold??.7}:i=o("quality"),t?.passThreshold!==void 0&&(i.passThreshold=t.passThreshold),t?.executionMode!==void 0&&(i.executionMode=t.executionMode);let s=new n(i);await We(s.initialize(),3e4,ge.evaluationTimeout("pipeline initialization",3e4));let a=t?.timeoutMs??6e4,l=await We(s.execute(e,{correlationId:t?.correlationId}),a,ge.evaluationTimeout("pipeline execution",a));return g.debug("[NeuroLink] Evaluation completed",{pipeline:i.name,overallScore:l.overallScore,passed:l.passed,scorerCount:l.scores.length}),l}async score(e,t,n){let{ScorerRegistry:o}=await We(Promise.resolve().then(()=>(JP(),t4)),1e4,ge.evaluationTimeout("scorer module load",1e4));await We(o.registerBuiltInScorers(),3e4,ge.evaluationTimeout("scorer bootstrap",3e4));let i=await We(o.getScorer(e,n),3e4,ge.evaluationTimeout(`scorer load: ${e}`,3e4));if(!i)throw ge.scorerNotFound(e);let s=i.validateInput(t);if(!s.valid)throw ge.evaluationValidationFailed(e,s.errors);let a=await We(i.score(t),6e4,ge.evaluationTimeout("scorer execution",6e4));return g.debug("[NeuroLink] Scoring completed",{scorerId:e,score:a.score,passed:a.passed,computeTime:a.computeTime}),a}async getAvailableScorers(e){let{ScorerRegistry:t}=await We(Promise.resolve().then(()=>(JP(),t4)),1e4,ge.evaluationTimeout("scorer module load",1e4));await We(t.registerBuiltInScorers(),3e4,ge.evaluationTimeout("scorer bootstrap",3e4));let n=t.list();return e?.category&&(n=n.filter(o=>o.category===e.category)),e?.type&&(n=n.filter(o=>o.type===e.type)),n}async getEvaluationPresets(){let{getPresetNames:e}=await We(Promise.resolve().then(()=>(nv(),F_)),1e4,ge.evaluationTimeout("evaluation module load",1e4));return e()}async getEvaluationPreset(e){let{getPreset:t}=await We(Promise.resolve().then(()=>(nv(),F_)),1e4,ge.evaluationTimeout("evaluation module load",1e4));return t(e)}async dispose(){g.debug("[NeuroLink] Starting disposal of resources..."),this.lastCompactionMessageCount.clear();let e=[];try{try{g.debug("[NeuroLink] Flushing and shutting down OpenTelemetry..."),await bD(),await TD(),g.debug("[NeuroLink] OpenTelemetry shutdown successfully")}catch(t){let n=t instanceof Error?t:new Error(`OpenTelemetry shutdown error: ${String(t)}`);e.push(n),g.warn("[NeuroLink] Error shutting down OpenTelemetry:",t)}if(this.externalServerManager)try{g.debug("[NeuroLink] Shutting down external MCP servers..."),await this.externalServerManager.shutdown(),g.debug("[NeuroLink] External MCP servers shutdown successfully")}catch(t){let n=t instanceof Error?t:new Error(`External server shutdown error: ${String(t)}`);e.push(n),g.warn("[NeuroLink] Error shutting down external MCP servers:",t)}if(this.emitter)try{g.debug("[NeuroLink] Removing all event listeners..."),this.emitter.removeAllListeners(),g.clearEventEmitter(),g.debug("[NeuroLink] Event listeners removed successfully")}catch(t){let n=t instanceof Error?t:new Error(`Event emitter cleanup error: ${String(t)}`);e.push(n),g.warn("[NeuroLink] Error removing event listeners:",t)}if(this.toolCircuitBreakers&&this.toolCircuitBreakers.size>0)try{g.debug(`[NeuroLink] Clearing ${this.toolCircuitBreakers.size} circuit breakers...`),this.toolCircuitBreakers.clear(),g.debug("[NeuroLink] Circuit breakers cleared successfully")}catch(t){let n=t instanceof Error?t:new Error(`Circuit breaker cleanup error: ${String(t)}`);e.push(n),g.warn("[NeuroLink] Error clearing circuit breakers:",t)}try{g.debug("[NeuroLink] Clearing maps and caches..."),this.toolExecutionMetrics&&this.toolExecutionMetrics.clear(),this.activeToolExecutions&&this.activeToolExecutions.clear(),this.currentStreamToolExecutions&&(this.currentStreamToolExecutions.length=0),this.toolExecutionHistory&&(this.toolExecutionHistory.length=0),this.toolCache&&(this.toolCache.tools=[],this.toolCache.timestamp=0),this.mcpToolResultCache?.destroy(),this.mcpToolRouter?.destroy(),this.mcpToolBatcher?.destroy(),this.mcpToolResultCache=void 0,this.mcpToolRouter=void 0,this.mcpToolBatcher=void 0,this.mcpEnhancedDiscovery=void 0,this.mcpToolMiddlewares=[],g.debug("[NeuroLink] Maps and caches cleared successfully")}catch(t){let n=t instanceof Error?t:new Error(`Cache cleanup error: ${String(t)}`);e.push(n),g.warn("[NeuroLink] Error clearing caches:",t)}try{g.debug("[NeuroLink] Resetting initialization state..."),this.mcpInitialized=!1,this.mcpInitPromise=null,this.conversationMemoryNeedsInit=!1,g.debug("[NeuroLink] Initialization state reset successfully")}catch(t){let n=t instanceof Error?t:new Error(`State reset error: ${String(t)}`);e.push(n),g.warn("[NeuroLink] Error resetting state:",t)}e.length===0?g.debug("[NeuroLink] \u2705 Resource disposal completed successfully"):g.warn(`[NeuroLink] \u26A0\uFE0F Resource disposal completed with ${e.length} errors`,{errors:e.map(t=>t.message)})}catch(t){throw g.error("[NeuroLink] Critical error during disposal:",t),t}}getToolRegistry(){return this.toolRegistry}async compactSession(e,t){if(!this.conversationMemory)return null;let n=await this.conversationMemory.buildContextMessages(e);if(!n||n.length===0)return null;let o=new fm({...t,summarizationProvider:t?.summarizationProvider??this.conversationMemoryConfig?.conversationMemory?.summarizationProvider,summarizationModel:t?.summarizationModel??this.conversationMemoryConfig?.conversationMemory?.summarizationModel}),i=is({provider:t?.provider||"openai",conversationMessages:n}),s=Math.floor(i.availableInputTokens*.6),a=await o.compact(n,s,this.conversationMemoryConfig?.conversationMemory);return a.compacted&&Vx(a.messages),a}async getContextStats(e,t,n){if(!this.conversationMemory)return null;let o=await this.conversationMemory.buildContextMessages(e);if(!o||o.length===0)return null;let i=is({provider:t||"openai",model:n,conversationMessages:o});return{estimatedInputTokens:i.estimatedInputTokens,availableInputTokens:i.availableInputTokens,usageRatio:i.usageRatio,shouldCompact:i.shouldCompact,messageCount:o.length}}needsCompaction(e,t,n){if(!this.conversationMemory)return!1;let o=this.conversationMemory.getSession?.(e);return o?is({provider:t||"openai",model:n,conversationMessages:o.messages}).shouldCompact:!1}async setAuthProvider(e){if(this.authInitPromise=void 0,"authenticateToken"in e&&typeof e.authenticateToken=="function")this.authProvider=e,g.info(`Auth provider set: ${this.authProvider.type}`);else if("provider"in e)this.authProvider=e.provider,g.info(`Auth provider set: ${this.authProvider.type}`);else{let t=e,{AuthProviderFactory:n}=await Promise.resolve().then(()=>(tC(),Dke));this.authProvider=await n.createProvider(t.type,t.config),g.info(`Auth provider created and set: ${t.type}`)}this.authProvider&&this.emitter.emit("auth:provider:set",{type:this.authProvider.type,timestamp:Date.now()})}getAuthProvider(){return this.authProvider}async ensureAuthProvider(){this.authProvider||!this.pendingAuthConfig||(this.authInitPromise??=(async()=>{try{await this.setAuthProvider(this.pendingAuthConfig),this.pendingAuthConfig=void 0}catch(e){throw this.authInitPromise=void 0,e}})(),await this.authInitPromise)}async setAuthContext(e){let{globalAuthContext:t}=await Promise.resolve().then(()=>(Fx(),BL));t.set(e),g.debug("Auth context set",{userId:e.user.id,provider:e.provider,sessionId:e.session?.id})}async getAuthContext(){let{getAuthContext:e}=await Promise.resolve().then(()=>(Fx(),BL));return e()}async clearAuthContext(){let{globalAuthContext:e}=await Promise.resolve().then(()=>(Fx(),BL)),t=e.get()?.user.id;e.clear(),t&&g.debug(`Auth context cleared for user: ${t}`)}getExternalServerManager(){return this.externalServerManager}},Uke=new uh,M2t=Uke});var or,en,Qt,Z9=R(()=>{"use strict";or={CONFIG:"CONFIG",VALIDATION:"VALIDATION",EXECUTION:"EXECUTION",EXTERNAL:"EXTERNAL",RATE_LIMIT:"RATE_LIMIT",AUTHENTICATION:"AUTHENTICATION",AUTHORIZATION:"AUTHORIZATION",STREAMING:"STREAMING",WEBSOCKET:"WEBSOCKET"},en={LOW:"LOW",MEDIUM:"MEDIUM",HIGH:"HIGH",CRITICAL:"CRITICAL"},Qt={INVALID_CONFIG:"SERVER_ADAPTER_INVALID_CONFIG",MISSING_DEPENDENCY:"SERVER_ADAPTER_MISSING_DEPENDENCY",FRAMEWORK_INIT_FAILED:"SERVER_ADAPTER_FRAMEWORK_INIT_FAILED",ROUTE_NOT_FOUND:"SERVER_ADAPTER_ROUTE_NOT_FOUND",ROUTE_CONFLICT:"SERVER_ADAPTER_ROUTE_CONFLICT",INVALID_ROUTE:"SERVER_ADAPTER_INVALID_ROUTE",HANDLER_ERROR:"SERVER_ADAPTER_HANDLER_ERROR",TIMEOUT:"SERVER_ADAPTER_TIMEOUT",MIDDLEWARE_ERROR:"SERVER_ADAPTER_MIDDLEWARE_ERROR",RATE_LIMIT_EXCEEDED:"SERVER_ADAPTER_RATE_LIMIT_EXCEEDED",AUTH_REQUIRED:"SERVER_ADAPTER_AUTH_REQUIRED",AUTH_INVALID:"SERVER_ADAPTER_AUTH_INVALID",FORBIDDEN:"SERVER_ADAPTER_FORBIDDEN",STREAM_ERROR:"SERVER_ADAPTER_STREAM_ERROR",STREAM_ABORTED:"SERVER_ADAPTER_STREAM_ABORTED",WEBSOCKET_ERROR:"SERVER_ADAPTER_WEBSOCKET_ERROR",WEBSOCKET_CONNECTION_FAILED:"SERVER_ADAPTER_WEBSOCKET_CONNECTION_FAILED",VALIDATION_ERROR:"SERVER_ADAPTER_VALIDATION_ERROR",SCHEMA_ERROR:"SERVER_ADAPTER_SCHEMA_ERROR",START_FAILED:"SERVER_ADAPTER_START_FAILED",STOP_FAILED:"SERVER_ADAPTER_STOP_FAILED",ALREADY_RUNNING:"SERVER_ADAPTER_ALREADY_RUNNING",NOT_RUNNING:"SERVER_ADAPTER_NOT_RUNNING"}});function Vu(r,e,t,n){if(r instanceof Ar)return r;let o=r instanceof Error?r.message:String(r),i=r instanceof Error?r:void 0;return new nC(o,i,e,t,n)}var Ar,GU,VU,qU,Fc,Jd,ph,Pb,Gu,HU,nC,WU,KU,oc,Mb,Im,$c,zc,JU,oC,iC,sC,ZU,Yke,ic=R(()=>{"use strict";Z9();Ar=class r extends Error{code;category;severity;retryable;retryAfterMs;requestId;path;method;details;cause;constructor(e,t,n={}){super(e),this.name="ServerAdapterError",this.code=t,this.category=n.category??or.EXECUTION,this.severity=n.severity??en.MEDIUM,this.retryable=n.retryable??!1,this.retryAfterMs=n.retryAfterMs,this.requestId=n.requestId,this.path=n.path,this.method=n.method,this.details=n.details,this.cause=n.cause,Error.captureStackTrace&&Error.captureStackTrace(this,r)}toJSON(){return{error:{code:this.code,message:this.message,category:this.category,requestId:this.requestId,details:this.details,retryAfter:this.retryAfterMs?Math.ceil(this.retryAfterMs/1e3):void 0}}}getHttpStatus(){switch(this.code){case Qt.VALIDATION_ERROR:case Qt.SCHEMA_ERROR:case Qt.INVALID_CONFIG:case Qt.INVALID_ROUTE:return 400;case Qt.AUTH_REQUIRED:case Qt.AUTH_INVALID:return 401;case Qt.FORBIDDEN:return 403;case Qt.ROUTE_NOT_FOUND:return 404;case Qt.RATE_LIMIT_EXCEEDED:return 429;case Qt.TIMEOUT:return 408;case Qt.STREAM_ABORTED:return 499;default:return 500}}},GU=class extends Ar{constructor(e,t,n){super(e,Qt.INVALID_CONFIG,{category:or.CONFIG,severity:en.HIGH,retryable:!1,details:t,cause:n}),this.name="ConfigurationError"}},VU=class extends Ar{constructor(e,t,n){super(`Route conflict: ${t} ${e} conflicts with existing route${n?`: ${n}`:""}`,Qt.ROUTE_CONFLICT,{category:or.CONFIG,severity:en.HIGH,retryable:!1,path:e,method:t,details:{existingRoute:n}}),this.name="RouteConflictError"}},qU=class extends Ar{constructor(e,t,n){super(`Route not found: ${t} ${e}`,Qt.ROUTE_NOT_FOUND,{category:or.VALIDATION,severity:en.LOW,retryable:!1,path:e,method:t,requestId:n}),this.name="RouteNotFoundError"}},Fc=class extends Ar{errors;constructor(e,t){super(`Validation failed: ${e.map(n=>n.message).join(", ")}`,Qt.VALIDATION_ERROR,{category:or.VALIDATION,severity:en.LOW,retryable:!1,requestId:t,details:{errors:e}}),this.name="ValidationError",this.errors=e}},Jd=class extends Ar{constructor(e="Authentication required",t){super(e,Qt.AUTH_REQUIRED,{category:or.AUTHENTICATION,severity:en.MEDIUM,retryable:!1,requestId:t}),this.name="AuthenticationError"}},ph=class extends Ar{constructor(e="Invalid authentication credentials",t){super(e,Qt.AUTH_INVALID,{category:or.AUTHENTICATION,severity:en.MEDIUM,retryable:!1,requestId:t}),this.name="InvalidAuthenticationError"}},Pb=class extends Ar{constructor(e="Access forbidden",t,n){super(e,Qt.FORBIDDEN,{category:or.AUTHORIZATION,severity:en.MEDIUM,retryable:!1,requestId:t,details:{requiredPermissions:n}}),this.name="AuthorizationError"}},Gu=class extends Ar{constructor(e,t,n){super(t??"Too many requests, please try again later",Qt.RATE_LIMIT_EXCEEDED,{category:or.RATE_LIMIT,severity:en.MEDIUM,retryable:!0,retryAfterMs:e,requestId:n}),this.name="RateLimitError"}},HU=class extends Ar{constructor(e,t,n){super(`Operation timed out after ${e}ms${t?`: ${t}`:""}`,Qt.TIMEOUT,{category:or.EXECUTION,severity:en.MEDIUM,retryable:!0,requestId:n,details:{timeoutMs:e,operation:t}}),this.name="TimeoutError"}},nC=class extends Ar{constructor(e,t,n,o,i){super(e,Qt.HANDLER_ERROR,{category:or.EXECUTION,severity:en.HIGH,retryable:!1,cause:t,requestId:n,path:o,method:i}),this.name="HandlerError"}},WU=class extends Ar{constructor(e,t,n){super(e,Qt.STREAM_ERROR,{category:or.STREAMING,severity:en.MEDIUM,retryable:!1,cause:t,requestId:n}),this.name="StreamingError"}},KU=class extends Ar{constructor(e,t){super(`Stream aborted${e?`: ${e}`:""}`,Qt.STREAM_ABORTED,{category:or.STREAMING,severity:en.LOW,retryable:!1,requestId:t,details:{reason:e}}),this.name="StreamAbortedError"}},oc=class extends Ar{constructor(e,t,n){super(e,Qt.WEBSOCKET_ERROR,{category:or.WEBSOCKET,severity:en.MEDIUM,retryable:!0,cause:t,details:{connectionId:n}}),this.name="WebSocketError"}},Mb=class extends Ar{constructor(e="WebSocket connection failed",t){super(e,Qt.WEBSOCKET_CONNECTION_FAILED,{category:or.WEBSOCKET,severity:en.HIGH,retryable:!0,cause:t}),this.name="WebSocketConnectionError"}},Im=class extends Ar{constructor(e,t,n,o){super(e,Qt.START_FAILED,{category:or.CONFIG,severity:en.CRITICAL,retryable:!0,cause:t,details:{port:n,host:o}}),this.name="ServerStartError"}},$c=class extends Ar{constructor(e,t){super(e,Qt.STOP_FAILED,{category:or.EXECUTION,severity:en.HIGH,retryable:!1,cause:t}),this.name="ServerStopError"}},zc=class extends Ar{constructor(e,t){super(`Server is already running${e&&t?` on ${t}:${e}`:""}`,Qt.ALREADY_RUNNING,{category:or.CONFIG,severity:en.LOW,retryable:!1,details:{port:e,host:t}}),this.name="AlreadyRunningError"}},JU=class extends Ar{constructor(){super("Server is not running",Qt.NOT_RUNNING,{category:or.CONFIG,severity:en.LOW,retryable:!1}),this.name="NotRunningError"}},oC=class extends Ar{timeoutMs;remainingConnections;constructor(e,t){super(`Shutdown timed out after ${e}ms with ${t} active connection(s)`,Qt.STOP_FAILED,{category:or.EXECUTION,severity:en.HIGH,retryable:!1,details:{timeoutMs:e,remainingConnections:t}}),this.name="ShutdownTimeoutError",this.timeoutMs=e,this.remainingConnections=t}},iC=class extends Ar{timeoutMs;remainingConnections;constructor(e,t){super(`Connection drain timed out after ${e}ms with ${t} active connection(s)`,Qt.STOP_FAILED,{category:or.EXECUTION,severity:en.MEDIUM,retryable:!1,details:{timeoutMs:e,remainingConnections:t}}),this.name="DrainTimeoutError",this.timeoutMs=e,this.remainingConnections=t}},sC=class extends Ar{currentState;expectedStates;operation;constructor(e,t,n){super(`Cannot ${e}: server is in '${t}' state, expected one of [${n.join(", ")}]`,Qt.STOP_FAILED,{category:or.CONFIG,severity:en.MEDIUM,retryable:!1,details:{operation:e,currentState:t,expectedStates:n}}),this.name="InvalidLifecycleStateError",this.currentState=t,this.expectedStates=n,this.operation=e}},ZU=class extends Ar{constructor(e,t,n){super(`Missing dependency '${e}' for ${t} adapter. ${n?`Install with: ${n}`:""}`,Qt.MISSING_DEPENDENCY,{category:or.CONFIG,severity:en.CRITICAL,retryable:!1,details:{dependency:e,framework:t,installCommand:n}}),this.name="MissingDependencyError"}},Yke={[or.CONFIG]:{strategy:"fail",maxRetries:0,baseDelayMs:0},[or.VALIDATION]:{strategy:"fail",maxRetries:0,baseDelayMs:0},[or.EXECUTION]:{strategy:"retry",maxRetries:3,baseDelayMs:1e3},[or.EXTERNAL]:{strategy:"exponentialBackoff",maxRetries:5,baseDelayMs:1e3},[or.RATE_LIMIT]:{strategy:"exponentialBackoff",maxRetries:3,baseDelayMs:5e3},[or.AUTHENTICATION]:{strategy:"fail",maxRetries:0,baseDelayMs:0},[or.AUTHORIZATION]:{strategy:"fail",maxRetries:0,baseDelayMs:0},[or.STREAMING]:{strategy:"retry",maxRetries:2,baseDelayMs:500},[or.WEBSOCKET]:{strategy:"exponentialBackoff",maxRetries:5,baseDelayMs:1e3}}});var jc,Ob=R(()=>{"use strict";Io();rr();rr();Et();oe();ic();jc=class extends lr{config;redactionConfig;neurolink;toolRegistry;externalServerManager;routes=new Map;middlewares=[];isRunning=!1;startTime;lifecycleState="uninitialized";activeConnections=new Map;shutdownConfig;constructor(e,t={}){super(),this.neurolink=e,this.toolRegistry=e.getToolRegistry(),this.externalServerManager=e.getExternalServerManager(),this.redactionConfig=t.redaction,this.shutdownConfig={gracefulShutdownTimeoutMs:t.shutdown?.gracefulShutdownTimeoutMs??3e4,drainTimeoutMs:t.shutdown?.drainTimeoutMs??15e3,forceClose:t.shutdown?.forceClose??!0},this.config={port:t.port??3e3,host:t.host??"0.0.0.0",basePath:t.basePath??"/api",cors:{enabled:t.cors?.enabled??!0,origins:t.cors?.origins??["*"],methods:t.cors?.methods??["GET","POST","PUT","DELETE","PATCH","OPTIONS"],headers:t.cors?.headers??["Content-Type","Authorization","X-Request-ID"],credentials:t.cors?.credentials??!1,maxAge:t.cors?.maxAge??86400},rateLimit:{enabled:t.rateLimit?.enabled??!0,windowMs:t.rateLimit?.windowMs??900*1e3,maxRequests:t.rateLimit?.maxRequests??100,message:t.rateLimit?.message??"Too many requests, please try again later",skipPaths:t.rateLimit?.skipPaths,keyGenerator:t.rateLimit?.keyGenerator},bodyParser:{enabled:t.bodyParser?.enabled??!0,maxSize:t.bodyParser?.maxSize??"10mb",jsonLimit:t.bodyParser?.jsonLimit??"10mb",urlEncoded:t.bodyParser?.urlEncoded??!0},logging:{enabled:t.logging?.enabled??!0,level:t.logging?.level??"info",includeBody:t.logging?.includeBody??!1,includeResponse:t.logging?.includeResponse??!1},timeout:t.timeout??3e4,enableMetrics:t.enableMetrics??!0,enableSwagger:t.enableSwagger??!1,disableBuiltInHealth:t.disableBuiltInHealth??!1,shutdown:this.shutdownConfig}}async initialize(){if(this.lifecycleState!=="uninitialized"&&this.lifecycleState!=="stopped")throw new sC("initialize",this.lifecycleState,["uninitialized","stopped"]);this.lifecycleState="initializing",g.info("[ServerAdapter] Initializing server adapter",{port:this.config.port,host:this.config.host,basePath:this.config.basePath});let e=ye.createSpan("server.request","server.initialize",{"server.operation":"initialize","server.port":this.config.port,"server.host":this.config.host}),t=Date.now();try{this.initializeFramework(),this.registerBuiltInMiddleware(),await this.registerBuiltInRoutes(),this.lifecycleState="initialized",this.emit("initialized",{config:this.config,routeCount:this.routes.size,middlewareCount:this.middlewares.length}),g.info("[ServerAdapter] Server adapter initialized",{routes:this.routes.size,middlewares:this.middlewares.length}),e.durationMs=Date.now()-t;let n=ye.endSpan(e,1);Ne().recordSpan(n)}catch(n){this.lifecycleState="error",e.durationMs=Date.now()-t;let o=ye.endSpan(e,2);throw o.statusMessage=n instanceof Error?n.message:String(n),Ne().recordSpan(o),n}}registerRoute(e){let t=`${e.method.toUpperCase()}:${e.path}`;this.routes.has(t)&&g.warn(`[ServerAdapter] Route ${t} already exists, replacing`),this.routes.set(t,e),this.registerFrameworkRoute(e),g.debug(`[ServerAdapter] Registered route: ${t}`,{description:e.description,streaming:e.streaming?.enabled,auth:e.auth})}registerRouteGroup(e){if(e.middleware)for(let t of e.middleware)this.registerMiddleware({...t,paths:t.paths??[e.prefix]});for(let t of e.routes){let n=!t.path.startsWith(e.prefix),o=this.normalizePath(n?`${e.prefix}${t.path}`:t.path),i={...t,path:o};this.registerRoute(i)}g.debug(`[ServerAdapter] Registered route group: ${e.prefix}`,{routes:e.routes.length,middleware:e.middleware?.length??0})}normalizePath(e){return"/"+e.split("/").filter(Boolean).join("/")}registerMiddleware(e){this.middlewares.push(e),this.registerFrameworkMiddleware(e),g.debug(`[ServerAdapter] Registered middleware: ${e.name}`,{order:e.order,paths:e.paths})}createContext(e){return{requestId:e.requestId,method:e.method,path:e.path,headers:e.headers,query:e.query??{},params:e.params??{},body:e.body,neurolink:this.neurolink,toolRegistry:this.toolRegistry,externalServerManager:this.externalServerManager,timestamp:Date.now(),metadata:{},redaction:this.redactionConfig}}registerBuiltInMiddleware(){this.registerMiddleware({name:"requestId",order:0,handler:async(e,t)=>(e.requestId=e.requestId||this.generateRequestId(),t())}),this.config.logging.enabled&&this.registerMiddleware({name:"logging",order:1,handler:async(e,t)=>{let n=Date.now();g.info(`[ServerAdapter] ${e.method} ${e.path}`,{requestId:e.requestId});let o=await t();return g.info(`[ServerAdapter] ${e.method} ${e.path} completed`,{requestId:e.requestId,duration:Date.now()-n}),o}})}async registerBuiltInRoutes(){this.config.disableBuiltInHealth||(this.registerRoute({method:"GET",path:`${this.config.basePath}/health`,handler:async()=>({status:"ok",timestamp:new Date().toISOString(),uptime:this.startTime?Date.now()-this.startTime.getTime():0,version:process.env.npm_package_version||"unknown"}),description:"Health check endpoint",tags:["system"]}),this.registerRoute({method:"GET",path:`${this.config.basePath}/ready`,handler:async e=>{let t=e.toolRegistry,n=this.config.timeout||5e3,o,i;try{o=await We(t.listTools(),n,new Error(`toolRegistry.listTools timed out after ${n}ms`)),i=o.length>0}catch(s){g.warn("[ServerAdapter] Tool registry check timed out",{timeout:n,error:s instanceof Error?s.message:String(s)}),i=!1}return{ready:!0,timestamp:new Date().toISOString(),services:{neurolink:!0,tools:i,externalServers:!!e.externalServerManager}}},description:"Readiness check endpoint",tags:["system"]})),this.config.enableMetrics&&this.registerRoute({method:"GET",path:`${this.config.basePath}/metrics`,handler:async()=>{let e=this.getStatus();return{server:{running:e.running,uptime:e.uptime,routes:e.routes,middlewares:e.middlewares},process:{memoryUsage:process.memoryUsage(),cpuUsage:process.cpuUsage(),pid:process.pid},timestamp:new Date().toISOString()}},description:"Server metrics endpoint",tags:["system"]})}generateRequestId(){return`req-${Date.now()}-${Math.random().toString(36).substring(2,11)}`}getLifecycleState(){return this.lifecycleState}trackConnection(e,t,n){this.activeConnections.set(e,{id:e,createdAt:Date.now(),socket:t,requestId:n,isActive:!0}),g.debug("[ServerAdapter] Connection tracked",{connectionId:e,activeConnections:this.activeConnections.size})}untrackConnection(e){this.activeConnections.delete(e)&&g.debug("[ServerAdapter] Connection untracked",{connectionId:e,activeConnections:this.activeConnections.size})}getActiveConnectionCount(){return this.activeConnections.size}async gracefulShutdown(){let{gracefulShutdownTimeoutMs:e,drainTimeoutMs:t,forceClose:n}=this.shutdownConfig;g.info("[ServerAdapter] Starting graceful shutdown",{activeConnections:this.activeConnections.size,gracefulShutdownTimeoutMs:e,drainTimeoutMs:t});let o=ye.createSpan("server.request","server.shutdown",{"server.operation":"gracefulShutdown","server.activeConnections":this.activeConnections.size}),i=Date.now(),s,a;try{this.lifecycleState="draining",await this.stopAcceptingConnections(),g.info("[ServerAdapter] Stopped accepting new connections");let l=this.drainConnections(),u=new Promise((f,h)=>{s=setTimeout(()=>{h(new oC(e,this.activeConnections.size))},e)}),d=new Promise(f=>{a=setTimeout(()=>{f("drain_timeout")},t)});if(await Promise.race([l,d])==="drain_timeout"&&this.activeConnections.size>0)if(g.warn("[ServerAdapter] Drain timeout reached",{remainingConnections:this.activeConnections.size}),n)g.info("[ServerAdapter] Force closing remaining connections"),await this.forceCloseConnections();else throw new iC(t,this.activeConnections.size);this.lifecycleState="stopping",await Promise.race([this.closeServer(),u]),g.info("[ServerAdapter] Server closed successfully"),o.durationMs=Date.now()-i;let m=ye.endSpan(o,1);Ne().recordSpan(m)}catch(l){if(n&&(l instanceof oC||l instanceof iC)){g.warn("[ServerAdapter] Timeout during shutdown, forcing close",{error:l.message}),await this.forceCloseConnections(),await this.closeServer(),o.durationMs=Date.now()-i;let u=ye.endSpan(o,1);Ne().recordSpan(u)}else{this.lifecycleState="error",o.durationMs=Date.now()-i;let u=ye.endSpan(o,2);throw u.statusMessage=l instanceof Error?l.message:String(l),Ne().recordSpan(u),l}}finally{s&&clearTimeout(s),a&&clearTimeout(a)}}async drainConnections(){if(this.activeConnections.size===0){g.debug("[ServerAdapter] No active connections to drain");return}return g.info("[ServerAdapter] Draining connections",{count:this.activeConnections.size}),new Promise(e=>{let t=setInterval(()=>{this.activeConnections.size===0&&(clearInterval(t),g.info("[ServerAdapter] All connections drained"),e())},100)})}resetServerState(){this.isRunning=!1,this.startTime=void 0,this.activeConnections.clear(),this.lifecycleState="stopped",g.debug("[ServerAdapter] Server state reset for restart capability")}validateLifecycleState(e,t){if(!t.includes(this.lifecycleState))throw new sC(e,this.lifecycleState,t)}getStatus(){return{running:this.isRunning,port:this.config.port,host:this.config.host,uptime:this.startTime?Date.now()-this.startTime.getTime():0,routes:this.routes.size,middlewares:this.middlewares.length,lifecycleState:this.lifecycleState,activeConnections:this.activeConnections.size}}listRoutes(){return Array.from(this.routes.values())}getConfig(){return{...this.config}}}});function Zd(r){return typeof r=="object"&&r!==null&&"error"in r&&typeof r.error=="object"&&r.error!==null&&"code"in r.error&&"message"in r.error}function J2t(r){return{VALIDATION_ERROR:400,SCHEMA_ERROR:400,TOOL_NOT_FOUND:404,SERVER_NOT_FOUND:404,SESSION_NOT_FOUND:404,NOT_FOUND:404,AUTH_REQUIRED:401,AUTH_INVALID:401,FORBIDDEN:403,RATE_LIMIT_EXCEEDED:429,MCP_UNAVAILABLE:503,MEMORY_UNAVAILABLE:503,EXECUTION_FAILED:500,INTERNAL_ERROR:500}[r]??500}function Lt(r,e,t,n,o){return{error:{code:r,message:e,details:t},metadata:{timestamp:new Date().toISOString(),requestId:n},httpStatus:o??J2t(r)}}function Bc(r,e,t){let n=r.safeParse(e);return n.success?{success:!0,data:n.data}:{success:!1,error:Lt("VALIDATION_ERROR","Invalid request body",n.error.issues.map(o=>({path:o.path.join("."),message:o.message,code:o.code})),t)}}function rRe(r,e,t){let n=r.safeParse(e);return n.success?{success:!0,data:n.data}:{success:!1,error:Lt("VALIDATION_ERROR","Invalid query parameters",n.error.issues.map(o=>({path:o.path.join("."),message:o.message,code:o.code})),t)}}function ds(r,e,t){let n=r.safeParse(e);return n.success?{success:!0,data:n.data}:{success:!1,error:Lt("VALIDATION_ERROR","Invalid path parameters",n.error.issues.map(o=>({path:o.path.join("."),message:o.message,code:o.code})),t)}}var aC,XU,Nb,YU,mh,cC,Qke,X9,QZr,eXr,eRe,tRe,qu=R(()=>{"use strict";po();aC=c.object({input:c.union([c.string(),c.object({text:c.string(),images:c.array(c.string()).optional(),files:c.array(c.string()).optional()})]),provider:c.string().optional(),model:c.string().optional(),systemPrompt:c.string().optional(),temperature:c.number().min(0).max(2).optional(),maxTokens:c.number().positive().optional(),tools:c.array(c.string()).optional(),stream:c.boolean().optional(),sessionId:c.string().optional(),userId:c.string().optional()}),XU=c.object({name:c.string().min(1,"Tool name is required"),arguments:c.record(c.string(),c.unknown()).default({}),sessionId:c.string().optional(),userId:c.string().optional()}),Nb=c.record(c.string(),c.unknown()),YU=c.object({sessionId:c.string().min(1,"Session ID is required")}),mh=c.object({name:c.string().min(1,"Server name is required")}),cC=c.object({name:c.string().min(1,"Tool name is required")}),Qke=c.object({q:c.string().optional(),source:c.string().optional(),limit:c.string().transform(r=>parseInt(r,10)).pipe(c.number().positive().max(100)).optional()}),X9=c.object({id:c.string().min(1,"Session ID is required")}),QZr=c.object({userId:c.string().optional(),limit:c.string().transform(r=>parseInt(r,10)).pipe(c.number().positive().max(100)).optional(),offset:c.string().transform(r=>parseInt(r,10)).pipe(c.number().nonnegative()).optional()}),eXr=c.object({limit:c.string().transform(r=>parseInt(r,10)).pipe(c.number().positive().max(100)).optional(),offset:c.string().transform(r=>parseInt(r,10)).pipe(c.number().nonnegative()).optional()}),eRe=c.object({text:c.string().min(1,"Text is required"),provider:c.string().optional(),model:c.string().optional()}),tRe=c.object({texts:c.array(c.string().min(1)).min(1,"At least one text is required").max(2048,"Maximum 2048 texts per batch"),provider:c.string().optional(),model:c.string().optional()})});var nRe={};me(nRe,{Agent:()=>Rzt,BedrockClient:()=>X2t,BedrockRuntimeClient:()=>Q2t,Blob:()=>kzt,Client:()=>Azt,ConverseCommand:()=>ezt,ConverseStreamCommand:()=>tzt,Dispatcher:()=>Pzt,File:()=>Czt,FormData:()=>Ezt,GoogleAuth:()=>szt,HTTPException:()=>hzt,Headers:()=>wzt,Hippocampus:()=>lzt,HippocampusConfig:()=>uzt,Hono:()=>fzt,ImageFormat:()=>rzt,InvokeEndpointCommand:()=>ozt,InvokeEndpointWithResponseStreamCommand:()=>izt,ListFoundationModelsCommand:()=>Y2t,MockAgent:()=>Nzt,Pool:()=>Izt,Request:()=>Szt,Response:()=>_zt,SageMakerRuntimeClient:()=>nzt,TextToSpeechClient:()=>czt,VertexAI:()=>azt,cors:()=>gzt,createClient:()=>dzt,default:()=>Z2t,fetch:()=>Tzt,getGlobalDispatcher:()=>Ozt,interceptors:()=>Dzt,logger:()=>yzt,parseBuffer:()=>pzt,request:()=>Lzt,secureHeaders:()=>vzt,selectCover:()=>mzt,setGlobalDispatcher:()=>Mzt,streamSSE:()=>xzt,timeout:()=>bzt});var Db,ps,Z2t,X2t,Y2t,Q2t,ezt,tzt,rzt,nzt,ozt,izt,szt,azt,czt,lzt,uzt,dzt,pzt,mzt,fzt,gzt,hzt,yzt,vzt,xzt,bzt,Tzt,Szt,_zt,wzt,Ezt,Czt,kzt,Rzt,Izt,Azt,Pzt,Mzt,Ozt,Nzt,Dzt,Lzt,oRe=R(()=>{Db={get(r,e){return e==="__esModule"?!0:e==="default"?new Proxy({},{get:Db.get}):new Proxy(function(...t){return new Proxy({},{get:Db.get})},{get:Db.get,apply(t,n,o){return new Proxy({},{get:Db.get})},construct(t,n){return new Proxy({},{get:Db.get})}})}},ps=new Proxy({},Db),Z2t=ps,{BedrockClient:X2t,ListFoundationModelsCommand:Y2t,BedrockRuntimeClient:Q2t,ConverseCommand:ezt,ConverseStreamCommand:tzt,ImageFormat:rzt}=ps,{SageMakerRuntimeClient:nzt,InvokeEndpointCommand:ozt,InvokeEndpointWithResponseStreamCommand:izt}=ps,{GoogleAuth:szt,VertexAI:azt,TextToSpeechClient:czt}=ps,{Hippocampus:lzt,HippocampusConfig:uzt}=ps,{createClient:dzt}=ps,{parseBuffer:pzt,selectCover:mzt}=ps,{Hono:fzt}=ps,{cors:gzt,HTTPException:hzt,logger:yzt,secureHeaders:vzt,streamSSE:xzt,timeout:bzt}=ps,Tzt=globalThis.fetch,Szt=globalThis.Request,_zt=globalThis.Response,wzt=globalThis.Headers,Ezt=globalThis.FormData,Czt=globalThis.File,kzt=globalThis.Blob,Rzt=ps.Agent,Izt=ps.Pool,Azt=ps.Client,Pzt=ps.Dispatcher,Mzt=()=>{},Ozt=()=>ps,Nzt=ps.MockAgent,Dzt={redirect:()=>r=>r,retry:()=>r=>r},Lzt=async(r,e)=>{let t=await globalThis.fetch(r,e);return{statusCode:t.status,headers:Object.fromEntries(t.headers.entries()),body:{text:()=>t.text(),json:()=>t.json(),arrayBuffer:()=>t.arrayBuffer()}}}});var iRe={};me(iRe,{Agent:()=>gjt,BedrockClient:()=>Fzt,BedrockRuntimeClient:()=>zzt,Blob:()=>fjt,Client:()=>yjt,ConverseCommand:()=>jzt,ConverseStreamCommand:()=>Bzt,Dispatcher:()=>vjt,File:()=>mjt,FormData:()=>pjt,GoogleAuth:()=>Wzt,HTTPException:()=>njt,Headers:()=>djt,Hippocampus:()=>Zzt,HippocampusConfig:()=>Xzt,Hono:()=>tjt,ImageFormat:()=>Gzt,InvokeEndpointCommand:()=>qzt,InvokeEndpointWithResponseStreamCommand:()=>Hzt,ListFoundationModelsCommand:()=>$zt,MockAgent:()=>Tjt,Pool:()=>hjt,Request:()=>ljt,Response:()=>ujt,SageMakerRuntimeClient:()=>Vzt,TextToSpeechClient:()=>Jzt,VertexAI:()=>Kzt,cors:()=>rjt,createClient:()=>Yzt,default:()=>Uzt,fetch:()=>cjt,getGlobalDispatcher:()=>bjt,interceptors:()=>Sjt,logger:()=>ojt,parseBuffer:()=>Qzt,request:()=>_jt,secureHeaders:()=>ijt,selectCover:()=>ejt,setGlobalDispatcher:()=>xjt,streamSSE:()=>sjt,timeout:()=>ajt});var Lb,ms,Uzt,Fzt,$zt,zzt,jzt,Bzt,Gzt,Vzt,qzt,Hzt,Wzt,Kzt,Jzt,Zzt,Xzt,Yzt,Qzt,ejt,tjt,rjt,njt,ojt,ijt,sjt,ajt,cjt,ljt,ujt,djt,pjt,mjt,fjt,gjt,hjt,yjt,vjt,xjt,bjt,Tjt,Sjt,_jt,sRe=R(()=>{Lb={get(r,e){return e==="__esModule"?!0:e==="default"?new Proxy({},{get:Lb.get}):new Proxy(function(...t){return new Proxy({},{get:Lb.get})},{get:Lb.get,apply(t,n,o){return new Proxy({},{get:Lb.get})},construct(t,n){return new Proxy({},{get:Lb.get})}})}},ms=new Proxy({},Lb),Uzt=ms,{BedrockClient:Fzt,ListFoundationModelsCommand:$zt,BedrockRuntimeClient:zzt,ConverseCommand:jzt,ConverseStreamCommand:Bzt,ImageFormat:Gzt}=ms,{SageMakerRuntimeClient:Vzt,InvokeEndpointCommand:qzt,InvokeEndpointWithResponseStreamCommand:Hzt}=ms,{GoogleAuth:Wzt,VertexAI:Kzt,TextToSpeechClient:Jzt}=ms,{Hippocampus:Zzt,HippocampusConfig:Xzt}=ms,{createClient:Yzt}=ms,{parseBuffer:Qzt,selectCover:ejt}=ms,{Hono:tjt}=ms,{cors:rjt,HTTPException:njt,logger:ojt,secureHeaders:ijt,streamSSE:sjt,timeout:ajt}=ms,cjt=globalThis.fetch,ljt=globalThis.Request,ujt=globalThis.Response,djt=globalThis.Headers,pjt=globalThis.FormData,mjt=globalThis.File,fjt=globalThis.Blob,gjt=ms.Agent,hjt=ms.Pool,yjt=ms.Client,vjt=ms.Dispatcher,xjt=()=>{},bjt=()=>ms,Tjt=ms.MockAgent,Sjt={redirect:()=>r=>r,retry:()=>r=>r},_jt=async(r,e)=>{let t=await globalThis.fetch(r,e);return{statusCode:t.status,headers:Object.fromEntries(t.headers.entries()),body:{text:()=>t.text(),json:()=>t.json(),arrayBuffer:()=>t.arrayBuffer()}}}});var aRe={};me(aRe,{Agent:()=>rBt,BedrockClient:()=>Ejt,BedrockRuntimeClient:()=>kjt,Blob:()=>tBt,Client:()=>oBt,ConverseCommand:()=>Rjt,ConverseStreamCommand:()=>Ijt,Dispatcher:()=>iBt,File:()=>eBt,FormData:()=>Qjt,GoogleAuth:()=>Njt,HTTPException:()=>Vjt,Headers:()=>Yjt,Hippocampus:()=>Ujt,HippocampusConfig:()=>Fjt,Hono:()=>Bjt,ImageFormat:()=>Ajt,InvokeEndpointCommand:()=>Mjt,InvokeEndpointWithResponseStreamCommand:()=>Ojt,ListFoundationModelsCommand:()=>Cjt,MockAgent:()=>cBt,Pool:()=>nBt,Request:()=>Zjt,Response:()=>Xjt,SageMakerRuntimeClient:()=>Pjt,TextToSpeechClient:()=>Ljt,VertexAI:()=>Djt,cors:()=>Gjt,createClient:()=>$jt,default:()=>wjt,fetch:()=>Jjt,getGlobalDispatcher:()=>aBt,interceptors:()=>lBt,logger:()=>qjt,parseBuffer:()=>zjt,request:()=>uBt,secureHeaders:()=>Hjt,selectCover:()=>jjt,setGlobalDispatcher:()=>sBt,streamSSE:()=>Wjt,timeout:()=>Kjt});var Ub,fs,wjt,Ejt,Cjt,kjt,Rjt,Ijt,Ajt,Pjt,Mjt,Ojt,Njt,Djt,Ljt,Ujt,Fjt,$jt,zjt,jjt,Bjt,Gjt,Vjt,qjt,Hjt,Wjt,Kjt,Jjt,Zjt,Xjt,Yjt,Qjt,eBt,tBt,rBt,nBt,oBt,iBt,sBt,aBt,cBt,lBt,uBt,cRe=R(()=>{Ub={get(r,e){return e==="__esModule"?!0:e==="default"?new Proxy({},{get:Ub.get}):new Proxy(function(...t){return new Proxy({},{get:Ub.get})},{get:Ub.get,apply(t,n,o){return new Proxy({},{get:Ub.get})},construct(t,n){return new Proxy({},{get:Ub.get})}})}},fs=new Proxy({},Ub),wjt=fs,{BedrockClient:Ejt,ListFoundationModelsCommand:Cjt,BedrockRuntimeClient:kjt,ConverseCommand:Rjt,ConverseStreamCommand:Ijt,ImageFormat:Ajt}=fs,{SageMakerRuntimeClient:Pjt,InvokeEndpointCommand:Mjt,InvokeEndpointWithResponseStreamCommand:Ojt}=fs,{GoogleAuth:Njt,VertexAI:Djt,TextToSpeechClient:Ljt}=fs,{Hippocampus:Ujt,HippocampusConfig:Fjt}=fs,{createClient:$jt}=fs,{parseBuffer:zjt,selectCover:jjt}=fs,{Hono:Bjt}=fs,{cors:Gjt,HTTPException:Vjt,logger:qjt,secureHeaders:Hjt,streamSSE:Wjt,timeout:Kjt}=fs,Jjt=globalThis.fetch,Zjt=globalThis.Request,Xjt=globalThis.Response,Yjt=globalThis.Headers,Qjt=globalThis.FormData,eBt=globalThis.File,tBt=globalThis.Blob,rBt=fs.Agent,nBt=fs.Pool,oBt=fs.Client,iBt=fs.Dispatcher,sBt=()=>{},aBt=()=>fs,cBt=fs.MockAgent,lBt={redirect:()=>r=>r,retry:()=>r=>r},uBt=async(r,e)=>{let t=await globalThis.fetch(r,e);return{statusCode:t.status,headers:Object.fromEntries(t.headers.entries()),body:{text:()=>t.text(),json:()=>t.json(),arrayBuffer:()=>t.arrayBuffer()}}}});var lRe={};me(lRe,{ExpressServerAdapter:()=>lC});var lC,Y9=R(()=>{"use strict";oe();ic();Ob();qu();lC=class extends jc{app;server;frameworkInitialized=!1;sockets=new Set;constructor(e,t={}){super(e,t)}initializeFramework(){}async initializeFrameworkAsync(){if(this.frameworkInitialized)return;let t=(await Promise.resolve().then(()=>(oRe(),nRe))).default;if(this.app=t(),this.config.bodyParser.enabled){let n=this.config.bodyParser.maxSize||this.config.bodyParser.jsonLimit||"10mb";this.app.use(t.json({limit:this.config.bodyParser.jsonLimit||n})),this.app.use(t.urlencoded({extended:!0,limit:n}))}if(this.config.cors.enabled){let o=(await Promise.resolve().then(()=>(sRe(),iRe))).default;this.app.use(o({origin:this.config.cors.origins,methods:this.config.cors.methods,allowedHeaders:this.config.cors.headers,credentials:this.config.cors.credentials,maxAge:this.config.cors.maxAge}))}if(this.config.rateLimit.enabled){let o=(await Promise.resolve().then(()=>(cRe(),aRe))).default,i=this.config.rateLimit.windowMs,s=o({windowMs:i,max:this.config.rateLimit.maxRequests,message:{error:{code:"RATE_LIMIT_EXCEEDED",message:this.config.rateLimit.message}},standardHeaders:!0,legacyHeaders:!1,handler:(a,l)=>{let u=Math.ceil(i/1e3);l.setHeader("Retry-After",String(u)),l.status(429).json({error:{code:"RATE_LIMIT_EXCEEDED",message:this.config.rateLimit.message},metadata:{timestamp:new Date().toISOString(),retryAfter:u}})}});this.app.use(s)}this.app.use((n,o,i)=>{let s=n.headers["x-request-id"]||this.generateRequestId();n.headers["x-request-id"]=s,o.setHeader("X-Request-ID",s),i()}),this.config.logging.enabled&&this.app.use((n,o,i)=>{let s=Date.now(),a=n.headers["x-request-id"];g.info(`[ExpressAdapter] ${n.method} ${n.path}`,{requestId:a}),o.on("finish",()=>{g.info(`[ExpressAdapter] ${n.method} ${n.path} ${o.statusCode}`,{requestId:a,duration:Date.now()-s})}),i()}),this.frameworkInitialized=!0}async initialize(){await this.initializeFrameworkAsync(),await super.initialize()}registerFrameworkRoute(e){let t=e.method.toLowerCase();this.app[t](e.path,async(n,o,i)=>{let s=n.headers["x-request-id"],a=Date.now(),l=this.createContext({requestId:s,method:n.method,path:n.path,headers:n.headers,query:n.query,params:n.params,body:n.body});o.locals.responseHeaders&&(l.responseHeaders={...o.locals.responseHeaders}),this.emit("request",{requestId:s,method:l.method,path:l.path,timestamp:new Date});try{if(e.streaming?.enabled)return this.handleStreamingResponse(o,l,e);let u=await e.handler(l),d=Date.now()-a;if(Zd(u)){let p=u.httpStatus??500;if(this.emit("response",{requestId:s,statusCode:p,duration:d,timestamp:new Date}),l.responseHeaders)for(let[m,f]of Object.entries(l.responseHeaders))o.setHeader(m,f);o.status(p).json({error:u.error,metadata:{...u.metadata,requestId:s,timestamp:new Date().toISOString(),duration:d}});return}if(this.emit("response",{requestId:s,statusCode:200,duration:d,timestamp:new Date}),l.responseHeaders)for(let[p,m]of Object.entries(l.responseHeaders))o.setHeader(p,m);o.json({data:u,metadata:{requestId:s,timestamp:new Date().toISOString(),duration:d}})}catch(u){i(u)}}),this.setupErrorHandler()}errorHandlerRegistered=!1;setupErrorHandler(){this.errorHandlerRegistered||(this.errorHandlerRegistered=!0,this.app.use((e,t,n,o)=>{let i=t.headers["x-request-id"];g.error("[ExpressAdapter] Request error",{requestId:i,error:e.message,stack:e.stack}),this.emit("error",{requestId:i,error:e,timestamp:new Date});let s=e instanceof Ar,a=s?e.getHttpStatus():500,l=s?e.code:"INTERNAL_ERROR",u=s?e.message:"An internal error occurred";n.status(a).json({error:{code:l,message:u},metadata:{requestId:i,timestamp:new Date().toISOString()}})}))}async handleStreamingResponse(e,t,n){e.setHeader("Content-Type","text/event-stream"),e.setHeader("Cache-Control","no-cache"),e.setHeader("Connection","keep-alive");try{let o=await n.handler(t);if(o&&typeof o=="object"&&Symbol.asyncIterator in o)for await(let i of o)e.write(`event: message
|
|
2034
|
+
IMPORTANT: You have a tool called "${l.toolName}" that searches through`,`${l.filesLoaded} loaded document(s) containing ${l.chunksIndexed} indexed chunks.`,`ALWAYS use the "${l.toolName}" tool FIRST to answer the user's question before using any other tools.`,"This tool searches your local knowledge base of pre-loaded documents and is the primary source of truth.","Do NOT use websearchGrounding or any web search tools when the answer can be found in the loaded documents."].join(" ");e.systemPrompt=(e.systemPrompt||"")+u,g.info("[RAG] Tool injected into stream()",{toolName:l.toolName,filesLoaded:l.filesLoaded,chunksIndexed:l.chunksIndexed})}catch(a){g.warn("[RAG] Failed to prepare RAG tool, continuing without RAG",{error:a instanceof Error?a.message:String(a)})}let i=t0e(e),s=r0e(e);if(e.input?.text){let{toolResults:a,enhancedPrompt:l}=await this.detectAndExecuteTools(e.input.text,void 0);l!==e.input.text&&(s.input.text=l)}return{enhancedOptions:s,factoryResult:i}}async autoDisableOllamaStreamTools(e){if((e.provider==="ollama"||e.provider?.toLowerCase().includes("ollama"))&&!e.disableTools){let{ModelConfigurationManager:t}=await Promise.resolve().then(()=>(Yp(),Wge)),i=t.getInstance().getProviderConfiguration("ollama")?.modelBehavior?.toolCapableModels||[],s=e.model;i.length>0&&s&&(i.some(l=>s.toLowerCase().includes(l.toLowerCase()))||(e.disableTools=!0,g.debug("Auto-disabled tools for Ollama model that doesn't support them (stream)",{model:e.model,toolCapableModels:i.slice(0,3)})))}}setupStreamEventListeners(){let e=[],t=0,n=(p,m)=>{e.push({type:p,seq:t++,timestamp:Date.now(),...m&&typeof m=="object"?m:{data:m}})},o=(...p)=>{let m=p[0];n("response:chunk",{content:m})},i=(...p)=>{let m=p[0];n("tool:start",m)},s=(...p)=>{let m=p[0];n("tool:end",m),m.result&&m.result.uiComponent===!0&&n("ui-component",{toolName:m.toolName,componentData:m.result,timestamp:Date.now()})},a=(...p)=>{n("ui-component",p[0])},l=(...p)=>{n("hitl:confirmation-request",p[0])},u=(...p)=>{n("hitl:confirmation-response",p[0])};return this.emitter.on("response:chunk",o),this.emitter.on("tool:start",i),this.emitter.on("tool:end",s),this.emitter.on("ui-component",a),this.emitter.on("hitl:confirmation-request",l),this.emitter.on("hitl:confirmation-response",u),{eventSequence:e,cleanup:()=>{this.emitter.off("response:chunk",o),this.emitter.off("tool:start",i),this.emitter.off("tool:end",s),this.emitter.off("ui-component",a),this.emitter.off("hitl:confirmation-request",l),this.emitter.off("hitl:confirmation-response",u)}}}async*handleStreamFallback(e,t,n,o,i,s){e.fallbackAttempted=!0;let a="Stream completed with 0 chunks (possible guardrails block)";e.error=a;try{let u=this._metricsTraceContext,d=ye.createGenerationSpan({provider:o,model:n.model||"unknown",name:`gen_ai.${o}.stream.failed`,traceId:u?.traceId,parentSpanId:u?.parentSpanId});d=ye.endSpan(d,2),d.statusMessage=a,d.durationMs=0,this.metricsAggregator.recordSpan(d),Ne().recordSpan(d)}catch{}let l=hb.getFallbackRoute(t||n.input.text||"",{provider:o,model:n.model||"gpt-4o",reasoning:"primary failed",confidence:.5},{fallbackStrategy:"auto"});g.warn("Retrying with fallback provider",{originalProvider:o,fallbackProvider:l.provider,reason:a});try{let u=await br.createProvider(l.provider,l.model);u.setupToolExecutor({customTools:this.getCustomTools(),executeTool:(f,h)=>this.executeTool(f,h,{disableToolCache:n.disableToolCache})},"NeuroLink.fallbackStream");let d=n.conversationMessages!==void 0?n.conversationMessages:await Bg(this.conversationMemory,{prompt:n.input.text,context:n.context}),p=await u.stream({...n,model:l.model,conversationMessages:d}),m=0;for await(let f of p.stream)m++,f&&"content"in f&&typeof f.content=="string"&&(s(f.content),this.emitter.emit("response:chunk",f.content)),yield f;if(m===0)throw new Error(`Fallback provider ${l.provider} also returned 0 chunks`);e.fallbackProvider=l.provider,e.fallbackModel=l.model,e.guardrailsBlocked=!0}catch(u){let d=u instanceof Error?u.message:String(u);throw e.error=`${a}; Fallback failed: ${d}`,g.error("Fallback provider failed",{fallbackProvider:l.provider,error:d}),u}}async storeStreamConversationMemory(e){let{enhancedOptions:t,providerName:n,originalPrompt:o,accumulatedContent:i,startTime:s,eventSequence:a}=e,l=a.some(u=>u.type==="tool:start"||u.type==="tool:end");if(!i.trim()&&!l){g.warn("[NeuroLink.stream] Skipping conversation turn storage \u2014 no text content or tool activity",{sessionId:t.context?.sessionId});return}if(this.conversationMemory&&t.context?.sessionId){let u=t.context?.sessionId,d=t.context?.userId,p;t.model&&(p={provider:n,model:t.model});let m=Date.now();try{await this.conversationMemory.storeConversationTurn({sessionId:u,userId:d,userMessage:o??"",aiResponse:i,startTimeStamp:new Date(s),providerDetails:p,enableSummarization:t.enableSummarization,events:a.length>0?a:void 0,requestId:t.context?.requestId}),this.recordMemorySpan("memory.store",{"memory.operation":"store","memory.path":"stream"},Date.now()-m,1),g.debug("[NeuroLink.stream] Stored conversation turn with events",{sessionId:u,eventCount:a.length,eventTypes:[...new Set(a.map(f=>f.type))]})}catch(f){this.recordMemorySpan("memory.store",{"memory.operation":"store","memory.path":"stream"},Date.now()-m,2,f instanceof Error?f.message:String(f)),g.warn("Failed to store stream conversation turn",{error:f instanceof Error?f.message:String(f)})}}this.shouldWriteMemory(t.memory,t.context?.userId,i)&&this.storeMemoryInBackground(o??"",i.trim(),t.context?.userId,t.memory?.additionalUsers)}async validateStreamInput(e){let t=process.hrtime.bigint();g.debug("[NeuroLink] \u{1F3AF} LOG_POINT_003_VALIDATION_START",{logPoint:"003_VALIDATION_START",validationStartTimeNs:t.toString(),message:"Starting comprehensive input validation process"});let n=typeof e?.input?.text=="string"&&e.input.text.trim().length>0,o=!!(e?.input?.audio&&e.input.audio.frames&&typeof e.input.audio.frames[Symbol.asyncIterator]=="function");if(!n&&!o)throw new Error("Stream options must include either input.text or input.audio")}emitStreamStartEvents(e,t){this.emitter.emit("stream:start",{provider:e.provider||"auto",timestamp:t}),this.emitter.emit("response:start"),this.emitter.emit("message",`Starting ${e.provider||"auto"} stream...`)}async createMCPStream(e){let t=await cm(e.provider),n=await br.createProvider(t,e.model,!e.disableTools,this,e.region);n.setTraceContext(this._metricsTraceContext),n.setupToolExecutor({customTools:this.getCustomTools(),executeTool:(f,h)=>this.executeTool(f,h,{disableToolCache:e.disableToolCache})},"NeuroLink.createMCPStream");let o=await this.getAllAvailableTools();o=this.applyToolInfoFiltering(o,e);let i=e.skipToolPromptInjection?e.systemPrompt||"":this.createToolAwareSystemPrompt(e.systemPrompt,o),s=e.conversationMessages!==void 0,a=s?e.conversationMessages:await Bg(this.conversationMemory,{...e,prompt:e.input.text,context:e.context});e.conversationMessages=a;let l=a,u=is({provider:t,model:e.model,maxTokens:e.maxTokens,systemPrompt:i,conversationMessages:l,currentPrompt:e.input.text,toolDefinitions:o}),d=l?.length||0,p=this.getCompactionSessionId(e);if(u.shouldCompact&&(s||this.conversationMemory)&&d>(this.lastCompactionMessageCount.get(p)??0)){let h=await new fm({provider:t,summarizationProvider:this.conversationMemoryConfig?.conversationMemory?.summarizationProvider,summarizationModel:this.conversationMemoryConfig?.conversationMemory?.summarizationModel}).compact(l,u.availableInputTokens,this.conversationMemoryConfig?.conversationMemory,e.context?.requestId);h.compacted&&(l=Vx(h.messages).messages,e.conversationMessages=l,this.lastCompactionMessageCount.set(p,l.length));let y=is({provider:t,model:e.model,maxTokens:e.maxTokens,systemPrompt:i,conversationMessages:l,currentPrompt:e.input.text,toolDefinitions:o});if(!y.withinBudget){g.warn("[NeuroLink] Stream: post-compaction still over budget, emergency truncation",{estimatedTokens:y.estimatedInputTokens,availableTokens:y.availableInputTokens,overagePercent:Math.round((y.usageRatio-1)*100)}),l=a1(l,y.availableInputTokens,y.breakdown,t),e.conversationMessages=l;let v=is({provider:t,model:e.model,maxTokens:e.maxTokens,systemPrompt:i,conversationMessages:l,currentPrompt:e.input.text,toolDefinitions:o});if(!v.withinBudget)throw new gm(`Stream context exceeds model budget after all compaction stages. Estimated: ${v.estimatedInputTokens} tokens, Budget: ${v.availableInputTokens} tokens.`,{estimatedTokens:v.estimatedInputTokens,availableTokens:v.availableInputTokens,stagesUsed:h.stagesUsed,breakdown:v.breakdown})}}let m=await n.stream({...e,systemPrompt:i,conversationMessages:l});return g.debug("[createMCPStream] Stream created successfully",{provider:t,systemPromptPassedLength:i.length}),{stream:m.stream,provider:t,usage:m.usage,model:m.model||e.model,analytics:m.analytics}}async processStreamResult(e,t,n){return{content:"",usage:void 0,finishReason:"stop",toolCalls:[],toolResults:[],analytics:void 0,evaluation:void 0}}emitStreamEndEvents(e){this.emitter.emit("stream:end",{responseTime:Date.now(),timestamp:Date.now()}),this.emitter.emit("response:end",e.content||"")}createStreamResponse(e,t,n){return{stream:t,provider:n.providerName,model:n.options.model,usage:e.usage,finishReason:e.finishReason,toolCalls:e.toolCalls,toolResults:e.toolResults,analytics:e.analytics,evaluation:e.evaluation,events:n.events&&n.events.length>0?n.events:void 0,metadata:{streamId:n.streamId,startTime:n.startTime,responseTime:n.responseTime,fallback:n.fallback||!1,guardrailsBlocked:n.guardrailsBlocked,error:n.error}}}async handleStreamError(e,t,n,o,i,s){g.error("Stream generation failed, attempting fallback",{error:e instanceof Error?e.message:String(e)});try{let h=t.provider||"unknown",y=this._metricsTraceContext,v=ye.createGenerationSpan({provider:h,model:t.model||"unknown",name:`gen_ai.${h}.stream.failed`,traceId:y?.traceId,parentSpanId:y?.parentSpanId});v=ye.endSpan(v,2),v.statusMessage=e instanceof Error?e.message:String(e),v.durationMs=Date.now()-n,this.metricsAggregator.recordSpan(v),Ne().recordSpan(v)}catch{}let a=t.input.text,l=Date.now()-n,u=await cm(t.provider),p=await(await br.createProvider(u,t.model)).stream({input:{text:t.input.text},model:t.model,temperature:t.temperature,maxTokens:t.maxTokens}),m="";return{stream:(async function*(h){try{for await(let y of p.stream)y&&"content"in y&&typeof y.content=="string"&&(m+=y.content,h.emitter.emit("response:chunk",y.content)),yield y}finally{if(m.trim()&&g.info("[NeuroLink.handleStreamError] stream() - COMPLETE SUCCESS (fallback)",{provider:u,model:t.model,responseTimeMs:Date.now()-n,contentLength:m.length}),h.conversationMemory&&i?.context?.sessionId&&m.trim()){let y=i?.context?.sessionId,v=i?.context?.userId,T;t.model&&(T={provider:u,model:t.model});let _=Date.now();try{await h.conversationMemory.storeConversationTurn({sessionId:y||t.context?.sessionId,userId:v||t.context?.userId,userMessage:a??"",aiResponse:m,startTimeStamp:new Date(n),providerDetails:T,enableSummarization:i?.enableSummarization,requestId:i?.context?.requestId||t.context?.requestId}),h.recordMemorySpan("memory.store",{"memory.operation":"store","memory.path":"fallback-stream"},Date.now()-_,1)}catch(S){h.recordMemorySpan("memory.store",{"memory.operation":"store","memory.path":"fallback-stream"},Date.now()-_,2,S instanceof Error?S.message:String(S)),g.warn("Failed to store fallback stream conversation turn",{error:S instanceof Error?S.message:String(S)})}}}})(this),provider:u,model:t.model,usage:p.usage,finishReason:p.finishReason||"stop",toolCalls:p.toolCalls||[],toolResults:p.toolResults||[],analytics:p.analytics,evaluation:p.evaluation,metadata:{streamId:o,startTime:n,responseTime:l,fallback:!0}}}getEventEmitter(){return this.emitter}emitToolStart(e,t,n=Date.now()){let o=`${e}-${n}-${Math.random().toString(36).substr(2,9)}`,i={executionId:o,tool:e,startTime:n,metadata:{inputType:typeof t,hasInput:t!=null}};return this.activeToolExecutions.set(o,i),this.currentStreamToolExecutions.push(i),this.emitter.emit("tool:start",{tool:e,input:t,timestamp:n,executionId:o}),g.debug(`tool:start emitted for ${e}`,{toolName:e,executionId:o,timestamp:n,inputProvided:t!==void 0}),o}emitToolEnd(e,t,n,o,i=Date.now(),s){let a=o||i-1e3,l=i-a,u=!n,d;s?d=this.activeToolExecutions.get(s):d=Array.from(this.activeToolExecutions.values()).find(f=>f.tool===e&&!f.endTime);let p=s||d?.executionId||`${e}-${a}-fallback-${Math.random().toString(36).substr(2,9)}`;d&&(d.endTime=i,d.result=t,d.error=n,this.activeToolExecutions.delete(d.executionId));let m={tool:e,startTime:a,endTime:i,duration:l,success:u,result:t,error:n,executionId:p,metadata:{toolCategory:"custom"}};this.toolExecutionHistory.push(m),this.emitter.emit("tool:end",{tool:e,result:t,error:n,timestamp:i,duration:l,executionId:p}),g.debug(`tool:end emitted for ${e}`,{toolName:e,executionId:p,duration:l,success:u,hasResult:t!==void 0,hasError:!!n})}getCurrentToolExecutions(){return[...this.currentStreamToolExecutions]}getToolExecutionHistory(){return[...this.toolExecutionHistory]}clearCurrentStreamExecutions(){this.currentStreamToolExecutions=[]}registerTool(e,t,n){this.invalidateToolCache(),this.emitter.emit("tools-register:start",{toolName:e,timestamp:Date.now()});try{if(!e||typeof e!="string")throw new Error("Invalid tool name");if(!t||typeof t!="object")throw new Error(`Invalid tool object provided for tool: ${e}`);if(typeof t.execute!="function")throw new Error(`Tool '${e}' must have an execute method.`);if(e.trim()==="")throw new Error("Tool name cannot be empty");if(e.length>100)throw new Error("Tool name is too long (maximum 100 characters)");if(/[\x00-\x1F\x7F]/.test(e))throw new Error("Tool name contains invalid control characters");let o={name:t.name||e,description:t.description||e,execute:t.execute,inputSchema:"parameters"in t&&t.parameters&&(gd(t.parameters)||typeof t.parameters=="object")?t.parameters:t.inputSchema||{}};if(n?.timeout!==void 0&&n.timeout>0&&Number.isFinite(n.timeout)){let s=o.execute,a=n.timeout,l=e;o.execute=async(...u)=>{let d=AbortSignal.timeout(a),p=u[1],m=p?.abortSignal,f=m?AbortSignal.any([m,d]):d,h={...p,abortSignal:f};return Promise.race([s(u[0],h),new Promise((y,v)=>{f.addEventListener("abort",()=>{d.aborted?v(new Error(`Tool '${l}' timed out after ${a}ms (configured at registration)`)):v(new DOMException("The operation was aborted","AbortError"))},{once:!0})})])}}let i=pSe(e,o,n?.timeout,n?.maxRetries);this.toolRegistry.registerServer(i),this.emitter.emit("tools-register:end",{toolName:e,success:!0,timestamp:Date.now(),timeoutMs:n?.timeout})}catch(o){throw g.error(`Failed to register tool ${e}:`,o),o}}setToolContext(e){this.toolExecutionContext={...e},g.debug("Tool execution context updated",{sessionId:e.sessionId,contextKeys:Object.keys(e),hasJuspayToken:!!e.juspayToken,hasShopId:!!e.shopId})}getToolContext(){return this.toolExecutionContext?{...this.toolExecutionContext}:void 0}clearToolContext(){this.toolExecutionContext=void 0,g.debug("Tool execution context cleared")}registerTools(e){if(Array.isArray(e))for(let{name:t,tool:n}of e)this.registerTool(t,n);else for(let[t,n]of Object.entries(e))this.registerTool(t,n)}unregisterTool(e){this.invalidateToolCache();let t=`custom-tool-${e}`,n=this.toolRegistry.unregisterServer(t);return n&&g.info(`Unregistered custom tool: ${e}`),n}useToolMiddleware(e){return this.mcpToolMiddlewares.push(e),g.debug(`[NeuroLink] Registered tool middleware (total: ${this.mcpToolMiddlewares.length})`),this}getToolMiddlewares(){return[...this.mcpToolMiddlewares]}async flushToolBatch(){this.mcpToolBatcher&&await this.mcpToolBatcher.flush()}getMCPEnhancementsConfig(){return this.mcpEnhancementsConfig}async updateAgenticLoopReport(e,t,n){if(!this.conversationMemory)throw new Ei("Conversation memory is not initialized. Enable conversationMemory in NeuroLink options.","CONFIG_ERROR");if(!("updateAgenticLoopReport"in this.conversationMemory)||typeof this.conversationMemory.updateAgenticLoopReport!="function")throw new Ei("updateAgenticLoopReport is only supported with Redis conversation memory.","CONFIG_ERROR");await We(this.conversationMemory.updateAgenticLoopReport(e,n,t),5e3)}getCustomTools(){let e=this.toolRegistry.getToolsByCategory(Vo({isCustomTool:!0})),t=new Map;for(let o of e){let i=o.inputSchema||o.parameters;g.debug("Processing tool schema for Claude",{toolName:o.name,hasDescription:!!o.description,description:o.description,hasParameters:!!o.parameters,parametersType:typeof o.parameters,parametersKeys:o.parameters&&typeof o.parameters=="object"?Object.keys(o.parameters):"NOT_OBJECT",hasInputSchema:!!o.inputSchema,inputSchemaType:typeof o.inputSchema,inputSchemaKeys:o.inputSchema&&typeof o.inputSchema=="object"?Object.keys(o.inputSchema):"NOT_OBJECT",hasEffectiveSchema:!!i,effectiveSchemaType:typeof i,effectiveSchemaHasProperties:!!i?.properties,effectiveSchemaHasRequired:!!i?.required,originalInputSchema:o.inputSchema,phase:"AFTER_SCHEMA_FIX",timestamp:Date.now()}),t.set(o.name,{name:o.name,description:o.description||"",inputSchema:typeof o.inputSchema=="object"&&o.inputSchema!==null?o.inputSchema:typeof o.parameters=="object"&&o.parameters!==null?o.parameters:{},execute:async(s,a)=>{let l=this.toolExecutionContext||{},u=a&&Pt(a)?a:{},d={...l,...u,sessionId:u.sessionId||l.sessionId||`fallback-${Date.now()}`};return g.debug("Tool execution context merged",{toolName:o.name,storedContextKeys:Object.keys(l),runtimeContextKeys:Object.keys(u),finalContextKeys:Object.keys(d),hasJuspayToken:!!d.juspayToken,hasShopId:!!d.shopId,sessionId:d.sessionId}),await this.toolRegistry.executeTool(o.name,s,d)}})}this.cachedFileTools||(this.cachedFileTools=EK(this.fileRegistry));let n=this.cachedFileTools;for(let[o,i]of Object.entries(n))if(!t.has(o)){let s=i,a=s.inputSchema??s.parameters;t.set(o,{name:o,description:i.description||`File tool: ${o}`,inputSchema:typeof a=="object"&&a!==null?a:{type:"object",properties:{}},execute:async l=>await i.execute(l,{toolCallId:`file-tool-${Date.now()}`,messages:[]})})}return t}async addInMemoryMCPServer(e,t){this.invalidateToolCache();try{ne.debug(`[NeuroLink] Registering in-memory MCP server: ${e}`),t.tools||(t.tools=[]),await this.toolRegistry.registerServer(t),ne.info(`[NeuroLink] Successfully registered in-memory server: ${e}`,{category:t.metadata?.category,provider:t.metadata?.provider,version:t.metadata?.version})}catch(n){throw ne.error(`[NeuroLink] Failed to register in-memory server ${e}:`,n),n}}getInMemoryServers(){let e=this.getInMemoryServerInfos(),t=new Map;for(let n of e)t.set(n.id,n);return t}getInMemoryServerInfos(){return this.toolRegistry.getBuiltInServerInfos().filter(t=>Vo({existingCategory:t.metadata?.category,serverId:t.id})==="in-memory")}getAutoDiscoveredServerInfos(){return this.autoDiscoveredServerInfos}async executeTool(e,t={},n){let o="NeuroLink.executeTool",i=Date.now();if(this.mcpToolBatcher&&!n?.bypassBatcher)return this.mcpToolBatcher.execute(e,t);let a=this.externalServerManager.getAllTools().find(m=>m.name===e),l=a?"mcp":this.getCustomTools().has(e)?"custom":"external",u=typeof t=="string"?t:t?JSON.stringify(t):"",d=u.length,p=u.length>2048?u.substring(0,2048):u;return mt.mcp.startActiveSpan("neurolink.tool.execute",{attributes:{"tool.name":e,"tool.type":l,"tool.input_size":d,"tool.input_preview":p}},async m=>{try{g.debug(`[${o}] Tool execution requested:`,{toolName:e,params:Pt(t)?Fue(t):t,hasExternalManager:!!this.externalServerManager}),g.debug("Tool execution detailed analysis",{toolName:e,executionStartTime:i,paramsAnalysis:{type:typeof t,isNull:t===null,isUndefined:t===void 0,isEmpty:t&&typeof t=="object"&&Object.keys(t).length===0,keys:t&&typeof t=="object"?Object.keys(t):"NOT_OBJECT",keysLength:t&&typeof t=="object"?Object.keys(t).length:0},isTargetTool:e==="juspay-analytics_SuccessRateSRByTime",options:n,hasExternalManager:!!this.externalServerManager}),this.emitter.emit("tool:start",{toolName:e,timestamp:i,input:t});let f=this.toolRegistry.getToolInfo(e),h=f?.tool?.timeoutMs,y=f?.tool?.maxRetries,v={timeout:n?.timeout??h??Iu.EXECUTION_DEFAULT_MS,maxRetries:n?.maxRetries??y??Rn.DEFAULT,retryDelayMs:n?.retryDelayMs||qr.BASE_MS,authContext:n?.authContext,disableToolCache:n?.disableToolCache},{MemoryManager:T}=await Promise.resolve().then(()=>(z0(),$0)),_=T.getMemoryUsageMB(),w=`${a?.serverId||f?.tool?.serverId||"unknown"}.${e}`;this.toolCircuitBreakers.has(w)||this.toolCircuitBreakers.set(w,new tv(BE.FAILURE_THRESHOLD,CD));let C=this.toolCircuitBreakers.get(w);this.toolExecutionMetrics.has(e)||this.toolExecutionMetrics.set(e,{totalExecutions:0,successfulExecutions:0,failedExecutions:0,averageExecutionTime:0,lastExecutionTime:0,errorCategories:{}});let I=this.toolExecutionMetrics.get(e);I&&I.totalExecutions++;try{if(ne.debug(`[${o}] Executing tool: ${e}`,{toolName:e,params:t,options:v,circuitBreakerState:C?.getState()}),!C)throw new Error(`Circuit breaker not initialized for tool: ${e}`);let A=await C.execute(async()=>await bG(async()=>await We(this.executeToolInternal(e,t,v),v.timeout,ge.toolTimeout(e,v.timeout)),{maxAttempts:v.maxRetries+1,delayMs:v.retryDelayMs,isRetriable:_P,onRetry:(N,M)=>{ne.warn(`[${o}] Retrying tool execution (attempt ${N})`,{toolName:e,error:M.message,attempt:N})}})),k=Date.now()-i;I&&(I.successfulExecutions++,I.lastExecutionTime=k,I.averageExecutionTime=(I.averageExecutionTime*(I.successfulExecutions-1)+k)/I.successfulExecutions);let O=T.getMemoryUsageMB().heapUsed-_.heapUsed;O>20&&ne.warn(`Tool '${e}' used excessive memory: ${O}MB`,{toolName:e,memoryDelta:O,executionTime:k}),ne.debug(`[${o}] Tool executed successfully`,{toolName:e,executionTime:k,memoryDelta:O,circuitBreakerState:C?.getState()});let D=A&&typeof A=="object"?A:void 0,U=D&&"isError"in D&&D.isError===!0||D&&"success"in D&&D.success===!1;if(U&&C){try{await C.execute(async()=>{throw new Error(`Tool ${e} returned isError:true`)})}catch{}ne.debug(`[${o}] Circuit breaker failure recorded for isError result`,{toolName:e,circuitBreakerState:C.getState(),circuitBreakerFailures:C.getFailureCount()})}if(U){let N=A,M=N.content,L=M?.filter($=>$.type==="text"&&$.text).map($=>$.text).join(" ")||(typeof N.error=="string"?N.error:"Unknown error"),j=A2t(L),F=`[TOOL_ERROR: ${e} failed (${j})] `;if(M&&Array.isArray(M)){let $=M.map(B=>({...B}));for(let B of $)if(B.type==="text"&&B.text){B.text=F+B.text;break}N.content=$}if(m.setAttribute("tool.error.message",L.substring(0,500)),m.setAttribute("tool.error.category",j),m.setStatus({code:Ae.ERROR,message:`MCP tool returned isError: ${L.substring(0,200)}`}),I){I.failedExecutions++;let $=I.successfulExecutions;I.successfulExecutions=Math.max(0,I.successfulExecutions-1),$>1?I.averageExecutionTime=(I.averageExecutionTime*$-k)/($-1):I.averageExecutionTime=0;let B=P2t(j);I.errorCategories[B]=(I.errorCategories[B]||0)+1}}return this.emitToolEndEvent(e,i,!U,A),m.setAttribute("tool.result.status",U?"error":"success"),m.setAttribute("tool.duration_ms",k),A}catch(A){I&&I.failedExecutions++;let k=Date.now()-i;if(A instanceof Si){if(ne.warn(`[${o}] Tool blocked by circuit breaker: ${e}`,{toolName:e,breakerState:A.breakerState,retryAfter:A.retryAfter,retryAfterMs:A.retryAfterMs,failureCount:A.failureCount,executionTime:k}),I){let O="execution";I.errorCategories[O]=(I.errorCategories[O]||0)+1}return this.emitToolEndEvent(e,i,!1,void 0),m.setAttribute("tool.result.status","circuit_breaker_open"),m.setAttribute("tool.duration_ms",k),m.setAttribute("tool.circuit_breaker.state",A.breakerState),m.setAttribute("tool.circuit_breaker.retry_after_ms",A.retryAfterMs),m.setAttribute("tool.circuit_breaker.failure_count",A.failureCount),m.setStatus({code:Ae.ERROR,message:`Circuit breaker open for ${e}: ${A.message}`}),{isError:!0,content:[{type:"text",text:`TOOL TEMPORARILY UNAVAILABLE: "${e}" has been disabled after ${A.failureCount} failures. This is a circuit breaker protection \u2014 do NOT retry this tool. It will become available again after ${Math.ceil(A.retryAfterMs/1e3)} seconds (at ${A.retryAfter}). Instead, inform the user that the operation failed and suggest trying again later.`}]}}let E;if(A instanceof Ve)E=A;else if(A instanceof Error)if(A.message.includes("timeout"))E=ge.toolTimeout(e,v.timeout);else if(A.message.includes("not found")){let O=await this.getAllAvailableTools();E=ge.toolNotFound(e,Lue(O.map(D=>({name:D.name}))))}else A.message.includes("validation")||A.message.includes("parameter")?E=ge.invalidParameters(e,A,t):A.message.includes("network")||A.message.includes("connection")?E=ge.networkError(e,A):E=ge.toolExecutionFailed(e,A);else E=ge.toolExecutionFailed(e,new Error(String(A)));if(I){let O=E.category||"execution";I.errorCategories[O]=(I.errorCategories[O]||0)+1}throw this.emitToolEndEvent(e,i,!1,void 0,E),this.emitter.emit("error",E),E=new Ve({...E,context:{...E.context,executionTime:k,params:t,options:v,circuitBreakerState:C?.getState(),circuitBreakerFailures:C?.getFailureCount(),metrics:{...I}}}),TG(E),m.setAttribute("tool.result.status","error"),m.setAttribute("tool.duration_ms",k),m.recordException(E),m.setStatus({code:Ae.ERROR,message:E.message}),E}}catch(f){if(!(f instanceof Ve)){let h=f instanceof Error?f.message:String(f);m.recordException(f instanceof Error?f:new Error(h)),m.setStatus({code:Ae.ERROR,message:h})}throw f}finally{m.end()}})}async executeToolInternal(e,t,n){let o="NeuroLink.executeToolInternal",i=this.getToolAnnotationsForExecution(e),s=this.mcpToolResultCache&&!n.disableToolCache&&!this._disableToolCacheForCurrentRequest&&!i?.destructiveHint;if(s){let u=this.mcpToolResultCache.getCachedResult(e,t);if(u!==void 0)return g.debug(`[${o}] Cache HIT for tool: ${e}`),u}let a=async u=>{if(this.mcpToolMiddlewares.length===0)return u();let d=0,p=async()=>{if(d<this.mcpToolMiddlewares.length){let m=this.mcpToolMiddlewares[d++];return m({name:e,description:"",inputSchema:{},annotations:i,execute:async()=>({})},t,{toolMeta:{name:e,annotations:i}},p)}return u()};return await p()},l=async()=>{let u=this.externalServerManager.getAllTools(),d=u.filter(m=>m.name===e&&m.isAvailable),p;if(d.length>1&&this.mcpToolRouter)try{let m={name:e,description:d[0].description??"",serverId:d[0].serverId,inputSchema:{}},f=this.mcpToolRouter.route(m);p=d.find(h=>h.serverId===f.serverId)||d[0],g.debug(`[${o}] Router selected server: ${f.serverId}`,{strategy:f.strategy,confidence:f.confidence})}catch(m){g.warn(`[${o}] Router failed, falling back to first match`,{error:m}),p=d[0]}else p=d[0];if(g.debug(`[${o}] External MCP tool search:`,{toolName:e,externalToolsCount:u.length,foundTool:!!p,isAvailable:p?.isAvailable,serverId:p?.serverId}),p&&p.isAvailable)try{ne.debug(`[${o}] Executing external MCP tool: ${e} from ${p.serverId}`);let m=await this.externalServerManager.executeTool(p.serverId,e,t,{timeout:n.timeout});return g.debug(`[${o}] External MCP tool execution successful:`,{toolName:e,serverId:p.serverId,resultType:typeof m}),m}catch(m){throw g.error(`[${o}] External MCP tool execution failed:`,{toolName:e,serverId:p.serverId,error:m instanceof Error?m.message:String(m)}),ge.toolExecutionFailed(e,m instanceof Error?m:new Error(String(m)),p.serverId)}try{let m=this.toolExecutionContext||{},f=n.authContext||{},h={...m,...f};g.debug("[Using merged context for unified registry tool:",{toolName:e,storedContextKeys:Object.keys(m),finalContextKeys:Object.keys(h)});let y=await this.toolRegistry.executeTool(e,t,h);if(y&&typeof y=="object"&&"success"in y&&y.success===!1){let v=y.error||"Tool execution failed",T=new Error(v);this.emitter.emit("error",T)}return y}catch(m){let f=m instanceof Error?m:new Error(String(m));if(this.emitter.emit("error",f),m instanceof Error&&m.message.includes("not found")){let h=await this.getAllAvailableTools();throw ge.toolNotFound(e,h.map(y=>y.name))}throw ge.toolExecutionFailed(e,m instanceof Error?m:new Error(String(m)))}};try{let u=await a(l);return s&&u!==void 0&&(this.mcpToolResultCache.cacheResult(e,t,u),g.debug(`[${o}] Cached result for tool: ${e}`)),u}catch(u){let d=i?{name:e,description:"",annotations:i,execute:async()=>({})}:void 0;if(d&&r0(d)&&u instanceof Error&&_P(u)){g.debug(`[${o}] Tool ${e} is safe to retry, attempting once more`);try{let p=await a(l);return s&&p!==void 0&&this.mcpToolResultCache.cacheResult(e,t,p),p}catch{}}throw u}}getToolAnnotationsForExecution(e){if(this.toolCache?.tools){let t=this.toolCache.tools.find(n=>n.name===e);if(t?.annotations)return t.annotations}if(this.mcpEnhancementsConfig?.annotations?.autoInfer!==!1)return Qa({name:e,description:""})}invalidateToolCache(){this.toolCache=null,g.debug("Tool cache invalidated")}async getAllAvailableTools(){if(this.toolCache&&Date.now()-this.toolCache.timestamp<this.toolCacheDuration)return g.debug("Returning available tools from cache"),this.toolCache.tools;let e=`get-all-tools-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,t=Date.now(),n=process.hrtime.bigint();g.debug("[NeuroLink] \u{1F6E0}\uFE0F LOG_POINT_A001_GET_ALL_TOOLS_START",{logPoint:"A001_GET_ALL_TOOLS_START",getAllToolsId:e,timestamp:new Date().toISOString(),getAllToolsStartTime:t,getAllToolsHrTimeStart:n.toString(),toolRegistryState:{hasToolRegistry:!!this.toolRegistry,toolRegistrySize:0,toolRegistryType:this.toolRegistry?.constructor?.name||"NOT_SET",hasExternalServerManager:!!this.externalServerManager,externalServerManagerType:this.externalServerManager?.constructor?.name||"NOT_SET"},mcpState:{mcpInitialized:this.mcpInitialized,hasProviderRegistry:!!br,providerRegistrySize:0},message:"Starting comprehensive tool discovery across all sources"});let{MemoryManager:o}=await Promise.resolve().then(()=>(z0(),$0)),i=o.getMemoryUsageMB();try{let s=new Map,a=await this.toolRegistry.listTools();for(let y of a)if(!s.has(y.name)){let v=Z_(y,{serverId:y.serverId==="direct"?"neurolink-direct":y.serverId});s.set(y.name,v)}let l=this.toolRegistry.getToolsByCategory(Vo({isCustomTool:!0}));for(let y of l)if(!s.has(y.name)){let v=Z_(y,{description:"Custom tool",serverId:`custom-tool-${y.name}`,category:Vo({isCustomTool:!0,serverId:y.serverId}),inputSchema:{}});s.set(y.name,v)}let u=this.toolRegistry.getToolsByCategory("in-memory");for(let y of u)if(!s.has(y.name)){let v=Z_(y,{description:"In-memory MCP tool",serverId:"unknown",category:"in-memory",inputSchema:{}});s.set(y.name,v)}let d=this.externalServerManager.getAllTools();for(let y of d)if(!s.has(y.name)){let v=Z_(y,{category:Vo({existingCategory:typeof y.metadata?.category=="string"?y.metadata.category:void 0,isExternal:!0,serverId:y.serverId}),inputSchema:{}});s.set(y.name,v)}let p=Array.from(s.values());ne.debug("Tool discovery results",{mcpTools:a.length,customTools:l.length,inMemoryTools:u.length,externalMCPTools:d.length,total:p.length});let f=o.getMemoryUsageMB().heapUsed-i.heapUsed;if(f>Ou.LOW_USAGE_MB&&(ne.debug(`\u{1F50D} Tool listing used ${f}MB memory (large tool registry detected)`),p.length>eK.LARGE_TOOL_COLLECTION&&ne.debug("\u{1F4A1} Tool collection optimized for large sets. Memory usage reduced through efficient object reuse.")),this.mcpEnhancementsConfig?.annotations?.autoInfer!==!1)for(let y of p)y.annotations||(y.annotations=Qa({name:y.name,description:y.description||""}));let h=p;return this.toolCache={tools:h,timestamp:Date.now()},h}catch(s){return ne.error("Failed to list available tools",{error:s}),[]}}async getProviderStatus(e){let{MemoryManager:t}=await Promise.resolve().then(()=>(z0(),$0)),n=t.getMemoryUsageMB();e?.quiet||ne.debug("\u{1F50D} DEBUG: Initializing MCP for provider status..."),await this.initializeMCP(),e?.quiet||ne.debug("\u{1F50D} DEBUG: MCP initialized:",this.mcpInitialized);let{AIProviderFactory:o}=await Promise.resolve().then(()=>(Pa(),NL)),{hasProviderEnvVars:i}=await Promise.resolve().then(()=>(Ud(),FE)),s=["openai","bedrock","vertex","googleVertex","anthropic","azure","google-ai","huggingface","ollama","mistral","litellm"],a=Au(Aa.DEFAULT_CONCURRENCY_LIMIT),l=s.map(m=>a(async()=>{let f=Date.now();try{if(!await this.hasProviderEnvVars(m)&&m!=="ollama")return{provider:m,status:"not-configured",configured:!1,authenticated:!1,error:"Missing required environment variables",responseTime:Date.now()-f};if(m==="ollama")try{let _=await fetch("http://localhost:11434/api/tags",{method:"GET",signal:AbortSignal.timeout(Ks.AUTH_MS)});if(!_.ok)throw new Error("Ollama service not responding");let S=await _.json(),w=S?.models;if(!Array.isArray(w))throw g.warn("Ollama API returned invalid models format in testProvider",{responseData:S,modelsType:typeof w}),new Error("Invalid models format from Ollama API");let C=w.filter(I=>I&&typeof I=="object"&&typeof I.name=="string");return C.length>0?{provider:m,status:"working",configured:!0,authenticated:!0,responseTime:Date.now()-f,model:C[0].name}:{provider:m,status:"failed",configured:!0,authenticated:!1,error:"Ollama service running but no models installed",responseTime:Date.now()-f}}catch(_){return{provider:m,status:"failed",configured:!1,authenticated:!1,error:_ instanceof Error?_.message:"Ollama service not running",responseTime:Date.now()-f}}let y=5e3,v=this.testProviderConnection(m),T=new Promise((_,S)=>{setTimeout(()=>S(new Error("Provider test timeout (5s)")),y)});return await Promise.race([v,T]),{provider:m,status:"working",configured:!0,authenticated:!0,responseTime:Date.now()-f}}catch(h){let y=h instanceof Error?h.message:String(h);return{provider:m,status:"failed",configured:!0,authenticated:!1,error:y,responseTime:Date.now()-f}}})),u=await Promise.all(l),p=t.getMemoryUsageMB().heapUsed-n.heapUsed;return!e?.quiet&&p>20&&ne.debug(`\u{1F50D} Memory usage: +${p}MB (consider cleanup for large operations)`),p>50&&t.forceGC(),u}async testProvider(e){try{return await this.testProviderConnection(e),!0}catch{return!1}}async testProviderConnection(e){let{AIProviderFactory:t}=await Promise.resolve().then(()=>(Pa(),NL));await(await t.createProvider(e,null)).generate({prompt:"test",maxTokens:1,disableTools:!0})}async getBestProvider(e){let{getBestProvider:t}=await Promise.resolve().then(()=>(Ud(),FE));return t(e)}async getAvailableProviders(){let{getAvailableProviders:e}=await Promise.resolve().then(()=>(Ud(),FE));return e()}async isValidProvider(e){let{isValidProvider:t}=await Promise.resolve().then(()=>(Ud(),FE));return t(e)}async getMCPStatus(){try{await this.initializeMCP();let e=await this.toolRegistry.listTools(),t=this.externalServerManager.getStatistics(),n=this.externalServerManager.listServers(),o=this.getInMemoryServerInfos(),i=this.toolRegistry.getBuiltInServerInfos(),s=this.getAutoDiscoveredServerInfos(),a=n.length+o.length+i.length+s.length,l=t.connectedServers+o.length+i.length,u=e.length+t.totalTools;return{mcpInitialized:this.mcpInitialized,totalServers:a,availableServers:l,autoDiscoveredCount:s.length,totalTools:u,autoDiscoveredServers:s,customToolsCount:this.toolRegistry.getToolsByCategory(Vo({isCustomTool:!0})).length,inMemoryServersCount:o.length,externalMCPServersCount:n.length,externalMCPConnectedCount:t.connectedServers,externalMCPFailedCount:t.failedServers,externalMCPServers:n}}catch(e){return{mcpInitialized:!1,totalServers:0,availableServers:0,autoDiscoveredCount:0,totalTools:0,autoDiscoveredServers:[],customToolsCount:this.toolRegistry.getToolsByCategory(Vo({isCustomTool:!0})).length,inMemoryServersCount:0,externalMCPServersCount:0,externalMCPConnectedCount:0,externalMCPFailedCount:0,externalMCPServers:[],error:e instanceof Error?e.message:String(e)}}}async listMCPServers(){return[...this.externalServerManager.listServers(),...this.getInMemoryServerInfos(),...this.toolRegistry.getBuiltInServerInfos(),...this.getAutoDiscoveredServerInfos()]}async testMCPServer(e){try{if(e==="neurolink-direct")return(await this.toolRegistry.listTools()).length>0;let t=this.getInMemoryServers();if(t.has(e)){let o=t.get(e);return!!(o?.tools&&o.tools.length>0)}let n=this.externalServerManager.getServer(e);return n?n.status==="connected"&&n.client!==null:!1}catch(t){return ne.error(`[NeuroLink] Error testing MCP server ${e}:`,t),!1}}async hasProviderEnvVars(e){let{ProviderHealthChecker:t}=await Promise.resolve().then(()=>(Ug(),Nx));try{let n=await t.checkProviderHealth(e,{includeConnectivityTest:!1,cacheResults:!1});return n.isConfigured&&n.hasApiKey}catch(n){return g.warn(`Provider env var check failed for ${e}`,{error:n instanceof Error?n.message:String(n)}),!1}}async checkProviderHealth(e,t={}){let{ProviderHealthChecker:n}=await Promise.resolve().then(()=>(Ug(),Nx)),o=await n.checkProviderHealth(e,t);return{provider:o.provider,isHealthy:o.isHealthy,isConfigured:o.isConfigured,hasApiKey:o.hasApiKey,lastChecked:o.lastChecked,error:o.error,warning:o.warning,responseTime:o.responseTime,configurationIssues:o.configurationIssues,recommendations:o.recommendations}}async checkAllProvidersHealth(e={}){let{ProviderHealthChecker:t}=await Promise.resolve().then(()=>(Ug(),Nx));return(await t.checkAllProvidersHealth(e)).map(o=>({provider:o.provider,isHealthy:o.isHealthy,isConfigured:o.isConfigured,hasApiKey:o.hasApiKey,lastChecked:o.lastChecked,error:o.error,warning:o.warning,responseTime:o.responseTime,configurationIssues:o.configurationIssues,recommendations:o.recommendations}))}async getProviderHealthSummary(){let{ProviderHealthChecker:e}=await Promise.resolve().then(()=>(Ug(),Nx)),t=await e.checkAllProvidersHealth({cacheResults:!0,includeConnectivityTest:!1}),n=e.getHealthSummary(t),o=[];return n.healthy===0?o.push("No providers are healthy. Check your environment configuration."):n.healthy<2&&o.push("Consider configuring additional providers for better reliability."),n.hasIssues>0&&o.push("Some providers have configuration issues. Run checkAllProvidersHealth() for details."),{...n,recommendations:o}}async clearProviderHealthCache(e){let{ProviderHealthChecker:t}=await Promise.resolve().then(()=>(Ug(),Nx));t.clearHealthCache(e)}getToolExecutionMetrics(){let e={};for(let[t,n]of this.toolExecutionMetrics.entries())e[t]={...n,errorCategories:{...n.errorCategories},successRate:n.totalExecutions>0?n.successfulExecutions/n.totalExecutions:0};return e}setModelAliasConfig(e){this.modelAliasConfig=e,g.info(`[ModelAlias] Configured ${Object.keys(e.aliases).length} model aliases`)}getToolCircuitBreakerStatus(){let e={};for(let[t,n]of this.toolCircuitBreakers.entries())e[t]={state:n.getState(),failureCount:n.getFailureCount(),isHealthy:n.getState()==="closed"};return e}resetToolCircuitBreaker(e){this.toolCircuitBreakers.has(e)&&(this.toolCircuitBreakers.set(e,new tv(BE.FAILURE_THRESHOLD,CD)),ne.info(`Circuit breaker reset for tool: ${e}`))}clearToolExecutionMetrics(){this.toolExecutionMetrics.clear(),ne.info("All tool execution metrics cleared")}async getToolHealthReport(){let e={},t=0,n=await this.toolRegistry.listTools(),o=new Set(n.map(s=>s.name)),i=new Map;for(let s of n)i.has(s.name)||i.set(s.name,s.serverId||"unknown");for(let s of o){let a=this.toolExecutionMetrics.get(s),l=`${i.get(s)||"unknown"}.${s}`,u=this.toolCircuitBreakers.get(l),d=a&&a.totalExecutions>0?a.successfulExecutions/a.totalExecutions:0,p=(!u||u.getState()==="closed")&&d>=.8;p&&t++;let m=[],f=[];if(u&&u.getState()==="open"&&(m.push("Circuit breaker is open due to repeated failures"),f.push("Check tool implementation and fix underlying issues")),d<.8&&a&&a.totalExecutions>0&&(m.push(`Low success rate: ${(d*100).toFixed(1)}%`),f.push("Review error logs and improve tool reliability")),a&&a.averageExecutionTime>1e4&&(m.push("High average execution time"),f.push("Optimize tool performance or increase timeout")),a&&a.errorCategories){let h=a.errorCategories;h.timeout>0&&(m.push(`Timeout errors: ${h.timeout}`),f.push("Consider increasing the tool timeout configuration")),h.validation>0&&(m.push(`Validation errors: ${h.validation}`),f.push("Review input schemas and parameter validation")),h.network>0&&(m.push(`Network errors: ${h.network}`),f.push("Check network connectivity and endpoint availability"))}e[s]={name:s,isHealthy:p,metrics:{totalExecutions:a?.totalExecutions||0,successRate:d,averageExecutionTime:a?.averageExecutionTime||0,lastExecutionTime:a?.lastExecutionTime||0,errorCategories:a?.errorCategories?{...a.errorCategories}:{}},circuitBreaker:{state:u?.getState()||"closed",failureCount:u?.getFailureCount()||0},issues:m,recommendations:f}}return{totalTools:o.size,healthyTools:t,unhealthyTools:o.size-t,tools:e}}async ensureConversationMemoryInitialized(){try{let e=`manual-init-${Date.now()}`;return await this.initializeConversationMemoryForGeneration(e,Date.now(),process.hrtime.bigint()),!!this.conversationMemory}catch(e){return g.error("Failed to initialize conversation memory",{error:e instanceof Error?e.message:String(e)}),!1}}async getConversationStats(){let e=`stats-init-${Date.now()}`;if(await this.initializeConversationMemoryForGeneration(e,Date.now(),process.hrtime.bigint()),!this.conversationMemory)throw new Ve({code:gt.MISSING_CONFIGURATION,message:"Conversation memory is not enabled",category:"validation",severity:"high",retriable:!1});return await this.conversationMemory.getStats()}async getConversationHistory(e){let t=`history-init-${Date.now()}`;if(await this.initializeConversationMemoryForGeneration(t,Date.now(),process.hrtime.bigint()),!this.conversationMemory)throw new Ve({code:gt.MISSING_CONFIGURATION,message:"Conversation memory is not enabled",category:"validation",severity:"high",retriable:!1});if(!e||typeof e!="string")throw new Ve({code:gt.INVALID_PARAMETERS,message:"Session ID must be a non-empty string",category:"validation",severity:"medium",retriable:!1,context:{sessionId:e}});try{let n=await this.conversationMemory.buildContextMessages(e);return g.debug("Retrieved conversation history",{sessionId:e,messageCount:n.length,turnCount:n.length/2}),n}catch(n){return g.error("Failed to retrieve conversation history",{sessionId:e,error:n instanceof Error?n.message:String(n)}),[]}}async clearConversationSession(e){let t=`clear-session-init-${Date.now()}`;if(await this.initializeConversationMemoryForGeneration(t,Date.now(),process.hrtime.bigint()),!this.conversationMemory)throw new Ve({code:gt.MISSING_CONFIGURATION,message:"Conversation memory is not enabled",category:"validation",severity:"high",retriable:!1});return this.lastCompactionMessageCount.delete(e),await this.conversationMemory.clearSession(e)}async clearAllConversations(){let e=`clear-all-init-${Date.now()}`;if(await this.initializeConversationMemoryForGeneration(e,Date.now(),process.hrtime.bigint()),!this.conversationMemory)throw new Ve({code:gt.MISSING_CONFIGURATION,message:"Conversation memory is not enabled",category:"validation",severity:"high",retriable:!1});this.lastCompactionMessageCount.clear(),await this.conversationMemory.clearAllSessions()}async storeToolExecutions(e,t,n,o,i){let s=n&&n.length>0||o&&o.length>0;if(!s){g.debug("Tool execution storage skipped",{hasToolData:s,toolCallsCount:n?.length||0,toolResultsCount:o?.length||0});return}let a=this.conversationMemory;try{await a.storeToolExecution(e,t,n,o,i)}catch(l){g.warn("Failed to store tool executions",{sessionId:e,userId:t,error:l instanceof Error?l.message:String(l)})}}isToolExecutionStorageAvailable(){let e=process.env.STORAGE_TYPE==="redis",t=this.conversationMemory&&this.conversationMemory.constructor.name==="RedisConversationMemoryManager";return!!(e&&t)}async getSessionMessages(e,t){let n=`get-msgs-init-${Date.now()}`;if(await this.initializeConversationMemoryForGeneration(n,Date.now(),process.hrtime.bigint()),!this.conversationMemory)throw new Ve({code:gt.MISSING_CONFIGURATION,message:"Conversation memory is not enabled",category:"validation",severity:"high",retriable:!1});if(!e||typeof e!="string")throw new Ve({code:gt.INVALID_PARAMETERS,message:"Session ID must be a non-empty string",category:"validation",severity:"medium",retriable:!1,context:{sessionId:e}});return await this.conversationMemory.getSessionMessages(e,t)}async setSessionMessages(e,t,n){let o=`set-msgs-init-${Date.now()}`;if(await this.initializeConversationMemoryForGeneration(o,Date.now(),process.hrtime.bigint()),!this.conversationMemory)throw new Ve({code:gt.MISSING_CONFIGURATION,message:"Conversation memory is not enabled",category:"validation",severity:"high",retriable:!1});if(!e||typeof e!="string")throw new Ve({code:gt.INVALID_PARAMETERS,message:"Session ID must be a non-empty string",category:"validation",severity:"medium",retriable:!1,context:{sessionId:e}});await this.conversationMemory.setSessionMessages(e,t,n)}async modifyLastAssistantMessage(e,t,n){let o=await this.getSessionMessages(e,n);for(let i=o.length-1;i>=0;i--)if(o[i].role==="assistant")return o[i]={...o[i],content:t(o[i].content)},await this.setSessionMessages(e,o,n),!0;return!1}async addExternalMCPServer(e,t){this.invalidateToolCache();try{ne.info(`[NeuroLink] Adding external MCP server: ${e}`,{command:t.command,transport:t.transport});let n=await this.externalServerManager.addServer(e,t);if(n.success){if(ne.info(`[NeuroLink] External MCP server added successfully: ${e}`,{toolsDiscovered:n.metadata?.toolsDiscovered||0,duration:n.duration}),this.mcpEnhancementsConfig?.router?.enabled!==!1){let o=this.externalServerManager.listServers();if(o.length>=2&&!this.mcpToolRouter){this.mcpToolRouter=new Em({strategy:this.mcpEnhancementsConfig?.router?.strategy??"least-loaded",enableAffinity:this.mcpEnhancementsConfig?.router?.enableAffinity??!1});for(let i of o)this.mcpToolRouter.registerServer(i.id||e);g.debug("[NeuroLink] ToolRouter auto-initialized (2+ external servers)")}else this.mcpToolRouter&&this.mcpToolRouter.registerServer(e)}this.emitter.emit("externalMCP:serverAdded",{serverId:e,config:t,toolCount:n.metadata?.toolsDiscovered||0,timestamp:Date.now()})}else ne.error(`[NeuroLink] Failed to add external MCP server: ${e}`,{error:n.error});return n}catch(n){throw ne.error(`[NeuroLink] Error adding external MCP server: ${e}`,n),n}}async removeExternalMCPServer(e){this.invalidateToolCache();try{ne.info(`[NeuroLink] Removing external MCP server: ${e}`);let t=await this.externalServerManager.removeServer(e);return t.success?(ne.info(`[NeuroLink] External MCP server removed successfully: ${e}`),this.emitter.emit("externalMCP:serverRemoved",{serverId:e,timestamp:Date.now()})):ne.error(`[NeuroLink] Failed to remove external MCP server: ${e}`,{error:t.error}),t}catch(t){throw ne.error(`[NeuroLink] Error removing external MCP server: ${e}`,t),t}}listExternalMCPServers(){let e=this.externalServerManager.getServerStatuses(),t=this.externalServerManager.listServers();return e.map(n=>{let o=t.find(i=>i.id===n.serverId);return{serverId:n.serverId,status:n.status,toolCount:n.toolCount,uptime:n.performance.uptime,isHealthy:n.isHealthy,config:o||{}}})}getExternalMCPServer(e){return this.externalServerManager.getServer(e)}async executeExternalMCPTool(e,t,n,o){try{ne.debug(`[NeuroLink] Executing external MCP tool: ${t} on ${e}`);let i=await this.externalServerManager.executeTool(e,t,n,o);return ne.debug(`[NeuroLink] External MCP tool executed successfully: ${t}`),i}catch(i){throw ne.error(`[NeuroLink] External MCP tool execution failed: ${t}`,i),i}}getExternalMCPTools(){return this.externalServerManager.getAllTools()}getExternalMCPServerTools(e){return this.externalServerManager.getServerTools(e)}async testExternalMCPConnection(e){try{let{MCPClientFactory:t}=await We(Promise.resolve().then(()=>(X1(),LEe)),1e4),n=await t.testConnection(e,1e4);return{success:n.success,error:n.error,toolCount:n.capabilities?1:0}}catch(t){return{success:!1,error:t instanceof Error?t.message:String(t)}}}getExternalMCPStatistics(){return this.externalServerManager.getStatistics()}async shutdownExternalMCPServers(){try{ne.info("[NeuroLink] Shutting down all external MCP servers..."),this.unregisterAllExternalMCPToolsFromRegistry(),await this.externalServerManager.shutdown(),ne.info("[NeuroLink] All external MCP servers shut down successfully")}catch(e){throw ne.error("[NeuroLink] Error shutting down external MCP servers:",e),e}}async getElicitationManager(){return(await We(Promise.resolve().then(()=>(m9(),bke)),1e4)).globalElicitationManager}async registerElicitationHandler(e){(await this.getElicitationManager()).registerHandler(e)}async getMultiServerManager(){return(await We(Promise.resolve().then(()=>(y1(),G_e)),1e4)).globalMultiServerManager}async getEnhancedToolDiscovery(){let e=await We(Promise.resolve().then(()=>(v1(),V_e)),1e4);return new e.EnhancedToolDiscovery(this.toolRegistry)}async getMCPRegistryClient(){return(await We(Promise.resolve().then(()=>(y9(),Tke)),1e4)).globalMCPRegistryClient}async exposeAgentAsTool(e,t){return(await We(Promise.resolve().then(()=>(MU(),T9)),1e4)).exposeAgentAsTool(e,t)}async exposeWorkflowAsTool(e,t){return(await We(Promise.resolve().then(()=>(MU(),T9)),1e4)).exposeWorkflowAsTool(e,t)}async getToolIntegrationManager(){return(await We(Promise.resolve().then(()=>(I9(),Ske)),1e4)).globalToolIntegrationManager}async convertToolsToMCPFormat(e,t={}){let n=await We(Promise.resolve().then(()=>(LU(),F9)),1e4),o=e.map(i=>({...i,execute:i.execute??(async()=>({success:!1,error:"No execute function provided"}))}));return n.batchConvertToMCP(o,t)}async convertToolsFromMCPFormat(e,t={}){return(await We(Promise.resolve().then(()=>(LU(),F9)),1e4)).batchConvertToNeuroLink(e,t)}async getToolAnnotations(e){let{inferAnnotations:t,mergeAnnotations:n,getAnnotationSummary:o}=await We(Promise.resolve().then(()=>(Wx(),B_e)),1e4),i=this.toolRegistry.getToolInfo(e);if(!i)return null;let s=i.tool.annotations,a=t({name:i.tool.name,description:i.tool.description??""}),l=n(a,s);return{annotations:l,summary:o(l)}}convertExternalMCPToolsToAISDKFormat(){let e=this.externalServerManager.getAllTools(),t={};for(let n of e)if(n.isAvailable){let o={description:n.description,execute:async i=>{try{ne.debug(`[NeuroLink] Executing external MCP tool via AI SDK: ${n.name}`,{params:i});let s=await this.externalServerManager.executeTool(n.serverId,n.name,i,{timeout:3e4});return ne.debug(`[NeuroLink] External MCP tool execution result: ${n.name}`,{success:!!s,hasData:!!(s&&typeof s=="object"&&"content"in s)}),s}catch(s){throw ne.error(`[NeuroLink] External MCP tool execution failed: ${n.name}`,s),s}}};t[n.name]=o,ne.debug(`[NeuroLink] Converted external MCP tool to AI SDK format: ${n.name} from server ${n.serverId}`)}return ne.info(`[NeuroLink] Converted ${Object.keys(t).length} external MCP tools to AI SDK format`),t}convertJSONSchemaToAISDKFormat(e){}unregisterExternalMCPToolsFromRegistry(e){try{let t=this.externalServerManager.getServerTools(e);for(let n of t)this.toolRegistry.removeTool(n.name),ne.debug(`[NeuroLink] Unregistered external MCP tool from main registry: ${n.name}`)}catch(t){ne.error(`[NeuroLink] Failed to unregister external MCP tools from registry for server ${e}:`,t)}}unregisterExternalMCPToolFromRegistry(e){try{this.toolRegistry.removeTool(e),ne.debug(`[NeuroLink] Unregistered external MCP tool from main registry: ${e}`)}catch(t){ne.error(`[NeuroLink] Failed to unregister external MCP tool ${e} from registry:`,t)}}async lazyInitializeConversationMemory(e,t,n){try{let{initializeConversationMemory:o}=await Nke().then(()=>Oke),i=await o(this.conversationMemoryConfig);this.conversationMemory=i,this.conversationMemoryNeedsInit=!1}catch(o){throw g.error("[NeuroLink] \u274C LOG_POINT_G005_MEMORY_LAZY_INIT_ERROR",{logPoint:"G005_MEMORY_LAZY_INIT_ERROR",generateInternalId:e,timestamp:new Date().toISOString(),elapsedMs:Date.now()-t,elapsedNs:(process.hrtime.bigint()-n).toString(),error:o instanceof Error?o.message:String(o),errorName:o instanceof Error?o.name:"UnknownError",errorStack:o instanceof Error?o.stack:void 0,message:"Lazy conversation memory initialization failed"}),o}}unregisterAllExternalMCPToolsFromRegistry(){try{let e=this.externalServerManager.getAllTools();for(let t of e)this.toolRegistry.removeTool(t.name);ne.debug(`[NeuroLink] Unregistered ${e.length} external MCP tools from main registry`)}catch(e){ne.error("[NeuroLink] Failed to unregister all external MCP tools from registry:",e)}}async createEvaluationPipeline(e){let{EvaluationPipeline:t,getPreset:n}=await We(Promise.resolve().then(()=>(nv(),F_)),1e4,ge.evaluationTimeout("evaluation module load",1e4)),o;typeof e=="string"?o=n(e):o=e;let i=new t(o);return await We(i.initialize(),3e4,ge.evaluationTimeout("pipeline initialization",3e4)),g.debug(`[NeuroLink] Created evaluation pipeline: ${o.name??"custom"}`),i}async evaluate(e,t){let{EvaluationPipeline:n,getPreset:o}=await We(Promise.resolve().then(()=>(nv(),F_)),1e4,ge.evaluationTimeout("evaluation module load",1e4)),i;if(t?.pipeline&&t?.scorers)throw new Error("Cannot specify both 'pipeline' and 'scorers' options. Use one or the other.");if(t?.scorers&&t.scorers.length===0)throw new Error("The 'scorers' array must not be empty. Provide at least one scorer ID or omit the option to use the default 'quality' preset.");t?.pipeline?i={...o(t.pipeline)}:t?.scorers&&t.scorers.length>0?i={name:"SDK Evaluation",description:"Evaluation from NeuroLink SDK",scorers:t.scorers.map(u=>({id:u})),executionMode:t.executionMode??"parallel",passThreshold:t.passThreshold??.7}:i=o("quality"),t?.passThreshold!==void 0&&(i.passThreshold=t.passThreshold),t?.executionMode!==void 0&&(i.executionMode=t.executionMode);let s=new n(i);await We(s.initialize(),3e4,ge.evaluationTimeout("pipeline initialization",3e4));let a=t?.timeoutMs??6e4,l=await We(s.execute(e,{correlationId:t?.correlationId}),a,ge.evaluationTimeout("pipeline execution",a));return g.debug("[NeuroLink] Evaluation completed",{pipeline:i.name,overallScore:l.overallScore,passed:l.passed,scorerCount:l.scores.length}),l}async score(e,t,n){let{ScorerRegistry:o}=await We(Promise.resolve().then(()=>(JP(),t4)),1e4,ge.evaluationTimeout("scorer module load",1e4));await We(o.registerBuiltInScorers(),3e4,ge.evaluationTimeout("scorer bootstrap",3e4));let i=await We(o.getScorer(e,n),3e4,ge.evaluationTimeout(`scorer load: ${e}`,3e4));if(!i)throw ge.scorerNotFound(e);let s=i.validateInput(t);if(!s.valid)throw ge.evaluationValidationFailed(e,s.errors);let a=await We(i.score(t),6e4,ge.evaluationTimeout("scorer execution",6e4));return g.debug("[NeuroLink] Scoring completed",{scorerId:e,score:a.score,passed:a.passed,computeTime:a.computeTime}),a}async getAvailableScorers(e){let{ScorerRegistry:t}=await We(Promise.resolve().then(()=>(JP(),t4)),1e4,ge.evaluationTimeout("scorer module load",1e4));await We(t.registerBuiltInScorers(),3e4,ge.evaluationTimeout("scorer bootstrap",3e4));let n=t.list();return e?.category&&(n=n.filter(o=>o.category===e.category)),e?.type&&(n=n.filter(o=>o.type===e.type)),n}async getEvaluationPresets(){let{getPresetNames:e}=await We(Promise.resolve().then(()=>(nv(),F_)),1e4,ge.evaluationTimeout("evaluation module load",1e4));return e()}async getEvaluationPreset(e){let{getPreset:t}=await We(Promise.resolve().then(()=>(nv(),F_)),1e4,ge.evaluationTimeout("evaluation module load",1e4));return t(e)}async dispose(){g.debug("[NeuroLink] Starting disposal of resources..."),this.lastCompactionMessageCount.clear();let e=[];try{try{g.debug("[NeuroLink] Flushing and shutting down OpenTelemetry..."),await bD(),await TD(),g.debug("[NeuroLink] OpenTelemetry shutdown successfully")}catch(t){let n=t instanceof Error?t:new Error(`OpenTelemetry shutdown error: ${String(t)}`);e.push(n),g.warn("[NeuroLink] Error shutting down OpenTelemetry:",t)}if(this.externalServerManager)try{g.debug("[NeuroLink] Shutting down external MCP servers..."),await this.externalServerManager.shutdown(),g.debug("[NeuroLink] External MCP servers shutdown successfully")}catch(t){let n=t instanceof Error?t:new Error(`External server shutdown error: ${String(t)}`);e.push(n),g.warn("[NeuroLink] Error shutting down external MCP servers:",t)}if(this.emitter)try{g.debug("[NeuroLink] Removing all event listeners..."),this.emitter.removeAllListeners(),g.clearEventEmitter(),g.debug("[NeuroLink] Event listeners removed successfully")}catch(t){let n=t instanceof Error?t:new Error(`Event emitter cleanup error: ${String(t)}`);e.push(n),g.warn("[NeuroLink] Error removing event listeners:",t)}if(this.toolCircuitBreakers&&this.toolCircuitBreakers.size>0)try{g.debug(`[NeuroLink] Clearing ${this.toolCircuitBreakers.size} circuit breakers...`),this.toolCircuitBreakers.clear(),g.debug("[NeuroLink] Circuit breakers cleared successfully")}catch(t){let n=t instanceof Error?t:new Error(`Circuit breaker cleanup error: ${String(t)}`);e.push(n),g.warn("[NeuroLink] Error clearing circuit breakers:",t)}try{g.debug("[NeuroLink] Clearing maps and caches..."),this.toolExecutionMetrics&&this.toolExecutionMetrics.clear(),this.activeToolExecutions&&this.activeToolExecutions.clear(),this.currentStreamToolExecutions&&(this.currentStreamToolExecutions.length=0),this.toolExecutionHistory&&(this.toolExecutionHistory.length=0),this.toolCache&&(this.toolCache.tools=[],this.toolCache.timestamp=0),this.mcpToolResultCache?.destroy(),this.mcpToolRouter?.destroy(),this.mcpToolBatcher?.destroy(),this.mcpToolResultCache=void 0,this.mcpToolRouter=void 0,this.mcpToolBatcher=void 0,this.mcpEnhancedDiscovery=void 0,this.mcpToolMiddlewares=[],g.debug("[NeuroLink] Maps and caches cleared successfully")}catch(t){let n=t instanceof Error?t:new Error(`Cache cleanup error: ${String(t)}`);e.push(n),g.warn("[NeuroLink] Error clearing caches:",t)}try{g.debug("[NeuroLink] Resetting initialization state..."),this.mcpInitialized=!1,this.mcpInitPromise=null,this.conversationMemoryNeedsInit=!1,g.debug("[NeuroLink] Initialization state reset successfully")}catch(t){let n=t instanceof Error?t:new Error(`State reset error: ${String(t)}`);e.push(n),g.warn("[NeuroLink] Error resetting state:",t)}e.length===0?g.debug("[NeuroLink] \u2705 Resource disposal completed successfully"):g.warn(`[NeuroLink] \u26A0\uFE0F Resource disposal completed with ${e.length} errors`,{errors:e.map(t=>t.message)})}catch(t){throw g.error("[NeuroLink] Critical error during disposal:",t),t}}getToolRegistry(){return this.toolRegistry}async compactSession(e,t){if(!this.conversationMemory)return null;let n=await this.conversationMemory.buildContextMessages(e);if(!n||n.length===0)return null;let o=new fm({...t,summarizationProvider:t?.summarizationProvider??this.conversationMemoryConfig?.conversationMemory?.summarizationProvider,summarizationModel:t?.summarizationModel??this.conversationMemoryConfig?.conversationMemory?.summarizationModel}),i=is({provider:t?.provider||"openai",conversationMessages:n}),s=Math.floor(i.availableInputTokens*.6),a=await o.compact(n,s,this.conversationMemoryConfig?.conversationMemory);return a.compacted&&Vx(a.messages),a}async getContextStats(e,t,n){if(!this.conversationMemory)return null;let o=await this.conversationMemory.buildContextMessages(e);if(!o||o.length===0)return null;let i=is({provider:t||"openai",model:n,conversationMessages:o});return{estimatedInputTokens:i.estimatedInputTokens,availableInputTokens:i.availableInputTokens,usageRatio:i.usageRatio,shouldCompact:i.shouldCompact,messageCount:o.length}}needsCompaction(e,t,n){if(!this.conversationMemory)return!1;let o=this.conversationMemory.getSession?.(e);return o?is({provider:t||"openai",model:n,conversationMessages:o.messages}).shouldCompact:!1}async setAuthProvider(e){if(this.authInitPromise=void 0,"authenticateToken"in e&&typeof e.authenticateToken=="function")this.authProvider=e,g.info(`Auth provider set: ${this.authProvider.type}`);else if("provider"in e)this.authProvider=e.provider,g.info(`Auth provider set: ${this.authProvider.type}`);else{let t=e,{AuthProviderFactory:n}=await Promise.resolve().then(()=>(tC(),Dke));this.authProvider=await n.createProvider(t.type,t.config),g.info(`Auth provider created and set: ${t.type}`)}this.authProvider&&this.emitter.emit("auth:provider:set",{type:this.authProvider.type,timestamp:Date.now()})}getAuthProvider(){return this.authProvider}async ensureAuthProvider(){this.authProvider||!this.pendingAuthConfig||(this.authInitPromise??=(async()=>{try{await this.setAuthProvider(this.pendingAuthConfig),this.pendingAuthConfig=void 0}catch(e){throw this.authInitPromise=void 0,e}})(),await this.authInitPromise)}async setAuthContext(e){let{globalAuthContext:t}=await Promise.resolve().then(()=>(Fx(),BL));t.set(e),g.debug("Auth context set",{userId:e.user.id,provider:e.provider,sessionId:e.session?.id})}async getAuthContext(){let{getAuthContext:e}=await Promise.resolve().then(()=>(Fx(),BL));return e()}async clearAuthContext(){let{globalAuthContext:e}=await Promise.resolve().then(()=>(Fx(),BL)),t=e.get()?.user.id;e.clear(),t&&g.debug(`Auth context cleared for user: ${t}`)}getExternalServerManager(){return this.externalServerManager}},Uke=new uh,M2t=Uke});var or,en,Qt,Z9=R(()=>{"use strict";or={CONFIG:"CONFIG",VALIDATION:"VALIDATION",EXECUTION:"EXECUTION",EXTERNAL:"EXTERNAL",RATE_LIMIT:"RATE_LIMIT",AUTHENTICATION:"AUTHENTICATION",AUTHORIZATION:"AUTHORIZATION",STREAMING:"STREAMING",WEBSOCKET:"WEBSOCKET"},en={LOW:"LOW",MEDIUM:"MEDIUM",HIGH:"HIGH",CRITICAL:"CRITICAL"},Qt={INVALID_CONFIG:"SERVER_ADAPTER_INVALID_CONFIG",MISSING_DEPENDENCY:"SERVER_ADAPTER_MISSING_DEPENDENCY",FRAMEWORK_INIT_FAILED:"SERVER_ADAPTER_FRAMEWORK_INIT_FAILED",ROUTE_NOT_FOUND:"SERVER_ADAPTER_ROUTE_NOT_FOUND",ROUTE_CONFLICT:"SERVER_ADAPTER_ROUTE_CONFLICT",INVALID_ROUTE:"SERVER_ADAPTER_INVALID_ROUTE",HANDLER_ERROR:"SERVER_ADAPTER_HANDLER_ERROR",TIMEOUT:"SERVER_ADAPTER_TIMEOUT",MIDDLEWARE_ERROR:"SERVER_ADAPTER_MIDDLEWARE_ERROR",RATE_LIMIT_EXCEEDED:"SERVER_ADAPTER_RATE_LIMIT_EXCEEDED",AUTH_REQUIRED:"SERVER_ADAPTER_AUTH_REQUIRED",AUTH_INVALID:"SERVER_ADAPTER_AUTH_INVALID",FORBIDDEN:"SERVER_ADAPTER_FORBIDDEN",STREAM_ERROR:"SERVER_ADAPTER_STREAM_ERROR",STREAM_ABORTED:"SERVER_ADAPTER_STREAM_ABORTED",WEBSOCKET_ERROR:"SERVER_ADAPTER_WEBSOCKET_ERROR",WEBSOCKET_CONNECTION_FAILED:"SERVER_ADAPTER_WEBSOCKET_CONNECTION_FAILED",VALIDATION_ERROR:"SERVER_ADAPTER_VALIDATION_ERROR",SCHEMA_ERROR:"SERVER_ADAPTER_SCHEMA_ERROR",START_FAILED:"SERVER_ADAPTER_START_FAILED",STOP_FAILED:"SERVER_ADAPTER_STOP_FAILED",ALREADY_RUNNING:"SERVER_ADAPTER_ALREADY_RUNNING",NOT_RUNNING:"SERVER_ADAPTER_NOT_RUNNING"}});function Vu(r,e,t,n){if(r instanceof Ar)return r;let o=r instanceof Error?r.message:String(r),i=r instanceof Error?r:void 0;return new nC(o,i,e,t,n)}var Ar,GU,VU,qU,Fc,Jd,ph,Pb,Gu,HU,nC,WU,KU,oc,Mb,Im,$c,zc,JU,oC,iC,sC,ZU,Yke,ic=R(()=>{"use strict";Z9();Ar=class r extends Error{code;category;severity;retryable;retryAfterMs;requestId;path;method;details;cause;constructor(e,t,n={}){super(e),this.name="ServerAdapterError",this.code=t,this.category=n.category??or.EXECUTION,this.severity=n.severity??en.MEDIUM,this.retryable=n.retryable??!1,this.retryAfterMs=n.retryAfterMs,this.requestId=n.requestId,this.path=n.path,this.method=n.method,this.details=n.details,this.cause=n.cause,Error.captureStackTrace&&Error.captureStackTrace(this,r)}toJSON(){return{error:{code:this.code,message:this.message,category:this.category,requestId:this.requestId,details:this.details,retryAfter:this.retryAfterMs?Math.ceil(this.retryAfterMs/1e3):void 0}}}getHttpStatus(){switch(this.code){case Qt.VALIDATION_ERROR:case Qt.SCHEMA_ERROR:case Qt.INVALID_CONFIG:case Qt.INVALID_ROUTE:return 400;case Qt.AUTH_REQUIRED:case Qt.AUTH_INVALID:return 401;case Qt.FORBIDDEN:return 403;case Qt.ROUTE_NOT_FOUND:return 404;case Qt.RATE_LIMIT_EXCEEDED:return 429;case Qt.TIMEOUT:return 408;case Qt.STREAM_ABORTED:return 499;default:return 500}}},GU=class extends Ar{constructor(e,t,n){super(e,Qt.INVALID_CONFIG,{category:or.CONFIG,severity:en.HIGH,retryable:!1,details:t,cause:n}),this.name="ConfigurationError"}},VU=class extends Ar{constructor(e,t,n){super(`Route conflict: ${t} ${e} conflicts with existing route${n?`: ${n}`:""}`,Qt.ROUTE_CONFLICT,{category:or.CONFIG,severity:en.HIGH,retryable:!1,path:e,method:t,details:{existingRoute:n}}),this.name="RouteConflictError"}},qU=class extends Ar{constructor(e,t,n){super(`Route not found: ${t} ${e}`,Qt.ROUTE_NOT_FOUND,{category:or.VALIDATION,severity:en.LOW,retryable:!1,path:e,method:t,requestId:n}),this.name="RouteNotFoundError"}},Fc=class extends Ar{errors;constructor(e,t){super(`Validation failed: ${e.map(n=>n.message).join(", ")}`,Qt.VALIDATION_ERROR,{category:or.VALIDATION,severity:en.LOW,retryable:!1,requestId:t,details:{errors:e}}),this.name="ValidationError",this.errors=e}},Jd=class extends Ar{constructor(e="Authentication required",t){super(e,Qt.AUTH_REQUIRED,{category:or.AUTHENTICATION,severity:en.MEDIUM,retryable:!1,requestId:t}),this.name="AuthenticationError"}},ph=class extends Ar{constructor(e="Invalid authentication credentials",t){super(e,Qt.AUTH_INVALID,{category:or.AUTHENTICATION,severity:en.MEDIUM,retryable:!1,requestId:t}),this.name="InvalidAuthenticationError"}},Pb=class extends Ar{constructor(e="Access forbidden",t,n){super(e,Qt.FORBIDDEN,{category:or.AUTHORIZATION,severity:en.MEDIUM,retryable:!1,requestId:t,details:{requiredPermissions:n}}),this.name="AuthorizationError"}},Gu=class extends Ar{constructor(e,t,n){super(t??"Too many requests, please try again later",Qt.RATE_LIMIT_EXCEEDED,{category:or.RATE_LIMIT,severity:en.MEDIUM,retryable:!0,retryAfterMs:e,requestId:n}),this.name="RateLimitError"}},HU=class extends Ar{constructor(e,t,n){super(`Operation timed out after ${e}ms${t?`: ${t}`:""}`,Qt.TIMEOUT,{category:or.EXECUTION,severity:en.MEDIUM,retryable:!0,requestId:n,details:{timeoutMs:e,operation:t}}),this.name="TimeoutError"}},nC=class extends Ar{constructor(e,t,n,o,i){super(e,Qt.HANDLER_ERROR,{category:or.EXECUTION,severity:en.HIGH,retryable:!1,cause:t,requestId:n,path:o,method:i}),this.name="HandlerError"}},WU=class extends Ar{constructor(e,t,n){super(e,Qt.STREAM_ERROR,{category:or.STREAMING,severity:en.MEDIUM,retryable:!1,cause:t,requestId:n}),this.name="StreamingError"}},KU=class extends Ar{constructor(e,t){super(`Stream aborted${e?`: ${e}`:""}`,Qt.STREAM_ABORTED,{category:or.STREAMING,severity:en.LOW,retryable:!1,requestId:t,details:{reason:e}}),this.name="StreamAbortedError"}},oc=class extends Ar{constructor(e,t,n){super(e,Qt.WEBSOCKET_ERROR,{category:or.WEBSOCKET,severity:en.MEDIUM,retryable:!0,cause:t,details:{connectionId:n}}),this.name="WebSocketError"}},Mb=class extends Ar{constructor(e="WebSocket connection failed",t){super(e,Qt.WEBSOCKET_CONNECTION_FAILED,{category:or.WEBSOCKET,severity:en.HIGH,retryable:!0,cause:t}),this.name="WebSocketConnectionError"}},Im=class extends Ar{constructor(e,t,n,o){super(e,Qt.START_FAILED,{category:or.CONFIG,severity:en.CRITICAL,retryable:!0,cause:t,details:{port:n,host:o}}),this.name="ServerStartError"}},$c=class extends Ar{constructor(e,t){super(e,Qt.STOP_FAILED,{category:or.EXECUTION,severity:en.HIGH,retryable:!1,cause:t}),this.name="ServerStopError"}},zc=class extends Ar{constructor(e,t){super(`Server is already running${e&&t?` on ${t}:${e}`:""}`,Qt.ALREADY_RUNNING,{category:or.CONFIG,severity:en.LOW,retryable:!1,details:{port:e,host:t}}),this.name="AlreadyRunningError"}},JU=class extends Ar{constructor(){super("Server is not running",Qt.NOT_RUNNING,{category:or.CONFIG,severity:en.LOW,retryable:!1}),this.name="NotRunningError"}},oC=class extends Ar{timeoutMs;remainingConnections;constructor(e,t){super(`Shutdown timed out after ${e}ms with ${t} active connection(s)`,Qt.STOP_FAILED,{category:or.EXECUTION,severity:en.HIGH,retryable:!1,details:{timeoutMs:e,remainingConnections:t}}),this.name="ShutdownTimeoutError",this.timeoutMs=e,this.remainingConnections=t}},iC=class extends Ar{timeoutMs;remainingConnections;constructor(e,t){super(`Connection drain timed out after ${e}ms with ${t} active connection(s)`,Qt.STOP_FAILED,{category:or.EXECUTION,severity:en.MEDIUM,retryable:!1,details:{timeoutMs:e,remainingConnections:t}}),this.name="DrainTimeoutError",this.timeoutMs=e,this.remainingConnections=t}},sC=class extends Ar{currentState;expectedStates;operation;constructor(e,t,n){super(`Cannot ${e}: server is in '${t}' state, expected one of [${n.join(", ")}]`,Qt.STOP_FAILED,{category:or.CONFIG,severity:en.MEDIUM,retryable:!1,details:{operation:e,currentState:t,expectedStates:n}}),this.name="InvalidLifecycleStateError",this.currentState=t,this.expectedStates=n,this.operation=e}},ZU=class extends Ar{constructor(e,t,n){super(`Missing dependency '${e}' for ${t} adapter. ${n?`Install with: ${n}`:""}`,Qt.MISSING_DEPENDENCY,{category:or.CONFIG,severity:en.CRITICAL,retryable:!1,details:{dependency:e,framework:t,installCommand:n}}),this.name="MissingDependencyError"}},Yke={[or.CONFIG]:{strategy:"fail",maxRetries:0,baseDelayMs:0},[or.VALIDATION]:{strategy:"fail",maxRetries:0,baseDelayMs:0},[or.EXECUTION]:{strategy:"retry",maxRetries:3,baseDelayMs:1e3},[or.EXTERNAL]:{strategy:"exponentialBackoff",maxRetries:5,baseDelayMs:1e3},[or.RATE_LIMIT]:{strategy:"exponentialBackoff",maxRetries:3,baseDelayMs:5e3},[or.AUTHENTICATION]:{strategy:"fail",maxRetries:0,baseDelayMs:0},[or.AUTHORIZATION]:{strategy:"fail",maxRetries:0,baseDelayMs:0},[or.STREAMING]:{strategy:"retry",maxRetries:2,baseDelayMs:500},[or.WEBSOCKET]:{strategy:"exponentialBackoff",maxRetries:5,baseDelayMs:1e3}}});var jc,Ob=R(()=>{"use strict";Io();rr();rr();Et();oe();ic();jc=class extends lr{config;redactionConfig;neurolink;toolRegistry;externalServerManager;routes=new Map;middlewares=[];isRunning=!1;startTime;lifecycleState="uninitialized";activeConnections=new Map;shutdownConfig;constructor(e,t={}){super(),this.neurolink=e,this.toolRegistry=e.getToolRegistry(),this.externalServerManager=e.getExternalServerManager(),this.redactionConfig=t.redaction,this.shutdownConfig={gracefulShutdownTimeoutMs:t.shutdown?.gracefulShutdownTimeoutMs??3e4,drainTimeoutMs:t.shutdown?.drainTimeoutMs??15e3,forceClose:t.shutdown?.forceClose??!0},this.config={port:t.port??3e3,host:t.host??"0.0.0.0",basePath:t.basePath??"/api",cors:{enabled:t.cors?.enabled??!0,origins:t.cors?.origins??["*"],methods:t.cors?.methods??["GET","POST","PUT","DELETE","PATCH","OPTIONS"],headers:t.cors?.headers??["Content-Type","Authorization","X-Request-ID"],credentials:t.cors?.credentials??!1,maxAge:t.cors?.maxAge??86400},rateLimit:{enabled:t.rateLimit?.enabled??!0,windowMs:t.rateLimit?.windowMs??900*1e3,maxRequests:t.rateLimit?.maxRequests??100,message:t.rateLimit?.message??"Too many requests, please try again later",skipPaths:t.rateLimit?.skipPaths,keyGenerator:t.rateLimit?.keyGenerator},bodyParser:{enabled:t.bodyParser?.enabled??!0,maxSize:t.bodyParser?.maxSize??"10mb",jsonLimit:t.bodyParser?.jsonLimit??"10mb",urlEncoded:t.bodyParser?.urlEncoded??!0},logging:{enabled:t.logging?.enabled??!0,level:t.logging?.level??"info",includeBody:t.logging?.includeBody??!1,includeResponse:t.logging?.includeResponse??!1},timeout:t.timeout??3e4,enableMetrics:t.enableMetrics??!0,enableSwagger:t.enableSwagger??!1,disableBuiltInHealth:t.disableBuiltInHealth??!1,shutdown:this.shutdownConfig}}async initialize(){if(this.lifecycleState!=="uninitialized"&&this.lifecycleState!=="stopped")throw new sC("initialize",this.lifecycleState,["uninitialized","stopped"]);this.lifecycleState="initializing",g.info("[ServerAdapter] Initializing server adapter",{port:this.config.port,host:this.config.host,basePath:this.config.basePath});let e=ye.createSpan("server.request","server.initialize",{"server.operation":"initialize","server.port":this.config.port,"server.host":this.config.host}),t=Date.now();try{this.initializeFramework(),this.registerBuiltInMiddleware(),await this.registerBuiltInRoutes(),this.lifecycleState="initialized",this.emit("initialized",{config:this.config,routeCount:this.routes.size,middlewareCount:this.middlewares.length}),g.info("[ServerAdapter] Server adapter initialized",{routes:this.routes.size,middlewares:this.middlewares.length}),e.durationMs=Date.now()-t;let n=ye.endSpan(e,1);Ne().recordSpan(n)}catch(n){this.lifecycleState="error",e.durationMs=Date.now()-t;let o=ye.endSpan(e,2);throw o.statusMessage=n instanceof Error?n.message:String(n),Ne().recordSpan(o),n}}registerRoute(e){let t=`${e.method.toUpperCase()}:${e.path}`;this.routes.has(t)&&g.warn(`[ServerAdapter] Route ${t} already exists, replacing`),this.routes.set(t,e),this.registerFrameworkRoute(e),g.debug(`[ServerAdapter] Registered route: ${t}`,{description:e.description,streaming:e.streaming?.enabled,auth:e.auth})}registerRouteGroup(e){if(e.middleware)for(let t of e.middleware)this.registerMiddleware({...t,paths:t.paths??[e.prefix]});for(let t of e.routes){let n=!t.path.startsWith(e.prefix),o=this.normalizePath(n?`${e.prefix}${t.path}`:t.path),i={...t,path:o};this.registerRoute(i)}g.debug(`[ServerAdapter] Registered route group: ${e.prefix}`,{routes:e.routes.length,middleware:e.middleware?.length??0})}normalizePath(e){return"/"+e.split("/").filter(Boolean).join("/")}registerMiddleware(e){this.middlewares.push(e),this.registerFrameworkMiddleware(e),g.debug(`[ServerAdapter] Registered middleware: ${e.name}`,{order:e.order,paths:e.paths})}createContext(e){return{requestId:e.requestId,method:e.method,path:e.path,headers:e.headers,query:e.query??{},params:e.params??{},body:e.body,neurolink:this.neurolink,toolRegistry:this.toolRegistry,externalServerManager:this.externalServerManager,timestamp:Date.now(),metadata:{},redaction:this.redactionConfig}}registerBuiltInMiddleware(){this.registerMiddleware({name:"requestId",order:0,handler:async(e,t)=>(e.requestId=e.requestId||this.generateRequestId(),t())}),this.config.logging.enabled&&this.registerMiddleware({name:"logging",order:1,handler:async(e,t)=>{let n=Date.now();g.info(`[ServerAdapter] ${e.method} ${e.path}`,{requestId:e.requestId});let o=await t();return g.info(`[ServerAdapter] ${e.method} ${e.path} completed`,{requestId:e.requestId,duration:Date.now()-n}),o}})}async registerBuiltInRoutes(){this.config.disableBuiltInHealth||(this.registerRoute({method:"GET",path:`${this.config.basePath}/health`,handler:async()=>({status:"ok",timestamp:new Date().toISOString(),uptime:this.startTime?Date.now()-this.startTime.getTime():0,version:process.env.npm_package_version||"unknown"}),description:"Health check endpoint",tags:["system"]}),this.registerRoute({method:"GET",path:`${this.config.basePath}/ready`,handler:async e=>{let t=e.toolRegistry,n=this.config.timeout||5e3,o,i;try{o=await We(t.listTools(),n,new Error(`toolRegistry.listTools timed out after ${n}ms`)),i=o.length>0}catch(s){g.warn("[ServerAdapter] Tool registry check timed out",{timeout:n,error:s instanceof Error?s.message:String(s)}),i=!1}return{ready:!0,timestamp:new Date().toISOString(),services:{neurolink:!0,tools:i,externalServers:!!e.externalServerManager}}},description:"Readiness check endpoint",tags:["system"]})),this.config.enableMetrics&&this.registerRoute({method:"GET",path:`${this.config.basePath}/metrics`,handler:async()=>{let e=this.getStatus();return{server:{running:e.running,uptime:e.uptime,routes:e.routes,middlewares:e.middlewares},process:{memoryUsage:process.memoryUsage(),cpuUsage:process.cpuUsage(),pid:process.pid},timestamp:new Date().toISOString()}},description:"Server metrics endpoint",tags:["system"]})}generateRequestId(){return`req-${Date.now()}-${Math.random().toString(36).substring(2,11)}`}getLifecycleState(){return this.lifecycleState}trackConnection(e,t,n){this.activeConnections.set(e,{id:e,createdAt:Date.now(),socket:t,requestId:n,isActive:!0}),g.debug("[ServerAdapter] Connection tracked",{connectionId:e,activeConnections:this.activeConnections.size})}untrackConnection(e){this.activeConnections.delete(e)&&g.debug("[ServerAdapter] Connection untracked",{connectionId:e,activeConnections:this.activeConnections.size})}getActiveConnectionCount(){return this.activeConnections.size}async gracefulShutdown(){let{gracefulShutdownTimeoutMs:e,drainTimeoutMs:t,forceClose:n}=this.shutdownConfig;g.info("[ServerAdapter] Starting graceful shutdown",{activeConnections:this.activeConnections.size,gracefulShutdownTimeoutMs:e,drainTimeoutMs:t});let o=ye.createSpan("server.request","server.shutdown",{"server.operation":"gracefulShutdown","server.activeConnections":this.activeConnections.size}),i=Date.now(),s,a;try{this.lifecycleState="draining",await this.stopAcceptingConnections(),g.info("[ServerAdapter] Stopped accepting new connections");let l=this.drainConnections(),u=new Promise((f,h)=>{s=setTimeout(()=>{h(new oC(e,this.activeConnections.size))},e)}),d=new Promise(f=>{a=setTimeout(()=>{f("drain_timeout")},t)});if(await Promise.race([l,d])==="drain_timeout"&&this.activeConnections.size>0)if(g.warn("[ServerAdapter] Drain timeout reached",{remainingConnections:this.activeConnections.size}),n)g.info("[ServerAdapter] Force closing remaining connections"),await this.forceCloseConnections();else throw new iC(t,this.activeConnections.size);this.lifecycleState="stopping",await Promise.race([this.closeServer(),u]),g.info("[ServerAdapter] Server closed successfully"),o.durationMs=Date.now()-i;let m=ye.endSpan(o,1);Ne().recordSpan(m)}catch(l){if(n&&(l instanceof oC||l instanceof iC)){g.warn("[ServerAdapter] Timeout during shutdown, forcing close",{error:l.message}),await this.forceCloseConnections(),await this.closeServer(),o.durationMs=Date.now()-i;let u=ye.endSpan(o,1);Ne().recordSpan(u)}else{this.lifecycleState="error",o.durationMs=Date.now()-i;let u=ye.endSpan(o,2);throw u.statusMessage=l instanceof Error?l.message:String(l),Ne().recordSpan(u),l}}finally{s&&clearTimeout(s),a&&clearTimeout(a)}}async drainConnections(){if(this.activeConnections.size===0){g.debug("[ServerAdapter] No active connections to drain");return}return g.info("[ServerAdapter] Draining connections",{count:this.activeConnections.size}),new Promise(e=>{let t=setInterval(()=>{this.activeConnections.size===0&&(clearInterval(t),g.info("[ServerAdapter] All connections drained"),e())},100)})}resetServerState(){this.isRunning=!1,this.startTime=void 0,this.activeConnections.clear(),this.lifecycleState="stopped",g.debug("[ServerAdapter] Server state reset for restart capability")}validateLifecycleState(e,t){if(!t.includes(this.lifecycleState))throw new sC(e,this.lifecycleState,t)}getStatus(){return{running:this.isRunning,port:this.config.port,host:this.config.host,uptime:this.startTime?Date.now()-this.startTime.getTime():0,routes:this.routes.size,middlewares:this.middlewares.length,lifecycleState:this.lifecycleState,activeConnections:this.activeConnections.size}}listRoutes(){return Array.from(this.routes.values())}getConfig(){return{...this.config}}}});function Zd(r){return typeof r=="object"&&r!==null&&"error"in r&&typeof r.error=="object"&&r.error!==null&&"code"in r.error&&"message"in r.error}function J2t(r){return{VALIDATION_ERROR:400,SCHEMA_ERROR:400,TOOL_NOT_FOUND:404,SERVER_NOT_FOUND:404,SESSION_NOT_FOUND:404,NOT_FOUND:404,AUTH_REQUIRED:401,AUTH_INVALID:401,FORBIDDEN:403,RATE_LIMIT_EXCEEDED:429,MCP_UNAVAILABLE:503,MEMORY_UNAVAILABLE:503,EXECUTION_FAILED:500,INTERNAL_ERROR:500}[r]??500}function Lt(r,e,t,n,o){return{error:{code:r,message:e,details:t},metadata:{timestamp:new Date().toISOString(),requestId:n},httpStatus:o??J2t(r)}}function Bc(r,e,t){let n=r.safeParse(e);return n.success?{success:!0,data:n.data}:{success:!1,error:Lt("VALIDATION_ERROR","Invalid request body",n.error.issues.map(o=>({path:o.path.join("."),message:o.message,code:o.code})),t)}}function rRe(r,e,t){let n=r.safeParse(e);return n.success?{success:!0,data:n.data}:{success:!1,error:Lt("VALIDATION_ERROR","Invalid query parameters",n.error.issues.map(o=>({path:o.path.join("."),message:o.message,code:o.code})),t)}}function ds(r,e,t){let n=r.safeParse(e);return n.success?{success:!0,data:n.data}:{success:!1,error:Lt("VALIDATION_ERROR","Invalid path parameters",n.error.issues.map(o=>({path:o.path.join("."),message:o.message,code:o.code})),t)}}var aC,XU,Nb,YU,mh,cC,Qke,X9,QZr,eXr,eRe,tRe,qu=R(()=>{"use strict";po();aC=c.object({input:c.union([c.string(),c.object({text:c.string(),images:c.array(c.string()).optional(),files:c.array(c.string()).optional()})]),provider:c.string().optional(),model:c.string().optional(),systemPrompt:c.string().optional(),temperature:c.number().min(0).max(2).optional(),maxTokens:c.number().positive().optional(),tools:c.array(c.string()).optional(),stream:c.boolean().optional(),sessionId:c.string().optional(),userId:c.string().optional()}),XU=c.object({name:c.string().min(1,"Tool name is required"),arguments:c.record(c.string(),c.unknown()).default({}),sessionId:c.string().optional(),userId:c.string().optional()}),Nb=c.record(c.string(),c.unknown()),YU=c.object({sessionId:c.string().min(1,"Session ID is required")}),mh=c.object({name:c.string().min(1,"Server name is required")}),cC=c.object({name:c.string().min(1,"Tool name is required")}),Qke=c.object({q:c.string().optional(),source:c.string().optional(),limit:c.string().transform(r=>parseInt(r,10)).pipe(c.number().positive().max(100)).optional()}),X9=c.object({id:c.string().min(1,"Session ID is required")}),QZr=c.object({userId:c.string().optional(),limit:c.string().transform(r=>parseInt(r,10)).pipe(c.number().positive().max(100)).optional(),offset:c.string().transform(r=>parseInt(r,10)).pipe(c.number().nonnegative()).optional()}),eXr=c.object({limit:c.string().transform(r=>parseInt(r,10)).pipe(c.number().positive().max(100)).optional(),offset:c.string().transform(r=>parseInt(r,10)).pipe(c.number().nonnegative()).optional()}),eRe=c.object({text:c.string().min(1,"Text is required"),provider:c.string().optional(),model:c.string().optional()}),tRe=c.object({texts:c.array(c.string().min(1)).min(1,"At least one text is required").max(2048,"Maximum 2048 texts per batch"),provider:c.string().optional(),model:c.string().optional()})});var nRe={};me(nRe,{Agent:()=>Rzt,BedrockClient:()=>X2t,BedrockRuntimeClient:()=>Q2t,Blob:()=>kzt,Client:()=>Azt,ConverseCommand:()=>ezt,ConverseStreamCommand:()=>tzt,Dispatcher:()=>Pzt,File:()=>Czt,FormData:()=>Ezt,GoogleAuth:()=>szt,HTTPException:()=>hzt,Headers:()=>wzt,Hippocampus:()=>lzt,HippocampusConfig:()=>uzt,Hono:()=>fzt,ImageFormat:()=>rzt,InvokeEndpointCommand:()=>ozt,InvokeEndpointWithResponseStreamCommand:()=>izt,ListFoundationModelsCommand:()=>Y2t,MockAgent:()=>Nzt,Pool:()=>Izt,Request:()=>Szt,Response:()=>_zt,SageMakerRuntimeClient:()=>nzt,TextToSpeechClient:()=>czt,VertexAI:()=>azt,cors:()=>gzt,createClient:()=>dzt,default:()=>Z2t,fetch:()=>Tzt,getGlobalDispatcher:()=>Ozt,interceptors:()=>Dzt,logger:()=>yzt,parseBuffer:()=>pzt,request:()=>Lzt,secureHeaders:()=>vzt,selectCover:()=>mzt,setGlobalDispatcher:()=>Mzt,streamSSE:()=>xzt,timeout:()=>bzt});var Db,ps,Z2t,X2t,Y2t,Q2t,ezt,tzt,rzt,nzt,ozt,izt,szt,azt,czt,lzt,uzt,dzt,pzt,mzt,fzt,gzt,hzt,yzt,vzt,xzt,bzt,Tzt,Szt,_zt,wzt,Ezt,Czt,kzt,Rzt,Izt,Azt,Pzt,Mzt,Ozt,Nzt,Dzt,Lzt,oRe=R(()=>{Db={get(r,e){return e==="__esModule"?!0:e==="default"?new Proxy({},{get:Db.get}):new Proxy(function(...t){return new Proxy({},{get:Db.get})},{get:Db.get,apply(t,n,o){return new Proxy({},{get:Db.get})},construct(t,n){return new Proxy({},{get:Db.get})}})}},ps=new Proxy({},Db),Z2t=ps,{BedrockClient:X2t,ListFoundationModelsCommand:Y2t,BedrockRuntimeClient:Q2t,ConverseCommand:ezt,ConverseStreamCommand:tzt,ImageFormat:rzt}=ps,{SageMakerRuntimeClient:nzt,InvokeEndpointCommand:ozt,InvokeEndpointWithResponseStreamCommand:izt}=ps,{GoogleAuth:szt,VertexAI:azt,TextToSpeechClient:czt}=ps,{Hippocampus:lzt,HippocampusConfig:uzt}=ps,{createClient:dzt}=ps,{parseBuffer:pzt,selectCover:mzt}=ps,{Hono:fzt}=ps,{cors:gzt,HTTPException:hzt,logger:yzt,secureHeaders:vzt,streamSSE:xzt,timeout:bzt}=ps,Tzt=globalThis.fetch,Szt=globalThis.Request,_zt=globalThis.Response,wzt=globalThis.Headers,Ezt=globalThis.FormData,Czt=globalThis.File,kzt=globalThis.Blob,Rzt=ps.Agent,Izt=ps.Pool,Azt=ps.Client,Pzt=ps.Dispatcher,Mzt=()=>{},Ozt=()=>ps,Nzt=ps.MockAgent,Dzt={redirect:()=>r=>r,retry:()=>r=>r},Lzt=async(r,e)=>{let t=await globalThis.fetch(r,e);return{statusCode:t.status,headers:Object.fromEntries(t.headers.entries()),body:{text:()=>t.text(),json:()=>t.json(),arrayBuffer:()=>t.arrayBuffer()}}}});var iRe={};me(iRe,{Agent:()=>gjt,BedrockClient:()=>Fzt,BedrockRuntimeClient:()=>zzt,Blob:()=>fjt,Client:()=>yjt,ConverseCommand:()=>jzt,ConverseStreamCommand:()=>Bzt,Dispatcher:()=>vjt,File:()=>mjt,FormData:()=>pjt,GoogleAuth:()=>Wzt,HTTPException:()=>njt,Headers:()=>djt,Hippocampus:()=>Zzt,HippocampusConfig:()=>Xzt,Hono:()=>tjt,ImageFormat:()=>Gzt,InvokeEndpointCommand:()=>qzt,InvokeEndpointWithResponseStreamCommand:()=>Hzt,ListFoundationModelsCommand:()=>$zt,MockAgent:()=>Tjt,Pool:()=>hjt,Request:()=>ljt,Response:()=>ujt,SageMakerRuntimeClient:()=>Vzt,TextToSpeechClient:()=>Jzt,VertexAI:()=>Kzt,cors:()=>rjt,createClient:()=>Yzt,default:()=>Uzt,fetch:()=>cjt,getGlobalDispatcher:()=>bjt,interceptors:()=>Sjt,logger:()=>ojt,parseBuffer:()=>Qzt,request:()=>_jt,secureHeaders:()=>ijt,selectCover:()=>ejt,setGlobalDispatcher:()=>xjt,streamSSE:()=>sjt,timeout:()=>ajt});var Lb,ms,Uzt,Fzt,$zt,zzt,jzt,Bzt,Gzt,Vzt,qzt,Hzt,Wzt,Kzt,Jzt,Zzt,Xzt,Yzt,Qzt,ejt,tjt,rjt,njt,ojt,ijt,sjt,ajt,cjt,ljt,ujt,djt,pjt,mjt,fjt,gjt,hjt,yjt,vjt,xjt,bjt,Tjt,Sjt,_jt,sRe=R(()=>{Lb={get(r,e){return e==="__esModule"?!0:e==="default"?new Proxy({},{get:Lb.get}):new Proxy(function(...t){return new Proxy({},{get:Lb.get})},{get:Lb.get,apply(t,n,o){return new Proxy({},{get:Lb.get})},construct(t,n){return new Proxy({},{get:Lb.get})}})}},ms=new Proxy({},Lb),Uzt=ms,{BedrockClient:Fzt,ListFoundationModelsCommand:$zt,BedrockRuntimeClient:zzt,ConverseCommand:jzt,ConverseStreamCommand:Bzt,ImageFormat:Gzt}=ms,{SageMakerRuntimeClient:Vzt,InvokeEndpointCommand:qzt,InvokeEndpointWithResponseStreamCommand:Hzt}=ms,{GoogleAuth:Wzt,VertexAI:Kzt,TextToSpeechClient:Jzt}=ms,{Hippocampus:Zzt,HippocampusConfig:Xzt}=ms,{createClient:Yzt}=ms,{parseBuffer:Qzt,selectCover:ejt}=ms,{Hono:tjt}=ms,{cors:rjt,HTTPException:njt,logger:ojt,secureHeaders:ijt,streamSSE:sjt,timeout:ajt}=ms,cjt=globalThis.fetch,ljt=globalThis.Request,ujt=globalThis.Response,djt=globalThis.Headers,pjt=globalThis.FormData,mjt=globalThis.File,fjt=globalThis.Blob,gjt=ms.Agent,hjt=ms.Pool,yjt=ms.Client,vjt=ms.Dispatcher,xjt=()=>{},bjt=()=>ms,Tjt=ms.MockAgent,Sjt={redirect:()=>r=>r,retry:()=>r=>r},_jt=async(r,e)=>{let t=await globalThis.fetch(r,e);return{statusCode:t.status,headers:Object.fromEntries(t.headers.entries()),body:{text:()=>t.text(),json:()=>t.json(),arrayBuffer:()=>t.arrayBuffer()}}}});var aRe={};me(aRe,{Agent:()=>rBt,BedrockClient:()=>Ejt,BedrockRuntimeClient:()=>kjt,Blob:()=>tBt,Client:()=>oBt,ConverseCommand:()=>Rjt,ConverseStreamCommand:()=>Ijt,Dispatcher:()=>iBt,File:()=>eBt,FormData:()=>Qjt,GoogleAuth:()=>Njt,HTTPException:()=>Vjt,Headers:()=>Yjt,Hippocampus:()=>Ujt,HippocampusConfig:()=>Fjt,Hono:()=>Bjt,ImageFormat:()=>Ajt,InvokeEndpointCommand:()=>Mjt,InvokeEndpointWithResponseStreamCommand:()=>Ojt,ListFoundationModelsCommand:()=>Cjt,MockAgent:()=>cBt,Pool:()=>nBt,Request:()=>Zjt,Response:()=>Xjt,SageMakerRuntimeClient:()=>Pjt,TextToSpeechClient:()=>Ljt,VertexAI:()=>Djt,cors:()=>Gjt,createClient:()=>$jt,default:()=>wjt,fetch:()=>Jjt,getGlobalDispatcher:()=>aBt,interceptors:()=>lBt,logger:()=>qjt,parseBuffer:()=>zjt,request:()=>uBt,secureHeaders:()=>Hjt,selectCover:()=>jjt,setGlobalDispatcher:()=>sBt,streamSSE:()=>Wjt,timeout:()=>Kjt});var Ub,fs,wjt,Ejt,Cjt,kjt,Rjt,Ijt,Ajt,Pjt,Mjt,Ojt,Njt,Djt,Ljt,Ujt,Fjt,$jt,zjt,jjt,Bjt,Gjt,Vjt,qjt,Hjt,Wjt,Kjt,Jjt,Zjt,Xjt,Yjt,Qjt,eBt,tBt,rBt,nBt,oBt,iBt,sBt,aBt,cBt,lBt,uBt,cRe=R(()=>{Ub={get(r,e){return e==="__esModule"?!0:e==="default"?new Proxy({},{get:Ub.get}):new Proxy(function(...t){return new Proxy({},{get:Ub.get})},{get:Ub.get,apply(t,n,o){return new Proxy({},{get:Ub.get})},construct(t,n){return new Proxy({},{get:Ub.get})}})}},fs=new Proxy({},Ub),wjt=fs,{BedrockClient:Ejt,ListFoundationModelsCommand:Cjt,BedrockRuntimeClient:kjt,ConverseCommand:Rjt,ConverseStreamCommand:Ijt,ImageFormat:Ajt}=fs,{SageMakerRuntimeClient:Pjt,InvokeEndpointCommand:Mjt,InvokeEndpointWithResponseStreamCommand:Ojt}=fs,{GoogleAuth:Njt,VertexAI:Djt,TextToSpeechClient:Ljt}=fs,{Hippocampus:Ujt,HippocampusConfig:Fjt}=fs,{createClient:$jt}=fs,{parseBuffer:zjt,selectCover:jjt}=fs,{Hono:Bjt}=fs,{cors:Gjt,HTTPException:Vjt,logger:qjt,secureHeaders:Hjt,streamSSE:Wjt,timeout:Kjt}=fs,Jjt=globalThis.fetch,Zjt=globalThis.Request,Xjt=globalThis.Response,Yjt=globalThis.Headers,Qjt=globalThis.FormData,eBt=globalThis.File,tBt=globalThis.Blob,rBt=fs.Agent,nBt=fs.Pool,oBt=fs.Client,iBt=fs.Dispatcher,sBt=()=>{},aBt=()=>fs,cBt=fs.MockAgent,lBt={redirect:()=>r=>r,retry:()=>r=>r},uBt=async(r,e)=>{let t=await globalThis.fetch(r,e);return{statusCode:t.status,headers:Object.fromEntries(t.headers.entries()),body:{text:()=>t.text(),json:()=>t.json(),arrayBuffer:()=>t.arrayBuffer()}}}});var lRe={};me(lRe,{ExpressServerAdapter:()=>lC});var lC,Y9=R(()=>{"use strict";oe();ic();Ob();qu();lC=class extends jc{app;server;frameworkInitialized=!1;sockets=new Set;constructor(e,t={}){super(e,t)}initializeFramework(){}async initializeFrameworkAsync(){if(this.frameworkInitialized)return;let t=(await Promise.resolve().then(()=>(oRe(),nRe))).default;if(this.app=t(),this.config.bodyParser.enabled){let n=this.config.bodyParser.maxSize||this.config.bodyParser.jsonLimit||"10mb";this.app.use(t.json({limit:this.config.bodyParser.jsonLimit||n})),this.app.use(t.urlencoded({extended:!0,limit:n}))}if(this.config.cors.enabled){let o=(await Promise.resolve().then(()=>(sRe(),iRe))).default;this.app.use(o({origin:this.config.cors.origins,methods:this.config.cors.methods,allowedHeaders:this.config.cors.headers,credentials:this.config.cors.credentials,maxAge:this.config.cors.maxAge}))}if(this.config.rateLimit.enabled){let o=(await Promise.resolve().then(()=>(cRe(),aRe))).default,i=this.config.rateLimit.windowMs,s=o({windowMs:i,max:this.config.rateLimit.maxRequests,message:{error:{code:"RATE_LIMIT_EXCEEDED",message:this.config.rateLimit.message}},standardHeaders:!0,legacyHeaders:!1,handler:(a,l)=>{let u=Math.ceil(i/1e3);l.setHeader("Retry-After",String(u)),l.status(429).json({error:{code:"RATE_LIMIT_EXCEEDED",message:this.config.rateLimit.message},metadata:{timestamp:new Date().toISOString(),retryAfter:u}})}});this.app.use(s)}this.app.use((n,o,i)=>{let s=n.headers["x-request-id"]||this.generateRequestId();n.headers["x-request-id"]=s,o.setHeader("X-Request-ID",s),i()}),this.config.logging.enabled&&this.app.use((n,o,i)=>{let s=Date.now(),a=n.headers["x-request-id"];g.info(`[ExpressAdapter] ${n.method} ${n.path}`,{requestId:a}),o.on("finish",()=>{g.info(`[ExpressAdapter] ${n.method} ${n.path} ${o.statusCode}`,{requestId:a,duration:Date.now()-s})}),i()}),this.frameworkInitialized=!0}async initialize(){await this.initializeFrameworkAsync(),await super.initialize()}registerFrameworkRoute(e){let t=e.method.toLowerCase();this.app[t](e.path,async(n,o,i)=>{let s=n.headers["x-request-id"],a=Date.now(),l=this.createContext({requestId:s,method:n.method,path:n.path,headers:n.headers,query:n.query,params:n.params,body:n.body});o.locals.responseHeaders&&(l.responseHeaders={...o.locals.responseHeaders}),this.emit("request",{requestId:s,method:l.method,path:l.path,timestamp:new Date});try{if(e.streaming?.enabled)return this.handleStreamingResponse(o,l,e);let u=await e.handler(l),d=Date.now()-a;if(Zd(u)){let p=u.httpStatus??500;if(this.emit("response",{requestId:s,statusCode:p,duration:d,timestamp:new Date}),l.responseHeaders)for(let[m,f]of Object.entries(l.responseHeaders))o.setHeader(m,f);o.status(p).json({error:u.error,metadata:{...u.metadata,requestId:s,timestamp:new Date().toISOString(),duration:d}});return}if(this.emit("response",{requestId:s,statusCode:200,duration:d,timestamp:new Date}),l.responseHeaders)for(let[p,m]of Object.entries(l.responseHeaders))o.setHeader(p,m);o.json({data:u,metadata:{requestId:s,timestamp:new Date().toISOString(),duration:d}})}catch(u){i(u)}}),this.setupErrorHandler()}errorHandlerRegistered=!1;setupErrorHandler(){this.errorHandlerRegistered||(this.errorHandlerRegistered=!0,this.app.use((e,t,n,o)=>{let i=t.headers["x-request-id"];g.error("[ExpressAdapter] Request error",{requestId:i,error:e.message,stack:e.stack}),this.emit("error",{requestId:i,error:e,timestamp:new Date});let s=e instanceof Ar,a=s?e.getHttpStatus():500,l=s?e.code:"INTERNAL_ERROR",u=s?e.message:"An internal error occurred";n.status(a).json({error:{code:l,message:u},metadata:{requestId:i,timestamp:new Date().toISOString()}})}))}async handleStreamingResponse(e,t,n){e.setHeader("Content-Type","text/event-stream"),e.setHeader("Cache-Control","no-cache"),e.setHeader("Connection","keep-alive");try{let o=await n.handler(t);if(o&&typeof o=="object"&&Symbol.asyncIterator in o)for await(let i of o)e.write(`event: message
|
|
2028
2035
|
`),e.write(`data: ${JSON.stringify(i)}
|
|
2029
2036
|
|
|
2030
2037
|
`);else e.write(`event: complete
|