From 63b07f8ec069b509d1fc4b326cd226c18feddc0f Mon Sep 17 00:00:00 2001 From: can1357 Date: Mon, 3 Aug 2026 05:52:53 +0200 Subject: [PATCH] chore: rewrite changelogs --- packages/agent/CHANGELOG.md | 9 +- packages/ai/CHANGELOG.md | 13 +-- packages/browser-relay/CHANGELOG.md | 7 +- packages/catalog/CHANGELOG.md | 4 +- packages/coding-agent/CHANGELOG.md | 89 ++++++++----------- .../test/mcp-command-reauth.test.ts | 4 + packages/natives/CHANGELOG.md | 12 +-- packages/tui/CHANGELOG.md | 2 +- packages/utils/CHANGELOG.md | 4 +- 9 files changed, 66 insertions(+), 78 deletions(-) diff --git a/packages/agent/CHANGELOG.md b/packages/agent/CHANGELOG.md index 5c14ae7d6..e89e4e871 100644 --- a/packages/agent/CHANGELOG.md +++ b/packages/agent/CHANGELOG.md @@ -2,14 +2,15 @@ ## [Unreleased] -### Changed +### Breaking Changes -- Tool examples embedded in tool descriptions now always render in Python call syntax; `AppendOnlyContextManager` build options no longer take an `exampleDialect`, and `normalizeTools` now takes a `NormalizeToolsOptions` object (`{ injectIntent, pruneDescriptions }`) instead of positional booleans. +- Tool examples embedded in tool descriptions now always render in Python call syntax, and the `exampleDialect` option has been removed from `AppendOnlyContextManager` build options. +- Updated `normalizeTools` to accept a `NormalizeToolsOptions` configuration object (`{ injectIntent, pruneDescriptions }`) instead of positional booleans. ### Fixed -- The error→toolUse salvage in the agent loop (`recoverTransientErrorToolTurn`) now recognizes Anthropic stream-envelope truncation errors, so a turn cut after streaming complete tool calls runs those calls instead of ending the run with an error. -- Shake no longer elides artifact recovery reads; the compaction dead-end rescue uses a dedicated `RESCUE_SHAKE_CONFIG`. +- Fixed an issue where runs would fail with an error if an Anthropic stream was truncated after complete tool calls were streamed; the agent now recovers and executes those tool calls. +- Fixed an issue where artifact recovery reads could be incorrectly elided during compaction. ## [17.2.4] - 2026-08-01 diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index e710201bb..7ed45750f 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -4,15 +4,16 @@ ### Changed -- Changed `renderToolExamples` and `renderToolInventory` to render tool-call examples in Python keyword-argument syntax (`name(key="value")`) for every model instead of the model's native tool-call dialect; `renderToolExamples` no longer takes a dialect parameter, and the now-unused `DialectRenderOptions.example` flag was removed. Multiline string arguments render as verbatim `"""…"""` blocks (falling back to escaped literals when the content collides with the fence), and a call whose only argument is a string renders as the bare payload value with the intent placeholder carried on the `` envelope. -- Changed `renderToolInventory` (the verbose system-prompt inventory and `/dump`) to render the catalog as one OpenAI-Harmony-style `## functions` / `namespace functions { … }` block — per tool, the description and examples as `//` comment lines above a flat `type = (_: {…});` declaration — instead of per-tool `# Tool: ` markdown sections; the model parameter and the description header-demotion pass were removed. Added a `style: "harmony"` option to `jsonSchemaToTypeScript` (`//` comments, `,` delimiters, no indentation); the default JSDoc-style output is unchanged. +- Standardized tool-call examples in `renderToolExamples` and `renderToolInventory` to use Python keyword-argument syntax (`name(key="value")`) across all models, removing the model-specific dialect parameter and the `DialectRenderOptions.example` flag. +- Updated `renderToolInventory` to render the tool catalog as a unified OpenAI-Harmony-style `## functions` block using TypeScript type declarations and comments, replacing the previous per-tool Markdown sections. +- Added a `style: "harmony"` option to `jsonSchemaToTypeScript` for generating compact, comma-delimited TypeScript definitions. ### Fixed -- Fixed Harmony control-token escaping skipping model-owned replay items. The issue-#6913 fix only escaped user/developer text and tool results, so a model that legitimately wrote about the Harmony format (e.g. `<|channel|>`, `<|call|>` in article or test content) sampled those spellings into its own `function_call.arguments`; the next full-transcript replay (stale or blocked `previous_response_id`, provider fallback) fed them back as input and gpt-5.x rejected every retry with `invalid_prompt` / "Request blocked", permanently poisoning the session. Replayed `function_call.arguments` (JSON-preserving escape), `custom_tool_call.input`, and assistant `output_text`/`refusal` blocks are now escaped on the wire copy for Harmony-dialect models, on both the shared Responses builder and the Codex builder. -- Fixed Codex Responses dropping native image-generation results from assistant content and replay when terminal output items retained a stale `generating` status ([#7445](https://github.com/can1357/oh-my-pi/issues/7445)). -- Fixed Anthropic streams truncated mid-generation (connection closed with neither a `message_delta` stop_reason nor a `message_stop` frame) finalizing the partial message as a clean `stop`, which made the agent loop treat a truncated turn as complete and halt silently mid-sentence. Such streams raise the stream-envelope error again: transparently retried before replay-unsafe content streams; afterwards the turn surfaces as an error whose complete tool calls the agent loop still runs (`recoverTransientErrorToolTurn` now recognizes the envelope-error text after `retainCompletedToolCalls` drops half-streamed calls). Streams that delivered a `stop_reason` (or `message_stop`) keep degrading to best-effort content when the other terminal frame is missing. -- Fixed Anthropic prompt caching writing a fresh entry for the entire system prefix whenever the project footer (cwd, date, workspace tree) changed. `applyPromptCaching` placed its only system breakpoint on the last block — normally the volatile footer — so starting omp in a new directory or crossing midnight re-wrote the whole cached system prefix instead of reusing it (issue [#7324](https://github.com/can1357/oh-my-pi/issues/7324)). System caching now marks up to the last three eligible blocks, covering both `[stable prefix, project footer]` and `[stable prefix, project footer, active-repo context]` layouts while skipping the OAuth cloak blocks (billing header + Claude Code identity). Message caching also skips the synthetic trailing `Continue.` pad and anchors on the preceding real assistant turn when the four-breakpoint budget is tight. This does not address open-weight chat templates that render tool schemas after the system block; keeping those cached requires relocating the per-request footer out of the system message. +- Fixed a session-blocking issue where unescaped Harmony control tokens in replayed assistant responses and tool inputs caused subsequent requests to be rejected with `invalid_prompt` errors. +- Fixed an issue where Codex Responses dropped native image-generation results from assistant content and replays due to stale `generating` statuses. +- Fixed Anthropic stream truncation handling where unexpected connection closures were incorrectly treated as clean stops, causing the agent loop to halt silently mid-sentence. +- Optimized Anthropic prompt caching to prevent unnecessary cache invalidation of the entire system prefix when volatile project footer details (such as current working directory, date, or workspace tree) change. ## [17.2.4] - 2026-08-01 diff --git a/packages/browser-relay/CHANGELOG.md b/packages/browser-relay/CHANGELOG.md index f1441f6cd..ff95b2564 100644 --- a/packages/browser-relay/CHANGELOG.md +++ b/packages/browser-relay/CHANGELOG.md @@ -4,8 +4,5 @@ ### Added -- Initial release: Chrome MV3 extension that lets the omp browser tool attach to and drive the user's existing tabs through `chrome.debugger`. The companion CDP relay lives in the omp CLI (`omp browser-relay`); this package builds the extension zip for GitHub releases and generates the embedded install assets consumed by `omp browser-relay install`. Tabs the agent actively drives are gathered into a per-window "omp" tab group while the relay is connected. - -### Fixed - -- Fixed duplicate "omp" tab groups: `group`/`ungroup` RPCs are now serialized in the service worker (Chrome's query→create→set-title sequence is not atomic), and `groupTabs` folds stray same-title groups left by earlier races back into the canonical per-window group. The omp group title is also mirrored to `chrome.storage.session`, so a service worker restarted between grouping and disconnect can still dissolve the group instead of leaving it behind. +- Initial release of the Chrome MV3 extension, enabling the omp browser tool to attach to and drive existing browser tabs via chrome.debugger. +- Added automatic, robust tab management that groups active agent-driven tabs into a dedicated per-window "omp" tab group and ensures clean dissolution upon disconnect. diff --git a/packages/catalog/CHANGELOG.md b/packages/catalog/CHANGELOG.md index 822602cc9..2f3f3e880 100644 --- a/packages/catalog/CHANGELOG.md +++ b/packages/catalog/CHANGELOG.md @@ -4,8 +4,8 @@ ### Fixed -- Fixed `alibaba-token-plan` dynamic discovery dropping newly advertised chat models by replacing the stale static allowlist with dedicated non-chat media-model filters ([#7391](https://github.com/can1357/oh-my-pi/issues/7391)). -- Fixed DeepSeek reasoning models on the OpenCode Zen/Go gateways (e.g. `opencode-zen/deepseek-v4-flash-free`) failing with `400 Thinking mode does not support this tool_choice` when a specific tool was forced. Dropping `reasoning_effort` does not disable the gateway's default thinking mode, so the OpenAI-compat descriptor now marks forced `tool_choice` unsupported for DeepSeek reasoning models, downgrading the selector to `auto` while keeping the tool advertised ([#7315](https://github.com/can1357/oh-my-pi/issues/7315)). +- Fixed an issue where newly advertised chat models were dropped during dynamic discovery for the `alibaba-token-plan` provider. +- Fixed a `400` error when forcing a specific tool with DeepSeek reasoning models on OpenCode Zen/Go gateways by automatically downgrading the tool selection mode to `auto` while keeping the tool advertised. ## [17.2.4] - 2026-08-01 diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index 58e161d1a..2c180cca0 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -4,67 +4,52 @@ ### Breaking Changes -- Replaced the computer tool's `{ window, actions }` coordinate batches with persistent JavaScript runs using `{ code, read_only?, timeout? }`; removed `computer.backend` and model-specific controller switching. -- Changed the `edit` tool's replace mode from a `{ path, edits: [{ old_text, new_text, all? }] }` batch to Claude Code's single-edit shape `{ path, old_string, new_string, replace_all? }` — one replacement per call. The Cursor `pi_edit` exec bridge maps single-replacement frames onto this schema directly and routes multi-replacement frames through an internal, bridge-only batch form so a frame still runs as one tool lifecycle with one aggregate diff. +- Replaced the computer tool's coordinate-batch schema with persistent JavaScript runs, and removed computer.backend and model-specific controller switching. +- Changed the edit tool's replace mode from a multi-edit batch schema to a single-edit schema ({ path, old_string, new_string, replace_all? }). ### Added -- Added optional `timeoutMs` to `discovery` configuration in provider options (`models.yml` / `models.json`) to configure custom HTTP probe timeouts for llama.cpp, Ollama, and OpenAI-compatible discovery endpoints ([#6952](https://github.com/can1357/oh-my-pi/issues/6952)). -- Added a cross-platform, in-process `ps` shell builtin with BSD/procps selection forms, custom output columns, sorting, process metrics, and header suppression. -- Added a `relay` browser mode that drives the user's own Chrome tabs through a local CDP relay plus the OMP Browser Relay extension: `omp browser-relay install` writes the bundled extension to disk, and `browser.relay` / `browser.relayUrl` (or per-call `app.relay`) route the browser tool through it. The relay server auto-starts under a profile-independent global daemon broker when the browser tool needs it; every relay consumer holds a broker lease, so the fixed-port singleton stops only after its last consumer across all projects exits. `omp browser-relay` remains available for `--token`/`--no-group`/custom ports, and a relay already serving the port is adopted. It multiplexes the supervisor and per-tab worker puppeteer connections over the single `chrome.debugger` attachment Chrome allows per tab, and gathers only the tabs the agent actively drives into a per-window "omp" tab group (released when the last client lets go of the tab, dissolved on disconnect, never re-grouping tabs the user pulls out). -- Added a scriptable desktop session with persistent `desktop`/`Win`/`El` handles, window-targeted capture and input, native accessibility trees with `[ref=eN]` actions, clipboard access, streamed screenshots, and enforced read-only runs. -- Added broker-shared language servers: one LSP server per (server, project) is now spawned by an `omp lsp mux` daemon under the per-project daemon broker (the same broker that owns the shared Chromium and `hub start` processes) and multiplexed to every omp instance in the project over a local socket — instances share the server's index, initialize result, diagnostics, and document state instead of each paying a private cold start. The mux reference-counts `didOpen`/`didClose`, remaps request ids and document versions per client, replays cached diagnostics/registrations/progress to late joiners, routes `workspace/applyEdit` to the most recently active instance, and intercepts per-session `shutdown`/`exit` so one instance leaving never kills the server for the rest; the broker still reaps everything when the last omp process in the project exits. Controlled by the new `lsp.shared` setting (default on); any broker/mux failure falls back to a private server spawn, and an external `lspmux` wrapper keeps precedence when configured. -- Added `--service-tier` to override the OpenAI service tier for a session. The flag takes precedence over the configured `tier.openai` setting and over a resumed session's recorded tier, leaves the Anthropic and Google tiers alone, and persists across resumes; `none` omits `service_tier` from the request. -- Added a configurable per-request web search timeout via `providers.webSearchTimeoutSeconds` ([#7197](https://github.com/can1357/oh-my-pi/pull/7197) by [@will-bogusz](https://github.com/will-bogusz)). -- Added turn-aware `/tree` navigation: Alt+Up/Alt+Down traverses previous/next user or assistant turns while skipping tool and bookkeeping entries, Home/End jumps to the first/last visible item, and PageUp/PageDown moves by a visible page. +- Added a relay browser mode to drive local Chrome tabs via the OMP Browser Relay extension, supporting automatic daemon startup and tab grouping. +- Added a scriptable desktop session featuring window-targeted capture and input, native accessibility trees, clipboard access, and streamed screenshots. +- Added broker-shared language servers (controlled by the lsp.shared setting) to multiplex LSP servers across multiple instances in a project, reducing cold-start times and resource usage. +- Added optional timeoutMs to discovery configuration in provider options to configure custom HTTP probe timeouts for llama.cpp, Ollama, and OpenAI-compatible endpoints. +- Added a cross-platform, in-process ps shell builtin with custom columns, sorting, and process metrics. +- Added the --service-tier flag to override the OpenAI service tier for a session. +- Added a configurable per-request web search timeout via providers.webSearchTimeoutSeconds. +- Added turn-aware /tree navigation shortcuts (Alt+Up/Alt+Down, Home/End, PageUp/PageDown) to traverse user and assistant turns. +- Added display.hideToolActivity and a Ctrl+Shift+O shortcut to toggle the visibility of model-initiated tool calls and results. ### Changed -- Exposed the script-driven `computer` schema to every model, including models with provider-native Computer Use support, because native action declarations cannot express persistent desktop sessions or accessibility handles. -- Reduced `omp --help` cold-start latency and memory use by rendering lightweight command metadata without loading every runtime command and provider graph. +- Exposed the script-driven computer schema to all models, including those with provider-native Computer Use support. +- Reduced omp --help cold-start latency and memory usage by rendering lightweight command metadata. ### Fixed -- Fixed `omp plugin install git:github.com/algal/pi-openai-server-compaction` failing extension validation because the legacy Pi compatibility shims omitted `serializeConversation` and the `/compat` alias `streamSimpleOpenAIResponses` ([#7403](https://github.com/can1357/oh-my-pi/issues/7403)). -- Fixed the Windows bash tool silently taking down the whole omp process when a command blocked until its timeout: cancelling a timed-out run walked the spawned child's descendant tree from raw `th32ParentProcessID` links, and a recycled pid matching the harness's stale recorded parent pid could enumerate omp (or an ancestor) as a false descendant and `TerminateProcess` it, killing the session with no `session_exit` record. Run-cancellation sweeps now refuse to signal the harness, its ancestor chain, or any process collected beneath them ([#7452](https://github.com/can1357/oh-my-pi/issues/7452)). -- Fixed session transcript entries being lost on process crash: file-backed JSONL writers now write each completed entry to the OS page cache on append instead of microtask-batching; concurrent appends during an in-place atomic rewrite supersede the paused publish with a synchronous full-body rewrite so fenced events are durable before return; concurrent appends during `/move` write a full body to the live relocation path (source pre-rename, destination post-rename) so a crash mid-move no longer drops completed events; and the first write failure latches `#diskFailure` synchronously via `appendSync` so a later flush/close reports it instead of silently succeeding after a discarded rejected Promise ([#7444](https://github.com/can1357/oh-my-pi/pull/7444) by [@olegpulatov](https://github.com/olegpulatov)). -- Fixed `/mcp reauth` sending literal `${VAR}` placeholders instead of env-expanded OAuth client credentials during the token exchange, and `MCPOAuthFlow.exchangeToken()` accepting an HTTP-200 token response with no `access_token` (e.g. a Slack `{ ok: false, error }` body), which stored an empty access token and only surfaced `invalid_token` on a later MCP request ([#7440](https://github.com/can1357/oh-my-pi/issues/7440)). -- Fixed fuzzy replace-all edits re-matching replacement text indefinitely, which could freeze the TUI and exhaust memory ([#7432](https://github.com/can1357/oh-my-pi/issues/7432)). -- Fixed `inspect_image` ignoring the thinking effort configured on `modelRoles.vision` (e.g. `:high`): the oneshot resolved the model but dropped the `:high` selector and passed no `reasoning`, so the request went out with a suppressed/zero thinking budget and thinking-only Gemini models rejected it with HTTP 400 (`Budget 0 is invalid. This model only works in thinking mode.`). The tool now resolves the role's explicit thinking selector, clamps it to the model's supported efforts, and forwards it as the oneshot `reasoning` ([#7448](https://github.com/can1357/oh-my-pi/issues/7448)). -- Fixed compiled binaries dropping extensions whose CommonJS dependencies require nested ESM packages, converge dual import/require graphs on one source file, or use directory-style package requires such as `require("../")` and `require("punycode/")` ([#7402](https://github.com/can1357/oh-my-pi/issues/7402)). - -- Fixed template argument substitution (`substituteArgs`) executing recursive placeholder expansion when positional argument values contain literal `$@` or `$ARGUMENTS` tokens. -- Fixed focused-agent status bar dimming darkening Powerline end caps. -- Fixed the browser relay creating duplicate "omp" tab groups: the bridge now keeps at most one group RPC in flight (a queued drain replaces fire-and-forget per-tab requests), so concurrent requests can no longer race the extension's non-atomic query→create→set-title sequence in the same window. Also fixed an extension reconnect (relay daemon restart, service-worker recycle) being misread as the user dragging every tab out of the omp group — grouping state is reset when the extension socket closes, so tabs regroup on the next hello instead of being permanently opted out. -- Fixed retained computer `Win` and `El` handles carrying a completed run's abort signal and permissions into later runs; handles now obey the current run while leaked async continuations remain denied. -- Fixed computer-tool `win.ref("eN")` fabricating an element with empty role/title metadata; it now resolves the ref through the accessibility registry, returning a populated element and throwing `StaleRef` for expired refs. -- Fixed macOS background keyboard input silently reaching a different window in the same application; ambiguous multi-window delivery now fails with `BackgroundUnavailable`, and foreground retries establish the addressed window as the app's main/focused window before typing. -- Fixed macOS Chrome accessibility snapshots exposing only browser chrome by activating Chromium's renderer accessibility tree before resolving a window. -- Fixed unnamed macOS accessibility controls such as Chrome's Back, Forward, and Reload buttons by using `AXDescription` when `AXTitle` is empty in snapshots and title queries. -- Fixed shake re-eliding artifact recovery reads into a new artifact indefinitely. -- Fixed Esc during a streaming `/loop` iteration pausing the loop instead of only aborting the current turn ([#7329](https://github.com/can1357/oh-my-pi/issues/7329)). -- Fixed heavily branched conversation trees shifting linear continuations into disconnected gutter columns and accumulating unnecessary indentation ([#7332](https://github.com/can1357/oh-my-pi/issues/7332)). -- Fixed the vibe pre-init-kill test racing `registry.kill()` against the worker's job-body dispatch (the mock only registered its AgentRef after the abort signal landed, so a loaded runner could observe no registration); the test now waits for the worker to be mid-initialization before killing. -- Removed hard-coded `scout` references from agent, system, and tool prompts that leaked into the model even when the scout agent was disabled (`task.disabledAgents`) or absent from the spawn list: the init agent prompt, task tool description, delegation gates, plan-mode and workflowz notices, and glob/grep/ast-grep guidance no longer recommend an unavailable agent, including after live settings changes ([#7313](https://github.com/can1357/oh-my-pi/issues/7313)). -- Fixed compiled Windows launches misclassifying ConPTY-backed terminals as console-less when `GetConsoleWindow()` returned no HWND, which spawned Python eval kernels with `CREATE_NO_WINDOW` and could deadlock imports of NumPy-backed packages such as Matplotlib ([#7343](https://github.com/can1357/oh-my-pi/issues/7343)). -- Fixed headless print-mode teardown exceeding its Mnemopi consolidation budget when final retention blocks on a locked SQLite writer, leaving the parent process, embed worker, and MCP children alive after the turn completed ([#7351](https://github.com/can1357/oh-my-pi/issues/7351)). -- Fixed headless `-p` / `--mode json` runs with `memory.backend: mnemopi` hanging after a completed turn and leaving `__omp_worker_mnemopi_embed` unreaped when the embed worker's fastembed/onnxruntime runtime wedged. Steady-state embed requests were unbounded, so a stuck native runtime blocked the turn's memory recall or shutdown consolidation forever; embeds are now bounded and the wedged worker is reaped on timeout so the next call respawns a fresh child, while initialization remains unbounded so first-time runtime installation and model bootstrap are not killed mid-install (regression of [#5753](https://github.com/can1357/oh-my-pi/issues/5753); [#7352](https://github.com/can1357/oh-my-pi/issues/7352)). -- Fixed a literal API key configured via `/login` (e.g. OpenCode Zen's free `public` key) being hijacked on Windows by a case-differing system environment variable, causing 401s. `process.env`/`Bun.env` reads are case-insensitive on Windows, so the config-value resolvers' "env var name, else literal" fallback resolved `public` to the built-in `PUBLIC=C:\Users\Public`. Resolution now requires an exact-case env entry (via the new `$envExact` helper) before treating a value as an env-var reference ([#7361](https://github.com/can1357/oh-my-pi/issues/7361)). -- Fixed redirected stdin being ignored when Bun reports a pipe with an undefined `isTTY`, so JSON/print sessions now process piped prompts and persist them under `--session-dir` or `PI_CODING_AGENT_SESSION_DIR` as requested ([#7378](https://github.com/can1357/oh-my-pi/issues/7378)). -- Fixed Chromium-backed tests failing during suite registration when the shared availability probe was still initializing ([#7384](https://github.com/can1357/oh-my-pi/pull/7384) by [@paralin](https://github.com/paralin)). -- Fixed the terminal-tab title dropping to idle (`>`) while an unsuppressed async job was still running — a `/vibe` worker turn or a bash `async` job that re-wakes the director after it settles. `EventController.#handleAgentEnd` now skips the idle/loader teardown on a non-terminal `agent_end` (`isTerminal: false`) and only tears down at the true terminal settle ([#7386](https://github.com/can1357/oh-my-pi/issues/7386)). -- Fixed `omp setup python` to validate the same configured or discovered interpreter used by the Python eval runtime. -- Fixed self-update misclassifying glibc Linux hosts with an installed musl loader as musl hosts, which could download an unusable musl binary instead of the glibc release. -- Fixed a crash where opening the Agent Hub after a resume and moving the selection triggered an unbounded `ExtensionExitError` unhandled-rejection storm and exit 129. The postmortem module bound the native hard-exit at first evaluation; when the bundler deferred that evaluation into a `withHostGuard` window it froze the guard's throwing replacement, poisoning every later signal/fatal exit. The native exit is now resolved per call, and the guard stamps its replacement with the native primitive it shadows so mid-guard signals still exit ([#7393](https://github.com/can1357/oh-my-pi/issues/7393)). -- Fixed project-scoped session directories using leading-hyphen names and collapsing distinct paths such as `~/project/hail-mary` and `~/project-hail-mary` into one bucket; directory names now use a portable readable prefix plus the canonical cwd hash, and colliding legacy buckets are split by their recorded session cwd during migration ([#7396](https://github.com/can1357/oh-my-pi/issues/7396)). -- Fixed manual `/shake` leaving the context budget and next pre-turn compaction decision anchored to the stale pre-shake provider token count until another model response arrived. -- Fixed Mnemopi scoped recall reporting "No relevant memories found" when every scoped target failed internally; target failures now warn, and total recall failure preserves the underlying engine error while healthy targets remain available ([#7364](https://github.com/can1357/oh-my-pi/issues/7364)). -- Fixed `skill://` resolution ignoring explicitly configured `skills.customDirectories` entries when a same-named skill existed in a default discovery path: the custom-directory skill now wins as the higher-priority source ([#7190](https://github.com/can1357/oh-my-pi/issues/7190)). -- Fixed image paste failing on Wayland-only Linux sessions by reading PNG clipboard payloads through `wl-paste` before falling back to the native bridge ([#7316](https://github.com/can1357/oh-my-pi/issues/7316)). -- Fixed prewalk switching to the fast model during read-only investigation: `xd://` devices are dispatched through the `write` tool, so a read-only call such as an `lsp` navigation counted as the first edit/write and armed the one-way hand-off mid-planning. Device dispatches now carry the wrapped tool's approval tier and only trigger the switch at a `write`/`exec` tier — read-only `lsp`, `debug` inspection, and internal-URL `ast_edit` calls no longer downgrade the model ([#7312](https://github.com/can1357/oh-my-pi/issues/7312)). -### Added - -- Added `display.hideToolActivity` and the configurable `Ctrl+Shift+O` shortcut to hide model-initiated tool calls, results, failures, and result images while keeping assistant text visible; hidden activity remains persisted and can be revealed later in collapsed form. +- Fixed durability of session transcripts to prevent data loss on process crashes. +- Fixed a bug on Windows where a timed-out bash command could terminate the main omp process. +- Fixed headless runs hanging or leaving background workers alive after completion. +- Fixed a crash when opening the Agent Hub after resuming a session. +- Fixed /mcp reauth environment variable expansion and token validation. +- Fixed fuzzy replace-all edits re-matching replacement text indefinitely, which could freeze the TUI. +- Fixed inspect_image ignoring configured thinking effort for vision models. +- Fixed compiled binaries dropping certain extensions with complex CommonJS/ESM dependency graphs. +- Fixed template argument substitution executing recursive placeholder expansion when positional arguments contain literal $@ or $ARGUMENTS tokens. +- Fixed project-scoped session directories using leading-hyphen names and collapsing distinct paths. +- Fixed manual /shake leaving the context budget anchored to stale pre-shake token counts. +- Fixed Mnemopi scoped recall reporting "No relevant memories found" when individual targets fail internally. +- Fixed skill:// resolution ignoring custom directories when a same-named skill exists in a default path. +- Fixed image paste failing on Wayland-only Linux sessions. +- Fixed prewalk switching to the fast model during read-only investigations. +- Fixed self-update misclassifying glibc Linux hosts with an installed musl loader as musl hosts. +- Fixed omp setup python to validate the correct interpreter used by the Python eval runtime. +- Fixed the terminal-tab title dropping to idle while an unsuppressed async job was still running. +- Fixed redirected stdin being ignored when Bun reports a pipe with an undefined isTTY. +- Fixed a literal API key configured via /login being hijacked on Windows by case-differing system environment variables. +- Fixed Esc during a streaming /loop iteration pausing the loop instead of aborting the current turn. +- Fixed heavily branched conversation trees shifting linear continuations into disconnected columns. +- Fixed plugin installation validation failures for legacy compatibility shims. +- Removed hard-coded references to disabled or absent agents in system and tool prompts. ## [17.2.4] - 2026-08-01 diff --git a/packages/coding-agent/test/mcp-command-reauth.test.ts b/packages/coding-agent/test/mcp-command-reauth.test.ts index 9534bf91d..3f3f98e2f 100644 --- a/packages/coding-agent/test/mcp-command-reauth.test.ts +++ b/packages/coding-agent/test/mcp-command-reauth.test.ts @@ -574,7 +574,9 @@ describe("/mcp auth commands", () => { type: "http", url: RAW_SERVER_URL, oauth: { + // biome-ignore lint/suspicious/noTemplateCurlyInString: test placeholder string for env expansion clientId: "${MCP_OAUTH_CLIENT_ID}", + // biome-ignore lint/suspicious/noTemplateCurlyInString: test placeholder string for env expansion clientSecret: "${MCP_OAUTH_CLIENT_SECRET}", }, }, @@ -616,7 +618,9 @@ describe("/mcp auth commands", () => { // The config file keeps the placeholder; only the flow sees the value. const saved = JSON.parse(await Bun.file(configPath).text()) as TestConfigFile; const savedServer = saved.mcpServers?.envserver; + // biome-ignore lint/suspicious/noTemplateCurlyInString: test placeholder string for env expansion expect(savedServer?.oauth?.clientSecret).toBe("${MCP_OAUTH_CLIENT_SECRET}"); + // biome-ignore lint/suspicious/noTemplateCurlyInString: test placeholder string for env expansion expect(savedServer?.oauth?.clientId).toBe("${MCP_OAUTH_CLIENT_ID}"); } finally { restoreEnvValue("MCP_OAUTH_CLIENT_ID", originalClientId); diff --git a/packages/natives/CHANGELOG.md b/packages/natives/CHANGELOG.md index 572294ab2..14f4cf999 100644 --- a/packages/natives/CHANGELOG.md +++ b/packages/natives/CHANGELOG.md @@ -4,18 +4,18 @@ ### Breaking Changes -- Replaced `DesktopSession.execute(actions, window)` and action batches with per-operation capture, pointer, keyboard, window, and accessibility methods; capture caps now apply per call and coordinate input requires a prior frame for the same target. +- Replaced DesktopSession.execute(actions, window) and action batches with dedicated per-operation methods for capture, pointer, keyboard, window, and accessibility. Capture capabilities now apply per call, and coordinate input requires a prior frame for the same target. ### Added -- Added a cross-platform, in-process `ps` shell builtin with BSD/procps selection forms, custom output columns, sorting, process metrics, and header suppression. -- Added macOS, Win32, X11, and Wayland desktop backends behind one session API, including capture-free window discovery, isolated capture, explicit background/foreground delivery, native AX/UIA/AT-SPI trees with generational refs, and structured errors when a platform cannot honestly deliver background input. +- Added a cross-platform, in-process ps shell builtin supporting BSD/procps selection forms, custom output columns, sorting, process metrics, and header suppression. +- Added unified desktop backends for macOS, Win32, X11, and Wayland behind a single session API, featuring capture-free window discovery, isolated capture, explicit background/foreground delivery, native accessibility trees (AX/UIA/AT-SPI) with generational references, and structured errors for unsupported background input. ### Fixed -- Fixed the accessibility snapshot marking a window root `(focused)` from its app-local `AXFocused` attribute even when another application held global focus; the root annotation now reflects the global window-roster focus flag. -- Clarified coordinate-frame errors: pointer input before any capture, out-of-frame coordinates, and between-display points now name the capture-frame contract and the remedy instead of a bare bounds check. -- Fixed macOS background keyboard events being posted through both CoreGraphics and SkyLight, which duplicated every typed character in AppKit targets; the authenticated SkyLight route now delivers each event once. +- Fixed accessibility snapshots incorrectly marking a window root as focused based on its app-local AXFocused attribute when another application held global focus; the root annotation now correctly reflects the global window-roster focus flag. +- Improved coordinate-frame error messages for pointer input before capture, out-of-frame coordinates, and between-display points to clearly explain the capture-frame contract and remedy instead of throwing a generic bounds check. +- Fixed duplicated characters in AppKit targets on macOS caused by background keyboard events being posted through both CoreGraphics and SkyLight; events are now delivered once via the authenticated SkyLight route. ## [17.2.2] - 2026-07-31 diff --git a/packages/tui/CHANGELOG.md b/packages/tui/CHANGELOG.md index 18514d418..f4218b2f2 100644 --- a/packages/tui/CHANGELOG.md +++ b/packages/tui/CHANGELOG.md @@ -4,7 +4,7 @@ ### Fixed -- Fixed Kitty/Ghostty shortcuts on non-Latin keyboard layouts by requesting base-layout key reporting from the terminal ([#7320](https://github.com/can1357/oh-my-pi/issues/7320)). +- Fixed Kitty and Ghostty keyboard shortcuts on non-Latin keyboard layouts by requesting base-layout key reporting from the terminal. ## [17.2.4] - 2026-08-01 diff --git a/packages/utils/CHANGELOG.md b/packages/utils/CHANGELOG.md index 55ec334f7..c9bc3118b 100644 --- a/packages/utils/CHANGELOG.md +++ b/packages/utils/CHANGELOG.md @@ -4,11 +4,11 @@ ### Added -- Added `parseFlag()` (boolean-ish env value parsing backing `$flag()`), `getBrowserRelayDir()` (~/.omp/browser-relay, XDG data category), and `getGlobalDaemonRuntimeDir()` (profile-independent broker state) for the browser relay mode. +- Added utility functions `parseFlag()`, `getBrowserRelayDir()`, and `getGlobalDaemonRuntimeDir()` to support browser relay mode and global daemon runtime directory resolution. ### Changed -- Added static command metadata support to the lightweight CLI runner so root help can render without importing command implementations. +- Updated the lightweight CLI runner to support static command metadata, allowing root help to render without importing full command implementations. ## [17.2.4] - 2026-08-01