* feat: Agents wizard for Telegram/Discord + OCM header version * fix: main-html-script syntax (tree toggle) * ui: centered version badge + update Telegram/Discord setup guides * ui: center prominent version badge + update Telegram/Discord setup guides * fix: center OCM-only version badge + include ocmVersion in status + discord guide i18n * fix: escape discord guide apostrophe in MAIN_HTML_SCRIPT * release: v0.9.0 * fix: include ocmVersion in /api/status * fix: add missing wiz.* i18n keys for Agents wizard * fix: add wiz.* i18n keys to MAIN_HTML_SCRIPT * docs: add Discord workflow section + new redacted screenshots (draft) * docs: replace discord screenshots with English/redacted versions * docs: replace discord add-subagent screenshot (English + redacted) --------- Co-authored-by: Tao <dtzp555@gmail.com>
41 KiB
OpenClaw Manager — 开发日志
最后更新:2026-03-01 当前版本:v0.9.0
v0.9.0 更新日志(2026-03-01)
New Features
- Agents: Add Agent / Add Sub-Agent 向导支持 Telegram + Discord
- Telegram: 传统 group 绑定
- Discord: 主 Agent 建议绑定 Channel;Sub-Agent 建议绑定 Thread
- Routing: 删除绑定提示文案增强(支持“更换 group/thread → 先删旧绑定再加新绑定”)
UX / UI
- 顶部居中显示醒目的 OCM 版本标识
- Agents 页面:Agent Tree 支持显示 bindings 概览(Telegram/Discord)并按 parentAgentId 分组
- Setup Guide:补全 Telegram Allow Groups 步骤;Discord guide 按 channel/thread 经验重写
Fixes
- 修复 MAIN_HTML_SCRIPT 内联 JS 语法问题(tree toggle / i18n 单引号等),避免启动自检失败
Unreleased(2026-02-28)
Dashboard / Layout
- Removed the dashboard
HTTP Pingfield (often misleading in Telegram gateway setups) - Expanded dashboard visibility with richer gateway routing metadata:
- bind host
- telegram account count
- group count
- binding count
- allowFrom count
- Reordered dashboard cards and made
Agents/Gatewaycards wider for denser information display
Bug Fixes
- Fixed
mainagent workspace file browsing/editing fallback:- when agent-level workspace is empty, it now resolves from defaults or
workspace/<agentId> - writing files now ensures workspace directory exists before save
- when agent-level workspace is empty, it now resolves from defaults or
UX Clarification
- Channels page hint text updated to position it as advanced routing management
- Clarifies scope difference from Agents page (daily add/remove should stay in Agents)
- Navigation label updated from
ChannelstoRoutingto reduce conceptual overlap with Agent lifecycle management - Added
Routingpage agent filter (All Agents+ per-agent quick filter) for easier large-tree inspection - Added compact grouped rendering in
Routing: bindings are grouped by agent with expand/collapse support for denser large-config browsing
Settings UX
- Merged
ModelsandAuthpages into a singleModels & Authtab
Stats
- Added daily (
1 day) range option and set it as default
v0.7.1 更新日志(2026-02-27)
New Features
Dashboard Guidance Block (Telegram-first usage + safety)
- Added a concise guidance card under Dashboard explaining OCM's intended Telegram workflow
- Clarifies prerequisites: users should already have basic OpenClaw CLI experience
- Clarifies purpose: OCM mainly helps visualize and update
openclaw.jsonfor easier main-agent/sub-agent management and multi-tree structures - Added explicit Telegram security checklist:
- BotFather
Allow Groups = ON - BotFather
Group Privacy = OFF - Keep each group private (only you + agent/sub-agents), do not invite others
- BotFather
Improvements
Model Dropdown Source — only openclaw models list
- Model dropdown options are now sourced from real CLI output (
openclaw models list) instead of built-in/static lists or config-only additions - Applies to all relevant selectors: agent/sub-agent creation forms, agent inline model switcher, primary model selector, and fallback picker
- Added warning message when model list loading/parsing fails
Technical Notes
- Added model ID parser for CLI output and short-term cache for model list fetches
GET /api/modelsnow returns:knownModelsfrom CLImodelListErrorfor UI warning display
- Startup script banners updated to
v0.7.1(start.sh/start.bat)
v0.7.0 更新日志(2026-02-27)
New Features
Dashboard Redesign — Circular Gauge System Health
- CPU%, RAM%, DISK% displayed as SVG circular gauges with colour-coded arcs (green < 70%, amber < 90%, red ≥ 90%)
- System info card: hostname, OS, Node.js, CPU model, cores, uptime, load average (1/5/15 min)
- Agent overview: separate main agent count and sub-agent count (plus total)
- Auto-refresh toggle: when enabled, dashboard polls
/api/dashboardevery 10 seconds - Backend now measures CPU usage via
os.cpus()delta sampling (200ms interval) and returnsloadAvgfromos.loadavg()
Sub-Agent Creation Flow — Step-by-Step Guide Rewrite
- Expanded from 3 steps to 5 detailed steps covering the full BotFather → Telegram Group → OCM workflow
- Step 1: Create new Bot via
/newbotin BotFather - Step 2: Disable Group Privacy via
/mybots→ Bot Settings → Group Privacy → Turn off - Step 3: Create Telegram group, add Bot (with security warning)
- Step 4: Get Group ID from gateway logs
- Step 5: Fill in the form
- New "Your Telegram User ID" input field — auto-writes to
channels.telegram.allowFromwhitelist on creation - Security warning banner: "Do NOT add other people to this group" with explanation about API cost risks
Setup Page — English Localization
- All Chinese text in the initial directory selection page translated to English
- Includes: title, description, labels, placeholders, error messages, button text
Bug Fixes
Agent tree: sub-agents not grouped under main (old config format)
- Symptom: On machines with openclaw.json created before OCM v0.6 multi-bot support, all sub-agents displayed as independent cards instead of nested under main
- Root cause: Old-format bindings lack
accountIdfield in sub-agent entries. The tree builder relied onparentAccountIdto match sub-agents to roots, but old bindings only hadchannel+peer— noaccountId. SoparentAccountIdwas null and no parent match was found - Fix: Fallback inference — if a sub-agent has a peer binding but no
accountId, automatically inferparentAccountIdfrom main's binding (accountId) or fall back to'default'
Technical Notes
- CPU usage measurement: Two
os.cpus()snapshots 200ms apart, calculating idle-to-total ratio across all cores - Gauge rendering: Pure SVG arcs with
stroke-dasharrayanimation, no external libraries. 270° arc (gap at bottom), colour transitions viagaugeColor()function - allowFrom auto-config:
POST /api/agentsnow accepts optionaltelegramUserIdfield (numeric string), appends tochannels.telegram.allowFrom[]if not already present - Old-config compatibility: Sub-agent bindings without
accountIdare now auto-assigned to the main agent's bot, maintaining backward compatibility with configs created before multi-bot support
v0.6.6 更新日志(2026-02-27)
Bug Fixes
Agent tree: main agent not detected as root
- Symptom: Sub-agents displayed as independent agents instead of under their parent. All agents appeared as orphan roots.
- Root cause:
mainagent in OpenClaw is the default catch-all and typically has NO explicit binding inopenclaw.json. ThehasOwnBotdetection required an explicit binding withaccountId && !peer, somainwas classified as a non-root. Withoutmainbeing a root, sub-agents'parentAccountIdhad no matching root to link to. - Fix:
mainis now always treated as a root agent regardless of binding existencemain'saccountIdis inferred fromchannels.telegram.accounts: first unclaimed account (not explicitly bound to another agent), or first account as fallback- Sub-agents with
parentAccountIdmatchingmain's inferredaccountIdnow correctly appear undermainin the tree
v0.6.5 更新日志(2026-02-26)
New Features
Dashboard Tab (🏠 Dashboard)
- New default landing tab showing system overview at a glance
- System card: hostname, OS, Node.js version, CPU model/cores, uptime, memory usage with progress bar
- Gateway card: process status indicator (running/stopped/unknown) with coloured dot, port, PID, HTTP ping reachability
- Agents card: total agent count, last session activity timestamp (Brisbane time), OCM version, server time
- Storage card: OpenClaw dir size, disk usage with progress bar, free space
- New
GET /api/dashboardendpoint aggregates all info (ps grep + curl ping + fs stat) - Lazy-loaded on tab switch; auto-loaded on first page load
Cache-Control + Version-Based Cache Busting
- All HTTP responses now include
Cache-Control: no-store, no-cache, must-revalidate - HTML responses include
ETag: "ocm-<version>"for version-based cache validation - All responses include
X-OCM-Versionheader - Browser
api()function checksX-OCM-Versionagainst client version; shows toast notification when server has been updated, prompting user to refresh - Prevents stale frontend from calling deleted/changed API endpoints after update
Cleanup
Old /api/agents/main endpoint fully removed (confirmed via code search — no residual references)
Technical Notes
- Dashboard gateway detection:
ps aux | grep openclaw.*gatewayfor process status,curl --max-time 2 http://127.0.0.1:<port>for HTTP ping - Disk usage:
df -kfor filesystem stats,du -skfor OpenClaw dir size - Agent last activity: scans
~/.openclaw/agents/*/sessions/*.jsonlmtime - Version cache busting:
OCM_CLIENT_VERSIONis injected into browser script via template literal${APP_VERSION}, compared againstX-OCM-Versionresponse header on every API call
v0.6.0 更新日志(2026-02-26)
重大 Bug 修复
Add Agent 覆盖已有 Bot Token(数据破坏性 Bug)
- 症状:通过 Add Agent 表单添加新 agent 时,直接覆盖
channels.telegram.botToken,导致所有已有 agent(包括 sub-agent)全部失效 - 根本原因:
POST /api/agents/main端点无条件覆盖channels.telegram.botToken字段,没有保护已有配置 - 修复:
- 彻底删除
POST /api/agents/main端点 - 新建
POST /api/agents/bot端点,使用 OpenClaw 的channels.telegram.accounts多 bot 结构 - 每个新 agent 获得独立的
accountId和botToken,绝不覆盖已有 token - 自动迁移:首次添加新 bot 时,自动将旧格式(顶层
botToken)迁移到accounts.default
- 彻底删除
- 数据恢复:程序在修改前自动创建
openclaw.json.create.*备份,可通过cp恢复
浏览器 Popover API 命名冲突
- 症状:点击 "+ Add Agent" / "+ Add Sub-Agent" 按钮报错
NotSupportedError: Failed to execute 'togglePopover' on 'HTMLElement' - 根本原因:自定义函数
togglePopover()与浏览器原生 Popover API 的HTMLElement.togglePopover()方法冲突 - 修复:函数重命名为
showConfigPop()
架构变更
多 Bot 支持(Multi-Account)
- 支持 OpenClaw 的
channels.telegram.accounts结构,每个主 agent 可绑定独立的 Telegram bot - 配置格式:
{ "channels": { "telegram": { "accounts": { "default": { "botToken": "TOKEN_A" }, "research": { "botToken": "TOKEN_B" } }}} } GET /api/agents返回hasOwnBot字段,标识 agent 是否拥有独立 bot- Sub-Agent 表单新增 "Parent Agent" 下拉,选择共享哪个 bot(不再硬编码 "main")
去除 Landing Page,直接进入主程序
- 移除模式选择首页(Sub-agent / Multi-agent 二选一)
- 启动后直接进入 Agent 管理页面
- 移除 landing page 相关 HTML、CSS、JS、i18n keys
Agent 页面重设计(popover 配置窗口)
- 不再使用左右分屏布局
- "+ Add Agent" / "+ Add Sub-Agent" 按钮居中显示在 agent 树上方
- 点击按钮弹出浮动配置窗口(popover),包含引导步骤和表单
- Agent 树宽度限制 720px 居中,多个 agent 树纵向排列
功能改进
Stats 重写 — 从 session JSONL 文件解析真实用量
- 不再从
gateway.log解析(之前一直是 0 数据) - 改为扫描
~/.openclaw/agents/*/sessions/*.jsonl - 解析
type: "message"+role: "assistant"的message.usage字段 - 新增维度:By Agent(每个 agent 的用量)、Cache Read tokens
- 测试验证:成功解析出 990 条请求、6 个 agent、10 个模型的真实数据
Model 下拉 — 只显示已注册模型
- 不再使用硬编码的 KNOWN_MODELS 列表
- 改为从
openclaw.json的agents.defaults.models读取实际注册的模型
Agent 树事件委托
renderAgents()中的按钮不再使用onclick="func('escaped-string')"内联写法- 改用
data-action/data-id属性 + 事件委托(agentTreeAction),避免 template literal 转义问题
响应式布局
main容器改为max-width:100%,适配不同屏幕宽度- 新增
@media (max-width: 600px)断点:侧边导航折叠、按钮纵向排列
备份时间戳改为 Brisbane 时区
brisbaneTimestamp()函数,所有备份文件名使用Australia/Brisbane时区- 重要:系统所有时间显示统一按 Brisbane 处理
启动脚本全面重写
start.sh/start.bat全部英文- 端口冲突时自动 kill 旧进程,而非报错退出
- 支持
--host参数
README 重写
- 移除所有空的 screenshot 占位符(含敏感 ID 的截图已删除)
- 更新功能描述匹配 v0.6
- 精简结构,保留中英文双语
新功能 i18n 策略
- v0.6 新增的所有 UI 文案仅提供英文
- 中文翻译推迟到 v1.0 正式版
技术备忘
- Template literal 转义规则:MAIN_HTML_SCRIPT 是反引号模板字符串
\n→ 真实换行(浏览器 JS 字符串跨行 → SyntaxError),必须写\\n\'→'(无法用于 onclick 里的引号转义),改用 data 属性 + 事件委托\`` → ````(嵌套模板字符串在 evaluated output 中正常工作)
assertBrowserScriptSyntax()在启动时检查 MAIN_HTML_SCRIPT 的 evaluated 值- OpenClaw config 多 bot 格式:
channels.telegram.accounts.<id>.botToken,binding 用accountId路由
下一步(v0.7+)
- Dashboard 首页 tab(系统信息 + OpenClaw health 状态)— done in v0.6.5
- HTTP 响应加
Cache-Control: no-store+ version-based cache busting — done in v0.6.5 - 彻底删除旧
/api/agents/main端点残留(确认已清除)— confirmed in v0.6.5 - Agent tree: independent roots per bot + side-by-side layout — done in v0.6.5
- Agent tree: expand/collapse toggle for sub-agents — done in v0.6.5
- Add Agent: creates
agents/<id>/sessions/runtime dirs + SOUL.md personality — done in v0.6.5 - Agent tree: main agent always root with inferred accountId — done in v0.6.6
- Dashboard: auto-refresh every 30s when tab is active
- Dashboard: OpenClaw version display (from
openclaw --version) - Agent page: edit agent name, purpose, personality inline
- Agent page: restart gateway button with status feedback
- Settings tab: edit openclaw.json key fields via form (model, workspace defaults)
- Telegram bot connectivity test button (ping bot API from server)
- DEVLOG.md 中文 → 逐步迁移为英文
v0.5.2 更新日志(2026-02-25)
修复
远程访问无法连接(ERR_CONNECTION_REFUSED)
server.listen原来绑定127.0.0.1(仅本机),远程通过http://<IP>:3333访问时被直接拒绝- 改为默认绑定
0.0.0.0(所有网卡),远程设备可通过局域网 IP 访问 - 新增
--host命令行参数:需要限制仅本机访问时可用--host 127.0.0.1覆盖 - 新增
getLanIP()工具函数,自动检测第一个非内部 IPv4 地址
改进
启动日志改为英文
- 终端启动信息(目录、地址、提示、错误)全部改为英文
- 绑定
0.0.0.0时自动显示局域网地址,方便远程复制:🌐 LAN: http://192.168.x.x:3333 - 端口占用、启动失败等错误提示同步改为英文
v0.5.1 更新日志(2026-02-25)
修复
Action 菜单英文模式残留中文
- 修复 Action 菜单下多处弹窗在 EN 模式仍显示中文的问题(日志、回滚、目录切换、命令输出)
- 统一接入 i18n:标题、按钮、说明文案、加载态、空态、确认框、toast 文案
- 菜单项触发后的交互文案现在与语言切换保持一致
工程改进
1) 嵌入脚本转义/语法防护
- 新增启动时预检:对前端嵌入脚本执行
node --check语法校验 - 若语法异常(常见为
MAIN_HTML内\n转义写错),启动阶段直接报错并给出修复提示,避免浏览器白屏后才发现问题
2) 单文件结构化重构(保持零依赖)
- 将主页面模板从单一超长
MAIN_HTML拆分为三段常量:MAIN_HTML_CSSMAIN_HTML_BODYMAIN_HTML_SCRIPT
- 最终由
MAIN_HTML组合输出,保持“单文件 + 零依赖”不变,同时降低维护复杂度 - 修复拆分过程中的脚本模板转义问题:
MAIN_HTML_SCRIPT使用普通模板字符串(非String.raw),确保前端脚本内的反引号模板语法可被正确还原
其他
- 程序头部版本与启动日志版本更新为
v0.5.1 start.sh/start.bat启动横幅版本号同步更新为v0.5.1README补充 Git 安装/更新流程(git clone/git pull --ff-only),并精简中英文功能介绍README首屏改版:增加「1 分钟上手」命令区(安装/更新/运行同屏),并将开场介绍改为精简版README去重:移除中部重复的安装/更新/运行段落,统一引用首屏快速上手README截图区改为首屏精简展示(3 张)+ 折叠更多截图(<details>)
v0.5 更新日志(2026-02-24)
新功能
认证页简化为引导模式
- 移除了不稳定的 API Key 提交表单(通过 stdin 管道传 CLI 的方案不可靠)
- 改为引导页:点击 Provider 显示清晰的操作步骤 + 一键复制 CLI 命令
- 已配置的 Provider 在网格中显示 ✅ 标记
- 每个 Provider 指引末尾都提示运行
openclaw onboard注册可用模型 - 删除了
runWithStdin()函数和POST /api/auth/run端点
模型页精简
- 移除「添加模型」和「删除模型」功能(模型应由
openclaw onboard管理) - 只保留 Primary Model 选择器和 Fallback Chain 编辑
- 删除了
POST /api/models和DELETE /api/models/:id端点
API 费用追踪(Token Cost Monitor)— 📊 Stats 标签页
- 新增
GET /api/stats端点,解析logs/gateway.log中的 token 用量 - 支持 JSON 日志和文本格式日志(
input_tokens: N, output_tokens: N) - 按模型和按天汇总统计,显示 Token 用量和估计成本
- 可视化:四张汇总卡片 + CSS 柱状图(按日) + 模型明细卡片
- 支持自定义模型定价(存
manager-config.json的modelPricing字段) - 时间范围过滤:7 / 30 / 90 天
- 点击标签页时懒加载,不影响首屏性能
Cron 任务管理 — ⏰ Cron 标签页
- 新增
GET/POST/PUT/DELETE /api/cron四个端点,操作系统 crontab - 只展示包含
openclaw或ocm关键词的 cron 条目 - 支持:查看、添加、启用/禁用(注释/取消注释)、手动触发、删除
- 与 NAS 备份的 cron 条目联动(同样显示)
- 添加任务支持自定义 Cron 表达式 + 命令 + 标签
Workspace 文件浏览器(全文件 + 可编辑)
- 重写
GET /api/workspace/:id:动态扫描 workspace 目录下所有文件(不再硬编码 4 个文件名) - 每个文件显示大小和最后修改时间
- 默认只读视图(
<pre>代码块),点击「编辑」按钮切换为<textarea>编辑模式 - 编辑后可保存或取消,保存调用已有的
PUT /api/workspace/:id/:file - 大文件(> 512KB)只显示 stat 不加载内容,防止页面卡顿
CLI Tab 补全
- 在 CLI 终端输入框按 Tab 键触发前缀匹配自动补全
- 补全源:OpenClaw 子命令词表 + 预设命令列表 + 历史命令
- 单一匹配时直接补全;多个匹配时先补全公共前缀,同时弹出候选列表
- 候选列表最多 12 项,点击即选中;按 Escape 关闭
- 支持多词命令的最后一个词补全
国际化(i18n)补全
- 新增 30+ 个 i18n key(zh + en)覆盖 Stats、Cron、Workspace、Auth 引导等所有新功能
- 删除了不再使用的
models.add、models.registered、auth.select等 key
移除
POST /api/auth/run— API Key 提交端点(不可靠)POST /api/models— 添加模型端点DELETE /api/models/:id— 删除模型端点runWithStdin()— stdin 管道传值工具函数- 前端:API Key 输入表单、添加模型弹窗、注册模型列表、删除模型按钮
技术说明
- Stats 日志解析:同时支持 JSON 格式(
{"input_tokens":N, "output_tokens":N})和文本格式(input_tokens: N),按时间戳过滤,按模型名和日期聚合 - Cron 管理:通过
crontab -l读取和crontab -管道写入,不依赖任何外部库。启用/禁用通过添加/移除行首#注释实现 - Tab 补全实现:纯前端 JS,不需要 PTY。维护子命令词表 + 预设列表 + 历史记录三层候选源,使用最长公共前缀算法
- Workspace 文件扫描:使用
fsp.readdir()+fsp.stat()动态列出,512KB 以上文件只返回 stat 不读内容
v0.4 更新日志(2026-02-21)
新功能
安全状态指示器
- Header 区域新增健康 badge(🔴/🟡),定期运行
openclaw doctor自动检测问题 - 鼠标悬停展开 tooltip,显示全部 warning/error 详情
- 每 60 秒自动轮询,若后台问题消失,badge 自动隐藏
- 新增服务端
GET /api/health端点,解析 doctor 输出中的 error / warn / missing / fail 关键词
CLI 终端面板改进
- 预设下拉菜单移至 header 区域(Clear 按钮左侧),符合操作习惯,自然向上展开
- 默认命令扩充至 15 条:新增
gateway start/stop/logs、models auth list、agents sync、backup create/list、config validate、update - 修正
openclaw version→openclaw --version
备份模块完全重设计
- 旧的 3 步向导替换为单页表单:主机/端口、用户名、认证方式、路径、一键操作
- 认证方式:密码(直接填,不存储)或 SSH Key(可一键生成)可切换
- 老设备兼容复选框:勾选后自动附加 Legacy CBC 加密参数,解决老款 Synology 等 NAS cipher 协商失败问题(
aes128-cbc、diffie-hellman-group14-sha1等) - 备份内容选择:全量(整个
.openclaw,约 55MB)或仅重要数据(配置+API Key+记忆,不含日志/对话历史,约 10MB) - 备份产物改为 tarball(
openclaw-full-TIMESTAMP.tar.gz),通过 rsync 传输,比直接 rsync 目录更安全、可校验 - 新增端口字段(默认 22),支持自定义 SSH 端口
- 定时备份支持自定义时间(时间选择器),不再写死 3:00
国际化(i18n)补全
renderAgents全面接入 i18n:主 Agent / subagent 标签、已绑群、保存模型、查看文件、删除,切换语言立即生效renderChannels全面接入 i18n:无绑定提示、匹配所有、绑定索引、删除绑定buildModelOpts接入 i18n:「使用全局默认」→「Use Global Default」;「自定义」→「custom」
修复
- Agents / Channels 页面切英文后按钮仍显示中文(根本原因:
renderAgents/renderChannels模板字符串内使用硬编码中文) - 备份旧流程 UX 混乱(步骤2填用户名,步骤1填密码)
技术说明
- 老 NAS 密文兼容:
-o Ciphers=aes128-cbc,aes256-cbc,aes192-cbc,3des-cbc -o KexAlgorithms=diffie-hellman-group14-sha1,diffie-hellman-group1-sha1 -o HostKeyAlgorithms=+ssh-rsa,+ssh-dss - 重要数据定义:
openclaw.json+.env+credentials/+agents/*/agent/(含 API Key,排除 sessions)+memory/main.sqlite - 全量备份排除:
logs/(运行时重建)、ocm/*.bak.js(旧版本备份文件) - 服务端新增
GET /api/health端点,使用spawnSync同步运行openclaw doctor,3 秒超时,解析 error/warn 行返回结构化 JSON
v0.4.1 热修复(2026-02-21)
修复
SSH Key 生成界面崩溃(MAIN_HTML \n 转义错误)
- 症状:首页点击无响应,F12 报
Uncaught SyntaxError: Invalid or unexpected token at line 1785,随后enterApp is not defined - 根本原因:
nasGenKey()函数中box.textContent = '公钥...:\n' + r.pubKey的\n在 Node.js 评估 MAIN_HTML 模板字符串时被转为真实换行符,浏览器收到的 JS 里字符串字面量跨行 → SyntaxError → 整段脚本解析失败 - 修复:
'\n'→'\\n',源码里双反斜杠,Node 模板字符串评估后浏览器收到\n合法转义 - 规律:MAIN_HTML 模板字符串内所有 JS 字符串字面量里的
\n都必须写成\\n;每次新加代码后用node --check验证服务端,再提取 browser script 单独node --check验证浏览器端
v0.4.2 热修复(2026-02-22)
修复
NAS 备份失败:sshpass 位置错误(直接原因)
- 症状:SSH 连接测试通过,但"立即备份"返回
Permission denied, please try again+ rsyncunexpected end of file - 根本原因:旧代码把
sshpass -p "pwd"塞入 rsync 的-e参数内,双引号与外层引号互相冲突,导致 sshpass 无法正确读取密码# ❌ 旧:引号冲突,password 被 shell 当作单独的 token rsync -avz -e "sshpass -p "password" ssh -p 22 ..." ... # ✅ 新:sshpass 包裹整个 rsync 命令,-e 里只有干净的 ssh sshpass -p 'password' rsync -avz -e "ssh -p 22 ..." ... - 修复位置:
nas-now、nas-cron、nas-test三处均修正 - 附加:新增
mkdir -p REMOTE_PATH预建远端目录步骤(避免因目录不存在导致 rsync 失败);密码改用单引号包裹 +'\\''转义
NAS SSH 兼容模式完全重设计
- 旧问题:兼容模式只强制 CBC 加密(
aes128-cbc,3des-cbc等),而新款 NAS(Synology DSM 7.x 等)已默认禁用 CBC,导致勾选后反而无法连接 - 旧问题 2:
-o HostKeyAlgorithms=+ssh-rsa,+ssh-dss在新版 OpenSSH 上语法无效(+前缀不能用于逗号分隔的多值列表),报Bad key types - 新策略:兼容模式同时列出现代算法 + 旧算法,SSH 自动选双方都支持的最强项:
- Ciphers:
aes256-gcm, aes128-gcm, chacha20-poly1305, aes256-ctr, aes192-ctr, aes128-ctr(现代)+aes256-cbc, aes192-cbc, aes128-cbc, 3des-cbc(旧款) - KexAlgorithms:
curve25519-sha256, ecdh-sha2-nistp256, dh-group14-sha256(现代)+dh-group14-sha1, dh-group1-sha1(旧款) - HostKeyAlgorithms:
ssh-ed25519, ecdsa-sha2-nistp256, rsa-sha2-256, rsa-sha2-512, ssh-rsa(去掉+前缀)
- Ciphers:
- 结论:兼容模式现在对新旧服务器均有效;新服务器默认关闭即可(SSH 自动协商)
NAS 备份 Modal 全面 i18n
- 所有标签、按钮、提示文字接入
t()+data-i18n属性,切换语言立即生效 - 新增 21 个 i18n key(zh + en):
nas.title,nas.host,nas.user,nas.authLabel,nas.pwLabel,nas.pwHint,nas.keyLabel,nas.genKey,nas.pubkeyHint,nas.remotePath,nas.compat,nas.content,nas.full,nas.essential,nas.btnTest/Now/Cron/Close,nas.cronTime,nas.btnSaveCron,nas.testing/testOk/testFail,nas.backing/backupOk/backupFail,nas.keyGenOk/Fail,nas.cronOk/Toast,nas.backupToast,nas.errNoHost applyLang()新增data-i18n-placeholder属性支持,密码输入框提示也随语言切换- Checkbox 文字从「老设备兼容模式(Legacy CBC...)」改为「兼容模式(添加旧版 SSH 加密方案,适用于旧款 NAS / 旧服务器)」,更准确描述用途
技术说明
- sshpass 用法规范:密码认证时,
sshpass -p 'pwd' rsync -e "ssh ..."是正确形式;rsync -e "sshpass ... ssh ..."是错误形式(所有三处:test / now / cron 均已修正) - 密码安全转义:
password.replace(/'/g, "'\\''")处理密码中含单引号的情况 - PreferredAuthentications=password,PubkeyAuthentication=no:密码认证时明确禁用公钥,防止 SSH 在无 key 时尝试公钥认证导致不必要的交互提示
v0.5 规划(竞品分析后)
调研了 GitHub 上 7 个同类项目后,提炼出最值得借鉴、且与 OCM"零依赖+单文件"哲学兼容的三个方向。
优先级 1 — API 费用追踪(Token Cost Monitor)
来源:tugcantopaloglu/openclaw-dashboard、mudrii/openclaw-dashboard、adamevers/openclaw-dashboard 均有此功能,说明这是 power user 高频需求。
实现思路(零依赖):
- 解析
logs/gateway.log,提取各 session 的 token 用量行(OpenClaw 日志里已有 token 计数) - 在内存中汇总(按模型、按天)—— 无需 SQLite,用 JS 对象即可
- 新增「Stats」浮层或在 header 右侧加费用小数字,点击展开明细
- 可选:支持自定义各模型单价(存 manager-config.json)
预计新增代码量:约 100 行服务端(日志解析)+ 150 行前端(展示)
优先级 2 — Cron Job 管理页面
来源:actionagentai/openclaw-dashboard(12 页布局之一)、tugcantopaloglu/openclaw-dashboard 均有完整 cron 管理。
实现思路(零依赖):
- 在「操作」菜单或独立标签页列出系统 crontab(
crontab -l)里所有openclaw相关的条目 - 支持:查看 / 启用 / 禁用 / 手动触发(直接 spawn 命令)/ 修改时间
- 读写通过
crontab -l+crontab -管道实现,不依赖任何库 - 也可显示 OCM 自己设置的备份 cron,与 NAS 备份模块联动
预计新增代码量:约 80 行服务端(crontab CRUD)+ 120 行前端
优先级 3 — Memory 文件浏览器
来源:tugcantopaloglu/openclaw-dashboard 支持浏览和编辑 MEMORY.md / HEARTBEAT.md 等 Agent 记忆文件。
实现思路(零依赖):
- 在 Agents 卡片的「查看文件」按钮旁,或在文件浏览 modal 里增加编辑模式(
<textarea>) - 保存时直接写回文件(已有
writeFile工具函数) - 可选:显示文件大小和最后修改时间
预计新增代码量:约 20 行服务端(PUT /api/agent/:id/file)+ 60 行前端
竞品没有的 OCM 独特优势(保持并强化)
| OCM 特性 | 状态 |
|---|---|
| 真单文件 / 零 npm 依赖 | ✅ 保持 |
| 内置 CLI 终端(实时流、预设、收藏) | ✅ 独有 |
| NAS SFTP 备份(含老设备密文兼容) | ✅ 独有 |
| 中英文 i18n | ✅ 独有 |
| Windows + macOS 双平台一键启动 | ✅ 独有 |
| Health Badge(openclaw doctor 可视化) | ✅ 独有 |
一、项目概述
OpenClaw Manager 是一个零依赖本地 Web 管理界面,用于可视化管理 OpenClaw AI 助理的 Agent、模型、认证配置等,免去手动编辑 JSON 文件。
- 运行方式:
node openclaw-manager.js,浏览器访问http://localhost:3333 - 依赖:仅 Node.js >= 18 内置模块(
http、fs、path、os、child_process),零 npm 依赖 - 平台:macOS / Linux / Windows
零、v0.3 更新日志(2026-02-21)
新功能
Landing 页面 + 语言切换
- 首次进入显示模式选择页,两个入口:Sub-agent 模式(可用)和 Multi-agent 模式(占位,敬请期待)
- 语言切换(中文/English),存储在 localStorage,刷新记忆
- 每个模式卡片显示简介和所需条件
- 点击 Logo 可随时返回选择页
Channels 管理页面
- 新增「Channels」标签页,显示 openclaw.json 里所有 bindings
- 支持添加绑定(选 Agent、频道类型、Peer 类型、Peer ID)
- 支持删除绑定
- 创建/删除 Agent 后自动刷新 Channel 列表
主 Agent 模型选择
- main agent 卡片现在也显示模型选择器和「保存模型」按钮
- 可以为 main agent 独立设置模型,不再只能跟随全局默认
认证页面重做
- 修正了所有 Provider 的 CLI 命令(原命令
openclaw auth add是错误的) - 正确命令:
openclaw models auth paste-token --provider <provider> - 新增 Provider 选择网格,点击选中后显示操作区
- Token 类 Provider:可在界面直接输入 API Key,由后台通过 stdin 管道传给 CLI 执行(Key 不存储到配置文件)
- OAuth 类(Google):显示正确命令和复制按钮
- Device Flow 类(GitHub Copilot):显示分步操作指引
- 底部仍显示已配置认证列表
重启 GW 交互优化
- 横幅新增「稍后」按钮:点击后横幅消失,页面左下角出现常驻橙色「重启 Gateway」浮动按钮
- 执行重启后浮动按钮消失
- 「忽略」按钮:直接关闭横幅,不显示浮动按钮
NAS 备份设置
- 「操作」菜单新增「NAS 备份设置」入口
- 三步引导界面:SSH Key 生成 → NAS 连接配置 → 备份操作
- SSH Key:一键生成专用 Key,公钥可复制,支持一次性密码部署(密码不存储)
- 配置:NAS 主机 IP、用户名、SSH Key 路径、远端备份目录,保存到 manager-config.json
- 操作:测试连接、立即备份(rsync)、配置每日 3:00 Cron 任务
默认 SOUL.md 更新
- 新建 Subagent 时,留空性格关键词则使用新的默认成长型提示词,体现"你是我生活中的客人"理念
- 性格关键词有值时,仍使用关键词列表模式
修复
- AUTH_PROVIDERS 的所有
docCmd字段已修正为正确的openclaw models auth paste-token --provider X格式 - 新增
spawn到 require(用于 stdin 管道传入 API Key)
二、文件结构
~/ocm/ ← 项目目录(用户自选位置)
├── openclaw-manager.js ← 主程序(服务端 + 前端 HTML 全合一,~2360行)
├── start.sh ← macOS/Linux 启动脚本
├── start.bat ← Windows 启动脚本
├── openclaw-manager.command ← macOS Finder 双击启动
├── manager-config.json ← 本地路径配置(已 .gitignore,不上传)
├── package.json ← GitHub 项目元数据
├── .gitignore ← 排除 manager-config.json、*.bak* 等
├── README.md ← 中英双语说明文档
└── DEVLOG.md ← 本文件
OpenClaw 配置目录(独立,不在项目里):
~/.openclaw/
├── openclaw.json ← OpenClaw 主配置(程序读写的核心文件)
├── agents/ ← 各 Agent 的 config.json
├── workspaces/ ← Agent 工作区(SOUL.md、MEMORY.md 等)
├── logs/gateway.log ← 网关日志
└── openclaw.json.bak.* ← 自动备份文件
三、目录解析优先级
程序启动时按以下顺序确定 OpenClaw 配置目录:
--dir命令行参数OPENCLAW_DIR环境变量- 同目录下的
manager-config.json({ "dir": "~/.openclaw" }) - 默认值
~/.openclaw
~ 在所有平台会自动展开(os.homedir()),Windows 用户填 ~/.openclaw 即可。
四、已实现功能
🤖 Agents 标签页
- 列出所有 Agent(含 main)
- 每个 Agent 卡片显示:模型、群组绑定状态、Workspace 路径
- 内联模型切换:每个 Agent 有独立下拉菜单,直接保存不需要重建
- 4 步向导新建 Subagent:群组ID → 名称/描述 → 选模型 → 确认创建
- 自动创建 workspace 目录、SOUL.md、MEMORY.md
- 自动在 openclaw.json 添加 agent + binding(插入在 main 之前)
- 创建前自动备份 openclaw.json
- 删除 Agent(自动备份,可回滚)
- 查看 Workspace 文件(SOUL.md / MEMORY.md)
🧠 模型标签页
- 显示当前全局主模型,可下拉修改
- Fallback 链可视化编辑(增删 tag)
- 列出所有已配置模型,可添加自定义模型 ID
- 移除模型
🔑 认证标签页
支持的认证方式:
| Provider | 模式 |
|---|---|
| Anthropic | API Token |
| OpenAI | API Token |
| DeepSeek | API Token |
| Kimi (Moonshot) | API Token |
| Groq | API Token |
| Mistral | API Token |
| Together AI | API Token |
| Perplexity | API Token |
| OAuth | |
| GitHub Copilot | Device Flow |
| 自定义 | API Token |
⚡ 顶部工具栏(下拉菜单)
- 重启 Gateway(调用
openclaw gateway restart) - 实时日志(每 2 秒刷新,查看
logs/gateway.log) - 手动备份
- 备份回滚(列出最近 20 个备份,一键恢复,恢复前自动保存当前状态)
- 健康检查(
openclaw doctor) - 打开配置目录(调用系统文件管理器)
- 切换 OpenClaw 目录(运行时切换,写入 manager-config.json)
其他
- 配置修改后顶部显示橙色"建议重启 Gateway"横幅
- Toast 通知(成功/失败提示)
- 深色主题 UI(
#0f1117背景,#6c63ff强调色)
五、已修复的 Bug
Bug 1:浏览器 SyntaxError(启动即崩溃)
- 症状:页面打开后"加载中..."一直卡着,F12 控制台显示
Uncaught SyntaxError: Invalid or unexpected token - 根本原因:
MAIN_HTML是服务端的模板字符串(反引号),里面有一行:Node.js 在评估模板字符串时把document.getElementById('cmdOutput').textContent='❌ '+e.message+'\n\n请在终端手动运行:\nopenclaw gateway restart';\n变成了真实换行符,浏览器收到的 JS 里单引号字符串跨行,导致解析失败。 - 修复:将
'\n\n...\n...'改为'\\n\\n...\\n...',让浏览器收到正确的\n转义序列。 - 位置:
openclaw-manager.js约第 1473 行。
Bug 3:MAIN_HTML 模板字符串 \n 转义(反复出现)
- 症状:首页点击无响应,
Uncaught SyntaxError: Invalid or unexpected token+enterApp is not defined - 根本原因:在
const MAIN_HTML = \...`模板字符串内,JS 字符串字面量里的\n(如'msg\n'`)会被 Node.js 在求值模板字符串时转成真实换行符,导致浏览器 JS 解析失败 - 修复模式:MAIN_HTML 里所有字符串字面量中的
\n必须写成\\n - 已出现次数:v0.3(
cmdOutput错误文本)、v0.4 末尾(cliAppend命令行前后缀)、v0.4.1(nasGenKey公钥显示) - 预防:每次修改后运行
node --check+ 提取 browser script 再node --check;用扫描脚本检测 MAIN_HTML 内所有单反斜杠\n
Bug 2:Agent 模型下拉菜单只有"使用全局默认"
- 症状:Agents 页面每个 Agent 的模型选择器里只有一个选项
- 根本原因:
loadAgents()和loadModels()并行执行(Promise.all),renderAgents()先跑完时S.knownModels还是空数组,buildModelOpts()只能生成默认选项。buildModelDropdowns()函数本来用于在模型加载完后重填下拉菜单,但实现为空函数{}。 - 修复:补全
buildModelDropdowns()实现,遍历所有 Agent,用当时已填充的S.knownModels重建每个msel-{id}select 元素的选项。 - 位置:
openclaw-manager.js约第 1458 行。
六、重要技术细节
openclaw.json 结构要点
peer.id在 bindings 里必须是字符串("-1003893176648"),不是整数"main"是保留 agent ID,不能用作自定义 agent- 文件修改后 300ms 内自动热重载,大多数情况不需要重启 gateway
- 新 agent 的 binding 要插入在
main的 catch-all binding 之前
备份命名规则
openclaw.json.bak.{label}.{timestamp}
label 可以是:create / edit / delete / models / auth / manual / before-restore
跨平台注意
- 启动浏览器:
open(macOS)、start ""(Windows)、xdg-open(Linux) - 运行 openclaw 命令:Windows 用
openclaw.cmd,其他用openclaw manager-config.json路径支持~前缀,所有平台通用
KNOWN_MODELS 列表(代码内置)
GitHub Copilot、Anthropic、OpenAI、Google、DeepSeek、Kimi、Groq、Mistral、Together AI 共约 20 个模型。
七、待改进 / 已知问题
功能增强(用户提出过,暂未做)
- SOUL.md 可视化编辑器(当前只能查看,不能在界面里修改内容)
- 工作区文件内容在浏览器里直接编辑保存
- Agent 热切换模型(不重建,只改配置)
- 多 Bot 账号支持
- SSH 远程服务器管理
- 从零引导安装 OpenClaw 的向导
代码质量
- 前端代码目前全部内嵌在
MAIN_HTML模板字符串里,文件较长(~1650行),后续可考虑拆分或构建步骤 - 模型下拉菜单在
renderAgents之后才由buildModelDropdowns修复,可以改成串行加载(先loadModels再loadAgents)以更优雅地解决时序问题
部署体验
manager-config.json目前需要用户手动创建,可以考虑首次启动时通过 UI 向导引导创建(setup wizard 已有框架)- README 中加入截图
八、GitHub 上传准备清单
.gitignore已排除manager-config.json、*.bak*、.DS_Store等package.json的author字段为空(不含个人信息)README.md中英双语- 主程序无硬编码个人信息(API Key、路径、Token 等均运行时读取)
- 在
package.json的author填上你的名字/GitHub 用户名(可选) - GitHub 新建仓库,
git init → git add . → git commit → git push
九、启动方式快速参考
# 直接启动(自动读取 manager-config.json 或 ~/.openclaw)
bash ~/ocm/start.sh
# 指定目录
bash ~/ocm/start.sh --dir /path/to/.openclaw
# 指定端口(默认 3333)
bash ~/ocm/start.sh --port 8080
# macOS Finder 双击
openclaw-manager.command
# Windows
start.bat
访问 http://localhost:3333