@kingingwang/pi-windows-arm64 0.84.2 → 0.84.4

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 (43) hide show
  1. package/bin/CHANGELOG.md +127 -0
  2. package/bin/README.md +13 -8
  3. package/bin/docs/compaction.md +17 -0
  4. package/bin/docs/custom-provider.md +12 -9
  5. package/bin/docs/environment-variables.md +11 -8
  6. package/bin/docs/extensions.md +35 -7
  7. package/bin/docs/json.md +7 -2
  8. package/bin/docs/keybindings.md +9 -9
  9. package/bin/docs/llama-cpp.md +2 -0
  10. package/bin/docs/models.md +8 -2
  11. package/bin/docs/packages.md +2 -2
  12. package/bin/docs/quickstart.md +1 -1
  13. package/bin/docs/rpc.md +32 -3
  14. package/bin/docs/sdk.md +7 -2
  15. package/bin/docs/settings.md +23 -7
  16. package/bin/docs/skills.md +4 -3
  17. package/bin/docs/terminal-setup.md +23 -9
  18. package/bin/docs/usage.md +10 -5
  19. package/bin/docs/windows.md +24 -2
  20. package/bin/examples/extensions/border-status-editor.ts +1 -1
  21. package/bin/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  22. package/bin/examples/extensions/custom-provider-anthropic/package.json +1 -1
  23. package/bin/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  24. package/bin/examples/extensions/git-checkpoint.ts +2 -2
  25. package/bin/examples/extensions/gondolin/package-lock.json +2 -2
  26. package/bin/examples/extensions/gondolin/package.json +1 -1
  27. package/bin/examples/extensions/notify.ts +3 -1
  28. package/bin/examples/extensions/sandbox/package-lock.json +2 -2
  29. package/bin/examples/extensions/sandbox/package.json +1 -1
  30. package/bin/examples/extensions/subagent/README.md +1 -1
  31. package/bin/examples/extensions/subagent/index.ts +6 -1
  32. package/bin/examples/extensions/titlebar-spinner.ts +1 -1
  33. package/bin/examples/extensions/with-deps/package-lock.json +2 -2
  34. package/bin/examples/extensions/with-deps/package.json +1 -1
  35. package/bin/examples/rpc-extension-ui.ts +1 -1
  36. package/bin/examples/sdk/06-extensions.ts +1 -1
  37. package/bin/examples/sdk/README.md +1 -1
  38. package/bin/package.json +12 -14
  39. package/bin/pi.exe +0 -0
  40. package/package.json +1 -1
  41. package/bin/node_modules/@mariozechner/clipboard-win32-arm64-msvc/README.md +0 -3
  42. package/bin/node_modules/@mariozechner/clipboard-win32-arm64-msvc/clipboard.win32-arm64-msvc.node +0 -0
  43. package/bin/node_modules/@mariozechner/clipboard-win32-arm64-msvc/package.json +0 -22
@@ -38,7 +38,7 @@ pi update npm:@foo/bar # update one package
38
38
  pi update --extension npm:@foo/bar
39
39
  ```
40
40
 
41
- These commands manage pi packages and `pi update` can update the pi CLI installation. To uninstall pi itself, see [Quickstart](quickstart.md#uninstall).
41
+ These commands manage pi packages and `pi update` can update the pi CLI installation. For experimental installer-managed installations, `pi update` installs the exact checked version into a staged, lockfile-backed release and activates it only after verification, leaving the current release intact if the update fails. Managed installations do not support `--force`; rerun the installer to repair one. To uninstall pi itself, see [Quickstart](quickstart.md#uninstall).
42
42
 
43
43
  By default, `install` and `remove` write to user settings (`~/.pi/agent/settings.json`). Use `-l` to write to project settings (`.pi/settings.json`) instead. Project settings can be shared with your team, and pi installs any missing packages automatically on startup after the project is trusted.
44
44
 
@@ -130,7 +130,7 @@ Add a `pi` manifest to `package.json` or use conventional directories. Include t
130
130
  }
131
131
  ```
132
132
 
