pi-web-ui 0.94.1 → 0.95.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +49 -1
- package/README.md +5 -6
- package/README.zh-CN.md +4 -5
- package/bin/pi-web-ui.mjs +751 -206
- package/dist/server/agent-service.js +1869 -85
- package/dist/server/approval-rules.js +550 -0
- package/dist/server/attachment-store.js +112 -0
- package/dist/server/attachments.js +62 -171
- package/dist/server/client-state.js +4 -0
- package/dist/server/compact-context-tool.js +125 -0
- package/dist/server/context-budget.js +317 -0
- package/dist/server/dangling-tools.js +162 -0
- package/dist/server/dsh/dsh-agent-service.js +50 -60
- package/dist/server/edit-soft-tool.js +70 -5
- package/dist/server/eval-tool.js +535 -0
- package/dist/server/files-service.js +35 -7
- package/dist/server/goal-service.js +240 -68
- package/dist/server/hashline-engine.js +665 -0
- package/dist/server/host-metrics.js +26 -2
- package/dist/server/index.js +157 -9
- package/dist/server/lsp-tool.js +679 -0
- package/dist/server/model-admin.js +20 -0
- package/dist/server/office-parse.js +309 -0
- package/dist/server/patch-tool.js +91 -0
- package/dist/server/plan-manager.js +104 -0
- package/dist/server/plugin-api-catalog.js +296 -0
- package/dist/server/plugin-install-spec.js +196 -0
- package/dist/server/plugin-installer.js +73 -0
- package/dist/server/plugin-manifest-validate.js +305 -0
- package/dist/server/plugin-project.js +47 -11
- package/dist/server/plugin-tool-guard.js +120 -0
- package/dist/server/plugins.js +745 -161
- package/dist/server/process-utils.js +12 -6
- package/dist/server/scheduler-tasks.js +6 -0
- package/dist/server/serialize.js +13 -3
- package/dist/server/settings-service.js +108 -1
- package/dist/server/subagents.js +41 -0
- package/dist/server/terminals.js +69 -14
- package/dist/server/tool-approval.js +84 -0
- package/dist/server/tool-manager.js +214 -6
- package/dist/server/workspace-snapshot.js +113 -0
- package/package.json +2 -2
- package/plugin-sdk/README.md +25 -0
- package/plugin-sdk/index.d.ts +31 -38
- package/plugin-sdk/index.mjs +35 -19
- package/plugins/catalog.json +20 -0
- package/themes/ayu-light.css +6 -6
- package/themes/catppuccin-latte.css +6 -6
- package/themes/claude-code-dark.css +144 -0
- package/themes/codex.css +6 -6
- package/themes/everforest-light.css +6 -6
- package/themes/geist.css +6 -6
- package/themes/gruvbox-light.css +6 -6
- package/themes/kanagawa-lotus.css +6 -6
- package/themes/rose-pine-dawn.css +6 -6
- package/themes/solarized-light.css +6 -6
- package/themes/vs-code-dark.css +146 -0
- package/web/dist/assets/{TerminalPanel-MVoxpJOA.js → TerminalPanel-DlGBF2MD.js} +1 -1
- package/web/dist/assets/index-BXnCQL9p.js +364 -0
- package/web/dist/assets/index-RpIGFyi_.css +1 -0
- package/web/dist/index.html +2 -2
- package/web/dist/assets/index-B3S9MxnN.css +0 -1
- package/web/dist/assets/index-DVLrHI2E.js +0 -364
package/CHANGELOG.md
CHANGED
|
@@ -10,7 +10,51 @@
|
|
|
10
10
|
|
|
11
11
|
## [Unreleased]
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
## [0.95.0] — 2026-09-24
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
- **临时对话(🎭 无痕会话,issue #285)** — 顶栏「新对话」旁新增 **🎭 临时对话** 按钮:新开的对话**只活在内存里**(`SessionManager.inMemory`,不落盘、不进历史会话列表、不计入每项目 8 个的持久对话名额),关闭即销毁,用来跑连通性探测、随手一问、或临时分析不想留档的敏感内容。临时对话在左栏「运行的对话」里带紫色「临时」徽标,对话流顶部常驻一条提示条(🎭 当前为临时对话…)并附「💾 保存为正式对话」按钮 —— 这就是**一键转正**:点一下即把内存里的全部消息落盘成 `.jsonl`、清掉临时标记、登记进历史(对话 id 与内容原地保留,不丢上下文);不想点按钮也可以右键该行选同一动作。转正后与普通对话完全一致(可继续、可派生分支、可被 AI 按 path 读)。DSH 引擎不提供该入口(其 `newChat` 无 inMemory 分流,画出来只会得到普通持久对话)。回归:`tests/ephemeral-chat-test.mjs`(含「普通新对话确实落盘」的对照组)。
|
|
18
|
+
|
|
19
|
+
- **审批规则可自定义(规则引擎 + 设置面板管理)** — 支持在设置面板「审批规则」页自由添加、编辑、启用/停用、排序和删除审批拦截规则,规则持久化于全局 `<dataDir>/approval-rules.json`(对所有会话实时生效)。支持多工具匹配(bash / write / edit / edit_soft / 通配 *)、多字段检测(命令 command / 路径 path / 完整参数 JSON params)以及五种匹配模式(正则 regex / 通配符 glob / 包含 contains / 前缀 prefix / 工作区外写入 outside_workspace);命中动作支持「需审批」(ask)、「直接拒绝」(deny,向模型报错且不弹窗) 与「免审放行」(allow,白名单直接执行)。内置高危规则(rm -rf / 破坏性 git / 格式化 / chmod / 敏感文件 / 越界写入等)均转化为可自定义规则,可独立停用、修改动作或一键恢复默认。
|
|
20
|
+
- **审批不再一次次弹(三档放行)** — 人机协同审批弹窗现在有三条「别再问我」的路:① **全局关**(设置 →「工具」页的「工具执行审批」总开关,默认开)——关掉后一切审批都不弹(内置高危检测直接放行,插件 pre guard 的 `ask` 也按放行处理);② 弹窗里的「**本对话全部允许**」——本对话后续高危操作都不再询问;③ 弹窗里的「**本对话允许同类**」——只对同一规则档位生效(`rm -rf` 类删除 / 破坏性 git / 磁盘写入 / 危险 chmod / 写入系统目录 / 敏感文件 `.env`·SSH·shell 配置 / 工作区外写入 / 每个插件各自一档),弹窗里会写明本次命中的档位。记住后同对话内已被覆盖的其它待审批项一并放行;撤销入口在设置 →「工具」页(列出当前对话已记住的放行,逐条「撤销」)。策略**只存内存**且跟对话走(手动过户一起搬),重启服务或新对话即恢复询问;全局开关被关掉时挂着的弹窗也自动放行,不让人对着窗口干等。
|
|
21
|
+
- **插件安装前先读 spec(引导式安装)** — 在设置面板「插件市场 → 添加插件」填来源时,输入框下方就地给出结论(防抖 500ms 自动检查,不必等 CLI 跑完再猜):来源形状分类(npm / GitHub 仓库 / URL / 本地路径)、是否已装同名插件、以及 GitHub 源的远端有没有 `manifest.json`;探到 manifest 时顺带展示插件名 / 版本 / 简介供确认。失败归到七种原因(形状不对 / 已装 / 远端找不到 / 不是插件包 / manifest 不合法 / 连不上远端 / 未知),各给一句人话与修复建议。远端探测失败只作提示,**不阻塞安装**。
|
|
22
|
+
- **插件副作用统一回收(effect 栈)** — 宿主的每个插件注册面(AI 工具 / 斜杠命令 / HTTP 路由 / 反向代理 / 文件监听 / 定时任务 / 后台任务 / UI 条目 / 事件订阅 / 统计与流式订阅)现在都在插件内部登记为可逆副作用,插件被禁用、卸载或热重载时**逆序回卷**;插件忘记调用返回的注销函数也不会再留下孤儿订阅、定时器、路由或文件监听(这些正是热重载后事件双触发、定时器叠加、watcher 堆积的根因)。插件自建的副作用可用新 API `host.effect(label, dispose)` 挂进同一个栈。插件激活中途失败时,已注册的东西也会被撤干净。
|
|
23
|
+
- **界面布局诊断(失败不再静默)** — 插件声明了宿主不认识的挂载点 / 条目种类 / `when` 条件,或整理意图(arrange)指向了不存在的条目,或插件被禁用 / 激活失败时,设置面板「界面 ☰ → 界面布局」页顶部会出现可折叠的「布局诊断」横幅,逐条点名**哪个插件的哪个条目、为什么没出现在界面上**(同时控制台留一条)。以前这些情况是静默丢弃,表现为「注册了但界面上没有」,最难排查。
|
|
24
|
+
- **单个条目崩溃不再炸掉整条工具栏** — 每个挂载点条目独立包一层错误边界:某个插件条目渲染抛错时只丢它自己并就地置一个可点的灰色占位(点开在控制台看细节),顶栏 / 底栏 / 右栏的其余条目照常工作。
|
|
25
|
+
- **插件设置 overlay(层式组合)** — `<dataDir>/plugin-overrides/<id>.json` 的 `settings` 节:三层合并 schema 默认 < overlay < 面板保存值。overlay 是用户钉住的新默认值(不 fork 改官方默认,更新不丢);面板保存永远最高;secret 永不来自 overlay;坏键警告进诊断;每键来源标在 `settingsSources`(default/override/stored)。
|
|
26
|
+
- **机器可读的注册面目录(WS 只读查询)** — `plugin_api_catalog` → `plugin_api_catalog_result`:22 个 slot(别名/kind/可抄例子)+ 工具目录 + 宿主方法表(需要族+最小例子)+ 当前占用者(现算,只含条目数)。类型在 `protocol.ts#PluginApiCatalog`,装配 `server/plugin-api-catalog.ts`,单测锁住与源码同口径。给将来「AI 写插件」铺路。
|
|
27
|
+
- **插件硬依赖声明(manifest.requires)** — `{ hostApi?, families?, plugins? }`:任一条不满足即拒绝激活+教学式错误(区别于 `peerPlugins` 的缺失只警告)。`ensureLoaded` 按依赖拓扑排序激活(被依赖者先行,环直接拒),提供方被删/失败后消费方一并反激活+留占位。决定启动时机的是依赖,不是目录顺序。
|
|
28
|
+
- **插件可拦截工具执行(pre/post 两阶段,仅 bash/read)** — 插件经 `host.onToolPre` 在危险命令执行前拒掉(`deny` 带原因给模型看,`ask` 待确认暂按拒绝执行),经 `host.onToolPost` 给输出脱敏/改写或补 `additionalContext`。首个阻断胜出,守卫抛错/超时按弃权(不挂住工具调用)。注册要 `tools` 能力;只覆盖已接管的 `bash`/`read`(DSH 引擎无 customTool 注册面不接)。
|
|
29
|
+
- **Office 文档随处可看** — 内置文件预览现在能打开 `.docx` / `.xlsx` / `.xlsm`:服务端零依赖解析(zip 解包 + 提文本,15MB 文件上限 / 64MB 解包上限防 zip 炸弹)转成 Markdown 下发,预览弹窗直接渲染表格与段落(协议未动,仍走 `file_content kind:text`)。文件树、附件、中文名/括号文件名都走同一条链路;Office 文件在预览里**不可编辑**(防把文本写回二进制)。表格表头固定为 A/B/C…列标(不拿第一行数据冒充,避免通知类首行被染成紫色表头),每表最多 500 行、全文 20 万字符,超出截断并按实际行数提示(复用 `previewLinesTruncated`,不新增文案 key)。预览样式走 `.fp-office` 独立作用域:紧凑行高(杀掉格子内 `<p>` 边距、空格子占位防塌)、横向滚动条常驻、表头吸顶。实现在 `server/office-parse.ts`(与 `plugins/office-preview` 的解析器互为镜像,改一处请同步另一处),单测 `tests/unit/office-parse.test.ts`(另用 headless Chrome 对 1.4MB 真文件做过渲染截图回归:行高/常驻滚动条/吸顶表头/零 JS 报错)。
|
|
30
|
+
- **受控的持久代码求值沙箱工具 `eval`(opt-in,默认关)** — 新第一方 customTool:在隔离子进程中执行 Python(`py`)或 JavaScript/TypeScript(`js`/`ts`),变量与导入跨调用保持,顶层表达式自动求值回显(省掉以往 `write` 临时脚本 → `bash` 跑 → 删文件的三步流程)。设计要点:① 默认关(`AGENT_TOOL_CATALOG` 里 `defaultOn: false`),关掉 AI 不知道有它,杜绝「什么问题都塞进内核」的工具挤占;② 每个会话一个独立内核进程 + 独立临时目录(cwd 不落在项目里,项目路径经 `PROJECT_DIR` 变量显式引用),关对话 / 停服务即回收进程树(Windows `taskkill /F /T`,Unix `SIGKILL` 进程组),不留孤儿;③ 单请求默认 15s、上限 120s 硬超时,超时杀进程树后内核自动重启,不会把会话拖死;④ 驱动协议串行排队,并行 `eval` 调用不会互相覆盖 resolver;⑤ stderr 持续排空,避免原生扩展写满管道缓冲造成假超时。DSH 引擎无 customTool 注册面,不接。
|
|
31
|
+
|
|
32
|
+
### Changed
|
|
33
|
+
- **插件 manifest 校验失败即拒(P1-6)** — 坏 manifest 不再带病启动:`id` 非法/与目录名不一致、`apiVersion` 非法、未知能力拼写、`engines`/`permissions`/`ui` 坏形状、v2 不声明 `permissions`、有 `ui` 声明却无 `ui` 能力,都会拒绝激活(scan 置红 + 诊断随清单下发,activate 重判)。以前其中两类(v2 无能力声明、只有别的能力却写 `ui`)是"激活成功但 ui 静默忽略",现在是明确拒绝;纯警告(坏文本字段/坏数组字段/截断)仍不阻断。未来版本(`apiVersion` 大于宿主)仍走版本门出"请升级",校验层不抢错。
|
|
34
|
+
|
|
35
|
+
### Fixed
|
|
36
|
+
- **目标调研向导:切会话不再丢弃调研成果,且消息流里有「原始目标草案」卡片(#292)** — 两处修复:① `setGoal` 新增 `targetConvId`,调研收敛后把目标写到**发起调研的那个对话**(原来是硬读 `activeConv` 再一刀切丢:「已切换对话,目标调研结果已丢弃」——用户在向导问答期间切去看代码/文档是常态,多轮问答瞬间白做);发起会话已关闭时响亮拒绝而不是静默丢。完成通知随之改成点名会话(`🎯 会话「title」目标调研完成,目标已设为…`),取消/无结果时也告诉用户草案还在哪儿。② 调研开始先往发起对话推一张只读「🎯 原始目标草案」卡片,排在所有提问之前——调研被超时/取消打断后,用户至少能把自己最初写的那段需求读回来、复制重试,而不是面对一片空白。
|
|
37
|
+
- **子代理(in-memory 会话)的扩展错误不再按轮数刷屏(#298)** — `SessionManager.inMemory(cwd)` 建出来的子代理会话取不到会话目录(`getSessionDir()` 返回空串),而 SDK 的 `ExtensionRunner.emitContext()` 在**每次 provider 请求**前都会跑一遍扩展的 `context` hook,于是「会话目录依赖型」扩展(如 SoL-Pi 的 `runtimeRoot()`)每轮都抛同一个错。原 `bindExtensions` 的 `onError` 把错误原样广播成 notice:不去重、不带会话归属、不落服务端日志,一个子代理跑 N 轮就弹 N 条,且看不出是哪个会话出的问题。现改为共享的 `makeExtensionErrorReporter()`:① 同一会话内「扩展 + 事件 + 错误文本」只提示一次;② 子代理的 notice 带 `子代理 <conversationId>:` 前缀(与同函数内其它子代理通知口径一致);③ 全量错误(含 extensionPath / event / stack)始终 `console.error` 落服务端日志。主对话(持久会话)行为不变,只是多了去重与日志。
|
|
38
|
+
- **插件市场仅同步列表时保留已激活插件实例(#296,感谢 @StarryJia)** — 启动预同步和手动目录同步不再重载插件,避免重新激活时重复广播当前工作目录。
|
|
39
|
+
- **浅色主题通知配色修复(#296,感谢 @StarryJia)** — 修复 9 个浅色主题下 notice 的背景和边框配色,使用动态基色混合提升文本对比度。
|
|
40
|
+
|
|
41
|
+
- **macOS 服务版开页不再永久卡「正在连接」(#295)** — `server install` 的默认工作区从用户主目录改为干净的 `~/pi-web-ui`(不存在即建;显式 `--cwd`/`PI_WEB_CWD` 保持原语义):SDK 初始化期的同步目录扫描不再落在 `$HOME` 上(iCloud 占位符/外部卷坏挂载曾让 `scandir/open` 在内核挂起、整个事件循环假死,`hello` 后永远收不到 `ready`,连 `server status` 控制通道一起超时)。另两道保险:① `hello` 后服务端先回 `ready`(传输握手不再等会话初始化,快照随后到),`attach` 超过 8s 未完成先给一句可见提示;② `attach` 里恢复上次工作目录的 `statSync` 改异步,坏挂载只挡本连接、不冻事件循环。老服务仍指着家目录时启动日志会提示重装迁移。回归:`systemd-install` 单测对齐新默认 + `plugin-proxy-test` 的插件路由判活改按真实内容(此前按 HTTP 200 判活会被 SPA catch-all 误导)。
|
|
42
|
+
- **工具看门狗强制重置不再留下悬空 toolCall(#280)** — 流式卡死 → 看门狗 abort 无效 → `forceResetConversation` 从磁盘重建时,内存里未落盘的工具结果蒸发,文件尾留下「有调用、无结果」的悬空 toolCall;重建后继续 prompt 会把非法转录链喂给 provider(请求有发起迹象但零落盘、零报错)。现三处修复:① 重建前向**本次对话自己的会话文件**补一条合成 toolResult(append-only,历史字节不动),重建后弹提示建议重执行工具;② 重建改回**同文件**(`SessionManager.open(ownFile)`),不再按 cwd 取最近(多会话会接错文件);③ 发送前/打开历史会话时复查转录尾,残留悬空即自动补合成结果,补不上则响亮拒绝发送(不再静默黑洞)。另:重建后旧扩展 ctx 的 `stale` 警告是 SDK 侧对已替换会话的预期失效(旧钩子不再可用),非数据丢失原因。
|
|
43
|
+
- **`edit_soft` 多 edit 不再串位(会写坏文件的 bug)** — 一次调用带多个 edit 且**按降序给出**(靠后的区域写在前面)时,旧实现按 edits 的传入顺序逆序应用而不先按位置排序 → 后面的替换先改变长度、前面的偏移串位,写出错乱/粘连内容(历史 bug:`protocol.ts`、`use-chat.ts`、`ChatInput.tsx` 被写坏)。现改为按位置升序再逆序应用(与内置 `edit` 先按 `matchIndex` 排序一致),任意给出顺序结果都一致;补了覆盖全部 6 种排列的回归测试。
|
|
44
|
+
- **`edit_soft` 拒绝跨行未对齐的非法片段** — oldText 跨多行但首/尾未落在行边界(如 `a);\nfoo(`)时,旧的精确子串替换会吃掉行首/行尾残留、写出粘连内容(`foo(z();b);`);现直接拒绝并提示按整行给出。另:宽松匹配整块对不上、且首/尾行只是某行一部分时,报针对性的「片段」错而非笼统的「找不到」。单行片段仍照旧支持。
|
|
45
|
+
- **任务执行看板与对话列等宽** — Plan Mode 的任务执行看板(`PlanBoard`)此前写死左右各 16px 外边距,没走 `.main` 的列 token(`--chat-inset`):桌面 / 宽屏聊天列下比消息列与输入框宽一截、手机上又比它们窄一点,左右边缘始终对不齐。现改为同一条列 token(`.plan-board` 落进 `styles.css`,与 `.goalbar` / 问卷面板同口径),任何视口宽度与「宽屏聊天列」开关下都与输入框严格齐平。回归:`tests/chat-column-align-test.mjs` 新增看板条目。
|
|
46
|
+
|
|
47
|
+
<!-- auto-i18n:start -->
|
|
48
|
+
### i18n
|
|
49
|
+
|
|
50
|
+
- 前端新增 key(104):`newChatEphemeral`、`newChatEphemeralTip`、`ephemeralBadge`、`ephemeralBannerText`、`elsewhereActions`、`takeoverConfirm`、`saveEphemeral`、`forkSession`、`forkSessionTip`、`rollbackSession`、`rollbackSessionTip`、`rollbackConfirm`、`rollbackRestoreWorkspace`、`rollbackRestoreWorkspaceTip`、`toolApprovalTitle`、`toolApprovalApprove`、`toolApprovalDeny`、`toolApprovalEditAndRun`、`toolApprovalRiskAlert`、`toolApprovalCommand`、`toolApprovalParams`、`toolApprovalEditPlaceholder`、`toolApprovalReason`、`toolApprovalCategory`、`toolApprovalAllowCategory`、`toolApprovalAllowCategoryHint`、`toolApprovalAllowConversation`、`toolApprovalAllowConversationHint`、`toolApprovalEnabled`、`toolApprovalEnabledDesc`、`toolApprovalPolicyTitle`、`toolApprovalPolicyAllowAll`、`toolApprovalPolicyRevoke`、`toolApprovalPolicyHint`、`settingsApprovalRules`、`settingsApprovalRulesDesc`、`manageApprovalRules`、`approvalRuleNew`、`approvalRuleEdit`、`approvalRuleDelete`、`approvalRuleReset`、`approvalRuleResetConfirm`、`approvalRuleDeleteConfirm`、`approvalRuleActionAsk`、`approvalRuleActionDeny`、`approvalRuleActionAllow`、`approvalRuleTools`、`approvalRuleToolsTip`、`approvalRuleField`、`approvalRuleFieldCommand`、`approvalRuleFieldPath`、`approvalRuleFieldParams`、`approvalRuleMatch`、`approvalRuleMatchRegex`、`approvalRuleMatchGlob`、`approvalRuleMatchContains`、`approvalRuleMatchPrefix`、`approvalRuleMatchOutsideWs`、`approvalRuleValue`、`approvalRuleValueTip`、`approvalRuleLabel`、`approvalRuleLabelEn`、`approvalRuleReason`、`approvalRuleReasonEn`、`approvalRuleEnabled`、`approvalRuleBuiltin`、`approvalRuleEmpty`、`approvalRuleMoveUp`、`approvalRuleMoveDown`、`planBoardTitle`、`planBoardSteps`、`planBoardProgress`、`planBoardNoPlan`、`planBoardCompleted`、`planBoardInProgress`、`planBoardPending`、`planBoardFailed`、`clear`、`confirm`、`forkBadge`、`forkBadgeTip`、`goalBarBlocked`、`toolsPresetBanner`、`toolsBackToStandard`、`toolsBlockedByPreset`、`skillsHiddenByPreset`、`terminalBashMaxForegroundMs`、`terminalBashMaxForegroundMsDesc`、`pluginInspectAlreadyInstalled`、`pluginInspectInvalid`、`pluginInspectNotPlugin`、`pluginInspectNetwork`、`uiLayoutDiagTitle`、`uiLayoutDiagHint`、`planUpdateEnabledDesc`、`planUpdateOffHint`、`compactContextEnabledDesc`、`compactContextOffHint`、`evalEnabledDesc`、`evalOffHint`、`patchToolEnabledDesc`、`patchToolOffHint`、`lspToolEnabledDesc`、`lspToolOffHint`
|
|
51
|
+
- 前端删除 key(1):`attachInlineTip`
|
|
52
|
+
- 前端中文变更(2):`hostResourcesTip`、`noPresets`
|
|
53
|
+
- 前端英文变更(2):`hostResourcesTip`、`noPresets`
|
|
54
|
+
- 服务端新增 key(14):`editsoft.fragment.not.supported`、`goal.wizard.draft.card`、`goal.autonomous.pass`、`goal.review.blocked`、`goal.autonomous.continue`、`goal.review.blocked_msg`、`plugins.requires.cycle`、`plugins.manifest.invalid`、`plugins.requires.cascade`、`subagents.handoff.self`、`subagents.handoff.not.found`、`subagents.handoff.success`、`subagents.handoff.failed`、`terminals.bash.background.elapsed`
|
|
55
|
+
- 服务端文案变更(1):`terminals.bash.background.running`
|
|
56
|
+
- 服务端删除 key(2):`dsh.attach.file.large`、`dsh.attach.file.ref.fallback`
|
|
57
|
+
<!-- auto-i18n:end -->
|
|
14
58
|
|
|
15
59
|
## [0.94.1] — 2026-09-22
|
|
16
60
|
|
|
@@ -41,11 +85,13 @@
|
|
|
41
85
|
- **复制为图片浅色主题色差(#273)** — html-to-image 把 `color-mix(...)` / 半透明 `rgba` 画到默认黑画布上,浅色气泡变成深紫、深字叠黑底。导出前把计算色拍成不透明 rgb,画布底用主题 `--card-bg`/`--bg` 实底,并去掉 `backdrop-filter`(否则 SVG 里会变成黑罩)。
|
|
42
86
|
|
|
43
87
|
<!-- auto-i18n:start -->
|
|
88
|
+
|
|
44
89
|
### i18n
|
|
45
90
|
|
|
46
91
|
- 前端新增 key(13):`saveAsImage`、`copyImageBtn`、`savingImage`、`imageTitle`、`imageTitlePlaceholder`、`imageBorder`、`imageWatermark`、`imageWatermarkPlaceholder`、`exportSelectHint`、`exportTooLong`、`exportSelectedCount`、`exportIncludeTools`、`exportIncludeThinking`
|
|
47
92
|
- 前端中文变更(2):`softCapHint`、`softCapOff`
|
|
48
93
|
- 前端英文变更(2):`softCapHint`、`softCapOff`
|
|
94
|
+
|
|
49
95
|
<!-- auto-i18n:end -->
|
|
50
96
|
|
|
51
97
|
## [0.93.0] — 2026-09-21
|
|
@@ -82,6 +128,7 @@
|
|
|
82
128
|
- **文件行右键也能「上传文件到当前目录」** —— 上传入口原先只对**目录**行显示,右键一个文件时菜单里根本没有这一项(想往当前目录传文件只能去右键空白处)。现在文件行也给,落点是它所在的目录:当前目录里的文件显示「上传文件到当前目录」,子目录里的文件显示「上传文件到文件夹」;只有机器根(不能往盘符根写)仍然隐藏,文件树右键菜单的其余条目不变。
|
|
83
129
|
|
|
84
130
|
<!-- auto-i18n:start -->
|
|
131
|
+
|
|
85
132
|
### i18n
|
|
86
133
|
|
|
87
134
|
- 前端新增 key(34):`themeLight`、`themeDark`、`quickPhrasesSendTip`、`persistSubagent`、`toolImages`、`toolImagesDesc`、`toolImageZoom`、`toolWatchdogTimeout`、`toolWatchdogTimeoutDesc`、`toolWatchdogOff`、`uiLayoutContextToolcall`、`pluginSettingsTitle`、`pluginSettingsShow`、`pluginSettingsHide`、`claimFilesEnabledDesc`、`claimFilesOffHint`、`toolInfoMenuLabel`、`toolInfoTitle`、`toolInfoLoading`、`toolInfoUnsupported`、`toolInfoMissing`、`toolInfoActive`、`toolInfoInactive`、`toolInfoSource`、`toolInfoDescription`、`toolInfoNoDescription`、`toolInfoPromptSnippet`、`toolInfoGuidelines`、`toolInfoParams`、`toolInfoParamsNone`、`toolInfoSchemaDropped`、`toolInfoRawSchema`、`toolInfoRequired`、`toolInfoFootnote`
|
|
@@ -89,6 +136,7 @@
|
|
|
89
136
|
- 前端英文变更(1):`elsewhereTip`
|
|
90
137
|
- 服务端新增 key(1):`agent.conv.limit.reached`
|
|
91
138
|
- 服务端文案变更(2):`subagents.spawn.started`、`subagents.list.empty`
|
|
139
|
+
|
|
92
140
|
<!-- auto-i18n:end -->
|
|
93
141
|
|
|
94
142
|
## [0.92.0] — 2026-09-20
|
package/README.md
CHANGED
|
@@ -78,7 +78,7 @@ QQ群 1126050727
|
|
|
78
78
|
- **Prompt templates** — the empty chat state shows a one-click template gallery (repo init, code review, research, merge conflicts…); click a card to fill the input, or save the current draft as your own template.
|
|
79
79
|
- **Auto-retry on model errors** — configurable retry count per conversation (default 6, `0` = fail immediately); when retries run out the failed turn is marked red with a one-click Retry button.
|
|
80
80
|
- **Queue control** — a queued steer/follow-up bubble can be dropped (✕) or **recalled (↩)**, which pulls its text back into the composer (appended on a new line if you already typed something — it never overwrites your draft).
|
|
81
|
-
- **Message anatomy** — each message header shows the role, the model that produced it and a local `HH:MM` timestamp, and every text block has a copy button. Attachments render as their own collapsible card with a mode chip (`lines` / `ref` / `bridged`
|
|
81
|
+
- **Message anatomy** — each message header shows the role, the model that produced it and a local `HH:MM` timestamp, and every text block has a copy button. Attachments render as their own collapsible card with a mode chip (`lines` / `ref` / `bridged`), a copy button and a vision-bridge “transcribed” note; a skill invocation becomes a skill card with the full `SKILL.md`, next to the arguments you typed.
|
|
82
82
|
- **Compaction, visible** — compacted context shows up as a card (“compacted from N tokens”) that auto-expands and jumps when it arrives, and a live banner counts up (“compacting context · 12s”) naming the trigger (manual / threshold / overflow).
|
|
83
83
|
|
|
84
84
|
### 🗂️ Projects & sessions
|
|
@@ -108,14 +108,14 @@ QQ群 1126050727
|
|
|
108
108
|
|
|
109
109
|
### 🖼️ Files, images & attachments
|
|
110
110
|
|
|
111
|
-
-
|
|
111
|
+
- Path references only: `reference` (path) and `lines` (selected range, carried as a `lines` attribute) — file content is **never** injected into the prompt; the model reads what it needs with its own read tool (the old `inline` full-content mode is gone; a legacy `inline` from an old client is treated as `reference`).
|
|
112
112
|
- Paste / drag-drop / upload images — resized client-side and sent as image content when the model supports vision (warning otherwise).
|
|
113
113
|
- **Vision bridge** — when the current model is text-only, images are transcribed into text evidence by an auto-discovered vision model (cached per batch; model & on/off configurable in Settings).
|
|
114
|
-
- Attach arbitrary files without a workspace path — stored in a global uploads dir
|
|
114
|
+
- Attach arbitrary files without a workspace path — stored in a global uploads dir and referenced by absolute path (never inlined).
|
|
115
115
|
- File preview — line numbers, click/drag/Shift selection (add to chat as `lines`), GBK fallback decoding, binary hex view, media preview over HTTP with Range support, and a download button.
|
|
116
116
|
- Live file tree — the server watches the listed directory (`fs.watch`) and re-lists on change; oversized directories show a truncation warning.
|
|
117
117
|
- **Browse anywhere** — the tree climbs past the workspace root to a 💻 “This computer” level that lists every mounted drive (`/` on POSIX), the breadcrumb jumps straight to any level, `..` goes up, and a listing that vanished or lost its permissions degrades into an empty list plus a warning instead of an error page.
|
|
118
|
-
- **Row actions** — hover a file for download / attach
|
|
118
|
+
- **Row actions** — hover a file for download / attach as reference (🔗) / copy name / copy path; folders offer reference-attach, copy name and copy path (copying falls back to a hidden textarea on plain-HTTP origins where the clipboard API is unavailable).
|
|
119
119
|
- **Upload from the tree** — right-click a **folder row** → **Upload files to this folder** (that folder's menu also offers **Open as project**), or right-click a file row / the panel body → **Upload files to current directory** (the directory you are browsing). Dragging OS files onto a folder row uploads into exactly that folder (the row highlights), dropping them on the panel uploads into the browsed directory, and dragging a _folder_ warns that folders aren't supported instead of doing nothing. Uploads accept one file up to 100 MB, refuse empty files, strip the name to a basename with Windows-illegal characters replaced (200-char clamp), create the target directory if needed, and refresh the listing afterwards even if you are browsing somewhere else.
|
|
120
120
|
- **Listings that stay honest** — on Windows/macOS a recursive watcher on the workspace root refreshes the tree for changes in _any_ subdirectory (400 ms debounce), with a 10 s polling fallback — announced once per workspace — on network drives where watching isn't supported; POSIX hides build noise (`node_modules`, `.git`, `dist`, `.venv`, …) and caps at 500 entries, Windows hides only dependency/VCS/data directories and caps at 2000, and both say when they truncated.
|
|
121
121
|
- **The preview is an editor too** — text files can be edited in place and saved with Ctrl/Cmd+S (2 MB cap, dirty-guarded; closing with unsaved changes asks first), Markdown toggles between rendered and source, HTML renders in a sandboxed iframe through a directory-mapped URL so relative CSS/images resolve (with a per-file “enable scripts” opt-in that never grants same-origin), images and videos stream over HTTP Range, binaries get a hex dump, and text gets line numbers, selection by click/drag/Shift (add to chat as `lines`), zoom 50–200 %, a word-wrap toggle and fullscreen.
|
|
@@ -650,7 +650,7 @@ truncated text. An optional element screenshot rides along as a chat attachment.
|
|
|
650
650
|
|
|
651
651
|
Each theme is a **pure `:root` palette override** — a small CSS file that only sets CSS variables (see the `:root` block in `web/src/styles.css` for the full variable list: base colors `--bg/--accent/--term-*` plus derived colors like `--tooltip-bg/--code-bg/--notice-*`). The layout lives ONLY in the bundled `web/src/styles.css`; picking a theme overrides the variables, so every theme works with every build and layout changes never touch themes. Built-in themes are generated by `node make-light-theme.mjs`.
|
|
652
652
|
|
|
653
|
-
Built-in themes ship in the npm package (`themes/`,
|
|
653
|
+
Built-in themes ship in the npm package (`themes/`, 25 palettes). The picker shows the named palettes (`nord`, `tokyo-night`, `catppuccin`, `one-dark`, `solarized-light`, `geist`, `ayu-light`, `claude-code-dark`, `vs-code-dark`, …) under a **Classics** heading, then the built-in presets under **Original**: `white` / `mist` / `paper` / `sakura` (light), `cyberpunk` / `dazzle` / `dark-teal` (dark), `md-preview`, and the wallpaper-friendly `translucent` / `transparent` (pair with a chat wallpaper). The theme picker lives in the top bar (🌞 icon); the current choice is stored per browser in `localStorage`.
|
|
654
654
|
|
|
655
655
|
### Using a theme
|
|
656
656
|
|
|
@@ -698,7 +698,6 @@ All optional — the defaults are what the app is developed against. Full refere
|
|
|
698
698
|
| `PI_WEB_STALL_NOTIFY_MS` | `180000` (3 min) | Warn — without aborting — when a streaming run produces no event at all; `0` disables. |
|
|
699
699
|
| `PI_WEB_TERMINAL_IDLE_MS` | `15000` | Nudge the AI when a terminal it opened goes silent for this long; `0` disables. |
|
|
700
700
|
| `PI_WEB_TERMINAL_IDLE_LINES` | `10` | How many trailing terminal lines that nudge quotes back (1–500). |
|
|
701
|
-
| `PI_WEB_INLINE_FILE_MAX` | `12288` (12 KB) | Size under which a path-less uploaded file is inlined instead of referenced. |
|
|
702
701
|
| `PI_WEB_VISION_TIMEOUT_MS` | `90000` | Timeout for one whole vision-bridge transcription batch. |
|
|
703
702
|
| `PI_WEB_UPLOAD_RETENTION_DAYS` | `14` | Retention for `<dataDir>/uploads/`; `0` never sweeps. |
|
|
704
703
|
| `PI_WEB_SHELL` | auto | Windows only: which shell node-pty spawns (auto: `PI_WEB_SHELL` → `$SHELL` → Git Bash → bundled busybox → `%COMSPEC%` → PowerShell). |
|
package/README.zh-CN.md
CHANGED
|
@@ -39,7 +39,7 @@ QQ群 1126050727
|
|
|
39
39
|
- **提示词模板** —— 空对话状态展示一键模板库(仓库初始化、代码审查、调研、合并冲突……);点卡片即填入输入框,也可把当前草稿存成自己的模板。
|
|
40
40
|
- **模型报错自动重试** —— 按对话可配置重试次数(默认 6,`0` = 失败即停);次数用完则失败轮次标红,红色报错旁有一键「重试」按钮。
|
|
41
41
|
- **排队可控** —— 排队/插队的气泡可以 ✕ 移除,也可以 ↩ **撤回**:文字落回输入框(输入框非空时另起一行追加,绝不覆盖正在打的字)。
|
|
42
|
-
- **消息自带信息** —— 每条消息头部显示角色、产出它的模型和本地 `HH:MM` 时间,每段文本都有复制按钮。附件渲染为独立可折叠卡片(模式徽章 `lines`/`ref`/`bridged
|
|
42
|
+
- **消息自带信息** —— 每条消息头部显示角色、产出它的模型和本地 `HH:MM` 时间,每段文本都有复制按钮。附件渲染为独立可折叠卡片(模式徽章 `lines`/`ref`/`bridged` + 复制按钮 + 视觉桥「已转写」说明),技能调用渲染为技能卡(展开可见完整 `SKILL.md`),你输入的参数单独成气泡。
|
|
43
43
|
- **压缩看得见** —— 上下文压缩显示为一张卡片(「已压缩 N tokens」),到货时自动展开并跳转;压缩进行中横幅实时计数(「正在压缩 · 12s」)并标明触发原因(手动 / 阈值 / 溢出)。
|
|
44
44
|
|
|
45
45
|
**项目与会话**
|
|
@@ -69,14 +69,14 @@ QQ群 1126050727
|
|
|
69
69
|
|
|
70
70
|
**文件、图片与附件**
|
|
71
71
|
|
|
72
|
-
-
|
|
72
|
+
- 一律只给路径引用:`reference`(仅路径)/ `lines`(选中行范围,引用上带行号),**文件内容永不注入 prompt**——模型用自己的 read 工具按需读(旧版 `inline` 全文注入已移除,旧客户端/旧草稿发来的 `inline` 按 `reference` 处理)。
|
|
73
73
|
- 粘贴 / 拖拽 / 上传图片 —— 浏览器端自动缩放,模型支持识图时作为图片内容发送(不支持时提示警告)。
|
|
74
74
|
- **视觉桥** —— 当前模型不支持识图时,把图片交给自动发现的视觉模型转写成文字证据(按批次缓存,可在设置里指定模型/开关)。
|
|
75
|
-
- 免工作区路径附加任意文件 ——
|
|
75
|
+
- 免工作区路径附加任意文件 —— 存入全局上传目录,以绝对路径引用(内容不注入)。
|
|
76
76
|
- 文件预览 —— 行号、点选/拖拽/Shift 选区(可添加到对话为 lines 附件)、GBK 回退解码、二进制十六进制视图、媒体 HTTP 预览(支持 Range)、下载按钮。
|
|
77
77
|
- 实时文件树 —— 服务端对当前列出目录 fs.watch,改动即静默重列;超大目录显示截断提示。
|
|
78
78
|
- **能浏览到工作区之外** —— 文件树可以越过工作区根到 💻「此电脑」层,列出所有盘符(POSIX 下是 `/`);面包屑可直接跳到任意层级,`..` 回上级;目录被删/改名/无权限时降级为空列表 + 提示,而不是报错页。
|
|
79
|
-
- **行内操作** —— 悬停文件:下载 /
|
|
79
|
+
- **行内操作** —— 悬停文件:下载 / 引用附件(🔗)/ 复制名称 / 复制路径;悬停文件夹:引用附件、复制名称、复制路径(纯 HTTP 环境下剪贴板不可用时自动走兜底实现)。
|
|
80
80
|
- **从文件树上传** —— 右键**文件夹行** →「上传文件到此文件夹」(同一菜单里还有「以项目打开」);右键文件行或面板空白 →「上传文件到当前目录」(你正在浏览的那一层)。把系统文件拖到文件夹行上就上传到那一个文件夹(该行高亮),拖到面板则上传到当前目录;拖入的是**文件夹**会明确提示不支持,而不是静默没反应。单文件上限 100MB,空文件会被拒绝,文件名只取 basename 并替换 Windows 非法字符(限 200 字),目标目录不存在会自动创建,上传完成后列表会刷新——哪怕你当时正浏览别的地方。
|
|
81
81
|
- **列表状态的边界** —— Windows/macOS 用工作区根的递归监听,**任何**子目录的改动都会刷新(400ms 防抖);不支持监听的网络盘回退为 10 秒轮询(每个工作区只提示一次);POSIX 隐藏构建噪声(`node_modules`、`.git`、`dist`、`.venv` ……)且最多 500 条,Windows 只隐藏依赖/VCS/数据目录且最多 2000 条,两者被截断时都会明说。
|
|
82
82
|
- **预览也是编辑器** —— 文本文件可直接改并用 Ctrl/Cmd+S 保存(限 2MB、未改动时保存置灰、带未保存改动关闭会先确认);Markdown 可切渲染/原文;HTML 在沙箱 iframe 里渲染,走目录映射 URL 让相对 CSS/图片正常加载(「启用脚本」是逐文件开关,且永不开同源);图片/视频走 HTTP Range 流式;二进制给十六进制视图;文本支持行号、点选/拖拽/Shift 选区(作为 `lines` 附件添加)、50–200% 缩放、自动换行开关与全屏。
|
|
@@ -581,7 +581,6 @@ pi-web-ui uninstall <id> # 卸载插件
|
|
|
581
581
|
| `PI_WEB_STALL_NOTIFY_MS` | `180000`(3 分) | 流式运行完全没事件时给警告(不中止);`0` = 关。 |
|
|
582
582
|
| `PI_WEB_TERMINAL_IDLE_MS` | `15000` | AI 开过的终端静默这么久就催它去看一眼;`0` = 关。 |
|
|
583
583
|
| `PI_WEB_TERMINAL_IDLE_LINES` | `10` | 该催命消息回送的终端尾部行数(1–500)。 |
|
|
584
|
-
| `PI_WEB_INLINE_FILE_MAX` | `12288`(12KB) | 小于它且无工作区归属的上传文件被内联而不是只给路径。 |
|
|
585
584
|
| `PI_WEB_VISION_TIMEOUT_MS` | `90000` | 视觉桥整批转写的超时。 |
|
|
586
585
|
| `PI_WEB_UPLOAD_RETENTION_DAYS` | `14` | `<dataDir>/uploads/` 保留天数;`0` = 不清理。 |
|
|
587
586
|
| `PI_WEB_SHELL` | 自动 | 仅 Windows:node-pty 用哪个 shell(自动顺序:`PI_WEB_SHELL` → `$SHELL` → Git Bash → 随包 busybox → `%COMSPEC%` → PowerShell)。 |
|