# Openclaw Config

> 管理 OpenClaw 机器人配置 - 通道、代理、安全性和自动驾驶仪设置

- Skill: `lza6/openclaw-config` (Agent Skill)
- Install (CLI): `npx skillmds@latest add lza6/openclaw-config`
- Raw SKILL.md: https://api.skillmd.com/api/skills/lza6/openclaw-config/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: lza6 (https://skillmd.com/u/lza6)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/lza6/openclaw-config

---


# OpenClaw 操作手册

诊断并解决实际问题。这里的每个命令都经过测试并且有效。

---

## 快速健康检查

当出现任何问题时，请先运行此命令。复制粘贴整个块：

```bash
echo "=== GATEWAY ===" && \
ps aux | grep -c "[o]penclaw" && \
echo "=== CONFIG JSON ===" && \
python3 -m json.tool ~/.openclaw/openclaw.json > /dev/null 2>&1 && echo "JSON: OK" || echo "JSON: BROKEN" && \
echo "=== CHANNELS ===" && \
cat ~/.openclaw/openclaw.json | jq -r '.channels | to_entries[] | "\(.key): policy=\(.value.dmPolicy // "n/a") enabled=\(.value.enabled // "implicit")"' && \
echo "=== PLUGINS ===" && \
cat ~/.openclaw/openclaw.json | jq -r '.plugins.entries | to_entries[] | "\(.key): \(.value.enabled)"' && \
echo "=== CREDS ===" && \
ls ~/.openclaw/credentials/whatsapp/default/ 2>/dev/null | wc -l | xargs -I{} echo "WhatsApp keys: {} files" && \
for d in ~/.openclaw/credentials/telegram/*/; do bot=$(basename "$d"); [ -f "$d/token.txt" ] && echo "Telegram $bot: OK" || echo "Telegram $bot: MISSING"; done && \
[ -f ~/.openclaw/credentials/bird/cookies.json ] && echo "Bird cookies: OK" || echo "Bird cookies: MISSING" && \
echo "=== CRON ===" && \
cat ~/.openclaw/cron/jobs.json | jq -r '.jobs[] | "\(.name): enabled=\(.enabled) status=\(.state.lastStatus // "never") \(.state.lastError // "")"' && \
echo "=== RECENT ERRORS ===" && \
tail -10 ~/.openclaw/logs/gateway.err.log 2>/dev/null && \
echo "=== MEMORY DB ===" && \
sqlite3 ~/.openclaw/memory/main.sqlite "SELECT COUNT(*) || ' chunks, ' || (SELECT COUNT(*) FROM files) || ' files indexed' FROM chunks;" 2>/dev/null
```

---

## 文件映射

