黄奕彬

外部精选

omp · v18.12.0

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

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

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

结构化摘要 AI 生成

背景与问题

这是 oh-my-pi (omp) 项目 v18.12.0 的发布说明(上一版本为 v18.11.3),面向使用或开发 omp 各子包的用户与贡献者。它要解决的问题是:告知用户本版本改动了什么、修复了哪些缺陷、有哪些破坏性变更需要注意,以便决定是否升级及如何迁移配置。

内容按 9 个包(pi-agent-core、pi-ai、pi-catalog、pi-coding-agent、pi-natives、omptype、omp-stats、pi-tui、pi-utils)组织,核心是 pi-ai/pi-catalog 的请求压缩与连接预热体系,以及 pi-coding-agent 的大量缺陷修复。

方法或内容

发布说明以各子包为单元,分 Breaking Changes / Added / Changed / Fixed 列出条目,每条附 PR 编号与贡献者。主要内容包括:

  • pi-ai:以 PI_REQUEST_COMPRESSION 统一控制请求体压缩(替代 PI_CODEX_ZSTD),新增 prewarmModelConnection(model)、ThinkingContent.narration、presentNarrationAsAnswer(message)、keys.peek(provider, { includeExpired: true })。
  • pi-catalog:新增 request-encodings、request-encoding-rejection、endpoint-hosts 规则轴及 resolveRequestCompression(model, url)、isCatalogEndpointUrl(model, url)。
  • pi-coding-agent:新增 statusLine.segmentOptions.pi.showProfile、sharpshooter.minPromptLength(默认 16,最小 2);连接预热扩展到所有内置 provider。
  • 其余包以修复为主,pi-natives 的 encodeSixel/encodeSixelAsync 增加第四个 0xRRGGBB 终端背景参数。

关键发现 / 结果

关键变更点:

  • 破坏性变更 3 处:PI_CODEX_ZSTD 被 PI_REQUEST_COMPRESSION 替代(设 0 发送未压缩请求体);encodeSixel/encodeSixelAsync 要求第四个终端背景 RGB 参数;pi-tui 的 FindStats.errors 被 failed 与 unanswered 替代。
  • 压缩收益:GitHub Copilot 请求改用 zstd,长对话上传体积降低约 60–75%;Anthropic 官方 API 请求体改为 gzip。
  • 被拒的请求体编码只对该 host 禁用压缩,且仅在未压缩重发成功后生效,真正的 400 不再关闭压缩。
  • 连接预热覆盖所有 catalog provider(含 Copilot plan hosts、MOONSHOT_BASE_URL、区域 hosts),按 host 节流;自定义 provider、指向 gateway 的内置 provider、本地 hosts、Anthropic gateway 不探测。
  • GPT-5.4 在 OpenAI、Azure、OpenCode Zen、Command Code 的 catalog 行报告 1M 上下文窗口;models.yml 显式 contextWindow/maxTokens 优先于 catalog 规则。
  • 修复项数十条,代表性如:Cursor turns 在前一轮流式输出中收到后续消息时 PROVIDER_ERROR;Ollama 流式错误被静默当作成功;URL read 超 500,000 字符被截断;Windows 上启动预热因 Bun fetch.preconnect 抛错而静默无效;SIGTERM 打断 OAuth token 轮换导致 refresh token 丢失。
  • 新增 10 位首次贡献者:@Bouska、@appboypov、@gchai、@chefnaphtha、@robfeldmann、@AnxForever、@KunoLu、@unclesamwk、@bigHippoZz、@oyty。

结论与意义

本版本的意义在于:将请求压缩与连接预热从个别 provider 扩展为受 KDL catalog 规则驱动的通用机制,减少长对话上传开销与每轮连接握手成本;同时大量修复跨平台(尤其 Windows)、多 provider(Copilot、Cursor、Bedrock、Ollama、Antigravity)的稳定性缺陷。

适用边界:破坏性变更要求升级者迁移环境变量与 API 调用;预热与压缩的收益声明仅针对特定 provider 官方端点,对自定义 provider、gateway、本地服务器不生效。原文未说明后续版本是否调整这些行为。

AI 解读 AI 生成

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

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

发布日期为来源日期 2026年10月18日 02:44(北京时间),即北京时间 2026-10-18 02:44:02,完整变更范围为 v18.11.3...v18.12.0。发布说明本身是对该时点变更的静态记录;其中对默认行为(压缩默认开启、预热默认启用)的描述在 v18.12.0 内成立。原文未说明此后的版本是否改变这些行为,无法判断现在是否仍成立。

空间:谁的环境 / 场景

适用于 oh-my-pi (omp) v18.12.0 用户,尤其:

  • 使用官方 Anthropic API、GitHub Copilot、Codex backend 的用户(压缩生效端点);
  • 通过自定义 models.yml、gateway、本地服务器接入的用户(这些不在预热与压缩探测范围内,但受 catalog wire-quirks 修复影响);
  • Windows 用户(大量平台特定修复);
  • 使用 Ollama、Bedrock、Google Antigravity、Cursor、MCP、ssh://、tmux 等环境的用户。

设置了 PI_CODEX_ZSTD 的用户升级后需改用 PI_REQUEST_COMPRESSION,否则原变量不再起作用。

变量:实际改变了什么

相对此前的实际改变:

  • 环境变量:PI_CODEX_ZSTD 移除,新增 PI_REQUEST_COMPRESSION,设 0 禁用全部请求压缩。
  • 行为:Anthropic 官方 API 请求默认 gzip;Copilot 请求默认 zstd(上传体积约降 60–75%);编码被拒仅对单个 host 失效。
  • API:encodeSixel/encodeSixelAsync 新增必填第四参数;FindStats.errors 拆为 failed/unanswered。
  • 优先级:models.yml 显式 contextWindow/maxTokens 从被 catalog 覆盖改为优先。
  • 数据:GPT-5.4 catalog 行改为 1M 窗口;URL read 不再截断 500,000 字符后的内容;keys.peek() 不再每次轮换账户。
  • UI:find 显示 N/M requests failed;Snapcompact 用 [»2]/[·4] 计数缩进;Snapcompact 与 read 通知显示相对路径。

区分:包含 ≠ 相关 ≠ 因果

有明确因果证据的(原文直接陈述“X 导致 Y”或“修复 X”):zstd 压缩导致上传体积降约 60–75%;预热使下一轮跳过连接设置;SIGTERM 中断导致 refresh token 未保存;Bun fetch.preconnect 抛错导致 Windows 预热静默无效;回放不支持的工具名导致 HTTP 400 卡死。

属于包含/相关关系的:连接预热“覆盖”各 provider 是机制范围描述,与具体速度提升无因果论证;GPT-5.4 的 1M 窗口是“编码 agent 运行时已应用的窗口”的同步,而非能力扩展。原文未对“长对话在慢上行链路上更快到达模型”给出量化数据,属于定性推断。

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