133
- Paths are relative to the package root. Arrays support glob patterns and `!exclusions`.
133
+ Paths are relative to the package root. Arrays support glob patterns and `!exclusions`. Positive manifest globs discover visible paths in lexical order. List dot-prefixed paths directly. If a glob would need to continue through a symlink, list the symlinked resource root directly.
134
134
 
135
135
  ### Gallery Metadata
136
136
 
@@ -129,7 +129,7 @@ The command output is sent to the model. Use `!!command` to run a command withou
129
129
 
130
130
  ### Switch models
131
131
 
132
- Use `/model` or Ctrl+L to choose a model. Use Shift+Tab to cycle thinking level. Use Ctrl+P / Shift+Ctrl+P to cycle through scoped models.
132
+ Use `/model` or Ctrl+L to choose a model for the current session. Press Ctrl+S in the model picker to save the highlighted model as the startup default. Use `/thinking` to choose a thinking level for the current session, or Ctrl+S in that picker to save the startup default thinking level. Use Shift+Tab to cycle thinking level. Use Ctrl+P / Shift+Ctrl+P to cycle through scoped models.
133
133
 
134
134
  ### Continue later
135
135
 
package/bin/docs/rpc.md CHANGED
@@ -134,6 +134,29 @@ Response:
134
134
  {"type": "response", "command": "abort", "success": true}
