diff --git a/tools/server/public/bundle.js b/tools/server/public/bundle.js index 03c1feda2..c89599f5a 100644 --- a/tools/server/public/bundle.js +++ b/tools/server/public/bundle.js @@ -5153,180 +5153,151 @@ onclick?.apply(this,$$args)}),append($$anchor2,button_1)};if_block(node_3,$$rend items-center justify-center opacity-0 transition-opacity group-hover:opacity-100">'),root$1F=from_html("
");function ChatAttachmentsListItemThumbnailImage($$anchor,$$props){push$1($$props,!0);const image2=$$anchor2=>{var img=root_1$$();template_effect(()=>{set_attribute(img,"src",$$props.preview),set_attribute(img,"alt",$$props.name),set_class(img,1,`${height()??""} ${width()??""} cursor-pointer object-cover ${imageClass()??""}`)}),append($$anchor2,img)};let className=prop( $$props,"class",3,""),height=prop($$props,"height",3,"h-16"),imageClass=prop($$props,"imageClass",3,""),readonly2=prop($$props,"readonly",3,!1),width=prop($$props,"width",3,"w-auto");var div=root$1F(),node2=child(div);{var consequent=$$anchor2=>{var button=root_2$17(),node_1=child(button);image2(node_1),reset(button),template_effect(()=>set_attribute(button,"aria-label",`Preview ${$$props.name??""}`)),delegated("click",button,function(...$$args){$$props.onclick?.apply(this,$$args)}),append($$anchor2, button)},alternate=$$anchor2=>{image2($$anchor2)};if_block(node2,$$render=>{$$props.onclick?$$render(consequent):$$render(alternate,-1)})}var node_2=sibling(node2,2);{var consequent_1=$$anchor2=>{var div_1=root_4$B(),node_3=child(div_1);ActionIcon(node_3,{class:"text-white",get icon(){return X},onclick:()=>$$props.onRemove?.($$props.id),stopPropagationOnClick:!0,tooltip:"Remove"}),reset(div_1),append($$anchor2,div_1)};if_block(node_2,$$render=>{readonly2()||$$render(consequent_1)})}reset(div),template_effect( -()=>set_class(div,1,`group relative overflow-hidden rounded-lg bg-muted shadow-lg dark:border dark:border-muted ${className()??""}`)),append($$anchor,div),pop()}delegate(["click"]);class ChatService{static async sendMessage(messages,options={},conversationId,signal){const{stream,onChunk,onComplete,onError,onReasoningChunk,onToolCallChunk,onModel,onTimings,tools,temperature,max_tokens,dynatemp_range,dynatemp_exponent,top_k,top_p,min_p,xtc_probability,xtc_threshold,typ_p,repeat_last_n,repeat_penalty, -presence_penalty,frequency_penalty,dry_multiplier,dry_base,dry_allowed_length,dry_penalty_last_n,samplers,backend_sampling,custom:custom2,timings_per_token,disableReasoningParsing,excludeReasoningFromContext}=options,normalizedMessages=messages.map(msg=>{if("id"in msg&&"convId"in msg&&"timestamp"in msg){const dbMsg=msg;return ChatService.convertDbMessageToApiChatMessageData(dbMsg)}else return msg}).filter(msg=>msg.role===MessageRole.SYSTEM?(typeof msg.content=="string"?msg.content:"").trim().length> -0:!0);options.model&&!modelsStore.modelSupportsVision(options.model)&&normalizedMessages.forEach(msg=>{Array.isArray(msg.content)&&(msg.content=msg.content.filter(part=>part.type===ContentPartType.IMAGE_URL?(console.info(`[ChatService] Skipping image attachment in message history (model "${options.model}" does not support vision)`),!1):!0),msg.content.length===1&&msg.content[0].type===ContentPartType.TEXT&&(msg.content=msg.content[0].text))});const requestBody={messages:normalizedMessages.map(msg=>{ -const mapped={role:msg.role,content:msg.content,tool_calls:msg.tool_calls,tool_call_id:msg.tool_call_id};return!excludeReasoningFromContext&&msg.reasoning_content&&(mapped.reasoning_content=msg.reasoning_content),mapped}),stream,return_progress:stream?!0:void 0,tools:tools&&tools.length>0?tools:void 0};if(options.model&&(requestBody.model=options.model),requestBody.reasoning_format=disableReasoningParsing?ReasoningFormat.NONE:ReasoningFormat.AUTO,temperature!==void 0&&(requestBody.temperature=temperature), -max_tokens!==void 0&&(requestBody.max_tokens=max_tokens!==null&&max_tokens!==0?max_tokens:-1),dynatemp_range!==void 0&&(requestBody.dynatemp_range=dynatemp_range),dynatemp_exponent!==void 0&&(requestBody.dynatemp_exponent=dynatemp_exponent),top_k!==void 0&&(requestBody.top_k=top_k),top_p!==void 0&&(requestBody.top_p=top_p),min_p!==void 0&&(requestBody.min_p=min_p),xtc_probability!==void 0&&(requestBody.xtc_probability=xtc_probability),xtc_threshold!==void 0&&(requestBody.xtc_threshold=xtc_threshold), -typ_p!==void 0&&(requestBody.typ_p=typ_p),repeat_last_n!==void 0&&(requestBody.repeat_last_n=repeat_last_n),repeat_penalty!==void 0&&(requestBody.repeat_penalty=repeat_penalty),presence_penalty!==void 0&&(requestBody.presence_penalty=presence_penalty),frequency_penalty!==void 0&&(requestBody.frequency_penalty=frequency_penalty),dry_multiplier!==void 0&&(requestBody.dry_multiplier=dry_multiplier),dry_base!==void 0&&(requestBody.dry_base=dry_base),dry_allowed_length!==void 0&&(requestBody.dry_allowed_length= -dry_allowed_length),dry_penalty_last_n!==void 0&&(requestBody.dry_penalty_last_n=dry_penalty_last_n),samplers!==void 0&&(requestBody.samplers=typeof samplers=="string"?samplers.split(";").filter(s2=>s2.trim()):samplers),backend_sampling!==void 0&&(requestBody.backend_sampling=backend_sampling),timings_per_token!==void 0&&(requestBody.timings_per_token=timings_per_token),custom2)try{const customParams=typeof custom2=="string"?JSON.parse(custom2):custom2;Object.assign(requestBody,customParams)}catch(error2){ -console.warn("Failed to parse custom parameters:",error2)}try{const response=await fetch("./v1/chat/completions",{method:"POST",headers:getJsonHeaders(),body:JSON.stringify(requestBody),signal});if(!response.ok){const error2=await ChatService.parseErrorResponse(response);throw onError&&onError(error2),error2}if(stream){await ChatService.handleStreamResponse(response,onChunk,onComplete,onError,onReasoningChunk,onToolCallChunk,onModel,onTimings,conversationId,signal);return}else return ChatService. -handleNonStreamResponse(response,onComplete,onError,onToolCallChunk,onModel)}catch(error2){if(isAbortError(error2)){console.log("Chat completion request was aborted");return}let userFriendlyError;throw error2 instanceof Error?error2.name==="TypeError"&&error2.message.includes("fetch")?(userFriendlyError=new Error("Unable to connect to server - please check if the server is running"),userFriendlyError.name="NetworkError"):error2.message.includes("ECONNREFUSED")?(userFriendlyError=new Error("Conne\ -ction refused - server may be offline"),userFriendlyError.name="NetworkError"):error2.message.includes("ETIMEDOUT")?(userFriendlyError=new Error("Request timed out - the server took too long to respond"),userFriendlyError.name="TimeoutError"):userFriendlyError=error2:userFriendlyError=new Error("Unknown error occurred while sending message"),console.error("Error in sendMessage:",error2),onError&&onError(userFriendlyError),userFriendlyError}}static async areAllSlotsIdle(model,signal){try{const url2=model? -`./slots?model=${encodeURIComponent(model)}`:"./slots",res=await fetch(url2,{signal});return res.ok?(await res.json()).every(s2=>!s2.is_processing):!0}catch{return!0}}static async preEncode(messages,model,excludeReasoning,signal){const requestBody={messages:messages.map(msg=>"id"in msg&&"convId"in msg&&"timestamp"in msg?ChatService.convertDbMessageToApiChatMessageData(msg):msg).filter(msg=>msg.role===MessageRole.SYSTEM?(typeof msg.content=="string"?msg.content:"").trim().length>0:!0).map(msg=>{const mapped={ -role:msg.role,content:excludeReasoning?ChatService.stripReasoningContent(msg.content):msg.content,tool_calls:msg.tool_calls,tool_call_id:msg.tool_call_id};return!excludeReasoning&&msg.reasoning_content&&(mapped.reasoning_content=msg.reasoning_content),mapped}),stream:!1,n_predict:0};model&&(requestBody.model=model);try{await fetch("./v1/chat/completions",{method:"POST",headers:getJsonHeaders(),body:JSON.stringify(requestBody),signal})}catch(error2){isAbortError(error2)||console.warn("[ChatServic\ -e] Pre-encode request failed:",error2)}}static async handleStreamResponse(response,onChunk,onComplete,onError,onReasoningChunk,onToolCallChunk,onModel,onTimings,conversationId,abortSignal){const reader=response.body?.getReader();if(!reader)throw new Error("No response body");const decoder=new TextDecoder;let aggregatedContent="",fullReasoningContent="",aggregatedToolCalls=[],lastTimings,streamFinished=!1,modelEmitted=!1,toolCallIndexOffset=0,hasOpenToolCallBatch=!1;const finalizeOpenToolCallBatch=()=>{ -hasOpenToolCallBatch&&(toolCallIndexOffset=aggregatedToolCalls.length,hasOpenToolCallBatch=!1)},processToolCallDelta=toolCalls=>{if(!toolCalls||toolCalls.length===0||(aggregatedToolCalls=ChatService.mergeToolCallDeltas(aggregatedToolCalls,toolCalls,toolCallIndexOffset),aggregatedToolCalls.length===0))return;hasOpenToolCallBatch=!0;const serializedToolCalls=JSON.stringify(aggregatedToolCalls);serializedToolCalls&&(abortSignal?.aborted||onToolCallChunk?.(serializedToolCalls))};try{let chunk="";for(;!abortSignal?. -aborted;){const{done,value}=await reader.read();if(done||abortSignal?.aborted)break;chunk+=decoder.decode(value,{stream:!0});const lines=chunk.split(` -`);chunk=lines.pop()||"";for(const line of lines){if(abortSignal?.aborted)break;if(line.startsWith(UrlProtocol.DATA)){const data=line.slice(6);if(data==="[DONE]"){streamFinished=!0;continue}try{const parsed=JSON.parse(data),choice=parsed.choices?.[0],content2=choice?.delta?.content,reasoningContent=choice?.delta?.reasoning_content,toolCalls=choice?.delta?.tool_calls,timings=parsed.timings,promptProgress=parsed.prompt_progress,chunkModel=ChatService.extractModelName(parsed);chunkModel&&!modelEmitted&& -(modelEmitted=!0,onModel?.(chunkModel)),promptProgress&&ChatService.notifyTimings(void 0,promptProgress,onTimings),timings&&(ChatService.notifyTimings(timings,promptProgress,onTimings),lastTimings=timings),content2&&(finalizeOpenToolCallBatch(),aggregatedContent+=content2,abortSignal?.aborted||onChunk?.(content2)),reasoningContent&&(finalizeOpenToolCallBatch(),fullReasoningContent+=reasoningContent,abortSignal?.aborted||onReasoningChunk?.(reasoningContent)),processToolCallDelta(toolCalls)}catch(e){ -console.error("Error parsing JSON chunk:",e)}}}if(abortSignal?.aborted)break}if(abortSignal?.aborted)return;if(streamFinished){finalizeOpenToolCallBatch();const finalToolCalls=aggregatedToolCalls.length>0?JSON.stringify(aggregatedToolCalls):void 0;onComplete?.(aggregatedContent,fullReasoningContent||void 0,lastTimings,finalToolCalls)}}catch(error2){const err=error2 instanceof Error?error2:new Error("Stream error");throw onError?.(err),err}finally{reader.releaseLock()}}static async handleNonStreamResponse(response,onComplete,onError,onToolCallChunk,onModel){ -try{const responseText=await response.text();if(!responseText.trim())throw new Error("No response received from server. Please try again.");const data=JSON.parse(responseText),responseModel=ChatService.extractModelName(data);responseModel&&onModel?.(responseModel);const content2=data.choices[0]?.message?.content||"",reasoningContent=data.choices[0]?.message?.reasoning_content,toolCalls=data.choices[0]?.message?.tool_calls;let serializedToolCalls;if(toolCalls&&toolCalls.length>0){const mergedToolCalls=ChatService. -mergeToolCallDeltas([],toolCalls);mergedToolCalls.length>0&&(serializedToolCalls=JSON.stringify(mergedToolCalls),serializedToolCalls&&onToolCallChunk?.(serializedToolCalls))}if(!content2.trim()&&!serializedToolCalls)throw new Error("No response received from server. Please try again.");return onComplete?.(content2,reasoningContent,void 0,serializedToolCalls),content2}catch(error2){const err=error2 instanceof Error?error2:new Error("Parse error");throw onError?.(err),err}}static mergeToolCallDeltas(existing,deltas,indexOffset=0){ -const result=existing.map(call=>({...call,function:call.function?{...call.function}:void 0}));for(const delta of deltas){const index2=typeof delta.index=="number"&&delta.index>=0?delta.index+indexOffset:result.length;for(;result.length<=index2;)result.push({function:void 0});const target2=result[index2];if(delta.id&&(target2.id=delta.id),delta.type&&(target2.type=delta.type),delta.function){const fn=target2.function?{...target2.function}:{};delta.function.name&&(fn.name=delta.function.name),delta. -function.arguments&&(fn.arguments=(fn.arguments??"")+delta.function.arguments),target2.function=fn}}return result}static convertDbMessageToApiChatMessageData(message){if(message.role===MessageRole.TOOL&&message.toolCallId)return{role:MessageRole.TOOL,content:message.content,tool_call_id:message.toolCallId};let toolCalls;if(message.toolCalls)try{toolCalls=JSON.parse(message.toolCalls)}catch{}if(!message.extra||message.extra.length===0){const result2={role:message.role,content:message.content};return message. -reasoningContent&&(result2.reasoning_content=message.reasoningContent),toolCalls&&toolCalls.length>0&&(result2.tool_calls=toolCalls),result2}const contentParts=[];message.content&&contentParts.push({type:ContentPartType.TEXT,text:message.content});const imageFiles=message.extra.filter(extra=>extra.type===AttachmentType.IMAGE);for(const image2 of imageFiles)contentParts.push({type:ContentPartType.IMAGE_URL,image_url:{url:image2.base64Url}});const textFiles=message.extra.filter(extra=>extra.type=== -AttachmentType.TEXT);for(const textFile of textFiles)contentParts.push({type:ContentPartType.TEXT,text:formatAttachmentText("File",textFile.name,textFile.content)});const legacyContextFiles=message.extra.filter(extra=>extra.type===AttachmentType.LEGACY_CONTEXT);for(const legacyContextFile of legacyContextFiles)contentParts.push({type:ContentPartType.TEXT,text:formatAttachmentText("File",legacyContextFile.name,legacyContextFile.content)});const audioFiles=message.extra.filter(extra=>extra.type=== -AttachmentType.AUDIO);for(const audio of audioFiles)contentParts.push({type:ContentPartType.INPUT_AUDIO,input_audio:{data:audio.base64Data,format:audio.mimeType.includes("wav")?"wav":"mp3"}});const pdfFiles=message.extra.filter(extra=>extra.type===AttachmentType.PDF);for(const pdfFile of pdfFiles)if(pdfFile.processedAsImages&&pdfFile.images)for(let i=0;iextra.type===AttachmentType.MCP_PROMPT);for(const mcpPrompt of mcpPrompts)contentParts.push({type:ContentPartType.TEXT,text:formatAttachmentText(ATTACHMENT_LABEL_MCP_PROMPT,mcpPrompt.name,mcpPrompt.content,mcpPrompt.serverName)});const mcpResources2=message.extra.filter(extra=>extra.type===AttachmentType.MCP_RESOURCE);for(const mcpResource of mcpResources2)contentParts. -push({type:ContentPartType.TEXT,text:formatAttachmentText(ATTACHMENT_LABEL_MCP_RESOURCE,mcpResource.name,mcpResource.content,mcpResource.serverName)});const result={role:message.role,content:contentParts};return message.reasoningContent&&(result.reasoning_content=message.reasoningContent),toolCalls&&toolCalls.length>0&&(result.tool_calls=toolCalls),result}static stripReasoningContent(content2){const stripFromString=text2=>text2.replace(LEGACY_AGENTIC_REGEX.REASONING_BLOCK,"").trim();return typeof content2== -"string"?stripFromString(content2):content2.map(part=>part.type===ContentPartType.TEXT&&part.text?{...part,text:stripFromString(part.text)}:part)}static async parseErrorResponse(response){try{const errorText=await response.text(),errorData=JSON.parse(errorText),message=errorData.error?.message||"Unknown server error",error2=new Error(message);return error2.name=response.status===400?"ServerError":"HttpError",errorData.error&&"n_prompt_tokens"in errorData.error&&"n_ctx"in errorData.error&&(error2. -contextInfo={n_prompt_tokens:errorData.error.n_prompt_tokens,n_ctx:errorData.error.n_ctx}),error2}catch{const fallback2=new Error(`Server error (${response.status}): ${response.statusText}`);return fallback2.name="HttpError",fallback2}}static extractModelName(data){const asRecord=value=>typeof value=="object"&&value!==null?value:void 0,getTrimmedString=value=>typeof value=="string"&&value.trim()?value.trim():void 0,root2=asRecord(data);if(!root2)return;const rootModel=getTrimmedString(root2.model); -if(rootModel)return rootModel;const firstChoice=Array.isArray(root2.choices)?asRecord(root2.choices[0]):void 0;if(!firstChoice)return;const deltaModel=getTrimmedString(asRecord(firstChoice.delta)?.model);if(deltaModel)return deltaModel;const messageModel=getTrimmedString(asRecord(firstChoice.message)?.model);if(messageModel)return messageModel}static notifyTimings(timings,promptProgress,onTimingsCallback){!onTimingsCallback||!timings&&!promptProgress||onTimingsCallback(timings,promptProgress)}}class ModelsService{static async list(){ -return apiFetch(API_MODELS.LIST)}static async listRouter(){return apiFetch(API_MODELS.LIST)}static async load(modelId,extraArgs){const payload={model:modelId};return extraArgs&&extraArgs.length>0&&(payload.extra_args=extraArgs),apiPost(API_MODELS.LOAD,payload)}static async unload(modelId){return apiPost(API_MODELS.UNLOAD,{model:modelId})}static isModelLoaded(model){return model.status.value===ServerModelStatus.LOADED}static isModelLoading(model){return model.status.value===ServerModelStatus.LOADING}static parseModelId(modelId){ -const result={raw:modelId,orgName:null,modelName:null,params:null,activatedParams:null,quantization:null,tags:[]},colonIdx=modelId.indexOf(MODEL_ID_QUANTIZATION_SEPARATOR);let modelPath;colonIdx!==MODEL_ID_NOT_FOUND?(result.quantization=modelId.slice(colonIdx+1)||null,modelPath=modelId.slice(0,colonIdx)):modelPath=modelId;const slashIdx=modelPath.indexOf(MODEL_ID_ORG_SEPARATOR);let modelStr;slashIdx!==MODEL_ID_NOT_FOUND?(result.orgName=modelPath.slice(0,slashIdx),modelStr=modelPath.slice(slashIdx+ -1)):modelStr=modelPath;const dotIdx=modelStr.lastIndexOf(".");if(dotIdx!==MODEL_ID_NOT_FOUND&&!result.quantization){const afterDot=modelStr.slice(dotIdx+1);MODEL_QUANTIZATION_SEGMENT_RE.test(afterDot)&&(result.quantization=afterDot,modelStr=modelStr.slice(0,dotIdx))}const segments=modelStr.split(MODEL_ID_SEGMENT_SEPARATOR);if(!result.quantization&&segments.length>1){const last=segments[segments.length-1],secondLast=segments.length>2?segments[segments.length-2]:null;MODEL_QUANTIZATION_SEGMENT_RE. -test(last)&&(secondLast&&MODEL_CUSTOM_QUANTIZATION_PREFIX_RE.test(secondLast)?(result.quantization=`${secondLast}-${last}`,segments.splice(segments.length-2,2)):(result.quantization=last,segments.pop()))}let paramsIdx=MODEL_ID_NOT_FOUND,activatedParamsIdx=MODEL_ID_NOT_FOUND;for(let i=0;i{const absIdx=paramsIdx+1+relIdx;return absIdx===activatedParamsIdx?!1:!MODEL_IGNORED_SEGMENTS.has(segments[absIdx].toUpperCase())})),result}}class ModelsStore{#models=state$1(proxy( -[]));get models(){return get$3(this.#models)}set models(value){set$1(this.#models,value,!0)}#routerModels=state$1(proxy([]));get routerModels(){return get$3(this.#routerModels)}set routerModels(value){set$1(this.#routerModels,value,!0)}#loading=state$1(!1);get loading(){return get$3(this.#loading)}set loading(value){set$1(this.#loading,value,!0)}#updating=state$1(!1);get updating(){return get$3(this.#updating)}set updating(value){set$1(this.#updating,value,!0)}#error=state$1(null);get error(){return get$3( -this.#error)}set error(value){set$1(this.#error,value,!0)}#selectedModelId=state$1(null);get selectedModelId(){return get$3(this.#selectedModelId)}set selectedModelId(value){set$1(this.#selectedModelId,value,!0)}#selectedModelName=state$1(null);get selectedModelName(){return get$3(this.#selectedModelName)}set selectedModelName(value){set$1(this.#selectedModelName,value,!0)}#modelUsage=state$1(proxy(new Map));get modelUsage(){return get$3(this.#modelUsage)}set modelUsage(value){set$1(this.#modelUsage, -value,!0)}modelLoadingStates=new SvelteMap;#favoriteModelIds=state$1(proxy(this.loadFavoritesFromStorage()));get favoriteModelIds(){return get$3(this.#favoriteModelIds)}set favoriteModelIds(value){set$1(this.#favoriteModelIds,value,!0)}modelPropsCache=new TTLCache({ttlMs:MODEL_PROPS_CACHE_TTL_MS,maxEntries:MODEL_PROPS_CACHE_MAX_ENTRIES});#modelPropsFetching=state$1(proxy(new Set));get modelPropsFetching(){return get$3(this.#modelPropsFetching)}set modelPropsFetching(value){set$1(this.#modelPropsFetching, -value,!0)}#propsCacheVersion=state$1(0);get propsCacheVersion(){return get$3(this.#propsCacheVersion)}set propsCacheVersion(value){set$1(this.#propsCacheVersion,value,!0)}get selectedModel(){return this.selectedModelId?this.models.find(model=>model.id===this.selectedModelId)??null:null}get loadedModelIds(){return this.routerModels.filter(m=>m.status.value===ServerModelStatus.LOADED||m.status.value===ServerModelStatus.SLEEPING).map(m=>m.id)}get loadingModelIds(){return Array.from(this.modelLoadingStates. -entries()).filter(([,loading])=>loading).map(([id2])=>id2)}get singleModelName(){if(serverStore.isRouterMode)return null;const props=serverStore.props;return props?.model_alias?props.model_alias:props?.model_path&&props.model_path.split(/(\\|\/)/).pop()||null}getModelModalities(modelId){const model=this.models.find(m=>m.model===modelId||m.id===modelId);if(model?.modalities)return model.modalities;const props=this.modelPropsCache.get(modelId);return props?.modalities?{vision:props.modalities.vision?? -!1,audio:props.modalities.audio??!1}:null}modelSupportsVision(modelId){return this.getModelModalities(modelId)?.vision??!1}modelSupportsAudio(modelId){return this.getModelModalities(modelId)?.audio??!1}getModelModalitiesArray(modelId){const modalities=this.getModelModalities(modelId);if(!modalities)return[];const result=[];return modalities.vision&&result.push(ModelModality.VISION),modalities.audio&&result.push(ModelModality.AUDIO),result}getModelProps(modelId){return this.modelPropsCache.get(modelId)}getModelContextSize(modelId){ -const nCtx=this.getModelProps(modelId)?.default_generation_settings?.n_ctx;return typeof nCtx=="number"?nCtx:null}get selectedModelContextSize(){return this.selectedModelName?this.getModelContextSize(this.selectedModelName):null}isModelPropsFetching(modelId){return this.modelPropsFetching.has(modelId)}isModelLoaded(modelId){const model=this.routerModels.find(m=>m.id===modelId);return model?.status.value===ServerModelStatus.LOADED||model?.status.value===ServerModelStatus.SLEEPING||!1}isModelOperationInProgress(modelId){ -return this.modelLoadingStates.get(modelId)??!1}getModelStatus(modelId){return this.routerModels.find(m=>m.id===modelId)?.status.value??null}getModelUsage(modelId){return this.modelUsage.get(modelId)??new SvelteSet}isModelInUse(modelId){const usage=this.modelUsage.get(modelId);return usage!==void 0&&usage.size>0}async fetch(force=!1){if(!this.loading&&!(this.models.length>0&&!force)){this.loading=!0,this.error=null;try{serverStore.props||await serverStore.fetch();const response=await ModelsService. -list(),models=response.data.map((item,index2)=>{const details=response.models?.[index2],rawCapabilities=Array.isArray(details?.capabilities)?details?.capabilities:[],displayNameSource=details?.name&&details.name.trim().length>0?details.name:item.id,displayName=this.toDisplayName(displayNameSource),modelId=details?.model||item.id;return{id:item.id,name:displayName,model:modelId,description:details?.description,capabilities:rawCapabilities.filter(value=>!!value),details:details?.details,meta:item. -meta??null,parsedId:ModelsService.parseModelId(modelId),aliases:item.aliases??[],tags:item.tags??[]}});this.models=models;const serverProps2=serverStore.props;if(serverStore.isModelMode&&this.models.length>0&&serverProps2?.modalities){const modalities={vision:serverProps2.modalities.vision??!1,audio:serverProps2.modalities.audio??!1};this.modelPropsCache.set(this.models[0].model,serverProps2),this.models=this.models.map((model,index2)=>index2===0?{...model,modalities}:model)}}catch(error2){throw this. -models=[],this.error=error2 instanceof Error?error2.message:"Failed to load models",error2}finally{this.loading=!1}}}async fetchRouterModels(){try{const response=await ModelsService.listRouter();this.routerModels=response.data,await this.fetchModalitiesForLoadedModels();const o=this.models.filter(option2=>this.getModelProps(option2.model)?.webui!==!1);o.length===1&&this.isModelLoaded(o[0].model)&&this.selectModelById(o[0].id)}catch(error2){console.warn("Failed to fetch router models:",error2),this. -routerModels=[]}}async fetchModelProps(modelId){const cached2=this.modelPropsCache.get(modelId);if(cached2)return cached2;if(serverStore.isRouterMode&&!this.isModelLoaded(modelId)||this.modelPropsFetching.has(modelId))return null;this.modelPropsFetching.add(modelId);try{const props=await PropsService.fetchForModel(modelId);return this.modelPropsCache.set(modelId,props),props}catch(error2){return console.warn(`Failed to fetch props for model ${modelId}:`,error2),null}finally{this.modelPropsFetching. -delete(modelId)}}async fetchModalitiesForLoadedModels(){const loadedModelIds2=this.loadedModelIds;if(loadedModelIds2.length===0)return;const propsPromises=loadedModelIds2.map(modelId=>this.fetchModelProps(modelId));try{const results=await Promise.all(propsPromises);this.models=this.models.map(model=>{const modelIndex=loadedModelIds2.indexOf(model.model);if(modelIndex===-1)return model;const props=results[modelIndex];if(!props?.modalities)return model;const modalities={vision:props.modalities.vision?? -!1,audio:props.modalities.audio??!1};return{...model,modalities}}),this.propsCacheVersion++}catch(error2){console.warn("Failed to fetch modalities for loaded models:",error2)}}async updateModelModalities(modelId){try{const props=await this.fetchModelProps(modelId);if(!props?.modalities)return;const modalities={vision:props.modalities.vision??!1,audio:props.modalities.audio??!1};this.models=this.models.map(model=>model.model===modelId?{...model,modalities}:model),this.propsCacheVersion++}catch(error2){ -console.warn(`Failed to update modalities for model ${modelId}:`,error2)}}async selectModelById(modelId){if(!modelId||this.updating||this.selectedModelId===modelId)return;const option2=this.models.find(model=>model.id===modelId);if(!option2)throw new Error("Selected model is not available");this.updating=!0,this.error=null;try{this.selectedModelId=option2.id,this.selectedModelName=option2.model}finally{this.updating=!1}}selectModelByName(modelName){const option2=this.models.find(model=>model.model=== -modelName);option2&&(this.selectedModelId=option2.id,this.selectedModelName=option2.model)}clearSelection(){this.selectedModelId=null,this.selectedModelName=null}findModelByName(modelName){return this.models.find(model=>model.model===modelName)??null}findModelById(modelId){return this.models.find(model=>model.id===modelId)??null}hasModel(modelName){return this.models.some(model=>model.model===modelName)}static STATUS_POLL_INTERVAL=500;async pollForModelStatus(modelId,expectedStatus){let attempt=0; -for(;;){await this.fetchRouterModels();const currentStatus=this.getModelStatus(modelId);if(currentStatus===expectedStatus)return;if(currentStatus===ServerModelStatus.FAILED)throw new Error(`Model failed to ${expectedStatus===ServerModelStatus.LOADED?"load":"unload"}`);if(expectedStatus===ServerModelStatus.LOADED&¤tStatus===ServerModelStatus.UNLOADED&&attempt>2)throw new Error("Model was unloaded unexpectedly during loading");attempt++,await new Promise(resolve2=>setTimeout(resolve2,ModelsStore. -STATUS_POLL_INTERVAL))}}async loadModel(modelId){if(!this.isModelLoaded(modelId)&&!this.modelLoadingStates.get(modelId)){this.modelLoadingStates.set(modelId,!0),this.error=null;try{await ModelsService.load(modelId),await this.pollForModelStatus(modelId,ServerModelStatus.LOADED),await this.updateModelModalities(modelId),toast.success(`Model loaded: ${this.toDisplayName(modelId)}`)}catch(error2){throw this.error=error2 instanceof Error?error2.message:"Failed to load model",toast.error(`Failed to l\ -oad model: ${this.toDisplayName(modelId)}`),error2}finally{this.modelLoadingStates.set(modelId,!1)}}}async unloadModel(modelId){if(this.isModelLoaded(modelId)&&!this.modelLoadingStates.get(modelId)){this.modelLoadingStates.set(modelId,!0),this.error=null;try{await ModelsService.unload(modelId),await this.pollForModelStatus(modelId,ServerModelStatus.UNLOADED),toast.info(`Model unloaded: ${this.toDisplayName(modelId)}`)}catch(error2){throw this.error=error2 instanceof Error?error2.message:"Failed \ -to unload model",toast.error(`Failed to unload model: ${this.toDisplayName(modelId)}`),error2}finally{this.modelLoadingStates.set(modelId,!1)}}}async ensureModelLoaded(modelId){this.isModelLoaded(modelId)||await this.loadModel(modelId)}isFavorite(modelId){return this.favoriteModelIds.has(modelId)}toggleFavorite(modelId){const next2=new SvelteSet(this.favoriteModelIds);next2.has(modelId)?next2.delete(modelId):next2.add(modelId),this.favoriteModelIds=next2;try{localStorage.setItem(FAVORITE_MODELS_LOCALSTORAGE_KEY, -JSON.stringify([...next2]))}catch{toast.error("Failed to save favorite models to local storage")}}loadFavoritesFromStorage(){try{const raw2=localStorage.getItem(FAVORITE_MODELS_LOCALSTORAGE_KEY);return raw2?new Set(JSON.parse(raw2)):new Set}catch{return toast.error("Failed to load favorite models from local storage"),new Set}}toDisplayName(id2){const candidate=id2.split(/\\|\//).pop();return candidate&&candidate.trim().length>0?candidate:id2}clear(){this.models=[],this.routerModels=[],this.loading= -!1,this.updating=!1,this.error=null,this.selectedModelId=null,this.selectedModelName=null,this.modelUsage.clear(),this.modelLoadingStates.clear(),this.modelPropsCache.clear(),this.modelPropsFetching.clear()}pruneExpiredCache(){return this.modelPropsCache.prune()}}const modelsStore=new ModelsStore,modelOptions=()=>modelsStore.models,routerModels=()=>modelsStore.routerModels,modelsLoading=()=>modelsStore.loading,modelsUpdating=()=>modelsStore.updating,selectedModelId=()=>modelsStore.selectedModelId, -selectedModelName=()=>modelsStore.selectedModelName,singleModelName=()=>modelsStore.singleModelName,selectedModelContextSize=()=>modelsStore.selectedModelContextSize;var root_1$_=from_html(" ",1),root$1E=from_html('
');function ChatAttachmentsPreview($$anchor,$$props){push$1($$props,!0); -let uploadedFiles=prop($$props,"uploadedFiles",19,()=>[]),attachments=prop($$props,"attachments",19,()=>[]),className=prop($$props,"class",3,""),previewFocusIndex=prop($$props,"previewFocusIndex",3,0),allItems=user_derived(()=>getAttachmentDisplayItems({uploadedFiles:uploadedFiles(),attachments:attachments()}).filter(item=>!isMcpPrompt(item)&&!isMcpResource(item)).map(item=>({...item,isImage:isImageFile(item.attachment,item.uploadedFile),isAudio:isAudioFile(item.attachment,item.uploadedFile)}))), -currentIndex=state$1(0);user_effect(()=>{previewFocusIndex()>=0&&previewFocusIndex(){const handler=e=>{e.detail<0?set$1(currentIndex,get$3(currentIndex)>0?get$3(currentIndex)-1:get$3(allItems).length-1,!0):set$1(currentIndex,get$3(currentIndex)document.removeEventListener("chat-attachments-na\ -v",handler)}),user_effect(()=>{const index2=get$3(currentIndex);setTimeout(()=>{document.querySelector(`[data-thumbnail-index="${index2}"]`)?.scrollIntoView({behavior:"smooth",inline:"center",block:"nearest"})},0)});let currentItem=user_derived(()=>get$3(allItems)[get$3(currentIndex)]??null),displayName=user_derived(()=>get$3(currentItem)?.name||get$3(currentItem)?.uploadedFile?.name||get$3(currentItem)?.attachment?.name||"Unknown File"),isAudio=user_derived(()=>get$3(currentItem)?isAudioFile(get$3( -currentItem).attachment,get$3(currentItem).uploadedFile):!1),isImage2=user_derived(()=>get$3(currentItem)?isImageFile(get$3(currentItem).attachment,get$3(currentItem).uploadedFile):!1),isPdf=user_derived(()=>get$3(currentItem)?isPdfFile$1(get$3(currentItem).attachment,get$3(currentItem).uploadedFile):!1),isText=user_derived(()=>get$3(currentItem)?isTextFile(get$3(currentItem).attachment,get$3(currentItem).uploadedFile):!1),displayPreview=user_derived(()=>get$3(currentItem)?.uploadedFile?.preview|| -(get$3(isImage2)&&get$3(currentItem)?.attachment&&"base64Url"in get$3(currentItem).attachment?get$3(currentItem).attachment.base64Url:get$3(currentItem)?.preview)),displayTextContent=user_derived(()=>get$3(currentItem)?.uploadedFile?.textContent||(get$3(currentItem)?.attachment&&"content"in get$3(currentItem).attachment?get$3(currentItem).attachment.content:get$3(currentItem)?.textContent)),language2=user_derived(()=>getLanguageFromFilename(get$3(displayName))),fileSize=user_derived(()=>get$3(currentItem)?. -size?formatFileSize(get$3(currentItem).size):""),hasVisionModality=user_derived(()=>get$3(currentItem)&&$$props.activeModelId?modelsStore.modelSupportsVision($$props.activeModelId):!1),audioSrc=user_derived(()=>get$3(isAudio)&&get$3(currentItem)?get$3(currentItem).uploadedFile?.preview??(get$3(currentItem).attachment&&"mimeType"in get$3(currentItem).attachment&&"base64Data"in get$3(currentItem).attachment?createBase64DataUrl(get$3(currentItem).attachment.mimeType,get$3(currentItem).attachment.base64Data): -null):null);function prev2(){set$1(currentIndex,get$3(currentIndex)>0?get$3(currentIndex)-1:get$3(allItems).length-1,!0)}function next2(){set$1(currentIndex,get$3(currentIndex)get$3(allItems).length>1);ChatAttachmentsPreviewNavButtons(node2,{onPrev:prev2,onNext:next2,get show(){ -return get$3($0)}})}var div_2=sibling(node2,2),node_1=child(div_2);{var consequent=$$anchor2=>{var fragment=root_1$_(),node_2=first_child(fragment);ChatAttachmentsPreviewFileInfo(node_2,{get displayName(){return get$3(displayName)},get fileSize(){return get$3(fileSize)}});var node_3=sibling(node_2,2);ChatAttachmentsPreviewCurrentItem(node_3,{get currentItem(){return get$3(currentItem)},get isImage(){return get$3(isImage2)},get isAudio(){return get$3(isAudio)},get isPdf(){return get$3(isPdf)},get isText(){ -return get$3(isText)},get displayPreview(){return get$3(displayPreview)},get displayTextContent(){return get$3(displayTextContent)},get audioSrc(){return get$3(audioSrc)},get language(){return get$3(language2)},get hasVisionModality(){return get$3(hasVisionModality)},get activeModelId(){return $$props.activeModelId}}),append($$anchor2,fragment)};if_block(node_1,$$render=>{get$3(currentItem)&&$$render(consequent)})}var node_4=sibling(node_1,2);return ChatAttachmentsPreviewThumbnailStrip(node_4,{get items(){ -return get$3(allItems)},get currentIndex(){return get$3(currentIndex)},onNavigate}),reset(div_2),reset(div_1),reset(div),template_effect(()=>set_class(div,1,`${className()??""} flex flex-col text-white`)),append($$anchor,div),pop($$exports)}var root_1$Z=from_html(" ",1);function ChatAttachmentsPreviewNavButtons($$anchor,$$props){var fragment=comment$2(),node2=first_child(fragment);{var consequent=$$anchor2=>{var fragment_1=root_1$Z(),node_1=first_child(fragment_1);Button(node_1,{variant:"s\ -econdary",size:"icon",class:"absolute top-1/2 left-4 z-10 h-8 w-8 -translate-y-1/2 rounded-full bg-background/5 p-0 text-white!",get onclick(){return $$props.onPrev},"aria-label":"Previous",children:($$anchor3,$$slotProps)=>{Chevron_left($$anchor3,{class:"size-4"})},$$slots:{default:!0}});var node_2=sibling(node_1,2);Button(node_2,{variant:"secondary",size:"icon",class:"absolute top-1/2 right-4 z-10 h-8 w-8 -translate-y-1/2 rounded-full bg-background/5 p-0 text-white!",get onclick(){return $$props. -onNext},"aria-label":"Next",children:($$anchor3,$$slotProps)=>{Chevron_right($$anchor3,{class:"size-4"})},$$slots:{default:!0}}),append($$anchor2,fragment_1)};if_block(node2,$$render=>{$$props.show&&$$render(consequent)})}append($$anchor,fragment)}var root_1$Y=from_html('

'),root$1D=from_html('

');function ChatAttachmentsPreviewFileInfo($$anchor,$$props){ -var div=root$1D(),p2=child(div),text2=child(p2,!0);reset(p2);var node2=sibling(p2,2);{var consequent=$$anchor2=>{var p_1=root_1$Y(),text_1=child(p_1,!0);reset(p_1),template_effect(()=>set_text(text_1,$$props.fileSize)),append($$anchor2,p_1)};if_block(node2,$$render=>{$$props.fileSize&&$$render(consequent)})}reset(div),template_effect(()=>set_text(text2,$$props.displayName)),append($$anchor,div)}var root_1$X=from_html('
');function Checkbox($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),checked=prop($$props,"checked",15,!1),indeterminate=prop($$props,"indeterminate",15,!1),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref","checked","indeterminate","class"]);var fragment=comment$2(),node2=first_child(fragment);{const children=($$anchor2,$$arg0)=>{let checked2=()=>$$arg0?.().checked,indeterminate2=()=>$$arg0?.().indeterminate;var div=root_1$X(),node_1=child(div);{var consequent=$$anchor3=>{ -Check($$anchor3,{class:"size-3.5"})},consequent_1=$$anchor3=>{Minus($$anchor3,{class:"size-3.5"})};if_block(node_1,$$render=>{checked2()?$$render(consequent):indeterminate2()&&$$render(consequent_1,1)})}reset(div),append($$anchor2,div)};let $0=user_derived(()=>cn$1("peer flex size-4 shrink-0 items-center justify-center rounded-[4px] border border-input shadow-xs transition-shadow outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowe\ -d disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:bg-input/30 dark:aria-invalid:ring-destructive/40 dark:data-[state=checked]:bg-primary",$$props.class));component(node2,()=>Checkbox$1,($$anchor2,CheckboxPrimitive_Root)=>{CheckboxPrimitive_Root($$anchor2,spread_props({"data-slot":"checkbox",get class(){return get$3($0)}},()=>restProps,{get ref(){ -return ref2()},set ref($$value){ref2($$value)},get checked(){return checked()},set checked($$value){checked($$value)},get indeterminate(){return indeterminate()},set indeterminate($$value){indeterminate($$value)},children,$$slots:{default:!0}}))})}append($$anchor,fragment),pop()}var root_1$W=from_html(""),root_2$16=from_html("");function Input($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),value=prop($$props,"value",15),files=prop($$props,"files",15),restProps=rest_props( -$$props,["$$slots","$$events","$$legacy","ref","value","type","files","class"]);var fragment=comment$2(),node2=first_child(fragment);{var consequent=$$anchor2=>{var input=root_1$W();attribute_effect(input,$0=>({"data-slot":"input",class:$0,type:"file",...restProps}),[()=>cn$1("flex h-9 w-full min-w-0 rounded-md border border-input bg-transparent px-3 pt-1.5 text-sm font-medium shadow-xs ring-offset-background transition-[color,box-shadow] outline-none selection:bg-primary selection:text-primary-\ -foreground placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50 md:text-sm dark:bg-input/30","focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50","aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40",$$props.class)],void 0,void 0,void 0,!0),bind_this(input,$$value=>ref2($$value),()=>ref2()),bind_files(input,files),bind_value(input,value),append($$anchor2,input)},alternate=$$anchor2=>{var input_1=root_2$16(); -attribute_effect(input_1,$0=>({"data-slot":"input",class:$0,style:"backdrop-filter: blur(0.5rem);",type:$$props.type,...restProps}),[()=>cn$1("flex h-9 w-full min-w-0 rounded-md border border-input bg-background px-3 py-1 text-base shadow-xs ring-offset-background transition-[color,box-shadow] outline-none selection:bg-primary selection:text-primary-foreground placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50 md:text-sm dark:bg-input/30","focus-visible:border-ring\ - focus-visible:ring-[3px] focus-visible:ring-ring/50","aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40",$$props.class)],void 0,void 0,void 0,!0),bind_this(input_1,$$value=>ref2($$value),()=>ref2()),bind_value(input_1,value),append($$anchor2,input_1)};if_block(node2,$$render=>{$$props.type==="file"?$$render(consequent):$$render(alternate,-1)})}append($$anchor,fragment),pop()}var root_1$V=from_html(''),root$1C=from_html("
");function SearchInput($$anchor,$$props){push$1($$props,!0);let value=prop($$props,"value",15,""),placeholder=prop($$props,"placeholder",3,"Search..."),ref2=prop($$props,"ref",15,null),isCancelAlwaysVisible=prop($$props,"isCancelAlwaysVisible",3,!1),showClearButton=user_derived(()=>isCancelAlwaysVisible()||!!value()||!!$$props. -onClose);function handleInput(event2){const target2=event2.target;value(target2.value),$$props.onInput?.(target2.value)}function handleClear(){value()?(value(""),$$props.onInput?.(""),ref2()?.focus()):$$props.onClose?.()}var div=root$1C(),node2=child(div);Search(node2,{class:"absolute top-1/2 left-3 z-10 h-4 w-4 -translate-y-1/2 transform text-muted-foreground"});var node_1=sibling(node2,2);{let $0=user_derived(()=>get$3(showClearButton)?"pr-9":"");Input(node_1,{get id(){return $$props.id},get class(){ -return`pl-9 ${get$3($0)??""}`},oninput:handleInput,get onkeydown(){return $$props.onKeyDown},get placeholder(){return placeholder()},type:"search",get value(){return value()},set value($$value){value($$value)},get ref(){return ref2()},set ref($$value){ref2($$value)}})}var node_2=sibling(node_1,2);{var consequent=$$anchor2=>{var button=root_1$V(),node_3=child(button);X(node_3,{class:"h-4 w-4"}),reset(button),template_effect(()=>set_attribute(button,"aria-label",value()?"Clear search":"Close")),delegated( -"click",button,handleClear),append($$anchor2,button)};if_block(node_2,$$render=>{get$3(showClearButton)&&$$render(consequent)})}reset(div),template_effect(()=>set_class(div,1,`relative ${$$props.class??""}`)),append($$anchor,div),pop()}delegate(["click"]);var root_1$U=from_html(" ",1);function Scroll_area_scrollbar($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),orientation=prop($$props,"orientation",3,"vertical"),restProps=rest_props($$props,["$$slots","$$events", -"$$legacy","ref","class","orientation","children"]);var fragment=comment$2(),node2=first_child(fragment);{let $0=user_derived(()=>cn$1("flex touch-none p-px transition-colors select-none",orientation()==="vertical"&&"h-full w-2.5 border-l border-l-transparent",orientation()==="horizontal"&&"h-2.5 flex-col border-t border-t-transparent",$$props.class));component(node2,()=>Scroll_area_scrollbar$1,($$anchor2,ScrollAreaPrimitive_Scrollbar)=>{ScrollAreaPrimitive_Scrollbar($$anchor2,spread_props({"dat\ -a-slot":"scroll-area-scrollbar",get orientation(){return orientation()},get class(){return get$3($0)}},()=>restProps,{get ref(){return ref2()},set ref($$value){ref2($$value)},children:($$anchor3,$$slotProps)=>{var fragment_1=root_1$U(),node_1=first_child(fragment_1);snippet(node_1,()=>$$props.children??noop$3);var node_2=sibling(node_1,2);component(node_2,()=>Scroll_area_thumb,($$anchor4,ScrollAreaPrimitive_Thumb)=>{ScrollAreaPrimitive_Thumb($$anchor4,{"data-slot":"scroll-area-thumb",class:"rela\ -tive flex-1 rounded-full bg-border"})}),append($$anchor3,fragment_1)},$$slots:{default:!0}}))})}append($$anchor,fragment),pop()}var root_1$T=from_html(" ",1);function Scroll_area($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),orientation=prop($$props,"orientation",3,"vertical"),scrollbarXClasses=prop($$props,"scrollbarXClasses",3,""),scrollbarYClasses=prop($$props,"scrollbarYClasses",3,""),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref", -"class","orientation","scrollbarXClasses","scrollbarYClasses","children"]);var fragment=comment$2(),node2=first_child(fragment);{let $0=user_derived(()=>cn$1("relative",$$props.class));component(node2,()=>Scroll_area$1,($$anchor2,ScrollAreaPrimitive_Root)=>{ScrollAreaPrimitive_Root($$anchor2,spread_props({"data-slot":"scroll-area",get class(){return get$3($0)}},()=>restProps,{get ref(){return ref2()},set ref($$value){ref2($$value)},children:($$anchor3,$$slotProps)=>{var fragment_1=root_1$T(),node_1=first_child( -fragment_1);component(node_1,()=>Scroll_area_viewport,($$anchor4,ScrollAreaPrimitive_Viewport)=>{ScrollAreaPrimitive_Viewport($$anchor4,{"data-slot":"scroll-area-viewport",class:"size-full rounded-[inherit] ring-ring/10 outline-ring/50 transition-[color,box-shadow] focus-visible:ring-4 focus-visible:outline-1 dark:ring-ring/20 dark:outline-ring/40",children:($$anchor5,$$slotProps2)=>{var fragment_2=comment$2(),node_2=first_child(fragment_2);snippet(node_2,()=>$$props.children??noop$3),append($$anchor5, -fragment_2)},$$slots:{default:!0}})});var node_3=sibling(node_1,2);{var consequent=$$anchor4=>{Scroll_area_scrollbar($$anchor4,{orientation:"vertical",get class(){return scrollbarYClasses()}})};if_block(node_3,$$render=>{(orientation()==="vertical"||orientation()==="both")&&$$render(consequent)})}var node_4=sibling(node_3,2);{var consequent_1=$$anchor4=>{Scroll_area_scrollbar($$anchor4,{orientation:"horizontal",get class(){return scrollbarXClasses()}})};if_block(node_4,$$render=>{(orientation()=== -"horizontal"||orientation()==="both")&&$$render(consequent_1)})}var node_5=sibling(node_4,2);component(node_5,()=>Scroll_area_corner,($$anchor4,ScrollAreaPrimitive_Corner)=>{ScrollAreaPrimitive_Corner($$anchor4,{})}),append($$anchor3,fragment_1)},$$slots:{default:!0}}))})}append($$anchor,fragment),pop()}var root_3$V=from_html(''),root_7$s=from_html('
'),root_2$15=from_html('
Conversation NameMessages
'),root$1B=from_html( -'
');function ConversationSelection($$anchor,$$props){push$1($$props,!0);let messageCountMap=prop($$props,"messageCountMap",19,()=>new Map),searchQuery=state$1(""),selectedIds=state$1(getInitialSelectedIds()),lastClickedId=state$1(null);function getInitialSelectedIds(){ -return new SvelteSet($$props.conversations.map(c2=>c2.id))}let filteredConversations=user_derived(()=>$$props.conversations.filter(conv=>(conv.name||"Untitled conversation").toLowerCase().includes(get$3(searchQuery).toLowerCase()))),allSelected=user_derived(()=>get$3(filteredConversations).length>0&&get$3(filteredConversations).every(conv=>get$3(selectedIds).has(conv.id))),someSelected=user_derived(()=>get$3(filteredConversations).some(conv=>get$3(selectedIds).has(conv.id))&&!get$3(allSelected)); -function toggleConversation(id2,shiftKey=!1){const newSet=new SvelteSet(get$3(selectedIds));if(shiftKey&&get$3(lastClickedId)!==null){const lastIndex=get$3(filteredConversations).findIndex(c2=>c2.id===get$3(lastClickedId)),currentIndex=get$3(filteredConversations).findIndex(c2=>c2.id===id2);if(lastIndex!==-1&¤tIndex!==-1){const start2=Math.min(lastIndex,currentIndex),end=Math.max(lastIndex,currentIndex),shouldSelect=!newSet.has(id2);for(let i=start2;i<=end;i++)shouldSelect?newSet.add(get$3( -filteredConversations)[i].id):newSet.delete(get$3(filteredConversations)[i].id);set$1(selectedIds,newSet);return}}newSet.has(id2)?newSet.delete(id2):newSet.add(id2),set$1(selectedIds,newSet),set$1(lastClickedId,id2,!0)}function toggleAll(){if(get$3(allSelected)){const newSet=new SvelteSet(get$3(selectedIds));get$3(filteredConversations).forEach(conv=>newSet.delete(conv.id)),set$1(selectedIds,newSet)}else{const newSet=new SvelteSet(get$3(selectedIds));get$3(filteredConversations).forEach(conv=>newSet. -add(conv.id)),set$1(selectedIds,newSet)}}function handleConfirm(){const selected=$$props.conversations.filter(conv=>get$3(selectedIds).has(conv.id));$$props.onConfirm(selected)}function handleCancel(){set$1(selectedIds,getInitialSelectedIds()),set$1(searchQuery,""),set$1(lastClickedId,null),$$props.onCancel()}function reset$1(){set$1(selectedIds,getInitialSelectedIds()),set$1(searchQuery,""),set$1(lastClickedId,null)}var $$exports={reset:reset$1},div=root$1B(),node2=child(div);SearchInput(node2, -{placeholder:"Search conversations...",get value(){return get$3(searchQuery)},set value($$value){set$1(searchQuery,$$value,!0)}});var div_1=sibling(node2,2),span=child(div_1),text2=child(span),node_1=sibling(text2);{var consequent=$$anchor2=>{var text_1=text$8();template_effect(()=>set_text(text_1,`(${get$3(filteredConversations).length??""} shown)`)),append($$anchor2,text_1)};if_block(node_1,$$render=>{get$3(searchQuery)&&$$render(consequent)})}reset(span),reset(div_1);var div_2=sibling(div_1,2), -node_2=child(div_2);Scroll_area(node_2,{class:"h-[400px]",children:($$anchor2,$$slotProps)=>{var table2=root_2$15(),thead2=child(table2),tr2=child(thead2),th=child(tr2),node_3=child(th);Checkbox(node_3,{get checked(){return get$3(allSelected)},get indeterminate(){return get$3(someSelected)},onCheckedChange:toggleAll}),reset(th),next$1(2),reset(tr2),reset(thead2);var tbody2=sibling(thead2),node_4=child(tbody2);{var consequent_2=$$anchor3=>{var tr_1=root_3$V(),td=child(tr_1),node_5=child(td);{var consequent_1=$$anchor4=>{ -var text_2=text$8();template_effect(()=>set_text(text_2,`No conversations found matching "${get$3(searchQuery)??""}"`)),append($$anchor4,text_2)},alternate=$$anchor4=>{var text_3=text$8("No conversations available");append($$anchor4,text_3)};if_block(node_5,$$render=>{get$3(searchQuery)?$$render(consequent_1):$$render(alternate,-1)})}reset(td),reset(tr_1),append($$anchor3,tr_1)},alternate_1=$$anchor3=>{var fragment_2=comment$2(),node_6=first_child(fragment_2);each(node_6,17,()=>get$3(filteredConversations), -conv=>conv.id,($$anchor4,conv)=>{var tr_2=root_7$s(),td_1=child(tr_2),node_7=child(td_1);{let $0=user_derived(()=>get$3(selectedIds).has(get$3(conv).id));Checkbox(node_7,{get checked(){return get$3($0)},onclick:event2=>{event2.preventDefault(),event2.stopPropagation(),toggleConversation(get$3(conv).id,event2.shiftKey)}})}reset(td_1);var td_2=sibling(td_1),div_3=child(td_2),text_4=child(div_3,!0);reset(div_3),reset(td_2);var td_3=sibling(td_2),text_5=child(td_3,!0);reset(td_3),reset(tr_2),template_effect( -$0=>{set_attribute(div_3,"title",get$3(conv).name||"Untitled conversation"),set_text(text_4,get$3(conv).name||"Untitled conversation"),set_text(text_5,$0)},[()=>messageCountMap().get(get$3(conv).id)??0]),delegated("click",tr_2,event2=>toggleConversation(get$3(conv).id,event2.shiftKey)),append($$anchor4,tr_2)}),append($$anchor3,fragment_2)};if_block(node_4,$$render=>{get$3(filteredConversations).length===0?$$render(consequent_2):$$render(alternate_1,-1)})}reset(tbody2),reset(table2),append($$anchor2, -table2)},$$slots:{default:!0}}),reset(div_2);var div_4=sibling(div_2,2),node_8=child(div_4);Button(node_8,{variant:"outline",onclick:handleCancel,children:($$anchor2,$$slotProps)=>{next$1();var text_6=text$8("Cancel");append($$anchor2,text_6)},$$slots:{default:!0}});var node_9=sibling(node_8,2);{let $0=user_derived(()=>get$3(selectedIds).size===0);Button(node_9,{onclick:handleConfirm,get disabled(){return get$3($0)},children:($$anchor2,$$slotProps)=>{next$1();var text_7=text$8();template_effect( -()=>set_text(text_7,`${$$props.mode==="export"?"Export":"Import"} (${get$3(selectedIds).size??""})`)),append($$anchor2,text_7)},$$slots:{default:!0}})}return reset(div_4),reset(div),template_effect(()=>set_text(text2,`${get$3(selectedIds).size??""} of ${$$props.conversations.length??""} selected `)),append($$anchor,div),pop($$exports)}delegate(["click"]);var root$1A=from_html('
'); -function HorizontalScrollCarousel($$anchor,$$props){push$1($$props,!0);let className=prop($$props,"class",3,""),gapSize=prop($$props,"gapSize",3,"3"),canScrollLeft=state$1(!1),canScrollRight=state$1(!1),scrollContainer=state$1(void 0);function scrollLeft(event2){event2?.stopPropagation(),event2?.preventDefault(),get$3(scrollContainer)&&get$3(scrollContainer).scrollBy({left:get$3(scrollContainer).clientWidth*-.67,behavior:"smooth"})}function scrollRight(event2){event2?.stopPropagation(),event2?.preventDefault(), -get$3(scrollContainer)&&get$3(scrollContainer).scrollBy({left:get$3(scrollContainer).clientWidth*.67,behavior:"smooth"})}function updateScrollButtons(){if(!get$3(scrollContainer))return;const{scrollLeft:scrollLeft2,scrollWidth,clientWidth}=get$3(scrollContainer);set$1(canScrollLeft,scrollLeft2>0),set$1(canScrollRight,scrollLeft2clientWidth;$$props.onScrollableChange?.(isScrollable)}function resetScroll(){get$3(scrollContainer)&&(get$3(scrollContainer). -scrollLeft=0,setTimeout(()=>{updateScrollButtons()},0))}user_effect(()=>{get$3(scrollContainer)&&setTimeout(()=>{updateScrollButtons()},0)});var $$exports={resetScroll},div=root$1A(),button=child(div),node2=child(button);Chevron_left(node2,{class:"h-4 w-4"}),reset(button);var div_1=sibling(button,2),node_1=child(div_1);snippet(node_1,()=>$$props.children??noop$3),reset(div_1),bind_this(div_1,$$value=>set$1(scrollContainer,$$value),()=>get$3(scrollContainer));var button_1=sibling(div_1,2),node_2=child( -button_1);return Chevron_right(node_2,{class:"h-4 w-4"}),reset(button_1),reset(div),template_effect(()=>{set_class(div,1,`relative ${className()??""}`),set_class(button,1,`absolute top-1/2 left-4 z-10 flex h-6 w-6 -translate-y-1/2 items-center justify-center rounded-full bg-background/25 shadow-md backdrop-blur-xs transition-opacity hover:bg-background/45 ${get$3(canScrollLeft)?"opacity-100":"pointer-events-none opacity-0"}`),set_class(div_1,1,`scrollbar-hide flex items-start gap-${gapSize()??""}\ - overflow-x-auto`),set_class(button_1,1,`absolute top-1/2 right-4 z-10 flex h-6 w-6 -translate-y-1/2 items-center justify-center rounded-full bg-background/25 shadow-md backdrop-blur-xs transition-opacity hover:bg-background/45 ${get$3(canScrollRight)?"opacity-100":"pointer-events-none opacity-0"}`)}),delegated("click",button,scrollLeft),event("scroll",div_1,updateScrollButtons),delegated("click",button_1,scrollRight),append($$anchor,div),pop($$exports)}delegate(["click"]);var root_3$U=from_html( -' '),root_4$A=from_html("

"),root_2$14=from_html(" ",1),root_5$w=from_html(" ");function TruncatedText($$anchor,$$props){push$1($$props,!0);let className=prop($$props,"class",3,""),showTooltip=prop($$props,"showTooltip",3,!0),textElement=state$1(void 0),isTruncated=state$1(!1);function checkTruncation(){get$3(textElement)&&set$1(isTruncated,get$3(textElement).scrollWidth>get$3(textElement).clientWidth)}user_effect(()=>{if(get$3(textElement)){ -checkTruncation();const observer=new ResizeObserver(checkTruncation);return observer.observe(get$3(textElement)),()=>observer.disconnect()}});var fragment=comment$2(),node2=first_child(fragment);{var consequent=$$anchor2=>{var fragment_1=comment$2(),node_1=first_child(fragment_1);component(node_1,()=>Root$5,($$anchor3,Tooltip_Root)=>{Tooltip_Root($$anchor3,{children:($$anchor4,$$slotProps)=>{var fragment_2=root_2$14(),node_2=first_child(fragment_2);component(node_2,()=>Tooltip_trigger,($$anchor5,Tooltip_Trigger)=>{ -Tooltip_Trigger($$anchor5,{get class(){return className()},children:($$anchor6,$$slotProps2)=>{var span=root_3$U(),text_1=child(span,!0);reset(span),bind_this(span,$$value=>set$1(textElement,$$value),()=>get$3(textElement)),template_effect(()=>set_text(text_1,$$props.text)),append($$anchor6,span)},$$slots:{default:!0}})});var node_3=sibling(node_2,2);component(node_3,()=>Tooltip_content,($$anchor5,Tooltip_Content)=>{Tooltip_Content($$anchor5,{class:"z-[9999]",children:($$anchor6,$$slotProps2)=>{ -var p2=root_4$A(),text_2=child(p2,!0);reset(p2),template_effect(()=>set_text(text_2,$$props.text)),append($$anchor6,p2)},$$slots:{default:!0}})}),append($$anchor4,fragment_2)},$$slots:{default:!0}})}),append($$anchor2,fragment_1)},alternate=$$anchor2=>{var span_1=root_5$w(),text_3=child(span_1,!0);reset(span_1),bind_this(span_1,$$value=>set$1(textElement,$$value),()=>get$3(textElement)),template_effect(()=>{set_class(span_1,1,`${className()??""} block truncate`),set_text(text_3,$$props.text)}),append( -$$anchor2,span_1)};if_block(node2,$$render=>{get$3(isTruncated)&&showTooltip()?$$render(consequent):$$render(alternate,-1)})}append($$anchor,fragment),pop()}var root_3$T=from_html(""),root_5$v=from_html(""),root_1$S=from_html(" ",1),root$1z=from_html("");function KeyboardShortcutInfo($$anchor,$$props){push$1($$props,!0);let variant=prop($$props,"variant",3,"default"),className=prop($$props,"class",3,""),variantClasses=user_derived(()=>variant()==="de\ -structive"?"text-destructive":"text-muted-foreground");var kbd=root$1z();each(kbd,21,()=>$$props.keys,index$2,($$anchor2,key2,index2)=>{var fragment=root_1$S(),node2=first_child(fragment);{var consequent=$$anchor3=>{{let $0=user_derived(()=>variant()==="destructive"?"text-destructive":"");Arrow_big_up($$anchor3,{get class(){return`h-1 w-1 ${get$3($0)??""} -mr-1`}})}},consequent_1=$$anchor3=>{var span=root_3$T();template_effect(()=>set_class(span,1,clsx(variant()==="destructive"?"text-destructive": -""))),append($$anchor3,span)},alternate=$$anchor3=>{var text2=text$8();template_effect($0=>set_text(text2,$0),[()=>get$3(key2).toUpperCase()]),append($$anchor3,text2)};if_block(node2,$$render=>{get$3(key2)==="shift"?$$render(consequent):get$3(key2)==="cmd"?$$render(consequent_1,1):$$render(alternate,-1)})}var node_1=sibling(node2,2);{var consequent_2=$$anchor3=>{var span_1=root_5$v();append($$anchor3,span_1)};if_block(node_1,$$render=>{index2<$$props.keys.length-1&&$$render(consequent_2)})}append( -$$anchor2,fragment)}),reset(kbd),template_effect(()=>set_class(kbd,1,`px-1 pointer-events-none inline-flex select-none items-center gap-0.5 font-sans text-md font-medium opacity-0 transition-opacity -my-1 ${get$3(variantClasses)??""} ${className()??""}`)),append($$anchor,kbd),pop()}var root$1y=from_html('
');function CodeBlockActions($$anchor,$$props){push$1($$props,!0);let disabled=prop($$props,"disabled",3,!1);const showPreview=user_derived(()=>$$props. -language?.toLowerCase()===FileTypeText.HTML);var div=root$1y(),node2=child(div);{let $0=user_derived(()=>!disabled()),$1=user_derived(()=>disabled()?"Code incomplete":"Copy code");ActionIconCopyToClipboard(node2,{get text(){return $$props.code},get canCopy(){return get$3($0)},get ariaLabel(){return get$3($1)}})}var node_1=sibling(node2,2);{var consequent=$$anchor2=>{{let $0=user_derived(()=>disabled()?"Code incomplete":"Preview code");ActionIcon($$anchor2,{get icon(){return Eye},get tooltip(){return get$3( -$0)},get disabled(){return disabled()},onclick:()=>$$props.onPreview($$props.code,$$props.language)})}};if_block(node_1,$$render=>{get$3(showPreview)&&$$render(consequent)})}reset(div),append($$anchor,div),pop()}var root_4$z=from_html(''),root_5$u=from_html('
'),root_3$S=from_html("
');function ChatAttachmentsPreview($$anchor,$$props){push$1($$props,!0);let uploadedFiles=prop($$props,"uploadedFiles",19,()=>[]),attachments=prop($$props,"attachments",19,()=>[]),className=prop($$props,"class",3,""),previewFocusIndex=prop($$props,"previewFocusIndex",3,0),allItems=user_derived(()=>getAttachmentDisplayItems( +{uploadedFiles:uploadedFiles(),attachments:attachments()}).filter(item=>!isMcpPrompt(item)&&!isMcpResource(item)).map(item=>({...item,isImage:isImageFile(item.attachment,item.uploadedFile),isAudio:isAudioFile(item.attachment,item.uploadedFile)}))),currentIndex=state$1(0);user_effect(()=>{previewFocusIndex()>=0&&previewFocusIndex(){const handler=e=>{e.detail<0?set$1(currentIndex,get$3(currentIndex)>0?get$3(currentIndex)- +1:get$3(allItems).length-1,!0):set$1(currentIndex,get$3(currentIndex)document.removeEventListener("chat-attachments-nav",handler)}),user_effect(()=>{const index2=get$3(currentIndex);setTimeout(()=>{document.querySelector(`[data-thumbnail-index="${index2}"]`)?.scrollIntoView({behavior:"smooth",inline:"center",block:"nearest"})},0)});let currentItem=user_derived(()=>get$3(allItems)[get$3( +currentIndex)]??null),displayName=user_derived(()=>get$3(currentItem)?.name||get$3(currentItem)?.uploadedFile?.name||get$3(currentItem)?.attachment?.name||"Unknown File"),isAudio=user_derived(()=>get$3(currentItem)?isAudioFile(get$3(currentItem).attachment,get$3(currentItem).uploadedFile):!1),isImage2=user_derived(()=>get$3(currentItem)?isImageFile(get$3(currentItem).attachment,get$3(currentItem).uploadedFile):!1),isPdf=user_derived(()=>get$3(currentItem)?isPdfFile$1(get$3(currentItem).attachment, +get$3(currentItem).uploadedFile):!1),isText=user_derived(()=>get$3(currentItem)?isTextFile(get$3(currentItem).attachment,get$3(currentItem).uploadedFile):!1),displayPreview=user_derived(()=>get$3(currentItem)?.uploadedFile?.preview||(get$3(isImage2)&&get$3(currentItem)?.attachment&&"base64Url"in get$3(currentItem).attachment?get$3(currentItem).attachment.base64Url:get$3(currentItem)?.preview)),displayTextContent=user_derived(()=>get$3(currentItem)?.uploadedFile?.textContent||(get$3(currentItem)?. +attachment&&"content"in get$3(currentItem).attachment?get$3(currentItem).attachment.content:get$3(currentItem)?.textContent)),language2=user_derived(()=>getLanguageFromFilename(get$3(displayName))),fileSize=user_derived(()=>get$3(currentItem)?.size?formatFileSize(get$3(currentItem).size):""),hasVisionModality=user_derived(()=>get$3(currentItem)&&$$props.activeModelId?modelsStore.modelSupportsVision($$props.activeModelId):!1),audioSrc=user_derived(()=>get$3(isAudio)&&get$3(currentItem)?get$3(currentItem). +uploadedFile?.preview??(get$3(currentItem).attachment&&"mimeType"in get$3(currentItem).attachment&&"base64Data"in get$3(currentItem).attachment?createBase64DataUrl(get$3(currentItem).attachment.mimeType,get$3(currentItem).attachment.base64Data):null):null);function prev2(){set$1(currentIndex,get$3(currentIndex)>0?get$3(currentIndex)-1:get$3(allItems).length-1,!0)}function next2(){set$1(currentIndex,get$3(currentIndex)get$3(allItems).length>1);ChatAttachmentsPreviewNavButtons(node2,{onPrev:prev2,onNext:next2,get show(){return get$3($0)}})}var div_2=sibling(node2,2),node_1=child(div_2);{var consequent=$$anchor2=>{var fragment=root_1$_(),node_2=first_child(fragment);ChatAttachmentsPreviewFileInfo(node_2,{get displayName(){return get$3(displayName)},get fileSize(){return get$3( +fileSize)}});var node_3=sibling(node_2,2);ChatAttachmentsPreviewCurrentItem(node_3,{get currentItem(){return get$3(currentItem)},get isImage(){return get$3(isImage2)},get isAudio(){return get$3(isAudio)},get isPdf(){return get$3(isPdf)},get isText(){return get$3(isText)},get displayPreview(){return get$3(displayPreview)},get displayTextContent(){return get$3(displayTextContent)},get audioSrc(){return get$3(audioSrc)},get language(){return get$3(language2)},get hasVisionModality(){return get$3(hasVisionModality)}, +get activeModelId(){return $$props.activeModelId}}),append($$anchor2,fragment)};if_block(node_1,$$render=>{get$3(currentItem)&&$$render(consequent)})}var node_4=sibling(node_1,2);return ChatAttachmentsPreviewThumbnailStrip(node_4,{get items(){return get$3(allItems)},get currentIndex(){return get$3(currentIndex)},onNavigate}),reset(div_2),reset(div_1),reset(div),template_effect(()=>set_class(div,1,`${className()??""} flex flex-col text-white`)),append($$anchor,div),pop($$exports)}var root_1$Z=from_html( +" ",1);function ChatAttachmentsPreviewNavButtons($$anchor,$$props){var fragment=comment$2(),node2=first_child(fragment);{var consequent=$$anchor2=>{var fragment_1=root_1$Z(),node_1=first_child(fragment_1);Button(node_1,{variant:"secondary",size:"icon",class:"absolute top-1/2 left-4 z-10 h-8 w-8 -translate-y-1/2 rounded-full bg-background/5 p-0 text-white!",get onclick(){return $$props.onPrev},"aria-label":"Previous",children:($$anchor3,$$slotProps)=>{Chevron_left($$anchor3,{class:"size-4"})}, +$$slots:{default:!0}});var node_2=sibling(node_1,2);Button(node_2,{variant:"secondary",size:"icon",class:"absolute top-1/2 right-4 z-10 h-8 w-8 -translate-y-1/2 rounded-full bg-background/5 p-0 text-white!",get onclick(){return $$props.onNext},"aria-label":"Next",children:($$anchor3,$$slotProps)=>{Chevron_right($$anchor3,{class:"size-4"})},$$slots:{default:!0}}),append($$anchor2,fragment_1)};if_block(node2,$$render=>{$$props.show&&$$render(consequent)})}append($$anchor,fragment)}var root_1$Y=from_html( +'

'),root$1D=from_html('

');function ChatAttachmentsPreviewFileInfo($$anchor,$$props){var div=root$1D(),p2=child(div),text2=child(p2,!0);reset(p2);var node2=sibling(p2,2);{var consequent=$$anchor2=>{var p_1=root_1$Y(),text_1=child(p_1,!0);reset(p_1),template_effect(()=>set_text(text_1,$$props.fileSize)),append($$anchor2, +p_1)};if_block(node2,$$render=>{$$props.fileSize&&$$render(consequent)})}reset(div),template_effect(()=>set_text(text2,$$props.displayName)),append($$anchor,div)}var root_1$X=from_html('
');function Checkbox($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),checked=prop($$props,"checked",15,!1),indeterminate=prop($$props,"indeterminate",15,!1),restProps=rest_props($$props,["$$slots","$$events", +"$$legacy","ref","checked","indeterminate","class"]);var fragment=comment$2(),node2=first_child(fragment);{const children=($$anchor2,$$arg0)=>{let checked2=()=>$$arg0?.().checked,indeterminate2=()=>$$arg0?.().indeterminate;var div=root_1$X(),node_1=child(div);{var consequent=$$anchor3=>{Check($$anchor3,{class:"size-3.5"})},consequent_1=$$anchor3=>{Minus($$anchor3,{class:"size-3.5"})};if_block(node_1,$$render=>{checked2()?$$render(consequent):indeterminate2()&&$$render(consequent_1,1)})}reset(div), +append($$anchor2,div)};let $0=user_derived(()=>cn$1("peer flex size-4 shrink-0 items-center justify-center rounded-[4px] border border-input shadow-xs transition-shadow outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:bg-input/\ +30 dark:aria-invalid:ring-destructive/40 dark:data-[state=checked]:bg-primary",$$props.class));component(node2,()=>Checkbox$1,($$anchor2,CheckboxPrimitive_Root)=>{CheckboxPrimitive_Root($$anchor2,spread_props({"data-slot":"checkbox",get class(){return get$3($0)}},()=>restProps,{get ref(){return ref2()},set ref($$value){ref2($$value)},get checked(){return checked()},set checked($$value){checked($$value)},get indeterminate(){return indeterminate()},set indeterminate($$value){indeterminate($$value)}, +children,$$slots:{default:!0}}))})}append($$anchor,fragment),pop()}var root_1$W=from_html(""),root_2$16=from_html("");function Input($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),value=prop($$props,"value",15),files=prop($$props,"files",15),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref","value","type","files","class"]);var fragment=comment$2(),node2=first_child(fragment);{var consequent=$$anchor2=>{var input=root_1$W();attribute_effect( +input,$0=>({"data-slot":"input",class:$0,type:"file",...restProps}),[()=>cn$1("flex h-9 w-full min-w-0 rounded-md border border-input bg-transparent px-3 pt-1.5 text-sm font-medium shadow-xs ring-offset-background transition-[color,box-shadow] outline-none selection:bg-primary selection:text-primary-foreground placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50 md:text-sm dark:bg-input/30","focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/5\ +0","aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40",$$props.class)],void 0,void 0,void 0,!0),bind_this(input,$$value=>ref2($$value),()=>ref2()),bind_files(input,files),bind_value(input,value),append($$anchor2,input)},alternate=$$anchor2=>{var input_1=root_2$16();attribute_effect(input_1,$0=>({"data-slot":"input",class:$0,style:"backdrop-filter: blur(0.5rem);",type:$$props.type,...restProps}),[()=>cn$1("flex h-9 w-full min-w-0 rounded-md bor\ +der border-input bg-background px-3 py-1 text-base shadow-xs ring-offset-background transition-[color,box-shadow] outline-none selection:bg-primary selection:text-primary-foreground placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50 md:text-sm dark:bg-input/30","focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50","aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40",$$props.class)],void 0, +void 0,void 0,!0),bind_this(input_1,$$value=>ref2($$value),()=>ref2()),bind_value(input_1,value),append($$anchor2,input_1)};if_block(node2,$$render=>{$$props.type==="file"?$$render(consequent):$$render(alternate,-1)})}append($$anchor,fragment),pop()}var root_1$V=from_html(''),root$1C=from_html("
");function SearchInput($$anchor,$$props){ +push$1($$props,!0);let value=prop($$props,"value",15,""),placeholder=prop($$props,"placeholder",3,"Search..."),ref2=prop($$props,"ref",15,null),isCancelAlwaysVisible=prop($$props,"isCancelAlwaysVisible",3,!1),showClearButton=user_derived(()=>isCancelAlwaysVisible()||!!value()||!!$$props.onClose);function handleInput(event2){const target2=event2.target;value(target2.value),$$props.onInput?.(target2.value)}function handleClear(){value()?(value(""),$$props.onInput?.(""),ref2()?.focus()):$$props.onClose?.()} +var div=root$1C(),node2=child(div);Search(node2,{class:"absolute top-1/2 left-3 z-10 h-4 w-4 -translate-y-1/2 transform text-muted-foreground"});var node_1=sibling(node2,2);{let $0=user_derived(()=>get$3(showClearButton)?"pr-9":"");Input(node_1,{get id(){return $$props.id},get class(){return`pl-9 ${get$3($0)??""}`},oninput:handleInput,get onkeydown(){return $$props.onKeyDown},get placeholder(){return placeholder()},type:"search",get value(){return value()},set value($$value){value($$value)},get ref(){ +return ref2()},set ref($$value){ref2($$value)}})}var node_2=sibling(node_1,2);{var consequent=$$anchor2=>{var button=root_1$V(),node_3=child(button);X(node_3,{class:"h-4 w-4"}),reset(button),template_effect(()=>set_attribute(button,"aria-label",value()?"Clear search":"Close")),delegated("click",button,handleClear),append($$anchor2,button)};if_block(node_2,$$render=>{get$3(showClearButton)&&$$render(consequent)})}reset(div),template_effect(()=>set_class(div,1,`relative ${$$props.class??""}`)),append( +$$anchor,div),pop()}delegate(["click"]);var root_1$U=from_html(" ",1);function Scroll_area_scrollbar($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),orientation=prop($$props,"orientation",3,"vertical"),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref","class","orientation","children"]);var fragment=comment$2(),node2=first_child(fragment);{let $0=user_derived(()=>cn$1("flex touch-none p-px transition-colors select-none",orientation()==="vertical"&& +"h-full w-2.5 border-l border-l-transparent",orientation()==="horizontal"&&"h-2.5 flex-col border-t border-t-transparent",$$props.class));component(node2,()=>Scroll_area_scrollbar$1,($$anchor2,ScrollAreaPrimitive_Scrollbar)=>{ScrollAreaPrimitive_Scrollbar($$anchor2,spread_props({"data-slot":"scroll-area-scrollbar",get orientation(){return orientation()},get class(){return get$3($0)}},()=>restProps,{get ref(){return ref2()},set ref($$value){ref2($$value)},children:($$anchor3,$$slotProps)=>{var fragment_1=root_1$U(), +node_1=first_child(fragment_1);snippet(node_1,()=>$$props.children??noop$3);var node_2=sibling(node_1,2);component(node_2,()=>Scroll_area_thumb,($$anchor4,ScrollAreaPrimitive_Thumb)=>{ScrollAreaPrimitive_Thumb($$anchor4,{"data-slot":"scroll-area-thumb",class:"relative flex-1 rounded-full bg-border"})}),append($$anchor3,fragment_1)},$$slots:{default:!0}}))})}append($$anchor,fragment),pop()}var root_1$T=from_html(" ",1);function Scroll_area($$anchor,$$props){push$1($$props,!0);let ref2=prop( +$$props,"ref",15,null),orientation=prop($$props,"orientation",3,"vertical"),scrollbarXClasses=prop($$props,"scrollbarXClasses",3,""),scrollbarYClasses=prop($$props,"scrollbarYClasses",3,""),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref","class","orientation","scrollbarXClasses","scrollbarYClasses","children"]);var fragment=comment$2(),node2=first_child(fragment);{let $0=user_derived(()=>cn$1("relative",$$props.class));component(node2,()=>Scroll_area$1,($$anchor2,ScrollAreaPrimitive_Root)=>{ +ScrollAreaPrimitive_Root($$anchor2,spread_props({"data-slot":"scroll-area",get class(){return get$3($0)}},()=>restProps,{get ref(){return ref2()},set ref($$value){ref2($$value)},children:($$anchor3,$$slotProps)=>{var fragment_1=root_1$T(),node_1=first_child(fragment_1);component(node_1,()=>Scroll_area_viewport,($$anchor4,ScrollAreaPrimitive_Viewport)=>{ScrollAreaPrimitive_Viewport($$anchor4,{"data-slot":"scroll-area-viewport",class:"size-full rounded-[inherit] ring-ring/10 outline-ring/50 transi\ +tion-[color,box-shadow] focus-visible:ring-4 focus-visible:outline-1 dark:ring-ring/20 dark:outline-ring/40",children:($$anchor5,$$slotProps2)=>{var fragment_2=comment$2(),node_2=first_child(fragment_2);snippet(node_2,()=>$$props.children??noop$3),append($$anchor5,fragment_2)},$$slots:{default:!0}})});var node_3=sibling(node_1,2);{var consequent=$$anchor4=>{Scroll_area_scrollbar($$anchor4,{orientation:"vertical",get class(){return scrollbarYClasses()}})};if_block(node_3,$$render=>{(orientation()=== +"vertical"||orientation()==="both")&&$$render(consequent)})}var node_4=sibling(node_3,2);{var consequent_1=$$anchor4=>{Scroll_area_scrollbar($$anchor4,{orientation:"horizontal",get class(){return scrollbarXClasses()}})};if_block(node_4,$$render=>{(orientation()==="horizontal"||orientation()==="both")&&$$render(consequent_1)})}var node_5=sibling(node_4,2);component(node_5,()=>Scroll_area_corner,($$anchor4,ScrollAreaPrimitive_Corner)=>{ScrollAreaPrimitive_Corner($$anchor4,{})}),append($$anchor3,fragment_1)}, +$$slots:{default:!0}}))})}append($$anchor,fragment),pop()}var root_3$V=from_html(''),root_7$s=from_html('
'),root_2$15=from_html('
Conversation NameMessages
'),root$1B=from_html('
'); +function ConversationSelection($$anchor,$$props){push$1($$props,!0);let messageCountMap=prop($$props,"messageCountMap",19,()=>new Map),searchQuery=state$1(""),selectedIds=state$1(getInitialSelectedIds()),lastClickedId=state$1(null);function getInitialSelectedIds(){return new SvelteSet($$props.conversations.map(c2=>c2.id))}let filteredConversations=user_derived(()=>$$props.conversations.filter(conv=>(conv.name||"Untitled conversation").toLowerCase().includes(get$3(searchQuery).toLowerCase()))),allSelected=user_derived( +()=>get$3(filteredConversations).length>0&&get$3(filteredConversations).every(conv=>get$3(selectedIds).has(conv.id))),someSelected=user_derived(()=>get$3(filteredConversations).some(conv=>get$3(selectedIds).has(conv.id))&&!get$3(allSelected));function toggleConversation(id2,shiftKey=!1){const newSet=new SvelteSet(get$3(selectedIds));if(shiftKey&&get$3(lastClickedId)!==null){const lastIndex=get$3(filteredConversations).findIndex(c2=>c2.id===get$3(lastClickedId)),currentIndex=get$3(filteredConversations). +findIndex(c2=>c2.id===id2);if(lastIndex!==-1&¤tIndex!==-1){const start2=Math.min(lastIndex,currentIndex),end=Math.max(lastIndex,currentIndex),shouldSelect=!newSet.has(id2);for(let i=start2;i<=end;i++)shouldSelect?newSet.add(get$3(filteredConversations)[i].id):newSet.delete(get$3(filteredConversations)[i].id);set$1(selectedIds,newSet);return}}newSet.has(id2)?newSet.delete(id2):newSet.add(id2),set$1(selectedIds,newSet),set$1(lastClickedId,id2,!0)}function toggleAll(){if(get$3(allSelected)){const newSet=new SvelteSet( +get$3(selectedIds));get$3(filteredConversations).forEach(conv=>newSet.delete(conv.id)),set$1(selectedIds,newSet)}else{const newSet=new SvelteSet(get$3(selectedIds));get$3(filteredConversations).forEach(conv=>newSet.add(conv.id)),set$1(selectedIds,newSet)}}function handleConfirm(){const selected=$$props.conversations.filter(conv=>get$3(selectedIds).has(conv.id));$$props.onConfirm(selected)}function handleCancel(){set$1(selectedIds,getInitialSelectedIds()),set$1(searchQuery,""),set$1(lastClickedId, +null),$$props.onCancel()}function reset$1(){set$1(selectedIds,getInitialSelectedIds()),set$1(searchQuery,""),set$1(lastClickedId,null)}var $$exports={reset:reset$1},div=root$1B(),node2=child(div);SearchInput(node2,{placeholder:"Search conversations...",get value(){return get$3(searchQuery)},set value($$value){set$1(searchQuery,$$value,!0)}});var div_1=sibling(node2,2),span=child(div_1),text2=child(span),node_1=sibling(text2);{var consequent=$$anchor2=>{var text_1=text$8();template_effect(()=>set_text( +text_1,`(${get$3(filteredConversations).length??""} shown)`)),append($$anchor2,text_1)};if_block(node_1,$$render=>{get$3(searchQuery)&&$$render(consequent)})}reset(span),reset(div_1);var div_2=sibling(div_1,2),node_2=child(div_2);Scroll_area(node_2,{class:"h-[400px]",children:($$anchor2,$$slotProps)=>{var table2=root_2$15(),thead2=child(table2),tr2=child(thead2),th=child(tr2),node_3=child(th);Checkbox(node_3,{get checked(){return get$3(allSelected)},get indeterminate(){return get$3(someSelected)}, +onCheckedChange:toggleAll}),reset(th),next$1(2),reset(tr2),reset(thead2);var tbody2=sibling(thead2),node_4=child(tbody2);{var consequent_2=$$anchor3=>{var tr_1=root_3$V(),td=child(tr_1),node_5=child(td);{var consequent_1=$$anchor4=>{var text_2=text$8();template_effect(()=>set_text(text_2,`No conversations found matching "${get$3(searchQuery)??""}"`)),append($$anchor4,text_2)},alternate=$$anchor4=>{var text_3=text$8("No conversations available");append($$anchor4,text_3)};if_block(node_5,$$render=>{ +get$3(searchQuery)?$$render(consequent_1):$$render(alternate,-1)})}reset(td),reset(tr_1),append($$anchor3,tr_1)},alternate_1=$$anchor3=>{var fragment_2=comment$2(),node_6=first_child(fragment_2);each(node_6,17,()=>get$3(filteredConversations),conv=>conv.id,($$anchor4,conv)=>{var tr_2=root_7$s(),td_1=child(tr_2),node_7=child(td_1);{let $0=user_derived(()=>get$3(selectedIds).has(get$3(conv).id));Checkbox(node_7,{get checked(){return get$3($0)},onclick:event2=>{event2.preventDefault(),event2.stopPropagation(), +toggleConversation(get$3(conv).id,event2.shiftKey)}})}reset(td_1);var td_2=sibling(td_1),div_3=child(td_2),text_4=child(div_3,!0);reset(div_3),reset(td_2);var td_3=sibling(td_2),text_5=child(td_3,!0);reset(td_3),reset(tr_2),template_effect($0=>{set_attribute(div_3,"title",get$3(conv).name||"Untitled conversation"),set_text(text_4,get$3(conv).name||"Untitled conversation"),set_text(text_5,$0)},[()=>messageCountMap().get(get$3(conv).id)??0]),delegated("click",tr_2,event2=>toggleConversation(get$3( +conv).id,event2.shiftKey)),append($$anchor4,tr_2)}),append($$anchor3,fragment_2)};if_block(node_4,$$render=>{get$3(filteredConversations).length===0?$$render(consequent_2):$$render(alternate_1,-1)})}reset(tbody2),reset(table2),append($$anchor2,table2)},$$slots:{default:!0}}),reset(div_2);var div_4=sibling(div_2,2),node_8=child(div_4);Button(node_8,{variant:"outline",onclick:handleCancel,children:($$anchor2,$$slotProps)=>{next$1();var text_6=text$8("Cancel");append($$anchor2,text_6)},$$slots:{default:!0}}); +var node_9=sibling(node_8,2);{let $0=user_derived(()=>get$3(selectedIds).size===0);Button(node_9,{onclick:handleConfirm,get disabled(){return get$3($0)},children:($$anchor2,$$slotProps)=>{next$1();var text_7=text$8();template_effect(()=>set_text(text_7,`${$$props.mode==="export"?"Export":"Import"} (${get$3(selectedIds).size??""})`)),append($$anchor2,text_7)},$$slots:{default:!0}})}return reset(div_4),reset(div),template_effect(()=>set_text(text2,`${get$3(selectedIds).size??""} of ${$$props.conversations. +length??""} selected `)),append($$anchor,div),pop($$exports)}delegate(["click"]);var root$1A=from_html('
');function HorizontalScrollCarousel($$anchor,$$props){push$1($$props,!0);let className=prop($$props,"class",3,""),gapSize=prop($$props,"gapSize",3,"3"),canScrollLeft=state$1(!1),canScrollRight=state$1(!1),scrollContainer=state$1(void 0);function scrollLeft(event2){event2?.stopPropagation(), +event2?.preventDefault(),get$3(scrollContainer)&&get$3(scrollContainer).scrollBy({left:get$3(scrollContainer).clientWidth*-.67,behavior:"smooth"})}function scrollRight(event2){event2?.stopPropagation(),event2?.preventDefault(),get$3(scrollContainer)&&get$3(scrollContainer).scrollBy({left:get$3(scrollContainer).clientWidth*.67,behavior:"smooth"})}function updateScrollButtons(){if(!get$3(scrollContainer))return;const{scrollLeft:scrollLeft2,scrollWidth,clientWidth}=get$3(scrollContainer);set$1(canScrollLeft, +scrollLeft2>0),set$1(canScrollRight,scrollLeft2clientWidth;$$props.onScrollableChange?.(isScrollable)}function resetScroll(){get$3(scrollContainer)&&(get$3(scrollContainer).scrollLeft=0,setTimeout(()=>{updateScrollButtons()},0))}user_effect(()=>{get$3(scrollContainer)&&setTimeout(()=>{updateScrollButtons()},0)});var $$exports={resetScroll},div=root$1A(),button=child(div),node2=child(button);Chevron_left(node2,{class:"h-4 w-4"}),reset(button); +var div_1=sibling(button,2),node_1=child(div_1);snippet(node_1,()=>$$props.children??noop$3),reset(div_1),bind_this(div_1,$$value=>set$1(scrollContainer,$$value),()=>get$3(scrollContainer));var button_1=sibling(div_1,2),node_2=child(button_1);return Chevron_right(node_2,{class:"h-4 w-4"}),reset(button_1),reset(div),template_effect(()=>{set_class(div,1,`relative ${className()??""}`),set_class(button,1,`absolute top-1/2 left-4 z-10 flex h-6 w-6 -translate-y-1/2 items-center justify-center rounded-\ +full bg-background/25 shadow-md backdrop-blur-xs transition-opacity hover:bg-background/45 ${get$3(canScrollLeft)?"opacity-100":"pointer-events-none opacity-0"}`),set_class(div_1,1,`scrollbar-hide flex items-start gap-${gapSize()??""} overflow-x-auto`),set_class(button_1,1,`absolute top-1/2 right-4 z-10 flex h-6 w-6 -translate-y-1/2 items-center justify-center rounded-full bg-background/25 shadow-md backdrop-blur-xs transition-opacity hover:bg-background/45 ${get$3(canScrollRight)?"opacity-100": +"pointer-events-none opacity-0"}`)}),delegated("click",button,scrollLeft),event("scroll",div_1,updateScrollButtons),delegated("click",button_1,scrollRight),append($$anchor,div),pop($$exports)}delegate(["click"]);var root_3$U=from_html(' '),root_4$A=from_html("

"),root_2$14=from_html(" ",1),root_5$w=from_html(" ");function TruncatedText($$anchor,$$props){push$1($$props,!0);let className=prop($$props,"class",3,""),showTooltip=prop($$props, +"showTooltip",3,!0),textElement=state$1(void 0),isTruncated=state$1(!1);function checkTruncation(){get$3(textElement)&&set$1(isTruncated,get$3(textElement).scrollWidth>get$3(textElement).clientWidth)}user_effect(()=>{if(get$3(textElement)){checkTruncation();const observer=new ResizeObserver(checkTruncation);return observer.observe(get$3(textElement)),()=>observer.disconnect()}});var fragment=comment$2(),node2=first_child(fragment);{var consequent=$$anchor2=>{var fragment_1=comment$2(),node_1=first_child( +fragment_1);component(node_1,()=>Root$5,($$anchor3,Tooltip_Root)=>{Tooltip_Root($$anchor3,{children:($$anchor4,$$slotProps)=>{var fragment_2=root_2$14(),node_2=first_child(fragment_2);component(node_2,()=>Tooltip_trigger,($$anchor5,Tooltip_Trigger)=>{Tooltip_Trigger($$anchor5,{get class(){return className()},children:($$anchor6,$$slotProps2)=>{var span=root_3$U(),text_1=child(span,!0);reset(span),bind_this(span,$$value=>set$1(textElement,$$value),()=>get$3(textElement)),template_effect(()=>set_text( +text_1,$$props.text)),append($$anchor6,span)},$$slots:{default:!0}})});var node_3=sibling(node_2,2);component(node_3,()=>Tooltip_content,($$anchor5,Tooltip_Content)=>{Tooltip_Content($$anchor5,{class:"z-[9999]",children:($$anchor6,$$slotProps2)=>{var p2=root_4$A(),text_2=child(p2,!0);reset(p2),template_effect(()=>set_text(text_2,$$props.text)),append($$anchor6,p2)},$$slots:{default:!0}})}),append($$anchor4,fragment_2)},$$slots:{default:!0}})}),append($$anchor2,fragment_1)},alternate=$$anchor2=>{ +var span_1=root_5$w(),text_3=child(span_1,!0);reset(span_1),bind_this(span_1,$$value=>set$1(textElement,$$value),()=>get$3(textElement)),template_effect(()=>{set_class(span_1,1,`${className()??""} block truncate`),set_text(text_3,$$props.text)}),append($$anchor2,span_1)};if_block(node2,$$render=>{get$3(isTruncated)&&showTooltip()?$$render(consequent):$$render(alternate,-1)})}append($$anchor,fragment),pop()}var root_3$T=from_html(""),root_5$v=from_html(""),root_1$S=from_html( +" ",1),root$1z=from_html("");function KeyboardShortcutInfo($$anchor,$$props){push$1($$props,!0);let variant=prop($$props,"variant",3,"default"),className=prop($$props,"class",3,""),variantClasses=user_derived(()=>variant()==="destructive"?"text-destructive":"text-muted-foreground");var kbd=root$1z();each(kbd,21,()=>$$props.keys,index$2,($$anchor2,key2,index2)=>{var fragment=root_1$S(),node2=first_child(fragment);{var consequent=$$anchor3=>{{let $0=user_derived(()=>variant()==="d\ +estructive"?"text-destructive":"");Arrow_big_up($$anchor3,{get class(){return`h-1 w-1 ${get$3($0)??""} -mr-1`}})}},consequent_1=$$anchor3=>{var span=root_3$T();template_effect(()=>set_class(span,1,clsx(variant()==="destructive"?"text-destructive":""))),append($$anchor3,span)},alternate=$$anchor3=>{var text2=text$8();template_effect($0=>set_text(text2,$0),[()=>get$3(key2).toUpperCase()]),append($$anchor3,text2)};if_block(node2,$$render=>{get$3(key2)==="shift"?$$render(consequent):get$3(key2)==="c\ +md"?$$render(consequent_1,1):$$render(alternate,-1)})}var node_1=sibling(node2,2);{var consequent_2=$$anchor3=>{var span_1=root_5$v();append($$anchor3,span_1)};if_block(node_1,$$render=>{index2<$$props.keys.length-1&&$$render(consequent_2)})}append($$anchor2,fragment)}),reset(kbd),template_effect(()=>set_class(kbd,1,`px-1 pointer-events-none inline-flex select-none items-center gap-0.5 font-sans text-md font-medium opacity-0 transition-opacity -my-1 ${get$3(variantClasses)??""} ${className()??""}`)), +append($$anchor,kbd),pop()}var root$1y=from_html('
');function CodeBlockActions($$anchor,$$props){push$1($$props,!0);let disabled=prop($$props,"disabled",3,!1);const showPreview=user_derived(()=>$$props.language?.toLowerCase()===FileTypeText.HTML);var div=root$1y(),node2=child(div);{let $0=user_derived(()=>!disabled()),$1=user_derived(()=>disabled()?"Code incomplete":"Copy code");ActionIconCopyToClipboard(node2,{get text(){return $$props.code},get canCopy(){ +return get$3($0)},get ariaLabel(){return get$3($1)}})}var node_1=sibling(node2,2);{var consequent=$$anchor2=>{{let $0=user_derived(()=>disabled()?"Code incomplete":"Preview code");ActionIcon($$anchor2,{get icon(){return Eye},get tooltip(){return get$3($0)},get disabled(){return disabled()},onclick:()=>$$props.onPreview($$props.code,$$props.language)})}};if_block(node_1,$$render=>{get$3(showPreview)&&$$render(consequent)})}reset(div),append($$anchor,div),pop()}var root_4$z=from_html(''),root_5$u=from_html('
'),root_3$S=from_html(""),root_1$R=from_html('
');function ChatAttachmentsPreviewThumbnailStrip($$anchor,$$props){push$1($$props,!0);function getFileExtension(name){const parts=name.split(".");return parts. +length>1?parts.pop()?.toUpperCase()??"":""}var fragment=comment$2(),node2=first_child(fragment);{var consequent_2=$$anchor2=>{var div=root_1$R(),node_1=child(div);HorizontalScrollCarousel(node_1,{class:"max-w-full",children:($$anchor3,$$slotProps)=>{var fragment_1=comment$2(),node_2=first_child(fragment_1);each(node_2,19,()=>$$props.items,item=>item.id,($$anchor4,item,index2)=>{var button=root_3$S(),node_3=child(button);{var consequent=$$anchor5=>{var img=root_4$z();template_effect(()=>{set_attribute( +img,"src",get$3(item).preview),set_attribute(img,"alt",get$3(item).name)}),append($$anchor5,img)},alternate_1=$$anchor5=>{var div_1=root_5$u(),node_4=child(div_1);{var consequent_1=$$anchor6=>{Music($$anchor6,{class:"h-4 w-4 text-white/70"})},alternate=$$anchor6=>{File_text($$anchor6,{class:"h-4 w-4 text-white/70"})};if_block(node_4,$$render=>{get$3(item).isAudio?$$render(consequent_1):$$render(alternate,-1)})}var span=sibling(node_4,2),text2=child(span,!0);reset(span),reset(div_1),template_effect( +$0=>set_text(text2,$0),[()=>getFileExtension(get$3(item).name)]),append($$anchor5,div_1)};if_block(node_3,$$render=>{get$3(item).isImage&&get$3(item).preview?$$render(consequent):$$render(alternate_1,-1)})}reset(button),template_effect(()=>{set_attribute(button,"data-thumbnail-index",get$3(index2)),set_class(button,1,clsx(["relative flex-shrink-0 cursor-pointer overflow-hidden rounded border-2 bg-black/80 backdrop-blur-sm transition-all hover:opacity-90",get$3(index2)===$$props.currentIndex?"bor\ +der-white":"border-transparent opacity-60","[&:not(:first-child)]:last:mr-4 [&:not(:last-child)]:first:ml-4"])),set_attribute(button,"aria-label",`Go to ${get$3(item).name}`)}),delegated("click",button,()=>$$props.onNavigate(get$3(index2))),append($$anchor4,button)}),append($$anchor3,fragment_1)},$$slots:{default:!0}}),reset(div),append($$anchor2,div)};if_block(node2,$$render=>{$$props.items.length>1&&$$render(consequent_2)})}append($$anchor,fragment),pop()}delegate(["click"]);const alertVariants=tv( +{base:"relative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5 rounded-lg border px-4 py-3 text-sm has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current",variants:{variant:{default:"bg-card text-card-foreground",destructive:"text-destructive bg-card *:data-[slot=alert-description]:text-destructive/90 [&>svg]:text-current"}},defaultVariants:{variant:"default"}});var root$1x=from_html("
");function Alert($$anchor,$$props){ +push$1($$props,!0);let ref2=prop($$props,"ref",15,null),variant=prop($$props,"variant",3,"default"),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref","class","variant","children"]);var div=root$1x();attribute_effect(div,$0=>({"data-slot":"alert",class:$0,...restProps,role:"alert"}),[()=>cn$1(alertVariants({variant:variant()}),$$props.class)]);var node2=child(div);snippet(node2,()=>$$props.children??noop$3),reset(div),bind_this(div,$$value=>ref2($$value),()=>ref2()),append($$anchor, +div),pop()}var root$1w=from_html("
");function Alert_description($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref","class","children"]);var div=root$1w();attribute_effect(div,$0=>({"data-slot":"alert-description",class:$0,...restProps}),[()=>cn$1("col-start-2 grid justify-items-start gap-1 text-sm text-muted-foreground [&_p]:leading-relaxed",$$props.class)]);var node2=child(div);snippet(node2, +()=>$$props.children??noop$3),reset(div),bind_this(div,$$value=>ref2($$value),()=>ref2()),append($$anchor,div),pop()}var root$1v=from_html("
");function Alert_title($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref","class","children"]);var div=root$1v();attribute_effect(div,$0=>({"data-slot":"alert-title",class:$0,...restProps}),[()=>cn$1("col-start-2 line-clamp-1 min-h-4 font-medium tracking\ +-tight",$$props.class)]);var node2=child(div);snippet(node2,()=>$$props.children??noop$3),reset(div),bind_this(div,$$value=>ref2($$value),()=>ref2()),append($$anchor,div),pop()}class AudioRecorder{mediaRecorder=null;audioChunks=[];stream=null;recordingState=!1;async startRecording(){try{this.stream=await navigator.mediaDevices.getUserMedia({audio:{echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0}}),this.initializeRecorder(this.stream),this.audioChunks=[],this.mediaRecorder.start(100),this. +recordingState=!0}catch(error2){throw console.error("Failed to start recording:",error2),new Error("Failed to access microphone. Please check permissions.")}}async stopRecording(){return new Promise((resolve2,reject)=>{const recorder=this.mediaRecorder,chunks=this.audioChunks,stream=this.stream;if(!recorder||recorder.state==="inactive"){reject(new Error("No active recording to stop"));return}this.mediaRecorder=null,this.audioChunks=[],this.stream=null,this.recordingState=!1,recorder.onstop=()=>{ +const audioBlob=new Blob(chunks,{type:recorder.mimeType||MimeTypeAudio.WAV});if(stream)for(const track2 of stream.getTracks())track2.stop();resolve2(audioBlob)},recorder.onerror=event2=>{if(console.error("Recording error:",event2),stream)for(const track2 of stream.getTracks())track2.stop();reject(new Error("Recording failed"))},recorder.stop()})}isRecording(){return this.recordingState}cancelRecording(){const recorder=this.mediaRecorder,stream=this.stream;if(this.mediaRecorder=null,this.audioChunks= +[],this.stream=null,this.recordingState=!1,recorder&&recorder.state!=="inactive"&&(recorder.onstop=null,recorder.onerror=null,recorder.stop()),stream)for(const track2 of stream.getTracks())track2.stop()}initializeRecorder(stream){const options={};MediaRecorder.isTypeSupported(MimeTypeAudio.WAV)?options.mimeType=MimeTypeAudio.WAV:MediaRecorder.isTypeSupported(MimeTypeAudio.WEBM_OPUS)?options.mimeType=MimeTypeAudio.WEBM_OPUS:MediaRecorder.isTypeSupported(MimeTypeAudio.WEBM)?options.mimeType=MimeTypeAudio. +WEBM:MediaRecorder.isTypeSupported(MimeTypeAudio.MP4)?options.mimeType=MimeTypeAudio.MP4:console.warn("No preferred audio format supported, using default"),this.mediaRecorder=new MediaRecorder(stream,options),this.mediaRecorder.ondataavailable=event2=>{event2.data.size>0&&this.audioChunks.push(event2.data)},this.mediaRecorder.onstop=()=>{this.recordingState=!1},this.mediaRecorder.onerror=event2=>{console.error("MediaRecorder error:",event2),this.recordingState=!1}}}async function convertToWav(audioBlob){ +try{if(audioBlob.type.includes("wav"))return audioBlob;const arrayBuffer=await audioBlob.arrayBuffer(),audioContext=new(window.AudioContext||window.webkitAudioContext);try{const audioBuffer=await audioContext.decodeAudioData(arrayBuffer);return audioBufferToWav(audioBuffer)}finally{audioContext.close()}}catch(error2){return console.error("Failed to convert audio to WAV:",error2),audioBlob}}function audioBufferToWav(buffer){const length=buffer.length,numberOfChannels=buffer.numberOfChannels,sampleRate=buffer. +sampleRate,blockAlign=numberOfChannels*2,byteRate=sampleRate*blockAlign,dataSize=length*blockAlign,bufferSize=44+dataSize,arrayBuffer=new ArrayBuffer(bufferSize),view=new DataView(arrayBuffer),writeString=(offset2,string2)=>{for(let i=0;i1?s2=1:s2<-1&&(s2=-1),pcm[p2++]=s2*32767}return new Blob( +[arrayBuffer],{type:MimeTypeAudio.WAV})}function createAudioFile(audioBlob,filename){const timestamp=new Date().toISOString().replace(/[:.]/g,"-"),extension2=audioBlob.type.includes("wav")?"wav":"mp3",defaultFilename=`recording-${timestamp}.${extension2}`;return new File([audioBlob],defaultFilename,{type:audioBlob.type,lastModified:Date.now()})}function isAudioRecordingSupported(){return!!(typeof navigator<"u"&&navigator.mediaDevices&&typeof navigator.mediaDevices.getUserMedia=="function"&&typeof window< +"u"&&window.MediaRecorder)}const isNodeJS=typeof process=="object"&&process+""=="[object process]"&&!process.versions.nw&&!(process.versions.electron&&process.type&&process.type!=="browser"),FONT_IDENTITY_MATRIX=[.001,0,0,.001,0,0],LINE_FACTOR=1.35,RenderingIntentFlag={ANY:1,DISPLAY:2,PRINT:4,ANNOTATIONS_FORMS:16,ANNOTATIONS_STORAGE:32,ANNOTATIONS_DISABLE:64,IS_EDITING:128,OPLIST:256},AnnotationMode={DISABLE:0,ENABLE:1,ENABLE_FORMS:2,ENABLE_STORAGE:3},AnnotationEditorPrefix="pdfjs_internal_edito\ +r_",AnnotationEditorType={DISABLE:-1,NONE:0,FREETEXT:3,HIGHLIGHT:9,STAMP:13,INK:15,SIGNATURE:101,COMMENT:102},AnnotationEditorParamsType={RESIZE:1,CREATE:2,FREETEXT_SIZE:11,FREETEXT_COLOR:12,FREETEXT_OPACITY:13,INK_COLOR:21,INK_THICKNESS:22,INK_OPACITY:23,HIGHLIGHT_COLOR:31,HIGHLIGHT_THICKNESS:32,HIGHLIGHT_FREE:33,HIGHLIGHT_SHOW_ALL:34,DRAW_STEP:41},PermissionFlag={PRINT:4,MODIFY_CONTENTS:8,COPY:16,MODIFY_ANNOTATIONS:32,FILL_INTERACTIVE_FORMS:256,COPY_FOR_ACCESSIBILITY:512,ASSEMBLE:1024,PRINT_HIGH_QUALITY:2048}, +TextRenderingMode={FILL:0,STROKE:1,FILL_STROKE:2,INVISIBLE:3,FILL_STROKE_MASK:3,ADD_TO_PATH_FLAG:4},util_ImageKind={GRAYSCALE_1BPP:1,RGB_24BPP:2,RGBA_32BPP:3},AnnotationType={TEXT:1,LINK:2,FREETEXT:3,LINE:4,SQUARE:5,CIRCLE:6,POLYGON:7,POLYLINE:8,HIGHLIGHT:9,UNDERLINE:10,SQUIGGLY:11,STRIKEOUT:12,STAMP:13,CARET:14,INK:15,POPUP:16,FILEATTACHMENT:17,SOUND:18,MOVIE:19,WIDGET:20,SCREEN:21,PRINTERMARK:22,TRAPNET:23,WATERMARK:24,THREED:25,REDACT:26},AnnotationBorderStyleType={SOLID:1,DASHED:2,BEVELED:3, +INSET:4,UNDERLINE:5},VerbosityLevel={ERRORS:0,WARNINGS:1,INFOS:5},OPS={dependency:1,setLineWidth:2,setLineCap:3,setLineJoin:4,setMiterLimit:5,setDash:6,setRenderingIntent:7,setFlatness:8,setGState:9,save:10,restore:11,transform:12,moveTo:13,lineTo:14,curveTo:15,curveTo2:16,curveTo3:17,closePath:18,rectangle:19,stroke:20,closeStroke:21,fill:22,eoFill:23,fillStroke:24,eoFillStroke:25,closeFillStroke:26,closeEOFillStroke:27,endPath:28,clip:29,eoClip:30,beginText:31,endText:32,setCharSpacing:33,setWordSpacing:34, +setHScale:35,setLeading:36,setFont:37,setTextRenderingMode:38,setTextRise:39,moveText:40,setLeadingMoveText:41,setTextMatrix:42,nextLine:43,showText:44,showSpacedText:45,nextLineShowText:46,nextLineSetSpacingShowText:47,setCharWidth:48,setCharWidthAndBounds:49,setStrokeColorSpace:50,setFillColorSpace:51,setStrokeColor:52,setStrokeColorN:53,setFillColor:54,setFillColorN:55,setStrokeGray:56,setFillGray:57,setStrokeRGBColor:58,setFillRGBColor:59,setStrokeCMYKColor:60,setFillCMYKColor:61,shadingFill:62, +beginInlineImage:63,beginImageData:64,endInlineImage:65,paintXObject:66,markPoint:67,markPointProps:68,beginMarkedContent:69,beginMarkedContentProps:70,endMarkedContent:71,beginCompat:72,endCompat:73,paintFormXObjectBegin:74,paintFormXObjectEnd:75,beginGroup:76,endGroup:77,beginAnnotation:80,endAnnotation:81,paintImageMaskXObject:83,paintImageMaskXObjectGroup:84,paintImageXObject:85,paintInlineImageXObject:86,paintInlineImageXObjectGroup:87,paintImageXObjectRepeat:88,paintImageMaskXObjectRepeat:89, +paintSolidColorImageMask:90,constructPath:91,setStrokeTransparent:92,setFillTransparent:93,rawFillPath:94},DrawOPS={moveTo:0,lineTo:1,curveTo:2,closePath:3},PasswordResponses={NEED_PASSWORD:1,INCORRECT_PASSWORD:2};let verbosity=VerbosityLevel.WARNINGS;function setVerbosityLevel(level){Number.isInteger(level)&&(verbosity=level)}function getVerbosityLevel(){return verbosity}function info(msg){verbosity>=VerbosityLevel.INFOS&&console.log(`Info: ${msg}`)}function warn(msg){verbosity>=VerbosityLevel. +WARNINGS&&console.log(`Warning: ${msg}`)}function unreachable(msg){throw new Error(msg)}function assert$1(cond,msg){cond||unreachable(msg)}function _isValidProtocol(url2){switch(url2?.protocol){case"http:":case"https:":case"ftp:":case"mailto:":case"tel:":return!0;default:return!1}}function createValidAbsoluteUrl(url2,baseUrl=null,options=null){if(!url2)return null;if(options&&typeof url2=="string"&&(options.addDefaultProtocol&&url2.startsWith("www.")&&url2.match(/\./g)?.length>=2&&(url2=`http://${url2}`), +options.tryConvertEncoding))try{url2=stringToUTF8String(url2)}catch{}const absoluteUrl=baseUrl?URL.parse(url2,baseUrl):URL.parse(url2);return _isValidProtocol(absoluteUrl)?absoluteUrl:null}function updateUrlHash(url2,hash2,allowRel=!1){const res=URL.parse(url2);return res?(res.hash=hash2,res.href):allowRel&&createValidAbsoluteUrl(url2,"http://example.com")?url2.split("#",1)[0]+`${hash2?`#${hash2}`:""}`:""}function shadow(obj,prop2,value,nonSerializable=!1){return Object.defineProperty(obj,prop2, +{value,enumerable:!nonSerializable,configurable:!0,writable:!1}),value}const BaseException=(function(){function BaseException2(message,name){this.message=message,this.name=name}return BaseException2.prototype=new Error,BaseException2.constructor=BaseException2,BaseException2})();class PasswordException extends BaseException{constructor(msg,code2){super(msg,"PasswordException"),this.code=code2}}class UnknownErrorException extends BaseException{constructor(msg,details){super(msg,"UnknownErrorExcep\ +tion"),this.details=details}}class InvalidPDFException extends BaseException{constructor(msg){super(msg,"InvalidPDFException")}}class ResponseException extends BaseException{constructor(msg,status,missing){super(msg,"ResponseException"),this.status=status,this.missing=missing}}class FormatError extends BaseException{constructor(msg){super(msg,"FormatError")}}class AbortException extends BaseException{constructor(msg){super(msg,"AbortException")}}function bytesToString(bytes){(typeof bytes!="obje\ +ct"||bytes?.length===void 0)&&unreachable("Invalid argument for bytesToString");const length=bytes.length,MAX_ARGUMENT_COUNT=8192;if(length>24&255,value>>16&255,value>>8&255,value&255)}function isLittleEndian(){const buffer8=new Uint8Array(4);return buffer8[0]=1,new Uint32Array(buffer8.buffer,0,1)[0]===1}function isEvalSupported(){try{return new Function(""),!0}catch{return!1}}class util_FeatureTest{static get isLittleEndian(){return shadow( +this,"isLittleEndian",isLittleEndian())}static get isEvalSupported(){return shadow(this,"isEvalSupported",isEvalSupported())}static get isOffscreenCanvasSupported(){return shadow(this,"isOffscreenCanvasSupported",typeof OffscreenCanvas<"u")}static get isImageDecoderSupported(){return shadow(this,"isImageDecoderSupported",typeof ImageDecoder<"u")}static get platform(){const{platform:platform2,userAgent}=navigator;return shadow(this,"platform",{isAndroid:userAgent.includes("Android"),isLinux:platform2. +includes("Linux"),isMac:platform2.includes("Mac"),isWindows:platform2.includes("Win"),isFirefox:userAgent.includes("Firefox")})}static get isCSSRoundSupported(){return shadow(this,"isCSSRoundSupported",globalThis.CSS?.supports?.("width: round(1.5px, 1px)"))}}const hexNumbers=Array.from(Array(256).keys(),n=>n.toString(16).padStart(2,"0"));class Util{static makeHexColor(r2,g,b){return`#${hexNumbers[r2]}${hexNumbers[g]}${hexNumbers[b]}`}static scaleMinMax(transform2,minMax){let temp;transform2[0]?(transform2[0]< +0&&(temp=minMax[0],minMax[0]=minMax[2],minMax[2]=temp),minMax[0]*=transform2[0],minMax[2]*=transform2[0],transform2[3]<0&&(temp=minMax[1],minMax[1]=minMax[3],minMax[3]=temp),minMax[1]*=transform2[3],minMax[3]*=transform2[3]):(temp=minMax[0],minMax[0]=minMax[1],minMax[1]=temp,temp=minMax[2],minMax[2]=minMax[3],minMax[3]=temp,transform2[1]<0&&(temp=minMax[1],minMax[1]=minMax[3],minMax[3]=temp),minMax[1]*=transform2[1],minMax[3]*=transform2[1],transform2[2]<0&&(temp=minMax[0],minMax[0]=minMax[2],minMax[2]= +temp),minMax[0]*=transform2[2],minMax[2]*=transform2[2]),minMax[0]+=transform2[4],minMax[1]+=transform2[5],minMax[2]+=transform2[4],minMax[3]+=transform2[5]}static transform(m1,m2){return[m1[0]*m2[0]+m1[2]*m2[1],m1[1]*m2[0]+m1[3]*m2[1],m1[0]*m2[2]+m1[2]*m2[3],m1[1]*m2[2]+m1[3]*m2[3],m1[0]*m2[4]+m1[2]*m2[5]+m1[4],m1[1]*m2[4]+m1[3]*m2[5]+m1[5]]}static applyTransform(p2,m,pos=0){const p0=p2[pos],p1=p2[pos+1];p2[pos]=p0*m[0]+p1*m[2]+m[4],p2[pos+1]=p0*m[1]+p1*m[3]+m[5]}static applyTransformToBezier(p2,transform2,pos=0){ +const m0=transform2[0],m1=transform2[1],m2=transform2[2],m3=transform2[3],m4=transform2[4],m5=transform2[5];for(let i=0;i<6;i+=2){const pI=p2[pos+i],pI1=p2[pos+i+1];p2[pos+i]=pI*m0+pI1*m2+m4,p2[pos+i+1]=pI*m1+pI1*m3+m5}}static applyInverseTransform(p2,m){const p0=p2[0],p1=p2[1],d2=m[0]*m[3]-m[1]*m[2];p2[0]=(p0*m[3]-p1*m[2]+m[2]*m[5]-m[4]*m[3])/d2,p2[1]=(-p0*m[1]+p1*m[0]+m[4]*m[1]-m[5]*m[0])/d2}static axialAlignedBoundingBox(rect,transform2,output){const m0=transform2[0],m1=transform2[1],m2=transform2[2], +m3=transform2[3],m4=transform2[4],m5=transform2[5],r0=rect[0],r1=rect[1],r2=rect[2],r3=rect[3];let a0=m0*r0+m4,a2=a0,a1=m0*r2+m4,a3=a1,b0=m3*r1+m5,b2=b0,b1=m3*r3+m5,b3=b1;if(m1!==0||m2!==0){const m1r0=m1*r0,m1r2=m1*r2,m2r1=m2*r1,m2r3=m2*r3;a0+=m2r1,a3+=m2r1,a1+=m2r3,a2+=m2r3,b0+=m1r0,b3+=m1r0,b1+=m1r2,b2+=m1r2}output[0]=Math.min(output[0],a0,a1,a2,a3),output[1]=Math.min(output[1],b0,b1,b2,b3),output[2]=Math.max(output[2],a0,a1,a2,a3),output[3]=Math.max(output[3],b0,b1,b2,b3)}static inverseTransform(m){ +const d2=m[0]*m[3]-m[1]*m[2];return[m[3]/d2,-m[1]/d2,-m[2]/d2,m[0]/d2,(m[2]*m[5]-m[4]*m[3])/d2,(m[4]*m[1]-m[5]*m[0])/d2]}static singularValueDecompose2dScale(matrix,output){const m0=matrix[0],m1=matrix[1],m2=matrix[2],m3=matrix[3],a=m0**2+m1**2,b=m0*m2+m1*m3,c2=m2**2+m3**2,first=(a+c2)/2,second=Math.sqrt(first**2-(a*c2-b**2));output[0]=Math.sqrt(first+second||1),output[1]=Math.sqrt(first-second||1)}static normalizeRect(rect){const r2=rect.slice(0);return rect[0]>rect[2]&&(r2[0]=rect[2],r2[2]=rect[0]), +rect[1]>rect[3]&&(r2[1]=rect[3],r2[3]=rect[1]),r2}static intersect(rect1,rect2){const xLow=Math.max(Math.min(rect1[0],rect1[2]),Math.min(rect2[0],rect2[2])),xHigh=Math.min(Math.max(rect1[0],rect1[2]),Math.max(rect2[0],rect2[2]));if(xLow>xHigh)return null;const yLow=Math.max(Math.min(rect1[1],rect1[3]),Math.min(rect2[1],rect2[3])),yHigh=Math.min(Math.max(rect1[1],rect1[3]),Math.max(rect2[1],rect2[3]));return yLow>yHigh?null:[xLow,yLow,xHigh,yHigh]}static pointBoundingBox(x,y,minMax){minMax[0]=Math. +min(minMax[0],x),minMax[1]=Math.min(minMax[1],y),minMax[2]=Math.max(minMax[2],x),minMax[3]=Math.max(minMax[3],y)}static rectBoundingBox(x0,y0,x1,y1,minMax){minMax[0]=Math.min(minMax[0],x0,x1),minMax[1]=Math.min(minMax[1],y0,y1),minMax[2]=Math.max(minMax[2],x0,x1),minMax[3]=Math.max(minMax[3],y0,y1)}static#getExtremumOnCurve(x0,x1,x2,x3,y0,y1,y2,y3,t,minMax){if(t<=0||t>=1)return;const mt=1-t,tt=t*t,ttt=tt*t,x=mt*(mt*(mt*x0+3*t*x1)+3*tt*x2)+ttt*x3,y=mt*(mt*(mt*y0+3*t*y1)+3*tt*y2)+ttt*y3;minMax[0]= +Math.min(minMax[0],x),minMax[1]=Math.min(minMax[1],y),minMax[2]=Math.max(minMax[2],x),minMax[3]=Math.max(minMax[3],y)}static#getExtremum(x0,x1,x2,x3,y0,y1,y2,y3,a,b,c2,minMax){if(Math.abs(a)<1e-12){Math.abs(b)>=1e-12&&this.#getExtremumOnCurve(x0,x1,x2,x3,y0,y1,y2,y3,-c2/b,minMax);return}const delta=b**2-4*c2*a;if(delta<0)return;const sqrtDelta=Math.sqrt(delta),a2=2*a;this.#getExtremumOnCurve(x0,x1,x2,x3,y0,y1,y2,y3,(-b+sqrtDelta)/a2,minMax),this.#getExtremumOnCurve(x0,x1,x2,x3,y0,y1,y2,y3,(-b-sqrtDelta)/ +a2,minMax)}static bezierBoundingBox(x0,y0,x1,y1,x2,y2,x3,y3,minMax){minMax[0]=Math.min(minMax[0],x0,x3),minMax[1]=Math.min(minMax[1],y0,y3),minMax[2]=Math.max(minMax[2],x0,x3),minMax[3]=Math.max(minMax[3],y0,y3),this.#getExtremum(x0,x1,x2,x3,y0,y1,y2,y3,3*(-x0+3*(x1-x2)+x3),6*(x0-2*x1+x2),3*(x1-x0),minMax),this.#getExtremum(x0,x1,x2,x3,y0,y1,y2,y3,3*(-y0+3*(y1-y2)+y3),6*(y0-2*y1+y2),3*(y1-y0),minMax)}}function stringToUTF8String(str){return decodeURIComponent(escape(str))}let NormalizeRegex=null, +NormalizationMap=null;function normalizeUnicode(str){return NormalizeRegex||(NormalizeRegex=/([\u00a0\u00b5\u037e\u0eb3\u2000-\u200a\u202f\u2126\ufb00-\ufb04\ufb06\ufb20-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufba1\ufba4-\ufba9\ufbae-\ufbb1\ufbd3-\ufbdc\ufbde-\ufbe7\ufbea-\ufbf8\ufbfc-\ufbfd\ufc00-\ufc5d\ufc64-\ufcf1\ufcf5-\ufd3d\ufd88\ufdf4\ufdfa-\ufdfb\ufe71\ufe77\ufe79\ufe7b\ufe7d]+)|(\ufb05+)/gu,NormalizationMap=new Map([["ſt","ſt"]])),str.replaceAll(NormalizeRegex,(_,p1,p2)=>p1? +p1.normalize("NFKC"):NormalizationMap.get(p2))}function getUuid(){if(typeof crypto.randomUUID=="function")return crypto.randomUUID();const buf=new Uint8Array(32);return crypto.getRandomValues(buf),bytesToString(buf)}const AnnotationPrefix="pdfjs_internal_id_";function _isValidExplicitDest(validRef,validName,dest){if(!Array.isArray(dest)||dest.length<2)return!1;const[page2,zoom,...args]=dest;if(!validRef(page2)&&!Number.isInteger(page2)||!validName(zoom))return!1;const argsLen=args.length;let allowNull=!0; +switch(zoom.name){case"XYZ":if(argsLen<2||argsLen>3)return!1;break;case"Fit":case"FitB":return argsLen===0;case"FitH":case"FitBH":case"FitV":case"FitBV":if(argsLen>1)return!1;break;case"FitR":if(argsLen!==4)return!1;allowNull=!1;break;default:return!1}for(const arg of args)if(!(typeof arg=="number"||allowNull&&arg===null))return!1;return!0}function MathClamp(v,min2,max2){return Math.min(Math.max(v,min2),max2)}function toBase64Util(arr){return Uint8Array.prototype.toBase64?arr.toBase64():btoa(bytesToString( +arr))}function fromBase64Util(str){return Uint8Array.fromBase64?Uint8Array.fromBase64(str):stringToBytes(atob(str))}typeof Promise.try!="function"&&(Promise.try=function(fn,...args){return new Promise(resolve2=>{resolve2(fn(...args))})});typeof Math.sumPrecise!="function"&&(Math.sumPrecise=function(numbers){return numbers.reduce((a,b)=>a+b,0)});const SVG_NS="http://www.w3.org/2000/svg";class PixelsPerInch{static CSS=96;static PDF=72;static PDF_TO_CSS_UNITS=this.CSS/this.PDF}async function fetchData(url2,type2="\ +text"){if(isValidFetchUrl(url2,document.baseURI)){const response=await fetch(url2);if(!response.ok)throw new Error(response.statusText);switch(type2){case"arraybuffer":return response.arrayBuffer();case"blob":return response.blob();case"json":return response.json()}return response.text()}return new Promise((resolve2,reject)=>{const request=new XMLHttpRequest;request.open("GET",url2,!0),request.responseType=type2,request.onreadystatechange=()=>{if(request.readyState===XMLHttpRequest.DONE){if(request. +status===200||request.status===0){switch(type2){case"arraybuffer":case"blob":case"json":resolve2(request.response);return}resolve2(request.responseText);return}reject(new Error(request.statusText))}},request.send(null)})}class PageViewport{constructor({viewBox,userUnit,scale:scale2,rotation,offsetX=0,offsetY=0,dontFlip=!1}){this.viewBox=viewBox,this.userUnit=userUnit,this.scale=scale2,this.rotation=rotation,this.offsetX=offsetX,this.offsetY=offsetY,scale2*=userUnit;const centerX=(viewBox[2]+viewBox[0])/ +2,centerY=(viewBox[3]+viewBox[1])/2;let rotateA,rotateB,rotateC,rotateD;switch(rotation%=360,rotation<0&&(rotation+=360),rotation){case 180:rotateA=-1,rotateB=0,rotateC=0,rotateD=1;break;case 90:rotateA=0,rotateB=1,rotateC=1,rotateD=0;break;case 270:rotateA=0,rotateB=-1,rotateC=-1,rotateD=0;break;case 0:rotateA=1,rotateB=0,rotateC=0,rotateD=-1;break;default:throw new Error("PageViewport: Invalid rotation, must be a multiple of 90 degrees.")}dontFlip&&(rotateC=-rotateC,rotateD=-rotateD);let offsetCanvasX, +offsetCanvasY,width,height;rotateA===0?(offsetCanvasX=Math.abs(centerY-viewBox[1])*scale2+offsetX,offsetCanvasY=Math.abs(centerX-viewBox[0])*scale2+offsetY,width=(viewBox[3]-viewBox[1])*scale2,height=(viewBox[2]-viewBox[0])*scale2):(offsetCanvasX=Math.abs(centerX-viewBox[0])*scale2+offsetX,offsetCanvasY=Math.abs(centerY-viewBox[1])*scale2+offsetY,width=(viewBox[2]-viewBox[0])*scale2,height=(viewBox[3]-viewBox[1])*scale2),this.transform=[rotateA*scale2,rotateB*scale2,rotateC*scale2,rotateD*scale2, +offsetCanvasX-rotateA*scale2*centerX-rotateC*scale2*centerY,offsetCanvasY-rotateB*scale2*centerX-rotateD*scale2*centerY],this.width=width,this.height=height}get rawDims(){const dims=this.viewBox;return shadow(this,"rawDims",{pageWidth:dims[2]-dims[0],pageHeight:dims[3]-dims[1],pageX:dims[0],pageY:dims[1]})}clone({scale:scale2=this.scale,rotation=this.rotation,offsetX=this.offsetX,offsetY=this.offsetY,dontFlip=!1}={}){return new PageViewport({viewBox:this.viewBox.slice(),userUnit:this.userUnit,scale:scale2, +rotation,offsetX,offsetY,dontFlip})}convertToViewportPoint(x,y){const p2=[x,y];return Util.applyTransform(p2,this.transform),p2}convertToViewportRectangle(rect){const topLeft=[rect[0],rect[1]];Util.applyTransform(topLeft,this.transform);const bottomRight=[rect[2],rect[3]];return Util.applyTransform(bottomRight,this.transform),[topLeft[0],topLeft[1],bottomRight[0],bottomRight[1]]}convertToPdfPoint(x,y){const p2=[x,y];return Util.applyInverseTransform(p2,this.transform),p2}}class RenderingCancelledException extends BaseException{constructor(msg,extraDelay=0){ +super(msg,"RenderingCancelledException"),this.extraDelay=extraDelay}}function isDataScheme(url2){const ii=url2.length;let i=0;for(;i{try{return new URL(urlString)}catch{try{return new URL(decodeURIComponent(urlString))}catch{try{return new URL(urlString,"https://foo.bar")}catch{try{return new URL(decodeURIComponent(urlString),"https://foo.bar")}catch{return null}}}}})(url2);if(!newURL)return defaultFilename;const decode2=name=>{try{let decoded=decodeURIComponent( +name);return decoded.includes("/")?(decoded=decoded.split("/").at(-1),decoded.test(/^\.pdf$/i)?decoded:name):decoded}catch{return name}},pdfRegex=/\.pdf$/i,filename=newURL.pathname.split("/").at(-1);if(pdfRegex.test(filename))return decode2(filename);if(newURL.searchParams.size>0){const values=Array.from(newURL.searchParams.values()).reverse();for(const value of values)if(pdfRegex.test(value))return decode2(value);const keys2=Array.from(newURL.searchParams.keys()).reverse();for(const key2 of keys2) +if(pdfRegex.test(key2))return decode2(key2)}if(newURL.hash){const hashFilename=/[^/?#=]+\.pdf\b(?!.*\.pdf\b)/i.exec(newURL.hash);if(hashFilename)return decode2(hashFilename[0])}return defaultFilename}class StatTimer{started=Object.create(null);times=[];time(name){name in this.started&&warn(`Timer is already running for ${name}`),this.started[name]=Date.now()}timeEnd(name){name in this.started||warn(`Timer has not been started for ${name}`),this.times.push({name,start:this.started[name],end:Date. +now()}),delete this.started[name]}toString(){const outBuf=[];let longest=0;for(const{name}of this.times)longest=Math.max(name.length,longest);for(const{name,start:start2,end}of this.times)outBuf.push(`${name.padEnd(longest)} ${end-start2}ms `);return outBuf.join("")}}function isValidFetchUrl(url2,baseUrl){const res=baseUrl?URL.parse(url2,baseUrl):URL.parse(url2);return res?.protocol==="http:"||res?.protocol==="https:"}function noContextMenu(e){e.preventDefault()}function stopEvent(e){e.preventDefault(),e.stopPropagation()}function deprecated(details){console.log("Deprecated API usage: "+details)}class PDFDateString{static#regex;static toDateObject(input){if(input instanceof Date)return input;if(!input||typeof input!="string")return null; this.#regex||=new RegExp("^D:(\\d{4})(\\d{2})?(\\d{2})?(\\d{2})?(\\d{2})?(\\d{2})?([Z|+|-])?(\\d{2})?'?(\\d{2})?'?");const matches2=this.#regex.exec(input);if(!matches2)return null;const year=parseInt(matches2[1],10);let month=parseInt(matches2[2],10);month=month>=1&&month<=12?month-1:0;let day=parseInt(matches2[3],10);day=day>=1&&day<=31?day:1;let hour=parseInt(matches2[4],10);hour=hour>=0&&hour<=23?hour:0;let minute=parseInt(matches2[5],10);minute=minute>=0&&minute<=59?minute:0;let second=parseInt( matches2[6],10);second=second>=0&&second<=59?second:0;const universalTimeRelation=matches2[7]||"Z";let offsetHour=parseInt(matches2[8],10);offsetHour=offsetHour>=0&&offsetHour<=23?offsetHour:0;let offsetMinute=parseInt(matches2[9],10)||0;return offsetMinute=offsetMinute>=0&&offsetMinute<=59?offsetMinute:0,universalTimeRelation==="-"?(hour+=offsetHour,minute+=offsetMinute):universalTimeRelation==="+"&&(hour-=offsetHour,minute-=offsetMinute),new Date(Date.UTC(year,month,day,hour,minute,second))}}function getXfaPageViewport(xfaPage,{ @@ -6328,328 +6299,357 @@ node2=first_child(fragment);{var consequent=$$anchor2=>{var div=root_1$N(),node_ ()=>$$props.isImage?Image$1:$$props.isText||$$props.isPdf?File_text:$$props.isAudio?Music:File$1),isUnavailable=user_derived(()=>!$$props.isPdf&&!$$props.isImage&&!($$props.isText&&$$props.displayTextContent)&&!$$props.isAudio);var fragment=comment$2(),node2=first_child(fragment);{var consequent_5=$$anchor2=>{var fragment_1=comment$2(),node_1=first_child(fragment_1);key$1(node_1,()=>$$props.currentItem.id,$$anchor3=>{var fragment_2=comment$2(),node_2=first_child(fragment_2);{var consequent=$$anchor4=>{ ChatAttachmentsPreviewCurrentItemPdf($$anchor4,{get currentItem(){return $$props.currentItem},get displayName(){return $$props.currentItem.name},get displayTextContent(){return $$props.displayTextContent},get hasVisionModality(){return $$props.hasVisionModality},get activeModelId(){return $$props.activeModelId}})},consequent_1=$$anchor4=>{ChatAttachmentsPreviewCurrentItemImage($$anchor4,{get currentItem(){return $$props.currentItem},get displayPreview(){return $$props.displayPreview}})},consequent_2=$$anchor4=>{ ChatAttachmentsPreviewCurrentItemText($$anchor4,{get displayTextContent(){return $$props.displayTextContent},get language(){return $$props.language}})},consequent_3=$$anchor4=>{ChatAttachmentsPreviewCurrentItemAudio($$anchor4,{get currentItem(){return $$props.currentItem},get audioSrc(){return $$props.audioSrc}})},consequent_4=$$anchor4=>{ChatAttachmentsPreviewCurrentItemUnavailable($$anchor4,{get IconComponent(){return get$3(IconComponent)}})};if_block(node_2,$$render=>{$$props.isPdf?$$render(consequent): -$$props.isImage?$$render(consequent_1,1):$$props.isText&&$$props.displayTextContent?$$render(consequent_2,2):$$props.isAudio?$$render(consequent_3,3):get$3(isUnavailable)&&$$render(consequent_4,4)})}append($$anchor3,fragment_2)}),append($$anchor2,fragment_1)};if_block(node2,$$render=>{$$props.currentItem&&$$render(consequent_5)})}append($$anchor,fragment),pop()}class ConversationsStore{#conversations=state$1(proxy([]));get conversations(){return get$3(this.#conversations)}set conversations(value){ -set$1(this.#conversations,value,!0)}#activeConversation=state$1(null);get activeConversation(){return get$3(this.#activeConversation)}set activeConversation(value){set$1(this.#activeConversation,value,!0)}#activeMessages=state$1(proxy([]));get activeMessages(){return get$3(this.#activeMessages)}set activeMessages(value){set$1(this.#activeMessages,value,!0)}#isInitialized=state$1(!1);get isInitialized(){return get$3(this.#isInitialized)}set isInitialized(value){set$1(this.#isInitialized,value,!0)}#pendingMcpServerOverrides=state$1( -proxy(ConversationsStore.loadMcpDefaults()));get pendingMcpServerOverrides(){return get$3(this.#pendingMcpServerOverrides)}set pendingMcpServerOverrides(value){set$1(this.#pendingMcpServerOverrides,value,!0)}static loadMcpDefaults(){if(typeof globalThis.localStorage>"u")return[];try{const raw2=localStorage.getItem(MCP_DEFAULT_ENABLED_LOCALSTORAGE_KEY);if(!raw2)return[];const parsed=JSON.parse(raw2);return Array.isArray(parsed)?parsed.filter(o=>typeof o=="object"&&o!==null&&"serverId"in o&&"enabl\ -ed"in o):[]}catch{return[]}}saveMcpDefaults(){if(typeof globalThis.localStorage>"u")return;const plain=this.pendingMcpServerOverrides.map(o=>({serverId:o.serverId,enabled:o.enabled}));plain.length>0?localStorage.setItem(MCP_DEFAULT_ENABLED_LOCALSTORAGE_KEY,JSON.stringify(plain)):localStorage.removeItem(MCP_DEFAULT_ENABLED_LOCALSTORAGE_KEY)}titleUpdateConfirmationCallback;messageUpdateCallback=null;async init(){if(!this.isInitialized)try{await runLegacyMigration(),await this.loadConversations(),this. -isInitialized=!0}catch(error2){console.error("Failed to initialize conversations:",error2)}}async initialize(){return this.init()}registerMessageUpdateCallback(callback){this.messageUpdateCallback=callback}addMessageToActive(message){this.activeMessages.push(message)}updateMessageAtIndex(index2,updates){index2!==-1&&this.activeMessages[index2]&&(this.activeMessages[index2]={...this.activeMessages[index2],...updates})}findMessageIndex(messageId){return this.activeMessages.findIndex(m=>m.id===messageId)}sliceActiveMessages(startIndex){ -this.activeMessages=this.activeMessages.slice(0,startIndex)}removeMessageAtIndex(index2){if(index2!==-1)return this.activeMessages.splice(index2,1)[0]}setTitleUpdateConfirmationCallback(callback){this.titleUpdateConfirmationCallback=callback}async loadConversations(){const conversations2=await DatabaseService.getAllConversations();this.conversations=conversations2}async createConversation(name){const conversationName=name||`Chat ${new Date().toLocaleString()}`,conversation=await DatabaseService. -createConversation(conversationName);if(this.pendingMcpServerOverrides.length>0){const plainOverrides=this.pendingMcpServerOverrides.map(o=>({serverId:o.serverId,enabled:o.enabled}));conversation.mcpServerOverrides=plainOverrides,await DatabaseService.updateConversation(conversation.id,{mcpServerOverrides:plainOverrides}),this.pendingMcpServerOverrides=[]}return this.conversations=[conversation,...this.conversations],this.activeConversation=conversation,this.activeMessages=[],await goto(`#/chat/${conversation. -id}`),conversation.id}async loadConversation(convId){try{const conversation=await DatabaseService.getConversation(convId);if(!conversation)return!1;if(this.pendingMcpServerOverrides=[],this.activeConversation=conversation,conversation.currNode){const allMessages=await DatabaseService.getConversationMessages(convId),filteredMessages=filterByLeafNodeId(allMessages,conversation.currNode,!1);this.activeMessages=filteredMessages}else{const messages=await DatabaseService.getConversationMessages(convId); -this.activeMessages=messages}return!0}catch(error2){return console.error("Failed to load conversation:",error2),!1}}clearActiveConversation(){this.activeConversation=null,this.activeMessages=[],this.pendingMcpServerOverrides=ConversationsStore.loadMcpDefaults()}async deleteConversation(convId,options){try{if(await DatabaseService.deleteConversation(convId,options),options?.deleteWithForks){const idsToRemove=new SvelteSet([convId]),queue=[convId];for(;queue.length>0;){const parentId=queue.pop();for(const c2 of this. -conversations)c2.forkedFromConversationId===parentId&&!idsToRemove.has(c2.id)&&(idsToRemove.add(c2.id),queue.push(c2.id))}this.conversations=this.conversations.filter(c2=>!idsToRemove.has(c2.id)),this.activeConversation&&idsToRemove.has(this.activeConversation.id)&&(this.clearActiveConversation(),await goto("?new_chat=true#/"))}else{const newParent=this.conversations.find(c2=>c2.id===convId)?.forkedFromConversationId;this.conversations=this.conversations.filter(c2=>c2.id!==convId).map(c2=>c2.forkedFromConversationId=== -convId?{...c2,forkedFromConversationId:newParent}:c2),this.activeConversation?.id===convId&&(this.clearActiveConversation(),await goto("?new_chat=true#/"))}}catch(error2){console.error("Failed to delete conversation:",error2)}}async deleteAll(){try{const allConversations=await DatabaseService.getAllConversations();for(const conv of allConversations)await DatabaseService.deleteConversation(conv.id);this.clearActiveConversation(),this.conversations=[],toast.success("All conversations deleted"),await goto( -"?new_chat=true#/")}catch(error2){console.error("Failed to delete all conversations:",error2),toast.error("Failed to delete conversations")}}async refreshActiveMessages(){if(!this.activeConversation)return;const allMessages=await DatabaseService.getConversationMessages(this.activeConversation.id);if(allMessages.length===0){this.activeMessages=[];return}const leafNodeId=this.activeConversation.currNode||allMessages.reduce((latest,msg)=>msg.timestamp>latest.timestamp?msg:latest).id,currentPath=filterByLeafNodeId( -allMessages,leafNodeId,!1);this.activeMessages=currentPath}async getConversationMessages(convId){return await DatabaseService.getConversationMessages(convId)}async updateConversationName(convId,name){try{await DatabaseService.updateConversation(convId,{name});const convIndex=this.conversations.findIndex(c2=>c2.id===convId);convIndex!==-1&&(this.conversations[convIndex].name=name,this.conversations=[...this.conversations]),this.activeConversation?.id===convId&&(this.activeConversation={...this.activeConversation, -name})}catch(error2){console.error("Failed to update conversation name:",error2)}}async updateConversationTitleWithConfirmation(convId,newTitle){try{if(config$1().askForTitleConfirmation&&this.titleUpdateConfirmationCallback){const conversation=await DatabaseService.getConversation(convId);if(!conversation||!await this.titleUpdateConfirmationCallback(conversation.name,newTitle))return!1}return await this.updateConversationName(convId,newTitle),!0}catch(error2){return console.error("Failed to upd\ -ate conversation title with confirmation:",error2),!1}}updateConversationTimestamp(){if(!this.activeConversation)return;const chatIndex=this.conversations.findIndex(c2=>c2.id===this.activeConversation.id);if(chatIndex!==-1){this.conversations[chatIndex].lastModified=Date.now();const updatedConv=this.conversations.splice(chatIndex,1)[0];this.conversations=[updatedConv,...this.conversations]}}async updateCurrentNode(nodeId){this.activeConversation&&(await DatabaseService.updateCurrentNode(this.activeConversation. -id,nodeId),this.activeConversation={...this.activeConversation,currNode:nodeId})}async navigateToSibling(siblingId){if(!this.activeConversation)return;const allMessages=await DatabaseService.getConversationMessages(this.activeConversation.id),rootMessage=allMessages.find(m=>m.type==="root"&&m.parent===null),currentFirstUserMessage=this.activeMessages.find(m=>m.role===MessageRole.USER&&m.parent===rootMessage?.id),currentLeafNodeId=findLeafNode(allMessages,siblingId);if(await DatabaseService.updateCurrentNode( -this.activeConversation.id,currentLeafNodeId),this.activeConversation={...this.activeConversation,currNode:currentLeafNodeId},await this.refreshActiveMessages(),rootMessage&&this.activeMessages.length>0){const newFirstUserMessage=this.activeMessages.find(m=>m.role===MessageRole.USER&&m.parent===rootMessage.id);newFirstUserMessage&&newFirstUserMessage.content.trim()&&(!currentFirstUserMessage||newFirstUserMessage.id!==currentFirstUserMessage.id||newFirstUserMessage.content.trim()!==currentFirstUserMessage. -content.trim())&&await this.updateConversationTitleWithConfirmation(this.activeConversation.id,generateConversationTitle(newFirstUserMessage.content,!!config$1().titleGenerationUseFirstLine))}}getMcpServerOverride(serverId){return this.activeConversation?this.activeConversation.mcpServerOverrides?.find(o=>o.serverId===serverId):this.pendingMcpServerOverrides.find(o=>o.serverId===serverId)}getAllMcpServerOverrides(){return this.activeConversation?.mcpServerOverrides?this.activeConversation.mcpServerOverrides: -this.pendingMcpServerOverrides}isMcpServerEnabledForChat(serverId){return this.getMcpServerOverride(serverId)?.enabled??!1}async setMcpServerOverride(serverId,enabled){if(!this.activeConversation){this.setPendingMcpServerOverride(serverId,enabled);return}const currentOverrides=(this.activeConversation.mcpServerOverrides||[]).map(o=>({serverId:o.serverId,enabled:o.enabled}));let newOverrides;if(enabled===void 0)newOverrides=currentOverrides.filter(o=>o.serverId!==serverId);else{const existingIndex=currentOverrides. -findIndex(o=>o.serverId===serverId);existingIndex>=0?(newOverrides=[...currentOverrides],newOverrides[existingIndex]={serverId,enabled}):newOverrides=[...currentOverrides,{serverId,enabled}]}await DatabaseService.updateConversation(this.activeConversation.id,{mcpServerOverrides:newOverrides.length>0?newOverrides:void 0}),this.activeConversation={...this.activeConversation,mcpServerOverrides:newOverrides.length>0?newOverrides:void 0};const convIndex=this.conversations.findIndex(c2=>c2.id===this.activeConversation. -id);convIndex!==-1&&(this.conversations[convIndex].mcpServerOverrides=newOverrides.length>0?newOverrides:void 0,this.conversations=[...this.conversations])}setPendingMcpServerOverride(serverId,enabled){if(enabled===void 0)this.pendingMcpServerOverrides=this.pendingMcpServerOverrides.filter(o=>o.serverId!==serverId);else{const existingIndex=this.pendingMcpServerOverrides.findIndex(o=>o.serverId===serverId);if(existingIndex>=0){const newOverrides=[...this.pendingMcpServerOverrides];newOverrides[existingIndex]= -{serverId,enabled},this.pendingMcpServerOverrides=newOverrides}else this.pendingMcpServerOverrides=[...this.pendingMcpServerOverrides,{serverId,enabled}]}this.saveMcpDefaults()}async toggleMcpServerForChat(serverId){const currentEnabled=this.isMcpServerEnabledForChat(serverId);await this.setMcpServerOverride(serverId,!currentEnabled)}async removeMcpServerOverride(serverId){await this.setMcpServerOverride(serverId,void 0)}clearPendingMcpServerOverrides(){this.pendingMcpServerOverrides=[],this.saveMcpDefaults()}async forkConversation(messageId,options){ -if(!this.activeConversation)return null;try{const newConv=await DatabaseService.forkConversation(this.activeConversation.id,messageId,options);return this.conversations=[newConv,...this.conversations],await goto(`#/chat/${newConv.id}`),toast.success("Conversation forked"),newConv.id}catch(error2){return console.error("Failed to fork conversation:",error2),toast.error("Failed to fork conversation"),null}}generateConversationFilename(conversation,msgs){const sanitizedName=(conversation.name??"").trim(). -toLowerCase().replace(NON_ALPHANUMERIC_REGEX,EXPORT_CONV_NONALNUM_REPLACEMENT).replace(MULTIPLE_UNDERSCORE_REGEX,"_").substring(0,EXPORT_CONV_NAME_SUFFIX_MAX_LENGTH),formattedDate=(msgs?.length?new Date(Math.max(...msgs.map(m=>m.timestamp))):new Date).toISOString().slice(0,ISO_TIMESTAMP_SLICE_LENGTH).replace(ISO_DATE_TIME_SEPARATOR,ISO_DATE_TIME_SEPARATOR_REPLACEMENT).replaceAll(ISO_TIME_SEPARATOR,ISO_TIME_SEPARATOR_REPLACEMENT),trimmedConvId=conversation.id?.slice(0,EXPORT_CONV_ID_TRIM_LENGTH)?? -"";return`${formattedDate}_conv_${trimmedConvId}_${sanitizedName}.json`}downloadConversationFile(data,filename){const conversation="conv"in data?data.conv:Array.isArray(data)?data[0]?.conv:void 0,msgs="messages"in data?data.messages:Array.isArray(data)?data[0]?.messages:void 0;if(!conversation){console.error("Invalid data: missing conversation");return}let downloadFilename;filename?downloadFilename=filename:Array.isArray(data)&&data.length>1?downloadFilename=`${new Date().toISOString().split(ISO_DATE_TIME_SEPARATOR)[0]}\ -_conversations.json`:downloadFilename=this.generateConversationFilename(conversation,msgs);const blob=new Blob([JSON.stringify(data,null,2)],{type:"application/json"}),url2=URL.createObjectURL(blob),a=document.createElement("a");a.href=url2,a.download=downloadFilename,document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(url2)}async downloadConversation(convId){let conversation,messages;if(this.activeConversation?.id===convId)conversation=this.activeConversation, -messages=this.activeMessages;else{if(conversation=await DatabaseService.getConversation(convId),!conversation)return;messages=await DatabaseService.getConversationMessages(convId)}this.downloadConversationFile({conv:conversation,messages})}async importConversations(){return new Promise((resolve2,reject)=>{const input=document.createElement("input");input.type=HtmlInputType.FILE,input.accept=FileExtensionText.JSON,input.onchange=async e=>{const file=e.target?.files?.[0];if(!file){reject(new Error( -"No file selected"));return}try{const text2=await file.text(),parsedData=JSON.parse(text2);let importedData;if(Array.isArray(parsedData))importedData=parsedData;else if(parsedData&&typeof parsedData=="object"&&"conv"in parsedData&&"messages"in parsedData)importedData=[parsedData];else throw new Error("Invalid file format");const result=await DatabaseService.importConversations(importedData);toast.success(`Imported ${result.imported} conversation(s), skipped ${result.skipped}`),await this.loadConversations(); -const importedConversations=(Array.isArray(importedData)?importedData:[importedData]).map(item=>item.conv);resolve2(importedConversations)}catch(err){const message=err instanceof Error?err.message:"Unknown error";console.error("Failed to import conversations:",err),toast.error("Import failed",{description:message}),reject(new Error(`Import failed: ${message}`))}},input.click()})}async importConversationsData(data){const result=await DatabaseService.importConversations(data);return await this.loadConversations(), -result}}const conversationsStore=new ConversationsStore;conversationsStore.init();const conversations=()=>conversationsStore.conversations,activeConversation=()=>conversationsStore.activeConversation,activeMessages=()=>conversationsStore.activeMessages,isConversationsInitialized=()=>conversationsStore.isInitialized;function buildConversationTree(convs){const childrenByParent=new SvelteMap,forkIds=new SvelteSet;for(const conv of convs)if(conv.forkedFromConversationId){forkIds.add(conv.id);const siblings2=childrenByParent. -get(conv.forkedFromConversationId)||[];siblings2.push(conv),childrenByParent.set(conv.forkedFromConversationId,siblings2)}const result=[],visited=new SvelteSet;function walk(conv,depth){visited.add(conv.id),result.push({conversation:conv,depth});const children=childrenByParent.get(conv.id);if(children){children.sort((a,b)=>b.lastModified-a.lastModified);for(const child2 of children)walk(child2,depth+1)}}const roots=convs.filter(c2=>!forkIds.has(c2.id));for(const root2 of roots)walk(root2,0);for(const conv of convs) -visited.has(conv.id)||walk(conv,1);return result}class ToolsService{static async list(){return apiFetch(API_TOOLS.LIST)}static async executeTool(toolName,params,signal){const result=await apiFetch(API_TOOLS.EXECUTE,{method:"POST",body:JSON.stringify({tool:toolName,params}),signal});return ToolResponseField.ERROR in result?{content:String(result[ToolResponseField.ERROR]),isError:!0}:ToolResponseField.PLAIN_TEXT in result?{content:String(result[ToolResponseField.PLAIN_TEXT]),isError:!1}:{content:JSON. -stringify(result),isError:!1}}}class ToolsStore{#_builtinTools=state$1(proxy([]));get _builtinTools(){return get$3(this.#_builtinTools)}set _builtinTools(value){set$1(this.#_builtinTools,value,!0)}#_loading=state$1(!1);get _loading(){return get$3(this.#_loading)}set _loading(value){set$1(this.#_loading,value,!0)}#_error=state$1(null);get _error(){return get$3(this.#_error)}set _error(value){set$1(this.#_error,value,!0)}#_disabledTools=state$1(proxy(new SvelteSet));get _disabledTools(){return get$3( -this.#_disabledTools)}set _disabledTools(value){set$1(this.#_disabledTools,value,!0)}#_toolsEndpointUnreachable=state$1(!1);get _toolsEndpointUnreachable(){return get$3(this.#_toolsEndpointUnreachable)}set _toolsEndpointUnreachable(value){set$1(this.#_toolsEndpointUnreachable,value,!0)}constructor(){try{const stored=localStorage.getItem(DISABLED_TOOLS_LOCALSTORAGE_KEY);if(stored){const parsed=JSON.parse(stored);if(Array.isArray(parsed))for(const name of parsed)typeof name=="string"&&this._disabledTools. -add(name)}}catch(err){console.error("[ToolsStore] Failed to load disabled tools from localStorage:",err)}this.fetchBuiltinTools()}persistDisabledTools(){try{localStorage.setItem(DISABLED_TOOLS_LOCALSTORAGE_KEY,JSON.stringify([...this._disabledTools]))}catch{}}get builtinTools(){return this._builtinTools}get mcpTools(){return mcpStore.getToolDefinitionsForLLM()}get customTools(){const raw2=config$1().custom;if(!raw2||typeof raw2!="string")return[];try{const parsed=JSON.parse(raw2);return Array.isArray( -parsed)?parsed.filter(t=>typeof t=="object"&&t!==null&&"type"in t&&t.type==="function"&&"function"in t&&typeof t.function?.name=="string"):[]}catch{return[]}}get allTools(){const entries=[];for(const def of this._builtinTools)entries.push({source:ToolSource.BUILTIN,definition:def});const connections=mcpStore.getConnections();if(connections.size>0)for(const[serverId,connection]of connections){const serverName=mcpStore.getServerDisplayName(serverId);for(const tool of connection.tools){const rawSchema=tool. -inputSchema??{type:JsonSchemaType.OBJECT,properties:{},required:[]};entries.push({source:ToolSource.MCP,serverName,serverId,definition:{type:ToolCallType.FUNCTION,function:{name:tool.name,description:tool.description,parameters:rawSchema}}})}}else for(const{serverId,serverName,tools}of this.getMcpToolsFromHealthChecks())for(const tool of tools)entries.push({source:ToolSource.MCP,serverName,serverId,definition:{type:ToolCallType.FUNCTION,function:{name:tool.name,description:tool.description,parameters:{ -type:JsonSchemaType.OBJECT,properties:{},required:[]}}}});for(const def of this.customTools)entries.push({source:ToolSource.CUSTOM,definition:def});return entries}get toolGroups(){const groups=[];this._builtinTools.length>0&&groups.push({source:ToolSource.BUILTIN,label:TOOL_GROUP_LABELS[ToolSource.BUILTIN],tools:this._builtinTools});const connections=mcpStore.getConnections();if(connections.size>0)for(const[serverId,connection]of connections){if(connection.tools.length===0)continue;const label=mcpStore. -getServerDisplayName(serverId),tools=connection.tools.map(tool=>{const rawSchema=tool.inputSchema??{type:JsonSchemaType.OBJECT,properties:{},required:[]};return{type:ToolCallType.FUNCTION,function:{name:tool.name,description:tool.description,parameters:rawSchema}}});groups.push({source:ToolSource.MCP,label,serverId,tools})}else for(const{serverId,serverName,tools}of this.getMcpToolsFromHealthChecks()){if(tools.length===0)continue;const defs=tools.map(tool=>({type:ToolCallType.FUNCTION,function:{ -name:tool.name,description:tool.description,parameters:{type:JsonSchemaType.OBJECT,properties:{},required:[]}}}));groups.push({source:ToolSource.MCP,label:serverName,serverId,tools:defs})}const custom2=this.customTools;return custom2.length>0&&groups.push({source:ToolSource.CUSTOM,label:TOOL_GROUP_LABELS[ToolSource.CUSTOM],tools:custom2}),groups}get enabledToolDefinitions(){return this.allTools.filter(t=>!this._disabledTools.has(t.definition.function.name)).map(t=>t.definition)}getEnabledToolsForLLM(){ -const disabled=this._disabledTools,result=[];for(const tool of this._builtinTools)disabled.has(tool.function.name)||result.push(tool);for(const tool of mcpStore.getToolDefinitionsForLLM())disabled.has(tool.function.name)||result.push(tool);for(const tool of this.customTools)disabled.has(tool.function.name)||result.push(tool);return result}get allToolDefinitions(){return this.allTools.map(t=>t.definition)}get loading(){return this._loading}get error(){return this._error}get isToolsEndpointUnreachable(){ -return this._toolsEndpointUnreachable}get disabledTools(){return this._disabledTools}isToolEnabled(toolName){return!this._disabledTools.has(toolName)}toggleTool(toolName){this._disabledTools.has(toolName)?this._disabledTools.delete(toolName):this._disabledTools.add(toolName),this.persistDisabledTools()}setToolEnabled(toolName,enabled){enabled?this._disabledTools.delete(toolName):this._disabledTools.add(toolName)}enableAllToolsForServer(serverId){const connection=mcpStore.getConnections().get(serverId); -if(connection){for(const tool of connection.tools)this._disabledTools.delete(tool.name);this.persistDisabledTools()}}toggleGroup(group){const allEnabled=group.tools.every(t=>this.isToolEnabled(t.function.name));for(const tool of group.tools)this.setToolEnabled(tool.function.name,!allEnabled);this.persistDisabledTools()}isGroupFullyEnabled(group){return group.tools.length>0&&group.tools.every(t=>this.isToolEnabled(t.function.name))}isGroupPartiallyEnabled(group){const enabledCount=group.tools.filter( -t=>this.isToolEnabled(t.function.name)).length;return enabledCount>0&&enabledCounts2.enabled)){const health=mcpStore.getHealthCheckState(server.id);health.status===HealthCheckStatus.SUCCESS&&health.tools.length>0&&result.push({serverId:server.id,serverName:mcpStore.getServerLabel(server),tools:health.tools})}return result}getToolSource(toolName){if(this._builtinTools.some( -t=>t.function.name===toolName))return ToolSource.BUILTIN;for(const entry of this.allTools)if(entry.definition.function.name===toolName)return entry.source;return null}getToolServerLabel(toolName){for(const entry of this.allTools)if(entry.definition.function.name===toolName){if(entry.serverName)return mcpStore.getServerDisplayName(entry.serverName);if(entry.source===ToolSource.BUILTIN)return TOOL_SERVER_LABELS[ToolSource.BUILTIN];if(entry.source===ToolSource.CUSTOM)return TOOL_SERVER_LABELS[ToolSource. -CUSTOM]}return""}getPermissionKey(toolName){for(const entry of this.allTools)if(entry.definition.function.name===toolName)switch(entry.source){case ToolSource.BUILTIN:return`builtin:${toolName}`;case ToolSource.CUSTOM:return`custom:${toolName}`;case ToolSource.MCP:return entry.serverId?`mcp-${entry.serverId}:${toolName}`:`mcp:${toolName}`;default:return null}return null}get hasEnabledTools(){return this.getEnabledToolsForLLM().length>0}async fetchBuiltinTools(){if(!this._loading){this._loading=!0, -this._error=null,this._toolsEndpointUnreachable=!1;try{const toolInfos=await ToolsService.list();this._builtinTools=toolInfos.map(info2=>info2.definition)}catch(err){const errorMessage=err instanceof Error?err.message:String(err);this._error=errorMessage,(errorMessage.includes("404")||errorMessage.toLowerCase().includes("not found"))&&(this._toolsEndpointUnreachable=!0),console.error("[ToolsStore] Failed to fetch built-in tools:",err)}finally{this._loading=!1}}}}const toolsStore=new ToolsStore;class PermissionsStore{#_tools=state$1( -proxy(new SvelteSet));get _tools(){return get$3(this.#_tools)}set _tools(value){set$1(this.#_tools,value,!0)}constructor(){try{const stored=localStorage.getItem(ALWAYS_ALLOWED_TOOLS_LOCALSTORAGE_KEY);if(stored)for(const name of JSON.parse(stored))typeof name=="string"&&this._tools.add(name)}catch(err){console.error(`Failed to load permissions from localStorage ("${ALWAYS_ALLOWED_TOOLS_LOCALSTORAGE_KEY}"):`,err)}}get tools(){return this._tools}hasTool(key2){return this._tools.has(key2)}allowTool(key2){ -this._tools.add(key2),this._persist()}allowTools(keys2){for(const key2 of keys2)this._tools.add(key2);this._persist()}revokeTool(key2){this._tools.delete(key2),this._persist()}_persist(){try{localStorage.setItem(ALWAYS_ALLOWED_TOOLS_LOCALSTORAGE_KEY,JSON.stringify([...this._tools]))}catch(err){console.error(`Failed to persist to localStorage ("${ALWAYS_ALLOWED_TOOLS_LOCALSTORAGE_KEY}"):`,err)}}}const permissionsStore=new PermissionsStore;function createDefaultSession(){return{isRunning:!1,currentTurn:0, -totalToolCalls:0,lastError:null,streamingToolCall:null,pendingPermissionRequest:null}}function toAgenticMessages(messages){return messages.map(message=>message.role===MessageRole.ASSISTANT&&message.tool_calls&&message.tool_calls.length>0?{role:MessageRole.ASSISTANT,content:message.content,reasoning_content:message.reasoning_content,tool_calls:message.tool_calls.map((call,index2)=>({id:call.id??`call_${index2}`,type:call.type??ToolCallType.FUNCTION,function:{name:call.function?.name??"",arguments:call. -function?.arguments??""}}))}:message.role===MessageRole.ASSISTANT?{role:MessageRole.ASSISTANT,content:message.content,reasoning_content:message.reasoning_content}:message.role===MessageRole.TOOL&&message.tool_call_id?{role:MessageRole.TOOL,tool_call_id:message.tool_call_id,content:typeof message.content=="string"?message.content:""}:{role:message.role,content:message.content})}class AgenticStore{_sessions=new SvelteMap;_pendingPermissions=new SvelteMap;_permissionResolvers=new Map;_pendingContinueRequests=new SvelteMap;_continueResolvers=new Map;_steeringMessages=new SvelteMap;get isReady(){ -return!0}get isAnyRunning(){for(const session of this._sessions.values())if(session.isRunning)return!0;return!1}getSession(conversationId){let session=this._sessions.get(conversationId);return session||(session=createDefaultSession(),this._sessions.set(conversationId,session)),session}updateSession(conversationId,update2){const session=this.getSession(conversationId);this._sessions.set(conversationId,{...session,...update2})}clearSession(conversationId){this._sessions.delete(conversationId)}getActiveSessions(){ -const active=[];for(const[conversationId,session]of this._sessions.entries())session.isRunning&&active.push({conversationId,session});return active}isRunning(conversationId){return this.getSession(conversationId).isRunning}currentTurn(conversationId){return this.getSession(conversationId).currentTurn}totalToolCalls(conversationId){return this.getSession(conversationId).totalToolCalls}lastError(conversationId){return this.getSession(conversationId).lastError}streamingToolCall(conversationId){return this. -getSession(conversationId).streamingToolCall}pendingPermissionRequest(conversationId){return this._pendingPermissions.get(conversationId)??null}pendingContinueRequest(conversationId){return this._pendingContinueRequests.get(conversationId)??!1}resolveContinue(conversationId,shouldContinue){const resolver2=this._continueResolvers.get(conversationId);resolver2&&(this._continueResolvers.delete(conversationId),resolver2(shouldContinue))}resolvePermission(conversationId,decision){const resolver2=this. -_permissionResolvers.get(conversationId);resolver2&&(this._permissionResolvers.delete(conversationId),resolver2(decision))}clearError(conversationId){this.updateSession(conversationId,{lastError:null})}hasPendingSteeringMessage(conversationId){return this._steeringMessages.has(conversationId)}pendingSteeringMessageContent(conversationId){return this._steeringMessages.get(conversationId)?.content??null}pendingSteeringMessageExtras(conversationId){return this._steeringMessages.get(conversationId)?. -extras}injectSteeringMessage(conversationId,content2,extras){this._steeringMessages.set(conversationId,{content:content2,extras})}clearSteeringMessage(conversationId){this._steeringMessages.delete(conversationId)}consumePendingSteeringMessage(conversationId){const msg=this._steeringMessages.get(conversationId);return msg?(this._steeringMessages.delete(conversationId),msg):null}getConfig(settings,perChatOverrides){const maxTurns=Number(settings.agenticMaxTurns)||DEFAULT_AGENTIC_CONFIG.maxTurns,maxToolPreviewLines=Number( -settings.agenticMaxToolPreviewLines)||DEFAULT_AGENTIC_CONFIG.maxToolPreviewLines;return{enabled:(mcpStore.hasEnabledServers(perChatOverrides)||toolsStore.builtinTools.length>0||toolsStore.customTools.length>0)&&DEFAULT_AGENTIC_CONFIG.enabled,maxTurns,maxToolPreviewLines}}parseToolArguments(args){if(typeof args=="object")return args;const trimmed=args.trim();return trimmed===""?{}:JSON.parse(trimmed)}async requestPermission(conversationId,toolName,serverLabel,signal){const permissionKey=toolsStore. -getPermissionKey(toolName);return permissionKey&&permissionsStore.hasTool(permissionKey)?ToolPermissionDecision.ONCE:(this._pendingPermissions.set(conversationId,{toolName,serverLabel}),new Promise(resolve2=>{if(signal?.aborted){this._pendingPermissions.set(conversationId,null),resolve2(ToolPermissionDecision.DENY);return}this._permissionResolvers.set(conversationId,decision=>{if(this._pendingPermissions.set(conversationId,null),decision===ToolPermissionDecision.ALWAYS&&permissionKey)permissionsStore. -allowTool(permissionKey);else if(decision===ToolPermissionDecision.ALWAYS_SERVER){const serverToolKeys=toolsStore.allTools.filter(t=>t.serverName?t.serverName===serverLabel:toolsStore.getToolServerLabel(t.definition.function.name)===serverLabel).map(t=>toolsStore.getPermissionKey(t.definition.function.name)).filter(k=>k!==null);permissionsStore.allowTools(serverToolKeys)}resolve2(decision)}),signal?.addEventListener("abort",()=>{this._permissionResolvers.get(conversationId)&&(this._permissionResolvers. -delete(conversationId),this._pendingPermissions.set(conversationId,null),resolve2(ToolPermissionDecision.DENY))},{once:!0})}))}async requestContinue(conversationId,signal){return this._pendingContinueRequests.set(conversationId,!0),new Promise(resolve2=>{if(signal?.aborted){this._pendingContinueRequests.set(conversationId,!1),resolve2(!1);return}this._continueResolvers.set(conversationId,shouldContinue=>{this._pendingContinueRequests.set(conversationId,!1),resolve2(shouldContinue)}),signal?.addEventListener( -"abort",()=>{this._continueResolvers.get(conversationId)&&(this._continueResolvers.delete(conversationId),this._pendingContinueRequests.set(conversationId,!1),resolve2(!1))},{once:!0})})}async runAgenticFlow(params){const{conversationId,messages,options={},callbacks,signal,perChatOverrides}=params;this._pendingPermissions.set(conversationId,null),this._permissionResolvers.delete(conversationId),this._pendingContinueRequests.set(conversationId,!1),this._continueResolvers.delete(conversationId),this. -_steeringMessages.delete(conversationId),toolsStore.builtinTools.length===0&&!toolsStore.loading&&await toolsStore.fetchBuiltinTools();const agenticConfig=this.getConfig(config$1(),perChatOverrides);if(!agenticConfig.enabled)return{handled:!1};const hasMcpServers=mcpStore.hasEnabledServers(perChatOverrides);hasMcpServers&&(await mcpStore.ensureInitialized(perChatOverrides)||console.log("[AgenticStore] MCP not initialized"));const tools=toolsStore.getEnabledToolsForLLM();if(tools.length===0)return console. -log("[AgenticStore] No tools available, falling back to standard chat"),{handled:!1};console.log(`[AgenticStore] Starting agentic flow with ${tools.length} tools`);const normalizedMessages=messages.map(msg=>"id"in msg&&"convId"in msg&&"timestamp"in msg?ChatService.convertDbMessageToApiChatMessageData(msg):msg).filter(msg=>msg.role===MessageRole.SYSTEM?(typeof msg.content=="string"?msg.content:"").trim().length>0:!0);this.updateSession(conversationId,{isRunning:!0,currentTurn:0,totalToolCalls:0,lastError:null}), -hasMcpServers&&mcpStore.acquireConnection();try{return await this.executeAgenticLoop({conversationId,messages:normalizedMessages,options,tools,agenticConfig,callbacks,signal}),{handled:!0}}catch(error2){const normalizedError=error2 instanceof Error?error2:new Error(String(error2));return this.updateSession(conversationId,{lastError:normalizedError}),callbacks.onError?.(normalizedError),{handled:!0,error:normalizedError}}finally{this.updateSession(conversationId,{isRunning:!1}),hasMcpServers&&await mcpStore. -releaseConnection().catch(err=>console.warn("[AgenticStore] Failed to release MCP connection:",err))}}async executeAgenticLoop(params){const{conversationId,messages,options,tools,agenticConfig,callbacks,signal}=params,{onChunk,onReasoningChunk,onToolCallsStreaming,onAttachments,onModel,onAssistantTurnComplete,createToolResultMessage,createAssistantMessage,onFlowComplete,onTimings,onTurnComplete}=callbacks,sessionMessages=toAgenticMessages(messages);let capturedTimings,totalToolCallCount=0;const agenticTimings={ -turns:0,toolCallsCount:0,toolsMs:0,toolCalls:[],perTurn:[],llm:{predicted_n:0,predicted_ms:0,prompt_n:0,prompt_ms:0}},maxTurns=agenticConfig.maxTurns,effectiveModel=options.model||modelsStore.models[0]?.model||"";let turn=0;for(;;){if(turn>=maxTurns){const shouldContinue=await this.requestContinue(conversationId,signal);if(await new Promise(r2=>setTimeout(r2,0)),!shouldContinue||signal?.aborted){onFlowComplete?.(this.buildFinalTimings(capturedTimings,agenticTimings));return}turn=0}if(this.updateSession( -conversationId,{currentTurn:turn+1}),agenticTimings.turns=turn+1,signal?.aborted){onFlowComplete?.(this.buildFinalTimings(capturedTimings,agenticTimings));return}turn>0&&createAssistantMessage&&await createAssistantMessage();let turnContent="",turnReasoningContent="",turnToolCalls=[],lastStreamingToolCallName="",lastStreamingToolCallArgsLength=0,turnTimings;const turnStats={turn:turn+1,llm:{predicted_n:0,predicted_ms:0,prompt_n:0,prompt_ms:0},toolCalls:[],toolsMs:0};try{await ChatService.sendMessage( -sessionMessages,{...options,stream:!0,tools:tools.length>0?tools:void 0,onChunk:chunk=>{turnContent+=chunk,onChunk?.(chunk)},onReasoningChunk:chunk=>{turnReasoningContent+=chunk,onReasoningChunk?.(chunk)},onToolCallChunk:serialized=>{try{if(turnToolCalls=JSON.parse(serialized),onToolCallsStreaming?.(turnToolCalls),turnToolCalls.length>0&&turnToolCalls[0]?.function){const name=turnToolCalls[0].function.name||"",args=turnToolCalls[0].function.arguments||"",argsLengthBucket=Math.floor(args.length/100); -(name!==lastStreamingToolCallName||argsLengthBucket!==lastStreamingToolCallArgsLength)&&(lastStreamingToolCallName=name,lastStreamingToolCallArgsLength=argsLengthBucket,this.updateSession(conversationId,{streamingToolCall:{name,arguments:args}}))}}catch{}},onModel,onTimings:(timings,progress)=>{onTimings?.(timings,progress),timings&&(capturedTimings=timings,turnTimings=timings)},onComplete:()=>{},onError:error2=>{throw error2}},void 0,signal),this.updateSession(conversationId,{streamingToolCall:null}), -turnTimings&&(agenticTimings.llm.predicted_n+=turnTimings.predicted_n||0,agenticTimings.llm.predicted_ms+=turnTimings.predicted_ms||0,agenticTimings.llm.prompt_n+=turnTimings.prompt_n||0,agenticTimings.llm.prompt_ms+=turnTimings.prompt_ms||0,turnStats.llm.predicted_n=turnTimings.predicted_n||0,turnStats.llm.predicted_ms=turnTimings.predicted_ms||0,turnStats.llm.prompt_n=turnTimings.prompt_n||0,turnStats.llm.prompt_ms=turnTimings.prompt_ms||0)}catch(error2){if(signal?.aborted){await onAssistantTurnComplete?.( -turnContent,turnReasoningContent||void 0,this.buildFinalTimings(capturedTimings,agenticTimings),void 0),onFlowComplete?.(this.buildFinalTimings(capturedTimings,agenticTimings));return}const normalizedError=error2 instanceof Error?error2:new Error("LLM stream error");throw onChunk?.(`${LLM_ERROR_BLOCK_START}${normalizedError.message}${LLM_ERROR_BLOCK_END}`),await onAssistantTurnComplete?.(turnContent+`${LLM_ERROR_BLOCK_START}${normalizedError.message}${LLM_ERROR_BLOCK_END}`,turnReasoningContent|| -void 0,this.buildFinalTimings(capturedTimings,agenticTimings),void 0),onFlowComplete?.(this.buildFinalTimings(capturedTimings,agenticTimings)),normalizedError}if(this._steeringMessages.has(conversationId)){console.log("[AgenticStore] Steering message detected after turn, exiting agentic flow"),await onAssistantTurnComplete?.(turnContent,turnReasoningContent||void 0,this.buildFinalTimings(capturedTimings,agenticTimings),turnToolCalls.length>0?this.normalizeToolCalls(turnToolCalls):void 0),onFlowComplete?.( -this.buildFinalTimings(capturedTimings,agenticTimings));return}if(turnToolCalls.length===0){agenticTimings.perTurn.push(turnStats);const finalTimings=this.buildFinalTimings(capturedTimings,agenticTimings);await onAssistantTurnComplete?.(turnContent,turnReasoningContent||void 0,finalTimings,void 0),finalTimings&&onTurnComplete?.(finalTimings),onFlowComplete?.(finalTimings);return}const normalizedCalls=this.normalizeToolCalls(turnToolCalls);if(normalizedCalls.length===0){await onAssistantTurnComplete?.( -turnContent,turnReasoningContent||void 0,this.buildFinalTimings(capturedTimings,agenticTimings),void 0),onFlowComplete?.(this.buildFinalTimings(capturedTimings,agenticTimings));return}totalToolCallCount+=normalizedCalls.length,this.updateSession(conversationId,{totalToolCalls:totalToolCallCount}),await onAssistantTurnComplete?.(turnContent,turnReasoningContent||void 0,turnTimings,normalizedCalls),sessionMessages.push({role:MessageRole.ASSISTANT,content:turnContent||void 0,reasoning_content:turnReasoningContent|| -void 0,tool_calls:normalizedCalls});for(let i=0;isetTimeout(r2,0)),signal?.aborted){onFlowComplete?.(this.buildFinalTimings( -capturedTimings,agenticTimings));return}const toolStartTime=performance.now(),toolSource=toolsStore.getToolSource(toolName);let result,toolSuccess=!0;if(permission===ToolPermissionDecision.DENY)result="Tool execution was denied by the user.",toolSuccess=!1;else try{if(toolSource===ToolSource.BUILTIN){const args=this.parseToolArguments(toolCall.function.arguments),executionResult=await ToolsService.executeTool(toolName,args,signal);result=executionResult.content,executionResult.isError&&(toolSuccess= -!1)}else{const mcpCall={id:toolCall.id,function:{name:toolName,arguments:toolCall.function.arguments}};result=(await mcpStore.executeTool(mcpCall,signal)).content}}catch(error2){if(isAbortError(error2)){onFlowComplete?.(this.buildFinalTimings(capturedTimings,agenticTimings));return}result=`Error: ${error2 instanceof Error?error2.message:String(error2)}`,toolSuccess=!1}const toolDurationMs=performance.now()-toolStartTime,toolTiming={name:toolCall.function.name,duration_ms:Math.round(toolDurationMs), -success:toolSuccess};if(agenticTimings.toolCalls.push(toolTiming),agenticTimings.toolCallsCount++,agenticTimings.toolsMs+=Math.round(toolDurationMs),turnStats.toolCalls.push(toolTiming),turnStats.toolsMs+=Math.round(toolDurationMs),signal?.aborted){onFlowComplete?.(this.buildFinalTimings(capturedTimings,agenticTimings));return}const{cleanedResult,attachments}=this.extractBase64Attachments(result);let toolResultMessage;createToolResultMessage&&(toolResultMessage=await createToolResultMessage(toolCall. -id,cleanedResult,attachments.length>0?attachments:void 0)),attachments.length>0&&toolResultMessage&&onAttachments?.(toolResultMessage.id,attachments);const contentParts=[{type:ContentPartType.TEXT,text:cleanedResult}];for(const attachment of attachments)attachment.type===AttachmentType.IMAGE&&(modelsStore.modelSupportsVision(effectiveModel)?contentParts.push({type:ContentPartType.IMAGE_URL,image_url:{url:attachment.base64Url}}):console.info(`[AgenticStore] Skipping image attachment (model "${effectiveModel}\ -" does not support vision)`));sessionMessages.push({role:MessageRole.TOOL,tool_call_id:toolCall.id,content:contentParts.length===1?cleanedResult:contentParts})}if(turnStats.toolCalls.length>0){agenticTimings.perTurn.push(turnStats);const intermediateTimings=this.buildFinalTimings(capturedTimings,agenticTimings);intermediateTimings&&onTurnComplete?.(intermediateTimings)}if(this._steeringMessages.has(conversationId)){console.log("[AgenticStore] Steering message detected after tool execution, exiti\ -ng agentic flow"),onFlowComplete?.(this.buildFinalTimings(capturedTimings,agenticTimings));return}turn++}}buildFinalTimings(capturedTimings,agenticTimings){return agenticTimings.toolCallsCount===0?capturedTimings:{predicted_n:capturedTimings?.predicted_n,predicted_ms:capturedTimings?.predicted_ms,prompt_n:capturedTimings?.prompt_n,prompt_ms:capturedTimings?.prompt_ms,cache_n:capturedTimings?.cache_n,agentic:agenticTimings}}normalizeToolCalls(toolCalls){return toolCalls?toolCalls.map((call,index2)=>({ -id:call?.id??`tool_${index2}`,type:call?.type??ToolCallType.FUNCTION,function:{name:call?.function?.name??"",arguments:call?.function?.arguments??""}})):[]}extractBase64Attachments(result){if(!result.trim())return{cleanedResult:result,attachments:[]};const lines=result.split(NEWLINE_SEPARATOR),attachments=[];let attachmentIndex=0;return{cleanedResult:lines.map(line=>{const trimmedLine=line.trim(),match=trimmedLine.match(DATA_URI_BASE64_REGEX);if(!match)return line;const mimeType=match[1].toLowerCase(); -if(!match[2])return line;attachmentIndex+=1;const name=this.buildAttachmentName(mimeType,attachmentIndex);return mimeType.startsWith(MimeTypePrefix.IMAGE)?(attachments.push({type:AttachmentType.IMAGE,name,base64Url:trimmedLine}),`[Attachment saved: ${name}]`):line}).join(NEWLINE_SEPARATOR),attachments}}buildAttachmentName(mimeType,index2){const extension2=IMAGE_MIME_TO_EXTENSION[mimeType]??DEFAULT_IMAGE_EXTENSION;return`${MCP_ATTACHMENT_NAME_PREFIX}-${Date.now()}-${index2}.${extension2}`}}const agenticStore=new AgenticStore; -function agenticPendingPermissionRequest(conversationId){return agenticStore.pendingPermissionRequest(conversationId)}function agenticResolvePermission(conversationId,decision){agenticStore.resolvePermission(conversationId,decision)}function agenticPendingContinueRequest(conversationId){return agenticStore.pendingContinueRequest(conversationId)}function agenticResolveContinue(conversationId,shouldContinue){agenticStore.resolveContinue(conversationId,shouldContinue)}function agenticInjectSteeringMessage(conversationId,content2,extras){ -agenticStore.injectSteeringMessage(conversationId,content2,extras)}function agenticPendingSteeringMessageContent(conversationId){return agenticStore.pendingSteeringMessageContent(conversationId)}function agenticPendingSteeringMessageExtras(conversationId){return agenticStore.pendingSteeringMessageExtras(conversationId)}function agenticClearSteeringMessage(conversationId){agenticStore.clearSteeringMessage(conversationId)}class ChatStore{#activeProcessingState=state$1(null);get activeProcessingState(){ -return get$3(this.#activeProcessingState)}set activeProcessingState(value){set$1(this.#activeProcessingState,value,!0)}#currentResponse=state$1("");get currentResponse(){return get$3(this.#currentResponse)}set currentResponse(value){set$1(this.#currentResponse,value,!0)}#errorDialogState=state$1(null);get errorDialogState(){return get$3(this.#errorDialogState)}set errorDialogState(value){set$1(this.#errorDialogState,value,!0)}#isLoading=state$1(!1);get isLoading(){return get$3(this.#isLoading)}set isLoading(value){ -set$1(this.#isLoading,value,!0)}chatLoadingStates=new SvelteMap;chatStreamingStates=new SvelteMap;abortControllers=new SvelteMap;preEncodeAbortController=null;processingStates=new SvelteMap;conversationStateTimestamps=new SvelteMap;#activeConversationId=state$1(null);get activeConversationId(){return get$3(this.#activeConversationId)}set activeConversationId(value){set$1(this.#activeConversationId,value,!0)}#isStreamingActive=state$1(!1);get isStreamingActive(){return get$3(this.#isStreamingActive)}set isStreamingActive(value){ -set$1(this.#isStreamingActive,value,!0)}#isEditModeActive=state$1(!1);get isEditModeActive(){return get$3(this.#isEditModeActive)}set isEditModeActive(value){set$1(this.#isEditModeActive,value,!0)}#addFilesHandler=state$1(null);get addFilesHandler(){return get$3(this.#addFilesHandler)}set addFilesHandler(value){set$1(this.#addFilesHandler,value,!0)}#pendingEditMessageId=state$1(null);get pendingEditMessageId(){return get$3(this.#pendingEditMessageId)}set pendingEditMessageId(value){set$1(this.#pendingEditMessageId, -value,!0)}messageUpdateCallback=null;#_pendingDraftMessage=state$1("");get _pendingDraftMessage(){return get$3(this.#_pendingDraftMessage)}set _pendingDraftMessage(value){set$1(this.#_pendingDraftMessage,value,!0)}#_pendingDraftFiles=state$1(proxy([]));get _pendingDraftFiles(){return get$3(this.#_pendingDraftFiles)}set _pendingDraftFiles(value){set$1(this.#_pendingDraftFiles,value,!0)}_pendingMessages=new SvelteMap;setChatLoading(convId,loading){this.touchConversationState(convId),loading?(this. -chatLoadingStates.set(convId,!0),convId===conversationsStore.activeConversation?.id&&(this.isLoading=!0)):(this.chatLoadingStates.delete(convId),convId===conversationsStore.activeConversation?.id&&(this.isLoading=!1))}setChatStreaming(convId,response,messageId){this.touchConversationState(convId),this.chatStreamingStates.set(convId,{response,messageId}),convId===conversationsStore.activeConversation?.id&&(this.currentResponse=response)}clearChatStreaming(convId){this.chatStreamingStates.delete(convId), -convId===conversationsStore.activeConversation?.id&&(this.currentResponse="")}getChatStreaming(convId){return this.chatStreamingStates.get(convId)}syncLoadingStateForChat(convId){this.isLoading=this.chatLoadingStates.get(convId)||!1;const s2=this.chatStreamingStates.get(convId);if(this.currentResponse=s2?.response||"",this.isStreamingActive=s2!==void 0,this.setActiveProcessingConversation(convId),s2?.response&&s2?.messageId){const idx=conversationsStore.findMessageIndex(s2.messageId);idx!==-1&&conversationsStore. -updateMessageAtIndex(idx,{content:s2.response})}}clearUIState(){this.isLoading=!1,this.currentResponse="",this.isStreamingActive=!1}setActiveProcessingConversation(conversationId){this.activeConversationId=conversationId,this.activeProcessingState=conversationId&&this.processingStates.get(conversationId)||null}getProcessingState(conversationId){return this.processingStates.get(conversationId)||null}setProcessingState(conversationId,state2){state2===null?this.processingStates.delete(conversationId): -this.processingStates.set(conversationId,state2),conversationId===this.activeConversationId&&(this.activeProcessingState=state2)}clearProcessingState(conversationId){this.processingStates.delete(conversationId),conversationId===this.activeConversationId&&(this.activeProcessingState=null)}getActiveProcessingState(){return this.activeProcessingState}getCurrentProcessingStateSync(){return this.activeProcessingState}setStreamingActive(active){this.isStreamingActive=active}isStreaming(){return this.isStreamingActive}getOrCreateAbortController(convId){ -let c2=this.abortControllers.get(convId);return(!c2||c2.signal.aborted)&&(c2=new AbortController,this.abortControllers.set(convId,c2)),c2}abortRequest(convId){if(convId){const c2=this.abortControllers.get(convId);c2&&(c2.abort(),this.abortControllers.delete(convId))}else{for(const c2 of this.abortControllers.values())c2.abort();this.abortControllers.clear()}}abortCurrentFlow(convId){const c2=this.abortControllers.get(convId);c2&&(c2.abort(),this.abortControllers.delete(convId))}showErrorDialog(state2){ -this.errorDialogState=state2}dismissErrorDialog(){this.errorDialogState=null}clearEditMode(){this.isEditModeActive=!1,this.addFilesHandler=null}isEditing(){return this.isEditModeActive}setEditModeActive(handler){this.isEditModeActive=!0,this.addFilesHandler=handler}getAddFilesHandler(){return this.addFilesHandler}clearPendingEditMessageId(){this.pendingEditMessageId=null}savePendingDraft(message,files){this._pendingDraftMessage=message,this._pendingDraftFiles=[...files]}consumePendingDraft(){if(!this. -_pendingDraftMessage&&this._pendingDraftFiles.length===0)return null;const d2={message:this._pendingDraftMessage,files:[...this._pendingDraftFiles]};return this._pendingDraftMessage="",this._pendingDraftFiles=[],d2}hasPendingDraft(){return!!this._pendingDraftMessage||this._pendingDraftFiles.length>0}getAllLoadingChats(){return Array.from(this.chatLoadingStates.keys())}getAllStreamingChats(){return Array.from(this.chatStreamingStates.keys())}getChatStreamingPublic(convId){return this.getChatStreaming( -convId)}isChatLoadingPublic(convId){return this.chatLoadingStates.get(convId)||!1}isChatLoadingInternal(convId){return this.chatStreamingStates.has(convId)}hasPendingMessage(convId){return this._pendingMessages.has(convId)}pendingMessageContent(convId){return this._pendingMessages.get(convId)?.content??null}pendingMessageExtras(convId){return this._pendingMessages.get(convId)?.extras}injectPendingMessage(convId,content2,extras){this._pendingMessages.set(convId,{content:content2,extras})}clearPendingMessage(convId){ -this._pendingMessages.delete(convId)}consumePendingMessage(convId){const msg=this._pendingMessages.get(convId);return msg?(this._pendingMessages.delete(convId),msg):null}touchConversationState(convId){this.conversationStateTimestamps.set(convId,{lastAccessed:Date.now()})}cleanupOldConversationStates(activeConversationIds){const now2=Date.now(),activeIdsList=activeConversationIds??[],preserveIds=this.activeConversationId?[...activeIdsList,this.activeConversationId]:activeIdsList,allConvIds=[...new Set( -[...this.chatLoadingStates.keys(),...this.chatStreamingStates.keys(),...this.abortControllers.keys(),...this.processingStates.keys(),...this.conversationStateTimestamps.keys()])],cleanupCandidates=[];for(const convId of allConvIds){if(preserveIds.includes(convId)||this.chatLoadingStates.get(convId)||this.chatStreamingStates.has(convId))continue;const ts=this.conversationStateTimestamps.get(convId);cleanupCandidates.push({convId,lastAccessed:ts?.lastAccessed??0})}cleanupCandidates.sort((a,b)=>a.lastAccessed- -b.lastAccessed);let cleanedUp=0;for(const{convId,lastAccessed}of cleanupCandidates)(cleanupCandidates.length-cleanedUp>MAX_INACTIVE_CONVERSATION_STATES||now2-lastAccessed>INACTIVE_CONVERSATION_STATE_MAX_AGE_MS)&&(this.cleanupConversationState(convId),cleanedUp++);return cleanedUp}cleanupConversationState(convId){const c2=this.abortControllers.get(convId);c2&&!c2.signal.aborted&&c2.abort(),this.chatLoadingStates.delete(convId),this.chatStreamingStates.delete(convId),this.abortControllers.delete(convId), -this.processingStates.delete(convId),this.conversationStateTimestamps.delete(convId)}getTrackedConversationCount(){return new Set([...this.chatLoadingStates.keys(),...this.chatStreamingStates.keys(),...this.abortControllers.keys(),...this.processingStates.keys()]).size}getMessageByIdWithRole(messageId,expectedRole){const index2=conversationsStore.findMessageIndex(messageId);if(index2===-1)return null;const message=conversationsStore.activeMessages[index2];return expectedRole&&message.role!==expectedRole? -null:{message,index:index2}}async addMessage(role,content2,type2=MessageType.TEXT,parent="-1",extras){const activeConv=conversationsStore.activeConversation;if(!activeConv)throw new Error("No active conversation");let parentId=null;if(parent==="-1"){const am=conversationsStore.activeMessages;if(am.length>0)parentId=am[am.length-1].id;else{const r2=(await conversationsStore.getConversationMessages(activeConv.id)).find(m=>m.parent===null&&m.type==="root");parentId=r2?r2.id:await DatabaseService.createRootMessage( -activeConv.id)}}else parentId=parent;const message=await DatabaseService.createMessageBranch({convId:activeConv.id,role,content:content2,type:type2,timestamp:Date.now(),toolCalls:"",children:[],extra:extras},parentId);return conversationsStore.addMessageToActive(message),await conversationsStore.updateCurrentNode(message.id),conversationsStore.updateConversationTimestamp(),message}async addSystemPrompt(){let activeConv=conversationsStore.activeConversation;if(activeConv||(await conversationsStore. -createConversation(),activeConv=conversationsStore.activeConversation),!!activeConv)try{const allMessages=await conversationsStore.getConversationMessages(activeConv.id),rootMessage=allMessages.find(m=>m.type==="root"&&m.parent===null),rootId=rootMessage?rootMessage.id:await DatabaseService.createRootMessage(activeConv.id),existingSystemMessage=allMessages.find(m=>m.role===MessageRole.SYSTEM&&m.parent===rootId);if(existingSystemMessage){this.pendingEditMessageId=existingSystemMessage.id,conversationsStore. -activeMessages.some(m=>m.id===existingSystemMessage.id)||conversationsStore.activeMessages.unshift(existingSystemMessage);return}const firstActiveMessage=conversationsStore.activeMessages.find(m=>m.parent===rootId),systemMessage=await DatabaseService.createSystemMessage(activeConv.id,SYSTEM_MESSAGE_PLACEHOLDER,rootId);if(firstActiveMessage){await DatabaseService.updateMessage(firstActiveMessage.id,{parent:systemMessage.id}),await DatabaseService.updateMessage(systemMessage.id,{children:[firstActiveMessage. -id]});const updatedRootChildren=rootMessage?rootMessage.children.filter(id2=>id2!==firstActiveMessage.id):[];await DatabaseService.updateMessage(rootId,{children:[...updatedRootChildren.filter(id2=>id2!==systemMessage.id),systemMessage.id]});const firstMsgIndex=conversationsStore.findMessageIndex(firstActiveMessage.id);firstMsgIndex!==-1&&conversationsStore.updateMessageAtIndex(firstMsgIndex,{parent:systemMessage.id})}conversationsStore.activeMessages.unshift(systemMessage),this.pendingEditMessageId= -systemMessage.id,conversationsStore.updateConversationTimestamp()}catch(error2){console.error("Failed to add system prompt:",error2)}}async removeSystemPromptPlaceholder(messageId){const activeConv=conversationsStore.activeConversation;if(!activeConv)return!1;try{const allMessages=await conversationsStore.getConversationMessages(activeConv.id),systemMessage=findMessageById(allMessages,messageId);if(!systemMessage||systemMessage.role!==MessageRole.SYSTEM)return!1;const rootMessage=allMessages.find( -m=>m.type==="root"&&m.parent===null);if(!rootMessage)return!1;if(allMessages.length===2&&systemMessage.children.length===0)return await conversationsStore.deleteConversation(activeConv.id),!0;for(const childId of systemMessage.children){await DatabaseService.updateMessage(childId,{parent:rootMessage.id});const childIndex=conversationsStore.findMessageIndex(childId);childIndex!==-1&&conversationsStore.updateMessageAtIndex(childIndex,{parent:rootMessage.id})}await DatabaseService.updateMessage(rootMessage. -id,{children:[...rootMessage.children.filter(id2=>id2!==messageId),...systemMessage.children]}),await DatabaseService.deleteMessage(messageId);const systemIndex=conversationsStore.findMessageIndex(messageId);return systemIndex!==-1&&conversationsStore.activeMessages.splice(systemIndex,1),conversationsStore.updateConversationTimestamp(),!1}catch(error2){return console.error("Failed to remove system prompt placeholder:",error2),!1}}async createAssistantMessage(parentId){const activeConv=conversationsStore. -activeConversation;if(!activeConv)throw new Error("No active conversation");return await DatabaseService.createMessageBranch({convId:activeConv.id,type:MessageType.TEXT,role:MessageRole.ASSISTANT,content:"",timestamp:Date.now(),toolCalls:"",children:[],model:null},parentId||null)}async sendMessage(content2,extras){if(!content2.trim()&&(!extras||extras.length===0))return;const activeConv=conversationsStore.activeConversation;if(activeConv&&agenticStore.isRunning(activeConv.id)){agenticStore.injectSteeringMessage( -activeConv.id,content2,extras);return}if(activeConv&&this.isChatLoadingInternal(activeConv.id)){this.injectPendingMessage(activeConv.id,content2,extras);return}this.cancelPreEncode();const resourceExtras=mcpStore.consumeResourceAttachmentsAsExtras(),allExtras=resourceExtras.length>0?[...extras||[],...resourceExtras]:extras;let isNewConversation=!1;activeConv||(await conversationsStore.createConversation(),isNewConversation=!0);const currentConv=conversationsStore.activeConversation;if(currentConv){ -this.showErrorDialog(null),this.setChatLoading(currentConv.id,!0),this.clearChatStreaming(currentConv.id);try{let parentIdForUserMessage;if(isNewConversation){const rootId=await DatabaseService.createRootMessage(currentConv.id),systemPrompt=config$1().systemMessage?.toString().trim();if(systemPrompt){const systemMessage=await DatabaseService.createSystemMessage(currentConv.id,systemPrompt,rootId);conversationsStore.addMessageToActive(systemMessage),parentIdForUserMessage=systemMessage.id}else parentIdForUserMessage= -rootId}const userMessage=await this.addMessage(MessageRole.USER,content2,MessageType.TEXT,parentIdForUserMessage??"-1",allExtras);isNewConversation&&content2&&await conversationsStore.updateConversationName(currentConv.id,generateConversationTitle(content2,!!config$1().titleGenerationUseFirstLine));const assistantMessage=await this.createAssistantMessage(userMessage.id);conversationsStore.addMessageToActive(assistantMessage),await this.streamChatCompletion(conversationsStore.activeMessages.slice( -0,-1),assistantMessage)}catch(error2){if(isAbortError(error2)){this.setChatLoading(currentConv.id,!1);return}console.error("Failed to send message:",error2),this.setChatLoading(currentConv.id,!1);const dialogType=error2 instanceof Error&&error2.name==="TimeoutError"?ErrorDialogType.TIMEOUT:ErrorDialogType.SERVER,contextInfo=error2.contextInfo;this.showErrorDialog({type:dialogType,message:error2 instanceof Error?error2.message:"Unknown error",contextInfo})}}}async streamChatCompletion(allMessages,assistantMessage,onComplete,onError,modelOverride){ -let effectiveModel=modelOverride;if(isRouterMode()&&!effectiveModel){const conversationModel=this.getConversationModel(allMessages);effectiveModel=selectedModelName()||conversationModel}isRouterMode()&&effectiveModel&&(modelsStore.getModelProps(effectiveModel)||await modelsStore.fetchModelProps(effectiveModel));let currentMessageId=assistantMessage.id,streamedContent="",streamedReasoningContent="",resolvedModel=null,modelPersisted=!1;const convId=assistantMessage.convId,recordModel=(modelName,persistImmediately=!0)=>{ -if(!modelName)return;const n=normalizeModelName(modelName);if(!n||n===resolvedModel)return;resolvedModel=n;const idx=conversationsStore.findMessageIndex(currentMessageId);conversationsStore.updateMessageAtIndex(idx,{model:n}),persistImmediately&&!modelPersisted&&(modelPersisted=!0,DatabaseService.updateMessage(currentMessageId,{model:n}).catch(()=>{modelPersisted=!1,resolvedModel=null}))},updateStreamingUI=()=>{this.setChatStreaming(convId,streamedContent,currentMessageId);const idx=conversationsStore. -findMessageIndex(currentMessageId);conversationsStore.updateMessageAtIndex(idx,{content:streamedContent})},cleanupStreamingState=()=>{this.setStreamingActive(!1),this.setChatLoading(convId,!1),this.clearChatStreaming(convId),this.setProcessingState(convId,null)};this.setStreamingActive(!0),this.setActiveProcessingConversation(convId);const abortController=this.getOrCreateAbortController(convId),streamCallbacks={onChunk:chunk=>{streamedContent+=chunk,updateStreamingUI()},onReasoningChunk:chunk=>{ -streamedReasoningContent+=chunk;const idx=conversationsStore.findMessageIndex(currentMessageId);conversationsStore.updateMessageAtIndex(idx,{reasoningContent:streamedReasoningContent})},onToolCallsStreaming:toolCalls=>{const idx=conversationsStore.findMessageIndex(currentMessageId);conversationsStore.updateMessageAtIndex(idx,{toolCalls:JSON.stringify(toolCalls)})},onAttachments:(messageId,extras)=>{if(!extras.length)return;const idx=conversationsStore.findMessageIndex(messageId);if(idx===-1)return; -const updatedExtras=[...conversationsStore.activeMessages[idx].extra||[],...extras];conversationsStore.updateMessageAtIndex(idx,{extra:updatedExtras}),DatabaseService.updateMessage(messageId,{extra:updatedExtras}).catch(console.error)},onModel:modelName=>recordModel(modelName),onTurnComplete:intermediateTimings=>{const idx=conversationsStore.findMessageIndex(assistantMessage.id);conversationsStore.updateMessageAtIndex(idx,{timings:intermediateTimings})},onTimings:(timings,promptProgress)=>{const tokensPerSecond=timings?. -predicted_ms&&timings?.predicted_n?timings.predicted_n/timings.predicted_ms*1e3:0;this.updateProcessingStateFromTimings({prompt_n:timings?.prompt_n||0,prompt_ms:timings?.prompt_ms,predicted_n:timings?.predicted_n||0,predicted_per_second:tokensPerSecond,cache_n:timings?.cache_n||0,prompt_progress:promptProgress},convId)},onAssistantTurnComplete:async(content2,reasoningContent,timings,toolCalls)=>{const updateData={content:content2,reasoningContent:reasoningContent||void 0,toolCalls:toolCalls?JSON. -stringify(toolCalls):"",timings};resolvedModel&&!modelPersisted&&(updateData.model=resolvedModel),await DatabaseService.updateMessage(currentMessageId,updateData);const idx=conversationsStore.findMessageIndex(currentMessageId),uiUpdate={content:content2,reasoningContent:reasoningContent||void 0,toolCalls:toolCalls?JSON.stringify(toolCalls):""};timings&&(uiUpdate.timings=timings),resolvedModel&&(uiUpdate.model=resolvedModel),conversationsStore.updateMessageAtIndex(idx,uiUpdate),await conversationsStore. -updateCurrentNode(currentMessageId)},createToolResultMessage:async(toolCallId,content2,extras)=>{const msg=await DatabaseService.createMessageBranch({convId,type:MessageType.TEXT,role:MessageRole.TOOL,content:content2,toolCallId,timestamp:Date.now(),toolCalls:"",children:[],extra:extras},currentMessageId);return conversationsStore.addMessageToActive(msg),await conversationsStore.updateCurrentNode(msg.id),msg},createAssistantMessage:async()=>{streamedContent="",streamedReasoningContent="";const lastMsg=conversationsStore. -activeMessages[conversationsStore.activeMessages.length-1],msg=await DatabaseService.createMessageBranch({convId,type:MessageType.TEXT,role:MessageRole.ASSISTANT,content:"",timestamp:Date.now(),toolCalls:"",children:[],model:resolvedModel},lastMsg.id);return conversationsStore.addMessageToActive(msg),currentMessageId=msg.id,msg},onFlowComplete:finalTimings=>{if(finalTimings){const idx=conversationsStore.findMessageIndex(assistantMessage.id);conversationsStore.updateMessageAtIndex(idx,{timings:finalTimings}), -DatabaseService.updateMessage(assistantMessage.id,{timings:finalTimings}).catch(console.error)}cleanupStreamingState(),onComplete&&onComplete(streamedContent),isRouterMode()&&modelsStore.fetchRouterModels().catch(console.error),config$1().preEncodeConversation&&this.triggerPreEncode(allMessages,assistantMessage,streamedContent,effectiveModel,!!config$1().excludeReasoningFromContext)},onError:error2=>{if(this.setStreamingActive(!1),isAbortError(error2)){cleanupStreamingState();const pending=this. -consumePendingMessage(convId);pending&&this.sendMessage(pending.content,pending.extras);return}console.error("Streaming error:",error2),cleanupStreamingState(),this.clearPendingMessage(convId);const idx=conversationsStore.findMessageIndex(assistantMessage.id);if(idx!==-1){const failedMessage=conversationsStore.removeMessageAtIndex(idx);failedMessage&&DatabaseService.deleteMessage(failedMessage.id).catch(console.error)}const contextInfo=error2.contextInfo;this.showErrorDialog({type:error2.name=== -"TimeoutError"?ErrorDialogType.TIMEOUT:ErrorDialogType.SERVER,message:error2.message,contextInfo}),onError&&onError(error2)}},perChatOverrides=conversationsStore.activeConversation?.mcpServerOverrides;if((await agenticStore.runAgenticFlow({conversationId:convId,messages:allMessages,options:{...this.getApiOptions(),...effectiveModel?{model:effectiveModel}:{}},callbacks:streamCallbacks,signal:abortController.signal,perChatOverrides})).handled){const pending=agenticStore.consumePendingSteeringMessage( -convId);pending&&await this.sendMessage(pending.content,pending.extras);return}await ChatService.sendMessage(allMessages,{...this.getApiOptions(),...effectiveModel?{model:effectiveModel}:{},stream:!0,onChunk:streamCallbacks.onChunk,onReasoningChunk:streamCallbacks.onReasoningChunk,onModel:streamCallbacks.onModel,onTimings:streamCallbacks.onTimings,onComplete:async(finalContent,reasoningContent,timings,toolCalls)=>{const content2=streamedContent||finalContent||"",reasoning=streamedReasoningContent|| -reasoningContent,updateData={content:content2,reasoningContent:reasoning||void 0,toolCalls:toolCalls||"",timings};resolvedModel&&!modelPersisted&&(updateData.model=resolvedModel),await DatabaseService.updateMessage(currentMessageId,updateData);const idx=conversationsStore.findMessageIndex(currentMessageId),uiUpdate={content:content2,reasoningContent:reasoning||void 0,toolCalls:toolCalls||""};timings&&(uiUpdate.timings=timings),resolvedModel&&(uiUpdate.model=resolvedModel),conversationsStore.updateMessageAtIndex( -idx,uiUpdate),await conversationsStore.updateCurrentNode(currentMessageId),cleanupStreamingState(),onComplete&&await onComplete(content2),isRouterMode()&&modelsStore.fetchRouterModels().catch(console.error);const pending=this.consumePendingMessage(convId);pending&&await this.sendMessage(pending.content,pending.extras)},onError:streamCallbacks.onError},convId,abortController.signal)}async stopGeneration(){const activeConv=conversationsStore.activeConversation;activeConv&&await this.stopGenerationForChat( -activeConv.id)}async stopGenerationForChat(convId){await this.savePartialResponseIfNeeded(convId),this.setStreamingActive(!1),this.abortRequest(convId),this.setChatLoading(convId,!1),this.clearChatStreaming(convId),this.setProcessingState(convId,null),this.clearPendingMessage(convId)}async savePartialResponseIfNeeded(convId){const conversationId=convId||conversationsStore.activeConversation?.id;if(!conversationId)return;const streamingState=this.getChatStreaming(conversationId);if(!streamingState|| -!streamingState.response.trim())return;const messages=conversationId===conversationsStore.activeConversation?.id?conversationsStore.activeMessages:await conversationsStore.getConversationMessages(conversationId);if(!messages.length)return;const lastMessage=messages[messages.length-1];if(lastMessage?.role===MessageRole.ASSISTANT)try{const updateData={content:streamingState.response},lastKnownState=this.getProcessingState(conversationId);lastKnownState&&(updateData.timings={prompt_n:lastKnownState. -promptTokens||0,prompt_ms:lastKnownState.promptMs,predicted_n:lastKnownState.tokensDecoded||0,cache_n:lastKnownState.cacheTokens||0,predicted_ms:lastKnownState.tokensPerSecond&&lastKnownState.tokensDecoded?lastKnownState.tokensDecoded/lastKnownState.tokensPerSecond*1e3:void 0}),await DatabaseService.updateMessage(lastMessage.id,updateData),lastMessage.content=streamingState.response,updateData.timings&&(lastMessage.timings=updateData.timings)}catch(error2){lastMessage.content=streamingState.response, -console.error("Failed to save partial response:",error2)}}async updateMessage(messageId,newContent){const activeConv=conversationsStore.activeConversation;if(!activeConv)return;this.isChatLoadingInternal(activeConv.id)&&await this.stopGeneration();const result=this.getMessageByIdWithRole(messageId,MessageRole.USER);if(!result)return;const{message:messageToUpdate,index:messageIndex}=result,originalContent=messageToUpdate.content;try{const rootMessage=(await conversationsStore.getConversationMessages( -activeConv.id)).find(m=>m.type==="root"&&m.parent===null),isFirstUserMessage=rootMessage&&messageToUpdate.parent===rootMessage.id;conversationsStore.updateMessageAtIndex(messageIndex,{content:newContent}),await DatabaseService.updateMessage(messageId,{content:newContent}),isFirstUserMessage&&newContent.trim()&&await conversationsStore.updateConversationTitleWithConfirmation(activeConv.id,generateConversationTitle(newContent,!!config$1().titleGenerationUseFirstLine));const messagesToRemove=conversationsStore. -activeMessages.slice(messageIndex+1);for(const message of messagesToRemove)await DatabaseService.deleteMessage(message.id);conversationsStore.sliceActiveMessages(messageIndex+1),conversationsStore.updateConversationTimestamp(),this.setChatLoading(activeConv.id,!0),this.clearChatStreaming(activeConv.id);const assistantMessage=await this.createAssistantMessage();conversationsStore.addMessageToActive(assistantMessage),await conversationsStore.updateCurrentNode(assistantMessage.id),await this.streamChatCompletion( -conversationsStore.activeMessages.slice(0,-1),assistantMessage,void 0,()=>{conversationsStore.updateMessageAtIndex(conversationsStore.findMessageIndex(messageId),{content:originalContent})})}catch(error2){isAbortError(error2)||console.error("Failed to update message:",error2)}}async regenerateMessage(messageId){const activeConv=conversationsStore.activeConversation;if(!activeConv||this.isChatLoadingInternal(activeConv.id))return;this.cancelPreEncode();const result=this.getMessageByIdWithRole(messageId, -MessageRole.ASSISTANT);if(!result)return;const{index:messageIndex}=result;try{const messagesToRemove=conversationsStore.activeMessages.slice(messageIndex);for(const message of messagesToRemove)await DatabaseService.deleteMessage(message.id);conversationsStore.sliceActiveMessages(messageIndex),conversationsStore.updateConversationTimestamp(),this.setChatLoading(activeConv.id,!0),this.clearChatStreaming(activeConv.id);const parentMessageId=conversationsStore.activeMessages.length>0?conversationsStore. -activeMessages[conversationsStore.activeMessages.length-1].id:void 0,assistantMessage=await this.createAssistantMessage(parentMessageId);conversationsStore.addMessageToActive(assistantMessage),await this.streamChatCompletion(conversationsStore.activeMessages.slice(0,-1),assistantMessage)}catch(error2){isAbortError(error2)||console.error("Failed to regenerate message:",error2),this.setChatLoading(activeConv?.id||"",!1)}}async regenerateMessageWithBranching(messageId,modelOverride){const activeConv=conversationsStore. -activeConversation;if(!(!activeConv||this.isChatLoadingInternal(activeConv.id))){this.cancelPreEncode();try{const idx=conversationsStore.findMessageIndex(messageId);if(idx===-1)return;const msg=conversationsStore.activeMessages[idx];if(msg.role!==MessageRole.ASSISTANT)return;const allMessages=await conversationsStore.getConversationMessages(activeConv.id),parentMessage=findMessageById(allMessages,msg.parent);if(!parentMessage)return;this.setChatLoading(activeConv.id,!0),this.clearChatStreaming(activeConv. -id);const newAssistantMessage=await DatabaseService.createMessageBranch({convId:msg.convId,type:msg.type,timestamp:Date.now(),role:msg.role,content:"",toolCalls:"",children:[],model:null},parentMessage.id);await conversationsStore.updateCurrentNode(newAssistantMessage.id),conversationsStore.updateConversationTimestamp(),await conversationsStore.refreshActiveMessages();const conversationPath=filterByLeafNodeId(allMessages,parentMessage.id,!1),modelToUse=modelOverride||msg.model||void 0;await this. -streamChatCompletion(conversationPath,newAssistantMessage,void 0,void 0,modelToUse)}catch(error2){isAbortError(error2)||console.error("Failed to regenerate message with branching:",error2),this.setChatLoading(activeConv?.id||"",!1)}}}async getDeletionInfo(messageId){const activeConv=conversationsStore.activeConversation;if(!activeConv)return{totalCount:0,userMessages:0,assistantMessages:0,messageTypes:[]};const allMessages=await conversationsStore.getConversationMessages(activeConv.id);if(findMessageById( -allMessages,messageId)?.role===MessageRole.SYSTEM){const messagesToDelete2=allMessages.filter(m=>m.id===messageId);let userMessages2=0,assistantMessages2=0;const messageTypes2=[];for(const msg of messagesToDelete2)msg.role===MessageRole.USER?(userMessages2++,messageTypes2.includes("user message")||messageTypes2.push("user message")):msg.role===MessageRole.ASSISTANT&&(assistantMessages2++,messageTypes2.includes("assistant response")||messageTypes2.push("assistant response"));return{totalCount:1,userMessages:userMessages2, -assistantMessages:assistantMessages2,messageTypes:messageTypes2}}const descendants=findDescendantMessages(allMessages,messageId),allToDelete=[messageId,...descendants],messagesToDelete=allMessages.filter(m=>allToDelete.includes(m.id));let userMessages=0,assistantMessages=0;const messageTypes=[];for(const msg of messagesToDelete)msg.role===MessageRole.USER?(userMessages++,messageTypes.includes("user message")||messageTypes.push("user message")):msg.role===MessageRole.ASSISTANT&&(assistantMessages++, -messageTypes.includes("assistant response")||messageTypes.push("assistant response"));return{totalCount:allToDelete.length,userMessages,assistantMessages,messageTypes}}async deleteMessage(messageId){const activeConv=conversationsStore.activeConversation;if(activeConv)try{const allMessages=await conversationsStore.getConversationMessages(activeConv.id),messageToDelete=findMessageById(allMessages,messageId);if(!messageToDelete)return;if(filterByLeafNodeId(allMessages,activeConv.currNode||"",!1).some( -m=>m.id===messageId)&&messageToDelete.parent){const siblings2=allMessages.filter(m=>m.parent===messageToDelete.parent&&m.id!==messageId);if(siblings2.length>0){const latestSibling=siblings2.reduce((latest,sibling2)=>sibling2.timestamp>latest.timestamp?sibling2:latest);await conversationsStore.updateCurrentNode(findLeafNode(allMessages,latestSibling.id))}else messageToDelete.parent&&await conversationsStore.updateCurrentNode(findLeafNode(allMessages,messageToDelete.parent))}await DatabaseService. -deleteMessageCascading(activeConv.id,messageId),await conversationsStore.refreshActiveMessages(),conversationsStore.updateConversationTimestamp()}catch(error2){console.error("Failed to delete message:",error2)}}async continueAssistantMessage(messageId){const activeConv=conversationsStore.activeConversation;if(!activeConv||this.isChatLoadingInternal(activeConv.id))return;const result=this.getMessageByIdWithRole(messageId,MessageRole.ASSISTANT);if(!result)return;const{message:msg,index:idx}=result; -try{this.showErrorDialog(null),this.setChatLoading(activeConv.id,!0),this.clearChatStreaming(activeConv.id);const allMessages=await conversationsStore.getConversationMessages(activeConv.id),dbMessage=findMessageById(allMessages,messageId);if(!dbMessage){this.setChatLoading(activeConv.id,!1);return}const originalContent=dbMessage.content,originalReasoning=dbMessage.reasoningContent||"",contextWithContinue=[...conversationsStore.activeMessages.slice(0,idx),{role:MessageRole.ASSISTANT,content:originalContent}]; -let appendedContent="",appendedReasoning="",hasReceivedContent=!1;const updateStreamingContent=fullContent=>{this.setChatStreaming(msg.convId,fullContent,msg.id),conversationsStore.updateMessageAtIndex(idx,{content:fullContent})},abortController=this.getOrCreateAbortController(msg.convId);await ChatService.sendMessage(contextWithContinue,{...this.getApiOptions(),onChunk:chunk=>{appendedContent+=chunk,hasReceivedContent=!0,updateStreamingContent(originalContent+appendedContent)},onReasoningChunk:chunk=>{ -appendedReasoning+=chunk,hasReceivedContent=!0,conversationsStore.updateMessageAtIndex(idx,{reasoningContent:originalReasoning+appendedReasoning})},onTimings:(timings,promptProgress)=>{const tokensPerSecond=timings?.predicted_ms&&timings?.predicted_n?timings.predicted_n/timings.predicted_ms*1e3:0;this.updateProcessingStateFromTimings({prompt_n:timings?.prompt_n||0,prompt_ms:timings?.prompt_ms,predicted_n:timings?.predicted_n||0,predicted_per_second:tokensPerSecond,cache_n:timings?.cache_n||0,prompt_progress:promptProgress}, -msg.convId)},onComplete:async(finalContent,reasoningContent,timings)=>{const finalAppendedContent=hasReceivedContent?appendedContent:finalContent||"",finalAppendedReasoning=hasReceivedContent?appendedReasoning:reasoningContent||"",fullContent=originalContent+finalAppendedContent,fullReasoning=originalReasoning+finalAppendedReasoning||void 0;await DatabaseService.updateMessage(msg.id,{content:fullContent,reasoningContent:fullReasoning,timestamp:Date.now(),timings}),conversationsStore.updateMessageAtIndex( -idx,{content:fullContent,reasoningContent:fullReasoning,timestamp:Date.now(),timings}),conversationsStore.updateConversationTimestamp(),this.setChatLoading(msg.convId,!1),this.clearChatStreaming(msg.convId),this.setProcessingState(msg.convId,null)},onError:async error2=>{if(isAbortError(error2)){hasReceivedContent&&appendedContent&&(await DatabaseService.updateMessage(msg.id,{content:originalContent+appendedContent,reasoningContent:originalReasoning+appendedReasoning||void 0,timestamp:Date.now()}), -conversationsStore.updateMessageAtIndex(idx,{content:originalContent+appendedContent,reasoningContent:originalReasoning+appendedReasoning||void 0,timestamp:Date.now()})),this.setChatLoading(msg.convId,!1),this.clearChatStreaming(msg.convId),this.setProcessingState(msg.convId,null);return}console.error("Continue generation error:",error2),conversationsStore.updateMessageAtIndex(idx,{content:originalContent}),await DatabaseService.updateMessage(msg.id,{content:originalContent}),this.setChatLoading( -msg.convId,!1),this.clearChatStreaming(msg.convId),this.setProcessingState(msg.convId,null),this.showErrorDialog({type:error2.name==="TimeoutError"?ErrorDialogType.TIMEOUT:ErrorDialogType.SERVER,message:error2.message})}},msg.convId,abortController.signal)}catch(error2){isAbortError(error2)||console.error("Failed to continue message:",error2),activeConv&&this.setChatLoading(activeConv.id,!1)}}async editAssistantMessage(messageId,newContent,shouldBranch){const activeConv=conversationsStore.activeConversation; -if(!activeConv||this.isChatLoadingInternal(activeConv.id))return;const result=this.getMessageByIdWithRole(messageId,MessageRole.ASSISTANT);if(!result)return;const{message:msg,index:idx}=result;try{if(shouldBranch){const newMessage=await DatabaseService.createMessageBranch({convId:msg.convId,type:msg.type,timestamp:Date.now(),role:msg.role,content:newContent,toolCalls:msg.toolCalls||"",children:[],model:msg.model},msg.parent);await conversationsStore.updateCurrentNode(newMessage.id)}else await DatabaseService. -updateMessage(msg.id,{content:newContent}),conversationsStore.updateMessageAtIndex(idx,{content:newContent});conversationsStore.updateConversationTimestamp(),await conversationsStore.refreshActiveMessages()}catch(error2){console.error("Failed to edit assistant message:",error2)}}async editUserMessagePreserveResponses(messageId,newContent,newExtras){const activeConv=conversationsStore.activeConversation;if(!activeConv)return;const result=this.getMessageByIdWithRole(messageId,MessageRole.USER);if(!result) -return;const{message:msg,index:idx}=result;try{const updateData={content:newContent};newExtras!==void 0&&(updateData.extra=JSON.parse(JSON.stringify(newExtras))),await DatabaseService.updateMessage(messageId,updateData),conversationsStore.updateMessageAtIndex(idx,updateData);const rootMessage=(await conversationsStore.getConversationMessages(activeConv.id)).find(m=>m.type==="root"&&m.parent===null);rootMessage&&msg.parent===rootMessage.id&&newContent.trim()&&await conversationsStore.updateConversationTitleWithConfirmation( -activeConv.id,generateConversationTitle(newContent,!!config$1().titleGenerationUseFirstLine)),conversationsStore.updateConversationTimestamp()}catch(error2){console.error("Failed to edit user message:",error2)}}async editMessageWithBranching(messageId,newContent,newExtras){const activeConv=conversationsStore.activeConversation;if(!activeConv||this.isChatLoadingInternal(activeConv.id))return;let result=this.getMessageByIdWithRole(messageId,MessageRole.USER);if(result||(result=this.getMessageByIdWithRole( -messageId,MessageRole.SYSTEM)),!result)return;const{message:msg,index:idx}=result;try{const allMessages=await conversationsStore.getConversationMessages(activeConv.id),rootMessage=allMessages.find(m=>m.type==="root"&&m.parent===null),isFirstUserMessage=msg.role===MessageRole.USER&&rootMessage&&msg.parent===rootMessage.id,extrasToUse=newExtras!==void 0?JSON.parse(JSON.stringify(newExtras)):msg.extra?JSON.parse(JSON.stringify(msg.extra)):void 0;let messageIdForResponse;const dbMsg=findMessageById( -allMessages,msg.id);if(dbMsg?dbMsg.children.length>0:msg.children.length>0){const parentId=msg.parent||rootMessage?.id;if(!parentId)return;const newMessage=await DatabaseService.createMessageBranch({convId:msg.convId,type:msg.type,timestamp:Date.now(),role:msg.role,content:newContent,toolCalls:msg.toolCalls||"",children:[],extra:extrasToUse,model:msg.model},parentId);await conversationsStore.updateCurrentNode(newMessage.id),messageIdForResponse=newMessage.id}else{const updates={content:newContent, -timestamp:Date.now(),extra:extrasToUse};await DatabaseService.updateMessage(msg.id,updates),conversationsStore.updateMessageAtIndex(idx,updates),messageIdForResponse=msg.id}conversationsStore.updateConversationTimestamp(),isFirstUserMessage&&newContent.trim()&&await conversationsStore.updateConversationTitleWithConfirmation(activeConv.id,generateConversationTitle(newContent,!!config$1().titleGenerationUseFirstLine)),await conversationsStore.refreshActiveMessages(),msg.role===MessageRole.USER&&await this. -generateResponseForMessage(messageIdForResponse)}catch(error2){console.error("Failed to edit message with branching:",error2)}}async generateResponseForMessage(userMessageId){const activeConv=conversationsStore.activeConversation;if(activeConv){this.showErrorDialog(null),this.setChatLoading(activeConv.id,!0),this.clearChatStreaming(activeConv.id);try{const allMessages=await conversationsStore.getConversationMessages(activeConv.id),conversationPath=filterByLeafNodeId(allMessages,userMessageId,!1), -assistantMessage=await DatabaseService.createMessageBranch({convId:activeConv.id,type:MessageType.TEXT,timestamp:Date.now(),role:MessageRole.ASSISTANT,content:"",toolCalls:"",children:[],model:null},userMessageId);conversationsStore.addMessageToActive(assistantMessage),await this.streamChatCompletion(conversationPath,assistantMessage)}catch(error2){console.error("Failed to generate response:",error2),this.setChatLoading(activeConv.id,!1)}}}getContextTotal(){const activeConvId=this.activeConversationId, -activeState=activeConvId?this.getProcessingState(activeConvId):null;if(activeState&&typeof activeState.contextTotal=="number"&&activeState.contextTotal>0)return activeState.contextTotal;if(isRouterMode()){const modelContextSize=selectedModelContextSize();if(typeof modelContextSize=="number"&&modelContextSize>0)return modelContextSize}else{const propsContextSize=contextSize();if(typeof propsContextSize=="number"&&propsContextSize>0)return propsContextSize}return null}updateProcessingStateFromTimings(timingData,conversationId){ -const processingState=this.parseTimingData(timingData);if(processingState===null){console.warn("Failed to parse timing data - skipping update");return}const targetId=conversationId||this.activeConversationId;targetId&&this.setProcessingState(targetId,processingState)}parseTimingData(timingData){const promptTokens=timingData.prompt_n||0,promptMs=timingData.prompt_ms||void 0,predictedTokens=timingData.predicted_n||0,tokensPerSecond=timingData.predicted_per_second||0,cacheTokens=timingData.cache_n|| -0,promptProgress=timingData.prompt_progress,contextTotal=this.getContextTotal(),currentConfig=config$1(),outputTokensMax=currentConfig.max_tokens||-1,contextUsed=promptTokens+cacheTokens+predictedTokens,outputTokensUsed=predictedTokens,progressCache=promptProgress?.cache||0,progressActualDone=(promptProgress?.processed??0)-progressCache,progressActualTotal=(promptProgress?.total??0)-progressCache,progressPercent=promptProgress?Math.round(progressActualDone/progressActualTotal*100):void 0;return{ -status:predictedTokens>0?"generating":promptProgress?"preparing":"idle",tokensDecoded:predictedTokens,tokensRemaining:outputTokensMax-predictedTokens,contextUsed,contextTotal,outputTokensUsed,outputTokensMax,hasNextToken:predictedTokens>0,tokensPerSecond,temperature:currentConfig.temperature??.8,topP:currentConfig.top_p??.95,speculative:!1,progressPercent,promptProgress,promptTokens,promptMs,cacheTokens}}restoreProcessingStateFromMessages(messages,conversationId){for(let i=messages.length-1;i>=0;i--){ -const message=messages[i];if(message.role===MessageRole.ASSISTANT&&message.timings){const restoredState=this.parseTimingData({prompt_n:message.timings.prompt_n||0,prompt_ms:message.timings.prompt_ms,predicted_n:message.timings.predicted_n||0,predicted_per_second:message.timings.predicted_n&&message.timings.predicted_ms?message.timings.predicted_n/message.timings.predicted_ms*1e3:0,cache_n:message.timings.cache_n||0});if(restoredState){this.setProcessingState(conversationId,restoredState);return}}}}getConversationModel(messages){ -for(let i=messages.length-1;i>=0;i--){const message=messages[i];if(message.role===MessageRole.ASSISTANT&&message.model)return message.model}return null}getApiOptions(){const currentConfig=config$1(),hasValue=value=>value!=null&&value!=="",apiOptions={stream:!0,timings_per_token:!0};if(isRouterMode()){const modelName=selectedModelName();modelName&&(apiOptions.model=modelName)}return currentConfig.systemMessage&&(apiOptions.systemMessage=currentConfig.systemMessage),currentConfig.disableReasoningParsing&& -(apiOptions.disableReasoningParsing=!0),currentConfig.excludeReasoningFromContext&&(apiOptions.excludeReasoningFromContext=!0),hasValue(currentConfig.temperature)&&(apiOptions.temperature=Number(currentConfig.temperature)),hasValue(currentConfig.max_tokens)&&(apiOptions.max_tokens=Number(currentConfig.max_tokens)),hasValue(currentConfig.dynatemp_range)&&(apiOptions.dynatemp_range=Number(currentConfig.dynatemp_range)),hasValue(currentConfig.dynatemp_exponent)&&(apiOptions.dynatemp_exponent=Number( -currentConfig.dynatemp_exponent)),hasValue(currentConfig.top_k)&&(apiOptions.top_k=Number(currentConfig.top_k)),hasValue(currentConfig.top_p)&&(apiOptions.top_p=Number(currentConfig.top_p)),hasValue(currentConfig.min_p)&&(apiOptions.min_p=Number(currentConfig.min_p)),hasValue(currentConfig.xtc_probability)&&(apiOptions.xtc_probability=Number(currentConfig.xtc_probability)),hasValue(currentConfig.xtc_threshold)&&(apiOptions.xtc_threshold=Number(currentConfig.xtc_threshold)),hasValue(currentConfig. -typ_p)&&(apiOptions.typ_p=Number(currentConfig.typ_p)),hasValue(currentConfig.repeat_last_n)&&(apiOptions.repeat_last_n=Number(currentConfig.repeat_last_n)),hasValue(currentConfig.repeat_penalty)&&(apiOptions.repeat_penalty=Number(currentConfig.repeat_penalty)),hasValue(currentConfig.presence_penalty)&&(apiOptions.presence_penalty=Number(currentConfig.presence_penalty)),hasValue(currentConfig.frequency_penalty)&&(apiOptions.frequency_penalty=Number(currentConfig.frequency_penalty)),hasValue(currentConfig. -dry_multiplier)&&(apiOptions.dry_multiplier=Number(currentConfig.dry_multiplier)),hasValue(currentConfig.dry_base)&&(apiOptions.dry_base=Number(currentConfig.dry_base)),hasValue(currentConfig.dry_allowed_length)&&(apiOptions.dry_allowed_length=Number(currentConfig.dry_allowed_length)),hasValue(currentConfig.dry_penalty_last_n)&&(apiOptions.dry_penalty_last_n=Number(currentConfig.dry_penalty_last_n)),currentConfig.samplers&&(apiOptions.samplers=currentConfig.samplers),apiOptions.backend_sampling= -currentConfig.backend_sampling,currentConfig.custom&&(apiOptions.custom=currentConfig.custom),apiOptions}cancelPreEncode(){this.preEncodeAbortController&&(this.preEncodeAbortController.abort(),this.preEncodeAbortController=null)}async triggerPreEncode(allMessages,assistantMessage,assistantContent,model,excludeReasoning){this.cancelPreEncode(),this.preEncodeAbortController=new AbortController;const signal=this.preEncodeAbortController.signal;try{if(!await ChatService.areAllSlotsIdle(model,signal)|| -signal.aborted)return;const messagesWithAssistant=[...allMessages,{...assistantMessage,content:assistantContent}];await ChatService.preEncode(messagesWithAssistant,model,excludeReasoning,signal)}catch(err){isAbortError(err)||console.warn("[ChatStore] Pre-encode failed:",err)}}}const chatStore=new ChatStore,activeProcessingState=()=>chatStore.activeProcessingState,errorDialog=()=>chatStore.errorDialogState,getAddFilesHandler=()=>chatStore.getAddFilesHandler(),getAllLoadingChats=()=>chatStore.getAllLoadingChats(), -isChatStreaming=()=>chatStore.isStreaming(),isEditing=()=>chatStore.isEditing(),isLoading=()=>chatStore.isLoading,pendingEditMessageId=()=>chatStore.pendingEditMessageId,chatPendingMessageContent=convId=>chatStore.pendingMessageContent(convId),chatPendingMessageExtras=convId=>chatStore.pendingMessageExtras(convId),chatClearPendingMessage=convId=>chatStore.clearPendingMessage(convId),chatInjectPendingMessage=(convId,content2,extras)=>chatStore.injectPendingMessage(convId,content2,extras);var root$1r=from_html( -'
',1);function ChatForm($$anchor,$$props){push$1($$props,!0);let attachments=prop($$props,"attachments",19,()=>[]),className=prop($$props,"class",3,""),disabled=prop($$props,"disabled",3,!1),isLoading2=prop($$props,"isLoading",3,!1),placeholder=prop($$props,"placeholder",3,"Typ\ -e a message..."),showMcpPromptButton=prop($$props,"showMcpPromptButton",3,!1),showAddButton=prop($$props,"showAddButton",3,!0),showModelSelector=prop($$props,"showModelSelector",3,!0),uploadedFiles=prop($$props,"uploadedFiles",31,()=>proxy([])),value=prop($$props,"value",15,""),audioRecorder,chatFormActionsRef=state$1(void 0),fileInputRef=state$1(void 0),pickersRef=state$1(void 0),textareaRef=state$1(void 0),isRecording=state$1(!1),recordingSupported=state$1(!1),isPromptPickerOpen=state$1(!1),promptSearchQuery=state$1( -""),isInlineResourcePickerOpen=state$1(!1),resourceSearchQuery=state$1(""),isResourceDialogOpen=state$1(!1),preSelectedResourceUri=state$1(void 0),currentConfig=user_derived(config$1),pasteLongTextToFileLength=user_derived(()=>{const n=Number(get$3(currentConfig).pasteLongTextToFileLen);return Number.isNaN(n)?Number(SETTING_CONFIG_DEFAULT.pasteLongTextToFileLen):n}),isRouter=user_derived(isRouterMode),conversationModel=user_derived(()=>chatStore.getConversationModel(activeMessages())),activeModelId=user_derived( -()=>{const options=modelOptions();if(!get$3(isRouter))return options.length>0?options[0].model:null;const selectedId=selectedModelId();if(selectedId){const model=options.find(m=>m.id===selectedId);if(model)return model.model}if(get$3(conversationModel)){const model=options.find(m=>m.model===get$3(conversationModel));if(model)return model.model}return null}),hasModelSelected=user_derived(()=>!get$3(isRouter)||!!get$3(conversationModel)||!!selectedModelId()),hasLoadingAttachments=user_derived(()=>uploadedFiles(). -some(f=>f.isLoading)),hasAttachments=user_derived(()=>attachments()&&attachments().length>0||uploadedFiles()&&uploadedFiles().length>0),canSubmit=user_derived(()=>value().trim().length>0||get$3(hasAttachments));onMount$1(()=>{set$1(recordingSupported,isAudioRecordingSupported(),!0),audioRecorder=new AudioRecorder});function focus2(){get$3(textareaRef)?.focus()}function resetTextareaHeight(){get$3(textareaRef)?.resetHeight()}function openModelSelector(){get$3(chatFormActionsRef)?.openModelSelector()} -function checkModelSelected(){return get$3(hasModelSelected)?!0:(get$3(chatFormActionsRef)?.openModelSelector(),!1)}function handleFileSelect(files){$$props.onFilesAdd?.(files)}function handleFileUpload(){get$3(fileInputRef)?.click()}function handleFileRemove(fileId){if(fileId.startsWith("attachment-")){const index2=parseInt(fileId.replace("attachment-",""),10);!isNaN(index2)&&index2>=0&&index2item.kind==="file").map(item=>item.getAsFile()). -filter(file=>file!==null);if(files.length>0){event2.preventDefault(),$$props.onFilesAdd?.(files);return}const text2=event2.clipboardData.getData(MimeTypeText.PLAIN);if(text2.startsWith(CLIPBOARD_CONTENT_QUOTE_PREFIX)){const parsed=parseClipboardContent(text2);if(parsed.textAttachments.length>0||parsed.mcpPromptAttachments.length>0){if(event2.preventDefault(),value(parsed.message),$$props.onValueChange?.(parsed.message),parsed.textAttachments.length>0){const attachmentFiles=parsed.textAttachments. -map(att=>new File([att.content],att.name,{type:MimeTypeText.PLAIN}));$$props.onFilesAdd?.(attachmentFiles)}if(parsed.mcpPromptAttachments.length>0){const mcpPromptFiles=parsed.mcpPromptAttachments.map(att=>({id:uuid$1(),name:att.name,size:att.content.length,type:SpecialFileType.MCP_PROMPT,file:new File([att.content],`${att.name}${FileExtensionText.TXT}`,{type:MimeTypeText.PLAIN}),isLoading:!1,textContent:att.content,mcpPrompt:{serverName:att.serverName,promptName:att.promptName,arguments:att.arguments}})); -uploadedFiles([...uploadedFiles(),...mcpPromptFiles]),$$props.onUploadedFilesChange?.(uploadedFiles())}setTimeout(()=>{get$3(textareaRef)?.focus()},10);return}}if(text2.length>0&&get$3(pasteLongTextToFileLength)>0&&text2.length>get$3(pasteLongTextToFileLength)){event2.preventDefault();const textFile=new File([text2],"Pasted",{type:MimeTypeText.PLAIN});$$props.onFilesAdd?.([textFile])}}function handlePromptLoadStart(placeholderId,promptInfo,args){value().startsWith(PROMPT_TRIGGER_PREFIX)&&(value( -""),$$props.onValueChange?.("")),set$1(isPromptPickerOpen,!1),set$1(promptSearchQuery,"");const promptName=promptInfo.title||promptInfo.name,placeholder2={id:placeholderId,name:promptName,size:INITIAL_FILE_SIZE,type:SpecialFileType.MCP_PROMPT,file:new File([],"loading"),isLoading:!0,mcpPrompt:{serverName:promptInfo.serverName,promptName:promptInfo.name,arguments:args?{...args}:void 0}};uploadedFiles([...uploadedFiles(),placeholder2]),$$props.onUploadedFilesChange?.(uploadedFiles()),get$3(textareaRef)?. -focus()}function handlePromptLoadComplete(placeholderId,result){const promptText=result.messages?.map(msg=>typeof msg.content=="string"?msg.content:msg.content.type===ContentPartType.TEXT?msg.content.text:"").filter(Boolean).join(PROMPT_CONTENT_SEPARATOR);uploadedFiles(uploadedFiles().map(f=>f.id===placeholderId?{...f,isLoading:!1,textContent:promptText,size:promptText.length,file:new File([promptText],`${f.name}${FileExtensionText.TXT}`,{type:MimeTypeText.PLAIN})}:f)),$$props.onUploadedFilesChange?.( -uploadedFiles())}function handlePromptLoadError(placeholderId,error2){uploadedFiles(uploadedFiles().map(f=>f.id===placeholderId?{...f,isLoading:!1,loadError:error2}:f)),$$props.onUploadedFilesChange?.(uploadedFiles())}function handlePromptPickerClose(){set$1(isPromptPickerOpen,!1),set$1(promptSearchQuery,""),get$3(textareaRef)?.focus()}function handleInlineResourcePickerClose(){set$1(isInlineResourcePickerOpen,!1),set$1(resourceSearchQuery,""),get$3(textareaRef)?.focus()}function handleInlineResourceSelect(){ -value().startsWith(RESOURCE_TRIGGER_PREFIX)&&(value(""),$$props.onValueChange?.("")),set$1(isInlineResourcePickerOpen,!1),set$1(resourceSearchQuery,""),get$3(textareaRef)?.focus()}function handleBrowseResources(){set$1(isInlineResourcePickerOpen,!1),set$1(resourceSearchQuery,""),value().startsWith(RESOURCE_TRIGGER_PREFIX)&&(value(""),$$props.onValueChange?.("")),set$1(isResourceDialogOpen,!0)}async function handleMicClick(){if(!audioRecorder||!get$3(recordingSupported)){console.warn("Audio recor\ -ding not supported");return}if(get$3(isRecording)){set$1(isRecording,!1);try{const audioBlob=await audioRecorder.stopRecording(),wavBlob=await convertToWav(audioBlob),audioFile=createAudioFile(wavBlob);$$props.onFilesAdd?.([audioFile])}catch(error2){console.error("Failed to stop recording:",error2)}}else try{await audioRecorder.startRecording(),set$1(isRecording,!0)}catch(error2){console.error("Failed to start recording:",error2)}}var $$exports={focus:focus2,resetTextareaHeight,openModelSelector, -checkModelSelected},fragment=root$1r(),node2=first_child(fragment);bind_this(ChatFormFileInputInvisible(node2,{onFileSelect:handleFileSelect}),$$value=>set$1(fileInputRef,$$value,!0),()=>get$3(fileInputRef));var form=sibling(node2,2),node_1=child(form);bind_this(ChatFormPickers(node_1,{get isPromptPickerOpen(){return get$3(isPromptPickerOpen)},get promptSearchQuery(){return get$3(promptSearchQuery)},get isInlineResourcePickerOpen(){return get$3(isInlineResourcePickerOpen)},get resourceSearchQuery(){ -return get$3(resourceSearchQuery)},onPromptPickerClose:handlePromptPickerClose,onInlineResourcePickerClose:handleInlineResourcePickerClose,onInlineResourceSelect:handleInlineResourceSelect,onPromptLoadStart:handlePromptLoadStart,onPromptLoadComplete:handlePromptLoadComplete,onPromptLoadError:handlePromptLoadError,onInlineResourceBrowse:handleBrowseResources}),$$value=>set$1(pickersRef,$$value,!0),()=>get$3(pickersRef));var div=sibling(node_1,2),node_2=child(div);{let $0=user_derived(()=>get$3(activeModelId)?? -void 0);ChatAttachmentsList(node_2,{get attachments(){return attachments()},onFileRemove:handleFileRemove,limitToSingleRow:!0,class:"py-5",style:"scroll-padding: 1rem;",get activeModelId(){return get$3($0)},get uploadedFiles(){return uploadedFiles()},set uploadedFiles($$value){uploadedFiles($$value)}})}var div_1=sibling(node_2,2),node_3=child(div_1);bind_this(ChatFormTextarea(node_3,{class:"px-5 py-1.5 md:pt-0",onKeydown:handleKeydown,onInput:()=>{handleInput(),$$props.onValueChange?.(value())}, -get disabled(){return disabled()},get placeholder(){return placeholder()},get value(){return value()},set value($$value){value($$value)}}),$$value=>set$1(textareaRef,$$value,!0),()=>get$3(textareaRef));var node_4=sibling(node_3,2);{var consequent=$$anchor2=>{ChatFormMcpResourcesList($$anchor2,{class:"mb-3",onResourceClick:uri2=>{set$1(preSelectedResourceUri,uri2,!0),set$1(isResourceDialogOpen,!0)}})},d2=user_derived(()=>mcpHasResourceAttachments());if_block(node_4,$$render=>{get$3(d2)&&$$render( -consequent)})}var node_5=sibling(node_4,2);{let $0=user_derived(()=>showMcpPromptButton()?()=>set$1(isPromptPickerOpen,!0):void 0);bind_this(ChatFormActions(node_5,{class:"px-3",get canSend(){return get$3(canSubmit)},get disabled(){return disabled()},get isLoading(){return isLoading2()},get isRecording(){return get$3(isRecording)},get showAddButton(){return showAddButton()},get showModelSelector(){return showModelSelector()},get uploadedFiles(){return uploadedFiles()},onFileUpload:handleFileUpload, -onMicClick:handleMicClick,get onStop(){return $$props.onStop},onSystemPromptClick:()=>$$props.onSystemPromptClick?.({message:value(),files:uploadedFiles()}),get onMcpPromptClick(){return get$3($0)},onMcpResourcesClick:()=>set$1(isResourceDialogOpen,!0)}),$$value=>set$1(chatFormActionsRef,$$value,!0),()=>get$3(chatFormActionsRef))}reset(div_1),reset(div),reset(form);var node_6=sibling(form,2);return DialogMcpResourcesBrowser(node_6,{get preSelectedUri(){return get$3(preSelectedResourceUri)},onAttach:resource=>{ -mcpStore.attachResource(resource.uri)},onOpenChange:newOpen=>{newOpen||set$1(preSelectedResourceUri,void 0)},get open(){return get$3(isResourceDialogOpen)},set open($$value){set$1(isResourceDialogOpen,$$value,!0)}}),template_effect(()=>{set_class(form,1,`relative ${className()??""}`),set_class(div,1,`${INPUT_CLASSES??""} overflow-hidden rounded-3xl backdrop-blur-md ${disabled()?"cursor-not-allowed opacity-60":""}`)}),event("submit",form,event2=>{event2.preventDefault(),!(!get$3(canSubmit)||disabled()|| -get$3(hasLoadingAttachments))&&$$props.onSubmit?.()}),event("paste",div_1,handlePaste),append($$anchor,fragment),pop($$exports)}function Dropdown_menu_content($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),sideOffset=prop($$props,"sideOffset",3,4),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref","sideOffset","portalProps","class"]);var fragment=comment$2(),node2=first_child(fragment);component(node2,()=>Portal$2,($$anchor2,DropdownMenuPrimitive_Portal)=>{ -DropdownMenuPrimitive_Portal($$anchor2,spread_props(()=>$$props.portalProps,{children:($$anchor3,$$slotProps)=>{var fragment_1=comment$2(),node_1=first_child(fragment_1);{let $0=user_derived(()=>cn$1("z-50 max-h-(--bits-dropdown-menu-content-available-height) min-w-[8rem] origin-(--bits-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border border-border bg-popover p-1.5 text-popover-foreground shadow-md outline-none data-[side=bottom]:slide-in-from-top-2 dat\ -a-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 dark:border-border/20",$$props.class));component(node_1,()=>Dropdown_menu_content$1,($$anchor4,DropdownMenuPrimitive_Content)=>{DropdownMenuPrimitive_Content($$anchor4,spread_props({"data-slot":"dropdown-m\ -enu-content",get sideOffset(){return sideOffset()},get class(){return get$3($0)}},()=>restProps,{get ref(){return ref2()},set ref($$value){ref2($$value)}}))})}append($$anchor3,fragment_1)},$$slots:{default:!0}}))}),append($$anchor,fragment),pop()}function Dropdown_menu_item($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),variant=prop($$props,"variant",3,"default"),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref","class","inset","variant"]);var fragment=comment$2(), -node2=first_child(fragment);{let $0=user_derived(()=>cn$1("relative flex cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-highlighted:bg-accent data-highlighted:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:data-highlighted:bg-destructive/10 data-[variant=destructive]:data-highlighted:text-destructive dark:data-[variant=d\ -estructive]:data-highlighted:bg-destructive/20 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground data-[variant=destructive]:*:[svg]:!text-destructive",$$props.class));component(node2,()=>Menu_item,($$anchor2,DropdownMenuPrimitive_Item)=>{DropdownMenuPrimitive_Item($$anchor2,spread_props({"data-slot":"dropdown-menu-item",get"data-inset"(){return $$props.inset},get"data-variant"(){return variant()},get class(){return get$3( -$0)}},()=>restProps,{get ref(){return ref2()},set ref($$value){ref2($$value)}}))})}append($$anchor,fragment),pop()}function Dropdown_menu_separator($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref","class"]);var fragment=comment$2(),node2=first_child(fragment);{let $0=user_derived(()=>cn$1("-mx-1 my-1 h-px bg-border/20",$$props.class));component(node2,()=>Menu_separator,($$anchor2,DropdownMenuPrimitive_Separator)=>{ -DropdownMenuPrimitive_Separator($$anchor2,spread_props({"data-slot":"dropdown-menu-separator",get class(){return get$3($0)}},()=>restProps,{get ref(){return ref2()},set ref($$value){ref2($$value)}}))})}append($$anchor,fragment),pop()}function Dropdown_menu_trigger($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref"]);var fragment=comment$2(),node2=first_child(fragment);component(node2,()=>Menu_trigger,($$anchor2,DropdownMenuPrimitive_Trigger)=>{ -DropdownMenuPrimitive_Trigger($$anchor2,spread_props({"data-slot":"dropdown-menu-trigger"},()=>restProps,{get ref(){return ref2()},set ref($$value){ref2($$value)}}))}),append($$anchor,fragment),pop()}function Dropdown_menu_sub_content($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref","class"]);var fragment=comment$2(),node2=first_child(fragment);{let $0=user_derived(()=>cn$1("z-50 max-h-(--bits-dropdown-m\ -enu-content-available-height) min-w-[8rem] origin-(--bits-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border border-border bg-popover p-1.5 text-popover-foreground shadow-md outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:ani\ -mate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 dark:border-border/20",$$props.class));component(node2,()=>Menu_sub_content,($$anchor2,DropdownMenuPrimitive_SubContent)=>{DropdownMenuPrimitive_SubContent($$anchor2,spread_props({"data-slot":"dropdown-menu-sub-content",get class(){return get$3($0)}},()=>restProps,{get ref(){return ref2()},set ref($$value){ref2($$value)}}))})}append($$anchor,fragment),pop()}var root_1$M=from_html(" ",1);function Dropdown_menu_sub_trigger($$anchor,$$props){ -push$1($$props,!0);let ref2=prop($$props,"ref",15,null),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref","class","inset","children"]);var fragment=comment$2(),node2=first_child(fragment);{let $0=user_derived(()=>cn$1("flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-highlighted:bg-accent data-highlighted:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 data-[state=open]:\ -bg-accent data-[state=open]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground",$$props.class));component(node2,()=>Menu_sub_trigger,($$anchor2,DropdownMenuPrimitive_SubTrigger)=>{DropdownMenuPrimitive_SubTrigger($$anchor2,spread_props({"data-slot":"dropdown-menu-sub-trigger",get"data-inset"(){return $$props.inset},get class(){return get$3($0)}},()=>restProps,{get ref(){return ref2()},set ref($$value){ -ref2($$value)},children:($$anchor3,$$slotProps)=>{var fragment_1=root_1$M(),node_1=first_child(fragment_1);snippet(node_1,()=>$$props.children??noop$3);var node_2=sibling(node_1,2);Chevron_right(node_2,{class:"ml-auto size-4"}),append($$anchor3,fragment_1)},$$slots:{default:!0}}))})}append($$anchor,fragment),pop()}const Sub=Menu_sub,Root$4=Menu;function useAttachmentMenu(getFlags,getCallbacks,close2){const modalityFlags=user_derived(getFlags),callbacks=user_derived(()=>{const cbs=getCallbacks(), -wrap2=fn=>()=>{close2(),fn?.()};return{[AttachmentAction.FILE_UPLOAD]:wrap2(cbs.onFileUpload),[AttachmentAction.SYSTEM_PROMPT_CLICK]:wrap2(cbs.onSystemPromptClick),[AttachmentAction.MCP_PROMPT_CLICK]:wrap2(cbs.onMcpPromptClick),[AttachmentAction.MCP_RESOURCES_CLICK]:wrap2(cbs.onMcpResourcesClick)}});function isItemEnabled(enabledWhen){return!enabledWhen||enabledWhen==="always"?!0:!!get$3(modalityFlags)[enabledWhen]}function isItemVisible(visibleWhen){return visibleWhen?!!get$3(modalityFlags)[visibleWhen]: -!0}function getSystemMessageTooltip(){return page$1.params.id?"Inject custom system message at the beginning of the conversation":"Add custom system message for a new conversation"}return{get callbacks(){return get$3(callbacks)},isItemEnabled,isItemVisible,getSystemMessageTooltip}}var root_6$u=from_html(" ",1),root_10$f=from_html(" ",1),root_11$e=from_html("

"),root_8$r=from_html(" ",1),root_16$5=from_html(" ",1),root_17$7=from_html( -"

PDFs will be converted to text. Image-based PDFs may not work properly.

"),root_13$c=from_html(" ",1),root_22$1=from_html(" ",1),root_23$4=from_html("

"),root_20$4=from_html(" ",1),root_26$2=from_html(" ",1),root_3$Q=from_html(" ",1),root_1$L=from_html(" ",1),root$1q=from_html("
");function ChatFormActionAddDropdown($$anchor,$$props){push$1($$props,!0);let className=prop($$props,"class",3,""), -disabled=prop($$props,"disabled",3,!1),hasAudioModality=prop($$props,"hasAudioModality",3,!1),hasVisionModality=prop($$props,"hasVisionModality",3,!1),hasMcpPromptsSupport=prop($$props,"hasMcpPromptsSupport",3,!1),hasMcpResourcesSupport=prop($$props,"hasMcpResourcesSupport",3,!1),dropdownOpen=state$1(!1);function handleMcpSettingsClick(){set$1(dropdownOpen,!1),$$props.onMcpSettingsClick?.()}const attachmentMenu=useAttachmentMenu(()=>({hasVisionModality:hasVisionModality(),hasAudioModality:hasAudioModality(), -hasMcpPromptsSupport:hasMcpPromptsSupport(),hasMcpResourcesSupport:hasMcpResourcesSupport()}),()=>({onFileUpload:$$props.onFileUpload,onSystemPromptClick:$$props.onSystemPromptClick,onMcpPromptClick:$$props.onMcpPromptClick,onMcpResourcesClick:$$props.onMcpResourcesClick}),()=>{set$1(dropdownOpen,!1)});var div=root$1q(),node2=child(div);component(node2,()=>Root$4,($$anchor2,DropdownMenu_Root)=>{DropdownMenu_Root($$anchor2,{get open(){return get$3(dropdownOpen)},set open($$value){set$1(dropdownOpen, -$$value,!0)},children:($$anchor3,$$slotProps)=>{var fragment=root_1$L(),node_1=first_child(fragment);component(node_1,()=>Dropdown_menu_trigger,($$anchor4,DropdownMenu_Trigger)=>{DropdownMenu_Trigger($$anchor4,{name:"Attach files",get disabled(){return disabled()},children:($$anchor5,$$slotProps2)=>{var fragment_1=comment$2(),node_2=first_child(fragment_1);snippet(node_2,()=>$$props.trigger,()=>({disabled:disabled()})),append($$anchor5,fragment_1)},$$slots:{default:!0}})});var node_3=sibling(node_1, -2);component(node_3,()=>Dropdown_menu_content,($$anchor4,DropdownMenu_Content)=>{DropdownMenu_Content($$anchor4,{align:"start",class:"w-48",children:($$anchor5,$$slotProps2)=>{var fragment_2=root_3$Q(),node_4=first_child(fragment_2);each(node_4,17,()=>ATTACHMENT_FILE_ITEMS,item=>item.id,($$anchor6,item)=>{const enabled=user_derived(()=>attachmentMenu.isItemEnabled(get$3(item).enabledWhen));var fragment_3=comment$2(),node_5=first_child(fragment_3);{var consequent=$$anchor7=>{var fragment_4=comment$2(), -node_6=first_child(fragment_4);{let $0=user_derived(()=>get$3(item).class??"");component(node_6,()=>Dropdown_menu_item,($$anchor8,DropdownMenu_Item)=>{DropdownMenu_Item($$anchor8,{get class(){return`${get$3($0)??""} flex cursor-pointer items-center gap-2`},onclick:()=>attachmentMenu.callbacks[get$3(item).action](),children:($$anchor9,$$slotProps3)=>{var fragment_5=root_6$u(),node_7=first_child(fragment_5);component(node_7,()=>get$3(item).icon,($$anchor10,item_icon)=>{item_icon($$anchor10,{class:"\ -h-4 w-4"})});var span=sibling(node_7,2),text2=child(span,!0);reset(span),template_effect(()=>set_text(text2,get$3(item).label)),append($$anchor9,fragment_5)},$$slots:{default:!0}})})}append($$anchor7,fragment_4)},consequent_1=$$anchor7=>{var fragment_6=comment$2(),node_8=first_child(fragment_6);component(node_8,()=>Root$5,($$anchor8,Tooltip_Root)=>{Tooltip_Root($$anchor8,{get delayDuration(){return TOOLTIP_DELAY_DURATION},children:($$anchor9,$$slotProps3)=>{var fragment_7=root_8$r(),node_9=first_child( -fragment_7);component(node_9,()=>Tooltip_trigger,($$anchor10,Tooltip_Trigger)=>{Tooltip_Trigger($$anchor10,{class:"w-full",children:($$anchor11,$$slotProps4)=>{var fragment_8=comment$2(),node_10=first_child(fragment_8);{let $0=user_derived(()=>get$3(item).class??"");component(node_10,()=>Dropdown_menu_item,($$anchor12,DropdownMenu_Item_1)=>{DropdownMenu_Item_1($$anchor12,{get class(){return`${get$3($0)??""} flex cursor-pointer items-center gap-2`},disabled:!0,children:($$anchor13,$$slotProps5)=>{ -var fragment_9=root_10$f(),node_11=first_child(fragment_9);component(node_11,()=>get$3(item).icon,($$anchor14,item_icon_1)=>{item_icon_1($$anchor14,{class:"h-4 w-4"})});var span_1=sibling(node_11,2),text_1=child(span_1,!0);reset(span_1),template_effect(()=>set_text(text_1,get$3(item).label)),append($$anchor13,fragment_9)},$$slots:{default:!0}})})}append($$anchor11,fragment_8)},$$slots:{default:!0}})});var node_12=sibling(node_9,2);component(node_12,()=>Tooltip_content,($$anchor10,Tooltip_Content)=>{ -Tooltip_Content($$anchor10,{side:"right",children:($$anchor11,$$slotProps4)=>{var p2=root_11$e(),text_2=child(p2,!0);reset(p2),template_effect(()=>set_text(text_2,get$3(item).disabledTooltip)),append($$anchor11,p2)},$$slots:{default:!0}})}),append($$anchor9,fragment_7)},$$slots:{default:!0}})}),append($$anchor7,fragment_6)};if_block(node_5,$$render=>{get$3(enabled)?$$render(consequent):get$3(item).disabledTooltip&&$$render(consequent_1,1)})}append($$anchor6,fragment_3)});var node_13=sibling(node_4, -2);{var consequent_3=$$anchor6=>{var fragment_10=comment$2(),node_14=first_child(fragment_10);component(node_14,()=>Root$5,($$anchor7,Tooltip_Root_1)=>{Tooltip_Root_1($$anchor7,{get delayDuration(){return TOOLTIP_DELAY_DURATION},children:($$anchor8,$$slotProps3)=>{var fragment_11=root_13$c(),node_15=first_child(fragment_11);component(node_15,()=>Tooltip_trigger,($$anchor9,Tooltip_Trigger_1)=>{Tooltip_Trigger_1($$anchor9,{class:"w-full",children:($$anchor10,$$slotProps4)=>{var fragment_12=comment$2(), -node_16=first_child(fragment_12);component(node_16,()=>Dropdown_menu_item,($$anchor11,DropdownMenu_Item_2)=>{DropdownMenu_Item_2($$anchor11,{class:"flex cursor-pointer items-center gap-2",get onclick(){return attachmentMenu.callbacks.onFileUpload},children:($$anchor12,$$slotProps5)=>{const pdfItem=user_derived(()=>ATTACHMENT_FILE_ITEMS.find(i=>i.id===AttachmentMenuItemId.PDF));var fragment_13=comment$2(),node_17=first_child(fragment_13);{var consequent_2=$$anchor13=>{var fragment_14=root_16$5(), -node_18=first_child(fragment_14);component(node_18,()=>get$3(pdfItem).icon,($$anchor14,pdfItem_icon)=>{pdfItem_icon($$anchor14,{class:"h-4 w-4"})});var span_2=sibling(node_18,2),text_3=child(span_2,!0);reset(span_2),template_effect(()=>set_text(text_3,get$3(pdfItem).label)),append($$anchor13,fragment_14)};if_block(node_17,$$render=>{get$3(pdfItem)&&$$render(consequent_2)})}append($$anchor12,fragment_13)},$$slots:{default:!0}})}),append($$anchor10,fragment_12)},$$slots:{default:!0}})});var node_19=sibling( -node_15,2);component(node_19,()=>Tooltip_content,($$anchor9,Tooltip_Content_1)=>{Tooltip_Content_1($$anchor9,{side:"right",children:($$anchor10,$$slotProps4)=>{var p_1=root_17$7();append($$anchor10,p_1)},$$slots:{default:!0}})}),append($$anchor8,fragment_11)},$$slots:{default:!0}})}),append($$anchor6,fragment_10)},d2=user_derived(()=>!attachmentMenu.isItemEnabled("hasVisionModality"));if_block(node_13,$$render=>{get$3(d2)&&$$render(consequent_3)})}var node_20=sibling(node_13,2);component(node_20, -()=>Dropdown_menu_separator,($$anchor6,DropdownMenu_Separator)=>{DropdownMenu_Separator($$anchor6,{})});var node_21=sibling(node_20,2);each(node_21,17,()=>ATTACHMENT_EXTRA_ITEMS,item=>item.id,($$anchor6,item)=>{var fragment_15=comment$2(),node_22=first_child(fragment_15);{var consequent_4=$$anchor7=>{var fragment_16=comment$2(),node_23=first_child(fragment_16);component(node_23,()=>Root$5,($$anchor8,Tooltip_Root_2)=>{Tooltip_Root_2($$anchor8,{get delayDuration(){return TOOLTIP_DELAY_DURATION},children:($$anchor9,$$slotProps3)=>{ -var fragment_17=root_20$4(),node_24=first_child(fragment_17);component(node_24,()=>Tooltip_trigger,($$anchor10,Tooltip_Trigger_2)=>{Tooltip_Trigger_2($$anchor10,{class:"w-full",children:($$anchor11,$$slotProps4)=>{var fragment_18=comment$2(),node_25=first_child(fragment_18);component(node_25,()=>Dropdown_menu_item,($$anchor12,DropdownMenu_Item_3)=>{DropdownMenu_Item_3($$anchor12,{class:"flex cursor-pointer items-center gap-2",onclick:()=>attachmentMenu.callbacks[get$3(item).action](),children:($$anchor13,$$slotProps5)=>{ -var fragment_19=root_22$1(),node_26=first_child(fragment_19);component(node_26,()=>get$3(item).icon,($$anchor14,item_icon_2)=>{item_icon_2($$anchor14,{class:"h-4 w-4"})});var span_3=sibling(node_26,2),text_4=child(span_3,!0);reset(span_3),template_effect(()=>set_text(text_4,get$3(item).label)),append($$anchor13,fragment_19)},$$slots:{default:!0}})}),append($$anchor11,fragment_18)},$$slots:{default:!0}})});var node_27=sibling(node_24,2);component(node_27,()=>Tooltip_content,($$anchor10,Tooltip_Content_2)=>{ -Tooltip_Content_2($$anchor10,{side:"right",children:($$anchor11,$$slotProps4)=>{var p_2=root_23$4(),text_5=child(p_2,!0);reset(p_2),template_effect($0=>set_text(text_5,$0),[()=>attachmentMenu.getSystemMessageTooltip()]),append($$anchor11,p_2)},$$slots:{default:!0}})}),append($$anchor9,fragment_17)},$$slots:{default:!0}})}),append($$anchor7,fragment_16)};if_block(node_22,$$render=>{get$3(item).id===AttachmentMenuItemId.SYSTEM_MESSAGE&&$$render(consequent_4)})}append($$anchor6,fragment_15)});var node_28=sibling( -node_21,2);ChatFormActionAddToolsSubmenu(node_28,{});var node_29=sibling(node_28,2);ChatFormActionAddMcpServersSubmenu(node_29,{onMcpSettingsClick:handleMcpSettingsClick});var node_30=sibling(node_29,2);each(node_30,17,()=>ATTACHMENT_MCP_ITEMS,item=>item.id,($$anchor6,item)=>{var fragment_20=comment$2(),node_31=first_child(fragment_20);{var consequent_5=$$anchor7=>{var fragment_21=comment$2(),node_32=first_child(fragment_21);component(node_32,()=>Dropdown_menu_item,($$anchor8,DropdownMenu_Item_4)=>{ -DropdownMenu_Item_4($$anchor8,{class:"flex cursor-pointer items-center gap-2",onclick:()=>attachmentMenu.callbacks[get$3(item).action](),children:($$anchor9,$$slotProps3)=>{var fragment_22=root_26$2(),node_33=first_child(fragment_22);component(node_33,()=>get$3(item).icon,($$anchor10,item_icon_3)=>{item_icon_3($$anchor10,{class:"h-4 w-4"})});var span_4=sibling(node_33,2),text_6=child(span_4,!0);reset(span_4),template_effect(()=>set_text(text_6,get$3(item).label)),append($$anchor9,fragment_22)},$$slots:{ -default:!0}})}),append($$anchor7,fragment_21)},d_12=user_derived(()=>attachmentMenu.isItemVisible(get$3(item).visibleWhen));if_block(node_31,$$render=>{get$3(d_12)&&$$render(consequent_5)})}append($$anchor6,fragment_20)}),append($$anchor5,fragment_2)},$$slots:{default:!0}})}),append($$anchor3,fragment)},$$slots:{default:!0}})}),reset(div),template_effect(()=>set_class(div,1,`flex items-center gap-1 ${className()??""}`)),append($$anchor,div),pop()}function Sheet_overlay($$anchor,$$props){push$1($$props, -!0);let ref2=prop($$props,"ref",15,null),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref","class"]);var fragment=comment$2(),node2=first_child(fragment);{let $0=user_derived(()=>cn$1("fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0",$$props.class));component(node2,()=>Dialog_overlay$1,($$anchor2,SheetPrimitive_Overlay)=>{SheetPrimitive_Overlay($$anchor2,spread_props({"data-sl\ -ot":"sheet-overlay",get class(){return get$3($0)}},()=>restProps,{get ref(){return ref2()},set ref($$value){ref2($$value)}}))})}append($$anchor,fragment),pop()}const sheetVariants=tv({base:`border-border/30 dark:border-border/20 data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-sm transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 ${PANEL_CLASSES}`,variants:{side:{top:"data-[state=closed]:slide-out-to-top data-[\ -state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b",bottom:"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t",left:"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm",right:"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm"}},defaultVariants:{side:"right"}});var root_3$P=from_html( -' Close',1),root_2$11=from_html(" ",1),root_1$K=from_html(" ",1);function Sheet_content($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),side=prop($$props,"side",3,"right"),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref","class","side","portalProps","children"]);var fragment=comment$2(),node2=first_child(fragment);component(node2,()=>Portal$2,($$anchor2,SheetPrimitive_Portal)=>{SheetPrimitive_Portal($$anchor2, -spread_props(()=>$$props.portalProps,{children:($$anchor3,$$slotProps)=>{var fragment_1=root_1$K(),node_1=first_child(fragment_1);Sheet_overlay(node_1,{});var node_2=sibling(node_1,2);{let $0=user_derived(()=>cn$1(sheetVariants({side:side()}),$$props.class));component(node_2,()=>Dialog_content$1,($$anchor4,SheetPrimitive_Content)=>{SheetPrimitive_Content($$anchor4,spread_props({"data-slot":"sheet-content",get class(){return get$3($0)}},()=>restProps,{get ref(){return ref2()},set ref($$value){ref2( -$$value)},children:($$anchor5,$$slotProps2)=>{var fragment_2=root_2$11(),node_3=first_child(fragment_2);snippet(node_3,()=>$$props.children??noop$3);var node_4=sibling(node_3,2);component(node_4,()=>Dialog_close,($$anchor6,SheetPrimitive_Close)=>{SheetPrimitive_Close($$anchor6,{class:"absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:outline-hidden disable\ -d:pointer-events-none",children:($$anchor7,$$slotProps3)=>{var fragment_3=root_3$P(),node_5=first_child(fragment_3);X(node_5,{class:"size-4"}),next$1(2),append($$anchor7,fragment_3)},$$slots:{default:!0}})}),append($$anchor5,fragment_2)},$$slots:{default:!0}}))})}append($$anchor3,fragment_1)},$$slots:{default:!0}}))}),append($$anchor,fragment),pop()}var root$1p=from_html("
");function Sheet_header($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),restProps=rest_props( -$$props,["$$slots","$$events","$$legacy","ref","class","children"]);var div=root$1p();attribute_effect(div,$0=>({"data-slot":"sheet-header",class:$0,...restProps}),[()=>cn$1("flex flex-col gap-1.5 p-4",$$props.class)]);var node2=child(div);snippet(node2,()=>$$props.children??noop$3),reset(div),bind_this(div,$$value=>ref2($$value),()=>ref2()),append($$anchor,div),pop()}function Sheet_title($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),restProps=rest_props($$props,["$$s\ -lots","$$events","$$legacy","ref","class"]);var fragment=comment$2(),node2=first_child(fragment);{let $0=user_derived(()=>cn$1("font-semibold text-foreground",$$props.class));component(node2,()=>Dialog_title$1,($$anchor2,SheetPrimitive_Title)=>{SheetPrimitive_Title($$anchor2,spread_props({"data-slot":"sheet-title",get class(){return get$3($0)}},()=>restProps,{get ref(){return ref2()},set ref($$value){ref2($$value)}}))})}append($$anchor,fragment),pop()}function Sheet_description($$anchor,$$props){ -push$1($$props,!0);let ref2=prop($$props,"ref",15,null),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref","class"]);var fragment=comment$2(),node2=first_child(fragment);{let $0=user_derived(()=>cn$1("text-sm text-muted-foreground",$$props.class));component(node2,()=>Dialog_description$1,($$anchor2,SheetPrimitive_Description)=>{SheetPrimitive_Description($$anchor2,spread_props({"data-slot":"sheet-description",get class(){return get$3($0)}},()=>restProps,{get ref(){return ref2()}, -set ref($$value){ref2($$value)}}))})}append($$anchor,fragment),pop()}const Root$3=Dialog;var root_3$O=from_html(" ",1),root_7$r=from_html(''),root_10$e=from_html(''),root_11$d=from_html("

"),root_9$k=from_html(" ",1),root_15$a=from_html(''),root_16$4=from_html("

PDFs will be converted to text. Image-based PDFs may not \ -work properly.

"),root_14$6=from_html(" ",1),root_20$3=from_html(''),root_21$5=from_html("

"),root_19$9=from_html(" ",1),root_23$3=from_html(''),root_2$10=from_html(' ',1),root_1$J=from_html(" ",1),root$1o=from_html("
");function ChatFormActionAddSheet($$anchor,$$props){push$1($$props,!0);let className=prop($$props,"class",3,""),disabled=prop($$props,"disabled",3,!1),hasAudioModality=prop($$props,"hasAudioModality",3,!1),hasVisionModality=prop($$props,"hasVisionModality",3,!1),hasMcpPromptsSupport=prop($$props,"hasMcpPr\ -omptsSupport",3,!1),hasMcpResourcesSupport=prop($$props,"hasMcpResourcesSupport",3,!1),sheetOpen=state$1(!1);const attachmentMenu=useAttachmentMenu(()=>({hasVisionModality:hasVisionModality(),hasAudioModality:hasAudioModality(),hasMcpPromptsSupport:hasMcpPromptsSupport(),hasMcpResourcesSupport:hasMcpResourcesSupport()}),()=>({onFileUpload:$$props.onFileUpload,onSystemPromptClick:$$props.onSystemPromptClick,onMcpPromptClick:$$props.onMcpPromptClick,onMcpResourcesClick:$$props.onMcpResourcesClick}), -()=>{set$1(sheetOpen,!1)}),sheetItemClass="flex w-full items-center gap-3 rounded-md px-3 py-2.5 text-left text-sm transition-colors hover:bg-accent active:bg-accent disabled:cursor-not-allowed disabled:opacity-50";var div=root$1o(),node2=child(div);component(node2,()=>Root$3,($$anchor2,Sheet_Root)=>{Sheet_Root($$anchor2,{get open(){return get$3(sheetOpen)},set open($$value){set$1(sheetOpen,$$value,!0)},children:($$anchor3,$$slotProps)=>{var fragment=root_1$J(),node_1=first_child(fragment);snippet( -node_1,()=>$$props.trigger,()=>({disabled:disabled(),onclick:()=>set$1(sheetOpen,!0)}));var node_2=sibling(node_1,2);component(node_2,()=>Sheet_content,($$anchor4,Sheet_Content)=>{Sheet_Content($$anchor4,{side:"bottom",class:"max-h-[85vh] gap-0 overflow-y-auto",children:($$anchor5,$$slotProps2)=>{var fragment_1=root_2$10(),node_3=first_child(fragment_1);component(node_3,()=>Sheet_header,($$anchor6,Sheet_Header)=>{Sheet_Header($$anchor6,{children:($$anchor7,$$slotProps3)=>{var fragment_2=root_3$O(), -node_4=first_child(fragment_2);component(node_4,()=>Sheet_title,($$anchor8,Sheet_Title)=>{Sheet_Title($$anchor8,{children:($$anchor9,$$slotProps4)=>{next$1();var text2=text$8("Add to chat");append($$anchor9,text2)},$$slots:{default:!0}})});var node_5=sibling(node_4,2);component(node_5,()=>Sheet_description,($$anchor8,Sheet_Description)=>{Sheet_Description($$anchor8,{class:"sr-only",children:($$anchor9,$$slotProps4)=>{next$1();var text_1=text$8("Add files, system prompt or configure MCP servers"); -append($$anchor9,text_1)},$$slots:{default:!0}})}),append($$anchor7,fragment_2)},$$slots:{default:!0}})});var div_1=sibling(node_3,2),node_6=child(div_1);each(node_6,17,()=>ATTACHMENT_FILE_ITEMS,item=>item.id,($$anchor6,item)=>{const enabled=user_derived(()=>attachmentMenu.isItemEnabled(get$3(item).enabledWhen));var fragment_3=comment$2(),node_7=first_child(fragment_3);{var consequent=$$anchor7=>{var button=root_7$r();set_class(button,1,clsx(sheetItemClass));var node_8=child(button);component(node_8, -()=>get$3(item).icon,($$anchor8,item_icon)=>{item_icon($$anchor8,{class:"h-4 w-4 shrink-0"})});var span=sibling(node_8,2),text_2=child(span,!0);reset(span),reset(button),template_effect(()=>set_text(text_2,get$3(item).label)),delegated("click",button,()=>attachmentMenu.callbacks[get$3(item).action]()),append($$anchor7,button)},consequent_1=$$anchor7=>{var fragment_4=comment$2(),node_9=first_child(fragment_4);component(node_9,()=>Root$5,($$anchor8,Tooltip_Root)=>{Tooltip_Root($$anchor8,{get delayDuration(){ -return TOOLTIP_DELAY_DURATION},children:($$anchor9,$$slotProps3)=>{var fragment_5=root_9$k(),node_10=first_child(fragment_5);component(node_10,()=>Tooltip_trigger,($$anchor10,Tooltip_Trigger)=>{Tooltip_Trigger($$anchor10,{children:($$anchor11,$$slotProps4)=>{var button_1=root_10$e();set_class(button_1,1,clsx(sheetItemClass));var node_11=child(button_1);component(node_11,()=>get$3(item).icon,($$anchor12,item_icon_1)=>{item_icon_1($$anchor12,{class:"h-4 w-4 shrink-0"})});var span_1=sibling(node_11, -2),text_3=child(span_1,!0);reset(span_1),reset(button_1),template_effect(()=>set_text(text_3,get$3(item).label)),append($$anchor11,button_1)},$$slots:{default:!0}})});var node_12=sibling(node_10,2);component(node_12,()=>Tooltip_content,($$anchor10,Tooltip_Content)=>{Tooltip_Content($$anchor10,{side:"right",children:($$anchor11,$$slotProps4)=>{var p2=root_11$d(),text_4=child(p2,!0);reset(p2),template_effect(()=>set_text(text_4,get$3(item).disabledTooltip)),append($$anchor11,p2)},$$slots:{default:!0}})}), -append($$anchor9,fragment_5)},$$slots:{default:!0}})}),append($$anchor7,fragment_4)};if_block(node_7,$$render=>{get$3(enabled)?$$render(consequent):get$3(item).disabledTooltip&&$$render(consequent_1,1)})}append($$anchor6,fragment_3)});var node_13=sibling(node_6,2);{var consequent_3=$$anchor6=>{const pdfItem=user_derived(()=>ATTACHMENT_FILE_ITEMS.find(i=>i.id===AttachmentMenuItemId.PDF));var fragment_6=comment$2(),node_14=first_child(fragment_6);{var consequent_2=$$anchor7=>{var fragment_7=comment$2(), -node_15=first_child(fragment_7);component(node_15,()=>Root$5,($$anchor8,Tooltip_Root_1)=>{Tooltip_Root_1($$anchor8,{get delayDuration(){return TOOLTIP_DELAY_DURATION},children:($$anchor9,$$slotProps3)=>{var fragment_8=root_14$6(),node_16=first_child(fragment_8);component(node_16,()=>Tooltip_trigger,($$anchor10,Tooltip_Trigger_1)=>{Tooltip_Trigger_1($$anchor10,{children:($$anchor11,$$slotProps4)=>{var button_2=root_15$a();set_class(button_2,1,clsx(sheetItemClass));var node_17=child(button_2);component( -node_17,()=>get$3(pdfItem).icon,($$anchor12,pdfItem_icon)=>{pdfItem_icon($$anchor12,{class:"h-4 w-4 shrink-0"})});var span_2=sibling(node_17,2),text_5=child(span_2,!0);reset(span_2),reset(button_2),template_effect(()=>set_text(text_5,get$3(pdfItem).label)),delegated("click",button_2,()=>attachmentMenu.callbacks[get$3(pdfItem).action]()),append($$anchor11,button_2)},$$slots:{default:!0}})});var node_18=sibling(node_16,2);component(node_18,()=>Tooltip_content,($$anchor10,Tooltip_Content_1)=>{Tooltip_Content_1( -$$anchor10,{side:"right",children:($$anchor11,$$slotProps4)=>{var p_1=root_16$4();append($$anchor11,p_1)},$$slots:{default:!0}})}),append($$anchor9,fragment_8)},$$slots:{default:!0}})}),append($$anchor7,fragment_7)};if_block(node_14,$$render=>{get$3(pdfItem)&&$$render(consequent_2)})}append($$anchor6,fragment_6)},d2=user_derived(()=>!attachmentMenu.isItemEnabled("hasVisionModality"));if_block(node_13,$$render=>{get$3(d2)&&$$render(consequent_3)})}var node_19=sibling(node_13,2);each(node_19,17,()=>ATTACHMENT_EXTRA_ITEMS, -item=>item.id,($$anchor6,item)=>{var fragment_9=comment$2(),node_20=first_child(fragment_9);{var consequent_4=$$anchor7=>{var fragment_10=comment$2(),node_21=first_child(fragment_10);component(node_21,()=>Root$5,($$anchor8,Tooltip_Root_2)=>{Tooltip_Root_2($$anchor8,{get delayDuration(){return TOOLTIP_DELAY_DURATION},children:($$anchor9,$$slotProps3)=>{var fragment_11=root_19$9(),node_22=first_child(fragment_11);component(node_22,()=>Tooltip_trigger,($$anchor10,Tooltip_Trigger_2)=>{Tooltip_Trigger_2( -$$anchor10,{children:($$anchor11,$$slotProps4)=>{var button_3=root_20$3();set_class(button_3,1,clsx(sheetItemClass));var node_23=child(button_3);component(node_23,()=>get$3(item).icon,($$anchor12,item_icon_2)=>{item_icon_2($$anchor12,{class:"h-4 w-4 shrink-0"})});var span_3=sibling(node_23,2),text_6=child(span_3,!0);reset(span_3),reset(button_3),template_effect(()=>set_text(text_6,get$3(item).label)),delegated("click",button_3,()=>attachmentMenu.callbacks[get$3(item).action]()),append($$anchor11, -button_3)},$$slots:{default:!0}})});var node_24=sibling(node_22,2);component(node_24,()=>Tooltip_content,($$anchor10,Tooltip_Content_2)=>{Tooltip_Content_2($$anchor10,{side:"right",children:($$anchor11,$$slotProps4)=>{var p_2=root_21$5(),text_7=child(p_2,!0);reset(p_2),template_effect($0=>set_text(text_7,$0),[()=>attachmentMenu.getSystemMessageTooltip()]),append($$anchor11,p_2)},$$slots:{default:!0}})}),append($$anchor9,fragment_11)},$$slots:{default:!0}})}),append($$anchor7,fragment_10)};if_block( -node_20,$$render=>{get$3(item).id===AttachmentMenuItemId.SYSTEM_MESSAGE&&$$render(consequent_4)})}append($$anchor6,fragment_9)});var a=sibling(node_19,4),node_25=child(a);McpLogo(node_25,{class:"inline h-4 w-4"}),next$1(2),reset(a);var a_1=sibling(a,2),node_26=child(a_1);Pencil_ruler(node_26,{class:"inline h-4 w-4"}),next$1(2),reset(a_1);var node_27=sibling(a_1,2);each(node_27,17,()=>ATTACHMENT_MCP_ITEMS,item=>item.id,($$anchor6,item)=>{var fragment_12=comment$2(),node_28=first_child(fragment_12); -{var consequent_5=$$anchor7=>{var button_4=root_23$3();set_class(button_4,1,clsx(sheetItemClass));var node_29=child(button_4);component(node_29,()=>get$3(item).icon,($$anchor8,item_icon_3)=>{item_icon_3($$anchor8,{class:"h-4 w-4 shrink-0"})});var span_4=sibling(node_29,2),text_8=child(span_4,!0);reset(span_4),reset(button_4),template_effect(()=>set_text(text_8,get$3(item).label)),delegated("click",button_4,()=>attachmentMenu.callbacks[get$3(item).action]()),append($$anchor7,button_4)},d_12=user_derived( -()=>attachmentMenu.isItemVisible(get$3(item).visibleWhen));if_block(node_28,$$render=>{get$3(d_12)&&$$render(consequent_5)})}append($$anchor6,fragment_12)}),reset(div_1),append($$anchor5,fragment_1)},$$slots:{default:!0}})}),append($$anchor3,fragment)},$$slots:{default:!0}})}),reset(div),template_effect(()=>set_class(div,1,`flex items-center gap-1 ${className()??""}`)),append($$anchor,div),pop()}delegate(["click"]);var root_3$N=from_html(' ',1),root_4$y=from_html( -"

"),root_1$I=from_html(" ",1);function ChatFormActionAddButton($$anchor,$$props){let disabled=prop($$props,"disabled",3,!1);var fragment=comment$2(),node2=first_child(fragment);component(node2,()=>Root$5,($$anchor2,Tooltip_Root)=>{Tooltip_Root($$anchor2,{children:($$anchor3,$$slotProps)=>{var fragment_1=root_1$I(),node_1=first_child(fragment_1);component(node_1,()=>Tooltip_trigger,($$anchor4,Tooltip_Trigger)=>{Tooltip_Trigger($$anchor4,{class:"w-full",children:($$anchor5,$$slotProps2)=>{ -Button($$anchor5,{class:"file-upload-button h-8 w-8 rounded-full p-0",get disabled(){return disabled()},get onclick(){return $$props.onclick},variant:"secondary",type:"button",children:($$anchor6,$$slotProps3)=>{var fragment_3=root_3$N(),span=first_child(fragment_3),text2=child(span,!0);reset(span);var node_2=sibling(span,2);Plus(node_2,{class:"h-4 w-4"}),template_effect(()=>set_text(text2,ATTACHMENT_TOOLTIP_TEXT)),append($$anchor6,fragment_3)},$$slots:{default:!0}})},$$slots:{default:!0}})});var node_3=sibling( -node_1,2);component(node_3,()=>Tooltip_content,($$anchor4,Tooltip_Content)=>{Tooltip_Content($$anchor4,{children:($$anchor5,$$slotProps2)=>{var p2=root_4$y(),text_1=child(p2,!0);reset(p2),template_effect(()=>set_text(text_1,ATTACHMENT_TOOLTIP_TEXT)),append($$anchor5,p2)},$$slots:{default:!0}})}),append($$anchor3,fragment_1)},$$slots:{default:!0}})}),append($$anchor,fragment)}function ChatFormActionsAdd($$anchor,$$props){push$1($$props,!0);let disabled=prop($$props,"disabled",3,!1),hasAudioModality=prop( -$$props,"hasAudioModality",3,!1),hasMcpPromptsSupport=prop($$props,"hasMcpPromptsSupport",3,!1),hasMcpResourcesSupport=prop($$props,"hasMcpResourcesSupport",3,!1),hasVisionModality=prop($$props,"hasVisionModality",3,!1);const isMobile=new IsMobile;var fragment=comment$2(),node2=first_child(fragment);{var consequent=$$anchor2=>{ChatFormActionAddSheet($$anchor2,{get disabled(){return disabled()},get hasAudioModality(){return hasAudioModality()},get hasVisionModality(){return hasVisionModality()},get hasMcpPromptsSupport(){ -return hasMcpPromptsSupport()},get hasMcpResourcesSupport(){return hasMcpResourcesSupport()},get onFileUpload(){return $$props.onFileUpload},get onMcpPromptClick(){return $$props.onMcpPromptClick},get onMcpResourcesClick(){return $$props.onMcpResourcesClick},trigger:($$anchor3,$$arg0)=>{let disabled2=()=>$$arg0?.().disabled,onclick=()=>$$arg0?.().onclick;ChatFormActionAddButton($$anchor3,{get disabled(){return disabled2()},get onclick(){return onclick()}})},$$slots:{trigger:!0}})},alternate=$$anchor2=>{ -ChatFormActionAddDropdown($$anchor2,{get disabled(){return disabled()},get hasAudioModality(){return hasAudioModality()},get hasVisionModality(){return hasVisionModality()},get hasMcpPromptsSupport(){return hasMcpPromptsSupport()},get hasMcpResourcesSupport(){return hasMcpResourcesSupport()},get onFileUpload(){return $$props.onFileUpload},get onMcpPromptClick(){return $$props.onMcpPromptClick},get onMcpResourcesClick(){return $$props.onMcpResourcesClick},get onMcpSettingsClick(){return $$props.onMcpSettingsClick}, -get onSystemPromptClick(){return $$props.onSystemPromptClick},trigger:$$anchor3=>{ChatFormActionAddButton($$anchor3,{get disabled(){return disabled()}})},$$slots:{trigger:!0}})};if_block(node2,$$render=>{isMobile.current?$$render(consequent):$$render(alternate,-1)})}append($$anchor,fragment),pop()}var root_3$M=from_html(' ',1),root_7$q=from_html("

Current model does not support audio

"),root_1$H=from_html(" ",1),root$1n=from_html("
");function ChatFormActionRecord($$anchor,$$props){ -let className=prop($$props,"class",3,""),disabled=prop($$props,"disabled",3,!1),hasAudioModality=prop($$props,"hasAudioModality",3,!1),isLoading2=prop($$props,"isLoading",3,!1),isRecording=prop($$props,"isRecording",3,!1);var div=root$1n(),node2=child(div);component(node2,()=>Root$5,($$anchor2,Tooltip_Root)=>{Tooltip_Root($$anchor2,{children:($$anchor3,$$slotProps)=>{var fragment=root_1$H(),node_1=first_child(fragment);component(node_1,()=>Tooltip_trigger,($$anchor4,Tooltip_Trigger)=>{Tooltip_Trigger( -$$anchor4,{children:($$anchor5,$$slotProps2)=>{{let $0=user_derived(()=>isRecording()?"animate-pulse bg-red-500 text-white hover:bg-red-600":""),$1=user_derived(()=>disabled()||isLoading2()||!hasAudioModality());Button($$anchor5,{get class(){return`h-8 w-8 rounded-full p-0 ${get$3($0)??""}`},get disabled(){return get$3($1)},get onclick(){return $$props.onMicClick},type:"button",children:($$anchor6,$$slotProps3)=>{var fragment_2=root_3$M(),span=first_child(fragment_2),text2=child(span,!0);reset(span); -var node_2=sibling(span,2);{var consequent=$$anchor7=>{Square($$anchor7,{class:"h-4 w-4 animate-pulse fill-white"})},alternate=$$anchor7=>{Mic($$anchor7,{class:"h-4 w-4"})};if_block(node_2,$$render=>{isRecording()?$$render(consequent):$$render(alternate,-1)})}template_effect(()=>set_text(text2,isRecording()?"Stop recording":"Start recording")),append($$anchor6,fragment_2)},$$slots:{default:!0}})}},$$slots:{default:!0}})});var node_3=sibling(node_1,2);{var consequent_1=$$anchor4=>{var fragment_5=comment$2(), -node_4=first_child(fragment_5);component(node_4,()=>Tooltip_content,($$anchor5,Tooltip_Content)=>{Tooltip_Content($$anchor5,{children:($$anchor6,$$slotProps2)=>{var p2=root_7$q();append($$anchor6,p2)},$$slots:{default:!0}})}),append($$anchor4,fragment_5)};if_block(node_3,$$render=>{hasAudioModality()||$$render(consequent_1)})}append($$anchor3,fragment)},$$slots:{default:!0}})}),reset(div),template_effect(()=>set_class(div,1,`flex items-center gap-1 ${className()??""}`)),append($$anchor,div)}var root_1$G=from_html( -'
'),root_4$x=from_html('Stop ',1),root$1m=from_html('
');function ChatFormActions($$anchor,$$props){push$1($$props,!0);let canSend=prop($$props,"canSend",3,!1),canSubmit=prop($$props,"canSubmit",3,!1),className=prop($$props,"class",3,""),disabled=prop($$props,"disabled",3,!1),isLoading2=prop($$props,"isLoading",3,!1),isRecording=prop($$props,"isRecording", -3,!1),showAddButton=prop($$props,"showAddButton",3,!0),showModelSelector=prop($$props,"showModelSelector",3,!0),uploadedFiles=prop($$props,"uploadedFiles",19,()=>[]),currentConfig=user_derived(config$1),hasMcpPromptsSupport=user_derived(()=>{const perChatOverrides=conversationsStore.getAllMcpServerOverrides();return mcpStore.hasPromptsCapability(perChatOverrides)}),hasMcpResourcesSupport=user_derived(()=>{const perChatOverrides=conversationsStore.getAllMcpServerOverrides();return mcpStore.hasResourcesCapability( -perChatOverrides)}),hasAudioModality=state$1(!1),hasVisionModality=state$1(!1),hasModelSelected=state$1(!1),isSelectedModelInCache=state$1(!0),submitTooltip=state$1(""),hasAudioAttachments=user_derived(()=>uploadedFiles().some(file=>getFileTypeCategory(file.type)===FileTypeCategory.AUDIO)),shouldShowRecordButton=user_derived(()=>get$3(hasAudioModality)&&!canSubmit()&&!get$3(hasAudioAttachments)&&get$3(currentConfig).autoMicOnEmpty),selectorModelRef=state$1(void 0);function openModelSelector(){get$3( -selectorModelRef)?.open()}var $$exports={openModelSelector},div=root$1m(),node2=child(div);{var consequent=$$anchor2=>{var div_1=root_1$G(),node_1=child(div_1);ChatFormActionsAdd(node_1,{get disabled(){return disabled()},get hasAudioModality(){return get$3(hasAudioModality)},get hasVisionModality(){return get$3(hasVisionModality)},get hasMcpPromptsSupport(){return get$3(hasMcpPromptsSupport)},get hasMcpResourcesSupport(){return get$3(hasMcpResourcesSupport)},get onFileUpload(){return $$props.onFileUpload}, -get onSystemPromptClick(){return $$props.onSystemPromptClick},get onMcpPromptClick(){return $$props.onMcpPromptClick},get onMcpResourcesClick(){return $$props.onMcpResourcesClick},onMcpSettingsClick:()=>goto("#/settings/mcp")}),reset(div_1),append($$anchor2,div_1)};if_block(node2,$$render=>{showAddButton()&&$$render(consequent)})}var node_2=sibling(node2,2);{var consequent_1=$$anchor2=>{bind_this(ChatFormActionModels($$anchor2,{get disabled(){return disabled()},forceForegroundText:!0,useGlobalSelection:!0, -get hasAudioModality(){return get$3(hasAudioModality)},set hasAudioModality($$value){set$1(hasAudioModality,$$value,!0)},get hasVisionModality(){return get$3(hasVisionModality)},set hasVisionModality($$value){set$1(hasVisionModality,$$value,!0)},get hasModelSelected(){return get$3(hasModelSelected)},set hasModelSelected($$value){set$1(hasModelSelected,$$value,!0)},get isSelectedModelInCache(){return get$3(isSelectedModelInCache)},set isSelectedModelInCache($$value){set$1(isSelectedModelInCache,$$value, -!0)},get submitTooltip(){return get$3(submitTooltip)},set submitTooltip($$value){set$1(submitTooltip,$$value,!0)}}),$$value=>set$1(selectorModelRef,$$value,!0),()=>get$3(selectorModelRef))};if_block(node_2,$$render=>{showModelSelector()&&$$render(consequent_1)})}var node_3=sibling(node_2,2);{var consequent_2=$$anchor2=>{Button($$anchor2,{type:"button",variant:"secondary",get onclick(){return $$props.onStop},class:"group h-8 w-8 rounded-full p-0 hover:bg-destructive/10!",children:($$anchor3,$$slotProps)=>{ -var fragment_2=root_4$x(),node_4=sibling(first_child(fragment_2),2);Square(node_4,{class:"h-8 w-8 fill-muted-foreground stroke-muted-foreground group-hover:fill-destructive group-hover:stroke-destructive hover:fill-destructive hover:stroke-destructive"}),append($$anchor3,fragment_2)},$$slots:{default:!0}})},consequent_3=$$anchor2=>{ChatFormActionRecord($$anchor2,{get disabled(){return disabled()},get hasAudioModality(){return get$3(hasAudioModality)},get isLoading(){return isLoading2()},get isRecording(){ -return isRecording()},get onMicClick(){return $$props.onMicClick}})},alternate=$$anchor2=>{{let $0=user_derived(()=>canSend()&&(showModelSelector()?get$3(hasModelSelected)&&get$3(isSelectedModelInCache):!0)),$1=user_derived(()=>showModelSelector()&&get$3(hasModelSelected)&&!get$3(isSelectedModelInCache));ChatFormActionSubmit($$anchor2,{get canSend(){return get$3($0)},get disabled(){return disabled()},get tooltipLabel(){return get$3(submitTooltip)},get showErrorState(){return get$3($1)}})}};if_block( -node_3,$$render=>{isLoading2()&&!canSubmit()?$$render(consequent_2):get$3(shouldShowRecordButton)?$$render(consequent_3,1):$$render(alternate,-1)})}return reset(div),template_effect(()=>set_class(div,1,`flex w-full items-center gap-3 ${className()??""} ${showAddButton()?"":"justify-end"}`)),append($$anchor,div),pop($$exports)}var root_2$$=from_html('Send ',1),root_6$t=from_html("

"),root_4$w=from_html(" ",1);function ChatFormActionSubmit($$anchor,$$props){ -const submitButton=($$anchor2,$$arg0)=>{let props=derived_safe_equal(()=>fallback($$arg0?.(),()=>({}),!0));{let $0=user_derived(()=>["h-8 w-8 rounded-full p-0",showErrorState()&&"bg-red-400/10 text-red-400 hover:bg-red-400/20 hover:text-red-400 disabled:opacity-100"]);Button($$anchor2,spread_props({type:"submit",get disabled(){return get$3(isDisabled)},get class(){return get$3($0)}},()=>get$3(props),{children:($$anchor3,$$slotProps)=>{var fragment_1=root_2$$(),node2=sibling(first_child(fragment_1), -2);Arrow_up(node2,{class:"h-12 w-12"}),append($$anchor3,fragment_1)},$$slots:{default:!0}}))}};let canSend=prop($$props,"canSend",3,!1),disabled=prop($$props,"disabled",3,!1),showErrorState=prop($$props,"showErrorState",3,!1),isDisabled=user_derived(()=>!canSend()||disabled());var fragment_2=comment$2(),node_1=first_child(fragment_2);{var consequent=$$anchor2=>{var fragment_3=comment$2(),node_2=first_child(fragment_3);component(node_2,()=>Root$5,($$anchor3,Tooltip_Root)=>{Tooltip_Root($$anchor3, -{children:($$anchor4,$$slotProps)=>{var fragment_4=root_4$w(),node_3=first_child(fragment_4);component(node_3,()=>Tooltip_trigger,($$anchor5,Tooltip_Trigger)=>{Tooltip_Trigger($$anchor5,{children:($$anchor6,$$slotProps2)=>{submitButton($$anchor6)},$$slots:{default:!0}})});var node_4=sibling(node_3,2);component(node_4,()=>Tooltip_content,($$anchor5,Tooltip_Content)=>{Tooltip_Content($$anchor5,{children:($$anchor6,$$slotProps2)=>{var p2=root_6$t(),text2=child(p2,!0);reset(p2),template_effect(()=>set_text( -text2,$$props.tooltipLabel)),append($$anchor6,p2)},$$slots:{default:!0}})}),append($$anchor4,fragment_4)},$$slots:{default:!0}})}),append($$anchor2,fragment_3)},alternate=$$anchor2=>{submitButton($$anchor2)};if_block(node_1,$$render=>{$$props.tooltipLabel?$$render(consequent):$$render(alternate,-1)})}append($$anchor,fragment_2)}function ChatFormActionModels($$anchor,$$props){push$1($$props,!0);let disabled=prop($$props,"disabled",3,!1),forceForegroundText=prop($$props,"forceForegroundText",3,!1), -hasAudioModality=prop($$props,"hasAudioModality",15,!1),hasVisionModality=prop($$props,"hasVisionModality",15,!1),hasModelSelected=prop($$props,"hasModelSelected",15,!1),isSelectedModelInCache=prop($$props,"isSelectedModelInCache",15,!0),submitTooltip=prop($$props,"submitTooltip",15,""),useGlobalSelection=prop($$props,"useGlobalSelection",3,!1),isRouter=user_derived(isRouterMode),isOffline=user_derived(()=>!!serverError()),conversationModel=user_derived(()=>chatStore.getConversationModel(activeMessages())), -lastSyncedConversationModel=null;user_effect(()=>{if(get$3(conversationModel)&&get$3(conversationModel)!==lastSyncedConversationModel)lastSyncedConversationModel=get$3(conversationModel),modelsStore.selectModelByName(get$3(conversationModel));else if(get$3(isRouter)&&!modelsStore.selectedModelId&&modelsStore.loadedModelIds.length>0){lastSyncedConversationModel=null;const first=modelOptions().find(m=>modelsStore.loadedModelIds.includes(m.model));first&&modelsStore.selectModelById(first.id)}});let activeModelId=user_derived( -()=>{const options=modelOptions();if(!get$3(isRouter))return options.length>0?options[0].model:null;const selectedId=selectedModelId();if(selectedId){const model=options.find(m=>m.id===selectedId);if(model)return model.model}if(get$3(conversationModel)){const model=options.find(m=>m.model===get$3(conversationModel));if(model)return model.model}return null}),modelPropsVersion=state$1(0);user_effect(()=>{get$3(activeModelId)&&(modelsStore.getModelProps(get$3(activeModelId))||modelsStore.fetchModelProps( -get$3(activeModelId)).then(()=>{update$1(modelPropsVersion)}))}),user_effect(()=>{hasAudioModality(get$3(activeModelId)?modelsStore.modelSupportsAudio(get$3(activeModelId)):!1)}),user_effect(()=>{get$3(modelPropsVersion),hasVisionModality(get$3(activeModelId)?modelsStore.modelSupportsVision(get$3(activeModelId)):!1)}),user_effect(()=>{hasModelSelected(!get$3(isRouter)||!!get$3(conversationModel)||!!selectedModelId())}),user_effect(()=>{if(!get$3(isRouter))isSelectedModelInCache(!0);else if(get$3( -conversationModel))isSelectedModelInCache(modelOptions().some(option2=>option2.model===get$3(conversationModel)));else{const currentModelId=selectedModelId();isSelectedModelInCache(currentModelId?modelOptions().some(option2=>option2.id===currentModelId):!1)}}),user_effect(()=>{hasModelSelected()?isSelectedModelInCache()?submitTooltip(""):submitTooltip("Selected model is not available, please select another"):submitTooltip("Please select a model first")});let selectorModelRef=state$1(void 0),isMobile=new IsMobile; -function open2(){get$3(selectorModelRef)?.open()}var $$exports={open:open2},fragment=comment$2(),node2=first_child(fragment);{var consequent=$$anchor2=>{{let $0=user_derived(()=>disabled()||get$3(isOffline));bind_this(ModelsSelectorSheet($$anchor2,{get disabled(){return get$3($0)},get currentModel(){return $$props.currentModel},get forceForegroundText(){return forceForegroundText()},get useGlobalSelection(){return useGlobalSelection()}}),$$value=>set$1(selectorModelRef,$$value,!0),()=>get$3(selectorModelRef))}}, -alternate=$$anchor2=>{{let $0=user_derived(()=>disabled()||get$3(isOffline));bind_this(ModelsSelectorDropdown($$anchor2,{get disabled(){return get$3($0)},get currentModel(){return $$props.currentModel},get forceForegroundText(){return forceForegroundText()},get useGlobalSelection(){return useGlobalSelection()}}),$$value=>set$1(selectorModelRef,$$value,!0),()=>get$3(selectorModelRef))}};if_block(node2,$$render=>{isMobile.current?$$render(consequent):$$render(alternate,-1)})}return append($$anchor, -fragment),pop($$exports)}function Collapsible($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),open2=prop($$props,"open",15,!1),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref","open"]);var fragment=comment$2(),node2=first_child(fragment);component(node2,()=>Collapsible$1,($$anchor2,CollapsiblePrimitive_Root)=>{CollapsiblePrimitive_Root($$anchor2,spread_props({"data-slot":"collapsible"},()=>restProps,{get ref(){return ref2()},set ref($$value){ref2($$value)}, -get open(){return open2()},set open($$value){open2($$value)}}))}),append($$anchor,fragment),pop()}function Collapsible_trigger($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref"]);var fragment=comment$2(),node2=first_child(fragment);component(node2,()=>Collapsible_trigger$1,($$anchor2,CollapsiblePrimitive_Trigger)=>{CollapsiblePrimitive_Trigger($$anchor2,spread_props({"data-slot":"collapsible-trigger"},()=>restProps, -{get ref(){return ref2()},set ref($$value){ref2($$value)}}))}),append($$anchor,fragment),pop()}function Collapsible_content($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref"]);var fragment=comment$2(),node2=first_child(fragment);component(node2,()=>Collapsible_content$1,($$anchor2,CollapsiblePrimitive_Content)=>{CollapsiblePrimitive_Content($$anchor2,spread_props({"data-slot":"collapsible-content"},()=>restProps, -{get ref(){return ref2()},set ref($$value){ref2($$value)}}))}),append($$anchor,fragment),pop()}function useToolsPanel(){const expandedGroups=new SvelteSet,groups=user_derived(()=>toolsStore.toolGroups),activeGroups=user_derived(()=>get$3(groups).filter(g=>g.source!==ToolSource.MCP||!g.serverId||conversationsStore.isMcpServerEnabledForChat(g.serverId))),totalToolCount=user_derived(()=>get$3(activeGroups).reduce((n,g)=>n+g.tools.length,0)),noToolsInfoMessage=user_derived(()=>toolsStore.loading||toolsStore. -toolGroups.length>0?null:toolsStore.isToolsEndpointUnreachable?"To enable Built-In Tools you need to run llama-server with --tools all or --tools flag. To see MCP Tools you need to add / enable MCP Server(s).":toolsStore.error?null:"To enable Built-In Tools you need to run llama-server with --tools all or --tools flag. To see MCP Tools you need to add / enable MCP Server(s).");function getGroupCheckedState(group){return{checked:toolsStore.isGroupFullyEnabled(group),indeterminate:toolsStore. -isGroupPartiallyEnabled(group)}}function getEnabledToolCount(group){return group.tools.filter(tool=>toolsStore.isToolEnabled(tool.function.name)).length}function getFavicon(group){if(group.source!==ToolSource.MCP)return null;for(const server of mcpStore.getServersSorted())if(mcpStore.getServerLabel(server)===group.label)return mcpStore.getServerFavicon(server.id);return null}function isGroupDisabled(group){return group.source===ToolSource.MCP&&!!group.serverId&&!conversationsStore.isMcpServerEnabledForChat( -group.serverId)}function toggleGroupExpanded(label){expandedGroups.has(label)?expandedGroups.delete(label):expandedGroups.add(label)}function handleOpen(){toolsStore.builtinTools.length===0&&!toolsStore.loading&&toolsStore.fetchBuiltinTools(),mcpStore.runHealthChecksForServers(mcpStore.getServersSorted().filter(s2=>s2.enabled))}return{expandedGroups,get groups(){return get$3(groups)},get activeGroups(){return get$3(activeGroups)},get totalToolCount(){return get$3(totalToolCount)},get noToolsInfoMessage(){ -return get$3(noToolsInfoMessage)},getGroupCheckedState,getEnabledToolCount,getFavicon,isGroupDisabled,toggleGroupExpanded,handleOpen}}var root_2$_=from_html(" Tools",1),root_5$t=from_html('
Loading tools...
'),root_6$s=from_html('
Run llama-server with --tools flag to enable Built-in Tools\ -. MCP Tools.
'),root_7$p=from_html('
Failed to load tools
'),root_8$q=from_html('
'),root_9$j=from_html('
No tools available
'),root_16$3=from_html(''),root_13$b=from_html(' ',1),root_19$8=from_html("

"),root_17$6=from_html(" ",1),root_21$4=from_html(''),root_20$2=from_html('
'),root_12$8=from_html('
',1),root_10$d=from_html('
'),root_1$F=from_html(" ",1);function ChatFormActionAddToolsSubmenu($$anchor,$$props){push$1($$props,!0);const toolsPanel=useToolsPanel(),hasMcpServersAvailable=user_derived(()=>mcpStore.getServersSorted(). -length>0);var fragment=comment$2(),node2=first_child(fragment);component(node2,()=>Sub,($$anchor2,DropdownMenu_Sub)=>{DropdownMenu_Sub($$anchor2,{onOpenChange:open2=>open2&&toolsPanel.handleOpen(),children:($$anchor3,$$slotProps)=>{var fragment_1=root_1$F(),node_1=first_child(fragment_1);component(node_1,()=>Dropdown_menu_sub_trigger,($$anchor4,DropdownMenu_SubTrigger)=>{DropdownMenu_SubTrigger($$anchor4,{class:"flex cursor-pointer items-center gap-2",children:($$anchor5,$$slotProps2)=>{var fragment_2=root_2$_(), -node_2=first_child(fragment_2);Pencil_ruler(node_2,{class:"h-4 w-4"}),next$1(2),append($$anchor5,fragment_2)},$$slots:{default:!0}})});var node_3=sibling(node_1,2);component(node_3,()=>Dropdown_menu_sub_content,($$anchor4,DropdownMenu_SubContent)=>{DropdownMenu_SubContent($$anchor4,{class:"w-72 p-0",children:($$anchor5,$$slotProps2)=>{var fragment_3=comment$2(),node_4=first_child(fragment_3);{var consequent_4=$$anchor6=>{var fragment_4=comment$2(),node_5=first_child(fragment_4);{var consequent=$$anchor7=>{ -var div=root_5$t(),node_6=child(div);Loader_circle(node_6,{class:"mx-auto mb-1 h-4 w-4 animate-spin"}),next$1(),reset(div),append($$anchor7,div)},consequent_1=$$anchor7=>{var div_1=root_6$s(),span=child(div_1),node_7=child(span);Info$1(node_7,{class:"mt-0.5 h-4 w-4 shrink-0"}),next$1(2),reset(span);var span_1=sibling(span,2),node_8=child(span_1);Info$1(node_8,{class:"mt-0.5 h-4 w-4 shrink-0"});var span_2=sibling(node_8,2),text2=child(span_2);next$1(2),reset(span_2),reset(span_1),reset(div_1),template_effect( -()=>set_text(text2,`${get$3(hasMcpServersAvailable)?"Enable":"Add"} MCP Server(s) to access `)),append($$anchor7,div_1)},consequent_2=$$anchor7=>{var div_2=root_7$p();append($$anchor7,div_2)},consequent_3=$$anchor7=>{var div_3=root_8$q(),node_9=child(div_3);Info$1(node_9,{class:"mt-0.5 h-4 w-4 shrink-0"});var span_3=sibling(node_9,2),text_1=child(span_3,!0);reset(span_3),reset(div_3),template_effect(()=>set_text(text_1,toolsPanel.noToolsInfoMessage)),append($$anchor7,div_3)},alternate=$$anchor7=>{ -var div_4=root_9$j();append($$anchor7,div_4)};if_block(node_5,$$render=>{toolsStore.loading?$$render(consequent):toolsStore.isToolsEndpointUnreachable?$$render(consequent_1,1):toolsStore.error?$$render(consequent_2,2):toolsPanel.noToolsInfoMessage?$$render(consequent_3,3):$$render(alternate,-1)})}append($$anchor6,fragment_4)},alternate_2=$$anchor6=>{var div_5=root_10$d();each(div_5,21,()=>toolsPanel.activeGroups,group=>group.label,($$anchor7,group)=>{const isExpanded=user_derived(()=>toolsPanel. -expandedGroups.has(get$3(group).label)),computed_const=user_derived(()=>{const{checked,indeterminate}=toolsPanel.getGroupCheckedState(get$3(group));return{checked,indeterminate}}),favicon=user_derived(()=>toolsPanel.getFavicon(get$3(group)));var fragment_5=comment$2(),node_10=first_child(fragment_5);component(node_10,()=>Collapsible,($$anchor8,Collapsible_Root)=>{Collapsible_Root($$anchor8,{get open(){return get$3(isExpanded)},onOpenChange:()=>toolsPanel.toggleGroupExpanded(get$3(group).label),children:($$anchor9,$$slotProps3)=>{ -var fragment_6=root_12$8(),div_6=first_child(fragment_6),node_11=child(div_6);component(node_11,()=>Collapsible_trigger,($$anchor10,Collapsible_Trigger)=>{Collapsible_Trigger($$anchor10,{class:"flex min-w-0 flex-1 items-center gap-2 rounded px-2 py-1.5 text-sm hover:bg-muted/50",children:($$anchor11,$$slotProps4)=>{var fragment_7=root_13$b(),node_12=first_child(fragment_7);{var consequent_5=$$anchor12=>{Chevron_down($$anchor12,{class:"h-3.5 w-3.5 shrink-0"})},alternate_1=$$anchor12=>{Chevron_right( -$$anchor12,{class:"h-3.5 w-3.5 shrink-0"})};if_block(node_12,$$render=>{get$3(isExpanded)?$$render(consequent_5):$$render(alternate_1,-1)})}var span_4=sibling(node_12,2),node_13=child(span_4);{var consequent_6=$$anchor12=>{var img=root_16$3();template_effect(()=>set_attribute(img,"src",get$3(favicon))),event("error",img,e=>{e.currentTarget.style.display="none"}),replay_events(img),append($$anchor12,img)};if_block(node_13,$$render=>{get$3(favicon)&&$$render(consequent_6)})}var span_5=sibling(node_13, -2),text_2=child(span_5,!0);reset(span_5),reset(span_4);var span_6=sibling(span_4,2),text_3=child(span_6);reset(span_6),template_effect($0=>{set_text(text_2,get$3(group).label),set_text(text_3,`${$0??""}/${get$3(group).tools.length??""}`)},[()=>toolsPanel.getEnabledToolCount(get$3(group))]),append($$anchor11,fragment_7)},$$slots:{default:!0}})});var node_14=sibling(node_11,2);component(node_14,()=>Root$5,($$anchor10,Tooltip_Root)=>{Tooltip_Root($$anchor10,{children:($$anchor11,$$slotProps4)=>{var fragment_10=root_17$6(), -node_15=first_child(fragment_10);component(node_15,()=>Tooltip_trigger,($$anchor12,Tooltip_Trigger)=>{Tooltip_Trigger($$anchor12,{children:($$anchor13,$$slotProps5)=>{Checkbox($$anchor13,{get checked(){return get$3(computed_const).checked},get indeterminate(){return get$3(computed_const).indeterminate},onCheckedChange:()=>toolsStore.toggleGroup(get$3(group)),class:"mr-2 h-4 w-4 shrink-0"})},$$slots:{default:!0}})});var node_16=sibling(node_15,2);component(node_16,()=>Tooltip_content,($$anchor12,Tooltip_Content)=>{ -Tooltip_Content($$anchor12,{side:"right",children:($$anchor13,$$slotProps5)=>{var p2=root_19$8(),text_4=child(p2);reset(p2),template_effect(()=>set_text(text_4,`${get$3(computed_const).checked?"Disable":"Enable"} +$$props.isImage?$$render(consequent_1,1):$$props.isText&&$$props.displayTextContent?$$render(consequent_2,2):$$props.isAudio?$$render(consequent_3,3):get$3(isUnavailable)&&$$render(consequent_4,4)})}append($$anchor3,fragment_2)}),append($$anchor2,fragment_1)};if_block(node2,$$render=>{$$props.currentItem&&$$render(consequent_5)})}append($$anchor,fragment),pop()}class ChatService{static async sendMessage(messages,options={},conversationId,signal){const{stream,onChunk,onComplete,onError,onReasoningChunk, +onToolCallChunk,onModel,onTimings,tools,temperature,max_tokens,dynatemp_range,dynatemp_exponent,top_k,top_p,min_p,xtc_probability,xtc_threshold,typ_p,repeat_last_n,repeat_penalty,presence_penalty,frequency_penalty,dry_multiplier,dry_base,dry_allowed_length,dry_penalty_last_n,samplers,backend_sampling,custom:custom2,timings_per_token,disableReasoningParsing,excludeReasoningFromContext}=options,normalizedMessages=messages.map(msg=>{if("id"in msg&&"convId"in msg&&"timestamp"in msg){const dbMsg=msg; +return ChatService.convertDbMessageToApiChatMessageData(dbMsg)}else return msg}).filter(msg=>msg.role===MessageRole.SYSTEM?(typeof msg.content=="string"?msg.content:"").trim().length>0:!0);options.model&&!modelsStore.modelSupportsVision(options.model)&&normalizedMessages.forEach(msg=>{Array.isArray(msg.content)&&(msg.content=msg.content.filter(part=>part.type===ContentPartType.IMAGE_URL?(console.info(`[ChatService] Skipping image attachment in message history (model "${options.model}" does not s\ +upport vision)`),!1):!0),msg.content.length===1&&msg.content[0].type===ContentPartType.TEXT&&(msg.content=msg.content[0].text))});const requestBody={messages:normalizedMessages.map(msg=>{const mapped={role:msg.role,content:msg.content,tool_calls:msg.tool_calls,tool_call_id:msg.tool_call_id};return!excludeReasoningFromContext&&msg.reasoning_content&&(mapped.reasoning_content=msg.reasoning_content),mapped}),stream,return_progress:stream?!0:void 0,tools:tools&&tools.length>0?tools:void 0};if(options. +model&&(requestBody.model=options.model),requestBody.reasoning_format=disableReasoningParsing?ReasoningFormat.NONE:ReasoningFormat.AUTO,temperature!==void 0&&(requestBody.temperature=temperature),max_tokens!==void 0&&(requestBody.max_tokens=max_tokens!==null&&max_tokens!==0?max_tokens:-1),dynatemp_range!==void 0&&(requestBody.dynatemp_range=dynatemp_range),dynatemp_exponent!==void 0&&(requestBody.dynatemp_exponent=dynatemp_exponent),top_k!==void 0&&(requestBody.top_k=top_k),top_p!==void 0&&(requestBody. +top_p=top_p),min_p!==void 0&&(requestBody.min_p=min_p),xtc_probability!==void 0&&(requestBody.xtc_probability=xtc_probability),xtc_threshold!==void 0&&(requestBody.xtc_threshold=xtc_threshold),typ_p!==void 0&&(requestBody.typ_p=typ_p),repeat_last_n!==void 0&&(requestBody.repeat_last_n=repeat_last_n),repeat_penalty!==void 0&&(requestBody.repeat_penalty=repeat_penalty),presence_penalty!==void 0&&(requestBody.presence_penalty=presence_penalty),frequency_penalty!==void 0&&(requestBody.frequency_penalty= +frequency_penalty),dry_multiplier!==void 0&&(requestBody.dry_multiplier=dry_multiplier),dry_base!==void 0&&(requestBody.dry_base=dry_base),dry_allowed_length!==void 0&&(requestBody.dry_allowed_length=dry_allowed_length),dry_penalty_last_n!==void 0&&(requestBody.dry_penalty_last_n=dry_penalty_last_n),samplers!==void 0&&(requestBody.samplers=typeof samplers=="string"?samplers.split(";").filter(s2=>s2.trim()):samplers),backend_sampling!==void 0&&(requestBody.backend_sampling=backend_sampling),timings_per_token!== +void 0&&(requestBody.timings_per_token=timings_per_token),custom2)try{const customParams=typeof custom2=="string"?JSON.parse(custom2):custom2;Object.assign(requestBody,customParams)}catch(error2){console.warn("Failed to parse custom parameters:",error2)}try{const response=await fetch("./v1/chat/completions",{method:"POST",headers:getJsonHeaders(),body:JSON.stringify(requestBody),signal});if(!response.ok){const error2=await ChatService.parseErrorResponse(response);throw onError&&onError(error2),error2} +if(stream){await ChatService.handleStreamResponse(response,onChunk,onComplete,onError,onReasoningChunk,onToolCallChunk,onModel,onTimings,conversationId,signal);return}else return ChatService.handleNonStreamResponse(response,onComplete,onError,onToolCallChunk,onModel)}catch(error2){if(isAbortError(error2)){console.log("Chat completion request was aborted");return}let userFriendlyError;throw error2 instanceof Error?error2.name==="TypeError"&&error2.message.includes("fetch")?(userFriendlyError=new Error( +"Unable to connect to server - please check if the server is running"),userFriendlyError.name="NetworkError"):error2.message.includes("ECONNREFUSED")?(userFriendlyError=new Error("Connection refused - server may be offline"),userFriendlyError.name="NetworkError"):error2.message.includes("ETIMEDOUT")?(userFriendlyError=new Error("Request timed out - the server took too long to respond"),userFriendlyError.name="TimeoutError"):userFriendlyError=error2:userFriendlyError=new Error("Unknown error occu\ +rred while sending message"),console.error("Error in sendMessage:",error2),onError&&onError(userFriendlyError),userFriendlyError}}static async areAllSlotsIdle(model,signal){try{const url2=model?`./slots?model=${encodeURIComponent(model)}`:"./slots",res=await fetch(url2,{signal});return res.ok?(await res.json()).every(s2=>!s2.is_processing):!0}catch{return!0}}static async preEncode(messages,model,excludeReasoning,signal){const requestBody={messages:messages.map(msg=>"id"in msg&&"convId"in msg&&"t\ +imestamp"in msg?ChatService.convertDbMessageToApiChatMessageData(msg):msg).filter(msg=>msg.role===MessageRole.SYSTEM?(typeof msg.content=="string"?msg.content:"").trim().length>0:!0).map(msg=>{const mapped={role:msg.role,content:excludeReasoning?ChatService.stripReasoningContent(msg.content):msg.content,tool_calls:msg.tool_calls,tool_call_id:msg.tool_call_id};return!excludeReasoning&&msg.reasoning_content&&(mapped.reasoning_content=msg.reasoning_content),mapped}),stream:!1,n_predict:0};model&&(requestBody. +model=model);try{await fetch("./v1/chat/completions",{method:"POST",headers:getJsonHeaders(),body:JSON.stringify(requestBody),signal})}catch(error2){isAbortError(error2)||console.warn("[ChatService] Pre-encode request failed:",error2)}}static async handleStreamResponse(response,onChunk,onComplete,onError,onReasoningChunk,onToolCallChunk,onModel,onTimings,conversationId,abortSignal){const reader=response.body?.getReader();if(!reader)throw new Error("No response body");const decoder=new TextDecoder; +let aggregatedContent="",fullReasoningContent="",aggregatedToolCalls=[],lastTimings,streamFinished=!1,modelEmitted=!1,toolCallIndexOffset=0,hasOpenToolCallBatch=!1;const finalizeOpenToolCallBatch=()=>{hasOpenToolCallBatch&&(toolCallIndexOffset=aggregatedToolCalls.length,hasOpenToolCallBatch=!1)},processToolCallDelta=toolCalls=>{if(!toolCalls||toolCalls.length===0||(aggregatedToolCalls=ChatService.mergeToolCallDeltas(aggregatedToolCalls,toolCalls,toolCallIndexOffset),aggregatedToolCalls.length=== +0))return;hasOpenToolCallBatch=!0;const serializedToolCalls=JSON.stringify(aggregatedToolCalls);serializedToolCalls&&(abortSignal?.aborted||onToolCallChunk?.(serializedToolCalls))};try{let chunk="";for(;!abortSignal?.aborted;){const{done,value}=await reader.read();if(done||abortSignal?.aborted)break;chunk+=decoder.decode(value,{stream:!0});const lines=chunk.split(` +`);chunk=lines.pop()||"";for(const line of lines){if(abortSignal?.aborted)break;if(line.startsWith(UrlProtocol.DATA)){const data=line.slice(6);if(data==="[DONE]"){streamFinished=!0;continue}try{const parsed=JSON.parse(data),choice=parsed.choices?.[0],content2=choice?.delta?.content,reasoningContent=choice?.delta?.reasoning_content,toolCalls=choice?.delta?.tool_calls,timings=parsed.timings,promptProgress=parsed.prompt_progress,chunkModel=ChatService.extractModelName(parsed);chunkModel&&!modelEmitted&& +(modelEmitted=!0,onModel?.(chunkModel)),promptProgress&&ChatService.notifyTimings(void 0,promptProgress,onTimings),timings&&(ChatService.notifyTimings(timings,promptProgress,onTimings),lastTimings=timings),content2&&(finalizeOpenToolCallBatch(),aggregatedContent+=content2,abortSignal?.aborted||onChunk?.(content2)),reasoningContent&&(finalizeOpenToolCallBatch(),fullReasoningContent+=reasoningContent,abortSignal?.aborted||onReasoningChunk?.(reasoningContent)),processToolCallDelta(toolCalls)}catch(e){ +console.error("Error parsing JSON chunk:",e)}}}if(abortSignal?.aborted)break}if(abortSignal?.aborted)return;if(streamFinished){finalizeOpenToolCallBatch();const finalToolCalls=aggregatedToolCalls.length>0?JSON.stringify(aggregatedToolCalls):void 0;onComplete?.(aggregatedContent,fullReasoningContent||void 0,lastTimings,finalToolCalls)}}catch(error2){const err=error2 instanceof Error?error2:new Error("Stream error");throw onError?.(err),err}finally{reader.releaseLock()}}static async handleNonStreamResponse(response,onComplete,onError,onToolCallChunk,onModel){ +try{const responseText=await response.text();if(!responseText.trim())throw new Error("No response received from server. Please try again.");const data=JSON.parse(responseText),responseModel=ChatService.extractModelName(data);responseModel&&onModel?.(responseModel);const content2=data.choices[0]?.message?.content||"",reasoningContent=data.choices[0]?.message?.reasoning_content,toolCalls=data.choices[0]?.message?.tool_calls;let serializedToolCalls;if(toolCalls&&toolCalls.length>0){const mergedToolCalls=ChatService. +mergeToolCallDeltas([],toolCalls);mergedToolCalls.length>0&&(serializedToolCalls=JSON.stringify(mergedToolCalls),serializedToolCalls&&onToolCallChunk?.(serializedToolCalls))}if(!content2.trim()&&!serializedToolCalls)throw new Error("No response received from server. Please try again.");return onComplete?.(content2,reasoningContent,void 0,serializedToolCalls),content2}catch(error2){const err=error2 instanceof Error?error2:new Error("Parse error");throw onError?.(err),err}}static mergeToolCallDeltas(existing,deltas,indexOffset=0){ +const result=existing.map(call=>({...call,function:call.function?{...call.function}:void 0}));for(const delta of deltas){const index2=typeof delta.index=="number"&&delta.index>=0?delta.index+indexOffset:result.length;for(;result.length<=index2;)result.push({function:void 0});const target2=result[index2];if(delta.id&&(target2.id=delta.id),delta.type&&(target2.type=delta.type),delta.function){const fn=target2.function?{...target2.function}:{};delta.function.name&&(fn.name=delta.function.name),delta. +function.arguments&&(fn.arguments=(fn.arguments??"")+delta.function.arguments),target2.function=fn}}return result}static convertDbMessageToApiChatMessageData(message){if(message.role===MessageRole.TOOL&&message.toolCallId)return{role:MessageRole.TOOL,content:message.content,tool_call_id:message.toolCallId};let toolCalls;if(message.toolCalls)try{toolCalls=JSON.parse(message.toolCalls)}catch{}if(!message.extra||message.extra.length===0){const result2={role:message.role,content:message.content};return message. +reasoningContent&&(result2.reasoning_content=message.reasoningContent),toolCalls&&toolCalls.length>0&&(result2.tool_calls=toolCalls),result2}const contentParts=[];message.content&&contentParts.push({type:ContentPartType.TEXT,text:message.content});const imageFiles=message.extra.filter(extra=>extra.type===AttachmentType.IMAGE);for(const image2 of imageFiles)contentParts.push({type:ContentPartType.IMAGE_URL,image_url:{url:image2.base64Url}});const textFiles=message.extra.filter(extra=>extra.type=== +AttachmentType.TEXT);for(const textFile of textFiles)contentParts.push({type:ContentPartType.TEXT,text:formatAttachmentText("File",textFile.name,textFile.content)});const legacyContextFiles=message.extra.filter(extra=>extra.type===AttachmentType.LEGACY_CONTEXT);for(const legacyContextFile of legacyContextFiles)contentParts.push({type:ContentPartType.TEXT,text:formatAttachmentText("File",legacyContextFile.name,legacyContextFile.content)});const audioFiles=message.extra.filter(extra=>extra.type=== +AttachmentType.AUDIO);for(const audio of audioFiles)contentParts.push({type:ContentPartType.INPUT_AUDIO,input_audio:{data:audio.base64Data,format:audio.mimeType.includes("wav")?"wav":"mp3"}});const pdfFiles=message.extra.filter(extra=>extra.type===AttachmentType.PDF);for(const pdfFile of pdfFiles)if(pdfFile.processedAsImages&&pdfFile.images)for(let i=0;iextra.type===AttachmentType.MCP_PROMPT);for(const mcpPrompt of mcpPrompts)contentParts.push({type:ContentPartType.TEXT,text:formatAttachmentText(ATTACHMENT_LABEL_MCP_PROMPT,mcpPrompt.name,mcpPrompt.content,mcpPrompt.serverName)});const mcpResources2=message.extra.filter(extra=>extra.type===AttachmentType.MCP_RESOURCE);for(const mcpResource of mcpResources2)contentParts. +push({type:ContentPartType.TEXT,text:formatAttachmentText(ATTACHMENT_LABEL_MCP_RESOURCE,mcpResource.name,mcpResource.content,mcpResource.serverName)});const result={role:message.role,content:contentParts};return message.reasoningContent&&(result.reasoning_content=message.reasoningContent),toolCalls&&toolCalls.length>0&&(result.tool_calls=toolCalls),result}static stripReasoningContent(content2){const stripFromString=text2=>text2.replace(LEGACY_AGENTIC_REGEX.REASONING_BLOCK,"").trim();return typeof content2== +"string"?stripFromString(content2):content2.map(part=>part.type===ContentPartType.TEXT&&part.text?{...part,text:stripFromString(part.text)}:part)}static async parseErrorResponse(response){try{const errorText=await response.text(),errorData=JSON.parse(errorText),message=errorData.error?.message||"Unknown server error",error2=new Error(message);return error2.name=response.status===400?"ServerError":"HttpError",errorData.error&&"n_prompt_tokens"in errorData.error&&"n_ctx"in errorData.error&&(error2. +contextInfo={n_prompt_tokens:errorData.error.n_prompt_tokens,n_ctx:errorData.error.n_ctx}),error2}catch{const fallback2=new Error(`Server error (${response.status}): ${response.statusText}`);return fallback2.name="HttpError",fallback2}}static extractModelName(data){const asRecord=value=>typeof value=="object"&&value!==null?value:void 0,getTrimmedString=value=>typeof value=="string"&&value.trim()?value.trim():void 0,root2=asRecord(data);if(!root2)return;const rootModel=getTrimmedString(root2.model); +if(rootModel)return rootModel;const firstChoice=Array.isArray(root2.choices)?asRecord(root2.choices[0]):void 0;if(!firstChoice)return;const deltaModel=getTrimmedString(asRecord(firstChoice.delta)?.model);if(deltaModel)return deltaModel;const messageModel=getTrimmedString(asRecord(firstChoice.message)?.model);if(messageModel)return messageModel}static notifyTimings(timings,promptProgress,onTimingsCallback){!onTimingsCallback||!timings&&!promptProgress||onTimingsCallback(timings,promptProgress)}}class ConversationsStore{#conversations=state$1( +proxy([]));get conversations(){return get$3(this.#conversations)}set conversations(value){set$1(this.#conversations,value,!0)}#activeConversation=state$1(null);get activeConversation(){return get$3(this.#activeConversation)}set activeConversation(value){set$1(this.#activeConversation,value,!0)}#activeMessages=state$1(proxy([]));get activeMessages(){return get$3(this.#activeMessages)}set activeMessages(value){set$1(this.#activeMessages,value,!0)}#isInitialized=state$1(!1);get isInitialized(){return get$3( +this.#isInitialized)}set isInitialized(value){set$1(this.#isInitialized,value,!0)}#pendingMcpServerOverrides=state$1(proxy(ConversationsStore.loadMcpDefaults()));get pendingMcpServerOverrides(){return get$3(this.#pendingMcpServerOverrides)}set pendingMcpServerOverrides(value){set$1(this.#pendingMcpServerOverrides,value,!0)}static loadMcpDefaults(){if(typeof globalThis.localStorage>"u")return[];try{const raw2=localStorage.getItem(MCP_DEFAULT_ENABLED_LOCALSTORAGE_KEY);if(!raw2)return[];const parsed=JSON. +parse(raw2);return Array.isArray(parsed)?parsed.filter(o=>typeof o=="object"&&o!==null&&"serverId"in o&&"enabled"in o):[]}catch{return[]}}saveMcpDefaults(){if(typeof globalThis.localStorage>"u")return;const plain=this.pendingMcpServerOverrides.map(o=>({serverId:o.serverId,enabled:o.enabled}));plain.length>0?localStorage.setItem(MCP_DEFAULT_ENABLED_LOCALSTORAGE_KEY,JSON.stringify(plain)):localStorage.removeItem(MCP_DEFAULT_ENABLED_LOCALSTORAGE_KEY)}titleUpdateConfirmationCallback;messageUpdateCallback=null;async init(){ +if(!this.isInitialized)try{await runLegacyMigration(),await this.loadConversations(),this.isInitialized=!0}catch(error2){console.error("Failed to initialize conversations:",error2)}}async initialize(){return this.init()}registerMessageUpdateCallback(callback){this.messageUpdateCallback=callback}addMessageToActive(message){this.activeMessages.push(message)}updateMessageAtIndex(index2,updates){index2!==-1&&this.activeMessages[index2]&&(this.activeMessages[index2]={...this.activeMessages[index2],...updates})}findMessageIndex(messageId){ +return this.activeMessages.findIndex(m=>m.id===messageId)}sliceActiveMessages(startIndex){this.activeMessages=this.activeMessages.slice(0,startIndex)}removeMessageAtIndex(index2){if(index2!==-1)return this.activeMessages.splice(index2,1)[0]}setTitleUpdateConfirmationCallback(callback){this.titleUpdateConfirmationCallback=callback}async loadConversations(){const conversations2=await DatabaseService.getAllConversations();this.conversations=conversations2}async createConversation(name){const conversationName=name|| +`Chat ${new Date().toLocaleString()}`,conversation=await DatabaseService.createConversation(conversationName);if(this.pendingMcpServerOverrides.length>0){const plainOverrides=this.pendingMcpServerOverrides.map(o=>({serverId:o.serverId,enabled:o.enabled}));conversation.mcpServerOverrides=plainOverrides,await DatabaseService.updateConversation(conversation.id,{mcpServerOverrides:plainOverrides}),this.pendingMcpServerOverrides=[]}return this.conversations=[conversation,...this.conversations],this.activeConversation= +conversation,this.activeMessages=[],await goto(`#/chat/${conversation.id}`),conversation.id}async loadConversation(convId){try{const conversation=await DatabaseService.getConversation(convId);if(!conversation)return!1;if(this.pendingMcpServerOverrides=[],this.activeConversation=conversation,conversation.currNode){const allMessages=await DatabaseService.getConversationMessages(convId),filteredMessages=filterByLeafNodeId(allMessages,conversation.currNode,!1);this.activeMessages=filteredMessages}else{ +const messages=await DatabaseService.getConversationMessages(convId);this.activeMessages=messages}return!0}catch(error2){return console.error("Failed to load conversation:",error2),!1}}clearActiveConversation(){this.activeConversation=null,this.activeMessages=[],this.pendingMcpServerOverrides=ConversationsStore.loadMcpDefaults()}async deleteConversation(convId,options){try{if(await DatabaseService.deleteConversation(convId,options),options?.deleteWithForks){const idsToRemove=new SvelteSet([convId]), +queue=[convId];for(;queue.length>0;){const parentId=queue.pop();for(const c2 of this.conversations)c2.forkedFromConversationId===parentId&&!idsToRemove.has(c2.id)&&(idsToRemove.add(c2.id),queue.push(c2.id))}this.conversations=this.conversations.filter(c2=>!idsToRemove.has(c2.id)),this.activeConversation&&idsToRemove.has(this.activeConversation.id)&&(this.clearActiveConversation(),await goto("?new_chat=true#/"))}else{const newParent=this.conversations.find(c2=>c2.id===convId)?.forkedFromConversationId; +this.conversations=this.conversations.filter(c2=>c2.id!==convId).map(c2=>c2.forkedFromConversationId===convId?{...c2,forkedFromConversationId:newParent}:c2),this.activeConversation?.id===convId&&(this.clearActiveConversation(),await goto("?new_chat=true#/"))}}catch(error2){console.error("Failed to delete conversation:",error2)}}async deleteAll(){try{const allConversations=await DatabaseService.getAllConversations();for(const conv of allConversations)await DatabaseService.deleteConversation(conv. +id);this.clearActiveConversation(),this.conversations=[],toast.success("All conversations deleted"),await goto("?new_chat=true#/")}catch(error2){console.error("Failed to delete all conversations:",error2),toast.error("Failed to delete conversations")}}async refreshActiveMessages(){if(!this.activeConversation)return;const allMessages=await DatabaseService.getConversationMessages(this.activeConversation.id);if(allMessages.length===0){this.activeMessages=[];return}const leafNodeId=this.activeConversation. +currNode||allMessages.reduce((latest,msg)=>msg.timestamp>latest.timestamp?msg:latest).id,currentPath=filterByLeafNodeId(allMessages,leafNodeId,!1);this.activeMessages=currentPath}async getConversationMessages(convId){return await DatabaseService.getConversationMessages(convId)}async updateConversationName(convId,name){try{await DatabaseService.updateConversation(convId,{name});const convIndex=this.conversations.findIndex(c2=>c2.id===convId);convIndex!==-1&&(this.conversations[convIndex].name=name, +this.conversations=[...this.conversations]),this.activeConversation?.id===convId&&(this.activeConversation={...this.activeConversation,name})}catch(error2){console.error("Failed to update conversation name:",error2)}}async updateConversationTitleWithConfirmation(convId,newTitle){try{if(config$1().askForTitleConfirmation&&this.titleUpdateConfirmationCallback){const conversation=await DatabaseService.getConversation(convId);if(!conversation||!await this.titleUpdateConfirmationCallback(conversation. +name,newTitle))return!1}return await this.updateConversationName(convId,newTitle),!0}catch(error2){return console.error("Failed to update conversation title with confirmation:",error2),!1}}updateConversationTimestamp(){if(!this.activeConversation)return;const chatIndex=this.conversations.findIndex(c2=>c2.id===this.activeConversation.id);if(chatIndex!==-1){this.conversations[chatIndex].lastModified=Date.now();const updatedConv=this.conversations.splice(chatIndex,1)[0];this.conversations=[updatedConv, +...this.conversations]}}async updateCurrentNode(nodeId){this.activeConversation&&(await DatabaseService.updateCurrentNode(this.activeConversation.id,nodeId),this.activeConversation={...this.activeConversation,currNode:nodeId})}async navigateToSibling(siblingId){if(!this.activeConversation)return;const allMessages=await DatabaseService.getConversationMessages(this.activeConversation.id),rootMessage=allMessages.find(m=>m.type==="root"&&m.parent===null),currentFirstUserMessage=this.activeMessages.find( +m=>m.role===MessageRole.USER&&m.parent===rootMessage?.id),currentLeafNodeId=findLeafNode(allMessages,siblingId);if(await DatabaseService.updateCurrentNode(this.activeConversation.id,currentLeafNodeId),this.activeConversation={...this.activeConversation,currNode:currentLeafNodeId},await this.refreshActiveMessages(),rootMessage&&this.activeMessages.length>0){const newFirstUserMessage=this.activeMessages.find(m=>m.role===MessageRole.USER&&m.parent===rootMessage.id);newFirstUserMessage&&newFirstUserMessage. +content.trim()&&(!currentFirstUserMessage||newFirstUserMessage.id!==currentFirstUserMessage.id||newFirstUserMessage.content.trim()!==currentFirstUserMessage.content.trim())&&await this.updateConversationTitleWithConfirmation(this.activeConversation.id,generateConversationTitle(newFirstUserMessage.content,!!config$1().titleGenerationUseFirstLine))}}getMcpServerOverride(serverId){return this.activeConversation?this.activeConversation.mcpServerOverrides?.find(o=>o.serverId===serverId):this.pendingMcpServerOverrides. +find(o=>o.serverId===serverId)}getAllMcpServerOverrides(){return this.activeConversation?.mcpServerOverrides?this.activeConversation.mcpServerOverrides:this.pendingMcpServerOverrides}isMcpServerEnabledForChat(serverId){return this.getMcpServerOverride(serverId)?.enabled??!1}async setMcpServerOverride(serverId,enabled){if(!this.activeConversation){this.setPendingMcpServerOverride(serverId,enabled);return}const currentOverrides=(this.activeConversation.mcpServerOverrides||[]).map(o=>({serverId:o.serverId, +enabled:o.enabled}));let newOverrides;if(enabled===void 0)newOverrides=currentOverrides.filter(o=>o.serverId!==serverId);else{const existingIndex=currentOverrides.findIndex(o=>o.serverId===serverId);existingIndex>=0?(newOverrides=[...currentOverrides],newOverrides[existingIndex]={serverId,enabled}):newOverrides=[...currentOverrides,{serverId,enabled}]}await DatabaseService.updateConversation(this.activeConversation.id,{mcpServerOverrides:newOverrides.length>0?newOverrides:void 0}),this.activeConversation= +{...this.activeConversation,mcpServerOverrides:newOverrides.length>0?newOverrides:void 0};const convIndex=this.conversations.findIndex(c2=>c2.id===this.activeConversation.id);convIndex!==-1&&(this.conversations[convIndex].mcpServerOverrides=newOverrides.length>0?newOverrides:void 0,this.conversations=[...this.conversations])}setPendingMcpServerOverride(serverId,enabled){if(enabled===void 0)this.pendingMcpServerOverrides=this.pendingMcpServerOverrides.filter(o=>o.serverId!==serverId);else{const existingIndex=this. +pendingMcpServerOverrides.findIndex(o=>o.serverId===serverId);if(existingIndex>=0){const newOverrides=[...this.pendingMcpServerOverrides];newOverrides[existingIndex]={serverId,enabled},this.pendingMcpServerOverrides=newOverrides}else this.pendingMcpServerOverrides=[...this.pendingMcpServerOverrides,{serverId,enabled}]}this.saveMcpDefaults()}async toggleMcpServerForChat(serverId){const currentEnabled=this.isMcpServerEnabledForChat(serverId);await this.setMcpServerOverride(serverId,!currentEnabled)}async removeMcpServerOverride(serverId){ +await this.setMcpServerOverride(serverId,void 0)}clearPendingMcpServerOverrides(){this.pendingMcpServerOverrides=[],this.saveMcpDefaults()}async forkConversation(messageId,options){if(!this.activeConversation)return null;try{const newConv=await DatabaseService.forkConversation(this.activeConversation.id,messageId,options);return this.conversations=[newConv,...this.conversations],await goto(`#/chat/${newConv.id}`),toast.success("Conversation forked"),newConv.id}catch(error2){return console.error( +"Failed to fork conversation:",error2),toast.error("Failed to fork conversation"),null}}generateConversationFilename(conversation,msgs){const sanitizedName=(conversation.name??"").trim().toLowerCase().replace(NON_ALPHANUMERIC_REGEX,EXPORT_CONV_NONALNUM_REPLACEMENT).replace(MULTIPLE_UNDERSCORE_REGEX,"_").substring(0,EXPORT_CONV_NAME_SUFFIX_MAX_LENGTH),formattedDate=(msgs?.length?new Date(Math.max(...msgs.map(m=>m.timestamp))):new Date).toISOString().slice(0,ISO_TIMESTAMP_SLICE_LENGTH).replace(ISO_DATE_TIME_SEPARATOR, +ISO_DATE_TIME_SEPARATOR_REPLACEMENT).replaceAll(ISO_TIME_SEPARATOR,ISO_TIME_SEPARATOR_REPLACEMENT),trimmedConvId=conversation.id?.slice(0,EXPORT_CONV_ID_TRIM_LENGTH)??"";return`${formattedDate}_conv_${trimmedConvId}_${sanitizedName}.json`}downloadConversationFile(data,filename){const conversation="conv"in data?data.conv:Array.isArray(data)?data[0]?.conv:void 0,msgs="messages"in data?data.messages:Array.isArray(data)?data[0]?.messages:void 0;if(!conversation){console.error("Invalid data: missing \ +conversation");return}let downloadFilename;filename?downloadFilename=filename:Array.isArray(data)&&data.length>1?downloadFilename=`${new Date().toISOString().split(ISO_DATE_TIME_SEPARATOR)[0]}_conversations.json`:downloadFilename=this.generateConversationFilename(conversation,msgs);const blob=new Blob([JSON.stringify(data,null,2)],{type:"application/json"}),url2=URL.createObjectURL(blob),a=document.createElement("a");a.href=url2,a.download=downloadFilename,document.body.appendChild(a),a.click(), +document.body.removeChild(a),URL.revokeObjectURL(url2)}async downloadConversation(convId){let conversation,messages;if(this.activeConversation?.id===convId)conversation=this.activeConversation,messages=this.activeMessages;else{if(conversation=await DatabaseService.getConversation(convId),!conversation)return;messages=await DatabaseService.getConversationMessages(convId)}this.downloadConversationFile({conv:conversation,messages})}async importConversations(){return new Promise((resolve2,reject)=>{ +const input=document.createElement("input");input.type=HtmlInputType.FILE,input.accept=FileExtensionText.JSON,input.onchange=async e=>{const file=e.target?.files?.[0];if(!file){reject(new Error("No file selected"));return}try{const text2=await file.text(),parsedData=JSON.parse(text2);let importedData;if(Array.isArray(parsedData))importedData=parsedData;else if(parsedData&&typeof parsedData=="object"&&"conv"in parsedData&&"messages"in parsedData)importedData=[parsedData];else throw new Error("Inv\ +alid file format");const result=await DatabaseService.importConversations(importedData);toast.success(`Imported ${result.imported} conversation(s), skipped ${result.skipped}`),await this.loadConversations();const importedConversations=(Array.isArray(importedData)?importedData:[importedData]).map(item=>item.conv);resolve2(importedConversations)}catch(err){const message=err instanceof Error?err.message:"Unknown error";console.error("Failed to import conversations:",err),toast.error("Import failed", +{description:message}),reject(new Error(`Import failed: ${message}`))}},input.click()})}async importConversationsData(data){const result=await DatabaseService.importConversations(data);return await this.loadConversations(),result}}const conversationsStore=new ConversationsStore;conversationsStore.init();const conversations=()=>conversationsStore.conversations,activeConversation=()=>conversationsStore.activeConversation,activeMessages=()=>conversationsStore.activeMessages,isConversationsInitialized=()=>conversationsStore. +isInitialized;function buildConversationTree(convs){const childrenByParent=new SvelteMap,forkIds=new SvelteSet;for(const conv of convs)if(conv.forkedFromConversationId){forkIds.add(conv.id);const siblings2=childrenByParent.get(conv.forkedFromConversationId)||[];siblings2.push(conv),childrenByParent.set(conv.forkedFromConversationId,siblings2)}const result=[],visited=new SvelteSet;function walk(conv,depth){visited.add(conv.id),result.push({conversation:conv,depth});const children=childrenByParent. +get(conv.id);if(children){children.sort((a,b)=>b.lastModified-a.lastModified);for(const child2 of children)walk(child2,depth+1)}}const roots=convs.filter(c2=>!forkIds.has(c2.id));for(const root2 of roots)walk(root2,0);for(const conv of convs)visited.has(conv.id)||walk(conv,1);return result}class ToolsService{static async list(){return apiFetch(API_TOOLS.LIST)}static async executeTool(toolName,params,signal){const result=await apiFetch(API_TOOLS.EXECUTE,{method:"POST",body:JSON.stringify({tool:toolName, +params}),signal});return ToolResponseField.ERROR in result?{content:String(result[ToolResponseField.ERROR]),isError:!0}:ToolResponseField.PLAIN_TEXT in result?{content:String(result[ToolResponseField.PLAIN_TEXT]),isError:!1}:{content:JSON.stringify(result),isError:!1}}}class ToolsStore{#_builtinTools=state$1(proxy([]));get _builtinTools(){return get$3(this.#_builtinTools)}set _builtinTools(value){set$1(this.#_builtinTools,value,!0)}#_loading=state$1(!1);get _loading(){return get$3(this.#_loading)}set _loading(value){ +set$1(this.#_loading,value,!0)}#_error=state$1(null);get _error(){return get$3(this.#_error)}set _error(value){set$1(this.#_error,value,!0)}#_disabledTools=state$1(proxy(new SvelteSet));get _disabledTools(){return get$3(this.#_disabledTools)}set _disabledTools(value){set$1(this.#_disabledTools,value,!0)}#_toolsEndpointUnreachable=state$1(!1);get _toolsEndpointUnreachable(){return get$3(this.#_toolsEndpointUnreachable)}set _toolsEndpointUnreachable(value){set$1(this.#_toolsEndpointUnreachable,value, +!0)}constructor(){try{const stored=localStorage.getItem(DISABLED_TOOLS_LOCALSTORAGE_KEY);if(stored){const parsed=JSON.parse(stored);if(Array.isArray(parsed))for(const name of parsed)typeof name=="string"&&this._disabledTools.add(name)}}catch(err){console.error("[ToolsStore] Failed to load disabled tools from localStorage:",err)}this.fetchBuiltinTools()}persistDisabledTools(){try{localStorage.setItem(DISABLED_TOOLS_LOCALSTORAGE_KEY,JSON.stringify([...this._disabledTools]))}catch{}}get builtinTools(){ +return this._builtinTools}get mcpTools(){return mcpStore.getToolDefinitionsForLLM()}get customTools(){const raw2=config$1().custom;if(!raw2||typeof raw2!="string")return[];try{const parsed=JSON.parse(raw2);return Array.isArray(parsed)?parsed.filter(t=>typeof t=="object"&&t!==null&&"type"in t&&t.type==="function"&&"function"in t&&typeof t.function?.name=="string"):[]}catch{return[]}}get allTools(){const entries=[];for(const def of this._builtinTools)entries.push({source:ToolSource.BUILTIN,definition:def}); +const connections=mcpStore.getConnections();if(connections.size>0)for(const[serverId,connection]of connections){const serverName=mcpStore.getServerDisplayName(serverId);for(const tool of connection.tools){const rawSchema=tool.inputSchema??{type:JsonSchemaType.OBJECT,properties:{},required:[]};entries.push({source:ToolSource.MCP,serverName,serverId,definition:{type:ToolCallType.FUNCTION,function:{name:tool.name,description:tool.description,parameters:rawSchema}}})}}else for(const{serverId,serverName, +tools}of this.getMcpToolsFromHealthChecks())for(const tool of tools)entries.push({source:ToolSource.MCP,serverName,serverId,definition:{type:ToolCallType.FUNCTION,function:{name:tool.name,description:tool.description,parameters:{type:JsonSchemaType.OBJECT,properties:{},required:[]}}}});for(const def of this.customTools)entries.push({source:ToolSource.CUSTOM,definition:def});return entries}get toolGroups(){const groups=[];this._builtinTools.length>0&&groups.push({source:ToolSource.BUILTIN,label:TOOL_GROUP_LABELS[ToolSource. +BUILTIN],tools:this._builtinTools});const connections=mcpStore.getConnections();if(connections.size>0)for(const[serverId,connection]of connections){if(connection.tools.length===0)continue;const label=mcpStore.getServerDisplayName(serverId),tools=connection.tools.map(tool=>{const rawSchema=tool.inputSchema??{type:JsonSchemaType.OBJECT,properties:{},required:[]};return{type:ToolCallType.FUNCTION,function:{name:tool.name,description:tool.description,parameters:rawSchema}}});groups.push({source:ToolSource. +MCP,label,serverId,tools})}else for(const{serverId,serverName,tools}of this.getMcpToolsFromHealthChecks()){if(tools.length===0)continue;const defs=tools.map(tool=>({type:ToolCallType.FUNCTION,function:{name:tool.name,description:tool.description,parameters:{type:JsonSchemaType.OBJECT,properties:{},required:[]}}}));groups.push({source:ToolSource.MCP,label:serverName,serverId,tools:defs})}const custom2=this.customTools;return custom2.length>0&&groups.push({source:ToolSource.CUSTOM,label:TOOL_GROUP_LABELS[ToolSource. +CUSTOM],tools:custom2}),groups}get enabledToolDefinitions(){return this.allTools.filter(t=>!this._disabledTools.has(t.definition.function.name)).map(t=>t.definition)}getEnabledToolsForLLM(){const disabled=this._disabledTools,result=[];for(const tool of this._builtinTools)disabled.has(tool.function.name)||result.push(tool);for(const tool of mcpStore.getToolDefinitionsForLLM())disabled.has(tool.function.name)||result.push(tool);for(const tool of this.customTools)disabled.has(tool.function.name)||result. +push(tool);return result}get allToolDefinitions(){return this.allTools.map(t=>t.definition)}get loading(){return this._loading}get error(){return this._error}get isToolsEndpointUnreachable(){return this._toolsEndpointUnreachable}get disabledTools(){return this._disabledTools}isToolEnabled(toolName){return!this._disabledTools.has(toolName)}toggleTool(toolName){this._disabledTools.has(toolName)?this._disabledTools.delete(toolName):this._disabledTools.add(toolName),this.persistDisabledTools()}setToolEnabled(toolName,enabled){ +enabled?this._disabledTools.delete(toolName):this._disabledTools.add(toolName)}enableAllToolsForServer(serverId){const connection=mcpStore.getConnections().get(serverId);if(connection){for(const tool of connection.tools)this._disabledTools.delete(tool.name);this.persistDisabledTools()}}toggleGroup(group){const allEnabled=group.tools.every(t=>this.isToolEnabled(t.function.name));for(const tool of group.tools)this.setToolEnabled(tool.function.name,!allEnabled);this.persistDisabledTools()}isGroupFullyEnabled(group){ +return group.tools.length>0&&group.tools.every(t=>this.isToolEnabled(t.function.name))}isGroupPartiallyEnabled(group){const enabledCount=group.tools.filter(t=>this.isToolEnabled(t.function.name)).length;return enabledCount>0&&enabledCounts2.enabled)){const health=mcpStore.getHealthCheckState(server.id);health.status===HealthCheckStatus.SUCCESS&&health.tools.length>0&&result. +push({serverId:server.id,serverName:mcpStore.getServerLabel(server),tools:health.tools})}return result}getToolSource(toolName){if(this._builtinTools.some(t=>t.function.name===toolName))return ToolSource.BUILTIN;for(const entry of this.allTools)if(entry.definition.function.name===toolName)return entry.source;return null}getToolServerLabel(toolName){for(const entry of this.allTools)if(entry.definition.function.name===toolName){if(entry.serverName)return mcpStore.getServerDisplayName(entry.serverName); +if(entry.source===ToolSource.BUILTIN)return TOOL_SERVER_LABELS[ToolSource.BUILTIN];if(entry.source===ToolSource.CUSTOM)return TOOL_SERVER_LABELS[ToolSource.CUSTOM]}return""}getPermissionKey(toolName){for(const entry of this.allTools)if(entry.definition.function.name===toolName)switch(entry.source){case ToolSource.BUILTIN:return`builtin:${toolName}`;case ToolSource.CUSTOM:return`custom:${toolName}`;case ToolSource.MCP:return entry.serverId?`mcp-${entry.serverId}:${toolName}`:`mcp:${toolName}`;default: +return null}return null}get hasEnabledTools(){return this.getEnabledToolsForLLM().length>0}async fetchBuiltinTools(){if(!this._loading){this._loading=!0,this._error=null,this._toolsEndpointUnreachable=!1;try{const toolInfos=await ToolsService.list();this._builtinTools=toolInfos.map(info2=>info2.definition)}catch(err){const errorMessage=err instanceof Error?err.message:String(err);this._error=errorMessage,(errorMessage.includes("404")||errorMessage.toLowerCase().includes("not found"))&&(this._toolsEndpointUnreachable= +!0),console.error("[ToolsStore] Failed to fetch built-in tools:",err)}finally{this._loading=!1}}}}const toolsStore=new ToolsStore;class PermissionsStore{#_tools=state$1(proxy(new SvelteSet));get _tools(){return get$3(this.#_tools)}set _tools(value){set$1(this.#_tools,value,!0)}constructor(){try{const stored=localStorage.getItem(ALWAYS_ALLOWED_TOOLS_LOCALSTORAGE_KEY);if(stored)for(const name of JSON.parse(stored))typeof name=="string"&&this._tools.add(name)}catch(err){console.error(`Failed to loa\ +d permissions from localStorage ("${ALWAYS_ALLOWED_TOOLS_LOCALSTORAGE_KEY}"):`,err)}}get tools(){return this._tools}hasTool(key2){return this._tools.has(key2)}allowTool(key2){this._tools.add(key2),this._persist()}allowTools(keys2){for(const key2 of keys2)this._tools.add(key2);this._persist()}revokeTool(key2){this._tools.delete(key2),this._persist()}_persist(){try{localStorage.setItem(ALWAYS_ALLOWED_TOOLS_LOCALSTORAGE_KEY,JSON.stringify([...this._tools]))}catch(err){console.error(`Failed to persi\ +st to localStorage ("${ALWAYS_ALLOWED_TOOLS_LOCALSTORAGE_KEY}"):`,err)}}}const permissionsStore=new PermissionsStore;function createDefaultSession(){return{isRunning:!1,currentTurn:0,totalToolCalls:0,lastError:null,streamingToolCall:null,pendingPermissionRequest:null}}function toAgenticMessages(messages){return messages.map(message=>message.role===MessageRole.ASSISTANT&&message.tool_calls&&message.tool_calls.length>0?{role:MessageRole.ASSISTANT,content:message.content,reasoning_content:message.reasoning_content, +tool_calls:message.tool_calls.map((call,index2)=>({id:call.id??`call_${index2}`,type:call.type??ToolCallType.FUNCTION,function:{name:call.function?.name??"",arguments:call.function?.arguments??""}}))}:message.role===MessageRole.ASSISTANT?{role:MessageRole.ASSISTANT,content:message.content,reasoning_content:message.reasoning_content}:message.role===MessageRole.TOOL&&message.tool_call_id?{role:MessageRole.TOOL,tool_call_id:message.tool_call_id,content:typeof message.content=="string"?message.content: +""}:{role:message.role,content:message.content})}class AgenticStore{_sessions=new SvelteMap;_pendingPermissions=new SvelteMap;_permissionResolvers=new Map;_pendingContinueRequests=new SvelteMap;_continueResolvers=new Map;_steeringMessages=new SvelteMap;get isReady(){return!0}get isAnyRunning(){for(const session of this._sessions.values())if(session.isRunning)return!0;return!1}getSession(conversationId){let session=this._sessions.get(conversationId);return session||(session=createDefaultSession(), +this._sessions.set(conversationId,session)),session}updateSession(conversationId,update2){const session=this.getSession(conversationId);this._sessions.set(conversationId,{...session,...update2})}clearSession(conversationId){this._sessions.delete(conversationId)}getActiveSessions(){const active=[];for(const[conversationId,session]of this._sessions.entries())session.isRunning&&active.push({conversationId,session});return active}isRunning(conversationId){return this.getSession(conversationId).isRunning}currentTurn(conversationId){ +return this.getSession(conversationId).currentTurn}totalToolCalls(conversationId){return this.getSession(conversationId).totalToolCalls}lastError(conversationId){return this.getSession(conversationId).lastError}streamingToolCall(conversationId){return this.getSession(conversationId).streamingToolCall}pendingPermissionRequest(conversationId){return this._pendingPermissions.get(conversationId)??null}pendingContinueRequest(conversationId){return this._pendingContinueRequests.get(conversationId)??!1}resolveContinue(conversationId,shouldContinue){ +const resolver2=this._continueResolvers.get(conversationId);resolver2&&(this._continueResolvers.delete(conversationId),resolver2(shouldContinue))}resolvePermission(conversationId,decision){const resolver2=this._permissionResolvers.get(conversationId);resolver2&&(this._permissionResolvers.delete(conversationId),resolver2(decision))}clearError(conversationId){this.updateSession(conversationId,{lastError:null})}hasPendingSteeringMessage(conversationId){return this._steeringMessages.has(conversationId)}pendingSteeringMessageContent(conversationId){ +return this._steeringMessages.get(conversationId)?.content??null}pendingSteeringMessageExtras(conversationId){return this._steeringMessages.get(conversationId)?.extras}injectSteeringMessage(conversationId,content2,extras){this._steeringMessages.set(conversationId,{content:content2,extras})}clearSteeringMessage(conversationId){this._steeringMessages.delete(conversationId)}consumePendingSteeringMessage(conversationId){const msg=this._steeringMessages.get(conversationId);return msg?(this._steeringMessages. +delete(conversationId),msg):null}getConfig(settings,perChatOverrides){const maxTurns=Number(settings.agenticMaxTurns)||DEFAULT_AGENTIC_CONFIG.maxTurns,maxToolPreviewLines=Number(settings.agenticMaxToolPreviewLines)||DEFAULT_AGENTIC_CONFIG.maxToolPreviewLines;return{enabled:(mcpStore.hasEnabledServers(perChatOverrides)||toolsStore.builtinTools.length>0||toolsStore.customTools.length>0)&&DEFAULT_AGENTIC_CONFIG.enabled,maxTurns,maxToolPreviewLines}}parseToolArguments(args){if(typeof args=="object") +return args;const trimmed=args.trim();return trimmed===""?{}:JSON.parse(trimmed)}async requestPermission(conversationId,toolName,serverLabel,signal){const permissionKey=toolsStore.getPermissionKey(toolName);return permissionKey&&permissionsStore.hasTool(permissionKey)?ToolPermissionDecision.ONCE:(this._pendingPermissions.set(conversationId,{toolName,serverLabel}),new Promise(resolve2=>{if(signal?.aborted){this._pendingPermissions.set(conversationId,null),resolve2(ToolPermissionDecision.DENY);return} +this._permissionResolvers.set(conversationId,decision=>{if(this._pendingPermissions.set(conversationId,null),decision===ToolPermissionDecision.ALWAYS&&permissionKey)permissionsStore.allowTool(permissionKey);else if(decision===ToolPermissionDecision.ALWAYS_SERVER){const serverToolKeys=toolsStore.allTools.filter(t=>t.serverName?t.serverName===serverLabel:toolsStore.getToolServerLabel(t.definition.function.name)===serverLabel).map(t=>toolsStore.getPermissionKey(t.definition.function.name)).filter(k=>k!== +null);permissionsStore.allowTools(serverToolKeys)}resolve2(decision)}),signal?.addEventListener("abort",()=>{this._permissionResolvers.get(conversationId)&&(this._permissionResolvers.delete(conversationId),this._pendingPermissions.set(conversationId,null),resolve2(ToolPermissionDecision.DENY))},{once:!0})}))}async requestContinue(conversationId,signal){return this._pendingContinueRequests.set(conversationId,!0),new Promise(resolve2=>{if(signal?.aborted){this._pendingContinueRequests.set(conversationId, +!1),resolve2(!1);return}this._continueResolvers.set(conversationId,shouldContinue=>{this._pendingContinueRequests.set(conversationId,!1),resolve2(shouldContinue)}),signal?.addEventListener("abort",()=>{this._continueResolvers.get(conversationId)&&(this._continueResolvers.delete(conversationId),this._pendingContinueRequests.set(conversationId,!1),resolve2(!1))},{once:!0})})}async runAgenticFlow(params){const{conversationId,messages,options={},callbacks,signal,perChatOverrides}=params;this._pendingPermissions. +set(conversationId,null),this._permissionResolvers.delete(conversationId),this._pendingContinueRequests.set(conversationId,!1),this._continueResolvers.delete(conversationId),this._steeringMessages.delete(conversationId),toolsStore.builtinTools.length===0&&!toolsStore.loading&&await toolsStore.fetchBuiltinTools();const agenticConfig=this.getConfig(config$1(),perChatOverrides);if(!agenticConfig.enabled)return{handled:!1};const hasMcpServers=mcpStore.hasEnabledServers(perChatOverrides);hasMcpServers&& +(await mcpStore.ensureInitialized(perChatOverrides)||console.log("[AgenticStore] MCP not initialized"));const tools=toolsStore.getEnabledToolsForLLM();if(tools.length===0)return console.log("[AgenticStore] No tools available, falling back to standard chat"),{handled:!1};console.log(`[AgenticStore] Starting agentic flow with ${tools.length} tools`);const normalizedMessages=messages.map(msg=>"id"in msg&&"convId"in msg&&"timestamp"in msg?ChatService.convertDbMessageToApiChatMessageData(msg):msg).filter( +msg=>msg.role===MessageRole.SYSTEM?(typeof msg.content=="string"?msg.content:"").trim().length>0:!0);this.updateSession(conversationId,{isRunning:!0,currentTurn:0,totalToolCalls:0,lastError:null}),hasMcpServers&&mcpStore.acquireConnection();try{return await this.executeAgenticLoop({conversationId,messages:normalizedMessages,options,tools,agenticConfig,callbacks,signal}),{handled:!0}}catch(error2){const normalizedError=error2 instanceof Error?error2:new Error(String(error2));return this.updateSession( +conversationId,{lastError:normalizedError}),callbacks.onError?.(normalizedError),{handled:!0,error:normalizedError}}finally{this.updateSession(conversationId,{isRunning:!1}),hasMcpServers&&await mcpStore.releaseConnection().catch(err=>console.warn("[AgenticStore] Failed to release MCP connection:",err))}}async executeAgenticLoop(params){const{conversationId,messages,options,tools,agenticConfig,callbacks,signal}=params,{onChunk,onReasoningChunk,onToolCallsStreaming,onAttachments,onModel,onAssistantTurnComplete, +createToolResultMessage,createAssistantMessage,onFlowComplete,onTimings,onTurnComplete}=callbacks,sessionMessages=toAgenticMessages(messages);let capturedTimings,totalToolCallCount=0;const agenticTimings={turns:0,toolCallsCount:0,toolsMs:0,toolCalls:[],perTurn:[],llm:{predicted_n:0,predicted_ms:0,prompt_n:0,prompt_ms:0}},maxTurns=agenticConfig.maxTurns,effectiveModel=options.model||modelsStore.models[0]?.model||"";let turn=0;for(;;){if(turn>=maxTurns){const shouldContinue=await this.requestContinue( +conversationId,signal);if(await new Promise(r2=>setTimeout(r2,0)),!shouldContinue||signal?.aborted){onFlowComplete?.(this.buildFinalTimings(capturedTimings,agenticTimings));return}turn=0}if(this.updateSession(conversationId,{currentTurn:turn+1}),agenticTimings.turns=turn+1,signal?.aborted){onFlowComplete?.(this.buildFinalTimings(capturedTimings,agenticTimings));return}turn>0&&createAssistantMessage&&await createAssistantMessage();let turnContent="",turnReasoningContent="",turnToolCalls=[],lastStreamingToolCallName="", +lastStreamingToolCallArgsLength=0,turnTimings;const turnStats={turn:turn+1,llm:{predicted_n:0,predicted_ms:0,prompt_n:0,prompt_ms:0},toolCalls:[],toolsMs:0};try{await ChatService.sendMessage(sessionMessages,{...options,stream:!0,tools:tools.length>0?tools:void 0,onChunk:chunk=>{turnContent+=chunk,onChunk?.(chunk)},onReasoningChunk:chunk=>{turnReasoningContent+=chunk,onReasoningChunk?.(chunk)},onToolCallChunk:serialized=>{try{if(turnToolCalls=JSON.parse(serialized),onToolCallsStreaming?.(turnToolCalls), +turnToolCalls.length>0&&turnToolCalls[0]?.function){const name=turnToolCalls[0].function.name||"",args=turnToolCalls[0].function.arguments||"",argsLengthBucket=Math.floor(args.length/100);(name!==lastStreamingToolCallName||argsLengthBucket!==lastStreamingToolCallArgsLength)&&(lastStreamingToolCallName=name,lastStreamingToolCallArgsLength=argsLengthBucket,this.updateSession(conversationId,{streamingToolCall:{name,arguments:args}}))}}catch{}},onModel,onTimings:(timings,progress)=>{onTimings?.(timings, +progress),timings&&(capturedTimings=timings,turnTimings=timings)},onComplete:()=>{},onError:error2=>{throw error2}},void 0,signal),this.updateSession(conversationId,{streamingToolCall:null}),turnTimings&&(agenticTimings.llm.predicted_n+=turnTimings.predicted_n||0,agenticTimings.llm.predicted_ms+=turnTimings.predicted_ms||0,agenticTimings.llm.prompt_n+=turnTimings.prompt_n||0,agenticTimings.llm.prompt_ms+=turnTimings.prompt_ms||0,turnStats.llm.predicted_n=turnTimings.predicted_n||0,turnStats.llm. +predicted_ms=turnTimings.predicted_ms||0,turnStats.llm.prompt_n=turnTimings.prompt_n||0,turnStats.llm.prompt_ms=turnTimings.prompt_ms||0)}catch(error2){if(signal?.aborted){await onAssistantTurnComplete?.(turnContent,turnReasoningContent||void 0,this.buildFinalTimings(capturedTimings,agenticTimings),void 0),onFlowComplete?.(this.buildFinalTimings(capturedTimings,agenticTimings));return}const normalizedError=error2 instanceof Error?error2:new Error("LLM stream error");throw onChunk?.(`${LLM_ERROR_BLOCK_START}${normalizedError. +message}${LLM_ERROR_BLOCK_END}`),await onAssistantTurnComplete?.(turnContent+`${LLM_ERROR_BLOCK_START}${normalizedError.message}${LLM_ERROR_BLOCK_END}`,turnReasoningContent||void 0,this.buildFinalTimings(capturedTimings,agenticTimings),void 0),onFlowComplete?.(this.buildFinalTimings(capturedTimings,agenticTimings)),normalizedError}if(this._steeringMessages.has(conversationId)){console.log("[AgenticStore] Steering message detected after turn, exiting agentic flow"),await onAssistantTurnComplete?.( +turnContent,turnReasoningContent||void 0,this.buildFinalTimings(capturedTimings,agenticTimings),turnToolCalls.length>0?this.normalizeToolCalls(turnToolCalls):void 0),onFlowComplete?.(this.buildFinalTimings(capturedTimings,agenticTimings));return}if(turnToolCalls.length===0){agenticTimings.perTurn.push(turnStats);const finalTimings=this.buildFinalTimings(capturedTimings,agenticTimings);await onAssistantTurnComplete?.(turnContent,turnReasoningContent||void 0,finalTimings,void 0),finalTimings&&onTurnComplete?.( +finalTimings),onFlowComplete?.(finalTimings);return}const normalizedCalls=this.normalizeToolCalls(turnToolCalls);if(normalizedCalls.length===0){await onAssistantTurnComplete?.(turnContent,turnReasoningContent||void 0,this.buildFinalTimings(capturedTimings,agenticTimings),void 0),onFlowComplete?.(this.buildFinalTimings(capturedTimings,agenticTimings));return}totalToolCallCount+=normalizedCalls.length,this.updateSession(conversationId,{totalToolCalls:totalToolCallCount}),await onAssistantTurnComplete?.( +turnContent,turnReasoningContent||void 0,turnTimings,normalizedCalls),sessionMessages.push({role:MessageRole.ASSISTANT,content:turnContent||void 0,reasoning_content:turnReasoningContent||void 0,tool_calls:normalizedCalls});for(let i=0;isetTimeout(r2,0)),signal?.aborted){onFlowComplete?.(this.buildFinalTimings(capturedTimings,agenticTimings));return}const toolStartTime=performance.now(),toolSource=toolsStore.getToolSource(toolName);let result,toolSuccess=!0;if(permission===ToolPermissionDecision.DENY)result="Tool execution was denied by the user.",toolSuccess=!1;else try{if(toolSource===ToolSource.BUILTIN){const args=this. +parseToolArguments(toolCall.function.arguments),executionResult=await ToolsService.executeTool(toolName,args,signal);result=executionResult.content,executionResult.isError&&(toolSuccess=!1)}else{const mcpCall={id:toolCall.id,function:{name:toolName,arguments:toolCall.function.arguments}};result=(await mcpStore.executeTool(mcpCall,signal)).content}}catch(error2){if(isAbortError(error2)){onFlowComplete?.(this.buildFinalTimings(capturedTimings,agenticTimings));return}result=`Error: ${error2 instanceof +Error?error2.message:String(error2)}`,toolSuccess=!1}const toolDurationMs=performance.now()-toolStartTime,toolTiming={name:toolCall.function.name,duration_ms:Math.round(toolDurationMs),success:toolSuccess};if(agenticTimings.toolCalls.push(toolTiming),agenticTimings.toolCallsCount++,agenticTimings.toolsMs+=Math.round(toolDurationMs),turnStats.toolCalls.push(toolTiming),turnStats.toolsMs+=Math.round(toolDurationMs),signal?.aborted){onFlowComplete?.(this.buildFinalTimings(capturedTimings,agenticTimings)); +return}const{cleanedResult,attachments}=this.extractBase64Attachments(result);let toolResultMessage;createToolResultMessage&&(toolResultMessage=await createToolResultMessage(toolCall.id,cleanedResult,attachments.length>0?attachments:void 0)),attachments.length>0&&toolResultMessage&&onAttachments?.(toolResultMessage.id,attachments);const contentParts=[{type:ContentPartType.TEXT,text:cleanedResult}];for(const attachment of attachments)attachment.type===AttachmentType.IMAGE&&(modelsStore.modelSupportsVision( +effectiveModel)?contentParts.push({type:ContentPartType.IMAGE_URL,image_url:{url:attachment.base64Url}}):console.info(`[AgenticStore] Skipping image attachment (model "${effectiveModel}" does not support vision)`));sessionMessages.push({role:MessageRole.TOOL,tool_call_id:toolCall.id,content:contentParts.length===1?cleanedResult:contentParts})}if(turnStats.toolCalls.length>0){agenticTimings.perTurn.push(turnStats);const intermediateTimings=this.buildFinalTimings(capturedTimings,agenticTimings);intermediateTimings&& +onTurnComplete?.(intermediateTimings)}if(this._steeringMessages.has(conversationId)){console.log("[AgenticStore] Steering message detected after tool execution, exiting agentic flow"),onFlowComplete?.(this.buildFinalTimings(capturedTimings,agenticTimings));return}turn++}}buildFinalTimings(capturedTimings,agenticTimings){return agenticTimings.toolCallsCount===0?capturedTimings:{predicted_n:capturedTimings?.predicted_n,predicted_ms:capturedTimings?.predicted_ms,prompt_n:capturedTimings?.prompt_n,prompt_ms:capturedTimings?. +prompt_ms,cache_n:capturedTimings?.cache_n,agentic:agenticTimings}}normalizeToolCalls(toolCalls){return toolCalls?toolCalls.map((call,index2)=>({id:call?.id??`tool_${index2}`,type:call?.type??ToolCallType.FUNCTION,function:{name:call?.function?.name??"",arguments:call?.function?.arguments??""}})):[]}extractBase64Attachments(result){if(!result.trim())return{cleanedResult:result,attachments:[]};const lines=result.split(NEWLINE_SEPARATOR),attachments=[];let attachmentIndex=0;return{cleanedResult:lines. +map(line=>{const trimmedLine=line.trim(),match=trimmedLine.match(DATA_URI_BASE64_REGEX);if(!match)return line;const mimeType=match[1].toLowerCase();if(!match[2])return line;attachmentIndex+=1;const name=this.buildAttachmentName(mimeType,attachmentIndex);return mimeType.startsWith(MimeTypePrefix.IMAGE)?(attachments.push({type:AttachmentType.IMAGE,name,base64Url:trimmedLine}),`[Attachment saved: ${name}]`):line}).join(NEWLINE_SEPARATOR),attachments}}buildAttachmentName(mimeType,index2){const extension2=IMAGE_MIME_TO_EXTENSION[mimeType]?? +DEFAULT_IMAGE_EXTENSION;return`${MCP_ATTACHMENT_NAME_PREFIX}-${Date.now()}-${index2}.${extension2}`}}const agenticStore=new AgenticStore;function agenticPendingPermissionRequest(conversationId){return agenticStore.pendingPermissionRequest(conversationId)}function agenticResolvePermission(conversationId,decision){agenticStore.resolvePermission(conversationId,decision)}function agenticPendingContinueRequest(conversationId){return agenticStore.pendingContinueRequest(conversationId)}function agenticResolveContinue(conversationId,shouldContinue){ +agenticStore.resolveContinue(conversationId,shouldContinue)}function agenticInjectSteeringMessage(conversationId,content2,extras){agenticStore.injectSteeringMessage(conversationId,content2,extras)}function agenticPendingSteeringMessageContent(conversationId){return agenticStore.pendingSteeringMessageContent(conversationId)}function agenticPendingSteeringMessageExtras(conversationId){return agenticStore.pendingSteeringMessageExtras(conversationId)}function agenticClearSteeringMessage(conversationId){ +agenticStore.clearSteeringMessage(conversationId)}class ChatStore{#activeProcessingState=state$1(null);get activeProcessingState(){return get$3(this.#activeProcessingState)}set activeProcessingState(value){set$1(this.#activeProcessingState,value,!0)}#currentResponse=state$1("");get currentResponse(){return get$3(this.#currentResponse)}set currentResponse(value){set$1(this.#currentResponse,value,!0)}#errorDialogState=state$1(null);get errorDialogState(){return get$3(this.#errorDialogState)}set errorDialogState(value){ +set$1(this.#errorDialogState,value,!0)}#isLoading=state$1(!1);get isLoading(){return get$3(this.#isLoading)}set isLoading(value){set$1(this.#isLoading,value,!0)}chatLoadingStates=new SvelteMap;chatStreamingStates=new SvelteMap;abortControllers=new SvelteMap;preEncodeAbortController=null;processingStates=new SvelteMap;conversationStateTimestamps=new SvelteMap;#activeConversationId=state$1(null);get activeConversationId(){return get$3(this.#activeConversationId)}set activeConversationId(value){set$1( +this.#activeConversationId,value,!0)}#isStreamingActive=state$1(!1);get isStreamingActive(){return get$3(this.#isStreamingActive)}set isStreamingActive(value){set$1(this.#isStreamingActive,value,!0)}#isEditModeActive=state$1(!1);get isEditModeActive(){return get$3(this.#isEditModeActive)}set isEditModeActive(value){set$1(this.#isEditModeActive,value,!0)}#addFilesHandler=state$1(null);get addFilesHandler(){return get$3(this.#addFilesHandler)}set addFilesHandler(value){set$1(this.#addFilesHandler, +value,!0)}#pendingEditMessageId=state$1(null);get pendingEditMessageId(){return get$3(this.#pendingEditMessageId)}set pendingEditMessageId(value){set$1(this.#pendingEditMessageId,value,!0)}messageUpdateCallback=null;#_pendingDraftMessage=state$1("");get _pendingDraftMessage(){return get$3(this.#_pendingDraftMessage)}set _pendingDraftMessage(value){set$1(this.#_pendingDraftMessage,value,!0)}#_pendingDraftFiles=state$1(proxy([]));get _pendingDraftFiles(){return get$3(this.#_pendingDraftFiles)}set _pendingDraftFiles(value){ +set$1(this.#_pendingDraftFiles,value,!0)}_pendingMessages=new SvelteMap;setChatLoading(convId,loading){this.touchConversationState(convId),loading?(this.chatLoadingStates.set(convId,!0),convId===conversationsStore.activeConversation?.id&&(this.isLoading=!0)):(this.chatLoadingStates.delete(convId),convId===conversationsStore.activeConversation?.id&&(this.isLoading=!1))}setChatStreaming(convId,response,messageId){this.touchConversationState(convId),this.chatStreamingStates.set(convId,{response,messageId}), +convId===conversationsStore.activeConversation?.id&&(this.currentResponse=response)}clearChatStreaming(convId){this.chatStreamingStates.delete(convId),convId===conversationsStore.activeConversation?.id&&(this.currentResponse="")}getChatStreaming(convId){return this.chatStreamingStates.get(convId)}syncLoadingStateForChat(convId){this.isLoading=this.chatLoadingStates.get(convId)||!1;const s2=this.chatStreamingStates.get(convId);if(this.currentResponse=s2?.response||"",this.isStreamingActive=s2!==void 0, +this.setActiveProcessingConversation(convId),s2?.response&&s2?.messageId){const idx=conversationsStore.findMessageIndex(s2.messageId);idx!==-1&&conversationsStore.updateMessageAtIndex(idx,{content:s2.response})}}clearUIState(){this.isLoading=!1,this.currentResponse="",this.isStreamingActive=!1}setActiveProcessingConversation(conversationId){this.activeConversationId=conversationId,this.activeProcessingState=conversationId&&this.processingStates.get(conversationId)||null}getProcessingState(conversationId){ +return this.processingStates.get(conversationId)||null}setProcessingState(conversationId,state2){state2===null?this.processingStates.delete(conversationId):this.processingStates.set(conversationId,state2),conversationId===this.activeConversationId&&(this.activeProcessingState=state2)}clearProcessingState(conversationId){this.processingStates.delete(conversationId),conversationId===this.activeConversationId&&(this.activeProcessingState=null)}getActiveProcessingState(){return this.activeProcessingState}getCurrentProcessingStateSync(){ +return this.activeProcessingState}setStreamingActive(active){this.isStreamingActive=active}isStreaming(){return this.isStreamingActive}getOrCreateAbortController(convId){let c2=this.abortControllers.get(convId);return(!c2||c2.signal.aborted)&&(c2=new AbortController,this.abortControllers.set(convId,c2)),c2}abortRequest(convId){if(convId){const c2=this.abortControllers.get(convId);c2&&(c2.abort(),this.abortControllers.delete(convId))}else{for(const c2 of this.abortControllers.values())c2.abort(); +this.abortControllers.clear()}}abortCurrentFlow(convId){const c2=this.abortControllers.get(convId);c2&&(c2.abort(),this.abortControllers.delete(convId))}showErrorDialog(state2){this.errorDialogState=state2}dismissErrorDialog(){this.errorDialogState=null}clearEditMode(){this.isEditModeActive=!1,this.addFilesHandler=null}isEditing(){return this.isEditModeActive}setEditModeActive(handler){this.isEditModeActive=!0,this.addFilesHandler=handler}getAddFilesHandler(){return this.addFilesHandler}clearPendingEditMessageId(){ +this.pendingEditMessageId=null}savePendingDraft(message,files){this._pendingDraftMessage=message,this._pendingDraftFiles=[...files]}consumePendingDraft(){if(!this._pendingDraftMessage&&this._pendingDraftFiles.length===0)return null;const d2={message:this._pendingDraftMessage,files:[...this._pendingDraftFiles]};return this._pendingDraftMessage="",this._pendingDraftFiles=[],d2}hasPendingDraft(){return!!this._pendingDraftMessage||this._pendingDraftFiles.length>0}getAllLoadingChats(){return Array.from( +this.chatLoadingStates.keys())}getAllStreamingChats(){return Array.from(this.chatStreamingStates.keys())}getChatStreamingPublic(convId){return this.getChatStreaming(convId)}isChatLoadingPublic(convId){return this.chatLoadingStates.get(convId)||!1}isChatLoadingInternal(convId){return this.chatStreamingStates.has(convId)}hasPendingMessage(convId){return this._pendingMessages.has(convId)}pendingMessageContent(convId){return this._pendingMessages.get(convId)?.content??null}pendingMessageExtras(convId){ +return this._pendingMessages.get(convId)?.extras}injectPendingMessage(convId,content2,extras){this._pendingMessages.set(convId,{content:content2,extras})}clearPendingMessage(convId){this._pendingMessages.delete(convId)}consumePendingMessage(convId){const msg=this._pendingMessages.get(convId);return msg?(this._pendingMessages.delete(convId),msg):null}touchConversationState(convId){this.conversationStateTimestamps.set(convId,{lastAccessed:Date.now()})}cleanupOldConversationStates(activeConversationIds){ +const now2=Date.now(),activeIdsList=activeConversationIds??[],preserveIds=this.activeConversationId?[...activeIdsList,this.activeConversationId]:activeIdsList,allConvIds=[...new Set([...this.chatLoadingStates.keys(),...this.chatStreamingStates.keys(),...this.abortControllers.keys(),...this.processingStates.keys(),...this.conversationStateTimestamps.keys()])],cleanupCandidates=[];for(const convId of allConvIds){if(preserveIds.includes(convId)||this.chatLoadingStates.get(convId)||this.chatStreamingStates. +has(convId))continue;const ts=this.conversationStateTimestamps.get(convId);cleanupCandidates.push({convId,lastAccessed:ts?.lastAccessed??0})}cleanupCandidates.sort((a,b)=>a.lastAccessed-b.lastAccessed);let cleanedUp=0;for(const{convId,lastAccessed}of cleanupCandidates)(cleanupCandidates.length-cleanedUp>MAX_INACTIVE_CONVERSATION_STATES||now2-lastAccessed>INACTIVE_CONVERSATION_STATE_MAX_AGE_MS)&&(this.cleanupConversationState(convId),cleanedUp++);return cleanedUp}cleanupConversationState(convId){ +const c2=this.abortControllers.get(convId);c2&&!c2.signal.aborted&&c2.abort(),this.chatLoadingStates.delete(convId),this.chatStreamingStates.delete(convId),this.abortControllers.delete(convId),this.processingStates.delete(convId),this.conversationStateTimestamps.delete(convId)}getTrackedConversationCount(){return new Set([...this.chatLoadingStates.keys(),...this.chatStreamingStates.keys(),...this.abortControllers.keys(),...this.processingStates.keys()]).size}getMessageByIdWithRole(messageId,expectedRole){ +const index2=conversationsStore.findMessageIndex(messageId);if(index2===-1)return null;const message=conversationsStore.activeMessages[index2];return expectedRole&&message.role!==expectedRole?null:{message,index:index2}}async addMessage(role,content2,type2=MessageType.TEXT,parent="-1",extras){const activeConv=conversationsStore.activeConversation;if(!activeConv)throw new Error("No active conversation");let parentId=null;if(parent==="-1"){const am=conversationsStore.activeMessages;if(am.length>0) +parentId=am[am.length-1].id;else{const r2=(await conversationsStore.getConversationMessages(activeConv.id)).find(m=>m.parent===null&&m.type==="root");parentId=r2?r2.id:await DatabaseService.createRootMessage(activeConv.id)}}else parentId=parent;const message=await DatabaseService.createMessageBranch({convId:activeConv.id,role,content:content2,type:type2,timestamp:Date.now(),toolCalls:"",children:[],extra:extras},parentId);return conversationsStore.addMessageToActive(message),await conversationsStore. +updateCurrentNode(message.id),conversationsStore.updateConversationTimestamp(),message}async addSystemPrompt(){let activeConv=conversationsStore.activeConversation;if(activeConv||(await conversationsStore.createConversation(),activeConv=conversationsStore.activeConversation),!!activeConv)try{const allMessages=await conversationsStore.getConversationMessages(activeConv.id),rootMessage=allMessages.find(m=>m.type==="root"&&m.parent===null),rootId=rootMessage?rootMessage.id:await DatabaseService.createRootMessage( +activeConv.id),existingSystemMessage=allMessages.find(m=>m.role===MessageRole.SYSTEM&&m.parent===rootId);if(existingSystemMessage){this.pendingEditMessageId=existingSystemMessage.id,conversationsStore.activeMessages.some(m=>m.id===existingSystemMessage.id)||conversationsStore.activeMessages.unshift(existingSystemMessage);return}const firstActiveMessage=conversationsStore.activeMessages.find(m=>m.parent===rootId),systemMessage=await DatabaseService.createSystemMessage(activeConv.id,SYSTEM_MESSAGE_PLACEHOLDER, +rootId);if(firstActiveMessage){await DatabaseService.updateMessage(firstActiveMessage.id,{parent:systemMessage.id}),await DatabaseService.updateMessage(systemMessage.id,{children:[firstActiveMessage.id]});const updatedRootChildren=rootMessage?rootMessage.children.filter(id2=>id2!==firstActiveMessage.id):[];await DatabaseService.updateMessage(rootId,{children:[...updatedRootChildren.filter(id2=>id2!==systemMessage.id),systemMessage.id]});const firstMsgIndex=conversationsStore.findMessageIndex(firstActiveMessage. +id);firstMsgIndex!==-1&&conversationsStore.updateMessageAtIndex(firstMsgIndex,{parent:systemMessage.id})}conversationsStore.activeMessages.unshift(systemMessage),this.pendingEditMessageId=systemMessage.id,conversationsStore.updateConversationTimestamp()}catch(error2){console.error("Failed to add system prompt:",error2)}}async removeSystemPromptPlaceholder(messageId){const activeConv=conversationsStore.activeConversation;if(!activeConv)return!1;try{const allMessages=await conversationsStore.getConversationMessages( +activeConv.id),systemMessage=findMessageById(allMessages,messageId);if(!systemMessage||systemMessage.role!==MessageRole.SYSTEM)return!1;const rootMessage=allMessages.find(m=>m.type==="root"&&m.parent===null);if(!rootMessage)return!1;if(allMessages.length===2&&systemMessage.children.length===0)return await conversationsStore.deleteConversation(activeConv.id),!0;for(const childId of systemMessage.children){await DatabaseService.updateMessage(childId,{parent:rootMessage.id});const childIndex=conversationsStore. +findMessageIndex(childId);childIndex!==-1&&conversationsStore.updateMessageAtIndex(childIndex,{parent:rootMessage.id})}await DatabaseService.updateMessage(rootMessage.id,{children:[...rootMessage.children.filter(id2=>id2!==messageId),...systemMessage.children]}),await DatabaseService.deleteMessage(messageId);const systemIndex=conversationsStore.findMessageIndex(messageId);return systemIndex!==-1&&conversationsStore.activeMessages.splice(systemIndex,1),conversationsStore.updateConversationTimestamp(), +!1}catch(error2){return console.error("Failed to remove system prompt placeholder:",error2),!1}}async createAssistantMessage(parentId){const activeConv=conversationsStore.activeConversation;if(!activeConv)throw new Error("No active conversation");return await DatabaseService.createMessageBranch({convId:activeConv.id,type:MessageType.TEXT,role:MessageRole.ASSISTANT,content:"",timestamp:Date.now(),toolCalls:"",children:[],model:null},parentId||null)}async sendMessage(content2,extras){if(!content2. +trim()&&(!extras||extras.length===0))return;const activeConv=conversationsStore.activeConversation;if(activeConv&&agenticStore.isRunning(activeConv.id)){agenticStore.injectSteeringMessage(activeConv.id,content2,extras);return}if(activeConv&&this.isChatLoadingInternal(activeConv.id)){this.injectPendingMessage(activeConv.id,content2,extras);return}this.cancelPreEncode();const resourceExtras=mcpStore.consumeResourceAttachmentsAsExtras(),allExtras=resourceExtras.length>0?[...extras||[],...resourceExtras]: +extras;let isNewConversation=!1;activeConv||(await conversationsStore.createConversation(),isNewConversation=!0);const currentConv=conversationsStore.activeConversation;if(currentConv){this.showErrorDialog(null),this.setChatLoading(currentConv.id,!0),this.clearChatStreaming(currentConv.id);try{let parentIdForUserMessage;if(isNewConversation){const rootId=await DatabaseService.createRootMessage(currentConv.id),systemPrompt=config$1().systemMessage?.toString().trim();if(systemPrompt){const systemMessage=await DatabaseService. +createSystemMessage(currentConv.id,systemPrompt,rootId);conversationsStore.addMessageToActive(systemMessage),parentIdForUserMessage=systemMessage.id}else parentIdForUserMessage=rootId}const userMessage=await this.addMessage(MessageRole.USER,content2,MessageType.TEXT,parentIdForUserMessage??"-1",allExtras);isNewConversation&&content2&&await conversationsStore.updateConversationName(currentConv.id,generateConversationTitle(content2,!!config$1().titleGenerationUseFirstLine));const assistantMessage=await this. +createAssistantMessage(userMessage.id);conversationsStore.addMessageToActive(assistantMessage),await this.streamChatCompletion(conversationsStore.activeMessages.slice(0,-1),assistantMessage)}catch(error2){if(isAbortError(error2)){this.setChatLoading(currentConv.id,!1);return}console.error("Failed to send message:",error2),this.setChatLoading(currentConv.id,!1);const dialogType=error2 instanceof Error&&error2.name==="TimeoutError"?ErrorDialogType.TIMEOUT:ErrorDialogType.SERVER,contextInfo=error2. +contextInfo;this.showErrorDialog({type:dialogType,message:error2 instanceof Error?error2.message:"Unknown error",contextInfo})}}}async streamChatCompletion(allMessages,assistantMessage,onComplete,onError,modelOverride){let effectiveModel=modelOverride;if(isRouterMode()&&!effectiveModel){const conversationModel=this.getConversationModel(allMessages);effectiveModel=selectedModelName()||conversationModel}isRouterMode()&&effectiveModel&&(modelsStore.getModelProps(effectiveModel)||await modelsStore.fetchModelProps( +effectiveModel));let currentMessageId=assistantMessage.id,streamedContent="",streamedReasoningContent="",resolvedModel=null,modelPersisted=!1;const convId=assistantMessage.convId,recordModel=(modelName,persistImmediately=!0)=>{if(!modelName)return;const n=normalizeModelName(modelName);if(!n||n===resolvedModel)return;resolvedModel=n;const idx=conversationsStore.findMessageIndex(currentMessageId);conversationsStore.updateMessageAtIndex(idx,{model:n}),persistImmediately&&!modelPersisted&&(modelPersisted= +!0,DatabaseService.updateMessage(currentMessageId,{model:n}).catch(()=>{modelPersisted=!1,resolvedModel=null}))},updateStreamingUI=()=>{this.setChatStreaming(convId,streamedContent,currentMessageId);const idx=conversationsStore.findMessageIndex(currentMessageId);conversationsStore.updateMessageAtIndex(idx,{content:streamedContent})},cleanupStreamingState=()=>{this.setStreamingActive(!1),this.setChatLoading(convId,!1),this.clearChatStreaming(convId),this.setProcessingState(convId,null)};this.setStreamingActive( +!0),this.setActiveProcessingConversation(convId);const abortController=this.getOrCreateAbortController(convId),streamCallbacks={onChunk:chunk=>{streamedContent+=chunk,updateStreamingUI()},onReasoningChunk:chunk=>{streamedReasoningContent+=chunk;const idx=conversationsStore.findMessageIndex(currentMessageId);conversationsStore.updateMessageAtIndex(idx,{reasoningContent:streamedReasoningContent})},onToolCallsStreaming:toolCalls=>{const idx=conversationsStore.findMessageIndex(currentMessageId);conversationsStore. +updateMessageAtIndex(idx,{toolCalls:JSON.stringify(toolCalls)})},onAttachments:(messageId,extras)=>{if(!extras.length)return;const idx=conversationsStore.findMessageIndex(messageId);if(idx===-1)return;const updatedExtras=[...conversationsStore.activeMessages[idx].extra||[],...extras];conversationsStore.updateMessageAtIndex(idx,{extra:updatedExtras}),DatabaseService.updateMessage(messageId,{extra:updatedExtras}).catch(console.error)},onModel:modelName=>recordModel(modelName),onTurnComplete:intermediateTimings=>{ +const idx=conversationsStore.findMessageIndex(assistantMessage.id);conversationsStore.updateMessageAtIndex(idx,{timings:intermediateTimings})},onTimings:(timings,promptProgress)=>{const tokensPerSecond=timings?.predicted_ms&&timings?.predicted_n?timings.predicted_n/timings.predicted_ms*1e3:0;this.updateProcessingStateFromTimings({prompt_n:timings?.prompt_n||0,prompt_ms:timings?.prompt_ms,predicted_n:timings?.predicted_n||0,predicted_per_second:tokensPerSecond,cache_n:timings?.cache_n||0,prompt_progress:promptProgress}, +convId)},onAssistantTurnComplete:async(content2,reasoningContent,timings,toolCalls)=>{const updateData={content:content2,reasoningContent:reasoningContent||void 0,toolCalls:toolCalls?JSON.stringify(toolCalls):"",timings};resolvedModel&&!modelPersisted&&(updateData.model=resolvedModel),await DatabaseService.updateMessage(currentMessageId,updateData);const idx=conversationsStore.findMessageIndex(currentMessageId),uiUpdate={content:content2,reasoningContent:reasoningContent||void 0,toolCalls:toolCalls? +JSON.stringify(toolCalls):""};timings&&(uiUpdate.timings=timings),resolvedModel&&(uiUpdate.model=resolvedModel),conversationsStore.updateMessageAtIndex(idx,uiUpdate),await conversationsStore.updateCurrentNode(currentMessageId)},createToolResultMessage:async(toolCallId,content2,extras)=>{const msg=await DatabaseService.createMessageBranch({convId,type:MessageType.TEXT,role:MessageRole.TOOL,content:content2,toolCallId,timestamp:Date.now(),toolCalls:"",children:[],extra:extras},currentMessageId);return conversationsStore. +addMessageToActive(msg),await conversationsStore.updateCurrentNode(msg.id),msg},createAssistantMessage:async()=>{streamedContent="",streamedReasoningContent="";const lastMsg=conversationsStore.activeMessages[conversationsStore.activeMessages.length-1],msg=await DatabaseService.createMessageBranch({convId,type:MessageType.TEXT,role:MessageRole.ASSISTANT,content:"",timestamp:Date.now(),toolCalls:"",children:[],model:resolvedModel},lastMsg.id);return conversationsStore.addMessageToActive(msg),currentMessageId= +msg.id,msg},onFlowComplete:finalTimings=>{if(finalTimings){const idx=conversationsStore.findMessageIndex(assistantMessage.id);conversationsStore.updateMessageAtIndex(idx,{timings:finalTimings}),DatabaseService.updateMessage(assistantMessage.id,{timings:finalTimings}).catch(console.error)}cleanupStreamingState(),onComplete&&onComplete(streamedContent),isRouterMode()&&modelsStore.fetchRouterModels().catch(console.error),config$1().preEncodeConversation&&this.triggerPreEncode(allMessages,assistantMessage, +streamedContent,effectiveModel,!!config$1().excludeReasoningFromContext)},onError:error2=>{if(this.setStreamingActive(!1),isAbortError(error2)){cleanupStreamingState();const pending=this.consumePendingMessage(convId);pending&&this.sendMessage(pending.content,pending.extras);return}console.error("Streaming error:",error2),cleanupStreamingState(),this.clearPendingMessage(convId);const idx=conversationsStore.findMessageIndex(assistantMessage.id);if(idx!==-1){const failedMessage=conversationsStore.removeMessageAtIndex( +idx);failedMessage&&DatabaseService.deleteMessage(failedMessage.id).catch(console.error)}const contextInfo=error2.contextInfo;this.showErrorDialog({type:error2.name==="TimeoutError"?ErrorDialogType.TIMEOUT:ErrorDialogType.SERVER,message:error2.message,contextInfo}),onError&&onError(error2)}},perChatOverrides=conversationsStore.activeConversation?.mcpServerOverrides;if((await agenticStore.runAgenticFlow({conversationId:convId,messages:allMessages,options:{...this.getApiOptions(),...effectiveModel? +{model:effectiveModel}:{}},callbacks:streamCallbacks,signal:abortController.signal,perChatOverrides})).handled){const pending=agenticStore.consumePendingSteeringMessage(convId);pending&&await this.sendMessage(pending.content,pending.extras);return}await ChatService.sendMessage(allMessages,{...this.getApiOptions(),...effectiveModel?{model:effectiveModel}:{},stream:!0,onChunk:streamCallbacks.onChunk,onReasoningChunk:streamCallbacks.onReasoningChunk,onModel:streamCallbacks.onModel,onTimings:streamCallbacks. +onTimings,onComplete:async(finalContent,reasoningContent,timings,toolCalls)=>{const content2=streamedContent||finalContent||"",reasoning=streamedReasoningContent||reasoningContent,updateData={content:content2,reasoningContent:reasoning||void 0,toolCalls:toolCalls||"",timings};resolvedModel&&!modelPersisted&&(updateData.model=resolvedModel),await DatabaseService.updateMessage(currentMessageId,updateData);const idx=conversationsStore.findMessageIndex(currentMessageId),uiUpdate={content:content2,reasoningContent:reasoning|| +void 0,toolCalls:toolCalls||""};timings&&(uiUpdate.timings=timings),resolvedModel&&(uiUpdate.model=resolvedModel),conversationsStore.updateMessageAtIndex(idx,uiUpdate),await conversationsStore.updateCurrentNode(currentMessageId),cleanupStreamingState(),onComplete&&await onComplete(content2),isRouterMode()&&modelsStore.fetchRouterModels().catch(console.error);const pending=this.consumePendingMessage(convId);pending&&await this.sendMessage(pending.content,pending.extras)},onError:streamCallbacks.onError}, +convId,abortController.signal)}async stopGeneration(){const activeConv=conversationsStore.activeConversation;activeConv&&await this.stopGenerationForChat(activeConv.id)}async stopGenerationForChat(convId){await this.savePartialResponseIfNeeded(convId),this.setStreamingActive(!1),this.abortRequest(convId),this.setChatLoading(convId,!1),this.clearChatStreaming(convId),this.setProcessingState(convId,null),this.clearPendingMessage(convId)}async savePartialResponseIfNeeded(convId){const conversationId=convId|| +conversationsStore.activeConversation?.id;if(!conversationId)return;const streamingState=this.getChatStreaming(conversationId);if(!streamingState||!streamingState.response.trim())return;const messages=conversationId===conversationsStore.activeConversation?.id?conversationsStore.activeMessages:await conversationsStore.getConversationMessages(conversationId);if(!messages.length)return;const lastMessage=messages[messages.length-1];if(lastMessage?.role===MessageRole.ASSISTANT)try{const updateData={content:streamingState. +response},lastKnownState=this.getProcessingState(conversationId);lastKnownState&&(updateData.timings={prompt_n:lastKnownState.promptTokens||0,prompt_ms:lastKnownState.promptMs,predicted_n:lastKnownState.tokensDecoded||0,cache_n:lastKnownState.cacheTokens||0,predicted_ms:lastKnownState.tokensPerSecond&&lastKnownState.tokensDecoded?lastKnownState.tokensDecoded/lastKnownState.tokensPerSecond*1e3:void 0}),await DatabaseService.updateMessage(lastMessage.id,updateData),lastMessage.content=streamingState. +response,updateData.timings&&(lastMessage.timings=updateData.timings)}catch(error2){lastMessage.content=streamingState.response,console.error("Failed to save partial response:",error2)}}async updateMessage(messageId,newContent){const activeConv=conversationsStore.activeConversation;if(!activeConv)return;this.isChatLoadingInternal(activeConv.id)&&await this.stopGeneration();const result=this.getMessageByIdWithRole(messageId,MessageRole.USER);if(!result)return;const{message:messageToUpdate,index:messageIndex}=result, +originalContent=messageToUpdate.content;try{const rootMessage=(await conversationsStore.getConversationMessages(activeConv.id)).find(m=>m.type==="root"&&m.parent===null),isFirstUserMessage=rootMessage&&messageToUpdate.parent===rootMessage.id;conversationsStore.updateMessageAtIndex(messageIndex,{content:newContent}),await DatabaseService.updateMessage(messageId,{content:newContent}),isFirstUserMessage&&newContent.trim()&&await conversationsStore.updateConversationTitleWithConfirmation(activeConv. +id,generateConversationTitle(newContent,!!config$1().titleGenerationUseFirstLine));const messagesToRemove=conversationsStore.activeMessages.slice(messageIndex+1);for(const message of messagesToRemove)await DatabaseService.deleteMessage(message.id);conversationsStore.sliceActiveMessages(messageIndex+1),conversationsStore.updateConversationTimestamp(),this.setChatLoading(activeConv.id,!0),this.clearChatStreaming(activeConv.id);const assistantMessage=await this.createAssistantMessage();conversationsStore. +addMessageToActive(assistantMessage),await conversationsStore.updateCurrentNode(assistantMessage.id),await this.streamChatCompletion(conversationsStore.activeMessages.slice(0,-1),assistantMessage,void 0,()=>{conversationsStore.updateMessageAtIndex(conversationsStore.findMessageIndex(messageId),{content:originalContent})})}catch(error2){isAbortError(error2)||console.error("Failed to update message:",error2)}}async regenerateMessage(messageId){const activeConv=conversationsStore.activeConversation; +if(!activeConv||this.isChatLoadingInternal(activeConv.id))return;this.cancelPreEncode();const result=this.getMessageByIdWithRole(messageId,MessageRole.ASSISTANT);if(!result)return;const{index:messageIndex}=result;try{const messagesToRemove=conversationsStore.activeMessages.slice(messageIndex);for(const message of messagesToRemove)await DatabaseService.deleteMessage(message.id);conversationsStore.sliceActiveMessages(messageIndex),conversationsStore.updateConversationTimestamp(),this.setChatLoading( +activeConv.id,!0),this.clearChatStreaming(activeConv.id);const parentMessageId=conversationsStore.activeMessages.length>0?conversationsStore.activeMessages[conversationsStore.activeMessages.length-1].id:void 0,assistantMessage=await this.createAssistantMessage(parentMessageId);conversationsStore.addMessageToActive(assistantMessage),await this.streamChatCompletion(conversationsStore.activeMessages.slice(0,-1),assistantMessage)}catch(error2){isAbortError(error2)||console.error("Failed to regenerat\ +e message:",error2),this.setChatLoading(activeConv?.id||"",!1)}}async regenerateMessageWithBranching(messageId,modelOverride){const activeConv=conversationsStore.activeConversation;if(!(!activeConv||this.isChatLoadingInternal(activeConv.id))){this.cancelPreEncode();try{const idx=conversationsStore.findMessageIndex(messageId);if(idx===-1)return;const msg=conversationsStore.activeMessages[idx];if(msg.role!==MessageRole.ASSISTANT)return;const allMessages=await conversationsStore.getConversationMessages( +activeConv.id),parentMessage=findMessageById(allMessages,msg.parent);if(!parentMessage)return;this.setChatLoading(activeConv.id,!0),this.clearChatStreaming(activeConv.id);const newAssistantMessage=await DatabaseService.createMessageBranch({convId:msg.convId,type:msg.type,timestamp:Date.now(),role:msg.role,content:"",toolCalls:"",children:[],model:null},parentMessage.id);await conversationsStore.updateCurrentNode(newAssistantMessage.id),conversationsStore.updateConversationTimestamp(),await conversationsStore. +refreshActiveMessages();const conversationPath=filterByLeafNodeId(allMessages,parentMessage.id,!1),modelToUse=modelOverride||msg.model||void 0;await this.streamChatCompletion(conversationPath,newAssistantMessage,void 0,void 0,modelToUse)}catch(error2){isAbortError(error2)||console.error("Failed to regenerate message with branching:",error2),this.setChatLoading(activeConv?.id||"",!1)}}}async getDeletionInfo(messageId){const activeConv=conversationsStore.activeConversation;if(!activeConv)return{totalCount:0, +userMessages:0,assistantMessages:0,messageTypes:[]};const allMessages=await conversationsStore.getConversationMessages(activeConv.id);if(findMessageById(allMessages,messageId)?.role===MessageRole.SYSTEM){const messagesToDelete2=allMessages.filter(m=>m.id===messageId);let userMessages2=0,assistantMessages2=0;const messageTypes2=[];for(const msg of messagesToDelete2)msg.role===MessageRole.USER?(userMessages2++,messageTypes2.includes("user message")||messageTypes2.push("user message")):msg.role===MessageRole. +ASSISTANT&&(assistantMessages2++,messageTypes2.includes("assistant response")||messageTypes2.push("assistant response"));return{totalCount:1,userMessages:userMessages2,assistantMessages:assistantMessages2,messageTypes:messageTypes2}}const descendants=findDescendantMessages(allMessages,messageId),allToDelete=[messageId,...descendants],messagesToDelete=allMessages.filter(m=>allToDelete.includes(m.id));let userMessages=0,assistantMessages=0;const messageTypes=[];for(const msg of messagesToDelete)msg. +role===MessageRole.USER?(userMessages++,messageTypes.includes("user message")||messageTypes.push("user message")):msg.role===MessageRole.ASSISTANT&&(assistantMessages++,messageTypes.includes("assistant response")||messageTypes.push("assistant response"));return{totalCount:allToDelete.length,userMessages,assistantMessages,messageTypes}}async deleteMessage(messageId){const activeConv=conversationsStore.activeConversation;if(activeConv)try{const allMessages=await conversationsStore.getConversationMessages( +activeConv.id),messageToDelete=findMessageById(allMessages,messageId);if(!messageToDelete)return;if(filterByLeafNodeId(allMessages,activeConv.currNode||"",!1).some(m=>m.id===messageId)&&messageToDelete.parent){const siblings2=allMessages.filter(m=>m.parent===messageToDelete.parent&&m.id!==messageId);if(siblings2.length>0){const latestSibling=siblings2.reduce((latest,sibling2)=>sibling2.timestamp>latest.timestamp?sibling2:latest);await conversationsStore.updateCurrentNode(findLeafNode(allMessages, +latestSibling.id))}else messageToDelete.parent&&await conversationsStore.updateCurrentNode(findLeafNode(allMessages,messageToDelete.parent))}await DatabaseService.deleteMessageCascading(activeConv.id,messageId),await conversationsStore.refreshActiveMessages(),conversationsStore.updateConversationTimestamp()}catch(error2){console.error("Failed to delete message:",error2)}}async continueAssistantMessage(messageId){const activeConv=conversationsStore.activeConversation;if(!activeConv||this.isChatLoadingInternal( +activeConv.id))return;const result=this.getMessageByIdWithRole(messageId,MessageRole.ASSISTANT);if(!result)return;const{message:msg,index:idx}=result;try{this.showErrorDialog(null),this.setChatLoading(activeConv.id,!0),this.clearChatStreaming(activeConv.id);const allMessages=await conversationsStore.getConversationMessages(activeConv.id),dbMessage=findMessageById(allMessages,messageId);if(!dbMessage){this.setChatLoading(activeConv.id,!1);return}const originalContent=dbMessage.content,originalReasoning=dbMessage. +reasoningContent||"",contextWithContinue=[...conversationsStore.activeMessages.slice(0,idx),{role:MessageRole.ASSISTANT,content:originalContent}];let appendedContent="",appendedReasoning="",hasReceivedContent=!1;const updateStreamingContent=fullContent=>{this.setChatStreaming(msg.convId,fullContent,msg.id),conversationsStore.updateMessageAtIndex(idx,{content:fullContent})},abortController=this.getOrCreateAbortController(msg.convId);await ChatService.sendMessage(contextWithContinue,{...this.getApiOptions(), +onChunk:chunk=>{appendedContent+=chunk,hasReceivedContent=!0,updateStreamingContent(originalContent+appendedContent)},onReasoningChunk:chunk=>{appendedReasoning+=chunk,hasReceivedContent=!0,conversationsStore.updateMessageAtIndex(idx,{reasoningContent:originalReasoning+appendedReasoning})},onTimings:(timings,promptProgress)=>{const tokensPerSecond=timings?.predicted_ms&&timings?.predicted_n?timings.predicted_n/timings.predicted_ms*1e3:0;this.updateProcessingStateFromTimings({prompt_n:timings?.prompt_n|| +0,prompt_ms:timings?.prompt_ms,predicted_n:timings?.predicted_n||0,predicted_per_second:tokensPerSecond,cache_n:timings?.cache_n||0,prompt_progress:promptProgress},msg.convId)},onComplete:async(finalContent,reasoningContent,timings)=>{const finalAppendedContent=hasReceivedContent?appendedContent:finalContent||"",finalAppendedReasoning=hasReceivedContent?appendedReasoning:reasoningContent||"",fullContent=originalContent+finalAppendedContent,fullReasoning=originalReasoning+finalAppendedReasoning|| +void 0;await DatabaseService.updateMessage(msg.id,{content:fullContent,reasoningContent:fullReasoning,timestamp:Date.now(),timings}),conversationsStore.updateMessageAtIndex(idx,{content:fullContent,reasoningContent:fullReasoning,timestamp:Date.now(),timings}),conversationsStore.updateConversationTimestamp(),this.setChatLoading(msg.convId,!1),this.clearChatStreaming(msg.convId),this.setProcessingState(msg.convId,null)},onError:async error2=>{if(isAbortError(error2)){hasReceivedContent&&appendedContent&& +(await DatabaseService.updateMessage(msg.id,{content:originalContent+appendedContent,reasoningContent:originalReasoning+appendedReasoning||void 0,timestamp:Date.now()}),conversationsStore.updateMessageAtIndex(idx,{content:originalContent+appendedContent,reasoningContent:originalReasoning+appendedReasoning||void 0,timestamp:Date.now()})),this.setChatLoading(msg.convId,!1),this.clearChatStreaming(msg.convId),this.setProcessingState(msg.convId,null);return}console.error("Continue generation error:", +error2),conversationsStore.updateMessageAtIndex(idx,{content:originalContent}),await DatabaseService.updateMessage(msg.id,{content:originalContent}),this.setChatLoading(msg.convId,!1),this.clearChatStreaming(msg.convId),this.setProcessingState(msg.convId,null),this.showErrorDialog({type:error2.name==="TimeoutError"?ErrorDialogType.TIMEOUT:ErrorDialogType.SERVER,message:error2.message})}},msg.convId,abortController.signal)}catch(error2){isAbortError(error2)||console.error("Failed to continue mess\ +age:",error2),activeConv&&this.setChatLoading(activeConv.id,!1)}}async editAssistantMessage(messageId,newContent,shouldBranch){const activeConv=conversationsStore.activeConversation;if(!activeConv||this.isChatLoadingInternal(activeConv.id))return;const result=this.getMessageByIdWithRole(messageId,MessageRole.ASSISTANT);if(!result)return;const{message:msg,index:idx}=result;try{if(shouldBranch){const newMessage=await DatabaseService.createMessageBranch({convId:msg.convId,type:msg.type,timestamp:Date. +now(),role:msg.role,content:newContent,toolCalls:msg.toolCalls||"",children:[],model:msg.model},msg.parent);await conversationsStore.updateCurrentNode(newMessage.id)}else await DatabaseService.updateMessage(msg.id,{content:newContent}),conversationsStore.updateMessageAtIndex(idx,{content:newContent});conversationsStore.updateConversationTimestamp(),await conversationsStore.refreshActiveMessages()}catch(error2){console.error("Failed to edit assistant message:",error2)}}async editUserMessagePreserveResponses(messageId,newContent,newExtras){ +const activeConv=conversationsStore.activeConversation;if(!activeConv)return;const result=this.getMessageByIdWithRole(messageId,MessageRole.USER);if(!result)return;const{message:msg,index:idx}=result;try{const updateData={content:newContent};newExtras!==void 0&&(updateData.extra=JSON.parse(JSON.stringify(newExtras))),await DatabaseService.updateMessage(messageId,updateData),conversationsStore.updateMessageAtIndex(idx,updateData);const rootMessage=(await conversationsStore.getConversationMessages( +activeConv.id)).find(m=>m.type==="root"&&m.parent===null);rootMessage&&msg.parent===rootMessage.id&&newContent.trim()&&await conversationsStore.updateConversationTitleWithConfirmation(activeConv.id,generateConversationTitle(newContent,!!config$1().titleGenerationUseFirstLine)),conversationsStore.updateConversationTimestamp()}catch(error2){console.error("Failed to edit user message:",error2)}}async editMessageWithBranching(messageId,newContent,newExtras){const activeConv=conversationsStore.activeConversation; +if(!activeConv||this.isChatLoadingInternal(activeConv.id))return;let result=this.getMessageByIdWithRole(messageId,MessageRole.USER);if(result||(result=this.getMessageByIdWithRole(messageId,MessageRole.SYSTEM)),!result)return;const{message:msg,index:idx}=result;try{const allMessages=await conversationsStore.getConversationMessages(activeConv.id),rootMessage=allMessages.find(m=>m.type==="root"&&m.parent===null),isFirstUserMessage=msg.role===MessageRole.USER&&rootMessage&&msg.parent===rootMessage.id, +extrasToUse=newExtras!==void 0?JSON.parse(JSON.stringify(newExtras)):msg.extra?JSON.parse(JSON.stringify(msg.extra)):void 0;let messageIdForResponse;const dbMsg=findMessageById(allMessages,msg.id);if(dbMsg?dbMsg.children.length>0:msg.children.length>0){const parentId=msg.parent||rootMessage?.id;if(!parentId)return;const newMessage=await DatabaseService.createMessageBranch({convId:msg.convId,type:msg.type,timestamp:Date.now(),role:msg.role,content:newContent,toolCalls:msg.toolCalls||"",children:[], +extra:extrasToUse,model:msg.model},parentId);await conversationsStore.updateCurrentNode(newMessage.id),messageIdForResponse=newMessage.id}else{const updates={content:newContent,timestamp:Date.now(),extra:extrasToUse};await DatabaseService.updateMessage(msg.id,updates),conversationsStore.updateMessageAtIndex(idx,updates),messageIdForResponse=msg.id}conversationsStore.updateConversationTimestamp(),isFirstUserMessage&&newContent.trim()&&await conversationsStore.updateConversationTitleWithConfirmation( +activeConv.id,generateConversationTitle(newContent,!!config$1().titleGenerationUseFirstLine)),await conversationsStore.refreshActiveMessages(),msg.role===MessageRole.USER&&await this.generateResponseForMessage(messageIdForResponse)}catch(error2){console.error("Failed to edit message with branching:",error2)}}async generateResponseForMessage(userMessageId){const activeConv=conversationsStore.activeConversation;if(activeConv){this.showErrorDialog(null),this.setChatLoading(activeConv.id,!0),this.clearChatStreaming( +activeConv.id);try{const allMessages=await conversationsStore.getConversationMessages(activeConv.id),conversationPath=filterByLeafNodeId(allMessages,userMessageId,!1),assistantMessage=await DatabaseService.createMessageBranch({convId:activeConv.id,type:MessageType.TEXT,timestamp:Date.now(),role:MessageRole.ASSISTANT,content:"",toolCalls:"",children:[],model:null},userMessageId);conversationsStore.addMessageToActive(assistantMessage),await this.streamChatCompletion(conversationPath,assistantMessage)}catch(error2){ +console.error("Failed to generate response:",error2),this.setChatLoading(activeConv.id,!1)}}}getContextTotal(){const activeConvId=this.activeConversationId,activeState=activeConvId?this.getProcessingState(activeConvId):null;if(activeState&&typeof activeState.contextTotal=="number"&&activeState.contextTotal>0)return activeState.contextTotal;if(isRouterMode()){const modelContextSize=selectedModelContextSize();if(typeof modelContextSize=="number"&&modelContextSize>0)return modelContextSize}else{const propsContextSize=contextSize(); +if(typeof propsContextSize=="number"&&propsContextSize>0)return propsContextSize}return null}updateProcessingStateFromTimings(timingData,conversationId){const processingState=this.parseTimingData(timingData);if(processingState===null){console.warn("Failed to parse timing data - skipping update");return}const targetId=conversationId||this.activeConversationId;targetId&&this.setProcessingState(targetId,processingState)}parseTimingData(timingData){const promptTokens=timingData.prompt_n||0,promptMs=timingData. +prompt_ms||void 0,predictedTokens=timingData.predicted_n||0,tokensPerSecond=timingData.predicted_per_second||0,cacheTokens=timingData.cache_n||0,promptProgress=timingData.prompt_progress,contextTotal=this.getContextTotal(),currentConfig=config$1(),outputTokensMax=currentConfig.max_tokens||-1,contextUsed=promptTokens+cacheTokens+predictedTokens,outputTokensUsed=predictedTokens,progressCache=promptProgress?.cache||0,progressActualDone=(promptProgress?.processed??0)-progressCache,progressActualTotal=(promptProgress?. +total??0)-progressCache,progressPercent=promptProgress?Math.round(progressActualDone/progressActualTotal*100):void 0;return{status:predictedTokens>0?"generating":promptProgress?"preparing":"idle",tokensDecoded:predictedTokens,tokensRemaining:outputTokensMax-predictedTokens,contextUsed,contextTotal,outputTokensUsed,outputTokensMax,hasNextToken:predictedTokens>0,tokensPerSecond,temperature:currentConfig.temperature??.8,topP:currentConfig.top_p??.95,speculative:!1,progressPercent,promptProgress,promptTokens, +promptMs,cacheTokens}}restoreProcessingStateFromMessages(messages,conversationId){for(let i=messages.length-1;i>=0;i--){const message=messages[i];if(message.role===MessageRole.ASSISTANT&&message.timings){const restoredState=this.parseTimingData({prompt_n:message.timings.prompt_n||0,prompt_ms:message.timings.prompt_ms,predicted_n:message.timings.predicted_n||0,predicted_per_second:message.timings.predicted_n&&message.timings.predicted_ms?message.timings.predicted_n/message.timings.predicted_ms*1e3: +0,cache_n:message.timings.cache_n||0});if(restoredState){this.setProcessingState(conversationId,restoredState);return}}}}getConversationModel(messages){for(let i=messages.length-1;i>=0;i--){const message=messages[i];if(message.role===MessageRole.ASSISTANT&&message.model)return message.model}return null}getApiOptions(){const currentConfig=config$1(),hasValue=value=>value!=null&&value!=="",apiOptions={stream:!0,timings_per_token:!0};if(isRouterMode()){const modelName=selectedModelName();modelName&& +(apiOptions.model=modelName)}return currentConfig.systemMessage&&(apiOptions.systemMessage=currentConfig.systemMessage),currentConfig.disableReasoningParsing&&(apiOptions.disableReasoningParsing=!0),currentConfig.excludeReasoningFromContext&&(apiOptions.excludeReasoningFromContext=!0),hasValue(currentConfig.temperature)&&(apiOptions.temperature=Number(currentConfig.temperature)),hasValue(currentConfig.max_tokens)&&(apiOptions.max_tokens=Number(currentConfig.max_tokens)),hasValue(currentConfig.dynatemp_range)&& +(apiOptions.dynatemp_range=Number(currentConfig.dynatemp_range)),hasValue(currentConfig.dynatemp_exponent)&&(apiOptions.dynatemp_exponent=Number(currentConfig.dynatemp_exponent)),hasValue(currentConfig.top_k)&&(apiOptions.top_k=Number(currentConfig.top_k)),hasValue(currentConfig.top_p)&&(apiOptions.top_p=Number(currentConfig.top_p)),hasValue(currentConfig.min_p)&&(apiOptions.min_p=Number(currentConfig.min_p)),hasValue(currentConfig.xtc_probability)&&(apiOptions.xtc_probability=Number(currentConfig. +xtc_probability)),hasValue(currentConfig.xtc_threshold)&&(apiOptions.xtc_threshold=Number(currentConfig.xtc_threshold)),hasValue(currentConfig.typ_p)&&(apiOptions.typ_p=Number(currentConfig.typ_p)),hasValue(currentConfig.repeat_last_n)&&(apiOptions.repeat_last_n=Number(currentConfig.repeat_last_n)),hasValue(currentConfig.repeat_penalty)&&(apiOptions.repeat_penalty=Number(currentConfig.repeat_penalty)),hasValue(currentConfig.presence_penalty)&&(apiOptions.presence_penalty=Number(currentConfig.presence_penalty)), +hasValue(currentConfig.frequency_penalty)&&(apiOptions.frequency_penalty=Number(currentConfig.frequency_penalty)),hasValue(currentConfig.dry_multiplier)&&(apiOptions.dry_multiplier=Number(currentConfig.dry_multiplier)),hasValue(currentConfig.dry_base)&&(apiOptions.dry_base=Number(currentConfig.dry_base)),hasValue(currentConfig.dry_allowed_length)&&(apiOptions.dry_allowed_length=Number(currentConfig.dry_allowed_length)),hasValue(currentConfig.dry_penalty_last_n)&&(apiOptions.dry_penalty_last_n=Number( +currentConfig.dry_penalty_last_n)),currentConfig.samplers&&(apiOptions.samplers=currentConfig.samplers),apiOptions.backend_sampling=currentConfig.backend_sampling,currentConfig.custom&&(apiOptions.custom=currentConfig.custom),apiOptions}cancelPreEncode(){this.preEncodeAbortController&&(this.preEncodeAbortController.abort(),this.preEncodeAbortController=null)}async triggerPreEncode(allMessages,assistantMessage,assistantContent,model,excludeReasoning){this.cancelPreEncode(),this.preEncodeAbortController= +new AbortController;const signal=this.preEncodeAbortController.signal;try{if(!await ChatService.areAllSlotsIdle(model,signal)||signal.aborted)return;const messagesWithAssistant=[...allMessages,{...assistantMessage,content:assistantContent}];await ChatService.preEncode(messagesWithAssistant,model,excludeReasoning,signal)}catch(err){isAbortError(err)||console.warn("[ChatStore] Pre-encode failed:",err)}}}const chatStore=new ChatStore,activeProcessingState=()=>chatStore.activeProcessingState,errorDialog=()=>chatStore. +errorDialogState,getAddFilesHandler=()=>chatStore.getAddFilesHandler(),getAllLoadingChats=()=>chatStore.getAllLoadingChats(),isChatStreaming=()=>chatStore.isStreaming(),isEditing=()=>chatStore.isEditing(),isLoading=()=>chatStore.isLoading,pendingEditMessageId=()=>chatStore.pendingEditMessageId,chatPendingMessageContent=convId=>chatStore.pendingMessageContent(convId),chatPendingMessageExtras=convId=>chatStore.pendingMessageExtras(convId),chatClearPendingMessage=convId=>chatStore.clearPendingMessage( +convId),chatInjectPendingMessage=(convId,content2,extras)=>chatStore.injectPendingMessage(convId,content2,extras);var root$1r=from_html('
',1);function ChatForm($$anchor,$$props){push$1($$props,!0);let attachments=prop($$props,"attachments",19,()=>[]),className=prop($$props,"cla\ +ss",3,""),disabled=prop($$props,"disabled",3,!1),isLoading2=prop($$props,"isLoading",3,!1),placeholder=prop($$props,"placeholder",3,"Type a message..."),showMcpPromptButton=prop($$props,"showMcpPromptButton",3,!1),showAddButton=prop($$props,"showAddButton",3,!0),showModelSelector=prop($$props,"showModelSelector",3,!0),uploadedFiles=prop($$props,"uploadedFiles",31,()=>proxy([])),value=prop($$props,"value",15,""),audioRecorder,chatFormActionsRef=state$1(void 0),fileInputRef=state$1(void 0),pickersRef=state$1( +void 0),textareaRef=state$1(void 0),isRecording=state$1(!1),recordingSupported=state$1(!1),isPromptPickerOpen=state$1(!1),promptSearchQuery=state$1(""),isInlineResourcePickerOpen=state$1(!1),resourceSearchQuery=state$1(""),isResourceDialogOpen=state$1(!1),preSelectedResourceUri=state$1(void 0),currentConfig=user_derived(config$1),pasteLongTextToFileLength=user_derived(()=>{const n=Number(get$3(currentConfig).pasteLongTextToFileLen);return Number.isNaN(n)?Number(SETTING_CONFIG_DEFAULT.pasteLongTextToFileLen): +n}),isRouter=user_derived(isRouterMode),conversationModel=user_derived(()=>chatStore.getConversationModel(activeMessages())),activeModelId=user_derived(()=>{const options=modelOptions();if(!get$3(isRouter))return options.length>0?options[0].model:null;const selectedId=selectedModelId();if(selectedId){const model=options.find(m=>m.id===selectedId);if(model)return model.model}if(get$3(conversationModel)){const model=options.find(m=>m.model===get$3(conversationModel));if(model)return model.model}return null}), +hasModelSelected=user_derived(()=>!get$3(isRouter)||!!get$3(conversationModel)||!!selectedModelId()),hasLoadingAttachments=user_derived(()=>uploadedFiles().some(f=>f.isLoading)),hasAttachments=user_derived(()=>attachments()&&attachments().length>0||uploadedFiles()&&uploadedFiles().length>0),canSubmit=user_derived(()=>value().trim().length>0||get$3(hasAttachments));onMount$1(()=>{set$1(recordingSupported,isAudioRecordingSupported(),!0),audioRecorder=new AudioRecorder});function focus2(){get$3(textareaRef)?. +focus()}function resetTextareaHeight(){get$3(textareaRef)?.resetHeight()}function openModelSelector(){get$3(chatFormActionsRef)?.openModelSelector()}function checkModelSelected(){return get$3(hasModelSelected)?!0:(get$3(chatFormActionsRef)?.openModelSelector(),!1)}function handleFileSelect(files){$$props.onFilesAdd?.(files)}function handleFileUpload(){get$3(fileInputRef)?.click()}function handleFileRemove(fileId){if(fileId.startsWith("attachment-")){const index2=parseInt(fileId.replace("attachme\ +nt-",""),10);!isNaN(index2)&&index2>=0&&index2item.kind==="file").map(item=>item.getAsFile()).filter(file=>file!==null);if(files.length>0){event2.preventDefault(),$$props.onFilesAdd?.(files);return}const text2=event2.clipboardData.getData(MimeTypeText.PLAIN);if(text2.startsWith(CLIPBOARD_CONTENT_QUOTE_PREFIX)){const parsed=parseClipboardContent(text2);if(parsed.textAttachments.length>0||parsed.mcpPromptAttachments.length> +0){if(event2.preventDefault(),value(parsed.message),$$props.onValueChange?.(parsed.message),parsed.textAttachments.length>0){const attachmentFiles=parsed.textAttachments.map(att=>new File([att.content],att.name,{type:MimeTypeText.PLAIN}));$$props.onFilesAdd?.(attachmentFiles)}if(parsed.mcpPromptAttachments.length>0){const mcpPromptFiles=parsed.mcpPromptAttachments.map(att=>({id:uuid$1(),name:att.name,size:att.content.length,type:SpecialFileType.MCP_PROMPT,file:new File([att.content],`${att.name}${FileExtensionText. +TXT}`,{type:MimeTypeText.PLAIN}),isLoading:!1,textContent:att.content,mcpPrompt:{serverName:att.serverName,promptName:att.promptName,arguments:att.arguments}}));uploadedFiles([...uploadedFiles(),...mcpPromptFiles]),$$props.onUploadedFilesChange?.(uploadedFiles())}setTimeout(()=>{get$3(textareaRef)?.focus()},10);return}}if(text2.length>0&&get$3(pasteLongTextToFileLength)>0&&text2.length>get$3(pasteLongTextToFileLength)){event2.preventDefault();const textFile=new File([text2],"Pasted",{type:MimeTypeText. +PLAIN});$$props.onFilesAdd?.([textFile])}}function handlePromptLoadStart(placeholderId,promptInfo,args){value().startsWith(PROMPT_TRIGGER_PREFIX)&&(value(""),$$props.onValueChange?.("")),set$1(isPromptPickerOpen,!1),set$1(promptSearchQuery,"");const promptName=promptInfo.title||promptInfo.name,placeholder2={id:placeholderId,name:promptName,size:INITIAL_FILE_SIZE,type:SpecialFileType.MCP_PROMPT,file:new File([],"loading"),isLoading:!0,mcpPrompt:{serverName:promptInfo.serverName,promptName:promptInfo. +name,arguments:args?{...args}:void 0}};uploadedFiles([...uploadedFiles(),placeholder2]),$$props.onUploadedFilesChange?.(uploadedFiles()),get$3(textareaRef)?.focus()}function handlePromptLoadComplete(placeholderId,result){const promptText=result.messages?.map(msg=>typeof msg.content=="string"?msg.content:msg.content.type===ContentPartType.TEXT?msg.content.text:"").filter(Boolean).join(PROMPT_CONTENT_SEPARATOR);uploadedFiles(uploadedFiles().map(f=>f.id===placeholderId?{...f,isLoading:!1,textContent:promptText, +size:promptText.length,file:new File([promptText],`${f.name}${FileExtensionText.TXT}`,{type:MimeTypeText.PLAIN})}:f)),$$props.onUploadedFilesChange?.(uploadedFiles())}function handlePromptLoadError(placeholderId,error2){uploadedFiles(uploadedFiles().map(f=>f.id===placeholderId?{...f,isLoading:!1,loadError:error2}:f)),$$props.onUploadedFilesChange?.(uploadedFiles())}function handlePromptPickerClose(){set$1(isPromptPickerOpen,!1),set$1(promptSearchQuery,""),get$3(textareaRef)?.focus()}function handleInlineResourcePickerClose(){ +set$1(isInlineResourcePickerOpen,!1),set$1(resourceSearchQuery,""),get$3(textareaRef)?.focus()}function handleInlineResourceSelect(){value().startsWith(RESOURCE_TRIGGER_PREFIX)&&(value(""),$$props.onValueChange?.("")),set$1(isInlineResourcePickerOpen,!1),set$1(resourceSearchQuery,""),get$3(textareaRef)?.focus()}function handleBrowseResources(){set$1(isInlineResourcePickerOpen,!1),set$1(resourceSearchQuery,""),value().startsWith(RESOURCE_TRIGGER_PREFIX)&&(value(""),$$props.onValueChange?.("")),set$1( +isResourceDialogOpen,!0)}async function handleMicClick(){if(!audioRecorder||!get$3(recordingSupported)){console.warn("Audio recording not supported");return}if(get$3(isRecording)){set$1(isRecording,!1);try{const audioBlob=await audioRecorder.stopRecording(),wavBlob=await convertToWav(audioBlob),audioFile=createAudioFile(wavBlob);$$props.onFilesAdd?.([audioFile])}catch(error2){console.error("Failed to stop recording:",error2)}}else try{await audioRecorder.startRecording(),set$1(isRecording,!0)}catch(error2){ +console.error("Failed to start recording:",error2)}}var $$exports={focus:focus2,resetTextareaHeight,openModelSelector,checkModelSelected},fragment=root$1r(),node2=first_child(fragment);bind_this(ChatFormFileInputInvisible(node2,{onFileSelect:handleFileSelect}),$$value=>set$1(fileInputRef,$$value,!0),()=>get$3(fileInputRef));var form=sibling(node2,2),node_1=child(form);bind_this(ChatFormPickers(node_1,{get isPromptPickerOpen(){return get$3(isPromptPickerOpen)},get promptSearchQuery(){return get$3( +promptSearchQuery)},get isInlineResourcePickerOpen(){return get$3(isInlineResourcePickerOpen)},get resourceSearchQuery(){return get$3(resourceSearchQuery)},onPromptPickerClose:handlePromptPickerClose,onInlineResourcePickerClose:handleInlineResourcePickerClose,onInlineResourceSelect:handleInlineResourceSelect,onPromptLoadStart:handlePromptLoadStart,onPromptLoadComplete:handlePromptLoadComplete,onPromptLoadError:handlePromptLoadError,onInlineResourceBrowse:handleBrowseResources}),$$value=>set$1(pickersRef, +$$value,!0),()=>get$3(pickersRef));var div=sibling(node_1,2),node_2=child(div);{let $0=user_derived(()=>get$3(activeModelId)??void 0);ChatAttachmentsList(node_2,{get attachments(){return attachments()},onFileRemove:handleFileRemove,limitToSingleRow:!0,class:"py-5",style:"scroll-padding: 1rem;",get activeModelId(){return get$3($0)},get uploadedFiles(){return uploadedFiles()},set uploadedFiles($$value){uploadedFiles($$value)}})}var div_1=sibling(node_2,2),node_3=child(div_1);bind_this(ChatFormTextarea( +node_3,{class:"px-5 py-1.5 md:pt-0",onKeydown:handleKeydown,onInput:()=>{handleInput(),$$props.onValueChange?.(value())},get disabled(){return disabled()},get placeholder(){return placeholder()},get value(){return value()},set value($$value){value($$value)}}),$$value=>set$1(textareaRef,$$value,!0),()=>get$3(textareaRef));var node_4=sibling(node_3,2);{var consequent=$$anchor2=>{ChatFormMcpResourcesList($$anchor2,{class:"mb-3",onResourceClick:uri2=>{set$1(preSelectedResourceUri,uri2,!0),set$1(isResourceDialogOpen, +!0)}})},d2=user_derived(()=>mcpHasResourceAttachments());if_block(node_4,$$render=>{get$3(d2)&&$$render(consequent)})}var node_5=sibling(node_4,2);{let $0=user_derived(()=>showMcpPromptButton()?()=>set$1(isPromptPickerOpen,!0):void 0);bind_this(ChatFormActions(node_5,{class:"px-3",get canSend(){return get$3(canSubmit)},get disabled(){return disabled()},get isLoading(){return isLoading2()},get isRecording(){return get$3(isRecording)},get showAddButton(){return showAddButton()},get showModelSelector(){ +return showModelSelector()},get uploadedFiles(){return uploadedFiles()},onFileUpload:handleFileUpload,onMicClick:handleMicClick,get onStop(){return $$props.onStop},onSystemPromptClick:()=>$$props.onSystemPromptClick?.({message:value(),files:uploadedFiles()}),get onMcpPromptClick(){return get$3($0)},onMcpResourcesClick:()=>set$1(isResourceDialogOpen,!0)}),$$value=>set$1(chatFormActionsRef,$$value,!0),()=>get$3(chatFormActionsRef))}reset(div_1),reset(div),reset(form);var node_6=sibling(form,2);return DialogMcpResourcesBrowser( +node_6,{get preSelectedUri(){return get$3(preSelectedResourceUri)},onAttach:resource=>{mcpStore.attachResource(resource.uri)},onOpenChange:newOpen=>{newOpen||set$1(preSelectedResourceUri,void 0)},get open(){return get$3(isResourceDialogOpen)},set open($$value){set$1(isResourceDialogOpen,$$value,!0)}}),template_effect(()=>{set_class(form,1,`relative ${className()??""}`),set_class(div,1,`${INPUT_CLASSES??""} overflow-hidden rounded-3xl backdrop-blur-md ${disabled()?"cursor-not-allowed opacity-60": +""}`)}),event("submit",form,event2=>{event2.preventDefault(),!(!get$3(canSubmit)||disabled()||get$3(hasLoadingAttachments))&&$$props.onSubmit?.()}),event("paste",div_1,handlePaste),append($$anchor,fragment),pop($$exports)}function Dropdown_menu_content($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),sideOffset=prop($$props,"sideOffset",3,4),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref","sideOffset","portalProps","class"]);var fragment=comment$2(),node2=first_child( +fragment);component(node2,()=>Portal$2,($$anchor2,DropdownMenuPrimitive_Portal)=>{DropdownMenuPrimitive_Portal($$anchor2,spread_props(()=>$$props.portalProps,{children:($$anchor3,$$slotProps)=>{var fragment_1=comment$2(),node_1=first_child(fragment_1);{let $0=user_derived(()=>cn$1("z-50 max-h-(--bits-dropdown-menu-content-available-height) min-w-[8rem] origin-(--bits-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border border-border bg-popover p-1.5 text-po\ +pover-foreground shadow-md outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 dark:border-border/20",$$props.class));component(node_1,()=>Dropdown_menu_content$1,($$anchor4,DropdownMenuPrimitive_Content)=>{ +DropdownMenuPrimitive_Content($$anchor4,spread_props({"data-slot":"dropdown-menu-content",get sideOffset(){return sideOffset()},get class(){return get$3($0)}},()=>restProps,{get ref(){return ref2()},set ref($$value){ref2($$value)}}))})}append($$anchor3,fragment_1)},$$slots:{default:!0}}))}),append($$anchor,fragment),pop()}function Dropdown_menu_item($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),variant=prop($$props,"variant",3,"default"),restProps=rest_props($$props,[ +"$$slots","$$events","$$legacy","ref","class","inset","variant"]);var fragment=comment$2(),node2=first_child(fragment);{let $0=user_derived(()=>cn$1("relative flex cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-highlighted:bg-accent data-highlighted:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:data-highlighted:bg-destr\ +uctive/10 data-[variant=destructive]:data-highlighted:text-destructive dark:data-[variant=destructive]:data-highlighted:bg-destructive/20 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground data-[variant=destructive]:*:[svg]:!text-destructive",$$props.class));component(node2,()=>Menu_item,($$anchor2,DropdownMenuPrimitive_Item)=>{DropdownMenuPrimitive_Item($$anchor2,spread_props({"data-slot":"dropdown-menu-item",get"\ +data-inset"(){return $$props.inset},get"data-variant"(){return variant()},get class(){return get$3($0)}},()=>restProps,{get ref(){return ref2()},set ref($$value){ref2($$value)}}))})}append($$anchor,fragment),pop()}function Dropdown_menu_separator($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref","class"]);var fragment=comment$2(),node2=first_child(fragment);{let $0=user_derived(()=>cn$1("-mx-1 my-1 h-px b\ +g-border/20",$$props.class));component(node2,()=>Menu_separator,($$anchor2,DropdownMenuPrimitive_Separator)=>{DropdownMenuPrimitive_Separator($$anchor2,spread_props({"data-slot":"dropdown-menu-separator",get class(){return get$3($0)}},()=>restProps,{get ref(){return ref2()},set ref($$value){ref2($$value)}}))})}append($$anchor,fragment),pop()}function Dropdown_menu_trigger($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),restProps=rest_props($$props,["$$slots","$$events", +"$$legacy","ref"]);var fragment=comment$2(),node2=first_child(fragment);component(node2,()=>Menu_trigger,($$anchor2,DropdownMenuPrimitive_Trigger)=>{DropdownMenuPrimitive_Trigger($$anchor2,spread_props({"data-slot":"dropdown-menu-trigger"},()=>restProps,{get ref(){return ref2()},set ref($$value){ref2($$value)}}))}),append($$anchor,fragment),pop()}function Dropdown_menu_sub_content($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),restProps=rest_props($$props,["$$slots","$\ +$events","$$legacy","ref","class"]);var fragment=comment$2(),node2=first_child(fragment);{let $0=user_derived(()=>cn$1("z-50 max-h-(--bits-dropdown-menu-content-available-height) min-w-[8rem] origin-(--bits-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border border-border bg-popover p-1.5 text-popover-foreground shadow-md outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[\ +side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 dark:border-border/20",$$props.class));component(node2,()=>Menu_sub_content,($$anchor2,DropdownMenuPrimitive_SubContent)=>{DropdownMenuPrimitive_SubContent($$anchor2,spread_props({"data-slot":"dropdown-menu-sub-content",get class(){return get$3($0)}},()=>restProps,{get ref(){return ref2()}, +set ref($$value){ref2($$value)}}))})}append($$anchor,fragment),pop()}var root_1$M=from_html(" ",1);function Dropdown_menu_sub_trigger($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref","class","inset","children"]);var fragment=comment$2(),node2=first_child(fragment);{let $0=user_derived(()=>cn$1("flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-hig\ +hlighted:bg-accent data-highlighted:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground",$$props.class));component(node2,()=>Menu_sub_trigger,($$anchor2,DropdownMenuPrimitive_SubTrigger)=>{DropdownMenuPrimitive_SubTrigger($$anchor2,spread_props( +{"data-slot":"dropdown-menu-sub-trigger",get"data-inset"(){return $$props.inset},get class(){return get$3($0)}},()=>restProps,{get ref(){return ref2()},set ref($$value){ref2($$value)},children:($$anchor3,$$slotProps)=>{var fragment_1=root_1$M(),node_1=first_child(fragment_1);snippet(node_1,()=>$$props.children??noop$3);var node_2=sibling(node_1,2);Chevron_right(node_2,{class:"ml-auto size-4"}),append($$anchor3,fragment_1)},$$slots:{default:!0}}))})}append($$anchor,fragment),pop()}const Sub=Menu_sub, +Root$4=Menu;function useAttachmentMenu(getFlags,getCallbacks,close2){const modalityFlags=user_derived(getFlags),callbacks=user_derived(()=>{const cbs=getCallbacks(),wrap2=fn=>()=>{close2(),fn?.()};return{[AttachmentAction.FILE_UPLOAD]:wrap2(cbs.onFileUpload),[AttachmentAction.SYSTEM_PROMPT_CLICK]:wrap2(cbs.onSystemPromptClick),[AttachmentAction.MCP_PROMPT_CLICK]:wrap2(cbs.onMcpPromptClick),[AttachmentAction.MCP_RESOURCES_CLICK]:wrap2(cbs.onMcpResourcesClick)}});function isItemEnabled(enabledWhen){ +return!enabledWhen||enabledWhen==="always"?!0:!!get$3(modalityFlags)[enabledWhen]}function isItemVisible(visibleWhen){return visibleWhen?!!get$3(modalityFlags)[visibleWhen]:!0}function getSystemMessageTooltip(){return page$1.params.id?"Inject custom system message at the beginning of the conversation":"Add custom system message for a new conversation"}return{get callbacks(){return get$3(callbacks)},isItemEnabled,isItemVisible,getSystemMessageTooltip}}var root_6$u=from_html(" ",1), +root_10$f=from_html(" ",1),root_11$e=from_html("

"),root_8$r=from_html(" ",1),root_16$5=from_html(" ",1),root_17$7=from_html("

PDFs will be converted to text. Image-based PDFs may not work properly.

"),root_13$c=from_html(" ",1),root_22$1=from_html(" ",1),root_23$4=from_html("

"),root_20$4=from_html(" ",1),root_26$2=from_html(" ",1),root_3$Q=from_html(" ",1),root_1$L=from_html( +" ",1),root$1q=from_html("
");function ChatFormActionAddDropdown($$anchor,$$props){push$1($$props,!0);let className=prop($$props,"class",3,""),disabled=prop($$props,"disabled",3,!1),hasAudioModality=prop($$props,"hasAudioModality",3,!1),hasVisionModality=prop($$props,"hasVisionModality",3,!1),hasMcpPromptsSupport=prop($$props,"hasMcpPromptsSupport",3,!1),hasMcpResourcesSupport=prop($$props,"hasMcpResourcesSupport",3,!1),dropdownOpen=state$1(!1);function handleMcpSettingsClick(){ +set$1(dropdownOpen,!1),$$props.onMcpSettingsClick?.()}const attachmentMenu=useAttachmentMenu(()=>({hasVisionModality:hasVisionModality(),hasAudioModality:hasAudioModality(),hasMcpPromptsSupport:hasMcpPromptsSupport(),hasMcpResourcesSupport:hasMcpResourcesSupport()}),()=>({onFileUpload:$$props.onFileUpload,onSystemPromptClick:$$props.onSystemPromptClick,onMcpPromptClick:$$props.onMcpPromptClick,onMcpResourcesClick:$$props.onMcpResourcesClick}),()=>{set$1(dropdownOpen,!1)});var div=root$1q(),node2=child( +div);component(node2,()=>Root$4,($$anchor2,DropdownMenu_Root)=>{DropdownMenu_Root($$anchor2,{get open(){return get$3(dropdownOpen)},set open($$value){set$1(dropdownOpen,$$value,!0)},children:($$anchor3,$$slotProps)=>{var fragment=root_1$L(),node_1=first_child(fragment);component(node_1,()=>Dropdown_menu_trigger,($$anchor4,DropdownMenu_Trigger)=>{DropdownMenu_Trigger($$anchor4,{name:"Attach files",get disabled(){return disabled()},children:($$anchor5,$$slotProps2)=>{var fragment_1=comment$2(),node_2=first_child( +fragment_1);snippet(node_2,()=>$$props.trigger,()=>({disabled:disabled()})),append($$anchor5,fragment_1)},$$slots:{default:!0}})});var node_3=sibling(node_1,2);component(node_3,()=>Dropdown_menu_content,($$anchor4,DropdownMenu_Content)=>{DropdownMenu_Content($$anchor4,{align:"start",class:"w-48",children:($$anchor5,$$slotProps2)=>{var fragment_2=root_3$Q(),node_4=first_child(fragment_2);each(node_4,17,()=>ATTACHMENT_FILE_ITEMS,item=>item.id,($$anchor6,item)=>{const enabled=user_derived(()=>attachmentMenu. +isItemEnabled(get$3(item).enabledWhen));var fragment_3=comment$2(),node_5=first_child(fragment_3);{var consequent=$$anchor7=>{var fragment_4=comment$2(),node_6=first_child(fragment_4);{let $0=user_derived(()=>get$3(item).class??"");component(node_6,()=>Dropdown_menu_item,($$anchor8,DropdownMenu_Item)=>{DropdownMenu_Item($$anchor8,{get class(){return`${get$3($0)??""} flex cursor-pointer items-center gap-2`},onclick:()=>attachmentMenu.callbacks[get$3(item).action](),children:($$anchor9,$$slotProps3)=>{ +var fragment_5=root_6$u(),node_7=first_child(fragment_5);component(node_7,()=>get$3(item).icon,($$anchor10,item_icon)=>{item_icon($$anchor10,{class:"h-4 w-4"})});var span=sibling(node_7,2),text2=child(span,!0);reset(span),template_effect(()=>set_text(text2,get$3(item).label)),append($$anchor9,fragment_5)},$$slots:{default:!0}})})}append($$anchor7,fragment_4)},consequent_1=$$anchor7=>{var fragment_6=comment$2(),node_8=first_child(fragment_6);component(node_8,()=>Root$5,($$anchor8,Tooltip_Root)=>{ +Tooltip_Root($$anchor8,{get delayDuration(){return TOOLTIP_DELAY_DURATION},children:($$anchor9,$$slotProps3)=>{var fragment_7=root_8$r(),node_9=first_child(fragment_7);component(node_9,()=>Tooltip_trigger,($$anchor10,Tooltip_Trigger)=>{Tooltip_Trigger($$anchor10,{class:"w-full",children:($$anchor11,$$slotProps4)=>{var fragment_8=comment$2(),node_10=first_child(fragment_8);{let $0=user_derived(()=>get$3(item).class??"");component(node_10,()=>Dropdown_menu_item,($$anchor12,DropdownMenu_Item_1)=>{DropdownMenu_Item_1( +$$anchor12,{get class(){return`${get$3($0)??""} flex cursor-pointer items-center gap-2`},disabled:!0,children:($$anchor13,$$slotProps5)=>{var fragment_9=root_10$f(),node_11=first_child(fragment_9);component(node_11,()=>get$3(item).icon,($$anchor14,item_icon_1)=>{item_icon_1($$anchor14,{class:"h-4 w-4"})});var span_1=sibling(node_11,2),text_1=child(span_1,!0);reset(span_1),template_effect(()=>set_text(text_1,get$3(item).label)),append($$anchor13,fragment_9)},$$slots:{default:!0}})})}append($$anchor11, +fragment_8)},$$slots:{default:!0}})});var node_12=sibling(node_9,2);component(node_12,()=>Tooltip_content,($$anchor10,Tooltip_Content)=>{Tooltip_Content($$anchor10,{side:"right",children:($$anchor11,$$slotProps4)=>{var p2=root_11$e(),text_2=child(p2,!0);reset(p2),template_effect(()=>set_text(text_2,get$3(item).disabledTooltip)),append($$anchor11,p2)},$$slots:{default:!0}})}),append($$anchor9,fragment_7)},$$slots:{default:!0}})}),append($$anchor7,fragment_6)};if_block(node_5,$$render=>{get$3(enabled)? +$$render(consequent):get$3(item).disabledTooltip&&$$render(consequent_1,1)})}append($$anchor6,fragment_3)});var node_13=sibling(node_4,2);{var consequent_3=$$anchor6=>{var fragment_10=comment$2(),node_14=first_child(fragment_10);component(node_14,()=>Root$5,($$anchor7,Tooltip_Root_1)=>{Tooltip_Root_1($$anchor7,{get delayDuration(){return TOOLTIP_DELAY_DURATION},children:($$anchor8,$$slotProps3)=>{var fragment_11=root_13$c(),node_15=first_child(fragment_11);component(node_15,()=>Tooltip_trigger,($$anchor9,Tooltip_Trigger_1)=>{ +Tooltip_Trigger_1($$anchor9,{class:"w-full",children:($$anchor10,$$slotProps4)=>{var fragment_12=comment$2(),node_16=first_child(fragment_12);component(node_16,()=>Dropdown_menu_item,($$anchor11,DropdownMenu_Item_2)=>{DropdownMenu_Item_2($$anchor11,{class:"flex cursor-pointer items-center gap-2",get onclick(){return attachmentMenu.callbacks.onFileUpload},children:($$anchor12,$$slotProps5)=>{const pdfItem=user_derived(()=>ATTACHMENT_FILE_ITEMS.find(i=>i.id===AttachmentMenuItemId.PDF));var fragment_13=comment$2(), +node_17=first_child(fragment_13);{var consequent_2=$$anchor13=>{var fragment_14=root_16$5(),node_18=first_child(fragment_14);component(node_18,()=>get$3(pdfItem).icon,($$anchor14,pdfItem_icon)=>{pdfItem_icon($$anchor14,{class:"h-4 w-4"})});var span_2=sibling(node_18,2),text_3=child(span_2,!0);reset(span_2),template_effect(()=>set_text(text_3,get$3(pdfItem).label)),append($$anchor13,fragment_14)};if_block(node_17,$$render=>{get$3(pdfItem)&&$$render(consequent_2)})}append($$anchor12,fragment_13)}, +$$slots:{default:!0}})}),append($$anchor10,fragment_12)},$$slots:{default:!0}})});var node_19=sibling(node_15,2);component(node_19,()=>Tooltip_content,($$anchor9,Tooltip_Content_1)=>{Tooltip_Content_1($$anchor9,{side:"right",children:($$anchor10,$$slotProps4)=>{var p_1=root_17$7();append($$anchor10,p_1)},$$slots:{default:!0}})}),append($$anchor8,fragment_11)},$$slots:{default:!0}})}),append($$anchor6,fragment_10)},d2=user_derived(()=>!attachmentMenu.isItemEnabled("hasVisionModality"));if_block(node_13, +$$render=>{get$3(d2)&&$$render(consequent_3)})}var node_20=sibling(node_13,2);component(node_20,()=>Dropdown_menu_separator,($$anchor6,DropdownMenu_Separator)=>{DropdownMenu_Separator($$anchor6,{})});var node_21=sibling(node_20,2);each(node_21,17,()=>ATTACHMENT_EXTRA_ITEMS,item=>item.id,($$anchor6,item)=>{var fragment_15=comment$2(),node_22=first_child(fragment_15);{var consequent_4=$$anchor7=>{var fragment_16=comment$2(),node_23=first_child(fragment_16);component(node_23,()=>Root$5,($$anchor8,Tooltip_Root_2)=>{ +Tooltip_Root_2($$anchor8,{get delayDuration(){return TOOLTIP_DELAY_DURATION},children:($$anchor9,$$slotProps3)=>{var fragment_17=root_20$4(),node_24=first_child(fragment_17);component(node_24,()=>Tooltip_trigger,($$anchor10,Tooltip_Trigger_2)=>{Tooltip_Trigger_2($$anchor10,{class:"w-full",children:($$anchor11,$$slotProps4)=>{var fragment_18=comment$2(),node_25=first_child(fragment_18);component(node_25,()=>Dropdown_menu_item,($$anchor12,DropdownMenu_Item_3)=>{DropdownMenu_Item_3($$anchor12,{class:"\ +flex cursor-pointer items-center gap-2",onclick:()=>attachmentMenu.callbacks[get$3(item).action](),children:($$anchor13,$$slotProps5)=>{var fragment_19=root_22$1(),node_26=first_child(fragment_19);component(node_26,()=>get$3(item).icon,($$anchor14,item_icon_2)=>{item_icon_2($$anchor14,{class:"h-4 w-4"})});var span_3=sibling(node_26,2),text_4=child(span_3,!0);reset(span_3),template_effect(()=>set_text(text_4,get$3(item).label)),append($$anchor13,fragment_19)},$$slots:{default:!0}})}),append($$anchor11, +fragment_18)},$$slots:{default:!0}})});var node_27=sibling(node_24,2);component(node_27,()=>Tooltip_content,($$anchor10,Tooltip_Content_2)=>{Tooltip_Content_2($$anchor10,{side:"right",children:($$anchor11,$$slotProps4)=>{var p_2=root_23$4(),text_5=child(p_2,!0);reset(p_2),template_effect($0=>set_text(text_5,$0),[()=>attachmentMenu.getSystemMessageTooltip()]),append($$anchor11,p_2)},$$slots:{default:!0}})}),append($$anchor9,fragment_17)},$$slots:{default:!0}})}),append($$anchor7,fragment_16)};if_block( +node_22,$$render=>{get$3(item).id===AttachmentMenuItemId.SYSTEM_MESSAGE&&$$render(consequent_4)})}append($$anchor6,fragment_15)});var node_28=sibling(node_21,2);ChatFormActionAddToolsSubmenu(node_28,{});var node_29=sibling(node_28,2);ChatFormActionAddMcpServersSubmenu(node_29,{onMcpSettingsClick:handleMcpSettingsClick});var node_30=sibling(node_29,2);each(node_30,17,()=>ATTACHMENT_MCP_ITEMS,item=>item.id,($$anchor6,item)=>{var fragment_20=comment$2(),node_31=first_child(fragment_20);{var consequent_5=$$anchor7=>{ +var fragment_21=comment$2(),node_32=first_child(fragment_21);component(node_32,()=>Dropdown_menu_item,($$anchor8,DropdownMenu_Item_4)=>{DropdownMenu_Item_4($$anchor8,{class:"flex cursor-pointer items-center gap-2",onclick:()=>attachmentMenu.callbacks[get$3(item).action](),children:($$anchor9,$$slotProps3)=>{var fragment_22=root_26$2(),node_33=first_child(fragment_22);component(node_33,()=>get$3(item).icon,($$anchor10,item_icon_3)=>{item_icon_3($$anchor10,{class:"h-4 w-4"})});var span_4=sibling(node_33, +2),text_6=child(span_4,!0);reset(span_4),template_effect(()=>set_text(text_6,get$3(item).label)),append($$anchor9,fragment_22)},$$slots:{default:!0}})}),append($$anchor7,fragment_21)},d_12=user_derived(()=>attachmentMenu.isItemVisible(get$3(item).visibleWhen));if_block(node_31,$$render=>{get$3(d_12)&&$$render(consequent_5)})}append($$anchor6,fragment_20)}),append($$anchor5,fragment_2)},$$slots:{default:!0}})}),append($$anchor3,fragment)},$$slots:{default:!0}})}),reset(div),template_effect(()=>set_class( +div,1,`flex items-center gap-1 ${className()??""}`)),append($$anchor,div),pop()}function Sheet_overlay($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref","class"]);var fragment=comment$2(),node2=first_child(fragment);{let $0=user_derived(()=>cn$1("fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0",$$props.class)); +component(node2,()=>Dialog_overlay$1,($$anchor2,SheetPrimitive_Overlay)=>{SheetPrimitive_Overlay($$anchor2,spread_props({"data-slot":"sheet-overlay",get class(){return get$3($0)}},()=>restProps,{get ref(){return ref2()},set ref($$value){ref2($$value)}}))})}append($$anchor,fragment),pop()}const sheetVariants=tv({base:`border-border/30 dark:border-border/20 data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-sm transition ease-in-out data-[state=close\ +d]:duration-300 data-[state=open]:duration-500 ${PANEL_CLASSES}`,variants:{side:{top:"data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b",bottom:"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t",left:"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm",right:"data-[state=closed]:slide-out-to-right data-[\ +state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm"}},defaultVariants:{side:"right"}});var root_3$P=from_html(' Close',1),root_2$11=from_html(" ",1),root_1$K=from_html(" ",1);function Sheet_content($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),side=prop($$props,"side",3,"right"),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref","class","side","portalProps","children"]);var fragment=comment$2(), +node2=first_child(fragment);component(node2,()=>Portal$2,($$anchor2,SheetPrimitive_Portal)=>{SheetPrimitive_Portal($$anchor2,spread_props(()=>$$props.portalProps,{children:($$anchor3,$$slotProps)=>{var fragment_1=root_1$K(),node_1=first_child(fragment_1);Sheet_overlay(node_1,{});var node_2=sibling(node_1,2);{let $0=user_derived(()=>cn$1(sheetVariants({side:side()}),$$props.class));component(node_2,()=>Dialog_content$1,($$anchor4,SheetPrimitive_Content)=>{SheetPrimitive_Content($$anchor4,spread_props( +{"data-slot":"sheet-content",get class(){return get$3($0)}},()=>restProps,{get ref(){return ref2()},set ref($$value){ref2($$value)},children:($$anchor5,$$slotProps2)=>{var fragment_2=root_2$11(),node_3=first_child(fragment_2);snippet(node_3,()=>$$props.children??noop$3);var node_4=sibling(node_3,2);component(node_4,()=>Dialog_close,($$anchor6,SheetPrimitive_Close)=>{SheetPrimitive_Close($$anchor6,{class:"absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover\ +:opacity-100 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:outline-hidden disabled:pointer-events-none",children:($$anchor7,$$slotProps3)=>{var fragment_3=root_3$P(),node_5=first_child(fragment_3);X(node_5,{class:"size-4"}),next$1(2),append($$anchor7,fragment_3)},$$slots:{default:!0}})}),append($$anchor5,fragment_2)},$$slots:{default:!0}}))})}append($$anchor3,fragment_1)},$$slots:{default:!0}}))}),append($$anchor,fragment),pop()}var root$1p=from_html("");function Sheet_header($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref","class","children"]);var div=root$1p();attribute_effect(div,$0=>({"data-slot":"sheet-header",class:$0,...restProps}),[()=>cn$1("flex flex-col gap-1.5 p-4",$$props.class)]);var node2=child(div);snippet(node2,()=>$$props.children??noop$3),reset(div),bind_this(div,$$value=>ref2($$value),()=>ref2()),append($$anchor,div),pop()} +function Sheet_title($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref","class"]);var fragment=comment$2(),node2=first_child(fragment);{let $0=user_derived(()=>cn$1("font-semibold text-foreground",$$props.class));component(node2,()=>Dialog_title$1,($$anchor2,SheetPrimitive_Title)=>{SheetPrimitive_Title($$anchor2,spread_props({"data-slot":"sheet-title",get class(){return get$3($0)}},()=>restProps,{get ref(){ +return ref2()},set ref($$value){ref2($$value)}}))})}append($$anchor,fragment),pop()}function Sheet_description($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref","class"]);var fragment=comment$2(),node2=first_child(fragment);{let $0=user_derived(()=>cn$1("text-sm text-muted-foreground",$$props.class));component(node2,()=>Dialog_description$1,($$anchor2,SheetPrimitive_Description)=>{SheetPrimitive_Description( +$$anchor2,spread_props({"data-slot":"sheet-description",get class(){return get$3($0)}},()=>restProps,{get ref(){return ref2()},set ref($$value){ref2($$value)}}))})}append($$anchor,fragment),pop()}const Root$3=Dialog;var root_3$O=from_html(" ",1),root_7$r=from_html(''),root_10$e=from_html(''),root_11$d=from_html("

"),root_9$k=from_html(" ",1),root_15$a=from_html(' '),root_16$4=from_html("

PDFs will be converted to text. Image-based PDFs may not work properly.

"),root_14$6=from_html(" ",1),root_20$3=from_html(''),root_21$5=from_html("

"),root_19$9=from_html(" ",1),root_23$3=from_html(''),root_2$10=from_html(' ',1),root_1$J=from_html(" ",1),root$1o=from_html("
");function ChatFormActionAddSheet($$anchor,$$props){push$1($$props,!0);let className=prop($$props,"class",3,""),disabled=prop($$props,"disabled",3,!1),hasAudioModality=prop($$props, +"hasAudioModality",3,!1),hasVisionModality=prop($$props,"hasVisionModality",3,!1),hasMcpPromptsSupport=prop($$props,"hasMcpPromptsSupport",3,!1),hasMcpResourcesSupport=prop($$props,"hasMcpResourcesSupport",3,!1),sheetOpen=state$1(!1);const attachmentMenu=useAttachmentMenu(()=>({hasVisionModality:hasVisionModality(),hasAudioModality:hasAudioModality(),hasMcpPromptsSupport:hasMcpPromptsSupport(),hasMcpResourcesSupport:hasMcpResourcesSupport()}),()=>({onFileUpload:$$props.onFileUpload,onSystemPromptClick:$$props. +onSystemPromptClick,onMcpPromptClick:$$props.onMcpPromptClick,onMcpResourcesClick:$$props.onMcpResourcesClick}),()=>{set$1(sheetOpen,!1)}),sheetItemClass="flex w-full items-center gap-3 rounded-md px-3 py-2.5 text-left text-sm transition-colors hover:bg-accent active:bg-accent disabled:cursor-not-allowed disabled:opacity-50";var div=root$1o(),node2=child(div);component(node2,()=>Root$3,($$anchor2,Sheet_Root)=>{Sheet_Root($$anchor2,{get open(){return get$3(sheetOpen)},set open($$value){set$1(sheetOpen, +$$value,!0)},children:($$anchor3,$$slotProps)=>{var fragment=root_1$J(),node_1=first_child(fragment);snippet(node_1,()=>$$props.trigger,()=>({disabled:disabled(),onclick:()=>set$1(sheetOpen,!0)}));var node_2=sibling(node_1,2);component(node_2,()=>Sheet_content,($$anchor4,Sheet_Content)=>{Sheet_Content($$anchor4,{side:"bottom",class:"max-h-[85vh] gap-0 overflow-y-auto",children:($$anchor5,$$slotProps2)=>{var fragment_1=root_2$10(),node_3=first_child(fragment_1);component(node_3,()=>Sheet_header,($$anchor6,Sheet_Header)=>{ +Sheet_Header($$anchor6,{children:($$anchor7,$$slotProps3)=>{var fragment_2=root_3$O(),node_4=first_child(fragment_2);component(node_4,()=>Sheet_title,($$anchor8,Sheet_Title)=>{Sheet_Title($$anchor8,{children:($$anchor9,$$slotProps4)=>{next$1();var text2=text$8("Add to chat");append($$anchor9,text2)},$$slots:{default:!0}})});var node_5=sibling(node_4,2);component(node_5,()=>Sheet_description,($$anchor8,Sheet_Description)=>{Sheet_Description($$anchor8,{class:"sr-only",children:($$anchor9,$$slotProps4)=>{ +next$1();var text_1=text$8("Add files, system prompt or configure MCP servers");append($$anchor9,text_1)},$$slots:{default:!0}})}),append($$anchor7,fragment_2)},$$slots:{default:!0}})});var div_1=sibling(node_3,2),node_6=child(div_1);each(node_6,17,()=>ATTACHMENT_FILE_ITEMS,item=>item.id,($$anchor6,item)=>{const enabled=user_derived(()=>attachmentMenu.isItemEnabled(get$3(item).enabledWhen));var fragment_3=comment$2(),node_7=first_child(fragment_3);{var consequent=$$anchor7=>{var button=root_7$r(); +set_class(button,1,clsx(sheetItemClass));var node_8=child(button);component(node_8,()=>get$3(item).icon,($$anchor8,item_icon)=>{item_icon($$anchor8,{class:"h-4 w-4 shrink-0"})});var span=sibling(node_8,2),text_2=child(span,!0);reset(span),reset(button),template_effect(()=>set_text(text_2,get$3(item).label)),delegated("click",button,()=>attachmentMenu.callbacks[get$3(item).action]()),append($$anchor7,button)},consequent_1=$$anchor7=>{var fragment_4=comment$2(),node_9=first_child(fragment_4);component( +node_9,()=>Root$5,($$anchor8,Tooltip_Root)=>{Tooltip_Root($$anchor8,{get delayDuration(){return TOOLTIP_DELAY_DURATION},children:($$anchor9,$$slotProps3)=>{var fragment_5=root_9$k(),node_10=first_child(fragment_5);component(node_10,()=>Tooltip_trigger,($$anchor10,Tooltip_Trigger)=>{Tooltip_Trigger($$anchor10,{children:($$anchor11,$$slotProps4)=>{var button_1=root_10$e();set_class(button_1,1,clsx(sheetItemClass));var node_11=child(button_1);component(node_11,()=>get$3(item).icon,($$anchor12,item_icon_1)=>{ +item_icon_1($$anchor12,{class:"h-4 w-4 shrink-0"})});var span_1=sibling(node_11,2),text_3=child(span_1,!0);reset(span_1),reset(button_1),template_effect(()=>set_text(text_3,get$3(item).label)),append($$anchor11,button_1)},$$slots:{default:!0}})});var node_12=sibling(node_10,2);component(node_12,()=>Tooltip_content,($$anchor10,Tooltip_Content)=>{Tooltip_Content($$anchor10,{side:"right",children:($$anchor11,$$slotProps4)=>{var p2=root_11$d(),text_4=child(p2,!0);reset(p2),template_effect(()=>set_text( +text_4,get$3(item).disabledTooltip)),append($$anchor11,p2)},$$slots:{default:!0}})}),append($$anchor9,fragment_5)},$$slots:{default:!0}})}),append($$anchor7,fragment_4)};if_block(node_7,$$render=>{get$3(enabled)?$$render(consequent):get$3(item).disabledTooltip&&$$render(consequent_1,1)})}append($$anchor6,fragment_3)});var node_13=sibling(node_6,2);{var consequent_3=$$anchor6=>{const pdfItem=user_derived(()=>ATTACHMENT_FILE_ITEMS.find(i=>i.id===AttachmentMenuItemId.PDF));var fragment_6=comment$2(), +node_14=first_child(fragment_6);{var consequent_2=$$anchor7=>{var fragment_7=comment$2(),node_15=first_child(fragment_7);component(node_15,()=>Root$5,($$anchor8,Tooltip_Root_1)=>{Tooltip_Root_1($$anchor8,{get delayDuration(){return TOOLTIP_DELAY_DURATION},children:($$anchor9,$$slotProps3)=>{var fragment_8=root_14$6(),node_16=first_child(fragment_8);component(node_16,()=>Tooltip_trigger,($$anchor10,Tooltip_Trigger_1)=>{Tooltip_Trigger_1($$anchor10,{children:($$anchor11,$$slotProps4)=>{var button_2=root_15$a(); +set_class(button_2,1,clsx(sheetItemClass));var node_17=child(button_2);component(node_17,()=>get$3(pdfItem).icon,($$anchor12,pdfItem_icon)=>{pdfItem_icon($$anchor12,{class:"h-4 w-4 shrink-0"})});var span_2=sibling(node_17,2),text_5=child(span_2,!0);reset(span_2),reset(button_2),template_effect(()=>set_text(text_5,get$3(pdfItem).label)),delegated("click",button_2,()=>attachmentMenu.callbacks[get$3(pdfItem).action]()),append($$anchor11,button_2)},$$slots:{default:!0}})});var node_18=sibling(node_16, +2);component(node_18,()=>Tooltip_content,($$anchor10,Tooltip_Content_1)=>{Tooltip_Content_1($$anchor10,{side:"right",children:($$anchor11,$$slotProps4)=>{var p_1=root_16$4();append($$anchor11,p_1)},$$slots:{default:!0}})}),append($$anchor9,fragment_8)},$$slots:{default:!0}})}),append($$anchor7,fragment_7)};if_block(node_14,$$render=>{get$3(pdfItem)&&$$render(consequent_2)})}append($$anchor6,fragment_6)},d2=user_derived(()=>!attachmentMenu.isItemEnabled("hasVisionModality"));if_block(node_13,$$render=>{ +get$3(d2)&&$$render(consequent_3)})}var node_19=sibling(node_13,2);each(node_19,17,()=>ATTACHMENT_EXTRA_ITEMS,item=>item.id,($$anchor6,item)=>{var fragment_9=comment$2(),node_20=first_child(fragment_9);{var consequent_4=$$anchor7=>{var fragment_10=comment$2(),node_21=first_child(fragment_10);component(node_21,()=>Root$5,($$anchor8,Tooltip_Root_2)=>{Tooltip_Root_2($$anchor8,{get delayDuration(){return TOOLTIP_DELAY_DURATION},children:($$anchor9,$$slotProps3)=>{var fragment_11=root_19$9(),node_22=first_child( +fragment_11);component(node_22,()=>Tooltip_trigger,($$anchor10,Tooltip_Trigger_2)=>{Tooltip_Trigger_2($$anchor10,{children:($$anchor11,$$slotProps4)=>{var button_3=root_20$3();set_class(button_3,1,clsx(sheetItemClass));var node_23=child(button_3);component(node_23,()=>get$3(item).icon,($$anchor12,item_icon_2)=>{item_icon_2($$anchor12,{class:"h-4 w-4 shrink-0"})});var span_3=sibling(node_23,2),text_6=child(span_3,!0);reset(span_3),reset(button_3),template_effect(()=>set_text(text_6,get$3(item).label)), +delegated("click",button_3,()=>attachmentMenu.callbacks[get$3(item).action]()),append($$anchor11,button_3)},$$slots:{default:!0}})});var node_24=sibling(node_22,2);component(node_24,()=>Tooltip_content,($$anchor10,Tooltip_Content_2)=>{Tooltip_Content_2($$anchor10,{side:"right",children:($$anchor11,$$slotProps4)=>{var p_2=root_21$5(),text_7=child(p_2,!0);reset(p_2),template_effect($0=>set_text(text_7,$0),[()=>attachmentMenu.getSystemMessageTooltip()]),append($$anchor11,p_2)},$$slots:{default:!0}})}), +append($$anchor9,fragment_11)},$$slots:{default:!0}})}),append($$anchor7,fragment_10)};if_block(node_20,$$render=>{get$3(item).id===AttachmentMenuItemId.SYSTEM_MESSAGE&&$$render(consequent_4)})}append($$anchor6,fragment_9)});var a=sibling(node_19,4),node_25=child(a);McpLogo(node_25,{class:"inline h-4 w-4"}),next$1(2),reset(a);var a_1=sibling(a,2),node_26=child(a_1);Pencil_ruler(node_26,{class:"inline h-4 w-4"}),next$1(2),reset(a_1);var node_27=sibling(a_1,2);each(node_27,17,()=>ATTACHMENT_MCP_ITEMS, +item=>item.id,($$anchor6,item)=>{var fragment_12=comment$2(),node_28=first_child(fragment_12);{var consequent_5=$$anchor7=>{var button_4=root_23$3();set_class(button_4,1,clsx(sheetItemClass));var node_29=child(button_4);component(node_29,()=>get$3(item).icon,($$anchor8,item_icon_3)=>{item_icon_3($$anchor8,{class:"h-4 w-4 shrink-0"})});var span_4=sibling(node_29,2),text_8=child(span_4,!0);reset(span_4),reset(button_4),template_effect(()=>set_text(text_8,get$3(item).label)),delegated("click",button_4, +()=>attachmentMenu.callbacks[get$3(item).action]()),append($$anchor7,button_4)},d_12=user_derived(()=>attachmentMenu.isItemVisible(get$3(item).visibleWhen));if_block(node_28,$$render=>{get$3(d_12)&&$$render(consequent_5)})}append($$anchor6,fragment_12)}),reset(div_1),append($$anchor5,fragment_1)},$$slots:{default:!0}})}),append($$anchor3,fragment)},$$slots:{default:!0}})}),reset(div),template_effect(()=>set_class(div,1,`flex items-center gap-1 ${className()??""}`)),append($$anchor,div),pop()}delegate( +["click"]);var root_3$N=from_html(' ',1),root_4$y=from_html("

"),root_1$I=from_html(" ",1);function ChatFormActionAddButton($$anchor,$$props){let disabled=prop($$props,"disabled",3,!1);var fragment=comment$2(),node2=first_child(fragment);component(node2,()=>Root$5,($$anchor2,Tooltip_Root)=>{Tooltip_Root($$anchor2,{children:($$anchor3,$$slotProps)=>{var fragment_1=root_1$I(),node_1=first_child(fragment_1);component(node_1,()=>Tooltip_trigger,($$anchor4,Tooltip_Trigger)=>{ +Tooltip_Trigger($$anchor4,{class:"w-full",children:($$anchor5,$$slotProps2)=>{Button($$anchor5,{class:"file-upload-button h-8 w-8 rounded-full p-0",get disabled(){return disabled()},get onclick(){return $$props.onclick},variant:"secondary",type:"button",children:($$anchor6,$$slotProps3)=>{var fragment_3=root_3$N(),span=first_child(fragment_3),text2=child(span,!0);reset(span);var node_2=sibling(span,2);Plus(node_2,{class:"h-4 w-4"}),template_effect(()=>set_text(text2,ATTACHMENT_TOOLTIP_TEXT)),append( +$$anchor6,fragment_3)},$$slots:{default:!0}})},$$slots:{default:!0}})});var node_3=sibling(node_1,2);component(node_3,()=>Tooltip_content,($$anchor4,Tooltip_Content)=>{Tooltip_Content($$anchor4,{children:($$anchor5,$$slotProps2)=>{var p2=root_4$y(),text_1=child(p2,!0);reset(p2),template_effect(()=>set_text(text_1,ATTACHMENT_TOOLTIP_TEXT)),append($$anchor5,p2)},$$slots:{default:!0}})}),append($$anchor3,fragment_1)},$$slots:{default:!0}})}),append($$anchor,fragment)}function ChatFormActionsAdd($$anchor,$$props){ +push$1($$props,!0);let disabled=prop($$props,"disabled",3,!1),hasAudioModality=prop($$props,"hasAudioModality",3,!1),hasMcpPromptsSupport=prop($$props,"hasMcpPromptsSupport",3,!1),hasMcpResourcesSupport=prop($$props,"hasMcpResourcesSupport",3,!1),hasVisionModality=prop($$props,"hasVisionModality",3,!1);const isMobile=new IsMobile;var fragment=comment$2(),node2=first_child(fragment);{var consequent=$$anchor2=>{ChatFormActionAddSheet($$anchor2,{get disabled(){return disabled()},get hasAudioModality(){ +return hasAudioModality()},get hasVisionModality(){return hasVisionModality()},get hasMcpPromptsSupport(){return hasMcpPromptsSupport()},get hasMcpResourcesSupport(){return hasMcpResourcesSupport()},get onFileUpload(){return $$props.onFileUpload},get onMcpPromptClick(){return $$props.onMcpPromptClick},get onMcpResourcesClick(){return $$props.onMcpResourcesClick},trigger:($$anchor3,$$arg0)=>{let disabled2=()=>$$arg0?.().disabled,onclick=()=>$$arg0?.().onclick;ChatFormActionAddButton($$anchor3,{get disabled(){ +return disabled2()},get onclick(){return onclick()}})},$$slots:{trigger:!0}})},alternate=$$anchor2=>{ChatFormActionAddDropdown($$anchor2,{get disabled(){return disabled()},get hasAudioModality(){return hasAudioModality()},get hasVisionModality(){return hasVisionModality()},get hasMcpPromptsSupport(){return hasMcpPromptsSupport()},get hasMcpResourcesSupport(){return hasMcpResourcesSupport()},get onFileUpload(){return $$props.onFileUpload},get onMcpPromptClick(){return $$props.onMcpPromptClick},get onMcpResourcesClick(){ +return $$props.onMcpResourcesClick},get onMcpSettingsClick(){return $$props.onMcpSettingsClick},get onSystemPromptClick(){return $$props.onSystemPromptClick},trigger:$$anchor3=>{ChatFormActionAddButton($$anchor3,{get disabled(){return disabled()}})},$$slots:{trigger:!0}})};if_block(node2,$$render=>{isMobile.current?$$render(consequent):$$render(alternate,-1)})}append($$anchor,fragment),pop()}var root_3$M=from_html(' ',1),root_7$q=from_html("

Current model does \ +not support audio

"),root_1$H=from_html(" ",1),root$1n=from_html("
");function ChatFormActionRecord($$anchor,$$props){let className=prop($$props,"class",3,""),disabled=prop($$props,"disabled",3,!1),hasAudioModality=prop($$props,"hasAudioModality",3,!1),isLoading2=prop($$props,"isLoading",3,!1),isRecording=prop($$props,"isRecording",3,!1);var div=root$1n(),node2=child(div);component(node2,()=>Root$5,($$anchor2,Tooltip_Root)=>{Tooltip_Root($$anchor2,{children:($$anchor3,$$slotProps)=>{ +var fragment=root_1$H(),node_1=first_child(fragment);component(node_1,()=>Tooltip_trigger,($$anchor4,Tooltip_Trigger)=>{Tooltip_Trigger($$anchor4,{children:($$anchor5,$$slotProps2)=>{{let $0=user_derived(()=>isRecording()?"animate-pulse bg-red-500 text-white hover:bg-red-600":""),$1=user_derived(()=>disabled()||isLoading2()||!hasAudioModality());Button($$anchor5,{get class(){return`h-8 w-8 rounded-full p-0 ${get$3($0)??""}`},get disabled(){return get$3($1)},get onclick(){return $$props.onMicClick}, +type:"button",children:($$anchor6,$$slotProps3)=>{var fragment_2=root_3$M(),span=first_child(fragment_2),text2=child(span,!0);reset(span);var node_2=sibling(span,2);{var consequent=$$anchor7=>{Square($$anchor7,{class:"h-4 w-4 animate-pulse fill-white"})},alternate=$$anchor7=>{Mic($$anchor7,{class:"h-4 w-4"})};if_block(node_2,$$render=>{isRecording()?$$render(consequent):$$render(alternate,-1)})}template_effect(()=>set_text(text2,isRecording()?"Stop recording":"Start recording")),append($$anchor6, +fragment_2)},$$slots:{default:!0}})}},$$slots:{default:!0}})});var node_3=sibling(node_1,2);{var consequent_1=$$anchor4=>{var fragment_5=comment$2(),node_4=first_child(fragment_5);component(node_4,()=>Tooltip_content,($$anchor5,Tooltip_Content)=>{Tooltip_Content($$anchor5,{children:($$anchor6,$$slotProps2)=>{var p2=root_7$q();append($$anchor6,p2)},$$slots:{default:!0}})}),append($$anchor4,fragment_5)};if_block(node_3,$$render=>{hasAudioModality()||$$render(consequent_1)})}append($$anchor3,fragment)}, +$$slots:{default:!0}})}),reset(div),template_effect(()=>set_class(div,1,`flex items-center gap-1 ${className()??""}`)),append($$anchor,div)}var root_1$G=from_html('
'),root_4$x=from_html('Stop ',1),root$1m=from_html('
');function ChatFormActions($$anchor,$$props){push$1($$props,!0);let canSend=prop($$props,"canSend",3,!1),canSubmit=prop($$props,"canSubmit", +3,!1),className=prop($$props,"class",3,""),disabled=prop($$props,"disabled",3,!1),isLoading2=prop($$props,"isLoading",3,!1),isRecording=prop($$props,"isRecording",3,!1),showAddButton=prop($$props,"showAddButton",3,!0),showModelSelector=prop($$props,"showModelSelector",3,!0),uploadedFiles=prop($$props,"uploadedFiles",19,()=>[]),currentConfig=user_derived(config$1),hasMcpPromptsSupport=user_derived(()=>{const perChatOverrides=conversationsStore.getAllMcpServerOverrides();return mcpStore.hasPromptsCapability( +perChatOverrides)}),hasMcpResourcesSupport=user_derived(()=>{const perChatOverrides=conversationsStore.getAllMcpServerOverrides();return mcpStore.hasResourcesCapability(perChatOverrides)}),hasAudioModality=state$1(!1),hasVisionModality=state$1(!1),hasModelSelected=state$1(!1),isSelectedModelInCache=state$1(!0),submitTooltip=state$1(""),hasAudioAttachments=user_derived(()=>uploadedFiles().some(file=>getFileTypeCategory(file.type)===FileTypeCategory.AUDIO)),shouldShowRecordButton=user_derived(()=>get$3( +hasAudioModality)&&!canSubmit()&&!get$3(hasAudioAttachments)&&get$3(currentConfig).autoMicOnEmpty),selectorModelRef=state$1(void 0);function openModelSelector(){get$3(selectorModelRef)?.open()}var $$exports={openModelSelector},div=root$1m(),node2=child(div);{var consequent=$$anchor2=>{var div_1=root_1$G(),node_1=child(div_1);ChatFormActionsAdd(node_1,{get disabled(){return disabled()},get hasAudioModality(){return get$3(hasAudioModality)},get hasVisionModality(){return get$3(hasVisionModality)}, +get hasMcpPromptsSupport(){return get$3(hasMcpPromptsSupport)},get hasMcpResourcesSupport(){return get$3(hasMcpResourcesSupport)},get onFileUpload(){return $$props.onFileUpload},get onSystemPromptClick(){return $$props.onSystemPromptClick},get onMcpPromptClick(){return $$props.onMcpPromptClick},get onMcpResourcesClick(){return $$props.onMcpResourcesClick},onMcpSettingsClick:()=>goto("#/settings/mcp")}),reset(div_1),append($$anchor2,div_1)};if_block(node2,$$render=>{showAddButton()&&$$render(consequent)})} +var node_2=sibling(node2,2);{var consequent_1=$$anchor2=>{bind_this(ChatFormActionModels($$anchor2,{get disabled(){return disabled()},forceForegroundText:!0,useGlobalSelection:!0,get hasAudioModality(){return get$3(hasAudioModality)},set hasAudioModality($$value){set$1(hasAudioModality,$$value,!0)},get hasVisionModality(){return get$3(hasVisionModality)},set hasVisionModality($$value){set$1(hasVisionModality,$$value,!0)},get hasModelSelected(){return get$3(hasModelSelected)},set hasModelSelected($$value){ +set$1(hasModelSelected,$$value,!0)},get isSelectedModelInCache(){return get$3(isSelectedModelInCache)},set isSelectedModelInCache($$value){set$1(isSelectedModelInCache,$$value,!0)},get submitTooltip(){return get$3(submitTooltip)},set submitTooltip($$value){set$1(submitTooltip,$$value,!0)}}),$$value=>set$1(selectorModelRef,$$value,!0),()=>get$3(selectorModelRef))};if_block(node_2,$$render=>{showModelSelector()&&$$render(consequent_1)})}var node_3=sibling(node_2,2);{var consequent_2=$$anchor2=>{Button( +$$anchor2,{type:"button",variant:"secondary",get onclick(){return $$props.onStop},class:"group h-8 w-8 rounded-full p-0 hover:bg-destructive/10!",children:($$anchor3,$$slotProps)=>{var fragment_2=root_4$x(),node_4=sibling(first_child(fragment_2),2);Square(node_4,{class:"h-8 w-8 fill-muted-foreground stroke-muted-foreground group-hover:fill-destructive group-hover:stroke-destructive hover:fill-destructive hover:stroke-destructive"}),append($$anchor3,fragment_2)},$$slots:{default:!0}})},consequent_3=$$anchor2=>{ +ChatFormActionRecord($$anchor2,{get disabled(){return disabled()},get hasAudioModality(){return get$3(hasAudioModality)},get isLoading(){return isLoading2()},get isRecording(){return isRecording()},get onMicClick(){return $$props.onMicClick}})},alternate=$$anchor2=>{{let $0=user_derived(()=>canSend()&&(showModelSelector()?get$3(hasModelSelected)&&get$3(isSelectedModelInCache):!0)),$1=user_derived(()=>showModelSelector()&&get$3(hasModelSelected)&&!get$3(isSelectedModelInCache));ChatFormActionSubmit( +$$anchor2,{get canSend(){return get$3($0)},get disabled(){return disabled()},get tooltipLabel(){return get$3(submitTooltip)},get showErrorState(){return get$3($1)}})}};if_block(node_3,$$render=>{isLoading2()&&!canSubmit()?$$render(consequent_2):get$3(shouldShowRecordButton)?$$render(consequent_3,1):$$render(alternate,-1)})}return reset(div),template_effect(()=>set_class(div,1,`flex w-full items-center gap-3 ${className()??""} ${showAddButton()?"":"justify-end"}`)),append($$anchor,div),pop($$exports)} +var root_2$$=from_html('Send ',1),root_6$t=from_html("

"),root_4$w=from_html(" ",1);function ChatFormActionSubmit($$anchor,$$props){const submitButton=($$anchor2,$$arg0)=>{let props=derived_safe_equal(()=>fallback($$arg0?.(),()=>({}),!0));{let $0=user_derived(()=>["h-8 w-8 rounded-full p-0",showErrorState()&&"bg-red-400/10 text-red-400 hover:bg-red-400/20 hover:text-red-400 disabled:opacity-100"]);Button($$anchor2,spread_props({type:"submit",get disabled(){ +return get$3(isDisabled)},get class(){return get$3($0)}},()=>get$3(props),{children:($$anchor3,$$slotProps)=>{var fragment_1=root_2$$(),node2=sibling(first_child(fragment_1),2);Arrow_up(node2,{class:"h-12 w-12"}),append($$anchor3,fragment_1)},$$slots:{default:!0}}))}};let canSend=prop($$props,"canSend",3,!1),disabled=prop($$props,"disabled",3,!1),showErrorState=prop($$props,"showErrorState",3,!1),isDisabled=user_derived(()=>!canSend()||disabled());var fragment_2=comment$2(),node_1=first_child(fragment_2); +{var consequent=$$anchor2=>{var fragment_3=comment$2(),node_2=first_child(fragment_3);component(node_2,()=>Root$5,($$anchor3,Tooltip_Root)=>{Tooltip_Root($$anchor3,{children:($$anchor4,$$slotProps)=>{var fragment_4=root_4$w(),node_3=first_child(fragment_4);component(node_3,()=>Tooltip_trigger,($$anchor5,Tooltip_Trigger)=>{Tooltip_Trigger($$anchor5,{children:($$anchor6,$$slotProps2)=>{submitButton($$anchor6)},$$slots:{default:!0}})});var node_4=sibling(node_3,2);component(node_4,()=>Tooltip_content, +($$anchor5,Tooltip_Content)=>{Tooltip_Content($$anchor5,{children:($$anchor6,$$slotProps2)=>{var p2=root_6$t(),text2=child(p2,!0);reset(p2),template_effect(()=>set_text(text2,$$props.tooltipLabel)),append($$anchor6,p2)},$$slots:{default:!0}})}),append($$anchor4,fragment_4)},$$slots:{default:!0}})}),append($$anchor2,fragment_3)},alternate=$$anchor2=>{submitButton($$anchor2)};if_block(node_1,$$render=>{$$props.tooltipLabel?$$render(consequent):$$render(alternate,-1)})}append($$anchor,fragment_2)}function ChatFormActionModels($$anchor,$$props){ +push$1($$props,!0);let disabled=prop($$props,"disabled",3,!1),forceForegroundText=prop($$props,"forceForegroundText",3,!1),hasAudioModality=prop($$props,"hasAudioModality",15,!1),hasVisionModality=prop($$props,"hasVisionModality",15,!1),hasModelSelected=prop($$props,"hasModelSelected",15,!1),isSelectedModelInCache=prop($$props,"isSelectedModelInCache",15,!0),submitTooltip=prop($$props,"submitTooltip",15,""),useGlobalSelection=prop($$props,"useGlobalSelection",3,!1),isRouter=user_derived(isRouterMode), +isOffline=user_derived(()=>!!serverError()),conversationModel=user_derived(()=>chatStore.getConversationModel(activeMessages())),lastSyncedConversationModel=null;user_effect(()=>{if(get$3(conversationModel)&&get$3(conversationModel)!==lastSyncedConversationModel)lastSyncedConversationModel=get$3(conversationModel),modelsStore.selectModelByName(get$3(conversationModel));else if(get$3(isRouter)&&!modelsStore.selectedModelId&&modelsStore.loadedModelIds.length>0){lastSyncedConversationModel=null;const first=modelOptions(). +find(m=>modelsStore.loadedModelIds.includes(m.model));first&&modelsStore.selectModelById(first.id)}});let activeModelId=user_derived(()=>{const options=modelOptions();if(!get$3(isRouter))return options.length>0?options[0].model:null;const selectedId=selectedModelId();if(selectedId){const model=options.find(m=>m.id===selectedId);if(model)return model.model}if(get$3(conversationModel)){const model=options.find(m=>m.model===get$3(conversationModel));if(model)return model.model}return null}),modelPropsVersion=state$1( +0);user_effect(()=>{get$3(activeModelId)&&(modelsStore.getModelProps(get$3(activeModelId))||modelsStore.fetchModelProps(get$3(activeModelId)).then(()=>{update$1(modelPropsVersion)}))}),user_effect(()=>{hasAudioModality(get$3(activeModelId)?modelsStore.modelSupportsAudio(get$3(activeModelId)):!1)}),user_effect(()=>{get$3(modelPropsVersion),hasVisionModality(get$3(activeModelId)?modelsStore.modelSupportsVision(get$3(activeModelId)):!1)}),user_effect(()=>{hasModelSelected(!get$3(isRouter)||!!get$3( +conversationModel)||!!selectedModelId())}),user_effect(()=>{if(!get$3(isRouter))isSelectedModelInCache(!0);else if(get$3(conversationModel))isSelectedModelInCache(modelOptions().some(option2=>option2.model===get$3(conversationModel)));else{const currentModelId=selectedModelId();isSelectedModelInCache(currentModelId?modelOptions().some(option2=>option2.id===currentModelId):!1)}}),user_effect(()=>{hasModelSelected()?isSelectedModelInCache()?submitTooltip(""):submitTooltip("Selected model is not av\ +ailable, please select another"):submitTooltip("Please select a model first")});let selectorModelRef=state$1(void 0),isMobile=new IsMobile;function open2(){get$3(selectorModelRef)?.open()}var $$exports={open:open2},fragment=comment$2(),node2=first_child(fragment);{var consequent=$$anchor2=>{{let $0=user_derived(()=>disabled()||get$3(isOffline));bind_this(ModelsSelectorSheet($$anchor2,{get disabled(){return get$3($0)},get currentModel(){return $$props.currentModel},get forceForegroundText(){return forceForegroundText()}, +get useGlobalSelection(){return useGlobalSelection()}}),$$value=>set$1(selectorModelRef,$$value,!0),()=>get$3(selectorModelRef))}},alternate=$$anchor2=>{{let $0=user_derived(()=>disabled()||get$3(isOffline));bind_this(ModelsSelectorDropdown($$anchor2,{get disabled(){return get$3($0)},get currentModel(){return $$props.currentModel},get forceForegroundText(){return forceForegroundText()},get useGlobalSelection(){return useGlobalSelection()}}),$$value=>set$1(selectorModelRef,$$value,!0),()=>get$3(selectorModelRef))}}; +if_block(node2,$$render=>{isMobile.current?$$render(consequent):$$render(alternate,-1)})}return append($$anchor,fragment),pop($$exports)}function Collapsible($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),open2=prop($$props,"open",15,!1),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref","open"]);var fragment=comment$2(),node2=first_child(fragment);component(node2,()=>Collapsible$1,($$anchor2,CollapsiblePrimitive_Root)=>{CollapsiblePrimitive_Root($$anchor2, +spread_props({"data-slot":"collapsible"},()=>restProps,{get ref(){return ref2()},set ref($$value){ref2($$value)},get open(){return open2()},set open($$value){open2($$value)}}))}),append($$anchor,fragment),pop()}function Collapsible_trigger($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref"]);var fragment=comment$2(),node2=first_child(fragment);component(node2,()=>Collapsible_trigger$1,($$anchor2,CollapsiblePrimitive_Trigger)=>{ +CollapsiblePrimitive_Trigger($$anchor2,spread_props({"data-slot":"collapsible-trigger"},()=>restProps,{get ref(){return ref2()},set ref($$value){ref2($$value)}}))}),append($$anchor,fragment),pop()}function Collapsible_content($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref"]);var fragment=comment$2(),node2=first_child(fragment);component(node2,()=>Collapsible_content$1,($$anchor2,CollapsiblePrimitive_Content)=>{ +CollapsiblePrimitive_Content($$anchor2,spread_props({"data-slot":"collapsible-content"},()=>restProps,{get ref(){return ref2()},set ref($$value){ref2($$value)}}))}),append($$anchor,fragment),pop()}function useToolsPanel(){const expandedGroups=new SvelteSet,groups=user_derived(()=>toolsStore.toolGroups),activeGroups=user_derived(()=>get$3(groups).filter(g=>g.source!==ToolSource.MCP||!g.serverId||conversationsStore.isMcpServerEnabledForChat(g.serverId))),totalToolCount=user_derived(()=>get$3(activeGroups). +reduce((n,g)=>n+g.tools.length,0)),noToolsInfoMessage=user_derived(()=>toolsStore.loading||toolsStore.toolGroups.length>0?null:toolsStore.isToolsEndpointUnreachable?"To enable Built-In Tools you need to run llama-server with --tools all or --tools flag. To see MCP Tools you need to add / enable MCP Server(s).":toolsStore.error?null:"To enable Built-In Tools you need to run llama-server with --tools all or --tools flag. To see MCP Tools you need to add / enable MCP Server(s).");function getGroupCheckedState(group){ +return{checked:toolsStore.isGroupFullyEnabled(group),indeterminate:toolsStore.isGroupPartiallyEnabled(group)}}function getEnabledToolCount(group){return group.tools.filter(tool=>toolsStore.isToolEnabled(tool.function.name)).length}function getFavicon(group){if(group.source!==ToolSource.MCP)return null;for(const server of mcpStore.getServersSorted())if(mcpStore.getServerLabel(server)===group.label)return mcpStore.getServerFavicon(server.id);return null}function isGroupDisabled(group){return group. +source===ToolSource.MCP&&!!group.serverId&&!conversationsStore.isMcpServerEnabledForChat(group.serverId)}function toggleGroupExpanded(label){expandedGroups.has(label)?expandedGroups.delete(label):expandedGroups.add(label)}function handleOpen(){toolsStore.builtinTools.length===0&&!toolsStore.loading&&toolsStore.fetchBuiltinTools(),mcpStore.runHealthChecksForServers(mcpStore.getServersSorted().filter(s2=>s2.enabled))}return{expandedGroups,get groups(){return get$3(groups)},get activeGroups(){return get$3( +activeGroups)},get totalToolCount(){return get$3(totalToolCount)},get noToolsInfoMessage(){return get$3(noToolsInfoMessage)},getGroupCheckedState,getEnabledToolCount,getFavicon,isGroupDisabled,toggleGroupExpanded,handleOpen}}var root_2$_=from_html(" Tools",1),root_5$t=from_html('
Loading tools...
'),root_6$s=from_html('
Run llama-server with --tools flag to enable Built-in Tools. MCP Tools.
'),root_7$p=from_html('
Failed to load tools
'),root_8$q=from_html('
'),root_9$j=from_html('
No tools available
'),root_16$3=from_html(''),root_13$b=from_html(' ',1),root_19$8=from_html("

"),root_17$6=from_html(" ",1),root_21$4=from_html(''),root_20$2=from_html('
'),root_12$8=from_html('
',1),root_10$d=from_html('
'),root_1$F=from_html(" ",1);function ChatFormActionAddToolsSubmenu($$anchor,$$props){push$1($$props,!0);const toolsPanel=useToolsPanel(), +hasMcpServersAvailable=user_derived(()=>mcpStore.getServersSorted().length>0);var fragment=comment$2(),node2=first_child(fragment);component(node2,()=>Sub,($$anchor2,DropdownMenu_Sub)=>{DropdownMenu_Sub($$anchor2,{onOpenChange:open2=>open2&&toolsPanel.handleOpen(),children:($$anchor3,$$slotProps)=>{var fragment_1=root_1$F(),node_1=first_child(fragment_1);component(node_1,()=>Dropdown_menu_sub_trigger,($$anchor4,DropdownMenu_SubTrigger)=>{DropdownMenu_SubTrigger($$anchor4,{class:"flex cursor-poin\ +ter items-center gap-2",children:($$anchor5,$$slotProps2)=>{var fragment_2=root_2$_(),node_2=first_child(fragment_2);Pencil_ruler(node_2,{class:"h-4 w-4"}),next$1(2),append($$anchor5,fragment_2)},$$slots:{default:!0}})});var node_3=sibling(node_1,2);component(node_3,()=>Dropdown_menu_sub_content,($$anchor4,DropdownMenu_SubContent)=>{DropdownMenu_SubContent($$anchor4,{class:"w-72 p-0",children:($$anchor5,$$slotProps2)=>{var fragment_3=comment$2(),node_4=first_child(fragment_3);{var consequent_4=$$anchor6=>{ +var fragment_4=comment$2(),node_5=first_child(fragment_4);{var consequent=$$anchor7=>{var div=root_5$t(),node_6=child(div);Loader_circle(node_6,{class:"mx-auto mb-1 h-4 w-4 animate-spin"}),next$1(),reset(div),append($$anchor7,div)},consequent_1=$$anchor7=>{var div_1=root_6$s(),span=child(div_1),node_7=child(span);Info$1(node_7,{class:"mt-0.5 h-4 w-4 shrink-0"}),next$1(2),reset(span);var span_1=sibling(span,2),node_8=child(span_1);Info$1(node_8,{class:"mt-0.5 h-4 w-4 shrink-0"});var span_2=sibling( +node_8,2),text2=child(span_2);next$1(2),reset(span_2),reset(span_1),reset(div_1),template_effect(()=>set_text(text2,`${get$3(hasMcpServersAvailable)?"Enable":"Add"} MCP Server(s) to access `)),append($$anchor7,div_1)},consequent_2=$$anchor7=>{var div_2=root_7$p();append($$anchor7,div_2)},consequent_3=$$anchor7=>{var div_3=root_8$q(),node_9=child(div_3);Info$1(node_9,{class:"mt-0.5 h-4 w-4 shrink-0"});var span_3=sibling(node_9,2),text_1=child(span_3,!0);reset(span_3),reset(div_3),template_effect( +()=>set_text(text_1,toolsPanel.noToolsInfoMessage)),append($$anchor7,div_3)},alternate=$$anchor7=>{var div_4=root_9$j();append($$anchor7,div_4)};if_block(node_5,$$render=>{toolsStore.loading?$$render(consequent):toolsStore.isToolsEndpointUnreachable?$$render(consequent_1,1):toolsStore.error?$$render(consequent_2,2):toolsPanel.noToolsInfoMessage?$$render(consequent_3,3):$$render(alternate,-1)})}append($$anchor6,fragment_4)},alternate_2=$$anchor6=>{var div_5=root_10$d();each(div_5,21,()=>toolsPanel. +activeGroups,group=>group.label,($$anchor7,group)=>{const isExpanded=user_derived(()=>toolsPanel.expandedGroups.has(get$3(group).label)),computed_const=user_derived(()=>{const{checked,indeterminate}=toolsPanel.getGroupCheckedState(get$3(group));return{checked,indeterminate}}),favicon=user_derived(()=>toolsPanel.getFavicon(get$3(group)));var fragment_5=comment$2(),node_10=first_child(fragment_5);component(node_10,()=>Collapsible,($$anchor8,Collapsible_Root)=>{Collapsible_Root($$anchor8,{get open(){ +return get$3(isExpanded)},onOpenChange:()=>toolsPanel.toggleGroupExpanded(get$3(group).label),children:($$anchor9,$$slotProps3)=>{var fragment_6=root_12$8(),div_6=first_child(fragment_6),node_11=child(div_6);component(node_11,()=>Collapsible_trigger,($$anchor10,Collapsible_Trigger)=>{Collapsible_Trigger($$anchor10,{class:"flex min-w-0 flex-1 items-center gap-2 rounded px-2 py-1.5 text-sm hover:bg-muted/50",children:($$anchor11,$$slotProps4)=>{var fragment_7=root_13$b(),node_12=first_child(fragment_7); +{var consequent_5=$$anchor12=>{Chevron_down($$anchor12,{class:"h-3.5 w-3.5 shrink-0"})},alternate_1=$$anchor12=>{Chevron_right($$anchor12,{class:"h-3.5 w-3.5 shrink-0"})};if_block(node_12,$$render=>{get$3(isExpanded)?$$render(consequent_5):$$render(alternate_1,-1)})}var span_4=sibling(node_12,2),node_13=child(span_4);{var consequent_6=$$anchor12=>{var img=root_16$3();template_effect(()=>set_attribute(img,"src",get$3(favicon))),event("error",img,e=>{e.currentTarget.style.display="none"}),replay_events( +img),append($$anchor12,img)};if_block(node_13,$$render=>{get$3(favicon)&&$$render(consequent_6)})}var span_5=sibling(node_13,2),text_2=child(span_5,!0);reset(span_5),reset(span_4);var span_6=sibling(span_4,2),text_3=child(span_6);reset(span_6),template_effect($0=>{set_text(text_2,get$3(group).label),set_text(text_3,`${$0??""}/${get$3(group).tools.length??""}`)},[()=>toolsPanel.getEnabledToolCount(get$3(group))]),append($$anchor11,fragment_7)},$$slots:{default:!0}})});var node_14=sibling(node_11, +2);component(node_14,()=>Root$5,($$anchor10,Tooltip_Root)=>{Tooltip_Root($$anchor10,{children:($$anchor11,$$slotProps4)=>{var fragment_10=root_17$6(),node_15=first_child(fragment_10);component(node_15,()=>Tooltip_trigger,($$anchor12,Tooltip_Trigger)=>{Tooltip_Trigger($$anchor12,{children:($$anchor13,$$slotProps5)=>{Checkbox($$anchor13,{get checked(){return get$3(computed_const).checked},get indeterminate(){return get$3(computed_const).indeterminate},onCheckedChange:()=>toolsStore.toggleGroup(get$3( +group)),class:"mr-2 h-4 w-4 shrink-0"})},$$slots:{default:!0}})});var node_16=sibling(node_15,2);component(node_16,()=>Tooltip_content,($$anchor12,Tooltip_Content)=>{Tooltip_Content($$anchor12,{side:"right",children:($$anchor13,$$slotProps5)=>{var p2=root_19$8(),text_4=child(p2);reset(p2),template_effect(()=>set_text(text_4,`${get$3(computed_const).checked?"Disable":"Enable"} ${get$3(group).tools.length??""} tool${get$3(group).tools.length!==1?"s":""}`)),append($$anchor13,p2)},$$slots:{default:!0}})}),append($$anchor11,fragment_10)},$$slots:{default:!0}})}),reset(div_6);var node_17=sibling(div_6,2);component(node_17,()=>Collapsible_content,($$anchor10,Collapsible_Content)=>{Collapsible_Content($$anchor10,{children:($$anchor11,$$slotProps4)=>{var div_7=root_20$2();each(div_7,21,()=>get$3(group).tools,tool=>tool.function.name,($$anchor12,tool)=>{var button=root_21$4(), node_18=child(button);{let $0=user_derived(()=>toolsStore.isToolEnabled(get$3(tool).function.name));Checkbox(node_18,{get checked(){return get$3($0)},onCheckedChange:()=>toolsStore.toggleTool(get$3(tool).function.name),class:"h-4 w-4 shrink-0"})}var span_7=sibling(node_18,2),text_5=child(span_7,!0);reset(span_7),reset(button),template_effect(()=>set_text(text_5,get$3(tool).function.name)),delegated("click",button,()=>toolsStore.toggleTool(get$3(tool).function.name)),append($$anchor12,button)}),reset( div_7),append($$anchor11,div_7)},$$slots:{default:!0}})}),append($$anchor9,fragment_6)},$$slots:{default:!0}})}),append($$anchor7,fragment_5)}),reset(div_5),append($$anchor6,div_5)};if_block(node_4,$$render=>{toolsPanel.totalToolCount===0?$$render(consequent_4):$$render(alternate_2,-1)})}append($$anchor5,fragment_3)},$$slots:{default:!0}})}),append($$anchor3,fragment_1)},$$slots:{default:!0}})}),append($$anchor,fragment),pop()}delegate(["click"]);function Switch($$anchor,$$props){push$1($$props, @@ -6718,52 +6718,52 @@ $$anchor,spread_props(()=>$$props.portalProps,{children:($$anchor2,$$slotProps)= ta-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",$$props.class));component(node2,()=>Popover_content$1,($$anchor3,PopoverPrimitive_Content)=>{PopoverPrimitive_Content($$anchor3,spread_props({"data-slot":"popover-content",get sideOffset(){return sideOffset()},get side(){return $$props.side},get align(){return align()},get collisionPadding(){return collisionPadding()},get avoidCollisions(){return avoidCollisions()}, get class(){return get$3($0)}},()=>restProps,{get ref(){return ref2()},set ref($$value){ref2($$value)}}))})}append($$anchor2,fragment_1)},$$slots:{default:!0}})),pop()}function Popover_trigger($$anchor,$$props){push$1($$props,!0);let ref2=prop($$props,"ref",15,null),restProps=rest_props($$props,["$$slots","$$events","$$legacy","ref","class"]);var fragment=comment$2(),node2=first_child(fragment);{let $0=user_derived(()=>cn$1("",$$props.class));component(node2,()=>Popover_trigger$1,($$anchor2,PopoverPrimitive_Trigger)=>{ PopoverPrimitive_Trigger($$anchor2,spread_props({"data-slot":"popover-trigger",get class(){return get$3($0)}},()=>restProps,{get ref(){return ref2()},set ref($$value){ref2($$value)}}))})}append($$anchor,fragment),pop()}var root_2$V=from_html(' '),root_1$C=from_html(" ",1);function ChatFormPickerPopover($$anchor,$$props){push$1($$props,!0);let className=prop($$props,"class",3,""),isOpen=prop($$props,"isOpen",15,!1),srLabel=prop($$props,"srLabel",3,"Open picker"); -var fragment=comment$2(),node2=first_child(fragment);component(node2,()=>Popover,($$anchor2,Popover_Root)=>{Popover_Root($$anchor2,{onOpenChange:open2=>{open2||$$props.onClose?.()},get open(){return isOpen()},set open($$value){isOpen($$value)},children:($$anchor3,$$slotProps)=>{var fragment_1=root_1$C(),node_1=first_child(fragment_1);component(node_1,()=>Popover_trigger,($$anchor4,Popover_Trigger)=>{Popover_Trigger($$anchor4,{class:"pointer-events-none absolute inset-0 opacity-0",children:($$anchor5,$$slotProps2)=>{ -var span=root_2$V(),text2=child(span,!0);reset(span),template_effect(()=>set_text(text2,srLabel())),append($$anchor5,span)},$$slots:{default:!0}})});var node_2=sibling(node_1,2);component(node_2,()=>Popover_content,($$anchor4,Popover_Content)=>{Popover_Content($$anchor4,{side:"top",align:"start",sideOffset:12,get class(){return`w-[var(--bits-popover-anchor-width)] max-w-none rounded-xl border-border/50 p-0 shadow-xl ${className()??""}`},get onkeydown(){return $$props.onKeydown},onOpenAutoFocus:event2=>event2. -preventDefault(),children:($$anchor5,$$slotProps2)=>{var fragment_2=comment$2(),node_3=first_child(fragment_2);snippet(node_3,()=>$$props.children),append($$anchor5,fragment_2)},$$slots:{default:!0}})}),append($$anchor3,fragment_1)},$$slots:{default:!0}})}),append($$anchor,fragment),pop()}var root_2$U=from_html('
'),root_5$r=from_html('
'),root_1$B=from_html(" ",1);function ChatFormPickerList($$anchor,$$props){push$1($$props,!0);let searchQuery=prop($$props,"searchQuery",15),searchPlaceholder=prop($$props,"searchPlaceholder",3,"Search..."),emptyMessage=prop($$props,"emptyMessage",3,"No items available"),listContainer=state$1(null);user_effect(()=>{if(get$3(listContainer)&&$$props.selectedIndex>=0&&$$props.selectedIndex<$$props.items.length){const selectedElement=get$3(listContainer).querySelector(`[data-picker-index="${$$props.selectedIndex}\ -"]`);selectedElement&&selectedElement.scrollIntoView({behavior:"smooth",block:"center",inline:"nearest"})}}),Scroll_area($$anchor,{children:($$anchor2,$$slotProps)=>{var fragment_1=root_1$B(),node2=first_child(fragment_1);{var consequent=$$anchor3=>{var div=root_2$U(),node_1=child(div);SearchInput(node_1,{get placeholder(){return searchPlaceholder()},get value(){return searchQuery()},set value($$value){searchQuery($$value)}}),reset(div),append($$anchor3,div)};if_block(node2,$$render=>{$$props.showSearchInput&& -$$render(consequent)})}var div_1=sibling(node2,2),node_2=child(div_1);{var consequent_2=$$anchor3=>{var fragment_2=comment$2(),node_3=first_child(fragment_2);{var consequent_1=$$anchor4=>{var fragment_3=comment$2(),node_4=first_child(fragment_3);snippet(node_4,()=>$$props.skeleton),append($$anchor4,fragment_3)};if_block(node_3,$$render=>{$$props.skeleton&&$$render(consequent_1)})}append($$anchor3,fragment_2)},consequent_3=$$anchor3=>{var div_2=root_5$r(),text2=child(div_2,!0);reset(div_2),template_effect( -()=>set_text(text2,emptyMessage())),append($$anchor3,div_2)},alternate=$$anchor3=>{var fragment_4=comment$2(),node_5=first_child(fragment_4);each(node_5,19,()=>$$props.items,(itemData,index2)=>$$props.itemKey(itemData,index2),($$anchor4,itemData,index2)=>{var fragment_5=comment$2(),node_6=first_child(fragment_5);snippet(node_6,()=>$$props.item,()=>get$3(itemData),()=>get$3(index2),()=>get$3(index2)===$$props.selectedIndex),append($$anchor4,fragment_5)}),append($$anchor3,fragment_4)};if_block(node_2, -$$render=>{$$props.isLoading?$$render(consequent_2):$$props.items.length===0?$$render(consequent_3,1):$$render(alternate,-1)})}reset(div_1),bind_this(div_1,$$value=>set$1(listContainer,$$value),()=>get$3(listContainer));var node_7=sibling(div_1,2);{var consequent_4=$$anchor3=>{var fragment_6=comment$2(),node_8=first_child(fragment_6);snippet(node_8,()=>$$props.footer),append($$anchor3,fragment_6)};if_block(node_7,$$render=>{$$props.footer&&$$render(consequent_4)})}template_effect(()=>set_class(div_1, -1,clsx([`${CHAT_FORM_POPOVER_MAX_HEIGHT} p-2`,$$props.showSearchInput&&"pt-13"]))),append($$anchor2,fragment_1)},$$slots:{default:!0}}),pop()}var root$1h=from_html('');function ChatFormPickerListItem($$anchor,$$props){let isSelected=prop($$props,"isSelected",3,!1);var button=root$1h(),node2=child(button);snippet(node2,()=>$$props.children),reset(button),template_effect(()=>{set_attribute(button,"data-picker-index",$$props.dataIndex),set_class(button,1,`flex w-fu\ -ll cursor-pointer items-start gap-3 rounded-lg px-3 py-2 text-left hover:bg-accent/50 ${isSelected()?"bg-accent/50":""}`)}),delegated("click",button,function(...$$args){$$props.onclick?.apply(this,$$args)}),append($$anchor,button)}delegate(["click"]);var root_1$A=from_html(''),root_3$J=from_html('

'),root$1g=from_html('
');function ChatFormPickerItemHeader($$anchor,$$props){push$1($$props,!0);let faviconUrl=user_derived(()=>$$props.server?mcpStore.getServerFavicon($$props.server.id):null);var div=root$1g(),div_1=child(div),node2=child(div_1);{var consequent=$$anchor2=>{var img=root_1$A();template_effect(()=>set_attribute(img,"src",get$3(faviconUrl))),event("e\ -rror",img,e=>{e.currentTarget.style.display="none"}),replay_events(img),append($$anchor2,img)};if_block(node2,$$render=>{get$3(faviconUrl)&&$$render(consequent)})}var span=sibling(node2,2),text2=child(span,!0);reset(span),reset(div_1);var div_2=sibling(div_1,2),span_1=child(div_2),text_1=child(span_1,!0);reset(span_1);var node_1=sibling(span_1,2);{var consequent_1=$$anchor2=>{var fragment=comment$2(),node_2=first_child(fragment);snippet(node_2,()=>$$props.titleExtra),append($$anchor2,fragment)}; -if_block(node_1,$$render=>{$$props.titleExtra&&$$render(consequent_1)})}reset(div_2);var node_3=sibling(div_2,2);{var consequent_2=$$anchor2=>{var p2=root_3$J(),text_2=child(p2,!0);reset(p2),template_effect(()=>set_text(text_2,$$props.description)),append($$anchor2,p2)};if_block(node_3,$$render=>{$$props.description&&$$render(consequent_2)})}var node_4=sibling(node_3,2);{var consequent_3=$$anchor2=>{var fragment_1=comment$2(),node_5=first_child(fragment_1);snippet(node_5,()=>$$props.subtitle),append( -$$anchor2,fragment_1)};if_block(node_4,$$render=>{$$props.subtitle&&$$render(consequent_3)})}reset(div),template_effect(()=>{set_text(text2,$$props.serverLabel),set_text(text_1,$$props.title)}),append($$anchor,div),pop()}var root_1$z=from_html('
'),root$1f=from_html('
');function ChatFormPickerListItemSkeleton($$anchor,$$props){let titleWidth=prop($$props,"titleWidth",3,"w-48"),showBadge=prop($$props,"showBadge",3,!1);var div=root$1f(),div_1=child(div),div_2=sibling(child(div_1),2),div_3=child(div_2),node2=sibling(div_3, -2);{var consequent=$$anchor2=>{var div_4=root_1$z();append($$anchor2,div_4)};if_block(node2,$$render=>{showBadge()&&$$render(consequent)})}reset(div_2),next$1(2),reset(div_1),reset(div),template_effect(()=>set_class(div_3,1,`h-4 ${titleWidth()??""} animate-pulse rounded bg-muted`)),append($$anchor,div)}var root_5$q=from_html('attached'),root_6$r=from_html('

'),root_10$b=from_html(" Browse all",1);function ChatFormPickerMcpResources($$anchor,$$props){push$1($$props,!0);let className=prop($$props,"class",3,""),isOpen=prop($$props,"isOpen",7,!1),searchQuery=prop($$props,"searchQuery",3,""),resources=state$1(proxy([])),isLoading2=state$1(!1),selectedIndex=state$1(0),internalSearchQuery=state$1(""),serverSettingsMap=user_derived(()=>{const servers=mcpStore.getServers(),map2=new SvelteMap;for(const server of servers) -map2.set(server.id,server);return map2});user_effect(()=>{isOpen()&&(loadResources(),set$1(selectedIndex,0))}),user_effect(()=>{get$3(filteredResources).length>0&&get$3(selectedIndex)>=get$3(filteredResources).length&&set$1(selectedIndex,0)});async function loadResources(){set$1(isLoading2,!0);try{const perChatOverrides=conversationsStore.getAllMcpServerOverrides();if(!await mcpStore.ensureInitialized(perChatOverrides)){set$1(resources,[],!0);return}await mcpStore.fetchAllResources(),set$1(resources, -mcpResourceStore.getAllResourceInfos(),!0)}catch(error2){console.error("[ChatFormPickerMcpResources] Failed to load resources:",error2),set$1(resources,[],!0)}finally{set$1(isLoading2,!1)}}function handleResourceClick(resource){mcpStore.attachResource(resource.uri),$$props.onResourceSelect?.(resource),$$props.onClose?.()}function isResourceAttached(uri2){return mcpResourceStore.isAttached(uri2)}function handleKeydown(event2){return isOpen()?event2.key===KeyboardKey.ESCAPE?(event2.preventDefault(), -$$props.onClose?.(),!0):event2.key===KeyboardKey.ARROW_DOWN?(event2.preventDefault(),get$3(filteredResources).length>0&&set$1(selectedIndex,(get$3(selectedIndex)+1)%get$3(filteredResources).length),!0):event2.key===KeyboardKey.ARROW_UP?(event2.preventDefault(),get$3(filteredResources).length>0&&set$1(selectedIndex,get$3(selectedIndex)===0?get$3(filteredResources).length-1:get$3(selectedIndex)-1,!0),!0):event2.key===KeyboardKey.ENTER?(event2.preventDefault(),get$3(filteredResources)[get$3(selectedIndex)]&& -handleResourceClick(get$3(filteredResources)[get$3(selectedIndex)]),!0):!1:!1}let filteredResources=user_derived(()=>{const sortedServers=mcpStore.getServersSorted(),serverOrderMap=new Map(sortedServers.map((server,index2)=>[server.id,index2])),sortedResources=[...get$3(resources)].sort((a,b)=>{const orderA=serverOrderMap.get(a.serverName)??Number.MAX_SAFE_INTEGER,orderB=serverOrderMap.get(b.serverName)??Number.MAX_SAFE_INTEGER;return orderA-orderB}),query=(searchQuery()||get$3(internalSearchQuery)). -toLowerCase();return query?sortedResources.filter(resource=>resource.name.toLowerCase().includes(query)||resource.title?.toLowerCase().includes(query)||resource.description?.toLowerCase().includes(query)||resource.uri.toLowerCase().includes(query)):sortedResources}),showSearchInput=user_derived(()=>get$3(resources).length>3);var $$exports={handleKeydown};return ChatFormPickerPopover($$anchor,{get class(){return className()},srLabel:"Open resource picker",get onClose(){return $$props.onClose},onKeydown:handleKeydown, -get isOpen(){return isOpen()},set isOpen($$value){isOpen($$value)},children:($$anchor2,$$slotProps)=>{ChatFormPickerList($$anchor2,{get items(){return get$3(filteredResources)},get isLoading(){return get$3(isLoading2)},get selectedIndex(){return get$3(selectedIndex)},get showSearchInput(){return get$3(showSearchInput)},searchPlaceholder:"Search resources...",emptyMessage:"No MCP resources available",itemKey:resource=>resource.serverName+":"+resource.uri,get searchQuery(){return get$3(internalSearchQuery)}, -set searchQuery($$value){set$1(internalSearchQuery,$$value,!0)},item:($$anchor3,resource=noop$3,index2=noop$3,isSelected=noop$3)=>{const server=user_derived(()=>get$3(serverSettingsMap).get(resource().serverName)),serverLabel=user_derived(()=>get$3(server)?mcpStore.getServerLabel(get$3(server)):resource().serverName);ChatFormPickerListItem($$anchor3,{get dataIndex(){return index2()},get isSelected(){return isSelected()},onclick:()=>handleResourceClick(resource()),children:($$anchor4,$$slotProps2)=>{ -{const titleExtra=$$anchor5=>{var fragment_4=comment$2(),node2=first_child(fragment_4);{var consequent=$$anchor6=>{var span=root_5$q();append($$anchor6,span)},d2=user_derived(()=>isResourceAttached(resource().uri));if_block(node2,$$render=>{get$3(d2)&&$$render(consequent)})}append($$anchor5,fragment_4)},subtitle=$$anchor5=>{var p2=root_6$r(),text2=child(p2,!0);reset(p2),template_effect(()=>set_text(text2,resource().uri)),append($$anchor5,p2)};let $0=user_derived(()=>resource().title||resource(). -name);ChatFormPickerItemHeader($$anchor4,{get server(){return get$3(server)},get serverLabel(){return get$3(serverLabel)},get title(){return get$3($0)},get description(){return resource().description},titleExtra,subtitle,$$slots:{titleExtra:!0,subtitle:!0}})}},$$slots:{default:!0}})},skeleton:$$anchor3=>{ChatFormPickerListItemSkeleton($$anchor3,{})},footer:$$anchor3=>{var fragment_6=comment$2(),node_1=first_child(fragment_6);{var consequent_1=$$anchor4=>{Button($$anchor4,{class:"fixed right-3 bo\ -ttom-3",type:"button",get onclick(){return $$props.onBrowse},variant:"secondary",size:"sm",children:($$anchor5,$$slotProps2)=>{var fragment_8=root_10$b(),node_2=first_child(fragment_8);Folder_open(node_2,{class:"h-3 w-3"}),next$1(),append($$anchor5,fragment_8)},$$slots:{default:!0}})};if_block(node_1,$$render=>{$$props.onBrowse&&get$3(resources).length>3&&$$render(consequent_1)})}append($$anchor3,fragment_6)},$$slots:{item:!0,skeleton:!0,footer:!0}})},$$slots:{default:!0}}),pop($$exports)}var root$1e=from_html( -" ",1);function ChatFormPickers($$anchor,$$props){push$1($$props,!0);let promptPickerRef=state$1(void 0),resourcePickerRef=state$1(void 0);function handleKeydown(event2){return!!($$props.isPromptPickerOpen&&get$3(promptPickerRef)?.handleKeydown(event2)||$$props.isInlineResourcePickerOpen&&get$3(resourcePickerRef)?.handleKeydown(event2))}var $$exports={handleKeydown},fragment=root$1e(),node2=first_child(fragment);bind_this(ChatFormPickerMcpPrompts(node2,{get isOpen(){return $$props.isPromptPickerOpen}, -get searchQuery(){return $$props.promptSearchQuery},get onClose(){return $$props.onPromptPickerClose},get onPromptLoadStart(){return $$props.onPromptLoadStart},get onPromptLoadComplete(){return $$props.onPromptLoadComplete},get onPromptLoadError(){return $$props.onPromptLoadError}}),$$value=>set$1(promptPickerRef,$$value,!0),()=>get$3(promptPickerRef));var node_1=sibling(node2,2);return bind_this(ChatFormPickerMcpResources(node_1,{get isOpen(){return $$props.isInlineResourcePickerOpen},get searchQuery(){ -return $$props.resourceSearchQuery},get onClose(){return $$props.onInlineResourcePickerClose},get onResourceSelect(){return $$props.onInlineResourceSelect},get onBrowse(){return $$props.onInlineResourceBrowse}}),$$value=>set$1(resourcePickerRef,$$value,!0),()=>get$3(resourcePickerRef)),append($$anchor,fragment),pop($$exports)}const MESSAGE_EDIT_KEY=Symbol.for(CONTEXT_KEY_MESSAGE_EDIT);function setMessageEditContext(ctx){return setContext(MESSAGE_EDIT_KEY,ctx)}function getMessageEditContext(){return getContext( -MESSAGE_EDIT_KEY)}const CHAT_ACTIONS_KEY=Symbol.for(CONTEXT_KEY_CHAT_ACTIONS);function setChatActionsContext(ctx){return setContext(CHAT_ACTIONS_KEY,ctx)}function getChatActionsContext(){return getContext(CHAT_ACTIONS_KEY)}const CHAT_SETTINGS_CONFIG_KEY=Symbol.for(CONTEXT_KEY_CHAT_SETTINGS_CONFIG);function setChatSettingsConfigContext(ctx){return setContext(CHAT_SETTINGS_CONFIG_KEY,ctx)}const PROCESSING_INFO_KEY=Symbol.for(CONTEXT_KEY_PROCESSING_INFO);function setProcessingInfoContext(ctx){return setContext( -PROCESSING_INFO_KEY,ctx)}function getProcessingInfoContext(){return getContext(PROCESSING_INFO_KEY)}var root$1d=from_html(" ",1);function ChatMessages($$anchor,$$props){push$1($$props,!0);let messages=prop($$props,"messages",19,()=>[]),allConversationMessages=state$1(proxy([]));const currentConfig=config$1();setChatActionsContext({copy:async message=>{const asPlainText=!!currentConfig.copyTextAttachmentsAsPlainText,clipboardContent=formatMessageForClipboard(message.content,message.extra,asPlainText); -await copyToClipboard(clipboardContent,"Message copied to clipboard")},delete:async message=>{await chatStore.deleteMessage(message.id),refreshAllMessages()},navigateToSibling:async siblingId=>{await conversationsStore.navigateToSibling(siblingId)},editWithBranching:async(message,newContent,newExtras)=>{$$props.onUserAction?.(),await chatStore.editMessageWithBranching(message.id,newContent,newExtras),refreshAllMessages()},editWithReplacement:async(message,newContent,shouldBranch)=>{$$props.onUserAction?.(), -await chatStore.editAssistantMessage(message.id,newContent,shouldBranch),refreshAllMessages()},editUserMessagePreserveResponses:async(message,newContent,newExtras)=>{$$props.onUserAction?.(),await chatStore.editUserMessagePreserveResponses(message.id,newContent,newExtras),refreshAllMessages()},regenerateWithBranching:async(message,modelOverride)=>{$$props.onUserAction?.(),await chatStore.regenerateMessageWithBranching(message.id,modelOverride),refreshAllMessages()},continueAssistantMessage:async message=>{ -$$props.onUserAction?.(),await chatStore.continueAssistantMessage(message.id),refreshAllMessages()},forkConversation:async(message,options)=>{await conversationsStore.forkConversation(message.id,options)}});function refreshAllMessages(){const conversation=activeConversation();conversation?conversationsStore.getConversationMessages(conversation.id).then(messages2=>{set$1(allConversationMessages,messages2,!0)}):set$1(allConversationMessages,[],!0)}user_effect(()=>{activeConversation()&&refreshAllMessages()}); -let displayMessages=user_derived(()=>{if(!messages().length)return[];const filteredMessages=currentConfig.showSystemMessage?messages():messages().filter(msg=>msg.type!==MessageRole.SYSTEM),result=[];for(let i=0;i=0;i--)if(result[i].message.role===MessageRole.ASSISTANT){result[i].isLastAssistantMessage=!0;break}return result});var fragment=root$1d(),node2=first_child(fragment);each(node2,17,()=>get$3(displayMessages),({message,toolMessages,isLastAssistantMessage,siblingInfo})=>message.id,($$anchor2,$$item)=>{let message=()=>get$3($$item).message,toolMessages=()=>get$3($$item).toolMessages,isLastAssistantMessage=()=>get$3($$item).isLastAssistantMessage,siblingInfo=()=>get$3( -$$item).siblingInfo;ChatMessage($$anchor2,{class:"mx-auto mt-12 w-full max-w-[48rem]",get message(){return message()},get toolMessages(){return toolMessages()},get isLastAssistantMessage(){return isLastAssistantMessage()},get siblingInfo(){return siblingInfo()}})});var node_1=sibling(node2,2);{var consequent_1=$$anchor2=>{const convId=user_derived(()=>activeConversation().id),pendingContent=user_derived(()=>agenticPendingSteeringMessageContent(get$3(convId)));var fragment_2=comment$2(),node_2=first_child( -fragment_2);{var consequent=$$anchor3=>{{let $0=user_derived(()=>agenticPendingSteeringMessageExtras(get$3(convId)));ChatMessageUserPending($$anchor3,{class:"mx-auto mt-12 w-full max-w-[48rem]",get content(){return get$3(pendingContent)},get extras(){return get$3($0)},onSendImmediately:()=>chatStore.abortCurrentFlow(get$3(convId)),onEdit:(newContent,extras)=>agenticInjectSteeringMessage(get$3(convId),newContent,extras),onDelete:()=>agenticClearSteeringMessage(get$3(convId))})}};if_block(node_2,$$render=>{ -get$3(pendingContent)&&$$render(consequent)})}append($$anchor2,fragment_2)},d2=user_derived(()=>activeConversation()&&agenticPendingSteeringMessageContent(activeConversation().id)),consequent_3=$$anchor2=>{const convId=user_derived(()=>activeConversation().id),pendingContent=user_derived(()=>chatPendingMessageContent(get$3(convId)));var fragment_4=comment$2(),node_3=first_child(fragment_4);{var consequent_2=$$anchor3=>{{let $0=user_derived(()=>chatPendingMessageExtras(get$3(convId)));ChatMessageUserPending( -$$anchor3,{class:"mx-auto mt-12 w-full max-w-[48rem]",get content(){return get$3(pendingContent)},get extras(){return get$3($0)},onSendImmediately:()=>chatStore.abortCurrentFlow(get$3(convId)),onEdit:(newContent,extras)=>chatInjectPendingMessage(get$3(convId),newContent,extras),onDelete:()=>chatClearPendingMessage(get$3(convId))})}};if_block(node_3,$$render=>{get$3(pendingContent)&&$$render(consequent_2)})}append($$anchor2,fragment_4)},d_12=user_derived(()=>activeConversation()&&chatPendingMessageContent( -activeConversation().id));if_block(node_1,$$render=>{get$3(d2)?$$render(consequent_1):get$3(d_12)&&$$render(consequent_3,1)})}append($$anchor,fragment),pop()}function isElementInViewport(node2){const rect=node2.getBoundingClientRect();return rect.top0&&rect.left0}function fadeInView(node2,options={}){const{duration:duration2=300,y=0,skipIfVisible=!1}=options;skipIfVisible&&isElementInViewport(node2)||(node2.style.opacity="0",node2.style. -transform=`translateY(${y}px)`,node2.style.transition=`opacity ${duration2}ms ease-out, transform ${duration2}ms ease-out`,user_effect(()=>{const observer=new IntersectionObserver(entries=>{for(const entry of entries)entry.isIntersecting&&(requestAnimationFrame(()=>{node2.style.opacity="1",node2.style.transform="translateY(0)"}),observer.disconnect())},{threshold:.05});return observer.observe(node2),()=>{observer.disconnect()}}))}var root$1c=from_html("
");function ChatMessage($$anchor,$$props){ -push$1($$props,!0);let className=prop($$props,"class",3,""),toolMessages=prop($$props,"toolMessages",19,()=>[]),isLastAssistantMessage=prop($$props,"isLastAssistantMessage",3,!1),siblingInfo=prop($$props,"siblingInfo",3,null);const chatActions=getChatActionsContext();let deletionInfo=state$1(null),editedContent=user_derived(()=>$$props.message.content),rawEditContent=user_derived(()=>{if($$props.message.role!==MessageRole.ASSISTANT)return;const sections=deriveAgenticSections($$props.message,toolMessages(), -[],!1),parts=[];for(const section2 of sections)switch(section2.type){case AgenticSectionType.REASONING:case AgenticSectionType.REASONING_PENDING:parts.push(`${REASONING_TAGS.START} +var fragment=comment$2(),node2=first_child(fragment);component(node2,()=>Popover,($$anchor2,Popover_Root)=>{Popover_Root($$anchor2,{onOpenChange:open2=>{open2||$$props.onClose?.()},get open(){return isOpen()},set open($$value){isOpen($$value)},children:($$anchor3,$$slotProps)=>{var fragment_1=root_1$C(),node_1=first_child(fragment_1);component(node_1,()=>Popover_trigger,($$anchor4,Popover_Trigger)=>{Popover_Trigger($$anchor4,{class:"pointer-events-none absolute inset-0 opacity-0",tabindex:-1,"ar\ +ia-hidden":"true",children:($$anchor5,$$slotProps2)=>{var span=root_2$V(),text2=child(span,!0);reset(span),template_effect(()=>set_text(text2,srLabel())),append($$anchor5,span)},$$slots:{default:!0}})});var node_2=sibling(node_1,2);component(node_2,()=>Popover_content,($$anchor4,Popover_Content)=>{Popover_Content($$anchor4,{side:"top",align:"start",sideOffset:12,get class(){return`w-[var(--bits-popover-anchor-width)] max-w-none rounded-xl border-border/50 p-0 shadow-xl ${className()??""}`},get onkeydown(){ +return $$props.onKeydown},onOpenAutoFocus:event2=>event2.preventDefault(),children:($$anchor5,$$slotProps2)=>{var fragment_2=comment$2(),node_3=first_child(fragment_2);snippet(node_3,()=>$$props.children),append($$anchor5,fragment_2)},$$slots:{default:!0}})}),append($$anchor3,fragment_1)},$$slots:{default:!0}})}),append($$anchor,fragment),pop()}var root_2$U=from_html('
'),root_5$r=from_html('
'),root_1$B=from_html("
",1);function ChatFormPickerList($$anchor,$$props){push$1($$props,!0);let searchQuery=prop($$props,"searchQuery",15),searchPlaceholder=prop($$props,"searchPlaceholder",3,"Search..."),emptyMessage=prop($$props,"emptyMessage",3,"No items available"),listContainer=state$1(null);user_effect(()=>{if(get$3(listContainer)&&$$props.selectedIndex>=0&&$$props.selectedIndex<$$props.items.length){const selectedElement=get$3(listContainer). +querySelector(`[data-picker-index="${$$props.selectedIndex}"]`);selectedElement&&selectedElement.scrollIntoView({behavior:"smooth",block:"center",inline:"nearest"})}}),Scroll_area($$anchor,{children:($$anchor2,$$slotProps)=>{var fragment_1=root_1$B(),node2=first_child(fragment_1);{var consequent=$$anchor3=>{var div=root_2$U(),node_1=child(div);SearchInput(node_1,{get placeholder(){return searchPlaceholder()},get value(){return searchQuery()},set value($$value){searchQuery($$value)}}),reset(div), +append($$anchor3,div)};if_block(node2,$$render=>{$$props.showSearchInput&&$$render(consequent)})}var div_1=sibling(node2,2),node_2=child(div_1);{var consequent_2=$$anchor3=>{var fragment_2=comment$2(),node_3=first_child(fragment_2);{var consequent_1=$$anchor4=>{var fragment_3=comment$2(),node_4=first_child(fragment_3);snippet(node_4,()=>$$props.skeleton),append($$anchor4,fragment_3)};if_block(node_3,$$render=>{$$props.skeleton&&$$render(consequent_1)})}append($$anchor3,fragment_2)},consequent_3=$$anchor3=>{ +var div_2=root_5$r(),text2=child(div_2,!0);reset(div_2),template_effect(()=>set_text(text2,emptyMessage())),append($$anchor3,div_2)},alternate=$$anchor3=>{var fragment_4=comment$2(),node_5=first_child(fragment_4);each(node_5,19,()=>$$props.items,(itemData,index2)=>$$props.itemKey(itemData,index2),($$anchor4,itemData,index2)=>{var fragment_5=comment$2(),node_6=first_child(fragment_5);snippet(node_6,()=>$$props.item,()=>get$3(itemData),()=>get$3(index2),()=>get$3(index2)===$$props.selectedIndex),append( +$$anchor4,fragment_5)}),append($$anchor3,fragment_4)};if_block(node_2,$$render=>{$$props.isLoading?$$render(consequent_2):$$props.items.length===0?$$render(consequent_3,1):$$render(alternate,-1)})}reset(div_1),bind_this(div_1,$$value=>set$1(listContainer,$$value),()=>get$3(listContainer));var node_7=sibling(div_1,2);{var consequent_4=$$anchor3=>{var fragment_6=comment$2(),node_8=first_child(fragment_6);snippet(node_8,()=>$$props.footer),append($$anchor3,fragment_6)};if_block(node_7,$$render=>{$$props. +footer&&$$render(consequent_4)})}template_effect(()=>set_class(div_1,1,clsx([`${CHAT_FORM_POPOVER_MAX_HEIGHT} p-2`,$$props.showSearchInput&&"pt-13"]))),append($$anchor2,fragment_1)},$$slots:{default:!0}}),pop()}var root$1h=from_html('');function ChatFormPickerListItem($$anchor,$$props){let isSelected=prop($$props,"isSelected",3,!1);var button=root$1h(),node2=child(button);snippet(node2,()=>$$props.children),reset(button),template_effect(()=>{set_attribute(button, +"data-picker-index",$$props.dataIndex),set_class(button,1,`flex w-full cursor-pointer items-start gap-3 rounded-lg px-3 py-2 text-left hover:bg-accent/50 ${isSelected()?"bg-accent/50":""}`)}),delegated("click",button,function(...$$args){$$props.onclick?.apply(this,$$args)}),append($$anchor,button)}delegate(["click"]);var root_1$A=from_html(''),root_3$J=from_html('

'),root$1g=from_html('<\ +div class="min-w-0 flex-1">
');function ChatFormPickerItemHeader($$anchor,$$props){push$1($$props,!0);let faviconUrl=user_derived(()=>$$props.server?mcpStore.getServerFavicon($$props.server.id):null);var div=root$1g(),div_1=child(div),node2=child(div_1);{var consequent=$$anchor2=>{var img=root_1$A();template_effect( +()=>set_attribute(img,"src",get$3(faviconUrl))),event("error",img,e=>{e.currentTarget.style.display="none"}),replay_events(img),append($$anchor2,img)};if_block(node2,$$render=>{get$3(faviconUrl)&&$$render(consequent)})}var span=sibling(node2,2),text2=child(span,!0);reset(span),reset(div_1);var div_2=sibling(div_1,2),span_1=child(div_2),text_1=child(span_1,!0);reset(span_1);var node_1=sibling(span_1,2);{var consequent_1=$$anchor2=>{var fragment=comment$2(),node_2=first_child(fragment);snippet(node_2, +()=>$$props.titleExtra),append($$anchor2,fragment)};if_block(node_1,$$render=>{$$props.titleExtra&&$$render(consequent_1)})}reset(div_2);var node_3=sibling(div_2,2);{var consequent_2=$$anchor2=>{var p2=root_3$J(),text_2=child(p2,!0);reset(p2),template_effect(()=>set_text(text_2,$$props.description)),append($$anchor2,p2)};if_block(node_3,$$render=>{$$props.description&&$$render(consequent_2)})}var node_4=sibling(node_3,2);{var consequent_3=$$anchor2=>{var fragment_1=comment$2(),node_5=first_child( +fragment_1);snippet(node_5,()=>$$props.subtitle),append($$anchor2,fragment_1)};if_block(node_4,$$render=>{$$props.subtitle&&$$render(consequent_3)})}reset(div),template_effect(()=>{set_text(text2,$$props.serverLabel),set_text(text_1,$$props.title)}),append($$anchor,div),pop()}var root_1$z=from_html('
'),root$1f=from_html('
');function ChatFormPickerListItemSkeleton($$anchor,$$props){let titleWidth=prop($$props,"titleWidth",3,"w-48"),showBadge=prop($$props,"showBadge",3,!1);var div=root$1f(),div_1=child(div),div_2=sibling( +child(div_1),2),div_3=child(div_2),node2=sibling(div_3,2);{var consequent=$$anchor2=>{var div_4=root_1$z();append($$anchor2,div_4)};if_block(node2,$$render=>{showBadge()&&$$render(consequent)})}reset(div_2),next$1(2),reset(div_1),reset(div),template_effect(()=>set_class(div_3,1,`h-4 ${titleWidth()??""} animate-pulse rounded bg-muted`)),append($$anchor,div)}var root_5$q=from_html('\ +attached'),root_6$r=from_html('

'),root_10$b=from_html(" Browse all",1);function ChatFormPickerMcpResources($$anchor,$$props){push$1($$props,!0);let className=prop($$props,"class",3,""),isOpen=prop($$props,"isOpen",7,!1),searchQuery=prop($$props,"searchQuery",3,""),resources=state$1(proxy([])),isLoading2=state$1(!1),selectedIndex=state$1(0),internalSearchQuery=state$1(""),serverSettingsMap=user_derived(()=>{const servers=mcpStore. +getServers(),map2=new SvelteMap;for(const server of servers)map2.set(server.id,server);return map2});user_effect(()=>{isOpen()&&(loadResources(),set$1(selectedIndex,0))}),user_effect(()=>{get$3(filteredResources).length>0&&get$3(selectedIndex)>=get$3(filteredResources).length&&set$1(selectedIndex,0)});async function loadResources(){set$1(isLoading2,!0);try{const perChatOverrides=conversationsStore.getAllMcpServerOverrides();if(!await mcpStore.ensureInitialized(perChatOverrides)){set$1(resources, +[],!0);return}await mcpStore.fetchAllResources(),set$1(resources,mcpResourceStore.getAllResourceInfos(),!0)}catch(error2){console.error("[ChatFormPickerMcpResources] Failed to load resources:",error2),set$1(resources,[],!0)}finally{set$1(isLoading2,!1)}}function handleResourceClick(resource){mcpStore.attachResource(resource.uri),$$props.onResourceSelect?.(resource),$$props.onClose?.()}function isResourceAttached(uri2){return mcpResourceStore.isAttached(uri2)}function handleKeydown(event2){return isOpen()? +event2.key===KeyboardKey.ESCAPE?(event2.preventDefault(),$$props.onClose?.(),!0):event2.key===KeyboardKey.ARROW_DOWN?(event2.preventDefault(),get$3(filteredResources).length>0&&set$1(selectedIndex,(get$3(selectedIndex)+1)%get$3(filteredResources).length),!0):event2.key===KeyboardKey.ARROW_UP?(event2.preventDefault(),get$3(filteredResources).length>0&&set$1(selectedIndex,get$3(selectedIndex)===0?get$3(filteredResources).length-1:get$3(selectedIndex)-1,!0),!0):event2.key===KeyboardKey.ENTER?(event2. +preventDefault(),get$3(filteredResources)[get$3(selectedIndex)]&&handleResourceClick(get$3(filteredResources)[get$3(selectedIndex)]),!0):!1:!1}let filteredResources=user_derived(()=>{const sortedServers=mcpStore.getServersSorted(),serverOrderMap=new Map(sortedServers.map((server,index2)=>[server.id,index2])),sortedResources=[...get$3(resources)].sort((a,b)=>{const orderA=serverOrderMap.get(a.serverName)??Number.MAX_SAFE_INTEGER,orderB=serverOrderMap.get(b.serverName)??Number.MAX_SAFE_INTEGER;return orderA- +orderB}),query=(searchQuery()||get$3(internalSearchQuery)).toLowerCase();return query?sortedResources.filter(resource=>resource.name.toLowerCase().includes(query)||resource.title?.toLowerCase().includes(query)||resource.description?.toLowerCase().includes(query)||resource.uri.toLowerCase().includes(query)):sortedResources}),showSearchInput=user_derived(()=>get$3(resources).length>3);var $$exports={handleKeydown};return ChatFormPickerPopover($$anchor,{get class(){return className()},srLabel:"Open\ + resource picker",get onClose(){return $$props.onClose},onKeydown:handleKeydown,get isOpen(){return isOpen()},set isOpen($$value){isOpen($$value)},children:($$anchor2,$$slotProps)=>{ChatFormPickerList($$anchor2,{get items(){return get$3(filteredResources)},get isLoading(){return get$3(isLoading2)},get selectedIndex(){return get$3(selectedIndex)},get showSearchInput(){return get$3(showSearchInput)},searchPlaceholder:"Search resources...",emptyMessage:"No MCP resources available",itemKey:resource=>resource. +serverName+":"+resource.uri,get searchQuery(){return get$3(internalSearchQuery)},set searchQuery($$value){set$1(internalSearchQuery,$$value,!0)},item:($$anchor3,resource=noop$3,index2=noop$3,isSelected=noop$3)=>{const server=user_derived(()=>get$3(serverSettingsMap).get(resource().serverName)),serverLabel=user_derived(()=>get$3(server)?mcpStore.getServerLabel(get$3(server)):resource().serverName);ChatFormPickerListItem($$anchor3,{get dataIndex(){return index2()},get isSelected(){return isSelected()}, +onclick:()=>handleResourceClick(resource()),children:($$anchor4,$$slotProps2)=>{{const titleExtra=$$anchor5=>{var fragment_4=comment$2(),node2=first_child(fragment_4);{var consequent=$$anchor6=>{var span=root_5$q();append($$anchor6,span)},d2=user_derived(()=>isResourceAttached(resource().uri));if_block(node2,$$render=>{get$3(d2)&&$$render(consequent)})}append($$anchor5,fragment_4)},subtitle=$$anchor5=>{var p2=root_6$r(),text2=child(p2,!0);reset(p2),template_effect(()=>set_text(text2,resource().uri)), +append($$anchor5,p2)};let $0=user_derived(()=>resource().title||resource().name);ChatFormPickerItemHeader($$anchor4,{get server(){return get$3(server)},get serverLabel(){return get$3(serverLabel)},get title(){return get$3($0)},get description(){return resource().description},titleExtra,subtitle,$$slots:{titleExtra:!0,subtitle:!0}})}},$$slots:{default:!0}})},skeleton:$$anchor3=>{ChatFormPickerListItemSkeleton($$anchor3,{})},footer:$$anchor3=>{var fragment_6=comment$2(),node_1=first_child(fragment_6); +{var consequent_1=$$anchor4=>{Button($$anchor4,{class:"fixed right-3 bottom-3",type:"button",get onclick(){return $$props.onBrowse},variant:"secondary",size:"sm",children:($$anchor5,$$slotProps2)=>{var fragment_8=root_10$b(),node_2=first_child(fragment_8);Folder_open(node_2,{class:"h-3 w-3"}),next$1(),append($$anchor5,fragment_8)},$$slots:{default:!0}})};if_block(node_1,$$render=>{$$props.onBrowse&&get$3(resources).length>3&&$$render(consequent_1)})}append($$anchor3,fragment_6)},$$slots:{item:!0, +skeleton:!0,footer:!0}})},$$slots:{default:!0}}),pop($$exports)}var root$1e=from_html(" ",1);function ChatFormPickers($$anchor,$$props){push$1($$props,!0);let promptPickerRef=state$1(void 0),resourcePickerRef=state$1(void 0);function handleKeydown(event2){return!!($$props.isPromptPickerOpen&&get$3(promptPickerRef)?.handleKeydown(event2)||$$props.isInlineResourcePickerOpen&&get$3(resourcePickerRef)?.handleKeydown(event2))}var $$exports={handleKeydown},fragment=root$1e(),node2=first_child(fragment); +bind_this(ChatFormPickerMcpPrompts(node2,{get isOpen(){return $$props.isPromptPickerOpen},get searchQuery(){return $$props.promptSearchQuery},get onClose(){return $$props.onPromptPickerClose},get onPromptLoadStart(){return $$props.onPromptLoadStart},get onPromptLoadComplete(){return $$props.onPromptLoadComplete},get onPromptLoadError(){return $$props.onPromptLoadError}}),$$value=>set$1(promptPickerRef,$$value,!0),()=>get$3(promptPickerRef));var node_1=sibling(node2,2);return bind_this(ChatFormPickerMcpResources( +node_1,{get isOpen(){return $$props.isInlineResourcePickerOpen},get searchQuery(){return $$props.resourceSearchQuery},get onClose(){return $$props.onInlineResourcePickerClose},get onResourceSelect(){return $$props.onInlineResourceSelect},get onBrowse(){return $$props.onInlineResourceBrowse}}),$$value=>set$1(resourcePickerRef,$$value,!0),()=>get$3(resourcePickerRef)),append($$anchor,fragment),pop($$exports)}const MESSAGE_EDIT_KEY=Symbol.for(CONTEXT_KEY_MESSAGE_EDIT);function setMessageEditContext(ctx){ +return setContext(MESSAGE_EDIT_KEY,ctx)}function getMessageEditContext(){return getContext(MESSAGE_EDIT_KEY)}const CHAT_ACTIONS_KEY=Symbol.for(CONTEXT_KEY_CHAT_ACTIONS);function setChatActionsContext(ctx){return setContext(CHAT_ACTIONS_KEY,ctx)}function getChatActionsContext(){return getContext(CHAT_ACTIONS_KEY)}const CHAT_SETTINGS_CONFIG_KEY=Symbol.for(CONTEXT_KEY_CHAT_SETTINGS_CONFIG);function setChatSettingsConfigContext(ctx){return setContext(CHAT_SETTINGS_CONFIG_KEY,ctx)}const PROCESSING_INFO_KEY=Symbol. +for(CONTEXT_KEY_PROCESSING_INFO);function setProcessingInfoContext(ctx){return setContext(PROCESSING_INFO_KEY,ctx)}function getProcessingInfoContext(){return getContext(PROCESSING_INFO_KEY)}var root$1d=from_html(" ",1);function ChatMessages($$anchor,$$props){push$1($$props,!0);let messages=prop($$props,"messages",19,()=>[]),allConversationMessages=state$1(proxy([]));const currentConfig=config$1();setChatActionsContext({copy:async message=>{const asPlainText=!!currentConfig.copyTextAttachmentsAsPlainText, +clipboardContent=formatMessageForClipboard(message.content,message.extra,asPlainText);await copyToClipboard(clipboardContent,"Message copied to clipboard")},delete:async message=>{await chatStore.deleteMessage(message.id),refreshAllMessages()},navigateToSibling:async siblingId=>{await conversationsStore.navigateToSibling(siblingId)},editWithBranching:async(message,newContent,newExtras)=>{$$props.onUserAction?.(),await chatStore.editMessageWithBranching(message.id,newContent,newExtras),refreshAllMessages()}, +editWithReplacement:async(message,newContent,shouldBranch)=>{$$props.onUserAction?.(),await chatStore.editAssistantMessage(message.id,newContent,shouldBranch),refreshAllMessages()},editUserMessagePreserveResponses:async(message,newContent,newExtras)=>{$$props.onUserAction?.(),await chatStore.editUserMessagePreserveResponses(message.id,newContent,newExtras),refreshAllMessages()},regenerateWithBranching:async(message,modelOverride)=>{$$props.onUserAction?.(),await chatStore.regenerateMessageWithBranching( +message.id,modelOverride),refreshAllMessages()},continueAssistantMessage:async message=>{$$props.onUserAction?.(),await chatStore.continueAssistantMessage(message.id),refreshAllMessages()},forkConversation:async(message,options)=>{await conversationsStore.forkConversation(message.id,options)}});function refreshAllMessages(){const conversation=activeConversation();conversation?conversationsStore.getConversationMessages(conversation.id).then(messages2=>{set$1(allConversationMessages,messages2,!0)}): +set$1(allConversationMessages,[],!0)}user_effect(()=>{activeConversation()&&refreshAllMessages()});let displayMessages=user_derived(()=>{if(!messages().length)return[];const filteredMessages=currentConfig.showSystemMessage?messages():messages().filter(msg=>msg.type!==MessageRole.SYSTEM),result=[];for(let i=0;i=0;i--)if(result[i].message.role===MessageRole.ASSISTANT){result[i].isLastAssistantMessage=!0;break}return result});var fragment=root$1d(),node2=first_child(fragment);each(node2,17,()=>get$3(displayMessages),({message,toolMessages,isLastAssistantMessage,siblingInfo})=>message.id,($$anchor2,$$item)=>{let message=()=>get$3($$item).message,toolMessages=()=>get$3( +$$item).toolMessages,isLastAssistantMessage=()=>get$3($$item).isLastAssistantMessage,siblingInfo=()=>get$3($$item).siblingInfo;ChatMessage($$anchor2,{class:"mx-auto mt-12 w-full max-w-[48rem]",get message(){return message()},get toolMessages(){return toolMessages()},get isLastAssistantMessage(){return isLastAssistantMessage()},get siblingInfo(){return siblingInfo()}})});var node_1=sibling(node2,2);{var consequent_1=$$anchor2=>{const convId=user_derived(()=>activeConversation().id),pendingContent=user_derived( +()=>agenticPendingSteeringMessageContent(get$3(convId)));var fragment_2=comment$2(),node_2=first_child(fragment_2);{var consequent=$$anchor3=>{{let $0=user_derived(()=>agenticPendingSteeringMessageExtras(get$3(convId)));ChatMessageUserPending($$anchor3,{class:"mx-auto mt-12 w-full max-w-[48rem]",get content(){return get$3(pendingContent)},get extras(){return get$3($0)},onSendImmediately:()=>chatStore.abortCurrentFlow(get$3(convId)),onEdit:(newContent,extras)=>agenticInjectSteeringMessage(get$3(convId), +newContent,extras),onDelete:()=>agenticClearSteeringMessage(get$3(convId))})}};if_block(node_2,$$render=>{get$3(pendingContent)&&$$render(consequent)})}append($$anchor2,fragment_2)},d2=user_derived(()=>activeConversation()&&agenticPendingSteeringMessageContent(activeConversation().id)),consequent_3=$$anchor2=>{const convId=user_derived(()=>activeConversation().id),pendingContent=user_derived(()=>chatPendingMessageContent(get$3(convId)));var fragment_4=comment$2(),node_3=first_child(fragment_4);{ +var consequent_2=$$anchor3=>{{let $0=user_derived(()=>chatPendingMessageExtras(get$3(convId)));ChatMessageUserPending($$anchor3,{class:"mx-auto mt-12 w-full max-w-[48rem]",get content(){return get$3(pendingContent)},get extras(){return get$3($0)},onSendImmediately:()=>chatStore.abortCurrentFlow(get$3(convId)),onEdit:(newContent,extras)=>chatInjectPendingMessage(get$3(convId),newContent,extras),onDelete:()=>chatClearPendingMessage(get$3(convId))})}};if_block(node_3,$$render=>{get$3(pendingContent)&& +$$render(consequent_2)})}append($$anchor2,fragment_4)},d_12=user_derived(()=>activeConversation()&&chatPendingMessageContent(activeConversation().id));if_block(node_1,$$render=>{get$3(d2)?$$render(consequent_1):get$3(d_12)&&$$render(consequent_3,1)})}append($$anchor,fragment),pop()}function isElementInViewport(node2){const rect=node2.getBoundingClientRect();return rect.top0&&rect.left0}function fadeInView(node2,options={}){const{duration:duration2=300, +y=0,skipIfVisible=!1}=options;skipIfVisible&&isElementInViewport(node2)||(node2.style.opacity="0",node2.style.transform=`translateY(${y}px)`,node2.style.transition=`opacity ${duration2}ms ease-out, transform ${duration2}ms ease-out`,user_effect(()=>{const observer=new IntersectionObserver(entries=>{for(const entry of entries)entry.isIntersecting&&(requestAnimationFrame(()=>{node2.style.opacity="1",node2.style.transform="translateY(0)"}),observer.disconnect())},{threshold:.05});return observer.observe( +node2),()=>{observer.disconnect()}}))}var root$1c=from_html("
");function ChatMessage($$anchor,$$props){push$1($$props,!0);let className=prop($$props,"class",3,""),toolMessages=prop($$props,"toolMessages",19,()=>[]),isLastAssistantMessage=prop($$props,"isLastAssistantMessage",3,!1),siblingInfo=prop($$props,"siblingInfo",3,null);const chatActions=getChatActionsContext();let deletionInfo=state$1(null),editedContent=user_derived(()=>$$props.message.content),rawEditContent=user_derived( +()=>{if($$props.message.role!==MessageRole.ASSISTANT)return;const sections=deriveAgenticSections($$props.message,toolMessages(),[],!1),parts=[];for(const section2 of sections)switch(section2.type){case AgenticSectionType.REASONING:case AgenticSectionType.REASONING_PENDING:parts.push(`${REASONING_TAGS.START} ${section2.content} ${REASONING_TAGS.END}`);break;case AgenticSectionType.TEXT:parts.push(section2.content);break;case AgenticSectionType.TOOL_CALL:case AgenticSectionType.TOOL_CALL_PENDING:case AgenticSectionType.TOOL_CALL_STREAMING:{const callObj={name:section2.toolName};if(section2.toolArgs)try{callObj.arguments=JSON.parse(section2.toolArgs)}catch{callObj.arguments=section2.toolArgs}parts.push(JSON.stringify(callObj,null,2)),section2.toolResult&&parts.push(`[Tool Result] ${section2.toolResult}`);break}}return parts.join(` diff --git a/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormPickers/ChatFormPicker/ChatFormPickerPopover.svelte b/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormPickers/ChatFormPicker/ChatFormPickerPopover.svelte index daea24e3a..c43a002e6 100644 --- a/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormPickers/ChatFormPicker/ChatFormPickerPopover.svelte +++ b/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormPickers/ChatFormPicker/ChatFormPickerPopover.svelte @@ -29,7 +29,11 @@ } }} > - +