github can1357/oh-my-pi v17.0.6

latest release: v17.0.7
23 hours ago

@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_argument trailers 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-7 model 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-2 for 200K free, glm-5-2-1m for 1M paid). The 200K entry routes every thinking effort to the free glm-5-2 wire UID — never to the quota-gated glm-5-2-max or glm-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 connected openai-codex OAuth credential and drives OpenAI's hosted image_generation tool through the ChatGPT backend (chatgpt.com/backend-api/codex/responses, chatgpt-account-id header) independent of the active chat model — so image generation works on a ChatGPT/Codex subscription with no metered OPENAI_API_KEY, even when the active model is Claude/Gemini/etc. A new providers.image: "openai-codex" option forces it; auto now auto-detects a connected subscription (priority: active GPT image tool > Codex subscription > Antigravity > xAI > OpenRouter > Gemini), and the openai preference falls back to it when no OPENAI_API_KEY/active GPT model is present.
  • Added an optional provider parameter to generate_image (auto | openai | openai-codex | antigravity | xai | gemini | openrouter) that overrides the providers.image setting for a single request — so "generate this using gemini / codex / xai" routes per-call without changing the global setting. Absent → the providers.image setting 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, findImageApiKey preference arg).
  • Added OpenTelemetry log and metric export alongside the existing trace export. When OTEL_EXPORTER_OTLP_LOGS_ENDPOINT (or the shared OTEL_EXPORTER_OTLP_ENDPOINT) is set, omp registers a LoggerProvider and forwards every centralized-logger event as an OTLP log record (severity + attributes + active span context for log↔trace correlation, min level via OTEL_LOG_LEVEL, plus a structured agent run completed summary event). When OTEL_EXPORTER_OTLP_METRICS_ENDPOINT (or the shared endpoint) is set, it registers a MeterProvider with a PeriodicExportingMetricReader and records GenAI-semconv gen_ai.client.token.usage plus pi.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 own OTEL_*_EXPORTER=none kill switch, the global OTEL_SDK_DISABLED, and declines non-http/protobuf protocols independently (#4604).
  • retry.fallbackChains wildcards now support id-prefixed targets and keys: a chain entry like "openrouter/google/*" re-prefixes the failing model's bare id (google-antigravity/gemini-xopenrouter/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/xgoogle-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 of branchSummary.enabled. Plain Enter keeps the current behavior (direct switch by default; the summary prompt only when branchSummary.enabled is 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 when display.showTokenUsage is enabled.

Changed

  • Reduced concurrent subagent update CPU by reconstructing recent output only at progress emission boundaries. (#5936)
  • Fixed docs/advisor-watchdog.md overstating advisor delivery for a normal yield: the severity table listed concern as unconditionally interrupting and the prose promised a self-ended run could always be steered/resumed. Documented the #4840 terminal-answer exception (concern becomes a passive card while blocker normally 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 via read/grep apply without a separate full-width re-read.
  • Changed the default astGrep.enabled setting to false
  • 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 the task tool's context parameter 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, so tasks arrived 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 fired status is-login blocks in user config (agent/keychain setup, PATH mutation) on every command. fish is now started with -i instead — interactive shells source the same config.fish/conf.d files (so aliases and functions from #1816 keep working) without login-shell side effects. zsh behavior (-l -i) is unchanged.
  • Fixed the status-line tok/s badge ignoring vibe worker sessions: in /vibe mode 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.defaultOnStartup being ignored by headless omp -p sessions, 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.plan setting (#6015).
  • Fixed --model <role> resolving a bare configured modelRoles key.
  • Browser tool selectors now accept bare snapshot refs (tab.click("e501"), @e501) everywhere aria-ref=e501 works — 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 }), and tab.drag now resolve refs too. Unknown/stale refs fail immediately with the "refresh refs" error.
  • tab.select no 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 assistant message_end overtook its own message_start and the TUI skipped the error render entirely (no pinned banner, no inline Error: 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 from state.messages before prompt() resolved — print mode printed nothing and exited 0, and the task executor's getLastAssistantMessage() 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, #lastAssistantMessage is now set synchronously on message_end to prevent agent_end maintenance from reading a stale assistant turn when tool results and stops land in the same tick.
  • Fixed before_provider_request extension contexts exposing the primary session model for cross-provider Advisor requests instead of the request model (#6006).
  • Fixed isolated task subagents 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 .git verbatim; when the parent is a linked git worktree its .git is a pointer file, so the isolation shared the parent's HEAD/index/ref namespace and a task's git checkout/commit moved the parent's branch (and the rcopy git worktree add path leaked task branches into the shared namespace so a second task committed on top of the first). ensureIsolation now runs a new git.detachGitDir after isoStart: each isolation becomes a standalone repo with a frozen HEAD/refs/index snapshot that borrows the source object database through objects/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.run leaving 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-codex base 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 start waiting 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 start calls 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 startDebugging child 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 getPackageDir or getProjectDir from @earendil-works/pi-coding-agent (aliased to the legacy shim). The shim only re-exported getAgentDir; the two missing path helpers now resolve — getProjectDir from @oh-my-pi/pi-utils, and getPackageDir as a string-valued wrapper over omp's canonical package-root helper that falls back to the executable's directory inside bun --compile binaries (where the canonical helper returns undefined), matching pi's string contract. Extensions like @gotgenes/pi-permission-system install and load, and path.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 continue to re-enter context maintenance at the same boundary; capped empty turns are now discarded and the failure names model switching or /shake images as recovery options (#5959).
  • Long sessions no longer re-run convertToLlm over settled history every turn. Conversion is memoized per message identity (plus the assistant interruptedNext neighbor flag): an exact re-convert of the same array reuses the outer Message[], 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 the llm-assembly bench (N=5000) steady/append convert and repeat estimate are all >10x faster with robust MAD-noise well under 20% (#5934).
  • Fixed /exit hanging 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. isError remains true on the result so the model still knows the command did not complete normally. The timedOut flag 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 DefaultPackageManager or 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 plan role 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.clearTimer helpers 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-fatal uncaughtException — and every outstanding timer is unref'd and cleared automatically on session_shutdown (#5664).
  • Fixed an extension's self-scheduled setInterval/setTimeout callback throwing being able to tear down the whole session. Such callbacks ran outside the handler-dispatch try/catch, surfaced as a process-level uncaughtException, and the global postmortem handler treated them as fatal; extension authors now have sanctioned managed timers (see Added), and the constraint is documented in docs/extensions.md / docs/skills/authoring-extensions.md (#5664).
  • Fixed /quit and /exit leaving 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.quiet still rendering the xdev: 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 hub tool 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 cursor provider: the advisor runs in its own Agent that was constructed without cursorExecHandlers, 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 MCP advise tool) came back toolNotFound/"tool not available" and no advice was ever routed. The advisor Agent now gets a Cursor exec bridge scoped to its own granted tool set, mirroring the primary agent. The bridge's native delete frame 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. atlassian alongside an imported atlassian:atlassian), and stale tools remaining registered after disconnecting a server with special characters in its name.
  • Fixed the /usage show in 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 shared formatActiveAccountLabel, matching the account list and login-success surfaces (#5691).
  • Fixed Windows stdio MCP servers launched through .cmd/.bat shims failing with Transport closed; the launch now builds a cmd.exe /d /e:ON /v:OFF /c command line escaped for cmd.exe's parser and spawned with windowsVerbatimArguments, 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.realpath throws EISDIR there, but canonicalProjectDir in launch/presence.ts and launch/client.ts only recovered ENOENT. It now also falls back to path.resolve() on EISDIR (#5708 by @ve3xone).
  • Fixed unknown __omp_worker_* CLI selectors exiting 0 with empty output instead of erroring; an unrecognized worker-host selector now writes Error: 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.md read 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_skill and learn tools (#5715).
  • Fixed the write approval gate misclassifying xd:// device writes as exec when 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 to exec and prompt (#5727).
  • Fixed custom LSP servers such as roslyn-language-server crashing after initialization when they request unconfigured workspace/configuration sections; missing settings now receive the spec-required null instead 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 -p waiting 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: kimi sending a Moonshot Open Platform credential (MOONSHOT_API_KEY / stored moonshot auth) to the Kimi Code search endpoint (api.kimi.com/coding/v1/search), which rejects it with 401 and silently falls back to another provider. Kimi web search now resolves and advertises Kimi Code credentials only — a Kimi Code Console key via KIMI_SEARCH_API_KEY / MOONSHOT_SEARCH_API_KEY or omp /login kimi-code (#5762).
  • Fixed extension/SDK/RPC registerTool demoting essential built-ins (read/write/bash/edit/glob/…) to discoverable when a re-registration omitted loadMode, which — with tools.xdev on — unmounted them from the top-level schema and broke the xd:// transport (read xd:///write xd://), leaving the model with no callable coding essentials. Omitted loadMode now defaults to "essential" for known essential built-in names at every adapter boundary, and read/write (the transport itself) are never mounted under xdev regardless of loadMode (#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.fallbackChains model 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 send and ensureLive could hand out or inject into a subagent session mid-park dispose: park now detaches and flips status to parked before session.dispose(), concurrent ensureLive cancels a pre-detach park or waits then revives, and IRC delivery always gates through ensureLive so receipts/unread counts stay truthful (#5633).
  • Migrated legacy dev.autoqa.consentdev.autoqaConsent and todo.reminders.maxtodo.remindersMax on settings load so pre-v17 nested or quoted-dotted config no longer leaves the parent path as an object (which made dev.autoqa truthy 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 MCP StdioServerTransport constructed at module top level, or a bare process.stdin.resume(). The custom-tool/extension/hook/plugin loader guard now snapshots and restores process.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 uncaught SyntaxError: Failed to parse JSONL on any non-JSON stdin line. Malformed lines are now reported via a Failed to parse command error 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 /extensions dashboard tab labeled "Agents (standard)" being confused with the /agents subagents feature — the .agent/.agents config-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 read line 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_wait TV-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.showResolvedModelBadge is enabled. (#5060)
  • Fixed raw Puppeteer page/browser promises 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 prepareCompaction has nothing to summarize (findCutPoint never cuts inside a tool result). This !preparation short-circuit never ran the artifact-backed shake elide 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 curl by adding a dedicated github file-read operation and explicit tool-routing guidance (#4805).
  • Bounded RPC JSONL frames to 1 MiB, compacted oversized agent_end frames without losing complete Python prompt results, and guaranteed worker reaping plus pending-request rejection after output-reader failures or explicit stops (#5405).
  • Fixed web_search being unreachable under default config: with tools.xdev: true, the discoverable web_search tool was mounted under xd:// and dropped from the top-level toolset, so models calling it directly got "Tool web_search not found". It is now pinned top-level via XDEV_KEEP_TOP_LEVEL while other discoverable tools keep mounting under xd:// (#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.yml provider configuration and default-role selection (#5979).
  • Fixed autoResume crossing an explicit /new boundary: after /new a 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. readTerminalBreadcrumbEntry rejected the missing target and continueRecent() fell back to the most-recent session — the pre-/new transcript — processing the next prompt with stale context. /new now records a durable fresh breadcrumb boundary that continueRecent() 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 yield results 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 -e extensions in compiled binaries failing to resolve bundled @oh-my-pi/* value imports through the omp-legacy-pi-bundled: registry, and surfaced extension load failures during interactive and -p session 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 the advise emitted in the same turn (#5900).
  • Fixed custom anthropic-messages OAuth 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

Full Changelog: v17.0.5...v17.0.6

Don't miss a new oh-my-pi release

NewReleases is sending notifications on new releases.