@lobehub/lobehub 2.0.0-next.13 → 2.0.0-next.15
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/.github/workflows/desktop-pr-build.yml +6 -6
- package/.github/workflows/release-desktop-beta.yml +4 -4
- package/.github/workflows/release.yml +1 -2
- package/.github/workflows/test.yml +4 -5
- package/.nvmrc +1 -1
- package/CHANGELOG.md +42 -0
- package/apps/desktop/tsconfig.json +0 -1
- package/changelog/v1.json +14 -0
- package/e2e/tsconfig.json +0 -1
- package/package.json +58 -58
- 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/packages/web-crawler/tsconfig.json +0 -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/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/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/tsconfig.json +0 -1
- 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,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';
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
// This file is for debugging purposes only.
|
|
2
|
-
// DON'T USE IT IN PRODUCTION.
|
|
3
|
-
import { DEFAULT_AGENT_CONFIG } from '@/const/settings';
|
|
4
|
-
import { DBModel } from '@/database/_deprecated/core/types/db';
|
|
5
|
-
import { DB_Message } from '@/database/_deprecated/schemas/message';
|
|
6
|
-
import { DB_Topic } from '@/database/_deprecated/schemas/topic';
|
|
7
|
-
|
|
8
|
-
import { BaseModel } from '../core';
|
|
9
|
-
import { DB_Session, DB_SessionSchema } from '../schemas/session';
|
|
10
|
-
|
|
11
|
-
class _DEBUG_MODEL extends BaseModel<'sessions'> {
|
|
12
|
-
constructor() {
|
|
13
|
-
super('sessions', DB_SessionSchema);
|
|
14
|
-
}
|
|
15
|
-
private getRandomInt(min: number, max: number) {
|
|
16
|
-
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
private randomString(length: number) {
|
|
20
|
-
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
21
|
-
let result = '';
|
|
22
|
-
for (let i = 0; i < length; i++) {
|
|
23
|
-
result += characters.charAt(Math.floor(Math.random() * characters.length));
|
|
24
|
-
}
|
|
25
|
-
return result;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
private randomDate(start: Date, end: Date) {
|
|
29
|
-
return new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime())).getTime();
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
private randomPick<T>(array: T[]): T {
|
|
33
|
-
const randomIndex = this.getRandomInt(0, array.length - 1);
|
|
34
|
-
return array[randomIndex];
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
createRandomData = async ({
|
|
38
|
-
sessionCount = 10,
|
|
39
|
-
topicCount = 2000,
|
|
40
|
-
messageCount = 10_000,
|
|
41
|
-
startIndex = 1,
|
|
42
|
-
}) => {
|
|
43
|
-
const numberOfSessions = sessionCount;
|
|
44
|
-
const numberOfTopics = topicCount;
|
|
45
|
-
const numberOfMessages = messageCount;
|
|
46
|
-
|
|
47
|
-
// Prepare data for batch inserts
|
|
48
|
-
const sessionsData: DBModel<DB_Session>[] = [];
|
|
49
|
-
const topicsData: DBModel<DB_Topic>[] = [];
|
|
50
|
-
const messagesData: DBModel<DB_Message>[] = [];
|
|
51
|
-
|
|
52
|
-
// Prepare sessions
|
|
53
|
-
for (let i = startIndex; i < numberOfSessions + startIndex; i++) {
|
|
54
|
-
sessionsData.push({
|
|
55
|
-
config: DEFAULT_AGENT_CONFIG,
|
|
56
|
-
createdAt: this.randomDate(new Date(2020, 0, 1), new Date()),
|
|
57
|
-
group: 'default',
|
|
58
|
-
id: `sess_${i}`,
|
|
59
|
-
meta: {
|
|
60
|
-
description: `Session Description ${i}`,
|
|
61
|
-
title: `Session Title ${i}`,
|
|
62
|
-
},
|
|
63
|
-
type: 'agent',
|
|
64
|
-
updatedAt: this.randomDate(new Date(2020, 0, 1), new Date()),
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Prepare topics
|
|
69
|
-
for (let i = startIndex; i < numberOfTopics + startIndex; i++) {
|
|
70
|
-
topicsData.push({
|
|
71
|
-
createdAt: this.randomDate(new Date(2020, 0, 1), new Date()),
|
|
72
|
-
favorite: this.getRandomInt(0, 1),
|
|
73
|
-
id: `topic_${i}`,
|
|
74
|
-
sessionId: `sess_${this.getRandomInt(startIndex, numberOfSessions)}`,
|
|
75
|
-
title: `Topic Title ${i}`,
|
|
76
|
-
updatedAt: this.randomDate(new Date(2020, 0, 1), new Date()),
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// Prepare messages
|
|
81
|
-
for (let i = startIndex; i < numberOfMessages + startIndex; i++) {
|
|
82
|
-
messagesData.push({
|
|
83
|
-
content: this.randomString(300),
|
|
84
|
-
createdAt: this.randomDate(new Date(2020, 0, 1), new Date()),
|
|
85
|
-
favorite: this.getRandomInt(0, 1),
|
|
86
|
-
fromModel: 'model',
|
|
87
|
-
id: `msg_${i}`,
|
|
88
|
-
parentId: `msg_${this.getRandomInt(startIndex, numberOfMessages)}`,
|
|
89
|
-
quotaId: `msg_${this.getRandomInt(startIndex, numberOfMessages)}`,
|
|
90
|
-
role: this.randomPick(['user', 'assistant']),
|
|
91
|
-
sessionId: `sess_${this.getRandomInt(startIndex, numberOfSessions)}`,
|
|
92
|
-
topicId: `topic_${this.getRandomInt(startIndex, numberOfTopics)}`,
|
|
93
|
-
updatedAt: this.randomDate(new Date(2020, 0, 1), new Date()),
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// Start a transaction for batch inserts
|
|
98
|
-
await this.db.transaction(
|
|
99
|
-
'rw',
|
|
100
|
-
this.db.sessions,
|
|
101
|
-
this.db.topics,
|
|
102
|
-
this.db.messages,
|
|
103
|
-
async () => {
|
|
104
|
-
// Batch insert sessions, topics, and messages
|
|
105
|
-
console.log('开始插入 sessions');
|
|
106
|
-
console.time('插入sessions');
|
|
107
|
-
await this.db.sessions.bulkAdd(sessionsData);
|
|
108
|
-
console.timeEnd('插入sessions');
|
|
109
|
-
|
|
110
|
-
console.log('开始插入 topics');
|
|
111
|
-
console.time('插入topics');
|
|
112
|
-
await this.db.topics.bulkAdd(topicsData);
|
|
113
|
-
console.timeEnd('插入topics');
|
|
114
|
-
|
|
115
|
-
console.log('开始插入 messages');
|
|
116
|
-
console.time('插入messages');
|
|
117
|
-
await this.db.messages.bulkAdd(messagesData);
|
|
118
|
-
console.timeEnd('插入messages');
|
|
119
|
-
},
|
|
120
|
-
);
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
export const DEBUG_MODEL = new _DEBUG_MODEL();
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
2
|
-
|
|
3
|
-
import { BrowserDB } from '../../core/db';
|
|
4
|
-
import { DB_File } from '../../schemas/files';
|
|
5
|
-
import { FileModel } from '../file';
|
|
6
|
-
|
|
7
|
-
// Assuming LocalDB is already mocked or using an in-memory database
|
|
8
|
-
// and LocalFileSchema has been imported correctly.
|
|
9
|
-
|
|
10
|
-
describe('_FileModel', () => {
|
|
11
|
-
let fileData: DB_File;
|
|
12
|
-
|
|
13
|
-
beforeEach(() => {
|
|
14
|
-
// Set up file data with the correct structure according to LocalFileSchema
|
|
15
|
-
fileData = {
|
|
16
|
-
data: new ArrayBuffer(10),
|
|
17
|
-
fileType: 'image/png',
|
|
18
|
-
name: 'test.png',
|
|
19
|
-
saveMode: 'local',
|
|
20
|
-
size: 10,
|
|
21
|
-
// url is optional, only needed if saveMode is 'url'
|
|
22
|
-
};
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
afterEach(async () => {
|
|
26
|
-
// Clean up the database after each test
|
|
27
|
-
const db = new BrowserDB();
|
|
28
|
-
await db.files.clear();
|
|
29
|
-
db.close();
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
it('should create a file record', async () => {
|
|
33
|
-
// First, create a file to test the create method
|
|
34
|
-
const fileData: DB_File = {
|
|
35
|
-
data: new ArrayBuffer(10),
|
|
36
|
-
fileType: 'image/png',
|
|
37
|
-
name: 'test.png',
|
|
38
|
-
saveMode: 'local',
|
|
39
|
-
size: 10,
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
const result = await FileModel.create(fileData);
|
|
43
|
-
|
|
44
|
-
expect(result).toHaveProperty('id');
|
|
45
|
-
expect(result.id).toMatch(/^file-/);
|
|
46
|
-
|
|
47
|
-
// Verify that the file has been added to the database
|
|
48
|
-
const fileInDb = await FileModel.findById(result.id);
|
|
49
|
-
|
|
50
|
-
expect(fileInDb).toEqual(expect.objectContaining(fileData));
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
it('should find a file by id', async () => {
|
|
54
|
-
// First, create a file to test the findById method
|
|
55
|
-
const createdFile = await FileModel.create(fileData);
|
|
56
|
-
const foundFile = await FileModel.findById(createdFile.id);
|
|
57
|
-
|
|
58
|
-
expect(foundFile).toEqual(expect.objectContaining(fileData));
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
it('should delete a file by id', async () => {
|
|
62
|
-
// First, create a file to test the delete method
|
|
63
|
-
const createdFile = await FileModel.create(fileData);
|
|
64
|
-
await FileModel.delete(createdFile.id);
|
|
65
|
-
|
|
66
|
-
// Verify that the file has been removed from the database
|
|
67
|
-
const fileInDb = await FileModel.findById(createdFile.id);
|
|
68
|
-
expect(fileInDb).toBeUndefined();
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
it('should clear all files', async () => {
|
|
72
|
-
// First, create a file to test the delete method
|
|
73
|
-
const createdFile = await FileModel.create(fileData);
|
|
74
|
-
const createdFile2 = await FileModel.create(fileData);
|
|
75
|
-
await FileModel.clear();
|
|
76
|
-
|
|
77
|
-
// Verify that the file has been removed from the database
|
|
78
|
-
const fileInDb = await FileModel.findById(createdFile.id);
|
|
79
|
-
expect(fileInDb).toBeUndefined();
|
|
80
|
-
const fileInDb2 = await FileModel.findById(createdFile2.id);
|
|
81
|
-
expect(fileInDb2).toBeUndefined();
|
|
82
|
-
});
|
|
83
|
-
});
|