@lobehub/chat 1.97.17 → 1.98.1

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 (69) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/apps/desktop/package.json +8 -5
  3. package/apps/desktop/src/main/const/store.ts +12 -0
  4. package/apps/desktop/src/main/controllers/NetworkProxyCtr.ts +172 -0
  5. package/apps/desktop/src/main/controllers/__tests__/NetworkProxyCtr.test.ts +401 -0
  6. package/apps/desktop/src/main/core/Browser.ts +2 -0
  7. package/apps/desktop/src/main/modules/networkProxy/dispatcher.ts +116 -0
  8. package/apps/desktop/src/main/modules/networkProxy/index.ts +6 -0
  9. package/apps/desktop/src/main/modules/networkProxy/tester.ts +163 -0
  10. package/apps/desktop/src/main/modules/networkProxy/urlBuilder.ts +25 -0
  11. package/apps/desktop/src/main/modules/networkProxy/validator.ts +80 -0
  12. package/apps/desktop/src/main/types/store.ts +2 -1
  13. package/apps/desktop/src/main/utils/logger.ts +2 -1
  14. package/changelog/v1.json +18 -0
  15. package/locales/ar/electron.json +39 -0
  16. package/locales/ar/setting.json +1 -0
  17. package/locales/bg-BG/electron.json +39 -0
  18. package/locales/bg-BG/setting.json +1 -0
  19. package/locales/de-DE/electron.json +39 -0
  20. package/locales/de-DE/setting.json +1 -0
  21. package/locales/en-US/electron.json +39 -0
  22. package/locales/en-US/setting.json +1 -0
  23. package/locales/es-ES/electron.json +39 -0
  24. package/locales/es-ES/setting.json +1 -0
  25. package/locales/fa-IR/electron.json +39 -0
  26. package/locales/fa-IR/setting.json +1 -0
  27. package/locales/fr-FR/electron.json +39 -0
  28. package/locales/fr-FR/setting.json +1 -0
  29. package/locales/it-IT/electron.json +39 -0
  30. package/locales/it-IT/setting.json +1 -0
  31. package/locales/ja-JP/electron.json +39 -0
  32. package/locales/ja-JP/setting.json +1 -0
  33. package/locales/ko-KR/electron.json +39 -0
  34. package/locales/ko-KR/setting.json +1 -0
  35. package/locales/nl-NL/electron.json +39 -0
  36. package/locales/nl-NL/setting.json +1 -0
  37. package/locales/pl-PL/electron.json +39 -0
  38. package/locales/pl-PL/setting.json +1 -0
  39. package/locales/pt-BR/electron.json +39 -0
  40. package/locales/pt-BR/setting.json +1 -0
  41. package/locales/ru-RU/electron.json +39 -0
  42. package/locales/ru-RU/setting.json +1 -0
  43. package/locales/tr-TR/electron.json +39 -0
  44. package/locales/tr-TR/setting.json +1 -0
  45. package/locales/vi-VN/electron.json +39 -0
  46. package/locales/vi-VN/setting.json +1 -0
  47. package/locales/zh-CN/electron.json +39 -0
  48. package/locales/zh-CN/setting.json +1 -0
  49. package/locales/zh-TW/electron.json +39 -0
  50. package/locales/zh-TW/setting.json +1 -0
  51. package/package.json +3 -3
  52. package/packages/electron-client-ipc/src/events/index.ts +3 -1
  53. package/packages/electron-client-ipc/src/events/settings.ts +12 -0
  54. package/packages/electron-client-ipc/src/types/index.ts +1 -0
  55. package/packages/electron-client-ipc/src/types/proxy.ts +12 -0
  56. package/src/app/[variants]/(main)/discover/(list)/(home)/page.tsx +4 -4
  57. package/src/app/[variants]/(main)/settings/hooks/useCategory.tsx +11 -1
  58. package/src/app/[variants]/(main)/settings/proxy/features/ProxyForm.tsx +369 -0
  59. package/src/app/[variants]/(main)/settings/proxy/index.tsx +22 -0
  60. package/src/app/[variants]/(main)/settings/proxy/page.tsx +28 -0
  61. package/src/locales/default/electron.ts +39 -0
  62. package/src/locales/default/setting.ts +1 -0
  63. package/src/services/electron/settings.ts +33 -0
  64. package/src/store/electron/actions/settings.ts +55 -0
  65. package/src/store/electron/initialState.ts +12 -1
  66. package/src/store/electron/selectors/__tests__/desktopState.test.ts +3 -1
  67. package/src/store/electron/store.ts +4 -1
  68. package/src/store/global/initialState.ts +1 -0
  69. package/apps/desktop/scripts/pglite-server.ts +0 -14
