@lobehub/lobehub 2.0.0-next.322 → 2.0.0-next.323

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 (106) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/apps/desktop/src/main/core/infrastructure/UpdaterManager.ts +9 -76
  3. package/apps/desktop/src/main/core/infrastructure/__tests__/UpdaterManager.test.ts +0 -1
  4. package/apps/desktop/src/main/modules/updater/configs.ts +0 -4
  5. package/changelog/v1.json +15 -0
  6. package/e2e/src/mocks/llm/index.ts +3 -3
  7. package/locales/ar/common.json +5 -0
  8. package/locales/ar/error.json +10 -1
  9. package/locales/bg-BG/common.json +5 -0
  10. package/locales/bg-BG/error.json +10 -1
  11. package/locales/de-DE/common.json +5 -0
  12. package/locales/de-DE/error.json +10 -1
  13. package/locales/en-US/common.json +5 -0
  14. package/locales/es-ES/common.json +5 -0
  15. package/locales/es-ES/error.json +10 -1
  16. package/locales/fa-IR/common.json +5 -0
  17. package/locales/fa-IR/error.json +10 -1
  18. package/locales/fr-FR/common.json +5 -0
  19. package/locales/fr-FR/error.json +10 -1
  20. package/locales/it-IT/common.json +5 -0
  21. package/locales/it-IT/error.json +10 -1
  22. package/locales/ja-JP/common.json +5 -0
  23. package/locales/ja-JP/error.json +10 -1
  24. package/locales/ko-KR/common.json +5 -0
  25. package/locales/ko-KR/error.json +10 -1
  26. package/locales/nl-NL/common.json +5 -0
  27. package/locales/nl-NL/error.json +10 -1
  28. package/locales/pl-PL/common.json +5 -0
  29. package/locales/pl-PL/error.json +10 -1
  30. package/locales/pt-BR/common.json +5 -0
  31. package/locales/pt-BR/error.json +10 -1
  32. package/locales/ru-RU/common.json +5 -0
  33. package/locales/ru-RU/error.json +10 -1
  34. package/locales/tr-TR/common.json +5 -0
  35. package/locales/tr-TR/error.json +10 -1
  36. package/locales/vi-VN/common.json +5 -0
  37. package/locales/vi-VN/error.json +10 -1
  38. package/locales/zh-CN/common.json +5 -0
  39. package/locales/zh-TW/common.json +5 -0
  40. package/locales/zh-TW/error.json +10 -1
  41. package/package.json +2 -2
  42. package/packages/business/const/src/branding.ts +1 -0
  43. package/packages/business/const/src/llm.ts +2 -1
  44. package/packages/const/src/settings/llm.ts +2 -1
  45. package/packages/const/src/settings/systemAgent.ts +12 -7
  46. package/packages/database/src/models/agent.ts +18 -1
  47. package/packages/database/src/models/chatGroup.ts +18 -1
  48. package/packages/database/src/types/chatGroup.ts +1 -0
  49. package/packages/model-bank/package.json +1 -1
  50. package/packages/model-bank/src/aiModels/index.ts +2 -2
  51. package/packages/model-bank/src/aiModels/lobehub/chat/anthropic.ts +256 -0
  52. package/packages/model-bank/src/aiModels/lobehub/chat/deepseek.ts +45 -0
  53. package/packages/model-bank/src/aiModels/lobehub/chat/google.ts +267 -0
  54. package/packages/model-bank/src/aiModels/lobehub/chat/index.ts +26 -0
  55. package/packages/model-bank/src/aiModels/lobehub/chat/minimax.ts +75 -0
  56. package/packages/model-bank/src/aiModels/lobehub/chat/moonshot.ts +28 -0
  57. package/packages/model-bank/src/aiModels/lobehub/chat/openai.ts +345 -0
  58. package/packages/model-bank/src/aiModels/lobehub/chat/xai.ts +32 -0
  59. package/packages/model-bank/src/aiModels/lobehub/image.ts +240 -0
  60. package/packages/model-bank/src/aiModels/lobehub/index.ts +10 -0
  61. package/packages/model-bank/src/aiModels/lobehub/utils.ts +58 -0
  62. package/packages/model-bank/src/modelProviders/index.ts +10 -10
  63. package/packages/model-runtime/src/core/streams/qwen.test.ts +320 -0
  64. package/packages/model-runtime/src/core/streams/qwen.ts +19 -10
  65. package/packages/types/package.json +1 -1
  66. package/packages/types/src/agentGroup/index.ts +2 -0
  67. package/packages/types/src/discover/assistants.ts +9 -0
  68. package/packages/types/src/discover/fork.ts +163 -0
  69. package/packages/types/src/discover/groupAgents.ts +13 -4
  70. package/packages/types/src/discover/index.ts +9 -0
  71. package/src/app/[variants]/(auth)/_layout/index.tsx +2 -1
  72. package/src/app/[variants]/(auth)/auth-error/page.tsx +5 -5
  73. package/src/app/[variants]/(main)/agent/_layout/Sidebar/Topic/List/Item/index.tsx +1 -2
  74. package/src/app/[variants]/(main)/community/(detail)/agent/features/Header.tsx +37 -0
  75. package/src/app/[variants]/(main)/community/(detail)/agent/features/Sidebar/ActionButton/ForkAndChat.tsx +133 -0
  76. package/src/app/[variants]/(main)/community/(detail)/agent/features/Sidebar/ActionButton/index.tsx +2 -2
  77. package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Details/index.tsx +7 -10
  78. package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Sidebar/ActionButton/ForkGroupAndChat.tsx +208 -0
  79. package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Sidebar/ActionButton/index.tsx +2 -2
  80. package/src/app/[variants]/(main)/community/(detail)/user/features/DetailProvider.tsx +2 -0
  81. package/src/app/[variants]/(main)/community/(detail)/user/features/UserContent.tsx +7 -0
  82. package/src/app/[variants]/(main)/community/(detail)/user/features/UserForkedAgentGroups.tsx +63 -0
  83. package/src/app/[variants]/(main)/community/(detail)/user/features/UserForkedAgents.tsx +61 -0
  84. package/src/app/[variants]/(main)/community/(detail)/user/index.tsx +3 -1
  85. package/src/app/[variants]/(main)/group/_layout/Sidebar/Topic/List/Item/index.tsx +1 -2
  86. package/src/app/[variants]/(main)/settings/profile/index.tsx +92 -68
  87. package/src/app/[variants]/(mobile)/chat/features/Topic/index.tsx +2 -1
  88. package/src/features/CommandMenu/AskAgentCommands.tsx +105 -0
  89. package/src/features/CommandMenu/CommandMenuContext.tsx +57 -38
  90. package/src/features/CommandMenu/components/CommandInput.tsx +43 -9
  91. package/src/features/CommandMenu/index.tsx +89 -27
  92. package/src/features/CommandMenu/types.ts +6 -0
  93. package/src/features/CommandMenu/useCommandMenu.ts +62 -39
  94. package/src/locales/default/common.ts +5 -0
  95. package/src/locales/default/discover.ts +371 -0
  96. package/src/server/globalConfig/parseMemoryExtractionConfig.ts +7 -8
  97. package/src/server/routers/lambda/agent.ts +14 -0
  98. package/src/server/routers/lambda/agentGroup.ts +19 -3
  99. package/src/server/routers/lambda/market/agent.ts +234 -26
  100. package/src/server/routers/lambda/market/agentGroup.ts +204 -1
  101. package/src/server/services/discover/index.ts +52 -2
  102. package/src/services/agent.ts +8 -0
  103. package/src/services/chatGroup/index.ts +8 -0
  104. package/src/services/marketApi.ts +78 -0
  105. package/src/store/user/slices/settings/selectors/__snapshots__/settings.test.ts.snap +12 -12
  106. package/packages/model-bank/src/aiModels/lobehub.ts +0 -1315
