Changelog

Release notes and changes from the Pi changelog.

Release notes

Pi 0.68.1

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

New Features

Added

  • Added built-in Fireworks provider support, including FIREWORKS_API_KEY setup/docs and the default Fireworks model accounts/fireworks/models/kimi-k2p6 (#3519)

Read more

Release notes

Pi 0.68.0

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

New Features

Breaking Changes

  • Changed SDK and CLI tool selection from cwd-bound built-in tool instances to tool-name allowlists. createAgentSession({ tools }) now expects string[] names such as "read" and "bash" instead of Tool[], --tools now allowlists built-in, extension, and custom tools by name, and --no-tools now disables all tools by default rather than only built-ins. Migrate SDK code from tools: [readTool, bashTool] to tools: ["read", "bash"] (#2835, #3452)
  • Removed prebuilt cwd-bound tool and tool-definition exports from @mariozechner/pi-coding-agent, including readTool, bashTool, editTool, writeTool, grepTool, findTool, lsTool, readOnlyTools, codingTools, and the corresponding *ToolDefinition values. Use the explicit factory exports instead, for example createReadTool(cwd), createBashTool(cwd), createCodingTools(cwd), and createReadToolDefinition(cwd) (#3452)
  • Removed ambient process.cwd() / default agent-dir fallback behavior from public resource helpers. DefaultResourceLoader, loadProjectContextFiles(), and loadSkills() now require explicit cwd/agent-dir style inputs, and exported system-prompt option types now require an explicit cwd. Pass the session or project cwd explicitly instead of relying on process-global defaults (#3452)

Added

  • Added extension support for customizing the interactive streaming working indicator via ctx.ui.setWorkingIndicator(), including custom animated frames, static indicators, hidden indicators, a new working-indicator.ts example extension, and updated extension/TUI/RPC docs (#3413)
  • Added systemPromptOptions (BuildSystemPromptOptions) to before_agent_start extension events, so extensions can inspect the structured inputs used to build the current system prompt (#3473 by @dljsjr)
  • Added /clone to duplicate the current active branch into a new session, while keeping /fork focused on forking from a previous user message (#2962)
  • Added ctx.fork() support for position: "before" | "at" so extensions and integrations can branch before a user message or duplicate the current point in the conversation; the interactive clone/fork UX builds on that runtime support (#3431 by @mitsuhiko)
  • Added configurable keybinding ids for scoped model selector actions and tree filter actions, so those interactive shortcuts can be remapped in keybindings.json (#3343 by @mpazik)
  • Added PI_OAUTH_CALLBACK_HOST support for built-in OAuth login flows, allowing local callback servers used by pi auth to bind to a custom interface instead of hardcoded 127.0.0.1 (#3409 by @Michaelliv)
  • Added reason and targetSessionFile metadata to session_shutdown extension events, so extensions can distinguish quit, reload, new-session, resume, and fork teardown paths (#2863)

Changed

  • Changed pi update to batch npm package updates per scope and run git package updates with bounded parallelism, reducing multi-package update time while preserving skip behavior for pinned and already-current packages (#2980)
  • Changed Bedrock session requests to omit maxTokens when model token limits are unknown and to omit temperature when unset, letting Bedrock use provider defaults and avoid unnecessary TPM quota reservation (#3400 by @wirjo)

Read more

Release notes

Pi 0.67.67

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

New Features

  • Bedrock sessions can now authenticate with AWS_BEARER_TOKEN_BEDROCK, enabling Converse API access without local SigV4 credentials. See docs/providers.md#amazon-bedrock.

Added

  • Added Bedrock bearer-token authentication support via AWS_BEARER_TOKEN_BEDROCK, enabling coding-agent sessions to use Bedrock Converse without local SigV4 credentials (#3125 by @wirjo)

Read more

Release notes

Pi 0.67.6

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

New Features

  • Prompt templates support an argument-hint frontmatter field that renders before the description in the / autocomplete dropdown, using <angle> for required and [square] for optional arguments. See docs/prompt-templates.md#argument-hints.
  • New after_provider_response extension hook lets extensions inspect provider HTTP status codes and headers immediately after each response is received and before stream consumption begins. See docs/extensions.md.
  • Compact interactive startup header with a comma-separated view of loaded AGENTS.md files, prompt templates, skills, and extensions. Press Ctrl+O to toggle the expanded listing.
  • Markdown links in assistant output now render as OSC 8 hyperlinks on terminals that advertise support; unknown terminals and tmux/screen default to plain text so URLs are never silently dropped.

Added

  • Added argument-hint frontmatter field for prompt templates, displayed before the description in the autocomplete dropdown (#2780 by @andresvi94)
  • Added after_provider_response extension hook so extensions can inspect provider HTTP status codes and headers after each provider response is received and before stream consumption begins (#3128)
  • Added OSC 8 hyperlink rendering for markdown links when the terminal advertises support (#3248 by @ofa1)

Changed

  • Changed interactive startup header to a compact, comma-separated view of loaded AGENTS.md files, prompt templates, skills, and extensions, with Ctrl+O to toggle the expanded listing (#3267)
  • Tightened hyperlink capability detection to default hyperlinks: false for unknown terminals and force it off under tmux/screen (including nested sessions), preventing markdown link URLs from disappearing on terminals that silently swallow OSC 8 sequences (#3248)

Read more

Release notes

Pi 0.67.5

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

Fixed

  • Fixed Opus 4.7 adaptive thinking configuration across Anthropic and Bedrock providers by recognizing Opus 4.7 adaptive-thinking support and mapping xhigh reasoning to provider-supported effort values (#3286 by @markusylisiurunen)
  • Fixed Zellij Shift+Enter regressions by reverting the Zellij-specific Kitty keyboard query bypass and restoring the previous keyboard negotiation behavior (#3259)

Read more

Release notes

Pi 0.67.4

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

New Features

  • --no-context-files (-nc) disables automatic AGENTS.md / CLAUDE.md discovery when you need a clean run without project context injection. See README.md#context-files.
  • loadProjectContextFiles() is now exported as a standalone utility for extensions and SDK-style integrations that need to inspect the same context-file resolution order used by the CLI. See README.md#context-files.
  • New after_provider_response extension hook lets extensions inspect provider HTTP status codes and headers immediately after response creation and before stream consumption. See docs/extensions.md.

Added

  • Added --no-context-files (-nc) to disable AGENTS.md and CLAUDE.md context file discovery and loading (#3253)
  • Exported loadProjectContextFiles() as a standalone utility so extensions can discover project context files without instantiating a full DefaultResourceLoader (#3142)
  • Added after_provider_response extension hook so extensions can inspect provider HTTP status codes and headers after each provider response is received and before stream consumption begins (#3128)

Changed

  • Added claude-opus-4-7 model for Anthropic.
  • Changed Anthropic prompt caching to add a cache_control breakpoint on the last tool definition, so tool schemas can be cached independently from transcript updates while preserving existing cache retention behavior (#3260)

Read more

Release notes

Pi 0.67.3

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

New Features

  • renderShell: "self" for custom and built-in tool renderers so tools can own their outer shell instead of the default boxed shell. Useful for stable large previews such as edit diffs. See docs/extensions.md#custom-rendering.
  • Interactive auto-retry status now shows a live countdown during backoff instead of a static retry delay message.

Added

  • Added renderShell: "self" for custom and built-in tool renderers so tools can own their outer shell instead of using the default boxed shell. This is useful for stable large previews such as edit diffs (#3134)

Read more

Release notes

Pi 0.67.2

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

New Features

  • Support for multiple --append-system-prompt flags, each value is appended to the system prompt separated by double newlines. See README.md#other-options.
  • Support for passing inline extension factories to main() for embedded integrations and custom entrypoints.
  • Interactive keybinding support for Kitty super-modified shortcuts such as super+k, super+enter, and ctrl+super+k. See docs/keybindings.md.

Added

  • Added support for multiple --append-system-prompt flags, each value is appended to the system prompt separated by double newlines (#3171 by @aliou)
  • Added interactive keybinding support for Kitty super-modified shortcuts such as super+k, super+enter, and ctrl+super+k (#3111 by @sudosubin)
  • Added support for passing inline extension factories to main() for embedded integrations and custom entrypoints (#3099 by @pmateusz)

Read more

Release notes

Pi 0.67.1

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

Telemetry

Interactive mode now sends a lightweight anonymous install/update telemetry ping to https://pi.dev/install?version=x.y.z after it writes lastChangelogVersion in settings.json.

Why this exists:

  • Pi needs a reliable per-version usage signal to understand whether releases are being adopted and to help justify funding continued development.
  • npm download counts are not a reliable proxy for actual Pi usage.

How it works:

  • It only runs in interactive mode.
  • It does not run in RPC mode, print mode, JSON mode, or SDK mode.
  • On a fresh interactive install, Pi writes lastChangelogVersion, then sends the ping.
  • On later interactive startups, if the local changelog contains entries newer than the previously stored lastChangelogVersion, Pi writes the new lastChangelogVersion, then sends the ping.
  • The request is fire-and-forget. Startup does not wait for it, and any errors are ignored.

What data is collected:

  • Only the Pi version in the request path, for example https://pi.dev/install?version=0.67.1.
  • The server stores only aggregate per-version counters such as { "0.67.1": 3 }.
  • It does not store IP addresses, client identifiers, prompts, paths, models, auth state, or any other per-user data. It literally only increments a counter for that version.

How to disable it:

  • /settings → disable Install telemetry
  • settings.json → set enableInstallTelemetry to false
  • PI_OFFLINE=1
  • PI_TELEMETRY=0

New Features

  • Full openRouterRouting support in models.json, including fallbacks, parameter requirements, data collection, ZDR, ignore lists, quantizations, provider sorting, max price, and preferred throughput and latency constraints. See docs/models.md.
  • PI_CODING_AGENT=true environment variable set at startup so subprocesses can detect they are running inside the coding agent.
  • Updated antigravity-image-gen.ts example extension to use User-Agent version 1.21.9 (#2901 by @aadishv)
  • Fixed --list-models silently swallowing models.json load errors; errors are now printed to stderr (#3072)
  • Fixed custom models for built-in providers (e.g. openrouter) being silently dropped from --list-models by inheriting api/baseUrl from built-in model definitions and no longer requiring apiKey for providers with existing auth (#2921 and #3072)

Added

  • Added full openRouterRouting field support in models.json, including fallbacks, parameter requirements, data collection, ZDR, ignore lists, quantizations, provider sorting, max price, and preferred throughput and latency constraints (#2904 by @zmberber)
  • Set PI_CODING_AGENT=true environment variable at startup so sub-processes can detect they are running inside the coding agent (#2868)

Read more

Release notes

Pi 0.67.0

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

Changes

See [0.67.1]. Version 0.67.0 shipped with a changelog formatting error that caused interactive startup to show only the version header instead of the full release notes.

Read more

Release notes

Pi 0.66.0

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

New Features

  • Earendil startup announcement with bundled inline image rendering and a linked blog post for April 8 and 9, 2026.
  • Interactive Anthropic subscription auth warning when Anthropic subscription auth is active, clarifying that Anthropic third-party usage draws from extra usage and is billed per token.

Read more

Release notes

Pi 0.65.1

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

Fixed

  • Fixed bash output truncation by line count to always persist full output to a temp file, preventing data loss when output exceeds 2000 lines but stays under the byte threshold (#2852)
  • RpcClient now forwards subprocess stderr to parent process in real-time (#2805)
  • Theme file watcher now handles async fs.watch error events instead of crashing the process (#2791)
  • Fixed stored session cwd handling so resuming or importing a session whose original working directory no longer exists now prompts interactive users to continue in the current cwd, while non-interactive modes fail with a clear error.
  • Fixed resource collision precedence so project and user skills, prompt templates, and themes override package resources consistently, and CLI-provided paths take precedence over discovered resources (#2781)
  • Fixed OpenAI-compatible completions streaming usage accounting to preserve prompt_tokens_details.cache_write_tokens and normalize OpenRouter cached_tokens, preventing incorrect cache read/write token and cost reporting in pi (#2802)
  • Fixed CLI extension paths like git:gist.github.com/... being incorrectly resolved against cwd instead of being passed through to the package manager (#2845 by @aliou)
  • Fixed piped stdin runs with --mode json to preserve JSONL output instead of falling back to plain text (#2848 by @aliou)
  • Fixed interactive command docs to stop listing removed /exit as a supported quit command (#2850)

Read more

Release notes

Pi 0.65.0

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

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)

Read more

Release notes

Pi 0.64.0

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

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)

Read more

Release notes

Pi 0.63.2

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

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)

Read more

Release notes

Pi 0.63.0

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

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)

Read more

Release notes

Pi 0.62.0

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

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)

Read more

Release notes

Pi 0.61.1

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

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)

Read more