```
~/.openclaw/
├── openclaw.json                    # 主配置 — 通道、认证、网关、插件、技能
├── openclaw.json.bak*               # 自动备份 (.bak, .bak.1, .bak.2 ...)
├── exec-approvals.json              # 执行审批套接字配置
│
├── agents/main/
│   ├── agent/auth-profiles.json     # Anthropic 认证令牌
│   └── sessions/
│       ├── sessions.json            # 会话索引 — 键名类似 agent:main:whatsapp:+1234
│       └── *.jsonl                  # 会话记录 (每行一个 JSON)
│
├── workspace/                       # 代理工作区 (git 追踪)
│   ├── SOUL.md                      # 个性、写作风格、语气规则
│   ├── IDENTITY.md                  # 名称、生物类型、氛围
│   ├── USER.md                      # 所有者上下文和偏好
│   ├── AGENTS.md                    # 会话行为、内存规则、安全
│   ├── BOOT.md                      # 启动说明 (自动驾驶通知协议)
│   ├── HEARTBEAT.md                 # 定期检查表 (空 = 跳过心跳)
│   ├── MEMORY.md                    # 精选长期记忆 (仅主会话)
│   ├── TOOLS.md                     # 联系人、SSH 主机、设备昵称
│   ├── memory/                      # 每日日志: YYYY-MM-DD.md, topic-chat.md
│   └── skills/                      # 工作区级技能
│
├── memory/main.sqlite               # 向量记忆数据库 (Gemini 嵌入, FTS5 搜索)
│
├── logs/
│   ├── gateway.log                  # 运行时: 启动、通道初始化、配置重载、关闭
│   ├── gateway.err.log              # 错误: 连接断开、API 故障、超时
│   └── commands.log                 # 命令执行日志
│
├── cron/
│   ├── jobs.json                    # 任务定义 (计划、负载、投递目标)
│   └── runs/                        # 每任务运行日志: {job-uuid}.jsonl
│
├── credentials/
│   ├── whatsapp/default/            # Baileys 会话: ~1400 个 app-state-sync-key-*.json 文件
│   ├── telegram/{botname}/token.txt # 机器人令牌 (每个机器人账户一个)
│   └── bird/cookies.json            # X/Twitter 认证 Cookie
│
├── extensions/{name}/               # 自定义插件 (TypeScript)
│   ├── openclaw.plugin.json         # {"id", "channels", "configSchema"}
│   ├── index.ts                     # 入口点
│   └── src/                         # channel.ts, actions.ts, runtime.ts, types.ts
│
├── identity/                        # device.json, device-auth.json
├── devices/                         # paired.json, pending.json
├── media/inbound/                   # 接收的图片、音频文件
├── media/browser/                   # 浏览器截图
├── browser/openclaw/user-data/      # Chromium 配置文件 (~180MB)
├── tools/signal-cli/                # Signal CLI 二进制
├── subagents/runs.json              # 子代理执行日志
├── canvas/index.html                # Web Canvas UI
└── telegram/
    ├── update-offset-coder.json     # {"lastUpdateId": N} — Telegram 轮询游标
    └── update-offset-sales.json     # 重置为 0 以重放丢失的消息
```

---

## 故障排除：WhatsApp

### "我发送了一条消息，但没有收到回复"

这是第一个要检查的问题。消息已到达，但机器人没有响应。按此顺序检查：

```bash
# 1. 机器人是否真的在运行？
grep -i "whatsapp.*starting\|whatsapp.*listening" ~/.openclaw/logs/gateway.log | tail -5

# 2. 检查 408 超时断开 (WhatsApp 网络经常断开)
grep -i "408\|499\|retry" ~/.openclaw/logs/gateway.err.log | tail -10
# 如果看到 "Web connection closed (status 408). Retry 1/12" — 这是正常的，
# 它会自动恢复。但如果重试达到 12/12，会话就完全断开了。

# 3. 检查跨上下文消息阻止
grep -i "cross-context.*denied" ~/.openclaw/logs/gateway.err.log | tail -10
# 常见情况: "Cross-context messaging denied: action=send target provider "whatsapp" while bound to "signal""
# 这意味着代理在 Signal 会话中，却尝试在 WhatsApp 上回复。
# 修复: 消息需要在 WhatsApp 会话上下文中发送，而不是 Signal。

# 4. 检查该联系人是否存在会话
cat ~/.openclaw/agents/main/sessions/sessions.json | jq -r 'to_entries[] | select(.key | test("whatsapp")) | "\(.key) | \(.value.origin.label // "?")"'

# 5. 检查发送者是否被允许
cat ~/.openclaw/openclaw.json | jq '.channels.whatsapp | {dmPolicy, allowFrom, selfChatMode, groupPolicy}'
# 如果 dmPolicy 是 "allowlist" 且发送者不在 allowFrom 中，消息会被静默丢弃。

# 6. 检查是否是群消息 (群聊默认禁用)
cat ~/.openclaw/openclaw.json | jq '.channels.whatsapp.groupPolicy'
# "disabled" 意味着所有群消息都被忽略。

# 7. 检查通道拥堵 (代理正忙于其他任务)
grep "lane wait exceeded" ~/.openclaw/logs/gateway.err.log | tail -5
# 如果代理卡在长时间的 LLM 调用中，新消息会排队。

# 8. 检查代理运行超时
grep "embedded run timeout" ~/.openclaw/logs/gateway.err.log | tail -5
# 硬限制是 600 秒 (10 分钟)。如果代理响应时间超过此限制，会被强制终止。
```

### "WhatsApp 完全断开连接"

