首页 项目矩阵 僚机 Wingman + 驾驶舱 Cockpit
基础设施 · 多任务协作中枢

僚机 + Cockpit

把 Hermes / Claude Code / Pi 三路 agent 任务流监听起来 — haiku 节流摘要 + 飞书"一行卡片" + 本地 Web 驾驶舱, 一台机上同时跑 N 个任务也始终一目了然。

主控 Fries 每天派出多个 agent 任务(Hermes turn / Claude Code 后台 / Pi 长任务), 完成消息混在飞书消息流里看不过来。 僚机 Wingman 是司令副官 — 监听三路 task 事件, 用 claude-haiku 5s 节流抽出"在干什么 / 等什么 / 卡哪了"的人话摘要, 完事在原话题回一行 "✅ 完成 · X分Y秒"。 驾驶舱 Cockpit 是补足"完整态" — 本地 192.168.1.142:7421 Web 看板, watchtower 风格三段式分组(需要你看 / 进行中 / 已完成), 移动端 swipe-down 关详情 + 快捷回复按钮直接代发飞书。 6/9 立项 → 6/13 三段式架构(Source / Summarizer / Notifier)落地, 6 天 74 commits。

192.168.1.142:7421 (内网驾驶舱) ~/projects/wingman · 监听 + 摘要 ~/projects/cockpit · monorepo 6 包 @ccpark/daemon · npm published
74 commits
6/9 → 6/14 · 6 天
3 段式
Source / Summarizer / Notifier
haiku 5s
小 LLM 节流摘要中转
5503
cockpit gitnexus symbols

这是什么

多 agent 任务流的"司令副官"

Wingman 是后端 daemon: 三路 source(HermesSource 监听 sqlite / PiSource 监听 pi event / CCSource 走 mcp-bridge HTTP), 都进 HaikuSummarizer 5s 节流抽人话, 出口分两路: ① LarkNotifier 在原话题 reply-in-thread 发"✅ 完成"卡 ② Web Pipeline 推给驾驶舱前端。 Cockpit 是前端 + 桌面 + npm 监控包: FastAPI 单文件 + 暖米色 watchtower 样式, monorepo 6 包(server / console / daemon / shared / ...)。

解决什么问题

"飞书做快讯, 自家 Web 做全景"

6/9 立项时本想做飞书卡片刷屏式通知, 当天就发现两个根本问题: ① 飞书卡片单条体验差、刷屏严重 ② 状态不一致(卡片是快照, 改了不更新, 用户翻第 30 个就乱)。 转向后定了原则: 飞书只发"完成一行卡"当快讯, 完整任务态全部去 Web 驾驶舱看。两种交互拆开, 不混在一个媒介里。 所以你看到的是 — 飞书话题里安静极简,只在 done 时跳一行;驾驶舱永远是 4 格统计 + 三段卡片墙, 始终能一屏看完全部。

架构 · 6/13 三段式重构后

Source · Summarizer · Notifier 完全解耦

6/13 一天 4 commits 把旧 daemon/worker.py + shared/bridge.py + web/pi_summarizer.py 全删, 按职责分三层。同时 fix(arch): Pi/CC 事件不再写 Hermes 的 SQLite — 三个 source 的数据所有权完全独立, 看板和主控状态库再不撞车。

Source · 监听层

HermesSource · PiSource · CCSource

三路 agent 事件流抽取

HermesSource 监听 ~/.hermes/state.db 新消息;PiSource 监听 Pi long-task events;CCSource 走 mcp-bridge HTTP API (/api/sessions/all + per-task recent_events)。每路独立, 数据落各自 DB 不交叉。

Python · sqlite · HTTP polling
Summarizer · 摘要层

HaikuSummarizer

小 LLM 5s 节流抽人话

原始 event 流(可能每秒数十条 tool_call / partial_reply)直接看人脑爆炸。Haiku 5s 节流挡一层, 每窗口出"在干什么 + 等什么 + 卡哪了"三段。HaikuResultfrozen + slots 优化, 中转网关 fallback。

Anthropic Haiku · 5s throttle · frozen dataclass
Notifier · 出口层

LarkNotifier + Web Pipeline

