Skip to content

Agent Timeline v0.5.0

Choose a tag to compare

@github-actions github-actions released this 28 Jul 08:33
· 79 commits to main since this release

新增(双端)

  • 接入第五家 agent:Grok Build~/.grok/sessions/<URL 编码的 cwd>/<uuid>/updates.jsonl)。
    会话流是 ACP(Agent Client Protocol)通知,与既有四家都不同的三处,按本机
    87 个真实 session / 27724 行实证定规则并写进 docs/SESSION-FORMATS.md §3
    • timestampunix 整秒(非 ISO8601),两端时间戳解析各走数值分支;
    • 文件内无任何 cwd 字段,项目名只能由目录名百分号解码后取末段
      F%3A%5C…%5Chawk-watcherhawk-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 直接驱动)。zcodeZCode
    大小写对齐产品名;落库用的稳定键不变(仍是 zcode),历史数据不受影响。
    mac 侧新增 AgentKind.settingsLabel,设置页标签统一取它,避免两端各写字面量而漂移。
  • Grok 徽标色 #64748B(design tokens 三份同源副本已同步):xAI 品牌本身是单色,
    四个饱和色里插一个中性石板色在 7px 徽标尺度最易区分,白字对比度 4.76 落在现有
    3.1–4.7 同一档。

变更(内部)

  • Windows 侧注入块前缀清单从 ClaudeParser 私有字段提升为
    ParserUtil.IgnoredPrefixes / IsIgnoredContent(与 mac ParserSupport 同源),
    各 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 KBsession_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 与 codex user_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(原生
    Win32 TrackPopupMenu),按文本自动定宽,CJK 不再截断(菜单 145→161px)。
  • 随之修复:托盘菜单点击全无反应——原生模式下 H.NotifyIcon 只执行菜单项的
    ICommand,无法触发 XAML 的 Click 路由事件(程序集里只有 ICommand/CanExecute
    通路),四个菜单项原先全绑 Click= 故集体失效。改为绑 Command;「总在最前」
    取反基准从 IsChecked 改为 App.Settings(原生菜单只单向读 IsChecked 画勾、
    不回写,读它会永远取到旧值),并回写 IsChecked 保证下次开菜单勾选态正确。
    实机四项逐一验证:显隐双向、开关双向 + 勾选同步、设置窗打开、退出且无残留图标。