pi-web-ui 0.79.0 → 0.80.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 (3) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +68 -0
  3. package/package.json +12 -6
package/CHANGELOG.md CHANGED
@@ -8,6 +8,22 @@
8
8
  每个版本的内容按"实际合入该版本发布的提交"归档(以 `package.json` 的 version 变更提交为准),
9
9
  而不是按提交日期聚类——连续快速发布的 patch 版本以此为准最准确。
10
10
 
11
+ ## [Unreleased]
12
+
13
+ 暂无未发布内容。
14
+
15
+ ## [0.80.0] — 2026-09-12
16
+
17
+ ### Added
18
+
19
+ - **桌面版(Electron 外壳)**:同一套服务端 + 前端装进一个原生窗口——主进程用随机空闲口起 `dist/server/index.js`(`ELECTRON_RUN_AS_NODE` 当纯 Node 用,不再额外捆一个 Node),`/api/health` 就绪后 `BrowserWindow` 直接加载该地址,因此前端 `appUrl("/ws")`、`server/protocol.ts` 全部零改动。可与网页版并存:不抢 `8787`(`PI_WEB_PORT` 被占用时自动退到随机空闲口)、独立数据目录(`<userData>/data`)、独立单实例锁;外链丢给系统浏览器,renderer 走 `contextIsolation + sandbox` 且无 Node。Windows 安装包(NSIS,可选安装目录)随每个 Release 由 CI 出包并附在 Release 页面(macOS dmg / Linux AppImage 已配好,CI 暂只出 Windows);开发用 `npm run desktop:dev`,本地打包用 `npm run desktop:dist`。
20
+ - 当前**未签名**:首次运行 Windows 会提示「未知发布者」(进展见仓库 README 的 Code signing policy 一节)。
21
+
22
+ ### Changed
23
+
24
+ - 桌面版图标复用网页版 PWA 图标(`web/public/icons/icon-1024.png`),网页版与桌面版换图标只改一处。
25
+ - 仓库自检现在覆盖桌面壳:`npm run typecheck` / `format:check` / `lint` 都把 `desktop/` 纳入范围。
26
+
11
27
  ## [0.79.0] — 2026-09-11
12
28
 
13
29
  ### Added
@@ -466,6 +482,7 @@
466
482
  - 0.29.0(2026-08-23):全局搜索弹窗(Ctrl+K)+ 消息列表惰性窗口化。
467
483
 
468
484
  [Unreleased]: https://github.com/xing-shuyin/pi-web-ui/compare/v0.79.0...main
485
+ [0.80.0]: https://github.com/xing-shuyin/pi-web-ui/releases/tag/v0.80.0
469
486
  [0.79.0]: https://github.com/xing-shuyin/pi-web-ui/releases/tag/v0.79.0
470
487
  [0.78.0]: https://github.com/xing-shuyin/pi-web-ui/releases/tag/v0.78.0
471
488
  [0.77.0]: https://github.com/xing-shuyin/pi-web-ui/releases/tag/v0.77.0
