黄奕彬

外部精选

omp · v18.15.0

本文来自外部来源,不是黄奕彬的原创文章。本站提供原文入口,并在采集端生成 AI 结构化摘要、解读与中文翻译(如有),一切以原文为准。

阅读原文(github.com)
来源
oh-my-pi (omp) releases ↗
作者 / 署名
github-actions[bot]
来源更新时间
本站收录时间
原文域名
github.com

以上时间均为北京时间;来源更新时间由来源提供,不代表首次发布时间。

结构化摘要 AI 生成

背景与问题

背景与问题:这是 oh-my-pi (omp) v18.15.0 的 GitHub Release 说明,面向 omp 的使用者与开发者,回答「从 v18.14.2 到 v18.15.0 变了什么、升级要注意什么」。

omp 由多个包组成:pi-agent-core、pi-ai、pi-catalog、pi-coding-agent、collab-web、pi-natives、snapcompact、pi-tui、pi-utils,覆盖 AI 编码代理、多模型接入、快照压缩与 TUI 渲染。发布说明假设读者熟悉这些包及上游服务(OpenAI/Codex、Anthropic、Google Vertex 等)。

方法或内容

方法或内容:发布说明按包分组逐项列出变更类型(Added/Changed/Fixed/Breaking Changes):

  • pi-coding-agent 条目最多,含新增、变更与大量修复
  • pi-ai、pi-agent-core、pi-catalog、pi-natives、pi-utils、snapcompact、collab-web 各列少量修复或新增
  • pi-tui 含一项破坏性变更及成组渲染重构

随后附 PR 级 What's Changed 列表、6 位新贡献者名单,以及 Full Changelog 链接(v18.14.2...v18.15.0)。

关键发现 / 结果

关键发现或结果:

  • 新增 Modular Cloud provider:/login modular 用 API key,模型与价格取自 models.dev;MiniMax M3.1 Flash、MiniMax M3、Gemma 4 31B 支持逐模型 reasoning 控制
  • 破坏性变更:GroupedLineContext.isUrl 被 url 取代(pi-tui)
  • 修复 Codex/OpenAI compaction replay 因后端内部 internal_chat_message_metadata_passthrough 元数据被拒
  • 修复 service_tier: "ultrafast" 在自定义 provider 被丢弃、/fast 拒绝 Ultrafast
  • 修复 Google Vertex Workforce Identity Federation ADC 刷新打到错误端点;修复后台 usage poll 的 invalid_grant 导致 Anthropic OAuth 自动登出
  • 后台长命令获一行说明(CreateAgentSessionOptions.jobCaptionWriter 可替换模型调用);后台任务在 /jobs、HUD 等处按用途命名
  • 修复约 40 层嵌套下 shell 因 1,024 文件上限静默停止
  • snapcompact 新增 viewWithoutFrames,无图像输入模型读 kept text 而非帧;可替换已含 archive 会话中的新 archive
  • 另有覆盖 LSP、浏览器工具、shell、缓存等约 40 余项修复;6 位贡献者首次贡献

结论与意义

结论与意义:本版本以修复为主、新增为辅,核心收益在 provider 兼容性(Codex replay、Ultrafast tier、Vertex ADC、Anthropic OAuth 凭据)、后台任务可读性、以及 snapcompact 与 TUI 行为修正。

对升级者最直接的边界是 pi-tui 的破坏性变更(isUrl → url),使用该 API 的代码需同步修改。原文未说明升级步骤、性能数据或总体性评价,仅逐项陈述变更。

AI 解读 AI 生成

方法:按「时空变量」分析(时间 / 空间 / 变量,严格区分包含、相关与因果),对象包括原文作者、署名人员与关键技术及其实际原理;结论用「元反空」(元思考、反思考、空思考、综合)整理。

时间:何时发生,现在是否仍成立

时间:来源日期为 2026-11-01 22:17:08(北京时间,对应 UTC 2026-11-01T14:17:08),即 v18.15.0 的发布时点;变更区间为 v18.14.2...v18.15.0。所列修复针对发布前的存量问题:已升级到 v18.15.0 或更高版本者多数修复应已生效。

涉及第三方行为的项(如 Codex 对未知参数的拒绝、DuckDuckGo 广告重定向格式)可能随上游变化再度失效,原文未说明后续版本情况。

空间:谁的环境 / 场景

空间:适用对象是安装或升级到 omp v18.15.0 的用户,尤其以下场景:

  • 使用 OpenAI/Codex replay、自定义 OpenAI 兼容 provider(含 ChatGPT 订阅前端的 relay)者
  • 使用 Google Vertex Workforce Identity Federation ADC、Anthropic 等轮换 token OAuth 账号者
  • 使用 SambaNova Cloud、新 Modular Cloud、models.yml 自定义模型者
  • 涉及 fuse-overlayfs 隔离任务、Rex 终端、Tern、ACP 客户端、TypeScript 7 tsc、rust-analyzer、本地听写、浏览器自动化的具体使用形态

破坏性变更仅影响调用 pi-tui 内部 API GroupedLineContext.isUrl 的代码。

变量:实际改变了什么

变量:相对 v18.14.2 的实际改变:

  • 新增:Modular Cloud provider 与 /login modular;snapcompact 的 viewWithoutFrames;pi-utils 的 abortable sleepUntil;pi-tui 一批渲染工具函数;后台任务一行说明与按用途命名
  • 行为变化:后台 usage 轮询不再禁用凭据,仅真实请求的 refresh 可以;嵌套 shell 耗尽文件句柄时报错并提示上限;SambaNova 多轮复用 prefix cache;bun check 按分支是否含 Rust 变更决定运行 Rust 半段;eval 内核重启后首格输出 Kernel restarted: 提示
  • 修复:compaction replay 元数据剔除、Ultrafast tier 保留、Vertex ADC 端点、OAuth 自动登出、/compact snapcompact 重复报告等
  • API 替换:GroupedLineContext.isUrl → url(破坏性)

区分:包含 ≠ 相关 ≠ 因果

