@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.
Files changed (219) hide show
  1. package/.github/workflows/desktop-pr-build.yml +6 -6
  2. package/.github/workflows/release-desktop-beta.yml +4 -4
  3. package/.github/workflows/release.yml +1 -2
  4. package/.github/workflows/test.yml +4 -5
  5. package/.nvmrc +1 -1
  6. package/CHANGELOG.md +42 -0
  7. package/apps/desktop/tsconfig.json +0 -1
  8. package/changelog/v1.json +14 -0
  9. package/e2e/tsconfig.json +0 -1
  10. package/package.json +58 -58
  11. package/packages/const/src/version.ts +3 -3
  12. package/packages/database/src/repositories/dataImporter/deprecated/__tests__/index.test.ts +2 -1
  13. package/packages/database/src/repositories/dataImporter/deprecated/index.ts +7 -1
  14. package/packages/web-crawler/tsconfig.json +0 -1
  15. package/src/app/[variants]/(main)/(mobile)/me/(home)/__tests__/useCategory.test.tsx +9 -0
  16. package/src/app/[variants]/(main)/(mobile)/me/(home)/layout.tsx +0 -2
  17. package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/Actions.tsx +3 -28
  18. package/src/app/[variants]/(main)/chat/_layout/Desktop/index.tsx +0 -2
  19. package/src/app/[variants]/(main)/chat/_layout/Mobile.tsx +1 -5
  20. package/src/app/[variants]/(main)/chat/settings/features/HeaderContent.tsx +2 -62
  21. package/src/app/[variants]/(main)/image/page.tsx +0 -2
  22. package/src/app/[variants]/(main)/profile/_layout/Desktop/index.tsx +23 -24
  23. package/src/app/[variants]/(main)/profile/_layout/Mobile/index.tsx +5 -9
  24. package/src/app/[variants]/(main)/settings/_layout/Desktop/index.tsx +0 -2
  25. package/src/app/[variants]/(main)/settings/_layout/Mobile/index.tsx +0 -2
  26. package/src/app/[variants]/(main)/settings/provider/(list)/ProviderGrid/Card.tsx +1 -1
  27. package/src/app/[variants]/loading/index.tsx +1 -10
  28. package/src/components/Link.tsx +12 -0
  29. package/src/envs/app.ts +5 -8
  30. package/src/features/DataImporter/index.tsx +15 -60
  31. package/src/features/DevPanel/PostgresViewer/usePgTable.ts +3 -2
  32. package/src/hooks/useInterceptingRoutes.test.ts +21 -3
  33. package/src/libs/trpc/client/index.ts +0 -1
  34. package/src/libs/trpc/client/lambda.ts +8 -5
  35. package/src/server/routers/desktop/mcp.ts +1 -3
  36. package/src/server/routers/lambda/config/index.test.ts +2 -2
  37. package/src/server/routers/tools/mcp.ts +2 -3
  38. package/src/server/routers/tools/search.test.ts +1 -7
  39. package/src/server/routers/tools/search.ts +1 -4
  40. package/src/services/__tests__/tool.test.ts +0 -3
  41. package/src/services/aiModel/index.test.ts +0 -3
  42. package/src/services/aiModel/index.ts +1 -7
  43. package/src/services/aiProvider/index.test.ts +0 -3
  44. package/src/services/aiProvider/index.ts +1 -7
  45. package/src/services/chatGroup/index.ts +1 -10
  46. package/src/services/config.ts +1 -65
  47. package/src/services/export/index.ts +1 -4
  48. package/src/services/file/index.ts +1 -11
  49. package/src/services/import/index.ts +1 -7
  50. package/src/services/message/index.ts +1 -11
  51. package/src/services/plugin/index.ts +1 -11
  52. package/src/services/session/index.ts +1 -11
  53. package/src/services/tableViewer/client.ts +12 -15
  54. package/src/services/thread/index.ts +1 -7
  55. package/src/services/topic/index.ts +1 -11
  56. package/src/services/user/index.ts +1 -13
  57. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChat.test.ts +0 -241
  58. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChatV2.test.ts +26 -1
  59. package/src/store/chat/slices/aiChat/actions/__tests__/helpers.ts +3 -1
  60. package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +1 -138
  61. package/src/store/user/slices/common/action.test.ts +1 -4
  62. package/tsconfig.json +0 -1
  63. package/src/app/(backend)/trpc/edge/[trpc]/route.ts +0 -26
  64. package/src/app/[variants]/(main)/(mobile)/me/data/features/Category.tsx +0 -48
  65. package/src/app/[variants]/(main)/(mobile)/me/data/features/Header.tsx +0 -33
  66. package/src/app/[variants]/(main)/(mobile)/me/data/layout.tsx +0 -13
  67. package/src/app/[variants]/(main)/(mobile)/me/data/loading.tsx +0 -5
  68. package/src/app/[variants]/(main)/(mobile)/me/data/page.tsx +0 -29
  69. package/src/app/[variants]/(main)/chat/features/Migration/DBReader.ts +0 -290
  70. package/src/app/[variants]/(main)/chat/features/Migration/ExportConfigButton.tsx +0 -35
  71. package/src/app/[variants]/(main)/chat/features/Migration/Failed.tsx +0 -120
  72. package/src/app/[variants]/(main)/chat/features/Migration/Modal.tsx +0 -81
  73. package/src/app/[variants]/(main)/chat/features/Migration/Start.tsx +0 -108
  74. package/src/app/[variants]/(main)/chat/features/Migration/UpgradeButton.tsx +0 -71
  75. package/src/app/[variants]/(main)/chat/features/Migration/const.ts +0 -15
  76. package/src/app/[variants]/(main)/chat/features/Migration/index.tsx +0 -50
  77. package/src/app/[variants]/loading/Client/Content.tsx +0 -48
  78. package/src/app/[variants]/loading/Client/Error.tsx +0 -27
  79. package/src/app/[variants]/loading/Client/Redirect.tsx +0 -47
  80. package/src/app/[variants]/loading/Client/index.tsx +0 -22
  81. package/src/components/InnerLink.tsx +0 -20
  82. package/src/database/_deprecated/core/__tests__/db-upgrade.test.ts +0 -42
  83. package/src/database/_deprecated/core/__tests__/db.test.ts +0 -79
  84. package/src/database/_deprecated/core/__tests__/model.test.ts +0 -55
  85. package/src/database/_deprecated/core/db.ts +0 -246
  86. package/src/database/_deprecated/core/index.ts +0 -2
  87. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/input.json +0 -55
  88. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/output.json +0 -60
  89. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.test.ts +0 -14
  90. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.ts +0 -22
  91. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/type.ts +0 -105
  92. package/src/database/_deprecated/core/model.ts +0 -218
  93. package/src/database/_deprecated/core/schemas.ts +0 -88
  94. package/src/database/_deprecated/core/types/db.ts +0 -15
  95. package/src/database/_deprecated/models/__DEBUG.ts +0 -124
  96. package/src/database/_deprecated/models/__tests__/file.test.ts +0 -83
  97. package/src/database/_deprecated/models/__tests__/message.test.ts +0 -426
  98. package/src/database/_deprecated/models/__tests__/plugin.test.ts +0 -81
  99. package/src/database/_deprecated/models/__tests__/session.test.ts +0 -253
  100. package/src/database/_deprecated/models/__tests__/sessionGroup.test.ts +0 -220
  101. package/src/database/_deprecated/models/__tests__/topic.test.ts +0 -523
  102. package/src/database/_deprecated/models/__tests__/user.test.ts +0 -82
  103. package/src/database/_deprecated/models/file.ts +0 -51
  104. package/src/database/_deprecated/models/message.ts +0 -277
  105. package/src/database/_deprecated/models/plugin.ts +0 -62
  106. package/src/database/_deprecated/models/session.ts +0 -271
  107. package/src/database/_deprecated/models/sessionGroup.ts +0 -93
  108. package/src/database/_deprecated/models/topic.ts +0 -250
  109. package/src/database/_deprecated/models/user.ts +0 -69
  110. package/src/database/_deprecated/schemas/files.ts +0 -39
  111. package/src/database/_deprecated/schemas/message.ts +0 -50
  112. package/src/database/_deprecated/schemas/plugin.ts +0 -12
  113. package/src/database/_deprecated/schemas/session.ts +0 -54
  114. package/src/database/_deprecated/schemas/sessionGroup.ts +0 -8
  115. package/src/database/_deprecated/schemas/topic.ts +0 -12
  116. package/src/database/_deprecated/schemas/user.ts +0 -40
  117. package/src/features/DataImporter/_deprecated.ts +0 -43
  118. package/src/features/InitClientDB/EnableModal.tsx +0 -118
  119. package/src/features/InitClientDB/ErrorResult.tsx +0 -143
  120. package/src/features/InitClientDB/InitIndicator.tsx +0 -124
  121. package/src/features/InitClientDB/PGliteIcon.tsx +0 -28
  122. package/src/features/InitClientDB/features/DatabaseRepair/Backup.tsx +0 -75
  123. package/src/features/InitClientDB/features/DatabaseRepair/Diagnosis.tsx +0 -98
  124. package/src/features/InitClientDB/features/DatabaseRepair/Repair.tsx +0 -218
  125. package/src/features/InitClientDB/features/DatabaseRepair/index.tsx +0 -91
  126. package/src/features/InitClientDB/index.tsx +0 -37
  127. package/src/libs/trpc/client/edge.ts +0 -26
  128. package/src/libs/trpc/edge/context.ts +0 -71
  129. package/src/libs/trpc/edge/index.ts +0 -45
  130. package/src/libs/trpc/edge/init.ts +0 -26
  131. package/src/libs/trpc/edge/middleware/jwtPayload.test.ts +0 -75
  132. package/src/libs/trpc/edge/middleware/jwtPayload.ts +0 -14
  133. package/src/migrations/FromV0ToV1.ts +0 -10
  134. package/src/migrations/FromV1ToV2/fixtures/input-v1-session.json +0 -191
  135. package/src/migrations/FromV1ToV2/fixtures/output-v2.json +0 -202
  136. package/src/migrations/FromV1ToV2/index.ts +0 -82
  137. package/src/migrations/FromV1ToV2/migrations.test.ts +0 -224
  138. package/src/migrations/FromV1ToV2/types/v1.ts +0 -78
  139. package/src/migrations/FromV1ToV2/types/v2.ts +0 -52
  140. package/src/migrations/FromV2ToV3/fixtures/input-v2-session.json +0 -72
  141. package/src/migrations/FromV2ToV3/fixtures/output-v3-from-v1.json +0 -203
  142. package/src/migrations/FromV2ToV3/fixtures/output-v3.json +0 -74
  143. package/src/migrations/FromV2ToV3/index.ts +0 -30
  144. package/src/migrations/FromV2ToV3/migrations.test.ts +0 -42
  145. package/src/migrations/FromV2ToV3/types/v3.ts +0 -27
  146. package/src/migrations/FromV3ToV4/fixtures/azure-input-v3.json +0 -79
  147. package/src/migrations/FromV3ToV4/fixtures/azure-output-v4.json +0 -75
  148. package/src/migrations/FromV3ToV4/fixtures/ollama-input-v3.json +0 -85
  149. package/src/migrations/FromV3ToV4/fixtures/ollama-output-v4.json +0 -86
  150. package/src/migrations/FromV3ToV4/fixtures/openai-input-v3.json +0 -77
  151. package/src/migrations/FromV3ToV4/fixtures/openai-output-v4.json +0 -77
  152. package/src/migrations/FromV3ToV4/fixtures/openrouter-input-v3.json +0 -82
  153. package/src/migrations/FromV3ToV4/fixtures/openrouter-output-v4.json +0 -85
  154. package/src/migrations/FromV3ToV4/fixtures/output-v4-from-v1.json +0 -203
  155. package/src/migrations/FromV3ToV4/index.ts +0 -102
  156. package/src/migrations/FromV3ToV4/migrations.test.ts +0 -195
  157. package/src/migrations/FromV3ToV4/types/v3.ts +0 -52
  158. package/src/migrations/FromV3ToV4/types/v4.ts +0 -37
  159. package/src/migrations/FromV4ToV5/fixtures/from-v1-to-v5-output.json +0 -245
  160. package/src/migrations/FromV4ToV5/fixtures/function-input-v4.json +0 -96
  161. package/src/migrations/FromV4ToV5/fixtures/function-output-v5.json +0 -120
  162. package/src/migrations/FromV4ToV5/index.ts +0 -58
  163. package/src/migrations/FromV4ToV5/migrations.test.ts +0 -49
  164. package/src/migrations/FromV4ToV5/types/v4.ts +0 -21
  165. package/src/migrations/FromV4ToV5/types/v5.ts +0 -27
  166. package/src/migrations/FromV5ToV6/fixtures/from-v1-to-v6-output.json +0 -247
  167. package/src/migrations/FromV5ToV6/fixtures/session-input-v5.json +0 -81
  168. package/src/migrations/FromV5ToV6/fixtures/session-output-v6.json +0 -85
  169. package/src/migrations/FromV5ToV6/index.ts +0 -61
  170. package/src/migrations/FromV5ToV6/migrations.test.ts +0 -50
  171. package/src/migrations/FromV5ToV6/types/v5.ts +0 -48
  172. package/src/migrations/FromV5ToV6/types/v6.ts +0 -63
  173. package/src/migrations/FromV6ToV7/fixtures/output-v7-from-v1.json +0 -203
  174. package/src/migrations/FromV6ToV7/fixtures/provider-input-v6.json +0 -103
  175. package/src/migrations/FromV6ToV7/fixtures/provider-output-v7.json +0 -118
  176. package/src/migrations/FromV6ToV7/index.ts +0 -101
  177. package/src/migrations/FromV6ToV7/migrations.test.ts +0 -64
  178. package/src/migrations/FromV6ToV7/types/v6.ts +0 -61
  179. package/src/migrations/FromV6ToV7/types/v7.ts +0 -69
  180. package/src/migrations/VersionController.test.ts +0 -88
  181. package/src/migrations/VersionController.ts +0 -67
  182. package/src/migrations/index.ts +0 -61
  183. package/src/server/routers/edge/appStatus.ts +0 -3
  184. package/src/server/routers/edge/index.ts +0 -14
  185. package/src/server/routers/edge/upload.ts +0 -16
  186. package/src/services/aiModel/client.ts +0 -70
  187. package/src/services/aiProvider/client.ts +0 -58
  188. package/src/services/baseClientService/index.ts +0 -9
  189. package/src/services/chatGroup/client.ts +0 -63
  190. package/src/services/export/_deprecated.ts +0 -155
  191. package/src/services/export/client.ts +0 -15
  192. package/src/services/file/_deprecated.test.ts +0 -119
  193. package/src/services/file/_deprecated.ts +0 -80
  194. package/src/services/file/client.test.ts +0 -199
  195. package/src/services/file/client.ts +0 -85
  196. package/src/services/import/_deprecated.ts +0 -115
  197. package/src/services/import/client.test.ts +0 -1015
  198. package/src/services/import/client.ts +0 -64
  199. package/src/services/message/_deprecated.test.ts +0 -398
  200. package/src/services/message/_deprecated.ts +0 -168
  201. package/src/services/message/client.test.ts +0 -410
  202. package/src/services/message/client.ts +0 -192
  203. package/src/services/plugin/_deprecated.test.ts +0 -162
  204. package/src/services/plugin/_deprecated.ts +0 -42
  205. package/src/services/plugin/client.test.ts +0 -177
  206. package/src/services/plugin/client.ts +0 -46
  207. package/src/services/session/_deprecated.test.ts +0 -440
  208. package/src/services/session/_deprecated.ts +0 -190
  209. package/src/services/session/client.test.ts +0 -413
  210. package/src/services/session/client.ts +0 -193
  211. package/src/services/thread/client.ts +0 -51
  212. package/src/services/topic/_deprecated.test.ts +0 -245
  213. package/src/services/topic/_deprecated.ts +0 -75
  214. package/src/services/topic/client.ts +0 -89
  215. package/src/services/topic/pglite.test.ts +0 -212
  216. package/src/services/user/_deprecated.test.ts +0 -101
  217. package/src/services/user/_deprecated.ts +0 -70
  218. package/src/services/user/client.test.ts +0 -111
  219. package/src/services/user/client.ts +0 -104