```bash
# 检查凭证文件是否存在 (应该约 1400 个文件)
ls ~/.openclaw/credentials/whatsapp/default/ | wc -l

# 如果 0 个文件: 会话从未创建或被清除
# 修复: 通过 `openclaw configure` 重新配对

# 检查 QR/配对事件
grep -i "pair\|link\|qr\|scan\|logged out" ~/.openclaw/logs/gateway.log | tail -10

# 检查 Baileys 错误
grep -i "baileys\|DisconnectReason\|logout\|stream:error" ~/.openclaw/logs/gateway.err.log | tail -20

# 终极修复: 删除凭证并重新配对
# rm -rf ~/.openclaw/credentials/whatsapp/default/
# openclaw configure
```

---

## 故障排除：电报

### "机器人有问题/忘记事情"

两个看起来相同但独立的问题：

```bash
# 1. 检查配置验证错误 (最常见的)
grep -i "telegram.*unrecognized\|telegram.*invalid\|telegram.*policy" ~/.openclaw/logs/gateway.err.log | tail -10
# 已知问题: accounts 下的 "token" 和 "username" 键不被识别。
# 正确的字段是 "botToken"，不是 "token"。

# 2. 检查实际配置
cat ~/.openclaw/openclaw.json | jq '.channels.telegram'
# 验证每个机器人有 "botToken" (不是 "token") 和 "name" 字段。

# 3. 检查轮询状态 — 机器人在 getUpdates 超时后会停止
grep -i "telegram.*exit\|telegram.*timeout\|getUpdates" ~/.openclaw/logs/gateway.err.log | tail -10
# "[telegram] [sales] channel exited: Request to 'getUpdates' timed out after 500 seconds"
# 这意味着机器人失去了与 Telegram API 的连接并停止监听。
# 修复: 重启网关 — `openclaw gateway restart`

# 4. 检查轮询偏移 (如果机器人"忘记"或重放旧消息)
cat ~/.openclaw/telegram/update-offset-coder.json
cat ~/.openclaw/telegram/update-offset-sales.json
# 如果 lastUpdateId 卡住或为 0，机器人会重新处理旧消息。
# 跳到最新消息: 网关重启时会自动设置。

# 5. 检查两个机器人是否都在启动
grep -i "telegram.*starting\|telegram.*coder\|telegram.*sales" ~/.openclaw/logs/gateway.log | tail -10

# 6. "机器人忘记" — 这通常是会话问题，不是 Telegram 问题
# 每个 Telegram 用户在 sessions.json 中都有自己的会话。
# 检查会话是否存在:
cat ~/.openclaw/agents/main/sessions/sessions.json | jq -r 'to_entries[] | select(.key | test("telegram")) | "\(.key) | \(.value.origin.label // "?")"'

# 7. 检查是否发生了压缩 (上下文窗口被修剪 = "忘记")
SESS_ID="粘贴会话-id"
grep '"compaction"' ~/.openclaw/agents/main/sessions/$SESS_ID.jsonl | wc -l
# 如果压缩计数 > 0，旧消息已从上下文中修剪。
# 代理的压缩模式是:
cat ~/.openclaw/openclaw.json | jq '.agents.defaults.compaction'
```

### Telegram 配置修复模板

```bash
# 正确的 Telegram 配置结构:
cat ~/.openclaw/openclaw.json | jq '.channels.telegram = {
  "enabled": true,
  "accounts": {
    "coder": {
      "name": "机器人显示名称",
      "enabled": true,
      "botToken": "你的机器人令牌"
    },
    "sales": {
      "name": "销售机器人名称",
      "enabled": true,
      "botToken": "你的机器人令牌"
    }
  },
  "dmPolicy": "pairing",
  "groupPolicy": "disabled"
}' > /tmp/oc.json && mv /tmp/oc.json ~/.openclaw/openclaw.json
```

---

## 故障排除：信号

### "信号 RPC 发送消息失败"

这会阻止 cron 作业和跨通道通知。

