pi v0.84.0 版本更新介绍
发布日期: 2026-08-06
版本号: v0.84.0
该软件 v0.84.0 版本带来了多项新功能,包括支持运行时切换的全屏终端界面模式、交互式记录中的 Mermaid 图表和终端友好型 LaTeX 数学渲染、用于覆盖特定目录上下文文件的 AGENTS.override.md 机制、高级自定义模型采样参数配置(包括对 vLLM thinking_token_budget 的支持)以及内置的 Baseten 模型提供商。同时,本次更新也包含了一些破坏性变更,例如重命名了某些接口、改变了事件更新格式以避免输出二次增长、修改了模型注册表和运行时 API 的签名与返回值、以及将实验性会话 API 升级为稳定版本并移除了旧的存储库接口。此外,更新还修复了大量问题,涵盖了跨平台文件处理、凭证管理、会话存储、UI 交互、性能优化以及多个模型提供商的兼容性等方面,提升了整体稳定性与用户体验。
更新内容 (中文)
新特性
- 全屏TUI模式 — 运行时可在常规模式与全屏模式间切换,包含固定编辑器和页脚、独立可滚动对话记录以及可拖拽滚动条。详见 UI与显示。
- Mermaid与LaTeX渲染 — 在交互式对话记录中渲染Mermaid图表和适用于终端的Unicode数学符号。详见 Markdown设置 和 TUI Markdown。
- 按目录覆盖上下文 — 使用
AGENTS.override.md为特定目录替换上下文文件。详见 上下文文件。 - 高级自定义模型采样 — 配置任意OpenAI兼容的
samplingParams并选择启用vLLMthinking_token_budget值。详见 采样参数。 - Baseten提供商 — 使用内置的Baseten身份验证和模型支持。详见 API密钥。
破坏性变更
-
将继承的pi-ai
ModelsStreamTransforms接口重命名为ModelsRequestTransforms,因为其头部转换现在适用于所有经过身份验证的提供商请求。 -
更改了JSON和RPC
message_update事件,仅发出assistantMessageEvent增量,移除了导致输出量二次增长的累计message和assistantMessageEvent.partial字段。需要部分消息的客户端必须在message_start和message_end之间组装增量;后者保持权威性 (#7290)。 -
ModelRegistry.getApiKeyAndHeaders()现在返回ProviderHeaders,其值为string | null并保留null头部删除标记。检查返回头部的扩展必须处理null;将这些头部转发到pi-ai流的扩展应原样传递。这防止了占位符OpenAI凭据通过Cloudflare AI Gateway发送 (#7030)。 -
更改了
ModelRegistry.refresh()以接受ModelsRefreshOptions并返回ModelsRefreshResult,而不是丢弃取消和提供商错误。 -
更改了
ModelRuntime.setRuntimeApiKey()以接受身份验证取消选项,而不是目录刷新选项。当需要远程新鲜度时,单独调用refresh({ providers: [providerId], signal })。 -
要求配置表单扩展OAuth
refreshToken(credentials, signal)回调接受并遵守具体的终止信号。 -
用只读的
context.stored快照和经过世代检查的context.publish()事务替换了动态提供商刷新上下文存储访问。使用
createProvider({ fetchModels })构建的提供商: 无需进行目录发布迁移。之前和之后,都返回获取的模型并注册生成的提供商;createProvider()负责恢复、持久化和内存中发布。// 之前 const beforeProvider = createProvider({ // ... fetchModels: async ({ signal }) => { const response = await fetch(catalogUrl, { signal }); return parseModels(await response.json()); }, }); pi.registerProvider(beforeProvider); // 之后:未更改 const afterProvider = createProvider({ // ... fetchModels: async ({ signal }) => { const response = await fetch(catalogUrl, { signal }); return parseModels(await response.json()); }, }); pi.registerProvider(afterProvider);手写原生
Provider.refreshModels(): 用经过世代保护的发布替换直接的存储访问和发布前变更。// 之前 refreshModels: async (context) => { const stored = await context.store.read(); if (stored) currentModels = stored.models; if (!context.allowNetwork) return; const refreshed = await fetchModels(context.signal); currentModels = refreshed; await context.store.write({ models: refreshed, checkedAt: Date.now() }); }, // 之后 refreshModels: async (context) => { if (context.stored) { const restored = context.stored.models; if (!(await context.publish({ update: () => { currentModels = restored; }, }))) return; } if (!context.allowNetwork) return; const refreshed = await fetchModels(context.signal); if (context.signal.aborted) return; await context.publish({ persist: { models: refreshed, checkedAt: Date.now() }, update: () => { currentModels = refreshed; }, }); },对于配置表单
pi.registerProvider(name, { refreshModels }),仅返回模型的回调保持不变;pi发布返回的列表。如果此类回调之前使用context.store进行自定义持久化,请读取context.stored并调用context.publish({ persist: entry })。在publish()中,省略persist以保持存储不变,传递ModelsStoreEntry以写入,或传递persist: null以删除。 -
用基于v4通道的
Session、SessionStorage和SessionRepoAPI 替换了继承的pi-agent-core测试工具会话模型,包括持久化操作记录、全局事实、共享序列号和树作用域通道视图。 -
将继承的v2会话和
AgentHarnessAPI 从pi-agent-core的实验性入口点提升为默认导出,并移除了实验性子路径。 -
移除了继承的旧版JSONL和内存中存储库API。使用pi-agent-core的v4
JsonlSessionRepo或InMemorySessionRepo,两者都实现了新的SessionRepo契约。 -
添加了继承的所需pi-agent-core
FileSystem.renameFile()操作,用于原子JSONL发布;自定义测试工具文件系统实现必须提供相同文件系统替换语义 (#7707 by @davidbrai)。 -
用持久化的
SessionMetadata替换了实验性的远程会话列表摘要;RemoteSession.sessions不再暴露运行阶段、模型、思考、附件或锁定状态,这些仍可从获取的SessionSnapshot值中获得 (#7708)。
新增
- 新增了内置的Baseten提供商支持,使用
BASETEN_API_KEY身份验证,默认模型为zai-org/GLM-5.2。 - 新增了实验性的远程会话客户端API:传输无关的
PiClient、CBOR协议、Unix套接字传输以及@earendil-works/pi-coding-agent/clientRemoteSession控制器,带对话记录减速器。详见 Pi Client 和 远程协议 (#7344, #7348, #7371, #7409)。 - 新增了
CredentialSynchronizationError,用于凭据更改提交成功但未能同步本地模型状态的情况。 - 新增了可链接的
pi.registerMarkdownTransformer()钩子,用于对用户和助手Markdown进行仅显示转换。详见pi.registerMarkdownTransformer()(#7231 by @xl0)。 - 新增了实验性全屏TUI模式,可通过
--tui-mode fullscreen或/settings选择 (#7304)。 - 新增了通过
/settings在常规和全屏TUI模式间运行时切换的功能。 - 在全屏模式下新增了固定编辑器、状态、小部件和页脚停靠栏,同时保持对话记录独立可滚动。
- 在全屏模式下新增了可拖拽的对话记录滚动条,可通过
/settings配置auto、always和hidden模式;always保留最右列。 - 在全屏模式下新增了页面滚动和标记消息导航快捷键。
- 新增了可选的
scrollbarThumb主题色,用于全屏滚动条滑块,回退到selectedBg。 - 新增了对交互式消息中支持的Mermaid图表的可配置主题化Unicode渲染,包括流式传输时的可选渲染。详见 Markdown设置 (#7624 by @xl0)。
- 新增了可选的
Ctrl+P/Ctrl+N提示历史导航,当编辑器获得焦点时,显式历史绑定优先于应用程序快捷键。 - 新增了按目录的
AGENTS.override.md上下文文件,它们替换同一目录中的AGENTS.md或CLAUDE.md,同时保留其他目录的上下文。详见 上下文文件 (#7681 by @Marvae)。 - 在CLI和RPC子进程环境中新增了
AI_AGENT=pi,用于通用代理归属。详见 环境变量 (#7493 by @renaudhartert-db)。 - 新增了继承的适用于Markdown中LaTeX表达式的终端友好Unicode渲染。详见 TUI Markdown。
- 在全屏模式下新增了堆叠式临时通知。
- 新增了通过
models.json、模型覆盖、扩展提供商和流选项中的samplingParams支持任意OpenAI兼容的模型采样参数。详见 采样参数 (#7568 by @mrexodia)。 - 新增了继承的可选vLLM
thinking_token_budget支持,适用于OpenAI兼容模型,为最终答案预留输出令牌 (#7638 by @bnsd55)。 - 新增了继承的对省略
finish_reason的OpenAI兼容流的支持,使用compat.supportsFinishReason在流结束时推断正常停止和工具使用停止。详见 OpenAI兼容性。 - 新增了继承的延迟提供商请求契约、持久化响应句柄、经过身份验证的获取/取消分发以及用于待处理、就绪、失败和已取消响应的模拟提供商支持 (#7339 by @davidbrai)。
- 新增了继承的供应商无关遥测契约,加上代理拥有的类型化AI请求和测试工具模式、组合式跨度启动器以及回调辅助工具。详见 代理遥测模式参考。
- 新增了继承的结构化Amazon Bedrock故障诊断,包含HTTP状态、建模错误代码和可用时的AWS请求ID (#7286 by @brianstanley)。
- 新增了继承的
AgentOptions.shouldStopAfterTurn,用于在完成一个回合后优雅停止,在处理排队消息或另一次模型调用之前。详见 代理选项 (#7367 by @acmerfight)。 - 新增了继承的v4
JsonlSessionRepo支持,用于仅追加的JSONL测试工具会话 (#7611 by @davidbrai)。 - 在v4会话API中新增了继承的有界分支条目和索引开放操作恢复查询 (#7448, #7646)。
- 新增了继承的编译完成
AgentHarnessv2脚手架;未完成的操作路径以HarnessNotImplemented拒绝,同时实现了持久化执行。
变更
- 在pi-ai
ModelsStore的读取、写入和删除中新增了继承的可选取消功能;目录编排将这些等待绑定到提供商刷新信号。 - 将继承的默认全屏鼠标滚轮步长从三行减少到一行,以实现更精细的滚动。
修复
- 修复了页脚在没有已知订阅的通用OAuth/OpenID登录时显示
(sub)的问题;扩展OAuth提供商可以通过isSubscription选择加入。 - 修复了继承的OAuth令牌刷新,使停滞的请求释放凭据存储锁 (#7508)。
- 修复了继承的工具参数验证,在强制转换前保留已经匹配
anyOf/oneOf联合分支的值,避免可空联合将null转换为其他原始值 (#7328)。 - 修复了继承的Fireworks GLM 5.2请求在启用长缓存保留时发送不支持的
prompt_cache_retention字段,并为自动提示缓存启用了会话关联 (#7676)。 - 修复了继承的
JsonlSessionRepo在全局范围内强制执行会话ID;ID现在在每个工作目录内唯一。 - 修复了继承的JSONL会话分叉和撕尾修复以原子方式发布,避免中断写入后出现部分写入或损坏的会话 (#7707 by @davidbrai)。
- 修复了包含路径的
findglob在Windows上返回无结果的问题 (#6817)。 - 修复了在手动
/compact期间排队的消息在压缩完成后发送失败的问题。 - 修复了Git Bash、MSYS、Cygwin和WSL传递给内置文件工具的驱动器路径解析到当前Windows驱动器而不是其本机驱动器的问题 (#7064, #7547)。
- 修复了项目级嵌套提供商重试设置替换未修改的全局提供商重试设置的问题 (#7572)。
- 修复了继承的GitHub Copilot Grok 4.5请求使用支持的Responses API (#7560)。
- 修复了全屏关闭时将终端能力查询应答泄漏到父shell提示符的问题。
- 修复了由多个提供商共享的裸精确
--modelID选择第一个目录条目而不是唯一经过身份验证的提供商或明确的歧义错误的问题 (#7327)。 - 修复了独立的x64二进制文件需要Haswell时代AVX2/BMI2指令的问题,通过针对Bun的基线运行时编译发布可执行文件 (#7390 by @davidbrai)。
- 修复了在全屏模式下
Ctrl+X复制确认添加对话记录状态行而不是显示临时Copied!标记的问题。 - 修复了Kitty图像预览在全屏模式下滚动时与固定编辑器和页脚停靠栏重叠的问题。
- 修复了图像密集的全屏会话在布局更改重新传输可见Kitty图像有效载荷并每帧渲染两次对话记录时滞后的问题。
- 修复了在
/settings搜索中输入空格(如 TUI mode 或 Quiet startup)时切换高亮设置的问题。 - 修复了自定义编辑器未继承默认编辑器自动完成下拉项限制的问题 (#7333)。
- 修复了包清单中格式错误的资源数组导致会话启动崩溃的问题 (#7187)。
- 修复了DOOM覆盖层示例从死链接下载其共享软件WAD的问题。
- 修复了
setToolsExpanded(false)在工具输出已折叠时成为无操作的问题,避免了扩展产生冗余的Tool output: collapsed启动通知 (#7292)。 - 修复了扩展驱动的模型调用(在自定义压缩、交接和问答示例中)通过编码代理模型运行时分发的问题,以便保留自定义提供商和已解析的身份验证选项 (#7325)。
- 修复了长时间运行的会话在另一个进程更新
auth.json后使用过时凭据的问题,通过序列化并发凭据读取和延迟启动来解决 (#7319)。 - 修复了并发
models-store.json读取形成文件锁排队并延迟启动的问题。 - 将打包的
brace-expansion依赖项更新到5.0.8,以解决GHSA-mh99-v99m-4gvg (#7316)。 - 修复了强制模型可用性刷新仍然被停滞的早期刷新阻塞的问题 (#7301, #7421 by @a-yeyang)。
- 修复了
/model目录刷新失败以识别每个失败目录的问题。 - 修复了在模型目录刷新停滞时,保存凭据后提供商登录保持挂起的问题,通过将本地凭据一致性与有界后台新鲜度分离来解决 (#7027, #7113, #7418)。
- 修复了
/scoped-models等待远程目录后再渲染而不是显示缓存模型并在关闭时取消刷新的问题 (#7153)。 - 修复了
/model <name>在检查缓存模型匹配之前等待目录刷新的问题 (#7443)。 - 修复了在较新的可用性通过后发布过时可用性快照和错误的问题。
- 修复了在较新的提供商刷新后发布过时的pi.dev、Radius、llama.cpp和扩展目录刷新的问题。
- 修复了在等待基于文件的凭据或模型目录锁时取消的问题,防止已取消的变更稍后运行或提交。
- 修复了并发内存中凭据变更丢失无关提供商更新的问题,通过序列化其读取-修改-写入部分来解决。
- 将
undici更新到8.9.0,将打包的brace-expansion更新到5.0.9,以解决GHSA-8xcm-r25x-g524、GHSA-4cwx-7wf7-3272、GHSA-m8rv-5g2x-5cg5、GHSA-jr45-8vmc-qm54、GHSA-v3r7-h72x-cjcm和GHSA-rgw5-rvv9-x895。 - 修复了GitHub Copilot压缩和分支摘要使用个人端点而不是凭据解析的商业或企业端点的问题 (#6768)。
- 修复了扩展模型调用在转发请求身份验证时丢弃已解析端点的问题,包括使用GitHub Copilot商业和企业账户的自定义压缩 (#7579)。
- 修复了全屏对话记录导航未留下可编辑器访问的
Home、End、PageUp或PageDown变体的问题,通过添加Ctrl修改的编辑器绑定来解决 (#7574)。 - 修复了扩展事件总线监听器在会话重载和处置后存活的问题 (#7656 by @tudoroancea)。
- 修复了在Wayland上没有X11剪贴板可用时,
/copy无法读取剪贴板文本的问题 (#7387)。 - 修复了慢速连接在初始连接尝试期间失败的问题,通过增加连接超时来解决 (#7435 by @muyiyr)。
- 修复了扩展和内置工具返回的超大图像绕过自动图像大小调整的问题。详见 图像设置 (#7330 by @tizmagik)。
- 修复了会话发现丢失通过符号链接目录存储的会话的问题 (#7552 by @muyiyr)。
- 修复了手动压缩与阈值自动压缩竞争的问题 (#7370 by @davidbrai)。
- 修复了响应在其预期输出限制以下被截断时结束运行而不是压缩并重试一次的问题 (#7540 by @davidbrai)。
- 修复了Git包更新在
git clean无法删除被忽略的依赖目录时遗留缺失依赖的问题 (#7570 by @mrexodia)。 - 修复了来自POSIX和Windows文件系统根的
find结果丢失第一个路径段或获得重复尾部分隔符的问题 (#7569 by @petrroll)。 - 修复了临时版本检查、目录、托管工具和包管理HTTP失败未被重试的问题 (#7632 by @petrroll)。
- 修复了交互式错误忽略已配置输出填充的问题。
- 修复了继承的OpenCode Go提供商显示名称的问题。
- 修复了继承的提供商错误规范化将数组和类实例视为结构化响应体而不是保留其原始错误的问题 (#7205 by @erikogenvik)。
- 修复了继承的Anthropic流丢弃初始内容块事件中包含的文本或思考的问题 (#7358 by @davidbrai)。
- 修复了继承的Google历史转换丢弃重放所需的签名空文本和思考块的问题 (#7362 by @jingtao-wisdomgraph)。
- 修复了继承的OpenAI Codex缓存WebSocket会话在不同账户凭据间共享的问题 (#7364)。
- 修复了继承的临时Google Generative AI和Vertex AI提供商错误绕过自动重试的问题 (#7471 by @vish-pr)。
- 修复了继承的Gemini 3工具调用ID在历史转换期间被丢弃的问题,破坏了签名的多轮重放 (#7494 by @muyiyr)。
- 恢复了继承的通过特定账户策略响应返回的GitHub Copilot模型 (#7672 by @muyiyr)。
- 用
qwen3.8-max替换了继承的已退役Qwen Token Planqwen3.8-max-preview模型 (#7670 by @QuintinShaw)。 - 修复了继承的终端宽度计算未考虑印度语连写图素群的问题 (#6987 by @petrroll)。
- 修复了继承的嵌套全屏堆栈布局忽略子最小尺寸的问题。
- 修复了继承的批处理终端配色方案报告被解析为一个格式错误的响应的问题 (#7550)。
- 修复了继承的终端进度清除以发出完整的OSC 9;4序列的问题 (#7581)。
- 修复了继承的iTerm2图像有效载荷省略了xterm.js图像插件所需的大小元数据的问题 (#7612)。
- 修复了继承的宽度截断留下OSC 8超链接未终止的问题 (#7657 by @xXJSONDeruloXx)。
- 更新了继承的GPT-5.6 Terra和Luna在OpenAI和直通模型目录中的定价。
- 修复了继承的Fireworks Kimi K3模型使用OpenAI兼容API,带有原生推理努力级别和延迟工具的问题 (#7199, #7230 by @XBeg9)。
- 更新了继承的Groq Qwen用于替换模型
qwen/qwen3.6-27b的推理覆盖。 - 修复了继承的Windows Shift+Enter检测通过从原生Win32辅助程序读取修饰符状态的问题。
- 修复了继承的pi-tui npm包省略了重建其Windows和Darwin原生附加组件所需的源代码和构建脚本的问题。
- 修复了继承的Windows控制台真彩色检测当Windows Terminal未向子shell提供
WT_SESSION时的问题。 - 修复了继承的幻象全屏文本选择来自改变终端窗格焦点时不匹配的鼠标事件的问题。
- 修复了继承的Windows键盘输入渲染延迟的问题,通过让输入抢占节流的渲染计时器来解决。
- 修复了继承的Windows上代理测试工具路径处理对于文件基本名称、递归技能加载和提示模板名称的问题。
更新内容 (原始)
New Features
- Fullscreen TUI mode — Switch between regular and fullscreen modes at runtime, with a sticky editor and footer, independently scrollable transcript, and draggable scrollbars. See UI & Display.
- Mermaid and LaTeX rendering — Render Mermaid diagrams and terminal-friendly Unicode math in interactive transcripts. See Markdown settings and TUI Markdown.
- Per-directory context overrides — Use
AGENTS.override.mdto replace context files for a specific directory. See Context Files. - Advanced custom model sampling — Configure arbitrary OpenAI-compatible
samplingParamsand opt-in vLLMthinking_token_budgetvalues. See Sampling Parameters. - Baseten provider — Use built-in Baseten authentication and model support. See API Keys.
Breaking Changes
-
Renamed the inherited pi-ai
ModelsStreamTransformsinterface toModelsRequestTransformsbecause its header transformation now applies to all authenticated provider requests. -
Changed JSON and RPC
message_updateevents to emit onlyassistantMessageEventdeltas, removing the cumulativemessageandassistantMessageEvent.partialfields that caused quadratic output growth. Clients that need partial messages must assemble deltas betweenmessage_startandmessage_end; the latter remains authoritative (#7290). -
ModelRegistry.getApiKeyAndHeaders()now returnsProviderHeaderswithstring | nullvalues and preservesnullheader-deletion markers. Extensions that inspect returned headers must handlenull; extensions forwarding them to pi-ai streams should pass them through unchanged. This prevents placeholder OpenAI credentials from being sent through Cloudflare AI Gateway (#7030). -
Changed
ModelRegistry.refresh()to acceptModelsRefreshOptionsand returnModelsRefreshResultinstead of discarding cancellation and provider errors. -
Changed
ModelRuntime.setRuntimeApiKey()to accept auth cancellation options rather than catalog refresh options. Callrefresh({ providers: [providerId], signal })separately when remote freshness is required. -
Required config-form extension OAuth
refreshToken(credentials, signal)callbacks to accept and honor a concrete abort signal. -
Replaced dynamic provider refresh context store access with the read-only
context.storedsnapshot and generation-checkedcontext.publish()transaction.Providers built with
createProvider({ fetchModels }): no catalog-publication migration is required. Before and after, return the fetched models and register the resulting provider;createProvider()owns restoration, persistence, and in-memory publication.// Before const beforeProvider = createProvider({ // ... fetchModels: async ({ signal }) => { const response = await fetch(catalogUrl, { signal }); return parseModels(await response.json()); }, }); pi.registerProvider(beforeProvider); // After: unchanged const afterProvider = createProvider({ // ... fetchModels: async ({ signal }) => { const response = await fetch(catalogUrl, { signal }); return parseModels(await response.json()); }, }); pi.registerProvider(afterProvider);Handwritten native
Provider.refreshModels(): replace direct store access and pre-publication mutation with generation-guarded publications.// Before refreshModels: async (context) => { const stored = await context.store.read(); if (stored) currentModels = stored.models; if (!context.allowNetwork) return; const refreshed = await fetchModels(context.signal); currentModels = refreshed; await context.store.write({ models: refreshed, checkedAt: Date.now() }); }, // After refreshModels: async (context) => { if (context.stored) { const restored = context.stored.models; if (!(await context.publish({ update: () => { currentModels = restored; }, }))) return; } if (!context.allowNetwork) return; const refreshed = await fetchModels(context.signal); if (context.signal.aborted) return; await context.publish({ persist: { models: refreshed, checkedAt: Date.now() }, update: () => { currentModels = refreshed; }, }); },For the config-form
pi.registerProvider(name, { refreshModels }), callbacks that only return models remain unchanged; pi publishes the returned list. If such a callback previously usedcontext.storefor custom persistence, readcontext.storedand callcontext.publish({ persist: entry }). Inpublish(), omitpersistto leave storage unchanged, pass aModelsStoreEntryto write it, or passpersist: nullto delete it. -
Replaced the inherited pi-agent-core harness session model with the v4 lane-based
Session,SessionStorage, andSessionRepoAPIs, including durable operation records, global facts, shared sequence numbers, and tree-scoped lane views. -
Promoted the inherited v2 session and
AgentHarnessAPI from pi-agent-core’s experimental entrypoint to its default export and removed the experimental subpaths. -
Removed the inherited legacy JSONL and in-memory repository APIs. Use pi-agent-core’s v4
JsonlSessionRepoorInMemorySessionRepo, both implementing the newSessionRepocontract. -
Added the inherited required pi-agent-core
FileSystem.renameFile()operation for atomic JSONL publication; custom harness file-system implementations must provide same-filesystem replacement semantics (#7707 by @davidbrai). -
Replaced experimental remote-session list summaries with durable
SessionMetadata;RemoteSession.sessionsno longer exposes runtime phase, model, thinking, attachment, or lock state, which remains available from acquiredSessionSnapshotvalues (#7708).
Added
- Added built-in Baseten provider support with
BASETEN_API_KEYauthentication andzai-org/GLM-5.2as the default model. - Added experimental remote-session client APIs: the transport-neutral
PiClient, CBOR protocol, Unix-socket transport, and@earendil-works/pi-coding-agent/clientRemoteSessioncontroller with transcript reducers. See Pi Client and Remote Protocol (#7344, #7348, #7371, #7409). - Added
CredentialSynchronizationErrorfor credential changes that commit successfully but fail to synchronize local model state. - Added chainable
pi.registerMarkdownTransformer()hooks for display-only transformation of user and assistant Markdown. Seepi.registerMarkdownTransformer()(#7231 by @xl0). - Added an experimental fullscreen TUI mode, selectable through
--tui-mode fullscreenor/settings(#7304). - Added runtime switching between regular and fullscreen TUI modes through
/settings. - Added a sticky editor, status, widget, and footer dock to fullscreen mode while keeping the transcript independently scrollable.
- Added a draggable transcript scrollbar to fullscreen mode with configurable
auto,always, andhiddenmodes through/settings;alwaysreserves the rightmost column. - Added page scrolling and marked-message navigation shortcuts to fullscreen mode.
- Added an optional
scrollbarThumbtheme color for fullscreen scrollbar thumbs, falling back toselectedBg. - Added configurable themed Unicode rendering for supported Mermaid diagrams in interactive messages, including optional rendering while streaming. See Markdown settings (#7624 by @xl0).
- Added opt-in
Ctrl+P/Ctrl+Nprompt history navigation, with explicit history bindings taking precedence over application shortcuts while the editor is focused. - Added per-directory
AGENTS.override.mdcontext files, which replaceAGENTS.mdorCLAUDE.mdin the same directory while preserving context from other directories. See Context Files (#7681 by @Marvae). - Added
AI_AGENT=pito CLI and RPC child-process environments for generic agent attribution. See Environment Variables (#7493 by @renaudhartert-db). - Added inherited terminal-friendly Unicode rendering for LaTeX expressions in Markdown. See TUI Markdown.
- Added stacked transient notifications in fullscreen mode.
- Added arbitrary OpenAI-compatible model sampling parameters through
samplingParamsinmodels.json, model overrides, extension providers, and stream options. See Sampling Parameters (#7568 by @mrexodia). - Added inherited opt-in vLLM
thinking_token_budgetsupport for OpenAI-compatible models, reserving output tokens for the final answer (#7638 by @bnsd55). - Added inherited support for OpenAI-compatible streams that omit
finish_reason, usingcompat.supportsFinishReasonto infer normal and tool-use stops when the stream ends. See OpenAI Compatibility. - Added inherited deferred provider request contracts, durable response handles, authenticated fetch/cancel dispatch, and faux-provider support for pending, ready, failed, and cancelled responses (#7339 by @davidbrai).
- Added inherited vendor-neutral telemetry contracts plus agent-owned typed AI-request and harness schemas, composed span starters, and callback helpers. See the agent telemetry schema reference.
- Added inherited structured Amazon Bedrock failure diagnostics with HTTP status, modeled error code, and AWS request id when available (#7286 by @brianstanley).
- Added inherited
AgentOptions.shouldStopAfterTurnfor gracefully stopping after a completed turn before queued messages or another model call are processed. See Agent Options (#7367 by @acmerfight). - Added inherited v4
JsonlSessionReposupport for append-only JSONL harness sessions (#7611 by @davidbrai). - Added inherited bounded branch-entry and indexed open-operation recovery queries to the v4 session API (#7448, #7646).
- Added the inherited compile-complete
AgentHarnessv2 scaffold; unfinished operation paths reject withHarnessNotImplementedwhile durable execution is implemented.
Changed
- Added inherited optional cancellation to pi-ai
ModelsStorereads, writes, and deletions; catalog orchestration binds these waits to the provider refresh signal. - Reduced the inherited default fullscreen mouse wheel step from three lines to one for finer scrolling.
Fixed
- Fixed the footer showing
(sub)for generic OAuth/OpenID sign-ins without a known subscription; extension OAuth providers can opt in withisSubscription. - Fixed inherited OAuth token refreshes so stalled requests release the credential-store lock (#7508).
- Fixed inherited tool argument validation to preserve values that already match an
anyOf/oneOfunion arm before coercion, avoiding nullable unions convertingnullto another primitive value (#7328). - Fixed inherited Fireworks GLM 5.2 requests sending the unsupported
prompt_cache_retentionfield when long cache retention is enabled, and enabled session affinity for automatic prompt caching (#7676). - Fixed inherited
JsonlSessionRepoenforcing session IDs globally across working directories; IDs are now unique within each working directory. - Fixed inherited JSONL session forks and torn-tail repairs to publish atomically, avoiding partially written or corrupted sessions after interrupted writes (#7707 by @davidbrai).
- Fixed path-containing
findglobs returning no results on Windows (#6817). - Fixed messages queued during manual
/compactfailing instead of being sent after compaction completes. - Fixed Git Bash, MSYS, Cygwin, and WSL drive paths passed to built-in file tools resolving against the current Windows drive instead of their native drive (#7064, #7547).
- Fixed project-level nested provider retry settings replacing unmodified global provider retry settings (#7572).
- Fixed inherited GitHub Copilot Grok 4.5 requests to use the supported Responses API (#7560).
- Fixed fullscreen shutdown leaking terminal capability-query replies into the parent shell prompt.
- Fixed bare exact
--modelIDs shared by multiple providers choosing the first catalog entry instead of the sole authenticated provider or a clear ambiguity error (#7327). - Fixed standalone x64 binaries requiring Haswell-era AVX2/BMI2 instructions by compiling release executables against Bun’s baseline runtime (#7390 by @davidbrai).
- Fixed
Ctrl+Xcopy confirmations in fullscreen mode adding a transcript status line instead of showing the transientCopied!marker. - Fixed Kitty image previews in fullscreen mode overlapping the sticky editor and footer dock while scrolling.
- Fixed image-heavy fullscreen sessions lagging when layout changes retransmitted visible Kitty image payloads and rendered the transcript twice per frame.
- Fixed spaces in
/settingssearches toggling the highlighted setting while typing multi-word queries such as TUI mode or Quiet startup. - Fixed custom editors not inheriting the default editor’s autocomplete dropdown item limit (#7333).
- Fixed malformed resource arrays in package manifests crashing session startup (#7187).
- Fixed the DOOM overlay example downloading its shareware WAD from a dead URL.
- Fixed
setToolsExpanded(false)to be a no-op when tool output is already collapsed, avoiding redundantTool output: collapsedstartup notices from extensions (#7292). - Fixed extension-driven model calls in custom compaction, handoff, and Q&A examples to dispatch through the coding-agent model runtime so custom providers and resolved auth options are preserved (#7325).
- Fixed long-running sessions using stale credentials after another process updates
auth.jsonwithout serializing concurrent credential reads and delaying startup (#7319). - Fixed concurrent
models-store.jsonreads forming a file-lock convoy and delaying startup. - Updated the packaged
brace-expansiondependency to 5.0.8 to address GHSA-mh99-v99m-4gvg (#7316). - Fixed forced model availability refreshes remaining blocked behind a stalled earlier refresh (#7301, #7421 by @a-yeyang).
- Fixed
/modelcatalog refresh failures to identify every catalog that failed. - Fixed provider login remaining stuck after saving credentials when a model catalog refresh stalls by separating local credential consistency from bounded background freshness (#7027, #7113, #7418).
- Fixed
/scoped-modelswaiting for remote catalogs before rendering instead of showing cached models and cancelling refresh on close (#7153). - Fixed
/model <name>waiting for catalog refresh before checking cached model matches (#7443). - Fixed stale availability snapshots and errors publishing after a newer availability pass.
- Fixed stale pi.dev, Radius, llama.cpp, and extension catalog refreshes publishing after a newer provider refresh.
- Fixed cancellation while waiting for file-backed credential or model-catalog locks, preventing cancelled mutations from running or committing later.
- Fixed concurrent in-memory credential mutations losing unrelated provider updates by serializing their read-modify-write sections.
- Updated
undicito 8.9.0 and the packagedbrace-expansionto 5.0.9 to address GHSA-8xcm-r25x-g524, GHSA-4cwx-7wf7-3272, GHSA-m8rv-5g2x-5cg5, GHSA-jr45-8vmc-qm54, GHSA-v3r7-h72x-cjcm, and GHSA-rgw5-rvv9-x895. - Fixed GitHub Copilot compaction and branch summaries using the Individual endpoint instead of the credential-resolved Business or Enterprise endpoint (#6768).
- Fixed extension model calls dropping credential-resolved endpoints when forwarding request authentication, including custom compaction with GitHub Copilot Business and Enterprise accounts (#7579).
- Fixed fullscreen transcript navigation leaving no editor-accessible
Home,End,PageUp, orPageDownvariants by adding Ctrl-modified editor bindings (#7574). - Fixed extension event-bus listeners surviving session reloads and disposal (#7656 by @tudoroancea).
- Fixed
/copyfailing to read clipboard text on Wayland when no X11 clipboard is available (#7387). - Fixed slow connections failing during the initial connection attempt by increasing the connect timeout (#7435 by @muyiyr).
- Fixed oversized images returned by extension and built-in tools bypassing automatic image resizing. See Image settings (#7330 by @tizmagik).
- Fixed session discovery missing sessions stored through symlinked directories (#7552 by @muyiyr).
- Fixed manual compaction racing with threshold auto-compaction (#7370 by @davidbrai).
- Fixed responses truncated below their intended output limit ending the run instead of compacting and retrying once (#7540 by @davidbrai).
- Fixed Git package updates leaving dependencies missing when
git cleancannot remove an ignored dependency directory (#7570 by @mrexodia). - Fixed
findresults from POSIX and Windows filesystem roots losing the first path segment or gaining duplicate trailing separators (#7569 by @petrroll). - Fixed transient version-check, catalog, managed-tool, and package-management HTTP failures not being retried (#7632 by @petrroll).
- Fixed interactive errors ignoring the configured output padding.
- Fixed the inherited OpenCode Go provider display name.
- Fixed inherited provider error normalization treating arrays and class instances as structured response bodies instead of preserving their original errors (#7205 by @erikogenvik).
- Fixed inherited Anthropic streams dropping text or thinking included in the initial content-block event (#7358 by @davidbrai).
- Fixed inherited Google history conversion dropping signed empty text and thinking blocks required for replay (#7362 by @jingtao-wisdomgraph).
- Fixed inherited OpenAI Codex cached WebSocket sessions being shared across different account credentials (#7364).
- Fixed inherited transient Google Generative AI and Vertex AI provider errors bypassing automatic retries (#7471 by @vish-pr).
- Fixed inherited Gemini 3 tool call ids being discarded during history conversion, breaking signed multi-turn replay (#7494 by @muyiyr).
- Restored inherited GitHub Copilot models returned through account-specific policy responses (#7672 by @muyiyr).
- Replaced the inherited retired Qwen Token Plan
qwen3.8-max-previewmodel withqwen3.8-max(#7670 by @QuintinShaw). - Fixed inherited terminal width accounting for Indic conjunct grapheme clusters (#6987 by @petrroll).
- Fixed inherited nested fullscreen stack layouts ignoring child minimum sizes.
- Fixed inherited batched terminal color-scheme reports being parsed as one malformed response (#7550).
- Fixed inherited terminal progress clearing to emit the complete OSC 9;4 sequence (#7581).
- Fixed inherited iTerm2 image payloads omitting the size metadata required by the xterm.js image addon (#7612).
- Fixed inherited width truncation leaving OSC 8 hyperlinks unterminated (#7657 by @xXJSONDeruloXx).
- Updated inherited GPT-5.6 Terra and Luna pricing across OpenAI and passthrough model catalogs.
- Fixed inherited Fireworks Kimi K3 models to use the OpenAI-compatible API with native reasoning-effort levels and deferred tools (#7199, #7230 by @XBeg9).
- Updated the inherited Groq Qwen reasoning override for the replacement
qwen/qwen3.6-27bmodel. - Fixed inherited Windows Shift+Enter detection by reading modifier state from the native Win32 helper.
- Fixed the inherited pi-tui npm package omitting the source and build scripts needed to rebuild its Windows and Darwin native addons.
- Fixed inherited Windows console truecolor detection when Windows Terminal does not provide
WT_SESSIONto child shells. - Fixed inherited phantom fullscreen text selection from unmatched mouse events when changing terminal pane focus.
- Fixed inherited keyboard input rendering latency on Windows by letting input preempt the throttled render timer.
- Fixed inherited agent harness path handling on Windows for file basenames, recursive skill loading, and prompt template names.