Agent Timeline v0.5.0
新增(双端)
- 接入第五家 agent:Grok Build(
~/.grok/sessions/<URL 编码的 cwd>/<uuid>/updates.jsonl)。
会话流是 ACP(Agent Client Protocol)通知,与既有四家都不同的三处,按本机
87 个真实 session / 27724 行实证定规则并写进docs/SESSION-FORMATS.md §3:timestamp是 unix 整秒(非 ISO8601),两端时间戳解析各走数值分支;- 文件内无任何 cwd 字段,项目名只能由目录名百分号解码后取末段
(F%3A%5C…%5Chawk-watcher→hawk-watcher;mac 的%2FUsers%2F…同理),
两端都先把\归一成/再取末段,保证同一份语料解出同一个项目名; - 结果行取
turn_completed之前最后一条agent_message_chunk——一轮内有多条
(实测 532 条对 57 个轮次),前面的都是工具调用之间的进度旁白;task_completed
是子任务完成,不是轮次完成,不可当结果行。 CanHandle锚定到updates.jsonl:同一棵会话树下并存 6 种.jsonl
(chat_history 91 / events 91 / updates 87 / rewind_points 81 / hunk_records 4 /
prompt_history 3),宽松匹配会把同一轮对话重复摄取(Kimi A1 同类教训)。- 实机验证:357 个
.jsonl中精确命中 87 个、其余 5 种零误匹配;88 条命令 /
57 条结果行,时间戳零越界、结果行零空串;本机时间线已点亮 12 个 grok 节点。
- 设置页 agent 顺序与命名统一为 Claude Code / Codex / Grok Build / Kimi Code / ZCode
(AgentKind声明顺序即展示顺序,mac 侧由allCases直接驱动)。zcode→ZCode
大小写对齐产品名;落库用的稳定键不变(仍是zcode),历史数据不受影响。
mac 侧新增AgentKind.settingsLabel,设置页标签统一取它,避免两端各写字面量而漂移。 - Grok 徽标色
#64748B(design tokens 三份同源副本已同步):xAI 品牌本身是单色,
四个饱和色里插一个中性石板色在 7px 徽标尺度最易区分,白字对比度 4.76 落在现有
3.1–4.7 同一档。
变更(内部)
- Windows 侧注入块前缀清单从
ClaudeParser私有字段提升为
ParserUtil.IgnoredPrefixes/IsIgnoredContent(与 macParserSupport同源),
各 agent 解析器共用一份,避免两端 L1 过滤集各自漂移。Claude 行为完全中性。
已知未决
- Grok 的编排器派发任务书当前不做过滤:本机 92 条用户消息中 85 条是子 agent
任务书,只有 3 条真人手打,且无协议级判据可与真人会话区分(结构逐字段相同);
其骨架是用户自有插件的私有约定,硬编码即过拟合。代价与三个可选项见
docs/TEXT-NORMALIZATION.md §4.2c,需用户拍板。
修复(双端解析一致性)
起因:四路解析器逐行对拍(每家 agent 一路 + 对抗验证 + 真实语料差分执行)与
Windows 侧跨端合并审计。共确认 17 处分叉/缺陷,全部修复。
- Kimi 子 agent 结果行串台(A1,正在污染时间线):
agents/agent-N/wire.jsonl与
main共用session_<uuid>目录名即共用 sessionId,而子 agent 的「问」是
system_trigger(已过滤)、「答」是普通content.part→ 结果行被挂到主会话的命令
节点上,代号词典也混入只源自子 agent 的条目。子 agent 整文件排除(与 Claude 侧
isSidechain同语义),并锚定完整路径形状。 - codex 会话身份不稳定(B1):被 resume/fork 的 rollout 在文件中途还会写入原会话
的session_meta,流式路径逐条重设、重启续扫却只读第 0 行 → 两条路径判出不同
sessionId;它参与节点 id/唯一键 → Windows 侧重扫会插出重复行(该端实测 257 组 /
514 行,判据为同source_file+同source_offset),两端共有的后果是结果行会挂到
另一个 rollout 文件的命令上。
⚠️ 发布后更正:本页原写「mac 用户库里已有 38 组 / 41 行重复」系判据错误——只比了
「同文件+同正文」,把用户在不同时刻的重复输入(「继续」10 次等)算成了缺陷产物。
mac 的nodes表无source_offset列,改用严格判据(同文件+同正文+同时间戳+
不同session_id,即同一物理行被解析两次)实测为 0 组:mac 不重扫已消费字节,
B1 在 mac 端只表现为结果行跨文件错配(已修),不产生重复行。代码修复本身不受影响。改为只应用本文件第一条 meta;
mac 261 个 rollout(含 55 个多 meta 文件)两路径不一致数 55 → 0。 - codex 首行重读截断在 16 KB:
session_meta首行常大于此(本机 260 个 rollout 里
169 个 >16 KB),读不到换行就整条放弃 → 重启续扫时项目名退化成codex。改分块读到
首个换行;真实语料 261/261 恢复真实项目名(修前 108 个文件退化)。 - codex 摘要器自摄取回路(Windows):摘要引擎解析到
codex exec时,win 把自己发出
的每条摘要 prompt 当用户命令收进时间线(其 rollout 写在~/.codex/sessions下,
路径匹配永远拦不住)。补整文件禁用,流式与重启续扫两条路径共用判定。 - codex 注入块泄漏(A2):
<task>是编排器给用户真实任务加的壳 → 去壳保留正文
(Windows 修前 37 个节点标题字面是<task>);<heartbeat>等 11 个标签整条跳过。 - 结果行退化成光秃秃的标题(A3):先剥前导标题行再取首段,剥后为空回退含标题原文
(永不写空串)。 - 时间戳容错两端都不对:mac 解析失败丢整行(丢命令)、win 回退「当前时间」(节点跳
顶且 ts 参与唯一键 → 重扫出重复行)。改共同规则:形态放宽 → 顺延本文件最近见到的
时间戳(任意行喂养基准)→ 无前值才丢弃。 - Claude 侧:L1 忽略前缀表两端统一(win 补 2 条并改不含
>匹配,此前
<user_instructions>等会变垃圾节点)、assistant 多段文本改为全拼接、无cwd行沿用
上下文项目名、queued_command与 codexuser_message补 trim(不 trim 会让同一条命令
两端连节点 id 都不同)。 - Codex 技能回显
[$plugin:skill](本机…SKILL.md)双端都剥本机路径(跨机无效且泄漏用户名)。
修复(Windows)
- 托盘右键菜单中文被截断——菜单项「显示 / 隐藏」实机渲染成「显示 / 隐」,
文字直接贴死右边框、无右内边距。根因不在内容测量而在宿主窗尺寸:
ContextMenuMode=SecondWindow把 MenuFlyout 放进 H.NotifyIcon 自建的
~145px 宽窗口,而 XAML flyout 无法超出所在 XamlRoot 的边界(GDI 实测该串
在菜单字号 14px 下自然宽 78px,项内可用文本区仅 85px 且还要扣快捷键列),
调MinWidth/Padding均无效。改用ContextMenuMode=PopupMenu(原生
Win32TrackPopupMenu),按文本自动定宽,CJK 不再截断(菜单 145→161px)。 - 随之修复:托盘菜单点击全无反应——原生模式下 H.NotifyIcon 只执行菜单项的
ICommand,无法触发 XAML 的Click路由事件(程序集里只有 ICommand/CanExecute
通路),四个菜单项原先全绑Click=故集体失效。改为绑Command;「总在最前」
取反基准从IsChecked改为App.Settings(原生菜单只单向读IsChecked画勾、
不回写,读它会永远取到旧值),并回写IsChecked保证下次开菜单勾选态正确。
实机四项逐一验证:显隐双向、开关双向 + 勾选同步、设置窗打开、退出且无残留图标。