@lobehub/lobehub 2.0.0-next.343 → 2.0.0-next.345

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 (169) 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/Dockerfile +3 -13
  8. package/README.md +3 -5
  9. package/README.zh-CN.md +3 -5
  10. package/changelog/v1.json +24 -0
  11. package/docs/self-hosting/advanced/auth/clerk-to-betterauth.mdx +11 -42
  12. package/docs/self-hosting/advanced/auth/clerk-to-betterauth.zh-CN.mdx +10 -41
  13. package/e2e/src/support/webServer.ts +2 -0
  14. package/locales/ar/error.json +0 -4
  15. package/locales/bg-BG/error.json +0 -4
  16. package/locales/de-DE/error.json +0 -4
  17. package/locales/en-US/error.json +0 -4
  18. package/locales/es-ES/error.json +0 -4
  19. package/locales/fa-IR/error.json +0 -4
  20. package/locales/fr-FR/error.json +0 -4
  21. package/locales/it-IT/error.json +0 -4
  22. package/locales/ja-JP/error.json +0 -4
  23. package/locales/ko-KR/error.json +0 -4
  24. package/locales/nl-NL/error.json +0 -4
  25. package/locales/pl-PL/error.json +0 -4
  26. package/locales/pt-BR/error.json +0 -4
  27. package/locales/ru-RU/error.json +0 -4
  28. package/locales/tr-TR/error.json +0 -4
  29. package/locales/vi-VN/error.json +0 -4
  30. package/locales/zh-CN/error.json +0 -4
  31. package/locales/zh-TW/error.json +0 -4
  32. package/package.json +7 -9
  33. package/packages/builtin-agents/package.json +2 -0
  34. package/packages/builtin-agents/src/agents/agent-builder/index.ts +4 -2
  35. package/packages/builtin-agents/src/agents/group-agent-builder/index.ts +4 -2
  36. package/packages/builtin-agents/src/agents/page-agent/index.ts +5 -2
  37. package/packages/builtin-tool-cloud-sandbox/src/ExecutionRuntime/index.ts +161 -12
  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/model-bank/src/modelProviders/comfyui.ts +0 -1
  44. package/packages/model-bank/src/modelProviders/fal.ts +0 -1
  45. package/packages/types/src/fetch.ts +1 -2
  46. package/packages/utils/src/server/__tests__/auth.test.ts +0 -47
  47. package/packages/utils/src/server/auth.ts +1 -9
  48. package/scripts/_shared/checkDeprecatedClerkEnv.js +42 -0
  49. package/scripts/changelogWorkflow/buildStaticChangelog.ts +2 -1
  50. package/scripts/clerk-to-betterauth/_internal/types.ts +53 -20
  51. package/scripts/clerk-to-betterauth/export-clerk-users-with-api.ts +43 -36
  52. package/scripts/countEnWord.ts +1 -1
  53. package/scripts/electronWorkflow/modifiers/appCode.mts +2 -131
  54. package/scripts/i18nWorkflow/protectedPatterns.ts +1 -2
  55. package/scripts/prebuild.mts +10 -8
  56. package/scripts/serverLauncher/startServer.js +23 -5
  57. package/src/app/(backend)/middleware/auth/index.test.ts +8 -4
  58. package/src/app/(backend)/middleware/auth/index.ts +0 -15
  59. package/src/app/(backend)/middleware/auth/utils.test.ts +0 -28
  60. package/src/app/(backend)/middleware/auth/utils.ts +2 -17
  61. package/src/app/(backend)/webapi/chat/[provider]/route.test.ts +3 -51
  62. package/src/app/(backend)/webapi/models/[provider]/route.test.ts +8 -4
  63. package/src/app/[variants]/(auth)/next-auth/signin/AuthSignInBox.tsx +7 -6
  64. package/src/app/[variants]/(auth)/signup/[[...signup]]/page.tsx +1 -16
  65. package/src/app/[variants]/(main)/home/_layout/Body/Agent/List/index.tsx +1 -1
  66. package/src/app/[variants]/(main)/home/features/InputArea/SkillInstallBanner.tsx +13 -13
  67. package/src/app/[variants]/(main)/home/features/RecentPage/Item.tsx +2 -2
  68. package/src/app/[variants]/(main)/settings/hooks/useCategory.tsx +3 -21
  69. package/src/app/[variants]/(main)/settings/profile/features/AvatarRow.tsx +1 -2
  70. package/src/app/[variants]/(main)/settings/security/index.tsx +1 -22
  71. package/src/app/[variants]/(main)/settings/skill/features/KlavisSkillItem.tsx +12 -14
  72. package/src/app/[variants]/(main)/settings/skill/features/LobehubSkillItem.tsx +8 -14
  73. package/src/app/[variants]/(main)/settings/skill/index.tsx +7 -5
  74. package/src/app/[variants]/(mobile)/me/(home)/__tests__/UserBanner.test.tsx +2 -35
  75. package/src/app/[variants]/(mobile)/me/(home)/__tests__/useCategory.test.tsx +0 -20
  76. package/src/app/[variants]/(mobile)/me/(home)/features/UserBanner.tsx +1 -2
  77. package/src/app/[variants]/(mobile)/me/profile/features/Category.tsx +3 -13
  78. package/src/app/[variants]/(mobile)/settings/_layout/Header.tsx +2 -3
  79. package/src/app/[variants]/share/t/[id]/_layout/index.tsx +1 -1
  80. package/src/app/[variants]/share/t/[id]/index.tsx +1 -1
  81. package/src/app/robots.tsx +1 -1
  82. package/src/envs/auth.ts +2 -27
  83. package/src/envs/llm.ts +2 -2
  84. package/src/features/AgentSetting/AgentPlugin/index.tsx +9 -12
  85. package/src/features/ChatInput/ActionBar/Tools/index.tsx +7 -5
  86. package/src/features/ChatMiniMap/utils.ts +1 -1
  87. package/src/features/CommandMenu/SearchResults.tsx +1 -1
  88. package/src/features/Conversation/ChatList/components/AutoScroll/DebugInspector.tsx +166 -0
  89. package/src/features/Conversation/ChatList/components/AutoScroll/index.tsx +86 -0
  90. package/src/features/Conversation/ChatList/components/VirtualizedList.tsx +11 -17
  91. package/src/features/Conversation/Messages/AgentCouncil/components/AutoScrollShadow.tsx +25 -14
  92. package/src/features/Conversation/Messages/AgentCouncil/components/CouncilMember.tsx +1 -1
  93. package/src/features/IntegrationDetailModal/IntegrationDetailContent.tsx +305 -0
  94. package/src/features/IntegrationDetailModal/index.tsx +21 -283
  95. package/src/features/MCPPluginDetail/Deployment/index.tsx +1 -1
  96. package/src/features/MCPPluginDetail/Schema/Prompts.tsx +1 -1
  97. package/src/features/MCPPluginDetail/Schema/Tools.tsx +1 -1
  98. package/src/features/ProfileEditor/AgentTool.tsx +14 -20
  99. package/src/features/ResourceManager/components/Explorer/MasonryView/MasonryFileItem/NoteFileItem.tsx +1 -1
  100. package/src/features/SkillStore/LobeHubList/index.tsx +50 -87
  101. package/src/features/SkillStore/Search/index.tsx +1 -1
  102. package/src/features/SkillStore/{Content.tsx → SkillStoreContent.tsx} +3 -8
  103. package/src/features/SkillStore/index.tsx +15 -33
  104. package/src/features/User/UserPanel/PanelContent.tsx +0 -8
  105. package/src/features/User/__tests__/PanelContent.test.tsx +1 -35
  106. package/src/features/User/__tests__/UserAvatar.test.tsx +30 -57
  107. package/src/features/User/__tests__/useMenu.test.tsx +2 -43
  108. package/src/layout/AuthProvider/index.tsx +0 -5
  109. package/src/libs/next/config/define-config.ts +6 -0
  110. package/src/libs/next/proxy/createRouteMatcher.test.ts +121 -0
  111. package/src/libs/next/proxy/createRouteMatcher.ts +18 -0
  112. package/src/libs/next/proxy/define-config.ts +4 -53
  113. package/src/libs/next-auth/adapter/index.ts +1 -2
  114. package/src/libs/oidc-provider/provider.test.ts +5 -316
  115. package/src/libs/trpc/lambda/context.test.ts +0 -13
  116. package/src/libs/trpc/lambda/context.ts +3 -22
  117. package/src/libs/trpc/middleware/userAuth.ts +2 -4
  118. package/src/libs/trusted-client/getSessionUser.ts +2 -17
  119. package/src/locales/default/error.ts +0 -6
  120. package/src/locales/default/index.ts +0 -2
  121. package/src/proxy.ts +0 -1
  122. package/src/server/routers/lambda/__tests__/user.test.ts +0 -71
  123. package/src/server/routers/lambda/user.ts +6 -63
  124. package/src/server/services/changelog/index.test.ts +3 -2
  125. package/src/server/services/changelog/index.ts +1 -1
  126. package/src/server/services/user/index.ts +0 -83
  127. package/src/services/chat/index.ts +1 -2
  128. package/src/services/chat/mecha/agentConfigResolver.test.ts +43 -0
  129. package/src/services/chat/mecha/agentConfigResolver.ts +3 -1
  130. package/src/store/chat/slices/aiChat/actions/__tests__/streamingExecutor.test.ts +58 -14
  131. package/src/store/chat/slices/aiChat/actions/streamingExecutor.ts +10 -2
  132. package/src/store/user/slices/auth/action.test.ts +1 -81
  133. package/src/store/user/slices/auth/action.ts +3 -28
  134. package/src/store/user/slices/auth/initialState.ts +1 -18
  135. package/src/store/user/slices/auth/selectors.test.ts +2 -127
  136. package/src/store/user/slices/auth/selectors.ts +1 -21
  137. package/src/utils/errorResponse.ts +1 -4
  138. package/src/utils/markdownToTxt.ts +20 -0
  139. package/locales/ar/clerk.json +0 -545
  140. package/locales/bg-BG/clerk.json +0 -545
  141. package/locales/de-DE/clerk.json +0 -545
  142. package/locales/en-US/clerk.json +0 -545
  143. package/locales/es-ES/clerk.json +0 -545
  144. package/locales/fa-IR/clerk.json +0 -545
  145. package/locales/fr-FR/clerk.json +0 -545
  146. package/locales/it-IT/clerk.json +0 -545
  147. package/locales/ja-JP/clerk.json +0 -545
  148. package/locales/ko-KR/clerk.json +0 -545
  149. package/locales/nl-NL/clerk.json +0 -545
  150. package/locales/pl-PL/clerk.json +0 -545
  151. package/locales/pt-BR/clerk.json +0 -545
  152. package/locales/ru-RU/clerk.json +0 -545
  153. package/locales/tr-TR/clerk.json +0 -545
  154. package/locales/vi-VN/clerk.json +0 -545
  155. package/locales/zh-CN/clerk.json +0 -545
  156. package/locales/zh-TW/clerk.json +0 -545
  157. package/src/app/(backend)/api/webhooks/clerk/__tests__/fixtures/createUser.json +0 -73
  158. package/src/app/(backend)/api/webhooks/clerk/route.ts +0 -95
  159. package/src/app/(backend)/api/webhooks/clerk/validateRequest.ts +0 -22
  160. package/src/app/[variants]/(auth)/login/[[...login]]/page.tsx +0 -27
  161. package/src/app/[variants]/(main)/settings/security/features/ClerkProfile.tsx +0 -67
  162. package/src/features/Conversation/ChatList/components/AutoScroll.tsx +0 -25
  163. package/src/layout/AuthProvider/Clerk/UserUpdater.tsx +0 -40
  164. package/src/layout/AuthProvider/Clerk/index.tsx +0 -54
  165. package/src/layout/AuthProvider/Clerk/useAppearance.ts +0 -133
  166. package/src/libs/clerk-auth/index.test.ts +0 -216
  167. package/src/libs/clerk-auth/index.ts +0 -80
  168. package/src/locales/default/clerk.ts +0 -677
  169. 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
- });