晴天
5235853373
fix(gateway): debounce restart with single-flight queue ( #248 )
...
Root cause for #243 / #244 / #240 : model edits trigger
api.restartGateway() with only 300ms debounce. Fast consecutive
edits stack up restart calls, creating zombie Gateway processes,
failed restarts, and CPU fan spikes.
Layer A (frontend):
- New src/lib/gateway-restart-queue.js: 3s debounce + single-flight
lock + reschedule on in-flight request
- Refactor src/pages/models.js doAutoSave: write config immediately,
schedule restart via queue with 'Apply now' toast button
- Subscribe to queue state for unified success/failure toast
- Add i18n: models.configQueued, models.applyNow
Layer B (backend):
- src-tauri/src/commands/config.rs: wrap restart_gateway /
reload_gateway with tokio::sync::Mutex + 2s cooldown
- Cargo.toml: add tokio 'sync' feature
- scripts/dev-api.js: same guard for Web mode (inflight promise
reuse + 2s cooldown)
Effects:
- 10 rapid edits within 3s -> 1 restart (was 10+ with races)
- Backend serializes concurrent restart calls, no zombie spawns
- User sees single 'Apply now' toast instead of restart storm
Refs #243 #244 #240
2026-04-24 19:35:39 +08:00
friendfish
66e57adab0
fix(models): recognize google-generative-ai as google-gemini api type ( #241 )
...
Fixes #239
2026-04-24 17:39:39 +08:00
晴天
53720e4e33
fix: cargo fmt formatting for list_remote_models
2026-04-20 16:16:57 +08:00
晴天
1ef9ca8ede
fix(models): 获取模型列表 404 改为友好提示 + 助手侧走后端绕 CORS
...
场景:部分服务商(如某些厂商的 Anthropic 兼容接口)不提供 /models 列表接口,
之前会直接显示 HTTP 404 Not Found / Failed to fetch 等技术错误,用户体验差。
- Rust list_remote_models:识别 404/405/501 作为"不支持自动获取"场景,
返回带 [NOT_SUPPORTED] 前缀的友好错误,而非裸 HTTP 状态码
- 模型配置页「获取列表」:识别 [NOT_SUPPORTED] 后弹出引导对话框,
点击「模型」按钮直接进入手动添加流程
- 助手设置页「获取列表」:改为走 Rust 后端 api.listRemoteModels,
原先直接用前端 fetch 会被 WebView CORS 拦截(provider 不返回 CORS 头),
改走后端既绕开 CORS 又能获得一致的友好提示
- Web 模式 dev-api.js 同步 404 识别逻辑,保证桌面 / Web 行为一致
- 补齐 models.fetchNotSupported / assistant.fetchNotSupported 多语言文案
2026-04-20 16:01:24 +08:00
晴天
12cdc72d2b
fix(assistant): 模型测试按钮改用流式累积 + 增强诊断信息
...
- 测试请求切换到 stream: true + SSE 累积,绕开部分兼容网关
non-streaming 分支对某些模型返回 200 + 空 body 的已知 bug,
行为与真实对话路径一致
- 后端 test_model_verbose 显式设置 Accept-Encoding: identity,
避免压缩协商带来的解码风险
- 用 resp.bytes() + 严格 UTF-8 decode,失败时 fallback 到
lossy 字符串 + 前 200 字节 hex dump,方便定位非 UTF-8 响应
- 展开 reqwest error source 链,响应头与字节数原样返回前端
- 前端结果面板突出显示完整模型回复、固定 prompt 标注、
响应头与 raw bytes hex,方便用户自查上游问题
- scripts/dev-api.js 同步 Rust 后端行为,保证 Web/桌面两侧诊断一致
2026-04-20 15:36:09 +08:00
晴天
f69360744f
fix(assistant): 修复测试 Response Body 为 (empty) + 优化结果展示
...
## 用户反馈
截图显示测试结果详情里 "Response Body: (empty)",但对话实际可用。
用户:"有一个比较严重的bug...具体返回参数看不到...我感觉我们的功能不完整"
## 根因分析
1. **Accept-Encoding 未限制**:reqwest 只启用了 gzip feature(未启用 brotli),
但 provider 经 CDN/反代可能返回 Content-Encoding: br,导致 resp.text() 解码失败。
2. **错误被静默吞**:`resp.text().await.unwrap_or_default()` 在解码失败时返回 "",
前端展示为 (empty) 但没有任何错误提示,用户无法诊断。
3. **展示设计:reply 被截断 + 藏在折叠面板**:成功时模型回复只显示前 80 字符的
预览,完整内容要展开 "查看完整请求/响应参数" 才能看到(还被 JSON 混在一起)。
## 修复
### Rust test_model_verbose
三个分支(OpenAI / Anthropic / Gemini)都显式加 `Accept-Encoding: identity`
头,禁止响应压缩。测试请求的响应体很小(几百字节),不压缩的性能损失可忽略。
`resp.text().await` 失败时不再 unwrap_or_default 静默吞,而是返回带 error 的
JSON:`"读取响应体失败: {e} (可能是压缩编码未支持或非 UTF-8 响应)"`
### dev-api.js test_model_verbose(Web 模式)
三个分支的 headers 都加 `'Accept-Encoding': 'identity'`,和 Rust 行为一致。
### 前端 buildTestResult 重写
- **顶部显眼展示模型回复**(边框高亮 + 完整内容 + max-height:180px 加 scroll,
不再截断为 80 字预览):
```
✓ 连接成功 (300ms, Chat Completions)
╔═════════════════════════════╗
║ MODEL REPLY ║ ← 完整回复全文
║ 你好!我是 QC-A04... ║
╚═════════════════════════════╝
```
- **空 respBody + 非空 reply 时给明确诊断**:"响应主体未能读取(可能是压缩
编码异常),但已从响应流中提取到回复内容"
- **固定 prompt 脚注**:`📌 本次测试使用预设 prompt "你好,请用一句话回复"
+ max_tokens=200` —— 让用户明白这是固定诊断请求,不是真实对话。
- **详情面板的空 body 展示优化**:不再显示 "(empty)" 字面量(可能被误解为
服务器真的返回了空字符串),改为带颜色和 italic 的 "(响应体为空)" 提示。
### i18n 新增 5 个翻译键
- testModelReply:Model Reply
- testFixedPrompt:本次测试使用预设 prompt...
- testRespBodyEmpty:响应主体未能读取...但已从流中提取回复
- testShowDetails:查看完整请求/响应参数(原来硬编码中文)
- testRespBodyEmptyDetail:(响应体为空) [原来是硬编码 "(empty)"]
均覆盖 zh-CN / en / zh-TW / ja / ko / vi。
## 验证
- npm run build 通过(assistant chunk gzip 49.43 KB)
- cargo check 通过
- 下一步:用户实测后确认 Response Body 正常显示再发 v0.13.4
## 相关
- Roadmap v0.14.0:把测试功能升级成迷你 Playground(自定义 prompt / 多轮
对话 / 流式显示 / max_tokens 滑块)
2026-04-20 14:12:40 +08:00
晴天
e39233f2c1
fix(lifecycle): 卸载/升级 OpenClaw 后同步刷新 Rust 缓存与前端缓存
...
这是 #Compat-4(安装不识别修复)的收尾补丁。除了 setup 安装场景,
OpenClaw 的卸载和升级场景也存在类似的缓存失效问题。
## Rust 端:uninstall_openclaw_inner 卸载后刷缓存
卸载完成时只 emit 了 "upgrade-progress 100",但没有刷 enhanced_path
和 CLI 检测缓存。后果:
- `is_cli_installed`(60s TTL)在卸载后 60 秒内仍返回 true,UI 显示
「CLI 已安装」
- 服务状态页 gateway 被误判为还在运行
在 emit 进度 100 之后立刻调用:
- `super::refresh_enhanced_path()`
- `crate::commands::service::invalidate_cli_detection_cache()`
## 前端:upgrade/uninstall/installGateway/uninstallGateway 清前端缓存
`upgrade_openclaw` / `uninstall_openclaw` / `install_gateway` /
`uninstall_gateway` 这四个 API 会改变 CLI 状态或 Gateway 状态,但
原先直接 invoke,没有清前端的 cachedInvoke 缓存。Rust 端自己刷了
缓存没用,前端仍吃旧的 `check_installation` / `get_services_status`
/ `get_version_info` 缓存(60s / 10s / 30s TTL)。
统一在调用前 invalidate 相关缓存:
- upgrade/uninstall OpenClaw → 清 check_installation / check_node /
check_git / get_services_status / get_status_summary / get_version_info
- install/uninstall Gateway → 清 get_services_status / get_status_summary
## 验证
- `cargo check` 通过
- `npm run build` 通过
2026-04-20 12:46:06 +08:00
晴天
bf9cb52e25
fix(setup): 修复 Node.js/Git/OpenClaw 装完不识别(需重启客户端)
...
用户反馈 0.13.3 版本有三个共性 bug:
1. 手动装 Node.js → 装完 panel 不识别,必须重启客户端
2. 一键装 Git → 装完 panel 不识别,必须重启客户端
3. 一键装 OpenClaw → 装完 panel 不识别,必须重启客户端
## 根因
Tauri 进程的 `std::env::var("PATH")` 是启动时快照,不会随系统 PATH 更
新。`enhanced_path()` 虽然扫描了常见安装目录,但**不存在的目录不会被
加入缓存**(line 828 `std::path::Path::new(p).exists()` 过滤)。装完
新程序后,新路径不在 enhanced_path 缓存里,CLI 检测又依赖子进程的
PATH,导致「找不到刚装的二进制」。
三个 bug 各有其子因:
### Bug 1: Git 检测 `find_git_path` 不用 enhanced_path
对比 `find_node_path` 显式 `cmd.env("PATH", enhanced_path)`,
`find_git_path` 里的 `where git` / `which git` 子进程继承的是 Tauri
启动时快照的老 PATH。即使 `refresh_enhanced_path()` 刷了缓存,子进
程也看不到新路径。`check_git` 后续调 `Command::new("git")` 同理,且
拿到 `git_path` 绝对路径后也没用。
### Bug 2: `auto_install_git` 三平台都不刷缓存
winget/xcode-select/apt 安装成功后直接 return,没有
`refresh_enhanced_path()` / `invalidate_cli_detection_cache()`。前端
`runDetect` 虽然会调 `invalidatePathCache`,但 Bug 1 让刷缓存也白刷。
### Bug 3: `upgrade_openclaw` npm 首装分支不刷缓存
npm 分支里只有 `if need_uninstall_old`(切换源场景)分支末尾刷了
PATH 缓存。**首次安装** `need_uninstall_old == false`,if 块整个跳
过,函数直接返回,CLI 检测缓存(60s TTL)和 PATH 缓存都是旧的。前
端 `setTimeout(reload, 1500)` 触发 SPA 重建,但 Tauri 进程没重启,
缓存没刷 → `is_cli_installed()` 返回 false。
### Bug 4: 手动装 Node.js 没有 hook 点
用户点「下载 Node.js」跳浏览器,装完回到 panel,panel 不知道用户装
了。虽然顶部有「重新检测」按钮,但 UX 上容易错过。`runDetect` 里虽
然会 `await api.invalidatePathCache()`,但需要用户主动触发。
## 修复
### Rust 端
1. **`find_git_path`**:子进程 `where`/`which` 显式 `env("PATH",
enhanced_path)`,对齐 `find_node_path` 的做法。
2. **`check_git`**:优先用 `find_git_path` 返回的绝对路径执行
`--version`;fallback 到 `"git"` 时也注入 enhanced_path 到子进程
PATH,确保刚装完的场景能识别。
3. **`auto_install_git`**:winget/xcode-select/apt 三个平台的成功分
支都调 `super::refresh_enhanced_path()` +
`invalidate_cli_detection_cache()`。
4. **`upgrade_openclaw`**:npm 分支末尾(if need_uninstall_old 块之
后、`get_local_version` 之前)无条件刷缓存,覆盖首装场景。切换源
场景虽然前面已刷过一次,这里重刷无害(几十 ms 文件系统扫描开销
可接受)。
### 前端
5. **`setup.js::render`**:注册 `visibilitychange` + window `focus`
监听器,用户从浏览器装完 Node.js 切回 panel 时自动 `runDetect`。
handler 自带 guard(`page.isConnected` 检查),页面切走后监听器
自动卸载,防止泄漏。加 3 秒节流,避免 focus + visibilitychange
同时连发触发重复检测。
## 验证
- `cargo fmt --check` 通过
- `cargo clippy --all-targets -- -D warnings` 通过
- `npm run build` 通过(setup chunk 未变,setup.js 新增 ~22 行)
- 本地需要用户验证:
- [ ] 手动装完 Node.js → 切回 panel 自动识别
- [ ] 一键装 Git → 装完立刻识别(无需重启)
- [ ] 一键装 OpenClaw(首次 npm 安装)→ 装完立刻识别
- [ ] 一键装 OpenClaw(切换源)→ 装完立刻识别(原本就工作,不回归)
Refs: 0.13.3 用户实测反馈
2026-04-20 11:57:08 +08:00
晴天
dfb81066b4
feat(assistant): 备用模型组 failover + 测试按钮走 Rust 后端(修 status 0)
...
解决用户反馈的两个问题:晴辰助手设置里"测试"按钮在某些 provider
(如 gpt.qt.cool)上显示 Response Status: 0、Body 空,以及只能配
一个模型、挂了就没法用。
## 1. 测试按钮 status 0 根因 & 修复
**根因**:Tauri 桌面端以前走 webview 的 `fetch()` 直打外部 API,
受 Chromium 网络栈限制 —— 某些 provider 的 HTTP/2 分块编码、TLS
握手、CORS 预检、或特殊响应头会被静默拒绝并抛 TypeError: Failed
to fetch,前端 catch 后把 `respStatus` 写死 0、`respBody` 空。这
不是 provider 的问题,也不是 key 的问题,是 Chromium net stack 的
兼容性问题。
**修复**:新增 Rust 命令 `test_model_verbose`(基于已有的 reqwest
HTTP 客户端),返回结构化 JSON
`{success, status, reqUrl, reqBody, respBody, reply, error,
elapsedMs, usedApi}`。
前端测试按钮无论 Tauri/Web 模式,一律调 `api.testModelVerbose()`:
- Tauri → `invoke('test_model_verbose')` → 走原生 reqwest
- Web → `fetch('/__api/test_model_verbose')` → 走 dev-api.js 服务端
fetch
这样绕过了 webview net stack 所有兼容性陷阱,拿到的永远是真实
HTTP status(含 401/429/5xx)和原始 body,debug 面板展示完整信息。
相比旧的 `test_model` 命令,`test_model_verbose` 不会因 400/422/429
就吞错误返回 "连接正常",而是如实回传,便于用户排查。
## 2. 备用模型组 failover(参考 OpenClaw)
**新增配置**:`_config.fallbackModels: Array<{label, baseUrl, apiKey,
model, apiType, enabled}>`,存在 localStorage 里。
**callAI 改造**:
- 旧的 `callAI` 改名为 `_callAIOnce`,保持不变
- 新增 `callAIWithSlot(slot, messages, onChunk)`:临时把 slot 注入
到 `_config`,调 `_callAIOnce`,finally 恢复(单线程安全,因为
`_isStreaming` 防并发)
- 新的 `callAI`:`buildActiveSlots()` 收集主模型 + 启用且配置完整
的 fallback,按序尝试
- 成功 → return
- `AbortError`(用户中止)→ 直抛,不 failover
- 鉴权错误 401/403/`unauthorized`/`invalid api key` → 直抛,不
failover(切也白切)
- 其他可重试错误(网络/超时/5xx/429/400 请求错/模型不存在)→ 在
聊天里插入 `⚠ 模型「X」失败,切换到备用「Y」` 引用块,继续下
一个 slot
- 全部 slot 都失败 → 抛最后一个错误,触发既有 retry bar + circuit
breaker 流程
**UI**:设置面板 API 标签页,在晴辰云 promo 卡片下方新增一个默认
折叠的 `<details>` 区块"备用模型组":
- 顶部 summary 显示启用数量 + 折叠箭头
- 每张卡片:label / baseUrl / apiType / apiKey / model(紧凑 2 列
栅格)+ enabled 开关 + 删除按钮
- 顶部 "添加备用模型" 按钮:默认继承主模型的 apiType,减少配置项
- 编辑态用 fallbackDrafts(深拷贝),保存按钮才过滤空卡片写回
`_config.fallbackModels`
- 单个 input 变化时只同步 drafts + 更新计数,不重渲染列表(保持
输入框焦点)
**文件改动**:
- `src-tauri/src/commands/config.rs`:+175 行 `test_model_verbose`
- `src-tauri/src/lib.rs`:注册新命令
- `src/lib/tauri-api.js`:+1 行 `testModelVerbose` 封装
- `scripts/dev-api.js`:+75 行 Web 模式 test_model_verbose handler
- `src/pages/assistant.js`:
- `loadConfig`: 新增 `fallbackModels = []` 默认值
- `callAI` 重构为 failover loop(+80 行)
- 测试按钮:移除 90 行的 webview fetch 双分支,统一调 verbose
API(净减 ~60 行)
- `showSettings`: 新增备用模型 UI + 事件绑定(+85 行)
- 保存按钮:收集 fallbackDrafts 写回 _config
- `src/locales/modules/assistant.js`:11 语言翻译(slotPrimary /
failoverNotice / fallbackModelsTitle / fallbackModelsDesc /
fallbackEnabledSuffix / fallbackEmpty / fallbackAdd /
fallbackRemove / fallbackEnabled / placeholders)
## 验证
- `npm run build` 通过(assistant chunk 149.85 → 153.98 kB)
- `cargo fmt --check` 通过
- `cargo clippy --all-targets -- -D warnings` 通过
- 向后兼容:旧用户的 `localStorage` 无 `fallbackModels` 字段,
loadConfig 会初始化空数组,既有行为不变
Refs: 模型兼容性优化 + 多模型 failover 需求
2026-04-20 03:43:43 +08:00
晴天
36eaa64bf4
chore(release): v0.13.3
...
- 修复 #212 AI 消息气泡空白
- 修复 #215 HTTPS 下 WebSocket Mixed Content
- 修复 #219 多实例版本检测错误
- 修复引擎切换后仪表盘无限加载
- 修复热更新假更新循环(macOS/Linux)
- CI release 构建前自动同步版本号
2026-04-16 13:55:26 +08:00
晴天
5575566806
feat: Hermes Agent 多引擎架构核心代码
...
- 新增 src/engines/hermes/ 完整引擎(仪表盘/服务管理/模型配置/Agent管理/对话)
- 新增 src/lib/engine-manager.js 引擎管理器(切换/检测/状态)
- 新增 src-tauri/src/commands/hermes.rs 后端命令(Gateway控制/配置读写/Agent Run SSE)
- sidebar 引擎切换器 UI
- i18n 新增 engine 模块(中/英/繁体)
- 多安装清理工具(gateway-ownership.js)
- 晴辰助手文件访问开关
- Hermes 对话工具调用可视化、SSE 流式输出
- Cargo.lock / dev-api.js 同步更新
2026-04-13 04:09:09 +08:00
晴天
d397de4c52
fix: npm install后误卸载新装包(current_source=unknown时old_pkg与new pkg相同)
2026-04-11 05:26:27 +08:00
晴天
2f33409a8b
fix: allow unused_variables for reload_gateway_internal (app unused on macOS)
2026-04-11 04:55:53 +08:00
晴天
e3af36603a
fix: CI lint errors - openclaw_command import scope, clippy warnings
2026-04-11 04:51:07 +08:00
晴天
fef694a087
style: cargo fmt
2026-04-11 04:45:58 +08:00
晴天
271dc93b08
feat: OpenClaw 4.9 全面适配 (v0.12.0)
...
- 推荐内核统一升级至 2026.4.9 / 2026.4.9-zh.2
- standalone 安装兼容 edition 格式 latest.json + openclaw-zh- 文件名前缀
- standalone 三级降级: R2 CDN → GitHub Releases → npm
- pre_install_cleanup 所有命令加 10s 超时保护(修复安装卡死)
- npm uninstall 加 30s 超时保护
- wmic 全部迁移到 PowerShell(兼容 Windows 11)
- standalone 下载增加文字进度显示
2026-04-11 04:42:36 +08:00
晴天
56039ce932
fix: improve install/uninstall stability + dreaming animations + scan fix flow
...
Dreaming page:
- Restore animated hero card (stars, moon, floating Z's, deep sky gradient)
- Glass-morphism stat cards inside hero
- runAction/toggleDreaming: friendly toast for unsupported RPCs instead of raw error
Install/Uninstall (config.rs):
- pre_install_cleanup: fix Windows process kill (wmic CommandLine match instead of useless WINDOWTITLE filter), kill standalone dir processes, wait 2s
- uninstall: wait 3s after gateway stop, wmic kill standalone processes, retry deletion with 3s delay
- upgrade source-switch: standalone cleanup with process kill + retry + wait
- gateway reinstall: wait 2s after stop before install
Scan fix flow (chat-debug.js):
- 5-step fix with progress toasts (pairing, doctor, gateway, wait, websocket)
- Gateway start polling (up to 15s) instead of fixed 5s wait
- WebSocket reconnect polling (up to 12s) instead of fixed 3s wait
Frontend (modal.js + about.js):
- setProgressLabels() for custom progress text per modal usage
- Uninstall modal shows "停止服务/卸载组件/清理文件" instead of "下载依赖"
i18n: 11 locales updated with fixStep* and uninstall progress keys
2026-04-11 00:37:14 +08:00
晴天
cfd00f043e
feat: add Dreaming UI and gateway auto-fix startup flow
2026-04-10 20:28:20 +08:00
晴天
c968d179b1
style: cargo fmt
2026-04-07 03:30:48 +08:00
晴天
9ff91f74d8
feat: IME-aware chat input, message copy button, Git path scanning
...
- Fix IME composition issue: Enter during Chinese/Japanese/Korean input
method composition no longer prematurely sends messages (assistant.js)
Uses e.isComposing + keyCode 229 guard on keydown handler
- Add one-click copy button to chat message bubbles (both chat.js and
assistant.js), with hover-reveal animation and checkmark feedback
- Add 'copy' icon to SVG icon library (Lucide style)
- Add CSS for msg-copy-btn in chat.css and assistant.css
- Implement scan_git_paths Rust command: scans common Git installation
locations on Windows/macOS/Linux (Program Files, Scoop, Chocolatey,
GitHub Desktop, VS Code, MSYS2, Homebrew, Xcode CLT, etc.)
- Register scan_git_paths in lib.rs, tauri-api.js, dev-api.js
- Add scan button + results UI in settings.js Git path section
- Add i18n keys: gitScan, gitScanning, gitScanEmpty, gitScanUse
2026-04-06 00:14:18 +08:00
晴天
b2ab316353
fix(settings): support custom git path and robust skills bundled scanning
2026-04-05 21:33:35 +08:00
晴天
db1f0edc43
fix(ci): format config command
2026-04-03 00:33:28 +08:00
晴天
ce4e9ee8b0
chore: release v0.11.3
2026-04-03 00:16:50 +08:00
晴天
8dfa1821bb
fix(ci): resolve clippy bool_comparison and needless_as_bytes warnings
2026-04-02 15:00:34 +08:00
晴天
d7ea6177e0
style: cargo fmt
2026-04-02 14:55:27 +08:00
晴天
630f7daa74
fix(linux): replace sudo -E with pkexec for npm privilege escalation ( #175 )
...
- sudo -E is incompatible with sudo-rs (Ubuntu 25.10+)
- sudo cannot prompt for password from GUI apps (no TTY)
- Split npm_command() (read-only, no elevation) and npm_command_elevated() (write ops)
- npm_command_elevated() checks if npm prefix is user-writable (nvm/fnm/volta)
- Falls back to pkexec (graphical auth dialog) then sudo --non-interactive
- Passes env vars explicitly via /usr/bin/env instead of -E
2026-04-02 14:34:05 +08:00
晴天
17dbf2bc81
fix: sanitize polluted profiles fields in openclaw config
2026-04-02 00:09:03 +08:00
晴天
aad8043196
feat(config): add config calibration repair flow
2026-04-01 22:46:36 +08:00
晴天
476b1a64b0
fix(ci): resolve cross-platform clippy warnings
2026-04-01 16:00:45 +08:00
晴天
f15de0cd4f
fix(ci): apply rustfmt to tauri sources
2026-04-01 15:21:46 +08:00
晴天
b427a6b000
feat: improve gateway compatibility and complete i18n cleanup
2026-04-01 15:06:25 +08:00
SEVENTEEN-TAN
87d7c227d8
fix: 重构版本源检测逻辑 + standalone 目录集中化 + Linux 平台检测补全 ( #161 )
...
* fix: Windows 版本检测错误——优先从活跃 CLI 读取版本,修复源判断和包检查顺序
- get_local_version() Windows 块新增活跃 CLI 优先检测(与 macOS 一致),
避免残留的 standalone 汉化版目录被优先扫描到
- detect_installed_source() 修复 standalone 被错误映射为 official(应为 chinese)
- read_version_from_installation() 根据 classify_cli_source 动态决定
package.json 检查顺序,避免硬编码汉化版优先导致官方版用户看到错误版本
🤖 Generated with [Qoder][https://qoder.com ]
* fix: Windows 版本检测忽略残留文件,仅当 CLI 二进制存在时才读取版本
standalone 目录和 npm 全局目录中可能存在卸载后的残留 node_modules/
package.json,导致面板误判 OpenClaw 已安装并显示错误版本号。
现在在读取版本前先检查 openclaw.cmd 是否实际存在。
🤖 Generated with [Qoder][https://qoder.com ]
* fix: 重构版本源检测逻辑,修复跨源切换后显示旧源的问题
- 新增 detect_source_from_cmd_shim() 通过读取 Windows .cmd shim 内容判断
npm 包归属,替代不可靠的文件系统残留目录扫描
- 重写 detect_installed_source() Windows 检测块,优先使用 shim 内容信号
- upgrade_openclaw_inner() 跨源切换时清理 standalone 安装目录
- get_local_version() npm 段改用 shim 内容判断活跃包
- build_enhanced_path() 三平台添加 standalone 安装目录,避免 dashboard 超时
- 所有平台 fallback 从 "official" 改为 "unknown",支持非面板安装场景
- 前端 dashboard/about 支持 official/chinese/unknown 三源显示
- 新增 unknownSource i18n key(中/英/繁/日/韩)
🤖 Generated with [Qoder][https://qoder.com ]
* fix: 移除 config.rs 末尾多余的闭合括号,修复编译错误
🤖 Generated with [Qoder][https://qoder.com ]
* fix: 移除 config.rs 末尾重复的 configure_git_https 和 invalidate_path_cache 定义
🤖 Generated with [Qoder][https://qoder.com ]
* refactor: standalone 目录集中化、unsafe set_var 适配、Linux 平台检测补全
- 提升 all_standalone_dirs() / standalone_install_dir() 为 pub(crate),
作为全局唯一的 standalone 路径来源
- build_enhanced_path() 三平台块改为调用 config::all_standalone_dirs()
- service.rs 三平台 candidate 函数改为调用 super::config::all_standalone_dirs()
- utils.rs common_non_windows_cli_candidates() 改为调用集中函数
- std::env::set_var 包裹 unsafe 块,附 SAFETY 注释,适配 Rust 1.83+
- 补全 Linux detect_installed_source(): CLI 路径分类 -> symlink -> standalone -> npm list
- 补全 Linux get_local_version(): 活跃 CLI -> standalone VERSION -> symlink package.json
🤖 Generated with [Qoder][https://qoder.com ]
* fix: service.rs 模块路径修正 super::config -> crate::commands::config
mod platform 内部 super 指向 service 模块而非 commands,
需要完整路径 crate::commands::config 才能访问 all_standalone_dirs()
🤖 Generated with [Qoder][https://qoder.com ]
---------
Co-authored-by: SEVENTEEN-TAN <SEVENTEEN-TAN@users.noreply.github.com >
2026-03-30 22:50:11 +08:00
晴天
ac903f84b4
fix: 汉化版检测兜底——版本号含 -zh 时强制判定为汉化版
...
Rust get_version_info + Web dev-api.js get_version_info:
如果检测到的版本号包含 "-zh" 后缀,直接覆盖 source 为 "chinese",
不再依赖文件系统路径检测(Windows .cmd shim 路径不含包名信息)
2026-03-26 06:36:20 +08:00
晴天
535f72d1f9
fix: Windows 汉化版检测修复(.cmd shim 路径不含包名,需检查文件系统)
...
detect_installed_source Windows 分支:classify_cli_source 返回 npm-official 时不再直接返回 official,
而是继续检查 @qingchencloud/openclaw-zh 目录是否存在。修复汉化版被误判为官方原版的问题。
2026-03-26 06:24:48 +08:00
晴天
4108a2f25b
style: clippy map_or(false) → is_some_and 修复 CI
2026-03-26 06:02:46 +08:00
晴天
f3d7a478ae
fix: 全局修复 openclaw --version 解析(取数字开头词而非 last/pop)
...
- config.rs get_local_version CLI fallback: split_whitespace().last() → find(数字开头)
- dev-api.js getLocalOpenclawVersion: split().pop() → find(/^\d/)
- 同一个 bug 导致版本号被解析为 commit hash,影响版本比较和微信插件兼容检测
2026-03-26 05:31:17 +08:00
晴天
7de40624f7
fix : #145 仪表盘版本缓存 + #144 macOS手动安装检测 + #146 更新提示持久化 + #148 AI助手Web模式CORS
...
- dashboard.js: 版本/状态信息持久化缓存,实例切换时自动清空 (#145 )
- service.rs: macOS is_cli_installed 改为真实路径探测,无plist时返回默认Gateway条目 (#144 )
- utils.rs: 新增 common_non_windows_cli_candidates,resolve_openclaw_cli_path 优先检测 standalone/手动安装路径 (#144 )
- config.rs: macOS get_local_version 增加 resolve_cli + canonicalize,detect_installed_source 增加 CLI 分类 + standalone 检测 (#144 )
- dev-api.js: macOS CLI/版本/来源检测补齐 Intel Homebrew + standalone + findOpenclawBin (#144 )
- main.js: 更新 banner dismiss 从 sessionStorage 改 localStorage (#146 )
- assistant.js: Web 模式 AI 测试走后端代理 api.testModel 绕过 CORS (#148 )
2026-03-26 02:02:19 +08:00
晴天
985d263dc6
feat: i18n 11 languages + website update + fix #139 #140 #141
...
i18n:
- Add 9 new locale files (ja/ko/de/es/fr/pt/ru/vi/zh-TW)
- Add multilingual README files for all 11 languages
- Add locale helper, index, and modular translation system
- Add translation generation scripts
Website (docs/index.html):
- Replace 公益AI接口 branding with 晴辰云AI接口
- Remove OpenClaw 独立安装包 promotion block
- Update SEO meta tags (description, keywords, OG, Twitter, JSON-LD)
- Add 11-language README links to footer
- Update 元宝派 link to new URL
Bug fixes:
- fix(cron): delivery format mode:'push' → mode:'announce', remove invalid 'to' field (fixes #141 )
- fix(cron): allow single-channel users to select delivery channel
- fix(cron): preserve delivery field in job state for editing
- fix(models): add 'ollama' as recognized API type, prevent overwriting native ollama config (fixes #140 )
- fix(models): skip /v1 append for ollama native API baseUrl
- fix(assistant): normalize 'google-generative-ai' consistently, add ollama hints
- fix(version): use CLI path classification for source detection on Windows (fixes #139 )
- fix(version): default to 'official' instead of 'chinese' when source unknown
- fix(version): reorder npm global package check based on active CLI
2026-03-24 22:31:11 +08:00
晴天
0c062e93e0
feat: multi-OpenClaw CLI detection/binding + i18n infrastructure
...
Multi-OpenClaw Detection & Binding:
- Add resolve_openclaw_cli_path() and classify_cli_source() in utils.rs
- Support openclawCliPath binding in clawpanel.json (user selects CLI)
- VersionInfo now includes cli_path, cli_source, all_installations
- scan_all_installations() detects all OpenClaw installs on system
- Dashboard shows CLI source label + multi-install warning
- Settings page: CLI binding UI with auto-detect and manual selection
- dev-api.js synced with cli_path/cli_source fields for Web mode
i18n Infrastructure:
- Create src/lib/i18n.js core module (t(), setLang(), initI18n())
- Create src/locales/zh-CN.json and src/locales/en.json
- Sidebar fully i18n-ized (nav labels, sections, instance switcher)
- Dashboard stat cards fully i18n-ized
- Settings page: language switcher UI (live reload)
- initI18n() called in main.js on startup
2026-03-24 11:57:40 +08:00
晴天
3687e26d5d
feat: 飞书官方插件迁移 + 配对审批 + Gateway防卡死 + 微信升级修复 + 更新检测修复
...
- 飞书渠道从 @openclaw/feishu 迁移到 @larksuite/openclaw-lark 官方插件
- 保存飞书配置时自动禁用旧 feishu 插件,防止新旧插件冲突
- 所有主要渠道(飞书/Telegram/Discord/Slack)启用配对审批UI
- gateway_command 增加20s超时,超时后force-kill+fresh start
- 全平台启动前端口占用检查,防止Guardian无限拉起
- Linux gateway_command 补齐 Duration 导入和 cleanup_zombie 实现
- Guardian自动守护在Tauri桌面端也启用,轮询间隔30s→15s
- 微信渠道:升级操作不再弹出扫码二维码,按钮文案区分安装/升级
- 版本更新检测:CI不再将minAppVersion写死为当前版本
- 部署脚本增强OpenClaw检测,支持已安装的官方版
- 日间/夜间模式圆形扩散切换动画(View Transitions API)
- API错误信息完整展示(429限流等),URL自动转可点击链接
- 第三方API接入引导优化:移除内置密钥,引导式流程
- 修复全平台 Clippy 警告(strip_prefix/dead_code/unnecessary_unwrap等)
- Rust代码格式化修复(cargo fmt)
- toast组件支持HTML内容渲染
- Rust后端test_model返回详细错误信息
2026-03-23 21:51:34 +08:00
晴天
6494cf6551
chore: release v0.9.7
2026-03-21 04:11:13 +08:00
晴天
8485df7fab
fix: resolve clippy dead_code and manual_flatten warnings
2026-03-18 17:38:15 +08:00
晴天
c3634fd49a
style: cargo fmt
2026-03-18 16:35:51 +08:00
晴天
1809329aaa
feat: standalone 独立安装包集成 + 安装方式选择器 (0.9.4)
...
- 新增 standalone 安装链路(自带 Node.js,零依赖,无需 npm)
- 安装方式选择器:自动/CDN加速/GitHub/npm 四选一
- 动态查询 latest.json 获取最新版本,不怕旧资源被删除
- GitHub 模式:从 GitHub Releases 下载(CDN 不可用时备选)
- CherryStudio openclaw.exe 干扰过滤
- 默认源改为汉化优化版
- 日志隐藏 R2 下载地址(安全)
- 卸载兼容:standalone + npm 双清理
- 版本检测覆盖所有 standalone 安装路径
- README + 官网添加独立安装包说明
- macOS npm 权限问题通过 standalone 自动解决
2026-03-17 06:32:23 +08:00
晴天
6665c4fc5f
fix : #89 stripUiFields清理version info根字段,防止污染openclaw.json导致Gateway启动失败
2026-03-16 19:25:36 +08:00
晴天
f8d725e572
fix: R2优先级反转 — 平台预装归档优先(零网络),通用tarball兜底(仍需npm)
2026-03-16 17:19:26 +08:00
晴天
68b3034403
feat: R2通用tarball模式 — 一个52MB包覆盖全平台(win/mac/linux/arm64)
2026-03-16 16:08:15 +08:00
晴天
41c4d6f9fe
fix: R2归档解压路径修正(qingchencloud→@qingchencloud) + Docker构建脚本
2026-03-16 15:06:05 +08:00
晴天
61434137d7
perf: ARM设备性能优化 — in-flight请求去重+后端缓存+仪表盘轮询降频+R2 CDN加速
2026-03-16 13:56:36 +08:00
晴天
48cffe1f42
feat: v0.9.2 — SkillHub双源技能管理、消息渠道多Agent绑定、模型配置优化、白屏安全网等
2026-03-16 04:26:30 +08:00