pi-web-ui 0.96.0 → 0.97.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.
Files changed (42) hide show
  1. package/CHANGELOG.md +69 -2
  2. package/README.md +26 -0
  3. package/README.zh-CN.md +25 -0
  4. package/bin/pi-web-ui.mjs +11 -2
  5. package/dist/server/agent-service.js +1195 -120
  6. package/dist/server/client-state.js +89 -1
  7. package/dist/server/compacted-history.js +146 -0
  8. package/dist/server/delegate-mode.js +149 -0
  9. package/dist/server/delegate-task.js +10 -10
  10. package/dist/server/dsh/dsh-agent-service.js +35 -2
  11. package/dist/server/dsh/dsh-client.js +3 -1
  12. package/dist/server/eval-tool.js +3 -1
  13. package/dist/server/goal-review-gate.js +263 -0
  14. package/dist/server/goal-service.js +1225 -445
  15. package/dist/server/index.js +79 -20
  16. package/dist/server/lsp-tool.js +13 -10
  17. package/dist/server/markers/builtins/todo.js +0 -2
  18. package/dist/server/mcp-bridge.js +13 -0
  19. package/dist/server/patch-tool.js +1 -0
  20. package/dist/server/patch-turn-end-boundary.js +77 -0
  21. package/dist/server/permission-preset.js +44 -0
  22. package/dist/server/plan-mode.js +376 -0
  23. package/dist/server/plugin-facilities.js +36 -3
  24. package/dist/server/plugin-installer.js +30 -0
  25. package/dist/server/plugins.js +6 -3
  26. package/dist/server/protocol-version.js +1 -1
  27. package/dist/server/serialize.js +11 -0
  28. package/dist/server/settings-service.js +20 -8
  29. package/dist/server/subagents.js +360 -408
  30. package/dist/server/text-sniff.js +15 -9
  31. package/dist/server/tool-manager.js +48 -4
  32. package/dist/server/update-check.js +11 -3
  33. package/dist/server/wait-subscription-scan.js +5 -1
  34. package/package.json +3 -3
  35. package/themes/zhupi-dark.css +79 -44
  36. package/themes/zhupi.css +79 -44
  37. package/web/dist/assets/{TerminalPanel-DDChcYOh.js → TerminalPanel-CITBqQrb.js} +1 -1
  38. package/web/dist/assets/index-DwToli0J.css +1 -0
  39. package/web/dist/assets/index-oI7UKOqJ.js +368 -0
  40. package/web/dist/index.html +2 -2
  41. package/web/dist/assets/index-Do9RgJC3.js +0 -366
  42. package/web/dist/assets/index-DryOsILO.css +0 -1
package/CHANGELOG.md CHANGED
@@ -10,6 +10,69 @@
10
10
 
11
11
  ## [Unreleased]
12
12
 
