github can1357/oh-my-pi v18.13.0

5 hours ago

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

Added

  • Added SummaryOptions.remotePromptCacheKey and remoteCompactionPolicyModel() 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-time values above about 596 hours (such as 600h) 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.compacting context 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

  • OpenAIRequestSetupModel now requires the catalog-policy fields (api, reasoning), so callers building a reduced model for resolveOpenAIRequestSetup must pass them (#16988 by @rafalopilowski1)

Added

  • Added PI_ANTHROPIC_API_VERSION=2026-10-21 to 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 declaring providerType: "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 const value to a tool's own enum array (#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_enum label, 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: gzip without an explicit Accept, and no longer send the Claude thinking beta header to Claude 5.5 (#17012 by @apoc)

Fixed

  • Anthropic-compatible endpoints that require a thinking block 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-band error frame, 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/usage returns rate_limit: null for them, and their per-user credit cap (spend_control.individual_limit) is now reported as a Spend 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_message when 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.5 after the V2.5 retirement (#16727 by @LiPu-jpg)
  • Fixed Xiaomi MiMo login rejecting ttp- Token Plan keys with 401 Invalid API Key; they now validate against the regional Token Plan hosts like tp- keys (#17045)
  • Fixed Xiaomi MiMo Token Plan login reporting 401 Invalid API Key when 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 items when a tool or a task's outputSchema declares an array without items (#16886 by @alphastorm)
  • Fixed Anthropic tools whose parameters are a root anyOf/oneOf/allOf of objects being sent as an empty closed object that only accepts {}; variant properties now fold into the root input_schema (#16630)
  • Fixed OAuth logins failing with invalid_grant after 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_image runs 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 with The operation timed out. after ~5 minutes of slow prefill even when providers.streamFirstEventTimeoutSeconds allowed longer (#16991)
  • Fixed model.loopGuard settings being ignored for providers routed through the shared option mapping, such as openai-responses models from models.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 small maxTokens requests with reasoning on, ending with thinking only and no answer; the requested maxTokens now 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-cache axis to shared-prompt-cache (catalog field sharedPromptCache); it now also covers forks and explicit prompt-cache keys (#16988 by @rafalopilowski1)

Added

  • Added the requiresThinkingPresence model compat (KDL requires-thinking-presence) for Anthropic-compatible endpoints that reject a thinking-mode request whose current turn has an assistant message without a thinking block (#16739 by @lz37)
  • Added resolveAnthropicApiVersion(): Anthropic model discovery sends API version 2026-10-21 to the official API when PI_ANTHROPIC_API_VERSION=2026-10-21 is 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) and deepseek-v4-pro, omen-alpha (Completions) opt into shared prompt caching; lanes that warmed under any key stay off (#16988 by @rafalopilowski1)
  • Added CatalogPolicyInputs so 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 bundled models.json, so a stale-snapshot regeneration can no longer silently drop an engine the way web/deepseek was 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, then http://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 aicode scope 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-Agent now reports the native Antigravity build for the host OS (Linux linux/amd64, Windows windows/amd64) instead of always claiming macOS darwin/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-argon requests 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 (openai and openai-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 baseUrl keeps 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 -1m lanes, 262K for SWE-2), and GPT and Grok models with a long-context price tier start at that tier's threshold, with /extended-context on opening their full window (#16905 by @will-bogusz)
  • Added the extended-cache-ttl-beta compat axis so a route can opt out of the extended-cache-ttl-2025-04-11 beta (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 image role's choices, listed only while your Factory organization allows image generation and that model (#16316 by @will-bogusz)
  • Fixed LiteLLM model groups with mode: decisions being listed as chat models; they now route to openai-decisions as 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 API kimi-k3 card (#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

  • snapshotJobs no longer accepts includeResults, and buildJobResult accepts only the "wait" and "cancel" ops; the "jobs" op has had no caller since wait and proc:// replaced the hub tool (#16763 by @will-bogusz)

Added

  • Added omp -p --wait-async (setting async.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: true frontmatter (including Codex and OpenCode command directories) run as /btw side questions in the TUI, with or without arguments: they answer off the transcript and never steer a running turn. The panel and /btw history title them by the typed command (/sitrep); the title is kept in an entry-<id>.title sidecar so older builds can still read the history. Other modes expand them as ordinary prompts (#16815 by @wolfiesch)
  • Added compat.requiresThinkingPresence to models.yml overrides, 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 omits temperature under 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 (or Alt+G, remappable as app.local.open) opens a picker of the session's local:// 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-files to start a session without AGENTS.md, CLAUDE.md or other context files, including those of --add-dir roots 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 on dumpTools (#16864 by @michaeltrefry)
  • The note read adds to a PDF whose pages have no extractable text (a scan) now points at the :page<N>.png selector, which returns the page as an image, instead of the browser prelude (#16585 by @will-bogusz)
  • read doc.pdf:page<N>.png renders 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-cost and --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 RPC get_session_stats, as editRejections) lists your failed edits by why they were refused (unseen lines, stale tag, parse error, …), and each failed edit records that reason as details.errorKind in the session file (#16608 by @will-bogusz)
  • Added exclusions to grep: a path entry 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)
  • wait and read 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 explicit Accept) (#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 yield reaching its parent and agent:// as its short reply to a peer message or agent://all broadcast (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-map rule stalling tool-call streaming on a long single-line Set value (5 s at 20,000 characters) and firing when the literal array only feeds a computed argument such as new Set(["a", "b"].map(normalize)); ts-import-type no longer fires on import("x").then written 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's ida_* tools), which also made its first request after waking miss the prompt cache; extensions see the revive as a before_agent_start with the new reason: "revive" (#16597 by @will-bogusz)
  • read shows 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 read of 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 --json now includes each policy-routed account's priority, reserve and routing state (eligible, inside-reserve, exhausted or unknown) as a policy object, 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_image can 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 the image role (#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/extension is rewritten and reloads itself once no omp session is using the relay (#15105 by @will-bogusz)
  • Added a note to relay browser.open results when the Chrome extension was installed by an older omp, naming omp browser-relay install and a reload (#15105 by @will-bogusz)
  • Fixed images attached with an @path file mention reaching a text-only model as [image omitted: …] with images.describeForTextModels enabled; they now get the vision role description like pasted images (#16853)
  • Fixed browser.open({ ignore_https_errors: true }) still failing with certificate errors such as net::ERR_CERT_AUTHORITY_INVALID on the shared Chromium and on app.cdp_url browsers; the override now lasts until the tab is closed (#16930)
  • ignore_https_errors through the Chrome relay now fails up front, explaining that Chrome's extension debugger API cannot ignore certificate errors and pointing to app.relay: false, instead of failing with Security.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> and write proc://<agent>/kill answering "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_search results 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.sleepPrevention setting 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 computer tool's computer.window({ app }) failing for an app with no open window without saying what to do; the error now names the computer.apps.open(…) call that launches it (on macOS it also shows a window of a running app that has none), and computer.window() with no argument asks for a window id or filter instead of listing windows that "match undefined" (#16912 by @will-bogusz)
  • Fixed the computer tool prompt leaving el.selectText out of the element helpers; it now says a following el.type on that element replaces the selection (#16769 by @will-bogusz)

Fixed

  • Honored display_name, context_window, and input_modalities when a model list nests them under metadata, 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 omp binaries 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 computer runs in subagents and omp -p stopping at their first control.acquire: they now keep working through background window input and report only a step that needs foreground control (#16909 by @will-bogusz)
  • With bash.gitGuard on, a repository that once finished a conflicted rebase no longer counts as mid-conflict forever, which had let git checkout, switch and restore through; branch switches such as git checkout -B <branch> <commit> stay refused during a real merge or rebase too, abbreviated options such as git reset --ha are refused like the full ones, and git stash create is 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 destroyed or Cannot find context with specified id, and a fill could 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 read line selectors using different coordinates from URL grep when the response includes transport headers (#16877).
  • Fixed write to a SQLite row ignoring the database's declared foreign keys: orphan inserts and updates now fail, ON DELETE RESTRICT blocks the delete, and ON DELETE CASCADE removes dependent rows (#16999)
  • Fixed pasting a server URL into the /mcp add wizard putting it in the hidden chat draft instead of the URL field (#16975).
  • omp --from-claude keeps 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 by naming the button's own slotted content; real overlays are still refused (#16958)
  • Fixed reading .xlsx files rewriting numeric-looking text cells: long IDs like 12345678901234567890 no longer round (and collide), and text such as 00123 keeps its leading zeros (#16831)
  • Fixed rc-file aliases for core tools (e.g. alias ls='eza --icons') leaking into the bash tool; ls, cat, grep and 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.autoStart shares the moved session (#16935)
  • Fixed skill-description compression ignoring the configured default model when modelRoles.smol is unset and sending background requests to the built-in smol chain (e.g. claude-haiku-5-5) instead of the model /models shows for SMOL (#16970)
  • Fixed models.yml discovery providers with an apiKey (and no authHeader: true) showing 0 models in /models and ctrl+p right after startup despite a cached catalog; cached models now load immediately (#16965)
  • Anthropic web search no longer sends unsupported temperature to Claude Haiku 5.5, avoiding HTTP 400 failures (#16986)
  • Fixed pages in the managed headless browser hitting "Maximum call stack size exceeded" in canvas fillText after calling canvas.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 upgrade failing on Windows with EPERM: operation not permitted, symlink when the installed plugin was replaced by omp plugin link; a failed upgrade now restores the link as a junction (#16844)
  • omp plugin upgrade a@m b@m c@m now upgrades every specified plugin instead of silently skipping targets after the first (#16826)
  • Browser tab.fill()/tab.type() (and frame.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>: prompt policy on a tool mounted as an xd:// device asking the same approval question twice for one write xd://<tool> call (#17039)
  • ACP cancellation now waits through Python kernel interrupt escalation before closing a session; prompts sent after a closed session return ResourceNotFound so clients can offer session/load recovery (#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: decisions model groups being offered as chat models instead of judge models, including for custom discovery.type: litellm providers (#16939)
  • ACP: instructions returned by MCP servers declared in session/new now reach the model under "## MCP Server Instructions", as they do for .mcp.json servers (#16882)
  • Fixed the Windows tab title (e.g. in Tern) sticking at omp instead of the session title after a JS eval worker or omp browser-relay ran 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 eval reporting the backend unavailable when the first python on PATH is broken (e.g. a mise shim with no version set) even though a working python/python3 sits 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 error frame for the missing terminal event — ending instead of continuing from the partial answer (#16990 by @Maziar123)
  • Model tags in /skill: arguments now register m<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, or uninstall run 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 todo call 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 sources or falling back to engines that cannot read X posts (#16947 by @BAKocska)
  • Fixed /delete leaving 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 --extension with the real path; discovery now dedupes extension paths by real file (#16788 by @wolfiesch)
  • Fixed the write refusal in read-only subagents saying filesystem writes are unavailable; it now gives the on-disk path of local:// files, so the agent can tell its caller where its report is (#17023 by @sjawhar)
  • Fixed wait saying 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 usage now shows the Codex credit spend cap for credit-billed ChatGPT Business/Enterprise seats (previously no 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, eval or task arguments: 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 eval tool description so JS sessions see which helpers need await (#16808 by @bigHippoZz)
  • Fixed the eval agent and judge docs so JS sessions see which handle, pool and batch calls need await, and Python sessions with JS enabled see agent()'s schema_mode keyword instead of JS's schemaMode (#16810 by @bigHippoZz)
  • Fixed a classifier refusal on an Anthropic model ending the turn with the rest of an Anthropic retry.fallbackChains entry 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 sending cat > file <<'EOF' to read (#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_CALL errors 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 /tan dropping 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 /tan starts, so the next message cannot send them again, and come back with the draft when it cannot start (#16805 by @lemonleks)
  • Fixed /btw dropping the images attached to its question: the side request now sends them, and like /tan they leave the composer once it starts and come back with the draft when it cannot; BTW history keeps each question's images (images on 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, /handoff and /cleanse no 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, /btw and others): the draft now comes back with its images (#16805 by @lemonleks)
  • Fixed a hashline PUT whose 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 --compress exiting 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)
  • /resume into another session now cancels the previous session's background jobs, as /new does, 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.yml readable 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 clear in one project deleting the memory state of every other project that shares the same agent directory (#16657 by @adi-IL)
  • Fixed the classic /usage report 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 read of 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 grep trimming 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 as N+ when every file was searched (#16594 by @will-bogusz)
  • Fixed isolated task capture failing with patch does not apply: <path> does not exist when 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_extraction refusals and lost memories (#16679).
  • Fixed each rewind report being sent to the model twice (as a Branch-return summary and as the Checkpoint called and rewound report); 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/stdout and /dev/fd/1) triggering the unoverridable critical-command approval prompt; dd to real devices like /dev/sda still prompts (#16714)
  • Fixed Word and EPUB reads, site-specific web scrapers (Stack Overflow, MDN, GitLab, …) and the browser's readable page extraction writing identifiers as snake\_case or DOCX\_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 new m<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-list discovery leaving models that advertise their own reasoning levels (supported_reasoning_levels and default_reasoning_level, top-level or under metadata as codex-lb sends them) non-reasoning when the id is absent from the bundled catalog, so requests never carried reasoning_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.target rejecting CDP page ids, including fresh about:blank pages, and added ids to unmatched-target listings (#16619)
  • Fixed reading proc://<id>/kill or proc://<id>/mode answering only "writable only", so agents often moved on with the job still running; the error now names the write call 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 eval tool telling sessions with only the Python runtime to call tool.<name>(args) without await, 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; /compact and 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 serve token 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>.png returning 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 write turning a CRLF file into LF and dropping its UTF-8 BOM when it replaces the file; it now keeps both, as edit does (#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 like tôi being stored as the participant i (#16723)

@oh-my-pi/pi-natives

Added

  • A failed EditStore.apply outcome carries errorKind, a stable class of the refusal (unseen_lines, stale_tag, parse, …), and editErrorKinds() lists every class (#16608 by @will-bogusz)
  • Added exclude to grep() 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, openApplication also opens a file, folder or URL in its default application or ApplicationOpenOptions.app, and reveal shows a file or folder selected in Finder; other platforms return Unsupported for a URL, app or reveal (#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 ps reporting an unsupported long option such as --forest as unsupported option '--'; it now names the option, and every unsupported-option error says that a system ps, if installed, may support more options when run by its full path (#17018 by @sjawhar)
  • Fixed kill %N on 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=X such 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 to click() 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() and find() 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 full output counting code-frame lines with function calls, such as 14 | assert skill.read() == …, as diagnostics and files, which inflated the N diagnostics in M files summary (#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 ps crashing the shell on a non-ASCII character in an option cluster such as ps -é; it now reports unsupported 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.type and el.press sent 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-v2 lines where > follows a multibyte character (#16749 by @berney)
  • Fixed the bash tool's rg and fd on macOS and Linux finding nothing under a path that is a symlink to a directory, such as /tmp or /etc on 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 show and diff -u output 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 renderMermaidAscii starting 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") and openApplication("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, axKeyChord and axClick sending 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 with UserIntervened, 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, jq and ssh output that fits in 16 KB: it now arrives whole, and the patch summary, the 40-line jq cap and the remote head/tail cut apply only to larger output (#16589 by @will-bogusz)

@oh-my-pi/pi-tui

Breaking Changes

  • CoordinationOp no longer includes "jobs", which no tool has produced since wait and proc:// replaced the hub tool (#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 Args section 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 modelEnds to GroupedFileSection: 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 title to BtwHistoryRecord and a title option to BtwPanelComponent: the /btw panel, history list and thread show it as the topic heading in place of the question, so a side command reads as /sitrep instead 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; u undoes a whole Insert session or . in one step (#16872 by @Shadorain)
  • Added the app.local.open keybinding (default Alt+G) and its keyboard shortcuts row (#16873 by @Shadorain)
  • Added errorKind to EditToolDetails, 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_wait and vibe_list worker 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.maxInlineImages images (#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 truncated warning 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

  • Faster lenient JSONL session parsing when recovering past malformed lines (#16995 by @GTanger)

Fixed

  • setProcessName() no longer assigns process.title on 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 !glob path 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

Full Changelog: v18.12.6...v18.13.0

Don't miss a new oh-my-pi release

NewReleases is sending notifications on new releases.