区分:有明确因果证据的:后台 usage poll 的 token refresh 收到 invalid_grant 曾导致凭据被禁用(原文明确「usage polling no longer disables credentials」);replay 带上后端内部元数据导致 Codex 报未知参数;eval 内核死亡后新内核首格因缺少先前变量而 NameError。

属包含或同源关系的:pi-tui 新增函数与路径样式变更同属 #17608 一次重构;Modular Cloud 新增与 MiniMax/Gemma reasoning 控制同属 #17334。仅为归属关联的:贡献者名与各 PR 编号只是变更归属标注,与修复效果无因果关系。

原文未说明因果强度的:SambaNova prefix cache 复用带来的具体收益未给数据。

对象:作者/署名与关键技术原理

对象:署名为 github-actions[bot](GitHub Actions 自动化账号,来自结构化作者字段;原文未给出人工署名)。

正文各变更条目以(#编号 by @用户)形式标注贡献者(如 @briankeefe、@wolfiesch、@JustasMasiulis、@sjawhar、@will-bogusz、@roboomp 等),属变更归属信息,非本文署名。关键技术(按原文描述):

  • compaction replay:回放输入时剔除后端内部响应元数据(internal_chat_message_metadata_passthrough)
  • OAuth 轮换 token:后台 usage 轮询的 refresh 失败不再禁用凭据,仅真实请求的 refresh 可以
  • snapcompact:将会话压缩为 archive;viewWithoutFrames 让无图像输入的模型以 kept text 替代帧
  • fuse-overlayfs 隔离:卸载失败时报 fusermount 错误并保留工作区,不在活挂载下删除层
  • 后台任务说明:任务运行 15 秒后由 widget 模型角色一次性写出一行说明

元反空综合结论

元反空综合:元——这条内容本质在回答「omp 从 v18.14.2 到 v18.15.0 改了什么」,为升级决策与问题排查提供逐项依据,最关键的信号是唯一的破坏性变更与 provider 兼容性修复。

反——最可能失效或有边界的,是依赖外部服务行为的修复:Codex 对未知参数的校验、DuckDuckGo 广告重定向形态、Chrome 无初始标签页行为、/v1/models 的 service_tiers 报告,上游一变即可能复发;pi-tui 的内部 API 替换也提示这些接口非稳定承诺;原文未提供测试数据或回归验证。

空——去掉发布叙事后剩下的必要事实:一个版本号、约 50 项 PR 级变更、覆盖 9 个包、1 项破坏性 TUI API 变更、新增 Modular Cloud provider,以及 OAuth 凭据、compaction replay、LSP、浏览器工具、shell 等方向的具体修复,均附可追溯的 PR 编号与贡献者。

综合:这是一次以修复为主的维护性版本,可信度来自逐 PR 可追溯性;升级者应先核对 isUrl → url 的影响,再按自身使用的 provider 与工具链对号入座;其对后续版本的适用性原文未说明。

中文译文 AI 生成

@oh-my-pi/pi-agent-core

已修复

  • 修复了 OpenAI 远程压缩(/responses/compact)在重放时携带仅限后端的 internal_chat_message_metadata_passthrough 元数据、而 Codex 将其作为未知参数拒绝的问题(#17590,作者 @briankeefe)

@oh-my-pi/pi-ai

已修复

  • 修复了 Codex 对话重放因未知的 internal_chat_message_metadata_passthrough.content_token_count 参数而失败的问题,方式是在重放输入中省略后端内部的响应元数据(#17590、#17597,作者 @briankeefe)。
  • 修复了自定义 provider 上 OpenAI 系模型的 service_tier: "ultrafast" 即使被模型的 serviceTiers 列出仍被丢弃的问题(#17577,作者 @jakehemmerle)
  • 修复了使用 Workforce Identity Federation ADC 的 Google Vertex 请求在错误的 endpoint 上进行 token 刷新而失败的问题(#17447)。
  • 修复了 Anthropic(以及其他轮换 token 的)OAuth 账户在后台用量轮询的 token 刷新收到 invalid_grant 时被自动登出的问题,包括客户端委托给 auth broker 的刷新;用量轮询不再禁用凭据,只有真实请求的刷新才能做到这一点(#17468)

@oh-my-pi/pi-catalog

新增

  • 新增 Modular Cloud(modular)作为 provider:使用 API key 执行 /login modular,模型与价格来自 models.dev 的 modular 条目,并为 MiniMax M3.1 Flash、MiniMax M3 和 Gemma 4 31B 提供按模型的推理控制(#17334,作者 @tommyjtl)
  • SambaNova Cloud 的后续轮次现在会复用该 provider 的前缀缓存,多轮对话不再重复处理先前的上下文(#17555,作者 @rjuez00)

已修复

  • 修复了新发现的 OpenAI 兼容模型忽略 provider 上报的上下文与输出 token 上限的问题(#17561,作者 @wolfiesch)

@oh-my-pi/pi-coding-agent

新增

  • 较长或多步骤的后台 shell 命令现在会获得一行标题,说明它们做什么以及何时结束;当作业运行满 15 秒后显示在实时 widget 中或被 /jobs full 列出时,由 widget 模型角色为每个作业写入一次,作业面板与 /jobs full 会在作业用途下方显示它。
  • 它遵循 Live Job Widgets 设置(async.widgets),并且 CreateAgentSessionOptions.jobCaptionWriter 会替换该模型调用(#17649,作者 @wolfiesch)

变更

  • 在源码 checkout 中,HTML 导出查看器缺失时的报错现在会在 bun gen:export-viewer 之外同时指出构建它的脚本 packages/collab-web/scripts/build-export-viewer.ts(#17636,作者 @sjawhar)
  • 修复了当会话的 Python kernel 或 JS worker 在单元格之间死亡(崩溃、被 kill、因内存不足被 kill,或 JS 单元格被取消)后,eval 单元格在新的 kernel 上静默运行的问题:替换 kernel 上的第一个单元格现在会在其自身输出之前先带上 Kernel restarted: … state is unavailable. Re-run needed setup,而不是因先前单元格设置的变量而以一个裸的 NameError 失败(#17595,作者 @sjawhar)
  • 修复了尚在启动中的 task worker 在收到消息(写入 agent://<id>)时仅基于共享上下文运行、从未收到其 tasks[].task 分配的问题;该消息现在会等待分配轮到它(#17587)
  • lsp reload 现在能发现 rust-analyzer 启动之后创建的 Rust crate,因此无需重启 omp 即可使用 hover 与其他分析功能(#17658)。
  • 不具备图像输入的模型(GLM、DeepSeek、Grok Composer 等)在切换模型后、恢复会话时以及侧请求中,现在会读取 snapcompact 归档中被保留的完整文本,而不是其帧的图像省略占位符(#17510,作者 @will-bogusz)
  • 当压缩的是已持有一个归档的会话时,Snapcompact 不再以 “would not reduce context” 为由拒绝创建新归档(/compact snapcompact、空闲与预提示压缩)(#17490,作者 @will-bogusz)
  • /compact snapcompact 失败时现在只报告一次原因而不是两次,并指出应改用的 /compact 模式(#17490,作者 @will-bogusz)
  • 后台 bash 与 eval 作业现在会携带模型为该调用给出的用途:/jobs、/jobs full、proc:// 列表、wait 与作业结果,以及作业 HUD hover,都会将其置于原始命令行之前(#17649,作者 @wolfiesch)
  • task 工具与归档文档中的 seance 指引现在说明:关于先前会话的问题由 seance agent 回答,读取会话的原始 JSONL 仅属于狭窄的机械性检查,因此 consult 不再被 transcript 读取与重跑检查所重复(#17523,作者 @iacore)

已修复

  • 当模型的 provider 没有可用凭据(已登出、refresh token 过期,或 auth broker 未持有凭据)时,提示现在会切换到 retry.fallbackChains 中第一个拥有可用凭据的候选,而不是以 “No API key found” 失败,并在凭据恢复后的第一个提示时切换回来(#17559,作者 @wolfiesch)
  • 修复了手动 /compact 期间到达的后台结果在过期历史上开启新轮次或从已保存会话中消失的问题(#17599)。
  • 修复了 fuse-overlayfs 上的隔离任务在卸载遇到瞬时的 “Device or resource busy” 时保持 overlay 挂载且 fuse-overlayfs daemon 继续运行的问题;卸载失败现在会报告 fusermount 的错误,并保持 omp worktree 的工作区干净,而不是在活动挂载下删除其层(#17644)
  • 用量上限重试现在会将系统睡眠计入配额重置截止时间,而不是在倒计时归零后重新设置剩余运行时间延迟(#17606,作者 @zhiland)。
  • 修复了分配到 models.yml 中某个模型(其 id 与同一 provider 的内置模型仅大小写不同,例如 xiaomi/MiMo-V2.6-Pro 与 xiaomi/mimo-v2.6-pro)的角色被静默保持未设置的问题(#17580)
  • 修复了 Eval 的直接浏览器等待辅助函数(tab.waitForSelector、tab.waitForText、…)在传入更长的 { timeout } 时仍在 29 秒后放弃的问题;现在会遵循请求的超时,上限为浏览器工具的 300 秒(#17617)
  • 修复了使用全新自定义 Chrome profile 时 browser.open 在 Chrome 没有初始标签页的情况下失败的问题;现在它会打开自己的标签页,而不会导航已有标签页(#17583)。
  • 修复了 read 工具的重复输出提示在 xd:// 主题、MCP 资源以及其他拒绝选择器的 URL 上建议 path:A-B 选择器的问题(#17631)
  • lsp 工具现在会为未通过 package.json 安装的 TypeScript 7 tsc(例如 nixpkgs 软件包)启动 typescript-native(tsc --lsp --stdio),而不是让项目没有 TypeScript 服务器(#17659)
  • DuckDuckGo 在应用结果数量限制之前排除广告点击重定向,使其不会进入 direct 和 Public Web 来源(#17564 by @jasonharrison)。
  • 修复了 /fast 在自定义 OpenAI 兼容提供商上拒绝 Ultrafast("The current model does not offer the Ultrafast service tier")的问题,此类提供商的 /v1/models 行会在 service_tiers 中列出 ultrafast,例如 ChatGPT 订阅前方的中继(#17577 by @jakehemmerle)
  • 导入 SDK 不再接管嵌入宿主的信号与致命错误关闭;已注册的清理仍会在退出时运行(#17674)。
  • 修复了原生浏览器 page.waitForFunction 等待在全文档导航之后超时的问题,即使目的地匹配谓词也会如此(#17584)
  • 修复了在 ask 对话框的 "Other" 或备注提示打开时选取的 Ctrl+R 历史条目落入隐藏的主聊天输入框而非该提示的问题(#17565)
  • Bash 命令不再在 git config 设置了 sequence.editor 时卡在 git rebase -i 上(内联的 GIT_SEQUENCE_EDITOR=… 仍然优先),也不再卡在 Git Credential Manager 的 GUI/浏览器登录提示上(#17452 by @wolfiesch)
  • 修复了被拦截的 bash 命令先请求批准、随后无论如何都被阻止的问题(#17502 by @asuffield)
  • 修复了 omp --from-claude 依据第一个提示词列出经 /rename 重命名的 Claude Code 会话的问题;选择器现在会显示重命名后的标题,导入会话时也会保留该标题(#17361 by @namest504)。
  • 自动学习捕获回合现在复用主回合的 prompt 缓存,而不是在无缓存状态下重新发送整个对话:它们宣告与主回合相同的工具列表,并在不运行的情况下拒绝除 learn 和 manage_skill 之外的每一个调用(#17418 by @STRML)。
  • 修复了扩展无法用 registerMessageRenderer("async-result", …) 替换后台任务完成卡片的问题;已注册的渲染器现在拥有该卡片,且在没有注册任何渲染器、渲染器拒绝以及渲染器抛出异常时,内置行仍作为回退(#17372 by @AlexBrd999,来自 #14484 by @F0Rextasy;#14131)
  • 当语音模型反复跟不上时,本地听写会停止实时预览,因此最终转写不再等待在反复的预览之后(#17410)。
  • ACP 客户端现在会收到 _omp/compaction/start 和 _omp/compaction/end 通知(包括失败与取消),无需处于活动状态的 prompt。(#16969;#17384 by @SAKANA-MOONLIGHT)。
  • 修复了在 mise activate 或 zoxide init 安装了包装函数时,cd(以及 pushd/popd/z)在 agent shell 中报 command not found: __zsh_like_cd 象失败的问题:shell 快照现在会保留那些包装所调用的以下划线为前缀的辅助函数,而不是丢弃每一个看起来是私有的函数(#17448 by @KamijoToma)

@oh-my-pi/collab-web

变更

  • job 工具的结果现在以模型为每个后台任务给出的用途为其命名,若未给出则回退到其命令(#17649 by @wolfiesch)

@oh-my-pi/pi-natives

修复

  • 修复了在进程只能打开 1,024 个文件时,bash 工具的 shell 在约 40 层嵌套函数、eval 或 source 之后以状态 1 停止且无任何消息的问题;耗尽可打开文件的 shell 现在会说明这一点并指出要提升的限制(#17668 by @sjawhar)
  • bun check 现在会在你的分支在干净工作树上提交了 Rust 变更时运行其 Rust 部分,在仅含 TypeScript 的分支上跳过它(即使在 CI=true 下也是如此),并打印一行说明它执行了哪一种以及原因(OMP_FORCE_RUST_TASKS=1 总是运行它)(#17628 by @sjawhar)

@oh-my-pi/snapcompact

新增

  • 新增 viewWithoutFrames:无图像输入的读取器对归档所读取的内容,即以归档保留的文本代替其帧(#17510 by @will-bogusz)

@oh-my-pi/pi-tui

破坏性变更

  • GroupedLineContext.isUrl 被 url 取代,后者是某个 header 所指名、或某个正文行所属的内部 URL(#17608 by @JustasMasiulis)

新增

  • 为 render/render-utils 新增 FILE_NAME_COLOR、formatStyledPath 和 pathNameStart,用于工具正文和 Tern 文件行中的路径;为 tools/grouped-file-output 新增 createGroupedRowStyler、groupedLinkTargets、fitGroupsToBudget、groupsByFile 和 isMatchRow;为 tools/read 新增 splitReadQuery;为 tools/hashline-format 新增 HASHLINE_TAG_SUFFIX_RE。classifyGroupedLines 报告每个文件头部的完整 displayPath 与后缀,没有颜色的 TranscriptStatusPart 保留其已带样式的文本(#17608 by @JustasMasiulis)
  • JobsPanelJob.caption:jobs 面板的详情窗格会以弱化样式在该任务的用途与其命令之间显示它(omp.jobs.caption)(#17649 by @wolfiesch)

变更

  • 当模型说明了任务用途时,Background jobs 面板会以此命名每个任务,在详情窗格中把它显示在完整命令上方,并且对于不打印任何内容的任务,不再在空白小部件框中重复该命令(#17649 by @wolfiesch)
  • 工具输出中的文件路径共享同一种样式:暗色的目录和以自定义消息标签颜色(titanium 主题中为青铜色)显示的文件名,行位置与选择器(:1-175、:42:14、?q=)呈弱化样式。这涵盖 Grep、AST Grep、AST Edit、Glob、Find、LSP、诊断、分组的 Reads 以及文件提及;Glob 的文件夹图标与文件类型图标一样呈弱化样式,工具头部中的路径则保留其颜色(#17608 by @JustasMasiulis)
  • Grep、AST Grep 和 AST Edit 的结果以完整路径标注每个文件,而不是使用面向模型的 # dir/ 和 ## file#tag 头部,并且每个文件有自己独立的树分支。它们的折叠预览以相同方式适配相同的行数预算,会截短最后一个文件而不是溢出,并以 … N more matches 结尾(AST Edit 为 … N more files)(#17608 by @JustasMasiulis)
  • AST Grep 的匹配行链接到其所在行,与 Grep 的行为一致(#17608 by @JustasMasiulis)
  • LSP 诊断的严重性颜色改放在 [error]/[warning] 标签上而不是位置上,并且折叠的诊断行现在会显示该标签(#17608 by @JustasMasiulis)

修复

  • Rex 会话现在无需强制该协议即可渲染 Kitty 图形,包括仅有 TERM=xterm-rex 标识客户端的情况(#17651)。
  • 修复了折叠的 AST Grep 在其首个文件或文件夹高于预览区域时显示不出任何匹配项的问题,以及其 … N more 行统计的是隐藏文件夹而非隐藏匹配项的问题(#17608,由 @JustasMasiulis 完成)
  • 修复了折叠的 AST Edit 在首个文件的 diff 较长时溢出其预览区域的问题(#17608,由 @JustasMasiulis 完成)
  • 修复了 Tern 中搜索与诊断的文件路径丢失绝对路径开头的 / 以及文件夹自身 (…) 结尾的问题,以及 Tern 中 AST Edit 的 diff 在文件的 #tag 处丢失高亮的问题;以小写或其他长度的 #… 文本结尾的文件名会保留该结尾(#17608,由 @JustasMasiulis 完成)
  • 修复了对 URL 的读取在折叠的读取行中呈现为死文本的问题:其目标不是文件路径,因此没有为它构建链接,点击 URL 毫无反应。该行(以及分组读取的每一行)现在链接到 URL 本身,并为裸 www. 主机补上 https:// 前缀(#17598,由 @iacore 完成)
  • 修复了回放的转录记录忽略已注册的异步结果消息渲染器、导致回放的会话与实时会话渲染不一致的问题(#17372,由 @AlexBrd999 完成,源自 @F0Rextasy 的 #14484;#14131)

@oh-my-pi/pi-utils

新增

  • 新增可中止的 sleepUntil,用于涵盖系统休眠的挂钟截止时间等待,并以有界的计时器分片在恢复后重新检查截止时间(#17606,由 @zhiland 完成)。

修复

  • 在嵌入式宿主中导入 pi-utils 时不再安装进程级信号与致命错误处理器;退出时的清理仍会安装(#17674)。

变更内容

  • fix(ai): 从回放中剥离内部响应元数据,由 @briankeefe 在 #17590 完成
  • feat(tui): 在工具主体中共用一种路径样式,并以完整路径标注搜索文件,由 @JustasMasiulis 在 #17608 完成
  • feat(coding-agent): 按用途为后台任务命名,并为长命令加注说明,由 @wolfiesch 在 #17649 完成
  • fix: 移除失效的 export-map 条目,并让导出查看器的报错指明一条可用的命令,由 @sjawhar 在 #17636 完成
  • fix(iso): 以惰性方式重试 fuse 卸载,并在失败时保留工作区,由 @roboomp 在 #17645 完成
  • docs(review): 记录 /review 的用法以及自定义 reviewer 如何替换内置 reviewer,由 @haesol-shin 在 #17654 完成
  • style(robomp): 格式化 incoming-PR 审查设计文档中的 Python 示例,由 @sjawhar 在 #17661 完成
  • fix(lsp): 重启 rust-analyzer 以发现新 crate,由 @roboomp 在 #17663 完成
  • fix(lsp): 在没有 package.json 时对原生 tsc 保留 typescript-native,由 @roboomp 在 #17664 完成
  • fix(utils): 将进程处理器推迟到 CLI 启动,由 @roboomp 在 #17675 完成
  • feat(catalog): 添加 Modular Cloud 提供商,由 @tommyjtl 在 #17334 完成
  • docs: 解释 python 内存保留与手动重置,由 @aktanazat 在 #17353 完成
  • fix(coding-agent): 在导入选择器中显示 Claude 会话 sidecar 标题,由 @namest504 在 #17361 完成
  • fix(tui): 让已注册的渲染器接管异步结果卡片(取代 #14484),由 @AlexBrd999 在 #17372 完成
  • fix(acp): 转发自动压缩的生命周期通知,由 @SAKANA-MOONLIGHT 在 #17384 完成
  • fix(stt): 防止缓慢的预览延迟听写,由 @roboomp 在 #17414 完成
  • fix(coding-agent): 在 auto-learn 捕获轮次中复用主轮次的提示缓存,由 @STRML 在 #17418 完成
  • fix(coding-agent): 保留快照函数的依赖而不仅是公开包装器,由 @KamijoToma 在 #17448 完成
  • fix(ai): 支持 workforce ADC 令牌刷新,由 @roboomp 在 #17449 完成
  • fix(coding-agent): 阻止 git rebase -i 与 GCM 提示挂起 bash 命令,由 @wolfiesch 在 #17452 完成
  • fix(ai): 防止用量探测的 oauth 刷新导致凭据被禁用,由 @roboomp 在 #17469 完成
  • fix(coding-agent): 允许 snapcompact 替换其缩减过的归档,并在其拒绝时仅报告一次,由 @will-bogusz 在 #17490 完成
  • fix(bash): 在 BashTool.approval 中拒绝被拦截的与无效的调用,由 @asuffield 在 #17502 完成
  • fix(snapcompact,coding-agent): 向没有图像输入的模型提供 snapcompact 归档的文本而非其帧,由 @will-bogusz 在 #17510 完成
  • prompt: 将历史会话的问题发送给 seance 代理,由 @iacore 在 #17523 完成
  • feat(catalog): 跨轮次回放 SambaNova 的推理内容,由 @rjuez00 在 #17555 完成
  • fix(coding-agent): 当活跃提供商没有凭据时遍历重试回退链,由 @wolfiesch 在 #17559 完成
  • fix(catalog): 保留所发现模型的 token 上限,由 @wolfiesch 在 #17561 完成
  • fix(web): 排除 DuckDuckGo 的广告重定向,由 @jasonharrison 在 #17564 完成
  • fix(coding-agent): 将 ctrl+r 的历史选择路由到当前聚焦的 ask 提示框,由 @roboomp 在 #17567 完成
  • fix(ai): 向声明支持 Ultrafast 的 OpenAI 兼容中继发送 Ultrafast,由 @jakehemmerle 在 #17577 完成
  • fix(browser): 在全新的 Chrome 配置文件中打开自身标签页,由 @roboomp 在 #17586 完成
  • fix(browser): 在文档导航后恢复谓词等待,由 @roboomp 在 #17589 完成
  • fix(coding-agent): 解析因大小写而冲突的精确大小写 id,由 @roboomp 在 #17591 完成
  • fix(task): 防止早期的 irc 消息在分配前唤醒 worker,由 @roboomp 在 #17594 完成
  • fix(coding-agent): 在重启后的 eval 内核的第一个单元格上进行通告,由 @sjawhar 在 #17595 完成
  • refactor(ai): 共享回放元数据的清理逻辑,由 @briankeefe 在 #17597 完成
  • tui: 为读取行中提到的 URL 建立链接,由 @iacore 在 #17598 完成
  • fix(session): 在手动压缩期间保护异步投递,由 @roboomp 在 #17601 完成
  • fix(coding-agent): 系统休眠后恢复配额重试,由 @zhiland 在 #17606 完成
  • fix(browser): 在超出调用预算后仍遵守直接等待辅助函数的超时,由 @roboomp 在 #17621 完成
  • fix(scripts): 依据分支的 merge-base diff 判定 Rust 门禁,由 @sjawhar 在 #17628 完成
  • fix(read): 不再对无选择器的读取目标建议选择器,由 @roboomp 在 #17633 完成
  • fix(tui): 识别原生 Rex Kitty 图形,由 @roboomp 在 #17652 完成
  • fix(shell): 跨嵌套层级共享打开的文件,并在打开文件数上限耗尽时指明该上限,由 @sjawhar 在 #17668 完成

新贡献者

  • @briankeefe 在 #17590 完成了首次贡献
  • @tommyjtl 在 #17334 完成了首次贡献
  • @namest504 在 #17361 完成了首次贡献
  • @AlexBrd999 在 #17372 完成了首次贡献
  • @jakehemmerle 在 #17577 完成了首次贡献
  • @zhiland 在 #17606 完成了首次贡献

完整变更日志:v18.14.2...v18.15.0

展开原文提取正文(采集端自动提取,可能有缺失)

@oh-my-pi/pi-agent-core

Fixed

Fixed OpenAI remote compaction (/responses/compact) replaying backend-only internal_chat_message_metadata_passthrough metadata that Codex rejects as an unknown parameter (#17590 by @briankeefe)

@oh-my-pi/pi-ai

Fixed

Fixed Codex conversation replay failing with an unknown internal_chat_message_metadata_passthrough.content_token_count parameter by omitting backend-internal response metadata from replayed input (#17590, #17597 by @briankeefe). Fixed service_tier: "ultrafast" being dropped for OpenAI-family models on custom providers even when the model's serviceTiers lists it (#17577 by @jakehemmerle) Fixed Google Vertex requests with Workforce Identity Federation ADC failing token refresh against the wrong endpoint (#17447). Fixed Anthropic (and other rotating-token) OAuth accounts being signed out automatically when a background usage poll's token refresh got invalid_grant, including refreshes a client delegates to an auth broker; usage polling no longer disables credentials, so only a real request's refresh can do that (#17468)

@oh-my-pi/pi-catalog

Added

Added Modular Cloud (modular) as a provider: /login modular with an API key, models and prices from the models.dev modular entry, and per-model reasoning controls for MiniMax M3.1 Flash, MiniMax M3, and Gemma 4 31B (#17334 by @tommyjtl) SambaNova Cloud follow-up turns now reuse the provider's prefix cache, so multi-turn conversations stop re-processing earlier context (#17555 by @rjuez00)

Fixed

Fixed newly discovered OpenAI-compatible models ignoring provider-reported context and output token limits (#17561 by @wolfiesch)

@oh-my-pi/pi-coding-agent

Added

Long or multi-step background shell commands get a one-line caption saying what they do and when they end, written once per job by the widget model role when the job, after running 15 seconds, is shown in a live widget or listed by /jobs full; the jobs sheet and /jobs full show it under the job's purpose. It follows the Live Job Widgets setting (async.widgets), and CreateAgentSessionOptions.jobCaptionWriter replaces the model call (#17649 by @wolfiesch)

Changed

In a source checkout, the error for a missing HTML export viewer now names the script that builds it, packages/collab-web/scripts/build-export-viewer.ts, beside bun gen:export-viewer (#17636 by @sjawhar) Fixed an eval cell running silently on a new kernel after the session's Python kernel or JS worker died between cells (a crash, a kill, an out-of-memory kill, or a cancelled JS cell): the first cell on the replacement now carries Kernel restarted: … state is unavailable. Re-run needed setup ahead of its own output, instead of failing with a bare NameError on a variable an earlier cell set (#17595 by @sjawhar) Fixed a task worker messaged (write agent://<id>) while still starting up running on the shared context alone and never receiving its tasks[].task assignment; the message now waits for the assignment's turn (#17587) lsp reload now discovers Rust crates created after rust-analyzer started, so hover and other analysis work without restarting omp (#17658). A model without image input (GLM, DeepSeek, Grok Composer and the like) reads a snapcompact archive's full kept text instead of image-omitted placeholders for its frames, after a model switch, on resume and in side requests (#17510 by @will-bogusz) Snapcompact no longer refuses a new archive as "would not reduce context" when it shrinks a session that already holds one (/compact snapcompact, idle and pre-prompt compaction) (#17490 by @will-bogusz) A failed /compact snapcompact now reports its reason once instead of twice, and names the /compact mode to run instead (#17490 by @will-bogusz) Background bash and eval jobs now carry the purpose the model gave for the call: /jobs, /jobs full, proc:// listings, wait and job results, and the jobs HUD hover lead with it ahead of the raw command line (#17649 by @wolfiesch) The seance guidance in the task tool and the archive docs now say that a question about an earlier session is answered by the seance agent, and that reading the session's raw JSONL belongs to narrow mechanical checks only, so a consult is no longer duplicated by transcript reads and re-run checks (#17523 by @iacore)

Fixed

A prompt on a model whose provider has no usable credential (logged out, refresh token expired, or an auth broker holding none) now switches to the first retry.fallbackChains candidate that has one instead of failing with "No API key found", and switches back on the first prompt after the credential returns (#17559 by @wolfiesch) Fixed background results arriving during manual /compact starting turns on stale history or disappearing from the saved session (#17599). Fixed isolated tasks on fuse-overlayfs leaving their overlay mounted and the fuse-overlayfs daemon running when the unmount hit a transient "Device or resource busy"; a failed unmount now reports fusermount's error and keeps the workspace for omp worktree clear instead of deleting its layers under the live mount (#17644) Usage-limit retries now count system sleep toward the quota-reset deadline instead of re-arming the remaining uptime delay after the countdown reaches zero (#17606 by @zhiland). Fixed role assignments to a models.yml model whose id differs only by case from a bundled model of the same provider (such as xiaomi/MiMo-V2.6-Pro beside xiaomi/mimo-v2.6-pro) silently staying unset (#17580) Fixed Eval's direct browser wait helpers (tab.waitForSelector, tab.waitForText, …) giving up after 29 s when passed a longer { timeout }; the requested timeout is now honored up to the browser tool's 300 s cap (#17617) Fixed browser.open with a fresh custom Chrome profile failing when Chrome has no initial tabs; it now opens its own tab without navigating an existing one (#17583). Fixed the read tool's repeated-output notice suggesting a path:A-B selector on xd:// topics, MCP resources and other URLs that reject selectors (#17631) The lsp tool now starts typescript-native (tsc --lsp --stdio) for a TypeScript 7 tsc installed without a package.json, such as the nixpkgs package, instead of leaving the project with no TypeScript server (#17659) DuckDuckGo excludes advertising click redirects before applying result limits, keeping them out of direct and Public Web sources (#17564 by @jasonharrison). Fixed /fast refusing Ultrafast ("The current model does not offer the Ultrafast service tier") on custom OpenAI-compatible providers whose /v1/models row lists ultrafast in service_tiers, such as relays in front of a ChatGPT subscription (#17577 by @jakehemmerle) Importing the SDK no longer takes over the embedding host's signal and fatal-error shutdown; registered cleanup still runs at exit (#17674). Fixed raw browser page.waitForFunction waits timing out after a full-document navigation even when the destination matches the predicate (#17584) Fixed a Ctrl+R history entry picked while an ask dialog's "Other" or note prompt is open landing in the hidden main chat input instead of that prompt (#17565) Bash commands no longer hang on git rebase -i when git config sets a sequence.editor (an inline GIT_SEQUENCE_EDITOR=… still wins), or on Git Credential Manager GUI/browser sign-in prompts (#17452 by @wolfiesch) Fixed intercepted bash commands asking for approval before being blocked anyway (#17502 by @asuffield) Fixed omp --from-claude listing a Claude Code session renamed with /rename by its first prompt; the picker now shows the renamed title and importing the session keeps it (#17361 by @namest504). Auto-learn capture turns now reuse the main turn's prompt cache instead of re-sending the whole conversation uncached: they advertise the same tool list and refuse every call except learn and manage_skill without running it (#17418 by @STRML). Fixed extensions being unable to replace the background-job completion card with registerMessageRenderer("async-result", …); a registered renderer now owns the card, and the built-in row remains the fallback when none is registered, when one declines, and when one throws (#17372 by @AlexBrd999, from #14484 by @F0Rextasy; #14131) Local dictation stops live previews when the speech model repeatedly cannot keep up, so final transcripts no longer wait behind repeated previews (#17410). ACP clients now receive _omp/compaction/start and _omp/compaction/end notifications, including failures and cancellations, without requiring an active prompt. (#16969; #17384 by @SAKANA-MOONLIGHT). Fixed cd (and pushd/popd/z) failing with command not found: __zsh_like_cd in agent shells when mise activate or zoxide init installed wrapper functions: the shell snapshot now keeps the underscore-prefixed helper functions those wrappers call, instead of dropping every private-looking function (#17448 by @KamijoToma)

@oh-my-pi/collab-web

Changed

job tool results name each background job by the purpose the model gave for it, falling back to its command (#17649 by @wolfiesch)

@oh-my-pi/pi-natives

Fixed

Fixed the bash tool's shell stopping with status 1 and no message after about 40 levels of nested functions, eval or source when the process may open only 1,024 files; a shell that runs out of open files now says so and names the limit to raise (#17668 by @sjawhar) bun check now runs the Rust half when your branch commits a Rust change on a clean tree, skips it on a TypeScript-only branch even under CI=true, and prints one line saying which it did and why (OMP_FORCE_RUST_TASKS=1 always runs it) (#17628 by @sjawhar)

@oh-my-pi/snapcompact

Added

Added viewWithoutFrames: what a reader without image input reads for an archive, its kept text in place of its frames (#17510 by @will-bogusz)

@oh-my-pi/pi-tui Breaking Changes

GroupedLineContext.isUrl is replaced by url, the internal URL a header names or a body row belongs to (#17608 by @JustasMasiulis)

Added

Added FILE_NAME_COLOR, formatStyledPath and pathNameStart to render/render-utils for paths in tool bodies and Tern file rows; createGroupedRowStyler, groupedLinkTargets, fitGroupsToBudget, groupsByFile and isMatchRow to tools/grouped-file-output; splitReadQuery to tools/read; and HASHLINE_TAG_SUFFIX_RE to tools/hashline-format. classifyGroupedLines reports each file header's full displayPath and suffix, and a TranscriptStatusPart without color keeps its already-styled text (#17608 by @JustasMasiulis) JobsPanelJob.caption: the jobs sheet's detail pane shows it, muted, between the job's purpose and its command (omp.jobs.caption) (#17649 by @wolfiesch)

Changed

The Background jobs sheet names each job by what it is for when the model said so, shows that above the full command in the detail pane, and no longer repeats the command in an empty widget box for jobs that print nothing (#17649 by @wolfiesch) File paths in tool output share one style: a dim directory and the file name in the custom-message label color (bronze in titanium), with line locations and selectors (:1-175, :42:14, ?q=) muted. This covers Grep, AST Grep, AST Edit, Glob, Find, LSP, diagnostics, grouped Reads and file mentions; Glob's folder icon is muted like the file-type icons, and paths in tool headers keep their color (#17608 by @JustasMasiulis) Grep, AST Grep and AST Edit results label each file with its full path instead of the model-facing # dir/ and ## file#tag headers, and each file gets its own tree branch. Their collapsed previews fit the same row budget the same way, cutting the last file short rather than overflowing, and end with … N more matches (… N more files for AST Edit) (#17608 by @JustasMasiulis) AST Grep match rows link to their line, as Grep's do (#17608 by @JustasMasiulis) LSP diagnostics carry their severity color on the [error]/[warning] tag instead of the location, and collapsed diagnostic rows now show that tag (#17608 by @JustasMasiulis)

Fixed

Rex sessions now render Kitty graphics without forcing the protocol, including when only TERM=xterm-rex identifies the client (#17651). Fixed collapsed AST Grep showing no matches when its first file or folder was taller than the preview, and its … N more row counting hidden folders instead of hidden matches (#17608 by @JustasMasiulis) Fixed collapsed AST Edit overflowing its preview when the first file's diff was long (#17608 by @JustasMasiulis) Fixed search and diagnostic file paths in Tern dropping the leading / of absolute paths and a folder's own (…) ending, and AST Edit diffs in Tern losing highlighting to the file's #tag; a file name ending in lowercase or other-length #… text keeps it (#17608 by @JustasMasiulis) Fixed a read of a URL drawing as dead text in the folded read row: its target is not a file path, so no link was built for it, and clicking the URL did nothing. The row (and each row of a grouped read) now links to the URL itself, gaining an https:// scheme for a bare www. host (#17598 by @iacore) Fixed replayed transcripts ignoring a registered async-result message renderer, so a replayed conversation rendered differently from the live one (#17372 by @AlexBrd999, from #14484 by @F0Rextasy; #14131)

@oh-my-pi/pi-utils

Added

Added abortable sleepUntil for wall-clock deadline waits that include system sleep, with bounded timer slices to recheck deadlines after resume (#17606 by @zhiland).

Fixed

Importing pi-utils no longer installs process-wide signal and fatal handlers in embedding hosts; exit-time cleanup stays installed (#17674).

What's Changed

  • fix(ai): strip internal response metadata from replay by @briankeefe in #17590
  • feat(tui): share one path style in tool bodies and label search files by full path by @JustasMasiulis in #17608
  • feat(coding-agent): name background jobs by their purpose and caption long commands by @wolfiesch in #17649
  • fix: remove dead export-map entries and make export viewer errors name a working command by @sjawhar in #17636
  • fix(iso): retried fuse unmount lazily and kept workspace on failure by @roboomp in #17645
  • docs(review): document /review and how a custom reviewer replaces the bundled one by @haesol-shin in #17654
  • style(robomp): format the Python examples in the incoming-PR review design doc by @sjawhar in #17661
  • fix(lsp): restart rust-analyzer to discover new crates by @roboomp in #17663
  • fix(lsp): kept typescript-native for native tsc without package.json by @roboomp in #17664
  • fix(utils): deferred process handlers until CLI startup by @roboomp in #17675
  • feat(catalog): add Modular Cloud provider by @tommyjtl in #17334
  • docs: explain python memory retention and manual reset by @aktanazat in #17353
  • fix(coding-agent): show Claude session sidecar titles in the import picker by @namest504 in #17361
  • fix(tui): let a registered renderer own the async-result card (supersedes #14484) by @AlexBrd999 in #17372
  • fix(acp): forward automatic compaction lifecycle notifications by @SAKANA-MOONLIGHT in #17384
  • fix(stt): stop slow previews from delaying dictation by @roboomp in #17414
  • fix(coding-agent): reuse the main turn's prompt cache in auto-learn capture turns by @STRML in #17418
  • fix(coding-agent): keep snapshot function dependencies, not just public wrappers by @KamijoToma in #17448
  • fix(ai): supported workforce ADC token refresh by @roboomp in #17449
  • fix(coding-agent): stop git rebase -i and GCM prompts from hanging bash commands by @wolfiesch in #17452
  • fix(ai): kept usage-probe oauth refreshes from disabling credentials by @roboomp in #17469
  • fix(coding-agent): let snapcompact replace an archive it shrinks, and report its refusal once by @will-bogusz in #17490
  • fix(bash): deny intercepted and invalid calls in BashTool.approval by @asuffield in #17502
  • fix(snapcompact,coding-agent): give models without image input a snapcompact archive's text instead of its frames by @will-bogusz in #17510

prompt: send historical-session questions to the seance agent by @iacore in #17523

  • feat(catalog): replay SambaNova reasoning content across turns by @rjuez00 in #17555
  • fix(coding-agent): walk retry fallback chain when the active provider has no credential by @wolfiesch in #17559
  • fix(catalog): preserve discovered model token limits by @wolfiesch in #17561
  • fix(web): exclude DuckDuckGo advertising redirects by @jasonharrison in #17564
  • fix(coding-agent): routed ctrl+r history picks to the focused ask prompt by @roboomp in #17567
  • fix(ai): send Ultrafast to OpenAI-compatible relays that advertise it by @jakehemmerle in #17577
  • fix(browser): opened own tab in fresh Chrome profiles by @roboomp in #17586
  • fix(browser): resumed predicate waits after document navigation by @roboomp in #17589
  • fix(coding-agent): resolved exact-case ids that collide by case by @roboomp in #17591
  • fix(task): kept early irc messages from waking workers before assignment by @roboomp in #17594
  • fix(coding-agent): announce a restarted eval kernel on its first cell by @sjawhar in #17595
  • refactor(ai): share replay metadata sanitization by @briankeefe in #17597

tui: link the URL a read row names by @iacore in #17598

  • fix(session): guarded async delivery during manual compaction by @roboomp in #17601
  • fix(coding-agent): resume quota retries after system sleep by @zhiland in #17606
  • fix(browser): honored direct wait helper timeouts past the call budget by @roboomp in #17621
  • fix(scripts): decide the Rust gate from the branch's merge-base diff by @sjawhar in #17628
  • fix(read): stopped suggesting selectors on selector-free read targets by @roboomp in #17633
  • fix(tui): recognized native Rex Kitty graphics by @roboomp in #17652
  • fix(shell): share open files across nesting levels and name the open-file limit when it runs out by @sjawhar in #17668

New Contributors

@briankeefe made their first contribution in #17590 @tommyjtl made their first contribution in #17334 @namest504 made their first contribution in #17361 @AlexBrd999 made their first contribution in #17372 @jakehemmerle made their first contribution in #17577 @zhiland made their first contribution in #17606

Full Changelog: v18.14.2...v18.15.0

原文入口

阅读原文(github.com)

原文将在新窗口打开。收录时间不是内容更新时间;正文、译文与解读的版权归原作者/来源所有,本站仅作个人阅读辅助并保留原文入口;页面时间均为北京时间。

作者/署名来自原文结构化字段(Atom/RSS/HTML meta/JSON-LD;GitHub release 显示的是发布者账号),未经模型补充。

了解来源批准与收录规则