@lobehub/chat 1.94.10 → 1.94.11
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.
- package/.github/workflows/auto-i18n.yml +37 -325
- package/CHANGELOG.md +25 -0
- package/apps/desktop/src/main/appBrowsers.ts +2 -0
- package/apps/desktop/src/main/core/Browser.ts +39 -1
- package/changelog/v1.json +9 -0
- package/locales/ar/models.json +27 -0
- package/locales/bg-BG/models.json +27 -0
- package/locales/de-DE/models.json +27 -0
- package/locales/en-US/models.json +27 -0
- package/locales/es-ES/models.json +27 -0
- package/locales/fa-IR/models.json +27 -0
- package/locales/fr-FR/models.json +27 -0
- package/locales/it-IT/models.json +27 -0
- package/locales/ja-JP/models.json +27 -0
- package/locales/ko-KR/models.json +27 -0
- package/locales/nl-NL/models.json +27 -0
- package/locales/pl-PL/models.json +27 -0
- package/locales/pt-BR/models.json +27 -0
- package/locales/ru-RU/models.json +27 -0
- package/locales/tr-TR/models.json +27 -0
- package/locales/vi-VN/models.json +27 -0
- package/locales/zh-CN/models.json +27 -0
- package/locales/zh-TW/models.json +27 -0
- package/package.json +1 -1
@@ -5,355 +5,67 @@ on:
|
|
5
5
|
- cron: '0 0 * * *'
|
6
6
|
workflow_dispatch:
|
7
7
|
|
8
|
+
# Add permissions configuration
|
9
|
+
permissions:
|
10
|
+
contents: write
|
11
|
+
pull-requests: write
|
12
|
+
|
8
13
|
jobs:
|
9
14
|
update-i18n:
|
10
15
|
runs-on: ubuntu-latest
|
11
16
|
timeout-minutes: 30
|
12
17
|
|
13
18
|
steps:
|
14
|
-
- uses: actions/checkout@v4
|
15
|
-
with:
|
16
|
-
fetch-depth: 0
|
17
|
-
token: ${{ secrets.GH_TOKEN }}
|
18
|
-
|
19
19
|
- name: Configure Git
|
20
20
|
run: |
|
21
|
-
git config --global user.name "
|
22
|
-
git config --global user.email "
|
21
|
+
git config --global user.name "lobehubbot"
|
22
|
+
git config --global user.email "i@lobehub.com"
|
23
|
+
|
24
|
+
- uses: actions/checkout@v4
|
25
|
+
with:
|
26
|
+
ref: ${{ github.event.pull_request.head.ref }}
|
23
27
|
|
24
28
|
- name: Install bun
|
25
29
|
uses: oven-sh/setup-bun@v1
|
26
30
|
with:
|
27
31
|
bun-version: ${{ secrets.BUN_VERSION }}
|
28
32
|
|
29
|
-
- name: Validate environment
|
30
|
-
id: validate_env
|
31
|
-
run: |
|
32
|
-
echo "🔍 Validating environment..."
|
33
|
-
|
34
|
-
# Check required secrets
|
35
|
-
if [ -z "${{ secrets.OPENAI_API_KEY }}" ]; then
|
36
|
-
echo "❌ OPENAI_API_KEY is missing"
|
37
|
-
echo "env_valid=false" >> $GITHUB_OUTPUT
|
38
|
-
echo "ERROR_VALIDATE_ENV=OPENAI_API_KEY secret is not configured" >> $GITHUB_ENV
|
39
|
-
exit 1
|
40
|
-
fi
|
41
|
-
|
42
|
-
if [ -z "${{ secrets.GH_TOKEN }}" ]; then
|
43
|
-
echo "❌ GH_TOKEN is missing"
|
44
|
-
echo "env_valid=false" >> $GITHUB_OUTPUT
|
45
|
-
echo "ERROR_VALIDATE_ENV=GH_TOKEN secret is not configured" >> $GITHUB_ENV
|
46
|
-
exit 1
|
47
|
-
fi
|
48
|
-
|
49
|
-
# Test OpenAI API connectivity (optional, with timeout)
|
50
|
-
echo "🌐 Testing OpenAI API connectivity..."
|
51
|
-
if timeout 30s curl -s -H "Authorization: Bearer ${{ secrets.OPENAI_API_KEY }}" \
|
52
|
-
${{ secrets.OPENAI_PROXY_URL || 'https://api.openai.com' }}/v1/models >/dev/null 2>&1; then
|
53
|
-
echo "✅ OpenAI API accessible"
|
54
|
-
else
|
55
|
-
echo "⚠️ OpenAI API test failed (but continuing...)"
|
56
|
-
fi
|
57
|
-
|
58
|
-
echo "env_valid=true" >> $GITHUB_OUTPUT
|
59
|
-
|
60
|
-
- name: Check if branch exists
|
61
|
-
id: check_branch
|
62
|
-
run: |
|
63
|
-
echo "🔍 Checking for existing branch..."
|
64
|
-
|
65
|
-
# Retry mechanism for network issues
|
66
|
-
for i in {1..3}; do
|
67
|
-
if git ls-remote --exit-code --heads origin style/auto-i18n >/dev/null 2>&1; then
|
68
|
-
echo "branch_exists=true" >> $GITHUB_OUTPUT
|
69
|
-
echo "🔍 Found existing branch: style/auto-i18n"
|
70
|
-
exit 0
|
71
|
-
elif [ $i -eq 3 ]; then
|
72
|
-
echo "branch_exists=false" >> $GITHUB_OUTPUT
|
73
|
-
echo "ℹ️ Branch style/auto-i18n does not exist"
|
74
|
-
exit 0
|
75
|
-
else
|
76
|
-
echo "⚠️ Network issue, retrying... ($i/3)"
|
77
|
-
sleep 5
|
78
|
-
fi
|
79
|
-
done
|
80
|
-
|
81
|
-
- name: Handle existing branch with rebase
|
82
|
-
if: steps.check_branch.outputs.branch_exists == 'true'
|
83
|
-
id: rebase_attempt
|
84
|
-
run: |
|
85
|
-
echo "🔄 Attempting to rebase existing branch..."
|
86
|
-
|
87
|
-
# Fetch the existing branch with error handling
|
88
|
-
if ! git fetch origin style/auto-i18n; then
|
89
|
-
echo "❌ Failed to fetch existing branch"
|
90
|
-
echo "rebase_success=false" >> $GITHUB_OUTPUT
|
91
|
-
echo "ERROR_REBASE_ATTEMPT=Failed to fetch existing branch from origin" >> $GITHUB_ENV
|
92
|
-
exit 1
|
93
|
-
fi
|
94
|
-
|
95
|
-
if ! git checkout -b style/auto-i18n origin/style/auto-i18n; then
|
96
|
-
echo "❌ Failed to checkout existing branch"
|
97
|
-
echo "rebase_success=false" >> $GITHUB_OUTPUT
|
98
|
-
echo "ERROR_REBASE_ATTEMPT=Failed to checkout existing branch" >> $GITHUB_ENV
|
99
|
-
exit 1
|
100
|
-
fi
|
101
|
-
|
102
|
-
# Try to rebase onto latest main
|
103
|
-
if git rebase origin/main; then
|
104
|
-
echo "✅ Rebase successful"
|
105
|
-
echo "rebase_success=true" >> $GITHUB_OUTPUT
|
106
|
-
else
|
107
|
-
echo "❌ Rebase failed due to conflicts"
|
108
|
-
echo "rebase_success=false" >> $GITHUB_OUTPUT
|
109
|
-
|
110
|
-
# Abort the failed rebase
|
111
|
-
git rebase --abort || echo "⚠️ Failed to abort rebase cleanly"
|
112
|
-
|
113
|
-
# Go back to main and delete the problematic branch
|
114
|
-
git checkout main
|
115
|
-
git branch -D style/auto-i18n || echo "⚠️ Failed to delete local branch"
|
116
|
-
|
117
|
-
# Try to delete remote branch, handle if it fails
|
118
|
-
if git push origin --delete style/auto-i18n 2>/dev/null; then
|
119
|
-
echo "🗑️ Deleted old branch due to rebase conflicts"
|
120
|
-
else
|
121
|
-
echo "⚠️ Could not delete remote branch (may not exist or permission issue)"
|
122
|
-
fi
|
123
|
-
fi
|
124
|
-
|
125
|
-
- name: Create clean branch if needed
|
126
|
-
if: steps.check_branch.outputs.branch_exists == 'false' || steps.rebase_attempt.outputs.rebase_success == 'false'
|
127
|
-
id: create_branch
|
128
|
-
run: |
|
129
|
-
echo "🌿 Creating fresh branch from main..."
|
130
|
-
|
131
|
-
# Ensure we're on main and it's up to date
|
132
|
-
git checkout main
|
133
|
-
git pull origin main
|
134
|
-
|
135
|
-
# Create new branch
|
136
|
-
if git checkout -b style/auto-i18n; then
|
137
|
-
echo "✅ Successfully created new branch"
|
138
|
-
echo "branch_created=true" >> $GITHUB_OUTPUT
|
139
|
-
else
|
140
|
-
echo "❌ Failed to create new branch"
|
141
|
-
echo "branch_created=false" >> $GITHUB_OUTPUT
|
142
|
-
echo "ERROR_CREATE_BRANCH=Failed to create new branch style/auto-i18n" >> $GITHUB_ENV
|
143
|
-
exit 1
|
144
|
-
fi
|
145
|
-
|
146
33
|
- name: Install deps
|
147
|
-
|
148
|
-
run: |
|
149
|
-
echo "📦 Installing dependencies..."
|
150
|
-
|
151
|
-
# Retry mechanism for dependency installation
|
152
|
-
for i in {1..3}; do
|
153
|
-
if bun i; then
|
154
|
-
echo "✅ Dependencies installed successfully"
|
155
|
-
echo "deps_installed=true" >> $GITHUB_OUTPUT
|
156
|
-
exit 0
|
157
|
-
elif [ $i -eq 3 ]; then
|
158
|
-
echo "❌ Failed to install dependencies after 3 attempts"
|
159
|
-
echo "deps_installed=false" >> $GITHUB_OUTPUT
|
160
|
-
echo "ERROR_INSTALL_DEPS=Failed to install dependencies with bun after 3 retries" >> $GITHUB_ENV
|
161
|
-
exit 1
|
162
|
-
else
|
163
|
-
echo "⚠️ Dependency installation failed, retrying... ($i/3)"
|
164
|
-
sleep 10
|
165
|
-
fi
|
166
|
-
done
|
167
|
-
|
168
|
-
- name: Run i18n update
|
169
|
-
id: run_i18n
|
170
|
-
run: |
|
171
|
-
echo "🌐 Running i18n update..."
|
34
|
+
run: bun i
|
172
35
|
|
173
|
-
|
174
|
-
|
175
|
-
echo "✅ i18n update completed successfully"
|
176
|
-
echo "i18n_success=true" >> $GITHUB_OUTPUT
|
177
|
-
else
|
178
|
-
exit_code=$?
|
179
|
-
echo "❌ i18n update failed with exit code: $exit_code"
|
180
|
-
echo "i18n_success=false" >> $GITHUB_OUTPUT
|
181
|
-
|
182
|
-
# Capture error details
|
183
|
-
if [ $exit_code -eq 124 ]; then
|
184
|
-
echo "ERROR_RUN_I18N=i18n update timed out after 15 minutes" >> $GITHUB_ENV
|
185
|
-
else
|
186
|
-
echo "ERROR_RUN_I18N=i18n update failed with exit code $exit_code" >> $GITHUB_ENV
|
187
|
-
fi
|
188
|
-
|
189
|
-
# Save output for debugging
|
190
|
-
echo "📋 Saving debug output..."
|
191
|
-
exit 1
|
192
|
-
fi
|
36
|
+
- name: Update i18n
|
37
|
+
run: bun run i18n
|
193
38
|
env:
|
194
39
|
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
|
195
40
|
OPENAI_PROXY_URL: ${{ secrets.OPENAI_PROXY_URL }}
|
196
41
|
|
197
|
-
- name:
|
198
|
-
id:
|
199
|
-
|
200
|
-
run: |
|
201
|
-
echo "🔍 Checking for changes..."
|
202
|
-
|
203
|
-
if git diff --exit-code >/dev/null 2>&1; then
|
204
|
-
echo "changes_exist=false" >> $GITHUB_OUTPUT
|
205
|
-
echo "ℹ️ No changes detected"
|
206
|
-
else
|
207
|
-
echo "changes_exist=true" >> $GITHUB_OUTPUT
|
208
|
-
echo "✨ Changes detected"
|
209
|
-
|
210
|
-
# Show what changed
|
211
|
-
echo "📝 Changed files:"
|
212
|
-
git diff --name-only | head -20
|
213
|
-
fi
|
214
|
-
|
215
|
-
- name: Commit and push changes
|
216
|
-
if: steps.git_status.outputs.changes_exist == 'true'
|
217
|
-
id: commit_push
|
218
|
-
run: |
|
219
|
-
echo "💾 Committing and pushing changes..."
|
220
|
-
|
221
|
-
git add .
|
222
|
-
|
223
|
-
# Check if there are staged changes after adding files
|
224
|
-
if git diff --cached --exit-code >/dev/null 2>&1; then
|
225
|
-
echo "ℹ️ No staged changes detected after git add. Skipping commit."
|
226
|
-
echo "push_success=false" >> $GITHUB_OUTPUT
|
227
|
-
echo "no_changes_after_stage=true" >> $GITHUB_OUTPUT
|
228
|
-
exit 0
|
229
|
-
fi
|
230
|
-
|
231
|
-
# Attempt to commit with handling for lint-staged preventing empty commits
|
232
|
-
if git commit -m "🤖 style: update i18n
|
233
|
-
|
234
|
-
- Auto-generated i18n updates
|
235
|
-
- Generated at: $(date -u '+%Y-%m-%d %H:%M:%S UTC')
|
236
|
-
- Workflow run: ${{ github.run_number }}"; then
|
237
|
-
echo "✅ Successfully committed changes"
|
238
|
-
else
|
239
|
-
commit_exit_code=$?
|
240
|
-
if [ $commit_exit_code -eq 1 ]; then
|
241
|
-
echo "ℹ️ No changes to commit after lint-staged processing. This is normal."
|
242
|
-
echo "push_success=false" >> $GITHUB_OUTPUT
|
243
|
-
echo "no_changes_after_lint=true" >> $GITHUB_OUTPUT
|
244
|
-
exit 0
|
245
|
-
else
|
246
|
-
echo "❌ Commit failed with exit code: $commit_exit_code"
|
247
|
-
echo "push_success=false" >> $GITHUB_OUTPUT
|
248
|
-
echo "ERROR_COMMIT_PUSH=Git commit failed with exit code $commit_exit_code" >> $GITHUB_ENV
|
249
|
-
exit 1
|
250
|
-
fi
|
251
|
-
fi
|
252
|
-
|
253
|
-
# Push with retry mechanism
|
254
|
-
for i in {1..3}; do
|
255
|
-
if git push origin style/auto-i18n --force-with-lease; then
|
256
|
-
echo "✅ Successfully pushed changes"
|
257
|
-
echo "push_success=true" >> $GITHUB_OUTPUT
|
258
|
-
exit 0
|
259
|
-
elif [ $i -eq 3 ]; then
|
260
|
-
echo "❌ Failed to push changes after 3 attempts"
|
261
|
-
echo "push_success=false" >> $GITHUB_OUTPUT
|
262
|
-
echo "ERROR_COMMIT_PUSH=Failed to push changes to remote repository after 3 retries" >> $GITHUB_ENV
|
263
|
-
exit 1
|
264
|
-
else
|
265
|
-
echo "⚠️ Push failed, retrying... ($i/3)"
|
266
|
-
sleep 5
|
267
|
-
fi
|
268
|
-
done
|
269
|
-
|
270
|
-
- name: Create or Update Pull Request
|
271
|
-
if: steps.git_status.outputs.changes_exist == 'true' && steps.commit_push.outputs.push_success == 'true'
|
272
|
-
id: create_pr
|
273
|
-
uses: peter-evans/create-pull-request@v4
|
42
|
+
- name: create pull request
|
43
|
+
id: cpr
|
44
|
+
uses: peter-evans/create-pull-request@v7
|
274
45
|
with:
|
275
46
|
token: ${{ secrets.GH_TOKEN }}
|
276
|
-
|
277
|
-
|
278
|
-
body: |
|
279
|
-
This PR updates the i18n files.
|
280
|
-
|
281
|
-
## 🔄 Update Strategy
|
282
|
-
${{ steps.check_branch.outputs.branch_exists == 'true' && steps.rebase_attempt.outputs.rebase_success == 'true' && '✅ Successfully rebased existing branch onto latest main' || '' }}
|
283
|
-
${{ steps.check_branch.outputs.branch_exists == 'true' && steps.rebase_attempt.outputs.rebase_success == 'false' && '🔄 Recreated branch due to rebase conflicts' || '' }}
|
284
|
-
${{ steps.check_branch.outputs.branch_exists == 'false' && '🌿 Created fresh branch from main' || '' }}
|
285
|
-
|
286
|
-
## 📝 Changes
|
287
|
-
- Auto-generated i18n updates
|
288
|
-
- Generated at: ${{ github.run_number }}
|
289
|
-
- Timestamp: $(date -u '+%Y-%m-%d %H:%M:%S UTC')
|
290
|
-
|
291
|
-
## 🤖 Automation Info
|
292
|
-
- Workflow: `${{ github.workflow }}`
|
293
|
-
- Run ID: `${{ github.run_id }}`
|
294
|
-
- Commit: `${{ github.sha }}`
|
295
|
-
|
296
|
-
> This PR is automatically generated by GitHub Actions and kept up-to-date with the latest main branch.
|
297
|
-
base: main
|
47
|
+
add-paths: |
|
48
|
+
locales/**/*.json
|
298
49
|
labels: |
|
299
50
|
i18n
|
300
51
|
automated
|
301
52
|
style
|
53
|
+
branch: style/auto-i18n
|
54
|
+
delete-branch: true
|
55
|
+
title: '🤖 style: update i18n'
|
56
|
+
commit-message: '💄 style: update i18n'
|
57
|
+
body: |
|
58
|
+
This PR was automatically generated by the i18n update workflow.
|
59
|
+
Please review the changes and merge if everything looks good.
|
302
60
|
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
- name: No changes
|
315
|
-
if: |
|
316
|
-
(steps.git_status.outputs.changes_exist != 'true' && steps.run_i18n.outputs.i18n_success == 'true') ||
|
317
|
-
(steps.commit_push.outputs.no_changes_after_stage == 'true') ||
|
318
|
-
(steps.commit_push.outputs.no_changes_after_lint == 'true')
|
319
|
-
run: |
|
320
|
-
if [ "${{ steps.commit_push.outputs.no_changes_after_stage }}" == "true" ]; then
|
321
|
-
echo "ℹ️ No staged changes detected after git add. Skipping PR creation."
|
322
|
-
elif [ "${{ steps.commit_push.outputs.no_changes_after_lint }}" == "true" ]; then
|
323
|
-
echo "ℹ️ No changes remaining after lint-staged processing. Skipping PR creation."
|
324
|
-
else
|
325
|
-
echo "ℹ️ No changes to commit. Skipping PR creation."
|
326
|
-
fi
|
327
|
-
|
328
|
-
# Set step status for issue creation
|
329
|
-
- name: Set step conclusions
|
330
|
-
if: always()
|
331
|
-
run: |
|
332
|
-
echo "STEP_VALIDATE_ENV=${{ steps.validate_env.conclusion || 'Not run' }}" >> $GITHUB_ENV
|
333
|
-
echo "STEP_CHECK_BRANCH=${{ steps.check_branch.conclusion || 'Not run' }}" >> $GITHUB_ENV
|
334
|
-
echo "STEP_REBASE_ATTEMPT=${{ steps.rebase_attempt.conclusion || 'Not run' }}" >> $GITHUB_ENV
|
335
|
-
echo "STEP_CREATE_BRANCH=${{ steps.create_branch.conclusion || 'Not run' }}" >> $GITHUB_ENV
|
336
|
-
echo "STEP_INSTALL_DEPS=${{ steps.install_deps.conclusion || 'Not run' }}" >> $GITHUB_ENV
|
337
|
-
echo "STEP_RUN_I18N=${{ steps.run_i18n.conclusion || 'Not run' }}" >> $GITHUB_ENV
|
338
|
-
echo "STEP_COMMIT_PUSH=${{ steps.commit_push.conclusion || 'Not run' }}" >> $GITHUB_ENV
|
339
|
-
echo "STEP_CREATE_PR=${{ steps.create_pr.conclusion || 'Not run' }}" >> $GITHUB_ENV
|
340
|
-
|
341
|
-
# Error handling and issue creation
|
342
|
-
- name: Upload debug artifacts
|
343
|
-
if: failure()
|
344
|
-
uses: actions/upload-artifact@v4
|
345
|
-
with:
|
346
|
-
name: debug-logs-${{ github.run_number }}
|
347
|
-
path: |
|
348
|
-
i18n_output.log
|
349
|
-
/tmp/*.log
|
350
|
-
retention-days: 7
|
351
|
-
|
352
|
-
- name: Create issue on failure
|
353
|
-
if: failure()
|
354
|
-
uses: actions/github-script@v6
|
355
|
-
with:
|
356
|
-
github-token: ${{ secrets.GH_TOKEN }}
|
357
|
-
script: |
|
358
|
-
const createFailureIssue = require('./.github/scripts/create-failure-issue.js');
|
359
|
-
return await createFailureIssue({ github, context, core });
|
61
|
+
## 🤖 Automation Info
|
62
|
+
- Workflow: `${{ github.workflow }}`
|
63
|
+
- Run ID: `${{ github.run_id }}`
|
64
|
+
- Commit: `${{ github.sha }}`
|
65
|
+
|
66
|
+
<details>
|
67
|
+
<summary>i18n Update Log</summary>
|
68
|
+
```bash
|
69
|
+
$(cat i18n_update.log)
|
70
|
+
```
|
71
|
+
</details>
|
package/CHANGELOG.md
CHANGED
@@ -2,6 +2,31 @@
|
|
2
2
|
|
3
3
|
# Changelog
|
4
4
|
|
5
|
+
### [Version 1.94.11](https://github.com/lobehub/lobe-chat/compare/v1.94.10...v1.94.11)
|
6
|
+
|
7
|
+
<sup>Released on **2025-06-17**</sup>
|
8
|
+
|
9
|
+
#### 🐛 Bug Fixes
|
10
|
+
|
11
|
+
- **misc**: Enhance the multi-display window opening experience.
|
12
|
+
|
13
|
+
<br/>
|
14
|
+
|
15
|
+
<details>
|
16
|
+
<summary><kbd>Improvements and Fixes</kbd></summary>
|
17
|
+
|
18
|
+
#### What's fixed
|
19
|
+
|
20
|
+
- **misc**: Enhance the multi-display window opening experience, closes [#8176](https://github.com/lobehub/lobe-chat/issues/8176) ([b132e66](https://github.com/lobehub/lobe-chat/commit/b132e66))
|
21
|
+
|
22
|
+
</details>
|
23
|
+
|
24
|
+
<div align="right">
|
25
|
+
|
26
|
+
[](#readme-top)
|
27
|
+
|
28
|
+
</div>
|
29
|
+
|
5
30
|
### [Version 1.94.10](https://github.com/lobehub/lobe-chat/compare/v1.94.9...v1.94.10)
|
6
31
|
|
7
32
|
<sup>Released on **2025-06-15**</sup>
|
@@ -26,6 +26,7 @@ export const appBrowsers = {
|
|
26
26
|
identifier: 'devtools',
|
27
27
|
maximizable: false,
|
28
28
|
minWidth: 400,
|
29
|
+
parentIdentifier: 'chat',
|
29
30
|
path: '/desktop/devtools',
|
30
31
|
titleBarStyle: 'hiddenInset',
|
31
32
|
vibrancy: 'under-window',
|
@@ -37,6 +38,7 @@ export const appBrowsers = {
|
|
37
38
|
identifier: 'settings',
|
38
39
|
keepAlive: true,
|
39
40
|
minWidth: 600,
|
41
|
+
parentIdentifier: 'chat',
|
40
42
|
path: '/settings',
|
41
43
|
titleBarStyle: 'hidden',
|
42
44
|
vibrancy: 'under-window',
|
@@ -1,5 +1,11 @@
|
|
1
1
|
import { MainBroadcastEventKey, MainBroadcastParams } from '@lobechat/electron-client-ipc';
|
2
|
-
import {
|
2
|
+
import {
|
3
|
+
BrowserWindow,
|
4
|
+
BrowserWindowConstructorOptions,
|
5
|
+
ipcMain,
|
6
|
+
nativeTheme,
|
7
|
+
screen,
|
8
|
+
} from 'electron';
|
3
9
|
import os from 'node:os';
|
4
10
|
import { join } from 'node:path';
|
5
11
|
|
@@ -19,6 +25,7 @@ export interface BrowserWindowOpts extends BrowserWindowConstructorOptions {
|
|
19
25
|
*/
|
20
26
|
identifier: string;
|
21
27
|
keepAlive?: boolean;
|
28
|
+
parentIdentifier?: string;
|
22
29
|
path: string;
|
23
30
|
showOnInit?: boolean;
|
24
31
|
title?: string;
|
@@ -145,9 +152,40 @@ export default class Browser {
|
|
145
152
|
|
146
153
|
show() {
|
147
154
|
logger.debug(`Showing window: ${this.identifier}`);
|
155
|
+
this.determineWindowPosition();
|
148
156
|
this.browserWindow.show();
|
149
157
|
}
|
150
158
|
|
159
|
+
private determineWindowPosition() {
|
160
|
+
const { parentIdentifier } = this.options;
|
161
|
+
|
162
|
+
if (parentIdentifier) {
|
163
|
+
// todo: fix ts type
|
164
|
+
const parentWin = this.app.browserManager.retrieveByIdentifier(parentIdentifier as any);
|
165
|
+
if (parentWin) {
|
166
|
+
logger.debug(`[${this.identifier}] Found parent window: ${parentIdentifier}`);
|
167
|
+
|
168
|
+
const display = screen.getDisplayNearestPoint(parentWin.browserWindow.getContentBounds());
|
169
|
+
if (display) {
|
170
|
+
const {
|
171
|
+
workArea: { x, y, width: displayWidth, height: displayHeight },
|
172
|
+
} = display;
|
173
|
+
|
174
|
+
const { width, height } = this._browserWindow.getContentBounds();
|
175
|
+
logger.debug(
|
176
|
+
`[${this.identifier}] Display bounds: x=${x}, y=${y}, width=${displayWidth}, height=${displayHeight}`,
|
177
|
+
);
|
178
|
+
|
179
|
+
// Calculate new position
|
180
|
+
const newX = Math.floor(Math.max(x + (displayWidth - width) / 2, x));
|
181
|
+
const newY = Math.floor(Math.max(y + (displayHeight - height) / 2, y));
|
182
|
+
logger.debug(`[${this.identifier}] Calculated position: x=${newX}, y=${newY}`);
|
183
|
+
this._browserWindow.setPosition(newX, newY, false);
|
184
|
+
}
|
185
|
+
}
|
186
|
+
}
|
187
|
+
}
|
188
|
+
|
151
189
|
hide() {
|
152
190
|
logger.debug(`Hiding window: ${this.identifier}`);
|
153
191
|
this.browserWindow.hide();
|
package/changelog/v1.json
CHANGED
package/locales/ar/models.json
CHANGED
@@ -659,6 +659,9 @@
|
|
659
659
|
"codestral-latest": {
|
660
660
|
"description": "Codestral هو نموذج توليد متقدم يركز على توليد الشيفرة، تم تحسينه لمهام الملء الوسيط وإكمال الشيفرة."
|
661
661
|
},
|
662
|
+
"codex-mini-latest": {
|
663
|
+
"description": "codex-mini-latest هو نسخة محسنة من o4-mini، مخصصة لـ Codex CLI. بالنسبة للاستخدام المباشر عبر API، نوصي بالبدء من gpt-4.1."
|
664
|
+
},
|
662
665
|
"cognitivecomputations/dolphin-mixtral-8x22b": {
|
663
666
|
"description": "Dolphin Mixtral 8x22B هو نموذج مصمم للامتثال للتعليمات، والحوار، والبرمجة."
|
664
667
|
},
|
@@ -716,6 +719,9 @@
|
|
716
719
|
"compound-beta-mini": {
|
717
720
|
"description": "Compound-beta-mini هو نظام ذكاء اصطناعي مركب، مدعوم بنماذج مفتوحة متاحة في GroqCloud، يمكنه استخدام الأدوات بشكل ذكي وانتقائي للإجابة على استفسارات المستخدمين."
|
718
721
|
},
|
722
|
+
"computer-use-preview": {
|
723
|
+
"description": "نموذج computer-use-preview هو نموذج مخصص مصمم خصيصًا لـ \"أدوات استخدام الكمبيوتر\"، تم تدريبه لفهم وتنفيذ المهام المتعلقة بالكمبيوتر."
|
724
|
+
},
|
719
725
|
"dall-e-2": {
|
720
726
|
"description": "النموذج الثاني من DALL·E، يدعم توليد صور أكثر واقعية ودقة، بدقة تعادل أربعة أضعاف الجيل الأول."
|
721
727
|
},
|
@@ -905,6 +911,15 @@
|
|
905
911
|
"doubao-1.5-vision-lite": {
|
906
912
|
"description": "Doubao-1.5-vision-lite هو نموذج كبير متعدد الوسائط تم ترقيته حديثًا، يدعم التعرف على الصور بدقة غير محدودة ونسب عرض إلى ارتفاع متطرفة، ويعزز قدرات الاستدلال البصري، التعرف على الوثائق، فهم المعلومات التفصيلية، واتباع التعليمات. يدعم نافذة سياق 128k، وطول الإخراج يدعم حتى 16k توكن."
|
907
913
|
},
|
914
|
+
"doubao-seed-1.6": {
|
915
|
+
"description": "نموذج Doubao-Seed-1.6 متعدد الوسائط للتفكير العميق، يدعم ثلاثة أوضاع تفكير: تلقائي/تفكير/عدم تفكير. في وضع عدم التفكير، يتحسن أداء النموذج بشكل كبير مقارنة بـ Doubao-1.5-pro/250115. يدعم نافذة سياق تصل إلى 256k وطول إخراج يصل إلى 16k رمز."
|
916
|
+
},
|
917
|
+
"doubao-seed-1.6-flash": {
|
918
|
+
"description": "نموذج Doubao-Seed-1.6-flash هو نموذج متعدد الوسائط للتفكير العميق بسرعات استدلال فائقة، حيث يحتاج TPOT فقط إلى 10 مللي ثانية؛ يدعم فهم النصوص والرؤية، وتفوق قدرات فهم النصوص على الجيل السابق lite، وفهم الرؤية يضاهي نماذج pro المنافسة. يدعم نافذة سياق تصل إلى 256k وطول إخراج يصل إلى 16k رمز."
|
919
|
+
},
|
920
|
+
"doubao-seed-1.6-thinking": {
|
921
|
+
"description": "نموذج Doubao-Seed-1.6-thinking يعزز قدرات التفكير بشكل كبير، مقارنة بـ Doubao-1.5-thinking-pro، مع تحسينات إضافية في القدرات الأساسية مثل البرمجة والرياضيات والاستدلال المنطقي، ويدعم الفهم البصري. يدعم نافذة سياق تصل إلى 256k وطول إخراج يصل إلى 16k رمز."
|
922
|
+
},
|
908
923
|
"emohaa": {
|
909
924
|
"description": "Emohaa هو نموذج نفسي، يتمتع بقدرات استشارية متخصصة، يساعد المستخدمين في فهم القضايا العاطفية."
|
910
925
|
},
|
@@ -1268,6 +1283,9 @@
|
|
1268
1283
|
"gpt-4o-mini": {
|
1269
1284
|
"description": "نموذج GPT-4o mini هو أحدث نموذج أطلقته OpenAI بعد GPT-4 Omni، ويدعم إدخال الصور والنصوص وإخراج النصوص. كأحد نماذجهم المتقدمة الصغيرة، فهو أرخص بكثير من النماذج الرائدة الأخرى في الآونة الأخيرة، وأرخص بأكثر من 60% من GPT-3.5 Turbo. يحتفظ بذكاء متقدم مع قيمة ممتازة. حصل GPT-4o mini على 82% في اختبار MMLU، وهو حاليًا يتفوق على GPT-4 في تفضيلات الدردشة."
|
1270
1285
|
},
|
1286
|
+
"gpt-4o-mini-audio-preview": {
|
1287
|
+
"description": "نموذج GPT-4o mini Audio، يدعم إدخال وإخراج الصوت."
|
1288
|
+
},
|
1271
1289
|
"gpt-4o-mini-realtime-preview": {
|
1272
1290
|
"description": "الإصدار المصغر الفوري من GPT-4o، يدعم إدخال وإخراج الصوت والنص في الوقت الحقيقي."
|
1273
1291
|
},
|
@@ -1421,6 +1439,9 @@
|
|
1421
1439
|
"kimi-latest": {
|
1422
1440
|
"description": "يستخدم منتج كيمي المساعد الذكي أحدث نموذج كبير من كيمي، وقد يحتوي على ميزات لم تستقر بعد. يدعم فهم الصور، وسيختار تلقائيًا نموذج 8k/32k/128k كنموذج للتسعير بناءً على طول سياق الطلب."
|
1423
1441
|
},
|
1442
|
+
"kimi-thinking-preview": {
|
1443
|
+
"description": "نموذج kimi-thinking-preview هو نموذج تفكير متعدد الوسائط يتمتع بقدرات استدلال متعددة الوسائط وعامة، مقدم من الجانب المظلم للقمر، يتقن الاستدلال العميق ويساعد في حل المزيد من المسائل الصعبة."
|
1444
|
+
},
|
1424
1445
|
"learnlm-1.5-pro-experimental": {
|
1425
1446
|
"description": "LearnLM هو نموذج لغوي تجريبي محدد المهام، تم تدريبه ليتماشى مع مبادئ علوم التعلم، يمكنه اتباع التعليمات النظامية في سيناريوهات التعليم والتعلم، ويعمل كمدرب خبير."
|
1426
1447
|
},
|
@@ -1823,12 +1844,18 @@
|
|
1823
1844
|
"o1-preview": {
|
1824
1845
|
"description": "o1 هو نموذج استدلال جديد من OpenAI، مناسب للمهام المعقدة التي تتطلب معرفة عامة واسعة. يحتوي هذا النموذج على 128K من السياق وتاريخ انتهاء المعرفة في أكتوبر 2023."
|
1825
1846
|
},
|
1847
|
+
"o1-pro": {
|
1848
|
+
"description": "سلسلة نماذج o1 مدربة بالتعلم المعزز، قادرة على التفكير قبل الإجابة وتنفيذ مهام استدلال معقدة. يستخدم نموذج o1-pro موارد حسابية أكبر للتفكير بشكل أعمق، مما يضمن تقديم إجابات ذات جودة أعلى باستمرار."
|
1849
|
+
},
|
1826
1850
|
"o3": {
|
1827
1851
|
"description": "o3 هو نموذج قوي شامل، يظهر أداءً ممتازًا في مجالات متعددة. يضع معايير جديدة في المهام الرياضية، العلمية، البرمجية، واستدلال الرؤية. كما أنه بارع في الكتابة التقنية واتباع التعليمات. يمكن للمستخدمين استخدامه لتحليل النصوص، الأكواد، والصور، وحل المشكلات المعقدة متعددة الخطوات."
|
1828
1852
|
},
|
1829
1853
|
"o3-mini": {
|
1830
1854
|
"description": "o3-mini هو أحدث نموذج استدلال صغير لدينا، يقدم ذكاءً عالياً تحت نفس تكاليف التأخير والأداء مثل o1-mini."
|
1831
1855
|
},
|
1856
|
+
"o3-pro": {
|
1857
|
+
"description": "نموذج o3-pro يستخدم المزيد من الحسابات للتفكير بشكل أعمق وتقديم إجابات أفضل دائمًا، ويدعم فقط الاستخدام ضمن Responses API."
|
1858
|
+
},
|
1832
1859
|
"o4-mini": {
|
1833
1860
|
"description": "o4-mini هو أحدث نموذج صغير من سلسلة o. تم تحسينه للاستدلال السريع والفعال، ويظهر كفاءة وأداء عاليين في المهام البرمجية والرؤية."
|
1834
1861
|
},
|