@oh-my-pi/pi-agent-core
Fixed
- Fixed
AppendOnlyContextManager.syncMessagesclearing the entire log on any in-place rewrite of an already-synced message. Per-turn tool-output pruning, image stripping, or anytransformContextre-render that touched a single message used to drop every prior turn out of the append-only log and re-send the conversation from scratch, forcing local backends (llama.cpp / Ollama / LM Studio) to re-prefill tens of thousands of tokens every few turns.syncMessagesnow finds the longest byte-stable prefix between the previously-synced messages and the new ones, truncates the log to that prefix, and only re-appends the diverged tail — so the provider's KV cache stays warm up to the divergence point. (#3406)
@oh-my-pi/pi-ai
Added
- Added
listOAuthAccountsfor retrieving a read-only list of stored OAuth account identities - Added
getOAuthAccessAtto resolve an OAuth token exclusively for a specific account position
Changed
- Refactored OAuth token persistence and disable logic to use stable credential IDs instead of positional indices to prevent race conditions during concurrent updates
- Updated OAuth failure classification to treat 403 status codes, rate limits, and network errors as transient, preventing unnecessary credential invalidation
Fixed
- Fixed Codex Responses Lite staying enabled for image prompts, which caused GPT/Codex image turns to be rejected as
Invalid value: 'input_image'; image-bearing Codex requests now fall back to the full Responses transport. (#3421) - Fixed the auth-broker background refresher disabling OAuth credentials unconditionally (
disableCredentialById) on a definitive refresh failure, so a credential another process or a fresh login rotated mid-refresh could be torn down even though the stored row already held a valid token. The definitive-failure teardown now happens insideAuthStorage.refreshCredentialByIdvia the same compare-and-set the in-stream and usage-probe paths use — it disables only when the persisted row still matches the credential the refresh actually attempted, and reloads on a CAS loss; the refresher now only logs. - Fixed OAuth refresh persisting the rotated token by a positional index captured before the refresh
await. A concurrent disable could reorder or shrink a provider's credential array while the refresh was in flight, landing the new token on the wrong row (or silently dropping it) and leaving accounts with a stale refresh token that failed — and was then disabled — on the next cycle. Refresh persistence, selection-index resync, and CAS-disable now address the row by id acrossforceRefreshCredentialById, candidate preflight, and in-stream selection (#replaceCredentialById/#disableCredentialByIdIfMatches). - Fixed
isDefinitiveOAuthFailuretreating a bare HTTP 403 (and genericunauthorized/ access-token-expired wording) as a definitive credential failure, which permanently disabled healthy OAuth accounts on WAF, egress rate-limit, permission, and account-verification responses. Bare 403, rate limits (429), gateway/5xx, and more network errors (ECONNRESET,ETIMEDOUT,EAI_AGAIN, …) are now classified transient; only explicit dead-grant errors (invalid_grant,invalid_token,unauthorized_client, revoked,refresh token … expired) or a bare 401 tear the credential down.
@oh-my-pi/pi-coding-agent
Added
- Added --list flag to view stored OAuth accounts for a provider
- Added --account flag to select a specific OAuth account by index for token retrieval
- Added mouse support for navigation, selection, and toggling in the extensions dashboard
Changed
- Enabled fullscreen alternate-screen mode for the extensions dashboard
- Improved tab navigation to mute empty enabled providers while keeping disabled ones selectable
/extensions(the Extension Control Center) now opens as a fullscreen window on the terminal's alternate screen, matching/settings: it borrows the alt buffer for its lifetime (the transcript is untouched underneath) and uses the same modern chrome — a titled rounded frame, the sharedTabBarfor provider switching, and a divider/footer layout. The dashboard is now mouse-aware: the wheel scrolls the list (and the detail inspector, which gained its own scroll viewport), hovering highlights tabs and rows, and clicking selects a row or — when it is already selected — toggles it; clicking a provider tab switches to it. Empty enabled providers are unselectable while disabled providers stay selectable so their master switch can re-enable them.
Fixed
- Fixed
omp installof legacy pi extensions failing withCannot find module '/$bunfs/root/packages/coding-agent/src/extensibility/typebox.js'on every releasedomp-<platform>-<arch>binary. Commitdc5c93462fremoved worker entrypoints fromscripts/ci-release-build-binaries.ts; the inline comment then claimed the legacy-shim and package-barrel entrypoints (typebox.ts,legacy-pi-{ai,coding-agent}-shim.ts,packages/{agent,natives,tui,utils}/...) were "still" passed tobun build --compile, but they had never been re-added. The release binaries shipped without those files in bunfs, solegacy-pi-compat.tsredirectedtypeboximports to a bunfs path that didn't exist.__resolveTypeBoxShimPathnow mirrors__validateLegacyPiPackageRootOverrides(#2168) by dropping the override when the shim file is missing, so a missing shim falls through to nativenode_modulesresolution instead of emitting a dead bunfs URL (#3414). - Fixed every legacy
@(scope)/pi-*and@sinclair/typeboximport failing to load on theomp-darwin-arm64release binary (and any otherompbuilt with Bun 1.3.14).__validateLegacyPiPackageRootOverridesand therewriteLegacyPiImportsemit path both depended on--compileextras being reachable as/$bunfs/root/...filesystem entries, but Bun 1.3.14 stopped exposing them through every API (fs.existsSync,Bun.file().exists(),Bun.resolveSync,await import()on the bunfs path or itsfile://URL all fail; only/$bunfs/root/<binary-name>itself answers).legacy-pi-compat.tsnow keeps a JS-heap reference to every bundled pi-* surface in a lazy-loaded siblinglegacy-pi-bundled-registry.tsand serves them through anomp-legacy-pi-bundled:virtual namespace whoseBun.plugin().onLoadreturns synthetic re-exports — no bunfs path ever leaves the module in compiled mode, and dev / source-link / installed-package modes keep the historicalfile://rewrite. The matching--compileextras inscripts/build-binary.ts, the sharedscripts/binary-entrypoints.tslist, and the deadBUNFS_PACKAGE_ROOT/bunfsPath/__computeBunfsPackageRoot/__joinBunfsPathhelpers are gone. (#3423)
What's Changed
- fix(agent): preserve append-only log prefix on in-place message rewrites by @roboomp in #3409
- fix(release): restored legacy pi-compat --compile entrypoints in release builds by @roboomp in #3417
- fix(ai): disable Codex lite for image prompts by @roboomp in #3422
- fix(coding-agent): served bundled pi-* through virtual ns on bun 1.3.14 by @roboomp in #3429
Full Changelog: v16.1.17...v16.1.18