New Features
- Namespaced keybinding ids and a unified keybinding manager across the app and TUI. See docs/keybindings.md and docs/extensions.md.
- JSONL session export and import via
/export <path.jsonl>and/import <path.jsonl>. See README.md and docs/session.md. - Resizable sidebar in HTML share and export views. See README.md.
Breaking Changes
- Interactive keybinding ids are now namespaced, and
keybindings.jsonnow uses those same canonical namespaced ids. Older config files are migrated automatically on startup. Custom editors and extension UI components still receive an injectedkeybindings: KeybindingsManager. They do not callgetKeybindings()orsetKeybindings()themselves. Declaration merging applies to that injected type (#2391) - Extension author migration: update
keyHint(),keyText(), and injectedkeybindings.matches(...)calls from old built-in names like"expandTools","selectConfirm", and"interrupt"to namespaced ids like"app.tools.expand","tui.select.confirm", and"app.interrupt". See docs/keybindings.md for the full list.pi.registerShortcut("ctrl+shift+p", ...)is unchanged because extension shortcuts still use raw key combos, not keybinding ids.
Added
- Added
gpt-5.4-minito theopenai-codexmodel catalog (#2334 by @justram) - Added JSONL session export and import via
/export <path.jsonl>and/import <path.jsonl>(#2356 by @hjanuschka) - Added a resizable sidebar to HTML share and export views (#2435 by @dmmulroy)
Fixed
- Tests for session-selector-rename and tree-selector are now keybinding-agnostic, resetting editor keybindings to defaults before each test so user
keybindings.jsoncannot cause failures (#2360) - Fixed custom
keybindings.jsonoverrides to shadow conflicting default shortcuts globally, so bindings such ascursorUp: ["up", "ctrl+p"]no longer leave default actions like model cycling active (#2391) - Fixed concurrent
editandwritemutations targeting the same file to run serially, preventing interleaved file writes from overwriting each other (#2327) - Fixed RPC mode to redirect unexpected stdout writes to stderr so JSONL responses remain parseable (#2388)
- Fixed auto-retry with tool-using retry responses so
session.prompt()waits for the full retry loop, including tool execution, before returning (#2440 by @pasky) - Fixed
/modelto refresh scoped model lists aftermodels.jsonchanges, avoiding stale selector contents (#2408 by @Perlence) - Fixed
validateToolArguments()to fall back gracefully when AJV schema compilation is blocked in restricted runtimes such as Cloudflare Workers, allowing tool execution to proceed without schema validation (#2395) - Fixed CLI startup to suppress process warnings from leaking into terminal, print, and RPC output (#2404)
- Fixed bash tool rendering to show elapsed time at the bottom of the tool block (#2406)
- Fixed custom theme file watching to reload updated theme contents from disk instead of keeping stale cached theme data (#2417, #2003)
- Fixed footer Git branch refreshes to run asynchronously so branch watcher updates do not block the UI (#2418)
- Fixed invalid extension provider registrations to surface an extension error without preventing other providers from loading (#2431)
- Fixed Windows bash execution hanging for commands that spawn detached descendants inheriting stdout/stderr handles, which caused
agent-browserand similar commands to spin forever (#2389 by @mrexodia) - Fixed
google-vertexAPI key resolution to ignore placeholder auth markers like<authenticated>and fall back to ADC instead of sending them as literal API keys (#2335) - Fixed desktop clipboard text copy to prefer native OS clipboard integration before shell fallbacks, improving reliability on macOS and Windows (#2347)
- Fixed Bun Bedrock provider registration to survive provider resets and session reloads in compiled binaries (#2350 by @unexge)
- Fixed OpenRouter reasoning requests to use the provider's nested reasoning payload, restoring thinking level support for OpenRouter models and custom compat settings (#2298 by @PriNova)
- Fixed Bedrock application inference profiles to support prompt caching when
AWS_BEDROCK_FORCE_CACHE=1is set, covering profile ARNs that do not expose the underlying Claude model name (#2346 by @haoqixu)