macOS 菜单栏常驻的 AI 编码工具监控面板。同时盯着 Qoder / ZCode / WorkBuddy 三家, 显示当前会话与今日的速度、token 用量、缓存命中、上下文容量和花费。
原生 Swift + SwiftUI,单文件 monitor.swift,无第三方依赖,所有数据只从本机文件读取。
三家能拿到的数据不一样 —— 这不是实现偷懒,是三家的数据源本身差着代。面板会逐格标注 是真值、估算还是取不到:
| Qoder | ZCode | WorkBuddy | |
|---|---|---|---|
| 实时速度 | ACP 真值 / 桌面端估算 | 估算 | 估算 |
| 最近请求速度 | ACP 真值 / 桌面端 — | 真值 | 真值 |
| 会话平均速度 | 字符估算 | 真值 | 真值 |
| 首 token (TTFT) | — | 真值 | 真值 |
| token 用量 | 字符估算 | 真值 | 真值 |
| 缓存命中 | ACP 真值 / 桌面端 — | 真值 | 真值 |
| credits | 真值 | — | 真值 |
| 模型 / 工具用时 | 真值 | 真值 | — |
| 上下文容量 | 官方百分比 × 模型窗口 | 最近一次调用的 input_tokens | 数据库里的 used/size |
「实时速度」三家的实现思路一致:对客户端进程做 nettop 采样,经噪声门 / 尖峰门清洗后用
自校准系数(字节→token)换算,系数跟着真实调用自动校准,存在
~/Library/Application Support/AgentMonitor/。
Qoder 桌面端的「实时速度」目前走字符估算。原因是本机采样时,桌面端进程在生成期与空闲期的 入站字节重叠较大(一次 60 秒采样里,生成期中位约 1,300 B/拍,空闲期约 3,000 B/拍), 单靠字节率不容易稳定区分 —— 换机器或换负载表现可能不同,欢迎带采样数据提 issue。
全部只读,不联网、不上传。
ZCode
~/.zcode/cli/db/db.sqlite—model_usage表,token / 时长的真值~/.zcode/v2/provider_config.json— 各模型的contextWindow- 实时速度:
nettop采样 ZCode 进程网络字节
WorkBuddy
~/.workbuddy/projects/<cwd 转义>/<sessionId>.jsonl—message.usage,token 真值 (转义规则:cwd去掉开头的/,再把/换成-)~/.workbuddy/logs/<日期>/<cwd 末段>__<hash>.log— ModelProvider 打的First meaningful token received(ttft)与Stream completed(elapsed), 用requestId与转录条目的providerData.messageId精确配对 (2026-09-17 之前的转录把 requestId 直接写在条目id上,id作为回退保留)~/.workbuddy/workbuddy.db—session_usage的上下文占用、credits~/.workbuddy/sessions/*.json— CLI 进程 pid + 心跳,用于nettop -p精确定位
Qoder
~/.qoder/logs/sessions/<工作区>/<会话>/segments/*.jsonl—model.request.started/model.response.completed,模型用时的真值; 走 JetBrains/ACP 通道时还带真实 token 与缓存命中~/Library/Application Support/com.qoder.app.stable/main.sqlite—chat_session_context_usage(官方算好的上下文占用百分比与分类)、chat_model_preferences(各模型的context_window)~/.qoder/projects/<工作区>/<会话>.jsonl— credits~/Library/Application Support/com.qoder.app.stable/Local Storage/leveldb— 当前查看的会话
三家里 Qoder 的本地数据最少 —— 桌面端不在本地记录 token。本项目查过的位置:
| 位置 | 结果 |
|---|---|
segments 的 model.response.completed |
JetBrains/ACP 通道 100% 有值;桌面端约 0.4% |
转录的 message.usage |
1498 条里约 32 条非零 |
桌面端库 chat_session_context_usage |
tokenCountsAvailable: false |
chat_session_messages.payload_json |
没有 usage 字段 |
~/.qoder/shared_client/cache/db/local.db |
有 chat_message.token_info(含 cached_tokens), |
但那是 shared_client 服务写的路径,桌面端不走;本机实测该库最后写入停在 2026-09-15 |
因此目前:JetBrains/ACP 通道 = 真值;桌面端 = 字符估算(中文 0.8 字/token、其他 0.26)。
上下文容量用「官方百分比 × 模型窗口」推算,与 Qoder 官方 /usage 面板口径一致
(该面板数据来自服务端配额)。
另外 Qoder 各渠道都没有首包事件,所以 TTFT 拿不到;它的速度口径包含首字等待, 与另两家(首 token 之后才开始计时)不完全可比 —— 面板上做了标注。
如果你知道 Qoder 桌面端还有其他会走 shared_client 的入口,欢迎提 issue —— 那条路径上是带
token 和缓存命中的。
方式一:下载预编译包(推荐)
到 Releases 下载 AgentMonitor.zip,解压后把 AgentMonitor.app
拖进「应用程序」即可。要求 macOS 14+,含 arm64 + x86_64 通用二进制。
首次打开提示「已损坏」怎么办? 本程序没有 Apple 开发者签名(自用工具,不打算买 $99 证书),属于 ad-hoc 签名。 从网络下载的文件会被 macOS 打上隔离标记,于是被 Gatekeeper 拦下 —— 这不代表文件真的损坏。两种解法任选:
# 解法一:解除隔离标记(推荐) xattr -dr com.apple.quarantine /Applications/AgentMonitor.app解法二:在「访达」里右键点
AgentMonitor.app→ 选「打开」→ 在弹窗里再点「打开」。 只需做一次,之后正常双击启动。
方式二:从源码构建
./build.sh # 编译(arm64 + x86_64 合并为通用二进制)+ 打包 .app + ad-hoc 签名
open AgentMonitor.app
./package.sh # 需要对外分发时打 zip(自带签名与完整性校验)要求 macOS 14+、Xcode Command Line Tools。图标由 makeicon.swift 生成。
打发布包请用
./package.sh,别直接zip。macOS 会给文件加com.apple.provenance扩展属性,普通打包会把它变成一堆._*伴生文件塞进.app内部,撑破代码签名封条(codesign --verify报 a sealed resource is missing or invalid)。package.sh用ditto --norsrc --noextattr规避,并在出包后自动验证签名。
调试模式(不开界面,直接打印引擎对真实数据的计算结果):
./AgentMonitor --dump # 单次
./AgentMonitor --dump --force # 连采两拍,能看到实时速度读取本机三个 App 的数据文件与本机进程的网络计数。不发起任何外部请求,不上传任何内容。 只读,不修改这些文件。面板里出现的会话标题、项目路径都来自你本机,不会被发送到任何地方。
- Qoder 桌面端:本地数据里没有真实 token / 缓存命中 / TTFT(见上一节)
- WorkBuddy:本地数据里没有模型用时 / 工具用时的拆分
- ZCode:数据库里没有 credits 概念
- 「实时速度」是字节估算,带约 ±10~15% 误差;调用完成后会被落盘真值覆盖
- macOS 26.2 上面板背景是「定住」的:这是系统回归,不是本程序的 bug ——
NSGlassEffectView会把窗口背后的画面缓存成快照,面板弹出后无论后面怎么滚动、怎么切窗口 都不再刷新,玻璃里定住的就是弹出那一刻的背景。26.0 / 26.1 正常,Apple 论坛 thread 810314 有同样报告,暂无官方绕过。 玻璃的观感优先,所以明知这个回归仍然照用 Liquid Glass(想换成实时合成的毛玻璃, 把makePanel()里的NSGlassEffectView分支换成NSVisualEffectView即可)。 - 首次启动要扫当天的日志与转录(实测 7.6MB 日志 + 3.6MB 转录约 6~7 秒,跑在后台队列,不卡界面)
这类工具依赖各客户端本地的数据格式,客户端升级后可能失效。本机验证过的版本:Qoder 0.2.5 / ZCode 3.12.2 / WorkBuddy 5.5.6。遇到不适配欢迎提 issue,附上数据文件的目录结构即可。
本项目通过读取本机上述客户端的本地数据文件、以及本机进程的网络计数器来展示统计信息, 与这些客户端的官方无关,未获其授权或背书。所有数据仅在本机处理,不做任何上传。 客户端名称与商标归各自所有者所有。
MIT
