@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,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';