@lobehub/lobehub 2.0.0-next.344 → 2.0.0-next.346

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 (185) hide show
  1. package/.cursor/rules/i18n.mdc +1 -1
  2. package/.cursor/rules/modal-imperative.mdc +162 -0
  3. package/.cursor/rules/rules-index.mdc +1 -0
  4. package/.env.example +0 -14
  5. package/.eslintrc.js +8 -1
  6. package/CHANGELOG.md +66 -0
  7. package/CLAUDE.md +4 -2
  8. package/Dockerfile +3 -13
  9. package/README.md +3 -5
  10. package/README.zh-CN.md +3 -5
  11. package/changelog/v1.json +20 -0
  12. package/docs/self-hosting/advanced/auth/clerk-to-betterauth.mdx +11 -42
  13. package/docs/self-hosting/advanced/auth/clerk-to-betterauth.zh-CN.mdx +10 -41
  14. package/e2e/src/support/webServer.ts +2 -0
  15. package/locales/ar/error.json +0 -4
  16. package/locales/bg-BG/error.json +0 -4
  17. package/locales/de-DE/error.json +0 -4
  18. package/locales/en-US/error.json +0 -4
  19. package/locales/es-ES/error.json +0 -4
  20. package/locales/fa-IR/error.json +0 -4
  21. package/locales/fr-FR/error.json +0 -4
  22. package/locales/it-IT/error.json +0 -4
  23. package/locales/ja-JP/error.json +0 -4
  24. package/locales/ko-KR/error.json +0 -4
  25. package/locales/nl-NL/error.json +0 -4
  26. package/locales/pl-PL/error.json +0 -4
  27. package/locales/pt-BR/error.json +0 -4
  28. package/locales/ru-RU/error.json +0 -4
  29. package/locales/tr-TR/error.json +0 -4
  30. package/locales/vi-VN/error.json +0 -4
  31. package/locales/zh-CN/error.json +0 -4
  32. package/locales/zh-TW/error.json +0 -4
  33. package/package.json +12 -12
  34. package/packages/builtin-agents/package.json +2 -0
  35. package/packages/builtin-agents/src/agents/agent-builder/index.ts +4 -2
  36. package/packages/builtin-agents/src/agents/group-agent-builder/index.ts +4 -2
  37. package/packages/builtin-agents/src/agents/page-agent/index.ts +5 -2
  38. package/packages/context-engine/src/engine/messages/MessagesEngine.ts +9 -9
  39. package/packages/context-engine/src/providers/GroupContextInjector.ts +19 -33
  40. package/packages/context-engine/src/providers/__tests__/GroupContextInjector.test.ts +79 -43
  41. package/packages/context-engine/src/providers/__tests__/__snapshots__/GroupContextInjector.test.ts.snap +5 -15
  42. package/packages/database/src/repositories/userMemory/__tests__/UserMemoryTopicRepository.test.ts +24 -3
  43. package/packages/file-loaders/package.json +1 -1
  44. package/packages/file-loaders/src/loadFile.ts +10 -15
  45. package/packages/file-loaders/src/loaders/index.ts +68 -19
  46. package/packages/file-loaders/src/loaders/pdf/__snapshots__/index.test.ts.snap +1 -1
  47. package/packages/file-loaders/test/__snapshots__/loaders.test.ts.snap +1 -1
  48. package/packages/model-bank/src/modelProviders/comfyui.ts +0 -1
  49. package/packages/model-bank/src/modelProviders/fal.ts +0 -1
  50. package/packages/types/src/fetch.ts +1 -2
  51. package/packages/utils/src/server/__tests__/auth.test.ts +0 -47
  52. package/packages/utils/src/server/auth.ts +1 -9
  53. package/pnpm-workspace.yaml +1 -0
  54. package/scripts/_shared/checkDeprecatedClerkEnv.js +42 -0
  55. package/scripts/changelogWorkflow/buildStaticChangelog.ts +2 -1
  56. package/scripts/clerk-to-betterauth/_internal/types.ts +53 -20
  57. package/scripts/clerk-to-betterauth/export-clerk-users-with-api.ts +43 -36
  58. package/scripts/countEnWord.ts +1 -1
  59. package/scripts/electronWorkflow/modifiers/appCode.mts +2 -131
  60. package/scripts/i18nWorkflow/protectedPatterns.ts +1 -2
  61. package/scripts/prebuild.mts +10 -8
  62. package/scripts/serverLauncher/startServer.js +23 -5
  63. package/src/app/(backend)/middleware/auth/index.test.ts +8 -4
  64. package/src/app/(backend)/middleware/auth/index.ts +0 -15
  65. package/src/app/(backend)/middleware/auth/utils.test.ts +0 -28
  66. package/src/app/(backend)/middleware/auth/utils.ts +2 -17
  67. package/src/app/(backend)/webapi/chat/[provider]/route.test.ts +3 -51
  68. package/src/app/(backend)/webapi/models/[provider]/route.test.ts +8 -4
  69. package/src/app/[variants]/(auth)/next-auth/signin/AuthSignInBox.tsx +7 -6
  70. package/src/app/[variants]/(auth)/signup/[[...signup]]/page.tsx +1 -16
  71. package/src/app/[variants]/(main)/home/_layout/Body/Agent/List/index.tsx +1 -1
  72. package/src/app/[variants]/(main)/home/features/InputArea/SkillInstallBanner.tsx +13 -13
  73. package/src/app/[variants]/(main)/home/features/RecentPage/Item.tsx +2 -2
  74. package/src/app/[variants]/(main)/resource/features/store/action.ts +2 -2
  75. package/src/app/[variants]/(main)/resource/features/store/initialState.ts +2 -2
  76. package/src/app/[variants]/(main)/resource/store/action.ts +2 -2
  77. package/src/app/[variants]/(main)/resource/store/initialState.ts +2 -2
  78. package/src/app/[variants]/(main)/settings/hooks/useCategory.tsx +3 -21
  79. package/src/app/[variants]/(main)/settings/profile/features/AvatarRow.tsx +1 -2
  80. package/src/app/[variants]/(main)/settings/security/index.tsx +1 -22
  81. package/src/app/[variants]/(main)/settings/skill/features/KlavisSkillItem.tsx +12 -14
  82. package/src/app/[variants]/(main)/settings/skill/features/LobehubSkillItem.tsx +8 -14
  83. package/src/app/[variants]/(main)/settings/skill/index.tsx +7 -5
  84. package/src/app/[variants]/(mobile)/me/(home)/__tests__/UserBanner.test.tsx +2 -35
  85. package/src/app/[variants]/(mobile)/me/(home)/__tests__/useCategory.test.tsx +0 -20
  86. package/src/app/[variants]/(mobile)/me/(home)/features/UserBanner.tsx +1 -2
  87. package/src/app/[variants]/(mobile)/me/profile/features/Category.tsx +3 -13
  88. package/src/app/[variants]/(mobile)/settings/_layout/Header.tsx +2 -3
  89. package/src/app/[variants]/share/t/[id]/_layout/index.tsx +1 -1
  90. package/src/app/[variants]/share/t/[id]/index.tsx +1 -1
  91. package/src/app/robots.tsx +1 -1
  92. package/src/envs/auth.ts +2 -27
  93. package/src/envs/llm.ts +2 -2
  94. package/src/features/AgentSetting/AgentPlugin/index.tsx +9 -12
  95. package/src/features/ChatInput/ActionBar/Tools/index.tsx +7 -5
  96. package/src/features/ChatMiniMap/utils.ts +1 -1
  97. package/src/features/CommandMenu/SearchResults.tsx +1 -1
  98. package/src/features/Conversation/ChatList/components/AutoScroll/DebugInspector.tsx +166 -0
  99. package/src/features/Conversation/ChatList/components/AutoScroll/index.tsx +86 -0
  100. package/src/features/Conversation/ChatList/components/VirtualizedList.tsx +11 -17
  101. package/src/features/Conversation/Messages/AgentCouncil/components/AutoScrollShadow.tsx +25 -14
  102. package/src/features/Conversation/Messages/AgentCouncil/components/CouncilMember.tsx +1 -1
  103. package/src/features/FileViewer/Renderer/PDF/index.tsx +5 -8
  104. package/src/features/IntegrationDetailModal/IntegrationDetailContent.tsx +305 -0
  105. package/src/features/IntegrationDetailModal/index.tsx +21 -283
  106. package/src/features/MCPPluginDetail/Deployment/index.tsx +1 -1
  107. package/src/features/MCPPluginDetail/Schema/Prompts.tsx +1 -1
  108. package/src/features/MCPPluginDetail/Schema/Tools.tsx +1 -1
  109. package/src/features/ProfileEditor/AgentTool.tsx +14 -20
  110. package/src/features/ResourceManager/components/Explorer/ListView/ListItem/index.tsx +0 -8
  111. package/src/features/ResourceManager/components/Explorer/MasonryView/MasonryFileItem/NoteFileItem.tsx +1 -1
  112. package/src/features/ResourceManager/index.tsx +1 -1
  113. package/src/features/ShareModal/SharePdf/PdfPreview.tsx +4 -4
  114. package/src/features/SkillStore/LobeHubList/index.tsx +50 -87
  115. package/src/features/SkillStore/Search/index.tsx +1 -1
  116. package/src/features/SkillStore/{Content.tsx → SkillStoreContent.tsx} +3 -8
  117. package/src/features/SkillStore/index.tsx +15 -33
  118. package/src/features/User/UserPanel/PanelContent.tsx +0 -8
  119. package/src/features/User/__tests__/PanelContent.test.tsx +1 -35
  120. package/src/features/User/__tests__/UserAvatar.test.tsx +30 -57
  121. package/src/features/User/__tests__/useMenu.test.tsx +2 -43
  122. package/src/layout/AuthProvider/index.tsx +0 -5
  123. package/src/libs/next/config/define-config.ts +20 -15
  124. package/src/libs/next/proxy/createRouteMatcher.test.ts +121 -0
  125. package/src/libs/next/proxy/createRouteMatcher.ts +18 -0
  126. package/src/libs/next/proxy/define-config.ts +4 -53
  127. package/src/libs/next-auth/adapter/index.ts +1 -2
  128. package/src/libs/oidc-provider/provider.test.ts +5 -316
  129. package/src/libs/pdfjs/pdf.worker.ts +1 -0
  130. package/src/libs/pdfjs/worker.ts +12 -0
  131. package/src/libs/trpc/lambda/context.test.ts +0 -13
  132. package/src/libs/trpc/lambda/context.ts +3 -22
  133. package/src/libs/trpc/middleware/userAuth.ts +2 -4
  134. package/src/libs/trusted-client/getSessionUser.ts +2 -17
  135. package/src/locales/default/error.ts +0 -6
  136. package/src/locales/default/index.ts +0 -2
  137. package/src/proxy.ts +0 -1
  138. package/src/server/routers/lambda/__tests__/user.test.ts +0 -71
  139. package/src/server/routers/lambda/user.ts +6 -63
  140. package/src/server/services/changelog/index.test.ts +3 -2
  141. package/src/server/services/changelog/index.ts +1 -1
  142. package/src/server/services/user/index.ts +0 -83
  143. package/src/services/chat/index.ts +1 -2
  144. package/src/services/chat/mecha/agentConfigResolver.test.ts +43 -0
  145. package/src/services/chat/mecha/agentConfigResolver.ts +3 -1
  146. package/src/store/chat/slices/aiChat/actions/__tests__/streamingExecutor.test.ts +58 -14
  147. package/src/store/chat/slices/aiChat/actions/streamingExecutor.ts +10 -2
  148. package/src/store/user/slices/auth/action.test.ts +1 -81
  149. package/src/store/user/slices/auth/action.ts +3 -28
  150. package/src/store/user/slices/auth/initialState.ts +1 -18
  151. package/src/store/user/slices/auth/selectors.test.ts +2 -127
  152. package/src/store/user/slices/auth/selectors.ts +1 -21
  153. package/src/utils/errorResponse.ts +1 -4
  154. package/src/utils/markdownToTxt.ts +20 -0
  155. package/locales/ar/clerk.json +0 -545
  156. package/locales/bg-BG/clerk.json +0 -545
  157. package/locales/de-DE/clerk.json +0 -545
  158. package/locales/en-US/clerk.json +0 -545
  159. package/locales/es-ES/clerk.json +0 -545
  160. package/locales/fa-IR/clerk.json +0 -545
  161. package/locales/fr-FR/clerk.json +0 -545
  162. package/locales/it-IT/clerk.json +0 -545
  163. package/locales/ja-JP/clerk.json +0 -545
  164. package/locales/ko-KR/clerk.json +0 -545
  165. package/locales/nl-NL/clerk.json +0 -545
  166. package/locales/pl-PL/clerk.json +0 -545
  167. package/locales/pt-BR/clerk.json +0 -545
  168. package/locales/ru-RU/clerk.json +0 -545
  169. package/locales/tr-TR/clerk.json +0 -545
  170. package/locales/vi-VN/clerk.json +0 -545
  171. package/locales/zh-CN/clerk.json +0 -545
  172. package/locales/zh-TW/clerk.json +0 -545
  173. package/src/app/(backend)/api/webhooks/clerk/__tests__/fixtures/createUser.json +0 -73
  174. package/src/app/(backend)/api/webhooks/clerk/route.ts +0 -95
  175. package/src/app/(backend)/api/webhooks/clerk/validateRequest.ts +0 -22
  176. package/src/app/[variants]/(auth)/login/[[...login]]/page.tsx +0 -27
  177. package/src/app/[variants]/(main)/settings/security/features/ClerkProfile.tsx +0 -67
  178. package/src/features/Conversation/ChatList/components/AutoScroll.tsx +0 -25
  179. package/src/layout/AuthProvider/Clerk/UserUpdater.tsx +0 -40
  180. package/src/layout/AuthProvider/Clerk/index.tsx +0 -54
  181. package/src/layout/AuthProvider/Clerk/useAppearance.ts +0 -133
  182. package/src/libs/clerk-auth/index.test.ts +0 -216
  183. package/src/libs/clerk-auth/index.ts +0 -80
  184. package/src/locales/default/clerk.ts +0 -677
  185. package/src/server/services/user/index.test.ts +0 -220
