@oh-my-pi/pi-ai
Breaking Changes
- Removed the Codex SSE stateful transport path, so SSE turns no longer send
previous_response_idwith delta input and now always send the full transcript
Changed
- Scoped
x-codex-turn-statehandling to within-turn continuations so only tool-loop follow-ups include the turn-state header and new user turns start without it
Removed
- Removed the
statefulResponsesoption fromOpenAICodexResponsesOptions, and SSE stateful mode is no longer controlled by thePI_CODEX_STATEFUL-style flag
Fixed
- Fixed the platform OpenAI Responses and Codex websocket stale-chain classifiers missing the "Unsupported parameter: previous_response_id" rejection phrasing (FastAPI-style
detailbody with noerror.code), so a chained turn now falls back to a full-transcript replay instead of surfacing the 400 - Fixed the HTTP-400 raw-request dump for Codex SSE to record the body actually sent on the wire instead of the pre-transport request body, which made chained-request failures look like the rejected parameter was never sent
@oh-my-pi/pi-catalog
Fixed
- Fixed Antigravity
gemini-3.1-pro --thinking highfailing withCloud Code Assist API error (400): Request contains an invalid argument.— the upstreamgemini-3.1-pro-highdeployment rejects everystreamGenerateContentrequest on both CCA endpoints while discovery still advertises it. High effort now routes togemini-pro-agent(the same "Gemini 3.1 Pro (High)" model, verified accepting the identical request body), and the model-cache fingerprint version was bumped (merge-v2→merge-v3) so existing fresh caches refetch discovery and pick up the corrected routing immediately.
@oh-my-pi/pi-coding-agent
Added
- Updated collab link handling to accept compact
roomId#keylinks and relay hosts without explicit scheme when joining or starting sessions - Added
/collab stopand/collab statusoptions to control and inspect active shared sessions - Added
/collab,/join, and/leavefor live session sharing: the host shares an end-to-end encrypted link (AES-256-GCM key only in the link fragment; the relay sees opaque bytes) and guests render the session natively in their own TUI — streaming text, tool cards, footer state, ctrl+o expansion,/dump— and can prompt or interrupt the host's agent. Guest prompts render with an author badge; session-mutating commands stay host-only. Defaults to the publicrelay.omp.shrelay (collab.relayUrl); a self-hostable Go relay lives in the pi-www repo asomp-collab-relay - Added
collab.relayUrlandcollab.displayNamesettings plus acollabstatus-line segment showing the participant count (host) or guest role. Guests mirror the host's real model/thinking state into their replica agent and the host's subagent ecosystem end-to-end: the live subagent HUD, the Agent Hub table with live progress, hub chat/kill/revive (routed to the host), and on-demand subagent transcript viewing - Added
omp join <link>subcommand that launches the interactive TUI and immediately runs/join <link>
Changed
- Moved collab live-session wire contracts into
@oh-my-pi/pi-wireand stopped broadcasting unsupported session events or entries to collab guests. - The Ctrl+P role-cycle track and the plan-approval model slider now color segments by track position from the theme's own palette (accent/success/warning/error + markdown/syntax hues, deduplicated per theme since many themes alias them) instead of role-keyed colors with a gray fallback for custom roles
- Interactive boot no longer blocks first paint on MCP server discovery. For UI sessions,
createAgentSessionreturns immediately and connects to configured MCP servers in the background; their tools and slash commands stream in through the existing live-refresh channel once connected. An explicitly requested MCP tool whose server has not finished connecting resolves to a deterministic "still connecting" placeholder instead of an "unknown tool" error, and each server's instructions join the system prompt once its background connection completes — carried in on the same live-refresh that registers its tools — so server-provided instructions are preserved, not dropped.tools.discoveryMode: "auto"is re-resolved once the background connect reports the real MCP tool count, so a toolset large enough to cross the threshold flips discovery on (registeringsearch_tool_bm25) instead of force-activating every tool, and a session disposed while servers are still connecting disconnects them instead of resurrecting their tools onto the dead session. Non-UI modes (print/rpc/acp) keep the blocking discovery path. Measured ~290 ms (≈24% of cold boot) off the first-paint critical path with MCP servers configured. - Assistant-message streaming is cheaper per token. During a stream the component now reuses its
Markdownsubtree across reveal ticks — only the growing block is re-rendered — instead of tearing down and re-lexing every block on each ~30 fps tick, and grapheme counting in the reveal controller is memoized. A completed thinking block that precedes a still-streaming answer is no longer re-highlighted every frame (~66% less render work on think-then-answer streams in benchmarks; single-block streams are unchanged). - Cold boot no longer builds the model catalog's canonical-equivalence index on the first-paint critical path. The
ModelRegistryconstructor builtbuildCanonicalModelIndexover the entire ~3,200-model catalog synchronously (~210 ms); it is now built lazily on first read (getCanonicalModels/getCanonicalVariants/getCanonicalId, reached by the model picker and byenabledModels/default-role pattern resolution), which a default interactive launch never touches before paint. Measured ~244 ms (≈16% of cold-boot wall) off first paint; the picker pays the one-time build on first open. - Repeat
readsummaries of an unchanged file no longer re-run the tree-sitter parse. The per-session summary is memoized on the content hash of the freshly-read bytes — the file is still read fresh on every call, so results stay correct without a staleness window — dropping a repeated same-file summary read from ~17 ms to ~2.5 ms. - Attributed the previously-unlabeled synchronous boot region in the
PI_TIMINGstartup table withmodelRegistry:init,buildCanonicalModelIndex, andinitTelemetryExportspans.
Fixed
- Fixed remote (SSH) image attachment silently inserting the local-machine path as plain text: when omp runs over SSH and the terminal forwards a bracketed-paste image path, the path is unreachable from the remote host. The path-as-text fallback is gone for unreachable paths and the status now points the user at the clipboard image-paste shortcut so the bytes actually cross the connection (#2375).
Security
- Rejected non-local
ws://relay URLs and invalid room keys when parsing collab links to prevent insecure or malformed session joins
@oh-my-pi/collab-web
Added
- Added deep-link auto-connection support from
#<roomId>#<key>URLs when opening the web app - Added subagent-focused UI with a side rail and detail drawer that surfaces each subagent’s lifecycle, running progress, and per-subagent transcript
- Added session status controls in the shell, including connection banners, toast notifications, and rejoin/new-link actions after a session ends
- Added the collab web package with the browser guest client, mock host, local relay, and relay contract tests.
Changed
- Changed relay socket behavior to retry transient disconnections with exponential backoff while treating terminal relay-close conditions and decryption failures as non-retriable
- Changed subagent transcript decoding to handle streamed JSONL payload chunks incrementally by preserving carry-over data across chunks
- Replaced the vendored collab wire type mirror with shared
@oh-my-pi/pi-wireprotocol contracts.
Security
- Hardened transcript Markdown rendering by escaping embedded HTML and allowing only safe link schemes
@oh-my-pi/pi-tui
Changed
- Markdown rendering during streaming re-lexes only the grown tail instead of the whole buffer on every reveal tick. marked has no resumable lexer, but block tokenization is local across a blank-line boundary with balanced fences, so the largest blank-line-bounded prefix's block tokens are frozen and reused (
lex(prefix) ++ lex(tail)), with a full-lex fallback for non-append edits, reference-link definitions, and CRLF input. The output is byte-identical to a full lex (covered by a contract test), turning the O(N²) cost of revealing a long single-block message into O(N): a 6,000-grapheme reveal dropped from ~575 ms to ~89 ms of CPU in benchmarks.
@oh-my-pi/pi-wire
Added
- Added shared collab live-session wire contracts for the host CLI and browser guest client.
What's Changed
- perf: cut cold-boot latency and streaming/render bottlenecks by @metaphorics in #2182
- fix(coding-agent): surface unreachable image-path pastes over SSH instead of silently inserting the local path by @roboomp in #2376
- feat(pi-shell): extend minimizer filter coverages and enhance machanisms by @metaphorics in #2319
Full Changelog: v15.11.7...v15.11.8