Release · Oh My Pi · can1357

Oh My Pi v18.18.0

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

Release notes

Oh My Pi v18.18.0

@oh-my-pi/pi-catalog

Fixed
  • Fixed Mistral discovery listing embedding, OCR, moderation, transcription, and speech models as chat models; only rows with capabilities.completion_chat are offered, with context, image input, and reasoning read from the row (#18244 by @VeigaPunk)
  • A failed refresh no longer replaces a cached catalog whose models carry request headers with an empty snapshot; the next launch refetches it instead (#18227)

@oh-my-pi/pi-coding-agent

Fixed
  • Fixed transcript output freezing after provider restarts or switching sessions mid-stream (#18358 by @JustasMasiulis)
  • Bash tool cards for a command whose leading cd <dir> && / cd <dir>; was hoisted into the working directory show that cd again above the visualized command, with the separator the model wrote, instead of dropping where it ran
  • Bash commands starting with cd <dir>; ... now run in <dir> as their working directory when it exists, so its direnv environment loads and the directory shows on the tool card (#18329 by @harshaygadekar)
  • Task-file approvals show and keep the checked file target through dispatch, so retargeted symlinks cannot silently substitute another assignment; replaced files require a retry (#18314 by @iliaal).
  • Subagents receive task instructions with their blank lines, Markdown hard breaks, and table spacing intact, whether given inline or via taskFile.
  • Hindsight retain and learn memories are no longer lost when delivery fails or omp exits: they are kept on disk, retried, and delivered by the next session without duplicates (#18176 by @alphastorm)
  • Fixed the session crashing with Native shell returned an invalid execution trace when a bash command assigned a long value containing multi-byte characters such as Chinese text (#18259)
  • grep -e and rg -e in the bash tool accept patterns that start with - (e.g. grep -e "--canary") instead of failing with an unknown-option error.
  • The bash execution visualization keeps updating, and saved traces still restore, after a command handles bytes that aren't valid UTF-8 (e.g. v=$(printf '\377'))
  • On Windows, grep, glob and isolated subagents no longer flash a console window when they query or start the ovnfs daemon.
  • A bash command containing a bare [ (e.g. a && [ while still streaming) no longer crashes omp in the Pseudo shell visualization (#18320)
  • Fixed a prompt that mentions an internal-scheme URL with @ (e.g. @local://x, @vault://x) aborting the run with "uses internal scheme ... not as a filesystem path"; such a mention is now left as plain text (#16071)
  • Fixed MCP OAuth login and token refresh failing with JSON Parse error: Unexpected identifier "access_token" against GitHub's token endpoint (#18292)
  • MCP OAuth requests tokens for the MCP server's own resource (from its protected-resource metadata) instead of a different resource advertised by the authorization server, fixing 401 invalid_token after /mcp reauth on servers such as Firecrawl's hosted MCP (#18315)
  • Concurrent subagent MCP calls now grant newly loaded tools to the session that made each call, even when providers reuse call IDs. (#18324 by @eggpeat)
  • LSP document symbols now show identifier lines, so those lines work with references, definition, and rename (#18257).
  • Subagents on worker threads no longer fail with Cannot send … instance across threads when their model comes from an extension-registered provider with its own streamSimple (#18310 by @Dangerboi)
  • ⌘V in terminals with kitty enhanced paste (OSC 5522, e.g. Ghostty 1.4) now attaches macOS TIFF screenshots instead of reporting "Clipboard paste has no supported text or image data" (#17696, #18203 by @roboomp)
  • Disabling display.shellVisualization now omits bash execution traces from tool updates and saved sessions, including in ACP (#18267).
  • /quit and /exit no longer wait several seconds for an unresponsive OTLP telemetry collector (#18255).
  • Cancelling a Python eval cell right as it starts now stops the cell cleanly instead of letting it run and killing the kernel (#18242 by @eggpeat)
  • Browser open now returns the same tab with a recovery notice when Chrome detaches the relay during navigation and omp successfully reattaches, instead of failing the open and closing newly opened tabs (#18252 by @will-bogusz)
  • tab.errors() keeps the fields of plain-object and other non-Error rejections, bounded like console arguments, instead of reporting only Object (#16959) (#18251 by @Alex-Wengg)
  • An extension provider with authHeader: true keeps its cached fetchDynamicModels catalog when omp models refresh fails, instead of showing 0 models until the next successful forced refresh (#18227)
  • A session whose request carries no titleable text of its own — an attached @brief.md, a greeting, a bare number — is now named once from the assistant's reading of it, instead of staying untitled until the next message that happens to be titleable (which, for an agent launched from one brief and left to run, never came) (#18238 by @sjawhar)
  • Prewalk no longer hands a subagent to its cheap model when the subagent messages its parent or another agent (write agent://…) before its first file edit (#18322 by @1vivy)

@oh-my-pi/pi-mnemopi

Fixed
  • Fixed embedding rebuilds failing on hosted APIs that cap the inputs per request: embed() now splits large lists into requests of at most MNEMOPI_EMBEDDING_BATCH_SIZE texts (default 64; set 10 for DashScope) or the embeddings.batchSize runtime option, and returns null when the API returns a different number of vectors than texts (#18278 by @aleister1102)

…