@oh-my-pi/pi-ai
Fixed
- Fixed OpenAI Codex credentials limited to one ChatGPT workspace per email: a personal Plus/Pro plan and a Team/Enterprise seat under the same email now coexist in the auth store — with separate rotation and usage pools — instead of the second login silently replacing the first. The workspace (
chatgpt_account_id) is captured as the credential's org at login with the plan type as its display label, and two members of one workspace keep separate rows (#2966). - Fixed Devin total-token usage omitting cache reads and cache writes.
- Fixed model switches to Devin rejecting foreign provider response IDs, reasoning signatures, and empty interrupted turns as invalid Cascade history.
- Classified zero-output Devin
invalid_argumenttrailers as context overflow when the serialized message history is already large, routing cumulative tool-output payload failures through context maintenance—including artifact-backed shake rescue—instead of retrying the same rejected history.
@oh-my-pi/pi-catalog
Added
- Added static fallback seed for Devin's
swe-1-7model so it is bundled even when catalog generation runs without a Devin session token.
Fixed
- Collapsed Devin's six GLM-5.2 variants into two logical entries (
glm-5-2for 200K free,glm-5-2-1mfor 1M paid). The 200K entry routes every thinking effort to the freeglm-5-2wire UID — never to the quota-gatedglm-5-2-maxorglm-5-2-none— so GLM-5.2 works even when the weekly usage quota is exhausted.
@oh-my-pi/pi-coding-agent
Added
- Added native Warp CLI-agent events for rich session status, tool approvals, and completion notifications (#5592 by @metaphorics).
- Added Codex (ChatGPT subscription) support to
generate_image. The tool now resolves a connectedopenai-codexOAuth credential and drives OpenAI's hostedimage_generationtool through the ChatGPT backend (chatgpt.com/backend-api/codex/responses,chatgpt-account-idheader) independent of the active chat model — so image generation works on a ChatGPT/Codex subscription with no meteredOPENAI_API_KEY, even when the active model is Claude/Gemini/etc. A newproviders.image: "openai-codex"option forces it;autonow auto-detects a connected subscription (priority: active GPT image tool > Codex subscription > Antigravity > xAI > OpenRouter > Gemini), and theopenaipreference falls back to it when noOPENAI_API_KEY/active GPT model is present. - Added an optional
providerparameter togenerate_image(auto|openai|openai-codex|antigravity|xai|gemini|openrouter) that overrides theproviders.imagesetting for a single request — so "generate this using gemini / codex / xai" routes per-call without changing the global setting. Absent → theproviders.imagesetting applies, unchanged; the named provider uses the same resolution semantics (falls back to auto-detect if it has no credentials). File:tools/image-gen.ts(imageProviderSchema,findImageApiKeypreferencearg). - Added OpenTelemetry log and metric export alongside the existing trace export. When
OTEL_EXPORTER_OTLP_LOGS_ENDPOINT(or the sharedOTEL_EXPORTER_OTLP_ENDPOINT) is set,ompregisters aLoggerProviderand forwards every centralized-logger event as an OTLP log record (severity + attributes + active span context for log↔trace correlation, min level viaOTEL_LOG_LEVEL, plus a structuredagent run completedsummary event). WhenOTEL_EXPORTER_OTLP_METRICS_ENDPOINT(or the shared endpoint) is set, it registers aMeterProviderwith aPeriodicExportingMetricReaderand records GenAI-semconvgen_ai.client.token.usagepluspi.omp.agent.*counters/histograms (runs, steps, chat/tool calls by name+status+finish reason, latencies, estimated cost, errors) from the agent run summary and per-chat usage hooks. Each signal honors its ownOTEL_*_EXPORTER=nonekill switch, the globalOTEL_SDK_DISABLED, and declines non-http/protobufprotocols independently (#4604). retry.fallbackChainswildcards now support id-prefixed targets and keys: a chain entry like"openrouter/google/*"re-prefixes the failing model's bare id (google-antigravity/gemini-x→openrouter/google/gemini-x), a plain"provider/*"entry falling back from an aggregator strips the vendor prefix when the target provider only knows the bare id (openrouter/google/x→google-vertex/x), and an id-prefixed key ("openrouter/google/*") scopes a chain to that provider's ids under the prefix.- The session tree selector (
/tree,/branch) now supports Shift+Enter to summarize-and-switch in one step: it forks from the selected entry with a branch summary, with no extra prompt and regardless ofbranchSummary.enabled. Plain Enter keeps the current behavior (direct switch by default; the summary prompt only whenbranchSummary.enabledis on). (#5152) - Added the turn's local timestamp (
YYYY-MM-DD HH:mm:ss, down to the second) to the per-turn token-usage row shown under assistant messages whendisplay.showTokenUsageis enabled.
Changed
- Reduced concurrent subagent update CPU by reconstructing recent output only at progress emission boundaries. (#5936)
- Fixed
docs/advisor-watchdog.mdoverstating advisor delivery for a normal yield: the severity table listedconcernas unconditionally interrupting and the prose promised a self-ended run could always be steered/resumed. Documented the #4840 terminal-answer exception (concernbecomes a passive card whileblockernormally steers, #5628) plus the plan-mode and deferred-ACP constraints that preserve would-be steers until the user resumes (#5913). - Fixed subagent (task) sessions triggering an unnecessary tiny-model session-title generation call on
todo init. Subagent sessions in a non-interactive host (print/RPC/ACP/eval/SDK/CI) have no operator-visible title and now skip the replan title refresh; interactive hosts keep it, since a live subagent focused from the Agent Hub renders its session name in the status line (#5910). - Fixed
tab.scroll()timing out after a queued wheel event waits too long for a busy renderer's acknowledgement (#5905). - Made the hashline seen-line guard opt-in and off by default (see
edit.enforceSeenLines), and stopped excluding column-clipped (>512-char) lines from a snapshot's seen set: a displayed line now counts as seen even when its display was column-truncated, so single-line edits on long lines found viaread/grepapply without a separate full-width re-read. - Changed the default
astGrep.enabledsetting tofalse - Batched todo operations with real tool calls to prevent solo todo turns and extra round trips
- Changed every bundled TTSR rule to warn without interrupting generation.
- Renamed the system prompt's project-context section wrapper from
<context>to<repo-rules>to stop it colliding with thetasktool'scontextparameter under in-band XML tool dialects: models were closing<parameter name="context">with a stray</context>(primed by the ambient section tag) and emitting sibling params as bare<tasks>elements, sotasksarrived missing. - Rendered
read xd://calls in the compact grouped read view instead of a full tool-execution card; other internal URLs (skill://,agent://, …) still render full so their resolved content stays visible.
Fixed
- Fixed the interactive
!/!!shell shortcut spawning fish as a login shell (fish -l -c …), which firedstatus is-loginblocks in user config (agent/keychain setup, PATH mutation) on every command. fish is now started with-iinstead — interactive shells source the sameconfig.fish/conf.dfiles (so aliases and functions from #1816 keep working) without login-shell side effects. zsh behavior (-l -i) is unchanged. - Fixed the status-line
tok/sbadge ignoring vibe worker sessions: in/vibemode the director is often idle while workers stream, so the badge showed a stale/zero rate while parallel work was actively generating tokens. The rate now aggregates the main session's live tok/s with every live vibe worker's tok/s, and falls back to the main session's own cached rate when no workers are streaming. - Fixed
plan.defaultOnStartupbeing ignored by headlessomp -psessions, so the initial prompt now runs in plan mode and the persisted session remains in plan mode for later review (#6017). - Fixed resuming an active plan session replacing its journal-restored model with the current
modelRoles.plansetting (#6015). - Fixed
--model <role>resolving a bare configuredmodelRoleskey. - Browser tool selectors now accept bare snapshot refs (
tab.click("e501"),@e501) everywherearia-ref=e501works — previously the tab-worker backend fell through to a CSS tag selector that could never match, burning the 2s zero-match watchdog with a misleading "matches no elements" hint.tab.select,tab.uploadFile,tab.press({ selector }),tab.screenshot({ selector }), andtab.dragnow resolve refs too. Unknown/stale refs fail immediately with the "refresh refs" error. tab.selectno longer double-reports the previously selected option of a single<select>: the returned selection is read back after the full assignment pass instead of mid-loop.- Fixed transcript blocks being visibly duplicated during streaming (whole tool boxes and assistant paragraphs recommitted below their first copy on the terminal tape) by removing transcript committed-prefix compaction entirely. Dropping committed rows from the transcript's local frame shifted the frame under the engine's committed-prefix ledger, so the audit re-anchored and recommitted rows the tape already held. The transcript now always keeps its full local frame; committed finalized blocks still skip
render()via the segment reuse bypass. Reverts the compaction half of #5930's fix (compose keeps the render bypass; the local frame is no longer truncated). - Fixed tmux pane growth during a live response blanking finalized chat history re-exposed from native scrollback by rebasing the in-place repaint's commit seam to the resized viewport tail (#6011).
- Fixed classifier refusals (e.g. Anthropic
stop_reason: "refusal") ending the turn with no visible error. Two independent regressions: (1) session events reached subscribers out of order when a turn's provider events landed in one tick — extension emits only await for event types with registered handlers, so the assistantmessage_endovertook its ownmessage_startand the TUI skipped the error render entirely (no pinned banner, no inlineError:line); subscriber fan-out is now serialized in emission order. (2) Refusal turns are pruned from active context at settle (#3591), which also erased them fromstate.messagesbeforeprompt()resolved — print mode printed nothing and exited 0, and the task executor'sgetLastAssistantMessage()saw the previous turn. The pruned refusal is now retained until the next run starts,getLastAssistantMessage()reports it, and print mode reads the settled assistant via that accessor (exit 1 + refusal message on stderr). Additionally,#lastAssistantMessageis now set synchronously onmessage_endto preventagent_endmaintenance from reading a stale assistant turn when tool results and stops land in the same tick. - Fixed
before_provider_requestextension contexts exposing the primary session model for cross-provider Advisor requests instead of the request model (#6006). - Fixed isolated
tasksubagents mutating the parent checkout and stacking parallel task branches. Copy isolation backends (reflink/apfs/btrfs/zfs/block-clone/rcopy) materialise the worktree by duplicating its.gitverbatim; when the parent is a linked git worktree its.gitis a pointer file, so the isolation shared the parent's HEAD/index/ref namespace and a task'sgit checkout/commitmoved the parent's branch (and the rcopygit worktree addpath leaked task branches into the shared namespace so a second task committed on top of the first).ensureIsolationnow runs a newgit.detachGitDirafterisoStart: each isolation becomes a standalone repo with a frozen HEAD/refs/index snapshot that borrows the source object database throughobjects/info/alternates, so isolated git operations stay private, every task branch is parented on the requested base, and patch/branch capture (git fetch <merged>) still resolves objects. (#6003) - Fixed
browser.runleaving Puppeteer request handlers and interception state with divergent lifetimes by removing run-scoped handlers, disabling interception, and releasing held requests on every exit path (#6004). - Fixed Codex web search to honor configured
openai-codexbase URLs, API keys, and headers without leaking official OAuth credentials to custom endpoints; explicitly selected providers now fail closed instead of silently falling back (#6001). - Fixed
launch startwaiting for a finite PTY command to exit when the broker's PID-file handoff was unavailable; PTY startup now reports the spawned PID directly and returns an authoritative running or exited snapshot promptly (#5996). - Fixed queued user steering aborting side-effecting
hub startcalls after the broker request may already have been written; only passive hub waits and followed logs are now interruptible (#5995). - Fixed JavaScript/TypeScript debugging by launching vscode-js-debug over TCP, handling recursive
startDebuggingchild sessions, synchronizing breakpoints across the session tree, and terminating every child connection (#5984). - Fixed rich ask options showing preview content only for the highlighted choice; every option now renders its preview inline, with pageable long content and accurate configured paging and cancel hints (#5988 by @metaphorics).
- Fixed legacy pi extensions failing extension validation when importing
getPackageDirorgetProjectDirfrom@earendil-works/pi-coding-agent(aliased to the legacy shim). The shim only re-exportedgetAgentDir; the two missing path helpers now resolve —getProjectDirfrom@oh-my-pi/pi-utils, andgetPackageDiras a string-valued wrapper over omp's canonical package-root helper that falls back to the executable's directory insidebun --compilebinaries (where the canonical helper returnsundefined), matching pi's string contract. Extensions like@gotgenes/pi-permission-systeminstall and load, andpath.join(getPackageDir(), …)no longer crashes in the shipped binary (#5968). - Fixed headless print mode disposing the session before a final advisor review completed, which could drop the advisor transcript and usage (#5942).
- Fixed capped zero-block assistant stops remaining in active/session history with the full failed-request usage, causing the next post-snapcompact
continueto re-enter context maintenance at the same boundary; capped empty turns are now discarded and the failure names model switching or/shake imagesas recovery options (#5959). - Long sessions no longer re-run
convertToLlmover settled history every turn. Conversion is memoized per message identity (plus the assistantinterruptedNextneighbor flag): an exact re-convert of the same array reuses the outerMessage[], append-only growth reuses the converted prefix via slice-on-growth, and the prune/shake/strip-images/prewalk-scrub rewrite seams invalidate the affected message before the next pass. On thellm-assemblybench (N=5000) steady/append convert and repeat estimate are all >10x faster with robust MAD-noise well under 20% (#5934). - Fixed
/exithanging on post-prompt work and stacking independent subsystem teardown delays by bounding the aborted-work drain, disposing independent session resources concurrently, and keeping long shutdown waits visible (#5932). - Fixed queued-message display updates being skipped by focused-editor keystroke frames by explicitly repainting the pending-message container (#5928).
- Fixed RPC and RPC-UI startup crashes when an in-process extension claimed Bun's singleton stdin stream before the protocol reader (#5898).
- Bash command timeouts now render with a warning (yellow) border instead of an error (red) border, reflecting that the timeout ran its course rather than the command failed.
isErrorremainstrueon the result so the model still knows the command did not complete normally. ThetimedOutflag is now propagated from the bash executor to distinguish timeouts from user aborts. - Fixed Cursor responses streams stalling after an exec-channel tool completed without automatically recovering. The session now continues from the already-buffered tool result instead of replaying the side-effecting request. (#5790)
- Fixed linked legacy pi extensions failing to load when they import
DefaultPackageManageror linkedom: the coding-agent compatibility shim now enumerates OMP extension paths with plugin metadata, and extension-graph CommonJS modules load through synchronous default-export bridges with linkedom's bundled canvas fallback. (#5658) - Fixed the advisor retrying terminal, non-retriable provider failures (e.g. blocked prompts) three times before giving up; such failures now drop the bounded batch after a single attempt while transient failures keep the 3-attempt retry path (#5468).
- Fixed reassigning the
planrole model mid-planning not taking effect on the active planning turn; the change now applies at the next turn boundary instead of only the next plan-mode entry (#5657). - Added managed
ctx.setInterval/ctx.setTimeout/ctx.clearTimerhelpers on the extension context. Callbacks scheduled through them run with the same isolation as handler dispatch — a throw or rejected promise is logged and reported through the extension error channel instead of escaping as a process-fataluncaughtException— and every outstanding timer isunref'd and cleared automatically onsession_shutdown(#5664). - Fixed an extension's self-scheduled
setInterval/setTimeoutcallback throwing being able to tear down the whole session. Such callbacks ran outside the handler-dispatch try/catch, surfaced as a process-leveluncaughtException, and the global postmortem handler treated them as fatal; extension authors now have sanctioned managed timers (see Added), and the constraint is documented indocs/extensions.md/docs/skills/authoring-extensions.md(#5664). - Fixed
/quitand/exitleaving failed or stalled automatic title-generation requests alive during session teardown; disposal now aborts both online provider and local tiny-model title requests (#5666). - Fixed
startup.quietstill rendering thexdev: xd://: mounted …status line when MCP tools connect; quiet startup now suppresses only the user-visible mount notice while retaining the hidden model-facing device update (#5670). - Fixed command error in
hubtool with a non-POSIX shell (#5682) - Fixed xdev-routed checkpoint and rewind writes not tracking checkpoint state and leaving rewinding results in rebuilt provider and session context.
- Fixed the built-in advisor silently doing nothing when its model routes through the
cursorprovider: the advisor runs in its ownAgentthat was constructed withoutcursorExecHandlers, so on Cursor — where every tool executes server-side and is dispatched back through the client's exec handlers — each advisor tool call (including the MCPadvisetool) came backtoolNotFound/"tool not available" and no advice was ever routed. The advisorAgentnow gets a Cursor exec bridge scoped to its own granted tool set, mirroring the primary agent. The bridge's nativedeleteframe is gated so a read-only advisor cannot delete workspace files it was never granted a mutating tool for (#5680). - Fixed the fullscreen plan-review overlay staying visible until the approved execution turn finished, so after picking "Approve and keep context" (or any approve option) work proceeded underneath while the operator was stuck on the plan-review screen. The overlay is now hidden once execution begins — after the async transcript rebuild, before the blocking synthetic prompt is dispatched — instead of only after the whole turn returns (#5688).
- Fixed MCP tools repeatedly unmounting and remounting mid-session when server names have overlapping sanitized prefixes (e.g.
atlassianalongside an importedatlassian:atlassian), and stale tools remaining registered after disconnecting a server with special characters in its name. - Fixed the
/usage showin use by this session:marker showing only the login email, so two same-email Anthropic credentials in different orgs (a Team seat and a personal Max plan) were indistinguishable. The marker now suffixes the active organization (email (OrgName)) via a sharedformatActiveAccountLabel, matching the account list and login-success surfaces (#5691). - Fixed Windows stdio MCP servers launched through
.cmd/.batshims failing withTransport closed; the launch now builds acmd.exe /d /e:ON /v:OFF /ccommand line escaped forcmd.exe's parser and spawned withwindowsVerbatimArguments, so the resolved command path and arguments (including%VAR%, quotes, and shell metacharacters) reach the server intact and cannot inject commands (BatBadBut / CVE-2024-24576) (#5696). - Fixed the TUI usage panel truncating organization suffixes from same-email account labels even when the terminal has enough width (#5701).
- Fixed a startup crash on Windows when running from a drive root (e.g.
R:\):fs.realpaththrowsEISDIRthere, butcanonicalProjectDirinlaunch/presence.tsandlaunch/client.tsonly recoveredENOENT. It now also falls back topath.resolve()onEISDIR(#5708 by @ve3xone). - Fixed unknown
__omp_worker_*CLI selectors exiting 0 with empty output instead of erroring; an unrecognized worker-host selector now writesError: unknown worker selector: …to stderr and exits nonzero, so a stale or mistyped selector can no longer look healthy to a parent process or install smoke path (#5712). - Fixed Plan Review capturing mouse drags as pointer events, preventing native terminal text selection (#5711).
- Fixed orphaned TUI processes with revoked terminal descriptors remaining alive after a fatal error and amplifying shared log-rotation races into runaway memory, file-descriptor, swap, and disk consumption (#5716).
- Fixed approved-plan execution looping through filesystem searches when a model rewrites the required
local://<slug>-plan.mdread as a same-basename working-directory path; a missing cwd-root alias now recovers the active session-local plan while preserving any real working-tree file (#5704). - Fixed Ask dialogs immediately accepting their highlighted single-select answer when they appear while the user is typing a space in the prompt editor (#5717).
- Stopped post-compaction auto-continue from opening another primary turn after a terminal text answer with no queued work, and moved automatic auto-learn capture into an abortable private agent with only
manage_skillandlearntools (#5715). - Fixed the
writeapproval gate misclassifyingxd://device writes asexecwhen the mounted tool declared a function-valued (argument-dependent)approval: the gate discarded the function and never decoded the device JSON payload, so read/write device operations prompted in non-yolo modes their approval mode permits. It now parses valid object payloads and evaluates the mounted tool's normal approval decision, while malformed JSON, non-object payloads, and unknown devices still fall back toexecand prompt (#5727). - Fixed custom LSP servers such as
roslyn-language-servercrashing after initialization when they request unconfiguredworkspace/configurationsections; missing settings now receive the spec-requirednullinstead of{}(#5745). - Fixed late user-initiated bash results and minimized-output artifacts being recorded in whichever session or branch was active when execution finished; bash now retains its originating transcript across
new_session/switch_session/branch/tree navigation, and an intentionally dropped session stays deleted instead of being recreated by a straggling result (#5743). - Fixed Claude Code marketplace plugins with
scope: "local"leaking skills, hooks, tools, commands, and MCP servers into unrelated projects (#5750). - Fixed headless
omp -pwaiting indefinitely after a completed turn when final mnemopi consolidation stalls; print mode now applies the same bounded consolidation shutdown budget as interactive exit and reaps the embed worker (#5753). - Fixed explicit-tool sessions bypassing
xd://presentation for ambient discoverable custom and MCP tools, which sent their schemas top-level and could exceed provider tool limits or trigger schema-compatibility errors. - Fixed
providers.webSearch: kimisending a Moonshot Open Platform credential (MOONSHOT_API_KEY/ storedmoonshotauth) to the Kimi Code search endpoint (api.kimi.com/coding/v1/search), which rejects it with401and silently falls back to another provider. Kimi web search now resolves and advertises Kimi Code credentials only — a Kimi Code Console key viaKIMI_SEARCH_API_KEY/MOONSHOT_SEARCH_API_KEYoromp /login kimi-code(#5762). - Fixed extension/SDK/RPC
registerTooldemoting essential built-ins (read/write/bash/edit/glob/…) todiscoverablewhen a re-registration omittedloadMode, which — withtools.xdevon — unmounted them from the top-level schema and broke thexd://transport (read xd:///write xd://), leaving the model with no callable coding essentials. OmittedloadModenow defaults to"essential"for known essential built-in names at every adapter boundary, andread/write(the transport itself) are never mounted under xdev regardless ofloadMode(#5764). - Fixed the advisor skipping the next real user instruction after auto-learn accepted and pruned a terminal empty assistant stop; advisor transcript cursors now detect rewritten prefixes and re-prime before slicing the next update (#5731).
- Fixed built-in advisors retrying a quota- or rate-limited provider until becoming unavailable instead of applying the matching
retry.fallbackChainsmodel chain; advisor fallbacks now emit the same applied and succeeded lifecycle events as primary-agent fallbacks (#5740). - Made the model selector status messages use the role tag (
SMOL,SLOW) instead of the display name (Fast,Thinking), matching the rest of the TUI and CLI/env role terminology (#5585). - Fixed Cursor models receiving only top-level tools by forwarding mounted
xd://devices, including user-configured MCP servers, through Cursor's request-context MCP catalog and execution bridge (#5650). - Fixed Windows bash crashes when a piped command times out while flushing output; explicit-timeout watchdogs now wait for bounded native teardown instead of returning mid-drain. (#5316)
- Fixed a race where hub/IRC
sendandensureLivecould hand out or inject into a subagent session mid-parkdispose: park now detaches and flips status toparkedbeforesession.dispose(), concurrentensureLivecancels a pre-detach park or waits then revives, and IRC delivery always gates throughensureLiveso receipts/unread counts stay truthful (#5633). - Migrated legacy
dev.autoqa.consent→dev.autoqaConsentandtodo.reminders.max→todo.remindersMaxon settings load so pre-v17 nested or quoted-dotted config no longer leaves the parent path as an object (which madedev.autoqatruthy and enabled Auto QA, and discarded the reminder limit). Explicit new keys win, a separately configured parent boolean is preserved, an irrecoverable object parent falls back to the schema default, and only the new keys persist on save (#5632). - Fixed all keyboard input dying after the first keypress when a
~/.claude/tools(or.omp/tools) module attaches a stdin consumer at import time — e.g. an MCPStdioServerTransportconstructed at module top level, or a bareprocess.stdin.resume(). The custom-tool/extension/hook/plugin loader guard now snapshots and restoresprocess.stdin(listeners, paused state, raw mode) around third-party module evaluation, so a hijacked stdin reader can no longer starve the TUI's own listener (#5618). - Fixed the ask tool's "Other" custom-input dialog rendering the title, options, and hint one column to the right of the
>input gutter; the prompt-style editor chrome now aligns to column 0 (#5313) - Fixed advisor context maintenance undercounting the provider context: the compaction decision now anchors on the advisor's provider-reported context usage (cached input + generated output) floored by a full local estimate that includes the advisor system prompt and tool schemas, rejects stale provider usage retained across advisor compaction, and recovers a provider overflow by clearing only the advisor's own context at the current primary cursor — retrying the bounded failing batch once against a fresh context without replaying old primary history and keeping later updates eligible (#5282)
- Fixed RPC mode (
--mode rpc) crashing the whole process with an uncaughtSyntaxError: Failed to parse JSONLon any non-JSON stdin line. Malformed lines are now reported via aFailed to parse commanderror frame and the frame loop keeps running. (#5194) - Fixed the status line loop indicator to distinguish waiting, running, and paused states and show the remaining loop budget (#5832 by @wolfiesch).
- Fixed single-model task agents ignoring an explicitly configured default retry fallback chain, which left subagents failed after their selected provider became unreachable instead of advancing to the configured fallback model.
- Fixed the
/extensionsdashboard tab labeled "Agents (standard)" being confused with the/agentssubagents feature — the.agent/.agentsconfig-standard provider now presents as "Agent Dirs (.agent/.agents)" since it lists skills, rules, prompts, commands, and context/system files, never subagents (#5821). - Fixed non-raw
readline selectors returning context outside the requested inclusive range (#5802). - Fixed LSP requests silently clamping explicit timeouts above 60 seconds by supporting documented budgets up to 300 seconds (#5804).
- Clarified async task and hub guidance: inspecting a settled job consumes its automatic delivery, job IDs expire from process memory after roughly five minutes, and completion does not verify claimed artifacts (#5869).
- Fixed
vibe_waitTV-wall panels stacking duplicate frozen frames in native scrollback while two or more workers were live (#5777). - Fixed async task job rows omitting resolved subagent model and reasoning badges when
task.showResolvedModelBadgeis enabled. (#5060) - Fixed raw Puppeteer
page/browserpromises from crashing inline browser workers or killing dedicated workers when a target closed before the caller awaited the promise. - Fixed auto-compaction dead-ending in a warning loop ("Compaction freed too little context to make progress") when the single most-recent turn is itself over budget so
prepareCompactionhas nothing to summarize (findCutPointnever cuts inside a tool result). This!preparationshort-circuit never ran the artifact-backedshakeelide rescue that #3786 added to the post-maintenance guard, so snapcompact/context-full maintenance paused with no attempt to shrink the oversized tail. The dead-end now runs the same elide pass, re-prepares on the shrunken branch, and falls through to a normal compaction when the tail became summarizable — only pausing (single warning) when nothing is elide-eligible. (#4786) - Fixed GitHub-hosted repository file reads falling back to
curlby adding a dedicatedgithubfile-read operation and explicit tool-routing guidance (#4805). - Bounded RPC JSONL frames to 1 MiB, compacted oversized
agent_endframes without losing complete Python prompt results, and guaranteed worker reaping plus pending-request rejection after output-reader failures or explicit stops (#5405). - Fixed
web_searchbeing unreachable under default config: withtools.xdev: true, the discoverableweb_searchtool was mounted underxd://and dropped from the top-level toolset, so models calling it directly got "Tool web_search not found". It is now pinned top-level viaXDEV_KEEP_TOP_LEVELwhile other discoverable tools keep mounting underxd://(#5973). - Fixed onboarding omitting model selection by adding a persisted default-model step (fresh installs only — the setup version is not bumped, so existing installs are not re-prompted), and documented custom
models.ymlprovider configuration and default-role selection (#5979). - Fixed
autoResumecrossing an explicit/newboundary: after/newa new session's JSONL is created lazily (only once assistant output exists), so exiting before any assistant message left the per-terminal breadcrumb pointing at a not-yet-materialized file.readTerminalBreadcrumbEntryrejected the missing target andcontinueRecent()fell back to the most-recent session — the pre-/newtranscript — processing the next prompt with stale context./newnow records a durablefreshbreadcrumb boundary thatcontinueRecent()honors (starting fresh) even when the target is absent, while a genuinely stale/deleted breadcrumb still falls back to the most-recent session (#5730). - Fixed subagents that repeatedly submit malformed
yieldresults from leaving the parent waiting forever; malformed submissions now repeat the required response format, and repeated invalid submissions fail the child with a clear error. (#4957) - Fixed configured or
-eextensions in compiled binaries failing to resolve bundled@oh-my-pi/*value imports through theomp-legacy-pi-bundled:registry, and surfaced extension load failures during interactive and-psession startup. (#4954)
Removed
- Fixed the Cursor-backed advisor losing entire turns when it selected server-native tools (
bash,grep, etc.) outside its grant: exec-resolved native blocks are already rejected in-band by the advisor-scoped bridge, so they no longer trip the unavailable-tool quarantine and discard theadviseemitted in the same turn (#5900). - Fixed custom
anthropic-messagesOAuth providers being unable to opt into configured Claude Code fingerprint header overrides. (#5888) - Fixed authoritative providers (e.g.
openai-codex) keeping unsupported bundled models selectable when a fresh model cache and an expired OAuth token coincided: built-in discovery now forces the OAuth refresh so the provider's model manager is constructed and prunes stale bundled entries (e.g.gpt-5.4-nano) instead of waiting out the cache TTL. (#5364)
@oh-my-pi/omp-stats
Changed
- Clarified overview token accounting by separating uncached input from cache reads and showing the conversation-token total used by the agent breakdown.
@oh-my-pi/pi-tui
Fixed
- Fixed idle Loader animations on WSL repeatedly entering render scheduling after an expired ConPTY post-paint settle window instead of resuming direct component writes (#6024).
What's Changed
- revert(coding-agent): restored workflow notice by @vmcall in #6051
- fix(ai): scope OpenAI Codex credential identity by ChatGPT workspace by @will-bogusz in #6095
- fix(coding-agent): persist bash shortcut cwd changes by @jeffscottward in #4784
- fix(catalog): collapse Devin GLM-5.2 variants so free 200K model works when quota is exhausted by @oldschoola in #4882
- fix(agent): stop malformed subagent yield loops by @roboomp in #4961
- fix(cli): resolve bundled extension imports by @roboomp in #4964
- feat(coding-agent): add timestamp to per-turn token-usage row by @zommiommy in #5055
- fix(session): persist /new boundary so autoResume does not resume pre-/new transcript by @roboomp in #5736
- fix(tools): keep web_search top-level under xdev by @roboomp in #5974
- fix(coding-agent): bound RPC output and reap failed workers by @wolfiesch in #5977
- fix(setup): add default model selection by @roboomp in #5982
- fix(coding-agent): preserve plan exit rollback state by @any-victor in #6013
- fix(devin): recover oversized prompt history after rejection by @riverpilot in #6014
- fix(coding-agent): enable plan mode for print prompts by @roboomp in #6020
- fix(coding-agent): preserve model when resuming plan mode by @roboomp in #6023
- fix(tui): resume direct writes after ConPTY settle by @roboomp in #6025
- fix(ai): include Devin cache usage in total tokens by @wolfiesch in #6026
- fix(stats): clarify overview token totals by @wolfiesch in #6027
- fix(coding-agent): run fish user shell interactively instead of as a login shell by @iacore in #6045
- fix(devin): sanitize foreign history during model switches by @riverpilot in #6076
- fix(status-line): aggregate vibe worker tok/s into the status-line badge by @oldschoola in #6079
- fix(thinking): persist auto selector receipt by @moomooskycow in #6088
New Contributors
- @will-bogusz made their first contribution in #6095
- @moomooskycow made their first contribution in #6088
Full Changelog: v17.0.5...v17.0.6