跳到主要内容

oh-my-pi v15.10.2 发布 —— 40 多条修复,暴露了终端里那些你忍了很久的问题

· 阅读需 7 分钟

这些都不是段子——它们是 oh-my-pi v15.10.2 里一一被修掉的 bug。

oh-my-pi v15.10.2 封面

「断连」是最隐蔽的坑

先讲一个最容易被忽视的问题:代理流(proxy stream)断了会怎样?

过去的行为是——服务器断开且没发 doneerror 事件,oh-my-pi 默默返回一个零 token 的成功响应(stopReason: "stop"),看起来一切正常,但内容全空。调用 stream.result() 的代码挂着不返回,没人知道发生了什么。

v15.10.2 把它改成了抛 error 事件,带着 stopReason: "error",然后 resolve finalResultPromise。断连终于不再沉默,而是明明白白告诉你「出问题了」。

这跟你在 REST API 调用里遇到了网络错误但被告知 200 OK 是一个级别的麻烦。能发现这个 bug 本身,说明 oh-my-pi 在用户活跃场景下跑了足够久。

另一个同类问题:Anthropic provider 遇到账号级别 429("This request would exceed your account's rate limit"usage_limit_reached),旧代码把它当临时错误重试——2s、4s、8s 回退,重试循环跑完一遍还不够,streamSimple 的 a/b/c 策略再换一个 credential 来一遍……结果服务器早已告诉你「歇上几分钟再说」。你看到的就是那只转啊转的 spinner 从不停下来。修法很简单:加了一个 isUsageLimitError 识别,命中的时候直接 surface 到 credential-rotation 层——omp dry-balance --bench 面对限速账号秒出结果,不用挂着干等。

按键失灵感是怎么来的

v15.10.2 修了好几个跟「输入响应」相关的 bug,这些 bug 单看都很小,合起来就是一个个「电脑卡了」的错觉。

最典型的是 Ctrl+Z(挂起进程):oh-my-pi 注册了一个 SIGTSTP 信号处理来支持终端挂起/恢复。问题是,Windows 上没有 SIGTSTP——Bun 和 Node 在 JS 侧直接抛 TypeError: Unknown signal: SIGTSTP。这个异常从 TUI 输入调度器冒出来,成了未捕获的异常。修法:Windows 上直接 no-op 并报「此平台不支持挂起」,POSIX 上用 try/catch 兜住异常,失败时自动解注册 SIGCONT 钩子并重启 TUI。

Esc 取消操作也有毛病:你摁了 Esc,agent 同步发起了 abort,但 loader 还在那里显示 "Working…",看起来像是键盘没响应。原因是 agent 循环要等所有正在执行的工具都 settle 了(await Promise.allSettled(...))才会走到 agent_end 切换 loader——而 process/subagent 等工具有宽限期(SIGTERM → 2-3s → SIGKILL)。v15.10.2 在 Esc 触发的时候立即切换 loader 显示 "Interrupting…"(通过 EventController.notifyInterrupting),让你知道系统已经收到了你的指令,只是在优雅地收尾。

Windows ConPTY 还有一个「滚动位置幻觉」:长 session 重绘后终端的 viewport 停在顶部,不滚动到底部。原因是 ConPTY 在 write 超过约 32 KiB 后丢失了光标追踪——数据全写到了终端,但宿主 UI 不知道光标在哪。修法是 ProcessTerminal#safeWrite 把超大写入拆成 ≤ 8 KiB 的片段,这样每段 WriteFile 都保持在 ConPTY 能追踪的范围内。

内存里的那些悄悄话

oh-my-pi 有一个用 Memory 管理聊天历史的系统。当你对话历史增长、它自动做 compaction(压缩)的时候,发生过一件微妙的事:压缩后 session 还在,但历史不完整。

原因出在 Anthropic 的 empty toolUse stops without tool calls——模型输出了一串空的 tool 调用请求(没有真正的 function call),压缩时把相关的 turn 判定为冗余删除了,但模型依赖的上下文断了。v15.10.2 的修复会识别这种空调用,在重试之前就把这些孤立的 turn 处理掉。

