pi-web-ui 0.80.2 → 0.83.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 +167 -2
- package/README.md +112 -97
- package/README.zh-CN.md +86 -66
- package/dist/server/agent-service.js +385 -13
- package/dist/server/attachments.js +36 -0
- package/dist/server/index.js +5 -0
- package/dist/server/mcp-bridge.js +132 -23
- package/dist/server/plugins.js +23 -2
- package/dist/server/subagent-templates.js +30 -2
- package/dist/server/subagents.js +25 -15
- package/dist/server/tool-manager.js +7 -1
- package/dist/server/webui-context.js +28 -4
- package/package.json +4 -2
- package/plugins/catalog.json +9 -0
- package/themes/cyberpunk.css +1 -0
- package/themes/dazzle.css +1 -0
- package/themes/md-preview.css +1 -0
- package/themes/mist.css +1 -0
- package/themes/paper.css +1 -0
- package/themes/sakura.css +1 -0
- package/themes/white.css +1 -0
- package/web/dist/assets/{TerminalPanel-CeruoZjh.js → TerminalPanel-BF99sld0.js} +1 -1
- package/web/dist/assets/index-B1XPfcM0.css +10 -0
- package/web/dist/assets/index-D__1RagK.js +348 -0
- package/web/dist/index.html +2 -2
- package/web/dist/assets/index-BduNm7_u.css +0 -10
- package/web/dist/assets/index-DtBJSe33.js +0 -347
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
**English** | [简体中文](https://github.com/xing-shuyin/pi-web-ui/blob/main/README.zh-CN.md)
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
_The polished browser cockpit for the [pi coding agent](https://pi.dev)._
|
|
8
8
|
|
|
9
9
|
<p>
|
|
10
10
|
<a href="https://www.npmjs.com/package/pi-web-ui"><img src="https://img.shields.io/npm/v/pi-web-ui?color=cb3837&logo=npm&label=pi-web-ui" alt="npm version"></a>
|
|
@@ -37,8 +37,8 @@ theme switching, and a full settings panel — tuned for daily development.
|
|
|
37
37
|
|
|
38
38
|
## ✨ Highlights
|
|
39
39
|
|
|
40
|
-
| 💬 **Chat that works like you do**
|
|
41
|
-
|
|
|
40
|
+
| 💬 **Chat that works like you do** | 🖼️ **Files & images** | 🧩 **Extensible by design** | 🔒 **Private by default** |
|
|
41
|
+
| ----------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
|
|
42
42
|
| Streaming replies, steer & follow-up queueing, slash commands, multiple conversations per project, edit-&-re-ask. | Attach files, paste images, ask about pictures (vision bridge), preview anything with GBK fallback. | Drop-in UI **plugins** (extra top-bar tabs + agent tools) and standalone **themes** — no rebuild, no restart. | Loopback-only, credential-safe: provider keys & headers never reach the browser. |
|
|
43
43
|
|
|
44
44
|
## 📚 Table of Contents
|
|
@@ -89,7 +89,7 @@ theme switching, and a full settings panel — tuned for daily development.
|
|
|
89
89
|
- **Running list** — grouped by project (the current one first), with subagent children indented under their parent, badges for subagent / error (the tooltip carries the reason) / streaming, inline rename (✎) and a scoped ✕ that offers “dismiss finished subagents only” or “force-dismiss everything” (a second confirmation while a run is streaming). Right-clicking a row scopes the menu to that conversation's subtree.
|
|
90
90
|
- **History** — sessions are read from `<agentDir>/sessions/--<cwd>--/`, i.e. the same transcripts the pi CLI/TUI writes, so the browser and a terminal `pi` session share one list per project. Rename (✎ — the same `session_info` entry pi's `/name` writes) and two-step delete.
|
|
91
91
|
- **Recent projects** — stored per browser, merged with every directory that has transcripts, minus the ones you removed (tombstones) and the ones that no longer exist, sorted by last use (20 shown, 30 stored).
|
|
92
|
-
- **Coming back** — reconnecting restores the last workspace the browser used (with a notice), the tab title can show the project folder, and each project remembers its own model + active provider key for
|
|
92
|
+
- **Coming back** — reconnecting restores the last workspace the browser used (with a notice), the tab title can show the project folder, and each project remembers its own model + active provider key for _new_ chats (a chat that already has messages keeps its own model).
|
|
93
93
|
- If the server was shut down mid-answer, the next attach reports it once (“last run was interrupted”) instead of leaving a silent gap in the history.
|
|
94
94
|
|
|
95
95
|
### 🔎 Search & navigation
|
|
@@ -101,7 +101,7 @@ theme switching, and a full settings panel — tuned for daily development.
|
|
|
101
101
|
### 🤖 Subagents & templates
|
|
102
102
|
|
|
103
103
|
- **First-party subagents** — spawn independent background conversations for parallel exploration / implementation / review (`subagent_spawn`, with optional `model` override or a template's model); collect results without polling via `subagent_wait_all` (blocks until every subagent finishes, then summarizes results/errors). Manage them like a chat right in the left panel: view live output, inject follow-ups (steer), abort, dismiss — failed runs surface a red dot in the running list and an error notice in the main chat. In-memory sessions — they never touch the history / resume list, and can be nested.
|
|
104
|
-
- **Subagent templates** — configure reusable presets in Settings → Subagent templates: a role system prompt (append or replace), skills & extensions whitelists,
|
|
104
|
+
- **Subagent templates** — configure reusable presets in Settings → Subagent templates: a role system prompt (append or replace), skills & extensions whitelists, an optional per-template model, and an optional thinking level. The AI picks one via the `subagent_templates` tool and `subagent_spawn(template="…")`, or spawns without one (default = follow the main conversation's current model **and thinking level**, or the global default subagent model set in the same panel). A template that sets them pins that exact combination (unsupported thinking levels are clamped by the SDK to the nearest one the model supports). Disabled templates stay in the panel for re-enabling but become invisible to the AI tools (can't be listed or picked). Templates are shared globally across browser clients (`<dataDir>/subagent-templates.json`). Six built-in templates (review / implement / research / scout / audit / delegate, adapted from the pi-subagents community projects) seed the list on first run — marked 「Built-in」, editable and deletable like any other.
|
|
105
105
|
|
|
106
106
|
### 🖼️ Files, images & attachments
|
|
107
107
|
|
|
@@ -113,8 +113,8 @@ theme switching, and a full settings panel — tuned for daily development.
|
|
|
113
113
|
- Live file tree — the server watches the listed directory (`fs.watch`) and re-lists on change; oversized directories show a truncation warning.
|
|
114
114
|
- **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.
|
|
115
115
|
- **Row actions** — hover a file for download / attach inline (+) / 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).
|
|
116
|
-
- **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
|
|
117
|
-
- **Listings that stay honest** — on Windows/macOS a recursive watcher on the workspace root refreshes the tree for changes in
|
|
116
|
+
- **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.
|
|
117
|
+
- **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.
|
|
118
118
|
- **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.
|
|
119
119
|
- **Download without Safe Browsing fights** — downloads fetch the bytes and use the browser's save picker where available (falling back to a blob link, and to native streaming above 200 MB), sanitize Windows-illegal file names and report a cancelled dialog as “not an error”.
|
|
120
120
|
|
|
@@ -133,16 +133,16 @@ theme switching, and a full settings panel — tuned for daily development.
|
|
|
133
133
|
- Model management — edit `models.json` in the UI and set per-provider API keys (keys/headers never leave the server).
|
|
134
134
|
- **Model picker** — searchable by name/provider/id, with a provider sidebar once you have several providers; models you pick often float to the top with a “used N×” badge plus reasoning/vision badges, opening it scrolls to the active model, and the footer keeps **Refresh models** and **Manage models**.
|
|
135
135
|
- **Several keys per provider** — built-in providers can store multiple named keys (`<agentDir>/provider-keys.json`): add a second key without losing the first, activate another by name, remove one (dropping the active key promotes the next). The picker lists each key separately, so picking a model under a key switches to it — and only nicknames reach the browser.
|
|
136
|
-
- **Custom providers** — add/edit/delete a provider (API type, `baseUrl`, key, optional auth header) with per-model metadata (context window, max output, text/text-image, reasoning); **Fetch models** probes `/models`
|
|
136
|
+
- **Custom providers** — add/edit/delete a provider (API type, `baseUrl`, key, optional auth header) with per-model metadata (context window, max output, text/text-image, reasoning); **Fetch models** probes `/models` _server-side_ (so a LAN/loopback endpoint works despite CORS) and merges what it advertises, and an existing provider can be re-probed in place. Hand-edited `models.json` is picked up with **Reload models.json** (comments allowed, like the SDK).
|
|
137
137
|
- Thinking level per model — seven levels, but the ones the current model doesn't support are shown disabled rather than silently snapped to another.
|
|
138
138
|
- First-run setup wizard — installs the pi CLI for you when it's missing (with failure detail, Retry and Skip) and then takes a provider + API key so you can start immediately.
|
|
139
139
|
- Settings panel:
|
|
140
140
|
- **System prompt** — a `{{token}}` compose template over 11 sources (soul / tools / guidelines / pi docs / append / persona / terminal / markers / context / skills / cwd) with click-to-append token chips, per-source overrides (an `auto` badge, “seed from default”, per-source reset; environment-derived sources stay read-only), and two viewers showing the prompt actually in effect and the tool schema actually sent to the model.
|
|
141
|
-
- **Input history & quick phrases** — a bounded history (1–500 entries, optional per-entry character cap, two-step clear) that ↑/↓ walks through, and the chips above the composer (edit / reorder / delete / reset to defaults).
|
|
141
|
+
- **Input history & quick phrases** — a bounded history (1–500 entries, optional per-entry character cap, two-step clear) that ↑/↓ walks through when the caret sits on the first/last **visual** line of the draft (auto-wrapped lines count), and the chips above the composer (edit / reorder / delete / reset to defaults).
|
|
142
142
|
- **Skills** — per-skill switches plus a **Full** chip that injects a whole `SKILL.md` into the prompt instead of its catalog line (8 KB per file, 32 KB total).
|
|
143
143
|
- **Extensions** — per-extension switches, and one-click uninstall for `npm:`-installed ones (runs `pi remove npm:<pkg>` in a reusable terminal tab).
|
|
144
144
|
- **UI plugins**, **goal review**, **vision bridge** and **subagent templates** have their own pages — see [Plugins](#plugins).
|
|
145
|
-
- **Presets** — save the current combination (prompt template/mode/overrides, skill & extension switches, tool switches, terminal-bash settings, retry count, reviewer prompt, skill full-text list) under a name and re-apply or delete it; deliberately
|
|
145
|
+
- **Presets** — save the current combination (prompt template/mode/overrides, skill & extension switches, tool switches, terminal-bash settings, retry count, reviewer prompt, skill full-text list) under a name and re-apply or delete it; deliberately _not_ captured (questionnaire, goal mode, display prefs, vision bridge, default subagent model, quick phrases) stay as they are.
|
|
146
146
|
- **Apply timing** — tool switches, retry count, display preferences, markers and the skill full-text list apply immediately; the prompt template/overrides and skill/extension switches need a session reload, and a change made mid-answer is deferred with a “takes effect after this reply” notice.
|
|
147
147
|
- **Display preferences** — thinking blocks expanded or collapsed by default, tool cards expanded by default, wide chat column (drops the 860 px cap on very wide viewports), project name in the browser tab title, and a chat wallpaper (image URL or upload, with dim and blur sliders).
|
|
148
148
|
|
|
@@ -214,9 +214,9 @@ theme switching, and a full settings panel — tuned for daily development.
|
|
|
214
214
|
|
|
215
215
|
- Loopback-only by default; set `PI_WEB_HOST=0.0.0.0` for LAN / containers.
|
|
216
216
|
- **Token auth** — `PI_WEB_TOKEN` accepts any of `Authorization: Bearer …`, `X-PI-Token: …`, `?token=…` or the `pi_web_token` cookie. A `?token=` link logs you in once, strips the token from the address bar and stores the cookie; every authorised request refreshes it and a stale cookie is expired on the 401 response, so after changing the password one correct `?token=` visit recovers permanently. `/api/health` stays open for probes.
|
|
217
|
-
- WebSocket Origin/Host same-authority check — cross-origin pages are rejected (403), `Origin: null` (a `file://` page) is rejected outright, and when a token is configured a bad credential is refused
|
|
217
|
+
- WebSocket Origin/Host same-authority check — cross-origin pages are rejected (403), `Origin: null` (a `file://` page) is rejected outright, and when a token is configured a bad credential is refused _before_ the upgrade; `PI_WEB_ALLOW_ORIGINS` whitelist for reverse proxies.
|
|
218
218
|
- **Host allow-list** — `PI_WEB_ALLOW_HOSTS=host1,host2` adds a strict hostname allow-list on top of the always-on same-authority check.
|
|
219
|
-
- **Instance scoping** — `PI_WEB_TABS=chat,terminal,git` exposes only those tabs: hidden tabs are also refused
|
|
219
|
+
- **Instance scoping** — `PI_WEB_TABS=chat,terminal,git` exposes only those tabs: hidden tabs are also refused _server-side_ (their messages answer with an explanation), and `chat` can never be switched off. `PI_WEB_MANAGED=1` declares the instance as deployed from outside: the server refuses self-update, pi-CLI installs and marketplace installs with a reason, and the UI hides those entry points (the version chip becomes a plain label saying the deployment owns updates).
|
|
220
220
|
- **File boundaries** — workspace-relative reads/writes reject `..` escapes (a path outside the workspace is only reachable through explicit absolute / machine browsing); inline `/api/file` streaming is limited to images, video and HTML, so a binary can never be smuggled through an `<img>` tag — anything else needs `?download=1` (attachment disposition). The HTML preview route is always served sandboxed.
|
|
221
221
|
- Quiesce drain mode via a local control socket (`server status|quiesce|unquiesce`) — refuses new prompts/forks/resumes (and, on the DSH engine, brand-new client connections) while in-flight runs finish.
|
|
222
222
|
- Credentials stay server-side — provider headers (which may carry `Authorization`) are never sent to the browser, and provider API keys reach it only as nicknames.
|
|
@@ -227,51 +227,49 @@ theme switching, and a full settings panel — tuned for daily development.
|
|
|
227
227
|
### 🚢 Deploy & update
|
|
228
228
|
|
|
229
229
|
- Foreground, global npm install, Docker (see [Docker](#docker)), macOS launchd, Linux systemd, Windows autostart (a per-user `Run` key with a console-free launcher and a crash watchdog), and a desktop shortcut (`server shortcut`).
|
|
230
|
-
- `server install --print` prints the launchd plist / systemd unit / Windows launcher it
|
|
231
|
-
- **Update panel** — the version chip shows an amber dot when a newer web UI exists and a badge with how many
|
|
230
|
+
- `server install --print` prints the launchd plist / systemd unit / Windows launcher it _would_ write and exits, so you can review it before installing.
|
|
231
|
+
- **Update panel** — the version chip shows an amber dot when a newer web UI exists and a badge with how many _other_ components have updates. “Check all updates” compares the web UI, the globally installed pi core and the direct packages declared in `<agentDir>/npm/package.json`; each row has its own Update, plus “Update all” and “Re-check all”, and the commands run in a visible terminal (`pi update npm:<name>` for pi extensions — the only command that updates the copy pi actually loads — and `npm i -g <name>@latest` for the rest). A “just published (<30 min)” warning tells you npm's cached metadata may be stale. On an instance owned by launchd/systemd/the Windows watchdog there is also a **Restart service** button; on a foreground instance there isn't, because nothing would bring it back.
|
|
232
232
|
- **Plugin updates from the CLI** — `pi-web-ui plugins --check-updates` compares each installed plugin's recorded commit with the remote HEAD and prints the exact update command; every `install --force` snapshots the outgoing version into `<dataDir>/plugin-backups/` (newest 3 kept, and it auto-rolls back if the copy fails), so `pi-web-ui plugins --rollback <id>` can undo an upgrade.
|
|
233
233
|
- In the pi CLI there is also `/webui` (from the bundled `extensions/webui.ts`): `/webui` starts a server on the first free port from 8787, and `/webui --port 9000`, `--cwd <path>`, `--no-browser`, `status` and `stop` manage it — one subprocess per pi session, killed when the session shuts down so no orphan servers linger.
|
|
234
234
|
|
|
235
|
-
|
|
236
235
|
## Keyboard shortcuts
|
|
237
236
|
|
|
238
|
-
| Keys
|
|
239
|
-
|
|
|
240
|
-
| `Enter`
|
|
241
|
-
| `Shift+Enter`
|
|
242
|
-
| `↑` / `↓`
|
|
243
|
-
| `Ctrl/Cmd+K`
|
|
244
|
-
| `Ctrl/Cmd+F`
|
|
245
|
-
| `/`
|
|
246
|
-
| `Ctrl/Cmd+S`
|
|
247
|
-
| `Ctrl/Cmd+A`
|
|
248
|
-
| `Ctrl/Cmd+Enter`
|
|
249
|
-
| `Ctrl/Cmd+C` / `Ctrl/Cmd+V` | In the terminal: copy the current selection (no selection = `^C` goes to the shell) / paste natively.
|
|
250
|
-
| `Esc`
|
|
251
|
-
| Drag & drop
|
|
237
|
+
| Keys | What it does |
|
|
238
|
+
| --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
239
|
+
| `Enter` | Send. On touch-first devices `Enter` inserts a newline instead and `Ctrl/Cmd+Enter` sends (Windows touch laptops are treated as desktops). |
|
|
240
|
+
| `Shift+Enter` | Newline in the composer. |
|
|
241
|
+
| `↑` / `↓` | Walk the global prompt history (persisted across conversations) when the caret is on the first/last **visual** line — auto-wrapped lines count, so `↑` inside a long one-paragraph draft moves the caret up a line instead of switching history; `Esc` returns to your draft. |
|
|
242
|
+
| `Ctrl/Cmd+K` | Global search over conversations, projects and workspace file names. |
|
|
243
|
+
| `Ctrl/Cmd+F` | Search inside the open conversation — `Enter` next hit, `Shift+Enter` previous, `Esc` closes. |
|
|
244
|
+
| `/` | Open the slash-command picker (`↑`/`↓` to move, `Tab` or `Enter` to complete, `Esc` to dismiss; typing a space closes it). |
|
|
245
|
+
| `Ctrl/Cmd+S` | Save while editing a file in the preview. |
|
|
246
|
+
| `Ctrl/Cmd+A` | Select all lines in the preview (when the caret isn't in a text field). |
|
|
247
|
+
| `Ctrl/Cmd+Enter` | Submit the edit-&-re-ask editor. |
|
|
248
|
+
| `Ctrl/Cmd+C` / `Ctrl/Cmd+V` | In the terminal: copy the current selection (no selection = `^C` goes to the shell) / paste natively. |
|
|
249
|
+
| `Esc` | Close the preview, a dialog, the command picker, a questionnaire or an extension request panel — with unsaved preview edits it asks first. |
|
|
250
|
+
| Drag & drop | Dropping files anywhere in the window attaches them to the chat; over the file tree it uploads into the folder you dropped on; folders can't be dropped (expand and pick files). |
|
|
252
251
|
|
|
253
252
|
## Screenshots
|
|
254
253
|
|
|
255
254
|

|
|
256
255
|
|
|
257
|
-
|
|
256
|
+
_Chat with prompt templates_
|
|
258
257
|
|
|
259
258
|

|
|
260
259
|
|
|
261
|
-
|
|
260
|
+
_Run trajectory timeline (run-trace plugin)_
|
|
262
261
|
|
|
263
262
|

|
|
264
263
|
|
|
265
|
-
|
|
264
|
+
_Settings panel_
|
|
266
265
|
|
|
267
266
|

|
|
268
267
|
|
|
269
|
-
|
|
268
|
+
_Built-in terminal_
|
|
270
269
|
|
|
271
270
|

|
|
272
271
|
|
|
273
|
-
|
|
274
|
-
|
|
272
|
+
_Git source control panel_
|
|
275
273
|
|
|
276
274
|
## Install
|
|
277
275
|
|
|
@@ -364,17 +362,17 @@ pi-web-ui # foreground, http://localho
|
|
|
364
362
|
**Start flags & environment variables** — every setting can be passed as a `--flag` on the command
|
|
365
363
|
line **or** set as an environment variable (flag wins). Pick whichever you prefer:
|
|
366
364
|
|
|
367
|
-
| Flag
|
|
368
|
-
|
|
|
369
|
-
| `--port <n>`
|
|
370
|
-
| `--cwd <dir>`
|
|
371
|
-
| `--data-dir <dir>`
|
|
372
|
-
| `--engine <pi\|dsh>` | `PI_WEB_ENGINE`
|
|
373
|
-
| `--host <addr>`
|
|
374
|
-
| `--agent-dir <dir>`
|
|
375
|
-
| `--no-browser`
|
|
376
|
-
| _env only_
|
|
377
|
-
| _env only_
|
|
365
|
+
| Flag | Env var | Default | Purpose |
|
|
366
|
+
| -------------------- | --------------------- | ------------- | -------------------------------------------------------- |
|
|
367
|
+
| `--port <n>` | `PI_WEB_PORT` | `8787` | HTTP port |
|
|
368
|
+
| `--cwd <dir>` | `PI_WEB_CWD` | current dir | workspace root (read/write/terminal) |
|
|
369
|
+
| `--data-dir <dir>` | `PI_WEB_DATA_DIR` | `~/.pi-web` | data dir (UI state, plugins, uploads, themes, locales) |
|
|
370
|
+
| `--engine <pi\|dsh>` | `PI_WEB_ENGINE` | `pi` | agent engine; `--engine dsh` = DeepSeek Harness |
|
|
371
|
+
| `--host <addr>` | `PI_WEB_HOST` | `127.0.0.1` | listen address (`0.0.0.0` for LAN/Docker) |
|
|
372
|
+
| `--agent-dir <dir>` | `PI_CODING_AGENT_DIR` | `~/.pi/agent` | pi config dir (auth.json, models.json, sessions, skills) |
|
|
373
|
+
| `--no-browser` | — | off | start without auto-opening the browser |
|
|
374
|
+
| _env only_ | `PI_WEB_TOKEN` | empty | optional shared auth token |
|
|
375
|
+
| _env only_ | `PI_WEB_DSH_*` | — | dsh runtime, patches & debug settings |
|
|
378
376
|
|
|
379
377
|
The two are equivalent — pick one:
|
|
380
378
|
|
|
@@ -406,7 +404,6 @@ npm uninstall -g pi-web-ui
|
|
|
406
404
|
|
|
407
405
|
Uninstalling does **not** delete your chats: the transcripts you see in the history panel live in `<agentDir>/sessions/` (default `~/.pi/agent/sessions/`, per project), and the rest of your state — UI settings, recent projects, plugins, uploads, themes, language packs — lives in `<dataDir>` (default `~/.pi-web/`). Both survive uninstall, upgrade and reinstall; rerunning `pi-web-ui server install` afterward picks them up again (and if you plan to delete them, back up `sessions/` and `plugins/` first — an uninstall never touches either).
|
|
408
406
|
|
|
409
|
-
|
|
410
407
|
## System service
|
|
411
408
|
|
|
412
409
|
```bash
|
|
@@ -440,7 +437,6 @@ by hand. See the [start flags table](#quick-start) above.
|
|
|
440
437
|
pi-web-ui server install --engine dsh --port 9000 --cwd /path/to/project
|
|
441
438
|
```
|
|
442
439
|
|
|
443
|
-
|
|
444
440
|
## Docker
|
|
445
441
|
|
|
446
442
|
The image builds the frontend and the server, keeps the compiler toolchain `node-pty` needs, pre-installs the DSH runtime (so `PI_WEB_ENGINE=dsh` works without extra steps), runs as the non-root `node` user and declares `/app/.pi-web` as a volume:
|
|
@@ -482,14 +478,14 @@ up in the UI.
|
|
|
482
478
|
These plugins ship in this repository (`plugins/<id>/`) and can be installed
|
|
483
479
|
straight from GitHub:
|
|
484
480
|
|
|
485
|
-
| Plugin
|
|
486
|
-
|
|
|
487
|
-
| 📬 [webmail](https://github.com/xing-shuyin/pi-web-ui/tree/main/plugins/webmail)
|
|
488
|
-
| 🗄️ [db-client](https://github.com/xing-shuyin/pi-web-ui/tree/main/plugins/db-client)
|
|
489
|
-
| 📝 [vscode-editor](https://github.com/xing-shuyin/pi-web-ui/tree/main/plugins/vscode-editor) | VS Code-like workbench: multi-root file tree (local + SSH hosts), CodeMirror multi-tab editor, Remote-SSH remote file browsing/editing, draggable multi-terminal panel (xterm.js), SFTP sync & upload/download to your computer. Auto-installs `ssh2`.
|
|
490
|
-
| 📊 [mermaid](https://github.com/xing-shuyin/pi-web-ui/tree/main/plugins/mermaid)
|
|
491
|
-
| 🧭 [run-trace](https://github.com/xing-shuyin/pi-web-ui/tree/main/plugins/run-trace)
|
|
492
|
-
| 📖 [legado-web](https://github.com/xing-shuyin/pi-web-ui/tree/main/plugins/legado-web)
|
|
481
|
+
| Plugin | What it does |
|
|
482
|
+
| -------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
483
|
+
| 📬 [webmail](https://github.com/xing-shuyin/pi-web-ui/tree/main/plugins/webmail) | IMAP inbox browsing / search / read / mark / delete + SMTP sending, new-mail notifications, and an optional "allow AI to manage my mailbox" switch (six `mail_*` agent tools). Auto-installs its npm deps on first activation. |
|
|
484
|
+
| 🗄️ [db-client](https://github.com/xing-shuyin/pi-web-ui/tree/main/plugins/db-client) | Database workbench: connection manager + schema tree for MySQL / PostgreSQL / SQLite / SQL Server / MongoDB / Redis — table structure, paginated data with sorting, SQL editor, and row editing. Drivers auto-install on first use. |
|
|
485
|
+
| 📝 [vscode-editor](https://github.com/xing-shuyin/pi-web-ui/tree/main/plugins/vscode-editor) | VS Code-like workbench: multi-root file tree (local + SSH hosts), CodeMirror multi-tab editor, Remote-SSH remote file browsing/editing, draggable multi-terminal panel (xterm.js), SFTP sync & upload/download to your computer. Auto-installs `ssh2`. |
|
|
486
|
+
| 📊 [mermaid](https://github.com/xing-shuyin/pi-web-ui/tree/main/plugins/mermaid) | Renders ` ```mermaid ` fences in chat messages as SVG diagrams (fenced-code renderer plugin, offline-first local engine). |
|
|
487
|
+
| 🧭 [run-trace](https://github.com/xing-shuyin/pi-web-ui/tree/main/plugins/run-trace) | Run trajectory: task → thinking → tools → file changes → result timeline with replay and node details. |
|
|
488
|
+
| 📖 [legado-web](https://github.com/xing-shuyin/pi-web-ui/tree/main/plugins/legado-web) | Legado book reader (📖 阅读): search / discovery / book info / TOC / chapter reading on top of Android-compatible **book sources**, with source import, health checking and dead-source cleanup, and four agent tools (`legado_rules`, `legado_book_sources`, `legado_source_probe`, `legado_run_rule`) plus an “🤖 AI fix this source” button that opens a new chat with the failure context. Sources/shelf/progress persist under `<dataDir>/legado-web/`. |
|
|
493
489
|
|
|
494
490
|
`plugins/demo-mailbox` stays in the repo as the minimal plugin template (server entry + client view + two-way message protocol) and test fixture — start there if you want to write your own.
|
|
495
491
|
|
|
@@ -573,6 +569,29 @@ pi-web-ui uninstall <id> # remove a plugin
|
|
|
573
569
|
disappears. Plugin configuration written inside the plugin dir is removed
|
|
574
570
|
too — back up `<dataDir>/plugins/<id>/config.json` first if you need it.
|
|
575
571
|
|
|
572
|
+
## Browser extension
|
|
573
|
+
|
|
574
|
+
### 🎯 Web element picker (page-picker)
|
|
575
|
+
|
|
576
|
+
Pick elements on the site you are developing and turn them into context an AI can act on, then drop it
|
|
577
|
+
straight into the pi-web-ui composer (`Alt+Shift+P` or the toolbar icon → hover highlight → click to pick
|
|
578
|
+
→ `Shift`+click for multi-select → add a note → "Add to chat").
|
|
579
|
+
|
|
580
|
+
It is a **browser extension**, not a pi-web-ui server plugin (so `pi-web-ui install` does not apply):
|
|
581
|
+
|
|
582
|
+
**Download & install** (no Node required): [`page-picker-extension.zip`](https://github.com/xing-shuyin/pi-web-ui/releases/latest/download/page-picker-extension.zip) → unzip →
|
|
583
|
+
open `chrome://extensions`, enable "Developer mode", choose "Load unpacked" and select the unzipped
|
|
584
|
+
folder → open the extension options and set your pi-web-ui address (click "Authorize this address"
|
|
585
|
+
first for remote/LAN addresses).
|
|
586
|
+
|
|
587
|
+
See [`plugins/page-picker/README.md`](https://github.com/xing-shuyin/pi-web-ui/tree/main/plugins/page-picker) for the interaction details,
|
|
588
|
+
what gets captured, remote/LAN setups and known limitations.
|
|
589
|
+
|
|
590
|
+
It captures what actually lets an AI fix the code in one shot — not a screenshot: the React component
|
|
591
|
+
source location from the fiber (`Card.tsx:18:5` plus the component chain), the Vue SFC file, the
|
|
592
|
+
**source file and line** of the CSS rules that matched (reverse-computed in Vite dev), a computed-style
|
|
593
|
+
subset limited to values that differ from the defaults, a short unique selector, an HTML skeleton and
|
|
594
|
+
truncated text. An optional element screenshot rides along as a chat attachment.
|
|
576
595
|
|
|
577
596
|
## Themes
|
|
578
597
|
|
|
@@ -616,29 +635,28 @@ Want your theme shipped to everyone? Open a pull request at [github.com/xing-shu
|
|
|
616
635
|
|
|
617
636
|
Rules for merged themes: the file must be a single CSS file, set the `--term-*` variables for a readable terminal, and override `.hljs` syntax colors for readable code on light themes.
|
|
618
637
|
|
|
619
|
-
|
|
620
638
|
## Tuning & advanced environment variables
|
|
621
639
|
|
|
622
640
|
All optional — the defaults are what the app is developed against. Full reference: [`docs/env-vars.md`](docs/env-vars.md).
|
|
623
641
|
|
|
624
|
-
| Variable
|
|
625
|
-
|
|
|
626
|
-
| `PI_WEB_TOOL_TIMEOUT_MS`
|
|
627
|
-
| `PI_WEB_STALL_NOTIFY_MS`
|
|
628
|
-
| `PI_WEB_TERMINAL_IDLE_MS`
|
|
629
|
-
| `PI_WEB_TERMINAL_IDLE_LINES`
|
|
630
|
-
| `PI_WEB_INLINE_FILE_MAX`
|
|
631
|
-
| `PI_WEB_VISION_TIMEOUT_MS`
|
|
632
|
-
| `PI_WEB_UPLOAD_RETENTION_DAYS` | `14`
|
|
633
|
-
| `PI_WEB_SHELL`
|
|
634
|
-
| `PI_WEB_TABS`
|
|
635
|
-
| `PI_WEB_MANAGED`
|
|
636
|
-
| `PI_WEB_ALLOW_HOSTS`
|
|
637
|
-
| `PI_WEB_LOCALE`
|
|
638
|
-
| `PI_WEB_LOCALE_BASE_URL`
|
|
639
|
-
| `PI_WEB_PKG_ROOT`
|
|
640
|
-
| `PI_CODING_AGENT_SESSION_DIR`
|
|
641
|
-
| `DSH_*`
|
|
642
|
+
| Variable | Default | What it changes |
|
|
643
|
+
| ------------------------------ | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
644
|
+
| `PI_WEB_TOOL_TIMEOUT_MS` | `1200000` (20 min) | Per-tool-call watchdog; a tool still running is aborted (`ask_user_question` is exempt). |
|
|
645
|
+
| `PI_WEB_STALL_NOTIFY_MS` | `180000` (3 min) | Warn — without aborting — when a streaming run produces no event at all; `0` disables. |
|
|
646
|
+
| `PI_WEB_TERMINAL_IDLE_MS` | `15000` | Nudge the AI when a terminal it opened goes silent for this long; `0` disables. |
|
|
647
|
+
| `PI_WEB_TERMINAL_IDLE_LINES` | `10` | How many trailing terminal lines that nudge quotes back (1–500). |
|
|
648
|
+
| `PI_WEB_INLINE_FILE_MAX` | `12288` (12 KB) | Size under which a path-less uploaded file is inlined instead of referenced. |
|
|
649
|
+
| `PI_WEB_VISION_TIMEOUT_MS` | `90000` | Timeout for one whole vision-bridge transcription batch. |
|
|
650
|
+
| `PI_WEB_UPLOAD_RETENTION_DAYS` | `14` | Retention for `<dataDir>/uploads/`; `0` never sweeps. |
|
|
651
|
+
| `PI_WEB_SHELL` | auto | Windows only: which shell node-pty spawns (auto: `PI_WEB_SHELL` → `$SHELL` → Git Bash → bundled busybox → `%COMSPEC%` → PowerShell). |
|
|
652
|
+
| `PI_WEB_TABS` | all tabs | Comma-separated tab allow-list (`chat,terminal,git,search,tasks,settings,plugins`); hidden tabs are refused server-side, `chat` can't be turned off. |
|
|
653
|
+
| `PI_WEB_MANAGED` | off | `1`/`true` declares the instance externally deployed: self-update, pi-CLI install and plugin installs are refused with a reason and hidden in the UI. |
|
|
654
|
+
| `PI_WEB_ALLOW_HOSTS` | empty | Strict hostname allow-list for the HTTP/WS `Host` header, on top of the always-on same-authority check. |
|
|
655
|
+
| `PI_WEB_LOCALE` | empty | Fallback UI language for first-time visitors (an explicit choice and the browser's languages win over it). |
|
|
656
|
+
| `PI_WEB_LOCALE_BASE_URL` | GitHub raw | Where language packs are downloaded from — point it at a mirror for offline/intranet installs. |
|
|
657
|
+
| `PI_WEB_PKG_ROOT` | auto | Overrides where the server looks for `package.json`, `themes/`, `plugins/catalog.json` and `web/dist` (non-standard install layouts). |
|
|
658
|
+
| `PI_CODING_AGENT_SESSION_DIR` | empty | Flat session layout for pi instead of `<agentDir>/sessions/--<cwd>--/` (changes what the history list reads). |
|
|
659
|
+
| `DSH_*` | — | DSH runtime knobs: `PI_WEB_DSH_RUNTIME`, `PI_WEB_DSH_DATA_DIR`, `PI_WEB_DSH_PATCH_DIR`, `PI_WEB_DSH_QUESTION_TIMEOUT_MS`, `PI_WEB_DSH_TOOL_TIMEOUT_MS`, `PI_WEB_DSH_SESSION_RETENTION_DAYS`, `PI_WEB_DSH_DEBUG`. |
|
|
642
660
|
|
|
643
661
|
## Security
|
|
644
662
|
|
|
@@ -657,7 +675,6 @@ All optional — the defaults are what the app is developed against. Full refere
|
|
|
657
675
|
`Authorization` / API keys) are never sent to the browser; the model
|
|
658
676
|
management UI edits everything else and the server preserves the headers.
|
|
659
677
|
|
|
660
|
-
|
|
661
678
|
## 🪪 Code signing policy
|
|
662
679
|
|
|
663
680
|
Free code signing provided by [SignPath.io](https://signpath.io), certificate by
|
|
@@ -672,11 +689,11 @@ build of the source code at that tag.
|
|
|
672
689
|
|
|
673
690
|
### Team roles
|
|
674
691
|
|
|
675
|
-
| Role
|
|
676
|
-
|
|
|
677
|
-
| **Authors / committers** (may push to `main`)
|
|
692
|
+
| Role | Who |
|
|
693
|
+
| --------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
694
|
+
| **Authors / committers** (may push to `main`) | [@xing-shuyin](https://github.com/xing-shuyin) |
|
|
678
695
|
| **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) |
|
|
679
|
-
| **Approvers** (must approve each signing request)
|
|
696
|
+
| **Approvers** (must approve each signing request) | [@xing-shuyin](https://github.com/xing-shuyin) |
|
|
680
697
|
|
|
681
698
|
All team members use multi-factor authentication for both GitHub and SignPath.
|
|
682
699
|
Our release artifacts contain no binaries we did not build ourselves, except
|
|
@@ -697,13 +714,13 @@ server binds loopback unless you explicitly expose it.
|
|
|
697
714
|
|
|
698
715
|
Network requests happen only in these cases:
|
|
699
716
|
|
|
700
|
-
| When
|
|
701
|
-
|
|
|
702
|
-
| You send a message, or the agent calls a model
|
|
703
|
-
| Model catalog refresh (startup, then every 4 h)
|
|
704
|
-
| You install or update a plugin, theme or language pack
|
|
705
|
-
| You check for or install an update
|
|
706
|
-
| Terminals on Windows, when neither Git Bash nor a `bash` on `PATH` exists | `frippery.org`
|
|
717
|
+
| When | To | What leaves your machine |
|
|
718
|
+
| ------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
|
|
719
|
+
| 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 |
|
|
720
|
+
| Model catalog refresh (startup, then every 4 h) | `pi.dev` | nothing but the request itself |
|
|
721
|
+
| You install or update a plugin, theme or language pack | `github.com` / `raw.githubusercontent.com` | nothing but the request itself |
|
|
722
|
+
| You check for or install an update | `registry.npmjs.org` | nothing but the request itself |
|
|
723
|
+
| Terminals on Windows, when neither Git Bash nor a `bash` on `PATH` exists | `frippery.org` | one download of `busybox64u.exe` into `~/.pi-web/bin/bash.exe`, reused offline afterwards |
|
|
707
724
|
|
|
708
725
|
Reverse-proxy setups, the optional `PI_WEB_TOKEN` password and Docker port
|
|
709
726
|
mappings are under your control — see [Security](#security).
|
|
@@ -773,18 +790,17 @@ Key points:
|
|
|
773
790
|
|
|
774
791
|
Full working example (with an frp tunnel): `deploy/nginx-subpath.conf`.
|
|
775
792
|
|
|
776
|
-
|
|
777
793
|
## Contribute
|
|
778
794
|
|
|
779
795
|
pi-web-ui is a small open-source project — **your contributions are what make it grow**. Code, plugins, themes, docs, translations, ideas: everything is welcome, and every merged PR ships to all users with the next `npm publish`. ❤️
|
|
780
796
|
|
|
781
|
-
| Way to contribute
|
|
782
|
-
|
|
|
783
|
-
| 🧩 **Write a plugin**
|
|
784
|
-
| 🎨 **Contribute a theme**
|
|
785
|
-
| 💻 **Fix a bug / add a feature** | Look for [open issues](https://github.com/xing-shuyin/pi-web-ui/issues) or propose something new. Fork → branch → PR. Keep the code conventions in `AGENTS.md` (tabs, i18n keys in both languages, protocol changes in `server/protocol.ts`).
|
|
786
|
-
| 📖 **Docs & translations**
|
|
787
|
-
| 💡 **Ideas & feedback**
|
|
797
|
+
| Way to contribute | How to get started |
|
|
798
|
+
| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
799
|
+
| 🧩 **Write a plugin** | Build your own UI tab + agent tools. Copy `plugins/demo-mailbox` as the minimal template (it doubles as the test fixture), develop locally, then either open a PR to ship it in the [catalog](#plugin-catalog) or [publish it standalone](https://github.com/xing-shuyin/pi-web-ui/tree/main/plugins). |
|
|
800
|
+
| 🎨 **Contribute a theme** | Copy `themes/white.css` (light) or `themes/cyberpunk.css` (dark) as a pure-palette template, tweak the `:root` palette + `--term-*` + `.hljs`, verify with `npm run dev`, then open a PR — full walkthrough in [Contributing a theme](#contributing-a-theme-to-the-repository-github). |
|
|
801
|
+
| 💻 **Fix a bug / add a feature** | Look for [open issues](https://github.com/xing-shuyin/pi-web-ui/issues) or propose something new. Fork → branch → PR. Keep the code conventions in `AGENTS.md` (tabs, i18n keys in both languages, protocol changes in `server/protocol.ts`). |
|
|
802
|
+
| 📖 **Docs & translations** | Improve the READMEs, write plugin docs, fix typos, or help translate the UI / docs into more languages. |
|
|
803
|
+
| 💡 **Ideas & feedback** | Open an [issue](https://github.com/xing-shuyin/pi-web-ui/issues) or start a [discussion](https://github.com/xing-shuyin/pi-web-ui/discussions) — feature requests, bug reports, UI polish ideas, deployment experience reports. |
|
|
788
804
|
|
|
789
805
|
**Before opening a PR**, a quick sanity pass keeps reviewers happy:
|
|
790
806
|
|
|
@@ -799,7 +815,6 @@ pi-web-ui is a small open-source project — **your contributions are what make
|
|
|
799
815
|
> built something cool on top (plugin, theme, deployment recipe), tell us — we
|
|
800
816
|
> love showcasing community work.
|
|
801
817
|
|
|
802
|
-
|
|
803
818
|
## License
|
|
804
819
|
|
|
805
|
-
[MIT](LICENSE)
|
|
820
|
+
[MIT](LICENSE)
|