pi-ui-extend 0.1.54 → 0.1.56

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/README.md CHANGED
@@ -1,384 +1,331 @@
1
1
  # Pix
2
2
 
3
- Pix is a custom terminal UI for the Pi coding agent. It is built on the `@earendil-works/pi-coding-agent` SDK and provides its own renderer, input loop, session tabs, tool output controls, extension UI surface, and local voice input.
3
+ Pix is a terminal UI for the Pi coding agent. It uses the Pi agent and SDK, but replaces the default screen with a workspace-oriented interface: session tabs, compact tool calls, local shell commands, voice dictation, and a bundled `pi-tools-suite` extension pack.
4
4
 
5
- The npm package is currently named `pi-ui-extend` and installs the `pix` CLI.
5
+ The npm package is named `pi-ui-extend`; the installed command is `pix`.
6
6
 
7
7
  ## Highlights
8
8
 
9
- - SDK-first Pi runtime integration; Pix does not use Pi's built-in `InteractiveMode`.
10
- - Custom terminal renderer with streaming assistant output, thinking streams, tool rows, scrollback, and clickable tool expand/collapse state.
11
- - Workspace-scoped session tabs and persistent Pi sessions.
12
- - Local shell helpers through `!command` and raw TTY commands through `!!command`.
13
- - Optional local Vosk voice dictation with Russian and English models.
14
- - Pix extension UI helpers for toasts, menus, and rows above the input editor.
15
- - Bundled `pi-tools-suite` payload. On startup, Pix links it into Pi's standard user extension directory.
16
-
17
- ## Why use Pix instead of bare Pi?
18
-
19
- Pix keeps the same Pi agent engine and SDK, but replaces the default terminal experience with a faster, more interactive coding cockpit:
20
-
21
- - **Tabs for real work.** Keep several workspace-scoped Pi sessions open in one terminal, switch between tasks instantly, and restore tab state after restart.
22
- - **A readable tool-call UI.** Tool output is grouped into clickable rows, so long reads, patches, shell logs, and errors can be collapsed or expanded instead of flooding the conversation.
23
- - **Local shell without leaving the chat.** Prefix a command with `!` to run it in an ephemeral in-chat shell block, or use `!!` for raw TTY programs.
24
- - **Voice prompts.** Dictate prompts locally in Russian or English with Vosk; no cloud speech service is required.
25
- - **Prompt drafting assistance.** Inline AI autocomplete suggests the next words while you type, and `/enhance` rewrites a rough draft into a clearer agent prompt.
26
- - **Workspace safety net.** Pix tracks supported file mutations and lets you roll back the latest workspace change with `/undo`.
27
- - **Clickable files and images.** File paths in the conversation become clickable links that open in Zed, including line and column when available; image labels can be opened in the system viewer.
28
- - **Session power tools.** Search across saved sessions, fork from an earlier message, clone the current branch, rename sessions, export/import JSONL, or share a private gist.
29
- - **Queued follow-ups.** Add the next prompt while the agent is still running; Pix sends it automatically when the current turn finishes.
30
- - **Live status panels.** Built-in panels surface todo state, async sub-agent activity, model/context usage, and compression stats above the editor.
31
- - **Renderer-aware extensions.** Pix extensions can draw rows above/below the input, show stackable toasts, open searchable popup menus, and react through an isolated event bus.
32
- - **Nicer terminal ergonomics.** Mouse scrolling, PageUp/PageDown scrollback, tab attention, status lines, terminal-output buffering, Nerd Font icons, and fallback icon mode are handled by the Pix renderer.
9
+ - Work with multiple workspace sessions in tabs and resume them after restart.
10
+ - Read tool calls as compact rows; click a row to expand or collapse details.
11
+ - Run local shell commands from chat with `!command`, or full TTY programs with `!!command`.
12
+ - Dictate prompts locally with Vosk in Russian or English.
13
+ - Improve a draft prompt with `/enhance`.
14
+ - Undo the last supported workspace edit with `/undo`.
15
+ - Search, import, export, clone, fork, and resume saved sessions.
16
+ - See status widgets for todos, subagents, model selection, context usage, and compaction.
17
+ - Use extensions that can show toasts, menus, and above-input widgets.
33
18
 
34
19
  ## Requirements
35
20
 
