Release notes
Oh My Pi v18.18.1
@oh-my-pi/pi-ai
Fixed
- Cursor exec frames keep tool-batch order: a file mutation (native StrReplace and Write,
write,delete,pi_edit,pi_write) waits for the calls issued before it, and the calls issued after it wait until it lands, so a Shell sent in the same batch as a StrReplace no longer runs before the edit's write (#18434 by @KadirBerkpolat1) - ChatGPT Pro Max (
promax) counts as Pro for Codex account routing, so a blocked Pro account no longer wins over an open or pinned Pro Max account (#18399 by @serverinspector) - Cursor Shell results no longer end with
Timeout clamped to 3600s (requested 86400s; …): Cursor's 24 hhard_timeoutis capped at the bash tool's 3600 s ceiling before it reaches the tool (#18433 by @KadirBerkpolat1) - A 429 or 402 worded like a context overflow (Bedrock's "429 Too many tokens, please wait…") is treated as a rate limit, so it retries and walks the fallback chain instead of compacting (#18345 by @nick-maderight)
auth-gateway stdioandserveno longer reject credentialless Apple on-device models (#18370)
@oh-my-pi/browser-relay
Changed
- The extension now requests
scriptingand access to all sites (Chrome lists "Read and change all your data on all websites"); it uses them only to empty another extension's frames in a tab omp is driving, when Chrome refuses it the debugger there (#16908 by @will-bogusz)
Fixed
- Fixed a password manager's inline autofill menu locking omp out of a tab it drives: the extension empties and hides such frames in that tab and retries the attach or command Chrome refused (#16908 by @will-bogusz)
@oh-my-pi/pi-catalog
Fixed
- Corrected Devin SWE-2 Flash and SWE-2 Fast token pricing, and SWE-2's promotional rates and end time (#18332 by @eggpeat)
- DeepSeek V4.1 Flash ids spelled with a hyphen (
deepseek-v4-1-flash-1017on Mistral and Venice) keep image attachments instead of being stripped to text-only (#18405) compat.disabledThinkinginmodels.ymlnow applies toanthropic-messagesmodels, so a custom Anthropic provider can switch thinking off when Off is selected (#18412 by @farnoy)
@oh-my-pi/pi-coding-agent
Breaking Changes
- Rust SDK:
BashCommandandReadyEventstruct literals needexclude_from_context: Noneandsupports_bash_exclude_from_context: None(#18206 by @andrebrait)
Added
- RPC
bashacceptsexcludeFromContext: trueto keep a run out of model context like terminal!!; runtimes advertise support withsupportsBashExcludeFromContextin thereadyframe, and the Python SDK exposes that frame asclient.ready(#18206 by @andrebrait)
Changed
- Agent
bashcommands run withLANG/LC_ALL=C.UTF-8on every platform instead of the inherited locale, so sort order, number formats and tool messages no longer vary by machine; a locale in the command'senvor.envrcstill wins, and!commands keep yours - omp's built-in shell (
omp bash/omp zshand the bash tool) parses scripts about a third faster, sources large function libraries about 20% faster, and re-runs a repeatedevalorsourcewithout recompiling it. - The
computertool'sel.perform()takes any spelling of an actionax()lists (perform("open")), andcomputer.backgroundFallback: refuserefuses every spelling of a raise, open, context menu or popup press (#15282 by @will-bogusz) - The
computertool no longer takes over your screen for a macOSwin.dragacross the text of a native text view, such as a TextEdit document; it selects that text in the background and returns the selection (#16223 by @will-bogusz)
Fixed
- A browser relay tab stays usable after a password manager's inline autofill menu opens in it; the call that opened the menu still fails once (reinstall the extension with
omp browser-relay installand reload it) (#16908 by @will-bogusz) - A
%%bashcell in Python eval no longer prints its exit status (a stray0) after the command's output; a failing cell reports%%bash: exit status Non stderr instead. - Reusing an already running
omp statsdashboard now exits successfully without stopping the existing server (#18443). - A function defined inside a command substitution in a here-document body (
cat <<E/$(f() { …; }; f)/E) no longer crashes the built-in shell. - A Cursor tool call sent in the same batch as a native StrReplace or Write no longer runs before the edit is written, so a check right after an edit sees the new file (#18434 by @KadirBerkpolat1)
- Pinned sessions color their pin icon with the theme accent in the status line and the band composer's title instead of taking the title's color or dim style, matching the resume picker (#18401 by @SuperUserA)
- An ovnfs checkout stays recoverable with
omp worktree clearwhen removing it fails, or when creating it fails after the daemon may already have it, instead of being forgotten (#18337 by @eggpeat) - A
retaincall that fails midway no longer delivers part of itself to the Hindsight server while telling the model nothing was queued (#18440 by @eggpeat) - A
bash.patternsdenyrule now blocks a command anywhere in a;,|,||or&&line even when an earlierpromptrule matches another part of it, and project settings can no longer override the operator'sdenyorpromptpatterns withallow(#18349 by @asuffield) - A subagent stopped by the session cost cap (
--max-cost/session.maxCost) now reports the cap's refusal instead of "Subagent ended without a final message" (#18362) - ERB templates open in ruby-lsp as
erb, so valid templates no longer report dozens of bogus Ruby errors, and a diagnostics pull ruby-lsp answers withnull
…