```bash
# 1. 检查 signal-cli 进程是否存活
ps aux | grep "[s]ignal-cli"

# 2. 检查 RPC 端点
grep -i "signal.*starting\|signal.*8080\|signal.*rpc" ~/.openclaw/logs/gateway.log | tail -10
# 应该看到: "[signal] [default] starting provider (http://127.0.0.1:8080)"

# 3. 检查连接不稳定
grep -i "HikariPool\|reconnecting\|SSE stream error\|terminated" ~/.openclaw/logs/gateway.err.log | tail -10
# "HikariPool-1 - Thread starvation or clock leap detected" = signal-cli 内部数据库问题
# "SSE stream error: TypeError: terminated" = 与 signal-cli 守护进程失去连接

# 4. 检查速率限制
grep -i "signal.*rate" ~/.openclaw/logs/gateway.err.log | tail -5
# "Signal RPC -5: Failed to send message due to rate limiting"

# 5. 检查目标格式是否正确
grep -i "unknown target" ~/.openclaw/logs/gateway.err.log | tail -5
# "Unknown target "adi" for Signal. Hint: <E.164|uuid:ID|...>"
# 代理必须使用电话号码 (+1...) 或 uuid: 格式，而不是名称。

# 6. 修复个人资料名称警告垃圾邮件
grep -c "No profile name set" ~/.openclaw/logs/gateway.err.log
# 如果计数很高: 运行 signal-cli updateProfile 设置名称

# 7. 直接测试 signal-cli
ACCT=$(cat ~/.openclaw/openclaw.json | jq -r '.channels.signal.account')
echo "Account: $ACCT"
# signal-cli -a $ACCT send -m "test" +目标号码

# 8. 检查 signal-cli 守护进程是否需要重启
# 网关将 signal-cli 作为子进程管理。
# 重启整个网关: openclaw gateway restart
```

---

## 故障排除：Cron 作业

```bash
# 1. 所有任务概览
cat ~/.openclaw/cron/jobs.json | jq -r '.jobs[] | "\(.enabled | if . then "ON " else "OFF" end) \(.state.lastStatus // "never" | if . == "error" then "FAIL" elif . == "ok" then "OK  " else .  end) \(.name)"'

# 2. 失败的任务及错误详情
cat ~/.openclaw/cron/jobs.json | jq '.jobs[] | select(.state.lastStatus == "error") | {name, error: .state.lastError, lastRun: (.state.lastRunAtMs | . / 1000 | todate), id}'

# 3. 读取失败任务的实际运行日志
JOB_ID="粘贴任务-uuid-这里"
tail -20 ~/.openclaw/cron/runs/$JOB_ID.jsonl | python3 -c "
import sys, json
for line in sys.stdin:
    try:
        obj = json.loads(line)
        if obj.get('type') == 'message':
            role = obj['message']['role']
            text = ''.join(c.get('text','') for c in obj['message'].get('content',[]) if isinstance(c,dict))
            if text.strip():
                print(f'[{role}] {text[:300]}')
    except: pass
"

# 4. 常见 cron 失败原因:
#    - "Signal RPC -1" → Signal 守护进程宕机，见上方 Signal 部分
#    - "gateway timeout after 10000ms" → cron 触发时网关正在重启
#    - "Brave Search 429" → 免费套餐速率限制 (2000 次请求/月)
#    - "embedded run timeout" → 任务运行超过 600 秒

# 5. 下次计划运行时间
cat ~/.openclaw/cron/jobs.json | jq -r '.jobs[] | select(.enabled) | "\(.name): \((.state.nextRunAtMs // 0) | . / 1000 | todate)"'

# 6. 临时禁用故障任务
cat ~/.openclaw/cron/jobs.json | jq '(.jobs[] | select(.name == "任务名称")).enabled = false' > /tmp/cron.json && mv /tmp/cron.json ~/.openclaw/cron/jobs.json
```

---

## 故障排除：内存/"它忘记了"

记忆系统有 3 层。当代理"忘记"时，其中之一就坏了：

### 第 1 层：上下文窗口（会话内）

```bash
# 检查会话的压缩次数 (压缩 = 旧消息被修剪)
grep -c '"compaction"' ~/.openclaw/agents/main/sessions/SESSION_ID.jsonl
# 7 次压缩 = 代理已经"忘记"最早的消息 7 次。

# 检查压缩模式
cat ~/.openclaw/openclaw.json | jq '.agents.defaults.compaction'
# "safeguard" = 仅在接近上下文限制时压缩
```