36
- - Node.js `>=22.19.0 <25` (`24.16.0` is pinned for development).
37
- - A terminal with good Unicode support. JetBrainsMono Nerd Font is recommended for the default icon theme; Pix can install it for the current user on macOS, Linux, and Windows.
38
- - Linux clipboard support: Pix first tries `wl-copy`, `xclip`, `xsel`, or `termux-clipboard-set`, then falls back to its bundled native clipboard package.
39
- - Optional for voice input: SoX (`rec`/`sox`), `ffmpeg`, or Linux `arecord`.
21
+ - Node.js `>=22.19.0 <25`.
22
+ - A terminal with good Unicode support.
23
+ - Recommended font: JetBrainsMono Nerd Font. If icons render as squares, use the fallback icon theme.
24
+ - On Linux, clipboard integration works best with one of: `wl-copy`, `xclip`, `xsel`, or `termux-clipboard-set`.
25
+ - For voice dictation, install one recorder: SoX (`rec`/`sox`), `ffmpeg`, or `arecord` on Linux.
40
26
 
41
- Development uses `mise` when available. `.node-version` and `.nvmrc` are also provided for other Node version managers.
27
+ ## Install
42
28
 
43
- ## Installation
29
+ Fastest start:
44
30
 
45
- After publication, install Pix globally from npm:
31
+ ```bash
32
+ npx pi-ui-extend install
33
+ ```
34
+
35
+ Then run Pix in your project:
46
36
 
47
37
  ```bash
48
- npm install -g pi-ui-extend --ignore-scripts
38
+ npx pi-ui-extend --cwd /path/to/workspace
49
39
  ```
50
40
 
51
- The published package contains built JavaScript, the `pix` launcher, renderer extensions, documentation, and the bundled `pi-tools-suite` extension payload. Users do not need to clone the repository or build TypeScript locally.
41
+ For regular use, install Pix globally from npm so the `pix` command is always available:
42
+
43
+ ```bash
44
+ npm install -g pi-ui-extend --ignore-scripts
45
+ ```
52
46
 
53
- After installation, run the setup check when installing on a new machine:
47
+ Check your installation and environment:
54
48
 
55
49
  ```bash
56
50
  pix install
57
- # or report only:
58
- pix install --check
59
51
  ```
60
52
 
61
- `pix install` checks the icon font, `pi` CLI availability, and clipboard helpers. The `pix` launcher also prepends Pix's bundled dependency bin directory to `PATH`, so a package-manager install can use the bundled Pi CLI even when a separate global `pi` command is not present.
53
+ To only print the report without changing anything:
62
54
 
63
- After the setup check, review the user config files:
55
+ ```bash
56
+ pix install --check
57
+ ```
64
58
 
65
- - `~/.config/pi/pix.jsonc`: choose the voice-input language with `dictation.language` and keep only the `dictation.languages` models you want enabled.
66
- - `~/.config/pi/pi-tools-suite.jsonc`: enable/configure your LSP servers under `lsp.servers` and adjust pi-tools-suite modules or sub-agent presets if needed.
67
- - In Pix, run `/opencode-import` to import opencode accounts. For Antigravity OAuth accounts, run `/antigravity-import` or add another account with `/antigravity-add-account`.
59
+ The published package includes the compiled JavaScript, the `pix` launcher, docs, and the bundled `pi-tools-suite` extension. End users do not need to clone this repository or build TypeScript.
68
60
 
69
- On startup, Pix ensures the bundled suite is available at:
61
+ On startup, Pix also links the bundled `pi-tools-suite` into Pi's standard user extension directory:
70
62
 
71
63
  ```text
72
64
  ~/.pi/agent/extensions/pi-tools-suite
73
65
  ```
74
66
 
75
- If that path already contains a real directory, Pix leaves it untouched. If it is a Pix-managed symlink, Pix refreshes it as needed.
67
+ Pix will not overwrite a normal directory at that path. If the path is a symlink created by Pix, it is refreshed automatically.
68
+
69
+ ## First run
76
70
 
77
- ## Quick start
71
+ Open the project you want the agent to work in:
78
72
 
79
73
  ```bash
80
74
  pix --cwd /path/to/workspace
81
75
  ```
82
76
 
83
- If `--cwd` is omitted, Pix uses the current directory as the agent workspace.
77
+ If `--cwd` is omitted, Pix uses the current directory:
84
78
 
85
- Useful flags:
79
+ ```bash
80
+ cd /path/to/workspace
81
+ pix
82
+ ```
83
+
84
+ Useful startup flags:
85
+
86
+ - `--cwd <path>` — workspace for files, settings, resources, and agent sessions.
87
+ - `--no-session` — start a temporary in-memory session without persistence.
88
+ - `--model <provider/model[:thinking]>` — choose the startup model, for example:
89
+
90
+ ```bash
91
+ pix --model anthropic/claude-sonnet-4-20250514:medium
92
+ ```
93
+
94
+ ## Accounts and models
86
95
 
87
- - `--cwd <path>`: workspace used for Pi tools, settings, resources, and sessions.
88
- - `--no-session`: run with an in-memory SDK session.
89
- - `--model <provider/model[:thinking]>`: request a specific model, for example `anthropic/claude-sonnet-4-20250514:medium`.
96
+ Pix uses Pi providers and accounts. After installation, you can usually import or add accounts from inside Pix:
90
97
 
91
- ## Updating Pix
98
+ - `/opencode-import` — import opencode accounts.
99
+ - `/antigravity-import` — import Antigravity OAuth accounts.
100
+ - `/antigravity-add-account` — add another Antigravity account.
101
+ - `/model` — choose a model.
102
+ - `/thinking` — choose a thinking level: `off`, `minimal`, `low`, `medium`, `high`, `xhigh`, or `auto`.
103
+ - `/scoped-models` — configure the model list used by the picker and quick switching.
92
104
 
93
- Inside Pix, run:
105
+ ## Common actions
106
+
107
+ ### Send a prompt
108
+
109
+ Type your request and press `Enter`.
110
+
111
+ ### Run a shell command
94
112
 
95
113
  ```text
96
- /update
114
+ !npm test
97
115
  ```
98
116
 
99
- This checks the currently installed package version without mutating the running process.
117
+ The command runs locally and appears in the UI as a transient block. This output is not saved into the SDK session.
100
118
 
101
- From a shell:
119
+ While a command is running:
102
120
 
103
- ```bash
104
- pix update --check # check only
105
- pix update # update a package-manager install
106
- pix update --force # reinstall even when the check cannot prove an update is needed
121
+ - `Enter` sends the current editor text to the process stdin.
122
+ - `Ctrl+C` interrupts the process.
123
+
124
+ ### Run an interactive TTY command
125
+
126
+ ```text
127
+ !!top
107
128
  ```
108
129
 
109
- `pix update` updates the Pix npm package, pinned Pi SDK dependencies, renderer-owned extensions, and the bundled `pi-tools-suite` payload. The next Pix startup refreshes the extension link in `~/.pi/agent/extensions/pi-tools-suite`.
130
+ Use `!!` for full-screen or interactive programs.
110
131
 
111
- Update checks respect:
132
+ ### Dictate a prompt
112
133
 
113
- - `PI_OFFLINE=1`
114
- - `PI_SKIP_VERSION_CHECK=1`
115
- - `PIX_SKIP_VERSION_CHECK=1`
134
+ - `Ctrl+G` starts or stops local dictation.
135
+ - Click the microphone/language widget on the right to toggle dictation or switch language.
116
136
 
117
- Pi packages managed separately by Pi still use Pi's package manager:
137
+ On first use, Pix downloads small Vosk models:
118
138
 
119
- ```bash
120
- pi update --extensions
121
- # or
122
- pi update
123
- ```
139
+ - Russian: `vosk-model-small-ru-0.22`
140
+ - English: `vosk-model-small-en-us-0.15`
124
141
 
125
- ## Local development
142
+ Language and enabled models are configured in `~/.config/pi/pix.jsonc`.
126
143
 
127
- Install dependencies:
144
+ ### Undo the last supported edit
128
145
 
129
- ```bash
130
- npm install --ignore-scripts
146
+ ```text
147
+ /undo
131
148
  ```
132
149
 
133
- Link the local `pix` command:
150
+ Undo is available for supported Pix file mutations.
134
151
 
135
- ```bash
136
- npm run link:pix
137
- ```
152
+ ## Keyboard shortcuts
138
153
 
139
- Run Pix against a workspace:
154
+ - `Enter` send the prompt.
155
+ - `Ctrl+C` — stop the current agent response; if the agent is idle, exit Pix.
156
+ - `Ctrl+D` — exit when the input is empty.
157
+ - `Ctrl+L` — redraw the screen.
158
+ - `Ctrl+G` — start or stop voice dictation.
159
+ - `PageUp` / `PageDown` — scroll history.
160
+ - Mouse wheel — scroll history.
161
+ - Click a tool row — expand or collapse tool output.
140
162
 
