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```