Skip to content

feat: 新增 --watch <session> 入口(四运行时),替代 scripts/watch.sh - #80

Open
lloydzhou wants to merge 1 commit into
mainfrom
feature/watch-entry
Open

feat: 新增 --watch <session> 入口(四运行时),替代 scripts/watch.sh#80
lloydzhou wants to merge 1 commit into
mainfrom
feature/watch-entry

Conversation

@lloydzhou

Copy link
Copy Markdown
Owner

概述

主程序新增 --watch <session> 入口(Bash/Go/Rust/C 四运行时一致实现):实时跟踪某个 session 的 events.jsonl,把新增事件送入与 --resume replay 相同的 display 渲染管线。替代 scripts/watch.sh 的单 session 场景。

行为定义(四端一致)

  • 用法:agent --watch <session>,参数支持三种形式(对齐原 watch.sh resolve_session):
    1. events.jsonl 文件路径
    2. session 目录路径(自动拼 /events.jsonl
    3. session_id(在 $BASH_AGENT_HOME/.bash-agent/projects 下递归查找同名目录)
  • 初始渲染最后 10 行已有事件作为上下文,之后 follow 新增完整行直到 Ctrl+C;不做全量回放
  • 找不到 session → stderr 报错 + 退出码 1
  • --output-format stream-json 下直接透传原始事件行(跳过 display 渲染)
  • 不需要 API key、不创建 session:watch 短路在 validate_config / API key 校验之前
  • 不写 events.jsonl,只读

各运行时实现

运行时 改动
Bash(基准) src/agent.shagent_watch_session 单函数仅 10 行,tail -f + 逐行有限 awk 管道(与 resume replay 同一 event_replay.awk 管线)+ display_stream
Go go/cmd/goagent/main.goreplayEvents 循环体抽为 renderEventLine 复用;新增 resolveWatchFile / completeLines / runWatch(500ms 轮询)
Rust rust/src/agent.rsdisplay_replay_event 抽为自由函数 replay_event_build / replay_parse_line 供 replay 与 watch 共用;main.rs 加参数解析与短路(500ms 轮询)
C c/agent.cagent_replay_events 循环体抽为 agent_render_event_line 复用;新增 watch_resolve / agent_watch_session(500ms 轮询);cagent.c 加参数解析与短路

关键设计说明

  • Bash 端为什么不是 tail -f | awk | display_stream 一条管道:awk 的 stdout 接管道时是 stdio 块缓冲(攒满 4KB 才 flush),tail -f 没有 EOF → awk 不退出 → 事件攒批才显示(macOS 自带 BWK awk 会在阻塞读 stdin 前 flush,掩盖了该问题;gawk/mawk 无此行为)。改为 tail -f | while read 逐行喂有限 awk 管道:每次调用进程退出即 flush,所有 awk 实现行为一致;read\n 交付完整行,天然避开写入中的半行;tail -f 自带"最后 10 行"上下文。
  • 渲染映射完全复用 replay 路径:Go/Rust/C 均通过抽函数实现零重复,不会出现 watch 与 resume 渲染漂移。
  • 本功能不涉及 system prompt / 请求体,无 KV cache 影响。

测试

  • tests/test.sh 新增 Test 52(三用例):不存在 session 退出码 1 + stderr;human 模式渲染已有事件;追加新事件后 follow 输出
  • 四端 e2e 串行全绿:Go 224/224、Rust 224/224、C 224/224
  • 手动验证:四端 --watch 同一真实 session 输出一致;bash 端验证 session_id 解析、最后 10 行截断、follow 实时性、stream-json 透传

移除

  • scripts/watch.sh 删除:单 session 场景由 --watch 替代;多 session tmux 分屏场景一并放弃

- Bash/Go/Rust/C 主程序新增 --watch 参数:实时跟踪 session 的 events.jsonl
  - 参数支持 events.jsonl 路径 | session 目录 | session_id(projects 下递归查找)
  - 初始渲染最后 10 行已有事件,之后 follow 新增事件直到 Ctrl+C
  - 渲染复用 replay 的事件→display 映射(bash 复用 event_replay.awk 管线;
    go/rust/c 抽出行级渲染函数与 resume replay 共用)
  - --output-format stream-json 下透传原始事件行
  - 不需要 API key、不创建 session(watch 短路在 validate_config 之前)
  - 找不到 session → stderr 报错 + 退出码 1(四端一致)
- bash 端用 tail -f | 逐行有限 awk 管道 | display_stream:
  tail -f 自带最后 10 行上下文;read 按 \n 交付完整行(避开半行);
  每行一次有限 awk 调用(与 resume replay 同一管线),进程退出即 flush,
  规避 awk stdout 接管道时的块缓冲(gawk/mawk 不自动 flush)
- 删除 scripts/watch.sh(单 session 场景由 --watch 替代,多 session tmux 场景放弃)
- tests/test.sh 新增 Test 52:不存在 session 退出码 1、初始渲染、follow 新增事件
- README/README.en/CHANGELOG 同步
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant