黄奕彬

外部精选

omp · v18.16.0

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

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

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

结构化摘要 AI 生成

背景与问题

背景与问题:这是 omp(oh-my-pi)v18.16.0 的发布说明,面向该工具的使用者与下游开发者,说明 v18.15.0...v18.16.0 之间的全部变更。

核心问题包括:对无已知 tokenizer 的模型(Gemini、Grok 等)此前按每 token 猜 4 字节估数,少算了 11–48% 的计费量并使 compaction 晚触发;另有一批浏览器控制、导出内存、数据库损坏、状态符号一致性等缺陷待修复。

发布按 @oh-my-pi 系列子包逐一列出 Added / Changed / Fixed / Removed 与 Breaking Changes。

方法或内容

方法或内容:按包组织的 changelog:

  • @oh-my-pi/pi-agent-core:废弃 compaction 下 6 个文件操作 API,改为再导出 @oh-my-pi/snapcompact;修复 tokenizer 估数;移除 PI_TOKENIZER_ACCURATE。
  • @oh-my-pi/pi-ai:新增 /login mistral 浏览器登录与 dropsForeignReasoningPayload() 等接口;修复回退模型策略。
  • @oh-my-pi/pi-catalog:新增 Factory Droid 模型、Scaleway 供应商、按日费率卡。
  • @oh-my-pi/pi-coding-agent:全局 Hindsight 记忆、btw.inject、OTLP 指标、/review 任意目录评审及大量修复。
  • pi-natives、snapcompact、omp-stats、pi-tui、pi-utils、pi-wire 各有增改;末尾附全部 PR、新贡献者与 Full Changelog(发布页)。

关键发现 / 结果

关键发现或结果:

  • 估数修复:无已知 tokenizer 的模型改按 o200k_base 计数(此前按 4 bytes/token 在 code-heavy 会话少算 11–48% 且 compaction 晚触发);GPT-3.5 / GPT-4 (Turbo) 改用 cl100k_base;所有模型用原生 tokenizer,PI_TOKENIZER_ACCURATE 移除。
  • 估数不再把 reader 的 thinking signatures / redacted thinking 计为文本(Claude 会话切到 Grok/Gemini 时此前会多算)。
  • /login mistral 走 Mistral Vibe 浏览器登录,用量计入套餐 Vibe Code 配额而非按量 API 额度;MISTRAL_API_KEY 仍可用。
  • 目录新增 Factory Droid droid 1.1.0 所服务的模型(GPT-6.1 Terra、GPT-6.1 Sol Ultra Fast、Nemotron 3.5 Super、Muse Spark 1.2、Beam 1.0 等)与按日信用费率卡(现含 GPT-5.6 Sol、Gemini 3.7/3.8 Flash)。
  • 新增 Scaleway Generative APIs 供应商:12 个 serverless 聊天模型,默认 glm-5.3。
  • 修复:omp --export 大会话 Out of memory(改为流式写盘);Linux 上 ~/.omp/agent/agent.db 被并发读取导致损坏(OFD 锁 shim);会话恢复保留消息原日期,避免 Claude 丢弃 thinking 并错过 prompt cache。
  • 新功能:composer 预测最多返回 4 个候选(composer.predictionAlternatives,默认关);hindsight.globalScope、btw.inject 均默认关。

结论与意义

结论与意义:本版本的主要价值在于跨模型计费准确性(tokenizer 修复)、模型目录与登录方式扩展、TUI 状态符号统一,以及大量浏览器/会话/存储稳定性修复。

适用边界:升级需注意 Breaking Changes(buildExecutionFrame 边框自理、buildStatusFooter 不再收 status/exitCode、Editor.prediction 被 Editor.predictions 取代)与废弃 API(pi-agent-core/compaction 的 6 个导出、各模块 formatError、asStrict),调用方应直接从 @oh-my-pi/snapcompact、auth-gateway/http、@oh-my-pi/pi-utils 引入。原文未说明旧配置的迁移细节与已知遗留问题。

AI 解读 AI 生成

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

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

时间:来源日期为 2026年11月3日 03:49(北京时间),即北京时间 2026-11-03 03:49:20;正文未给出各变更的独立时间线,仅以 PR 编号关联。所列内容对应 v18.15.0...v18.16.0 区间,在发布时点成立。时效性主张(如 Factory 促销费率、droid 1.1.0 模型列表)随外部服务变化,现在是否仍成立原文未说明。

空间:谁的环境 / 场景

空间:适用于 omp v18.16.0 的使用者及基于其子包开发的下游。场景包括:

  • CLI/agent 使用(omp -p、omp --resume、omp --export、/review、/btw)。
  • 浏览器自动化(Chrome relay、cmux tabs、iPhone Mirroring、macOS 前台应用)。
  • 多供应商模型调用(Claude、Gemini、Grok、Factory Droid、Mistral Vibe、Scaleway)。
  • 部分修复平台特定:Linux(SQLite OFD 锁、无可用 /proc 的容器/chroot、installSqliteLockShim())与 macOS(macOSFrontApp()、iPhone Mirroring、Ghostty/kitty 键盘协议)。

