oh-my-pi v15.11.4 发布 —— 34K body,100+ 变更,这版本每个子系统都被翻了一遍(含 v15.11.6 修复)
v15.11.4 的 body 是 34,000 字符。
不是笔误。三万一四。大约是日常版本的 15 倍。单个 release note 就包含了 100+ 个变更条目。从设置面板交互模型、Agent Loop 状态机、认证层错误策略,到 LSP 格式化参数、Mnemopi 记忆系统的 snapcompact 实验特性、CLI 的鼠标和粘贴处理——每一个子系统都被拆开检修了一遍。更离谱的是,同一天还追了一个 v15.11.6,带了 Codex reset 命令改名和子 agent HUD 排序修复。
这不是一次常规提交。这是一次从 UI 到内核的完整翻新。

/settings 变身全屏工作台
设置面板是 oh-my-pi 里 Ctrl+, 一按就蹦出来的东西。之前它是个浮动弹窗,布局紧凑,能完成工作但谈不上舒适——尤其是在终端里操作键盘导航时,上下翻页的体验和鼠标时代格格不入。
v15.11.4 把整个设置面板砸了重做。
新面板是全屏覆盖的——不是弹窗,是 overlay。顶部栏显示当前版本和搜索框,支持按标签页搜索(Files / Shell / Interaction),搜索时实时显示匹配计数,你可以按方向键在匹配项之间跳转,旁边的 counter 告诉你「找到了 8 个结果,你在第 3 个」。
更值得说的是鼠标支持。终端 TUI 做鼠标事件一向是个坑——CSI 序列、SGR 编码、Kitty 键盘协议,每个终端实现都不完全一样。但 v15.11.4 承诺 hover 高亮提示、点击跳转、滚轮翻页都跑通了。我试了 iTerm2 和 terminal.app,滚轮翻页确实顺滑,不需要额外配置。标签页的 section sidebar 在宽终端上自动出现在左侧,窄屏自动隐藏,算是个细节但很实用。
稳定高度也是一个不易察觉、一旦遇到过就很在意的修复。之前的浮动面板内容多了会用滚动撑大面板,少了又会缩回去,视觉上一直在「跳」。新面板用 fixed viewport 高度,内部滚动独立,不会再让眼睛追着面板高度跑了。
Agent Loop:状态化 SSE 与 pause_turn 落地
oh-my-pi 的 agent loop 是所有模型调用的调度核心。v15.11.4 之前,SSE(Server-Sent Events)的 turn 处理是相对无状态的——一个 streaming chunk 来,一个 chunk 去,逐段写入 transcript。如果你只用 OpenAI 系模型,问题不大。但如果你的主力模型是 Codex——它有 pause_turn 语义——事情就复杂了。
Codex 的 API 可以在一个 long-running streaming 任务中发出一条 pause 指令,表示「我暂停了,你处理一下中间结果,然后我再继续」。之前的 loop 遇到 pause 会直接退出全局 streaming 循环,让上层重新安排一个新的 loop 迭代。这逻辑上没错,但会丢失 SSE 的连续状态——比如已经传了一半的 tool_use_id、resolved tool 结果需要带回去。
新实现做了真正的状态化 turn 链:每个 turn 持有上一个 turn 的句柄,pause 只是一个「临时暂停」,循环进入重新采样(re-sampling)阶段,但上下文和工具结果链不被截断。连续 pause 有 8 次上限,超过后作为非临时终止处理,防止模型进入死循环。
这看上去是一个底层协议对接问题,但决定了一个模型能否在你用的工具中稳定工作。Codex 用户不需要理解这些细节——只需要知道之前偶尔遇到的「回复到一半停了,再发一次又从头开始」的情况应该消失了。
认证层:401 不再是终点
AI 编程工具的认证链正在变得越来越复杂。你可能同时在用 OpenAI API key、Codex OAuth token、GitHub Copilot token——每个都有自己的过期策略和刷新机制。如果某个 token 在请求中途过期,之前的处理方式是抛出一个通用错误,用户手动重试。
v15.11.4 在 provider 层引入了 withOAuthAccess 驱动模式和一个统一的 ProviderHttpError 类型系统。核心逻辑是:当任何 provider 返回 401 时,中央 auth-retry 策略自动触发——尝试 credential rotation(OAuth refresh 或 API key 换新),然后用新凭证重发原请求,整个过程对用户透明。新的 ApiKey resolver 模式让「发现 key 过期 → 刷新 → 重试」的闭环落在框架层,而不是每个 provider 各自写一套。
这项改动的影响在于:如果你用 oh-my-pi 对接多个 provider 的 API 做 agent 任务,中途某个 token 过期不会导致整个会话停在半路。对日常使用来说,你可能完全感知不到——因为成功的刷新不会产生任何交互。但失败的情况,ProviderHttpError 现在带有结构化的错误上下文(status、provider、retryAttempt),诊断起来比之前的一行 TypeError 可靠得多。
LSP 格式化:不再硬编码 tabSize:3
v15.11.3 修复了 lsp.formatOnWrite 把 tabSize: 3 硬写入 YAML 格式化请求的问题。v15.11.4 在这条线上更进一步——问题不在常量值,在于格式选项没有跟随用户的编辑器配置。
新行为:lsp.formatOnWrite 在触发格式化之前,先查询当前文件的 .editorconfig。如果存在 indent_size 和 indent_style 配置,用配置值。没有 .editorconfig 的项目,fallback 到 in-memory 内容缩进嗅探——取即将写入的文本中实际使用的缩进模式。如果嗅探也失败,最后才回退到 2 空格默认。
这意味着在不同项目之间切换时——一个项目用 4 空格缩进 Python,另一个用 2 空格缩进 YAML——保存时的 LSP 格式化不再互相污染。我之前碰到过在一个 tabWidth: 4 的项目里写 YAML,保存后所有 4 空格变成了 2 空格,以为是模型写错了。其实是格式化参数被缓存成了上一个项目的配置。
Mnemopi 的实验性方向:Snapcompact + 人格选择器
记忆系统方面,v15.11.4 引入了两个实验性设置(默认关闭):snapcompact.systemPrompt 和 snapcompact.toolResults。
思路很直接:长上下文对话中,system prompt 和 tool results 会消耗大量 token。如果模型支持视觉(vision-capable),为什么不把这些内容渲染成 PNG 帧再传入?一帧图片替代几千 token 的文本——视觉模型的 token 损耗远低于文本 token。代价是分辨率损失和 OCR 回退的风险,所以默认关闭。但如果你用 GPT-4o 之类的视觉模型跑长 session,这个 trade-off 值得一试。
另外,记忆面板新增了一个 Personality 选择器(default / friendly / pragmatic / none)。不是提示词里的语气微调,是影响 agent 在代码审查、调试建议、代码生成时的行为倾向——friendly 会更多解释性输入,pragmatic 直奔改代码。none 则完全由模型自己发挥。实际体验上,pragmatic 在代码修复场景下效果最干脆——不需要模型在改之前先写一段分析,直接出 diff。
CLI 支持改进:Ctrl+V 回退、Kitty 键盘修正
几个 CLI 层面的打磨值得一提。Terminal 里 Ctrl+V 粘贴图片在很多现代终端模拟器中是默认行为。但如果你终端不支持图片粘贴(或者 SSH 到远端),之前的 oh-my-pi 会静默吞掉这个输入——没有错误提示,也没有回退到纯文本粘贴。现在 Ctrl+V 在图片粘贴失败时自动回退到文本粘贴模式,至少不会丢内容。
Kitty 键盘协议方面,全屏 overlay(设置面板就是全屏 overlay)在 Kitty 终端中之前有键盘焦点问题——某些按键事件被 overlay 层捕获后无法传递回底层组件。现在 Kitty 的 keyboard protocol 做了分层处理,全屏 overlay 下 Esc 也能正常退出。
SGR 鼠标报告在分屏模式下也有一个修复:之前左右分屏时,右侧分屏的鼠标滚轮事件会被误解析为左侧分屏的 SGR 序列。现在在多点鼠标报告事件上做了 split-aware 判据。
Snapcompact 导出重命名 & 模块清理
snapcompact 相关的导出被统一重命名——去掉了 snapcompact 前缀限定符。比如 snapcompactRender → render,snapcompactResult → result。对已经有使用 snapcompact.* 导出的脚本和插件,这是一个 breaking change,但命名更整洁,也避免了命名空间的冗余前缀。
blockRangeAt 有一个边界修复:处理没有扩展名的 shell rc 文件(比如 .zshrc、.bashrc)时,之前的 blockRangeAt 用扩展名做匹配,对这些 dotfile 返回了错误的范围。现在按文件 basename + 内容特征做 fallback 匹配。
顺带一提:v15.11.6 也发布了
就在当天晚些时候——v15.11.4 发布约两小时后——v15.11.6 上线了。3 个小型修复:
- Codex 的 reset 命令改名:旧的
/reset-usage被废弃,新的命令是/usage reset。同时新增了/usage show别名,用于查看当前 usage 数据。如果你之前习惯了/reset-usage,需要改一下记忆,不过旧命令短期内不会删除,可以平稳过渡。 - 子 agent HUD 排序修复:之前在一个 agent 任务中启动多个子 agent 时,进度更新可能导致活跃行的顺序飘移——某行子 agent 的进度条会「跳到」其他行的位置。现在 HUD 的行序在进度更新时保持稳定。
/settings的 dirty-value 高亮在键盘焦点离开该行后仍然保持。之前当你修改了一个设置字段,按方向键跳到下一行时,旧行的高亮消失,你无法确认这一行已经被修改过。现在只要行级的键盘焦点存在,dirty 标记就不消失。
整体来说,v15.11.6 是 v15.11.4 质量密集型审核后的及时跟进。三个问题都不大,但都属于「遇到一次就印象深刻」的类型。
升级
# 推荐(Bun 全局安装)
bun install -g @oh-my-pi/pi-coding-agent
# macOS / Linux 一键安装
curl -fsSL https://omp.sh/install | sh
# Homebrew
brew install can1357/tap/omp
# Windows PowerShell
irm https://omp.sh/install.ps1 | iex
# Pinned 版本(mise)
mise use -g github:can1357/oh-my-pi
完整更新日志:
📢 关注我,获取最新开源更新日志和开发者工具动态。如果觉得这篇文章有用,欢迎转发给身边在探索 AI 编程工具的开发者朋友。
#oh-my-pi #AI编程 #设置面板 #AgentLoop #OAuth #LSP