### 第 2 层：工作区内存文件

```bash
# 存在哪些每日内存文件
ls -la ~/.openclaw/workspace/memory/

# MEMORY.md 中的内容 (长期精选)
cat ~/.openclaw/workspace/MEMORY.md

# 在内存文件中搜索特定内容
grep -ri "关键词" ~/.openclaw/workspace/memory/
```

### 第 3 层：向量内存数据库（SQLite + Gemini 嵌入）

```bash
# 哪些文件被索引
sqlite3 ~/.openclaw/memory/main.sqlite "SELECT path, size, datetime(mtime/1000, 'unixepoch') as modified FROM files;"

# 存在多少文本块 (文本片段)
sqlite3 ~/.openclaw/memory/main.sqlite "SELECT COUNT(*) FROM chunks;"

# 通过文本搜索文本块 (FTS5 全文搜索)
sqlite3 ~/.openclaw/memory/main.sqlite "SELECT substr(text, 1, 200) FROM chunks_fts WHERE chunks_fts MATCH '关键词' LIMIT 5;"

# 检查嵌入配置
sqlite3 ~/.openclaw/memory/main.sqlite "SELECT value FROM meta WHERE key='memory_index_meta_v1';" | python3 -m json.tool

# 检查 Gemini 嵌入速率限制 (会破坏索引)
grep -i "gemini.*batch.*failed\|RESOURCE_EXHAUSTED\|429" ~/.openclaw/logs/gateway.err.log | tail -10
# "embeddings: gemini batch failed (2/2); disabling batch" = 索引降级

# 重建内存索引 (重新索引所有工作区文件)
# 删除数据库并重启网关 — 它会重建:
# rm ~/.openclaw/memory/main.sqlite && openclaw gateway restart
```

---

## 搜索会话

### 查找某人的对话

```bash
# 按名称搜索会话索引 (不区分大小写)
cat ~/.openclaw/agents/main/sessions/sessions.json | jq -r 'to_entries[] | select(.value.origin.label // "" | test("名称"; "i")) | "\(.value.sessionId) | \(.value.lastChannel) | \(.value.origin.label)"'
```

### 按频道查找会话

```bash
cat ~/.openclaw/agents/main/sessions/sessions.json | jq -r 'to_entries[] | select(.value.lastChannel == "whatsapp") | "\(.value.sessionId) | \(.value.origin.label // .key)"'
# 将 "whatsapp" 替换为: signal、telegram，或检查 .key 获取 cron 会话
```

### 最近的会话

```bash
cat ~/.openclaw/agents/main/sessions/sessions.json | jq -r '[to_entries[] | {id: .value.sessionId, updated: .value.updatedAt, label: (.value.origin.label // .key), ch: (.value.lastChannel // "cron")}] | sort_by(.updated) | reverse | .[:10][] | "\(.updated | . / 1000 | todate) | \(.ch) | \(.label)"'
```

### 在所有会话中搜索消息内容

```bash
# 快速: 查找包含关键词的会话文件
grep -l "关键词" ~/.openclaw/agents/main/sessions/*.jsonl

# 详细: 显示匹配的消息及时间戳
grep "关键词" ~/.openclaw/agents/main/sessions/*.jsonl | python3 -c "
import sys, json
for line in sys.stdin:
    path, data = line.split(':', 1)
    try:
        obj = json.loads(data)
        if obj.get('type') == 'message':
            role = obj['message']['role']
            text = ''.join(c.get('text','') for c in obj['message'].get('content',[]) if isinstance(c,dict))
            if text.strip():
                sid = path.split('/')[-1].replace('.jsonl','')[:8]
                ts = obj.get('timestamp','')[:19]
                print(f'{ts} [{sid}] [{role}] {text[:200]}')
    except: pass
" | head -30
```

### 阅读特定的会话记录

```bash
# 会话的最后 30 条消息
tail -50 ~/.openclaw/agents/main/sessions/SESSION_ID.jsonl | python3 -c "
import sys, json
for line in sys.stdin:
    try:
        obj = json.loads(line)
        if obj.get('type') == 'message':
            role = obj['message']['role']
            text = ''.join(c.get('text','') for c in obj['message'].get('content',[]) if isinstance(c,dict))
            if text.strip() and role != 'toolResult':
                print(f'[{role}] {text[:300]}')
                print()
    except: pass
"
```

