@lobehub/chat 1.36.46 → 1.37.1

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 (89) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/README.ja-JP.md +8 -8
  3. package/README.md +8 -8
  4. package/README.zh-CN.md +8 -8
  5. package/changelog/v1.json +18 -0
  6. package/next.config.mjs +4 -1
  7. package/package.json +5 -3
  8. package/scripts/migrateClientDB/compile-migrations.ts +14 -0
  9. package/src/app/(main)/(mobile)/me/(home)/layout.tsx +2 -0
  10. package/src/app/(main)/chat/_layout/Desktop/index.tsx +3 -2
  11. package/src/app/(main)/chat/_layout/Mobile.tsx +5 -3
  12. package/src/app/(main)/chat/features/Migration/DBReader.ts +290 -0
  13. package/src/app/(main)/chat/features/Migration/UpgradeButton.tsx +4 -8
  14. package/src/app/(main)/chat/features/Migration/index.tsx +26 -15
  15. package/src/app/(main)/settings/_layout/Desktop/index.tsx +2 -0
  16. package/src/app/loading/Client/Content.tsx +11 -1
  17. package/src/app/loading/Client/Error.tsx +27 -0
  18. package/src/app/loading/stage.ts +8 -0
  19. package/src/components/FullscreenLoading/index.tsx +4 -3
  20. package/src/const/version.ts +1 -0
  21. package/src/database/client/db.test.ts +172 -0
  22. package/src/database/client/db.ts +246 -0
  23. package/src/database/client/migrations.json +289 -0
  24. package/src/features/InitClientDB/EnableModal.tsx +111 -0
  25. package/src/features/InitClientDB/ErrorResult.tsx +125 -0
  26. package/src/features/InitClientDB/InitIndicator.tsx +124 -0
  27. package/src/features/InitClientDB/PGliteSVG.tsx +22 -0
  28. package/src/features/InitClientDB/index.tsx +37 -0
  29. package/src/hooks/useCheckPluginsIsInstalled.ts +2 -2
  30. package/src/hooks/useFetchInstalledPlugins.ts +2 -2
  31. package/src/hooks/useFetchMessages.ts +2 -2
  32. package/src/hooks/useFetchSessions.ts +2 -2
  33. package/src/hooks/useFetchThreads.ts +2 -2
  34. package/src/hooks/useFetchTopics.ts +2 -2
  35. package/src/layout/GlobalProvider/StoreInitialization.tsx +2 -2
  36. package/src/services/baseClientService/index.ts +9 -0
  37. package/src/services/debug.ts +32 -34
  38. package/src/services/file/{client.test.ts → _deprecated.test.ts} +1 -1
  39. package/src/services/file/index.ts +6 -2
  40. package/src/services/file/pglite.test.ts +198 -0
  41. package/src/services/file/pglite.ts +84 -0
  42. package/src/services/file/type.ts +4 -3
  43. package/src/services/github.ts +17 -0
  44. package/src/services/import/index.ts +6 -2
  45. package/src/services/import/pglite.test.ts +997 -0
  46. package/src/services/import/pglite.ts +34 -0
  47. package/src/services/message/{client.test.ts → _deprecated.test.ts} +1 -1
  48. package/src/services/message/{client.ts → _deprecated.ts} +2 -0
  49. package/src/services/message/index.ts +6 -2
  50. package/src/services/message/pglite.test.ts +430 -0
  51. package/src/services/message/pglite.ts +118 -0
  52. package/src/services/message/server.ts +9 -9
  53. package/src/services/message/type.ts +3 -4
  54. package/src/services/plugin/{client.test.ts → _deprecated.test.ts} +1 -1
  55. package/src/services/plugin/index.ts +6 -2
  56. package/src/services/plugin/pglite.test.ts +175 -0
  57. package/src/services/plugin/pglite.ts +51 -0
  58. package/src/services/session/{client.test.ts → _deprecated.test.ts} +1 -1
  59. package/src/services/session/{client.ts → _deprecated.ts} +1 -1
  60. package/src/services/session/index.ts +6 -2
  61. package/src/services/session/pglite.test.ts +411 -0
  62. package/src/services/session/pglite.ts +184 -0
  63. package/src/services/session/type.ts +14 -1
  64. package/src/services/topic/client.test.ts +1 -1
  65. package/src/services/topic/index.ts +6 -3
  66. package/src/services/topic/pglite.test.ts +212 -0
  67. package/src/services/topic/pglite.ts +85 -0
  68. package/src/services/user/{client.test.ts → _deprecated.test.ts} +1 -2
  69. package/src/services/user/index.ts +8 -2
  70. package/src/services/user/pglite.test.ts +98 -0
  71. package/src/services/user/pglite.ts +92 -0
  72. package/src/store/chat/slices/builtinTool/action.test.ts +4 -5
  73. package/src/store/global/actions/clientDb.ts +51 -0
  74. package/src/store/global/initialState.ts +13 -0
  75. package/src/store/global/selectors.ts +24 -3
  76. package/src/store/global/store.ts +3 -1
  77. package/src/store/session/slices/sessionGroup/reducer.test.ts +6 -6
  78. package/src/store/user/slices/common/action.test.ts +1 -1
  79. package/src/store/user/slices/common/action.ts +2 -4
  80. package/src/types/clientDB.ts +29 -0
  81. package/src/types/importer.ts +17 -5
  82. package/src/types/meta.ts +0 -9
  83. package/src/types/session/sessionGroup.ts +3 -3
  84. package/src/services/message/index.test.ts +0 -48
  85. /package/src/services/file/{client.ts → _deprecated.ts} +0 -0
  86. /package/src/services/import/{client.ts → _deprecated.ts} +0 -0
  87. /package/src/services/plugin/{client.ts → _deprecated.ts} +0 -0
  88. /package/src/services/topic/{client.ts → _deprecated.ts} +0 -0
  89. /package/src/services/user/{client.ts → _deprecated.ts} +0 -0