141
- ```bash
142
- pix --cwd /path/to/workspace
163
+ Open the in-app shortcut help with:
164
+
165
+ ```text
166
+ /hotkeys
143
167
  ```
144
168
 
145
- During UI development, run the watcher in another terminal, then restart Pix after rebuilds when needed:
169
+ ## Slash commands
146
170
 
147
- ```bash
148
- npm run watch:pix
171
+ Type `/` to open the command picker. Commands with arguments can also be typed directly.
172
+
173
+ | Command | Purpose |
174
+ |---|---|
175
+ | `/settings` | Show current session settings, model, and theme. |
176
+ | `/model` | Choose a model or set `provider/model[:thinking]`. |
177
+ | `/thinking` | Choose a thinking level or `auto`. |
178
+ | `/scoped-models` | Configure models for the picker and quick switching. |
179
+ | `/enhance` | Improve the current draft prompt. |
180
+ | `/copy` | Copy the last assistant response. |
181
+ | `/name` | Rename the session or generate a name automatically. |
182
+ | `/session` | Show session stats: messages, tokens, and cost. |
183
+ | `/usage` | Show quota/account usage and context fill. |
184
+ | `/export [path]` | Export the session. Default is HTML; `.jsonl` exports JSONL. |
185
+ | `/import <path.jsonl>` | Import and continue a JSONL session. |
186
+ | `/share` | Share the session as a private GitHub gist; requires the `gh` CLI. |
187
+ | `/fork [entry-id]` | Fork the session from the latest or selected user message. |
188
+ | `/clone` | Duplicate the current session at the current position. |
189
+ | `/jump [query]` | Jump to a previous user message. |
190
+ | `/search <text>` | Search saved sessions. |
191
+ | `/resume [path\|query]` | Open another session. |
192
+ | `/new` | Start a new session in the current tab. |
193
+ | `/new_tab` | Start a new session in a new tab. |
194
+ | `/compact [instructions]` | Compact context with optional instructions. |
195
+ | `/reload` | Reload keybindings, extensions, skills, prompts, and themes. |
196
+ | `/update` | Check for Pix updates; install from the shell with `pix update`. |
197
+ | `/changelog` | Show the changelog for Pi packages. |
198
+ | `/quit`, `/exit` | Exit Pix. |
199
+
200
+ Extensions, prompt templates, and skills can add more commands to the same picker.
201
+
202
+ ## Update
203
+
204
+ Check for updates inside Pix:
205
+
206
+ ```text
207
+ /update
149
208
  ```
150
209
 
151
- For a one-shot dev launch that rebuilds and refreshes the global link first:
210
+ Check or install updates from the shell:
152
211
 
153
212
  ```bash
154
- npm run dev -- --cwd /path/to/workspace
213
+ pix update --check
214
+ pix update
155
215
  ```
156
216
 
157
- Before committing code changes, run:
217
+ Force reinstall:
158
218
 
159
219
  ```bash
160
- npm run check
220
+ pix update --force
161
221
  ```
162
222
 
163
- ### Keeping the bundled extension's SDK pin in sync
223
+ `pix update` updates the Pix npm package, pinned Pi SDK dependencies, renderer-owned extensions, and the bundled `pi-tools-suite`. On the next startup, Pix refreshes the extension symlink in `~/.pi/agent/extensions/pi-tools-suite`.
164
224
 
165
- Pix bundles the `pi-tools-suite` extension (in `external/pi-tools-suite`), which
166
- runs inside the Pi host process. Its `@earendil-works/*` peerDependencies must
167
- match the host Pi SDK version exactly, or npm can resolve a stale copy in the
168
- suite's own `node_modules` and cause a double-load (e.g. `0.75.4` in the suite
169
- vs `0.79.4` in the host).
225
+ Update checks are disabled by any of these environment variables:
170
226
 
171
- When you bump the Pi SDK in the root `package.json`, re-pin the suite and
172
- reinstall it:
227
+ - `PI_OFFLINE=1`
228
+ - `PI_SKIP_VERSION_CHECK=1`
229
+ - `PIX_SKIP_VERSION_CHECK=1`
230
+
231
+ If Pi packages are installed separately and managed by Pi itself, update them separately:
173
232
 
174
233
  ```bash
175
- npm run sync:sdk-pin # rewrite suite peerDeps to host version
176
- cd external/pi-tools-suite && npm install --ignore-scripts # update suite lockfile/node_modules
234
+ pi update --extensions
235
+ pi update
177
236
  ```
178
237
 
179
- `npm run check` runs `npm run sync:sdk-pin:check` first, so a stale pin fails
180
- the check fast. Use `npm run sync:sdk-pin:check` on its own for a drift-only
181
- report (non-zero exit on drift).
182
-
183
238
  ## Configuration
184
239
 
185
- Useful environment variables:
186
-
187
- - `PIX_DISABLE_TERMINAL_OUTPUT_BUFFER=1` or `PIX_TERMINAL_OUTPUT_BUFFER=0`: disable Pix terminal output region buffering.
188
- - `PIX_USE_FALLBACK_ICONS=1` or `PIX_ICON_THEME=fallback`: use plain fallback icons when Nerd Font glyphs are unavailable.
189
- - `PIX_ICON_THEME=nerdFont`: force the Nerd Font icon theme.
190
-
191
- Pix user configuration is read from:
240
+ User Pix config:
192
241
 
