mirror of
https://github.com/qingchencloud/clawpanel.git
synced 2026-05-29 04:10:00 +08:00
fix(engine-select): release 0.16.4
This commit is contained in:
12
CHANGELOG.md
12
CHANGELOG.md
@@ -7,6 +7,18 @@
|
||||
|
||||
## [未发布]
|
||||
|
||||
## [0.16.4] - 2026-05-22
|
||||
|
||||
### 修复 (Fixes)
|
||||
|
||||
- **引擎选择页后端健康检查** — Web 模式启动时要求 `/__api/health` 返回 JSON 且 `ok: true`,避免静态站点 fallback 到 `index.html` 时被误判为后端在线,导致首次保存引擎选择失败
|
||||
- **保存失败提示可诊断** — 引擎选择写入失败时显示结构化错误详情,不再只重复展示“保存引擎选择失败”
|
||||
- **离线提示命令修正** — 后端离线引导中的生产启动命令改为项目实际支持的 `npm run serve`
|
||||
|
||||
### 测试与验证 (Testing)
|
||||
|
||||
- **回归验证** — 已通过 `npm run build`、`git diff --check`,并用 Playwright 验证引擎选择页正常保存与后端异常提示
|
||||
|
||||
## [0.16.3] - 2026-05-22
|
||||
|
||||
### 修复 (Fixes)
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
"description": "支持 OpenClaw 和 Hermes Agent 双引擎的多 AI Agent 可视化管理面板,基于 Tauri v2 的跨平台桌面应用。内置晴辰助手支持工具调用,晴辰云 AI 接口一键接入。支持仪表盘监控、多模型配置、Hermes Agent 对话、消息渠道管理、内置 QQ 机器人、实时 AI 聊天、记忆管理、Agent 管理、网关配置、内网穿透等功能。支持 11 种语言。",
|
||||
"url": "https://claw.qt.cool/",
|
||||
"downloadUrl": "https://github.com/qingchencloud/clawpanel/releases/latest",
|
||||
"softwareVersion": "0.16.3",
|
||||
"softwareVersion": "0.16.4",
|
||||
"author": {
|
||||
"@type": "Organization",
|
||||
"name": "晴辰云 QingchenCloud",
|
||||
@@ -1225,7 +1225,7 @@
|
||||
<div class="orb orb-2" style="top:auto;bottom:-100px"></div>
|
||||
<div class="container-sm" style="position:relative;z-index:10">
|
||||
<div class="section-header">
|
||||
<div class="reveal download-version"><span class="pulse"></span> <span id="dl-badge" data-i18n="dl.badge">v0.16.3 最新版</span></div>
|
||||
<div class="reveal download-version"><span class="pulse"></span> <span id="dl-badge" data-i18n="dl.badge">v0.16.4 最新版</span></div>
|
||||
<h2 class="reveal section-title" data-i18n="dl.title"><span class="gradient-text">下载安装</span></h2>
|
||||
<p class="reveal section-desc" data-i18n="dl.desc">选择你的操作系统,一键下载安装</p>
|
||||
</div>
|
||||
@@ -1235,11 +1235,11 @@
|
||||
<h3>macOS</h3>
|
||||
<p class="dl-desc" data-i18n="dl.mac.d">支持 Apple Silicon 和 Intel 芯片</p>
|
||||
<div class="dl-links">
|
||||
<a class="dl-link" href="https://claw.qt.cool/proxy/dl/github.com/qingchencloud/clawpanel/releases/latest/download/ClawPanel_0.16.3_aarch64.dmg" target="_blank" rel="noopener">
|
||||
<a class="dl-link" href="https://claw.qt.cool/proxy/dl/github.com/qingchencloud/clawpanel/releases/latest/download/ClawPanel_0.16.4_aarch64.dmg" target="_blank" rel="noopener">
|
||||
Apple Silicon (M1/M2/M3/M4)
|
||||
<span class="dl-format">.dmg</span>
|
||||
</a>
|
||||
<a class="dl-link" href="https://claw.qt.cool/proxy/dl/github.com/qingchencloud/clawpanel/releases/latest/download/ClawPanel_0.16.3_x64.dmg" target="_blank" rel="noopener">
|
||||
<a class="dl-link" href="https://claw.qt.cool/proxy/dl/github.com/qingchencloud/clawpanel/releases/latest/download/ClawPanel_0.16.4_x64.dmg" target="_blank" rel="noopener">
|
||||
<span data-i18n="dl.mac.intel">Intel 芯片</span>
|
||||
<span class="dl-format">.dmg</span>
|
||||
</a>
|
||||
@@ -1257,15 +1257,15 @@
|
||||
<h3>Windows</h3>
|
||||
<p class="dl-desc" data-i18n="dl.win.d">支持 Windows 10 及以上版本</p>
|
||||
<div class="dl-links">
|
||||
<a class="dl-link" href="https://claw.qt.cool/proxy/dl/github.com/qingchencloud/clawpanel/releases/latest/download/ClawPanel_0.16.3_x64-setup.exe" target="_blank" rel="noopener">
|
||||
<a class="dl-link" href="https://claw.qt.cool/proxy/dl/github.com/qingchencloud/clawpanel/releases/latest/download/ClawPanel_0.16.4_x64-setup.exe" target="_blank" rel="noopener">
|
||||
<span data-i18n="dl.win.exe">安装程序</span>
|
||||
<span class="dl-format">.exe</span>
|
||||
</a>
|
||||
<a class="dl-link" href="https://claw.qt.cool/proxy/dl/github.com/qingchencloud/clawpanel/releases/latest/download/ClawPanel_0.16.3_x64-setup-full.exe" target="_blank" rel="noopener">
|
||||
<a class="dl-link" href="https://claw.qt.cool/proxy/dl/github.com/qingchencloud/clawpanel/releases/latest/download/ClawPanel_0.16.4_x64-setup-full.exe" target="_blank" rel="noopener">
|
||||
<span data-i18n="dl.win.full">完整包(含 WebView2)</span>
|
||||
<span class="dl-format">.exe</span>
|
||||
</a>
|
||||
<a class="dl-link" href="https://claw.qt.cool/proxy/dl/github.com/qingchencloud/clawpanel/releases/latest/download/ClawPanel_0.16.3_x64_en-US.msi" target="_blank" rel="noopener">
|
||||
<a class="dl-link" href="https://claw.qt.cool/proxy/dl/github.com/qingchencloud/clawpanel/releases/latest/download/ClawPanel_0.16.4_x64_en-US.msi" target="_blank" rel="noopener">
|
||||
<span data-i18n="dl.win.msi">MSI 安装包</span>
|
||||
<span class="dl-format">.msi</span>
|
||||
</a>
|
||||
@@ -1276,11 +1276,11 @@
|
||||
<h3>Linux</h3>
|
||||
<p class="dl-desc" data-i18n="dl.linux.d">支持主流 Linux 发行版</p>
|
||||
<div class="dl-links">
|
||||
<a class="dl-link" href="https://claw.qt.cool/proxy/dl/github.com/qingchencloud/clawpanel/releases/latest/download/ClawPanel_0.16.3_amd64.AppImage" target="_blank" rel="noopener">
|
||||
<a class="dl-link" href="https://claw.qt.cool/proxy/dl/github.com/qingchencloud/clawpanel/releases/latest/download/ClawPanel_0.16.4_amd64.AppImage" target="_blank" rel="noopener">
|
||||
<span data-i18n="dl.linux.ai">通用版</span>
|
||||
<span class="dl-format">.AppImage</span>
|
||||
</a>
|
||||
<a class="dl-link" href="https://claw.qt.cool/proxy/dl/github.com/qingchencloud/clawpanel/releases/latest/download/ClawPanel_0.16.3_amd64.deb" target="_blank" rel="noopener">
|
||||
<a class="dl-link" href="https://claw.qt.cool/proxy/dl/github.com/qingchencloud/clawpanel/releases/latest/download/ClawPanel_0.16.4_amd64.deb" target="_blank" rel="noopener">
|
||||
Debian / Ubuntu
|
||||
<span class="dl-format">.deb</span>
|
||||
</a>
|
||||
|
||||
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "clawpanel",
|
||||
"version": "0.16.3",
|
||||
"version": "0.16.4",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "clawpanel",
|
||||
"version": "0.16.3",
|
||||
"version": "0.16.4",
|
||||
"license": "AGPL-3.0",
|
||||
"dependencies": {
|
||||
"@tauri-apps/api": "^2.5.0",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "clawpanel",
|
||||
"version": "0.16.3",
|
||||
"version": "0.16.4",
|
||||
"private": true,
|
||||
"description": "ClawPanel - OpenClaw 可视化管理面板,基于 Tauri v2 的跨平台桌面应用",
|
||||
"type": "module",
|
||||
|
||||
2
src-tauri/Cargo.lock
generated
2
src-tauri/Cargo.lock
generated
@@ -366,7 +366,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "clawpanel"
|
||||
version = "0.16.3"
|
||||
version = "0.16.4"
|
||||
dependencies = [
|
||||
"base64 0.22.1",
|
||||
"chrono",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "clawpanel"
|
||||
version = "0.16.3"
|
||||
version = "0.16.4"
|
||||
edition = "2021"
|
||||
description = "ClawPanel - OpenClaw 可视化管理面板"
|
||||
authors = ["qingchencloud"]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "https://raw.githubusercontent.com/tauri-apps/tauri/dev/crates/tauri-config-schema/schema.json",
|
||||
"productName": "ClawPanel",
|
||||
"version": "0.16.3",
|
||||
"version": "0.16.4",
|
||||
"identifier": "ai.openclaw.clawpanel",
|
||||
"build": {
|
||||
"frontendDist": "../dist",
|
||||
|
||||
@@ -26,7 +26,7 @@ const PATTERNS = [
|
||||
// 网络
|
||||
{
|
||||
key: 'network',
|
||||
re: /(failed to fetch|networkerror|networkfailure|enetunreach|econnreset|econnrefused|ehostunreach|err_network|fetch failed|connection refused|connection reset|getaddrinfo|dns error|no route to host|aborted|broken pipe|connect timed out|tcp connect)/i,
|
||||
re: /(failed to fetch|networkerror|networkfailure|enetunreach|econnreset|econnrefused|ehostunreach|err_network|fetch failed|connection refused|connection reset|getaddrinfo|dns error|no route to host|aborted|broken pipe|connect timed out|tcp connect|backend service is not running|web deployment mode|后端服务未运行)/i,
|
||||
},
|
||||
// Gateway 未启动(特殊的 connection refused / port not listen 情况)
|
||||
{
|
||||
|
||||
@@ -231,7 +231,13 @@ export async function checkBackendHealth() {
|
||||
if (isTauriRuntime()) { _setBackendOnline(true); return true }
|
||||
try {
|
||||
const resp = await fetch('/__api/health', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: '{}' })
|
||||
const ok = resp.ok
|
||||
const ct = (resp.headers.get('content-type') || '').toLowerCase()
|
||||
if (!resp.ok || !ct.includes('application/json')) {
|
||||
_setBackendOnline(false)
|
||||
return false
|
||||
}
|
||||
const data = await resp.json().catch(() => null)
|
||||
const ok = !!data?.ok
|
||||
_setBackendOnline(ok)
|
||||
return ok
|
||||
} catch {
|
||||
|
||||
@@ -110,7 +110,7 @@ function showBackendDownOverlay() {
|
||||
<div style="color:var(--text-tertiary);margin-bottom:4px"># ${t('common.devMode')}</div>
|
||||
npm run dev<br>
|
||||
<div style="color:var(--text-tertiary);margin-top:8px;margin-bottom:4px"># ${t('common.prodMode')}</div>
|
||||
npm run preview
|
||||
npm run serve
|
||||
</div>
|
||||
<button class="login-btn" id="btn-backend-retry" style="margin-top:8px">
|
||||
<span id="backend-retry-text">${t('common.checkAgain')}</span>
|
||||
|
||||
@@ -2,6 +2,7 @@ import { navigate } from '../router.js'
|
||||
import { t } from '../lib/i18n.js'
|
||||
import { applyEngineSelection } from '../lib/engine-manager.js'
|
||||
import { toast } from '../components/toast.js'
|
||||
import { humanizeError } from '../lib/humanize-error.js'
|
||||
|
||||
const PRIMARY_OPTIONS = [
|
||||
{
|
||||
@@ -167,7 +168,7 @@ function bindClick(page) {
|
||||
navigate(option.targetRoute)
|
||||
} catch (error) {
|
||||
console.error('[engine-select] secondary choose failed:', error)
|
||||
toast(t('engine.choiceSaveFailed'), 'error')
|
||||
toast(humanizeError(error, t('engine.choiceSaveFailed')), 'error')
|
||||
_busy = false
|
||||
btn.classList.remove('loading')
|
||||
}
|
||||
@@ -213,7 +214,7 @@ async function chooseWithAnimation(page, panel, option, engine) {
|
||||
}, 280))
|
||||
} catch (error) {
|
||||
console.error('[engine-select] choose failed:', error)
|
||||
toast(t('engine.choiceSaveFailed'), 'error')
|
||||
toast(humanizeError(error, t('engine.choiceSaveFailed')), 'error')
|
||||
// 失败回退:移除动画层 + 解除 busy
|
||||
removeRevealNodes()
|
||||
// stage 可能已不在 DOM(路由已切走)— 防御性访问
|
||||
|
||||
Reference in New Issue
Block a user