@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.
- package/CHANGELOG.md +50 -0
- package/changelog/v1.json +18 -0
- package/package.json +1 -1
- package/packages/const/src/version.ts +3 -3
- package/packages/database/src/repositories/dataImporter/deprecated/__tests__/index.test.ts +2 -1
- package/packages/database/src/repositories/dataImporter/deprecated/index.ts +7 -1
- package/src/app/[variants]/(main)/(mobile)/me/(home)/__tests__/useCategory.test.tsx +9 -0
- package/src/app/[variants]/(main)/(mobile)/me/(home)/layout.tsx +0 -2
- package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/Actions.tsx +3 -28
- package/src/app/[variants]/(main)/chat/_layout/Desktop/index.tsx +0 -2
- package/src/app/[variants]/(main)/chat/_layout/Mobile.tsx +1 -5
- package/src/app/[variants]/(main)/chat/settings/features/HeaderContent.tsx +2 -62
- package/src/app/[variants]/(main)/image/features/PromptInput/index.tsx +1 -1
- package/src/app/[variants]/(main)/image/page.tsx +0 -2
- package/src/app/[variants]/(main)/profile/_layout/Desktop/index.tsx +23 -24
- package/src/app/[variants]/(main)/profile/_layout/Mobile/index.tsx +5 -9
- package/src/app/[variants]/(main)/settings/_layout/Desktop/index.tsx +0 -2
- package/src/app/[variants]/(main)/settings/_layout/Mobile/index.tsx +0 -2
- package/src/app/[variants]/(main)/settings/provider/(list)/ProviderGrid/Card.tsx +1 -1
- package/src/app/[variants]/loading/index.tsx +1 -10
- package/src/components/Link.tsx +12 -0
- package/src/envs/app.ts +5 -8
- package/src/features/DataImporter/index.tsx +15 -60
- package/src/features/DevPanel/PostgresViewer/usePgTable.ts +3 -2
- package/src/hooks/useInterceptingRoutes.test.ts +21 -3
- package/src/libs/trpc/client/index.ts +0 -1
- package/src/libs/trpc/client/lambda.ts +8 -5
- package/src/libs/trpc/lambda/context.ts +4 -1
- package/src/server/routers/desktop/mcp.ts +1 -3
- package/src/server/routers/lambda/config/index.test.ts +2 -2
- package/src/server/routers/tools/mcp.ts +2 -3
- package/src/server/routers/tools/search.test.ts +1 -7
- package/src/server/routers/tools/search.ts +1 -4
- package/src/services/__tests__/tool.test.ts +0 -3
- package/src/services/aiModel/index.test.ts +0 -3
- package/src/services/aiModel/index.ts +1 -7
- package/src/services/aiProvider/index.test.ts +0 -3
- package/src/services/aiProvider/index.ts +1 -7
- package/src/services/chatGroup/index.ts +1 -10
- package/src/services/config.ts +1 -65
- package/src/services/export/index.ts +1 -4
- package/src/services/file/index.ts +1 -11
- package/src/services/import/index.ts +1 -7
- package/src/services/message/index.ts +1 -11
- package/src/services/plugin/index.ts +1 -11
- package/src/services/session/index.ts +1 -11
- package/src/services/tableViewer/client.ts +12 -15
- package/src/services/thread/index.ts +1 -7
- package/src/services/topic/index.ts +1 -11
- package/src/services/user/index.ts +1 -13
- package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChat.test.ts +0 -241
- package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChatV2.test.ts +26 -1
- package/src/store/chat/slices/aiChat/actions/__tests__/helpers.ts +3 -1
- package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +1 -138
- package/src/store/user/slices/common/action.test.ts +1 -4
- package/src/app/(backend)/trpc/edge/[trpc]/route.ts +0 -26
- package/src/app/[variants]/(main)/(mobile)/me/data/features/Category.tsx +0 -48
- package/src/app/[variants]/(main)/(mobile)/me/data/features/Header.tsx +0 -33
- package/src/app/[variants]/(main)/(mobile)/me/data/layout.tsx +0 -13
- package/src/app/[variants]/(main)/(mobile)/me/data/loading.tsx +0 -5
- package/src/app/[variants]/(main)/(mobile)/me/data/page.tsx +0 -29
- package/src/app/[variants]/(main)/chat/features/Migration/DBReader.ts +0 -290
- package/src/app/[variants]/(main)/chat/features/Migration/ExportConfigButton.tsx +0 -35
- package/src/app/[variants]/(main)/chat/features/Migration/Failed.tsx +0 -120
- package/src/app/[variants]/(main)/chat/features/Migration/Modal.tsx +0 -81
- package/src/app/[variants]/(main)/chat/features/Migration/Start.tsx +0 -108
- package/src/app/[variants]/(main)/chat/features/Migration/UpgradeButton.tsx +0 -71
- package/src/app/[variants]/(main)/chat/features/Migration/const.ts +0 -15
- package/src/app/[variants]/(main)/chat/features/Migration/index.tsx +0 -50
- package/src/app/[variants]/loading/Client/Content.tsx +0 -48
- package/src/app/[variants]/loading/Client/Error.tsx +0 -27
- package/src/app/[variants]/loading/Client/Redirect.tsx +0 -47
- package/src/app/[variants]/loading/Client/index.tsx +0 -22
- package/src/components/InnerLink.tsx +0 -20
- package/src/database/_deprecated/core/__tests__/db-upgrade.test.ts +0 -42
- package/src/database/_deprecated/core/__tests__/db.test.ts +0 -79
- package/src/database/_deprecated/core/__tests__/model.test.ts +0 -55
- package/src/database/_deprecated/core/db.ts +0 -246
- package/src/database/_deprecated/core/index.ts +0 -2
- package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/input.json +0 -55
- package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/output.json +0 -60
- package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.test.ts +0 -14
- package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.ts +0 -22
- package/src/database/_deprecated/core/migrations/migrateSettingsToUser/type.ts +0 -105
- package/src/database/_deprecated/core/model.ts +0 -218
- package/src/database/_deprecated/core/schemas.ts +0 -88
- package/src/database/_deprecated/core/types/db.ts +0 -15
- package/src/database/_deprecated/models/__DEBUG.ts +0 -124
- package/src/database/_deprecated/models/__tests__/file.test.ts +0 -83
- package/src/database/_deprecated/models/__tests__/message.test.ts +0 -426
- package/src/database/_deprecated/models/__tests__/plugin.test.ts +0 -81
- package/src/database/_deprecated/models/__tests__/session.test.ts +0 -253
- package/src/database/_deprecated/models/__tests__/sessionGroup.test.ts +0 -220
- package/src/database/_deprecated/models/__tests__/topic.test.ts +0 -523
- package/src/database/_deprecated/models/__tests__/user.test.ts +0 -82
- package/src/database/_deprecated/models/file.ts +0 -51
- package/src/database/_deprecated/models/message.ts +0 -277
- package/src/database/_deprecated/models/plugin.ts +0 -62
- package/src/database/_deprecated/models/session.ts +0 -271
- package/src/database/_deprecated/models/sessionGroup.ts +0 -93
- package/src/database/_deprecated/models/topic.ts +0 -250
- package/src/database/_deprecated/models/user.ts +0 -69
- package/src/database/_deprecated/schemas/files.ts +0 -39
- package/src/database/_deprecated/schemas/message.ts +0 -50
- package/src/database/_deprecated/schemas/plugin.ts +0 -12
- package/src/database/_deprecated/schemas/session.ts +0 -54
- package/src/database/_deprecated/schemas/sessionGroup.ts +0 -8
- package/src/database/_deprecated/schemas/topic.ts +0 -12
- package/src/database/_deprecated/schemas/user.ts +0 -40
- package/src/features/DataImporter/_deprecated.ts +0 -43
- package/src/features/InitClientDB/EnableModal.tsx +0 -118
- package/src/features/InitClientDB/ErrorResult.tsx +0 -143
- package/src/features/InitClientDB/InitIndicator.tsx +0 -124
- package/src/features/InitClientDB/PGliteIcon.tsx +0 -28
- package/src/features/InitClientDB/features/DatabaseRepair/Backup.tsx +0 -75
- package/src/features/InitClientDB/features/DatabaseRepair/Diagnosis.tsx +0 -98
- package/src/features/InitClientDB/features/DatabaseRepair/Repair.tsx +0 -218
- package/src/features/InitClientDB/features/DatabaseRepair/index.tsx +0 -91
- package/src/features/InitClientDB/index.tsx +0 -37
- package/src/libs/trpc/client/edge.ts +0 -26
- package/src/libs/trpc/edge/context.ts +0 -71
- package/src/libs/trpc/edge/index.ts +0 -45
- package/src/libs/trpc/edge/init.ts +0 -26
- package/src/libs/trpc/edge/middleware/jwtPayload.test.ts +0 -75
- package/src/libs/trpc/edge/middleware/jwtPayload.ts +0 -14
- package/src/migrations/FromV0ToV1.ts +0 -10
- package/src/migrations/FromV1ToV2/fixtures/input-v1-session.json +0 -191
- package/src/migrations/FromV1ToV2/fixtures/output-v2.json +0 -202
- package/src/migrations/FromV1ToV2/index.ts +0 -82
- package/src/migrations/FromV1ToV2/migrations.test.ts +0 -224
- package/src/migrations/FromV1ToV2/types/v1.ts +0 -78
- package/src/migrations/FromV1ToV2/types/v2.ts +0 -52
- package/src/migrations/FromV2ToV3/fixtures/input-v2-session.json +0 -72
- package/src/migrations/FromV2ToV3/fixtures/output-v3-from-v1.json +0 -203
- package/src/migrations/FromV2ToV3/fixtures/output-v3.json +0 -74
- package/src/migrations/FromV2ToV3/index.ts +0 -30
- package/src/migrations/FromV2ToV3/migrations.test.ts +0 -42
- package/src/migrations/FromV2ToV3/types/v3.ts +0 -27
- package/src/migrations/FromV3ToV4/fixtures/azure-input-v3.json +0 -79
- package/src/migrations/FromV3ToV4/fixtures/azure-output-v4.json +0 -75
- package/src/migrations/FromV3ToV4/fixtures/ollama-input-v3.json +0 -85
- package/src/migrations/FromV3ToV4/fixtures/ollama-output-v4.json +0 -86
- package/src/migrations/FromV3ToV4/fixtures/openai-input-v3.json +0 -77
- package/src/migrations/FromV3ToV4/fixtures/openai-output-v4.json +0 -77
- package/src/migrations/FromV3ToV4/fixtures/openrouter-input-v3.json +0 -82
- package/src/migrations/FromV3ToV4/fixtures/openrouter-output-v4.json +0 -85
- package/src/migrations/FromV3ToV4/fixtures/output-v4-from-v1.json +0 -203
- package/src/migrations/FromV3ToV4/index.ts +0 -102
- package/src/migrations/FromV3ToV4/migrations.test.ts +0 -195
- package/src/migrations/FromV3ToV4/types/v3.ts +0 -52
- package/src/migrations/FromV3ToV4/types/v4.ts +0 -37
- package/src/migrations/FromV4ToV5/fixtures/from-v1-to-v5-output.json +0 -245
- package/src/migrations/FromV4ToV5/fixtures/function-input-v4.json +0 -96
- package/src/migrations/FromV4ToV5/fixtures/function-output-v5.json +0 -120
- package/src/migrations/FromV4ToV5/index.ts +0 -58
- package/src/migrations/FromV4ToV5/migrations.test.ts +0 -49
- package/src/migrations/FromV4ToV5/types/v4.ts +0 -21
- package/src/migrations/FromV4ToV5/types/v5.ts +0 -27
- package/src/migrations/FromV5ToV6/fixtures/from-v1-to-v6-output.json +0 -247
- package/src/migrations/FromV5ToV6/fixtures/session-input-v5.json +0 -81
- package/src/migrations/FromV5ToV6/fixtures/session-output-v6.json +0 -85
- package/src/migrations/FromV5ToV6/index.ts +0 -61
- package/src/migrations/FromV5ToV6/migrations.test.ts +0 -50
- package/src/migrations/FromV5ToV6/types/v5.ts +0 -48
- package/src/migrations/FromV5ToV6/types/v6.ts +0 -63
- package/src/migrations/FromV6ToV7/fixtures/output-v7-from-v1.json +0 -203
- package/src/migrations/FromV6ToV7/fixtures/provider-input-v6.json +0 -103
- package/src/migrations/FromV6ToV7/fixtures/provider-output-v7.json +0 -118
- package/src/migrations/FromV6ToV7/index.ts +0 -101
- package/src/migrations/FromV6ToV7/migrations.test.ts +0 -64
- package/src/migrations/FromV6ToV7/types/v6.ts +0 -61
- package/src/migrations/FromV6ToV7/types/v7.ts +0 -69
- package/src/migrations/VersionController.test.ts +0 -88
- package/src/migrations/VersionController.ts +0 -67
- package/src/migrations/index.ts +0 -61
- package/src/server/routers/edge/appStatus.ts +0 -3
- package/src/server/routers/edge/index.ts +0 -14
- package/src/server/routers/edge/upload.ts +0 -16
- package/src/services/aiModel/client.ts +0 -70
- package/src/services/aiProvider/client.ts +0 -58
- package/src/services/baseClientService/index.ts +0 -9
- package/src/services/chatGroup/client.ts +0 -63
- package/src/services/export/_deprecated.ts +0 -155
- package/src/services/export/client.ts +0 -15
- package/src/services/file/_deprecated.test.ts +0 -119
- package/src/services/file/_deprecated.ts +0 -80
- package/src/services/file/client.test.ts +0 -199
- package/src/services/file/client.ts +0 -85
- package/src/services/import/_deprecated.ts +0 -115
- package/src/services/import/client.test.ts +0 -1015
- package/src/services/import/client.ts +0 -64
- package/src/services/message/_deprecated.test.ts +0 -398
- package/src/services/message/_deprecated.ts +0 -168
- package/src/services/message/client.test.ts +0 -410
- package/src/services/message/client.ts +0 -192
- package/src/services/plugin/_deprecated.test.ts +0 -162
- package/src/services/plugin/_deprecated.ts +0 -42
- package/src/services/plugin/client.test.ts +0 -177
- package/src/services/plugin/client.ts +0 -46
- package/src/services/session/_deprecated.test.ts +0 -440
- package/src/services/session/_deprecated.ts +0 -190
- package/src/services/session/client.test.ts +0 -413
- package/src/services/session/client.ts +0 -193
- package/src/services/thread/client.ts +0 -51
- package/src/services/topic/_deprecated.test.ts +0 -245
- package/src/services/topic/_deprecated.ts +0 -75
- package/src/services/topic/client.ts +0 -89
- package/src/services/topic/pglite.test.ts +0 -212
- package/src/services/user/_deprecated.test.ts +0 -101
- package/src/services/user/_deprecated.ts +0 -70
- package/src/services/user/client.test.ts +0 -111
- 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,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
|
-
};
|