193
242
  ```text
194
243
  ~/.config/pi/pix.jsonc
195
244
  ```
196
245
 
197
- Example fallback icon configuration:
246
+ Common settings:
198
247
 
199
248
  ```jsonc
200
249
  {
201
- "iconTheme": "fallback"
250
+ "iconTheme": "fallback",
251
+ "dictation": {
252
+ "language": "en"
253
+ }
202
254
  }
203
255
  ```
204
256
 
205
- ## Controls
206
-
207
- - `Enter`: submit the prompt.
208
- - `!command`: run a local shell command in an in-chat ephemeral block. Output is visible only in the local UI and is not saved to the SDK session.
209
- - While a `!command` shell is running: `Enter` sends editor text to shell stdin; `Ctrl+C` interrupts the shell process.
210
- - `!!command`: run a shell command in the raw interactive terminal for full-screen or TTY programs.
211
- - `Ctrl+C`: exit Pix, or abort the running agent first.
212
- - `Ctrl+D`: exit when the input line is empty.
213
- - `Ctrl+L`: redraw.
214
- - `Ctrl+G`: start or stop local Vosk voice input.
215
- - `PageUp` / `PageDown`: scroll the conversation.
216
- - Mouse wheel: scroll the conversation.
217
- - Click a tool row: expand or collapse that tool result.
218
- - Click the right-aligned microphone/language status widget: toggle voice input and switch Russian/English dictation.
219
-
220
- ## Slash commands
257
+ Bundled `pi-tools-suite` config:
221
258
 
222
- Type `/` in the prompt to open the command picker. Commands that accept arguments can also be called directly with inline arguments.
223
-
224
- | Command | Arguments | Description |
225
- |---|---|---|
226
- | `/settings` | — | Show current session, model, theme, and key settings. |
227
- | `/model` | `[provider/model[:thinking]]` | Select the active model. Without arguments, opens the model picker. With a reference like `anthropic/claude-sonnet-4-20250514:medium`, sets the model and optional thinking level directly. |
228
- | `/scoped-models` | `[refs…\|reset]` | Show or set the models used by the model selector and cycling. Pass one or more `provider/model[:thinking]` references separated by spaces or commas. Use `reset` to restore the default favorites. |
229
- | `/thinking` | `[level\|auto]` | Select the thinking level. Without arguments, opens the thinking picker. Accepts an explicit level (`off`, `minimal`, `low`, `medium`, `high`, `xhigh`) or `auto`, which chooses a supported level per prompt. |
230
- | `/enhance` | — | Improve the current prompt draft using the prompt enhancer model. |
231
- | `/export` | `[path]` | Export the session. Defaults to HTML. Pass a `.jsonl` path to export as JSONL. |
232
- | `/import` | `<path.jsonl>` | Import and resume a session from a JSONL file. |
233
- | `/share` | — | Share the session as a private GitHub gist (requires `gh` CLI). |
234
- | `/copy` | — | Copy the last agent message to the clipboard. |
235
- | `/name` | `[name]` | Set the session display name. Without arguments, generate one automatically using the session-title logic. |
236
- | `/session` | — | Show session info: message counts, token usage, and cost. |
237
- | `/usage` | — | Show local account quota usage and context window utilization. |
238
- | `/changelog` | — | Show the Pi package changelog. |
239
- | `/update` | `[--force\|--help]` | Check for Pix package updates. `/update` is check-only; run `pix update` in a shell to install. |
240
- | `/hotkeys` | — | Show keyboard shortcuts. |
241
- | `/fork` | `[entry-id]` | Fork the session from the latest or specified user-message entry. |
242
- | `/clone` | — | Duplicate the current session at the current position. |
243
- | `/jump` | `[query]` | Jump to a previous user message. Opens the message picker, optionally filtered by query. |
244
- | `/search` | `<text>` | Search sessions for matching text and open a result in a new tab. |
245
- | `/reload` | — | Reload keybindings, extensions, skills, prompts, and themes from disk. |
246
- | `/resume` | `[path\|query]` | Resume a different session. Without arguments, opens the session picker. |
247
- | `/new` | — | Start a fresh session in the current tab. |
248
- | `/new_tab` | — | Open a fresh session in a new tab. |
249
- | `/compact` | `[instructions]` | Manually compact the session context, optionally with custom instructions for the compaction. |
250
- | `/quit`, `/exit` | — | Quit the renderer. |
251
-
252
- Extensions, prompt templates, and skills may register additional slash commands that appear in the command picker alongside the built-in ones.
253
-
254
- ## Voice input
255
-
256
- Pix can dictate into the prompt through local Vosk. The first start for each language downloads the small model into the gitignored `models/vosk/` directory inside this project:
259
+ ```text
260
+ ~/.config/pi/pi-tools-suite.jsonc
261
+ ```
257
262
 
