@lobehub/lobehub 2.0.0-next.264 → 2.0.0-next.266

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 (157) hide show
  1. package/.github/workflows/manual-build-desktop.yml +16 -37
  2. package/CHANGELOG.md +52 -0
  3. package/apps/desktop/native-deps.config.mjs +19 -3
  4. package/apps/desktop/src/main/controllers/__tests__/SystemCtr.test.ts +13 -0
  5. package/apps/desktop/src/main/utils/permissions.ts +86 -22
  6. package/changelog/v1.json +18 -0
  7. package/locales/ar/chat.json +1 -0
  8. package/locales/ar/modelProvider.json +20 -0
  9. package/locales/ar/models.json +33 -10
  10. package/locales/ar/plugin.json +1 -0
  11. package/locales/ar/providers.json +1 -0
  12. package/locales/ar/setting.json +2 -0
  13. package/locales/bg-BG/chat.json +1 -0
  14. package/locales/bg-BG/modelProvider.json +20 -0
  15. package/locales/bg-BG/models.json +27 -7
  16. package/locales/bg-BG/plugin.json +1 -0
  17. package/locales/bg-BG/providers.json +1 -0
  18. package/locales/bg-BG/setting.json +2 -0
  19. package/locales/de-DE/chat.json +1 -0
  20. package/locales/de-DE/modelProvider.json +20 -0
  21. package/locales/de-DE/models.json +44 -10
  22. package/locales/de-DE/plugin.json +1 -0
  23. package/locales/de-DE/providers.json +1 -0
  24. package/locales/de-DE/setting.json +2 -0
  25. package/locales/en-US/chat.json +1 -0
  26. package/locales/en-US/modelProvider.json +20 -0
  27. package/locales/en-US/models.json +10 -10
  28. package/locales/en-US/providers.json +1 -0
  29. package/locales/en-US/setting.json +2 -1
  30. package/locales/es-ES/chat.json +1 -0
  31. package/locales/es-ES/modelProvider.json +20 -0
  32. package/locales/es-ES/models.json +53 -10
  33. package/locales/es-ES/plugin.json +1 -0
  34. package/locales/es-ES/providers.json +1 -0
  35. package/locales/es-ES/setting.json +2 -0
  36. package/locales/fa-IR/chat.json +1 -0
  37. package/locales/fa-IR/modelProvider.json +20 -0
  38. package/locales/fa-IR/models.json +33 -10
  39. package/locales/fa-IR/plugin.json +1 -0
  40. package/locales/fa-IR/providers.json +1 -0
  41. package/locales/fa-IR/setting.json +2 -0
  42. package/locales/fr-FR/chat.json +1 -0
  43. package/locales/fr-FR/modelProvider.json +20 -0
  44. package/locales/fr-FR/models.json +27 -7
  45. package/locales/fr-FR/plugin.json +1 -0
  46. package/locales/fr-FR/providers.json +1 -0
  47. package/locales/fr-FR/setting.json +2 -0
  48. package/locales/it-IT/chat.json +1 -0
  49. package/locales/it-IT/modelProvider.json +20 -0
  50. package/locales/it-IT/models.json +10 -10
  51. package/locales/it-IT/plugin.json +1 -0
  52. package/locales/it-IT/providers.json +1 -0
  53. package/locales/it-IT/setting.json +2 -0
  54. package/locales/ja-JP/chat.json +1 -0
  55. package/locales/ja-JP/modelProvider.json +20 -0
  56. package/locales/ja-JP/models.json +5 -10
  57. package/locales/ja-JP/plugin.json +1 -0
  58. package/locales/ja-JP/providers.json +1 -0
  59. package/locales/ja-JP/setting.json +2 -0
  60. package/locales/ko-KR/chat.json +1 -0
  61. package/locales/ko-KR/modelProvider.json +20 -0
  62. package/locales/ko-KR/models.json +36 -10
  63. package/locales/ko-KR/plugin.json +1 -0
  64. package/locales/ko-KR/providers.json +1 -0
  65. package/locales/ko-KR/setting.json +2 -0
  66. package/locales/nl-NL/chat.json +1 -0
  67. package/locales/nl-NL/modelProvider.json +20 -0
  68. package/locales/nl-NL/models.json +35 -4
  69. package/locales/nl-NL/plugin.json +1 -0
  70. package/locales/nl-NL/providers.json +1 -0
  71. package/locales/nl-NL/setting.json +2 -0
  72. package/locales/pl-PL/chat.json +1 -0
  73. package/locales/pl-PL/modelProvider.json +20 -0
  74. package/locales/pl-PL/models.json +37 -7
  75. package/locales/pl-PL/plugin.json +1 -0
  76. package/locales/pl-PL/providers.json +1 -0
  77. package/locales/pl-PL/setting.json +2 -0
  78. package/locales/pt-BR/chat.json +1 -0
  79. package/locales/pt-BR/modelProvider.json +20 -0
  80. package/locales/pt-BR/models.json +51 -9
  81. package/locales/pt-BR/plugin.json +1 -0
  82. package/locales/pt-BR/providers.json +1 -0
  83. package/locales/pt-BR/setting.json +2 -0
  84. package/locales/ru-RU/chat.json +1 -0
  85. package/locales/ru-RU/modelProvider.json +20 -0
  86. package/locales/ru-RU/models.json +48 -7
  87. package/locales/ru-RU/plugin.json +1 -0
  88. package/locales/ru-RU/providers.json +1 -0
  89. package/locales/ru-RU/setting.json +2 -0
  90. package/locales/tr-TR/chat.json +1 -0
  91. package/locales/tr-TR/modelProvider.json +20 -0
  92. package/locales/tr-TR/models.json +48 -7
  93. package/locales/tr-TR/plugin.json +1 -0
  94. package/locales/tr-TR/providers.json +1 -0
  95. package/locales/tr-TR/setting.json +2 -0
  96. package/locales/vi-VN/chat.json +1 -0
  97. package/locales/vi-VN/modelProvider.json +20 -0
  98. package/locales/vi-VN/models.json +5 -5
  99. package/locales/vi-VN/plugin.json +1 -0
  100. package/locales/vi-VN/providers.json +1 -0
  101. package/locales/vi-VN/setting.json +2 -0
  102. package/locales/zh-CN/modelProvider.json +20 -20
  103. package/locales/zh-CN/models.json +49 -8
  104. package/locales/zh-CN/providers.json +1 -0
  105. package/locales/zh-CN/setting.json +2 -1
  106. package/locales/zh-TW/chat.json +1 -0
  107. package/locales/zh-TW/modelProvider.json +20 -0
  108. package/locales/zh-TW/models.json +29 -10
  109. package/locales/zh-TW/plugin.json +1 -0
  110. package/locales/zh-TW/providers.json +1 -0
  111. package/locales/zh-TW/setting.json +2 -0
  112. package/package.json +2 -2
  113. package/packages/database/src/models/__tests__/agent.test.ts +165 -4
  114. package/packages/database/src/models/agent.ts +46 -0
  115. package/packages/database/src/repositories/agentGroup/index.test.ts +498 -0
  116. package/packages/database/src/repositories/agentGroup/index.ts +150 -0
  117. package/packages/database/src/repositories/home/__tests__/index.test.ts +113 -1
  118. package/packages/database/src/repositories/home/index.ts +48 -67
  119. package/pnpm-workspace.yaml +1 -0
  120. package/src/app/[variants]/(main)/agent/_layout/Sidebar/Body.tsx +1 -1
  121. package/src/app/[variants]/(main)/agent/_layout/Sidebar/Cron/CronTopicGroup.tsx +84 -0
  122. package/src/app/[variants]/(main)/agent/_layout/Sidebar/{Topic/CronTopicList → Cron}/CronTopicItem.tsx +1 -1
  123. package/src/app/[variants]/(main)/agent/_layout/Sidebar/{Topic/CronTopicList → Cron}/index.tsx +23 -33
  124. package/src/app/[variants]/(main)/agent/_layout/Sidebar/Topic/List/Item/Editing.tsx +12 -49
  125. package/src/app/[variants]/(main)/agent/_layout/Sidebar/Topic/List/index.tsx +3 -1
  126. package/src/app/[variants]/(main)/agent/_layout/Sidebar/Topic/TopicListContent/ThreadList/ThreadItem/Editing.tsx +12 -40
  127. package/src/app/[variants]/(main)/agent/_layout/Sidebar/Topic/hooks/useTopicNavigation.ts +5 -1
  128. package/src/app/[variants]/(main)/agent/features/Conversation/MainChatInput/index.tsx +2 -2
  129. package/src/app/[variants]/(main)/agent/profile/features/AgentCronJobs/CronJobCards.tsx +1 -1
  130. package/src/app/[variants]/(main)/agent/profile/features/AgentCronJobs/CronJobForm.tsx +1 -1
  131. package/src/app/[variants]/(main)/group/_layout/Sidebar/AddGroupMemberModal/AvailableAgentList.tsx +0 -1
  132. package/src/app/[variants]/(main)/group/_layout/Sidebar/AddGroupMemberModal/index.tsx +5 -1
  133. package/src/app/[variants]/(main)/home/_layout/Body/Agent/List/AgentGroupItem/index.tsx +2 -6
  134. package/src/app/[variants]/(main)/home/_layout/Body/Agent/List/AgentGroupItem/useDropdownMenu.tsx +100 -0
  135. package/src/app/[variants]/(main)/home/_layout/Body/Agent/List/AgentItem/index.tsx +2 -4
  136. package/src/app/[variants]/(main)/home/_layout/Body/Agent/List/AgentItem/useDropdownMenu.tsx +149 -0
  137. package/src/app/[variants]/(main)/home/_layout/hooks/index.ts +0 -1
  138. package/src/app/[variants]/(main)/home/features/InputArea/index.tsx +1 -1
  139. package/src/components/InlineRename/index.tsx +121 -0
  140. package/src/features/ChatInput/InputEditor/index.tsx +1 -0
  141. package/src/features/EditorCanvas/DiffAllToolbar.tsx +1 -1
  142. package/src/features/NavPanel/components/NavItem.tsx +1 -1
  143. package/src/locales/default/setting.ts +2 -0
  144. package/src/server/routers/lambda/agent.ts +15 -0
  145. package/src/server/routers/lambda/agentGroup.ts +16 -0
  146. package/src/services/agent.ts +11 -0
  147. package/src/services/chatGroup/index.ts +11 -0
  148. package/src/store/agent/slices/cron/action.ts +108 -0
  149. package/src/store/agent/slices/cron/index.ts +1 -0
  150. package/src/store/agent/store.ts +3 -0
  151. package/src/store/home/slices/sidebarUI/action.test.ts +23 -22
  152. package/src/store/home/slices/sidebarUI/action.ts +37 -9
  153. package/src/app/[variants]/(main)/agent/_layout/Sidebar/Topic/CronTopicList/CronTopicGroup.tsx +0 -74
  154. package/src/app/[variants]/(main)/group/features/ChangelogModal.tsx +0 -11
  155. package/src/app/[variants]/(main)/home/_layout/Body/Agent/List/Item/useDropdownMenu.tsx +0 -62
  156. package/src/app/[variants]/(main)/home/_layout/hooks/useSessionItemMenuItems.tsx +0 -238
  157. package/src/hooks/useFetchCronTopicsWithJobInfo.ts +0 -56
