fix: stabilize gateway startup and kernel i18n

This commit is contained in:
晴天
2026-05-22 15:38:56 +08:00
parent 7977608e5b
commit 76c4a56302
12 changed files with 65 additions and 23 deletions

View File

@@ -7,6 +7,18 @@
## [未发布]
## [0.16.3] - 2026-05-22
### 修复 (Fixes)
- **Windows Gateway 启动路径兼容** — 启动 Gateway 可见终端时不再手工给 `cmd /c start` 的窗口标题嵌套引号,降低 Windows `start` 在路径含空格 / `Gateway` 片段时误把 `Gateway\` 当作可执行文件的风险
- **绑定 CLI 路径更稳健** — 用户绑定到 OpenClaw 安装目录时,会解析到目录下的 `openclaw.cmd` / `openclaw.exe`,不再把目录本身写入 Gateway 启动脚本执行
- **内核升级弹窗多语言修复** — 新增运行时 `kernel` 模块语言包并注册聚合入口,修复升级弹窗、侧边栏内核升级提示、内核徽章等位置显示 `kernel.upgrade.title` / `kernel.upgrade.starting` 原始 key 的问题
### 测试与验证 (Testing)
- **回归验证** — 已通过 Rust fmt / check / clippy、模块化 i18n key 解析检查和 `npm run build`
## [0.16.2] - 2026-05-21
### 修复 (Fixes)

View File

@@ -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.2",
"softwareVersion": "0.16.3",
"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.2 最新版</span></div>
<div class="reveal download-version"><span class="pulse"></span> <span id="dl-badge" data-i18n="dl.badge">v0.16.3 最新版</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.2_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.3_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.2_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.3_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.2_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.3_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.2_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.3_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.2_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.3_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.2_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.3_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.2_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.3_amd64.deb" target="_blank" rel="noopener">
Debian / Ubuntu
<span class="dl-format">.deb</span>
</a>

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "clawpanel",
"version": "0.16.2",
"version": "0.16.3",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "clawpanel",
"version": "0.16.2",
"version": "0.16.3",
"license": "AGPL-3.0",
"dependencies": {
"@tauri-apps/api": "^2.5.0",

View File

@@ -1,6 +1,6 @@
{
"name": "clawpanel",
"version": "0.16.2",
"version": "0.16.3",
"private": true,
"description": "ClawPanel - OpenClaw 可视化管理面板,基于 Tauri v2 的跨平台桌面应用",
"type": "module",

2
src-tauri/Cargo.lock generated
View File

@@ -366,7 +366,7 @@ dependencies = [
[[package]]
name = "clawpanel"
version = "0.16.2"
version = "0.16.3"
dependencies = [
"base64 0.22.1",
"chrono",

View File

@@ -1,6 +1,6 @@
[package]
name = "clawpanel"
version = "0.16.2"
version = "0.16.3"
edition = "2021"
description = "ClawPanel - OpenClaw 可视化管理面板"
authors = ["qingchencloud"]

View File

@@ -1664,7 +1664,6 @@ mod platform {
let runner_path = write_gateway_terminal_runner(&openclaw_dir, &cli)?;
let runner_path_str = runner_path.to_string_lossy().to_string();
let openclaw_dir_str = openclaw_dir.to_string_lossy().to_string();
let title_arg = format!("\"{GATEWAY_WINDOW_TITLE}\"");
// 外层 cmd /c 自身用 CREATE_NO_WINDOW 隐藏(短命桥接进程),
// 内部 `start` 会创建一个真正可见的新控制台窗口运行 runner.cmd。
@@ -1672,7 +1671,7 @@ mod platform {
cmd.args([
"/c",
"start",
title_arg.as_str(),
GATEWAY_WINDOW_TITLE,
"/D",
openclaw_dir_str.as_str(),
"cmd",

View File

@@ -14,11 +14,7 @@ fn bound_cli_path() -> Option<std::path::PathBuf> {
return None;
}
let p = std::path::PathBuf::from(raw);
if p.exists() && !is_rejected_cli_path(&p.to_string_lossy()) {
Some(p)
} else {
None
}
crate::commands::config::resolve_openclaw_cli_input_path(&p)
}
fn apply_openclaw_dir_env(cmd: &mut std::process::Command) {

View File

@@ -1,7 +1,7 @@
{
"$schema": "https://raw.githubusercontent.com/tauri-apps/tauri/dev/crates/tauri-config-schema/schema.json",
"productName": "ClawPanel",
"version": "0.16.2",
"version": "0.16.3",
"identifier": "ai.openclaw.clawpanel",
"build": {
"frontendDist": "../dist",

View File

@@ -40,13 +40,14 @@ import cliConflict from './modules/cliConflict.js'
import glossary from './modules/glossary.js'
import hermesLazyDeps from './modules/hermesLazyDeps.js'
import notifications from './modules/notifications.js'
import kernel from './modules/kernel.js'
const MODULES = {
common, sidebar, instance, dashboard, services, settings,
models, agents, agentDetail, gateway, security, communication, channels,
memory, dreaming, cron, usage, skills, chat, chatDebug, setup, about,
ext, logs, assistant, toast, modal, engagement, diagnose, routeMap, extensions,
engine, ciaoBug, cliConflict, glossary, hermesLazyDeps, notifications,
engine, ciaoBug, cliConflict, glossary, hermesLazyDeps, notifications, kernel,
}
/** 判断是否是 _() 调用产生的翻译对象(有 'zh-CN' 字符串字段) */

View File

@@ -67,6 +67,7 @@ export default {
upgradeOpenClaw: _('升级 OpenClaw', 'Upgrade OpenClaw', '升級 OpenClaw', 'OpenClaw をアップグレード', 'OpenClaw 업그레이드', 'Nâng cấp OpenClaw'),
upgradeCompleted: _('升级完成', 'Upgrade completed', '升級完成', 'アップグレード完了', '업그레이드 완료', 'Nâng cấp hoàn tất'),
upgradeFailed: _('升级失败', 'Upgrade failed', '升級失敗', 'アップグレード失敗', '업그레이드 실패', 'Nâng cấp thất bại'),
recommended: _('推荐版本', 'recommended version', '推薦版本', '推奨バージョン', '권장 버전', 'phiên bản khuyến nghị', 'versión recomendada', 'versão recomendada', 'рекомендуемая версия', 'version recommandée', 'empfohlene Version'),
unknownCommand: _('未知命令', 'Unknown command', '未知命令', '不明なコマンド', '알 수 없는 명령', 'Lệnh không xác định'),
processing: _('处理中...', 'Processing...', '處理中...', '処理中...', '처리 중...', 'Đang xử lý...', 'Procesando...', 'Processando...', 'Обработка...', 'Traitement...', 'Verarbeitung...'),
// ---------------------------------------------------------------------

View File

@@ -0,0 +1,33 @@
import { _ } from '../helper.js'
export default {
floorBlocker: {
title: _("内核版本过低", "Kernel version too old", "核心版本過低", "カーネルバージョンが古すぎます", "커널 버전이 너무 낮습니다", "Phiên bản kernel quá cũ", "Versión del kernel demasiado antigua", "Versão do kernel muito antiga", "Версия ядра слишком старая", "Version du noyau trop ancienne", "Kernel-Version zu alt"),
message: _("当前 OpenClaw 内核版本 {current} 低于 ClawPanel 支持的最低版本 {floor},部分功能可能无法工作。", "OpenClaw kernel {current} is below the minimum supported version {floor}. Some features may not work.", "目前 OpenClaw 核心版本 {current} 低於 ClawPanel 支援的最低版本 {floor},部分功能可能無法運作。", "OpenClaw カーネル {current} は ClawPanel がサポートする最低バージョン {floor} を下回っています。一部機能が動作しない可能性があります。", "현재 OpenClaw 커널 {current} 은 ClawPanel 의 최소 지원 버전 {floor} 보다 낮습니다. 일부 기능이 작동하지 않을 수 있습니다.", "Kernel OpenClaw {current} thấp hơn phiên bản tối thiểu được hỗ trợ {floor}. Một số tính năng có thể không hoạt động.", "El kernel de OpenClaw {current} está por debajo de la versión mínima soportada {floor}. Algunas funciones podrían no funcionar.", "O kernel OpenClaw {current} está abaixo da versão mínima suportada {floor}. Alguns recursos podem não funcionar.", "Версия ядра OpenClaw {current} ниже минимально поддерживаемой {floor}. Некоторые функции могут не работать.", "Le noyau OpenClaw {current} est inférieur à la version minimale prise en charge {floor}. Certaines fonctionnalités peuvent ne pas fonctionner.", "OpenClaw-Kernel {current} liegt unter der minimal unterstützten Version {floor}. Einige Funktionen funktionieren möglicherweise nicht."),
targetHint: _("推荐升级到 {target} 以获得最佳体验。", "Upgrading to {target} is recommended for the best experience.", "建議升級到 {target} 以獲得最佳體驗。", "最高の体験のため {target} へのアップグレードを推奨します。", "최상의 경험을 위해 {target} 으로 업그레이드를 권장합니다.", "Khuyến nghị nâng cấp lên {target} để có trải nghiệm tốt nhất.", "Se recomienda actualizar a {target} para una mejor experiencia.", "Recomenda-se atualizar para {target} para a melhor experiência.", "Рекомендуется обновиться до {target} для лучшего опыта.", "Il est recommandé de passer à {target} pour la meilleure expérience.", "Ein Upgrade auf {target} wird für die beste Erfahrung empfohlen."),
goUpgrade: _("前往升级", "Upgrade now", "前往升級", "アップグレードへ", "업그레이드", "Nâng cấp ngay", "Actualizar ahora", "Atualizar agora", "Обновить", "Mettre à niveau", "Jetzt upgraden"),
continueReadonly: _("继续使用(只读模式)", "Continue (read-only)", "繼續使用(唯讀模式)", "続行(読み取り専用)", "계속 (읽기 전용)", "Tiếp tục (chỉ đọc)", "Continuar (solo lectura)", "Continuar (somente leitura)", "Продолжить (только чтение)", "Continuer (lecture seule)", "Fortfahren (schreibgeschützt)"),
readonlyHint: _("只读模式下,写入操作会被前端校验拦截,避免破坏老内核的配置。", "In read-only mode, write operations are blocked client-side to avoid corrupting older kernel configs.", "唯讀模式下,寫入操作會被前端攔截,避免破壞舊核心的設定。", "読み取り専用モードでは、古いカーネル設定を壊さないよう書き込み操作はクライアント側でブロックされます。", "읽기 전용 모드에서는 구 커널 설정을 손상시키지 않도록 쓰기 작업이 클라이언트 측에서 차단됩니다.", "Ở chế độ chỉ đọc, các thao tác ghi sẽ bị chặn ở phía client để tránh làm hỏng cấu hình kernel cũ.", "En modo solo lectura, las operaciones de escritura se bloquean en el cliente para evitar dañar configuraciones de kernels antiguos.", "No modo somente leitura, operações de escrita são bloqueadas no cliente para evitar corromper configurações de kernels antigos.", "В режиме только чтения операции записи блокируются на стороне клиента, чтобы не повредить конфиги старых ядер.", "En mode lecture seule, les opérations d'écriture sont bloquées côté client pour éviter de corrompre les configurations d'anciens noyaux.", "Im schreibgeschützten Modus werden Schreibvorgänge clientseitig blockiert, um alte Kernel-Konfigurationen nicht zu beschädigen."),
},
badge: {
currentKernel: _("当前内核", "Kernel", "目前核心", "カーネル", "커널", "Kernel", "Kernel", "Kernel", "Ядро", "Noyau", "Kernel"),
featuresEnabled: _("已启用 {enabled}/{total} 个特性", "{enabled}/{total} features enabled", "已啟用 {enabled}/{total} 個特性", "{enabled}/{total} 機能が有効", "{enabled}/{total} 기능 활성화", "{enabled}/{total} tính năng đã bật", "{enabled}/{total} funciones habilitadas", "{enabled}/{total} recursos habilitados", "{enabled}/{total} функций включено", "{enabled}/{total} fonctionnalités activées", "{enabled}/{total} Funktionen aktiviert"),
belowTarget: _("低于推荐版", "Below recommended", "低於推薦版", "推奨より低い", "권장 이하", "Dưới khuyến nghị", "Bajo la recomendada", "Abaixo do recomendado", "Ниже рекомендуемого", "Sous la version recommandée", "Unter der empfohlenen"),
latest: _("已是最新", "Latest", "已是最新", "最新", "최신", "Mới nhất", "Más reciente", "Mais recente", "Последняя", "À jour", "Aktuell"),
unknown: _("未知", "Unknown", "未知", "不明", "알 수 없음", "Không xác định", "Desconocido", "Desconhecido", "Неизвестно", "Inconnu", "Unbekannt"),
},
upgrade: {
title: _("升级 OpenClaw 内核", "Upgrade OpenClaw kernel", "升級 OpenClaw 核心", "OpenClaw カーネルをアップグレード", "OpenClaw 커널 업그레이드", "Nâng cấp kernel OpenClaw", "Actualizar kernel de OpenClaw", "Atualizar kernel do OpenClaw", "Обновить ядро OpenClaw", "Mettre à jour le noyau OpenClaw", "OpenClaw-Kernel aktualisieren"),
confirmMessage: _("即将从 {from} 升级到 {to}。\n升级约需 2 分钟,期间 Gateway 会自动重启。继续?", "Upgrading from {from} to {to}.\nThis takes about 2 minutes; Gateway will restart automatically. Continue?", "即將從 {from} 升級到 {to}。\n升級約需 2 分鐘,期間 Gateway 會自動重啟。繼續?", "{from} から {to} へアップグレードします。\n約 2 分かかり、その間 Gateway が再起動します。続行しますか?", "{from} 에서 {to} 로 업그레이드합니다.\n약 2 분 소요되며 그동안 Gateway 가 재시작됩니다. 계속할까요?", "Sẽ nâng cấp từ {from} lên {to}.\nMất khoảng 2 phút, Gateway sẽ khởi động lại tự động. Tiếp tục?", "Se actualizará de {from} a {to}.\nTarda unos 2 minutos; Gateway se reiniciará automáticamente. ¿Continuar?", "Atualizando de {from} para {to}.\nLeva cerca de 2 minutos; Gateway será reiniciado automaticamente. Continuar?", "Обновление с {from} до {to}.\nЗаймёт около 2 минут; Gateway перезапустится автоматически. Продолжить?", "Mise à jour de {from} vers {to}.\nCela prend environ 2 minutes ; Gateway redémarrera automatiquement. Continuer ?", "Aktualisierung von {from} auf {to}.\nDauert ca. 2 Minuten, Gateway wird automatisch neu gestartet. Fortfahren?"),
starting: _("开始升级到 {version}...", "Upgrading to {version}...", "開始升級到 {version}...", "{version} にアップグレード中...", "{version} 으로 업그레이드 중...", "Đang nâng cấp lên {version}...", "Actualizando a {version}...", "Atualizando para {version}...", "Обновление до {version}...", "Mise à jour vers {version}...", "Aktualisierung auf {version}..."),
successMessage: _("内核升级完成", "Kernel upgrade complete", "核心升級完成", "カーネルのアップグレードが完了しました", "커널 업그레이드 완료", "Nâng cấp kernel hoàn tất", "Actualización del kernel completada", "Atualização do kernel concluída", "Обновление ядра завершено", "Mise à jour du noyau terminée", "Kernel-Update abgeschlossen"),
successToast: _("内核升级成功", "Kernel upgraded successfully", "核心升級成功", "カーネルのアップグレードに成功しました", "커널 업그레이드 성공", "Nâng cấp kernel thành công", "Kernel actualizado correctamente", "Kernel atualizado com sucesso", "Ядро успешно обновлено", "Noyau mis à jour avec succès", "Kernel erfolgreich aktualisiert"),
failurePrefix: _("内核升级失败:", "Kernel upgrade failed:", "核心升級失敗:", "カーネルのアップグレードに失敗:", "커널 업그레이드 실패:", "Nâng cấp kernel thất bại:", "Falló la actualización del kernel:", "Falha na atualização do kernel:", "Ошибка обновления ядра:", "Échec de la mise à jour du noyau :", "Kernel-Update fehlgeschlagen:"),
},
upgradeHint: {
title: _("有新内核可用", "New kernel available", "有新核心可用", "新しいカーネルが利用可能", "새 커널 사용 가능", "Có kernel mới", "Nuevo kernel disponible", "Novo kernel disponível", "Доступно новое ядро", "Nouveau noyau disponible", "Neuer Kernel verfügbar"),
subtitle: _("{from} → {to},点此一键升级", "{from} → {to}, click to upgrade", "{from} → {to},點此一鍵升級", "{from} → {to}、クリックでアップグレード", "{from} → {to}, 클릭하여 업그레이드", "{from} → {to}, nhấn để nâng cấp", "{from} → {to}, haz clic para actualizar", "{from} → {to}, clique para atualizar", "{from} → {to}, нажмите для обновления", "{from} → {to}, cliquez pour mettre à jour", "{from} → {to}, hier klicken zum Aktualisieren"),
dismissTooltip: _("本次会话不再提醒", "Don't remind me this session", "本次工作階段不再提醒", "このセッションでは再表示しない", "이 세션에서는 알리지 않음", "Không nhắc trong phiên này", "No avisar en esta sesión", "Não avisar nesta sessão", "Не напоминать в этой сессии", "Ne plus avertir pendant cette session", "In dieser Sitzung nicht erneut anzeigen"),
},
tooOldForProtocol: _("Gateway 内核版本过旧,不兼容当前 ClawPanel 使用的握手协议。请把 OpenClaw 内核升级到推荐版本({recommended})后重试。可在「服务管理 → OpenClaw → 一键升级」中完成升级。", "Gateway kernel is too old and does not support the handshake protocol used by this ClawPanel. Please upgrade the OpenClaw kernel to the recommended version ({recommended}) and retry. You can upgrade from \"Services → OpenClaw → Upgrade\".", "Gateway 核心版本過舊,不相容目前 ClawPanel 使用的握手協議。請將 OpenClaw 核心升級到推薦版本({recommended})後重試。可在「服務管理 → OpenClaw → 一鍵升級」中完成升級。", "Gateway kernel is too old and does not support the handshake protocol used by this ClawPanel. Please upgrade the OpenClaw kernel to the recommended version ({recommended}) and retry. You can upgrade from \"Services → OpenClaw → Upgrade\".", "Gateway kernel is too old and does not support the handshake protocol used by this ClawPanel. Please upgrade the OpenClaw kernel to the recommended version ({recommended}) and retry. You can upgrade from \"Services → OpenClaw → Upgrade\".", "Gateway kernel is too old and does not support the handshake protocol used by this ClawPanel. Please upgrade the OpenClaw kernel to the recommended version ({recommended}) and retry. You can upgrade from \"Services → OpenClaw → Upgrade\".", "Gateway kernel is too old and does not support the handshake protocol used by this ClawPanel. Please upgrade the OpenClaw kernel to the recommended version ({recommended}) and retry. You can upgrade from \"Services → OpenClaw → Upgrade\".", "Gateway kernel is too old and does not support the handshake protocol used by this ClawPanel. Please upgrade the OpenClaw kernel to the recommended version ({recommended}) and retry. You can upgrade from \"Services → OpenClaw → Upgrade\".", "Gateway kernel is too old and does not support the handshake protocol used by this ClawPanel. Please upgrade the OpenClaw kernel to the recommended version ({recommended}) and retry. You can upgrade from \"Services → OpenClaw → Upgrade\".", "Gateway kernel is too old and does not support the handshake protocol used by this ClawPanel. Please upgrade the OpenClaw kernel to the recommended version ({recommended}) and retry. You can upgrade from \"Services → OpenClaw → Upgrade\".", "Gateway kernel is too old and does not support the handshake protocol used by this ClawPanel. Please upgrade the OpenClaw kernel to the recommended version ({recommended}) and retry. You can upgrade from \"Services → OpenClaw → Upgrade\"."),
}