背景
最近在 X 和 Reddit 上看到不少开发者在折腾 AI Agent 状态屏、桌面提示灯之类的小玩意儿,感觉挺有意思,于是也想自己试试。
这段时间我的开发方式也发生了一些变化。
很多任务已经不是自己一点点敲代码,而是先和 Codex 讨论方案,让它生成计划,审核通过后再进入执行阶段。
整个流程大致是:
讨论需求
↓
Codex生成计划
↓
人工审核
↓
Codex执行
↓
需要人工介入时主动提出
↓
继续执行直到完成
比如刷机、部署、登录授权、设备确认这类步骤,我会要求 Codex 在关键节点停下来等我处理。
这样做效率很高,但也带来了一个小问题:
Agent 经常会连续工作十几分钟甚至更久,而我不可能一直盯着终端窗口。
切去做别的事情时,我希望知道:
- 它正在思考
- 它正在执行
- 它正在等我
- 它已经完成
最好还能在需要我介入时主动提醒我一下。
于是我买了一台 Ulanzi TC001,于是就把它改造成了一个专门给 Codex 使用的桌面状态提示器。

我的目标很简单:
- 空闲显示
IDLE - 思考显示
THNK - 执行显示
WORK - 等待人工处理显示
WAIT - 完成显示
DONE - 异常显示
FAIL - 同时显示 Codex 剩余额度
- 关键状态变化时发出提示音
除此之外,不显示天气、不显示日期,也不显示各种无关通知。
实现链路
技术上,这个项目的整体链路比较简单:通过 Codex Hooks 捕获生命周期事件,本地 Python Bridge 负责状态管理和数据处理,再通过 AWTRIX 3 的 HTTP API 将状态推送到 TC001 显示。整个方案只使用 HTTP,没有引入 MQTT、Home Assistant 等额外组件,尽量保持链路简单和可调试。
硬件方面
我先将 TC001 刷入 AWTRIX 3 固件,使其具备 Custom App、HTTP API 和 RTTTL 提示音能力。设备接入局域网后,本机即可直接控制屏幕内容和蜂鸣器。为了避免干扰,还关闭了时间、天气、电量等默认页面,让设备始终停留在专用的 codex_status 页面。
软件部分
软件部分的核心是一个本地 Bridge 服务。它接收 Codex Hooks 事件,将 SessionStart、UserPromptSubmit、PreToolUse、PermissionRequest、Stop 等事件映射为 IDLE、THNK、WORK、WAIT、DONE 等状态,并负责超时回收、状态保持、设备健康检查等逻辑。即使设备离线或 Bridge 异常,也不会影响 Codex 本身运行。
除了状态显示,我还实现了真实额度展示。由于目前没有适合该场景的公开 Usage API,因此直接读取本机 ~/.codex/sessions 中的结构化日志,从 token_count.rate_limits 提取 5 小时窗口和周额度使用情况,并实时显示在屏幕右侧。这样既不依赖私有接口,也不需要读取认证信息。
最后增加了声音提醒功能。当 Codex 进入 WAIT、DONE 或异常状态时,Bridge 会调用 AWTRIX 的 RTTTL 接口播放短提示音,避免频繁切换窗口查看执行进度。整个项目还补充了单元测试,覆盖状态映射、额度读取、显示生成以及声音触发等关键逻辑。
它只做一件事:
告诉我 Codex 现在在干什么。(效果理想)