@oh-my-pi/pi-agent-core
Fixed
- Fixed Codex V2 remote compaction bypassing the provider's live WebSocket transport before trying SSE (#7198).
- Tool calls skipped mid-batch to service queued steering/peer input now distinguish calls that never entered
tool.execute(SyntheticToolResultDetails,executed: false) from in-flight calls that may have performed partial work (execution: "started"), allowing UI/telemetry consumers to render normal steering control flow without misreporting execution state (#7199).
@oh-my-pi/pi-ai
Fixed
- Fixed Codex WebSocket tool-result turns replaying full history when the preceding tool-call ID required Responses API normalization (#7279).
- Fixed direct Anthropic provider streams ignoring
model.compat.streamIdleTimeoutMs. Requests dispatched throughstreamAnthropiccan now widen the inter-event idle watchdog or set it to0to disable that watchdog; caller options and environment overrides retain precedence. Setting the compat value to0disables only the inter-event watchdog and leaves the first-event watchdog enabled; wider idle values continue to floor the first-event budget under the existing timeout contract. - Fixed OpenRouter DeepSeek models failing structured subagents when the upstream returns an opaque HTTP 400 for a strict yield schema, retrying once without strict tools and remembering the fallback for the provider session (#7264).
- Fixed provider-native Codex compaction streams bypassing WebSocket-first transport selection and SSE transport fallback (#7198).
- Fixed
SqliteAuthCredentialStore.open()running theauth_credential_refresh_leasesDDL (CREATE TABLE/CREATE INDEX) with Bun's defaultbusy_timeout=0, before the constructor's#initializeSchema()installed the busy handler. Under a concurrent write lock (e.g. WAL recovery on parallel omp startups) the lock-taking DDL failed immediately and, since the error wasn't BUSY-classified, bypassedopen()'s bounded retry loop. The busy handler is now installed on the connection immediately after it opens, before any lock-taking statement, honoring the issue-#2421 invariant on every entry path. (#7298) - Fixed a corrupt credential store (
agent.db) silently disabling every persisted rate-limit block.AuthStoragecaught unrecoverable SQLite errors (SQLITE_CORRUPTfamily /SQLITE_NOTADB) from the persisted block read/write paths atdebuglevel with no latch, so the broken store was re-queried on every credential evaluation while blocks quietly stopped applying. The first unrecoverable error is now reported once aterrorlevel with the store location and repair guidance, and every later persisted-block read/write short-circuits for the process lifetime; in-memory backoff still preserves availability (#7296).
@oh-my-pi/pi-catalog
Added
- Added
AnthropicCompat.streamIdleTimeoutMsand propagated it throughbuildAnthropicCompatso direct Anthropic provider streams can configure their inter-event idle watchdog. - Fixed Ollama Cloud DeepSeek V4 Pro/Flash models (including dated tag variants such as
deepseek-v4-flash:0731) reporting an incorrect max-output-tokens figure by pinning it to the deployment's enforced 65536-token output ceiling (#7266).
Fixed
- Fixed
gen:modelsCodex discovery to union models across every stored OAuth account and fail closed on partial resolution, matching runtime discovery (#6265); restored the bundledgpt-5.4,gpt-5.6-sol, andgpt-5.3-codex-sparkentries a single-account regen had dropped. - Fixed
google-antigravitymodels always reporting $0 cost: Antigravity discovery carries no pricing, so the generator now back-fills each model with its Google list price (Gemini ids from thegoogleprovider, including-previewid aliases; Claude ids fromgoogle-vertex, falling back toanthropic). - Fixed OpenRouter
deepseek/deepseek-v4-flash-0731exposing onlyhighthinking effort by consuming the livereasoning.supported_effortsanddefault_effortmetadata and bundling itslow/high/maxladder. (#7307)
@oh-my-pi/pi-coding-agent
Added
- Added
requestIdFormat("string"|"number", default"number") to MCP server config, honored by the stdio, HTTP, and SSE transports. JSON-RPC 2.0 permits both id shapes, but Apple'sxcrun mcpbridgedecodesidas an integer only and silently drops string ids (mcpbridge.DecodeError Code=1), hanging every request until it times out. The option is OMP-specific, so set it in an OMP-owned config (.omp/mcp.json,~/.omp/agent/mcp.json, a projectmcp.json/.mcp.json, or an OMP plugin); servers imported from another tool's config ignore it (#7053). - Fixed Anthropic web search sending unsupported temperature parameters to sampling-restricted Claude models (#7195 by @will-bogusz).
- Fixed mid-turn steering/peer-interrupt tool skips rendering as errors (red ✘, red border/text) in the TUI; pending and in-flight interrupt placeholders now render as neutral info cards while preserving whether
tool.executestarted (#7199). - Added
Shift+Upas a second default for the message dequeue, so the shortcut is reachable in macOS Terminal.app where Option is consumed for character composition. - Added in-process
pgrep,pkill,pidwait, andtopshell builtins with cross-platform process discovery, BSD/procps-style filters, pidfile handling, signal selection, waiting, and snapshots.
Changed
- Headless hosts (print/RPC/ACP/eval/SDK) now use a 1s SQLite
busy_timeoutfor the session-critical databases (agent.db, history.db, stats.db), so lock contention no longer freezes the protocol loop for the full interactive 5s timeout; interactive hosts keep the 5s timeout. The interactive-host flag is now declared before settings load so the first database opens see the correct timeout. - The model picker (
/switch, alt+p) no longer blocks models whose context window is smaller than the live session: over-context rows stay grayed but selectable, and picking one compacts with the current model first, then switches. A cancelled or failed compaction keeps the current model. - MCP JSON-RPC request ids now default to per-connection sequential integers instead of snowflake strings, matching the wider MCP ecosystem and making integer-only decoders like Apple's
xcrun mcpbridgework without configuration; setrequestIdFormat: "string"per server to restore collision-resistant string ids (#7053). secret-placeholder.keynow resolves under XDG state ($XDG_STATE_HOME/omp/secret-placeholder.key) instead of the agent config directory, so it follows the same XDG layout as other state files.- Daemon runtime directories (
run/daemons/<hash>) and provider in-flight tracking (run/provider-inflight) now resolve under XDG state ($XDG_STATE_HOME/omp/run/) instead of the config root, keeping ephemeral runtime state out of~/.config. marketplaces.jsonnow resolves under XDG data ($XDG_DATA_HOME/omp/marketplaces.json) instead of the config root, aligning with the XDG data category for user-scoped registry files.- Existing XDG installs keep their placeholder key and marketplace registry: the legacy
~/.omp/agent/secret-placeholder.keyand~/.omp/marketplaces.jsonare copied to their XDG locations on first resolution.
Fixed
- Fixed sessions without a granted
writetool hiding discoverable and MCP tools behind the unusablexd://transport; those sessions now disable device mounting and expose the tools directly without gaining write access. - Fixed collab guest prompts being sent to models as unframed developer context, so guest messages now retain their transcript attribution while reaching the model as prioritized user interjections (#7288).
- Fixed
/memory statsand/memory diagnoseshowing "Memory stats is not available for the off backend" when memory is off, in both the TUI and ACP/RPC slash-command handlers; the off backend now says memory is off directly instead of naming itself as an unsupported backend (#7251 by @KennethHoff). - Fixed
/reload-pluginsretaining stale context-file contents and activation state in the current system prompt (#7258). - Fixed compiled binaries failing to import nested wildcard export subpaths such as
@oh-my-pi/pi-coding-agent/slash-commands/helpers/active-oauth-account. Node matches*in anexportspattern across/, but the bundled registry enumerated only the top level and skipped any key containing a slash, so such an import resolved from source and died under bunfs — reproducible on the published 17.2.1 binary. - Fixed concurrent session appends during
/moverecreating an orphaned.jsonlfragment in the old session directory (#7270). - Fixed interactive launches hanging silently when a host project or its
.envsetsNODE_ENV=testorBUN_ENV=test(#7261). - Fixed a subagent killed from the Agent Hub (
x) reappearing as aparkedrow after closing and reopening the hub in a local session; the kill now leaves the ref registered as terminalabortedinstead of unregistering it, so the persisted-subagent rescan no longer re-adopts the surviving transcript (#7250). - Fixed manual and automatic Codex compaction dropping the configured OpenAI WebSocket preference (#7198).
- Fixed two remaining tool-card double renders: a superseded assistant turn no longer leaves its never-run cards above the re-run's fresh cards (a TTSR rewind retracts them immediately; an auto-retry removes the synthetic-settled failure cards when it supersedes the turn — while a genuinely terminal failure keeps its card visible), and a successful read whose persisted result wins a transcript-rebuild race no longer creates a fallback read group when its delayed live completion arrives (#6879).
- Fixed a tool card rendering twice when the provider rewrites a streamed tool call's id mid-stream — GitHub Copilot's
call_id|idtransport, or any stream that delivers the tool name/arguments before the id — so the block appears first with an empty or partial id and is populated in a later delta. The transcript keyed the live card by that mutable id, so the changed id spawned a second card: the old-id card orphaned as a blue pending preview while the new-id card took the result. Streamed tool cards are now re-keyed in place when their id changes, using the block's position in the streaming message as a stable identity (#6879). - Withheld advisor nits and concerns while the primary turn is explicitly marked in progress, while still allowing blockers for unrecoverable active side effects.
- Preserved explicit
-e/--extensionand--hookpackages under
--no-extensionswhile excluding ambient extension factories and sibling
capabilities from settings or installed OMP packages. - Fixed explicit
thinkingmetadata inmodels.ymlcustom definitions andmodelOverridesbeing replaced by canonical catalog policy during model rebuilding. (#7307) - Fixed the auto-titler installing a model's whole answer as the session title when the tiny title model ignored the titling task and answered the first user message instead.
normalizeGeneratedTitlenow rejects overlong output (>80 chars or >12 words) so the caller defers titling to the next user turn rather than accepting a full sentence (#7303). - Fixed the in-process
killbuiltin to validate signals, preserve negative PID operands, signal every process in pipeline jobs, continue after bad targets, and refuse non-probe signals aimed at the host process or process group.
@oh-my-pi/omp-stats
Fixed
- Fixed provider usage window stats silently showing no data during SQLite contention by installing a five-second busy timeout on read-only agent database connections (#7300).
@oh-my-pi/pi-tui
Fixed
- Fixed animated Loader paints saturating a CPU core on slow WSL/ConPTY terminals by applying cost-aware cadence backpressure while preserving 30fps on cheap frames (#7290).
- Fixed interactive terminals suppressing all output and input when the host project sets
NODE_ENV=testorBUN_ENV=test(#7261).
@oh-my-pi/pi-utils
Added
- Added
getSecretPlaceholderKeyPath(),getDaemonRuntimeDir(),getProviderInFlightRoot(), andgetMarketplacesRegistryPath()to resolve secret key, daemon runtime, provider in-flight, and marketplace registry paths under their respective XDG categories (state, data) instead of the config root. - Existing installs enabling XDG keep their data: a legacy
~/.omp/agent/secret-placeholder.keyor~/.omp/marketplaces.jsonis copied to its XDG location on first resolution, so persisted transcripts still deobfuscate and added marketplaces survive the move.
Changed
- Headless hosts (print/RPC/ACP/eval/SDK) now use a 1s SQLite
busy_timeoutfor the session-critical databases (agent.db, history.db, stats.db) viagetDbBusyTimeoutMs(), so lock contention no longer freezes the protocol loop for the full interactive 5s timeout; interactive hosts keep the 5s timeout.
Fixed
- Fixed Bun test-runtime detection treating application-owned
NODE_ENV=testandBUN_ENV=testvalues as test-runner signals (#7261).
What's Changed
- fix(coding-agent): retract superseded turn's tool cards to stop double render by @roboomp in #6881
- feat(mcp): let a server opt into integer JSON-RPC request ids by @kodlian in #7107
- feat(keybindings): accept shift+up for the steering dequeue by @metaphorics in #7149
- fix(coding-agent): omit unsupported Anthropic search temperature by @will-bogusz in #7195
- fix(agent): route codex v2 compaction through websockets by @roboomp in #7202
- fix(tui): render mid-turn steering skips as info, not errors by @roboomp in #7203
- fix(ai): honor model.compat.streamIdleTimeoutMs in the Anthropic idle watchdog by @excniesNIED in #7230
- fix(coding-agent): refresh context files on plugin reload by @roboomp in #7262
- fix(tui): prevent test env from suppressing interactive launch by @roboomp in #7263
- fix(ai): retry opaque OpenRouter strict-tool errors by @roboomp in #7265
- fix(catalog): inherit base model limits for ollama tag variants by @roboomp in #7267
- fix(session): fence appends during session moves by @roboomp in #7271
- fix(extensions): bundle nested wildcard export subpaths for compiled binaries by @harshav167 in #7277
- fix(ai): preserve Codex WebSocket chaining for normalized IDs by @roboomp in #7281
- fix(coding-agent): preserve explicit extensions in isolation by @alphastorm in #7285
- fix(collab): treat guest prompts as user interjections by @roboomp in #7289
- fix(tui): backpressure slow loader paints by @roboomp in #7291
- fix(ai): install auth-db busy handler before open()-path leases DDL by @roboomp in #7304
- fix(ai): latch and surface a corrupt credential-block store by @roboomp in #7305
- fix(title): reject overlong auto-generated session titles by @roboomp in #7306
- fix(stats): wait for contended usage snapshot reads by @roboomp in #7308
- fix(catalog): honor openrouter deepseek effort metadata by @roboomp in #7311
- fix(coding-agent): suppress WIP advisor non-blockers by @wolfiesch in #6756
- fix(xdg): fix files and folder for xdg-maintained by @Parsifa1 in #7065
- Bound synchronous SQLite busy-waits in headless hosts by @pi3123 in #7240
- fix(memory): clarify /memory stats and /memory diagnose message when memory is off by @KennethHoff in #7251
- fix(coding-agent): keep hub-killed subagent from resurrecting as parked by @roboomp in #7252
New Contributors
- @kodlian made their first contribution in #7107
- @excniesNIED made their first contribution in #7230
- @alphastorm made their first contribution in #7285
- @pi3123 made their first contribution in #7240
Full Changelog: v17.2.3...v17.2.4