@earendil-works/pi-coding-agent 0.84.2 → 0.84.3

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 (281) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/README.md +8 -4
  3. package/dist/bundle/chunks/anthropic-messages-JWX2WP65.js +45 -0
  4. package/dist/bundle/chunks/anthropic.js +75 -0
  5. package/dist/bundle/chunks/azure-openai-responses-5ENVCQ7U.js +2 -0
  6. package/dist/bundle/chunks/bedrock-converse-stream.js +74 -0
  7. package/dist/bundle/chunks/chunk-4L3WN2XY.js +2 -0
  8. package/dist/bundle/chunks/chunk-6CYCI3EJ.js +12 -0
  9. package/dist/bundle/chunks/chunk-6R7UI4IY.js +2 -0
  10. package/dist/bundle/chunks/chunk-AXIIZGTV.js +2 -0
  11. package/dist/bundle/chunks/chunk-DRQDKNXA.js +2 -0
  12. package/dist/bundle/chunks/chunk-E5KXRMZK.js +1547 -0
  13. package/dist/bundle/chunks/chunk-GMWCTUPB.js +2 -0
  14. package/dist/bundle/chunks/chunk-GPPBJGBU.js +50 -0
  15. package/dist/bundle/chunks/chunk-JUUC5AZY.js +2 -0
  16. package/dist/bundle/chunks/chunk-L2ZPNLYD.js +2 -0
  17. package/dist/bundle/chunks/chunk-MNAIPA3J.js +2 -0
  18. package/dist/bundle/chunks/chunk-NBBFIJUL.js +11 -0
  19. package/dist/bundle/chunks/chunk-NUHFSC37.js +25 -0
  20. package/dist/bundle/chunks/chunk-PGXDEOVV.js +2 -0
  21. package/dist/bundle/chunks/chunk-PJACZCIR.js +2 -0
  22. package/dist/bundle/chunks/chunk-PRRNXB7S.js +2 -0
  23. package/dist/bundle/chunks/chunk-TEPMHNKQ.js +2 -0
  24. package/dist/bundle/chunks/chunk-TRDNDS6A.js +4 -0
  25. package/dist/bundle/chunks/chunk-UAQELI3K.js +2 -0
  26. package/dist/bundle/chunks/chunk-XDUWOHPL.js +6 -0
  27. package/dist/bundle/chunks/chunk-XNGRGP62.js +2 -0
  28. package/dist/bundle/chunks/dist-RDWOYWHR.js +13 -0
  29. package/dist/bundle/chunks/github-copilot.js +2 -0
  30. package/dist/bundle/chunks/google-generative-ai-XDKMGBCJ.js +2 -0
  31. package/dist/bundle/chunks/google-vertex-D5FGEO3Y.js +2 -0
  32. package/dist/bundle/chunks/image-resize-worker.js +2 -0
  33. package/dist/bundle/chunks/kimi-coding.js +2 -0
  34. package/dist/bundle/chunks/lib-HGQMNYVT.js +9 -0
  35. package/dist/bundle/chunks/mistral-conversations-YK73UAOZ.js +5 -0
  36. package/dist/bundle/chunks/multipart-parser-SQ6GDJL7.js +3 -0
  37. package/dist/bundle/chunks/openai-codex-responses-GJVBJXLB.js +8 -0
  38. package/dist/bundle/chunks/openai-codex.js +75 -0
  39. package/dist/bundle/chunks/openai-completions-JD4WAC3R.js +7 -0
  40. package/dist/bundle/chunks/openai-responses-BSOJMSEV.js +2 -0
  41. package/dist/bundle/chunks/openrouter-images-N4XVVFSD.js +2 -0
  42. package/dist/bundle/chunks/openrouter.js +75 -0
  43. package/dist/bundle/chunks/pi-messages-TPFH44NP.js +8 -0
  44. package/dist/bundle/chunks/radius.js +75 -0
  45. package/dist/bundle/chunks/src-UK77SYZE.js +4 -0
  46. package/dist/bundle/chunks/xai.js +2 -0
  47. package/dist/bundle/cli.js +3 -0
  48. package/dist/bundle/client.js +2 -0
  49. package/dist/bundle/index.js +2 -0
  50. package/dist/bundle/rpc-entry.js +3 -0
  51. package/dist/cli/args.d.ts +1 -0
  52. package/dist/cli/args.d.ts.map +1 -1
  53. package/dist/cli/args.js +29 -9
  54. package/dist/cli/args.js.map +1 -1
  55. package/dist/cli/file-processor.d.ts.map +1 -1
  56. package/dist/cli/file-processor.js +2 -1
  57. package/dist/cli/file-processor.js.map +1 -1
  58. package/dist/config.d.ts +4 -3
  59. package/dist/config.d.ts.map +1 -1
  60. package/dist/config.js +22 -14
  61. package/dist/config.js.map +1 -1
  62. package/dist/core/agent-session.d.ts +26 -7
  63. package/dist/core/agent-session.d.ts.map +1 -1
  64. package/dist/core/agent-session.js +163 -95
  65. package/dist/core/agent-session.js.map +1 -1
  66. package/dist/core/auth-storage.d.ts.map +1 -1
  67. package/dist/core/auth-storage.js +6 -7
  68. package/dist/core/auth-storage.js.map +1 -1
  69. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  70. package/dist/core/compaction/branch-summarization.js +3 -0
  71. package/dist/core/compaction/branch-summarization.js.map +1 -1
  72. package/dist/core/compaction/compaction.d.ts +4 -3
  73. package/dist/core/compaction/compaction.d.ts.map +1 -1
  74. package/dist/core/compaction/compaction.js +41 -32
  75. package/dist/core/compaction/compaction.js.map +1 -1
  76. package/dist/core/defaults.d.ts +1 -0
  77. package/dist/core/defaults.d.ts.map +1 -1
  78. package/dist/core/defaults.js +9 -0
  79. package/dist/core/defaults.js.map +1 -1
  80. package/dist/core/extensions/index.d.ts +2 -2
  81. package/dist/core/extensions/index.d.ts.map +1 -1
  82. package/dist/core/extensions/index.js +1 -1
  83. package/dist/core/extensions/index.js.map +1 -1
  84. package/dist/core/extensions/loader.d.ts.map +1 -1
  85. package/dist/core/extensions/loader.js +115 -48
  86. package/dist/core/extensions/loader.js.map +1 -1
  87. package/dist/core/extensions/types.d.ts +38 -9
  88. package/dist/core/extensions/types.d.ts.map +1 -1
  89. package/dist/core/extensions/types.js +3 -0
  90. package/dist/core/extensions/types.js.map +1 -1
  91. package/dist/core/footer-data-provider.d.ts +1 -1
  92. package/dist/core/footer-data-provider.d.ts.map +1 -1
  93. package/dist/core/footer-data-provider.js +1 -1
  94. package/dist/core/footer-data-provider.js.map +1 -1
  95. package/dist/core/keybindings.d.ts +20 -19
  96. package/dist/core/keybindings.d.ts.map +1 -1
  97. package/dist/core/keybindings.js +26 -5
  98. package/dist/core/keybindings.js.map +1 -1
  99. package/dist/core/model-config.d.ts +5 -0
  100. package/dist/core/model-config.d.ts.map +1 -1
  101. package/dist/core/model-config.js +3 -1
  102. package/dist/core/model-config.js.map +1 -1
  103. package/dist/core/model-resolver.d.ts +1 -0
  104. package/dist/core/model-resolver.d.ts.map +1 -1
  105. package/dist/core/model-resolver.js +14 -8
  106. package/dist/core/model-resolver.js.map +1 -1
  107. package/dist/core/models-store.d.ts.map +1 -1
  108. package/dist/core/models-store.js +2 -1
  109. package/dist/core/models-store.js.map +1 -1
  110. package/dist/core/package-manager.d.ts.map +1 -1
  111. package/dist/core/package-manager.js +22 -14
  112. package/dist/core/package-manager.js.map +1 -1
  113. package/dist/core/pi-manifest.d.ts.map +1 -1
  114. package/dist/core/pi-manifest.js +2 -1
  115. package/dist/core/pi-manifest.js.map +1 -1
  116. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  117. package/dist/core/remote-catalog-provider.js +2 -1
  118. package/dist/core/remote-catalog-provider.js.map +1 -1
  119. package/dist/core/resource-loader.d.ts.map +1 -1
  120. package/dist/core/resource-loader.js +3 -2
  121. package/dist/core/resource-loader.js.map +1 -1
  122. package/dist/core/sdk.d.ts +2 -2
  123. package/dist/core/sdk.d.ts.map +1 -1
  124. package/dist/core/sdk.js +10 -3
  125. package/dist/core/sdk.js.map +1 -1
  126. package/dist/core/session-export.d.ts +4 -0
  127. package/dist/core/session-export.d.ts.map +1 -0
  128. package/dist/core/session-export.js +32 -0
  129. package/dist/core/session-export.js.map +1 -0
  130. package/dist/core/session-manager.d.ts.map +1 -1
  131. package/dist/core/session-manager.js +2 -1
  132. package/dist/core/session-manager.js.map +1 -1
  133. package/dist/core/settings-diagnostics.d.ts +9 -0
  134. package/dist/core/settings-diagnostics.d.ts.map +1 -0
  135. package/dist/core/settings-diagnostics.js +21 -0
  136. package/dist/core/settings-diagnostics.js.map +1 -0
  137. package/dist/core/settings-manager.d.ts +9 -0
  138. package/dist/core/settings-manager.d.ts.map +1 -1
  139. package/dist/core/settings-manager.js +52 -10
  140. package/dist/core/settings-manager.js.map +1 -1
  141. package/dist/core/skills.d.ts.map +1 -1
  142. package/dist/core/skills.js +51 -33
  143. package/dist/core/skills.js.map +1 -1
  144. package/dist/core/slash-commands.d.ts.map +1 -1
  145. package/dist/core/slash-commands.js +2 -1
  146. package/dist/core/slash-commands.js.map +1 -1
  147. package/dist/core/system-prompt.d.ts.map +1 -1
  148. package/dist/core/system-prompt.js +11 -2
  149. package/dist/core/system-prompt.js.map +1 -1
  150. package/dist/core/tools/bash.d.ts +14 -1
  151. package/dist/core/tools/bash.d.ts.map +1 -1
  152. package/dist/core/tools/bash.js +36 -20
  153. package/dist/core/tools/bash.js.map +1 -1
  154. package/dist/core/tools/edit-diff.d.ts +0 -5
  155. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  156. package/dist/core/tools/edit-diff.js +2 -5
  157. package/dist/core/tools/edit-diff.js.map +1 -1
  158. package/dist/core/tools/edit.d.ts.map +1 -1
  159. package/dist/core/tools/edit.js +20 -4
  160. package/dist/core/tools/edit.js.map +1 -1
  161. package/dist/core/tools/index.d.ts +4 -1
  162. package/dist/core/tools/index.d.ts.map +1 -1
  163. package/dist/core/tools/index.js +18 -1
  164. package/dist/core/tools/index.js.map +1 -1
  165. package/dist/core/tools/powershell.d.ts +16 -0
  166. package/dist/core/tools/powershell.d.ts.map +1 -0
  167. package/dist/core/tools/powershell.js +39 -0
  168. package/dist/core/tools/powershell.js.map +1 -0
  169. package/dist/core/trust-manager.d.ts.map +1 -1
  170. package/dist/core/trust-manager.js +2 -1
  171. package/dist/core/trust-manager.js.map +1 -1
  172. package/dist/extensions/llama/index.d.ts.map +1 -1
  173. package/dist/extensions/llama/index.js +2 -0
  174. package/dist/extensions/llama/index.js.map +1 -1
  175. package/dist/extensions/llama/provider.d.ts.map +1 -1
  176. package/dist/extensions/llama/provider.js +6 -2
  177. package/dist/extensions/llama/provider.js.map +1 -1
  178. package/dist/index.d.ts +5 -5
  179. package/dist/index.d.ts.map +1 -1
  180. package/dist/index.js +4 -4
  181. package/dist/index.js.map +1 -1
  182. package/dist/main.d.ts +4 -0
  183. package/dist/main.d.ts.map +1 -1
  184. package/dist/main.js +18 -15
  185. package/dist/main.js.map +1 -1
  186. package/dist/migrations.d.ts.map +1 -1
  187. package/dist/migrations.js +4 -3
  188. package/dist/migrations.js.map +1 -1
  189. package/dist/modes/interactive/components/model-selector.d.ts +9 -3
  190. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  191. package/dist/modes/interactive/components/model-selector.js +56 -12
  192. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  193. package/dist/modes/interactive/components/settings-selector.d.ts +7 -2
  194. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  195. package/dist/modes/interactive/components/settings-selector.js +118 -56
  196. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  197. package/dist/modes/interactive/components/settings-submenu.d.ts +72 -0
  198. package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -0
  199. package/dist/modes/interactive/components/settings-submenu.js +165 -0
  200. package/dist/modes/interactive/components/settings-submenu.js.map +1 -0
  201. package/dist/modes/interactive/components/thinking-selector.d.ts +15 -3
  202. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  203. package/dist/modes/interactive/components/thinking-selector.js +74 -17
  204. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  205. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  206. package/dist/modes/interactive/external-editor.js +2 -1
  207. package/dist/modes/interactive/external-editor.js.map +1 -1
  208. package/dist/modes/interactive/interactive-mode.d.ts +11 -0
  209. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  210. package/dist/modes/interactive/interactive-mode.js +175 -105
  211. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  212. package/dist/modes/interactive/session-share.d.ts +16 -0
  213. package/dist/modes/interactive/session-share.d.ts.map +1 -0
  214. package/dist/modes/interactive/session-share.js +188 -0
  215. package/dist/modes/interactive/session-share.js.map +1 -0
  216. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  217. package/dist/modes/interactive/theme/theme.js +4 -3
  218. package/dist/modes/interactive/theme/theme.js.map +1 -1
  219. package/dist/modes/json-event.d.ts +16 -13
  220. package/dist/modes/json-event.d.ts.map +1 -1
  221. package/dist/modes/json-event.js +20 -6
  222. package/dist/modes/json-event.js.map +1 -1
  223. package/dist/package-manager-cli.d.ts +1 -0
  224. package/dist/package-manager-cli.d.ts.map +1 -1
  225. package/dist/package-manager-cli.js +186 -2
  226. package/dist/package-manager-cli.js.map +1 -1
  227. package/dist/utils/frontmatter.d.ts.map +1 -1
  228. package/dist/utils/frontmatter.js +2 -1
  229. package/dist/utils/frontmatter.js.map +1 -1
  230. package/dist/utils/management-http.d.ts +5 -3
  231. package/dist/utils/management-http.d.ts.map +1 -1
  232. package/dist/utils/management-http.js +14 -10
  233. package/dist/utils/management-http.js.map +1 -1
  234. package/dist/utils/shell.d.ts +3 -0
  235. package/dist/utils/shell.d.ts.map +1 -1
  236. package/dist/utils/shell.js +17 -5
  237. package/dist/utils/shell.js.map +1 -1
  238. package/dist/utils/syntax-highlight.d.ts +1 -0
  239. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  240. package/dist/utils/syntax-highlight.js +60 -1
  241. package/dist/utils/syntax-highlight.js.map +1 -1
  242. package/dist/utils/text.d.ts +8 -0
  243. package/dist/utils/text.d.ts.map +1 -0
  244. package/dist/utils/text.js +9 -0
  245. package/dist/utils/text.js.map +1 -0
  246. package/docs/compaction.md +15 -0
  247. package/docs/custom-provider.md +5 -2
  248. package/docs/environment-variables.md +8 -8
  249. package/docs/extensions.md +17 -7
  250. package/docs/json.md +7 -2
  251. package/docs/keybindings.md +8 -8
  252. package/docs/llama-cpp.md +2 -0
  253. package/docs/models.md +8 -2
  254. package/docs/packages.md +2 -2
  255. package/docs/rpc.md +9 -3
  256. package/docs/sdk.md +7 -2
  257. package/docs/settings.md +11 -3
  258. package/docs/skills.md +4 -3
  259. package/docs/terminal-setup.md +11 -9
  260. package/docs/usage.md +6 -2
  261. package/docs/windows.md +24 -2
  262. package/examples/extensions/border-status-editor.ts +1 -1
  263. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  264. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  265. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  266. package/examples/extensions/git-checkpoint.ts +2 -2
  267. package/examples/extensions/gondolin/package-lock.json +2 -2
  268. package/examples/extensions/gondolin/package.json +1 -1
  269. package/examples/extensions/notify.ts +3 -1
  270. package/examples/extensions/sandbox/package-lock.json +2 -2
  271. package/examples/extensions/sandbox/package.json +1 -1
  272. package/examples/extensions/subagent/README.md +1 -1
  273. package/examples/extensions/subagent/index.ts +6 -1
  274. package/examples/extensions/titlebar-spinner.ts +1 -1
  275. package/examples/extensions/with-deps/package-lock.json +2 -2
  276. package/examples/extensions/with-deps/package.json +1 -1
  277. package/examples/rpc-extension-ui.ts +1 -1
  278. package/examples/sdk/06-extensions.ts +1 -1
  279. package/examples/sdk/README.md +1 -1
  280. package/npm-shrinkwrap.json +24 -77
  281. package/package.json +12 -14