---

## 配置编辑

### 安全编辑模式

始终：备份、使用 jq 编辑、重新启动。

```bash
cp ~/.openclaw/openclaw.json ~/.openclaw/openclaw.json.bak.manual
jq '在此编辑你的内容' ~/.openclaw/openclaw.json > /tmp/oc.json && mv /tmp/oc.json ~/.openclaw/openclaw.json
openclaw gateway restart
```

### 常见编辑

```bash
# 将 WhatsApp 切换为允许列表
jq '.channels.whatsapp.dmPolicy = "allowlist" | .channels.whatsapp.allowFrom = ["+1XXXXXXXXXX"]' ~/.openclaw/openclaw.json > /tmp/oc.json && mv /tmp/oc.json ~/.openclaw/openclaw.json

# 启用 WhatsApp 自动驾驶 (机器人像你一样回复所有人)
jq '.channels.whatsapp += {dmPolicy: "open", selfChatMode: false, allowFrom: ["*"]}' ~/.openclaw/openclaw.json > /tmp/oc.json && mv /tmp/oc.json ~/.openclaw/openclaw.json

# 添加号码到 Signal 允许列表
jq '.channels.signal.allowFrom += ["+1XXXXXXXXXX"]' ~/.openclaw/openclaw.json > /tmp/oc.json && mv /tmp/oc.json ~/.openclaw/openclaw.json

# 更改模型
jq '.agents.defaults.models = {"anthropic/claude-sonnet-4": {"alias": "sonnet"}}' ~/.openclaw/openclaw.json > /tmp/oc.json && mv /tmp/oc.json ~/.openclaw/openclaw.json

# 设置并发
jq '.agents.defaults.maxConcurrent = 10 | .agents.defaults.subagents.maxConcurrent = 10' ~/.openclaw/openclaw.json > /tmp/oc.json && mv /tmp/oc.json ~/.openclaw/openclaw.json

# 禁用插件
jq '.plugins.entries.imessage.enabled = false' ~/.openclaw/openclaw.json > /tmp/oc.json && mv /tmp/oc.json ~/.openclaw/openclaw.json
```

### 从备份恢复

```bash
# 最新备份
cp ~/.openclaw/openclaw.json.bak ~/.openclaw/openclaw.json

# 按日期列出所有备份
ls -lt ~/.openclaw/openclaw.json.bak*

# 重启前验证 JSON
python3 -m json.tool ~/.openclaw/openclaw.json > /dev/null && echo "OK" || echo "损坏"

# 终极重置
openclaw configure
```

---

## 通道安全模式

| 模式 | 行为 | 风险 |
|---|---|---|
| `open` + `allowFrom: ["*"]` | 任何人都可以留言，机器人会回复所有人 | 高 — 消耗 API 积分，机器人会像你一样说话 |
| `allowlist` + `allowFrom: ["+1..."]` | 只有列出的号码才能接通 | 低 — 显式控制 |
| `pairing` | 未知发件人获得代码，您批准 | 低 — 批准门 |
| `disabled` | 频道完全关闭 | 无 |

### 检查当前的安全状况

```bash
cat ~/.openclaw/openclaw.json | jq '{
  whatsapp: {policy: .channels.whatsapp.dmPolicy, from: .channels.whatsapp.allowFrom, groups: .channels.whatsapp.groupPolicy, selfChat: .channels.whatsapp.selfChatMode},
  signal: {policy: .channels.signal.dmPolicy, from: .channels.signal.allowFrom, groups: .channels.signal.groupPolicy},
  telegram: {policy: .channels.telegram.dmPolicy, groups: .channels.telegram.groupPolicy, bots: [.channels.telegram.accounts | to_entries[] | "\(.key)=\(.value.enabled)"]},
  imessage: {enabled: .channels.imessage.enabled, policy: .channels.imessage.dmPolicy}
}'
```

---

## 工作区文件