飞书快讯 + 驾驶舱全景双出口

同一份摘要分两路出: ① LarkNotifier 在原话题 reply-in-thread 发 "✅ 完成 · X分Y秒 · summary";per-target lark_home 让 shared daemon 用调用方身份发。② Web Pipeline 推驾驶舱前端, 三段式分组实时刷新。

lark-cli · FastAPI · per-target lark_home

关键里程碑

6 天里的 5 个转折点

挑出 6/9 → 6/14 真正改方向的节点, 跳过日常 commit 和小修。

2026-06-09
立项 → 当天转向
wingman scaffold(launchd plist + schema.sql)+ Path B fanout consumer + Round 3 haiku LLM。当晚转向 — 飞书卡片体验差砍掉, 新建 ~/projects/hermes-cockpit(FastAPI 单文件 + 内网 7421)。done 通知改 reply-in-thread 一行;Summary 重做(humanize_action + 砍 tool_call 噪音 + LLM 4-12 字中文标题);backfill 老话题。
2026-06-10
v11 主次倒置 + 快捷回复
cockpit v11: 进展 19px serif 当主角 / 判断 13px 副位 + 4 色状态渐变 + 1h 自动折叠。新增 swipe-down 关详情(>100px 关 / 横拖 >40px 取消) + 快捷回复按钮(parser 抠 A:/B:/1./是否 5 种格式, POST /api/respond 走 lark-cli --as user 代发, 8 cases 全过)。
2026-06-12
cockpit monorepo baseline
6 包 baseline 零 typecheck 错;@ccpark/daemon 真 wrap claude CLI;persist relay state in sqlite (better-sqlite3);console terminal-native redesign(design system + key pages);render markdown in agent replies。
2026-06-13
三段式架构重构 · commit 1-4/4
一天 4 commits 完成: 1/4 Source/Summarizer/Notifier 骨架 + Pipeline 空壳;2/4 HermesSource + HaikuSummarizer + Lark notifiers + 新 daemon entry;3/4 PiSource + 删 web/pi_summarizer.py;4/4 CCSource + 删 daemon/worker.py + shared/bridge.py + shared/haiku.py。fix(arch): Pi/CC 事件不再写 Hermes 的 SQLite — 看板不再撞车。HaikuResult frozen+slots + 抽 format_offset_prefix / dialog_line
2026-06-14
卡片墙三段式 + npm publish
feat(cockpit): 卡片墙三段式分组(需要你看 / 进行中 / 已完成) + fix(haiku): 中转网关 fallback。cockpit daemon chore: set license to MIT for npm publish;docs: terminal-native architecture diagram(2026-06-14 state)。

沉淀的洞察

6 天学到的 3 件真东西
"小 LLM 中间层" 是 agent UX 的关键中转
把"原始 event 流(每秒 N 条 tool_call / partial_reply) → 人话摘要"用 haiku 5s 节流挡一层, 主模型 / 通知层只面对 readable summary, 不被 raw event 淹。没有这一层 cockpit 的所有 UI 都会变成 raw log viewer, 跟看 console 没区别。
飞书做"快讯", 自家 Web 做"全景"
强制把"即时通知"和"完整任务态"两种交互拆开。试图在飞书卡片里塞驾驶舱必败(刷屏 + 状态不一致, 卡片永远是快照)。6/9 立项当天就走通了这条 — 飞书发一行 done, 全景去 192.168.1.142:7421 看, 互不打架。
多 source 必须共用一个 SQLite 才会撞车
6/13 的 fix(arch) 是个典型教训: 一开始把 Pi/CC 事件也 INSERT 到 Hermes 的 state.db, 看板从 state.db 读, 结果三路 source 都在改, 看板看到的状态时序错乱。把 Pi/CC 拆出去用自己的 DB, 看板立马清爽。数据所有权边界要清。

技术栈

Python 后端 · FastAPI · SQLite · 飞书 + Haiku
Python 3.13 FastAPI SQLite better-sqlite3 (cockpit) Claude Haiku (节流摘要) launchd lark-cli pnpm monorepo (6 包) @ccpark/daemon (npm) watchtower 风格 UI gitnexus (5503 sym)