135
135
  ```
136
136
 
137
+ #### clear_queue
138
+
139
+ Remove queued steering and follow-up messages and return their text.
140
+
141
+ ```json
142
+ {"type": "clear_queue"}
143
+ ```
144
+
145
+ Response:
146
+ ```json
147
+ {
148
+ "type": "response",
149
+ "command": "clear_queue",
150
+ "success": true,
151
+ "data": {
152
+ "steering": ["Change direction"],
153
+ "followUp": ["Summarize when finished"]
154
+ }
155
+ }
156
+ ```
157
+
158
+ To implement interactive Esc behavior, send `clear_queue` before `abort`, then restore the returned text in the client editor. `abort` continues queued messages when they remain in the session.
159
+
137
160
  #### new_session
138
161
 
139
162
  Start a fresh session. Can be cancelled by a `session_before_switch` extension event handler.
@@ -945,7 +968,7 @@ The `assistantMessageEvent` field contains one of these delta types:
945
968
  | `thinking_start` | Thinking block started |
946
969
  | `thinking_delta` | Thinking content chunk |
947
970
  | `thinking_end` | Thinking block ended |
948
- | `toolcall_start` | Tool call started |
971
+ | `toolcall_start` | Tool call started (includes `id` and `toolName`) |
949
972
  | `toolcall_delta` | Tool call arguments chunk |
950
973
  | `toolcall_end` | Tool call ended (includes full `toolCall` object) |
951
974
 
@@ -960,11 +983,17 @@ Example streaming a text response:
960
983
  The top-level `usage` field contains the latest cumulative provider-reported usage. It may remain
961
984
  zero until completion when a provider does not report usage during streaming.
962
985
 
986
+ Example starting a tool call:
987
+ ```json
988
+ {"type":"message_update","usage":{...},"assistantMessageEvent":{"type":"toolcall_start","contentIndex":1,"id":"call_abc123","toolName":"write"}}
989
+ ```
990
+
963
991
  `message_update` intentionally omits the former cumulative `message` field and
964
992
  `assistantMessageEvent.partial`. Clients that need a live partial message must assemble it
965
993
  from `message_start` and subsequent events using `contentIndex`. Treat `message_end.message`
966
- as authoritative. For tool calls, buffer `toolcall_delta.delta`; `toolcall_end.toolCall`
967
- contains the completed call.
994
+ as authoritative. For tool calls, `toolcall_start` provides the call `id` and `toolName`;
995
+ buffer `toolcall_delta.delta` for arguments. `toolcall_end.toolCall` contains the completed
996
+ call.
968
997
 
969
998
  ### bash_execution_update
970
999
 
package/bin/docs/sdk.md CHANGED
@@ -519,7 +519,7 @@ const { session } = await createAgentSession({ resourceLoader: loader });
519
519
 
520
520
  Specify which built-in tools to enable:
521
521
 
522
- - Built-in tool names: `read`, `bash`, `edit`, `write`, `grep`, `find`, `ls`
522
+ - Built-in tool names: `read`, `bash`, `powershell`, `edit`, `write`, `grep`, `find`, `ls`
523
523
  - Default built-ins: `read`, `bash`, `edit`, `write`
524
524
  - `noTools: "all"` disables all tools
525
525
  - `noTools: "builtin"` disables default built-ins while keeping extension and custom tools enabled
@@ -540,6 +540,11 @@ const { session } = await createAgentSession({
540
540
  tools: ["read", "bash", "grep"],
541
541
  });
542
542
 
543
+ // Use PowerShell instead of Bash on Windows
544
+ const { session } = await createAgentSession({
545
+ tools: ["read", "powershell", "edit", "write"],
546
+ });
547
+
543
548
  // Disable one tool while keeping the rest available
544
549
  const { session } = await createAgentSession({
545
550
  excludeTools: ["ask_question"],
@@ -1196,7 +1201,7 @@ SettingsManager
1196
1201
  // Tool factories
1197
1202
  createCodingTools
1198
1203
  createReadOnlyTools
1199
- createReadTool, createBashTool, createEditTool, createWriteTool
1204
+ createReadTool, createBashTool, createPowerShellTool, createEditTool, createWriteTool
1200
1205
  createGrepTool, createFindTool, createLsTool
1201
1206
 
1202
1207
  // Types
@@ -7,7 +7,7 @@ Pi uses JSON settings files with project settings overriding global settings.
7
7
  | `~/.pi/agent/settings.json` | Global (all projects) |
8
8
  | `.pi/settings.json` | Project (current directory) |
9
9
 
10
- Edit directly or use `/settings` for common options.
10
+ Edit directly or use `/settings` for common options. To save startup model defaults interactively, use `/model` and press Ctrl+S on the desired model. To save the startup thinking level, use `/thinking` and press Ctrl+S.
11
11
 
12
12
  ## Project Trust
13
13
 
@@ -27,12 +27,13 @@ Use `/trust` in interactive mode to save a project trust decision for future ses
27
27
 
28
28
  | Setting | Type | Default | Description |
29
29
  |---------|------|---------|-------------|
30
- | `defaultProvider` | string | - | Default provider (e.g., `"anthropic"`, `"openai"`) |
31
- | `defaultModel` | string | - | Default model ID |
32
- | `defaultThinkingLevel` | string | - | `"off"`, `"minimal"`, `"low"`, `"medium"`, `"high"`, `"xhigh"`, `"max"` |
30
+ | `defaultProvider` | string | - | Startup provider (e.g., `"anthropic"`, `"openai"`; saved with Ctrl+S in `/model`, or edited manually) |
31
+ | `defaultModel` | string | - | Startup model ID (saved with Ctrl+S in `/model`, or edited manually) |
32
+ | `defaultThinkingLevel` | string | - | Startup thinking level (saved with Ctrl+S in `/thinking`, or edited manually): `"off"`, `"minimal"`, `"low"`, `"medium"`, `"high"`, `"xhigh"`, `"max"` |
33
+ | `modelThinkingLevels` | object | - | Per-model startup thinking levels keyed by `"provider/modelId"`; configure from `/settings` → Default thinking level per model or edit manually |
33
34
  | `hideThinkingBlock` | boolean | `false` | Hide thinking blocks in output |
34
- | `showCacheMissNotices` | boolean | `false` | Show transcript notices for significant prompt-cache misses |
35
- | `thinkingBudgets` | object | - | Custom token budgets per thinking level |
35
+ | `showCacheMissNotices` | boolean | `false` | Show transcript notices for significant prompt-cache misses and compaction or branch-summary usage |
36
+ | `thinkingBudgets` | object | - | Custom token budgets per thinking level. Anthropic, Google, and Bedrock use these natively. OpenAI-compatible models use them when `compat.thinkingTokenBudgetField` (or `supportsThinkingTokenBudget`) is set. |
36
37
 
37
38
  #### thinkingBudgets
38
39
 
@@ -68,6 +69,7 @@ Use `/trust` in interactive mode to save a project trust decision for future ses
68
69
  | `tuiMode` | string | `"regular"` | Interactive TUI mode: `"regular"` or experimental `"fullscreen"`. Changes from `/settings` apply immediately; `--tui-mode` overrides this setting at startup |
69
70
  | `fullscreenExitOutput` | string | `"transcript"` | Fullscreen exit output: `"transcript"` prints the final transcript and resume hint, while `"resume-hint"` restores the previous screen and prints only the resume hint. Has no effect in regular TUI mode |
70
71
  | `fullscreenScrollbar` | string | `"auto"` | Fullscreen transcript scrollbar: `"auto"` shows it temporarily while scrolling, `"always"` reserves the rightmost column and keeps it visible, and `"hidden"` hides it. Has no effect in regular TUI mode |
72
+ | `fullscreenCopyOnSelect` | boolean | `true` | Automatically copy selected text in fullscreen mode. When disabled, selections stay highlighted and `Ctrl+X` copies the active selection |
71
73
 
72
74
  For VS Code, include `--wait` so pi resumes after the editor exits:
73
75
 
@@ -188,6 +190,9 @@ Keep `retry.provider.maxRetries` at `0` unless provider-level retries are explic
188
190
  | `terminal.showImages` | boolean | `true` | Show images in terminal (if supported) |
189
191
  | `terminal.imageWidthCells` | number | `60` | Preferred inline image width in terminal cells |
190
192
  | `terminal.clearOnShrink` | boolean | `false` | Clear empty rows when content shrinks (can cause flicker) |
193
+ | `terminal.hyperlinks` | boolean or `"auto"` | `"auto"` | Override OSC 8 hyperlink support (advanced, JSON-only) |
194
+ | `terminal.images` | string or boolean | `"auto"` | Override image protocol support with `"kitty"`, `"iterm2"`, `false`, or `"auto"` (advanced, JSON-only) |
195
+ | `terminal.trueColor` | boolean or `"auto"` | `"auto"` | Override truecolor support (advanced, JSON-only) |
191
196
  | `images.autoResize` | boolean | `true` | Resize images to 2000x2000 max. Applies to `@file` attachments, `read`, and images returned by tools |
192
197
  | `images.blockImages` | boolean | `false` | Block all images from being sent to LLM |
193
198
 
@@ -227,7 +232,7 @@ Windows paths in JSON must use forward slashes or escaped backslashes:
227
232
  |---------|------|---------|-------------|
228
233
  | `defaultTools` | string[] | - | Built-in tools enabled initially. When omitted, Pi uses its standard defaults |
229
234
 
230
- `defaultTools` selects the built-in tools enabled at startup. Extension and SDK custom tools remain enabled:
235
+ `defaultTools` selects the built-in tools enabled at startup. Extension and SDK custom tools remain enabled. Available built-ins are `read`, `bash`, `powershell`, `edit`, `write`, `grep`, `find`, and `ls`:
231
236
 
232
237
  ```json
