1```mermaid
2sequenceDiagram
3 participant Store as ๐๏ธ Stores
4 participant DbSvc as โ๏ธ DatabaseService
5 participant Dexie as ๐ฆ Dexie ORM
6 participant IDB as ๐พ IndexedDB
7
8 Note over DbSvc: Stateless service - all methods static<br/>Database: "LlamacppWebui"
9
10 %% โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
11 Note over Store,IDB: ๐ SCHEMA
12 %% โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
13
14 rect rgb(240, 248, 255)
15 Note over IDB: conversations table:<br/>id (PK), lastModified, currNode, name
16 end
17
18 rect rgb(255, 248, 240)
19 Note over IDB: messages table:<br/>id (PK), convId (FK), type, role, timestamp,<br/>parent, children[], content, thinking,<br/>toolCalls, extra[], model, timings
20 end
21
22 %% โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
23 Note over Store,IDB: ๐ฌ CONVERSATIONS CRUD
24 %% โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
25
26 Store->>DbSvc: createConversation(name)
27 activate DbSvc
28 DbSvc->>DbSvc: Generate UUID
29 DbSvc->>Dexie: db.conversations.add({id, name, lastModified, currNode: ""})
30 Dexie->>IDB: INSERT
31 IDB-->>Dexie: success
32 DbSvc-->>Store: DatabaseConversation
33 deactivate DbSvc
34
35 Store->>DbSvc: getConversation(convId)
36 DbSvc->>Dexie: db.conversations.get(convId)
37 Dexie->>IDB: SELECT WHERE id = ?
38 IDB-->>DbSvc: DatabaseConversation
39
40 Store->>DbSvc: getAllConversations()
41 DbSvc->>Dexie: db.conversations.orderBy('lastModified').reverse().toArray()
42 Dexie->>IDB: SELECT ORDER BY lastModified DESC
43 IDB-->>DbSvc: DatabaseConversation[]
44
45 Store->>DbSvc: updateConversation(convId, updates)
46 DbSvc->>Dexie: db.conversations.update(convId, {...updates, lastModified})
47 Dexie->>IDB: UPDATE
48
49 Store->>DbSvc: deleteConversation(convId)
50 activate DbSvc
51 DbSvc->>Dexie: db.conversations.delete(convId)
52 Dexie->>IDB: DELETE FROM conversations
53 DbSvc->>Dexie: db.messages.where('convId').equals(convId).delete()
54 Dexie->>IDB: DELETE FROM messages WHERE convId = ?
55 deactivate DbSvc
56
57 %% โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
58 Note over Store,IDB: ๐ MESSAGES CRUD
59 %% โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
60
61 Store->>DbSvc: createRootMessage(convId)
62 activate DbSvc
63 DbSvc->>DbSvc: Create root message {type: "root", parent: null}
64 DbSvc->>Dexie: db.messages.add(rootMsg)
65 Dexie->>IDB: INSERT
66 DbSvc-->>Store: rootMessageId
67 deactivate DbSvc
68
69 Store->>DbSvc: createMessageBranch(message, parentId)
70 activate DbSvc
71 DbSvc->>DbSvc: Generate UUID for new message
72 DbSvc->>Dexie: db.messages.add({...message, id, parent: parentId})
73 Dexie->>IDB: INSERT message
74
75 alt parentId exists
76 DbSvc->>Dexie: db.messages.get(parentId)
77 Dexie->>IDB: SELECT parent
78 DbSvc->>DbSvc: parent.children.push(newId)
79 DbSvc->>Dexie: db.messages.update(parentId, {children})
80 Dexie->>IDB: UPDATE parent.children
81 end
82
83 DbSvc->>Dexie: db.conversations.update(convId, {currNode: newId})
84 Dexie->>IDB: UPDATE conversation.currNode
85 DbSvc-->>Store: DatabaseMessage
86 deactivate DbSvc
87
88 Store->>DbSvc: getConversationMessages(convId)
89 DbSvc->>Dexie: db.messages.where('convId').equals(convId).toArray()
90 Dexie->>IDB: SELECT WHERE convId = ?
91 IDB-->>DbSvc: DatabaseMessage[]
92
93 Store->>DbSvc: updateMessage(msgId, updates)
94 DbSvc->>Dexie: db.messages.update(msgId, updates)
95 Dexie->>IDB: UPDATE
96
97 Store->>DbSvc: deleteMessage(msgId)
98 DbSvc->>Dexie: db.messages.delete(msgId)
99 Dexie->>IDB: DELETE
100
101 %% โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
102 Note over Store,IDB: ๐ณ BRANCHING OPERATIONS
103 %% โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
104
105 Store->>DbSvc: updateCurrentNode(convId, nodeId)
106 DbSvc->>Dexie: db.conversations.update(convId, {currNode: nodeId, lastModified})
107 Dexie->>IDB: UPDATE
108
109 Store->>DbSvc: deleteMessageCascading(msgId)
110 activate DbSvc
111 DbSvc->>DbSvc: findDescendantMessages(msgId, allMessages)
112 Note right of DbSvc: Recursively find all children
113 loop each descendant
114 DbSvc->>Dexie: db.messages.delete(descendantId)
115 Dexie->>IDB: DELETE
116 end
117 DbSvc->>Dexie: db.messages.delete(msgId)
118 Dexie->>IDB: DELETE target message
119 deactivate DbSvc
120
121 %% โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
122 Note over Store,IDB: ๐ฅ IMPORT
123 %% โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
124
125 Store->>DbSvc: importConversations(data)
126 activate DbSvc
127 loop each conversation in data
128 DbSvc->>DbSvc: Generate new UUIDs (avoid conflicts)
129 DbSvc->>Dexie: db.conversations.add(conversation)
130 Dexie->>IDB: INSERT conversation
131 loop each message
132 DbSvc->>Dexie: db.messages.add(message)
133 Dexie->>IDB: INSERT message
134 end
135 end
136 deactivate DbSvc
137
138 %% โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
139 Note over Store,IDB: ๐ MESSAGE TREE UTILITIES
140 %% โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
141
142 Note over DbSvc: Used by stores (imported from utils):
143
144 rect rgb(240, 255, 240)
145 Note over DbSvc: filterByLeafNodeId(messages, leafId)<br/>โ Returns path from root to leaf<br/>โ Used to display current branch
146 end
147
148 rect rgb(240, 255, 240)
149 Note over DbSvc: findLeafNode(startId, messages)<br/>โ Traverse to deepest child<br/>โ Used for branch navigation
150 end
151
152 rect rgb(240, 255, 240)
153 Note over DbSvc: findDescendantMessages(msgId, messages)<br/>โ Find all children recursively<br/>โ Used for cascading deletes
154 end
155```