变量:实际改变了什么

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

  • 行为:无 tokenizer 模型改用 o200k_base 估数;GPT-3.5/GPT-4 用 cl100k_base;PI_TOKENIZER_ACCURATE 移除;ASCII 状态符号统一为三列宽([+]、[-]、[#]、[ ])。
  • 结构:pi-agent-core/compaction 6 个导出改为再导出 @oh-my-pi/snapcompact;Editor.prediction→Editor.predictions;buildStatusFooter 签名变更。
  • 目录/数据:新增 Factory Droid 新模型与按日费率卡;新增 Scaleway 供应商。
  • 展示修复:促销期模型浏览器显示实际生效费率(GPT-5.6 Sol 此前显示 2× 而非 1.6×),并显示下一费率及日期。
  • 默认值:hindsight.globalScope、btw.inject、composer.predictionAlternatives 默认关闭。

区分:包含 ≠ 相关 ≠ 因果

区分:明确因果(原文直接陈述)——按 4 bytes/token 猜测 → 少算 11–48% 并使 compaction 晚触发;切换到 Grok/Gemini 的 Claude 会话把会被请求剥离的 thinking signatures 计为文本 → 估数偏高;恢复会话首条消息带当天日期 → Claude 丢弃此前 thinking 且错过 prompt cache;HTML 流式写盘 → 解决 Out of memory;OFD 锁 shim → 其他关闭操作不再释放本进程 SQLite 锁。

仅相关/归属:各 PR 编号与变更条目是归属关联,非因果;Factory 促销与信用费率的关系原文称『费率跟随 Factory 促销』属机制描述,具体促销起止日期原文未说明。

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

对象:署名仅为结构化作者字段中的 github-actions[bot](自动化发布账号),无人类署名;正文在 PR 条目列出的贡献者 handle(@will-bogusz、@apullin、@wolfiesch、@JustasMasiulis、@H4vC、@roboomp 等)是归属信息,不构成署名。关键技术按原文描述:

  • Tokenizer 估数:无已知 tokenizer family 的模型按 o200k_base 计 token;models.yml 可为自定义模型写 tokenizer: cl100k。
  • 压缩(snapcompact):归档可带 reasoning legend,viewSummary() / archiveIncludesThinking() 处理无 legend 的摘要。
  • SQLite 锁:Linux 上 installSqliteLockShim() 将 Bun 的记录锁换为 open-file-description 锁。
  • 浏览器 relay:经 Chrome relay 控制标签页,调用超时可到协议上限 60 s(此前 20 s 即失败)。
  • 预测:Editor.predictions 按可能性排序返回多个候选(最多 4 个),Tab 键可切换。

元反空综合结论

元反空综合:

  • 元:这条内容本质在回答『v18.16.0 改了什么、为什么值得升级、升级有什么兼容风险』,服务于版本决策与变更追踪。
  • 反:最可能失效或有边界的主张——Factory Droid 的模型列表、促销费率(如 GPT-5.6 Sol 的 1.6×)与 droid 1.1.0 绑定且随 Factory 促销变化,时效性强;『少算 11–48%』限定于无已知 tokenizer 的供应商与 code-heavy 会话,不是普适数字;浏览器修复依赖具体 Chrome、终端与平台环境。
  • 空:去掉叙述后的必要事实——这是一份多包版本发布,含明确的 API 废弃与 Breaking Changes(下游需改代码)、一批可复现修复(tokenizer 计数、导出内存、数据库损坏、浏览器输入泄漏)、若干默认关闭的新功能;全部条目可追溯到具体 PR 编号。
  • 综合:这是一份信息密度高、结构规整的自动化 changelog;对用户最有价值的是计费准确性修复与升级兼容风险提示,对第三方模型/费率信息应视为发布时点的快照而非长期事实引用。原文未说明未列入 changelog 的内部变更及已知未修复问题。

中文译文 AI 生成

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

变更

  • 已弃用 @oh-my-pi/pi-agent-core/compaction 中的 createFileOps、computeFileLists、formatFileOperations、upsertFileOperations、isUrlSchemePath 和 FileOperations;它们现在重新导出自 @oh-my-pi/snapcompact,调用方应直接导入后者

修复

  • 对于没有已知 tokenizer 家族的模型(Gemini、Grok 等),以及在没有模型的情况下进行的 token 计数(compress 指标、旧的 estimateTokens 导出),上下文估算现在使用 o200k_base 计数文本,而不是猜测每 token 4 字节;后者在代码密集的会话中会比这些提供商实际计费的数量少算 11–48%,并且导致切换到它们之后压缩过晚触发(#17607,由 @will-bogusz 提供)
  • 上下文估算不再让读取者为另一模型的 thinking 签名或 redacted thinking 计入用量,因为请求会剥离这些内容:切换到 Grok 或 Gemini(包括通过 Factory 使用 Gemini)的 Claude 会话此前把它们计为文本(#17607,由 @will-bogusz 提供)

移除

  • 移除了 PI_TOKENIZER_ACCURATE:现在每个模型都使用原生 tokenizer 计数(#17607,由 @will-bogusz 提供)

@oh-my-pi/pi-ai

新增

  • /login mistral 现在像 Mistral Vibe CLI 一样通过浏览器登录,并存储生成的 API key;其用量计入套餐的 Vibe Code 配额,而不是按量付费的 API 额度;MISTRAL_API_KEY 仍然可用(#13875,由 @Gauthier-Huguenin 提供,在 #17672 中由 @abilliontokens 续作)
  • 新增 dropsForeignReasoningPayload(turn, model),用于判断 transformMessages 是否确定会在通往模型的路上剥离某个回合的 thinking 签名与 redacted thinking;针对 Factory Droid 的 Gemini 线路,还新增了 isFactoryDroidGeminiWire(model) 和 keepsFactoryGeminiReasoning(turn)(#17607,由 @will-bogusz 提供)
  • Factory Droid Beam 1.0 请求接受不带推理(reasoning)就到达的工具调用回合(#17766,由 @will-bogusz 提供)

变更

  • 已弃用 embeddings、images、rerank、speech、transcriptions、video、pi-native 和 SystemOne 服务器模块上的 formatError(现在是 auth-gateway/http 中 codedErrorResponse / noStoreErrorResponse 的别名),以及 providers/aws-sigv4 中的 asStrict(现在改用 @oh-my-pi/pi-utils 的 asStrictBytes)

修复

  • 修复了当你所在组织的模型策略排除 Opus 5 时,Factory Droid Fable 请求仍提供 Opus 5 作为拒绝时的回退;Claude 请求现在只提供你的账户可使用的回退模型,而由与你的模型列表来源不同的另一组织登录所服务的请求则不提供任何回退(#17772,由 @will-bogusz 提供)

@oh-my-pi/pi-catalog

新增

  • /login mistral 现在在 MISTRAL_API_KEY 之外还提供 Mistral Vibe 浏览器登录(#13875,由 @Gauthier-Huguenin 提供,在 #17672 中由 @abilliontokens 续作)
  • 向 compat/revision 添加了 revisionAtLeast,并从 discovery/openai-compatible 导出了 withOpenAICompatibleDiscoveryTimeout
  • 添加了 droid 1.1.0 提供的 Factory Droid 模型:GPT-6.1 Terra、GPT-6 Sol 和 Luna Fast Mode、GPT-6 Astra 和 GPT-6.1 Sol Ultra Fast(在组织选择启用高成本功能之后)、Nemotron 3.5 Super、Muse Spark Open、Muse Spark 1.2 和 Beam 1.0,每个模型在账户可以使用它时即被列出(#17766,由 @will-bogusz 提供)
  • 添加了 Factory Droid 的按日期积分(credit)费率:积分费率跟随 Factory 的促销活动,从促销开始时打折,在其结束时回到基础费率,使用与美元价格相同的按日期费率卡(当前为 GPT-5.6 Sol 和 Gemini 3.7/3.8 Flash)(#16309,由 @will-bogusz 提供)

变更

  • Factory Droid 列出 Opus 5.5 Fast、GPT-6.1 Sol 和 MiniMax M3 时不再带 Factory 已停用的 feature flags,并且不再将 GPT-5.5 路由到 Snowflake(#17766,由 @will-bogusz 提供)
  • 当 Anthropic 拒绝请求时,Factory Droid Opus 5.5 现在在账户可以使用 Opus 5 的情况下回退到 Opus 5,与 droid 的行为一致(#17772,由 @will-bogusz 提供)

修复

  • GPT-3.5 和 GPT-4 (Turbo) 现在解析到 cl100k tokenizer,因此它们的上下文估算按 cl100k_base 计数,而不是没有专属 tokenizer 的模型默认使用的 o200k_base(#17607,由 @will-bogusz 提供)
  • 新增 Scaleway Generative APIs 作为内置提供商,包含 12 个 serverless 聊天模型(默认 glm-5.3)、API-key 登录和实时模型发现(#16687,由 @reda-maizate 提供)

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

新增

  • 使用 Hindsight 记忆后端时,retain 和 learn 现在可以存储带有 scope: "global" 的记忆,使每个项目都能回想起它。这通过新的 hindsight.globalScope 设置选择启用(默认关闭),并且需要全局或按项目标记的作用域(#17706,由 @alphastorm 提供,源自 #15030,由 @kithawk 提供)
  • 新增 btw.inject(默认关闭;/settings → Interaction → "/btw Steering Inject"):当你向 /btw 请求一个 steering 提示时,它会在一个显示于粉色边栏后面的 <inject> 块中起草一个;Alt+I(app.btw.inject)会从内联回答或 BTW 历史面板将它发送到主会话(agent 运行时作为 steer 发送,否则作为新回合发送),当前运行中的每个回答限一次。发送后,该块变为绿色,每行带有 ➤,其下方显示 "Injected into main session";如果主会话丢弃或拒绝该发送,该块会变回待处理(pending)状态,同一按键可重试(#17618,由 @apullin 提供)
  • 在配置了 OTLP 指标导出(OTEL_EXPORTER_OTLP_METRICS_ENDPOINT)后,composer 预测会按所服务的模型导出不含内容的 omp.composer.prediction.* 指标:按结果(offered、skipped、stale、cancelled、timeout、error)统计的请求及其时长、展示的预测数(在首次渲染它们的那一帧计数)、按是否用 Tab 或 Right 接受划分的已展示预测,以及从首次展示到接受的时间(#17739,由 @wolfiesch 提供)
  • 被输出最小化器改写过的 Bash 结果现在会在会话中保留运行了哪个过滤器以及前后的字节数,bash 卡片会显示它们(Minimized: git 120.4KB → 3.2KB)(#16586,由 @will-bogusz 提供)
  • Eval 完成句柄暴露尝试记录(JS await handle.attempts(),Python handle.attempts):按顺序列出尝试过的每个回退候选,包括模型、发送的推理力度(reasoning effort)、其结果以及失败时的错误(#17782,由 @xiangnan0811 提供)

新增 composer.predictionAlternatives(默认关闭;/settings → Interaction → "Prediction Alternatives",在 Composer Predictions 开启时列出):同一次预测请求最多返回四条不同的下一条消息,最可能的排在最前。

输入几个字母即可为第一条匹配项获得 ghost text;插入一条后,再次按 Tab 可从列表中挑选另一条。预测指标会记录提供了多少个备选项(omp.composer.prediction.choices),已接受的预测现在会在其退出时才完成解析,并带有最后插入的备选项的排名(omp.composer.prediction.rank)(#17796,作者 @wolfiesch)

/review 和 /annotate 代码审查现在可以从一个包含多个 checkout 的文件夹中工作:/review owner/repo#123 可从任意位置审查一个 GitHub PR;/review ./repo [#123 | !7] [focus] 在该 checkout 中进行审查(#N 表示 GitHub PR,!N 表示 GitLab MR);而在任何仓库之外,本地与 open-PR 菜单选项会询问使用哪个子仓库。

变更

/resume 和 omp --resume 会立即打开你已命名的会话(从 ~/.omp/agent/history.db 读取),待完整扫描完成后再填充提示词、状态和未命名的会话;首次扫描也会保存旧会话的标题,因此之后的打开会立刻列出它们。

使用 symbolPreset: ascii 时,状态符号为三列宽([+]、[-]、[#]、[ ]),状态旋转指示符以 [|] [/] [-] [\] 动画显示(#17732,作者 @JustasMasiulis)。

subagent HUD 现在用运行中状态符号而非圆点来标记每个正在运行的 agent(#17732,作者 @JustasMasiulis)。

修复

Browser:来自 subagent 的 browser.close({ all: true }) 不再关闭其父级的标签页;它只释放调用该操作的 agent 的标签页。

标签页现在归属于打开它的 agent 而非其会话 id,因此在 /new、/resume、fork 或 branch 之后,它们仍会被冻结、空闲关闭、被 close-all 释放,并在会话结束时关闭,而不会泄漏(#15975、#16133,作者 @harshaygadekar)。

lsp request 现在将 payload: "null" 作为 JSON null 发送,而不是替换为自动构建的文档参数(#17715)。

在一轮开始前因模型或凭据缺失而被拒绝的提示词会返回编辑器以便重试;在空会话上执行 ./c 会报告没有可恢复的内容(#17828)。

当工具携带大量运行时状态时,Factory Droid 请求会保留附加的图片和 snapcompact 系统提示词帧(#17819)。

在 upstream remote 并非 origin 的 fork 父项目的 checkout 中,pr://<n>、issue://<n> 以及无仓库的 github 工具调用现在解析到 origin 而非 upstream 项目;gh repo set-default 仍然优先。

omp -p 文本模式现在会打印每次自动重试及其错误(例如 "Couldn't reach api.anthropic.com … check your network"),而不是在一轮重试期间只显示 Working...(#17529,作者 @Mannan-Goyal)。

omp --export 和 /export 在包含 subagent 记录的大型会话上不再因 Error: Out of memory 失败,且内存占用大幅降低:HTML 现在以流式方式写入磁盘,而不是拼成一个字符串(#17741)。

开启 async.enabled(默认值)的原生 security_scan 现在会等待其后台 security-reviewer worker 并发布它们的发现,而不是以 0 项发现和 "The scan session ended without publishing a canonical result" 部分结束(#17788)。

Browser(Chrome 标签页):在最终释放前被取消的点击或拖拽现在会在页面外释放,而不是在其目标上完成,页面不会看到来自它的点击(即使在 document 根节点上也看不到);超时的组合键不再发送后续按键;在中途被切断的调用或运行会释放其按住的鼠标按键或按键,而不是让它们在标签页中保持按下。

已派发给 Chrome 的输入(包括目标上的释放)无法撤回,可能在超时后仍然生效(#17778,作者 @will-bogusz)。

Relay 模式:当页面或服务器耗时更长时,tab.waitForSelector、tab.evaluate 和 tab.goto 不再在 20 秒后失败;与在已启动的 Chrome 上一样,它们现在会一直运行到调用自身的超时,上限为 omp 的 60 秒协议超时;Chrome 一直未应答的命令现在会指明自身及其标签页(#17778,作者 @will-bogusz)。

修复了浏览器 tab.click(selector, { button, count }) 和 frame.click 忽略其选项并只左键单击一次的问题,此前想要打开上下文菜单的右键点击会变成点击该元素;cmux 标签页现在会拒绝它们无法按下的按键和次数(#17767,作者 @will-bogusz)。

在机器繁忙时,Chrome 中的 Browser fill 不再偶尔把新文本放在 Slate 编辑器旧文本的前面;对于焦点移动到包装层或页面的富文本编辑器,现在会拒绝操作而不是报告成功(#17742,作者 @will-bogusz)。

修复了在跨站 frame(例如内嵌的登录表单)中工作的浏览器 relay 调用在 Chrome 将 omp 从标签页分离时仅以 Target closed 失败的问题;它现在会像页面自身的调用一样,提示 Chrome 已将 omp 分离以及标签页是否被重新附加(#17768,作者 @will-bogusz)。

通过 relay 在你的 Chrome 中以 persist: true 打开的浏览器标签页,现在在会话结束时(omp -p 运行退出、subagent 完成)保持打开,因此留给你的页面依然在那里;omp 打开的其他标签页仍会关闭,与清理会话竞争的显式关闭操作也仍会关闭其页面(#17751,作者 @will-bogusz)。

修复了在 macOS 上,当 omp 在 relay 标签页中的点击打开了新标签页或弹窗时,你在其他应用中输入的按键会进入页面的问题(#16284,作者 @will-bogusz)。

挂起的 subagent 在 omp 重启后被唤醒时会保留其 xd:// 设备挂载,因此不再丢失先前的 Claude thinking(#17746,作者 @will-bogusz)。

修复了在没有可用 /proc 的 Linux 容器和 chroot 中,取消 Python eval 中的 %pip 会遗留安装器进程的问题(#16552,作者 @will-bogusz)。

修复了对含有超长行(行尾在数 KB 之后)的文件进行编号分页读取的问题:被截断到 tools.outputMaxColumns 的行现在按其显示宽度而非完整长度计入页面大小,因此分页不再在这类行之前停止或拒绝越过它。

当第一条被截断的行大于 :raw 读取所返回的大小时,截断提示会注明该字节上限,而被页面大小在某段范围中途截停的多范围读取会指出从何处继续(#16595,由 @will-bogusz 贡献)

修复了 write 接受其长行已被截断到 tools.outputMaxColumns 的读取输出、并用截断后的行覆盖文件的问题;现在它会像对待其他被截断的读取一样,将其作为不完整的读取予以拒绝(#16595,由 @will-bogusz 贡献)

修复了会话在之后的某天恢复、或驻留的 subagent 被唤醒时,以当天日期重发其第一条消息的问题,该行为曾导致 Claude 丢弃其全部先前的 thinking 并错过 prompt cache;现在较早的消息会保留其发送时的日期(#15343)(#17622,由 @will-bogusz 贡献)

models.yml 现在接受在自定义模型或 override 上使用 tokenizer: cl100k(#17607,由 @will-bogusz 贡献)

对于摘要由扩展在未包含 reasoning 图例的情况下写入的 snapcompact 归档,无论有无图像输入,Claude 都不再接收该归档中保留的 reasoning,并转而读取该摘要自身的文字而非通用文字(#17745,由 @will-bogusz 贡献)

修复了在 Linux 上,当 grep、read、bash 工具、扩展或 eval 在 omp 打开 ~/.omp/agent/agent.db 期间读取该文件、导致其损坏(清除存储的登录信息)的问题;write 和 tts 现在会拒绝覆盖 omp 保持打开的数据库(#15586)

@oh-my-pi/pi-natives

新增

新增 macOSFrontApp(),它读取 macOS 当前置于前台的 app,并可以在一段时间内将其重新放回前台(keepInFront),而不会因用户的输入而停下(#16284,由 @will-bogusz 贡献)

修复

修复了当镜像显示的是诸如 "iPhone in Use" 之类的连接屏幕而非手机时,iPhone Mirroring 的点击、滚动与按键仍报告成功的问题;现在这些操作会失败并引用该屏幕(#17755,由 @will-bogusz 贡献)

parseKey/matchesKey 现在能识别 kitty 协议终端(如 Ghostty)为未修饰的 F1/F2/F4 发送的无参数 CSI P/CSI Q/CSI S(以及 CSI 1 <letter>)形式,且带修饰键的 F2–F9 不再匹配其他按键(例如将 Ctrl+PageDown 匹配为 Ctrl+F8)(#17812)。

新增 installSqliteLockShim()(Linux),它将 Bun 的 SQLite 记录锁迁移到不会因该文件的其他 close 而被释放的 open-file-description 锁上;同时新增 heldFileKind(path),它报告此进程保持打开并加锁的文件。两者也存在于 @oh-my-pi/pi-natives/sqlite-locks 上,后者会在首次调用时加载该 addon(#15586)

@oh-my-pi/snapcompact

新增

新增 archiveIncludesThinking(),表示一次 compaction 是否可以从其摘要的图例或其归档文本重放 reasoning;同时新增 viewSummary(),它会保留模板未以其自身措辞撰写的摘要,其后跟随模板针对该视图文本的指引(#17745,由 @will-bogusz 贡献)

修复

修复了当摘要(例如由扩展编写的)未声明任何 ¶think: 作用域时,viewWithoutFrames 与 viewWithoutThinking 仍为不具备该 reasoning 的读取者保留归档 reasoning 的问题,并将此类摘要替换为模板的摘要(#17745,由 @will-bogusz 贡献)

@oh-my-pi/omp-stats

修复

修复了当最终的 ingest 更新在某个 dashboard 请求进行期间到达时,Stats 停留在空快照的问题(#17754)。

@oh-my-pi/pi-tui

破坏性变更

buildExecutionFrame 会自行将其 loader 设置进新的 bottomBorder 中,因此调用者不再需要将其作为一行添加,但必须 dispose 它;buildStatusFooter 不再接受 status 或 exitCode,而 executionStatusLabel 会为该边框返回已结束运行的 exit N / cancelled 标记(#17732,由 @JustasMasiulis 贡献)

SessionSelectorOptions.loadAllSessions 和 SessionPickerHost.loadAllSessions 解析为 SessionListing,而 allSessions 接受一个 SessionListing,因此 all-projects 作用域可以在其完整列表之前显示初步行

Editor.prediction 被 Editor.predictions 取代,后者返回针对下一条 prompt 的全部预测,最可能的排在最前;Editor.onPredictionAccepted 会接收被插入的预测在该列表中的索引(#17796,由 @wolfiesch 贡献)

新增

SessionSelectorOptions.completeSessions(以及 SessionPickerOptions.completeSessions)会在完整列表敲定后用它替换选择器的初步行,同时保留查询、选中的会话以及期间进行的删除/重命名

/btw 的回答可以将一条 steering prompt 显示为粉色栏后面的一个块(在 Tern 中是一张 toned card),该 prompt 由 Alt+I(app.btw.inject,可重新映射)发送到主会话;发送后它会变为绿色,并在每行显示 ➤,而不会移动(#17618,由 @apullin 贡献)

为 utils 新增了 singleLine 和 finiteWidth,用于受限于行的文本与单元格宽度

Loader.inlineText() 将当前的 spinner 帧与消息作为单条带样式的行返回;DynamicBorder.setLabel() 会将一个标签(或一个在每次渲染时重新读取的函数)设置到该 rule 中(#17732,由 @JustasMasiulis 贡献)

变更

ASCII 符号预设的状态字形现在全部为三列宽:success 为 [+],error 为 [-],aborted 为 [#],pending 为 [ ](另有 [~] running、[!] warning 和 [i] info);状态 spinner 以 [|] [/] [-] [\] 进行动画(#17732,由 @JustasMasiulis 贡献)

内置渲染器不再使用 status.done、theme.status.done 或 ToolUIStatus 的 done 值;它们仍作为 status.success / success 的别名存在(显式设置的 symbols.overrides["status.done"] 仍会应用到 theme.status.done)(#17732,由 @JustasMasiulis 贡献)

每个已结束的状态都会显示 success 字形(✔,ASCII 为 [+])。

Task 行、verdict 与 header 行、background-job、launch 与 supervised-process 行、Eval 单元格、Vibe、Wait 与进程作业行、Yield 以及通用工具卡片此前显示单独的 • done 圆点,已结束的 Read 显示 ●(ASCII 为 [x])。

Live Task agent 行显示 pending 或 running 字形,merge 失败的 Task 显示 warning 字形(#17732,由 @JustasMasiulis 贡献)

  • Edit 和 Write 与 Eval 一样,在卡片头部播放其流式 spinner 动画,并将预览 / 流式标签显示在卡片的底部边框上,而不是内容下方的一行;内容完全到达后,流式即结束(#17732 by @JustasMasiulis)
  • ! shell 和 $ Python 运行会在 frame 的底部边框中显示其 spinner,随后显示 exit N 或 cancelled,而不是各自独占一行;该 spinner 就是工具头部所用的状态 spinner(#17732 by @JustasMasiulis)
  • GitHub run-watch 的作业行使用共享的状态字形:运行中的作业显示 running 字形而非警告色圆点,排队中的作业显示 pending 字形而非空心圆圈(处于 omp 无法识别状态的作业保留圆圈),已通过的作业的字形与其他成功字形一样为绿色。Ask 的多行自定义回答在每种符号预设下都与首行对齐(#17732 by @JustasMasiulis)

修复

  • 包含错误字形(✘,ASCII 为 [-])的非诊断 LSP 结果(例如原始请求响应)现在会作为响应显示,而不是被显示为内容为「No issues」的诊断并丢弃其余各行(#17732 by @JustasMasiulis)
  • 当 Tab 或 Right 插入 composer prediction 的其余部分时,以及当某一帧将其绘制出来时(终端中的至少一个单元格,或 native editor 节点上的 ghost),Editor.onPredictionAccepted 与 Editor.onPredictionShown 会进行上报(#17739 by @wolfiesch)
  • 新增 OutputMeta.minimized(bash minimizer 过滤器、原始与最小化后的字节计数、raw-output artifact),在 bash 结果卡片上显示为 Minimized 事实(#16586 by @will-bogusz)
  • 向 tools/output-meta 新增 isColumnTruncationNotice 与 hasColumnTruncationClause,用于匹配 formatOutputNotice 单独输出或包含在更长提示中的 [Some lines truncated to …] 子句;还新增了 LimitsMeta.columnTruncated.rawByteCap,使该提示能写明第一被截行的 :raw 读取所停止的字节上限(#16595 by @will-bogusz)
  • 修复模型浏览器在 Factory 促销期间显示 Factory Droid 未打折 credit 费率的问题(GPT-5.6 Sol 显示 2× 而非 1.6×);现在各行显示当前生效的费率,模型详情显示下一个费率及其日期(#16309 by @will-bogusz)
  • 当存在两条或更多 Editor.predictions 时,ghost 文本会跟随草稿作为其前缀的第一条预测;输入的草稿若与某条较短预测相同,则保留较长预测的 ghost。一旦缓冲区等于其中之一且没有 ghost(总是在 Tab、Right 或列表插入其中一条之后),会出现暗淡的 ⇥ N more 提示;按 Tab 列出全部,然后按 Enter、Tab 或 Right 替换整行(绝不提交),或按 Esc 保留原样(#17796 by @wolfiesch)
  • 在 Ghostty、kitty 及其他使用 kitty keyboard protocol 的终端中,F2 现在可在 resume picker 中打开重命名对话框;F1 和 F4 快捷键在那里也可用(#17812)
  • 新增 Component.nativeTrailers(),它允许 transcript 块在紧随其后添加自己的 native 块。该块折叠时,尾随块仍保持可见。

@oh-my-pi/pi-utils

新增

  • 新增 isPidAlive(signal-0 存活探测)与 asStrictBytes(收窄为其自身 ArrayBuffer 的 Uint8Array,用于 WebCrypto)
  • 新增 ensureSqliteLockShim(),openSqliteDatabase/openSqliteDatabaseSync 在打开 store 前会调用它,使得在 Linux 上进程的 SQLite 锁是 open-file-description 锁,该文件的其他 close 操作无法将其释放(#15586)
  • 新增 assertNotHeldOpen(path)(@oh-my-pi/pi-utils/held-file),对本进程保持打开的 SQLite 数据库或 -shm 抛出 EBUSY(#15586)

变更

  • acp 运行时校验器(zNewSessionResponse、zSessionNotification、…)现在会在 error.issues 中报告每个失败字段的路径与原因,而不是只给出一个 Invalid \<label\>;ValidationError 的 issue 路径类型为 PropertyKey[](#17699)

@oh-my-pi/pi-wire

新增

  • 新增 collab 信封辅助函数 packEnvelope、unpackEnvelope 与 rewriteEnvelopePeer

变更内容

  • feat(coding-agent): 将 /btw steering 提示注入主会话(#17618 by @apullin)
  • feat(auth): 为 /login mistral 添加 Mistral Vibe 浏览器登录(#17672 by @abilliontokens)
  • refactor: 用 omptype 替换手写的 schemas 和 validators(#17699 by @H4vC)
  • refactor: 用现有的共享实现替换重复的 helpers(#17704 by @H4vC)
  • fix(coding-agent): 在文本打印模式下显示重试错误(#17529 by @Mannan-Goyal)
  • feat(coding-agent): 让 retain 和 learn 通过 Hindsight 写入全局记忆(取代 #15030)(#17706 by @alphastorm)
  • feat(coding-agent): 导出 composer prediction 的 OTLP 指标(#17739 by @wolfiesch)
  • feat(catalog): 添加 Scaleway Generative APIs 提供商(#16687 by @reda-maizate)
  • feat(eval): 在 handles 上暴露 completion fallback 尝试(#17782 by @xiangnan0811)
  • feat(coding-agent): 提供最多四个 composer prediction 备选项(#17796 by @wolfiesch)
  • fix(coding-agent): 当无法列出 /proc 时,在取消时停止 %pip 安装器(#16552 by @will-bogusz)
  • feat(coding-agent,tui): 显示运行了哪个 bash minimizer 过滤器以及它截掉了多少(#16586 by @will-bogusz)
  • fix(agent): 对没有已知 tokenizer 的模型按 o200k 计数,并跳过请求会剥离的 thinking signatures(#17607 by @will-bogusz)
  • fix(coding-agent): 在 resume 和 subagent 复活过程中保留每条消息的日期(#17622 by @will-bogusz)
  • fix(browser): 防止富文本填充落在旧文本之前或编辑器之外(#17742 by @will-bogusz)
  • fix(snapcompact,coding-agent): 当 archive 的摘要声明没有 reasoning 时,丢弃该 archive 的 reasoning(#17745 by @will-bogusz)
  • fix(task): 保持冷复活 subagent 的 xd:// 设备处于挂载状态(#17746 by @will-bogusz)
  • fix(browser): 会话结束时保持 persist relay 标签页打开(#17751 by @will-bogusz)
  • fix(natives): 当镜像未显示手机时拒绝 iPhone Mirroring 输入(#17755 by @will-bogusz)
  • feat(ai,catalog): 添加 droid 1.1.0 提供的 Factory Droid 模型(#17766 by @will-bogusz)
  • fix(browser): 按下按钮,并对 tab.click 和 frame.click 的请求进行计数(#17767 by @will-bogusz)
  • 修复(browser):向运行在跨站 frame 中的调用上报 Chrome 的 relay 分离,由 @will-bogusz 在 #17768 完成
  • 功能(ai,catalog):为 Factory Droid Opus 5.5 提供 Opus 5 的拒绝回退,由 @will-bogusz 在 #17772 完成
  • 修复(browser):超时后停止后续输入步骤,并让 relay 页面的等待使用调用截止时间,由 @will-bogusz 在 #17778 完成
  • 修复(browser):在 macOS 上当 omp 的 relay 标签页打开弹窗时,保持用户的应用位于最前,由 @will-bogusz 在 #16284 完成
  • 功能(catalog,tui):在模型浏览器中显示 Factory Droid credit 促销,由 @will-bogusz 在 #16309 完成
  • 修复(coding-agent):按显示宽度将列截断的行计入读取页面预算,由 @will-bogusz 在 #16595 完成
  • 修复(tui):恢复 kitty keyboard protocol 下的 f2 重命名,由 @roboomp 在 #17814 完成
  • 修复(natives):使用 OFD 锁在进程内关闭过程中保持 SQLite 锁,由 @H4vC 在 #17833 完成
  • 修复(security):在结束扫描前先完成后台 reviewer 任务,由 @roboomp 在 #17790 完成
  • 修复(session):将已声明的工具计入图像预算,由 @roboomp 在 #17822 完成
  • 修复(session):恢复在分发前被拒绝的 prompt,由 @roboomp 在 #17830 完成
  • 修复(export):将 html 导出负载流式写入磁盘,由 @roboomp 在 #17744 完成
  • 修复(stats):在处理中的 overview 完成后恢复实时更新,由 @roboomp 在 #17758 完成
  • 修复(lsp):保留字面量 null 的请求负载,由 @roboomp 在 #17719 完成
  • 修复(browser):将“关闭所有标签页”的作用范围限定为调用它的会话(#15975),由 @harshaygadekar 在 #16133 完成
  • 功能(tui):统一的状态符号、颜色和位置,由 @JustasMasiulis 在 #17732 完成
  • 功能(review):在 git 目录之外审查 PR 与 checkout,由 @H4vC 在 #17854 完成

新贡献者

  • @apullin 在 #17618 完成了首次贡献
  • @Mannan-Goyal 在 #17529 完成了首次贡献
  • @reda-maizate 在 #16687 完成了首次贡献

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

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

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

Changed

Deprecated createFileOps, computeFileLists, formatFileOperations, upsertFileOperations, isUrlSchemePath and FileOperations in @oh-my-pi/pi-agent-core/compaction; they now re-export @oh-my-pi/snapcompact, which callers should import directly

Fixed

Context estimates for a model without a known tokenizer family (Gemini, Grok and the like), and token counts made without a model (compress metrics, the legacy estimateTokens export), count text in o200k_base instead of guessing 4 bytes per token, which undercounted what those providers bill by 11–48% on code-heavy sessions and let compaction fire late after a switch to them (#17607 by @will-bogusz) Context estimates no longer charge a reader another model's thinking signatures or redacted thinking, which the request strips: a Claude session switched to Grok or Gemini, including Gemini through Factory, counted them as text (#17607 by @will-bogusz)

Removed

Removed PI_TOKENIZER_ACCURATE: every model is now counted with a native tokenizer (#17607 by @will-bogusz)

@oh-my-pi/pi-ai

Added

/login mistral signs in through the browser like the Mistral Vibe CLI and stores the minted API key, whose usage counts against the plan's Vibe Code quota instead of pay-as-you-go API credits; MISTRAL_API_KEY still works (#13875 by @Gauthier-Huguenin, continued in #17672 by @abilliontokens) Added dropsForeignReasoningPayload(turn, model), which tells whether transformMessages certainly strips a turn's thinking signatures and redacted thinking on the way to model, and, for Factory Droid's Gemini wire, isFactoryDroidGeminiWire(model) and keepsFactoryGeminiReasoning(turn) (#17607 by @will-bogusz) Factory Droid Beam 1.0 requests accept tool-call turns that arrive without reasoning (#17766 by @will-bogusz)

Changed

Deprecated formatError on the embeddings, images, rerank, speech, transcriptions, video, pi-native and SystemOne server modules (now aliases of codedErrorResponse / noStoreErrorResponse in auth-gateway/http) and asStrict in providers/aws-sigv4 (now asStrictBytes from @oh-my-pi/pi-utils)

Fixed

Fixed Factory Droid Fable requests offering Opus 5 as the refusal fallback when your organization's model policy excludes Opus 5; Claude requests now offer only fallback models your account can use, and a request served by another organization's login than the one your model list came from offers none (#17772 by @will-bogusz)

@oh-my-pi/pi-catalog

Added

/login mistral now offers the Mistral Vibe browser sign-in beside MISTRAL_API_KEY (#13875 by @Gauthier-Huguenin, continued in #17672 by @abilliontokens) Added revisionAtLeast to compat/revision and exported withOpenAICompatibleDiscoveryTimeout from discovery/openai-compatible Added the Factory Droid models droid 1.1.0 serves: GPT-6.1 Terra, GPT-6 Sol and Luna Fast Mode, GPT-6 Astra and GPT-6.1 Sol Ultra Fast (after the organization's high-cost opt-in), Nemotron 3.5 Super, Muse Spark Open, Muse Spark 1.2 and Beam 1.0, each listed once the account may use it (#17766 by @will-bogusz) Added Factory Droid's dated credit rates: the credit rate follows Factory's promotions, discounted from a promotion's start and back to the base rate at its end, using the same dated rate cards as dollar prices (currently GPT-5.6 Sol and Gemini 3.7/3.8 Flash) (#16309 by @will-bogusz)

Changed

Factory Droid lists Opus 5.5 Fast, GPT-6.1 Sol and MiniMax M3 without the feature flags Factory retired, and no longer routes GPT-5.5 to Snowflake (#17766 by @will-bogusz) Factory Droid Opus 5.5 now falls back to Opus 5 when Anthropic refuses a request, as droid does, while your account can use Opus 5 (#17772 by @will-bogusz)

Fixed

GPT-3.5 and GPT-4 (Turbo) resolve the cl100k tokenizer, so their context estimates count in cl100k_base rather than the o200k_base default for models without one (#17607 by @will-bogusz) Added Scaleway Generative APIs as a built-in provider with 12 serverless chat models (glm-5.3 default), API-key login, and live model discovery (#16687 by @reda-maizate)

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

Added

With the Hindsight memory backend, retain and learn can now store a memory with scope: "global" so every project recalls it. It is opt-in through the new hindsight.globalScope setting (off by default) and needs global or per-project-tagged scoping (#17706 by @alphastorm, from #15030 by @kithawk). Added btw.inject (off by default; /settings → Interaction → "/btw Steering Inject"): when you ask /btw for a steering prompt, it drafts one in an <inject> block shown behind a pink rail, and Alt+I (app.btw.inject) sends it to the main session (as a steer while the agent runs, else as a new turn) from the inline answer or the BTW history sheet, once per answer from the current run. Once sent, the block turns green with ➤ on each line and "Injected into main session" below it; if the main session drops or refuses the send, the block turns back to pending and the same key retries (#17618 by @apullin) With OTLP metrics export configured (OTEL_EXPORTER_OTLP_METRICS_ENDPOINT), composer predictions export content-free omp.composer.prediction.* metrics by serving model: requests by outcome (offered, skipped, stale, cancelled, timeout, error) with their duration, predictions shown (counted on the first frame that paints them), shown predictions by whether they were accepted with Tab or Right, and the time from first display to acceptance (#17739 by @wolfiesch) Bash results the output minimizer rewrote now keep which filter ran and the bytes before and after in the session, and the bash card shows them (Minimized: git 120.4KB → 3.2KB) (#16586 by @will-bogusz) Eval completion handles expose attempts (JS await handle.attempts(), Python handle.attempts): each fallback candidate tried, in order, with the model, the reasoning effort sent, its outcome, and the error when it failed (#17782 by @xiangnan0811) Added composer.predictionAlternatives (off by default; /settings → Interaction → "Prediction Alternatives", listed while Composer Predictions is on): the same single prediction request returns up to four different next messages, most likely first. Type a few letters to get ghost text for the first one that matches; after inserting one, press Tab again to pick another from a list. Prediction metrics carry how many alternatives were offered (omp.composer.prediction.choices), and an accepted prediction now resolves when it retires, with the rank of the alternative inserted last (omp.composer.prediction.rank) (#17796 by @wolfiesch) /review and /annotate code-review work from a folder of checkouts: /review owner/repo#123 reviews a GitHub PR from anywhere; /review ./repo [#123 | !7] [focus] reviews in that checkout (#N a GitHub PR, !N a GitLab MR); and outside any repository, the local and open-PR menu choices ask which child repository to use

Changed

/resume and omp --resume open at once on your titled sessions (read from ~/.omp/agent/history.db), then fill in prompts, status, and untitled sessions when the full scan finishes; the first scan saves older sessions' titles too, so later opens list them right away With symbolPreset: ascii, status glyphs are three columns wide ([+], [-], [#], [ ]) and status spinners animate as [|] [/] [-] [\] (#17732 by @JustasMasiulis) The subagent HUD marks each running agent with the running status glyph instead of a dot (#17732 by @JustasMasiulis)

Fixed

Browser: browser.close({ all: true }) from a subagent no longer closes its parent's tabs; it releases only the calling agent's tabs. Tabs now belong to the agent that opened them rather than its conversation id, so after /new, /resume, fork, or branch they are still frozen, idle-closed, released by close-all, and closed when the session ends instead of leaking (#15975, #16133 by @harshaygadekar) lsp request now sends payload: "null" as JSON null instead of substituting auto-built document params (#17715). A prompt rejected before a turn starts because its model or credential is missing returns to the editor for retry; ./c on an empty conversation reports that there is nothing to resume (#17828). Factory Droid requests keep attached images and snapcompact system-prompt frames when tools carry large runtime state (#17819). pr://<n>, issue://<n>, and repo-less github tool calls in a checkout whose upstream remote is not the fork parent of origin now resolve to origin instead of the upstream project; gh repo set-default still wins omp -p text mode now prints each automatic retry with its error (for example "Couldn't reach api.anthropic.com … check your network") instead of showing only Working... while a turn retries (#17529 by @Mannan-Goyal) omp --export and /export no longer fail with Error: Out of memory on large sessions with subagent transcripts, and use far less memory: the HTML is now streamed to disk instead of built as one string (#17741) A native security_scan with async.enabled on (the default) now waits for its background security-reviewer workers and publishes their findings, instead of ending partial with 0 findings and "The scan session ended without publishing a canonical result" (#17788) Browser (Chrome tabs): a click or drag cancelled before its final release now releases off-page instead of completing on its target, and the page sees no click from it (not even on the document root), a timed-out key combo sends no further key, and a call or run cut off mid-gesture releases the mouse button or keys it held instead of leaving them down in the tab. Input already dispatched to Chrome, including a target release, cannot be recalled and may still take effect after timeout (#17778 by @will-bogusz) Relay mode: tab.waitForSelector, tab.evaluate and tab.goto no longer fail after 20 s when the page or server takes longer; like on a launched Chrome they now run to the call's own timeout, up to omp's 60 s protocol timeout, and a command Chrome never answers names itself and its tab (#17778 by @will-bogusz) Fixed browser tab.click(selector, { button, count }) and frame.click ignoring their options and left-clicking once, so a right-click meant to open a context menu clicked the element instead; cmux tabs refuse buttons and counts they cannot press (#17767 by @will-bogusz) Browser fill in Chrome no longer sometimes puts the new text in front of a Slate editor's old text when the machine is busy, and refuses a rich-text editor whose focus moves to a wrapper or the page instead of reporting success (#17742 by @will-bogusz) Fixed a browser relay call working in a cross-site frame (an embedded sign-in form, say) failing with a bare Target closed when Chrome detached omp from the tab; it now says Chrome detached omp and whether the tab was reattached, as a call in the page itself does (#17768 by @will-bogusz) Browser tabs omp opens with persist: true in your Chrome through the relay now stay open when the session ends (an omp -p run exits, a subagent finishes), so a page left for you is still there; other tabs omp opened still close, and an explicit close racing session cleanup still closes its page (#17751 by @will-bogusz) Fixed keys you type in another app going into a page on macOS when omp's click in a relay tab opened a new tab or popup (#16284 by @will-bogusz) Parked subagents keep their xd:// device mounts when woken after omp restarts, so they no longer lose their earlier Claude thinking (#17746 by @will-bogusz) Fixed cancelling %pip in Python eval leaving the installer process behind in Linux containers and chroots without a usable /proc (#16552 by @will-bogusz) Fixed numbered read pages of files with very long lines ending after a few KB: a line cut to tools.outputMaxColumns now counts the width shown, not its full length, against the page size, so paging no longer stops before such a line or refuses to step past it. When the first cut line is larger than a :raw read returns, the cut notice names that byte cap, and a multi-range read that the page size stops partway through a range says where to continue (#16595 by @will-bogusz) Fixed write accepting the output of a read whose long lines were cut to tools.outputMaxColumns and overwriting the file with the cut lines; it now refuses it as an incomplete read, as it does for other truncated reads (#16595 by @will-bogusz) Fixed a session resumed, or a parked subagent woken, on a later day resending its first message with that day's date, which made Claude drop all of its earlier thinking and missed the prompt cache; earlier messages now keep the date they were sent with (#15343) (#17622 by @will-bogusz) models.yml accepts tokenizer: cl100k on a custom model or override (#17607 by @will-bogusz) Claude no longer receives the reasoning kept in a snapcompact archive whose summary an extension wrote without the reasoning legend, with or without image input, and reads that summary's own words instead of a generic one (#17745 by @will-bogusz) Fixed ~/.omp/agent/agent.db getting corrupted (wiping stored logins) on Linux when grep, read, the bash tool, extensions or eval read it while omp has it open; write and tts now refuse to overwrite a database omp holds open (#15586)

@oh-my-pi/pi-natives

Added

Added macOSFrontApp(), which reads the app macOS has in front and can put it back in front for a while (keepInFront) without stopping for the user's typing (#16284 by @will-bogusz)

Fixed

Fixed iPhone Mirroring clicks, scrolls and keys reporting success while the mirror showed a connection screen such as "iPhone in Use" instead of the phone; they now fail and quote that screen (#17755 by @will-bogusz) parseKey/matchesKey now recognize the parameterless CSI P/CSI Q/CSI S (and CSI 1 <letter>) forms that kitty-protocol terminals such as Ghostty send for unmodified F1/F2/F4, and modified F2–F9 no longer match other keys (e.g. Ctrl+PageDown as Ctrl+F8) (#17812). Added installSqliteLockShim() (Linux), which moves Bun's SQLite record locks onto open-file-description locks that no other close of the file releases, and heldFileKind(path), which reports a file this process holds open and locked. Both are also on @oh-my-pi/pi-natives/sqlite-locks, which loads the addon on first call (#15586)

@oh-my-pi/snapcompact

Added

Added archiveIncludesThinking(), whether a compaction may replay reasoning from its summary's legend or its archive's text, and viewSummary(), which keeps a summary the template did not write in its own words, followed by the template's guide to the view's text (#17745 by @will-bogusz)

Fixed

Fixed viewWithoutFrames and viewWithoutThinking keeping an archive's reasoning for a reader without it when the summary (say, one an extension wrote) declares no ¶think: scope, and replacing such a summary with the template's (#17745 by @will-bogusz)

@oh-my-pi/omp-stats

Fixed

Fixed Stats staying at an empty snapshot when the final ingest update arrives during an in-flight dashboard request (#17754).

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

buildExecutionFrame sets its loader into the new bottomBorder itself, so callers no longer add it as a row and must dispose it; buildStatusFooter no longer takes status or exitCode, and executionStatusLabel returns a settled run's exit N / cancelled marker for that border (#17732 by @JustasMasiulis) SessionSelectorOptions.loadAllSessions and SessionPickerHost.loadAllSessions resolve to a SessionListing, and allSessions takes one, so the all-projects scope can show preliminary rows before its complete listing Editor.prediction is replaced by Editor.predictions, which returns every prediction for the next prompt, most likely first, and Editor.onPredictionAccepted receives the inserted prediction's index in that list (#17796 by @wolfiesch)

Added

SessionSelectorOptions.completeSessions (and SessionPickerOptions.completeSessions) replaces the picker's preliminary rows with the complete listing once it settles, keeping the query, the selected session, and deletes/renames made meanwhile /btw answers can show a steering prompt as a block behind a pink rail (a toned card in Tern) that Alt+I (app.btw.inject, remappable) sends to the main session; once sent it turns green with ➤ on each line, without moving (#17618 by @apullin) Added singleLine and finiteWidth to utils for row-confined text and cell widths Loader.inlineText() returns the current spinner frame and message as one styled line, and DynamicBorder.setLabel() sets a label (or a function re-read every render) into the rule (#17732 by @JustasMasiulis)

Changed

The ASCII symbol preset's status glyphs are all three columns wide: success is [+], error [-], aborted [#] and pending [ ] (alongside [~] running, [!] warning and [i] info), and status spinners animate as [|] [/] [-] [\] (#17732 by @JustasMasiulis) Built-in renderers no longer use status.done, theme.status.done or the done value of ToolUIStatus; they remain as aliases of status.success / success (an explicit symbols.overrides["status.done"] still applies to theme.status.done) (#17732 by @JustasMasiulis) Every finished state shows the success glyph (✔, ASCII [+]). Task rows, verdicts and headers, background-job, launch and supervised-process rows, Eval cells, Vibe, Wait and process job rows, Yield and the generic tool card showed a separate • done dot, and a finished Read showed ● (ASCII [x]). Live Task agent rows show the pending or running glyph, and a Task whose merge failed shows the warning glyph (#17732 by @JustasMasiulis) Edit and Write animate their streaming spinner in the card header, as Eval does, and show their preview / streaming label in the card's bottom border instead of on a row below the content; streaming ends once the content has fully arrived (#17732 by @JustasMasiulis) ! shell and $ Python runs show their spinner, and then exit N or cancelled, in the frame's bottom border instead of on rows of their own; the spinner is the status spinner tool headers use (#17732 by @JustasMasiulis) GitHub run-watch job rows use the shared status glyphs: a running job shows the running glyph instead of a warning-colored dot, a queued job the pending glyph instead of a hollow circle (a job in a state omp does not recognize keeps the circle), and a passed job's glyph is green like other success glyphs. Ask's multi-line custom answer lines up under its first line in every symbol preset (#17732 by @JustasMasiulis)

Fixed

An LSP result other than diagnostics, such as a raw request response, that contains the error glyph (✘, ASCII [-]) is shown as a response instead of as diagnostics reading "No issues" with the rest of its lines dropped (#17732 by @JustasMasiulis) Editor.onPredictionAccepted and Editor.onPredictionShown report when Tab or Right inserts the rest of the composer prediction and when a frame paints it (at least one cell in the terminal, or the ghost on a native editor node) (#17739 by @wolfiesch) Added OutputMeta.minimized (bash minimizer filter, raw and minimized byte counts, raw-output artifact), shown as a Minimized fact on bash result cards (#16586 by @will-bogusz) Added isColumnTruncationNotice and hasColumnTruncationClause to tools/output-meta, matching the [Some lines truncated to …] clause that formatOutputNotice emits alone or inside a longer notice, and LimitsMeta.columnTruncated.rawByteCap, which makes that notice name the byte cap a :raw read of the first cut line stops at (#16595 by @will-bogusz) Fixed the model browser showing Factory Droid's undiscounted credit rate during a Factory promotion (2× instead of 1.6× for GPT-5.6 Sol); rows now show the rate in force and the model details show the next rate and its date (#16309 by @will-bogusz) With two or more Editor.predictions, the ghost text follows the first one the draft is a prefix of; a typed draft that equals a shorter one keeps the ghost of a longer one. Once the buffer equals one of them with no ghost (always right after Tab, Right, or the list inserts one), a dim ⇥ N more hint appears; press Tab to list them all, then Enter, Tab or Right to swap the whole line (never submitting) or Esc to keep it (#17796 by @wolfiesch) F2 now opens the rename dialog in the resume picker in Ghostty, kitty and other terminals using the kitty keyboard protocol; F1 and F4 shortcuts work there too (#17812). Added Component.nativeTrailers(), which lets a transcript block add native blocks of its own directly after it. Trailing blocks stay visible while the block is collapsed.

@oh-my-pi/pi-utils

Added

Added isPidAlive (signal-0 liveness probe) and asStrictBytes (a Uint8Array narrowed to its own ArrayBuffer for WebCrypto) Added ensureSqliteLockShim(), which openSqliteDatabase/openSqliteDatabaseSync call before opening a store, so on Linux the process's SQLite locks are open-file-description locks that other closes of the file cannot release (#15586) Added assertNotHeldOpen(path) (@oh-my-pi/pi-utils/held-file), which throws EBUSY for a SQLite database or -shm this process holds open (#15586)

Changed

acp runtime validators (zNewSessionResponse, zSessionNotification, …) now report each failing field's path and reason in error.issues instead of a single Invalid <label>; ValidationError issue paths are typed PropertyKey[] (#17699)

@oh-my-pi/pi-wire

Added

Added the collab envelope helpers packEnvelope, unpackEnvelope and rewriteEnvelopePeer

What's Changed

  • feat(coding-agent): inject /btw steering prompts into the main session by @apullin in #17618
  • feat(auth): add Mistral Vibe browser sign-in to /login mistral by @abilliontokens in #17672
  • refactor: replace hand-rolled schemas and validators with omptype by @H4vC in #17699
  • refactor: replace duplicated helpers with existing shared implementations by @H4vC in #17704
  • fix(coding-agent): show retry errors in text print mode by @Mannan-Goyal in #17529
  • feat(coding-agent): let retain and learn write global memories with Hindsight (supersedes #15030) by @alphastorm in #17706
  • feat(coding-agent): export composer prediction OTLP metrics by @wolfiesch in #17739
  • feat(catalog): add Scaleway Generative APIs provider by @reda-maizate in #16687
  • feat(eval): expose completion fallback attempts on handles by @xiangnan0811 in #17782
  • feat(coding-agent): offer up to four composer prediction alternatives by @wolfiesch in #17796
  • fix(coding-agent): stop the %pip installer on cancel when /proc cannot be listed by @will-bogusz in #16552
  • feat(coding-agent,tui): show which bash minimizer filter ran and how much it cut by @will-bogusz in #16586
  • fix(agent): count models without a known tokenizer in o200k, and skip thinking signatures the request strips by @will-bogusz in #17607
  • fix(coding-agent): keep each message's date across resume and subagent revival by @will-bogusz in #17622
  • fix(browser): stop rich-text fill landing before the old text or outside the editor by @will-bogusz in #17742
  • fix(snapcompact,coding-agent): drop an archive's reasoning when its summary declares none by @will-bogusz in #17745
  • fix(task): keep a cold-revived subagent's xd:// devices mounted by @will-bogusz in #17746
  • fix(browser): keep persist relay tabs open when the session ends by @will-bogusz in #17751
  • fix(natives): refuse iPhone Mirroring input while the mirror is not showing the phone by @will-bogusz in #17755
  • feat(ai,catalog): add the Factory Droid models droid 1.1.0 serves by @will-bogusz in #17766
  • fix(browser): press the button and count tab.click and frame.click are asked for by @will-bogusz in #17767
  • fix(browser): report Chrome's relay detach to a call running in a cross-site frame by @will-bogusz in #17768
  • feat(ai,catalog): give Factory Droid Opus 5.5 the Opus 5 refusal fallback by @will-bogusz in #17772
  • fix(browser): stop later input steps after timeout and let relay page waits use the call deadline by @will-bogusz in #17778
  • fix(browser): keep the user's app in front when omp's relay tab opens a popup on macOS by @will-bogusz in #16284
  • feat(catalog,tui): show Factory Droid credit promotions in the model browser by @will-bogusz in #16309
  • fix(coding-agent): charge column-cut lines their shown width against the read page budget by @will-bogusz in #16595
  • fix(tui): restored f2 rename under kitty keyboard protocol by @roboomp in #17814
  • fix(natives): kept SQLite locks across in-process closes with OFD locks by @H4vC in #17833
  • fix(security): settled background reviewer jobs before ending scans by @roboomp in #17790
  • fix(session): counted declared tools for image budgets by @roboomp in #17822
  • fix(session): restored prompts rejected before dispatch by @roboomp in #17830
  • fix(export): streamed html export payload to disk by @roboomp in #17744
  • fix(stats): recover live updates after in-flight overview settles by @roboomp in #17758
  • fix(lsp): preserved literal null request payloads by @roboomp in #17719
  • fix(browser): scope close all tabs to calling session (#15975) by @harshaygadekar in #16133
  • feat(tui): consistent status glyphs, colors and placement by @JustasMasiulis in #17732
  • feat(review): reviewed PRs and checkouts from outside a git directory by @H4vC in #17854

New Contributors

@apullin made their first contribution in #17618 @Mannan-Goyal made their first contribution in #17529 @reda-maizate made their first contribution in #16687

Full Changelog: v18.15.0...v18.16.0

原文入口

阅读原文(github.com)

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

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

了解来源批准与收录规则