News

Release notes, project updates, and announcements from the Pi team.

Release notes

Pi 0.44.0

New version of pi. Download from npm or view release on GitHub.

Breaking Changes

  • 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)

Read more

Release notes

Pi 0.43.0

New version of pi. Download from npm or view release on GitHub.

Breaking Changes

  • 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)
  • Renamed /branch command to /fork (#641)
    • RPC: branchfork, get_branch_messagesget_fork_messages
    • SDK: branch()fork(), getBranchMessages()getForkMessages()
    • AgentSession: branch()fork(), getUserMessagesForBranching()getUserMessagesForForking()
    • Extension events: session_before_branchsession_before_fork, session_branchsession_fork
    • Settings: doubleEscapeAction: "branch" | "tree""fork" | "tree"
  • 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)

Read more

Release notes

Pi 0.42.5

New version of pi. Download from npm or view release on GitHub.

Fixed

  • 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)

Read more

Release notes

Pi 0.42.2

New version of pi. Download from npm or view release on GitHub.

Added

  • /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)

Read more

Release notes

Pi 0.39.1

New version of pi. Download from npm or view release on GitHub.

Fixed

  • setTheme() now triggers a full rerender so previously rendered components update with the new theme colors
  • mac-system-theme.ts example now polls every 2 seconds and uses osascript for real-time macOS appearance detection

Read more

Release notes

Pi 0.39.0

New version of pi. Download from npm or view release on GitHub.

Breaking Changes

  • 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)

Read more

Release notes

Pi 0.38.0

New version of pi. Download from npm or view release on GitHub.

Breaking Changes

  • 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)

Read more

Release notes

Pi 0.37.6

New version of pi. Download from npm or view release on GitHub.

Added

  • 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)

Read more

Release notes

Pi 0.37.5

New version of pi. Download from npm or view release on GitHub.

Added

  • ExtensionAPI: setModel(), getThinkingLevel(), setThinkingLevel() methods for extensions to change model and thinking level at runtime (#509)
  • Exported truncation utilities for custom tools: truncateHead, truncateTail, truncateLine, formatSize, DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, TruncationOptions, TruncationResult
  • New example truncated-tool.ts demonstrating proper output truncation with custom rendering for extensions
  • New example preset.ts demonstrating preset configurations with model/thinking/tools switching (#347)
  • Documentation for output truncation best practices in docs/extensions.md
  • Exported all UI components for extensions: ArminComponent, AssistantMessageComponent, BashExecutionComponent, BorderedLoader, BranchSummaryMessageComponent, CompactionSummaryMessageComponent, CustomEditor, CustomMessageComponent, DynamicBorder, ExtensionEditorComponent, ExtensionInputComponent, ExtensionSelectorComponent, FooterComponent, LoginDialogComponent, ModelSelectorComponent, OAuthSelectorComponent, SessionSelectorComponent, SettingsSelectorComponent, ShowImagesSelectorComponent, ThemeSelectorComponent, ThinkingSelectorComponent, ToolExecutionComponent, TreeSelectorComponent, UserMessageComponent, UserMessageSelectorComponent, plus utilities renderDiff, truncateToVisualLines
  • docs/tui.md: Common Patterns section with copy-paste code for SelectList, BorderedLoader, SettingsList, setStatus, setWidget, setFooter
  • docs/tui.md: Key Rules section documenting critical patterns for extension UI development
  • docs/extensions.md: Exhaustive example links for all ExtensionAPI methods and events
  • System prompt now references docs/tui.md for TUI component development

Read more

Release notes

Pi 0.37.4

New version of pi. Download from npm or view release on GitHub.

Added

  • Session picker (pi -r) and --session flag now support searching/resuming by session ID (UUID prefix) (#495 by @arunsathiya)
  • Extensions can now replace the startup header with ctx.ui.setHeader(), see examples/extensions/custom-header.ts (#500 by @tudoroancea)

Changed

  • Startup help text: fixed misleading "ctrl+k to delete line" to "ctrl+k to delete to end"
  • Startup help text and /hotkeys: added !! shortcut for running bash without adding output to context

Read more

Release notes

Pi 0.37.3

New version of pi. Download from npm or view release on GitHub.

Added

  • Extensions can now replace the footer with ctx.ui.setFooter(), see examples/extensions/custom-footer.ts (#481)
  • Session ID is now forwarded to LLM providers for session-based caching (used by OpenAI Codex for prompt caching).
  • Added blockImages setting to prevent images from being sent to LLM providers (#492 by @jsinge97)
  • Extensions can now send user messages via pi.sendUserMessage() (#483)

Read more

Release notes

Pi 0.37.2

New version of pi. Download from npm or view release on GitHub.

Fixed

  • Extension directories in settings.json now respect package.json manifests, matching global extension behavior (#480 by @prateekmedia)
  • Share viewer: deep links now scroll to the target message when opened via /share
  • Bash tool now handles spawn errors gracefully instead of crashing the agent (missing cwd, invalid shell path) (#479 by @robinwander)

Read more