@oh-my-pi/pi-agent-core
Breaking Changes
Agent.withdrawUndeliveredQueuedMessages()replaceswithdrawLiveSteering()and returns{ steering, followUp }: it also takes back queued input already dequeued for the next model call, which the aborted run then neither records nor reports inagent_end(#14179 by @andrebrait)
Added
- Added
Agent.setOnModelCallSystemPrompt, called with the exact system prompt each model call is built from (#14338 by @will-bogusz)
Changed
SessionInitEntry.systemPromptholds the system prompt blocks as sent; session files written earlier keep one joined string (#14338 by @will-bogusz)- Image token estimates now use the catalog's
imageTokens()formula with its OpenAI Responses wire rule; values are unchanged (#14286 by @will-bogusz).
Fixed
- Fixed the context count and auto-compaction trigger pricing every snapcompact archive frame at Opus's high-res rate, which overcounted Codex and Gemini sessions and could re-trigger compaction right after compacting (#14291 by @will-bogusz)
- Fixed native (OpenAI) compaction being refused as over the context window in sessions with many screenshots. Images were counted as about 1,200 tokens when deciding to compact but 12,000 when checking whether the compaction request fits; both checks now estimate images from their actual dimensions, and a request is no longer refused when only the image estimate pushes it over the window (#14260 by @H4vC).
- Fixed OpenAI and Codex Remote Compaction V2 dropping your recent messages instead of keeping them next to the compaction summary (#14247 by @will-bogusz)
- Fixed the failed V2 remote compaction warning claiming a V1 fallback on Codex, where V1 does not run (#14245 by @will-bogusz)
- Fixed Anthropic native compaction being rejected with
Invalid signature in thinking block(or silently dropping the summarized thinking) on models with preserved thinking (#14251 by @will-bogusz)
@oh-my-pi/pi-ai
Added
- Added per-model
compat.statefulResponsesto enable or disable stored Responses chaining (previous_response_idwithstore: true) for one endpoint without the official-only request fields thatcompat.officialEndpointimplies (#13686 by @alphastorm). - Added Snowflake Cortex with browser OAuth, token refresh, PAT environment authentication, and streaming Claude/OpenAI models with local tool execution (#14507 by @jorgoose).
AuthStorage.health.check()acceptsexcludeProvidersto skip credentials of providers the caller does not serve (#14234 by @will-bogusz)
Changed
- Reduced CPU spent on thinking-loop detection while streaming long reasoning (#14284 by @abilliontokens).
- Added
recordAffinity: falseto credential resolution options, selecting as the session would without pinning the choice to that session (#14512 by @will-bogusz)
Fixed
- Codex native-lane steering rejections (
unsupported_native_inflight_message) now classify as retryable from their error text alone, matching the provider's own classification, andAIError.isCodexSteerRejection()identifies them so the agent retry can stay on the same model (#14242 by @alphastorm) - Fixed replayed Responses and Codex history, including persisted Codex user/developer and assistant items, sending
detail: "original"images to endpoints whosesupportsImageDetailOriginalis off (#13687 by @alphastorm). - Fixed thinking in turns kept after Anthropic native compaction being rejected or dropped on the next request (#14251 by @will-bogusz)
- Fixed Claude usage being re-polled every 10 seconds while Anthropic rate-limits the account; a failed refresh now waits a minute before trying again (#14515 by @will-bogusz)
- Fixed Devin requests skipping the
onPayloadhook, so payload capture now sees each Devin chat request and a returned replacement is what gets sent (#14506 by @will-bogusz) - An OpenAI Responses turn whose connection drops mid-stream can now recover the finished answer from the provider (on hosts that store results, such as Muse Code) instead of re-running the whole turn and discarding the reasoning already done. Storage is opt-in: pass
storeResponses: true, setPI_MUSE_STORE_RESPONSES=1, or set a process-wide default withconfigureProviderStoreResponses(#14293 and #14534 by @abilliontokens). - Fixed the auth broker exiting when a background OAuth refresh sweep cannot read the credential store; the failure is now logged and the next sweep retries (#14538)
- Fixed Anthropic OAuth billing headers changing during developer-first sessions and side turns, preserving the prompt-cache prefix (#14495).
- Fixed OpenAI-compatible chat-completions gateways recording completed turns as client-cancelled because the connection closed before their
[DONE]sentinel arrived (#14481).
@oh-my-pi/browser-relay
Fixed
- Fixed the extension reporting tabs that DevTools or another debugger extension is inspecting as its own attachments, which made the relay skip attaching to them (#14224 by @will-bogusz)
@oh-my-pi/pi-catalog
Added
- Added an optional
statefulResponsescompat field for OpenAI Responses models, kept through OpenRouter's Responses dispatch (#13686 by @alphastorm). - Added 15 Snowflake Cortex models with account-specific endpoints, Cortex compatibility rules, and estimated account-billed pricing (#14507 by @jorgoose).
- Added the
image-tokenizationaxis, which declares how GPT-5.2+, Claude and Gemini 3 lines bill input images on every host, with wire-API fallback rules for other models, plusimageTokens()to price one image (#14286 by @will-bogusz).
Changed
- Changed OpenAI Responses endpoints other than OpenAI, Azure OpenAI, and Codex (custom and local servers, proxies including
azure/openai-codexproviders pointed at a non-Azure/non-CodexbaseUrl, OpenRouter) to defaultsupportsImageDetailOriginaltofalse, so snapcompact frames and computer screenshots go out asdetail: "auto"instead of failing on servers that rejectoriginal; setcompat.supportsImageDetailOriginal: trueto opt a host in (#13687 by @alphastorm).
Fixed
- Muse Code can now store Responses results on Meta's side (
store-responses), so a turn whose connection drops can be recovered instead of re-run. Storage is opt-in via the omp settingproviders.muse-code.storeResponsesorPI_MUSE_STORE_RESPONSES=1(#14293 and #14534 by @abilliontokens). - Fixed Google Antigravity listing models the signed-in account cannot use, such as Claude Opus 5.5 and Sonnet 5.5 on plans without them, which failed every request with
404 Requested entity was not found. After a successful model refresh and on subsequent restarts, only models in the account's own Antigravity model list are offered (#14328).
@oh-my-pi/pi-coding-agent
Breaking Changes
createAgentSessionnow throwsCould not restore model <provider/id>when a resumed session's saved models cannot be restored, andAgentSession.switchSessionthrows it, keeping the current session, when it opens such a session; both still fall back with a warning whenhasUIis set andretry.modelFallbackis on, and hosts that cannot show that warning can opt out withallowSessionModelFallback: false(#13689 by @alphastorm).
Added
- Added an agents HUD pill counting running subagents, opening the agent hub on click
- In Tern the thinking level shows as the composer model chip's icon instead of a separate chip, still cycling on click, while
statusLine.compactThinkingLevel(Compact Thinking Level, on by default) is on - Added
computer.zoom()and window-localzoom()in JavaScript and Python Eval, with native-detail region captures that preserve full-screenshot click coordinates. - Added window menus, combined
observe(), native application discovery/launch, live display handles, bounded input holds, human-approved task control, and macOS Space helpers in both Eval languages. - RPC
open_sessionandswitch_sessionaccept an optionalprovider/modelIdpair that binds the session to that model instead of its saved one, as--modeldoes at startup;RpcClient.openSession()/switchSession()and the Python client'sopen_session()/switch_session()take it too (#13689 by @alphastorm) - Added
compat.statefulResponsestomodels.yml, so a provider or model can opt into or out of stored Responses chaining without the process-widePI_OPENAI_STATEFUL(#13686 by @alphastorm). - Added the
app.stt.pushToTalkkeybinding, defaulting toSpace, so push-to-talk can be remapped or disabled independently from speech-to-text andapp.stt.toggle(#6592 by @anatoli-tsinovoy). - Added an
expandThinkingBlockssetting that keeps finished thinking blocks expanded in Tern instead of collapsing them at turn end (#14519 by @H4vC) - RPC clients can show and toggle
/slow:get_statereportsslowModeSupported,slowModeEnabled, and a provider-neutralusageLimit(wrap-up or low-priority stage, with reset times for the client's timezone), and the newset_slow_modecommand turns it on or off; the TypeScript client and the generated Python, Go, and Rust SDKs gain a matchingsetSlowMode/set_slow_mode/SetSlowModemethod (#14153 by @andrebrait) - RPC clients can now stop a turn the way Esc does in the TUI with
abort_and_restore_queue: queued steering and follow-up messages are taken back and returned for the editor instead of running in a new turn after the abort (#14179 by @andrebrait) - RPC
remove_queued_messagenow returns the removed message's images, so clients can put an edited queued message back in the editor with its attachments (#14179 by @andrebrait) - Added
/btwside questions for RPC hosts:btwasks one (or a follow-up in an earlier topic) while the main turn keeps running, the answer streams asbtw_delta/btw_recordframes,btw_cancelstops it, andget_btw_historylists the session's BTW history shared with the TUI (#14110 by @andrebrait) - Added the
providers.muse-code.storeResponsessetting (off by default;PI_MUSE_STORE_RESPONSESoverrides it) to store Muse Code results on Meta's servers, so a turn whose connection drops is recovered instead of re-run (#14534 by @abilliontokens).
Changed
- In Tern the spinner, elapsed time and intent share one activity line with the todo, which stays in place between turns, and the tok/s readout moves into the composer bar after the thinking level
- Computer-use desktop captures now default to the focused window's monitor, with primary-monitor fallback;
computer.display: allremains available explicitly. - Computer-use guidance selects AX for semantic controls and screenshots for custom-drawn surfaces, with grouped actions and explicit state verification.
- Bash commands that print binary or other non-UTF-8 output no longer stall while their output is decoded (#14454 by @H4vC)
- Edit previews stay responsive while long edits stream, and
readparses large files for block context off the main thread (#14520 by @H4vC) - While a
sloppy-mode edit streams, its preview no longer guesses an edit for a*** Findwhose*** Replacehas not arrived yet; the preview of an earlier file section that ends in a bare*** Findstill matches what will be applied (#14520 by @H4vC) @file mentions autocomplete faster in large repositories (#14454 by @H4vC)- Large mermaid flowcharts and state diagrams render much faster while a response streams (#14454 by @H4vC)
- Diff hunk headers now name the enclosing function the way git does: the nearest earlier line starting with a letter,
_or$, cut to 80 bytes;#-prefixed and indented lines are no longer picked (#14521 by @H4vC) - Made browser
tab.observe()much faster on element-heavy pages, especially over the relay: listed elements are resolved to handles only whentab.id(n)uses them (#14431 by @will-bogusz)
Fixed
- Fixed Tern tooltips naming keys with Nerd Font icons Tern's UI font lacks (a box after "Thinking effort"); they show keycaps (
⇧⇥) whatever the symbol preset - Fixed
/new, session switches, and Esc aborts hanging for up to 30 seconds while an extension'smessage_endhook was still running; they now wait only for end-of-turn maintenance. - Fixed Tern's per-turn usage row showing a 24-hour time while the user message above it showed a 12-hour time; both now follow the terminal's clock (#14565 by @wolfiesch)
- Fixed Tern's agents pill missing while a finished subagent runs again after an IRC message woke or revived it; it now counts running agents as the status-line badge does
- Fixed browser
tab.goto,back,forwardandreloadtiming out on pages whose ad, chat or other iframe never finishes loading, although the page itself had loaded (#14421 by @will-bogusz) - Fixed the token count after a snapcompact compaction (divider and RPC result) disagreeing with the context count right after it (#14291 by @will-bogusz)
- Fixed snapcompact archives stopping at 17 frames on models that read 1568px frames (OpenAI, Codex, and Claude before Opus 4.7); they now keep 26 under the same 3 MB image payload cap, and an archive whose frames run heavier than estimated is re-rendered with fewer frames instead of being rejected (#14277 by @will-bogusz).
- Preserved original-detail image pixels through both Eval runtimes instead of resizing screenshots again and requiring model-side coordinate conversion.
- Retired queued and in-flight native input on computer-run cancellation and teardown, including unawaited operations, without canceling later runs.
- Fixed the
/usagesheet in Tern missing the Close button the other report sheets have (#14455 by @H4vC). - Fixed a browser page load abandoned by cancelling a run still replacing the page afterwards; the cancelled load is now stopped, so a run that had taken over request interception also returns at once instead of failing with "Failed to restore browser request interception". Cancelling a run that is not navigating leaves the page's in-flight requests alone (#14425 by @will-bogusz)
- Fixed cancelling a bash command on Windows sometimes terminating an unrelated program (#14454 by @H4vC)
- Fixed
umaskin a bash command changing the umask of omp itself (#14454 by @H4vC) - Fixed a mermaid
xychartwhose axis range is finer than floating-point precision freezing the terminal (#14454 by @H4vC) - Fixed resuming a session whose saved model cannot be restored silently sending its transcript to another model. At startup,
--continue/--resumein print, JSON, RPC, andrpc-uimodes (and in the TUI withretry.modelFallback: false) now exits with an error naming the model instead of using the settings-default or first available model. At runtime, RPCopen_sessionandswitch_session, ACP session load and fork, and extension session switches fail withCould not restore model <provider/id>and keep the current session instead of continuing on the current model; TUI/resumewarnsCould not restore model <provider/id>. Using <provider/id>, or fails with the error whenretry.modelFallbackis off./resumealso restores models from discovery-backed providers the way startup does (#12274, #13689 by @alphastorm). - Auto-retry no longer switches to the fallback chain when Codex's native turn lane rejects live steering after the response streamed reasoning; the turn retries on the same model with the steering message as ordinary input, and the chain is consulted only once no same-model retry is left (#14242 by @alphastorm)
- Fixed bash commands re-running a direnv
.envrc(and devenv setup) on every call; an unchanged direnv environment is now reused (#14310 by @n3oney). - Fixed the
computerguide telling the model that refs from its earlierax()reads expire; it now says an element keeps its[ref=eN]across reads until its role or label changes (#14485 by @will-bogusz) - Fixed snapcompact inline imaging judging savings by the gateway's frame cost instead of the reading model's (#14286 by @will-bogusz).
- Fixed a session running past local midnight losing its earlier Claude reasoning (or failing with a 400 under strict thinking binding) because a message you sent mid-turn was rewritten with the new date (#14339 by @will-bogusz).
- Fixed OpenAI and Codex Remote Compaction V2 dropping a
/skill:or collab prompt you sent from the kept history, and kept screenshots inflating the post-compaction token count and discarding speculative compactions (#14247 by @will-bogusz) - Fixed cold-resumed subagents losing signed thinking because their system prompt blocks were joined (#14338 by @will-bogusz)
- Fixed the first kept assistant turn losing its thinking after Anthropic native compaction, including after a date or working-directory change and on later compactions (#14251 by @will-bogusz)
- Fixed Claude rejecting or dropping the thinking kept after a compaction when the date or working directory had changed during a tool call in the kept turns; the date/cwd reminder those turns were sent with is no longer removed (#14502 by @H4vC)
- Fixed browser
tab.waitForDownload()andtab.downloads()reporting a path that does not exist when another open tab set a differentdownloadsdirectory (#14434 by @will-bogusz) - Fixed subagents keeping the MCP tools they started with after
/mcp reloador adding or removing an MCP server; running and revived subagents now follow the main session's MCP tools (#14441 by @abilliontokens). - Fixed the browser relay failing its first command on a tab that DevTools or another debugger extension already had open (#14224 by @will-bogusz)
- Fixed browser runs through the relay hanging and failing on pages with cross-origin iframes (embedded sign-in, payment or help widgets) (#14228 by @will-bogusz)
- Fixed browser clicks on Chromium and Tern tabs landing on the surrounding paragraph, without following the link, when the link wraps across two lines (#14229 by @will-bogusz)
- Fixed browser tab and element-handle clicks and
check/uncheckon an element that never becomes clickable timing out with no reason; the timeout now names the last failed check, such asdisplay:none(#14230 by @will-bogusz) - Fixed browser
check(),uncheck()andclick()refusing or timing out on custom-styled checkboxes and radios whose real input is transparent or drawn over by its label (#14231 by @will-bogusz) - Fixed
omp auth-gateway serveadvertising and routing models from providers listed indisabledProviders;omp auth-gateway checknow skips those providers' credentials too (#14234 by @will-bogusz) - Fixed browser calls in relay mode each waiting 35 seconds after Chrome quit and then reporting that the extension "never connected"; they now fail at once and say it disconnected (#14236 by @will-bogusz)
- Fixed
/shakeand other history rewrites during a running tool call leaving the context meter stale and dropping that tool call from the agent's history (#14261 by @will-bogusz) - Fixed a session using a custom
browser.relayUrlport stopping the browser relay that other sessions were using on a different port (#14407 by @will-bogusz) - Fixed browser
tab.click(selector)failing at once with "matched no visible element" when the page renders the target a moment later; it now waits liketab.fill,tab.typeandtab.dblclick(#14408 by @will-bogusz) - Fixed browser
tab.fill()andtab.type()on a disabled or read-only field wiping it and typing into whichever field had focus while reporting success; they now fail with the reason (#14412 by @will-bogusz) - Fixed browser
tab.fill(selector, "")clearing a field without telling the page, so React and Vue forms kept and submitted the old value; the clear now firesinputandchange(#14413 by @will-bogusz) - Fixed browser
tab.waitForDownload()missing a download started by the next tab action on tabs opened without adownloadsdirectory; the file landed in the browser's default folder and the wait timed out (#14417 by @will-bogusz) - Fixed
browser.openfailing with a bare[object ErrorEvent]when the browser's debugger websocket refuses the connection; the error now names the endpoint and why it failed (#14418 by @will-bogusz) - Fixed browser tab evaluations hanging when the page redirected again while the tab was being read; they now run on the page the redirect landed on (#14423 by @will-bogusz)
- Fixed browser dropdown selection resetting to the first option when given an option's visible label instead of its value, on Chrome and cmux tabs and element handles;
select()now fails and leaves the dropdown unchanged when a value matches no option, on every backend (#14226 by @will-bogusz) - Fixed browser key combos such as
Control+afailing on Chrome tabs, frames and elements, and macOS editing shortcuts and clipboard copy/paste doing nothing (#14225 by @will-bogusz) - Fixed browser
tab.extract("text")running headings, paragraphs, list items and table cells together on one line, and leaking<script>/<style>text with aselector(#14227 by @will-bogusz) - Fixed
omp dry-balancesaving a 30-day session pin toagent.dbfor every sampled session id (#14512 by @will-bogusz) - Fixed
omp dry-balancerejecting--config; it now applies the overlay likePI_CONFIG_FILES, so account-policy experiments route as configured (#14513 by @will-bogusz) - Fixed
omp dry-balancefailing to resolve credential-scoped dynamic models, such as Factory Droid's, thatomp modelslists (#14514 by @will-bogusz) - Fixed browser element right and double clicks (
click({ button, count })) becoming one left click on Tern and cmux tabs; cmux now refuses the buttons and counts it cannot press (#14232 by @will-bogusz) - Fixed browser
openandtab.observe()reporting a fixed 1365x768 viewport on relay, attached and visible browsers instead of the tab's real window size and pixel ratio (#14409 by @will-bogusz) - Fixed browser runs and helper calls failing with "Failed to restore browser request interception" after their work had finished, including every call on pages with a hung cross-site iframe (#14410 by @will-bogusz)
- Fixed
browser.openon a page that outlasts itstimeoutclosing the tab with a bare "Browser open timed out"; the tab now stays on what loaded and the error names the navigation andbrowser.tab(name). A new tab whose navigation fails outright, or whose open is cancelled, is still closed (#14420 by @will-bogusz) - Fixed browser
tab.observe()leaving out every control inside iframes (embedded sign-in, payment and checkout forms), including iframes inside a web component's shadow root underselector, so they got no ids to act on. An iframe that does not answer within 5 seconds is left out and skipped by later observations until it navigates (#14415 by @will-bogusz) - Pressing Esc while a queued message is about to be sent now restores it to the editor instead of the stopped turn recording it (#14179 by @andrebrait)
- Fixed
editsilently dropping late LSP diagnostics from slow servers such as tsserver; they now arrive like they do forwrite(#14214) - Fixed multi-question
askdropping the ticked options of a multi-select question when the user also typed an "Other" answer; the model now receives both (#14369) - Focused subagents can now recall queued steering messages with Alt+Up or Shift+Up without restoring a message from the main session (#14464).
- Fixed results that a focused subagent submits after you prompt it in the TUI never reaching the parent agent: the subagent's
agent://<id>artifact is now updated and the parent receives the completion (#14428) - Computer use on KDE Plasma Wayland now types printable characters through the keymap KWin announces instead of failing with "no usable XKB keymap was announced", and
type("…\n")presses Enter (#13848) - Budget-stopped subagents no longer issue automatic retry requests after being reported cancelled; they remain available for explicit resumption (#13892).
- Fixed switching models mid-session keeping the previous model's
inlineToolDescriptors: autodecision, which sent empty tool descriptions to the new model and failed withfunction.description is required(#14200) - Fixed advisors staying quota-paused when another account's temporary auth block ends at the retry wait limit (#14551).
- Fixed
omp worktree addand other git operations failing withgit open: … does not appear to be a git repositorywhen the checkout directory name ends in.git(#14553) - Fixed Mnemopi embedding workers (and other local-model workers) staying alive and holding gigabytes of RAM after the omp process that started them exited mid-embedding (#14340)
- Fixed a supervised PTY service on Windows hanging when it asks the terminal for the cursor position; the launch broker now answers the query as it does on Linux and macOS
- Fixed snapcompact's short final frames preventing vision-backed sessions from continuing on backends that reject 32px-or-smaller images (#14355).
- Fixed the agent's
goalcalls asking for approval under--approval-mode write, which paused goal-mode loops atcomplete;always-askstill prompts for goal changes but notget(#14368) - Fixed MCP server connection progress popping up a toast for every server that connects or fails in native terminals such as Tern; it now shows only in the classic terminal transcript
@oh-my-pi/pi-natives
Breaking Changes
isoResolvenow returns a Promise and runs off the JavaScript thread; a backend found available is not re-probed (#14528 by @H4vC)
Added
- Added
encodeSixelAsyncanddecodeSixelToPngAsync, which encode and decode SIXEL off the JavaScript thread (#14529 by @H4vC) - Added
warmBlockParse, which parses a file for block context off the JavaScript thread so later block-context lookups answer from the cache; files over 4 MiB, which the cache does not keep, are skipped (#14520 by @H4vC) - Added native screenshot region capture without replacing the full-frame coordinate reference, native cancellation generations, and cross-process input/focus ownership.
- Added operation-scoped physical Escape cancellation on macOS.
- Added native application discovery/launch, background menus, combined image/AX observations, display targets, bounded held input, task control ownership, and macOS Space movement.
Changed
- Replaced per-screenshot macOS subprocesses and intermediate PNGs with a persistent ScreenCaptureKit main-loop worker on macOS 14+ and in-process CoreGraphics on macOS 12/13.
- Read macOS window metadata from one coherent Quartz snapshot instead of re-enumerating the desktop for each window property.
- Defaulted desktop capture to the focused window's monitor, retaining explicit all-display and display-ID selection.
- Removed legacy desktop-addon emulation; computer use now requires the current native capture/cancellation API.
- Sped up the embedded shell on command output that is not valid UTF-8: decoding is linear, so commands printing binary data no longer stall (1 MiB took 14 s), and captured output is decoded once (#14454 by @H4vC)
- Sped up edit previews while edit arguments stream: diffs, fuzzy matching and hashline parsing no longer redo or copy all their work for every streamed chunk (#14520 by @H4vC)
- Sped up
fuzzyFind: a cached scan is scored in place instead of being copied on every call (#14454 by @H4vC) - Sped up applying multi-hunk patches and
astEditcalls with many edits (#14521 by @H4vC) - Sped up
countTokenson long runs of one kind of character, such as whitespace or letters (#14454 by @H4vC) - Sped up builtins that print many lines (
ls,find,paste,diff,cmp,wc,echo,ts),while readandmapfileloops over files, andsedscripts usingN(#14522 by @H4vC) - Sped up flowchart and state diagram rendering in
renderMermaidAscii; a 40-node flowchart renders about 14× faster, with identical output (#14454 by @H4vC) - Sped up
find -type,rm -r,mkdir -p,lsandstat, especially on Windows (#14523 by @H4vC) - Sped up
sedscripts that use regular expressions,printfoutput, andsort -, which now reads standard input directly instead of copying it to a temporary file (#14454 by @H4vC) - Sped up
cpandmvof directory trees;mvwithin one filesystem no longer walks the moved tree first (#14524 by @H4vC) - Staging files or hunks keeps the git index's file stat cache, so the next status check no longer re-reads every tracked file; staging many files rewrites the index once (#14454 by @H4vC)
pidwaitand PTY sessions wait for process exit and cancellation events instead of polling (#14526 by @H4vC)- Applying a patch to the worktree reads only the files the patch touches (#14454 by @H4vC)
- Sped up
listWorkspace,fuzzyFindwith followed symlinks, andfd; the file-mention scan cache releases expired entries sooner (#14527 by @H4vC) - Sped up parsing of large hashline edits (#14454 by @H4vC)
- Sped up copy-on-write task isolation setup on reflink (Linux) and ReFS (Windows) volumes (#14528 by @H4vC)
Process.waitForExit()on a single process waits for the operating system's exit notification instead of polling every 50 ms (#14454 by @H4vC)- Reduced memory and copying in
renderMermaidAscii, snapcompact rendering and single-display desktop screenshots (#14529 by @H4vC) DesktopSession.capabilitiesno longer blocks behind a running capture or input operation: while one runs, it answers from the capabilities read by the latest capture or capabilities call; otherwise it reads them live (#14529 by @H4vC)- Native OAuth logins are detected as soon as the browser redirects, without polling every 20 ms (#14531 by @H4vC)
- Reduced the memory used by the local completion model's tokenizer (#14533 by @H4vC)
- Long lines cut by the lint, gt and system output minimizers now end in
…[+N], showing how many characters were dropped (#14532 by @H4vC) - Reduced the memory used by tokenizer tables and by counting Claude tokens on long inputs (#14530 by @H4vC)
Fixed
- Rejected stale display-layout coordinates before pointer input and zoom, and preserved the previous coordinate frame when a capture is canceled.
- Released held input on cancellation and refused competing native mutations before dispatch.
- Fixed
umaskin the embedded shell changing the host process's umask; the mask now belongs to the shell, applies to files created by redirections, builtins such astouch,mkdirandcp, and external commands, and a subshell'sumaskno longer leaks out (#14454 by @H4vC) - Fixed diff hunk headers sometimes naming a different enclosing function than
git diffdoes (#14521 by @H4vC) - Fixed
enable execandenable suspendrestoring builtins that replace or stop the host process (#14454 by @H4vC) - Fixed
ls -tandls -Slisting entries with equal times or sizes in arbitrary order, andls --group-directories-firstscrambling entries within each group; ties now sort by name as in GNUls(#14523 by @H4vC) - Fixed
rm -randrm -don Windows failing on a directory that has the read-only attribute (#14523 by @H4vC) - Fixed
declare -rlisting only readonly variables that were also traced, anddeclare -tlisting every variable (#14454 by @H4vC) - Fixed
sedregular expressions treating\bas a backspace instead of a word boundary (#14454 by @H4vC) - Fixed
mvbetween filesystems losing modification times, modes, ownership, subdirectory extended attributes and hard links, failing on sockets, and removing source symlinks when copying an entry failed (#14524 by @H4vC) - Fixed
sortreading standard input again for each repeated-operand (#14454 by @H4vC) - Fixed
sortcollating text only on its first run in a session and taking its collation order, decimal point and thousands separator from omp's own locale instead of the shell'sLC_ALL,LC_COLLATE,LC_NUMERICandLANG, andsort --parallelchanging the host's thread pool:--parallel=Nnow limits that sort to N threads and rejects invalid counts as GNU sort does (#14525 by @H4vC) - Fixed
taccrashing omp when the file it read was truncated at the same time (#14525 by @H4vC) - Fixed
tail -fpiped into a command that exits early (such asgrep -m1) never stopping, including when following provider-backed paths (#14525 by @H4vC) - Fixed run cancellation on Windows terminating an unrelated older process when the cancelled command reused the process ID of that process's exited parent (#14454 by @H4vC)
- Fixed staging hunks and stashing clearing the index's skip-worktree flags, so files outside a sparse checkout no longer show as deleted afterwards (#14454 by @H4vC)
- Fixed the
psqloutput minimizer listing every table row whose first column began with a word likeERRORabove the table, instead of applying the row limit (#14454 by @H4vC) - Fixed a PTY command hanging forever when its output callback stopped consuming output; the bridge now disconnects after the stall timeout like the shell bridge (#14526 by @H4vC)
- Fixed
Process.args()on Windows returning an empty list for elevated processes when the caller is not elevated (#14526 by @H4vC) - Fixed strings passed to native functions sometimes losing their last characters when they ended in non-ASCII text (seen as
highlightCodedropping the end of long lines) (#14454 by @H4vC) - Fixed
renderMermaidAsciihanging and running out of memory on anxychartaxis whose range is finer than floating-point precision (#14454 by @H4vC) - Fixed copied task isolation trees on Windows turning directory symlinks into file symlinks (#14528 by @H4vC)
- Fixed
getWorkProfile()attributing async work to the wrong region or dropping it (#14454 by @H4vC) - Fixed
readandmapfilein the embedded shell treating Ctrl-C and Ctrl-D bytes in a file or pipe as an interrupt or end of input (printf 'a\003b\n' | read -r xfailed,printf '\004x\n' | mapfilestored nothing); they are keys only when standard input is a terminal (#14522 by @H4vC) - Fixed
readstoring each byte of UTF-8 input as a separate character (ébecameé);read -nandread -Nnow count characters instead of bytes, as bash does (#14522 by @H4vC) - Fixed
read -dwith a multibyte delimiter never matching; it stops at the delimiter's first byte, as bash does (#14522 by @H4vC) - Fixed
echo -e -Eexpanding escapes; the later option wins, as in bash (#14522 by @H4vC) - Fixed
mapfile -Owriting into a readonly array; it now fails before reading any input, as bash does (#14522 by @H4vC) - Fixed
computerelement refs expiring after twoax()reads of a window while the element was still there: an element now keeps its[ref=eN]acrossax()andfind()reads, even after missing a single snapshot. An element whose role or label changes gets a new ref, and its old ref keeps working until it expires; on Windows, an element that reuses a gone element'sRuntimeIdgets a new ref, and one whoseRuntimeIdcannot be read gets a new ref on every read (#14485 by @will-bogusz) - Fixed short snapcompact PNGs being emitted below the minimum dimensions accepted by some vision backends (#14355).
@oh-my-pi/snapcompact
Breaking Changes
maxFramesForDataBudget()now takes the frame shape instead of a byte budget, so the default 1568px shapes get 26 frames instead of 17 (#14277 by @will-bogusz).
Added
- Added
frameBilling,frameTokensandframeBillingKey, which price a rendered frame at what the model reading it is billed (#14291 by @will-bogusz)
Fixed
- Fixed snapcompact frame token estimates following the gateway instead of the model reading the frames, which mispriced Claude behind OpenRouter or Vertex and Claude 4.6 and older (#14286 by @will-bogusz).
- Fixed short snapcompact frames being rejected by vision backends that require image dimensions above 32px (#14355).
@oh-my-pi/pi-tui
Breaking Changes
WorkingRowSpecno longer takesrate: the native working row reads spinner, elapsed time, divider, then the intent, and the tok/s readout moved to the composer bar
Added
ComposerNativeState.rateshows a tok/s readout in the native composer bar after the effort chip, andComposerNativeState.thinkingInModeldraws the thinking level as the model chip's icon instead of a separate chipformatTooltipKeyformats a key for a native tooltip: unicode keycap glyphs whatever the symbol preset,escfor EscapeImageOptions.requestRenderrepaints an image without an image budget once its SIXEL encode lands (#14529 by @H4vC)AssistantMessageComponentcan keep finished thinking sections expanded viasetExpandThinkingBlocks(); sections folded by hand stay folded (#14519 by @H4vC)
Changed
/hotkeysshows the effectiveapp.stt.pushToTalkbinding, includingDisabledwhen unbound (#6592 by @anatoli-tsinovoy).- SIXEL images are encoded off the main thread, so showing an image no longer stalls the terminal (#14529 by @H4vC)
Fixed
- Fixed native tooltips (composer, working row, queue, pause screen, git and extension dashboards) naming keys with Nerd Font icons Tern's UI font lacks, or as raw key ids (
ctrl+g); they use keycap glyphs (⇧⇥,⌃G) - Fixed Tern's per-turn usage row showing a 24-hour time on a 12-hour terminal clock; the row and its tooltip now follow the terminal's clock, keeping the tooltip's ISO date (#14565 by @wolfiesch)
- Fixed hold-Space push-to-talk stopping the instant recording began (showing "No speech detected.") when opening the microphone briefly froze the UI (#14463 by @pgkt04)
@oh-my-pi/pi-utils
Breaking Changes
- Replaced the
cursorPositionoption ofTerminalQueryResponderwithhostCursorHandshake, which leaves only the PTY host's own session-start cursor query unanswered instead of every cursor-position query
What's Changed
- fix(tui): add Close button to the native /usage sheet by @H4vC in #14455
- fix(natives): various native fixes and uplifts by @H4vC in #14454
- test(natives): expect the 64px snapcompact frame floor by @H4vC in #14459
- fix(session): retry the same model when codex rejects live steering by @alphastorm in #14242
- feat(ai): make responses chaining a per-model compat setting by @alphastorm in #13686
- fix(catalog): default unknown responses hosts to auto image detail by @alphastorm in #13687
- fix(natives): keep the macOS process exit wait Send by @H4vC in #14461
- fix(coding-agent): fail closed when a resumed model is unavailable by @alphastorm in #13689
- fix(tui): stop hold-space push-to-talk from ending as soon as it starts by @pgkt04 in #14463
- feat(coding-agent): make push-to-talk key configurable by @anatoli-tsinovoy in #6592
- fix(coding-agent): keep steering messages stable across a date rollover by @will-bogusz in #14339
- fix(agent): stop logging a V1 fallback that will not run after V2 compaction fails by @will-bogusz in #14245
- fix(agent): retain user turns in Remote Compaction V2 replacement history by @will-bogusz in #14247
- fix(agent,coding-agent): keep resumed subagents' reasoning by replaying their system prompt blocks by @will-bogusz in #14338
- fix(agent,ai,coding-agent): keep signed thinking valid across Anthropic native compaction by @will-bogusz in #14251
- fix(browser): report where a download was actually saved by @will-bogusz in #14434
- fix(coding-agent): keep subagent MCP tools in step with parent reloads by @abilliontokens in #14441
- fix(coding-agent): keep kept turns' date/cwd reminders across compaction by @H4vC in #14502
- fix(coding-agent): stop relay runs hanging on pages with cross-origin iframes by @will-bogusz in #14228
- fix(browser): click a wrapped link on the link instead of its paragraph by @will-bogusz in #14229
- fix(browser): say why a click that never became clickable timed out by @will-bogusz in #14230
- fix(browser): make check() and click() work on custom-styled checkboxes by @will-bogusz in #14231
- fix(coding-agent): honor disabledProviders in auth-gateway serve and check by @will-bogusz in #14234
- fix(coding-agent): fail browser calls at once after Chrome quits in relay mode by @will-bogusz in #14236
- docs: explain how running sessions choose and keep accounts by @will-bogusz in #14238
- fix(coding-agent): keep the in-flight tool call when shaking mid-turn by @will-bogusz in #14261
- fix(browser): wait for tab.click targets the page renders a moment later by @will-bogusz in #14408
- fix(browser): refuse to fill or type into a disabled or read-only field by @will-bogusz in #14412
- fix(browser): report an empty fill to the page so framework forms see the cleared value by @will-bogusz in #14413
- fix(browser): track downloads started right after waitForDownload by @will-bogusz in #14417
- fix(browser): name the refused debugger websocket instead of [object ErrorEvent] by @will-bogusz in #14418
- fix(browser): stop tab evaluations hanging when a page redirects mid-read by @will-bogusz in #14423
- fix(browser-relay): let omp drive tabs that DevTools or another debugger already has open by @will-bogusz in #14224
- fix(coding-agent): keep browser relays on different ports from stopping each other by @will-bogusz in #14407
- perf(ai): bound thinking-loop exact-cycle scan to the max unit length by @abilliontokens in #14284
- feat(ai): resume dropped muse-code Responses streams from the stored result by @abilliontokens in #14293
- fix(browser): make key combos and macOS editing shortcuts work on Chrome tabs by @will-bogusz in #14225
- fix(ai): wait a minute before re-polling Claude usage after a 429 by @will-bogusz in #14515
- fix(browser): select dropdown options by visible label as well as value by @will-bogusz in #14226
- fix(ai,coding-agent): stop omp dry-balance pinning every sampled session in agent.db by @will-bogusz in #14512
- fix(coding-agent): accept --config overlays in omp dry-balance by @will-bogusz in #14513
- fix(coding-agent): let omp dry-balance resolve credential-scoped models like Factory Droid's by @will-bogusz in #14514
- fix(browser): keep block boundaries as line breaks in extracted text by @will-bogusz in #14227
- fix(browser): stop element right and double clicks becoming one left click on Tern and cmux by @will-bogusz in #14232
- fix(ai): call onPayload for Devin chat requests by @will-bogusz in #14506
- fix(browser): report the real viewport on attached and visible browsers by @will-bogusz in #14409
- feat(tui): add option to keep thinking blocks expanded by @H4vC in #14519
- fix(coding-agent): keep browser run results when interception cleanup fails by @will-bogusz in #14410
- fix(agent,coding-agent,snapcompact): count snapcompact frames at their per-shape price by @will-bogusz in #14291
- fix(browser): stop goto, back, forward and reload timing out on pages with a never-finishing iframe by @will-bogusz in #14421
- fix(snapcompact): price frames by the model reading them, not the gateway by @will-bogusz in #14286
- fix(snapcompact): size the frame payload cap by frame area by @will-bogusz in #14277
- fix(coding-agent): include iframe controls in browser observe by @will-bogusz in #14415
- feat(ai): add Snowflake Cortex provider by @jorgoose in #14507
- fix(browser): keep the tab when browser.open outlasts its timeout by @will-bogusz in #14420
- fix(browser): make cancelling a run while a page loads return at once and stop the load by @will-bogusz in #14425
- fix(natives): keep an accessibility element's ref across ax() reads by @will-bogusz in #14485
- feat(coding-agent): make Muse Code response storage an opt-in setting by @abilliontokens in #14534
- feat(coding-agent/rpc): add /btw side questions for RPC hosts by @andrebrait in #14110
- feat(rpc): expose provider-neutral slow mode and usage-limit state by @andrebrait in #14153
- feat(rpc): added abort_and_restore_queue command by @andrebrait in #14179
- perf(browser): resolve observe() element handles when tab.id() uses them by @will-bogusz in #14431
- perf(edit): cheaper edit previews and diffs while arguments stream by @H4vC in #14520
- perf(builtins): stop re-statting by path in filesystem builtins by @H4vC in #14523
- perf(iso): off-thread backend probes and handle-based tree clones by @H4vC in #14528
- perf(natives/utok): smaller tokenizer tables and bounded Claude scratch by @H4vC in #14530
- refactor(shell): minimizer filters on shared primitives by @H4vC in #14532
- perf(predict,voice): one token arena; one audio device worker by @H4vC in #14533
- perf(vcs,ast): linear hunk naming, patch apply and astEdit by @H4vC in #14521
- perf(builtins): buffered output and block input in builtins by @H4vC in #14522
- refactor: one event-driven process layer for pi-builtins, pi-shell and the PTY by @H4vC in #14526
- perf(search): lazy walker identities, cheaper workspace walk, shared search plumbing by @H4vC in #14527
- perf(natives): event-driven OAuth callback wait; shared validators by @H4vC in #14531
- fix(builtins): stop sort, tac and tail from touching omp-wide state by @H4vC in #14525
- fix(builtins): GNU-correct cross-filesystem mv on cp's copy engine; faster cp by @H4vC in #14524
- perf(natives): rendering and desktop work off the JS thread and without extra copies by @H4vC in #14529
- chore(bazel): refresh MODULE.bazel.lock by @H4vC in #14547
- fix(tui): show usage row times on the terminal's clock by @wolfiesch in #14565
- fix(coding-agent): re-decided inline tool descriptors on model switch by @roboomp in #14205
- fix(edit): kept late lsp diagnostics fresh after edits by @roboomp in #14218
- fix(coding-agent): reap ipc workers whose main thread blocks in native code by @roboomp in #14350
- fix(ask): kept ticked options alongside other text in multi-question asks by @roboomp in #14372
- fix(task): delivered focused subagent manual yields to the parent by @roboomp in #14429
- fix(tui): restored focused subagent steering recall by @roboomp in #14465
- fix(ai): drained completions streams to [DONE] before closing by @roboomp in #14482
- fix(ai): stabilized oauth billing header across side turns by @roboomp in #14505
- fix(ai): kept auth-broker alive when a refresh sweep fails by @roboomp in #14540
- fix(coding-agent): restore BTW history controller test coverage by @roboomp in #14552
- fix(vcs): opened gix via the .git entry instead of the checkout root by @roboomp in #14556
- fix(advisor): prevent quota latch at sibling retry limit by @roboomp in #14560
- fix(natives): read libei keymaps from offset 0 and parse numeric groups by @roboomp in #13852
- fix(agent): stopped retries after budget cancellation by @roboomp in #13895
- fix: cache direnv instead of running from 0 on every bash call by @n3oney in #14310
New Contributors
Full Changelog: v18.6.2...v18.6.3