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.approvalRestrictionPathsso 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_CERTandCLAUDE_CODE_CLIENT_KEYenvironment 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
prioritynow 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_forbiddenerror. - 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-Afterdelays 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_URLis configured by validating keys against the correct/v1/modelsendpoint. - 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.jsonexport; 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-suffixcatalog axis for Google Vertex, sogoogle-vertex/claude-opus-4-8resolves exactly toclaude-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
imagerole, allowinggenerate_imageto work with only a Factory login. - Updated
smolandslowrole 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).
…