@@ -44,28 +44,6 @@ env:
44
44
  BUN_VERSION: 1.2.23
45
45
 
46
46
  jobs:
47
- test:
48
- name: Code quality check
49
- runs-on: ubuntu-latest
50
- steps:
51
- - name: Checkout base
52
- uses: actions/checkout@v6
53
- with:
54
- fetch-depth: 0
55
-
56
- - name: Setup Node & Bun
57
- uses: ./.github/actions/setup-node-bun
58
- with:
59
- node-version: ${{ env.NODE_VERSION }}
60
- bun-version: ${{ env.BUN_VERSION }}
61
- package-manager-cache: 'false'
62
-
63
- - name: Install deps
64
- run: bun i
65
-
66
- - name: Lint
67
- run: bun run lint
68
-
69
47
  version:
70
48
  name: Determine version
71
49
  runs-on: ubuntu-latest
@@ -106,7 +84,7 @@ jobs:
106
84
  echo "🚦 Release Version: ${{ steps.set_version.outputs.version }}"
107
85
 
108
86
  build-macos:
109
- needs: [version, test]
87
+ needs: [version]
110
88
  name: Build Desktop App (macOS)
111
89
  if: inputs.build_macos
112
90
  runs-on: ${{ matrix.os }}
@@ -126,10 +104,10 @@ jobs:
126
104
 
127
105
  # node-linker=hoisted 模式将可以确保 asar 压缩可用
128
106
  - name: Install dependencies
129
- run: pnpm install --node-linker=hoisted
130
-
131
- - name: Install deps on Desktop
132
- run: npm run install-isolated --prefix=./apps/desktop
107
+ run: |
108
+ pnpm install --node-linker=hoisted &
109
+ npm run install-isolated --prefix=./apps/desktop &
110
+ wait
133
111
 
134
112
  - name: Set package version
135
113
  run: npm run workflow:set-desktop-version ${{ needs.version.outputs.version }} ${{ inputs.channel }}
@@ -187,7 +165,7 @@ jobs:
187
165
  retention-days: 5
188
166
 
189
167
  build-windows:
190
- needs: [version, test]
168
+ needs: [version]
191
169
  name: Build Desktop App (Windows)
192
170
  if: inputs.build_windows
193
171
  runs-on: windows-2025
@@ -203,10 +181,11 @@ jobs:
203
181
  package-manager-cache: 'false'
204
182
 
205
183
  - name: Install dependencies
206
- run: pnpm install --node-linker=hoisted
207
-
208
- - name: Install deps on Desktop
209
- run: npm run install-isolated --prefix=./apps/desktop
184
+ shell: pwsh
185
+ run: |
186
+ $job1 = Start-Job -ScriptBlock { pnpm install --node-linker=hoisted }
187
+ $job2 = Start-Job -ScriptBlock { npm run install-isolated --prefix=./apps/desktop }
188
+ $job1, $job2 | Wait-Job | Receive-Job
210
189
 
211
190
  - name: Set package version
212
191
  run: npm run workflow:set-desktop-version ${{ needs.version.outputs.version }} ${{ inputs.channel }}
@@ -240,7 +219,7 @@ jobs:
240
219
  retention-days: 5
241
220
 
242
221
  build-linux:
243
- needs: [version, test]
222
+ needs: [version]
244
223
  name: Build Desktop App (Linux)
245
224
  if: inputs.build_linux
246
225
  runs-on: ubuntu-latest
@@ -256,10 +235,10 @@ jobs:
256
235
  package-manager-cache: 'false'
257
236
 
258
237
  - name: Install dependencies
259
- run: pnpm install --node-linker=hoisted
260
-
261
- - name: Install deps on Desktop
262
- run: npm run install-isolated --prefix=./apps/desktop
238
+ run: |
239
+ pnpm install --node-linker=hoisted &
240
+ npm run install-isolated --prefix=./apps/desktop &
241
+ wait
263
242
 
