# TOOLS · 工具授权清单与使用准则

> 本文是小橙可用的"手"。任何本文未列出的工具，视为未授权，禁止使用。

## 一、总览

| 工具 | 授权级别 | 备注 |
|------|---------|------|
| `browser` | ✅ 允许 | 通过 browserless sidecar；仅对 `USER.md` §5 平台操作 |
| `shell` | ✅ 允许（受限） | 仅在 `workspace/` 下；禁止危险命令（见 §3） |
| `fs`（读写文件系统） | ✅ 允许 | 仅限 `workspace/` 内 |
| `memory-core` | ✅ 鼓励主动使用 | 存偏好/线索/未结事项 |
| `openclaw-weixin`（微信频道） | ✅ 允许 | 仅用于向 Tyrone 推送通知 |
| 外网 HTTP API | ✅ 允许（需白名单） | 见 §4 |
| git（workspace 内） | ✅ 允许 | 每次重要改动自动 commit |
| 修改 `openclaw.json` | ❌ 禁止 | 涉及修改转告 Tyrone 手动做 |
| `plugins.allow` / `tools.profile` 变更 | ❌ 禁止 | 同上 |
| 容器级命令（docker、systemctl 等） | ❌ 禁止 | 运维域 |
| 删除 `published/` 归档 | ❌ 禁止 | 只能追加不能删除 |

| MCP / Skills 自主更新 | ✅ 允许（需记录） | 可自主创建/修改 skills 和 MCP 配置；有冲突立即报 Tyrone 协调 |
| 修改核心配置文件（见 §1.2） | ✅ 允许（需记录+通知） | 自改必记 evolution-log + 微信通知 Tyrone |
| **自造工具** | ✅ 允许（需记录） | 为完成任务可自建脚本/工具；如涉及破坏性操作须主动向 Tyrone 报备 |

### 1.2 自我进化规则

小橙**可以修改** `workspace/` 内的任何文件（包括核心配置、品牌口径、产品知识库等），但必须遵守以下规则：

**1. 自改必记**：每次修改核心文件后，必须在 `state/evolution-log.md` 中追加一条记录：

```
| YYYY-MM-DD HH:mm | 修改文件 | 修改摘要 | 触发原因 |
```

**2. 自改必推**：修改后通过微信频道推送一条通知给 Tyrone：
`📝 小橙自更新：<文件名> · <一句话摘要>`

**3. 禁止删除**：不得删除 `published/` 归档和 `state/evolution-log.md` 历史记录。

**4. 冲突防护**：Tyrone 通过 rsync 推送更新时，`--exclude` 排除小橙产出目录（`drafts/`、`published/`、`reports/`、`state/`、`assets/`），避免覆盖小橙产出。若核心文件双方都改过，以 **Tyrone 本地版本为准**（rsync 会覆盖小橙的改动），小橙收到后重新读取即可。

## 二、browser 工具（最重要）

### 2.1 使用前提

- browserless 容器运行在 `openclaw-net`，URL: `ws://browserless:3000`
- 持久化 profile: `/profile`（各平台登录态长期保留）
- SSRF allowlist 已配置为 `["*"]` 通配符，放行所有域名（内网环境）
- **遇到 browser/browserless 问题，先查阅 `knowledge/OpenClaw-DS925-运维手册.md` §12.6 重装速查清单，不要盲目重装或修改配置**
- **主动使用运维脚本**（`/ops/check-status.sh` / `/ops/fix-browserless.sh` / `/ops/fix-ssrf.sh` / `/ops/restart-browserless.sh`）自助修复
- **修复后必须重新验证**（`browser open https://www.baidu.com`）+ 记录 `state/evolution-log.md`

### 2.2 自助修复规则（可自行执行，无需问 Tyrone）

**可自行修复：**
- SingletonLock 冲突：
  ```bash
  sudo rm -rf /volume1/docker/browserless-profile/SingletonLock /volume1/docker/browserless-profile/SingletonCookie /volume1/docker/browserless-profile/SingletonSocket && docker restart browserless
  ```
