@lobehub/lobehub 2.0.0-next.12 → 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 (212) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/changelog/v1.json +18 -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/features/PromptInput/index.tsx +1 -1
  14. package/src/app/[variants]/(main)/image/page.tsx +0 -2
  15. package/src/app/[variants]/(main)/profile/_layout/Desktop/index.tsx +23 -24
  16. package/src/app/[variants]/(main)/profile/_layout/Mobile/index.tsx +5 -9
  17. package/src/app/[variants]/(main)/settings/_layout/Desktop/index.tsx +0 -2
  18. package/src/app/[variants]/(main)/settings/_layout/Mobile/index.tsx +0 -2
  19. package/src/app/[variants]/(main)/settings/provider/(list)/ProviderGrid/Card.tsx +1 -1
  20. package/src/app/[variants]/loading/index.tsx +1 -10
  21. package/src/components/Link.tsx +12 -0
  22. package/src/envs/app.ts +5 -8
  23. package/src/features/DataImporter/index.tsx +15 -60
  24. package/src/features/DevPanel/PostgresViewer/usePgTable.ts +3 -2
  25. package/src/hooks/useInterceptingRoutes.test.ts +21 -3
  26. package/src/libs/trpc/client/index.ts +0 -1
  27. package/src/libs/trpc/client/lambda.ts +8 -5
  28. package/src/libs/trpc/lambda/context.ts +4 -1
  29. package/src/server/routers/desktop/mcp.ts +1 -3
  30. package/src/server/routers/lambda/config/index.test.ts +2 -2
  31. package/src/server/routers/tools/mcp.ts +2 -3
  32. package/src/server/routers/tools/search.test.ts +1 -7
  33. package/src/server/routers/tools/search.ts +1 -4
  34. package/src/services/__tests__/tool.test.ts +0 -3
  35. package/src/services/aiModel/index.test.ts +0 -3
  36. package/src/services/aiModel/index.ts +1 -7
  37. package/src/services/aiProvider/index.test.ts +0 -3
  38. package/src/services/aiProvider/index.ts +1 -7
  39. package/src/services/chatGroup/index.ts +1 -10
  40. package/src/services/config.ts +1 -65
  41. package/src/services/export/index.ts +1 -4
  42. package/src/services/file/index.ts +1 -11
  43. package/src/services/import/index.ts +1 -7
  44. package/src/services/message/index.ts +1 -11
  45. package/src/services/plugin/index.ts +1 -11
  46. package/src/services/session/index.ts +1 -11
  47. package/src/services/tableViewer/client.ts +12 -15
  48. package/src/services/thread/index.ts +1 -7
  49. package/src/services/topic/index.ts +1 -11
  50. package/src/services/user/index.ts +1 -13
  51. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChat.test.ts +0 -241
  52. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChatV2.test.ts +26 -1
  53. package/src/store/chat/slices/aiChat/actions/__tests__/helpers.ts +3 -1
  54. package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +1 -138
  55. package/src/store/user/slices/common/action.test.ts +1 -4
  56. package/src/app/(backend)/trpc/edge/[trpc]/route.ts +0 -26
  57. package/src/app/[variants]/(main)/(mobile)/me/data/features/Category.tsx +0 -48
  58. package/src/app/[variants]/(main)/(mobile)/me/data/features/Header.tsx +0 -33
  59. package/src/app/[variants]/(main)/(mobile)/me/data/layout.tsx +0 -13
  60. package/src/app/[variants]/(main)/(mobile)/me/data/loading.tsx +0 -5
  61. package/src/app/[variants]/(main)/(mobile)/me/data/page.tsx +0 -29
  62. package/src/app/[variants]/(main)/chat/features/Migration/DBReader.ts +0 -290
  63. package/src/app/[variants]/(main)/chat/features/Migration/ExportConfigButton.tsx +0 -35
  64. package/src/app/[variants]/(main)/chat/features/Migration/Failed.tsx +0 -120
  65. package/src/app/[variants]/(main)/chat/features/Migration/Modal.tsx +0 -81
  66. package/src/app/[variants]/(main)/chat/features/Migration/Start.tsx +0 -108
  67. package/src/app/[variants]/(main)/chat/features/Migration/UpgradeButton.tsx +0 -71
  68. package/src/app/[variants]/(main)/chat/features/Migration/const.ts +0 -15
  69. package/src/app/[variants]/(main)/chat/features/Migration/index.tsx +0 -50
  70. package/src/app/[variants]/loading/Client/Content.tsx +0 -48
  71. package/src/app/[variants]/loading/Client/Error.tsx +0 -27
  72. package/src/app/[variants]/loading/Client/Redirect.tsx +0 -47
  73. package/src/app/[variants]/loading/Client/index.tsx +0 -22
  74. package/src/components/InnerLink.tsx +0 -20
  75. package/src/database/_deprecated/core/__tests__/db-upgrade.test.ts +0 -42
  76. package/src/database/_deprecated/core/__tests__/db.test.ts +0 -79
  77. package/src/database/_deprecated/core/__tests__/model.test.ts +0 -55
  78. package/src/database/_deprecated/core/db.ts +0 -246
  79. package/src/database/_deprecated/core/index.ts +0 -2
  80. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/input.json +0 -55
  81. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/output.json +0 -60
  82. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.test.ts +0 -14
  83. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.ts +0 -22
  84. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/type.ts +0 -105
  85. package/src/database/_deprecated/core/model.ts +0 -218
  86. package/src/database/_deprecated/core/schemas.ts +0 -88
  87. package/src/database/_deprecated/core/types/db.ts +0 -15
  88. package/src/database/_deprecated/models/__DEBUG.ts +0 -124
  89. package/src/database/_deprecated/models/__tests__/file.test.ts +0 -83
  90. package/src/database/_deprecated/models/__tests__/message.test.ts +0 -426
  91. package/src/database/_deprecated/models/__tests__/plugin.test.ts +0 -81
  92. package/src/database/_deprecated/models/__tests__/session.test.ts +0 -253
  93. package/src/database/_deprecated/models/__tests__/sessionGroup.test.ts +0 -220
  94. package/src/database/_deprecated/models/__tests__/topic.test.ts +0 -523
  95. package/src/database/_deprecated/models/__tests__/user.test.ts +0 -82
  96. package/src/database/_deprecated/models/file.ts +0 -51
  97. package/src/database/_deprecated/models/message.ts +0 -277
  98. package/src/database/_deprecated/models/plugin.ts +0 -62
  99. package/src/database/_deprecated/models/session.ts +0 -271
  100. package/src/database/_deprecated/models/sessionGroup.ts +0 -93
  101. package/src/database/_deprecated/models/topic.ts +0 -250
  102. package/src/database/_deprecated/models/user.ts +0 -69
  103. package/src/database/_deprecated/schemas/files.ts +0 -39
  104. package/src/database/_deprecated/schemas/message.ts +0 -50
  105. package/src/database/_deprecated/schemas/plugin.ts +0 -12
  106. package/src/database/_deprecated/schemas/session.ts +0 -54
  107. package/src/database/_deprecated/schemas/sessionGroup.ts +0 -8
  108. package/src/database/_deprecated/schemas/topic.ts +0 -12
  109. package/src/database/_deprecated/schemas/user.ts +0 -40
  110. package/src/features/DataImporter/_deprecated.ts +0 -43
  111. package/src/features/InitClientDB/EnableModal.tsx +0 -118
  112. package/src/features/InitClientDB/ErrorResult.tsx +0 -143
  113. package/src/features/InitClientDB/InitIndicator.tsx +0 -124
  114. package/src/features/InitClientDB/PGliteIcon.tsx +0 -28
  115. package/src/features/InitClientDB/features/DatabaseRepair/Backup.tsx +0 -75
  116. package/src/features/InitClientDB/features/DatabaseRepair/Diagnosis.tsx +0 -98
  117. package/src/features/InitClientDB/features/DatabaseRepair/Repair.tsx +0 -218
  118. package/src/features/InitClientDB/features/DatabaseRepair/index.tsx +0 -91
  119. package/src/features/InitClientDB/index.tsx +0 -37
  120. package/src/libs/trpc/client/edge.ts +0 -26
  121. package/src/libs/trpc/edge/context.ts +0 -71
  122. package/src/libs/trpc/edge/index.ts +0 -45
  123. package/src/libs/trpc/edge/init.ts +0 -26
  124. package/src/libs/trpc/edge/middleware/jwtPayload.test.ts +0 -75
  125. package/src/libs/trpc/edge/middleware/jwtPayload.ts +0 -14
  126. package/src/migrations/FromV0ToV1.ts +0 -10
  127. package/src/migrations/FromV1ToV2/fixtures/input-v1-session.json +0 -191
  128. package/src/migrations/FromV1ToV2/fixtures/output-v2.json +0 -202
  129. package/src/migrations/FromV1ToV2/index.ts +0 -82
  130. package/src/migrations/FromV1ToV2/migrations.test.ts +0 -224
  131. package/src/migrations/FromV1ToV2/types/v1.ts +0 -78
  132. package/src/migrations/FromV1ToV2/types/v2.ts +0 -52
  133. package/src/migrations/FromV2ToV3/fixtures/input-v2-session.json +0 -72
  134. package/src/migrations/FromV2ToV3/fixtures/output-v3-from-v1.json +0 -203
  135. package/src/migrations/FromV2ToV3/fixtures/output-v3.json +0 -74
  136. package/src/migrations/FromV2ToV3/index.ts +0 -30
  137. package/src/migrations/FromV2ToV3/migrations.test.ts +0 -42
  138. package/src/migrations/FromV2ToV3/types/v3.ts +0 -27
  139. package/src/migrations/FromV3ToV4/fixtures/azure-input-v3.json +0 -79
  140. package/src/migrations/FromV3ToV4/fixtures/azure-output-v4.json +0 -75
  141. package/src/migrations/FromV3ToV4/fixtures/ollama-input-v3.json +0 -85
  142. package/src/migrations/FromV3ToV4/fixtures/ollama-output-v4.json +0 -86
  143. package/src/migrations/FromV3ToV4/fixtures/openai-input-v3.json +0 -77
  144. package/src/migrations/FromV3ToV4/fixtures/openai-output-v4.json +0 -77
  145. package/src/migrations/FromV3ToV4/fixtures/openrouter-input-v3.json +0 -82
  146. package/src/migrations/FromV3ToV4/fixtures/openrouter-output-v4.json +0 -85
  147. package/src/migrations/FromV3ToV4/fixtures/output-v4-from-v1.json +0 -203
  148. package/src/migrations/FromV3ToV4/index.ts +0 -102
  149. package/src/migrations/FromV3ToV4/migrations.test.ts +0 -195
  150. package/src/migrations/FromV3ToV4/types/v3.ts +0 -52
  151. package/src/migrations/FromV3ToV4/types/v4.ts +0 -37
  152. package/src/migrations/FromV4ToV5/fixtures/from-v1-to-v5-output.json +0 -245
  153. package/src/migrations/FromV4ToV5/fixtures/function-input-v4.json +0 -96
  154. package/src/migrations/FromV4ToV5/fixtures/function-output-v5.json +0 -120
  155. package/src/migrations/FromV4ToV5/index.ts +0 -58
  156. package/src/migrations/FromV4ToV5/migrations.test.ts +0 -49
  157. package/src/migrations/FromV4ToV5/types/v4.ts +0 -21
  158. package/src/migrations/FromV4ToV5/types/v5.ts +0 -27
  159. package/src/migrations/FromV5ToV6/fixtures/from-v1-to-v6-output.json +0 -247
  160. package/src/migrations/FromV5ToV6/fixtures/session-input-v5.json +0 -81
  161. package/src/migrations/FromV5ToV6/fixtures/session-output-v6.json +0 -85
  162. package/src/migrations/FromV5ToV6/index.ts +0 -61
  163. package/src/migrations/FromV5ToV6/migrations.test.ts +0 -50
  164. package/src/migrations/FromV5ToV6/types/v5.ts +0 -48
  165. package/src/migrations/FromV5ToV6/types/v6.ts +0 -63
  166. package/src/migrations/FromV6ToV7/fixtures/output-v7-from-v1.json +0 -203
  167. package/src/migrations/FromV6ToV7/fixtures/provider-input-v6.json +0 -103
  168. package/src/migrations/FromV6ToV7/fixtures/provider-output-v7.json +0 -118
  169. package/src/migrations/FromV6ToV7/index.ts +0 -101
  170. package/src/migrations/FromV6ToV7/migrations.test.ts +0 -64
  171. package/src/migrations/FromV6ToV7/types/v6.ts +0 -61
  172. package/src/migrations/FromV6ToV7/types/v7.ts +0 -69
  173. package/src/migrations/VersionController.test.ts +0 -88
  174. package/src/migrations/VersionController.ts +0 -67
  175. package/src/migrations/index.ts +0 -61
  176. package/src/server/routers/edge/appStatus.ts +0 -3
  177. package/src/server/routers/edge/index.ts +0 -14
  178. package/src/server/routers/edge/upload.ts +0 -16
  179. package/src/services/aiModel/client.ts +0 -70
  180. package/src/services/aiProvider/client.ts +0 -58
  181. package/src/services/baseClientService/index.ts +0 -9
  182. package/src/services/chatGroup/client.ts +0 -63
  183. package/src/services/export/_deprecated.ts +0 -155
  184. package/src/services/export/client.ts +0 -15
  185. package/src/services/file/_deprecated.test.ts +0 -119
  186. package/src/services/file/_deprecated.ts +0 -80
  187. package/src/services/file/client.test.ts +0 -199
  188. package/src/services/file/client.ts +0 -85
  189. package/src/services/import/_deprecated.ts +0 -115
  190. package/src/services/import/client.test.ts +0 -1015
  191. package/src/services/import/client.ts +0 -64
  192. package/src/services/message/_deprecated.test.ts +0 -398
  193. package/src/services/message/_deprecated.ts +0 -168
  194. package/src/services/message/client.test.ts +0 -410
  195. package/src/services/message/client.ts +0 -192
  196. package/src/services/plugin/_deprecated.test.ts +0 -162
  197. package/src/services/plugin/_deprecated.ts +0 -42
  198. package/src/services/plugin/client.test.ts +0 -177
  199. package/src/services/plugin/client.ts +0 -46
  200. package/src/services/session/_deprecated.test.ts +0 -440
  201. package/src/services/session/_deprecated.ts +0 -190
  202. package/src/services/session/client.test.ts +0 -413
  203. package/src/services/session/client.ts +0 -193
  204. package/src/services/thread/client.ts +0 -51
  205. package/src/services/topic/_deprecated.test.ts +0 -245
  206. package/src/services/topic/_deprecated.ts +0 -75
  207. package/src/services/topic/client.ts +0 -89
  208. package/src/services/topic/pglite.test.ts +0 -212
  209. package/src/services/user/_deprecated.test.ts +0 -101
  210. package/src/services/user/_deprecated.ts +0 -70
  211. package/src/services/user/client.test.ts +0 -111
  212. 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
- };