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