264
243
  - name: Set package version
265
244
  run: npm run workflow:set-desktop-version ${{ needs.version.outputs.version }} ${{ inputs.channel }}
package/CHANGELOG.md CHANGED
@@ -2,6 +2,58 @@
2
2
 
3
3
  # Changelog
4
4
 
5
+ ## [Version 2.0.0-next.266](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.265...v2.0.0-next.266)
6
+
7
+ <sup>Released on **2026-01-11**</sup>
8
+
9
+ #### 💄 Styles
10
+
11
+ - **misc**: Improve cron jobs style.
12
+
13
+ <br/>
14
+
15
+ <details>
16
+ <summary><kbd>Improvements and Fixes</kbd></summary>
17
+
18
+ #### Styles
19
+
20
+ - **misc**: Improve cron jobs style, closes [#11420](https://github.com/lobehub/lobe-chat/issues/11420) ([d1602f6](https://github.com/lobehub/lobe-chat/commit/d1602f6))
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 2.0.0-next.265](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.264...v2.0.0-next.265)
31
+
32
+ <sup>Released on **2026-01-11**</sup>
33
+
34
+ #### 🐛 Bug Fixes
35
+
36
+ - **misc**: Fix duplicate agent and group, Fix Windows desktop build error with macOS native module, force plain text paste in ChatInput editor.
37
+
38
+ <br/>
39
+
40
+ <details>
41
+ <summary><kbd>Improvements and Fixes</kbd></summary>
42
+
43
+ #### What's fixed
44
+
45
+ - **misc**: Fix duplicate agent and group, closes [#11411](https://github.com/lobehub/lobe-chat/issues/11411) ([bc8aea4](https://github.com/lobehub/lobe-chat/commit/bc8aea4))
46
+ - **misc**: Fix Windows desktop build error with macOS native module, closes [#11417](https://github.com/lobehub/lobe-chat/issues/11417) ([67a8114](https://github.com/lobehub/lobe-chat/commit/67a8114))
47
+ - **misc**: Force plain text paste in ChatInput editor, closes [#11414](https://github.com/lobehub/lobe-chat/issues/11414) ([70daf13](https://github.com/lobehub/lobe-chat/commit/70daf13))
48
+
49
+ </details>
50
+
51
+ <div align="right">
52
+
53
+ [![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
54
+
55
+ </div>
56
+
5
57
  ## [Version 2.0.0-next.264](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.263...v2.0.0-next.264)
6
58
 
7
59
  <sup>Released on **2026-01-11**</sup>
@@ -8,19 +8,31 @@
8
8
  *
9
9
  * This module automatically resolves the full dependency tree.
10
10
  */
11
-
12
11
  import fs from 'node:fs';
12
+ import os from 'node:os';
13
13
  import path from 'node:path';
14
14
  import { fileURLToPath } from 'node:url';
15
15
 
16
16
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
17
17
 
18
+ /**
19
+ * Get the current target platform
20
+ * During build, electron-builder sets npm_config_platform
21
+ * Falls back to os.platform() for development
22
+ */
23
+ function getTargetPlatform() {
24
+ return process.env.npm_config_platform || os.platform();
25
+ }
26
+ const isDarwin = getTargetPlatform() === 'darwin';
18
27
  /**
19
28
  * List of native modules that need special handling
20
29
  * Only add the top-level native modules here - dependencies are resolved automatically
30
+ *
31
+ * Platform-specific modules are only included when building for their target platform
21
32
  */
22
33
  export const nativeModules = [
23
- 'node-mac-permissions',
34
+ // macOS-only native modules
35
+ ...(isDarwin ? ['node-mac-permissions'] : []),
24
36
  // Add more native modules here as needed
25
37
  // e.g., 'better-sqlite3', 'sharp', etc.
26
38
  ];
@@ -32,7 +44,11 @@ export const nativeModules = [
32
44
  * @param {string} nodeModulesPath - Path to node_modules directory
33
45
  * @returns {Set<string>} Set of all dependencies
34
46
  */
35
- function resolveDependencies(moduleName, visited = new Set(), nodeModulesPath = path.join(__dirname, 'node_modules')) {
47
+ function resolveDependencies(
48
+ moduleName,
49
+ visited = new Set(),
50
+ nodeModulesPath = path.join(__dirname, 'node_modules'),
51
+ ) {
36
52
  if (visited.has(moduleName)) {
37
53
  return visited;
38
54
  }
@@ -4,6 +4,10 @@ import { beforeEach, describe, expect, it, vi } from 'vitest';
4
4
  import type { App } from '@/core/App';
5
5
  import type { IpcContext } from '@/utils/ipc';
6
6
  import { IpcHandler } from '@/utils/ipc/base';
7
+ import {
8
+ __resetMacPermissionsModuleCache,
9
+ __setMacPermissionsModule,
10
+ } from '@/utils/permissions';
7
11
 
8
12
  import SystemController from '../SystemCtr';
9
13
 
@@ -131,6 +135,9 @@ describe('SystemController', () => {
131
135
  ipcHandlers.clear();
132
136
  ipcMainHandleMock.mockClear();
133
137
  (IpcHandler.getInstance() as any).registeredChannels?.clear();
138
+ // Reset and inject mock permissions module for testing
139
+ __resetMacPermissionsModuleCache();
140
+ __setMacPermissionsModule(permissionsMock as any);
134
141
  controller = new SystemController(mockApp);
135
142
  });
136
143
 
@@ -169,6 +176,8 @@ describe('SystemController', () => {
169
176
  it('should return true on non-macOS when requesting accessibility access', async () => {
170
177
  const { macOS } = await import('electron-is');
171
178
  vi.mocked(macOS).mockReturnValue(false);
179
+ // Clear the injected module to simulate non-macOS behavior
180
+ __setMacPermissionsModule(null);
172
181
 
173
182
  const result = await invokeIpc('system.requestAccessibilityAccess');
174
183
 
@@ -177,6 +186,7 @@ describe('SystemController', () => {
177
186
 
178
187
  // Reset
179
188
  vi.mocked(macOS).mockReturnValue(true);
189
+ __setMacPermissionsModule(permissionsMock as any);
180
190
  });
181
191
  });
182
192
 
@@ -226,6 +236,8 @@ describe('SystemController', () => {
226
236
  const { macOS } = await import('electron-is');
227
237
  const { shell } = await import('electron');
228
238
  vi.mocked(macOS).mockReturnValue(false);
239
+ // Clear the injected module to simulate non-macOS behavior
240
+ __setMacPermissionsModule(null);
229
241
 
230
242
  const result = await invokeIpc('system.requestMicrophoneAccess');
231
243
 
@@ -235,6 +247,7 @@ describe('SystemController', () => {
235
247
 
236
248
  // Reset
237
249
  vi.mocked(macOS).mockReturnValue(true);
250
+ __setMacPermissionsModule(permissionsMock as any);
238
251
  });
239
252
  });
240
253
 
@@ -1,22 +1,80 @@
1
1
  /**
2
2
  * Unified macOS Permission Management using node-mac-permissions
3
3
  * @see https://github.com/codebytere/node-mac-permissions
4
+ *
5
+ * IMPORTANT: node-mac-permissions is a macOS-only native module.
6
+ * It must be dynamically imported to prevent loading errors on Windows/Linux.
4
7
  */
5
8
  import { shell } from 'electron';
6
9
  import { macOS } from 'electron-is';
7
- import {
8
- askForAccessibilityAccess,
9
- askForCameraAccess,
10
- askForFullDiskAccess,
11
- askForMicrophoneAccess,
12
- askForScreenCaptureAccess,
13
- getAuthStatus,
14
- type AuthType,
15
- type PermissionType,
16
- } from 'node-mac-permissions';
17
10
 
18
11
  import { createLogger } from './logger';
19
12
 
13
+ // Type definitions - use module types when available, fallback to local definition
14
+ // Note: We don't import the module statically, so we need local type definitions
15
+ type AuthType =
16
+ | 'accessibility'
17
+ | 'calendar'
18
+ | 'camera'
19
+ | 'contacts'
20
+ | 'full-disk-access'
21
+ | 'input-monitoring'
22
+ | 'location'
23
+ | 'microphone'
24
+ | 'reminders'
25
+ | 'screen'
26
+ | 'speech-recognition';
27
+
28
+ type PermissionType = 'authorized' | 'denied' | 'not determined' | 'restricted';
29
+
30
+ // Lazy-loaded module cache
31
+ let macPermissionsModule: typeof import('node-mac-permissions') | null = null;
32
+
33
+ // Test injection override (set via __setMacPermissionsModule for testing)
34
+ let testModuleOverride: typeof import('node-mac-permissions') | null = null;
35
+
36
+ /**
37
+ * Lazily load the node-mac-permissions module (macOS only)
38
+ * Returns null on non-macOS platforms
39
+ */
40
+ function getMacPermissionsModule(): typeof import('node-mac-permissions') | null {
41
+ // Allow test injection to override the module
42
+ if (testModuleOverride) {
43
+ return testModuleOverride;
44
+ }
45
+
46
+ if (!macOS()) {
47
+ return null;
48
+ }
49
+
50
+ if (!macPermissionsModule) {
51
+ // Dynamic require to prevent module loading on non-macOS platforms
52
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
53
+ macPermissionsModule = require('node-mac-permissions');
54
+ }
55
+
56
+ return macPermissionsModule;
57
+ }
58
+
59
+ /**
60
+ * Reset the module cache (for testing purposes)
61
+ * @internal
62
+ */
63
+ export function __resetMacPermissionsModuleCache(): void {
64
+ macPermissionsModule = null;
65
+ testModuleOverride = null;
66
+ }
67
+
68
+ /**
69
+ * Set the mac permissions module (for testing purposes)
70
+ * @internal
71
+ */
72
+ export function __setMacPermissionsModule(
73
+ module: typeof import('node-mac-permissions') | null,
74
+ ): void {
75
+ testModuleOverride = module;
76
+ }
77
+
20
78
  const logger = createLogger('utils:permissions');
21
79
 
22
80
  /**
@@ -42,12 +100,13 @@ function normalizeStatus(status: PermissionType | 'not determined'): PermissionS
42
100
  * Get the authorization status for a specific permission type
43
101
  */
44
102
  export function getPermissionStatus(type: AuthType): PermissionStatus {
45
- if (!macOS()) {
103
+ const macPermissions = getMacPermissionsModule();
104
+ if (!macPermissions) {
46
105
  logger.debug(`[Permission] Not macOS, returning granted for ${type}`);
47
106
  return 'granted';
48
107
  }
49
108
 
50
- const status = getAuthStatus(type);
109
+ const status = macPermissions.getAuthStatus(type);
51
110
  const normalized = normalizeStatus(status);
52
111
  logger.info(`[Permission] ${type} status: ${normalized}`);
53
112
  return normalized;
@@ -65,13 +124,14 @@ export function getAccessibilityStatus(): PermissionStatus {
65
124
  * Opens System Preferences to the Accessibility pane
66
125
  */
67
126
  export function requestAccessibilityAccess(): boolean {
68
- if (!macOS()) {
127
+ const macPermissions = getMacPermissionsModule();
128
+ if (!macPermissions) {
69
129
  logger.info('[Accessibility] Not macOS, returning true');
70
130
  return true;
71
131
  }
72
132
 
73
133
  logger.info('[Accessibility] Requesting accessibility access...');
74
- askForAccessibilityAccess();
134
+ macPermissions.askForAccessibilityAccess();
75
135
 
76
136
  // Check the status after requesting
77
137
  const status = getPermissionStatus('accessibility');
@@ -90,7 +150,8 @@ export function getMicrophoneStatus(): PermissionStatus {
90
150
  * Shows the system permission dialog if not determined
91
151
  */
92
152
  export async function requestMicrophoneAccess(): Promise<boolean> {
93
- if (!macOS()) {
153
+ const macPermissions = getMacPermissionsModule();
154
+ if (!macPermissions) {
94
155
  logger.info('[Microphone] Not macOS, returning true');
95
156
  return true;
96
157
  }
@@ -106,7 +167,7 @@ export async function requestMicrophoneAccess(): Promise<boolean> {
106
167
  if (currentStatus === 'not-determined') {
107
168
  logger.info('[Microphone] Status is not-determined, requesting access...');
108
169
  try {
109
- const result = await askForMicrophoneAccess();
170
+ const result = await macPermissions.askForMicrophoneAccess();
110
171
  logger.info(`[Microphone] askForMicrophoneAccess result: ${result}`);
111
172
  return result === 'authorized';
112
173
  } catch (error) {
@@ -135,7 +196,8 @@ export function getCameraStatus(): PermissionStatus {
135
196
  * Shows the system permission dialog if not determined
136
197
  */
137
198
  export async function requestCameraAccess(): Promise<boolean> {
138
- if (!macOS()) {
199
+ const macPermissions = getMacPermissionsModule();
200
+ if (!macPermissions) {
139
201
  logger.info('[Camera] Not macOS, returning true');
140
202
  return true;
141
203
  }
@@ -151,7 +213,7 @@ export async function requestCameraAccess(): Promise<boolean> {
151
213
  if (currentStatus === 'not-determined') {
152
214
  logger.info('[Camera] Status is not-determined, requesting access...');
153
215
  try {
154
- const result = await askForCameraAccess();
216
+ const result = await macPermissions.askForCameraAccess();
155
217
  logger.info(`[Camera] askForCameraAccess result: ${result}`);
156
218
  return result === 'authorized';
157
219
  } catch (error) {
@@ -181,7 +243,8 @@ export function getScreenCaptureStatus(): PermissionStatus {
181
243
  * @param openPreferences - Whether to open System Preferences (default: true)
182
244
  */
183
245
  export async function requestScreenCaptureAccess(openPreferences = true): Promise<boolean> {
184
- if (!macOS()) {
246
+ const macPermissions = getMacPermissionsModule();
247
+ if (!macPermissions) {
185
248
  logger.info('[Screen] Not macOS, returning true');
186
249
  return true;
187
250
  }
@@ -196,7 +259,7 @@ export async function requestScreenCaptureAccess(openPreferences = true): Promis
196
259
 
197
260
  // Request screen capture access - this will prompt the user or open settings
198
261
  logger.info('[Screen] Requesting screen capture access...');
199
- askForScreenCaptureAccess(openPreferences);
262
+ macPermissions.askForScreenCaptureAccess(openPreferences);
200
263
 
201
264
  // Check the status after requesting
202
265
  const newStatus = getPermissionStatus('screen');
@@ -218,13 +281,14 @@ export function getFullDiskAccessStatus(): PermissionStatus {
218
281
  * user must manually add the app in System Settings
219
282
  */
220
283
  export function requestFullDiskAccess(): void {
221
- if (!macOS()) {
284
+ const macPermissions = getMacPermissionsModule();
285
+ if (!macPermissions) {
222
286
  logger.info('[FullDiskAccess] Not macOS, skipping');
223
287
  return;
224
288
  }
225
289
 
226
290
  logger.info('[FullDiskAccess] Opening Full Disk Access settings...');
227
- askForFullDiskAccess();
291
+ macPermissions.askForFullDiskAccess();
228
292
  }
229
293
 
230
294
  /**
package/changelog/v1.json CHANGED
@@ -1,4 +1,22 @@
1
1
  [
2
+ {
3
+ "children": {
4
+ "improvements": [
5
+ "Improve cron jobs style."
6
+ ]
7
+ },
8
+ "date": "2026-01-11",
9
+ "version": "2.0.0-next.266"
10
+ },
11
+ {
12
+ "children": {
13
+ "fixes": [
14
+ "Fix duplicate agent and group, Fix Windows desktop build error with macOS native module, force plain text paste in ChatInput editor."
15
+ ]
16
+ },
17
+ "date": "2026-01-11",
18
+ "version": "2.0.0-next.265"
19
+ },
2
20
  {
3
21
  "children": {
4
22
  "fixes": [
@@ -63,6 +63,7 @@
63
63
  "extendParams.reasoningEffort.title": "شدة التفكير",
64
64
  "extendParams.textVerbosity.title": "مستوى تفصيل النص الناتج",
65
65
  "extendParams.thinking.title": "مفتاح التفكير العميق",
66
+ "extendParams.thinkingBudget.title": "ميزانية التفكير",
66
67
  "extendParams.thinkingLevel.title": "مستوى التفكير",
67
68
  "extendParams.title": "ميزات توسيع النموذج",
68
69
  "extendParams.urlContext.desc": "عند التفعيل، سيتم تحليل الروابط تلقائيًا لاستخراج محتوى صفحة الويب الفعلي",
@@ -194,6 +194,26 @@
194
194
  "providerModels.item.modelConfig.deployName.title": "اسم نشر النموذج",
195
195
  "providerModels.item.modelConfig.displayName.placeholder": "يرجى إدخال اسم العرض للنموذج، مثل ChatGPT، GPT-4، إلخ.",
196
196
  "providerModels.item.modelConfig.displayName.title": "اسم عرض النموذج",
197
+ "providerModels.item.modelConfig.extendParams.extra": "اختر المعلمات الموسعة التي يدعمها النموذج. مرّر المؤشر فوق خيار لمعاينة عناصر التحكم. قد تؤدي التهيئة غير الصحيحة إلى فشل الطلب.",
198
+ "providerModels.item.modelConfig.extendParams.options.disableContextCaching.hint": "لنماذج Claude؛ يمكن أن يقلل التكلفة ويسرّع الاستجابات.",
199
+ "providerModels.item.modelConfig.extendParams.options.enableReasoning.hint": "لنماذج Claude وDeepSeek وغيرها من نماذج الاستدلال؛ يفعّل التفكير العميق.",
200
+ "providerModels.item.modelConfig.extendParams.options.gpt5ReasoningEffort.hint": "لسلسلة GPT-5؛ يتحكم في شدة الاستدلال.",
201
+ "providerModels.item.modelConfig.extendParams.options.gpt5_1ReasoningEffort.hint": "لسلسلة GPT-5.1؛ يتحكم في شدة الاستدلال.",
202
+ "providerModels.item.modelConfig.extendParams.options.gpt5_2ProReasoningEffort.hint": "لسلسلة GPT-5.2 Pro؛ يتحكم في شدة الاستدلال.",
203
+ "providerModels.item.modelConfig.extendParams.options.gpt5_2ReasoningEffort.hint": "لسلسلة GPT-5.2؛ يتحكم في شدة الاستدلال.",
204
+ "providerModels.item.modelConfig.extendParams.options.imageAspectRatio.hint": "لنماذج توليد الصور من Gemini؛ يتحكم في نسبة العرض إلى الارتفاع للصور المُولدة.",
205
+ "providerModels.item.modelConfig.extendParams.options.imageResolution.hint": "لنماذج توليد الصور من Gemini 3؛ يتحكم في دقة الصور المُولدة.",
206
+ "providerModels.item.modelConfig.extendParams.options.reasoningBudgetToken.hint": "لنماذج Claude وQwen3 وما شابهها؛ يتحكم في ميزانية الرموز المخصصة للاستدلال.",
207
+ "providerModels.item.modelConfig.extendParams.options.reasoningEffort.hint": "لنماذج OpenAI وغيرها من النماذج القادرة على الاستدلال؛ يتحكم في جهد الاستدلال.",
208
+ "providerModels.item.modelConfig.extendParams.options.textVerbosity.hint": "لسلسلة GPT-5+؛ يتحكم في تفصيل النص الناتج.",
209
+ "providerModels.item.modelConfig.extendParams.options.thinking.hint": "لبعض نماذج Doubao؛ يسمح للنموذج بتحديد ما إذا كان يجب التفكير بعمق.",
210
+ "providerModels.item.modelConfig.extendParams.options.thinkingBudget.hint": "لسلسلة Gemini؛ يتحكم في ميزانية التفكير.",
211
+ "providerModels.item.modelConfig.extendParams.options.thinkingLevel.hint": "لنماذج المعاينة السريعة من Gemini 3 Flash؛ يتحكم في عمق التفكير.",
212
+ "providerModels.item.modelConfig.extendParams.options.thinkingLevel2.hint": "لنماذج المعاينة الاحترافية من Gemini 3 Pro؛ يتحكم في عمق التفكير.",
213
+ "providerModels.item.modelConfig.extendParams.options.urlContext.hint": "لسلسلة Gemini؛ يدعم توفير سياق من خلال عنوان URL.",
214
+ "providerModels.item.modelConfig.extendParams.placeholder": "اختر المعلمات الموسعة لتفعيلها",
215
+ "providerModels.item.modelConfig.extendParams.previewFallback": "المعاينة غير متوفرة",
216
+ "providerModels.item.modelConfig.extendParams.title": "المعلمات الموسعة",
197
217
  "providerModels.item.modelConfig.files.extra": "تنفيذ رفع الملفات الحالي هو حل مؤقت، مخصص للتجربة الذاتية فقط. يرجى الانتظار حتى تتوفر إمكانيات رفع الملفات الكاملة في المستقبل.",
198
218
  "providerModels.item.modelConfig.files.title": "دعم رفع الملفات",
199
219
  "providerModels.item.modelConfig.functionCall.extra": "سيمكن هذا الإعداد النموذج من استخدام الأدوات، ولكن قدرة النموذج الفعلية على استخدامها تعتمد عليه بالكامل؛ يرجى الاختبار بنفسك.",
@@ -271,20 +271,20 @@
271
271
  "chatgpt-4o-latest.description": "ChatGPT-4o هو نموذج ديناميكي يتم تحديثه في الوقت الفعلي، يجمع بين الفهم العميق والقدرة على التوليد لتلبية احتياجات الاستخدام الواسعة مثل دعم العملاء والتعليم والدعم الفني.",
272
272
  "claude-2.0.description": "Claude 2 يقدم تحسينات رئيسية للمؤسسات، بما في ذلك سياق 200 ألف رمز، تقليل الهلوسة، دعم التعليمات النظامية، وميزة جديدة: استدعاء الأدوات.",
273
273
  "claude-2.1.description": "Claude 2 يقدم تحسينات رئيسية للمؤسسات، بما في ذلك سياق 200 ألف رمز، تقليل الهلوسة، دعم التعليمات النظامية، وميزة جديدة: استدعاء الأدوات.",
274
- "claude-3-5-haiku-20241022.description": "Claude 3.5 Haiku هو أسرع نموذج من الجيل التالي من Anthropic. مقارنةً بـ Claude 3 Haiku، فإنه يُظهر تحسنًا في المهارات ويتفوق على أكبر نموذج سابق Claude 3 Opus في العديد من اختبارات الذكاء.",
274
+ "claude-3-5-haiku-20241022.description": "Claude 3.5 Haiku هو أسرع نموذج من الجيل التالي من Anthropic، مع تحسينات في المهارات وتفوق على النموذج الرائد السابق Claude 3 Opus في العديد من المعايير.",
275
275
  "claude-3-5-haiku-latest.description": "Claude 3.5 Haiku يقدم استجابات سريعة للمهام الخفيفة.",
276
- "claude-3-7-sonnet-20250219.description": "Claude 3.7 Sonnet هو أذكى نموذج من Anthropic وأول نموذج هجيني للاستدلال في السوق. يمكنه تقديم ردود شبه فورية أو استدلال تدريجي خطوة بخطوة يمكن للمستخدمين متابعته. يتميز Sonnet بقوة خاصة في البرمجة، وعلوم البيانات، والرؤية الحاسوبية، ومهام الوكلاء.",
276
+ "claude-3-7-sonnet-20250219.description": "Claude Sonnet 3.7 هو أذكى نموذج من Anthropic وأول نموذج هجيني للاستدلال في السوق، يدعم الاستجابات الفورية أو التفكير المطول مع تحكم دقيق.",
277
277
  "claude-3-7-sonnet-latest.description": "Claude 3.7 Sonnet هو أحدث وأقوى نموذج من Anthropic للمهام المعقدة، يتميز بالأداء العالي، الذكاء، الطلاقة، والفهم العميق.",
278
278
  "claude-3-haiku-20240307.description": "Claude 3 Haiku هو أسرع وأصغر نموذج من Anthropic، مصمم لتقديم استجابات شبه فورية بأداء سريع ودقيق.",
279
279
  "claude-3-opus-20240229.description": "Claude 3 Opus هو أقوى نموذج من Anthropic للمهام المعقدة، يتميز بالأداء العالي، الذكاء، الطلاقة، والفهم.",
280
280
  "claude-3-sonnet-20240229.description": "Claude 3 Sonnet يوازن بين الذكاء والسرعة لتلبية احتياجات المؤسسات، ويوفر فائدة عالية بتكلفة أقل ونشر موثوق على نطاق واسع.",
281
- "claude-haiku-4-5-20251001.description": "Claude Haiku 4.5 هو أسرع وأذكى نموذج Haiku من Anthropic، يجمع بين السرعة الخاطفة والاستدلال المتقدم.",
281
+ "claude-haiku-4-5-20251001.description": "Claude Haiku 4.5 هو أسرع وأكثر نماذج Haiku ذكاءً من Anthropic، يتميز بسرعة فائقة وقدرة على التفكير المطول.",
282
282
  "claude-opus-4-1-20250805-thinking.description": "Claude Opus 4.1 Thinking هو إصدار متقدم يمكنه عرض عملية تفكيره.",
283
283
  "claude-opus-4-1-20250805.description": "Claude Opus 4.1 هو أحدث وأقوى نموذج من Anthropic للمهام المعقدة، يتميز بالأداء العالي، الذكاء، الطلاقة، والفهم.",
284
- "claude-opus-4-20250514.description": "Claude Opus 4 هو أقوى نموذج من Anthropic للمهام المعقدة للغاية، يتميز بالأداء العالي، والذكاء، والطلاقة، والفهم العميق.",
284
+ "claude-opus-4-20250514.description": "Claude Opus 4 هو أقوى نموذج من Anthropic للمهام المعقدة للغاية، يتميز بالأداء العالي، الذكاء، الطلاقة، والفهم العميق.",
285
285
  "claude-opus-4-5-20251101.description": "Claude Opus 4.5 هو النموذج الرائد من Anthropic، يجمع بين الذكاء الاستثنائي والأداء القابل للتوسع، مثالي للمهام المعقدة التي تتطلب استجابات عالية الجودة وتفكير متقدم.",
286
286
  "claude-sonnet-4-20250514-thinking.description": "Claude Sonnet 4 Thinking يمكنه تقديم استجابات شبه فورية أو تفكير متسلسل مرئي.",
287
- "claude-sonnet-4-20250514.description": "Claude Sonnet 4 يمكنه تقديم ردود شبه فورية أو تفكير تدريجي خطوة بخطوة مع عرض واضح للعملية.",
287
+ "claude-sonnet-4-20250514.description": "Claude Sonnet 4 هو أذكى نموذج من Anthropic حتى الآن، يوفر استجابات شبه فورية أو تفكير متسلسل خطوة بخطوة مع تحكم دقيق لمستخدمي واجهة البرمجة.",
288
288
  "claude-sonnet-4-5-20250929.description": "Claude Sonnet 4.5 هو أذكى نموذج من Anthropic حتى الآن.",
289
289
  "codegeex-4.description": "CodeGeeX-4 هو مساعد برمجة ذكي يدعم الأسئلة والأجوبة متعددة اللغات وإكمال الشيفرة لزيادة إنتاجية المطورين.",
290
290
  "codegeex4-all-9b.description": "CodeGeeX4-ALL-9B هو نموذج توليد شيفرة متعدد اللغات يدعم الإكمال والتوليد، تفسير الشيفرة، البحث عبر الإنترنت، استدعاء الوظائف، وأسئلة وأجوبة على مستوى المستودع، ويغطي مجموعة واسعة من سيناريوهات تطوير البرمجيات. يُعد من أفضل نماذج الشيفرة تحت 10B.",
@@ -355,7 +355,7 @@
355
355
  "deepseek-ai/deepseek-v3.1-terminus.description": "DeepSeek V3.1 هو نموذج تفكير من الجيل التالي يتمتع بقدرات أقوى في التفكير المعقد وسلسلة التفكير لمهام التحليل العميق.",
356
356
  "deepseek-ai/deepseek-v3.1.description": "DeepSeek V3.1 هو نموذج تفكير من الجيل التالي يتمتع بقدرات أقوى في التفكير المعقد وسلسلة التفكير لمهام التحليل العميق.",
357
357
  "deepseek-ai/deepseek-vl2.description": "DeepSeek-VL2 هو نموذج رؤية-لغة MoE يعتمد على DeepSeekMoE-27B مع تنشيط متفرق، ويحقق أداءً قويًا باستخدام 4.5 مليار معلمة نشطة فقط. يتميز في الأسئلة البصرية، وOCR، وفهم المستندات/الجداول/المخططات، والتأريض البصري.",
358
- "deepseek-chat.description": "نموذج مفتوح المصدر جديد يجمع بين القدرات العامة والبرمجية. يحافظ على حوار النموذج العام وقوة نموذج البرمجة، مع تحسين التوافق مع تفضيلات المستخدم. DeepSeek-V2.5 يعزز أيضًا مهارات الكتابة واتباع التعليمات.",
358
+ "deepseek-chat.description": "DeepSeek V3.2 يوازن بين الاستدلال وطول المخرجات لمهام الأسئلة والأجوبة اليومية والمهام الوكيلة. يحقق نتائج مماثلة لـ GPT-5 في المعايير العامة، وهو أول من يدمج التفكير في استخدام الأدوات، مما يجعله رائدًا في تقييمات النماذج مفتوحة المصدر.",
359
359
  "deepseek-coder-33B-instruct.description": "DeepSeek Coder 33B هو نموذج لغة برمجية تم تدريبه على 2 تريليون رمز (87٪ كود، 13٪ نص صيني/إنجليزي). يقدم نافذة سياق 16K ومهام الإكمال في المنتصف، ويوفر إكمال كود على مستوى المشاريع وملء مقاطع الكود.",
360
360
  "deepseek-coder-v2.description": "DeepSeek Coder V2 هو نموذج كود MoE مفتوح المصدر يتميز بأداء قوي في مهام البرمجة، ويضاهي GPT-4 Turbo.",
361
361
  "deepseek-coder-v2:236b.description": "DeepSeek Coder V2 هو نموذج كود MoE مفتوح المصدر يتميز بأداء قوي في مهام البرمجة، ويضاهي GPT-4 Turbo.",
@@ -378,7 +378,7 @@
378
378
  "deepseek-r1-fast-online.description": "الإصدار الكامل السريع من DeepSeek R1 مع بحث ويب في الوقت الحقيقي، يجمع بين قدرات بحجم 671B واستجابة أسرع.",
379
379
  "deepseek-r1-online.description": "الإصدار الكامل من DeepSeek R1 مع 671 مليار معلمة وبحث ويب في الوقت الحقيقي، يوفر فهمًا وتوليدًا أقوى.",
380
380
  "deepseek-r1.description": "يستخدم DeepSeek-R1 بيانات البداية الباردة قبل التعلم المعزز ويؤدي أداءً مماثلًا لـ OpenAI-o1 في الرياضيات، والبرمجة، والتفكير.",
381
- "deepseek-reasoner.description": "وضع التفكير في DeepSeek V3.2 يُنتج سلسلة من الأفكار قبل الإجابة النهائية لتحسين الدقة.",
381
+ "deepseek-reasoner.description": "DeepSeek V3.2 Thinking هو نموذج استدلال عميق يولد سلسلة من الأفكار قبل المخرجات لتحقيق دقة أعلى، مع نتائج تنافسية واستدلال يقارن بـ Gemini-3.0-Pro.",
382
382
  "deepseek-v2.description": "DeepSeek V2 هو نموذج MoE فعال لمعالجة منخفضة التكلفة.",
383
383
  "deepseek-v2:236b.description": "DeepSeek V2 236B هو نموذج DeepSeek الموجه للبرمجة مع قدرات قوية في توليد الكود.",
384
384
  "deepseek-v3-0324.description": "DeepSeek-V3-0324 هو نموذج MoE يحتوي على 671 مليار معلمة يتميز بقوة في البرمجة، والقدرات التقنية، وفهم السياق، والتعامل مع النصوص الطويلة.",
@@ -471,7 +471,7 @@
471
471
  "ernie-tiny-8k.description": "ERNIE Tiny 8K هو نموذج فائق الخفة للأسئلة البسيطة، والتصنيف، والاستدلال منخفض التكلفة.",
472
472
  "ernie-x1-turbo-32k.description": "ERNIE X1 Turbo 32K هو نموذج تفكير سريع بسياق 32K للاستدلال المعقد والدردشة متعددة الأدوار.",
473
473
  "ernie-x1.1-preview.description": "معاينة ERNIE X1.1 هو نموذج تفكير مخصص للتقييم والاختبار.",
474
- "fal-ai/bytedance/seedream/v4.description": "Seedream 4.0 هو نموذج توليد صور من ByteDance Seed، يدعم إدخال النصوص والصور مع تحكم عالي الجودة في إخراج الصور. يُولّد صورًا من التعليمات النصية.",
474
+ "fal-ai/bytedance/seedream/v4.description": "Seedream 4.0، من تطوير فريق ByteDance Seed، يدعم إدخال النصوص والصور لتوليد صور عالية الجودة وقابلة للتحكم بدرجة كبيرة من خلال الأوامر.",
475
475
  "fal-ai/flux-kontext/dev.description": "نموذج FLUX.1 يركز على تحرير الصور، ويدعم إدخال النصوص والصور.",
476
476
  "fal-ai/flux-pro/kontext.description": "FLUX.1 Kontext [pro] يقبل النصوص وصور مرجعية كمدخلات، مما يتيح تعديلات محلية مستهدفة وتحولات معقدة في المشهد العام.",
477
477
  "fal-ai/flux/krea.description": "Flux Krea [dev] هو نموذج لتوليد الصور يتميز بميول جمالية نحو صور أكثر واقعية وطبيعية.",
@@ -479,8 +479,8 @@
479
479
  "fal-ai/hunyuan-image/v3.description": "نموذج قوي لتوليد الصور متعدد الوسائط أصلي.",
480
480
  "fal-ai/imagen4/preview.description": "نموذج عالي الجودة لتوليد الصور من Google.",
481
481
  "fal-ai/nano-banana.description": "Nano Banana هو أحدث وأسرع وأكثر نماذج Google كفاءةً لتوليد وتحرير الصور من خلال المحادثة.",
482
- "fal-ai/qwen-image-edit.description": "نموذج تحرير صور احترافي من فريق Qwen يدعم التعديلات الدلالية والمظهرية، ويحرر النصوص الصينية والإنجليزية بدقة، ويتيح تعديلات عالية الجودة مثل نقل الأسلوب وتدوير العناصر.",
483
- "fal-ai/qwen-image.description": "نموذج توليد صور قوي من فريق Qwen يتميز بعرض مميز للنصوص الصينية وأنماط بصرية متنوعة.",
482
+ "fal-ai/qwen-image-edit.description": "نموذج تحرير صور احترافي من فريق Qwen، يدعم التعديلات الدلالية والمظهرية، تحرير النصوص بدقة باللغتين الصينية والإنجليزية، نقل الأنماط، التدوير، والمزيد.",
483
+ "fal-ai/qwen-image.description": "نموذج قوي لتوليد الصور من فريق Qwen يتميز بعرض نصوص صينية قوية وأنماط بصرية متنوعة.",
484
484
  "flux-1-schnell.description": "نموذج تحويل النص إلى صورة يحتوي على 12 مليار معلمة من Black Forest Labs يستخدم تقنيات تقطير الانتشار العدائي الكامن لتوليد صور عالية الجودة في 1-4 خطوات. ينافس البدائل المغلقة ومتاح بموجب ترخيص Apache-2.0 للاستخدام الشخصي والبحثي والتجاري.",
485
485
  "flux-dev.description": "FLUX.1 [dev] هو نموذج مفتوح الأوزان ومقطر للاستخدام غير التجاري. يحافظ على جودة صور قريبة من المستوى الاحترافي واتباع التعليمات مع كفاءة تشغيل أعلى مقارنة بالنماذج القياسية من نفس الحجم.",
486
486
  "flux-kontext-max.description": "توليد وتحرير صور سياقية متقدمة، تجمع بين النصوص والصور لتحقيق نتائج دقيقة ومتسقة.",
@@ -540,6 +540,29 @@
540
540
  "gemma2:2b.description": "Gemma 2 هو نموذج فعال من Google يغطي حالات الاستخدام من التطبيقات الصغيرة إلى معالجة البيانات المعقدة.",
541
541
  "generalv3.5.description": "Spark Max هو الإصدار الأكثر تكاملًا، يدعم البحث عبر الإنترنت والعديد من الإضافات المدمجة. قدراته الأساسية المحسّنة، وأدوار النظام، واستدعاء الوظائف توفر أداءً ممتازًا في سيناريوهات التطبيقات المعقدة.",
542
542
  "generalv3.description": "Spark Pro هو نموذج لغوي عالي الأداء مُحسّن للمجالات المهنية، يركز على الرياضيات، والبرمجة، والرعاية الصحية، والتعليم، مع دعم البحث عبر الإنترنت والإضافات المدمجة مثل الطقس والتاريخ. يقدم أداءً قويًا وكفاءة في أسئلة المعرفة المعقدة، وفهم اللغة، وإنشاء النصوص المتقدمة، مما يجعله خيارًا مثاليًا للاستخدام المهني.",
543
+ "glm-4-0520.description": "GLM-4-0520 هو أحدث إصدار من النموذج، مصمم للمهام المعقدة والمتنوعة بأداء ممتاز.",
544
+ "glm-4-32b-0414.description": "GLM-4 32B 0414 هو نموذج عام من GLM يدعم توليد النصوص وفهمها عبر مهام متعددة.",
545
+ "glm-4-9b-chat.description": "GLM-4-9B-Chat يتميز بقوة في الدلالات، الرياضيات، الاستدلال، البرمجة، والمعرفة. كما يدعم تصفح الويب، تنفيذ الشيفرات، استدعاء الأدوات المخصصة، والاستدلال على النصوص الطويلة، مع دعم لـ 26 لغة منها اليابانية والكورية والألمانية.",
546
+ "glm-4-air-250414.description": "GLM-4-Air هو خيار عالي القيمة بأداء قريب من GLM-4، سرعة عالية، وتكلفة منخفضة.",
547
+ "glm-4-air.description": "GLM-4-Air هو خيار عالي القيمة بأداء قريب من GLM-4، سرعة عالية، وتكلفة منخفضة.",
548
+ "glm-4-airx.description": "GLM-4-AirX هو إصدار أكثر كفاءة من GLM-4-Air بسرعة استدلال تصل إلى 2.6 ضعف.",
549
+ "glm-4-alltools.description": "GLM-4-AllTools هو نموذج وكيل متعدد الاستخدامات محسن لتخطيط التعليمات المعقدة واستخدام الأدوات مثل تصفح الويب، شرح الشيفرات، وتوليد النصوص، مناسب لتنفيذ المهام المتعددة.",
550
+ "glm-4-flash-250414.description": "GLM-4-Flash مثالي للمهام البسيطة: الأسرع ومجاني.",
551
+ "glm-4-flash.description": "GLM-4-Flash مثالي للمهام البسيطة: الأسرع ومجاني.",
552
+ "glm-4-flashx.description": "GLM-4-FlashX هو إصدار محسّن من Flash مع استدلال فائق السرعة.",
553
+ "glm-4-long.description": "GLM-4-Long يدعم إدخالات طويلة جدًا لمهام الذاكرة ومعالجة المستندات واسعة النطاق.",
554
+ "glm-4-plus.description": "GLM-4-Plus هو نموذج رائد عالي الذكاء يتميز بقدرات قوية في التعامل مع النصوص الطويلة والمهام المعقدة، مع أداء عام مطور.",
555
+ "glm-4.1v-thinking-flash.description": "GLM-4.1V-Thinking هو أقوى نموذج VLM معروف بحجم ~10B، يغطي مهام متقدمة مثل فهم الفيديو، الأسئلة البصرية، حل المسائل، التعرف البصري، قراءة المستندات والمخططات، وكلاء واجهات المستخدم، برمجة الواجهات، والتأريض. يتفوق على Qwen2.5-VL-72B الأكبر بـ8 مرات في العديد من المهام. يستخدم استدلال سلسلة الأفكار لتحسين الدقة والثراء، متفوقًا على النماذج التقليدية غير المفكرة في النتائج والشرح.",
556
+ "glm-4.1v-thinking-flashx.description": "GLM-4.1V-Thinking هو أقوى نموذج VLM معروف بحجم ~10B، يغطي مهام متقدمة مثل فهم الفيديو، الأسئلة البصرية، حل المسائل، التعرف البصري، قراءة المستندات والمخططات، وكلاء واجهات المستخدم، برمجة الواجهات، والتأريض. يتفوق على Qwen2.5-VL-72B الأكبر بـ8 مرات في العديد من المهام. يستخدم استدلال سلسلة الأفكار لتحسين الدقة والثراء، متفوقًا على النماذج التقليدية غير المفكرة في النتائج والشرح.",
557
+ "glm-4.5-air.description": "GLM-4.5 إصدار خفيف يوازن بين الأداء والتكلفة، مع أوضاع تفكير هجينة مرنة.",
558
+ "glm-4.5-airx.description": "GLM-4.5-Air إصدار سريع يوفر استجابات أسرع للاستخدام واسع النطاق وعالي السرعة.",
559
+ "glm-4.5-flash.description": "إصدار مجاني من GLM-4.5 بأداء قوي في الاستدلال، البرمجة، والمهام الوكيلة.",
560
+ "glm-4.5-x.description": "GLM-4.5 إصدار سريع، يقدم أداءً قويًا مع سرعات توليد تصل إلى 100 رمز/ثانية.",
561
+ "glm-4.5.description": "نموذج Zhipu الرائد مع وضع تفكير قابل للتبديل، يقدم أداءً رائدًا مفتوح المصدر وسياق يصل إلى 128K.",
562
+ "glm-4.5v.description": "نموذج الرؤية والاستدلال من الجيل التالي من Zhipu بتقنية MoE، يحتوي على 106 مليار معلمة إجمالية و12 مليار نشطة، يحقق أداءً رائدًا بين النماذج متعددة الوسائط مفتوحة المصدر ذات الحجم المماثل في مهام الصور، الفيديو، فهم المستندات، ومهام واجهات المستخدم.",
563
+ "glm-4.6.description": "GLM-4.6 (355B) هو النموذج الرائد الأحدث من Zhipu، يتفوق على الجيل السابق في الترميز المتقدم، معالجة النصوص الطويلة، الاستدلال، وقدرات الوكلاء، ويتماشى مع Claude Sonnet 4 في قدرات البرمجة، مما يجعله النموذج الأفضل في الصين للبرمجة.",
564
+ "glm-4.7.description": "GLM-4.7 هو النموذج الرائد الأحدث من Zhipu، يعزز قدرات الترميز، تخطيط المهام طويلة المدى، والتكامل مع الأدوات في سيناريوهات الترميز الوكيلة. يحقق أداءً رائدًا بين النماذج مفتوحة المصدر في العديد من المعايير العامة، مع تحسينات في القدرات العامة، استجابات أكثر طبيعية، وكتابة أكثر جاذبية. كما يعزز الالتزام بالتعليمات عند استخدام الأدوات، ويحسن من جمالية الواجهات وكفاءة تنفيذ المهام طويلة المدى.",
565
+ "glm-4.description": "GLM-4 هو النموذج الرائد الأقدم الذي تم إصداره في يناير 2024، وقد تم استبداله الآن بـ GLM-4-0520 الأقوى.",
543
566
  "meta.llama3-8b-instruct-v1:0.description": "ميتا لاما 3 هو نموذج لغوي مفتوح المصدر مخصص للمطورين والباحثين والشركات، صُمم لمساعدتهم في بناء أفكار الذكاء الاصطناعي التوليدي، وتجربتها، وتوسيع نطاقها بشكل مسؤول. يُعد جزءًا من البنية التحتية للابتكار المجتمعي العالمي، وهو مناسب للبيئات ذات الموارد المحدودة، والأجهزة الطرفية، وأوقات التدريب الأسرع.",
544
567
  "meta/Llama-3.2-11B-Vision-Instruct.description": "قدرات قوية في الاستدلال الصوري على الصور عالية الدقة، مناسب لتطبيقات الفهم البصري.",
545
568
  "meta/Llama-3.2-90B-Vision-Instruct.description": "استدلال صوري متقدم لتطبيقات الوكلاء المعتمدين على الفهم البصري.",