```mermaid flowchart TB subgraph Routes["📍 Routes"] R1["/ (+page.svelte)"] R2["/chat/[id]"] RL["+layout.svelte"] end subgraph Components["🧩 Components"] direction TB subgraph LayoutComponents["Layout"] C_Sidebar["ChatSidebar"] C_Screen["ChatScreen"] end subgraph ChatUIComponents["Chat UI"] C_Form["ChatForm"] C_Messages["ChatMessages"] C_Message["ChatMessage"] C_MessageUser["ChatMessageUser"] C_MessageEditForm["ChatMessageEditForm"] C_Attach["ChatAttachments"] C_ModelsSelector["ModelsSelector"] C_Settings["ChatSettings"] end subgraph MCPComponents["MCP UI"] C_McpSettings["McpServersSettings"] C_McpServerCard["McpServerCard"] C_McpResourceBrowser["McpResourceBrowser"] C_McpResourcePreview["McpResourcePreview"] C_McpServersSelector["McpServersSelector"] end end subgraph Hooks["🪝 Hooks"] H1["useModelChangeValidation"] H2["useProcessingState"] H3["isMobile"] end subgraph Stores["🗄️ Stores"] direction TB subgraph S1["chatStore"] S1State["State:
isLoading, currentResponse
errorDialogState
activeProcessingState
chatLoadingStates
chatStreamingStates
abortControllers
processingStates
activeConversationId
isStreamingActive"] S1LoadState["Loading State:
setChatLoading()
isChatLoading()
syncLoadingStateForChat()
clearUIState()
isChatLoadingPublic()
getAllLoadingChats()
getAllStreamingChats()"] S1ProcState["Processing State:
setActiveProcessingConversation()
getProcessingState()
clearProcessingState()
getActiveProcessingState()
updateProcessingStateFromTimings()
getCurrentProcessingStateSync()
restoreProcessingStateFromMessages()"] S1Stream["Streaming:
streamChatCompletion()
startStreaming()
stopStreaming()
stopGeneration()
isStreaming()"] S1Error["Error Handling:
showErrorDialog()
dismissErrorDialog()
isAbortError()"] S1Msg["Message Operations:
addMessage()
sendMessage()
updateMessage()
deleteMessage()
getDeletionInfo()"] S1Regen["Regeneration:
regenerateMessage()
regenerateMessageWithBranching()
continueAssistantMessage()"] S1Edit["Editing:
editAssistantMessage()
editUserMessagePreserveResponses()
editMessageWithBranching()
clearEditMode()
isEditModeActive()
getAddFilesHandler()
setEditModeActive()"] S1Utils["Utilities:
getApiOptions()
parseTimingData()
getOrCreateAbortController()
getConversationModel()"] end subgraph SA["agenticStore"] SAState["State:
sessions (Map)
isAnyRunning"] SASession["Session Management:
getSession()
updateSession()
clearSession()
getActiveSessions()
isRunning()
currentTurn()
totalToolCalls()
lastError()
streamingToolCall()"] SAConfig["Configuration:
getConfig()
maxTurns, maxToolPreviewLines"] SAFlow["Agentic Loop:
runAgenticFlow()
executeAgenticLoop()
normalizeToolCalls()
emitToolCallResult()
extractBase64Attachments()"] end subgraph S2["conversationsStore"] S2State["State:
conversations
activeConversation
activeMessages
isInitialized
pendingMcpServerOverrides
titleUpdateConfirmationCallback"] S2Lifecycle["Lifecycle:
initialize()
loadConversations()
clearActiveConversation()"] S2ConvCRUD["Conversation CRUD:
createConversation()
loadConversation()
deleteConversation()
deleteAll()
updateConversationName()
updateConversationTitleWithConfirmation()"] S2MsgMgmt["Message Management:
refreshActiveMessages()
addMessageToActive()
updateMessageAtIndex()
findMessageIndex()
sliceActiveMessages()
removeMessageAtIndex()
getConversationMessages()"] S2Nav["Navigation:
navigateToSibling()
updateCurrentNode()
updateConversationTimestamp()"] S2McpOverrides["MCP Per-Chat Overrides:
getMcpServerOverride()
getAllMcpServerOverrides()
setMcpServerOverride()
toggleMcpServerForChat()
removeMcpServerOverride()
isMcpServerEnabledForChat()
clearPendingMcpServerOverrides()"] S2Export["Import/Export:
downloadConversation()
exportAllConversations()
importConversations()
importConversationsData()
triggerDownload()"] S2Utils["Utilities:
setTitleUpdateConfirmationCallback()"] end subgraph S3["modelsStore"] S3State["State:
models, routerModels
selectedModelId
selectedModelName
loading, updating, error
modelLoadingStates
modelPropsCache
modelPropsFetching
propsCacheVersion"] S3Getters["Computed Getters:
selectedModel
loadedModelIds
loadingModelIds
singleModelName"] S3Modal["Modalities:
getModelModalities()
modelSupportsVision()
modelSupportsAudio()
getModelModalitiesArray()
getModelProps()
updateModelModalities()"] S3Status["Status Queries:
isModelLoaded()
isModelOperationInProgress()
getModelStatus()
isModelPropsFetching()"] S3Fetch["Data Fetching:
fetch()
fetchRouterModels()
fetchModelProps()
fetchModalitiesForLoadedModels()"] S3Select["Model Selection:
selectModelById()
selectModelByName()
clearSelection()
findModelByName()
findModelById()
hasModel()"] S3LoadUnload["Loading/Unloading Models:
loadModel()
unloadModel()
ensureModelLoaded()
waitForModelStatus()
pollForModelStatus()"] S3Utils["Utilities:
toDisplayName()
clear()"] end subgraph S4["serverStore"] S4State["State:
props
loading, error
role
fetchPromise"] S4Getters["Getters:
defaultParams
contextSize
isRouterMode
isModelMode"] S4Data["Data Handling:
fetch()
getErrorMessage()
clear()"] S4Utils["Utilities:
detectRole()"] end subgraph S5["settingsStore"] S5State["State:
config
theme
isInitialized
userOverrides"] S5Lifecycle["Lifecycle:
initialize()
loadConfig()
saveConfig()
loadTheme()
saveTheme()"] S5Update["Config Updates:
updateConfig()
updateMultipleConfig()
updateTheme()"] S5Reset["Reset:
resetConfig()
resetTheme()
resetAll()
resetParameterToServerDefault()"] S5Sync["Server Sync:
syncWithServerDefaults()
forceSyncWithServerDefaults()"] S5Utils["Utilities:
getConfig()
getAllConfig()
getParameterInfo()
getParameterDiff()
getServerDefaults()
clearAllUserOverrides()"] end subgraph S6["mcpStore"] S6State["State:
isInitializing, error
toolCount, connectedServers
healthChecks (Map)
connections (Map)
toolsIndex (Map)"] S6Lifecycle["Lifecycle:
ensureInitialized()
initialize()
shutdown()
acquireConnection()
releaseConnection()"] S6Health["Health Checks:
runHealthCheck()
runHealthChecksForServers()
updateHealthCheck()
getHealthCheckState()
clearHealthCheck()"] S6Servers["Server Management:
getServers()
addServer()
updateServer()
removeServer()
getServerById()
getServerDisplayName()"] S6Tools["Tool Operations:
getToolDefinitionsForLLM()
getToolNames()
hasTool()
getToolServer()
executeTool()
executeToolByName()"] S6Prompts["Prompt Operations:
getAllPrompts()
getPrompt()
hasPromptsCapability()
getPromptCompletions()"] end subgraph S7["mcpResourceStore"] S7State["State:
serverResources (Map)
cachedResources (Map)
subscriptions (Map)
attachments[]
isLoading"] S7Resources["Resource Discovery:
setServerResources()
getServerResources()
getAllResourceInfos()
getAllTemplateInfos()
clearServerResources()"] S7Cache["Caching:
cacheResourceContent()
getCachedContent()
invalidateCache()
clearCache()"] S7Subs["Subscriptions:
addSubscription()
removeSubscription()
isSubscribed()
handleResourceUpdate()"] S7Attach["Attachments:
addAttachment()
updateAttachmentContent()
removeAttachment()
clearAttachments()
toMessageExtras()"] end subgraph ReactiveExports["⚡ Reactive Exports"] direction LR subgraph ChatExports["chatStore"] RE1["isLoading()"] RE2["currentResponse()"] RE3["errorDialog()"] RE4["activeProcessingState()"] RE5["isChatStreaming()"] RE6["isChatLoading()"] RE7["getChatStreaming()"] RE8["getAllLoadingChats()"] RE9["getAllStreamingChats()"] RE9a["isEditModeActive()"] RE9b["getAddFilesHandler()"] RE9c["setEditModeActive()"] RE9d["clearEditMode()"] end subgraph AgenticExports["agenticStore"] REA1["agenticIsRunning()"] REA2["agenticCurrentTurn()"] REA3["agenticTotalToolCalls()"] REA4["agenticLastError()"] REA5["agenticStreamingToolCall()"] REA6["agenticIsAnyRunning()"] end subgraph ConvExports["conversationsStore"] RE10["conversations()"] RE11["activeConversation()"] RE12["activeMessages()"] RE13["isConversationsInitialized()"] end subgraph ModelsExports["modelsStore"] RE15["modelOptions()"] RE16["routerModels()"] RE17["modelsLoading()"] RE18["modelsUpdating()"] RE19["modelsError()"] RE20["selectedModelId()"] RE21["selectedModelName()"] RE22["selectedModelOption()"] RE23["loadedModelIds()"] RE24["loadingModelIds()"] RE25["propsCacheVersion()"] RE26["singleModelName()"] end subgraph ServerExports["serverStore"] RE27["serverProps()"] RE28["serverLoading()"] RE29["serverError()"] RE30["serverRole()"] RE31["defaultParams()"] RE32["contextSize()"] RE33["isRouterMode()"] RE34["isModelMode()"] end subgraph SettingsExports["settingsStore"] RE35["config()"] RE36["theme()"] RE37["isInitialized()"] end subgraph MCPExports["mcpStore / mcpResourceStore"] RE38["mcpResources()"] RE39["mcpResourceAttachments()"] RE40["mcpHasResourceAttachments()"] RE41["mcpTotalResourceCount()"] RE42["mcpResourcesLoading()"] end end end subgraph Services["⚙️ Services"] direction TB subgraph SV1["ChatService"] SV1Msg["Messaging:
sendMessage()"] SV1Stream["Streaming:
handleStreamResponse()
handleNonStreamResponse()"] SV1Convert["Conversion:
convertDbMessageToApiChatMessageData()
mergeToolCallDeltas()"] SV1Utils["Utilities:
stripReasoningContent()
extractModelName()
parseErrorResponse()"] end subgraph SV2["ModelsService"] SV2List["Listing:
list()
listRouter()"] SV2LoadUnload["Load/Unload:
load()
unload()"] SV2Status["Status:
isModelLoaded()
isModelLoading()"] end subgraph SV3["PropsService"] SV3Fetch["Fetching:
fetch()
fetchForModel()"] end subgraph SV4["DatabaseService"] SV4Conv["Conversations:
createConversation()
getConversation()
getAllConversations()
updateConversation()
deleteConversation()"] SV4Msg["Messages:
createMessageBranch()
createRootMessage()
createSystemMessage()
getConversationMessages()
updateMessage()
deleteMessage()
deleteMessageCascading()"] SV4Node["Navigation:
updateCurrentNode()"] SV4Import["Import:
importConversations()"] end subgraph SV5["ParameterSyncService"] SV5Extract["Extraction:
extractServerDefaults()"] SV5Merge["Merging:
mergeWithServerDefaults()"] SV5Info["Info:
getParameterInfo()
canSyncParameter()
getSyncableParameterKeys()
validateServerParameter()"] SV5Diff["Diff:
createParameterDiff()"] end subgraph SV6["MCPService"] SV6Transport["Transport:
createTransport()
WebSocket / StreamableHTTP / SSE"] SV6Conn["Connection:
connect()
disconnect()"] SV6Tools["Tools:
listTools()
callTool()"] SV6Prompts["Prompts:
listPrompts()
getPrompt()"] SV6Resources["Resources:
listResources()
listResourceTemplates()
readResource()
subscribeResource()
unsubscribeResource()"] SV6Complete["Completions:
complete()"] end end subgraph ExternalMCP["🔌 External MCP Servers"] EXT1["MCP Server 1
(WebSocket/StreamableHTTP/SSE)"] EXT2["MCP Server N"] end subgraph Storage["💾 Storage"] ST1["IndexedDB"] ST2["conversations"] ST3["messages"] ST5["LocalStorage"] ST6["config"] ST7["userOverrides"] ST8["mcpServers"] end subgraph APIs["🌐 llama-server API"] API1["/v1/chat/completions"] API2["/props
/props?model="] API3["/models
/models/load
/models/unload"] API4["/v1/models"] end %% Routes render Components R1 --> C_Screen R2 --> C_Screen RL --> C_Sidebar %% Layout runs MCP health checks on startup RL --> S6 %% Component hierarchy C_Screen --> C_Form & C_Messages & C_Settings C_Messages --> C_Message C_Message --> C_MessageUser C_MessageUser --> C_MessageEditForm C_MessageEditForm --> C_ModelsSelector C_MessageEditForm --> C_Attach C_Form --> C_ModelsSelector C_Form --> C_Attach C_Form --> C_McpServersSelector C_Message --> C_Attach %% MCP Components hierarchy C_Settings --> C_McpSettings C_McpSettings --> C_McpServerCard C_McpServerCard --> C_McpResourceBrowser C_McpResourceBrowser --> C_McpResourcePreview %% Components use Hooks C_Form --> H1 C_Message --> H1 & H2 C_MessageEditForm --> H1 C_Screen --> H2 %% Hooks use Stores H1 --> S3 & S4 H2 --> S1 & S5 %% Components use Stores C_Screen --> S1 & S2 C_Messages --> S2 C_Message --> S1 & S2 & S3 C_Form --> S1 & S3 & S6 C_Sidebar --> S2 C_ModelsSelector --> S3 & S4 C_Settings --> S5 C_McpSettings --> S6 C_McpServerCard --> S6 C_McpResourceBrowser --> S6 & S7 C_McpServersSelector --> S6 %% Stores export Reactive State S1 -. exports .-> ChatExports SA -. exports .-> AgenticExports S2 -. exports .-> ConvExports S3 -. exports .-> ModelsExports S4 -. exports .-> ServerExports S5 -. exports .-> SettingsExports S6 -. exports .-> MCPExports S7 -. exports .-> MCPExports %% chatStore → agenticStore (agentic loop orchestration) S1 --> SA SA --> SV1 SA --> S6 %% Stores use Services S1 --> SV1 & SV4 S2 --> SV4 S3 --> SV2 & SV3 S4 --> SV3 S5 --> SV5 S6 --> SV6 S7 --> SV6 %% Services to Storage SV4 --> ST1 ST1 --> ST2 & ST3 SV5 --> ST5 ST5 --> ST6 & ST7 & ST8 %% Services to APIs SV1 --> API1 SV2 --> API3 & API4 SV3 --> API2 %% MCP → External Servers SV6 --> EXT1 & EXT2 %% Styling classDef routeStyle fill:#e1f5fe,stroke:#01579b,stroke-width:2px classDef componentStyle fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px classDef componentGroupStyle fill:#e1bee7,stroke:#7b1fa2,stroke-width:1px classDef hookStyle fill:#fff8e1,stroke:#ff8f00,stroke-width:2px classDef storeStyle fill:#fff3e0,stroke:#e65100,stroke-width:2px classDef stateStyle fill:#ffe0b2,stroke:#e65100,stroke-width:1px classDef methodStyle fill:#ffecb3,stroke:#e65100,stroke-width:1px classDef reactiveStyle fill:#fffde7,stroke:#f9a825,stroke-width:1px classDef serviceStyle fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px classDef serviceMStyle fill:#c8e6c9,stroke:#2e7d32,stroke-width:1px classDef externalStyle fill:#f3e5f5,stroke:#6a1b9a,stroke-width:2px,stroke-dasharray: 5 5 classDef storageStyle fill:#fce4ec,stroke:#c2185b,stroke-width:2px classDef apiStyle fill:#e3f2fd,stroke:#1565c0,stroke-width:2px class R1,R2,RL routeStyle class C_Sidebar,C_Screen,C_Form,C_Messages,C_Message,C_MessageUser,C_MessageEditForm componentStyle class C_ModelsSelector,C_Settings componentStyle class C_Attach componentStyle class C_McpSettings,C_McpServerCard,C_McpResourceBrowser,C_McpResourcePreview,C_McpServersSelector componentStyle class H1,H2,H3 hookStyle class LayoutComponents,ChatUIComponents,MCPComponents componentGroupStyle class Hooks hookStyle classDef agenticStyle fill:#e8eaf6,stroke:#283593,stroke-width:2px classDef agenticMethodStyle fill:#c5cae9,stroke:#283593,stroke-width:1px class S1,S2,S3,S4,S5,SA,S6,S7 storeStyle class S1State,S2State,S3State,S4State,S5State,SAState,S6State,S7State stateStyle class S1Msg,S1Regen,S1Edit,S1Stream,S1LoadState,S1ProcState,S1Error,S1Utils methodStyle class SASession,SAConfig,SAFlow methodStyle class S2Lifecycle,S2ConvCRUD,S2MsgMgmt,S2Nav,S2McpOverrides,S2Export,S2Utils methodStyle class S3Getters,S3Modal,S3Status,S3Fetch,S3Select,S3LoadUnload,S3Utils methodStyle class S4Getters,S4Data,S4Utils methodStyle class S5Lifecycle,S5Update,S5Reset,S5Sync,S5Utils methodStyle class S6Lifecycle,S6Health,S6Servers,S6Tools,S6Prompts methodStyle class S7Resources,S7Cache,S7Subs,S7Attach methodStyle class ChatExports,AgenticExports,ConvExports,ModelsExports,ServerExports,SettingsExports,MCPExports reactiveStyle class SV1,SV2,SV3,SV4,SV5,SV6 serviceStyle class SV6Transport,SV6Conn,SV6Tools,SV6Prompts,SV6Resources,SV6Complete serviceMStyle class EXT1,EXT2 externalStyle class SV1Msg,SV1Stream,SV1Convert,SV1Utils serviceMStyle class SV2List,SV2LoadUnload,SV2Status serviceMStyle class SV3Fetch serviceMStyle class SV4Conv,SV4Msg,SV4Node,SV4Import serviceMStyle class SV5Extract,SV5Merge,SV5Info,SV5Diff serviceMStyle class ST1,ST2,ST3,ST5,ST6,ST7,ST8 storageStyle class API1,API2,API3,API4 apiStyle ```