258
- - Russian: `vosk-model-small-ru-0.22`
259
- - English: `vosk-model-small-en-us-0.15`
263
+ Use it to enable and configure LSP servers, sub-agent presets, and tool-suite modules.
260
264
 
261
- Runtime requirements:
265
+ Useful environment variables:
262
266
 
263
- - Optional npm package `vosk`. Pix installs or rebuilds it automatically with scripts enabled on first voice start if the native binding is missing.
264
- - A local recorder: SoX (`rec`/`sox`) preferred, or `ffmpeg`; Linux also supports `arecord`.
265
- - JetBrainsMono Nerd Font for default app icons. Pix checks this at startup and can install the font for the current user on macOS, Linux, and Windows when it is missing.
267
+ - `PIX_USE_FALLBACK_ICONS=1` or `PIX_ICON_THEME=fallback` use plain symbols instead of Nerd Font icons.
268
+ - `PIX_ICON_THEME=nerdFont` force Nerd Font icons.
269
+ - `PIX_DISABLE_TERMINAL_OUTPUT_BUFFER=1` or `PIX_TERMINAL_OUTPUT_BUFFER=0` disable the terminal output buffer region.
266
270
 
267
- If your terminal renders missing glyphs, start Pix with `PIX_USE_FALLBACK_ICONS=1` or set `iconTheme` to `fallback` in `~/.config/pi/pix.jsonc`.
271
+ ## Troubleshooting
268
272
 
269
- ## Pix extension SDK
273
+ ### Node is too old
270
274
 
271
- Pix exposes a small SDK surface for extensions that need renderer-specific UI features. Import types and helpers from `pi-ui-extend/sdk`:
275
+ Pix requires Node.js `>=22.19.0 <25`. Upgrade Node with your version manager, for example:
272
276
 
273
- ```ts
274
- import type {
275
- ExtensionWidgetFactory,
276
- PixExtensionUIContext,
277
- PixMenuItem,
278
- ToastKind,
279
- ToastNotifier,
280
- } from "pi-ui-extend/sdk";
281
- import { TOAST_KINDS, isToastKind } from "pi-ui-extend/sdk";
277
+ ```bash
278
+ nvm install 22
279
+ nvm use 22
282
280
  ```
283
281
 
284
- The same public entrypoint is also exported from `pi-ui-extend`, but `pi-ui-extend/sdk` is the preferred explicit import path for extension-facing APIs.
285
-
286
- ### Toasts
287
-
288
- Pix toasts are stackable by design: showing a new toast does not replace existing visible toasts. Each toast auto-hides independently after the renderer timeout.
282
+ or:
289
283
 
290
- Supported toast kinds:
291
-
292
- - `success`
293
- - `error`
294
- - `warning`
295
- - `info`
284
+ ```bash
285
+ mise install node@22.19.0
286
+ mise use -g node@22.19.0
287
+ ```
296
288
 
297
- Use `ctx.ui.toast` from a Pix extension UI context:
289
+ ### Icons are rendered as squares
298
290
 
299
- ```ts
300
- export async function activate(ctx: { ui: PixExtensionUIContext }) {
301
- ctx.ui.toast.success("Saved");
302
- ctx.ui.toast.error("Build failed");
303
- ctx.ui.toast.warning("Using fallback model");
304
- ctx.ui.toast.info("Index refreshed");
291
+ Start Pix with fallback icons:
305
292
 
306
- ctx.ui.toast.show("Custom message", "success");
307
- }
293
+ ```bash
294
+ PIX_USE_FALLBACK_ICONS=1 pix
308
295
  ```
309
296
 
310
- `ctx.ui.notify(message, kind)` also maps to Pix toasts and accepts the same `ToastKind` values:
297
+ Or save the setting in `~/.config/pi/pix.jsonc`:
311
298
 
312
- ```ts
313
- ctx.ui.notify("Retry succeeded", "success");
314
- ctx.ui.notify("Check config", "warning");
299
+ ```jsonc
300
+ {
301
+ "iconTheme": "fallback"
302
+ }
315
303
  ```
316
304
 
317
- ### Rendering above the input
318
-
319
- Use `ctx.ui.aboveInput` to render extension-controlled rows above the prompt editor, in the same area where Pix shows built-in todo and subagents panels.
305
+ ### Clipboard does not work on Linux
320
306
 
321
- ```ts
322
- ctx.ui.aboveInput.set("my-extension/status", [
323
- "My extension is watching files",
324
- "Press /my-command for details",
325
- ]);
307
+ Install one of the clipboard helpers: `wl-copy`, `xclip`, `xsel`, or `termux-clipboard-set`, then run:
326
308
 