署名为 github-actions[bot],即自动化发布机器人;正文条目中出现的 @H4vC、@roboomp、@adi-IL、@jchanghong023、@mottopanikeiku、@Bouska 等为 PR 贡献者,非本发布说明的署名作者。关键技术及原文描述的原理:

  • 请求体压缩:按 provider 端点声明编码(官方 Anthropic API 用 gzip,Codex backend 用 zstd,Copilot hosts 先 zstd 后 gzip),压缩由 PI_REQUEST_COMPRESSION 统一控制,编码被拒后仅对该 host 回退未压缩。
  • 连接预热:prewarmModelConnection(model) 在请求前用相同 transport 与 TLS 设置打开 API 连接,请求复用以省去握手;按 host 节流,从不探测自定义/gateway/本地端点。
  • KDL catalog 规则:新增 request-encodings、request-encoding-rejection、endpoint-hosts 规则轴,将 provider 硬编码行为迁入声明式规则。
  • SIXEL:编码时传入 0xRRGGBB 终端背景色以合成透明度,避免半透明细节丢失或暗边。

元反空综合结论

元:这份内容本质是版本变更清单,解决“升级到 v18.12.0 会遇到什么、需迁移什么、能获得什么”的问题。

反:最可能失效或有边界的部分——60–75% 压缩收益仅在 Copilot 长对话场景的估计值,且受 host 编码协商影响;“更快到达模型”无量化数据;预热对 gateway/自定义/本地端点明确不适用;破坏性变更意味着依赖旧 API(PI_CODEZ_ZSTD、FindStats.errors、旧 encodeSixel 签名)的集成在升级后必然行为改变。

空:去掉叙事后剩下的必要事实是——9 个包的具体 Added/Changed/Fixed 条目、3 处破坏性变更、10 位新贡献者、变更范围 v18.11.3...v18.12.0。

综合结论:这是一份事实密度高、可逐条核验(附 PR 编号)的技术发布说明;对直接用户其价值取决于使用形态——官方 API 与 Copilot 用户获益最大,重度自定义部署用户主要获得缺陷修复而非性能声明收益;所有性能表述应视为开发者单方面陈述,原文未附独立验证数据。

中文译文 AI 生成

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

