- Fixed `calculateContextTokens` including provider orchestration tokens in context sizing, which could trigger premature auto-compaction and context promotion on Codex/Fugu turns with sizable provider-side orchestration. ([#4469](https://github.com/can1357/oh-my-pi/issues/4469))
- Fixed an issue where provider orchestration tokens were incorrectly included in context token calculations, which could trigger premature context auto-compaction and promotion.
- Cursor provider: reject `grepArgs` frames with an empty`pattern` at the exec dispatch (returning an actionable, glob-aware `GrepResult.error`) instead of surfacing the coding-agent grep tool's bare "Pattern must not be empty" and persisting a synthesized tool-call block whose pattern rendered as `?` in the TUI ([#4574](https://github.com/can1357/oh-my-pi/issues/4574)).
- Fixed Gemini CLI / Antigravity (Google Cloud Code Assist API) incorrectly retrying empty-response failures on non-`STOP` finishReasons (such as safety or recitation blocks) and hiding the specific API error behind a generic "Cloud Code Assist API returned an empty response" message. The provider now breaks early on errors and correctly bubbles up the underlying API error message immediately.
- Fixed GitHub Copilot OpenAI Responses replay persisting hidden-empty assistant turns as native history, preventing reasoning-only empty completions from poisoning later requests with stale assistant summaries. ([#4597](https://github.com/can1357/oh-my-pi/issues/4597))
- Fixed provider gateway `quotainsufficient` / `额度不足` errors being classified as generic 403 failures instead of usage-limit errors.
- Aligned the `openai-responses` strict-mode gate and resolved strict-support detection with `openai-completions` so buildModel-created OpenAI-compatible Responses models (for example DeepSeek-family endpoints) preserve an author-set `tool.strict === false` on the wire unless `compat.supportsStrictMode` is explicitly `false` ([#4527](https://github.com/can1357/oh-my-pi/issues/4527)).
- Fixed custom `openai-codex-responses` providers with opaque proxy/API keys failing before dispatch when no ChatGPT `chatgpt_account_id` claim exists; Codex requests now omit `chatgpt-account-id` when it cannot be derived. ([#4526](https://github.com/can1357/oh-my-pi/issues/4526))
- Fixed OpenAI Responses/Codex orchestration token accounting so provider-side orchestration tokens stay billable and included in totals without appearing as ordinary uncached prompt input. ([#4469](https://github.com/can1357/oh-my-pi/issues/4469))
- Fixed Google Gemini hidden-thinking-summary requests so direct Google and Cloud Code Assist providers keep the requested reasoning tier while sending `includeThoughts: false`.
- Fixed identifierless parallel OpenAI-compatible tool-call argument streams so sibling bash JSON cannot bleed into the first command.
- Fixed prior-turn reasoning demotion for Anthropic Claude models by generalizing the Fable-only bare-prose branch to the whole Anthropic dialect, so cross-model replays to Opus, Sonnet, Haiku, and Mythos no longer emit `<thinking>` tags that Anthropic's reasoning_extraction classifier flags as visible reasoning leakage. Also extended the Claude-id fallback classifier to Bedrock cross-region inference profiles (`us.anthropic.claude-…`, `eu.anthropic.claude-…`, etc.) so Haiku dotted profiles route to the Anthropic dialect, and appended a paragraph terminator to the demoted-thinking text block itself so bare Anthropic-dialect reasoning no longer runs into the following visible-answer block when the openai-completions convert path flattens adjacent text (without corrupting ordinary multi-block visible text from bridges, imported transcripts, or streaming chunk splits) ([#4430](https://github.com/can1357/oh-my-pi/issues/4430)).
- Fixed same-model Anthropic thinking replay to drop unsigned prior reasoning blocks instead of demoting them into visible `<thinking>` text, preventing reasoning-extraction refusals. ([#4428](https://github.com/can1357/oh-my-pi/issues/4428))
- Fixed custom OpenAI-compatible relays serving OpenAI model ids so service-tier resolution can classify them as OpenAI-family targets for fast mode ([#4386](https://github.com/can1357/oh-my-pi/issues/4386)).
- Fixed Cursor provider handling of empty-pattern grep arguments to return a clear, actionable error instead of a generic error and a broken TUI rendering.
- Fixed Google Cloud Code Assist API (Antigravity) and Gemini CLI to immediately bubble up underlying API errors (such as safety or recitation blocks) instead of incorrectly retrying and hiding them behind a generic empty-response message.
- Fixed GitHub Copilot OpenAI Responses replay to prevent empty reasoning-only assistant turns from being persisted in history and poisoning subsequent requests.
- Fixed classification of provider gateway quota-insufficient errors so they are correctly identified as usage-limit errors rather than generic 403 failures.
- Fixed OpenAI-compatible Responses models (such as DeepSeek endpoints) to preserve user-configured toolstrictness settings unless strict mode is explicitly unsupported.
- Fixed custom openai-codex-responses providers failing when no ChatGPT account ID claim is present by omitting the header when it cannot be derived.
- Fixed token accounting for OpenAI Responses and Codex providers to correctly include provider-side orchestration tokens in billing totals without misclassifying them as uncached prompt input.
- Fixed Google Gemini and Cloud Code Assist providers to preserve the requested reasoning tier when sending requests with hidden thinking summaries.
- Fixed parallel OpenAI-compatible tool-call streaming to prevent argument data from bleeding across concurrent commands when identifiers are missing.
- Fixed Anthropic Claude reasoning and thinking replay handling. Same-model replays now drop unsigned prior reasoning blocks to prevent reasoning-extraction refusals, while cross-model replays (including Bedrock cross-region profiles) correctly demote reasoning without emitting raw thinking tags or causing text-flattening formatting issues.
- Fixed custom OpenAI-compatible relays serving standard OpenAI model IDs to be correctly classified as OpenAI-family targets for fast mode.
- Fixed usage cost calculation to include provider orchestration token sidecars without forcing those tokens into normal input/output/cache buckets. ([#4469](https://github.com/can1357/oh-my-pi/issues/4469))
- Fixed usage cost calculation to correctly account for provider orchestration token sidecars without misclassifying them as standard input, output, or cache tokens.
- `read memory://<id>` now resolves under the mnemopi backend to the full memory row (working or episodic), wrapped in a YAML-frontmatter header carrying bank, store, source, timestamp, importance, and veracity. Bridges the read gap that made `memory_edit update` a blind overwrite: recall previews are clipped (see the mnemopi changelog), so an agent could not inspect the tail it was about to replace. The URI grammar is now `memory://root[/…]` for the file-backed summary and `memory://<memory-id>` for any mnemopi id in scope. Errors are also clearer — "Mnemopi memory `<id>` not found in any scoped bank" replaces the "memories not enabled" message when a lookup misses under an active mnemopi session ([#4443](https://github.com/can1357/oh-my-pi/issues/4443)).
- Added support for reading full memory rows (working or episodic) via `read memory://<id>` under the mnemopi backend, returning a YAML-frontmatter header with metadata to prevent blind overwrites during edits.
- Updated the URI grammar to support `memory://root[/…]` for file-backed summaries and `memory://<memory-id>` for specific mnemopi IDs.
### Changed
- Updated the `recall` and `memory_edit` tool prompts to document the truncation marker (`…`, `truncated: true`, `full_length`) and to require `read memory://<id>` before any `memory_edit update` on a truncated preview.
- ParallelizeSYSTEM.md, APPEND_SYSTEM.md, and TITLE_SYSTEM.md resolution at startup ([#4247](https://github.com/can1357/oh-my-pi/issues/4247))
- Skip TTSR delta buffering for text/thinking sources when no registered rule can match them ([#4245](https://github.com/can1357/oh-my-pi/issues/4245))
- Memoize copy-selector preview highlight so keyboard navigation does not re-highlight the whole preview every render ([#4238](https://github.com/can1357/oh-my-pi/issues/4238))
- Load persisted Agent Hub subagents asynchronously to avoid blocking the TUI on synchronous directory walks ([#4239](https://github.com/can1357/oh-my-pi/issues/4239))
- Cached persisted message keys in AgentSession to avoid repeated branch walks on every message_end ([#4243](https://github.com/can1357/oh-my-pi/issues/4243)).
- Updated `recall` and `memory_edit` tool prompts to document truncation markers and require reading a memory ID before updating a truncated preview.
- Parallelized resolution of system files (`SYSTEM.md`, `APPEND_SYSTEM.md`, and `TITLE_SYSTEM.md`) at startup to improve performance.
- Optimized TUI performance and reduced CPU usage during streaming and live tool calls by scoping renders to changed subtrees, interning the working-message shimmer palette, and memoizing copy-selector preview highlights.
- Loaded persisted Agent Hub subagents asynchronously to prevent blocking the TUI on directory walks.
- Cached persisted message keys in `AgentSession` to avoid repeated branch walks on message completion.
- Skipped TTSR delta buffering for text/thinking sources when no registered rules match.
### Fixed
- Fixed macOS Backspace on empty search not deleting sessions in the `/resume` picker; Fn+Backspace terminals that deliver `\x7f` instead of `\e[3~` now reach the delete confirmation dialog. ([#4580](https://github.com/can1357/oh-my-pi/pull/4580) by [@JagravNaik](https://github.com/JagravNaik))
- Fixed queued follow-up message rows leaking into native terminal scrollback during live repaints; the pending-messages container is now an anchored live region. ([#4362](https://github.com/can1357/oh-my-pi/issues/4362))
- Fixed `/rename` title arguments treating `#` prompt-action tokens as autocomplete triggers instead of literal session title text. ([#4600](https://github.com/can1357/oh-my-pi/issues/4600))
- Fixed empty session `.jsonl` files accumulating in `~/.omp/agent/sessions/<cwd>/` after a draft-then-clear exit cycle. `SessionManager.saveDraft(text)` materializes the session file so the draft sidecar has a parent; a subsequent `saveDraft("")` unlinked the sidecar but left the metadata-only JSONL behind (title slot + session header + startup selector entries, ~500–750 B), and `#shouldHaveSessionFile()` could no longer prune it once `#fileIsCurrent`/`#forceFileCreation` were latched. `SessionManager.close()` now drops only draft-owned metadata-only sessions with no saved draft sidecar to reattach to, while keeping real conversations, meaningful non-message entries such as handoff custom messages, explicit `ensureOnDisk()` sessions, drafts still pending for `--resume`, and never-materialized sessions untouched ([#4571](https://github.com/can1357/oh-my-pi/issues/4571)).
- Fixed the advisor being disabled for the entire session when the advisor role resolves to a reasoning model that exposes no controllable effort surface (Devin `devin/glm-5-2*`: `reasoning: true`, `thinking: undefined` — Cascade routes by sibling model id rather than a wire param). `#resolveAdvisorRuntimeDescriptors` in `packages/coding-agent/src/session/agent-session.ts` used to hardcode `ThinkingLevel.Medium`, which tripped `requireSupportedEffort` on the first advisor prompt with `Thinking effort medium is not supported by devin/glm-5-2. Supported efforts:` (empty list). The advisor descriptor now clamps the requested effort against the resolved model via `resolveThinkingLevelForModel` and forwards no explicit effort when the model has no controllable efforts — matching the `auto`-path fix (`clampAutoThinkingEffort`) and the Autonomous Memory stage fix (`clampThinkingLevelForModel`). Explicit `:off` still disables reasoning, and models that support `medium` (e.g. Anthropic) keep receiving it ([#4579](https://github.com/can1357/oh-my-pi/issues/4579)).
- Fixed legacy extension plugin validation failing with `Export named 'calculateCost' not found in module '.../legacy-pi-ai-shim.ts'` when the extension imports `calculateCost` (or`modelsAreEqual` /`getBundledProviders`) from `@oh-my-pi/pi-ai`. Those symbols were relocated to `@oh-my-pi/pi-catalog/models` during the catalog split but were never bridged back through the legacy `pi-ai` root shim; the shim now re-exports them alongside the existing `getModel` / `getModels` aliases so plugins written against pre-split pi-ai load again ([#4584](https://github.com/can1357/oh-my-pi/issues/4584)).
- Fixed legacy extension plugin validation failing with `Export named 'calculateCost' not found in module '.../legacy-pi-ai-shim.ts'` when the extension imports relocated catalog symbols such as `calculateCost`, `modelsAreEqual`, `getBundledProviders`, `getBundledModel`, or `getBundledModels` from `@oh-my-pi/pi-ai`. Those symbols were relocated to `@oh-my-pi/pi-catalog/models` during the catalog split but were never bridged back through the legacy `pi-ai` root shim; the shim now re-exports them alongside the existing `getModel` / `getModels` aliases so plugins written against pre-split pi-ai load again ([#4584](https://github.com/can1357/oh-my-pi/issues/4584)).
- Fixed legacy pi extension imports of `DefaultResourceLoader` from `@mariozechner/pi-coding-agent` / `@earendil-works/pi-coding-agent` by adding a compatibility loader shim that translates `resourceLoader` into OMP's native session discovery options. ([#4567](https://github.com/can1357/oh-my-pi/issues/4567))
- Fixed legacy Pi extension reloads on POSIX so `loadLegacyPiModule` imports the entry through a cache-busting filesystem path, refreshes load-time graph hooks when reloads add new modules, and threads the current load's `?mtime` tag through the extension source graph — relative `./helper.ts` siblings, `#alias/*` package-imports, extension-local bare dependency entries, and their relative children all rekey per reload, so same-process re-imports pick up edits across the whole graph. ([#4565](https://github.com/can1357/oh-my-pi/issues/4565))
- Fixed bash tool pipeline execution preserving stale upstream output when the final stage was a stripped `head`/`tail` limiter; the tool now runs the command as written so `seq 1 5 | head -n2` returns only `1` and `2`. ([#4562](https://github.com/can1357/oh-my-pi/issues/4562))
- Fixed the status-line token-rate segment rendering as `<number>/s`, which Ghostty auto-detected as a hyperlink on Ctrl+hover. ([#4541](https://github.com/can1357/oh-my-pi/issues/4541))
- Fixed xAI `web_search` to use `xai-oauth` credentials before falling back to `xai` API-key credentials, and to treat xAI OAuth as available in provider selection. ([#4536](https://github.com/can1357/oh-my-pi/issues/4536))
- Fixed token-usage badges disappearing on session resume for empty automated assistant turns; live and resume paths now share the same billed-usage predicate so a turn that consumed tokens keeps its badge on both surfaces, and only genuinely zero-usage turns suppress the row. ([#4532](https://github.com/can1357/oh-my-pi/issues/4532))
- Fixed `/model` search escaping the active provider tab and silently letting a same-named model from a different provider be persisted as the default role. `#filterModels` no longer auto-switches to the `ALL` tab when a query is typed inside a provider tab; results and Enter stay scoped to the selected provider. Empty results now name the active tab and point at `ALL` as the explicit escape. ([#4522](https://github.com/can1357/oh-my-pi/issues/4522))
- Fixed Esc no longer stopping TTS audio playback once the assistant reply had finished streaming; queued Kokoro (and remote) audio kept reading past the response's end because `vocalizer.clear()` only fired from the aborted-stream cascade. Esc now silences a still-audible vocalizer as its first action (ahead of the`tree`/`branch` double-Esc gesture); a second Esc keeps its previous behavior. ([#4521](https://github.com/can1357/oh-my-pi/issues/4521))
- Fixed grep/bash tool guidance so agents use Rust-style `foo|bar` patterns or `grep -E` instead of GNU BRE `\|` assumptions, and avoid bash when exact pipeline semantics are required. ([#4540](https://github.com/can1357/oh-my-pi/issues/4540))
- Fixed xAI `web_search` sending unsupported request-level `search_parameters` to the Responses Agent Tools API; result counts are now enforced locally without adding deprecated live-search date bounds. ([#4537](https://github.com/can1357/oh-my-pi/issues/4537))
- Fixed tool-call renderers crashing the TUI when providers send array/object `path` arguments before schema validation can report the invalid call back to the model. ([#4525](https://github.com/can1357/oh-my-pi/issues/4525))
- Fixed `glob path:"/"` and `path:"//"` returning ordinary empty results by rejecting slash-only root searches with the documented error. ([#4516](https://github.com/can1357/oh-my-pi/issues/4516))
- Fixed `omp read` hanging on PDFs whose inline-image binary payload contains delimiter-looking bytes, while preserving text and table extraction after the image. ([#4512](https://github.com/can1357/oh-my-pi/issues/4512))
- Fixed `pi/<role>` model resolution crashing on YAML list-valued `modelRoles` entries by normalizing string arrays the same way as comma-separated strings. ([#4492](https://github.com/can1357/oh-my-pi/issues/4492))
- Fixed the hidden workflowz eval notice describing eval-spawned agent recursion as a fixed depth of 3 instead of the configurable `task.maxRecursionDepth` default of 2 with an eval hard cap of 3. ([#4493](https://github.com/can1357/oh-my-pi/issues/4493))
- Fixed the `snapcompact.shape` settings UI to expose `silver16-bw` and updated snapcompact renderability warnings to report unsupported glyphs instead of a misleading non-ASCII rate. ([#4486](https://github.com/can1357/oh-my-pi/issues/4486))
- Fixed session/status usage totals to preserve provider-reported orchestration tokens separately from ordinary input and cache-hit buckets. ([#4469](https://github.com/can1357/oh-my-pi/issues/4469))
- Fixed published `.d.ts` being unconsumable under `moduleResolution: "node16" | "nodenext"`: the declaration emit ran under Bundler resolution and left relative re-exports extensionless (`export * from "./sdk"`), so a NodeNext consumer failed to resolve the package root (`TS2834`/`TS2305`). The publish pipeline now rewrites emitted relative specifiers to explicit `.js` extensions across every package's `dist/types`.
- Fixed `omitThinking` settings propagation so settings-aware streams request hidden thinking summaries when users explicitly enable the option.
- Preserved isolated branch-mode task output as a patch artifact when `commitToBranch` fails before the task branch can be transferred, and surfaced the captured patch path (plus any nested patches) through the eval `agent()` failure message so callers can recover the work instead of losing it with the isolation worktree ([#4437](https://github.com/can1357/oh-my-pi/issues/4437)).
- Fixed task-class subagents dropping unresolved explicit model-role selectors before startup, preventing `modelRoles.task` from silently falling through to an unrelated available provider model ([#4421](https://github.com/can1357/oh-my-pi/issues/4421)).
- Fixed large legacy snapcompact archives being rehydrated into active resumed-session context, avoiding Bun Worker crashes on oversized archived frame payloads ([#4470](https://github.com/can1357/oh-my-pi/issues/4470)).
- Fixed LSP diagnostics staleness after harness-authored file writes by sending watched-file change notifications to running language servers before edit-time diagnostics are read ([#4459](https://github.com/can1357/oh-my-pi/issues/4459)).
- Documented the bash tool timeout clamp in the model-facing schema and prompt so callers know `async` jobs remain capped at 3600 seconds ([#4408](https://github.com/can1357/oh-my-pi/issues/4408)).
- Fixed `/fast on` for custom OpenAI-compatible providers serving OpenAI models, and report unsupported models as unavailable instead of claiming fast mode was enabled ([#4386](https://github.com/can1357/oh-my-pi/issues/4386)).
- Fixed extension `pasteToEditor` / `setEditorText` prompt mutations leaving the editor visually stale until the next keypress by scheduling an editor repaint after each extension-driven mutation. ([#4341](https://github.com/can1357/oh-my-pi/issues/4341))
- Fixed session title generation, commit-message generation, speech-enhancer rewrites, and the online auto-thinking and unexpected-stop classifiers silently truncating on non-reasoning-flagged models that still emit thinking output (e.g. Qwen3 served via llama.cpp) by always sizing the completion budget for backends that ignore `disableReasoning` ([#4355](https://github.com/can1357/oh-my-pi/issues/4355))
- Further reduced TUI CPU during streaming and live tool calls by scoping timer-driven reveal/spinner renders to the changed subtree (streaming reveal, tool-args reveal, tool-execution spinner, todo strike animation) instead of forcing a full-tree walk at 30fps, interning the working-message shimmer palette so the compiled-ANSI cache hits between animation frames, and adding a band fast-path to `shimmerSegments` that coalesces off-band code points into a single low-tier run ([#4377](https://github.com/can1357/oh-my-pi/issues/4377))
- Fixed approve-and-compact discarding operator turns queued during compaction and surfacing `Failed to finalize approved plan: Agent is already processing`. `flushCompactionQueue` fires any queued user turn (fire-and-forget) before `#approvePlan` returns, so the previous abort-then-`prompt()` shape aborted the queued turn AND still raced into `AgentBusyError`. `#approvePlan` now queues the plan-approved directive as a synthetic follow-up (`session.followUp(text, undefined, { synthetic: true })`) whenever the session is streaming, and catches a racing `AgentBusyError` from `prompt()` with the same fallback. `AgentSession.followUp()` gained a `{ synthetic, expandPromptTemplates, attribution }` option so the finalize path lands the hidden execution directive as an agent-attributed developer message. ([#4358](https://github.com/can1357/oh-my-pi/issues/4358))
- Fixed plan-mode "Approve and compact context" leaking the internal plan-distillation prompt through the public `customInstructions` field on the `session_before_compact` extension hook. The guidance now rides through a private `CompactOptions.internalGuidance` channel that native summarization sees but extensions do not, so hooks treating `customInstructions` as user focus no longer produce query-biased compactions of plan-mode boilerplate ([#4359](https://github.com/can1357/oh-my-pi/issues/4359)).
- Fixed malformed `pi.sendMessage` custom-message payloads persisting bare session entries that crashed every later resume before provider calls. ([#4345](https://github.com/can1357/oh-my-pi/issues/4345))
- Hid internal `display: false` session-update reminders from compact history/advisor transcripts while preserving hidden image descriptions that provide the text transcript for attached images.
- Fixed idle recap crashing with `TypeError: undefined is not an object (evaluating 'H.content.filter')` after a run poisoned the transcript with eight `session_stop` block-decision continuations. `runEphemeralTurn` now normalizes the provider "done" event's `message.content` to `[]` when a wrapper/proxy stream drops it, and `#buildEphemeralSnapshot` skips its streaming-partial preservation branch when the in-flight assistant carries no content array. Prevents a single side-channel malformation from turning a subsequent idle recap into a session-mute crash. ([#4323](https://github.com/can1357/oh-my-pi/issues/4323))
- Apply WebSocket send backpressure with ordered drain retry to prevent unbounded `bufferedAmount` growth ([#4248](https://github.com/can1357/oh-my-pi/issues/4248))
- Capped docs.rs gunzip decompressed size at 256 MB to prevent zip-bomb OOM crashes ([#4249](https://github.com/can1357/oh-my-pi/issues/4249))
- Surface unexpected JS eval worker exit via close listener to prevent silent hangs on worker death ([#4244](https://github.com/can1357/oh-my-pi/issues/4244))
- Cache failed `!command` config resolutions and time out extension dynamic model fetches after 15s ([#4237](https://github.com/can1357/oh-my-pi/issues/4237))
- Fixed macOS Backspace behavior in the `/resume` picker for terminals delivering`\x7f` instead of `\e[3~`.
- Fixed queued follow-up message rows leaking into native terminal scrollback during live repaints by anchoring the pending-messages container.
- Fixed `/rename` title arguments treating `#` prompt-action tokens as autocomplete triggers instead of literal text.
- Fixed empty session `.jsonl` files accumulating in the sessions directory after a draft-then-clear exit cycle.
- Fixed advisor being disabled for the entire session when resolving to a reasoning model with no controllable effort surface (e.g., `devin/glm-5-2*`).
- Fixed legacy extension plugin validation failures by re-exporting relocated catalog symbols (such as `calculateCost`,`modelsAreEqual`, and`getBundledProviders`) through the legacy `pi-ai` root shim.
- Fixed legacy Pi extension imports of `DefaultResourceLoader` by adding a compatibility loader shim that translates `resourceLoader` into native session discovery options.
- Fixed legacy Pi extension reloads on POSIX to ensure same-process re-imports pick up edits across the entire dependency graph.
- Fixed bash tool pipeline execution preserving stale upstream output when the final stage was a stripped `head` or `tail` limiter.
- Fixed the status-line token-rate segment rendering as a clickable hyperlink in Ghostty.
- Fixed xAI `web_search` to prioritize `xai-oauth` credentials before falling back to `xai` API keys, and enforced result counts locally to avoid sending unsupported parameters.
- Fixed token-usage badges disappearing on session resume for empty automated assistant turns.
- Fixed `/model` search escaping the active provider tab and silently persisting a same-named model from a different provider as the default role.
- Fixed Esc key behavior to immediately silence active TTS audio playback (such as Kokoro) once an assistant reply finishes streaming.
- Fixed grep and bash tool guidance to instruct agents to use Rust-style patterns or`grep -E` instead of GNU BRE assumptions.
- Fixed tool-call renderers crashing the TUI when providers send array/object `path` arguments before schema validation.
- Fixed `glob` tool rejecting slash-only root searches (e.g., `path:"/"`) with a documented error instead of returning empty results.
- Fixed `pi/<role>` model resolution crashing on YAML list-valued `modelRoles` entries.
- Fixed the snapcompact settings UI to expose `silver16-bw` and improved renderability warnings to report unsupported glyphs.
- Fixed session and status usage totals to preserve provider-reported orchestration tokens separately from input and cache-hit buckets.
- Fixed published `.d.ts` declaration files to be consumable under `moduleResolution: "node16" | "nodenext"` by rewriting relative specifiers to explicit `.js` extensions.
- Fixed `omitThinking` settings propagation so settings-aware streams request hidden thinking summaries when explicitly enabled.
- Preserved isolated branch-mode task output as a patch artifact when `commitToBranch` fails, surfacing the captured patch path through the evaluation failure message.
- Fixed large legacy snapcompact archives causing crashes on resume due to oversized archived frame payloads.
- Fixed LSP diagnostics staleness by sending watched-file change notifications to running language servers before reading edit-time diagnostics.
- Documented the bash tool timeout clamp (capped at 3600 seconds for async jobs) in the model-facing schema and prompt.
- Fixed `/fast on` for custom OpenAI-compatible providers serving OpenAI models, and reported unsupported models as unavailable.
- Fixed extension `pasteToEditor` and `setEditorText` prompt mutations leaving the editor visually stale by scheduling a repaint after mutations.
- Fixed session title generation, commit-message generation, speech-enhancer rewrites, and classifiers silently truncating on non-reasoning-flagged models that still emit thinking output.
- Fixed plan-mode "Approve and compact context" discarding queued operator turns and leaking internal plan-distillation prompts to extension hooks.
- Fixed malformed `pi.sendMessage` custom-message payloads persisting bare session entries that crashed subsequent resumes.
- Hid internal `display: false` session-update reminders from compact history and advisor transcripts.
- Fixed idle recap crashes caused by side-channel stream malformations.
- Applied WebSocket send backpressure with ordered drain retries to prevent unbounded buffer growth.
- Capped docs.rs gunzip decompressed size at 256 MB to prevent zip-bomb out-of-memory crashes.
- Deleted pre-created shell snapshot files when snapshot creation fails.
- Aborted underlying MCP calls when proxy tool timeouts fire.
- Surfaced unexpected JS eval worker exits via close listeners to prevent silent hangs.
- Cached failed `!command` config resolutions and timed out extension dynamic model fetches after 15 seconds.
- Fixed the stale package version metadata so the collab web workspace advertises the current release line instead of the old `15.11.7` pin. ([#4549](https://github.com/can1357/oh-my-pi/issues/4549))
- Fixed an issue where the workspace advertised a stale package version (15.11.7) instead of the current release version.
- Exposed `RecallOptions.contentPreviewChars`so hosts can raise or disable the per-result content preview cap that `recall()` enforces. Default remains 500; pass `0` to return full content.
- Added `RecallResult.truncated` and `RecallResult.full_length`so callers can tell a clipped preview apart from a short row without inspecting the trailing marker. ([#4443](https://github.com/can1357/oh-my-pi/issues/4443))
- Added `RecallOptions.contentPreviewChars`to allow customizing or disabling the content preview cap (default is 500, set to 0 for full content).
- Added `RecallResult.truncated` and `RecallResult.full_length`properties to easily identify clipped previews without parsing trailing markers.
### Fixed
- Fixed background LLM fact extraction preserving extractor categories so `instructions`, `preferences`, `timelines`, and `kg` triples populate their MEMORIA tables and graph triples instead of being flattened into generic `fact/entity` rows. ([#4389](https://github.com/can1357/oh-my-pi/issues/4389))
- Recall previews now mark clipped content with a trailing `…` character instead of slicing at exactly 500 characters mid-word with no marker. The `factLine` used by the enhanced-context sandwich (200-char cap) gets the same treatment. Agents can now tell a full memory apart from a preview and know when to fetch the full row via `Mnemopi.get(id)` before overwriting content ([#4443](https://github.com/can1357/oh-my-pi/issues/4443)).
- Fixed background LLM fact extraction to preserve specific extractor categories (`instructions`, `preferences`, `timelines`, and `kg` triples) in MEMORIA tables and graph triples instead of flattening them into generic `fact/entity` rows.
- Improved recall previews and `factLine` context to append a trailing ellipsis (`…`) when content is clipped, preventing mid-word truncation without a marker.
- Fixed `resolveShapeForText(..., "auto")` to select the existing `silver16-bw` shape for CJK-heavy transcript text while preserving explicit shape overrides. ([#4486](https://github.com/can1357/oh-my-pi/issues/4486))
- Fixed `resolveShapeForText(..., "auto")` to correctly select the `silver16-bw` shape for CJK-heavy transcript text while preserving explicit shape overrides.
- Fixed the peer dependency range for `@oh-my-pi/pi-coding-agent` to match the current `^16` major. ([#4549](https://github.com/can1357/oh-my-pi/issues/4549))
- Fixed the peer dependency range for @oh-my-pi/pi-coding-agent to match the current ^16 major version.
- Fixed submitted slash-command arguments treating `@` file-reference tokens as prompt-composer autocomplete triggers when the command does not define argument completions. ([#4600](https://github.com/can1357/oh-my-pi/issues/4600))
- Evict purged image keys from `ImageBudget` to prevent unbounded map growth ([#4250](https://github.com/can1357/oh-my-pi/issues/4250))
- Fixed an issue where `@` file-reference tokens in slash-command arguments incorrectly triggered prompt-composer autocompletion when the command did not define argument completions.
- Fixed a memory leak caused by unbounded map growth in the image budget cache.
## [16.3.6] - 2026-07-04
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.