@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.
- package/CHANGELOG.md +50 -0
- package/README.ja-JP.md +8 -8
- package/README.md +8 -8
- package/README.zh-CN.md +8 -8
- package/changelog/v1.json +18 -0
- package/next.config.mjs +4 -1
- package/package.json +5 -3
- package/scripts/migrateClientDB/compile-migrations.ts +14 -0
- package/src/app/(main)/(mobile)/me/(home)/layout.tsx +2 -0
- package/src/app/(main)/chat/_layout/Desktop/index.tsx +3 -2
- package/src/app/(main)/chat/_layout/Mobile.tsx +5 -3
- package/src/app/(main)/chat/features/Migration/DBReader.ts +290 -0
- package/src/app/(main)/chat/features/Migration/UpgradeButton.tsx +4 -8
- package/src/app/(main)/chat/features/Migration/index.tsx +26 -15
- package/src/app/(main)/settings/_layout/Desktop/index.tsx +2 -0
- package/src/app/loading/Client/Content.tsx +11 -1
- package/src/app/loading/Client/Error.tsx +27 -0
- package/src/app/loading/stage.ts +8 -0
- package/src/components/FullscreenLoading/index.tsx +4 -3
- package/src/const/version.ts +1 -0
- package/src/database/client/db.test.ts +172 -0
- package/src/database/client/db.ts +246 -0
- package/src/database/client/migrations.json +289 -0
- package/src/features/InitClientDB/EnableModal.tsx +111 -0
- package/src/features/InitClientDB/ErrorResult.tsx +125 -0
- package/src/features/InitClientDB/InitIndicator.tsx +124 -0
- package/src/features/InitClientDB/PGliteSVG.tsx +22 -0
- package/src/features/InitClientDB/index.tsx +37 -0
- package/src/hooks/useCheckPluginsIsInstalled.ts +2 -2
- package/src/hooks/useFetchInstalledPlugins.ts +2 -2
- package/src/hooks/useFetchMessages.ts +2 -2
- package/src/hooks/useFetchSessions.ts +2 -2
- package/src/hooks/useFetchThreads.ts +2 -2
- package/src/hooks/useFetchTopics.ts +2 -2
- package/src/layout/GlobalProvider/StoreInitialization.tsx +2 -2
- package/src/services/baseClientService/index.ts +9 -0
- package/src/services/debug.ts +32 -34
- package/src/services/file/{client.test.ts → _deprecated.test.ts} +1 -1
- package/src/services/file/index.ts +6 -2
- package/src/services/file/pglite.test.ts +198 -0
- package/src/services/file/pglite.ts +84 -0
- package/src/services/file/type.ts +4 -3
- package/src/services/github.ts +17 -0
- package/src/services/import/index.ts +6 -2
- package/src/services/import/pglite.test.ts +997 -0
- package/src/services/import/pglite.ts +34 -0
- package/src/services/message/{client.test.ts → _deprecated.test.ts} +1 -1
- package/src/services/message/{client.ts → _deprecated.ts} +2 -0
- package/src/services/message/index.ts +6 -2
- package/src/services/message/pglite.test.ts +430 -0
- package/src/services/message/pglite.ts +118 -0
- package/src/services/message/server.ts +9 -9
- package/src/services/message/type.ts +3 -4
- package/src/services/plugin/{client.test.ts → _deprecated.test.ts} +1 -1
- package/src/services/plugin/index.ts +6 -2
- package/src/services/plugin/pglite.test.ts +175 -0
- package/src/services/plugin/pglite.ts +51 -0
- package/src/services/session/{client.test.ts → _deprecated.test.ts} +1 -1
- package/src/services/session/{client.ts → _deprecated.ts} +1 -1
- package/src/services/session/index.ts +6 -2
- package/src/services/session/pglite.test.ts +411 -0
- package/src/services/session/pglite.ts +184 -0
- package/src/services/session/type.ts +14 -1
- package/src/services/topic/client.test.ts +1 -1
- package/src/services/topic/index.ts +6 -3
- package/src/services/topic/pglite.test.ts +212 -0
- package/src/services/topic/pglite.ts +85 -0
- package/src/services/user/{client.test.ts → _deprecated.test.ts} +1 -2
- package/src/services/user/index.ts +8 -2
- package/src/services/user/pglite.test.ts +98 -0
- package/src/services/user/pglite.ts +92 -0
- package/src/store/chat/slices/builtinTool/action.test.ts +4 -5
- package/src/store/global/actions/clientDb.ts +51 -0
- package/src/store/global/initialState.ts +13 -0
- package/src/store/global/selectors.ts +24 -3
- package/src/store/global/store.ts +3 -1
- package/src/store/session/slices/sessionGroup/reducer.test.ts +6 -6
- package/src/store/user/slices/common/action.test.ts +1 -1
- package/src/store/user/slices/common/action.ts +2 -4
- package/src/types/clientDB.ts +29 -0
- package/src/types/importer.ts +17 -5
- package/src/types/meta.ts +0 -9
- package/src/types/session/sessionGroup.ts +3 -3
- package/src/services/message/index.test.ts +0 -48
- /package/src/services/file/{client.ts → _deprecated.ts} +0 -0
- /package/src/services/import/{client.ts → _deprecated.ts} +0 -0
- /package/src/services/plugin/{client.ts → _deprecated.ts} +0 -0
- /package/src/services/topic/{client.ts → _deprecated.ts} +0 -0
- /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
|
14
|
-
updatedAt: Date
|
13
|
+
createdAt: new Date(),
|
14
|
+
updatedAt: new Date(),
|
15
15
|
},
|
16
16
|
{
|
17
17
|
id: nanoid(),
|
18
18
|
name: 'Group 2',
|
19
|
-
createdAt: Date
|
20
|
-
updatedAt: Date
|
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
|
30
|
-
updatedAt: Date
|
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/
|
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 {
|
49
|
+
const { userClientService } = await import('@/services/user');
|
50
50
|
|
51
|
-
|
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;
|
package/src/types/importer.ts
CHANGED
@@ -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?:
|
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:
|
11
|
+
createdAt: Date;
|
12
12
|
id: string;
|
13
13
|
name: string;
|
14
|
-
sort?: number;
|
15
|
-
updatedAt:
|
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
|
File without changes
|
File without changes
|
File without changes
|