|
|
|
@@ -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. `<model>: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
|
|
|
|
|
|
|
|
|
|