Skip to content

决策日志

翻译说明: 本页是与 英文源规格 一一对应的机器辅助翻译。代码、协议字段和标识符保持原文;如翻译与英文源事实有歧义,以英文版本为准。

基线增量:0.3.00.4.15 日期:2026-08-05 状态:已接受实施

该日志将以前未解决的问题冻结为具体的决策。

A. 高优先级架构决策

身份证号主题决定基本原理
D001Electron ↔ Rust 运输Rust sidecar + stdio JSON-RPC (NDJSON)简单隔离,可调试,后期可更换
D002SQLite 所有权Rust host-core 独家拥有 SQLite单写入者,权限边界更清晰
D003默认模式Agent产品是座席桌面,不是纯聊天
D004前受限个人资料(由 D189 取代) 以前的聊天只读配置文件已删除;持久的聊天值迁移到 Plan。该产品现在有一个 Agent,具有规划状态和单独的批准边界
D005权限超时120秒→拒绝失败关闭,不会永远挂起
D006allow-session 范围toolName 提供简单的用户体验;工作区沙箱仍然强制路径安全
D007~/.pi 兼容性MVP 中没有自动导入~/.pi-desktop 中保持配置所有权干净
D008Node 运行时打包开发人员使用系统 Node;版本通过 ELECTRON_RUN_AS_NODE=1 在 Electron 二进制文件上运行捆绑的 sidecar(未提供单独的 Node)疏通M1–M4;在 M5 处解决,请参阅 03-runtime/07-process-model §6
D009插件运行时隔离目标=单独的进程; M4 可以使用主机管理的沙盒运行时在不削弱 API 网关的情况下实用地发布插件基础
D010首个发布平台仅限 macOS arm64重点验收及包装

B. 辅助实现默认值

身份证号主题决定
D011TS 架构验证打字机
D012国际化图书馆i18next + 反应-i18next
D013M3 中的 Bash 执行风格仅非交互式(尚无 PTY)
D014命令面板快捷键Cmd/Ctrl + Shift + P
D015插件工具公开名称强制前缀 plugin_<pluginIdSafe>_<toolName>
D016卸载插件数据默认删除,可选稍后保留数据
D017启用 → 加载失败自动回退到禁用
D018设置中的插件秘密MVP 中不允许
D019插件会话摘要访问默认拒绝
D020自动更新后MVP
D021首次运行新手引导内联清单(不是模式向导)
D022本地遥测仅在 MVP 中记录本地日志(无远程遥测)

C. 提供商和模型覆盖决策 (0.3.4)

身份证号主题决定基本原理
D023提供商覆盖目标全球市场覆盖(不是一个很小的固定供应商列表)全球化+真实的编码工作流程
D024覆盖策略pi-ai 原生提供商 + 一流的 OpenAI 兼容 + 自定义提供商无需重写每个 SDK 即可实现最大覆盖范围
D025模型许可名单无封闭产品许可名单模型流失;高级用户需要自由格式的 ID
D026目录来源捆绑快照 + discovery/refresh + 用户定义离线工作并保持最新状态
D027默认身份模型选择为(providerId, modelId)相同的模型 ID 可以存在于多个网关上
D028秘密通过secretRef进行操作系统安全存储(或受控回退);从未在提供商 JSON 中出现Rust 主机所有权的安全边界
D029本地模型通过兼容 OpenAI 的本地网关支持Ollama/LM Studio/vLLM 无特殊情况架构
D030连接测试在信任提供商运行之前的一流主机方法尽早失败,可操作的设置用户体验
D031秘密后端操作系统安全存储主要+加密文件后备在 macOS 首次发布上稳健
D032工作区忽略安全拒绝列表 + 默认值 + .pi-desktopignoreSafe/predictable 工具 FS 行为
D033工具结果限制256KB/4000 行默认带有显式截断标记保护上下文和 UI

D. 法典视觉平等决策 (0.3.5+)

黄金来源:当地 Codex 电子捕获;当行发生冲突时,最新行获胜。

