mirror of
https://github.com/qingchencloud/clawpanel.git
synced 2026-05-06 20:02:49 +08:00
chore: release v0.11.4
This commit is contained in:
19
CHANGELOG.md
19
CHANGELOG.md
@@ -5,6 +5,25 @@
|
||||
格式遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),
|
||||
版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
|
||||
|
||||
## [0.11.4] - 2026-04-06
|
||||
|
||||
### 新功能 (Features)
|
||||
|
||||
- **聊天气泡一键复制** — 实时聊天和晴辰助手的消息气泡新增复制按钮,悬停显示,点击后有 ✓ 反馈
|
||||
- **Git 路径扫描** — 设置页 Git 路径配置新增"扫描"按钮,自动检测常见安装位置(Program Files、Scoop、Chocolatey、GitHub Desktop、VS Code、MSYS2、Homebrew、Xcode CLT 等),可一键选用
|
||||
|
||||
### 修复 (Fixes)
|
||||
|
||||
- **IME 输入法回车误发** — 中日韩输入法组合输入时,按回车确认候选词不再误发消息(assistant.js 补充 `isComposing` + `keyCode 229` 检测)
|
||||
- **Gateway 外部实例误报** — 外部启动的 Gateway(systemd / Docker / 手动)现在会自动认领,不再误判为"外部实例"弹出引导弹窗;`ensure_owned_gateway_or_err` 和 `get_services_status` 均增加端口 + 数据目录匹配时的自动认领逻辑
|
||||
- **Gateway 状态不一致** — 服务页外部 Gateway 显示黄色警告点而非绿色;顶栏区分外部 Gateway(警告 + 认领)与已停止(信息 + 启动);操作后立即同步全局状态
|
||||
- **模型 fallback 自动填充** — 模型保存时不再自动填充 fallback 预设 (fixes #190)
|
||||
- **自定义 Git 路径** — 支持用户自定义 Git 可执行文件路径,Skills 打包路径增强
|
||||
|
||||
### 安全 (Security)
|
||||
|
||||
- **依赖补丁** — picomatch 4.0.4、rustls-webpki 0.103.10 安全更新
|
||||
|
||||
## [0.11.3] - 2026-04-03
|
||||
|
||||
### 修复 (Fixes)
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
"description": "OpenClaw AI Agent 可视化管理面板,基于 Tauri v2 的跨平台桌面应用。内置晴辰助手支持工具调用,晴辰云 AI 接口一键接入。支持仪表盘监控、多模型配置、消息渠道管理、内置 QQ 机器人、实时 AI 聊天、记忆管理、Agent 管理、网关配置、内网穿透等功能。支持 11 种语言。",
|
||||
"url": "https://claw.qt.cool/",
|
||||
"downloadUrl": "https://github.com/qingchencloud/clawpanel/releases/latest",
|
||||
"softwareVersion": "0.11.3",
|
||||
"softwareVersion": "0.11.4",
|
||||
"author": {
|
||||
"@type": "Organization",
|
||||
"name": "晴辰云 QingchenCloud",
|
||||
@@ -1155,7 +1155,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.11.3 最新版</span></div>
|
||||
<div class="reveal download-version"><span class="pulse"></span> <span id="dl-badge" data-i18n="dl.badge">v0.11.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>
|
||||
@@ -1165,11 +1165,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.11.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.11.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.11.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.11.4_x64.dmg" target="_blank" rel="noopener">
|
||||
<span data-i18n="dl.mac.intel">Intel 芯片</span>
|
||||
<span class="dl-format">.dmg</span>
|
||||
</a>
|
||||
@@ -1187,15 +1187,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.11.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.11.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.11.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.11.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.11.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.11.4_x64_en-US.msi" target="_blank" rel="noopener">
|
||||
<span data-i18n="dl.win.msi">MSI 安装包</span>
|
||||
<span class="dl-format">.msi</span>
|
||||
</a>
|
||||
@@ -1206,11 +1206,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.11.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.11.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.11.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.11.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.11.3",
|
||||
"version": "0.11.4",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "clawpanel",
|
||||
"version": "0.11.3",
|
||||
"version": "0.11.4",
|
||||
"license": "AGPL-3.0",
|
||||
"dependencies": {
|
||||
"@tauri-apps/api": "^2.5.0",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "clawpanel",
|
||||
"version": "0.11.3",
|
||||
"version": "0.11.4",
|
||||
"private": true,
|
||||
"description": "ClawPanel - OpenClaw 可视化管理面板,基于 Tauri v2 的跨平台桌面应用",
|
||||
"type": "module",
|
||||
|
||||
@@ -2391,6 +2391,14 @@ function clearGatewayOwner() {
|
||||
} catch {}
|
||||
}
|
||||
|
||||
function shouldAutoClaimGateway(owner) {
|
||||
const current = currentGatewayOwnerSignature()
|
||||
if (!owner) return true // 无 owner 文件 → 自动认领
|
||||
// owner 文件存在但签名不完全匹配 → 仅按 port + openclaw_dir 判断
|
||||
return Number(owner.port || 0) === current.port
|
||||
&& !!owner.openclawDir && path.resolve(owner.openclawDir) === current.openclawDir
|
||||
}
|
||||
|
||||
function foreignGatewayError(pid = null) {
|
||||
const port = readGatewayPort()
|
||||
const pidText = pid ? ` (PID: ${pid})` : ''
|
||||
@@ -2403,6 +2411,11 @@ function ensureOwnedGatewayOrThrow(pid = null) {
|
||||
if (gatewayOwnerPidNeedsRefresh(owner, pid)) writeGatewayOwner(pid)
|
||||
return true
|
||||
}
|
||||
// 无有效 owner 或签名不匹配 → 尝试自动认领(端口 + 数据目录匹配即可)
|
||||
if (shouldAutoClaimGateway(owner)) {
|
||||
writeGatewayOwner(pid)
|
||||
return true
|
||||
}
|
||||
throw foreignGatewayError(pid)
|
||||
}
|
||||
|
||||
@@ -2992,10 +3005,15 @@ const handlers = {
|
||||
|
||||
const cliInstalled = !!resolveOpenclawCliPath()
|
||||
const owner = readGatewayOwner()
|
||||
const ownedByCurrentInstance = !!running && isCurrentGatewayOwner(owner, pid || null)
|
||||
let ownedByCurrentInstance = !!running && isCurrentGatewayOwner(owner, pid || null)
|
||||
if (ownedByCurrentInstance && gatewayOwnerPidNeedsRefresh(owner, pid || null)) {
|
||||
writeGatewayOwner(pid || null)
|
||||
}
|
||||
// 自动认领:Gateway 在运行但无有效 owner,且端口 + 数据目录匹配
|
||||
if (running && !ownedByCurrentInstance && shouldAutoClaimGateway(owner)) {
|
||||
writeGatewayOwner(pid || null)
|
||||
ownedByCurrentInstance = true
|
||||
}
|
||||
const ownership = !running ? 'stopped' : ownedByCurrentInstance ? 'owned' : 'foreign'
|
||||
|
||||
return [{ label, running, pid, description: 'OpenClaw Gateway', cli_installed: cliInstalled, ownership, owned_by_current_instance: ownedByCurrentInstance }]
|
||||
|
||||
2
src-tauri/Cargo.lock
generated
2
src-tauri/Cargo.lock
generated
@@ -351,7 +351,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "clawpanel"
|
||||
version = "0.11.3"
|
||||
version = "0.11.4"
|
||||
dependencies = [
|
||||
"base64 0.22.1",
|
||||
"chrono",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "clawpanel"
|
||||
version = "0.11.3"
|
||||
version = "0.11.4"
|
||||
edition = "2021"
|
||||
description = "ClawPanel - OpenClaw 可视化管理面板"
|
||||
authors = ["qingchencloud"]
|
||||
|
||||
@@ -147,6 +147,19 @@ fn is_current_gateway_owner(owner: &GatewayOwnerRecord, _pid: Option<u32>) -> bo
|
||||
matches_current_gateway_owner_signature(owner)
|
||||
}
|
||||
|
||||
/// 判断是否可以安全地自动认领 Gateway:端口 + 数据目录匹配即可(忽略 started_by)
|
||||
fn should_auto_claim_gateway(owner: &Option<GatewayOwnerRecord>) -> bool {
|
||||
let (port, openclaw_dir, _cli_path) = current_gateway_owner_signature();
|
||||
match owner {
|
||||
None => true, // 无 owner 文件 → 自动认领
|
||||
Some(record) => {
|
||||
// owner 文件存在但签名不完全匹配 → 仅按 port + openclaw_dir 判断
|
||||
record.port == port
|
||||
&& normalize_owned_path(&record.openclaw_dir) == openclaw_dir
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn foreign_gateway_error(pid: Option<u32>) -> String {
|
||||
let pid_suffix = pid
|
||||
.map(|value| format!(" (PID: {value})"))
|
||||
@@ -159,14 +172,20 @@ fn foreign_gateway_error(pid: Option<u32>) -> String {
|
||||
}
|
||||
|
||||
fn ensure_owned_gateway_or_err(pid: Option<u32>) -> Result<(), String> {
|
||||
if let Some(owner) = read_gateway_owner() {
|
||||
if is_current_gateway_owner(&owner, pid) {
|
||||
if gateway_owner_pid_needs_refresh(&owner, pid) {
|
||||
let owner = read_gateway_owner();
|
||||
if let Some(ref record) = owner {
|
||||
if is_current_gateway_owner(record, pid) {
|
||||
if gateway_owner_pid_needs_refresh(record, pid) {
|
||||
write_gateway_owner(pid)?;
|
||||
}
|
||||
return Ok(());
|
||||
}
|
||||
}
|
||||
// 无有效 owner 或签名不匹配 → 尝试自动认领(端口 + 数据目录匹配即可)
|
||||
if should_auto_claim_gateway(&owner) {
|
||||
write_gateway_owner(pid)?;
|
||||
return Ok(());
|
||||
}
|
||||
Err(foreign_gateway_error(pid))
|
||||
}
|
||||
|
||||
@@ -1622,7 +1641,7 @@ pub async fn get_services_status() -> Result<Vec<ServiceStatus>, String> {
|
||||
for label in labels.iter().map(String::as_str) {
|
||||
let (running, pid) = current_gateway_runtime(label).await;
|
||||
let owner = read_gateway_owner();
|
||||
let owned_by_current_instance = running
|
||||
let mut owned_by_current_instance = running
|
||||
&& owner
|
||||
.as_ref()
|
||||
.map(|record| is_current_gateway_owner(record, pid))
|
||||
@@ -1634,6 +1653,11 @@ pub async fn get_services_status() -> Result<Vec<ServiceStatus>, String> {
|
||||
}
|
||||
}
|
||||
}
|
||||
// 自动认领:Gateway 在运行但无有效 owner,且端口 + 数据目录匹配 → 自动写入 owner
|
||||
if running && !owned_by_current_instance && should_auto_claim_gateway(&owner) {
|
||||
let _ = write_gateway_owner(pid);
|
||||
owned_by_current_instance = true;
|
||||
}
|
||||
let ownership = if !running {
|
||||
Some("stopped".to_string())
|
||||
} else if owned_by_current_instance {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "https://raw.githubusercontent.com/tauri-apps/tauri/dev/crates/tauri-config-schema/schema.json",
|
||||
"productName": "ClawPanel",
|
||||
"version": "0.11.3",
|
||||
"version": "0.11.4",
|
||||
"identifier": "ai.openclaw.clawpanel",
|
||||
"build": {
|
||||
"frontendDist": "../dist",
|
||||
|
||||
Reference in New Issue
Block a user