@lobehub/lobehub 2.0.0-next.13 → 2.0.0-next.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/changelog/v1.json +9 -0
  3. package/package.json +1 -1
  4. package/packages/const/src/version.ts +3 -3
  5. package/packages/database/src/repositories/dataImporter/deprecated/__tests__/index.test.ts +2 -1
  6. package/packages/database/src/repositories/dataImporter/deprecated/index.ts +7 -1
  7. package/src/app/[variants]/(main)/(mobile)/me/(home)/__tests__/useCategory.test.tsx +9 -0
  8. package/src/app/[variants]/(main)/(mobile)/me/(home)/layout.tsx +0 -2
  9. package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/Actions.tsx +3 -28
  10. package/src/app/[variants]/(main)/chat/_layout/Desktop/index.tsx +0 -2
  11. package/src/app/[variants]/(main)/chat/_layout/Mobile.tsx +1 -5
  12. package/src/app/[variants]/(main)/chat/settings/features/HeaderContent.tsx +2 -62
  13. package/src/app/[variants]/(main)/image/page.tsx +0 -2
  14. package/src/app/[variants]/(main)/profile/_layout/Desktop/index.tsx +23 -24
  15. package/src/app/[variants]/(main)/profile/_layout/Mobile/index.tsx +5 -9
  16. package/src/app/[variants]/(main)/settings/_layout/Desktop/index.tsx +0 -2
  17. package/src/app/[variants]/(main)/settings/_layout/Mobile/index.tsx +0 -2
  18. package/src/app/[variants]/(main)/settings/provider/(list)/ProviderGrid/Card.tsx +1 -1
  19. package/src/app/[variants]/loading/index.tsx +1 -10
  20. package/src/components/Link.tsx +12 -0
  21. package/src/envs/app.ts +5 -8
  22. package/src/features/DataImporter/index.tsx +15 -60
  23. package/src/features/DevPanel/PostgresViewer/usePgTable.ts +3 -2
  24. package/src/hooks/useInterceptingRoutes.test.ts +21 -3
  25. package/src/libs/trpc/client/index.ts +0 -1
  26. package/src/libs/trpc/client/lambda.ts +8 -5
  27. package/src/server/routers/desktop/mcp.ts +1 -3
  28. package/src/server/routers/lambda/config/index.test.ts +2 -2
  29. package/src/server/routers/tools/mcp.ts +2 -3
  30. package/src/server/routers/tools/search.test.ts +1 -7
  31. package/src/server/routers/tools/search.ts +1 -4
  32. package/src/services/__tests__/tool.test.ts +0 -3
  33. package/src/services/aiModel/index.test.ts +0 -3
  34. package/src/services/aiModel/index.ts +1 -7
  35. package/src/services/aiProvider/index.test.ts +0 -3
  36. package/src/services/aiProvider/index.ts +1 -7
  37. package/src/services/chatGroup/index.ts +1 -10
  38. package/src/services/config.ts +1 -65
  39. package/src/services/export/index.ts +1 -4
  40. package/src/services/file/index.ts +1 -11
  41. package/src/services/import/index.ts +1 -7
  42. package/src/services/message/index.ts +1 -11
  43. package/src/services/plugin/index.ts +1 -11
  44. package/src/services/session/index.ts +1 -11
  45. package/src/services/tableViewer/client.ts +12 -15
  46. package/src/services/thread/index.ts +1 -7
  47. package/src/services/topic/index.ts +1 -11
  48. package/src/services/user/index.ts +1 -13
  49. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChat.test.ts +0 -241
  50. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChatV2.test.ts +26 -1
  51. package/src/store/chat/slices/aiChat/actions/__tests__/helpers.ts +3 -1
  52. package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +1 -138
  53. package/src/store/user/slices/common/action.test.ts +1 -4
  54. package/src/app/(backend)/trpc/edge/[trpc]/route.ts +0 -26
  55. package/src/app/[variants]/(main)/(mobile)/me/data/features/Category.tsx +0 -48
  56. package/src/app/[variants]/(main)/(mobile)/me/data/features/Header.tsx +0 -33
  57. package/src/app/[variants]/(main)/(mobile)/me/data/layout.tsx +0 -13
  58. package/src/app/[variants]/(main)/(mobile)/me/data/loading.tsx +0 -5
  59. package/src/app/[variants]/(main)/(mobile)/me/data/page.tsx +0 -29
  60. package/src/app/[variants]/(main)/chat/features/Migration/DBReader.ts +0 -290
  61. package/src/app/[variants]/(main)/chat/features/Migration/ExportConfigButton.tsx +0 -35
  62. package/src/app/[variants]/(main)/chat/features/Migration/Failed.tsx +0 -120
  63. package/src/app/[variants]/(main)/chat/features/Migration/Modal.tsx +0 -81
  64. package/src/app/[variants]/(main)/chat/features/Migration/Start.tsx +0 -108
  65. package/src/app/[variants]/(main)/chat/features/Migration/UpgradeButton.tsx +0 -71
  66. package/src/app/[variants]/(main)/chat/features/Migration/const.ts +0 -15
  67. package/src/app/[variants]/(main)/chat/features/Migration/index.tsx +0 -50
  68. package/src/app/[variants]/loading/Client/Content.tsx +0 -48
  69. package/src/app/[variants]/loading/Client/Error.tsx +0 -27
  70. package/src/app/[variants]/loading/Client/Redirect.tsx +0 -47
  71. package/src/app/[variants]/loading/Client/index.tsx +0 -22
  72. package/src/components/InnerLink.tsx +0 -20
  73. package/src/database/_deprecated/core/__tests__/db-upgrade.test.ts +0 -42
  74. package/src/database/_deprecated/core/__tests__/db.test.ts +0 -79
  75. package/src/database/_deprecated/core/__tests__/model.test.ts +0 -55
  76. package/src/database/_deprecated/core/db.ts +0 -246
  77. package/src/database/_deprecated/core/index.ts +0 -2
  78. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/input.json +0 -55
  79. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/output.json +0 -60
  80. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.test.ts +0 -14
  81. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.ts +0 -22
  82. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/type.ts +0 -105
  83. package/src/database/_deprecated/core/model.ts +0 -218
  84. package/src/database/_deprecated/core/schemas.ts +0 -88
  85. package/src/database/_deprecated/core/types/db.ts +0 -15
  86. package/src/database/_deprecated/models/__DEBUG.ts +0 -124
  87. package/src/database/_deprecated/models/__tests__/file.test.ts +0 -83
  88. package/src/database/_deprecated/models/__tests__/message.test.ts +0 -426
  89. package/src/database/_deprecated/models/__tests__/plugin.test.ts +0 -81
  90. package/src/database/_deprecated/models/__tests__/session.test.ts +0 -253
  91. package/src/database/_deprecated/models/__tests__/sessionGroup.test.ts +0 -220
  92. package/src/database/_deprecated/models/__tests__/topic.test.ts +0 -523
  93. package/src/database/_deprecated/models/__tests__/user.test.ts +0 -82
  94. package/src/database/_deprecated/models/file.ts +0 -51
  95. package/src/database/_deprecated/models/message.ts +0 -277
  96. package/src/database/_deprecated/models/plugin.ts +0 -62
  97. package/src/database/_deprecated/models/session.ts +0 -271
  98. package/src/database/_deprecated/models/sessionGroup.ts +0 -93
  99. package/src/database/_deprecated/models/topic.ts +0 -250
  100. package/src/database/_deprecated/models/user.ts +0 -69
  101. package/src/database/_deprecated/schemas/files.ts +0 -39
  102. package/src/database/_deprecated/schemas/message.ts +0 -50
  103. package/src/database/_deprecated/schemas/plugin.ts +0 -12
  104. package/src/database/_deprecated/schemas/session.ts +0 -54
  105. package/src/database/_deprecated/schemas/sessionGroup.ts +0 -8
  106. package/src/database/_deprecated/schemas/topic.ts +0 -12
  107. package/src/database/_deprecated/schemas/user.ts +0 -40
  108. package/src/features/DataImporter/_deprecated.ts +0 -43
  109. package/src/features/InitClientDB/EnableModal.tsx +0 -118
  110. package/src/features/InitClientDB/ErrorResult.tsx +0 -143
  111. package/src/features/InitClientDB/InitIndicator.tsx +0 -124
  112. package/src/features/InitClientDB/PGliteIcon.tsx +0 -28
  113. package/src/features/InitClientDB/features/DatabaseRepair/Backup.tsx +0 -75
  114. package/src/features/InitClientDB/features/DatabaseRepair/Diagnosis.tsx +0 -98
  115. package/src/features/InitClientDB/features/DatabaseRepair/Repair.tsx +0 -218
  116. package/src/features/InitClientDB/features/DatabaseRepair/index.tsx +0 -91
  117. package/src/features/InitClientDB/index.tsx +0 -37
  118. package/src/libs/trpc/client/edge.ts +0 -26
  119. package/src/libs/trpc/edge/context.ts +0 -71
  120. package/src/libs/trpc/edge/index.ts +0 -45
  121. package/src/libs/trpc/edge/init.ts +0 -26
  122. package/src/libs/trpc/edge/middleware/jwtPayload.test.ts +0 -75
  123. package/src/libs/trpc/edge/middleware/jwtPayload.ts +0 -14
  124. package/src/migrations/FromV0ToV1.ts +0 -10
  125. package/src/migrations/FromV1ToV2/fixtures/input-v1-session.json +0 -191
  126. package/src/migrations/FromV1ToV2/fixtures/output-v2.json +0 -202
  127. package/src/migrations/FromV1ToV2/index.ts +0 -82
  128. package/src/migrations/FromV1ToV2/migrations.test.ts +0 -224
  129. package/src/migrations/FromV1ToV2/types/v1.ts +0 -78
  130. package/src/migrations/FromV1ToV2/types/v2.ts +0 -52
  131. package/src/migrations/FromV2ToV3/fixtures/input-v2-session.json +0 -72
  132. package/src/migrations/FromV2ToV3/fixtures/output-v3-from-v1.json +0 -203
  133. package/src/migrations/FromV2ToV3/fixtures/output-v3.json +0 -74
  134. package/src/migrations/FromV2ToV3/index.ts +0 -30
  135. package/src/migrations/FromV2ToV3/migrations.test.ts +0 -42
  136. package/src/migrations/FromV2ToV3/types/v3.ts +0 -27
  137. package/src/migrations/FromV3ToV4/fixtures/azure-input-v3.json +0 -79
  138. package/src/migrations/FromV3ToV4/fixtures/azure-output-v4.json +0 -75
  139. package/src/migrations/FromV3ToV4/fixtures/ollama-input-v3.json +0 -85
  140. package/src/migrations/FromV3ToV4/fixtures/ollama-output-v4.json +0 -86
  141. package/src/migrations/FromV3ToV4/fixtures/openai-input-v3.json +0 -77
  142. package/src/migrations/FromV3ToV4/fixtures/openai-output-v4.json +0 -77
  143. package/src/migrations/FromV3ToV4/fixtures/openrouter-input-v3.json +0 -82
  144. package/src/migrations/FromV3ToV4/fixtures/openrouter-output-v4.json +0 -85
  145. package/src/migrations/FromV3ToV4/fixtures/output-v4-from-v1.json +0 -203
  146. package/src/migrations/FromV3ToV4/index.ts +0 -102
  147. package/src/migrations/FromV3ToV4/migrations.test.ts +0 -195
  148. package/src/migrations/FromV3ToV4/types/v3.ts +0 -52
  149. package/src/migrations/FromV3ToV4/types/v4.ts +0 -37
  150. package/src/migrations/FromV4ToV5/fixtures/from-v1-to-v5-output.json +0 -245
  151. package/src/migrations/FromV4ToV5/fixtures/function-input-v4.json +0 -96
  152. package/src/migrations/FromV4ToV5/fixtures/function-output-v5.json +0 -120
  153. package/src/migrations/FromV4ToV5/index.ts +0 -58
  154. package/src/migrations/FromV4ToV5/migrations.test.ts +0 -49
  155. package/src/migrations/FromV4ToV5/types/v4.ts +0 -21
  156. package/src/migrations/FromV4ToV5/types/v5.ts +0 -27
  157. package/src/migrations/FromV5ToV6/fixtures/from-v1-to-v6-output.json +0 -247
  158. package/src/migrations/FromV5ToV6/fixtures/session-input-v5.json +0 -81
  159. package/src/migrations/FromV5ToV6/fixtures/session-output-v6.json +0 -85
  160. package/src/migrations/FromV5ToV6/index.ts +0 -61
  161. package/src/migrations/FromV5ToV6/migrations.test.ts +0 -50
  162. package/src/migrations/FromV5ToV6/types/v5.ts +0 -48
  163. package/src/migrations/FromV5ToV6/types/v6.ts +0 -63
  164. package/src/migrations/FromV6ToV7/fixtures/output-v7-from-v1.json +0 -203
  165. package/src/migrations/FromV6ToV7/fixtures/provider-input-v6.json +0 -103
  166. package/src/migrations/FromV6ToV7/fixtures/provider-output-v7.json +0 -118
  167. package/src/migrations/FromV6ToV7/index.ts +0 -101
  168. package/src/migrations/FromV6ToV7/migrations.test.ts +0 -64
  169. package/src/migrations/FromV6ToV7/types/v6.ts +0 -61
  170. package/src/migrations/FromV6ToV7/types/v7.ts +0 -69
  171. package/src/migrations/VersionController.test.ts +0 -88
  172. package/src/migrations/VersionController.ts +0 -67
  173. package/src/migrations/index.ts +0 -61
  174. package/src/server/routers/edge/appStatus.ts +0 -3
  175. package/src/server/routers/edge/index.ts +0 -14
  176. package/src/server/routers/edge/upload.ts +0 -16
  177. package/src/services/aiModel/client.ts +0 -70
  178. package/src/services/aiProvider/client.ts +0 -58
  179. package/src/services/baseClientService/index.ts +0 -9
  180. package/src/services/chatGroup/client.ts +0 -63
  181. package/src/services/export/_deprecated.ts +0 -155
  182. package/src/services/export/client.ts +0 -15
  183. package/src/services/file/_deprecated.test.ts +0 -119
  184. package/src/services/file/_deprecated.ts +0 -80
  185. package/src/services/file/client.test.ts +0 -199
  186. package/src/services/file/client.ts +0 -85
  187. package/src/services/import/_deprecated.ts +0 -115
  188. package/src/services/import/client.test.ts +0 -1015
  189. package/src/services/import/client.ts +0 -64
  190. package/src/services/message/_deprecated.test.ts +0 -398
  191. package/src/services/message/_deprecated.ts +0 -168
  192. package/src/services/message/client.test.ts +0 -410
  193. package/src/services/message/client.ts +0 -192
  194. package/src/services/plugin/_deprecated.test.ts +0 -162
  195. package/src/services/plugin/_deprecated.ts +0 -42
  196. package/src/services/plugin/client.test.ts +0 -177
  197. package/src/services/plugin/client.ts +0 -46
  198. package/src/services/session/_deprecated.test.ts +0 -440
  199. package/src/services/session/_deprecated.ts +0 -190
  200. package/src/services/session/client.test.ts +0 -413
  201. package/src/services/session/client.ts +0 -193
  202. package/src/services/thread/client.ts +0 -51
  203. package/src/services/topic/_deprecated.test.ts +0 -245
  204. package/src/services/topic/_deprecated.ts +0 -75
  205. package/src/services/topic/client.ts +0 -89
  206. package/src/services/topic/pglite.test.ts +0 -212
  207. package/src/services/user/_deprecated.test.ts +0 -101
  208. package/src/services/user/_deprecated.ts +0 -70
  209. package/src/services/user/client.test.ts +0 -111
  210. package/src/services/user/client.ts +0 -104
