1```mermaid
  2sequenceDiagram
  3    participant UI as ๐Ÿงฉ ChatSidebar / ChatScreen
  4    participant convStore as ๐Ÿ—„๏ธ conversationsStore
  5    participant chatStore as ๐Ÿ—„๏ธ chatStore
  6    participant DbSvc as โš™๏ธ DatabaseService
  7    participant IDB as ๐Ÿ’พ IndexedDB
  8
  9    Note over convStore: State:<br/>conversations: DatabaseConversation[]<br/>activeConversation: DatabaseConversation | null<br/>activeMessages: DatabaseMessage[]<br/>isInitialized: boolean<br/>usedModalities: $derived({vision, audio})
 10
 11    %% โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
 12    Note over UI,IDB: ๐Ÿš€ INITIALIZATION
 13    %% โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
 14
 15    Note over convStore: Auto-initialized in constructor (browser only)
 16    convStore->>convStore: initialize()
 17    activate convStore
 18    convStore->>convStore: loadConversations()
 19    convStore->>DbSvc: getAllConversations()
 20    DbSvc->>IDB: SELECT * FROM conversations ORDER BY lastModified DESC
 21    IDB-->>DbSvc: Conversation[]
 22    DbSvc-->>convStore: conversations
 23    convStore->>convStore: conversations = $state(data)
 24    convStore->>convStore: isInitialized = true
 25    deactivate convStore
 26
 27    %% โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
 28    Note over UI,IDB: โž• CREATE CONVERSATION
 29    %% โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
 30
 31    UI->>convStore: createConversation(name?)
 32    activate convStore
 33    convStore->>DbSvc: createConversation(name || "New Chat")
 34    DbSvc->>IDB: INSERT INTO conversations
 35    IDB-->>DbSvc: conversation {id, name, lastModified, currNode: ""}
 36    DbSvc-->>convStore: conversation
 37    convStore->>convStore: conversations.unshift(conversation)
 38    convStore->>convStore: activeConversation = $state(conversation)
 39    convStore->>convStore: activeMessages = $state([])
 40    deactivate convStore
 41
 42    %% โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
 43    Note over UI,IDB: ๐Ÿ“‚ LOAD CONVERSATION
 44    %% โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
 45
 46    UI->>convStore: loadConversation(convId)
 47    activate convStore
 48    convStore->>DbSvc: getConversation(convId)
 49    DbSvc->>IDB: SELECT * FROM conversations WHERE id = ?
 50    IDB-->>DbSvc: conversation
 51    convStore->>convStore: activeConversation = $state(conversation)
 52
 53    convStore->>convStore: refreshActiveMessages()
 54    convStore->>DbSvc: getConversationMessages(convId)
 55    DbSvc->>IDB: SELECT * FROM messages WHERE convId = ?
 56    IDB-->>DbSvc: allMessages[]
 57    convStore->>convStore: filterByLeafNodeId(allMessages, currNode)
 58    Note right of convStore: Filter to show only current branch path
 59    convStore->>convStore: activeMessages = $state(filtered)
 60
 61    convStore->>chatStore: syncLoadingStateForChat(convId)
 62    Note right of chatStore: Sync isLoading/currentResponse if streaming
 63    deactivate convStore
 64
 65    %% โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
 66    Note over UI,IDB: ๐ŸŒณ MESSAGE BRANCHING MODEL
 67    %% โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
 68
 69    Note over IDB: Message Tree Structure:<br/>- Each message has parent (null for root)<br/>- Each message has children[] array<br/>- Conversation.currNode points to active leaf<br/>- filterByLeafNodeId() traverses from root to currNode
 70
 71    rect rgb(240, 240, 255)
 72        Note over convStore: Example Branch Structure:
 73        Note over convStore: root โ†’ user1 โ†’ assistant1 โ†’ user2 โ†’ assistant2a (currNode)<br/>                                    โ†˜ assistant2b (alt branch)
 74    end
 75
 76    %% โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
 77    Note over UI,IDB: โ†”๏ธ BRANCH NAVIGATION
 78    %% โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
 79
 80    UI->>convStore: navigateToSibling(msgId, direction)
 81    activate convStore
 82    convStore->>convStore: Find message in activeMessages
 83    convStore->>convStore: Get parent message
 84    convStore->>convStore: Find sibling in parent.children[]
 85    convStore->>convStore: findLeafNode(siblingId, allMessages)
 86    Note right of convStore: Navigate to leaf of sibling branch
 87    convStore->>convStore: updateCurrentNode(leafId)
 88    convStore->>DbSvc: updateCurrentNode(convId, leafId)
 89    DbSvc->>IDB: UPDATE conversations SET currNode = ?
 90    convStore->>convStore: refreshActiveMessages()
 91    deactivate convStore
 92
 93    %% โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
 94    Note over UI,IDB: ๐Ÿ“ UPDATE CONVERSATION
 95    %% โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
 96
 97    UI->>convStore: updateConversationName(convId, newName)
 98    activate convStore
 99    convStore->>DbSvc: updateConversation(convId, {name: newName})
100    DbSvc->>IDB: UPDATE conversations SET name = ?
101    convStore->>convStore: Update in conversations array
102    deactivate convStore
103
104    Note over convStore: Auto-title update (after first response):
105    convStore->>convStore: updateConversationTitleWithConfirmation()
106    convStore->>convStore: titleUpdateConfirmationCallback?()
107    Note right of convStore: Shows dialog if title would change
108
109    %% โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
110    Note over UI,IDB: ๐Ÿ—‘๏ธ DELETE CONVERSATION
111    %% โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
112
113    UI->>convStore: deleteConversation(convId)
114    activate convStore
115    convStore->>DbSvc: deleteConversation(convId)
116    DbSvc->>IDB: DELETE FROM conversations WHERE id = ?
117    DbSvc->>IDB: DELETE FROM messages WHERE convId = ?
118    convStore->>convStore: conversations.filter(c => c.id !== convId)
119    alt deleted active conversation
120        convStore->>convStore: clearActiveConversation()
121    end
122    deactivate convStore
123
124    %% โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
125    Note over UI,IDB: ๐Ÿ“Š MODALITY TRACKING
126    %% โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
127
128    Note over convStore: usedModalities = $derived.by(() => {<br/>  calculateModalitiesFromMessages(activeMessages)<br/>})
129
130    Note over convStore: Scans activeMessages for attachments:<br/>- IMAGE โ†’ vision: true<br/>- PDF (processedAsImages) โ†’ vision: true<br/>- AUDIO โ†’ audio: true
131
132    UI->>convStore: getModalitiesUpToMessage(msgId)
133    Note right of convStore: Used for regeneration validation<br/>Only checks messages BEFORE target
134
135    %% โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
136    Note over UI,IDB: ๐Ÿ“ค EXPORT / ๐Ÿ“ฅ IMPORT
137    %% โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
138
139    UI->>convStore: exportAllConversations()
140    activate convStore
141    convStore->>DbSvc: getAllConversations()
142    loop each conversation
143        convStore->>DbSvc: getConversationMessages(convId)
144    end
145    convStore->>convStore: triggerDownload(JSON blob)
146    deactivate convStore
147
148    UI->>convStore: importConversations(file)
149    activate convStore
150    convStore->>convStore: Parse JSON file
151    convStore->>DbSvc: importConversations(parsed)
152    DbSvc->>IDB: Bulk INSERT conversations + messages
153    convStore->>convStore: loadConversations()
154    deactivate convStore
155```