| 文件 | 作用 | 何时编辑 |
|---|---|---|
| `SOUL.md` | 个性：语气、风格（"无破折号，小写休闲"） | 更改机器人的说话方式 |
| `IDENTITY.md` | 名称、生物类型、表情符号 | 重塑品牌 |
| `USER.md` | 所有者信息、偏好 | 当用户上下文发生变化时 |
| `AGENTS.md` | 操作规则：内存协议、安全、群聊行为、心跳指令 | 更改机器人行为 |
| `BOOT.md` | 启动说明 (自动驾驶通知协议：WA→Signal) | 更改启动时发生的情况 |
| `HEARTBEAT.md` | 定期检查表 (空 = 没有心跳 API 调用) | 添加/删除定期任务 |
| `MEMORY.md` | 精心策划的长期记忆 (仅在主/直接会话中加载) | 机器人自行管理 |
| `TOOLS.md` | 联系人、SSH 主机、设备昵称 | 添加工具注释 |
| `memory/*.md` | 每日原始日志、特定主题的聊天记录 | 机器人自动写入 |

---

## 会话 JSONL 格式

每个 `.jsonl` 文件每行都有一个 JSON 对象。类型：

| 类型 | 作用 |
|---|---|
| `session` | 会话标头：id、时间戳、cwd |
| `message` | 对话轮：角色 (用户/助手/工具结果)、内容、模型、用途 |
| `meta` | 元数据：`model_snapshot`、`openclaw.cache-ttl` |
| `compaction` | 上下文窗口被修剪 (旧消息被删除) |
| `model-change` | 模型在会话中途切换 |
| `thinking-level-change` | 思考级别调整 |

会话索引 (`sessions.json`) 键：
- 模式：`agent:main:{channel}:{contact}` 或 `agent:main:cron:{job-uuid}`
- 字段：`sessionId` (UUID = 文件名)、`lastChannel`、`origin.label` (人名)、`origin.from` (规范地址)、`updatedAt` (纪元毫秒)、`chatType` (直接/组)

---

## 网关启动顺序

正常启动大约需要 3 秒：

```
[heartbeat] started
[gateway] listening on ws://127.0.0.1:18789
[browser/service] Browser control service ready
[hooks] loaded 3 internal hook handlers (boot-md, command-logger, session-memory)
[whatsapp] [default] starting provider
[signal] [default] starting provider (http://127.0.0.1:8080)
[telegram] [coder] starting provider
[telegram] [sales] starting provider
[whatsapp] Listening for personal WhatsApp inbound messages.
[signal] signal-cli: Started HTTP server on /127.0.0.1:8080
```

如果缺少任何一行，则该组件无法启动。检查 `gateway.err.log`。

---

## 已知错误模式

| 错误 | 含义 | 修复 |
|---|---|---|
| `Web connection closed (status 408)` | WhatsApp 网络超时，自动重试最多 12 次 | 通常会自愈。如果到达 12/12，重启网关 |
| `Signal RPC -1: Failed to send message` | signal-cli 守护进程失去连接 | 重启网关 |
| `Signal RPC -5: Failed to send message due to rate limiting` | Signal 速率限制 | 等待并重试，降低消息频率 |
| `No profile name set` (signal-cli 警告) | 日志洪水，无害 | `signal-cli -a +ACCOUNT updateProfile --given-name "名称"` |
| `Cross-context messaging denied` | 代理尝试跨渠道发送 | 不是错误 — 安全护栏。消息必须源自正确的通道会话 |
| `getUpdates timed out after 500s` | Telegram 机器人失去轮询连接 | 重启网关 |
| `Unrecognized keys: "token", "username"` | Telegram 机器人的错误配置密钥 | 在 openclaw.json 中使用 `botToken` 而不是 `token` |
| `RESOURCE_EXHAUSTED` (Gemini 429) | 嵌入速率限制 | 减少工作区文件变更，或升级 Gemini 配额 |
| `lane wait exceeded` | 代理因长时间的 LLM 调用而被阻塞 | 等待，如果卡住 > 2 分钟则重新启动 |
| `embedded run timeout: timeoutMs=600000` | 代理响应时间超过 10 分钟 | 将任务分解为更小的部分 |
| `gateway timeout after 10000ms` | 重启窗口期间无法访问网关 | 当网关关闭时 Cron 被触发 — 暂时的 |

