多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Token Monitor 架构深潜:Local-First 设计下,Collector 管线如何实现 3-5 秒实时刷新

Token Monitor 架构深潜:Local-First 设计下,Collector 管线如何实现 3-5 秒实时刷新 Token Monitor 架构深潜Local-First 设计下Collector 管线如何实现 3-5 秒实时刷新【免费下载链接】token-monitorLocal-first desktop widget for tracking token usage, costs, and limits across 43 AI coding tools—including Claude Code, Codex, Cursor, OpenCode, OpenClaw, and more—with multi-device sync.项目地址: https://gitcode.com/gh_mirrors/tok/token-monitorToken Monitor 是一款本地优先Local-First的桌面 Token 用量监控工具通过其 Collector 数据采集管线实时追踪 Claude Code、Codex、Cursor 等 43 款 AI 编程工具的 Token 消耗、成本与额度限制并承诺在文件变动后 3–5 秒内完成刷新。本文深入拆解这条数据管线的核心设计从文件监控、增量扫描到 Worker 线程卸载看看“实时”二字是如何被工程化兑现的。什么是 Local-First数据为什么留在这台设备上Local-First 的核心主张是单机使用不需要任何服务器。Token Monitor 的架构把这一点落到了四个入口点上入口文件角色桌面小组件src/electron/main.js你日常看到的 UI无头采集器src/agent/agent.js后台常驻采集不依赖窗口本地 Hubsrc/hub/server.js多设备聚合可选Cloudflare Workerworker/src/index.js免部署的云端 Hub可选关键在于四个入口共享同一套 src/shared/ 模块。当你选择local模式默认时采集完全走本地 IPC一个网络请求都不发只有在你主动开启多设备同步时Hub 才登场。这就是为什么 Token Monitor 的仪表盘可以在完全离线的笔记本上跑出完整功能Collector 管线数据流的四个角色整条管线的“总指挥”是 src/shared/collector.js约 3700 行它负责所有对 tokscale 扫描二进制的调用。配合它工作的还有三个协作角色文件监控器src/shared/watcherHost.js盯住~/.claude/projects这类会话目录AI 客户端一写日志就发事件增量计算器applyPeriodDelta()用“今日增量”推算“本月/历史总量”避免重复全量扫描用量 Workersrc/shared/usage/usageHost.js把扫描和会话归档这些重活搬到独立工作线程转换层src/shared/usage/usageTransform.js把原始扫描结果变成 UI 可直接渲染的摘要。一次刷新的完整旅程是文件变动 → 监控器事件 → 防抖 → 定向扫描 → 增量推算 → Worker 线程转换 → 推送渲染。下面逐层拆解。3–5 秒刷新承诺三层机制拆解第一层子进程文件监控1.5 秒防抖 5 秒上限监控层最微妙的部分在计时策略上collector.js 的scheduleTick()防抖 1500msAI 客户端写日志非常频繁先把零散事件合并成一波再扫避免每秒扫一次5 秒硬上限watchMaxWriteMs这是防抖的“天花板”。如果客户端持续高速写入纯防抖会永远推迟扫描有了上限最坏情况也保证 5 秒内必扫刻意不加冷却期代码注释直说——“产品承诺 3–5 秒更新冷却期会打破这个承诺”。还有一个鲜为人知的细节监控器运行在独立的 fork 子进程里而不是主进程。因为在 macOS 上 chokidar 会为每个被监控文件占用一个描述符填满后连子进程都拉不起来历史上的 #520 问题。把描述符隔离在子进程里UI 主进程才能保持流畅。第二层定向增量扫描只扫真正变了的分区全量扫描要串行跑--today、--month、--all-time三遍并行会让峰值 CPU/IO 翻三倍这是被 #15 事故教育过的教训。而 watch 触发的增量 tick 只做两件事只扫--today且只扫变动文件所属的客户端分区changed path → client 的映射多个分区合并成一次联合扫描用增量推算大窗口month applyPeriodDelta(anchor.month, today, anchor.today)。这个 delta 对追加型日志是精确恒等式不是估算——一旦锚点日期过期自动回退全量扫描。这意味着一次增量 tick 的开销 ≈ 一次小型--today扫描而不是三遍全量。第三层重活卸载到 Worker 线程一次 watch tick 的扫描后处理增量计算、合并、会话归档、投影有几十毫秒同步工作全量扫描还会同步读数百毫秒的会话文件头尾。如果这些跑在主线程上用户会每几秒感受到一次 UI 卡顿。解决方案是把 Collector 整条管线搬进 Node Worker 线程src/shared/usage/usageHost.jsWorker 内跑同一个collector 和 transform产出“已转换”的摘要直接回传主进程跳过二次转换同一时刻只有一个 Worker新实例必须等旧实例完全退出才启动杜绝两个采集器重叠扫描或竞争文件描述符失败自动降级Worker 崩溃则回退到进程内采集器并打印usage-worker-failed诊断事件。保障实时性的四个工程细节 细节解决的问题自同步节流selfSyncThrottle.jsCursor/Antigravity 的缓存目录只被自家同步写入监控它们会造成“同步触发监控、监控又触发同步”的自激循环WSL 冻结快照wslUsage.jsWindows 下 WSL 发行版只在全量 tick 时重扫两次全量之间使用冻结的wslAnchor保证增量锚点精确子进程生命周期栅栏subprocessTermination.jsSIGTERM只是“请求”被忽略则升级SIGKILL超时未确认则释放栅栏并拒绝迟到输出防止新旧 tick 死锁渲染层瘦身rendererStats()跨 IPC 的每份统计都会剥掉会话明细UI 需要时才按需拉取推送成本降到毫秒级更多跨运行时的契约细节分区不变量、轮询降级、发布批处理可在架构文档 docs/architecture.md 中逐条查阅各提供商的行为则记录在 docs/providers/ 下。动手体验三种模式随需切换想在自己的机器上验证这套管线三种模式由settings.hubMode一个开关决定Local默认纯本地采集体验 3–5 秒刷新的完整管线Client连接自建 Hub本机变成同步客户端SSE 流接收其他设备的增量Host内嵌 Hub一台机器即可搭建多设备聚合。配置与环境变量的完整说明见 docs/configuration.md 和 docs/API.md多设备同步的私有性边界见 docs/privacy.md。一句话总结Token Monitor 的 3–5 秒实时性来自一条被反复打磨的数据管线防抖 硬上限的监控保证“及时触发”分区定向增量扫描保证“扫得便宜”Worker 线程卸载保证“主线程不卡”Local-First则保证这一切都发生在你的设备上、零网络依赖。这四层机制叠加才让一个桌面小组件既跑得动 43 款工具的海量日志又不丢一次秒级更新。【免费下载链接】token-monitorLocal-first desktop widget for tracking token usage, costs, and limits across 43 AI coding tools—including Claude Code, Codex, Cursor, OpenCode, OpenClaw, and more—with multi-device sync.项目地址: https://gitcode.com/gh_mirrors/tok/token-monitor创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表