@@ -1,426 +0,0 @@
1
- import { UIChatMessage } from '@lobechat/types';
2
- import { afterEach, beforeEach, describe, expect, it } from 'vitest';
3
-
4
- import { CreateMessageParams, MessageModel } from '../message';
5
-
6
- describe('MessageModel', () => {
7
- let messageData: CreateMessageParams;
8
-
9
- beforeEach(() => {
10
- // 设置正确结构的消息数据
11
- messageData = {
12
- content: 'Test message content',
13
- role: 'user',
14
- sessionId: 'session1',
15
- topicId: 'topic1',
16
- };
17
- });
18
-
19
- afterEach(async () => {
20
- // 每次测试后清理数据库
21
- await MessageModel.clearTable();
22
- });
23
-
24
- describe('create', () => {
25
- it('should create a message record', async () => {
26
- const result = await MessageModel.create(messageData);
27
-
28
- expect(result).toHaveProperty('id');
29
- // 验证消息是否已添加到数据库
30
- const messageInDb = await MessageModel.findById(result.id);
31
-
32
- expect(messageInDb).toEqual(
33
- expect.objectContaining({
34
- content: messageData.content,
35
- role: messageData.role,
36
- sessionId: messageData.sessionId,
37
- topicId: messageData.topicId,
38
- }),
39
- );
40
- });
41
-
42
- it('should create with tts', async () => {
43
- const result = await MessageModel.create({
44
- content: 'abc',
45
- role: 'assistant',
46
- extra: { translate: { content: 'avc', from: 'a', to: 'f' } },
47
- sessionId: 'a',
48
- });
49
-
50
- // 验证消息是否已添加到数据库
51
- const messageInDb = await MessageModel.findById(result.id);
52
-
53
- expect(messageInDb).toEqual(
54
- expect.objectContaining({
55
- content: 'abc',
56
- role: 'assistant',
57
- translate: { content: 'avc', from: 'a', to: 'f' },
58
- sessionId: 'a',
59
- }),
60
- );
61
- });
62
- });
63
-
64
- describe('batchCreate', () => {
65
- it('should batch create message records', async () => {
66
- const messagesToCreate = [messageData, messageData] as UIChatMessage[];
67
- const results = await MessageModel.batchCreate(messagesToCreate);
68
-
69
- expect(results.success).toBeTruthy();
70
- expect(results.errors).toBeUndefined();
71
-
72
- // 验证消息是否已添加到数据库
73
- for (const message of results.ids!) {
74
- const messageInDb = await MessageModel.findById(message);
75
- expect(messageInDb).toEqual(
76
- expect.objectContaining({
77
- content: messageData.content,
78
- role: messageData.role,
79
- sessionId: messageData.sessionId,
80
- topicId: messageData.topicId,
81
- }),
82
- );
83
- }
84
- });
85
- });
86
-
87
- describe('query', () => {
88
- it('should query messages with pagination', async () => {
89
- // 创建多条消息以测试查询方法
90
- await MessageModel.batchCreate([messageData, messageData] as UIChatMessage[]);
91
-
92
- const queriedMessages = await MessageModel.query({
93
- pageSize: 1,
94
- current: 0,
95
- sessionId: messageData.sessionId,
96
- topicId: messageData.topicId,
97
- });
98
-
99
- expect(queriedMessages).toHaveLength(1);
100
- });
101
-
102
- it('should query correctly without topic id', async () => {
103
- // 创建多条消息以测试查询方法
104
- await MessageModel.batchCreate([messageData, messageData] as UIChatMessage[]);
105
-
106
- const queriedMessages = await MessageModel.query({ sessionId: messageData.sessionId });
107
-
108
- expect(queriedMessages).toHaveLength(0);
109
- });
110
-
111
- it('should query correctly with exactly topic id', async () => {
112
- // 创建多条消息以测试查询方法
113
- await MessageModel.batchCreate([
114
- messageData,
115
- { ...messageData, topicId: undefined },
116
- ] as UIChatMessage[]);
117
-
118
- const queriedMessages = await MessageModel.query({ sessionId: messageData.sessionId });
119
-
120
- expect(queriedMessages).toHaveLength(1);
121
- });
122
-
123
- it('should should have correct order', async () => {
124
- const data: UIChatMessage[] = [
125
- {
126
- role: 'user',
127
- content: '1',
128
- createdAt: 1697120044345,
129
- id: 'NQ7RscYx',
130
- updatedAt: 1697120181827,
131
- extra: {},
132
- meta: {},
133
- sessionId: '1',
134
- },
135
- {
136
- role: 'assistant',
137
- content: '2',
138
- parentId: 'NQ7RscYx',
139
- createdAt: 1697120130973,
140
- id: '9tDAumEx',
141
- updatedAt: 1697120181827,
142
- meta: {},
143
- extra: {
144
- fromModel: 'gpt-3.5-turbo-16k',
145
- },
146
- sessionId: '1',
147
- },
148
- {
149
- role: 'assistant',
150
- content: '3',
151
- parentId: 'tOMH7c5R',
152
- meta: {},
153
- createdAt: 1697120163272,
154
- id: '5Ie5hClg',
155
- updatedAt: 1697120181827,
156
- extra: {
157
- fromModel: 'gpt-3.5-turbo-16k',
158
- },
159
- sessionId: '1',
160
- },
161
- {
162
- role: 'user',
163
- content: '4',
164
- meta: {},
165
- createdAt: 1697120163272,
166
- id: 'tOMH7c5R',
167
- updatedAt: 1697120181827,
168
- extra: {},
169
- sessionId: '1',
170
- },
171
- ];
172
-
173
- await MessageModel.batchCreate(data);
174
-
175
- const queriedMessages = await MessageModel.query({ sessionId: '1' });
176
-
177
- expect(queriedMessages).toEqual([
178
- {
179
- role: 'user',
180
- content: '1',
181
- createdAt: 1697120044345,
182
- id: 'NQ7RscYx',
183
- updatedAt: 1697120181827,
184
- sessionId: '1',
185
- extra: {},
186
- meta: {},
187
- },
188
- {
189
- role: 'assistant',
190
- content: '2',
191
- parentId: 'NQ7RscYx',
192
- createdAt: 1697120130973,
193
- id: '9tDAumEx',
194
- sessionId: '1',
195
- updatedAt: 1697120181827,
196
- meta: {},
197
- extra: {
198
- fromModel: 'gpt-3.5-turbo-16k',
199
- },
200
- },
201
- {
202
- role: 'user',
203
- content: '4',
204
- sessionId: '1',
205
- createdAt: 1697120163272,
206
- id: 'tOMH7c5R',
207
- updatedAt: 1697120181827,
208
- meta: {},
209
- extra: {},
210
- },
211
- {
212
- role: 'assistant',
213
- content: '3',
214
- parentId: 'tOMH7c5R',
215
- meta: {},
216
- createdAt: 1697120163272,
217
- sessionId: '1',
218
- id: '5Ie5hClg',
219
- updatedAt: 1697120181827,
220
- extra: {
221
- fromModel: 'gpt-3.5-turbo-16k',
222
- },
223
- },
224
- ]);
225
- });
226
- });
227
-
228
- describe('findById', () => {
229
- it('should find a message by id', async () => {
230
- const createdMessage = await MessageModel.create(messageData);
231
- const messageInDb = await MessageModel.findById(createdMessage.id);
232
-
233
- expect(messageInDb).toEqual(
234
- expect.objectContaining({
235
- id: createdMessage.id,
236
- content: messageData.content,
237
- }),
238
- );
239
- });
240
- });
241
-
242
- describe('delete', () => {
243
- it('should delete a message', async () => {
244
- const createdMessage = await MessageModel.create(messageData);
245
- await MessageModel.delete(createdMessage.id);
246
-
247
- const messageInDb = await MessageModel.findById(createdMessage.id);
248
- expect(messageInDb).toBeUndefined();
249
- });
250
- });
251
-
252
- describe('bulkDelete', () => {
253
- it('should delete many messages', async () => {
254
- const createdMessage = await MessageModel.create(messageData);
255
- const createdMessage2 = await MessageModel.create(messageData);
256
- await MessageModel.bulkDelete([createdMessage.id, createdMessage2.id]);
257
-
258
- const messageInDb1 = await MessageModel.findById(createdMessage.id);
259
- const messageInDb2 = await MessageModel.findById(createdMessage2.id);
260
- expect(messageInDb1).toBeUndefined();
261
- expect(messageInDb2).toBeUndefined();
262
- });
263
- });
264
-
265
- describe('update', () => {
266
- it('should update a message', async () => {
267
- const createdMessage = await MessageModel.create(messageData);
268
- const updateData = { content: 'Updated content' };
269
-
270
- await MessageModel.update(createdMessage.id, updateData);
271
- const updatedMessage = await MessageModel.findById(createdMessage.id);
272
-
273
- expect(updatedMessage).toHaveProperty('content', 'Updated content');
274
- });
275
-
276
- it('should update a role and plugins', async () => {
277
- const createdMessage = await MessageModel.create(messageData);
278
- const updateData = {
279
- role: 'tool' as const,
280
- plugin: { apiName: 'a', identifier: 'b', arguments: 'abc' },
281
- };
282
-
283
- await MessageModel.update(createdMessage.id, updateData);
284
- const updatedMessage = await MessageModel.findById(createdMessage.id);
285
-
286
- expect(updatedMessage).toHaveProperty('role', 'tool');
287
- });
288
- });
289
-
290
- describe('batchUpdate', () => {
291
- it('should batch update messages', async () => {
292
- const createdMessage1 = await MessageModel.create(messageData);
293
- const createdMessage2 = await MessageModel.create(messageData);
294
- const updateData = { content: 'Batch updated content' };
295
-
296
- const numUpdated = await MessageModel.batchUpdate(
297
- [createdMessage1.id, createdMessage2.id],
298
- updateData,
299
- );
300
-
301
- expect(numUpdated).toBe(2);
302
-
303
- const updatedMessage1 = await MessageModel.findById(createdMessage1.id);
304
- const updatedMessage2 = await MessageModel.findById(createdMessage2.id);
305
-
306
- expect(updatedMessage1).toHaveProperty('content', 'Batch updated content');
307
- expect(updatedMessage2).toHaveProperty('content', 'Batch updated content');
308
- });
309
- });
310
-
311
- describe('batchDelete', () => {
312
- it('should batch delete messages by session id', async () => {
313
- // 创建多条消息以测试批量删除方法
314
- const createdMessage1 = await MessageModel.create(messageData);
315
- const createdMessage2 = await MessageModel.create(messageData);
316
-
317
- await MessageModel.batchDelete(messageData.sessionId, undefined);
318
-
319
- // 验证所有具有给定会话 ID 的消息是否已删除
320
- const messagesInDb = await MessageModel.query({ sessionId: messageData.sessionId });
321
- expect(messagesInDb).toHaveLength(0);
322
- });
323
-
324
- it('should batch delete messages by session id and topic id', async () => {
325
- // 创建多条消息以测试批量删除方法
326
- const createdMessage1 = await MessageModel.create(messageData);
327
- const createdMessage2 = await MessageModel.create(messageData);
328
-
329
- await MessageModel.batchDelete(messageData.sessionId, messageData.topicId);
330
-
331
- // 验证所有具有给定会话 ID 和话题 ID 的消息是否已删除
332
- const messagesInDb = await MessageModel.query({
333
- sessionId: messageData.sessionId,
334
- topicId: messageData.topicId,
335
- });
336
- expect(messagesInDb).toHaveLength(0);
337
- });
338
- });
339
-
340
- describe('duplicateMessages', () => {
341
- it('should duplicate messages and update parentId for copied messages', async () => {
342
- // 创建原始消息和父消息
343
- const parentMessageData: CreateMessageParams = {
344
- content: 'Parent message content',
345
- role: 'user',
346
- sessionId: 'session1',
347
- topicId: undefined,
348
- };
349
- const parentMessage = await MessageModel.create(parentMessageData);
350
-
351
- const childMessageData: CreateMessageParams = {
352
- content: 'Child message content',
353
- role: 'user',
354
- sessionId: 'session1',
355
- parentId: parentMessage.id,
356
- };
357
-
358
- await MessageModel.create(childMessageData);
359
-
360
- // 获取数据库中的消息以进行复制
361
- const originalMessages = await MessageModel.queryAll();
362
-
363
- // 执行复制操作
364
- const duplicatedMessages = await MessageModel.duplicateMessages(originalMessages);
365
-
366
- // 验证复制的消息数量是否正确
367
- expect(duplicatedMessages.length).toBe(originalMessages.length);
368
-
369
- // 验证每个复制的消息是否具有新的唯一ID,并且parentId被正确更新
370
- for (const original of originalMessages) {
371
- const copied = duplicatedMessages.find((m) => m.content === original.content);
372
- expect(copied).toBeDefined();
373
- expect(copied).not.toBeNull();
374
- expect(copied!.id).not.toBe(original.id);
375
- if (original.parentId) {
376
- const originalParent = originalMessages.find((m) => m.id === original.parentId);
377
- expect(originalParent).toBeDefined();
378
- const copiedParent = duplicatedMessages.find(
379
- (m) => m.content === originalParent!.content,
380
- );
381
-
382
- expect(copied!.parentId).toBe(copiedParent!.id);
383
- }
384
- }
385
- });
386
- });
387
-
388
- describe('clearTable', () => {
389
- it('should clear the table', async () => {
390
- await MessageModel.create(messageData);
391
- await MessageModel.clearTable();
392
- const messages = await MessageModel.queryAll();
393
- expect(messages).toHaveLength(0);
394
- });
395
- });
396
-
397
- describe('updatePluginState', () => {
398
- it('should update plugin state', async () => {
399
- const createdMessage = await MessageModel.create(messageData);
400
- await MessageModel.updatePluginState(createdMessage.id, { testKey: 'testValue' });
401
- const updatedMessage = await MessageModel.findById(createdMessage.id);
402
- expect(updatedMessage.pluginState).toHaveProperty('testKey', 'testValue');
403
- });
404
- });
405
-
406
- describe('updatePlugin', () => {
407
- it('should update plugin', async () => {
408
- const value = {
409
- identifier: 'testValue',
410
- arguments: 'abc',
411
- apiName: 'abc',
412
- };
413
- const createdMessage = await MessageModel.create(messageData);
414
- await MessageModel.updatePlugin(createdMessage.id, value);
415
- const updatedMessage = await MessageModel.findById(createdMessage.id);
416
- expect(updatedMessage.plugin).toEqual(value);
417
- });
418
- });
419
-
420
- describe('isEmpty', () => {
421
- it('should return true if table is empty', async () => {
422
- const number = await MessageModel.count();
423
- expect(number === 0).toBeTruthy();
424
- });
425
- });
426
- });
@@ -1,81 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, it } from 'vitest';
2
-
3
- import { DB_Plugin } from '../../schemas/plugin';
4
- import { PluginModel } from '../plugin';
5
-
6
- describe('PluginModel', () => {
7
- let pluginData: DB_Plugin;
8
-
9
- beforeEach(() => {
10
- // 设置正确结构的插件数据
11
- pluginData = {
12
- identifier: 'test-plugin',
13
- id: 'test-plugin',
14
- manifest: {},
15
- type: 'plugin',
16
- };
17
- });
18
-
19
- afterEach(async () => {
20
- // 每次测试后清理数据库
21
- await PluginModel.clear();
22
- });
23
-
24
- describe('getList', () => {
25
- it('should fetch and return the plugin list', async () => {
26
- await PluginModel.create(pluginData);
27
- const plugins = await PluginModel.getList();
28
- expect(plugins).toHaveLength(1);
29
- expect(plugins[0]).toEqual(pluginData);
30
- });
31
- });
32
-
33
- describe('create', () => {
34
- it('should create a plugin record', async () => {
35
- await PluginModel.create(pluginData);
36
- const plugins = await PluginModel.getList();
37
- expect(plugins).toHaveLength(1);
38
- expect(plugins[0]).toEqual(pluginData);
39
- });
40
- });
41
-
42
- describe('batchCreate', () => {
43
- it('should batch create plugin records', async () => {
44
- await PluginModel.batchCreate([pluginData, { ...pluginData, identifier: 'abc' }]);
45
- const plugins = await PluginModel.getList();
46
- expect(plugins).toHaveLength(2);
47
- });
48
- });
49
-
50
- describe('delete', () => {
51
- it('should delete a plugin', async () => {
52
- await PluginModel.create(pluginData);
53
- await PluginModel.delete(pluginData.identifier);
54
- const plugins = await PluginModel.getList();
55
- expect(plugins).toHaveLength(0);
56
- });
57
- });
58
-
59
- describe('update', () => {
60
- it('should update a plugin', async () => {
61
- await PluginModel.create(pluginData);
62
- const updatedPluginData: DB_Plugin = {
63
- ...pluginData,
64
- type: 'customPlugin',
65
- };
66
- await PluginModel.update(pluginData.identifier, updatedPluginData);
67
- const plugins = await PluginModel.getList();
68
- expect(plugins).toHaveLength(1);
69
- expect(plugins[0]).toEqual({ ...updatedPluginData, updatedAt: expect.any(Number) });
70
- });
71
- });
72
-
73
- describe('clear', () => {
74
- it('should clear the table', async () => {
75
- await PluginModel.create(pluginData);
76
- await PluginModel.clear();
77
- const plugins = await PluginModel.getList();
78
- expect(plugins).toHaveLength(0);
79
- });
80
- });
81
- });