---

## 扩展 OpenClaw

OpenClaw 有 4 个扩展层。每个解决不同的问题：

| 层 | 作用 | 位置 | 如何添加 |
|---|---|---|---|
| **技能** | 知识 + 代理按需加载的工作流程 | `/opt/homebrew/lib/node_modules/openclaw/skills/` 或 `~/.openclaw/workspace/skills/` | `clawdhub install <slug>` 或 `npx add-skill <repo>` |
| **扩展** | 自定义频道插件 (TypeScript) | `~/.openclaw/extensions/{name}/` | 创建 `openclaw.plugin.json` + TypeScript 源码 |
| **频道** | 消息平台 (内置) | `openclaw.json → channels.*` + `plugins.entries.*` | 在 openclaw.json 中配置，添加凭据 |
| **Cron 作业** | 预定的自主任务 | `~/.openclaw/cron/jobs.json` | 代理通过工具创建，或者直接编辑 jobs.json |

### 技能：ClawdHub 生态系统

技能是扩展代理知识和能力的主要方式。它们是带有可选脚本/资源的 Markdown 文件，在相关时加载到上下文中。

```bash
# 搜索技能 (跨注册表向量搜索)
clawdhub search "postgres optimization"
clawdhub search "image generation"

# 浏览最新技能
clawdhub explore

# 安装技能
clawdhub install supabase-postgres-best-practices
clawdhub install nano-banana-pro

# 安装特定版本
clawdhub install my-skill --version 1.2.3

# 列出已安装的技能
clawdhub list

# 更新所有已安装的技能
clawdhub update --all

# 更新特定技能
clawdhub update my-skill
clawdhub update my-skill --force  # 覆盖本地更改
```

**当前安装的技能（与 OpenClaw 捆绑）：**

| 类别 | 技能 |
|---|---|
| **消息传递** | Discord、slack、imsg、wacli、语音通话 |
| **社交/网络** | bird (X/Twitter)、blogwatcher、github、trello、notion |
| **谷歌** | gog、google-workspace-mcp、goplaces、本地地点 |
| **媒体** | nano-banana-pro（Gemini 图像生成）、openai-image-gen、视频帧、gifgrep、pixelated、sag (TTS)、openai-whisper、sherpa-onnx-tts、songsee、camsnap |
| **编码代理** | 编码代理 (Codex/Claude Code/Pi)、ccbg（后台运行程序）、tmux |
| **生产力** | apple-notes、apple-reminders、bear-notes、things-mac、obsidian、himalaya (邮件) |
| **智能家居** | openhue (飞利浦 Hue)、eightctl (Eight Sleep)、sonoscli、blucli (BluOS) |
| **开发工具** | github、worktree、starter、desktop、supabase-postgres-best-practices、superdesign |
| **内容** | remote-best-practices、remote-fastest-tech-stack、humanlike、summarize、market、build-in-public |
| **元** | skill-creator、clawdhub、find-skills、add-skill、model-usage、session-logs、recent-plans、canvas |

### 创建你自己的技能

技能只是一个带有 `SKILL.md` 的文件夹：

```
my-skill/
├── SKILL.md              # 必需: YAML frontmatter + Markdown 指令
├── scripts/              # 可选: 可执行脚本
├── references/           # 可选: 按需加载的文档
└── assets/               # 可选: 模板、图片
```

**SKILL.md 格式：**

```markdown
---
name: my-skill
description: 这做了什么以及何时触发。描述是主要的
  触发器 — 代理读取此内容来决定是否加载完整技能。
---

# 我的技能

指令放在这里。仅在技能触发后加载。
保持在 500 行以内。将大型内容拆分为 references/ 文件。
```

**关键原则：上下文窗口是共享资源。** 仅包含代理尚不知道的内容。比起冗长的解释，更喜欢简洁的例子。

```bash
# 发布到 ClawdHub
clawdhub login
clawdhub publish ./my-skill --slug my-skill --name "我的技能" --version 1.0.0

# 或发布到 Skills.sh
npx clawkit publish ./my-skill
```

