🐙
$ git clone https://github.com/can1357/oh-my-pi.git
@oh-my-pi/pi-agent-core
Changed
- Steering is now woken by an event instead of polled on a fixed interval while a tool batch runs.
AgentLoopConfig.waitForSteeringMessagesresolves when a steer is enqueued, so an interruption is observed as soon as it arrives rather than at the next tick, and idle batches stop burning wakeups. The interval timer remains for the IRC interrupt queue, which has no wake callback, and checks only IRC while the event watcher owns steering. Waits are raced against local abort, so a callback that does not observe its signal cannot hang batch teardown.
Fixed
- Fixed a Cursor tool result being lost when a custom
cursorOnToolResulttransformer was still pending as the turn closed. The provider dispatches decoded messages without awaiting them, so amessage_endfrom the same chunk could drain the buffer before the transformer resolved, dropping the result and leaving itstoolCallblock to be stripped as dangling on replay. The entry is now reserved synchronously and patched in place once the transformer resolves, preserving buffer order. - Fixed an async
cursorOnToolResulttransformer's rewrite being silently discarded when it resolved after the buffer drain. The reservation kept the call from dangling but the late patch mutated a detached entry, so the already-persisted message kept the pre-transform payload. The drain now awaits any transformer still in flight before persisting, matching the awaited exec-channel paths. A rejecting transformer is swallowed and the reserved payload stands in, so a failing hook cannot take the turn down or cost the result. - Fixed Cursor tool results being dropped for hosts that pass neither
cursorExecHandlersnorcursorOnToolResult. Both are optional, but the Cursor provider resolves native todo calls server-side and synthesizes exec blocks regardless, marking both as resolved so no placeholder result is emitted for them. The result buffer callback was only installed when one of the options was present, so a bare SDK host discarded the provider's paired result and every rebuilt transcript stripped the interaction. It is now installed unconditionally. - Fixed an async
cursorOnToolResultrewrite being lost when the provider errored mid-transform. The normal drain waits for a pending transformer, but the error path snapshotted the buffer without that await, so a transform still in flight patched an entry the catch path had already detached and the pre-transform payload was persisted. A provider error is exactly when a transform is most likely to be mid-flight. - Reduced oversized OpenAI native compaction requests by replacing only trailing tool-output bodies that exceed the model context window, while preserving calls, assistant history, and reasoning.
@oh-my-pi/pi-ai
Added
- MiniMax Token Plan accounts now report quota in
omp usage.GET /v1/token_plan/remainsreturns one bucket per plan quota, each carrying a rolling interval window and a weekly window, sominimax-codesurfaces real remaining percentages instead of an empty report. A model the plan does not include comes back looking like an untouched quota; those buckets are dropped from the report and named in its metadata. The mainland idminimax-code-cnis untouched. - OAuth logins now stamp
authorizedAt(epoch ms of the interactive login) on the stored credential, and every refresh-persist path preserves it. Anthropic expires the whole OAuth grant family ~30 days after authorization regardless of refresh-token rotation (observed asinvalid_grant: "Refresh token expired"on the latest rotated token, exactly 30 days after login, across four production accounts), so the login anchor is what makes re-login deadlines computable. ExportedANTHROPIC_OAUTH_GRANT_TTL_MSalongside the anthropic OAuth flow. - Added
GET /v1/credentials/disabledto the auth broker andAuthBrokerClient.listDisabledCredentials: disabled-credential tombstones (DisabledCredentialSummary— identity, verbatim disable cause, disable timestamp; never token material) so auto-disabled accounts stay visible to clients instead of silently vanishing from the snapshot.AuthStorage.listDisabledCredentialsserves the same data locally from SQLite; clients of brokers predating the endpoint get an empty list (404 mapped, no error). - Added
AuthStorage.revalidateCredentials()and the optionalAuthCredentialStore.refreshSnapshothook: remote broker stores re-fetchGET /v1/snapshoton demand so callers pairing live per-credential data with stored identities (omp usage) never render against the up-to-an-hour-stale disk-cached snapshot; local SQLite stores are always current and only reload. - Added an optional per-request
codexSseMaxAttemptsstream option to bound Codex SSE pre-response retries while preserving the six-attempt default when omitted. - Fixed Cursor requests failing with
Connect error internal: Unable to parse image: ...whenever the session history contained an image:rootPromptMessagesJsonimage parts now embed adata:<mime>;base64,URI instead of bare base64, matching the convention used by the OpenAI-completions provider ( by by ). - Fixed Bedrock Converse dropping captured Claude thinking signatures when replaying application-inference-profile ARN models, restoring adaptive-thinking multi-turn conversations ().
- Fixed statusless provider capacity errors such as
no_capacityand high-demand responses being treated as terminal instead of retryable. () - Fixed Claude scoped weekly limits (e.g.
Claude 7 Day (Fable)) withis_active: falsebeing dropped by the/usageparser, rendering asnot reportedinomp usagedespite carrying real utilization. Live payloads mark only the currently binding limit active — an account pinned at a 100% Fable cap reports its 77% shared weekly row as inactive too — sois_activesignals severity ranking, not bucket existence, and is now ignored. Exhaustion gating is unchanged: tier rows still hard-block only at confirmed 100% with a future reset. - Fixed a TDZ crash (
Cannot access 'claudeCodeVersion' before initialization) whenproviders/anthropicwas the first module loaded:providers/anthropic→stream→registry→registry/oauth/anthropiccircled back into the still-initializing provider module. The Claude Code fingerprint constants now live in the leaf moduleproviders/claude-code-fingerprint(star re-exported fromproviders/anthropic, so import paths are unchanged).
@oh-my-pi/pi-catalog
Added
- Added Claude Opus 5 model entries for Amazon Bedrock:
anthropic.claude-opus-5plus itsus.,eu.,au., andglobal.regional/geo IDs.
Fixed
- Fixed
alibaba-token-planlocking out China (Beijing) 百炼 Token Plan subscribers: the provider hardcoded the international Singapore endpoint, so Beijing-issuedsk-sp-keys got401 invalid_api_key. The wire credential now carries an optional region base URL, and model discovery targets the credential's region (). - Fixed GitHub Copilot Claude models with no bundled catalog reference (e.g. a freshly served
claude-opus-5) discovering withreasoning: false/thinking: nulland no effort dial, and disappearing along with their synthesized-1msibling on offline reads: reference-less Copilot models on the anthropic-messages proxy now derive the adaptive reasoning ladder from the model id, and the cache restores their compile-timeCOPILOT_API_HEADERSby value instead of dropping them as unrestorable (). The shared fallback only claims payloads that hold a single path: one carrying a second absolute-path anchor after unescaped whitespace (/tmp/a.png /tmp/b shot.png— dragging two files at once when either name has spaces) now pastes as text on both routes instead of being fused into one unresolvable path, which on the clipboard route previously attached nothing and swallowed the text behind an "Image not found" status. - Fixed transient reasonless request aborts that arrived after a tool call finished streaming ending the turn instead of entering recovery, which left edit calls and task subagents dead until the user manually resumed. The session now continues from the synthetic unexecuted tool result under the normal retry policy without replaying completed side effects ().
- Fixed
@czottmann/pi-automodefailing legacy extension validation because the pi-ai compatibility shim omittedclampThinkingLevel, then failing every classified tool call becausectx.modelRegistryomittedgetApiKeyAndHeaders. (). - Fixed the advisor silently swallowing its own quarantined turns: when an advisor called an ungranted tool (e.g.
bash) its whole turn was discarded before dispatch, so its advice never reached the primary agent and the failure surfaced only in advisor diagnostics — every other non-recovering failure branch notifies the host UI, but quarantine re-primed silently with no bound. A persistently-quarantining advisor now surfaces anotifyFailurewarning in the main UI (deduped, cleared on the next successful turn) and stops the unbounded silent re-prime loop (). - Fixed Parakeet speech-to-text failing to load
sherpa-onnx-nodefrom Windows source workspaces when Bun installed the wrapper underpackages/coding-agent/node_modulesbut hoisted its native platform package to the repository root (). - Todo progress now stays in sync when using Cursor models: the Cursor exec bridge mirrors the provider's server-owned todo list into session state, refreshes the interactive todo panel, and persists each snapshot to the session branch so the list survives reloads, rewinds, compaction, and session switches. Existing phase grouping is preserved for tasks the session already knows. Previously the list was in-memory only and the panel stayed stale, because Cursor resolves the todo tool remotely and never emits the local
todotool result that both paths key off. - Cursor todo calls the server refuses or rejects no longer leave the todo card spinning: the bridge settles every completed native todo call, not just the ones carrying a list. Local phases and the session branch are left untouched in that case, and the settling result deliberately carries no
details.phases— echoing the current list back would let a call that changed nothing overwrite live panel state. - Fixed the todo renderer emitting mirrored label text verbatim. A Cursor snapshot carries provider-authored task content, phase names, and summary text, and the renderer interpolated all of it straight into terminal output, so a label holding ANSI/C0 sequences rewrote the terminal every time the list rendered or replayed. Every display path now goes through one sanitize-and-flatten-tabs helper — task labels, blocker notes, phase headers, the zero-task fallback, and the streaming call preview — while the raw values stay untouched as the lookup keys they are.
- Fixed a server-resolved Cursor todo card animating for the rest of the session when the server packed the call's start and completion into one HTTP/2 chunk. The bridge's
tool_execution_endis a synchronous callback fired mid-parse, while the streamedtoolcall_startthat creates the visible card is queued on the event stream and delivered a microtask later — the interactive controller handled the completion first, found no pending card, and dropped it, leaving the card that appeared moments later with nothing to settle it. An early completion is now held and attached the moment the streamed block creates its card, settling it without repeating the panel refresh or failure warning that already fired on first arrival. Card creation from cumulativemessage_updateframes is also guarded by the turn's timeline map, so a call settled mid-stream can no longer be recreated as a second, permanently pending card by the next update re-listing the same block. - Cursor todo failures no longer render unsanitized provider text into the status line. The bridge forwards the server's error string verbatim, so an ANSI escape or other C0/C1 control reached the terminal intact and could repaint outside the row, tabs punched holes in the single-line warning, and a long message overflowed it. The detail is now stripped of control sequences, collapsed, and truncated at the render boundary; the persisted result keeps the full-fidelity error for the transcript.
- Fixed disabling the Advisor from
/settingsupdating the persisted setting without stopping the live Advisor runtime until the session restarted:SelectorController.handleSettingChangehad no case foradvisor.enabled, unlike other session-managed toggles (autoCompact,steeringMode, ...), so the change never reachedsession.setAdvisorEnabled. - Fixed
bash.patternsdeny/promptrules matching only against the whole command string, so a dangerous command in any non-leading position of a compound line (e.g.cd /tmp && rm -rf /tmp/x,sleep 1 & rm -rf /tmp/x) silently bypassed adenyrule and, underapprovalMode: yolo, executed with no prompt.deny/promptrules now also match each command segment, split with a shell-aware tokenizer that honors every command boundary (&&,||,;,|, single&, subshells, newlines) and quoting;allowrules still require the whole command to match and never apply to compound lines (). - Fixed legacy pi extensions failing extension validation when importing
estimateTokensfrom@earendil-works/pi-coding-agent(aliased to the legacy shim). Legacy pi re-exportedestimateTokensfrom its coding-agent package root; in omp it lives in@oh-my-pi/pi-agent-core/compactionand the coding-agent barrel does not forward it, so the shim'sexport * from "../index"left it off the surface and a named import threw Bun's static "Export named 'estimateTokens' not found" error (e.g.omp plugin install pi-blackhole). The shim now re-exports it (). - Fixed
omp auth-gateway serveadvertising only the compiled-in bundled catalog, so every model omp reaches through provider discovery (e.g. ids released after the build date) was invisible on/v1/modelsand returnedUnknown modelthrough/v1/chat/completionseven though the same broker credential answered it in the TUI. The gateway now sources its catalog fromModelRegistry— the same component the TUI/CLI use (bundled + cached + discovered) — keeping the credential scoping and qualified/bare-id registration, and rebuilds it periodically so a long-livedservetracks newly discovered models without a restart ( by ). - Fixed
debug(js-debug/pwa-node) stateful commands misrouting after launch: a lazily-attached[worker N]child session (or the threadless root launcher) would steal the active-session focus from the stopped script child, sothreadslisted only the worker thread, post-launch breakpoints read back as pending/unbound, and there was no way to step/continue/evaluate the script's thread. Focus now follows stops rather than registrations, andthreadsaggregates every live thread across the session tree (). - Fixed direct binary updates trusting an executable that only reported the expected version. The updater now selects one exact asset from the tagged GitHub release, requires its published SHA-256 digest and size, and verifies both while streaming the download before installation. GitHub release metadata requests use
GITHUB_TOKENorGH_TOKENwhen available, allowing users behind an exhausted anonymous rate limit to authenticate. - Documented that the non-PTY shell's bundled
jqcommand is backed by jaq, including its null-indexing divergence and portable filter syntax (). - Fixed advisor retry amplification after transient Codex SSE socket closures by limiting each advisor-level try to one provider transport attempt.
- Fixed
omp updateaborting withnpm error EEXISTon standalone binary installs whose directory coincides with the global npm/bun bin dir (for examplenpm prefix -gset to~/.local, which the installer also targets). The install-target resolver classified the binary as npm/bun-managed from directory containment alone, sonpm install -gtried to replace a regular file its symlink step would clobber; it now treats a plain executable (not a symlink) in a package-manager bin dir as the standalone binary and self-updates it in place (). - Fixed Codex subscription and proxy models being sent the unsupported native
{ type: "computer" }declaration based only on model ID. They now receive the callable function-tool fallback, including after switching from native OpenAI Responses history, while explicit endpoint metadata can still opt into the GA contract. Explicit native Codex replays preservecomputer_call/computer_call_outputpairing, normal CLI startup keeps the native desktop worker graph lazy, and packaged workers re-enter the single CLI host without the computer module claiming non-computer selectors. - Fixed isolated JavaScript eval subprocesses letting the global fatal-rejection handler race the cell rejection interceptor. A floated promise rejection is now folded into the owning cell result without killing its reusable worker process.
- Fixed
/contextcounting hidden, explicit-only skills (hide: true/disable-model-invocation) in the Skills category and subtracting that inflated estimate from the first system-prompt block, which reportedSystem prompt: 0 tokensand inflated Skills usage. Accounting now counts only the skills actually rendered into the system prompt — mirroringbuildSystemPrompt's filter, so hidden skills and all skills when thereadtool is unavailable contribute zero (). - Fixed Escape waiting for an in-flight
session_stopextension handler to exhaust its timeout; abort now cancels the active stop pass without reporting a false timeout or applying stale continuation context (). - Fixed Ctrl+C and fatal shutdown entering an
ExtensionExitErrorrejection loop while an extension or hook was still loading ( by by ), dropping every row above the retained tail behind an "older lines hidden" marker. The bound now keys on paint intent — bulk replacements (initial resume,/resume, handoff, resize geometry rebuilds) stay bounded, while a user-drivenresetDisplay()(Ctrl+O expand, thinking/setting toggles, display reset) replays the whole transcript (). - Corrected Windows shell resolution errors to identify the active global, project, overlay, or runtime source for
shellPathinstead of directing every user to the retiredsettings.jsonfile (). - Fixed an invalid configured
shellPathbeing silently masked whenever an earlier caller had already resolved a shell in the same process; the guidance error now surfaces regardless of cache state.
What's Changed
- fix(coding-agent): source auth-gateway catalog from ModelRegistry by
- fix(catalog): retry empty model discovery by
- fix(advisor): propagate advisor provider session id via metadata by
- fix(natives): stabilize forwarded PulseAudio capture and playback by
- fix(utils): contain ptree timeout rejections by
- fix(secrets): avoid hashline placeholder collisions by
- fix(coding-agent): restore legacy pi automode compatibility by
- feat(ai): report MiniMax Token Plan quota in usage by
- fix(prewalk): apply same-model effort downgrades instead of skipping by
- fix(advisor): notify the user when a quarantined turn drops advice by
- fix(coding-agent): route js-debug commands to the stopped script child by
- fix(catalog): keep reference-less Copilot Claude models reasoning-capable and cache-stable by
- fix(ai): break anthropic oauth↔providers circular import (claudeCodeVersion TDZ) by
- fix(session): retry reasonless tool-call aborts by
- fix(providers): add China (Beijing) region for alibaba-token-plan by
- fix(stt): resolve Windows workspace sherpa addon by
- fix(coding-agent): match bash deny/prompt patterns per command segment by
- fix(cli): defer out-of-scope default role so extension models resolve by
- fix(coding-agent): stop the live advisor runtime when /settings disables it by
- fix(tui): keep full-width overlays above inline images by
- fix(coding-agent): resume agent after /tree ask re-answer by
- fix(coding-agent): bypass extension guards during shutdown by
- fix(session): cancel in-flight session_stop handlers by
- fix(coding-agent): count only rendered skills in /context accounting by
- fix(cursor): synthesize missing exec MCP tool calls by
- fix(ai): retry statusless provider capacity errors by
- fix(plugins): restore pi-sprite legacy compatibility by
- fix(ai):strip output-only statuses from Responses replay by
- fix(ai): repair Alibaba Token Plan usage reporting by
- fix(coding-agent): self-update binary install when its dir overlaps npm/bun bin dir by
- fix(computer-use): correct Codex subscription routing by
- fix(advisor): bound Codex SSE retries by
- fix(ai): stop one Codex window's limit from blocking the others by
- feat(agent): wake steering on an event instead of polling for it by
- fix(tui): stop Ctrl+O expand truncating the session on ConPTY by
- fix(omp): fit native compaction after large tool output by
- fix(update): verify GitHub release asset and digest by
- fix(tui): make provider error blocks expandable via ctrl+o by
- fix(cursor): embed data URI for images in root-prompt history by
- fix(plan-mode): prefer newest draft during review by
- fix(utils): correct shell path config guidance by
- fix(tui): attach drag-dropped image paths with unescaped spaces by
- fix(coding-agent): re-export estimateTokens from legacy pi shim by
- fix(cli): redact credential settings in config list by
- fix(ai): disable adaptive-only thinking on disableReasoning and forced tool choice by
- fix(natives): settle macOS input before capture by
- fix(coding-agent): preserve Claude computer coordinates by
- docs: reconcile omp:// task/eval docs with 17.1.3 runtime by
- feat(catalog): add Claude Opus 5 entries for Amazon Bedrock by
- fix(catalog): downgrade forced tool choice for thinking-locked Kimi Code aliases by
- fix(natives): preserve newer cache versions by
- fix(coding-agent): handle vibe session commands safely by
- fix(ai): preserved Bedrock ARN thinking signatures by
- fix(cursor): sync native todo list from server-resolved tool calls by
- docs(bash): document bundled jaq divergence by
New Contributors
Full Changelog: v17.1.3...v17.1.4
Vollständiger Original-Bericht
Ausführliche Details, Code-Beispiele & Hersteller-Stellungnahme auf github.com.
Wie bewertest du diesen Beitrag?
1 Klick Feedback Teilen mit Netzwerk & Team:
Hat Ihnen dieser Tipp / Anleitung geholfen?
Community-Analysen & Experten-Meinungen 0
Verfasse deine eigene Analyse, teile Workarounds oder diskutiere diesen Vorfall im Blog.
Noch keine Community-Analyse verfasst. Markiere einen Textabschnitt oder klicke oben auf „ Eigene Analyse verfassen“!
Community Pulse: Relevanz-Einschätzung
1 Klick Experten-Votum 🔴 Akute Relevanz 0%
🟡 In Evaluierung 0%
🟢 Keine Auswirkung 0%
Spannende Innovation 0%
Verwandte Story-Cluster & Quellen (Vektor-KI)
Tipp: Mit Pfeiltasten [ ← ] und [ → ] blättern
SOCIAL SHARE CARD GENERATOR