@@ -10,14 +10,14 @@ describe('sessionGroupsReducer', () => {
10
10
  {
11
11
  id: nanoid(),
12
12
  name: 'Group 1',
13
- createdAt: Date.now(),
14
- updatedAt: Date.now(),
13
+ createdAt: new Date(),
14
+ updatedAt: new Date(),
15
15
  },
16
16
  {
17
17
  id: nanoid(),
18
18
  name: 'Group 2',
19
- createdAt: Date.now(),
20
- updatedAt: Date.now(),
19
+ createdAt: new Date(),
20
+ updatedAt: new Date(),
21
21
  sort: 1,
22
22
  },
23
23
  ];
@@ -26,8 +26,8 @@ describe('sessionGroupsReducer', () => {
26
26
  const newItem: SessionGroupItem = {
27
27
  id: nanoid(),
28
28
  name: 'New Group',
29
- createdAt: Date.now(),
30
- updatedAt: Date.now(),
29
+ createdAt: new Date(),
30
+ updatedAt: new Date(),
31
31
  };
32
32
 
33
33
  const result = sessionGroupsReducer(initialState, {
@@ -5,7 +5,7 @@ import { withSWR } from '~test-utils';
5
5
 
6
6
  import { DEFAULT_PREFERENCE } from '@/const/user';
7
7
  import { userService } from '@/services/user';
8
- import { ClientService } from '@/services/user/client';
8
+ import { ClientService } from '@/services/user/_deprecated';
9
9
  import { useUserStore } from '@/store/user';
10
10
  import { preferenceSelectors } from '@/store/user/selectors';
11
11
  import { GlobalServerConfig } from '@/types/serverConfig';
@@ -46,11 +46,9 @@ export const createCommonSlice: StateCreator<
46
46
  await mutate(GET_USER_STATE_KEY);
47
47
  },
48
48
  updateAvatar: async (avatar) => {
49
- const { ClientService } = await import('@/services/user/client');
49
+ const { userClientService } = await import('@/services/user');
50
50
 
51
- const clientService = new ClientService();
52
-
53
- await clientService.updateAvatar(avatar);
51
+ await userClientService.updateAvatar(avatar);
54
52
  await get().refreshUserState();
55
53
  },
56
54
 
@@ -0,0 +1,29 @@
1
+ // 定义加载状态类型
2
+ export enum DatabaseLoadingState {
3
+ Error = 'error',
4
+ Finished = 'finished',
5
+ Idle = 'idle',
6
+ Initializing = 'initializing',
7
+ LoadingDependencies = 'loadingDependencies',
8
+ LoadingWasm = 'loadingWasm',
9
+ Migrating = 'migrating',
10
+ Ready = 'ready',
11
+ }
12
+
13
+ export const ClientDatabaseInitStages = [
14
+ DatabaseLoadingState.Idle,
15
+ DatabaseLoadingState.Initializing,
16
+ DatabaseLoadingState.LoadingDependencies,
17
+ DatabaseLoadingState.LoadingWasm,
18
+ DatabaseLoadingState.Migrating,
19
+ DatabaseLoadingState.Finished,
20
+ ];
21
+
22
+ // 定义进度回调接口
23
+ export interface ClientDBLoadingProgress {
24
+ costTime?: number;
25
+ phase: 'wasm' | 'dependencies';
26
+ progress: number;
27
+ }
28
+
29
+ export type OnStageChange = (state: DatabaseLoadingState) => void;
@@ -9,9 +9,8 @@ import {
9
9
  } from '@/types/message';
10
10
  import { MetaData } from '@/types/meta';
11
11
  import { SessionGroupId } from '@/types/session';
12
- import { ChatTopic } from '@/types/topic';
13
12
 
14
- interface ImportSession {
13
+ export interface ImportSession {
15
14
  config: LobeAgentConfig;
16
15
  createdAt: string;
17
16
  group?: SessionGroupId;
@@ -22,7 +21,7 @@ interface ImportSession {
22
21
  updatedAt: string;
23
22
  }
24
23
 
25
- interface ImportMessage {
24
+ export interface ImportMessage {
26
25
  content: string;
27
26
  createdAt: number;
28
27
  error?: ChatMessageError;
@@ -64,19 +63,32 @@ interface ImportMessage {
64
63
  updatedAt: number;
65
64
  }
66
65
 
67
- interface ImportSessionGroup {
66
+ export interface ImportSessionGroup {
68
67
  createdAt: number;
69
68
  id: string;
70
69
  name: string;
71
70
  sort?: number | null;
72
71
  updatedAt: number;
73
72
  }
73
+ export interface ImportTopic {
74
+ createdAt: number;
75
+ favorite?: boolean;
76
+ historySummary?: string;
77
+ id: string;
78
+ metadata?: {
79
+ model?: string;
80
+ provider?: string;
81
+ };
82
+ sessionId?: string;
83
+ title: string;
84
+ updatedAt: number;
85
+ }
74
86
 
75
87
  export interface ImporterEntryData {
76
88
  messages?: ImportMessage[];
77
89
  sessionGroups?: ImportSessionGroup[];
78
90
  sessions?: ImportSession[];
79
- topics?: ChatTopic[];
91
+ topics?: ImportTopic[];
80
92
  version: number;
81
93
  }
82
94
 
package/src/types/meta.ts CHANGED
@@ -21,19 +21,10 @@ export const LobeMetaDataSchema = z.object({
21
21
  export type MetaData = z.infer<typeof LobeMetaDataSchema>;
22
22
 
23
23
  export interface BaseDataModel {
24
- /**
25
- * @deprecated
26
- */
27
- createAt?: number;
28
-
29
24
  createdAt: number;
30
25
 
31
26
  id: string;
32
27
  meta: MetaData;
33
28
 
34
- /**
35
- * @deprecated
36
- */
37
- updateAt?: number;
38
29
  updatedAt: number;
39
30
  }
@@ -8,11 +8,11 @@ export enum SessionDefaultGroup {
8
8
  export type SessionGroupId = SessionDefaultGroup | string;
9
9
 
10
10
  export interface SessionGroupItem {
11
- createdAt: number;
11
+ createdAt: Date;
12
12
  id: string;
13
13
  name: string;
14
- sort?: number;
15
- updatedAt: number;
14
+ sort?: number | null;
15
+ updatedAt: Date;
16
16
  }
17
17
 
18
18
  export type SessionGroups = SessionGroupItem[];
@@ -1,48 +0,0 @@
1
- import { Mock, describe, expect, it, vi } from 'vitest';
2
-
3
- import { CreateMessageParams, MessageModel } from '@/database/_deprecated/models/message';
4
- import { ChatMessage, ChatMessageError, ChatPluginPayload } from '@/types/message';
5
-
6
- import { messageService } from './index';
7
-
8
- // Mock the MessageModel
9
- vi.mock('@/database/_deprecated/models/message', () => {
10
- return {
11
- MessageModel: {
12
- count: vi.fn(),
13
- },
14
- };
15
- });
16
-
17
- describe('MessageService', () => {
18
- beforeEach(() => {
19
- // Reset all mocks before running each test case
20
- vi.resetAllMocks();
21
- });
22
-
23
- describe('hasMessages', () => {
24
- it('should return true if there are messages', async () => {
25
- // Setup
26
- (MessageModel.count as Mock).mockResolvedValue(1);
27
-
28
- // Execute
29
- const hasMessages = await messageService.hasMessages();
30
-
31
- // Assert
32
- expect(MessageModel.count).toHaveBeenCalled();
33
- expect(hasMessages).toBe(true);
34
- });
35
-
36
- it('should return false if there are no messages', async () => {
37
- // Setup
38
- (MessageModel.count as Mock).mockResolvedValue(0);
39
-
40
- // Execute
41
- const hasMessages = await messageService.hasMessages();
42
-
43
- // Assert
44
- expect(MessageModel.count).toHaveBeenCalled();
45
- expect(hasMessages).toBe(false);
46
- });
47
- });
48
- });
File without changes
File without changes