package/CHANGELOG.md CHANGED
@@ -2,6 +2,56 @@
2
2
 
3
3
  # Changelog
4
4
 
5
+ ### [Version 1.98.1](https://github.com/lobehub/lobe-chat/compare/v1.98.0...v1.98.1)
6
+
7
+ <sup>Released on **2025-07-14**</sup>
8
+
9
+ #### 💄 Styles
10
+
11
+ - **misc**: Fix discover translation.
12
+
13
+ <br/>
14
+
15
+ <details>
16
+ <summary><kbd>Improvements and Fixes</kbd></summary>
17
+
18
+ #### Styles
19
+
20
+ - **misc**: Fix discover translation, closes [#8423](https://github.com/lobehub/lobe-chat/issues/8423) ([15ae35c](https://github.com/lobehub/lobe-chat/commit/15ae35c))
21
+
22
+ </details>
23
+
24
+ <div align="right">
25
+
26
+ [![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
27
+
28
+ </div>
29
+
30
+ ## [Version 1.98.0](https://github.com/lobehub/lobe-chat/compare/v1.97.17...v1.98.0)
31
+
32
+ <sup>Released on **2025-07-13**</sup>
33
+
34
+ #### ✨ Features
35
+
36
+ - **misc**: Add network proxy for desktop.
37
+
38
+ <br/>
39
+
40
+ <details>
41
+ <summary><kbd>Improvements and Fixes</kbd></summary>
42
+
43
+ #### What's improved
44
+
45
+ - **misc**: Add network proxy for desktop, closes [#7848](https://github.com/lobehub/lobe-chat/issues/7848) ([46d2509](https://github.com/lobehub/lobe-chat/commit/46d2509))
46
+
47
+ </details>
48
+
49
+ <div align="right">
50
+
51
+ [![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
52
+
53
+ </div>
54
+
5
55
  ### [Version 1.97.17](https://github.com/lobehub/lobe-chat/compare/v1.97.16...v1.97.17)
6
56
 
7
57
  <sup>Released on **2025-07-13**</sup>
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lobehub-desktop-dev",
3
- "version": "0.0.10",
3
+ "version": "0.0.0",
4
4
  "description": "LobeHub Desktop Application",
5
5
  "homepage": "https://lobehub.com",
6
6
  "repository": {
@@ -24,6 +24,7 @@
24
24
  "lint": "eslint --cache ",
25
25
  "pg-server": "bun run scripts/pglite-server.ts",
26
26
  "start": "electron-vite preview",
27
+ "test": "vite --run",
27
28
  "typecheck": "tsgo --noEmit -p tsconfig.json"
28
29
  },
29
30
  "dependencies": {
@@ -45,10 +46,10 @@
45
46
  "@types/resolve": "^1.20.6",
46
47
  "@types/semver": "^7.7.0",
47
48
  "@types/set-cookie-parser": "^2.4.10",
48
- "@typescript/native-preview": "latest",
49
+ "@typescript/native-preview": "7.0.0-dev.20250711.1",
49
50
  "consola": "^3.1.0",
50
51
  "cookie": "^1.0.2",
51
- "electron": "^37.2.0",
52
+ "electron": "~37.1.0",
52
53
  "electron-builder": "^26.0.12",
53
54
  "electron-is": "^3.0.0",
54
55
  "electron-log": "^5.3.3",
@@ -58,17 +59,19 @@
58
59
  "fix-path": "^4.0.0",
59
60
  "just-diff": "^6.0.2",
60
61
  "lodash": "^4.17.21",
61
- "pglite-server": "^0.1.4",
62
+ "lodash-es": "^4.17.21",
62
63
  "resolve": "^1.22.8",
63
64
  "semver": "^7.5.4",
64
65
  "set-cookie-parser": "^2.7.1",
65
66
  "tsx": "^4.19.3",
66
67
  "typescript": "^5.7.3",
68
+ "undici": "^7.9.0",
67
69
  "vite": "^6.2.5"
68
70
  },
69
71
  "pnpm": {
70
72
  "onlyBuiltDependencies": [
71
- "electron"
73
+ "electron",
74
+ "electron-builder"
72
75
  ]
73
76
  }
74
77
  }
@@ -1,6 +1,8 @@
1
1
  /**
2
2
  * 应用设置存储相关常量
3
3
  */
4
+ import { NetworkProxySettings } from '@lobechat/electron-client-ipc';
5
+
4
6
  import { appStorageDir } from '@/const/dir';
5
7
  import { DEFAULT_SHORTCUTS_CONFIG } from '@/shortcuts';
6
8
  import { ElectronMainStore } from '@/types/store';
@@ -10,6 +12,15 @@ import { ElectronMainStore } from '@/types/store';
10
12
  */
11
13
  export const STORE_NAME = 'lobehub-settings';
12
14
 
15
+ export const defaultProxySettings: NetworkProxySettings = {
16
+ enableProxy: false,
17
+ proxyBypass: 'localhost, 127.0.0.1, ::1',
18
+ proxyPort: '',
19
+ proxyRequireAuth: false,
20
+ proxyServer: '',
21
+ proxyType: 'http',
22
+ };
23
+
13
24
  /**
14
25
  * 存储默认值
15
26
  */
@@ -17,6 +28,7 @@ export const STORE_DEFAULTS: ElectronMainStore = {
17
28
  dataSyncConfig: { storageMode: 'local' },
18
29
  encryptedTokens: {},
19
30
  locale: 'auto',
31
+ networkProxy: defaultProxySettings,
20
32
  shortcuts: DEFAULT_SHORTCUTS_CONFIG,
21
33
  storagePath: appStorageDir,
22
34
  };
@@ -0,0 +1,172 @@
1
+ import { NetworkProxySettings } from '@lobechat/electron-client-ipc';
2
+ import { merge } from 'lodash';
3
+ import { isEqual } from 'lodash-es';
4
+
5
+ import { defaultProxySettings } from '@/const/store';
6
+ import { createLogger } from '@/utils/logger';
7
+
8
+ import {
9
+ ProxyConfigValidator,
10
+ ProxyConnectionTester,
11
+ ProxyDispatcherManager,
12
+ ProxyTestResult,
13
+ } from '../modules/networkProxy';
14
+ import { ControllerModule, ipcClientEvent } from './index';
15
+
16
+ // Create logger
17
+ const logger = createLogger('controllers:NetworkProxyCtr');
18
+
19
+ /**
20
+ * 网络代理控制器
21
+ * 处理桌面应用的网络代理相关功能
22
+ */
23
+ export default class NetworkProxyCtr extends ControllerModule {
24
+ /**
25
+ * 获取代理设置
26
+ */
27
+ @ipcClientEvent('getProxySettings')
28
+ async getDesktopSettings(): Promise<NetworkProxySettings> {
29
+ try {
30
+ const settings = this.app.storeManager.get(
31
+ 'networkProxy',
32
+ defaultProxySettings,
33
+ ) as NetworkProxySettings;
34
+ logger.debug('Retrieved proxy settings:', {
35
+ enableProxy: settings.enableProxy,
36
+ proxyType: settings.proxyType,
37
+ });
38
+ return settings;
39
+ } catch (error) {
40
+ logger.error('Failed to get proxy settings:', error);
41
+ return defaultProxySettings;
42
+ }
43
+ }
44
+
45
+ /**
46
+ * 设置代理配置
47
+ */
48
+ @ipcClientEvent('setProxySettings')
49
+ async setProxySettings(config: NetworkProxySettings): Promise<void> {
50
+ try {
51
+ // 验证配置
52
+ const validation = ProxyConfigValidator.validate(config);
53
+ if (!validation.isValid) {
54
+ const errorMessage = `Invalid proxy configuration: ${validation.errors.join(', ')}`;
55
+ logger.error(errorMessage);
56
+ throw new Error(errorMessage);
57
+ }
58
+
59
+ // 获取当前配置
60
+ const currentConfig = this.app.storeManager.get(
61
+ 'networkProxy',
62
+ defaultProxySettings,
63
+ ) as NetworkProxySettings;
64
+
65
+ // 检查是否有变化
66
+ if (isEqual(currentConfig, config)) {
67
+ logger.debug('Proxy settings unchanged, skipping update');
68
+ return;
69
+ }
70
+
71
+ // 合并配置
72
+ const newConfig = merge({}, currentConfig, config);
73
+
74
+ // 应用代理设置
75
+ await ProxyDispatcherManager.applyProxySettings(newConfig);
76
+
77
+ // 保存到存储
78
+ this.app.storeManager.set('networkProxy', newConfig);
79
+
80
+ logger.info('Proxy settings updated successfully', {
81
+ enableProxy: newConfig.enableProxy,
82
+ proxyPort: newConfig.proxyPort,
83
+ proxyServer: newConfig.proxyServer,
84
+ proxyType: newConfig.proxyType,
85
+ });
86
+ } catch (error) {
87
+ logger.error('Failed to update proxy settings:', error);
88
+ throw error;
89
+ }
90
+ }
91
+
92
+ /**
93
+ * 测试代理连接
94
+ */
95
+ @ipcClientEvent('testProxyConnection')
96
+ async testProxyConnection(url: string): Promise<{ message?: string; success: boolean }> {
97
+ try {
98
+ const result = await ProxyConnectionTester.testConnection(url);
99
+
100
+ if (result.success) {
101
+ return { success: true };
102
+ } else {
103
+ throw new Error(result.message || 'Connection test failed');
104
+ }
105
+ } catch (error) {
106
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
107
+ logger.error('Proxy connection test failed:', errorMessage);
108
+ throw new Error(`Connection failed: ${errorMessage}`);
109
+ }
110
+ }
111
+
112
+ /**
113
+ * 测试指定代理配置
114
+ */
115
+ @ipcClientEvent('testProxyConfig')
116
+ async testProxyConfig({
117
+ config,
118
+ testUrl,
119
+ }: {
120
+ config: NetworkProxySettings;
121
+ testUrl?: string;
122
+ }): Promise<ProxyTestResult> {
123
+ try {
124
+ return await ProxyConnectionTester.testProxyConfig(config, testUrl);
125
+ } catch (error) {
126
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
127
+ logger.error('Proxy config test failed:', errorMessage);
128
+ return {
129
+ message: `Proxy config test failed: ${errorMessage}`,
130
+ success: false,
131
+ };
132
+ }
133
+ }
134
+
135
+ /**
136
+ * 应用初始代理设置
137
+ */
138
+ async afterAppReady(): Promise<void> {
139
+ try {
140
+ // 获取存储的代理设置
141
+ const networkProxy = this.app.storeManager.get(
142
+ 'networkProxy',
143
+ defaultProxySettings,
144
+ ) as NetworkProxySettings;
145
+
146
+ // 验证配置
147
+ const validation = ProxyConfigValidator.validate(networkProxy);
148
+ if (!validation.isValid) {
149
+ logger.warn('Invalid stored proxy configuration, using defaults:', validation.errors);
150
+ await ProxyDispatcherManager.applyProxySettings(defaultProxySettings);
151
+ return;
152
+ }
153
+
154
+ // 应用代理设置
155
+ await ProxyDispatcherManager.applyProxySettings(networkProxy);
156
+
157
+ logger.info('Initial proxy settings applied successfully', {
158
+ enableProxy: networkProxy.enableProxy,
159
+ proxyType: networkProxy.proxyType,
160
+ });
161
+ } catch (error) {
162
+ logger.error('Failed to apply initial proxy settings:', error);
163
+ // 出错时使用默认设置
164
+ try {
165
+ await ProxyDispatcherManager.applyProxySettings(defaultProxySettings);
166
+ logger.info('Fallback to default proxy settings');
167
+ } catch (fallbackError) {
168
+ logger.error('Failed to apply fallback proxy settings:', fallbackError);
169
+ }
170
+ }
171
+ }
172
+ }