327
- ctx.ui.aboveInput.clear("my-extension/status");
309
+ ```bash
310
+ pix install --check
328
311
  ```
329
312
 
330
- For dynamic content, pass a widget factory. It receives a `WidgetTuiHandle` with `requestRender()`, `showToast()`, `toast`, `showMenu()`, and `menu` helpers, plus the current theme.
331
-
332
- ```ts
333
- const widget: ExtensionWidgetFactory = (tui) => ({
334
- render: () => ["Dynamic extension row"],
335
- invalidate: () => tui.requestRender(),
336
- });
337
-
338
- ctx.ui.renderAboveInput("my-extension/dynamic", widget);
339
- ```
313
+ ### Voice dictation does not work
340
314
 
341
- The lower-level `ctx.ui.setWidget(key, content, { placement })` API is still available. `aboveInput` is the preferred Pix SDK wrapper for rows above the input. Use `placement: "belowEditor"` only when you explicitly need rows below the prompt editor.
315
+ Check that one recorder is installed: SoX, `ffmpeg`, or `arecord`. Then restart Pix and press `Ctrl+G`.
342
316
 
343
- ### Menus
317
+ ## For developers and extension authors
344
318
 
345
- Use `ctx.ui.menu.show()` or `ctx.ui.showMenu()` to open a Pix popup menu. The promise resolves to the selected item value, or `undefined` when the menu is cancelled.
319
+ This README focuses on installing and using Pix as an end user. If you want to develop Pix itself or write renderer-aware extensions, see the source tree, `docs/`, and the exported SDK entrypoint:
346
320
 
347
321
  ```ts
348
- const choice = await ctx.ui.menu.show<string>([
349
- { value: "copy", label: "Copy", description: "Copy result" },
350
- { value: "open", label: "Open", description: "Open in editor" },
351
- { value: "delete", label: "Delete", description: "Remove item", variant: "error" },
352
- ], {
353
- title: "Choose an action",
354
- placeholder: "Filter actions",
355
- });
356
-
357
- if (choice === "copy") ctx.ui.toast.success("Copied");
322
+ import type { PixExtensionUIContext } from "pi-ui-extend/sdk";
358
323
  ```
359
324
 
360
- Menu items are searchable by label and `keywords` by default. Pass `searchable: false` to disable filtering. `ctx.ui.select(title, options)` is implemented on top of the same Pix menu renderer for simple string choices.
361
-
362
- ## Release process
363
-
364
- Maintainers publish a new npm version with:
325
+ Local development from a source checkout usually starts with:
365
326
 
366
327
  ```bash
367
- npm run publish-npm # patch release
368
- npm run publish-npm -- minor # minor release
369
- npm run publish-npm -- major # major release
328
+ npm install --ignore-scripts
329
+ npm run dev -- --cwd /path/to/workspace
330
+ npm run check
370
331
  ```
371
-
372
- The publish command requires a clean `master`, runs release checks, bumps the root package version, smoke-tests the packed tarball, and pushes the release tag. GitHub Actions publishes tagged releases to npm using the `NPM_TOKEN` repository secret.
373
-
374
- For the full release checklist, see [docs/release.md](docs/release.md).
375
-
376
- ## Current limitations
377
-
378
- Pix is actively evolving. Known gaps include:
379
-
380
- - Text selection/copy support in the custom renderer.
381
- - Full prompt editor parity with mature terminal editors.
382
- - Dedicated session picker/fork UI.
383
- - Dedicated model picker UI.
384
- - Extension dialog rendering beyond SDK defaults.
@@ -1,7 +1,7 @@
1
1
  import type { ResolvedToolRule } from "../config.js";
2
- export declare const THINKING_LEVELS: readonly ["off", "minimal", "low", "medium", "high", "xhigh"];
2
+ export declare const THINKING_LEVELS: readonly ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
3
3
  export declare const THINKING_MENU_MAX_ROWS: number;
