聊天交互设计

阿赫↔阿良 · 守护/钩子/自愈 · 端到端测试方案

版本 v2.0 | 2026-05-24 | 存档: /mnt/sda/work/CHAT_PLAN.md

一、架构回顾

1.1 物理通道

阿赫(笔记本 10.8.0.2) ←→ WireGuard 10.8.0.0/24 ←→ 阿良(工作站 10.8.0.1)

TCP :9527

阿赫发 → wecom_bot.py → /tmp/chat_a2b.jsonl (阿良收件箱)

阿良发 → send_msg.py → /tmp/chat_b2a.jsonl (阿赫收件箱)

1.2 协议

  • V2.2 自然语言协议,无消息标记,无长度限制
  • 消息ID格式: `MMDD-HHMMSS_xxx`
  • 每条消息必须回复,不回复=断线
  • 回复带原消息ID前缀
  • 二、当前已实现

    组件文件功能状态
    ------------------------
    守护`chat_daemon.sh`轮询 /tmp/chat_a2b.jsonl,有消息→格式化→清空→退出
    重建`chat_rebuild.sh`TaskCompleted 钩子触发,检测守护挂了就重启
    通知`chat_stop_hook.sh`Stop 钩子触发,有消息→cat stderr→exit 2 打断 Claude
    发送`chat_send.sh`生成消息ID,写 /tmp/chat_b2a.jsonl
    控制`chat_ctl.sh`start/stop/status/restart
    钩子`settings.json`Stop(async+asyncRewake) + TaskCompleted(async)

    2.1 工作流程

    消息到达 → chat_a2b.jsonl

    → chat_daemon.sh 每2秒检测 → 发现消息 → 格式化 → chat_new_msg.txt → 清空 inbox → exit 0

    → Stop hook (回合结束时触发) → chat_stop_hook.sh → cat 消息到 stderr + exit 2 → Claude 被打断

    → Claude 看到消息,回复

    → 回复通过 chat_send.sh → chat_b2a.jsonl → send_msg.py → 阿赫

    → TaskCompleted hook → chat_rebuild.sh → 重启 chat_daemon.sh → 继续监控

    三、现存问题

    #问题影响优先级
    -----------------------
    1守护是 raw bash 进程,不是 Claude TaskTaskCompleted 钩子只在其他任务完成时才触发,不能精准重启
    2有消息时守护退出→stop hook 触发→用户看到消息,但到 TaskCompleted 钩子重建守护之间有间隔如果这期间新消息到,没人监控
    3没有"进入聊天模式"入口手动 touch /tmp/chat_mode 不够优雅
    4守护需要 /tmp/chat_mode 标志文件标志丢失就停了
    5未与阿赫联调测试不知道端到端是否真的通

    四、改进方案

    4.1 守护永不退出(解决 #1 #2)

    **改动**: 删除 `chat_daemon.sh` 的 `exit 0`(第18行),改为处理完消息后继续循环

    改前: 有消息→exit 0 (依赖外部重建)

    改后: 有消息→处理→清空→继续 sleep 2 轮询

    **优点**:

  • 守护永远在线,不依赖 TaskCompleted 钩子重建
  • 消息到达后立即处理,没有空窗期
  • **缺点**:

  • 不是"Task 完成→钩子重启"的雏菊链
  • 守护挂了才需要 TaskCompleted 来救
  • 4.2 守护自愈(解决 #4)

    `chat_rebuild.sh` 作为安全网,不做主要重启,只做急救:

    #!/bin/bash

    [ -f /tmp/chat_mode ] || exit 0

    只有守护真的挂了才重启

    if ! pgrep -f "^bash.*chat_daemon.sh" >/dev/null 2>&1; then

    nohup bash /mnt/sda/work/chat_tools/chat_daemon.sh &>/dev/null &

    echo "[$(date)] rebuild: 急救重启守护" >> /tmp/chat_rebuild.log

    fi

    exit 0

    4.3 "进入聊天模式" 入口(解决 #3)

    两种触发方式:

    **方式一**: 用户说"进入聊天模式"

    → Claude 执行: `bash /mnt/sda/work/chat_tools/chat_ctl.sh start`

    → 确保 /tmp/chat_mode 存在 + 守护在跑

    **方式二**: `/chat-start` 自定义命令

    → 已有脚本 `/home/WGR/.claude/commands/chat-start.sh`

    4.4 端到端测试方案(解决 #5)

    测试1: 阿赫发消息 → 阿良收

    阿赫: python3 send_msg.py "测试消息0524-001"

    等3秒 → cat /tmp/chat_new_msg.txt → 应有格式化消息

    测试2: 阿良回复 → 阿赫收

    bash chat_send.sh "收到测试"

    → 阿赫那边 cat /tmp/chat_b2a.jsonl → 应有回复

    测试3: Stop hook 打断

    正常对话回合结束 → 如果 chat_new_msg.txt 非空 → Claude 应看到 stderr 推送

    测试4: 连续消息

    阿赫连发3条 → 守护应一次性处理全部(不丢失)

    五、实施步骤

    阶段内容预估状态
    ------------------------
    1修改 chat_daemon.sh 删除 exit 0,改连续模式改1行
    2修改 chat_rebuild.sh 为急救模式改3行
    3端到端测试(阿赫配合)30分钟
    4排坑记录10分钟
    5日常使用观察1周

    六、后续扩展

  • [ ] 企微恢复后,wecom_bot.py 对接 chat_a2b.jsonl
  • [ ] 消息去重检测(相同ID不重复处理)
  • [ ] 超时自动告警(对方超过30分钟没响应)
  • [ ] 敏感词过滤(内部资料禁发企微)
  • ---

    *待爸爸审核,和阿赫联调时补充*

    ← 返回首页
    Station Opt