修复

  • 修复当前一轮仍在流式输出时,后续事件(已完成的后台作业、迟到的诊断、提醒)到达会导致 Cursor 轮次以 PROVIDER_ERROR 失败的问题(#15821,由 @robfeldmann 贡献)

@oh-my-pi/pi-ai

破坏性变更

  • PI_CODEX_ZSTD 被 PI_REQUEST_COMPRESSION 取代;设置 PI_REQUEST_COMPRESSION=0 可让 Codex(以及其他所有)请求体以未压缩方式发送(#16086,由 @H4vC 贡献)

新增

  • 新增 ThinkingContent.narration,会设置在签名将其标记为工具间旁白的 Anthropic 与 Bedrock thinking 块上;并新增 presentNarrationAsAnswer(message),用于将这些块显示为回复文本,而重放时仍将其保留为已签名的 thinking
  • 新增 keys.peek(provider, { includeExpired: true }),用于指出过期 OAuth token 背后所存储的账户名,适用于绝不发送该 token 的读取操作,例如为离线模型缓存查找提供键(#16061,由 @gchai 贡献)
  • 新增 prewarmModelConnection(model)(providers/connection-prewarm),在请求之前使用相同的传输与 TLS 设置提前打开模型的 API 连接,使请求直接复用它而无需付出连接握手的开销(#16086,由 @H4vC 贡献)

变更

  • 发往官方 API 的 Anthropic 请求现在对请求体进行 gzip 压缩,因此在慢速上行链路上长对话能更快到达模型;设置 PI_REQUEST_COMPRESSION=0 可禁用(#16044,由 @H4vC 贡献)
  • GitHub Copilot 请求(chat completions、Responses 和 Claude messages)现在发送 zstd 压缩的请求体,在长对话中将上传体积削减约 60–75%;设置 PI_REQUEST_COMPRESSION=0 可禁用(#16086,由 @H4vC 贡献)
  • 被拒绝的请求体编码现在仅对该主机禁用压缩,且仅在未压缩重发成功后才禁用,因此真正的 400 不再关闭压缩(#16086,由 @H4vC 贡献)
  • 连接预热现在覆盖目录中的每个提供商,而不仅是官方 Anthropic API:它会重新预热模型请求实际到达的源站(Copilot 计划主机、MOONSHOT_BASE_URL、区域主机),并按主机限流;自定义提供商、被路由到网关的内置提供商 id、本地主机以及 Anthropic 网关绝不会被探测(#16086,由 @H4vC 贡献)

修复

  • 修复 Ollama 与 Ollama Cloud 的流式错误被静默接受为成功响应的问题(#16039,由 @mottopanikeiku 贡献)
  • 修复 hermes 带内扫描器在流式工具调用中暴露被截断工具名的问题:toolStart 现在会等待完整的 JSON 名称,因此名称中途被拆分或中断的流绝不会报告出部分工具名(#16064,由 @adi-IL 贡献)
  • 修复 keys.peek() 每次调用都在已存储账户间轮换的问题;现在它每次都返回第一个 token 未过期的账户,使模型发现持续读取同一账户的缓存目录(#16061,由 @gchai 贡献)
  • 修复在解引用、严格转换和值校验期间,带有 URI 百分号编码、JSON Pointer 转义或空的定义名称的本地 JSON Schema 引用解析错误的问题(#15926,由 @jchanghong023 贡献)
  • 修复网络失败只显示通用 "Connection error." 的问题;离线、连接被拒绝和 TLS 校验失败现在会指明主机与原因(#16036,由 @jorgoose 贡献)
  • 修复 Jev 图像限制在仅有 detail 变化时拒绝无关原生裁判的输入以及冗余 TypeSafe 图像判断的问题(#16002,由 @anatoli-tsinovoy 贡献)
  • 修复 SIGTERM 在替换用的 refresh token 保存之前中断进行中的 OAuth token 轮换的问题(#15845)
  • 修复会话在重放目标提供商不支持的工具名后卡在 HTTP 400 的问题,包括虚构的 proc://* 调用以及发送到 Bedrock 的 Google 工具名(#15839)

@oh-my-pi/pi-catalog

新增

  • 新增 request-encodings、request-encoding-rejection 和 endpoint-hosts 规则轴,以及 resolveRequestCompression(model, url) 和 isCatalogEndpointUrl(model, url),用于声明哪些提供商的自有端点会解码压缩的请求体:官方 Anthropic API(gzip)、Codex 后端(zstd)、以及 GitHub Copilot 的 API 主机(先 zstd 后 gzip);Moonshot 的中国主机计为其自有端点(#16086,由 @H4vC 贡献)

变更

  • OpenAI、Azure、OpenCode Zen 和 Command Code 上的捆绑 GPT-5.4 条目现在报告 1M 上下文窗口,即编码代理在运行时已经采用的窗口;GitHub Copilot 和 Factory Droid 保留各自的窗口(#16094,由 @H4vC 贡献)

修复

  • 修复声明了内置 providerType(Azure、GitHub Copilot、OpenCode、ClinePass、DeepSeek、NVIDIA)的自定义提供商缺失该提供商线上传输怪癖(wire quirks)的问题,例如严格的 Responses 配对和 ClinePass 的 reasoning 字段:它们现在遵循与内置提供商相同的目录规则(#16093,由 @H4vC 贡献)
  • 修复 OpenCode Zen 在刷新失败后重新带回其已退役捆绑模型的问题:重试退避写入不再丢弃缓存快照的保留,因此被修剪的目录能够度过重试窗口和离线启动(#16054,由 @adi-IL 贡献)
  • 修复在 Google Antigravity 上 providers.cacheWarming 对 Claude 从未激活的问题:那里的 Claude 模型现在声明 Vertex Anthropic 的五分钟 prompt-cache 生命周期;Gemini 模型保持不预热,因为 Google 的隐式缓存没有固定生命周期(#15764、#16025,由 @harshaygadekar 贡献)
  • 将 Jev 图像边界限定到所选模型,而不是应用到无关的原生裁判(#16002,由 @anatoli-tsinovoy 贡献)
  • 修复 Bedrock 会话在切换模型后拒绝超过 64 个字符的重放工具名的问题(#15839)

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

新增

  • 新增 statusLine.segmentOptions.pi.showProfile:设为 false 可隐藏 π 品牌旁边的 profile 名称,例如当每个 profile 已有各自的主题时(#16063,由 @shgew 贡献)
  • 新增 sharpshooter.minPromptLength(默认 16,最小值 2),用于控制 Sharpshooter 从中提取决策的最短 prompt(#16043,由 @bigHippoZz 贡献)

变更

  • 当选中官方 API 上的第一方 Anthropic 模型时,交互式 UI 会在启动时、切换模型时以及你开始输入时打开 API 连接,使下一轮跳过连接建立;第三方网关与自定义端点绝不会被探测(#16044,由 @H4vC 贡献)

API 连接预热现在覆盖所有内置提供商(Copilot、OpenAI、Gemini、OpenRouter 等),而不仅是 Anthropic:在轮次之间,它会经由所配置的代理与 CA 设置,保持上一次请求所用的连接处于打开状态,从而让下一轮跳过连接建立;自定义 models.yml 提供商、指向网关的内置提供商以及本地服务器永远不会被探测(#16086,由 @H4vC)

Snapcompact 现在会将图像化读取结果的缩进显示为计数括号([»2] 为两个制表符,[·4] 为四个空格),并将其 [path#TAG] 标头保留为文本,因此来自图像化读取的编辑能保持正确的缩进与标签(#15899,由 @apoc)

在 models.yml 中为自定义模型显式设置的 contextWindow 或 maxTokens,现在会优先于目录中针对该模型 id 的限制规则,而此前这些规则会将其覆盖(#16094,由 @H4vC)

修复

修复了 Claude Opus 5.5 在工具调用之间发送的回复(例如对任务中途所提问题的回答)被折叠进“Thought”块的问题;这些回复现在会在转录、打印模式、ACP 客户端和 HTML 导出中显示为普通回复文本

修复了 shell 的 du --time=ctime(也包括 status)在 Windows 上打印 ??? 的问题;它现在会显示最后写入时间,就像 stat 早已能显示状态更改时间那样

修复了 shell 的 rmdir dir/. 在 Windows 上会删除 dir(且 rmdir x/.. 会删除父目录)的问题;现在与 POSIX 一致,会以 Invalid argument / Directory not empty 失败

修复了 shell 的 dd if=DIR 在 Windows 上以 failed to open ...: Permission denied 失败的问题;现在与 POSIX 一致,它会打开该目录并连同传输统计信息报告 error reading ...: Is a directory

修复了 LSP mux 在其语言服务器子进程尚未退出时就从 shutdown 返回的问题,以及当一个会话在前一个会话仍在关闭其文档期间重连时会生成重复语言服务器的问题

修复了启动连接预热在 Windows 上静默不做任何事的问题,这是因为 Bun 的 fetch.preconnect 在该平台上会抛出异常(#16086,由 @H4vC)

修复了 RPC 帧编解码器(modes/rpc/rpc-frame)无法为 Node 打包的问题,原因是它引入了仅 Bun 可用的模块和原生插件(#16072,由 @oyty)

修复了 auth-gateway 严格探测在 Alibaba Coding Plan 和 Snowflake 登录时发送原始 token 而非结构化凭据 blob 的问题(#16092,由 @H4vC)

修复了在 Esc 仍在中断上一轮时发送的提示始终无法安定下来的问题,此前在上一轮结束之际被引导发送的消息会一直停留在队列中而不执行(#16038,由 @will-bogusz)

修复了当检出中包含同一仓库的链接工作树时(例如被 gitignore 的 .claude/worktrees/)隔离任务会导致宿主冻结的问题;这些工作树不再会被作为嵌套仓库进行快照(#16068)

修复了编辑移动在 hashline、patch 和 apply_patch 模式下丢失可执行权限的问题(#16042,由 @mottopanikeiku)

修复了在子代理视图的转录尚未回放完毕时就离开该视图,导致两个会话的行都留在屏幕上、其中一个会话的开头被丢弃、且原生 scrollback 被清除两次的问题;现在转录重建一次只运行一个,被取代的重建会被丢弃而不进行绘制(#16066,由 @cagedbird043)

修复了 Cursor 任务子代理在同一轮中的最终报告位于工具调用之后时会丢失该报告的问题(#16059)。

修复了 SQLite 读取延续提示丢失筛选条件与排序顺序、或截断下一页选择器的问题(#16040,由 @mottopanikeiku)

修复了 SQLite 表读取在示例行和查询结果中遗漏生成列、并拒绝在这些列上进行排序的问题(#16041,由 @mottopanikeiku)

修复了视频时间戳选择器(clip.mp4:2s、clip.mp4:0:05)对会话 cwd 之外的文件失效的问题,该问题还会在视频缺失时报告一个冒号错乱的路径。(#16056,由 @adi-IL)

修复了项目位于 home 目录内临时目录下时哈希会话目录的恢复问题,包括 Windows 默认临时目录(#15929,由 @jchanghong023)。

修复了 xd:// 设备分发和直接 MCP 工具的审批提示,使其显示可读且带缩进的参数,并将多行内容展开为块(#15589、#16048,由 @KunoLu)。

修复了启动时 retry.fallbackChains 对某些模型发出 “references unknown model” 警告的问题,这些模型是由发现提供程序在其后台刷新完成后才加载的(例如 Copilot 和 Cursor 的 -1m 变体);对发现完成后仍然缺失的模型只会警告一次(#16061,由 @gchai)

修复了当登录了两个 Copilot 账户时,仅被发现列表列出的 GitHub Copilot 模型(例如 -1m 变体)在启动时丢失的问题(#16061,由 @gchai)

修复了当存储的 Cursor access token 已过期时,仅被发现列表列出的 Cursor 模型(例如 -1m 变体)在启动时一直不可用、需等待后台刷新的问题;启动时的缓存读取现在使用与发现写入相同的账户键(#16061,由 @gchai)

修复了在顶层控制块内声明的 var 在一个被 await 的 JavaScript Eval 单元格之后消失的问题(#15859)。

修复了 eval 运行时状态提醒遗漏存活 Python 内核的问题,因此保留的 Python 状态不再被读作已死亡或不存在;Python 内核现在会像 JavaScript 内核一样,列出其代次、存活/死亡状态以及 %load 脚本(#16032)。

修复了当标签页的 worker 崩溃时(例如 Puppeteer 内部出错),浏览器调用挂起约 21 秒、且其标签页仍显示在列表中但已死亡的问题:现在调用会立即失败并附带原因,下一次调用会在同一页面上继续(#16037,由 @alnaggar-dev 和 @will-bogusz)

修复了 /restart 丢失默认会话目录之外显式打开的会话文件的问题,现在会直接恢复持久化的文件(#16030,由 @appboypov)

修复了失败的 todo 调用的隐藏提醒在代理已成功重试之后,仍带着过时列表在下一次提示时重新出现的问题(#16001)

修复了当仅有被忽略的图像 detail 发生变化时 TypeSafe 图像缓存无法复用的问题(#16002,由 @anatoli-tsinovoy)

修复了 ssh:// 忽略来自 ~/.ssh/config 的 ControlPath 的问题,因此它现在会复用已通过认证的 master(例如在 MFA/keyboard-interactive 主机上),而不是以 Permission denied 失败(#15974)

修复了 --session-dir <dir> --resume <id> 无法找到该目录中作为符号链接的 transcript、会话列表和 id 前缀查找以同样方式跳过符号链接的 transcript,以及必须重写此类 transcript 的 resume 操作会替换链接而不是更新其指向文件的问题;自身即符号链接的项目桶(project bucket)不再被遍历,因此扫描不会离开 sessions 根目录,也没有会话会被列出两次(#15878、#15882,作者 @AnxForever)。

修复了使用 SIGTERM 重启交互式会话会使正在轮换的 Anthropic OAuth 登录失效并要求再次 /login 的问题(#15845)。

修复了 URL 读取丢弃 500,000 字符之后所有内容的问题:tail 选择器、URL grep 以及链接的完整输出 artifact 现在能获取整个响应正文(#15768)。

修复了 find(工具和 omp find)在所有 judge 请求失败时报“无命中”的问题;现在会报 find 不可用并提示使用 grep,标记部分运行的失败 judge 请求数量,并在其详情和 --json 输出中以 coverage 形式暴露该状态(#15744)。

修复了带 eval 历史的恢复会话(--continue、--resume)在上一个进程的首次请求之后缺失 prompt 缓存的问题(#15736)。

修复了流式编辑预览失败时直接结束整个运行而不重试的问题:harness 现在会带着预览诊断重新驱动该轮次,使模型可以再次读取文件并修正补丁,仅在两次恢复之后才放弃并给出通知。

修复了当受保护资源未声明任何 scope 时,MCP OAuth 登录会请求授权服务器目录中所有 scope 的问题;/mcp reauth 现在会回退到已配置的 scope 或授权服务器默认值(#15996,作者 @unclesamwk)。

修复了未完成待办(incomplete-todo)停止提醒在 agent 的最终消息于收尾状态行之前请求许可或决策时触发(并恢复工作)的问题,包括通过 "If you confirm, I'll…" / "Separately, tell me…" 式请求,或以非英语提问后跟另一句话的情况(#15986)。

@oh-my-pi/pi-natives

破坏性变更

encodeSixel 和 encodeSixelAsync 现在要求第四个终端背景 RGB 参数,以 0xRRGGBB 打包(#15891,作者 @Bouska)。

修复

修复了 Windows 文件锁争用在现有 lease 允许同步但不允许完全互斥访问时返回权限错误的问题(#15930,作者 @jchanghong023)。

修复了 SIXEL 图像在调整大小时丢失半透明细节或显示深色、变色边缘的问题,同时保留完全透明的像素(#15891,作者 @Bouska)。

@oh-my-pi/omptype

修复

修复了以指数计数法书写的 TypeBox 数值边界在 schema 构建期间抛出异常的问题,同时保留校验和嵌套 JSON Schema 约束(#15925,作者 @jchanghong023)。

修复了导入包含 URI 百分号编码或 JSON Pointer 转义的本地 JSON Schema 定义引用的问题(#15926,作者 @jchanghong023)。

@oh-my-pi/omp-stats

修复

修复了用量统计在目录行没有价格时将 Google Antigravity 和 MiniMax Token Plan 模型定价为 $0 的问题;它们现在使用目录中的定价对等条目,正如 xai-oauth 此前的做法(#16092,作者 @H4vC)。

@oh-my-pi/pi-tui

破坏性变更

FindStats.errors 被 failed(失败的 judge 请求)和 unanswered(不可用的回答)取代,且 FindToolDetails 要求一个 coverage 状态;find 渲染器会显示 N/M 个请求失败(#15744)。

新增

向 StatusLineSegmentOptions 添加了 pi.showProfile:设为 false 时,在命名 profile 下、在渲染栏以及 describe 中都保留 pi 段的裸字形(#16063,作者 @shgew)。

修复

修复了在 tmux 内运行的会话在高负载机器上客户端终端类型探测响应缓慢时静默回退到终端 true-color profile 的问题(#16020,作者 @CharleoYang)。

修复了读取结果通知打印绝对解析路径的问题,因此 home 目录下的文件现在显示为 Resolved path: ~/notes.txt 而不是 /home/you/notes.txt(#16055,作者 @adi-IL)。

修复了 grep/read 预览和其他工具卡将文件内容中的原始转义序列传给终端的问题,该问题可能使终端切换到备用屏幕并开启鼠标上报,实时发生且每次 resume 时再次发生(#15963)。

修复了关闭后的最终状态行渲染又调度一次用量刷新的问题(#15845)。

修复了在 LSP 状态和其他纯文本 LSP 响应上按 Ctrl+O 仍将每一行截断在 80 列的问题;展开的行现在会换行以显示完整文本(#15824)。

修复了 Ctrl+O 在展开的 LSP、debug、MCP、web 搜索回退、yield、task 和自定义工具结果中长行仍被截断的问题;展开的行现在会换行以显示完整文本,展开的 LSP references 会列出每个位置,且当没有内容被隐藏时 LSP 展开提示不再出现(#15824)。

修复了 SIXEL 图像中文字锯齿和半透明细节消失的问题,包括在终端报告背景颜色变化时进行重新编码(#15891,作者 @Bouska)。

修复了终端重启、原生外观变化和 TSP 握手失败后 SIXEL 背景陈旧的问题,包括握手期间的背景变化、固定主题、缺失或无效的启动主题,以及相同的亮/暗映射(#15891,作者 @Bouska)。

@oh-my-pi/pi-utils

新增

新增了 sanitizeTextDeep(),它对 JSON 形状的值中的每个字符串应用 sanitizeText() 而不修改原值(#15963)。

修复

修复了 Windows 归档解压在没有符号链接权限时复制符号链接条目会覆盖现有文件或跟随现有符号链接的问题(#15931,作者 @jchanghong023)。

变更内容

  • anthropic gzip 与预热连接,作者 @H4vC,#16044
  • fix(tui): composite SIXEL transparency against terminal backgrounds,作者 @Bouska,#15891
  • fix(coding-agent): 逐个运行 transcript 重建并丢弃已被取代的重建,作者 @cagedbird043,#16066
  • fix(coding-agent): 使在中断收尾期间开始的一轮正常收尾,作者 @will-bogusz,#16038
  • fix(ai): 呈现 Ollama 的带内流式错误,作者 @mottopanikeiku,#16039
  • fix(coding-agent): 编辑移动文件时保留文件权限,作者 @mottopanikeiku,#16042
  • fix(task): 工具调用后保留光标的最终报告,作者 @roboomp,#16060
  • fix(task): 在嵌套仓库基线中跳过树内链接的 worktree,由 @roboomp 在 #16069 中提交
  • fix(omptype): 校验指数形式数值的边界,由 @jchanghong023 在 #15925 中提交
  • fix(coding-agent): 迁移被 temp 遮蔽的哈希主目录会话,由 @jchanghong023 在 #15929 中提交
  • fix(natives): 对文件租约仅请求同步访问,由 @jchanghong023 在 #15930 中提交
  • fix(utils): 在归档符号链接回退中保留独占目标,由 @jchanghong023 在 #15931 中提交
  • fix(coding-agent): 在关闭用户请求时抑制 todo 提醒,由 @roboomp 在 #15991 中提交
  • fix(catalog): 为 Google Antigravity 上的 Claude 声明 Vertex 的 prompt-cache 生存期,由 @harshaygadekar 在 #16025 中提交
  • fix(coding-agent): 在 SQLite 下一页提示中保留 where 和 order,由 @mottopanikeiku 在 #16040 中提交
  • fix(coding-agent): 在 SQLite 表读取中包含生成列,由 @mottopanikeiku 在 #16041 中提交
  • fix(catalog): 在刷新失败后仍保留权威缓存,由 @adi-IL 在 #16054 中提交
  • fix(tui): 缩短读取结果通知中的已解析路径,由 @adi-IL 在 #16055 中提交
  • fix(coding-agent): 解析位于会话 cwd 之外的视频时间戳选择器,由 @adi-IL 在 #16056 中提交
  • fix(ai): 在 hermes 带内 toolStart 之前要求完整的工具名,由 @adi-IL 在 #16064 中提交
  • fix(tui): 将 tmux client-termtype 探测预算放宽至 2 秒,由 @CharleoYang 在 #16020 中提交
  • fix(schema): 解码 URI 片段定义引用,由 @jchanghong023 在 #15926 中提交
  • fix(ssh): 为 ssh:// 连接复用 ssh_config 的 ControlPath,由 @roboomp 在 #15976 中提交
  • fix(session): 在重试成功后丢弃过期的 todo 错误提醒,由 @roboomp 在 #16003 中提交
  • 在重启时恢复已持久化的会话文件(WORK-1187),由 @appboypov 在 #16030 中提交
  • fix(eval): 向 eval 状态注册表报告被保留的 python 内核,由 @roboomp 在 #16035 中提交
  • fix(ai): 将离线/DNS 失败具名,而非笼统的 Connection error,由 @jorgoose 在 #16036 中提交
  • fix(browser): 重新附加 worker 意外退出的标签页,由 @will-bogusz 在 #16037 中提交
  • fix(ai,coding-agent): 停止启动时回退链产生的虚假 “unknown model” 警告,由 @gchai 在 #16061 中提交
  • fix(session): 持久化启动时的 eval 状态上下文快照,由 @roboomp 在 #15743 中提交
  • fix(find): 在所有 judge 请求失败时报告不可用,由 @roboomp 在 #15747 中提交
  • fix(coding-agent): 使超过 500k 字符的 URL 读取正文保持完整,由 @roboomp 在 #15786 中提交
  • fix(coding-agent): 在流式编辑预览失败后重新驱动该轮次,由 @chefnaphtha 在 #15790 中提交
  • fix(agent): 将 Cursor 工具结果保留在上下文中,供运行内后续跟进使用,由 @robfeldmann 在 #15821 中提交
  • fix(tui): 在展开的工具结果中显示完整行,由 @roboomp 在 #15829 中提交
  • fix(ai): 丢弃名称含无法声明字符的重放工具调用,由 @roboomp 在 #15840 中提交
  • fix(auth): 在 sigterm 时保留已轮换的 oauth 令牌,由 @roboomp 在 #15849 中提交
  • fix(eval): 在被 await 的单元间保留 block 变量绑定,由 @roboomp 在 #15863 中提交
  • fix(session): 找到会话目录中作为符号链接的 transcript,由 @AnxForever 在 #15882 中提交
  • feat(coding-agent): 在 snapcompact 帧中编码读取内容的缩进,由 @apoc 在 #15899 中提交
  • fix(tui): 从工具结果详情中剥离控制序列,由 @roboomp 在 #15964 中提交
  • fix(judgment): 限定 Jev 限制的作用域并复用 TypeSafe 图像缓存,由 @anatoli-tsinovoy 在 #16002 中提交
  • fix(coding-agent): 以可读形式显示设备与 MCP 审批参数,由 @KunoLu 在 #16048 中提交
  • fix(mcp): 避免请求 OAuth scope 目录,由 @unclesamwk 在 #15996 中提交
  • feat(tui): 新增 segmentOptions.pi.showProfile 用于隐藏 profile 标签,由 @shgew 在 #16063 中提交
  • feat(coding-agent): 使 Sharpshooter 的提示词长度门槛可配置,由 @bigHippoZz 在 #16043 中提交
  • fix(coding-agent): 在 rpc-frame 中从 pi-utils/type-guards 导入 isRecord,由 @oyty 在 #16072 中提交
  • feat(ai): 面向 catalog 提供方的 KDL 驱动请求压缩与连接预热,由 @H4vC 在 #16086 中提交
  • refactor: 从现有 KDL 规则读取重复的模型/提供方策略,由 @H4vC 在 #16092 中提交
  • refactor(catalog): 将硬编码的提供方 wire 怪癖移入 KDL 规则,由 @H4vC 在 #16093 中提交
  • refactor: 将字面量 model-id 策略与角色默认链移入 KDL,由 @H4vC 在 #16094 中提交

新贡献者

  • @Bouska 在 #15891 中做出了首次贡献
  • @appboypov 在 #16030 中做出了首次贡献
  • @gchai 在 #16061 中做出了首次贡献
  • @chefnaphtha 在 #15790 中做出了首次贡献
  • @robfeldmann 在 #15821 中做出了首次贡献
  • @AnxForever 在 #15882 中做出了首次贡献
  • @KunoLu 在 #16048 中做出了首次贡献
  • @unclesamwk 在 #15996 中做出了首次贡献
  • @bigHippoZz 在 #16043 中做出了首次贡献
  • @oyty 在 #16072 中做出了首次贡献

完整变更日志:v18.11.3...v18.12.0

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

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

Fixed

Fixed Cursor turns failing with PROVIDER_ERROR when a follow-up (a finished background job, a late diagnostic, a reminder) arrived while the previous turn was still streaming (#15821 by @robfeldmann)

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

PI_CODEX_ZSTD is replaced by PI_REQUEST_COMPRESSION; set PI_REQUEST_COMPRESSION=0 to send Codex (and every other) request body uncompressed (#16086 by @H4vC)

Added

Added ThinkingContent.narration, set on Anthropic and Bedrock thinking blocks whose signature marks them as between-tool narration, and presentNarrationAsAnswer(message) to show those blocks as reply text while replay keeps them as signed thinking Added keys.peek(provider, { includeExpired: true }) to name the stored account behind an expired OAuth token for reads that never send it, such as keying an offline model-cache lookup (#16061 by @gchai) Added prewarmModelConnection(model) (providers/connection-prewarm), which opens the model's API connection ahead of a request using the same transport and TLS settings so the request reuses it instead of paying the connection handshake (#16086 by @H4vC)

Changed

Anthropic requests to the official API now gzip the request body, so long conversations reach the model sooner on slow uplinks; set PI_REQUEST_COMPRESSION=0 to disable it (#16044 by @H4vC) GitHub Copilot requests (chat completions, Responses, and Claude messages) now send zstd-compressed bodies, cutting upload size by roughly 60–75% on long conversations; set PI_REQUEST_COMPRESSION=0 to disable it (#16086 by @H4vC) A rejected request-body encoding now only disables compression for that host, and only after the uncompressed resend succeeds, so a genuine 400 no longer turns compression off (#16086 by @H4vC) Connection warm-up now covers every catalog provider, not only the official Anthropic API: it re-warms the origin a model's requests actually reach (Copilot plan hosts, MOONSHOT_BASE_URL, regional hosts), throttled per host; custom providers, built-in provider ids routed to a gateway, local hosts, and Anthropic gateways are never probed (#16086 by @H4vC)

Fixed

Fixed Ollama and Ollama Cloud streaming errors being silently accepted as successful responses (#16039 by @mottopanikeiku) Fixed the hermes in-band scanner exposing a truncated tool name for streaming tool calls: toolStart now waits for the complete JSON name, so a stream that splits or stops mid-name never reports a partial tool name (#16064 by @adi-IL) Fixed keys.peek() rotating through stored accounts on each call; it now returns the first account whose token has not expired, every time, so model discovery keeps reading one account's cached catalog (#16061 by @gchai) Fixed local JSON Schema references with URI-percent-encoded, JSON Pointer-escaped, or empty definition names resolving incorrectly during dereferencing, strict conversion, and value validation (#15926 by @jchanghong023). Fixed network failures showing a generic "Connection error."; offline, connection-refused, and TLS-verification failures now name the host and the cause (#16036 by @jorgoose) Fixed Jev image limits rejecting inputs for unrelated native judges and redundant TypeSafe image judgments when only detail changes (#16002 by @anatoli-tsinovoy). Fixed SIGTERM interrupting an in-flight OAuth token rotation before its replacement refresh token was saved (#15845). Fixed sessions getting stuck on HTTP 400 after replaying tool names unsupported by the target provider, including invented proc://* calls and Google tool names sent to Bedrock (#15839)

@oh-my-pi/pi-catalog

Added

Added the request-encodings, request-encoding-rejection, and endpoint-hosts rule axes, resolveRequestCompression(model, url), and isCatalogEndpointUrl(model, url), declaring which providers' own endpoints decode compressed request bodies: official Anthropic API (gzip), Codex backend (zstd), and GitHub Copilot's API hosts (zstd, then gzip); Moonshot's China host counts as its own endpoint (#16086 by @H4vC)

Changed

Bundled GPT-5.4 rows on OpenAI, Azure, OpenCode Zen, and Command Code report a 1M context window, the window the coding agent already applied at runtime; GitHub Copilot and Factory Droid keep their own windows (#16094 by @H4vC)

Fixed

Fixed custom providers that declare a built-in providerType (Azure, GitHub Copilot, OpenCode, ClinePass, DeepSeek, NVIDIA) missing that provider's wire quirks, such as strict Responses pairing and the ClinePass reasoning field: they now follow the same catalog rules as the built-in provider (#16093 by @H4vC) Fixed OpenCode Zen bringing back its retired bundled models after a failed refresh: the retry-backoff write no longer drops the cached snapshot's retention, so the pruned catalog survives the retry window and offline launches. (#16054 by @adi-IL) Fixed providers.cacheWarming never arming for Claude on Google Antigravity: Claude models there now declare Vertex Anthropic's five-minute prompt-cache lifetime; Gemini models stay unwarmed because Google's implicit cache has no fixed lifetime (#15764, #16025 by @harshaygadekar) Scoped Jev image bounds to the selected models instead of applying them to unrelated native judges (#16002 by @anatoli-tsinovoy) Fixed Bedrock sessions rejecting replayed tool names over 64 characters after a model switch (#15839)

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

Added

Added statusLine.segmentOptions.pi.showProfile: set it to false to hide the profile name next to the π brand, for example when each profile already has its own theme (#16063 by @shgew) Added sharpshooter.minPromptLength (default 16, minimum 2) to control the shortest prompt Sharpshooter extracts decisions from (#16043 by @bigHippoZz)

Changed

With a first-party Anthropic model on the official API selected, the interactive UI opens the API connection at startup, on model switch, and when you start typing, so the next turn skips connection setup; third-party gateways and custom endpoints are never probed (#16044 by @H4vC) The API connection warm-up now covers every built-in provider (Copilot, OpenAI, Gemini, OpenRouter, …), not only Anthropic: between turns it keeps the connection your last request used open, through the configured proxy and CA settings, so the next turn skips connection setup; custom models.yml providers, built-in providers pointed at a gateway, and local servers are never probed (#16086 by @H4vC) Snapcompact now shows an imaged read result's indentation as count brackets ([»2] two tabs, [·4] four spaces) and keeps its [path#TAG] header as text, so edits from imaged reads keep the right indentation and tag (#15899 by @apoc) A custom model's explicit contextWindow or maxTokens in models.yml now wins over the catalog's limit rules for that model id, which previously overwrote it (#16094 by @H4vC)

Fixed

Fixed Claude Opus 5.5 replies sent between tool calls (for example an answer to a question asked mid-task) being folded into the "Thought" block; they now show as normal reply text in the transcript, print mode, ACP clients, and HTML exports Fixed the shell's du --time=ctime (also status) printing ??? on Windows; it now shows the last write time, as stat already does for the status-change time Fixed the shell's rmdir dir/. on Windows removing dir (and rmdir x/.. the parent); like POSIX it now fails with Invalid argument / Directory not empty Fixed the shell's dd if=DIR on Windows failing with failed to open ...: Permission denied; like POSIX it now opens the directory and reports error reading ...: Is a directory with the transfer statistics Fixed the LSP mux returning from shutdown before its language-server children exited, and spawning a duplicate language server when a session reconnected while the previous one was still closing its documents Fixed the startup connection warm-up silently doing nothing on Windows, where Bun's fetch.preconnect throws (#16086 by @H4vC) Fixed the RPC frame codec (modes/rpc/rpc-frame) failing to bundle for Node because it pulled in Bun-only modules and the native addon (#16072 by @oyty) Fixed auth-gateway strict probes sending a raw token instead of the structured credential blob for Alibaba Coding Plan and Snowflake logins (#16092 by @H4vC) Fixed a prompt sent while Esc was still interrupting the previous turn never settling, so a message steered in as it ended stayed queued instead of running (#16038 by @will-bogusz) Fixed isolated tasks freezing the host when the checkout holds linked worktrees of the same repository (e.g. gitignored .claude/worktrees/); those worktrees are no longer snapshotted as nested repos (#16068) Fixed edit moves dropping executable permissions in hashline, patch, and apply_patch modes (#16042 by @mottopanikeiku) Fixed leaving a subagent view before its transcript finished replaying leaving rows of both sessions on screen, dropping the start of one, and clearing native scrollback twice; transcript rebuilds now run one at a time and a superseded rebuild is discarded without painting (#16066 by @cagedbird043) Fixed Cursor task subagents losing their final report when it follows tool calls in the same turn (#16059). Fixed SQLite read continuation hints dropping filters and sort order or truncating the next-page selector (#16040 by @mottopanikeiku) Fixed SQLite table reads omitting generated columns from sample rows and query results, and rejecting sort orders on those columns (#16041 by @mottopanikeiku) Fixed video timestamp selectors (clip.mp4:2s, clip.mp4:0:05) failing for files outside the session cwd, which also reported a colon-mangled path when the video was missing. (#16056 by @adi-IL) Fixed recovery of hashed session directories for projects under a temporary directory inside home, including the default Windows temp directory (#15929 by @jchanghong023). Fixed approval prompts for xd:// device dispatches and direct MCP tools to show readable, indented arguments with multiline content expanded into blocks (#15589, #16048 by @KunoLu). Fixed retry.fallbackChains warning "references unknown model" at startup for models a discovery provider loads once its background refresh finishes (e.g. Copilot and Cursor -1m variants); a model still missing after discovery is warned about once (#16061 by @gchai) Fixed GitHub Copilot models that only discovery lists (e.g. -1m variants) going missing at startup when two Copilot accounts are signed in (#16061 by @gchai) Fixed Cursor models that only discovery lists (e.g. -1m variants) staying unavailable at startup until a background refresh whenever the stored Cursor access token had expired; the startup cache read now uses the same account key as the discovery write (#16061 by @gchai) Fixed var declared inside a top-level control block disappearing after an awaited JavaScript Eval cell (#15859). Fixed the eval runtime-state reminder omitting live Python kernels, so retained Python state no longer reads as dead or absent; Python kernels are listed with their generation, alive/dead status, and %load scripts like JavaScript kernels (#16032). Fixed a browser call hanging for about 21 s, and its tab staying listed but dead, when the tab's worker crashed (such as on an error inside Puppeteer): the call fails at once with the cause and the next call continues on the same page (#16037 by @alnaggar-dev and @will-bogusz) Fixed /restart losing explicitly opened session files outside the default session directories by resuming the persisted file directly (#16030 by @appboypov) Fixed a failed todo call's hidden reminder resurfacing on the next prompt with an outdated list after the agent had already retried successfully (#16001) Fixed TypeSafe image-cache reuse when only ignored image detail changes (#16002 by @anatoli-tsinovoy) Fixed ssh:// ignoring a ControlPath from ~/.ssh/config, so it now reuses an already-authenticated master (e.g. on MFA/keyboard-interactive hosts) instead of failing with Permission denied (#15974) Fixed --session-dir <dir> --resume <id> not finding a transcript that is a symlink in that directory, the session lists and id-prefix lookups skipping symlinked transcripts the same way, and a resume that must rewrite such a transcript replacing the link instead of updating the file it points at; a project bucket that is itself a symlink is no longer traversed, so a scan cannot leave the sessions root and no session is listed twice (#15878, #15882 by @AnxForever) Fixed restarting an interactive session with SIGTERM disabling a rotating Anthropic OAuth login and requiring /login again (#15845). Fixed URL read dropping everything past 500,000 characters: tail selectors, URL grep, and the linked full-output artifact now reach the whole response body (#15768). Fixed find (tool and omp find) reporting "no hits" when every judge request failed; it now reports find unavailable with a hint to use grep, flags partial runs with how many judge requests failed, and exposes the status as coverage in its details and --json output (#15744) Fixed resumed sessions with eval history (--continue, --resume) missing the prompt cache after the previous process's first request (#15736) Fixed a failed streamed edit preview ending the whole run without retry: the harness now re-drives the turn with the preview diagnostic so the model can read the file again and correct the patch, and gives up with a notice only after two recoveries Fixed MCP OAuth login requesting every scope in an authorization server's catalogue when the protected resource advertises no scopes; /mcp reauth now falls back to configured scopes or authorization-server defaults (#15996 by @unclesamwk). Fixed the incomplete-todo stop reminder firing (and resuming work) when the agent's final message asks for permission or a decision before a closing status line, through "If you confirm, I'll…"/"Separately, tell me…"-style requests, or with a non-English question followed by another sentence (#15986)

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

encodeSixel and encodeSixelAsync now require a fourth terminal-background RGB argument packed as 0xRRGGBB (#15891 by @Bouska).

Fixed

Fixed Windows file-lock contention returning permission errors when an existing lease allows synchronization but not full mutex access (#15930 by @jchanghong023). Fixed SIXEL images dropping translucent details or showing dark, discolored edges when resized, while preserving fully transparent pixels (#15891 by @Bouska).

@oh-my-pi/omptype

Fixed

Fixed TypeBox numeric bounds written in exponent notation throwing during schema construction, while preserving validation and nested JSON Schema constraints (#15925 by @jchanghong023). Fixed importing local JSON Schema definition references containing URI percent encoding or JSON Pointer escapes (#15926 by @jchanghong023).

@oh-my-pi/omp-stats

Fixed

Fixed usage stats pricing Google Antigravity and MiniMax Token Plan models at $0 when their catalog rows carry no price; they now use the catalog's pricing peer, as xai-oauth already did (#16092 by @H4vC)

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

FindStats.errors is replaced by failed (judge requests that failed) and unanswered (unusable answers), and FindToolDetails requires a coverage status; the find renderer shows N/M requests failed (#15744)

Added

Added pi.showProfile to StatusLineSegmentOptions: false keeps the pi segment's bare glyph under a named profile, in the rendered bar and in describe (#16063 by @shgew)

Fixed

Fixed sessions run inside tmux silently falling back to the terminal's true-color profile when the client terminal-type probe answered slowly on a loaded machine (#16020 by @CharleoYang) Fixed the read result notice printing the absolute resolved path, so a file under the home directory reads Resolved path: ~/notes.txt instead of /home/you/notes.txt (#16055 by @adi-IL). Fixed grep/read previews and other tool cards passing raw escape sequences from file contents to the terminal, which could switch it to the alternate screen with mouse reporting on, live and again on every resume (#15963) Fixed a final status-line render after shutdown scheduling another usage refresh (#15845). Fixed Ctrl+O on LSP status and other plain LSP responses still clipping every row at 80 columns; expanded rows now wrap to show the full text (#15824) Fixed Ctrl+O leaving long rows clipped in expanded LSP, debug, MCP, web search fallback, yield, task and custom-tool results; expanded rows now wrap to show the full text, expanded LSP references list every location, and the LSP expand hint no longer appears when nothing is hidden (#15824) Fixed jagged text and disappearing translucent details in SIXEL images, including re-encoding when the terminal reports a changed background color (#15891 by @Bouska). Fixed stale SIXEL backgrounds after terminal restarts, native appearance changes, and failed TSP handshakes, including background changes during the handshake, fixed themes, missing or invalid startup themes, or identical light/dark mappings (#15891 by @Bouska).

@oh-my-pi/pi-utils

Added

Added sanitizeTextDeep(), which applies sanitizeText() to every string in a JSON-shaped value without mutating it (#15963)

Fixed

Fixed Windows archive extraction overwriting existing files or following existing symlinks when copying a symlink entry without symlink privileges (#15931 by @jchanghong023).

What's Changed

anthropic gzip and prewarmed connection by @H4vC in #16044

  • fix(tui): composite SIXEL transparency against terminal backgrounds by @Bouska in #15891
  • fix(coding-agent): run transcript rebuilds one at a time and drop superseded ones by @cagedbird043 in #16066
  • fix(coding-agent): settle a turn begun while an interrupt is finishing by @will-bogusz in #16038
  • fix(ai): surface Ollama in-band streaming errors by @mottopanikeiku in #16039
  • fix(coding-agent): keep file permissions when edit moves a file by @mottopanikeiku in #16042
  • fix(task): preserved cursor final reports after tool calls by @roboomp in #16060
  • fix(task): skipped in-tree linked worktrees in nested-repo baseline by @roboomp in #16069
  • fix(omptype): validate exponent-form numeric bounds by @jchanghong023 in #15925
  • fix(coding-agent): migrate hashed home sessions shadowed by temp by @jchanghong023 in #15929
  • fix(natives): request only synchronization access for file leases by @jchanghong023 in #15930
  • fix(utils): preserve exclusive destinations in archive symlink fallback by @jchanghong023 in #15931
  • fix(coding-agent): suppressed todo reminder for closing user requests by @roboomp in #15991
  • fix(catalog): declare Vertex's prompt-cache lifetime for Claude on Google Antigravity by @harshaygadekar in #16025
  • fix(coding-agent): keep where and order in SQLite next-page hints by @mottopanikeiku in #16040
  • fix(coding-agent): include generated columns in SQLite table reads by @mottopanikeiku in #16041
  • fix(catalog): keep authoritative cache retention across a failed refresh by @adi-IL in #16054
  • fix(tui): shorten the resolved path in the read result notice by @adi-IL in #16055
  • fix(coding-agent): resolve video timestamp selectors outside the session cwd by @adi-IL in #16056
  • fix(ai): require a complete tool name before hermes in-band toolStart by @adi-IL in #16064
  • fix(tui): widened the tmux client-termtype probe budget to 2s by @CharleoYang in #16020
  • fix(schema): decode URI-fragment definition references by @jchanghong023 in #15926
  • fix(ssh): reused ssh_config ControlPath for ssh:// connections by @roboomp in #15976
  • fix(session): dropped stale todo-error reminders after successful retry by @roboomp in #16003

Resume persisted session files on restart (WORK-1187) by @appboypov in #16030

  • fix(eval): reported retained python kernels to the eval state registry by @roboomp in #16035
  • fix(ai): name offline/DNS failures instead of a generic Connection error by @jorgoose in #16036
  • fix(browser): reattach a tab whose worker exits unexpectedly by @will-bogusz in #16037
  • fix(ai,coding-agent): stop spurious fallback-chain "unknown model" warnings at startup by @gchai in #16061
  • fix(session): persisted the startup eval-state-context snapshot by @roboomp in #15743
  • fix(find): reported unavailable when every judge request failed by @roboomp in #15747
  • fix(coding-agent): kept url read bodies whole past 500k chars by @roboomp in #15786
  • fix(coding-agent): re-drive the turn after a failed streamed edit preview by @chefnaphtha in #15790
  • fix(agent): kept Cursor tool results in context for in-run follow-ups by @robfeldmann in #15821
  • fix(tui): revealed full rows in expanded tool results by @roboomp in #15829
  • fix(ai): dropped replayed tool calls with undeclarable name characters by @roboomp in #15840
  • fix(auth): preserved rotated oauth tokens on sigterm by @roboomp in #15849
  • fix(eval): preserved block var bindings across awaited cells by @roboomp in #15863
  • fix(session): found transcripts that are symlinks in a session directory by @AnxForever in #15882
  • feat(coding-agent): encode read indentation in snapcompact frames by @apoc in #15899
  • fix(tui): stripped control sequences from tool result details by @roboomp in #15964
  • fix(judgment): scope Jev limits and reuse TypeSafe image cache by @anatoli-tsinovoy in #16002
  • fix(coding-agent): show readable device and MCP approval arguments by @KunoLu in #16048
  • fix(mcp): avoid requesting OAuth scope catalogues by @unclesamwk in #15996
  • feat(tui): added segmentOptions.pi.showProfile to hide the profile tag by @shgew in #16063
  • feat(coding-agent): make Sharpshooter's prompt-length gate configurable by @bigHippoZz in #16043
  • fix(coding-agent): import isRecord from pi-utils/type-guards in rpc-frame by @oyty in #16072
  • feat(ai): KDL-driven request compression and connection prewarm for catalog providers by @H4vC in #16086
  • refactor: read duplicated model/provider policy from existing KDL rules by @H4vC in #16092
  • refactor(catalog): move hard-coded provider wire quirks into KDL rules by @H4vC in #16093
  • refactor: move literal model-id policy and role default chains into KDL by @H4vC in #16094

New Contributors

@Bouska made their first contribution in #15891 @appboypov made their first contribution in #16030 @gchai made their first contribution in #16061 @chefnaphtha made their first contribution in #15790 @robfeldmann made their first contribution in #15821 @AnxForever made their first contribution in #15882 @KunoLu made their first contribution in #16048 @unclesamwk made their first contribution in #15996 @bigHippoZz made their first contribution in #16043 @oyty made their first contribution in #16072

Full Changelog: v18.11.3...v18.12.0

原文入口

阅读原文(github.com)

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

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

了解来源批准与收录规则