package/CHANGELOG.md CHANGED
@@ -2,6 +2,61 @@
2
2
 
3
3
  # Changelog
4
4
 
5
+ ## [Version 2.0.0-next.323](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.322...v2.0.0-next.323)
6
+
7
+ <sup>Released on **2026-01-20**</sup>
8
+
9
+ #### ♻ Code Refactoring
10
+
11
+ - **misc**: Optimize lobehub models and default configuration.
12
+
13
+ #### ✨ Features
14
+
15
+ - **misc**: Add the agents and agents group fork feature.
16
+
17
+ #### 🐛 Bug Fixes
18
+
19
+ - **model-runtime**: Fix Qwen parallel tool calls arguments incorrectly merged.
20
+ - **topic**: Correct topic item href route for agent and group pages.
21
+ - **misc**: Fix Topic component causing stack overflow and freezing the app, simplify updater config logic, slove the nuqs error in commnuity agent group page.
22
+
23
+ #### 💄 Styles
24
+
25
+ - **misc**: Optimize profile settings skeleton screen.
26
+
27
+ <br/>
28
+
29
+ <details>
30
+ <summary><kbd>Improvements and Fixes</kbd></summary>
31
+
32
+ #### Code refactoring
33
+
34
+ - **misc**: Optimize lobehub models and default configuration, closes [#11621](https://github.com/lobehub/lobe-chat/issues/11621) ([5074fbe](https://github.com/lobehub/lobe-chat/commit/5074fbe))
35
+
36
+ #### What's improved
37
+
38
+ - **misc**: Add the agents and agents group fork feature, closes [#11652](https://github.com/lobehub/lobe-chat/issues/11652) ([b1c3b83](https://github.com/lobehub/lobe-chat/commit/b1c3b83))
39
+
40
+ #### What's fixed
41
+
42
+ - **model-runtime**: Fix Qwen parallel tool calls arguments incorrectly merged, closes [#11649](https://github.com/lobehub/lobe-chat/issues/11649) ([ddbe661](https://github.com/lobehub/lobe-chat/commit/ddbe661))
43
+ - **topic**: Correct topic item href route for agent and group pages, closes [#11607](https://github.com/lobehub/lobe-chat/issues/11607) ([2fffe8b](https://github.com/lobehub/lobe-chat/commit/2fffe8b))
44
+ - **misc**: Fix Topic component causing stack overflow and freezing the app, closes [#11609](https://github.com/lobehub/lobe-chat/issues/11609) ([600cb85](https://github.com/lobehub/lobe-chat/commit/600cb85))
45
+ - **misc**: Simplify updater config logic, closes [#11636](https://github.com/lobehub/lobe-chat/issues/11636) ([5c645f0](https://github.com/lobehub/lobe-chat/commit/5c645f0))
46
+ - **misc**: Slove the nuqs error in commnuity agent group page, closes [#11651](https://github.com/lobehub/lobe-chat/issues/11651) ([1c29bca](https://github.com/lobehub/lobe-chat/commit/1c29bca))
47
+
48
+ #### Styles
49
+
50
+ - **misc**: Optimize profile settings skeleton screen, closes [#11656](https://github.com/lobehub/lobe-chat/issues/11656) ([e61ae85](https://github.com/lobehub/lobe-chat/commit/e61ae85))
51
+
52
+ </details>
53
+
54
+ <div align="right">
55
+
56
+ [![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
57
+
58
+ </div>
59
+
5
60
  ## [Version 2.0.0-next.322](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.321...v2.0.0-next.322)
6
61
 
7
62
  <sup>Released on **2026-01-20**</sup>
@@ -14,10 +14,8 @@ import { createLogger } from '@/utils/logger';
14
14
 
15
15
  import type { App as AppCore } from '../App';
16
16
 
17
- // Allow forcing dev update config via env (for testing updates in packaged app)
18
17
  const FORCE_DEV_UPDATE_CONFIG = getDesktopEnv().FORCE_DEV_UPDATE_CONFIG;
19
18
 
20
- // Create logger
21
19
  const logger = createLogger('core:UpdaterManager');
22
20
 
23
21
  export class UpdaterManager {
@@ -31,11 +29,10 @@ export class UpdaterManager {
31
29
  constructor(app: AppCore) {
32
30
  this.app = app;
33
31
 
34
- // 设置日志
35
32
  log.transports.file.level = 'info';
36
33
  autoUpdater.logger = log;
37
34
 
38
- logger.debug(`[Updater] Log file should be at: ${log.transports.file.getFile().path}`); // 打印路径
35
+ logger.debug(`[Updater] Log file should be at: ${log.transports.file.getFile().path}`);
39
36
  }
40
37
 
41
38
  get mainWindow() {
@@ -44,50 +41,36 @@ export class UpdaterManager {
44
41
 
45
42
  public initialize = async () => {
46
43
  logger.debug('Initializing UpdaterManager');
47
- // If updates are disabled and in production environment, don't initialize updates
48
- if (!updaterConfig.enableAppUpdate && !isDev) {
44
+
45
+ if (!updaterConfig.enableAppUpdate) {
49
46
  logger.info('App updates are disabled, skipping updater initialization');
50
47
  return;
51
48
  }
52
49
 
53
- // Configure autoUpdater
54
- autoUpdater.autoDownload = false; // Set to false, we'll control downloads manually
50
+ autoUpdater.autoDownload = false;
55
51
  autoUpdater.autoInstallOnAppQuit = false;
56
52
  autoUpdater.allowDowngrade = false;
57
53
 
58
- // Enable test mode in development environment or when forced via env
59
- // IMPORTANT: This must be set BEFORE channel configuration so that
60
- // dev-app-update.yml takes precedence over programmatic configuration
61
54
  const useDevConfig = isDev || FORCE_DEV_UPDATE_CONFIG;
62
55
  if (useDevConfig) {
63
- // In dev mode, use dev-app-update.yml for all configuration including channel
64
- // Don't set channel here - let dev-app-update.yml control it (defaults to "latest")
65
56
  autoUpdater.forceDevUpdateConfig = true;
66
57
  logger.info(
67
58
  `Using dev update config (isDev=${isDev}, FORCE_DEV_UPDATE_CONFIG=${FORCE_DEV_UPDATE_CONFIG})`,
68
59
  );
69
60
  logger.info('Dev mode: Using dev-app-update.yml for update configuration');
70
61
  } else {
71
- // Only configure channel and update provider programmatically in production
72
- // Note: channel is configured in configureUpdateProvider based on provider type
73
62
  autoUpdater.allowPrerelease = channel !== 'stable';
74
63
  logger.info(`Production mode: channel=${channel}, allowPrerelease=${channel !== 'stable'}`);
75
64
  this.configureUpdateProvider();
76
65
  }
77
66
 
78
- // Register events
79
67
  this.registerEvents();
80
68
 
81
- // If auto-check for updates is configured, set up periodic checks
82
69
  if (updaterConfig.app.autoCheckUpdate) {
83
- // Delay update check by 1 minute after startup to avoid network instability
84
70
  setTimeout(() => this.checkForUpdates(), 60 * 1000);
85
-
86
- // Set up periodic checks
87
71
  setInterval(() => this.checkForUpdates(), updaterConfig.app.checkUpdateInterval);
88
72
  }
89
73
 
90
- // Log the channel and allowPrerelease values
91
74
  logger.debug(
92
75
  `Initialized with channel: ${autoUpdater.channel}, allowPrerelease: ${autoUpdater.allowPrerelease}`,
93
76
  );
@@ -105,15 +88,12 @@ export class UpdaterManager {
105
88
  this.checking = true;
106
89
  this.isManualCheck = manual;
107
90
 
108
- // Ensure allowPrerelease is correctly set before each check
109
- // This guards against any internal state reset by electron-updater
110
91
  if (!isStableChannel) {
111
92
  autoUpdater.allowPrerelease = true;
112
93
  }
113
94
 
114
95
  logger.info(`${manual ? 'Manually checking' : 'Auto checking'} for updates...`);
115
96
 
116
- // Log detailed updater configuration for debugging
117
97
  const inferredChannel =
118
98
  autoUpdater.channel ||
119
99
  (autoUpdater.currentVersion?.prerelease?.[0]
@@ -133,7 +113,6 @@ export class UpdaterManager {
133
113
  logger.info('[Updater Config] usingFallbackProvider:', this.usingFallbackProvider);
134
114
  logger.info('[Updater Config] GitHub config:', JSON.stringify(githubConfig));
135
115
 
136
- // If manual check, notify renderer process about check start
137
116
  if (manual) {
138
117
  this.mainWindow.broadcast('manualUpdateCheckStart');
139
118
  }
@@ -143,7 +122,6 @@ export class UpdaterManager {
143
122
  } catch (error) {
144
123
  logger.error('Error checking for updates:', error.message);
145
124
 
146
- // If manual check, notify renderer process about check error
147
125
  if (manual) {
148
126
  this.mainWindow.broadcast('updateError', (error as Error).message);
149
127
  }
@@ -162,7 +140,6 @@ export class UpdaterManager {
162
140
  this.downloading = true;
163
141
  logger.info(`${manual ? 'Manually downloading' : 'Auto downloading'} update...`);
164
142
 
165
- // If manual download or manual check, notify renderer process about download start
166
143
  if (manual || this.isManualCheck) {
167
144
  this.mainWindow.broadcast('updateDownloadStart');
168
145
  }
@@ -173,7 +150,6 @@ export class UpdaterManager {
173
150
  this.downloading = false;
174
151
  logger.error('Error downloading update:', error);
175
152
 
176
- // If manual download or manual check, notify renderer process about download error
177
153
  if (manual || this.isManualCheck) {
178
154
  this.mainWindow.broadcast('updateError', (error as Error).message);
179
155
  }
@@ -186,14 +162,10 @@ export class UpdaterManager {
186
162
  public installNow = () => {
187
163
  logger.info('Installing update now...');
188
164
 
189
- // Mark application for exit
190
165
  this.app.isQuiting = true;
191
166
 
192
- // Close all windows first to ensure clean exit
193
167
  logger.info('Closing all windows before update installation...');
194
168
  const { BrowserWindow, app } = require('electron');
195
- // do not close windows and quit first
196
- // on Windows, window-all-closed -> app.quit()` can terminate the process before the timer fires
197
169
  if (!isWindows) {
198
170
  const allWindows = BrowserWindow.getAllWindows();
199
171
  allWindows.forEach((window) => {
@@ -203,16 +175,10 @@ export class UpdaterManager {
203
175
  });
204
176
  }
205
177
 
206
- // Release single instance lock before quitting
207
- // This ensures the new instance can acquire the lock
208
178
  logger.info('Releasing single instance lock...');
209
179
  app.releaseSingleInstanceLock();
210
180
 
211
- // Small delay to ensure windows are closed and lock is released
212
181
  setTimeout(() => {
213
- // quitAndInstall parameters:
214
- // - isSilent: true (don't show installation UI)
215
- // - isForceRunAfter: true (force start app after installation)
216
182
  logger.info('Calling autoUpdater.quitAndInstall...');
217
183
  autoUpdater.quitAndInstall(true, true);
218
184
  }, 100);
@@ -224,10 +190,7 @@ export class UpdaterManager {
224
190
  public installLater = () => {
225
191
  logger.info('Update will be installed on next restart');
226
192
 
227
- // Mark for installation on next launch, but don't exit application
228
193
  autoUpdater.autoInstallOnAppQuit = true;
229
-
230
- // Notify renderer process that update will be installed on next launch
231
194
  this.mainWindow.broadcast('updateWillInstallLater');
232
195
  };
233
196
 
@@ -241,7 +204,6 @@ export class UpdaterManager {
241
204
  logger.info('Simulating update available...');
242
205
 
243
206
  const mainWindow = this.mainWindow;
244
- // Simulate a new version update
245
207
  const mockUpdateInfo = {
246
208
  releaseDate: new Date().toISOString(),
247
209
  releaseNotes: ` #### Version 1.0.0 Release Notes
@@ -253,14 +215,11 @@ export class UpdaterManager {
253
215
  version: '1.0.0',
254
216
  };
255
217
 
256
- // Set update available state
257
218
  this.updateAvailable = true;
258
219
 
259
- // Notify renderer process
260
220
  if (this.isManualCheck) {
261
221
  mainWindow.broadcast('manualUpdateAvailable', mockUpdateInfo);
262
222
  } else {
263
- // In auto-check mode, directly simulate download
264
223
  this.simulateDownloadProgress();
265
224
  }
266
225
  };
@@ -276,7 +235,6 @@ export class UpdaterManager {
276
235
 
277
236
  const mainWindow = this.app.browserManager.getMainWindow();
278
237
  if (mainWindow) {
279
- // Simulate a new version update
280
238
  const mockUpdateInfo = {
281
239
  releaseDate: new Date().toISOString(),
282
240
  releaseNotes: ` #### Version 1.0.0 Release Notes
@@ -288,10 +246,7 @@ export class UpdaterManager {
288
246
  version: '1.0.0',
289
247
  };
290
248
 
291
- // Set download state
292
249
  this.downloading = false;
293
-
294
- // Notify renderer process
295
250
  mainWindow.broadcast('updateDownloaded', mockUpdateInfo);
296
251
  }
297
252
  };
@@ -307,28 +262,22 @@ export class UpdaterManager {
307
262
 
308
263
  const mainWindow = this.app.browserManager.getMainWindow();
309
264
 
310
- // Set download state
311
265
  this.downloading = true;
312
266
 
313
- // Only broadcast download start event if manual check
314
267
  if (this.isManualCheck) {
315
268
  mainWindow.broadcast('updateDownloadStart');
316
269
  }
317
270
 
318
- // Simulate progress updates
319
271
  let progress = 0;
320
272
  const interval = setInterval(() => {
321
273
  progress += 10;
322
274
 
323
- if (
324
- progress <= 100 && // Only broadcast download progress if manual check
325
- this.isManualCheck
326
- ) {
275
+ if (progress <= 100 && this.isManualCheck) {
327
276
  mainWindow.broadcast('updateDownloadProgress', {
328
277
  bytesPerSecond: 1024 * 1024,
329
- percent: progress, // 1MB/s
330
- total: 1024 * 1024 * 100, // 100MB
331
- transferred: 1024 * 1024 * progress, // Progress * 1MB
278
+ percent: progress,
279
+ total: 1024 * 1024 * 100,
280
+ transferred: 1024 * 1024 * progress,
332
281
  });
333
282
  }
334
283
 
@@ -348,8 +297,6 @@ export class UpdaterManager {
348
297
  */
349
298
  private configureUpdateProvider() {
350
299
  if (isStableChannel && UPDATE_SERVER_URL && !this.usingFallbackProvider) {
351
- // Stable channel uses custom update server (generic HTTP) as primary
352
- // S3 has stable-mac.yml, so we set channel to 'stable'
353
300
  autoUpdater.channel = 'stable';
354
301
  logger.info(`Configuring generic provider for stable channel (primary)`);
355
302
  logger.info(`Update server URL: ${UPDATE_SERVER_URL}`);
@@ -360,9 +307,6 @@ export class UpdaterManager {
360
307
  url: UPDATE_SERVER_URL,
361
308
  });
362
309
  } else {
363
- // GitHub provider:
364
- // - stable: use default latest-mac.yml (GitHub uploads latest* only)
365
- // - beta/nightly: leave channel unset so prerelease matching uses tag (e.g. next)
366
310
  const reason = this.usingFallbackProvider ? '(fallback from S3)' : '';
367
311
  logger.info(`Configuring GitHub provider for ${channel} channel ${reason}`);
368
312
  if (autoUpdater.channel !== null) {
@@ -370,7 +314,6 @@ export class UpdaterManager {
370
314
  }
371
315
  logger.info('Channel left unset (defaults to latest-mac.yml for GitHub)');
372
316
 
373
- // For beta/nightly channels, we need prerelease versions
374
317
  const needPrerelease = channel !== 'stable';
375
318
 
376
319
  autoUpdater.setFeedURL({
@@ -379,8 +322,6 @@ export class UpdaterManager {
379
322
  repo: githubConfig.repo,
380
323
  });
381
324
 
382
- // Ensure allowPrerelease is set correctly after setFeedURL
383
- // setFeedURL may reset some internal states
384
325
  autoUpdater.allowPrerelease = needPrerelease;
385
326
 
386
327
  logger.info(
@@ -394,7 +335,6 @@ export class UpdaterManager {
394
335
  * Called when primary provider (S3) fails
395
336
  */
396
337
  private switchToFallbackAndRetry = async () => {
397
- // Only fallback if we're on stable channel with S3 configured and haven't already fallen back
398
338
  if (!isStableChannel || !UPDATE_SERVER_URL || this.usingFallbackProvider) {
399
339
  return false;
400
340
  }
@@ -403,7 +343,6 @@ export class UpdaterManager {
403
343
  this.usingFallbackProvider = true;
404
344
  this.configureUpdateProvider();
405
345
 
406
- // Retry update check with fallback provider
407
346
  try {
408
347
  await autoUpdater.checkForUpdates();
409
348
  return true;
@@ -437,13 +376,11 @@ export class UpdaterManager {
437
376
  logger.info(`Update available: ${info.version}`);
438
377
  this.updateAvailable = true;
439
378
 
440
- // Reset to primary provider for next check cycle
441
379
  this.resetToPrimaryProvider();
442
380
 
443
381
  if (this.isManualCheck) {
444
382
  this.mainWindow.broadcast('manualUpdateAvailable', info);
445
383
  } else {
446
- // If it's an automatic check, start downloading automatically
447
384
  logger.info('Auto check found update, starting download automatically...');
448
385
  this.downloadUpdate();
449
386
  }
@@ -452,7 +389,6 @@ export class UpdaterManager {
452
389
  autoUpdater.on('update-not-available', (info) => {
453
390
  logger.info(`Update not available. Current: ${info.version}`);
454
391
 
455
- // Reset to primary provider for next check cycle
456
392
  this.resetToPrimaryProvider();
457
393
 
458
394
  if (this.isManualCheck) {
@@ -462,7 +398,6 @@ export class UpdaterManager {
462
398
 
463
399
  autoUpdater.on('error', async (err) => {
464
400
  logger.error('Error in auto-updater:', err);
465
- // Log configuration state when error occurs for debugging
466
401
  logger.error('[Updater Error Context] Channel:', autoUpdater.channel);
467
402
  logger.error('[Updater Error Context] allowPrerelease:', autoUpdater.allowPrerelease);
468
403
  logger.error('[Updater Error Context] Build channel from config:', channel);
@@ -471,12 +406,11 @@ export class UpdaterManager {
471
406
  logger.error('[Updater Error Context] usingFallbackProvider:', this.usingFallbackProvider);
472
407
  logger.error('[Updater Error Context] GitHub config:', JSON.stringify(githubConfig));
473
408
 
474
- // Try fallback to GitHub if S3 failed
475
409
  if (!this.usingFallbackProvider && isStableChannel && UPDATE_SERVER_URL) {
476
410
  logger.info('Attempting fallback to GitHub provider...');
477
411
  const fallbackSucceeded = await this.switchToFallbackAndRetry();
478
412
  if (fallbackSucceeded) {
479
- return; // Fallback initiated, don't report error yet
413
+ return;
480
414
  }
481
415
  }
482
416
 
@@ -497,7 +431,6 @@ export class UpdaterManager {
497
431
  autoUpdater.on('update-downloaded', (info) => {
498
432
  logger.info(`Update downloaded: ${info.version}`);
499
433
  this.downloading = false;
500
- // Always notify about downloaded update
501
434
  this.mainWindow.broadcast('updateDownloaded', info);
502
435
  });
503
436
 
@@ -76,7 +76,6 @@ vi.mock('@/modules/updater/configs', () => ({
76
76
  checkUpdateInterval: 60 * 60 * 1000,
77
77
  },
78
78
  enableAppUpdate: true,
79
- enableRenderHotUpdate: true,
80
79
  },
81
80
  }));
82
81
 
@@ -27,10 +27,6 @@ export const updaterConfig = {
27
27
  // Update check interval (milliseconds)
28
28
  checkUpdateInterval: 60 * 60 * 1000, // 1 hour
29
29
  },
30
-
31
30
  // Whether to enable application updates
32
31
  enableAppUpdate: !isDev,
33
-
34
- // 是否启用渲染层热更新
35
- enableRenderHotUpdate: !isDev,
36
32
  };
package/changelog/v1.json CHANGED
@@ -1,4 +1,19 @@
1
1
  [
2
+ {
3
+ "children": {
4
+ "improvements": [
5
+ "Optimize profile settings skeleton screen."
6
+ ],
7
+ "features": [
8
+ "Add the agents and agents group fork feature."
9
+ ],
10
+ "fixes": [
11
+ "Fix Topic component causing stack overflow and freezing the app, simplify updater config logic, slove the nuqs error in commnuity agent group page."
12
+ ]
13
+ },
14
+ "date": "2026-01-20",
15
+ "version": "2.0.0-next.323"
16
+ },
2
17
  {
3
18
  "children": {},
4
19
  "date": "2026-01-20",
@@ -146,12 +146,12 @@ export class LLMMockManager {
146
146
  return;
147
147
  }
148
148
 
149
- // Intercept OpenAI chat API requests
150
- await page.route('**/webapi/chat/openai**', async (route) => {
149
+ // Intercept all LLM chat API requests (openai, anthropic, etc.)
150
+ await page.route('**/webapi/chat/**', async (route) => {
151
151
  await this.handleChatRequest(route);
152
152
  });
153
153
 
154
- console.log(' ✓ LLM mocks registered (openai)');
154
+ console.log(' ✓ LLM mocks registered (all providers)');
155
155
  }
156
156
 
157
157
  /**
@@ -99,6 +99,8 @@
99
99
  "cmdk.askAI": "اسأل الوكيل",
100
100
  "cmdk.askAIHeading": "استخدم الميزات التالية لـ {{query}}",
101
101
  "cmdk.askAIHeadingEmpty": "اختر ميزة ذكاء اصطناعي",
102
+ "cmdk.askAgentHeading": "اسأل الوكيل",
103
+ "cmdk.askAgentPlaceholder": "اسأل {{agent}} عن شيء ما...",
102
104
  "cmdk.askLobeAI": "اسأل Lobe AI",
103
105
  "cmdk.community": "المجتمع",
104
106
  "cmdk.communitySupport": "دعم المجتمع",
@@ -114,8 +116,10 @@
114
116
  "cmdk.context.settings": "الإعدادات",
115
117
  "cmdk.discover": "استكشاف",
116
118
  "cmdk.keyboard.ESC": "ESC",
119
+ "cmdk.keyboard.Enter": "إدخال",
117
120
  "cmdk.keyboard.Tab": "Tab",
118
121
  "cmdk.memory": "الذاكرة",
122
+ "cmdk.mentionAgent": "اذكر الوكيل",
119
123
  "cmdk.navigate": "تنقل",
120
124
  "cmdk.newAgent": "إنشاء وكيل جديد",
121
125
  "cmdk.newAgentTeam": "إنشاء مجموعة جديدة",
@@ -151,6 +155,7 @@
151
155
  "cmdk.search.topic": "موضوع",
152
156
  "cmdk.search.topics": "مواضيع",
153
157
  "cmdk.searchPlaceholder": "أدخل أمرًا أو ابحث...",
158
+ "cmdk.sendToAgent": "أرسل إلى {{agent}}",
154
159
  "cmdk.settings": "الإعدادات",
155
160
  "cmdk.starOnGitHub": "قيّمنا على GitHub",
156
161
  "cmdk.submitIssue": "إرسال مشكلة",
@@ -12,6 +12,11 @@
12
12
  "import.importConfigFile.title": "فشل الاستيراد",
13
13
  "import.incompatible.description": "تم تصدير هذا الملف من إصدار أحدث. يرجى الترقية إلى أحدث إصدار ثم إعادة الاستيراد.",
14
14
  "import.incompatible.title": "التطبيق الحالي لا يدعم استيراد هذا الملف",
15
+ "inviteCode.currentEmail": "الحساب الحالي: {{email}}",
16
+ "inviteCode.desc": "مطلوب رمز دعوة للوصول إلى LobeHub. يرجى إدخال رمز دعوة صالح للمتابعة.",
17
+ "inviteCode.friends": "الأصدقاء",
18
+ "inviteCode.getCodeHint": "احصل على رمز دعوة من:",
19
+ "inviteCode.title": "رمز الدعوة مطلوب",
15
20
  "loginRequired.desc": "سيتم تحويلك إلى صفحة تسجيل الدخول قريبًا",
16
21
  "loginRequired.title": "يرجى تسجيل الدخول لاستخدام هذه الميزة",
17
22
  "notFound.backHome": "العودة إلى الصفحة الرئيسية",
@@ -144,5 +149,9 @@
144
149
  "upload.networkError": "يرجى التحقق من اتصال الشبكة والتأكد من صحة إعدادات CORS لخدمة تخزين الملفات.",
145
150
  "upload.title": "فشل تحميل الملف. يرجى التحقق من الاتصال أو المحاولة لاحقًا.",
146
151
  "upload.unknownError": "سبب الخطأ: {{reason}}",
147
- "upload.uploadFailed": "فشل تحميل الملف."
152
+ "upload.uploadFailed": "فشل تحميل الملف.",
153
+ "waitlist.currentEmail": "الحساب الحالي: {{email}}",
154
+ "waitlist.desc": "حسابك غير موجود في القائمة البيضاء. يرجى التواصل مع المسؤول لطلب الوصول.",
155
+ "waitlist.switchAccount": "تبديل الحساب",
156
+ "waitlist.title": "الوصول مقيد"
148
157
  }
@@ -99,6 +99,8 @@
99
99
  "cmdk.askAI": "Попитай агент",
100
100
  "cmdk.askAIHeading": "Използвайте следните функции за {{query}}",
101
101
  "cmdk.askAIHeadingEmpty": "Изберете AI функция",
102
+ "cmdk.askAgentHeading": "Попитай агент",
103
+ "cmdk.askAgentPlaceholder": "Попитай {{agent}} нещо...",
102
104
  "cmdk.askLobeAI": "Попитай Lobe AI",
103
105
  "cmdk.community": "Общност",
104
106
  "cmdk.communitySupport": "Поддръжка от общността",
@@ -114,8 +116,10 @@
114
116
  "cmdk.context.settings": "Настройки",
115
117
  "cmdk.discover": "Открий",
116
118
  "cmdk.keyboard.ESC": "ESC",
119
+ "cmdk.keyboard.Enter": "Enter",
117
120
  "cmdk.keyboard.Tab": "Tab",
118
121
  "cmdk.memory": "Памет",
122
+ "cmdk.mentionAgent": "Спомени агент",
119
123
  "cmdk.navigate": "Навигирай",
120
124
  "cmdk.newAgent": "Създай нов агент",
121
125
  "cmdk.newAgentTeam": "Създай нова група",
@@ -151,6 +155,7 @@
151
155
  "cmdk.search.topic": "Тема",
152
156
  "cmdk.search.topics": "Теми",
153
157
  "cmdk.searchPlaceholder": "Въведете команда или търсене...",
158
+ "cmdk.sendToAgent": "Изпрати до {{agent}}",
154
159
  "cmdk.settings": "Настройки",
155
160
  "cmdk.starOnGitHub": "Дайте звезда в GitHub",
156
161
  "cmdk.submitIssue": "Изпрати проблем",
@@ -12,6 +12,11 @@
12
12
  "import.importConfigFile.title": "Импортирането не бе успешно",
13
13
  "import.incompatible.description": "Този файл е експортиран от по-нова версия. Моля, обновете до последната версия и опитайте отново.",
14
14
  "import.incompatible.title": "Текущото приложение не поддържа импортиране на този файл",
15
+ "inviteCode.currentEmail": "Текуща сметка: {{email}}",
16
+ "inviteCode.desc": "Необходим е поканен код за достъп до LobeHub. Моля, въведете валиден поканен код, за да продължите.",
17
+ "inviteCode.friends": "Приятели",
18
+ "inviteCode.getCodeHint": "Получете поканен код от:",
19
+ "inviteCode.title": "Изисква се поканен код",
15
20
  "loginRequired.desc": "Ще бъдете пренасочени към страницата за вход след малко",
16
21
  "loginRequired.title": "Моля, влезте, за да използвате тази функция",
17
22
  "notFound.backHome": "Обратно към началната страница",
@@ -144,5 +149,9 @@
144
149
  "upload.networkError": "Проверете мрежовата връзка и конфигурацията за CORS на услугата за съхранение.",
145
150
  "upload.title": "Качването на файл не бе успешно. Проверете мрежовата връзка или опитайте отново по-късно.",
146
151
  "upload.unknownError": "Причина за грешката: {{reason}}",
147
- "upload.uploadFailed": "Качването на файл не бе успешно."
152
+ "upload.uploadFailed": "Качването на файл не бе успешно.",
153
+ "waitlist.currentEmail": "Текуща сметка: {{email}}",
154
+ "waitlist.desc": "Вашата сметка не е в белия списък. Моля, свържете се с администратора, за да поискате достъп.",
155
+ "waitlist.switchAccount": "Смени сметката",
156
+ "waitlist.title": "Достъпът е ограничен"
148
157
  }
@@ -99,6 +99,8 @@
99
99
  "cmdk.askAI": "Agent fragen",
100
100
  "cmdk.askAIHeading": "Verwenden Sie die folgenden Funktionen für {{query}}",
101
101
  "cmdk.askAIHeadingEmpty": "Wählen Sie eine KI-Funktion",
102
+ "cmdk.askAgentHeading": "Agent fragen",
103
+ "cmdk.askAgentPlaceholder": "Stelle {{agent}} eine Frage...",
102
104
  "cmdk.askLobeAI": "Lobe AI fragen",
103
105
  "cmdk.community": "Community",
104
106
  "cmdk.communitySupport": "Community-Support",
@@ -114,8 +116,10 @@
114
116
  "cmdk.context.settings": "Einstellungen",
115
117
  "cmdk.discover": "Entdecken",
116
118
  "cmdk.keyboard.ESC": "ESC",
119
+ "cmdk.keyboard.Enter": "Eingabe",
117
120
  "cmdk.keyboard.Tab": "Tab",
118
121
  "cmdk.memory": "Gedächtnis",
122
+ "cmdk.mentionAgent": "Agent erwähnen",
119
123
  "cmdk.navigate": "Navigieren",
120
124
  "cmdk.newAgent": "Neuen Agenten erstellen",
121
125
  "cmdk.newAgentTeam": "Neue Gruppe erstellen",
@@ -151,6 +155,7 @@
151
155
  "cmdk.search.topic": "Thema",
152
156
  "cmdk.search.topics": "Themen",
153
157
  "cmdk.searchPlaceholder": "Befehl eingeben oder suchen...",
158
+ "cmdk.sendToAgent": "An {{agent}} senden",
154
159
  "cmdk.settings": "Einstellungen",
155
160
  "cmdk.starOnGitHub": "GitHub-Stern vergeben",
156
161
  "cmdk.submitIssue": "Problem melden",
@@ -12,6 +12,11 @@
12
12
  "import.importConfigFile.title": "Import fehlgeschlagen",
13
13
  "import.incompatible.description": "Diese Datei wurde aus einer neueren Version exportiert. Bitte aktualisieren Sie auf die neueste Version und versuchen Sie den Import erneut.",
14
14
  "import.incompatible.title": "Aktuelle Anwendung unterstützt den Import dieser Datei nicht",
15
+ "inviteCode.currentEmail": "Aktuelles Konto: {{email}}",
16
+ "inviteCode.desc": "Ein Einladungscode ist erforderlich, um auf LobeHub zuzugreifen. Bitte gib einen gültigen Einladungscode ein, um fortzufahren.",
17
+ "inviteCode.friends": "Freunde",
18
+ "inviteCode.getCodeHint": "Einen Einladungscode erhalten von:",
19
+ "inviteCode.title": "Einladungscode erforderlich",
15
20
  "loginRequired.desc": "Sie werden in Kürze zur Anmeldeseite weitergeleitet",
16
21
  "loginRequired.title": "Bitte melden Sie sich an, um diese Funktion zu nutzen",
17
22
  "notFound.backHome": "Zurück zur Startseite",
@@ -144,5 +149,9 @@
144
149
  "upload.networkError": "Bitte überprüfen Sie Ihre Netzwerkverbindung und die CORS-Konfiguration des Speicherdienstes.",
145
150
  "upload.title": "Datei-Upload fehlgeschlagen. Bitte Netzwerk prüfen oder später erneut versuchen.",
146
151
  "upload.unknownError": "Fehlerursache: {{reason}}",
147
- "upload.uploadFailed": "Datei-Upload fehlgeschlagen."
152
+ "upload.uploadFailed": "Datei-Upload fehlgeschlagen.",
153
+ "waitlist.currentEmail": "Aktuelles Konto: {{email}}",
154
+ "waitlist.desc": "Dein Konto befindet sich nicht auf der Whitelist. Bitte kontaktiere den Administrator, um Zugriff zu beantragen.",
155
+ "waitlist.switchAccount": "Konto wechseln",
156
+ "waitlist.title": "Zugriff eingeschränkt"
148
157
  }
@@ -99,6 +99,8 @@
99
99
  "cmdk.askAI": "Ask Agent",
100
100
  "cmdk.askAIHeading": "Use the following features for {{query}}",
101
101
  "cmdk.askAIHeadingEmpty": "Choose an AI feature",
102
+ "cmdk.askAgentHeading": "Ask Agent",
103
+ "cmdk.askAgentPlaceholder": "Ask {{agent}} something...",
102
104
  "cmdk.askLobeAI": "Ask Lobe AI",
103
105
  "cmdk.community": "Community",
104
106
  "cmdk.communitySupport": "Community Support",
@@ -114,8 +116,10 @@
114
116
  "cmdk.context.settings": "Settings",
115
117
  "cmdk.discover": "Discover",
116
118
  "cmdk.keyboard.ESC": "ESC",
119
+ "cmdk.keyboard.Enter": "Enter",
117
120
  "cmdk.keyboard.Tab": "Tab",
118
121
  "cmdk.memory": "Memory",
122
+ "cmdk.mentionAgent": "Mention Agent",
119
123
  "cmdk.navigate": "Navigate",
120
124
  "cmdk.newAgent": "Create New Agent",
121
125
  "cmdk.newAgentTeam": "Create New Group",
@@ -151,6 +155,7 @@
151
155
  "cmdk.search.topic": "Topic",
152
156
  "cmdk.search.topics": "Topics",
153
157
  "cmdk.searchPlaceholder": "Enter a command or search...",
158
+ "cmdk.sendToAgent": "Send to {{agent}}",
154
159
  "cmdk.settings": "Settings",
155
160
  "cmdk.starOnGitHub": "Star us on GitHub",
156
161
  "cmdk.submitIssue": "Submit Issue",