13
+ ## [0.97.0] — 2026-09-26
14
+
15
+ ### Added
16
+
17
+ - **左侧边栏历史会话置顶(#388)** —— 支持置顶/取消置顶历史会话,置顶项目始终固定在会话历史列表顶端,配合本地客户端状态持久化,多窗口即时同步;优化磁盘扫描算法,仅按需快速探测头部读取元数据,大幅提升大历史会话加载响应速度。回归:`tests/unit/client-state-recent-projects.test.ts`。
18
+
19
+ - **规划门禁与净室交接范式升级(#389)** —— 吸收主流规划与看板范式(DSH / narumitw / plannotator),全面升级「计划与目标」联动架构:
20
+ - **只读规划门禁(Plan Gate)与状态机**:开启计划模式后自动剥离写类工具及旁路工具,物理级杜绝代码倾倒;
21
+ - **净室新会话交接(Clean Handoff)**:支持一键将规划好的目标与步骤交接至全新隔离会话中施工,避免长推理上下文污染;
22
+ - **可视化编辑与导出**:任务看板支持 Markdown 一键复制/导出,步骤支持内联编辑、新增、删除与状态切换;
23
+ - **目标审查深度联动**:审查指令自动附带任务看板步骤推进状态,核验计划真实完成度。
24
+ 回归:`tests/plan-mode-test.mjs`、`tests/unit/goal-delegated.test.ts`。
25
+
26
+ - **对话可「钉住」常驻运行列表** —— 左栏「运行的对话」右键新增「钉住」:被钉的对话切到别的对话也不释放运行时(空闲、无存活终端、无后台任务时同样保留,优先级高于「打开未继续即移出」等所有自动规则),直到显式移出或强行关闭;取消钉住后立即恢复原有释放策略。进程内有效、不落盘。回归:`tests/unit/conv-pin.test.ts`、`tests/unit/wait-subscription-scan.test.ts`、`tests/conv-pin-browser-test.mjs`(真浏览器右键 → 钉住/取消钉住 → 切走仍留存 / 对照移出)。
27
+
28
+ - **上下文压缩后支持展开/查看被折叠的历史对话(#398)** —— 严格解耦「UI 展示流」与「LLM 推理视窗」:触发压缩(Compaction)后,在 `CompactionCard` 底部提供「展开查看被折叠的历史」操作栏,按需(On-demand)从会话 DAG 祖先链中还原被该节点折叠的原始历史消息(含提问、回答与工具输出),并以只读流视窗呈现,不占用后续推理 Token,解决长对话截断后无法回溯方案与日志的痛点。回归:`tests/unit/compacted-history.test.ts`。
29
+
30
+ - **粘贴任意文件直接附加** —— 在输入框粘贴从文件管理器复制的文件(文本、PDF、压缩包等)会像拖拽一样变成待发附件,不再只能贴图片:粘贴与拖拽现在共用同一条分流逻辑(图片走视觉管线并保留 text-only 模型的拦截,其余走 fileData 上传,20MB 上限同口径),纯文本粘贴完全不受影响。回归:`tests/unit/clipboard-files.test.ts` + `tests/file-paste-browser-test.mjs`。
31
+
32
+ - **语音输入可主动选识别方式(#383)** —— 麦克风浮层新增常驻的「切换识别方式」面板(浏览器联网识别 / 本地 Whisper / 远端接口),选中即用并写回插件设置,下次点 🎤 直接走这一档;「转写引擎」设为本地或远端时,点 🎤 直接走对应引擎(本地没装就直接弹一键安装,不必再干等浏览器联网失败几秒)。
33
+
34
+ ### Fixed
35
+
36
+ - **任务看板 / 目标条窄屏排版协调** — 手机宽度下任务看板的「任务看板」「0/6 (0%)」被当前步骤挤成逐字竖排(行内 flex 子项默认 `min-width: auto` 且允许收缩,CJK 逐字断行),目标条的「最大轮数」标签同样竖排、「锁定:应用到后续所有回合」被挤成两行。现改为:看板标题与计数钉死不收缩、当前步骤 chip 放不下就整块换到第二行(宽屏仍同行);目标条输入框独占一行、按钮组换行右对齐,偏好行允许整块换行、模型长 id 断行不外溢,锁定说明与标签不再被压扁。回归:`tests/unit/text-wrap.test.ts`、`tests/unit/css-tokens.test.ts`、`tests/chat-column-align-test.mjs`。
37
+ - **本地语音运行时「装成功却报没装上」(#383)** —— 修复安装本地 Whisper 后仍报「npm install 没跑通」:Node 的 CJS 解析会把 `package.json` 不存在的负结果缓存整个进程,装完复查永远命中它。依赖探测改为「解析失败再看文件是否已落盘」,插件侧也改为直接按 `package.json` 定位 transformers.js 入口,不再依赖被污染的解析缓存(非重启服务即可恢复)。
38
+ - **模型下载源可配(#383)** —— 新增「模型下载源」设置(也认环境变量 `HF_ENDPOINT`),国内直连 huggingface.co 超时时可填 `https://hf-mirror.com`。
39
+ - **语音浮层计时器泄漏** —— 切换识别方式时上一个浮层的计时器不再残留(此前每切一次泄一个 500ms 定时器)。
40
+
41
+ <!-- auto-i18n:start -->
42
+
43
+ ### i18n
44
+
45
+ - 前端新增 key(67):`elsewherePseudoBadge`、`elsewherePseudoTip`、`pinConversation`、`unpinConversation`、`pinnedConversation`、`planImplementBtn`、`planImplementTip`、`planImplementRequest`、`planBoardExportMarkdown`、`planBoardExportSuccess`、`planCleanHandoffBtn`、`planCleanHandoffTip`、`planCleanHandoffPrompt`、`planBoardAddStep`、`planBoardEditStep`、`planBoardDeleteStep`、`planBoardStepTitlePlaceholder`、`planBoardStepDescPlaceholder`、`placeholderPlanMode`、`planModeBadge`、`viewCompactedHistory`、`hideCompactedHistory`、`compactedHistoryLoading`、`compactedHistoryEmpty`、`compactedHistoryBadge`、`compactedHistoryTurns`、`planMode`、`planActionBtn`、`planActionTip`、`planModeTip`、`planModeTipOn`、`goalBarExecModel`、`goalBarExecModelTip`、`goalBarOpenExec`、`goalBarOpenExecTip`、`goalBarStaleBackend`、`goalBarStop`、`goalBarExecuting`、`goalHistory`、`delegateMode`、`delegateModeDesc`、`delegateModeOffHint`、`delegateModeBadge`、`delegateModeBadgeTip`、`delegateModeOpenTip`、`toolCorePowershellDesc`、`toolCoreLsDesc`、`toolCoreGrepDesc`、`toolCoreFindDesc`、`pluginToolsDisabledByPlugin`、`pluginDisabledInPlugins`、`toolDescSubagent`、`planModePromptSettingsTitle`、`planModePromptSettingsDesc`、`planModePromptMode`、`planModePromptPlaceholder`、`planModePromptSettingsHint`、`preset.standard`、`preset.minimal`、`preset.code`、`preset.reader`、`preset.ask`、`preset.standardDesc`、`preset.minimalDesc`、`preset.codeDesc`、`preset.readerDesc`、`preset.askDesc`
46
+ - 前端中文变更(9):`planBoardTitle`、`goalBarPlaceholder`、`goalBarSet`、`goalBarReviewModel`、`goalBarMaxRoundsTip`、`goalWizardBtn`、`toolsCoreHint`、`toolsSubagentDepHint`、`delegateTaskOffHint`
47
+ - 前端英文变更(9):`planBoardTitle`、`goalBarPlaceholder`、`goalBarSet`、`goalBarReviewModel`、`goalBarMaxRoundsTip`、`goalWizardBtn`、`toolsCoreHint`、`toolsSubagentDepHint`、`delegateTaskOffHint`
48
+ - 服务端新增 key(18):`agent.role.stop`、`goal.role.blocked`、`goal.role.conv_title`、`goal.role.exec`、`goal.role.card.start`、`goal.role.card.result`、`goal.role.review`、`goal.role.review.retry`、`subagents.action.missing`、`subagents.spawn.missing.prompt`、`subagents.get.missing.runId`、`subagents.steer.missing.runId`、`subagents.steer.missing.message`、`subagents.stop.missing.runId`、`subagents.wait.item.missing`、`subagents.handoff.missing.toRunId`、`subagents.handoff.missing.payload`、`subagents.action.unknown`
49
+ - 服务端文案变更(10):`delegate.validate.agent`、`delegate.validate.short`、`delegate.started`、`subagents.spawn.template.unavailable`、`subagents.spawn.started`、`subagents.steer.not.found`、`subagents.stop.not.found`、`subagents.wait.empty`、`subagents.templates.list`、`subagents.handoff.not.found`
50
+ - 服务端删除 key(9):`goal.set.kick`、`goal.wizard.kick`、`goal.review.incomplete`、`goal.autonomous.pass`、`goal.review.blocked`、`goal.autonomous.continue`、`goal.review.error`、`goal.review.blocked_msg`、`goal.review.revise`
51
+
52
+ <!-- auto-i18n:end -->
53
+
54
+ ## [0.96.1] — 2026-09-26
55
+
56
+ ### Fixed
57
+
58
+ - **插件安装审批弹窗层级提升与进度反馈补齐(#382)** —— 将能力与目录访问审批弹窗提升至高于设置弹窗的顶层浮层(`z-index: 350`),无需关闭设置页;修复「记住并允许」未持久化问题,授权写入 `plugin-permissions.json` 并在再次安装时直接放行;点击安装即刻反馈等待确认/执行中状态,已安装列表补挂进度条,关闭弹窗后主界面提供全局进度指示。
59
+ - **顶栏全部居中对齐时偏右修复** —— 修复当顶栏条目全部设为居中时,因右侧缺失占位弹簧(`tb-spacer`)导致条目被左侧单个弹簧推向最右侧的问题,确保中间条目精准水平居中。
60
+ - **设置保存回执时序修复** —— 确保 `set_settings` 在触发 `needsReload` 重启前先行持久化并推送状态回执。
61
+
62
+ ### Changed
63
+
64
+ - **朱批与朱批·夜主题界面精细化** —— 顶栏控件全面素色化(透明底、无边框,悬停现 hairline);消息折叠条内边距清零,折叠指示三角光学对齐左侧墨线;输入框边框微调,发送/停止按钮微调为圆形;输入框底部模型选择、思考强度、预设等按钮去边框透明底,悬停显示细边框。
65
+ - **输入框与顶栏控件排版微调** —— 顶栏 chip 统一幽灵化;输入框底部模型与思考强度 chip 尺寸微调收紧;思考强度 Chip 文案精简为 `{level}`,保留 tooltip 说明;预设选择器图标优化为 `FiSliders`。
66
+
67
+ <!-- auto-i18n:start -->
68
+
69
+ ### i18n
70
+
71
+ - 前端中文变更(1):`thinkingChip`
72
+ - 前端英文变更(1):`thinkingChip`
73
+
74
+ <!-- auto-i18n:end -->
75
+
13
76
  ## [0.96.0] — 2026-09-26
14
77
 
15
78
  ### Added
@@ -32,9 +95,10 @@
32
95
  ### Changed
33
96
 
34
97
  - **输入框 `@` 提及支持技能(skills)自动补全** —— 在消息文本任意位置键入 `@` 或 `@skill:` 即可弹出技能候选列表(名称匹配优先于描述匹配,支持中英文双语描述检索与 `@page` 页面置顶防挤占);点选后自动在光标处插入 `@skill:<name>` 词元,与 Pi 运行时的技能提升扩展无缝联动。
35
- - **收敛型澄清提问与决策就绪型计划规范(#330)** —— `ask_user_question` 现在单次严格限制 1~3 个问题(优先 1 个,超过 3 个直接报错阻断,防止问卷轰炸),选项 schema 收紧为 2~4 个互斥选项且推荐方案置顶,选项 description 要求一句话说明影响与权衡;`plan_update` 提示词升级为「决策就绪型」规划:动代码前先在步骤中落实排查发现(Discovery)、受影响文件清单(File Touch List)与风险回滚预案(Rollback),并随执行实时流转步骤状态。目标向导(`goal_ask` / wizardPrompt)与 DSH 澄清提示词同步对齐收敛型交互。
98
+ - **收敛型澄清提问与决策就绪型计划规范(#330)** —— `ask_user_question` 现在单次严格限制 1~~3 个问题(优先 1 个,超过 3 个直接报错阻断,防止问卷轰炸),选项 schema 收紧为 2~~4 个互斥选项且推荐方案置顶,选项 description 要求一句话说明影响与权衡;`plan_update` 提示词升级为「决策就绪型」规划:动代码前先在步骤中落实排查发现(Discovery)、受影响文件清单(File Touch List)与风险回滚预案(Rollback),并随执行实时流转步骤状态。目标向导(`goal_ask` / wizardPrompt)与 DSH 澄清提示词同步对齐收敛型交互。
36
99
 
37
100
  <!-- auto-i18n:start -->
101
+
38
102
  ### i18n
39
103
 
40
104
  - 前端新增 key(49):`reaskDirectly`、`reaskDirectlyTip`、`kindPlugin`、`pluginCheckUpdates`、`pluginCheckUpdatesHint`、`pluginUpdateAvailableBadge`、`pluginUpdateAvailableDetail`、`pluginAllUpToDate`、`piCoreSplitRun`、`piSdkSplitNote`、`piSdkBundledNote`、`installGlobalEngineBtn`、`installGlobalEngineTabTitle`、`saveResultUnknown`、`questionNoneAvailable`、`notifyApprovalTitle`、`notifyApprovalBody`、`notifyApprovalBodyTool`、`sound.approval`、`sound.approval.desc`、`settingsSoundVoice`、`ttsHeader`、`ttsEnable`、`ttsEnableDesc`、`ttsAnnounce`、`ttsAnnounceDesc`、`ttsReadReplies`、`ttsReadRepliesDesc`、`ttsRate`、`ttsVoice`、`ttsVoiceAuto`、`ttsVoiceOnline`、`ttsUnavailable`、`ttsPreviewLine`、`ttsAnnounceDone`、`ttsAnnounceQuestion`、`ttsAnnounceError`、`ttsAnnounceApproval`、`speakMsg`、`stopSpeakingMsg`、`apiKeySavedHint`、`settingsViewPromptTokens`、`settingsPromptContextTotal`、`toolsSectionCore`、`toolsCoreHint`、`toolCoreBashDesc`、`toolCoreReadDesc`、`toolCoreEditDesc`、`toolCoreWriteDesc`
@@ -43,6 +107,7 @@
43
107
  - 服务端新增 key(3):`plugincatalog.sync.doc.invalid`、`terminals.bash.nosentinel.note`、`terminals.command.blocked`
44
108
  - 服务端文案变更(1):`terminals.bash.timeout`
45
109
  - 服务端删除 key(2):`plugincatalog.sync.source.invalid`、`plugincatalog.sync.read.failed`
110
+
46
111
  <!-- auto-i18n:end -->
47
112
 
48
113
  ## [0.95.0] — 2026-09-24
@@ -1293,7 +1358,9 @@ when?, children?}`,也收 `topbar` / `settings` 这类简写别名);宿主
1293
1358
  - 0.35.1(2026-08-27):编辑重问保留附件(#18)+ 全窗口拖放(#19)。
1294
1359
  - 0.29.0(2026-08-23):全局搜索弹窗(Ctrl+K)+ 消息列表惰性窗口化。
1295
1360
 
1296
- [Unreleased]: https://github.com/xing-shuyin/pi-web-ui/compare/v0.96.0...main
1361
+ [Unreleased]: https://github.com/xing-shuyin/pi-web-ui/compare/v0.97.0...main
1362
+ [0.97.0]: https://github.com/xing-shuyin/pi-web-ui/releases/tag/v0.97.0
1363
+ [0.96.1]: https://github.com/xing-shuyin/pi-web-ui/releases/tag/v0.96.1
1297
1364
  [0.96.0]: https://github.com/xing-shuyin/pi-web-ui/releases/tag/v0.96.0
1298
1365
  [0.95.0]: https://github.com/xing-shuyin/pi-web-ui/releases/tag/v0.95.0
1299
1366
  [0.94.1]: https://github.com/xing-shuyin/pi-web-ui/releases/tag/v0.94.1
package/README.md CHANGED
@@ -301,6 +301,32 @@ silences the warning):
301
301
  npm i -g --allow-scripts=node-pty,@google/genai,protobufjs pi-web-ui@latest
302
302
  ```
303
303
 
304
+ ### 🐧 Linux build prerequisites
305
+
306
+ `node-pty` (the built-in terminal) publishes prebuilds only for macOS and Windows,
307
+ so on Linux `npm install` always falls back to `node-gyp` and compiles it from
308
+ source. Install a C/C++ toolchain **before** installing pi-web-ui:
309
+
310
+ ```bash
311
+ # Debian / Ubuntu
312
+ sudo apt-get install -y build-essential python3
313
+ # Fedora / RHEL
314
+ sudo dnf install -y python3 make gcc-c++
315
+ # Arch
316
+ sudo pacman -S --needed base-devel python
317
+ ```
318
+
319
+ Without it the whole install aborts with:
320
+
321
+ ```
322
+ npm error path .../node_modules/node-pty
323
+ npm error command sh -c node scripts/prebuild.js || node-gyp rebuild
324
+ npm error > Rebuilding because directory .../node_modules/node-pty/prebuilds/linux-x64 does not exist
325
+ npm error make: g++: No such file or directory
326
+ ```
327
+
328
+ Android / Termux is a special case — see [Termux (Android)](#termux-android).
329
+
304
330
  ### 🖥️ Desktop app (Windows installer)
305
331
 
306
332
  Prefer a window over a browser tab? Every release ships installers built from
package/README.zh-CN.md CHANGED
@@ -250,6 +250,31 @@ node-pty 是原生模块,需要放行其脚本(其余两个包只是 no-op/
250
250
  npm i -g --allow-scripts=node-pty,@google/genai,protobufjs pi-web-ui@latest
251
251
  ```
252
252
 
253
+ ### 🐧 Linux:安装前的编译依赖
254
+
255
+ 内置终端依赖的 `node-pty` 只发布 macOS / Windows 的预编译产物,Linux 上
256
+ `npm install` 一律回退到 `node-gyp` 源码编译。请在安装 pi-web-ui **之前**装好 C/C++ 工具链:
257
+
258
+ ```bash
259
+ # Debian / Ubuntu
260
+ sudo apt-get install -y build-essential python3
261
+ # Fedora / RHEL
262
+ sudo dnf install -y python3 make gcc-c++
263
+ # Arch
264
+ sudo pacman -S --needed base-devel python
265
+ ```
266
+
267
+ 缺少时会整体安装失败:
268
+
269
+ ```
270
+ npm error path .../node_modules/node-pty
271
+ npm error command sh -c node scripts/prebuild.js || node-gyp rebuild
272
+ npm error > Rebuilding because directory .../node_modules/node-pty/prebuilds/linux-x64 does not exist
273
+ npm error make: g++: No such file or directory
274
+ ```
275
+
276
+ Android / Termux 是特殊情况,见 [Termux(Android)](#termuxandroid)。
277
+
253
278
  ### Termux(Android)
254
279
 
255
280
  pi-web-ui 可以通过 [Termux](https://termux.dev) 在 Android 上运行,但原生依赖
package/bin/pi-web-ui.mjs CHANGED
@@ -545,6 +545,15 @@ function winWscript() {
545
545
  return join(process.env.SystemRoot ?? "C:\\Windows", "System32", "wscript.exe");
546
546
  }
547
547
 
548
+ /**
549
+ * The node binary the launcher scripts must bake in: the executable this
550
+ * process itself runs on. Under Bun this resolves to bun, so a Bun-hosted
551
+ * install never bakes in pi.exe.
552
+ */
553
+ function resolveNode() {
554
+ return process.execPath;
555
+ }
556
+
548
557
  /**
549
558
  * Resolve the real node binary. fnm/volta/nvm shims (e.g. fnm_multishells)
550
559
  * point into temp dirs that vanish when the installing shell exits — the
@@ -657,7 +666,7 @@ function buildWinShortcutPs1(env, cwd, taskName, url, logPath, pidPath) {
657
666
  " try { if ((Invoke-WebRequest -Uri $h -UseBasicParsing -TimeoutSec 2).StatusCode -eq 200) { Start-Process $u | Out-Null; break } } catch {}",
658
667
  " }",
659
668
  "} -ArgumentList $url",
660
- `& ${psQuote(node)} ${HAS_SDK_HOOK ? `--import ${psQuote(SDK_HOOK)} ` : ""}${psQuote(SERVER_ENTRY)} *>> $log`,
669
+ `& ${psQuote(node)} ${HAS_SDK_HOOK ? `--import ${psQuote(pathToFileURL(SDK_HOOK).href)} ` : ""}${psQuote(SERVER_ENTRY)} *>> $log`,
661
670
  "Remove-Item $pidFile -ErrorAction SilentlyContinue",
662
671
  "",
663
672
  ].join("\r\n");
@@ -981,7 +990,7 @@ function buildWinStartPs1(env, cwd, logPath, pidPath) {
981
990
  `$PID | Out-File -Encoding ascii ${psQuote(pidPath)}`,
982
991
  "try {",
983
992
  " while ($true) {",
984
- ` & ${psQuote(realNode())} ${HAS_SDK_HOOK ? `--import ${psQuote(SDK_HOOK)} ` : ""}${psQuote(SERVER_ENTRY)} *>> ${psQuote(logPath)}`,
993
+ ` & ${psQuote(realNode())} ${HAS_SDK_HOOK ? `--import ${psQuote(pathToFileURL(SDK_HOOK).href)} ` : ""}${psQuote(SERVER_ENTRY)} *>> ${psQuote(logPath)}`,
985
994
  " Start-Sleep 10",
986
995
  " }",
987
996
  "} finally {",