233
238
  {
@@ -235,6 +240,14 @@ Windows paths in JSON must use forward slashes or escaped backslashes:
235
240
  }
236
241
  ```
237
242
 
243
+ On Windows, select `powershell` instead of `bash`, or include both:
244
+
245
+ ```json
246
+ {
247
+ "defaultTools": ["read", "powershell", "edit", "write"]
248
+ }
249
+ ```
250
+
238
251
  An empty array starts with no built-in tools while preserving extension and SDK custom tools. `--tools` replaces this behavior with a strict allowlist for all tools, `--no-tools` disables all tools, and `--no-builtin-tools` disables the built-in defaults. `--exclude-tools` filters the resulting list. A project `defaultTools` array replaces the global array.
239
252
 
240
253
  ### Sessions
@@ -318,6 +331,9 @@ See [packages.md](packages.md) for package management details.
318
331
  "defaultProvider": "anthropic",
319
332
  "defaultModel": "claude-sonnet-4-20250514",
320
333
  "defaultThinkingLevel": "medium",
334
+ "modelThinkingLevels": {
335
+ "anthropic/claude-sonnet-4-20250514": "high"
336
+ },
321
337
  "theme": "dark",
322
338
  "compaction": {
323
339
  "enabled": true,
@@ -34,9 +34,10 @@ Pi loads skills from:
34
34
  - CLI: `--skill <path>` (repeatable, additive even with `--no-skills`)
35
35
 
36
36
  Discovery rules:
37
- - In `~/.pi/agent/skills/` and `.pi/skills/`, direct root `.md` files are discovered as individual skills
37
+ - In `~/.pi/agent/skills/` and `.pi/skills/`, direct root `.md` files are discovered as individual skills when they have valid skill frontmatter with a non-empty `description`
38
38
  - In all skill locations, directories containing `SKILL.md` are discovered recursively
39
- - In `~/.agents/skills/` and project `.agents/skills/`, root `.md` files are ignored
39
+ - In `~/.agents/skills/` and project `.agents/skills/`, root `.md` files are ignored, but nested `.md` files in grouping folders are discovered when they declare skill frontmatter
40
+ - Root Markdown files other than `SKILL.md` that do not look like skills are ignored silently
40
41
 
41
42
  Disable discovery with `--no-skills` (explicit `--skill` paths still load).
42
43
 
@@ -183,7 +184,7 @@ Pi validates skills against the Agent Skills standard. Most issues produce warni
183
184
 
184
185
  Unknown frontmatter fields are ignored.
185
186
 
186
- **Exception:** Skills with missing description are not loaded.
187
+ Declared skills with missing descriptions are not loaded. Malformed `SKILL.md` files and `SKILL.md` files without a description produce warnings and are not loaded. Other Markdown files without valid skill frontmatter are ignored.
187
188
 
188
189
  Name collisions (same name from different locations) warn and keep the first skill found.
189
190
 
@@ -2,6 +2,18 @@
2
2
 
3
3
  Pi uses the [Kitty keyboard protocol](https://sw.kovidgoyal.net/kitty/keyboard-protocol/) for reliable modifier key detection. Most modern terminals support this protocol, but some require configuration.
4
4
 
5
+ ## Capability Overrides
6
+
7
+ Pi auto-detects OSC 8 hyperlinks, inline image protocols, and truecolor. If detection fails behind a terminal proxy or multiplexer, use these advanced overrides:
8
+
9
+ | Capability | Environment variable | JSON setting |
10
+ |------------|----------------------|--------------|
11
+ | OSC 8 hyperlinks | `PI_HYPERLINKS=1\|0\|auto` | `terminal.hyperlinks: true\|false\|"auto"` |
12
+ | Inline images | `PI_IMAGE_PROTOCOL=kitty\|iterm2\|none\|auto` | `terminal.images: "kitty"\|"iterm2"\|false\|"auto"` |
13
+ | Truecolor | `PI_TRUE_COLOR=1\|0\|auto` | `terminal.trueColor: true\|false\|"auto"` |
14
+
15
+ Settings take precedence over environment variables; unset or `auto` preserves detection. Only force capabilities supported by the complete terminal path, since unsupported escape sequences can corrupt rendering.
16
+
5
17
  ## Kitty
6
18
 
7
19
  Works out of the box.
@@ -120,7 +132,15 @@ Add to `keybindings.json`:
120
132
 
121
133
  ## Windows Terminal
122
134
 
123
- Add to `settings.json` (Ctrl+Shift+, or Settings → Open JSON file) to forward the modified Enter keys pi uses:
135
+ Pi uses Windows-style keybindings when running natively on Windows or in WSL:
136
+
137
+ - `Alt+V` pastes an image or clipboard text.
138
+ - `Ctrl+F` searches the transcript in fullscreen mode, and `Ctrl+Up`/`Ctrl+Down` jump between marked messages.
139
+ - `Alt+P` cycles to the previous model.
140
+ - `Ctrl+Z` undoes editing on native Windows; WSL uses `Alt+Z` so `Ctrl+Z` can suspend pi.
141
+ - `Ctrl+Q` queues a follow-up message and `Alt+Q` restores queued messages.
142
+
143
+ Add to `settings.json` (Ctrl+Shift+, or Settings → Open JSON file) to forward `Shift+Enter` for inserting a new line:
124
144
 
125
145
  ```json
