Repository navigation
v0.9.0
这是一次大版本功能更新:PiDeck 从 pi / DSH 工作台进一步扩展为支持 ACP 工具与独立宿主插件的桌面工作台,同时升级远程访问、终端和原生会话管理体验。
🚀 新功能
- ACP 协议后端:接入更多 AI 编程工具 — 同一工作台可创建由外部 ACP CLI 驱动的会话,内置 Gemini CLI、Claude Agent、Codex CLI、Kimi CLI、Qwen Code、OpenCode、Cursor Agent、CodeBuddy 与 MiniMax Code 九种启动预设;支持工具检测、适用工具的一键安装/卸载、工具级环境变量和会话图片。设置 → ACP 工具显式开启,重启后生效,不改变已有 pi / DSH 会话;设置页同时标注该功能为实验性——尚未经过完整的使用测试,遇到问题可从「问题反馈」入口反馈。
- 独立 PiDeck 宿主插件系统 — 不依赖 pi 进程的本地 HTML / CSS / JS 插件,可注册弹框或工作区页面式面板、侧栏入口与命令面板动作,按授权读取当前项目会话、定位消息并保存私有状态;主题与语言跟随应用。支持从文件夹或
.pideck-plugin文件安装,设置页可生成脚手架,开发指南与官网同步;授权绑定逐文件内容指纹,插件内容变化必须重新确认。 - 内置外网访问与访问令牌 — Web 服务新增 cloudflared 免注册临时隧道与 Tailscale Serve 两种入口,配套操作指南和参数设置;远程访问受访问令牌保护,令牌可撤销,不再仅依赖可访问的服务地址。
- Web 实时事件推送与计划模式 — 会话状态和桌面端发起的回复经 SSE 实时推送,替代高频轮询;Web 输入框支持计划模式,手机与桌面端的会话进度更一致。
- 终端设置、WebGL 与快照回放 — 新增终端设置页,主题共用统一数据源;支持 WebGL 渲染与终端快照回放,关闭终端前提供确认。
- 对齐 pi 1.0.4 原生会话与模型目录 — 编辑、删除追加 pi 原生
context_edit,不再改写原消息,界面只展示当前有效内容,原始记录仍保留;模型目录保留官方完整字段与模型类型,API 配置保存不再把自定义协议改成默认值,Azure 新配置对齐原生供应商标识。 - MCP 服务目录与 AI 配置助手 — 内置服务目录、品牌图标与 AI 配置助手,补充国产服务预设,减少从零填写服务配置的成本。
- 会话分支面板 — 右侧抽屉新增「分支」面板,提供 pi
/tree的桌面只读浏览入口。 - 项目置顶与列表管理 — 项目支持置顶并优化拖动排序;项目内会话排序改为可扩展策略目录。
- 繁体中文界面 — 新增 zh-TW,覆盖主工作台与浮窗,避免局部界面回退为简体中文。
- 通知历史可跨重启查看 — Toast 通知归档落盘,重启后可回看;缓存与日志页提供清理入口。
- 输入框功能按需显示 — 外观设置可隐藏权限、快捷消息、Git 分支、提示词增强与语音输入入口;思考级别改为就地下拉选择。
- 用户消息图片与附件操作 — 可从消息缩略图或图片预览复制、保存图片,文件 chip 补齐打开出口;桌面端 pi 会话还支持单独移除一张图片:确认后先停止仍存活的 Agent,再更新会话文件,保留消息文字、其他图片与后续对话。 (#323)
- 生视频独立后端 — 与生图平行的独立信任域:无 LLM agent,直连供应商视频 API,历史独立存储。任务受理即持久化占位,再轮询、下载落盘,取消 / 网络抖动 / 重启都能恢复;产物经
pideck-video://协议流式喂给内联<video>卡片(不进 IPC、不写会话文件),支持占位动画、播放、取消与另存;输入框后端下拉新增「生视频」,生成参数由独立配置驱动而非会话模型,设置页新增「生视频」tab 与模块可见性开关。 - 右侧边栏上下分区与会话状态面板 — 右侧边栏改为上下两区:上半区仍是原有抽屉(文件 / Git / 编辑等),下半区新增常驻的「会话状态」面板,用分组标签页展示当前会话的待办 / 修改文件 / 子代理,不必再盯着输入框上方那几条折叠横栏。下半区高度可拖拽、可收起、比例跨重启保持,侧栏过矮时自动收起;新增设置「会话状态位置」(外观设置,默认「输入框上方」)可在「输入框上方折叠横栏」与「右侧边栏下半区」之间二选一,面板可见时输入框上方的同类横栏让位、收起或侧栏关闭后恢复。 (#334)
- TPS 测量模式:流式速度与端到端速度 — 「每秒 token 数」此前只算流式速度,看不出等待首 token 花了多久。设置 → 通用 → 会话新增「TPS 测量模式」:流式(输出 token ÷ 首个非空内容增量到回复完成)与端到端(输出 token ÷ 发出请求到回复完成,含等待首 token、不含工具执行),默认流式。切换后输入框统计、会话状态、上下文计量与轨迹检查器即时跟随;标签标明当前口径(如
流式 123 tok/s/端到端 98 tok/s),取不到所选指标时显示— tok/s而不是整行消失。 (#327) - Logo 支持自定义图片与应用显示名称 — 外观设置的 Logo 风格新增「自定义图片」:源文件 ≤12MB,自动缩到 512×512 内并统一输出透明 PNG(编码后 ≤1.5MB);同时可设置「应用显示名称」(≤24 字,留空回落 PiDeck)。两者无需重启即生效:品牌区、关于弹层、空态 / 迷你窗 / Web 时间线的 Logo、会话来源标、MCP pideck 图标、窗口与托盘图标、任务栏标题与启动开屏全部跟随;自定义图以
data:image/*data URL 内联进 settings.json(不新增 IPC 通道),不额外垫黑底,未设置时各处统一回落 pi-tui 默认标。 - 把 PiDeck 自身通过 MCP 暴露出去(默认只读) — 随包内置的 MCP 服务(只绑
127.0.0.1、默认关闭)可让任意 MCP 客户端列出已授权项目与其已保存会话、分页读取会话条目、按标题搜索,并读取设置概览与内置扩展清单。授权按项目生效、每次请求重新求值:通配授权下项目加入工作区立即可读、移出立即失效,不需要轮换令牌;可选的「全部项目」通配与独立的写开关解锁sessions_abort(等同界面「停止响应」:会话、历史与 pi 进程都保留),runtime_status带runtimeGeneration供乐观并发校验。返回值来自显式允许清单投影——凭据、令牌、代理 URL、可执行文件路径与插件私有存储都不会进入视图。 - 宿主插件可以启停本地服务 — 新增
service.local权限与 manifestservices点名清单:插件可启停指定本地服务,并把它的回环 UI 交给内置浏览器打开。插件只能「点名」——命令、参数与端口都在主进程适配器里,ID 必须命中共享白名单;撤销授权会立刻中止在途启停。随包内置的billion-context示例插件跑通整条链路,与所有内置示例一样首次启动落位、仍需你显式授权。 - 每轮回复标注实际使用的模型 — 会话里经常换模型,事后却看不出某轮回复是哪个模型给的。时间线现在在每轮回复底部(耗时读数之后)显示该轮实际使用的模型名小标签,悬停可看
供应商/模型全名。历史会话、实时会话与 DSH 会话都覆盖;模型名直接取自 pi 会话记录里该条消息自带的 provider / model,不额外落库。纯工具轮、旧记录与不提供模型信息的后端(如 ACP)不显示标签。 - 模型目录检测到新版本后自动后台更新 — 此前只有手动点「更新目录」才会拉取模型目录,pi 发新版本后目录会一直停在旧版。现在启动后检测到远端有新版本就在后台自动更新,不阻塞界面;不想自动跑可在设置里关闭。
✨ 改进
- 草稿会话可预览扩展命令 — 未发送的新会话可只读借用预热进程获取斜杠命令,无需为补全消耗或激活会话运行时。 (#316)
- 资源开关反馈更及时 — 扩展开关点击即时反馈,包安装资源的读写来源与项目作用域路由统一,减少刷新后开关弹回。
- 远程与移动端体验完善 — 文件预览全屏化,系统返回可关闭覆盖层,关闭按钮热区扩大;Tailscale 入口兼容旧版 CLI。
- 安全与长运行稳定性加固 — 加强 Web 鉴权、IPC 入参校验与 sidecar/子进程清理,限制会话导入和发送历史缓存的资源占用;RPC 与 Git 断管得到兜底,减少异常退出。
- 通知支持「仅失焦时提醒」,标题与图标对齐品牌 — 新增设置项「仅失焦时提醒」(默认关闭):打开后只有主窗口不在前台才弹系统通知、播提示音,一直盯着 PiDeck 时不再被打扰;应用内 toast 与时间线不受影响,托盘手动「检查更新」的结果通知刻意不门控(用户主动操作必须回)。同时修掉安装版通知标题显示
pi-desktop(app.getName()取的是 asar 内 npm 包名,与productName无关)与深色模式通知里 logo 外那圈比背景更暗的底板(此前用的是带近黑底板的整图标,现改用透明底品牌字标,字标缺失时静默回退系统默认图标)。 - 思考档位改为勾选编辑 — 供应商 / 模型表里的思考档位过去是两个下拉(xhigh / max),既不知道该勾哪些、也看不出写进配置的是什么,展开卡片与供应商页两处能力还不一致。现在统一为 pi 规范档位逐个勾选:勾基础档位即删除该条目、走 pi 默认(避免给不接受恒等值的供应商发出非法值),勾 xhigh / max 写同名值,非恒等上游值(
off="none"、high="HIGH"这类)原样保留并显示成→ 值;单元格摘要只写首尾两档(连续为off → max、跳档为off…max)。供应商页统一成「页内改、点保存才生效」,保存前按当前模型列表清理孤儿配置,「测试连接」也补上逐模型 UA。 - 命令面板(Ctrl+P)补全设置索引 — 设置索引是静态清单(设置页各 tab 懒渲染,运行时看不到非当前 tab),完全靠人工维护,于是新设置持续漏登记:源码里写了锚点却没进索引、整块新设置区既没有行锚点也没人补索引。搜「闲置 Agent 内存优化」「CUA 桌面操作」这类只记得功能名的词,结果里什么都没有。现在补登记 18 个孤儿锚点(设置项级 52 → 70),并给 52 个设置分区补上稳定 id 与分区级锚点——整块设置也能按功能名搜到并跳过去;新增反向守卫测试:设置页源码里的锚点与分区 id 必须都在索引里,漏登记直接红灯。
- 等待回复时轮播功能提示 — 流式状态条右侧轮播「没有可见入口」的能力提示(命令面板、划选引用、排队发送、右缘面板、导出等),7 秒一条,不加卡片、不抢状态;键位提示按你的实际绑定渲染,文案三语由生成器同步。提示池已从 23 条扩到 57 条,补上后端切换、每会话安全档位、拖标签分屏、fork 分支导航、文件树右键菜单、RPC 日志的模型行、PiDeck MCP 只读服务、CUA 桌面操作、会话状态位置与输入框功能显示设置、缩放 / 收藏模型 / 思考档位快捷键,以及桌面真正接管的斜杠命令。
- 隐藏 pi 扩展侧的「插件开发」入口 — 宿主插件系统(不依赖 pi 进程)接替插件入口后,扩展页不再渲染「插件开发」页签,
pi-deck-gui-bridge与pi-deck-ext-points两个内置扩展也不再注入(代码、文档与既有设置保留,只是没有入口)。 - 文件树目录吸顶 — 长目录树现在与 VSCode 的 sticky scroll 同款:最外层三级目录挂在抽屉顶部当面包屑,更深的目录行随内容滚走;吸顶行自带不透明底与底部阴影,滚动内容不会透出来。缩进改为行内 8px/级、每行保留 16px 箭头槽位,同级文件与目录终于共用图标列与名称列;引导线改为逐行绘制祖先段(不再是一条贯穿整树的单长线),线色按 12 套主题逐一测过对比度。
- 过程组展开项标题吸顶 — 长过程行展开后滚读,工具 / 思考项的标题会随内容滚出组体,想回看「刚才那条 read 是哪一步」或收起它都得先找回来。现在标题在本项范围内吸顶(仅对已展开且高于组体视口的项生效),吸住时只多一个「回到开头」图标,且它与思考正文的底部收起都走组体既有滚动引擎——输出继续跟底,不会把你正在读的位置拽回去。
- ACP 工具按品牌显示 logo — 后端下拉、锁定态标识与消息行头都渲染工具品牌标(Gemini / Claude / Codex / Kimi / Qwen / OpenCode / Cursor / CodeBuddy / MiniMax),品牌从注册的命令、参数与显示名推断;推断不出的自定义工具回退通用终端图标,不假装成某个品牌。
- 宿主插件操作列一步可达 — 操作列改为拆分按钮:主钮直接启停(唯一高频且可逆的动作),面板入口与卸载收进右侧 caret 菜单,卸载标红;禁用行的主钮用短文案「启用」,不再把整列撑宽。
- MCP 服务目录继续扩充 — 内置目录新增 Tavily、Exa、腾讯文档、百度网盘、企查查与百智云;位图品牌标现在可以带底片色,百智云的黑色圆环在暗色主题下不再融进面板背景。
- 用量模板覆盖 Sub2API 网关 — 内置模板支持用面板 JWT 读取 Sub2API 余额,令牌过期或读取失败会如实提示而不是笼统的探针错误;网关暴露账户钱包时还能展示每个账户的余额。
- 模式控件让位 — 输入框底栏模式选择器去掉实心底与下拉箭头、普通模式改用闪电图标;计划 / 目标模式提示去掉左侧竖条与独立退出按钮。
- ACP 入口仅在开发构建可见 — 正式(stable)渠道不再显示 ACP 后端入口与设置页,避免把尚未经过完整使用测试的实验能力推给普通用户;功能代码保留,开发构建仍可继续调试。
🐛 修复
- npm 12 的变量式垫片不再被解析成错误入口 — Windows 垫片解析现在只认实际执行行(含
%*)上的 JS 入口。npm 12 把npm.cmd/npx.cmd改成变量式(SET "NPM_CLI_JS=%~dp0\node_modules\npm\bin\npm-cli.js"+"%NODE_EXE%" "%NPM_CLI_JS%" %*),旧的「全文取第一个node_modules\...js」会抓到变量赋值里的npm-prefix.js:npm 命令填成绝对路径时(自定义 npmCommand、引导安装的便携 node 回退),装包会跑成「打印前缀」——退出码 0 却什么都没装。无法静态确定入口的垫片现在回退cmd.exe执行真实垫片。 - 圆环「系统 + 工具」不再常显示 0 — 这两段过去是「总占用 − 对话估算」的反推值:估算与各供应商上报口径的偏差会把反推值打到 0(很多供应商的会话里圆环面板一直显示「系统 + 工具 ~0」),也可能反向放大成几十万。现在改为直接测量:从会话文件里的提示词装载(系统提示词各节与工具声明,pi 每次变更都会落盘)重放算出「系统 / 工具」两段,对话段取「总占用 − 系统 − 工具」差值(自动包含思考、图片与末尾回答),差值不可用时回退消息文本估算;三段图例与 DSH 会话一致,每个数字的悬停提示写明了来源。
- 出错会话的「关闭 Agent」可靠收敛 — 主进程对终态(error/closed)且进程已死的运行实例在查询路径里解绑时,改为把解绑同步推给界面:侧栏不再残留红色运行标记,也不会出现「关闭 Agent 点了几次都关不掉」。会话与草稿菜单在报错/关闭态保留「关闭 Agent」入口;运行实例已不存在、同轮操作冲突时给出明确提示,不再静默丢弃点击。
- 模型目录遵守选择器生命周期与来源 — 关闭或卸载选择器后丢弃在途结果与错误提示;切换后端或项目时立即隔离旧目录及成功标记,避免误清欢迎页模型偏好。手动刷新与首次加载不再残留彼此的忙碌状态。
- 手动压缩始终绑定原运行时 — 探测扩展接管前同步占位,压缩完成事件先于 RPC 返回时也不会重复提交;失败后清除进度,关闭或替换运行时后的迟到结果不再重启旧进程或清除新上下文。历史加载在发布消息、分页游标和压缩计数前也会核对原运行时。后台超时继续保持忙碌,完成或关闭后收尾,扩展接管命令仍走原入口。
- 停止请求不再误伤下一轮回复 — 撤回队列、查询状态与工具中止的迟到结果不会继续中止已换绑、关闭或新开始的回合;已撤回的排队文本带完整运行时身份回填原会话草稿。“停止响应较慢”只在重新确认原回合仍运行时提示,正常结束、重启或关闭后不再弹出迟到警告。
- 重启与克隆遵守原运行时归属 — 失效的 Agent ID 不再误重启当前焦点会话,换绑后的迟到状态响应会被丢弃,同轮克隆与重启按会话互斥;重启确认后再次检查排队消息的投递状态,失败清除进度并允许手动重试。克隆使用原会话所属项目,并等待选中流程结束再结算。
- 创建分支始终绑定原会话 — 激活运行时或查找消息锚点期间切换会话,不再将原消息条目送进新焦点会话;消息与分支树入口共用同步防重入,避免重复请求。激活与 fork 失败就地提示、清除进度并允许手动重试,引用与图片仍回填到新分支草稿,不自动发送。
- 重发与编辑始终绑定原会话 — 确认弹窗等待期间切换焦点,不再拿原消息条目去 fork 新选中的会话;重发时的激活与 fork 失败就地提示、清除进度遮罩并允许手动重试,取消操作与投递未知不会触发自动重发。
- 终端输入与尺寸调整失败可见且不刷屏 — 按键输入、首次布局、容器缩放及字体/高度变化的 IPC 失败均在终端内就地处理,不再成为全局未处理错误;同类连续失败只提示一次,成功后恢复反馈。输入不自动重试,关闭、切换归属或卸载后的迟到失败不会干扰当前面板。
- 终端启动命令不再因早到提示符漏发 — shell 输出先于创建结果返回时,新终端仍会且只会执行一次启动命令;并发创建按各自输出触发,恢复、已退出或旧归属的终端不会重跑。写入失败有明确提示,不自动重试可能有副作用的命令。
- 终端提前退出状态不再丢失 — shell 在创建或恢复结果返回前退出时,标签仍正确显示已退出状态与退出码(包括 0);并发创建、失败重试与归属切换不会串用退出事件,已退出终端不再接收启动命令,正常终端仍在首个提示符后只注入一次。
- 终端回放缓存按当前标签隔离 — 已就绪面板不再缓存其他终端的输出和退出事件,关闭标签或切换归属后不再由快照清理重新写回旧缓存;创建过程保留先于 IPC 返回的首屏输出,结算后裁剪无关缓存,正常切换标签与折叠回放不变。
- 终端标签关闭与复制更可靠 — 并发关闭不会让已关闭标签重新出现,关闭全部只处理请求时的标签,不误关期间新建的终端;创建或关闭失败有明确提示并保留失败标签。切换终端归属会清除旧标签并忽略迟到结果,折叠后重新展开仍可选区即复制,剪贴板写入失败不再误报成功。
- 重发后保留已选模型与供应商 — fork 完成后、公布新运行时和允许重发前,重新应用目标会话的模型与思考级别,并清除同一进程的旧偏好缓存;应用失败时不公布误导性状态。配合新会话继承模型偏好,避免切换供应商后仍向旧供应商请求或底栏显示
-/-。 (#331) - 二级 fork 历史读取与重复消息 — 增量 fork 的祖先消息保留原文件路径与字节偏移;已复制完整前缀的 fork 以子文件为权威,不重复拼接父会话或混入父分支后续消息。历史加载失败直接显示错误原因,不再把解析错误误提示为文件丢失。 (#332)
- 编辑、fork 与重发保留图片 — 回填输入框时恢复原消息图片,纯文本消息会清除旧附件;重发快照同时识别 pi 扁平图片块和嵌套 base64 图片块。 (#324)
- 提示词增强支持自定义供应商与模型名称 — IPC 校验不再误拒绝中文、空格、冒号与 URL 形式的名称;空白、控制字符和超长标识仍会被拦截。 (#322)
- 输入框滚动不再触发 React 更新深度异常 — 滚动停止与定位恢复改为幂等,避免
Maximum update depth exceeded;跨段落划选引用与回复落地后的滚动定位同步修复。 - Linux 会话路径与未暂存 diff — 修复相对会话路径导致 fork / 复制标题异常与历史加载卡住;Git 对象与工作区行尾差异归一化,避免 diff 整片标红标绿。
- pi 检测与更新链路更可靠 — 修复 fnm XDG 布局、自定义 npm 位置下的检测与扩展更新,更新检查跟随桌面网络代理,自更新按安装形态分派。 (#318)
- DSH 迁移提示与 macOS 安装引导 — DSH 运行时迁移提示跨重启只弹一次;macOS 产物显式标注架构,启动时提示误装 Rosetta 版本。 (#317)
- 扩展版本检查在 registry 失败时保留本地已装版本 — 此前 npm registry 不可达时「版本」列整列变成「当前:- · 最新:-」并附红字「检查扩展版本失败」(镜像不可达会让 npm 重试约 85s,超过 PiDeck 的 30s 子进程超时)。现在「读本地 package.json」与「查 registry」各自结算,网络失败只让「最新」缺失,「当前」照常显示,最新未知时
hasUpdate保持 false;npm 被超时杀掉时错误里补(timeout 30s)标记,日志可区分「registry 慢」与「npm 不存在/参数错」,registry 回退也记录失败原因。 - 设置页桌宠预览尊重减弱动效偏好 — 设置页桌宠预览是全仓最后一个全速 sprite 循环动画;
prefers-reduced-motion下帧间隔拉长 4 倍(近定格而非完全冻结,静态帧会让形态评估失真),与浮窗桌宠策略一致。 - 探测补齐的版本路径不再改写不吃版本段的 baseUrl — 「获取模型」成功后会把根路径 baseUrl 自动补上 /v1 写回配置,但各协议的版本段归属并不一致:anthropic-messages 由 Anthropic SDK 自拼
/v1/messages、mistral 自拼v1/chat/completions、codex 自拼/codex/responses、pi-messages 直接用/messages。探测为兼容各家统一先打<base>/v1/models,走通只说明探测形状可用、不代表会话端点也要版本段——改写后这些协议的会话全部 404,手动改回去下次检测又会被改掉。现在按 api 类型决定:只有 openai 系(含未选 api 的兜底)与 google 系补版本路径,其余与未知自定义 api 一律保持你填写的值。 (#337) - ACP 首启失败不再落到空态面板 — 首条消息被拒后回收草稿会话时,选中状态被写成引导页的虚拟会话 id(没有会话记录),界面因此给这个虚拟会话挂了真实会话面板,面板内取不到会话 → 渲染成旧版空态页「开始新的 Session。」,输入框消失、回填的草稿也看不见。现在改为清空选中回真正的引导页(「没有当前会话」在本程序里的唯一表达),并加全仓守卫测试禁止任何地方再把引导页虚拟 id 写进当前会话。
- 通道切换不再提供更旧的开发版 — 当前正式版版本高于开发版最新预发布(如 0.9.0 对 0.8.0-beta.9)时,「切换到开发版」对话框仍提供该旧预发布的下载入口;版本比较改为完整 semver 预发布语义(0.8.0-beta.9 < 0.8.0),并在服务侧增加「目标版本必须严格高于当前版本」的守卫,否则推送已是最新的快照并提示「已是最新版本,无需切换」,不再提供降级安装。 (#336)
- ACP 回合超时补发 cancel,卡死的会话能关闭 — agent 侧回合超时后旧回合没有收口,后续消息永久排队、反复超时,而停止又因回合标记已清而成了空操作;现在超时抛出可区分的类型化错误并补发
session/cancel收口旧回合,且「关闭 Agent」越过在途派发租约(关闭是卡死回合的唯一恢复出口),其余路径的并发断言不变。 - 重开 ACP 历史会话会恢复原会话与历史 — 握手从未回填 agent 侧会话 id、会话目录里也永远不落该字段,重开历史会话只能新建空会话;
session/load期间 agent 重放的历史又因会话 id 还是空字符串被整段丢弃。现在握手完成后回填会话 id,session/load发出前临时挂上旧 id,新建与恢复两条路径都覆盖,重放的历史正常显示。 - 自定义主题删除真的会删掉文件,编辑器弹窗不再铺满整屏 — 「编辑内置示例 → 直接保存」会在主题目录落下与内置示例同名的文件,而删除按包内 id 判断、见内置就早退 → 提示「已删除」但文件仍在,刷新又把同一条列回来。现在读写删一律以文件名(fileId)定位,文件不存在时显式报错不谎报成功,内置示例行去掉「编辑」入口(改为「复制示例」);主题 JSON 编辑器弹窗按视口限高、长内容在编辑器内滚动,底部保存按钮常驻可见。
- 合成器入口与媒体模式的四个问题 — 开启 ACP 开关并保存后要重启才在后端下拉里看到 ACP(开关只写盘没写渲染层快照,现在即时回写,主进程网关常驻注册并在创建会话时实时读开关,关闭时拒绝启动,从历史恢复的路径也覆盖);生图 / 生视频模式仍显示权限与飞书镜像(判据改为「模式或后端」,统一屏蔽与该后端无关的控件);选中视频模式后退出按钮点了没反应(退出改由后端选择器承担);新建会话切到生图后无法再换后端、未使用的预热进程也不回收(锁定判据改为「已发送消息」,切后端前停掉已绑定的运行时并回收本项目未被认领的预热进程)。
- 复制 / fork 产物的标题不再被扫描竞态锁成正文 — 扫描抢在写入「源名 (fork)」之前索引了新文件,标题被锁成内容派生的兜底名;此后命令层算出的名字进不了目录,大文件又只读头尾窗口、名字被后续消息推出尾窗,于是永久停在首条消息正文上。现在命令层注册时可覆盖未确认 / 内容派生的兜底标题(用户改名、扩展自动名与存量条目不动),扫描也把「时间戳早于本文件头的会话名」降级为弱候选。
- 应用日志删除后查看器立刻换新 — 「缓存与日志」的删除入口在查看器之外,清空动作查看器无从感知,表格停在已删除的旧行上、只能手动点「刷新」;现在删除成功后通知查看器重新查询。
- Windows 打包解压偶发失败不再中断 — 打包时解压 electron 发行包要「先写临时目录再改名就位」,Windows 上杀软 / 索引器会短暂持有刚写入文件的句柄,改名返回 EPERM 而打包工具只试一次不重试 →
npm run dist:win直接失败。现在由安装期补丁给该调用注入有界重试(只重试 EPERM / EACCES / EBUSY,约 6 秒后仍失败则抛出原始错误,不吞真实失败),打包工具结构变化时补丁直接报错而非静默失效。 - ACP 对齐 Agent Client Protocol v1 — 权限应答改用标准嵌套
outcome结构,请求 / 取消 / 连接关闭恰好结算一次;传输层不再让超限大帧被小帧超车、stdout EOF 排空队列后才关连接、stdin 同步写失败收敛为 close;投影器支持tool_call_update局部补丁、plan整表替换、多块user_message_chunk并回同一条消息、工具结果图片物化、max_tokens映射 length 停止原因、历史按用户消息分轮;set_config_option串行化防乱序回退,空 load 与分页 catalog 也有兜底。 - ACP 用户消息不再从时间线消失 —
user_message_chunk是 agent 的可选回显(OpenCode 等根本不发),而agents:message是全量替换语义,渲染层的乐观气泡会被第一次 flush 抹掉。现在 prompt 派发处就在主进程侧落条目(图片先物化),agent 回显时按前缀消费去重,不回显也不会堆积;派发失败且没有产出时撤回幽灵消息并回填输入框。首条 prompt 另按 DSH 同一套截断规则兜底一个标题,agent 后续给的标题仍会覆盖。 - ACP 首启失败保留错误现场 — 以前只要渲染层记录还是
draft就回收草稿会话,哪怕运行时已激活、agent 侧会话已建、只是 prompt 被拒收(例如网关回-32000 Authentication required)——唯一一份错误现场被删掉,人被弹回引导页。现在判据补上「激活从未产出 agent 会话」,错误现场得以保留。 - 宿主插件面板、浏览器入口与卸载 — 用户复测的八个问题:
services.openUi的 void 契约不再把{ value: null }漏进面板;内置示例在文件没被手改过时会随新版刷新;打开 Web UI 会钉住对应抽屉入口,浏览器标签不再「没有归属 tab」(消息链接的「在浏览器打开」一并修好);侧栏入口新增popover浮层形态;插件终于可以卸载(seeded 内置示例拒绝卸载,否则下次启动又回来);停止后会被 respawn 的服务如实报stop-restarted而不是笼统失败;刷新有转圈并在查询结束后解锁;操作列不再把所有动作藏在一个省略号后面。 - 多选提问卡不再提前提交整卡 — 批量卡上的回车只判断「已作答」,于是 multi_select 勾一个选项就按本题完成推进,最后一题可能在其余选项未勾时提交整卡。现在回车对 multi_select 一律返回 none(选项按钮仍走原生点击切换勾选,完成走显式的「下一题 / 提交全部」),与点击路径口径一致;单值题行为不变。
- 输入框斜杠菜单不再列 pi 在 RPC 模式下跑不了的命令 —
copy/export/share/session/settings/clone只存在于 pi 的 TUI,点了只会把命令原文发给模型,用户看到的是「命令被模型回答了」。这些命令现已隐藏(桌面各有等价入口:消息复制、会话导出、上下文圆环、设置页、复制会话);/hotkeys没有等价按钮,保留在菜单里并改为打开设置页的快捷键分区。 - Git 提交摘要区分「暂存区为空」与「无仓库」 — 智能提交此前只返回一个笼统错误,甚至会把原因算到 Git 摘要模型设置头上。现在 IPC 层分别返回
GIT_COMMIT_NO_REPO/GIT_COMMIT_EMPTY_DIFF/GIT_COMMIT_DIFF_FAILED(只有模型返回空串才指向摘要模型设置),getStagedDiff失败上抛不再吞错,面板会提示先暂存并静默刷新 git 状态。 (#338) - 切换会话模型后上下文用量立即刷新 — 此前换模型后圆环还停在上一个模型的用量,要等下一轮才更新;现在模型应用完成即刷新用量。
- 异步子代理完成后不再一直显示「运行中」 — pi-subagents 的异步派发不落任何会话记录,插件对已完成任务只保留 10 秒,界面于是永远回退到「运行中」(超过两小时还会被误报成已停止)。桥现在识别 asyncId、订阅完成事件、把终态持久化进
subagents:record并并入快照,完成与失败都能收敛;paused与未知状态不落终态(这类 run 还能恢复)。 - 添加模型不再自己编造能力 — 能力匹配过去把
pi --list-models的回显当事实(实际是 pi 对 models.json 的回读,会套上 128000 / 16384 / false 兜底),同一 id 跨 provider 按名字典序取第一个(279 组里 55 组上下文窗口与官方不一致),-free/-latest/ 厂商命名空间别名大面积匹配不上,端点 listing 里max_output_tokens=32763840008这种离谱值也照收。现在按模型家族归一化取值,只信官方目录。 - Web 端重发 / 编辑不再产生重复会话 — fork 与 clone 统一走与桌面相同的命令层,Web 端获得同样的重发 / 编辑语义,不再多出一个重复会话。
- 20 个色板颜色恢复对比度 — 全量巡检后重新调校了 20 个低于 WCAG 对比度阈值的主题色,并加守卫测试,避免后续改色板时悄悄回退。
- 弹窗 Escape 关闭与键盘可达性修复 — 全屏浏览器、图片预览与 IM 指南弹层补上 Escape 关闭(指南弹层三个入口统一走同一条关闭路径);IM Bot 卡头、内置浏览器标签页、Git 目录头与 RPC 日志行补
role/tabIndex/aria-expanded与 Enter / Space 激活;标签页补 tablist / tab 语义与三语可读名称,RPC 日志行补焦点环。 - 项目列表折叠黄点改用「会话在跑」口径 — 旧口径按 Agent 进程存活判定,会话跑完 / 停止后 pi 进程进入 idle 黄点仍亮,与子行蓝点自相矛盾。现在与子行统一按运行状态判定,顺带去掉过时的「进程未退出」提示文案。
- 应用、配置与数据目录统一为 PiDeck 命名 — 包名 / 产品名、用户数据根与飞书配置目录不再混用
pi-desktop/pi-deck/PiDeck几种写法;存量安装首次启动由幂等迁移器接管:改名数据根、修正会话 header、用「临时文件 + rename」改写配置,整条链路成功后才原子发布带版本的完成记录(读取有 16 KiB 上界);两代目录并存时不动任何一边(降级安装仍需可用)。失败不阻塞启动:保留旧根、下次启动继续补修;新增docs/data-migrations.md台账登记每一项自动迁移与归属。 - ACP 忙碌发送改为排队,不再中途插话 — ACP 除
session/cancel外没有 steer 通道,回合进行中发送过去可能被当作回合内插话投递,而 agent 并不理解。现在忙碌发送恒收敛为排队 follow-up(ACP 会话排队行的「插话」按钮禁用、发送分栏菜单隐藏该项)。同一批改动把网关错误端到端本地化(-32000 Authentication required现在引导登录而不是只给一个裸错误码)、在工具未声明图片能力时提前拒收图片并给出原因、兼容 OpenCode 的availableCommands键名(此前斜杠菜单恒空),并把非标准usage_update投进上下文仪表。 - 冷启动的 ACP 会话会自我说明,首启失败也能看懂 — 重新打开历史 ACP 会话此前不会激活任何东西,输入框空着且没有任何说明。起始页现在带一条提示条:历史保存在工具侧,发送消息后自动恢复;绑定的工具已被删除时降级为只读引导。首启失败文案按根因分流:
spawn ENOENT给出工具名与完整命令行、握手超时明确说超时、工具被删或被禁用如实说明,而不是一条笼统错误;输入框占位符也会带上工具名(发送给 {tool}…)。 - 外部升级 pi 后顶部不再显示旧版本 — 在 PiDeck 之外升级 pi(
npm i -g/pi update)后,顶部一直显示缓存里的旧版本,「检查 Pi 更新」还提示已是最新,而同屏安装列表已经是新版本(实测 1.1.0 vs v1.2.0)。现在真跑过pi --version的链路(检查更新、安装列表的当前条目、会话级静默复核)都会把探测结果回写缓存,且规则保证不会清掉命令路径、也不会因探测不完整而写成「未安装」。 - MCP 资源信息在 pi 1.2 下不再丢失 — pi 1.2 把「服务是否提供资源」从数量改成布尔值,
mcp list解析现在两种形态都收,升级 pi 后 resources 字段不再静默消失。 - pi 自更新失败会说清怎么办,bun / WSL 安装走对通道 — 失败提示按根因分流:包源未同步(npm
ETARGET、bunNo version matching)在 PiDeck 代跑通道给出带--registry=https://registry.npmjs.org的完整重试命令,pi 自身通道只建议指向官方源(写死 npm 会在 pnpm / yarn 机器上再装一份 pi);发布年龄门(minimumReleaseAge/min-release-age)给出放宽年龄门的提示,不再误诊为镜像滞后;网络类失败原样透传。bun 安装改从安装根的bin推导 bun 本体(软链 / Homebrew / scoop 布局此前必 ENOENT),把安装根作为BUN_INSTALL传给子进程(否则 GUI 启动会把包装进~/.bun),并给 pi 自身的 bun 分支补上--ignore-scripts与 bun 1.3+ 的--minimum-release-age=0。WSL 目标一律交回发行版内的 pi 自更新,宿主包管理器不会再误装到 Windows 上。 - Windows 任务栏按钮显示 PiDeck 品牌而不是 Electron 标 — Windows 按 AUMID 从开始菜单 / 任务栏固定项的快捷方式解析按钮的名字与图标:残留的 Electron 快捷方式,或 dev / 免安装运行完全没有快捷方式时,窗口图标怎么设都只会显示 Electron 原子标。现在 PiDeck 把当前 logo 落成内容寻址的
.ico,只更新目标就是本程序的快捷方式图标;绝不新建或删除快捷方式,找不到快捷方式时按 exe 静态图标回退并留一行日志。 - 提示词增强助手不再卡在启动超时 — 宿主进程的启动等待从 15 秒放宽到 30 秒(托管安装的
dist/index.js有几十 MB,冷缓存叠加杀毒扫描可能超过十几秒),超时判定也延后一个事件循环回合,不再把「已经握手成功、只是 ready 行还在管道里」的助手杀掉。可诊断性一并补齐:宿主脚本按阶段输出启动日志(node 版本、SDK 路径与导入耗时、runtime 创建耗时、ready 已发出),超时告警带上子进程 stderr 摘要,stdout 上解析不了的行不再静默丢弃而是留痕告警;认证宿主的启动链同样补上阶段日志。 (#341) - 原生模块不可用不再让整个应用起不来 — node-pty 此前在模块顶层静态 import,缺少对应平台二进制(跨架构打包、可选依赖没有跟随)时主进程在求值阶段直接崩掉,窗口都出不来。现在改为函数内惰性加载并 try/catch 降级:终端不可用时其余功能照常。 (#257)
- 新会话首条消息不再丢掉刚选的模型 — 新建会话后立刻在底栏点选模型,首发消息仍按配置默认模型发出——校验用的数据源与选择器不同源(选择器写会话级选择、校验读配置默认)。现在两边统一读同一份选择状态。 (#340)
- 代理白名单接管时主开关给出解释 — 供应商白名单模式下代理主开关由白名单接管,此前开关看起来「点了没反应」;现在开关置灰并就地说明原因。 (#342)
- 选择题点击即提交 — 提问卡此前必须点完选项再点「提交」,现在点选项即提交(多选卡仍走显式的「下一题 / 提交全部」),少一步操作。 (#344)
- ACP 会话运行态卡死三连修 — 首回合一直停在「启动中」、停止无法升级为强杀、回合卡住后没有看门狗兜底,三处都在这一版修掉:停止现在能把卡死的回合收口,不再需要重启应用。
- 切到 ACP 后端不再让输入框报错 — 底栏从 pi 切到 ACP 时条件 hook 数量变化触发
Rendered more hooks than during the previous render(React #310),输入框整块崩掉;底栏 hook 改为无条件调用。 - 模型目录远端结构不兼容时单独归码 — 远端目录的 schemaVersion 与本地不兼容时不再混进「仓库文件异常」,单独提示真实原因。
- 更新失败提示里的 npm 命令补作用域源 — 代跑更新失败时给出的重试命令带上
@earendil-works:registry作用域源,避免按提示重试仍打到没同步的镜像。
🙏 致谢
感谢 juzijun233 与 EEEEEEEEdison 的代码贡献:通道切换版本守卫 (#336)、右侧边栏上下分区与会话状态面板 (#334)、TPS 测量模式 (#327) 🎉
感谢 bfzha 带来文件树目录吸顶、过程组标题吸顶、PiDeck 命名统一与历史数据目录迁移,以及切换模型后的上下文用量刷新。
感谢 ct-jaryn 提交百智云服务目录预设 (#339) 🎉
感谢 fengxinzi1814 提交选择题点击即提交 (#344) 🎉
特别感谢 罪、橙子、微时 为软件开发提供的模型服务 🎉