本地优先,不代表可直接公开
tokens 只读本地日志、不会上传数据。实时模式只在 127.0.0.1 上连接浏览器与本机进程;离线 Dashboard 则可能把敏感本地元数据复制进一个便于分发的 HTML 文件。
数据源
| 来源 | 默认日志模式 | 启用方式 |
|---|---|---|
| Claude Code | ~/.claude/projects/**/*.jsonl | 默认启用;或 --source claude |
| Gemini CLI | ~/.gemini/tmp/<hash>/chats/session-*.json | --source gemini |
| Codex | ~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl | --source codex |
| 可选 Claude Code Router | ~/.claude-code-router/custom-router.js | 文件存在时读取 |
路径由 config.py 基于当前用户主目录构造。读取器把三种日志格式归一化后交给聚合层。可选 Router 文件只在本机按文本读取,不执行、不上传;有限解析器只用于保守解释普通 Claude 请求档位别名,不影响 Gemini 或 Codex 模型名,无法支持的 JavaScript 保持不解释。
统一记录会涉及哪些字段
从当前读取、聚合和 Dashboard 逻辑可见,记录可包含日期/时间、来源、模型、输入/输出 token、缓存读写 token、总量、会话标识与工作目录等字段。终端和单期 HTML 主要呈现聚合结果;Dashboard 使用的范围更广。
out/session_summaries.json 是可选 sidecar,以会话标识映射摘要文本。Dashboard 的 Top 会话名称会优先使用它;没有时可能回退到从会话内容提取的标题或截断标识。文件缓存
缓存文件名为 records-v4.json,写入平台用户缓存目录:macOS 使用 ~/Library/Caches/ai-cli-tokens,Linux 使用 $XDG_CACHE_HOME/ai-cli-tokens 或 ~/.cache/ai-cli-tokens,Windows 使用 %LOCALAPPDATA%\ai-cli-tokens。项目按日志文件的修改时间与大小判断是否需要重读;当前用户的本地 Claude Code Router 文件签名也参与缓存失效;--no-cache 可强制刷新。
- 缓存与报告输出分离,不通过网络同步。
- 缓存是衍生数据,也应按本地日志同等敏感级别处理。
- 缓存通过临时文件原子替换,并在支持的平台设置为私有权限。
报告包含什么
终端报告
按期显示总 token、模型拆分与调用次数,不形成额外分享文件。
单期静态 HTML
包含聚合趋势、模型和来源分布、明细表、生成时间与启用来源。它不会嵌入原始会话正文。
交互式 Dashboard
tokens serve 与 tokens dashboard 使用相同的数据边界:前者只通过 127.0.0.1 向当前浏览器提供快照,后者把快照写入单文件。实时服务不启用 CORS、不提供目录浏览,也不返回日志路径或异常栈;页面请求之外不会把数据发送到局域网或互联网。
为了让项目与会话 Top 能在模型筛选或时光探针变化后重新计算,并支持会话回放、Token 流光图和项目透镜,payload 会携带更多聚合和标识信息,包括:
- 每期、每日、每模型与每小时聚合。
- 完整的日级项目聚合实体,包括短显示名与完整 cwd;并非只包含页面最终显示的 Top 项目。
- 完整的日级会话聚合实体,包括标题、token 总量与会话标识;并非只包含页面最终显示的 Top 会话。
- 可归属会话的逐轮 token 序列,但不嵌入逐轮正文;每个会话最多保留最近 200 轮。
- 用于还原成就范围内达成日期的紧凑日级 input、output、cache write、来源量与截至当日最大会话轮数;这部分不新增 cwd 或 session 标识。
- 可能来自 sidecar 或会话首条内容的自然语言标题。
out/dashboard.html 是单文件,复制方便,也意味着其中的本机元数据会被完整复制。不要未经审查上传到公开 Issue、网盘、静态站或聊天群。标识脱敏 Dashboard
tokens dashboard --anonymize 生成 out/dashboard-anonymized.html。脱敏发生在 payload 聚合前:完整 cwd、项目短名、原始会话标识、sidecar 摘要和会话文本标题不会进入报告。同一实体在本次报告内使用稳定别名,因此 Top、项目 → 模型 → 会话关系和逐轮回放仍能联动。每次生成使用新的随机密钥,密钥不会写入报告或缓存。
成就中心会在浏览器 localStorage 中保存版本化的稳定成就 ID、报告生成时间与有限的快照作用域,用于区分“本设备此前未观察到”;它不把该时间当作实际解锁日期,也不写入 cwd、session 或逐轮 token 序列。
Token 年鉴使用独立的 tk-almanac-v1 保存最多 8 个作用域、每个作用域最多 24 份身份无关紧凑快照,包括 snapshot ID、生成时间、覆盖日期、聚合总量、模型构成、个人纪录与赛季摘要。raw / anonymized、来源、范围、时区和指标版本彼此隔离;不会保存 cwd、session、标题、报告级匿名别名、逐轮序列或消息正文。模块内可以导出当前作用域或单独清除年鉴历史。导出 JSON 仍包含精确日期、模型和 Token 数值,因此分享前仍需审查;file: localStorage 的可用性和隔离方式也可能因浏览器而异。
脱敏版本仍保留精确日期、token 数值、小时分布、模型名、来源和逐轮 token 序列,因此属于假名化而不是完全匿名。模型名和经 Router 解析出的 backend 名不会被假名化;backend 名可能透露当前用户的本地路由配置,自定义模型名也可能包含组织语义,活动时间和数值序列则可能形成行为指纹。
Dashboard 的浏览器交互状态边界
Data Trail · 数据寻迹
Data Trail 直接复用 Dashboard 已经内嵌的日级项目、会话和 Context 构成数据,不增加新的 payload 字段,也不创建项目到会话的关联。项目证据与会话证据只是在同一范围和临时模型下分别聚合;相同或相似的显示名、标识或 Token 数值都不能被解释为已经证明的配对。
Signal Dock、Exactness 与对比
Signal Dock 的悬停 / 聚焦预览与点击固定、Exactness Key 的按住 / 固定状态、以及按住 C 或按钮触发的临时对比,都只存在于当前页面 JavaScript 内存。它们不创建新的 localStorage key,也不把项目或会话实体 ID 写入视图 URL。只有短按按钮后固定的幻影对比会以 compare=1 进入 URL;粒度、全局模型筛选、焦点日期和非自动主题仍沿用既有视图链接语义。
- 寻迹打开状态、当前步骤、已到达步骤、临时模型和证据分支只保存在页面 JavaScript 内存中。
- 寻迹或 Signal Dock 选择的项目 / 会话 ID 不写入 URL、localStorage、成就快照或 Token 年鉴。
- 复制视图链接只包含粒度、全局模型筛选、焦点日期、固定幻影对比和主题;不包含寻迹步骤、信号坞状态、精确层、按住对比、分支、cwd 或 session。
- Flow 的透镜高亮只沿真实的项目 → 模型和模型 → 会话聚合传播;两段关系不会被拼接成项目 → 会话配对。
- 从会话证据或 Signal Dock 打开回放时,回放保持原有报告范围与会话范围:不按临时寻迹模型或时光探针周期二次裁剪,每会话最多保留最近 200 轮。
- Context 构成保留 Fresh Input、Output、Cache Read、Cache Write 与 Other;Cache Read 是缓存 Token 读取量,不是已确认的货币节省,Other 是与来源 total 对齐后的剩余量。
dashboard.html 仍可能包含完整 cwd、session 标识、标题和逐轮 Token 序列;脱敏版本仍保留报告级假名、精确日期、模型、Token 和回放序列。数据体检与安全分享
Dashboard 的“数据可信度实验室”只使用计数、日期、来源和字段可用性,不额外复制 cwd、session 或自然语言内容。覆盖率的分母仅是读取器已经接受并标准化的记录;解析器拒绝的原始事件不在其中,因此不能把 100% 解读为源日志绝对完整或准确。Data Trail 在项目、会话或标准化组成不可用时复用这些能力原因;它不会把字段缺失解释为零。回放体检区分可归属 session 的记录与最终实际保留的逐轮值,每个会话最多保留最近 200 轮。复制体检摘要时也不会包含标识或逐轮 Token 明细;但摘要仍可能包含精确日期范围、来源、record 数和总 Token,因此仍属于本地开发元数据。
安全分享清单
- 优先分享终端汇总截图或重新制作的合成数据图。
- 必须分享 Dashboard 时,优先生成标识脱敏版本:
tokens dashboard --anonymize --since 2026-07-01 --until 2026-07-31 --source claude - 确认发送的是
dashboard-anonymized.html,而不是原始dashboard.html。 - 在文本编辑器中搜索用户名、主目录、项目名、客户名、仓库名、会话标识、摘要片段和自定义模型名。
- 评估精确日期、小时活动和逐轮 token 序列是否适合目标接收者;必要时缩小日期范围。
- 不要依赖“页面离线”“标识已替换”或“数据体检”为全景数据来推断“完全匿名”或“绝对准确”。
- 删除或妥善保护
out/下不再需要的报告、缓存与摘要 sidecar。
本站如何避免泄漏
仓库中的 docs/ 只包含手写说明和合成演示数据,不读取、复制或嵌入 out/dashboard.html。自动测试会阻止常见本机绝对路径、用户名以及典型 UUID / session 标识出现在文档文件中。
查看架构可了解数据从读取到输出的边界。