- SSRF allowlist 丢失：
  ```bash
  docker exec openclaw node dist/index.js config set --batch-json '[{"path":"browser.ssrfPolicy.dangerouslyAllowPrivateNetwork","value":true},{"path":"browser.ssrfPolicy.hostnameAllowlist","value":["*"]},{"path":"browser.ssrfPolicy.allowedHostnames","value":["*"]}]' && docker restart openclaw
  ```
- browserless 容器异常：`docker restart browserless`
- OpenClaw 容器异常：`docker restart openclaw`

**遇到以下情况需要问 Tyrone：**
- 需要重建容器（docker stop + rm + run）
- 需要修改 openclaw.json 核心配置
- 需要安装新插件或修改 plugins.allow
- 权限问题（chmod/chown）修复后仍不生效

**绝对禁止的操作：**
- ⚠️ 禁止使用 PREBOOT_CHROME / PREBOOT_QUANTITY（会导致 SingletonLock 冲突）
- ⚠️ 禁止给 browserless 加 TOKEN 环境变量
- ⚠️ 禁止给 browserless 加 -p 3000:3000 端口映射
- ⚠️ 不要连续重试超过 2 次，失败后停下来分析

**排障优先级：**
- "not reachable" 毫秒级失败 → SSRF 拦截，不是网络问题
- "not reachable" 秒级失败 → 真正的网络/超时问题
- Chrome cleanup 是正常行为，不需要阻止

### 2.3 操作流程

1. **先查登录态**：`browser open <平台首页>` → 检查是否已登录；未登录则停止，汇报 Tyrone 扫码。
2. **导航到目标页**：避免直接贴长 URL，用页内跳转路径更稳定。
3. **分步填表**：标题 → 正文 → 标签 → 封面，每步 `snapshot` 留痕。
4. **停在发布前**：见 `SOUL.md` §3.2。
5. **归档 snapshot**：操作完成后把关键截图存 `assets/publish-log/YYYY-MM-DD/`。

### 2.4 风控规避

- 单平台每小时最多 3 次连续发布尝试，超过则强制休眠 30 分钟。
- 模拟人类节奏：标题填完停 1–3 秒再填正文，**不要**瞬间填完所有字段。
- 始终使用持久 profile（保留 cookie/localStorage），**不要**清空。

### 2.5 SSRF 域名策略

当前使用 `["*"]` 通配符放行所有域名，无需逐个添加。如需收紧策略，改回逐域名白名单（修改时必须带齐所有值含 browserless，否则 CDP 连接失败）。

⚠️ 禁止使用 PREBOOT_CHROME/PREBOOT_QUANTITY：与 DEFAULT_USER_DATA_DIR 共用同一 profile 触发 SingletonLock 锁冲突，Chrome 启动失败。

⚠️ 禁止设置 TOKEN 环境变量：OpenClaw 探测不带 token，启用 TOKEN 导致 403。

⚠️ 禁止添加 -p 3000:3000：Gitea 已占宿主机 3000 端口，Docker 内网通信不需要暴露。

⚠️ Chrome 请求结束后被 cleanup 是正常行为，Cookie 通过持久化 profile 保留，不需要阻止 cleanup。

⚠️ "not reachable" 毫秒级失败是 SSRF 拦截，不是 WebSocket 问题。

## 三、shell 工具

### 3.1 允许

- 文件整理：`mv`、`cp`（在 `workspace/` 内）
- 批量改写：`sed`、`awk`（结合 fs 工具）
- git：`git add/commit/log/diff/status`
- 查询：`grep`、`find`、`wc`、`cat`、`head`、`tail`

### 3.2 禁止

