Release · Oh My Pi · can1357

Oh My Pi v18.18.1

What's new in Oh My Pi v18.18.1, released Nov 8, 2026 (). This is the latest version.

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 h hard_timeout is 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 stdio and serve no longer reject credentialless Apple on-device models (#18370)

@oh-my-pi/browser-relay

Changed
  • The extension now requests scripting and 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-1017 on Mistral and Venice) keep image attachments instead of being stripped to text-only (#18405)
  • compat.disabledThinking in models.yml now applies to anthropic-messages models, 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: BashCommand and ReadyEvent struct literals need exclude_from_context: None and supports_bash_exclude_from_context: None (#18206 by @andrebrait)
Added
  • RPC bash accepts excludeFromContext: true to keep a run out of model context like terminal !!; runtimes advertise support with supportsBashExcludeFromContext in the ready frame, and the Python SDK exposes that frame as client.ready (#18206 by @andrebrait)
Changed
  • Agent bash commands run with LANG/LC_ALL=C.UTF-8 on 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's env or .envrc still wins, and ! commands keep yours
  • omp's built-in shell (omp bash/omp zsh and the bash tool) parses scripts about a third faster, sources large function libraries about 20% faster, and re-runs a repeated eval or source without recompiling it.
  • The computer tool's el.perform() takes any spelling of an action ax() lists (perform("open")), and computer.backgroundFallback: refuse refuses every spelling of a raise, open, context menu or popup press (#15282 by @will-bogusz)
  • The computer tool no longer takes over your screen for a macOS win.drag across 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 install and reload it) (#16908 by @will-bogusz)
  • A %%bash cell in Python eval no longer prints its exit status (a stray 0) after the command's output; a failing cell reports %%bash: exit status N on stderr instead.
  • Reusing an already running omp stats dashboard 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 clear when removing it fails, or when creating it fails after the daemon may already have it, instead of being forgotten (#18337 by @eggpeat)
  • A retain call 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.patterns deny rule now blocks a command anywhere in a ;, |, || or && line even when an earlier prompt rule matches another part of it, and project settings can no longer override the operator's deny or prompt patterns with allow (#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 with null

…