@oh-my-pi/pi-coding-agent 15.7.6 → 15.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +172 -198
- package/dist/types/async/job-manager.d.ts +3 -3
- package/dist/types/cli/args.d.ts +1 -0
- package/dist/types/cli/claude-trace-cli.d.ts +54 -0
- package/dist/types/cli/session-picker.d.ts +10 -3
- package/dist/types/cli/update-cli.d.ts +17 -0
- package/dist/types/commands/launch.d.ts +3 -0
- package/dist/types/config/keybindings.d.ts +10 -1
- package/dist/types/config/settings-schema.d.ts +2 -2
- package/dist/types/config/settings.d.ts +13 -0
- package/dist/types/edit/index.d.ts +6 -0
- package/dist/types/edit/streaming.d.ts +8 -0
- package/dist/types/eval/concurrency-bridge.d.ts +26 -0
- package/dist/types/eval/js/tool-bridge.d.ts +2 -1
- package/dist/types/export/ttsr.d.ts +9 -0
- package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +11 -0
- package/dist/types/main.d.ts +5 -0
- package/dist/types/mcp/transports/stdio.d.ts +19 -0
- package/dist/types/modes/components/custom-editor.d.ts +3 -1
- package/dist/types/modes/components/hook-selector.d.ts +3 -0
- package/dist/types/modes/components/session-selector.d.ts +32 -5
- package/dist/types/modes/components/tool-execution.d.ts +8 -0
- package/dist/types/modes/controllers/extension-ui-controller.d.ts +2 -2
- package/dist/types/modes/controllers/input-controller.d.ts +1 -0
- package/dist/types/modes/interactive-mode.d.ts +9 -2
- package/dist/types/modes/types.d.ts +4 -2
- package/dist/types/registry/agent-registry.d.ts +1 -1
- package/dist/types/sdk.d.ts +2 -2
- package/dist/types/session/agent-session.d.ts +4 -2
- package/dist/types/session/history-storage.d.ts +16 -1
- package/dist/types/session/session-manager.d.ts +4 -0
- package/dist/types/task/output-manager.d.ts +6 -15
- package/dist/types/tools/find.d.ts +0 -9
- package/dist/types/tools/index.d.ts +1 -1
- package/dist/types/tools/path-utils.d.ts +16 -0
- package/dist/types/tools/sqlite-reader.d.ts +25 -8
- package/dist/types/tools/write.d.ts +2 -0
- package/dist/types/utils/clipboard.d.ts +4 -0
- package/dist/types/utils/jj.d.ts +49 -0
- package/dist/types/web/kagi.d.ts +76 -0
- package/dist/types/web/search/providers/exa.d.ts +7 -1
- package/dist/types/web/search/providers/kagi.d.ts +1 -0
- package/package.json +9 -9
- package/src/async/job-manager.ts +3 -3
- package/src/cli/args.ts +6 -2
- package/src/cli/claude-trace-cli.ts +783 -0
- package/src/cli/session-picker.ts +36 -10
- package/src/cli/update-cli.ts +35 -2
- package/src/commands/launch.ts +3 -0
- package/src/config/keybindings.ts +14 -1
- package/src/config/model-registry.ts +18 -7
- package/src/config/settings-schema.ts +2 -2
- package/src/config/settings.ts +23 -0
- package/src/discovery/builtin-rules/index.ts +2 -0
- package/src/discovery/builtin-rules/ts-no-deprecated-leftovers.md +44 -0
- package/src/discovery/claude-plugins.ts +7 -9
- package/src/edit/index.ts +10 -0
- package/src/edit/streaming.ts +65 -0
- package/src/eval/__tests__/agent-bridge.test.ts +58 -4
- package/src/eval/concurrency-bridge.ts +34 -0
- package/src/eval/js/shared/prelude.txt +20 -17
- package/src/eval/js/tool-bridge.ts +5 -0
- package/src/eval/py/prelude.py +23 -15
- package/src/export/ttsr.ts +18 -1
- package/src/extensibility/custom-commands/bundled/review/index.ts +74 -45
- package/src/extensibility/plugins/legacy-pi-compat.ts +115 -131
- package/src/extensibility/skills.ts +0 -1
- package/src/internal-urls/docs-index.generated.ts +12 -11
- package/src/main.ts +92 -24
- package/src/mcp/transports/stdio.ts +55 -22
- package/src/modes/acp/acp-event-mapper.ts +54 -4
- package/src/modes/components/custom-editor.ts +10 -0
- package/src/modes/components/hook-selector.ts +89 -31
- package/src/modes/components/oauth-selector.ts +12 -6
- package/src/modes/components/session-selector.ts +179 -24
- package/src/modes/components/tool-execution.ts +16 -3
- package/src/modes/controllers/command-controller.ts +2 -11
- package/src/modes/controllers/extension-ui-controller.ts +3 -2
- package/src/modes/controllers/input-controller.ts +19 -1
- package/src/modes/controllers/selector-controller.ts +61 -21
- package/src/modes/interactive-mode.ts +125 -15
- package/src/modes/types.ts +5 -2
- package/src/prompts/agents/reviewer.md +2 -2
- package/src/prompts/review-request.md +1 -1
- package/src/prompts/system/empty-stop-retry.md +6 -0
- package/src/prompts/system/orchestrate-notice.md +5 -3
- package/src/prompts/system/workflow-notice.md +2 -2
- package/src/prompts/tools/eval.md +5 -5
- package/src/prompts/tools/find.md +1 -1
- package/src/prompts/tools/irc.md +6 -6
- package/src/prompts/tools/search-tool-bm25.md +9 -2
- package/src/prompts/tools/search.md +1 -1
- package/src/prompts/tools/task.md +1 -1
- package/src/registry/agent-registry.ts +1 -1
- package/src/sdk.ts +85 -31
- package/src/session/agent-session.ts +209 -54
- package/src/session/history-storage.ts +56 -12
- package/src/session/session-manager.ts +34 -0
- package/src/task/output-manager.ts +40 -48
- package/src/task/render.ts +3 -8
- package/src/tools/browser/tab-worker.ts +8 -5
- package/src/tools/find.ts +5 -29
- package/src/tools/index.ts +1 -1
- package/src/tools/path-utils.ts +144 -1
- package/src/tools/read.ts +47 -0
- package/src/tools/search-tool-bm25.ts +7 -1
- package/src/tools/search.ts +2 -27
- package/src/tools/sqlite-reader.ts +92 -9
- package/src/tools/write.ts +6 -0
- package/src/utils/clipboard.ts +38 -1
- package/src/utils/git.ts +19 -23
- package/src/utils/jj.ts +225 -0
- package/src/utils/open.ts +37 -2
- package/src/web/kagi.ts +168 -49
- package/src/web/search/providers/anthropic.ts +1 -1
- package/src/web/search/providers/exa.ts +20 -86
- package/src/web/search/providers/kagi.ts +4 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,17 +2,76 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [15.8.2] - 2026-06-03
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- Added a bundled TypeScript rule that warns against leaving `@deprecated` compatibility shims behind instead of finishing a refactor.
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- Fixed `/review`'s uncommitted-change mode in Jujutsu repositories to read `jj diff --git` from the current workspace, so non-default JJ workspaces include their working-copy changes instead of falling back to the colocated Git checkout.
|
|
14
|
+
- Fixed empty assistant stop retry continuations preserving auto-retry state until a non-empty assistant turn completes or recovery reaches its retry cap.
|
|
15
|
+
- Fixed TTSR rule conditions never matching streamed `edit`/`write` tool calls whose wire format obscures the real content (hashline `+` body rows, apply_patch envelopes, JSON-escaped `write` content). The edit and write tools now expose a `matcherDigest` normalization and TTSR matches against the introduced source text, so rule regexes stay universal regardless of the active edit mode.
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
|
|
19
|
+
- Changed the JJ utility API to mirror Git's scoped helpers: repository operations now live under `jj.repo` (`root`, `resolve`, `is`, `clearRootCache`), and diff file listing is available as `jj.diff.changedFiles`.
|
|
20
|
+
|
|
21
|
+
- Changed the `search_tool_bm25` tool description to name the hidden discoverable built-in tools (e.g. `write`, `find`, `search`, `lsp`, `task`) when `tools.discoveryMode: "all"` is active, so a model can form a targeted discovery query by name instead of guessing or falling back to shell. `mcp-only` mode is unchanged (no built-ins are advertised) and the `Total discoverable tools available: N` count still includes them.
|
|
22
|
+
|
|
23
|
+
## [15.8.1] - 2026-06-02
|
|
24
|
+
|
|
25
|
+
### Fixed
|
|
26
|
+
|
|
27
|
+
- Fixed an unhandled `EPIPE` rejection when an MCP stdio server exits between returning the `initialize` response and the client's `notifications/initialized` send. `StdioTransport.notify()` and `#sendResponse()` now route stdin writes through a shared helper that catches synchronous sink failures: `notify()` tears the transport down (firing `onClose`) and surfaces a `Transport closed while sending notification` rejection so `connectToServer()` treats the handshake as a failed connection instead of returning a "connected" handle wrapping a dead transport; `#sendResponse()` stays silent because a dead subprocess has no use for the response. `StdioTransport.close()` is now the authoritative resource teardown — it no longer early-returns when `#handleClose()` has already flipped `#connected`, so the subprocess and read loop are always cleaned up (including in the `connectToServer()` failure path) ([#1710](https://github.com/can1357/oh-my-pi/issues/1710)).
|
|
28
|
+
- Fixed startup model resolution ignoring cached discovery rows for special built-in providers (`google-antigravity`, `google-gemini-cli`, `openai-codex`) until the background refresh completed ([#1721](https://github.com/can1357/oh-my-pi/issues/1721)).
|
|
29
|
+
- Fixed Windows clipboard-image paste keeping `Ctrl+V` unregistered by default. The TUI now registers `Ctrl+V` plus the Windows Terminal-safe `Alt+V` fallback, and the keybinding docs call out when to use the fallback ([#1708](https://github.com/can1357/oh-my-pi/issues/1708)).
|
|
30
|
+
|
|
31
|
+
## [15.8.0] - 2026-06-02
|
|
32
|
+
|
|
33
|
+
### Added
|
|
34
|
+
|
|
35
|
+
- Added an all-projects scope to the session picker (`pi --resume` / `/resume`). Press `Tab` to toggle between the current folder's sessions and every session across all projects; the all-projects list is loaded lazily and shows each session's directory. When the current folder has no sessions the picker now opens straight into all-projects scope instead of printing "No sessions found".
|
|
36
|
+
- Migrated the Kagi web search provider to Kagi's V1 Search API (`POST /api/v1/search`), replacing the sunset V0 endpoint while keeping the `kagi` provider id, `KAGI_API_KEY` credential, and `/login kagi` flow unchanged ([#1272](https://github.com/can1357/oh-my-pi/pull/1272) by [@thismat](https://github.com/thismat))
|
|
37
|
+
- Added Anthropic `anthropic-ratelimit-unified-*` response-header warming for `/usage` and the status-line usage segment, throttled to reduce direct OAuth `/usage` probes during active use.
|
|
38
|
+
|
|
39
|
+
### Changed
|
|
40
|
+
|
|
41
|
+
- Changed Anthropic API request metadata `user_id.device_id` to be derived from the persistent install ID so it remains stable across Anthropic account changes on the same install
|
|
42
|
+
- Changed the eval `parallel()` / `pipeline()` helpers to drop their `concurrency` argument and run as wide as a `task` tool batch. The worker-pool ceiling now tracks the `task.maxConcurrency` setting (default 32; `0` = run every item at once) resolved live from the host via a new `__concurrency__` bridge, instead of the old per-call `concurrency` option that defaulted to 4 and capped at 16. This stops eval fan-outs from under-using the parallelism the session is configured for.
|
|
43
|
+
- Changed subagent / `agent://` output ids from a numeric prefix scheme (`0-Anna`, `1-Bob`, nested `0-Anna.1-Bob`) to a name-first scheme: the requested name is used verbatim and a `-2`/`-3`/… suffix is added only when the same name recurs within a session (`Anna`, `Anna-2`, `Anna-3`). Nested ids stay grouped under the parent (`Anna.Bob`) and the live task widget renders them as `Anna>Bob`. The main agent's IRC id is now `Main` (was `0-Main`). `AgentOutputManager` still scans existing `.md` outputs on resume so it never reuses a name that would clobber a prior output.
|
|
44
|
+
- Changed resuming a session that belongs to a different project to switch the process into that project's working directory. `pi --resume` and the in-session `/resume` picker now `chdir` into the resumed session's `cwd` and re-scope every cwd-derived input — project dir, **project settings** (`.claude/settings.yml`, `.omp/settings.json`, path-scoped `enabledModels`/`disabledProviders`), plugin roots, capabilities, slash commands, and the ssh tool — so tools, discovery, configuration, and commands all follow the resumed project. The `SessionManager` adopts the resumed session's own `cwd`/session directory on load (rolled back if the switch fails).
|
|
45
|
+
- Documented `ANTHROPIC_SEARCH_API_KEY` and `ANTHROPIC_SEARCH_BASE_URL` more thoroughly in `docs/environment-variables.md`, surfaced them in `docs/tools/web_search.md`'s Anthropic provider section, and added `ANTHROPIC_SEARCH_BASE_URL` to `omp --help`'s env-var summary so the search-only overrides are discoverable alongside `ANTHROPIC_SEARCH_API_KEY` ([#1694](https://github.com/can1357/oh-my-pi/issues/1694)).
|
|
46
|
+
- Migrated the Kagi web search provider to Kagi's V1 Search API (`POST /api/v1/search`), replacing the sunset V0 endpoint while keeping the `kagi` provider id, `KAGI_API_KEY` credential, and `/login kagi` flow unchanged ([#1272](https://github.com/can1357/oh-my-pi/pull/1272) by [@thismat](https://github.com/thismat))
|
|
47
|
+
|
|
5
48
|
### Fixed
|
|
6
49
|
|
|
50
|
+
- Fixed `read`, `search`, `find`, `ast_grep`, and `ast_edit` recovering when a model flattens multiple existing paths into one comma-, semicolon-, or space-delimited string while preserving real paths that contain delimiters.
|
|
51
|
+
- Fixed Exa web search reporting available without Exa credentials, which could route searches into the unauthenticated public MCP fallback and stall before trying the next provider. Availability and `searchExa()` now resolve through the standard `AuthStorage` cascade (`EXA_API_KEY` env or stored credential) ([#1695](https://github.com/can1357/oh-my-pi/issues/1695)).
|
|
52
|
+
- Fixed Anthropic web search ignoring `ANTHROPIC_SEARCH_BASE_URL` when credentials came from stored Anthropic auth or generic Anthropic env fallback rather than `ANTHROPIC_SEARCH_API_KEY` ([#1694](https://github.com/can1357/oh-my-pi/issues/1694)).
|
|
53
|
+
- Fixed `web_search` returning 401 from corporate Anthropic API gateways. `ANTHROPIC_CUSTOM_HEADERS` is now forwarded to web-search requests whenever `ANTHROPIC_BASE_URL` points to a non-Anthropic host, not only in Foundry mode ([#1693](https://github.com/can1357/oh-my-pi/issues/1693)).
|
|
54
|
+
- Fixed opening exported local files from WSL by sending existing paths through `wslpath -w` and launching `wslview` directly when available, avoiding `xdg-open`'s broken file-handler path translation ([#950](https://github.com/can1357/oh-my-pi/pull/950) by [@rxreyn3](https://github.com/rxreyn3)).
|
|
55
|
+
- Fixed `/move` (and cross-project resume) not re-scoping the live project settings to the destination directory. Changing a session's working directory now reloads the project settings layer in place (via `Settings.reloadForCwd`) so project-scoped configuration and path-scoped `enabledModels`/`disabledProviders` follow the move instead of remaining pinned to the launch directory.
|
|
56
|
+
- Fixed `read <db.sqlite>` freezing the TUI on large databases. Listing tables ran an unbounded `SELECT COUNT(*)` per table, and since `bun:sqlite` executes synchronously on the same JS thread that drives rendering and input, a multi-GB database's full-table scans blocked the UI for seconds. The listing now reads the planner's `sqlite_stat1` estimate for tables above a scan cap (shown as `~N rows`) and only counts exactly when a table is provably small, reading at most `cap + 1` rows (a capped table shows `N+ rows`). On an 8.4 GB stats database the listing dropped from multi-second full scans to ~2 ms.
|
|
7
57
|
- Fixed a module-load crash (`ReferenceError: Cannot access 'evalToolRenderer' before initialization`) triggered whenever `tools/eval` was imported before `tools/renderers`. The eval JS backend statically pulls the agent/task/sdk/extension chain, which re-enters the root barrel → `modes/components` → `tool-execution` → `renderers` while `eval.ts` was still initializing, so `renderers.ts` read `evalToolRenderer` in its TDZ. The eval TUI renderer is now split into a dependency-light `tools/eval-render.ts` that `renderers.ts` imports directly (decoupling pure rendering from the eval runtime); `eval.ts` re-exports `evalToolRenderer`/`EVAL_DEFAULT_PREVIEW_LINES` for compatibility.
|
|
58
|
+
- Fixed `/logout` offering providers that were only authenticated by env/config fallbacks, which made OpenCode Go/Zen appear to remain logged in after their stored credentials were removed ([#1658](https://github.com/can1357/oh-my-pi/issues/1658)).
|
|
59
|
+
- Fixed `omp --resume <id>` crashing with an uncaught exception when an interactive user declined the cross-project fork prompt. `createSessionManager` now returns `undefined` for that cancellation, while non-interactive invocations still fail with a diagnostic when they cannot answer the fork prompt ([#1668](https://github.com/can1357/oh-my-pi/issues/1668)).
|
|
60
|
+
- Fixed `history.db` never recording the originating session id: the `session_id` column documented for 15.6.0 was missing from the shipped storage layer, so the column was never created/populated on the write path and every prompt row had `session_id` `NULL`. Restored the `session_id` column, schema migration (`ALTER TABLE history ADD COLUMN session_id` for pre-existing databases), and `HistoryEntry.sessionId`; wired interactive mode to register `setSessionResolver(...)` so prompts are stamped with the session active at submission time (tracking fork/resume switches); and re-enabled prompt-history ranking in the `--resume` and in-session session pickers via `HistoryStorage.matchingSessionIds()`.
|
|
61
|
+
- Fixed `/quit` shutdown leaving the parent shell prompt at the top of the viewport after the final TUI teardown render on Linux terminals ([#1620](https://github.com/can1357/oh-my-pi/issues/1620)).
|
|
62
|
+
- Fixed `omp update` failing with `No version matching "X" found for specifier "@oh-my-pi/pi-coding-agent" (but package exists)` when bun saw an older catalog than the update check did. The version is resolved by querying `https://registry.npmjs.org/` directly, but `bun install -g` would then consult its on-disk manifest snapshot or a configured npm mirror (corporate proxy, Taobao, …) that hadn't replicated the release. The bun install step now runs with `--no-cache --registry=https://registry.npmjs.org/` so it hits exactly the registry the version check used ([#1686](https://github.com/can1357/oh-my-pi/issues/1686)).
|
|
63
|
+
- Fixed ACP mode resetting configured async/background job settings to disabled RPC defaults, so explicit ACP background-job opt-ins are preserved during startup ([#1324](https://github.com/can1357/oh-my-pi/issues/1324)).
|
|
64
|
+
- Fixed legacy Pi extensions loading their `__dirname`-relative assets as empty — e.g. `@plannotator/pi-extension` reading `plannotator.html`/`review-editor.html` via `readFileSync(join(__dirname, …))`, which left `planHtmlContent` empty and dropped the plugin into its "no UI support" auto-approve path. The compat layer previously mirrored every extension module into a flat temp directory, so `import.meta.url` (and thus `__dirname`) pointed at the mirror root and sibling asset reads `ENOENT`ed. Extensions now load in place from their real on-disk location — `import.meta.url` is the real source file, so asset reads resolve exactly as under the original Pi runtime. A `Bun.plugin()` `onLoad` hook scoped to the entry's relative-import graph (the exact set of source modules, never the host, other extensions, `node_modules` deps, or unrelated project files) rewrites only the legacy `@(scope)/pi-*` and `@sinclair/typebox` imports; relative siblings, the extension's own `node_modules` deps, and bundled assets all resolve natively, with no temp-directory mirroring and no asset copying ([#1674](https://github.com/can1357/oh-my-pi/issues/1674)).
|
|
65
|
+
- Fixed plan approval keep-context usage to use the execution model context window, avoid zero-usage aborted turns, and disable keeping context when preserved context exceeds 95%.
|
|
8
66
|
|
|
9
67
|
## [15.7.6] - 2026-06-01
|
|
68
|
+
|
|
10
69
|
### Added
|
|
11
70
|
|
|
12
71
|
- Added `ask` option descriptions so agents can keep short labels and render explanatory text as separate muted rows in the selector.
|
|
13
72
|
- Added an extension API for rendering supplemental UI below visible assistant thinking blocks.
|
|
14
73
|
- Added default-on `lsp.diagnosticsDeduplicate` support so post-edit LSP diagnostics already shown for a file are suppressed within the session and only new or changed diagnostics are surfaced.
|
|
15
|
-
|
|
74
|
+
|
|
16
75
|
### Fixed
|
|
17
76
|
|
|
18
77
|
- Fixed a single ESC press both dismissing the @/slash autocomplete popup and aborting the running agent operation. ESC now drains the popup first; only when no popup is visible does it route to the global interrupt handler (matching the standard TUI/IDE pattern). The `shouldBypassAutocompleteOnEscape` editor hook is removed — it had become the trigger for this bug ([#1655](https://github.com/can1357/oh-my-pi/issues/1655)).
|
|
@@ -20,36 +79,16 @@
|
|
|
20
79
|
- Fixed the `eval` tool's per-cell `timeout` killing cells that were not stalled. The timeout is now a plain wall-clock budget on the cell's **own** work that is **paused only while a host-side `agent()`/`parallel()`/`llm()` bridge call is in flight** — those calls pump a heartbeat that re-arms the watchdog, so a long fanout or a slow (e.g. reasoning-tier) completion runs to completion instead of being aborted mid-flight (a subagent's time-to-first-token, a long quiet nested tool, or an entire oneshot `llm()` request no longer trip it). Nothing else re-arms the budget: ordinary compute, `print`/stdout, `log()`/`phase()`, and non-agent tool calls all count against it, so a cell that is not delegating to an agent/llm is bounded by the regular wall-clock timeout (and the timeout message no longer says "of inactivity"). The heartbeat is a pure keepalive — never persisted or rendered.
|
|
21
80
|
|
|
22
81
|
## [15.7.5] - 2026-06-01
|
|
23
|
-
### Fixed
|
|
24
|
-
|
|
25
|
-
- Fixed streaming assistant responses leaving duplicated tail rows in WSL/Windows Terminal scrollback by enabling eager native-scrollback rebuilds while assistant text is actively streaming ([#1615](https://github.com/can1357/oh-my-pi/issues/1615)).
|
|
26
82
|
|
|
27
83
|
### Fixed
|
|
28
84
|
|
|
85
|
+
- Fixed streaming assistant responses leaving duplicated tail rows in WSL/Windows Terminal scrollback by enabling eager native-scrollback rebuilds while assistant text is actively streaming ([#1615](https://github.com/can1357/oh-my-pi/issues/1615)).
|
|
29
86
|
- Fixed the `task` tool mangling subagent prompts when a model double-JSON-encodes a string argument: `context` and each task's `assignment`/`description` are now repaired when they arrive uniformly double-escaped (literal `\n`, `\"`, `\uXXXX`), so the subagent receives the intended prose and the call preview renders real newlines. The repair is guarded by a JSON-string round-trip and a double-encode signature, so legitimate backslashes/quotes (Windows paths, regexes, embedded quotes) are left untouched, and it is scoped to these natural-language fields only (never code-bearing tools).
|
|
30
|
-
|
|
31
|
-
### Fixed
|
|
32
|
-
|
|
33
87
|
- Fixed `pr://` PR views omitting formal review submissions and approvals when comments are enabled ([#1600](https://github.com/can1357/oh-my-pi/issues/1600)).
|
|
34
|
-
|
|
35
|
-
### Fixed
|
|
36
|
-
|
|
37
88
|
- Fixed subagent yield-reminder loop logging benign user/compaction aborts as `ERROR`. The catch around `session.prompt`/`waitForIdle` in `task/executor.ts` now demotes `ToolAbortError` and signal-aborted exits to `debug` and keeps `ERROR` for genuine prompt failures only ([#1623](https://github.com/can1357/oh-my-pi/issues/1623)).
|
|
38
|
-
|
|
39
|
-
### Fixed
|
|
40
|
-
|
|
41
89
|
- Fixed `read local://<file>` resolving to the wrong session's artifacts directory in multi-session ACP hosts (e.g. cmux). `LocalProtocolHandler.resolve` now honors `context.localProtocolOptions` supplied by the calling tool before falling back to the process-wide override or the first `main`-kind session in the global `AgentRegistry`; `read`, `find`, `search`, `ast_grep`, and `ast_edit` thread their session's options through so a `local://PLAN.md` lookup hits the calling session's `local` root instead of a sibling session's ([#1608](https://github.com/can1357/oh-my-pi/issues/1608)).
|
|
42
|
-
|
|
43
|
-
### Fixed
|
|
44
|
-
|
|
45
90
|
- Fixed `omp` segfaulting on exit on Windows after the tiny title/memory model loaded `onnxruntime-node` (issue [#1606](https://github.com/can1357/oh-my-pi/issues/1606)). The tiny model now runs in a Bun subprocess instead of a Worker thread, so the NAPI finalizer that crashes during shutdown never executes in the agent's address space; the subprocess is `SIGKILL`'d on dispose to skip every native destructor on every platform.
|
|
46
|
-
|
|
47
|
-
### Fixed
|
|
48
|
-
|
|
49
91
|
- Fixed unbounded MCP reconnect loop that could fork-bomb the host when a stdio MCP server completes the `initialize`/`tools/list` handshake and then exits. `MCPManager` now enforces a per-server crash circuit breaker (5 reconnects per 30 s window) on the automatic `transport.onClose` path; manual `/mcp reconnect` resets the window so users can recover after fixing the misconfiguration ([#1592](https://github.com/can1357/oh-my-pi/issues/1592)).
|
|
50
|
-
|
|
51
|
-
### Fixed
|
|
52
|
-
|
|
53
92
|
- Fixed auto context maintenance to include the pending prompt in the pre-send token estimate, so large user turns compact history before the provider rejects an over-limit request ([#1618](https://github.com/can1357/oh-my-pi/issues/1618)).
|
|
54
93
|
|
|
55
94
|
## [15.7.4] - 2026-05-31
|
|
@@ -63,6 +102,7 @@
|
|
|
63
102
|
- Fixed plugin install failing for sources pinned to a SHA: `git.clone()` no longer adds `--depth 1` when `options.sha` is set, so the checkout of arbitrary commits succeeds instead of bailing out with "shallow clone may not contain this commit" ([#1589](https://github.com/can1357/oh-my-pi/issues/1589)).
|
|
64
103
|
|
|
65
104
|
## [15.7.3] - 2026-05-31
|
|
105
|
+
|
|
66
106
|
### Added
|
|
67
107
|
|
|
68
108
|
- Added support for decimal and `k`/`m` suffix turn-budget directives, enabling budgets like `+1.5k` and `+2m` in eval message parsing
|
|
@@ -96,17 +136,8 @@
|
|
|
96
136
|
### Fixed
|
|
97
137
|
|
|
98
138
|
- Fixed Ctrl+O tool-result expansion on POSIX terminals so offscreen tool blocks rebuild native scrollback instead of leaving stale collapsed rows above the viewport.
|
|
99
|
-
|
|
100
|
-
### Removed
|
|
101
|
-
|
|
102
|
-
### Fixed
|
|
103
|
-
|
|
104
139
|
- Fixed auto-discovered OpenAI-compatible / Ollama / llama.cpp / new-api proxy models defaulting to `maxTokens: 8192`, which made providers drop the streaming connection mid-response on large `write`/`edit` tool calls and surfaced as Bun's opaque `socket connection was closed unexpectedly`. The discovery cap is now `32_768` (`DISCOVERY_DEFAULT_MAX_TOKENS` in `packages/coding-agent/src/config/model-registry.ts`) and `min(contextWindow, …)` still honors smaller advertised context windows ([#1528](https://github.com/can1357/oh-my-pi/issues/1528)).
|
|
105
|
-
|
|
106
140
|
- Removed the `/drop-images` slash command; use `/shake images`, which strips every image from the session through the same `dropImages()` path.
|
|
107
|
-
|
|
108
|
-
### Fixed
|
|
109
|
-
|
|
110
141
|
- Fixed final `agent()` completion status emissions in eval cells so the last live progress snapshot now preserves accumulated subagent metrics such as tool count and cost
|
|
111
142
|
- Fixed `agent()` in eval to enforce plan-mode, spawn allowlist, and disabled-agent checks before launching subagents
|
|
112
143
|
- Fixed recursive `agent()` calls from eval by enforcing the existing max subagent depth limit
|
|
@@ -121,6 +152,7 @@
|
|
|
121
152
|
- Fixed duplicated/stale scrollback above a streaming tool result on POSIX terminals (macOS/Linux). A tool whose output grows and re-lays-out (e.g. an edit diff gaining hunks) re-renders rows that already scrolled into native scrollback; the unknown-viewport anti-yank deferral left the old copy in place while the new one rendered below, showing the block twice. The event controller now enables the TUI's eager native-scrollback rebuild while a foreground tool is executing (`setEagerNativeScrollbackRebuild`), so those offscreen re-renders rebuild history cleanly — a snap to the tail is acceptable mid-tool. Background-running tools and plain assistant-text streaming keep the no-yank deferral; the mode resets at each turn start.
|
|
122
153
|
|
|
123
154
|
## [15.7.2] - 2026-05-31
|
|
155
|
+
|
|
124
156
|
### Added
|
|
125
157
|
|
|
126
158
|
- Added `providers.autoThinkingModel` setting so users can choose the `auto` thinking classifier backend (online smol or local tiny-memory model)
|
|
@@ -153,6 +185,7 @@
|
|
|
153
185
|
- Added an animated pending border for `bash` and `eval` execution blocks: while a command/cell is running, a single dark segment glides clockwise around the block's outer edge (top → right → bottom → left), replacing the previous static accent border. Motion is eased per edge (decelerating into each corner) and timed against a fixed lap duration mapped onto the live perimeter, so streaming a new output line or resizing the terminal nudges the segment proportionally instead of resetting its position. Driven by the existing spinner cadence and gated on the `display.shimmer` setting (no motion when `disabled`).
|
|
154
186
|
- Added `providers.tinyModelDevice` and `providers.tinyModelDtype` settings (Providers tab) controlling local tiny-model acceleration for session titles and Mnemopi memory tasks. `providers.tinyModelDevice` selects the ONNX execution provider (`default` keeps the platform pick — DirectML on Windows, CUDA on Linux x64, CPU elsewhere); `providers.tinyModelDtype` selects quantization/precision (`default` keeps each model's shipped `q4`, e.g. `fp16` trades speed for fidelity). The `PI_TINY_DEVICE` / `PI_TINY_DTYPE` env vars override the matching setting. Also added `PI_TINY_DTYPE` as the env counterpart to `PI_TINY_DEVICE`; an unrecognized device/precision fails loudly at worker startup instead of silently loading a different one.
|
|
155
187
|
- Added a bundled set of default rules shipped with the agent (TypeScript/Rust convention rules registered as TTSR conditions). They load via the new lowest-priority `builtin-defaults` discovery provider, so any user/project/tool rule of the same name overrides the bundled copy. Disable the whole set with `ttsr.builtinRules: false`, or drop individual rules (bundled or your own) by name via `ttsr.disabledRules`.
|
|
188
|
+
- Added a `symbols.spinnerFrames` field to custom theme JSON so themes can override the loader/tool-execution spinner. Accepts either a flat `string[]` (used for both spinner types) or `{ "status"?: string[], "activity"?: string[] }` to override each independently; anything not specified falls back to the symbol preset. Documented in `docs/theme.md` and validated by `theme-schema.json`. ([#1553](https://github.com/can1357/oh-my-pi/issues/1553))
|
|
156
189
|
|
|
157
190
|
### Changed
|
|
158
191
|
|
|
@@ -176,11 +209,8 @@
|
|
|
176
209
|
|
|
177
210
|
- Removed the `recipe` tool and its `recipe.enabled` setting. Task-runner targets (just/package.json/Cargo/make/Taskfile) are invoked directly through `bash`.
|
|
178
211
|
|
|
179
|
-
### Added
|
|
180
|
-
|
|
181
|
-
- Added a `symbols.spinnerFrames` field to custom theme JSON so themes can override the loader/tool-execution spinner. Accepts either a flat `string[]` (used for both spinner types) or `{ "status"?: string[], "activity"?: string[] }` to override each independently; anything not specified falls back to the symbol preset. Documented in `docs/theme.md` and validated by `theme-schema.json`. ([#1553](https://github.com/can1357/oh-my-pi/issues/1553))
|
|
182
|
-
|
|
183
212
|
## [15.6.0] - 2026-05-30
|
|
213
|
+
|
|
184
214
|
### Added
|
|
185
215
|
|
|
186
216
|
- Added prompt-mode autocomplete for supported internal URL schemes (`skill://`, `rule://`, `agent://`, `artifact://`, `local://`, `memory://`, and `omp://`) so typing those tokens now suggests existing resources as completion candidates
|
|
@@ -196,6 +226,7 @@
|
|
|
196
226
|
- Added a Mnemopi-only `memory_edit` agent tool for updating, forgetting, or invalidating recalled memories by id, and added `/memory stats` plus `/memory diagnose` slash commands for backend maintenance visibility.
|
|
197
227
|
- Added an `orchestrate` magic keyword that mirrors `ultrathink`: dropping the standalone word in a message paints it with a cool teal→violet gradient in the editor and appends a hidden system notice that switches the model into the multi-phase, parallel-subagent orchestration contract. Matching is word-bounded and case-insensitive, so `orchestrated`/`orchestrating` never trigger it.
|
|
198
228
|
- Added a model-tier slider to the plan-approval prompt ("Plan mode - next step"). Left/right arrows move it from any list position to pick which configured role model (`cycleOrder`, e.g. `smol › default › slow`) executes the approved plan, with each tier colored by its role and the resolved model name shown beneath the track. The chosen tier is applied before dispatch and carries through the fresh/compacted execution session; the slider is hidden when fewer than two role models resolve.
|
|
229
|
+
- `omp plugin install` now accepts GitHub/GitLab/Bitbucket shorthand (`github:user/repo`, `gitlab:user/repo`, …) and full git URLs (`https://github.com/user/repo`, `git@github.com:user/repo`, …) in addition to npm specs and marketplace refs.
|
|
199
230
|
|
|
200
231
|
### Changed
|
|
201
232
|
|
|
@@ -206,12 +237,6 @@
|
|
|
206
237
|
- Changed the system prompt to advertise `memory://root` only when the local memory backend is active.
|
|
207
238
|
- Changed `todo_write` result rendering to animate completed items in place: the checkbox flips checked first, then the strikethrough reveals across the task text.
|
|
208
239
|
|
|
209
|
-
### Removed
|
|
210
|
-
|
|
211
|
-
- Removed the standalone `ask`, `task`, and `yield` tools along with their obsolete prompts, docs, and tests; delegation now routes through persistent `delegate` agents plus IRC coordination.
|
|
212
|
-
- Removed the `/orchestrate` slash command; orchestration is now triggered by the `orchestrate` keyword (see Added) so the contract rides alongside the user's own prompt instead of replacing it.
|
|
213
|
-
- Removed the sticky Todos panel all-done drop/collapse animation; completed todo state now stays visible until the next explicit todo update changes it.
|
|
214
|
-
|
|
215
240
|
### Fixed
|
|
216
241
|
|
|
217
242
|
- Fixed Mnemopi session shutdown to flush queued memory extractions before exit so the last turn’s facts are not lost
|
|
@@ -226,10 +251,14 @@
|
|
|
226
251
|
- Fixed the bash (and `recipe`) tool result footer not rendering for failed commands. A non-zero exit threw a `ToolError`, which dropped the result details, so the styled `⟨Wall … | Timeout …⟩` footer was replaced by the raw `Wall time: … seconds` / `Command exited with code N` lines. Non-zero exits now resolve as a non-throwing error result that keeps `wallTimeMs`/`timeoutSeconds`/`exitCode`, and the footer shows `⟨Wall … | Timeout … | Exit: N⟩` with the textual notices folded out of the output pane. Aborts, timeouts, and missing-exit-status still throw as before.
|
|
227
252
|
- Fixed selector-style UI components to honor `tui.select.up` and `tui.select.down` keybindings instead of hard-coding raw Up/Down arrow bytes ([#1535](https://github.com/can1357/oh-my-pi/issues/1535)).
|
|
228
253
|
|
|
229
|
-
###
|
|
254
|
+
### Removed
|
|
255
|
+
|
|
256
|
+
- Removed the standalone `ask`, `task`, and `yield` tools along with their obsolete prompts, docs, and tests; delegation now routes through persistent `delegate` agents plus IRC coordination.
|
|
257
|
+
- Removed the `/orchestrate` slash command; orchestration is now triggered by the `orchestrate` keyword (see Added) so the contract rides alongside the user's own prompt instead of replacing it.
|
|
258
|
+
- Removed the sticky Todos panel all-done drop/collapse animation; completed todo state now stays visible until the next explicit todo update changes it.
|
|
230
259
|
|
|
231
|
-
- `omp plugin install` now accepts GitHub/GitLab/Bitbucket shorthand (`github:user/repo`, `gitlab:user/repo`, …) and full git URLs (`https://github.com/user/repo`, `git@github.com:user/repo`, …) in addition to npm specs and marketplace refs.
|
|
232
260
|
## [15.5.15] - 2026-05-30
|
|
261
|
+
|
|
233
262
|
### Changed
|
|
234
263
|
|
|
235
264
|
- Enabled the agent loop's tool-call batch cap for Anthropic Claude sessions, cutting oversized streamed tool-use bursts into runnable batches before continuing the conversation.
|
|
@@ -243,6 +272,7 @@
|
|
|
243
272
|
- Fixed Anthropic Claude tool-call batching to clear and reapply the Claude-specific batch cap whenever the session model changes
|
|
244
273
|
|
|
245
274
|
## [15.5.14] - 2026-05-29
|
|
275
|
+
|
|
246
276
|
### Added
|
|
247
277
|
|
|
248
278
|
- Added progress status output for `llm()` calls in `eval`, including the resolved model, tier, and returned character count
|
|
@@ -261,6 +291,7 @@
|
|
|
261
291
|
- Reverted the sticky `Todos` panel task glyphs to the pre-15.5.12 checkbox icons: completed tasks render `theme.checkbox.checked` (not `theme.status.success`) and in-progress tasks render `theme.checkbox.unchecked` (not the running glyph). Removed the animated spinner entirely — in-progress tasks and pending tasks with a matching in-flight subagent still highlight via the `accent` colour, but the panel now paints once per state change instead of on an 80 ms timer. Subagent auto-checkmarking, the advancing window (`selectStickyTodoWindow`), `todoMatchesAnyDescription` highlighting, and the all-done close animation are unchanged.
|
|
262
292
|
|
|
263
293
|
## [15.5.13] - 2026-05-29
|
|
294
|
+
|
|
264
295
|
### Breaking Changes
|
|
265
296
|
|
|
266
297
|
- Changed hashline edit syntax to verb-based v4: body-bearing ops are `replace N..M:`, `insert before N:`, `insert after N:`, `insert head:`, and `insert tail:`, while bodyless `delete N..M` handles deletion. Removed `>A..B` repeat rows and the old `prepend:` / `append:` virtual insert headers; `-` rows remain rejected with a teaching error.
|
|
@@ -314,9 +345,6 @@
|
|
|
314
345
|
### Fixed
|
|
315
346
|
|
|
316
347
|
- Fixed compaction surfacing raw HTTP 401/403 envelopes (e.g. `Compaction failed: 401 {"type":"error","error":{"type":"authentication_error",…}}`) instead of routing to an authenticated fallback model. The compaction layer now attaches the provider-reported HTTP status onto the thrown error, and `AgentSession`'s auth-failure detector branches on `error.status === 401 || 403` in addition to the existing `auth_unavailable` regex. When a fallback model role (e.g. `modelRoles.smol`) is configured, compaction retries it transparently; otherwise the user sees the actionable "Compaction requires usable credentials for …" hint instead of the raw provider envelope.
|
|
317
|
-
|
|
318
|
-
### Fixed
|
|
319
|
-
|
|
320
348
|
- Fixed compiled-binary legacy plugin loading for `@earendil-works/*` imports of bundled package roots such as `@earendil-works/pi-coding-agent`; compat now rewrites all bundled pi package roots to bunfs entrypoints and resolves fallback peer dependencies through the canonical `@oh-my-pi/*` specifier.
|
|
321
349
|
|
|
322
350
|
## [15.5.8] - 2026-05-28
|
|
@@ -372,7 +400,9 @@
|
|
|
372
400
|
- Secured `vault://` reads and writes by validating URL paths and blocking traversal, absolute paths, and symlink escapes outside the selected vault root
|
|
373
401
|
|
|
374
402
|
## [15.5.7] - 2026-05-27
|
|
403
|
+
|
|
375
404
|
### Added
|
|
405
|
+
|
|
376
406
|
- `providers.openrouterVariant` setting (Settings → Providers → "OpenRouter Routing") to default OpenRouter requests to a routing-variant suffix (`:nitro`, `:floor`, `:online`, `:exacto`). Selectors that already name a variant (e.g. `openrouter/anthropic/claude-haiku:nitro`) keep precedence.
|
|
377
407
|
|
|
378
408
|
- `generate_image` supports xAI Grok Imagine via `providers.image=xai`. Supports `grok-imagine-image` (default) and `grok-imagine-image-quality` at aspect ratios `1:1`, `16:9`, `9:16`, `4:3`, `3:4`, `3:2`, `2:3`. Uses the xAI Grok OAuth credential when available, otherwise `XAI_API_KEY`.
|
|
@@ -384,6 +414,7 @@
|
|
|
384
414
|
- Fixed `read` URL reader mode aborting after a stalled Jina request instead of falling back to trafilatura/lynx/native: Jina (and Parallel extract) now have their own per-attempt sub-budget capped at 10s, the catch handler honours only real user cancellation, and the in-process native renderer is always attempted on already-loaded HTML ([#1449](https://github.com/can1357/oh-my-pi/issues/1449))
|
|
385
415
|
|
|
386
416
|
## [15.5.6] - 2026-05-27
|
|
417
|
+
|
|
387
418
|
### Added
|
|
388
419
|
|
|
389
420
|
- Support for multi-range line selectors on URLs (e.g., `:5-10,20-30`) to fetch and display multiple non-contiguous sections
|
|
@@ -413,6 +444,7 @@
|
|
|
413
444
|
## [15.5.4] - 2026-05-27
|
|
414
445
|
|
|
415
446
|
### Breaking Changes
|
|
447
|
+
|
|
416
448
|
- Removed the package root `hashline` export so imports from the top-level entrypoint can no longer access `hashline` helpers directly
|
|
417
449
|
|
|
418
450
|
### Added
|
|
@@ -436,24 +468,13 @@
|
|
|
436
468
|
|
|
437
469
|
- Fixed a race in `withFileLock` where a contender losing the `mkdir` race could wipe the winner's freshly-created lock directory before the winner finished writing its info file. Every lock now carries a per-process UUID token; `releaseLock(path, expectedToken)` verifies ownership before `fs.rm`, and `isLockStale` no longer returns `true` for a dir whose info file is absent but whose mtime is still inside the staleness window (or whose dir vanished mid-check).
|
|
438
470
|
- Fixed `formatErrorMessage` not sanitising tabs or truncating oversized error strings before painting them through the theme. Errors that embedded raw file content (apply_patch failures, hashline mismatches, etc.) could break terminal alignment via raw `\t` chars or overflow the line width.
|
|
439
|
-
|
|
440
|
-
### Fixed
|
|
441
|
-
|
|
442
471
|
- Fixed multi-section hashline edits to reject duplicate canonical targets and preflight write guards before any section is committed
|
|
443
|
-
|
|
444
|
-
### Fixed
|
|
445
|
-
|
|
446
472
|
- Fixed `createAgentSession()` dropping the hidden `resolve` tool from the registry when no active tool sets `deferrable: true`, even though plan mode dispatches the plan-approval `resolve { action: "apply", ... }` call through a standing handler. Read-only plan-mode toolsets (e.g. `read`, `search`, `find`, `web_search`) silently activated plan mode without `resolve`, leaving the agent unable to submit the finalized plan and forcing the user to exit plan mode manually. `resolve` is now kept whenever `plan.enabled` is true, so the standing handler always has a callable tool ([#1428](https://github.com/can1357/oh-my-pi/issues/1428))
|
|
447
|
-
|
|
448
|
-
### Fixed
|
|
449
|
-
|
|
450
473
|
- Fixed `omp` startup and `/changelog` reading the host project's `CHANGELOG.md` as omp's — `getPackageDir()` no longer falls back to the user's `cwd` when no owning `package.json` is locatable, preventing spurious `lastChangelogVersion` writes ([#1423](https://github.com/can1357/oh-my-pi/issues/1423))
|
|
451
|
-
|
|
452
|
-
### Fixed
|
|
453
|
-
|
|
454
474
|
- Fixed hashline session-chain replay silently overwriting in-session edits when the model re-targeted a previously rewritten line with a stale file hash; replay now refuses unless every edit's anchor line content matches between the snapshot and the current file ([#1422](https://github.com/can1357/oh-my-pi/pull/1422))
|
|
455
475
|
|
|
456
476
|
## [15.5.3] - 2026-05-27
|
|
477
|
+
|
|
457
478
|
### Breaking Changes
|
|
458
479
|
|
|
459
480
|
- Disallowed inline payload on hashline `↑`, `↓`, and `:` operations (including BOF/EOF inserts), requiring payload text to be supplied on standalone `+` continuation rows
|
|
@@ -467,6 +488,7 @@
|
|
|
467
488
|
- Fixed runtime model registry refresh and cache loading so providers with authoritative dynamic catalogs, including Synthetic, do not re-add deprecated bundled model IDs after discovery ([#1417](https://github.com/can1357/oh-my-pi/issues/1417)).
|
|
468
489
|
|
|
469
490
|
## [15.5.2] - 2026-05-26
|
|
491
|
+
|
|
470
492
|
### Breaking Changes
|
|
471
493
|
|
|
472
494
|
- Changed the hashline patch format so payload continuation lines now require a leading `+`, rejecting unprefixed multiline payload rows that were previously accepted as fallback payload text
|
|
@@ -531,10 +553,12 @@
|
|
|
531
553
|
## [15.4.1] - 2026-05-26
|
|
532
554
|
|
|
533
555
|
### Breaking Changes
|
|
556
|
+
|
|
534
557
|
- The `vim` edit mode option is no longer available; configurations using `edit.mode: vim` will be automatically mapped to `hashline` mode
|
|
535
558
|
- Hashline payload semantics are now strictly inline-first: the first payload line is whatever follows the sigil on the op line itself, and subsequent lines append after it. A newline immediately after `↑`/`↓`/`:` is no longer a free separator — it produces a blank first payload line. Use `LINE↓content` for a one-line insert, `LINE↓firstline\nsecondline` for two lines; bare `LINE↓` / `LINE↑` / `LINE:` (no inline payload) still insert/replace with one blank line as before.
|
|
536
559
|
|
|
537
560
|
### Added
|
|
561
|
+
|
|
538
562
|
- Added `irc.timeoutMs` setting to configure IRC message timeout duration with a default of 120 seconds
|
|
539
563
|
- Added timeout enforcement for IRC send operations to prevent indefinite hangs when recipients are unresponsive
|
|
540
564
|
- Added evaluator state inheritance for `task`-spawned subagents so JavaScript and Python variables are visible between a parent agent and its child sessions
|
|
@@ -582,6 +606,7 @@
|
|
|
582
606
|
- Updated `MCPOAuthFlow.#resolveRegistrationEndpoint` to try origin-root well-known first, then fall back to path-prefixed well-known ([1407](https://github.com/can1357/oh-my-pi/pull/1407) by [@faizhasim](https://github.com/faizhasim))
|
|
583
607
|
|
|
584
608
|
### Removed
|
|
609
|
+
|
|
585
610
|
- Removed the `installH2Fetch()` activation from CLI startup; HTTPS fetches now use Bun's default transport
|
|
586
611
|
- Removed the `vim` edit mode along with the `VimTool` module, prompt, and supporting buffer/engine/renderer stack
|
|
587
612
|
- Removed per-line hash anchors (2-letter bigram hashes) from hashline format
|
|
@@ -601,6 +626,7 @@
|
|
|
601
626
|
- Fixed JavaScript `eval` imports to preserve module-level singletons across re-imports of unchanged local files and reload them only after edits
|
|
602
627
|
- Fixed concurrent Python evaluator tool calls to use per-run identifiers so tool responses and output are routed to the correct execution
|
|
603
628
|
- Fixed the `search` tool argument validation to accept a single string `paths` value as a one-path search.
|
|
629
|
+
|
|
604
630
|
## [15.4.0] - 2026-05-26
|
|
605
631
|
|
|
606
632
|
### Breaking Changes
|
|
@@ -624,10 +650,6 @@
|
|
|
624
650
|
- Extended `formatApprovalPrompt` with payload previews for `eval` (language + first cell's code), `task` (agent + first task's id + assignment), `ast_edit` (first op's pattern / replacement / paths), `browser` (action + tab + url + code), and `write` content (alongside path). Previously these all rendered as bare `Allow tool: <name>` lines, giving the user no signal about what they were authorizing.
|
|
625
651
|
- Decoupled the per-tool approval gate from extension-loading state: `ExtensionRunner` and the `ExtensionToolWrapper` per-tool gate are now constructed unconditionally in `createAgentSession`, regardless of whether any extensions are loaded. Previously the runner was created only when `extensionsResult.extensions.length > 0`, which silently disabled the entire approval system if no extensions (including `createAutoresearchExtension`) were loaded; a regression test in `approval-mode.test.ts` now locks the invariant.
|
|
626
652
|
|
|
627
|
-
### Fixed
|
|
628
|
-
|
|
629
|
-
- Fixed `isMcpToolName` over-matching any tool name containing `__` (an extension legally named `my__feature` or `pkg__util__do` was getting falsely labelled `Origin: MCP server tool` in the approval prompt). Restricted to the canonical `mcp__` prefix only.
|
|
630
|
-
|
|
631
653
|
### Changed
|
|
632
654
|
|
|
633
655
|
- Updated hashline operation syntax to support inline payload text on the same op line for insert and replace (`ANCHOR↑/↓/...→`) while still accepting payload lines that follow
|
|
@@ -639,6 +661,7 @@
|
|
|
639
661
|
|
|
640
662
|
### Fixed
|
|
641
663
|
|
|
664
|
+
- Fixed `isMcpToolName` over-matching any tool name containing `__` (an extension legally named `my__feature` or `pkg__util__do` was getting falsely labelled `Origin: MCP server tool` in the approval prompt). Restricted to the canonical `mcp__` prefix only.
|
|
642
665
|
- Fixed hashline inline payload parsing so same-line payloads containing whitespace, including tab-indented text, are preserved instead of being rejected
|
|
643
666
|
- Fixed Bun HTTP/2 transport errors (`HTTP2StreamReset`, `HTTP2RefusedStream`, and `HTTP2EnhanceYourCalm`) to be treated as transient so the assistant now retries automatically instead of stopping on these recoverable failures
|
|
644
667
|
- Fixed web search OAuth-backed providers (including Codex and Gemini) to use broker-managed token retrieval and account metadata, avoiding direct token-store refresh behavior that could cause search authentication failures
|
|
@@ -652,16 +675,10 @@
|
|
|
652
675
|
- Fixed `adapter: "debugpy"` over-promising in the `debug` tool. `resolveAdapter("debugpy", cwd)` only checks for `python` in `PATH`; it does not verify that the `debugpy` module is importable. Both failure modes — `python` missing and `debugpy` module missing — used to collapse onto a generic `"No suitable debug adapter found"` error. The launch/attach action now throws a targeted `ToolError` naming `python` when `resolveAdapter` returns null for an explicit `adapter: "debugpy"`, and the `DapSessionManager` spawn-catch detects `"No module named debugpy"` in adapter stderr and surfaces a `pip install debugpy` hint. The Python debug tool documentation lists the install hint so the prompt and runtime diagnostics agree.
|
|
653
676
|
- Fixed the LSP symbol-resolver `BARE_IDENTIFIER_RE` (`/^[A-Za-z_][\w]*$/`) rejecting `$`-prefixed identifiers (`$store`, `$count`, RxJS observables, Svelte stores, Angular signals). Without the word-boundary check, searching for `$store` on a line containing `bar$store` returned the offset inside the compound identifier rather than the standalone occurrence, feeding a wrong column to the LSP server. Pattern now `/^[$A-Za-z_][\w$]*$/`; the companion `IDENTIFIER_CHAR_RE` already contained `$`.
|
|
654
677
|
- Fixed `applyWorkspaceEdit` writing all text edits before walking `documentChanges` for resource operations. LSP §3.16.2 requires clients to apply `documentChanges` in declared order, so any server emitting `{kind: "create", uri: X}` followed by a `TextDocumentEdit` for `X` (e.g. "Extract to new file" code actions, some rename responses) broke: the edit ran against a non-existent file, then the create happened. `applyWorkspaceEdit` now walks `documentChanges` once in declared order; per-URI text edits are coalesced into a pending Map and flushed immediately before any subsequent resource op for the same URI. Legacy `changes`-map-only payloads are unchanged. Folder-level `rename`/`delete` ops now flush every pending URI under the affected subtree (not just the exact target) so child-file edits queued before a parent-folder move land at the original location instead of dangling against a non-existent path on the final flush. Rename ops additionally flush pending edits queued against `renameOp.newUri` (and its descendants) **before** `fs.rename` runs, so edits intended for the pre-rename target file are applied before the rename clobbers or replaces it (relevant under `options.overwrite`/`options.ignoreIfExists`). When a `WorkspaceEdit` payload supplies both `changes` and `documentChanges`, the `documentChanges` arm is now used exclusively per LSP §3.16.2 ("if documentChanges are supplied … servers should use them in preference to changes"); previously the two were merged.
|
|
655
|
-
|
|
656
|
-
### Fixed
|
|
657
|
-
|
|
658
678
|
- Fixed built-in `explore` agent failing every invocation with `schema_violation: files.0.ref: must not be present` on releases prior to 15.3.2 by renaming the `files[].ref` property to `files[].path` in the agent's output schema; `ref` is a JTD-reserved keyword (RFC 8927) and collides with JSON Type Definition's schema-reference form, so the converter previously dropped it from the generated JSON Schema. Defense-in-depth alongside the 15.3.2 converter fix ([#1379](https://github.com/can1357/oh-my-pi/issues/1379)).
|
|
659
679
|
- Increased the `yield` tool's schema-validation retry budget from 1 to 3 so subagents whose first structured-output attempt mismatches the declared output schema get up to three retries before the parent's post-mortem `schema_violation` check hard-fails the task. The tool now also surfaces remaining retry attempts and an explicit "call yield again with the corrected shape" directive in each rejection message, giving the model the context it needs to converge — particularly helpful for models like GLM that tend to invent per-element field names instead of following the declared schema.
|
|
660
680
|
- Fixed CLI PDF file arguments being decoded as raw bytes for local vision models; `.pdf` and other supported document files now go through the same Markit conversion path as the `read` tool before entering the prompt ([#1401](https://github.com/can1357/oh-my-pi/issues/1401)).
|
|
661
681
|
- Fixed the `bash` tool hanging until the 305 s hard timeout when a command writes a file via heredoc on Windows (bodies > ~4 KiB) or macOS (bodies > 16-64 KiB). Root cause was in the embedded brush shell; see `@oh-my-pi/pi-natives` changelog for the underlying fix.
|
|
662
|
-
|
|
663
|
-
### Fixed
|
|
664
|
-
|
|
665
682
|
- Fixed `/review` custom prompt orchestration text to use static prompt templates and consistently instruct reviewer task delegation.
|
|
666
683
|
- Fixed `/review` custom-instructions submission on terminals that cannot distinguish Ctrl+Enter by using prompt-style input where Enter submits and Shift+Enter inserts a newline.
|
|
667
684
|
- Fixed hook editor submissions sending large-paste placeholders such as `[paste #1 +27 lines]` instead of the pasted content.
|
|
@@ -674,6 +691,7 @@
|
|
|
674
691
|
- Added `tools.approvalMode` global setting (Interaction tab in `/settings`) with values `auto` | `prompt` | `custom`. Defaults to `auto` so the agent runs every tool call without interruption — matching the `--auto-approve` / `--yolo` CLI flag. `prompt` uses built-in per-tool defaults only (read/find/search auto-allow; bash/edit/write/eval/ssh require confirmation; `tools.approval.<tool>` config is ignored). `custom` makes the `tools.approval.<tool>` config the source of truth — your settings win over built-in defaults, which fall back only for tools you haven't configured. CLI `--auto-approve` always wins. Critical safety patterns (e.g. `rm -rf /`, `curl … | bash`, fork bombs) keep prompting even when the tool is user-allowed.
|
|
675
692
|
|
|
676
693
|
## [15.3.2] - 2026-05-25
|
|
694
|
+
|
|
677
695
|
### Added
|
|
678
696
|
|
|
679
697
|
- Added inline `|TEXT` payload support to `»` and `«` hashline insert operations, allowing single-line inserts on the op line and still supporting additional payload lines
|
|
@@ -701,8 +719,11 @@
|
|
|
701
719
|
- Fixed append-only context mode not being recomputed after model switches — the mode was frozen at session construction time using the initial model's provider, so `provider.appendOnlyContext=auto` left append-only enabled after switching away from DeepSeek (or disabled after switching to DeepSeek) for the rest of the session
|
|
702
720
|
|
|
703
721
|
### Fixed
|
|
722
|
+
|
|
704
723
|
- Fixed clipboard image paste (Ctrl+V) silently failing on WSL2 by routing image reads through a `powershell.exe` bridge when WSL interop is detected, since `arboard` returns `ContentNotAvailable` under WSLg ([#1280](https://github.com/can1357/oh-my-pi/issues/1280))
|
|
724
|
+
|
|
705
725
|
## [15.2.4] - 2026-05-22
|
|
726
|
+
|
|
706
727
|
### Breaking Changes
|
|
707
728
|
|
|
708
729
|
- Replaced the legacy `@@` header and `+`/`<`/`=`/`-` hashline syntax with the new `§PATH` header and `«`/`»`/`≔` operation format, so existing hashline scripts and prompts using old symbols must be updated
|
|
@@ -724,6 +745,7 @@
|
|
|
724
745
|
- Fixed hashline payload handling in parser and streaming preview to preserve blank lines as actual payload text until the next op, file header, or envelope marker
|
|
725
746
|
|
|
726
747
|
## [15.2.3] - 2026-05-22
|
|
748
|
+
|
|
727
749
|
### Breaking Changes
|
|
728
750
|
|
|
729
751
|
- Changed PR and task-isolation worktree directory layout to hash-based `~/.omp/wt/<identifier>-<path-hash>` style paths, replacing the previous nested encoded-repo layout
|
|
@@ -761,9 +783,6 @@
|
|
|
761
783
|
### Fixed
|
|
762
784
|
|
|
763
785
|
- Fixed compaction routing to the wrong provider when `modelRoles.default` is set to a different model than the active chat. Auto- and manual compaction now prefer the active session's model and only fall back to role-based candidates when the current model has no usable credentials. Previously, an Anthropic chat with `modelRoles.default = openai/gpt-5` would compact through OpenAI (including the remote-compaction endpoint), even though the live conversation never used OpenAI.
|
|
764
|
-
|
|
765
|
-
### Fixed
|
|
766
|
-
|
|
767
786
|
- Fixed context overflow not being detected when the session's model (e.g. `hf:zai-org/GLM-5.1` via `synthetic` provider) returns a 400 with the upstream "400 status code (no body)" message wrapped inside a JSON envelope. The `isContextOverflow` check now matches the no-body status phrase anywhere in the error string rather than requiring it at the very start, so auto-compaction fires correctly instead of leaving the session silently stuck ([#1251](https://github.com/can1357/oh-my-pi/issues/1251)).
|
|
768
787
|
- Fixed `formatCapturedHttpError` not extracting the error text from `{"error":"string"}` response bodies (only object-valued `error` fields were previously handled), resulting in raw JSON in error messages instead of the human-readable string.
|
|
769
788
|
|
|
@@ -776,60 +795,32 @@
|
|
|
776
795
|
### Fixed
|
|
777
796
|
|
|
778
797
|
- Fixed false-positive hashline `~ TEXT` separator-padding warning firing on YAML, JSON, Python, Markdown, TOML, and other indent-sensitive file edits. The padding check is now skipped entirely for indentation-sensitive extensions (`.py`, `.yml`/`.yaml`, `.md`/`.mdx`, `.json`/`.jsonc`/`.json5`, `.toml`, `.rst`, `.tf`, `.nix`, `.coffee`, `.haml`/`.slim`/`.pug`, `.sass`/`.styl`, `.nim`, `.cr`, `.elm`, `.fs`, …), and tightened on every other extension to flag only the `~ beta` typo shape (exactly one leading space before non-space content) rather than any leading-space payload.
|
|
779
|
-
|
|
780
|
-
### Fixed
|
|
781
|
-
|
|
782
798
|
- Fixed goal state machine: `get` now returns paused goals (was returning null for `enabled=false`), `complete` now works on paused goals after interrupts, `create` is allowed after a previous goal reaches `complete` status, and the goal tool is re-added to the active tool set on session reload when a paused goal is persisted. Added `resume` and `drop` ops to the goal tool so the agent can re-engage or discard a paused goal without requiring user slash commands. ([#1249](https://github.com/can1357/oh-my-pi/issues/1249))
|
|
783
799
|
|
|
784
800
|
## [15.1.9] - 2026-05-21
|
|
785
801
|
|
|
786
|
-
###
|
|
802
|
+
### Added
|
|
787
803
|
|
|
788
|
-
-
|
|
804
|
+
- Added OSC 8 terminal hyperlink support for file paths in tool output. When the terminal supports hyperlinks (kitty, Ghostty, WezTerm, iTerm2, Alacritty, VS Code) and the new `tui.hyperlinks` setting is `auto` (default) or `always`, OMP wraps file paths emitted by `read`, `find`, `search`, `edit`, `ast_grep`, and `ast_edit` renderers in `file:///abs/path` hyperlinks. `local://` and other fs-backed internal URLs resolve to their backing path. Set `tui.hyperlinks: off` to disable. ([#1244](https://github.com/can1357/oh-my-pi/issues/1244))
|
|
789
805
|
|
|
790
806
|
### Fixed
|
|
791
807
|
|
|
808
|
+
- Fixed `disabledProviders` still probing local discovery endpoints for Ollama, llama.cpp, and LM Studio during background model refresh. Disabled providers are now excluded before implicit and built-in discovery managers are created. ([#1232](https://github.com/can1357/oh-my-pi/issues/1232))
|
|
792
809
|
- Fixed `omp acp` auto-discovering host `.mcp.json` servers in parallel with the ACP client's `session/new.mcpServers`, which shadowed client-supplied MCP tools in `search_tool_bm25` and the session tool registry. The ACP session factory now forces `enableMCP: false`, so MCP ownership stays with `AcpAgent#configureMcpServers`. Non-ACP modes keep on-disk discovery. ([#1234](https://github.com/can1357/oh-my-pi/issues/1234))
|
|
793
|
-
|
|
794
|
-
### Fixed
|
|
795
|
-
|
|
796
810
|
- Fixed binary `omp update` rollbacks so a downloaded replacement that fails post-install version verification no longer remains installed over the previous working binary. ([#1240](https://github.com/can1357/oh-my-pi/issues/1240))
|
|
797
|
-
|
|
798
|
-
### Fixed
|
|
799
|
-
|
|
800
811
|
- Fixed `/force <tool>` rejecting Ollama/local models before the requested tool could run; Ollama now receives a named forced choice that the provider transport narrows to the selected tool. ([#1236](https://github.com/can1357/oh-my-pi/issues/1236))
|
|
801
|
-
|
|
802
|
-
### Fixed
|
|
803
|
-
|
|
804
812
|
- Fixed `web_search` freezing the session when an upstream provider stalled. Bun's WinHTTP backend on Windows can silently drop `AbortSignal` once a TCP/TLS connection hangs (oven-sh/bun#15275, oven-sh/bun#18536), so Esc never reached the in-flight fetch and the only recovery was Ctrl+C + `omp --resume`. Every web-search provider's outbound `fetch` (anthropic, brave, codex, exa, gemini, jina, kagi, kimi, parallel, perplexity, searxng, synthetic, tavily, z.ai) now composes the caller signal with a 60s hard timeout via a shared `withHardTimeout` helper, guaranteeing the request settles within a minute even when Bun's abort fails to propagate. Independently, `executeSearch`'s provider-fallback loop was masking real cancellations as ordinary provider errors and returning "All web search providers failed"; it now re-throws as `ToolAbortError` the moment the caller's signal aborts, so the session sees a clean cancel on every platform. ([#1221](https://github.com/can1357/oh-my-pi/issues/1221))
|
|
805
813
|
|
|
806
|
-
### Added
|
|
807
|
-
|
|
808
|
-
- Added OSC 8 terminal hyperlink support for file paths in tool output. When the terminal supports hyperlinks (kitty, Ghostty, WezTerm, iTerm2, Alacritty, VS Code) and the new `tui.hyperlinks` setting is `auto` (default) or `always`, OMP wraps file paths emitted by `read`, `find`, `search`, `edit`, `ast_grep`, and `ast_edit` renderers in `file:///abs/path` hyperlinks. `local://` and other fs-backed internal URLs resolve to their backing path. Set `tui.hyperlinks: off` to disable. ([#1244](https://github.com/can1357/oh-my-pi/issues/1244))
|
|
809
|
-
|
|
810
814
|
## [15.1.8] - 2026-05-20
|
|
811
815
|
|
|
812
816
|
### Fixed
|
|
813
817
|
|
|
814
818
|
- Fixed streaming edit previews for `apply_patch` and `hashline` jittering as the model typed `+added` lines. Two root causes addressed: (1) the trailing partial line of the streaming text input is now trimmed at each tick so a half-typed `+added` line no longer flickers; (2) the preview is rendered in the model's input order during streaming instead of re-deriving a unified diff via `Diff.structuredPatch`, whose coalescing previously reshuffled existing `+added` lines downward each time a new `-removed` line arrived. Existing additions now stay put and the preview only grows at the bottom while streaming. A residual trailing `-removed`/hunk-header block whose matching `+added` companion has not yet arrived is also suppressed until the additions land.
|
|
815
819
|
- Fixed Perplexity web search appearing "logged out" roughly an hour after `omp auth login perplexity`. The search provider's `findOAuthToken` was honoring the bogus `expires = login_time + 1h` written by older logins (Perplexity JWTs typically omit `exp` because sessions are server-side) and silently dropping the credential. The loader now decodes the JWT's `exp` claim directly and only skips when the JWT itself is expired; tokens without an `exp` claim are treated as non-expiring.
|
|
816
|
-
|
|
817
|
-
### Fixed
|
|
818
|
-
|
|
819
820
|
- Fixed `legacy-pi-compat` failing to load plugin extensions (e.g. `pi-schedule-prompt@0.3.0`) that import `@mariozechner/pi-ai` when running from a compiled binary. `getResolvedSpecifier` called `Bun.resolveSync` against `import.meta.dir` inside `/$bunfs/root`, where the virtual FS exposes no resolvable `node_modules` tree at runtime; the throw silently dropped the plugin. The fix lets `rewriteLegacyPiImports` fall back gracefully on resolution failure so that `rewriteBareImportsForLegacyExtension` — which already runs immediately after — can resolve the original specifier against the plugin's own installed peer deps instead. The same fallback is applied to `resolveLegacyPiSpecifier` (the Bun plugin shim's `onResolve` handler) for tool/hook files loaded directly via Bun's import system. ([#1215](https://github.com/can1357/oh-my-pi/issues/1215))
|
|
820
821
|
|
|
821
822
|
## [15.1.7] - 2026-05-19
|
|
822
823
|
|
|
823
|
-
### Fixed
|
|
824
|
-
|
|
825
|
-
- Fixed `debug` launch/attach failures so `configurationDone` no longer masks the underlying DAP launch error, early stop-outcome watchers cannot emit unhandled rejections, and directory-valued launch programs are rejected before adapter selection. ([#1187](https://github.com/can1357/oh-my-pi/issues/1187))
|
|
826
|
-
- Fixed hashline edit payloads that use a readability space after `~` by warning on separator-padding-shaped payload blocks and tightening the model prompt. ([#1166](https://github.com/can1357/oh-my-pi/issues/1166))
|
|
827
|
-
- Fixed ACP bash permission requests to include execute tool metadata and command content so clients can render command approval prompts consistently. ([#1189](https://github.com/can1357/oh-my-pi/issues/1189))
|
|
828
|
-
- Fixed the status-line fast-mode indicator (`⚡`) rendering for scoped service tiers (`openai-only`, `claude-only`) even when the active model's provider didn't realize them — e.g. `serviceTier: "openai-only"` would still show the indicator next to a Claude model the wire request couldn't apply fast mode to. The indicator now consults a new `AgentSession.isFastModeActive()` predicate that runs the configured tier through `resolveServiceTier(tier, model.provider)` and only lights up when the result is `"priority"` for the current model. `isFastModeEnabled()` keeps its scope-aware semantics so `/fast on|off|toggle` and `/fast status` continue to reflect the user's configured intent.
|
|
829
|
-
### Fixed
|
|
830
|
-
|
|
831
|
-
- Fixed status-line context% computation freezing the UI for ~1.1 s every 2 s on long sessions (2,000+ messages). The earlier alignment fix (which uses `computeContextBreakdown` to match the `/context` slash command) was running on every agent event via `updateEditorTopBorder()` (event-controller.ts:163), and `computeContextBreakdown` walks every message through the native `countTokens` tokenizer (~0.5 ms each) — for the user's 2,312-message session this was ~1,120 ms synchronous blocking per cache miss, producing the user-visible "jittery rendering" and "status bar disappearing during streaming". `StatusLineComponent.getCachedContextBreakdown()` now uses an incremental per-message token cache: messages are walked ONCE during warm-up, and subsequent refreshes only compute tokens for the NEW messages appended since last call (typically 0–1 per refresh during streaming). The LAST message is always recomputed because its content may still be growing mid-stream; all prior messages are immutable once a newer message exists. Compaction (messages array shrinks) resets the cache. Non-message tokens (system prompt + tools + skills) are cached separately and invalidated via a cheap identity fingerprint. Result: 2,300-message warm refresh drops from ~1,120 ms to ~0.04 ms — 28,000× faster. Functional parity with the prior `computeContextBreakdown` path is preserved.
|
|
832
|
-
|
|
833
824
|
### Added
|
|
834
825
|
|
|
835
826
|
- Added scoped service tier values to the `serviceTier` setting: `priority (OpenAI only)` and `priority (Claude only)`. They let you opt into premium processing on one provider family without paying premium costs on the other when switching models mid-session. `/fast on` continues to set the unscoped `"priority"` (active everywhere supported); `/fast status` and `isFastModeEnabled()` now report `on` for any scoped value too.
|
|
@@ -838,6 +829,14 @@
|
|
|
838
829
|
|
|
839
830
|
- Changed `/fast` to be a single provider-agnostic toggle: enabling the command sets `serviceTier: "priority"` for every provider, and the anthropic-messages provider translates `priority` into `speed: "fast"` plus the `fast-mode-2026-02-01` beta. Anthropic fast mode is currently supported on Claude Opus 4.6 and 4.7; the server rejects other models, which triggers the provider's auto-fallback (request retried without the priority signal, `providerSessionState.fastModeDisabled` persisted for the rest of the session). The session listens for the `"priority"` marker in `AssistantMessage.disabledFeatures`, syncs `/fast` off, and emits a warning notice. Re-running `/fast on` clears the per-session disable so the next request actually re-tries priority.
|
|
840
831
|
|
|
832
|
+
### Fixed
|
|
833
|
+
|
|
834
|
+
- Fixed `debug` launch/attach failures so `configurationDone` no longer masks the underlying DAP launch error, early stop-outcome watchers cannot emit unhandled rejections, and directory-valued launch programs are rejected before adapter selection. ([#1187](https://github.com/can1357/oh-my-pi/issues/1187))
|
|
835
|
+
- Fixed hashline edit payloads that use a readability space after `~` by warning on separator-padding-shaped payload blocks and tightening the model prompt. ([#1166](https://github.com/can1357/oh-my-pi/issues/1166))
|
|
836
|
+
- Fixed ACP bash permission requests to include execute tool metadata and command content so clients can render command approval prompts consistently. ([#1189](https://github.com/can1357/oh-my-pi/issues/1189))
|
|
837
|
+
- Fixed the status-line fast-mode indicator (`⚡`) rendering for scoped service tiers (`openai-only`, `claude-only`) even when the active model's provider didn't realize them — e.g. `serviceTier: "openai-only"` would still show the indicator next to a Claude model the wire request couldn't apply fast mode to. The indicator now consults a new `AgentSession.isFastModeActive()` predicate that runs the configured tier through `resolveServiceTier(tier, model.provider)` and only lights up when the result is `"priority"` for the current model. `isFastModeEnabled()` keeps its scope-aware semantics so `/fast on|off|toggle` and `/fast status` continue to reflect the user's configured intent.
|
|
838
|
+
- Fixed status-line context% computation freezing the UI for ~1.1 s every 2 s on long sessions (2,000+ messages). The earlier alignment fix (which uses `computeContextBreakdown` to match the `/context` slash command) was running on every agent event via `updateEditorTopBorder()` (event-controller.ts:163), and `computeContextBreakdown` walks every message through the native `countTokens` tokenizer (~0.5 ms each) — for the user's 2,312-message session this was ~1,120 ms synchronous blocking per cache miss, producing the user-visible "jittery rendering" and "status bar disappearing during streaming". `StatusLineComponent.getCachedContextBreakdown()` now uses an incremental per-message token cache: messages are walked ONCE during warm-up, and subsequent refreshes only compute tokens for the NEW messages appended since last call (typically 0–1 per refresh during streaming). The LAST message is always recomputed because its content may still be growing mid-stream; all prior messages are immutable once a newer message exists. Compaction (messages array shrinks) resets the cache. Non-message tokens (system prompt + tools + skills) are cached separately and invalidated via a cheap identity fingerprint. Result: 2,300-message warm refresh drops from ~1,120 ms to ~0.04 ms — 28,000× faster. Functional parity with the prior `computeContextBreakdown` path is preserved.
|
|
839
|
+
|
|
841
840
|
## [15.1.6] - 2026-05-19
|
|
842
841
|
|
|
843
842
|
### Fixed
|
|
@@ -866,6 +865,7 @@
|
|
|
866
865
|
- Fixed the TUI model selector to keep provider tab labels separate from provider ids, so the human-readable Ollama Cloud tab refreshes and filters `ollama-cloud` models correctly. ([#1153](https://github.com/can1357/oh-my-pi/issues/1153))
|
|
867
866
|
|
|
868
867
|
## [15.1.3] - 2026-05-17
|
|
868
|
+
|
|
869
869
|
### Breaking Changes
|
|
870
870
|
|
|
871
871
|
- Renamed the embedded-documentation internal URL scheme from `pi://` to `omp://`. `OmpProtocolHandler` replaces `PiProtocolHandler`; update any external references accordingly.
|
|
@@ -906,12 +906,10 @@
|
|
|
906
906
|
- Fixed gateway usage reporting to include cached-token totals for OpenAI Chat/Responses and to serve the last good cached report during transient upstream usage fetch failures.
|
|
907
907
|
- Fixed auth-gateway request cancellation for requests that are already aborted before dispatch.
|
|
908
908
|
- Fixed `/login` and `/logout` provider selector overflowing tall provider lists off-screen on small terminals. The selector now scrolls a 10-item window centered on the highlighted entry, shows a `(n/total)` indicator when windowed, and accepts PageUp/PageDown for faster navigation.
|
|
909
|
-
|
|
910
|
-
### Fixed
|
|
911
|
-
|
|
912
909
|
- Fixed `.env` loading so malformed variable names and NUL-containing values are ignored before they can poison `Bun.env` and break bash/external process execution with `nul byte found in provided data`.
|
|
913
910
|
|
|
914
911
|
## [15.1.2] - 2026-05-15
|
|
912
|
+
|
|
915
913
|
### Fixed
|
|
916
914
|
|
|
917
915
|
- Fixed SSH host additions/removals made inside a running session not refreshing the live `ssh` tool. `/ssh add` and `/ssh remove` now update the model-visible host list immediately, while `/reload-plugins` and `/move` refresh SSH discovery for external or project-scope config changes without restart.
|
|
@@ -924,6 +922,7 @@
|
|
|
924
922
|
- Updated MCP and theme schema metadata to reference JSON Schema draft-2020-12
|
|
925
923
|
|
|
926
924
|
## [15.1.0] - 2026-05-15
|
|
925
|
+
|
|
927
926
|
### Breaking Changes
|
|
928
927
|
|
|
929
928
|
- Changed the extension and hook runtime API by moving schema typing from direct TypeBox imports to `TSchema` from `@oh-my-pi/pi-ai`, requiring callers who use TypeScript imports of `Type` to migrate via provided injected modules
|
|
@@ -991,7 +990,6 @@
|
|
|
991
990
|
### Changed
|
|
992
991
|
|
|
993
992
|
- Changed the `github` tool's search ops (`search_issues`, `search_prs`, `search_code`, `search_commits`) to default the `repo` scope to the current checkout's `owner/repo` when `repo` is omitted. The auto-scope is skipped when the query already carries an explicit `repo:`/`org:`/`user:`/`owner:` qualifier or when `gh repo view` cannot resolve a github remote (in which case the search proceeds across all of GitHub as before). `search_repos` is unchanged — repository-scoping there must live in the query.
|
|
994
|
-
|
|
995
993
|
- Changed bash command preprocessing to strip trailing `| head` and `| tail` pipelines (including `|&`) from each top-level segment in command chains separated by `;`, `&&`, `||`, or `&`
|
|
996
994
|
- Changed bash fixup notices to state that stderr is already merged into stdout and to reflect that fixes were applied for multiple stripped segments when several transforms fire
|
|
997
995
|
- Changed shell-minimizer per-line truncation marker from a bare `…` to `…[+N]`, where `N` is the count of dropped Unicode scalars. The bracketed tally disambiguates minimizer-driven cuts from genuine `…` characters in the source (paths, JSON, stack traces, etc.) and gives the agent an exact count so it can decide whether the missing tail is recoverable inline or warrants reading the `[raw output: artifact://<id>]` footer the bash wrapper already emits when the minimizer rewrites output. Affects pipeline Stage 5 (`truncate_lines_at` in `defs/*.toml`) and the internal callers in `filters/git.rs`, `filters/listing.rs`, and `filters/lint.rs`. ([#1046](https://github.com/can1357/oh-my-pi/issues/1046))
|
|
@@ -1010,13 +1008,10 @@
|
|
|
1010
1008
|
- Rewrote the hashline edit prompt examples to use an ASCII-only `TITLE = "Mr"` → `"Mrs"` / `"Dr"` motif instead of the previous `" • "` and `"·"` separators. Some agents had been copying the middle-dot literal characters into real edits as if they were format scaffolding (e.g. emitting payload lines like `~ ·`), since the demo inserts were near-twins of the existing string. The new example keeps every original op shape (single-line replace, multiline replace, insert AFTER/BEFORE, append, delete, blank, plus both anti-patterns) but uses content that is obviously domain-specific and clearly distinct from any payload separator. Pure prompt change; no parser, schema, or runtime behavior is affected.
|
|
1011
1009
|
- Fixed startup fallback-chain validation to recognize cached runtime-discovered standard provider models, including Ollama Cloud models listed by `--list-models`, so `retry.fallbackChains` no longer warns that valid `ollama-cloud/<model>` selectors are unknown. ([#1052](https://github.com/can1357/oh-my-pi/issues/1052))
|
|
1012
1010
|
- Fixed `discoverAgents()` ignoring `disabledProviders` for the `claude-plugins` provider. Plugin roots from `~/.claude/plugins/` were scanned unconditionally, so agents from Claude Code marketplace plugins continued to appear in `/agents` and the Agent Control Center even when `disabledProviders: [claude-plugins]` was set. The discovery path now checks `isProviderEnabled("claude-plugins")` before calling `listClaudePluginRoots()`, matching how every other capability respects the disabled-providers set. ([#1075](https://github.com/can1357/oh-my-pi/issues/1075))
|
|
1013
|
-
|
|
1014
|
-
### Fixed
|
|
1015
|
-
|
|
1016
1011
|
- Fixed `$env:VAR` PowerShell variables being mangled on Windows when commands invoked PowerShell as a subprocess (e.g. `powershell -Command "Write-Host $env:SystemRoot"`). Brush-core applied POSIX parameter expansion to `$env` before spawning the child, leaving a dangling `:NAME`. The fix lives in `pi-shell` at env-var application time: every brush session now defines `env=$env` as an internal shell variable so `$env:NAME` expands to the literal `$env:NAME` token that PowerShell expects. The fallback is not exported, only influences brush's own expansion, and is shadowed by any user assignment to `env` (e.g. `env=prod; echo "$env:8080"` still prints `prod:8080`), so the POSIX bash contract is preserved. ([#1079](https://github.com/can1357/oh-my-pi/issues/1079))
|
|
1017
1012
|
|
|
1018
|
-
|
|
1019
1013
|
## [15.0.1] - 2026-05-14
|
|
1014
|
+
|
|
1020
1015
|
### Breaking Changes
|
|
1021
1016
|
|
|
1022
1017
|
- Removed the dedicated `exit_plan_mode` tool and its prompt, requiring plan-mode completion to use the existing `resolve` tool path instead
|
|
@@ -1059,6 +1054,7 @@
|
|
|
1059
1054
|
- Fixed MCP OAuth refresh failing with `HTTP 401 invalid_client` for servers that require Dynamic Client Registration (RFC 7591) and have no `oauth.clientId` configured (e.g. `mcp.linear.app`). `MCPOAuthFlow` registered a fresh public PKCE client on each authorize and discarded the issued `client_id` once the flow object went out of scope; refresh then called the provider's `/token` endpoint without a `client_id`. The flow now exposes `resolvedClientId` / `registeredClientSecret` getters, `MCPCommandController#handleOAuthFlow` returns them alongside `credentialId`, and both the initial-connect and `/mcp reauth` paths persist them into `auth.{clientId,clientSecret}` (used at refresh) and `oauth.{clientId,clientSecret}` (used by subsequent `/mcp reauth` to skip re-registration). The `MCPAddWizard` `onOAuth` callback type is now `Promise<MCPAddWizardOAuthResult>` and `#launchOAuthFlow` folds the registered credentials into wizard state. Servers with a statically-configured `oauth.clientId` (Notion, Slack, Datadog) are unaffected — `#tryRegisterClient` short-circuits and the write-back is a no-op. ([#1061](https://github.com/can1357/oh-my-pi/pull/1061) by [@ldx](https://github.com/ldx)).
|
|
1060
1055
|
|
|
1061
1056
|
## [15.0.0] - 2026-05-13
|
|
1057
|
+
|
|
1062
1058
|
### Breaking Changes
|
|
1063
1059
|
|
|
1064
1060
|
- Removed `op: issue_view` and `op: pr_view` from the `github` tool. Read single issues/PRs via the `read` tool against `issue://<N>` / `pr://<N>` (or the long form `issue://<owner>/<repo>/<N>` / `pr://<owner>/<repo>/<N>`); append `?comments=0` to drop the comments section. The `issue` and `comments` parameters were removed from the tool schema since no remaining op consumes them. Mutating ops (`pr_create`, `pr_checkout`, `pr_push`), `repo_view`, `search_*`, and `run_watch` are unchanged.
|
|
@@ -1092,6 +1088,7 @@
|
|
|
1092
1088
|
- Aligned prompt instruction language by defining `NEVER` and `AVOID` as strict aliases for `MUST NOT` and `SHOULD NOT` in the system prompt, and standardized agent, tool, and system prompt templates to use those terms consistently
|
|
1093
1089
|
- Changed `--mode acp` to apply the same stdout-quiet overrides as `--mode rpc` so no banner or status text leaks into the JSON-RPC channel
|
|
1094
1090
|
- Changed ACP startup to no longer require a configured model so registry validators and clients can complete `initialize` and `authenticate` before any model is selected
|
|
1091
|
+
|
|
1095
1092
|
### Fixed
|
|
1096
1093
|
|
|
1097
1094
|
- Deferred flushing of buffered `credential_disabled` events during extension runner initialization to a microtask so handler failures are now routed through `onError()` registrations made immediately after `initialize()`, preserving extension error reporting
|
|
@@ -1229,6 +1226,7 @@
|
|
|
1229
1226
|
- Fixed top-level `const`, `let`, and `class` declarations in evaluated JavaScript to persist across subsequent runs by rewriting top-level declarations
|
|
1230
1227
|
|
|
1231
1228
|
## [14.9.5] - 2026-05-12
|
|
1229
|
+
|
|
1232
1230
|
### Breaking Changes
|
|
1233
1231
|
|
|
1234
1232
|
- Removed the `jobs://` internal URL protocol; inspect background jobs via the `job` tool's `list: true` operation instead
|
|
@@ -1253,9 +1251,6 @@
|
|
|
1253
1251
|
- Changed `memory://` URL resolution to walk all active sessions’ memory roots and return the first matching file, so worktree-based subagents can access their own memory views as well as shared roots
|
|
1254
1252
|
- Changed internal URL routing to use a shared process-global `InternalUrlRouter` and protocol handlers, so built-in tools resolve `agent://`, `artifact://`, `memory://`, `skill://`, `rule://`, `mcp://`, and `local://` URLs without requiring session-specific router wiring
|
|
1255
1253
|
- Changed `mcp://` handler to use the globally registered MCP manager so MCP resource links work for agents sharing session context
|
|
1256
|
-
|
|
1257
|
-
### Changed
|
|
1258
|
-
|
|
1259
1254
|
- Changed the `ask.timeout` default from `30` (seconds) to `0` (wait indefinitely). Auto-selecting the recommended option after a fixed delay was surprising users mid-deliberation; the timer is now strictly opt-in. The legacy auto-select behavior is preserved when `ask.timeout` is set to a non-zero value, and the `ask` tool's prompt has been updated so the model expects unlimited reply time by default.
|
|
1260
1255
|
|
|
1261
1256
|
### Fixed
|
|
@@ -1273,6 +1268,7 @@
|
|
|
1273
1268
|
- Fixed `Timed out initializing browser tab worker` on prebuilt binaries by rewriting `spawnTabWorker` to import the worker entry with `with { type: "file" }` so Bun's `--compile` bundler statically discovers and embeds `tab-worker-entry.ts` in the single-file binary ([#1011](https://github.com/can1357/oh-my-pi/issues/1011))
|
|
1274
1269
|
|
|
1275
1270
|
## [14.9.3] - 2026-05-10
|
|
1271
|
+
|
|
1276
1272
|
### Breaking Changes
|
|
1277
1273
|
|
|
1278
1274
|
- Changed the `eval` tool input format to canonical `*** Begin <LANG>` ... `*** End <LANG>` cells with `*** Title`, `*** Timeout`, and `*** Reset` directives, so legacy `===== ... =====` eval inputs are no longer accepted for execution
|
|
@@ -1318,6 +1314,7 @@
|
|
|
1318
1314
|
- Fixed IRC background exchange poll loop leaking after session disposal: `#scheduleBackgroundExchangeFlush` now stops immediately when `dispose()` is called, preventing stale `setTimeout` callbacks from firing against a torn-down agent
|
|
1319
1315
|
|
|
1320
1316
|
## [14.9.2] - 2026-05-10
|
|
1317
|
+
|
|
1321
1318
|
### Added
|
|
1322
1319
|
|
|
1323
1320
|
- Added `agentsMdFiles` to `WorkspaceTree` so AGENTS.md discovery results are returned with the workspace scan output
|
|
@@ -1333,13 +1330,18 @@
|
|
|
1333
1330
|
- Fixed MCP HTTP streamable transport spamming `HTTP SSE stream error: ReadableStream already has a controller` after every JSON-RPC request whose response was returned as `text/event-stream`. The transport used to break out of the SSE iterator once the matching response was captured and then re-open `response.body` for a background drain, but the body had already been piped through a `TransformStream` and could not be re-read. The drain now runs from a single iterator that resolves the response promise inline and continues to dispatch piggybacked notifications on the same stream.
|
|
1334
1331
|
|
|
1335
1332
|
## [14.9.0] - 2026-05-10
|
|
1333
|
+
|
|
1336
1334
|
### Breaking Changes
|
|
1337
1335
|
|
|
1338
1336
|
- Moved hashline APIs to the dedicated `@oh-my-pi/pi-coding-agent/hashline` module, moved hash helpers to `@oh-my-pi/pi-coding-agent/hashline/hash`, and removed the legacy `edit/modes/hashline` and `edit/line-hash` source subpaths.
|
|
1339
1337
|
|
|
1340
|
-
###
|
|
1338
|
+
### Added
|
|
1341
1339
|
|
|
1342
|
-
-
|
|
1340
|
+
- Added a debug-panel raw SSE stream viewer so stuck model/tool-call streams can be inspected live from the TUI.
|
|
1341
|
+
- Added `get_login_providers` RPC command to list registered OAuth providers with their current authentication status (`id`, `name`, `available`, `authenticated`)
|
|
1342
|
+
- Added `login` RPC command to trigger OAuth login for a given provider; emits an `open_url` extension UI event (fire-and-forget) carrying the auth URL and optional instructions so headless clients can open the browser, then resolves when the callback-server flow completes
|
|
1343
|
+
- Added `open_url` variant to `RpcExtensionUIRequest` for the above
|
|
1344
|
+
- Added `getLoginProviders()` and `login(providerId)` methods to `RpcClient`
|
|
1343
1345
|
|
|
1344
1346
|
### Fixed
|
|
1345
1347
|
|
|
@@ -1354,23 +1356,14 @@
|
|
|
1354
1356
|
- Fixed `metadata.user_id` lacking the authenticated `account_uuid` on Anthropic OAuth requests; sessions now install a dynamic resolver via `Agent#setMetadataResolver` that builds `{ session_id, account_uuid? }` per request, looking the live OAuth account UUID up from `AuthStorage` so it stays in sync with token refreshes and login/logout transitions instead of stranding a stale value
|
|
1355
1357
|
- Fixed multi-file legacy Pi extensions failing to load when sibling `.ts` files import each other via relative paths ([#983](https://github.com/can1357/oh-my-pi/issues/983)).
|
|
1356
1358
|
- Fixed sub-agent dispatch silently routing to a model whose provider has no working credentials (e.g. an unqualified `modelRoles.task` id like `qwen3.6-plus-free` resolving to a provider the user is not authenticated against). Task dispatch now falls back to the parent session's active model — which by definition has working auth — when the resolved subagent model has none ([#985](https://github.com/can1357/oh-my-pi/issues/985)).
|
|
1357
|
-
|
|
1358
|
-
### Added
|
|
1359
|
-
|
|
1360
|
-
- Added a debug-panel raw SSE stream viewer so stuck model/tool-call streams can be inspected live from the TUI.
|
|
1361
|
-
|
|
1362
|
-
### Fixed
|
|
1363
|
-
|
|
1364
1359
|
- Fixed legacy Pi plugin extensions failing to load on Windows when their entry path contains a drive letter ([#990](https://github.com/can1357/oh-my-pi/pull/990) by [@jiwangyihao](https://github.com/jiwangyihao)).
|
|
1365
1360
|
|
|
1366
|
-
###
|
|
1361
|
+
### Removed
|
|
1367
1362
|
|
|
1368
|
-
-
|
|
1369
|
-
- Added `login` RPC command to trigger OAuth login for a given provider; emits an `open_url` extension UI event (fire-and-forget) carrying the auth URL and optional instructions so headless clients can open the browser, then resolves when the callback-server flow completes
|
|
1370
|
-
- Added `open_url` variant to `RpcExtensionUIRequest` for the above
|
|
1371
|
-
- Added `getLoginProviders()` and `login(providerId)` methods to `RpcClient`
|
|
1363
|
+
- Removed hashline auto-rebase. Anchor mismatches now reject immediately so the model re-reads instead of silently relocating an edit to a hash-collision within ±5 lines, which could otherwise apply the change to the wrong region. Stale-anchor recovery via the cached read snapshot is unaffected.
|
|
1372
1364
|
|
|
1373
1365
|
## [14.8.0] - 2026-05-09
|
|
1366
|
+
|
|
1374
1367
|
### Added
|
|
1375
1368
|
|
|
1376
1369
|
- Added hashline stale-anchor recovery by replaying edits against a session-scoped `read`/`search` snapshot and 3-way-merging them onto the current file when anchors no longer match
|
|
@@ -1390,6 +1383,7 @@
|
|
|
1390
1383
|
- Fixed indefinite startup hang on large repos introduced in 14.7.6 ([#975](https://github.com/can1357/oh-my-pi/issues/975)) on two fronts: (1) `createAgentSession` was awaiting `buildAgentsMdSearch` and `buildWorkspaceTree` directly in its blocking `Promise.all`, bypassing the existing 5s preparation deadline that previously protected startup — both scans are now raced against a 5s deadline and fall back to the system-prompt fallback path on timeout; (2) `buildWorkspaceTree` now derives its listing from `git ls-files --cached --others --exclude-standard` when the workspace is a git worktree, which is O(index size) and avoids the per-call full-tree gitignore-aware native scan that the previous implementation triggered. Repos without git, or where the call fails / times out, transparently fall back to the previous native-glob path.
|
|
1391
1384
|
|
|
1392
1385
|
## [14.7.6] - 2026-05-07
|
|
1386
|
+
|
|
1393
1387
|
### Changed
|
|
1394
1388
|
|
|
1395
1389
|
- Changed the "Hide Thinking Blocks" setting (Ctrl+T) to also instruct the provider to omit thinking/reasoning summaries from responses, instead of just hiding them client-side. Anthropic sees `thinking.display = "omitted"` (where supported); OpenAI Responses / Azure / Codex requests drop `reasoning.summary` entirely.
|
|
@@ -1402,6 +1396,7 @@
|
|
|
1402
1396
|
- Fixed subagents re-running expensive workspace scans (`buildAgentsMdSearch`, `buildWorkspaceTree`) on every spawn: parents now forward their already-resolved `AGENTS.md` search and workspace tree to subagents through `createAgentSession`, matching how `contextFiles`, `skills`, and `promptTemplates` are already inherited. On large monorepos this removes seconds of redundant work per `task` invocation and prevents the per-subagent system-prompt timeout warnings.
|
|
1403
1397
|
|
|
1404
1398
|
## [14.7.5] - 2026-05-07
|
|
1399
|
+
|
|
1405
1400
|
### Added
|
|
1406
1401
|
|
|
1407
1402
|
- Added optional `/loop` limits: `/loop 10` stops after 10 auto-iterations, while duration forms such as `/loop 10m` and `/loop 10min` stop after the time limit.
|
|
@@ -1437,6 +1432,7 @@
|
|
|
1437
1432
|
- Fixed hashline edit streaming preview collapsing to a header-only "opaque box" when a second `@PATH` section header arrived mid-stream — earlier completed sections now stay rendered while the trailing section is still being typed.
|
|
1438
1433
|
|
|
1439
1434
|
## [14.7.2] - 2026-05-06
|
|
1435
|
+
|
|
1440
1436
|
### Breaking Changes
|
|
1441
1437
|
|
|
1442
1438
|
- Removed the exported `BUILTIN_TOOL_METADATA` API, including `BuiltinEntry`-style metadata exports and discoverable-built-in helper exports, which will break consumers relying on those symbols
|
|
@@ -1464,6 +1460,7 @@
|
|
|
1464
1460
|
- Changed hashline replacement and pure-insert auto-absorb to also drop a single duplicated structural-closing line (`}`, `);`, `]`, etc.) on either boundary when keeping it would unbalance brackets. The pure-insert variant fires regardless of `edit.hashlineAutoDropPureInsertDuplicates`, while the existing 2+ line generic absorb stays gated on that setting.
|
|
1465
1461
|
|
|
1466
1462
|
## [14.7.0] - 2026-05-04
|
|
1463
|
+
|
|
1467
1464
|
### Breaking Changes
|
|
1468
1465
|
|
|
1469
1466
|
- Changed session system-prompt APIs to use ordered string block arrays by requiring `buildSystemPrompt`, `CreateAgentSessionOptions.systemPrompt`, `Session.rebuildSystemPrompt`, and extension `before_agent_start`/`getSystemPrompt` hooks to accept and return `systemPrompt: string[]` instead of a plain system-prompt string or separate `projectPrompt` field
|
|
@@ -1508,6 +1505,7 @@
|
|
|
1508
1505
|
- Added Ctrl+D draft persistence: pressing Ctrl+D with text in the editor now exits the app and saves the unsent text as a per-session draft. Resuming the same session (e.g. via `--resume`) restores the draft into the editor (one-shot, removed after restore).
|
|
1509
1506
|
|
|
1510
1507
|
## [14.6.4] - 2026-05-03
|
|
1508
|
+
|
|
1511
1509
|
### Added
|
|
1512
1510
|
|
|
1513
1511
|
- Added `hindsight.mentalModelsEnabled`, `hindsight.mentalModelAutoSeed`, `hindsight.mentalModelRefreshIntervalMs`, and `hindsight.mentalModelMaxRenderChars` settings to control curated Hindsight mental-model activation, seeding, refresh cadence, and prompt render budget
|
|
@@ -1685,9 +1683,6 @@
|
|
|
1685
1683
|
### Fixed
|
|
1686
1684
|
|
|
1687
1685
|
- Fixed eval startup messaging to report `eval` as unavailable when Python is unreachable and JavaScript backend is disabled
|
|
1688
|
-
|
|
1689
|
-
### Fixed
|
|
1690
|
-
|
|
1691
1686
|
- Stabilized MCP tool ordering so reconnects and refreshes no longer reorder the tools array sent to the model. Anthropic prompt caching is keyed on byte-identical tool definitions; previously, the order depended on connection sequence and a single MCP server reconnect could shuffle tools across servers and invalidate the tools cache breakpoint.
|
|
1692
1687
|
- Skipped redundant system-prompt rebuilds in `AgentSession.refreshMCPTools` when the active tool set is unchanged. MCP transport flapping (e.g. routine 5-minute SSE reconnects) used to call `rebuildSystemPrompt` on every reconnect even though the resulting prompt was byte-identical, eating CPU and risking cache misses if the rebuild ever became non-deterministic. The applied-tool signature also covers `customWireName` so a wire-name flip with the rest of the tool metadata constant still forces a rebuild.
|
|
1693
1688
|
|
|
@@ -2341,9 +2336,6 @@
|
|
|
2341
2336
|
- Fixed stale child selector reuse to correctly match chunks by checksum when multiple sibling chunks with the same name exist under the same parent
|
|
2342
2337
|
- Fixed stale diagnostics being reused after unrelated file publishes by clearing cached diagnostics before refreshing file state
|
|
2343
2338
|
- Fixed Codex search to use streamed answer text when final answer is an image placeholder or empty
|
|
2344
|
-
|
|
2345
|
-
### Fixed
|
|
2346
|
-
|
|
2347
2339
|
- Fixed MCP config docs and schema to use `~/.omp/agent/mcp.json` for user-scoped OMP-native MCP config while keeping project config at `<cwd>/.omp/mcp.json`
|
|
2348
2340
|
|
|
2349
2341
|
## [14.0.4] - 2026-04-10
|
|
@@ -2518,6 +2510,7 @@
|
|
|
2518
2510
|
- Chunk-mode `read` output: recursive rendering with `$XXXX` checksum suffixes, inline large-chunk previews, and normalized `#path$XXXX` selectors between read and edit
|
|
2519
2511
|
- Autoresearch: `init_experiment` options `new_segment`, `from_autoresearch_md`, `abandon_unlogged_runs`; `log_experiment` options `skip_restore` and broader `force`; `run_experiment` `force` (with warnings); pre-run dirty-path tracking; `abandonUnloggedAutoresearchRuns` and `abandonedAt` on runs
|
|
2520
2512
|
- LSP: diagnostic versioning (`versionSupport`, stored document version per diagnostic set), and `waitForDiagnostics` / `getDiagnosticsForFile` options (`expectedDocumentVersion`, `allowUnversioned`)
|
|
2513
|
+
- `/review` command now accepts inline args as custom instructions appended to the generated prompt for all structured review modes (PR-style, uncommitted, specific commit). When inline args are provided, option 4 (editor) is suppressed from the menu. The no-UI (Task tool) path forwards args as a focus hint.
|
|
2521
2514
|
|
|
2522
2515
|
### Changed
|
|
2523
2516
|
|
|
@@ -2552,17 +2545,6 @@
|
|
|
2552
2545
|
- ACP session creation now uses a factory function to support creating new sessions for different working directories
|
|
2553
2546
|
- ACP event mapping now accepts optional `getMessageId` callback for stable message ID assignment to assistant chunks
|
|
2554
2547
|
|
|
2555
|
-
### Removed
|
|
2556
|
-
|
|
2557
|
-
- Deleted `src/utils/prompt-format.ts` module; prompt formatting logic moved to `pi-utils`
|
|
2558
|
-
- Deleted `src/utils/frontmatter.ts` module; frontmatter parsing logic moved to `pi-utils`
|
|
2559
|
-
- Removed `waitForChildProcess` utility (child process termination now handled by native `killTree` from pi-natives)
|
|
2560
|
-
- `grep-chunk.md` (folded into unified grep template)
|
|
2561
|
-
- `startMacAppearanceObserver` export (use `MacAppearanceObserver.start()`)
|
|
2562
|
-
- `copyToClipboard` export from pi-natives
|
|
2563
|
-
- `PI_CHUNK_SPLICES` env and `chunkSplicesEnabled()`
|
|
2564
|
-
- Autoresearch `segmentFingerprint` and related config hashing
|
|
2565
|
-
|
|
2566
2548
|
### Fixed
|
|
2567
2549
|
|
|
2568
2550
|
- Chunk edit parameter validation: corrected detection of chunk edit operations to check for `sel` field instead of `target`
|
|
@@ -2630,9 +2612,16 @@
|
|
|
2630
2612
|
- `/autoresearch` toggles like `/plan` when empty; slash completion no longer suggests `off`/`clear` on an empty prefix after the command
|
|
2631
2613
|
- Chunk-mode read/edit edge cases (zero-width gap replaces, stale batch diagnostics, grouped Go receivers, line-count headers, parse error locations)
|
|
2632
2614
|
|
|
2633
|
-
###
|
|
2615
|
+
### Removed
|
|
2634
2616
|
|
|
2635
|
-
-
|
|
2617
|
+
- Deleted `src/utils/prompt-format.ts` module; prompt formatting logic moved to `pi-utils`
|
|
2618
|
+
- Deleted `src/utils/frontmatter.ts` module; frontmatter parsing logic moved to `pi-utils`
|
|
2619
|
+
- Removed `waitForChildProcess` utility (child process termination now handled by native `killTree` from pi-natives)
|
|
2620
|
+
- `grep-chunk.md` (folded into unified grep template)
|
|
2621
|
+
- `startMacAppearanceObserver` export (use `MacAppearanceObserver.start()`)
|
|
2622
|
+
- `copyToClipboard` export from pi-natives
|
|
2623
|
+
- `PI_CHUNK_SPLICES` env and `chunkSplicesEnabled()`
|
|
2624
|
+
- Autoresearch `segmentFingerprint` and related config hashing
|
|
2636
2625
|
|
|
2637
2626
|
## [13.19.0] - 2026-04-05
|
|
2638
2627
|
|
|
@@ -2980,6 +2969,7 @@
|
|
|
2980
2969
|
- Added support for Agent Client Protocol SDK integration with session management, MCP server configuration, and streaming communication
|
|
2981
2970
|
- Added `ensureOnDisk()` method to SessionManager to persist sessions immediately for ACP discovery
|
|
2982
2971
|
- Added multiline custom input for `ask` custom answers, using the prompt-style editor without inactivity timeout while composing ([#506](https://github.com/can1357/oh-my-pi/issues/506))
|
|
2972
|
+
- Session observer overlay (`Ctrl+S`): view running subagent sessions with a picker and read-only transcript showing thinking, text, tool calls, and results
|
|
2983
2973
|
|
|
2984
2974
|
### Changed
|
|
2985
2975
|
|
|
@@ -3023,13 +3013,6 @@
|
|
|
3023
3013
|
- Changed session persistence logic to use atomic file rewrite when flushing unflushed sessions to prevent duplication
|
|
3024
3014
|
- Removed hashline edit autocorrection for duplicated boundary lines; escaped-tab autocorrection remains available for leading `\\t` sequences
|
|
3025
3015
|
|
|
3026
|
-
### Removed
|
|
3027
|
-
|
|
3028
|
-
- Removed `command-start.md` prompt template in favor of separate initialize and resume workflows
|
|
3029
|
-
- Removed auto-correction of off-by-one range edits that duplicated closing braces or boundary lines
|
|
3030
|
-
- Removed `shouldAutocorrect` function and related boundary line deduplication logic from hashline editor
|
|
3031
|
-
- Removed auto-correction of off-by-one range edits that duplicated closing braces or boundary lines
|
|
3032
|
-
|
|
3033
3016
|
### Fixed
|
|
3034
3017
|
|
|
3035
3018
|
- Fixed autoresearch resume to detect and recover pending run artifacts that were left unlogged from previous sessions
|
|
@@ -3037,14 +3020,14 @@
|
|
|
3037
3020
|
- Fixed tab character rendering in dashboard command display and tool output summaries
|
|
3038
3021
|
- Fixed autoresearch logging to require durable ASI metadata (hypothesis, rollback_reason, next_action_hint) for every run including rollback context for discarded, crashed, and checks-failed experiments
|
|
3039
3022
|
- Fixed autoresearch logging to require durable ASI metadata for every run, including rollback context for discarded, crashed, and checks-failed experiments
|
|
3040
|
-
|
|
3041
|
-
### Fixed
|
|
3042
|
-
|
|
3043
3023
|
- Fixed resumed and session-switched GitHub Copilot/OpenAI Responses conversations replaying stale assistant native history from older saved sessions by sanitizing persisted assistant replay metadata on rehydration and resetting provider session state across live session boundaries ([#505](https://github.com/can1357/oh-my-pi/issues/505))
|
|
3044
3024
|
|
|
3045
|
-
###
|
|
3025
|
+
### Removed
|
|
3046
3026
|
|
|
3047
|
-
-
|
|
3027
|
+
- Removed `command-start.md` prompt template in favor of separate initialize and resume workflows
|
|
3028
|
+
- Removed auto-correction of off-by-one range edits that duplicated closing braces or boundary lines
|
|
3029
|
+
- Removed `shouldAutocorrect` function and related boundary line deduplication logic from hashline editor
|
|
3030
|
+
- Removed auto-correction of off-by-one range edits that duplicated closing braces or boundary lines
|
|
3048
3031
|
|
|
3049
3032
|
## [13.14.0] - 2026-03-20
|
|
3050
3033
|
|
|
@@ -3271,9 +3254,6 @@
|
|
|
3271
3254
|
### Changed
|
|
3272
3255
|
|
|
3273
3256
|
- Path resolution on Linux redirects to XDG locations when `XDG_DATA_HOME` / `XDG_STATE_HOME` / `XDG_CACHE_HOME` environment variables are set
|
|
3274
|
-
|
|
3275
|
-
### Changed
|
|
3276
|
-
|
|
3277
3257
|
- Changed TTSR interrupt logic to respect per-rule `interruptMode` settings, falling back to global `ttsr.interruptMode` when rule-level override is not specified
|
|
3278
3258
|
- Reorganized settings tabs from 12 tabs (display, agent, input, tools, config, services, bash, lsp, ttsr, status) to 8 focused tabs (appearance, model, interaction, context, editing, tools, tasks, providers) for improved discoverability
|
|
3279
3259
|
- Consolidated status line settings into the Appearance tab instead of a separate Status tab
|
|
@@ -3299,10 +3279,6 @@
|
|
|
3299
3279
|
- Changed working directory paths in system prompt to use forward slashes for consistency across platforms
|
|
3300
3280
|
- Modified bash executor to fall back to one-shot shell execution after a persistent session hard timeout, preventing subsequent commands from hanging
|
|
3301
3281
|
|
|
3302
|
-
### Removed
|
|
3303
|
-
|
|
3304
|
-
- Removed bash executor hard timeout recovery test file (functionality already documented in existing entries)
|
|
3305
|
-
|
|
3306
3282
|
### Fixed
|
|
3307
3283
|
|
|
3308
3284
|
- Fixed bash execution to fall back to one-shot shell runs after a persistent session hard timeout, preventing later commands from hanging until restart
|
|
@@ -3310,6 +3286,10 @@
|
|
|
3310
3286
|
- Fixed AgentSession disposal to call SessionManager's `close()` method when available, ensuring proper cleanup of persistent writers
|
|
3311
3287
|
- Removed redundant `path.join()` call wrapping `getHistoryDbPath()` in history-storage.ts
|
|
3312
3288
|
|
|
3289
|
+
### Removed
|
|
3290
|
+
|
|
3291
|
+
- Removed bash executor hard timeout recovery test file (functionality already documented in existing entries)
|
|
3292
|
+
|
|
3313
3293
|
## [13.11.1] - 2026-03-13
|
|
3314
3294
|
|
|
3315
3295
|
### Added
|
|
@@ -7387,31 +7367,6 @@
|
|
|
7387
7367
|
- Added auto-chdir to temp directories when starting in home unless `--allow-home` is set
|
|
7388
7368
|
- Added upfront diff parsing and filtering for code review command to exclude lock files, generated code, and binary assets
|
|
7389
7369
|
|
|
7390
|
-
### Fixed
|
|
7391
|
-
|
|
7392
|
-
- Fixed auto-chdir to only use existing directories and fall back to `tmpdir()`
|
|
7393
|
-
- Added automatic reviewer agent count recommendation based on diff weight and file count
|
|
7394
|
-
- Added file grouping guidance for parallel review distribution across multiple agents
|
|
7395
|
-
- Added diff preview mode for large changesets that exceed size thresholds
|
|
7396
|
-
- Added in-memory session storage implementation for testing and ephemeral sessions
|
|
7397
|
-
- Added `createToolUIKit` helper to consolidate common UI formatting utilities across tool renderers
|
|
7398
|
-
- Added configurable bash interceptor rules via `bashInterceptor.patterns` setting for custom command blocking
|
|
7399
|
-
- Added `bashInterceptor.simpleLs` setting to control interception of bare ls commands
|
|
7400
|
-
- Added LSP server configuration via external JSON defaults file for easier customization
|
|
7401
|
-
- Added abort signal propagation to web scrapers for improved cancellation handling
|
|
7402
|
-
- Added `diagnosticsVersion` tracking to LSP client for more reliable diagnostic polling
|
|
7403
|
-
- Added 80+ specialized web scrapers for structured content extraction from popular sites including GitHub, GitLab, npm, PyPI, crates.io, Wikipedia, YouTube, Stack Overflow, Hacker News, Reddit, arXiv, PubMed, and many more
|
|
7404
|
-
- Added site-specific API integrations for package registries (npm, PyPI, crates.io, Hex, Hackage, NuGet, Maven, RubyGems, Packagist, pub.dev, Go packages)
|
|
7405
|
-
- Added scrapers for social platforms (Mastodon, Bluesky, Lemmy, Lobsters, Dev.to, Discourse)
|
|
7406
|
-
- Added scrapers for academic sources (arXiv, bioRxiv, PubMed, Semantic Scholar, ORCID, CrossRef, IACR)
|
|
7407
|
-
- Added scrapers for security databases (NVD, OSV, CISA KEV)
|
|
7408
|
-
- Added scrapers for documentation sites (MDN, Read the Docs, RFC Editor, W3C, SPDX, tldr, cheat.sh)
|
|
7409
|
-
- Added scrapers for media platforms (YouTube, Vimeo, Spotify, Discogs, MusicBrainz)
|
|
7410
|
-
- Added scrapers for AI/ML platforms (Hugging Face, Ollama)
|
|
7411
|
-
- Added scrapers for app stores and marketplaces (VS Code Marketplace, JetBrains Marketplace, Firefox Add-ons, Open VSX, Flathub, F-Droid, Snapcraft)
|
|
7412
|
-
- Added scrapers for business data (SEC EDGAR, OpenCorporates, CoinGecko)
|
|
7413
|
-
- Added scrapers for reference sources (Wikipedia, Wikidata, OpenLibrary, Choose a License)
|
|
7414
|
-
|
|
7415
7370
|
### Changed
|
|
7416
7371
|
|
|
7417
7372
|
- Changed `Ctrl+P` to cycle through role models (slow → default → smol) instead of all available models
|
|
@@ -7434,12 +7389,30 @@
|
|
|
7434
7389
|
- Improved rust-analyzer diagnostic polling to use version-based stability detection
|
|
7435
7390
|
- Refactored web-fetch tool to use modular scraper architecture for improved maintainability
|
|
7436
7391
|
|
|
7437
|
-
### Removed
|
|
7438
|
-
|
|
7439
|
-
- Removed `submit_review` tool - reviewers now finish via `complete` tool with structured output
|
|
7440
|
-
|
|
7441
7392
|
### Fixed
|
|
7442
7393
|
|
|
7394
|
+
- Fixed auto-chdir to only use existing directories and fall back to `tmpdir()`
|
|
7395
|
+
- Added automatic reviewer agent count recommendation based on diff weight and file count
|
|
7396
|
+
- Added file grouping guidance for parallel review distribution across multiple agents
|
|
7397
|
+
- Added diff preview mode for large changesets that exceed size thresholds
|
|
7398
|
+
- Added in-memory session storage implementation for testing and ephemeral sessions
|
|
7399
|
+
- Added `createToolUIKit` helper to consolidate common UI formatting utilities across tool renderers
|
|
7400
|
+
- Added configurable bash interceptor rules via `bashInterceptor.patterns` setting for custom command blocking
|
|
7401
|
+
- Added `bashInterceptor.simpleLs` setting to control interception of bare ls commands
|
|
7402
|
+
- Added LSP server configuration via external JSON defaults file for easier customization
|
|
7403
|
+
- Added abort signal propagation to web scrapers for improved cancellation handling
|
|
7404
|
+
- Added `diagnosticsVersion` tracking to LSP client for more reliable diagnostic polling
|
|
7405
|
+
- Added 80+ specialized web scrapers for structured content extraction from popular sites including GitHub, GitLab, npm, PyPI, crates.io, Wikipedia, YouTube, Stack Overflow, Hacker News, Reddit, arXiv, PubMed, and many more
|
|
7406
|
+
- Added site-specific API integrations for package registries (npm, PyPI, crates.io, Hex, Hackage, NuGet, Maven, RubyGems, Packagist, pub.dev, Go packages)
|
|
7407
|
+
- Added scrapers for social platforms (Mastodon, Bluesky, Lemmy, Lobsters, Dev.to, Discourse)
|
|
7408
|
+
- Added scrapers for academic sources (arXiv, bioRxiv, PubMed, Semantic Scholar, ORCID, CrossRef, IACR)
|
|
7409
|
+
- Added scrapers for security databases (NVD, OSV, CISA KEV)
|
|
7410
|
+
- Added scrapers for documentation sites (MDN, Read the Docs, RFC Editor, W3C, SPDX, tldr, cheat.sh)
|
|
7411
|
+
- Added scrapers for media platforms (YouTube, Vimeo, Spotify, Discogs, MusicBrainz)
|
|
7412
|
+
- Added scrapers for AI/ML platforms (Hugging Face, Ollama)
|
|
7413
|
+
- Added scrapers for app stores and marketplaces (VS Code Marketplace, JetBrains Marketplace, Firefox Add-ons, Open VSX, Flathub, F-Droid, Snapcraft)
|
|
7414
|
+
- Added scrapers for business data (SEC EDGAR, OpenCorporates, CoinGecko)
|
|
7415
|
+
- Added scrapers for reference sources (Wikipedia, Wikidata, OpenLibrary, Choose a License)
|
|
7443
7416
|
- Fixed session persistence to call fsync before renaming temp file for durability
|
|
7444
7417
|
- Fixed duplicate persistence error logging by tracking whether error was already reported
|
|
7445
7418
|
- Fixed byte counting in task output truncation to correctly handle multi-byte Unicode characters
|
|
@@ -7448,6 +7421,10 @@
|
|
|
7448
7421
|
- Fixed parallel task execution to fail fast on first error instead of waiting for all workers
|
|
7449
7422
|
- Fixed byte counting in task output truncation to handle multi-byte Unicode characters correctly
|
|
7450
7423
|
|
|
7424
|
+
### Removed
|
|
7425
|
+
|
|
7426
|
+
- Removed `submit_review` tool - reviewers now finish via `complete` tool with structured output
|
|
7427
|
+
|
|
7451
7428
|
## [3.30.0] - 2026-01-07
|
|
7452
7429
|
|
|
7453
7430
|
### Added
|
|
@@ -7526,10 +7503,6 @@
|
|
|
7526
7503
|
|
|
7527
7504
|
## [3.21.0] - 2026-01-06
|
|
7528
7505
|
|
|
7529
|
-
### Changed
|
|
7530
|
-
|
|
7531
|
-
- Switched from local `@oh-my-pi/pi-ai` to upstream `@oh-my-pi/pi-ai` package
|
|
7532
|
-
|
|
7533
7506
|
### Added
|
|
7534
7507
|
|
|
7535
7508
|
- Added `webSearchProvider` setting to override auto-detection priority (Exa > Perplexity > Anthropic)
|
|
@@ -7551,6 +7524,7 @@
|
|
|
7551
7524
|
|
|
7552
7525
|
### Changed
|
|
7553
7526
|
|
|
7527
|
+
- Switched from local `@oh-my-pi/pi-ai` to upstream `@oh-my-pi/pi-ai` package
|
|
7554
7528
|
- Refactored tool renderers to be co-located with their respective tool implementations for improved code organization
|
|
7555
7529
|
- Changed web search to try all configured providers in sequence with fallback before reporting errors
|
|
7556
7530
|
- Changed default Anthropic web search model from `claude-sonnet-4-5-20250514` to `claude-haiku-4-5`
|