@oh-my-pi/pi-agent-core
Changed
Tool <name> not foundnow names a plausible intended target when the advertised set contains one, e.g.Tool mcp__abc123__xyz789_read not found. Did you mean read?. A model that mis-transcribes a long opaque tool name reliably keeps the trailing segment, which is the only part carrying meaning, so the miss becomes recoverable in the same turn instead of costing a round trip. Purely advisory — the suggestion is only ever a string in the error, never a dispatch target, so an unrecognized name still fails (#10109 by @oldschoola).
Fixed
- Fixed the token estimator counting developer messages as free and ignoring images in user content, which let context budgeting, pruning and the compaction trigger read a transcript as far smaller than the one sent to the provider.
- Fixed repeated local compaction omitting messages retained before the previous compaction record, while preserving original entry IDs and
/clearboundaries. - Raised remote compaction request timeout from 3 minutes to 5 minutes so long Codex/gpt-6-astra compact streams can finish before the watchdog aborts them.
- Fixed proxy responses dropping the cost the server reported; recorded costs are kept instead of being recomputed.
@oh-my-pi/pi-ai
Fixed
- Fixed transient Python HTTP/2 stream resets and HTTP/1.1 chunked response interruptions being treated as terminal errors when forwarded by a proxy (#11160 by @cyriusweng).
- Ollama cache hits now populate cached-token usage:
prompt_eval_cached_countfrom the/api/chatdone chunk maps tocacheRead, withinputreduced to the uncached portion, so status-linecache_turn/cache_hitsegments and cache-prefix audits report real hit rates instead of false misses. - Fixed requests that run across a price change being costed at the newer rate; peak/off-peak estimates now use the rate in effect when the request started.
- Fixed GitHub Copilot Business seats getting HTTP 403 on every model while the same token succeeds with a Chat client identity: chat and model-policy requests now identify as
copilot-chat, denied requests retry once as the Copilot CLI (copilot-developer-cli), andCOPILOT_INTEGRATION_IDpins theCopilot-Integration-Idheader up front; model discovery keeps the CLI identity and the 403 message names the identity and the remedies (#11372).
@oh-my-pi/pi-catalog
Added
- Added DeepSeek cost estimates that follow published peak/off-peak rates.
- Added dated, announced price changes to the catalog, so rates switch on their effective date (e.g. DeepSeek Pro moving to Flash rates).
- Added Command Code as a built-in provider with API-key login, live model discovery, per-model pricing, native OpenAI/Anthropic-compatible routing, cache-aware token usage, and TTFT metrics (#11391 by @CherkaSSH).
Fixed
- Fixed Command Code models outside the verified effort registry offering unsupported reasoning effort controls, and bundled the live Command Code catalog so fresh installs resolve the default model without waiting for discovery (#11595 by @H4vC).
- Fixed the bundled
deepseek-flashrow shipping without context limits: it now carries its documented 1M context / 384K output so offline context accounting enforces the real window.
@oh-my-pi/pi-coding-agent
Added
- Unsent prompts cleared with Ctrl+C can now be recalled with Up, including pastes and images; disable Recall Cleared Drafts in settings to discard future clears instead (#11524 by @camjac251).
- Added
tui.vimMode, an opt-in modal editing layer for the prompt, off by default (#3299). Escape leaves Insert; Normal mode hashjkl,0,^,$,w,b,e,gg,G, count prefixes,x/D/C,dd/yy,p/Pandu;v/Vstart a Visual selection thatycopies andddeletes. - Added a
vimstatus-line segment showing the current Vim mode (NORMAL/INSERT/VISUAL/V-LINE), the half-typed command beside it (Vim'sshowcmd, e.g.2d), and the Visual selection height (V-LINE 4L). Included in every built-in preset and hidden entirely unlesstui.vimModeis on;custompreset users can add"vim"tostatusLine.leftSegments. - The cursor now changes shape with the Vim mode: block in Normal/Visual, thin/underline in Insert. Applies to the software cursor, and to the real terminal cursor (DECSCUSR) when
PI_HARDWARE_CURSORis set. - Added the
tui.vimModeDisplaysetting (text/icon/none) controlling how the Vim mode appears in the status line: the full mode name, a single glyph per mode, or nothing. Shown in/settingsonly while Vim mode is on. - Added
icon.vimNormal,icon.vimInsert,icon.vimVisual, andicon.vimVisualLinesymbols, so the Vim mode icons follow the active symbol preset like every other status-line icon — Nerd Font (fa-square / fa-pencil / fa-eye / fa-bars), Unicode (■▎◉≡), or ascii (N/I/V/L) — and can be overridden per theme via thesymbolsmap. - Added peak
↑/ off-peak↓indicators to the cost display for models with scheduled pricing (DeepSeek), refreshed automatically when the tariff changes. - Added plan autosave: enable
plan.autosaveto automatically save approved plans to<project>/.omp/plans/when plan mode completes (customize withplan.autosaveDir, which accepts~, absolute, and cwd-relative paths) (#11599 by @H4vC).
Changed
- Toggling
tui.vimModeortui.vimModeDisplayin/settingsnow takes effect immediately instead of requiring a restart; the editor, prompt border, status-line segment, and cursor shape all switch in place. - The prompt border now colors Insert mode too (green), instead of falling through to the session accent. Normal and Visual were already colored, so Insert was the one mode the border could not distinguish — on themes whose accent matches the session accent it was indistinguishable from Normal. Borders outside Vim mode are unchanged.
Fixed
- Marketplace plugins that share a repository root now load only their declared skills instead of every skill in the repository (#11513).
- Fixed collab host UI requests raised before a writable guest joins being lost; up to 64 pending asks now replay only to writable guests, and already-aborted asks no longer consume request IDs (#9031 by @alphastorm).
- Collab hosts now acknowledge a writable guest's
ui-responsefor an already-settled request with a targetedui-request-end, so a guest that reconnected after the broadcast and resent its answer no longer waits forever (#11561 by @alphastorm). - Streaming edit guard (
edit.streamingAbort) no longer aborts on no-op preview results when replacement content produces no file changes, and carries the native patch diagnostic through the abort reason on genuine preview failures. - Repeated soft compaction now includes messages retained by the previous pass instead of silently dropping them from model context.
- Fixed the ask dialog splattering option descriptions and previews one word per row when a model injects
\rruns into tool-call string values (observed with GLM via OpenRouter); stray carriage returns are now sanitized in ask params, the live dialog, and ask transcript rendering (#11167 by @Giardi77). omp modelsnow reports whether a model's images actually reach the provider, so an id stripped by a text-only catalog rule no longer showsimages: yes(#9697).- Custom
Otheranswers are now applied before the Ask dialog becomes interactive again, so the next Enter is no longer discarded (#11558 by @schickling-assistant). - Explicit per-model price overrides retain their configured flat rates instead of inheriting time-based pricing.
@oh-my-pi/collab-web
Fixed
- Transcript links are now allowed by the scheme the browser will actually resolve, so a destination that only becomes
javascript:after URL normalization is dropped like any other unsafe scheme (#11562 by @alphastorm).
@oh-my-pi/pi-natives
Fixed
- Fixed Wayland computer-use clicks landing in the wrong place on scaled monitors by mapping captures through the portal's logical monitor geometry (#11540).
@oh-my-pi/omp-stats
Fixed
- Fixed historical cost estimates after a scheduled price change: usage is estimated at the request's own time, and charges recorded at the time are preserved.
- Fixed legacy requests that recorded no cost at all being stored as free usage: they are estimated at their request timestamp, and requests without a recoverable timestamp stay unpriced instead of being billed as 1970.
- Fixed a legacy entry whose malformed token counter was summed into an inflated request total; counters that are not finite numbers now count as absent.
- Fixed requests whose timestamp could not be recovered being reported as free usage: they now count as unpriced (
N/A) rather than$0, in both the aggregates and the per-request list, and an existing database re-parses its sessions once so rows stored before this change are repaired. - Fixed the trace summary showing
$0instead ofN/Afor legacy scheduled requests that omit their token total: the total is derived from the token buckets before classifying unpriced usage.
@oh-my-pi/pi-tui
Added
- Editor history can retain local draft snapshots with their paste expansions and host-owned attachment restoration, without writing them to persistent history (#11524 by @camjac251).
- Added an optional Vim-style modal editing layer to
Editor, off unlesssetVimMode(true)is called: Insert, Normal, and Visual/Visual-Line with motions, count prefixes, and operators.j/kkeep Vim's desired column, so passing over a shorter line does not collapse it, and$sticks to end-of-line.p/Ppaste from an internal register; yanks are surfaced to the host throughonYankso it can route them to the system clipboard. - Vim mode now exposes its chrome to hosts:
Editor.vimEnabled,Editor.vimPending(the half-typed command, e.g.2d), andEditor.vimSelectedLines(Visual selection height).onVimModeChangeadditionally fires when the pending command or selection size changes, not only on mode switches. - Vim mode now understands text objects:
iw/aw(andW), quotesi"/a'/a`, bracket pairsi(/a{/i[/a<(nesting-aware and multi-line), and paragraphsip/ap. They work under an operator (diw,ca() and in Visual mode (viw), with counts (d2aw). Previouslyiafter an operator fell through to Insert mode, sodiwtyped text instead of deleting a word. - Vim mode's
coperator now actually enters Insert mode (cw,cip,cin Visual); it also follows Vim'scw-acts-like-cequirk and parks the cursor correctly when the changed range is empty (ci"between bare quotes). - Added
Terminal.setCursorShape()(DECSCUSR), restored to the terminal's configured shape on teardown and crash cleanup.
Changed
- The software cursor now reflects the Vim mode: a reverse-video block in Normal/Visual and an underline in Insert. Both occupy one cell, so layout is unchanged, and non-modal editors keep the reverse-video block they always had.
What's Changed
- fix(tui): eliminate write preview highlighting stalls by @roboomp in #10958
- fix(agent): suggest the intended tool when a name miss is recoverable by @oldschoola in #11520
- fix(compaction): preserve retained history across soft compactions by @rpie9 in #11515
- Fix flaky incoming-json large-array timing bound on loaded CI runners by @JamieJ5926 in #11492
- feat(tui): optional Vim-style editing mode for the prompt by @Max-Levitskiy in #7658
- fix(agent): count developer messages and images in user content by @datrixlab in #11480
- fix(tools): prefer direct image reads for vision-capable models by @cagedbird043 in #11209
- fix(coding-agent): preserve effective limits across model overrides by @srobroek in #11186
- docs: clarify PR template and attribution workflow by @camjac251 in #11102
- fix(coding-agent/session): do not abort streaming edit on no-op preview by @usr-bin-roygbiv in #11310
- fix(coding-agent): report wire image support in
omp modelsby @soydachi in #11533 - feat(coding-agent): recall drafts cleared with Ctrl+C by @camjac251 in #11524
- fix(collab): retain host UI requests until a writer joins by @alphastorm in #9031
- fix(ai): map Ollama prompt_eval_cached_count into usage cacheRead by @chrisro320 in #11422
- fix(ai): retry proxied Python HTTP stream interruptions by @cyriusweng in #11160
- fix(desktop): map wayland captures through logical monitor geometry by @roboomp in #11541
- fix(ai): force SSE in codex retry tests via preferWebsockets by @H4vC in #11559
- fix(discovery): honor marketplace-root skill selection by @roboomp in #11514
- fix(collab): acknowledge responses to settled host UI requests by @alphastorm in #11561
- fix(collab-web): resolve link schemes the way the browser does by @alphastorm in #11562
- feat(catalog): add Command Code provider by @CherkaSSH in #11391
- fix(coding-agent): sanitize carriage returns in ask tool call args by @Giardi77 in #11167
- feat(pricing): add DeepSeek peak and off-peak accounting by @Unravl in #11542
- fix(coding-agent): apply Ask answer before restoring dialog by @schickling-assistant in #11558
- fix(agent): raise remote compaction timeout to 5 minutes by @serverinspector in #11571
- fix(catalog,stats): follow up DeepSeek pricing nits from #11542 by @H4vC in #11596
- fix(catalog): keep Command Code discovery neutral, bundle live catalog by @H4vC in #11595
- fix(ai): retry denied Copilot CLI-identity requests as copilot-chat by @H4vC in #11597
- feat(coding-agent): autosave approved plans to .omp/plans by @H4vC in #11599
New Contributors
- @Max-Levitskiy made their first contribution in #7658
- @datrixlab made their first contribution in #11480
- @soydachi made their first contribution in #11533
- @chrisro320 made their first contribution in #11422
- @cyriusweng made their first contribution in #11160
- @CherkaSSH made their first contribution in #11391
- @schickling-assistant made their first contribution in #11558
Full Changelog: v18.1.16...v18.1.17