还有一个更隐蔽的:OpenAI Responses 家族(包括 CodeX、Azure Responses)在处理 session 树分支时,上下文停在一个 tool call 上,后续请求报 400 No tool output found for function call——tool-result 在重建历史时丢了。修法是在未配对的 function_call / custom_tool_call 之后立刻合成一个占位 function_call_output / custom_tool_call_output,让模型能 recover。

MiniMax 的 tool call 也有问题——function.arguments 拆分到多个 delta 里传输时,每个 chunk 的 partialArgs 被覆盖(partialArgs = rawArgs 只保留了最后一个 chunk)。结果是一个 edit 调用,实际应用的 patch 只包含最后几个字符。浅合并修复了这个问题:对共享的 string key,用 startsWith 区分累积重述(取最新的)和分片 delta(拼接)。

平台兼容不是一句口号

v15.10.2 里有大量针对特定终端/系统的「微调」。不值得大惊小怪,但哪天你换了终端模拟器,这些改动就会变得非常关键。

Kitty 键盘协议有一个时序问题:终端的 DA1(主设备属性)响应先到达,触发了 modifyOtherKeys fallback,等 Kitty 的 CSI u 回复到了却被丢弃了。结果 Superset 和 Electron 上的 xterm 一直走 fallback,Shift+Enter 发的是裸 \r。修复后 DA1 sentinel 不再覆盖 Kitty 回复,Kitty 协议优先。

还有一个:Kitty 的 OSC 5522 粘贴模式的 DATA payload 格式是 mime="."(空格分隔的 MIME 列表),不是规范文档里写的按类型分包的 DATA 结构。原来只有后者的解析逻辑,现在两者都覆盖了。

Linux 上的剪贴板问题更有意思:arboard 在 Clipboard 实例销毁时终止了后台服务线程。每次 copyToClipboard 新建一个 Clipboardset_text 写完就析构——X11 选择器失去了所有者,关掉进程后粘贴返回空字符串。修法是 Linux 路径上为进程生命周期持有一个全局 Clipboard(macOS 和 Windows 继续用瞬态写入)。

日常操作的隐身修复

以下这些修了,但你可能永远不需要知道——除非你踩到过。

eval 的 JS worker 冷启动在 --isolate + 高并发下偶尔被终止:默认 5s 超时覆盖了 worker init 时间,而终止一个尚在初始化中的 Bun worker 是文档记录的 SIGILL/SIGTRAP 触发条件。现在 worker init 固定 15s 基础设施预算,eval test suites 设置 20s 文件级超时。

searchfind 以前不认带括号的路径——Next.js 风格的 apps/[id]/page.tsx 被解释为 glob pattern,触发 glob 展开后匹配不到。现在首选字面路径解释,文件存在就直接用,不存在才回退到 glob。

read 做了两件事:local:// 和绝对路径的双向可互换(让 plan mode 下用 read 返回的标签路径编辑不会再报「tag not found」),以及文件快照通过 realpath 键归一化来避免 macOS 上 /tmp vs /private/tmp 的符号链接分歧。

还有一个你大概率试过:用 omp --cwd repo 启动时,repo 是相对路径(比如在 /tmp 下跑)。旧代码正确 resolved 并通过 setProjectDir 做了 chdir,但 parsed.cwd 还存着原始字符串 "repo"。后续 buildSessionOptions 优先用 parsed.cwd,结果路径变成了 /tmp/repo/repo。修完以后 parsed.cwd 也在 chdir 后同步为绝对路径。

还有几十条类似级别的修复——MiniMax think tags 跨 provider 解析、IRC 子 agent 的 findings schema 注入抑制、read 的 PDF/DOCX 行范围选择器被忽略、hashline 行号前缀注入污染、browser 的 credentials 泄漏、lsp 引用搜索重试机制、lsp 重命名文件过滤——每一个都是有人在真实环境中碰到了才被发现。

升级

curl -fsSL https://omp.sh/install | sh
# 或用 Bun
bun install -g @oh-my-pi/pi-coding-agent
# 已安装用户
omp update

⚠️ npm 包与 GitHub Release 可能有短暂延迟,安装后运行 omp --version 确认版本号。

完整更新日志:GitHub Release

📢 关注我,获取最新开源更新日志和开发者工具动态。

#oh-my-pi #AI编程 #修复日志 #开源 #终端工具 #开发者体验