Skip to content

Releases: badlogic/pi-mono

v0.65.0

03 Apr 18:33

Choose a tag to compare

New Features

  • Session runtime API: createAgentSessionRuntime() and AgentSessionRuntime provide a closure-based runtime that recreates cwd-bound services and session config on every session switch. Startup, /new, /resume, /fork, and import all use the same creation path. See docs/sdk.md and examples/sdk/13-session-runtime.ts.
  • Label timestamps in /tree: Toggle timestamps on tree entries with Shift+T, with smart date formatting and timestamp preservation through branching (#2691 by @w-winter)
  • defineTool() helper: Create standalone custom tool definitions with full TypeScript parameter type inference, no manual casts needed (#2746). See docs/extensions.md.
  • Unified diagnostics: Arg parsing, service creation, session option resolution, and resource loading all return structured diagnostics (info/warning/error) instead of logging or exiting. The app layer decides presentation and exit behavior.

Breaking Changes

  • Removed extension post-transition events session_switch and session_fork. Use session_start with event.reason ("startup" | "reload" | "new" | "resume" | "fork"). For "new", "resume", and "fork", session_start includes previousSessionFile.
  • Removed session-replacement methods from AgentSession. Use AgentSessionRuntime for newSession(), switchSession(), fork(), and importFromJsonl(). Cross-cwd session replacement rebuilds all cwd-bound runtime state and replaces the live AgentSession instance.
  • Removed session_directory from extension and settings APIs.
  • Unknown single-dash CLI flags (e.g. -s) now produce an error instead of being silently ignored.

Migration: Extensions

Before:

pi.on("session_switch", async (event, ctx) => { ... });
pi.on("session_fork", async (_event, ctx) => { ... });

After:

pi.on("session_start", async (event, ctx) => {
  // event.reason: "startup" | "reload" | "new" | "resume" | "fork"
  // event.previousSessionFile: set for "new", "resume", "fork"
});

Migration: SDK session replacement

Before:

await session.newSession();
await session.switchSession("/path/to/session.jsonl");

After:

import {
  type CreateAgentSessionRuntimeFactory,
  createAgentSessionFromServices,
  createAgentSessionRuntime,
  createAgentSessionServices,
  getAgentDir,
  SessionManager,
} from "@mariozechner/pi-coding-agent";

const createRuntime: CreateAgentSessionRuntimeFactory = async ({ cwd, sessionManager, sessionStartEvent }) => {
  const services = await createAgentSessionServices({ cwd });
  return {
    ...(await createAgentSessionFromServices({ services, sessionManager, sessionStartEvent })),
    services,
    diagnostics: services.diagnostics,
  };
};

const runtime = await createAgentSessionRuntime(createRuntime, {
  cwd: process.cwd(),
  agentDir: getAgentDir(),
  sessionManager: SessionManager.create(process.cwd()),
});

await runtime.newSession();
await runtime.switchSession("/path/to/session.jsonl");
await runtime.fork("entry-id");

// After replacement, runtime.session is the new live session.
// Rebind any session-local subscriptions or extension bindings.

Added

  • Added createAgentSessionRuntime() and AgentSessionRuntime for runtime-backed session replacement. The runtime takes a CreateAgentSessionRuntimeFactory closure that closes over process-global fixed inputs and recreates cwd-bound services and session config for each effective cwd. Startup and later /new, /resume, /fork, import all use the same factory.

  • Added unified diagnostics model (info/warning/error) for arg parsing, service creation, session option resolution, and resource loading. Creation logic no longer logs or exits. The app layer decides presentation and exit behavior.

  • Added error diagnostics for missing explicit CLI resource paths (-e, --skill, --prompt-template, --theme)

  • Added defineTool() so standalone and array-based custom tool definitions keep inferred parameter types without manual casts (#2746)

  • Added label timestamps to the session tree with a Shift+T toggle in /tree, smart date formatting, and timestamp preservation through branching (#2691 by @w-winter)

Fixed

  • Fixed startup resource loading to reuse the initial ResourceLoader for the first runtime, so extensions are not loaded twice before session startup and session_start handlers still fire for singleton-style extensions (#2766)
  • Fixed retry settlement so retried agent runs wait for the full retry cycle to complete before declaring idle, preventing stale state after transient errors
  • Fixed theme export colors to resolve theme variables the same way as colors, so /export HTML backgrounds now honor entries like pageBg: "base" instead of requiring inline hex values (#2707)
  • Fixed Bedrock throttling errors being misidentified as context overflow, causing unnecessary compaction instead of retry (#2699 by @xu0o0)
  • Added tool streaming support for newer Z.ai models (#2732 by @kaofelix)

v0.64.0

29 Mar 19:58

Choose a tag to compare

New Features

  • Extensions and SDK callers can attach a prepareArguments hook to any tool definition, letting them normalize or migrate raw model arguments before schema validation. The built-in edit tool uses this to transparently support sessions created with the old single-edit schema. See docs/extensions.md
  • Extensions can customize the collapsed thinking block label via ctx.ui.setHiddenThinkingLabel(). See examples/extensions/hidden-thinking-label.ts (#2673)

Breaking Changes

  • ModelRegistry no longer has a public constructor. SDK callers and tests must use ModelRegistry.create(authStorage, modelsJsonPath?) for file-backed registries or ModelRegistry.inMemory(authStorage) for built-in-only registries. Direct new ModelRegistry(...) calls no longer compile.

Added

  • Added ToolDefinition.prepareArguments hook to prepare raw tool call arguments before schema validation, enabling compatibility shims for resumed sessions with outdated tool schemas
  • Built-in edit tool now uses prepareArguments to silently fold legacy top-level oldText/newText into edits[] when resuming old sessions
  • Added ctx.ui.setHiddenThinkingLabel() so extensions can customize the collapsed thinking label in interactive mode, with a no-op in RPC mode and a runnable example extension in examples/extensions/hidden-thinking-label.ts (#2673)

Fixed

  • Fixed extension-queued user messages to refresh the interactive pending-message list so messages submitted while a turn is active are no longer silently dropped (#2674 by @mrexodia)
  • Fixed monorepo tsconfig.json path mappings to resolve @mariozechner/pi-ai subpath exports to source files in development checkouts (#2625 by @ferologics)
  • Fixed TUI cell size response handling to consume only exact CSI 6 ; height ; width t replies, so bare Escape is no longer swallowed while waiting for terminal image metadata (#2661)
  • Fixed Kitty keyboard protocol keypad functional keys to normalize to logical digits, symbols, and navigation keys, so numpad input in terminals such as iTerm2 no longer inserts Private Use Area gibberish or gets ignored (#2650)

v0.63.2

29 Mar 11:15

Choose a tag to compare

New Features

  • Extension handlers can now use ctx.signal to forward cancellation into nested model calls, fetch(), and other abort-aware work. See docs/extensions.md#ctxsignal (#2660)
  • Built-in edit tool input now uses edits[] as the only replacement shape, reducing invalid tool calls caused by mixed single-edit and multi-edit schemas (#2639)
  • Large multi-edit results no longer trigger full-screen redraws in the interactive TUI when the final diff is rendered (#2664)

Added

  • Added ctx.signal to ExtensionContext and wired it to the active agent turn so extension handlers can forward cancellation into nested model calls, fetch(), and other abort-aware work (#2660)

Fixed

  • Fixed built-in edit tool input to use edits[] as the only replacement shape, eliminating the mixed single-edit and multi-edit modes that caused repeated invalid tool calls and retries (#2639)
  • Fixed edit tool TUI rendering to defer large multi-edit diffs to the settled result, avoiding full-screen redraws when the tool completes (#2664)

v0.63.1

27 Mar 03:16

Choose a tag to compare

Added

  • Added gemini-3.1-pro-preview-customtools model availability for the google-vertex provider (#2610 by @gordonhwc)

Fixed

  • Documented tool_call input mutation as supported extension API behavior, clarified that post-mutation inputs are not re-validated, and added regression coverage for executing mutated tool arguments (#2611)
  • Fixed repeated compactions dropping messages that were kept by an earlier compaction by re-summarizing from the previous kept boundary and recalculating tokensBefore from the rebuilt session context (#2608)
  • Fixed interactive compaction UI updates so ctx.compact() rebuilds the chat through unified compaction events, manual compaction no longer duplicates the summary block, and the trigger-compact example only fires when context usage crosses its threshold (#2617)
  • Fixed interactive compaction completion to append a synthetic compaction summary after rebuilding the chat so the latest compaction remains visible at the bottom
  • Fixed skill discovery to stop recursing once a directory contains SKILL.md, and to ignore root *.md files in .agents/skills while keeping root markdown skill files supported in ~/.pi/agent/skills, .pi/skills, and package skills/ directories (#2603)
  • Fixed edit tool diff rendering for multi-edit operations with large unchanged gaps so distant edits collapse intermediate context instead of dumping the full unchanged middle block
  • Fixed edit tool error rendering to avoid repeating the same exact-match failure in both the preview and result blocks
  • Fixed auto-compaction overflow recovery for Ollama models when the backend returns explicit prompt too long; exceeded max context length ... errors instead of silently truncating input (#2626)
  • Fixed built-in tool overrides that reuse built-in parameter schemas to still honor custom renderCall and renderResult renderers in the interactive TUI, restoring the minimal-mode example (#2595)

v0.63.0

27 Mar 01:32

Choose a tag to compare

Breaking Changes

  • ModelRegistry.getApiKey(model) has been replaced by getApiKeyAndHeaders(model) because models.json auth and header values can now resolve dynamically on every request. Extensions and SDK integrations that previously fetched only an API key must now fetch request auth per call and forward both apiKey and headers. Use getApiKeyForProvider(provider) only when you explicitly want provider-level API key lookup without model headers or authHeader handling (#1835)
  • Removed deprecated direct minimax and minimax-cn model IDs, keeping only MiniMax-M2.7 and MiniMax-M2.7-highspeed. Update pinned model IDs to one of those supported direct MiniMax models, or use another provider route that still exposes the older IDs (#2596 by @liyuan97)

Migration Notes

Before:

const apiKey = await ctx.modelRegistry.getApiKey(model);
return streamSimple(model, messages, { apiKey });

After:

const auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);
if (!auth.ok) throw new Error(auth.error);
return streamSimple(model, messages, {
  apiKey: auth.apiKey,
  headers: auth.headers,
});

Added

  • Added sessionDir setting support in global and project settings.json so session storage can be configured without passing --session-dir on every invocation (#2598 by @smcllns)
  • Added a startup onboarding hint in the interactive header telling users pi can explain its own features and documentation (#2620 by @ferologics)
  • Added edit tool multi-edit support so one call can update multiple separate, disjoint regions in the same file while matching all replacements against the original file content
  • Added support for PI_TUI_WRITE_LOG directory paths, creating a unique log file (tui-<timestamp>-<pid>.log) per instance for easier debugging of multiple pi sessions (#2508 by @mrexodia)

Changed

Fixed

  • Fixed file mutation queue ordering so concurrent edit and write operations targeting the same file stay serialized in request order instead of being reordered during queue-key resolution
  • Fixed models.json shell-command auth and headers to resolve at request time instead of being cached into long-lived model state. pi now leaves TTL, caching, and recovery policy to user-provided wrapper commands because arbitrary shell commands need provider-specific strategies (#1835)
  • Fixed Google and Vertex cost calculation to subtract cached prompt tokens from billable input tokens instead of double-counting them when providers report cachedContentTokenCount (#2588 by @sparkleMing)
  • Added missing ajv direct dependency; previously relied on transitive install via @mariozechner/pi-ai which broke standalone installs (#2252)
  • Fixed /export HTML backgrounds to honor theme.export.pageBg, cardBg, and infoBg instead of always deriving them from userMessageBg (#2565)
  • Fixed interactive bash execution collapsed previews to recompute visual line wrapping at render time, so previews respect the current terminal width after resizes and split-pane width changes (#2569)
  • Fixed RPC get_session_stats to expose contextUsage, so headless clients can read actual current context-window usage instead of deriving it from token totals (#2550)
  • Fixed pi update for git packages to fetch only the tracked target branch with --no-tags, reducing unrelated branch and tag noise while preserving force-push-safe updates (#2548)
  • Fixed print and JSON modes to emit session_shutdown before exit, so extensions can release long-lived resources and non-interactive runs terminate cleanly (#2576)
  • Fixed GitHub Copilot OpenAI Responses requests to omit the reasoning field entirely when no reasoning effort is requested, avoiding 400 errors from Copilot gpt-5-mini rejecting reasoning: { effort: "none" } during internal summary calls (#2567)
  • Fixed blockquote text color breaking after inline links (and other inline elements) due to missing style restoration prefix
  • Fixed slash-command Tab completion from immediately chaining into argument autocomplete after completing the command name, restoring flows like /model that submit into a selector dialog (#2577)
  • Fixed stale content and incorrect viewport tracking after TUI content shrinks or transient components inflate the working area (#2126 by @Perlence)
  • Fixed @ autocomplete to debounce editor-triggered searches, cancel in-flight fd lookups cleanly, and keep suggestions visible while results refresh (#1278)

v0.62.0

23 Mar 01:52

Choose a tag to compare

New Features

  • Built-in tools as extensible ToolDefinitions. Extension authors can now override rendering of built-in read/write/edit/bash/grep/find/ls tools with custom renderCall/renderResult components. See docs/extensions.md.
  • Unified source provenance via sourceInfo. All resources, commands, tools, skills, and prompt templates now carry structured sourceInfo with path, scope, and source metadata. Visible in autocomplete, RPC discovery, and SDK introspection. See docs/extensions.md.
  • AWS Bedrock cost allocation tagging. New requestMetadata option on BedrockOptions forwards key-value pairs to the Bedrock Converse API for AWS Cost Explorer split cost allocation.

Breaking Changes

  • Changed ToolDefinition.renderCall and renderResult semantics. Fallback rendering now happens only when a renderer is not defined for that slot. If renderCall or renderResult is defined, it must return a Component.
  • Changed slash command provenance to use sourceInfo consistently. RPC get_commands, RpcSlashCommand, and SDK SlashCommandInfo no longer expose location or path. Use sourceInfo instead (#1734)
  • Removed legacy source fields from Skill and PromptTemplate. Use sourceInfo.source for provenance instead (#1734)
  • Removed ResourceLoader.getPathMetadata(). Resource provenance is now attached directly to loaded resources via sourceInfo (#1734)
  • Removed extensionPath from RegisteredCommand and RegisteredTool. Use sourceInfo.path for provenance instead (#1734)

Migration Notes

Resource, command, and tool provenance now use sourceInfo consistently.

Common updates:

  • RPC get_commands: replace path and location with sourceInfo.path, sourceInfo.scope, and sourceInfo.source
  • SlashCommandInfo: replace command.path and command.location with command.sourceInfo
  • Skill and PromptTemplate: replace .source with .sourceInfo.source
  • RegisteredCommand and RegisteredTool: replace .extensionPath with .sourceInfo.path
  • Custom ResourceLoader implementations: remove getPathMetadata() and read provenance from loaded resources directly

Examples:

  • command.path -> command.sourceInfo.path
  • command.location === "user" -> command.sourceInfo.scope === "user"
  • skill.source -> skill.sourceInfo.source
  • tool.extensionPath -> tool.sourceInfo.path

Changed

  • Built-in tools now work like custom tools in extensions. To get built-in tool definitions, import readToolDefinition / createReadToolDefinition() and the equivalent bash, edit, write, grep, find, and ls exports from @mariozechner/pi-coding-agent.
  • Cleaned up buildSystemPrompt() so built-in tool snippets and tool-local guidelines come from built-in ToolDefinition metadata, while cross-tool and global prompt rules stay in system prompt construction.
  • Added structured sourceInfo to pi.getAllTools() results for built-in, SDK, and extension tools (#1734)

Fixed

  • Fixed extension command name conflicts so extensions with duplicate command names can load together. Conflicting extension commands now get numeric invocation suffixes in load order, for example /review:1 and /review:2 (#1061)
  • Fixed slash command source attribution for extension commands, prompt templates, and skills in autocomplete and command discovery (#1734)
  • Fixed auto-resized image handling to enforce the inline image size limit on the final base64 payload, return text-only fallbacks when resizing cannot produce a safe image, and avoid falling back to the original image in read and @file auto-resize paths (#2055)
  • Fixed pi update for git packages to skip destructive reset, clean, and reinstall steps when the fetched target already matches the local checkout (#2503)
  • Fixed print and JSON mode to take over stdout during non-interactive startup, keeping package-manager and other incidental chatter off protocol/output stdout (#2482)
  • Fixed cli-highlight auto-detection for languageless code blocks that misidentified prose as programming languages and colored random English words as keywords
  • Fixed Anthropic thinking disable handling to send thinking: { type: "disabled" } for reasoning-capable models when thinking is explicitly off (#2022)
  • Fixed explicit thinking disable handling across Google, Google Vertex, Gemini CLI, OpenAI Responses, Azure OpenAI Responses, and OpenRouter-backed OpenAI-compatible completions (#2490)
  • Fixed OpenAI Responses replay for foreign tool-call item IDs by hashing foreign IDs into bounded fc_<hash> IDs
  • Fixed OpenAI-compatible completions streams to ignore null chunks instead of crashing (#2466 by @Cheng-Zi-Qing)
  • Fixed truncateToWidth() performance for very large strings by streaming truncation (#2447)
  • Fixed markdown heading styling being lost after inline code spans within headings

v0.61.1

20 Mar 19:17

Choose a tag to compare

New Features

  • Typed tool_call handler return values via ToolCallEventResult exports from the top-level package and core extension entry. See docs/extensions.md.
  • Updated default models for zai, cerebras, minimax, and minimax-cn, and aligned MiniMax catalog coverage and limits with the current provider lineup. See docs/models.md and docs/providers.md.

Added

  • Added ToolCallEventResult to the @mariozechner/pi-coding-agent top-level and core extension exports so extension authors can type explicit tool_call handler return values (#2458)

Changed

  • Changed the default models for zai, cerebras, minimax, and minimax-cn to match the current provider lineup, and added missing MiniMax-M2.1-highspeed model entries with normalized MiniMax context limits (#2445 by @1500256797)

Fixed

  • Fixed ctrl+z suspend and fg resume reliability by keeping the process alive until the SIGCONT handler restores the TUI, avoiding immediate process exit in environments with no other live event-loop handles (#2454)
  • Fixed createAgentSession({ agentDir }) to derive the default persisted session path from the provided agentDir, keeping session storage aligned with settings, auth, models, and resource loading (#2457)
  • Fixed shared keybinding resolution to stop user overrides from evicting unrelated default shortcuts such as selector confirm and editor cursor keys (#2455)
  • Fixed Termux software keyboard height changes from forcing full-screen redraws and replaying TUI history on every toggle (#2467)
  • Fixed project-local npm package updates to install npm latest instead of reusing stale saved dependency ranges, and added Did you mean ...? suggestions when pi update <source> omits the configured npm or git source prefix (#2459)

v0.61.0

20 Mar 01:11

Choose a tag to compare

New Features

Breaking Changes

  • Interactive keybinding ids are now namespaced, and keybindings.json now uses those same canonical namespaced ids. Older config files are migrated automatically on startup. Custom editors and extension UI components still receive an injected keybindings: KeybindingsManager. They do not call getKeybindings() or setKeybindings() themselves. Declaration merging applies to that injected type (#2391)
  • Extension author migration: update keyHint(), keyText(), and injected keybindings.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-mini to the openai-codex model 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.json cannot cause failures (#2360)
  • Fixed custom keybindings.json overrides to shadow conflicting default shortcuts globally, so bindings such as cursorUp: ["up", "ctrl+p"] no longer leave default actions like model cycling active (#2391)
  • Fixed concurrent edit and write mutations 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 /model to refresh scoped model lists after models.json changes, 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-browser and similar commands to spin forever (#2389 by @mrexodia)
  • Fixed google-vertex API 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=1 is set, covering profile ARNs that do not expose the underlying Claude model name (#2346 by @haoqixu)

v0.60.0

18 Mar 02:43

Choose a tag to compare

New Features

  • Fork existing sessions directly from the CLI with --fork <path|id>, which copies a source session into a new session in the current project. See README.md.
  • Extensions and SDK callers can reuse pi's built-in local bash backend via createLocalBashOperations() for user_bash interception and custom bash integrations. See docs/extensions.md#user_bash.
  • Startup no longer updates unpinned npm and git packages automatically. Use pi update explicitly, while interactive mode checks for updates in the background and notifies you when newer packages are available. See README.md.

Breaking Changes

  • Changed package startup behavior so installed unpinned packages are no longer checked or updated during startup. Use pi update to apply npm/git package updates, while interactive mode now checks for available package updates in the background and notifies you when updates are available (#1963)

Added

  • Added --fork <path|id> CLI flag to fork an existing session file or partial session UUID directly into a new session (#2290)
  • Added createLocalBashOperations() export so extensions and SDK callers can wrap pi's built-in local bash backend for user_bash handling and other custom bash integrations (#2299)

Fixed

  • Fixed active model selection to refresh immediately after dynamic provider registrations or updates change the available model set (#2291)
  • Fixed tmux xterm modifyOtherKeys matching for Backspace, Escape, and Space, and resolved raw \x08 backspace ambiguity by treating Windows Terminal sessions differently from legacy terminals (#2293)
  • Fixed Gemini 3 and Antigravity image tool results to stay inline as multimodal tool responses instead of being rerouted through separate follow-up messages (#2052)
  • Fixed bundled Bedrock Claude 4.6 model metadata to use the correct 200K context window instead of 1M (#2305)
  • Fixed /reload to reload keybindings from disk so changes in keybindings.json apply immediately (#2309)
  • Fixed lazy built-in provider registration so compiled Bun binaries can still load providers on first use without eagerly bundling provider SDKs (#2314)
  • Fixed built-in OAuth login flows to use aligned callback handling across Anthropic, Gemini CLI, Antigravity, and OpenAI Codex, and fixed OpenAI Codex login to complete immediately once the browser callback succeeds (#2316)
  • Fixed OpenAI-compatible z.ai network_error responses to trigger error handling and retries instead of being treated as successful assistant output (#2313)
  • Fixed print mode to merge piped stdin into the initial prompt when both stdin and an explicit prompt are provided (#2315)
  • Fixed OpenAI Responses replay in coding-agent to normalize oversized resumed tool call IDs before sending them back to OpenAI Codex and other Responses-compatible targets (#2328)
  • Fixed tmux extended-keys warning to stay hidden when the tmux server is unreachable, avoiding false startup warnings in sandboxed environments (#2311 by @kaffarell)

v0.59.0

17 Mar 17:14

Choose a tag to compare

New Features

  • Faster startup by lazy-loading @mariozechner/pi-ai provider SDKs on first use instead of import time (#2297)
  • Better provider retry behavior when providers return error messages as responses (#2264)
  • Better terminal integration via OSC 133 command-executed markers (#2242)
  • Better Git footer branch detection for repositories using reftable storage (#2300)

Breaking Changes

  • Changed custom tool system prompt behavior so extension and SDK tools are included in the default Available tools section only when they provide promptSnippet. Omitting promptSnippet now leaves the tool out of that section instead of falling back to description (#2285)

Changed

  • Lazy-load built-in @mariozechner/pi-ai provider modules and root provider wrappers so coding-agent startup no longer eagerly loads provider SDKs before first use (#2297)

Fixed

  • Fixed session title handling in /tree, compaction, and branch summarization so empty title clears render correctly and session_info entries stay out of summaries (#2304 by @aliou)
  • Fixed footer branch detection for Git repositories using reftable storage so branch names still appear correctly in the footer (#2300)
  • Fixed rendered user messages to emit an OSC 133 command-executed marker after command output, improving terminal prompt integration (#2242)
  • Fixed provider retry handling to treat provider-returned error messages as retryable failures instead of successful responses (#2264)
  • Fixed Claude 4.6 context window overrides in bundled model metadata so coding-agent sees the intended model limits after generated catalogs are rebuilt (#2286)