Release · Oh My Pi · can1357

Oh My Pi v18.14.0

What's new in Oh My Pi v18.14.0, released Oct 29, 2026 (). Newer: v18.18.0 (Nov 7, 2026)

Release notes

Oh My Pi v18.14.0

@oh-my-pi/pi-agent-core

Breaking Changes
  • Removed the Bun event-loop workaround utilities from @oh-my-pi/pi-agent-core/utils/yield; agent loops no longer insert cooperative sleeps while streaming or between tool calls.
Added
  • Added AgentTool.approvalRestrictionPaths so tools can report the paths they read, allowing restricted-folder approvals to cover those paths without remembering approval separately for each path.
  • Added Agent.logContext, which adds custom context fields to every log record written during an agent run.

@oh-my-pi/pi-ai

Breaking Changes
  • Moved Anthropic header and endpoint helpers, along with Codex session/transport inspection and OpenAI Responses replay/storage helpers, to dedicated provider modules. Update imports from the previous locations.
  • Updated auth-gateway model resolvers to receive ModelResolveOptions, including the route's native API wire and the scoped client's accepted grants. Scoped client IDs no longer fall back to scanning all models; resolvers now select the best permitted candidate.
Added
  • Added mTLS support for Anthropic connections through the CLAUDE_CODE_CLIENT_CERT and CLAUDE_CODE_CLIENT_KEY environment variables.
Changed
  • Provider implementations are now loaded on demand, reducing startup and memory overhead while preserving existing stream timeouts, cancellation, and host overrides.
  • Account policy priority now takes precedence when usage information is temporarily unavailable, keeping new sessions on the preferred account.
  • Improved provider-specific credential usage lookups so they no longer wait for unrelated providers, while preserving cache freshness, cancellation isolation, and complete aggregate reports. The corresponding server-side latency improvement requires an updated auth broker.
  • Credential usage is now prefetched during session setup without selecting, pinning, or advancing the OAuth account rotation.
Fixed
  • Fixed Mistral thinking-message replay requests that could be rejected by LiteLLM with a 422 extra_forbidden error.
  • Fixed native Judge API requests missing the omp/<version> User-Agent, so omp usage is correctly identified in upstream statistics.
  • Fixed Codex capacity-error retries over WebSocket and SSE ignoring provider-supplied Retry-After delays and retrying too early.
  • Fixed cancelled OAuth refresh requests aborting the entire session, and ensured requests joining an existing refresh can still use the refreshed credential when the original request is cancelled.
  • Fixed Cursor models losing omp system-prompt context, including context files, skills, and rules, on subsequent turns or when earlier messages precede the active turn.
  • Fixed short-lived commands that refresh OAuth credentials, such as omp token --force-refresh, remaining open for several seconds after completing.
  • Fixed TypeSafe authentication when TYPESAFE_BASE_URL is configured by validating keys against the correct /v1/models endpoint.
  • Fixed forced tool calls on non-reasoning models causing an unhandled reasoning-effort error.
  • Fixed interrupted turns reporting a transport error instead of the caller-provided cancellation reason.
  • Fixed long-running pi-native turns being terminated before their first event by fetch or proxy timeouts by supporting keepalives and the configured first-event timeout.
  • Fixed pi-native clients crashing when the auth gateway reports an upstream failure during streaming.
  • Fixed Cursor turns failing after a mid-turn stream interruption when an automatic retry receives a zero-token provider error; retries now continue on the rotated conversation.
  • Corrected auth-gateway debug logs so they no longer claim a retry occurred when a usage-limit error was returned without retrying.

@oh-my-pi/pi-catalog

Breaking Changes
  • Removed the raw @oh-my-pi/pi-catalog/models.json export; use the bundled model registry APIs instead.
Added
  • Added nextBuildPriceChange(cost, now) to identify when a model's dated pricing card may change, allowing callers to safely reuse earlier builds until that time.
  • Added the selector-revision-suffix catalog axis for Google Vertex, so google-vertex/claude-opus-4-8 resolves exactly to claude-opus-4-8@default.
Changed
  • Reduced the bundled model catalog size and loading overhead.
  • Updated role defaults so Factory Droid image models are preferred for the image role, allowing generate_image to work with only a Factory login.
  • Updated smol and slow role defaults to use the currently bundled Cerebras and OpenAI Codex model identifiers.
Fixed
  • Fixed Mistral reasoning models so streamed thinking appears in the transcript and is preserved for subsequent turns.
  • Fixed later-turn HTTP 422 errors in Mistral-hosted DeepSeek conversations when assistant reasoning history is included.
  • Fixed DeepSeek V4.1 Flash image attachments being dropped for publisher-namespaced model IDs such as ds/deepseek-flash.

@oh-my-pi/pi-coding-agent

Breaking Changes
  • Custom tool loaders now resolve the injected host SDK themselves; constructors take cwd as their first argument instead of a pi namespace.
  • WebMCP now uses Chrome's native WebMCP support through WebMcpController, which accepts a Puppeteer Page. The former page-hook installation helpers, bridge constant, and page-hook types have been removed; Tern tabs no longer support WebMCP.
  • Provider-qualified model selectors in --model, settings, roles, and task agents must identify an exact model ID or alias. Near matches now fail with a helpful error and suggestions instead of silently selecting a sibling model. Bare selectors such as opus retain fuzzy matching, and the Google Vertex Claude alias remains supported. Older migrated web fallback chains replace the retired Codex entry with openai-codex/gpt-5.6-sol.
Added
  • Agents can send an interim response without ending the current task by writing Markdown to out:// (or using > out:// in bash), with streaming output up to 64 KiB. This is enabled by default in the interactive TUI and can be configured with out.enabled; it is disabled by default in print, RPC, and ACP sessions.
  • Added computer-tool approval modes: tools.approval["computer.control"] can allow unattended foreground control on dedicated machines or deny the request without prompting. The approval mode does not itself grant access.
  • Added optional task-file input (task.file=true), allowing subagent instructions to be loaded from an absolute UTF-8 file path or local:// URL with the submitted path and SHA-256 recorded (#17133 by @iliaal).
  • Sessions can be pinned or unpinned from the resume picker with Alt+K and Alt+Shift+K, or the remappable app.session.pin and app.session.unpin actions. Pinned sessions move to the top and take priority in search results (#9837 by @zhang17-24).
  • Added PI_LINK_SCHEME and optional PI_LINK_HOST, allowing file links from SSH or tmux sessions to open through a desktop protocol handler (#15855 by @KunoLu).
  • Extensions and RPC clients can start live voice sessions using their own WebRTC peer, including phone-browser clients, through ctx.startLive({ sdpOffer }) or live_connect (#17013 by @materemias).
  • Extensions can customize assistant-text rendering and rerender individual replies through the opt-in extensionRenderers.assistantText setting (#16238 by @materemias), and can register interactive link schemes with extension callbacks and renderer fallbacks (#16239 by @materemias).

…