package/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
package/docs/settings.md CHANGED
@@ -31,8 +31,8 @@ Use `/trust` in interactive mode to save a project trust decision for future ses
31
31
  | `defaultModel` | string | - | Default model ID |
32
32
  | `defaultThinkingLevel` | string | - | `"off"`, `"minimal"`, `"low"`, `"medium"`, `"high"`, `"xhigh"`, `"max"` |
33
33
  | `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 |
34
+ | `showCacheMissNotices` | boolean | `false` | Show transcript notices for significant prompt-cache misses and compaction or branch-summary usage |
35
+ | `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
36
 
37
37
  #### thinkingBudgets
38
38
 
@@ -220,7 +220,7 @@ Windows paths in JSON must use forward slashes or escaped backslashes:
220
220
  |---------|------|---------|-------------|
221
221
  | `defaultTools` | string[] | - | Built-in tools enabled initially. When omitted, Pi uses its standard defaults |
222
222
 
223
- `defaultTools` selects the built-in tools enabled at startup. Extension and SDK custom tools remain enabled:
223
+ `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`:
224
224
 
225
225
  ```json
226
226
  {
@@ -228,6 +228,14 @@ Windows paths in JSON must use forward slashes or escaped backslashes:
228
228
  }
229
229
  ```
230
230
 