身份证号主题决定基本原理
D034桌面视觉基线Codex electro-dark 1:1 外壳(炭灰色,浮动输入框,~275px 侧边栏)匹配当地法典的可用性和密度;保留 PI-Desktop 产品品牌
D035外壳显示名称(被 D094 取代) UI chrome 使用 shellName“Codex”; product/about 仍为 PI-Desktop满足视觉 1:1 复制品目标,同时保留 about/settings 中的产品标识
D036主题 chrome 令牌所有 shell chrome(导航、线程、芯片、标题按钮)均使用语义 --ds-* text/surface 令牌;浅色模式下没有原始的gray-0文本当导航在 #f3f3f3 上使用白色墨水时,浅色 macOS 默认不可用
D037深色侧边栏表面深色侧边栏使用 #000000(Codex surface-under);主窗格保持 #181818 (gray-900)匹配电子暗侧条与主表面分离
D038黑暗输入框板(被 D047 取代,然后是 D061) 深色浮动输入框使用实心 #212121,其仰角阴影比光强Codexleved-primary 必须读作 #181818 的方框;单独的透明混合看起来很平坦
D039舞台经理界限永久主机看门狗恢复足迹,而 width/height 保持折叠状态在舞台监督的猛烈攻击下,20 秒的爆发力不够
D040输入框智能控制(被 D091 取代) 自定义努力芯片会打开一个弹出窗口(努力无线电 + 模型标题 + 设置),而不是点击循环替换是因为控件在没有配置pi的情况下改变了标签
D041个人资料页脚(由 D113 取代) 自定义页脚打开配置文件菜单(设置/日志/主题);云徽章仍然是更新替代品D113 使用真实的本地轮廓页脚替换了 cloud/update 替代品和通用齿轮排
D042项目页面(被 D066 索引表取代) 项目是 recent/active 本地工作空间的卡片网格,带有引脚 + 字形颜色(localStorage 最近)无需云项目后端即可匹配 Codex 项目目标密度
D043设置外壳(被 D062/D063 全页 shell 取代) 设置在侧边栏表面 + 内容窗格上使用左侧导航栏 (General/Providers/Plugins/About)比仅顶部的选项卡条更接近 Codex 设置 IA
D044目的地列表镀铬PRs/Scheduled/Plugins使用共享目标行列表+过滤芯片;光卡白色高架无需完整的云后端即可匹配 Codex 目标密度
D045首页空栈空聊天使输入框保持在主流程中(不是绝对仅位于底部的码头);由 D047 分裂生长精制初步修复大空间隙; D047 修正双生长垂直模型
D046输入框占位符(被 D094 取代) 空草稿使用 Codex 占位符 (EN/zh-CN) 而不是空白空白的白板没有墨水,读起来就像是破损的;与早期的视觉金色副本相匹配
D047家庭分裂种植(被 D111 取代的几何) 空置家庭使用 upper/lower 生长区域(英雄项目结束 + 输入框调整结束);暗盒使用 Codex 海拔突出匹配电子双生长; D111 用可滚动流堆栈替换双增长门户以阻止 composer/card 冲突
D048侧边栏最近标签(由 D088 取代) 近期部分使用实时 Codex 黄金标签 EN Recents / zh-CN 最近(并非仅限 asar 的 Tasks/任务视觉黄金 + 插件和线程列表之间的实时编码 shell 部分标题
D049家庭建议卡(被 D131 取代) 空的主页在英雄下方显示 4 张环境卡(自动调整行),并在点击时预填充启动提示D131 从空置中删除卡行和提示预填充入口点
D050空作曲器板高度(被 D055 取代,然后是 D061) Home 空输入框 min-height ~112px(紧凑);模型芯片显示模型 ID(操作保留在菜单中)匹配 Codex 空板密度;模型芯片镀铬更接近电子模型选择器触发器
D051侧边栏导航密度(会话列表 IA 被 D088 取代;保留行密度) 导航行 ~32 像素间距,最近行 ~28–31 像素,部分标签 Recents/最近关闭 light-home 侧边栏残留 vs cx-home-clean
D052家用立式+夜箱抛光(工作区芯片表面被 D095 取代;保留剩余指导) 上部 pb ~62px(英雄第一墨水 ~y305);光芯片#f3f3f3;灯光输入框海拔更强;黑暗家庭输入框固体 #212121;工具栏控件 28px关闭英雄y≈300和输入框乐队的余热;夜板不得压平至 #181818
D053舞台监督CG检测CG边界助手通过pid匹配任何窗口层;上架恢复前,missing-CG需要streak≥3;避免永久的alwaysOnTopAlwaysOnTop 浮动层破坏了第 0 层帮助器并导致恢复抖动
D054空草稿行+无限提示(∞ 提示被 D094 取代;领先品牌提示被 D160 取代) Composer 自动调整大小绝不能折叠空文本区域高度 (<28px);在草稿左侧保留明显的品牌提示;常亮禁用发送(#bdbdbd 灯亮);更密集的占位符墨水;实心夜板 #212121清空 height:0 自动调整大小隐藏占位符并读取为损坏的 night/light 框;金色草稿行需要可见标记+油墨密度
D055空板吃水Y(印版高度指导被 D061 取代;工作空间芯片密度被 D095 取代) 主页空壳最小高度 ~148px(底部对齐),因此草稿最密集的墨水 ≈y556 与金;芯片紧凑型 28px112px 板左草稿 ~30px 低;在不移动工具栏基础的情况下向上生长板
D056空置的家庭工作区芯片(由 D095 取代) 始终将 project/Local/branch 胶囊隐藏在空置的家中;仅在线程对接的输入框中显示即使有项目标题,cx-home-clean 空金在盘子上方也没有胶囊带
D057主队标记+英雄称号光学(主页标记被 D094 取代;保留标题指导) 空主页 Codex 标记使用较粗的笔画;短工作区基本名称显示为 PI-Desktop 以获得黄金标题跨度英雄残差是细标记+短项目标签下墨标题 vs Codex 黄金
D058首页内容宽度+深色墨水标记家庭双生长最大宽度使用768px(不是14px根下的48rem);首页水平垫12px;英雄 title/night 控件使用主题令牌;夜间本垒板范围仅限于黑暗48rem 在 14px 根部收缩板 ~120px 与 Codex gold 相比;硬编码的光英雄墨水使夜间标题无法读取
D059光禁用发送墨水禁用发送芯片 #8e8e90 + 白色箭头(不是 #bdbdbd像素匹配 cx-home-clean 空发送控制
D060轻新任务鬼行轻空置新任务透明(无固态芯片);仅悬停清洗金色有图标+标签,无填充药丸;填充的 #e8 芯片是主要导航残留
D061空盘Y+夜高架-初级首页空板最小高度140px + 包裹底垫16px(顶部〜y536–538 /草案〜y552 /脚部阴影〜y674);浅色+深色本垒板使用升高的主填充和向下的高度(无向上的全向发光);深色填充 #212121f5板高有板前光晕;实心夜板 + 重型全向阴影,与 Codex 高架主色和金色脚带不同
D062设置 Codex shell设置使用Codex分组导轨(Personal/Integrations)+搜索+返回应用程序;内容是升高的行面板; Providers/Plugins 保留为本地优先;集成下的 MCP 空状态目的地奇偶校验差距;先前的 4 项扁平导轨与 Codex 设置 IA 不同
D063设置全页接管设置用 Codex 全页 shell 替换应用侧边栏:后退+搜索+图标组 (Personal/Integrations/Coding)、提升的 permission/general 卡、保留本地 Providers/Plugins主窗格内的嵌套设置与实时 Codex 设置黄金不同
D064设置常规内容奇偶校验基本卡行匹配 Codex:默认打开目标、语言、菜单栏、底部面板; nav 添加 Pets/Appshots; sun/pet/snapshot 图标;药丸选择与实时 Codex 设置黄金含量带更接近 1:1
D065设置一般金色抛光权限行包括蓝色了解更多链接+完全访问风险副本;开放目标药丸显示 VS Code 字形; Agent 使用圆形箭头图标;集成顺序Appshots→插件→浏览器→计算机→MCP;输入发送至 Agent全页 shell 后的剩余间隙与 cx-settings-try
D066带有项目的主页 chrome + 项目索引(输入框智能标签由 D091 取代;工作区芯片部分由 D095 取代) 项目打开时主页显示工作区芯片(无 ∞); home placeholder 随心输入/询问任何事情;页脚齿轮+帮助;项目页面是使用 setProject 的 Codex 索引 (search/columns/expand/actions)黄金级 cx-home-clean 与项目 + 项目索引页奇偶校验
D067首页建议字形+芯片间隙(建议字形部分由 D131 取代;输入框芯片间隙部分由 D095 取代) 建议图标与 Codex (code/hammer/refresh/bug) 和 blue/purple/green/orange 音调相匹配;输入框芯片间隙 8px 和更密集的胶囊D131 取出牌; D095 仍然是输入框间距的权威
D068最近的行操作 + 灯具标题(侧边栏操作被 D088 取代,然后由 D093 重新组织;保留夹具标题指导) Active/hover 最近的行显示图钉 + 面板尾随操作; capture/fixtures 更喜欢中文标题的空会话(同步代码)而不是裸新任务金色侧边栏选排镀铬;减少选择残差
D069目的地标题刻度+黑暗新任务幽灵目标页面标题使用 Codex 28px/560 权重;新任务也是黑暗中的透明幽灵;捕获下降英语噪音固定装置和引脚同步代码PR/Projects 标题不匹配;深色 新任务读取为选定芯片
D070设置金色公制抛光设置导轨275px/#f4f4f4;更密集的导航;内容标题偏移量; 32×20 重音切换;帐户右上箭头; 14 像素卡片; 720 像素内容带Residual 与 cx-settings-try(导轨宽度、切换尺寸、标题 Y、外部标记)
D071转录本相互作用奇偶校验工具调用渲染为 Codex 风格的轻量级披露行(脱字号 + 名称 + 单参数提示 + spinner/status,夹紧的插入正文)替换盒装卡片;仅在通过浮动跳转到最新药丸固定到底部时自动滚动(根据 D151 发送/重试/重新生成重新固定);闪烁工作…与经过的时间线;将副本悬停在消息和代码块上盒装工具卡和强制滚动到视图与 Codex 转录本的感觉不同;规范 7.4 滚动暂停未实现
D072Typography/radius 令牌强制执行所有 font-size/weight/line-height/letter-spacing/border-radius 值必须使用 @theme 令牌变量(具有 -plus 半步的 --text-* 斜坡、--font-weight-* 包括 520/560、--leading-*--tracking-*、12 步 --radius-*); CSS 和 TSX 任意实用程序中的原始文字被连接到 pnpm lintscripts/check-style-tokens.mjs 阻止;准确保留像素值(无视觉变化)约 130 个分散的文字从任何比例上漂移;设计系统文档 §5.2/§6.2 表与实现相比已过时
D073完整渲染器 i18n 覆盖每个用户可见的渲染器字符串都流经 i18next(en 事实来源,zh-CN 通过 satisfies EnglishCatalog):ContextPanel/CommandPalette/PermissionDialog 有线; toast/aria/title/placeholder 文字键控;会话默认标题来自 i18n.t,具有共享的不区分大小写的 isDefaultSessionTitle 匹配器,涵盖跨区域设置的旧标题;专有名词(VS Code、Finder)和母语名称保持未翻译六个组件完全绕过了 i18n;默认标题匹配在商店和侧边栏中重复,并且错过了 zh“新对话”
D131空荡荡的家,没有建议卡(starter-grid 条款由 D205 修改,然后由 D206 取代) 空的聊天主页暂时仅呈现英雄、可选的首次运行清单和输入框;原来的四张探索/构建/审查/修复卡、它们的彩色字形以及它们的提示预填充操作被删除。这取代了 D049/D067 和 D111 的原始卡特定条款,同时保留其单一可滚动流布局。直接输入框仍然是主要任务条目;去掉了原来的装饰起始行,解决了噪音卡的处理。在 D206 将空状态返回到直接进入之前,D205 短暂地重新引入了一个更安静、非提交的开发者网格。
D133项目索引移至设置存档(五个目的地 count/order 被 D166 取代;平面列表演示被 D168 取代) 主页侧边栏不再具有独立的项目目的地。设置在导入之后、信息之前添加项目归档(zh-CN: 项目归档),将压缩目录带到基础/模型配置/导入/项目归档/信息。存档重用持久的项目索引,并且始终包含存档记录,包括搜索、添加、激活、任务扩展、固定、archive/restore 和关闭操作。项目和会话组仍保留在主侧边栏中以进行积极的工作。全局搜索将存档公开为“设置”结果,而不是独立页面。这取代了 D042/D066 的独立目标子句和 D090 的四个目标限制,而不更改项目存储或激活语义。活跃的项目工作已经存在于保留的侧边栏组中;将历史项目管理移至“设置”可减少主要导航,同时保持恢复和存档控件可发现。
D168项目档案演示重新设计项目存档呈现三个堆叠带:一个概述横幅(意图句、主要添加项目以及用于项目、打开、存档、会话的四个派生计数器)、一个工具栏(具有清晰的可见性和实时匹配计数的搜索,以及 Recent/Name 排序分段控件),以及一个分组索引,其始终可见的部分运行“固定/所有项目/存档”,每个部分计数、每个部分一个设置面板和细线行分隔符。行包含公开控件、字形、带有 Active/Open/pinned/Archived 标签的名称、一条元行(缩短的等宽路径、分支、会话计数)、相对最后活动时间和 hover/focus-revealed 新任务加行菜单;菜单将 create/edit 置于引脚上方、archive/restore 和破坏性关闭中,并在 Escape 或外部按下时关闭。存档的行被分组和软化,从不隐藏或过滤,因此 D133 的不可见性切换规则仍然有效。这取代了 D133 的平面列表演示,而无需更改项目存储、搜索匹配、会话批处理或激活语义。平面单列表存档对固定、工作和存档记录给予同等重视,并将其披露和行操作隐藏在悬停后面,因此扫描长期持久索引意味着读取每一行。使用派生计数器进行分组并进行显式排序,使状态一目了然,同时保持存档历史记录永久可访问。

E.M5 强化决策 (0.4.0)

身份证号主题决定基本原理
D078macOS 签名通道对于本地构建,静态配置保持未签名(identity: null); scripts/release-macos.sh 注入开发者 ID + 强化运行时 + 来自 env 的可选公证贡献者无需证书即可构建;根据 06-delivery/06-release-runbook 发布标志
D079应用程序图标/品牌标记 v1build/icon_1024.png 是规范的 PI-Desktop 徽标; scripts/make-icon.py 派生 build/icon.icns 而不覆盖 PNG;打包的 macOS 构建、pnpm dev 和渲染器 chrome 重用这些资源在开发、渲染器和打包通道中保持一种视觉标识,同时防止派生脚本恢复过时的生成标记
D080后台监管子出口立即拒绝正在进行的 RPC;退避重新启动(0.5s→4s,每2分钟最多3次); hostStatus 事件导致渲染器性能下降 UI崩溃恢复,无挂起;失败是可见的,而不是沉默的
D081Renderer 沙箱sandbox: true 与完全捆绑的 CJS preload;生产 CSP 删除 unsafe-eval 和 localhost connect-srcElectron 安全基线;由 test:e2e:boot 验证
D082日志通道(部分被 D182 取代) app/host/agent NDJSON 文件,通过主进程记录器进行 5MB 循环(保持 2 循环);审核通道停留在 host-core SQLite可诊断故障,无无限增长;审计需要可查询性
D083窗口状态保持 window-state.json 的最后良好边界(恢复最小 960×640); Stage Manager 架子恢复保留了 Codex 的足迹;捕获运行强制确定性边界用户保留他们的窗口;货架恢复和像素捕获保持确定性
D084跨平台shell策略(被 D190 取代) Bash 工具在每个平台上运行 bash,每个进程解析一次:PI_DESKTOP_BASH 覆盖 → Unix 众所周知的路径 + PATH → Windows Windows bash.exe 源自 Windows 的 Git(git 在 PATH 上,标准安装目录,然后 PATH 减去 WSL System32 启动器); Unix 使用 bash -lc、Windows bash -c + CREATE_NO_WINDOW;安装程序中没有捆绑 bash;缺少外壳表面稳定 SHELL_NOT_FOUND 并附有安装指南被 D190 中的可选 shell 目录和稳定执行标识取代
D085Toast系统v2单个全局 Toast 堆栈(ToastHost + 存储队列)将字符串 setToast: showToast(message, {variant, duration}) 替换为 info/success/warning/error 变体(中性升高板上的语义标记着色的 Lucide 图标)、自动消除 4 秒/错误 8 秒/系统拥有的 0 粘性(无呼叫者计时器)、悬停暂停、最多 4 个重复数据删除、 enter/exit 运动 + 简化运动安全移除,aria-live + 角色 status/alert; 08-组件规范 §17 中的使用规则旧的 toast 是一个裸露的固定 div:没有变体或堆叠,并且大多数调用站点从未清除它,因此消息永远存在;呼叫者手动超时
D086存储架构 v2根据 03-runtime/04 重建单个 pi.sqlite(host-core 独有):kv 命名空间替换 SQLite/NDJSON 并托管插件设置; projects 替换工作区单例;转录本成为规范块数组(messages.content_json + 提取的 text、ms 整数时间、O(1) 每个会话 seq、稳定的 mid rowid),其中 turns 携带状态机状态 + 使用情况汇总和 FTS5 trigram 搜索;新的 models 目录、artifactsscheduled_tasks+task_runs(移出 Electron 的 JSON,修复了 D002 违规);索引可修剪 audit_logPRAGMA user_version 迁移与预迁移 .bak;已删除的 showToast(message, {variant, duration})/aria-live 表已删除(registry.json 保持权威)v1 模式是一个有损的 UI 投影(无 turns/usage/blocks/attachments),按 MAX+1 扫描排序,具有零二级索引、两个死表、RFC3339 文本时间以及绕过主机所有权的计划任务;规范的功能(工件视图、成本芯片、运行历史记录、项目分组、全局搜索、目录刷新)没有存储空间
D087沉浸式输入框上下文轨道(被 D095 取代) 项目/本地/分支仍然是一根导轨,但该导轨现在直接连接到输入框外壳,共享其主题表面和底部标高,并删除可见的 8px 间隙和独立的胶囊阴影;取代 D067 的间隙部分分离的胶囊和不同颜色的板使得上下文和提示输入被解读为不相关的控件,而不是 Codex 风格的沉浸式输入框
D089输入框草稿高度提示文本区域默认显示一行可见行,从包装内容自动增长到七行可见行,内部滚动超出第七行,并在内容被删除时收缩; home shell 是内容驱动的,而不是保持 D061 的固定最小 140px保留转录空间和类似 Codex 的密度,同时保持多行编辑可用
D088范围内的主页侧边栏会话(仅针对一个当前项目和无行操作限制由 D093 取代) 将“最近”聚合替换为一个当前项目会话组加上持久无路径临时会话;将其他项目保留在项目索引中;删除最近的 pin/panel 行操作;范围空草稿重用和项目上下文显式 + 创建D093 保留精确路径分组、范围草稿重用和临时边界,同时允许多个保留的项目组和范围组织操作

F. 基线 0.4.2 产品决策

身份证号主题决定基本原理
D090紧凑的设置目录(由 D133 取代的四个目的地计数和顺序) 设置保留了 D063 全页 shell 和 D070 视觉指标,但其栏完全按该顺序包含基础知识、Agent、导入和信息。外观转向基础;提供商进入 Agent。插件管理保留在应用程序外壳的现有插件目标中,其中有可用的 load/enable/disable/uninstall,并且不会在“设置”中重复。这取代了 D062–D065 中更广泛的分组导航和独立 Appearance/Providers/Plugins 展示位置,以及 D070 的特定于客户的轨道指标。删除空的、低价值的和重复的目标,同时保持每个已交付的工作流程均可访问,并使本地优先设置表面更易于扫描
D091Composer 运行时配置Mode 和 provider/model 控件更新活动会话并通过 pi 提示符路径从该会话中读取;没有端到端运行时实现的控件不会被渲染。防止装饰性 effort/attachment 控件并保持每个可见的输入框动作可运行
D092响应式设置内容设置内容填充固定 275px 导轨和窗格装订线后的可用宽度,通过本机窗口的 CSS 弹性布局调整大小。这仅取代 D070 的固定 720 像素内容带以及 D090 中相应的视觉指标保留。高效使用宽桌面窗口,无需添加渲染器调整大小状态或更改紧凑设置目录
D104设置轨道菜单重命名(Agent 标签由 D110 取代;目录顺序由 D133 取代) 设置轨道目标标签为 Basics / Agent / Import / Info(zh-CN:基础 / 智能体 / 导入 / 信息)。目的地 ID 保持为常规/代理/导入/关于;只有面向用户的标签会发生变化。这将重命名 D090 紧凑目录标签,而不更改顺序、内容或深层链接目标。更短、面向操作的标签扫描速度更快,同时保留紧凑的目录

G. 基线 0.4.3 侧边栏和项目决策

身份证号主题决定基本原理
D093侧边栏组织、保留的项目选项卡和会话工作区隔离渲染器保留标准化的开放项目路径和本地 project/session 演示元数据,用于固定、存档、折叠、排序和可选的兼容性顺序。侧边栏为每个保留路径和临时会话呈现一个独立的可折叠组。面向用户的排序模式有最近的、创建的、最旧的和名称; manual 保留持久的兼容性值,无需新的重新排序手势。激活组会重用 project.set,因此 shell 仍具有一个选定的主机工作区。工具执行从持久会话项目中解析其根,并且当另一个选项卡变为活动状态时,每个会话 turns/grants 保持独立。存档和关闭是非破坏性的。保留多存储库工作集并使长对话列表易于管理,而无需创建多个主机工作区单例或允许活动选项卡开关重定向后台会话的工具
D094Renderer 产品品牌(停靠的 Composer 徽标由 D160 取代) 所有用户可见的 shell 标识都使用 PI-Desktop:侧边栏 shell 名称、composer 占位符和设置副本。 BrandLogo 通过 Vite 导入规范的 build/icon_1024.png,用于首页英雄、expanded/collapsed 侧边栏和停靠的输入框;新会话控件使用专用的消息加号图标。 Codex 仅保留在标识外部导入源或设计参考的位置。从产品表面删除意外的第三方品牌和矢量近似,同时保留导入兼容性和 Codex 派生的布局系统
D135独特的侧边栏任务状态指示器对话行保留一个紧凑的前导状态槽,具有语义、形状不同的状态:中性重音轮廓环表示选定,警告橙色呼吸点表示正在进行,成功绿色检查表示已完成,错误红色圆圈警报表示失败。优先级是进行中、选择,然后是最新的最终结果。开始新的回合会清除之前的结果;中止不会产生失败。每个状态都有本地化的可访问文本,并且减少的运动使正在进行的点静态。先前的运行点重复使用了重音标记,并在空闲时消失,使得选定的、活动的工作、完成和失败难以通过超过行背景来扫描或区分

H. 基线 0.4.4 输入框决定

身份证号主题决定基本原理
D095删除输入框工作区上下文栏主目录和线程对接的输入框变体永远不会渲染被动项目/本地/分支轨道或为其保留 layout/elevation。项目选择、会话绑定、分支元数据和工作区范围的工具仍然可以通过非编写器界面使用。这取代了 D052、D055、D056、D066、D067 和 D087 的上下文轨道部分。轨道重复导航,显示两个被动值,并且可以在消耗提示空间的同时显示误导性的后备分支元数据

一、基线0.4.5思维模式决策

身份证号主题决定基本原理
D096端到端的思维模式**思维水平是会话范围的,规范值“off”最小的
D102自定义提供商思维预设设置显示“关闭”/“仅限开关”/“分级”(以及高级自定义列表)。开关仅持续 supportedThinkingLevels: ["off","high"]; Graded 清除稀疏覆盖并使用保守的默认集; Composer 仅渲染已解析的集合,并且从不为类似布尔的模型(例如 mimo)发明分级选项。与 OpenAI 兼容的自定义端点通常会暴露布尔思维,而不是完整的努力阶梯

K. 工作小组的决定

身份证号主题决定基本原理
D097停靠的工作面板取代了上下文面板右侧托管一个停靠的、可拖动调整大小(320 分钟(720px,60vw))的工作面板,其中包含“审阅”/“终端”/“浏览器”/“文件”选项卡,可通过标题栏按钮或 Cmd/Ctrl+J 进行切换; {open, tab, width} 保留在 localStorage 中。以前的 ContextPanel 覆盖层及其 context.* 副本被删除; workspace/model/status 存在于输入框芯片和设置中。用于检查药剂输出的 Codex 同等工作表面;仅提供信息,覆盖其他地方可用的重复数据
D098Review 选项卡读取 git 工作树 (由 D180 取代)历史性决定:通过 git CLI 审核呈现工作区的未提交状态。被取代,因为提交删除了消息级证据并且无法支持安全的每消息回滚
D099终端选项卡是一个真正的 PTY终端通过 Electron 主进程中的 node-pty 在活动工作区中运行交互式登录 shell,并在渲染器中使用 xterm.js;会话按工作区进行键控,通过主侧重播环保留选项卡开关和面板关闭,并随应用程序一起消失。Codex 奇偶校验需要可用的终端,而不是命令重放; PTY 所有权保留在 main 中,因此沙盒渲染器永远不会触及进程
D100浏览器选项卡嵌入 WebContentsView预览浏览器是一个主进程 WebContentsView,具有渲染器驱动的边界同步、强化(拒绝弹出窗口→外部、拒绝权限请求、仅限 http(s) 导航、隔离持久分区);当阻止覆盖(调色板、权限对话框、设置)打开时它会隐藏。用户驾驶它;代理没有。推荐现代嵌入,无需 webview-tag 警告;隐藏规则通过渲染器覆盖解析其合成器 z 顺序
D138会话范围的内联权限请求工具批准是其原始 sessionId 拥有的内联 PermissionCard,而不是全局对话框。不同的会话保留独立的待处理请求和绝对的超时期限;后台 message/tool/permission 事件仅更新范围内的状态,并且从不激活、覆盖或聚焦其他对话。解析和清理与会话和请求身份相匹配。这仅取代 D100 的权限对话框 overlay/hide 子句;调色板、搜索、设置和其他阻塞表面保留其现有的浏览器隐藏行为。并发代理不得窃取活动工作流程或覆盖彼此的批准请求;现有协议已携带所需的 session/request 身份。
D139导航意图和快捷方式事件防护每个显式会话、项目、页面、分支或历史导航都开始或重用一个渲染器导航意图;异步工作仅在该意图保持当前状态时提交可见状态。全局快捷键忽略仅修饰符和 IME 组合事件,而历史导航也忽略按键重复事件。延迟的 session/project 加载和不完整的键盘事件不得导致无法解释的页面或历史跳转。
D128工件驱动的工作面板选项卡(由 D207 取代的快捷方式子句)工作面板没有空的手动入口点、欢迎选择器、titlebar/menu 命令或 Cmd/Ctrl+J 快捷方式。 file/URL/BrowserPreview/successful-command 工件创建并激活可关闭的顶部选项卡;成功的活动会话工作区 Write/Edit 工件创建并激活单例“审阅”选项卡。文件选项卡由词法规范化路径键入,单例工具选项卡重复数据删除,关闭活动选项卡选择其右侧邻居然后选择左侧,关闭最后一个选项卡隐藏面板,唯一的面板级控件将其折叠,而不删除保留的运行时选项卡。更改可见会话或工作区会关闭并清除选项卡,因此相关资源永远不会跨越上下文边界。启动关闭,没有任何选项卡;只有面板宽度仍然存在,而临时操作系统窗口扩展被排除在启动范围之外。后台会话、失败和临时写入不会抢走焦点。这取代了 D097 的固定选项卡入口点和 {open, tab} 持久性,改进了 D098 的自动刷新,并且仅取代了 D112 的welcome-chooser 子句。匹配 Codex 的输出驱动工作界面,避免空工具启动器,并使每个可见选项卡对应于会话实际生成或显式预览的工作。 D128 纠正最初重复的 D119 标识符; D119 仍然是记录文件存储决策。
D140会话拥有的脏工作区成绩单审核条目*(由 D179 取代)*会话成功生成工作区 Write/Edit 后,其记录以折叠活动组之外的一个明确的“审阅更改”命令结束,而 Git 工作树仍然是脏的;同一项目中的其他会话不会继承该命令。它报告上限文件计数和 addition/deletion 总数,并创建、重新打开或激活 D128 的单个“审阅”选项卡。条目和审阅共享一个工作区键控差异,在工作区激活、成功 Write/Edit/Bash 完成(500 毫秒去抖)、显式审阅刷新和窗口焦点时刷新;排序的请求会丢弃先前的工作空间响应。干净和非 Git 结果明确了该工作区的审查所有权; clean、non-Git、missing-workspace 和 failed-refresh 状态会隐藏该条目。审查所有权是在使用 D142 工作面板上下文重新启动时丢弃的渲染器内存状态。这是上下文 artifact/status 条目,而不是 D128 禁止的空手动启动器。自动面板打开在折叠或选项卡关闭后不会留下可发现的返回路径,而会话所有权可防止不相关的对话声明项目范围的编辑。共享真实的差异可以使对话条目准确并保持评论的重复数据。
D179消息范围内联审核卡*(由 D180 取代)*历史决策:每个成功的工作区 Write/Edit 行通过匹配当前工作区差异来呈现一张卡片。已被取代,因为当前的 Git 状态在提交后消失并且无法提供消息拥有的回滚
D180消息拥有的审查快照和受保护的回滚成功的工作区 Write/Edit 结果携带有界 details.review 证据:快照 id、message/tool id、路径、操作、added/modified/deleted 状态、+/- 计数、块和回滚状态。主机在会话下的工作区之外存储工具前字节和 before/after 哈希值,渲染器仅从转录消息中导出相邻卡片和按时间顺序排列的查看历史记录。 review.rollback 在恢复之前的字节或删除新创建的文件之前验证当前的后工具哈希;冲突永远不会覆盖以后的编辑。会话删除和启动清理删除快照;分叉证据是可见的,但不可逆。消息拥有的快照在 Git 提交后仍然存在,分离相同路径的编辑,并在不信任可变存储库状态的情况下显式回滚
D142会话范围的工作面板运行时上下文(D207 修订的无启动器条款)每个对话都拥有一个内存中的工作面板上下文,其中包含打开状态、有序选项卡、活动选项卡和浏览器资源。会话选择自动投影该上下文,切换不会删除它,切换回来会恢复它。 File/URL/BrowserPreview/command/Review 工件是根据其原始 sessionId 记录的;因此,BrowserPreview 渲染器事件携带 sessionId。背景工件可能会更新其保留的上下文,但永远不会打开、激活、调整大小、导航或聚焦可见面板。没有活动对话的工作区选择会隐藏面板,并且相关资源仍然绑定到其 session/workspace。重新启动会丢弃所有上下文和浏览器资源;只有面板宽度仍然存在。这仅取代了 D128 在可见会话或工作区更改时关闭和清除选项卡的要求; D128 的工件触发器、重复数据删除和 close/collapse 行为保持不变,而 D207 添加了一个仅显示保留上下文的活动会话快捷方式。没有流程所有权边界变化。权限控制工具可以在另一个对话正在加载或可见时完成。全局破坏性选项卡集要么在被清除之前闪烁打开,要么丢失原始对话的工具;会话键控渲染器状态可保持连续性,而不会允许后台工作窃取焦点或使瞬态资源持久。
D154工作面板活动导轨和资源切换器一旦工件打开工作面板,44px 活动栏就会将“审阅”、“终端”和“浏览器”显示为一键式 32px 工具按钮;打开丢失的工具仍使用 D128 的 openWorkPanelTab 路径。 46px 内容标题显示并关闭活动资源,并为每个打开的 tool/file 资源公开一个有界的键盘可操作切换器。面板最小值变为 364 像素,因此导轨保留了之前的 320 像素内容地板(宽度夹被 D167 取代)*。这取代了水平滚动的顶部选项卡和隐藏的空标题上下文菜单,同时保留了 D128 的工件驱动面板条目、资源 deduplication/order、近邻行为和会话范围的运行时所有权。*高频工具应该是可见的并且空间稳定,而长或大量的文件名需要一个带标签的溢出表面,而不是将每个操作压缩到一个标题栏行中。
D157每个用户轮一次视觉助理轮由 thinking/tool 活动分隔的提供商级助理消息仍然是不同的规范转录记录,但 ChatTranscript 将一条用户消息之后和下一条消息之前的所有记录组成一个 role=article 助理轮次。有序的降价片段和活动披露仍然可见;只有组合回合拥有尾随聚合 model/usage 行和 Copy/Fork/Retry 工具栏。复制用段落分隔符连接所有内容丰富的片段; Fork 和 Retry 使用最后一个内容丰富的辅助记录作为其持久边界。具有工具功能的提供商会关闭并重新打开每次工具调用时的辅助消息。将这些传输边界渲染为单独的响应会重复操作工具栏,并使一个代理运行看起来像许多 AI 回复。
D162最新胜出的缓存会话切换渲染器立即标记最新选定的行,合并会话详细信息 prefetch/load 工作,保留 LRU 样式的五转录本内存缓存,并开始最新的转录本读取,而无需等待被取代的读取。工作区对齐可能与转录本 IO 重叠;导航世代门控原子可见提交。 ChatSurface 保持先前的完整视图为非交互式,而 React 推迟更改的会话树,然后在其最终记录处绘制目的地。缓存的快照始终会重新验证。以前的全局选择承诺队列使每次点击都在过时的完整转录 JSONL 读取后面等待,而一次同步长 Markdown 提交会延迟可见反馈。最新获胜的 IO 加上稳定的延迟帧与 Codex 风格的导航相匹配,而不会削弱 session/workspace 隔离。
D156独立的本机窗口和工作面板调整所有权大小(responsive-clamp 和 no-native-reservation 子句被 D163 取代) Electron Main 独家拥有最小 1040x700 的 BrowserWindow 边界,而渲染器拥有持久的首选工作面板宽度。分隔线使用锚定、帧合并预览和发布时提交;转义、指针取消和丢失捕获回滚。本机窗口边缘大小调整永远不会重写面板首选项。这取代了 D083 的恢复最小值并删除了 window/resizeBy 增量通道和调整大小属性启发式。循环所有权使分隔符释放第二次调整操作系统窗口大小,引入异步竞争和平台差异,将窗口移动到显示边缘附近,并在不相关的本机调整大小期间重写面板首选项。
D163固定工作面板的原始宽度预留(由 D167 取代的宽度范围) **开放式对接面板在 364..720 中保留一个承诺的固定宽度;本机 window/sidebar 更改永远不会限制它。 Renderer 通过幂等`window/setWorkPanelReservation({width: 0364..720}) -> {请求,保留}: open requests the committed width, collapse/final close requests zero, and divider commit updates it. In normal state Main adds available native work-area width and reverses it symmetrically, so chat stays stable when the full target fits; otherwise the panel remains fixed and chat absorbs 请求 - 保留`。本机边缘仅调整聊天大小。 Maximized/fullscreen 请求推迟到正常; display/work-area 更改可根据当前可用宽度协调目标,而无需在普通的同一显示移动期间重新应用它。持久基址边界不包括预留宽度及其 x 偏移,并且背景伪影无法更改可见预留。这取代了 ADR 0029/D156 子句,这些子句将面板固定在当前客户端宽度内或禁止面板驱动的目标几何图形,同时保留主边界所有权和分隔符手势规则 (ADR 0032)。**
D167更窄的默认工作面板宽度停靠的工作面板以 280px 承诺默认值打开(比 D163 的 420px 窄三分之一)并固定到 244..720px;渲染器常量、Electron 预留验证器和 .work-panel CSS 底层共享这些边界。双击分隔线可恢复 280 像素。由于工具位于标题切换器中,D154 的 364px 底面背后的 44px-rail-plus-320px-content 基本原理不再适用,因此底面按默认比例缩放。持续更宽的宽度仍然有效,并且在升级时保持不变;最大 720 像素、分隔符手势规则和惰性保留行为 (ADR 0033) 保持不变。该面板的打开范围比大多数 review/terminal/file 内容需求更宽,从固定客户区域内的聊天中获取可读宽度,而旧的 364px 地板使得较窄的默认值无法到达。
D164双区域设置应用内产品变更日志应用程序更新的产品“新增功能”文本作为 packages/shared (CHANGELOG) 中的双 EN/zh-CN 目录进行维护。 Electron 使用产品 UI 区域设置对发现的 availableVersion 进行主要格式注释,并将其作为可选 UpdateState.releaseNotes 纯文本附加到现有更新 IPC/event 路径上。当注释存在时,环境横幅和“设置”→“信息更新”行会显示一个紧凑的“新增功能”部分。英语是真理的源泉; zh-CN 镜像版本和突出显示计数。 GitHub 自动生成的发布主体仍然仅限于网络,而不是应用程序内源。未引入新的提要 URL、注释通道或渲染器拥有的远程获取(扩展 D120 / ADR 0022)。用户在更新时需要双语发布亮点,而无需第二个网络表面或削弱 Main 对更新交付的唯一所有权。

L. 成绩单呈现决策

身份证号主题决定基本原理
D101受 WorkBuddy 启发的转录本密度用户将渲染为紧凑的右对齐软板(min(78%, 560px),微妙的边框+细线阴影)。助手将保持透明全角散文(最大 720 像素)。消息行垂直内边距收紧至 10 像素。 Hover/focus-within 在每圈下显示安静的复制芯片(用户右对齐,助理左对齐)。流媒体助理的答案使用左重音规则。还没有吉祥物、反应或成本芯片 UI。与 WorkBuddy 的任务聊天相比,当前的右对齐用户气泡规格不足且视觉上稀疏;更密集的板提高了可扫描性,同时又不放弃 Codex/developer 约束
D103每条消息模型+令牌元和重试完成的助手在答案下转动表面 modelId + 令牌使用芯片(仅限令牌;悬停细分为 input/output/cache/reasoning)。用法附加在来自 pi-ai 用法的运行时 message_end 上,保留在消息 meta_json 中,并随记录一起重新加载。操作行添加了重试,这会重新发送最近的前面的用户提示。没有货币定价,也没有 like/dislike。WorkBuddy 每条消息元数据改进了 trust/scanability;代币总数已从提供商流出,而定价成本仍需要目录
D105辅助回合的就地再生重新生成将会话记录截断为最近的前面的用户提示(不包括该提示及其后的所有内容),处置会话的实时 pi-agent,并重新发送提示,以便新的 assistant/tool 尾部替换丢弃的分支,而不是堆叠重复的回合。用户期望regenerate重写当前回合;仅附加重试污染了长会话并在重做之上留下了陈旧的答案
D106在转录中保留用户硬换行符用户气泡将纯文本与硬换行符完好无损地呈现。 Composer 仅修剪 leading/trailing 空白;转录本使用 message-user-textwhite-space: pre-wrap(无强制中间字形断字),因此多行提示永远不会折叠成一个段落。复制和会话重新加载保留原始换行符。多行提示(代码片段、列表、粘贴块)在编码代理中很常见;折叠换行符使得文本难以重新阅读和重新编辑
D107配置提供商工作室**设置 → Agent 使用提供商工作室:摘要英雄、分段默认值、可折叠的 OpenAI 兼容编辑器以及带有秘密徽章、思维预设、测试连接和 make-default/delete 操作的基于卡片的提供商管理。这改进了紧凑设置目录中的提供商演示,而无需添加铁路目的地。 **密集堆叠的表单和狭窄的列表行使得多提供商设置难以扫描并且过度强调次要字段
D110模型配置标签+添加提供商对话框代理目标的设置导轨标签是模型配置(zh-CN:模型配置)。添加提供程序会打开模式对话框,而不是内联可折叠编辑器;目标 ID 仍为 agent阐明该选项卡的模型设置目的并减少编辑提供商凭据时的页面流失
D108仅在溢出时对话小地图仅当存在至少两条可见的 user/assistant 消息且副本溢出一个视口 (scrollHeight > clientHeight) 时,才会呈现左侧边缘对话小地图轨道。短的一页螺纹隐藏了导轨;流增长、内容大小调整和窗口大小调整重新评估可见性。当每条消息都已经适合屏幕时,导航栏就是噪音。溢出是 jump/preview 导航有用的信号
D109ChatGPT 风格重新生成修订历史记录message_revisions(架构 v4)中的稳定 revisionRootId 系列下重新生成已丢弃的 assistant/tool 尾部的存档。实时 root 用户轮流携带 revisionCount / activeRevision 和安静的 current / total 寻呼机在适当位置切换线性变体。首先重新生成将原始分支存储为修订版 1;稍后重新生成追加新分支并标记最新的活动分支。没有自由形状的分支树。用户希望重新生成能够像 ChatGPT 一样保持先前的答案可达; D105 就地重写单独删除了对比较仍然有用的历史记录
D111空的主页滚动堆栈(由 D131 取代的特定于卡片的条款) 空聊天主页是 home-main-content 内的单个可滚动垂直堆栈。短窗口顶部对齐和滚动;内容保留在文档流中,并且家庭输入框保持非停靠状态。双增长+绝对门户让家庭输入框在较短的窗户上重叠引导;流布局保留每个剩余的块而不会发生冲突
D112工作面板旁边的可读聊天(动态宽度夹被 D163 取代;欢迎选择器被 D128 取代) MainChat 在面板旁边有一个 360 像素的可读目标。只要显示工作区域可以提供完整的承诺面板宽度,D163 就会通过本机宽度保留来保留它;否则,MainChat 会吸收不可避免的不足,同时面板保持固定。仅面板宽度上限可能会在支持的窗口尺寸下为聊天留下大约 109-205 像素;本机保留现在可以保留聊天而不压缩工具表面。
D113受 WorkBuddy 启发的本地个人资料页脚展开的侧边栏以透明的 58 像素页脚结束。其 44 像素配置文件触发器包含 30 像素圆形本地用户字形、两行 Custom + Local profile / 本地配置 标识和 V 形;单独的 32px 帮助快捷方式可打开“设置”→“信息”。 280 像素的配置文件菜单在页脚上方 8 像素处打开,带有重复的身份标题、分隔线和设置/日志/主题操作,保留退出、外部单击、箭头键和焦点恢复行为。这取代了 D041;不暗示云帐户、通知、共享或更新功能。将 WorkBuddy 的头像和操作页脚语法调整为 PI-Desktop 真实的仅限本地功能,同时改进身份层次结构并消除陈旧的云替代
D137仅字形消息工具栏; edit 表示编辑提示消息工具栏仅包含图标:标签位于 CSS hover/focus 工具提示 (data-tip) 和 aria-label 中,从不作为可见的芯片标题(文字按钮仅保留在错误表面上)。编辑将助理答案移至用户回合:它在内联文本区域中打开提示(斜杠将键入键入的 command 表单的种子,以便重新发送重新扩展模板),并在同一会话中使用新文本保存重播 D105/D109 重新生成路径 — 替换的提示及其整个答案尾部被存档为修订版本,因此现有的 current / total 寻呼机会返回到原创。编辑助手自己的文本及其 fork-into-a-child-session 变体 (D134) 被删除;分叉仍作为显式分歧操作。每个答案下面有四个字片,读起来就像一个句子,挤满了文字记录;有用的更正几乎总是“我问错了”,用户希望在历史记录完好无损的情况下重新运行(ChatGPT 语义),而不是在新会话中手动编辑模型的单词
D165助理答案中的安全懒人美人鱼图助理答案散文中的完整 mermaid 栅栏在进入近视口带后呈现为主题感知的 SVG。部分溪流围栏和所有思考散文都保留源代码。渲染器动态加载官方 Mermaid,序列化其全局主题渲染,将源字符上限限制为 20,000 个字符,将边缘限制为 500 个字符,锁定 strict/no-HTML/no-link 配置,并应用第二个 SVG 配置文件清理程序。无效或过大的图表会退回到可见的可复制源;图表工具栏切换源并复制它。图表改进了架构和流程解释,但解析部分流或每个屏幕外的历史栅栏会破坏直接流和快速会话切换行为。严格有界本地渲染增加了无需新协议、网络或 Electron 特权边界的功能。

M.Agent 运行时决策

身份证号主题决定基本原理
D114代理临时文件的每个会话暂存目录每个会话将 <data_dir>/scratch/<sessionId>/ 作为 strict/no-HTML/no-link/Electron/<data_dir>/scratch/<sessionId>/ 的第二个包含根(仅限绝对路径;相对路径保持工作区限制)。该路径在系统提示符中公布,并在 Bash 中公布为 PI_SCRATCH_DIR。 Scratch 在没有权限卡的情况下写入自动允许,并从工件表中排除。 Scratch 是惰性创建的,随会话一起删除,并在启动时清除(孤儿,>7 天陈旧)。 Glob/Grep/BrowserPreview 仍仅限工作区。 Plan 不公开 Write/Edit; Plan Bash 在其解析权限模式下仍然可以改变暂存。Temp/intermediate 文件(一次性脚本、下载的数据、草稿)污染了用户的项目和 git 状态;主机拥有的根具有相同的词法+符号链接防御,可以保持沙箱模型完整,同时为模型提供合法的临时工作空间
D115权限模式:全局默认+每会话覆盖(Composer 演示文稿被 D132 取代;检查点 Plan 子句被 D189 取代) 权限模式管理高风险工具审批:ask(确认所有内容,默认)、accept-edits(自动允许 Write/Edit、确认 Bash/plugins)、auto (自动允许全部)。全局默认值位于设置 defaultPermissionMode 中;每个会话都存储 permission_mode(架构 v5,默认 inherit),在不继承时会覆盖它。解决方案:会话覆盖→全局默认→询问,仅在 host-core tools.execute 中强制执行。 Plan 保留选择器;它的 Write/Edit/plugin 硬拒绝排名高于每种模式,而 Bash 则遵循所选模式。确认每个 Write/Edit 都会使长代理运行高摩擦,但单个全局切换太粗糙 - 受信任的临时会话和有风险的回购会话需要不同的姿势;保持主机端强制执行可保护安全边界
D132Composer权限菜单仅显示有效模式代理模式 Composer 芯片和菜单仅公开 askaccept-editsauto,直接选择有效模式,没有 global-default/inherit 条目或出处标签。选择一个项目会存储显式会话覆盖。在用户选择模式之前,D115 中现有的 inherit 持久性和分辨率保持不变。这仅取代 D115 的输入框演示条款。继承的条目重复了可选择的模式并暴露了存储来源,而不是用户选择的权限状态;三种有效模式的呈现,在不改变主机执行的情况下,让控制变得直接
D116提供商失败作为辅助消息每个 provider/model 转向失败都会通过可选的 UiMessage.error 附加到持久的 role=assistantstatus=error 转录消息。该消息显示本地化的摘要和稳定的代码,将经过编辑的提供程序详细信息保留在可访问的披露后面,并提供适合上下文的重试或设置操作。消息绑定失败从不使用 toast/global 横幅呈现,也从不重新进入以后的模型上下文。错误属于失败的回合;将它们保留在转录本中使得响应在会话 switches/restarts 之后可诊断,而不会污染下一个模型请求或暴露凭据
D127上下文保留重新播种+传输重试除了 user/assistant 文本和思考之外,从持久记录中重新播种重新创建的 pi 运行时还会恢复工具 call/result 对(来自工具行的 role=assistant/status=error/UiMessage.error)。中断的工具行恢复为错误结果;孤立的工具行获得一个合成的仅呼叫辅助载体,因此对保持相邻且格式良好。失败的助理将仅保留成绩单。另外,请求设置使用一次有界 pi-ai 重试来处理暂时的 transport/provider 失败;响应后流恢复由 D186 定义。在任何运行时重新创建(regenerate/edit、配置更改、重新启动)后,纯文本重新播种会崩溃会话的上下文:模型丢失了它收集的所有工具结果,并且在没有可见工具使用的情况下看到自己的历史答案,停止调用工具,将代理会话降级为裸聊天。事件触发器是一个未重试的提供程序超时,迫使用户重新生成。 D127 更正最初重复的 D120 标识符; D120 仍然是由基线 0.4.6 冻结的早期应用程序更新决策。
D136pi-ai 拥有已知模型元数据对于从固定 pi-ai 目录解析的每个模型,Electron main 将完整的 pi 模型快照传递到 sidecar,而 PI-Desktop 仅替换连接标识。提供商设置和模型菜单不会覆盖推理支持、思维水平、context/output 限制、温度或兼容性。通过明确的通用纯文本、非推理回退,未知的自由格式 ID 仍然可用。这取代了 D102 和 D096/D107 的提供商覆盖条款。第二个桌面拥有的模型矩阵丢弃了 pi 元数据,偏离了适配器行为,并使模型语义依赖于冲突的配置;针对已知模型的修复现在属于 pi-ai 或 pi-ai 升级。
D183分段工具和模型延迟日志 (UI 子句被 D184 取代)每个 tools.execute 调用都按分段计时,而不是一个不透明的持续时间:host-core 在 host 通道上发出 tool timing 行,并在现有通道旁边保留 promptedpermissionWaitMsoverheadMstotalMs durationMstool_execute / tool_denied 审核行上; sidecar 将 grepable [timing] kind=tool … (hostRttMs) 和 [timing] kind=model … (providerWaitMsstreamMs,包括 failed/aborted 匝) 线写入 agent 通道,可通过 PI_DESKTOP_TIMING=0 进行抑制。原来的 no-UI 条款被 D184 取代;日志记录保持不变。从日志中无法诊断出“执行命令很慢”:批准等待、工具主体和提供程序往返无法区分,因此两个持续时间为 0 毫秒的审核行之间的 45 秒间隙无法说明是用户、模型还是主机。拆分阶段可以使答案可读,而无需重现运行。
D158回合边界上下文检查点压缩*(软边界、模型工具和可见性条款被 D200 取代;模型工具和可见性由 D203 以 Codex 的形式恢复)*PI-Desktop 重用 pi-agent-core 的上下文估计、会话上下文和压缩原语,但拥有编排和持久性。在每个 turn_end 之后,在任何下一个提供程序请求之前,运行时都会评估模型感知的 soft/hard 预算。瞬态重复数据删除指令可以要求模型调用内部CompactContext工具;该工具的正常活动行是 visible/durable,而指令则不是。跨越硬预算会强制生成检查点并阻止失败的请求。达到硬预算一半的最终原子工具批次仅在检查点副本中相当 head/tail-truncated,具有显式标记并保留每个 call/result 信封;原始成绩单行保持完整。精确提供程序溢出会从模型上下文中删除失败的助手,创建一个检查点,然后重试一次。主机协议 v6 在未触及的可见 JSONL 转录本旁边附加检查点记录;重新启动、后期截断和包含边界分叉保留最新的有效检查点。禁用自动压缩会删除该工具和所有自动 threshold/overflow 恢复,而 /compact 仍然可用。 OpenCode DCP 仅是 AGPL-3.0 行为参考,既不链接也不复制 (ADR 0030)。pi 的仅运行结束行为无法保护长工具循环,并且仅靠模型提醒无法保证提供程序的安全。重用 pi 的经过测试的压缩格式,同时添加确定性 turn_end 门,可以防止另一个提供商请求跨越已知窗口,保留用户可见的历史记录,并避免导入不兼容的 plugin/runtime 和许可证边界。
D185惰性每转刀具激活 (始终有效的 CompactContext 子句在 D200 下无效,在 D203 下再次适用于 new_contextsidecar 保留完整的本地工具注册表,但在每个新提示上仅发送模式核心集和本地 ToolSearchBrowserPreview、插件工具、Skill 和插件开发助手显示为有界紧凑目录条目,并通过精确名称或功能搜索激活;下一轮接收其架构,在支持时使用本机 pi-ai 延迟搜索,并且该集合在下一个用户提示之前重置。主机权限、遏制、超时和审核保持不变。完整的工具模式使得简单的第一个请求变得不成比例地大,并且跨轮重复的可选功能成本。 pi 风格的活动集保留了核心编码人体工程学,同时使辅助工具按需付费且独立于提供商。
D200难以察觉的后台上下文压缩*(后台预计算、增量触发、静默和由 D203 取代的无模型工具子句)*压缩成为主机拥有的后台活动,没有用户可见的表面。 contextBudget() 保留 D158 硬限制和请求余量,从模型窗口(clamp(hardLimit * 0.2, 8k, 64k),仍然上限为硬预算的一半)而不是设置导出保留尾部目标,并添加 backgroundLimit = floor(hardLimit * 0.7) 作为预计算触发器;软边界被删除。检查点生成与安装分开:buildCheckpoint 生成一个而不保留或激活它,安装重新估计,通过 host-core 附加,并发出 compaction_end。预计算仅在提供程序空闲窗口中运行 - 当工具执行时和运行结束后 - 并且仅当上下文超过后台限制并且**自最新检查点的基线以来至少增长了保留尾部目标,因此大尾部不能每次都触发摘要。仅当其底座仍处于活动状态、其 throughMessageId 锚点仍然存在且仍符合当前模型的预算时,预先计算的检查点才会安装在下一回合边界或提示处;任何未命中都会进入未更改的阻塞路径,并且失败的后台构建将被丢弃,没有事件,没有持久性,也没有 ADR 0049 回退。 CompactContext 工具、<context_management> 微移和主机无确认白名单条目均已删除,因此触发完全是确定性的。 compaction_start/compaction_end 获得可选的 phase (backgroundblocking,缺席意味着 blocking),并且 compaction_end 获得可选的 status { generation, summaryTokens };两者都是协议 v9 中的附加内容。成功的自动压缩不会产生任何提示,不会发生运行状态更改,也不会产生转录行;只有 retained_tail 回退、溢出重试和手动 /compact 仍会通知。上下文使用检查器是单个可见跟踪,读取 status 和持久的 SessionDetail.compaction,生成计数器包含在检查点的不透明 details 内,因此不需要更改记录模式。设置不公开任何压缩控件,并且持久的 contextCompaction 值将被忽略 (ADR 0061)。**
D201Task 工具背后的有界子代理Agent 模式获得一个委派工具 Task(agent, task, description?),仅当会话具有非空子代理目录时才构建。定义是 Markdown 文档 - agent-runtime 中内嵌的三个内置函数(explorercode-reviewertest-runner)加上 <workspace>/.pi/agents/*.md,按名称隐藏内置函数的项目文档,上限为 16 - 每次启动时由 Electron main 加载,因此编辑一个会在下一个提示时生效。定义通过 ReadGlobGrepBrowserPreviewBashEditWrite(默认 ReadGlobGrep)声明自己的工具,并且可以pin model: <provider>/<model>,每次启动时针对最多 8 个提供商解析一次,并且不会回退到会话模型。委托是具有相同主机连接的同一 sidecar 中的第二个 pi Agent,受 maxTurns(默认 24,最大 80)和父级重试策略的限制;其报告是工具结果,上限为 12k 个字符,详细信息包括 status (completed / truncated / failed / aborted)、turnstoolCallsusage。只有 TaskexecutionMode: "parallel",因此 Task 的一条辅助消息会在 MAX_SUBAGENT_CONCURRENCY (4) 下调用扇出,而任何其他批次保持顺序; PathMutex 命令相同路径突变。委托事件携带 parentToolCallIdagentName,它们保留在消息 meta 中,没有架构更改,将行嵌套在转录中的 Task 调用下,并在运行时重建模型上下文时被排除——父级只能看到报告。权限请求保留会话语义,但按会话排队,由 requestId 进行头部渲染和应答。 Task 保留在 Agent 核心集中,而不是按需目录 (ADR 0062)。即使只有结论很重要,长时间的搜索和审查也会让父级失去整个上下文,而会话级扇出将意味着第二个协调者、第二个权限所有者和第二个回合所有者。将委派保留为工具使其成为父级付费的工具结果,在拥有工作区的会话上保留权限和遏制,并使默认情况下的只读定义成为限制委派而不是信任其提示的事物。
D202使用用户级注册表管理子代理定义子代理定义获得第三个来源和管理 UI。 host-core 拥有一个用户注册表(<data>/agents/registry.json 加上平面 <data>/agents/<id>.md 文档、id == name、拒绝重复名称、上限为 16 以匹配 MAX_SUBAGENT_DEFINITIONS),其记录携带 enabled 和 UI 编辑的 frontmatter 旁边的 D192 激活范围(toolsmodelthinkingLevelmaxTurns)。影子顺序变为项目 > 用户注册表 > 内置,因此提交的 .pi/agents/<name>.md 仍然获胜。 host-core 是唯一的写入者,parseSubagentDefinition 仍然是唯一的读取者; Electron main 在每次提示时读取范围匹配文档并将其传递给 loadSubagentDefinitions(projectPath, { userDocuments }),因此编辑会在下一轮生效,而无需重新启动。九个 IPC 通道(subagent/listcatalogcreateupdatereadremovesetEnabledsetScopereveal)镜像 D194技能 API 并且每个突变都会发出 pluginChanged。扩展页面获得了第五个部分,子代理(修订 D196),在有效目录的只读列表之上有一个可写注册表列表(范围控制、编辑表、显示、删除),该有效目录由 subagent/catalog 在 main 中计算,而不是在渲染器中合并。内置函数和项目文档是只读的——没有启用开关,没有范围——并提供“复制为我的定义”,它会预先填充表格,因此同名的注册表项的排名高于它所来自的内置函数。注册表行报告项目文档何时拥有其名称以及何时在当前项目中不活动 (ADR 0063)。ADR 0062 交付的委托没有表面:定义只能手写到跟踪的项目文件中,交付的内置函数在源外部不可见,并且默默地丢失到阴影、关闭开关或另一个项目范围的定义是不可报告的。从 UI 写入 .pi/agents/ 会创建未提交的差异,并强制每个存储库重新创建个人委托,因此可写层是用户级的,而项目源保持其优先级;从真实加载器回答只读列表可以防止“Task 现在提供的内容”成为与重要实现不一致的第二优先实现。
D203Codex 奇偶校验上下文压缩压缩被重建以匹配 Codex 的机制,反转四个 D200 条款并保留其余部分。所有后台预计算和增量触发范围都被删除:当总上下文跨越 hardLimit 或模型要求新窗口时,prepareNextTurn() 同步压缩。检查点仅携带摘要和最近的 用户 消息 - pi 的切割点仍然标记边界,但其分叉前缀和最近的尾部被折叠回摘要输入中,因此摘要覆盖整个范围,并且保留的尾部是从最多 20,000 个令牌(上限为硬预算的一半)的用户消息中最新先重建的,交叉消息被截断而不是丢弃,然后恢复到时间顺序。两个系列运行相同的生命周期:summaryfresh_window 翻转,不请求摘要并存储固定标记文本,由构造选项或 PI_DESKTOP_COMPACTION_STRATEGY 选择,并且既不在设置中也不在 i18n 中公开。面向模型的 new_context 工具返回(无参数,Codex 的逐字描述,在主机上无确认白名单,永远不可分配给子代理)以及附加到当前回合系统提示的两个每个窗口预算提醒 - 一个在 clamp(hardLimit * 0.15, 8k, 32k) 剩余,一个在 2,000 - 每个声明一次并在安装时重置。 host-core 保留整个检查点链(read_compactionswrite_transcript_with_compactions、每条记录分叉验证、SessionDetail.compactions),并将 compaction 保留为其最新元素。 compaction_start/compaction_end 删除 phase,并且 compaction_endstatus 替换为 mark { id, throughMessageId, generation, summaryTokens, summarized };记录在其覆盖的消息之后为每次压缩绘制一个分隔行,结束其落在内部的辅助回合并删除锚消失的标记,并且每次成功的压缩都会在 fallback/overflow/manual toast 之上引发一个警告 toast。故意偏离 Codex:摘要位于保留用户之前,因为 buildSessionContext 修复了该顺序,hardLimit 保持“窗口 - 输出保留”而不是窗口的 90%,该工具已在两个系列中注册,并且提醒是系统提示附加我们自己的阈值和措辞 (ADR 0064)。上一轮引用了 Codex,同时在四个方面实现了相反的结果,其上下文部分声称,当 new_context 存在时,Codex 没有模型端压缩工具。用户在被告知 Codex 的机制会逆转不可察觉目标后,特别询问了 Codex 的机制。 Parity 还根据其自身优点购买了三件东西:仅保留用户消息的检查点要便宜得多,并且在没有结果的情况下无法搁置工具调用,可见行使有损操作可以再次从记录中进行审核,并且警告将“改为开始新会话”决策放在其所属的位置。成本被接受:用户再次等待压缩。
D186有界提供商流恢复和诊断提供程序请求设置使用一次有界 pi-ai 重试。流式传输开始后的瞬态 STREAM_FAILEDNETWORK_ERRORTIMEOUT 在可中止退避后的同一回合中重播一次;失败的助手将从模型上下文中删除,并重用其可见消息 ID。第二次失败是致命的。提供程序 AppError.details 仅携带有界阶段、计时、提供程序 status/code 和重试诊断。突变指导在 Edit 不匹配后使用一个新的 read/regeneration;同一路径的第二个失败的 Edit 或第二个失败的 shell patch 命令会返回终止工具提示,而不是修复旧的补丁工件。无界或重新生成驱动的恢复使得瞬态流终止变得昂贵,并且使得补丁循环在没有新信息的情况下消耗轮次;有限的运行时间预算保留上下文和用户控制,同时保持故障可诊断(ADR 0050)。

| D187 | 资源隔离主机 RPC stdio | host-core 通过每个方向的一个专用命名操作系统线程读取 stdin 并序列化 stdout,而不是通过 Tokio 的动态阻塞池。线程重试中断和瞬态 STREAM_FAILED/NETWORK_ERROR 错误,同时保留 NDJSON 帧;无法创建控制线程是结构化启动失败。登录 shell 路径探测还将帮助程序线程创建视为尽力而为,并回退到继承的路径。 RPC/tool 入场限制保持不变。 | 当操作系统线程创建返回 Resource temporarily unavailable(macOS 上的错误号 35)时,Tokio stdio 可能会出现恐慌,从而将临时资源压力转变为 HOST_UNAVAILABLE;隔离控制管道会删除该进程级崩溃路径,同时保留有限的过载行为 (ADR 0051)。 | | D191 | 仅限代理模式;聊天已重命名为只读 | (被 D188/D189 取代:模式选择器返回为 Agent | Plan, and chat migrates to plan) agent is the only session mode the product exposes. The former chat profile is renamed 只读 and keeps its Read/Glob/Grep hard deny in host-core, but it has no UI surface: no top-bar toggle, no composer chip, no Settings row, no palette command or slash alias, and no localized labels. The host normalizes chat to 只读 on every write path (session.create, session.configure, session.import) and the permission gate is negative — anything that is not agent gets the read-only surface — so an unknown or legacy value can never widen the tool set. Error codes become BASH_DISABLED_IN_READ_ONLY / WRITE_DISABLED_IN_READ_ONLY. A boot fix-up rewrites existing sessions.mode =“聊天” rows and a stored defaultMode of chat to 代理 | 该产品从来不希望用户实现的模式切换是枪炮和沉重的 UI 重量:会话可能会滞留在只读配置文件上而无法返回,并且两个工具集使每个工具、提示和权限更改的表面增加了一倍,都必须进行推理。在主机端保持窄配置文件强制执行可以保留导入行和旧行的安全边界,而无需为其提供控件 (ADR 0055)。 |

N. 通知决定

身份证号主题决定基本原理
D117持久任务通知收件箱Rust host-core 独占拥有 schema-v6 notifications 表,并且仅在 Electron 报告结果尚未可见时,当 session.endTurn 将运行轮移至 completed/error 时,才会自动插入一个结构化 task.completed / task.failed 行。 Renderer 通过允许列表查看上下文 IPC 提供当前聊天会话;仅当其窗口为 visible/focused 并且该会话匹配时,Main 才会抑制插入,而未知、背景、隐藏或未聚焦状态无法安全通知。 turn_id UNIQUE 可以防止重复,中止是静默的,会话删除级联,并且只保留最新的 200 行。标题栏响铃显示准确的未读计数、All/Unread、行 mark-read/session 激活、标记所有已读以及通过完整的 keyboard/accessibility 行为进行清除。协议 v4 添加了单数 notification.list/markRead/markAllRead/clearsession.endTurn 返回插入的记录,Electron 发出渲染器 notification.changed,并且仅当主窗口未聚焦时,它才会显示本机系统通知,该通知单击 restores/focuses 窗口并发出 notification.activated。持久化行包含结构化 kind/session/turn/error 数据以及会话名称快照,从未本地化通知 title/body 散文。任务收件箱没有权限、计划提醒、偏好、云通知或插件通知源;插件本机通知是单独的 D213 表面。 D113 的个人资料页脚保持不变。通知应该恢复用户没有看到的任务结果,而不是重复当前聊天中已经可见的结果。有界主机拥有的收件箱可保持 background/unfocused 结果的持久性和可导航性,而不会侵犯 SQLite 所有权、重复事件或将每个终端事件转变为通知历史记录。

O. 桌面 shell 决定

身份证号主题决定基本原理
D118平台应用程序菜单和窗口镶边macOS 安装传统的系统应用程序菜单并保留隐藏式交通信号灯。 Windows/Linux 使用共享的 46px 无框架外壳以及本地化的 File/Edit/View/Window/Help 菜单和渲染器绘制的 minimize/maximize-or-restore/close 控件。两个菜单表面都通过固定的 AppMenuCommand 允许列表路由渲染器拥有的操作;渲染器菜单通过单独的固定允许列表路由本机 editing/window 操作。目标打包在 Electron 打包之前构建本地发布主机。这增加了平台就绪的 shell 行为,但不会逆转 D010:Windows/Linux 发布资格在 MVP 后仍然有效。默认的 Electron 菜单会使 macOS shell 命令不完整,而无框 Windows/Linux 窗口会丢失应用程序菜单和窗口控件。共享允许列表可以保持行为一致,而不会暴露任意特权命令桥。
D120应用程序更新交付Electron Main 独家拥有固定的 GitHub 发布源、更新轮询、类型化状态和安装生命周期。开发被禁用;打包的 macOS 和非 AppImage Linux 使用通知和链接传递,而 Windows NSIS 和 Linux AppImage 在应用程序内下载并在退出时安装。 Renderer IPC 无法提供 Feed URL。自动故障保持环境状态,显式检查表面状态,下载状态保持可操作。更新程序始终强制使用 allowPrerelease = false,因此预发布安装(例如 0.2.0-rc.6)会跟踪 GitHub 的最新稳定版本,而不是 electro-updater 的默认同通道引脚。 D126 随后发布由标签矩阵生成的每个平台提要,而 macOS 仍保持手动状态,直到签名通道合格为止。将软件包安装保持在沙盒渲染器之外,匹配每种安装程序格式的交付,并在菜单、设置和更新横幅之间提供一种一致的状态 (ADR 0022)。如果没有稳定通道引脚,RC 不会构建更新的稳定通道,因为电子更新程序将 rc 视为自定义通道。
D121品牌macOS开发主机macOS 上的 pnpm dev 通过 .cache/electron-dev/ 下已安装的 Electron 主机包的指纹、临时签名的 PI-Desktop 副本启动 electro-vite。生成的捆绑包仅更改开发主机元数据、可执行文件名称、捆绑包标识符和 ICNS 资源;它永远不会改变 node_modules。 Windows/Linux 保持库存开发可执行,而打包通道仍归电子制造商所有。AppKit 会忽略顶级应用程序身份的运行时 app-name/menu 覆盖,并从主机包中获取本机菜单名称和“关于”图标;需要品牌开发主机才能与打包的 PI-Desktop 保持一致。
D129无菜单 Windows/Linux 窗口镀铬应用程序菜单仅为 macOS 系统菜单表面。 Windows/Linux 保留共享的无框架 46px 标题栏和渲染器绘制的 minimize/maximize-or-restore/close 控件,但在窗口内不渲染 File/Edit/View/Window/Help 菜单,并且不保留左侧标题栏空间。通过 renderer/native Web 内容处理,现有应用程序、编辑、缩放、全屏和关闭快捷方式仍然可用;仍然可以通过“设置”->“信息”访问更新检查。这仅取代 D118 和 ADR 0021 的 Windows/Linux 渲染器菜单部分。窗口内桌面菜单会重复 macOS 特定的系统菜单镶边、占用导航空间,并且不属于 PI-Desktop 的无框 Windows/Linux 标题栏。
D130侧边栏页脚通知条目持久通知铃声从主标题栏移动到扩展侧边栏页脚右侧单独的 32px 操作,取代了 D113 的“帮助”快捷方式。其未读徽章和完整的 D117 收件箱行为保持不变;弹出窗口在页脚的上方和右侧打开,并且主标题栏中没有重复的贝尔。这仅取代 D113 和 D117 的条目位置条款。通知历史记录属于持久的本地配置文件控件,页脚位置使主标题栏保持安静,同时保留紧凑、熟悉的状态条目。
D141规范 Windows 本机应用程序身份Electron Main 在准备就绪之前设置产品名称,并在创建任何窗口之前将 com.pi-desktop.app 注册为 Windows 进程 AppUserModelID。该 ID 是现有的 electron-builder/NSIS 应用程序 ID; Windows 打包显式保留 PI-Desktop 作为可执行文件和“开始”菜单快捷方式。本机通知属性、通知设置、任务栏分组、安装的快捷方式和打包的可执行标识必须公开 PI-Desktop,而不是库存 Electron 主机。 D121 保持不变:Windows 开发可以使用库存 Electron 可执行文件,而其面向操作系统的运行时标识使用规范的 AUMID。app.setName 更改 Electron 的内部名称,但不更改通知和 shell 集成使用的 Windows 标识。跨运行时和打包的一个稳定 ID 可防止观察到的通知源泄漏和相邻 shell 品牌漂移,而无需更改已发布的 NSIS 升级身份。
D204空的家庭任务输入表面(取代 D111 的非停靠家庭输入框条款及其上下文快速行动条款;D205 中的起始网格修正被 D206 取代) **空的聊天主页将受限制的英雄和可选的首次运行清单保留在可滚动内容区域中。主输入框是滚动条的底部保留兄弟,在聊天表面的底部保持可见,并且从不覆盖内容。 **直接编辑器仍然是稳定的主要操作,并且流程布局保留了短窗口内清单的可达性(ADR 0066)。
D205ChatGPT 启发的空屋指导(被 D206 取代) 空的聊天主页在英雄和可选清单之间添加了一个紧凑的四卡开发人员入门网格:探索代码库、构建功能、修复错误和审查更改。每张本地化卡仅预填充并聚焦底部输入框;它从不发送提示或创建回合。 D204 中保留的底部合成器和单个可滚动主页流程保持不变。之前的英雄专属中路留下了太多未使用的空间,并且没有提供起始线索。 ChatGPT 清晰的空状态层次结构提高了第一个任务的可发现性,而开发人员特定的提示则保持表面有目的性而不是促销性。
D206删除空置的开发者入门卡空的聊天主页不会呈现开发人员入门卡、入门字形或上下文快速操作行。保留了内敛的英雄、较短的辅助线、可选的新手引导清单以及D204的底部保留输入框;任务输入直接在编辑器中启动。这取代了 D205,而不改变 D204 的滚动和底部保留布局。审查证实,直接输入框是首选的任务输入界面,并且这些卡片为空荡荡的家添加了不必要的决策层。
D208可恢复的本机工具路径合约保留 D185 的延迟 Glob/Grep 边界,但使每个提示和模式明确显示 Read 接受现有常规文件、Glob 接受目录、Grep 接受文件或目录。目录读取返回 INVALID_ARGUMENT 加上结构化的 Glob 恢复参数;显式文件 Grep 仅搜索该文件并将 include 应用于其基本名称。工具错误在其 ToolCallRows 上仍然可见,而活动组仅报告处理持续时间,并且从不从子行推断终端转向失败;终端代理事件和专用结果表面仍然具有权威性 (ADR 0069)。持久会话反复显示目录读取和文件作为目录 Grep 错误,然后将恢复的工作显示为最终失败。窄主机边界的兼容性加上一个结果所有者消除了重试和错误失败 UI,而无需将每个搜索模式恢复到 Agent 核心。
D216跨平台托盘驻留最小化Electron Main 在 macOS、Windows 和 Linux 上创建一个打包资源托盘图标。每个主窗口最小化路径都会被拦截并隐藏窗口,而不需要配置主机或sidecar;托盘 click/double-click、Show 和 macOS 应用程序激活 恢复并聚焦现有窗口(如果已关闭,则创建一个窗口)。本地化托盘菜单显示“显示 PI-Desktop”和显式“退出 PI-Desktop”操作。关闭窗口仍然是退出操作,托盘销毁加上退出使用现有的有序 before-quit 关闭路径。用户需要后台工作才能继续而不丢失应用程序窗口,而最小化在本机 macOS 控件和自定义 Windows/Linux shell 中必须意味着相同的事情。主要拥有的托盘生命周期避免了渲染器权限扩展并保持显式退出可观察。
D218主机拥有的跨平台插件面板窗口栏插件面板窗口采用主窗口的 46px 平台窗口栏:macOS 使用 hiddenInset,交通灯位置为 {x:16,y:16};Windows/Linux 使用无框窗口,并提供 112px 宽的自定义最小化、最大化或还原、关闭控制区。沙盒化插件 preload 在封闭的 Shadow DOM 中渲染 manifest 标题与控件,在现有顶部内边距之外再按标题栏高度偏移内容,并使用一个私有、验证发送方、固定动作集合的窗口操作通道;window.pluginBridge、每插件 partition 与 host protocol v9 均不扩展。重新打开最小化的面板时会还原并聚焦窗口。Electron 默认窗口框架使插件工具看起来脱离 PI-Desktop,且各平台表现不一致。由 preload 拥有窗口栏可实现一致性,同时不将不受信任的插件 HTML 移入主机渲染器,也不暴露通用 Electron 窗口权限(ADR 0081)。

P. 转录本存储决策

身份证号主题决定基本原理
D119成绩单文件存储; SQLite 仅索引架构 v7:消息内容从 SQLite 移入 ~/.pi-desktop/sessions/ 下的每个会话 JSONL 文件 — <id>.jsonl(会话标头行,然后每条消息一个规范的块数组消息行,RFC3339 标记)加上用于重新生成分支的仅附加 <id>.revisions.jsonlmessages 删除 messages/content_json 并成为纯索引(排序、提升过滤列、提取 text 馈送 FTS); message_revisionsmessages_json 替换为 message_count,并且仅在数据库中跟踪 is_active。写入首先是文件,然后是索引事务;读取时跳过 unknown/torn 行并删除重复消息 ID keep-last;完全重写是临时文件+原子重命名;会话文件仅与其会话一起删除,而绝不会删除 age/orphan-swept。打开 v7 之前的数据库会将其存档为 pi.sqlite.v6.bak 并进行全新引导 — 显式中断重置,删除所有 v1-v6 迁移代码。 RPC 线路格式未更改,因此 Electron/renderer/importers 无需更改。数据库的增长不受携带工具args/results和思考有效负载的限制; codex/claude-code-style 每个会话文件使记录保持人类可读、可 grep 和可移植的状态,而 SQLite 则保持小型、快速的索引(列表、搜索、徽章)。选择了开发阶段中断重置而不是迁移机制。
D122独立对话会话分叉协议 v5 添加了主机拥有的 session.fork:将空闲源的完整活动规范转录复制到具有重新映射的 message/tool-call id 和继承的 project/provider/model/mode/thinking/permission 配置的新独立会话中。不会复制轮转、重新生成修订、通知、工件、会话授权、scratch/runtime 状态、引脚状态和父子沿袭。创建分支激活子分支; D109 保持不变,因为没有引入消息级分支树。单个主机拥有的快照保留了规范块和持久性一致性,同时为用户提供了 Codex 风格的发散工作流程,而无需将独立对话与重新生成变体混为一谈。
D134助理响应叉和可逆编辑(由 D137 取代的编辑子句) 完成的辅助工具栏显示“复制”、“分叉”、“编辑”和“重新生成”,但没有“删除”。 Fork 使用可选的 throughMessageId 调用现有主机拥有的 session.fork,生成一个独立会话,其规范记录以该响应结束。编辑使用相同的隔离子项,仅替换其中选定的辅助文本,并将 original/edited 尾部存储为两个条目的 D109 修订系列,以便现有寻呼机可以恢复其中之一。两者都需要空闲源、重新映射 message/tool-call id,并且从不共享源会话 id、运行时、转录本、修订版或提供程序缓存状态。响应级别的分歧和纠正应该保持可逆,而不改变源或让编辑的历史重用从不同助手内容构建的缓存运行时状态。
D199重新生成主机 RPC 锁下存档的分支session.saveActiveRevision 在状态锁下的一次主机调用中执行读取、分支存档和 revisionCount / activeRevision 标记,替换 Electron 主程序的 session.get + session.replaceMessages 读取-修改-写入。标记仅重写 root 用户的转录行并在写入时重新读取文件,因此同时附加的行会保留下来; Electron main 首先排空持久性发件箱,并跳过存档并发出警告,而不是存档不完整的分支。 session.replaceMessages 在重写过程中携带每条幸存消息所属的 turn_id,并且仅对于在呼叫持续时间内拥有整个记录的呼叫者而言才被记录为安全 (ADR 0060)。助手和工具消息通过 ADR 0041 发件箱异步到达 SQLite,因此渲染器端快照可以早于回合的最终消息 - 然后整个转录文本重写从转录文件和索引中将其连同每行的 turn_id 一起删除。只有主机可以原子地读取和写入转录本。

问:仍然推迟

  1. 准确的市场域名/提供商 ID
  2. 私有市场授权机制
  3. 签名密钥分发操作细节
  4. 远程目录更新通道详细信息(URL/signature)
  5. 每个供应商预设的确切推荐默认模型

完整的开放列表位于 open-questions.md 中;这个 部分仅镜像 marketplace/catalog 项目,但仍然没有阻挡任何内容。

U. 设置铁路图标

身份证号主题决定基本原理
D143设置目录导轨图标五个设置目标使用固定 Lucide 字形:基础 = SlidersHorizontal、模型配置 = Bot、导入 = Download、项目存档 = Archive、信息 = Info。此导轨上未使用 Refresh/rotate 字形。先前的映射重用了 Settings/RefreshCcw/RotateCw,它读取为通用 gear/reload 而不是目标语义;单色 Lucide 保持紧凑目录可扫描。
D166设置目录分为 AI 和快捷方式目的地设置栏按顺序从五个增加到七个目的地:基础知识 (SlidersHorizontal)、全局 AI/AI(Sparkles,新)、快捷方式(Keyboard,新)、模型配置 (Bot)、导入 (Download)、项目存档 (Archive)、信息(Info)。权限和上下文管理从基础转向新的人工智能目标;键盘快捷键从“基础”移动到新的“快捷键”目的地;开发人员从基础转向信息。基础仅保留外观和默认值。这取代了 D133 的五个目标 count/order 和 D143 的五个图标集(添加 SparklesKeyboard),而不更改任何设置的语义、全页 shell 或轨道指标。基础知识积累了六张不相关的卡片,将全局人工智能行为(权限模式、上下文压缩)和快捷方式配置与外观和感觉一起埋葬;拆分它们为每个关注点提供了一个可扫描的主页,同时在模型配置中保持 provider/connection 配置独立。

R. 未来的决策规则

  • 架构边界更改需要新的 ADR
  • 实现默认值可以在此日志+相关规范中更新
  • D001–D010 的任何逆转都需要明确的基线碰撞

S. Composer 输入决策

身份证号主题决定基本原理
D123Composer 斜线命令,三个来源在编辑器的位置 0 处键入 / 将打开一个内联命令菜单,其中合并 (a) <workspace>/.pi/prompts/*.md~/.pi/agent/prompts/*.md 中的 pi 提示模板(项目在名称冲突时覆盖用户全局;frontmatter session.get/session.replaceMessages),(b) 通过在与调色板搜索共享的一个注册表中定义的斜杠别名的内置调色板命令,以及 (c) 插件调色板命令。发送时,builtin/plugin 调用通过现有渲染器开关/commandPalette/execute 在本地执行,无需创建会话或提示模型;模板调用在持久化之前在 Electron 主 agent/prompt 处理程序中扩展(来自 pi-agent-core 的 parseCommandArgs + substituteArgs),持久化 content = expanded 加上一个携带键入表单的新可选 command 字段;未知的 /foo 作为文字文本发送。重用 pi 的精确 CLI 语义和模板资源,保持代理重新设定种子的准确性(重新设定种子重播 content),并通过将键入的调用呈现为芯片(ADR 0024)来保持脚本的可读性。
D124@ 文件引用是纯文本灯光引用令牌边界处的 @ 在工作区索引上打开一个模糊文件菜单,该索引由新的仅限 Electron 的通道 pi-desktop/fs/index 提供服务(文件+目录、具有忽略设置步行回退的 git ls-files -co --exclude-standard 快速路径、带截断标志的 8000 个条目上限、短 TTL 缓存、工作区根目录、无工作区软失败)。接受会为文件创建规范的 @rel/path 引用(当路径有空格时引用 @"a b.txt" ),并插入 @dir/,目录中不带尾随空格; D209 修改已完成的文件草稿演示,但不更改发送的纯文本路径。该模型遵循 Plan 和 Agent 中的读取工具的参考。没有提示内容内联或提供程序附件转换;剪贴板文件具体化由 D197 定义。匹配 pi CLI 面向模型的语义,避免上下文膨胀和截断规则,并使用户驱动的文件浏览保持在每个 ADR 0019 的代理 tool/permission 路径之外。
D125Composer 自动完成交互和 IME 合约**一个菜单组件锚定在编辑器上方,完整的编辑器宽度,焦点始终保留在文本区域中。打开时的按键:↑/↓ 循环环绕,Enter/Tab 接受,Escape 仅关闭菜单(优先于输入框的 clear/blur Escape),实时输入过滤器;当某个项目突出显示时,Enter 永远不会发送,并且空结果列表将被视为已关闭。菜单在外部鼠标按下、模糊、删除超过触发字符或会话切换时关闭。所有按键处理和触发检测都位于 IME 防护后面(`isCompositing
D197Composer 剪贴板文件成为会话草稿引用当 Composer 剪贴板包含一个或多个操作系统 files/images 时,渲染器会拦截文件粘贴,通过仅限 Electron 的 pi-desktop/composer/pasteFiles 通道传输有界字节和 name/MIME 元数据,并包含持久会话 ID。 Electron main 验证会话、清理名称并在 <data_dir>/scratch/<sessionId>/pasted/ 下写入唯一文件; D209 修改呈现草稿,同时保留每个返回的绝对路径作为发送给代理的带引号或不带引号的 @ 引用。纯文本粘贴仍然是原生的。家庭输入框首先创建或重用持久会话。剪贴板字节永远不会进入提示符、工作区或工件存储,并且会话删除会删除带有临时根的粘贴文件。修复了损坏的 file/image 粘贴路径,而不会弄脏项目或发明特定于提供程序的二进制提示管道;它重用了现有的暂存遏制和生命周期合同。
D209Composer 文件引用将紧凑显示与规范提示路径分开完成的工作区文件选择和物化剪贴板文件成为文本区域上方渲染器拥有的、会话范围的参考芯片。芯片始终仅显示叶名称,通过 tooltip/accessibility 元数据公开规范路径,并且可以在不删除临时字节的情况下将其删除。在提交之前,引用会在可见草稿之后以稳定的顺序序列化,并使用 D124 的精确引用,因此仅供引用的草稿、斜线模板和 Agent/Plan/Goal 模式别名保留其当前行为。接受的调度会清除活动编辑器,但保留仅渲染器、回合范围的预序列化快照,而智能停止仍然可以撤消未应答的发送。该撤消操作会恢复原始文本和碎片,而不是预填充序列化消息内容;回复开始后中止保留部分记录并且不恢复任何内容。 Rejected/failed 发送保留活动草稿。 ComposerPastedFile.name 是经过清理的原始叶标签,而 path 保留 UUID 支持的绝对存储身份。未添加二进制有效负载、提供程序附件、主机 RPC 或架构。长相对路径和 UUID 支持的临时路径淹没了提示行,即使只有代理需要它们。将表示与序列化分离可以保留精确的工具可读路径、重复名称标识、textarea/IME 行为和纯文本提供程序合约 (ADR 0070)。
D211全局插件启动器可自定义的 openPluginLauncher 快捷方式在 macOS 上默认为 Option+Space,在 Windows/Linux 上默认为 Alt+Space。Electron main 在启动后全局注册它,并拥有一个在启动完成后预热的 620×440 无框工具窗口,以最靠近指针的显示器为中心;macOS 使用跨工作区面板,而 Windows 使用 host-core 低级钩子来保留默认 Alt+Space 组合键,并在该钩子不可用时保留聚焦窗口回退。沙盒渲染器仅列出已启用且就绪的面板插件,通过原始字符、无声调完整拼音或拼音首字母(加上规范化的 name/id/description)匹配中文名称,并通过现有插件面板主机打开选定结果。Up/Down 选择,Enter/click 打开,Escape/blur 隐藏,IME 组合输入期间从不分派。附加的 toggle/dismiss/shown IPC 仅存在于 Electron 本地;host-core 的附加快捷键 method/notification 仅携带绑定事件。插件面板需要一个键盘优先的入口点,使其在 PI-Desktop 未聚焦时仍可工作,同时不恢复完整 shell,也不削弱现有面板的 sandbox/permission 边界(ADR 0072/0076/0080)。
D212运行输入框阶段下一轮配置和停止轮保持吞吐量在活动回合期间,草稿文本和 mode/thinking/permission 选择器保持可编辑状态,停止保持活动状态,并且仅禁用发送。渲染器会投影每个会话的最新完整配置,并仅在终端事件之后调用现有的仅空闲 session/configure,因此运行时保持固定状态;等待 Plan/Goal 批准仍可进行门编辑。用户停止的部分答案保留 responseDurationMs;当最终提供商输出使用不存在时,可见思考+答案文本被估计为每个标记的四个 Unicode 代码点到可选的 responseOutputTokens 中。 Rust 转录本元数据保留这两个字段,精确使用获胜,并且 UI 标记仅估计吞吐量。准备下一个提示不应等待当前流,但主机安全需要不可变的运行中配置。停止的可见答案仍然具有足够的测量数据,可用于有用的、明确的近似生成速度(ADR 0073)。
D215Windows 保留的全局快捷方式回退在 Windows 上,host-core 为有效的 Alt+Space 默认绑定安装一个狭窄的 WH_KEYBOARD_LL 挂钩,因为 shell 可能会从 Electron 的 globalShortcut 中保留它。 hook 仅消耗匹配的和弦并发出 keyboard.shortcut({ binding: "Alt+Space" }); Electron 切换现有插件启动器。每当设置更改时,Electron 都会调用附加的 keyboard.setGlobalShortcut({ binding }),而 host-core 仅针对该精确绑定启用挂钩。其他平台和自定义绑定保留在 Electron 的全局快捷路径上。每当 PI-Desktop 未获得焦点时,Windows 的活动窗口系统菜单保留都会导致附带的全局启动器不可用。范围狭窄的主机回退会保留快捷方式,而不读取文本或扩展 plugin/renderer 权限 (ADR 0076)。
D217启动完成后预热插件启动器主应用及后端完成启动后,Electron 创建并加载保留的插件启动器,同时保持窗口隐藏。窗口创建使用一个共享的进行中 promise,因此预热期间收到的快捷键会复用同一次渲染器加载;若预热失败,则销毁未完成的窗口、清除 promise,并允许下次调用重试。每次显示窗口时仍会刷新实时插件目录。将 BrowserWindow 分配和渲染器启动移出首次可见调用,使启动器的显示延迟更稳定,同时不拖慢主应用启动,也不削弱插件目录的新鲜度、IPC 或沙盒边界(ADR 0080)。
D198Goal模式为第二种合约模式Goal 是第三种持久操作模式 (agent / plan / goal),它端到端地重用 Plan 审批管道。 EnterGoalMode 将活跃的 Agent 切换为 Goal 合约状态; SubmitGoal(title, markdown, question) 写入主机拥有的不可变 .pi/goal/<unique-name>.md 工件并插入一个待处理的 plan_approvals 行。单个审批表在 schema v11 中获得 kind 列(plangoal,默认为 plan);这种类型(而不是预计的计划状态)选择提示、工件目录、提交工具和 i18n 命名空间,因此一个批准栏和一个执行队列同时服务于这两者。 Plan 和 Goal 是合约模式:它们共享一个工具白名单(Read/Glob/Grep/BrowserPreview/Bash 加上他们自己的提交工具)、针对持久模式评估的 Write/Edit/plugin/unknown 工具的一台主机硬拒绝、共享 *_IN_PLAN 错误代码以及对无人值守运行的 PLAN_REQUIRES_INTERACTIVE_SESSION 拒绝。经批准的 Goal 在 Agent 中自主执行:它选择自己的方法并继续工作,直到验证每个验收标准或边界阻止它,然后逐个报告标准。线 kind 是可选的,不存在意味着 plan,因此这是协议 v9 中的附加内容。Plan 回答“执行这些步骤”;用户还需要“达到这个结果,自己决定步骤”(Claude Code的计划模式和Codex的目标型运行)。在批准的合同中制定目标声明、验收标准和边界可以保持自治的可审核性,并且按类型区分一条管道可以避免出现不可避免的漂移的平行表、批准表面和许可边界。
D144侧边栏主镀铬为 14 像素扩展侧边栏主要镶边(新任务、插件、会话标题、页脚标识名称、配置文件菜单操作)使用 --text-base (14px)。 Project/group 标题和空状态副本使用 --text-md (13px)。部分标签使用 --text-sm (12px)。主要侧边栏内容不得使用微型 --text-xs 带。13px 侧边栏主体在 14px 聊天界面旁边感觉尺寸过小;仅碰撞原色铬可以保持密度,同时恢复视觉平衡,而无需全局类型比例变化。
D145禁用可编辑字段上的浏览器文本更正桌面渲染器中的每个文本 inputtextarea 都会禁用浏览器文本校正:spellCheck={false}autoCorrect="off"autoCapitalize="off"。共享 Input/Textarea 原语默认这些值;原始字段(编写器、消息编辑、命令选项板、全局搜索、settings/plugins/projects 搜索、模型搜索、浏览器 URL 栏、提供程序模型组合)显式设置它们。复选框和非文本控件保持不变。编码提示、路径、模型 ID 和 URL 不得带有红色下划线或通过 Chromium/OS 文本更正自动更改; shell 是一个应用程序,而不是文档编辑器。

| D146 | 启动画面 + 动作令牌 | 虽然引导程序不完整,但渲染器显示品牌全窗口启动启动画面(徽标、shell 名称、标语、可访问的 app.starting、软进度条)而不是纯状态文本。在 ready 之后,飞溅会保持短暂的最小停留时间(~420ms),然后在安装的外壳上淡出(~280ms)。全局运动使用 CSS 令牌 --motion-duration-{fast,normal,slow}--motion-ease-{out,in,standard} 以及共享的 overlay/surface 输入关键帧;交互式转换更喜欢这些标记。减少的运动会将 splash/overlay 运动折叠到接近于零并冻结进度条。崩溃 chrome 使用 app.uiCrashed | 启动是第一次运行的时刻,以前感觉尚未完成;简短的品牌标志无需装饰性戏剧即可传达准备就绪的信息,共享的动作令牌使 shell 过渡一致且更流畅,同时仅保留反馈。 | | D147 | 交互细节润色(选择、CJK 标签、动作填充) | 可复制表面在单色坡道上使用主题感知的 ::selection(文本-主混合)、caret-coloraccent-color;聚焦环与透明色混合(无白色清洗)。高流量镶边(跳转最新、停止、菜单、搜索行、通知、工作面板选项卡关闭、品牌芯片)通过 --motion-duration-fast 进行转换。滚动条为 8 像素,悬停拇指更强。空主堆栈间隙为 24px。在 lang=zh-CN 下,部分标签会删除 uppercase/wide 跟踪。未定义的 --radius-token-row 被替换为 --radius-sm | 中性口音 + 动作令牌传递后残留的金色抛光间隙:浏览器蓝色选择、突然的悬停填充、中文 chrome 上仅拉丁文的标签样式以及一个未定义的半径令牌。 | | D150 | Composer 运行时芯片下降器 | Composer 工具栏芯片(Agent/Plan、思考、权限模式、模型 ID)将标签完全墨水化在 28px 胶囊内:芯片和标签行高为 --leading-compact,芯片不会在控件上使用 overflow: hidden 进行剪辑,并且模型标签使用水平省略号而不使用 leading-noneautoCorrect="off"/autoCapitalize="off"/Input/Textarea/Input/Textarea 上的下降器在光线和黑暗中都必须保持可见。 | leading-none 加上截断溢出,模型 ID 和标签上的字形下降部分(例如 Agent)/接受编辑,使底部工具栏看起来被切断。 | | D151 | 发送重新固定的文字记录如下 | 通过发送、重试或重新生成开始回合始终会重新固定转录跟随模式,隐藏跳转到最新的药丸,并在新内容到达之前滚动到底部。手动滚动在回合过程中仍会暂停跟随;跳跃控制仍然是唯一恢复的非回合方式。这改进了 D071,而无需在每个标记上恢复强制滚动。 | 向上滚动查看历史记录的用户仍然期望他们发送的下一个提示能够登陆最新的交易所;发送后暂停跟随,将新回合隐藏在跳跃药丸后面。 | | D152 | 直接运行时流渲染 | 辅助内容直接通过增量 Markdown 块缓存渲染每个运行时流块。渲染器不添加 requestAnimationFrame 打字机状态循环。 KaTeX 的 Vite 内联字体仍然是本地资源,并被狭窄的 font-src 'self' data: CSP 指令所允许。 | 重复的动画循环可能会在持续流期间触发 React 的嵌套更新防护,而之前的 CSP 会阻止捆绑的数学字体并产生控制台错误。 | | D153 | 推理会话默认为最大思考 | 新创建的会话(其继承的默认模型支持推理)从该模型的 pi 发布的 supportedThinkingLevels 中的最高规范条目开始。非推理模型和缺失的能力元数据从 off 开始;现有会议保留其持久选择。这改进了 D096,而无需添加提供程序覆盖。 | 具有推理能力的模型应该默认使用最强大的可用努力,同时保留明确的每会话选择和 pi-ai 的模型权威。 |

T. 发布交付决策

身份证号主题决定基本原理
D126三平台发布交付(电梯D010)标签构建将矩阵生成的每个工件发布到 GitHub 版本:macOS dmg/zip (arm64)、Windows NSIS x64、Linux AppImage + deb (x64),每个都有块图和平台的 latest*.yml 电子更新器提要。发布提要会激活 D120 的 Windows NSIS 和 Linux AppImage 的应用内更新通道; macOS 保持通知和链接模式,直到签名通道合格为止。 NSIS 工件名称固定为无空格 (PI-Desktop-Setup-${version}.${ext}),因为 GitHub 资产 URL 会损坏空格。根据基线凹凸规则(基线 0.4.7),D010 的仅限 macOS 范围被提升;发布管道本身在 v0.1.1-rc.1/v0.1.1 上通过了端到端合格。无论如何,管道都会在每个标签上构建并验证所有三个平台;将安装程序保留为过期的 Actions 工件(保留 90 天)会阻止用户安装它们,而不会增加安全性。发布更新源是交付的重点:具有应用程序内通道的平台会静默更新,并且未来的平台回归会通过实际安装而不是未使用的工件来呈现。

V. 扩展激活决策

身份证号主题决定基本原理
D192每个扩展类型共享的激活范围**插件、用户 MCP 服务器和用户技能均带有 enabled: boolean 加上 `scope: { mode: "global" \“项目”;项目: string[] }. enabled stays separate so switching an extension off never discards its project list, and the three-state control (off/projects/global) is derived, not stored. Matching is case-insensitive, trailing-separator-insensitive and subdirectory-inclusive; a missing scope resolves to global; a projects-mode extension is inactive in a session with no project. Scope is enforced both when a per-turn catalog is assembled and again at dispatch (tools.execute, UserMcpRuntime.callTool, loadUserSkillBody`,命令执行)。面向代理的表面在会话的项目上进行过滤,面向应用程序的表面在活动窗口的表面上进行过滤;主题根本没有范围。**
D193用户拥有的 MCP 服务器不需要插件host-core 在 <data>/mcp/servers.json 中拥有 mcp.list / active / upsert / remove / setEnabled / setScope 中的 McpServerRecord 值; Electron main 拥有 UserMcpRuntime 中的进程,重用 ADR 0038 的 McpServerClient。工具公开为 mcp_<serverId>_<tool>,与 D015 的 plugin_ 命名空间不同。服务器在会话首次使用时连接,该会话可以看到它并缓存其工具列表;失败的握手将保持失败状态,直到用户对其进行编辑或按“测试”;保存对传输、命令、参数、环境、url 或标头的更改会断开连接,而标签、描述和范围则不会。 Cap 16 个实时进程,每台服务器 64 个工具,commandPolicy: "trusted",以用户的主页作为 cwd。添加一个主要是粘贴 mcpServers 块:parseMcpImport 接受 mcpServers / servers / bare-map / 单对象拼写,从 url 推断 http,强制非字符串环境和标头值,尊重 disabled: true,大写共有 32 个条目,并报告每个条目的原因,而不是整个粘贴失败。野外环境中的每个 MCP 服务器均以三行 JSON 形式提供;需要一个清单、一个包和一个签名来运行它们,这只是一个包装。缓存加上粘性故障可以使会话组装避免连接超时,并且仅在身份更改时无效可以避免在编辑后提供过时的工具列表(ADR 0056)。
D194用户拥有的技能是一份 Markdown 文档host-core 将 <data>/skills/<id>/SKILL.mdregistry.json 索引存储在 skills.list / active / create / import / update / read / remove / setEnabled / setScope。 D174 的交付合同没有改变:只有描述进入提示,当模型调用 Skill 时获取正文,每个文档 128KB。因此,编辑器需要一个描述并将其放置在正文之上。用户技能 ID 是裸露的,插件技能 ID 包含 /,因此 loadUserSkillBody 拒绝任何带分隔符的 ID,并直接进入插件目录,无需进行注册表查找。一个技能是一个单独的 Markdown 文件;插件路径使尽可能最小的扩展承载最大可能的信封。保持 id 形状不相交可以将两个目录分开而无需查找,而保持 D174 的契约意味着用户技能与插件技能的上下文成本相同 (ADR 0056)。

2026-07-28 — 插件市场、面板和高风险 API

  • 官方本地市场提供商可以对 browse/search/install .piplug 包进行校验和验证。
  • 插件面板通过 pluginBridge 在沙盒隔离窗口中运行。
  • 高风险插件主机 API(fs.writenet.fetch、剪贴板、openExternal)仅在明确授权的情况下可用。
  • 支持每个插件自动更新;权限扩展升级需要审查。

2026-07-28 — 官方插件市场存储库

  • 专用存储库 vastsa/pi-desktop-plugins 是官方市场来源。
  • PI-Desktop 远程获取 catalog.json(缓存在 ~/.pi-desktop/plugins/market/ 下)。
  • 插件维护者将源代码与存储库脚本打包在一起,并通过推送到该存储库来发布。
  • 仅当远程获取失败时,本地捆绑目录才会保留后备状态。

2026-07-28 — 市场模板 + 详细信息窗格

  • 官方仓库获得了实用的模板插件demo.workspace-summary和CONTRIBUTING指南。
  • PI-Desktop 市场 UI 现在通过 market.getDetail 打开包含自述文件、变更日志和版本列表的详细信息窗格。

2026-07-28 — 侧边栏类型平衡

  • 扩展侧边栏主要镀铬使用 --text-base (14px) 而不是 --text-md (13px)。
  • Project/group 标题跳转至 --text-md;部分标签在 --text-sm 中保持次要地位。
  • 决策 D144:使微型标记远离主要的左栏内容,以便栏与正文可读性相匹配,而不改变全局类型斜坡。

2026-07-28 — 聊天 Markdown 散文重新设计

  • 助理降价 (.prose-chat) 进行了重新设计,以实现更密集、更平静的文字阅读:更清晰的标题层次结构、带重音的块引号、更安静的列表标记、带边框的内联代码、zebra/hover 表格以及带有等宽语言标签的插入代码卡。
  • 思考散文在次要颜色/text-sm-plus 处重用相同的层次结构,因此推理在视觉上保持从属于答案。
  • Renderer 行为(流块分割、GFM/math、Shiki)不变;这是 globals.css + component/design 规范中的仅演示通行证。

2026-07-28 — 中性灰色口音(无蓝色品牌)

  • --ds-accent / --ds-accent-hover / --ds-accent-soft / --ds-info 现在解析为灰度(深色:白色→灰色-100→灰色-300;浅色:#1a1c1f#303030#5d5d5d)而不是 Codex 蓝色。
  • Markdown 链接、块引用、焦点环、插件 CTA、切换和选定会话环通过标记自动继承中性重音。
  • 项目色点和 docs/specs 更新为蓝色作为品牌口音。

2026-07-28 — 插件页面浅色主题令牌通行证

  • Marketplace/plugin chrome CSS 删除了原始的 blue-slate 后备(#4f7cff#2a3144#121826,...),现在仅消耗 --ds-* 代币。
  • 选项卡、操作、搜索、卡片、权限模式和徽章通过中性灰色强调系统适应 light/dark。

2026-07-28 — Markdown 浅色主题纸质通行证

  • 浅色 .prose-chat / .code-block 表面针对白色聊天纸进行了重新调整:更柔和的下划线链接、平坦的灰色代码卡(无泥泞阴影)、更安静的 blockquotes/tables/kbd/math 和二次思维墨水。
  • 深色降价处理在精神上没有改变(插入木炭代码,通过accent-soft的浅灰色链接)。

2026-07-28 — One Dark Pro 代码高亮

  • 聊天围栏突出显示从 demo.workspace-summary/market.getDetail 切换为 PI-Desktop/--text-base
  • 代码卡绘制单个编辑器表面(#fafafa / #282c34);嵌套的 PI-Desktop/--text-base/token 背景强制透明,因此不会出现双重清洗。

2026-07-28 — 禁用可编辑字段的文本更正

  • 共享 Input/Textarea 原语默认为 spellCheck={false}autoCorrect="off"autoCapitalize="off"
  • 输入框、消息编辑、palette/search 字段、settings/plugins/projects 搜索、模型搜索、浏览器 URL 栏和提供商模型组合遵循相同的合同。
  • 决策 D145:browser/OS 拼写和自动更正 chrome 在桌面 shell 中保持关闭状态。

2026-07-28 — 启动启动画面和动作令牌

  • 引导路径绘制 StartupSplash(品牌标记、外壳名称、标语、进度条),直到 host/settings 引导程序完成。
  • 共享 CSS 动作令牌和 overlay/surface 输入关键帧、抛光对话框、搜索、Toast和交互式填充。
  • 决策 D146:飞溅是带有减少运动安全退出的启动反馈;目录获得 app.uiCrashed 并完成 zh-CN empty-home/custom 副本。

2026-07-28 — 交互细节完善

  • 主题感知 ::selectioncaret-coloraccent-color 将 copy/edit 镀铬保留在中性灰色强调坡道上。
  • 悬停填充最新跳转、停止、composer-plus、搜索行、profile/notification 菜单和工作面板选项卡关闭使用共享动作令牌。
  • :lang(zh-CN) 下的 CJK 部分标签使用正常跟踪,无需强制大写。
  • 空主堆栈间隙固定为 24px;使用悬停拇指将滚动条细化为 8px;品牌芯片半径采用--radius-sm
  • 决定 D147。

2026-07-28 — 工作面板/设置光表面抛光

  • 轻型工作面板使用安静的 #fafafa 插入列,带有白色标题带,因此它与白色聊天纸分开,没有厚重的边框。
  • 浏览器 URL、通用字段控件、快捷键键帽、分段轨道和切换旋钮接收浅色主题表面和与设置药丸对齐的对焦环。
  • 文件树、差异标头、调整大小手柄和目标过滤器可通过共享运动令牌轻松悬停填充。
  • 浅色对话稀松布软化至 28% 墨水,因此升高的白色对话保持可读性。
  • 决定 D148。

2026-07-28 — 面向用户的 i18n 复制通行证

  • 英语和中文目录重写了高流量的 shell 副本,使其远离内部 行话:本地服务代替 host/backend,AI 提供商代替裸机 提供商、项目而不是用户字符串中的工作区、市场刷新 而不是“来自仓库”,临时聊天,以及更平静的 status/error 措辞。
  • 空状态、入门、设置帮助、插件权限和通知 用简单的语言解释结果,同时保持稳定的 i18n 键和 插值名称。
  • 决定 D149。

2026-07-28 — Composer 运行时芯片下降

  • 模型、模式、思维、权限芯片不再使用leading-none下 溢出剪裁;标签使用 --leading-compact,因此下行部分保持可见。
  • 长模型 ID 仍然通过 .model-chip-label 水平椭圆化。
  • 决定 D150。

2026-07-28 — 发送重新固定的文字记录如下

  • 从发送、重试或重新生成开始一轮重新固定记录并 即使用户向上滚动浏览历史记录也会跳到底部。
  • 流跟随仅在活动回合期间手动滚动时保持暂停; 跳转到最新的药丸仍然会继续执行,而不会开始新的回合。
  • 决定 D151。

2026-07-28 — 直接运行时流渲染

  • 助手响应现在直接显示运行时的渐进块 通过增量 Markdown 块缓存,无需每帧第二个 React 状态循环。
  • Renderer CSP 仅允许本地和 Vite 内联数据字体,允许捆绑 KaTeX 字形无需打开远程字体源。
  • 决定 D152。

2026-07-28 — 推理课程默认为最大思考

  • 新会话继承应用程序的默认模型并选择其最高的 当该模型支持推理时,pi-发布了思维水平。
  • 非推理或未解决的模型保留 off,而现有会话保留 他们储存的思维偏好。
  • 决定 D153。

2026-07-28 — 工作面板活动导轨

  • 开放的工作面板现在将审阅、终端和浏览器保持在紧凑的状态 44 像素活动导轨,具有清晰的 active/open 状态。
  • 内容标题显示活动资源,直接关闭,并使用 用于所有打开的工具和文件资源的有界键盘可操作切换器。
  • 以前的水平滚动选项卡和隐藏的标题上下文菜单是 删除;工件驱动的面板打开和会话所有权保持不变。
  • 决定 D154。

2026-07-28 — 侧边栏 project/session 列表类型密度

  • 侧边栏项目组标题和 session/thread 标题第一步标记更安静 比以前的机身镀铬尺寸如此密集的列表扫描得更干净。
  • 会话标题使用 --text-md (13px); project/group 标题和空状态 复制使用 --text-sm (12px)。主要镶边(新任务、插件、页脚)保留 在 --text-base
  • D155决定;扩展侧边栏的主要列表被 D159 取代 内容。

2026-07-28 — 独立窗口和工作面板调整大小

  • 本机窗口边缘现在仅调整 Electron shell 的大小;工作面板打开, 折叠、关闭和分隔符提交使外部边界保持不变。
  • 分隔线使用锚定指针增量、帧合并预览、回滚 取消,以及更广泛的稳定命中区域。不再有响应式夹紧 覆盖保留的首选宽度。
  • 删除了渲染器到主 window/resizeBy 通道,以编程方式调整大小 归因和面板特定的窗口状态偏移。
  • D156决定; ADR 0029。

2026-07-28 — 每个用户轮流使用单个助手工具栏

  • 由工具调用分隔的提供商级助理消息仍然是规范的 模型重新播种、持久性和分叉边界的转录记录。
  • 聊天记录由一条之后的每一条 assistant/thinking/tool 记录组成 用户消息和下一个之前变成一个视觉助理,保留 订单,同时公开一个聚合元行和一个 Copy/Fork/Retry 工具栏。
  • 复制加入所有内容丰富的辅助片段;分叉并重试目标最后一个 内容丰富的助理记录。决定 D157。

2026-07-28 — 回合边界上下文检查点压缩

  • PI-Desktop 现在会在每个 turn_end 之后、下一个之前评估上下文 提供商请求,具有短暂的软提醒和确定性的硬提醒 检查站警卫。
  • 持久的检查点记录重建模型上下文,无需删除或隐藏 可见的文字记录消息;精确的提供商溢出收到一个压缩的 重试。
  • 该实现重用 pi-agent-core 原语。 OpenCode DCP 仍然是 AGPL-3.0 行为参考,不是依赖项或复制的实现。
  • D158决定; ADR 0030。

2026-07-28 — 侧边栏排版与全球身体比例一致

  • 扩展侧边栏会话标题返回 --text-base (14px),与 应用程序主体和主侧边栏镀铬; project/group 标题和空状态副本 返回到相邻的 --text-md (13px) 层。
  • 部分标签和辅助元数据保留在 --text-sm (12px),并且 现有的紧凑行间距、截断和侧边栏尺寸保持不变。
  • D159决定;取代 D155 并恢复 D144 的主要列表层次结构。

2026-07-28 — 无图标的输入框提示行

  • 主目录和线程停靠的输入框提示行不渲染领先的品牌图标; 草稿文本和占位符墨迹直接与输入装订线对齐。
  • 规范徽标保留在主页英雄、侧边栏、本机应用程序中 身份、启动画面和关于表面。会话创建控制保留 他们专用的消息加号图标。 D160 决定; ADR 0031。

2026-07-28 — 平滑最新胜利会话切换

  • 会话行现在立即确认最新选择,预取 深思熟虑的 hover/focus,合并详细信息,并保留最近的五个 用于温暖重访和背景重新验证的成绩单。
  • 取代的转录读取不再阻止最新的请求。工作空间 在摘要元数据允许的情况下,对齐与转录本 IO 重叠,而 导航生成仍然拥有唯一可见的提交。
  • 之前的完整文字记录保持为灰色、非交互式框架 而 React 准备更改会话的 Markdown 树;减少运动使用 静态进度轨迹。决定 D162。

2026-07-28 — 紧凑的侧边栏会话标题

  • 扩展侧边栏会话标题使用 --text-md (13px),与紧凑型相匹配 project/group 层,而主要操作和页脚标识仍保留在 --text-base(14 像素)。
  • 保留行高、截断、缩进、粗细和侧边栏尺寸 不变。
  • D161决定;优化了 D159 的会话标题大小。

2026-07-29 — 固定工作面板的本机宽度预留

  • 对接面板现在在打开时保持其承诺的 364..720px 宽度; 本机边缘仅调整 MainChat 的大小。
  • 打开、collapse/final 关闭和分隔符提交设置一个幂等本机宽度 目标。当工作区可以保留完整宽度时,聊天保持稳定 仅吸收否则不可避免的短缺。
  • Maximized/fullscreen 几何等待正常状态。持续的基界 排除预留 width/x 移位,并且背景工件无法更改 可见目标。
  • D163决定; ADR 0032(窗口扩展部分被 ADR 0033 取代: 工作面板是一个内部扩展坞,永远不会扩展操作系统窗口)。这个 取代 D156 和 ADR 0029 的相反部分。

2026-07-29 — 双区域设置应用内产品变更日志

  • packages/shared 中发送 EN + zh-CN 产品亮点并将其附加到 UpdateState.releaseNotes 从 Electron Main 当发现更新时。
  • 更新横幅和设置 → 信息显示紧凑的新增内容列表 没有新 Feed 或 IPC 域的活动产品区域设置。
  • 发布标记需要在标记构建之前更新两个区域设置目录。
  • D164决定;扩展 D120/ADR 0022。

2026-07-29 — 发布流程:强制双区域变更日志门

  • 稳定的应用程序版本颠簸/标签必须更新 标签前的 packages/shared/src/changelog.ts (EN + zh-CN);运输 没有目录条目是发布过程失败 (D164)。
  • 编入发布运行手册§4.1,人工智能开发工作流程矩阵+ 禁止的做法、更改清单、AGENTS.mdscripts/release.mjs 头因此特工和人类撞到了同一扇门。
  • GitHub 自动生成的发行说明仍然仅限网络。

2026-07-29 — 上下文检查点中的有界原子工具批次

  • 自动压缩现在限制了超大的最终并行工具结果 在检查点副本中进行批处理,而不是重复失败 转录本边界。
  • 保留的副本保留每个 call/result 信封,分发文本 使用显式 head/tail 截断标记公平地预算,并省略重复项 与提供商无关的详细信息;原始成绩单行保持完整。
  • D158决定;修改了 ADR 0030 之前阻止不可分割的政策 批次位于保留尾盖上方。

2026-07-29 — 助理答案中的安全懒人美人鱼图

  • 通过动态方式完成答案散文渲染中的 mermaid 栅栏 仅在视口附近加载、主题感知的美人鱼块;部分流和 思考散文仍然是源代码。
  • 渲染被序列化并限制在 20,000 个源字符/500 个边缘。 严格的 Mermaid 配置加上 DOMPurify SVG 清理会删除链接, DOM 插入之前的嵌入媒体、外部 HTML 和 URL 属性。
  • 无效或过大的图表通过复制和视图控件回退到源; 没有 IPC、存储、进程、CSP 或外部网络边界更改。
  • 决定 D165。

2026-07-31 — 更薄的默认工作面板宽度

  • 停靠的工作面板现在以 280 像素打开,而不是 420 像素,第三窄, 其固定夹变成244..720px
  • WORK_PANEL_DEFAULT_WIDTHWORK_PANEL_MIN_WIDTH(渲染器和 Electron Main) 和 .work-panel CSS 底板保持同步;分隔符双击 恢复新的默认值。
  • D154 的 364 像素地板尺寸适合 320 像素内容旁边的 44 像素活动导轨; 导轨变成了标题切换器,因此地板按默认比例缩放。
  • 持续更宽的宽度仍然有效,并且 720px 最大值保持不变。
  • D167决定;取代 D154/D163 和 ADR 0033 §4 中的宽度限制。

2026-07-31 — 项目档案演示重新设计

  • 设置 → 项目档案被重建为三个带:一个概述横幅 四个派生计数器、一个搜索 + Recent/Name 排序工具栏和一个分组 索引按固定/所有项目/按部分计数存档的顺序排列。
  • 行获得始终可见的披露控制、状态标签、单个元行 (路径、分支、会话计数)、相对上次活动时间和快速新建 行菜单旁边的任务操作;菜单现在将 create/edit 分组到引脚上方, archive/restore,以及按 Escape 或外部按键关闭并解散。
  • 归档记录保持分组和软化而不是过滤,因此 目的地仍然没有可见性切换(D133)。项目存储、搜索 匹配、八个批次的会话显示和激活语义是 不变。
  • D168决定;取代 D133 的平面列表演示。

2026-07-31 — 插件页面重新设计(演示文稿由 D196 修改)

  • 原始插件页面被重建为四个带:一个概述带,带有四个派生带 计数器(已安装、已启用、更新、高风险访问),一个保留的标头 一个上下文主要操作和移动检查更新/应用自动更新/ install-package / load-local 进入溢出菜单,分段 安装/市场开关承载计数,以及选项卡主体。
  • 安装的行按状态分组为需要注意/可用更新/ 在一个细细分隔的面板内激活/关闭。 状态:“错误” | “load_error” and errorMessage 现在浮出水面而不是被删除;行 操作折叠为悬停显示的面板按钮和溢出菜单 (自动更新、作为危险项目卸载)位于始终可见的开关旁边。
  • 权限按风险列分级 07-plugins/13-plugin-permissions-matrix.md:带有塌陷风险的筹码 溢出在行以及详细信息表中的高/中/低部分以及 安装对话框。升级评论标签权限新版本添加为New, 安装队列根据差异删除声明的集合的重复数据。
  • 详细信息从嵌套侧边栏移至右侧表(稀松布、Escape 和 外部按下关闭、粘性安装操作、可选版本行)。 市场卡呈现字母组合字形并且从不获取 iconUrl,因此 渲染器不执行远程图像加载。
  • D169决定;取代平面列表、药丸选项卡和内联详细信息窗格 07-plugins/07-plugin-marketplace.md §7/§14。

2026-07-31 — Renderer 样式表拆分为每个表面的部分

  • apps/desktop/src/styles/globals.css 成为仅导入入口点。的 规则移入同一目录中的 22 个部分,每个部分拥有一个表面: tokensbasechromechat-shellcomposersidebar-threadsmessagesproseui-kitoverlaystheme-overridescomposer-menussettingsdestinationsprojectssessionswork-panelproviderschat-linkscomposer-autocompletepluginsresponsive
  • 导入顺序级联,不得重新排序:令牌和基础 首先,按构建顺序排列特征层,响应/减少运动尾部 最后,所以它仍然可以覆盖它之前的内容。
  • 分割是连续的——没有规则改变相对于另一个的位置。的 连接的部分文件逐字节地再现预分割文件,并且构建的 渲染器 CSS 前后字节相同,因此 Tailwind v4 解决了 @theme 块与 tokens.css 相同。
  • 样式断言通过加载有效级联 apps/desktop/test/helpers/styles.mjs,内联本地 @import 按声明顺序排列的行。测试不得直接读取部分内容。
  • 侧边栏会话样式同时存在于 sidebar-threads.csssessions.css 中 因为原始文件将它们交错;文件头交叉引用。
  • 设计令牌量表现在位于 styles/tokens.css 中;守卫在 scripts/check-style-tokens.mjs 遍历整个 src 树并且不受影响。
  • D170 决定; 04-ux/07-ui-design-system.md 假定的单文件布局 §版式和 04-ux/08-component-spec.md 不再适用。

2026-07-31 — 插件技能激活和插件开发套件

  • contributes.skills 已激活。 PluginRuntime.getSkills() 读取每个 在提示时声明技能文件,仅适用于授予的插件 agent.prompt.inject,并且只能通过收容守卫门控 fs API 使用。代理运行时呈现 # Plugin skills 部分,上限为 总共 16 KiB,每项技能 8 KiB — 它自己的预算,而不是 32 KiB 指令 ADR 0037 链 — 并将其排序在内置技能之后但之前 项目说明,因此用户自己的文件拥有最终决定权。运行时重用 技能摘要上的键,因此启用插件、撤销权限,或者 编辑技能文件会淘汰空闲运行时间,而不是重用陈旧的运行时间 提示。缩小路线图差距 R2。
  • 插件创作作为第一方包 @pi-desktop/plugin-devkit 提供, 它拥有 scaffold / check / pack 共享的一个实现 pi-plugin CLI,PluginScaffold / PluginCheck / PluginPack 代理 Electron main 提供的工具,以及插件页面的新插件 模板动作。 check 重现 host-core 强制执行的规则,因此通过 这意味着安装将通过; pack 仅写入存储(方法 0) .piplug 条目,因为 extract_zip_bytes 不接受其他任何内容。缩小路线图差距 R3 的模板和 contributes.skills/PluginRuntime.getSkills() 项。
  • 捆绑插件被拒绝作为交付工具:插件无法生成 .piplugHOST_API_ALLOWLIST 中没有存档 API)并且脚手架将 需要高风险 fs.write.workspace 才能获得应用程序应具备的功能 自己提供。
  • 内置 plugin-development 技能仅针对插件工作区激活 — 工作区根目录下的插件 manifest.json,或加载的开发插件 在它里面——所以一个普通的会话只需支付三个工具描述的费用。
  • 监视开发插件并在保存时热重载,去抖 300 毫秒, 忽略 node_modules / .git / dist / target,上限为 16 个插件,并且 重新启动后重新武装。重新加载永远不会扩大权限集: 将清单与选取文件夹时批准的集进行比较,然后 新权限通过 PERMISSION_DENIED 停止重新加载,同时删除 权限确实生效。重新加载失败会保留手表,以便修复保存 恢复插件,并通过 toast 和 pluginChanged 进行报告 — host-core 没有用于运行时端加载失败的 RPC,因此注册表行不会 不移动到 load_error。弥补了 R3 热重载项目的路线图差距。
  • D171决定;记录为 ADR 0039。
  • 该决定的立即注入部分于同一天被替换为 D174:技能现在以目录和 Skill 工具的形式到达模型。开发套件, 热重载和工作空间门子句保持不变。

2026-07-31 — 从模板创建插件会打开文件夹

  • 从模板创建插件现在还会打开所选文件夹作为 活动项目(workspace.set,它注册项目并切换到 聊天),而不仅仅是作为加载的开发插件。加载仅使插件 跑;开发需要工作空间内的源、代理、文件 面板和内置 plugin-development 技能均已读取,并且需要 用户通过“打开文件夹”重新选择同一文件夹纯粹是摩擦。
  • 激活通过现有的 activateProject 在渲染器中运行 操作而不是来自模板 IPC 处理程序,因此项目状态、侧边栏 项目列表和导航意图防护保持其单一所有者。
  • 成功 toast 区分两种结果:如果文件夹不能 作为项目打开,插件保持加载状态,Toast仅说明这一点, 而不是声明一个不存在的工作空间。
  • 加载现有的本地插件文件夹(加载本地插件)故意保留 它当前的行为:运行别人的插件不是切换的理由 用户的项目。
  • D172决定;无 ADR — 这完成了 ADR 0039 描述的流程。

2026-07-31 — 工作面板标题菜单:工具优先,无重复条目

  • 统一的标题菜单列出了四个工具(审阅、终端、浏览器、 文件)首先,按固定顺序,然后 - 在分隔符之后,并且仅当 它们存在——文字记录打开的资源。列出之前的布局 每个打开的工具两次:一次在资源切换器中,另一次在 创建新部分,这使得“打开”和“切换到”无法区分。 现在,每个工具行都有自己的打开状态和关闭控制,因此 单行是该工具的全部功能。
  • 激活已打开的工具会激活其现有选项卡,而不是激活 将其替换为新的单例,因此浏览器保留其 URL。标题 操作簇固定在右侧 (margin-left: auto),因此 close/collapse 控件不再随标签长度滑动,并且尾随关闭插槽 每行始终保留,因此标签和空心点永远不会移动。
  • 菜单行拥有真正的 DOM 焦点(WAI-ARIA 菜单模式)而不是移动 突出显示:触发器的 ArrowDown/ArrowUp 在活动行或最后一行上打开, Arrow/Home/End 仅遍历行,Delete/Backspace 关闭焦点行,同时 菜单保持打开状态,重点关注其邻居,并且 Escape/Tab/selection 将焦点返回到触发器。仅会话切换即可关闭菜单 隐式 — 选择一行会显式关闭它,因此前一个 活动标签键自动关闭(每当背景工件出现时就会触发 更改了活动选项卡)消失了。
  • 缺少 panel.tabs.file 是裸文件选项卡显示文字的原因 file 标签;目录现在包含它加上 panel.tools,以及过时的 panel.openTool 已删除。
  • D173决定;无 ADR — 仅在 现有的工作面板架构(ADR 0033)。

2026-07-31 — 插件技能是模型调用的

  • contributes.skillsagent.prompt.inject 之后的加载时间被激活。 每个条目可能是一个路径或{ path, id?, name?, description? };头条新闻 文档中提供 name / description,而清单中没有。
  • 基本系统提示仅包含一个目录 - 技能 ID、名称和 描述被削减至 240 个字符。正文不在提示中;模型 通过 Electron main 在本地提供服务的内置 Skill 工具获取一个 针对 plugins.loadSkillBody(id),因此 sidecar 永远不会保存技能文本。
  • 上限:每个插件 32 个技能,每个文档 128KB。清单没有 agent.prompt.inject 仍然有效——技能早于许可门——并且 运行时只是跳过它们。
  • 技能 ID 加入 packages/agent-runtime/src/runtime.ts 中的运行时重用密钥, 因此启用或禁用插件会重建运行时而不是服务 陈旧的目录。
  • 拒绝:面向用户的斜杠命令。技能是座席应具备的指导 当任务需要它时就可以到达,而不是用户必须知道存在的命令。
  • D174决定;弥补了“已解析但从未激活”的差距 07-plugins/14-plugin-roadmap.md R2。

2026-07-31 — 插件主题附带 CSS 文件

  • contributes.themes 声明 { id, label, path, base? } 并要求 ui.themepath 是与插件相关的 .css 文件; base (light | dark, 默认 dark) 命名覆盖图层所在的调色板。
  • 主进程读取文件并运行 sanitizeThemeCss():无 @import,无 url()data: 之外,没有不可解析的 url(,没有 javascript: / expression(,无标记序列,256KB 上限,每个插件 8 个主题。的 渲染器通过 plugin/themes 接收完成的文本并将其注入到一个 <style id="pi-plugin-theme"> 附加在应用程序自己的样式表之后。
  • AppSettings.theme 扩大为 plugin:<pluginId>:<themeId>。当提供 插件被禁用、卸载或加载失败,应用程序回退到 system 而不是渲染无样式的外壳。
  • 被拒绝:令牌-JSON 贡献。验证会更安全,但是 它只能表达我们想要枚举的标记;样式表可以让 主题到达令牌列表忘记的表面,并且消毒剂加上 附加顺序规则将风险限制在外观上。
  • 决定 D175。

2026-07-31 — 通过 stdio 和远程 HTTP 插件 MCP 服务器

  • contributes.mcpServers 声明 { id, label?, transport } 加一 传输字段:stdio 需要 command / args / envhttp 需要 url / headers。权限是独立的:mcp.server.local 用于 stdio, mcp.server.remote 为 HTTP。
  • apps/desktop/electron/main/plugin-mcp.ts 讲协议 2025-06-18initializetools/listtools/call — 作为通过 stdio 或流传输的 NDJSON HTTP/SSE。预算:10 秒连接,每次调用 100 秒,8 个 tools/list 页,每个 4MB stdio 系列,每个服务器 64 个工具,每个插件 8 个服务器。连接是惰性的; 卸载后进行拆卸。
  • 发现的工具在中注册为 plugin_<pluginIdSafe>_<serverId>_<toolName> 现有的插件工具图,因此它们继承了审计跟踪、超时和 禁用交换机,没有新的路由。它们始终是 risk: "medium": 架构和描述来自第三方,因此自我声明的风险级别 不值得信赖。
  • envheaders 仅通过插件自己的设置进行解析 { "setting": "<key>" };主机环境永远不会被传递(D018)。 stdio 子进程获取 PATH、temp/locale 变量和声明的值 — 无 否则。 command 必须是裸路径名称或与插件相关的名称; url 必须是 https 除非主机环回。
  • 两种传输方式而不是单独的 stdio:托管 MCP 端点很常见 足以让 stdio-only 推送插件将其包装在本地垫片中, 这更糟糕——一个额外的过程和一个无法审查的代理。
  • D176决定; ADR 0038

2026-07-31 — 驻留插件服务及其重启策略

  • contributes.services 声明 { id, label?, autoRestart? } 落后 background.service,每个插件最多 4 个。插件调用 pi.services.register({ id, start, stop });经纪商在之后调用 startonLoad(5 秒预算)和 stoponUnload 之前,因此服务永远不会上线 在插件自己的生命周期之外。
  • 服务存在于插件的 utilityProcess 中,因此崩溃会导致该服务崩溃 该进程和主管重新启动整个插件:退避 1 秒、2 秒、4 秒, 8秒、16秒上限为30秒;最多 5 次尝试;能存活 60 秒的过程是 健康并且计数器重置。 autoRestart: false 选择退出。最后一次之后 尝试插件保持 failed — 可见的故障胜过无声的崩溃 循环。
  • 每个服务状态 (starting | running | stopped | failed) 和 重新启动计数通过 plugin/services 读取并呈现为芯片上的 插件页面;每个转换都会发出 pluginChangedreason: "service"plugin.service.* 审核条目。
  • 手动启用/禁用优于主管:明确的操作取消 挂起计时器并清除尝试计数器。
  • D177决定; ADR [0040] (../../adr/0040-plugin-resident-services-and-message-bus.md)。

2026-07-31 — 仅声明主题的插件间消息总线路由

  • pi.bus.publish / subscribe 需要 bus.publish / bus.subscribe a contributes.bus 中的匹配条目:发布者列出具体主题, 订户列表模式。仅授予许可不会带来任何影响,因此 清单保留了插件所说和听到的内容的完整描述。
  • 主题是点分隔的段([a-zA-Z0-9][a-zA-Z0-9_-]*,≤8 个段, ≤128 个字符)。 * 匹配一个段; ** 匹配一个或多个尾随 段,并且可能只出现在最后。
  • 路由存在于代理中。消息中携带topicfrompayload, 主机分配的 at;发布者被排除在自己的扇出之外;交货 是一种新的单向 { t: "event" } 框架的即发即忘,因此楔形 订阅者无法阻止发送者。该框架也使得之前 存根 pi.events.on / off 真实。
  • 上限:每个有效负载 64KB,每个插件 16 个订阅,每个滚动 100 个发布 10 秒窗口,因 LIMIT_EXCEEDED / RATE_LIMITED 和审核行而失败。
  • 有效负载传送数据,而不是能力:接收消息授予 订阅者没有它尚未持有的任何内容,因此主题应被视为 在应用程序内公开。
  • D178决定; ADR [0040] (../../adr/0040-plugin-resident-services-and-message-bus.md)。

2026-08-02 — Bash 工具继承用户的登录 shell 路径

  • 在 Unix 上,第一个 Bash 调用会探测用户的登录 shell 的 PATH — $SHELL(后备 /bin/zsh/bin/bash/bin/sh)带有 -lic 'printf %s "$PATH"' — so -l sources login files and -i 来源 交互式rc,匹配一个新的终端。探头限制为 5s, 每个进程缓存(OnceLock);仅保留最后一个标准输出行(rc 横幅被忽略),stderr 被丢弃(缺少 tty 噪音),并且 非零退出、缺少 shell 或超时静默回退到主机 路径。
  • 每个 Bash 子进程都会通过 cmd.env("PATH", ...); bash -lc 仍然在启动时重新运行 bash 配置文件 (conda/brew 挂钩可能会在注入的基数顶部添加 prepend/dedupe/reorder 条目)。 Agent 命令仍然是 POSIX bash;解析后的 bash 二进制文件没有改变。 Windows 使 bash -c 与主机环境保持一致(无变化)。
  • 修复了 macOS Finder/Dock 启动时 bash -lc 单独无法看到 nvm, pnpm,或在 ~/.zshrc / ~/.zprofile 中初始化的 Homebrew 工具。
  • D181决定; ADR [0045] (../../adr/0045-bash-inherits-user-login-path.md)。

2026-08-02 — 将进程日志路由到类别文件中

  • apphostagent 通道仍保留本地 NDJSON 文件,但每个通道 通道现在是包含重点 <category>.log 文件的目录。应用程序 记录使用显式 lifecycle/session/tool/permission/plugin/provider/ persistence/updater/diagnostics/terminal/runtime 类别;主机和代理 stderr 分为同一类别,时序线隔离 在 timing.log 中。
  • 每条记录都带有一个 category 字段。子 stderr 按行缓冲, 解码为 UTF-8,并在解码之前去除 ANSI 控制序列 坚持下来了。未知子输出进入 runtime.log
  • 两个旋转文件的旋转仍为 5 MB,但该限制适用于每个文件 类别文件。记录器使用 UTF-8 记录和处理的字节长度 旋转和磁盘故障尽最大努力。现有的平面日志文件不是 迁移过程中删除。
  • D182决定; ADR 0046

2026-08-02 — 上下文使用检查器

  • 用紧凑的 Codex 式触发器替换超大的上下文环 结合了剩余容量环、Context 标签和百分比。悬停 和键盘焦点打开一个带有上下文窗口的非模式面板,确切地说 提供商 input/output/cache/reasoning 使用情况,聚合生成速度 tokens/s,以及按首次执行顺序排列的每种独特的工具类型。
  • 工具行聚合重复调用并公开调用计数、参数标记、 结果代币、总估计足迹、分享条和累积已知 持续时间。运行时间估计使用 pi-agent-core 现有的四个字符 - 每个令牌启发式;提供商报告的使用量仍然是权威的总量 UI 将工具行标记为估计值。
  • 生成速度是提供商输出和最终结果的完整回合快照 流持续时间;活动助理流不显示实时令牌率 柜台。
  • 上下文窗口总计来自所使用的匹配 pi-ai 模型元数据 由Agent sidecar 提供;提供商元数据和 128K 默认值仍然是后备方案 对于未知模型。
  • UiMessage.responseDurationMsUiMessage.toolUsage 和可选 tool_end.toolUsage 事件字段是可加的,因此较旧的持久消息 并且同行仍然可读。
  • 检查器面板在文档正文级别呈现为固定的、 碰撞感知视口叠加。它遵循转录滚动和窗口 调整大小、围绕触发器翻转并夹紧到视口边缘而不是 被转录滚动容器剪切。
  • 检查器从相同的 pi-ai 模型解析其上下文窗口总数 记录传递给代理 sidecar,丰富 cached/discovered 模型行; 提供程序元数据和 128K 默认值仍然是未知模型的后备方案。
  • D184决定; ADR 0047

2026-08-02 — 延迟每回合工具激活

  • sidecar 保留完整的本地注册表,但仅发送模式的核心 工具和本地 ToolSearch 出现新提示。 (CompactContext 也被 此处始终处于活动状态,直到 D200 移除工具; D203 将其恢复为 new_context,再次始终处于活动状态。) Agent 遵循 pi 的编码代理核心 (../../adr/0047-context-usage-inspector.md/ADR/sidecar/ToolSearch),而 聊天保持 (../../adr/0047-context-usage-inspector.md/ADR/sidecar)。代理模式 ToolSearch/CompactContext, BrowserPreview、插件工具、Skill 和插件开发助手是 由有界紧凑目录条目而不是完整参数表示 模式。
  • 精确名称或功能搜索最多激活四个匹配项 下一个模型回合。 addedToolNames 允许 pi-ai 提供商使用本机延迟 搜索在加载点序列化这些定义;其他提供商使用 重建的活动刀具列表。激活会在下一个用户提示之前重置。
  • 主机权限、工作区和暂存控制、超时和审核 行为不变。持久化工具结果保留激活标记 有效的转录重建。
  • D185决定; ADR 0048

2026-08-04 — 绑定提供商流恢复和诊断

  • 提供程序请求设置现在具有一次有限的 pi-ai 重试。瞬息流, 网络,或流式传输开始后超时失败会进行同轮重试 具有短暂的可中止退避;失败的助手将从模型中删除 上下文和可见的助手 ID 被重用。
  • terminated 和等效的不完整流消息映射到 STREAM_FAILED。第二次故障仍然是终止状态并带有有限阶段, 计时、提供程序 status/code 和重试尝试诊断(如果可用)。
  • 突变恢复是明确有限的:使用 Edit 作为一个唯一的本地 替换,使用 Write 进行连贯重写,然后允许一个新的 不匹配后的 read/regeneration。第二个相同路径 Edit 失败或 失败的 shell patch 命令会发出终止工具提示,而不是 修复旧的补丁工件。
  • D186决定;请参阅 ADR 0050

2026-08-04 — 使用保留尾部恢复自动压缩失败

  • 自动阈值和提供商溢出压缩失败现在尝试 结束前确定性的、积极限制的保留尾部检查点 轮到了。先前的检查点摘要在可用时会被保留, 完整的可见转录本保持不变,并且宿主持久性加上 硬预算重新检查仍然是强制性的。
  • 摘要输入是针对模型窗口进行预检的,因此显然 过大的摘要请求会直接转到有界恢复路径 等待提供商拒绝或超时。
  • 生命周期事件用 fallback: "retained_tail" 标记恢复,因此 渲染器保持运行活动并显示警告。手动 /compact 仍然存在 快速失败,永远不会默默地放弃历史背景。
  • D158决定;修改 ADR 0030 并添加 ADR 0049。

2026-08-04 — 资源隔离主机 RPC stdio

  • Host-core 不再使用 Tokio 的 stdio 适配器作为其 NDJSON 控制管道。 一个命名的操作系统线程读取 stdin,一个命名的操作系统线程序列化 stdout, 保持每条消息的成帧和重试中断或短暂 NDJSON/EAGAIN 错误。
  • 这会关闭 Tokio 的阻塞池在发生恐慌后的进程退出路径 操作系统使用 Resource temporarily unavailable 拒绝另一个工作线程 (macOS 上的错误号 35)。未能创建控制线程将被报告为 启动错误;这不是未处理的线程生成恐慌。
  • 登录 shell 路径探测也使用 thread::Builder 并回退到 当可选帮助程序无法启动时继承的 PATH。
  • D187决定;请参阅 ADR 0051

Plan 检查点和 shell 决策 (0.4.14)

较早的本地 Plan 操作状态决策仍记录为 D188 历史。 D189 是执行机构并取代 D188 和 ADR 0052.D190定义了D189使用的shell执行合约。仅限代理 并行制定的决定重新编号为 D191 (ADR 0055) 并被取代 由 D188/D189 提供;随之而来的三个决定为 D192, D193 和 D194。

身份证号主题决定基本原理
D188将聊天配置文件替换为 Plan 状态(被 D189 取代) **PI-Desktop 有 1 个 pi Agent 和 1 个产品选择器:`Agent计划. Plan is that Agent after entering planning state, never a second Agent, planner model, planner service, or permission mode. Agent remains the default. Persisted sessions, app defaults, and scheduled values stored as 聊天migrate to计划; the internal 页面 = “聊天”route may remain as a conversation-surface detail. Plan exposes读取, Glob, Grep, 浏览器预览, Bash, CompactCon text, and ExitPlanMode; it denies Write, 编辑, plugin tools, and unknown tools. Plan retains permission-mode selection: Bash prompts under askandaccept-edits, and runs without confirmation under auto`,因此 Plan 是计划意图而不是严格的只读安全配置文件。**
D189Plan 检查点工件、批准和执行纪元**相同的 pi Agent 使用 `AgentPlan, with Agent default. Plan calls SubmitPlan(标题, markdown, 问题)as the only tool in its assistant batch. Rust host-core writes the submitted Markdown bytes unchanged to a new immutable unique file under<workspaceRoot>/.pi/plan/*.md; it stores the relative artifact path, SHA-256, and byte size together with structured title/question fields in the existing plan_approvalsrow. No title/question wrapper is added and no prior artifact is replaced. The approval surface displays title, question, an artifact opener, absolute expiry, and status, and offers only Approve or Reject. Approve requires an explicitask, accept-edits, or autopermission mode, with Ask selected by default; Reject carries no mode. The approval expires at one absolute 30-minute deadline and usesPLAN_APPROVAL_TIMEOUT. The same plan_approvalsrow carriesexecution_idandexecution_statethroughqueued → 运行 → 已完成
D190可选择的命令 shell 目录和执行标识主机核心公开稳定的平台感知目录 ID:windows-powershellcmdgit-bashbash;平台目录仅包含该平台支持的 ID。 defaultCommandShell 保留在主机设置中,并且设置写入拒绝不可用或错误的平台 ID。如果持久选择稍后变得不可用,则有效 shell 会有意回退到第一个可用的平台 shell。 Bash 工具和 tools.execute 协议名称保持不变;每个回合都会固定有效的 shell ID 和方言,并且主机在使用 COMMAND_SHELL_CHANGED 生成之前拒绝过时的 ID/dialect。 Shell 标识是目录选择,而不是可执行路径哈希。 Bash 分别流式传输 stdout 和 stderr,使用强制的 60 秒默认超时和 1-300 秒覆盖,并且 cancellation/timeout 关闭完整的进程树。用户可以选择命令语言,而无需增加协议工具,而平台验证、显式回退和转固定目录身份可保持执行的可预测性

2026-08-05 — 仅代理模式

  • agent 是唯一的会话模式。之前的 chat 配置文件已重命名 read-only; host-core 仍然强硬否认 Write/Edit/Bash 对此,但什么也没有 在 UI 中可以选择、显示或命令它。
  • 模式门到处都是负值(mode != "agent" → 只读表面) 并且 chat 在每个主机写入路径上标准化为 read-only,因此遗留或 未知值失败关闭而不是拓宽工具。
  • BASH_DISABLED_IN_CHAT / WRITE_DISABLED_IN_CHAT 成为 BASH_DISABLED_IN_READ_ONLY / WRITE_DISABLED_IN_READ_ONLY
  • 数据库打开重写 sessions.mode = 'chat' 和存储的 defaultModechatagent — 架构 v7 内的数据修复,而不是版本碰撞。
  • D191决定,由D189取代;看到 ADR 0055。它删除了模式概念 返回为 Plan (D188/D189, ADR 0052/0053);该条目被保留,因为 read-only 规范化和它所描述的 chat 修复已发布。

2026-08-05 — 记录中的结构化工具结果呈现

  • 扩展工具行不再呈现参数的 JSON.stringify 和 结果。纯渲染器模块将每个已知的有效负载映射到标记块:文件 并将内容编写为突出显示的代码,将命令编写为 shell、stdout 和 stderr 作为单独的块,Glob 结果作为可点击路径,Grep 命中按每个分组 文件,失败作为错误注释。未映射的插件有效负载降级为 label/value 字段和标记块;只有嵌套对象才会保留 JSON 主体。
  • pi-ai 结果包络携带 details 中的结构化有效负载, 将其重复作为模型的文本。仅渲染结构化的一半,因此没有 字节显示两次。
  • 折叠的行携带结果芯片(退出代码、match/file 计数、替换 计数、写入或读取大小、truncatedscratch),因此读取结果时无需 扩大。成功退出不会获得任何筹码。
  • 搜索结果遵循主机的 outputMode:分组命中、路径列表或 每个文件的总计。主机 notice(范围、剪裁线、读取窗口)渲染 作为它所限定的块下的中立注释,绝不作为错误。
  • 仅当没有 ReviewChangeCard 拥有一个时,编辑行才绘制自己的差异,保持 工作区编辑单一来源。内联权限卡共享相同 块渲染器的参数预览。
  • 块仅基于扩展构建,并且突出显示超过 100 KB 或 800行;列表和差异有上限并报告隐藏的剩余部分。
  • D192决定;仅呈现器演示,因此没有 ADR。参见 04-ux/08-component-spec.md §9 和 E2E-097。

2026-08-05 — 无声助手在出现错误之前重新运行一次

  • 不再报告以没有工具调用且没有可见文本结束的回合 一样完整。运行时将空助手从模型上下文中弹出, 将无输出微移附加到系统提示符,并调用 agent.continue() 一次 - 重用可见的气泡 ID 并吞掉第一次尝试的 turn_end / agent_end,因此用户看不到成功的恢复。
  • 即使存在推理内容,空白可见文本也会触发它。的 观察到的失败正是这种形式:一个 2830 个字符的结论 思考和一个空的 text,对用户来说什么也没有。时机 log 保留 thinkingOnly,因此这两个形状保持可区分。
  • 微调位于 state.systemPrompt 而不是 prepareNextTurn, 仅塑造飞行中的回合,一旦循环,其上下文就会被丢弃 停止。仅当仍然不变时才恢复,因此并发提示重建 获胜。
  • 第二次沉默结束:可重试 EMPTY_MODEL_RESPONSE, 现有的助手错误行通过“重试”操作进行呈现。每重新运行一次 提示,因此同一提示中的溢出恢复不能多次尝试。
  • D193决定;恢复现有循环合约内,因此没有 ADR。参见 03-runtime/02-agent-runtime.md §5e、03-runtime/08-error-codes.md §3.2、 和E2E-098。

2026-08-05 — 每个工具的输出预算、范围搜索和规定的协作规则

  • 单个 256KB/4000 行上限被每个工具预算取代:48KB Read/Glob/Grep,Bash 标准输出 96KB,Bash 标准错误 96KB 尾部保留,2000 每行字符无处不在。搜索结果可重新获取——缩小搜索范围 模式,提前抵消——这样他们就赚得更紧的一半;失败的 命令的最后一行是可操作的行,因此 stderr 保留其尾部。
  • Read 使用 offset / limit 进行分页,并且从不拒绝文件大小。的 旧的 >512KB 拒绝说“使用 Grep 或 Bash 对其进行采样”,这就是 无分页读取成为无界 sed 管道。 GreppathincludeoutputModeheadLimitGlobpathlimit;两者都订购 按修改时间,最新的在前。
  • 显式 path 禁用父忽略文件。如果没有这个,范围 搜索 node_modulesdist 返回零并将模型推回到 shell — 并且 Grep 无法读取自己的溢出文件。
  • 超出预算的 Bash 输出溢出到每个会话的暂存目录中,因此标记 命名一个真实的文件。 Read/Glob/Grep 未嵌入任何标记:content 保留 字节忠实,因此从中复制出来的文本仍然与 Edit 匹配,并且 窗口元数据加上 notice 具有与同级字段相同的事实。
  • 系统提示现在直接说明协作规则 - 在 用户的语言,每个工具批次之前的一句话,最多不超过一个批次 没有可见的文字,用文字回答而不仅仅是推理,完成结束 结束 — 并指出相对于 shell 等效工具,对作用域工具的偏好。 “更喜欢简洁、可行的答案”是唯一的附近规则,并且是一个推理 模型执行它时什么也没说。
  • D194决定;工具模式在不破坏调用者的情况下扩大,并且提示文本是 不是接口,因此没有 ADR。请参阅 03-runtime/16-tool-result-limits.md03-runtime/02-agent-runtime.md §7 和 E2E-099。

2026-08-05 — 用户拥有的 MCP 服务器和技能,范围按项目划分

  • 插件、用户 MCP 服务器和用户技能现在共享一种激活形状: enabled 加上 { mode: "global" | "projects", projects: [] }。布尔值 与范围保持分离,因此关闭某些内容可以保留项目 缩小到的列表,off / projects / global 控制 UI 渲染是从该对派生的,而不是存储为第三种模式。
  • 匹配不区分大小写且不区分尾随分隔符,因为 macOS 和 Windows 都为我们提供了一个目录的大小写不同的拼写,以及一个作用域 路径覆盖其子目录,因此不必列出 monorepo 根目录 逐个封装。 projects 范围的扩展在会话中处于非活动状态 没有项目:“这些项目”是关于项目的声明。
  • 当构建每回合目录时会检查范围并在调度时再次。 会话的寿命比列出其工具的提示要长,并且模型可以使用工具 see 是一个它将尝试调用的工具,因此在一个地方进行过滤会留下一个漏洞 在重新确定范围和下一个提示之间。主题保持未定范围——外观是 应用程序范围内的功能,而不是每个项目的功能。
  • 添加 MCP 服务器很简单。 parseMcpImport 读取 mcpServers 记录每个自述文件打印以及 servers、裸图和单一对象 变体,从 url 推断 http,因为一半的配置省略了 type,并且 报告每个条目的跳过原因,因此十五分之一的错误条目并不致命。
  • 用户 MCP 服务器在首次使用时连接并缓存其工具;失败的 握手一直失败,直到用户对其进行编辑或按“测试”。保存更改 服务器是什么会断开连接,重命名它不会 - 陈旧 工具清单比缺少工具清单更糟糕。
  • 用户技能是一项 SKILL.md。 D174 的合约未受影响,这就是为什么 编辑器需要一个描述并将其放在正文上方:描述是 唯一进入提示的部分。
  • 四个选项卡而不是一个合并列表。插件已安装,MCP 服务器已安装 配置好,技能写好;他们的行需要一个连接灯,一个字节 分别是计数器和权限矩阵,一个列表将隐藏所有 位于最低公分母行后面。
  • D192、D193、D194 号决定;新的 host-core 注册表、新的 RPC 方法和 新的主进程运行时,因此 ADR 0053。请参阅 07-plugins/01-plugin-system.md07-plugins/03-plugin-api.md

2026-08-05 — 权限控制的外部路径和可移植的本机搜索

  • ReadGlobGrepWriteEdit 的显式 path 参数为 根据持久会话工作区进行分类并之前从头开始 正态风险矩阵。在 askaccept-edits 中,外部路径发出 具有所请求路径预览的现有权限卡;在 auto 中,它 无卡执行。允许一次和现有工具范围 允许会话授予仍然可用,而拒绝、超时和取消 返回 TOOL_DENIED 而不触及路径。
  • 批准的解析器再次规范化最深的现有祖先 执行时间,因此 .. 和符号链接转义无法跳过边界。的 外部位置不会提升为工作空间根目录;外部读取和 搜索保留绝对路径,外部突变保留在审阅之外 和工作区工件记录。
  • sidecar 公开主机的有界搜索控件(Read.offset/limitGlob.path/limitGrep.path/include/outputMode/headLimit) 规范的 filesWithMatches 拼写;主机标准化公共 files_with_matchesfiles-with-matches 提供商别名。指导 更喜欢本机工具和可移植工作空间相对路径,以及 shell 搜索 作为有界的、特定于平台的后备。
  • D195决定;外部路径能力和扩大的搜索模式发生变化 host/runtime 边界,因此 ADR 0057。请参阅 03-runtime/03-tools-and-permissions.md03-runtime/06-host-rpc-protocol.md03-runtime/15-workspace-ignore-rules.md03-runtime/16-tool-result-limits.md、 和 E2E-019/E2E-019e。

2026-08-05 — 扩展页面密度和主题可读操作

  • 扩展目标不再呈现四张数字概览 乐队。已安装、MCP、技能和市场仍然是单独的选项卡;选项卡 计数、已安装状态组计数和待更新警报保留 可操作状态,无需将其复制到静态摘要行中。
  • 共享主要和次要按钮使用语义重音、表面、文本和 边界令牌。主要操作反转当前主题表面;中学 动作在两个主题中都保持不透明的升高表面和可见边框。
  • 决定 D196 修改了 D169 的表述部分,但没有改变 插件、MCP、技能、市场、权限或运行时合约。请参阅 ADR 第0058章 07-plugins/07-plugin-marketplace.md 和 E2E-024N/E2E-060b。

2026-08-05 — 剪贴板文件成为会话临时引用

  • 输入框现在可以区分本机文本粘贴和剪贴板有效负载 包含文件或图像。文件字节仅在之后发送到 Electron main 渲染器有一个持久的会话ID;家庭输入框创建或重复使用一个 转移之前。
  • Main 验证会话并在下面写入有界的、唯一命名的文件 <data_dir>/scratch/<sessionId>/pasted/。该草案收到普通 @absolute/path 引用,并引用空格,因此现有 Read/Glob/Grep 路径语义处理粘贴的材料,无需二进制文件 提示内容或项目突变。
  • 决策 D197 和 ADR 0059 定义新的 renderer/main 边界。参见 04-ux/08-component-spec.md §11.7–11.8, 03-runtime/01-ipc-protocol.md §13c, 03-runtime/03-tools-and-permissions.md §4b, 03-runtime/04-data-storage.md 和 E2E-102。

2026-08-06 — Goal 模式加入 Plan 作为合约模式

  • 会话现在保留三种操作模式之一:agentplangoal。 Composer 左芯片周期 Agent → Plan → Goal → Agent,并且 /goal-mode (builtin.mode.goal) 是其 palette/slash 条目。
  • Goal 协商目标声明、验收标准和边界 的有序步骤。 EnterGoalModeSubmitGoal 镜像 EnterPlanModeSubmitPlan,写入 .pi/goal/<unique-name>.md 和一个待处理的 plan_approvals 行。 plan_approvals.kind(架构 v11)是唯一 鉴别器;针对另一种类型运行的提交工具失败 PLAN_KIND_MISMATCH
  • Plan 和 Goal 是合约模式。主机硬否认 Write/Edit/plugin/unknown 工具、Bash 遵循权限模式规则、 *_IN_PLAN 错误代码、单一待批准不变量以及 PLAN_REQUIRES_INTERACTIVE_SESSION 拒绝预定运行均适用于 两者均根据会话的持久模式进行评估。
  • 批准后,会话变为 Agent 并且排队执行携带 种,因此 Goal 运行会选择自己的方法,对每个方法进行自我检查 接受标准,在规定的边界处停止,并报告标准 标准。
  • D198 号决定定义了这一点。请参阅 03-runtime/01-ipc-protocol.md §5.4, 03-runtime/02-agent-runtime.md §5b/§7.2a, 03-runtime/03-tools-and-permissions.md §10.1, 03-runtime/04-data-storage.md §4.6a/§7, 03-runtime/06-host-rpc-protocol.md §5.1, 03-runtime/08-error-codes.md03-runtime/10-session-state-machine.md04-ux/04-builtin-commands.md04-ux/08-component-spec.md §11。

2026-08-06 — 重新生成分支存档在主机 RPC 锁下

  • 转动完成用于归档已完成的重新生成分支 从 Electron main 读取-修改-写入:session.get,然后 session.replaceMessagesrevisionCount / activeRevision 上标记 用户根。助手和工具消息通过异步到达 SQLite 持久性发件箱 (ADR 0041),因此快照可能早于本回合的最终结果 消息和整个记录重写将其从记录文件中删除 和索引,以及每行的 turn_id
  • session.saveActiveRevision 现在执行读取、存档和标记 在一台主机调用状态下锁定。该标记仅重写 root 用户的 转录行并在写入时重新读取文件,因此在 在此期间幸存下来。 Electron main 首先清空发件箱并跳过存档 并发出警告,而不是归档不完整的分支。
  • session.replaceMessages 携带每个幸存消息所属的 turn_id 整个重写过程中,并且仅对拥有该对象的调用者来说才被记录为安全的 通话期间的完整文字记录。
  • 决策 D199 和 ADR 0060 定义了这一点。参见 03-runtime/04-data-storage.md §4.9/§7, 03-runtime/06-host-rpc-protocol.md §4 和 E2E-118。

2026-08-06 — 上下文压缩变得难以察觉

  • 压缩由主机驱动且安静。 CompactContext 工具 <context_management> 软边界微移,主机未确认 允许列表条目已消失,因此长时间会话永远不会花费模型轮询 被压缩并且永远不会为其增加转录行。
  • contextBudget() 保持 D158 硬限制和净空不变,导出 来自模型窗口的保留尾部目标而不是设置,并添加 硬预算的 70% 的背景限制。后台预计算也 自最新以来,至少需要增长保留尾部目标 检查点的基线,因此大尾巴无法在每个回合重新触发。
  • 生成和安装是分开的。检查点仅内置于 提供程序空闲窗口 - 当工具执行时,以及运行结束后 - 因此 摘要请求永远不会与流式传输共享提供商连接。 如果其底座仍处于活动状态,它会安装在下一回合边界或提示处, 它的锚仍然存在,并且仍然符合当前模型的预算; 否则,不变的阻塞硬边界会处理它。失败了 后台构建被丢弃,没有事件,没有持久性,也没有 ADR 0049 后备。
  • ADR/compaction_start 增益可选 phase,以及 compaction_end 获得可选的 status { generation, summaryTokens };两者 在协议 v9 中是附加的。成功的自动压缩通知 没有人。上下文使用检查器是唯一可见的跟踪,并且设置 根本不暴露任何压缩控件。
  • 决定 D200 和 ADR 0061 修改 D158 / ADR 0030 / ADR 0049。参见 03-runtime/01-ipc-protocol.md §6、03-runtime/02-agent-runtime.md §5.1/§7.1、 03-runtime/03-tools-and-permissions.md §0/§2/§10.1, 03-runtime/06-host-rpc-protocol.md04-ux/06-settings-ia.md04-ux/08-component-spec.md §7.3/§8.3/§11.5, 04-ux/09-interaction-patterns.md §3A 和 E2E-084。

2026-08-06 — 重建上下文压缩以匹配 Codex

  • 上一轮引用了 Codex,然后在四个上实施了相反的做法 很重要。 Codex 仅同步压缩,通过以下方式测量整个上下文 默认情况下,为每个发出一个 ContextCompaction 项和一个 Warning 压缩,并有一个真正的面向模型的工具(new_context)。 D200 的背景 部分还指出 Codex 没有这样的工具,这是错误的。用户 在被告知可以逆转不可察觉性后,询问 Codex 的机制 他们早些时候要求进行一轮。
  • 压缩再次内联。后台预计算,其70%的限制, 增量范围触发,删除三个空闲调用点; 当上下文与 hardLimit 或模型交叉时,prepareNextTurn() 会进行压缩 称为 new_context,与 Codex 的 should_roll_over 匹配。
  • 检查点携带摘要以及最近的用户消息,仅此而已。圆周率 切割点仍然标记边界,但其分叉前缀和最近的尾部 被折叠回摘要输入中,因此没有消息离开模型上下文 未被发现——仅过滤尾部就会导致数据丢失的错误。 保留最新的优先到 20,000 个令牌,交叉消息被截断 而不是被丢弃,并且助理消息会带着他们的工具调用,所以 没有孤立的呼叫到达提供商。
  • 两个 Codex 系列都存在:摘要路径和 fresh_window 翻转 不需要摘要并安装固定的标记文本。家庭是一个 内部开关(构造选项,然后 PI_DESKTOP_COMPACTION_STRATEGY),设置和 i18n 中不存在,因为没有 用户可以从设置行判断权衡,Codex 不会询问他们 到。
  • new_context 是无参数的,带有 Codex 的逐字描述,位于 主机无确认白名单,并且永远不能分配给子代理。两个 预算提醒 — clamp(hardLimit * 0.15, 8k, 32k) 和 2,000 个代币 剩余 - 附加到当前回合的系统提示中,每回合领取一次 检查点窗口,并且从未保留或显示。
  • host-core 保持整个检查点链,每条记录有效,因为 每次压缩的记录行必须在重新启动、重写和分叉后继续存在。 compaction_end 丢弃 phase 并携带 mark 而不是 status;的 记录在每个检查点覆盖的消息后面绘制一个分隔行,并且 每一次成功的压缩都会引发一次警告。上下文检查器 保持其路线,现在是最新的标记。
  • 故意与法典存在三个偏差:摘要先于保留的内容 用户,因为 buildSessionContext 修复了该顺序,hardLimit 保持不变 “窗口 - 输出储备”而不是窗口的 90%(我们没有单独的 全窗防护),并且该工具在两个系列中注册,而不是 只有翻滚一。
  • 决定D203和ADR 0064修改D200 / ADR 0061并恢复D158 / ADR 0030的 可见性属性。请参阅 03-runtime/01-ipc-protocol.md §6, 03-runtime/02-agent-runtime.md §5.1、03-runtime/03-tools-and-permissions.md §2/§10.1,03-runtime/04-data-storage.md §2.1, 03-runtime/16-tool-result-limits.md §4、04-ux/08-component-spec.md §7.3/§7.4/§8.4a/§11.5、04-ux/09-interaction-patterns.md §3A 和 E2E-084。

2026-08-06 — Task 工具背后的有界子代理

  • 会话可以将一项独立的工作委托给子代理并获得 返回一份书面报告。定义是 Markdown 文档——三个 内联内置函数(explorercode-reviewertest-runner)以及 <workspace>/.pi/agents/*.md,按名称投影内置项目,请重新阅读 每次发射,上限为 16,格式错误的文件降级为发射 诊断。
  • 定义从 Read/Glob/Grep/BrowserPreview/ 声明其自己的 tools Bash/Edit/Write 并且在声明无时为只读 (Read, Glob, Grep)。一个 委托永远不会从其会话继承突变权限,无法访问插件, 技能、模式或元工具,并且没有自己的 Task 工具。它的调用运行 通过相同的 tools.execute 主机路径,因此包含和许可 模式不变。
  • 定义可能会固定 model: <provider>/<model>,每次启动时解析一次 Electron 主要针对配置的提供程序(通过 id、供应商密钥或显示名称, 最多 8 个不同的提供商)。无法解析的引脚使 Task 调用失败,并显示 工具错误而不是回退到会话模型。
  • Task 仅在 Agent 模式下提供。扇出来自执行模式: 会话 Agent 运行 toolExecution: "parallel",所有其他工具都是 sequential,并且只有全 Task 批次同时运行,上限为 4 插槽和每个代表在其自己的 maxTurns(默认 24,最大 80)。的 sidecar 通过 PathMutex 序列化相同路径 explorer/code-reviewer 调用。
  • 父模型上下文获得有界报告(12k 字符),但什么也没有 否则。委托消息和工具行被发出并保存 消息 meta 中的 parentToolCallId / agentName,但运行时会跳过 重建上下文时它们,并且委托的终止崩溃为 工具结果而不是达到 Electron main 的回合处理。
  • 转录本将属性行嵌套在其 Task 行内一层,并且 让他们远离回合流和小地图。一台 Task 保持紧凑; 活动组中的两个或多个派生一张仅渲染器委派卡 具有聚合状态和主代理到委托拓扑。节点重用 现有行披露、结构化结果和嵌套行。拓扑结构是 源自实时和重新加载时的持久归因,不添加任何协议或 存储形状,并且既不发明委托依赖性,也不发明不可用的 父摘要节点。待处理的权限请求成为每个会话队列: 仅头应答、ID 匹配删除、中止时拒绝整个队列以及 卡片上注明了提出请求的代表以及后面有多少人在等待。
  • 决策 D201 和 ADR 0062 定义了这一点。参见 03-runtime/02-agent-runtime.md §5f/§7.2b/§8, 03-runtime/03-tools-and-permissions.md §10.2, 03-runtime/04-data-storage.md §4.7a, 04-ux/03-permission-ux.md §6a、04-ux/08-component-spec.md §9.9,以及 E2E-119。

2026-08-07 — 空屋使用直接底部任务入口

  • 空聊天主页使用直接底层输入框并保留英雄和可选 在一个可滚动区域中加载内容。
  • 家庭输入框是该地区的最低保留兄弟,所以它仍然存在 清单内容在底部可见,同时短时间独立滚动 窗户。
  • 决策 D204 和 ADR 0066 定义布局。参见 04-ux/01-ui-ia.md04-ux/07-ui-design-system.md04-ux/08-component-spec.md 和 E2E-063 / US-UI-64。

2026-08-07 — 空置房屋获得开发者入门指南(已取代)

  • 空置的房屋现在有四个紧凑的本地化开发商启动项目 英雄所以中间表面很有用,但不会成为营销面板。
  • 激活启动器可以预先填充并集中输入框。它不发送 提示或创建会话轮,并且短窗口滚动仍然保留 访问每个块。
  • D205 决定在 D206 取代 D204 之前定义了该修正案。参见 04-ux/01-ui-ia.md04-ux/07-ui-design-system.md04-ux/08-component-spec.md 和 E2E-063 / US-UI-64。

2026-08-07 — 空置的家删除了开发者入门卡

  • 空荡荡的家不再渲染开发任务卡、入门字形或 上下文快速操作。
  • 英雄、可选的入门清单和直接底部输入框保留; 任务输入直接在编辑器中启动。
  • 决定 D206 取代 D205,同时保留 D204 的可滚动布局。参见 04-ux/01-ui-ia.md04-ux/07-ui-design-system.md04-ux/08-component-spec.md 和 E2E-063 / US-UI-34 / US-UI-48。

2026-08-07 — 工作面板获得直接键盘输入点

  • Cmd/Ctrl + J 是名为 openWorkPanel 的可自定义渲染器快捷方式。 它揭示了活动会话在提交时保留的工作面板上下文 宽度,无需创建资源选项卡;上下文菜单仍然是 创建审阅、终端、浏览器或文件。没有活动会话并且 设置页面是无操作上下文。
  • 工件驱动的资源创建、会话所有权、后台事件 隔离、塌陷行为和宽度持久性保持不变。
  • D207 决定取代了 D128 的无全局快捷方式条款并修改了 D142 的条款 无启动器演示。参见 ADR 0068、04-ux/01-ui-ia.md04-ux/08-component-spec.md04-ux/09-interaction-patterns.md 和 E2E-056。

2026-08-10 — 本机路径错误恢复,没有错误转向失败

  • Read 仅限文件,Glob 仅限目录,Grep 接受文件或 目录;目录读取错误包括结构化 Glob 恢复参数。
  • 恢复的工具错误在其自己的行上仍然可见,但不再转动 包含处理组成终端破坏面。
  • D185 的延迟 Agent 搜索工具保持不变。决策 D208 和 ADR 0069 定义兼容工具和转录合同。

2026-08-10 — Composer 文件参考使用紧凑草稿芯片

  • 已完成的工作区文件选择和粘贴的会话草稿文件现已上线 作为渲染器拥有的、会话范围的引用,而不是公开它们的 文本区域中的规范路径。
  • 输入框仅显示可移动的叶子名称芯片。完整路径仍然可用 工具提示和辅助技术,重复的叶子名称保留不同的 规范身份。
  • 紧接着现有提交调度程序之前,引用在之后序列化 具有未更改的带引号或不带引号的 @path 语法的可见文本。参考- 仅发送、斜杠模板和 Agent/Plan/Goal 别名保留其现有的 行为;失败的发送保留文本和参考。
  • 接受的发送仅保留其内存中的 session/turn-scoped 副本 预序列化草案,而未答复的智能停止仍然是可能的。那 停止恢复原始文本和碎片;回复内容开始后,中止 保留部分转录本并且不恢复草稿。
  • ComposerPastedFile.name 是经过消毒的原始叶子标签,而 path 保留 UUID 支持的绝对存储名称。剪贴板字节,暂存 遏制、清理、主机 RPC、存储模式和提供商有效负载仍然存在 不变。
  • D209 和 ADR 0070 决定修改了 D124 / ADR 的草案提交条款 0024 和 D197 / ADR 0059。参见 03-runtime/01-ipc-protocol.md §13c, 03-runtime/03-tools-and-permissions.md §4b, 04-ux/07-ui-design-system.md §8.1,04-ux/08-component-spec.md §11.7–11.8, 04-ux/09-interaction-patterns.md §8a 和 E2E-102/E2E-102a。

2026-08-11 — 全球角落使用受 Apple 启发的形状层次结构

  • 固定半径使用常规 4/6/8/10/12/14/16/18/20/24px 梯子。紧凑且 中型桌面控件使用圆角矩形;明确的药丸和圆圈 标记仍然保留用于语义胶囊、等宽图标控件、 开关、轨道、头像和点。
  • 嵌套曲面的角对齐时遵循 Apple 的同心度规则: 外半径等于内半径加上边缘之间的插入量。 结构全宽外壳面板保持方形。
  • 输入框通过共享半径比例保持其 20px 可见半径。 实验性 corner-shape 渲染被推迟,因为 Electron 37 的 Chromium 138 运行时不支持它。
  • 决策 D210 修改了 D072 之前的像素保留半径阶梯,没有 改变其仅令牌强制执行。 ADR 0071 记录理由。参见 04-ux/07-ui-design-system.md §6.2 和 US-UI-72。

2026-08-11 — 全局插件启动器和不间断的下一回合准备

  • macOS 上的 Option+Space 和 Windows/Linux 上的 Alt+Space 打开居中、 无框架插件启动器。它按中文名称搜索可启动面板, 完整拼音、拼音声母、标准化name/id和描述,然后打开 通过现有面板主机突出显示的结果。
  • 在积极回答期间,输入框草稿和模式、思考和许可 下一回合的选择仍可编辑,而发送仍处于禁用状态。的 主机报告空闲后,渲染器仅刷新最新的完整选择。
  • 用户停止的部分响应保留经过的持续时间和确切的提供商 存在时输出;如果没有最终使用,则回落到明显近似的值 输出计数,以便生成吞吐量能够在持久性和重新加载中幸存下来。
  • 决策 D211/D212 和 ADR 0072/0073 定义本机窗口 IPC, 运行中配置和转录元数据合同。参见 03-runtime/01-ipc-protocol.md03-runtime/02-agent-runtime.md04-ux/07-ui-design-system.md04-ux/08-component-spec.md04-ux/09-interaction-patterns.md 和 E2E-120。

2026-08-12 — 插件可以请求和发送本机通知

  • 为了兼容性,pi.ui.notify 仍然是应用内 Toast。插件与 现有 notify 权限获得 getNotificationPermissionrequestNotificationPermissionshowNativeNotification API。
  • 本机插件通知对象仍由 Electron main 持有。该 API 返回尽力而为的 granted / denied / unknown / unsupported 状态, 因为 Electron 没有跨平台的只读权限查询。原生插件通知不会创建 持久的任务收件箱行或会话激活事件。 激活事件。
  • 决策 D213 和 ADR 0074 定义了公共 API 以及与 D117的应用程序拥有的任务通知合约。参见 07-plugins/01-plugin-system.md07-plugins/03-plugin-api.md07-plugins/13-plugin-permissions-matrix.md 和 E2E-122。

2026-08-12 — 开发插件获得明确的权限上限重新加载

  • 自动开发插件重新加载继续拒绝清单权限 添加,保留无声扩大的边界。
  • 插件页面现在提供 source: "dev" 行的重新加载。新的 plugin/reload 调用解析注册的文件夹,通过 现有的 Electron 运行时路径,并用当前的 宣布权限为其新的上限。
  • 决策 D214 和 ADR 0075 定义了该添加剂 renderer/main IPC 表面。 主机RPC和存储架构版本保持不变;看到 07-plugins/10-plugin-devex.md07-plugins/12-plugin-ipc-and-host-services.md、 和E2E-022B。

2026-08-12 — Windows 保留插件启动器和弦

  • Windows' Alt+Space 系统菜单保留可能会导致 Electron 的全局 当应用程序未聚焦时,快捷方式注册失败。主持人 核心现在拥有一个用于默认绑定的窄低级键盘钩子, 消耗和弦,并发出 keyboard.shortcut 至 Electron。 Electron 切换现有的启动器窗口;自定义绑定继续使用 正常 Electron 全局快捷路径。
  • 决策 D215 和 ADR 0076 定义了这种附加主机集成。协议 版本 9 和存储架构 11 保持不变。

2026-08-13 — 插件启动器渲染器在启动后预热

  • Electron 在主应用及后端完成启动后创建并加载保留的插件启动器, 同时保持窗口隐藏。
  • 预热期间收到的快捷键会复用同一个进行中的创建 promise; 预热失败后仍可重试,每次显示窗口时也仍会刷新插件目录。
  • 决策 D217 和 ADR 0080 仅取代 D211/ADR 0072 中首次使用时延迟创建的条款。 IPC、host RPC、协议 v9 和存储架构 v11 均保持不变。

2026-08-12 — 审批卡聚焦工件并记住模式

  • Plan/Goal 批准卡现在仅显示标题、主持人创建的工件 opener/path、拒绝和批准。已提交 question/description,状态, validity/deadline,并且不会呈现内联警告。
  • 选择的询问/接受编辑/自动批准模式会被记住 渲染器本地设备首选项并成为下一个批准的默认值; 询问仍然是安全的后备措施。
  • 标题派生的工件文件名保留 Unicode 字母数字字符,以便 本地化的计划标题仍然可以识别。主机现有内部 截止日期仍然是 compatibility/fail-closed 边界,但不会暴露 批准卡。
  • 决策 D215 和 ADR 0076 修改 D189/ADR 0053。协议和存储版本 保持不变。

为本地优先开发而构建。