package/README.md CHANGED
@@ -51,6 +51,8 @@ theme switching, and a full settings panel — tuned for daily development.
51
51
  - 🧩 [Plugins](#plugins)
52
52
  - 🎨 [Themes](#themes)
53
53
  - 🔒 [Security](#security)
54
+ - 🪪 [Code signing policy](#code-signing-policy)
55
+ - 🔐 [Privacy](#privacy)
54
56
  - 🌐 [Reverse proxy (nginx)](#reverse-proxy-nginx)
55
57
  - 🤝 [Contribute](#contribute)
56
58
  - 📄 [License](#license)
@@ -174,6 +176,24 @@ silences the warning):
174
176
  npm i -g --allow-scripts=node-pty,@google/genai,protobufjs pi-web-ui@latest
175
177
  ```
176
178
 
179
+ ### 🖥️ Desktop app (Windows installer)
180
+
181
+ Prefer a window over a browser tab? Every release ships a Windows installer built
182
+ from this repository by GitHub Actions:
183
+
184
+ **[⬇ Download the latest installer](https://github.com/xing-shuyin/pi-web-ui/releases/latest)**
185
+ — `pi-web-ui-desktop Setup <version>.exe`
186
+
187
+ The desktop shell reuses this very server: it spawns `dist/server/index.js` on a
188
+ random free loopback port and opens a window pointed at it (see
189
+ [`desktop/README.md`](desktop/README.md)). The web version is untouched — no
190
+ fight over port `8787`, separate data directory, both can run side by side.
191
+
192
+ Currently Windows-only and **not code signed yet** — Windows SmartScreen will
193
+ show an “unknown publisher” prompt the first time you run it (see the
194
+ [code signing policy](#code-signing-policy)). Build it yourself with
195
+ `npm run desktop:dist`.
196
+
177
197
  ### Termux (Android)
178
198
 
179
199
  pi-web-ui runs fine on Android via [Termux](https://termux.dev), but `node-pty`
@@ -471,6 +491,54 @@ Rules for merged themes: the file must be a single CSS file, set the `--term-*`
471
491
  management UI edits everything else and the server preserves the headers.
472
492
 
473
493
 
494
+ ## 🪪 Code signing policy
495
+
496
+ Free code signing provided by [SignPath.io](https://signpath.io), certificate by
497
+ [SignPath Foundation](https://signpath.org).
498
+
499
+ Release binaries — the Windows installer `pi-web-ui-desktop Setup <version>.exe`
500
+ attached to every [release](https://github.com/xing-shuyin/pi-web-ui/releases) —
501
+ are built from the tagged commit by
502
+ [`.github/workflows/desktop-release.yml`](.github/workflows/desktop-release.yml)
503
+ and signed in that CI run, so a valid signature means the file is an automated
504
+ build of the source code at that tag.
505
+
506
+ ### Team roles
507
+
508
+ | Role | Who |
509
+ | --- | --- |
510
+ | **Authors / committers** (may push to `main`) | [@xing-shuyin](https://github.com/xing-shuyin) |
511
+ | **Reviewers** (every non-committer change arrives as a PR and is reviewed before merge) | [@xing-shuyin](https://github.com/xing-shuyin) — community contributions are credited in the [contributors graph](https://github.com/xing-shuyin/pi-web-ui/graphs/contributors) |
512
+ | **Approvers** (must approve each signing request) | [@xing-shuyin](https://github.com/xing-shuyin) |
513
+
514
+ All team members use multi-factor authentication for both GitHub and SignPath.
515
+ Our release artifacts contain no binaries we did not build ourselves, except
516
+ upstream open-source components bundled by npm and electron-builder (see
517
+ [License](#license)).
518
+
519
+ **Privacy policy:** see [Privacy](#privacy) below.
520
+
521
+ ## 🔐 Privacy
522
+
523
+ pi-web-ui runs entirely on your own machine and has **no telemetry, no analytics
524
+ and no accounts of its own**. Conversations, attachments, settings and terminal
525
+ history stay in your local data directory (`~/.pi-web/` by default, or
526
+ `%APPDATA%\pi-web-ui\data` for the desktop app), and the HTTP server binds
527
+ loopback unless you explicitly expose it.
528
+
529
+ Network requests happen only in these cases:
530
+
531
+ | When | To | What leaves your machine |
532
+ | --- | --- | --- |
533
+ | You send a message, or the agent calls a model | the model providers **you** configure (e.g. `api.openai.com`, `api.opencode.ai`, a local endpoint) | your prompt, the attached file contents and the conversation context |
534
+ | Model catalog refresh (startup, then every 4 h) | `pi.dev` | nothing but the request itself |
535
+ | You install or update a plugin, theme or language pack | `github.com` / `raw.githubusercontent.com` | nothing but the request itself |
536
+ | You check for or install an update | `registry.npmjs.org` | nothing but the request itself |
537
+ | Terminals on Windows, when neither Git Bash nor a `bash` on `PATH` exists | `frippery.org` | one download of `busybox64u.exe` into `<data dir>/bin/bash.exe`, reused offline afterwards |
538
+
539
+ Reverse-proxy setups, the optional `PI_WEB_TOKEN` password and Docker port
540
+ mappings are under your control — see [Security](#security).
541
+
474
542
  ## Reverse proxy (nginx)
475
543
 
476
544
  Serve pi-web-ui behind nginx on the same host (it binds loopback only, so a
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-web-ui",
3
- "version": "0.79.0",
3
+ "version": "0.80.0",
4
4
  "description": "Web chat interface for the pi coding agent, powered by the pi SDK (@earendil-works/pi-coding-agent) — one-command run, Docker/systemd/launchd deployable",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -15,6 +15,7 @@
15
15
  "files": [
16
16
  "bin/",
17
17
  "dist/",
18
+ "!dist/desktop",
18
19
  "web/dist/",
19
20
  "web/public/",
20
21
  "themes/",
@@ -59,7 +60,7 @@
59
60
  "build:dsh-runtime": "node scripts/copy-dsh-runtime.mjs",
60
61
  "build:mermaid-vendor": "node scripts/build-mermaid-vendor.mjs",
61
62
  "build:runtrace-vendor": "node scripts/build-runtrace-vendor.mjs",
62
- "typecheck": "tsc -p tsconfig.server.json --noEmit && tsc -p web/tsconfig.json --noEmit && tsc -p tsconfig.tests.json --noEmit",
63
+ "typecheck": "tsc -p tsconfig.server.json --noEmit && tsc -p web/tsconfig.json --noEmit && tsc -p tsconfig.tests.json --noEmit && tsc -p desktop/tsconfig.json --noEmit",
63
64
  "test": "vitest run",
64
65
  "test:unit": "vitest run",
65
66
  "test:smoke": "node tests/run-smoke.mjs",
@@ -69,10 +70,13 @@
69
70
  "changelog:i18n": "node scripts/release-notes.mjs --unreleased",
70
71
  "test:freeze": "node tests/freeze-test.mjs",
71
72
  "start": "node dist/server/index.js",
72
- "format": "prettier --write server/ web/src/ extensions/ scripts/ bin/ tests/*.mjs tests/unit/ *.mjs",
73
- "format:check": "prettier --check server/ web/src/ extensions/ scripts/ bin/ tests/*.mjs tests/unit/ *.mjs",
74
- "lint": "oxlint server/ web/src/ extensions/ scripts/",
75
- "lint:fix": "oxlint --fix server/ web/src/ extensions/ scripts/"
73
+ "build:desktop": "tsc -p desktop/tsconfig.json",
74
+ "desktop:dev": "npm run build:desktop && electron dist/desktop/main.js",
75
+ "desktop:dist": "npm run build && npm run build:desktop && electron-builder -c desktop/electron-builder.yml",
76
+ "format": "prettier --write server/ web/src/ extensions/ scripts/ bin/ desktop/ tests/*.mjs tests/unit/ *.mjs",
77
+ "format:check": "prettier --check server/ web/src/ extensions/ scripts/ bin/ desktop/ tests/*.mjs tests/unit/ *.mjs",
78
+ "lint": "oxlint server/ web/src/ extensions/ scripts/ desktop/",
79
+ "lint:fix": "oxlint --fix server/ web/src/ extensions/ scripts/ desktop/"
76
80
  },
77
81
  "dependencies": {
78
82
  "@deepseek-ai/dsh-sdk-jsonrpc-server": "^0.1.1-rc.2",
@@ -109,6 +113,8 @@
109
113
  "concurrently": "^9.1.0",
110
114
  "cross-env": "^10.1.0",
111
115
  "esbuild": "^0.25.12",
116
+ "electron": "^44.0.0",
117
+ "electron-builder": "^26.0.0",
112
118
  "jsdom": "^26.1.0",
113
119
  "mermaid": "^11.17.2",
114
120
  "oxlint": "^1.81.0",