126
146
  {
@@ -128,20 +148,14 @@ Add to `settings.json` (Ctrl+Shift+, or Settings → Open JSON file) to forward
128
148
  {
129
149
  "command": { "action": "sendInput", "input": "\u001b[13;2u" },
130
150
  "keys": "shift+enter"
131
- },
132
- {
133
- "command": { "action": "sendInput", "input": "\u001b[13;3u" },
134
- "keys": "alt+enter"
135
151
  }
136
152
  ]
137
153
  }
138
154
  ```
139
155
 
140
- - `Shift+Enter` inserts a new line.
141
- - Windows Terminal binds `Alt+Enter` to fullscreen by default. That prevents pi from receiving `Alt+Enter` for follow-up queueing.
142
- - Remapping `Alt+Enter` to `sendInput` forwards the real key chord to pi instead.
156
+ Windows Terminal binds `Alt+Enter` to fullscreen by default. To use it instead of pi's `Ctrl+Q` default for follow-up queueing, configure Windows Terminal to send the key and bind `app.message.followUp` to `alt+enter` in pi.
143
157
 
144
- If you already have an `actions` array, add the objects to it. If the old fullscreen behavior persists, fully close and reopen Windows Terminal.
158
+ If you already have an `actions` array, add the object to it. Fully close and reopen Windows Terminal after changing its settings.
145
159
 
146
160
  ## xfce4-terminal, terminator
147
161
 
package/bin/docs/usage.md CHANGED
@@ -22,7 +22,7 @@ The editor can be replaced temporarily by built-in UI such as `/settings` or by
22
22
  | File reference | Type `@` to fuzzy-search project files |
23
23
  | Path completion | Press Tab to complete paths |
24
24
  | Multi-line input | Shift+Enter, or Ctrl+Enter on Windows Terminal |
25
- | Copy response | Ctrl+X copies the last assistant message; in `/tree`, it copies the selected message |
25
+ | Copy response | Ctrl+X copies the selected message in `/tree`; otherwise it copies the last assistant message, or the active fullscreen text selection when `fullscreenCopyOnSelect` is disabled |
26
26
  | Images | Paste with Ctrl+V, Alt+V on Windows, or drag into the terminal |
27
27
  | Shell command | `!command` runs and sends output to the model |
28
28
  | Hidden shell command | `!!command` runs without sending output to the model |
@@ -38,9 +38,10 @@ Type `/` in the editor to open command completion. Extensions can register custo
38
38
  |---------|-------------|
39
39
  | `/login`, `/logout` | Manage OAuth or API-key credentials |
40
40
  | [`/llama`](llama-cpp.md) | Download, load, and unload llama.cpp router models |
41
- | `/model` | Switch models |
41
+ | `/model` | Switch models; Ctrl+S in the picker saves the startup default |
42
+ | `/thinking` | Switch thinking level; Ctrl+S in the picker saves the startup default |
42
43
  | `/scoped-models` | Enable/disable models for Ctrl+P cycling |
43
- | `/settings` | Thinking level, theme, message delivery, transport |
44
+ | `/settings` | Theme, message delivery, transport, and other preferences |
44
45
  | `/resume` | Pick from previous sessions |
45
46
  | `/new` | Start a new session |
46
47
  | `/name <name>` | Set session display name |
@@ -142,7 +143,7 @@ If you use pi for open source work and want to publish sessions for model, promp
142
143
  ## CLI Reference
143
144
 
144
145
  ```bash
