实时 OpenClaw 会话监控器,追踪 JSONL 记录并以持久后台进程向 Telegram 推送格式化更新。适用于在被询问时
会话监视器 : 持续的背景过程, 将 JSONL 全部记录文件输入到一个: 代理会话目录, 解析新条目, 并将格式化的 HTML. 更新到一个 Telegram是一项面向实际任务的技能。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。
执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
一个持久运行的后台进程,持续轮询 Agent 会话目录下的所有 JSONL 转录文件,解析新增条目,并将格式化后的 HTML 更新推送到 Telegram 聊天窗口。同一时间窗口内的消息通过 editMessageText 合并发送,以避免刷屏。
sessions_list / sessions_history# 1. 配置 cp scripts/.env.example scripts/.env # 编辑 scripts/.env,填入 Bot Token、聊天 ID、会话目录路径、用户/群组映射等信息 # 2. 试运行(验证解析逻辑是否正常) node scripts/test.js # 3. 启动(支持 exec 会话安全运行 — 即使 Agent 会话结束也不会退出) node scripts/index.js > scripts/monitor.log 2>&1 &
⚠️ Agent exec 会话注意事项:通过 Agent 的 exec 工具内使用 nohup & 启动的进程,在 exec 会话被清理时可能被终止。
建议在你的 HEARTBEAT.md 中添加看门狗脚本实现自动重启:
PID=$(cat scripts/.pid 2>/dev/null) if [ -z "$PID" ] || ! ps -p "$PID" > /dev/null 2>&1; then cd scripts && node index.js > monitor.log 2>&1 & fi
| 变量名 | 是否必需 | 说明 |
|---|---|---|
BOT_TOKEN |
✅ | Telegram Bot Token,用于发送更新消息 |
CHAT_ID |
✅ | 目标 Telegram 聊天 ID(支持群组或私聊) |
AGENTS |
❌ | 多 Agent 模式:Name|/path/to/sessions,Name2|/path2 |
AGENT_NAME |
❌ | 单 Agent 显示名称(当未设置 AGENTS 时作为回退值) |
SESSIONS_DIR |
❌ | 单 Agent 会话目录(默认为:~/.openclaw/agents/main/sessions) |
DIRECT_USERS |
❌ | 私聊用户映射:userId:Name,userId2:Name2 |
GROUPS |
❌ | 群组映射:groupId:Name,groupId2:Name2 |
显示格式说明:私聊显示为 ✈ AgentName↔UserName,群组显示为 ✈ GroupName。
scripts/
├── index.js — 主循环:轮询 JSONL 文件、累积新条目、发送/编辑 Telegram 消息
├── parser.js — 将 JSONL 条目解析为 {sender, text} 格式的展示对象
├── formatter.js — 合并同发送者消息、按会话排序、构建 HTML 内容
├── sender.js — Telegram API 封装:sendMessage / editMessageText,含队列机制
├── sessions.js — 会话键查找、标签格式化、子 Agent 名称解析
├── config.js — 加载 .env 配置
├── test.js — 试运行:解析最近条目并输出至 stdout
├── .env.example — 配置模板文件
└── .env — 本地配置文件(已加入 .gitignore)
在 scripts/index.js 中可调整以下参数:
POLL = 3000 — 轮询间隔(毫秒),默认为 3 秒MERGE_WINDOW = 1 — 将 N 分钟内产生的变更合并为一条 Telegram 消息NEW_MSG_THRESHOLD = 3000 — 当当前消息字符数超过该阈值时,强制开启新消息详细格式规范请参阅 references/REFERENCE.md,包括:
PID 文件位于 scripts/.pid,启动时写入,退出时清除。
为避免共享机器上多个监控器冲突,请始终使用绝对路径:
# 检查是否正在运行 SKILL_DIR=/path/to/session-monitor cat "$SKILL_DIR/scripts/.pid" && ps -p $(cat "$SKILL_DIR/scripts/.pid") -o pid,command # 停止 kill $(cat "$SKILL_DIR/scripts/.pid") # 查看日志 tail -f "$SKILL_DIR/scripts/monitor.log"
⚠️ 同一台机器上可共存多个 Session Monitor 实例(各自拥有独立的 .env、.pid 和日志文件)。请确保始终引用正确的 Skill 目录路径。
请将 SKILL_DIR 替换为本 Skill 所在目录(即 scripts/ 的父目录)。
# 状态检查 — 监控器是否正在运行? SKILL_DIR=/absolute/path/to/session-monitor PID=$(cat "$SKILL_DIR/scripts/.pid" 2>/dev/null) if [ -n "$PID" ] && ps -p "$PID" > /dev/null 2>&1; then echo "✅ Monitor 运行中(PID $PID)" else echo "❌ Monitor 未运行" fi # 停止 kill $(cat "$SKILL_DIR/scripts/.pid") # 启动 cd "$SKILL_DIR/scripts" && node index.js > monitor.log 2>&1 & # 重启(先停止再启动) kill $(cat "$SKILL_DIR/scripts/.pid") 2>/dev/null; sleep 1 cd "$SKILL_DIR/scripts" && node index.js > monitor.log 2>&1 &