Extensions now load correctly in compiled Bun binary using @mariozechner/jiti fork with virtualModules support. Bundled packages (@sinclair/typebox, @mariozechner/pi-tui, @mariozechner/pi-ai, @mariozechner/pi-coding-agent) are accessible to extensions without filesystem node_modules.
MiniMax provider support: set MINIMAX_API_KEY and use minimax/MiniMax-M2.1 (#656 by @dannote)
/scoped-models: Alt+Up/Down to reorder enabled models. Order is preserved when saving with Ctrl+S and determines Ctrl+P cycling order. (#676 by @thomasmhr)
Amazon Bedrock provider support (experimental, tested with Anthropic Claude models only) (#494 by @unexge)
Extension example: sandbox/ for OS-level bash sandboxing using @anthropic-ai/sandbox-runtime with per-project config (#673 by @dannote)
Print mode JSON output now emits the session header as the first line.
pi.getAllTools() now returns ToolInfo[] (with name and description) instead of string[]. Extensions that only need names can use .map(t => t.name). (#648 by @carsonfarmer)
Added
Session naming: /name <name> command sets a display name shown in the session selector instead of the first message. Useful for distinguishing forked sessions. Extensions can use pi.setSessionName() and pi.getSessionName(). (#650 by @scutifer)
Extension example: notify.ts for desktop notifications via OSC 777 escape sequence (#658 by @ferologics)
Inline hint for queued messages showing the Alt+Up restore shortcut (#657 by @tmustier)
Page-up/down navigation in /resume session selector to jump by 5 items (#662 by @aliou)
Fuzzy search in /settings menu: type to filter settings by label (#643 by @ninlds)
Extension editor (ctx.ui.editor()) now uses Enter to submit and Shift+Enter for newlines, matching the main editor. Previously used Ctrl+Enter to submit. Extensions with hardcoded "ctrl+enter" hints need updating. (#642 by @mitsuhiko)
SessionManager.list() and SessionManager.listAll() are now async, returning Promise<SessionInfo[]>. Callers must await them. (#620 by @tmustier)
Added
/resume selector now toggles between current-folder and all sessions with Tab, showing the session cwd in the All view and loading progress. (#620 by @tmustier)
SessionManager.list() and SessionManager.listAll() accept optional onProgress callback for progress updates
SessionInfo.cwd field containing the session's working directory (empty string for old sessions)
SessionListProgress type export for progress callbacks
/scoped-models command to enable/disable models for Ctrl+P cycling. Changes are session-only by default; press Ctrl+S to persist to settings.json. (#626 by @CarlosGtrz)
model_select extension hook fires when model changes via /model, model cycling, or session restore with source field and previousModel (#628 by @marckrenn)
ctx.ui.setWorkingMessage() extension API to customize the "Working..." message during streaming (#625 by @nicobailon)
Skill slash commands: loaded skills are registered as /skill:name commands for quick access. Toggle via /settings or skills.enableSkillCommands in settings.json. (#630 by @Dwsy)
Slash command autocomplete now uses fuzzy matching (type /skbra to match /skill:brave-search)
/tree branch summarization now offers three options: "No summary", "Summarize", and "Summarize with custom prompt". Custom prompts are appended as additional focus to the default summarization instructions. (#642 by @mitsuhiko)
Reduced flicker by only re-rendering changed lines (#617 by @ogulcancelik). No worries tho, there's still a little flicker in the VS Code Terminal. Praise the flicker.
Cursor position tracking when content shrinks with unchanged remaining lines
TUI renders with wrong dimensions after suspend/resume if terminal was resized while suspended (#599)
Pasted content containing Kitty key release patterns (e.g., :3F in MAC addresses) was incorrectly filtered out (#623 by @ogulcancelik)
/model <search> now pre-filters the model selector or auto-selects on exact match. Use provider/model syntax to disambiguate (e.g., /model openai/gpt-4). (#587 by @zedrdave)
FooterDataProvider for custom footers: ctx.ui.setFooter() now receives a third footerData parameter providing getGitBranch(), getExtensionStatuses(), and onBranchChange() for reactive updates (#600 by @nicobailon)
Alt+Up hotkey to restore queued steering/follow-up messages back into the editor without aborting the current run (#604 by @tmustier)
before_agent_start event now receives systemPrompt in the event object and returns systemPrompt (full replacement) instead of systemPromptAppend. Extensions that were appending must now use event.systemPrompt + extra pattern. (#575)
discoverSkills() now returns { skills: Skill[], warnings: SkillWarning[] } instead of Skill[]. This allows callers to handle skill loading warnings. (#577 by @cv)
Added
ctx.ui.getAllThemes(), ctx.ui.getTheme(name), and ctx.ui.setTheme(name | Theme) methods for extensions to list, load, and switch themes at runtime (#576)
--no-tools flag to disable all built-in tools, allowing extension-only tool setups (#557 by @cv)
Pluggable operations for built-in tools enabling remote execution via SSH or other transports (#564). Interfaces: ReadOperations, WriteOperations, EditOperations, BashOperations, LsOperations, GrepOperations, FindOperations
user_bash event for intercepting user !/!! commands, allowing extensions to redirect to remote systems (#528)
setActiveTools() in ExtensionAPI for dynamic tool management
Built-in renderers used automatically for tool overrides without custom renderCall/renderResult
ssh.ts example: remote tool execution via --ssh user@host:/path
interactive-shell.ts example: run interactive commands (vim, git rebase, htop) with full terminal access via !i prefix or auto-detection
Wayland clipboard support for /copy command using wl-copy with xclip/xsel fallback (#570 by @OgulcanCelik)
Experimental:ctx.ui.custom() now accepts { overlay: true } option for floating modal components that composite over existing content without clearing the screen (#558 by @nicobailon)
AgentSession.skills and AgentSession.skillWarnings properties to access loaded skills without rediscovery (#577 by @cv)
ctx.ui.custom() factory signature changed from (tui, theme, done) to (tui, theme, keybindings, done) for keybinding access in custom components
LoadedExtension type renamed to Extension
LoadExtensionsResult.setUIContext() removed, replaced with runtime: ExtensionRuntime
ExtensionRunner constructor now requires runtime: ExtensionRuntime as second parameter
ExtensionRunner.initialize() signature changed from options object to positional params (actions, contextActions, commandContextActions?, uiContext?)
ExtensionRunner.getHasUI() renamed to hasUI()
OpenAI Codex model aliases removed (gpt-5, gpt-5-mini, gpt-5-nano, codex-mini-latest). Use canonical IDs: gpt-5.1, gpt-5.1-codex-mini, gpt-5.2, gpt-5.2-codex. (#536 by @ghoulr)
Added
--no-extensions flag to disable extension discovery while still allowing explicit -e paths (#524 by @cv)
SDK: InteractiveMode, runPrintMode(), runRpcMode() exported for building custom run modes. See docs/sdk.md.
PI_SKIP_VERSION_CHECK environment variable to disable new version notifications at startup (#549 by @aos)
thinkingBudgets setting to customize token budgets per thinking level for token-based providers (#529 by @melihmucuk)
Extension UI dialogs (ctx.ui.select(), ctx.ui.confirm(), ctx.ui.input()) now support a timeout option with live countdown display (#522 by @nicobailon)
Extensions can now provide custom editor components via ctx.ui.setEditorComponent(). See examples/extensions/modal-editor.ts and docs/tui.md Pattern 7.
Extension factories can now be async, enabling dynamic imports and lazy-loaded dependencies (#513 by @austinm911)
ctx.shutdown() is now available in extension contexts for requesting a graceful shutdown. In interactive mode, shutdown is deferred until the agent becomes idle (after processing all queued steering and follow-up messages). In RPC mode, shutdown is deferred until after completing the current command response. In print mode, shutdown is a no-op as the process exits automatically when prompts complete. (#542 by @kaofelix)
Extension UI dialogs (ctx.ui.select(), ctx.ui.confirm(), ctx.ui.input()) now accept an optional AbortSignal to programmatically dismiss dialogs. Useful for implementing timeouts. See examples/extensions/timed-confirm.ts. (#474)
HTML export now shows bridge prompts in model change messages for Codex sessions (#510 by @mitsuhiko)