@juspay/neurolink 13.8.3 โ†’ 13.8.4

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,8 +1,8 @@
1
- ## [13.8.3](https://github.com/juspay/neurolink/compare/v13.8.2...v13.8.3) (2026-10-23)
1
+ ## [13.8.4](https://github.com/juspay/neurolink/compare/v13.8.3...v13.8.4) (2026-10-23)
2
2
 
3
3
  ### Bug Fixes
4
4
 
5
- - **(deps):** clear the docs-site dompurify critical advisory ([39af0f7](https://github.com/juspay/neurolink/commit/39af0f74d6613aff8871d3ed150d73c963d8b5c2))
5
+ - **(decide):** do not load the chat model registry for a decision-only provider ([b69dfd9](https://github.com/juspay/neurolink/commit/b69dfd9568ece7f74d714934e47aa2951aafea0b))
6
6
 
7
7
  ## [11.2.3](https://github.com/juspay/neurolink/compare/v11.2.2...v11.2.3) (2026-08-19)
8
8
 
@@ -2212,7 +2212,7 @@ ${o.join(`
2212
2212
  `);const r=e.prompt;return typeof r=="string"?r:Array.isArray(r)?r.filter(n=>n.role&&n.content).map(n=>typeof n.content=="string"?`${n.role}: ${n.content}`:`${n.role}: ${JSON.stringify(n.content)}`).join(`
2213
2213
  `):String(r)}extractTextFromResponse(e){if(typeof e=="string")return e;if(e.generated_text)return e.generated_text;if(e.outputs)return e.outputs;if(e.text)return e.text;if(Array.isArray(e)&&e[0]?.generated_text)return e[0].generated_text;if(e.choices&&Array.isArray(e.choices)){const t=e.choices[0];if(typeof t?.message?.content=="string")return t.message.content;if(t?.message?.tool_calls?.length)return""}return JSON.stringify(e)}extractToolCallsFromResponse(e){if(e.choices&&Array.isArray(e.choices)){const t=e.choices[0];if(t?.message?.tool_calls)return t.message.tool_calls.map(r=>({type:"function",id:String(r.id||`call_${it()}`),function:{name:String(r.function.name),arguments:String(r.function.arguments)}}))}if(e.tool_calls&&Array.isArray(e.tool_calls))return e.tool_calls;if(e.content&&Array.isArray(e.content)){const t=e.content.filter(r=>r.type==="tool_use");if(t.length>0)return t.map(r=>({type:"function",id:String(r.id||`call_${it()}`),function:{name:String(r.name),arguments:JSON.stringify(r.input||{})}}))}}mapSageMakerFinishReason(e){switch(e?.toLowerCase()){case"stop":case"end_turn":case"stop_sequence":return"stop";case"length":case"max_tokens":case"max_length":return"length";case"content_filter":case"content_filtered":return"content-filter";case"tool_calls":case"function_call":return"tool-calls";case"error":return"error";default:return"unknown"}}getModelInfo(){return{modelId:this.modelId,provider:this.provider,specificationVersion:this.specificationVersion,endpointName:this.modelConfig.endpointName,modelType:this.modelConfig.modelType,region:this.config.region}}async testConnectivity(){try{return{success:!!(await this.doGenerate({inputFormat:"messages",mode:{type:"regular"},prompt:[{role:"user",content:[{type:"text",text:"Hello"}]}],maxTokens:10})).text}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}}async doBatchGenerate(e,t){try{h.debug("SageMaker batch generate called",{batchSize:e.length,endpointName:this.modelConfig.endpointName});const r=await this.processPromptsInParallel(e,t);return h.debug("SageMaker batch generate completed",{batchSize:e.length,successCount:r.length}),r}catch(r){throw h.error("SageMaker batch generate failed",{error:r instanceof Error?r.message:String(r),batchSize:e.length}),sr(r)?r:Qp(r,this.modelConfig.endpointName)}}async processPromptsInParallel(e,t){const r=Math.min(this.modelConfig.initialConcurrency??R0r,e.length),n=this.modelConfig.maxConcurrency??M0r,o=this.modelConfig.minConcurrency??P0r,i=new Array(e.length),s=[],a=lSn(r,n,o),l=async(d,p)=>{await a.acquire();const m=Date.now();try{const f=await this.doGenerate({inputFormat:"messages",mode:{type:"regular"},prompt:[{role:"user",content:[{type:"text",text:d}]}],maxTokens:t?.maxTokens,temperature:t?.temperature,topP:t?.topP}),g=Date.now()-m;i[p]={text:f.text||"",usage:{promptTokens:f.usage.inputTokens??0,completionTokens:f.usage.outputTokens??0,total:f.usage.totalTokens??(f.usage.inputTokens??0)+(f.usage.outputTokens??0)},finishReason:f.finishReason,index:p},a.recordSuccess(g)}catch(f){s.push({index:p,error:f instanceof Error?f:new Error(String(f))});const g=Date.now()-m;a.recordError(g),i[p]={text:"",usage:{promptTokens:0,completionTokens:0,total:0},finishReason:"error",index:p}}finally{a.release()}},c=e.map((d,p)=>l(d,p));await Promise.all(c);const u=a.getMetrics();return h.debug("Parallel batch processing completed",{totalPrompts:e.length,successCount:u.completedCount,errorCount:u.errorCount,finalConcurrency:u.currentConcurrency,errorRate:u.errorCount/e.length,averageResponseTime:u.averageResponseTime}),s.length>0&&h.warn("Batch processing encountered errors",{errorCount:s.length,sampleErrors:s.slice(0,3).map(d=>({index:d.index,message:d.error.message}))}),i.map(({text:d,usage:p,finishReason:m})=>({text:d,usage:p,finishReason:m}))}getModelCapabilities(){return{...this.getModelInfo(),capabilities:{streaming:!0,toolCalling:!0,structuredOutput:!0,batchInference:!0,supportedResponseFormats:["text","json_object","json_schema"],supportedToolTypes:["function"],maxBatchSize:100,adaptiveConcurrency:!0,errorRecovery:!0}}}}}}),D0r={};ce(D0r,{AmazonSageMakerProvider:()=>hhe,default:()=>N0r});var hhe,N0r,mSn=S({"src/lib/providers/amazonSagemaker.ts"(){"use strict";Vt(),Il(),YT(),z(),th(),fd(),dc(),is(),rp(),pme(),ii(),dme(),Jk(),Tl(),Zt(),Cr(),FEn(),_I(),pSn(),hhe=class extends Ga{sagemakerModel;sagemakerConfig;modelConfig;constructor(e,t,r,n,o){super(e,"sagemaker",n);try{const i=DEn(o?.region??r,{...o?.region!==void 0&&{region:o.region},...o?.accessKeyId!==void 0&&{accessKeyId:o.accessKeyId},...o?.secretAccessKey!==void 0&&{secretAccessKey:o.secretAccessKey},...o?.sessionToken!==void 0&&{sessionToken:o.sessionToken},...o?.endpoint!==void 0&&{endpoint:o.endpoint}});this.sagemakerConfig={...i,...o?.region!==void 0&&{region:o.region},...o?.accessKeyId!==void 0&&{accessKeyId:o.accessKeyId},...o?.secretAccessKey!==void 0&&{secretAccessKey:o.secretAccessKey},...o?.sessionToken!==void 0&&{sessionToken:o.sessionToken},...o?.endpoint!==void 0&&{endpoint:o.endpoint}},this.modelConfig=NEn(t||l0r()),this.sagemakerModel=new O0r(this.modelName,this.sagemakerConfig,this.modelConfig),h.debug("Amazon SageMaker Provider initialized",{modelName:this.modelName,endpointName:this.modelConfig.endpointName,region:this.sagemakerConfig.region,provider:this.providerName})}catch(i){throw h.error("Failed to initialize SageMaker provider",{error:i instanceof Error?i.message:String(i),modelName:e,endpointName:t}),Qp(i)}}getProviderName(){return"sagemaker"}getDefaultModel(){return LEn()}getAISDKModel(){return this.sagemakerModel}async generate(e,t){await this.ensureModelLimits();const r=this.normalizeTextOptions(e);if(vp(r,this.modelName)!=="text")return super.generate(r,t);this.validateOptions(r);const n=await this.getToolsForStream(r),o="disableInternalFallback"in r&&r.disableInternalFallback===!0;return this.runGenerateWithModelFallback(()=>this.withTurnTimeout({...r,tools:n},this.getDescriptorGenerateMs(),i=>this.executeNativeGenerate(i)),o,r)}async executeNativeGenerate(e){const t=Date.now(),r=await this.getAISDKModelWithMiddleware(e);if(!aI(r))throw this.handleProviderError(new Error("sagemaker: model handle exposes no doGenerate()"));const n=async p=>{const m=p.responseFormat,f=await r.doGenerate({...p,...p.maxOutputTokens!==void 0?{maxTokens:p.maxOutputTokens}:{},...m?.type==="json"?{responseFormat:m.schema?{type:"json_schema",json_schema:{name:"response",schema:m.schema}}:{type:"json_object"}}:{}});if(Array.isArray(f.content))return f;const g=[];typeof f.text=="string"&&f.text&&g.push({type:"text",text:f.text}),typeof f.reasoning=="string"&&f.reasoning&&g.push({type:"reasoning",text:f.reasoning});for(const v of Array.isArray(f.toolCalls)?f.toolCalls:[]){if(typeof v!="object"||v===null)continue;const w=v,b=w.function;typeof w.id=="string"&&typeof b?.name=="string"&&g.push({type:"tool-call",toolCallId:w.id,toolName:b.name,input:b.arguments??"{}"})}const y=f.usage;return{...f,content:g,usage:{inputTokens:{total:typeof y?.inputTokens=="number"?y.inputTokens:0},outputTokens:{total:typeof y?.outputTokens=="number"?y.outputTokens:0}}}},i=!e.disableTools&&this.supportsTools()?e.tools||{}:{},s=Object.entries(i).map(([p,m])=>cI(p,m)),a=e.schema?{type:"json",schema:gi(e.schema)}:void 0,l=await this.buildMessagesForStream(e),c=[],u=await M6({doGenerate:n,provider:this.providerName,conversation:l,...a?{responseFormat:a}:{},...s.length>0?{tools:s}:{},toolsRecord:i,...s.length>0&&e.toolChoice?{toolChoice:uI(e,i,!0)}:{},...e.toolChoiceSteps!==void 0?{toolChoiceSteps:e.toolChoiceSteps}:{},...e.prepareStep?{prepareStep:e.prepareStep}:{},modelId:this.modelName,maxSteps:e.maxSteps||gs,...e.maxTokens?{maxOutputTokens:e.maxTokens}:{},...e.temperature!==void 0?{temperature:e.temperature}:{},...e.abortSignal?{abortSignal:e.abortSignal}:{},...e.toolTimeoutMs!==void 0?{toolTimeoutMs:e.toolTimeoutMs}:{},runStep:p=>Fv(p,void 0,"sagemaker generate",void 0,e.abortSignal).catch(m=>{throw this.handleProviderError(m)}),onRejectedToolCall:(p,m,f)=>this.emitRejectedToolCall(p,m,f)},c),d={content:u.text,provider:this.providerName,model:this.modelName,finishReason:u.finishReason,usage:{input:u.inputTokens,output:u.outputTokens,total:u.inputTokens+u.outputTokens},responseTime:Date.now()-t,...u.reasoning?{reasoning:u.reasoning}:{},toolsUsed:u.toolsUsed,toolCalls:sD(c),toolExecutions:nh(e,hd(c)),enhancedWithTools:u.toolsUsed.length>0};return this.finalizeNativeGenerate(d,e,t,c)}async doStream(e){const t=$e.generation.startSpan(_O("stream"),{kind:ln.CLIENT,attributes:{"sagemaker.endpoint":this.modelConfig.endpointName,"sagemaker.region":this.sagemakerConfig.region}}),r={provider:this.providerName,model:this.modelName};try{const n=await this.buildMessagesForStream(e);lc(t,{...r,modelParameters:{temperature:e.temperature,maxTokens:e.maxTokens},input:{messages:n}});const o=await gt.with(Jt.setSpan(gt.active(),t),()=>this.sagemakerModel.doStream({prompt:n,maxTokens:e.maxTokens,temperature:e.temperature}));let i,s;const a=new Promise(u=>{i=u}),l=new Promise(u=>{s=u}),c=XT();return(async()=>{const u=o.stream.getReader();let d=!1,p="",m,f="unknown",g={inputTokens:0,outputTokens:0};try{for(;;){const{done:y,value:v}=await u.read();if(y)break;const w=v;if(w.type==="text-delta"&&w.textDelta){m??=new Date,p+=w.textDelta,c.push({content:w.textDelta});continue}w.type==="finish"&&(d=!0,f=w.finishReason??"stop",g={inputTokens:w.usage?.inputTokens??w.usage?.promptTokens??0,outputTokens:w.usage?.outputTokens??w.usage?.completionTokens??0},i(f),s(g))}c.close(),t.setStatus({code:ze.OK})}catch(y){fw(t,y);try{t.setStatus({code:ze.ERROR,message:y instanceof Error?y.message:String(y)})}catch{}c.error(y)}finally{u.releaseLock(),d||(i("unknown"),s({inputTokens:0,outputTokens:0}));try{lc(t,{...r,output:p,usage:g,finishReason:f,completionStartTime:m})}catch(y){h.debug("[SageMaker] Failed to record the stream generation",{error:y instanceof Error?y.message:String(y)})}finally{t.end()}}})(),{stream:c.iterable,finishReason:a,usage:l,warnings:(o.warnings??[]).map(u=>u.message??String(u))}}catch(n){throw t.setStatus({code:ze.ERROR,message:n instanceof Error?n.message:String(n)}),n instanceof Error&&t.recordException(n),t.end(),this.handleProviderError(n)}}formatProviderError(e){return e instanceof Ho?e:e instanceof Error&&e.name==="TimeoutError"?new Ho("SageMaker request timed out. Consider increasing timeout.",{code:"NETWORK_ERROR",statusCode:408,cause:e,endpoint:this.modelConfig.endpointName}):Qp(e,this.modelConfig.endpointName)}getSageMakerInfo(){return{endpointName:this.modelConfig.endpointName,modelType:this.modelConfig.modelType||"custom",region:this.sagemakerConfig.region,configured:!!(this.sagemakerConfig.accessKeyId&&this.sagemakerConfig.secretAccessKey)}}async testConnection(){try{return!this.sagemakerConfig.accessKeyId||!this.sagemakerConfig.secretAccessKey?{connected:!1,error:"AWS credentials not configured"}:!this.modelConfig.endpointName||this.modelConfig.endpointName==="default-endpoint"?{connected:!1,error:"SageMaker endpoint not configured"}:{connected:!0}}catch(e){return{connected:!1,error:e instanceof Error?e.message:String(e)}}}async getModel(){return this.getAISDKModel()}async testConnectivity(){const e=this.sagemakerModel;return e.testConnectivity?await e.testConnectivity():{success:!1,error:"Test method not available"}}getModelCapabilities(){const e=this.sagemakerModel;return e.getModelCapabilities?e.getModelCapabilities():{capabilities:{streaming:!0,toolCalling:!0,structuredOutput:!0,batchInference:!0,supportedResponseFormats:["text","json_object"],supportedToolTypes:["function"],maxBatchSize:10}}}},N0r=hhe}}),L0r,fhe,ghe,F0r,yhe,vhe,$0r,U0r,whe,B0r,hSn=S({"src/lib/providers/nvidiaNim/client.ts"(){"use strict";lt(),aa(),z(),Ft(),oi(),_u(),hl(),L0r=["unsupported","not supported","does not support","unrecognized","unknown field","unknown parameter","unknown argument","invalid field","invalid parameter","invalid argument"],fhe=(e,t)=>{if(!e)return!1;const r=e.toLowerCase(),n=t.toLowerCase();let o=r.indexOf(n);for(;o!==-1;){const i=Math.max(0,o-80),s=Math.min(r.length,o+n.length+80),a=r.slice(i,s);if(L0r.some(l=>a.includes(l)))return!0;o=r.indexOf(n,o+n.length)}return!1},ghe=(e,t)=>{try{const r=JSON.parse(e);let n=!1;if(t==="chat_template"&&"chat_template"in r&&(delete r.chat_template,n=!0),t==="reasoning_budget"){const o=r.chat_template_kwargs;o&&"reasoning_budget"in o&&(delete o.reasoning_budget,n=!0,Object.keys(o).length===0&&delete r.chat_template_kwargs)}return n?JSON.stringify(r):null}catch{return null}},F0r="https://integrate.api.nvidia.com/v1",yhe=e=>{const t=process.env[e];if(!t)return;const r=Number.parseInt(t,10);return Number.isFinite(r)?r:void 0},vhe=e=>{const t=process.env[e];if(!t)return;const r=Number.parseFloat(t);return Number.isFinite(r)?r:void 0},$0r=(e,t)=>{const r={},n=yhe("NVIDIA_NIM_TOP_K");n!==void 0&&n!==-1&&(r.top_k=n);const o=vhe("NVIDIA_NIM_MIN_P");o!==void 0&&o!==0&&(r.min_p=o);const i=vhe("NVIDIA_NIM_REPETITION_PENALTY");i!==void 0&&i!==1&&(r.repetition_penalty=i);const s=yhe("NVIDIA_NIM_MIN_TOKENS");s!==void 0&&s!==0&&(r.min_tokens=s);const a=process.env.NVIDIA_NIM_CHAT_TEMPLATE;return a&&(r.chat_template=a),e&&(r.chat_template_kwargs={thinking:!0,enable_thinking:!0,...t?{reasoning_budget:t}:{}}),r},U0r=()=>Oa(y6r()),whe=()=>Zi("NVIDIA_NIM_MODEL",er.get("nvidia-nim")?.defaultModel??"openai/gpt-oss-20b"),B0r=class extends Cc{constructor(e,t,r,n){const o=n?.apiKey?.trim(),i=o&&o.length>0?o:U0r(),s=n?.baseURL??process.env.NVIDIA_NIM_BASE_URL??F0r;super("nvidia-nim",e,t,{baseURL:s,apiKey:i}),h.debug("NVIDIA NIM Provider initialized",{modelName:this.modelName,providerName:this.providerName,baseURL:ni(this.config.baseURL)})}getProviderName(){return"nvidia-nim"}getDefaultModel(){return whe()}adjustBuildBodyOptions(e,t){const r=t,n=r.thinkingConfig,o=r.thinkingLevel??n?.thinkingLevel,i=o!==void 0&&o!=="minimal",s=typeof r.maxTokens=="number"?r.maxTokens:void 0,a=$0r(i,s);return Object.keys(a).length>0?{...t,extraBody:a}:t}adjustBodyAfter400(e,t){const r=t.responseBody??"";let n=JSON.stringify(e);const o=[];for(const i of["chat_template","reasoning_budget"])if(fhe(r,i)){const s=ghe(n,i);s!==null&&(n=s,o.push(i))}if(o.length!==0)return h.debug("NVIDIA NIM: 400 rejected request field(s) \u2014 retrying once without them",{strippedFields:o,model:e.model,rejection:r.slice(0,200)}),JSON.parse(n)}formatProviderError(e){const t=[{match:r=>/Invalid API key|Unauthorized/.test(r.message)||Lm(r.message,401),errorClass:en,message:"Invalid NVIDIA NIM API key. Get one at https://build.nvidia.com/settings/api-keys"},{match:r=>/rate limit/.test(r.message)||Lm(r.message,429),errorClass:fs,message:"NVIDIA NIM rate limit exceeded"},{match:r=>r.statusCode===404||/model_not_found/.test(r.message)||Lm(r.message,404),errorClass:ti,message:()=>`NVIDIA NIM model '${this.modelName}' not available. Browse the catalog at https://build.nvidia.com/models`},{match:r=>/quota/.test(r.message)||Lm(r.message,403),errorClass:Je,message:"NVIDIA NIM quota exceeded for your account"},...ec];return Pa(e,t,this.providerName,this.modelName)}async validateConfiguration(){return typeof this.config.apiKey=="string"&&this.config.apiKey.trim().length>0}getConfiguration(){return{provider:this.providerName,model:this.modelName,defaultModel:whe(),baseURL:this.config.baseURL}}}}}),z0r,fSn=S({"src/lib/providers/nvidiaNim/constants.ts"(){"use strict";z0r="https://integrate.api.nvidia.com/v1"}}),G0r={};ce(G0r,{NVIDIA_NIM_DEFAULT_BASE_URL:()=>z0r,NvidiaNimProvider:()=>B0r,isNimFieldRejection:()=>fhe,stripFieldFromJsonBody:()=>ghe});var gSn=S({"src/lib/providers/nvidiaNim/index.ts"(){"use strict";hSn(),fSn()}}),q0r={};ce(q0r,{LMStudioProvider:()=>H0r});var j0r,bhe,The,V0r,H0r,ySn=S({"src/lib/providers/lmStudio.ts"(){"use strict";lt(),aa(),z(),Ft(),_u(),Qme(),j0r="http://localhost:1234/v1",bhe="lm-studio",The="local-model",V0r=()=>process.env.LM_STUDIO_BASE_URL||j0r,H0r=class extends Cc{constructor(e,t,r,n){const o=n?.apiKey??process.env.LM_STUDIO_API_KEY??bhe,i=n?.baseURL??V0r();super("lm-studio",e,t,{baseURL:i,apiKey:o}),h.debug("LM Studio Provider initialized",{modelName:this.modelName,providerName:this.providerName,baseURL:ni(this.config.baseURL)})}getProviderName(){return"lm-studio"}getDefaultModel(){return process.env.LM_STUDIO_MODEL||""}getFallbackModelName(){return The}formatProviderError(e){const t=[Zme(e,()=>`LM Studio server not reachable at ${ni(this.config.baseURL)}. Open the LM Studio app, load a model, and click "Start Server".`),{match:r=>/model_not_found|404/.test(r.message),errorClass:ti,message:()=>`LM Studio model '${this.modelName}' is not loaded. Load it in the LM Studio app first.`},...ec];return Pa(e,t,this.providerName,this.modelName)}async validateConfiguration(){return this.probeModelsEndpoint(this.config.apiKey&&this.config.apiKey!==bhe?{Authorization:`Bearer ${this.config.apiKey}`}:{})}getConfiguration(){return{provider:this.providerName,model:this.modelName||this.resolvedModel||The,defaultModel:this.getDefaultModel(),baseURL:this.config.baseURL}}}}}),W0r={};ce(W0r,{LlamaCppProvider:()=>Y0r});var K0r,J0r,X0r,Y0r,vSn=S({"src/lib/providers/llamaCpp.ts"(){"use strict";lt(),aa(),z(),Ft(),_u(),Qme(),K0r="http://localhost:8080/v1",J0r="llamacpp",X0r=()=>process.env.LLAMACPP_BASE_URL||K0r,Y0r=class extends Cc{constructor(e,t,r,n){const o=n?.baseURL?.trim()||X0r(),i=n?.apiKey?.trim()||process.env.LLAMACPP_API_KEY||J0r;super("llamacpp",e,t,{baseURL:o,apiKey:i}),h.debug("llama.cpp Provider initialized",{modelName:this.modelName,providerName:this.providerName,baseURL:ni(this.config.baseURL)})}async validateConfiguration(){return this.probeModelsEndpoint(this.getAuthHeaders())}getProviderName(){return"llamacpp"}getDefaultModel(){return process.env.LLAMACPP_MODEL||""}getFallbackModelName(){return"loaded-model"}getFallbackModels(){return["loaded-model"]}formatProviderError(e){const t=[Zme(e,()=>`llama.cpp server not reachable at ${ni(this.config.baseURL)}. Start it with: ./llama-server -m model.gguf --port 8080`),{match:r=>r.statusCode===400||r.statusCode===void 0&&/\b400\b/.test(r.message),errorClass:Je,message:"llama.cpp rejected the request. Common cause: model doesn't support tools (start llama-server with --jinja for tool support)."},...ec];return Pa(e,t,this.providerName,this.modelName)}}}});function Z0r(e,t,r,n){const o=typeof e=="object"&&e!==null?e.data:void 0;if(!Array.isArray(o)||o.length===0)throw n(`${r} embeddings response missing data`);if(o.length!==t)throw n(`${r} embeddings response count mismatch: expected ${t}, got ${o.length}`);const i=o.findIndex(a=>!Q0r(a));if(i!==-1)throw n(`${r} embeddings response entry ${i} is not an {index, embedding: number[]} object`);const s=o.slice().sort((a,l)=>a.index-l.index);for(let a=0;a<s.length;a++)if(s[a].index!==a)throw n(`${r} embeddings response has unexpected index ordering: position ${a} has index ${s[a].index}`);return s.map(a=>a.embedding)}var o5,Q0r,_he=S({"src/lib/providers/embeddingResponseParsing.ts"(){"use strict";o5=e=>Array.isArray(e)&&e.length>0&&e.every(t=>typeof t=="number"&&Number.isFinite(t)),Q0r=e=>{if(typeof e!="object"||e===null)return!1;const{embedding:t,index:r}=e;return Number.isInteger(r)&&o5(t)}}}),evr={};ce(evr,{CohereProvider:()=>nvr});var tvr,rvr,Ehe,nvr,wSn=S({"src/lib/providers/cohere.ts"(){"use strict";lt(),aa(),z(),Ft(),on(),oi(),sa(),ef(),_u(),_he(),tvr="https://api.cohere.com/compatibility/v1",rvr=()=>Oa(v6r()),Ehe=()=>Zi("COHERE_MODEL","command-r-plus-08-2024"),nvr=class extends Cc{constructor(e,t,r,n){const o=n?.apiKey?.trim(),i=o&&o.length>0?o:rvr(),s=n?.baseURL?.trim()||process.env.COHERE_BASE_URL?.trim()||tvr;super("cohere",e,t,{baseURL:s,apiKey:i}),h.debug("Cohere Provider initialized",{modelName:this.modelName,providerName:this.providerName,baseURL:ni(this.config.baseURL)})}getProviderName(){return"cohere"}getDefaultModel(){return Ehe()}getFallbackModelName(){return"command-r-08-2024"}getFallbackModels(){return["command-a-03-2025","command-a-reasoning-08-2025","command-r-plus-08-2024","command-r-08-2024","command-r7b-12-2024"]}formatProviderError(e){const t=[{match:r=>/invalid api token|Authentication|401|invalid_api_token/.test(r.message),errorClass:en,message:"Invalid Cohere API key. Check COHERE_API_KEY. Get one at https://dashboard.cohere.com/api-keys"},{match:r=>/rate limit|429/.test(r.message),errorClass:fs,message:"Cohere rate limit exceeded. Back off and retry."},{match:r=>/model_not_found|404/.test(r.message),errorClass:ti,message:()=>`Cohere model '${this.modelName}' not found. Use command-r, command-r-plus, or command-r7b-12-2024.`},{match:r=>/trial limit|trial_limit/.test(r.message),errorClass:Je,message:"Cohere trial usage limit exceeded. Upgrade at https://dashboard.cohere.com/billing."},...ec];return Pa(e,t,this.providerName,this.modelName)}async validateConfiguration(){return typeof this.config.apiKey=="string"&&this.config.apiKey.trim().length>0}getConfiguration(){return{provider:this.providerName,model:this.modelName,defaultModel:Ehe(),baseURL:this.config.baseURL}}getDefaultEmbeddingModel(){return"embed-english-v3.0"}async embed(e,t){if(typeof e!="string"&&e.image)throw new Je(`${this.providerName} does not support image embeddings; provide text input`,this.providerName);const r=typeof e=="string"?e:e.text??"",n=await this.embedMany([r],t);if(!n[0])throw new Je("Cohere /v2/embed returned no embeddings.","cohere");return n[0]}async embedMany(e,t){if(e.length===0)return[];const r=t??this.getDefaultEmbeddingModel(),o=`${Ya(this.config.baseURL.replace(/\/compatibility\/v\d+\/?$/,""))}/v2/embed`,i=96,s=[],a=Nt();for(let l=0;l<e.length;l+=i){const c=e.slice(l,l+i),u=Ra(3e4,this.providerName,"generate");try{const d=await a(o,{method:"POST",headers:{Authorization:`Bearer ${this.config.apiKey}`,"Content-Type":"application/json"},body:JSON.stringify({model:r,texts:c,input_type:"search_document",embedding_types:["float"]}),...u?.controller.signal?{signal:u.controller.signal}:{}});if(!d.ok){const f=await d.text().catch(()=>"");throw this.formatProviderError(new Error(`Cohere /v2/embed failed: ${d.status} \u2014 ${f.slice(0,500)}`))}const p=await d.json(),m=p.embeddings?.float??(Array.isArray(p.embeddings)?p.embeddings:void 0);if(!Array.isArray(m)||m.length!==c.length)throw new Je(`Cohere /v2/embed returned ${Array.isArray(m)?m.length:0} embeddings for ${c.length} inputs.`,"cohere");if(!m.every(o5)){const f=m.findIndex(g=>!o5(g));throw new Je(`Cohere /v2/embed returned an invalid embedding at index ${f}: expected a nonempty array of finite numbers.`,"cohere")}s.push(...m)}finally{u?.cleanup()}}return s}}}}),ovr={};ce(ovr,{VoyageProvider:()=>avr});var ivr,She,svr,i5,avr,bSn=S({async"src/lib/providers/voyage.ts"(){"use strict";Il(),await bu(),_he(),on(),lt(),et(),z(),oi(),ivr="https://api.voyageai.com/v1",She=6e4,svr=()=>Oa(b6r()),i5=()=>Zi("VOYAGE_MODEL","voyage-3.5"),avr=class extends Ga{apiKey;baseURL;proxyFetch;constructor(e,t,r,n){const o=Xh(t)?t:void 0;super(e,"voyage",o);const i=n?.apiKey?.trim();this.apiKey=i&&i.length>0?i:svr(),this.baseURL=n?.baseURL??process.env.VOYAGE_BASE_URL??ivr,this.proxyFetch=Nt(),h.debug("Voyage Provider initialized (embeddings only)",{modelName:this.modelName,baseURL:this.baseURL})}getProviderName(){return this.providerName}getDefaultModel(){return i5()}supportsTools(){return!1}getDefaultEmbeddingModel(){return i5()}getAISDKModel(){throw new Je("Voyage AI is an embedding-only provider; chat completions are not available. Use `embed()` or `embedMany()` instead, or pick a different provider for `generate()` / `stream()`.","voyage")}async executeStream(e,t){throw new Je("Voyage AI is an embedding-only provider; streaming chat is not available. Use `embed()` / `embedMany()`, or pick another provider for `stream()`.","voyage")}formatProviderError(e){const t=e instanceof Error?e.message:typeof e=="string"?e:"Unknown error";return t.includes("401")||t.toLowerCase().includes("unauthorized")||t.includes("invalid_api_key")?new en("Invalid Voyage AI API key. Get one at https://dash.voyageai.com/api-keys","voyage"):t.includes("429")||t.toLowerCase().includes("rate limit")?new fs("Voyage AI rate limit exceeded. Back off and retry.","voyage"):t.includes("404")||t.toLowerCase().includes("model_not_found")?new ti(`Voyage AI model '${this.modelName}' not found. Browse https://docs.voyageai.com/docs/embeddings`,"voyage"):new Je(`Voyage AI error: ${t}`,"voyage")}async embed(e,t){if(typeof e!="string"&&e.image)throw new Je(`${this.providerName} does not support image embeddings; provide text input`,this.providerName);const r=typeof e=="string"?e:e.text??"",n=await this.callEmbeddings([r],t);if(!n[0])throw new Je("Voyage AI returned no embedding for the provided text","voyage");return n[0]}async embedMany(e,t){if(e.length===0)return[];const r=128,n=[];for(let o=0;o<e.length;o+=r){const i=e.slice(o,o+r),s=await this.callEmbeddings(i,t);n.push(...s)}return n}async callEmbeddings(e,t){const r=t??this.modelName;let n;try{n=await Be(this.proxyFetch(`${this.baseURL}/embeddings`,{method:"POST",headers:{Authorization:`Bearer ${this.apiKey}`,"Content-Type":"application/json"},body:JSON.stringify({input:e,model:r})}),She,new Je(`Voyage embeddings request timed out after ${She/1e3}s`,"voyage"))}catch(i){throw i instanceof Je?i:this.formatProviderError(i)}if(!n.ok){const i=await n.text();throw this.formatProviderError(new Error(`Voyage embeddings failed: ${n.status} \u2014 ${i}`))}const o=await n.json();return Z0r(o,e.length,"Voyage",i=>new Je(i,"voyage"))}async validateConfiguration(){return typeof this.apiKey=="string"&&this.apiKey.trim().length>0}getConfiguration(){return{provider:this.providerName,model:this.modelName,defaultModel:i5(),baseURL:this.baseURL}}}}}),lvr={};ce(lvr,{JinaProvider:()=>dvr});var cvr,EI,uvr,s5,dvr,TSn=S({async"src/lib/providers/jina.ts"(){"use strict";Il(),await bu(),_he(),on(),lt(),z(),oi(),cvr="https://api.jina.ai/v1",EI=6e4,uvr=()=>Oa(T6r()),s5=()=>Zi("JINA_MODEL","jina-embeddings-v3"),dvr=class extends Ga{apiKey;baseURL;proxyFetch;constructor(e,t,r,n){const o=Xh(t)?t:void 0;super(e,"jina",o);const i=n?.apiKey?.trim();this.apiKey=i&&i.length>0?i:uvr(),this.baseURL=n?.baseURL??process.env.JINA_BASE_URL??cvr,this.proxyFetch=Nt(),h.debug("Jina Provider initialized (embeddings + reranking)",{modelName:this.modelName,baseURL:this.baseURL})}getProviderName(){return this.providerName}getDefaultModel(){return s5()}supportsTools(){return!1}getDefaultEmbeddingModel(){return s5()}getAISDKModel(){throw new Error("Jina AI is an embeddings + reranking provider; chat completions are not available. Use `embed()` / `embedMany()` / `rerank()`.")}async executeStream(e,t){throw new Error("Jina AI is an embeddings + reranking provider; streaming chat is not available.")}formatProviderError(e){const t=e instanceof Error?e.message:typeof e=="string"?e:"Unknown error";return t.includes("401")||t.toLowerCase().includes("unauthorized")?new en("Invalid Jina AI API key. Get one at https://jina.ai/?sui=apikey","jina"):t.includes("429")||t.toLowerCase().includes("rate limit")?new fs("Jina AI rate limit exceeded. Back off and retry.","jina"):t.includes("404")||t.toLowerCase().includes("model_not_found")?new ti(`Jina AI model '${this.modelName}' not found. See https://jina.ai/embeddings/`,"jina"):new Je(`Jina AI error: ${t}`,"jina")}async embed(e,t){if(typeof e!="string"&&e.image)throw new Je(`${this.providerName} does not support image embeddings; provide text input`,this.providerName);const r=typeof e=="string"?e:e.text??"",n=await this.callEmbeddings([r],t);if(!n[0])throw new Error("Jina AI returned no embedding for the provided text");return n[0]}async embedMany(e,t){return e.length===0?[]:this.callEmbeddings(e,t)}async rerank(e,t,r={}){if(t.length===0)return[];const n=r.model??"jina-reranker-v2-base-multilingual",o=r.credentials,i=o?.apiKey?.trim()||this.apiKey,s=o?.baseURL||this.baseURL,a=new AbortController,l=setTimeout(()=>a.abort(),EI);let c;try{c=await this.proxyFetch(`${s}/rerank`,{method:"POST",headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"},body:JSON.stringify({model:n,query:e,documents:t,top_n:r.topN??t.length}),signal:a.signal})}catch(d){throw d instanceof Error&&d.name==="AbortError"?this.formatProviderError(new Error(`Jina rerank request timed out after ${EI/1e3}s`)):this.formatProviderError(d)}finally{clearTimeout(l)}if(!c.ok){const d=await c.text();throw this.formatProviderError(new Error(`Jina rerank failed: ${c.status} \u2014 ${d}`))}return((await c.json()).results??[]).map(d=>({index:d.index,score:d.relevance_score,document:t[d.index]??d.document?.text??""}))}async callEmbeddings(e,t,r){const n=t??this.modelName,o=r?.apiKey?.trim()||this.apiKey,i=r?.baseURL||this.baseURL,s=new AbortController,a=setTimeout(()=>s.abort(),EI);let l;try{l=await this.proxyFetch(`${i}/embeddings`,{method:"POST",headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"},body:JSON.stringify({input:e,model:n}),signal:s.signal})}catch(u){throw u instanceof Error&&u.name==="AbortError"?this.formatProviderError(new Error(`Jina embeddings request timed out after ${EI/1e3}s`)):this.formatProviderError(u)}finally{clearTimeout(a)}if(!l.ok){const u=await l.text();throw this.formatProviderError(new Error(`Jina embeddings failed: ${l.status} \u2014 ${u}`))}const c=await l.json();return Z0r(c,e.length,"Jina",u=>new Error(u))}async validateConfiguration(){return typeof this.apiKey=="string"&&this.apiKey.trim().length>0}getConfiguration(){return{provider:this.providerName,model:this.modelName,defaultModel:s5(),baseURL:this.baseURL}}}}}),pvr={};ce(pvr,{StabilityProvider:()=>Ahe,default:()=>fvr});var mvr,khe,hvr,xhe,Ahe,fvr,_Sn=S({async"src/lib/providers/stability.ts"(){"use strict";Il(),await bu(),on(),lt(),z(),oi(),mvr="https://api.stability.ai",khe=12e4,hvr=()=>(process.env.STABILITY_API_KEY??process.env.STABILITY_AI_API_KEY??"").trim()||void 0,xhe=()=>Zi("STABILITY_MODEL","stable-image-ultra"),Ahe=class extends Ga{apiKey;baseURL;proxyFetch;constructor(e,t,r,n){const o=Xh(t)?t:void 0;super(e,"stability",o);const i=n?.apiKey?.trim();this.apiKey=i&&i.length>0?i:hvr(),this.baseURL=n?.baseURL??process.env.STABILITY_BASE_URL??mvr,this.proxyFetch=Nt(),h.debug("Stability AI Provider initialized (image-gen only)",{modelName:this.modelName,baseURL:this.baseURL})}getProviderName(){return this.providerName}getDefaultModel(){return xhe()}supportsTools(){return!1}getAISDKModel(){throw new Error("Stability AI is an image-generation-only provider; chat completions are not available.")}async executeStream(e,t){throw new Error("Stability AI is an image-generation-only provider; streaming chat is not available. Use generate({output:{format:'binary'}}) with a Stable Image / SD 3.5 model.")}formatProviderError(e){const t=e instanceof Error?e.message:typeof e=="string"?e:"Unknown error";return t.includes("401")||t.toLowerCase().includes("unauthorized")?new en("Invalid Stability AI API key. Get one at https://platform.stability.ai/account/keys","stability"):t.includes("429")||t.toLowerCase().includes("rate limit")?new fs("Stability AI rate limit exceeded. Back off and retry.","stability"):t.includes("content_filtered")||t.includes("CONTENT_FILTERED")?new Je("Stability AI declined the request due to content policy. Adjust the prompt and retry.","stability"):t.includes("404")?new ti(`Stability AI model '${this.modelName}' not found. Use stable-image-ultra, stable-image-core, sd3.5-large, sd3.5-large-turbo, or sd3.5-medium.`,"stability"):new Je(`Stability AI error: ${t}`,"stability")}async executeImageGeneration(e){const t=Date.now(),r=e.credentials?.stability,n=r?.apiKey?.trim()||this.apiKey;if(!n)throw new Error("Stability AI API key is required. Set STABILITY_API_KEY or pass credentials.stability.apiKey per-call.");const o=n,i=r?.baseURL||this.baseURL,s=e.prompt??e.input?.text??"";if(!s.trim())throw new Error("Stability AI image generation requires a prompt (input.text or prompt)");const a=this.modelName.startsWith("sd3.5-")?"sd3":this.modelName==="stable-image-ultra"?"ultra":this.modelName==="stable-image-core"?"core":this.modelName,l=e,c=new FormData;c.append("prompt",s),c.append("output_format","png"),l.aspectRatio&&c.append("aspect_ratio",String(l.aspectRatio)),l.negativePrompt&&c.append("negative_prompt",l.negativePrompt),this.modelName.startsWith("sd3.5-")&&c.append("model",this.modelName),l.seed!==void 0&&c.append("seed",String(l.seed));const u=new AbortController,d=setTimeout(()=>u.abort(),khe);let p;try{p=await this.proxyFetch(`${i}/v2beta/stable-image/generate/${a}`,{method:"POST",headers:{Authorization:`Bearer ${o}`,Accept:"application/json"},body:c,signal:u.signal})}catch(g){throw g instanceof Error&&g.name==="AbortError"?this.formatProviderError(new Error(`Stability image-gen request timed out after ${khe/1e3}s`)):this.formatProviderError(g)}finally{clearTimeout(d)}if(!p.ok){const g=await p.text();throw this.formatProviderError(new Error(`Stability image-gen failed: ${p.status} \u2014 ${g}`))}const m=await p.json();if(!m.image)throw new Error(`Stability AI returned no image (finish_reason: ${m.finish_reason??"unknown"})`);const f=Date.now()-t;return h.info(`[StabilityProvider] Generated image (${m.image.length} base64 chars) in ${f}ms \u2014 model ${this.modelName}`),{content:s,provider:this.providerName,model:this.modelName,usage:{input:0,output:1e3,total:1e3},imageOutput:{base64:m.image}}}async validateConfiguration(){return this.apiKey!==void 0&&this.apiKey.trim().length>0}getConfiguration(){return{provider:this.providerName,model:this.modelName,defaultModel:xhe(),baseURL:this.baseURL}}},fvr=Ahe}}),gvr={};ce(gvr,{IdeogramProvider:()=>Rhe,default:()=>wvr});var yvr,Che,vvr,Ihe,Rhe,wvr,ESn=S({async"src/lib/providers/ideogram.ts"(){"use strict";Il(),await bu(),on(),lt(),z(),oi(),Ta(),Md(),yvr="https://api.ideogram.ai",Che=12e4,vvr=()=>Oa(_6r()),Ihe=()=>Zi("IDEOGRAM_MODEL","V_3"),Rhe=class extends Ga{apiKey;baseURL;proxyFetch;constructor(e,t,r,n){const o=Xh(t)?t:void 0;super(e,"ideogram",o);const i=n?.apiKey?.trim();this.apiKey=i&&i.length>0?i:vvr(),this.baseURL=n?.baseURL??process.env.IDEOGRAM_BASE_URL??yvr,this.proxyFetch=Nt(),h.debug("Ideogram Provider initialized (image-gen only)",{modelName:this.modelName,baseURL:this.baseURL})}getProviderName(){return this.providerName}getDefaultModel(){return Ihe()}supportsTools(){return!1}getAISDKModel(){throw new Error("Ideogram is an image-generation-only provider; chat completions are not available.")}async executeStream(e,t){throw new Error("Ideogram is an image-generation-only provider; streaming chat is not available.")}formatProviderError(e){const t=e instanceof Error?e.message:typeof e=="string"?e:"Unknown error";return t.includes("401")||t.toLowerCase().includes("unauthorized")?new en("Invalid Ideogram API key. Get one at https://developer.ideogram.ai/","ideogram"):t.includes("429")||t.toLowerCase().includes("rate limit")?new fs("Ideogram rate limit exceeded. Back off and retry.","ideogram"):t.includes("safety")||t.includes("is_image_safe")?new Je("Ideogram declined the request due to safety filters. Adjust the prompt and retry.","ideogram"):new Je(`Ideogram error: ${t}`,"ideogram")}async executeImageGeneration(e){const t=Date.now(),r=e.credentials?.ideogram,n=r?.apiKey?.trim()||this.apiKey,o=r?.baseURL||this.baseURL,i=e.prompt??e.input?.text??"";if(!i.trim())throw new Error("Ideogram image generation requires a prompt (input.text or prompt)");const s=e,a={prompt:i,model:this.modelName,magic_prompt:s.magicPrompt??"AUTO"};s.aspectRatio&&(a.aspect_ratio=s.aspectRatio),s.negativePrompt&&(a.negative_prompt=s.negativePrompt),s.seed!==void 0&&(a.seed=s.seed),s.style&&(a.style_type=s.style);const l=new AbortController,c=setTimeout(()=>l.abort(),Che);let u;try{u=await this.proxyFetch(`${o}/v1/ideogram-v3/generate`,{method:"POST",headers:{"Api-Key":n,"Content-Type":"application/json"},body:JSON.stringify(a),signal:l.signal})}catch(y){throw y instanceof Error&&y.name==="AbortError"?this.formatProviderError(new Error(`Ideogram image-gen request timed out after ${Che/1e3}s`)):this.formatProviderError(y)}finally{clearTimeout(c)}if(!u.ok){const y=await u.text();throw this.formatProviderError(new Error(`Ideogram image-gen failed: ${u.status} \u2014 ${y}`))}const p=(await u.json()).data?.[0]?.url;if(!p)throw new Error("Ideogram returned no image URL");const m=await zp(p,{label:"Ideogram image",maxBytes:Hh,timeoutMs:6e4}),f=m.toString("base64"),g=Date.now()-t;return h.info(`[IdeogramProvider] Generated image (${m.length} bytes) in ${g}ms \u2014 model ${this.modelName}`),{content:i,provider:this.providerName,model:this.modelName,usage:{input:0,output:1e3,total:1e3},imageOutput:{base64:f}}}async validateConfiguration(){return typeof this.apiKey=="string"&&this.apiKey.trim().length>0}getConfiguration(){return{provider:this.providerName,model:this.modelName,defaultModel:Ihe(),baseURL:this.baseURL}}},wvr=Rhe}}),bvr={};ce(bvr,{ReplicateProvider:()=>_vr});function SSn(e){const t=e,r=t.prompt??t.input?.text??"",n=t.systemPrompt;return n?`${n}
2214
2214
 
2215
- ${r}`:r}function Tvr(e){return typeof e=="string"?e:Array.isArray(e)?e.map(t=>typeof t=="string"?t:"").join(""):""}function Mhe(e){const t=e?.apiKey?.trim()||e?.apiToken?.trim(),r=e?.baseURL||e?.baseUrl;return{apiToken:t,baseUrl:r}}var Phe,_vr,kSn=S({async"src/lib/providers/replicate.ts"(){"use strict";Il(),th(),D$(),L$(),Ta(),await bu(),Tl(),Cr(),z(),et(),oi(),Phe=()=>Zi("REPLICATE_MODEL","meta/meta-llama-3-70b-instruct"),_vr=class extends Ga{apiToken;baseURL;constructor(e,t,r,n){const o=Xh(t)?t:void 0;super(e,"replicate",o);const{apiToken:i,baseUrl:s}=Mhe(n);this.apiToken=i&&i.length>0?i:Oa(w6r()),this.baseURL=s,h.debug("Replicate Provider initialized",{modelName:this.modelName,baseURL:this.baseURL})}getProviderName(){return this.providerName}getDefaultModel(){return Phe()}supportsTools(){return!1}getAISDKModel(){throw new Error("Replicate routes through the predictions API, not the AI SDK chat models. Streaming uses the predict-then-stream path inside executeStream.")}async generate(e,t){const r=typeof e=="string"?{prompt:e}:e,n=vp(r,this.modelName);if(n==="video"||n==="avatar"||n==="music"||n==="image")return super.generate(r,t);if(r.output?.format==="json"||r.output?.format==="structured"||t!=null)throw new Me({code:je.PROVIDER_NOT_AVAILABLE,message:"Replicate models do not support structured-output / JSON schema. Remove output.format or _analysisSchema, or use a provider that implements the OpenAI chat-completions contract (e.g. openai, anthropic).",category:"validation",severity:"medium",retriable:!1});const o=r.prompt??r.input?.text??"",i=Date.now(),s=await this.executeStream({input:{text:o},systemPrompt:r.systemPrompt,maxTokens:r.maxTokens,temperature:r.temperature,abortSignal:r.abortSignal,timeout:r.timeout});let a="";for await(const c of s.stream)"content"in c&&typeof c.content=="string"&&(a+=c.content);const l={content:a,provider:this.providerName,model:this.modelName,usage:{input:0,output:0,total:0}};return h.info(`[ReplicateProvider] generate() complete in ${Date.now()-i}ms \u2014 ${a.length} chars`),l}async executeStream(e,t){const r=Date.now(),n=e.credentials?.replicate,o=Mhe(n),i=o.apiToken||this.apiToken,s=o.baseUrl||this.baseURL,a=Wh({apiToken:i,baseUrl:s});if(!a)throw new Me({code:je.MISSING_CONFIGURATION,message:"Replicate auth could not be resolved (REPLICATE_API_TOKEN missing).",category:"configuration",severity:"high",retriable:!1});const l=SSn(e);if(!l.trim())throw new Me({code:je.INVALID_PARAMETERS,message:"Replicate predictions require a prompt (input.text or prompt)",category:"validation",severity:"medium",retriable:!1});const c={prompt:l,...e.maxTokens!==void 0&&{max_new_tokens:e.maxTokens},temperature:e.temperature,top_p:1};let u;try{const m={provider:this.providerName,model:this.modelName};u=await Ym({...m,modelParameters:{temperature:e.temperature,maxTokens:e.maxTokens,topP:1},input:{prompt:l}},async f=>{const g=await UC(a,{model:this.modelName,input:c},{abortSignal:e.abortSignal});return lc(f,{...m,output:Tvr(g.output)}),g})}catch(m){throw this.handleProviderError(m)}const d=Tvr(u.output);if(!d)throw new Error(`Replicate prediction ${u.id} returned empty output`);const p={async*[Symbol.asyncIterator](){yield{content:d}}};return h.info(`[ReplicateProvider] Generated ${d.length} chars in ${Date.now()-r}ms \u2014 model ${this.modelName} (prediction ${u.id})`),{stream:p,provider:this.providerName,model:this.modelName,finishReason:"stop",metadata:{startTime:r,streamId:`replicate-${u.id}`}}}async executeImageGeneration(e){const t=Date.now(),r=e.credentials?.replicate,n=Mhe(r),o=n.apiToken||this.apiToken,i=n.baseUrl||this.baseURL,s=Wh({apiToken:o,baseUrl:i});if(!s)throw new Me({code:je.MISSING_CONFIGURATION,message:"Replicate auth could not be resolved (REPLICATE_API_TOKEN missing).",category:"configuration",severity:"high",retriable:!1});const a=e.prompt??e.input?.text??"";if(!a.trim())throw new Me({code:je.INVALID_PARAMETERS,message:"Replicate image-gen requires a prompt",category:"validation",severity:"medium",retriable:!1});const l=e,c={prompt:a,output_format:"png"};l.aspectRatio&&(c.aspect_ratio=l.aspectRatio),l.negativePrompt&&(c.negative_prompt=l.negativePrompt),l.seed!==void 0&&(c.seed=l.seed);let u;try{u=await UC(s,{model:this.modelName,input:c},{abortSignal:e.abortSignal})}catch(m){throw this.handleProviderError(m)}let d;try{d=await N$(u,Hh)}catch(m){throw this.handleProviderError(m)}const p=d.toString("base64");return h.info(`[ReplicateProvider] Generated image (${d.length} bytes) in ${Date.now()-t}ms \u2014 model ${this.modelName}`),{content:a,provider:this.providerName,model:this.modelName,usage:{input:0,output:0,total:0},imageOutput:{base64:p}}}formatProviderError(e){const t=e instanceof Error?e.message:typeof e=="string"?e:"Unknown error",r=e instanceof Error?e:void 0;return t.includes("401")||t.toLowerCase().includes("unauthorized")||t.toLowerCase().includes("invalid token")?new Me({code:je.PROVIDER_AUTH_FAILED,message:"Invalid Replicate API token. Get one at https://replicate.com/account/api-tokens",category:"configuration",severity:"high",retriable:!1,context:{provider:"replicate"},originalError:r}):t.includes("402")||t.toLowerCase().includes("insufficient credit")?new Me({code:je.PROVIDER_QUOTA_EXCEEDED,message:"Replicate insufficient credit. Top up at https://replicate.com/account/billing \u2014 most image/music models require a paid balance.",category:"resource",severity:"high",retriable:!1,context:{provider:"replicate"},originalError:r}):t.includes("429")||t.toLowerCase().includes("rate limit")?new Me({code:je.PROVIDER_QUOTA_EXCEEDED,message:"Replicate rate limit exceeded. Back off and retry.",category:"resource",severity:"high",retriable:!0,context:{provider:"replicate"},originalError:r}):t.toLowerCase().includes("not found")||t.includes("404")?new Me({code:je.PROVIDER_NOT_AVAILABLE,message:`Replicate model '${this.modelName}' not found. Use owner/name or owner/name:version format. Browse https://replicate.com/explore`,category:"validation",severity:"medium",retriable:!1,context:{provider:"replicate",model:this.modelName},originalError:r}):new Me({code:je.PROVIDER_NOT_AVAILABLE,message:`Replicate error: ${t}`,category:"execution",severity:"high",retriable:!1,context:{provider:"replicate"},originalError:r})}async validateConfiguration(){return typeof this.apiToken=="string"&&this.apiToken.trim().length>0}getConfiguration(){return{provider:this.providerName,model:this.modelName,defaultModel:Phe(),baseURL:this.baseURL}}}}}),Evr={};ce(Evr,{RecraftProvider:()=>Nhe,default:()=>xvr});var Svr,Ohe,kvr,Dhe,Nhe,xvr,xSn=S({async"src/lib/providers/recraft.ts"(){"use strict";Il(),await bu(),on(),lt(),z(),oi(),Ta(),Md(),qT(),Svr="https://external.api.recraft.ai/v1",Ohe=12e4,kvr=()=>Oa(E6r()),Dhe=()=>Zi("RECRAFT_MODEL","recraftv3"),Nhe=class extends Ga{apiKey;baseURL;proxyFetch;constructor(e,t,r,n){const o=Xh(t)?t:void 0;super(e,"recraft",o);const i=n?.apiKey?.trim();this.apiKey=i&&i.length>0?i:kvr(),this.baseURL=n?.baseURL??process.env.RECRAFT_BASE_URL??Svr,this.proxyFetch=Nt(),h.debug("Recraft Provider initialized (image-gen only)",{modelName:this.modelName,baseURL:this.baseURL})}getProviderName(){return this.providerName}getDefaultModel(){return Dhe()}supportsTools(){return!1}getAISDKModel(){throw new Error("Recraft is an image-generation-only provider; chat completions are not available.")}async executeStream(e,t){throw new Error("Recraft is an image-generation-only provider; streaming chat is not available.")}formatProviderError(e){const t=e instanceof Error?e.message:typeof e=="string"?e:"Unknown error";return t.includes("401")||t.toLowerCase().includes("unauthorized")?new en("Invalid Recraft API key. Get one at https://www.recraft.ai/api","recraft"):t.includes("429")||t.toLowerCase().includes("rate limit")?new fs("Recraft rate limit exceeded. Back off and retry.","recraft"):t.includes("404")||t.includes("model_not_found")?new ti(`Recraft model '${this.modelName}' not found. Use recraftv3, recraftv3-svg, or recraftv2.`,"recraft"):new Je(`Recraft error: ${t}`,"recraft")}async executeImageGeneration(e){const t=Date.now(),r=e.credentials?.recraft,n=r?.apiKey?.trim()||this.apiKey,o=r?.baseURL||this.baseURL,i=e.prompt??e.input?.text??"";if(!i.trim())throw new Error("Recraft image generation requires a prompt (input.text or prompt)");const s=e,a={model:e.model??this.modelName,prompt:i,n:1,response_format:"b64_json"};s.negativePrompt&&(a.negative_prompt=s.negativePrompt),s.style&&(a.style=s.style),s.styleId&&(a.style_id=s.styleId),s.size&&(a.size=s.size);const l=new AbortController,c=setTimeout(()=>l.abort(),Ohe);let u;try{u=await this.proxyFetch(`${o}/images/generations`,{method:"POST",headers:{Authorization:`Bearer ${n}`,"Content-Type":"application/json"},body:JSON.stringify(a),signal:l.signal})}catch(g){throw g instanceof Error&&g.name==="AbortError"?this.formatProviderError(new Error(`Recraft image-gen request timed out after ${Ohe/1e3}s`)):this.formatProviderError(g)}finally{clearTimeout(c)}if(!u.ok){const g=await u.text();throw this.formatProviderError(new Error(`Recraft image-gen failed: ${u.status} \u2014 ${g}`))}const p=(await u.json()).data?.[0];if(!p)throw new Error("Recraft returned no image data");let m;if(p.b64_json)m=p.b64_json;else if(p.url)m=(await zp(p.url,{label:"Recraft image",maxBytes:Hh,timeoutMs:6e4})).toString("base64");else throw new Error("Recraft response missing both b64_json and url");const f=Date.now()-t;return h.info(`[RecraftProvider] Generated image (${m.length} base64 chars) in ${f}ms \u2014 model ${this.modelName}`),{content:i,provider:this.providerName,model:this.modelName,usage:{input:0,output:1e3,total:1e3},imageOutput:{base64:m,mimeType:tI(Buffer.from(m.slice(0,64),"base64"))}}}async validateConfiguration(){return typeof this.apiKey=="string"&&this.apiKey.trim().length>0}getConfiguration(){return{provider:this.providerName,model:this.modelName,defaultModel:Dhe(),baseURL:this.baseURL}}},xvr=Nhe}}),Avr={};ce(Avr,{TYPESAFE_MAX_REQUEST_TOKENS:()=>l5,TYPESAFE_MAX_STATE_TOKENS:()=>a5,TypeSafeProvider:()=>Nvr});function ASn(e){if(!Fr(e)||!Fr(e.providerMetadata))return{};const t=e.providerMetadata.typesafe;if(!Fr(t)||!Fr(t.confidence))return{};const r={};for(const[n,o]of Object.entries(t.confidence)){const i=vs(o);i!==void 0&&(r[n]=i)}return r}function CSn(e,t,r,n){const o=typeof t.type=="string"?t.type:void 0,i=(o?Dvr[o]:void 0)??(e===401||e===403?"authentication":e===429?"rate_limit":e>=500?"server":"invalid_request"),s=typeof t.message=="string"&&t.message.length>0?t.message:o??`AI Gateway request failed with HTTP ${e}`;return{kind:i,message:s,status:e,requestId:r,retryable:n}}function Cvr(e,t,r){const n=e===429||e===529||e>=500,o=Fr(t)&&Fr(t.error)?t.error:void 0;if(o)return CSn(e,o,r,n);const i=Fr(t)?t.detail:void 0;if(Array.isArray(i))return{kind:"invalid_request",message:`Request failed validation \u2014 ${$mr(i)}`,status:e,requestId:r,retryable:!1};const s=Fr(i)&&typeof i.error_type=="string"?i.error_type:void 0,a=s==="max_tokens_exceeded"?"max_tokens_exceeded":e===401||e===403?"authentication":e===429?"rate_limit":e===529?"overloaded":e>=500?"server":"invalid_request",l=a==="max_tokens_exceeded"?`State plus questions exceeded the model's input limit: keep state plus the longest single question under ~${a5} tokens, and state plus all questions under ~${l5}.`:s??`TypeSafe request failed with HTTP ${e}`,c=Fr(i)&&typeof i.message=="string"?i.message:l;return{kind:a,message:c,status:e,requestId:r,retryable:n}}var Ivr,Rvr,Mvr,Pvr,Ovr,a5,l5,Dvr,Nvr,Lvr=S({async"src/lib/providers/typesafe.ts"(){"use strict";z(),Ft(),oi(),await VT(),Ivr="https://api.typesafe.ai",Rvr="https://ai-gateway.vercel.sh/v4/ai/evaluation-model",Mvr="typesafe-ai/jev",Pvr="0.0.1",Ovr="4",a5=33e3,l5=64e3,Dvr={authentication_error:"authentication",customer_verification_required:"authentication",invalid_request_error:"invalid_request",rate_limit_exceeded:"rate_limit",internal_server_error:"server"},Nvr=class extends rI{apiKey;baseURL;gatewayURL;transport;constructor(e,t,r,n){super(e,"typesafe",t);const o=n?.apiKey?.trim()||(process.env.TYPESAFE_API_KEY?.trim()??""),i=n?.gatewayApiKey?.trim()||(process.env.AI_GATEWAY_API_KEY?.trim()??""),s=n?.transport??process.env.TYPESAFE_TRANSPORT?.trim();this.transport=s==="gateway"||s==="direct"?s:!o&&i?"gateway":"direct",this.apiKey=this.transport==="gateway"?i:o,this.baseURL=(n?.baseURL??process.env.TYPESAFE_BASE_URL??Ivr).replace(/\/+$/,""),this.gatewayURL=(n?.gatewayURL?.trim()||process.env.TYPESAFE_GATEWAY_URL?.trim()||Rvr).replace(/\/+$/,""),h.debug("TypeSafe Provider initialized (decide only)",{modelName:this.modelName,transport:this.transport,baseURL:nr(this.transport==="gateway"?this.gatewayURL:this.baseURL)})}getDefaultModel(){return Zi("TYPESAFE_MODEL","jev-latest")}vendorLabel(){return"TypeSafe"}vendorDisplayName(){return"TypeSafe (Jev)"}decisionApiKey(){return this.apiKey}missingKeyMessage(){return this.transport==="gateway"?"The TypeSafe gateway transport requires a Vercel AI Gateway key. Set AI_GATEWAY_API_KEY or pass credentials.typesafe.gatewayApiKey.":"TypeSafe requires an API key. Set TYPESAFE_API_KEY or pass credentials.typesafe.apiKey."}encodeQuestion(e){return this.transport==="gateway"?e:super.encodeQuestion(e)}buildDecisionBody(e,t,r){return this.transport==="gateway"?{state:e,questions:t}:{model:r,state:e,questions:t}}parseDecisionError(e,t,r){return Cvr(e,t,r)}reportedConfidence(e){return ASn(e)}readRequestId(e){return e.get("x-typesafe-request-id")??void 0}diagnosticContext(){return{transport:this.transport}}decisionEndpoint(){return this.transport==="gateway"?this.gatewayURL:`${this.baseURL}/v1/systemone`}decisionHeaders(){const e={Authorization:`Bearer ${this.apiKey}`,"Content-Type":"application/json"};return this.transport==="gateway"?{...e,"ai-gateway-auth-method":"api-key","ai-gateway-protocol-version":Pvr,"ai-model-id":Mvr,"ai-evaluation-model-specification-version":Ovr}:e}getDecisionTransport(){return this.transport}async listDecisionModels(){if(this.transport==="gateway")throw this.decisionError({kind:"invalid_request",message:"Model listing is a TypeSafe API operation; the gateway transport has no equivalent endpoint.",retryable:!1});const e=await this.proxyFetch(`${this.baseURL}/v1/models`,{headers:{Authorization:`Bearer ${this.apiKey}`},signal:AbortSignal.timeout(this.defaultTimeout??ype)}),t=await e.json().catch(()=>null);if(!e.ok)throw this.decisionError(Cvr(e.status,t,e.headers.get("x-typesafe-request-id")??void 0));return(Fr(t)&&Array.isArray(t.models)?t.models:[]).filter(Fr).map(n=>({name:typeof n.name=="string"?n.name:"",description:typeof n.description=="string"?n.description:"",releaseDate:typeof n.release_date=="string"?n.release_date:""}))}}}}),Fvr={};ce(Fvr,{PerplexityDeciderProvider:()=>Hvr});function ISn(e){return e.replace(/\/+$/,"").replace(/\/v1$/i,"")}function $vr(e){const t=`Set PERPLEXITY_DECIDER_BASE_URL or pass credentials.perplexityDecider.baseURL to an origin, or leave both unset to use ${Lhe}.`;try{const r=new URL(e);if(r.protocol!=="https:"&&r.protocol!=="http:")return`The Perplexity base URL must start with https:// or http://. ${t}`;const n=dj(r,"Perplexity",t);return n||(r.username||r.password||r.search||r.hash?`The Perplexity base URL must not carry credentials, a query string or a fragment. ${t}`:void 0)}catch{return`The Perplexity base URL is not a valid absolute URL. ${t}`}}function RSn(e){try{return new URL(e).hostname===zvr}catch{return!1}}function MSn(e,t){return e===401?"authentication":e===413||e===400&&Vvr.test(t)?"max_tokens_exceeded":e===429?"rate_limit":e===503?"overloaded":e>=500?"server":"invalid_request"}function PSn(e){if(!Fr(e)||!Fr(e.error))return;const{message:t,param:r}=e.error;if(!(typeof t!="string"||t.length===0))return typeof r=="string"&&r!==""&&!t.includes(r)?`${t} (field: ${r})`:t}function OSn(e){return e.length>=24&&e.toString("ascii",12,16)==="IHDR"?{width:e.readUInt32BE(16),height:e.readUInt32BE(20)}:void 0}function DSn(e){let t=2;for(;t+4<=e.length;){if(e[t]!==255)return;const r=e[t+1];if(r===255)t+=1;else if(r===1||r>=208&&r<=216)t+=2;else{if(r===217||r===218)return;if(r>=192&&r<=207&&r!==196&&r!==200&&r!==204)return t+9<=e.length?{height:e.readUInt16BE(t+5),width:e.readUInt16BE(t+7)}:void 0;t+=2+e.readUInt16BE(t+2)}}}function NSn(e){if(!(e.length<30))switch(e.toString("ascii",12,16)){case"VP8X":return{width:1+e.readUIntLE(24,3),height:1+e.readUIntLE(27,3)};case"VP8L":{const t=e.readUInt32LE(21);return e[20]===47?{width:(t&16383)+1,height:(t>>>14&16383)+1}:void 0}case"VP8 ":return{width:e.readUInt16LE(26)&16383,height:e.readUInt16LE(28)&16383};default:return}}function LSn(e){switch(eI(e)){case"image/png":return OSn(e);case"image/jpeg":return DSn(e);case"image/webp":return NSn(e);default:return}}function FSn(e,t){const r=/^data:([a-z]+\/[a-z0-9.+-]+);base64,/i.exec(e);if(!r||!qvr.has(r[1].toLowerCase()))return`Image ${t} is not a PNG, JPEG or WebP image, the only formats Perplexity reads.`;const n=LSn(Buffer.from(e.slice(r[0].length),"base64"));return n&&Math.round(n.width/SI)*Math.round(n.height/SI)>Fhe?`Image ${t} is ${n.width}x${n.height} pixels; Perplexity reads at most ${Fhe} tiles of ${SI}x${SI} pixels per image (1440x1440 and 2048x1024 fit), and a larger one stalls until the request times out. Resize it first.`:void 0}function Uvr(e){return typeof e=="number"||typeof e=="boolean"?String(e):e}var Lhe,Bvr,zvr,Gvr,qvr,SI,Fhe,jvr,Vvr,Hvr,$Sn=S({async"src/lib/providers/perplexityDecider.ts"(){"use strict";qT(),z(),Ft(),oi(),pj(),await VT(),Lhe="https://api.perplexity.ai",Bvr="/v1/decisions",zvr="api.perplexity.ai",Gvr="neurolink",qvr=new Set(["image/png","image/jpeg","image/webp"]),SI=32,Fhe=2048,jvr=100,Vvr=/exceeds(?: or equals)?(?: model's)? maximum context length/i,Hvr=class extends rI{apiKey;baseURL;constructor(e,t,r,n){super(e,"perplexity-decider",t),this.apiKey=n?.apiKey?.trim()||(process.env.PERPLEXITY_API_KEY?.trim()??""),this.baseURL=ISn(n?.baseURL?.trim()||process.env.PERPLEXITY_DECIDER_BASE_URL?.trim()||Lhe),h.debug("Perplexity decision provider initialized (decide only)",{modelName:this.modelName,baseURL:$vr(this.baseURL)?"(invalid)":nr(this.baseURL)})}getDefaultModel(){return Zi("PERPLEXITY_DECIDER_MODEL","pplx-decider-v1-27b")}vendorLabel(){return"Perplexity"}vendorDisplayName(){return"Perplexity Decisions"}decisionApiKey(){return this.apiKey}missingKeyMessage(){return"Perplexity requires an API key. Set PERPLEXITY_API_KEY or pass credentials.perplexityDecider.apiKey."}missingConfigMessage(){return $vr(this.baseURL)}decisionEndpoint(){return`${this.baseURL}${Bvr}`}decisionHeaders(){return{Authorization:`Bearer ${this.apiKey}`,"Content-Type":"application/json",...RSn(this.baseURL)?{"X-Pplx-Integration":Gvr}:{}}}buildDecisionBody(e,t,r,n){const o=n?.images??[];if(o.length===0)return{model:r,state:Uvr(e),questions:t};o.forEach((s,a)=>{const l=FSn(s,a+1);if(l)throw this.decisionError({kind:"invalid_request",message:l,retryable:!1})});const i=Array.isArray(e)?e:e===""?[]:[Uvr(e)];return{model:r,state:[...i,...o.map(s=>({type:"image_url",image_url:{url:s}}))],questions:t}}parseDecisionError(e,t,r){const n=`Perplexity request failed with HTTP ${e}`,o=jT(PSn(t)??n,this.apiKey).replace(/\bpplx-[A-Za-z0-9_-]{30,}/g,"[redacted]").trim()||n,i=MSn(e,o);return{kind:i,message:o,status:e,requestId:r,retryable:i==="rate_limit"||i==="overloaded"||i==="server"}}readRequestId(e){return e.get("x-request-id")??void 0}defaultTimeoutMs(e){const t=this.getDescriptorDecideMs();return t===void 0?void 0:t+e*jvr}readRetryAfterMs(e){const t=e.get("retry-after")?.trim();if(!t)return;const r=/^\d+$/.test(t)?Number(t)*1e3:Date.parse(t)-Date.now();return Number.isFinite(r)&&r>0?Math.ceil(r):void 0}}}}),Wvr={};ce(Wvr,{CloudflareClefProvider:()=>owr});function USn(e){return e.replace(/\/+$/,"")}function Kvr(e){const t=`Set CLOUDFLARE_CLEF_BASE_URL or pass credentials.cloudflareClef.baseURL to a base URL, or leave both unset to use ${$he}.`;try{const r=new URL(e);if(r.protocol!=="https:"&&r.protocol!=="http:")return`The Cloudflare base URL must start with https:// or http://. ${t}`;const n=dj(r,"Cloudflare",t);return n||(r.username||r.password||r.search||r.hash||/[?#]/.test(e)?`The Cloudflare base URL must not carry credentials, a query string or a fragment. ${t}`:void 0)}catch{return`The Cloudflare base URL is not a valid absolute URL. ${t}`}}function Jvr(e){const t=e.trim().replace(/^@cf\/cloudflare\//i,"");return/^[a-z0-9][a-z0-9._-]*$/i.test(t)?t.toLowerCase():void 0}function BSn(e,t){const r=/^data:([a-z]+\/[a-z0-9.+-]+);base64,/i.exec(e)?.[1]?.toLowerCase();return r&&Qvr.has(r)?void 0:`Image ${t} is not a PNG, JPEG or WebP image, the only formats Cloudflare Clef reads.`}function zSn(e){return typeof e=="number"||typeof e=="boolean"?String(e):e}function GSn(e){if(!Fr(e)||!Array.isArray(e.errors))return;const t=e.errors.find(Fr);if(!t||typeof t.message!="string"||t.message==="")return;let r=t.message.slice(0,nwr).trimEnd(),n;const o=ewr.exec(r);if(o&&(n=o[1],r=r.slice(0,o.index).trimEnd()),r=r.replace(/^(?:AiError:\s*|Ai:\s*)+/,"").trim(),r.startsWith("{"))try{const i=JSON.parse(r);if(Fr(i)&&Fr(i.error)){const s=Fr(i.error.details)?i.error.details:void 0,a=Fr(s?.fieldErrors)?Object.entries(s.fieldErrors).flatMap(([c,u])=>Array.isArray(u)?u.filter(d=>typeof d=="string").map(d=>`${c}: ${d}`):[]):[],l=typeof i.error.message=="string"?i.error.message:r;r=a.length>0?`${l}: ${a.join("; ")}`:l}}catch{}return{message:r,code:typeof t.code=="number"?t.code:void 0,requestId:n}}function qSn(e,t){return e===401?"authentication":e===413||t===5021?"max_tokens_exceeded":e===429?"rate_limit":e===503?"overloaded":e>=500?"server":"invalid_request"}var $he,Xvr,Yvr,Zvr,Qvr,ewr,twr,rwr,nwr,owr,jSn=S({async"src/lib/providers/cloudflareClef.ts"(){"use strict";z(),Ft(),oi(),pj(),await VT(),$he="https://api.cloudflare.com/client/v4",Xvr="@cf/cloudflare/",Yvr=250,Zvr=/^[A-Za-z0-9_-]{1,64}$/,Qvr=new Set(["image/png","image/jpeg","image/webp"]),ewr=/\(([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\)\s*$/i,twr=500,rwr=4006,nwr=4096,owr=class extends rI{apiKey;accountId;baseURL;constructor(e,t,r,n){super(e,"cloudflare-clef",t);const o=!!n?.baseURL?.trim();this.apiKey=n?.apiKey?.trim()||(o?"":process.env.CLOUDFLARE_API_KEY?.trim()??""),this.accountId=n?.accountId?.trim()||(process.env.CLOUDFLARE_ACCOUNT_ID?.trim()??""),this.baseURL=USn(n?.baseURL?.trim()||process.env.CLOUDFLARE_CLEF_BASE_URL?.trim()||$he),h.debug("Cloudflare Clef decision provider initialized (decide only)",{modelName:this.modelName,baseURL:Kvr(this.baseURL)?"(invalid)":nr(this.baseURL),accountConfigured:this.accountId!==""})}getDefaultModel(){return Zi("CLOUDFLARE_CLEF_MODEL","clef")}vendorLabel(){return"Cloudflare"}vendorDisplayName(){return"Cloudflare Clef"}decisionApiKey(){return this.apiKey}missingKeyMessage(){return"Cloudflare Clef requires an API token with Workers AI permission. Set CLOUDFLARE_API_KEY or pass credentials.cloudflareClef.apiKey."}missingConfigMessage(){return this.accountId===""?"Cloudflare Clef requires the account id. Set CLOUDFLARE_ACCOUNT_ID or pass credentials.cloudflareClef.accountId.":Zvr.test(this.accountId)?Kvr(this.baseURL):"The Cloudflare account id may contain only letters, digits, '-' and '_'. Copy it from the Cloudflare dashboard."}defaultTimeoutMs(e,t){const r=this.getDescriptorDecideMs();return r===void 0?void 0:r+Math.floor(t/1e3)*Yvr}decisionEndpoint(e){return`${this.baseURL}/accounts/${encodeURIComponent(this.accountId)}/ai/run/${Xvr}${encodeURIComponent(Jvr(e)??e)}`}decisionHeaders(){return{Authorization:`Bearer ${this.apiKey}`,"Content-Type":"application/json"}}buildDecisionBody(e,t,r,n){const o=Jvr(r);if(!o)throw this.decisionError({kind:"invalid_request",message:`"${r.slice(0,40)}" is not a Cloudflare model name. Use "clef" or "clef-flash".`,retryable:!1});const i=(n?.images??[]).map(s=>s.replace(/^data:image\/jpg;base64,/i,"data:image/jpeg;base64,"));return i.forEach((s,a)=>{const l=BSn(s,a+1);if(l)throw this.decisionError({kind:"invalid_request",message:l,retryable:!1})}),n&&(n.images=i,n.bytes=i.reduce((s,a)=>s+Buffer.byteLength(a),0)),{model:o,state:zSn(e),questions:t,...i.length>0?{images:i}:{}}}readDecisionPayload(e){return Fr(e)&&Fr(e.result)?e.result:e}parseDecisionError(e,t,r){const n=`Cloudflare request failed with HTTP ${e}`,o=GSn(t),i=qSn(e,o?.code);let s=jT(o?.message??n,this.apiKey).trim().slice(0,twr)||n;return i==="max_tokens_exceeded"?s+=" Cloudflare counts the whole request, image data included, at about four characters per token.":o?.code===7e3&&(s+='. Check the model name (Clef is served as "clef" and "clef-flash") and the base URL, which must end in /client/v4 and name your account.'),{kind:i,message:s,status:e,requestId:r??o?.requestId,retryable:i==="rate_limit"&&o?.code!==rwr||i==="overloaded"||i==="server"}}readRequestId(e){return e.get("cf-ai-req-id")??e.get("cf-ray")??void 0}}}}),iwr,c5,swr,Uhe,u5,awr=S({"src/lib/adapters/video/klingVideoHandler.ts"(){"use strict";ep(),z(),Ft(),Md(),wh(),Ta(),iwr="https://api.piapi.ai/api/kling/v1",c5=3e4,swr=5e3,Uhe=5*6e4,u5=class{maxDurationSeconds=10;supportedAspectRatios=["16:9","9:16","1:1"];supportedResolutions=["720p","1080p"];apiKey;baseUrl;constructor(e){const t=(e??process.env.KLING_API_KEY??"").trim();this.apiKey=t.length>0?t:null,this.baseUrl=(process.env.KLING_BASE_URL??iwr).replace(/\/$/,"")}isConfigured(){return this.apiKey!==null}async generate(e,t,r){if(!this.apiKey)throw new Ye({code:Ke.PROVIDER_NOT_CONFIGURED,message:"KLING_API_KEY not configured",category:"configuration",severity:"high",retriable:!1});if(!r.imageUrl)throw new Ye({code:Ke.INVALID_INPUT,message:"KlingVideoHandler requires a publicly accessible image URL. Pass options.imageUrl with a URL string pointing to the input image. The PiAPI Kling API does not accept inline base64 image data.",category:"configuration",severity:"high",retriable:!1});const n=Date.now(),o=r.abortSignal,i=await this.submitJob(e,t,r),s=await this.pollUntilComplete(i,o),a=await this.downloadVideo(s),l=Date.now()-n;return h.info(`[KlingVideoHandler] Generated ${a.length} bytes in ${l}ms \u2014 task ${i}`),{data:a,mediaType:"video/mp4",metadata:{duration:r.length??4,dimensions:this.calculateDimensions(r),model:r.model??"kling",provider:"kling",aspectRatio:r.aspectRatio??"16:9",audioEnabled:!1,processingTime:l}}}async submitJob(e,t,r){const n={model:r.model??"kling",task_type:"video_generation",input:{image_url:r.imageUrl,prompt:t,duration:r.length??4,aspect_ratio:r.aspectRatio??"16:9",cfg_scale:.5}},o=await this.fetchWithTimeout(`${this.baseUrl}/image-to-video`,{method:"POST",headers:{Authorization:`Bearer ${this.apiKey}`,"Content-Type":"application/json"},body:JSON.stringify(n)});if(!o.ok){const a=await o.text(),l=o.status===408||o.status===429||o.status>=500;throw new Ye({code:Ke.GENERATION_FAILED,message:`Kling submit failed: ${o.status} \u2014 ${gr(a,500)}`,category:l?"network":"execution",severity:"high",retriable:l,context:{status:o.status}})}const i=await o.json(),s=i.task_id??i.data?.task_id;if(!s)throw new Ye({code:Ke.GENERATION_FAILED,message:"Kling submit response missing task_id",category:"execution",severity:"high",retriable:!1,context:{response:i}});return s}async pollUntilComplete(e,t){const r=Date.now();for(;Date.now()-r<Uhe;){if(t?.aborted)throw new Ye({code:Ke.GENERATION_FAILED,message:`Kling poll for task ${e} aborted by caller`,category:"network",severity:"medium",retriable:!1,context:{taskId:e}});const n=await this.fetchWithTimeout(`${this.baseUrl}/task/${e}`,{method:"GET",headers:{Authorization:`Bearer ${this.apiKey}`}},t);if(!n.ok){const i=await n.text();throw new Ye({code:Ke.GENERATION_FAILED,message:`Kling poll failed: ${n.status} \u2014 ${gr(i,500)}`,category:"network",severity:"medium",retriable:n.status>=500,context:{status:n.status,taskId:e}})}const o=await n.json();if(o.status==="completed"||o.status==="succeeded"){const i=o.video_url??o.output?.video_url;if(!i)throw new Ye({code:Ke.GENERATION_FAILED,message:`Kling task ${e} completed but no video URL returned`,category:"execution",severity:"high",retriable:!1,context:{taskId:e,data:o}});return i}if(o.status==="failed")throw new Ye({code:Ke.GENERATION_FAILED,message:`Kling task ${e} failed: ${o.error??"unknown"}`,category:"execution",severity:"high",retriable:!1,context:{taskId:e,data:o}});await new Promise((i,s)=>{const a=()=>{clearTimeout(l),s(new Ye({code:Ke.GENERATION_FAILED,message:`Kling poll for task ${e} aborted by caller`,category:"network",severity:"medium",retriable:!1,context:{taskId:e}}))},l=setTimeout(()=>{t?.removeEventListener("abort",a),i()},swr);t?.addEventListener("abort",a,{once:!0})})}throw new Ye({code:Ke.POLL_TIMEOUT,message:`Kling task ${e} did not complete within ${Uhe/1e3}s`,category:"timeout",severity:"medium",retriable:!0,context:{taskId:e}})}async downloadVideo(e){try{return await zp(e,{maxBytes:c0,label:"Kling video",timeoutMs:c5})}catch(t){throw new Ye({code:Ke.GENERATION_FAILED,message:`Kling video download rejected: ${t instanceof Error?t.message:String(t)}`,category:"network",severity:"high",retriable:!1,context:{url:e},originalError:t instanceof Error?t:void 0})}}async fetchWithTimeout(e,t,r){const n=new AbortController;let o=!1;const i=setTimeout(()=>{o=!0,n.abort()},c5),s=()=>n.abort();r?.addEventListener("abort",s,{once:!0});try{return await fetch(e,{...t,signal:n.signal})}catch(a){throw a instanceof Error&&a.name==="AbortError"?o?new Ye({code:Ke.GENERATION_FAILED,message:`Kling request timed out after ${c5/1e3}s`,category:"network",severity:"high",retriable:!0,originalError:a}):new Ye({code:Ke.GENERATION_FAILED,message:"Kling request aborted by caller",category:"network",severity:"medium",retriable:!1,originalError:a}):a}finally{r?.removeEventListener("abort",s),clearTimeout(i)}}calculateDimensions(e){const t=e.aspectRatio??"16:9";return(e.resolution??"720p")==="1080p"?t==="1:1"?{width:1080,height:1080}:t==="9:16"?{width:1080,height:1920}:{width:1920,height:1080}:t==="1:1"?{width:720,height:720}:t==="9:16"?{width:720,height:1280}:{width:1280,height:720}}}}}),lwr,d5,cwr=S({"src/lib/adapters/video/replicateVideoHandler.ts"(){"use strict";ep(),z(),wh(),D$(),L$(),lwr="atonamy/wan-alpha",d5=class{maxDurationSeconds=10;supportedAspectRatios=["9:16","16:9","1:1"];supportedResolutions=["720p","1080p"];instanceCredentials;constructor(e){this.instanceCredentials=e}isConfigured(){return Wh(this.instanceCredentials)!==null}async generate(e,t,r){const n=r.credentials?.replicate,o=Wh(n??this.instanceCredentials);if(!o)throw new Ye({code:Ke.PROVIDER_NOT_CONFIGURED,message:"REPLICATE_API_TOKEN not configured",category:"configuration",severity:"high",retriable:!1});const i=Date.now(),s=r.model??lwr,a=`data:image/${this.detectImageType(e)};base64,${e.toString("base64")}`,l=r.imageInputKey!==void 0?{[r.imageInputKey]:a,prompt:t,duration:r.length??4,...r.resolution!==void 0?{resolution:r.resolution}:{}}:{image:a,prompt:t,num_frames:(r.length??4)*24,fps:24,aspect_ratio:r.aspectRatio,...r.resolution!==void 0?{resolution:r.resolution}:{}};let c;try{c=await UC(o,{model:s,input:l},{abortSignal:r.abortSignal})}catch(p){throw new Ye({code:Ke.GENERATION_FAILED,message:`Replicate video generation failed: ${p instanceof Error?p.message:String(p)}`,category:"execution",severity:"high",retriable:!0,context:{model:s,options:r},originalError:p instanceof Error?p:void 0})}let u;try{u=await N$(c)}catch(p){throw new Ye({code:Ke.GENERATION_FAILED,message:`Replicate video download failed: ${p instanceof Error?p.message:String(p)}`,category:"network",severity:"medium",retriable:!0,context:{predictionId:c.id},originalError:p instanceof Error?p:void 0})}const d=Date.now()-i;return h.info(`[ReplicateVideoHandler] Generated ${u.length} bytes in ${d}ms \u2014 model ${s}`),{data:u,mediaType:"video/mp4",metadata:{duration:r.length??4,dimensions:this.calculateDimensions(r),model:s,provider:"replicate",aspectRatio:r.aspectRatio??"16:9",audioEnabled:!1,processingTime:d}}}detectImageType(e){return e.length<4?"jpeg":e[0]===137&&e[1]===80?"png":e[0]===255&&e[1]===216?"jpeg":e[0]===82&&e[1]===73&&e[2]===70&&e[3]===70?"webp":"jpeg"}calculateDimensions(e){const t=e.aspectRatio??"16:9";return(e.resolution??"720p")==="1080p"?t==="1:1"?{width:1080,height:1080}:t==="9:16"?{width:1080,height:1920}:{width:1920,height:1080}:t==="1:1"?{width:720,height:720}:t==="9:16"?{width:720,height:1280}:{width:1280,height:720}}}}}),uwr,p5,dwr,Bhe,m5,pwr=S({"src/lib/adapters/video/runwayVideoHandler.ts"(){"use strict";ep(),z(),Ft(),Md(),wh(),Ta(),uwr="https://api.dev.runwayml.com/v1",p5=3e4,dwr=5e3,Bhe=5*6e4,m5=class{maxDurationSeconds=10;supportedAspectRatios=["16:9","9:16"];supportedResolutions=["720p","1080p"];apiKey;baseUrl;apiVersion;constructor(e){const t=(e??process.env.RUNWAY_API_KEY??"").trim();this.apiKey=t.length>0?t:null,this.baseUrl=(process.env.RUNWAY_BASE_URL??uwr).replace(/\/$/,""),this.apiVersion=process.env.RUNWAY_API_VERSION??"2024-11-06"}isConfigured(){return this.apiKey!==null}async generate(e,t,r){if(!this.apiKey)throw new Ye({code:Ke.PROVIDER_NOT_CONFIGURED,message:"RUNWAY_API_KEY not configured",category:"configuration",severity:"high",retriable:!1});if(r.aspectRatio!==void 0&&!this.supportedAspectRatios.includes(r.aspectRatio))throw new Ye({code:Ke.INVALID_INPUT,message:`Unsupported aspect ratio for Runway: "${r.aspectRatio}". Supported: ${this.supportedAspectRatios.join(", ")}.`,category:"validation",severity:"medium",retriable:!1,context:{requested:r.aspectRatio,supported:this.supportedAspectRatios}});const n=Date.now(),o=r.abortSignal,i=await this.submitTask(e,t,r),s=await this.pollUntilComplete(i,o),a=await this.downloadVideo(s),l=Date.now()-n;return h.info(`[RunwayVideoHandler] Generated ${a.length} bytes in ${l}ms \u2014 task ${i}`),{data:a,mediaType:"video/mp4",metadata:{duration:r.length??4,dimensions:this.calculateDimensions(r),model:r.model??"gen3a_turbo",provider:"runway",aspectRatio:r.aspectRatio??"16:9",audioEnabled:!1,processingTime:l}}}async submitTask(e,t,r){const n=`data:image/${this.detectImageType(e)};base64,${e.toString("base64")}`,o={model:r.model??"gen3a_turbo",promptImage:n,promptText:t,duration:r.length??4,ratio:r.aspectRatio==="9:16"?"9:16":"16:9",seed:void 0},i=await this.fetchWithTimeout(`${this.baseUrl}/image_to_video`,{method:"POST",headers:{Authorization:`Bearer ${this.apiKey}`,"Content-Type":"application/json","X-Runway-Version":this.apiVersion},body:JSON.stringify(o)});if(!i.ok){const a=await i.text(),l=i.status===408||i.status===429||i.status>=500;throw new Ye({code:Ke.GENERATION_FAILED,message:`Runway submit failed: ${i.status} \u2014 ${gr(a,500)}`,category:l?"network":"execution",severity:"high",retriable:l,context:{status:i.status}})}const s=await i.json();if(!s.id)throw new Ye({code:Ke.GENERATION_FAILED,message:"Runway submit response missing id",category:"execution",severity:"high",retriable:!1,context:{response:s}});return s.id}async pollUntilComplete(e,t){const r=Date.now();for(;Date.now()-r<Bhe;){if(t?.aborted)throw new Ye({code:Ke.GENERATION_FAILED,message:`Runway poll for task ${e} aborted by caller`,category:"network",severity:"medium",retriable:!1,context:{taskId:e}});const n=await this.fetchWithTimeout(`${this.baseUrl}/tasks/${e}`,{method:"GET",headers:{Authorization:`Bearer ${this.apiKey}`,"X-Runway-Version":this.apiVersion}},t);if(!n.ok){const i=await n.text();throw new Ye({code:Ke.GENERATION_FAILED,message:`Runway poll failed: ${n.status} \u2014 ${gr(i,500)}`,category:"network",severity:"medium",retriable:n.status>=500})}const o=await n.json();if(o.status==="SUCCEEDED"||o.status==="succeeded"){const i=Array.isArray(o.output)?o.output[0]:o.output;if(typeof i!="string")throw new Ye({code:Ke.GENERATION_FAILED,message:`Runway task ${e} completed but no output URL`,category:"execution",severity:"high",retriable:!1,context:{taskId:e,data:o}});return i}if(o.status==="FAILED"||o.status==="failed")throw new Ye({code:Ke.GENERATION_FAILED,message:`Runway task ${e} failed: ${o.failure??o.error??"unknown"}`,category:"execution",severity:"high",retriable:!1,context:{taskId:e,data:o}});await new Promise((i,s)=>{const a=()=>{clearTimeout(l),s(new Ye({code:Ke.GENERATION_FAILED,message:`Runway poll for task ${e} aborted by caller`,category:"network",severity:"medium",retriable:!1,context:{taskId:e}}))},l=setTimeout(()=>{t?.removeEventListener("abort",a),i()},dwr);t?.addEventListener("abort",a,{once:!0})})}throw new Ye({code:Ke.POLL_TIMEOUT,message:`Runway task ${e} did not complete within ${Bhe/1e3}s`,category:"timeout",severity:"medium",retriable:!0,context:{taskId:e}})}async downloadVideo(e){try{return await zp(e,{maxBytes:c0,label:"Runway video",timeoutMs:p5})}catch(t){throw new Ye({code:Ke.GENERATION_FAILED,message:`Runway video download rejected: ${t instanceof Error?t.message:String(t)}`,category:"network",severity:"high",retriable:!1,context:{url:e},originalError:t instanceof Error?t:void 0})}}async fetchWithTimeout(e,t,r){const n=new AbortController,o=setTimeout(()=>n.abort(),p5),i=()=>n.abort();r?.addEventListener("abort",i,{once:!0});try{return await fetch(e,{...t,signal:n.signal})}catch(s){throw s instanceof Error&&s.name==="AbortError"?new Ye({code:Ke.GENERATION_FAILED,message:`Runway request to ${e} timed out after ${p5/1e3}s`,category:"network",severity:"high",retriable:!0,originalError:s}):new Ye({code:Ke.GENERATION_FAILED,message:`Runway fetch failed: ${s instanceof Error?s.message:String(s)}`,category:"network",severity:"high",retriable:!0,originalError:s instanceof Error?s:void 0})}finally{r?.removeEventListener("abort",i),clearTimeout(o)}}detectImageType(e){return e.length<4?"jpeg":e[0]===137&&e[1]===80?"png":e[0]===255&&e[1]===216?"jpeg":e.length>=12&&e[0]===82&&e[1]===73&&e[2]===70&&e[3]===70&&e[8]===87&&e[9]===69&&e[10]===66&&e[11]===80?"webp":"jpeg"}calculateDimensions(e){const t=e.aspectRatio??"16:9";return(e.resolution??"720p")==="1080p"?t==="9:16"?{width:1080,height:1920}:{width:1920,height:1080}:t==="9:16"?{width:720,height:1280}:{width:1280,height:720}}}}}),mwr={};ce(mwr,{KlingVideoHandler:()=>u5,ReplicateVideoHandler:()=>d5,RunwayVideoHandler:()=>m5,VIDEO_ERROR_CODES:()=>Ke,VertexVideoHandler:()=>jN,VideoError:()=>Ye,VideoProcessor:()=>db,isVertexVideoConfigured:()=>_re,registerDefaultVideoHandlers:()=>hwr});function hwr(){for(const{name:e,factory:t}of gwr)if(!db.supports(e))try{const r=t();if(!r.isConfigured())continue;db.registerHandler(e,r)}catch(r){h.debug(`[video] ${e} auto-registration skipped: ${r instanceof Error?r.message:String(r)}`)}}var fwr,gwr,ywr=S({"src/lib/adapters/video/index.ts"(){"use strict";jv(),z(),wh(),wh(),awr(),cwr(),pwr(),ub(),awr(),cwr(),pwr(),ub(),fwr={vertex:()=>new jN,kling:()=>new u5,runway:()=>new m5,replicate:()=>new d5},gwr=op.filter(e=>e.kind==="video").map(e=>{const t=fwr[e.name];if(!t)throw new Error(`[video] no handler factory for catalog entry "${e.name}"`);return{name:e.name,factory:t}})}});function VSn(e){for(const t of e)_r.registerProvider(t.id,async(r,n,o,i,s)=>{const{ConfiguredDecisionProvider:a}=await wbn().then(()=>jmr);return new a(t,r,o,s)},process.env[uo(t,"model")]||t.models.default,[...t.aliases],er.get(t.id))}var Od,kI=S({"src/lib/factories/providerRegistry.ts"(){"use strict";qs(),z(),hl(),w5r(),jv(),Fm(),Od=class wve{static registered=!1;static registrationPromise=null;static options={enableManualMCP:!1};static realtimeRegistration={};static getRegistrationReport(){return{realtime:{...this.realtimeRegistration}}}static async registerAllProviders(){if(!this.registered){if(this.registrationPromise)return this.registrationPromise;this.registrationPromise=this._doRegister();try{await this.registrationPromise}catch(t){throw this.registrationPromise=null,t}}}static async _doRegister(){try{const{ProviderFactory:t}=await Promise.resolve().then(()=>(qs(),VP));t.registerProvider("google-ai",async(r,n,o,i,s)=>{const a=s,{GoogleAIStudioProvider:l}=await Promise.resolve().then(()=>(oTn(),Shr));return new l(r,o,a)},"gemini-2.5-flash",["googleAiStudio","google","gemini","google-ai","google-ai-studio"],er.get("google-ai")),t.registerProvider("openai",async(r,n,o,i,s)=>{const a=s,{OpenAIProvider:l}=await Promise.resolve().then(()=>(vTn(),rfr));return new l(r,o,void 0,a)},"gpt-4o-mini",["gpt","chatgpt"],er.get("openai")),t.registerProvider("anthropic",async(r,n,o,i,s)=>{const a=s,{AnthropicProvider:l}=await Promise.resolve().then(()=>(a_n(),Zfr));return new l(r,o,void 0,a)},"claude-sonnet-4-6",["claude","anthropic"],er.get("anthropic")),t.registerProvider("bedrock",async(r,n,o,i,s)=>{const a=s,{AmazonBedrockProvider:l}=await Promise.resolve().then(()=>(pEn(),vyr));return new l(r,o,i,a)},void 0,["bedrock","aws"],er.get("bedrock")),t.registerProvider("azure",async(r,n,o,i,s)=>{const a=s,{AzureOpenAIProvider:l}=await Promise.resolve().then(()=>(mEn(),wyr));return new l(r,o,void 0,a)},process.env.AZURE_MODEL||process.env.AZURE_OPENAI_MODEL||process.env.AZURE_OPENAI_DEPLOYMENT||process.env.AZURE_OPENAI_DEPLOYMENT_ID||"gpt-4o-mini",["azure","azureOpenai"],er.get("azure")),t.registerProvider("vertex",async(r,n,o,i,s)=>{const a=s,{GoogleVertexProvider:l}=await Promise.resolve().then(()=>(TEn(),Dyr));return new l(r,n,o,i,a)},"claude-sonnet-4-6",["vertex","googleVertex"],er.get("vertex"));for(const r of t2e)t.registerProvider(r.providerName,async(n,o,i,s,a)=>{const{ConfiguredOpenAICompatProvider:l}=await Promise.resolve().then(()=>(_En(),Nyr));return new l(r,n,i,a)},r.registryDefaultModelChecksEnvVar&&process.env[r.modelEnvVar]||r.registryDefaultModel,r.aliases,er.get(r.providerName));t.registerProvider("ollama",async(r,n,o,i,s)=>{const a=s,{OllamaProvider:l}=await Promise.resolve().then(()=>(SEn(),Vyr));return new l(r,o,void 0,a)},process.env.OLLAMA_MODEL||"llama3.2:latest",["ollama","local"],er.get("ollama")),t.registerProvider("litellm",async(r,n,o,i,s)=>{const a=s,{LiteLLMProvider:l}=await Promise.resolve().then(()=>(CEn(),Yyr));return new l(r,o,void 0,a)},process.env.LITELLM_MODEL||"openai/gpt-4o-mini",["litellm"],er.get("litellm")),t.registerProvider("openai-compatible",async(r,n,o,i,s)=>{const a=s,{OpenAICompatibleProvider:l}=await Promise.resolve().then(()=>(REn(),t0r));return new l(r,o,void 0,a)},process.env.OPENAI_COMPATIBLE_MODEL||void 0,["openai-compatible","vllm","compatible"],er.get("openai-compatible")),t.registerProvider("openrouter",async(r,n,o,i,s)=>{const a=s,{OpenRouterProvider:l}=await Promise.resolve().then(()=>(OEn(),a0r));return new l(r,o,void 0,a)},process.env.OPENROUTER_MODEL||"anthropic/claude-sonnet-4.5",["openrouter","or"],er.get("openrouter")),t.registerProvider("sagemaker",async(r,n,o,i,s)=>{const a=s,{AmazonSageMakerProvider:l}=await Promise.resolve().then(()=>(mSn(),D0r));return new l(r,void 0,i,void 0,a)},process.env.SAGEMAKER_MODEL||"sagemaker-model",["sagemaker","aws-sagemaker"],er.get("sagemaker")),t.registerProvider("nvidia-nim",async(r,n,o,i,s)=>{const a=s,{NvidiaNimProvider:l}=await Promise.resolve().then(()=>(gSn(),G0r));return new l(r,o,void 0,a)},process.env.NVIDIA_NIM_MODEL||er.get("nvidia-nim")?.defaultModel||"openai/gpt-oss-20b",["nvidia","nim","nvidia-nim"],er.get("nvidia-nim")),t.registerProvider("lm-studio",async(r,n,o,i,s)=>{const a=s,{LMStudioProvider:l}=await Promise.resolve().then(()=>(ySn(),q0r));return new l(r,o,void 0,a)},process.env.LM_STUDIO_MODEL||void 0,["lmstudio","lm-studio","lms"],er.get("lm-studio")),t.registerProvider("llamacpp",async(r,n,o,i,s)=>{const a=s,{LlamaCppProvider:l}=await Promise.resolve().then(()=>(vSn(),W0r));return new l(r,o,void 0,a)},process.env.LLAMACPP_MODEL||void 0,["llamacpp","llama.cpp","llama-cpp"],er.get("llamacpp")),t.registerProvider("cohere",async(r,n,o,i,s)=>{const a=s,{CohereProvider:l}=await Promise.resolve().then(()=>(wSn(),evr));return new l(r,o,void 0,a)},process.env.COHERE_MODEL||"command-r-plus-08-2024",["cohere"],er.get("cohere")),t.registerProvider("voyage",async(r,n,o,i,s)=>{const a=s,{VoyageProvider:l}=await bSn().then(()=>ovr);return new l(r,o,void 0,a)},process.env.VOYAGE_MODEL||"voyage-3.5",["voyage","voyage-ai"],er.get("voyage")),t.registerProvider("jina",async(r,n,o,i,s)=>{const a=s,{JinaProvider:l}=await TSn().then(()=>lvr);return new l(r,o,void 0,a)},process.env.JINA_MODEL||"jina-embeddings-v3",["jina","jina-ai"],er.get("jina")),t.registerProvider("stability",async(r,n,o,i,s)=>{const a=s,{StabilityProvider:l}=await _Sn().then(()=>pvr);return new l(r,o,void 0,a)},process.env.STABILITY_MODEL||"stable-image-ultra",["stability","stability-ai","sd"],er.get("stability")),t.registerProvider("ideogram",async(r,n,o,i,s)=>{const a=s,{IdeogramProvider:l}=await ESn().then(()=>gvr);return new l(r,o,void 0,a)},process.env.IDEOGRAM_MODEL||"V_3",["ideogram"],er.get("ideogram")),t.registerProvider("replicate",async(r,n,o,i,s)=>{const a=s,{ReplicateProvider:l}=await kSn().then(()=>bvr);return new l(r,o,void 0,a)},process.env.REPLICATE_MODEL||"meta/meta-llama-3-70b-instruct",["replicate"],er.get("replicate")),t.registerProvider("recraft",async(r,n,o,i,s)=>{const a=s,{RecraftProvider:l}=await xSn().then(()=>Evr);return new l(r,o,void 0,a)},process.env.RECRAFT_MODEL||"recraftv3",["recraft"],er.get("recraft")),t.registerProvider("typesafe",async(r,n,o,i,s)=>{const a=s,{TypeSafeProvider:l}=await Lvr().then(()=>Avr);return new l(r,o,void 0,a)},process.env.TYPESAFE_MODEL||"jev-latest",["jev","typesafe-ai"],er.get("typesafe")),t.registerProvider("perplexity-decider",async(r,n,o,i,s)=>{const a=s,{PerplexityDeciderProvider:l}=await $Sn().then(()=>Fvr);return new l(r,o,void 0,a)},process.env.PERPLEXITY_DECIDER_MODEL||"pplx-decider-v1-27b",[],er.get("perplexity-decider")),t.registerProvider("cloudflare-clef",async(r,n,o,i,s)=>{const a=s,{CloudflareClefProvider:l}=await jSn().then(()=>Wvr);return new l(r,o,void 0,a)},process.env.CLOUDFLARE_CLEF_MODEL||"clef",[],er.get("cloudflare-clef")),VSn(z7()),h.debug("All AI providers registered successfully");try{const{registerDefaultTTSHandlers:r}=await Promise.resolve().then(()=>(ph(),dh));r(),h.debug("TTS handler registration attempted",{providers:qv("tts")})}catch(r){h.warn("Failed to register TTS handlers - TTS functionality will be unavailable",{error:r instanceof Error?r.message:String(r)})}try{const{registerDefaultSTTHandlers:r}=await Promise.resolve().then(()=>(ph(),dh));r(),h.debug("STT handler registration attempted",{providers:qv("stt")})}catch(r){h.warn("Failed to register STT handlers - STT functionality will be unavailable",{error:r instanceof Error?r.message:String(r)})}try{const{registerDefaultRealtimeHandlers:r,RealtimeProcessor:n}=await Promise.resolve().then(()=>(ph(),dh));r();const o=qv("realtime"),i={};for(const a of o)i[a]=n.supports(a)?"ok":"registration failed or handler unavailable";wve.realtimeRegistration=i;const s=Object.entries(i).filter(([,a])=>a!=="ok");s.length===0?h.info(`[ProviderRegistry] Realtime handlers registered: ${o.join(", ")}`):h.warn(`[ProviderRegistry] Realtime handlers partial: ${s.length} skipped`,{outcomes:i})}catch(r){h.warn("Failed to register Realtime handlers - Realtime functionality will be unavailable",{error:r instanceof Error?r.message:String(r)})}try{const{registerDefaultVideoHandlers:r}=await Promise.resolve().then(()=>(ywr(),mwr));r(),h.debug("Video handler registration attempted",{providers:qv("video")})}catch(r){h.warn(`[ProviderRegistry] video registration block failed: ${r instanceof Error?r.message:String(r)}`)}try{const{registerDefaultAvatarHandlers:r}=await Promise.resolve().then(()=>(ide(),ode));r(),h.debug("Avatar handler registration attempted",{providers:qv("avatar")})}catch(r){h.warn("Failed to register Avatar handlers - Avatar functionality will be unavailable",{error:r instanceof Error?r.message:String(r)})}try{const{registerDefaultMusicHandlers:r}=await Promise.resolve().then(()=>(tde(),ede));r(),h.debug("Music handler registration attempted",{providers:qv("music")})}catch(r){h.warn("Failed to register Music handlers - Music functionality will be unavailable",{error:r instanceof Error?r.message:String(r)})}this.registered=!0}catch(t){throw h.error("Failed to register providers:",t),t}}static isRegistered(){return this.registered}static clearRegistrations(){_r.clearRegistrations(),this.registered=!1,this.registrationPromise=null,wve.realtimeRegistration={}}static setOptions(t){this.options={...this.options,...t},h.debug("Provider registry options updated:",this.options)}static getOptions(){return{...this.options}}}}}),xI={};ce(xI,{AIProviderFactory:()=>no});var vwr,wwr,no,Qa=S({"src/lib/core/factory.ts"(){"use strict";Vt(),Zt(),qs(),hl(),kI(),Gh(),z(),XZ(),et(),vwr="aiProviderFactory",wwr=$e.factory,no=class{static normalizeProviderName(e){const t=_r.normalizeProviderName(e);return t||e.toLowerCase()}static async initializeDynamicProviderWithTimeout(){const e="AIProviderFactory.initializeDynamicProviderWithTimeout";try{await Be(jx.initialize(),1e4,ve.toolTimeout("dynamic-provider-init",1e4)),h.debug(`[${e}] Dynamic model provider initialized successfully`)}catch(r){const n=r instanceof Error?r.message:String(r);h.warn(`[${e}] Dynamic model provider initialization failed`,{error:n,fallback:"Using static model defaults"})}}static isDecisionOnly(e){const t=rc.get(e.toLowerCase()),r=t===void 0?void 0:er.get(t)?.inferenceKinds;return r?.length===1&&r[0]==="decide"}static resolveModelFromEnvironment(e,t,r){if(t&&t!=="default")return h.debug(`[${r}] Skipping environment variable check - explicit model provided: ${t}`),t;if(this.isDecisionOnly(e))return h.debug(`[${r}] Skipping chat-model environment variables - ${e} serves decisions only and reads its own model setting`),t;h.debug(`[${r}] Checking environment variables for provider: ${e}`);const n=e.toLowerCase(),i=[{match:["bedrock"],label:"Bedrock",vars:["BEDROCK_MODEL","BEDROCK_MODEL_ID"]},{match:["vertex"],label:"Vertex",vars:["VERTEX_MODEL"]},{match:["azure"],label:"Azure",vars:["AZURE_OPENAI_MODEL","AZURE_OPENAI_DEPLOYMENT","AZURE_OPENAI_DEPLOYMENT_ID"]},{match:["openai","gpt","chatgpt","openai-compat"],label:"OpenAI",vars:["OPENAI_MODEL"]},{match:["anthropic","claude","anthropic-claude"],label:"Anthropic",vars:["ANTHROPIC_MODEL"]},{match:["google","gemini"],label:"Google AI",vars:["GOOGLE_AI_MODEL"]},{match:["mistral"],label:"Mistral",vars:["MISTRAL_MODEL"]},{match:["ollama"],label:"Ollama",vars:["OLLAMA_MODEL"]},{match:["litellm"],label:"LiteLLM",vars:["LITELLM_MODEL"]}].find(l=>l.match.some(c=>n.includes(c)));if(!i)return h.debug(`[${r}] Provider ${e} - no environment variable check implemented`),t;const s=i.vars.find(l=>process.env[l]),a=s?process.env[s]:void 0;return a?(h.debug(`[${r}] Environment variable found for ${i.label}`,{envVariable:s,resolvedModel:a}),a):(h.debug(`[${r}] No ${i.label} environment variables found (${i.vars.join(", ")})`),t)}static async resolveDynamicModelName(e,t,r,n){if(r&&r!=="default"||t&&t!=="default")return h.debug(`[${n}] Skipping dynamic model resolution`,{resolvedModelName:r||"none",reason:"Model already resolved from environment variables or explicit parameter"}),r;h.debug(`[${n}] Attempting dynamic model resolution`,{currentResolvedModel:r||"none",reason:"No environment variable found and no explicit model provided"});try{const o=this.normalizeProviderName(e);jx.needsRefresh()&&(h.debug(`[${n}] Dynamic model provider needs refresh - initializing`),await this.initializeDynamicProviderWithTimeout());const i=jx.resolveModel(o,t||void 0);return i?(h.debug(`[${n}] Resolved dynamic model`,{provider:o,requestedModel:t||"default",resolvedModel:i.id,displayName:i.displayName,pricing:i.pricing.input}),i.id):(h.debug(`[${n}] Dynamic model resolution returned null`,{provider:o,requestedModel:t||"default"}),r)}catch(o){return h.debug(`[${n}] Dynamic model resolution failed, using static fallback`,{error:o instanceof Error?o.message:String(o)}),r}}static async createResolvedProvider(e,t,r,n,o,i){await Be(Od.registerAllProviders(),3e4,ve.toolTimeout("provider-registration",3e4));const s=this.normalizeProviderName(e),a=t==="default"||t===null?void 0:t;h.debug(`[${o}] Final provider configuration`,{originalProviderName:e,normalizedProviderName:s,resolvedModelName:t||"not resolved",finalModelName:a||"using provider default"});const l=await Be(_r.createProvider(s,a,r,n,i),3e4,ve.toolTimeout(`provider-creation:${s}`,3e4));return{normalizedName:s,finalModelName:a,provider:l}}static async createProvider(e,t,r=!0,n,o,i){const s="AIProviderFactory.createProvider";return wwr.startActiveSpan("factory.createProvider",{kind:ln.INTERNAL,attributes:{"provider.name":e,"model.name":t||"default","mcp.enabled":r}},async a=>{h.debug(`[${s}] Provider creation started`,{providerName:e,modelName:t||"default",enableMCP:r,environmentVariables:{BEDROCK_MODEL:process.env.BEDROCK_MODEL||"not set",BEDROCK_MODEL_ID:process.env.BEDROCK_MODEL_ID||"not set",VERTEX_MODEL:process.env.VERTEX_MODEL||"not set",OPENAI_MODEL:process.env.OPENAI_MODEL||"not set"}});try{let l=this.resolveModelFromEnvironment(e,t,s);l=await this.resolveDynamicModelName(e,t,l,s);const{normalizedName:c,finalModelName:u,provider:d}=await this.createResolvedProvider(e,l,n,o,s,i);return h.debug(`[AIProviderFactory] Provider creation completed { providerName: '${c}', modelName: '${u}' }`),h.debug(`[AIProviderFactory] Resolved model: ${u}`),h.debug(vwr,"Pure factory pattern provider created",{providerName:c,modelName:u,factoryUsed:!0}),a.setAttribute("provider.resolved_name",c),u&&a.setAttribute("model.resolved_name",u),h.debug(`[${s}] Provider creation succeeded`,{providerName:e,modelName:u||"default",providerType:d.constructor.name,mcpEnabled:r}),a.setStatus({code:ze.OK}),d}catch(l){const c=l instanceof Error?l.message:String(l);throw a.setStatus({code:ze.ERROR,message:c}),a.recordException(l instanceof Error?l:new Error(String(l))),h.debug(`[${s}] Provider creation failed`,{providerName:e,modelName:t||"default",error:c}),l}finally{a.end()}})}static async createProviderWithModel(e,t){const r="AIProviderFactory.createProviderWithModel";h.debug(`[${r}] Provider model creation started`,{provider:e,model:t});try{const n=await this.createProvider(e,t);return h.debug(`[${r}] Provider model creation succeeded`,{provider:e,model:t,providerType:n.constructor.name}),n}catch(n){const o=n instanceof Error?n.message:String(n);throw h.debug(`[${r}] Provider model creation failed`,{provider:e,model:t,error:o}),n}}static async createBestProvider(e,t,r=!0,n){const o="AIProviderFactory.createBestProvider";try{const i=await mT(e);return h.debug(`[${o}] Best provider selected`,{requestedProvider:e||"auto",selectedProvider:i,modelName:t||"default",enableMCP:r}),await this.createProvider(i,t,r,n)}catch(i){const s=i instanceof Error?i.message:String(i);throw h.debug(`[${o}] Best provider selection failed`,{requestedProvider:e||"auto",error:s}),i}}static async createProviderWithFallback(e,t,r,n=!0){const o="AIProviderFactory.createProviderWithFallback";h.debug(`[${o}] Fallback provider setup started`,{primaryProvider:e,fallbackProvider:t,modelName:r||"default",enableMCP:n});try{const i=await this.createProvider(e,r,n),s=await this.createProvider(t,r,n);return h.debug(`[${o}] Fallback provider setup succeeded`,{primaryProvider:e,fallbackProvider:t,modelName:r||"default",enableMCP:n}),{primary:i,fallback:s}}catch(i){const s=i instanceof Error?i.message:String(i);throw h.debug(`[${o}] Fallback provider setup failed`,{primaryProvider:e,fallbackProvider:t,error:s}),i}}}}});function AI(e,t,r,n){if(e instanceof tn)return e;const o=e instanceof Error?e.message:String(e),i=e instanceof Error?e:void 0;return new qhe(o,i,t,r,n)}var tn,bwr,Twr,_wr,E0,a_,h5,zhe,f5,Ghe,qhe,Ewr,Swr,Ic,l_,g5,c_,u_,kwr,jhe,Vhe,Hhe,Whe,xwr,Su=S({"src/lib/server/errors.ts"(){"use strict";lt(),tn=class oPr extends Error{code;category;severity;retryable;retryAfterMs;requestId;path;method;details;cause;constructor(t,r,n={}){super(t),this.name="ServerAdapterError",this.code=r,this.category=n.category??Lr.EXECUTION,this.severity=n.severity??ao.MEDIUM,this.retryable=n.retryable??!1,this.retryAfterMs=n.retryAfterMs,this.requestId=n.requestId,this.path=n.path,this.method=n.method,this.details=n.details,this.cause=n.cause,Error.captureStackTrace&&Error.captureStackTrace(this,oPr)}toJSON(){return{error:{code:this.code,message:this.message,category:this.category,requestId:this.requestId,details:this.details,retryAfter:this.retryAfterMs?Math.ceil(this.retryAfterMs/1e3):void 0}}}getHttpStatus(){switch(this.code){case Rr.VALIDATION_ERROR:case Rr.SCHEMA_ERROR:case Rr.INVALID_CONFIG:case Rr.INVALID_ROUTE:return 400;case Rr.AUTH_REQUIRED:case Rr.AUTH_INVALID:return 401;case Rr.FORBIDDEN:return 403;case Rr.ROUTE_NOT_FOUND:return 404;case Rr.RATE_LIMIT_EXCEEDED:return 429;case Rr.TIMEOUT:return 408;case Rr.STREAM_ABORTED:return 499;default:return 500}}},bwr=class extends tn{constructor(e,t,r){super(e,Rr.INVALID_CONFIG,{category:Lr.CONFIG,severity:ao.HIGH,retryable:!1,details:t,cause:r}),this.name="ConfigurationError"}},Twr=class extends tn{constructor(e,t,r){super(`Route conflict: ${t} ${e} conflicts with existing route${r?`: ${r}`:""}`,Rr.ROUTE_CONFLICT,{category:Lr.CONFIG,severity:ao.HIGH,retryable:!1,path:e,method:t,details:{existingRoute:r}}),this.name="RouteConflictError"}},_wr=class extends tn{constructor(e,t,r){super(`Route not found: ${t} ${e}`,Rr.ROUTE_NOT_FOUND,{category:Lr.VALIDATION,severity:ao.LOW,retryable:!1,path:e,method:t,requestId:r}),this.name="RouteNotFoundError"}},E0=class extends tn{errors;constructor(e,t){super(`Validation failed: ${e.map(r=>r.message).join(", ")}`,Rr.VALIDATION_ERROR,{category:Lr.VALIDATION,severity:ao.LOW,retryable:!1,requestId:t,details:{errors:e}}),this.name="ValidationError",this.errors=e}},a_=class extends tn{constructor(e="Authentication required",t){super(e,Rr.AUTH_REQUIRED,{category:Lr.AUTHENTICATION,severity:ao.MEDIUM,retryable:!1,requestId:t}),this.name="AuthenticationError"}},h5=class extends tn{constructor(e="Invalid authentication credentials",t){super(e,Rr.AUTH_INVALID,{category:Lr.AUTHENTICATION,severity:ao.MEDIUM,retryable:!1,requestId:t}),this.name="InvalidAuthenticationError"}},zhe=class extends tn{constructor(e="Access forbidden",t,r){super(e,Rr.FORBIDDEN,{category:Lr.AUTHORIZATION,severity:ao.MEDIUM,retryable:!1,requestId:t,details:{requiredPermissions:r}}),this.name="AuthorizationError"}},f5=class extends tn{constructor(e,t,r){super(t??"Too many requests, please try again later",Rr.RATE_LIMIT_EXCEEDED,{category:Lr.RATE_LIMIT,severity:ao.MEDIUM,retryable:!0,retryAfterMs:e,requestId:r}),this.name="RateLimitError"}},Ghe=class extends tn{constructor(e,t,r){super(`Operation timed out after ${e}ms${t?`: ${t}`:""}`,Rr.TIMEOUT,{category:Lr.EXECUTION,severity:ao.MEDIUM,retryable:!0,requestId:r,details:{timeoutMs:e,operation:t}}),this.name="ServerTimeoutError"}},qhe=class extends tn{constructor(e,t,r,n,o){super(e,Rr.HANDLER_ERROR,{category:Lr.EXECUTION,severity:ao.HIGH,retryable:!1,cause:t,requestId:r,path:n,method:o}),this.name="HandlerError"}},Ewr=class extends tn{constructor(e,t,r){super(e,Rr.STREAM_ERROR,{category:Lr.STREAMING,severity:ao.MEDIUM,retryable:!1,cause:t,requestId:r}),this.name="StreamingError"}},Swr=class extends tn{constructor(e,t){super(`Stream aborted${e?`: ${e}`:""}`,Rr.STREAM_ABORTED,{category:Lr.STREAMING,severity:ao.LOW,retryable:!1,requestId:t,details:{reason:e}}),this.name="StreamAbortedError"}},Ic=class extends tn{constructor(e,t,r){super(e,Rr.WEBSOCKET_ERROR,{category:Lr.WEBSOCKET,severity:ao.MEDIUM,retryable:!0,cause:t,details:{connectionId:r}}),this.name="WebSocketError"}},l_=class extends tn{constructor(e="WebSocket connection failed",t){super(e,Rr.WEBSOCKET_CONNECTION_FAILED,{category:Lr.WEBSOCKET,severity:ao.HIGH,retryable:!0,cause:t}),this.name="WebSocketConnectionError"}},g5=class extends tn{constructor(e,t,r,n){super(e,Rr.START_FAILED,{category:Lr.CONFIG,severity:ao.CRITICAL,retryable:!0,cause:t,details:{port:r,host:n}}),this.name="ServerStartError"}},c_=class extends tn{constructor(e,t){super(e,Rr.STOP_FAILED,{category:Lr.EXECUTION,severity:ao.HIGH,retryable:!1,cause:t}),this.name="ServerStopError"}},u_=class extends tn{constructor(e,t){super(`Server is already running${e&&t?` on ${t}:${e}`:""}`,Rr.ALREADY_RUNNING,{category:Lr.CONFIG,severity:ao.LOW,retryable:!1,details:{port:e,host:t}}),this.name="AlreadyRunningError"}},kwr=class extends tn{constructor(){super("Server is not running",Rr.NOT_RUNNING,{category:Lr.CONFIG,severity:ao.LOW,retryable:!1}),this.name="NotRunningError"}},jhe=class extends tn{timeoutMs;remainingConnections;constructor(e,t){super(`Shutdown timed out after ${e}ms with ${t} active connection(s)`,Rr.STOP_FAILED,{category:Lr.EXECUTION,severity:ao.HIGH,retryable:!1,details:{timeoutMs:e,remainingConnections:t}}),this.name="ShutdownTimeoutError",this.timeoutMs=e,this.remainingConnections=t}},Vhe=class extends tn{timeoutMs;remainingConnections;constructor(e,t){super(`Connection drain timed out after ${e}ms with ${t} active connection(s)`,Rr.STOP_FAILED,{category:Lr.EXECUTION,severity:ao.MEDIUM,retryable:!1,details:{timeoutMs:e,remainingConnections:t}}),this.name="DrainTimeoutError",this.timeoutMs=e,this.remainingConnections=t}},Hhe=class extends tn{currentState;expectedStates;operation;constructor(e,t,r){super(`Cannot ${e}: server is in '${t}' state, expected one of [${r.join(", ")}]`,Rr.STOP_FAILED,{category:Lr.CONFIG,severity:ao.MEDIUM,retryable:!1,details:{operation:e,currentState:t,expectedStates:r}}),this.name="InvalidLifecycleStateError",this.currentState=t,this.expectedStates=r,this.operation=e}},Whe=class extends tn{constructor(e,t,r){super(`Missing dependency '${e}' for ${t} adapter. ${r?`Install with: ${r}`:""}`,Rr.MISSING_DEPENDENCY,{category:Lr.CONFIG,severity:ao.CRITICAL,retryable:!1,details:{dependency:e,framework:t,installCommand:r}}),this.name="MissingDependencyError"}},xwr={[Lr.CONFIG]:{strategy:"fail",maxRetries:0,baseDelayMs:0},[Lr.VALIDATION]:{strategy:"fail",maxRetries:0,baseDelayMs:0},[Lr.EXECUTION]:{strategy:"retry",maxRetries:3,baseDelayMs:1e3},[Lr.EXTERNAL]:{strategy:"exponentialBackoff",maxRetries:5,baseDelayMs:1e3},[Lr.RATE_LIMIT]:{strategy:"exponentialBackoff",maxRetries:3,baseDelayMs:5e3},[Lr.AUTHENTICATION]:{strategy:"fail",maxRetries:0,baseDelayMs:0},[Lr.AUTHORIZATION]:{strategy:"fail",maxRetries:0,baseDelayMs:0},[Lr.STREAMING]:{strategy:"retry",maxRetries:2,baseDelayMs:500},[Lr.WEBSOCKET]:{strategy:"exponentialBackoff",maxRetries:5,baseDelayMs:1e3}}}});function HSn(e){if(!(e instanceof Error))return!1;const t=e.code;return t==="ERR_MODULE_NOT_FOUND"||t==="MODULE_NOT_FOUND"}var d_,CI=S({"src/lib/server/abstract/baseServerAdapter.ts"(){"use strict";eo(),Zn(),et(),z(),gd(),Su(),d_=class extends fn{config;redactionConfig;neurolink;toolRegistry;externalServerManager;routes=new Map;middlewares=[];isRunning=!1;startTime;frameworkReady=!1;pendingMiddlewares=[];pendingRouteKeys=new Set;lifecycleState="uninitialized";activeConnections=new Map;shutdownConfig;constructor(e,t={}){super(),this.neurolink=e,this.toolRegistry=e.getToolRegistry(),this.externalServerManager=e.getExternalServerManager(),this.redactionConfig=t.redaction,this.shutdownConfig={gracefulShutdownTimeoutMs:t.shutdown?.gracefulShutdownTimeoutMs??3e4,drainTimeoutMs:t.shutdown?.drainTimeoutMs??15e3,forceClose:t.shutdown?.forceClose??!0},this.config={port:t.port??3e3,host:t.host??"0.0.0.0",basePath:t.basePath??"/api",cors:{enabled:t.cors?.enabled??!0,origins:t.cors?.origins??[],methods:t.cors?.methods??["GET","POST","PUT","DELETE","PATCH","OPTIONS"],headers:t.cors?.headers??["Content-Type","Authorization","X-Request-ID"],credentials:t.cors?.credentials??!1,maxAge:t.cors?.maxAge??86400},rateLimit:{enabled:t.rateLimit?.enabled??!0,windowMs:t.rateLimit?.windowMs??900*1e3,maxRequests:t.rateLimit?.maxRequests??100,message:t.rateLimit?.message??"Too many requests, please try again later",skipPaths:t.rateLimit?.skipPaths,keyGenerator:t.rateLimit?.keyGenerator},bodyParser:{enabled:t.bodyParser?.enabled??!0,maxSize:t.bodyParser?.maxSize??"10mb",jsonLimit:t.bodyParser?.jsonLimit??"10mb",rawMaxSize:t.bodyParser?.rawMaxSize??t.bodyParser?.maxSize??"64mb",urlEncoded:t.bodyParser?.urlEncoded??!0},logging:{enabled:t.logging?.enabled??!0,level:t.logging?.level??"info",includeBody:t.logging?.includeBody??!1,includeResponse:t.logging?.includeResponse??!1},timeout:t.timeout??3e4,enableMetrics:t.enableMetrics??!0,enableSwagger:t.enableSwagger??!1,disableBuiltInHealth:t.disableBuiltInHealth??!1,shutdown:this.shutdownConfig}}getNativeServer(){}async importFrameworkDependency(e,t){try{return await Al(e,`${t} server adapter`)}catch(r){throw r instanceof Error&&HSn(r.cause)?new Whe(e,t,`pnpm add ${e}`):r}}async initialize(){if(this.lifecycleState!=="uninitialized"&&this.lifecycleState!=="stopped")throw new Hhe("initialize",this.lifecycleState,["uninitialized","stopped"]);this.lifecycleState="initializing",h.info("[ServerAdapter] Initializing server adapter",{port:this.config.port,host:this.config.host,basePath:this.config.basePath});const e=Ce.createSpan("server.request","server.initialize",{"server.operation":"initialize","server.port":this.config.port,"server.host":this.config.host}),t=Date.now();try{await this.initializeFramework(),this.frameworkReady=!0,this.registerBuiltInMiddleware(),this.flushPendingRegistrations(),await this.registerBuiltInRoutes(),this.lifecycleState="initialized",this.emit("initialized",{config:this.config,routeCount:this.routes.size,middlewareCount:this.middlewares.length}),h.info("[ServerAdapter] Server adapter initialized",{routes:this.routes.size,middlewares:this.middlewares.length}),e.durationMs=Date.now()-t;const r=Ce.endSpan(e,1);rt().recordSpan(r)}catch(r){this.lifecycleState="error",e.durationMs=Date.now()-t;const n=Ce.endSpan(e,2);throw n.statusMessage=r instanceof Error?r.message:String(r),rt().recordSpan(n),r}}registerRoute(e){const t=`${e.method.toUpperCase()}:${e.path}`;this.routes.has(t)&&h.warn(`[ServerAdapter] Route ${t} already exists, replacing`),this.routes.set(t,e),this.frameworkReady?this.registerFrameworkRoute(e):this.pendingRouteKeys.add(t),h.debug(`[ServerAdapter] Registered route: ${t}`,{description:e.description,streaming:e.streaming?.enabled,auth:e.auth})}registerRouteGroup(e){if(e.middleware)for(const t of e.middleware)this.registerMiddleware({...t,paths:t.paths??[e.prefix]});for(const t of e.routes){const r=!t.path.startsWith(e.prefix),n=this.normalizePath(r?`${e.prefix}${t.path}`:t.path),o={...t,path:n};this.registerRoute(o)}h.debug(`[ServerAdapter] Registered route group: ${e.prefix}`,{routes:e.routes.length,middleware:e.middleware?.length??0})}normalizePath(e){return"/"+e.split("/").filter(Boolean).join("/")}registerMiddleware(e){this.middlewares.push(e),this.frameworkReady?this.registerFrameworkMiddleware(e):this.pendingMiddlewares.push(e),h.debug(`[ServerAdapter] Registered middleware: ${e.name}`,{order:e.order,paths:e.paths})}logRequestError(e,t,r){if(r instanceof tn&&r.getHttpStatus()<500){h.warn(`[${e}] Request rejected`,{requestId:t,code:r.code,error:r.message});return}h.error(`[${e}] Request error`,{requestId:t,error:r.message,stack:r.stack})}emitRequestError(e){this.listenerCount("error")>0&&this.emit("error",e)}flushPendingRegistrations(){const e=this.pendingMiddlewares,t=this.pendingRouteKeys;this.pendingMiddlewares=[],this.pendingRouteKeys=new Set;for(const r of e)this.registerFrameworkMiddleware(r);for(const r of t){const n=this.routes.get(r);n&&this.registerFrameworkRoute(n)}}createContext(e){return{requestId:e.requestId,method:e.method,path:e.path,headers:e.headers,query:e.query??{},params:e.params??{},body:e.body,neurolink:this.neurolink,toolRegistry:this.toolRegistry,externalServerManager:this.externalServerManager,timestamp:Date.now(),metadata:{},redaction:this.redactionConfig}}registerBuiltInMiddleware(){this.registerMiddleware({name:"requestId",order:0,handler:async(e,t)=>(e.requestId=e.requestId||this.generateRequestId(),t())}),this.config.logging.enabled&&this.registerMiddleware({name:"logging",order:1,handler:async(e,t)=>{const r=Date.now();h.info(`[ServerAdapter] ${e.method} ${e.path}`,{requestId:e.requestId});const n=await t();return h.info(`[ServerAdapter] ${e.method} ${e.path} completed`,{requestId:e.requestId,duration:Date.now()-r}),n}})}async registerBuiltInRoutes(){this.config.disableBuiltInHealth||(this.registerRoute({method:"GET",path:`${this.config.basePath}/health`,handler:async()=>({status:"ok",timestamp:new Date().toISOString(),uptime:this.startTime?Date.now()-this.startTime.getTime():0,version:process.env.npm_package_version||"unknown"}),description:"Health check endpoint",tags:["system"]}),this.registerRoute({method:"GET",path:`${this.config.basePath}/ready`,handler:async e=>{const t=e.toolRegistry,r=this.config.timeout||5e3;let n,o;try{n=await Be(t.listTools(),r,new Error(`toolRegistry.listTools timed out after ${r}ms`)),o=n.length>0}catch(i){h.warn("[ServerAdapter] Tool registry check timed out",{timeout:r,error:i instanceof Error?i.message:String(i)}),o=!1}return{ready:!0,timestamp:new Date().toISOString(),services:{neurolink:!0,tools:o,externalServers:!!e.externalServerManager}}},description:"Readiness check endpoint",tags:["system"]})),this.config.enableMetrics&&this.registerRoute({method:"GET",path:`${this.config.basePath}/metrics`,handler:async()=>{const e=this.getStatus();return{server:{running:e.running,uptime:e.uptime,routes:e.routes,middlewares:e.middlewares},process:{memoryUsage:process.memoryUsage(),cpuUsage:process.cpuUsage(),pid:process.pid},timestamp:new Date().toISOString()}},description:"Server metrics endpoint",tags:["system"]})}generateRequestId(){return`req-${Date.now()}-${Math.random().toString(36).substring(2,11)}`}getLifecycleState(){return this.lifecycleState}trackConnection(e,t,r){this.activeConnections.set(e,{id:e,createdAt:Date.now(),socket:t,requestId:r,isActive:!0}),h.debug("[ServerAdapter] Connection tracked",{connectionId:e,activeConnections:this.activeConnections.size})}untrackConnection(e){this.activeConnections.delete(e)&&h.debug("[ServerAdapter] Connection untracked",{connectionId:e,activeConnections:this.activeConnections.size})}getActiveConnectionCount(){return this.activeConnections.size}async gracefulShutdown(){const{gracefulShutdownTimeoutMs:e,drainTimeoutMs:t,forceClose:r}=this.shutdownConfig;h.info("[ServerAdapter] Starting graceful shutdown",{activeConnections:this.activeConnections.size,gracefulShutdownTimeoutMs:e,drainTimeoutMs:t});const n=Ce.createSpan("server.request","server.shutdown",{"server.operation":"gracefulShutdown","server.activeConnections":this.activeConnections.size}),o=Date.now();let i,s;try{this.lifecycleState="draining",await this.stopAcceptingConnections(),h.info("[ServerAdapter] Stopped accepting new connections");const a=this.drainConnections(),l=new Promise((p,m)=>{i=setTimeout(()=>{m(new jhe(e,this.activeConnections.size))},e)}),c=new Promise(p=>{s=setTimeout(()=>{p("drain_timeout")},t)});if(await Promise.race([a,c])==="drain_timeout"&&this.activeConnections.size>0)if(h.warn("[ServerAdapter] Drain timeout reached",{remainingConnections:this.activeConnections.size}),r)h.info("[ServerAdapter] Force closing remaining connections"),await this.forceCloseConnections();else throw new Vhe(t,this.activeConnections.size);this.lifecycleState="stopping",await Promise.race([this.closeServer(),l]),h.info("[ServerAdapter] Server closed successfully"),n.durationMs=Date.now()-o;const d=Ce.endSpan(n,1);rt().recordSpan(d)}catch(a){if(r&&(a instanceof jhe||a instanceof Vhe)){h.warn("[ServerAdapter] Timeout during shutdown, forcing close",{error:a.message}),await this.forceCloseConnections(),await this.closeServer(),n.durationMs=Date.now()-o;const l=Ce.endSpan(n,1);rt().recordSpan(l)}else{this.lifecycleState="error",n.durationMs=Date.now()-o;const l=Ce.endSpan(n,2);throw l.statusMessage=a instanceof Error?a.message:String(a),rt().recordSpan(l),a}}finally{i&&clearTimeout(i),s&&clearTimeout(s)}}async drainConnections(){if(this.activeConnections.size===0){h.debug("[ServerAdapter] No active connections to drain");return}return h.info("[ServerAdapter] Draining connections",{count:this.activeConnections.size}),new Promise(e=>{const t=setInterval(()=>{this.activeConnections.size===0&&(clearInterval(t),h.info("[ServerAdapter] All connections drained"),e())},100)})}resetServerState(){this.isRunning=!1,this.startTime=void 0,this.activeConnections.clear(),this.lifecycleState="stopped",h.debug("[ServerAdapter] Server state reset for restart capability")}validateLifecycleState(e,t){if(!t.includes(this.lifecycleState))throw new Hhe(e,this.lifecycleState,t)}getStatus(){return{running:this.isRunning,port:this.config.port,host:this.config.host,uptime:this.startTime?Date.now()-this.startTime.getTime():0,routes:this.routes.size,middlewares:this.middlewares.length,lifecycleState:this.lifecycleState,activeConnections:this.activeConnections.size}}listRoutes(){return Array.from(this.routes.values())}getConfig(){return{...this.config}}}}});function II(e){return typeof e=="object"&&e!==null&&"error"in e&&typeof e.error=="object"&&e.error!==null&&"code"in e.error&&"message"in e.error}function WSn(e){return{VALIDATION_ERROR:400,SCHEMA_ERROR:400,TOOL_NOT_FOUND:404,SERVER_NOT_FOUND:404,SESSION_NOT_FOUND:404,NOT_FOUND:404,AUTH_REQUIRED:401,AUTH_INVALID:401,FORBIDDEN:403,RATE_LIMIT_EXCEEDED:429,MCP_UNAVAILABLE:503,MEMORY_UNAVAILABLE:503,SKILLS_UNAVAILABLE:503,EXECUTION_FAILED:500,INTERNAL_ERROR:500}[e]??500}function Ut(e,t,r,n,o){return{error:{code:e,message:t,details:r},metadata:{timestamp:new Date().toISOString(),requestId:n},httpStatus:o??WSn(e)}}function Rc(e,t,r){const n=e.safeParse(t);return n.success?{success:!0,data:n.data}:{success:!1,error:Ut("VALIDATION_ERROR","Invalid request body",n.error.issues.map(o=>({path:o.path.join("."),message:o.message,code:o.code})),r)}}function KSn(e,t,r){const n=e.safeParse(t);return n.success?{success:!0,data:n.data}:{success:!1,error:Ut("VALIDATION_ERROR","Invalid query parameters",n.error.issues.map(o=>({path:o.path.join("."),message:o.message,code:o.code})),r)}}function ku(e,t,r){const n=e.safeParse(t);return n.success?{success:!0,data:n.data}:{success:!1,error:Ut("VALIDATION_ERROR","Invalid path parameters",n.error.issues.map(o=>({path:o.path.join("."),message:o.message,code:o.code})),r)}}var y5,Awr,Khe,Jhe,v5,Xhe,p_,w5,Cwr,Yhe,JSn,XSn,Iwr,Rwr,Zhe,Mwr,Pwr,RI,b5,Owr,YSn,ZSn,Qhe,Dwr,Nwr,T5,Lwr,Fwr,$wr,QSn,xu=S({"src/lib/server/utils/validation.ts"(){"use strict";nn(),y5=M.object({input:M.union([M.string(),M.object({text:M.string(),images:M.array(M.string()).optional(),files:M.array(M.string()).optional()})]),provider:M.string().optional(),model:M.string().optional(),systemPrompt:M.string().optional(),temperature:M.number().min(0).max(2).optional(),maxTokens:M.number().positive().optional(),tools:M.array(M.string()).optional(),stream:M.boolean().optional(),sessionId:M.string().optional(),userId:M.string().optional()}),Awr=M.object({provider:M.string().optional(),model:M.string().optional(),systemPrompt:M.string().optional(),temperature:M.number().min(0).max(2).optional(),maxTokens:M.number().positive().optional(),maxSteps:M.number().positive().optional()}),Khe=M.object({prompt:M.string().min(1,"Prompt is required"),options:Awr.optional()}),Jhe=M.object({name:M.string().min(1,"Tool name is required"),arguments:M.record(M.string(),M.unknown()).default({}),sessionId:M.string().optional(),userId:M.string().optional()}),v5=M.record(M.string(),M.unknown()),Xhe=M.object({sessionId:M.string().min(1,"Session ID is required")}),p_=M.object({name:M.string().min(1,"Server name is required")}),w5=M.object({name:M.string().min(1,"Tool name is required")}),Cwr=M.object({q:M.string().optional(),source:M.string().optional(),limit:M.string().transform(e=>parseInt(e,10)).pipe(M.number().positive().max(100)).optional()}),Yhe=M.object({id:M.string().min(1,"Session ID is required")}),JSn=M.object({userId:M.string().optional(),limit:M.string().transform(e=>parseInt(e,10)).pipe(M.number().positive().max(100)).optional(),offset:M.string().transform(e=>parseInt(e,10)).pipe(M.number().nonnegative()).optional()}),XSn=M.object({limit:M.string().transform(e=>parseInt(e,10)).pipe(M.number().positive().max(100)).optional(),offset:M.string().transform(e=>parseInt(e,10)).pipe(M.number().nonnegative()).optional()}),Iwr=M.object({text:M.string().min(1,"Text is required"),provider:M.string().optional(),model:M.string().optional()}),Rwr=M.object({texts:M.array(M.string().min(1)).min(1,"At least one text is required").max(2048,"Maximum 2048 texts per batch"),provider:M.string().optional(),model:M.string().optional()}),Zhe=M.object({name:M.string().min(1,"Name is required"),displayName:M.string().optional(),description:M.string().min(1,"Description is required"),instructions:M.string().min(1,"Instructions are required"),tags:M.array(M.string()).optional(),scope:M.enum(["global","scoped"]).optional(),scopeIds:M.array(M.string()).optional(),requestedBy:M.string().optional()}),Mwr=Zhe.partial(),Pwr=M.object({term:M.string().trim().min(1,"term is required"),heardAs:M.array(M.string()).max(64).optional(),meaning:M.string().max(2e3).optional()}),RI=M.string().min(1).max(100),b5=M.string().trim().regex(/^(?:source|[A-Za-z]{2,3}(?:-[A-Za-z]{4})?(?:-(?:[A-Za-z]{2}|\d{3}))?)$/u,"must be a BCP-47 tag such as es, fr-CA or hi-Latn, or source"),Owr=M.object({languages:M.array(b5).max(8),provider:M.string().min(1).max(100).optional(),model:M.string().min(1).max(200).optional(),timeoutMs:M.number().int().positive().max(12e4).optional(),contextUtterances:M.number().int().min(0).max(10).optional(),glossary:M.boolean().optional()}),YSn=M.object({type:M.literal("output"),languages:M.array(b5).max(8)}),ZSn=M.object({type:M.literal("subscribe"),languages:M.array(b5).max(8).optional(),speakers:M.array(M.string().min(1).max(100)).max(64).optional(),backlog:M.boolean().optional(),interim:M.boolean().optional()}),Qhe=M.number().finite().nonnegative().nullish(),Dwr=M.object({id:M.string().min(1).max(200),source:M.enum(["primary","shadow"]),model:M.string().max(200),participant_identity:M.string().max(500),participant_name:M.string().max(500).optional(),text:M.string().max(2e4),language:M.string().max(35).nullish(),start_time:Qhe,end_time:Qhe,received_at:M.number().finite().nonnegative()}),Nwr=M.object({call_id:M.string().min(1).max(500),room:M.string().max(500).optional(),batch:M.number().int().nonnegative(),final:M.boolean().optional(),models:M.object({primary:M.string().max(200),shadow:M.string().max(200)}),segments:M.array(Dwr).max(5e3)}),T5=M.object({provider:RI.optional(),model:M.string().min(1).max(200).optional(),language:M.string().min(1).max(35).optional(),prompt:M.string().max(4e3).optional(),dictionary:M.array(Pwr).max(500).optional(),correction:M.object({enabled:M.boolean().optional(),guard:M.enum(["decide","none"]).optional(),decideTimeoutMs:M.number().int().positive().max(6e4).optional(),rewrite:M.union([M.literal(!1),M.literal("auto"),M.object({provider:M.string().min(1).max(100).optional(),model:M.string().min(1).max(200).optional(),timeoutMs:M.number().int().positive().max(12e4).optional(),mode:M.enum(["auto","always"]).optional()})]).optional(),perSentence:M.boolean().optional(),transliterate:M.enum(["latin","native"]).optional(),punctuate:M.boolean().optional(),cleanup:M.enum(["verbatim","clean"]).optional(),secondOpinion:M.union([M.literal("auto"),M.object({provider:RI,model:M.string().min(1).max(200).optional()})]).optional(),context:M.string().max(1e3).optional(),maxDropRatio:M.number().min(0).max(1).optional(),contextUtterances:M.number().int().min(0).max(10).optional()}).optional(),fallback:M.object({provider:RI,model:M.string().min(1).max(200).optional(),when:M.array(M.enum(["unsure","empty","error"])).optional()}).optional(),routing:M.object({probe:M.boolean().optional(),lockAfterPasses:M.number().int().min(1).max(5).optional(),prior:M.enum(["carry","none"]).optional(),engines:M.record(M.string().min(1).max(35),RI).refine(e=>Object.keys(e).length<=64,{message:"at most 64 routes"}).optional()}).optional(),chunking:M.enum(["engine","utterances"]).optional(),output:Owr.optional(),diarization:M.boolean().optional(),wordTimestamps:M.boolean().optional(),timeoutMs:M.number().int().positive().max(6e5).optional()}),Lwr=T5.extend({audio:M.string().min(1).optional(),audioUrl:M.string().url().optional(),audioPath:M.string().min(1).optional(),format:M.enum(["mp3","wav","ogg","opus","m4a","flac","webm","mp4","mpeg","mpga","pcm16"]).optional()}).refine(e=>[e.audio,e.audioUrl,e.audioPath].filter(t=>t!==void 0).length===1,{message:"Pass exactly one of audio, audioUrl or audioPath"}),Fwr=T5.extend({mode:M.enum(["live","file"]).optional(),streaming:M.object({mode:M.enum(["auto","native","chunked"]).optional(),sampleRate:M.number().int().min(8e3).max(48e3).optional(),endSilenceMs:M.number().positive().optional(),intervalMs:M.number().positive().optional(),softCutSeconds:M.number().positive().optional(),maxUtteranceSeconds:M.number().positive().optional(),onsetRms:M.number().positive().optional(),prerollMs:M.number().nonnegative().optional(),minSpeechMs:M.number().nonnegative().optional(),concurrency:M.number().int().min(1).max(8).optional(),finalRetries:M.number().int().min(0).max(3).optional(),vad:M.object({engine:M.enum(["auto","silero","energy"]).optional(),onset:M.number().min(0).max(1).optional(),sustain:M.number().min(0).max(1).optional(),startMs:M.number().nonnegative().max(2e3).optional()}).optional(),normalize:M.boolean().optional()}).optional()}),$wr=Fwr.omit({mode:!0}).extend({completed:M.enum(["corrected","final"]).optional(),correctionWaitMs:M.number().int().min(0).max(3e4).optional(),clientLanguage:M.boolean().optional(),clientTurnDetection:M.boolean().optional()}),QSn=M.record(M.string().min(1).max(100),$wr)}});function _5(e){return typeof e=="string"&&zwr.test(e)}function Uwr(e){if(typeof e=="number"&&Number.isFinite(e)&&e>0)return e;const t=typeof e=="string"?e.trim().match(/^(\d+(?:\.\d+)?)\s*(b|kb|mb|gb)?$/i):null;if(!t)return 10*1024*1024;const r={b:1,kb:1024,mb:1024*1024,gb:1024*1024*1024};return Math.floor(Number(t[1])*r[(t[2]??"b").toLowerCase()])}async function Bwr(e,t){const r=[];let n=0;for await(const o of e){const i=typeof o=="string"?Buffer.from(o):o;if(n+=i.length,n>t)throw new m_(t);r.push(i)}return Buffer.concat(r)}function E5(e){return typeof Response<"u"&&e instanceof Response}async function efe(e){const t={};return e.headers.forEach((r,n)=>{t[n]=r}),{status:e.status,headers:t,body:Buffer.from(await e.arrayBuffer())}}var zwr,m_,MI=S({"src/lib/server/utils/rawBody.ts"(){"use strict";zwr=/^\s*(multipart\/form-data|application\/octet-stream|audio\/[\w.+-]+)\s*(;|$)/i,m_=class extends Error{status=413;constructor(e){super(`Request body exceeds the server's ${e}-byte limit`),this.name="RawBodyTooLargeError"}}}}),Gwr={};ce(Gwr,{ExpressServerAdapter:()=>tfe});var tfe,qwr=S({"src/lib/server/adapters/expressAdapter.ts"(){"use strict";z(),Su(),CI(),xu(),MI(),tfe=class extends d_{app;server;frameworkInitialized=!1;sockets=new Set;constructor(e,t={}){super(e,t)}initializeFramework(){}async initializeFrameworkAsync(){if(this.frameworkInitialized)return;const t=(await this.importFrameworkDependency("express","Express")).default;if(this.app=t(),this.config.bodyParser.enabled){const r=this.config.bodyParser.maxSize||this.config.bodyParser.jsonLimit||"10mb";this.app.use(t.json({limit:this.config.bodyParser.jsonLimit||r})),this.app.use(t.urlencoded({extended:!0,limit:r})),this.app.use(t.raw({type:n=>_5(n.headers["content-type"]),limit:this.config.bodyParser.rawMaxSize||"64mb"}))}if(this.config.cors.enabled){const n=(await this.importFrameworkDependency("cors","Express")).default;this.app.use(n({origin:this.config.cors.origins.includes("*")?"*":this.config.cors.origins,methods:this.config.cors.methods,allowedHeaders:this.config.cors.headers,credentials:this.config.cors.credentials,maxAge:this.config.cors.maxAge}))}if(this.config.rateLimit.enabled){const n=(await this.importFrameworkDependency("express-rate-limit","Express")).default,o=this.config.rateLimit.windowMs,i=n({windowMs:o,max:this.config.rateLimit.maxRequests,message:{error:{code:"RATE_LIMIT_EXCEEDED",message:this.config.rateLimit.message}},standardHeaders:!0,legacyHeaders:!1,handler:(s,a)=>{const l=Math.ceil(o/1e3);a.setHeader("Retry-After",String(l)),a.status(429).json({error:{code:"RATE_LIMIT_EXCEEDED",message:this.config.rateLimit.message},metadata:{timestamp:new Date().toISOString(),retryAfter:l}})}});this.app.use(i)}this.app.use((r,n,o)=>{const i=r.headers["x-request-id"]||this.generateRequestId();r.headers["x-request-id"]=i,n.setHeader("X-Request-ID",i),o()}),this.config.logging.enabled&&this.app.use((r,n,o)=>{const i=Date.now(),s=r.headers["x-request-id"];h.info(`[ExpressAdapter] ${r.method} ${r.path}`,{requestId:s}),n.on("finish",()=>{h.info(`[ExpressAdapter] ${r.method} ${r.path} ${n.statusCode}`,{requestId:s,duration:Date.now()-i})}),o()}),this.frameworkInitialized=!0}async initialize(){try{await this.initializeFrameworkAsync()}catch(e){throw this.lifecycleState="error",e}await super.initialize()}registerFrameworkRoute(e){const t=e.method.toLowerCase();this.app[t](e.path,async(r,n,o)=>{const i=r.headers["x-request-id"],s=Date.now(),a=this.createContext({requestId:i,method:r.method,path:r.path,headers:r.headers,query:r.query,params:r.params,body:r.body});n.locals.responseHeaders&&(a.responseHeaders={...n.locals.responseHeaders}),this.emit("request",{requestId:i,method:a.method,path:a.path,timestamp:new Date});try{if(e.streaming?.enabled)return this.handleStreamingResponse(n,a,e);const l=await e.handler(a),c=Date.now()-s;if(E5(l)){const u=await efe(l);this.emit("response",{requestId:i,statusCode:u.status,duration:c,timestamp:new Date});for(const[d,p]of Object.entries({...a.responseHeaders,...u.headers}))n.setHeader(d,p);n.status(u.status).send(u.body);return}if(II(l)){const u=l.httpStatus??500;if(this.emit("response",{requestId:i,statusCode:u,duration:c,timestamp:new Date}),a.responseHeaders)for(const[d,p]of Object.entries(a.responseHeaders))n.setHeader(d,p);n.status(u).json({error:l.error,metadata:{...l.metadata,requestId:i,timestamp:new Date().toISOString(),duration:c}});return}if(this.emit("response",{requestId:i,statusCode:200,duration:c,timestamp:new Date}),a.responseHeaders)for(const[u,d]of Object.entries(a.responseHeaders))n.setHeader(u,d);n.json({data:l,metadata:{requestId:i,timestamp:new Date().toISOString(),duration:c}})}catch(l){o(l)}}),this.setupErrorHandler()}errorHandlerRegistered=!1;setupErrorHandler(){this.errorHandlerRegistered||(this.errorHandlerRegistered=!0,this.app.use((e,t,r,n)=>{const o=t.headers["x-request-id"];this.logRequestError("ExpressAdapter",o,e),this.emitRequestError({requestId:o,error:e,timestamp:new Date});const i=e instanceof tn,s=!i&&"type"in e&&e.type==="entity.too.large",a=i?e.getHttpStatus():s?413:500,l=i?e.code:s?"PAYLOAD_TOO_LARGE":"INTERNAL_ERROR",c=i||s?e.message:"An internal error occurred";r.status(a).json({error:{code:l,message:c},metadata:{requestId:o,timestamp:new Date().toISOString()}})}))}async handleStreamingResponse(e,t,r){e.setHeader("Content-Type","text/event-stream"),e.setHeader("Cache-Control","no-cache"),e.setHeader("Connection","keep-alive");try{const n=await r.handler(t);if(n&&typeof n=="object"&&Symbol.asyncIterator in n)for await(const o of n)e.write(`event: message
2215
+ ${r}`:r}function Tvr(e){return typeof e=="string"?e:Array.isArray(e)?e.map(t=>typeof t=="string"?t:"").join(""):""}function Mhe(e){const t=e?.apiKey?.trim()||e?.apiToken?.trim(),r=e?.baseURL||e?.baseUrl;return{apiToken:t,baseUrl:r}}var Phe,_vr,kSn=S({async"src/lib/providers/replicate.ts"(){"use strict";Il(),th(),D$(),L$(),Ta(),await bu(),Tl(),Cr(),z(),et(),oi(),Phe=()=>Zi("REPLICATE_MODEL","meta/meta-llama-3-70b-instruct"),_vr=class extends Ga{apiToken;baseURL;constructor(e,t,r,n){const o=Xh(t)?t:void 0;super(e,"replicate",o);const{apiToken:i,baseUrl:s}=Mhe(n);this.apiToken=i&&i.length>0?i:Oa(w6r()),this.baseURL=s,h.debug("Replicate Provider initialized",{modelName:this.modelName,baseURL:this.baseURL})}getProviderName(){return this.providerName}getDefaultModel(){return Phe()}supportsTools(){return!1}getAISDKModel(){throw new Error("Replicate routes through the predictions API, not the AI SDK chat models. Streaming uses the predict-then-stream path inside executeStream.")}async generate(e,t){const r=typeof e=="string"?{prompt:e}:e,n=vp(r,this.modelName);if(n==="video"||n==="avatar"||n==="music"||n==="image")return super.generate(r,t);if(r.output?.format==="json"||r.output?.format==="structured"||t!=null)throw new Me({code:je.PROVIDER_NOT_AVAILABLE,message:"Replicate models do not support structured-output / JSON schema. Remove output.format or _analysisSchema, or use a provider that implements the OpenAI chat-completions contract (e.g. openai, anthropic).",category:"validation",severity:"medium",retriable:!1});const o=r.prompt??r.input?.text??"",i=Date.now(),s=await this.executeStream({input:{text:o},systemPrompt:r.systemPrompt,maxTokens:r.maxTokens,temperature:r.temperature,abortSignal:r.abortSignal,timeout:r.timeout});let a="";for await(const c of s.stream)"content"in c&&typeof c.content=="string"&&(a+=c.content);const l={content:a,provider:this.providerName,model:this.modelName,usage:{input:0,output:0,total:0}};return h.info(`[ReplicateProvider] generate() complete in ${Date.now()-i}ms \u2014 ${a.length} chars`),l}async executeStream(e,t){const r=Date.now(),n=e.credentials?.replicate,o=Mhe(n),i=o.apiToken||this.apiToken,s=o.baseUrl||this.baseURL,a=Wh({apiToken:i,baseUrl:s});if(!a)throw new Me({code:je.MISSING_CONFIGURATION,message:"Replicate auth could not be resolved (REPLICATE_API_TOKEN missing).",category:"configuration",severity:"high",retriable:!1});const l=SSn(e);if(!l.trim())throw new Me({code:je.INVALID_PARAMETERS,message:"Replicate predictions require a prompt (input.text or prompt)",category:"validation",severity:"medium",retriable:!1});const c={prompt:l,...e.maxTokens!==void 0&&{max_new_tokens:e.maxTokens},temperature:e.temperature,top_p:1};let u;try{const m={provider:this.providerName,model:this.modelName};u=await Ym({...m,modelParameters:{temperature:e.temperature,maxTokens:e.maxTokens,topP:1},input:{prompt:l}},async f=>{const g=await UC(a,{model:this.modelName,input:c},{abortSignal:e.abortSignal});return lc(f,{...m,output:Tvr(g.output)}),g})}catch(m){throw this.handleProviderError(m)}const d=Tvr(u.output);if(!d)throw new Error(`Replicate prediction ${u.id} returned empty output`);const p={async*[Symbol.asyncIterator](){yield{content:d}}};return h.info(`[ReplicateProvider] Generated ${d.length} chars in ${Date.now()-r}ms \u2014 model ${this.modelName} (prediction ${u.id})`),{stream:p,provider:this.providerName,model:this.modelName,finishReason:"stop",metadata:{startTime:r,streamId:`replicate-${u.id}`}}}async executeImageGeneration(e){const t=Date.now(),r=e.credentials?.replicate,n=Mhe(r),o=n.apiToken||this.apiToken,i=n.baseUrl||this.baseURL,s=Wh({apiToken:o,baseUrl:i});if(!s)throw new Me({code:je.MISSING_CONFIGURATION,message:"Replicate auth could not be resolved (REPLICATE_API_TOKEN missing).",category:"configuration",severity:"high",retriable:!1});const a=e.prompt??e.input?.text??"";if(!a.trim())throw new Me({code:je.INVALID_PARAMETERS,message:"Replicate image-gen requires a prompt",category:"validation",severity:"medium",retriable:!1});const l=e,c={prompt:a,output_format:"png"};l.aspectRatio&&(c.aspect_ratio=l.aspectRatio),l.negativePrompt&&(c.negative_prompt=l.negativePrompt),l.seed!==void 0&&(c.seed=l.seed);let u;try{u=await UC(s,{model:this.modelName,input:c},{abortSignal:e.abortSignal})}catch(m){throw this.handleProviderError(m)}let d;try{d=await N$(u,Hh)}catch(m){throw this.handleProviderError(m)}const p=d.toString("base64");return h.info(`[ReplicateProvider] Generated image (${d.length} bytes) in ${Date.now()-t}ms \u2014 model ${this.modelName}`),{content:a,provider:this.providerName,model:this.modelName,usage:{input:0,output:0,total:0},imageOutput:{base64:p}}}formatProviderError(e){const t=e instanceof Error?e.message:typeof e=="string"?e:"Unknown error",r=e instanceof Error?e:void 0;return t.includes("401")||t.toLowerCase().includes("unauthorized")||t.toLowerCase().includes("invalid token")?new Me({code:je.PROVIDER_AUTH_FAILED,message:"Invalid Replicate API token. Get one at https://replicate.com/account/api-tokens",category:"configuration",severity:"high",retriable:!1,context:{provider:"replicate"},originalError:r}):t.includes("402")||t.toLowerCase().includes("insufficient credit")?new Me({code:je.PROVIDER_QUOTA_EXCEEDED,message:"Replicate insufficient credit. Top up at https://replicate.com/account/billing \u2014 most image/music models require a paid balance.",category:"resource",severity:"high",retriable:!1,context:{provider:"replicate"},originalError:r}):t.includes("429")||t.toLowerCase().includes("rate limit")?new Me({code:je.PROVIDER_QUOTA_EXCEEDED,message:"Replicate rate limit exceeded. Back off and retry.",category:"resource",severity:"high",retriable:!0,context:{provider:"replicate"},originalError:r}):t.toLowerCase().includes("not found")||t.includes("404")?new Me({code:je.PROVIDER_NOT_AVAILABLE,message:`Replicate model '${this.modelName}' not found. Use owner/name or owner/name:version format. Browse https://replicate.com/explore`,category:"validation",severity:"medium",retriable:!1,context:{provider:"replicate",model:this.modelName},originalError:r}):new Me({code:je.PROVIDER_NOT_AVAILABLE,message:`Replicate error: ${t}`,category:"execution",severity:"high",retriable:!1,context:{provider:"replicate"},originalError:r})}async validateConfiguration(){return typeof this.apiToken=="string"&&this.apiToken.trim().length>0}getConfiguration(){return{provider:this.providerName,model:this.modelName,defaultModel:Phe(),baseURL:this.baseURL}}}}}),Evr={};ce(Evr,{RecraftProvider:()=>Nhe,default:()=>xvr});var Svr,Ohe,kvr,Dhe,Nhe,xvr,xSn=S({async"src/lib/providers/recraft.ts"(){"use strict";Il(),await bu(),on(),lt(),z(),oi(),Ta(),Md(),qT(),Svr="https://external.api.recraft.ai/v1",Ohe=12e4,kvr=()=>Oa(E6r()),Dhe=()=>Zi("RECRAFT_MODEL","recraftv3"),Nhe=class extends Ga{apiKey;baseURL;proxyFetch;constructor(e,t,r,n){const o=Xh(t)?t:void 0;super(e,"recraft",o);const i=n?.apiKey?.trim();this.apiKey=i&&i.length>0?i:kvr(),this.baseURL=n?.baseURL??process.env.RECRAFT_BASE_URL??Svr,this.proxyFetch=Nt(),h.debug("Recraft Provider initialized (image-gen only)",{modelName:this.modelName,baseURL:this.baseURL})}getProviderName(){return this.providerName}getDefaultModel(){return Dhe()}supportsTools(){return!1}getAISDKModel(){throw new Error("Recraft is an image-generation-only provider; chat completions are not available.")}async executeStream(e,t){throw new Error("Recraft is an image-generation-only provider; streaming chat is not available.")}formatProviderError(e){const t=e instanceof Error?e.message:typeof e=="string"?e:"Unknown error";return t.includes("401")||t.toLowerCase().includes("unauthorized")?new en("Invalid Recraft API key. Get one at https://www.recraft.ai/api","recraft"):t.includes("429")||t.toLowerCase().includes("rate limit")?new fs("Recraft rate limit exceeded. Back off and retry.","recraft"):t.includes("404")||t.includes("model_not_found")?new ti(`Recraft model '${this.modelName}' not found. Use recraftv3, recraftv3-svg, or recraftv2.`,"recraft"):new Je(`Recraft error: ${t}`,"recraft")}async executeImageGeneration(e){const t=Date.now(),r=e.credentials?.recraft,n=r?.apiKey?.trim()||this.apiKey,o=r?.baseURL||this.baseURL,i=e.prompt??e.input?.text??"";if(!i.trim())throw new Error("Recraft image generation requires a prompt (input.text or prompt)");const s=e,a={model:e.model??this.modelName,prompt:i,n:1,response_format:"b64_json"};s.negativePrompt&&(a.negative_prompt=s.negativePrompt),s.style&&(a.style=s.style),s.styleId&&(a.style_id=s.styleId),s.size&&(a.size=s.size);const l=new AbortController,c=setTimeout(()=>l.abort(),Ohe);let u;try{u=await this.proxyFetch(`${o}/images/generations`,{method:"POST",headers:{Authorization:`Bearer ${n}`,"Content-Type":"application/json"},body:JSON.stringify(a),signal:l.signal})}catch(g){throw g instanceof Error&&g.name==="AbortError"?this.formatProviderError(new Error(`Recraft image-gen request timed out after ${Ohe/1e3}s`)):this.formatProviderError(g)}finally{clearTimeout(c)}if(!u.ok){const g=await u.text();throw this.formatProviderError(new Error(`Recraft image-gen failed: ${u.status} \u2014 ${g}`))}const p=(await u.json()).data?.[0];if(!p)throw new Error("Recraft returned no image data");let m;if(p.b64_json)m=p.b64_json;else if(p.url)m=(await zp(p.url,{label:"Recraft image",maxBytes:Hh,timeoutMs:6e4})).toString("base64");else throw new Error("Recraft response missing both b64_json and url");const f=Date.now()-t;return h.info(`[RecraftProvider] Generated image (${m.length} base64 chars) in ${f}ms \u2014 model ${this.modelName}`),{content:i,provider:this.providerName,model:this.modelName,usage:{input:0,output:1e3,total:1e3},imageOutput:{base64:m,mimeType:tI(Buffer.from(m.slice(0,64),"base64"))}}}async validateConfiguration(){return typeof this.apiKey=="string"&&this.apiKey.trim().length>0}getConfiguration(){return{provider:this.providerName,model:this.modelName,defaultModel:Dhe(),baseURL:this.baseURL}}},xvr=Nhe}}),Avr={};ce(Avr,{TYPESAFE_MAX_REQUEST_TOKENS:()=>l5,TYPESAFE_MAX_STATE_TOKENS:()=>a5,TypeSafeProvider:()=>Nvr});function ASn(e){if(!Fr(e)||!Fr(e.providerMetadata))return{};const t=e.providerMetadata.typesafe;if(!Fr(t)||!Fr(t.confidence))return{};const r={};for(const[n,o]of Object.entries(t.confidence)){const i=vs(o);i!==void 0&&(r[n]=i)}return r}function CSn(e,t,r,n){const o=typeof t.type=="string"?t.type:void 0,i=(o?Dvr[o]:void 0)??(e===401||e===403?"authentication":e===429?"rate_limit":e>=500?"server":"invalid_request"),s=typeof t.message=="string"&&t.message.length>0?t.message:o??`AI Gateway request failed with HTTP ${e}`;return{kind:i,message:s,status:e,requestId:r,retryable:n}}function Cvr(e,t,r){const n=e===429||e===529||e>=500,o=Fr(t)&&Fr(t.error)?t.error:void 0;if(o)return CSn(e,o,r,n);const i=Fr(t)?t.detail:void 0;if(Array.isArray(i))return{kind:"invalid_request",message:`Request failed validation \u2014 ${$mr(i)}`,status:e,requestId:r,retryable:!1};const s=Fr(i)&&typeof i.error_type=="string"?i.error_type:void 0,a=s==="max_tokens_exceeded"?"max_tokens_exceeded":e===401||e===403?"authentication":e===429?"rate_limit":e===529?"overloaded":e>=500?"server":"invalid_request",l=a==="max_tokens_exceeded"?`State plus questions exceeded the model's input limit: keep state plus the longest single question under ~${a5} tokens, and state plus all questions under ~${l5}.`:s??`TypeSafe request failed with HTTP ${e}`,c=Fr(i)&&typeof i.message=="string"?i.message:l;return{kind:a,message:c,status:e,requestId:r,retryable:n}}var Ivr,Rvr,Mvr,Pvr,Ovr,a5,l5,Dvr,Nvr,Lvr=S({async"src/lib/providers/typesafe.ts"(){"use strict";z(),Ft(),oi(),await VT(),Ivr="https://api.typesafe.ai",Rvr="https://ai-gateway.vercel.sh/v4/ai/evaluation-model",Mvr="typesafe-ai/jev",Pvr="0.0.1",Ovr="4",a5=33e3,l5=64e3,Dvr={authentication_error:"authentication",customer_verification_required:"authentication",invalid_request_error:"invalid_request",rate_limit_exceeded:"rate_limit",internal_server_error:"server"},Nvr=class extends rI{apiKey;baseURL;gatewayURL;transport;constructor(e,t,r,n){super(e,"typesafe",t);const o=n?.apiKey?.trim()||(process.env.TYPESAFE_API_KEY?.trim()??""),i=n?.gatewayApiKey?.trim()||(process.env.AI_GATEWAY_API_KEY?.trim()??""),s=n?.transport??process.env.TYPESAFE_TRANSPORT?.trim();this.transport=s==="gateway"||s==="direct"?s:!o&&i?"gateway":"direct",this.apiKey=this.transport==="gateway"?i:o,this.baseURL=(n?.baseURL??process.env.TYPESAFE_BASE_URL??Ivr).replace(/\/+$/,""),this.gatewayURL=(n?.gatewayURL?.trim()||process.env.TYPESAFE_GATEWAY_URL?.trim()||Rvr).replace(/\/+$/,""),h.debug("TypeSafe Provider initialized (decide only)",{modelName:this.modelName,transport:this.transport,baseURL:nr(this.transport==="gateway"?this.gatewayURL:this.baseURL)})}getDefaultModel(){return Zi("TYPESAFE_MODEL","jev-latest")}vendorLabel(){return"TypeSafe"}vendorDisplayName(){return"TypeSafe (Jev)"}decisionApiKey(){return this.apiKey}missingKeyMessage(){return this.transport==="gateway"?"The TypeSafe gateway transport requires a Vercel AI Gateway key. Set AI_GATEWAY_API_KEY or pass credentials.typesafe.gatewayApiKey.":"TypeSafe requires an API key. Set TYPESAFE_API_KEY or pass credentials.typesafe.apiKey."}encodeQuestion(e){return this.transport==="gateway"?e:super.encodeQuestion(e)}buildDecisionBody(e,t,r){return this.transport==="gateway"?{state:e,questions:t}:{model:r,state:e,questions:t}}parseDecisionError(e,t,r){return Cvr(e,t,r)}reportedConfidence(e){return ASn(e)}readRequestId(e){return e.get("x-typesafe-request-id")??void 0}diagnosticContext(){return{transport:this.transport}}decisionEndpoint(){return this.transport==="gateway"?this.gatewayURL:`${this.baseURL}/v1/systemone`}decisionHeaders(){const e={Authorization:`Bearer ${this.apiKey}`,"Content-Type":"application/json"};return this.transport==="gateway"?{...e,"ai-gateway-auth-method":"api-key","ai-gateway-protocol-version":Pvr,"ai-model-id":Mvr,"ai-evaluation-model-specification-version":Ovr}:e}getDecisionTransport(){return this.transport}async listDecisionModels(){if(this.transport==="gateway")throw this.decisionError({kind:"invalid_request",message:"Model listing is a TypeSafe API operation; the gateway transport has no equivalent endpoint.",retryable:!1});const e=await this.proxyFetch(`${this.baseURL}/v1/models`,{headers:{Authorization:`Bearer ${this.apiKey}`},signal:AbortSignal.timeout(this.defaultTimeout??ype)}),t=await e.json().catch(()=>null);if(!e.ok)throw this.decisionError(Cvr(e.status,t,e.headers.get("x-typesafe-request-id")??void 0));return(Fr(t)&&Array.isArray(t.models)?t.models:[]).filter(Fr).map(n=>({name:typeof n.name=="string"?n.name:"",description:typeof n.description=="string"?n.description:"",releaseDate:typeof n.release_date=="string"?n.release_date:""}))}}}}),Fvr={};ce(Fvr,{PerplexityDeciderProvider:()=>Hvr});function ISn(e){return e.replace(/\/+$/,"").replace(/\/v1$/i,"")}function $vr(e){const t=`Set PERPLEXITY_DECIDER_BASE_URL or pass credentials.perplexityDecider.baseURL to an origin, or leave both unset to use ${Lhe}.`;try{const r=new URL(e);if(r.protocol!=="https:"&&r.protocol!=="http:")return`The Perplexity base URL must start with https:// or http://. ${t}`;const n=dj(r,"Perplexity",t);return n||(r.username||r.password||r.search||r.hash?`The Perplexity base URL must not carry credentials, a query string or a fragment. ${t}`:void 0)}catch{return`The Perplexity base URL is not a valid absolute URL. ${t}`}}function RSn(e){try{return new URL(e).hostname===zvr}catch{return!1}}function MSn(e,t){return e===401?"authentication":e===413||e===400&&Vvr.test(t)?"max_tokens_exceeded":e===429?"rate_limit":e===503?"overloaded":e>=500?"server":"invalid_request"}function PSn(e){if(!Fr(e)||!Fr(e.error))return;const{message:t,param:r}=e.error;if(!(typeof t!="string"||t.length===0))return typeof r=="string"&&r!==""&&!t.includes(r)?`${t} (field: ${r})`:t}function OSn(e){return e.length>=24&&e.toString("ascii",12,16)==="IHDR"?{width:e.readUInt32BE(16),height:e.readUInt32BE(20)}:void 0}function DSn(e){let t=2;for(;t+4<=e.length;){if(e[t]!==255)return;const r=e[t+1];if(r===255)t+=1;else if(r===1||r>=208&&r<=216)t+=2;else{if(r===217||r===218)return;if(r>=192&&r<=207&&r!==196&&r!==200&&r!==204)return t+9<=e.length?{height:e.readUInt16BE(t+5),width:e.readUInt16BE(t+7)}:void 0;t+=2+e.readUInt16BE(t+2)}}}function NSn(e){if(!(e.length<30))switch(e.toString("ascii",12,16)){case"VP8X":return{width:1+e.readUIntLE(24,3),height:1+e.readUIntLE(27,3)};case"VP8L":{const t=e.readUInt32LE(21);return e[20]===47?{width:(t&16383)+1,height:(t>>>14&16383)+1}:void 0}case"VP8 ":return{width:e.readUInt16LE(26)&16383,height:e.readUInt16LE(28)&16383};default:return}}function LSn(e){switch(eI(e)){case"image/png":return OSn(e);case"image/jpeg":return DSn(e);case"image/webp":return NSn(e);default:return}}function FSn(e,t){const r=/^data:([a-z]+\/[a-z0-9.+-]+);base64,/i.exec(e);if(!r||!qvr.has(r[1].toLowerCase()))return`Image ${t} is not a PNG, JPEG or WebP image, the only formats Perplexity reads.`;const n=LSn(Buffer.from(e.slice(r[0].length),"base64"));return n&&Math.round(n.width/SI)*Math.round(n.height/SI)>Fhe?`Image ${t} is ${n.width}x${n.height} pixels; Perplexity reads at most ${Fhe} tiles of ${SI}x${SI} pixels per image (1440x1440 and 2048x1024 fit), and a larger one stalls until the request times out. Resize it first.`:void 0}function Uvr(e){return typeof e=="number"||typeof e=="boolean"?String(e):e}var Lhe,Bvr,zvr,Gvr,qvr,SI,Fhe,jvr,Vvr,Hvr,$Sn=S({async"src/lib/providers/perplexityDecider.ts"(){"use strict";qT(),z(),Ft(),oi(),pj(),await VT(),Lhe="https://api.perplexity.ai",Bvr="/v1/decisions",zvr="api.perplexity.ai",Gvr="neurolink",qvr=new Set(["image/png","image/jpeg","image/webp"]),SI=32,Fhe=2048,jvr=100,Vvr=/exceeds(?: or equals)?(?: model's)? maximum context length/i,Hvr=class extends rI{apiKey;baseURL;constructor(e,t,r,n){super(e,"perplexity-decider",t),this.apiKey=n?.apiKey?.trim()||(process.env.PERPLEXITY_API_KEY?.trim()??""),this.baseURL=ISn(n?.baseURL?.trim()||process.env.PERPLEXITY_DECIDER_BASE_URL?.trim()||Lhe),h.debug("Perplexity decision provider initialized (decide only)",{modelName:this.modelName,baseURL:$vr(this.baseURL)?"(invalid)":nr(this.baseURL)})}getDefaultModel(){return Zi("PERPLEXITY_DECIDER_MODEL","pplx-decider-v1-27b")}vendorLabel(){return"Perplexity"}vendorDisplayName(){return"Perplexity Decisions"}decisionApiKey(){return this.apiKey}missingKeyMessage(){return"Perplexity requires an API key. Set PERPLEXITY_API_KEY or pass credentials.perplexityDecider.apiKey."}missingConfigMessage(){return $vr(this.baseURL)}decisionEndpoint(){return`${this.baseURL}${Bvr}`}decisionHeaders(){return{Authorization:`Bearer ${this.apiKey}`,"Content-Type":"application/json",...RSn(this.baseURL)?{"X-Pplx-Integration":Gvr}:{}}}buildDecisionBody(e,t,r,n){const o=n?.images??[];if(o.length===0)return{model:r,state:Uvr(e),questions:t};o.forEach((s,a)=>{const l=FSn(s,a+1);if(l)throw this.decisionError({kind:"invalid_request",message:l,retryable:!1})});const i=Array.isArray(e)?e:e===""?[]:[Uvr(e)];return{model:r,state:[...i,...o.map(s=>({type:"image_url",image_url:{url:s}}))],questions:t}}parseDecisionError(e,t,r){const n=`Perplexity request failed with HTTP ${e}`,o=jT(PSn(t)??n,this.apiKey).replace(/\bpplx-[A-Za-z0-9_-]{30,}/g,"[redacted]").trim()||n,i=MSn(e,o);return{kind:i,message:o,status:e,requestId:r,retryable:i==="rate_limit"||i==="overloaded"||i==="server"}}readRequestId(e){return e.get("x-request-id")??void 0}defaultTimeoutMs(e){const t=this.getDescriptorDecideMs();return t===void 0?void 0:t+e*jvr}readRetryAfterMs(e){const t=e.get("retry-after")?.trim();if(!t)return;const r=/^\d+$/.test(t)?Number(t)*1e3:Date.parse(t)-Date.now();return Number.isFinite(r)&&r>0?Math.ceil(r):void 0}}}}),Wvr={};ce(Wvr,{CloudflareClefProvider:()=>owr});function USn(e){return e.replace(/\/+$/,"")}function Kvr(e){const t=`Set CLOUDFLARE_CLEF_BASE_URL or pass credentials.cloudflareClef.baseURL to a base URL, or leave both unset to use ${$he}.`;try{const r=new URL(e);if(r.protocol!=="https:"&&r.protocol!=="http:")return`The Cloudflare base URL must start with https:// or http://. ${t}`;const n=dj(r,"Cloudflare",t);return n||(r.username||r.password||r.search||r.hash||/[?#]/.test(e)?`The Cloudflare base URL must not carry credentials, a query string or a fragment. ${t}`:void 0)}catch{return`The Cloudflare base URL is not a valid absolute URL. ${t}`}}function Jvr(e){const t=e.trim().replace(/^@cf\/cloudflare\//i,"");return/^[a-z0-9][a-z0-9._-]*$/i.test(t)?t.toLowerCase():void 0}function BSn(e,t){const r=/^data:([a-z]+\/[a-z0-9.+-]+);base64,/i.exec(e)?.[1]?.toLowerCase();return r&&Qvr.has(r)?void 0:`Image ${t} is not a PNG, JPEG or WebP image, the only formats Cloudflare Clef reads.`}function zSn(e){return typeof e=="number"||typeof e=="boolean"?String(e):e}function GSn(e){if(!Fr(e)||!Array.isArray(e.errors))return;const t=e.errors.find(Fr);if(!t||typeof t.message!="string"||t.message==="")return;let r=t.message.slice(0,nwr).trimEnd(),n;const o=ewr.exec(r);if(o&&(n=o[1],r=r.slice(0,o.index).trimEnd()),r=r.replace(/^(?:AiError:\s*|Ai:\s*)+/,"").trim(),r.startsWith("{"))try{const i=JSON.parse(r);if(Fr(i)&&Fr(i.error)){const s=Fr(i.error.details)?i.error.details:void 0,a=Fr(s?.fieldErrors)?Object.entries(s.fieldErrors).flatMap(([c,u])=>Array.isArray(u)?u.filter(d=>typeof d=="string").map(d=>`${c}: ${d}`):[]):[],l=typeof i.error.message=="string"?i.error.message:r;r=a.length>0?`${l}: ${a.join("; ")}`:l}}catch{}return{message:r,code:typeof t.code=="number"?t.code:void 0,requestId:n}}function qSn(e,t){return e===401?"authentication":e===413||t===5021?"max_tokens_exceeded":e===429?"rate_limit":e===503?"overloaded":e>=500?"server":"invalid_request"}var $he,Xvr,Yvr,Zvr,Qvr,ewr,twr,rwr,nwr,owr,jSn=S({async"src/lib/providers/cloudflareClef.ts"(){"use strict";z(),Ft(),oi(),pj(),await VT(),$he="https://api.cloudflare.com/client/v4",Xvr="@cf/cloudflare/",Yvr=250,Zvr=/^[A-Za-z0-9_-]{1,64}$/,Qvr=new Set(["image/png","image/jpeg","image/webp"]),ewr=/\(([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\)\s*$/i,twr=500,rwr=4006,nwr=4096,owr=class extends rI{apiKey;accountId;baseURL;constructor(e,t,r,n){super(e,"cloudflare-clef",t);const o=!!n?.baseURL?.trim();this.apiKey=n?.apiKey?.trim()||(o?"":process.env.CLOUDFLARE_API_KEY?.trim()??""),this.accountId=n?.accountId?.trim()||(process.env.CLOUDFLARE_ACCOUNT_ID?.trim()??""),this.baseURL=USn(n?.baseURL?.trim()||process.env.CLOUDFLARE_CLEF_BASE_URL?.trim()||$he),h.debug("Cloudflare Clef decision provider initialized (decide only)",{modelName:this.modelName,baseURL:Kvr(this.baseURL)?"(invalid)":nr(this.baseURL),accountConfigured:this.accountId!==""})}getDefaultModel(){return Zi("CLOUDFLARE_CLEF_MODEL","clef")}vendorLabel(){return"Cloudflare"}vendorDisplayName(){return"Cloudflare Clef"}decisionApiKey(){return this.apiKey}missingKeyMessage(){return"Cloudflare Clef requires an API token with Workers AI permission. Set CLOUDFLARE_API_KEY or pass credentials.cloudflareClef.apiKey."}missingConfigMessage(){return this.accountId===""?"Cloudflare Clef requires the account id. Set CLOUDFLARE_ACCOUNT_ID or pass credentials.cloudflareClef.accountId.":Zvr.test(this.accountId)?Kvr(this.baseURL):"The Cloudflare account id may contain only letters, digits, '-' and '_'. Copy it from the Cloudflare dashboard."}defaultTimeoutMs(e,t){const r=this.getDescriptorDecideMs();return r===void 0?void 0:r+Math.floor(t/1e3)*Yvr}decisionEndpoint(e){return`${this.baseURL}/accounts/${encodeURIComponent(this.accountId)}/ai/run/${Xvr}${encodeURIComponent(Jvr(e)??e)}`}decisionHeaders(){return{Authorization:`Bearer ${this.apiKey}`,"Content-Type":"application/json"}}buildDecisionBody(e,t,r,n){const o=Jvr(r);if(!o)throw this.decisionError({kind:"invalid_request",message:`"${r.slice(0,40)}" is not a Cloudflare model name. Use "clef" or "clef-flash".`,retryable:!1});const i=(n?.images??[]).map(s=>s.replace(/^data:image\/jpg;base64,/i,"data:image/jpeg;base64,"));return i.forEach((s,a)=>{const l=BSn(s,a+1);if(l)throw this.decisionError({kind:"invalid_request",message:l,retryable:!1})}),n&&(n.images=i,n.bytes=i.reduce((s,a)=>s+Buffer.byteLength(a),0)),{model:o,state:zSn(e),questions:t,...i.length>0?{images:i}:{}}}readDecisionPayload(e){return Fr(e)&&Fr(e.result)?e.result:e}parseDecisionError(e,t,r){const n=`Cloudflare request failed with HTTP ${e}`,o=GSn(t),i=qSn(e,o?.code);let s=jT(o?.message??n,this.apiKey).trim().slice(0,twr)||n;return i==="max_tokens_exceeded"?s+=" Cloudflare counts the whole request, image data included, at about four characters per token.":o?.code===7e3&&(s+='. Check the model name (Clef is served as "clef" and "clef-flash") and the base URL, which must end in /client/v4 and name your account.'),{kind:i,message:s,status:e,requestId:r??o?.requestId,retryable:i==="rate_limit"&&o?.code!==rwr||i==="overloaded"||i==="server"}}readRequestId(e){return e.get("cf-ai-req-id")??e.get("cf-ray")??void 0}}}}),iwr,c5,swr,Uhe,u5,awr=S({"src/lib/adapters/video/klingVideoHandler.ts"(){"use strict";ep(),z(),Ft(),Md(),wh(),Ta(),iwr="https://api.piapi.ai/api/kling/v1",c5=3e4,swr=5e3,Uhe=5*6e4,u5=class{maxDurationSeconds=10;supportedAspectRatios=["16:9","9:16","1:1"];supportedResolutions=["720p","1080p"];apiKey;baseUrl;constructor(e){const t=(e??process.env.KLING_API_KEY??"").trim();this.apiKey=t.length>0?t:null,this.baseUrl=(process.env.KLING_BASE_URL??iwr).replace(/\/$/,"")}isConfigured(){return this.apiKey!==null}async generate(e,t,r){if(!this.apiKey)throw new Ye({code:Ke.PROVIDER_NOT_CONFIGURED,message:"KLING_API_KEY not configured",category:"configuration",severity:"high",retriable:!1});if(!r.imageUrl)throw new Ye({code:Ke.INVALID_INPUT,message:"KlingVideoHandler requires a publicly accessible image URL. Pass options.imageUrl with a URL string pointing to the input image. The PiAPI Kling API does not accept inline base64 image data.",category:"configuration",severity:"high",retriable:!1});const n=Date.now(),o=r.abortSignal,i=await this.submitJob(e,t,r),s=await this.pollUntilComplete(i,o),a=await this.downloadVideo(s),l=Date.now()-n;return h.info(`[KlingVideoHandler] Generated ${a.length} bytes in ${l}ms \u2014 task ${i}`),{data:a,mediaType:"video/mp4",metadata:{duration:r.length??4,dimensions:this.calculateDimensions(r),model:r.model??"kling",provider:"kling",aspectRatio:r.aspectRatio??"16:9",audioEnabled:!1,processingTime:l}}}async submitJob(e,t,r){const n={model:r.model??"kling",task_type:"video_generation",input:{image_url:r.imageUrl,prompt:t,duration:r.length??4,aspect_ratio:r.aspectRatio??"16:9",cfg_scale:.5}},o=await this.fetchWithTimeout(`${this.baseUrl}/image-to-video`,{method:"POST",headers:{Authorization:`Bearer ${this.apiKey}`,"Content-Type":"application/json"},body:JSON.stringify(n)});if(!o.ok){const a=await o.text(),l=o.status===408||o.status===429||o.status>=500;throw new Ye({code:Ke.GENERATION_FAILED,message:`Kling submit failed: ${o.status} \u2014 ${gr(a,500)}`,category:l?"network":"execution",severity:"high",retriable:l,context:{status:o.status}})}const i=await o.json(),s=i.task_id??i.data?.task_id;if(!s)throw new Ye({code:Ke.GENERATION_FAILED,message:"Kling submit response missing task_id",category:"execution",severity:"high",retriable:!1,context:{response:i}});return s}async pollUntilComplete(e,t){const r=Date.now();for(;Date.now()-r<Uhe;){if(t?.aborted)throw new Ye({code:Ke.GENERATION_FAILED,message:`Kling poll for task ${e} aborted by caller`,category:"network",severity:"medium",retriable:!1,context:{taskId:e}});const n=await this.fetchWithTimeout(`${this.baseUrl}/task/${e}`,{method:"GET",headers:{Authorization:`Bearer ${this.apiKey}`}},t);if(!n.ok){const i=await n.text();throw new Ye({code:Ke.GENERATION_FAILED,message:`Kling poll failed: ${n.status} \u2014 ${gr(i,500)}`,category:"network",severity:"medium",retriable:n.status>=500,context:{status:n.status,taskId:e}})}const o=await n.json();if(o.status==="completed"||o.status==="succeeded"){const i=o.video_url??o.output?.video_url;if(!i)throw new Ye({code:Ke.GENERATION_FAILED,message:`Kling task ${e} completed but no video URL returned`,category:"execution",severity:"high",retriable:!1,context:{taskId:e,data:o}});return i}if(o.status==="failed")throw new Ye({code:Ke.GENERATION_FAILED,message:`Kling task ${e} failed: ${o.error??"unknown"}`,category:"execution",severity:"high",retriable:!1,context:{taskId:e,data:o}});await new Promise((i,s)=>{const a=()=>{clearTimeout(l),s(new Ye({code:Ke.GENERATION_FAILED,message:`Kling poll for task ${e} aborted by caller`,category:"network",severity:"medium",retriable:!1,context:{taskId:e}}))},l=setTimeout(()=>{t?.removeEventListener("abort",a),i()},swr);t?.addEventListener("abort",a,{once:!0})})}throw new Ye({code:Ke.POLL_TIMEOUT,message:`Kling task ${e} did not complete within ${Uhe/1e3}s`,category:"timeout",severity:"medium",retriable:!0,context:{taskId:e}})}async downloadVideo(e){try{return await zp(e,{maxBytes:c0,label:"Kling video",timeoutMs:c5})}catch(t){throw new Ye({code:Ke.GENERATION_FAILED,message:`Kling video download rejected: ${t instanceof Error?t.message:String(t)}`,category:"network",severity:"high",retriable:!1,context:{url:e},originalError:t instanceof Error?t:void 0})}}async fetchWithTimeout(e,t,r){const n=new AbortController;let o=!1;const i=setTimeout(()=>{o=!0,n.abort()},c5),s=()=>n.abort();r?.addEventListener("abort",s,{once:!0});try{return await fetch(e,{...t,signal:n.signal})}catch(a){throw a instanceof Error&&a.name==="AbortError"?o?new Ye({code:Ke.GENERATION_FAILED,message:`Kling request timed out after ${c5/1e3}s`,category:"network",severity:"high",retriable:!0,originalError:a}):new Ye({code:Ke.GENERATION_FAILED,message:"Kling request aborted by caller",category:"network",severity:"medium",retriable:!1,originalError:a}):a}finally{r?.removeEventListener("abort",s),clearTimeout(i)}}calculateDimensions(e){const t=e.aspectRatio??"16:9";return(e.resolution??"720p")==="1080p"?t==="1:1"?{width:1080,height:1080}:t==="9:16"?{width:1080,height:1920}:{width:1920,height:1080}:t==="1:1"?{width:720,height:720}:t==="9:16"?{width:720,height:1280}:{width:1280,height:720}}}}}),lwr,d5,cwr=S({"src/lib/adapters/video/replicateVideoHandler.ts"(){"use strict";ep(),z(),wh(),D$(),L$(),lwr="atonamy/wan-alpha",d5=class{maxDurationSeconds=10;supportedAspectRatios=["9:16","16:9","1:1"];supportedResolutions=["720p","1080p"];instanceCredentials;constructor(e){this.instanceCredentials=e}isConfigured(){return Wh(this.instanceCredentials)!==null}async generate(e,t,r){const n=r.credentials?.replicate,o=Wh(n??this.instanceCredentials);if(!o)throw new Ye({code:Ke.PROVIDER_NOT_CONFIGURED,message:"REPLICATE_API_TOKEN not configured",category:"configuration",severity:"high",retriable:!1});const i=Date.now(),s=r.model??lwr,a=`data:image/${this.detectImageType(e)};base64,${e.toString("base64")}`,l=r.imageInputKey!==void 0?{[r.imageInputKey]:a,prompt:t,duration:r.length??4,...r.resolution!==void 0?{resolution:r.resolution}:{}}:{image:a,prompt:t,num_frames:(r.length??4)*24,fps:24,aspect_ratio:r.aspectRatio,...r.resolution!==void 0?{resolution:r.resolution}:{}};let c;try{c=await UC(o,{model:s,input:l},{abortSignal:r.abortSignal})}catch(p){throw new Ye({code:Ke.GENERATION_FAILED,message:`Replicate video generation failed: ${p instanceof Error?p.message:String(p)}`,category:"execution",severity:"high",retriable:!0,context:{model:s,options:r},originalError:p instanceof Error?p:void 0})}let u;try{u=await N$(c)}catch(p){throw new Ye({code:Ke.GENERATION_FAILED,message:`Replicate video download failed: ${p instanceof Error?p.message:String(p)}`,category:"network",severity:"medium",retriable:!0,context:{predictionId:c.id},originalError:p instanceof Error?p:void 0})}const d=Date.now()-i;return h.info(`[ReplicateVideoHandler] Generated ${u.length} bytes in ${d}ms \u2014 model ${s}`),{data:u,mediaType:"video/mp4",metadata:{duration:r.length??4,dimensions:this.calculateDimensions(r),model:s,provider:"replicate",aspectRatio:r.aspectRatio??"16:9",audioEnabled:!1,processingTime:d}}}detectImageType(e){return e.length<4?"jpeg":e[0]===137&&e[1]===80?"png":e[0]===255&&e[1]===216?"jpeg":e[0]===82&&e[1]===73&&e[2]===70&&e[3]===70?"webp":"jpeg"}calculateDimensions(e){const t=e.aspectRatio??"16:9";return(e.resolution??"720p")==="1080p"?t==="1:1"?{width:1080,height:1080}:t==="9:16"?{width:1080,height:1920}:{width:1920,height:1080}:t==="1:1"?{width:720,height:720}:t==="9:16"?{width:720,height:1280}:{width:1280,height:720}}}}}),uwr,p5,dwr,Bhe,m5,pwr=S({"src/lib/adapters/video/runwayVideoHandler.ts"(){"use strict";ep(),z(),Ft(),Md(),wh(),Ta(),uwr="https://api.dev.runwayml.com/v1",p5=3e4,dwr=5e3,Bhe=5*6e4,m5=class{maxDurationSeconds=10;supportedAspectRatios=["16:9","9:16"];supportedResolutions=["720p","1080p"];apiKey;baseUrl;apiVersion;constructor(e){const t=(e??process.env.RUNWAY_API_KEY??"").trim();this.apiKey=t.length>0?t:null,this.baseUrl=(process.env.RUNWAY_BASE_URL??uwr).replace(/\/$/,""),this.apiVersion=process.env.RUNWAY_API_VERSION??"2024-11-06"}isConfigured(){return this.apiKey!==null}async generate(e,t,r){if(!this.apiKey)throw new Ye({code:Ke.PROVIDER_NOT_CONFIGURED,message:"RUNWAY_API_KEY not configured",category:"configuration",severity:"high",retriable:!1});if(r.aspectRatio!==void 0&&!this.supportedAspectRatios.includes(r.aspectRatio))throw new Ye({code:Ke.INVALID_INPUT,message:`Unsupported aspect ratio for Runway: "${r.aspectRatio}". Supported: ${this.supportedAspectRatios.join(", ")}.`,category:"validation",severity:"medium",retriable:!1,context:{requested:r.aspectRatio,supported:this.supportedAspectRatios}});const n=Date.now(),o=r.abortSignal,i=await this.submitTask(e,t,r),s=await this.pollUntilComplete(i,o),a=await this.downloadVideo(s),l=Date.now()-n;return h.info(`[RunwayVideoHandler] Generated ${a.length} bytes in ${l}ms \u2014 task ${i}`),{data:a,mediaType:"video/mp4",metadata:{duration:r.length??4,dimensions:this.calculateDimensions(r),model:r.model??"gen3a_turbo",provider:"runway",aspectRatio:r.aspectRatio??"16:9",audioEnabled:!1,processingTime:l}}}async submitTask(e,t,r){const n=`data:image/${this.detectImageType(e)};base64,${e.toString("base64")}`,o={model:r.model??"gen3a_turbo",promptImage:n,promptText:t,duration:r.length??4,ratio:r.aspectRatio==="9:16"?"9:16":"16:9",seed:void 0},i=await this.fetchWithTimeout(`${this.baseUrl}/image_to_video`,{method:"POST",headers:{Authorization:`Bearer ${this.apiKey}`,"Content-Type":"application/json","X-Runway-Version":this.apiVersion},body:JSON.stringify(o)});if(!i.ok){const a=await i.text(),l=i.status===408||i.status===429||i.status>=500;throw new Ye({code:Ke.GENERATION_FAILED,message:`Runway submit failed: ${i.status} \u2014 ${gr(a,500)}`,category:l?"network":"execution",severity:"high",retriable:l,context:{status:i.status}})}const s=await i.json();if(!s.id)throw new Ye({code:Ke.GENERATION_FAILED,message:"Runway submit response missing id",category:"execution",severity:"high",retriable:!1,context:{response:s}});return s.id}async pollUntilComplete(e,t){const r=Date.now();for(;Date.now()-r<Bhe;){if(t?.aborted)throw new Ye({code:Ke.GENERATION_FAILED,message:`Runway poll for task ${e} aborted by caller`,category:"network",severity:"medium",retriable:!1,context:{taskId:e}});const n=await this.fetchWithTimeout(`${this.baseUrl}/tasks/${e}`,{method:"GET",headers:{Authorization:`Bearer ${this.apiKey}`,"X-Runway-Version":this.apiVersion}},t);if(!n.ok){const i=await n.text();throw new Ye({code:Ke.GENERATION_FAILED,message:`Runway poll failed: ${n.status} \u2014 ${gr(i,500)}`,category:"network",severity:"medium",retriable:n.status>=500})}const o=await n.json();if(o.status==="SUCCEEDED"||o.status==="succeeded"){const i=Array.isArray(o.output)?o.output[0]:o.output;if(typeof i!="string")throw new Ye({code:Ke.GENERATION_FAILED,message:`Runway task ${e} completed but no output URL`,category:"execution",severity:"high",retriable:!1,context:{taskId:e,data:o}});return i}if(o.status==="FAILED"||o.status==="failed")throw new Ye({code:Ke.GENERATION_FAILED,message:`Runway task ${e} failed: ${o.failure??o.error??"unknown"}`,category:"execution",severity:"high",retriable:!1,context:{taskId:e,data:o}});await new Promise((i,s)=>{const a=()=>{clearTimeout(l),s(new Ye({code:Ke.GENERATION_FAILED,message:`Runway poll for task ${e} aborted by caller`,category:"network",severity:"medium",retriable:!1,context:{taskId:e}}))},l=setTimeout(()=>{t?.removeEventListener("abort",a),i()},dwr);t?.addEventListener("abort",a,{once:!0})})}throw new Ye({code:Ke.POLL_TIMEOUT,message:`Runway task ${e} did not complete within ${Bhe/1e3}s`,category:"timeout",severity:"medium",retriable:!0,context:{taskId:e}})}async downloadVideo(e){try{return await zp(e,{maxBytes:c0,label:"Runway video",timeoutMs:p5})}catch(t){throw new Ye({code:Ke.GENERATION_FAILED,message:`Runway video download rejected: ${t instanceof Error?t.message:String(t)}`,category:"network",severity:"high",retriable:!1,context:{url:e},originalError:t instanceof Error?t:void 0})}}async fetchWithTimeout(e,t,r){const n=new AbortController,o=setTimeout(()=>n.abort(),p5),i=()=>n.abort();r?.addEventListener("abort",i,{once:!0});try{return await fetch(e,{...t,signal:n.signal})}catch(s){throw s instanceof Error&&s.name==="AbortError"?new Ye({code:Ke.GENERATION_FAILED,message:`Runway request to ${e} timed out after ${p5/1e3}s`,category:"network",severity:"high",retriable:!0,originalError:s}):new Ye({code:Ke.GENERATION_FAILED,message:`Runway fetch failed: ${s instanceof Error?s.message:String(s)}`,category:"network",severity:"high",retriable:!0,originalError:s instanceof Error?s:void 0})}finally{r?.removeEventListener("abort",i),clearTimeout(o)}}detectImageType(e){return e.length<4?"jpeg":e[0]===137&&e[1]===80?"png":e[0]===255&&e[1]===216?"jpeg":e.length>=12&&e[0]===82&&e[1]===73&&e[2]===70&&e[3]===70&&e[8]===87&&e[9]===69&&e[10]===66&&e[11]===80?"webp":"jpeg"}calculateDimensions(e){const t=e.aspectRatio??"16:9";return(e.resolution??"720p")==="1080p"?t==="9:16"?{width:1080,height:1920}:{width:1920,height:1080}:t==="9:16"?{width:720,height:1280}:{width:1280,height:720}}}}}),mwr={};ce(mwr,{KlingVideoHandler:()=>u5,ReplicateVideoHandler:()=>d5,RunwayVideoHandler:()=>m5,VIDEO_ERROR_CODES:()=>Ke,VertexVideoHandler:()=>jN,VideoError:()=>Ye,VideoProcessor:()=>db,isVertexVideoConfigured:()=>_re,registerDefaultVideoHandlers:()=>hwr});function hwr(){for(const{name:e,factory:t}of gwr)if(!db.supports(e))try{const r=t();if(!r.isConfigured())continue;db.registerHandler(e,r)}catch(r){h.debug(`[video] ${e} auto-registration skipped: ${r instanceof Error?r.message:String(r)}`)}}var fwr,gwr,ywr=S({"src/lib/adapters/video/index.ts"(){"use strict";jv(),z(),wh(),wh(),awr(),cwr(),pwr(),ub(),awr(),cwr(),pwr(),ub(),fwr={vertex:()=>new jN,kling:()=>new u5,runway:()=>new m5,replicate:()=>new d5},gwr=op.filter(e=>e.kind==="video").map(e=>{const t=fwr[e.name];if(!t)throw new Error(`[video] no handler factory for catalog entry "${e.name}"`);return{name:e.name,factory:t}})}});function VSn(e){for(const t of e)_r.registerProvider(t.id,async(r,n,o,i,s)=>{const{ConfiguredDecisionProvider:a}=await wbn().then(()=>jmr);return new a(t,r,o,s)},process.env[uo(t,"model")]||t.models.default,[...t.aliases],er.get(t.id))}var Od,kI=S({"src/lib/factories/providerRegistry.ts"(){"use strict";qs(),z(),hl(),w5r(),jv(),Fm(),Od=class wve{static registered=!1;static registrationPromise=null;static options={enableManualMCP:!1};static realtimeRegistration={};static getRegistrationReport(){return{realtime:{...this.realtimeRegistration}}}static async registerAllProviders(){if(!this.registered){if(this.registrationPromise)return this.registrationPromise;this.registrationPromise=this._doRegister();try{await this.registrationPromise}catch(t){throw this.registrationPromise=null,t}}}static async _doRegister(){try{const{ProviderFactory:t}=await Promise.resolve().then(()=>(qs(),VP));t.registerProvider("google-ai",async(r,n,o,i,s)=>{const a=s,{GoogleAIStudioProvider:l}=await Promise.resolve().then(()=>(oTn(),Shr));return new l(r,o,a)},"gemini-2.5-flash",["googleAiStudio","google","gemini","google-ai","google-ai-studio"],er.get("google-ai")),t.registerProvider("openai",async(r,n,o,i,s)=>{const a=s,{OpenAIProvider:l}=await Promise.resolve().then(()=>(vTn(),rfr));return new l(r,o,void 0,a)},"gpt-4o-mini",["gpt","chatgpt"],er.get("openai")),t.registerProvider("anthropic",async(r,n,o,i,s)=>{const a=s,{AnthropicProvider:l}=await Promise.resolve().then(()=>(a_n(),Zfr));return new l(r,o,void 0,a)},"claude-sonnet-4-6",["claude","anthropic"],er.get("anthropic")),t.registerProvider("bedrock",async(r,n,o,i,s)=>{const a=s,{AmazonBedrockProvider:l}=await Promise.resolve().then(()=>(pEn(),vyr));return new l(r,o,i,a)},void 0,["bedrock","aws"],er.get("bedrock")),t.registerProvider("azure",async(r,n,o,i,s)=>{const a=s,{AzureOpenAIProvider:l}=await Promise.resolve().then(()=>(mEn(),wyr));return new l(r,o,void 0,a)},process.env.AZURE_MODEL||process.env.AZURE_OPENAI_MODEL||process.env.AZURE_OPENAI_DEPLOYMENT||process.env.AZURE_OPENAI_DEPLOYMENT_ID||"gpt-4o-mini",["azure","azureOpenai"],er.get("azure")),t.registerProvider("vertex",async(r,n,o,i,s)=>{const a=s,{GoogleVertexProvider:l}=await Promise.resolve().then(()=>(TEn(),Dyr));return new l(r,n,o,i,a)},"claude-sonnet-4-6",["vertex","googleVertex"],er.get("vertex"));for(const r of t2e)t.registerProvider(r.providerName,async(n,o,i,s,a)=>{const{ConfiguredOpenAICompatProvider:l}=await Promise.resolve().then(()=>(_En(),Nyr));return new l(r,n,i,a)},r.registryDefaultModelChecksEnvVar&&process.env[r.modelEnvVar]||r.registryDefaultModel,r.aliases,er.get(r.providerName));t.registerProvider("ollama",async(r,n,o,i,s)=>{const a=s,{OllamaProvider:l}=await Promise.resolve().then(()=>(SEn(),Vyr));return new l(r,o,void 0,a)},process.env.OLLAMA_MODEL||"llama3.2:latest",["ollama","local"],er.get("ollama")),t.registerProvider("litellm",async(r,n,o,i,s)=>{const a=s,{LiteLLMProvider:l}=await Promise.resolve().then(()=>(CEn(),Yyr));return new l(r,o,void 0,a)},process.env.LITELLM_MODEL||"openai/gpt-4o-mini",["litellm"],er.get("litellm")),t.registerProvider("openai-compatible",async(r,n,o,i,s)=>{const a=s,{OpenAICompatibleProvider:l}=await Promise.resolve().then(()=>(REn(),t0r));return new l(r,o,void 0,a)},process.env.OPENAI_COMPATIBLE_MODEL||void 0,["openai-compatible","vllm","compatible"],er.get("openai-compatible")),t.registerProvider("openrouter",async(r,n,o,i,s)=>{const a=s,{OpenRouterProvider:l}=await Promise.resolve().then(()=>(OEn(),a0r));return new l(r,o,void 0,a)},process.env.OPENROUTER_MODEL||"anthropic/claude-sonnet-4.5",["openrouter","or"],er.get("openrouter")),t.registerProvider("sagemaker",async(r,n,o,i,s)=>{const a=s,{AmazonSageMakerProvider:l}=await Promise.resolve().then(()=>(mSn(),D0r));return new l(r,void 0,i,void 0,a)},process.env.SAGEMAKER_MODEL||"sagemaker-model",["sagemaker","aws-sagemaker"],er.get("sagemaker")),t.registerProvider("nvidia-nim",async(r,n,o,i,s)=>{const a=s,{NvidiaNimProvider:l}=await Promise.resolve().then(()=>(gSn(),G0r));return new l(r,o,void 0,a)},process.env.NVIDIA_NIM_MODEL||er.get("nvidia-nim")?.defaultModel||"openai/gpt-oss-20b",["nvidia","nim","nvidia-nim"],er.get("nvidia-nim")),t.registerProvider("lm-studio",async(r,n,o,i,s)=>{const a=s,{LMStudioProvider:l}=await Promise.resolve().then(()=>(ySn(),q0r));return new l(r,o,void 0,a)},process.env.LM_STUDIO_MODEL||void 0,["lmstudio","lm-studio","lms"],er.get("lm-studio")),t.registerProvider("llamacpp",async(r,n,o,i,s)=>{const a=s,{LlamaCppProvider:l}=await Promise.resolve().then(()=>(vSn(),W0r));return new l(r,o,void 0,a)},process.env.LLAMACPP_MODEL||void 0,["llamacpp","llama.cpp","llama-cpp"],er.get("llamacpp")),t.registerProvider("cohere",async(r,n,o,i,s)=>{const a=s,{CohereProvider:l}=await Promise.resolve().then(()=>(wSn(),evr));return new l(r,o,void 0,a)},process.env.COHERE_MODEL||"command-r-plus-08-2024",["cohere"],er.get("cohere")),t.registerProvider("voyage",async(r,n,o,i,s)=>{const a=s,{VoyageProvider:l}=await bSn().then(()=>ovr);return new l(r,o,void 0,a)},process.env.VOYAGE_MODEL||"voyage-3.5",["voyage","voyage-ai"],er.get("voyage")),t.registerProvider("jina",async(r,n,o,i,s)=>{const a=s,{JinaProvider:l}=await TSn().then(()=>lvr);return new l(r,o,void 0,a)},process.env.JINA_MODEL||"jina-embeddings-v3",["jina","jina-ai"],er.get("jina")),t.registerProvider("stability",async(r,n,o,i,s)=>{const a=s,{StabilityProvider:l}=await _Sn().then(()=>pvr);return new l(r,o,void 0,a)},process.env.STABILITY_MODEL||"stable-image-ultra",["stability","stability-ai","sd"],er.get("stability")),t.registerProvider("ideogram",async(r,n,o,i,s)=>{const a=s,{IdeogramProvider:l}=await ESn().then(()=>gvr);return new l(r,o,void 0,a)},process.env.IDEOGRAM_MODEL||"V_3",["ideogram"],er.get("ideogram")),t.registerProvider("replicate",async(r,n,o,i,s)=>{const a=s,{ReplicateProvider:l}=await kSn().then(()=>bvr);return new l(r,o,void 0,a)},process.env.REPLICATE_MODEL||"meta/meta-llama-3-70b-instruct",["replicate"],er.get("replicate")),t.registerProvider("recraft",async(r,n,o,i,s)=>{const a=s,{RecraftProvider:l}=await xSn().then(()=>Evr);return new l(r,o,void 0,a)},process.env.RECRAFT_MODEL||"recraftv3",["recraft"],er.get("recraft")),t.registerProvider("typesafe",async(r,n,o,i,s)=>{const a=s,{TypeSafeProvider:l}=await Lvr().then(()=>Avr);return new l(r,o,void 0,a)},process.env.TYPESAFE_MODEL||"jev-latest",["jev","typesafe-ai"],er.get("typesafe")),t.registerProvider("perplexity-decider",async(r,n,o,i,s)=>{const a=s,{PerplexityDeciderProvider:l}=await $Sn().then(()=>Fvr);return new l(r,o,void 0,a)},process.env.PERPLEXITY_DECIDER_MODEL||"pplx-decider-v1-27b",[],er.get("perplexity-decider")),t.registerProvider("cloudflare-clef",async(r,n,o,i,s)=>{const a=s,{CloudflareClefProvider:l}=await jSn().then(()=>Wvr);return new l(r,o,void 0,a)},process.env.CLOUDFLARE_CLEF_MODEL||"clef",[],er.get("cloudflare-clef")),VSn(z7()),h.debug("All AI providers registered successfully");try{const{registerDefaultTTSHandlers:r}=await Promise.resolve().then(()=>(ph(),dh));r(),h.debug("TTS handler registration attempted",{providers:qv("tts")})}catch(r){h.warn("Failed to register TTS handlers - TTS functionality will be unavailable",{error:r instanceof Error?r.message:String(r)})}try{const{registerDefaultSTTHandlers:r}=await Promise.resolve().then(()=>(ph(),dh));r(),h.debug("STT handler registration attempted",{providers:qv("stt")})}catch(r){h.warn("Failed to register STT handlers - STT functionality will be unavailable",{error:r instanceof Error?r.message:String(r)})}try{const{registerDefaultRealtimeHandlers:r,RealtimeProcessor:n}=await Promise.resolve().then(()=>(ph(),dh));r();const o=qv("realtime"),i={};for(const a of o)i[a]=n.supports(a)?"ok":"registration failed or handler unavailable";wve.realtimeRegistration=i;const s=Object.entries(i).filter(([,a])=>a!=="ok");s.length===0?h.info(`[ProviderRegistry] Realtime handlers registered: ${o.join(", ")}`):h.warn(`[ProviderRegistry] Realtime handlers partial: ${s.length} skipped`,{outcomes:i})}catch(r){h.warn("Failed to register Realtime handlers - Realtime functionality will be unavailable",{error:r instanceof Error?r.message:String(r)})}try{const{registerDefaultVideoHandlers:r}=await Promise.resolve().then(()=>(ywr(),mwr));r(),h.debug("Video handler registration attempted",{providers:qv("video")})}catch(r){h.warn(`[ProviderRegistry] video registration block failed: ${r instanceof Error?r.message:String(r)}`)}try{const{registerDefaultAvatarHandlers:r}=await Promise.resolve().then(()=>(ide(),ode));r(),h.debug("Avatar handler registration attempted",{providers:qv("avatar")})}catch(r){h.warn("Failed to register Avatar handlers - Avatar functionality will be unavailable",{error:r instanceof Error?r.message:String(r)})}try{const{registerDefaultMusicHandlers:r}=await Promise.resolve().then(()=>(tde(),ede));r(),h.debug("Music handler registration attempted",{providers:qv("music")})}catch(r){h.warn("Failed to register Music handlers - Music functionality will be unavailable",{error:r instanceof Error?r.message:String(r)})}this.registered=!0}catch(t){throw h.error("Failed to register providers:",t),t}}static isRegistered(){return this.registered}static clearRegistrations(){_r.clearRegistrations(),this.registered=!1,this.registrationPromise=null,wve.realtimeRegistration={}}static setOptions(t){this.options={...this.options,...t},h.debug("Provider registry options updated:",this.options)}static getOptions(){return{...this.options}}}}}),xI={};ce(xI,{AIProviderFactory:()=>no});var vwr,wwr,no,Qa=S({"src/lib/core/factory.ts"(){"use strict";Vt(),Zt(),qs(),hl(),kI(),Gh(),z(),XZ(),et(),vwr="aiProviderFactory",wwr=$e.factory,no=class{static normalizeProviderName(e){const t=_r.normalizeProviderName(e);return t||e.toLowerCase()}static async initializeDynamicProviderWithTimeout(){const e="AIProviderFactory.initializeDynamicProviderWithTimeout";try{await Be(jx.initialize(),1e4,ve.toolTimeout("dynamic-provider-init",1e4)),h.debug(`[${e}] Dynamic model provider initialized successfully`)}catch(r){const n=r instanceof Error?r.message:String(r);h.warn(`[${e}] Dynamic model provider initialization failed`,{error:n,fallback:"Using static model defaults"})}}static isDecisionOnly(e){const t=rc.get(e.toLowerCase()),r=t===void 0?void 0:er.get(t)?.inferenceKinds;return r?.length===1&&r[0]==="decide"}static resolveModelFromEnvironment(e,t,r){if(t&&t!=="default")return h.debug(`[${r}] Skipping environment variable check - explicit model provided: ${t}`),t;if(this.isDecisionOnly(e))return h.debug(`[${r}] Skipping chat-model environment variables - ${e} serves decisions only and reads its own model setting`),t;h.debug(`[${r}] Checking environment variables for provider: ${e}`);const n=e.toLowerCase(),i=[{match:["bedrock"],label:"Bedrock",vars:["BEDROCK_MODEL","BEDROCK_MODEL_ID"]},{match:["vertex"],label:"Vertex",vars:["VERTEX_MODEL"]},{match:["azure"],label:"Azure",vars:["AZURE_OPENAI_MODEL","AZURE_OPENAI_DEPLOYMENT","AZURE_OPENAI_DEPLOYMENT_ID"]},{match:["openai","gpt","chatgpt","openai-compat"],label:"OpenAI",vars:["OPENAI_MODEL"]},{match:["anthropic","claude","anthropic-claude"],label:"Anthropic",vars:["ANTHROPIC_MODEL"]},{match:["google","gemini"],label:"Google AI",vars:["GOOGLE_AI_MODEL"]},{match:["mistral"],label:"Mistral",vars:["MISTRAL_MODEL"]},{match:["ollama"],label:"Ollama",vars:["OLLAMA_MODEL"]},{match:["litellm"],label:"LiteLLM",vars:["LITELLM_MODEL"]}].find(l=>l.match.some(c=>n.includes(c)));if(!i)return h.debug(`[${r}] Provider ${e} - no environment variable check implemented`),t;const s=i.vars.find(l=>process.env[l]),a=s?process.env[s]:void 0;return a?(h.debug(`[${r}] Environment variable found for ${i.label}`,{envVariable:s,resolvedModel:a}),a):(h.debug(`[${r}] No ${i.label} environment variables found (${i.vars.join(", ")})`),t)}static async resolveDynamicModelName(e,t,r,n){if(r&&r!=="default"||t&&t!=="default")return h.debug(`[${n}] Skipping dynamic model resolution`,{resolvedModelName:r||"none",reason:"Model already resolved from environment variables or explicit parameter"}),r;if(this.isDecisionOnly(e))return h.debug(`[${n}] Skipping dynamic model resolution`,{resolvedModelName:r||"none",reason:`${e} serves decisions only and reads its own model setting`}),r;h.debug(`[${n}] Attempting dynamic model resolution`,{currentResolvedModel:r||"none",reason:"No environment variable found and no explicit model provided"});try{const o=this.normalizeProviderName(e);jx.needsRefresh()&&(h.debug(`[${n}] Dynamic model provider needs refresh - initializing`),await this.initializeDynamicProviderWithTimeout());const i=jx.resolveModel(o,t||void 0);return i?(h.debug(`[${n}] Resolved dynamic model`,{provider:o,requestedModel:t||"default",resolvedModel:i.id,displayName:i.displayName,pricing:i.pricing.input}),i.id):(h.debug(`[${n}] Dynamic model resolution returned null`,{provider:o,requestedModel:t||"default"}),r)}catch(o){return h.debug(`[${n}] Dynamic model resolution failed, using static fallback`,{error:o instanceof Error?o.message:String(o)}),r}}static async createResolvedProvider(e,t,r,n,o,i){await Be(Od.registerAllProviders(),3e4,ve.toolTimeout("provider-registration",3e4));const s=this.normalizeProviderName(e),a=t==="default"||t===null?void 0:t;h.debug(`[${o}] Final provider configuration`,{originalProviderName:e,normalizedProviderName:s,resolvedModelName:t||"not resolved",finalModelName:a||"using provider default"});const l=await Be(_r.createProvider(s,a,r,n,i),3e4,ve.toolTimeout(`provider-creation:${s}`,3e4));return{normalizedName:s,finalModelName:a,provider:l}}static async createProvider(e,t,r=!0,n,o,i){const s="AIProviderFactory.createProvider";return wwr.startActiveSpan("factory.createProvider",{kind:ln.INTERNAL,attributes:{"provider.name":e,"model.name":t||"default","mcp.enabled":r}},async a=>{h.debug(`[${s}] Provider creation started`,{providerName:e,modelName:t||"default",enableMCP:r,environmentVariables:{BEDROCK_MODEL:process.env.BEDROCK_MODEL||"not set",BEDROCK_MODEL_ID:process.env.BEDROCK_MODEL_ID||"not set",VERTEX_MODEL:process.env.VERTEX_MODEL||"not set",OPENAI_MODEL:process.env.OPENAI_MODEL||"not set"}});try{let l=this.resolveModelFromEnvironment(e,t,s);l=await this.resolveDynamicModelName(e,t,l,s);const{normalizedName:c,finalModelName:u,provider:d}=await this.createResolvedProvider(e,l,n,o,s,i);return h.debug(`[AIProviderFactory] Provider creation completed { providerName: '${c}', modelName: '${u}' }`),h.debug(`[AIProviderFactory] Resolved model: ${u}`),h.debug(vwr,"Pure factory pattern provider created",{providerName:c,modelName:u,factoryUsed:!0}),a.setAttribute("provider.resolved_name",c),u&&a.setAttribute("model.resolved_name",u),h.debug(`[${s}] Provider creation succeeded`,{providerName:e,modelName:u||"default",providerType:d.constructor.name,mcpEnabled:r}),a.setStatus({code:ze.OK}),d}catch(l){const c=l instanceof Error?l.message:String(l);throw a.setStatus({code:ze.ERROR,message:c}),a.recordException(l instanceof Error?l:new Error(String(l))),h.debug(`[${s}] Provider creation failed`,{providerName:e,modelName:t||"default",error:c}),l}finally{a.end()}})}static async createProviderWithModel(e,t){const r="AIProviderFactory.createProviderWithModel";h.debug(`[${r}] Provider model creation started`,{provider:e,model:t});try{const n=await this.createProvider(e,t);return h.debug(`[${r}] Provider model creation succeeded`,{provider:e,model:t,providerType:n.constructor.name}),n}catch(n){const o=n instanceof Error?n.message:String(n);throw h.debug(`[${r}] Provider model creation failed`,{provider:e,model:t,error:o}),n}}static async createBestProvider(e,t,r=!0,n){const o="AIProviderFactory.createBestProvider";try{const i=await mT(e);return h.debug(`[${o}] Best provider selected`,{requestedProvider:e||"auto",selectedProvider:i,modelName:t||"default",enableMCP:r}),await this.createProvider(i,t,r,n)}catch(i){const s=i instanceof Error?i.message:String(i);throw h.debug(`[${o}] Best provider selection failed`,{requestedProvider:e||"auto",error:s}),i}}static async createProviderWithFallback(e,t,r,n=!0){const o="AIProviderFactory.createProviderWithFallback";h.debug(`[${o}] Fallback provider setup started`,{primaryProvider:e,fallbackProvider:t,modelName:r||"default",enableMCP:n});try{const i=await this.createProvider(e,r,n),s=await this.createProvider(t,r,n);return h.debug(`[${o}] Fallback provider setup succeeded`,{primaryProvider:e,fallbackProvider:t,modelName:r||"default",enableMCP:n}),{primary:i,fallback:s}}catch(i){const s=i instanceof Error?i.message:String(i);throw h.debug(`[${o}] Fallback provider setup failed`,{primaryProvider:e,fallbackProvider:t,error:s}),i}}}}});function AI(e,t,r,n){if(e instanceof tn)return e;const o=e instanceof Error?e.message:String(e),i=e instanceof Error?e:void 0;return new qhe(o,i,t,r,n)}var tn,bwr,Twr,_wr,E0,a_,h5,zhe,f5,Ghe,qhe,Ewr,Swr,Ic,l_,g5,c_,u_,kwr,jhe,Vhe,Hhe,Whe,xwr,Su=S({"src/lib/server/errors.ts"(){"use strict";lt(),tn=class oPr extends Error{code;category;severity;retryable;retryAfterMs;requestId;path;method;details;cause;constructor(t,r,n={}){super(t),this.name="ServerAdapterError",this.code=r,this.category=n.category??Lr.EXECUTION,this.severity=n.severity??ao.MEDIUM,this.retryable=n.retryable??!1,this.retryAfterMs=n.retryAfterMs,this.requestId=n.requestId,this.path=n.path,this.method=n.method,this.details=n.details,this.cause=n.cause,Error.captureStackTrace&&Error.captureStackTrace(this,oPr)}toJSON(){return{error:{code:this.code,message:this.message,category:this.category,requestId:this.requestId,details:this.details,retryAfter:this.retryAfterMs?Math.ceil(this.retryAfterMs/1e3):void 0}}}getHttpStatus(){switch(this.code){case Rr.VALIDATION_ERROR:case Rr.SCHEMA_ERROR:case Rr.INVALID_CONFIG:case Rr.INVALID_ROUTE:return 400;case Rr.AUTH_REQUIRED:case Rr.AUTH_INVALID:return 401;case Rr.FORBIDDEN:return 403;case Rr.ROUTE_NOT_FOUND:return 404;case Rr.RATE_LIMIT_EXCEEDED:return 429;case Rr.TIMEOUT:return 408;case Rr.STREAM_ABORTED:return 499;default:return 500}}},bwr=class extends tn{constructor(e,t,r){super(e,Rr.INVALID_CONFIG,{category:Lr.CONFIG,severity:ao.HIGH,retryable:!1,details:t,cause:r}),this.name="ConfigurationError"}},Twr=class extends tn{constructor(e,t,r){super(`Route conflict: ${t} ${e} conflicts with existing route${r?`: ${r}`:""}`,Rr.ROUTE_CONFLICT,{category:Lr.CONFIG,severity:ao.HIGH,retryable:!1,path:e,method:t,details:{existingRoute:r}}),this.name="RouteConflictError"}},_wr=class extends tn{constructor(e,t,r){super(`Route not found: ${t} ${e}`,Rr.ROUTE_NOT_FOUND,{category:Lr.VALIDATION,severity:ao.LOW,retryable:!1,path:e,method:t,requestId:r}),this.name="RouteNotFoundError"}},E0=class extends tn{errors;constructor(e,t){super(`Validation failed: ${e.map(r=>r.message).join(", ")}`,Rr.VALIDATION_ERROR,{category:Lr.VALIDATION,severity:ao.LOW,retryable:!1,requestId:t,details:{errors:e}}),this.name="ValidationError",this.errors=e}},a_=class extends tn{constructor(e="Authentication required",t){super(e,Rr.AUTH_REQUIRED,{category:Lr.AUTHENTICATION,severity:ao.MEDIUM,retryable:!1,requestId:t}),this.name="AuthenticationError"}},h5=class extends tn{constructor(e="Invalid authentication credentials",t){super(e,Rr.AUTH_INVALID,{category:Lr.AUTHENTICATION,severity:ao.MEDIUM,retryable:!1,requestId:t}),this.name="InvalidAuthenticationError"}},zhe=class extends tn{constructor(e="Access forbidden",t,r){super(e,Rr.FORBIDDEN,{category:Lr.AUTHORIZATION,severity:ao.MEDIUM,retryable:!1,requestId:t,details:{requiredPermissions:r}}),this.name="AuthorizationError"}},f5=class extends tn{constructor(e,t,r){super(t??"Too many requests, please try again later",Rr.RATE_LIMIT_EXCEEDED,{category:Lr.RATE_LIMIT,severity:ao.MEDIUM,retryable:!0,retryAfterMs:e,requestId:r}),this.name="RateLimitError"}},Ghe=class extends tn{constructor(e,t,r){super(`Operation timed out after ${e}ms${t?`: ${t}`:""}`,Rr.TIMEOUT,{category:Lr.EXECUTION,severity:ao.MEDIUM,retryable:!0,requestId:r,details:{timeoutMs:e,operation:t}}),this.name="ServerTimeoutError"}},qhe=class extends tn{constructor(e,t,r,n,o){super(e,Rr.HANDLER_ERROR,{category:Lr.EXECUTION,severity:ao.HIGH,retryable:!1,cause:t,requestId:r,path:n,method:o}),this.name="HandlerError"}},Ewr=class extends tn{constructor(e,t,r){super(e,Rr.STREAM_ERROR,{category:Lr.STREAMING,severity:ao.MEDIUM,retryable:!1,cause:t,requestId:r}),this.name="StreamingError"}},Swr=class extends tn{constructor(e,t){super(`Stream aborted${e?`: ${e}`:""}`,Rr.STREAM_ABORTED,{category:Lr.STREAMING,severity:ao.LOW,retryable:!1,requestId:t,details:{reason:e}}),this.name="StreamAbortedError"}},Ic=class extends tn{constructor(e,t,r){super(e,Rr.WEBSOCKET_ERROR,{category:Lr.WEBSOCKET,severity:ao.MEDIUM,retryable:!0,cause:t,details:{connectionId:r}}),this.name="WebSocketError"}},l_=class extends tn{constructor(e="WebSocket connection failed",t){super(e,Rr.WEBSOCKET_CONNECTION_FAILED,{category:Lr.WEBSOCKET,severity:ao.HIGH,retryable:!0,cause:t}),this.name="WebSocketConnectionError"}},g5=class extends tn{constructor(e,t,r,n){super(e,Rr.START_FAILED,{category:Lr.CONFIG,severity:ao.CRITICAL,retryable:!0,cause:t,details:{port:r,host:n}}),this.name="ServerStartError"}},c_=class extends tn{constructor(e,t){super(e,Rr.STOP_FAILED,{category:Lr.EXECUTION,severity:ao.HIGH,retryable:!1,cause:t}),this.name="ServerStopError"}},u_=class extends tn{constructor(e,t){super(`Server is already running${e&&t?` on ${t}:${e}`:""}`,Rr.ALREADY_RUNNING,{category:Lr.CONFIG,severity:ao.LOW,retryable:!1,details:{port:e,host:t}}),this.name="AlreadyRunningError"}},kwr=class extends tn{constructor(){super("Server is not running",Rr.NOT_RUNNING,{category:Lr.CONFIG,severity:ao.LOW,retryable:!1}),this.name="NotRunningError"}},jhe=class extends tn{timeoutMs;remainingConnections;constructor(e,t){super(`Shutdown timed out after ${e}ms with ${t} active connection(s)`,Rr.STOP_FAILED,{category:Lr.EXECUTION,severity:ao.HIGH,retryable:!1,details:{timeoutMs:e,remainingConnections:t}}),this.name="ShutdownTimeoutError",this.timeoutMs=e,this.remainingConnections=t}},Vhe=class extends tn{timeoutMs;remainingConnections;constructor(e,t){super(`Connection drain timed out after ${e}ms with ${t} active connection(s)`,Rr.STOP_FAILED,{category:Lr.EXECUTION,severity:ao.MEDIUM,retryable:!1,details:{timeoutMs:e,remainingConnections:t}}),this.name="DrainTimeoutError",this.timeoutMs=e,this.remainingConnections=t}},Hhe=class extends tn{currentState;expectedStates;operation;constructor(e,t,r){super(`Cannot ${e}: server is in '${t}' state, expected one of [${r.join(", ")}]`,Rr.STOP_FAILED,{category:Lr.CONFIG,severity:ao.MEDIUM,retryable:!1,details:{operation:e,currentState:t,expectedStates:r}}),this.name="InvalidLifecycleStateError",this.currentState=t,this.expectedStates=r,this.operation=e}},Whe=class extends tn{constructor(e,t,r){super(`Missing dependency '${e}' for ${t} adapter. ${r?`Install with: ${r}`:""}`,Rr.MISSING_DEPENDENCY,{category:Lr.CONFIG,severity:ao.CRITICAL,retryable:!1,details:{dependency:e,framework:t,installCommand:r}}),this.name="MissingDependencyError"}},xwr={[Lr.CONFIG]:{strategy:"fail",maxRetries:0,baseDelayMs:0},[Lr.VALIDATION]:{strategy:"fail",maxRetries:0,baseDelayMs:0},[Lr.EXECUTION]:{strategy:"retry",maxRetries:3,baseDelayMs:1e3},[Lr.EXTERNAL]:{strategy:"exponentialBackoff",maxRetries:5,baseDelayMs:1e3},[Lr.RATE_LIMIT]:{strategy:"exponentialBackoff",maxRetries:3,baseDelayMs:5e3},[Lr.AUTHENTICATION]:{strategy:"fail",maxRetries:0,baseDelayMs:0},[Lr.AUTHORIZATION]:{strategy:"fail",maxRetries:0,baseDelayMs:0},[Lr.STREAMING]:{strategy:"retry",maxRetries:2,baseDelayMs:500},[Lr.WEBSOCKET]:{strategy:"exponentialBackoff",maxRetries:5,baseDelayMs:1e3}}}});function HSn(e){if(!(e instanceof Error))return!1;const t=e.code;return t==="ERR_MODULE_NOT_FOUND"||t==="MODULE_NOT_FOUND"}var d_,CI=S({"src/lib/server/abstract/baseServerAdapter.ts"(){"use strict";eo(),Zn(),et(),z(),gd(),Su(),d_=class extends fn{config;redactionConfig;neurolink;toolRegistry;externalServerManager;routes=new Map;middlewares=[];isRunning=!1;startTime;frameworkReady=!1;pendingMiddlewares=[];pendingRouteKeys=new Set;lifecycleState="uninitialized";activeConnections=new Map;shutdownConfig;constructor(e,t={}){super(),this.neurolink=e,this.toolRegistry=e.getToolRegistry(),this.externalServerManager=e.getExternalServerManager(),this.redactionConfig=t.redaction,this.shutdownConfig={gracefulShutdownTimeoutMs:t.shutdown?.gracefulShutdownTimeoutMs??3e4,drainTimeoutMs:t.shutdown?.drainTimeoutMs??15e3,forceClose:t.shutdown?.forceClose??!0},this.config={port:t.port??3e3,host:t.host??"0.0.0.0",basePath:t.basePath??"/api",cors:{enabled:t.cors?.enabled??!0,origins:t.cors?.origins??[],methods:t.cors?.methods??["GET","POST","PUT","DELETE","PATCH","OPTIONS"],headers:t.cors?.headers??["Content-Type","Authorization","X-Request-ID"],credentials:t.cors?.credentials??!1,maxAge:t.cors?.maxAge??86400},rateLimit:{enabled:t.rateLimit?.enabled??!0,windowMs:t.rateLimit?.windowMs??900*1e3,maxRequests:t.rateLimit?.maxRequests??100,message:t.rateLimit?.message??"Too many requests, please try again later",skipPaths:t.rateLimit?.skipPaths,keyGenerator:t.rateLimit?.keyGenerator},bodyParser:{enabled:t.bodyParser?.enabled??!0,maxSize:t.bodyParser?.maxSize??"10mb",jsonLimit:t.bodyParser?.jsonLimit??"10mb",rawMaxSize:t.bodyParser?.rawMaxSize??t.bodyParser?.maxSize??"64mb",urlEncoded:t.bodyParser?.urlEncoded??!0},logging:{enabled:t.logging?.enabled??!0,level:t.logging?.level??"info",includeBody:t.logging?.includeBody??!1,includeResponse:t.logging?.includeResponse??!1},timeout:t.timeout??3e4,enableMetrics:t.enableMetrics??!0,enableSwagger:t.enableSwagger??!1,disableBuiltInHealth:t.disableBuiltInHealth??!1,shutdown:this.shutdownConfig}}getNativeServer(){}async importFrameworkDependency(e,t){try{return await Al(e,`${t} server adapter`)}catch(r){throw r instanceof Error&&HSn(r.cause)?new Whe(e,t,`pnpm add ${e}`):r}}async initialize(){if(this.lifecycleState!=="uninitialized"&&this.lifecycleState!=="stopped")throw new Hhe("initialize",this.lifecycleState,["uninitialized","stopped"]);this.lifecycleState="initializing",h.info("[ServerAdapter] Initializing server adapter",{port:this.config.port,host:this.config.host,basePath:this.config.basePath});const e=Ce.createSpan("server.request","server.initialize",{"server.operation":"initialize","server.port":this.config.port,"server.host":this.config.host}),t=Date.now();try{await this.initializeFramework(),this.frameworkReady=!0,this.registerBuiltInMiddleware(),this.flushPendingRegistrations(),await this.registerBuiltInRoutes(),this.lifecycleState="initialized",this.emit("initialized",{config:this.config,routeCount:this.routes.size,middlewareCount:this.middlewares.length}),h.info("[ServerAdapter] Server adapter initialized",{routes:this.routes.size,middlewares:this.middlewares.length}),e.durationMs=Date.now()-t;const r=Ce.endSpan(e,1);rt().recordSpan(r)}catch(r){this.lifecycleState="error",e.durationMs=Date.now()-t;const n=Ce.endSpan(e,2);throw n.statusMessage=r instanceof Error?r.message:String(r),rt().recordSpan(n),r}}registerRoute(e){const t=`${e.method.toUpperCase()}:${e.path}`;this.routes.has(t)&&h.warn(`[ServerAdapter] Route ${t} already exists, replacing`),this.routes.set(t,e),this.frameworkReady?this.registerFrameworkRoute(e):this.pendingRouteKeys.add(t),h.debug(`[ServerAdapter] Registered route: ${t}`,{description:e.description,streaming:e.streaming?.enabled,auth:e.auth})}registerRouteGroup(e){if(e.middleware)for(const t of e.middleware)this.registerMiddleware({...t,paths:t.paths??[e.prefix]});for(const t of e.routes){const r=!t.path.startsWith(e.prefix),n=this.normalizePath(r?`${e.prefix}${t.path}`:t.path),o={...t,path:n};this.registerRoute(o)}h.debug(`[ServerAdapter] Registered route group: ${e.prefix}`,{routes:e.routes.length,middleware:e.middleware?.length??0})}normalizePath(e){return"/"+e.split("/").filter(Boolean).join("/")}registerMiddleware(e){this.middlewares.push(e),this.frameworkReady?this.registerFrameworkMiddleware(e):this.pendingMiddlewares.push(e),h.debug(`[ServerAdapter] Registered middleware: ${e.name}`,{order:e.order,paths:e.paths})}logRequestError(e,t,r){if(r instanceof tn&&r.getHttpStatus()<500){h.warn(`[${e}] Request rejected`,{requestId:t,code:r.code,error:r.message});return}h.error(`[${e}] Request error`,{requestId:t,error:r.message,stack:r.stack})}emitRequestError(e){this.listenerCount("error")>0&&this.emit("error",e)}flushPendingRegistrations(){const e=this.pendingMiddlewares,t=this.pendingRouteKeys;this.pendingMiddlewares=[],this.pendingRouteKeys=new Set;for(const r of e)this.registerFrameworkMiddleware(r);for(const r of t){const n=this.routes.get(r);n&&this.registerFrameworkRoute(n)}}createContext(e){return{requestId:e.requestId,method:e.method,path:e.path,headers:e.headers,query:e.query??{},params:e.params??{},body:e.body,neurolink:this.neurolink,toolRegistry:this.toolRegistry,externalServerManager:this.externalServerManager,timestamp:Date.now(),metadata:{},redaction:this.redactionConfig}}registerBuiltInMiddleware(){this.registerMiddleware({name:"requestId",order:0,handler:async(e,t)=>(e.requestId=e.requestId||this.generateRequestId(),t())}),this.config.logging.enabled&&this.registerMiddleware({name:"logging",order:1,handler:async(e,t)=>{const r=Date.now();h.info(`[ServerAdapter] ${e.method} ${e.path}`,{requestId:e.requestId});const n=await t();return h.info(`[ServerAdapter] ${e.method} ${e.path} completed`,{requestId:e.requestId,duration:Date.now()-r}),n}})}async registerBuiltInRoutes(){this.config.disableBuiltInHealth||(this.registerRoute({method:"GET",path:`${this.config.basePath}/health`,handler:async()=>({status:"ok",timestamp:new Date().toISOString(),uptime:this.startTime?Date.now()-this.startTime.getTime():0,version:process.env.npm_package_version||"unknown"}),description:"Health check endpoint",tags:["system"]}),this.registerRoute({method:"GET",path:`${this.config.basePath}/ready`,handler:async e=>{const t=e.toolRegistry,r=this.config.timeout||5e3;let n,o;try{n=await Be(t.listTools(),r,new Error(`toolRegistry.listTools timed out after ${r}ms`)),o=n.length>0}catch(i){h.warn("[ServerAdapter] Tool registry check timed out",{timeout:r,error:i instanceof Error?i.message:String(i)}),o=!1}return{ready:!0,timestamp:new Date().toISOString(),services:{neurolink:!0,tools:o,externalServers:!!e.externalServerManager}}},description:"Readiness check endpoint",tags:["system"]})),this.config.enableMetrics&&this.registerRoute({method:"GET",path:`${this.config.basePath}/metrics`,handler:async()=>{const e=this.getStatus();return{server:{running:e.running,uptime:e.uptime,routes:e.routes,middlewares:e.middlewares},process:{memoryUsage:process.memoryUsage(),cpuUsage:process.cpuUsage(),pid:process.pid},timestamp:new Date().toISOString()}},description:"Server metrics endpoint",tags:["system"]})}generateRequestId(){return`req-${Date.now()}-${Math.random().toString(36).substring(2,11)}`}getLifecycleState(){return this.lifecycleState}trackConnection(e,t,r){this.activeConnections.set(e,{id:e,createdAt:Date.now(),socket:t,requestId:r,isActive:!0}),h.debug("[ServerAdapter] Connection tracked",{connectionId:e,activeConnections:this.activeConnections.size})}untrackConnection(e){this.activeConnections.delete(e)&&h.debug("[ServerAdapter] Connection untracked",{connectionId:e,activeConnections:this.activeConnections.size})}getActiveConnectionCount(){return this.activeConnections.size}async gracefulShutdown(){const{gracefulShutdownTimeoutMs:e,drainTimeoutMs:t,forceClose:r}=this.shutdownConfig;h.info("[ServerAdapter] Starting graceful shutdown",{activeConnections:this.activeConnections.size,gracefulShutdownTimeoutMs:e,drainTimeoutMs:t});const n=Ce.createSpan("server.request","server.shutdown",{"server.operation":"gracefulShutdown","server.activeConnections":this.activeConnections.size}),o=Date.now();let i,s;try{this.lifecycleState="draining",await this.stopAcceptingConnections(),h.info("[ServerAdapter] Stopped accepting new connections");const a=this.drainConnections(),l=new Promise((p,m)=>{i=setTimeout(()=>{m(new jhe(e,this.activeConnections.size))},e)}),c=new Promise(p=>{s=setTimeout(()=>{p("drain_timeout")},t)});if(await Promise.race([a,c])==="drain_timeout"&&this.activeConnections.size>0)if(h.warn("[ServerAdapter] Drain timeout reached",{remainingConnections:this.activeConnections.size}),r)h.info("[ServerAdapter] Force closing remaining connections"),await this.forceCloseConnections();else throw new Vhe(t,this.activeConnections.size);this.lifecycleState="stopping",await Promise.race([this.closeServer(),l]),h.info("[ServerAdapter] Server closed successfully"),n.durationMs=Date.now()-o;const d=Ce.endSpan(n,1);rt().recordSpan(d)}catch(a){if(r&&(a instanceof jhe||a instanceof Vhe)){h.warn("[ServerAdapter] Timeout during shutdown, forcing close",{error:a.message}),await this.forceCloseConnections(),await this.closeServer(),n.durationMs=Date.now()-o;const l=Ce.endSpan(n,1);rt().recordSpan(l)}else{this.lifecycleState="error",n.durationMs=Date.now()-o;const l=Ce.endSpan(n,2);throw l.statusMessage=a instanceof Error?a.message:String(a),rt().recordSpan(l),a}}finally{i&&clearTimeout(i),s&&clearTimeout(s)}}async drainConnections(){if(this.activeConnections.size===0){h.debug("[ServerAdapter] No active connections to drain");return}return h.info("[ServerAdapter] Draining connections",{count:this.activeConnections.size}),new Promise(e=>{const t=setInterval(()=>{this.activeConnections.size===0&&(clearInterval(t),h.info("[ServerAdapter] All connections drained"),e())},100)})}resetServerState(){this.isRunning=!1,this.startTime=void 0,this.activeConnections.clear(),this.lifecycleState="stopped",h.debug("[ServerAdapter] Server state reset for restart capability")}validateLifecycleState(e,t){if(!t.includes(this.lifecycleState))throw new Hhe(e,this.lifecycleState,t)}getStatus(){return{running:this.isRunning,port:this.config.port,host:this.config.host,uptime:this.startTime?Date.now()-this.startTime.getTime():0,routes:this.routes.size,middlewares:this.middlewares.length,lifecycleState:this.lifecycleState,activeConnections:this.activeConnections.size}}listRoutes(){return Array.from(this.routes.values())}getConfig(){return{...this.config}}}}});function II(e){return typeof e=="object"&&e!==null&&"error"in e&&typeof e.error=="object"&&e.error!==null&&"code"in e.error&&"message"in e.error}function WSn(e){return{VALIDATION_ERROR:400,SCHEMA_ERROR:400,TOOL_NOT_FOUND:404,SERVER_NOT_FOUND:404,SESSION_NOT_FOUND:404,NOT_FOUND:404,AUTH_REQUIRED:401,AUTH_INVALID:401,FORBIDDEN:403,RATE_LIMIT_EXCEEDED:429,MCP_UNAVAILABLE:503,MEMORY_UNAVAILABLE:503,SKILLS_UNAVAILABLE:503,EXECUTION_FAILED:500,INTERNAL_ERROR:500}[e]??500}function Ut(e,t,r,n,o){return{error:{code:e,message:t,details:r},metadata:{timestamp:new Date().toISOString(),requestId:n},httpStatus:o??WSn(e)}}function Rc(e,t,r){const n=e.safeParse(t);return n.success?{success:!0,data:n.data}:{success:!1,error:Ut("VALIDATION_ERROR","Invalid request body",n.error.issues.map(o=>({path:o.path.join("."),message:o.message,code:o.code})),r)}}function KSn(e,t,r){const n=e.safeParse(t);return n.success?{success:!0,data:n.data}:{success:!1,error:Ut("VALIDATION_ERROR","Invalid query parameters",n.error.issues.map(o=>({path:o.path.join("."),message:o.message,code:o.code})),r)}}function ku(e,t,r){const n=e.safeParse(t);return n.success?{success:!0,data:n.data}:{success:!1,error:Ut("VALIDATION_ERROR","Invalid path parameters",n.error.issues.map(o=>({path:o.path.join("."),message:o.message,code:o.code})),r)}}var y5,Awr,Khe,Jhe,v5,Xhe,p_,w5,Cwr,Yhe,JSn,XSn,Iwr,Rwr,Zhe,Mwr,Pwr,RI,b5,Owr,YSn,ZSn,Qhe,Dwr,Nwr,T5,Lwr,Fwr,$wr,QSn,xu=S({"src/lib/server/utils/validation.ts"(){"use strict";nn(),y5=M.object({input:M.union([M.string(),M.object({text:M.string(),images:M.array(M.string()).optional(),files:M.array(M.string()).optional()})]),provider:M.string().optional(),model:M.string().optional(),systemPrompt:M.string().optional(),temperature:M.number().min(0).max(2).optional(),maxTokens:M.number().positive().optional(),tools:M.array(M.string()).optional(),stream:M.boolean().optional(),sessionId:M.string().optional(),userId:M.string().optional()}),Awr=M.object({provider:M.string().optional(),model:M.string().optional(),systemPrompt:M.string().optional(),temperature:M.number().min(0).max(2).optional(),maxTokens:M.number().positive().optional(),maxSteps:M.number().positive().optional()}),Khe=M.object({prompt:M.string().min(1,"Prompt is required"),options:Awr.optional()}),Jhe=M.object({name:M.string().min(1,"Tool name is required"),arguments:M.record(M.string(),M.unknown()).default({}),sessionId:M.string().optional(),userId:M.string().optional()}),v5=M.record(M.string(),M.unknown()),Xhe=M.object({sessionId:M.string().min(1,"Session ID is required")}),p_=M.object({name:M.string().min(1,"Server name is required")}),w5=M.object({name:M.string().min(1,"Tool name is required")}),Cwr=M.object({q:M.string().optional(),source:M.string().optional(),limit:M.string().transform(e=>parseInt(e,10)).pipe(M.number().positive().max(100)).optional()}),Yhe=M.object({id:M.string().min(1,"Session ID is required")}),JSn=M.object({userId:M.string().optional(),limit:M.string().transform(e=>parseInt(e,10)).pipe(M.number().positive().max(100)).optional(),offset:M.string().transform(e=>parseInt(e,10)).pipe(M.number().nonnegative()).optional()}),XSn=M.object({limit:M.string().transform(e=>parseInt(e,10)).pipe(M.number().positive().max(100)).optional(),offset:M.string().transform(e=>parseInt(e,10)).pipe(M.number().nonnegative()).optional()}),Iwr=M.object({text:M.string().min(1,"Text is required"),provider:M.string().optional(),model:M.string().optional()}),Rwr=M.object({texts:M.array(M.string().min(1)).min(1,"At least one text is required").max(2048,"Maximum 2048 texts per batch"),provider:M.string().optional(),model:M.string().optional()}),Zhe=M.object({name:M.string().min(1,"Name is required"),displayName:M.string().optional(),description:M.string().min(1,"Description is required"),instructions:M.string().min(1,"Instructions are required"),tags:M.array(M.string()).optional(),scope:M.enum(["global","scoped"]).optional(),scopeIds:M.array(M.string()).optional(),requestedBy:M.string().optional()}),Mwr=Zhe.partial(),Pwr=M.object({term:M.string().trim().min(1,"term is required"),heardAs:M.array(M.string()).max(64).optional(),meaning:M.string().max(2e3).optional()}),RI=M.string().min(1).max(100),b5=M.string().trim().regex(/^(?:source|[A-Za-z]{2,3}(?:-[A-Za-z]{4})?(?:-(?:[A-Za-z]{2}|\d{3}))?)$/u,"must be a BCP-47 tag such as es, fr-CA or hi-Latn, or source"),Owr=M.object({languages:M.array(b5).max(8),provider:M.string().min(1).max(100).optional(),model:M.string().min(1).max(200).optional(),timeoutMs:M.number().int().positive().max(12e4).optional(),contextUtterances:M.number().int().min(0).max(10).optional(),glossary:M.boolean().optional()}),YSn=M.object({type:M.literal("output"),languages:M.array(b5).max(8)}),ZSn=M.object({type:M.literal("subscribe"),languages:M.array(b5).max(8).optional(),speakers:M.array(M.string().min(1).max(100)).max(64).optional(),backlog:M.boolean().optional(),interim:M.boolean().optional()}),Qhe=M.number().finite().nonnegative().nullish(),Dwr=M.object({id:M.string().min(1).max(200),source:M.enum(["primary","shadow"]),model:M.string().max(200),participant_identity:M.string().max(500),participant_name:M.string().max(500).optional(),text:M.string().max(2e4),language:M.string().max(35).nullish(),start_time:Qhe,end_time:Qhe,received_at:M.number().finite().nonnegative()}),Nwr=M.object({call_id:M.string().min(1).max(500),room:M.string().max(500).optional(),batch:M.number().int().nonnegative(),final:M.boolean().optional(),models:M.object({primary:M.string().max(200),shadow:M.string().max(200)}),segments:M.array(Dwr).max(5e3)}),T5=M.object({provider:RI.optional(),model:M.string().min(1).max(200).optional(),language:M.string().min(1).max(35).optional(),prompt:M.string().max(4e3).optional(),dictionary:M.array(Pwr).max(500).optional(),correction:M.object({enabled:M.boolean().optional(),guard:M.enum(["decide","none"]).optional(),decideTimeoutMs:M.number().int().positive().max(6e4).optional(),rewrite:M.union([M.literal(!1),M.literal("auto"),M.object({provider:M.string().min(1).max(100).optional(),model:M.string().min(1).max(200).optional(),timeoutMs:M.number().int().positive().max(12e4).optional(),mode:M.enum(["auto","always"]).optional()})]).optional(),perSentence:M.boolean().optional(),transliterate:M.enum(["latin","native"]).optional(),punctuate:M.boolean().optional(),cleanup:M.enum(["verbatim","clean"]).optional(),secondOpinion:M.union([M.literal("auto"),M.object({provider:RI,model:M.string().min(1).max(200).optional()})]).optional(),context:M.string().max(1e3).optional(),maxDropRatio:M.number().min(0).max(1).optional(),contextUtterances:M.number().int().min(0).max(10).optional()}).optional(),fallback:M.object({provider:RI,model:M.string().min(1).max(200).optional(),when:M.array(M.enum(["unsure","empty","error"])).optional()}).optional(),routing:M.object({probe:M.boolean().optional(),lockAfterPasses:M.number().int().min(1).max(5).optional(),prior:M.enum(["carry","none"]).optional(),engines:M.record(M.string().min(1).max(35),RI).refine(e=>Object.keys(e).length<=64,{message:"at most 64 routes"}).optional()}).optional(),chunking:M.enum(["engine","utterances"]).optional(),output:Owr.optional(),diarization:M.boolean().optional(),wordTimestamps:M.boolean().optional(),timeoutMs:M.number().int().positive().max(6e5).optional()}),Lwr=T5.extend({audio:M.string().min(1).optional(),audioUrl:M.string().url().optional(),audioPath:M.string().min(1).optional(),format:M.enum(["mp3","wav","ogg","opus","m4a","flac","webm","mp4","mpeg","mpga","pcm16"]).optional()}).refine(e=>[e.audio,e.audioUrl,e.audioPath].filter(t=>t!==void 0).length===1,{message:"Pass exactly one of audio, audioUrl or audioPath"}),Fwr=T5.extend({mode:M.enum(["live","file"]).optional(),streaming:M.object({mode:M.enum(["auto","native","chunked"]).optional(),sampleRate:M.number().int().min(8e3).max(48e3).optional(),endSilenceMs:M.number().positive().optional(),intervalMs:M.number().positive().optional(),softCutSeconds:M.number().positive().optional(),maxUtteranceSeconds:M.number().positive().optional(),onsetRms:M.number().positive().optional(),prerollMs:M.number().nonnegative().optional(),minSpeechMs:M.number().nonnegative().optional(),concurrency:M.number().int().min(1).max(8).optional(),finalRetries:M.number().int().min(0).max(3).optional(),vad:M.object({engine:M.enum(["auto","silero","energy"]).optional(),onset:M.number().min(0).max(1).optional(),sustain:M.number().min(0).max(1).optional(),startMs:M.number().nonnegative().max(2e3).optional()}).optional(),normalize:M.boolean().optional()}).optional()}),$wr=Fwr.omit({mode:!0}).extend({completed:M.enum(["corrected","final"]).optional(),correctionWaitMs:M.number().int().min(0).max(3e4).optional(),clientLanguage:M.boolean().optional(),clientTurnDetection:M.boolean().optional()}),QSn=M.record(M.string().min(1).max(100),$wr)}});function _5(e){return typeof e=="string"&&zwr.test(e)}function Uwr(e){if(typeof e=="number"&&Number.isFinite(e)&&e>0)return e;const t=typeof e=="string"?e.trim().match(/^(\d+(?:\.\d+)?)\s*(b|kb|mb|gb)?$/i):null;if(!t)return 10*1024*1024;const r={b:1,kb:1024,mb:1024*1024,gb:1024*1024*1024};return Math.floor(Number(t[1])*r[(t[2]??"b").toLowerCase()])}async function Bwr(e,t){const r=[];let n=0;for await(const o of e){const i=typeof o=="string"?Buffer.from(o):o;if(n+=i.length,n>t)throw new m_(t);r.push(i)}return Buffer.concat(r)}function E5(e){return typeof Response<"u"&&e instanceof Response}async function efe(e){const t={};return e.headers.forEach((r,n)=>{t[n]=r}),{status:e.status,headers:t,body:Buffer.from(await e.arrayBuffer())}}var zwr,m_,MI=S({"src/lib/server/utils/rawBody.ts"(){"use strict";zwr=/^\s*(multipart\/form-data|application\/octet-stream|audio\/[\w.+-]+)\s*(;|$)/i,m_=class extends Error{status=413;constructor(e){super(`Request body exceeds the server's ${e}-byte limit`),this.name="RawBodyTooLargeError"}}}}),Gwr={};ce(Gwr,{ExpressServerAdapter:()=>tfe});var tfe,qwr=S({"src/lib/server/adapters/expressAdapter.ts"(){"use strict";z(),Su(),CI(),xu(),MI(),tfe=class extends d_{app;server;frameworkInitialized=!1;sockets=new Set;constructor(e,t={}){super(e,t)}initializeFramework(){}async initializeFrameworkAsync(){if(this.frameworkInitialized)return;const t=(await this.importFrameworkDependency("express","Express")).default;if(this.app=t(),this.config.bodyParser.enabled){const r=this.config.bodyParser.maxSize||this.config.bodyParser.jsonLimit||"10mb";this.app.use(t.json({limit:this.config.bodyParser.jsonLimit||r})),this.app.use(t.urlencoded({extended:!0,limit:r})),this.app.use(t.raw({type:n=>_5(n.headers["content-type"]),limit:this.config.bodyParser.rawMaxSize||"64mb"}))}if(this.config.cors.enabled){const n=(await this.importFrameworkDependency("cors","Express")).default;this.app.use(n({origin:this.config.cors.origins.includes("*")?"*":this.config.cors.origins,methods:this.config.cors.methods,allowedHeaders:this.config.cors.headers,credentials:this.config.cors.credentials,maxAge:this.config.cors.maxAge}))}if(this.config.rateLimit.enabled){const n=(await this.importFrameworkDependency("express-rate-limit","Express")).default,o=this.config.rateLimit.windowMs,i=n({windowMs:o,max:this.config.rateLimit.maxRequests,message:{error:{code:"RATE_LIMIT_EXCEEDED",message:this.config.rateLimit.message}},standardHeaders:!0,legacyHeaders:!1,handler:(s,a)=>{const l=Math.ceil(o/1e3);a.setHeader("Retry-After",String(l)),a.status(429).json({error:{code:"RATE_LIMIT_EXCEEDED",message:this.config.rateLimit.message},metadata:{timestamp:new Date().toISOString(),retryAfter:l}})}});this.app.use(i)}this.app.use((r,n,o)=>{const i=r.headers["x-request-id"]||this.generateRequestId();r.headers["x-request-id"]=i,n.setHeader("X-Request-ID",i),o()}),this.config.logging.enabled&&this.app.use((r,n,o)=>{const i=Date.now(),s=r.headers["x-request-id"];h.info(`[ExpressAdapter] ${r.method} ${r.path}`,{requestId:s}),n.on("finish",()=>{h.info(`[ExpressAdapter] ${r.method} ${r.path} ${n.statusCode}`,{requestId:s,duration:Date.now()-i})}),o()}),this.frameworkInitialized=!0}async initialize(){try{await this.initializeFrameworkAsync()}catch(e){throw this.lifecycleState="error",e}await super.initialize()}registerFrameworkRoute(e){const t=e.method.toLowerCase();this.app[t](e.path,async(r,n,o)=>{const i=r.headers["x-request-id"],s=Date.now(),a=this.createContext({requestId:i,method:r.method,path:r.path,headers:r.headers,query:r.query,params:r.params,body:r.body});n.locals.responseHeaders&&(a.responseHeaders={...n.locals.responseHeaders}),this.emit("request",{requestId:i,method:a.method,path:a.path,timestamp:new Date});try{if(e.streaming?.enabled)return this.handleStreamingResponse(n,a,e);const l=await e.handler(a),c=Date.now()-s;if(E5(l)){const u=await efe(l);this.emit("response",{requestId:i,statusCode:u.status,duration:c,timestamp:new Date});for(const[d,p]of Object.entries({...a.responseHeaders,...u.headers}))n.setHeader(d,p);n.status(u.status).send(u.body);return}if(II(l)){const u=l.httpStatus??500;if(this.emit("response",{requestId:i,statusCode:u,duration:c,timestamp:new Date}),a.responseHeaders)for(const[d,p]of Object.entries(a.responseHeaders))n.setHeader(d,p);n.status(u).json({error:l.error,metadata:{...l.metadata,requestId:i,timestamp:new Date().toISOString(),duration:c}});return}if(this.emit("response",{requestId:i,statusCode:200,duration:c,timestamp:new Date}),a.responseHeaders)for(const[u,d]of Object.entries(a.responseHeaders))n.setHeader(u,d);n.json({data:l,metadata:{requestId:i,timestamp:new Date().toISOString(),duration:c}})}catch(l){o(l)}}),this.setupErrorHandler()}errorHandlerRegistered=!1;setupErrorHandler(){this.errorHandlerRegistered||(this.errorHandlerRegistered=!0,this.app.use((e,t,r,n)=>{const o=t.headers["x-request-id"];this.logRequestError("ExpressAdapter",o,e),this.emitRequestError({requestId:o,error:e,timestamp:new Date});const i=e instanceof tn,s=!i&&"type"in e&&e.type==="entity.too.large",a=i?e.getHttpStatus():s?413:500,l=i?e.code:s?"PAYLOAD_TOO_LARGE":"INTERNAL_ERROR",c=i||s?e.message:"An internal error occurred";r.status(a).json({error:{code:l,message:c},metadata:{requestId:o,timestamp:new Date().toISOString()}})}))}async handleStreamingResponse(e,t,r){e.setHeader("Content-Type","text/event-stream"),e.setHeader("Cache-Control","no-cache"),e.setHeader("Connection","keep-alive");try{const n=await r.handler(t);if(n&&typeof n=="object"&&Symbol.asyncIterator in n)for await(const o of n)e.write(`event: message
2216
2216
  `),e.write(`data: ${JSON.stringify(o)}
2217
2217
 
2218
2218
  `);else e.write(`event: complete
@@ -17,8 +17,9 @@ export declare class AIProviderFactory {
17
17
  /**
18
18
  * A provider whose descriptor declares `inferenceKinds` of exactly `["decide"]`
19
19
  * names its own model (its registered default reads its own variable), so a
20
- * chat provider's model variable has no claim on it. Exactly `["decide"]`: a
21
- * provider that also serves text keeps its chat-model fallbacks.
20
+ * chat provider's model variable has no claim on it, nor does the chat model
21
+ * registry. Exactly `["decide"]`: a provider that also serves text keeps its
22
+ * chat-model fallbacks.
22
23
  */
23
24
  private static isDecisionOnly;
24
25
  private static resolveModelFromEnvironment;
@@ -51,8 +51,9 @@ export class AIProviderFactory {
51
51
  /**
52
52
  * A provider whose descriptor declares `inferenceKinds` of exactly `["decide"]`
53
53
  * names its own model (its registered default reads its own variable), so a
54
- * chat provider's model variable has no claim on it. Exactly `["decide"]`: a
55
- * provider that also serves text keeps its chat-model fallbacks.
54
+ * chat provider's model variable has no claim on it, nor does the chat model
55
+ * registry. Exactly `["decide"]`: a provider that also serves text keeps its
56
+ * chat-model fallbacks.
56
57
  */
57
58
  static isDecisionOnly(providerName) {
58
59
  const canonical = PROVIDER_ALIAS_INDEX.get(providerName.toLowerCase());
@@ -151,6 +152,17 @@ export class AIProviderFactory {
151
152
  });
152
153
  return resolvedModelName;
153
154
  }
155
+ // The registry lists chat providers, and a decision-only provider reads its
156
+ // own model setting, so loading it for one can only cost: it is awaited (up
157
+ // to the 10 s init timeout), tries a local port, then GitHub, then a file,
158
+ // and is tried again by the next call when every source fails.
159
+ if (this.isDecisionOnly(providerName)) {
160
+ logger.debug(`[${functionTag}] Skipping dynamic model resolution`, {
161
+ resolvedModelName: resolvedModelName || "none",
162
+ reason: `${providerName} serves decisions only and reads its own model setting`,
163
+ });
164
+ return resolvedModelName;
165
+ }
154
166
  logger.debug(`[${functionTag}] Attempting dynamic model resolution`, {
155
167
  currentResolvedModel: resolvedModelName || "none",
156
168
  reason: "No environment variable found and no explicit model provided",
@@ -6932,7 +6932,7 @@
6932
6932
  {"objectID":"414073f854b4e0089e242f2f22fbfaf3f7e6eedefd0c50b7d59b869892a88ff7","title":"Old Complex Approach (Removed)","url":"/docs/guides/domain-specific#old-complex-approach-removed","content":"Old Complex Approach (Removed)","hierarchy":{"lvl0":"Guides","lvl1":"Domain-Specific AI Usage Guide","lvl2":"Old Complex Approach (Removed)","lvl3":""}},
6933
6933
  {"objectID":"9e4ad8dacc4c35053c269f93b548667a415aeb50ac75c886c9fe4c690ec9642b","title":"New Simple Approach (Current)","url":"/docs/guides/domain-specific#new-simple-approach-current","content":"New Simple Approach (Current)","hierarchy":{"lvl0":"Guides","lvl1":"Domain-Specific AI Usage Guide","lvl2":"New Simple Approach (Current)","lvl3":""}},
6934
6934
  {"objectID":"decae422fa08532a517df169300f8b19a6200d3d66e9d8942b99e501f400101c","title":"๐Ÿ”ง Migration Guide","url":"/docs/guides/domain-specific#-migration-guide","content":"If you were using the old domain configuration:\nRemove old config: pnpm cli config reset (optional)\nUse simple parameters: Add evaluationDomain to your requests\nEnable features: Use enableEvaluation and enableAnalytics flags\n\nBefore:\n\nAfter:\n\nThis simplified approach gives you all the domain-specific AI benefits without configuration complexity.","hierarchy":{"lvl0":"Guides","lvl1":"Domain-Specific AI Usage Guide","lvl2":"๐Ÿ”ง Migration Guide","lvl3":""}},
6935
- {"objectID":"11123a060c91ea3b304978b427176ba793f0ccc1d7d37e2c9a7e833cce3becb1","title":"Dynamic Model Configuration System","url":"/docs/guides/dynamic-models","content":"Dynamic Model Configuration System\n\nThis document describes the new dynamic model configuration system that replaces static enums with flexible, runtime-configurable model definitions.\n\n๐ŸŽฏ Overview\n\nThe dynamic model system enables:\nRuntime model discovery from external configuration sources\nAutomatic fallback to local configurations when external sources fail\nSmart model resolution with fuzzy matching and aliases\nCapability-based search to find models with specific features\nCost optimization by automatically selecting cheapest models for tasks\n\n๐Ÿ—๏ธ Architecture\n\nComponents\nModel Configuration Server (scripts/modelServer.js)\nServes model configurations via REST API\nProvides search and filtering capabilities\nCan be hosted anywhere (GitHub, CDN, internal server)\nDynamic Model Provider (src/lib/core/dynamicModels.ts)\nLoads configurations from multiple sources with fallback\nCaches configurations to reduce network requests\nValidates configurations using Zod schemas\nProvides intelligent model resolution\nModel Configuration (config/models.json)\nJSON-based model definitions\nIncludes pricing, capabilities, and metadata\nSupports aliases and provider defaults\n\n๐Ÿš€ Quick Start\nEnvironment Setup\n\nBefore using the dynamic model system, ensure your provider configurations are set up correctly. See the Provider Configuration Guide for detailed instructions.\nStart the Model Server\n\nServer runs on http://localhost:3001 by default.\nTest the System\nUse in Code\n\n๐Ÿ“ก API Endpoints\n\nModel Server Endpoints\nGET /health - Health check\nGET /api/v1/models - Get all model configurations\nGET /api/v1/models/:provider - Get models for specific provider\nGET /api/v1/search?capability=X&maxPrice=Y - Search models by criteria\n\nExample API Usage\n\n๐Ÿ”ง Configuration Schema\n\nModel Configuration Structure\n\nKey Fields\nid: Provider-specific model identifier\ndisplayName: Human-readable model name\ncapabilities: Array of model capabilities (functionCalling, vision, etc.)\ndeprecated: Whether the model is deprecated\npricing: Input/output token costs per 1K tokens\ncontextWindow: Maximum context window size\nreleaseDate: Model release date\n\n๐ŸŽ›๏ธ Advanced Usage\n\nConfiguration Sources\n\nThe system tries multiple sources in order:\nprocess.env.MODEL_CONFIG_URL - Custom URL override\nhttp://localhost:3001/api/v1/models - Local development server\nhttps://raw.githubusercontent.com/juspay/neurolink/release/config/models.json - GitHub\n./config/models.json - Local fallback\n\nModel Resolution Logic\n\nCapability Search Options\n\n๐Ÿ”„ Migration from Static Enums\n\nBefore (Static Enums)\n\nAfter (Dynamic Resolution)\n\n๐Ÿ” Production Deployment\n\nEnvironment Variables\n\nHosting Configuration\nGitHub Pages: Host models.json as static file\nCDN: Use CloudFlare/AWS CloudFront for global distribution\nInternal API: Integrate with existing infrastructure\nFile System: Local configurations for air-gapped environments\n\nCache Strategy\n5-minute cache: Balances freshness with performance\nGraceful degradation: Falls back to cached data on network failures\nManual refresh: dynamicModelProvider.refresh() for immediate updates\n\n๐Ÿงช Testing\n\nThe test suite verifies:\n\nโœ… Model provider initialization\nโœ… Configuration loading from multiple sources\nโœ… Model resolution (exact, default, fuzzy, alias)\nโœ… Capability-based search\nโœ… Best model selection algorithms\nโœ… Error handling and fallbacks\n\nRun tests with:\n\n๐Ÿš€ Benefits\n๐Ÿ”„ Future-Proof: New models automatically available\n๐Ÿ’ฐ Cost-Optimized: Runtime selection based on pricing\n๐Ÿ›ก๏ธ Reliable: Multiple fallback sources\nโšก Fast: Cached configurations with smart invalidation\n๐Ÿ”’ Type-Safe: Zod schemas ensure runtime safety\n๐Ÿ”ง Backward Compatible: Existing code continues working\n\nThis system transforms static model definitions into a dynamic, self-updating platform that scales with the rapidly evolving AI landscape.","hierarchy":{"lvl0":"Guides","lvl1":"Dynamic Model Configuration System","lvl2":"","lvl3":""}},
6935
+ {"objectID":"11123a060c91ea3b304978b427176ba793f0ccc1d7d37e2c9a7e833cce3becb1","title":"Dynamic Model Configuration System","url":"/docs/guides/dynamic-models","content":"Dynamic Model Configuration System\n\nThis document describes the new dynamic model configuration system that replaces static enums with flexible, runtime-configurable model definitions.\n\n๐ŸŽฏ Overview\n\nThe dynamic model system enables:\nRuntime model discovery from external configuration sources\nAutomatic fallback to local configurations when external sources fail\nSmart model resolution with fuzzy matching and aliases\nCapability-based search to find models with specific features\nCost optimization by automatically selecting cheapest models for tasks\n\n๐Ÿ—๏ธ Architecture\n\nComponents\nModel Configuration Server (scripts/modelServer.js)\nServes model configurations via REST API\nProvides search and filtering capabilities\nCan be hosted anywhere (GitHub, CDN, internal server)\nDynamic Model Provider (src/lib/core/dynamicModels.ts)\nLoads configurations from multiple sources with fallback\nCaches configurations to reduce network requests\nValidates configurations using Zod schemas\nProvides intelligent model resolution\nModel Configuration (config/models.json)\nJSON-based model definitions\nIncludes pricing, capabilities, and metadata\nSupports aliases and provider defaults\n\n๐Ÿš€ Quick Start\nEnvironment Setup\n\nBefore using the dynamic model system, ensure your provider configurations are set up correctly. See the Provider Configuration Guide for detailed instructions.\nStart the Model Server\n\nServer runs on http://localhost:3001 by default.\nTest the System\nUse in Code\n\n๐Ÿ“ก API Endpoints\n\nModel Server Endpoints\nGET /health - Health check\nGET /api/v1/models - Get all model configurations\nGET /api/v1/models/:provider - Get models for specific provider\nGET /api/v1/search?capability=X&maxPrice=Y - Search models by criteria\n\nExample API Usage\n\n๐Ÿ”ง Configuration Schema\n\nModel Configuration Structure\n\nKey Fields\nid: Provider-specific model identifier\ndisplayName: Human-readable model name\ncapabilities: Array of model capabilities (functionCalling, vision, etc.)\ndeprecated: Whether the model is deprecated\npricing: Input/output token costs per 1K tokens\ncontextWindow: Maximum context window size\nreleaseDate: Model release date\n\n๐ŸŽ›๏ธ Advanced Usage\n\nConfiguration Sources\n\nThe system tries multiple sources in order:\nprocess.env.MODEL_CONFIG_URL - Custom URL override\nhttp://localhost:3001/api/v1/models - Local development server\nhttps://raw.githubusercontent.com/juspay/neurolink/release/config/models.json - GitHub\n./config/models.json - Local fallback\n\nOnly chat providers use these sources. A decision provider (the decide\ninference type) reads its own model setting and never loads them.\n\nModel Resolution Logic\n\nCapability Search Options\n\n๐Ÿ”„ Migration from Static Enums\n\nBefore (Static Enums)\n\nAfter (Dynamic Resolution)\n\n๐Ÿ” Production Deployment\n\nEnvironment Variables\n\nHosting Configuration\nGitHub Pages: Host models.json as static file\nCDN: Use CloudFlare/AWS CloudFront for global distribution\nInternal API: Integrate with existing infrastructure\nFile System: Local configurations for air-gapped environments\n\nCache Strategy\n5-minute cache: Balances freshness with performance\nGraceful degradation: Falls back to cached data on network failures\nManual refresh: dynamicModelProvider.refresh() for immediate updates\n\n๐Ÿงช Testing\n\nThe test suite verifies:\n\nโœ… Model provider initialization\nโœ… Configuration loading from multiple sources\nโœ… Model resolution (exact, default, fuzzy, alias)\nโœ… Capability-based search\nโœ… Best model selection algorithms\nโœ… Error handling and fallbacks\n\nRun tests with:\n\n๐Ÿš€ Benefits\n๐Ÿ”„ Future-Proof: New models automatically available\n๐Ÿ’ฐ Cost-Optimized: Runtime selection based on pricing\n๐Ÿ›ก๏ธ Reliable: Multiple fallback sources\nโšก Fast: Cached configurations with smart invalidation\n๐Ÿ”’ Type-Safe: Zod schemas ensure runtime safety\n๐Ÿ”ง Backward Compatible: Existing code continues working\n\nThis system transforms static model definitions into a dynamic, self-updating platform that scales with the rapidly evolving AI landscape.","hierarchy":{"lvl0":"Guides","lvl1":"Dynamic Model Configuration System","lvl2":"","lvl3":""}},
6936
6936
  {"objectID":"db0dd52cd471bbbf32227e2195168f0402abbbb17462a95fec58b9ff60387e0e","title":"Dynamic Model Configuration System","url":"/docs/guides/dynamic-models#dynamic-model-configuration-system","content":"This document describes the new dynamic model configuration system that replaces static enums with flexible, runtime-configurable model definitions.","hierarchy":{"lvl0":"Guides","lvl1":"Dynamic Model Configuration System","lvl2":"Dynamic Model Configuration System","lvl3":""}},
6937
6937
  {"objectID":"98d59f7bb1b48c946b9671430c1a48b627caa50c718285629a2ccdca68461f6f","title":"๐ŸŽฏ Overview","url":"/docs/guides/dynamic-models#-overview","content":"The dynamic model system enables:\nRuntime model discovery from external configuration sources\nAutomatic fallback to local configurations when external sources fail\nSmart model resolution with fuzzy matching and aliases\nCapability-based search to find models with specific features\nCost optimization by automatically selecting cheapest models for tasks","hierarchy":{"lvl0":"Guides","lvl1":"Dynamic Model Configuration System","lvl2":"๐ŸŽฏ Overview","lvl3":""}},
6938
6938
  {"objectID":"61687b3b7ac0a3524d872ed6d9e535b66c7e7f888ca25202373543b085cd358c","title":"Components","url":"/docs/guides/dynamic-models#components","content":"Model Configuration Server (scripts/modelServer.js)\nServes model configurations via REST API\nProvides search and filtering capabilities\nCan be hosted anywhere (GitHub, CDN, internal server)\nDynamic Model Provider (src/lib/core/dynamicModels.ts)\nLoads configurations from multiple sources with fallback\nCaches configurations to reduce network requests\nValidates configurations using Zod schemas\nProvides intelligent model resolution\nModel Configuration (config/models.json)\nJSON-based model definitions\nIncludes pricing, capabilities, and metadata\nSupports aliases and provider defaults","hierarchy":{"lvl0":"Guides","lvl1":"Dynamic Model Configuration System","lvl2":"Components","lvl3":""}},
@@ -6944,7 +6944,7 @@
6944
6944
  {"objectID":"44a7c3552d226686afe7bcd07306d423f895b6594053ceaea4e3d91d02fd0b7e","title":"Example API Usage","url":"/docs/guides/dynamic-models#example-api-usage","content":"Example API Usage","hierarchy":{"lvl0":"Guides","lvl1":"Dynamic Model Configuration System","lvl2":"Example API Usage","lvl3":""}},
6945
6945
  {"objectID":"67f064b3683be73cb6e6b7cb977710e02544fa1d4bc2ff21ae53cb660a9bd6af","title":"Model Configuration Structure","url":"/docs/guides/dynamic-models#model-configuration-structure","content":"Model Configuration Structure","hierarchy":{"lvl0":"Guides","lvl1":"Dynamic Model Configuration System","lvl2":"Model Configuration Structure","lvl3":""}},
6946
6946
  {"objectID":"9219ec439a82c9925daf0a3d17fcb470741c29c85cb4eeb094c5a69a9a98d4bd","title":"Key Fields","url":"/docs/guides/dynamic-models#key-fields","content":"id: Provider-specific model identifier\ndisplayName: Human-readable model name\ncapabilities: Array of model capabilities (functionCalling, vision, etc.)\ndeprecated: Whether the model is deprecated\npricing: Input/output token costs per 1K tokens\ncontextWindow: Maximum context window size\nreleaseDate: Model release date","hierarchy":{"lvl0":"Guides","lvl1":"Dynamic Model Configuration System","lvl2":"Key Fields","lvl3":""}},
6947
- {"objectID":"0f264f6be2e93ba8e2a581391c1e9b1fca8fe98a53533e93362c8da8bba29dc0","title":"Configuration Sources","url":"/docs/guides/dynamic-models#configuration-sources","content":"The system tries multiple sources in order:\nprocess.env.MODEL_CONFIG_URL - Custom URL override\nhttp://localhost:3001/api/v1/models - Local development server\nhttps://raw.githubusercontent.com/juspay/neurolink/release/config/models.json - GitHub\n./config/models.json - Local fallback","hierarchy":{"lvl0":"Guides","lvl1":"Dynamic Model Configuration System","lvl2":"Configuration Sources","lvl3":""}},
6947
+ {"objectID":"0f264f6be2e93ba8e2a581391c1e9b1fca8fe98a53533e93362c8da8bba29dc0","title":"Configuration Sources","url":"/docs/guides/dynamic-models#configuration-sources","content":"The system tries multiple sources in order:\nprocess.env.MODEL_CONFIG_URL - Custom URL override\nhttp://localhost:3001/api/v1/models - Local development server\nhttps://raw.githubusercontent.com/juspay/neurolink/release/config/models.json - GitHub\n./config/models.json - Local fallback\n\nOnly chat providers use these sources. A decision provider (the decide\ninference type) reads its own model setting and never loads them.","hierarchy":{"lvl0":"Guides","lvl1":"Dynamic Model Configuration System","lvl2":"Configuration Sources","lvl3":""}},
6948
6948
  {"objectID":"b688f0ce894e3129cf9cf4f16256f66b5c7e68e0f6dba297bb7944fca37d5115","title":"Model Resolution Logic","url":"/docs/guides/dynamic-models#model-resolution-logic","content":"Model Resolution Logic","hierarchy":{"lvl0":"Guides","lvl1":"Dynamic Model Configuration System","lvl2":"Model Resolution Logic","lvl3":""}},
6949
6949
  {"objectID":"7db5af405a30c15d8205661f5688afb88863bf77da535269e1c31d9c95f5339a","title":"Capability Search Options","url":"/docs/guides/dynamic-models#capability-search-options","content":"Capability Search Options","hierarchy":{"lvl0":"Guides","lvl1":"Dynamic Model Configuration System","lvl2":"Capability Search Options","lvl3":""}},
6950
6950
  {"objectID":"1496da3154d5741db46365221066e76d4eb6228a9a7f64f4dc05669648a5e92a","title":"Before (Static Enums)","url":"/docs/guides/dynamic-models#before-static-enums","content":"Before (Static Enums)","hierarchy":{"lvl0":"Guides","lvl1":"Dynamic Model Configuration System","lvl2":"Before (Static Enums)","lvl3":""}},
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@juspay/neurolink",
3
- "version": "13.8.3",
3
+ "version": "13.8.4",
4
4
  "packageManager": "pnpm@10.15.1",
5
5
  "description": "The pipe layer of an AI nervous system: one interface connecting provider neurons to your application, across three inference types โ€” generate, stream and decide. `decide` returns typed, calibrated judgements from a non-generative model (~400ms, ~$0.00002/call) for routing, tool selection and context budgeting. MCP-native (4 transports), voice TTS/STT/realtime, RAG, agents, memory, compaction, 9 observability exporters. OpenAI ยท Anthropic ยท Gemini ยท Bedrock ยท Azure ยท Ollama ยท TypeSafe Jev and more.",
6
6
  "author": {