231
+ On Windows, select `powershell` instead of `bash`, or include both:
232
+
233
+ ```json
234
+ {
235
+ "defaultTools": ["read", "powershell", "edit", "write"]
236
+ }
237
+ ```
238
+
231
239
  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.
232
240
 
233
241
  ### Sessions
package/docs/skills.md CHANGED
@@ -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
 
@@ -120,7 +120,15 @@ Add to `keybindings.json`:
120
120
 
121
121
  ## Windows Terminal
122
122
 
123
- Add to `settings.json` (Ctrl+Shift+, or Settings → Open JSON file) to forward the modified Enter keys pi uses:
123
+ Pi uses Windows-style keybindings when running natively on Windows or in WSL:
124
+
125
+ - `Alt+V` pastes an image or clipboard text.
126
+ - `Ctrl+F` searches the transcript in fullscreen mode, and `Ctrl+Up`/`Ctrl+Down` jump between marked messages.
127
+ - `Alt+P` cycles to the previous model.
128
+ - `Ctrl+Z` undoes editing on native Windows; WSL uses `Alt+Z` so `Ctrl+Z` can suspend pi.
129
+ - `Ctrl+Q` queues a follow-up message and `Alt+Q` restores queued messages.
130
+
131
+ Add to `settings.json` (Ctrl+Shift+, or Settings → Open JSON file) to forward `Shift+Enter` for inserting a new line:
124
132
 
125
133
  ```json
126
134
  {
@@ -128,20 +136,14 @@ Add to `settings.json` (Ctrl+Shift+, or Settings → Open JSON file) to forward
128
136
  {
129
137
  "command": { "action": "sendInput", "input": "\u001b[13;2u" },
130
138
  "keys": "shift+enter"
131
- },
132
- {
133
- "command": { "action": "sendInput", "input": "\u001b[13;3u" },
134
- "keys": "alt+enter"
135
139
  }
136
140
  ]
137
141
  }
138
142
  ```
139
143
 
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.
144
+ 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
145
 
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.
146
+ If you already have an `actions` array, add the object to it. Fully close and reopen Windows Terminal after changing its settings.
145
147
 
146
148
  ## xfce4-terminal, terminator
147
149
 
package/docs/usage.md CHANGED
@@ -142,7 +142,7 @@ If you use pi for open source work and want to publish sessions for model, promp
142
142
  ## CLI Reference
143
143
 
144
144
  ```bash
145
- pi [options] [@files...] [messages...]
145
+ pi [options] [--] [@files...] [messages...]
146
146
  ```
147
147
 
148
148
  ### Package Commands
@@ -213,7 +213,7 @@ cat README.md | pi -p "Summarize this text"
213
213
  | `--no-builtin-tools`, `-nbt` | Disable built-in tools but keep extension/custom tools enabled |
214
214
  | `--no-tools`, `-nt` | Disable all tools |
215
215
 
216
- Built-in tools: `read`, `bash`, `edit`, `write`, `grep`, `find`, `ls`.
216
+ Built-in tools: `read`, `bash`, `powershell` (Windows), `edit`, `write`, `grep`, `find`, `ls`.
217
217
 
218
218
  ### Resource Options
219
219
 
@@ -246,6 +246,7 @@ pi --no-extensions -e ./my-extension.ts
246
246
  | `--verbose` | Force verbose startup |
247
247
  | `-a`, `--approve` | Trust project-local files for this run |
248
248
  | `-na`, `--no-approve` | Ignore project-local files for this run |
249
+ | `--` | Stop option parsing; remaining arguments are prompts or `@file` inputs |
249
250
  | `-h`, `--help` | Show help |
250
251
  | `-v`, `--version` | Show version |
251
252
 
@@ -272,6 +273,9 @@ pi "List all .ts files in src/"
272
273
  # Non-interactive
273
274
  pi -p "Summarize this codebase"
274
275
 
276
+ # Prompt beginning with a dash
277
+ pi -p -- "- Summarize these points"
278
+
275
279
  # Non-interactive with piped stdin
276
280
  cat README.md | pi -p "Summarize this text"
277
281
 
package/docs/windows.md CHANGED
@@ -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.3",
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.3",
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.3",
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.3",
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.3",
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.3",
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.3",
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.3",
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.3",
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.3",
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.3",
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.3",
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.3",
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
  }
@@ -1,24 +1,23 @@
1
1
  {
2
2
  "name": "@earendil-works/pi-coding-agent",
3
- "version": "0.84.2",
3
+ "version": "0.84.3",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@earendil-works/pi-coding-agent",
9
- "version": "0.84.2",
9
+ "version": "0.84.3",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
- "@earendil-works/pi-agent-core": "^0.84.2",
13
- "@earendil-works/pi-ai": "^0.84.2",
14
- "@earendil-works/pi-client": "^0.84.2",
15
- "@earendil-works/pi-protocol": "^0.84.2",
16
- "@earendil-works/pi-tui": "^0.84.2",
12
+ "@earendil-works/pi-agent-core": "^0.84.3",
13
+ "@earendil-works/pi-ai": "^0.84.3",
14
+ "@earendil-works/pi-client": "^0.84.3",
15
+ "@earendil-works/pi-protocol": "^0.84.3",
16
+ "@earendil-works/pi-tui": "^0.84.3",
17
17
  "@silvia-odwyer/photon-node": "0.3.4",
18
18
  "chalk": "5.6.2",
19
19
  "cross-spawn": "7.0.6",
20
20
  "diff": "8.0.4",
21
- "glob": "13.0.6",
22
21
  "grok-mermaid": "0.2.2",
23
22
  "highlight.js": "10.7.3",
24
23
  "hosted-git-info": "9.0.3",
@@ -35,7 +34,7 @@
35
34
  "@mariozechner/clipboard": "0.3.9"
36
35
  },
