Skip to content

bug(git-info): 后台轮询在多次会话替换后每 5 秒持续报 stale ctx 错误 #400

Description

@L1nq0

在 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 命令并未真正执行)。

  1. 启动 pi,等待空闲、输入框为空。
  2. 连续按 ctrl+c 数次(每次经 clear-context 触发一次 /new;手动连续输入 /new 也能达到同样的连续会话替换)。
  3. 观察状态区:从某一时刻起每 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。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions