在 openpi 0.5.0(npm @tt-a1i/openpi)+ pi 0.84.4(@earendil-works/pi-coding-agent)交互 TUI、WSL Ubuntu 环境下观察到。下文源码行号基于 0.5.0 的 extensions/git-info/index.ts,该文件与当前 main 分支逐字节一致(sha256 相同)。
观察到会话空闲且输入框为空时,我连续按了几次 ctrl+c(clear-context 扩展会把这种按键转成 /new,相当于连续多次会话替换)。之后状态区开始每 5 秒刷一条 ERROR,再新建会话也不会让它停止,直到退出 pi 进程。间隔正好 5.0 秒:
[09:48:01.969] ERROR (#3097): git-info background task defect Error: This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). ...
at ExtensionRunner.assertActive (.../pi-coding-agent/dist/bundle/chunks/chunk-OMWWHBTG.js:1078:25662)
at get cwd (.../chunk-OMWWHBTG.js:1078:27818)
at run (~/.pi/agent/npm/node_modules/@tt-a1i/openpi/extensions/git-info/index.ts:70:47)
[09:48:06.972] ERROR (#3097): git-info background task defect Error: This extension ctx is stale ... (同文,此后每 5 秒一条)
[09:48:11.971] ERROR (#3097): ...
复现步骤
前提:全局安装 openpi 0.5.0,pi 0.84.4,交互 TUI。目录是否为 git 仓库不影响结果(轮询在读取 ctx.cwd 时就被拦下,git 命令并未真正执行)。
- 启动 pi,等待空闲、输入框为空。
- 连续按 ctrl+c 数次(每次经 clear-context 触发一次 /new;手动连续输入 /new 也能达到同样的连续会话替换)。
- 观察状态区:从某一时刻起每 5 秒出现一条上述 ERROR,之后新建会话也不清除。
源码事实
从 0.5.0 的 extensions/git-info/index.ts 看:
- session_start 时 fork 一个每 5 秒轮询的后台 fiber(POLL_INTERVAL_MS = 5000,poll())。
- 每个 tick 使用闭包变量 currentContext 中的 ctx 发起 git 命令,第一个访问点是 run() 里的 ctx.cwd(第 70 行)。
- 会话替换后 pi 会把旧 ctx 置为失效并抛出这个错误(pi 的 extensions.md 要求 newSession/fork/switchSession/reload 之后不得继续使用捕获的 ctx),于是每个 tick 都在 ctx.cwd 处抛错。
- poll() 的管道用 Effect.catchDefect 把异常记成日志后继续,Schedule.fixed 让轮询进入下一轮,没有停止条件。
- 一处不对称:session_start 里对上一个轮询 fiber 做了 Fiber.interrupt,session_shutdown 里只是把 pollingFiber 置空并 dispose runtime,没有 interrupt。
影响
- 状态区每 5 秒刷一条 ERROR,不会自行停止。
- 这个轮询沦为空转,git 命令没有执行。
- 未观察到会话数据受到影响。
修复方向(供参考)
- session_shutdown 中先对 pollingFiber 做 Fiber.interrupt 再置空。
- 或者轮询 tick 捕获到这类 defect 时终止轮询,而不是记日志后继续。
如有推荐方向请说明,我会先按个人向提交补丁 PR。
在 openpi 0.5.0(npm @tt-a1i/openpi)+ pi 0.84.4(@earendil-works/pi-coding-agent)交互 TUI、WSL Ubuntu 环境下观察到。下文源码行号基于 0.5.0 的 extensions/git-info/index.ts,该文件与当前 main 分支逐字节一致(sha256 相同)。
观察到会话空闲且输入框为空时,我连续按了几次 ctrl+c(clear-context 扩展会把这种按键转成 /new,相当于连续多次会话替换)。之后状态区开始每 5 秒刷一条 ERROR,再新建会话也不会让它停止,直到退出 pi 进程。间隔正好 5.0 秒:
复现步骤
前提:全局安装 openpi 0.5.0,pi 0.84.4,交互 TUI。目录是否为 git 仓库不影响结果(轮询在读取 ctx.cwd 时就被拦下,git 命令并未真正执行)。
源码事实
从 0.5.0 的 extensions/git-info/index.ts 看:
影响
修复方向(供参考)
如有推荐方向请说明,我会先按个人向提交补丁 PR。