4
- export declare const PI_FAVORITE_MODEL_REFS: readonly ["amazon-bedrock/us.anthropic.claude-opus-4-6-v1", "anthropic/claude-opus-4-8", "openai/gpt-5.4", "azure-openai-responses/gpt-5.4", "openai-codex/gpt-5.5", "deepseek/deepseek-v4-pro", "google/gemini-3.1-pro-preview", "google-vertex/gemini-3.1-pro-preview", "github-copilot/gpt-5.4", "openrouter/moonshotai/kimi-k2.6", "vercel-ai-gateway/zai/glm-5.2", "xai/grok-4.20-0309-reasoning", "groq/openai/gpt-oss-120b", "cerebras/zai-glm-4.7", "zai/glm-5.2", "mistral/devstral-medium-latest", "minimax/MiniMax-M2.7", "minimax-cn/MiniMax-M2.7", "moonshotai/kimi-k2.6", "moonshotai-cn/kimi-k2.6", "huggingface/moonshotai/Kimi-K2.6", "fireworks/accounts/fireworks/models/kimi-k2p6", "together/moonshotai/Kimi-K2.6", "opencode/kimi-k2.6", "opencode-go/kimi-k2.6", "kimi-coding/kimi-for-coding", "cloudflare-workers-ai/@cf/moonshotai/kimi-k2.6", "cloudflare-ai-gateway/workers-ai/@cf/moonshotai/kimi-k2.6", "xiaomi/mimo-v2.5-pro", "xiaomi-token-plan-cn/mimo-v2.5-pro", "xiaomi-token-plan-ams/mimo-v2.5-pro", "xiaomi-token-plan-sgp/mimo-v2.5-pro"];
4
+ export declare const PI_FAVORITE_MODEL_REFS: readonly ["amazon-bedrock/us.anthropic.claude-opus-4-6-v1", "anthropic/claude-opus-4-8", "openai/gpt-5.4", "azure-openai-responses/gpt-5.4", "openai-codex/gpt-5.6-sol", "deepseek/deepseek-v4-pro", "google/gemini-3.1-pro-preview", "google-vertex/gemini-3.1-pro-preview", "github-copilot/gpt-5.4", "openrouter/moonshotai/kimi-k2.6", "vercel-ai-gateway/zai/glm-5.2", "xai/grok-4.20-0309-reasoning", "groq/openai/gpt-oss-120b", "cerebras/zai-glm-4.7", "zai/glm-5.2", "mistral/devstral-medium-latest", "minimax/MiniMax-M2.7", "minimax-cn/MiniMax-M2.7", "moonshotai/kimi-k2.6", "moonshotai-cn/kimi-k2.6", "huggingface/moonshotai/Kimi-K2.6", "fireworks/accounts/fireworks/models/kimi-k2p6", "together/moonshotai/Kimi-K2.6", "opencode/kimi-k2.6", "opencode-go/kimi-k2.6", "kimi-coding/kimi-for-coding", "cloudflare-workers-ai/@cf/moonshotai/kimi-k2.6", "cloudflare-ai-gateway/workers-ai/@cf/moonshotai/kimi-k2.6", "xiaomi/mimo-v2.5-pro", "xiaomi-token-plan-cn/mimo-v2.5-pro", "xiaomi-token-plan-ams/mimo-v2.5-pro", "xiaomi-token-plan-sgp/mimo-v2.5-pro"];
5
5
  export declare const SLASH_COMMAND_MENU_MAX_ROWS = 6;
6
6
  export declare const RESUME_MENU_MAX_ROWS = 20;
7
7
  export declare const RESUME_MENU_INITIAL_SESSION_ROWS = 30;
@@ -1,12 +1,12 @@
1
1
  import { join } from "node:path";
2
- export const THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh"];
2
+ export const THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
3
3
  export const THINKING_MENU_MAX_ROWS = THINKING_LEVELS.length + 1;
4
4
  export const PI_FAVORITE_MODEL_REFS = [
5
5
  "amazon-bedrock/us.anthropic.claude-opus-4-6-v1",
6
6
  "anthropic/claude-opus-4-8",
7
7
  "openai/gpt-5.4",
8
8
  "azure-openai-responses/gpt-5.4",
9
- "openai-codex/gpt-5.5",
9
+ "openai-codex/gpt-5.6-sol",
10
10
  "deepseek/deepseek-v4-pro",
11
11
  "google/gemini-3.1-pro-preview",
12
12
  "google-vertex/gemini-3.1-pro-preview",
@@ -82,6 +82,7 @@ export class AppMenuItemsController {
82
82
  level === "off" ? "disabled none no reasoning" : "reasoning thinking effort",
83
83
  level === "minimal" ? "fast small" : "",
84
84
  level === "xhigh" ? "extra highest maximum" : "",
85
+ level === "max" ? "maximum most" : "",
85
86
  ].filter(Boolean),
86
87
  }));
87
88
  return fuzzySearch(items, query).map((match) => ({
@@ -217,6 +218,8 @@ export class AppMenuItemsController {
217
218
  return "High reasoning";
218
219
  case "xhigh":
219
220
  return "Extra high reasoning";
221
+ case "max":
222
+ return "Maximum reasoning";
220
223
  }
221
224
  }
222
225
  }