diff --git a/packages/agent/CHANGELOG.md b/packages/agent/CHANGELOG.md index f9cb38bbb..3b933e2ee 100644 --- a/packages/agent/CHANGELOG.md +++ b/packages/agent/CHANGELOG.md @@ -4,14 +4,13 @@ ### Changed -- Support dynamic model resolution to enable seamless mid-run model switching +- Enabled dynamic model resolution to support seamless mid-run model switching. + ### Fixed -- Fixed cursor-agent assistant messages containing native tool calls being split on text length and duplicating text blocks on replay, by emitting the assistant message as-is followed by buffered tool results and pairing them by `toolCallId` in the transcript rebuild ([#4348](https://github.com/can1357/oh-my-pi/issues/4348)). -- Fixed cursor-agent exec-channel tools being executed a second time by the shared agent loop after Cursor's server-side execution: `agent-loop.ts` now skips `toolCall` blocks stamped with the `kCursorExecResolved` marker so `bash`/`write`/`delete`/etc. run once ([#4348](https://github.com/can1357/oh-my-pi/issues/4348)). -### Fixed - -- Fixed synthetic tool results emitted when an assistant turn ends with `stopReason: "error"` after a tool call was already streamed being surfaced by the CLI as if the local tool had failed. The placeholder result now reads "Tool call was not executed because the provider stream ended with an error before the tool could run: " and carries a `SyntheticToolResultDetails` discriminator (`{ __synthetic: true, source: "assistant_stop_error", executed: false, upstreamError }`) on both the `ToolResultMessage` and the `tool_execution_end` event, so downstream UI/telemetry can distinguish provider-transport failures (e.g. Codex websocket close) from real local tool failures without string-matching ([#4321](https://github.com/can1357/oh-my-pi/issues/4321)). +- Fixed an issue in the Cursor agent where assistant messages containing native tool calls could duplicate text blocks on replay. +- Fixed a bug where Cursor agent exec-channel tools (such as bash, write, and delete) were executed a second time after server-side execution. +- Improved error handling for tool calls interrupted by upstream provider stream errors, distinguishing transport/provider failures from local tool execution failures in the CLI, events, and messages. ## [16.3.0] - 2026-07-02 diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index 95b7daf16..64fd41f03 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -4,30 +4,19 @@ ### Added -- Added support for overlaying Anthropic per-tier usage limits onto cached usage reports -- Improved Anthropic credential ranking by using drain-rate pressure for weekly usage limits -- Added Claude Fable weekly usage tracking to the Anthropic usage provider: the OAuth usage endpoint's new generic `limits` array is parsed for model-scoped weekly windows (`kind: "weekly_scoped"`), so `omp usage`, `/usage`, and usage history now surface a separate `Claude 7 Day (Fable)` row (id `anthropic:7d:fable`) alongside the shared 5h/7d windows — mirroring how Codex Spark rows are tracked. The `session`/`weekly_all` entries also backfill the shared 5h/7d windows if the legacy `five_hour`/`seven_day` buckets ever go null (as `seven_day_opus`/`seven_day_sonnet` already have). -- Added `scopeLimits`/`blockScope` to the Anthropic credential-ranking strategy so an exhausted Fable/Mythos weekly cap no longer blocks the whole OAuth credential: credential-wide exhaustion gating now considers only shared umbrella windows plus the requested model family's own scoped cap, and reactive usage-limit blocks for Fable/Mythos requests land in a per-tier backoff scope (mirroring the Antigravity per-counter precedent). +- Added comprehensive tracking and credential-ranking support for Anthropic per-tier and weekly usage limits, including Claude Fable weekly caps. This prevents a single exhausted model-scoped cap from blocking the entire OAuth credential and improves credential selection based on drain-rate pressure. ### Fixed -- Improved robustness of single-argument tool calls by automatically remapping mislabeled string arguments - -- Fixed Anthropic OAuth usage reporting to stop retrying on 429 rate-limit errors -- Fixed usage cache to correctly persist null values during cold-start failure backoff windows -- Fixed cursor-agent persisted transcripts losing tool-call structure by synthesizing `toolCall` content blocks for exec-channel native tools (`bash`/`read`/`write`/`grep`/`ls`/`delete`/`lsp`), so replay pairs each tool result with its call instead of rendering header-less tool output beneath the last assistant text ([#4348](https://github.com/can1357/oh-my-pi/issues/4348)). -- Fixed OpenAI-compatible streaming usage parsing to prefer non-zero nested cached token counts when root `cached_tokens` is zero ([#4337](https://github.com/can1357/oh-my-pi/issues/4337)). -- Fixed cursor-agent persisted transcripts losing tool-call structure by synthesizing `toolCall` content blocks for exec-channel native tools (`bash`/`read`/`write`/`grep`/`ls`/`delete`/`lsp`), so replay pairs each tool result with its call instead of rendering header-less tool output beneath the last assistant text ([#4348](https://github.com/can1357/oh-my-pi/issues/4348)). Synthesized blocks carry a new `kCursorExecResolved` symbol marker so the shared agent loop skips executing them a second time. -- Added a runtime signing-endpoint auto-detect on `anthropic-messages`: when an unmarked custom proxy returns `400 Invalid `signature` in `thinking` block`, the transport demotes every unsigned thinking block in the request, retries once, and pins the (baseUrl, modelId) as signing in the provider session state so subsequent turns skip the round-trip. The successful assistant message surfaces `disabledFeatures: ["unsigned-thinking-replay"]` so UIs can prompt the user to persist the change with `compat.replayUnsignedThinking: false` in `models.yml`. Includes an actionable remediation hint on the raw `400` when the auto-retry can't run. ([#4297](https://github.com/can1357/oh-my-pi/issues/4297)) -### Fixed - -- Fixed GitLab Duo Workflow post-start REST setup fetches (`ensureGitLabDuoWorkflowSettings`, `discoverGitLabDuoWorkflowProject`, `resolveGitLabDuoWorkflowNumericProjectId`, `requestGitLabDuoWorkflowDirectAccess`, `createGitLabDuoWorkflow`, `fetchGitLabDuoWorkflowAvailableModels`, `stopGitLabDuoWorkflow`) missing `signal`/timeout parameters, which could leave the stream without a terminal event when a fetch stalled ([#4227](https://github.com/can1357/oh-my-pi/issues/4227)). -### Fixed - -- Fixed Cursor proxy tunnel setup hanging indefinitely before stream start by adding abort and timeout handling. ([#4226](https://github.com/can1357/oh-my-pi/issues/4226)) -### Fixed - -- Fixed Devin Connect streaming reader accepting corrupt frame lengths and buffering unbounded data before the idle-timeout wrapper aborted, by capping payloads at 16 MiB and throwing a `ProviderResponseError({ kind: "envelope" })` as soon as an oversize length prefix is decoded ([#4228](https://github.com/can1357/oh-my-pi/issues/4228)). +- Improved robustness of single-argument tool calls by automatically remapping mislabeled string arguments. +- Fixed Anthropic OAuth usage reporting to stop retrying on 429 rate-limit errors. +- Fixed usage cache to correctly persist null values during cold-start failure backoff windows. +- Fixed cursor-agent persisted transcripts losing tool-call structure for native execution tools, ensuring replayed tool results are correctly paired with their corresponding calls. +- Fixed OpenAI-compatible streaming usage parsing to prefer non-zero nested cached token counts when the root cached_tokens value is zero. +- Added automatic detection and remediation for custom proxies returning signature errors on Anthropic thinking blocks, allowing the client to automatically retry with unsigned blocks and prompt the user to adjust their configuration. +- Fixed potential hangs in GitLab Duo Workflow setup by adding proper timeout and abort signal handling to REST fetches. +- Fixed Cursor proxy tunnel setup hanging indefinitely by adding abort and timeout handling. +- Fixed Devin Connect streaming reader vulnerability to corrupt frame lengths by capping payloads at 16 MiB and throwing an envelope error immediately. ## [16.3.1] - 2026-07-02 diff --git a/packages/catalog/CHANGELOG.md b/packages/catalog/CHANGELOG.md index 26e400ddd..39b0419db 100644 --- a/packages/catalog/CHANGELOG.md +++ b/packages/catalog/CHANGELOG.md @@ -2,18 +2,17 @@ ## [Unreleased] +### Fixed + +- Extended Anthropic-compatible signing-endpoint recognition to Cloudflare AI Gateway, Google Vertex, AWS Bedrock, and Azure AI Inference / Foundry to ensure consistent reasoning-replay and signature-stripping behavior, and exposed ResolvedAnthropicCompat.signingEndpoint in the public API. +- Fixed Zhipu Coding Plan runtime discovery to prioritize account-scoped model lists over bundled fallback models, preventing routing errors for valid non-z.ai keys. + ## [16.3.2] - 2026-07-02 ### Fixed - Fixed ZenMux model discovery to run without a `ZENMUX_API_KEY`, so newly published ZenMux models (for example `anthropic/claude-fable-5-free`) auto-update into the runtime `models.db` cache instead of waiting on a regenerated `models.json`. - Fixed ZenMux runtime discovery to query the `/api/v1/models` endpoint even when the resolved provider base URL points at the Anthropic-compatible route, so discovery no longer requests a non-existent `/api/anthropic/models` path. -### Fixed - -- Extended the `anthropic-messages` signing-endpoint recognition to Cloudflare AI Gateway (`gateway.ai.cloudflare.com/**/anthropic`), Google Vertex (`aiplatform.googleapis.com/**/publishers/anthropic/…`), AWS Bedrock (`bedrock-runtime..amazonaws.com`), and Azure AI Inference / Foundry (`.(inference|services).ai.azure.com`), and exposed the classification as `ResolvedAnthropicCompat.signingEndpoint` so both the replay-unsigned-thinking default and the cross-model signature-stripping path stay consistent on those hosts without walking back the settled 3p reasoning-replay default. ([#4297](https://github.com/can1357/oh-my-pi/issues/4297)) -### Fixed - -- Fixed Zhipu Coding Plan runtime discovery so account-scoped model lists replace bundled fallback models, preventing valid non-z.ai keys from being routed to unavailable GLM variants. ([#4296](https://github.com/can1357/oh-my-pi/issues/4296)) ## [16.3.1] - 2026-07-02 diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index 6c76d9dea..c8d210b90 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -2,24 +2,35 @@ ## [Unreleased] +### Breaking Changes + +- Removed _input as a supported alias for the edit tool input field + ### Changed -- Removed `_input` as a supported alias for the `edit` tool input field - -- Defer session_stop extension hooks while agent-owned background jobs are still in progress -- Stop-time settle passes now treat a yield with background async jobs (async `bash`/`task` spawns) owned by the agent — still running or with undelivered results — as a scheduling pause instead of a terminal stop: the incomplete-todo reminder stays silent and the `session_stop` hook pass is deferred, both firing at the settle reached once the session is fully idle. Async-result delivery re-wakes the loop, so neither pass is lost. +- Deferred session_stop extension hooks and incomplete-todo reminders until all agent-owned background jobs (such as async bash or task spawns) are fully idle ### Fixed -- Improved reliability of edits when file snapshots share identical 16-bit hash tags -- Fixed ACP `terminal/create` sending the bash tool's full shell line in `command` with no `args`, which broke spec-conformant clients that spawn `command`+`args` directly (no implicit shell) — any command containing a space, pipe, `&&`, redirect, or `$(...)` failed with `ENOENT` and the agent silently degraded to read-only tools. The bash tool now wraps the shell line before calling `clientBridge.createTerminal`, reusing the same shell binary + args the local `bash-executor` resolves via `settings.getShellConfig()` (Git Bash / `bash.exe` on Windows, `$SHELL` with `sh` fallback on POSIX) so bash semantics — `$VAR`, `$(...)`, `source`, POSIX quoting, `-l` — are preserved on both platforms. ([#4333](https://github.com/can1357/oh-my-pi/issues/4333)) -- Fixed inference worker subprocesses (TTS, STT, tiny-model, mnemopi embeddings) discarding stderr, which left every unexpected exit — most visibly the local Kokoro TTS worker's recurring `exit code 7` crash loop — undiagnosable from the parent's logs. `createWorkerSubprocess` now pipes stderr without starting a live read while the worker is idle, then drains the stream after `onExit`, emits captured lines to `logger.debug` under an ` stderr` message, and keeps the last 16 KiB in a bounded ring that gets appended to the `Error` surfaced through `onError`. The exit surface is synchronized with the post-exit drain via `SpawnedSubprocess.stderrDrained`, so the full native trace shows up on the `tts: worker error` line without reintroducing event-loop liveness from unref'd workers. ([#4324](https://github.com/can1357/oh-my-pi/issues/4324)) -### Fixed - -- Fixed Windows session tail loss after atomic compaction rewrites by fencing append writers during full-file replacement and gating the atomic publish on a `commitGuard` that the storage backend checks synchronously before rename, so a concurrent `flushSync` (Ctrl+C / session-exit) is not overwritten by the stale body serialized before it ran. Covers post-compaction prompts, tool results, title changes, and exit diagnostics on the current JSONL path ([#4338](https://github.com/can1357/oh-my-pi/issues/4338)). -### Fixed - -- Fixed transcript native-scrollback boundaries so finalized content below a live block is offered while still audited, preventing stale lower-row duplication when the live block grows ([#4326](https://github.com/can1357/oh-my-pi/issues/4326)). +- Improved reliability of file edits when snapshots share identical hash tags +- Fixed terminal creation in ACP by properly wrapping shell commands and arguments, resolving execution failures (such as ENOENT errors) on Windows and POSIX platforms +- Fixed inference worker subprocesses (such as TTS, STT, and embeddings) discarding stderr, ensuring unexpected crashes and exit traces are properly captured and surfaced in logs +- Fixed potential session data loss on Windows during atomic compaction rewrites by preventing concurrent writes from overwriting the session file during exit or compaction +- Fixed transcript scrollback boundaries to prevent duplicate rows from appearing when live blocks grow +- Fixed macOS SSHFS mount detection to avoid redundant remounting attempts when the mountpoint is unavailable +- Fixed SSH streamed placeholders and partial frames leaving stale rows in the TUI viewport and scrollback +- Fixed Gemini web search to correctly honor the configured search model (providers.webSearchGeminiModel or GEMINI_SEARCH_MODEL) for both OAuth and Developer API grounding requests +- Fixed omp install rejecting valid npm package specifications +- Improved MCP OAuth reauthorization error messages when dynamic client registration is closed, directing users to configure client credentials +- Fixed omp update -l to correctly support the plugin-update shorthand for upgrading marketplace plugins +- Fixed /advisor on command to correctly rebuild the advisor runtime and bind to the newly configured model +- Fixed edit tool failures on large source files after a structural-summary read by automatically merging unseen anchor lines into the snapshot +- Fixed potential hangs and process leaks in the Debug Adapter Protocol (DAP) client by introducing write timeouts and ensuring detached adapter processes are terminated on connection failures +- Fixed status-line GitHub PR lookup hangs by enforcing a command timeout +- Fixed potential pipe-buffer deadlocks during plugin installation, uninstallation, and updates by concurrently draining stdout and stderr +- Fixed SSH tool hangs on unreachable hosts by enforcing a 30-second timeout on pre-command connection and host probes +- Fixed models.yml schema validation to surface warnings for invalid custom provider configurations instead of silently ignoring them +- Fixed potential network hangs in omp update, Hindsight recall, and Smithery registry lookups by adding fetch timeouts ## [16.3.2] - 2026-07-02 @@ -50,42 +61,6 @@ - Fixed the assistant-message streaming fast path dropping the transient flag, which disabled the transient render path (code-highlight skip and streaming prefix caches) on every same-shape streaming tick. In-flight renders now correctly skip per-tick syntax highlighting; highlighting applies once at message finalization. - Fixed hidden goal-mode todo context: phase names and task text are now sanitized before prompt injection (no raw newlines or control characters forging extra context lines), and the block is only rendered with tool-accurate guidance when the `todo` tool is active or discoverable instead of unconditionally instructing the agent to call an unavailable tool. - Fixed custom tool loading treating `process.exit()` from a tool module's import or factory as a host process exit instead of a recoverable load failure. Custom tools now load under the shared extension exit guard, so an exiting tool is skipped with a load error while remaining tools still load ([#1704](https://github.com/can1357/oh-my-pi/issues/1704)). -### Fixed - -- Fixed macOS SSHFS mount detection to skip remounting an already-mounted remote when `mountpoint` is unavailable. ([#4319](https://github.com/can1357/oh-my-pi/issues/4319)) -### Fixed - -- Fixed SSH streamed placeholders and provisional partial frames leaving stale pending rows in the TUI viewport or native scrollback. ([#4314](https://github.com/can1357/oh-my-pi/issues/4314)) -### Fixed - -- Fixed Gemini web_search to honor `providers.webSearchGeminiModel` / `GEMINI_SEARCH_MODEL` for both OAuth and Developer API grounding requests. ([#4312](https://github.com/can1357/oh-my-pi/issues/4312)) -### Fixed - -- Fixed `omp install npm:` rejecting Pi package specs before Bun could resolve them. ([#4310](https://github.com/can1357/oh-my-pi/issues/4310)) -### Fixed - -- Fixed MCP OAuth reauth surfacing an opaque `OAuth provider requires client_id` error when the provider closes dynamic client registration (e.g. Figma, which 403s all unlisted clients per the MCP catalog). The error now names the DCR endpoint + HTTP status and directs users to configure `oauth.clientId`/`oauth.clientSecret` on the server entry ([#4307](https://github.com/can1357/oh-my-pi/issues/4307)). -### Fixed - -- Fixed `omp update -l` rejecting the documented plugin-update shorthand instead of upgrading installed marketplace plugins. ([#4304](https://github.com/can1357/oh-my-pi/issues/4304)) -### Fixed - -- Fixed explicit `/advisor on` to rebuild the live advisor runtime after `modelRoles.advisor` changes so it rebinds to the newly configured model. ([#4302](https://github.com/can1357/oh-my-pi/issues/4302)) -### Fixed - -- Fixed `edit` frequently failing with `never displayed (it showed a partial range, a search hit, or a folded summary)` after a structural-summary `read` on a >100-line source file: the rejection now inlines the actual file content at the unseen anchor lines and merges them into the snapshot's `seenLines` set, so a straight edit retry with the same `[path#tag]` header succeeds instead of demanding a follow-up range re-read. Wide (over 40-line) anchor ranges still fall back to a range re-read for the tail. ([#4224](https://github.com/can1357/oh-my-pi/issues/4224)) -### Fixed - -- Fixed the DAP client hanging forever when the debug adapter's stdin stops draining. `writeMessage` now races the flush against a 30 s cap and adapter exit and disposes the client on either failure, and `sendRequest` fires the write in the background with a passive unhandled-rejection guard so the request-timer error is never orphaned before the caller subscribes. Socket-mode spawn helpers (`#spawnSocketUnix`, `#spawnSocketClientAddr`) now kill the detached adapter process when the readiness/connect race fails, closing an orphan-process leak on socket connect timeouts ([#4233](https://github.com/can1357/oh-my-pi/issues/4233)). -### Fixed - -- Fixed status-line PR lookup wedging the segment indefinitely when `gh pr view` stalled (keychain prompt, network hang, auth deadlock). The lookup now routes through `git.github.run` with `AbortSignal.timeout(GIT_COMMAND_TIMEOUT_MS)`, inheriting the non-interactive `gh` environment and enforcing the standard 5-minute deadline instead of leaking the child ([#4234](https://github.com/can1357/oh-my-pi/issues/4234)). -### Fixed - -- Fixed a pipe-buffer deadlock hazard in plugin install/uninstall paths: `PluginManager.install`, `PluginManager.uninstall`, `PluginManager.#fixMissingPlugin`, the git-refresh `bun update` step, the legacy `installer.ts` install/uninstall helpers, and the bundled-registry generator's `formatInPlace` all awaited `proc.exited` before draining stdout/stderr. Verbose `bun install`/`bun uninstall`/`biome check` output above the ~64 KiB OS pipe buffer could block the child on `write(2)` while the parent blocked on exit, and even under Bun's current eager buffering this leaked unbounded bytes into memory. Each site now drains both pipes concurrently with `proc.exited` via `Promise.all`. ([#4230](https://github.com/can1357/oh-my-pi/issues/4230)) -### Fixed - -- Fixed SSH tool hanging indefinitely on unreachable or wedged hosts: the pre-command `runSshSync` / `runSshCaptureSync` helpers (used by `ensureConnection` / `probeHostInfo`) previously invoked `ssh` through the Bun shell with no timeout or abort signal and sat outside the `SshTool.execute` command-timeout wrapper. They now run through `ptree.exec` with a 30s bound and `allowNonZero`/`allowAbort`, returning a failure result instead of blocking forever. ([#4232](https://github.com/can1357/oh-my-pi/issues/4232)) ## [16.3.1] - 2026-07-02 @@ -104,9 +79,6 @@ ### Fixed -- Fixed `models.yml` schema validation failures being treated as valid config data, so invalid custom provider files now surface a warning instead of silently dropping all custom providers. ([#4305](https://github.com/can1357/oh-my-pi/issues/4305)) - -- Fixed stalled network calls in `omp update`, Hindsight recall, and Smithery registry lookup by adding fetch timeouts. ([#4229](https://github.com/can1357/oh-my-pi/issues/4229)) - Fixed stuttering/latency in speech by running synthesis chunks through the player gaplessly - Fixed race condition causing EPIPE errors and broken pipes during speech playback - Fixed interrupted speech audio by ensuring segments queue and drain in order diff --git a/packages/collab-web/CHANGELOG.md b/packages/collab-web/CHANGELOG.md index 1a0926fa0..c196696a8 100644 --- a/packages/collab-web/CHANGELOG.md +++ b/packages/collab-web/CHANGELOG.md @@ -4,7 +4,7 @@ ### Fixed -- Improved input detection for edit tool summary and body views +- Improved input detection for the edit tool's summary and body views. ## [16.3.1] - 2026-07-02 diff --git a/packages/hashline/CHANGELOG.md b/packages/hashline/CHANGELOG.md index 32f496567..231084504 100644 --- a/packages/hashline/CHANGELOG.md +++ b/packages/hashline/CHANGELOG.md @@ -4,14 +4,15 @@ ### Breaking Changes -- Removed `SnapshotStore.byHashExact`; consumers resolve tags via `byHash`, which returns the most recently recorded version on a collision. +- Removed SnapshotStore.byHashExact. Consumers should now use byHash, which resolves collisions by returning the most recently recorded version. ### Changed -- Improved robustness of patch application by resolving 16-bit snapshot tag collisions to the most recent version rather than rejecting them. +- Improved patch application robustness by resolving 16-bit snapshot tag collisions to the most recent version instead of rejecting them. + ### Fixed -- Fixed frequent `hashline` edit rejections after a structural-summary read (default for parseable code >100 lines) by inlining the actual file content at the unseen anchor lines into the `never displayed (it showed a partial range, a search hit, or a folded summary)` error and merging those lines into the snapshot's `seenLines` set — a straight retry with the same `[path#tag]` header now succeeds instead of requiring a separate range re-read. Anchor ranges over the 40-line inline reveal cap still bounce back to the range re-read for the remainder. ([#4224](https://github.com/can1357/oh-my-pi/issues/4224)) +- Fixed frequent edit rejections after a structural-summary read (affecting parseable code over 100 lines) by automatically inlining unseen anchor lines and merging them into the snapshot's seen lines, allowing immediate retries to succeed without requiring a separate range re-read. ## [16.3.0] - 2026-07-02 diff --git a/packages/tui/CHANGELOG.md b/packages/tui/CHANGELOG.md index 918e49d3d..377939852 100644 --- a/packages/tui/CHANGELOG.md +++ b/packages/tui/CHANGELOG.md @@ -4,9 +4,9 @@ ### Fixed -- Fixed the modifyOtherKeys keyboard fallback enabling on unknown SSH terminals, avoiding broken Shift input in iOS SSH clients such as Redock ([#4325](https://github.com/can1357/oh-my-pi/issues/4325)). -- Fixed native scrollback repair for audited transcript rows that were offered below a still-live block, preventing lower finalized rows from duplicating when the live block grows ([#4326](https://github.com/can1357/oh-my-pi/issues/4326)). -- Fixed destructive editing keys (`Ctrl+W`, `Ctrl+U`, `Ctrl+K`, `Alt+Backspace`, `Alt+D`) and paste/yank leaving the autocomplete popup active with a stale prefix; `Tab` and `Enter` on the file-path branch would then insert the outdated selection into the newly edited buffer. Every text-mutating path now refreshes autocomplete like backspace/forward-delete already do, and the `Tab`/`Enter`+file-path acceptance now applies the same staleness guard the `Enter`+slash path uses, so a stale popup silently cancels instead of corrupting the input ([#4295](https://github.com/can1357/oh-my-pi/issues/4295)). +- Fixed keyboard fallback behavior (modifyOtherKeys) on unknown SSH terminals, resolving broken Shift input in iOS SSH clients like Redock. +- Fixed a native scrollback rendering bug where finalized transcript rows below an active block would duplicate when the active block expanded. +- Fixed autocomplete popups remaining active with stale suggestions after destructive text editing (such as Ctrl+W, Ctrl+U, Ctrl+K, Alt+Backspace, Alt+D, paste, or yank), preventing input corruption when pressing Tab or Enter. ## [16.3.0] - 2026-07-02