Pi since 0.87.1: catching up to 1.2.0

October 14, 2026 • 613 words • 3 min read

DAC's Pi facade pins 0.87.1 (see the baseline post). Since that pin, Pi shipped ten more releases and is now at 1.2.0. We have not moved the pin. This note groups what changed, so you know what is coming, and flags the parts that would touch the facade when we bump.

On npm Pi skipped 0.88 through 0.98 and jumped from 0.87.1 straight to 0.99.0 on 2026-09-29, then to 1.0.0 two days later. The ten releases run 0.99.0, 0.99.1, 0.99.2, 1.0.0, 1.0.1, 1.0.2, 1.0.3, 1.0.4, 1.1.0, 1.2.0.

Codemode and MCP land (0.99.x)

The biggest change in the gap. Pi grew a codemode tool that runs model-written JavaScript in a QuickJS sandbox, where a script can call Pi's tools in parallel, plus first-class MCP support over stdio or streamable HTTP with OAuth, managed by /mcp and pi mcp. Around it came a tool-exposure model (direct, model-only, codemode, deferred, hidden), a system theme that inherits the terminal palette, Sign in with ChatGPT, and virtual and classifier models. The build moved to TypeScript 7.0 targeting ES2024. 0.99.1 made GPT-6.1 Sol the Codex default. 0.99.2 kept MCP servers off the first prompt and added more auth options.

Pi 1.0 (1.0.0)

The 1.0 mark stabilizes the 0.99 foundation rather than piling on features. The TUI goes fullscreen by default; set tuiMode: "regular" to keep terminal scrollback. Codemode prompts get about 40% leaner and its errors explain how to recover. Codemode can generate images. /login gains Radius and an Anthropic copy-code path for headless machines. MCP OAuth is hardened with RFC 9207 iss checks, per-server credentials, and step-up that keeps granted scopes. Startup can be quieted to just the header.

The 1.0.x refinements

1.0.1 added a Nix flake, per-project MCP overrides via .pi/mcp.json, tool renderers for not-yet-registered tools, and Cloudflare Clef classifiers. It pinned brace-expansion for a security advisory and removed npm-shrinkwrap.json from the package. 1.0.2 added per-thinking-level sampling parameters. 1.0.3 renamed the Azure provider from azure-openai-responses to azure and added Foundry Chat Completions. 1.0.4 added * patterns to --tools and --exclude-tools, and a --no-mcp flag.

1.1.0 and 1.2.0

1.1.0 added program-status reporting over OSC 7501, so terminals and dashboards can see working, blocked, done, or failed. It also brought Claude Haiku 5.5, +name and -name entries to adjust the default tool set, GPT-6 Luna as a classifier, and native llama.cpp decision models. 1.2.0, the current release, added per-key OpenRouter model lists, published JSON schemas for settings, models, keybindings and themes, remote-session clipboard over OSC 52, and before_agent_start for extension-triggered runs. It also removed the unreleased experimental server, client, and plugin stack.

What a bump would touch

The facade embeds Pi's SDK, so the items that matter are the ones that move SDK or event semantics.

  • 1.2.0 turned before_agent_start into a union keyed on messageType, made it fire for triggerTurn runs as well, and made the session count as busy while a run starts, so ctx.isIdle() is false and pi.sendMessage() queues instead of starting a second run. It also changed the pi mcp list --json shape.
  • 0.99.0 changed the bash and powershell structured result shape to hold up to 1 MiB of output plus truncated and full_output_path, and renamed built-in extensions and tools to builtin:<name>.
  • 1.0.1 removed npm-shrinkwrap.json, so npm installs no longer pin transitive dependencies; reproducible installs now go through the pi.dev installer.
  • 1.0.3 renamed the Azure provider, which is a config-level break.

The facade keeps a fact card for every upstream behavior it relies on, and the rule is to re-verify each entry and run a full-chain smoke before the pin moves. A bump to 1.2.0 is that whole exercise, so we schedule it deliberately rather than opportunistically.

Status

DAC still runs Pi 0.87.1 in production. This note is the map for the eventual bump. When the facade moves to a new pin, that version gets its own post in the series.