Skip to content

About

macOS 菜单栏常驻的 AI 编码工具监控面板 · 同时盯着 Qoder / ZCode / WorkBuddy 的速度、token、缓存命中与花费。原生 Swift,只读本机数据,不联网。

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Latest commit

 

History

3 Commits

Folders and files

Repository files navigation

AgentMonitor

macOS 菜单栏常驻的 AI 编码工具监控面板。同时盯着 Qoder / ZCode / WorkBuddy 三家, 显示当前会话与今日的速度、token 用量、缓存命中、上下文容量和花费。

原生 Swift + SwiftUI,单文件 monitor.swift,无第三方依赖,所有数据只从本机文件读取。

截图

AgentMonitor 面板

它能看什么

三家能拿到的数据不一样 —— 这不是实现偷懒,是三家的数据源本身差着代。面板会逐格标注 是真值、估算还是取不到:

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 数据

三家里 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

About

macOS 菜单栏常驻的 AI 编码工具监控面板 · 同时盯着 Qoder / ZCode / WorkBuddy 的速度、token、缓存命中与花费。原生 Swift,只读本机数据,不联网。

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages