@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,55 +0,0 @@
1
- {
2
- "avatar": "",
3
- "defaultAgent": {
4
- "config": {
5
- "autoCreateTopicThreshold": 2,
6
- "displayMode": "chat",
7
- "enableAutoCreateTopic": true,
8
- "historyCount": 1,
9
- "model": "gpt-3.5-turbo-1106",
10
- "params": {
11
- "frequency_penalty": 0,
12
- "presence_penalty": 0,
13
- "temperature": 0.7,
14
- "top_p": 0.7
15
- },
16
- "plugins": ["website-crawler"],
17
- "systemRole": "",
18
- "tts": {
19
- "showAllLocaleVoice": false,
20
- "sttLocale": "auto",
21
- "ttsService": "openai",
22
- "voice": { "openai": "alloy" }
23
- },
24
- "enableHistoryCount": true
25
- },
26
- "meta": {}
27
- },
28
- "fontSize": 14,
29
- "language": "auto",
30
- "languageModel": {
31
- "openAI": {
32
- "OPENAI_API_KEY": "dfdf",
33
- "models": [
34
- "gpt-3.5-turbo",
35
- "gpt-3.5-turbo-1106",
36
- "gpt-3.5-turbo-16k",
37
- "gpt-4",
38
- "gpt-4-32k",
39
- "gpt-4-0125-preview",
40
- "gpt-4-vision-preview"
41
- ],
42
- "customModelName": "+glm-4,+glm-4v",
43
- "endpoint": "sdaddsd"
44
- },
45
- "zhipu": { "ZHIPU_API_KEY": "", "enabled": false }
46
- },
47
- "password": "",
48
- "themeMode": "auto",
49
- "tool": { "dalle": { "autoGenerate": false } },
50
- "tts": {
51
- "openAI": { "sttModel": "whisper-1", "ttsModel": "tts-1" },
52
- "sttAutoStop": true,
53
- "sttServer": "openai"
54
- }
55
- }
@@ -1,60 +0,0 @@
1
- {
2
- "avatar": "",
3
- "settings": {
4
- "defaultAgent": {
5
- "config": {
6
- "autoCreateTopicThreshold": 2,
7
- "displayMode": "chat",
8
- "enableAutoCreateTopic": true,
9
- "historyCount": 1,
10
- "model": "gpt-3.5-turbo-1106",
11
- "params": {
12
- "frequency_penalty": 0,
13
- "presence_penalty": 0,
14
- "temperature": 0.7,
15
- "top_p": 0.7
16
- },
17
- "plugins": ["website-crawler"],
18
- "systemRole": "",
19
- "tts": {
20
- "showAllLocaleVoice": false,
21
- "sttLocale": "auto",
22
- "ttsService": "openai",
23
- "voice": {
24
- "openai": "alloy"
25
- }
26
- },
27
- "enableHistoryCount": true
28
- },
29
- "meta": {}
30
- },
31
- "fontSize": 14,
32
- "language": "auto",
33
- "languageModel": {
34
- "openai": {
35
- "OPENAI_API_KEY": "dfdf",
36
- "models": [
37
- "gpt-3.5-turbo",
38
- "gpt-3.5-turbo-1106",
39
- "gpt-3.5-turbo-16k",
40
- "gpt-4",
41
- "gpt-4-32k",
42
- "gpt-4-0125-preview",
43
- "gpt-4-vision-preview"
44
- ],
45
- "customModelName": "+glm-4,+glm-4v",
46
- "endpoint": "sdaddsd"
47
- }
48
- },
49
- "password": "",
50
- "themeMode": "auto",
51
- "tts": {
52
- "openAI": {
53
- "sttModel": "whisper-1",
54
- "ttsModel": "tts-1"
55
- },
56
- "sttAutoStop": true,
57
- "sttServer": "openai"
58
- }
59
- }
60
- }
@@ -1,14 +0,0 @@
1
- import { describe, expect } from 'vitest';
2
-
3
- import input from './fixtures/input.json';
4
- import outputData from './fixtures/output.json';
5
- import { migrateSettingsToUser } from './index';
6
- import { V4Settings } from './type';
7
-
8
- describe('migrateSettingsFromLocalStorage', () => {
9
- it('from localStorage to indexedDB', () => {
10
- const output = migrateSettingsToUser(input as V4Settings);
11
-
12
- expect(output).toEqual(outputData);
13
- });
14
- });
@@ -1,22 +0,0 @@
1
- import { V4Settings, V5Settings } from './type';
2
-
3
- export const migrateSettingsToUser = (
4
- settings: V4Settings,
5
- ): { avatar: string; settings: V5Settings } => {
6
- const dbSettings: V5Settings = {
7
- defaultAgent: settings.defaultAgent,
8
- fontSize: settings.fontSize,
9
- language: settings.language,
10
- languageModel: {
11
- openai: settings.languageModel.openAI,
12
- },
13
- password: settings.password,
14
- themeMode: settings.themeMode,
15
- tts: settings.tts,
16
- };
17
-
18
- return {
19
- avatar: settings.avatar,
20
- settings: dbSettings,
21
- };
22
- };
@@ -1,105 +0,0 @@
1
- import { FewShots, LobeAgentTTSConfig, MetaData, STTServer } from '@lobechat/types';
2
- import type { ThemeMode } from 'antd-style';
3
- import { LLMParams } from 'model-bank';
4
-
5
- interface V4LobeAgentConfig {
6
- autoCreateTopicThreshold: number;
7
- compressThreshold?: number;
8
- displayMode?: 'chat' | 'docs';
9
- enableAutoCreateTopic: boolean;
10
- /**
11
- * 历史消息长度压缩阈值
12
- */
13
- enableCompressThreshold?: boolean;
14
- /**
15
- * 开启历史记录条数
16
- */
17
- enableHistoryCount?: boolean;
18
- enableMaxTokens?: boolean;
19
-
20
- fewShots?: FewShots;
21
- /**
22
- * 历史消息条数
23
- */
24
- historyCount?: number;
25
- inputTemplate?: string;
26
- /**
27
- * 角色所使用的语言模型
28
- * @default gpt-3.5-turbo
29
- */
30
- model: string;
31
- /**
32
- * 语言模型参数
33
- */
34
- params: LLMParams;
35
- /**
36
- * 启用的插件
37
- */
38
- plugins?: string[];
39
- /**
40
- * 模型供应商
41
- */
42
- provider?: string;
43
- /**
44
- * 系统角色
45
- */
46
- systemRole: string;
47
- /**
48
- * 语音服务
49
- */
50
- tts: LobeAgentTTSConfig;
51
- }
52
-
53
- interface V4DefaultAgent {
54
- config: V4LobeAgentConfig;
55
- meta: MetaData;
56
- }
57
-
58
- interface OpenAIConfig {
59
- OPENAI_API_KEY: string;
60
- azureApiVersion?: string;
61
- customModelName?: string;
62
- endpoint?: string;
63
- models?: string[];
64
- useAzure?: boolean;
65
- }
66
-
67
- interface V4LLMConfig {
68
- openAI: OpenAIConfig;
69
- }
70
-
71
- interface TTSConfig {
72
- openAI: {
73
- sttModel: 'whisper-1';
74
- ttsModel: 'tts-1' | 'tts-1-hd';
75
- };
76
- sttAutoStop: boolean;
77
- sttServer: STTServer;
78
- }
79
-
80
- export interface V4Settings {
81
- avatar: string;
82
- defaultAgent: V4DefaultAgent;
83
- fontSize: number;
84
- language: string;
85
- languageModel: V4LLMConfig;
86
- neutralColor?: string;
87
- password: string;
88
- primaryColor?: string;
89
- themeMode: ThemeMode;
90
- tts: TTSConfig;
91
- }
92
-
93
- export interface V5Settings {
94
- defaultAgent: V4DefaultAgent;
95
- fontSize: number;
96
- language: string;
97
- languageModel: {
98
- openai: OpenAIConfig;
99
- };
100
- neutralColor?: string;
101
- password: string;
102
- primaryColor?: string;
103
- themeMode: ThemeMode;
104
- tts: TTSConfig;
105
- }
@@ -1,218 +0,0 @@
1
- import Dexie, { BulkError } from 'dexie';
2
- import { ZodObject } from 'zod';
3
-
4
- import { nanoid } from '@/utils/uuid';
5
-
6
- import { BrowserDB, BrowserDBSchema, browserDB } from './db';
7
- import { DBBaseFieldsSchema } from './types/db';
8
-
9
- export class BaseModel<N extends keyof BrowserDBSchema = any, T = BrowserDBSchema[N]['table']> {
10
- protected readonly db: BrowserDB;
11
- private readonly schema: ZodObject<any>;
12
- private readonly _tableName: keyof BrowserDBSchema;
13
-
14
- constructor(table: N, schema: ZodObject<any>, db = browserDB) {
15
- this.db = db;
16
- this.schema = schema;
17
- this._tableName = table;
18
- }
19
-
20
- get table() {
21
- return this.db[this._tableName] as Dexie.Table;
22
- }
23
-
24
- // **************** Create *************** //
25
-
26
- /**
27
- * create a new record
28
- */
29
- protected async _addWithSync<T = BrowserDBSchema[N]['model']>(
30
- data: T,
31
- id: string | number = nanoid(),
32
- primaryKey: string = 'id',
33
- ) {
34
- const result = this.schema.safeParse(data);
35
-
36
- if (!result.success) {
37
- const errorMsg = `[${this.db.name}][${this._tableName}] Failed to create new record. Error: ${result.error}`;
38
-
39
- const newError = new TypeError(errorMsg);
40
- // make this error show on console to help debug
41
- console.error(newError);
42
- throw newError;
43
- }
44
-
45
- const tableName = this._tableName;
46
-
47
- const record: any = {
48
- ...result.data,
49
- createdAt: Date.now(),
50
- [primaryKey]: id,
51
- updatedAt: Date.now(),
52
- };
53
-
54
- const newId = await this.db[tableName].add(record);
55
-
56
- // sync data to yjs data map
57
- this.updateYMapItem(newId);
58
-
59
- return { id: newId };
60
- }
61
-
62
- /**
63
- * Batch create new records
64
- * @param dataArray An array of data to be added
65
- * @param options
66
- * @param options.generateId
67
- * @param options.createWithNewId
68
- */
69
- protected async _batchAdd<T = BrowserDBSchema[N]['model']>(
70
- dataArray: T[],
71
- options: {
72
- /**
73
- * always create with a new id
74
- */
75
- createWithNewId?: boolean;
76
- idGenerator?: () => string;
77
- } = {},
78
- ): Promise<{
79
- added: number;
80
- errors?: Error[];
81
- ids: string[];
82
- skips: string[];
83
- success: boolean;
84
- }> {
85
- const { idGenerator = nanoid, createWithNewId = false } = options;
86
- const validatedData: any[] = [];
87
- const errors = [];
88
- const skips: string[] = [];
89
-
90
- for (const data of dataArray) {
91
- const schemaWithId = this.schema.merge(DBBaseFieldsSchema.partial());
92
-
93
- const result = schemaWithId.safeParse(data);
94
-
95
- if (result.success) {
96
- const item = result.data;
97
- const autoId = idGenerator();
98
-
99
- const id = createWithNewId ? autoId : (item.id ?? autoId);
100
-
101
- // skip if the id already exists
102
- if (await this.table.get(id)) {
103
- skips.push(id as string);
104
- continue;
105
- }
106
-
107
- const getTime = (time?: string | number) => {
108
- if (!time) return Date.now();
109
- if (typeof time === 'number') return time;
110
-
111
- return new Date(time).valueOf();
112
- };
113
-
114
- validatedData.push({
115
- ...item,
116
- createdAt: getTime(item.createdAt as string),
117
- id,
118
- updatedAt: getTime(item.updatedAt as string),
119
- });
120
- } else {
121
- errors.push(result.error);
122
-
123
- const errorMsg = `[${this.db.name}][${
124
- this._tableName
125
- }] Failed to create the record. Data: ${JSON.stringify(data)}. Errors: ${result.error}`;
126
- console.error(new TypeError(errorMsg));
127
- }
128
- }
129
- if (validatedData.length === 0) {
130
- // No valid data to add
131
- return { added: 0, errors, ids: [], skips, success: false };
132
- }
133
-
134
- // Using bulkAdd to insert validated data
135
- try {
136
- await this.table.bulkAdd(validatedData);
137
-
138
- return {
139
- added: validatedData.length,
140
- ids: validatedData.map((item) => item.id),
141
- skips,
142
- success: true,
143
- };
144
- } catch (error) {
145
- const bulkError = error as BulkError;
146
- // Handle bulkAdd errors here
147
- console.error(`[${this.db.name}][${this._tableName}] Bulk add error:`, bulkError);
148
- // Return the number of successfully added records and errors
149
- return {
150
- added: validatedData.length - skips.length - bulkError.failures.length,
151
- errors: bulkError.failures,
152
- ids: validatedData.map((item) => item.id),
153
- skips,
154
- success: false,
155
- };
156
- }
157
- }
158
-
159
- // **************** Delete *************** //
160
-
161
- protected async _deleteWithSync(id: string) {
162
- return await this.table.delete(id);
163
- }
164
-
165
- protected async _bulkDeleteWithSync(keys: string[]) {
166
- await this.table.bulkDelete(keys);
167
- // sync delete data to yjs data map
168
- }
169
-
170
- protected async _clearWithSync() {
171
- return await this.table.clear();
172
- }
173
-
174
- // **************** Update *************** //
175
-
176
- protected async _updateWithSync(id: string, data: Partial<T>) {
177
- // we need to check whether the data is valid
178
- // pick data related schema from the full schema
179
- const keys = Object.keys(data);
180
- const partialSchema = this.schema.pick(Object.fromEntries(keys.map((key) => [key, true])));
181
-
182
- const result = partialSchema.safeParse(data);
183
- if (!result.success) {
184
- const errorMsg = `[${this.db.name}][${this._tableName}] Failed to update the record:${id}. Error: ${result.error}`;
185
-
186
- const newError = new TypeError(errorMsg);
187
- // make this error show on console to help debug
188
- console.error(newError);
189
- throw newError;
190
- }
191
-
192
- const success = await this.table.update(id, { ...data, updatedAt: Date.now() });
193
-
194
- // sync data to yjs data map
195
- this.updateYMapItem(id);
196
-
197
- return { success };
198
- }
199
-
200
- protected async _putWithSync(data: any, id: string) {
201
- const result = await this.table.put(data, id);
202
-
203
- // sync data to yjs data map
204
- this.updateYMapItem(id);
205
-
206
- return result;
207
- }
208
-
209
- protected async _bulkPutWithSync(items: T[]) {
210
- await this.table.bulkPut(items);
211
- }
212
-
213
- // **************** Helper *************** //
214
-
215
- private updateYMapItem = async (id: string) => {
216
- await this.table.get(id);
217
- };
218
- }
@@ -1,88 +0,0 @@
1
- // ************************************** //
2
- // ******* Version 1 - 2023-11-14 ******* //
3
- // ************************************** //
4
- // - Initial database schema with `files` table
5
-
6
- export const dbSchemaV1 = {
7
- files: '&id, name, fileType, saveMode',
8
- };
9
-
10
- // ************************************** //
11
- // ******* Version 2 - 2023-11-27 ******* //
12
- // ************************************** //
13
- // - Added `sessions` 、`messages` 、`topics` tables
14
- // - Added `createdAt` and `updatedAt` fields to all
15
- export const dbSchemaV2 = {
16
- files: '&id, name, fileType, saveMode, createdAt, updatedAt, messageId, sessionId',
17
-
18
- messages:
19
- '&id, role, content, fromModel, favorite, plugin.identifier, plugin.apiName, translate.content, createdAt, updatedAt, sessionId, topicId, quotaId, parentId, [sessionId+topicId]',
20
- sessions: '&id, type, group, meta.title, meta.description, meta.tags, createdAt, updatedAt',
21
- topics: '&id, title, favorite, createdAt, updatedAt, sessionId',
22
- };
23
-
24
- // ************************************** //
25
- // ******* Version 3 - 2023-12-06 ******* //
26
- // ************************************** //
27
- // - Added `plugins` table
28
-
29
- export const dbSchemaV3 = {
30
- ...dbSchemaV2,
31
- plugins:
32
- '&identifier, type, manifest.type, manifest.meta.title, manifest.meta.description, manifest.meta.author, createdAt, updatedAt',
33
- };
34
-
35
- // ************************************** //
36
- // ******* Version 4 - 2024-01-21 ******* //
37
- // ************************************** //
38
- // - Added `sessionGroups` table
39
- // - Add `pinned` to sessions table
40
-
41
- export const dbSchemaV4 = {
42
- ...dbSchemaV3,
43
- sessionGroups: '&id, name, sort, createdAt, updatedAt',
44
- sessions:
45
- '&id, type, group, pinned, meta.title, meta.description, meta.tags, createdAt, updatedAt',
46
- };
47
-
48
- // ************************************** //
49
- // ******* Version 5 - 2024-01-29 ******* //
50
- // ************************************** //
51
- // - Added `users` table
52
-
53
- export const dbSchemaV5 = {
54
- ...dbSchemaV4,
55
- users: '++id',
56
- };
57
-
58
- // ************************************** //
59
- // ******* Version 6 - 2024-02-27 ******* //
60
- // ************************************** //
61
- // - Added uuid to `users` table
62
- // - Added traceId to `messages` table
63
- export const dbSchemaV6 = {
64
- ...dbSchemaV5,
65
- messages:
66
- '&id, role, content, fromModel, favorite, plugin.identifier, plugin.apiName, translate.content, createdAt, updatedAt, sessionId, topicId, quotaId, parentId, [sessionId+topicId], traceId',
67
- users: '++id, uuid',
68
- };
69
-
70
- // ************************************** //
71
- // ******* Version 7 - 2024-03-14 ******* //
72
- // ************************************** //
73
- // - Added id to `plugins` table
74
- export const dbSchemaV7 = {
75
- ...dbSchemaV6,
76
- plugins:
77
- '&identifier, id, type, manifest.type, manifest.meta.title, manifest.meta.description, manifest.meta.author, createdAt, updatedAt',
78
- };
79
-
80
- // ************************************** //
81
- // ******* Version 9 - 2024-05-11 ******* //
82
- // ************************************** //
83
- // - Added tool_call_id to `messages` table
84
- export const dbSchemaV9 = {
85
- ...dbSchemaV7,
86
- messages:
87
- '&id, role, content, fromModel, favorite, tool_call_id, plugin.identifier, plugin.apiName, translate.content, createdAt, updatedAt, sessionId, topicId, quotaId, parentId, [sessionId+topicId], traceId',
88
- };
@@ -1,15 +0,0 @@
1
- import { z } from 'zod';
2
-
3
- export type DBModel<T> = T & {
4
- createdAt: number;
5
- id: string;
6
- updatedAt: number;
7
- };
8
-
9
- export const DBBaseFieldsSchema = z.object({
10
- createdAt: z.number().or(z.string()),
11
- id: z.string(),
12
- updatedAt: z.number().or(z.string()),
13
- });
14
-
15
- export const LOBE_CHAT_LOCAL_DB_NAME = 'LOBE_CHAT_DB';