Added strictResponsesPairing compat option for custom OpenAI Responses models on Azure (#768 by @prateekmedia)
Session selector (/resume) now supports path display toggle (Ctrl+P) and session deletion (Ctrl+D) with inline confirmation (#816 by @w-winter)
Added undo support in interactive mode with Ctrl+- hotkey. (#831 by @Perlence)
Changed
Share URLs now use hash fragments (#) instead of query strings (?) to prevent session IDs from being sent to buildwithpi.ai (#829 by @terrorobe)
API keys in models.json can now be retrieved via shell command using ! prefix (e.g., "apiKey": "!security find-generic-password -ws 'anthropic'" for macOS Keychain) (#762 by @cv)
pi.setLabel(entryId, label) in ExtensionAPI for setting per-entry labels from extensions (#806)
Export keyHint, appKeyHint, editorKey, appKey, rawKeyHint for extensions to format keybinding hints consistently (#802 by @dannote)
Exported VERSION from the package index and updated the custom-header example. (#798 by @tallshort)
Added showHardwareCursor setting to control cursor visibility while still positioning it for IME support. (#800 by @ghoulr)
Added Emacs-style kill ring editing with yank and yank-pop keybindings, plus legacy Alt+letter handling and Alt+D delete word forward support in the interactive editor. (#810 by @Perlence)
Added ctx.compact() and ctx.getContextUsage() to extension contexts for programmatic compaction and context usage checks.
Added documentation for delete word forward and kill ring keybindings in interactive mode. (#810 by @Perlence)
Changed
Updated the default system prompt wording to clarify the pi harness and documentation scope.
Simplified Codex system prompt handling to use the default system prompt directly for Codex instructions.
Removed
Removed pi-internal:// path resolution from the read tool.
Added quietStartup setting to silence startup output (version header, loaded context info, model scope line). Changelog notifications are still shown. (#777 by @ribelo)
Added editorPaddingX setting for horizontal padding in input editor (0-3, default: 0)
Added shellCommandPrefix setting to prepend commands to every bash execution, enabling alias expansion in non-interactive shells (e.g., "shellCommandPrefix": "shopt -s expand_aliases") (#790 by @richardgill)
Added bash-style argument slicing for prompt templates (#770 by @airtonix)
Extension commands can provide argument auto-completions via getArgumentCompletions in pi.registerCommand() (#775 by @ribelo)
Bash tool now displays the timeout value in the UI when a timeout is set (#780 by @dannote)
Export getShellConfig for extensions to detect user's shell environment (#766 by @dannote)
Added thinkingText and selectedBg to theme schema (#763 by @scutifer)
navigateTree() now supports replaceInstructions option to replace the default summarization prompt entirely, and label option to attach a label to the branch summary entry (#787 by @mitsuhiko)
Changed
Hardware cursor is now disabled by default for better terminal compatibility. Set PI_HARDWARE_CURSOR=1 to enable (replaces PI_NO_HARDWARE_CURSOR=1 which disabled it).
Extensions using Editor directly must now pass TUI as the first constructor argument: new Editor(tui, theme). The tui parameter is available in extension factory functions. (#732)
Added
OpenAI Codex official support: Full compatibility with OpenAI's Codex CLI models (gpt-5.1, gpt-5.2, gpt-5.1-codex-mini, gpt-5.2-codex). Features include static system prompt for OpenAI allowlisting, prompt caching via session ID, and reasoning signature retention across turns. Set OPENAI_API_KEY and use --provider openai-codex or select a Codex model. (#737)
pi-internal:// URL scheme in read tool for accessing internal documentation. The model can read files from the coding-agent package (README, docs, examples) to learn about extending pi.
New input event in extension system for intercepting, transforming, or handling user input before the agent processes it. Supports three result types: continue (pass through), transform (modify text/images), handled (respond without LLM). Handlers chain transforms and short-circuit on handled. (#761 by @nicobailon)
Custom tool HTML export: extensions with renderCall/renderResult now render in /share and /export output with ANSI-to-HTML color conversion (#702 by @aliou)
Direct filter shortcuts in Tree mode: Ctrl+D (default), Ctrl+T (no-tools), Ctrl+U (user-only), Ctrl+L (labeled-only), Ctrl+A (all) (#747 by @kaofelix)
Changed
Skill commands (/skill:name) are now expanded in AgentSession instead of interactive mode. This enables skill commands in RPC and print modes, and allows the input event to intercept /skill:name before expansion.
Edit tool now uses fuzzy matching as fallback when exact match fails, tolerating trailing whitespace, smart quotes, Unicode dashes, and special spaces (#713 by @dannote)
Support APPEND_SYSTEM.md to append instructions to the system prompt (#716 by @tallshort)
Session picker search: Ctrl+R toggles sorting between fuzzy match (default) and most recent; supports quoted phrase matching and re: regex mode (#731 by @ogulcancelik)
Export getAgentDir for extensions (#749 by @dannote)
Show loaded prompt templates on startup (#743 by @tallshort)
MiniMax China (minimax-cn) provider support (#725 by @tallshort)
gpt-5.2-codex models for GitHub Copilot and OpenCode Zen providers (#734 by @aadishv)
Changed
Replaced wasm-vips with @silvia-odwyer/photon-node for image processing (#710 by @can1357)
Extension example: plan-mode/ shortcut changed from Shift+P to Ctrl+Alt+P to avoid conflict with typing capital P (#746 by @ferologics)
UI keybinding hints now respect configured keybindings across components (#724 by @dannote)
CLI process title is now set to pi for easier process identification (#742 by @richardgill)
ctx.ui.custom() now accepts overlayOptions for overlay positioning and sizing (anchor, margins, offsets, percentages, absolute positioning) (#667 by @nicobailon)
ctx.ui.custom() now accepts onHandle callback to receive the OverlayHandle for controlling overlay visibility (#667 by @nicobailon)
Extension example: overlay-qa-tests.ts with 10 commands for testing overlay positioning, animation, and toggle scenarios (#667 by @nicobailon)
Extension example: doom-overlay/ - DOOM game running as an overlay at 35 FPS (auto-downloads WAD on first run) (#667 by @nicobailon)
Light theme colors adjusted for WCAG AA compliance (4.5:1 contrast ratio against white backgrounds)
Replaced sharp with wasm-vips for image processing (resize, PNG conversion). Eliminates native build requirements that caused installation failures on some systems. (#696)
Added
Extension example: summarize.ts for summarizing conversations using custom UI and an external model (#684 by @scutifer)
Extension example: question.ts enhanced with custom UI for asking user questions (#693 by @ferologics)
Extension example: plan-mode/ enhanced with explicit step tracking and progress widget (#694 by @ferologics)
Extension example: questionnaire.ts for multi-question input with tab bar navigation (#695 by @ferologics)
Experimental Vercel AI Gateway provider support: set AI_GATEWAY_API_KEY and use --provider vercel-ai-gateway. Token usage is currently reported incorrectly by Anthropic Messages compatible endpoint. (#689 by @timolins)
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)