Skip to content

Releases: badlogic/pi-mono

v0.50.1

26 Jan 23:17

Choose a tag to compare

Fixed

  • Git extension updates now handle force-pushed remotes gracefully instead of failing (#961 by @aliou)
  • Extension ctx.newSession({ setup }) now properly syncs agent state and renders messages after setup callback runs (#968)
  • Fixed extension UI bindings not initializing when starting with no extensions, which broke UI methods after /reload
  • Fixed /hotkeys output to title-case extension hotkeys (#969 by @Perlence)
  • Fixed model catalog generation to exclude deprecated OpenCode Zen models (#970 by @DanielTatarkin)
  • Fixed git extension removal to prune empty directories

v0.50.0

26 Jan 15:56

Choose a tag to compare

New Features

Read the fully revamped docs in README.md, or have your clanker read them for you.

SDK Migration Guide

There are multiple SDK breaking changes since v0.49.3. For the quickest migration, point your agent at packages/coding-agent/docs/sdk.md, the SDK examples in packages/coding-agent/examples/sdk, and the SDK source in packages/coding-agent/src/core/sdk.ts and related modules.

Breaking Changes

  • Header values in models.json now resolve environment variables (if a header value matches an env var name, the env var value is used). This may change behavior if a literal header value accidentally matches an env var name. (#909)
  • External packages (npm/git) are now configured via packages array in settings.json instead of extensions. Existing npm:/git: entries in extensions are auto-migrated. (#645)
  • Resource loading now uses ResourceLoader only and settings.json uses arrays for extensions, skills, prompts, and themes (#645)
  • Removed discoverAuthStorage and discoverModels from the SDK. AuthStorage and ModelRegistry now default to ~/.pi/agent paths unless you pass an agentDir (#645)

Added

  • Session renaming in /resume picker via Ctrl+R without opening the session (#863 by @svkozak)
  • Session selector keybindings are now configurable (#948 by @aos)
  • disable-model-invocation frontmatter field for skills to prevent agentic invocation while still allowing explicit /skill:name commands (#927)
  • Exposed copyToClipboard utility for extensions (#926 by @mitsuhiko)
  • Skill invocation messages are now collapsible in chat output, showing collapsed by default with skill name and expand hint (#894)
  • Header values in models.json now support environment variables and shell commands, matching apiKey resolution (#909)
  • Added HTTP proxy environment variable support for API requests (#942 by @haoqixu)
  • Added OpenRouter provider routing support for custom models via openRouterRouting compat field (#859 by @v01dpr1mr0s3)
  • Added azure-openai-responses provider support for Azure OpenAI Responses API. (#890 by @markusylisiurunen)
  • Added changelog link to update notifications (#925 by @dannote)
  • Added --verbose CLI flag to override quietStartup setting (#906 by @Perlence)
  • markdown.codeBlockIndent setting to customize code block indentation in rendered output
  • Extension package management with pi install, pi remove, pi update, and pi list commands (#645)
  • Package filtering: selectively load resources from packages using object form in packages array (#645)
  • Glob pattern support with minimatch in package filters, top-level settings arrays, and pi manifest (e.g., "!funky.json", "*.ts") (#645)
  • /reload command to reload extensions, skills, prompts, and themes (#645)
  • pi config command with TUI to enable/disable package and top-level resources via patterns (#938)
  • CLI flags for --skill, --prompt-template, --theme, --no-prompt-templates, and --no-themes (#645)
  • Package deduplication: if same package appears in global and project settings, project wins (#645)
  • Unified collision reporting with ResourceDiagnostic type for all resource types (#645)
  • Show provider alongside the model in the footer if multiple providers are available
  • Custom provider support via pi.registerProvider() with streamSimple for custom API implementations
  • Added custom-provider.ts example extension demonstrating custom Anthropic provider with OAuth

Changed

  • /resume picker sort toggle moved to Ctrl+S to free Ctrl+R for rename (#863 by @svkozak)
  • HTML export: clicking a sidebar message now navigates to its newest leaf and scrolls to it, instead of truncating the branch (#853 by @mitsuhiko)
  • HTML export: active path is now visually highlighted with dimmed off-path nodes (#929 by @hewliyang)
  • Azure OpenAI Responses provider now uses base URL configuration with deployment-aware model mapping and no longer includes service tier handling
  • /reload now re-renders the entire scrollback so updated extension components are visible immediately (#928 by @ferologics)
  • Skill, prompt template, and theme discovery now use settings and CLI path arrays instead of legacy filters (#645)

Fixed

  • Extension setWorkingMessage() calls in agent_start handlers now work correctly; previously the message was silently ignored because the loading animation didn't exist yet (#935)
  • Fixed package auto-discovery to respect loader rules, config overrides, and force-exclude patterns
  • Fixed /reload restoring the correct editor after reload (#949 by @Perlence)
  • Fixed distributed themes breaking /export (#946 by @mitsuhiko)
  • Fixed startup hints to clarify thinking level selection and expanded thinking guidance
  • Fixed SDK initial model resolution to use findInitialModel and default to Claude Opus 4.5 for Anthropic models
  • Fixed no-models warning to include the /model instruction
  • Fixed authentication error messages to point to the authentication documentation
  • Fixed bash output hint lines to truncate to terminal width
  • Fixed custom editors to honor the paddingX setting (#936 by @Perlence)
  • Fixed system prompt tool list to show only built-in tools
  • Fixed package manager to check npm package versions before using cached copies
  • Fixed package manager to run npm install after cloning git repositories with a package.json
  • Fixed extension provider registrations to apply before model resolution
  • Fixed editor multi-line insertion handling and lastAction tracking (#945 by @Perlence)
  • Fixed editor word wrapping to reserve a cursor column (#934 by @Perlence)
  • Fixed editor word wrapping to use single-pass backtracking for whitespace handling (#924 by @Perlence)
  • Fixed Kitty image ID allocation and cleanup to prevent image ID collisions
  • Fixed overlays staying centered after terminal resizes (#950 by @nicobailon)
  • Fixed streaming dispatch to use the model api type instead of hardcoded API defaults
  • Fixed Google providers to default tool call arguments to an empty object when omitted
  • Fixed OpenAI Responses streaming to handle arguments.done events on OpenAI-compatible ...
Read more

v0.49.3

22 Jan 00:44

Choose a tag to compare

Added

  • markdown.codeBlockIndent setting to customize code block indentation in rendered output (#855 by @terrorobe)
  • Added inline-bash.ts example extension for expanding !{command} patterns in prompts (#881 by @scutifer)
  • Added antigravity-image-gen.ts example extension for AI image generation via Google Antigravity (#893 by @benvargas)
  • Added PI_SHARE_VIEWER_URL environment variable for custom share viewer URLs (#889 by @andresaraujo)
  • Added Alt+Delete as hotkey for delete word forwards (#878 by @Perlence)

Changed

  • Tree selector: changed label filter shortcut from l to Shift+L so users can search for entries containing "l" (#861 by @mitsuhiko)
  • Fuzzy matching now scores consecutive matches higher for better search relevance (#860 by @mitsuhiko)

Fixed

  • Fixed error messages showing hardcoded ~/.pi/agent/ paths instead of respecting PI_CODING_AGENT_DIR (#887 by @aliou)
  • Fixed write tool not displaying errors in the UI when execution fails (#856)
  • Fixed HTML export using default theme instead of user's active theme (#870 by @scutifer)
  • Show session name in the footer and terminal / tab title (#876 by @scutifer)
  • Fixed 256color fallback in Terminal.app to prevent color rendering issues (#869 by @Perlence)
  • Fixed viewport tracking and cursor positioning for overlays and content shrink scenarios
  • Fixed autocomplete to allow searches with / characters (e.g., folder1/folder2) (#882 by @richardgill)
  • Fixed autolinked emails displaying redundant (mailto:...) suffix (#888 by @terrorobe)
  • Fixed @ file autocomplete adding space after directories, breaking continued autocomplete into subdirectories

v0.49.2

19 Jan 15:16

Choose a tag to compare

Added

  • Added widget placement option for extension widgets via widgetPlacement in pi.addWidget() (#850 by @marckrenn)
  • Added AWS credential detection for ECS/Kubernetes environments: AWS_CONTAINER_CREDENTIALS_RELATIVE_URI, AWS_CONTAINER_CREDENTIALS_FULL_URI, AWS_WEB_IDENTITY_TOKEN_FILE (#848)
  • Add "quiet startup" setting to /settings (#847 by @unexge)

Changed

  • HTML export now includes JSONL download button, jump-to-last-message on click, and fixed missing labels (#853 by @mitsuhiko)
  • Improved error message for OAuth authentication failures (expired credentials, offline) instead of generic 'No API key found' (#849 by @zedrdave)

Fixed

  • Fixed /model selector scope toggle so you can switch between all and scoped models when scoped models are saved (#844)
  • Fixed OpenAI Responses 400 error "reasoning without following item" when replaying aborted turns (#838)
  • Fixed pi exiting with code 0 when cancelling resume session selection

Removed

  • Removed strictResponsesPairing compat option from models.json schema (no longer needed)

v0.49.1

18 Jan 23:25

Choose a tag to compare

Added

  • Added strictResponsesPairing compat option for custom OpenAI Responses models on Azure (#768 by @nicobako)
  • 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)

Fixed

  • Fixed IME candidate window appearing in wrong position when filtering menus with Input Method Editor (e.g., Chinese IME). Components with search inputs now properly propagate focus state for cursor positioning. (#827)
  • Fixed extension shortcut conflicts to respect user keybindings when built-in actions are remapped. (#826 by @richardgill)
  • Fixed photon WASM loading in standalone compiled binaries.
  • Fixed tool call ID normalization for cross-provider handoffs (e.g., Codex to Antigravity Claude) (#821)

v0.49.0

17 Jan 21:04

Choose a tag to compare

Added

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

Fixed

  • Fixed photon module failing to load in ESM context with "require is not defined" error (#795 by @dannote)
  • Fixed compaction UI not showing when extensions trigger compaction.
  • Fixed orphaned tool results after errored assistant messages causing Codex API errors. When an assistant message has stopReason: "error", its tool calls are now excluded from pending tool tracking, preventing synthetic tool results from being generated for calls that will be dropped by provider-specific converters. (#812)
  • Fixed Bedrock Claude max_tokens handling to always exceed thinking budget tokens, preventing compaction failures. (#797 by @pjtf93)
  • Fixed Claude Code tool name normalization to match the Claude Code tool list case-insensitively and remove invalid mappings.

Removed

  • Removed pi-internal:// path resolution from the read tool.

v0.48.0

16 Jan 23:34

Choose a tag to compare

Added

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

Fixed

  • Fixed crash during auto-compaction when summarization fails (e.g., quota exceeded). Now displays error message instead of crashing (#792)
  • Fixed --session <UUID> to search globally across projects if not found locally, with option to fork sessions from other projects (#785 by @ribelo)
  • Fixed standalone binary WASM loading on Linux (#784)
  • Fixed string numbers in tool arguments not being coerced to numbers during validation (#786 by @dannote)
  • Fixed --no-extensions flag not preventing extension discovery (#776)
  • Fixed extension messages rendering twice on startup when pi.sendMessage({ display: true }) is called during session_start (#765 by @dannote)
  • Fixed PI_CODING_AGENT_DIR env var not expanding tilde (~) to home directory (#778 by @aliou)
  • Fixed session picker hint text overflow (#764)
  • Fixed Kitty keyboard protocol shifted symbol keys (e.g., @, ?) not working in editor (#779 by @iamd3vil)
  • Fixed Bedrock tool call IDs causing API errors from invalid characters (#781 by @pjtf93)

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

v0.47.0

16 Jan 03:43

Choose a tag to compare

Breaking Changes

  • 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)
  • Extension example: input-transform.ts demonstrating input interception patterns (quick mode, instant commands, source routing) (#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.

Fixed

  • Editor no longer corrupts terminal display when loading large prompts via setEditorText. Content now scrolls vertically with indicators showing lines above/below the viewport. (#732)
  • Piped stdin now works correctly: echo foo | pi is equivalent to pi -p foo. When stdin is piped, print mode is automatically enabled since interactive mode requires a TTY (#708)
  • Session tree now preserves branch connectors and indentation when filters hide intermediate entries so descendants attach to the nearest visible ancestor and sibling branches align. Fixed in both TUI and HTML export (#739 by @w-winter)
  • Added upstream connect, connection refused, and reset before headers patterns to auto-retry error detection (#733)
  • Multi-line YAML frontmatter in skills and prompt templates now parses correctly. Centralized frontmatter parsing using the yaml library. (#728 by @richardgill)
  • ctx.shutdown() now waits for pending UI renders to complete before exiting, ensuring notifications and final output are visible (#756)
  • OpenAI Codex provider now retries on transient errors (429, 5xx, connection failures) with exponential backoff (#733)

v0.46.0

15 Jan 16:38

Choose a tag to compare

Fixed

  • Scoped models (--models or enabledModels) now remember the last selected model across sessions instead of always starting with the first model in the scope (#736 by @ogulcancelik)
  • Show bun install instead of npm install in update notification when running under Bun (#714 by @dannote)
  • /skill prompts now include the skill path (#711 by @jblwilliams)
  • Use configurable expandTools keybinding instead of hardcoded Ctrl+O (#717 by @dannote)
  • Compaction turn prefix summaries now merge correctly (#738 by @vsabavat)
  • Avoid unsigned Gemini 3 tool calls (#741 by @roshanasingh4)
  • Fixed signature support for non-Anthropic models in Amazon Bedrock provider (#727 by @unexge)
  • Keyboard shortcuts (Ctrl+C, Ctrl+D, etc.) now work on non-Latin keyboard layouts (Russian, Ukrainian, Bulgarian, etc.) in terminals supporting Kitty keyboard protocol with alternate key reporting (#718 by @dannote)

Added

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

v0.45.7

13 Jan 23:12

Choose a tag to compare

Added

  • Exported highlightCode and getLanguageFromPath for extensions (#703 by @dannote)