@oh-my-pi/pi-ai
Fixed
- Fixed OpenRouter cost reporting to use the provider's authoritative account charge instead of catalog token-price estimates on both Responses and Chat Completions streams.
- Fixed OpenAI Responses and Chat Completions requests forwarding unsupported sampling parameters such as
temperatureto o-series and GPT-5+ models, preventing 400 errors for mnemopi memory calls through GitHub Copilot GPT-5.6 Luna. (#5606) - Fixed boolean JSON Schema subschemas (
true/false) in MCP tool inputs triggering400 INVALID_ARGUMENTon the Google/Cloud Code Assist (Antigravity) transport by coercing them to their object equivalents (true→{},false→{ not: {} }) before sending (#5604). - Fixed thinking-enabled Claude requests routed to
google-vertexsending theeffort-2025-11-24beta as ananthropic-betaHTTP header, which Vertex rawPredict rejects with a 400. The effort beta and theoutput_config.effortfield are now gated off the Vertex path the same waycontext-management-2025-06-27already is (#5614). - Fixed custom and Foundry-routed Anthropic endpoints receiving first-party eager/legacy tool-streaming controls (#5572).
- Parsed Ollama NDJSON response bytes directly instead of decoding and buffering every network chunk as text. (#5542)
- Fixed Amazon Bedrock stream error handling for non-
Errorvalues thatJSON.stringifycannot serialize (#5539). - Fixed concurrent provider OAuth refreshes by serializing rotating-token updates across processes, fencing stale writes, and preventing background usage probes from disabling otherwise usable credentials (#5396).
- Fixed OpenAI Codex WebSocket connections ignoring
PI_PROXY, provider-specific proxy settings, and standard HTTPS/ALL proxy variables (#5384). - Fixed Anthropic account quota exhaustion (
This request would exceed your account's monthly spend limit) hanging until the local deadline instead of surfacing the error: therate_limit_error"spend limit" wording is now classified as a persistent usage limit, so it fails fast and rotates to a sibling credential rather than looping in the provider retry backoff. (#4787) - Fixed OpenRouter daily free-model allowance errors (
free-models-per-day) being treated as transient rate limits, so requests rotate from an exhausted API key to a healthy sibling credential. (#4832)
@oh-my-pi/pi-catalog
Added
- Added GPT-5.6 Luna, Sol, and Terra entries for Amazon Bedrock, Azure, and Cloudflare
- Added KAT-Coder Air/Pro V2.5 entries across Kilo, OpenRouter, NanoGPT, and Vercel
- Added Inkling model entries for Baseten and Vercel AI Gateway
- Added Umans DeepSeek V4 Pro DSpark as an experimental model listing
- Added Claude Opus 4.7 Fast and 4.8 Fast on Vercel AI Gateway
- Added Workers AI GLM-5.2, Muse Spark 1.1, Stealth GPT-5.6 Sol, and nano-gpt-help entries
Changed
- Added image input and reasoning support to several existing Codeium and Kilo GPT-5.6 models
- Enabled image input and reasoning for Gemini Flash Latest and Grok 4.5
- Renamed many model labels for consistency, including Claude, Grok, DeepSeek, GLM, and Gemini names
- Updated pricing for many existing models, including input, output, and cache cost values
- Updated context window and max token limits for many catalog models across providers
Fixed
- Fixed Z.AI (GLM) coding-plan token costs all showing as "Free" in
/models: thezaiprovider descriptor sourced the models.devzai-coding-plankey (all-$0 subscription rates) instead of thezaipay-as-you-go key, which carries the real per-token rates for the identical GLM ids (#5598). - Fixed custom Anthropic endpoints receiving the first-party-only
eager_input_streamingtool field by default (#5572). - Added resolved OpenAI sampling-parameter compatibility metadata for o-series and GPT-5+ models.
- Fixed GitHub Copilot
mai-code-1-flash-picker(and othermai-*models) to route through the/responsesendpoint instead of/chat/completions, which rejected them with400 unsupported_api_for_model(#5612). - Extended the reasoning
streamIdleTimeoutMsfloor (300s) to native Kimi K2.7 Code (kimi-k2.7-code/kimi-k2.7-code-highspeed), which previously fell through to the 120s default and aborted on long reasoning turns (#4836). - Fixed GLM-5.x coding-plan streams via the OpenCode Go/Zen gateways (
opencode.ai/zen/…) timing out withOpenAI completions stream stalled while waiting for the next eventduring slow plan-writing/reasoning phases. The 600s idle-timeout floor for GLM coding-plan SKUs was gated to the native Z.AI/Zhipu hosts only, so OpenCode-fronted GLM fell back to the 120s default watchdog. (#4758)
@oh-my-pi/pi-coding-agent
Changed
- Fixed a crash when a plugin/custom tool renderer returns a component that throws during its later
render()pass (e.g.TypeError: th.bold is not a functionfrom a plugin that styles its header off an object without aboldmethod).ToolExecutionComponentnow wraps every renderer-returned call/result component so a throwingrender()degrades to the safe fallback (tool label or raw result text) instead of taking down the transcript (#4978).
Fixed
- Fixed the
omp grepCLI subcommand failing on paths with a stray leading colon (e.g.:/abs/path); it now routes the path argument throughexpandPathlikeread/edit/in-agentgrep. BroadenedexpandPath's leading-colon strip to also recover Windows-style shapes (:C:\repo\file,:.\src,:..\rel,:\\server\share) (#5624). - Fixed the
tailbuiltin exiting the entire omp process with code 13 on Windows when its output pipe broke (e.g.seq ... | tail -n 3 | head -n 0); a broken pipe now surfaces as a normal error instead of callingstd::process::exit(#5609). - Fixed a late advisor
blockerafter a terminal primary answer being deferred to the next user turn instead of continuing the current turn:resolveAdvisorDeliveryChannelpreserved every interrupting severity as a passive card once the primary ended with a terminal text answer and no queued work remained, so ablockerflagging a mistake in the final output sat idle until the next prompt. Ablockernow steers a triggered turn so the primary acknowledges and continues before the turn is considered done; a lateconcernstill preserves as a visible card (#5628). - Fixed independently keyed extension hook statuses sharing one truncated line; each status now renders on its own deterministic line (#5617).
- Fixed xAI web search bypassing configured
xai/xai-oauthproxy endpoints and headers, while preventing official OAuth tokens from being sent to custom endpoints (#5599). - Fixed
models.ymlrejecting the Anthropiccompat.supportsEagerToolInputStreamingoverride for custom endpoints (#5572). - Fixed long streamed table responses duplicating in terminal scrollback when later rows widened an earlier column.
- Fixed Bash internal URLs remaining unresolved when used as unquoted arguments inside command substitutions (#5535).
- Fixed the built-in
fdprintingfd: Broken pipe (os error 32)when a downstream pipeline reader exited early (e.g.fd … | head); it now exits silently with 141 (128+SIGPIPE), matching real fd. - Fixed prewalk repeatedly continuing after a bash-only task such as
commithad already completed (#5551). - Fixed the Codex
config.tomlMCP importer droppingcwdand leaving relativecommandvalues unrooted, which broke the bundled Codex Computer Use server (ENOENTon spawn); relativecommand/cwdnow resolve against the Codex config directory like the claude-plugins/omp-plugins providers (#5561). - Fixed streamed replace-mode edits with
ssh://paths terminating the active prompt before normal tool dispatch (#5552). - Fixed concurrent provider OAuth refreshes from invalidating Anthropic's rotating refresh token, and prevented background usage probes from permanently disabling credentials after refresh failures (#5396).
- Restored the regression test guarding compiled-binary web-search header generation:
browser-headers.tslazily constructsheader-generatorand falls back to a static Chrome profile when itsdata_filesare absent, but the test defending that contract had been removed. Without the guard, a compiled binary threwENOENTat import time, breaking the Bingweb_searchprovider (undefined is not a constructor) and extension loading /omp plugin install. (#5256) - Fixed browser tabs hanging indefinitely at
Closing <tab>when a worker, CDP target, browser process, or cmux surface stalls during teardown; close deadlines now release the operation with backend, tab, and pending-resource diagnostics. (#5259) - Fixed the
agent://<parent>/<child>slash form failing to resolve a nested subagent's output: the path segment was always treated as a jq JSON-extraction key against<parent>.md, so a precise-planner reading its own scout child (agent://Plan/Scout) gotNot found. The slash is now a hierarchy separator first (agent://Parent/Child→Parent.Child.md), falling back to JSON extraction only when no nested output matches the path. (#5238) - Fixed fullscreen Plan Review jumping to the top while scrolling when a transient terminal resize or Markdown reflow made the body temporarily non-scrollable. (#5232)
- Fixed
generate_imagepreferring Antigravity over the active session provider and stopping instead of trying the next credentialed provider after an image HTTP failure. (#5218) - Fixed
/reload-plugins, plugin setting changes, andmanage_skillwrites leaving runtime skills andskill://resolution stale until restart; sessions now rediscover enabled skills and rebuild/skill:<name>commands before the next prompt (#4996). - Fixed documented
omp marketplace/discover/upgrade/uninstall/enable/disableCLI verbs silently leaking to the model as a launch prompt instead of managing plugins.omp marketplace add xyz(and similar multi-word invocations following the documentedomp plugin <action>grammar) now surface a hint pointing at the realomp plugin <action>command, while genuine prose prompts beginning with these words still route tolaunch(#4845). - Fixed
/mcp,/mcp list, and/toolsoutput duplicating in terminal scrollback when invoked during agent streaming by deferring command panels until the active turn ends (#4806). - Fixed bash/eval/ssh output that was only per-line column-capped being misreported as byte-window truncation, which appended a bogus
Showing lines X-Y of Z (…B limit). Read artifact://N for full outputfooter even though every line was shown. Column-cap trimming now surfaces solely as theSome lines truncated to N charsnotice (#4735). - Fixed the
nerdstatus-line preset's session icon using a removed Nerd Fonts v2 codepoint instead of the current Nerd Fonts v3 mapping (#4795). - Fixed omp crashing at startup (
TypeError: undefined is not an object (evaluating 'this.#theme.symbols.boxRound')) after installing a plugin whose custom editor subclassesCustomEditor/Editorand forwards the upstream-pisuper(tui, theme, keybindings)constructor — the arg order thatsetEditorComponent's factory contract advertises.CustomEditornow resolves the realEditorThemeby shape rather than position and captures a leadingTUIfor plugin overrides (#4766). - Fixed
Otherresponse editors leaving Windows Terminal IME candidate windows at the terminal edge by forwarding dialog focus to the nested editor (#4760). - Rendered and persisted native OpenAI Responses
image_generation_callresults as session images (#4768). - Fixed ACP stdio EOF/EPIPE disconnects bypassing awaited session teardown and leaving in-flight tool calls pending in persisted rollouts (#4788).
- Routed the print-mode assistant-error/aborted exit, RPC
pi.shutdown()and stdin-EOF shutdowns, and the extension command-contextshutdown()through the awaited, idempotentsession.dispose()beforeprocess.exit(), so the bounded browser reaper (releaseTabsForOwner) always runs and OMP-owned Chromium no longer outlives the process (#5643).
Removed
- Fixed
/loginfor paste-code providers (Codex, Anthropic, Gemini CLI, GitLab Duo, Antigravity, Devin) dropping the pasted fallback redirect URL: the login dialog captured focus but never mounted an input, and the "complete pairing with/login <url>" tip pointed at the hidden, unfocused editor. The dialog now mounts a focused input for the manual code/URL paste (#5339). - Fixed
/tanand/forkclones cold-missing the provider prompt cache: the per-turn supersede/useless-result prune rewrote the live context without persisting it, so file-based forks and resume rebuilt a divergent (un-pruned) prefix and re-wrote the entire cache - Fixed
/tanpinning the clone's prompt-cache key to the parent's session id instead of the parent's effective cache key, dropping shard affinity when the parent was itself a fork or tan - Fixed
/resumeand plan approval exposing the previous session while their asynchronous session replacement was still loading by keeping fullscreen overlays mounted until the rebuilt transcript is ready (#5319). - Fixed inconsistent history rendering when toggling the display setting for compacted items
- Fixed configured
retry.fallbackChainsnever engaging on non-retryable provider errors (e.g. "Cloud Code Assist API returned an empty response"): a hard error on a model covered by a fallback chain now switches to the next candidate instead of failing the turn, while still never backoff-retrying the failing model itself - Fixed transcript rebuilds (compaction,
/compact, and toggling history display) repainting content below stale scrollback when collapsing history; rebuilds now correctly clear the scrollback buffer when history is collapsed - Improved auto-compaction to automatically drop images and elide content when context is tight, and added persistent warning badges to the compaction divider when manual intervention is required
- Fixed backgrounded Bash blocks continuing to repaint with live and final job output; they now freeze with a compact job notice while completion is delivered separately
- Fixed the downshift plan nudge silently ending the run with no code written when the model answered with a text-only reply (no tool call): the agent loop treats a tool-call-free turn as a natural stop and never prompts again, which the nudge's own "write the plan in your next reply" instruction makes common. The nudge now explicitly tells the model this is a checkpoint, not a final answer, and the session forces one more turn whenever a post-nudge reply lands with zero tool calls
- Fixed launch tool rendering stacking a stale pending header over a bare
✓ Launchline and raw text: the tool now uses a merged registry renderer with one per-op status header (op, target,state · pid · uptimemeta), stripped log cursor suffixes, capped collapsed log/list previews, and a launch tool glyph - Fixed confusing launch start/wait results when readiness timed out with the log pattern already matched (readiness needs log AND port): the result printed a contradictory
Ready: <match>next toReadiness timed outwithout naming the failing condition. Daemon snapshots now carry the unmet conditions (readyPending), and start/wait results state exactly what never happened (e.g.port 3100 on 127.0.0.1 never accepted connections); the TUI shows awaiting on portbadge on starting daemons - Fixed the in-process
statbuiltin mangling BSD-style invocations likestat -f "%Sm %N" file(macOS muscle memory): GNU-fmeans--file-system, so the format string was treated as a file operand — printing filesystem info for the real operands and erroring withcannot read file system information for '%Sm %N'. A-fwhose format value contains%is now detected as BSD syntax and translated to the GNU equivalent (%Sm→%y,%N→%n,%z→%s, epoch/S-form times, owner/group/permission andH/Lsub-field directives,-L/-n/-q/-Fflag clusters, with%n/%tas literal newline/tab); directives with no GNU counterpart fail with a clearunsupported BSD format directiveerror - Fixed the remaining GNU-flavored shell builtins that broke under macOS/BSD muscle memory, using the same unambiguous-detection approach as the
statfix (only invocations that are invalid or nonsensical under GNU semantics are reinterpreted; unsupported BSD forms fail loudly instead of producing wrong output):date -r <epoch>formats the epoch when no such file exists (GNU-r FILEmtime preserved), signeddate -v±N<unit>adjustments translate to-drelative dates and-jis accepted (-j -fstrptime parse mode and field-set-verror clearly);sed -i '' 's/…/…/' filedrops the BSD empty backup-suffix token instead of treating it as the script;mktemp -t prefixwithout X's creates$TMPDIR/prefix.XXXXXXXXXX(the GNUtoo few X'serror path);tail -rreverses input by delegating totac(with-n/-c/-fcombinations erroring clearly);find -Emaps to-regextype posix-extendedahead of the expression;base64 -Ddecodes as an alias of-d; andln -sfhworks via a-halias of--no-dereference(clap's-hhelp short is dropped to match real GNU/BSD ln;--helpunchanged) - Fixed the browser tool crashing the whole process (parent session and every subagent) when a CDP world re-acquire failed mid-navigation: the stealth
puppeteer-corepatch called the baredebugErrorlogger, which isundefinedwhile thepuppeteer:errordebug channel is disabled (the default), turning a transient acquire failure into a fatalTypeErrorunhandled rejection. The patchedFrameManager/WebWorkeracquire paths now usedebugCatchError(#5296) - Fixed a role with a
:highthinking suffix resolving to a longer sibling model whose id embeds the tier name (e.g.kimi-for-coding:high→kimi-for-coding-highspeed). The thinking suffix is now stripped before any fuzzy match, soprovider/model:highkeeps the exact model at high effort (#5151).
@oh-my-pi/collab-web
Fixed
- Rendered user and host transcript messages as Markdown and separated adjacent assistant content blocks. (#5559)
@oh-my-pi/pi-mnemopi
Fixed
- Fixed working-memory TTL trim silently deleting restored or imported durable rows: rows keeping
consolidated_at = NULLwith an oldtimestampare no longer trimmed when flaggedIMPORTED,importFromDictstamps imported rows as consolidated, and every working-memory delete path (trim,forgetWorking, force-import overwrite) now cascades linked annotations, embeddings, facts, memoria projections, gists, and graph edges instead of leaving orphans. (#4819) - Fixed Mnemopi local embeddings on Windows loading an unrelated
onnxruntime.dllfrom the inherited system path instead of fastembed's cached ORT runtime. (#4849)
@oh-my-pi/pi-natives
Fixed
- Fixed the pi-natives version sentinel emitting "reinstall to re-sync" when a long-lived process survives an in-place upgrade: the loader now detects that the resident addon exposes a prior release's sentinel and reports "omp was upgraded while this session was running — restart to pick up the new version (disk is already consistent)" instead of misdiagnosing it as a stale on-disk file (#4812).
@oh-my-pi/pi-tui
Added
- Added native cmux notification delivery targeted to the current terminal surface.
Fixed
- Fixed a tmux regression where every non-Kitty pane was forced into legacy keyboard input, collapsing Ctrl+H into Backspace and Shift+Enter into Enter even with
extended-keys on; the xterm modifyOtherKeys fallback is requested again so tmux honors or ignores it per its ownextended-keyssetting (#5620). - Fixed
@file-reference and path completion falling through incorrectly inside slash command arguments when command-specific argument completion has no matches (#5580). - Fixed streamed Markdown tables reflowing rows already written to native scrollback when later cells widen a column.
- Fixed fullscreen session-replacement overlays and resize drags exposing stale normal-buffer frames on terminals without effective DEC 2026: asynchronous replacements now keep their overlay visible until the rebuilt transcript is ready, overlay exit is fused into the destructive paint, and resize viewport frames rewrite the normal buffer without alternate-screen switches. Inconclusive DECRQM probes also no longer disable statically detected synchronized output (#5319).
- Fixed autocomplete popups moving Windows Terminal IME candidate windows away from the prompt by keeping the terminal cursor anchored at the text insertion point (#4760).
@oh-my-pi/pi-utils
Fixed
- Added scoped graceful handling for stdio-write EPIPE rejections so protocol servers can await postmortem cleanup when their peer disconnects (#4788).
What's Changed
- fix(editor): accept upstream-pi editor constructor in CustomEditor by @roboomp in #5415
- fix(ai): classify Anthropic spend-limit as persistent usage limit by @roboomp in #5418
- fix(acp): await teardown on stdio disconnect by @roboomp in #5419
- fix(tui): use Nerd Fonts v3 session icon by @roboomp in #5421
- fix(tools): stop column cap from faking window truncation by @roboomp in #5422
- fix(natives): distinguish process-stale from disk-stale sentinel mismatch by @roboomp in #5423
- fix(tui): defer command output during streaming by @roboomp in #5427
- fix(catalog): extend streamIdleTimeoutMs floor to Kimi K2.7 Code by @roboomp in #5428
- fix(ai): fail over exhausted OpenRouter daily keys by @roboomp in #5429
- fix(mnemopi): pin Windows ORT DLL path by @roboomp in #5432
- fix(mnemopi): protect durable working memory from trim and cascade linked artifacts by @roboomp in #5434
- fix(cli): guard documented marketplace verbs from launch leak by @roboomp in #5436
- fix(tui): guard plugin tool renderer components against render crashes by @roboomp in #5438
- fix(tools): prefer active image provider and fall back by @roboomp in #5443
- fix(tui): preserve Plan Review scroll position by @roboomp in #5444
- fix(model-resolver): strip thinking suffix before fuzzy model match by @roboomp in #5447
- test(coding-agent): guard compiled header fallback regression by @roboomp in #5452
- fix(browser): bound tab teardown waits by @roboomp in #5453
- fix(coding-agent): resolve agent:// slash form for nested subagent output by @roboomp in #5462
- fix(browser): use debugCatchError in stealth acquire paths by @roboomp in #5473
- fix(tui): prevent stale-buffer flicker by @roboomp in #5476
- fix(auth): mount login dialog input for paste-code fallback URL by @roboomp in #5484
- fix(ai): honor proxies for Codex WebSockets by @roboomp in #5510
- fix(skills): reload runtime skill state by @roboomp in #5515
- fix(auth): serialize provider OAuth refreshes by @roboomp in #5519
- fix(session): skip ssh paths during streaming edit pre-cache by @roboomp in #5554
- fix(collab-web): render user and host messages as markdown by @roboomp in #5560
- fix(discovery): root Codex config.toml MCP command/cwd at config dir by @roboomp in #5562
- fix: disable eager tool streaming for custom Anthropic endpoints by @roboomp in #5573
- fix(tui): stabilize streamed table scrollback by @pppobear in #5574
- fix(tui): restore file completion in slash arguments by @roboomp in #5581
- fix(web-search): honor configured xAI transport by @roboomp in #5601
- fix(agent-loop): reclassify empty toolUse stop as retryable error by @roboomp in #5602
- fix(catalog): sourced zai GLM pricing from PAYG models.dev key by @roboomp in #5603
- fix(schema): coerce boolean subschemas for google/cca transport by @roboomp in #5607
- fix(ai): omit sampling params for OpenAI reasoning models by @roboomp in #5608
- fix(tail): stop windows broken-pipe flush from killing omp by @roboomp in #5610
- fix(catalog): route Copilot mai-code models to the /responses endpoint by @roboomp in #5613
- fix(anthropic): gate effort beta off google-vertex header path by @roboomp in #5615
- fix(tui): render keyed hook statuses separately by @roboomp in #5619
- fix(tui): restore modifyOtherKeys fallback in tmux by @roboomp in #5621
- fix(tui): route notifications through cmux by @usr-bin-roygbiv in #5623
- fix(tool): route omp grep CLI path through expandPath by @roboomp in #5625
- fix(advisor): steer late blocker after terminal answer by @roboomp in #5631
- fix(catalog): widen GLM coding-plan idle timeout to OpenCode gateways by @roboomp in #5408
- fix(tui): anchor IME candidates in interactive inputs by @roboomp in #5412
- fix(openai): render native response images by @roboomp in #5417
New Contributors
Full Changelog: v17.0.0...v17.0.1