github can1357/oh-my-pi v15.11.8

one hour ago

@oh-my-pi/pi-ai

Breaking Changes

  • Removed the Codex SSE stateful transport path, so SSE turns no longer send previous_response_id with delta input and now always send the full transcript

Changed

  • Scoped x-codex-turn-state handling 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 statefulResponses option from OpenAICodexResponsesOptions, and SSE stateful mode is no longer controlled by the PI_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 detail body with no error.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 high failing with Cloud Code Assist API error (400): Request contains an invalid argument. — the upstream gemini-3.1-pro-high deployment rejects every streamGenerateContent request on both CCA endpoints while discovery still advertises it. High effort now routes to gemini-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-v2merge-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#key links and relay hosts without explicit scheme when joining or starting sessions
  • Added /collab stop and /collab status options to control and inspect active shared sessions
  • Added /collab, /join, and /leave for 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 public relay.omp.sh relay (collab.relayUrl); a self-hostable Go relay lives in the pi-www repo as omp-collab-relay
  • Added collab.relayUrl and collab.displayName settings plus a collab status-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-wire and 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, createAgentSession returns 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 (registering search_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 Markdown subtree 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 ModelRegistry constructor built buildCanonicalModelIndex over 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 by enabledModels/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 read summaries 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_TIMING startup table with modelRegistry:init, buildCanonicalModelIndex, and initTelemetryExport spans.

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-wire protocol 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

Don't miss a new oh-my-pi release

NewReleases is sending notifications on new releases.