僚机 · 第三层

Worker daemon 蓝图 · 这层 OK 就开搭脚手架 · 2026-06-09

01 · 总图

1 个长驻 daemon · 3 个内部组件 · Fries Mac 本机跑 · launchd 守护。

飞书云 长连接事件流 wingman-worker (Fries · launchd) 📥 Inbox event consume 来一条 → 入 queue 💾 State SQLite ~/.hermes/wingman.db 📤 Outbox 5s tick scheduler 扫 active → patch card 🧠 LLM haiku 4.5 via eagle proxy 主会话卡片 lark-cli patch card 事件 push patch

02 · State 表

1 张 SQLite 表 · 重启不丢 · daemon 拉起后续上原状态。

CREATE TABLE thread_state (
thread_idTEXT PKomt_xxx · 飞书话题 ID
card_msg_idTEXTom_xxx · 主会话卡片消息 ID (patch 用)
statusTEXTidle / active / stalled / done
thread_nameTEXT话题首条消息 (":摄影项目") · 卡片标题
last_user_msgTEXT最近 1 条你的消息 · 任务原话
recent_actionsJSON最近 10 条 bot 动作 (tool 名+前 200 字符)
summaryTEXThaiku 上次给的一句话
started_atINTunix · 算耗时
updated_atINTunix · 触发 stalled 判断
);

03 · 5s tick 流程

每 5 秒走一遍 · 只动 status=active 的 thread · 安静的 thread 不调 LLM。

① SCAN
扫 active
SELECT * WHERE status='active'
② BUILD
拼 prompt
last_user_msg
+ recent_actions JSON
≤ 2K tokens
③ ASK
调 haiku
eagle proxy
{summary, done}
④ PATCH
改卡片
lark-cli im messages patch
用 card_msg_id
⑤ MARK
写 State
summary 入库
done=true → status=done
+ @dora ping

04 · 失败模式

每条都 graceful · 不丢任务 · launchd 兜底。

失败点
表现
恢复
长连接断
飞书事件流超时
lark-cli 自带 reconnect · daemon 不退
daemon crash
Python 异常 / OOM
launchd KeepAlive 拉起 · SQLite 续上 active 任务
haiku 超时/限流
5s tick 调失败
本 tick 跳过 · 卡片状态不变 · 下次 tick 再试
卡片 patch 失败
飞书 API 报错
重试 3 次 · 仍失败则 fallback 发新卡 + 更新 card_msg_id
stalled 不收
haiku 一直说 done=false 但其实结束了
5min 无新 bot 动作 → 强制 status=done · @你确认
脚手架预估: ~400 行 Python (1 daemon py · 1 launchd plist · 1 schema sql · 1 prompt 模板)
依赖: lark-cli (有) · sqlite3 (stdlib) · openai SDK (有,走 eagle proxy) · launchd (macOS 系统)
入口: ~/.hermes/wingman/worker.py · daemon 跑 fork 进程 · 一切 log 到 ~/.hermes/logs/wingman.log