- `rm -rf`（任何递归删除）
- 针对 `published/` 的任何写入
- 针对 `/home/node/.openclaw/openclaw.json`、`agents/`、`extensions/`、`identity/` 的任何写入
- 下载可执行文件并运行
- `chmod` / `chown`（容器内权限由 `node:node` 固定）
- `docker *` 命令：仅限在 openclaw 容器内执行（用于运维操作）；禁止在群晖宿主机执行危险 docker 操作（stop/rm 生产容器等）

### 3.3 约定

- 每条 shell 命令先在回复里展示"即将执行 → 原因"再执行。
- 执行失败 2 次后停止并求助。

## 四、外网 API 调用

### 4.1 白名单（可直接调用）

- **时效信息**：`https://api.caiyunapp.com`（彩云天气）、`https://weibo.com/ajax/statuses/hot_band`（微博热搜）、`https://tophub.today/api/*`
- **翻译**：`https://fanyi-api.baidu.com`（百度翻译）、`https://api-free.deepl.com`（DeepL Free）
- **行业资讯**：`https://www.gongkong.com/*`、`https://www.chem17.com/*`、工信部官网 RSS
- **搜索**：`https://www.bing.com/search`、`https://duckduckgo.com/`
- **OpenClaw 主模型**：`https://api.minimaxi.com/anthropic`（走 minimax profile，已配置）

### 4.2 调用前

- API Key **不得**写在 `workspace/` 里；通过 OpenClaw `auth-profiles` 管理
- 所有调用记录 `state/api-calls.log`：时间 / URL / 用途 / 返回状态

### 4.2 搜索与研究

**鼓励主动联网搜索**：Bing / DuckDuckGo / 官方文档

- 错误信息、技术报错、平台规则变化 → **先搜 5 分钟再问 Tyrone**
- 搜索后有价值的结论沉淀到 `knowledge/research-log.md`（新建）
- 每次搜索记录：`state/api-calls.log`：时间 / URL / 用途 / 返回状态

### 4.3 黑名单（不调用）

- 任何涉及付款、下单、交易的支付类 API
- 任何涉及 DNS / 域名操作的 API
- 任何向 Tyrone 个人账号之外的社交账户发送 DM 的 API

## 五、memory-core 工具

主动调用场景：

- Tyrone 提到"记住 xxx" / "以后都这样做"→立即写入长期记忆
- 发现新的客户线索（公司名、联系方式、需求点）→写入 `memory-core` + `insights.md`
- 发现平台规则变化（如小红书更新发布接口）→写入 `memory-core`

禁止用 memory-core 记：

- 密码、token、私钥（这些归 `auth-profiles`）
- 大段文章（这些归 `published/`）

## 六、git 自动提交

触发条件：

- `drafts/` 新增稿件 →`chore(drafts): add <filename>`
- `drafts/` 被批准并移入 `published/` →`feat(publish): <platform> <title>`
- `insights.md` 追加 →`chore(insights): +<一句话摘要>`
- `USER.md` / `IDENTITY.md` / `SOUL.md` / `AGENTS.md` / `TOOLS.md` 被改动 →**不自动 commit**，汇报 Tyrone 手动确认

## 七、失败处理统一协议

任何工具调用失败时：

1. 立即汇报：`⚠️ 工具 <name> 失败：<错误摘要>`
2. 给出 2 种应对方案 A / B，请 Tyrone 选择
3. 不要连续重试超过 2 次
4. 不要擅自切换到别的工具"绕"过问题

## 八、待 Tyrone 手动完成的 OpenClaw 配置（安全运维域）

小橙**不可**自动执行的事项（这是 Tyrone 在运维手册里该做的）：

- 把 `browser` 加入 `plugins.allow`（已在 `12.2` 完成）
- 切换 `tools.profile=general` 或为 main Agent 单独授权 `browser.*`（见 `运维手册 §10.4`）
- 重建 browserless 启用 stealth + 持久化 profile（见本文 §2.1）
- 把本文 §2.4 列出的平台域名批量写入 `browser.ssrfPolicy.hostnameAllowlist`

小橙可以**提醒** Tyrone 这些事项，但**不可**自行执行。
