From 1df1a4170b88c25073ccc3127e581a4b7c263a7f Mon Sep 17 00:00:00 2001
From: 10000ge10000 <10000ge10000@users.noreply.github.com>
Date: Tue, 17 Mar 2026 01:51:20 +0800
Subject: [PATCH] =?UTF-8?q?release=20v2.0.0:=20=E9=80=82=E9=85=8D=20OpenCl?=
=?UTF-8?q?aw=20v2026.3.13?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
重大变更:
- 配置管理菜单重构,更清晰的导航结构
- 新增高级配置菜单
- 新增全局环境变量 /etc/profile.d/openclaw.sh
修复:
- QQ 机器人插件配置名称不匹配 (#XX)
- 安装运行环境报错缺少 libstdcpp6 (#28)
- 环境变量路径混乱 (#42)
新增:
- 查看日志功能
- 飞书 Bot 配置流程优化
适配:
- Node.js 版本升级到 22.16.0
- OpenClaw 版本升级到 v2026.3.13
- 依赖声明新增 libstdcpp6
---
.github/workflows/build-node-musl.yml | 138 +++++-
CHANGELOG.md | 77 +++
Makefile | 4 +-
README.md | 2 +-
VERSION | 2 +-
docs/UPGRADE_GUIDE_v2026.3.13.md | 652 ++++++++++++++++++++++++++
docs/images/2.png | Bin 0 -> 187969 bytes
luasrc/controller/openclaw.lua | 4 +-
root/etc/init.d/openclaw | 49 ++
root/etc/profile.d/openclaw.sh | 50 ++
root/etc/uci-defaults/99-openclaw | 29 +-
root/usr/bin/openclaw-env | 172 +++++--
root/usr/share/openclaw/oc-config.sh | 486 +++++++++++++++++--
scripts/build-node-musl.sh | 302 +++++++++---
scripts/build_ipk.sh | 83 +++-
scripts/build_run.sh | 9 +-
16 files changed, 1885 insertions(+), 174 deletions(-)
create mode 100644 docs/UPGRADE_GUIDE_v2026.3.13.md
create mode 100644 docs/images/2.png
create mode 100644 root/etc/profile.d/openclaw.sh
diff --git a/.github/workflows/build-node-musl.yml b/.github/workflows/build-node-musl.yml
index 9b271b6..b549cec 100644
--- a/.github/workflows/build-node-musl.yml
+++ b/.github/workflows/build-node-musl.yml
@@ -2,41 +2,57 @@ name: Build Node.js ARM64 musl
on:
workflow_dispatch:
+ inputs:
+ build_v1:
+ description: 'Build V1 (22.15.1) - Legacy compatibility'
+ required: false
+ default: true
+ type: boolean
+ build_v2:
+ description: 'Build V2 (22.16.0) - Current version'
+ required: false
+ default: true
+ type: boolean
jobs:
- build:
- name: Build Node.js ARM64 musl
+ # ── V1 构建: 使用 Alpine apk 模式 (22.15.1) ──
+ build-v1:
+ name: Build Node.js V1 (Legacy)
+ if: ${{ inputs.build_v1 }}
runs-on: ubuntu-latest
permissions:
contents: write
+ outputs:
+ artifact_name: ${{ steps.build_info.outputs.artifact_name }}
steps:
- name: Checkout
uses: actions/checkout@v4
- - name: Extract Node.js version from source
- id: node_ver
- run: |
- NODE_VER=$(grep -oP 'NODE_VERSION="\$\{NODE_VERSION:-\K[0-9.]+' root/usr/bin/openclaw-env)
- echo "version=${NODE_VER}" >> "$GITHUB_OUTPUT"
- echo "Node.js version from openclaw-env: v${NODE_VER}"
-
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
platforms: linux/arm64
- - name: Build Node.js ARM64 musl portable
+ - name: Build Node.js V1 ARM64 musl (apk mode)
run: |
- NODE_VER="${{ steps.node_ver.outputs.version }}"
+ NODE_VER="22.15.1"
mkdir -p dist
- echo "=== Building Node.js v${NODE_VER} ARM64 musl portable tarball ==="
+ echo "=== Building Node.js v${NODE_VER} ARM64 musl (apk mode) ==="
docker run --rm --platform linux/arm64 \
-v "$PWD/dist:/output" \
-v "$PWD/scripts/build-node-musl.sh:/build-node-musl.sh:ro" \
-e "NODE_VER=${NODE_VER}" \
+ -e "BUILD_MODE=apk" \
alpine:3.21 sh /build-node-musl.sh
+ - name: Build info
+ id: build_info
+ run: |
+ ARTIFACT_NAME=$(ls dist/*.tar.xz | head -1 | xargs basename)
+ echo "artifact_name=${ARTIFACT_NAME}" >> "$GITHUB_OUTPUT"
+ echo "Artifact: ${ARTIFACT_NAME}"
+
- name: Verify tarball
run: |
echo "=== Output files ==="
@@ -48,9 +64,90 @@ jobs:
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
- name: node-arm64-musl
+ name: node-arm64-musl-v1
path: dist/*.tar.xz
+ # ── V2 构建: 使用交叉编译模式 (22.16.0) ──
+ build-v2:
+ name: Build Node.js V2 (Current)
+ if: ${{ inputs.build_v2 }}
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+ outputs:
+ artifact_name: ${{ steps.build_info.outputs.artifact_name }}
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@v3
+ with:
+ platforms: linux/arm64
+
+ - name: Build Node.js V2 ARM64 musl (cross mode)
+ run: |
+ NODE_VER="22.16.0"
+ mkdir -p dist
+ echo "=== Building Node.js v${NODE_VER} ARM64 musl (cross mode) ==="
+ docker run --rm --platform linux/arm64 \
+ -v "$PWD/dist:/output" \
+ -v "$PWD/scripts/build-node-musl.sh:/build-node-musl.sh:ro" \
+ -e "NODE_VER=${NODE_VER}" \
+ -e "BUILD_MODE=cross" \
+ alpine:3.21 sh /build-node-musl.sh
+
+ - name: Build info
+ id: build_info
+ run: |
+ ARTIFACT_NAME=$(ls dist/*.tar.xz | head -1 | xargs basename)
+ echo "artifact_name=${ARTIFACT_NAME}" >> "$GITHUB_OUTPUT"
+ echo "Artifact: ${ARTIFACT_NAME}"
+
+ - name: Verify tarball
+ run: |
+ echo "=== Output files ==="
+ ls -lh dist/
+ echo ""
+ echo "=== Tarball contents (first 20 entries) ==="
+ tar tJf dist/*.tar.xz | head -20
+
+ - name: Upload artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: node-arm64-musl-v2
+ path: dist/*.tar.xz
+
+ # ── 发布到 GitHub Release ──
+ release:
+ name: Create/Update Release
+ needs: [build-v1, build-v2]
+ if: always() && (needs.build-v1.result == 'success' || needs.build-v2.result == 'success')
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+
+ steps:
+ - name: Download V1 artifact
+ if: ${{ needs.build-v1.result == 'success' }}
+ uses: actions/download-artifact@v4
+ with:
+ name: node-arm64-musl-v1
+ path: dist/
+
+ - name: Download V2 artifact
+ if: ${{ needs.build-v2.result == 'success' }}
+ uses: actions/download-artifact@v4
+ with:
+ name: node-arm64-musl-v2
+ path: dist/
+
+ - name: List all artifacts
+ run: |
+ echo "=== All artifacts ==="
+ ls -lh dist/
+
- name: Create/Update Release
uses: softprops/action-gh-release@v2
with:
@@ -66,7 +163,16 @@ jobs:
Node.js 官方 [unofficial-builds](https://unofficial-builds.nodejs.org/) 仅提供 x64 musl 构建,不提供 ARM64 musl。
此 Release 使用 Alpine Linux ARM64 (musl libc) 环境打包。
- **注意**: 文件名中的版本号为 Alpine `apk add nodejs` 实际安装的版本,
- 构建时自动从 `openclaw-env` 读取。
+ ## 版本说明
- `openclaw-env setup` 会在 ARM64 musl 设备上自动从此处下载。
+ | 文件 | 版本 | 用途 |
+ |------|------|------|
+ | `node-v22.16.0-linux-arm64-musl.tar.xz` | V2 (当前) | OpenClaw v2026.3.11+ (要求 >= 22.16.0) |
+ | `node-v22.15.1-linux-arm64-musl.tar.xz` | V1 (旧版) | OpenClaw v2026.3.8 及更早版本 |
+
+ ## 构建模式
+
+ - **V2 (22.16.0)**: 交叉编译模式,从 Node.js 官方 glibc 版本转换为 musl
+ - **V1 (22.15.1)**: Alpine apk 模式,使用 Alpine 仓库的 Node.js
+
+ `openclaw-env setup` 会在 ARM64 musl 设备上自动从此处下载合适的版本。
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ff38197..ceaf299 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,83 @@
格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/)。
+## [2.0.0] - 2026-03-16
+
+### 重大变更
+- **配置管理菜单重构**: 主菜单采用分组样式,更清晰的导航结构
+ - AI 模型配置:配置 AI 模型和提供商、设置活动模型
+ - 消息渠道:配置消息渠道 (电报/QQ/飞书)
+ - 系统管理:健康检查与状态、查看日志、重启 Gateway
+ - 高级选项:高级配置、重置配置、显示当前配置概览
+- **新增高级配置菜单**: 独立的高级配置入口,包含:
+ - Gateway 端口/绑定地址/运行模式配置
+ - 日志级别设置
+ - ACP Dispatch 开关
+ - 官方完整配置向导入口
+ - 原始 JSON 查看/编辑
+ - 配置备份导出/导入
+
+### 修复
+- **QQ 机器人插件配置名称不匹配** (#XX): OpenClaw v2026.3.13 加强了配置验证,`plugins.allow` 中的插件名称必须与实际安装的插件名完全匹配
+ - 问题:旧版本写入的是 `openclaw-qqbot`,但实际插件名是 `@tencent-connect/openclaw-qqbot`
+ - 影响:配置验证失败导致 Gateway 启动后立即退出,procd 进入 crash loop 保护
+ - 修复:新增 `fix_plugin_config` 函数自动检测并修正不匹配的插件名称
+ - 修复:`configure_qq` 安装插件后调用 `ensure_qqbot_plugin_allowed` 确保正确的插件名写入配置
+ - 修复:`init.d` 服务启动前自动修复配置中的插件名称
+- **安装运行环境报错** (#28): 部分系统缺少 `libstdcpp6` 导致 Node.js 无法运行,安装 pnpm 时卡住
+ - 依赖声明新增 `libstdcpp6`,安装时自动拉取 C++ 标准库
+ - Node.js 验证逻辑改进:检测到运行失败时提示缺失的库并给出修复命令
+- **环境变量路径混乱** (#42): 用户通过 SSH 直接运行 `openclaw` 命令时,CLI 使用默认 `HOME=/root` 导致配置文件和 skills 散落在 `/root/.openclaw/` 而非正确的 `/opt/openclaw/data/.openclaw/`
+ - 新增 `/etc/profile.d/openclaw.sh` 全局环境变量脚本,SSH 登录后自动设置正确的 PATH、OPENCLAW_HOME 等变量
+ - 升级时自动迁移 `/root/.openclaw/` 下的 skills、sessions、openclaw.json 到正确路径
+ - 用户现在可以直接运行 `npm`、`npx`、`openclaw config` 等命令
+
+### 新增
+- **全局环境变量**: `/etc/profile.d/openclaw.sh` 为 SSH 用户提供:
+ - PATH 包含 Node.js 和 OpenClaw bin 目录
+ - OPENCLAW_HOME、OPENCLAW_STATE_DIR、OPENCLAW_CONFIG_PATH 正确指向安装路径
+ - `openclaw` 命令别名(当全局安装时)
+- **查看日志功能**: 主菜单新增「查看日志」选项,显示最近 100 条 OpenClaw 日志
+
+### 变更
+- Makefile 新增 `/etc/profile.d/openclaw.sh` 安装步骤
+- 依赖声明新增 `libstdcpp6`
+- **飞书 Bot 配置流程优化**: 参考 QQ Bot 实现,大幅简化配置步骤
+ - 新增 App ID 格式验证(`cli_xxx` 格式)
+ - 新增 App Secret 长度检查
+ - 使用 OpenClaw CLI 一键配置(`oc_cmd channels add --channel feishu`)
+ - 配置保存后自动验证
+ - 新增详细的事件订阅、权限配置、插件安装指引
+
+### 适配 OpenClaw v2026.3.13
+
+#### 升级说明
+- **Node.js 版本升级**: 从 22.15.1 升级到 22.16.0 (OpenClaw v2026.3.11+ 最低要求)
+- **OpenClaw 版本升级**: 从 v2026.3.8 升级到 v2026.3.13
+
+#### 重要安全修复
+- WebSocket 跨站劫持漏洞修复 (GHSA-5wcw-8jjv-m286)
+- 设备配对安全增强:切换到短期引导令牌 (GHSA-99qw-6mr3-36qr)
+- 命令审批安全加固:Unicode 不可见字符转义、执行检测规范化
+- 多渠道 Webhook 安全增强:飞书/LINE/Zalo 签名验证强化
+
+#### 新功能支持
+- **Fast Mode**: OpenAI/Anthropic 快速响应模式支持
+- **Control UI 重构**: 新版 Dashboard-v2 模块化界面
+- **Ollama 本地向导**: 支持本地或云端+本地混合模式
+- **Kubernetes 部署**: 新增 K8s 部署清单和文档
+- **Docker 时区**: 新增 `OPENCLAW_TZ` 环境变量支持
+
+#### 破坏性变更处理
+- **Cron 主动投递收紧**: 升级后建议运行 `openclaw doctor --fix` 迁移旧版 cron 存储
+- **插件安全策略**: 禁用隐式工作区插件自动加载,需显式信任决策
+- **Node.js 最低版本**: 要求 >= 22.16.0 (已在 openclaw-env 中更新)
+
+#### 配置兼容性
+- 现有配置文件完全兼容,无需手动迁移
+- 已预设 `gateway.controlUi.dangerouslyDisableDeviceAuth=true` 禁用设备认证
+- 已预设 `gateway.controlUi.allowInsecureAuth=true` 允许不安全认证
+
## [1.0.15] - 2026-03-13
### 修复
diff --git a/Makefile b/Makefile
index 23a04c5..6cdc6bb 100644
--- a/Makefile
+++ b/Makefile
@@ -13,7 +13,7 @@ PKG_MAINTAINER:=10000ge10000 <10000ge10000@users.noreply.github.com>
PKG_LICENSE:=GPL-3.0
LUCI_TITLE:=OpenClaw AI 网关 LuCI 管理插件
-LUCI_DEPENDS:=+luci-compat +luci-base +curl +openssl-util +script-utils +tar
+LUCI_DEPENDS:=+luci-compat +luci-base +curl +openssl-util +script-utils +tar +libstdcpp6
LUCI_PKGARCH:=all
# 优先使用 luci.mk (feeds 模式), 不可用时回退 package.mk
@@ -52,6 +52,8 @@ define Package/$(PKG_NAME)/install
$(INSTALL_BIN) ./root/etc/uci-defaults/99-openclaw $(1)/etc/uci-defaults/99-openclaw
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) ./root/etc/init.d/openclaw $(1)/etc/init.d/openclaw
+ $(INSTALL_DIR) $(1)/etc/profile.d
+ $(INSTALL_DATA) ./root/etc/profile.d/openclaw.sh $(1)/etc/profile.d/openclaw.sh
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) ./root/usr/bin/openclaw-env $(1)/usr/bin/openclaw-env
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller
diff --git a/README.md b/README.md
index f17246d..7752d06 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@
在路由器上运行 OpenClaw,通过 LuCI 管理界面完成安装、配置和服务管理。
-

+
**系统要求**
diff --git a/VERSION b/VERSION
index a970716..227cea2 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.0.15
+2.0.0
diff --git a/docs/UPGRADE_GUIDE_v2026.3.13.md b/docs/UPGRADE_GUIDE_v2026.3.13.md
new file mode 100644
index 0000000..218ae30
--- /dev/null
+++ b/docs/UPGRADE_GUIDE_v2026.3.13.md
@@ -0,0 +1,652 @@
+# OpenClaw 版本升级推进流程文档
+
+## 概述
+
+本文档详细记录了从 OpenClaw v2026.3.8 升级到 v2026.3.13 的完整分析和推进流程。
+
+| 项目 | 当前版本 | 目标版本 |
+|------|----------|----------|
+| OpenClaw | v2026.3.8 | v2026.3.13 |
+| 发布日期 | 2026-03-09 | 2026-03-14 |
+| Node.js 要求 | >= 22.x | >= 22.16.0 |
+
+---
+
+## 一、版本差异分析报告
+
+### 1.1 版本发布时间线
+
+| 版本 | 发布日期 | 类型 |
+|------|----------|------|
+| v2026.3.8 | 2026-03-09 | 稳定版 (当前) |
+| v2026.3.11 | 2026-03-12 | 稳定版 |
+| v2026.3.12 | 2026-03-13 | 稳定版 |
+| v2026.3.13 | 2026-03-14 | 稳定版 (目标) |
+
+### 1.2 关键变更摘要
+
+#### 🔴 重大变更 (Breaking Changes)
+
+1. **Node.js 最低版本要求提升**
+ - 旧版本: Node.js >= 22.x
+ - 新版本: Node.js >= 22.16.0
+ - **影响**: 当前项目 `NODE_VERSION="22.15.1"` 不满足要求,必须升级
+
+2. **Cron/主动投递收紧 (v2026.3.11)**
+ - 孤立的直接 cron 发送不再通过临时 agent 发送或主会话摘要通知
+ - 需要运行 `openclaw doctor --fix` 迁移旧版 cron 存储
+
+3. **插件安全策略变更 (v2026.3.12)**
+ - 禁用隐式工作区插件自动加载
+ - 克隆的仓库不能执行工作区插件代码,需要显式信任决策
+
+#### 🟡 安全修复
+
+| 编号 | 描述 | 影响范围 |
+|------|------|----------|
+| GHSA-5wcw-8jjv-m286 | WebSocket 跨站劫持漏洞修复 | Gateway 模式 |
+| GHSA-99qw-6mr3-36qr | 设备配对安全:切换到短期引导令牌 | 配对流程 |
+| GHSA-pcqg-f7rg-xfvv | 执行审批:Unicode 不可见字符转义 | 命令审批 |
+| GHSA-9r3v-37xh-2cf6 | 执行检测:Unicode 规范化 | 命令检测 |
+| GHSA-f8r2-vg7x-gh8m | 执行白名单:POSIX 大小写敏感 | 命令白名单 |
+| GHSA-r7vr-gr74-94p8 | 命令权限:/config 和 /debug 需所有者权限 | 权限控制 |
+| GHSA-rqpp-rjj8-7wv8 | Gateway 认证:清除未绑定客户端声明范围 | 认证安全 |
+| GHSA-vmhq-cqm9-6p7q | 浏览器请求:阻止持久化配置文件变更 | 浏览器控制 |
+| GHSA-2rqg-gjgv-84jm | Agent 安全:拒绝公共生成运行血统字段 | Agent 安全 |
+| GHSA-wcxr-59v9-rxr8 | 会话状态:沙箱会话树可见性强制执行 | 会话隔离 |
+| GHSA-2pwv-x786-56f8 | 设备配对:限制令牌范围 | 令牌安全 |
+| GHSA-jv4g-m82p-2j93 | WebSocket 预认证:缩短握手保留时间 | 连接安全 |
+| GHSA-6rph-mmhp-h7h9 | 代理附件:恢复媒体存储大小限制 | 文件上传 |
+| GHSA-jf5v-pqgw-gm5m | 主机环境:阻止继承 GIT_EXEC_PATH | 环境隔离 |
+| GHSA-g353-mgv3-8pcj | 飞书 Webhook:要求加密密钥 | 飞书渠道 |
+| GHSA-m69h-jm2f-2pv8 | 飞书反应:群组授权和提及门控 | 飞书渠道 |
+| GHSA-mhxh-9pjm-w7q5 | LINE Webhook:空事件也需要签名 | LINE 渠道 |
+| GHSA-5m9r-p9g7-679c | Zalo Webhook:限制无效密钥猜测速率 | Zalo 渠道 |
+
+#### 🟢 新增功能
+
+1. **Control UI/Dashboard-v2 重构** (v2026.3.12)
+ - 模块化概览、聊天、配置、agent 和会话视图
+ - 命令面板、移动端底部标签
+ - 斜杠命令、搜索、导出、固定消息等聊天工具
+
+2. **OpenAI/GPT-5.4 Fast Mode** (v2026.3.12)
+ - 可配置的会话级快速切换
+ - 跨 `/fast`、TUI、Control UI 和 ACP 支持
+ - 每模型配置默认值和 OpenAI/Codex 请求整形
+
+3. **Anthropic/Claude Fast Mode** (v2026.3.12)
+ - 映射共享 `/fast` 切换到 Anthropic API `service_tier` 请求
+ - Anthropic 和 OpenAI fast-mode 层级的实时验证
+
+4. **提供商插件架构** (v2026.3.12)
+ - Ollama、vLLM、SGLang 迁移到提供商插件架构
+ - 提供商拥有的引导、发现、模型选择器设置
+
+5. **Kubernetes 部署支持** (v2026.3.12)
+ - 原始清单、Kind 设置、部署文档
+
+6. **Ollama 本地模式向导** (v2026.3.11)
+ - 本地或云端+本地模式的首选 Ollama 设置
+ - 基于浏览器的云端登录
+ - 精选模型建议
+
+7. **Docker 时区支持** (v2026.3.13)
+ - 新增 `OPENCLAW_TZ` 环境变量
+
+8. **iOS/macOS UI 改进**
+ - iOS: 欢迎屏幕、停靠工具栏、聊天模型选择器
+ - macOS: 聊天模型选择器、思考级别选择持久化
+
+#### 🔵 Bug 修复 (精选)
+
+| 类别 | 修复内容 |
+|------|----------|
+| 模型支持 | Kimi Coding 工具调用格式修复、OpenRouter 模型 ID 规范化 |
+| Telegram | HTML 消息分块、最终预览投递、IPv4 回退重试 |
+| Discord | 回复分块、自动线程归档时长配置 |
+| 飞书 | 本地图片自动转换、非 ASCII 文件名保留 |
+| Mattermost | 块流重复消息修复、Markdown 格式保留 |
+| 会话管理 | 重置模型重新计算、会话发现、ACP 会话别名 |
+| 性能 | 构建内存回归修复 (~2x)、插件 SDK 块去重 |
+
+### 1.3 配置文件格式变化
+
+#### 新增配置项
+
+```json
+{
+ "agents": {
+ "defaults": {
+ "compaction": {
+ "postIndexSync": true
+ },
+ "memorySearch": {
+ "sync": {
+ "sessions": {
+ "postCompactionForce": false
+ }
+ }
+ }
+ }
+ },
+ "channels": {
+ "discord": {
+ "autoArchiveDuration": 60 // 60, 1440, 4320, 10080 分钟
+ }
+ }
+}
+```
+
+#### Fast Mode 使用说明
+
+Fast Mode 是 OpenClaw v2026.3.12 新增的功能,用于启用 OpenAI/Anthropic 的快速响应模式。
+
+**注意**: Fast Mode 不是通过配置文件直接设置的,而是通过以下方式启用:
+
+1. **TUI 界面**: 使用 `/fast` 命令切换
+2. **Control UI**: 在聊天界面中切换 Fast Mode 开关
+3. **API 调用**: 在请求参数中设置 `fastMode: true`
+
+**配置示例** (通过 CLI 设置):
+```bash
+# 在会话中切换 Fast Mode
+openclaw tui
+# 然后输入 /fast 命令
+
+# 或通过 Control UI (http://<设备IP>:18789) 在聊天设置中启用
+```
+
+**支持的模型**:
+- OpenAI: GPT-4/5 系列 (需要 API 支持 fast tier)
+- Anthropic: Claude 系列 (需要 API 支持 service_tier)
+
+#### 废弃/变更配置项
+
+- `channels.zalouser.dangerouslyAllowNameMatching` - 新增危险选项
+- `channels.slack.dangerouslyAllowNameMatching` - 新增危险选项
+- `channels.teams.dangerouslyAllowNameMatching` - 新增危险选项
+
+### 1.4 API 接口变动
+
+| 接口 | 变化类型 | 描述 |
+|------|----------|------|
+| `/pair` | 安全增强 | 使用短期引导令牌替代共享凭证 |
+| `sessions_spawn` | 新增 | 支持 `resumeSessionId` 参数 |
+| `sessions.patch` | 新增字段 | 支持 `spawnedBy`、`spawnDepth` 血统字段 |
+| `node.pending.*` | 新增 | 内存中待处理工作队列原语 |
+
+### 1.5 依赖项变更
+
+#### Node.js 版本要求
+
+```
+旧版本: "engines": { "node": ">=22.x" }
+新版本: "engines": { "node": ">=22.16.0" }
+```
+
+#### 包管理器
+
+```
+pnpm@10.23.0 (无变化)
+```
+
+#### 核心依赖更新 (精选)
+
+| 包名 | 变化 |
+|------|------|
+| `@agentclientprotocol/sdk` | 升级到 0.16.1 |
+| `playwright-core` | 升级到 1.58.2 |
+| `sharp` | 升级到 ^0.34.5 |
+| `hono` | 升级到 4.12.7 |
+| `zod` | 升级到 ^4.3.6 |
+
+### 1.6 二进制文件大小变化
+
+| 指标 | v2026.3.8 | v2026.3.13 | 变化 |
+|------|-----------|------------|------|
+| npm 包解压大小 | ~90MB | ~95MB | +5MB |
+| 文件数量 | ~4500 | ~4730 | +230 |
+
+---
+
+## 二、需要修改的文件清单及具体修改内容
+
+### 2.1 必须修改的文件
+
+#### 2.1.1 `root/usr/bin/openclaw-env`
+
+**修改原因**: Node.js 版本要求提升
+
+```diff
+- NODE_VERSION="${NODE_VERSION:-22.15.1}"
++ NODE_VERSION="${NODE_VERSION:-22.16.0}"
+
+- # 经过验证的 OpenClaw 稳定版本 (更新此值需同步测试)
+- OC_TESTED_VERSION="2026.3.8"
++ # 经过验证的 OpenClaw 稳定版本 (更新此值需同步测试)
++ OC_TESTED_VERSION="2026.3.13"
+```
+
+#### 2.1.2 `CHANGELOG.md`
+
+**新增内容**:
+
+```markdown
+## [2.1.0] - 2026-03-XX
+
+### 适配 OpenClaw v2026.3.13
+
+#### 升级说明
+- **Node.js 版本升级**: 从 22.15.1 升级到 22.16.0 (OpenClaw 最低要求)
+- **OpenClaw 版本升级**: 从 v2026.3.8 升级到 v2026.3.13
+
+#### 重要变更
+- 安全修复: WebSocket 跨站劫持漏洞、设备配对安全增强
+- 新功能: Control UI 重构、Fast Mode 支持、Ollama 本地向导
+- 插件安全: 禁用隐式工作区插件自动加载
+
+#### 配置迁移
+- 升级后建议运行 `openclaw doctor --fix` 迁移旧版 cron 存储
+```
+
+#### 2.1.3 `VERSION`
+
+```diff
+- 2.0.0
++ 2.1.0
+```
+
+### 2.2 建议修改的文件
+
+#### 2.2.1 `root/usr/share/openclaw/oc-config.sh`
+
+**检查点**:
+1. 确认 `openclaw doctor --fix` 命令在升级后可用
+2. 检查是否有新增的配置项需要在菜单中展示
+3. 确认 Fast Mode 配置是否需要 UI 入口
+
+**建议新增菜单项**:
+
+```bash
+# 在模型配置菜单中新增 Fast Mode 开关
+configure_fast_mode() {
+ local current
+ current=$(get_config ".params.fastMode // false")
+
+ if [ "$current" = "true" ]; then
+ status="已启用"
+ else
+ status="已禁用"
+ fi
+
+ echo ""
+ echo "=== Fast Mode 配置 ==="
+ echo "当前状态: $status"
+ echo ""
+ echo "Fast Mode 可启用 OpenAI/Anthropic 的快速响应模式"
+ echo "需要 API 密钥支持相应的服务层级"
+ echo ""
+ echo "1) 启用"
+ echo "2) 禁用"
+ echo "0) 返回"
+ echo ""
+ read -p "请选择: " choice
+
+ case $choice in
+ 1) set_config ".params.fastMode = true" ;;
+ 2) set_config ".params.fastMode = false" ;;
+ 0) return ;;
+ esac
+}
+```
+
+#### 2.2.2 `luasrc/model/cbi/openclaw/basic.lua`
+
+**检查点**:
+1. 确认配置项与新版 OpenClaw 兼容
+2. 考虑新增 Fast Mode 配置 UI
+
+#### 2.2.3 `README.md`
+
+**更新内容**:
+- 更新版本号引用
+- 添加升级注意事项
+- 更新 Node.js 版本要求说明
+
+### 2.3 需要验证的文件
+
+| 文件 | 验证内容 |
+|------|----------|
+| `root/etc/init.d/openclaw` | 启动脚本兼容性 |
+| `scripts/build_run.sh` | 构建脚本 Node.js 版本 |
+| `scripts/build_ipk.sh` | IPK 构建脚本 |
+
+---
+
+## 三、升级测试方案
+
+### 3.1 测试环境准备
+
+#### 3.1.1 测试矩阵
+
+| 环境 | 架构 | libc | 固件 |
+|------|------|------|------|
+| x86_64-glibc | x86_64 | glibc | Debian/Ubuntu |
+| x86_64-musl | x86_64 | musl | OpenWrt/iStoreOS |
+| aarch64-musl | aarch64 | musl | OpenWrt/iStoreOS |
+
+#### 3.1.2 测试前准备
+
+```bash
+# 1. 备份当前配置
+cp -r /opt/openclaw/data/.openclaw /tmp/openclaw-backup
+
+# 2. 记录当前版本
+openclaw --version
+
+# 3. 检查 Node.js 版本
+node --version
+```
+
+### 3.2 升级测试步骤
+
+#### 3.2.1 全新安装测试
+
+```bash
+# 1. 清理旧环境
+rm -rf /opt/openclaw
+
+# 2. 安装新版本
+openclaw-env setup
+
+# 3. 验证版本
+openclaw --version # 应显示 2026.3.13
+node --version # 应显示 v22.16.0 或更高
+
+# 4. 运行引导
+openclaw onboard
+
+# 5. 基础功能测试
+openclaw doctor
+```
+
+#### 3.2.2 升级安装测试
+
+```bash
+# 1. 从 v2026.3.8 升级
+export OC_VERSION=2026.3.13
+openclaw-env upgrade
+
+# 2. 验证版本
+openclaw --version
+
+# 3. 运行迁移
+openclaw doctor --fix
+
+# 4. 验证配置
+openclaw config list
+```
+
+#### 3.2.3 配置兼容性测试
+
+```bash
+# 1. 恢复旧配置
+cp -r /tmp/openclaw-backup/* /opt/openclaw/data/.openclaw/
+
+# 2. 重启服务
+/etc/init.d/openclaw restart
+
+# 3. 检查日志
+logread -f | grep -i openclaw
+
+# 4. 验证渠道
+openclaw channels list
+```
+
+### 3.3 功能回归测试清单
+
+| 测试项 | 测试内容 | 预期结果 | 状态 |
+|--------|----------|----------|------|
+| 基础启动 | Gateway 启动 | 正常启动 | [ ] |
+| 模型配置 | 设置活动模型 | 配置保存成功 | [ ] |
+| Telegram | 消息收发 | 双向通信正常 | [ ] |
+| QQ Bot | 消息收发 | 双向通信正常 | [ ] |
+| 飞书 | 消息收发 | 双向通信正常 | [ ] |
+| Discord | 消息收发 | 双向通信正常 | [ ] |
+| Doctor | 健康检查 | 无错误报告 | [ ] |
+| Doctor --fix | 迁移修复 | 成功执行 | [ ] |
+| Fast Mode | 开关切换 | 配置生效 | [ ] |
+| LuCI 界面 | 页面加载 | 正常显示 | [ ] |
+| 日志查看 | 日志输出 | 正常显示 | [ ] |
+| 备份恢复 | 配置备份/恢复 | 功能正常 | [ ] |
+
+### 3.4 性能测试
+
+```bash
+# 1. 内存占用
+ps aux | grep node
+
+# 2. 启动时间
+time /etc/init.d/openclaw start
+
+# 3. 响应延迟
+curl -w "@curl-format.txt" -o /dev/null -s http://localhost:3000/health
+```
+
+### 3.5 回滚策略
+
+#### 3.5.1 自动回滚脚本
+
+```bash
+#!/bin/sh
+# rollback.sh - OpenClaw 版本回滚脚本
+
+echo "=== OpenClaw 版本回滚 ==="
+
+# 1. 停止服务
+/etc/init.d/openclaw stop
+
+# 2. 备份当前状态
+cp -r /opt/openclaw/data/.openclaw /tmp/openclaw-failed-upgrade
+
+# 3. 恢复旧版本
+export OC_VERSION=2026.3.8
+openclaw-env upgrade
+
+# 4. 恢复配置
+cp -r /tmp/openclaw-backup/* /opt/openclaw/data/.openclaw/
+
+# 5. 重启服务
+/etc/init.d/openclaw start
+
+# 6. 验证
+openclaw --version
+echo "回滚完成"
+```
+
+#### 3.5.2 手动回滚步骤
+
+```bash
+# 1. 停止服务
+/etc/init.d/openclaw stop
+
+# 2. 卸载新版本
+npm uninstall -g openclaw --prefix /opt/openclaw/global
+
+# 3. 安装旧版本
+npm install -g openclaw@2026.3.8 --prefix /opt/openclaw/global
+
+# 4. 恢复 Node.js (如需要)
+# 重新运行 openclaw-env node 安装 22.15.1
+
+# 5. 恢复配置
+cp -r /tmp/openclaw-backup/* /opt/openclaw/data/.openclaw/
+
+# 6. 重启服务
+/etc/init.d/openclaw start
+```
+
+---
+
+## 四、发布前检查清单
+
+### 4.1 代码检查
+
+- [ ] 所有文件修改已提交
+- [ ] CHANGELOG.md 已更新
+- [ ] VERSION 文件已更新
+- [ ] README.md 已更新
+
+### 4.2 测试检查
+
+- [ ] x86_64-glibc 环境测试通过
+- [ ] x86_64-musl 环境测试通过
+- [ ] aarch64-musl 环境测试通过
+- [ ] 全新安装测试通过
+- [ ] 升级安装测试通过
+- [ ] 配置兼容性测试通过
+- [ ] 功能回归测试通过
+- [ ] 性能测试无退化
+
+### 4.3 文档检查
+
+- [ ] 升级指南已更新
+- [ ] 用户文档已更新
+- [ ] API 文档已更新 (如有变化)
+
+### 4.4 构建检查
+
+- [ ] IPK 构建成功
+- [ ] 离线安装包构建成功
+- [ ] 文件大小合理
+
+### 4.5 安全检查
+
+- [ ] 无已知安全漏洞
+- [ ] 敏感信息已清理
+- [ ] 权限设置正确
+
+---
+
+## 五、用户升级指南草稿
+
+### OpenClaw v2026.3.13 升级指南
+
+#### 升级前须知
+
+1. **Node.js 版本要求**: 本次升级要求 Node.js >= 22.16.0
+2. **配置兼容性**: 现有配置文件兼容,无需手动迁移
+3. **建议备份**: 升级前建议备份当前配置
+
+#### 升级方式
+
+##### 方式一:通过 LuCI 界面升级
+
+1. 登录 LuCI 管理界面
+2. 进入「服务」→「OpenClaw」
+3. 点击「系统管理」→「升级 OpenClaw」
+4. 等待升级完成
+5. 验证版本号已更新
+
+##### 方式二:通过命令行升级
+
+```bash
+# SSH 登录后执行
+openclaw-env upgrade
+
+# 升级后运行迁移
+openclaw doctor --fix
+
+# 验证版本
+openclaw --version
+```
+
+##### 方式三:指定版本升级
+
+```bash
+# 指定升级到 v2026.3.13
+export OC_VERSION=2026.3.13
+openclaw-env upgrade
+```
+
+#### 升级后验证
+
+```bash
+# 1. 检查服务状态
+/etc/init.d/openclaw status
+
+# 2. 检查版本
+openclaw --version
+
+# 3. 运行健康检查
+openclaw doctor
+
+# 4. 检查日志
+logread | grep -i openclaw | tail -20
+```
+
+#### 新功能体验
+
+1. **Fast Mode**: 在模型配置中启用快速响应模式
+2. **Control UI**: 访问 `http://<设备IP>:3000` 体验新版控制面板
+3. **Ollama 本地向导**: 运行 `openclaw onboard` 配置本地模型
+
+#### 常见问题
+
+**Q: 升级后服务无法启动?**
+
+A: 检查 Node.js 版本是否满足要求:
+```bash
+node --version # 应显示 v22.16.0 或更高
+```
+
+**Q: 升级后配置丢失?**
+
+A: 配置文件位于 `/opt/openclaw/data/.openclaw/`,检查是否正确恢复。
+
+**Q: 如何回滚到旧版本?**
+
+A: 执行以下命令:
+```bash
+export OC_VERSION=2026.3.8
+openclaw-env upgrade
+```
+
+#### 安全改进说明
+
+本次升级包含多项安全修复,建议所有用户尽快升级:
+
+- WebSocket 跨站劫持漏洞修复
+- 设备配对安全增强
+- 命令审批安全加固
+- 多个渠道 Webhook 安全增强
+
+---
+
+## 六、附录
+
+### A. 版本发布说明链接
+
+- [v2026.3.13 Release Notes](https://github.com/openclaw/openclaw/releases/tag/v2026.3.13-1)
+- [v2026.3.12 Release Notes](https://github.com/openclaw/openclaw/releases/tag/v2026.3.12)
+- [v2026.3.11 Release Notes](https://github.com/openclaw/openclaw/releases/tag/v2026.3.11)
+
+### B. 相关 Issue 和 PR
+
+本次升级涉及的主要变更:
+- Node.js 最低版本要求: #45640
+- Fast Mode 支持: 多个 PR
+- 安全修复: 多个 GHSA 编号
+
+### C. 联系方式
+
+如有问题,请通过以下方式反馈:
+- GitHub Issues: https://github.com/10000ge10000/luci-app-openclaw/issues
+- OpenClaw 官方: https://github.com/openclaw/openclaw/issues
+
+---
+
+**文档版本**: 1.0
+**创建日期**: 2026-03-16
+**最后更新**: 2026-03-16
diff --git a/docs/images/2.png b/docs/images/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..121ca5e2e92fc2ec0fb72686d30eb0f295a41416
GIT binary patch
literal 187969
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 |