37
36
  "bin": {
38
- "pi": "dist/cli.js"
37
+ "pi": "dist/bundle/cli.js"
39
38
  },
40
39
  "engines": {
41
40
  "node": ">=22.19.0"
@@ -477,12 +476,12 @@
477
476
  }
478
477
  },
479
478
  "node_modules/@earendil-works/pi-agent-core": {
480
- "version": "0.84.2",
481
- "resolved": "https://registry.npmjs.org/@earendil-works/pi-agent-core/-/pi-agent-core-0.84.2.tgz",
479
+ "version": "0.84.3",
480
+ "resolved": "https://registry.npmjs.org/@earendil-works/pi-agent-core/-/pi-agent-core-0.84.3.tgz",
482
481
  "license": "MIT",
483
482
  "dependencies": {
484
- "@earendil-works/pi-ai": "^0.84.2",
485
- "@earendil-works/pi-telemetry": "^0.84.2",
483
+ "@earendil-works/pi-ai": "^0.84.3",
484
+ "@earendil-works/pi-telemetry": "^0.84.3",
486
485
  "diff": "8.0.4",
487
486
  "ignore": "7.0.5",
488
487
  "typebox": "1.3.7",
@@ -493,15 +492,14 @@
493
492
  }
494
493
  },
495
494
  "node_modules/@earendil-works/pi-ai": {
496
- "version": "0.84.2",
497
- "resolved": "https://registry.npmjs.org/@earendil-works/pi-ai/-/pi-ai-0.84.2.tgz",
495
+ "version": "0.84.3",
496
+ "resolved": "https://registry.npmjs.org/@earendil-works/pi-ai/-/pi-ai-0.84.3.tgz",
498
497
  "license": "MIT",
499
498
  "dependencies": {
500
499
  "@anthropic-ai/sdk": "0.91.1",
501
500
  "@aws-sdk/client-bedrock-runtime": "3.1048.0",
502
- "@earendil-works/pi-telemetry": "^0.84.2",
501
+ "@earendil-works/pi-telemetry": "^0.84.3",
503
502
  "@google/genai": "1.52.0",
504
- "@opentelemetry/api": "1.9.0",
505
503
  "@smithy/node-http-handler": "4.7.3",
506
504
  "http-proxy-agent": "7.0.2",
507
505
  "https-proxy-agent": "7.0.6",
@@ -517,19 +515,19 @@
517
515
  }
518
516
  },
519
517
  "node_modules/@earendil-works/pi-client": {
520
- "version": "0.84.2",
521
- "resolved": "https://registry.npmjs.org/@earendil-works/pi-client/-/pi-client-0.84.2.tgz",
518
+ "version": "0.84.3",
519
+ "resolved": "https://registry.npmjs.org/@earendil-works/pi-client/-/pi-client-0.84.3.tgz",
522
520
  "license": "MIT",
523
521
  "dependencies": {
524
- "@earendil-works/pi-protocol": "^0.84.2"
522
+ "@earendil-works/pi-protocol": "^0.84.3"
525
523
  },
526
524
  "engines": {
527
525
  "node": ">=22.19.0"
528
526
  }
529
527
  },
530
528
  "node_modules/@earendil-works/pi-protocol": {
531
- "version": "0.84.2",
532
- "resolved": "https://registry.npmjs.org/@earendil-works/pi-protocol/-/pi-protocol-0.84.2.tgz",
529
+ "version": "0.84.3",
530
+ "resolved": "https://registry.npmjs.org/@earendil-works/pi-protocol/-/pi-protocol-0.84.3.tgz",
533
531
  "license": "MIT",
534
532
  "dependencies": {
535
533
  "typebox": "1.3.7"
@@ -539,16 +537,16 @@
539
537
  }
540
538
  },
