@oh-my-pi/pi-agent-core
Added
- Added
SummaryOptions.remotePromptCacheKeyandremoteCompactionPolicyModel()so remote compaction can carry a cache key gated against the request it actually sends (#16988 by @rafalopilowski1)
Changed
- Remote compaction now sends cache and session headers for the endpoint and model the request actually uses, so a configured compaction override no longer inherits the live turn's routing (#16988 by @rafalopilowski1)
- Aside providers (
AgentLoopConfig.getAsideMessages,Agent.setAsideMessageProvider) now receive which boundary is polled,"work"after tool calls or"stop"at the end of a turn, so they can keep a message out of a finished turn (#16583 by @will-bogusz)
Fixed
- Fixed
--max-timevalues above about 596 hours (such as600h) aborting the first turn with "Deadline exceeded" right away (#17054 by @trukhinyuri) - Fixed repeated compaction on small or provider-capped context windows: compaction keeps only as much recent history as fits under the configured trigger, and no longer counts stale pre-compaction usage (#16904 by @eggpeat)
- Fixed native compaction token estimates counting opaque encrypted-state bytes as conversation text (#16904 by @eggpeat)
- Fixed split-turn compaction leaving
session.compactingcontext out of the turn-prefix summary (#16707 by @integrITsolutions) - Fixed compaction failing as a whole, and discarding the completed summary, when the optional short summary fails or returns no answer; the compaction now completes without a short summary, and cancellation still cancels it (#16942 by @Mouriya-Emma)
@oh-my-pi/pi-ai
Breaking Changes
OpenAIRequestSetupModelnow requires the catalog-policy fields (api,reasoning), so callers building a reduced model forresolveOpenAIRequestSetupmust pass them (#16988 by @rafalopilowski1)
Added
- Added
PI_ANTHROPIC_API_VERSION=2026-10-21to send Anthropic API version 2026-10-21 to the official Anthropic API; sampling parameters are omitted under that version, which rejects them (#16706 by @H4vC) - OpenCode Go requests on lanes that opt into shared prompt caching send an explicit prompt-cache key as
x-opencode-session, so Task siblings, forks and their parent reuse one gateway cache; custom providers declaringproviderType: "opencode-go"get the same OpenCode headers (#16988 by @rafalopilowski1)
Changed
- Reduced the CPU spent preparing tool schemas on every model call, so requests with many tools start faster (#16780 by @yuzu-octopus)
- Fixed tool schema normalization modifying the caller's schema in place, which added the folded
constvalue to a tool's ownenumarray (#16780 by @yuzu-octopus) - Google Antigravity requests now carry the same request labels as the official 2.26.0 client (
cascade_id,root_cascade_id,request_id,used_non_gemini_model), and image model lookup sends the account's project (#17012 by @apoc) - Google Antigravity requests now send each model tier's own
model_enumlabel, output cap and thinking setting from the serving account's model list, as the official client does: Claude 5.5 and Gemini 4 Argon tiers send a thinking level, Gemini 3.8 Flash tiers the tier's thinking budget (#17012 by @apoc) - Google Antigravity requests now number conversation steps like the official client (the first request is step 1, and each model turn and tool result adds one), send
Accept-Encoding: gzipwithout an explicitAccept, and no longer send the Claude thinking beta header to Claude 5.5 (#17012 by @apoc)
Fixed
- Anthropic-compatible endpoints that require a
thinkingblock on every turn of the current turn no longer replay a 400 when the history holds a turn an upstream answered without reasoning; the serializer pads those turns (#16739 by @lz37) - Fixed an Anthropic stream that a gateway or proxy cuts after
message_start, substituting an in-banderrorframe, being reported as a completed-turn provider failure instead of a retryable stream truncation (#16990 by @Maziar123) - Fixed Kimi Code, Z.AI, and ClinePass usage polls logging a warning every poll for accounts without a metered plan (#17057 by @trukhinyuri)
- Fixed Codex usage showing no limits for credit-billed ChatGPT Business/Enterprise seats:
/wham/usagereturnsrate_limit: nullfor them, and their per-user credit cap (spend_control.individual_limit) is now reported as aSpend cap (credits)limit that also gates chat requests when no plan windows exist (#16973 by @DusKing1) - Fixed overlapping OpenAI Codex requests in the same session (e.g. concurrent auth-gateway requests) closing the WebSocket another request was still streaming on; the later request now goes over SSE (#16812 by @Abelo9996)
- Fixed Codex WebSocket turns dying with
unsupported_native_inflight_messagewhen the native turn lane was still busy; the turn is now retried as an independent full-context request instead of surfacing the error (#17065 by @AgileInnov8tor) - Fixed OpenRouter native failures appearing as successful empty stops and malformed Responses being replayed before corrective recovery; metadata permission/rate-limit failures no longer trigger malformed-response recovery (#17063 by @martijnberger)
- Fixed Xiaomi MiMo API-key login failing with
Unsupported model mimo-v2.5after the V2.5 retirement (#16727 by @LiPu-jpg) - Fixed Xiaomi MiMo login rejecting
ttp-Token Plan keys with401 Invalid API Key; they now validate against the regional Token Plan hosts liketp-keys (#17045) - Fixed Xiaomi MiMo Token Plan login reporting
401 Invalid API Keywhen the key's own region rejected the probe for another reason; that region's actual error is now shown (#17045) - Fixed non-streaming requests reporting a missing API key when the credential resolver actually failed, hiding auth broker, OAuth and network outages behind "No API key" (#16655 by @adi-IL)
- Fixed Claude subagents with large structured output schemas failing with
Schemas contains too many optional parameters(#16887 by @alphastorm) - Fixed auth-gateway requests failing when a client requests an unsupported thinking effort; the gateway now uses the nearest supported tier (#16671 by @codyw912)
- Fixed Codex requests failing with
array schema must define itemswhen a tool or a task'soutputSchemadeclares an array withoutitems(#16886 by @alphastorm) - Fixed Anthropic tools whose parameters are a root
anyOf/oneOf/allOfof objects being sent as an empty closed object that only accepts{}; variant properties now fold into the rootinput_schema(#16630) - Fixed OAuth logins failing with
invalid_grantafter a token refresh took longer than 10 seconds: the refresh now finishes in the background and saves the provider's new refresh token (#16291 by @will-bogusz) - Fixed a tool call from a Claude model that declined mid-response still running after its server-side fallback model took over (#16250 by @will-bogusz)
- Added 1h prompt caching on Factory Droid's Claude models (Anthropic, Vertex, Bedrock and Azure upstreams) when you set cache retention to long, and cache warming plus cache-timed idle compaction on those models (#16296 by @will-bogusz)
- Fixed Factory Droid accounts whose login token lacks an organization getting 401 "User not affiliated with an organization" on every request: omp now resolves the account's organization at login and refresh (#14061) (#16257 by @will-bogusz)
- Added image generation and editing through a Factory Droid login:
generate_imageruns Factory's GPT Image 2.5, GPT Image 2.5 Flare and Gemini 3 Pro Image, with up to 16 reference images for GPT Image edits (#16316 by @will-bogusz) - Fixed OpenAI-compatible chat completions with Anthropic-style prompt caching (
cacheControlFormat: "anthropic", e.g. OpenRouter Claude) re-sending a turn's tool calls and results uncached on every tool-loop request; the cache breakpoint now advances onto the latest tool result (#16845) - Fixed native Google (
google-generative-ai,google-vertex) requests failing withThe operation timed out.after ~5 minutes of slow prefill even whenproviders.streamFirstEventTimeoutSecondsallowed longer (#16991) - Fixed
model.loopGuardsettings being ignored for providers routed through the shared option mapping, such asopenai-responsesmodels frommodels.yml(#11129, #16963 by @SipgateSteffenPaul) - Fixed Google Antigravity's Gemini 4 Argon weekly bucket sharing the generic "Gemini" label with the shared Gemini weekly bucket, leaving usage rows indistinguishable; the Argon bucket now reads "Gemini (Argon)" (#16790)
- Fixed Anthropic API-key requests with thinking off failing with 400 "context_management: Extra inputs are not permitted" on Claude Opus 5.5 and Fable 5.1, and on Claude Haiku 5.5 after an effort change (for example a retry fallback from a model without reasoning) (#17047 by @sjawhar)
- Fixed every GitLab Duo Agent request failing with 4400 "Flow configuration failed security validation" when a context file (such as an
AGENTS.md) contains an HTML comment (#17044 by @trukhinyuri) - Fixed a GitLab Duo Agent session that GitLab rejects on close (WebSocket 4000–4999) ending as an empty answer that was silently retried three times; it now ends with an error naming GitLab's reason and HTTP status (#17044 by @trukhinyuri)
- Fixed Cursor GitHub and Google logins never getting an account email (#17048 by @trukhinyuri)
- Fixed Cursor X Subscription usage treating the weekly Grok/Composer pool as third-party budget; third-party models are now metered by prepaid credit (#17048 by @trukhinyuri)
- Fixed Google models (
google-generative-ai,google-vertex,google-gemini-cli/Antigravity) running out of output on smallmaxTokensrequests with reasoning on, ending with thinking only and no answer; the requestedmaxTokensnow leaves room for thinking on top, as on other providers (#16943 by @Mouriya-Emma)
@oh-my-pi/browser-relay
Added
- The extension reports the omp version that installed it, and reloads itself when the relay updates its files after an omp upgrade (#15105 by @will-bogusz)
@oh-my-pi/pi-catalog
Breaking Changes
- Renamed the
task-sibling-prompt-cacheaxis toshared-prompt-cache(catalog fieldsharedPromptCache); it now also covers forks and explicit prompt-cache keys (#16988 by @rafalopilowski1)
Added
- Added the
requiresThinkingPresencemodel compat (KDLrequires-thinking-presence) for Anthropic-compatible endpoints that reject a thinking-mode request whose current turn has an assistant message without athinkingblock (#16739 by @lz37) - Added
resolveAnthropicApiVersion(): Anthropic model discovery sends API version 2026-10-21 to the official API whenPI_ANTHROPIC_API_VERSION=2026-10-21is set (#16706 by @H4vC) - OpenCode Go
muse-spark-1.3-contributor,muse-spark-1.2-contributor,gpt-5.6-luna,gpt-6-luna,grok-4.6(Responses) anddeepseek-v4-pro,omen-alpha(Completions) opt into shared prompt caching; lanes that warmed under any key stay off (#16988 by @rafalopilowski1) - Added
CatalogPolicyInputsso catalog-policy lookups accept a reduced model view (#16988 by @rafalopilowski1) - Added a catalog conformance test that fails the build when a
bundle="always"seed row is missing from the bundledmodels.json, so a stale-snapshot regeneration can no longer silently drop an engine the wayweb/deepseekwas lost in 18.12.2 (#16610, #17053 by @ouyangjiahong26)
Changed
- llama.cpp login instructions now list both default local base URLs (
http://127.0.0.1:8080, thenhttp://127.0.0.1:9931) (#16675 by @bartbroere) - Devin requests now identify as Devin CLI 3000.11.205, the current stable release, instead of 3000.11.3 (#16906 by @will-bogusz)
- Google Antigravity login now uses PKCE and requests the
aicodescope like the official client; existing logins keep working, and the new scope applies at the next/login(#17012 by @apoc) - Antigravity requests identify as client 2.26.0 when the release manifest is unreachable (previously 2.19.1), and model discovery sends the account's project like the official client (#17012 by @apoc)
- Antigravity's
User-Agentnow reports the native Antigravity build for the host OS (Linuxlinux/amd64, Windowswindows/amd64) instead of always claiming macOSdarwin/arm64(#17012 by @apoc) - Antigravity model discovery now keeps each account's per-tier
model_enum, output cap and thinking level or budget, and the bundled Antigravity models carry them for offline use; cached Antigravity model lists are refreshed once so they pick them up (#17012 by @apoc)
Fixed
- Fixed OpenCode Go
gemini-4-argonrequests failing with an unsupported protocol; discovered models now use native Gemini routing and low, medium, or high thinking (#17031) - Fixed DeepSeek V4 Pro cost estimates using Flash rates after September 14 despite Pro billing remaining unchanged (#16875).
- Anthropic refusal fallbacks from Claude Opus 5.5, Opus 5 and Sonnet 5.5 to their documented target models (Opus 4.8 and Opus 5, Opus 4.8, and Sonnet 5) now redeem fallback credit: the retry is no longer billed as a full cache write, and it is no longer skipped when the conversation holds signed thinking (#17034 by @sjawhar)
- Fixed Step 5 Preview reasoning choices on OpenCode Go and Zen to offer only low, medium, and high (#14987, #16669 by @SheetHappiness)
- Fixed GPT-6 Sol/Luna API and MiniMax-M3 long-context usage estimates above their published input thresholds (#16711)
- Fixed Xiaomi Token Plan login and default model selection after the V2.5 retirement by using MiMo V2.6 Flash (#16727 by @LiPu-jpg)
- Fixed Xiaomi model discovery sending
ttp-Token Plan keys to the pay-as-you-go host, which rejects them (#17045) - Fixed GPT-5.6 Sol requests over 272K input tokens (
openaiandopenai-codex) being priced at the retired $10/$45 long-context card instead of $8/$30 (#16742) - Fixed DeepSeek's official vision requests being held to the 5-image unknown-host floor: the catalog endpoint now carries DeepSeek's documented 600-image and 40 MiB inline-image budgets, while a custom
baseUrlkeeps the conservative floor (vision limits; #16737 by @Fun10165) - Fixed Devin model discovery falling back to the two SWE-1.6 seed models when the catalog takes longer than 5s to respond; it now waits up to 15s (#16668 by @DusKing1)
- Fixed Go Task keeping stale prompt-cache affinity after a model's wire model changed (#16988 by @rafalopilowski1)
- Fixed Devin models all showing a 200K context window: each model now reports its own (1M for Claude Opus 5.5 and the
-1mlanes, 262K for SWE-2), and GPT and Grok models with a long-context price tier start at that tier's threshold, with/extended-context onopening their full window (#16905 by @will-bogusz) - Added the
extended-cache-ttl-betacompat axis so a route can opt out of theextended-cache-ttl-2025-04-11beta (Factory Droid does), and prompt-cache lifetimes and long-retention support for Factory Droid's Claude models (#16296 by @will-bogusz) - Added Factory Droid's image models (GPT Image 2.5, GPT Image 2.5 Flare, Gemini 3 Pro Image) to the
imagerole's choices, listed only while your Factory organization allows image generation and that model (#16316 by @will-bogusz) - Fixed LiteLLM model groups with
mode: decisionsbeing listed as chat models; they now route toopenai-decisionsas judge models (#16939) - Removed retired Anthropic models (Claude 3.x, Opus 4/4.1, Sonnet 4) from the bundled catalog and discovery (#16755)
- Fixed Kimi Code K3 and K3 256K (
k3,k3-256k) pricing to include Kimi's $3/MTok cache-write rate, matching the Moonshot APIkimi-k3card (#16508, #16903 by @eggpeat) - Fixed Cursor Auto (
cursor/default) being metered against the third-party ("Other Models") pool instead of the Cursor Models pool it bills to (#17048 by @trukhinyuri)
@oh-my-pi/pi-coding-agent
Breaking Changes
snapshotJobsno longer acceptsincludeResults, andbuildJobResultaccepts only the"wait"and"cancel"ops; the"jobs"op has had no caller sincewaitandproc://replaced thehubtool (#16763 by @will-bogusz)
Added
- Added
omp -p --wait-async(settingasync.printWake): print mode waits for the background jobs it started and wakes the same session with each result before exiting, instead of cancelling them (#10363, #16690 by @trukhinyuri) - File slash commands with
side: truefrontmatter (including Codex and OpenCode command directories) run as/btwside questions in the TUI, with or without arguments: they answer off the transcript and never steer a running turn. The panel and/btwhistory title them by the typed command (/sitrep); the title is kept in anentry-<id>.titlesidecar so older builds can still read the history. Other modes expand them as ordinary prompts (#16815 by @wolfiesch) - Added
compat.requiresThinkingPresencetomodels.ymloverrides, so a gateway model group whose strict member validates thinking replay can pad a turn a lax member answered without reasoning (#16739 by @lz37) - Anthropic web search and Files API uploads follow
PI_ANTHROPIC_API_VERSION=2026-10-21; web search omitstemperatureunder that version (#16706 by @H4vC) - llama.cpp auto-discovery now also finds local servers on llama-server's new default port 9931 when nothing answers on 8080 (#16675 by @bartbroere)
/local(orAlt+G, remappable asapp.local.open) opens a picker of the session'slocal://files and edits the chosen one in place in$VISUAL/$EDITOR;/local <name>opens a file directly with name completion (#16873 by @Shadorain)- Added
--no-context-filesto start a session withoutAGENTS.md,CLAUDE.mdor other context files, including those of--add-dirroots and in subagents (#16768 by @will-bogusz)
Changed
- Clarified how RPC and RPC-UI clients discover and invoke mounted MCP tools through
xd://devices rather than relying ondumpTools(#16864 by @michaeltrefry) - The note
readadds to a PDF whose pages have no extractable text (a scan) now points at the:page<N>.pngselector, which returns the page as an image, instead of the browser prelude (#16585 by @will-bogusz) read doc.pdf:page<N>.pngrenders the page in a square 874x874 tab instead of the default landscape one, so a letter page comes back at 668x865 instead of 441x568 and a landscape page at 864x669 instead of 736x567 (#16585 by @will-bogusz)- Added
--warn-costand--max-cost(session.warnCost/session.maxCost): omp warns once at the first spend and stops sending model requests at the second, subagents included; capped print runs exit 3 (#7802; first written by @zhang17-24) (#16803 by @will-bogusz) /session(and RPCget_session_stats, aseditRejections) lists your failed edits by why they were refused (unseen lines, stale tag, parse error, …), and each failed edit records that reason asdetails.errorKindin the session file (#16608 by @will-bogusz)- Added exclusions to
grep: apathentry starting with!leaves matching files and folders out of the search (src;!*.test.ts,!vendor;!gen), where before it was taken as a path and found nothing (#16920 by @will-bogusz) waitandread proc://now show a running subagent's run time, request count, cost, context fill and stage, so a subagent that is looping is visible without opening its transcript (#16863 by @KimToehler)- Google Antigravity web search sends the same transport headers as the official client (
Accept-Encoding: gzip, no explicitAccept) (#17012 by @apoc) - A subagent's result up to 11,500 characters now reaches its parent whole, instead of as a 5,000-character preview the parent had to re-read through
agent://<id>or act on without its ending (#16599 by @will-bogusz) - Fixed a subagent's final report or
yieldreaching its parent andagent://as its short reply to a peer message oragent://allbroadcast (the parent's included) that arrived as it finished; such messages now get a turn of their own after the result, and a peer that wrote directly still receives the reply (#16583 by @will-bogusz) - Fixed the built-in
ts-set-maprule stalling tool-call streaming on a long single-lineSetvalue (5 s at 20,000 characters) and firing when the literal array only feeds a computed argument such asnew Set(["a", "b"].map(normalize));ts-import-typeno longer fires onimport("x").thenwritten with a non-breaking space or line separator before the call (#16556 by @will-bogusz) - Fixed a subagent woken after it was parked losing the tools an extension registers at its first prompt (such as HexRays
ida-mcp'sida_*tools), which also made its first request after waking miss the prompt cache; extensions see the revive as abefore_agent_startwith the newreason: "revive"(#16597 by @will-bogusz) readshows HEIC, HEIF and AVIF photos (such as iPhone pictures) as images instead of refusing them as binary, decoding them with ffmpeg 8.1 or newer; text-only models get their metadata, and without such an ffmpeg the error says how to convert the file (#16612 by @will-bogusz)- Fixed
readof web pages with tables, code or pricing lists (API references, specs, pricing pages) returning a shorter trafilatura or Jina rendering that leaves out much of the page, and noting the page "appears to require JavaScript or is mostly navigation" (#16596 by @will-bogusz) omp usage --jsonnow includes each policy-routed account's priority, reserve and routing state (eligible,inside-reserve,exhaustedorunknown) as apolicyobject, matching the policy line in the text view (#16581 by @will-bogusz)- Added prompt-cache warming for Factory Droid's Claude models: replays follow the 5m entry, or the 1h entry once a response reports writing one (#16296 by @will-bogusz)
generate_imagecan now run Factory Droid's image models (GPT Image 2.5, GPT Image 2.5 Flare, Gemini 3 Pro Image) when one is chosen for theimagerole (#16316 by @will-bogusz)- On macOS, asking the agent to open a file, folder or URL, or to show a file in Finder, now takes one
computer.apps.open(path, { app?, reveal? })call instead of a dozen steps driving Finder by hand (#16403 by @will-bogusz) - Added in-place updates of the browser relay's Chrome extension after an omp upgrade: an older extension loaded from
~/.omp/browser-relay/extensionis rewritten and reloads itself once no omp session is using the relay (#15105 by @will-bogusz) - Added a note to relay
browser.openresults when the Chrome extension was installed by an older omp, namingomp browser-relay installand a reload (#15105 by @will-bogusz) - Fixed images attached with an
@pathfile mention reaching a text-only model as[image omitted: …]withimages.describeForTextModelsenabled; they now get thevisionrole description like pasted images (#16853) - Fixed
browser.open({ ignore_https_errors: true })still failing with certificate errors such asnet::ERR_CERT_AUTHORITY_INVALIDon the shared Chromium and onapp.cdp_urlbrowsers; the override now lasts until the tab is closed (#16930) ignore_https_errorsthrough the Chrome relay now fails up front, explaining that Chrome's extension debugger API cannot ignore certificate errors and pointing toapp.relay: false, instead of failing withSecurity.setIgnoreCertificateErrors wasn't found(#16930)- Fixed a parent follow-up consumed while a kept-alive subagent resumes from queued steering or an async completion leaving
agent://on the previous result instead of delivering the fresh answer (#16746) - Fixed a long streamed answer ending the collab room for every guest with "collab send backlog exceeded its limit"; the host now sends guests only the latest state of a streaming message, and guests still speak the full answer when speech is on (#16956)
- Fixed
read proc://<agent>andwrite proc://<agent>/killanswering "not found" for a subagent that a message woke while its new turn runs as job<agent>-2; they now reach that job, and reading the agent's finished first job names the job it is running as (#17020 by @sjawhar) - Fixed the agent reading a fallback engine's
web_searchresults as the preferred provider's: the tool result now notes which provider answered and why the earlier ones failed (#16948 by @BAKocska) - Fixed a turn that ended with background jobs still running looking stuck: the working row now says it is waiting for those jobs and names them instead of repeating the last tool call, and Esc ends the wait, so the jobs keep running and their results land in context for your next prompt instead of starting a new turn (#17032 by @sjawhar)
- The
power.sleepPreventionsetting now says it keeps the machine awake only while the agent is running a turn, not for as long as a session is open (#16762 by @will-bogusz) - The advisor docs now say a quota-paused advisor resumes only when its runtime is reset or rebuilt (compaction, a session switch,
/advisor, a config reload or a restart), not after a cooldown (#16766 by @will-bogusz) - Fixed the
computertool'scomputer.window({ app })failing for an app with no open window without saying what to do; the error now names thecomputer.apps.open(…)call that launches it (on macOS it also shows a window of a running app that has none), andcomputer.window()with no argument asks for a window id or filter instead of listing windows that "match undefined" (#16912 by @will-bogusz) - Fixed the
computertool prompt leavingel.selectTextout of the element helpers; it now says a followingel.typeon that element replaces the selection (#16769 by @will-bogusz)
Fixed
- Honored
display_name,context_window, andinput_modalitieswhen a model list nests them undermetadata, so codex-lb-style gateways surface the advertised name, window, and image input instead of the raw id and defaults. (#17010 by @adi-IL) - Recovered spilled tool output in sessions without an artifacts directory: the
artifact://link the truncation footer advertises now reads the in-memory copy instead of failing with "No session - artifacts unavailable". (#17009 by @adi-IL) - Fixed the compiled
ompbinaries trusting certificates from the compromised eMudhra intermediate CAs (CVE-2026-91403) and carrying the Brotli decoder out-of-bounds write (CVE-2026-111497); release binaries now build on Bun 1.4.4 (#16822, #16865 by @bse-ai) - Fixed
computerruns in subagents andomp -pstopping at their firstcontrol.acquire: they now keep working through background window input and report only a step that needs foreground control (#16909 by @will-bogusz) - With
bash.gitGuardon, a repository that once finished a conflicted rebase no longer counts as mid-conflict forever, which had letgit checkout,switchandrestorethrough; branch switches such asgit checkout -B <branch> <commit>stay refused during a real merge or rebase too, abbreviated options such asgit reset --haare refused like the full ones, andgit stash createis allowed (#16919 by @will-bogusz) - Fixed browser calls right after a click that navigates (headless, connected and relay Chrome) reaching the page being left: reads and screenshots returned the old page or failed with
Execution context was destroyedorCannot find context with specified id, and afillcould land on the old form; they now wait for the new page (#16907 by @will-bogusz) - LSP diagnostics now reflect external edits to already-open dependencies when checking an importer, including after Write/Edit (#16836).
- Fixed URL
readline selectors using different coordinates from URLgrepwhen the response includes transport headers (#16877). - Fixed
writeto a SQLite row ignoring the database's declared foreign keys: orphan inserts and updates now fail,ON DELETE RESTRICTblocks the delete, andON DELETE CASCADEremoves dependent rows (#16999) - Fixed pasting a server URL into the
/mcp addwizard putting it in the hidden chat draft instead of the URL field (#16975). omp --from-claudekeeps the last real model when Claude records a synthetic API error, and does not try to restore a synthetic-only placeholder (#16785).- Fixed skill-list previews of long CJK descriptions collapsing to the few characters before an early ASCII space (e.g.
用户点名…); they now keep the full preview budget (#17070) - Browser clicks on a shadow-root button no longer fail with
blocked: covered bynaming the button's own slotted content; real overlays are still refused (#16958) - Fixed reading
.xlsxfiles rewriting numeric-looking text cells: long IDs like12345678901234567890no longer round (and collide), and text such as00123keeps its leading zeros (#16831) - Fixed rc-file aliases for core tools (e.g.
alias ls='eza --icons') leaking into the bash tool;ls,cat,grepand the other core tools now run the real binaries (#17067) - Fixed a collab room staying half alive after its session moved to a new file because it was open in another omp process (or replaced/contested on disk): guests now get room-closed, the registry entry is withdrawn, and
collab.autoStartshares the moved session (#16935) - Fixed skill-description compression ignoring the configured
defaultmodel whenmodelRoles.smolis unset and sending background requests to the built-in smol chain (e.g.claude-haiku-5-5) instead of the model/modelsshows for SMOL (#16970) - Fixed
models.ymldiscovery providers with anapiKey(and noauthHeader: true) showing 0 models in/modelsand ctrl+p right after startup despite a cached catalog; cached models now load immediately (#16965) - Anthropic web search no longer sends unsupported
temperatureto Claude Haiku 5.5, avoiding HTTP 400 failures (#16986) - Fixed pages in the managed headless browser hitting "Maximum call stack size exceeded" in canvas
fillTextafter callingcanvas.getContext("2d")repeatedly (#16879) - Fixed LSP references and rename previews still listing a file that was open and then deleted (via
edit, or outside OMP before a rename) until the language server restarted (#16880) - Fixed
omp plugin upgradefailing on Windows withEPERM: operation not permitted, symlinkwhen the installed plugin was replaced byomp plugin link; a failed upgrade now restores the link as a junction (#16844) omp plugin upgrade a@m b@m c@mnow upgrades every specified plugin instead of silently skipping targets after the first (#16826)- Browser
tab.fill()/tab.type()(andframe.fill()/frame.type()) that time out on long text now stop typing instead of finishing it behind the rejected call, and the timeout reports how many characters were typed instead of claiming the element was hidden or covered (#16833) - Concurrent archive member writes now preserve both updates across sessions and directory symlinks; canceled writes waiting for the archive no longer publish later (#17000).
- Fixed a
tools.approval.<tool>: promptpolicy on a tool mounted as anxd://device asking the same approval question twice for onewrite xd://<tool>call (#17039) - ACP cancellation now waits through Python kernel interrupt escalation before closing a session; prompts sent after a closed session return
ResourceNotFoundso clients can offersession/loadrecovery (#16889). - Google Antigravity, Google, and Google Vertex now keep append-only context by default, preserving cached prompts across long-running agent turns (#16979).
- Fixed LiteLLM
mode: decisionsmodel groups being offered as chat models instead of judge models, including for customdiscovery.type: litellmproviders (#16939) - ACP:
instructionsreturned by MCP servers declared insession/newnow reach the model under "## MCP Server Instructions", as they do for.mcp.jsonservers (#16882) - Fixed the Windows tab title (e.g. in Tern) sticking at
ompinstead of the session title after a JS eval worker oromp browser-relayran in the same console; omp no longer retitles the console from child processes and reclaims the title when another process replaces it (#16842) - Fixed Python
evalreporting the backend unavailable when the firstpythonon PATH is broken (e.g. a mise shim with no version set) even though a workingpython/python3sits further down PATH; every PATH match is now probed, and the error reports bounded probe failures with home paths shortened (#16824) - Fixed a turn whose stream was cut after text had already rendered — a gateway substituting an in-band
errorframe for the missing terminal event — ending instead of continuing from the partial answer (#16990 by @Maziar123) - Model tags in
/skill:arguments now registerm<N>agents and appear with the skill prompt instead of reaching the model as literal^selectors (#16818) - Fixed a user-scope
omp plugin upgrade,install --force, oruninstallrun outside a project deleting the cached plugin a project-scope install in that project still links to (#16827) - Fixed resuming anonymized sessions with text tool results crashing before the next model request (#16859, #16896 by @tneemo)
- Fixed the mid-run todo nudge going silent for the rest of a long turn after two nudges: a
todocall now re-arms the per-turn budget instead of waiting for the next user prompt (#16962 by @omertahaoztop) - xAI web and X searches now run Grok's hosted search instead of failing with
returned no sourcesor falling back to engines that cannot read X posts (#16947 by @BAKocska) - Fixed
/deleteleaving an empty zero-turn session on disk when you quit before sending a message (#11303, #16798 by @NewtonChutney) - Idle recap no longer runs when the prior message was not generated (a user message, or an assistant turn that produced no output). A generated assistant reply still recaps after the idle delay (#16978 by @atacolak)
- Fixed an extension loading twice, so every handler ran twice, when the same file was reachable both through a symlink and its target, such as a link in the agent
extensions/directory plus--extensionwith the real path; discovery now dedupes extension paths by real file (#16788 by @wolfiesch) - Fixed the
writerefusal in read-only subagents saying filesystem writes are unavailable; it now gives the on-disk path oflocal://files, so the agent can tell its caller where its report is (#17023 by @sjawhar) - Fixed
waitsaying a subagent "finished its turn without replying" (and to ask again) after that subagent's result had already arrived as a background-job result, for a follow-up that woke it or that it got while running (#16929 by @sjawhar) - Fixed a Markdown link to a local path that cannot be encoded pointing at a broken target instead of staying plain text (#16806 by @laviRZ)
- Fixed the Agent Hub reordering its rows on every heartbeat while it loaded the session's saved subagents, so no row could be selected until the load ended: a row's place is now fixed when the hub first shows it, agents found on disk take their place in the status/recency ranking, and a scan reads a transcript again only after it changed, so reopening the hub on a session with many saved agents no longer rereads them all (#10524, #16952 by @lemonleks)
omp usagenow shows the Codex credit spend cap for credit-billed ChatGPT Business/Enterprise seats (previouslyno limits reported), and rounds fractional credit amounts to two decimals (#16973 by @DusKing1)- Fixed TTSR rule matching slowing down quadratically on long tool calls such as
bash,evalortaskarguments: their streamed JSON escapes newlines, so every delta rescanned the whole argument (a 64 KB call with 10 rules took 120 ms of matching, now 4.5 ms). A long unterminated line is now rescanned as it grows by a quarter, and the final check still scans all of it (#14248, #16974 by @lavinhoque33) - Fixed the
evaltool description so JS sessions see which helpers needawait(#16808 by @bigHippoZz) - Fixed the
evalagent and judge docs so JS sessions see which handle, pool and batch calls needawait, and Python sessions with JS enabled seeagent()'sschema_modekeyword instead of JS'sschemaMode(#16810 by @bigHippoZz) - Fixed a classifier refusal on an Anthropic model ending the turn with the rest of an Anthropic
retry.fallbackChainsentry untried once the conversation carried signed thinking; the refusal now moves to the next model in the chain (#17024 by @sjawhar) - Fixed the bash tool blocking commands such as
echo hi; make 2>build.err, and sendingcat > file <<'EOF'toread(#17022 by @sjawhar) - Empty-stop retry exhaustion now reports provider usage without claiming that output was filtered or dropped, and same-model retries of content-less
MALFORMED_RESPONSE/UNEXPECTED_TOOL_CALLerrors inject a corrective tool-call reminder instead of replaying the identical cached prefix (#17063 by @martijnberger) - Fixed automatic compaction committing summaries that increase context and repeatedly retrying the same retained-history cut point; token counts now include trailing tool results and post-compaction rescue (#16904 by @eggpeat)
- Fixed
/tandropping the images attached to its draft: the background agent now gets them with its request and keeps them, as admitted, when compaction restores the request; they leave the composer once/tanstarts, so the next message cannot send them again, and come back with the draft when it cannot start (#16805 by @lemonleks) - Fixed
/btwdropping the images attached to its question: the side request now sends them, and like/tanthey leave the composer once it starts and come back with the draft when it cannot; BTW history keeps each question's images (imageson the RPC BTW records), so every follow-up sends them again, and a follow-up in the BTW history also takes pasted images (#13890, #16805 by @lemonleks) /omfg,/handoffand/cleanseno longer run without the images attached to their draft: they keep the draft and say they take text only (#16805 by @lemonleks)- Fixed an image pasted while an extension input hook held a submission being dropped from the next message: once the submitted images leave the composer, the images that stay are renumbered from
#1(#16805 by @lemonleks) - Fixed a collab guest losing the draft of a host-only command that takes its draft out of the composer on Enter (
/plan,/goal,/tan,/btwand others): the draft now comes back with its images (#16805 by @lemonleks) - Fixed a hashline
PUTwhose body repeats the line just above or below its range (or both), and is shorter than the range, silently deleting the range's other lines or writing a neighbouring line twice in Python, TypeScript and other parsed files; it is now refused, and the "too short" refusal names the lines the body leaves out (#17028 by @sjawhar) - Fixed
omp gc --compressexiting with "the event loop drained while it was still pending" on Bun 1.3.14 when a session artifact is pretty-printed JSON larger than 1 MiB, and session header probes (gc, session move and transfer) reading whole artifacts on Windows (#15745, #16754 by @wolfiesch) /resumeinto another session now cancels the previous session's background jobs, as/newdoes, instead of delivering their results into the resumed session and starting a turn there (#16760 by @will-bogusz)- Fixed the models config migration writing
models.ymlreadable by other users on the machine, and dropping every custom provider when the write was interrupted; the migrated file is now published atomically with owner-only permissions (#16654 by @adi-IL) - Fixed
/memory clearin one project deleting the memory state of every other project that shares the same agent directory (#16657 by @adi-IL) - Fixed the classic
/usagereport averaging distinct quota buckets that share a label and window (Google Antigravity's Gemini and Gemini 4 Argon weeklies) into one "50% free" row that hid the drained bucket; groups now split by quota identity while shared buckets still merge (#16790) - Fixed
readof a web page failing with HTTP 403 or 429 when the site serves the page to another user agent, as SEC EDGAR filings, Ars Technica, AP News and Yahoo Finance do: a refused request now retries with the next user agent whatever its error page says (#16593 by @will-bogusz) - Fixed
greptrimming a file to its first 20 matches in a multi-file search (200 in a single file) without telling the agent; the result now names the trimmed files and how to see the rest, and no longer reports the file total asN+when every file was searched (#16594 by @will-bogusz) - Fixed isolated task capture failing with
patch does not apply: <path> does not existwhen the worker's commits leave untracked baseline files of the parent checkout untouched: the baseline work-in-progress is replayed before the worker's delta and rewound afterwards (#16648 by @Komzpa) - Fixed a project-wide LSP rename corrupting files that were edited outside OMP while open: the rename now syncs every open document (not just the requested file) before the workspace edit is computed, so the server's ranges match the current disk text instead of writing the identifier into blank lines (#15772, #16649 by @holny)
- Fixed local memory stage-1 extraction sending prior assistant reasoning to Claude, causing
reasoning_extractionrefusals and lost memories (#16679). - Fixed each
rewindreport being sent to the model twice (as aBranch-return summaryand as theCheckpoint called and rewoundreport); it now appears once per checkpoint/rewind cycle, while the transcript still shows the branch summary (#16702) - Browser relay opens fail immediately with Chrome's reason (e.g.
Host access is restricted by policy.on Chromium 155+ with an extension debugger policy) instead of timing out, and close the tab Chrome refused (#16748) - Collab guests can answer a pending question after the host reconnects to the relay without duplicated answer controls (#16682 by @DAnaeto)
- Fixed
dd … of=/dev/null(and other write-only sinks such as/dev/stdoutand/dev/fd/1) triggering the unoverridable critical-command approval prompt;ddto real devices like/dev/sdastill prompts (#16714) - Fixed Word and EPUB
reads, site-specific web scrapers (Stack Overflow, MDN, GitLab, …) and the browser's readable page extraction writing identifiers assnake\_caseorDOCX\_NEEDLE\_1(filtered plain text dropped the underscores): underscores inside words now stay literal (#16607 by @will-bogusz) - Tagging a model with
^in a message sent while the agent is working no longer splits it in two: the model learns the newm<N>agent and reads your message in the same turn, instead of replying to the announcement alone first (#16614 by @will-bogusz) - Fixed subagent model resolution skipping an authenticated later entry of the configured model list: when the first resolved model has no credentials, the remaining entries are tried in order before the parent session's model. (#16640 by @Komzpa)
- Fixed background job widgets rejecting percentage progress with
meter.total: 100 appears nowhere in the job or its output; a meter may now use a total of 100 when every value feeding it was printed as a percentage (#16885 by @alphastorm) - Fixed
openai-models-listdiscovery leaving models that advertise their own reasoning levels (supported_reasoning_levelsanddefault_reasoning_level, top-level or undermetadataas codex-lb sends them) non-reasoning when the id is absent from the bundled catalog, so requests never carriedreasoning_effort(#16650 by @Komzpa) - Fixed marketplace auto-update leaving cloned checkouts behind after startup errors; abandoned clones are removed on a later refresh (#16693)
- Fixed an extension's idle
pi.sendMessage({ display: true }, { deliverAs: "nextTurn", triggerTurn: false })clearing and replaying the whole transcript, which froze input for longer as the session grew; the message is now appended to the existing transcript (#16744 by @OriginalByteMe) - Fixed
app.targetrejecting CDP page ids, including freshabout:blankpages, and added ids to unmatched-target listings (#16619) - Fixed reading
proc://<id>/killorproc://<id>/modeanswering only "writable only", so agents often moved on with the job still running; the error now names thewritecall that cancels the job or sets the mode, with the real id (#16580 by @will-bogusz) - Fixed
history://<id>failing with "has no transcript: session is gone" for a worker that is still running but has not created its session or transcript file yet; it now answers "No transcript has been written yet". (#16645 by @Komzpa) - Fixed the
evaltool telling sessions with only the Python runtime to calltool.<name>(args)withoutawait, which returns a coroutine and never runs the tool (#16578 by @will-bogusz) - Task subagents on models that opt into shared prompt caching now share one cache key with their same-type siblings, even when the parent runs another model or the child switches models later;
/compactand auto-compaction use that key against the model the compaction request actually sends, and keep the session's own id when no key applies (#16988 by @rafalopilowski1) - Fixed
omp auth-broker servetoken refreshes that hang continuing past the refresh deadline and keeping other refreshes of that credential waiting: the deadline now cancels the token request (#16291 by @will-bogusz) - Fixed
read doc.pdf:page<N>.pngreturning the PDF viewer's empty grey frame instead of the page on about half of reads (#16585 by @will-bogusz) - Fixed language servers keeping every file omp ever opened loaded for the whole session; files unused for 5 minutes are now closed when omp opens another, so the server can free that memory (#15418 by @will-bogusz)
- Fixed
writeturning a CRLF file into LF and dropping its UTF-8 BOM when it replaces the file; it now keeps both, aseditdoes (#16575 by @will-bogusz)
@oh-my-pi/pi-mnemopi
Fixed
- Fixed polyphonic recall's graph voice finding no memories for non-English names (e.g.
Hà Nội) or names of three or more words, and Vietnamese words liketôibeing stored as the participanti(#16723)
@oh-my-pi/pi-natives
Added
- A failed
EditStore.applyoutcome carrieserrorKind, a stable class of the refusal (unseen_lines,stale_tag,parse, …), andeditErrorKinds()lists every class (#16608 by @will-bogusz) - Added
excludetogrep()options: glob patterns of files and folders to leave out of a directory search; a matched folder is not walked (#16920 by @will-bogusz) - On macOS,
openApplicationalso opens a file, folder or URL in its default application orApplicationOpenOptions.app, andrevealshows a file or folder selected in Finder; other platforms returnUnsupportedfor a URL,apporreveal(#16403 by @will-bogusz) - Fixed a rerouted parallel Mermaid flowchart edge running over other edges, ports and labels at the same two nodes; the route no longer depends on declaration order, and it can pass outside the first row or column of nodes to reach a free port (#16773, #16774 by @berney)
- Fixed the built-in
psreporting an unsupported long option such as--forestasunsupported option '--'; it now names the option, and every unsupported-option error says that a systemps, if installed, may support more options when run by its full path (#17018 by @sjawhar) - Fixed
kill %Non a backgrounded compound command (such as(while :; do :; done) &) in a persistent shell session: the job was reported done but the in-process loop kept spinning until the process exited; it now stops at the next interpreter check (#16937 by @holny) - Fixed
sort -t=(and clusters such as-nrt=) failing with "separator must be exactly one character long"; an attached=now selects=as the field separator, as in GNU sort, and-t=Xsuch as-t==is rejected as two characters (#17017 by @sjawhar) - Fixed macOS
press()on a control with no press action, such as a button on a Chrome page, failing without saying what to do; the error now tells you toclick()it instead (#16916 by @will-bogusz)
Changed
- Faster native grep on minified and long lines (#17016 by @GTanger)
- Faster native ANSI text wrapping on long lines with many words (#16927 by @GTanger)
- Faster native memory reranking when selecting many results (#16921 by @GTanger)
- Faster structural code summaries on large files (#16993 by @GTanger)
- Faster native edit diff formatting and fuzzy line matching on large files (#16926 by @GTanger)
- Reduced native word-diff allocation overhead when joining tokens and deduplicating boundary whitespace (#16922 by @GTanger)
Fixed
- Fixed macOS
ax()andfind()leaving a text field with no label of its own, such as Reminders' Add Date and Add Location fields, unnamed; such a field is now named by its placeholder (#16915 by @will-bogusz) - Fixed minimized
ruff check --output-format fulloutput counting code-frame lines with function calls, such as14 | assert skill.read() == …, as diagnostics and files, which inflated theN diagnostics in M filessummary (#16837) - Fixed omp crashing with a stack overflow when an edit's path did not resolve to an existing file and the workspace search for it reached a deeply nested directory tree; directory walks no longer use a stack frame per nesting level (#16857)
- Fixed the built-in
pscrashing the shell on a non-ASCII character in an option cluster such asps -é; it now reportsunsupported option '-é'like any other unknown option (#17019 by @sjawhar) - Fixed computer use on macOS being unable to finish renaming a file in Finder: keys,
el.typeandel.presssent to the rename field were refused, and so were clicks in its window while Finder was your frontmost app (#16910 by @will-bogusz) - Fixed a UTF-8 char-boundary panic when parsing
stateDiagram-v2lines where>follows a multibyte character (#16749 by @berney) - Fixed the bash tool's
rgandfdon macOS and Linux finding nothing under a path that is a symlink to a directory, such as/tmpor/etcon macOS or a symlinked skill folder; like ripgrep and fd, they now search the folder the link points to (#16598 by @will-bogusz) - Fixed minimized
git diff,git showanddiff -uoutput dropping a hunk's changes and listing a made-up file when a changed line starts with--or++(SQL comments, Markdown---rules) (#16588 by @will-bogusz) - Fixed the bash tool's minimizer summarizing word diffs (
git diff --word-diff,--color-words,--word-diff-regex), which carry no per-line+/-markers; word-diff patches are now passed through unsummarized (#16588 by @will-bogusz) - Fixed Mermaid flowcharts drawing two edges between the same pair of nodes as one line, with their labels written over each other; each edge now gets its own route, line style, arrowhead and label (#16731)
- Fixed
renderMermaidAsciistarting an edge one cell away from its node's side when a labeled sibling edge leaves the same node from another side (#16730) - Fixed Mermaid flowchart parsing swallowing leading dashes of spaceless arrows (
A-->B,B-.->C,C:::cls-->D) into the preceding node ID or class name (#16750 by @berney) - Fixed macOS
openApplication("Contacts")andopenApplication("Messages")failing as ambiguous because a helper of the app (an agent app or a running app extension) has the same name; a name shared only with such helpers now opens the app (#16911 by @will-bogusz) - Fixed a macOS background right or middle double click pressing again after you clicked or typed in its app between its presses; it now stops there with
UserIntervened, as a left click does (#16770 by @will-bogusz) - Fixed macOS background
axType,axKeyChordandaxClicksending input into an app you switched to while it was busy answering the element's window or bounds lookup; they now read your front app first and refuse withUserIntervened, as window input does. The refusal for an element that does not take focus now says no keys were sent, since the focus request reached the app (#16769 by @will-bogusz) - Fixed the shell output minimizer cutting short
git diff,git show,diff,jqandsshoutput that fits in 16 KB: it now arrives whole, and the patch summary, the 40-linejqcap and the remote head/tail cut apply only to larger output (#16589 by @will-bogusz)
@oh-my-pi/pi-tui
Breaking Changes
CoordinationOpno longer includes"jobs", which no tool has produced sincewaitandproc://replaced thehubtool (#16763 by @will-bogusz)- Fixed a table's last rows (such as its bottom border) going blank in scrollback when its SIXEL chart was drawn while the reply kept streaming, with the chart painted over them (#16870)
- Fixed Tern MCP tool cards showing only a clipped one-line summary of the arguments; the call and result cards now include a folded
Argssection with the full arguments (#16765) - Fixed pasting an API key or redirect URL into the setup wizard's provider sign-in prompt silently doing nothing (#16898 by @camiloeferrera)
- Fixed the usage dashboard averaging distinct quota buckets that share a label and window (Google Antigravity's Gemini and Gemini 4 Argon weeklies) into one row, which masked a drained bucket as "50% left"; buckets now group by quota identity, and shared Claude/GPT copies still merge (#16790)
Added
- Added
modelEndstoGroupedFileSection: per file, the model-line index just past its last line, so a caller cutting the output can tell which files it shows whole (#16594 by @will-bogusz) - Added an optional
titletoBtwHistoryRecordand atitleoption toBtwPanelComponent: the/btwpanel, history list and thread show it as the topic heading in place of the question, so a side command reads as/sitrepinstead of its expanded template (#16815 by @wolfiesch) - Vim mode now supports
.to repeat the last change, including the text typed in Insert or Replace mode, with Vim's count rules;uundoes a whole Insert session or.in one step (#16872 by @Shadorain) - Added the
app.local.openkeybinding (defaultAlt+G) and its keyboard shortcuts row (#16873 by @Shadorain) - Added
errorKindtoEditToolDetails, set on a failed edit (#16608 by @will-bogusz)
Changed
- Command and eval output panes no longer re-style and re-join their whole output on every frame, so a long command's output stops costing frame time while it sits in the transcript (#16779 by @yuzu-octopus)
Fixed
- Fixed typo underlines changing when the cursor or selection splits a word (#16821)
- Fixed completed
vibe_waitandvibe_listworker cards repeatedly entering scrollback as elapsed time advanced after partial retirement; completed walls now retain a static snapshot while in-flight waits continue updating. - Fixed resuming a session with a recorded tool-call path that cannot be turned into a link, which crashed the TUI while it rebuilt the context (#16806 by @laviRZ)
- Fixed the Agent Hub reordering its rows on every heartbeat while the session's saved subagents loaded, so no row could be selected until the load ended: a row's place is now fixed when the hub first shows it, an agent the load finds takes its place in the status/recency ranking, and every other new generation goes on top (#10524, #16952 by @lemonleks)
- Fixed the BTW history follow-up composer refusing pasted images; it now attaches them as
[Image #N]markers and sends the ones whose marker stays in the draft (#16805 by @lemonleks) - Fixed long URLs in fenced code blocks opening only their first visual line on ctrl/cmd-click; each wrapped fragment now carries the full OSC 8 hyperlink when the terminal supports it (#16740 by @OriginalByteMe)
- Fixed the newest inline charts and images at the bottom of the screen showing as text placeholders while older ones stayed rendered once a session (or a resumed one) holds more than
tui.maxInlineImagesimages (#16660) - Fixed Markdown tables in the terminal ignoring their column alignment, so right-aligned and centered columns rendered flush left (#16658 by @adi-IL)
- Grep, Glob, Find, and AST Grep result headers wrap a long pattern instead of cutting it off, so the match/file counts and
truncatedwarning stay visible (#16635)
@oh-my-pi/pi-utils
Added
- Added
parseHeifImageMimeType(), which identifies HEIC, HEIF and AVIF images from a file header (#16612 by @will-bogusz) - Added
$whichAll(), which returns every PATH match for a command in PATH order (#16824)
Changed
Fixed
setProcessName()no longer assignsprocess.titleon Windows, where it overwrites the shared console title (#16842)- Fixed inline code spans rendering flush against the surrounding text when a backslash preceded the closing backtick (#16972 by @akainth015)
What's Changed
- feat(ai): add opt-in Anthropic API version 2026-10-21 by @H4vC in #16706
- fix(coding-agent): stop gc --compress stalling on large JSON artifacts by @wolfiesch in #16754
- fix(providers): use MiMo V2.6 for Xiaomi login validation by @LiPu-jpg in #16727
- fix(catalog): correct OpenCode Step 5 reasoning efforts by @SheetHappiness in #16669
- fix(tui): kept the newest transcript images live under the image budget by @roboomp in #16677
- fix(memory): removed reasoning from stage-one rollouts by @roboomp in #16681
- fix(collab): restore pending ask controls after host reconnect by @DAnaeto in #16682
- fix(agent): include session.compacting context in split-turn prefix summaries by @integrITsolutions in #16707
- test: control Cowork response body lifetime by @jwaldrip in #16708
- fix(catalog): priced long-context GPT-6 and MiniMax requests by @roboomp in #16712
- fix(coding-agent): stopped flagging dd to write-only pseudo-devices by @roboomp in #16716
- test(tui): trust screen background fixture by @jwaldrip in #16717
- test(coding-agent): seed npm global layout fixture by @jwaldrip in #16722
- fix(mnemopi): shared unicode proper-noun extraction across gists and graph voice by @roboomp in #16724
- fix(natives): kept mermaid label widening off node border columns by @roboomp in #16735
- fix(natives): routed parallel mermaid edges apart by @roboomp in #16736
- fix(catalog): apply DeepSeek's 600-image vision limit by @Fun10165 in #16737
- fix(tui): link every wrapped fragment of URLs in fenced code blocks by @OriginalByteMe in #16740
- fix(coding-agent): append idle extension notices instead of rebuilding the transcript by @OriginalByteMe in #16744
- fix(catalog): priced gpt-5.6 sol long-context turns at the $8/$30 card by @roboomp in #16745
- fix(natives): guard UTF-8 char boundary in mermaid state transitions by @berney in #16749
- fix(natives): backtrack trailing dashes before spaceless mermaid arrows by @berney in #16750
- fix(browser): failed relay opens fast with chrome's attach refusal by @roboomp in #16751
- fix(coding-agent): tell Python-only eval sessions to await tool calls by @will-bogusz in #16578
- fix(coding-agent): name the write call when proc:// kill or mode is read by @will-bogusz in #16580
- fix(pi-shell): keep diff hunk lines starting with -- or ++ inside their hunk by @will-bogusz in #16588
- fix(coding-agent): retry a refused web read with the next user agent by @will-bogusz in #16593
- fix(coding-agent): tell the model when grep's per-file match cap trims a file by @will-bogusz in #16594
- fix(pi-builtins): follow a symlinked path operand in rg and fd by @will-bogusz in #16598
- fix(coding-agent): keep underscores inside words literal in converted Markdown by @will-bogusz in #16607
- fix(coding-agent): deliver a steered model mention's agent notice with the steer by @will-bogusz in #16614
- fix(browser): matched exact cdp target ids before page text by @roboomp in #16632
- fix(ai): folded anthropic root union tool schemas into the root object by @roboomp in #16633
- fix(tui): wrapped search tool result headers instead of truncating by @roboomp in #16636
- fix(task): try the remaining configured subagent models before the parent model by @Komzpa in #16640
- fix(internal-urls): describe a running worker that has no transcript yet in history:// by @Komzpa in #16645
- fix(task): merge isolated task branches when the parent has untracked baseline files by @Komzpa in #16648
- fix(coding-agent): sync open documents before a project-wide LSP rename by @holny in #16649
- fix(coding-agent): treat /v1/models rows that advertise reasoning levels as reasoning-capable by @Komzpa in #16650
- fix(coding-agent): write the migrated models.yml atomically with owner-only permissions by @adi-IL in #16654
- fix(ai): surface a thrown credential resolver instead of reporting a missing key by @adi-IL in #16655
- fix(coding-agent): scope /memory clear to the current project by @adi-IL in #16657
- fix(tui): honor GFM column alignment in markdown tables by @adi-IL in #16658
- fix(catalog): extend Devin model discovery timeout to 15s by @DusKing1 in #16668
- fix(ai): serve the nearest supported effort in the auth gateway by @codyw912 in #16671
- Add port 9931 (the new default) to local llama cpp discovery by @bartbroere in #16675
- fix(marketplace): prevented orphaned startup clones by @roboomp in #16697
- fix(coding-agent): sent each rewind report to the model once by @roboomp in #16703
- test(ai): narrow image clamp fixtures by @jwaldrip in #16709
- fix(coding-agent): cancel the outgoing session's background jobs on /resume by @will-bogusz in #16760
- fix(coding-agent): accept observed percentage meter totals by @alphastorm in #16885
- fix(ai): count repeated anthropic strict schema parameters by @alphastorm in #16887
- fix(ai): repair itemless arrays in codex tool schemas by @alphastorm in #16886
- feat(coding-agent): run side: true file commands as /btw side questions by @wolfiesch in #16815
- feat(coding-agent): let print mode wake on background job results by @trukhinyuri in #16690
- feat(tui): add Vim dot repeat to the prompt editor by @Shadorain in #16872
- feat(coding-agent): open local:// files in external editor via /local and Alt+G by @Shadorain in #16873
- fix(build): bump bundled Bun to 1.4.4 for CVE-2026-111497 and CVE-2026-91403 by @bse-ai in #16865
- fix(cache): share OpenCode Go Task family affinity by @rafalopilowski1 in #16988
- feat(computer): open files, folders and URLs and reveal them in Finder with apps.open on macOS by @will-bogusz in #16403
- fix(coding-agent): keep ts-set-map fast on long Set lines and stop two false reminders by @will-bogusz in #16556
- feat(coding-agent): include account policy state in omp usage --json by @will-bogusz in #16581
- fix(coding-agent,agent): keep a subagent's report when a peer message lands as it finishes by @will-bogusz in #16583
- fix(coding-agent): stop read doc.pdf:page.png returning an empty PDF viewer by @will-bogusz in #16585
- fix(coding-agent): keep a web page's native rendering when its short lines are tables and code by @will-bogusz in #16596
- fix(coding-agent): keep extension tools registered at a subagent's first prompt after it is revived by @will-bogusz in #16597
- fix(task): inline subagent reports up to 11.5k characters instead of cutting them at 5k by @will-bogusz in #16599
- feat(edit): record why an edit failed and count it in /session by @will-bogusz in #16608
- feat(coding-agent): show HEIC and AVIF photos in read instead of refusing them as binary by @will-bogusz in #16612
- fix(coding-agent): describe power.sleepPrevention as held only during turns by @will-bogusz in #16762
- refactor(coding-agent,tui): drop the unused jobs op from buildJobResult by @will-bogusz in #16763
- docs(coding-agent): say what clears an advisor's quota pause by @will-bogusz in #16766
- feat(coding-agent): add --no-context-files to start without AGENTS.md and other context files by @will-bogusz in #16768
- fix(natives,computer): read the macOS front app before el.type, el.press and el.click ask the target app by @will-bogusz in #16769
- fix(natives): stop a macOS background right or middle multi-click at the user's input by @will-bogusz in #16770
- feat(session): add --warn-cost and --max-cost to cap a session's spend by @will-bogusz in #16803
- fix(catalog): read Devin context windows from model info by @will-bogusz in #16905
- fix(catalog): identify Devin requests as CLI 3000.11.205 by @will-bogusz in #16906
- fix(browser): wait for the page a click navigates to before the next call by @will-bogusz in #16907
- fix(coding-agent): keep a headless computer run going after control.acquire answers no-ui by @will-bogusz in #16909
- fix(natives): open Contacts and Messages by name on macOS instead of calling them ambiguous by @will-bogusz in #16911
- fix(coding-agent): say what to call when computer.window finds no window for an app, or gets no selector by @will-bogusz in #16912
- fix(natives): name macOS ax() text fields that have no label by their placeholder by @will-bogusz in #16915
- fix(natives): tell an agent to click() a macOS element that has no press action by @will-bogusz in #16916
- fix(pi-shell): end the git guard's conflict exemption with the conflict by @will-bogusz in #16919
- feat(coding-agent,natives): exclude files and folders from grep with
!globpath entries by @will-bogusz in #16920 - feat(coding-agent,browser-relay): keep the relay extension current after an omp upgrade by @will-bogusz in #15105
- fix(lsp): release language server memory by closing documents unused for 5 minutes by @will-bogusz in #15418
- fix(ai): keep a declining Claude model's tool calls out of the turn after a fallback handoff by @will-bogusz in #16250
- fix(ai): sign Factory Droid logins without an organization claim into the account's organization by @will-bogusz in #16257
- fix(ai): keep a rotated OAuth refresh token when the exchange outlasts the caller's budget by @will-bogusz in #16291
- feat(ai,catalog): use the 1h prompt cache and cache warming on Factory Droid Claude models by @will-bogusz in #16296
- feat(ai,catalog): generate images through a Factory Droid login by @will-bogusz in #16316
- fix(coding-agent): keep a replaced file's CRLF line endings and BOM in write by @will-bogusz in #16575
- fix(pi-shell): keep diffs, jq results and ssh output whole up to 16 KB in the minimizer by @will-bogusz in #16589
New Contributors
- @LiPu-jpg made their first contribution in #16727
- @SheetHappiness made their first contribution in #16669
- @DAnaeto made their first contribution in #16682
- @integrITsolutions made their first contribution in #16707
- @Fun10165 made their first contribution in #16737
- @OriginalByteMe made their first contribution in #16740
- @berney made their first contribution in #16749
- @codyw912 made their first contribution in #16671
- @bartbroere made their first contribution in #16675
- @trukhinyuri made their first contribution in #16690
- @rafalopilowski1 made their first contribution in #16988
Full Changelog: v18.12.6...v18.13.0