openclaw-rollback 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +230 -0
- package/bin/cli.js +6 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +292 -0
- package/dist/cli.js.map +1 -0
- package/dist/config-graph.d.ts +104 -0
- package/dist/config-graph.d.ts.map +1 -0
- package/dist/config-graph.js +586 -0
- package/dist/config-graph.js.map +1 -0
- package/dist/core.d.ts +59 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +842 -0
- package/dist/core.js.map +1 -0
- package/dist/daemon.d.ts +2 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +222 -0
- package/dist/daemon.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/webui.d.ts +2 -0
- package/dist/webui.d.ts.map +1 -0
- package/dist/webui.js +229 -0
- package/dist/webui.js.map +1 -0
- package/openclaw.plugin.json +54 -0
- package/package.json +56 -0
- package/scripts/install.sh +35 -0
- package/skills/rollback/SKILL.md +65 -0
- package/webui/index.html +1457 -0
package/README.md
ADDED
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
# OpenClaw Rollback
|
|
2
|
+
|
|
3
|
+
> 智能配置回滚系统 —— 基于配置影响图谱与故障根因定位
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/openclaw-rollback)
|
|
6
|
+
|
|
7
|
+
## 核心定位
|
|
8
|
+
|
|
9
|
+
不同于传统的"定时备份+全量回滚",OpenClaw Rollback 是**首个将知识图谱与根因定位引入个人 AI 助手配置管理**的系统。
|
|
10
|
+
|
|
11
|
+
**三大核心能力:**
|
|
12
|
+
|
|
13
|
+
1. **🔍 故障根因定位** —— Gateway 挂了,精准定位是哪个配置项导致的,不再盲目全量回滚
|
|
14
|
+
2. **🕸️ 配置影响图谱** —— 可视化展示配置项之间的依赖关系,改了 A 会波及哪些 B/C/D 一目了然
|
|
15
|
+
3. **🛡️ 智能自动回滚** —— 基于健康状态的双向策略(健康时备份,异常时回滚),专为无人值守场景设计
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 安装
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install -g openclaw-rollback
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 快速开始
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# 查看帮助
|
|
29
|
+
ocr help
|
|
30
|
+
|
|
31
|
+
# 立即创建备份
|
|
32
|
+
ocr backup
|
|
33
|
+
|
|
34
|
+
# 查看配置影响图谱
|
|
35
|
+
ocr graph
|
|
36
|
+
|
|
37
|
+
# 分析某个配置项的影响范围
|
|
38
|
+
ocr impact gateway.port
|
|
39
|
+
|
|
40
|
+
# 故障根因定位
|
|
41
|
+
ocr root-cause port_unreachable "Connection refused"
|
|
42
|
+
|
|
43
|
+
# 查看配置变更历史
|
|
44
|
+
ocr changes
|
|
45
|
+
|
|
46
|
+
# 启动 Web UI
|
|
47
|
+
ocr webui
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## CLI 命令
|
|
53
|
+
|
|
54
|
+
| 命令 | 说明 |
|
|
55
|
+
|------|------|
|
|
56
|
+
| `ocr backup` | 立即创建备份 |
|
|
57
|
+
| `ocr restore <id>` | 回滚到指定备份 |
|
|
58
|
+
| `ocr list` | 列出所有备份 |
|
|
59
|
+
| `ocr delete <id>` | 删除指定备份 |
|
|
60
|
+
| `ocr graph` | 生成配置影响图谱 |
|
|
61
|
+
| `ocr impact <node>` | 分析配置变更影响 |
|
|
62
|
+
| `ocr root-cause <type> <detail>` | 故障根因定位 |
|
|
63
|
+
| `ocr changes` | 查看配置变更历史 |
|
|
64
|
+
| `ocr status` | 查看 Gateway 健康状态 |
|
|
65
|
+
| `ocr travel-mode [on\|off]` | 开启/关闭出行模式 |
|
|
66
|
+
| `ocr webui` | 启动 Web UI (端口 3739) |
|
|
67
|
+
| `ocr config` | 显示当前配置 |
|
|
68
|
+
| `ocr daemon` | 启动守护进程 |
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## 核心功能
|
|
73
|
+
|
|
74
|
+
### 1. 配置影响图谱
|
|
75
|
+
|
|
76
|
+
自动扫描 `~/.openclaw/` 下的所有配置文件,构建知识图谱:
|
|
77
|
+
|
|
78
|
+
- **节点**:每个配置项(如 `gateway.port`, `auth.token`)
|
|
79
|
+
- **边**:配置项之间的依赖/影响/冲突关系
|
|
80
|
+
- **可视化**:WebUI 力导向图展示,点击节点查看影响分析
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
ocr graph
|
|
84
|
+
# 输出:
|
|
85
|
+
# 📊 配置影响图谱 (23 节点, 15 关系)
|
|
86
|
+
# 🟦 节点:
|
|
87
|
+
# gateway.port [gateway] 端口号
|
|
88
|
+
# auth.token [auth] API认证令牌
|
|
89
|
+
# ...
|
|
90
|
+
# ➡️ 关系:
|
|
91
|
+
# gateway.port --[influences]--> network.listen (强度:1.0)
|
|
92
|
+
# auth.token --[depends_on]--> gateway.auth (强度:1.0)
|
|
93
|
+
# ...
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### 2. 变更影响分析
|
|
97
|
+
|
|
98
|
+
修改某个配置项前,先看看会影响什么:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
ocr impact gateway.port
|
|
102
|
+
# 输出:
|
|
103
|
+
# 🔍 变更影响分析: gateway.port
|
|
104
|
+
# 📊 风险评分: 85/100
|
|
105
|
+
# ⚠️ 警告: 修改端口号可能导致服务无法访问
|
|
106
|
+
# 📌 直接影响: network.listen, network.proxy
|
|
107
|
+
# 🔗 间接影响: gateway.workers
|
|
108
|
+
# 📁 可能受影响的文件: openclaw.json
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### 3. 故障根因定位
|
|
112
|
+
|
|
113
|
+
Gateway 挂了,精准定位根因:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
ocr root-cause port_unreachable "Connection refused"
|
|
117
|
+
# 输出:
|
|
118
|
+
# 🚨 故障根因定位报告
|
|
119
|
+
# 🎯 最可能根因: gateway.port
|
|
120
|
+
# 置信度: 87.5%
|
|
121
|
+
# 📋 证据链:
|
|
122
|
+
# 1. 故障模式识别: 端口不可达
|
|
123
|
+
# 2. 该配置在故障前180秒被修改,时间非常接近
|
|
124
|
+
# 3. 该配置项(gateway)与故障模式(端口配置或网络问题)高度相关
|
|
125
|
+
# 4. 该配置属于系统关键配置
|
|
126
|
+
# 💡 修复建议: 检查 gateway.port 的值是否正确...
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### 4. 配置变更追踪
|
|
130
|
+
|
|
131
|
+
自动记录每次配置变更的 diff:
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
ocr changes
|
|
135
|
+
# 输出:
|
|
136
|
+
# 📋 最近 10 条配置变更:
|
|
137
|
+
# 1. [2026-06-12 10:30:00] openclaw.json
|
|
138
|
+
# gateway.port: 3000 → 3001
|
|
139
|
+
# 2. [2026-06-12 09:15:00] openclaw.json
|
|
140
|
+
# auth.token: "abc123" → "xyz789"
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### 5. 出行模式 (Travel Mode)
|
|
144
|
+
|
|
145
|
+
专为**无人值守/出差/黑盒子**场景设计:
|
|
146
|
+
|
|
147
|
+
- **定时检测** Gateway 健康(10分钟/2小时/8小时可选)
|
|
148
|
+
- **健康** → 自动创建 "known-good" 备份
|
|
149
|
+
- **异常** → 自动回滚到最后 "known-good" 备份
|
|
150
|
+
- **双重确认机制**:回滚前等待3秒二次检测,避免误判
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
ocr travel-mode on
|
|
154
|
+
ocr travel-interval 120 # 每2小时检查一次
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## 技术架构
|
|
160
|
+
|
|
161
|
+
| 模块 | 文件 | 功能 |
|
|
162
|
+
|------|------|------|
|
|
163
|
+
| 配置图谱 | `src/config-graph.ts` | 知识图谱构建、影响分析、根因定位 |
|
|
164
|
+
| 核心引擎 | `src/core.ts` | 备份扫描、文件复制、回滚逻辑、配置读写 |
|
|
165
|
+
| 守护进程 | `src/daemon.ts` | node-cron 定时备份+出行模式检测 |
|
|
166
|
+
| Web 服务 | `src/webui.ts` | Express HTTP 服务器 + REST API |
|
|
167
|
+
| CLI 接口 | `src/cli.ts` / `bin/cli.js` | 命令行交互 |
|
|
168
|
+
| 前端 | `webui/index.html` | 单页面 Web UI(Tab 导航) |
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## Web UI
|
|
173
|
+
|
|
174
|
+
启动:`ocr webui` → 访问 http://localhost:3739
|
|
175
|
+
|
|
176
|
+
四个独立页面:
|
|
177
|
+
|
|
178
|
+
1. **📊 主控台** — 系统状态、备份列表、出行模式管理
|
|
179
|
+
2. **🕸️ 影响图谱** — 可视化配置关系图,点击节点查看影响分析
|
|
180
|
+
3. **🎯 根因定位** — 选择故障类型,一键分析根因
|
|
181
|
+
4. **📝 变更历史** — 所有配置变更的时间线
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## 故障-配置映射
|
|
186
|
+
|
|
187
|
+
系统内置 8 种故障模式的知识库:
|
|
188
|
+
|
|
189
|
+
| 故障模式 | 可能根因配置 | 检测方式 |
|
|
190
|
+
|----------|-------------|----------|
|
|
191
|
+
| 端口不可达 | `gateway.port`, `network.*` | TCP 连接检测 |
|
|
192
|
+
| 认证失败(401) | `auth.token`, `auth.*` | HTTP 401/403 检测 |
|
|
193
|
+
| 权限不足(403) | `auth.permissions` | HTTP 403 检测 |
|
|
194
|
+
| 进程崩溃 | `plugins.*`, `memory.*` | 进程存活检测 |
|
|
195
|
+
| 配置解析错误 | 任意配置文件 | JSON/YAML 语法检测 |
|
|
196
|
+
| 插件加载失败 | `plugins.*` | 模块加载检测 |
|
|
197
|
+
| Agent 连接失败 | `agents.*` | Agent 心跳检测 |
|
|
198
|
+
| Skill 执行错误 | `skills.*` | 工具调用检测 |
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## 配置
|
|
203
|
+
|
|
204
|
+
配置文件位置:`~/.openclaw/extensions/openclaw-rollback/config.json`
|
|
205
|
+
|
|
206
|
+
```json
|
|
207
|
+
{
|
|
208
|
+
"autoBackup": true,
|
|
209
|
+
"maxBackups": 10,
|
|
210
|
+
"webUIPort": 3739,
|
|
211
|
+
"backupItems": [],
|
|
212
|
+
"travelMode": false,
|
|
213
|
+
"travelModeInterval": 120,
|
|
214
|
+
"travelModeMaxBackups": 20
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
## 版本历史
|
|
221
|
+
|
|
222
|
+
| 版本 | 日期 | 说明 |
|
|
223
|
+
|------|------|------|
|
|
224
|
+
| 1.0.0 | 2026-06-12 | 初始版本:配置影响图谱 + 故障根因定位 + 智能回滚 + 变更追踪 |
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## License
|
|
229
|
+
|
|
230
|
+
MIT
|
package/bin/cli.js
ADDED
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createBackup, restoreBackup, listBackups, deleteBackup, getConfig, saveConfig, checkOpenClawHealth, checkGatewayHealthDeep, isDaemonRunning } from './core.js';
|
|
3
|
+
import { getFullGraph, getImpactReport, getRootCauseReport, readChangeHistory } from './config-graph.js';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
const command = process.argv[2];
|
|
6
|
+
const arg = process.argv[3];
|
|
7
|
+
function showHelp() {
|
|
8
|
+
console.log(`
|
|
9
|
+
OpenClaw Rollback
|
|
10
|
+
|
|
11
|
+
Usage:
|
|
12
|
+
ocr backup 立即创建备份
|
|
13
|
+
ocr restore <id> 回滚到指定备份
|
|
14
|
+
ocr list 列出所有备份
|
|
15
|
+
ocr delete <id> 删除指定备份
|
|
16
|
+
ocr webui 启动 Web UI
|
|
17
|
+
ocr config 显示当前配置
|
|
18
|
+
ocr travel-mode [on|off] 开启/关闭出行模式
|
|
19
|
+
ocr travel-interval <min> 设置出行模式检查间隔 (10|120|480)
|
|
20
|
+
ocr status 查看 Gateway 健康状态
|
|
21
|
+
ocr daemon 启动守护进程(后台运行)
|
|
22
|
+
ocr graph 生成配置影响图谱
|
|
23
|
+
ocr impact <node-id> 分析配置变更影响
|
|
24
|
+
ocr root-cause <type> <detail> 故障根因定位
|
|
25
|
+
ocr changes 查看配置变更历史
|
|
26
|
+
ocr help 显示帮助
|
|
27
|
+
|
|
28
|
+
Examples:
|
|
29
|
+
ocr backup
|
|
30
|
+
ocr restore backup-2024-01-15T08-30-00-000Z
|
|
31
|
+
ocr travel-mode on 开启出行模式
|
|
32
|
+
ocr travel-interval 120 每2小时检查一次
|
|
33
|
+
ocr status
|
|
34
|
+
`);
|
|
35
|
+
}
|
|
36
|
+
async function main() {
|
|
37
|
+
switch (command) {
|
|
38
|
+
case 'backup': {
|
|
39
|
+
const result = await createBackup();
|
|
40
|
+
if (!result.success) {
|
|
41
|
+
console.error(`❌ 备份失败: ${result.error}`);
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
case 'restore': {
|
|
47
|
+
if (!arg) {
|
|
48
|
+
console.error('❌ 请指定备份 ID');
|
|
49
|
+
console.log('Usage: ocr restore <backup-id>');
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
const result = await restoreBackup(arg);
|
|
53
|
+
if (!result.success) {
|
|
54
|
+
console.error(`❌ 回滚失败: ${result.error}`);
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
case 'list': {
|
|
60
|
+
const backups = listBackups();
|
|
61
|
+
if (backups.length === 0) {
|
|
62
|
+
console.log('📭 暂无备份');
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
console.log(`📦 共有 ${backups.length} 个备份:\n`);
|
|
66
|
+
backups.forEach((b, i) => {
|
|
67
|
+
console.log(` ${i + 1}. ${b.id}`);
|
|
68
|
+
console.log(` 时间: ${new Date(b.timestamp).toLocaleString()}`);
|
|
69
|
+
console.log(` 项目: ${b.items.length} 个文件`);
|
|
70
|
+
if (b.isTravelMode) {
|
|
71
|
+
console.log(` 类型: ✈️ 出行模式备份`);
|
|
72
|
+
console.log(` 健康: ${b.gatewayHealthy ? '✅ 正常' : '❌ 异常'}`);
|
|
73
|
+
}
|
|
74
|
+
console.log('');
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
case 'delete': {
|
|
80
|
+
if (!arg) {
|
|
81
|
+
console.error('❌ 请指定备份 ID');
|
|
82
|
+
console.log('Usage: ocr delete <backup-id>');
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
const result = await deleteBackup(arg);
|
|
86
|
+
if (!result.success) {
|
|
87
|
+
console.error(`❌ 删除失败: ${result.error}`);
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
console.log(`✅ 已删除备份: ${arg}`);
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
case 'webui': {
|
|
94
|
+
const { startWebUI } = await import('./webui.js');
|
|
95
|
+
startWebUI();
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
case 'config': {
|
|
99
|
+
const config = getConfig();
|
|
100
|
+
console.log('📋 当前配置:');
|
|
101
|
+
console.log(JSON.stringify(config, null, 2));
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
case 'travel-mode': {
|
|
105
|
+
const config = getConfig();
|
|
106
|
+
if (!arg) {
|
|
107
|
+
// 仅显示状态
|
|
108
|
+
console.log(`✈️ 出行模式: ${config.travelMode ? '✅ 已开启' : '⏹️ 已关闭'}`);
|
|
109
|
+
console.log(` 检查间隔: ${config.travelModeInterval} 分钟`);
|
|
110
|
+
console.log(` 最大备份: ${config.travelModeMaxBackups} 个`);
|
|
111
|
+
if (config.lastKnownGoodBackup) {
|
|
112
|
+
console.log(` 最后已知良好备份: ${config.lastKnownGoodBackup}`);
|
|
113
|
+
}
|
|
114
|
+
if (config.lastCheckTime) {
|
|
115
|
+
console.log(` 最后检查时间: ${new Date(config.lastCheckTime).toLocaleString()}`);
|
|
116
|
+
}
|
|
117
|
+
if (config.lastCheckResult) {
|
|
118
|
+
console.log(` 最后检查结果: ${config.lastCheckResult === 'healthy' ? '✅ 正常' : '❌ 异常'}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else if (arg === 'on' || arg === 'true' || arg === '1') {
|
|
122
|
+
config.travelMode = true;
|
|
123
|
+
saveConfig(config);
|
|
124
|
+
console.log('✅ 出行模式已开启');
|
|
125
|
+
console.log(` 检查间隔: ${config.travelModeInterval} 分钟`);
|
|
126
|
+
// 自动启动守护进程(如果未运行)
|
|
127
|
+
if (!isDaemonRunning()) {
|
|
128
|
+
console.log('🚀 守护进程未运行,正在自动启动...');
|
|
129
|
+
const { spawn } = await import('child_process');
|
|
130
|
+
const daemonPath = new URL('daemon.js', import.meta.url).pathname;
|
|
131
|
+
const daemon = spawn('node', [daemonPath], {
|
|
132
|
+
detached: true,
|
|
133
|
+
stdio: 'ignore'
|
|
134
|
+
});
|
|
135
|
+
daemon.unref();
|
|
136
|
+
console.log('✅ 守护进程已自动启动');
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
console.log('✅ 守护进程已在运行');
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
else if (arg === 'off' || arg === 'false' || arg === '0') {
|
|
143
|
+
config.travelMode = false;
|
|
144
|
+
saveConfig(config);
|
|
145
|
+
console.log('⏹️ 出行模式已关闭');
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
console.error('❌ 无效参数。用法: ocr travel-mode [on|off]');
|
|
149
|
+
process.exit(1);
|
|
150
|
+
}
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
case 'travel-interval': {
|
|
154
|
+
if (!arg) {
|
|
155
|
+
console.error('❌ 请指定间隔时间(分钟)');
|
|
156
|
+
console.log('Usage: ocr travel-interval <10|120|480>');
|
|
157
|
+
process.exit(1);
|
|
158
|
+
}
|
|
159
|
+
const interval = parseInt(arg, 10);
|
|
160
|
+
if (![10, 120, 480].includes(interval)) {
|
|
161
|
+
console.error('❌ 无效的间隔时间。可选: 10, 120, 480');
|
|
162
|
+
process.exit(1);
|
|
163
|
+
}
|
|
164
|
+
const config = getConfig();
|
|
165
|
+
config.travelModeInterval = interval;
|
|
166
|
+
saveConfig(config);
|
|
167
|
+
console.log(`✅ 出行模式检查间隔已设置为 ${interval} 分钟`);
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
case 'status': {
|
|
171
|
+
console.log('🔍 检查 Gateway 状态...');
|
|
172
|
+
const simple = checkOpenClawHealth();
|
|
173
|
+
const deep = checkGatewayHealthDeep();
|
|
174
|
+
console.log(`\n📊 状态报告:`);
|
|
175
|
+
console.log(` 进程状态: ${simple ? '✅ 运行中' : '❌ 未运行'}`);
|
|
176
|
+
console.log(` 健康状态: ${deep.healthy ? '✅ 正常' : '❌ 异常'}`);
|
|
177
|
+
if (deep.details) {
|
|
178
|
+
console.log(` 详细信息: ${deep.details}`);
|
|
179
|
+
}
|
|
180
|
+
const config = getConfig();
|
|
181
|
+
if (config.travelMode) {
|
|
182
|
+
console.log(`\n✈️ 出行模式:`);
|
|
183
|
+
console.log(` 状态: ${config.travelMode ? '✅ 已启用' : '⏹️ 已禁用'}`);
|
|
184
|
+
console.log(` 检查间隔: ${config.travelModeInterval} 分钟`);
|
|
185
|
+
if (config.lastCheckTime) {
|
|
186
|
+
console.log(` 最后检查: ${new Date(config.lastCheckTime).toLocaleString()}`);
|
|
187
|
+
}
|
|
188
|
+
if (config.consecutiveFailures) {
|
|
189
|
+
console.log(` 连续失败: ${config.consecutiveFailures} 次`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
case 'daemon': {
|
|
195
|
+
console.log('🚀 启动 OpenClaw Rollback 守护进程...');
|
|
196
|
+
const { spawn } = await import('child_process');
|
|
197
|
+
const daemon = spawn('node', [new URL('daemon.js', import.meta.url).pathname], {
|
|
198
|
+
detached: true,
|
|
199
|
+
stdio: 'ignore'
|
|
200
|
+
});
|
|
201
|
+
daemon.unref();
|
|
202
|
+
console.log('✅ 守护进程已在后台启动');
|
|
203
|
+
console.log(' 使用 "ocr status" 查看状态');
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
case 'graph': {
|
|
207
|
+
const openclawDir = path.join(process.env.HOME || process.env.USERPROFILE || '', '.openclaw');
|
|
208
|
+
const graph = getFullGraph(openclawDir);
|
|
209
|
+
console.log(`📊 配置影响图谱 (${graph.nodes.length} 节点, ${graph.edges.length} 关系)`);
|
|
210
|
+
console.log('\n🟦 节点:');
|
|
211
|
+
graph.nodes.forEach(n => {
|
|
212
|
+
console.log(` ${n.id} [${n.type}] ${n.description || ''}`);
|
|
213
|
+
});
|
|
214
|
+
console.log('\n➡️ 关系:');
|
|
215
|
+
graph.edges.forEach(e => {
|
|
216
|
+
console.log(` ${e.source} --[${e.type}]--> ${e.target} (强度:${e.strength})`);
|
|
217
|
+
});
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
case 'impact': {
|
|
221
|
+
if (!arg) {
|
|
222
|
+
console.error('❌ 请指定配置节点ID');
|
|
223
|
+
console.log('Usage: ocr impact <node-id> (如: ocr impact gateway.port)');
|
|
224
|
+
process.exit(1);
|
|
225
|
+
}
|
|
226
|
+
const openclawDir = path.join(process.env.HOME || process.env.USERPROFILE || '', '.openclaw');
|
|
227
|
+
const report = getImpactReport(openclawDir, arg);
|
|
228
|
+
console.log(`\n🔍 变更影响分析: ${report.changedNode}`);
|
|
229
|
+
console.log(`\n📊 风险评分: ${report.riskScore}/100`);
|
|
230
|
+
if (report.warnings.length > 0) {
|
|
231
|
+
console.log('\n⚠️ 警告:');
|
|
232
|
+
report.warnings.forEach(w => console.log(` ${w}`));
|
|
233
|
+
}
|
|
234
|
+
if (report.directImpacts.length > 0) {
|
|
235
|
+
console.log('\n📌 直接影响:');
|
|
236
|
+
report.directImpacts.forEach(i => console.log(` • ${i}`));
|
|
237
|
+
}
|
|
238
|
+
if (report.indirectImpacts.length > 0) {
|
|
239
|
+
console.log('\n🔗 间接影响:');
|
|
240
|
+
report.indirectImpacts.forEach(i => console.log(` • ${i}`));
|
|
241
|
+
}
|
|
242
|
+
if (report.affectedFiles.length > 0) {
|
|
243
|
+
console.log('\n📁 可能受影响的文件:');
|
|
244
|
+
report.affectedFiles.forEach(f => console.log(` • ${f}`));
|
|
245
|
+
}
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
case 'root-cause': {
|
|
249
|
+
const faultType = arg || 'unknown';
|
|
250
|
+
const faultDetail = process.argv[4] || 'Gateway unhealthy';
|
|
251
|
+
const openclawDir = path.join(process.env.HOME || process.env.USERPROFILE || '', '.openclaw');
|
|
252
|
+
const report = getRootCauseReport(faultType, faultDetail, openclawDir);
|
|
253
|
+
console.log(`\n🚨 故障根因定位报告`);
|
|
254
|
+
console.log(`故障类型: ${report.faultType}`);
|
|
255
|
+
console.log(`故障详情: ${report.faultDetail}`);
|
|
256
|
+
console.log(`\n🎯 最可能根因: ${report.rootCause ? report.rootCause.id : '无法定位'}`);
|
|
257
|
+
console.log(`置信度: ${(report.confidence * 100).toFixed(1)}%`);
|
|
258
|
+
if (report.evidence.length > 0) {
|
|
259
|
+
console.log('\n📋 证据链:');
|
|
260
|
+
report.evidence.forEach((e, i) => console.log(` ${i + 1}. ${e}`));
|
|
261
|
+
}
|
|
262
|
+
console.log(`\n💡 修复建议: ${report.recommendation}`);
|
|
263
|
+
break;
|
|
264
|
+
}
|
|
265
|
+
case 'changes': {
|
|
266
|
+
const changes = readChangeHistory(30);
|
|
267
|
+
if (changes.length === 0) {
|
|
268
|
+
console.log('📭 暂无配置变更记录');
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
console.log(`📋 最近 ${changes.length} 条配置变更:\n`);
|
|
272
|
+
changes.forEach((c, i) => {
|
|
273
|
+
console.log(` ${i + 1}. [${new Date(c.timestamp).toLocaleString()}] ${c.file}`);
|
|
274
|
+
console.log(` ${c.nodeId}: ${JSON.stringify(c.oldValue)} → ${JSON.stringify(c.newValue)}`);
|
|
275
|
+
console.log('');
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
break;
|
|
279
|
+
}
|
|
280
|
+
case 'help':
|
|
281
|
+
case '--help':
|
|
282
|
+
case '-h':
|
|
283
|
+
default:
|
|
284
|
+
showHelp();
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
main().catch(err => {
|
|
289
|
+
console.error('❌ 错误:', err);
|
|
290
|
+
process.exit(1);
|
|
291
|
+
});
|
|
292
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 配置影响图谱模块 (Config Impact Graph)
|
|
3
|
+
*
|
|
4
|
+
* 核心能力:
|
|
5
|
+
* 1. 构建配置项之间的依赖/影响关系图
|
|
6
|
+
* 2. 变更影响传播分析(改了A,会影响哪些B/C/D)
|
|
7
|
+
* 3. 故障根因定位(Gateway挂了,是哪个配置导致的)
|
|
8
|
+
* 4. 可视化数据输出(供WebUI渲染)
|
|
9
|
+
*/
|
|
10
|
+
/** 配置节点类型 */
|
|
11
|
+
export type ConfigNodeType = 'gateway' | 'auth' | 'agent' | 'skill' | 'plugin' | 'network' | 'storage' | 'other';
|
|
12
|
+
/** 关系类型 */
|
|
13
|
+
export type RelationType = 'depends_on' | 'influences' | 'conflicts_with' | 'requires' | 'references';
|
|
14
|
+
/** 配置图谱节点 */
|
|
15
|
+
export interface ConfigNode {
|
|
16
|
+
id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
type: ConfigNodeType;
|
|
19
|
+
file: string;
|
|
20
|
+
path: string;
|
|
21
|
+
currentValue?: any;
|
|
22
|
+
description?: string;
|
|
23
|
+
}
|
|
24
|
+
/** 配置图谱边(关系) */
|
|
25
|
+
export interface ConfigEdge {
|
|
26
|
+
source: string;
|
|
27
|
+
target: string;
|
|
28
|
+
type: RelationType;
|
|
29
|
+
strength: number;
|
|
30
|
+
description: string;
|
|
31
|
+
}
|
|
32
|
+
/** 变更影响分析结果 */
|
|
33
|
+
export interface ImpactAnalysis {
|
|
34
|
+
changedNode: string;
|
|
35
|
+
directImpacts: string[];
|
|
36
|
+
indirectImpacts: string[];
|
|
37
|
+
riskScore: number;
|
|
38
|
+
warnings: string[];
|
|
39
|
+
affectedFiles: string[];
|
|
40
|
+
}
|
|
41
|
+
/** 根因定位结果 */
|
|
42
|
+
export interface RootCauseResult {
|
|
43
|
+
faultType: string;
|
|
44
|
+
faultDetail: string;
|
|
45
|
+
rootCause: ConfigNode | null;
|
|
46
|
+
confidence: number;
|
|
47
|
+
relatedChanges: ConfigChange[];
|
|
48
|
+
evidence: string[];
|
|
49
|
+
recommendation: string;
|
|
50
|
+
}
|
|
51
|
+
/** 配置变更记录 */
|
|
52
|
+
export interface ConfigChange {
|
|
53
|
+
timestamp: string;
|
|
54
|
+
file: string;
|
|
55
|
+
nodeId: string;
|
|
56
|
+
oldValue: any;
|
|
57
|
+
newValue: any;
|
|
58
|
+
changeType: 'manual' | 'auto' | 'plugin_install' | 'unknown';
|
|
59
|
+
timeBeforeFault?: number;
|
|
60
|
+
}
|
|
61
|
+
/** 完整图谱 */
|
|
62
|
+
export interface ConfigGraph {
|
|
63
|
+
nodes: ConfigNode[];
|
|
64
|
+
edges: ConfigEdge[];
|
|
65
|
+
version: string;
|
|
66
|
+
generatedAt: string;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 解析配置文件,提取所有配置节点
|
|
70
|
+
*/
|
|
71
|
+
export declare function parseConfigFile(filePath: string): ConfigNode[];
|
|
72
|
+
/**
|
|
73
|
+
* 构建完整配置影响图谱
|
|
74
|
+
*/
|
|
75
|
+
export declare function buildConfigGraph(configDir: string): ConfigGraph;
|
|
76
|
+
/**
|
|
77
|
+
* 分析某个配置变更的影响范围
|
|
78
|
+
*/
|
|
79
|
+
export declare function analyzeImpact(graph: ConfigGraph, changedNodeId: string): ImpactAnalysis;
|
|
80
|
+
/**
|
|
81
|
+
* 故障根因定位主入口
|
|
82
|
+
*/
|
|
83
|
+
export declare function locateRootCause(faultType: string, faultDetail: string, recentChanges: ConfigChange[], graph: ConfigGraph): RootCauseResult;
|
|
84
|
+
/**
|
|
85
|
+
* 记录配置变更
|
|
86
|
+
*/
|
|
87
|
+
export declare function recordChange(change: ConfigChange): void;
|
|
88
|
+
/**
|
|
89
|
+
* 读取变更历史
|
|
90
|
+
*/
|
|
91
|
+
export declare function readChangeHistory(limit?: number): ConfigChange[];
|
|
92
|
+
/**
|
|
93
|
+
* 获取完整的根因分析报告(供WebUI使用)
|
|
94
|
+
*/
|
|
95
|
+
export declare function getRootCauseReport(faultType: string, faultDetail: string, configDir: string): RootCauseResult;
|
|
96
|
+
/**
|
|
97
|
+
* 获取影响分析(供WebUI使用)
|
|
98
|
+
*/
|
|
99
|
+
export declare function getImpactReport(configDir: string, changedNodeId: string): ImpactAnalysis;
|
|
100
|
+
/**
|
|
101
|
+
* 获取完整图谱(供WebUI可视化使用)
|
|
102
|
+
*/
|
|
103
|
+
export declare function getFullGraph(configDir: string): ConfigGraph;
|
|
104
|
+
//# sourceMappingURL=config-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-graph.d.ts","sourceRoot":"","sources":["../src/config-graph.ts"],"names":[],"mappings":"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"}
|