pi-web-ui 0.86.2 → 0.87.1
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 +84 -23
- package/README.md +1 -1
- package/bin/pi-web-ui.mjs +312 -40
- package/dist/server/agent-service.js +377 -25
- package/dist/server/client-state.js +8 -0
- package/dist/server/composer-drafts.js +138 -0
- package/dist/server/dsh/dsh-agent-service.js +535 -54
- package/dist/server/dsh/dsh-client.js +28 -0
- package/dist/server/dsh/dsh-sessions.js +28 -0
- package/dist/server/dsh/dsh-usage.js +82 -0
- package/dist/server/dsh/preset-clones.js +260 -0
- package/dist/server/dsh/runtime/custom-prompt.mjs +33 -0
- package/dist/server/dsh/runtime/goal-rpc.mjs +406 -22
- package/dist/server/dsh/runtime/launcher.mjs +17 -0
- package/dist/server/dsh/runtime/override.patch.yml +19 -1
- package/dist/server/files-service.js +259 -1
- package/dist/server/index.js +244 -5
- package/dist/server/mcp-bridge.js +126 -22
- package/dist/server/mcp-hot-reload.js +117 -0
- package/dist/server/model-admin.js +93 -3
- package/dist/server/plugin-dom.js +83 -0
- package/dist/server/plugin-facilities.js +15 -1
- package/dist/server/plugin-installer.js +6 -0
- package/dist/server/plugins.js +781 -74
- package/dist/server/protocol-version.js +1 -1
- package/dist/server/provider-oauth-flow.js +157 -0
- package/dist/server/update-check.js +22 -0
- package/package.json +1 -1
- package/plugins/catalog.json +9 -0
- package/themes/dark-teal.css +65 -22
- package/web/dist/assets/index-8xCnPMZP.js +374 -0
- package/web/dist/assets/index-F86qWlJy.css +41 -0
- package/web/dist/index.html +3 -2
- package/web/dist/assets/TerminalPanel-BytY8dx7.js +0 -6
- package/web/dist/assets/TerminalPanel-DOrYoP_4.css +0 -32
- package/web/dist/assets/index-CKoVyDkP.css +0 -10
- package/web/dist/assets/index-Dmwji4Cr.js +0 -361
package/CHANGELOG.md
CHANGED
|
@@ -8,7 +8,64 @@
|
|
|
8
8
|
每个版本的内容按"实际合入该版本发布的提交"归档(以 `package.json` 的 version 变更提交为准),
|
|
9
9
|
而不是按提交日期聚类——连续快速发布的 patch 版本以此为准最准确。
|
|
10
10
|
|
|
11
|
-
## [
|
|
11
|
+
## [0.87.1] — 2026-09-16
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- **重启服务不再杀死进行中的对话,回来自动续上**(#171)—— 以前升级/手工重启会把在跑的 run 静默杀死,用户得去历史对话里手动找回。现在关停与 `restart_service` 都会先把仍在 streaming 的会话记下来(含 session 文件);重连后首次 attach 自动逐个重开并发送一句「继续」,从持久化上下文接着跑;恢复完视图回到原来停的那条,后台续跑的不抢焦点。没有 session 文件的才回落为黄色提醒。pi 引擎独有(DSH 暂无此记录)。
|
|
16
|
+
|
|
17
|
+
- **语音输入本地模型新增 `small` 档** —— 2.44 亿参数(约 500MB 下载),中文同音字明显少于 base;代价是 CPU 转写比 base 慢 3~4 倍。设置 → 界面插件 → 语音输入 → 本地模型,切换后点 🎤 按提示安装即可(之前下的 base/tiny 留着不碍事)。
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
|
|
21
|
+
- **`npm start` 带进来的环境变量不再污染子进程**(#169)—— `npm start` 会把 `npm_config_*` / `npm_package_*` / `npm_lifecycle_*` 导出给所有子进程,服务端拉起的 shell、`pi update` 等会继承到 `npm_config_allow_scripts`,npm 在项目级安装里直接拒绝(EALLOWSCRIPTS)。现在服务端启动时一次性 scrub,unit 文件不用动,所有 spawn 路径一次修好。
|
|
22
|
+
- **组件更新面板把“有更新的”排前面**(#170)—— 以前按 manifest 顺序列,可用的更新常被埋在一堆“已是最新”下面。现在服务端统一排序:pi-web-ui 与 pi-core 置顶(状态无关),然后有更新的、已最新的,最后是出错的;各客户端看到同一顺序。
|
|
23
|
+
- **语音输入“识别成功了还弹服务端录音”** —— 点「改用服务端录音」(或自动降级)时 `abort()` 激起的 `onend` 把已识别的半截文字又收尾一次:字进了输入框,录音浮层也弹了出来。现在切服务端途中立旗吞掉多余事件;自动降级时有字优先收尾(挂起的切换自动取消)、没字才进录音。
|
|
24
|
+
- **语音输入服务端转写永远为空** —— 录音分片收尾误用了声道平均的 `downmix`,把整段录音按时间“平均”成 128 个采样的糊发给 Whisper,只能回空。改成按时间轴拼接;模型本身没问题(之前 `ready:true` 是真的)。
|
|
25
|
+
- **dark-teal 主题的分体发送按钮阴影补上**(#168,社区)—— `.split-send` 漏进了发送/停止按钮的阴影规则,hover 光晕一并补齐。
|
|
26
|
+
|
|
27
|
+
## [0.87.0] — 2026-09-16
|
|
28
|
+
|
|
29
|
+
### Added
|
|
30
|
+
|
|
31
|
+
- **插件市场支持「从目录同步」**(issue #165)—— 设置面板插件市场头部新增同步入口:填一个目录文档 URL(http(s))或本地绝对路径,一键同步可安装列表(走服务端现成的 `plugin_catalog_sync` 通道:同校验、同原子写盘;可选同步后安装全部条目 / 整体替换,逐条安装结果就地回显)。成功同步过的 URL 记在浏览器 localStorage(最近 8 个),一点即重同步。第三方仓库从此不需要再为同步专门发一个占位插件。
|
|
32
|
+
- **`install --catalog <url>` 与 `PI_WEB_PLUGIN_CATALOG_URL`**(issue #165)—— headless/预置场景:CLI 从目录文档同步列表并逐条安装/更新(已安装默认跳过,`--force` 更新,`--replace` 整体替换,单条失败不中断整批;`--build` / `--no-build` 对逐条同样生效);服务端启动时若配了该环境变量则自动同步一次并安装,失败只告警不阻断启动。
|
|
33
|
+
|
|
34
|
+
- **插件特权 DOM 授权 + 宿主 API v7**(#159)—— 插件 bundle 与主应用同源,JS 层面拦不住它碰 `document`,真正的门禁只能放在 bundle 下发处:manifest `permissions` 含 `dom` 族的插件 bundle 默认 403,需用户在设置面板逐个授权(`<dataDir>/plugin-dom.json`,整机全局,授权后 epoch+1 让浏览器重拉);只挂载锚点范围 DOM 的 `dom:anchor` 免用户授权。`apiVersion` 高于宿主则拒绝激活并提示升级 pi-web-ui。
|
|
35
|
+
- **输入框 `@` 提及文件/目录**(#159)—— `@` 后直接搜工作区文件,点选即追加附件 chip(inline/reference/lines);`a@b` 这类邮箱不误触,中文无空格书写(`请看@文件`)也能触发。
|
|
36
|
+
- **右栏文件树右键操作** —— 文件/文件夹右键可新建文件/文件夹、重命名、复制/剪切/粘贴、创建副本、删除、上传文件,行尾按钮可复制名称/路径;文件夹右键「以项目打开」切换项目。右栏 `?` 帮助条同步写明全部手势。
|
|
37
|
+
- **内置服务商 OAuth 登录**(#159)—— 模型配置按服务商认证能力切换 OAuth 与 API Key 两套入口:设备验证码、交互提示、取消、重连恢复与登出,凭据隔离存放。
|
|
38
|
+
- **改 `mcp.json` 保存即生效**(#158)—— `fs.watch` 盯配置(防抖 300ms + 指纹比对,不支持时回落轮询):规格等价的服务器沿用原实例(改一个不连带重启其它),新增/变更的先启动成功才换入,坏配置只提示一次、不断掉在跑的工具;工具表变更实时推给已有会话与新建会话。另修 `protocolVersion` 解析(握手与热加载指纹口径一致)。
|
|
39
|
+
- **右栏直达用户目录与桌面** —— 文件树面包屑新增 🏠(用户主目录)与 🖥️(桌面,Linux 读 XDG user-dirs,中文环境认 `~/桌面`);旧服务不提供时按钮自动隐藏。
|
|
40
|
+
|
|
41
|
+
- **DSH 引擎复刻 dsh-web 四模式 Agent 预设** —— standard(全功能)/ PTC(`run_code` 组合面)/ minimal(单持久 shell)/ cordis(组合创作),与官方同名录同语义:新对话下拉选择、空白会话可切换、首轮发言后锁定、默认预设在设置面板配置、自建预设(`$DSH_HOME/.agent-presets`)照常上架。自定义系统提示词改走独立 host section(standard/ptc/cordis 下发,minimal 按官方语义压住)。已知限制:自建组合里写裸包名的无法挂载(launcher 式 boot 的 baseUrl 所限);问卷/技能目录钩子改挂 agent scope(旧 host 写法在新版运行时已失效)。
|
|
42
|
+
|
|
43
|
+
- **未发送的输入框草稿跨刷新/切换自动恢复**(issue #166,单中心文件方案)—— 以前刷新页面、切会话再回来,输入框里没发出去的字全丢。现在打字时前端每 2s 防抖 + 失焦/切会话即时把草稿存到服务端 `<dataDir>/composer-drafts.json`(按 sessionId 键入,每会话只留最新一条;`localStorage` 同步镜像一层,兜住崩溃和关闭页面的最后一击),切会话/`newChat`/刷新重连时的全量快照把草稿带回来(本地没动过才恢复,绝不覆盖正在打的字)。发送成功、会话删除即清,30 天未更新兜底清扫。增量快照不带草稿(无 60ms 热帧开销),不进 LLM 上下文、不污染历史搜索,pi 引擎独有(DSH 暂无)。
|
|
44
|
+
- **语音输入插件支持一键安装本地 Whisper** —— 🎤 浮层里点一下,服务端自动装 transformers.js 运行时 + 下载模型(base 约 290MB / tiny 约 150MB,可在设置里切),以后录音不出本机、不要 key 也能转写;新 `engine` 设置(auto/local/remote,默认 auto 本地优先、挂了切远端)。服务端录音改走浏览器现场编码的 16k 单声道 WAV(AudioWorklet,ScriptProcessor 兜底),不再拼 MediaRecorder mime,服务端也无需装 ffmpeg。
|
|
45
|
+
|
|
46
|
+
### Fixed
|
|
47
|
+
|
|
48
|
+
- **插件 `ensureDeps` 遇到带版本号的依赖永远判缺失** —— `isDepAvailable` 把 `foo@1.2.3` 原样丢给 `require.resolve`(它不认 `@后缀`,恒 `MODULE_NOT_FOUND`),于是 pin 了版本的插件每次都重跑 `npm install`,装完还报“仍缺”。现在先剥掉版本再探测(只判存在,不审计版本;安装时 pin 照走)。
|
|
49
|
+
- **语音输入在 Edge 上“完全不能识别”且报错看不懂** —— 现在浮层按错误码给中文解释:非安全上下文(`http://局域网IP` 打开被浏览器掐语音+麦克风,指路 localhost)、`network`(Edge 语音服务要联网,代理/VPN 可能拦)、`not-allowed`(麦克风权限,指路地址栏 🔒);听写中多了一个「改用服务端录音」按钮,一键绕过抽风的浏览器识别;浏览器静默断句续听加了 2 次上限,防无限空转。
|
|
50
|
+
- **DSH 引擎在新版 dsh 运行时下无法启动** —— wrapper 调的 `ctx.userQuestions.registerProvider` 已被上游删除,boot 直接 `TypeError` 崩溃。现在按官方 waterfall 语义把问卷 answerer 注册到每个 agent scope。
|
|
51
|
+
- **DSH 引擎底栏没有上下文占用 / 缓存命中 / 回复速率** —— 新版 dsh 运行时取消了持久的 `assistant/chunk`(逐 chunk 事件),
|
|
52
|
+
改成 agent scope 的 `agent/assistant-stream` 直播帧,usage 只在结算时随 `assistant/message.usage` 落一次;jsonrpc 面两样都收不到,
|
|
53
|
+
于是 streamingMessage / 速率 / 底栏统计全空。现在 wrapper 用 `{ global: true }` 订阅直播帧转成 `assistant.stream` 通知,服务端与老
|
|
54
|
+
`assistant/chunk` 共用一条 chunk 管线(`conv.liveChunks` 互斥),usage 走 `assistant/message.usage` 回填;没有 usage 时上下文显示 `—`
|
|
55
|
+
而不是 `0 / 1.0M`。回归:`tests/unit/dsh-usage.test.ts` + `tests/dsh-stats-test.mjs`(已进冒烟清单)。
|
|
56
|
+
- **DSH 部署人设(`override.patch.yml`)键名写错** —— `persona:` 不是 schema 字段(应为 `personaPrefix:`),被 zod 静默丢弃,自定义系统提示词一直没进过运行时。
|
|
57
|
+
- **同 sessionId 重建抛 `already exists`** —— 运行时重启/优雅关闭后,磁盘已有的会话 id 走 `agents.create` 必撞;现在自动转 `agents.resume`(官方恢复路径,附带缝合被中断的 turn),预设按日志记录优先恢复。
|
|
58
|
+
- **只有源码的插件不再装出“沉默的死插件”**(issue #165)—— `install` 在“有构建声明但无产物”时默认直接构建(以前只打印一行极易错过的提示,装完是个什么都不加载的空目录),构建前先打印解析出的 install/command;产物已提交的仓库行为不变。`--no-build` 保留旧的装空目录行为(明确打印跳过原因),与 `--build` 互斥。设置面板的「源码构建」勾选框语义相应变为“强制重编”(不勾选时源码插件也会自动构建)。
|
|
59
|
+
- **顶栏「⋯」溢出菜单在 DOM 里但永远点不到**(issue #162)—— 菜单元件挂在 `.view-switch{overflow:hidden}`(桌面端圆角药丸容器的裁剪)/ `.topbar-actions` 横滑容器(窄屏 ≤768px)里面,往下展开的部分全被祖先裁掉,`z-index` 再高也出不来;藏进溢出菜单的条目实际不可达。现在菜单经 portal 到 `document.body` + `position: fixed`(与右键菜单同路),按触发按钮实测锚定、视口钳制(下方放不下翻到上方),并补上点外面 / Esc 关闭(滚动/缩放时重跟锚点,不关闭)。另修一个连带坑:关闭回调若是内联箭头,effect 每 render 解绑/重绑全套 document 监听,离散按键可能正好落在空窗里导致 Esc 丢键 —— 关闭走 ref,监听只装一次。回归:`tests/ui-layout-ui-test.mjs` 新增「真的可见可点」断言(`elementFromPoint` 落在菜单内)。
|
|
60
|
+
|
|
61
|
+
<!-- auto-i18n:start -->
|
|
62
|
+
### i18n
|
|
63
|
+
|
|
64
|
+
- 前端新增 key(61):`atMentions`、`atMenuHint`、`fileOpenPreview`、`fileEnterDir`、`fileNewFile`、`fileNewDir`、`fileRename`、`fileNamePlaceholder`、`fileDuplicate`、`fileCut`、`fileCopyEntry`、`filePaste`、`fileDelete`、`fileDeleteConfirm`、`fileCopyRelPath`、`fileRefresh`、`providerAuthHint`、`oauthLogin`、`oauthLogout`、`oauthConnected`、`oauthDeviceCode`、`oauthOpenVerification`、`oauthContinue`、`pluginCatalogSync`、`pluginCatalogSyncHint`、`pluginCatalogSyncSource`、`pluginCatalogSyncSubmit`、`pluginCatalogSyncInstall`、`pluginCatalogSyncReplace`、`pluginCatalogSyncRecent`、`pluginCatalogSyncOk`、`pluginCatalogSyncInstalled`、`dshPreset`、`dshPresetNewChat`、`dshPresetLocked`、`dshPresetBlankOnly`、`dshPresetBroken`、`dshPresetUser`、`dshPresetDefaultTag`、`dshPresetCurrent`、`dshPresetMinimalNote`、`dshDefaultPreset`、`dshDefaultPresetDesc`、`dshPresetUserNote`、`dshPerm`、`dshPermReadOnly`、`dshPermReadOnlyDesc`、`dshPermWorkspaceWrite`、`dshPermWorkspaceWriteDesc`、`dshPermFullAccess`、`dshPermFullAccessDesc`、`dshPermFullAccessTag`、`dshPermCustom`、`dshPermConfirmFull`、`dshPermDefault`、`dshPermDefaultDesc`、`pluginDomNeed`、`pluginDomDesc`、`pluginDomGrant`、`pluginDomRevoke`、`pluginDomGranted`
|
|
65
|
+
- 前端中文变更(1):`pluginBuildHint`
|
|
66
|
+
- 前端英文变更(1):`pluginBuildHint`
|
|
67
|
+
- 服务端新增 key(2):`plugininstaller.build.conflict`、`plugins.host.engines.mismatch`
|
|
68
|
+
<!-- auto-i18n:end -->
|
|
12
69
|
|
|
13
70
|
## [0.86.2] — 2026-09-15
|
|
14
71
|
|
|
@@ -27,22 +84,22 @@
|
|
|
27
84
|
### Added
|
|
28
85
|
|
|
29
86
|
- **插件安装 / 更新 / 卸载改为后台作业,不再抢走设置面板**(issue #152)—— 以前点安装会在可见终端里跑 CLI,同时把设置弹窗
|
|
30
|
-
关掉、主视图切到终端;连装几个插件就得「装一个、重开设置、再导航回市场」。现在作业跑在服务端(`server/plugin-installer.ts`
|
|
31
|
-
,执行的仍是同一个 CLI),输出按行回传,**设置面板原地显示进度**(进行中带最后一行输出,失败可就地展开输出尾部);同一时刻
|
|
32
|
-
只允许一个作业(两个 install 写同一目录必出半装状态),另有 15 分钟看门狗与「取消」。托管实例(`PI_WEB_MANAGED=1`)与
|
|
33
|
-
CLI 缺失都会明确拒绝。
|
|
87
|
+
关掉、主视图切到终端;连装几个插件就得「装一个、重开设置、再导航回市场」。现在作业跑在服务端(`server/plugin-installer.ts`
|
|
88
|
+
,执行的仍是同一个 CLI),输出按行回传,**设置面板原地显示进度**(进行中带最后一行输出,失败可就地展开输出尾部);同一时刻
|
|
89
|
+
只允许一个作业(两个 install 写同一目录必出半装状态),另有 15 分钟看门狗与「取消」。托管实例(`PI_WEB_MANAGED=1`)与
|
|
90
|
+
CLI 缺失都会明确拒绝。
|
|
34
91
|
- **`host.reloadCatalog()`:受支持的插件市场目录同步**(issue #148)—— 第三方插件以前只能派发私有浏览器事件 + 开可见终
|
|
35
|
-
端来同步自己的插件清单(私有事件随时会变、宿主更新没有回执)。现在有一条一等公民路径:`reloadCatalog(url 或本地路径,
|
|
92
|
+
端来同步自己的插件清单(私有事件随时会变、宿主更新没有回执)。现在有一条一等公民路径:`reloadCatalog(url 或本地路径,
|
|
36
93
|
{ install?, replace? })` —— 服务端拉取 → 用市场「添加到列表」同一套规则校验 → **原子写** `<dataDir>/plugin-catalog.json`
|
|
37
|
-
(形状不对 / 解析失败 / 读不到时一个字节都不写,旧目录保持有效)→ 可选逐条安装(已装走更新,失败逐条记录不中断整批)→
|
|
38
|
-
重载插件并把新列表推给所有客户端 → 结构化回执 `{ok, error?, entries?, installed?}`。
|
|
94
|
+
(形状不对 / 解析失败 / 读不到时一个字节都不写,旧目录保持有效)→ 可选逐条安装(已装走更新,失败逐条记录不中断整批)→
|
|
95
|
+
重载插件并把新列表推给所有客户端 → 结构化回执 `{ok, error?, entries?, installed?}`。
|
|
39
96
|
- **插件 UI 扩展点框架:11 个挂载点,插件只声明、宿主负责渲染**(issue #146 完整版)—— v1 那条 `topbar` 专用声明长成
|
|
40
|
-
了一套通用 slot 框架。manifest 的 `ui` 字段(或运行时 `host.ui.*`)可以往 `topbar.primary` / `topbar.overflow` /
|
|
41
|
-
`bottombar` / `composer.actions` / `message.actions` / `rightpanel.tabs` / `contextmenu.topbar|message|session|file` /
|
|
42
|
-
`settings.pages` 这 11 个挂载点声明条目(`{id, label, labelEn?, icon?, kind?, order?, group?, hidden?, action?, view?,
|
|
97
|
+
了一套通用 slot 框架。manifest 的 `ui` 字段(或运行时 `host.ui.*`)可以往 `topbar.primary` / `topbar.overflow` /
|
|
98
|
+
`bottombar` / `composer.actions` / `message.actions` / `rightpanel.tabs` / `contextmenu.topbar|message|session|file` /
|
|
99
|
+
`settings.pages` 这 11 个挂载点声明条目(`{id, label, labelEn?, icon?, kind?, order?, group?, hidden?, action?, view?,
|
|
43
100
|
when?, children?}`,也收 `topbar` / `settings` 这类简写别名);宿主负责渲染、排序、**溢出菜单**、可访问性、用户偏好与
|
|
44
|
-
审计,插件不碰 DOM,动作由插件客户端经 `host.onUiAction(name, fn)` 接管(按需加载它的 bundle,最终没人接管就提示一句,
|
|
45
|
-
不让按钮看起来点了没用)。
|
|
101
|
+
审计,插件不碰 DOM,动作由插件客户端经 `host.onUiAction(name, fn)` 接管(按需加载它的 bundle,最终没人接管就提示一句,
|
|
102
|
+
不让按钮看起来点了没用)。
|
|
46
103
|
- **插件能整理宿主内置条目**:`ui.arrange` 可以把内置入口(id 形如 `host:settings`)移到别的槽位、隐藏、改顺序/分组/
|
|
47
104
|
文案。内置条目表是 `web/src/ui-slots.ts` 的 `BUILTIN_UI_ITEMS`(32 条,逐条对应代码里真实存在的入口,不臆造)。
|
|
48
105
|
- **用户偏好永远最后说话**:设置面板「界面插件 → 界面布局」按槽位列出所有条目,可逐条隐藏 / ↑↓ 调序 / 「恢复」单条
|
|
@@ -89,10 +146,10 @@ when?, children?}`,也收 `topbar` / `settings` 这类简写别名);宿主
|
|
|
89
146
|
(4 加了 `reloadCatalog` / `openSession` / `onTopbarAction`,5 把顶栏动作推广成通用 `onUiAction`,6 加了 `sessions`
|
|
90
147
|
与多根 `openSession`;`onTopbarAction` 保留为别名)。插件可用 `version` 判断宿主能力,老宿主上不会拿到 undefined 接口。
|
|
91
148
|
- **`pi-web-ui install --build`:源码安装时隔离构建**(issue #150)—— 插件仓库可以只提交 TypeScript 源码,不必再把
|
|
92
|
-
`index.mjs` / `client/entry.mjs` 产物提交进仓库。构建在临时目录里完成:只装插件声明的构建依赖
|
|
93
|
-
(`npm install --ignore-scripts`,不执行任意生命周期脚本)→ 跑 manifest.build.command(缺省回落 package.json 的
|
|
94
|
-
`scripts.build`)→ 校验 `outputs` 产物齐全 → **成功后才替换目标目录**(失败时上一版插件原样可用、无半装状态)。设置面
|
|
95
|
-
板的插件市场有「源码构建」勾选项,等价 `--build`,网络安装入口全部纳入托管实例(`PI_WEB_MANAGED`)拒绝面。
|
|
149
|
+
`index.mjs` / `client/entry.mjs` 产物提交进仓库。构建在临时目录里完成:只装插件声明的构建依赖
|
|
150
|
+
(`npm install --ignore-scripts`,不执行任意生命周期脚本)→ 跑 manifest.build.command(缺省回落 package.json 的
|
|
151
|
+
`scripts.build`)→ 校验 `outputs` 产物齐全 → **成功后才替换目标目录**(失败时上一版插件原样可用、无半装状态)。设置面
|
|
152
|
+
板的插件市场有「源码构建」勾选项,等价 `--build`,网络安装入口全部纳入托管实例(`PI_WEB_MANAGED`)拒绝面。
|
|
96
153
|
- **vscode-editor 插件:SSH 主机支持私钥路径 / 口令 / agent,还能从 `~/.ssh/config` 批量导入**(issue #149)—— 以前主机编辑只有密码与内联 PEM 私钥两项:带口令的私钥没地方填口令(连上就挂),用 `~/.ssh/id_rsa` 这类文件路径的得把私钥全文粘贴进来,ssh-agent 更没入口。现在编辑框多了三项:私钥路径(支持 `~` 展开,填写则优先用文件、不必粘贴全文)、私钥口令 passphrase(留空=保持不变,连接时透给 ssh2)、agent socket(如 `$SSH_AUTH_SOCK`,与密码/私钥互斥);「从 ssh config 导入」按钮解析本机 `~/.ssh/config` 列出候选(已导入的标出跳过),勾选批量导入 —— 导入只存私钥路径引用,不读私钥内容。解析语义对齐 OpenSSH:同块先出现的值优先,`Host *` 块只充当默认值继承、不产出候选,含通配符的别名不产出。
|
|
97
154
|
- **检查更新走你自己的 npm 源,不再卡在官方源上**(issue #151)—— 配了镜像/私有源的用户(`<agentDir>/npm/.npmrc`,`pi update` 经 npm 本来就认这一份),以前顶栏更新检查还直连 `registry.npmjs.org`:镜像用户查不到新版、私有源用户直接 401。现在检查更新读同一份 `.npmrc` 解析 registry + 认证头(`_authToken` 优先、`_auth` 其次,同源才带),无文件/无配置时回落官方源。pi 与 DSH 双引擎同修。
|
|
98
155
|
- **桌面版里「浏览器操作」给明确结论,不再让人白装扩展**(issue #153)—— 桌面窗口(Electron)里没有 Chrome 扩展运行时,page-picker 扩展永远装不上;以前面板还是网页版那四步安装引导,用户跟着做完才发现此路不通,模型调 `browser_page` 还要干等 3 秒桥超时。现在桌面壳里面板直接给结论 + 「用默认浏览器打开当前地址」按钮(去网页版按四步装即可),`queryBrowserControl` 与服务端 `pageCall` 都短路返回「改用网页版」的错误,不碰扩展桥。
|
|
@@ -101,11 +158,11 @@ when?, children?}`,也收 `topbar` / `settings` 这类简写别名);宿主
|
|
|
101
158
|
### Changed
|
|
102
159
|
|
|
103
160
|
- **插件 `apiVersion: 2` 起「不写 `permissions`」等于默认拒绝**(issue #146 完整版)—— 宿主设施版本升到
|
|
104
|
-
`PLUGIN_API_VERSION = 2`。以前 `permissions` 缺省是「旧格式全权模式」:受控宿主 API 一律放行、只在日志里警告一次;
|
|
105
|
-
现在只要 manifest 声明了 `apiVersion: 2`,没写 `permissions` 就按**空能力集**处理 —— `fs` / `http` / `tools` / `ui` /
|
|
106
|
-
`chat` 这些受控入口逐个拒绝(`manifest.ui` 整份忽略),日志里写明缺哪个能力族。**对插件作者的含义**:升到 2 就得同时
|
|
107
|
-
补上 `permissions`(哪怕只是加一个顶栏按钮,也要写 `"permissions": ["ui"]`)。不写 `apiVersion` 的老插件仍是 v1 +
|
|
108
|
-
旧全权模式(只警告、行为不变),所以升级可以按插件逐个进行;`apiVersion` 比宿主新才会被拒绝激活,并提示升级 pi-web-ui。
|
|
161
|
+
`PLUGIN_API_VERSION = 2`。以前 `permissions` 缺省是「旧格式全权模式」:受控宿主 API 一律放行、只在日志里警告一次;
|
|
162
|
+
现在只要 manifest 声明了 `apiVersion: 2`,没写 `permissions` 就按**空能力集**处理 —— `fs` / `http` / `tools` / `ui` /
|
|
163
|
+
`chat` 这些受控入口逐个拒绝(`manifest.ui` 整份忽略),日志里写明缺哪个能力族。**对插件作者的含义**:升到 2 就得同时
|
|
164
|
+
补上 `permissions`(哪怕只是加一个顶栏按钮,也要写 `"permissions": ["ui"]`)。不写 `apiVersion` 的老插件仍是 v1 +
|
|
165
|
+
旧全权模式(只警告、行为不变),所以升级可以按插件逐个进行;`apiVersion` 比宿主新才会被拒绝激活,并提示升级 pi-web-ui。
|
|
109
166
|
|
|
110
167
|
### Fixed
|
|
111
168
|
|
|
@@ -114,12 +171,14 @@ when?, children?}`,也收 `topbar` / `settings` 这类简写别名);宿主
|
|
|
114
171
|
- **输入框里的一行 JSX 注释不再渲染成可见文本** —— `ChatInput.tsx` 里 `/* … */` 写在了 JSX 子节点位置,会被当成文本渲染出来;已改为 `{/* … */}`。
|
|
115
172
|
|
|
116
173
|
<!-- auto-i18n:start -->
|
|
174
|
+
|
|
117
175
|
### i18n
|
|
118
176
|
|
|
119
177
|
- 前端新增 key(44):`elsewhereBadge`、`elsewhereTip`、`workspaceRoots`、`workspaceRootsHint`、`addWorkspaceRoot`、`addWorkspaceRootHint`、`removeWorkspaceRoot`、`browserControlDesktop`、`browserControlDesktopLead`、`browserControlOpenInBrowser`、`devNoCache`、`devNoCacheDesc`、`autoReload`、`autoReloadDesc`、`pluginJobRunning`、`pluginJobDone`、`pluginJobFailed`、`pluginBuildSource`、`pluginBuildHint`、`uiLayoutTitle`、`uiLayoutHint`、`pluginTopbarMore`、`uiLayoutTopbar`、`uiLayoutTopbarOverflow`、`uiLayoutBottombar`、`uiLayoutComposer`、`uiLayoutMessage`、`uiLayoutRightPanel`、`uiLayoutSettingsPages`、`uiLayoutRestore`、`uiLayoutRestoreAll`、`uiLayoutArranged`、`uiLayoutEmpty`、`pluginGrantsTitle`、`pluginGrantsHint`、`pluginGrantsEmpty`、`pluginGrantsRevoke`、`pluginGrantRequestTitle`、`pluginGrantRequestBody`、`pluginGrantAllow`、`pluginGrantDeny`、`pluginUiNoHandler`、`pluginSessionGrantTitle`、`pluginSessionGrantBody`
|
|
120
178
|
- 前端中文变更(3):`pluginUpdateHint`、`pluginInstallHint`、`pluginUninstallHint`
|
|
121
179
|
- 前端英文变更(3):`pluginUpdateHint`、`pluginInstallHint`、`pluginUninstallHint`
|
|
122
180
|
- 服务端新增 key(15):`plugincatalog.sync.fetch.failed`、`plugincatalog.sync.http`、`plugincatalog.sync.too.large`、`plugincatalog.sync.source.invalid`、`plugincatalog.sync.read.failed`、`plugincatalog.sync.source.missing`、`plugincatalog.sync.parse.failed`、`plugincatalog.sync.shape`、`plugininstaller.id.invalid`、`plugininstaller.source.invalid`、`plugininstaller.managed`、`plugininstaller.busy`、`plugininstaller.cli.missing`、`plugininstaller.cancelled`、`plugininstaller.timeout`
|
|
181
|
+
|
|
123
182
|
<!-- auto-i18n:end -->
|
|
124
183
|
|
|
125
184
|
## [0.85.0] — 2026-09-14
|
|
@@ -854,7 +913,9 @@ when?, children?}`,也收 `topbar` / `settings` 这类简写别名);宿主
|
|
|
854
913
|
- 0.35.1(2026-08-27):编辑重问保留附件(#18)+ 全窗口拖放(#19)。
|
|
855
914
|
- 0.29.0(2026-08-23):全局搜索弹窗(Ctrl+K)+ 消息列表惰性窗口化。
|
|
856
915
|
|
|
857
|
-
[Unreleased]: https://github.com/xing-shuyin/pi-web-ui/compare/v0.
|
|
916
|
+
[Unreleased]: https://github.com/xing-shuyin/pi-web-ui/compare/v0.87.1...main
|
|
917
|
+
[0.87.1]: https://github.com/xing-shuyin/pi-web-ui/releases/tag/v0.87.1
|
|
918
|
+
[0.87.0]: https://github.com/xing-shuyin/pi-web-ui/releases/tag/v0.87.0
|
|
858
919
|
[0.86.2]: https://github.com/xing-shuyin/pi-web-ui/releases/tag/v0.86.2
|
|
859
920
|
[0.86.1]: https://github.com/xing-shuyin/pi-web-ui/releases/tag/v0.86.1
|
|
860
921
|
[0.86.0]: https://github.com/xing-shuyin/pi-web-ui/releases/tag/v0.86.0
|
package/README.md
CHANGED
|
@@ -153,7 +153,7 @@ theme switching, and a full settings panel — tuned for daily development.
|
|
|
153
153
|
- **`edit_soft`** — a looser `edit` (default off) for when indentation or whitespace makes the built-in tool fail: exact substring first, then trimmed line-core matching, `newText` written verbatim with the file's line endings/BOM preserved, and a diff + unified patch in the result. It also tolerates sloppy input (a JSON string, a bare object, legacy top-level `oldText`/`newText`).
|
|
154
154
|
- **`delegate_task`** — hands a specialist template a six-section brief (TASK / EXPECTED OUTCOME / REQUIRED TOOLS / MUST DO / MUST NOT DO / CONTEXT) validated on the server: a missing template, a task under 20 characters or any empty section is rejected, and the error tells the model which templates it may use. Cards render the brief as labelled sections, and a finished delegation gets a button that jumps to the subagent's conversation.
|
|
155
155
|
- **`ask_user_question`** — the pi engine has no questionnaire tool, so pi-web-ui adds one: the model asks structured questions (single/multi-select with rich option previews, plus free text) which open as a dialog; answers go back as the tool result, cancelling returns a tool error, waiting for you is exempt from the tool watchdog, and an unanswered questionnaire survives a page refresh or reconnect.
|
|
156
|
-
- **MCP servers** — drop a `<dataDir>/mcp.json` (`{"servers":{"github":{"command":"node","args":["mcp.js"],"cwd":"/x"}}}`) and every tool a stdio MCP server advertises becomes an ordinary agent tool, executed server-side; one server failing to start only logs a line and leaves the others working. The file is
|
|
156
|
+
- **MCP servers** — drop a `<dataDir>/mcp.json` (`{"servers":{"github":{"command":"node","args":["mcp.js"],"cwd":"/x"}}}`) and every tool a stdio MCP server advertises becomes an ordinary agent tool, executed server-side; one server failing to start only logs a line and leaves the others working. The file is **hot-reloaded**: saving it applies within a second or two, no restart needed — and only the servers whose spec actually changed are restarted (a malformed file is reported and the running servers are kept).
|
|
157
157
|
- **Extension UI bridge** — pi extensions can drive the browser: `setWidget` renders live panels under the file tree (click a title to open it centred), `setStatus` puts text in the status bar, `notify` raises a toast, and `select` / `confirm` / `input` open an inline request panel above the composer with Markdown-rendered options (Esc cancels). ANSI colour codes in widget text are stripped, so extension footers don't arrive as escape-sequence noise.
|
|
158
158
|
- **Plugin extras** — plugins can register `/commands` (badge “plugin”, executed server-side without spending tokens), register background tasks with their own stop button, declare a settings form, subscribe to run/tool/conversation events, and reach the host from their client bundle via `window.__piWebUiHost`. See [Plugins](#plugins).
|
|
159
159
|
|