@@ -1,220 +0,0 @@
1
- import { UserJSON } from '@clerk/backend';
2
- import { LobeChatDatabase } from '@lobechat/database';
3
- import { beforeEach, describe, expect, it, vi } from 'vitest';
4
-
5
- import { UserModel } from '@/database/models/user';
6
- import { UserItem } from '@/database/schemas';
7
- import { initializeServerAnalytics } from '@/libs/analytics';
8
- import { pino } from '@/libs/logger';
9
-
10
- import { UserService } from './index';
11
-
12
- // Mock @/libs/analytics to avoid server-side environment variable access in client test environment
13
- vi.mock('@/libs/analytics', () => ({
14
- initializeServerAnalytics: vi.fn().mockResolvedValue({
15
- identify: vi.fn(),
16
- track: vi.fn(),
17
- }),
18
- }));
19
-
20
- // Mock dependencies
21
- vi.mock('@/database/models/user', () => {
22
- const MockUserModel = vi.fn();
23
- // @ts-ignore
24
- MockUserModel.findById = vi.fn();
25
- // @ts-ignore
26
- MockUserModel.createUser = vi.fn();
27
- // @ts-ignore
28
- MockUserModel.deleteUser = vi.fn();
29
-
30
- // Mock instance methods
31
- MockUserModel.prototype.updateUser = vi.fn();
32
-
33
- return { UserModel: MockUserModel };
34
- });
35
-
36
- vi.mock('@/libs/logger', () => ({
37
- pino: {
38
- info: vi.fn(),
39
- },
40
- }));
41
-
42
-
43
- let service: UserService;
44
- const mockUserId = 'test-user-id';
45
- const mockDB = {} as LobeChatDatabase;
46
-
47
- // Mock user data
48
- const mockUserJSON: UserJSON = {
49
- id: mockUserId,
50
- email_addresses: [{ id: 'email-1', email_address: 'test@example.com' }],
51
- phone_numbers: [{ id: 'phone-1', phone_number: '+1234567890' }],
52
- primary_email_address_id: 'email-1',
53
- primary_phone_number_id: 'phone-1',
54
- image_url: 'https://example.com/avatar.jpg',
55
- first_name: 'Test',
56
- last_name: 'User',
57
- username: 'testuser',
58
- created_at: '2023-01-01T00:00:00Z',
59
- } as unknown as UserJSON;
60
-
61
- beforeEach(() => {
62
- service = new UserService(mockDB);
63
- vi.clearAllMocks();
64
- });
65
-
66
- describe('UserService', () => {
67
- describe('createUser', () => {
68
- it('should create a new user when user does not exist', async () => {
69
- // Mock user not found
70
- vi.mocked(UserModel.findById).mockResolvedValue(null as any);
71
-
72
- const result = await service.createUser(mockUserId, mockUserJSON);
73
-
74
- expect(UserModel.findById).toHaveBeenCalledWith(expect.anything(), mockUserId);
75
- expect(UserModel.createUser).toHaveBeenCalledWith(
76
- expect.anything(),
77
- expect.objectContaining({
78
- id: mockUserId,
79
- email: 'test@example.com',
80
- phone: '+1234567890',
81
- firstName: 'Test',
82
- lastName: 'User',
83
- username: 'testuser',
84
- avatar: 'https://example.com/avatar.jpg',
85
- clerkCreatedAt: new Date('2023-01-01T00:00:00Z'),
86
- }),
87
- );
88
- // Verify initUser was called (which calls analytics)
89
- expect(initializeServerAnalytics).toHaveBeenCalled();
90
- expect(result).toEqual({
91
- message: 'user created',
92
- success: true,
93
- });
94
- });
95
-
96
- it('should not create user if already exists', async () => {
97
- // Mock user found
98
- vi.mocked(UserModel.findById).mockResolvedValue({ id: mockUserId } as UserItem);
99
-
100
- const result = await service.createUser(mockUserId, mockUserJSON);
101
-
102
- expect(UserModel.findById).toHaveBeenCalledWith(expect.anything(), mockUserId);
103
- expect(UserModel.createUser).not.toHaveBeenCalled();
104
- expect(result).toEqual({
105
- message: 'user not created due to user already existing in the database',
106
- success: false,
107
- });
108
- });
109
-
110
- it('should handle user without primary phone number', async () => {
111
- vi.mocked(UserModel.findById).mockResolvedValue(null as any);
112
-
113
- const userWithoutPrimaryPhone = {
114
- ...mockUserJSON,
115
- primary_phone_number_id: null,
116
- phone_numbers: [{ id: 'phone-1', phone_number: '+1234567890' }],
117
- } as UserJSON;
118
-
119
- await service.createUser(mockUserId, userWithoutPrimaryPhone);
120
-
121
- expect(UserModel.createUser).toHaveBeenCalledWith(
122
- expect.anything(),
123
- expect.objectContaining({
124
- phone: '+1234567890', // Should use first phone number
125
- }),
126
- );
127
- // Verify initUser was called (which calls analytics)
128
- expect(initializeServerAnalytics).toHaveBeenCalled();
129
- });
130
- });
131
-
132
- describe('deleteUser', () => {
133
- it('should delete user', async () => {
134
- await service.deleteUser(mockUserId);
135
-
136
- expect(UserModel.deleteUser).toHaveBeenCalledWith(expect.anything(), mockUserId);
137
- });
138
-
139
- it('should throw error if deletion fails', async () => {
140
- const error = new Error('Deletion failed');
141
- vi.mocked(UserModel.deleteUser).mockRejectedValue(error);
142
-
143
- await expect(service.deleteUser(mockUserId)).rejects.toThrow('Deletion failed');
144
- });
145
- });
146
-
147
- describe('updateUser', () => {
148
- it('should update user when user exists', async () => {
149
- // Mock user found
150
- vi.mocked(UserModel.findById).mockResolvedValue({ id: mockUserId } as UserItem);
151
- const mockUpdateUser = vi.mocked(UserModel.prototype.updateUser);
152
-
153
- const result = await service.updateUser(mockUserId, mockUserJSON);
154
-
155
- expect(UserModel.findById).toHaveBeenCalledWith(expect.anything(), mockUserId);
156
- expect(pino.info).toHaveBeenCalledWith('updating user due to clerk webhook');
157
- expect(mockUpdateUser).toHaveBeenCalledWith(
158
- expect.objectContaining({
159
- id: mockUserId,
160
- email: 'test@example.com',
161
- phone: '+1234567890',
162
- firstName: 'Test',
163
- lastName: 'User',
164
- username: 'testuser',
165
- avatar: 'https://example.com/avatar.jpg',
166
- }),
167
- );
168
- expect(result).toEqual({
169
- message: 'user updated',
170
- success: true,
171
- });
172
- });
173
-
174
- it('should not update user when user does not exist', async () => {
175
- // Mock user not found
176
- vi.mocked(UserModel.findById).mockResolvedValue(null as any);
177
- const mockUpdateUser = vi.mocked(UserModel.prototype.updateUser);
178
-
179
- const result = await service.updateUser(mockUserId, mockUserJSON);
180
-
181
- expect(UserModel.findById).toHaveBeenCalledWith(expect.anything(), mockUserId);
182
- expect(mockUpdateUser).not.toHaveBeenCalled();
183
- expect(result).toEqual({
184
- message: "user not updated due to the user don't existing in the database",
185
- success: false,
186
- });
187
- });
188
-
189
- it('should handle user without primary email and phone', async () => {
190
- vi.mocked(UserModel.findById).mockResolvedValue({ id: mockUserId } as UserItem);
191
- const mockUpdateUser = vi.mocked(UserModel.prototype.updateUser);
192
-
193
- const userWithoutPrimaryContacts = {
194
- ...mockUserJSON,
195
- primary_email_address_id: null,
196
- primary_phone_number_id: null,
197
- email_addresses: [{ id: 'email-1', email_address: 'test@example.com' }],
198
- phone_numbers: [{ id: 'phone-1', phone_number: '+1234567890' }],
199
- } as UserJSON;
200
-
201
- await service.updateUser(mockUserId, userWithoutPrimaryContacts);
202
-
203
- // Verify that the first email and phone are used when primary is not specified
204
- expect(mockUpdateUser).toHaveBeenCalledWith(
205
- expect.objectContaining({
206
- phone: '+1234567890',
207
- }),
208
- );
209
- });
210
-
211
- it('should handle update failure', async () => {
212
- vi.mocked(UserModel.findById).mockResolvedValue({ id: mockUserId } as UserItem);
213
- const mockUpdateUser = vi.mocked(UserModel.prototype.updateUser);
214
- const error = new Error('Update failed');
215
- mockUpdateUser.mockRejectedValue(error);
216
-
217
- await expect(service.updateUser(mockUserId, mockUserJSON)).rejects.toThrow('Update failed');
218
- });
219
- });
220
- });