145
- pi [options] [@files...] [messages...]
146
+ pi [options] [--] [@files...] [messages...]
146
147
  ```
147
148
 
148
149
  ### Package Commands
@@ -213,7 +214,7 @@ cat README.md | pi -p "Summarize this text"
213
214
  | `--no-builtin-tools`, `-nbt` | Disable built-in tools but keep extension/custom tools enabled |
214
215
  | `--no-tools`, `-nt` | Disable all tools |
215
216
 
216
- Built-in tools: `read`, `bash`, `edit`, `write`, `grep`, `find`, `ls`.
217
+ Built-in tools: `read`, `bash`, `powershell` (Windows), `edit`, `write`, `grep`, `find`, `ls`.
217
218
 
218
219
  ### Resource Options
219
220
 
@@ -246,6 +247,7 @@ pi --no-extensions -e ./my-extension.ts
246
247
  | `--verbose` | Force verbose startup |
247
248
  | `-a`, `--approve` | Trust project-local files for this run |
248
249
  | `-na`, `--no-approve` | Ignore project-local files for this run |
250
+ | `--` | Stop option parsing; remaining arguments are prompts or `@file` inputs |
249
251
  | `-h`, `--help` | Show help |
250
252
  | `-v`, `--version` | Show version |
251
253
 
@@ -272,6 +274,9 @@ pi "List all .ts files in src/"
272
274
  # Non-interactive
273
275
  pi -p "Summarize this codebase"
274
276
 
277
+ # Prompt beginning with a dash
278
+ pi -p -- "- Summarize these points"
279
+
275
280
  # Non-interactive with piped stdin
276
281
  cat README.md | pi -p "Summarize this text"
277
282
 
@@ -1,6 +1,6 @@
1
1
  # Windows Setup
2
2
 
3
- Pi requires a bash shell on Windows. Checked locations (in order):
3
+ Pi uses Git Bash by default on Windows. Checked locations (in order):
4
4
 
5
5
  1. Custom path from `~/.pi/agent/settings.json`
6
6
  2. Git Bash (`C:\Program Files\Git\bin\bash.exe`)
@@ -8,7 +8,29 @@ Pi requires a bash shell on Windows. Checked locations (in order):
8
8
 
9
9
  For most users, [Git for Windows](https://git-scm.com/download/win) is sufficient.
10
10
 
11
- ## Custom Shell Path
11
+ ## PowerShell Tool
12
+
13
+ The optional `powershell` tool runs commands through `pwsh.exe` when available, otherwise Windows PowerShell. It starts PowerShell with `-NoProfile -NonInteractive -ExecutionPolicy Bypass`. Administrator-enforced execution policies can still take precedence.
14
+
15
+ Use `defaultTools` to replace the model-facing `bash` tool:
16
+
17
+ ```json
18
+ {
19
+ "defaultTools": ["read", "powershell", "edit", "write"]
20
+ }
21
+ ```
22
+
23
+ Or enable both while comparing behavior:
24
+
25
+ ```json
26
+ {
27
+ "defaultTools": ["read", "bash", "powershell", "edit", "write"]
28
+ }
29
+ ```
30
+
31
+ The `!` and `!!` editor commands still use Bash.
32
+
33
+ ## Custom Bash Path
12
34
 
13
35
  ```json
