New Features
- Fullscreen by default — The TUI now runs fullscreen. Set
tuiModeto"regular"to keep the terminal's normal scrollback. See Terminal and display. - Leaner codemode — About 40% fewer prompt tokens, and errors that tell the model how to recover. See Codemode.
- Image generation in codemode — Scripts call
models.generateImages()with the session's credentials. See Generate images and Use image models. - Radius in
/login— Sign in with Radius and set up its MCP server in one step. See Radius. - Anthropic copy code login — Sign in when the browser runs on another machine. See Authenticate interactively.
- MCP OAuth hardening —
oauth.authServerMetadataUrl, RFC 9207isschecks, credentials per server, and step-up sign-in that keeps granted scopes. See Authenticate with OAuth. - Header-only quiet startup —
quietStartup: "header"keeps the version and key hints and hides the rest. See Terminal and display.
Added
- Added an
oauth.authServerMetadataUrlsetting for MCP servers that advertise a wrong OAuth authorization server or none. Pi uses the configured metadata document instead of discovery (#10172). - Added
quietStartup: "header", which keeps the startup header with version and key hints but hides the model scope line and loaded-resource listing. - Added
models.generateImages()to codemode scripts. It runs image models such as OpenRouter's with the session's credentials and returns base64 image blocks thatimage()attaches to the result; usage counts toward the session cost likemodels.classify(). Extensions can callctx.modelRegistry.generateImages(). See Use image models. - Added a copy code login method to Anthropic
/loginfor headless setups where the browser runs on another machine (#10194 by @lucasmeijer).
Changed
- Changed the default TUI mode to fullscreen. Set
tuiModeto"regular"or pass--tui-mode regularto keep the terminal's normal scrollback. /loginnow offers "Sign in with Radius" at the top level, as the last option, with its status. After a Radius sign-in,/loginoffers to configure the Radius MCP server in the globalmcp.jsonwith"auth": { "provider": "radius" }and reloads. Cancelling a login returns to the menu it was started from.- The provider docs page is renamed to Providers, its "Cloud Providers" section is now "Provider Specific Config", and it documents Radius first.
- MCP OAuth credentials are now stored per server name and URL, so MCP servers with the same URL can sign in with different accounts. Credentials stored by URL alone move to the first server that uses them (#10252).
- Codemode costs far fewer prompt tokens: with the default tools and codemode active, a GPT-5.6 request shrinks from about 5,300 to 3,300 tokens. The
codemodedescription lists the script globals in one line each and points to the new Codemode reference for themodelsAPI, which the model reads when it needs it. Declared tools say in one line how scripts call them and what the call resolves to, instead of repeating their full declaration, and the system prompt's codemode guidance and MCP server section are shorter. - Codemode errors now say how to recover: reading a tool or
modelsmember that does not exist names the close matches (tools.Bashsuggeststools.bash),models.classify()andmodels.generateImages()reject malformed arguments with the expected shape, an unknown model points tomodels.getAvailableOfType(), an oversizedstore()value explains what the store is for, and a script that generates images without showing them gets a note. Scripts that probed for a tool withtypeof tools.namemust use"name" in tools. /loginand/logoutnow label providers without credentials as "not configured" instead of "unconfigured".- OAuth browser pages now show the color Pi logo.
Fixed
- Fixed MCP OAuth sign-in accepting an authorization response whose
issparameter names another authorization server; the code is now rejected before it is exchanged (RFC 9207). - Fixed MCP OAuth sign-in failing with
Invalid scopewhen the token response contains"scope": "", and similar failures for other empty ornulloptional OAuth fields (#10266). - Fixed the sign-in URL printed by
/mcp loginnot being clickable when it wraps (#10186). - Fixed
--providerwithout--modelbeing silently ignored and running the default model from another provider; it now fails with an error (#10236). - Fixed MCP servers that ask for more scope (
insufficient_scope) requesting sign-in over and over. The new sign-in requested only the missing scopes, so the new token lost access the previous one had; it now keeps the granted scopes. - Fixed user messages in the transcript keeping two full-width copies of every rendered line; they keep one, with identical output.
- Fixed
/loginand/logoutlabeling every OAuth sign-in, including Radius, as a subscription; only subscription-backed providers say "subscription", other OAuth sign-ins say "account". - Fixed the startup header logo rendering with gaps in Apple Terminal; it now shows a colored "Pi" with the version instead.
- Fixed deferred MCP tools that
tool_searchloaded being dropped on resume and/reloadeven when their server reconnected before the next prompt, because the session restored its tools before the MCP servers reconnected. - Fixed the system theme making pastel palettes such as Catppuccin Frappe much more vivid; palette colors now keep their chroma (#10255, #10293 by @dgtlntv).
- Fixed slash command autocompletion not triggering when the input starts with whitespace (#10218 by @haoqixu).
- Fixed color bleeding past mouse selections and search highlights in fullscreen mode when a styled token ends at the highlight boundary (#10169).
- Fixed memory retained per rendered message in the transcript; a long assistant message keeps about a fifth of the heap it kept before.