541
539
  "node_modules/@earendil-works/pi-telemetry": {
542
- "version": "0.84.2",
543
- "resolved": "https://registry.npmjs.org/@earendil-works/pi-telemetry/-/pi-telemetry-0.84.2.tgz",
540
+ "version": "0.84.3",
541
+ "resolved": "https://registry.npmjs.org/@earendil-works/pi-telemetry/-/pi-telemetry-0.84.3.tgz",
544
542
  "license": "MIT",
545
543
  "engines": {
546
544
  "node": ">=22.19.0"
547
545
  }
548
546
  },
549
547
  "node_modules/@earendil-works/pi-tui": {
550
- "version": "0.84.2",
551
- "resolved": "https://registry.npmjs.org/@earendil-works/pi-tui/-/pi-tui-0.84.2.tgz",
548
+ "version": "0.84.3",
549
+ "resolved": "https://registry.npmjs.org/@earendil-works/pi-tui/-/pi-tui-0.84.3.tgz",
552
550
  "license": "MIT",
553
551
  "dependencies": {
554
552
  "get-east-asian-width": "1.6.0",
@@ -773,15 +771,6 @@
773
771
  }
774
772
  ]
775
773
  },
776
- "node_modules/@opentelemetry/api": {
777
- "version": "1.9.0",
778
- "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz",
779
- "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==",
780
- "license": "Apache-2.0",
781
- "engines": {
782
- "node": ">=8.0.0"
783
- }
784
- },
785
774
  "node_modules/@protobufjs/aspromise": {
786
775
  "version": "1.1.2",
787
776
  "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
@@ -1233,23 +1222,6 @@
1233
1222
  "url": "https://github.com/sponsors/sindresorhus"
1234
1223
  }
1235
1224
  },
1236
- "node_modules/glob": {
1237
- "version": "13.0.6",
1238
- "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz",
1239
- "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==",
1240
- "license": "BlueOak-1.0.0",
1241
- "dependencies": {
1242
- "minimatch": "^10.2.2",
1243
- "minipass": "^7.1.3",
1244
- "path-scurry": "^2.0.2"
1245
- },
1246
- "engines": {
1247
- "node": "18 || 20 || >=22"
1248
- },
1249
- "funding": {
1250
- "url": "https://github.com/sponsors/isaacs"
1251
- }
1252
- },
1253
1225
  "node_modules/google-auth-library": {
1254
1226
  "version": "10.6.2",
1255
1227
  "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.6.2.tgz",
@@ -1447,15 +1419,6 @@
1447
1419
  "url": "https://github.com/sponsors/isaacs"
1448
1420
  }
1449
1421
  },
1450
- "node_modules/minipass": {
1451
- "version": "7.1.3",
1452
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
1453
- "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
1454
- "license": "BlueOak-1.0.0",
1455
- "engines": {
1456
- "node": ">=16 || 14 >=14.17"
1457
- }
1458
- },
1459
1422
  "node_modules/ms": {
1460
1423
  "version": "2.1.3",
1461
1424
  "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -1567,22 +1530,6 @@
1567
1530
  "node": ">=8"
1568
1531
  }
1569
1532
  },
1570
- "node_modules/path-scurry": {
1571
- "version": "2.0.2",
1572
- "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz",
1573
- "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==",
1574
- "license": "BlueOak-1.0.0",
1575
- "dependencies": {
1576
- "lru-cache": "^11.0.0",
1577
- "minipass": "^7.1.2"
1578
- },
1579
- "engines": {
1580
- "node": "18 || 20 || >=22"
1581
- },
1582
- "funding": {
1583
- "url": "https://github.com/sponsors/isaacs"
1584
- }
1585
- },
1586
1533
  "node_modules/proper-lockfile": {
1587
1534
  "version": "4.1.2",
1588
1535
  "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz",