Repository navigation
v0.9.5
这一版的主线是「把细节看清楚」:轨迹检查器整体重做,每一轮真正装载的系统提示词、token 与耗时都能查到;对话里的图片终于能直接显示、放大、复制与另存;智能体从弹窗变成可管理的市场,划词翻译与输入预测这类一次性调用收进同一套侧车。性能也补了一轮:冷启动的会话扫描从 3994ms 降到 105ms,首屏少加载 0.86MB,安装包小 6.3MB。
🚀 新功能
- 轨迹检查器重做:按轮折叠,长会话不再拖慢界面 — 15,000 条记录的会话以前就是 15,000 个 DOM 节点,每次 token flush(约 20 次/秒)都可能重扫整个会话文件(38.8MB 单次约 117ms)。现在账本只挂尾部 3 轮、单轮最多 120 步,向上滚动再放 3 轮;概览从「一条记录一个按钮」改为按泳道 + 像素桶聚合,同一桶显示 ×N。刷新改为事件驱动(会话 / 运行代次 / 回合运行状态变化才重取),仅在会话活动时每 5 秒兜底一次。默认折叠除最后一轮之外的所有轮次,轮头直接给出「N 步 · N 工具」、token 合计与耗时,同一轮里连续工具调用超过 8 条压成一行;工具栏可一键全部折叠 / 展开,切会话自动重置。右侧导轨现在覆盖全部提问,点一条还没加载的刻度会沿已加载边界连续补页(最多 7 次请求)再跳转。
- 轨迹面板显示当轮真实的系统提示词与用量 — 此前那条「系统提示」是用模板拼出来的参考记录,并不是当轮实际请求体;pi 的 assistant 也只是一个时间点,没有 token 与耗时。现在按活动父链重放会话文件里的 system 条目(含 sections 补丁与工具增删),首次请求记「初始系统提示词」、之后每次变化各记一条,可以看全文、工具清单与字符数 diff;回退 / 分支 / fork 出来的旁支补丁不会再污染当前装载。pi 落盘的 usage(input / output / cacheRead / cacheWrite / reasoning / cost)与
meta.durationMs一并进账本,轮次行显示「18k→1.2k」和真实耗时。快照按 96,000 码元与 256KiB 双上限裁剪,只在完整码点边界切,不会把 emoji 截成乱码。 - 对话里的图片终于能看 — Markdown 里的本地图片此前不渲染:dev 页源是 http,裸
file://子资源被 Chromium 拒绝。新增pideck-file://只读协议,白名单根覆盖 userData、截图目录、聊天工作区与项目路径,请求与根都过realpath校验(Windows 8.3 短名与长名不是同一个字符串),单文件 32MiB 上限。单图按min(100%, 640px)× 360px 限高显示,同一段里两张以上自动切成 96px 瓷砖,点开有预览浮层(Esc 在捕获阶段拦截,不会顺带停掉生成);加载失败显示「失败 · 文件名」与重试按钮,流式半截路径到达完整路径后自愈。浮层工具条与大图角标提供复制 / 保存,本地图字节走 IPC 读取,扩展名按真实 MIME 决定(svg / avif / bmp 不再被存成.png)。 - 智能体:从弹窗变成市场,也变成页面 Tab — 「智能体」与「定时任务」现在是会话 Tab 栏里的页面式 Tab:切会话只失活(搜索、详情、编辑状态都保留),关闭才卸载。内置翻译官、PiDeck 小助手、问题诊断助手、插件开发助手四个角色,卡片支持搜索、五个分类筛选与使用次数;自建、复制、编辑、删除都支持,内置的可以编辑,也能「恢复内置设定」。点「使用」按智能体指定的后端新建会话并绑定,角色设定经隐藏
agentMessage注入,时间线只显示你自己输入的内容,输入框上方常驻一条可展开的只读「角色设定」。 - 应用内划词翻译 — 会话里选中文字浮出翻译按钮,点开原地流式输出、可复制;时间线的选区浮层同时给出「引用并提问」与「翻译」,同一时刻只会有一个浮层;右键菜单、工具栏按钮上的 mouseup 不会被当成新手势。设置 → 常用 → 划词工具可以设总开关与默认智能体,也可以跳去管理智能体。系统级划词(任意应用复制即触发)本版暂未开放:取词已按 Windows UIAutomation 落成原生捕获(不读写剪贴板、不模拟按键),但命中率还要再验证,先隐藏入口并默认关闭,恢复时不需要改代码结构。
- 输入预测:回合结束后直接给出下一句 — 每轮回答结束、输入框为空时,用本轮上下文在后台预测下一句,以灰字 ghost 显示在草稿位置;Tab 或 → 采纳进草稿(不发送),Esc 忽略,失败与超时全程静默(只写
suggest日志)。ghost 是绝对定位的视觉层,不写进编辑器文档,不参与撤销与发送判定。默认开启,可单独指定预测模型,与提示词增强的模型互不影响,缺省跟随会话模型。 - 时间线右键复制与流式划选保持 — 右键菜单提供复制选中内容 / 复制为纯文本 / 复制为 Markdown / 全选,右键按下瞬间锁存选区,菜单打开后高亮消失也能复制对;有选区时菜单只留「复制」「全选」,不再和整条消息的操作混在一起。拖选期间冻结正文的 live 渲染(数据照收,松手追平),streaming 结束换树后仍按文本锚点还原选区。
- 运行控制常驻会话头,
/reload热重载 — 原来 hover 才出现的控制条改为常驻 28px 控件(主操作 / 重载 / ⋯ 菜单)。pi 会话支持/reload热重载扩展与技能(走ctx.reload(),不写乐观用户消息,也不复用sendPrompt);DSH 暴露 host 重启(共享 host 需确认),ACP 不渲染。重载期间只有重载钮转圈 + 时间线遮罩;扩展缺失、重载失败或命令未被处理都返回结构化错误 + toast,不影响会话本身。 - 宿主插件:卡片行 + 从 GitHub 安装 — 三列表格改成行卡片:图标、版本、状态点、能力短标与拆分按钮,权限细节留在授权弹窗里。安装入口合并为「从文件 / 从文件夹 / 从 GitHub」,GitHub 只走
codeload.github.com的 tar.gz 并自带 tar 解析(不为不可信输入引入解压依赖),三条路径共用同一套预算与信任判定;授权仍按逐文件内容 sha256,内容变了就要重新确认。 - 更新页按设备推荐安装包 — macOS 无签名、Linux arm64、deb / tar.gz 这些无法应用内更新的组合,现在检查更新时会按平台、架构与安装形态匹配 Release 资产并展示推荐包;一键下载到系统下载目录,流式进度 + sha256 校验,完成后打开或定位文件。
- DSH:模型可声明图片输入,会话启动前就能读技能目录 — 模型编辑器新增「输入模态」三态(跟随目录 / 仅文本 / 文本 + 图片),同时写
input与inputModalities,行上显示图片图标,发图不再被误判成纯文本模型。新会话还没启动就能拿到技能目录(host 权威并集 + 共享 SKILL.md 扫描),首条消息即可用技能。
✨ 改进
- 冷启动的会话扫描快 38 倍 — Windows 上
setTimeout(0)实测每次 16.3ms,1040 个会话按并发 4 分块扫描要白等约 4.2 秒;改成滑动窗口后 3994ms → 105ms。同批启动优化还有:pi 启动期按最近活跃项目预热一个待命进程,认领时若同指纹预热正在进行就等待(上限 30s)而不是并行 spawn 第二个(线上曾出现 26.5s 真会话与 12.1s standby 并行);DSH host 预热门控改为「runtime 已安装且用户未手动停止」;CUA 与 MCP SDK 改成动态 import(冷 require 约 100ms)。 - 首屏少加载约 0.86MB — en-US 与 zh-TW 词典(各约 430KB)改为按需动态 import,静态 chunk 从 1.42MB 降到 0.56MB,
index.html不再 modulepreload 这两份。 - 安装包小约 6.3MB — 飞书 SDK(单个 5MB 文件)不再进 app.asar,改成 resources 下的 tar.gz(gzip -9 后 0.93MB);首次启用时解压到 userData,sha256、字节数与路径穿越都校验,原子换入,失败可重试。Windows 上删目录与换入加了 100ms × 3 退避,杀软锁文件不再直接判死。
- 轮末「修改的文件」从常驻卡片改成每轮结尾的 chip 行 — 一轮改了哪些文件属于这一轮的结论,现在贴在正文之后、操作栏之前,单行折叠(放不下的收进
+N,点击原地展开为多行),左键开文件、右键进 diff。顺带修掉静默丢文件的根因:meta.args统一按 8000 字符截断,write / edit 带着完整文件内容超限后 JSON 被截坏、file_path取不到,文件连名字一起消失;文件类工具改用 100 万字符上限后,本机 60 个会话的丢失率从 5.0%(213/4221)降到 0.69%。 - 提示词模板参数真正替换 —
$1/$2位置参数、$@/$ARGUMENTS、${N:-默认}、${@:N:L}切片与引号切词都按 pi 的规则实现:此前原样留给模型,pi-subagents的$@参数会被塞到正文末尾。有占位符时参数进正文且不再追加,没有占位符时仍把用户输入追加在块后(不对齐 pi 的「丢弃输入」,绝不丢字)。同名模板按 pi 的加载顺序合并(项目优先、禁用不加载),不再由数组顺序决定用哪一份。 - 模式入口收进「+」菜单 — 计划 / 目标从「+」菜单的模式分组开启,普通模式不再作为可选项;进入后底栏出现彩色短名 chip,点一下就回普通模式,输入框边框跟随模式配色。底栏控件统一到 28×28 盒子 / 15px 字形,引导页输入框从 980 加宽到 1080px。
- 会话内查找覆盖更多场景 — 入口从浮在正文上移到会话头部工具条;DSH 会话也支持(host 历史投影,多词 AND,上限 100 条);命中已经折叠的执行过程时先展开那一轮再跳转,更早的历史一并补页。
- 设置页收拾了一遍 — 存储页把日志与缓存的多个分区合并成一个列表(清理全部 / 界面本地缓存 / RPC 日志 / 粘贴文件 / 通知历史),按钮统一红色「清理」,占用大小定宽右对齐;模型选择器打开前重读收藏、切换即落盘;MCP 停用条目就地给「启用」;搜索补上划词、输入预测、轨迹等锚点。
- DSH 下线内置持久 pwsh 工具 —
pwsh_persistent连同本地包、打包链与护栏测试一并移除,DSH 会话改用官方预设工具。如果你的提示词里点名用过这个工具,换成官方 bash / pwsh 预设即可;日志里不会再出现它的启动失败。
🐛 修复
- 归档或恢复会话后只剩最后几轮 (#392) — session-store 的条目表复用只看
size+mtimeMs,文件被整份重写且恰好更长(编辑消息、压缩重写、导入)时会从旧偏移续读,条目链在错位点断开,活动分支只剩尾部、nextBefore为 null 连「加载更多」都没有,重启也不自愈。现在复用前回读首 / 末条目的 offset 与 byteLength 校验 id,表版本 1→2 一次性丢弃旧表,超长行只读 64KiB 前缀。 - 会话停止后再发消息,历史整段消失 — runtime 恢复时磁盘页会被首个窗口化 flush 覆盖(首帧是空窗口时直接变成空会话),上滑也没有加载入口。现在 flush 前先把磁盘页转成 history 前缀(带 indexVersion 与续页游标),同代判据改成「文件被重写、体积变小才失效」,追加写不再丢已加载的前缀。
- 计划模式的草案永久挂在界面上 (#393) — 产出计划后没点「开始执行」就离开,待办会一直显示「N 待处理」,面板上的 × 只是隐藏、重开又读回来。现在重开会话只续接执行中的计划,非执行态的草案丢弃并写回空状态,旧会话重开一次即自愈。
- DSH 启动超时留下孤儿 host(一次约 250MB) —
waitForReady超时只 reject 不 kill,重试又覆盖了引用,第一个 fork 再也没有可 kill 的路径;两代 host 还会抢同一个DSH_HOME锁。现在失败路径先收尸再抛错,kill 按 child 记账,迟到的 host-ready 不允许复活实例。 - 打包版 DSH 的沙箱命令全线失败 — Windows 安装版的 PTC 与全部沙箱命令报
Windows Job runner exited with exit code 1:node.exe runner 被注入 app.asar 里的 preload,而真 node 读不了 asar。sidecar 分支不再注入,并自建无窗口控制台。 - DSH fork 现在真的新建会话 (#381) — fork 不再原地改写
dshSessionId,而是新建 catalog 条目((fork)标题,继承模型 / 权限 / 预设)并原子换绑 runtime,原会话保留,桌面与 Web 都切到新会话。 - DSH 的三处错位 — 多选提问不再降级成单选(勾第一项就被自动提交,答案数组原样透传);切换会话不再把 host 选择持久化成部署默认模型,历史会话显示真实模型;PTC 模式下轮末「修改的文件」不再恒空(子调用投影成隐藏消息专供汇总,历史会话重开也能看到)。
- Git 面板:未暂存的更改里混进已暂存文件 (#391) — 暂存后同一个文件同时出现在两组,那一行的 diff 报「无法读取…」,暂存 / 回滚按钮也被藏起来;现在 Changes 组只取工作区与未跟踪文件。暂存 diff 超过
maxBuffer改为截断降级(AI 摘要取前 8000 字符),不再整条报stdout maxBuffer length exceeded。 - Web 端切后台回来弹 Network 错误 — 服务端只在有订阅者时转发、翻译器按连接私有,手机中途点进会话只能看到尾部帧。现在翻译器与本轮帧改为会话级,新连接整段回放(2000 帧上限 + 64 会话 LRU),磁盘追赶完成后清掉 error 状态。
- HTML 预览里的内联脚本被 CSP 拦掉 (#377) —
iframe srcDoc继承主窗口 CSP(没有unsafe-inline),用 JS 绘制的元素整片消失。新增pideck-html://协议,CSP 由主进程按响应头下发,iframe 仍然只有allow-scripts、没有任何同源能力;URL 上限改按 base64 之后的长度判断(中文膨胀 4 倍、emoji 5.33 倍),超过 1.5MB 退回 srcDoc 而不是白屏。 - rewind checkpoint 抢 git index 锁 (#372, #386) — checkpoint 直接对用户的 index 跑
write-tree,会撞上index.lock(实测单日 14–22 次)。现在复制临时 index 再写树,非 git 仓库进 30 分钟冷却(曾占全部失败 70%、单日刷屏 52 次),WSL 用rev-parse --git-path index定位,并拒绝静默保存空树快照。 - 诊断包看不到 detail (#374) — 日志逐行白名单只保留 4 个字段,
MODULE_NOT_FOUND的 require stack、RPC 超时毫秒数、git stderr 全被丢掉。现在改为递归脱敏(home →~、凭据 →[redacted],深度 4 / 条目 20 / 单值 500 字符),detail 原样留下。 - 用量面板的空值 — 探针只给「总额 + 剩余」时,详情面板用
total - remaining反推已用百分比,不再进度条空、百分比「—」(#378);Sub2API 的 JWT 会在到期前 60 秒或/auth/me返回 401 时就地续期,只尝试一次,轮转后的 token 写回配置,面板不再突然变空。 - 安装器完成页「运行 PiDeck」启动错程序 — 默认的
$launchLink优先取开始菜单里那条 .lnk,可能指向另一份同名同版本的安装(解包构建或旧安装目录),版本号看着还是对的。改为直接启动$INSTDIR\${APP_EXECUTABLE_FILENAME},升级启动仍带--updated。 - 并行发送不再丢主会话上下文 (#210) — 并行子任务统一继承主会话的上下文与设置,不再各自以默认供应商 / 模型起跑。
- 启动补默认项不再覆盖 settings.json — 解析失败(BOM、手改注释)直接跳过不写,只补缺失键(
packages、供应商、主题原样保留),齐全时一个字节都不写;写入走 pi 同款文件锁 + 原子替换,避免与 pi / TUI 并发互吞改动。 - 字号 token 被 tailwind-merge 吞掉 (#389) —
text-control/text-micro这类项目字号工具类被当成冲突合并掉,按钮、徽标与文件树的字号在同一条 class 链里静默失效;现在把它们注册为字号 token。 - Markdown 有序列表编号只剩右半边 (#369) — macOS 自定义字体下
::marker会超出列表 padding,被overflow-x: clip切掉;改成li内绝对定位的计数器,正文缩进 1.7em。 - 聊天分组折叠后误报「没有会话记录」(#387) — 折叠组此前没有视觉差异,看起来像空态;现在折叠态有明确的收起样式与空态文案。
- 尾随扩展输出不再折叠最终回答 — 父回合收尾后,后台子代理 / 扩展的尾随输出仍被吸进该回合并成为收尾条目,把真正的最终回答降级成「中间回答」折叠起来(
acp-nudge这类通知的实际表现)。现在先按回合边界冲刷,输出卡独立排在回答之后;侧栏的活动 / 历史 / 草稿会话也统一把后端与来源标移到标题左侧。 - 轨迹面板的空白与滚轮 — 读不到事实时面板顶部会说明原因:超出读取预算、父会话缺失(fork 前置事实缺失)、只读到宿主窗口(初始提示词可能是窗口快照)、后端暂不可用。「后端不可用」与「确实没有事实」不再混为一谈:DSH host 未就绪按 5 秒重试(最多 12 次),读取异常保留上一次成功数据。概览的滚轮缩放改用非 passive 原生监听,缩放时不再带着整个面板一起滚(React 的
onWheel会忽略preventDefault)。 - 斜杠命令与预设锁定 — 历史消息里的
/命令不再缺 chip:get_commands只声明没实现,渲染层的命令白名单一直是空的,现在补上别名并加「声明即实现」断言;本地模板展开给 host / 扩展 / 技能 / ACP 命令让路,/a/b相邻命令都能展开,保留命令也不再每次发送白跑 3 趟 IPC。DSH 的预设锁定判据在主进程与头部胶囊间统一(有 runtime / 有dshSessionId/ 已 active 即锁),不再「界面能点、主进程拒绝」。
🙏 致谢
感谢 bfzha 这一轮把轨迹检查器整体重做(S0–S4:提示词快照与索引化有界读取、导轨目录与合并索引、账本渲染窗口与概览像素聚合、事件驱动刷新、轮次摘要与折叠),并带来对话内的 Markdown 图片渲染(pideck-file:// 只读协议与 640×360 / 96px 多图布局)、提示词模板参数替换与同类模板合并、轮末「修改的文件」的重做——顺带把文件丢失率从 5.0% 压到 0.69%。
感谢 TanCan1998(@TanCan1998)连续修掉五个卡点:用量详情在探针只给总额与剩余时反推已用百分比、诊断包保留脱敏后的 detail、HTML 预览改走 pideck-html:// 协议解除 CSP 限制、DSH runtime 未安装时给出可解释的错误、rewind checkpoint 不再抢用户的 git index 锁并补齐 WSL 与空树快照的边界 (#380, #382, #383, #384, #386)。
也感谢 op15066212、Dicores、fengxinzi1814、Lamb-Yang、lamugu 提交的 Issue 与复现步骤:归档 / 恢复只剩尾部几轮 (#392)、计划草案永久悬挂 (#393)、HTML 预览脚本被 CSP 拦掉 (#377)、字号 token 被合并掉 (#389)、Git 暂存分组错乱 (#391)、DSH fork 改写原会话 (#381) 这些修复都直接来自他们的定位。
特别感谢 罪、橙子、微时 为软件开发提供的模型服务 🎉