Files
PaddedCell/PROJECT_PLAN.md
zhi 849effd301 feat: add install script and update project docs
- Add install.mjs: unified installer with dependency check, build, install, config
- Update PROJECT_PLAN.md: add section 6 for installation script requirements
- Update AGENT_TASKS.md: add T-7001~T-7005 for installation tasks
- Support flags: --prefix, --build-only, --skip-check, --verbose
2026-03-05 09:48:40 +00:00

294 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# PaddedCell 插件项目计划v0.1
> 目标:提供“安全密码管理 + 安全执行 + 安全重启”的插件能力。PaddedCell **完全涵盖 CalmGate 的全部功能**,不再另行开发 CalmGate相关能力在本项目内实现不直接复用原项目或命名。
---
## 1. 功能范围(已确认)
### 1.1 密码管理Pass-like
- 使用**内置二进制可用的加密库**实现密码加/解密,不要求依赖 `pass` 或外部进程。
- 加密算法需支持配置默认AES-256-GCM
- 不使用主密钥派生;加/解密基于每个 agent 的公私钥。
- `pass` 仅作为功能类比:用于说明需要具备的“存取/轮换/删除”等能力。
- 密码存储路径:`{openclaw_dir}/.secrets/{agent_id}/'{key}:{user}'.gpg`
- 该二进制后续可能需要作为 OpenClaw 的 skill 提供。
### 1.2 pass_mgr 二进制
- 必须是**可执行二进制**,禁止脚本。
- 命令(调整):
- `pass_mgr get <key> [--username]`
- `pass_mgr generate <key> [--username <username>]`(替代 agent 侧 set
- `pass_mgr unset <key>`
- `pass_mgr rotate`
- `pass_mgr admin init <admin_password> [--key-path <path_to_generate_admin_private_key>]`
- `pass_mgr set <agent_id> <agent_workspace> <key> <passwd> <admin_passwd> [--username <username>]`(仅允许人类在 terminal 执行)
- 读取 `AGENT_WORKSPACE/AGENT_ID` 定位 workspace。
- admin 密钥存放路径:`~/.pass_mgr/.priv`
- **Agent 不允许执行 set**:若检测到 `AGENT``AGENT_WORKSPACE` 环境变量被设置,则 `pass_mgr set ...` 直接报错并中断。
- **未初始化禁止使用**:在 `admin init` 前,所有 `get/generate/set` 操作报错。
- `pass_mgr get <key> --username`:返回该密码文件名中的 `user`(可为空字符串)。
- **admin 密码泄露防护**:插件需检测所有 session 的 message/tool calling 中是否包含 admin 密码明文;一旦出现:
- pass_mgr 立即变为“未初始化”状态
- 记录“严重安全漏洞”日志
- 需要人类重新执行 `pass_mgr admin init`
### 1.3 pcexec 安全执行exec wrapper
- 作为工具实现TypeScript接口与 OpenClaw 原生 exec 完全一致。
- 执行前设置环境变量workspace/agent_id 等)。
- 解析命令中的 `pass_mgr get <key>` 调用(不限定 `$(...)` 格式):
- 预执行获得明文
- 执行后将 stdout/stderr 中所有与明文相同的片段替换为 `######`
- 支持多次/多密码替换。
- get 失败 → 直接中断。
### 1.4 安全重启CalmGate-like已并入 PaddedCell
- PaddedCell **完整承接 CalmGate 的所有功能**,不再单独开发 CalmGate。
- 提供 slash command 以启用/禁用重启功能与密码管理功能:
- `/padded-cell-ctrl status`:展示两项功能状态
- `/padded-cell-ctrl enable pass-mgr|safe-restart`
- `/padded-cell-ctrl disable pass-mgr|safe-restart`
- 权限仅授权用户可执行agent 不可自主调用)。
- 冷却:每个功能开关后**锁定 10 秒**10 秒内再次尝试改变状态需返回提示“最近刚被修改过”。
#### 1.4.1 Agent 全局状态管理
- 状态集合:`idle | busy | focus | freeze | pre-freeze | pre-freeze-focus`
- 规则:
- **idle → busy**:任意非心跳 session 收到消息并开始回复
- **busy**:在其他 session 继续回复,状态不变
- **busy → idle**:所有非心跳 session 都不在回复
- **focus**:工作流占位状态;工作流外消息统一回复“在忙,无法应答”
- **freeze**:不接受新消息
- **pre-freeze / pre-freeze-focus**:不接受新消息;处理完最后一条后进入 freeze
- **pre-freeze-focus 完成后**:触发提示“整理工作进度准备重启后继续”,并向之前工作的 session 发“准备重启,重启后继续”(文案待定)
#### 1.4.2 query-restart 信号逻辑
- 收到 `query-restart`
- idle → freeze
- busy → pre-freeze
- focus → pre-freeze-focus
-**全部 agent freeze** → 返回 `OK`,否则 `NOT_READY`
#### 1.4.3 safe-restart 工具
- 每 5s 发 `query-restart` 直到收到 `OK`
- 收到 `OK` 后:
- **返回调用方**
- 启动独立新进程执行 `restart` 脚本(`sleep 60s``openclaw gateway restart``openclaw gateway status`
- 若 5s 内未恢复:将 status append 到 log并执行 rollback
- 重启成功后:
- 解冻所有 freeze agent
- 对之前 busy/focus 的 agent回到之前的工作 session 发“restart 结束了,我们继续”
- 并发控制:
- 同一时刻只允许一个 agent 执行 restart
- 其他 agent 调用直接返回 `ALREADY_SCHEDULED`,不再轮询
- 新参数:
- `rollback`(脚本路径)
- `log`(日志路径)
- 重启失败:
- 执行 rollback
- 用 default agent 在调用方 session 回复“restart 失败,已经 rollback请参考 log 调查。”
- 备注restart 必须是所有计划操作的最后一步;重启后的操作需在调用前写好 md
#### 1.4.4 架构草图(初版)
```
+----------------------+ +-----------------------+
| OpenClaw Hooks | | Safe-Restart Tool |
| (message lifecycle) | | (poll query-restart) |
+----------+-----------+ +-----------+-----------+
| |
v v
+----------------------+ +-----------------------+
| Status Manager |<------>| Local API / WS |
| - state machine | | /query-restart |
| - session tracker | +-----------+-----------+
| - persistence | |
+----------+-----------+ v
| openclaw gateway
v
+----------------------+
| Storage (file+mem) |
+----------------------+
```
#### 1.4.5 数据模型(草案)
**AgentState**
```json
{
"agentId": "string",
"state": "idle|busy|focus|freeze|pre-freeze|pre-freeze-focus",
"workflow": "string|null",
"activeSessions": ["sessionKey"],
"lastSessions": ["sessionKey"],
"updatedAt": 0
}
```
**Global**
```json
{
"restartScheduledBy": "agentId|null",
"restartSession": "sessionKey|null",
"restartStatus": "idle|waiting|restarting|rollback",
"updatedAt": 0
}
```
#### 1.4.6 事件流(草案)
- **消息生命周期 hook**
- onMessageStart(session, agentId)
- 若 session 非心跳idle → busy
- 记录 activeSessions
- onMessageEnd(session, agentId)
- 移除 activeSessions
- 若 activeSessions 为空busy → idle
- 若处于 pre-freeze/pre-freeze-focus且无 activeSessions → freeze
- **focus/workflow**
- workflow 打开state → focus
- workflow 关闭:若无 activeSessions → idle否则 busy
- focus 下非工作流消息:直接回复“在忙,无法应答”
- **query-restart**
- 根据状态映射更新
- 若全部 freeze → OK否则 NOT_READY
- 对调用 restart 的 agent 的调用 session不冻结
#### 1.4.7 API 设计(草案)
**POST /query-restart**
Request:
```json
{
"requesterAgentId": "string",
"requesterSessionKey": "string"
}
```
Response: `OK` / `NOT_READY` / `ALREADY_SCHEDULED`
**POST /restart-result**
Request:
```json
{
"status": "ok|failed",
"log": "/path/to/log"
}
```
---
## 2. 非功能需求
- 行为与原生 exec 一致(参数、错误码、输出等)。
- 输出脱敏仅针对 stdout/stderr。
- 重点目标:避免密码明文出现在 **agent 的聊天/工具调用记录** 中;日志与落盘不做强约束(允许必要场景)。
- 需要额外文档skill 等)指导 agent 正确使用密码相关工具。
---
## 3. 里程碑与任务拆解
### M1需求固化 & 设计确认0.5d
- pass 存储路径模板确认
- pass_mgr 二进制的接口与约束策略确认
- pcexec 解析/替换策略确认
**验收**:设计说明与配置清单
---
### M2pass_mgr 二进制1.5d
- 实现 `get/generate/unset/rotate/admin init/set(admin-only)`
- 读取 ENV 中 workspace/agent_id
- 使用内置加密库完成加/解密、存取、轮换
- 实现“禁止 agent 执行 set”的环境变量检测
- 实现 admin 密码泄露触发“未初始化 + 严重漏洞日志”
**验收**CLI 可独立操作密码库,异常均可中断
---
### M3pcexec 工具2d
- TS 实现,完整兼容 exec 参数
- 解析 `pass_mgr get <key>`(不限定 `$(...)` 格式)
- 多密码脱敏替换
- 错误处理一致
**验收**:复杂命令场景下无明文泄漏
---
### M4安全重启模块2d
- 状态机 + query-restart
- safe-restart 轮询 + rollback
- 恢复通知
**验收**:符合上文安全重启机制的关键流程
---
### M5集成测试1d
- 多 agent 并发
- 多次 pass_mgr get
- exec 参数兼容
- restart 并发与失败回滚
**验收**:测试记录 + 问题清单
---
## 4. 关键待确认
1) pass_mgr rotate 的具体语义(对单个 key 还是全部?)
2) 密码存储路径模板最终格式
3) admin 密码泄露检测范围(仅 message/tool calling是否包含文件/日志扫描)
---
## 5. 输出物
- 技术设计稿(含流程图)
- 任务分配清单
- 测试用例列表
## 6. 安装脚本
### 6.1 需求
提供统一的插件安装脚本 `install.mjs`,实现以下功能:
**检测与依赖**
- 检测系统平台 (Linux/macOS)
- 检测必要依赖 (Node.js, Go, openclaw CLI)
- 检测 openclaw 配置目录
**构建**
- 自动构建 pass_mgr Go 二进制
- 自动构建 pcexec TypeScript 模块
- 自动构建 safe-restart TypeScript 模块
**安装**
- 安装 pass_mgr 到系统 PATH (或 openclaw bin 目录)
- 安装 TypeScript 模块到 openclaw skills 目录
- 创建必要的配置文件和目录
**配置**
- 初始化 pass_mgr admin (引导用户设置 admin 密码)
- 配置环境变量
- 注册 safe-restart API 服务
**验证**
- 验证所有组件安装成功
- 输出安装摘要和下一步操作提示
### 6.2 使用方式
```bash
# 默认安装
node install.mjs
# 指定安装路径
node install.mjs --prefix /usr/local
# 仅构建不安装
node install.mjs --build-only
# 跳过依赖检测
node install.mjs --skip-check
```
---
> 更新日志v0.1(基于当前需求整理)