14
36
  {
@@ -92,7 +92,7 @@ export default function (pi: ExtensionAPI) {
92
92
  activeTui?.requestRender();
93
93
  });
94
94
 
95
- pi.on("agent_end", () => {
95
+ pi.on("agent_settled", () => {
96
96
  isWorking = false;
97
97
  stopSpinner();
98
98
  activeTui?.requestRender();
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider",
3
- "version": "0.84.2",
3
+ "version": "0.84.4",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-custom-provider",
9
- "version": "0.84.2",
9
+ "version": "0.84.4",
10
10
  "dependencies": {
11
11
  "@anthropic-ai/sdk": "^0.52.0"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider-anthropic",
3
3
  "private": true,
4
- "version": "0.84.2",
4
+ "version": "0.84.4",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider-gitlab-duo",
3
3
  "private": true,
4
- "version": "0.84.2",
4
+ "version": "0.84.4",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -46,8 +46,8 @@ export default function (pi: ExtensionAPI) {
46
46
  }
47
47
  });
48
48
 
49
- pi.on("agent_end", async () => {
50
- // Clear checkpoints after agent completes
49
+ pi.on("agent_settled", async () => {
50
+ // Clear checkpoints after the full agent run completes
51
51
  checkpoints.clear();
52
52
  });
53
53
  }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-gondolin",
3
- "version": "0.84.2",
3
+ "version": "0.84.4",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-gondolin",
9
- "version": "0.84.2",
9
+ "version": "0.84.4",
10
10
  "dependencies": {
11
11
  "@earendil-works/gondolin": "0.12.0"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-gondolin",
3
3
  "private": true,
4
- "version": "0.84.2",
4
+ "version": "0.84.4",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -49,7 +49,9 @@ function notify(title: string, body: string): void {
49
49
  }
50
50
 
51
51
  export default function (pi: ExtensionAPI) {
52
- pi.on("agent_end", async () => {
52
+ // `agent_end` fires after each low-level run; Pi may still retry, compact,
53
+ // or continue with queued follow-ups. Notify only after the full run settles.
54
+ pi.on("agent_settled", async () => {
53
55
  notify("Pi", "Ready for input");
54
56
  });
55
57
  }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-sandbox",
3
- "version": "1.14.2",
3
+ "version": "1.14.4",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-sandbox",
9
- "version": "1.14.2",
9
+ "version": "1.14.4",
10
10
  "dependencies": {
11
11
  "@anthropic-ai/sandbox-runtime": "^0.0.26"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-sandbox",
3
3
  "private": true,
4
- "version": "1.14.2",
4
+ "version": "1.14.4",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -62,7 +62,7 @@ This tool executes a separate `pi` subprocess with a delegated system prompt and
62
62
 
63
63
  To enable project-local agents, pass `agentScope: "both"` (or `"project"`). Only do this for repositories you trust.
64
64
 
65
- When running interactively, the tool prompts for confirmation before running project-local agents. Set `confirmProjectAgents: false` to disable.
65
+ When running interactively, the tool prompts for confirmation before running project-local agents in untrusted projects. Trusted projects skip the additional prompt. Set `confirmProjectAgents: false` to disable confirmation.
66
66
 
67
67
  ## Usage
68
68
 
@@ -517,7 +517,12 @@ export default function (pi: ExtensionAPI) {
517
517
  };
518
518
  }
519
519
 
520
- if ((agentScope === "project" || agentScope === "both") && confirmProjectAgents && ctx.hasUI) {
520
+ if (
521
+ (agentScope === "project" || agentScope === "both") &&
522
+ confirmProjectAgents &&
523
+ ctx.hasUI &&
524
+ !ctx.isProjectTrusted()
525
+ ) {
521
526
  const requestedAgentNames = new Set<string>();
522
527
  if (params.chain) for (const step of params.chain) requestedAgentNames.add(step.agent);
523
528
  if (params.tasks) for (const t of params.tasks) requestedAgentNames.add(t.agent);
@@ -48,7 +48,7 @@ export default function (pi: ExtensionAPI) {
48
48
  startAnimation(ctx);
49
49
  });
50
50
 
51
- pi.on("agent_end", async (_event, ctx) => {
51
+ pi.on("agent_settled", async (_event, ctx) => {
52
52
  stopAnimation(ctx);
53
53
  });
54
54
 
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-with-deps",
3
- "version": "0.84.2",
3
+ "version": "0.84.4",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-with-deps",
9
- "version": "0.84.2",
9
+ "version": "0.84.4",
10
10
  "dependencies": {
11
11
  "ms": "^2.1.3"
12
12
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-with-deps",
3
3
  "private": true,
4
- "version": "0.84.2",
4
+ "version": "0.84.4",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -576,7 +576,7 @@ async function main() {
576
576
  return;
577
577
  }
578
578
 
579
- if (data.type === "agent_end") {
579
+ if (data.type === "agent_settled") {
580
580
  isStreaming = false;
581
581
  hideLoading();
582
582
  outputLog.append("");
@@ -71,7 +71,7 @@ export default function (pi: ExtensionAPI) {
71
71
  });
72
72
 
73
73
  pi.on("agent_end", async (event) => {
74
- console.log(\`[Extension] Done, \${event.messages.length} messages\`);
74
+ console.log(\`[Extension] Low-level run ended, \${event.messages.length} messages\`);
75
75
  });
76
76
 
77
77
  // Register a custom tool
@@ -132,7 +132,7 @@ session.subscribe((event) => {
132
132
  case "tool_execution_end":
133
133
  console.log(`Result: ${event.result}`);
134
134
  break;
135
- case "agent_end":
135
+ case "agent_settled":
136
136
  console.log("Done");
137
137
  break;
138
138
  }