@@ -1,250 +0,0 @@
1
- import { BaseModel } from '@/database/_deprecated/core';
2
- import { DBModel } from '@/database/_deprecated/core/types/db';
3
- import { MessageModel } from '@/database/_deprecated/models/message';
4
- import { DB_Topic, DB_TopicSchema } from '@/database/_deprecated/schemas/topic';
5
- import { ChatTopic } from '@/types/topic';
6
- import { nanoid } from '@/utils/uuid';
7
-
8
- export interface CreateTopicParams {
9
- favorite?: boolean;
10
- messages?: string[];
11
- sessionId: string;
12
- title: string;
13
- }
14
-
15
- export interface QueryTopicParams {
16
- containerId?: string | null; // sessionId or groupId
17
- current?: number;
18
- pageSize?: number;
19
- }
20
-
21
- class _TopicModel extends BaseModel {
22
- constructor() {
23
- super('topics', DB_TopicSchema);
24
- }
25
-
26
- // **************** Query *************** //
27
-
28
- async query({
29
- pageSize = 9999,
30
- current = 0,
31
- containerId,
32
- }: QueryTopicParams): Promise<ChatTopic[]> {
33
- const offset = current * pageSize;
34
-
35
- // get all topics
36
- const allTopics = containerId
37
- ? await this.table.where('sessionId').equals(containerId).toArray()
38
- : await this.table.toArray();
39
-
40
- // 将所有主题按星标消息优先,时间倒序进行排序
41
- const sortedTopics = allTopics.sort((a, b) => {
42
- if (a.favorite && !b.favorite) return -1; // a是星标,b不是,a排前面
43
- if (!a.favorite && b.favorite) return 1; // b是星标,a不是,b排前面
44
-
45
- // 如果星标状态相同,则按时间倒序排序
46
- return b.createdAt - a.createdAt;
47
- });
48
-
49
- // handle pageSize
50
- const pagedTopics = sortedTopics.slice(offset, offset + pageSize);
51
-
52
- return pagedTopics.map((i) => this.mapToChatTopic(i));
53
- }
54
-
55
- queryAll() {
56
- return this.table.orderBy('updatedAt').toArray();
57
- }
58
-
59
- /**
60
- * Query topics by keyword in title, message content, or translated content
61
- * @param keyword The keyword to search for
62
- * @param sessionId The currently activated session id.
63
- */
64
- async queryByKeyword(keyword: string, sessionId?: string): Promise<ChatTopic[]> {
65
- if (!keyword) return [];
66
-
67
- console.time('queryTopicsByKeyword');
68
- const keywordLowerCase = keyword.toLowerCase();
69
-
70
- // Find topics with matching title
71
- const queryTable = sessionId ? this.table.where('sessionId').equals(sessionId) : this.table;
72
- const matchingTopicsPromise = queryTable
73
- .filter((topic) => topic.title.toLowerCase().includes(keywordLowerCase))
74
- .toArray();
75
-
76
- // Find messages with matching content or translate.content
77
- const queryMessages = sessionId
78
- ? this.db.messages.where('sessionId').equals(sessionId)
79
- : this.db.messages;
80
- const matchingMessagesPromise = queryMessages
81
- .filter((message) => {
82
- // check content
83
- if (message.content.toLowerCase().includes(keywordLowerCase)) return true;
84
-
85
- // check translate content
86
- if (message.translate && message.translate.content) {
87
- return message.translate.content.toLowerCase().includes(keywordLowerCase);
88
- }
89
-
90
- return false;
91
- })
92
- .toArray();
93
-
94
- // Resolve both promises
95
- const [matchingTopics, matchingMessages] = await Promise.all([
96
- matchingTopicsPromise,
97
- matchingMessagesPromise,
98
- ]);
99
-
100
- // Extract topic IDs from messages
101
- const topicIdsFromMessages = matchingMessages.map((message) => message.topicId);
102
-
103
- // Combine topic IDs from both sources
104
- const combinedTopicIds = new Set([
105
- ...topicIdsFromMessages,
106
- ...matchingTopics.map((topic) => topic.id),
107
- ]);
108
-
109
- // Retrieve unique topics by IDs
110
- const uniqueTopics = await this.table
111
- .where('id')
112
- .anyOf([...combinedTopicIds])
113
- .toArray();
114
-
115
- console.timeEnd('queryTopicsByKeyword');
116
- return uniqueTopics.map((i) => ({ ...i, favorite: !!i.favorite }));
117
- }
118
-
119
- async findBySessionId(sessionId: string) {
120
- return this.table.where({ sessionId }).toArray();
121
- }
122
-
123
- async findById(id: string): Promise<DBModel<DB_Topic>> {
124
- return this.table.get(id);
125
- }
126
-
127
- async count() {
128
- return this.table.count();
129
- }
130
-
131
- // **************** Create *************** //
132
-
133
- async create({ title, favorite, sessionId, messages }: CreateTopicParams, id = nanoid()) {
134
- const topic = await this._addWithSync(
135
- { favorite: favorite ? 1 : 0, sessionId, title: title },
136
- id,
137
- );
138
-
139
- // add topicId to these messages
140
- if (messages) {
141
- await MessageModel.batchUpdate(messages, { topicId: topic.id });
142
- }
143
-
144
- return topic;
145
- }
146
-
147
- async batchCreate(topics: CreateTopicParams[]) {
148
- return this._batchAdd(topics.map((t) => ({ ...t, favorite: t.favorite ? 1 : 0 })));
149
- }
150
-
151
- async duplicateTopic(topicId: string, newTitle?: string) {
152
- return this.db.transaction('rw', [this.db.topics, this.db.messages], async () => {
153
- // Step 1: get DB_Topic
154
- const topic = await this.findById(topicId);
155
-
156
- if (!topic) {
157
- throw new Error(`Topic with id ${topicId} not found`);
158
- }
159
-
160
- // Step 3: 查询与 `topic` 关联的 `messages`
161
- const originalMessages = await MessageModel.queryByTopicId(topicId);
162
-
163
- const duplicateMessages = await MessageModel.duplicateMessages(originalMessages);
164
-
165
- const { id } = await this.create({
166
- ...this.mapToChatTopic(topic),
167
- messages: duplicateMessages.map((m) => m.id),
168
- sessionId: topic.sessionId!,
169
- title: newTitle || topic.title,
170
- });
171
-
172
- return id;
173
- });
174
- }
175
-
176
- // **************** Delete *************** //
177
-
178
- /**
179
- * Deletes a topic and all messages associated with it.
180
- */
181
- async delete(id: string) {
182
- return this.db.transaction('rw', [this.table, this.db.messages], async () => {
183
- // Delete all messages associated with the topic
184
- await MessageModel.batchDeleteByTopicId(id);
185
-
186
- await this._deleteWithSync(id);
187
- });
188
- }
189
-
190
- /**
191
- * Deletes multiple topic based on the sessionId.
192
- *
193
- * @param {string} sessionId - The identifier of the assistant associated with the messages.
194
- * @returns {Promise<void>}
195
- */
196
- async batchDeleteBySessionId(sessionId: string): Promise<void> {
197
- // use sessionId as the filter criteria in the query.
198
- const query = this.table.where('sessionId').equals(sessionId);
199
-
200
- // Retrieve a collection of message IDs that satisfy the criteria
201
- const topicIds = await query.primaryKeys();
202
-
203
- // Use the bulkDelete method to delete all selected messages in bulk
204
- return this._bulkDeleteWithSync(topicIds);
205
- }
206
- /**
207
- * Deletes multiple topics and all messages associated with them in a transaction.
208
- */
209
- async batchDelete(topicIds: string[]) {
210
- return this.db.transaction('rw', [this.table, this.db.messages], async () => {
211
- // Iterate over each topicId and delete related messages, then delete the topic itself
212
- for (const topicId of topicIds) {
213
- // Delete all messages associated with the topic
214
- await this.delete(topicId);
215
- }
216
- });
217
- }
218
-
219
- async clearTable() {
220
- return this._clearWithSync();
221
- }
222
-
223
- // **************** Update *************** //
224
- async update(id: string, data: Partial<DB_Topic>) {
225
- return super._updateWithSync(id, data);
226
- }
227
-
228
- async toggleFavorite(id: string, newState?: boolean) {
229
- const topic = await this.findById(id);
230
- if (!topic) {
231
- throw new Error(`Topic with id ${id} not found`);
232
- }
233
-
234
- // Toggle the 'favorite' status
235
- const nextState = typeof newState !== 'undefined' ? newState : !topic.favorite;
236
-
237
- await this.update(id, { favorite: nextState ? 1 : 0 });
238
-
239
- return nextState;
240
- }
241
-
242
- // **************** Helper *************** //
243
-
244
- private mapToChatTopic = (dbTopic: DBModel<DB_Topic>): ChatTopic => ({
245
- ...dbTopic,
246
- favorite: !!dbTopic.favorite,
247
- });
248
- }
249
-
250
- export const TopicModel = new _TopicModel();
@@ -1,69 +0,0 @@
1
- import type { PartialDeep } from 'type-fest';
2
-
3
- import { BaseModel } from '@/database/_deprecated/core';
4
- import { LobeAgentConfig } from '@/types/agent';
5
- import { uuid } from '@/utils/uuid';
6
-
7
- import { DB_Settings, DB_User, DB_UserSchema } from '../schemas/user';
8
-
9
- class _UserModel extends BaseModel {
10
- constructor() {
11
- super('users', DB_UserSchema);
12
- }
13
- // **************** Query *************** //
14
-
15
- getUser = async (): Promise<DB_User & { id: number }> => {
16
- const noUser = !(await this.table.count());
17
-
18
- if (noUser) await this.table.put({ uuid: uuid() });
19
-
20
- const list = (await this.table.toArray()) as (DB_User & { id: number })[];
21
-
22
- return list[0];
23
- };
24
-
25
- getAgentConfig = async () => {
26
- const user = await this.getUser();
27
-
28
- return user.settings?.defaultAgent?.config as LobeAgentConfig;
29
- };
30
- // **************** Create *************** //
31
-
32
- create = async (user: DB_User) => {
33
- return this.table.put(user);
34
- };
35
-
36
- // **************** Delete *************** //
37
-
38
- clear() {
39
- return this.table.clear();
40
- }
41
-
42
- // **************** Update *************** //
43
-
44
- async updateSettings(settings: PartialDeep<DB_Settings>) {
45
- const user = await this.getUser();
46
-
47
- return this.update(user.id, { settings: settings as any });
48
- }
49
-
50
- async resetSettings() {
51
- const user = await this.getUser();
52
-
53
- return this.update(user.id, { avatar: undefined, settings: undefined });
54
- }
55
-
56
- async updateAvatar(avatar: string) {
57
- const user = await this.getUser();
58
-
59
- return this.update(user.id, { avatar });
60
- }
61
-
62
- // **************** Helper *************** //
63
-
64
- private update = async (id: number, value: PartialDeep<DB_User>) => {
65
- return this.table.update(id, value);
66
- };
67
- }
68
-
69
- export const UserModel = new _UserModel();
@@ -1,39 +0,0 @@
1
- import { z } from 'zod';
2
-
3
- export const DB_FileSchema = z.object({
4
- /**
5
- * create Time
6
- */
7
- createdAt: z.number().optional(),
8
- /**
9
- * file data array buffer
10
- */
11
- data: z.instanceof(ArrayBuffer).optional(),
12
- /**
13
- * file type
14
- * @example 'image/png'
15
- */
16
- fileType: z.string(),
17
- metadata: z.any().optional(),
18
- /**
19
- * file name
20
- * @example 'test.png'
21
- */
22
- name: z.string(),
23
- /**
24
- * the mode database save the file
25
- * local mean save the raw file into data
26
- * url mean upload the file to a cdn and then save the url
27
- */
28
- saveMode: z.enum(['local', 'url']),
29
- /**
30
- * file size
31
- */
32
- size: z.number(),
33
- /**
34
- * file url if saveMode is url
35
- */
36
- url: z.string().optional(),
37
- });
38
-
39
- export type DB_File = z.infer<typeof DB_FileSchema>;
@@ -1,50 +0,0 @@
1
- /* eslint-disable sort-keys-fix/sort-keys-fix */
2
- import { z } from 'zod';
3
-
4
- const TranslateSchema = z.object({
5
- from: z.string().optional(),
6
- to: z.string(),
7
- content: z.string().optional(),
8
- });
9
-
10
- const PluginSchema = z.object({
11
- identifier: z.string(),
12
- arguments: z.string(),
13
- apiName: z.string(),
14
- type: z.enum(['default', 'markdown', 'standalone', 'builtin', 'mcp']).default('default'),
15
- });
16
-
17
- const ToolCallSchema = PluginSchema.extend({
18
- id: z.string(),
19
- });
20
-
21
- export const DB_MessageSchema = z.object({
22
- role: z.enum(['user', 'system', 'assistant', 'tool']),
23
- content: z.string(),
24
- files: z.array(z.string()).optional(),
25
- favorite: z.number().int().min(0).max(1).optional(),
26
- error: z.any().optional(),
27
-
28
- tools: z.array(ToolCallSchema).optional(),
29
- tool_call_id: z.string().optional(),
30
-
31
- plugin: PluginSchema.optional(),
32
- pluginState: z.any().optional(),
33
- pluginError: z.any().optional(),
34
-
35
- fromModel: z.string().optional(),
36
- fromProvider: z.string().optional(),
37
- translate: TranslateSchema.optional().or(z.literal(false)).or(z.null()),
38
- tts: z.any().optional(),
39
-
40
- traceId: z.string().optional(),
41
- observationId: z.string().optional(),
42
-
43
- // foreign keys
44
- parentId: z.string().optional(),
45
- quotaId: z.string().optional(),
46
- sessionId: z.string(),
47
- topicId: z.string().nullable().optional(),
48
- });
49
-
50
- export type DB_Message = z.infer<typeof DB_MessageSchema>;
@@ -1,12 +0,0 @@
1
- /* eslint-disable sort-keys-fix/sort-keys-fix */
2
- import { z } from 'zod';
3
-
4
- export const DB_PluginSchema = z.object({
5
- identifier: z.string(),
6
- id: z.string(),
7
- type: z.enum(['plugin', 'customPlugin']),
8
- manifest: z.any().optional(),
9
- settings: z.any().optional(),
10
- });
11
-
12
- export type DB_Plugin = z.infer<typeof DB_PluginSchema>;
@@ -1,54 +0,0 @@
1
- import { z } from 'zod';
2
-
3
- import { DEFAULT_MODEL } from '@/const/settings';
4
- import { AgentChatConfigSchema } from '@/types/agent';
5
- import { LobeMetaDataSchema } from '@/types/meta';
6
-
7
- const fewShotsSchema = z.array(
8
- z.object({
9
- content: z.string(),
10
- role: z.string(),
11
- }),
12
- );
13
-
14
- const ttsSchema = z.object({
15
- showAllLocaleVoice: z.boolean().optional(),
16
- sttLocale: z.string().default('auto'),
17
- ttsService: z.string().default('openai'),
18
- voice: z
19
- .object({
20
- edge: z.string().optional(),
21
- microsoft: z.string().optional(),
22
- openai: z.string().default(''),
23
- })
24
- .optional(),
25
- });
26
-
27
- export const AgentSchema = z.object({
28
- chatConfig: AgentChatConfigSchema,
29
- fewShots: fewShotsSchema.optional(),
30
- model: z.string().default(DEFAULT_MODEL),
31
- openingMessage: z.string().optional(),
32
- openingQuestions: z.array(z.string()).default([]).optional(),
33
- params: z.object({
34
- frequency_penalty: z.number().default(0).optional(),
35
- max_tokens: z.number().optional(),
36
- presence_penalty: z.number().default(0).optional(),
37
- temperature: z.number().default(1).optional(),
38
- top_p: z.number().default(1).optional(),
39
- }),
40
- plugins: z.array(z.string()).optional(),
41
- provider: z.string().default('openai').optional(),
42
- systemRole: z.string().default(''),
43
- tts: ttsSchema.optional(),
44
- });
45
-
46
- export const DB_SessionSchema = z.object({
47
- config: AgentSchema,
48
- group: z.string().default('default'),
49
- meta: LobeMetaDataSchema,
50
- pinned: z.number().int().min(0).max(1).optional(),
51
- type: z.enum(['agent', 'group']).default('agent'),
52
- });
53
-
54
- export type DB_Session = z.infer<typeof DB_SessionSchema>;
@@ -1,8 +0,0 @@
1
- import { z } from 'zod';
2
-
3
- export const DB_SessionGroupSchema = z.object({
4
- name: z.string(),
5
- sort: z.number().optional(),
6
- });
7
-
8
- export type DB_SessionGroup = z.infer<typeof DB_SessionGroupSchema>;
@@ -1,12 +0,0 @@
1
- /* eslint-disable sort-keys-fix/sort-keys-fix */
2
- import { z } from 'zod';
3
-
4
- export const DB_TopicSchema = z.object({
5
- title: z.string(),
6
- favorite: z.number().int().default(0),
7
-
8
- // foreign keys
9
- sessionId: z.string().optional(),
10
- });
11
-
12
- export type DB_Topic = z.infer<typeof DB_TopicSchema>;
@@ -1,40 +0,0 @@
1
- import { z } from 'zod';
2
-
3
- import { AgentSchema } from '@/database/_deprecated/schemas/session';
4
- import { LobeMetaDataSchema } from '@/types/meta';
5
-
6
- const generalSechma = z.object({
7
- fontSize: z.number().default(14),
8
- language: z.string(),
9
- neutralColor: z.string().optional(),
10
- password: z.string(),
11
- themeMode: z.string(),
12
- });
13
-
14
- const settingsSchema = z.object({
15
- defaultAgent: z.object({
16
- config: AgentSchema,
17
- meta: LobeMetaDataSchema,
18
- }),
19
- general: generalSechma.partial().optional(),
20
- keyVaults: z.any().optional(),
21
- languageModel: z.any().optional(),
22
- tts: z.object({
23
- openAI: z.object({
24
- sttModel: z.string(),
25
- ttsModel: z.string(),
26
- }),
27
- sttAutoStop: z.boolean(),
28
- sttServer: z.string(),
29
- }),
30
- });
31
-
32
- export const DB_UserSchema = z.object({
33
- avatar: z.string().optional(),
34
- settings: settingsSchema.partial(),
35
- uuid: z.string(),
36
- });
37
-
38
- export type DB_User = z.infer<typeof DB_UserSchema>;
39
-
40
- export type DB_Settings = z.infer<typeof settingsSchema>;
@@ -1,43 +0,0 @@
1
- import { t } from 'i18next';
2
-
3
- import { notification } from '@/components/AntdStaticMethods';
4
- import { Migration } from '@/migrations';
5
- import { ConfigFile } from '@/types/exportConfig';
6
-
7
- /**
8
- * V2 删除该方法
9
- * 不再需要 Migration.migrate
10
- * @deprecated
11
- */
12
- export const importConfigFile = async (
13
- file: File,
14
- onConfigImport: (config: ConfigFile) => Promise<void>,
15
- ) => {
16
- const text = await file.text();
17
-
18
- try {
19
- const config = JSON.parse(text);
20
-
21
- // it means the config file is exported from a newer version
22
- if ('schemaHash' in config) {
23
- notification.error({
24
- description: t('import.incompatible.description', { ns: 'error' }),
25
- message: t('import.incompatible.title', { ns: 'error' }),
26
- });
27
- return;
28
- }
29
-
30
- const { state, version } = Migration.migrate(config);
31
-
32
- await onConfigImport({ ...config, state, version });
33
- } catch (error) {
34
- console.error(error);
35
- notification.error({
36
- description: t('import.importConfigFile.description', {
37
- ns: 'error',
38
- reason: (error as any).message,
39
- }),
40
- message: t('import.importConfigFile.title', { ns: 'error' }),
41
- });
42
- }
43
- };