@juspay/neurolink 10.1.1 → 10.1.2

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 CHANGED
@@ -1,3 +1,10 @@
1
+ ## [10.1.2](https://github.com/juspay/neurolink/compare/v10.1.1...v10.1.2) (2026-07-20)
2
+
3
+ ### Bug Fixes
4
+
5
+ - **(cache):** keep image content-hash dedup index resilient across eviction ([#1213](https://github.com/juspay/neurolink/issues/1213)) ([a722798](https://github.com/juspay/neurolink/commit/a7227986c0640be6ff72a42ab275c8666a78fb28))
6
+ - **(pdf):** pin pdfjs-dist to one version so page counting survives image conversion ([#1212](https://github.com/juspay/neurolink/issues/1212)) ([4eb5dfb](https://github.com/juspay/neurolink/commit/4eb5dfb83c933c5e2338ee65be6aee5c7edc34e6))
7
+
1
8
  ## [10.1.1](https://github.com/juspay/neurolink/compare/v10.1.0...v10.1.1) (2026-07-20)
2
9
 
3
10
  ### Bug Fixes
@@ -816,7 +816,7 @@ ${t}
816
816
  ]`}function T(){let B=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,K=arguments.length>1&&arguments[1]!==void 0?arguments[1]:-1,Z=r[e]==="\\";if(Z&&(e++,Z=!0),cM(r[e])){let q=Ere(r[e])?Ere:_re(r[e])?_re:jj(r[e])?jj:wre,ce=e,ye=t.length,J='"';for(e++;;){if(e>=r.length){let be=I(e-1);return!B&&aM(r.charAt(be))?(e=ce,t=t.substring(0,ye),T(!0)):(J=_d(J,'"'),t+=J,!0)}if(e===K)return J=_d(J,'"'),t+=J,!0;if(q(r[e])){let be=e,fe=J.length;if(J+='"',e++,t+=J,i(!1),B||e>=r.length||aM(r[e])||cM(r[e])||Iy(r[e]))return S(),!0;let Ue=I(be-1),ge=r.charAt(Ue);if(ge===",")return e=ce,t=t.substring(0,ye),T(!1,Ue);if(aM(ge))return e=ce,t=t.substring(0,ye),T(!0);t=t.substring(0,ye),e=be+1,J=`${J.substring(0,fe)}\\${J.substring(fe)}`}else if(B&&Tre(r[e])){if(r[e-1]===":"&&bre.test(r.substring(ce+1,e+2)))for(;e<r.length&&vre.test(r[e]);)J+=r[e],e++;return J=_d(J,'"'),t+=J,S(),!0}else if(r[e]==="\\"){let be=r.charAt(e+1);if(O2t[be]!==void 0)J+=r.slice(e,e+2),e+=2;else if(be==="u"){let Ue=2;for(;Ue<6&&rDe(r[e+Ue]);)Ue++;Ue===6?(J+=r.slice(e,e+6),e+=6):e+Ue>=r.length?e=r.length:V()}else be===`
817
817
  `?(J+="\\n",e+=2):(J+=be,e+=2)}else{let be=r.charAt(e);be==='"'&&r[e-1]!=="\\"?(J+=`\\${be}`,e++):oDe(be)?(J+=M2t[be],e++):(nDe(be)||z(be),J+=be,e++)}Z&&f()}}return!1}function S(){let B=!1;for(i();r[e]==="+";){B=!0,e++,i(),t=s_(t,'"',!0);let K=t.length;T()?t=aDe(t,K,1):t=_d(t,'"')}return B}function E(){let B=e;if(r[e]==="-"){if(e++,M())return D(B),!0;if(!Iy(r[e]))return e=B,!1}for(;Iy(r[e]);)e++;if(r[e]==="."){if(e++,M())return D(B),!0;if(!Iy(r[e]))return e=B,!1;for(;Iy(r[e]);)e++}if(r[e]==="e"||r[e]==="E"){if(e++,(r[e]==="-"||r[e]==="+")&&e++,M())return D(B),!0;if(!Iy(r[e]))return e=B,!1;for(;Iy(r[e]);)e++}if(!M())return e=B,!1;if(e>B){let K=r.slice(B,e),Z=/^0\d/.test(K);return t+=Z?`"${K}"`:K,!0}return!1}function k(){return R("true","true")||R("false","false")||R("null","null")||R("True","true")||R("False","false")||R("None","null")}function R(B,K){return r.slice(e,e+B.length)===B?(t+=K,e+=B.length,!0):!1}function P(B){let K=e;if(yre(r[e])){for(;e<r.length&&xre(r[e]);)e++;let Z=e;for(;Ay(r,Z);)Z++;if(r[Z]==="(")return e=Z+1,s(),r[e]===")"&&(e++,r[e]===";"&&e++),!0}for(;e<r.length&&!Tre(r[e])&&!cM(r[e])&&(!B||r[e]!==":");)e++;if(r[e-1]===":"&&bre.test(r.substring(K,e+2)))for(;e<r.length&&vre.test(r[e]);)e++;if(e>K){for(;Ay(r,e-1)&&e>0;)e--;let Z=r.slice(K,e);return t+=Z==="undefined"?"null":JSON.stringify(Z),r[e]==='"'&&e++,!0}}function A(){if(r[e]==="/"){let B=e;for(e++;e<r.length&&(r[e]!=="/"||r[e-1]==="\\");)e++;return e++,t+=JSON.stringify(r.substring(B,e)),!0}}function I(B){let K=B;for(;K>0&&Ay(r,K);)K--;return K}function M(){return e>=r.length||aM(r[e])||Ay(r,e)}function D(B){t+=`${r.slice(B,e)}0`}function z(B){throw new og(`Invalid character ${JSON.stringify(B)}`,e)}function O(){throw new og(`Unexpected character ${JSON.stringify(r[e])}`,e)}function L(){throw new og("Unexpected end of json string",r.length)}function $(){throw new og("Object key expected",e)}function U(){throw new og("Colon expected",e)}function V(){let B=r.slice(e,e+6);throw new og(`Invalid unicode character "${B}"`,e)}}function N2t(r,e){return r[e]==="*"&&r[e+1]==="/"}var M2t,O2t,uDe=C(()=>{tDe();lDe();M2t={"\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r"," ":"\\t"},O2t={'"':'"',"\\":"\\","/":"/",b:"\b",f:"\f",n:`
818
818
  `,r:"\r",t:" "}});var dDe=C(()=>{uDe()});function kre(r,e=0){for(let t=e;t<r.length;t++){let n=r[t];if(n!=="{"&&n!=="[")continue;let o=n==="{"?"}":"]",s=0,i=!1,a=!1;for(let c=t;c<r.length;c++){let l=r[c];if(a){a=!1;continue}if(l==="\\"){a=!0;continue}if(l==='"'){i=!i;continue}if(!i){if(l===n)s++;else if(l===o&&(s--,s===0))return{span:r.substring(t,c+1),end:c+1}}}}return null}var pDe=C(()=>{"use strict"});function D2t(r){return typeof r.safeParse=="function"}function L2t(r){try{return{value:JSON.parse(r),repaired:!1}}catch{}try{let e=Cre(r),t=JSON.parse(e);return e!==r&&g.shouldLog("debug")&&g.debug("[coerceJsonToSchema] jsonrepair altered model output",{originalLength:r.length,repairedLength:e.length}),{value:t,repaired:e!==r}}catch{return}}function Rre(r,e=0){if(e>F2t)return{value:r,changed:!1};if(typeof r=="string"){let t=r.trim();if(t.startsWith("{")&&t.endsWith("}")||t.startsWith("[")&&t.endsWith("]"))try{let o=JSON.parse(t);if(o!==null&&typeof o=="object")return{value:o,changed:!0}}catch{}return{value:r,changed:!1}}if(Array.isArray(r)){let t=!1,n=r.map(o=>{let s=Rre(o,e+1);return s.changed&&(t=!0),s.value});return{value:t?n:r,changed:t}}if(r!==null&&typeof r=="object"){let t=!1,n={};for(let[o,s]of Object.entries(r)){let i=Rre(s,e+1);i.changed&&(t=!0),n[o]=i.value}return{value:t?n:r,changed:t}}return{value:r,changed:!1}}function Gj(r,e){if(typeof r!="string"||r.trim().length===0)return null;let t=[],n=0;for(;;){let h=kre(r,n);if(!h)break;t.push({text:h.span,truncated:!1}),n=h.end}let o=[r.indexOf("{"),r.indexOf("[")].filter(h=>h>=0),s=o.length>0?Math.min(...o):-1,i=Math.max(r.lastIndexOf("}"),r.lastIndexOf("]"));s>=0&&i>s&&t.push({text:r.slice(s,i+1),truncated:!1}),s>=0&&t.push({text:r.slice(s),truncated:!0});let a=r.trim();if(a.length>1&&a.startsWith('"')&&a.endsWith('"'))try{let h=JSON.parse(a);if(typeof h=="string"){let y=0;for(;;){let x=kre(h,y);if(!x)break;t.push({text:x.span,truncated:!1}),y=x.end}}}catch{}let c,l=[],u=!!(e&&D2t(e)),d=new Set;for(let h of t){if(d.has(h.text))continue;d.add(h.text);let y=L2t(h.text);if(y===void 0||y.value===null||typeof y.value!="object")continue;let x={value:y.value,repaired:y.repaired,truncated:h.truncated};if(c===void 0&&(c=x),!u)break;let b=e;if(b.safeParse(y.value).success)l.push(x);else{let T=Rre(y.value);T.changed&&T.value!==null&&typeof T.value=="object"&&b.safeParse(T.value).success?l.push({value:T.value,repaired:!0,truncated:h.truncated}):Array.isArray(y.value)&&y.value.length===1&&y.value[0]!==null&&typeof y.value[0]=="object"&&!Array.isArray(y.value[0])&&b.safeParse(y.value[0]).success&&l.push({value:y.value[0],repaired:!0,truncated:h.truncated})}}let f=(l.length>0?l.reduce((h,y)=>JSON.stringify(y.value).length>JSON.stringify(h.value).length?y:h):void 0)??c;return f===void 0?null:{content:JSON.stringify(f.value),structuredData:f.value,repaired:f.repaired,truncated:f.truncated}}var F2t,Are=C(()=>{"use strict";dDe();H();pDe();F2t=6});function mDe(r){let e=[],t=[];for(let n of r)n.role==="system"?e.push(n):t.push(n);return e.length===0||t.length===0?{system:void 0,messages:r}:{system:e,messages:t}}var fDe=C(()=>{"use strict"});function $2t(r){if(r===void 0)return"";try{return((typeof r=="string"?r:JSON.stringify(r))??"").substring(0,200)}catch{return"[unserializable]"}}var U2t,lM,gDe=C(()=>{"use strict";Dr();KNe();Vr();H();sM();Ed();XNe();$j();ki();zj();Are();Im();mP();sv();fDe();U2t=ke.generation;lM=class{constructor(e,t,n,o,s,i){this.providerName=e;this.modelName=t;this.supportsToolsFn=n;this.getTelemetryConfigFn=o;this.handleToolStorageFn=s;this.getEmitterFn=i}providerName;modelName;supportsToolsFn;getTelemetryConfigFn;handleToolStorageFn;getEmitterFn;async callGenerateText(e,t,n,o,s,i){let a=this.providerName==="google-ai"||this.providerName==="vertex",c=this.providerName==="anthropic"||this.providerName==="bedrock"||this.providerName==="vertex"&&this.modelName?.startsWith("claude-"),u=i&&(!!o.schema||o.output?.format==="json"||o.output?.format==="structured")&&!ZNe(this.providerName,this.modelName,s,Object.keys(n).length),d=n;if(c&&s&&Object.keys(d).length>0){let y=Object.keys(d),x=y[y.length-1];if(x&&d[x]){let b=d[x];d[x]={...b,providerOptions:{...b.providerOptions??{},anthropic:{cacheControl:{type:"ephemeral"}}}}}}let p=o.prepareStep,{system:f,messages:h}=mDe(t);return await Hf({model:e,...f&&{system:f},messages:h,...s&&Object.keys(d).length>0&&{tools:d},stopWhen:dP(o.maxSteps??Ws),...s&&o.toolChoice&&{toolChoice:o.toolChoice},...p&&{experimental_prepareStep:(y=>p({...y,maxSteps:o.maxSteps??Ws}))},temperature:o.temperature,maxOutputTokens:o.maxTokens,maxRetries:0,abortSignal:o.abortSignal,...u&&o.schema&&{experimental_output:uB.object({schema:o.schema})},...o.thinkingConfig?.enabled&&{...c&&o.thinkingConfig.budgetTokens&&!o.thinkingConfig.thinkingLevel&&{experimental_thinking:{type:"enabled",budgetTokens:o.thinkingConfig.budgetTokens}},...a&&{providerOptions:{google:{thinkingConfig:{...o.thinkingConfig.thinkingLevel&&{thinkingLevel:o.thinkingConfig.thinkingLevel},...o.thinkingConfig.budgetTokens&&!o.thinkingConfig.thinkingLevel&&{thinkingBudget:o.thinkingConfig.budgetTokens},includeThoughts:!0}}}}},experimental_telemetry:this.getTelemetryConfigFn(o,"generate"),onStepFinish:({toolCalls:y,toolResults:x})=>{g.info("Tool execution completed",{toolResults:x,toolCalls:y}),Ry(this.getEmitterFn?.(),x),this.handleToolStorageFn(y,x,o,new Date).catch(b=>{g.warn("[GenerationHandler] Failed to store tool executions",{provider:this.providerName,error:b instanceof Error?b.message:String(b)})})}})}async executeGeneration(e,t,n,o){return U2t.startActiveSpan("neurolink.executeGeneration",{kind:kr.INTERNAL},async s=>{let i=!o.disableTools&&this.supportsToolsFn(),a=Object.keys(n||{}).length,c=!!o.schema||o.output?.format==="json"||o.output?.format==="structured";s.setAttribute("gen_ai.system",this.providerName||"unknown"),s.setAttribute("neurolink.structured_output",c),s.setAttribute("neurolink.tool_count",a),s.setAttribute("neurolink.message_count",t.length),s.setAttribute("gen_ai.request.model",Dj(e,this.modelName||"unknown"));let l=o.requestId||o.context?.requestId||"unknown";if(g.info("[GenerationHandler] Calling generateText",{requestId:l,model:Dj(e),messageCount:t.length,toolCount:a,maxSteps:o.maxSteps,temperature:o.temperature}),g.shouldLog("debug"))try{g.debug("[Observability] Full generateText parameters",{requestId:l,model:Dj(e),messageCount:t.length,messages:t.map((d,p)=>({index:p,role:d.role,contentLength:typeof d.content=="string"?d.content.length:$2t(d.content).length,contentPreview:typeof d.content=="string"?d.content.substring(0,200):"[multimodal]"})),toolNames:Object.keys(n||{}),toolCount:a,maxSteps:o.maxSteps,temperature:o.temperature,maxTokens:o.maxTokens})}catch{}let u=Date.now();try{let d=await Uj(()=>this.callGenerateText(e,t,n,o,i,!0),s,"generateText");if(g.info("[GenerationHandler] generateText returned",{requestId:l,durationMs:Date.now()-u,finishReason:d.finishReason,steps:d.steps?.length||1,toolCallsTotal:d.toolCalls?.length||0,responseChars:d.text?.length||0}),g.shouldLog("debug")&&g.debug("[Observability] LLM response metadata",{requestId:l,responseLength:d.text?.length||0,hasToolCalls:!!(d.toolCalls&&d.toolCalls.length>0),toolCallCount:d.toolCalls?.length||0,toolNames:d.toolCalls?.map(p=>p.toolName),finishReason:d.finishReason,stepCount:d.steps?.length||0,steps:d.steps?.map((p,f)=>({stepIndex:f,stepType:p.stepType,textLength:p.text?.length||0,toolCallCount:p.toolCalls?.length||0,toolNames:p.toolCalls?.map(h=>h.toolName),toolResultCount:p.toolResults?.length||0,finishReason:p.finishReason})),usage:d.usage}),d.usage){s.setAttribute("gen_ai.usage.input_tokens",d.usage.inputTokens||0),s.setAttribute("gen_ai.usage.output_tokens",d.usage.outputTokens||0);let p=To(this.providerName,this.modelName,{input:d.usage.inputTokens||0,output:d.usage.outputTokens||0,total:(d.usage.inputTokens||0)+(d.usage.outputTokens||0)});s.setAttribute("neurolink.cost",p??0)}return d.finishReason&&s.setAttribute("gen_ai.response.finish_reason",d.finishReason),s.setStatus({code:Me.OK}),d}catch(d){let p=c&&Bj(d);if(c&&(d instanceof va||QNe(d)||p)){s.setAttribute("neurolink.has_fallback",!0),s.addEvent("retry.initial_failure",{"error.message":d instanceof Error?d.message:String(d),"retry.attempt":1,"retry.reason":d instanceof va?"NoObjectGeneratedError_structured_output_fallback":p?"schema_complexity_structured_output_fallback":"tools_schema_conflict_structured_output_fallback"}),p?g.warn("[GenerationHandler] schema too complex for provider constrained decoding \u2014 retrying with prompt-based JSON",{provider:this.providerName,model:this.modelName,error:d instanceof Error?d.message:String(d)}):g.debug("[GenerationHandler] structured-output conflict caught - falling back to manual JSON extraction",{provider:this.providerName,model:this.modelName,error:d instanceof Error?d.message:String(d)});let h=await Uj(()=>this.callGenerateText(e,t,n,o,i,!1),s,"generateText(fallback)");if(s.addEvent("retry.recovered",{"retry.attempts":2,"retry.strategy":"structured_output_disabled"}),s.setAttribute("retry.count",1),g.info("[GenerationHandler] generateText returned (fallback)",{requestId:l,durationMs:Date.now()-u,finishReason:h.finishReason,steps:h.steps?.length||1,toolCallsTotal:h.toolCalls?.length||0,responseChars:h.text?.length||0}),h.usage){s.setAttribute("gen_ai.usage.input_tokens",h.usage.inputTokens||0),s.setAttribute("gen_ai.usage.output_tokens",h.usage.outputTokens||0);let y=To(this.providerName,this.modelName,{input:h.usage.inputTokens||0,output:h.usage.outputTokens||0,total:(h.usage.inputTokens||0)+(h.usage.outputTokens||0)});s.setAttribute("neurolink.cost",y??0)}return h.finishReason&&s.setAttribute("gen_ai.response.finish_reason",h.finishReason),s.setStatus({code:Me.OK}),h}if(eDe(d)&&typeof o.temperature=="number"){s.setAttribute("neurolink.has_fallback",!0),s.addEvent("retry.initial_failure",{"error.message":d instanceof Error?d.message:String(d),"retry.attempt":1,"retry.reason":"temperature_deprecated"}),g.debug("[GenerationHandler] temperature-deprecated error caught - retrying without temperature",{provider:this.providerName,model:this.modelName,error:d instanceof Error?d.message:String(d)});let h=await Uj(()=>this.callGenerateText(e,t,n,{...o,temperature:void 0},i,!0),s,"generateText(no-temperature)");if(s.addEvent("retry.recovered",{"retry.attempts":2,"retry.strategy":"temperature_omitted"}),s.setAttribute("retry.count",1),h.usage){s.setAttribute("gen_ai.usage.input_tokens",h.usage.inputTokens||0),s.setAttribute("gen_ai.usage.output_tokens",h.usage.outputTokens||0);let y=To(this.providerName,this.modelName,{input:h.usage.inputTokens||0,output:h.usage.outputTokens||0,total:(h.usage.inputTokens||0)+(h.usage.outputTokens||0)});s.setAttribute("neurolink.cost",y??0)}return h.finishReason&&s.setAttribute("gen_ai.response.finish_reason",h.finishReason),s.setStatus({code:Me.OK}),h}throw s.setStatus({code:Me.ERROR,message:d instanceof Error?d.message:String(d)}),d}finally{s.end()}})}extractCacheMetricsFromProviderMetadata(e){let t=e.providerMetadata;if(!t)return{};let n=t.anthropic;if(n){let o=pre(n),s=mre(n);return{...o!==void 0&&{cacheCreationTokens:o},...s!==void 0&&{cacheReadTokens:s}}}return{}}logGenerationComplete(e){let t=this.extractCacheMetricsFromProviderMetadata(e);g.shouldLog("debug")&&g.debug("generateText completed",{provider:this.providerName,model:this.modelName,responseLength:e.text?.length||0,toolResultsCount:e.toolResults?.length||0,finishReason:e.finishReason,usage:e.usage,...t.cacheCreationTokens!==void 0&&{cacheCreationTokens:t.cacheCreationTokens},...t.cacheReadTokens!==void 0&&{cacheReadTokens:t.cacheReadTokens},timestamp:Date.now()})}extractToolInformation(e){let t=[],n=[];if(e.toolCalls&&e.toolCalls.length>0&&t.push(...e.toolCalls.map(o=>o.toolName||o.name||"unknown")),e.steps&&Array.isArray(e.steps)){let o=new Map;for(let s of e.steps||[]){if(s?.toolCalls&&Array.isArray(s.toolCalls))for(let i of s.toolCalls){let a=i,c=a.toolName||a.name||"unknown",l=a.toolCallId||a.id||c;t.push(c);let u={};a.args?u=a.args:a.arguments?u=a.arguments:a.parameters&&(u=a.parameters),o.set(l,u),o.set(c,u)}if(s?.toolResults&&Array.isArray(s.toolResults))for(let i of s.toolResults){let a=i,c=a.toolName||"unknown",l=a.toolCallId||a.id,u=a.args??a.arguments??a.parameters??a.input??o.get(l||c)??{};n.push({name:c,input:u,output:a.output??a.result??"success"})}}}return{toolsUsed:[...new Set(t)],toolExecutions:n}}formatEnhancedResult(e,t,n,o,s){let i=!!s.schema||s.output?.format==="json"||s.output?.format==="structured",a,c,l=!1,u=!1,d=x=>{let b=x.replace(/^```(?:json)?\s*\n?/i,"").replace(/\n?```\s*$/i,"").trim(),T=Gj(b,s.schema);if(T)return c=T.structuredData,T.repaired&&(l=!0),T.truncated&&(u=!0),T.content;try{let S=JSON.parse(b);if(S==="")return g.warn("[GenerationHandler] schema requested but the model returned an empty JSON string; normalizing to empty content",{provider:this.providerName,model:this.modelName}),"";if(S!=null)return c=S,b}catch{}return g.warn("[GenerationHandler] schema requested but no JSON could be recovered from model text; returning raw text",{provider:this.providerName,model:this.modelName}),b};if(i)try{let x=e.experimental_output,b=typeof x=="string"&&x===(e.text??"");x!==void 0&&!b?(c=x,a=JSON.stringify(x)):a=d(e.text||"")}catch(x){g.debug("[GenerationHandler] experimental_output threw, falling back to text parsing",{error:x instanceof Error?x.message:String(x)}),a=d(e.text||"")}else a=e.text;i&&e.finishReason==="length"&&(u=!0,g.warn("[GenerationHandler] Structured output truncated by token cap (finishReason=length); increase maxTokens",{provider:this.providerName,model:this.modelName}));let p=o_(e.usage);if(p.cacheCreationTokens===void 0||p.cacheReadTokens===void 0){let x=this.extractCacheMetricsFromProviderMetadata(e);if(p.cacheCreationTokens===void 0&&x.cacheCreationTokens!==void 0&&(p.cacheCreationTokens=x.cacheCreationTokens),p.cacheReadTokens===void 0&&x.cacheReadTokens!==void 0&&(p.cacheReadTokens=x.cacheReadTokens),p.cacheReadTokens!==void 0){let b=fre(p.cacheReadTokens,p.input);b!==void 0&&(p.cacheSavingsPercent=b)}}let f=e.reasoning,h=f?typeof f=="string"?f:Array.isArray(f)?f.map(x=>typeof x=="string"?x:x.text??JSON.stringify(x)).join(`
819
- `):String(f):void 0,y=p.reasoning??void 0;return{content:a,structuredData:c,usage:p,finishReason:e.finishReason,jsonRepaired:l||void 0,jsonTruncated:u||void 0,provider:this.providerName,model:this.modelName,reasoning:h,reasoningTokens:y,toolCalls:e.toolCalls?e.toolCalls.map(x=>({toolCallId:x.toolCallId||"unknown",toolName:x.toolName||"unknown",args:x.args||{}})):[],toolResults:e.toolResults??[],toolsUsed:n,toolExecutions:o,availableTools:Object.keys(t).map(x=>{let b=t[x];return{name:x,description:b.description||"No description available",parameters:b.inputSchema||{},server:b.serverId||"direct"}})}}analyzeAIResponse(e){g.debug("NeuroLink Raw AI Response Analysis",{provider:this.providerName,model:this.modelName,responseTextLength:e.text?.length||0,responsePreview:e.text?.substring(0,500)??"",finishReason:e.finishReason,usage:e.usage});let t={hasToolCalls:!!e.toolCalls,toolCallsLength:e.toolCalls?.length||0,toolCalls:e.toolCalls?.map((n,o)=>{let s=n,i=s.toolName||s.name||"unknown";return{index:o+1,toolName:i,toolId:s.toolCallId||s.id||"none",hasArgs:!!s.args,argsKeys:s.args&&typeof s.args=="object"?Object.keys(s.args):[]}})||[]};g.debug("Tool Calls Analysis",t)}}});var sg={};te(sg,{AsyncLocalStorage:()=>iBt,Buffer:()=>qzt,Channel:()=>Nzt,DatabaseSync:()=>Vzt,Duplex:()=>cBt,EventEmitter:()=>sBt,Http2ServerRequest:()=>Yzt,Http2ServerResponse:()=>Xzt,Interface:()=>Gzt,MIMEType:()=>njt,PassThrough:()=>lBt,PerformanceObserver:()=>Pzt,Readable:()=>yDe,ReadableStream:()=>uBt,Resolver:()=>Azt,TextDecoder:()=>vDe,TextEncoder:()=>Vj,Transform:()=>aBt,URL:()=>hzt,URLSearchParams:()=>yzt,Worker:()=>Uzt,Writable:()=>xDe,access:()=>OBt,appendFile:()=>uM,appendFileSync:()=>H2t,arch:()=>JBt,arrayBuffer:()=>Zzt,basename:()=>Z2t,builtinModules:()=>pzt,callbackify:()=>Ezt,channel:()=>Ozt,chmodSync:()=>hBt,clearInterval:()=>rjt,clearTimeout:()=>ejt,closeSync:()=>vBt,connect:()=>QBt,constants:()=>Hzt,copyFileSync:()=>xBt,cpSync:()=>W2t,cpus:()=>qBt,createConnection:()=>ezt,createGunzip:()=>azt,createGzip:()=>czt,createHash:()=>hDe,createHmac:()=>j2t,createInterface:()=>jzt,createReadStream:()=>IBt,createRequire:()=>dzt,createServer:()=>K2t,createWriteStream:()=>ABt,debug:()=>Szt,debuglog:()=>bDe,default:()=>B2t,deflateSync:()=>rzt,deprecate:()=>wzt,deserialize:()=>Fzt,dirname:()=>X2t,exec:()=>FBt,execFile:()=>$Bt,execFileSync:()=>BBt,execSync:()=>UBt,existsSync:()=>mBt,extname:()=>Q2t,fileURLToPath:()=>xzt,finished:()=>pBt,format:()=>gzt,freemem:()=>HBt,fstatSync:()=>TBt,get:()=>ZBt,gunzip:()=>izt,gunzipSync:()=>nzt,gzip:()=>szt,gzipSync:()=>ozt,hasSubscribers:()=>Dzt,homedir:()=>jBt,hostname:()=>VBt,inflateSync:()=>tzt,inherits:()=>vzt,inspect:()=>Hj,isAbsolute:()=>tBt,isBuiltin:()=>mzt,isDeepStrictEqual:()=>_zt,isIP:()=>Jzt,isIPv4:()=>Kzt,isIPv6:()=>Wzt,isMainThread:()=>$zt,join:()=>J2t,lookup:()=>Rzt,mkdir:()=>Pre,mkdirSync:()=>SBt,monitorEventLoopDelay:()=>Mzt,normalize:()=>oBt,ok:()=>lzt,open:()=>Mre,openSync:()=>bBt,parentPort:()=>Bzt,parse:()=>fzt,pathToFileURL:()=>bzt,performance:()=>Izt,pipeline:()=>dBt,platform:()=>zBt,posix:()=>nBt,promises:()=>z2t,promisify:()=>Tzt,randomBytes:()=>G2t,randomUUID:()=>V2t,readFile:()=>Py,readFileSync:()=>fBt,readdir:()=>PBt,readdirSync:()=>EBt,realpath:()=>qj,realpathSync:()=>yBt,relative:()=>eBt,release:()=>YBt,rename:()=>NBt,renameSync:()=>CBt,request:()=>XBt,resolve:()=>Y2t,rm:()=>DBt,rmSync:()=>RBt,rmdirSync:()=>kBt,sep:()=>rBt,serialize:()=>Lzt,setInterval:()=>tjt,setTimeout:()=>Qzt,spawn:()=>LBt,stat:()=>dM,statSync:()=>wBt,strict:()=>uzt,tmpdir:()=>GBt,toUSVString:()=>Czt,totalmem:()=>WBt,type:()=>KBt,types:()=>kzt,unlink:()=>MBt,unlinkSync:()=>_Bt,webcrypto:()=>q2t,workerData:()=>zzt,writeFile:()=>Ire,writeFileSync:()=>gBt});var _s,$o,B2t,z2t,hDe,j2t,G2t,V2t,q2t,H2t,W2t,K2t,J2t,Y2t,X2t,Z2t,Q2t,eBt,tBt,rBt,nBt,oBt,sBt,iBt,yDe,xDe,aBt,cBt,lBt,uBt,dBt,pBt,mBt,fBt,gBt,hBt,uM,yBt,xBt,bBt,vBt,TBt,SBt,wBt,EBt,_Bt,CBt,kBt,RBt,ABt,IBt,Py,Ire,Pre,dM,PBt,MBt,OBt,NBt,DBt,Mre,qj,LBt,FBt,UBt,$Bt,BBt,zBt,jBt,GBt,VBt,qBt,HBt,WBt,KBt,JBt,YBt,XBt,ZBt,QBt,ezt,tzt,rzt,nzt,ozt,szt,izt,azt,czt,lzt,uzt,dzt,pzt,mzt,fzt,gzt,hzt,yzt,xzt,bzt,vzt,Tzt,bDe,Szt,Hj,wzt,Ezt,_zt,Czt,kzt,vDe,Vj,Rzt,Azt,Izt,Pzt,Mzt,Ozt,Nzt,Dzt,Lzt,Fzt,Uzt,$zt,Bzt,zzt,jzt,Gzt,Vzt,qzt,Hzt,Wzt,Kzt,Jzt,Yzt,Xzt,Zzt,TDe,Qzt,ejt,tjt,rjt,njt,Iu=C(()=>{_s=()=>{},$o=async()=>{},B2t={},z2t={readFile:$o,writeFile:$o,mkdir:$o,stat:$o,readdir:$o,unlink:$o,access:$o,rm:$o,rename:$o},hDe=r=>{let e=[];return{update(t){return e.push(typeof t=="string"?new Vj().encode(t):t),this},digest(t){let n=0;for(let s of e)for(let i=0;i<s.length;i++)n=(n<<5)-n+s[i]|0;let o=(n>>>0).toString(16).padStart(8,"0");return t==="hex"?o:t==="base64"?btoa(o):o}}},j2t=(r,e)=>hDe(r),G2t=r=>new Uint8Array(r||32),V2t=()=>globalThis.crypto?.randomUUID?.()||Math.random().toString(36),q2t=globalThis.crypto,H2t=()=>{throw new Error("[NeuroLink:browser] fs.appendFileSync is not supported in browser runtime \u2014 use server-side execution")},W2t=()=>{throw new Error("[NeuroLink:browser] fs.cpSync is not supported in browser runtime \u2014 use server-side execution")},K2t=()=>({listen:_s,close:_s,on:_s}),J2t=(...r)=>r.join("/"),Y2t=(...r)=>r.join("/"),X2t=r=>r||"",Z2t=r=>r?.split?.("/")?.pop?.()||"",Q2t=r=>{let e=r?.match?.(/\.[^.]+$/);return e?e[0]:""},eBt=(r,e)=>e||"",tBt=()=>!1,rBt="/",nBt={normalize:r=>r,join:(...r)=>r.join("/"),resolve:(...r)=>r.join("/"),sep:"/"},oBt=r=>r,sBt=class{on(){return this}off(){return this}emit(){return this}once(){return this}removeListener(){return this}addListener(){return this}},iBt=class{getStore(){}run(r,e,...t){return e(...t)}enterWith(){}disable(){}},yDe=class{pipe(){return this}on(){return this}read(){return null}push(){}destroy(){}},xDe=class{write(){return!0}end(){}on(){return this}destroy(){}},aBt=class{push(){}on(){return this}},cBt=class{on(){return this}},lBt=class{pipe(){return this}on(){return this}},uBt=globalThis.ReadableStream||class{},dBt=_s,pBt=_s,mBt=()=>!1,fBt=()=>"",gBt=_s,hBt=_s,uM=$o,yBt=r=>r,xBt=_s,bBt=()=>0,vBt=_s,TBt=()=>({}),SBt=_s,wBt=()=>({}),EBt=()=>[],_Bt=_s,CBt=_s,kBt=_s,RBt=_s,ABt=()=>new xDe,IBt=()=>new yDe,Py=$o,Ire=$o,Pre=$o,dM=$o,PBt=$o,MBt=$o,OBt=$o,NBt=$o,DBt=$o,Mre=async()=>({stat:$o,readFile:$o,close:$o,read:$o,write:$o}),qj=async r=>r,LBt=()=>({on:_s,stdout:{on:_s},stderr:{on:_s},kill:_s}),FBt=(r,e)=>e?.(null,"",""),UBt=()=>"",$Bt=(r,e,t)=>{typeof e=="function"?e(null,"",""):t?.(null,"","")},BBt=()=>"",zBt="browser",jBt=()=>"/",GBt=()=>"/tmp",VBt=()=>"browser",qBt=()=>[{}],HBt=()=>0,WBt=()=>0,KBt=()=>"Browser",JBt=()=>"wasm",YBt=()=>"0",XBt=()=>({}),ZBt=()=>({}),QBt=()=>({}),ezt=()=>({}),tzt=()=>new Uint8Array,rzt=()=>new Uint8Array,nzt=()=>new Uint8Array,ozt=()=>new Uint8Array,szt=(r,e)=>e?.(null,r),izt=(r,e)=>e?.(null,r),azt=()=>({}),czt=()=>({}),lzt=_s,uzt={},dzt=()=>()=>({}),pzt=[],mzt=()=>!1,fzt=r=>({pathname:r||"",hostname:"",protocol:"",search:"",hash:""}),gzt=()=>"",hzt=globalThis.URL,yzt=globalThis.URLSearchParams,xzt=r=>typeof r=="string"?r.replace("file://",""):r,bzt=r=>new globalThis.URL("file://"+r),vzt=(r,e)=>{e&&(r.super_=e,Object.setPrototypeOf(r.prototype,e.prototype))},Tzt=r=>(...e)=>new Promise((t,n)=>r(...e,(o,s)=>o?n(o):t(s))),bDe=r=>{let e=(...t)=>{};return e.enabled=!1,e},Szt=bDe,Hj=r=>{try{return JSON.stringify(r,null,2)}catch{return String(r)}};Hj.custom=Symbol.for("nodejs.util.inspect.custom");Hj.colors={};Hj.styles={};wzt=r=>r,Ezt=r=>(...e)=>{let t=e.pop();r(...e).then(n=>t(null,n)).catch(t)},_zt=(r,e)=>JSON.stringify(r)===JSON.stringify(e),Czt=r=>String(r),kzt={isPromise:r=>r instanceof Promise,isDate:r=>r instanceof Date,isRegExp:r=>r instanceof RegExp,isNativeError:r=>r instanceof Error,isArrayBuffer:r=>r instanceof ArrayBuffer,isTypedArray:r=>ArrayBuffer.isView(r),isUint8Array:r=>r instanceof Uint8Array,isProxy:()=>!1},vDe=globalThis.TextDecoder,Vj=globalThis.TextEncoder,Rzt=(r,e)=>e?.(null,"127.0.0.1",4),Azt=class{},Izt=globalThis.performance||{now:()=>Date.now()},Pzt=class{observe(){}disconnect(){}},Mzt=()=>({enable:_s,disable:_s,percentile:()=>0}),Ozt=()=>({}),Nzt=class{},Dzt=()=>!1,Lzt=()=>new Uint8Array,Fzt=_s,Uzt=class{},$zt=!0,Bzt=null,zzt=null,jzt=()=>({}),Gzt=class{},Vzt=class{},qzt=globalThis.Buffer||class extends Uint8Array{static from(e,t){if(typeof e=="string"){let n=(t||"utf8").toLowerCase();if(n==="base64"){let o=atob(e),s=new Uint8Array(o.length);for(let i=0;i<o.length;i++)s[i]=o.charCodeAt(i);return s}if(n==="hex"){let o=new Uint8Array(e.length/2);for(let s=0;s<e.length;s+=2)o[s/2]=parseInt(e.substr(s,2),16);return o}return new Vj().encode(e)}return new Uint8Array(e)}static alloc(e){return new Uint8Array(e)}static isBuffer(e){return e instanceof Uint8Array}static concat(e){let t=e.reduce((s,i)=>s+i.length,0),n=new Uint8Array(t),o=0;for(let s of e)n.set(s,o),o+=s.length;return n}static byteLength(e,t){return t==="base64"?Math.ceil(e.length*3/4):new Vj().encode(e).length}toString(e){let t=(e||"utf8").toLowerCase();if(t==="hex")return Array.from(new Uint8Array(this.buffer,this.byteOffset,this.byteLength)).map(n=>n.toString(16).padStart(2,"0")).join("");if(t==="base64"){let n="";for(let o=0;o<this.length;o++)n+=String.fromCharCode(this[o]);return btoa(n)}return new vDe().decode(this)}},Hzt={F_OK:0,R_OK:4,W_OK:2,X_OK:1},Wzt=()=>!1,Kzt=()=>!1,Jzt=()=>0,Yzt=class{},Xzt=class{},Zzt=async()=>new ArrayBuffer(0),TDe=r=>({[Symbol.toPrimitive](){return r},ref(){return this},unref(){return this},hasRef(){return!1},refresh(){return this},close(){}}),Qzt=(...r)=>TDe(globalThis.setTimeout(...r)),ejt=globalThis.clearTimeout,tjt=(...r)=>TDe(globalThis.setInterval(...r)),rjt=globalThis.clearInterval,njt=class{constructor(r){this.type=r}toString(){return this.type}}});var Dre={};te(Dre,{Agent:()=>Nre,BedrockClient:()=>sjt,BedrockRuntimeClient:()=>ajt,Blob:()=>Gjt,Client:()=>qjt,ConverseCommand:()=>cjt,ConverseStreamCommand:()=>ljt,Cron:()=>Cjt,Dispatcher:()=>Hjt,File:()=>jjt,FlowProducer:()=>_jt,FormData:()=>zjt,GoogleAuth:()=>fjt,HTTPException:()=>Ojt,Headers:()=>Bjt,Hippocampus:()=>xjt,HippocampusConfig:()=>bjt,Hono:()=>Pjt,ImageFormat:()=>ujt,InvokeEndpointCommand:()=>pjt,InvokeEndpointWithResponseStreamCommand:()=>mjt,Job:()=>wjt,ListFoundationModelsCommand:()=>ijt,MockAgent:()=>Kjt,Pool:()=>Vjt,Queue:()=>Tjt,QueueScheduler:()=>Ejt,Request:()=>Ujt,Response:()=>$jt,SageMakerRuntimeClient:()=>djt,TextToSpeechClient:()=>hjt,VertexAI:()=>gjt,Webhook:()=>yjt,Worker:()=>Sjt,convertToHtml:()=>Ijt,cors:()=>Mjt,createClient:()=>vjt,default:()=>ojt,extractRawText:()=>Ajt,fetch:()=>Ore,getGlobalDispatcher:()=>Rv,interceptors:()=>Av,logger:()=>Njt,parseBuffer:()=>kjt,request:()=>Iv,secureHeaders:()=>Djt,selectCover:()=>Rjt,setGlobalDispatcher:()=>Wjt,streamSSE:()=>Ljt,timeout:()=>Fjt});var i_,Ri,ojt,sjt,ijt,ajt,cjt,ljt,ujt,djt,pjt,mjt,fjt,gjt,hjt,yjt,xjt,bjt,vjt,Tjt,Sjt,wjt,Ejt,_jt,Cjt,kjt,Rjt,Ajt,Ijt,Pjt,Mjt,Ojt,Njt,Djt,Ljt,Fjt,Ore,Ujt,$jt,Bjt,zjt,jjt,Gjt,Nre,Vjt,qjt,Hjt,Wjt,Rv,Kjt,Av,Iv,a_=C(()=>{i_={get(r,e){return e==="__esModule"?!0:e==="default"?new Proxy({},{get:i_.get}):new Proxy(function(...t){return new Proxy({},{get:i_.get})},{get:i_.get,apply(t,n,o){return new Proxy({},{get:i_.get})},construct(t,n){return new Proxy({},{get:i_.get})}})}},Ri=new Proxy({},i_),ojt=Ri,{BedrockClient:sjt,ListFoundationModelsCommand:ijt,BedrockRuntimeClient:ajt,ConverseCommand:cjt,ConverseStreamCommand:ljt,ImageFormat:ujt}=Ri,{SageMakerRuntimeClient:djt,InvokeEndpointCommand:pjt,InvokeEndpointWithResponseStreamCommand:mjt}=Ri,{GoogleAuth:fjt,VertexAI:gjt,TextToSpeechClient:hjt}=Ri,{Webhook:yjt}=Ri,{Hippocampus:xjt,HippocampusConfig:bjt}=Ri,{createClient:vjt}=Ri,{Queue:Tjt,Worker:Sjt,Job:wjt,QueueScheduler:Ejt,FlowProducer:_jt}=Ri,{Cron:Cjt}=Ri,{parseBuffer:kjt,selectCover:Rjt}=Ri,{extractRawText:Ajt,convertToHtml:Ijt}=Ri,{Hono:Pjt}=Ri,{cors:Mjt,HTTPException:Ojt,logger:Njt,secureHeaders:Djt,streamSSE:Ljt,timeout:Fjt}=Ri,Ore=globalThis.fetch,Ujt=globalThis.Request,$jt=globalThis.Response,Bjt=globalThis.Headers,zjt=globalThis.FormData,jjt=globalThis.File,Gjt=globalThis.Blob,Nre=Ri.Agent,Vjt=Ri.Pool,qjt=Ri.Client,Hjt=Ri.Dispatcher,Wjt=()=>{},Rv=()=>Ri,Kjt=Ri.MockAgent,Av={redirect:()=>r=>r,retry:()=>r=>r},Iv=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 pM={};te(pM,{AsyncLocalStorage:()=>pGt,Buffer:()=>oqt,Channel:()=>WVt,DatabaseSync:()=>nqt,Duplex:()=>fGt,EventEmitter:()=>dGt,Http2ServerRequest:()=>lqt,Http2ServerResponse:()=>uqt,Interface:()=>rqt,MIMEType:()=>hqt,PassThrough:()=>gGt,PerformanceObserver:()=>VVt,Readable:()=>SDe,ReadableStream:()=>hGt,Resolver:()=>jVt,TextDecoder:()=>_De,TextEncoder:()=>Wj,Transform:()=>mGt,URL:()=>AVt,URLSearchParams:()=>IVt,Worker:()=>XVt,Writable:()=>wDe,access:()=>VGt,appendFile:()=>wGt,appendFileSync:()=>Zjt,arch:()=>cVt,arrayBuffer:()=>dqt,basename:()=>oGt,builtinModules:()=>_Vt,callbackify:()=>FVt,channel:()=>HVt,chmodSync:()=>SGt,clearInterval:()=>gqt,clearTimeout:()=>mqt,closeSync:()=>kGt,connect:()=>pVt,constants:()=>sqt,copyFileSync:()=>_Gt,cpSync:()=>Qjt,cpus:()=>oVt,createConnection:()=>mVt,createGunzip:()=>vVt,createGzip:()=>TVt,createHash:()=>Xa,createHmac:()=>Lre,createInterface:()=>tqt,createReadStream:()=>FGt,createRequire:()=>EVt,createServer:()=>eGt,createWriteStream:()=>LGt,debug:()=>DVt,debuglog:()=>EDe,default:()=>Jjt,deflateSync:()=>gVt,deprecate:()=>LVt,deserialize:()=>YVt,dirname:()=>nGt,exec:()=>YGt,execFile:()=>ZGt,execFileSync:()=>QGt,execSync:()=>XGt,existsSync:()=>bGt,extname:()=>sGt,fileURLToPath:()=>PVt,finished:()=>xGt,format:()=>RVt,freemem:()=>sVt,fstatSync:()=>RGt,get:()=>dVt,gunzip:()=>bVt,gunzipSync:()=>hVt,gzip:()=>xVt,gzipSync:()=>yVt,hasSubscribers:()=>KVt,homedir:()=>tVt,hostname:()=>nVt,inflateSync:()=>fVt,inherits:()=>OVt,inspect:()=>Kj,isAbsolute:()=>aGt,isBuiltin:()=>CVt,isDeepStrictEqual:()=>UVt,isIP:()=>cqt,isIPv4:()=>aqt,isIPv6:()=>iqt,isMainThread:()=>ZVt,join:()=>tGt,lookup:()=>zVt,mkdir:()=>BGt,mkdirSync:()=>AGt,monitorEventLoopDelay:()=>qVt,normalize:()=>uGt,ok:()=>SVt,open:()=>WGt,openSync:()=>CGt,parentPort:()=>QVt,parse:()=>kVt,pathToFileURL:()=>MVt,performance:()=>GVt,pipeline:()=>yGt,platform:()=>eVt,posix:()=>lGt,promises:()=>Yjt,promisify:()=>NVt,randomBytes:()=>Pm,randomUUID:()=>We,readFile:()=>UGt,readFileSync:()=>vGt,readdir:()=>jGt,readdirSync:()=>PGt,realpath:()=>KGt,realpathSync:()=>EGt,relative:()=>iGt,release:()=>lVt,rename:()=>qGt,renameSync:()=>OGt,request:()=>uVt,resolve:()=>rGt,rm:()=>HGt,rmSync:()=>DGt,rmdirSync:()=>NGt,sep:()=>cGt,serialize:()=>JVt,setInterval:()=>fqt,setTimeout:()=>pqt,spawn:()=>JGt,stat:()=>zGt,statSync:()=>IGt,strict:()=>wVt,tmpdir:()=>rVt,toUSVString:()=>$Vt,totalmem:()=>iVt,type:()=>aVt,types:()=>BVt,unlink:()=>GGt,unlinkSync:()=>MGt,webcrypto:()=>Xjt,workerData:()=>eqt,writeFile:()=>$Gt,writeFileSync:()=>TGt});var Cs,Bo,Jjt,Yjt,Xa,Lre,Pm,We,Xjt,Zjt,Qjt,eGt,tGt,rGt,nGt,oGt,sGt,iGt,aGt,cGt,lGt,uGt,dGt,pGt,SDe,wDe,mGt,fGt,gGt,hGt,yGt,xGt,bGt,vGt,TGt,SGt,wGt,EGt,_Gt,CGt,kGt,RGt,AGt,IGt,PGt,MGt,OGt,NGt,DGt,LGt,FGt,UGt,$Gt,BGt,zGt,jGt,GGt,VGt,qGt,HGt,WGt,KGt,JGt,YGt,XGt,ZGt,QGt,eVt,tVt,rVt,nVt,oVt,sVt,iVt,aVt,cVt,lVt,uVt,dVt,pVt,mVt,fVt,gVt,hVt,yVt,xVt,bVt,vVt,TVt,SVt,wVt,EVt,_Vt,CVt,kVt,RVt,AVt,IVt,PVt,MVt,OVt,NVt,EDe,DVt,Kj,LVt,FVt,UVt,$Vt,BVt,_De,Wj,zVt,jVt,GVt,VVt,qVt,HVt,WVt,KVt,JVt,YVt,XVt,ZVt,QVt,eqt,tqt,rqt,nqt,oqt,sqt,iqt,aqt,cqt,lqt,uqt,dqt,CDe,pqt,mqt,fqt,gqt,hqt,yr=C(()=>{Cs=()=>{},Bo=async()=>{},Jjt={},Yjt={readFile:Bo,writeFile:Bo,mkdir:Bo,stat:Bo,readdir:Bo,unlink:Bo,access:Bo,rm:Bo,rename:Bo},Xa=r=>{let e=[];return{update(t){return e.push(typeof t=="string"?new Wj().encode(t):t),this},digest(t){let n=0;for(let s of e)for(let i=0;i<s.length;i++)n=(n<<5)-n+s[i]|0;let o=(n>>>0).toString(16).padStart(8,"0");return t==="hex"?o:t==="base64"?btoa(o):o}}},Lre=(r,e)=>Xa(r),Pm=r=>new Uint8Array(r||32),We=()=>globalThis.crypto?.randomUUID?.()||Math.random().toString(36),Xjt=globalThis.crypto,Zjt=()=>{throw new Error("[NeuroLink:browser] fs.appendFileSync is not supported in browser runtime \u2014 use server-side execution")},Qjt=()=>{throw new Error("[NeuroLink:browser] fs.cpSync is not supported in browser runtime \u2014 use server-side execution")},eGt=()=>({listen:Cs,close:Cs,on:Cs}),tGt=(...r)=>r.join("/"),rGt=(...r)=>r.join("/"),nGt=r=>r||"",oGt=r=>r?.split?.("/")?.pop?.()||"",sGt=r=>{let e=r?.match?.(/\.[^.]+$/);return e?e[0]:""},iGt=(r,e)=>e||"",aGt=()=>!1,cGt="/",lGt={normalize:r=>r,join:(...r)=>r.join("/"),resolve:(...r)=>r.join("/"),sep:"/"},uGt=r=>r,dGt=class{on(){return this}off(){return this}emit(){return this}once(){return this}removeListener(){return this}addListener(){return this}},pGt=class{getStore(){}run(r,e,...t){return e(...t)}enterWith(){}disable(){}},SDe=class{pipe(){return this}on(){return this}read(){return null}push(){}destroy(){}},wDe=class{write(){return!0}end(){}on(){return this}destroy(){}},mGt=class{push(){}on(){return this}},fGt=class{on(){return this}},gGt=class{pipe(){return this}on(){return this}},hGt=globalThis.ReadableStream||class{},yGt=Cs,xGt=Cs,bGt=()=>!1,vGt=()=>"",TGt=Cs,SGt=Cs,wGt=Bo,EGt=r=>r,_Gt=Cs,CGt=()=>0,kGt=Cs,RGt=()=>({}),AGt=Cs,IGt=()=>({}),PGt=()=>[],MGt=Cs,OGt=Cs,NGt=Cs,DGt=Cs,LGt=()=>new wDe,FGt=()=>new SDe,UGt=Bo,$Gt=Bo,BGt=Bo,zGt=Bo,jGt=Bo,GGt=Bo,VGt=Bo,qGt=Bo,HGt=Bo,WGt=async()=>({stat:Bo,readFile:Bo,close:Bo,read:Bo,write:Bo}),KGt=async r=>r,JGt=()=>({on:Cs,stdout:{on:Cs},stderr:{on:Cs},kill:Cs}),YGt=(r,e)=>e?.(null,"",""),XGt=()=>"",ZGt=(r,e,t)=>{typeof e=="function"?e(null,"",""):t?.(null,"","")},QGt=()=>"",eVt="browser",tVt=()=>"/",rVt=()=>"/tmp",nVt=()=>"browser",oVt=()=>[{}],sVt=()=>0,iVt=()=>0,aVt=()=>"Browser",cVt=()=>"wasm",lVt=()=>"0",uVt=()=>({}),dVt=()=>({}),pVt=()=>({}),mVt=()=>({}),fVt=()=>new Uint8Array,gVt=()=>new Uint8Array,hVt=()=>new Uint8Array,yVt=()=>new Uint8Array,xVt=(r,e)=>e?.(null,r),bVt=(r,e)=>e?.(null,r),vVt=()=>({}),TVt=()=>({}),SVt=Cs,wVt={},EVt=()=>()=>({}),_Vt=[],CVt=()=>!1,kVt=r=>({pathname:r||"",hostname:"",protocol:"",search:"",hash:""}),RVt=()=>"",AVt=globalThis.URL,IVt=globalThis.URLSearchParams,PVt=r=>typeof r=="string"?r.replace("file://",""):r,MVt=r=>new globalThis.URL("file://"+r),OVt=(r,e)=>{e&&(r.super_=e,Object.setPrototypeOf(r.prototype,e.prototype))},NVt=r=>(...e)=>new Promise((t,n)=>r(...e,(o,s)=>o?n(o):t(s))),EDe=r=>{let e=(...t)=>{};return e.enabled=!1,e},DVt=EDe,Kj=r=>{try{return JSON.stringify(r,null,2)}catch{return String(r)}};Kj.custom=Symbol.for("nodejs.util.inspect.custom");Kj.colors={};Kj.styles={};LVt=r=>r,FVt=r=>(...e)=>{let t=e.pop();r(...e).then(n=>t(null,n)).catch(t)},UVt=(r,e)=>JSON.stringify(r)===JSON.stringify(e),$Vt=r=>String(r),BVt={isPromise:r=>r instanceof Promise,isDate:r=>r instanceof Date,isRegExp:r=>r instanceof RegExp,isNativeError:r=>r instanceof Error,isArrayBuffer:r=>r instanceof ArrayBuffer,isTypedArray:r=>ArrayBuffer.isView(r),isUint8Array:r=>r instanceof Uint8Array,isProxy:()=>!1},_De=globalThis.TextDecoder,Wj=globalThis.TextEncoder,zVt=(r,e)=>e?.(null,"127.0.0.1",4),jVt=class{},GVt=globalThis.performance||{now:()=>Date.now()},VVt=class{observe(){}disconnect(){}},qVt=()=>({enable:Cs,disable:Cs,percentile:()=>0}),HVt=()=>({}),WVt=class{},KVt=()=>!1,JVt=()=>new Uint8Array,YVt=Cs,XVt=class{},ZVt=!0,QVt=null,eqt=null,tqt=()=>({}),rqt=class{},nqt=class{},oqt=globalThis.Buffer||class extends Uint8Array{static from(e,t){if(typeof e=="string"){let n=(t||"utf8").toLowerCase();if(n==="base64"){let o=atob(e),s=new Uint8Array(o.length);for(let i=0;i<o.length;i++)s[i]=o.charCodeAt(i);return s}if(n==="hex"){let o=new Uint8Array(e.length/2);for(let s=0;s<e.length;s+=2)o[s/2]=parseInt(e.substr(s,2),16);return o}return new Wj().encode(e)}return new Uint8Array(e)}static alloc(e){return new Uint8Array(e)}static isBuffer(e){return e instanceof Uint8Array}static concat(e){let t=e.reduce((s,i)=>s+i.length,0),n=new Uint8Array(t),o=0;for(let s of e)n.set(s,o),o+=s.length;return n}static byteLength(e,t){return t==="base64"?Math.ceil(e.length*3/4):new Wj().encode(e).length}toString(e){let t=(e||"utf8").toLowerCase();if(t==="hex")return Array.from(new Uint8Array(this.buffer,this.byteOffset,this.byteLength)).map(n=>n.toString(16).padStart(2,"0")).join("");if(t==="base64"){let n="";for(let o=0;o<this.length;o++)n+=String.fromCharCode(this[o]);return btoa(n)}return new _De().decode(this)}},sqt={F_OK:0,R_OK:4,W_OK:2,X_OK:1},iqt=()=>!1,aqt=()=>!1,cqt=()=>0,lqt=class{},uqt=class{},dqt=async()=>new ArrayBuffer(0),CDe=r=>({[Symbol.toPrimitive](){return r},ref(){return this},unref(){return this},hasRef(){return!1},refresh(){return this},close(){}}),pqt=(...r)=>CDe(globalThis.setTimeout(...r)),mqt=globalThis.clearTimeout,fqt=(...r)=>CDe(globalThis.setInterval(...r)),gqt=globalThis.clearInterval,hqt=class{constructor(r){this.type=r}toString(){return this.type}}});function ss(r,e=500){return r&&r.slice(0,e).replace(bqt,"***")}function Mm(r){if(typeof r=="string")return r;try{return JSON.stringify(r)??String(r)}catch{return"[content too large to serialize]"}}function c_(r,e=1e4){try{let t=JSON.stringify(r);return t===void 0?String(r):t.length>e?`${t.slice(0,e)}\u2026[truncated ${t.length-e} chars]`:t}catch(t){return`[unserializable: ${t instanceof Error?t.message:String(t)}]`}}function lr(r){return r.replace(/\/\/[^/\s"'<>]*@/g,"//***@").replace(/\/\/(?:(?!\/\/)[^\s"'<>])*@/g,"//***@")}function Za(r){let e=t=>t.length>200?`${t.slice(0,200)}\u2026`:t;try{let t=new URL(r);return e(`${t.protocol}//${t.host}${t.pathname}`)}catch{let t=r.split(/[?#]/)[0];return e(lr(t))}}function wqt(r){Sqt.forEach(e=>r.searchParams.delete(e))}function Eqt(r){let e=[],t=[];for(let[o,s]of r.searchParams.entries())Tqt.includes(o.toLowerCase())&&(e.push(`${o.toLowerCase()}=${s}`),t.push(o));return e.length===0?"":(t.forEach(o=>r.searchParams.delete(o)),e.sort(),`\0auth=${Xa("sha256").update(e.join("&")).digest("hex").slice(0,16)}`)}function Jj(r){try{let e=new URL(r);wqt(e);let t=Eqt(e);return e.toString()+t}catch{return r}}function Fre(r){return r.replace(/[a-zA-Z][a-zA-Z0-9+.-]*:\/\/[^\s"'<>)]+/g,e=>Za(e))}function Ure(r,e){let t=qs(e);return r.split(dd(e)).join(t).split(e).join(t)}function My(r,e){let t=s=>{let i=Fre(s);return e?.filePath?Ure(i,e.filePath):i};if(!(r instanceof Error))return new Error(t(String(r)));let n=new Error(t(r.message));n.name=r.name;let o=r.code;return o!==void 0&&(n.code=o),n}function l_(r,e=1e3){let t=new WeakSet,n=o=>{if(o==null)return o;if(typeof o=="string")return ss(o,e);if(typeof o!="object")return o;if(t.has(o))return"[Circular]";if(t.add(o),Array.isArray(o))return o.map(n);let s={};for(let[i,a]of Object.entries(o))vqt.some(c=>c.toLowerCase()===i.toLowerCase())?s[i]="***":s[i]=n(a);return s};return n(r)}var yqt,xqt,bqt,vqt,Tqt,Sqt,mn=C(()=>{"use strict";yr();dn();yqt=["sk","pk","r8","gsk","xai","tgp","fw","pplx","pa","jina","fish"],xqt=yqt.join("|"),bqt=new RegExp(`\\bBearer\\s+[A-Za-z0-9_\\-\\.]{8,}\\b|\\bToken\\s+[A-Za-z0-9_\\-\\.]{8,}\\b|\\bBasic\\s+[A-Za-z0-9+/=]{12,}\\b|\\b(?:${xqt})[_\\-][A-Za-z0-9_\\-\\.]{8,}\\b|\\b(?:api[_-]?key|access[_-]?token|secret[_-]?key|refresh[_-]?token)\\s*[:=]\\s*['"]?[^\\s,;'"&]+`,"gi"),vqt=["apikey","api_key","apiKey","access_token","accessToken","refresh_token","refreshToken","secret","secretkey","secret_key","secretKey","password","authorization","oauth","oauthToken","credentials","authContext","authToken","sessionToken","serviceAccountKey","secretAccessKey","userEmail"];Tqt=["token","signature","x-amz-signature","x-amz-credential","x-amz-security-token","awsaccesskeyid","expires","sig","se","sp","sr","sv","x-goog-signature","x-goog-credential","x-goog-algorithm","x-goog-date","x-goog-expires","x-goog-signedheaders"],Sqt=["utm_source","utm_medium","utm_campaign","utm_term","utm_content","fbclid","gclid","_ga"]});var _qt,$re,Yj,Bre=C(()=>{"use strict";H();kt();_qt={maxTokens:10,refillIntervalMs:1e3,tokensPerRefill:10,maxQueueSize:100,queueTimeoutMs:3e4},$re=class{tokens;config;queue=[];refillTimer=null;lastRefillTime;constructor(e={}){this.config={..._qt,...e},this.tokens=this.config.maxTokens,this.lastRefillTime=Date.now(),this.startRefillTimer()}startRefillTimer(){this.refillTimer||(this.refillTimer=setInterval(()=>{this.refillTokens(),this.processQueue()},this.config.refillIntervalMs),this.refillTimer.unref())}refillTokens(){let e=Date.now(),t=e-this.lastRefillTime,n=Math.floor(t/this.config.refillIntervalMs);if(n>0){let o=n*this.config.tokensPerRefill;this.tokens=Math.min(this.config.maxTokens,this.tokens+o),this.lastRefillTime=e}}processQueue(){let e=Date.now();for(;this.queue.length>0;){let t=this.queue[0];if(e-t.timestamp>this.config.queueTimeoutMs)this.queue.shift(),t.timeoutTimer&&clearTimeout(t.timeoutTimer),t.reject(de.rateLimiterQueueTimeout(this.config.queueTimeoutMs));else break}for(;this.tokens>0&&this.queue.length>0;){let t=this.queue.shift();t&&(t.timeoutTimer&&clearTimeout(t.timeoutTimer),this.tokens--,t.resolve())}}async acquire(){if(this.refillTokens(),this.tokens>0){this.tokens--;return}if(this.queue.length>=this.config.maxQueueSize)throw g.warn(`Rate limiter queue full (${this.config.maxQueueSize} requests pending)`),de.rateLimiterQueueFull(this.config.maxQueueSize);return new Promise((e,t)=>{let n=setTimeout(()=>{let o=this.queue.findIndex(s=>s.timeoutTimer===n);o!==-1&&(this.queue.splice(o,1),t(de.rateLimiterQueueTimeout(this.config.queueTimeoutMs)))},this.config.queueTimeoutMs);this.queue.push({resolve:e,reject:t,timestamp:Date.now(),timeoutTimer:n})})}getStats(){return{availableTokens:this.tokens,queueLength:this.queue.length,maxTokens:this.config.maxTokens,maxQueueSize:this.config.maxQueueSize}}reset(){for(this.tokens=this.config.maxTokens,this.lastRefillTime=Date.now();this.queue.length>0;){let e=this.queue.shift();e&&(e.timeoutTimer&&clearTimeout(e.timeoutTimer),e.reject(de.rateLimiterReset()))}}stop(){this.refillTimer&&(clearInterval(this.refillTimer),this.refillTimer=null),this.reset()}},Yj=new $re({maxTokens:10,refillIntervalMs:1e3,tokensPerRefill:10,maxQueueSize:100,queueTimeoutMs:3e4})});function Hre(r,e=Ta.DEFAULT_INITIAL_DELAY,t=Ta.DEFAULT_BACKOFF_MULTIPLIER,n=Ta.DEFAULT_MAX_DELAY,o=!0){let s=e*Math.pow(t,r-1),i=Math.min(s,n),a=o?Math.random()*Math.min(i*.1,1e3):0;return i+a}function Wre(r){return new Promise(e=>setTimeout(e,r))}async function kDe(r,e={}){let t={...Cqt,...e},n;for(let o=1;o<=t.maxAttempts;o++)try{return await r()}catch(s){if(n=s,o===t.maxAttempts||!t.retryCondition(s))break;t.onRetry(o,s);let i=Hre(o,t.initialDelay,t.backoffMultiplier,t.maxDelay,!0);await Wre(i)}throw n}var zre,jre,Cqt,Gre,Vre,qre,LPn,FPn,UPn,Kre=C(()=>{"use strict";H();ki();zre=class extends Error{constructor(t,n){super(t);this.cause=n;this.name="NetworkError"}cause},jre=class extends Error{constructor(t,n){super(t);this.cause=n;this.name="TemporaryError"}cause},Cqt={maxAttempts:Ta.DEFAULT_RETRY_ATTEMPTS,initialDelay:Ta.DEFAULT_INITIAL_DELAY,maxDelay:Ta.DEFAULT_MAX_DELAY,backoffMultiplier:Ta.DEFAULT_BACKOFF_MULTIPLIER,retryCondition:r=>{if(r instanceof zre||r instanceof jre||r&&typeof r=="object"&&(r.name==="TimeoutError"||r.code==="TIMEOUT")||r&&typeof r=="object"&&(r.code==="ECONNRESET"||r.code==="ENOTFOUND"||r.code==="ECONNREFUSED"||r.code==="ETIMEDOUT"))return!0;if(r&&typeof r=="object"&&r.status){let e=Number(r.status);return e>=500||e===429||e===408}return!1},onRetry:(r,e)=>{let t=e instanceof Error?e.message:String(e);g.warn(`\u26A0\uFE0F Retry attempt ${r}: ${t}`)}};Gre=class{constructor(e=5,t=6e4,n=6e5){this.threshold=e;this.timeout=t;this.monitorWindow=n}threshold;timeout;monitorWindow;failures=0;lastFailureTime=0;state="closed";async execute(e){if(this.state==="open")if(Date.now()-this.lastFailureTime>this.timeout)this.state="half-open";else throw new Error("Circuit breaker is open - operation rejected");try{let t=await e();return this.onSuccess(),t}catch(t){throw this.onFailure(),t}}onSuccess(){this.failures=0,this.state="closed"}onFailure(){this.failures++,this.lastFailureTime=Date.now(),this.failures>=this.threshold&&(this.state="open")}getState(){return this.state}reset(){this.failures=0,this.lastFailureTime=0,this.state="closed"}},Vre=class{constructor(e,t){this.maxRequests=e;this.windowMs=t}maxRequests;windowMs;requests=[];async acquire(){let e=Date.now();if(this.requests=this.requests.filter(t=>e-t<this.windowMs),this.requests.length>=this.maxRequests){let t=Math.min(...this.requests),n=this.windowMs-(e-t);if(n>0)return await Wre(n),this.acquire()}this.requests.push(e)}},qre=class{operations=new Set;shutdownPromise=null;track(e){return this.operations.add(e),e.finally(()=>{this.operations.delete(e)}),e}async shutdown(e=3e4){return this.shutdownPromise?this.shutdownPromise:(this.shutdownPromise=this.performShutdown(e),this.shutdownPromise)}async performShutdown(e){g.debug(`\u{1F504} Graceful shutdown: waiting for ${this.operations.size} operations...`);try{await Promise.race([Promise.all(this.operations),Wre(e).then(()=>{throw new Error(`Shutdown timeout: ${this.operations.size} operations still running`)})]),g.debug("\u2705 Graceful shutdown completed")}catch(t){g.warn(`\u26A0\uFE0F Shutdown warning: ${t instanceof Error?t.message:String(t)}`)}}},LPn=new qre,FPn=new Gre(3,3e4),UPn=new Vre(100,6e4)});var Jc,ig,Oy,Xj,RDe,Ai,Jre=C(()=>{"use strict";Jc={IMAGE_MAX_MB:10,PDF_MAX_MB:100,DOCUMENT_MAX_MB:100,WORD_MAX_MB:100,TEXT_MAX_MB:50,CSV_MAX_MB:50,EXCEL_MAX_MB:100,SOURCE_CODE_MAX_MB:20,JSON_MAX_MB:20,YAML_MAX_MB:20,XML_MAX_MB:20,VIDEO_MAX_MB:500,AUDIO_MAX_MB:500,ARCHIVE_MAX_MB:200,GENERAL_MAX_MB:200},ig={IMAGE_MAX:10*1024*1024,PDF_MAX:100*1024*1024,DOCUMENT_MAX:100*1024*1024,WORD_MAX:100*1024*1024,TEXT_MAX:50*1024*1024,CSV_MAX:50*1024*1024,EXCEL_MAX:100*1024*1024,SOURCE_CODE_MAX:20*1024*1024,JSON_MAX:20*1024*1024,YAML_MAX:20*1024*1024,XML_MAX:20*1024*1024,VIDEO_MAX:500*1024*1024,AUDIO_MAX:500*1024*1024,ARCHIVE_MAX:200*1024*1024,GENERAL_MAX:200*1024*1024},Oy={MAX_SOURCE_CODE_LINES:1e4,MAX_TEXT_LINES:1e4,MAX_TEXT_LENGTH:1e6,MAX_CSV_ROWS:1e4,MAX_EXCEL_ROWS:5e3,MAX_EXCEL_SHEETS:10,MAX_PDF_PAGES:100,MAX_OBJECT_DEPTH:50,MAX_ARRAY_LENGTH:1e4},Xj={MAX_DECOMPRESSED_SIZE:100*1024*1024,MAX_COMPRESSION_RATIO:100,MAX_ENTRIES:1e3,MAX_NESTING_DEPTH:5},RDe={MAX_ALIAS_COUNT:100,MAX_DOCUMENTS:10,MAX_ANCHORS:100},Ai={IMAGE_MAX_MB:Jc.IMAGE_MAX_MB,PDF_MAX_MB:Jc.PDF_MAX_MB,DOCUMENT_MAX_MB:Jc.DOCUMENT_MAX_MB,WORD_MAX_MB:Jc.WORD_MAX_MB,TEXT_MAX_MB:Jc.TEXT_MAX_MB,CSV_MAX_MB:Jc.CSV_MAX_MB,EXCEL_MAX_MB:Jc.EXCEL_MAX_MB,SOURCE_CODE_MAX_MB:Jc.SOURCE_CODE_MAX_MB,MAX_FILE_SIZE:ig.GENERAL_MAX,MAX_IMAGE_SIZE:ig.IMAGE_MAX,MAX_TEXT_SIZE:ig.TEXT_MAX,MAX_SOURCE_CODE_LINES:Oy.MAX_SOURCE_CODE_LINES,MAX_TEXT_LINES:Oy.MAX_TEXT_LINES,MAX_TEXT_LENGTH:Oy.MAX_TEXT_LENGTH,MAX_CSV_ROWS:Oy.MAX_CSV_ROWS,EXCEL_MAX_ROWS:Oy.MAX_EXCEL_ROWS,EXCEL_MAX_SHEETS:Oy.MAX_EXCEL_SHEETS,MAX_PDF_PAGES:Oy.MAX_PDF_PAGES,MAX_DECOMPRESSED_SIZE:Xj.MAX_DECOMPRESSED_SIZE,MAX_COMPRESSION_RATIO:Xj.MAX_COMPRESSION_RATIO,MAX_ZIP_ENTRIES:Xj.MAX_ENTRIES,YAML_MAX_ALIAS_COUNT:RDe.MAX_ALIAS_COUNT}});function Zj(r){return Yre||(Yre=new Xre(r)),Yre}var Xre,Yre,Zre=C(()=>{"use strict";yr();H();mn();Xre=class{cache=new Map;contentHashIndex=new Map;maxSize;ttlMs;maxImageSize;enabled;stats={hits:0,misses:0,evictions:0,expirations:0,totalRequests:0};constructor(e={}){let t=process.env.NEUROLINK_IMAGE_CACHE_ENABLED,n=process.env.NEUROLINK_IMAGE_CACHE_SIZE,o=process.env.NEUROLINK_IMAGE_CACHE_TTL_MS,s=process.env.NEUROLINK_IMAGE_MAX_SIZE;this.enabled=t!==void 0?t.toLowerCase()==="true":!1,this.maxSize=this.parseConfigValue(n,e.maxSize,100,1,1e3),this.ttlMs=this.parseConfigValue(o,e.ttlMs,1800*1e3,1e3,1440*60*1e3),this.maxImageSize=this.parseConfigValue(s,e.maxImageSize,10*1024*1024,1024,100*1024*1024),g.debug("ImageCache initialized",{enabled:this.enabled,maxSize:this.maxSize,ttlMs:this.ttlMs,maxImageSize:this.maxImageSize})}parseConfigValue(e,t,n,o,s){let i;if(e!==void 0){let a=parseInt(e,10);i=isNaN(a)?n:a}else t!==void 0?i=t:i=n;return i<o?(g.warn(`Cache config value ${i} below minimum ${o}, using min`),o):i>s?(g.warn(`Cache config value ${i} above maximum ${s}, using max`),s):i}normalizeUrl(e){return Jj(e)}generateContentHash(e){let t=typeof e=="string"?Buffer.from(e,"base64"):e;return Xa("sha256").update(t).digest("hex").substring(0,16)}isExpired(e){return Date.now()-e.createdAt>this.ttlMs}isEnabled(){return this.enabled}get(e){if(!this.enabled)return null;this.stats.totalRequests++;let t=this.normalizeUrl(e),n=this.cache.get(t);return n?this.isExpired(n)?(this.stats.expirations++,this.delete(t),g.debug("Image cache entry expired",{url:Za(t)}),null):(n.lastAccessedAt=Date.now(),n.accessCount++,this.cache.delete(t),this.cache.set(t,n),this.stats.hits++,g.debug("Image cache hit",{url:Za(t),accessCount:n.accessCount}),n):(this.stats.misses++,g.debug("Image cache miss",{url:Za(t)}),null)}getByContentHash(e){let t=this.contentHashIndex.get(e);return t?this.get(t):null}set(e,t,n,o){if(!this.enabled){g.debug("Image caching disabled, skipping cache storage");return}let s=this.normalizeUrl(e),i=o.length;if(i>this.maxImageSize){g.debug("Image too large to cache",{url:Za(s),size:i,maxSize:this.maxImageSize});return}let a=this.generateContentHash(o),c=this.contentHashIndex.get(a);if(c&&c!==s){let d=this.cache.get(c);if(d&&!this.isExpired(d)){this.cache.set(s,{...d}),this.contentHashIndex.set(a,s),g.debug("Image cache dedup hit",{newUrl:Za(s),existingUrl:Za(c)});return}}for(;this.cache.size>=this.maxSize;)this.evictOldest();let l=Date.now(),u={dataUri:t,contentType:n,size:i,contentHash:a,createdAt:l,lastAccessedAt:l,accessCount:1};this.cache.set(s,u),this.contentHashIndex.set(a,s),g.debug("Image cached",{url:Za(s),size:i,contentHash:a.substring(0,8),cacheSize:this.cache.size})}delete(e){let t=this.normalizeUrl(e),n=this.cache.get(t);return n?(this.contentHashIndex.get(n.contentHash)===t&&this.contentHashIndex.delete(n.contentHash),this.cache.delete(t),!0):!1}evictOldest(){let e=this.cache.keys().next().value;if(e!==void 0){let t=this.cache.get(e);t&&this.contentHashIndex.get(t.contentHash)===e&&this.contentHashIndex.delete(t.contentHash),this.cache.delete(e),this.stats.evictions++,g.debug("Image cache eviction",{url:Za(String(e))})}}evictExpired(){let e=0,t=Date.now();for(let[n,o]of this.cache.entries())t-o.createdAt>this.ttlMs&&(this.delete(n),e++,this.stats.expirations++);return e>0&&g.debug(`Evicted ${e} expired image cache entries`),e}clear(){let e=this.cache.size;this.cache.clear(),this.contentHashIndex.clear(),g.debug(`Image cache cleared (${e} entries removed)`)}getStats(){let e=0;for(let n of this.cache.values())e+=n.size;let t=this.stats.totalRequests>0?Number((this.stats.hits/this.stats.totalRequests*100).toFixed(2)):0;return{...this.stats,size:this.cache.size,totalBytes:e,hitRate:t}}has(e){let t=this.normalizeUrl(e),n=this.cache.get(t);return n!=null&&!this.isExpired(n)}getSize(){return this.cache.size}getConfig(){return{enabled:this.enabled,maxSize:this.maxSize,ttlMs:this.ttlMs,maxImageSize:this.maxImageSize}}},Yre=null});function Aqt(r){if(r&&typeof r=="object"){let e=r.code,t=r.name;if(Rqt.has(e||"")||t==="AbortError")return!0}if(r instanceof Error){let e=r.message,t=e.match(/HTTP (\d{3}):/);if(t){let n=parseInt(t[1],10);return n>=500||n===429||n===408}if(/\b(request timed out|operation timed out|connection timed out|timed out)\b/i.test(e)||/\bnetwork (error|failure|unreachable|down)\b/i.test(e))return!0}return!1}function Qre(r){if(r==="application/octet-stream")throw g.error("Unable to detect a supported image format from file content"),new Error("Unsupported or corrupted image: no known image signature (PNG/JPEG/GIF/WebP/BMP/TIFF/SVG/AVIF) was found in the file content.")}var ADe,kqt,Rqt,Pu,Iqt,Pqt,mM,Qj=C(()=>{"use strict";dn();H();mn();Bre();Kre();ki();Jre();Zre();kt();ADe=12,kqt={"image/png":67,"image/jpeg":125,"image/gif":43,"image/webp":20,"image/avif":100},Rqt=new Set(["ECONNRESET","ENOTFOUND","ECONNREFUSED","ETIMEDOUT","ERR_NETWORK"]);Pu=class r{static async process(e,t){let n=this.validateBufferNotEmpty(e);Qre(n);let o=r.safeBase64Convert(e,"image processing"),s=`data:${n};base64,${o}`;return this.validateProcessOutput(s,o,n),{type:"image",content:s,mimeType:n,metadata:{confidence:100,size:e.length}}}static hasStrictImageMagic(e,t){let n=e;switch(t){case"image/png":return n.length>=4&&n[0]===137&&n[1]===80&&n[2]===78&&n[3]===71;case"image/jpeg":return n.length>=3&&n[0]===255&&n[1]===216&&n[2]===255;case"image/gif":return n.length>=3&&n[0]===71&&n[1]===73&&n[2]===70;case"image/webp":return n.length>=12&&n.subarray(0,4).toString("latin1")==="RIFF"&&n.subarray(8,12).toString("latin1")==="WEBP";case"image/avif":return n.length>=12&&n.subarray(4,8).toString("latin1")==="ftyp"&&n.subarray(8,12).toString("latin1").startsWith("avif");default:return!1}}static validateBufferNotEmpty(e){if(e.length===0)throw g.error("Empty buffer provided"),de.imageBufferInvalid("Invalid image processing: buffer is empty");let t=this.detectImageType(e);if(t==="image/svg+xml")return t;if(e.length<ADe)throw de.imageBufferInvalid(`Invalid image processing: buffer too small (${e.length} bytes) \u2014 a minimum of ${ADe} bytes is required for a valid image.`);let n=kqt[t];if(n!==void 0&&e.length<n&&this.hasStrictImageMagic(e,t))throw de.imageBufferInvalid(`Invalid image processing: ${t} buffer is truncated (${e.length} bytes, minimum ${n} for a valid ${t}).`);return t}static validateProcessOutput(e,t,n){if(t.length===0)throw g.error("Empty base64 content generated"),new Error("Invalid image processing: base64 content is empty");if(!/^data:[^;]+;base64,[A-Za-z0-9+/]*={0,2}$/.test(e))throw g.error("Invalid data URI format generated",{dataUri:e}),new Error("Invalid data URI format: must be data:{mimeType};base64,{content}");if(!this.validateImageFormat(n))throw g.error("Invalid MIME type generated",{mediaType:n}),new Error(`Invalid MIME type: ${n} is not in allowed list`)}static processImageForOpenAI(e){try{return typeof e=="string"?e.startsWith("http")||e.startsWith("data:")?e:`data:image/jpeg;base64,${e}`:`data:image/jpeg;base64,${r.safeBase64Convert(e,"OpenAI image input")}`}catch(t){throw t instanceof Oe?t:(g.error("Failed to process image for OpenAI:",t),new Error(`Image processing failed for OpenAI: ${t instanceof Error?t.message:"Unknown error"}`,{cause:t}))}}static processImageForGoogle(e){try{let t,n="image/jpeg";if(typeof e=="string")if(e.startsWith("data:")){let o=e.match(/^data:([^;]+);base64,(.+)$/);o?(n=o[1],t=o[2]):t=e.split(",")[1]||e}else t=e;else t=r.safeBase64Convert(e,"provider image input");return{mimeType:n,data:t}}catch(t){throw t instanceof Oe?t:(g.error("Failed to process image for Google AI:",t),new Error(`Image processing failed for Google AI: ${t instanceof Error?t.message:"Unknown error"}`,{cause:t}))}}static processImageForAnthropic(e){try{let t,n="image/jpeg";if(typeof e=="string")if(e.startsWith("data:")){let o=e.match(/^data:([^;]+);base64,(.+)$/);o?(n=o[1],t=o[2]):t=e.split(",")[1]||e}else t=e;else t=r.safeBase64Convert(e,"provider image input");return{mediaType:n,data:t}}catch(t){throw t instanceof Oe?t:(g.error("Failed to process image for Anthropic:",t),new Error(`Image processing failed for Anthropic: ${t instanceof Error?t.message:"Unknown error"}`,{cause:t}))}}static processImageForVertex(e,t){try{return t.includes("gemini")?r.processImageForGoogle(e):t.includes("claude")?r.processImageForAnthropic(e):r.processImageForGoogle(e)}catch(n){throw n instanceof Oe?n:(g.error("Failed to process image for Vertex AI:",n),new Error(`Image processing failed for Vertex AI: ${n instanceof Error?n.message:"Unknown error"}`,{cause:n}))}}static detectImageType(e){try{if(typeof e=="string"){if(e.startsWith("data:")){let o=e.match(/^data:([^;]+);/);return o?o[1]:"image/jpeg"}let t=e.toLowerCase().split(".").pop();return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",gif:"image/gif",webp:"image/webp",bmp:"image/bmp",tiff:"image/tiff",tif:"image/tiff",svg:"image/svg+xml",avif:"image/avif"}[t||""]||"image/jpeg"}if(e.length>=4){let t=e.subarray(0,4);if(t[0]===137&&t[1]===80&&t[2]===78&&t[3]===71)return"image/png";if(t[0]===255&&t[1]===216&&t[2]===255)return"image/jpeg";if(t[0]===71&&t[1]===73&&t[2]===70&&t[3]===56)return"image/gif";if(e.length>=12){let n=e.subarray(0,4),o=e.subarray(8,12);if(n.toString()==="RIFF"&&o.toString()==="WEBP")return"image/webp"}if(e.length>=4){let n=e.subarray(0,4).toString();if(n==="<svg"||n==="<?xm")return"image/svg+xml"}if(e.length>=12){let n=e[4]===102&&e[5]===116&&e[6]===121&&e[7]===112,o=String.fromCharCode(e[8],e[9],e[10],e[11]);if(n&&(o==="avif"||o==="avis"||o==="avio"))return"image/avif"}if(e[0]===66&&e[1]===77)return"image/bmp";if(e[0]===73&&e[1]===73&&e[2]===42&&e[3]===0||e[0]===77&&e[1]===77&&e[2]===0&&e[3]===42)return"image/tiff"}return g.warn("Could not detect image type from magic bytes; using application/octet-stream"),"application/octet-stream"}catch(t){return g.warn("Failed to detect image type, using default:",t),"application/octet-stream"}}static validateSize(e,t,n=ig.IMAGE_MAX){if(!Number.isFinite(n)||n<0)throw de.invalidConfiguration("maxSize","must be a finite, non-negative byte count",{maxSize:n,context:t});if(!Number.isFinite(e)||e<0)throw de.invalidImageSize(e);if(e>n){let o=(e/1048576).toFixed(1),s=(n/(1024*1024)).toFixed(0);throw de.imageTooLarge(o,s)}}static validateBufferSize(e,t,n=ig.IMAGE_MAX){r.validateSize(e.length,t,n)}static safeBase64Convert(e,t,n=ig.IMAGE_MAX){return r.validateBufferSize(e,t,n),e.toString("base64")}static validateImageFormat(e){return["image/jpeg","image/png","image/gif","image/webp","image/bmp","image/tiff","image/svg+xml","image/avif"].includes(e.toLowerCase())}static getImageDimensions(e){try{if(e.length>=24&&e.subarray(0,8).toString("hex")==="89504e470d0a1a0a"){let t=e.readUInt32BE(16),n=e.readUInt32BE(20);return{width:t,height:n}}if(e.length>=4&&e[0]===255&&e[1]===216){let t=2;for(;t<e.length-1;){if(e[t]!==255){t++;continue}for(;t<e.length&&e[t]===255;)t++;if(t>=e.length)break;let n=e[t];if(t++,n===192||n===194){if(t+7>e.length)break;let s=e.readUInt16BE(t+3);return{width:e.readUInt16BE(t+5),height:s}}if(n===208||n===209||n===210||n===211||n===212||n===213||n===214||n===215||n===216||n===217||n===1)continue;if(t+2>e.length)break;let o=e.readUInt16BE(t);t+=o}return null}return null}catch(t){return g.warn("Failed to extract image dimensions:",t),null}}static processImage(e,t,n){try{Buffer.isBuffer(e)&&r.validateBufferSize(e,"image processing");let o=r.detectImageType(e);Qre(o);let s=typeof e=="string"?Buffer.byteLength(e,"base64"):e.length,i,a;switch(t.toLowerCase()){case"openai":i=r.processImageForOpenAI(e),a="data_uri";break;case"google-ai":case"google":{i=r.processImageForGoogle(e).data,a="base64";break}case"anthropic":{i=r.processImageForAnthropic(e).data,a="base64";break}case"vertex":{i=r.processImageForVertex(e,n||"").data,a="base64";break}default:typeof e=="string"?i=e.startsWith("data:")&&e.split(",")[1]||e:i=r.safeBase64Convert(e,"image input"),a="base64"}return{data:i,mediaType:o,size:s,format:a}}catch(o){throw o instanceof Oe?o:(g.error(`Failed to process image for ${t}:`,o),new Error(`Image processing failed: ${o instanceof Error?o.message:"Unknown error"}`,{cause:o}))}}},Iqt=["jpg","jpeg","png","gif","webp","bmp","tiff","tif","svg","avif","ico","heic","heif"],Pqt=new Set(Iqt),mM={isDataUri:r=>typeof r=="string"&&r.startsWith("data:")&&r.includes("base64,"),isUrl:r=>{try{return new URL(r),r.startsWith("http://")||r.startsWith("https://")}catch{return!1}},isBase64:r=>mM.isValidBase64(r),getFileExtension:r=>{let t=r.split(/[?#]/)[0].match(/\.([^.]+)$/);if(!t)return null;let n=t[1].toLowerCase();return/^[a-z0-9]+$/.test(n)?n:null},isValidImageExtension:r=>{if(!r||typeof r!="string")return!1;let e=r.toLowerCase();return/^[a-z0-9]+$/.test(e)?Pqt.has(e):!1},getValidatedImageExtension:r=>{let e=mM.getFileExtension(r);return e&&mM.isValidImageExtension(e)?e:null},formatFileSize:r=>{if(r===0)return"0 Bytes";let e=1024,t=["Bytes","KB","MB","GB"],n=Math.floor(Math.log(r)/Math.log(e));return parseFloat((r/Math.pow(e,n)).toFixed(2))+" "+t[n]},bufferToBase64:(r,e=ig.IMAGE_MAX)=>Pu.safeBase64Convert(r,"buffer-to-base64",e),base64ToBuffer:r=>{let e=r.includes(",")?r.split(",")[1]:r;return Buffer.from(e,"base64")},redactPathFromMessage:Ure,fileToBase64DataUri:async(r,e=10*1024*1024)=>{try{let t=await Promise.resolve().then(()=>(Iu(),sg)),n=await t.stat(r);if(!n.isFile())throw new Error("Not a file");if(n.size>e)throw new Error(`File too large: ${n.size} bytes (max: ${e} bytes)`);let o=await t.readFile(r),s=Pu.detectImageType(o)||Pu.detectImageType(r);Qre(s);let i=o.toString("base64");return`data:${s};base64,${i}`}catch(t){g.debug("fileToBase64DataUri failed",{filePath:r,error:t});let n=qs(r),o=My(t,{filePath:r}),s=t instanceof Error?o.message:"Unknown error";throw new Error(`Failed to convert file to base64 (${n}): ${s}`,{cause:o})}},urlToBase64DataUri:async(r,{timeoutMs:e=15e3,maxBytes:t=10*1024*1024,maxAttempts:n=3}={})=>{let o=Zj(),s=o.get(r);if(s)return g.debug("Using cached image for URL",{url:Za(r)}),s.dataUri;if(await Yj.acquire(),!/^https?:\/\//i.test(r))throw new Error("Unsupported protocol");let i=async()=>{let a=new AbortController,c=setTimeout(()=>a.abort(),e);try{let l=await fetch(r,{signal:a.signal});if(!l.ok)throw new Error(`HTTP ${l.status}: ${l.statusText}`);let u=l.headers.get("content-type")||"";if(!/^image\//i.test(u))throw new Error(`Unsupported content-type: ${u||"unknown"}`);let d=l.headers.get("content-length"),p=Number(d||0);if(d!==null&&p===0)throw new Error("Empty response: content-length is 0");if(p&&p>t)throw new Error(`Content too large: ${p} bytes`);let f=await l.arrayBuffer();if(f.byteLength>t)throw new Error(`Downloaded content too large: ${f.byteLength} bytes`);let h=Buffer.from(f),y=h.toString("base64"),x=`data:${u||"image/jpeg"};base64,${y}`;return o.set(r,x,u||"image/jpeg",h),x}finally{clearTimeout(c)}};try{return await kDe(i,{maxAttempts:n,initialDelay:Ta.DEFAULT_INITIAL_DELAY,backoffMultiplier:Ta.DEFAULT_BACKOFF_MULTIPLIER,maxDelay:Ta.DEFAULT_MAX_DELAY,retryCondition:Aqt,onRetry:(a,c)=>{let l=Fre(c instanceof Error?c.message:String(c)),u=n-a;g.warn(`\u26A0\uFE0F Image download attempt ${a} failed for ${Za(r)}: ${l}. ${u} ${u===1?"attempt":"attempts"} remaining...`)}})}catch(a){let c=Za(r),l=My(a);throw new Error(`Failed to download and convert URL to base64 (${c}): ${l.message}`,{cause:l})}},extractBase64FromDataUri:r=>r.includes(",")?r.split(",")[1]:r,extractMimeTypeFromDataUri:r=>{let e=r.match(/^data:([^;]+);base64,/);return e?e[1]:"image/jpeg"},createDataUri:(r,e="image/jpeg")=>{let t=r.includes(",")?r.split(",")[1]:r;return`data:${e};base64,${t}`},isValidBase64:r=>{try{let e=r.includes(",")?r.split(",")[1]:r;if(!e||e.length===0||!/^[A-Za-z0-9+/]*={0,2}$/.test(e)||e.length%4!==0)return!1;let n=e.indexOf("=");if(n!==-1){if(n<e.length-2)return!1;let a=e.slice(n);if(!/^=+$/.test(a))return!1}let s=Buffer.from(e,"base64").toString("base64"),i=a=>a.replace(/=+$/,"");return i(e)===i(s)}catch{return!1}},getBase64Size:r=>{let e=r.includes(",")?r.split(",")[1]:r;return Buffer.byteLength(e,"base64")},compressBase64:(r,e=.8)=>(g.warn("Base64 compression not implemented - returning original"),r)}});function Oqt(r){let e=r.toLowerCase();switch(e.replace(/[^a-z]/g,"")){case"lmstudio":return"lm-studio";case"llamacpp":return"llamacpp";case"nvidianim":return"nvidia-nim";case"googleaistudio":return"google-ai";case"or":return"openrouter";default:return e}}var Ny,fM,Mqt,ene,u_,IDe=C(()=>{"use strict";Qj();H();Ny=class{static logError(e,t,n){g.error(`Multimodal ${e} failed: ${t.message}`),process.env.NODE_ENV==="development"&&(g.error("Context:",JSON.stringify(n,null,2)),g.error("Stack:",t.stack))}},fM={openai:10,azure:10,"google-ai":16,google:16,anthropic:20,vertex:{claude:20,gemini:16,default:16},ollama:10,litellm:10,mistral:10,bedrock:20,openrouter:10},Mqt=new Set(["litellm","openrouter"]);ene={openai:["gpt-5.4","gpt-5.4-mini","gpt-5.4-nano","gpt-5.4-pro","gpt-5.2","gpt-5.2-chat-latest","gpt-5.2-pro","gpt-5","gpt-5-2025-08-07","gpt-5-pro","gpt-5-mini","gpt-5-nano","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","o3","o3-mini","o3-pro","o4","o4-mini","o4-mini-deep-research","gpt-4o","gpt-4o-mini","gpt-4-turbo","gpt-4-vision-preview"],"google-ai":["gemini-3.1-pro-preview","gemini-3.1-flash-lite-preview","gemini-3.1-flash-image-preview","gemini-3.1-pro-preview-customtools","gemini-3-flash-preview","gemini-3-pro-image-preview","gemini-3-pro-preview","gemini-2.5-pro","gemini-2.5-flash","gemini-2.5-flash-lite","gemini-2.5-flash-image","gemini-2.0-flash","gemini-2.0-flash-001","gemini-2.0-flash-lite","gemini-2.0-flash-preview-image-generation","gemini-1.5-pro","gemini-1.5-flash","gemini-pro-vision"],anthropic:["claude-opus-4-6","claude-sonnet-4-6","claude-sonnet-4-5","claude-sonnet-4-5-20250929","claude-opus-4-5","claude-opus-4-5-20251101","claude-haiku-4-5","claude-haiku-4-5-20251001","claude-opus-4-1","claude-opus-4-1-20250805","claude-opus-4","claude-opus-4-20250514","claude-sonnet-4","claude-sonnet-4-20250514","claude-3-7-sonnet","claude-3-7-sonnet-20250219","claude-3-5-sonnet","claude-3-5-sonnet-20241022","claude-3-opus","claude-3-sonnet","claude-3-haiku"],azure:["gpt-5.1","gpt-5.1-chat","gpt-5.1-codex","gpt-5","gpt-5-pro","gpt-5-turbo","gpt-5-chat","gpt-5-mini","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","o3","o3-mini","o3-pro","o4-mini","gpt-4o","gpt-4o-mini","gpt-4-turbo","gpt-4-vision-preview","gpt-4"],vertex:["gemini-3.1-pro-preview","gemini-3.1-flash-lite-preview","gemini-3.1-flash-image-preview","gemini-3.1-pro-preview-customtools","gemini-3-flash-preview","gemini-3-pro-image-preview","gemini-3-pro-preview","gemini-2.5-pro","gemini-2.5-flash","gemini-2.5-flash-lite","gemini-2.5-flash-image","gemini-2.0-flash-001","gemini-2.0-flash-lite","gemini-2.0-flash","gemini-1.5-pro","gemini-1.5-flash","claude-sonnet-4-5@","claude-opus-4-5@","claude-haiku-4-5@","claude-haiku-4-5","claude-sonnet-4@","claude-opus-4@","claude-opus-4-1@","claude-3-7-sonnet@","claude-3-5-sonnet@","claude-opus-3@","claude-haiku-3@","claude-3-7-sonnet","claude-3-5-sonnet","claude-3-opus","claude-3-sonnet","claude-3-haiku","claude-sonnet-4","claude-sonnet-3","claude-opus-3","claude-haiku-3","claude-haiku-4","claude-3.5-sonnet","claude-3.5-haiku","claude-4.5-sonnet","claude-4.5-opus","claude-4.5-haiku","claude-haiku-4-5","claude-3.0-sonnet","claude-3.0-opus"],litellm:["openai/gpt-5","openai/gpt-4o","openai/gpt-4o-mini","openai/gpt-4-turbo","gpt-5","gpt-4o","gpt-4.1","anthropic/claude-sonnet-4-5-20250929","anthropic/claude-opus-4-1-20250805","anthropic/claude-3-5-sonnet-20240620","claude-sonnet-4-5","claude-sonnet-4-5-20250929","claude-opus-4-5","claude-opus-4-5-20251101","claude-haiku-4-5-20251001","claude-sonnet-4","claude-opus-4-1","vertex_ai/gemini-2.5-pro","gemini/gemini-2.5-pro","gemini/gemini-2.0-flash","gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-2.5-pro","gemini-2.5-flash","gemini-2.0-flash-lite","groq/llama-3.2-11b-vision-preview"],openrouter:["anthropic/claude-3.7-sonnet","anthropic/claude-3-5-haiku","anthropic/claude-3-opus","anthropic/claude-3-sonnet","anthropic/claude-3-haiku","openai/gpt-4o","openai/gpt-4o-mini","openai/gpt-4-turbo","openai/gpt-4-vision-preview","google/gemini-2.5-pro","google/gemini-2.5-flash","google/gemini-2.0-flash","google/gemini-2.0-flash-001","google/gemini-1.5-pro","google/gemini-1.5-flash","google/gemini-pro-vision","meta-llama/llama-3.2-90b-vision-instruct","meta-llama/llama-3.2-11b-vision-instruct","mistralai/pixtral-12b","mistralai/pixtral-large","qwen/qwen-2-vl-72b-instruct","qwen/qwen-2-vl-7b-instruct"],mistral:["mistral-large-latest","mistral-large-2512","mistral-small","mistral-small-latest","mistral-small-3.2","mistral-small-2506","mistral-medium","mistral-medium-latest","mistral-medium-3.1","mistral-medium-2508","magistral-small","magistral-small-latest","magistral-medium","magistral-medium-latest","pixtral-12b","pixtral-12b-latest","pixtral-large","pixtral-large-latest","pixtral-large-2502"],ollama:["llama4:scout","llama4:maverick","llama4:latest","llama4","llama3.2-vision","llama3.2-vision:11b","llama3.2-vision:90b","gemma3","gemma3:4b","gemma3:12b","gemma3:27b","gemma3:latest","qwen2.5-vl","qwen2.5-vl:72b","qwen2.5-vl:32b","mistral-small3.1","mistral-small3.1:large","mistral-small3.1:medium","mistral-small3.1:small","llava","llava:7b","llava:13b","llava:34b","llava-llama3","llava-llama3:8b"],bedrock:["amazon.nova-premier","amazon.nova-premier-v1:0","amazon.nova-pro","amazon.nova-pro-v1:0","amazon.nova-lite","amazon.nova-lite-v1:0","amazon.nova-2-lite-v1:0","nova-premier","nova-pro","nova-lite","claude-sonnet-4-5","claude-sonnet-4.5","anthropic.claude-sonnet-4-5","anthropic.claude-sonnet-4-5-20250929-v1:0","claude-opus-4-5","claude-opus-4.5","anthropic.claude-opus-4-5","anthropic.claude-opus-4-5-20251124-v1:0","claude-haiku-4-5","claude-haiku-4.5","anthropic.claude-haiku-4-5","anthropic.claude-haiku-4-5-20251001-v1:0","claude-sonnet-4","claude-sonnet-4@","anthropic.claude-sonnet-4","anthropic.claude-sonnet-4-20250514-v1:0","claude-opus-4","claude-opus-4-1","claude-opus-4@","anthropic.claude-opus-4","anthropic.claude-opus-4-1-20250805-v1:0","claude-3-7-sonnet","claude-3.7-sonnet","anthropic.claude-3-7-sonnet","anthropic.claude-3-7-sonnet-20250219-v1:0","claude-3-5-sonnet","claude-3.5-sonnet","anthropic.claude-3-5-sonnet","anthropic.claude-3-5-sonnet-20241022-v1:0","claude-3-opus","anthropic.claude-3-opus","claude-3-sonnet","anthropic.claude-3-sonnet","claude-3-haiku","anthropic.claude-3-haiku","meta.llama4-maverick-17b-instruct-v1:0","meta.llama4-scout-17b-instruct-v1:0","meta.llama3-2-90b-instruct-v1:0","meta.llama3-2-11b-instruct-v1:0","mistral.pixtral-large-2502-v1:0","anthropic.claude"],huggingface:["Qwen/Qwen2.5-VL-32B-Instruct","Qwen/Qwen2.5-VL-7B-Instruct","microsoft/Phi-3-vision-128k-instruct","llava-hf/llava-1.5-7b-hf","llava-hf/llava-v1.6-mistral-7b-hf"],sagemaker:["meta-llama-4-maverick-17b-128e-instruct","meta-llama-4-scout-17b-16e-instruct"],deepseek:[],"nvidia-nim":["meta/llama-3.2-90b-vision-instruct","meta/llama-3.2-11b-vision-instruct"],"lm-studio":["llava","llama-3.2-11b-vision","llama-3.2-90b-vision","vision-instruct","qwen2-vl","qwen2.5-vl","phi-3-vision"],llamacpp:["llava","llama-3.2-11b-vision","llama-3.2-90b-vision","vision-instruct","qwen2-vl","phi-3-vision"],xai:["grok-2-vision-latest"],groq:["llama-3.2-90b-vision-preview","llama-3.2-11b-vision-preview"],cohere:[],"together-ai":[],fireworks:["accounts/fireworks/models/phi-3-vision-128k-instruct","accounts/fireworks/models/llama-v3p2-90b-vision-instruct","accounts/fireworks/models/llama-v3p2-11b-vision-instruct"],perplexity:[],cloudflare:["@cf/meta/llama-3.2-11b-vision-instruct"],replicate:["llava","llama-3.2-vision","moondream","qwen2-vl"],voyage:[],jina:[],stability:[],ideogram:[],recraft:[]},u_=class{static validateImageCount(e,t,n){let o=t.toLowerCase(),s;if(o==="vertex"&&n)n.includes("claude")?s=fM.vertex.claude:n.includes("gemini")?s=fM.vertex.gemini:s=fM.vertex.default;else{let a=o in fM?fM[o]:void 0;a===void 0?(s=10,g.warn(`Image count limit not defined for provider ${t}. Using conservative default of 10 images.`)):s=a}let i=Math.floor(s*.8);if(e===i&&g.warn(`Image count (${e}) is approaching the limit for ${t}. Maximum allowed: ${s}. Please reduce the number of images.`),e>s)throw new Error(`Image count (${e}) exceeds the maximum limit for ${t}. Maximum allowed: ${s}. Please reduce the number of images.`)}static convertToContent(e,t){let n=[{type:"text",text:e}];return t&&t.length>0&&t.forEach(o=>{let s=typeof o=="object"&&"data"in o&&!Buffer.isBuffer(o)?o.data:o,i=typeof o=="object"&&"data"in o&&!Buffer.isBuffer(o)?o.altText:void 0;n.push({type:"image",data:s,altText:i,mediaType:Pu.detectImageType(s)})}),n}static supportsVision(e,t){try{let n=Oqt(e),o=ene[n];if(!o||o.length===0)return!1;if(!t)return!0;let s=o.some(i=>t.toLowerCase().includes(i.toLowerCase()));return!s&&Mqt.has(n)?!0:s}catch{return!1}}static getSupportedModels(e){let t=e.toLowerCase(),n=ene[t];return n?[...n]:[]}static getVisionProviders(){return Object.entries(ene).filter(([,e])=>e.length>0).map(([e])=>e)}static countImagesInMessage(e,t){return(e?.length||0)+(t??0)}static countImagesInPages(e){return!e||e.length===0?0:e.reduce((t,n)=>t+(n.pageCount??0),0)}}});function PDe(){return{enabled:process.env.NEUROLINK_MEMORY_ENABLED==="true",maxSessions:Number(process.env.NEUROLINK_MEMORY_MAX_SESSIONS)||50,enableSummarization:process.env.NEUROLINK_SUMMARIZATION_ENABLED!=="false",tokenThreshold:process.env.NEUROLINK_TOKEN_THRESHOLD?Number(process.env.NEUROLINK_TOKEN_THRESHOLD):void 0,summarizationProvider:process.env.NEUROLINK_SUMMARIZATION_PROVIDER||"vertex",summarizationModel:process.env.NEUROLINK_SUMMARIZATION_MODEL||"gemini-2.5-flash",maxTurnsPerSession:50}}var tne,rne,nne=C(()=>{"use strict";tne=`
819
+ `):String(f):void 0,y=p.reasoning??void 0;return{content:a,structuredData:c,usage:p,finishReason:e.finishReason,jsonRepaired:l||void 0,jsonTruncated:u||void 0,provider:this.providerName,model:this.modelName,reasoning:h,reasoningTokens:y,toolCalls:e.toolCalls?e.toolCalls.map(x=>({toolCallId:x.toolCallId||"unknown",toolName:x.toolName||"unknown",args:x.args||{}})):[],toolResults:e.toolResults??[],toolsUsed:n,toolExecutions:o,availableTools:Object.keys(t).map(x=>{let b=t[x];return{name:x,description:b.description||"No description available",parameters:b.inputSchema||{},server:b.serverId||"direct"}})}}analyzeAIResponse(e){g.debug("NeuroLink Raw AI Response Analysis",{provider:this.providerName,model:this.modelName,responseTextLength:e.text?.length||0,responsePreview:e.text?.substring(0,500)??"",finishReason:e.finishReason,usage:e.usage});let t={hasToolCalls:!!e.toolCalls,toolCallsLength:e.toolCalls?.length||0,toolCalls:e.toolCalls?.map((n,o)=>{let s=n,i=s.toolName||s.name||"unknown";return{index:o+1,toolName:i,toolId:s.toolCallId||s.id||"none",hasArgs:!!s.args,argsKeys:s.args&&typeof s.args=="object"?Object.keys(s.args):[]}})||[]};g.debug("Tool Calls Analysis",t)}}});var sg={};te(sg,{AsyncLocalStorage:()=>iBt,Buffer:()=>qzt,Channel:()=>Nzt,DatabaseSync:()=>Vzt,Duplex:()=>cBt,EventEmitter:()=>sBt,Http2ServerRequest:()=>Yzt,Http2ServerResponse:()=>Xzt,Interface:()=>Gzt,MIMEType:()=>njt,PassThrough:()=>lBt,PerformanceObserver:()=>Pzt,Readable:()=>yDe,ReadableStream:()=>uBt,Resolver:()=>Azt,TextDecoder:()=>vDe,TextEncoder:()=>Vj,Transform:()=>aBt,URL:()=>hzt,URLSearchParams:()=>yzt,Worker:()=>Uzt,Writable:()=>xDe,access:()=>OBt,appendFile:()=>uM,appendFileSync:()=>H2t,arch:()=>JBt,arrayBuffer:()=>Zzt,basename:()=>Z2t,builtinModules:()=>pzt,callbackify:()=>Ezt,channel:()=>Ozt,chmodSync:()=>hBt,clearInterval:()=>rjt,clearTimeout:()=>ejt,closeSync:()=>vBt,connect:()=>QBt,constants:()=>Hzt,copyFileSync:()=>xBt,cpSync:()=>W2t,cpus:()=>qBt,createConnection:()=>ezt,createGunzip:()=>azt,createGzip:()=>czt,createHash:()=>hDe,createHmac:()=>j2t,createInterface:()=>jzt,createReadStream:()=>IBt,createRequire:()=>dzt,createServer:()=>K2t,createWriteStream:()=>ABt,debug:()=>Szt,debuglog:()=>bDe,default:()=>B2t,deflateSync:()=>rzt,deprecate:()=>wzt,deserialize:()=>Fzt,dirname:()=>X2t,exec:()=>FBt,execFile:()=>$Bt,execFileSync:()=>BBt,execSync:()=>UBt,existsSync:()=>mBt,extname:()=>Q2t,fileURLToPath:()=>xzt,finished:()=>pBt,format:()=>gzt,freemem:()=>HBt,fstatSync:()=>TBt,get:()=>ZBt,gunzip:()=>izt,gunzipSync:()=>nzt,gzip:()=>szt,gzipSync:()=>ozt,hasSubscribers:()=>Dzt,homedir:()=>jBt,hostname:()=>VBt,inflateSync:()=>tzt,inherits:()=>vzt,inspect:()=>Hj,isAbsolute:()=>tBt,isBuiltin:()=>mzt,isDeepStrictEqual:()=>_zt,isIP:()=>Jzt,isIPv4:()=>Kzt,isIPv6:()=>Wzt,isMainThread:()=>$zt,join:()=>J2t,lookup:()=>Rzt,mkdir:()=>Pre,mkdirSync:()=>SBt,monitorEventLoopDelay:()=>Mzt,normalize:()=>oBt,ok:()=>lzt,open:()=>Mre,openSync:()=>bBt,parentPort:()=>Bzt,parse:()=>fzt,pathToFileURL:()=>bzt,performance:()=>Izt,pipeline:()=>dBt,platform:()=>zBt,posix:()=>nBt,promises:()=>z2t,promisify:()=>Tzt,randomBytes:()=>G2t,randomUUID:()=>V2t,readFile:()=>Py,readFileSync:()=>fBt,readdir:()=>PBt,readdirSync:()=>EBt,realpath:()=>qj,realpathSync:()=>yBt,relative:()=>eBt,release:()=>YBt,rename:()=>NBt,renameSync:()=>CBt,request:()=>XBt,resolve:()=>Y2t,rm:()=>DBt,rmSync:()=>RBt,rmdirSync:()=>kBt,sep:()=>rBt,serialize:()=>Lzt,setInterval:()=>tjt,setTimeout:()=>Qzt,spawn:()=>LBt,stat:()=>dM,statSync:()=>wBt,strict:()=>uzt,tmpdir:()=>GBt,toUSVString:()=>Czt,totalmem:()=>WBt,type:()=>KBt,types:()=>kzt,unlink:()=>MBt,unlinkSync:()=>_Bt,webcrypto:()=>q2t,workerData:()=>zzt,writeFile:()=>Ire,writeFileSync:()=>gBt});var _s,$o,B2t,z2t,hDe,j2t,G2t,V2t,q2t,H2t,W2t,K2t,J2t,Y2t,X2t,Z2t,Q2t,eBt,tBt,rBt,nBt,oBt,sBt,iBt,yDe,xDe,aBt,cBt,lBt,uBt,dBt,pBt,mBt,fBt,gBt,hBt,uM,yBt,xBt,bBt,vBt,TBt,SBt,wBt,EBt,_Bt,CBt,kBt,RBt,ABt,IBt,Py,Ire,Pre,dM,PBt,MBt,OBt,NBt,DBt,Mre,qj,LBt,FBt,UBt,$Bt,BBt,zBt,jBt,GBt,VBt,qBt,HBt,WBt,KBt,JBt,YBt,XBt,ZBt,QBt,ezt,tzt,rzt,nzt,ozt,szt,izt,azt,czt,lzt,uzt,dzt,pzt,mzt,fzt,gzt,hzt,yzt,xzt,bzt,vzt,Tzt,bDe,Szt,Hj,wzt,Ezt,_zt,Czt,kzt,vDe,Vj,Rzt,Azt,Izt,Pzt,Mzt,Ozt,Nzt,Dzt,Lzt,Fzt,Uzt,$zt,Bzt,zzt,jzt,Gzt,Vzt,qzt,Hzt,Wzt,Kzt,Jzt,Yzt,Xzt,Zzt,TDe,Qzt,ejt,tjt,rjt,njt,Iu=C(()=>{_s=()=>{},$o=async()=>{},B2t={},z2t={readFile:$o,writeFile:$o,mkdir:$o,stat:$o,readdir:$o,unlink:$o,access:$o,rm:$o,rename:$o},hDe=r=>{let e=[];return{update(t){return e.push(typeof t=="string"?new Vj().encode(t):t),this},digest(t){let n=0;for(let s of e)for(let i=0;i<s.length;i++)n=(n<<5)-n+s[i]|0;let o=(n>>>0).toString(16).padStart(8,"0");return t==="hex"?o:t==="base64"?btoa(o):o}}},j2t=(r,e)=>hDe(r),G2t=r=>new Uint8Array(r||32),V2t=()=>globalThis.crypto?.randomUUID?.()||Math.random().toString(36),q2t=globalThis.crypto,H2t=()=>{throw new Error("[NeuroLink:browser] fs.appendFileSync is not supported in browser runtime \u2014 use server-side execution")},W2t=()=>{throw new Error("[NeuroLink:browser] fs.cpSync is not supported in browser runtime \u2014 use server-side execution")},K2t=()=>({listen:_s,close:_s,on:_s}),J2t=(...r)=>r.join("/"),Y2t=(...r)=>r.join("/"),X2t=r=>r||"",Z2t=r=>r?.split?.("/")?.pop?.()||"",Q2t=r=>{let e=r?.match?.(/\.[^.]+$/);return e?e[0]:""},eBt=(r,e)=>e||"",tBt=()=>!1,rBt="/",nBt={normalize:r=>r,join:(...r)=>r.join("/"),resolve:(...r)=>r.join("/"),sep:"/"},oBt=r=>r,sBt=class{on(){return this}off(){return this}emit(){return this}once(){return this}removeListener(){return this}addListener(){return this}},iBt=class{getStore(){}run(r,e,...t){return e(...t)}enterWith(){}disable(){}},yDe=class{pipe(){return this}on(){return this}read(){return null}push(){}destroy(){}},xDe=class{write(){return!0}end(){}on(){return this}destroy(){}},aBt=class{push(){}on(){return this}},cBt=class{on(){return this}},lBt=class{pipe(){return this}on(){return this}},uBt=globalThis.ReadableStream||class{},dBt=_s,pBt=_s,mBt=()=>!1,fBt=()=>"",gBt=_s,hBt=_s,uM=$o,yBt=r=>r,xBt=_s,bBt=()=>0,vBt=_s,TBt=()=>({}),SBt=_s,wBt=()=>({}),EBt=()=>[],_Bt=_s,CBt=_s,kBt=_s,RBt=_s,ABt=()=>new xDe,IBt=()=>new yDe,Py=$o,Ire=$o,Pre=$o,dM=$o,PBt=$o,MBt=$o,OBt=$o,NBt=$o,DBt=$o,Mre=async()=>({stat:$o,readFile:$o,close:$o,read:$o,write:$o}),qj=async r=>r,LBt=()=>({on:_s,stdout:{on:_s},stderr:{on:_s},kill:_s}),FBt=(r,e)=>e?.(null,"",""),UBt=()=>"",$Bt=(r,e,t)=>{typeof e=="function"?e(null,"",""):t?.(null,"","")},BBt=()=>"",zBt="browser",jBt=()=>"/",GBt=()=>"/tmp",VBt=()=>"browser",qBt=()=>[{}],HBt=()=>0,WBt=()=>0,KBt=()=>"Browser",JBt=()=>"wasm",YBt=()=>"0",XBt=()=>({}),ZBt=()=>({}),QBt=()=>({}),ezt=()=>({}),tzt=()=>new Uint8Array,rzt=()=>new Uint8Array,nzt=()=>new Uint8Array,ozt=()=>new Uint8Array,szt=(r,e)=>e?.(null,r),izt=(r,e)=>e?.(null,r),azt=()=>({}),czt=()=>({}),lzt=_s,uzt={},dzt=()=>()=>({}),pzt=[],mzt=()=>!1,fzt=r=>({pathname:r||"",hostname:"",protocol:"",search:"",hash:""}),gzt=()=>"",hzt=globalThis.URL,yzt=globalThis.URLSearchParams,xzt=r=>typeof r=="string"?r.replace("file://",""):r,bzt=r=>new globalThis.URL("file://"+r),vzt=(r,e)=>{e&&(r.super_=e,Object.setPrototypeOf(r.prototype,e.prototype))},Tzt=r=>(...e)=>new Promise((t,n)=>r(...e,(o,s)=>o?n(o):t(s))),bDe=r=>{let e=(...t)=>{};return e.enabled=!1,e},Szt=bDe,Hj=r=>{try{return JSON.stringify(r,null,2)}catch{return String(r)}};Hj.custom=Symbol.for("nodejs.util.inspect.custom");Hj.colors={};Hj.styles={};wzt=r=>r,Ezt=r=>(...e)=>{let t=e.pop();r(...e).then(n=>t(null,n)).catch(t)},_zt=(r,e)=>JSON.stringify(r)===JSON.stringify(e),Czt=r=>String(r),kzt={isPromise:r=>r instanceof Promise,isDate:r=>r instanceof Date,isRegExp:r=>r instanceof RegExp,isNativeError:r=>r instanceof Error,isArrayBuffer:r=>r instanceof ArrayBuffer,isTypedArray:r=>ArrayBuffer.isView(r),isUint8Array:r=>r instanceof Uint8Array,isProxy:()=>!1},vDe=globalThis.TextDecoder,Vj=globalThis.TextEncoder,Rzt=(r,e)=>e?.(null,"127.0.0.1",4),Azt=class{},Izt=globalThis.performance||{now:()=>Date.now()},Pzt=class{observe(){}disconnect(){}},Mzt=()=>({enable:_s,disable:_s,percentile:()=>0}),Ozt=()=>({}),Nzt=class{},Dzt=()=>!1,Lzt=()=>new Uint8Array,Fzt=_s,Uzt=class{},$zt=!0,Bzt=null,zzt=null,jzt=()=>({}),Gzt=class{},Vzt=class{},qzt=globalThis.Buffer||class extends Uint8Array{static from(e,t){if(typeof e=="string"){let n=(t||"utf8").toLowerCase();if(n==="base64"){let o=atob(e),s=new Uint8Array(o.length);for(let i=0;i<o.length;i++)s[i]=o.charCodeAt(i);return s}if(n==="hex"){let o=new Uint8Array(e.length/2);for(let s=0;s<e.length;s+=2)o[s/2]=parseInt(e.substr(s,2),16);return o}return new Vj().encode(e)}return new Uint8Array(e)}static alloc(e){return new Uint8Array(e)}static isBuffer(e){return e instanceof Uint8Array}static concat(e){let t=e.reduce((s,i)=>s+i.length,0),n=new Uint8Array(t),o=0;for(let s of e)n.set(s,o),o+=s.length;return n}static byteLength(e,t){return t==="base64"?Math.ceil(e.length*3/4):new Vj().encode(e).length}toString(e){let t=(e||"utf8").toLowerCase();if(t==="hex")return Array.from(new Uint8Array(this.buffer,this.byteOffset,this.byteLength)).map(n=>n.toString(16).padStart(2,"0")).join("");if(t==="base64"){let n="";for(let o=0;o<this.length;o++)n+=String.fromCharCode(this[o]);return btoa(n)}return new vDe().decode(this)}},Hzt={F_OK:0,R_OK:4,W_OK:2,X_OK:1},Wzt=()=>!1,Kzt=()=>!1,Jzt=()=>0,Yzt=class{},Xzt=class{},Zzt=async()=>new ArrayBuffer(0),TDe=r=>({[Symbol.toPrimitive](){return r},ref(){return this},unref(){return this},hasRef(){return!1},refresh(){return this},close(){}}),Qzt=(...r)=>TDe(globalThis.setTimeout(...r)),ejt=globalThis.clearTimeout,tjt=(...r)=>TDe(globalThis.setInterval(...r)),rjt=globalThis.clearInterval,njt=class{constructor(r){this.type=r}toString(){return this.type}}});var Dre={};te(Dre,{Agent:()=>Nre,BedrockClient:()=>sjt,BedrockRuntimeClient:()=>ajt,Blob:()=>Gjt,Client:()=>qjt,ConverseCommand:()=>cjt,ConverseStreamCommand:()=>ljt,Cron:()=>Cjt,Dispatcher:()=>Hjt,File:()=>jjt,FlowProducer:()=>_jt,FormData:()=>zjt,GoogleAuth:()=>fjt,HTTPException:()=>Ojt,Headers:()=>Bjt,Hippocampus:()=>xjt,HippocampusConfig:()=>bjt,Hono:()=>Pjt,ImageFormat:()=>ujt,InvokeEndpointCommand:()=>pjt,InvokeEndpointWithResponseStreamCommand:()=>mjt,Job:()=>wjt,ListFoundationModelsCommand:()=>ijt,MockAgent:()=>Kjt,Pool:()=>Vjt,Queue:()=>Tjt,QueueScheduler:()=>Ejt,Request:()=>Ujt,Response:()=>$jt,SageMakerRuntimeClient:()=>djt,TextToSpeechClient:()=>hjt,VertexAI:()=>gjt,Webhook:()=>yjt,Worker:()=>Sjt,convertToHtml:()=>Ijt,cors:()=>Mjt,createClient:()=>vjt,default:()=>ojt,extractRawText:()=>Ajt,fetch:()=>Ore,getGlobalDispatcher:()=>Rv,interceptors:()=>Av,logger:()=>Njt,parseBuffer:()=>kjt,request:()=>Iv,secureHeaders:()=>Djt,selectCover:()=>Rjt,setGlobalDispatcher:()=>Wjt,streamSSE:()=>Ljt,timeout:()=>Fjt});var i_,Ri,ojt,sjt,ijt,ajt,cjt,ljt,ujt,djt,pjt,mjt,fjt,gjt,hjt,yjt,xjt,bjt,vjt,Tjt,Sjt,wjt,Ejt,_jt,Cjt,kjt,Rjt,Ajt,Ijt,Pjt,Mjt,Ojt,Njt,Djt,Ljt,Fjt,Ore,Ujt,$jt,Bjt,zjt,jjt,Gjt,Nre,Vjt,qjt,Hjt,Wjt,Rv,Kjt,Av,Iv,a_=C(()=>{i_={get(r,e){return e==="__esModule"?!0:e==="default"?new Proxy({},{get:i_.get}):new Proxy(function(...t){return new Proxy({},{get:i_.get})},{get:i_.get,apply(t,n,o){return new Proxy({},{get:i_.get})},construct(t,n){return new Proxy({},{get:i_.get})}})}},Ri=new Proxy({},i_),ojt=Ri,{BedrockClient:sjt,ListFoundationModelsCommand:ijt,BedrockRuntimeClient:ajt,ConverseCommand:cjt,ConverseStreamCommand:ljt,ImageFormat:ujt}=Ri,{SageMakerRuntimeClient:djt,InvokeEndpointCommand:pjt,InvokeEndpointWithResponseStreamCommand:mjt}=Ri,{GoogleAuth:fjt,VertexAI:gjt,TextToSpeechClient:hjt}=Ri,{Webhook:yjt}=Ri,{Hippocampus:xjt,HippocampusConfig:bjt}=Ri,{createClient:vjt}=Ri,{Queue:Tjt,Worker:Sjt,Job:wjt,QueueScheduler:Ejt,FlowProducer:_jt}=Ri,{Cron:Cjt}=Ri,{parseBuffer:kjt,selectCover:Rjt}=Ri,{extractRawText:Ajt,convertToHtml:Ijt}=Ri,{Hono:Pjt}=Ri,{cors:Mjt,HTTPException:Ojt,logger:Njt,secureHeaders:Djt,streamSSE:Ljt,timeout:Fjt}=Ri,Ore=globalThis.fetch,Ujt=globalThis.Request,$jt=globalThis.Response,Bjt=globalThis.Headers,zjt=globalThis.FormData,jjt=globalThis.File,Gjt=globalThis.Blob,Nre=Ri.Agent,Vjt=Ri.Pool,qjt=Ri.Client,Hjt=Ri.Dispatcher,Wjt=()=>{},Rv=()=>Ri,Kjt=Ri.MockAgent,Av={redirect:()=>r=>r,retry:()=>r=>r},Iv=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 pM={};te(pM,{AsyncLocalStorage:()=>pGt,Buffer:()=>oqt,Channel:()=>WVt,DatabaseSync:()=>nqt,Duplex:()=>fGt,EventEmitter:()=>dGt,Http2ServerRequest:()=>lqt,Http2ServerResponse:()=>uqt,Interface:()=>rqt,MIMEType:()=>hqt,PassThrough:()=>gGt,PerformanceObserver:()=>VVt,Readable:()=>SDe,ReadableStream:()=>hGt,Resolver:()=>jVt,TextDecoder:()=>_De,TextEncoder:()=>Wj,Transform:()=>mGt,URL:()=>AVt,URLSearchParams:()=>IVt,Worker:()=>XVt,Writable:()=>wDe,access:()=>VGt,appendFile:()=>wGt,appendFileSync:()=>Zjt,arch:()=>cVt,arrayBuffer:()=>dqt,basename:()=>oGt,builtinModules:()=>_Vt,callbackify:()=>FVt,channel:()=>HVt,chmodSync:()=>SGt,clearInterval:()=>gqt,clearTimeout:()=>mqt,closeSync:()=>kGt,connect:()=>pVt,constants:()=>sqt,copyFileSync:()=>_Gt,cpSync:()=>Qjt,cpus:()=>oVt,createConnection:()=>mVt,createGunzip:()=>vVt,createGzip:()=>TVt,createHash:()=>Xa,createHmac:()=>Lre,createInterface:()=>tqt,createReadStream:()=>FGt,createRequire:()=>EVt,createServer:()=>eGt,createWriteStream:()=>LGt,debug:()=>DVt,debuglog:()=>EDe,default:()=>Jjt,deflateSync:()=>gVt,deprecate:()=>LVt,deserialize:()=>YVt,dirname:()=>nGt,exec:()=>YGt,execFile:()=>ZGt,execFileSync:()=>QGt,execSync:()=>XGt,existsSync:()=>bGt,extname:()=>sGt,fileURLToPath:()=>PVt,finished:()=>xGt,format:()=>RVt,freemem:()=>sVt,fstatSync:()=>RGt,get:()=>dVt,gunzip:()=>bVt,gunzipSync:()=>hVt,gzip:()=>xVt,gzipSync:()=>yVt,hasSubscribers:()=>KVt,homedir:()=>tVt,hostname:()=>nVt,inflateSync:()=>fVt,inherits:()=>OVt,inspect:()=>Kj,isAbsolute:()=>aGt,isBuiltin:()=>CVt,isDeepStrictEqual:()=>UVt,isIP:()=>cqt,isIPv4:()=>aqt,isIPv6:()=>iqt,isMainThread:()=>ZVt,join:()=>tGt,lookup:()=>zVt,mkdir:()=>BGt,mkdirSync:()=>AGt,monitorEventLoopDelay:()=>qVt,normalize:()=>uGt,ok:()=>SVt,open:()=>WGt,openSync:()=>CGt,parentPort:()=>QVt,parse:()=>kVt,pathToFileURL:()=>MVt,performance:()=>GVt,pipeline:()=>yGt,platform:()=>eVt,posix:()=>lGt,promises:()=>Yjt,promisify:()=>NVt,randomBytes:()=>Pm,randomUUID:()=>We,readFile:()=>UGt,readFileSync:()=>vGt,readdir:()=>jGt,readdirSync:()=>PGt,realpath:()=>KGt,realpathSync:()=>EGt,relative:()=>iGt,release:()=>lVt,rename:()=>qGt,renameSync:()=>OGt,request:()=>uVt,resolve:()=>rGt,rm:()=>HGt,rmSync:()=>DGt,rmdirSync:()=>NGt,sep:()=>cGt,serialize:()=>JVt,setInterval:()=>fqt,setTimeout:()=>pqt,spawn:()=>JGt,stat:()=>zGt,statSync:()=>IGt,strict:()=>wVt,tmpdir:()=>rVt,toUSVString:()=>$Vt,totalmem:()=>iVt,type:()=>aVt,types:()=>BVt,unlink:()=>GGt,unlinkSync:()=>MGt,webcrypto:()=>Xjt,workerData:()=>eqt,writeFile:()=>$Gt,writeFileSync:()=>TGt});var Cs,Bo,Jjt,Yjt,Xa,Lre,Pm,We,Xjt,Zjt,Qjt,eGt,tGt,rGt,nGt,oGt,sGt,iGt,aGt,cGt,lGt,uGt,dGt,pGt,SDe,wDe,mGt,fGt,gGt,hGt,yGt,xGt,bGt,vGt,TGt,SGt,wGt,EGt,_Gt,CGt,kGt,RGt,AGt,IGt,PGt,MGt,OGt,NGt,DGt,LGt,FGt,UGt,$Gt,BGt,zGt,jGt,GGt,VGt,qGt,HGt,WGt,KGt,JGt,YGt,XGt,ZGt,QGt,eVt,tVt,rVt,nVt,oVt,sVt,iVt,aVt,cVt,lVt,uVt,dVt,pVt,mVt,fVt,gVt,hVt,yVt,xVt,bVt,vVt,TVt,SVt,wVt,EVt,_Vt,CVt,kVt,RVt,AVt,IVt,PVt,MVt,OVt,NVt,EDe,DVt,Kj,LVt,FVt,UVt,$Vt,BVt,_De,Wj,zVt,jVt,GVt,VVt,qVt,HVt,WVt,KVt,JVt,YVt,XVt,ZVt,QVt,eqt,tqt,rqt,nqt,oqt,sqt,iqt,aqt,cqt,lqt,uqt,dqt,CDe,pqt,mqt,fqt,gqt,hqt,yr=C(()=>{Cs=()=>{},Bo=async()=>{},Jjt={},Yjt={readFile:Bo,writeFile:Bo,mkdir:Bo,stat:Bo,readdir:Bo,unlink:Bo,access:Bo,rm:Bo,rename:Bo},Xa=r=>{let e=[];return{update(t){return e.push(typeof t=="string"?new Wj().encode(t):t),this},digest(t){let n=0;for(let s of e)for(let i=0;i<s.length;i++)n=(n<<5)-n+s[i]|0;let o=(n>>>0).toString(16).padStart(8,"0");return t==="hex"?o:t==="base64"?btoa(o):o}}},Lre=(r,e)=>Xa(r),Pm=r=>new Uint8Array(r||32),We=()=>globalThis.crypto?.randomUUID?.()||Math.random().toString(36),Xjt=globalThis.crypto,Zjt=()=>{throw new Error("[NeuroLink:browser] fs.appendFileSync is not supported in browser runtime \u2014 use server-side execution")},Qjt=()=>{throw new Error("[NeuroLink:browser] fs.cpSync is not supported in browser runtime \u2014 use server-side execution")},eGt=()=>({listen:Cs,close:Cs,on:Cs}),tGt=(...r)=>r.join("/"),rGt=(...r)=>r.join("/"),nGt=r=>r||"",oGt=r=>r?.split?.("/")?.pop?.()||"",sGt=r=>{let e=r?.match?.(/\.[^.]+$/);return e?e[0]:""},iGt=(r,e)=>e||"",aGt=()=>!1,cGt="/",lGt={normalize:r=>r,join:(...r)=>r.join("/"),resolve:(...r)=>r.join("/"),sep:"/"},uGt=r=>r,dGt=class{on(){return this}off(){return this}emit(){return this}once(){return this}removeListener(){return this}addListener(){return this}},pGt=class{getStore(){}run(r,e,...t){return e(...t)}enterWith(){}disable(){}},SDe=class{pipe(){return this}on(){return this}read(){return null}push(){}destroy(){}},wDe=class{write(){return!0}end(){}on(){return this}destroy(){}},mGt=class{push(){}on(){return this}},fGt=class{on(){return this}},gGt=class{pipe(){return this}on(){return this}},hGt=globalThis.ReadableStream||class{},yGt=Cs,xGt=Cs,bGt=()=>!1,vGt=()=>"",TGt=Cs,SGt=Cs,wGt=Bo,EGt=r=>r,_Gt=Cs,CGt=()=>0,kGt=Cs,RGt=()=>({}),AGt=Cs,IGt=()=>({}),PGt=()=>[],MGt=Cs,OGt=Cs,NGt=Cs,DGt=Cs,LGt=()=>new wDe,FGt=()=>new SDe,UGt=Bo,$Gt=Bo,BGt=Bo,zGt=Bo,jGt=Bo,GGt=Bo,VGt=Bo,qGt=Bo,HGt=Bo,WGt=async()=>({stat:Bo,readFile:Bo,close:Bo,read:Bo,write:Bo}),KGt=async r=>r,JGt=()=>({on:Cs,stdout:{on:Cs},stderr:{on:Cs},kill:Cs}),YGt=(r,e)=>e?.(null,"",""),XGt=()=>"",ZGt=(r,e,t)=>{typeof e=="function"?e(null,"",""):t?.(null,"","")},QGt=()=>"",eVt="browser",tVt=()=>"/",rVt=()=>"/tmp",nVt=()=>"browser",oVt=()=>[{}],sVt=()=>0,iVt=()=>0,aVt=()=>"Browser",cVt=()=>"wasm",lVt=()=>"0",uVt=()=>({}),dVt=()=>({}),pVt=()=>({}),mVt=()=>({}),fVt=()=>new Uint8Array,gVt=()=>new Uint8Array,hVt=()=>new Uint8Array,yVt=()=>new Uint8Array,xVt=(r,e)=>e?.(null,r),bVt=(r,e)=>e?.(null,r),vVt=()=>({}),TVt=()=>({}),SVt=Cs,wVt={},EVt=()=>()=>({}),_Vt=[],CVt=()=>!1,kVt=r=>({pathname:r||"",hostname:"",protocol:"",search:"",hash:""}),RVt=()=>"",AVt=globalThis.URL,IVt=globalThis.URLSearchParams,PVt=r=>typeof r=="string"?r.replace("file://",""):r,MVt=r=>new globalThis.URL("file://"+r),OVt=(r,e)=>{e&&(r.super_=e,Object.setPrototypeOf(r.prototype,e.prototype))},NVt=r=>(...e)=>new Promise((t,n)=>r(...e,(o,s)=>o?n(o):t(s))),EDe=r=>{let e=(...t)=>{};return e.enabled=!1,e},DVt=EDe,Kj=r=>{try{return JSON.stringify(r,null,2)}catch{return String(r)}};Kj.custom=Symbol.for("nodejs.util.inspect.custom");Kj.colors={};Kj.styles={};LVt=r=>r,FVt=r=>(...e)=>{let t=e.pop();r(...e).then(n=>t(null,n)).catch(t)},UVt=(r,e)=>JSON.stringify(r)===JSON.stringify(e),$Vt=r=>String(r),BVt={isPromise:r=>r instanceof Promise,isDate:r=>r instanceof Date,isRegExp:r=>r instanceof RegExp,isNativeError:r=>r instanceof Error,isArrayBuffer:r=>r instanceof ArrayBuffer,isTypedArray:r=>ArrayBuffer.isView(r),isUint8Array:r=>r instanceof Uint8Array,isProxy:()=>!1},_De=globalThis.TextDecoder,Wj=globalThis.TextEncoder,zVt=(r,e)=>e?.(null,"127.0.0.1",4),jVt=class{},GVt=globalThis.performance||{now:()=>Date.now()},VVt=class{observe(){}disconnect(){}},qVt=()=>({enable:Cs,disable:Cs,percentile:()=>0}),HVt=()=>({}),WVt=class{},KVt=()=>!1,JVt=()=>new Uint8Array,YVt=Cs,XVt=class{},ZVt=!0,QVt=null,eqt=null,tqt=()=>({}),rqt=class{},nqt=class{},oqt=globalThis.Buffer||class extends Uint8Array{static from(e,t){if(typeof e=="string"){let n=(t||"utf8").toLowerCase();if(n==="base64"){let o=atob(e),s=new Uint8Array(o.length);for(let i=0;i<o.length;i++)s[i]=o.charCodeAt(i);return s}if(n==="hex"){let o=new Uint8Array(e.length/2);for(let s=0;s<e.length;s+=2)o[s/2]=parseInt(e.substr(s,2),16);return o}return new Wj().encode(e)}return new Uint8Array(e)}static alloc(e){return new Uint8Array(e)}static isBuffer(e){return e instanceof Uint8Array}static concat(e){let t=e.reduce((s,i)=>s+i.length,0),n=new Uint8Array(t),o=0;for(let s of e)n.set(s,o),o+=s.length;return n}static byteLength(e,t){return t==="base64"?Math.ceil(e.length*3/4):new Wj().encode(e).length}toString(e){let t=(e||"utf8").toLowerCase();if(t==="hex")return Array.from(new Uint8Array(this.buffer,this.byteOffset,this.byteLength)).map(n=>n.toString(16).padStart(2,"0")).join("");if(t==="base64"){let n="";for(let o=0;o<this.length;o++)n+=String.fromCharCode(this[o]);return btoa(n)}return new _De().decode(this)}},sqt={F_OK:0,R_OK:4,W_OK:2,X_OK:1},iqt=()=>!1,aqt=()=>!1,cqt=()=>0,lqt=class{},uqt=class{},dqt=async()=>new ArrayBuffer(0),CDe=r=>({[Symbol.toPrimitive](){return r},ref(){return this},unref(){return this},hasRef(){return!1},refresh(){return this},close(){}}),pqt=(...r)=>CDe(globalThis.setTimeout(...r)),mqt=globalThis.clearTimeout,fqt=(...r)=>CDe(globalThis.setInterval(...r)),gqt=globalThis.clearInterval,hqt=class{constructor(r){this.type=r}toString(){return this.type}}});function ss(r,e=500){return r&&r.slice(0,e).replace(bqt,"***")}function Mm(r){if(typeof r=="string")return r;try{return JSON.stringify(r)??String(r)}catch{return"[content too large to serialize]"}}function c_(r,e=1e4){try{let t=JSON.stringify(r);return t===void 0?String(r):t.length>e?`${t.slice(0,e)}\u2026[truncated ${t.length-e} chars]`:t}catch(t){return`[unserializable: ${t instanceof Error?t.message:String(t)}]`}}function lr(r){return r.replace(/\/\/[^/\s"'<>]*@/g,"//***@").replace(/\/\/(?:(?!\/\/)[^\s"'<>])*@/g,"//***@")}function Za(r){let e=t=>t.length>200?`${t.slice(0,200)}\u2026`:t;try{let t=new URL(r);return e(`${t.protocol}//${t.host}${t.pathname}`)}catch{let t=r.split(/[?#]/)[0];return e(lr(t))}}function wqt(r){Sqt.forEach(e=>r.searchParams.delete(e))}function Eqt(r){let e=[],t=[];for(let[o,s]of r.searchParams.entries())Tqt.includes(o.toLowerCase())&&(e.push(`${o.toLowerCase()}=${s}`),t.push(o));return e.length===0?"":(t.forEach(o=>r.searchParams.delete(o)),e.sort(),`\0auth=${Xa("sha256").update(e.join("&")).digest("hex").slice(0,16)}`)}function Jj(r){try{let e=new URL(r);wqt(e);let t=Eqt(e);return e.toString()+t}catch{return r}}function Fre(r){return r.replace(/[a-zA-Z][a-zA-Z0-9+.-]*:\/\/[^\s"'<>)]+/g,e=>Za(e))}function Ure(r,e){let t=qs(e);return r.split(dd(e)).join(t).split(e).join(t)}function My(r,e){let t=s=>{let i=Fre(s);return e?.filePath?Ure(i,e.filePath):i};if(!(r instanceof Error))return new Error(t(String(r)));let n=new Error(t(r.message));n.name=r.name;let o=r.code;return o!==void 0&&(n.code=o),n}function l_(r,e=1e3){let t=new WeakSet,n=o=>{if(o==null)return o;if(typeof o=="string")return ss(o,e);if(typeof o!="object")return o;if(t.has(o))return"[Circular]";if(t.add(o),Array.isArray(o))return o.map(n);let s={};for(let[i,a]of Object.entries(o))vqt.some(c=>c.toLowerCase()===i.toLowerCase())?s[i]="***":s[i]=n(a);return s};return n(r)}var yqt,xqt,bqt,vqt,Tqt,Sqt,mn=C(()=>{"use strict";yr();dn();yqt=["sk","pk","r8","gsk","xai","tgp","fw","pplx","pa","jina","fish"],xqt=yqt.join("|"),bqt=new RegExp(`\\bBearer\\s+[A-Za-z0-9_\\-\\.]{8,}\\b|\\bToken\\s+[A-Za-z0-9_\\-\\.]{8,}\\b|\\bBasic\\s+[A-Za-z0-9+/=]{12,}\\b|\\b(?:${xqt})[_\\-][A-Za-z0-9_\\-\\.]{8,}\\b|\\b(?:api[_-]?key|access[_-]?token|secret[_-]?key|refresh[_-]?token)\\s*[:=]\\s*['"]?[^\\s,;'"&]+`,"gi"),vqt=["apikey","api_key","apiKey","access_token","accessToken","refresh_token","refreshToken","secret","secretkey","secret_key","secretKey","password","authorization","oauth","oauthToken","credentials","authContext","authToken","sessionToken","serviceAccountKey","secretAccessKey","userEmail"];Tqt=["token","signature","x-amz-signature","x-amz-credential","x-amz-security-token","awsaccesskeyid","expires","sig","se","sp","sr","sv","x-goog-signature","x-goog-credential","x-goog-algorithm","x-goog-date","x-goog-expires","x-goog-signedheaders"],Sqt=["utm_source","utm_medium","utm_campaign","utm_term","utm_content","fbclid","gclid","_ga"]});var _qt,$re,Yj,Bre=C(()=>{"use strict";H();kt();_qt={maxTokens:10,refillIntervalMs:1e3,tokensPerRefill:10,maxQueueSize:100,queueTimeoutMs:3e4},$re=class{tokens;config;queue=[];refillTimer=null;lastRefillTime;constructor(e={}){this.config={..._qt,...e},this.tokens=this.config.maxTokens,this.lastRefillTime=Date.now(),this.startRefillTimer()}startRefillTimer(){this.refillTimer||(this.refillTimer=setInterval(()=>{this.refillTokens(),this.processQueue()},this.config.refillIntervalMs),this.refillTimer.unref())}refillTokens(){let e=Date.now(),t=e-this.lastRefillTime,n=Math.floor(t/this.config.refillIntervalMs);if(n>0){let o=n*this.config.tokensPerRefill;this.tokens=Math.min(this.config.maxTokens,this.tokens+o),this.lastRefillTime=e}}processQueue(){let e=Date.now();for(;this.queue.length>0;){let t=this.queue[0];if(e-t.timestamp>this.config.queueTimeoutMs)this.queue.shift(),t.timeoutTimer&&clearTimeout(t.timeoutTimer),t.reject(de.rateLimiterQueueTimeout(this.config.queueTimeoutMs));else break}for(;this.tokens>0&&this.queue.length>0;){let t=this.queue.shift();t&&(t.timeoutTimer&&clearTimeout(t.timeoutTimer),this.tokens--,t.resolve())}}async acquire(){if(this.refillTokens(),this.tokens>0){this.tokens--;return}if(this.queue.length>=this.config.maxQueueSize)throw g.warn(`Rate limiter queue full (${this.config.maxQueueSize} requests pending)`),de.rateLimiterQueueFull(this.config.maxQueueSize);return new Promise((e,t)=>{let n=setTimeout(()=>{let o=this.queue.findIndex(s=>s.timeoutTimer===n);o!==-1&&(this.queue.splice(o,1),t(de.rateLimiterQueueTimeout(this.config.queueTimeoutMs)))},this.config.queueTimeoutMs);this.queue.push({resolve:e,reject:t,timestamp:Date.now(),timeoutTimer:n})})}getStats(){return{availableTokens:this.tokens,queueLength:this.queue.length,maxTokens:this.config.maxTokens,maxQueueSize:this.config.maxQueueSize}}reset(){for(this.tokens=this.config.maxTokens,this.lastRefillTime=Date.now();this.queue.length>0;){let e=this.queue.shift();e&&(e.timeoutTimer&&clearTimeout(e.timeoutTimer),e.reject(de.rateLimiterReset()))}}stop(){this.refillTimer&&(clearInterval(this.refillTimer),this.refillTimer=null),this.reset()}},Yj=new $re({maxTokens:10,refillIntervalMs:1e3,tokensPerRefill:10,maxQueueSize:100,queueTimeoutMs:3e4})});function Hre(r,e=Ta.DEFAULT_INITIAL_DELAY,t=Ta.DEFAULT_BACKOFF_MULTIPLIER,n=Ta.DEFAULT_MAX_DELAY,o=!0){let s=e*Math.pow(t,r-1),i=Math.min(s,n),a=o?Math.random()*Math.min(i*.1,1e3):0;return i+a}function Wre(r){return new Promise(e=>setTimeout(e,r))}async function kDe(r,e={}){let t={...Cqt,...e},n;for(let o=1;o<=t.maxAttempts;o++)try{return await r()}catch(s){if(n=s,o===t.maxAttempts||!t.retryCondition(s))break;t.onRetry(o,s);let i=Hre(o,t.initialDelay,t.backoffMultiplier,t.maxDelay,!0);await Wre(i)}throw n}var zre,jre,Cqt,Gre,Vre,qre,LPn,FPn,UPn,Kre=C(()=>{"use strict";H();ki();zre=class extends Error{constructor(t,n){super(t);this.cause=n;this.name="NetworkError"}cause},jre=class extends Error{constructor(t,n){super(t);this.cause=n;this.name="TemporaryError"}cause},Cqt={maxAttempts:Ta.DEFAULT_RETRY_ATTEMPTS,initialDelay:Ta.DEFAULT_INITIAL_DELAY,maxDelay:Ta.DEFAULT_MAX_DELAY,backoffMultiplier:Ta.DEFAULT_BACKOFF_MULTIPLIER,retryCondition:r=>{if(r instanceof zre||r instanceof jre||r&&typeof r=="object"&&(r.name==="TimeoutError"||r.code==="TIMEOUT")||r&&typeof r=="object"&&(r.code==="ECONNRESET"||r.code==="ENOTFOUND"||r.code==="ECONNREFUSED"||r.code==="ETIMEDOUT"))return!0;if(r&&typeof r=="object"&&r.status){let e=Number(r.status);return e>=500||e===429||e===408}return!1},onRetry:(r,e)=>{let t=e instanceof Error?e.message:String(e);g.warn(`\u26A0\uFE0F Retry attempt ${r}: ${t}`)}};Gre=class{constructor(e=5,t=6e4,n=6e5){this.threshold=e;this.timeout=t;this.monitorWindow=n}threshold;timeout;monitorWindow;failures=0;lastFailureTime=0;state="closed";async execute(e){if(this.state==="open")if(Date.now()-this.lastFailureTime>this.timeout)this.state="half-open";else throw new Error("Circuit breaker is open - operation rejected");try{let t=await e();return this.onSuccess(),t}catch(t){throw this.onFailure(),t}}onSuccess(){this.failures=0,this.state="closed"}onFailure(){this.failures++,this.lastFailureTime=Date.now(),this.failures>=this.threshold&&(this.state="open")}getState(){return this.state}reset(){this.failures=0,this.lastFailureTime=0,this.state="closed"}},Vre=class{constructor(e,t){this.maxRequests=e;this.windowMs=t}maxRequests;windowMs;requests=[];async acquire(){let e=Date.now();if(this.requests=this.requests.filter(t=>e-t<this.windowMs),this.requests.length>=this.maxRequests){let t=Math.min(...this.requests),n=this.windowMs-(e-t);if(n>0)return await Wre(n),this.acquire()}this.requests.push(e)}},qre=class{operations=new Set;shutdownPromise=null;track(e){return this.operations.add(e),e.finally(()=>{this.operations.delete(e)}),e}async shutdown(e=3e4){return this.shutdownPromise?this.shutdownPromise:(this.shutdownPromise=this.performShutdown(e),this.shutdownPromise)}async performShutdown(e){g.debug(`\u{1F504} Graceful shutdown: waiting for ${this.operations.size} operations...`);try{await Promise.race([Promise.all(this.operations),Wre(e).then(()=>{throw new Error(`Shutdown timeout: ${this.operations.size} operations still running`)})]),g.debug("\u2705 Graceful shutdown completed")}catch(t){g.warn(`\u26A0\uFE0F Shutdown warning: ${t instanceof Error?t.message:String(t)}`)}}},LPn=new qre,FPn=new Gre(3,3e4),UPn=new Vre(100,6e4)});var Jc,ig,Oy,Xj,RDe,Ai,Jre=C(()=>{"use strict";Jc={IMAGE_MAX_MB:10,PDF_MAX_MB:100,DOCUMENT_MAX_MB:100,WORD_MAX_MB:100,TEXT_MAX_MB:50,CSV_MAX_MB:50,EXCEL_MAX_MB:100,SOURCE_CODE_MAX_MB:20,JSON_MAX_MB:20,YAML_MAX_MB:20,XML_MAX_MB:20,VIDEO_MAX_MB:500,AUDIO_MAX_MB:500,ARCHIVE_MAX_MB:200,GENERAL_MAX_MB:200},ig={IMAGE_MAX:10*1024*1024,PDF_MAX:100*1024*1024,DOCUMENT_MAX:100*1024*1024,WORD_MAX:100*1024*1024,TEXT_MAX:50*1024*1024,CSV_MAX:50*1024*1024,EXCEL_MAX:100*1024*1024,SOURCE_CODE_MAX:20*1024*1024,JSON_MAX:20*1024*1024,YAML_MAX:20*1024*1024,XML_MAX:20*1024*1024,VIDEO_MAX:500*1024*1024,AUDIO_MAX:500*1024*1024,ARCHIVE_MAX:200*1024*1024,GENERAL_MAX:200*1024*1024},Oy={MAX_SOURCE_CODE_LINES:1e4,MAX_TEXT_LINES:1e4,MAX_TEXT_LENGTH:1e6,MAX_CSV_ROWS:1e4,MAX_EXCEL_ROWS:5e3,MAX_EXCEL_SHEETS:10,MAX_PDF_PAGES:100,MAX_OBJECT_DEPTH:50,MAX_ARRAY_LENGTH:1e4},Xj={MAX_DECOMPRESSED_SIZE:100*1024*1024,MAX_COMPRESSION_RATIO:100,MAX_ENTRIES:1e3,MAX_NESTING_DEPTH:5},RDe={MAX_ALIAS_COUNT:100,MAX_DOCUMENTS:10,MAX_ANCHORS:100},Ai={IMAGE_MAX_MB:Jc.IMAGE_MAX_MB,PDF_MAX_MB:Jc.PDF_MAX_MB,DOCUMENT_MAX_MB:Jc.DOCUMENT_MAX_MB,WORD_MAX_MB:Jc.WORD_MAX_MB,TEXT_MAX_MB:Jc.TEXT_MAX_MB,CSV_MAX_MB:Jc.CSV_MAX_MB,EXCEL_MAX_MB:Jc.EXCEL_MAX_MB,SOURCE_CODE_MAX_MB:Jc.SOURCE_CODE_MAX_MB,MAX_FILE_SIZE:ig.GENERAL_MAX,MAX_IMAGE_SIZE:ig.IMAGE_MAX,MAX_TEXT_SIZE:ig.TEXT_MAX,MAX_SOURCE_CODE_LINES:Oy.MAX_SOURCE_CODE_LINES,MAX_TEXT_LINES:Oy.MAX_TEXT_LINES,MAX_TEXT_LENGTH:Oy.MAX_TEXT_LENGTH,MAX_CSV_ROWS:Oy.MAX_CSV_ROWS,EXCEL_MAX_ROWS:Oy.MAX_EXCEL_ROWS,EXCEL_MAX_SHEETS:Oy.MAX_EXCEL_SHEETS,MAX_PDF_PAGES:Oy.MAX_PDF_PAGES,MAX_DECOMPRESSED_SIZE:Xj.MAX_DECOMPRESSED_SIZE,MAX_COMPRESSION_RATIO:Xj.MAX_COMPRESSION_RATIO,MAX_ZIP_ENTRIES:Xj.MAX_ENTRIES,YAML_MAX_ALIAS_COUNT:RDe.MAX_ALIAS_COUNT}});function Zj(r){return Yre||(Yre=new Xre(r)),Yre}var Xre,Yre,Zre=C(()=>{"use strict";yr();H();mn();Xre=class{cache=new Map;contentHashIndex=new Map;maxSize;ttlMs;maxImageSize;enabled;stats={hits:0,misses:0,evictions:0,expirations:0,totalRequests:0};constructor(e={}){let t=process.env.NEUROLINK_IMAGE_CACHE_ENABLED,n=process.env.NEUROLINK_IMAGE_CACHE_SIZE,o=process.env.NEUROLINK_IMAGE_CACHE_TTL_MS,s=process.env.NEUROLINK_IMAGE_MAX_SIZE;this.enabled=t!==void 0?t.toLowerCase()==="true":!1,this.maxSize=this.parseConfigValue(n,e.maxSize,100,1,1e3),this.ttlMs=this.parseConfigValue(o,e.ttlMs,1800*1e3,1e3,1440*60*1e3),this.maxImageSize=this.parseConfigValue(s,e.maxImageSize,10*1024*1024,1024,100*1024*1024),g.debug("ImageCache initialized",{enabled:this.enabled,maxSize:this.maxSize,ttlMs:this.ttlMs,maxImageSize:this.maxImageSize})}parseConfigValue(e,t,n,o,s){let i;if(e!==void 0){let a=parseInt(e,10);i=isNaN(a)?n:a}else t!==void 0?i=t:i=n;return i<o?(g.warn(`Cache config value ${i} below minimum ${o}, using min`),o):i>s?(g.warn(`Cache config value ${i} above maximum ${s}, using max`),s):i}normalizeUrl(e){return Jj(e)}generateContentHash(e){let t=typeof e=="string"?Buffer.from(e,"base64"):e;return Xa("sha256").update(t).digest("hex").substring(0,16)}isExpired(e){return Date.now()-e.createdAt>this.ttlMs}isEnabled(){return this.enabled}get(e){if(!this.enabled)return null;this.stats.totalRequests++;let t=this.normalizeUrl(e),n=this.cache.get(t);return n?this.isExpired(n)?(this.stats.expirations++,this.delete(t),g.debug("Image cache entry expired",{url:Za(t)}),null):(n.lastAccessedAt=Date.now(),n.accessCount++,this.cache.delete(t),this.cache.set(t,n),this.stats.hits++,g.debug("Image cache hit",{url:Za(t),accessCount:n.accessCount}),n):(this.stats.misses++,g.debug("Image cache miss",{url:Za(t)}),null)}getByContentHash(e){let t=this.contentHashIndex.get(e);if(!t)return null;let n=null;for(let o of[...t]){let s=this.cache.get(o);if(!s){t.delete(o);continue}if(this.isExpired(s)){this.cache.delete(o),t.delete(o);continue}n===null&&(n=o)}return t.size===0&&this.contentHashIndex.delete(e),n?this.get(n):null}set(e,t,n,o){if(!this.enabled){g.debug("Image caching disabled, skipping cache storage");return}let s=this.normalizeUrl(e),i=o.length;if(i>this.maxImageSize){g.debug("Image too large to cache",{url:Za(s),size:i,maxSize:this.maxImageSize});return}let a=this.generateContentHash(o),c=this.contentHashIndex.get(a);if(c)for(let p of c){if(p===s)continue;let f=this.cache.get(p);if(f&&!this.isExpired(f)){for(;this.cache.size>=this.maxSize&&this.cache.size>0;)this.evictOldest();this.cache.set(s,{...f});let h=this.contentHashIndex.get(a);h||(h=new Set,this.contentHashIndex.set(a,h)),h.add(s),g.debug("Image cache dedup hit",{newUrl:Za(s),existingUrl:Za(p)});return}}for(;this.cache.size>=this.maxSize;)this.evictOldest();let l=Date.now(),u={dataUri:t,contentType:n,size:i,contentHash:a,createdAt:l,lastAccessedAt:l,accessCount:1};this.cache.set(s,u);let d=this.contentHashIndex.get(a);d||(d=new Set,this.contentHashIndex.set(a,d)),d.add(s),g.debug("Image cached",{url:Za(s),size:i,contentHash:a.substring(0,8),cacheSize:this.cache.size})}delete(e){let t=this.normalizeUrl(e),n=this.cache.get(t);if(n){let o=this.contentHashIndex.get(n.contentHash);return o&&(o.delete(t),o.size===0&&this.contentHashIndex.delete(n.contentHash)),this.cache.delete(t),!0}return!1}evictOldest(){let e=this.cache.keys().next().value;if(e!==void 0){let t=this.cache.get(e);if(t){let n=this.contentHashIndex.get(t.contentHash);n&&(n.delete(e),n.size===0&&this.contentHashIndex.delete(t.contentHash))}this.cache.delete(e),this.stats.evictions++,g.debug("Image cache eviction",{url:Za(String(e))})}}evictExpired(){let e=0,t=Date.now();for(let[n,o]of this.cache.entries())t-o.createdAt>this.ttlMs&&(this.delete(n),e++,this.stats.expirations++);return e>0&&g.debug(`Evicted ${e} expired image cache entries`),e}clear(){let e=this.cache.size;this.cache.clear(),this.contentHashIndex.clear(),g.debug(`Image cache cleared (${e} entries removed)`)}getStats(){let e=0;for(let n of this.cache.values())e+=n.size;let t=this.stats.totalRequests>0?Number((this.stats.hits/this.stats.totalRequests*100).toFixed(2)):0;return{...this.stats,size:this.cache.size,totalBytes:e,hitRate:t}}has(e){let t=this.normalizeUrl(e),n=this.cache.get(t);return n!=null&&!this.isExpired(n)}getSize(){return this.cache.size}getConfig(){return{enabled:this.enabled,maxSize:this.maxSize,ttlMs:this.ttlMs,maxImageSize:this.maxImageSize}}},Yre=null});function Aqt(r){if(r&&typeof r=="object"){let e=r.code,t=r.name;if(Rqt.has(e||"")||t==="AbortError")return!0}if(r instanceof Error){let e=r.message,t=e.match(/HTTP (\d{3}):/);if(t){let n=parseInt(t[1],10);return n>=500||n===429||n===408}if(/\b(request timed out|operation timed out|connection timed out|timed out)\b/i.test(e)||/\bnetwork (error|failure|unreachable|down)\b/i.test(e))return!0}return!1}function Qre(r){if(r==="application/octet-stream")throw g.error("Unable to detect a supported image format from file content"),new Error("Unsupported or corrupted image: no known image signature (PNG/JPEG/GIF/WebP/BMP/TIFF/SVG/AVIF) was found in the file content.")}var ADe,kqt,Rqt,Pu,Iqt,Pqt,mM,Qj=C(()=>{"use strict";dn();H();mn();Bre();Kre();ki();Jre();Zre();kt();ADe=12,kqt={"image/png":67,"image/jpeg":125,"image/gif":43,"image/webp":20,"image/avif":100},Rqt=new Set(["ECONNRESET","ENOTFOUND","ECONNREFUSED","ETIMEDOUT","ERR_NETWORK"]);Pu=class r{static async process(e,t){let n=this.validateBufferNotEmpty(e);Qre(n);let o=r.safeBase64Convert(e,"image processing"),s=`data:${n};base64,${o}`;return this.validateProcessOutput(s,o,n),{type:"image",content:s,mimeType:n,metadata:{confidence:100,size:e.length}}}static hasStrictImageMagic(e,t){let n=e;switch(t){case"image/png":return n.length>=4&&n[0]===137&&n[1]===80&&n[2]===78&&n[3]===71;case"image/jpeg":return n.length>=3&&n[0]===255&&n[1]===216&&n[2]===255;case"image/gif":return n.length>=3&&n[0]===71&&n[1]===73&&n[2]===70;case"image/webp":return n.length>=12&&n.subarray(0,4).toString("latin1")==="RIFF"&&n.subarray(8,12).toString("latin1")==="WEBP";case"image/avif":return n.length>=12&&n.subarray(4,8).toString("latin1")==="ftyp"&&n.subarray(8,12).toString("latin1").startsWith("avif");default:return!1}}static validateBufferNotEmpty(e){if(e.length===0)throw g.error("Empty buffer provided"),de.imageBufferInvalid("Invalid image processing: buffer is empty");let t=this.detectImageType(e);if(t==="image/svg+xml")return t;if(e.length<ADe)throw de.imageBufferInvalid(`Invalid image processing: buffer too small (${e.length} bytes) \u2014 a minimum of ${ADe} bytes is required for a valid image.`);let n=kqt[t];if(n!==void 0&&e.length<n&&this.hasStrictImageMagic(e,t))throw de.imageBufferInvalid(`Invalid image processing: ${t} buffer is truncated (${e.length} bytes, minimum ${n} for a valid ${t}).`);return t}static validateProcessOutput(e,t,n){if(t.length===0)throw g.error("Empty base64 content generated"),new Error("Invalid image processing: base64 content is empty");if(!/^data:[^;]+;base64,[A-Za-z0-9+/]*={0,2}$/.test(e))throw g.error("Invalid data URI format generated",{dataUri:e}),new Error("Invalid data URI format: must be data:{mimeType};base64,{content}");if(!this.validateImageFormat(n))throw g.error("Invalid MIME type generated",{mediaType:n}),new Error(`Invalid MIME type: ${n} is not in allowed list`)}static processImageForOpenAI(e){try{return typeof e=="string"?e.startsWith("http")||e.startsWith("data:")?e:`data:image/jpeg;base64,${e}`:`data:image/jpeg;base64,${r.safeBase64Convert(e,"OpenAI image input")}`}catch(t){throw t instanceof Oe?t:(g.error("Failed to process image for OpenAI:",t),new Error(`Image processing failed for OpenAI: ${t instanceof Error?t.message:"Unknown error"}`,{cause:t}))}}static processImageForGoogle(e){try{let t,n="image/jpeg";if(typeof e=="string")if(e.startsWith("data:")){let o=e.match(/^data:([^;]+);base64,(.+)$/);o?(n=o[1],t=o[2]):t=e.split(",")[1]||e}else t=e;else t=r.safeBase64Convert(e,"provider image input");return{mimeType:n,data:t}}catch(t){throw t instanceof Oe?t:(g.error("Failed to process image for Google AI:",t),new Error(`Image processing failed for Google AI: ${t instanceof Error?t.message:"Unknown error"}`,{cause:t}))}}static processImageForAnthropic(e){try{let t,n="image/jpeg";if(typeof e=="string")if(e.startsWith("data:")){let o=e.match(/^data:([^;]+);base64,(.+)$/);o?(n=o[1],t=o[2]):t=e.split(",")[1]||e}else t=e;else t=r.safeBase64Convert(e,"provider image input");return{mediaType:n,data:t}}catch(t){throw t instanceof Oe?t:(g.error("Failed to process image for Anthropic:",t),new Error(`Image processing failed for Anthropic: ${t instanceof Error?t.message:"Unknown error"}`,{cause:t}))}}static processImageForVertex(e,t){try{return t.includes("gemini")?r.processImageForGoogle(e):t.includes("claude")?r.processImageForAnthropic(e):r.processImageForGoogle(e)}catch(n){throw n instanceof Oe?n:(g.error("Failed to process image for Vertex AI:",n),new Error(`Image processing failed for Vertex AI: ${n instanceof Error?n.message:"Unknown error"}`,{cause:n}))}}static detectImageType(e){try{if(typeof e=="string"){if(e.startsWith("data:")){let o=e.match(/^data:([^;]+);/);return o?o[1]:"image/jpeg"}let t=e.toLowerCase().split(".").pop();return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",gif:"image/gif",webp:"image/webp",bmp:"image/bmp",tiff:"image/tiff",tif:"image/tiff",svg:"image/svg+xml",avif:"image/avif"}[t||""]||"image/jpeg"}if(e.length>=4){let t=e.subarray(0,4);if(t[0]===137&&t[1]===80&&t[2]===78&&t[3]===71)return"image/png";if(t[0]===255&&t[1]===216&&t[2]===255)return"image/jpeg";if(t[0]===71&&t[1]===73&&t[2]===70&&t[3]===56)return"image/gif";if(e.length>=12){let n=e.subarray(0,4),o=e.subarray(8,12);if(n.toString()==="RIFF"&&o.toString()==="WEBP")return"image/webp"}if(e.length>=4){let n=e.subarray(0,4).toString();if(n==="<svg"||n==="<?xm")return"image/svg+xml"}if(e.length>=12){let n=e[4]===102&&e[5]===116&&e[6]===121&&e[7]===112,o=String.fromCharCode(e[8],e[9],e[10],e[11]);if(n&&(o==="avif"||o==="avis"||o==="avio"))return"image/avif"}if(e[0]===66&&e[1]===77)return"image/bmp";if(e[0]===73&&e[1]===73&&e[2]===42&&e[3]===0||e[0]===77&&e[1]===77&&e[2]===0&&e[3]===42)return"image/tiff"}return g.warn("Could not detect image type from magic bytes; using application/octet-stream"),"application/octet-stream"}catch(t){return g.warn("Failed to detect image type, using default:",t),"application/octet-stream"}}static validateSize(e,t,n=ig.IMAGE_MAX){if(!Number.isFinite(n)||n<0)throw de.invalidConfiguration("maxSize","must be a finite, non-negative byte count",{maxSize:n,context:t});if(!Number.isFinite(e)||e<0)throw de.invalidImageSize(e);if(e>n){let o=(e/1048576).toFixed(1),s=(n/(1024*1024)).toFixed(0);throw de.imageTooLarge(o,s)}}static validateBufferSize(e,t,n=ig.IMAGE_MAX){r.validateSize(e.length,t,n)}static safeBase64Convert(e,t,n=ig.IMAGE_MAX){return r.validateBufferSize(e,t,n),e.toString("base64")}static validateImageFormat(e){return["image/jpeg","image/png","image/gif","image/webp","image/bmp","image/tiff","image/svg+xml","image/avif"].includes(e.toLowerCase())}static getImageDimensions(e){try{if(e.length>=24&&e.subarray(0,8).toString("hex")==="89504e470d0a1a0a"){let t=e.readUInt32BE(16),n=e.readUInt32BE(20);return{width:t,height:n}}if(e.length>=4&&e[0]===255&&e[1]===216){let t=2;for(;t<e.length-1;){if(e[t]!==255){t++;continue}for(;t<e.length&&e[t]===255;)t++;if(t>=e.length)break;let n=e[t];if(t++,n===192||n===194){if(t+7>e.length)break;let s=e.readUInt16BE(t+3);return{width:e.readUInt16BE(t+5),height:s}}if(n===208||n===209||n===210||n===211||n===212||n===213||n===214||n===215||n===216||n===217||n===1)continue;if(t+2>e.length)break;let o=e.readUInt16BE(t);t+=o}return null}return null}catch(t){return g.warn("Failed to extract image dimensions:",t),null}}static processImage(e,t,n){try{Buffer.isBuffer(e)&&r.validateBufferSize(e,"image processing");let o=r.detectImageType(e);Qre(o);let s=typeof e=="string"?Buffer.byteLength(e,"base64"):e.length,i,a;switch(t.toLowerCase()){case"openai":i=r.processImageForOpenAI(e),a="data_uri";break;case"google-ai":case"google":{i=r.processImageForGoogle(e).data,a="base64";break}case"anthropic":{i=r.processImageForAnthropic(e).data,a="base64";break}case"vertex":{i=r.processImageForVertex(e,n||"").data,a="base64";break}default:typeof e=="string"?i=e.startsWith("data:")&&e.split(",")[1]||e:i=r.safeBase64Convert(e,"image input"),a="base64"}return{data:i,mediaType:o,size:s,format:a}}catch(o){throw o instanceof Oe?o:(g.error(`Failed to process image for ${t}:`,o),new Error(`Image processing failed: ${o instanceof Error?o.message:"Unknown error"}`,{cause:o}))}}},Iqt=["jpg","jpeg","png","gif","webp","bmp","tiff","tif","svg","avif","ico","heic","heif"],Pqt=new Set(Iqt),mM={isDataUri:r=>typeof r=="string"&&r.startsWith("data:")&&r.includes("base64,"),isUrl:r=>{try{return new URL(r),r.startsWith("http://")||r.startsWith("https://")}catch{return!1}},isBase64:r=>mM.isValidBase64(r),getFileExtension:r=>{let t=r.split(/[?#]/)[0].match(/\.([^.]+)$/);if(!t)return null;let n=t[1].toLowerCase();return/^[a-z0-9]+$/.test(n)?n:null},isValidImageExtension:r=>{if(!r||typeof r!="string")return!1;let e=r.toLowerCase();return/^[a-z0-9]+$/.test(e)?Pqt.has(e):!1},getValidatedImageExtension:r=>{let e=mM.getFileExtension(r);return e&&mM.isValidImageExtension(e)?e:null},formatFileSize:r=>{if(r===0)return"0 Bytes";let e=1024,t=["Bytes","KB","MB","GB"],n=Math.floor(Math.log(r)/Math.log(e));return parseFloat((r/Math.pow(e,n)).toFixed(2))+" "+t[n]},bufferToBase64:(r,e=ig.IMAGE_MAX)=>Pu.safeBase64Convert(r,"buffer-to-base64",e),base64ToBuffer:r=>{let e=r.includes(",")?r.split(",")[1]:r;return Buffer.from(e,"base64")},redactPathFromMessage:Ure,fileToBase64DataUri:async(r,e=10*1024*1024)=>{try{let t=await Promise.resolve().then(()=>(Iu(),sg)),n=await t.stat(r);if(!n.isFile())throw new Error("Not a file");if(n.size>e)throw new Error(`File too large: ${n.size} bytes (max: ${e} bytes)`);let o=await t.readFile(r),s=Pu.detectImageType(o)||Pu.detectImageType(r);Qre(s);let i=o.toString("base64");return`data:${s};base64,${i}`}catch(t){g.debug("fileToBase64DataUri failed",{filePath:r,error:t});let n=qs(r),o=My(t,{filePath:r}),s=t instanceof Error?o.message:"Unknown error";throw new Error(`Failed to convert file to base64 (${n}): ${s}`,{cause:o})}},urlToBase64DataUri:async(r,{timeoutMs:e=15e3,maxBytes:t=10*1024*1024,maxAttempts:n=3}={})=>{let o=Zj(),s=o.get(r);if(s)return g.debug("Using cached image for URL",{url:Za(r)}),s.dataUri;if(await Yj.acquire(),!/^https?:\/\//i.test(r))throw new Error("Unsupported protocol");let i=async()=>{let a=new AbortController,c=setTimeout(()=>a.abort(),e);try{let l=await fetch(r,{signal:a.signal});if(!l.ok)throw new Error(`HTTP ${l.status}: ${l.statusText}`);let u=l.headers.get("content-type")||"";if(!/^image\//i.test(u))throw new Error(`Unsupported content-type: ${u||"unknown"}`);let d=l.headers.get("content-length"),p=Number(d||0);if(d!==null&&p===0)throw new Error("Empty response: content-length is 0");if(p&&p>t)throw new Error(`Content too large: ${p} bytes`);let f=await l.arrayBuffer();if(f.byteLength>t)throw new Error(`Downloaded content too large: ${f.byteLength} bytes`);let h=Buffer.from(f),y=h.toString("base64"),x=`data:${u||"image/jpeg"};base64,${y}`;return o.set(r,x,u||"image/jpeg",h),x}finally{clearTimeout(c)}};try{return await kDe(i,{maxAttempts:n,initialDelay:Ta.DEFAULT_INITIAL_DELAY,backoffMultiplier:Ta.DEFAULT_BACKOFF_MULTIPLIER,maxDelay:Ta.DEFAULT_MAX_DELAY,retryCondition:Aqt,onRetry:(a,c)=>{let l=Fre(c instanceof Error?c.message:String(c)),u=n-a;g.warn(`\u26A0\uFE0F Image download attempt ${a} failed for ${Za(r)}: ${l}. ${u} ${u===1?"attempt":"attempts"} remaining...`)}})}catch(a){let c=Za(r),l=My(a);throw new Error(`Failed to download and convert URL to base64 (${c}): ${l.message}`,{cause:l})}},extractBase64FromDataUri:r=>r.includes(",")?r.split(",")[1]:r,extractMimeTypeFromDataUri:r=>{let e=r.match(/^data:([^;]+);base64,/);return e?e[1]:"image/jpeg"},createDataUri:(r,e="image/jpeg")=>{let t=r.includes(",")?r.split(",")[1]:r;return`data:${e};base64,${t}`},isValidBase64:r=>{try{let e=r.includes(",")?r.split(",")[1]:r;if(!e||e.length===0||!/^[A-Za-z0-9+/]*={0,2}$/.test(e)||e.length%4!==0)return!1;let n=e.indexOf("=");if(n!==-1){if(n<e.length-2)return!1;let a=e.slice(n);if(!/^=+$/.test(a))return!1}let s=Buffer.from(e,"base64").toString("base64"),i=a=>a.replace(/=+$/,"");return i(e)===i(s)}catch{return!1}},getBase64Size:r=>{let e=r.includes(",")?r.split(",")[1]:r;return Buffer.byteLength(e,"base64")},compressBase64:(r,e=.8)=>(g.warn("Base64 compression not implemented - returning original"),r)}});function Oqt(r){let e=r.toLowerCase();switch(e.replace(/[^a-z]/g,"")){case"lmstudio":return"lm-studio";case"llamacpp":return"llamacpp";case"nvidianim":return"nvidia-nim";case"googleaistudio":return"google-ai";case"or":return"openrouter";default:return e}}var Ny,fM,Mqt,ene,u_,IDe=C(()=>{"use strict";Qj();H();Ny=class{static logError(e,t,n){g.error(`Multimodal ${e} failed: ${t.message}`),process.env.NODE_ENV==="development"&&(g.error("Context:",JSON.stringify(n,null,2)),g.error("Stack:",t.stack))}},fM={openai:10,azure:10,"google-ai":16,google:16,anthropic:20,vertex:{claude:20,gemini:16,default:16},ollama:10,litellm:10,mistral:10,bedrock:20,openrouter:10},Mqt=new Set(["litellm","openrouter"]);ene={openai:["gpt-5.4","gpt-5.4-mini","gpt-5.4-nano","gpt-5.4-pro","gpt-5.2","gpt-5.2-chat-latest","gpt-5.2-pro","gpt-5","gpt-5-2025-08-07","gpt-5-pro","gpt-5-mini","gpt-5-nano","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","o3","o3-mini","o3-pro","o4","o4-mini","o4-mini-deep-research","gpt-4o","gpt-4o-mini","gpt-4-turbo","gpt-4-vision-preview"],"google-ai":["gemini-3.1-pro-preview","gemini-3.1-flash-lite-preview","gemini-3.1-flash-image-preview","gemini-3.1-pro-preview-customtools","gemini-3-flash-preview","gemini-3-pro-image-preview","gemini-3-pro-preview","gemini-2.5-pro","gemini-2.5-flash","gemini-2.5-flash-lite","gemini-2.5-flash-image","gemini-2.0-flash","gemini-2.0-flash-001","gemini-2.0-flash-lite","gemini-2.0-flash-preview-image-generation","gemini-1.5-pro","gemini-1.5-flash","gemini-pro-vision"],anthropic:["claude-opus-4-6","claude-sonnet-4-6","claude-sonnet-4-5","claude-sonnet-4-5-20250929","claude-opus-4-5","claude-opus-4-5-20251101","claude-haiku-4-5","claude-haiku-4-5-20251001","claude-opus-4-1","claude-opus-4-1-20250805","claude-opus-4","claude-opus-4-20250514","claude-sonnet-4","claude-sonnet-4-20250514","claude-3-7-sonnet","claude-3-7-sonnet-20250219","claude-3-5-sonnet","claude-3-5-sonnet-20241022","claude-3-opus","claude-3-sonnet","claude-3-haiku"],azure:["gpt-5.1","gpt-5.1-chat","gpt-5.1-codex","gpt-5","gpt-5-pro","gpt-5-turbo","gpt-5-chat","gpt-5-mini","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","o3","o3-mini","o3-pro","o4-mini","gpt-4o","gpt-4o-mini","gpt-4-turbo","gpt-4-vision-preview","gpt-4"],vertex:["gemini-3.1-pro-preview","gemini-3.1-flash-lite-preview","gemini-3.1-flash-image-preview","gemini-3.1-pro-preview-customtools","gemini-3-flash-preview","gemini-3-pro-image-preview","gemini-3-pro-preview","gemini-2.5-pro","gemini-2.5-flash","gemini-2.5-flash-lite","gemini-2.5-flash-image","gemini-2.0-flash-001","gemini-2.0-flash-lite","gemini-2.0-flash","gemini-1.5-pro","gemini-1.5-flash","claude-sonnet-4-5@","claude-opus-4-5@","claude-haiku-4-5@","claude-haiku-4-5","claude-sonnet-4@","claude-opus-4@","claude-opus-4-1@","claude-3-7-sonnet@","claude-3-5-sonnet@","claude-opus-3@","claude-haiku-3@","claude-3-7-sonnet","claude-3-5-sonnet","claude-3-opus","claude-3-sonnet","claude-3-haiku","claude-sonnet-4","claude-sonnet-3","claude-opus-3","claude-haiku-3","claude-haiku-4","claude-3.5-sonnet","claude-3.5-haiku","claude-4.5-sonnet","claude-4.5-opus","claude-4.5-haiku","claude-haiku-4-5","claude-3.0-sonnet","claude-3.0-opus"],litellm:["openai/gpt-5","openai/gpt-4o","openai/gpt-4o-mini","openai/gpt-4-turbo","gpt-5","gpt-4o","gpt-4.1","anthropic/claude-sonnet-4-5-20250929","anthropic/claude-opus-4-1-20250805","anthropic/claude-3-5-sonnet-20240620","claude-sonnet-4-5","claude-sonnet-4-5-20250929","claude-opus-4-5","claude-opus-4-5-20251101","claude-haiku-4-5-20251001","claude-sonnet-4","claude-opus-4-1","vertex_ai/gemini-2.5-pro","gemini/gemini-2.5-pro","gemini/gemini-2.0-flash","gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-2.5-pro","gemini-2.5-flash","gemini-2.0-flash-lite","groq/llama-3.2-11b-vision-preview"],openrouter:["anthropic/claude-3.7-sonnet","anthropic/claude-3-5-haiku","anthropic/claude-3-opus","anthropic/claude-3-sonnet","anthropic/claude-3-haiku","openai/gpt-4o","openai/gpt-4o-mini","openai/gpt-4-turbo","openai/gpt-4-vision-preview","google/gemini-2.5-pro","google/gemini-2.5-flash","google/gemini-2.0-flash","google/gemini-2.0-flash-001","google/gemini-1.5-pro","google/gemini-1.5-flash","google/gemini-pro-vision","meta-llama/llama-3.2-90b-vision-instruct","meta-llama/llama-3.2-11b-vision-instruct","mistralai/pixtral-12b","mistralai/pixtral-large","qwen/qwen-2-vl-72b-instruct","qwen/qwen-2-vl-7b-instruct"],mistral:["mistral-large-latest","mistral-large-2512","mistral-small","mistral-small-latest","mistral-small-3.2","mistral-small-2506","mistral-medium","mistral-medium-latest","mistral-medium-3.1","mistral-medium-2508","magistral-small","magistral-small-latest","magistral-medium","magistral-medium-latest","pixtral-12b","pixtral-12b-latest","pixtral-large","pixtral-large-latest","pixtral-large-2502"],ollama:["llama4:scout","llama4:maverick","llama4:latest","llama4","llama3.2-vision","llama3.2-vision:11b","llama3.2-vision:90b","gemma3","gemma3:4b","gemma3:12b","gemma3:27b","gemma3:latest","qwen2.5-vl","qwen2.5-vl:72b","qwen2.5-vl:32b","mistral-small3.1","mistral-small3.1:large","mistral-small3.1:medium","mistral-small3.1:small","llava","llava:7b","llava:13b","llava:34b","llava-llama3","llava-llama3:8b"],bedrock:["amazon.nova-premier","amazon.nova-premier-v1:0","amazon.nova-pro","amazon.nova-pro-v1:0","amazon.nova-lite","amazon.nova-lite-v1:0","amazon.nova-2-lite-v1:0","nova-premier","nova-pro","nova-lite","claude-sonnet-4-5","claude-sonnet-4.5","anthropic.claude-sonnet-4-5","anthropic.claude-sonnet-4-5-20250929-v1:0","claude-opus-4-5","claude-opus-4.5","anthropic.claude-opus-4-5","anthropic.claude-opus-4-5-20251124-v1:0","claude-haiku-4-5","claude-haiku-4.5","anthropic.claude-haiku-4-5","anthropic.claude-haiku-4-5-20251001-v1:0","claude-sonnet-4","claude-sonnet-4@","anthropic.claude-sonnet-4","anthropic.claude-sonnet-4-20250514-v1:0","claude-opus-4","claude-opus-4-1","claude-opus-4@","anthropic.claude-opus-4","anthropic.claude-opus-4-1-20250805-v1:0","claude-3-7-sonnet","claude-3.7-sonnet","anthropic.claude-3-7-sonnet","anthropic.claude-3-7-sonnet-20250219-v1:0","claude-3-5-sonnet","claude-3.5-sonnet","anthropic.claude-3-5-sonnet","anthropic.claude-3-5-sonnet-20241022-v1:0","claude-3-opus","anthropic.claude-3-opus","claude-3-sonnet","anthropic.claude-3-sonnet","claude-3-haiku","anthropic.claude-3-haiku","meta.llama4-maverick-17b-instruct-v1:0","meta.llama4-scout-17b-instruct-v1:0","meta.llama3-2-90b-instruct-v1:0","meta.llama3-2-11b-instruct-v1:0","mistral.pixtral-large-2502-v1:0","anthropic.claude"],huggingface:["Qwen/Qwen2.5-VL-32B-Instruct","Qwen/Qwen2.5-VL-7B-Instruct","microsoft/Phi-3-vision-128k-instruct","llava-hf/llava-1.5-7b-hf","llava-hf/llava-v1.6-mistral-7b-hf"],sagemaker:["meta-llama-4-maverick-17b-128e-instruct","meta-llama-4-scout-17b-16e-instruct"],deepseek:[],"nvidia-nim":["meta/llama-3.2-90b-vision-instruct","meta/llama-3.2-11b-vision-instruct"],"lm-studio":["llava","llama-3.2-11b-vision","llama-3.2-90b-vision","vision-instruct","qwen2-vl","qwen2.5-vl","phi-3-vision"],llamacpp:["llava","llama-3.2-11b-vision","llama-3.2-90b-vision","vision-instruct","qwen2-vl","phi-3-vision"],xai:["grok-2-vision-latest"],groq:["llama-3.2-90b-vision-preview","llama-3.2-11b-vision-preview"],cohere:[],"together-ai":[],fireworks:["accounts/fireworks/models/phi-3-vision-128k-instruct","accounts/fireworks/models/llama-v3p2-90b-vision-instruct","accounts/fireworks/models/llama-v3p2-11b-vision-instruct"],perplexity:[],cloudflare:["@cf/meta/llama-3.2-11b-vision-instruct"],replicate:["llava","llama-3.2-vision","moondream","qwen2-vl"],voyage:[],jina:[],stability:[],ideogram:[],recraft:[]},u_=class{static validateImageCount(e,t,n){let o=t.toLowerCase(),s;if(o==="vertex"&&n)n.includes("claude")?s=fM.vertex.claude:n.includes("gemini")?s=fM.vertex.gemini:s=fM.vertex.default;else{let a=o in fM?fM[o]:void 0;a===void 0?(s=10,g.warn(`Image count limit not defined for provider ${t}. Using conservative default of 10 images.`)):s=a}let i=Math.floor(s*.8);if(e===i&&g.warn(`Image count (${e}) is approaching the limit for ${t}. Maximum allowed: ${s}. Please reduce the number of images.`),e>s)throw new Error(`Image count (${e}) exceeds the maximum limit for ${t}. Maximum allowed: ${s}. Please reduce the number of images.`)}static convertToContent(e,t){let n=[{type:"text",text:e}];return t&&t.length>0&&t.forEach(o=>{let s=typeof o=="object"&&"data"in o&&!Buffer.isBuffer(o)?o.data:o,i=typeof o=="object"&&"data"in o&&!Buffer.isBuffer(o)?o.altText:void 0;n.push({type:"image",data:s,altText:i,mediaType:Pu.detectImageType(s)})}),n}static supportsVision(e,t){try{let n=Oqt(e),o=ene[n];if(!o||o.length===0)return!1;if(!t)return!0;let s=o.some(i=>t.toLowerCase().includes(i.toLowerCase()));return!s&&Mqt.has(n)?!0:s}catch{return!1}}static getSupportedModels(e){let t=e.toLowerCase(),n=ene[t];return n?[...n]:[]}static getVisionProviders(){return Object.entries(ene).filter(([,e])=>e.length>0).map(([e])=>e)}static countImagesInMessage(e,t){return(e?.length||0)+(t??0)}static countImagesInPages(e){return!e||e.length===0?0:e.reduce((t,n)=>t+(n.pageCount??0),0)}}});function PDe(){return{enabled:process.env.NEUROLINK_MEMORY_ENABLED==="true",maxSessions:Number(process.env.NEUROLINK_MEMORY_MAX_SESSIONS)||50,enableSummarization:process.env.NEUROLINK_SUMMARIZATION_ENABLED!=="false",tokenThreshold:process.env.NEUROLINK_TOKEN_THRESHOLD?Number(process.env.NEUROLINK_TOKEN_THRESHOLD):void 0,summarizationProvider:process.env.NEUROLINK_SUMMARIZATION_PROVIDER||"vertex",summarizationModel:process.env.NEUROLINK_SUMMARIZATION_MODEL||"gemini-2.5-flash",maxTurnsPerSession:50}}var tne,rne,nne=C(()=>{"use strict";tne=`
820
820
 
821
821
  IMPORTANT: You are continuing an ongoing conversation. The previous messages in this conversation contain important context including:
822
822
  - Names, personal information, and preferences shared by the user
@@ -23,7 +23,11 @@ import { normalizeUrlForCache, redactUrlForError } from "./logSanitize.js";
23
23
  */
24
24
  export class ImageCache {
25
25
  cache = new Map();
26
- contentHashIndex = new Map(); // contentHash -> url
26
+ // contentHash -> set of normalized urls whose cache entry holds that
27
+ // content. A Set (not a single url) so that evicting/deleting one url
28
+ // doesn't drop the dedup mapping for other urls still caching the same
29
+ // content (#1213).
30
+ contentHashIndex = new Map();
27
31
  maxSize;
28
32
  ttlMs;
29
33
  maxImageSize;
@@ -164,11 +168,37 @@ export class ImageCache {
164
168
  * Useful for deduplication when the same image is accessed via different URLs
165
169
  */
166
170
  getByContentHash(contentHash) {
167
- const url = this.contentHashIndex.get(contentHash);
168
- if (!url) {
171
+ const urlSet = this.contentHashIndex.get(contentHash);
172
+ if (!urlSet) {
169
173
  return null;
170
174
  }
171
- return this.get(url);
175
+ // Find the first url whose cache entry is still live, pruning any url
176
+ // whose entry no longer exists in `this.cache` along the way. Entries
177
+ // that exist but are expired are left in the set (not "gone") - the
178
+ // normal TTL/get() path is responsible for reaping those.
179
+ let liveUrl = null;
180
+ // Iterate a copy so reaping below can mutate the set safely.
181
+ for (const url of [...urlSet]) {
182
+ const entry = this.cache.get(url);
183
+ if (!entry) {
184
+ urlSet.delete(url);
185
+ continue;
186
+ }
187
+ if (this.isExpired(entry)) {
188
+ // Reap expired entries here too (matching get() semantics) so stale
189
+ // urls don't accumulate when callers primarily use getByContentHash.
190
+ this.cache.delete(url);
191
+ urlSet.delete(url);
192
+ continue;
193
+ }
194
+ if (liveUrl === null) {
195
+ liveUrl = url;
196
+ }
197
+ }
198
+ if (urlSet.size === 0) {
199
+ this.contentHashIndex.delete(contentHash);
200
+ }
201
+ return liveUrl ? this.get(liveUrl) : null;
172
202
  }
173
203
  /**
174
204
  * Store an image in the cache
@@ -192,21 +222,42 @@ export class ImageCache {
192
222
  }
193
223
  // Generate content hash
194
224
  const contentHash = this.generateContentHash(imageData);
195
- // Check if same content already exists under different URL
196
- const existingUrl = this.contentHashIndex.get(contentHash);
197
- if (existingUrl && existingUrl !== normalizedUrl) {
198
- // Content already cached under different URL - create a shallow copy
199
- const existingEntry = this.cache.get(existingUrl);
200
- if (existingEntry && !this.isExpired(existingEntry)) {
201
- // Create a shallow copy for the new URL to avoid shared reference issues
202
- this.cache.set(normalizedUrl, { ...existingEntry });
203
- // Update content hash index to point to the new URL as well
204
- this.contentHashIndex.set(contentHash, normalizedUrl);
205
- logger.debug("Image cache dedup hit", {
206
- newUrl: redactUrlForError(normalizedUrl),
207
- existingUrl: redactUrlForError(existingUrl),
208
- });
209
- return;
225
+ // Check if same content already exists under a different URL
226
+ const existingUrls = this.contentHashIndex.get(contentHash);
227
+ if (existingUrls) {
228
+ for (const existingUrl of existingUrls) {
229
+ if (existingUrl === normalizedUrl) {
230
+ continue;
231
+ }
232
+ // Content already cached under a different URL - create a shallow copy
233
+ const existingEntry = this.cache.get(existingUrl);
234
+ if (existingEntry && !this.isExpired(existingEntry)) {
235
+ // A dedup hit still adds a cache entry for the new URL, so enforce
236
+ // capacity first — otherwise many URLs sharing one content hash could
237
+ // grow the cache past maxSize.
238
+ while (this.cache.size >= this.maxSize && this.cache.size > 0) {
239
+ this.evictOldest();
240
+ }
241
+ // Create a shallow copy for the new URL to avoid shared reference issues
242
+ this.cache.set(normalizedUrl, { ...existingEntry });
243
+ // Re-fetch (or re-create) the hash's URL set: the eviction above may
244
+ // have removed this hash's last url, emptying the set and deleting it
245
+ // from contentHashIndex — reusing the stale `existingUrls` reference
246
+ // would add the new url to an orphaned set that the index no longer
247
+ // points to, leaving a live entry unreachable by content hash
248
+ // (the exact #1213 failure mode). Never replace an existing mapping.
249
+ let hashUrls = this.contentHashIndex.get(contentHash);
250
+ if (!hashUrls) {
251
+ hashUrls = new Set();
252
+ this.contentHashIndex.set(contentHash, hashUrls);
253
+ }
254
+ hashUrls.add(normalizedUrl);
255
+ logger.debug("Image cache dedup hit", {
256
+ newUrl: redactUrlForError(normalizedUrl),
257
+ existingUrl: redactUrlForError(existingUrl),
258
+ });
259
+ return;
260
+ }
210
261
  }
211
262
  }
212
263
  // Evict if at capacity
@@ -224,7 +275,12 @@ export class ImageCache {
224
275
  accessCount: 1,
225
276
  };
226
277
  this.cache.set(normalizedUrl, entry);
227
- this.contentHashIndex.set(contentHash, normalizedUrl);
278
+ let urlSet = this.contentHashIndex.get(contentHash);
279
+ if (!urlSet) {
280
+ urlSet = new Set();
281
+ this.contentHashIndex.set(contentHash, urlSet);
282
+ }
283
+ urlSet.add(normalizedUrl);
228
284
  logger.debug("Image cached", {
229
285
  url: redactUrlForError(normalizedUrl),
230
286
  size,
@@ -239,9 +295,14 @@ export class ImageCache {
239
295
  const normalizedUrl = this.normalizeUrl(url);
240
296
  const entry = this.cache.get(normalizedUrl);
241
297
  if (entry) {
242
- // Remove from content hash index
243
- if (this.contentHashIndex.get(entry.contentHash) === normalizedUrl) {
244
- this.contentHashIndex.delete(entry.contentHash);
298
+ // Remove this URL from its content hash's URL set; only drop the
299
+ // hash entry once no URL maps to that content anymore (#1213).
300
+ const urlSet = this.contentHashIndex.get(entry.contentHash);
301
+ if (urlSet) {
302
+ urlSet.delete(normalizedUrl);
303
+ if (urlSet.size === 0) {
304
+ this.contentHashIndex.delete(entry.contentHash);
305
+ }
245
306
  }
246
307
  this.cache.delete(normalizedUrl);
247
308
  return true;
@@ -257,8 +318,15 @@ export class ImageCache {
257
318
  if (oldestKey !== undefined) {
258
319
  const entry = this.cache.get(oldestKey);
259
320
  if (entry) {
260
- if (this.contentHashIndex.get(entry.contentHash) === oldestKey) {
261
- this.contentHashIndex.delete(entry.contentHash);
321
+ // Remove only the evicted URL from its content hash's URL set; the
322
+ // hash entry is dropped only once no URL maps to it anymore
323
+ // (#1213).
324
+ const urlSet = this.contentHashIndex.get(entry.contentHash);
325
+ if (urlSet) {
326
+ urlSet.delete(oldestKey);
327
+ if (urlSet.size === 0) {
328
+ this.contentHashIndex.delete(entry.contentHash);
329
+ }
262
330
  }
263
331
  }
264
332
  this.cache.delete(oldestKey);
@@ -23,7 +23,11 @@ import { normalizeUrlForCache, redactUrlForError } from "./logSanitize.js";
23
23
  */
24
24
  export class ImageCache {
25
25
  cache = new Map();
26
- contentHashIndex = new Map(); // contentHash -> url
26
+ // contentHash -> set of normalized urls whose cache entry holds that
27
+ // content. A Set (not a single url) so that evicting/deleting one url
28
+ // doesn't drop the dedup mapping for other urls still caching the same
29
+ // content (#1213).
30
+ contentHashIndex = new Map();
27
31
  maxSize;
28
32
  ttlMs;
29
33
  maxImageSize;
@@ -164,11 +168,37 @@ export class ImageCache {
164
168
  * Useful for deduplication when the same image is accessed via different URLs
165
169
  */
166
170
  getByContentHash(contentHash) {
167
- const url = this.contentHashIndex.get(contentHash);
168
- if (!url) {
171
+ const urlSet = this.contentHashIndex.get(contentHash);
172
+ if (!urlSet) {
169
173
  return null;
170
174
  }
171
- return this.get(url);
175
+ // Find the first url whose cache entry is still live, pruning any url
176
+ // whose entry no longer exists in `this.cache` along the way. Entries
177
+ // that exist but are expired are left in the set (not "gone") - the
178
+ // normal TTL/get() path is responsible for reaping those.
179
+ let liveUrl = null;
180
+ // Iterate a copy so reaping below can mutate the set safely.
181
+ for (const url of [...urlSet]) {
182
+ const entry = this.cache.get(url);
183
+ if (!entry) {
184
+ urlSet.delete(url);
185
+ continue;
186
+ }
187
+ if (this.isExpired(entry)) {
188
+ // Reap expired entries here too (matching get() semantics) so stale
189
+ // urls don't accumulate when callers primarily use getByContentHash.
190
+ this.cache.delete(url);
191
+ urlSet.delete(url);
192
+ continue;
193
+ }
194
+ if (liveUrl === null) {
195
+ liveUrl = url;
196
+ }
197
+ }
198
+ if (urlSet.size === 0) {
199
+ this.contentHashIndex.delete(contentHash);
200
+ }
201
+ return liveUrl ? this.get(liveUrl) : null;
172
202
  }
173
203
  /**
174
204
  * Store an image in the cache
@@ -192,21 +222,42 @@ export class ImageCache {
192
222
  }
193
223
  // Generate content hash
194
224
  const contentHash = this.generateContentHash(imageData);
195
- // Check if same content already exists under different URL
196
- const existingUrl = this.contentHashIndex.get(contentHash);
197
- if (existingUrl && existingUrl !== normalizedUrl) {
198
- // Content already cached under different URL - create a shallow copy
199
- const existingEntry = this.cache.get(existingUrl);
200
- if (existingEntry && !this.isExpired(existingEntry)) {
201
- // Create a shallow copy for the new URL to avoid shared reference issues
202
- this.cache.set(normalizedUrl, { ...existingEntry });
203
- // Update content hash index to point to the new URL as well
204
- this.contentHashIndex.set(contentHash, normalizedUrl);
205
- logger.debug("Image cache dedup hit", {
206
- newUrl: redactUrlForError(normalizedUrl),
207
- existingUrl: redactUrlForError(existingUrl),
208
- });
209
- return;
225
+ // Check if same content already exists under a different URL
226
+ const existingUrls = this.contentHashIndex.get(contentHash);
227
+ if (existingUrls) {
228
+ for (const existingUrl of existingUrls) {
229
+ if (existingUrl === normalizedUrl) {
230
+ continue;
231
+ }
232
+ // Content already cached under a different URL - create a shallow copy
233
+ const existingEntry = this.cache.get(existingUrl);
234
+ if (existingEntry && !this.isExpired(existingEntry)) {
235
+ // A dedup hit still adds a cache entry for the new URL, so enforce
236
+ // capacity first — otherwise many URLs sharing one content hash could
237
+ // grow the cache past maxSize.
238
+ while (this.cache.size >= this.maxSize && this.cache.size > 0) {
239
+ this.evictOldest();
240
+ }
241
+ // Create a shallow copy for the new URL to avoid shared reference issues
242
+ this.cache.set(normalizedUrl, { ...existingEntry });
243
+ // Re-fetch (or re-create) the hash's URL set: the eviction above may
244
+ // have removed this hash's last url, emptying the set and deleting it
245
+ // from contentHashIndex — reusing the stale `existingUrls` reference
246
+ // would add the new url to an orphaned set that the index no longer
247
+ // points to, leaving a live entry unreachable by content hash
248
+ // (the exact #1213 failure mode). Never replace an existing mapping.
249
+ let hashUrls = this.contentHashIndex.get(contentHash);
250
+ if (!hashUrls) {
251
+ hashUrls = new Set();
252
+ this.contentHashIndex.set(contentHash, hashUrls);
253
+ }
254
+ hashUrls.add(normalizedUrl);
255
+ logger.debug("Image cache dedup hit", {
256
+ newUrl: redactUrlForError(normalizedUrl),
257
+ existingUrl: redactUrlForError(existingUrl),
258
+ });
259
+ return;
260
+ }
210
261
  }
211
262
  }
212
263
  // Evict if at capacity
@@ -224,7 +275,12 @@ export class ImageCache {
224
275
  accessCount: 1,
225
276
  };
226
277
  this.cache.set(normalizedUrl, entry);
227
- this.contentHashIndex.set(contentHash, normalizedUrl);
278
+ let urlSet = this.contentHashIndex.get(contentHash);
279
+ if (!urlSet) {
280
+ urlSet = new Set();
281
+ this.contentHashIndex.set(contentHash, urlSet);
282
+ }
283
+ urlSet.add(normalizedUrl);
228
284
  logger.debug("Image cached", {
229
285
  url: redactUrlForError(normalizedUrl),
230
286
  size,
@@ -239,9 +295,14 @@ export class ImageCache {
239
295
  const normalizedUrl = this.normalizeUrl(url);
240
296
  const entry = this.cache.get(normalizedUrl);
241
297
  if (entry) {
242
- // Remove from content hash index
243
- if (this.contentHashIndex.get(entry.contentHash) === normalizedUrl) {
244
- this.contentHashIndex.delete(entry.contentHash);
298
+ // Remove this URL from its content hash's URL set; only drop the
299
+ // hash entry once no URL maps to that content anymore (#1213).
300
+ const urlSet = this.contentHashIndex.get(entry.contentHash);
301
+ if (urlSet) {
302
+ urlSet.delete(normalizedUrl);
303
+ if (urlSet.size === 0) {
304
+ this.contentHashIndex.delete(entry.contentHash);
305
+ }
245
306
  }
246
307
  this.cache.delete(normalizedUrl);
247
308
  return true;
@@ -257,8 +318,15 @@ export class ImageCache {
257
318
  if (oldestKey !== undefined) {
258
319
  const entry = this.cache.get(oldestKey);
259
320
  if (entry) {
260
- if (this.contentHashIndex.get(entry.contentHash) === oldestKey) {
261
- this.contentHashIndex.delete(entry.contentHash);
321
+ // Remove only the evicted URL from its content hash's URL set; the
322
+ // hash entry is dropped only once no URL maps to it anymore
323
+ // (#1213).
324
+ const urlSet = this.contentHashIndex.get(entry.contentHash);
325
+ if (urlSet) {
326
+ urlSet.delete(oldestKey);
327
+ if (urlSet.size === 0) {
328
+ this.contentHashIndex.delete(entry.contentHash);
329
+ }
262
330
  }
263
331
  }
264
332
  this.cache.delete(oldestKey);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@juspay/neurolink",
3
- "version": "10.1.1",
3
+ "version": "10.1.2",
4
4
  "packageManager": "pnpm@10.15.1",
5
5
  "description": "TypeScript AI SDK with 24+ LLM providers behind one consistent API. MCP-native (connect any MCP server), voice TTS/STT/realtime, RAG, agents, memory, context compaction. OpenAI · Anthropic · Gemini · Bedrock · Azure · Ollama · DeepSeek · NVIDIA NIM and more.",
6
6
  "author": {
@@ -621,7 +621,8 @@
621
621
  "esbuild@>=0.17.0 <0.28.1": ">=0.28.1",
622
622
  "rollup@>=4.0.0 <4.59.0": ">=4.59.0",
623
623
  "shell-quote@<1.8.4": ">=1.8.4",
624
- "undici@>=8.0.0": ">=7.24.0 <8.0.0"
624
+ "undici@>=8.0.0": ">=7.24.0 <8.0.0",
625
+ "pdfjs-dist": "5.4.624"
625
626
  },
626
627
  "patchedDependencies": {
627
628
  "mammoth@1.12.0": "patches/mammoth@1.12.0.patch"