从原始日志到可视化时间线claude-devtools 消息四分类与 Chunk 构建原理深度剖析【免费下载链接】claude-devtoolsThe missing DevTools for Claude Code — inspect session logs, tool calls, token usage, subagents, and context window in a visual UI. Free, open source.项目地址: https://gitcode.com/gh_mirrors/cl/claude-devtoolsclaude-devtools 是一款免费开源的 Claude Code 调试可视化工具DevTools它读取你本机~/.claude/目录下的会话日志JSONL将原始消息流经过消息四分类与 Chunk 构建流水线最终还原成一条可交互的可视化时间线。本文将带你从零看懂这套核心机制哪些消息会被识别为用户输入、系统输出还是 AI 响应哪些会被当作硬噪音直接过滤以及 Chunk 是如何一步步被拼装成时间线上的每一块的。一、为什么 Claude Code 的原始日志必须四分类Claude Code 在终端里越来越沉默你看不到思考过程、工具调用的真实输入输出、子代理的执行细节。但它其实把一切都写进了本地日志文件——只是这些日志非常脏真正的用户输入、AI 回复、系统元数据全部混在同一条消息流里很多用户消息其实是命令行输出local-command-stdout、系统提醒system-reminder这类机器生成的内容还有一堆快照、队列操作等结构性条目对阅读毫无价值。如果直接把日志逐行渲染时间线会瞬间被噪音淹没。claude-devtools 的解法很清晰先分类再构建。所有消息先被 MessageClassifier.ts 判定归属再由 ChunkBuilder.ts 拼装成可视化的 Chunk分块最后渲染成时间线。二、消息四分类规则全解析谁上屏、谁过滤2.1 五类消息四类上屏 一类彻底过滤分类结果定义在一个简单的联合类型里domain.ts共五种分类含义处理方式生成 Chunk 类型user真正的用户输入右侧渲染UserChunksystem本地命令输出stdout/stderr左侧渲染中性灰样式SystemChunkcompact上下文压缩compaction的摘要标记作为边界块渲染CompactChunkai其余所有消息AI 回复、工具结果等聚合后左侧渲染AIChunkhardNoise系统元数据、提醒、空输出彻底丢弃永不渲染无四分类指的就是上屏的四种 Chunkchunks.ts 中Chunk被定义为用户、AI、系统、压缩边界四种类型的可辨识联合discriminated union这让前端可以按类型走完全不同的渲染逻辑。2.2 分类顺序的讲究为什么硬噪音最先判断分类的核心函数 categorizeMessage 是一个带优先级的 if 链先判硬噪音hardNoise——含system/summary/快照类条目、synthetic占位助手消息、只包裹了噪音标签的空消息、[Request interrupted by user]中断消息等见 isParsedHardNoiseMessage再判压缩摘要compact——必须在系统/用户之前判断因为它在 JSONL 里的外壳很容易与用户消息混淆然后判系统输出system——以local-command-stdout开头的消息再判真实用户输入user兜底归为 AIai。顺序不能乱一条消息可能同时满足多个条件比如既是 user 类型、又带系统标签优先级保证了每条消息只有一个归属。2.3 那些伪装成用户的系统消息日志里最反直觉的一点命令行输出在 JSONL 中的type字段是user。比如你执行/model切换模型回显的local-command-stdoutSet model to sonnet.../local-command-stdout就是一条用户消息。isParsedUserChunkMessage 通过检查内容是否以系统输出标签开头标签常量集中在 messageTags.ts来排雷并额外豁免了command-name开头的斜杠命令——因为/model这类命令确实是用户主动发起的算用户输入。而 isParsedSystemChunkMessage 则专门负责把带 stdout/stderr 标签的消息摘出来交给SystemChunk左侧渲染。三、Chunk 构建流水线一个缓冲—刷新的状态机3.1 主线程过滤与逐条分类buildChunks 是整个流水线的总指挥第一步是messages.filter((m) !m.isSidechain)过滤掉侧链子代理内部消息只保留主对话线程然后调用分类器对每条消息打标。3.2 缓冲—刷新AI 消息如何聚合成 Chunk核心逻辑是一个极简的状态机维护一个aiBuffer数组逐条遍历分类后的消息——遇到ai推进缓冲区遇到user/system/compact先冲刷缓冲区生成一个AIChunk再创建自己的 ChunkhardNoise直接跳过遍历结束冲刷残余缓冲区。这意味着 AI 回复天然是按用户输入分段的一次提问引发的所有助手消息、工具结果都被聚合进同一个AIChunk。而所有 Chunk 类型彼此独立、不强制配对时间线因此可以自由表达连续两条用户消息之间没有 AI 响应等边缘情况。3.3 稳定 ID、指标与语义步骤ChunkFactory.ts 负责生成单个 Chunk 对象有三个值得注意的细节稳定 ID用前缀-消息UUID生成generateStableChunkId文件变更重解析后 ID 不变UI 滚动位置和展开状态不会乱跳指标聚合每个 Chunk 独立汇总 token 用量、时长、消息数AIChunk 深加工buildAIChunkFromBuffer 会串联工具执行构建、子代理挂接、语义步骤提取、时间线空隙填充timelineGapFilling和上下文累计计算让每个执行单元都能标注此刻上下文窗口已用到多少 token。上图中左侧时间线里每一条 Thinking、Output、TaskCreate 都来自一个 AI Chunk 内的语义步骤右侧Visible Context面板则基于同一批 Chunk 的 token 归属数据展示了当前回合注入了哪些内容用户消息、CLAUDE.md 文件、工具输出、任务协调等以及各自占用的 token 数。四、从 Chunk 到时间线语义步骤、工具执行与瀑布图Chunk 只是粗粒度分块。要还原成用户看到的逐步执行细节还需要两层加工语义步骤SemanticStepSemanticStepExtractor.ts 把 AI Chunk 内的消息进一步拆成thinking思考、tool_call工具调用、tool_result工具结果、subagent子代理、output正文输出、interruption中断六类逻辑单元每个单元带独立的时间戳、时长与 token 归属SemanticStepGrouper.ts 再把微步骤按来源消息折叠成可展开的组。工具执行与子代理ToolExecutionBuilder.ts 通过tool_useID 把调用和结果配对并计算耗时ProcessLinker.ts 把 Task 调用派生的子代理进程挂到对应 AI Chunk 上支持并行子代理展示。最后buildWaterfallData 把所有 Chunk、工具调用、子代理按时间轴展开成瀑布图数据level 0 是 Chunklevel 1 是其内部的工具/子代理于是谁在什么时候干了多久、花了多少 token一目了然。五、新手快速上手三步查看自己的会话时间线获取项目如本地没有源码git clone https://gitcode.com/gh_mirrors/cl/claude-devtools cd claude-devtools运行安装依赖后启动 Electron 桌面版或使用 Docker 独立部署docker compose up浏览器打开http://localhost:3456。零配置、无需 API key它只读你机器上已存在的日志。观察分类效果打开任意会话你会看到用户消息靠右、AI 执行过程靠左的清晰时间线——这就是四分类 Chunk 构建的最终呈现。想要更宏观的视角还可以看它解析出的项目记忆面板六、总结回顾整条链路claude-devtools 的核心设计可以浓缩为一句话用优先级分类器把脏日志洗干净用缓冲—刷新状态机把消息流切成块再用语义步骤和瀑布图把块展开成时间线。分类规则集中在 MessageClassifier.ts 与 messages.ts标签常量见 messageTags.ts构建编排见 ChunkBuilder.ts单块生成见 ChunkFactory.ts完整测试用例覆盖五类消息与各类 Chunk 的生成边界在 ChunkBuilder.test.ts是理解规则细节的最佳素材。理解了这套四分类 Chunk 构建原理你再遇到任何日志可视化工具都能快速抓住它的设计骨架。【免费下载链接】claude-devtoolsThe missing DevTools for Claude Code — inspect session logs, tool calls, token usage, subagents, and context window in a visual UI. Free, open source.项目地址: https://gitcode.com/gh_mirrors/cl/claude-devtools创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
