Skip to content

v0.84.0

Latest

Choose a tag to compare

@github-actions github-actions released this 06 Aug 11:07

New Features

  • Fullscreen TUI mode — Switch between regular and fullscreen modes at runtime, with a sticky editor and footer, independently scrollable transcript, and draggable scrollbars. See UI & Display.
  • Mermaid and LaTeX rendering — Render Mermaid diagrams and terminal-friendly Unicode math in interactive transcripts. See Markdown settings and TUI Markdown.
  • Per-directory context overrides — Use AGENTS.override.md to replace context files for a specific directory. See Context Files.
  • Advanced custom model sampling — Configure arbitrary OpenAI-compatible samplingParams and opt-in vLLM thinking_token_budget values. See Sampling Parameters.
  • Baseten provider — Use built-in Baseten authentication and model support. See API Keys.

Breaking Changes

  • Renamed the inherited pi-ai ModelsStreamTransforms interface to ModelsRequestTransforms because its header transformation now applies to all authenticated provider requests.

  • Changed JSON and RPC message_update events to emit only assistantMessageEvent deltas, removing the cumulative message and assistantMessageEvent.partial fields that caused quadratic output growth. Clients that need partial messages must assemble deltas between message_start and message_end; the latter remains authoritative (#7290).

  • ModelRegistry.getApiKeyAndHeaders() now returns ProviderHeaders with string | null values and preserves null header-deletion markers. Extensions that inspect returned headers must handle null; extensions forwarding them to pi-ai streams should pass them through unchanged. This prevents placeholder OpenAI credentials from being sent through Cloudflare AI Gateway (#7030).

  • Changed ModelRegistry.refresh() to accept ModelsRefreshOptions and return ModelsRefreshResult instead of discarding cancellation and provider errors.

  • Changed ModelRuntime.setRuntimeApiKey() to accept auth cancellation options rather than catalog refresh options. Call refresh({ providers: [providerId], signal }) separately when remote freshness is required.

  • Required config-form extension OAuth refreshToken(credentials, signal) callbacks to accept and honor a concrete abort signal.

  • Replaced dynamic provider refresh context store access with the read-only context.stored snapshot and generation-checked context.publish() transaction.

    Providers built with createProvider({ fetchModels }): no catalog-publication migration is required. Before and after, return the fetched models and register the resulting provider; createProvider() owns restoration, persistence, and in-memory publication.

    // Before
    const beforeProvider = createProvider({
      // ...
      fetchModels: async ({ signal }) => {
        const response = await fetch(catalogUrl, { signal });
        return parseModels(await response.json());
      },
    });
    pi.registerProvider(beforeProvider);
    
    // After: unchanged
    const afterProvider = createProvider({
      // ...
      fetchModels: async ({ signal }) => {
        const response = await fetch(catalogUrl, { signal });
        return parseModels(await response.json());
      },
    });
    pi.registerProvider(afterProvider);

    Handwritten native Provider.refreshModels(): replace direct store access and pre-publication mutation with generation-guarded publications.

    // Before
    refreshModels: async (context) => {
      const stored = await context.store.read();
      if (stored) currentModels = stored.models;
      if (!context.allowNetwork) return;
    
      const refreshed = await fetchModels(context.signal);
      currentModels = refreshed;
      await context.store.write({ models: refreshed, checkedAt: Date.now() });
    },
    
    // After
    refreshModels: async (context) => {
      if (context.stored) {
        const restored = context.stored.models;
        if (!(await context.publish({
          update: () => { currentModels = restored; },
        }))) return;
      }
      if (!context.allowNetwork) return;
    
      const refreshed = await fetchModels(context.signal);
      if (context.signal.aborted) return;
      await context.publish({
        persist: { models: refreshed, checkedAt: Date.now() },
        update: () => { currentModels = refreshed; },
      });
    },

    For the config-form pi.registerProvider(name, { refreshModels }), callbacks that only return models remain unchanged; pi publishes the returned list. If such a callback previously used context.store for custom persistence, read context.stored and call context.publish({ persist: entry }). In publish(), omit persist to leave storage unchanged, pass a ModelsStoreEntry to write it, or pass persist: null to delete it.

  • Replaced the inherited pi-agent-core harness session model with the v4 lane-based Session, SessionStorage, and SessionRepo APIs, including durable operation records, global facts, shared sequence numbers, and tree-scoped lane views.

  • Promoted the inherited v2 session and AgentHarness API from pi-agent-core's experimental entrypoint to its default export and removed the experimental subpaths.

  • Removed the inherited legacy JSONL and in-memory repository APIs. Use pi-agent-core's v4 JsonlSessionRepo or InMemorySessionRepo, both implementing the new SessionRepo contract.

  • Added the inherited required pi-agent-core FileSystem.renameFile() operation for atomic JSONL publication; custom harness file-system implementations must provide same-filesystem replacement semantics (#7707 by @davidbrai).

  • Replaced experimental remote-session list summaries with durable SessionMetadata; RemoteSession.sessions no longer exposes runtime phase, model, thinking, attachment, or lock state, which remains available from acquired SessionSnapshot values (#7708).

Added

  • Added built-in Baseten provider support with BASETEN_API_KEY authentication and zai-org/GLM-5.2 as the default model.
  • Added experimental remote-session client APIs: the transport-neutral PiClient, CBOR protocol, Unix-socket transport, and @earendil-works/pi-coding-agent/client RemoteSession controller with transcript reducers. See Pi Client and Remote Protocol (#7344, #7348, #7371, #7409).
  • Added CredentialSynchronizationError for credential changes that commit successfully but fail to synchronize local model state.
  • Added chainable pi.registerMarkdownTransformer() hooks for display-only transformation of user and assistant Markdown. See pi.registerMarkdownTransformer() (#7231 by @xl0).
  • Added an experimental fullscreen TUI mode, selectable through --tui-mode fullscreen or /settings (#7304).
  • Added runtime switching between regular and fullscreen TUI modes through /settings.
  • Added a sticky editor, status, widget, and footer dock to fullscreen mode while keeping the transcript independently scrollable.
  • Added a draggable transcript scrollbar to fullscreen mode with configurable auto, always, and hidden modes through /settings; always reserves the rightmost column.
  • Added page scrolling and marked-message navigation shortcuts to fullscreen mode.
  • Added an optional scrollbarThumb theme color for fullscreen scrollbar thumbs, falling back to selectedBg.
  • Added configurable themed Unicode rendering for supported Mermaid diagrams in interactive messages, including optional rendering while streaming. See Markdown settings (#7624 by @xl0).
  • Added opt-in Ctrl+P/Ctrl+N prompt history navigation, with explicit history bindings taking precedence over application shortcuts while the editor is focused.
  • Added per-directory AGENTS.override.md context files, which replace AGENTS.md or CLAUDE.md in the same directory while preserving context from other directories. See Context Files (#7681 by @Marvae).
  • Added AI_AGENT=pi to CLI and RPC child-process environments for generic agent attribution. See Environment Variables (#7493 by @renaudhartert-db).
  • Added inherited terminal-friendly Unicode rendering for LaTeX expressions in Markdown. See TUI Markdown.
  • Added stacked transient notifications in fullscreen mode.
  • Added arbitrary OpenAI-compatible model sampling parameters through samplingParams in models.json, model overrides, extension providers, and stream options. See Sampling Parameters (#7568 by @mrexodia).
  • Added inherited opt-in vLLM thinking_token_budget support for OpenAI-compatible models, reserving output tokens for the final answer (#7638 by @bnsd55).
  • Added inherited support for OpenAI-compatible streams that omit finish_reason, using compat.supportsFinishReason to infer normal and tool-use stops when the stream ends. See OpenAI Compatibility.
  • Added inherited deferred provider request contracts, durable response handles, authenticated fetch/cancel dispatch, and faux-provider support for pending, ready, failed, and cancelled responses (#7339 by @davidbrai).
  • Added inherited vendor-neutral telemetry contracts plus agent-owned typed AI-request and harness schemas, composed span starters, and callback helpers. See the agent telemetry schema reference.
  • Added inherited structured Amazon Bedrock failure diagnostics with HTTP status, modeled error code, and AWS request id when available (#7286 by @brianstanley).
  • Added inherited AgentOptions.shouldStopAfterTurn for gracefully stopping after a completed turn before queued messages or another model call are processed. See Agent Options (#7367 by @acmerfight).
  • Added inherited v4 JsonlSessionRepo support for append-only JSONL harness sessions (#7611 by @davidbrai).
  • Added inherited bounded branch-entry and indexed open-operation recovery queries to the v4 session API (#7448, #7646).
  • Added the inherited compile-complete AgentHarness v2 scaffold; unfinished operation paths reject with HarnessNotImplemented while durable execution is implemented.

Changed

  • Added inherited optional cancellation to pi-ai ModelsStore reads, writes, and deletions; catalog orchestration binds these waits to the provider refresh signal.
  • Reduced the inherited default fullscreen mouse wheel step from three lines to one for finer scrolling.

Fixed

  • Fixed the footer showing (sub) for generic OAuth/OpenID sign-ins without a known subscription; extension OAuth providers can opt in with isSubscription.
  • Fixed inherited OAuth token refreshes so stalled requests release the credential-store lock (#7508).
  • Fixed inherited tool argument validation to preserve values that already match an anyOf/oneOf union arm before coercion, avoiding nullable unions converting null to another primitive value (#7328).
  • Fixed inherited Fireworks GLM 5.2 requests sending the unsupported prompt_cache_retention field when long cache retention is enabled, and enabled session affinity for automatic prompt caching (#7676).
  • Fixed inherited JsonlSessionRepo enforcing session IDs globally across working directories; IDs are now unique within each working directory.
  • Fixed inherited JSONL session forks and torn-tail repairs to publish atomically, avoiding partially written or corrupted sessions after interrupted writes (#7707 by @davidbrai).
  • Fixed path-containing find globs returning no results on Windows (#6817).
  • Fixed messages queued during manual /compact failing instead of being sent after compaction completes.
  • Fixed Git Bash, MSYS, Cygwin, and WSL drive paths passed to built-in file tools resolving against the current Windows drive instead of their native drive (#7064, #7547).
  • Fixed project-level nested provider retry settings replacing unmodified global provider retry settings (#7572).
  • Fixed inherited GitHub Copilot Grok 4.5 requests to use the supported Responses API (#7560).
  • Fixed fullscreen shutdown leaking terminal capability-query replies into the parent shell prompt.
  • Fixed bare exact --model IDs shared by multiple providers choosing the first catalog entry instead of the sole authenticated provider or a clear ambiguity error (#7327).
  • Fixed standalone x64 binaries requiring Haswell-era AVX2/BMI2 instructions by compiling release executables against Bun's baseline runtime (#7390 by @davidbrai).
  • Fixed Ctrl+X copy confirmations in fullscreen mode adding a transcript status line instead of showing the transient Copied! marker.
  • Fixed Kitty image previews in fullscreen mode overlapping the sticky editor and footer dock while scrolling.
  • Fixed image-heavy fullscreen sessions lagging when layout changes retransmitted visible Kitty image payloads and rendered the transcript twice per frame.
  • Fixed spaces in /settings searches toggling the highlighted setting while typing multi-word queries such as TUI mode or Quiet startup.
  • Fixed custom editors not inheriting the default editor's autocomplete dropdown item limit (#7333).
  • Fixed malformed resource arrays in package manifests crashing session startup (#7187).
  • Fixed the DOOM overlay example downloading its shareware WAD from a dead URL.
  • Fixed setToolsExpanded(false) to be a no-op when tool output is already collapsed, avoiding redundant Tool output: collapsed startup notices from extensions (#7292).
  • Fixed extension-driven model calls in custom compaction, handoff, and Q&A examples to dispatch through the coding-agent model runtime so custom providers and resolved auth options are preserved (#7325).
  • Fixed long-running sessions using stale credentials after another process updates auth.json without serializing concurrent credential reads and delaying startup (#7319).
  • Fixed concurrent models-store.json reads forming a file-lock convoy and delaying startup.
  • Updated the packaged brace-expansion dependency to 5.0.8 to address GHSA-mh99-v99m-4gvg (#7316).
  • Fixed forced model availability refreshes remaining blocked behind a stalled earlier refresh (#7301, #7421 by @a-yeyang).
  • Fixed /model catalog refresh failures to identify every catalog that failed.
  • Fixed provider login remaining stuck after saving credentials when a model catalog refresh stalls by separating local credential consistency from bounded background freshness (#7027, #7113, #7418).
  • Fixed /scoped-models waiting for remote catalogs before rendering instead of showing cached models and cancelling refresh on close (#7153).
  • Fixed /model <name> waiting for catalog refresh before checking cached model matches (#7443).
  • Fixed stale availability snapshots and errors publishing after a newer availability pass.
  • Fixed stale pi.dev, Radius, llama.cpp, and extension catalog refreshes publishing after a newer provider refresh.
  • Fixed cancellation while waiting for file-backed credential or model-catalog locks, preventing cancelled mutations from running or committing later.
  • Fixed concurrent in-memory credential mutations losing unrelated provider updates by serializing their read-modify-write sections.
  • Updated undici to 8.9.0 and the packaged brace-expansion to 5.0.9 to address GHSA-8xcm-r25x-g524, GHSA-4cwx-7wf7-3272, GHSA-m8rv-5g2x-5cg5, GHSA-jr45-8vmc-qm54, GHSA-v3r7-h72x-cjcm, and GHSA-rgw5-rvv9-x895.
  • Fixed GitHub Copilot compaction and branch summaries using the Individual endpoint instead of the credential-resolved Business or Enterprise endpoint (#6768).
  • Fixed extension model calls dropping credential-resolved endpoints when forwarding request authentication, including custom compaction with GitHub Copilot Business and Enterprise accounts (#7579).
  • Fixed fullscreen transcript navigation leaving no editor-accessible Home, End, PageUp, or PageDown variants by adding Ctrl-modified editor bindings (#7574).
  • Fixed extension event-bus listeners surviving session reloads and disposal (#7656 by @tudoroancea).
  • Fixed /copy failing to read clipboard text on Wayland when no X11 clipboard is available (#7387).
  • Fixed slow connections failing during the initial connection attempt by increasing the connect timeout (#7435 by @muyiyr).
  • Fixed oversized images returned by extension and built-in tools bypassing automatic image resizing. See Image settings (#7330 by @tizmagik).
  • Fixed session discovery missing sessions stored through symlinked directories (#7552 by @muyiyr).
  • Fixed manual compaction racing with threshold auto-compaction (#7370 by @davidbrai).
  • Fixed responses truncated below their intended output limit ending the run instead of compacting and retrying once (#7540 by @davidbrai).
  • Fixed Git package updates leaving dependencies missing when git clean cannot remove an ignored dependency directory (#7570 by @mrexodia).
  • Fixed find results from POSIX and Windows filesystem roots losing the first path segment or gaining duplicate trailing separators (#7569 by @petrroll).
  • Fixed transient version-check, catalog, managed-tool, and package-management HTTP failures not being retried (#7632 by @petrroll).
  • Fixed interactive errors ignoring the configured output padding.
  • Fixed the inherited OpenCode Go provider display name.
  • Fixed inherited provider error normalization treating arrays and class instances as structured response bodies instead of preserving their original errors (#7205 by @erikogenvik).
  • Fixed inherited Anthropic streams dropping text or thinking included in the initial content-block event (#7358 by @davidbrai).
  • Fixed inherited Google history conversion dropping signed empty text and thinking blocks required for replay (#7362 by @jingtao-wisdomgraph).
  • Fixed inherited OpenAI Codex cached WebSocket sessions being shared across different account credentials (#7364).
  • Fixed inherited transient Google Generative AI and Vertex AI provider errors bypassing automatic retries (#7471 by @vish-pr).
  • Fixed inherited Gemini 3 tool call ids being discarded during history conversion, breaking signed multi-turn replay (#7494 by @muyiyr).
  • Restored inherited GitHub Copilot models returned through account-specific policy responses (#7672 by @muyiyr).
  • Replaced the inherited retired Qwen Token Plan qwen3.8-max-preview model with qwen3.8-max (#7670 by @QuintinShaw).
  • Fixed inherited terminal width accounting for Indic conjunct grapheme clusters (#6987 by @petrroll).
  • Fixed inherited nested fullscreen stack layouts ignoring child minimum sizes.
  • Fixed inherited batched terminal color-scheme reports being parsed as one malformed response (#7550).
  • Fixed inherited terminal progress clearing to emit the complete OSC 9;4 sequence (#7581).
  • Fixed inherited iTerm2 image payloads omitting the size metadata required by the xterm.js image addon (#7612).
  • Fixed inherited width truncation leaving OSC 8 hyperlinks unterminated (#7657 by @xXJSONDeruloXx).
  • Updated inherited GPT-5.6 Terra and Luna pricing across OpenAI and passthrough model catalogs.
  • Fixed inherited Fireworks Kimi K3 models to use the OpenAI-compatible API with native reasoning-effort levels and deferred tools (#7199, #7230 by @XBeg9).
  • Updated the inherited Groq Qwen reasoning override for the replacement qwen/qwen3.6-27b model.
  • Fixed inherited Windows Shift+Enter detection by reading modifier state from the native Win32 helper.
  • Fixed the inherited pi-tui npm package omitting the source and build scripts needed to rebuild its Windows and Darwin native addons.
  • Fixed inherited Windows console truecolor detection when Windows Terminal does not provide WT_SESSION to child shells.
  • Fixed inherited phantom fullscreen text selection from unmatched mouse events when changing terminal pane focus.
  • Fixed inherited keyboard input rendering latency on Windows by letting input preempt the throttled render timer.
  • Fixed inherited agent harness path handling on Windows for file basenames, recursive skill loading, and prompt template names.