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_chatare 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 thatcdagain 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
retainandlearnmemories 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 tracewhen a bash command assigned a long value containing multi-byte characters such as Chinese text (#18259) grep -eandrg -ein 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,globand 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
resourceadvertised by the authorization server, fixing401 invalid_tokenafter/mcp reauthon 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 threadswhen their model comes from an extension-registered provider with its ownstreamSimple(#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.shellVisualizationnow omits bash execution traces from tool updates and saved sessions, including in ACP (#18267). /quitand/exitno 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
opennow 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 onlyObject(#16959) (#18251 by @Alex-Wengg)- An extension provider with
authHeader: truekeeps its cachedfetchDynamicModelscatalog whenomp models refreshfails, 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 mostMNEMOPI_EMBEDDING_BATCH_SIZEtexts (default 64; set10for DashScope) or theembeddings.batchSizeruntime option, and returnsnullwhen the API returns a different number of vectors than texts (#18278 by @aleister1102)
…