chore(deps): update dependency can1357/oh-my-pi to v15.10.10 #54
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "renovate/can1357-oh-my-pi-15.x"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
This PR contains the following updates:
15.10.8→15.10.10Release Notes
can1357/oh-my-pi (can1357/oh-my-pi)
v15.10.10Compare Source
@oh-my-pi/pi-ai
Added
wrapFetchForCchso non-streaming OAuth callers (e.g. the web-search provider) can patch the Claude Code billing-headercchattestation into their request bodies instead of shipping thecch=00000placeholder.Fixed
websocket_connection_limit_reached: the no-content reconnect path never consulted the retry budget and never waited, hammering the endpoint forever when the limit is account-scoped. Reconnects are now budgeted and delayed like every other WS retry path, falling back to a single SSE replay when exhausted.toolcall_endwas delivered, surfacing the error instead of re-emitting the same tool calls.web_search_call) from the failed attempt into the replayed turn'sproviderPayloadand append baseline.websocket closed before open) is classified fatal and disabled WebSockets for the whole session. Failure cleanup now skips CONNECTING sockets and the pool re-joins replacement handshakes (bounded).custom_tool_call_outputitems (onlyfunction_call_outputwas folded into an assistant note) — a compaction splice that dropped anapply_patchcall while keeping its result produced a hard 400 on the default GPT-5 Codex toolset.processResponsesStreamfinalizing reasoning items via a bareitemIdcontent scan instead of the routed entry: with id-less reasoning items (local hosts), everyoutput_item.donematched the FIRST thinking block — the second item's text clobbered it and the second block was never finalized or signed.processResponsesStreamdropping tool calls and message text whoseoutput_item.addedevent was lost (lossy proxies):toolcall_endwas emitted with a dangling contentIndex while the call never enteredmessage.content, so the agent loop silently never executed it. The done handler now synthesizes the missing block; still-open tool-call blocks are also final-parsed atresponse.completedso thetoolUseoverride cannot hand the agent stale{}arguments.response.incompletewithincomplete_details.reason: "content_filter"being reported as a token-cap truncation (stopReason: "length") — the agent loop's length recovery then asked the model to "shorten" a filtered prompt. Content-filtered turns now surface as errors; usage is also populated fromresponse.failedevents, and an unknown terminal status degrades to"stop"with a logged anomaly instead of throwing away a fully-streamed response.premiumRequestsaccounting being dropped from failed/cancelled responses:populateResponsesUsageFromResponsereplacedusagewholesale and the error path threw before the success-path re-apply. The populate now preserves the field.deduplicateToolCallIdssuffixing the whole composite Responses id (callId|itemId) —normalizeResponsesToolCallIdextracts the first segment as the wirecall_idat encode time, so both copies collapsed back onto onecall_idand the request carried duplicate call/output pairs. The suffix and length budget now apply per segment.transformMessages' same-model trust rule.store: falsewhile requestingreasoning.encrypted_content(stateless-only per OpenAI), replaying custom tool calls paired with mismatchedfunction_call_outputitems (customCallIds was never threaded through), letting the SDK's internal retries (maxRetries 5) silently re-POST inside the explicit first-event deadline, and sending aprompt_cache_keywhen the caller opted out viacacheRetention: "none".onResponsenotification callback (a slow callback aborted an already-connected stream), Copilot transient-model retries re-attempting on an already-aborted signal (instant dead retry surfacing the scheduler's AbortError), CodexreasoningSummary: nullbeing coerced to"auto"(the documented omit-summary contract was unreachable), nested Codex error codes (response.error.code) being invisible to the connection-limit/previous-response recovery matchers, and the session id leaking unredacted intoPI_CODEX_DEBUGlogs via thex-client-request-idheader.processResponsesStream(shared byopenai-responsesandazure-openai-responses) ignoring the terminalresponse.incompleteevent: a max-output-tokens-truncated response ended withstopReason: "stop", zero usage, and no cost instead of"length"with the reported token counts.response.incompleteis now handled alongsideresponse.completedand counts as stream progress for the idle watchdogs.partialJsonaccumulation buffer (and a potentially stalearguments.input) afterresponse.output_item.donein the shared Responses stream processor — the function_call branch already cleaned these up.providerPayload— stale reasoning items completed before the failure were re-sent as history input on subsequent requests alongside the retry's own items.response.completedqueued just before an eager server close was discarded, turning a finished response into a spuriouswebsocket closedfailure and a full request replay. Errors now append behind pending data frames.getOrCreateCodexWebSocketConnectioncallers (prewarm racing the first request) tearing down each other's in-flight handshake — closing a CONNECTING socket rejected the other caller with a fatalwebsocket closed before open, disabling WebSockets for the entire session. Callers now join the pending handshake.toolcall_endhad already been delivered to the consumer (canSafelyReplayWebsocketOverSseguard was bypassed, re-emitting the same tool calls); the error now surfaces instead.custom_tool_call_input.deltaframes, which counted as stream progress and could keep a degenerate response alive forever with no cap on buffer growth.response.createdevent resetting the recorded time-to-first-token.xhigh; Fable/Mythos and Opus 4.7+ requests now map userhigh/xhighonto OpenRouter's Anthropicxhigh/maxeffort scale.stop_reasonfailing the whole turn after the response had fully streamed.mapStopReasonthrew on unrecognized values, and since the reason arrives on the trailingmessage_deltathe error was unretryable — the livemodel_context_window_exceededstop reason (default on Sonnet 4.5+) hit this path. It now maps tolength, and any future unknown reason degrades to a logged anomaly plus a normalstopinstead of an error.CLAUDE_CODE_MAX_OUTPUT_TOKENSclamp exists to match the OAuth wire fingerprint, butbuildParamsapplied it unconditionally, silently halving the output budget of 128k-output models (e.g. Opus 4.8) for API-key callers. OAuth requests keep the clamp.errorMessageon astopReason: "stop"assistant message. After a grammar-too-large 400 triggered the non-strict retry, the original 400 text was kept on the final message even when the retry succeeded — consumers that treaterrorMessagepresence as failure (e.g. balance probes) misclassified the turn, and the stale text suppressed later refusal explanations. The fallback is now logged instead.User-Agentheaders being silently dropped on non-OAuth Anthropic requests.enforcedHeaderKeysfiltered the header out ofmodelHeadersin every branch but only the OAuth branch set one back; the Cloudflare-gateway, bearer-gateway, andX-Api-Keybranches now forward the caller's value verbatim.fast-mode-2026-02-01beta header once a session has learned the endpoint+model rejects fast mode (fastModeDisabledprovider state), matching the already-droppedspeedparam.buildAnthropicHeadersdefaulting API-key requests onto the full Claude Code OAuth beta list (oauth-2025-04-20,claude-code-20250219, …). TheclaudeCodeBetasdefault is now OAuth-gated, matching the streaming path — the web-search header builder was the only caller hitting the default, so API-key search requests now carry just their own betas (e.g.web-search-2025-03-05). An emptyanthropic-betaheader is omitted entirely instead of being sent as an empty string.developermessages being upgraded to mid-conversationsystemturns on Opus 4.8+/Fable/Mythos 5. System content is text-only on the wire, so a developer turn carrying image blocks in an upgrade-eligible position produced a 400; it now stays ausermessage.message_deltawas not gated by the terminal-stop flag (content events and duplicatemessage_startwere), so the splice'sstop_reason/usage replaced the finished turn's — atool_useturn could be relabeledstop, and the harness then never executed the streamed tool calls. Post-terminal deltas are now logged as envelope anomalies and skipped.pingarriving beforemessage_startconsuming the Anthropic first-event watchdog: the stall was then classified as a terminal mid-stream idle timeout instead of a retryable first-event timeout. Pings no longer count as the first item but still refresh the idle deadline once content is flowing.usage/deltaobjects frommessage_start/message_delta/content_block_*envelopes crashing the turn with an unretryableTypeError; the missing payloads now degrade to logged envelope anomalies like every other malformed-frame case.applyPromptCachingplacingcache_controlonthinking/redacted_thinkingblocks — Anthropic rejects that with a 400. A thinking-only assistant turn inside the trailing cache window (e.g. followed by the syntheticContinue.pad) no longer receives a breakpoint.assistantparams reaching the wire when an empty user/developer turn between two assistant turns was dropped by the converter (e.g. an empty "nudge" submission after a length-truncated reply); Anthropic 400s on non-alternating assistant turns, and the broken triple replayed on every subsequent request. Auser: "Continue."separator is now inserted, mirroring the trailing-prefill fallback.supportsAdaptiveThinkingDisplaymisparsing bare dated Opus ids:claude-opus-4-20250514(Opus 4.0) parsed as minor20250514≥ 4.7, which silently dropped theinterleaved-thinking-2025-05-14beta for API-key Opus 4.0 requests.output_config.effortshipping without theeffort-2025-11-24beta on thinking-off requests against adaptive-only Claude models (the effort:"low" pin), and the mid-conversationsystemrole shipping withoutmid-conversation-system-2026-04-07on API-key and OAuth-utility requests; both betas are now added whenever the request can carry the corresponding field.Content-Typeand noanthropic-versionheader — the copilot branch builds its headers from scratch and Bun's fetch does not defaultContent-Typefor string bodies. Both headers are now pinned to match every other branch.PI_STREAM_FIRST_EVENT_TIMEOUT_MS=0), the client's internalmaxRetries: 5reactivated and stacked with the provider loop's 3 retries — up to 24 wire attempts with double backoff. The provider now pins per-requestmaxRetries: 0unconditionally.AnthropicMessagesClientspreadingfetchOptionsafter the core request fields, letting a caller-suppliedsignal/method/bodysilently disconnect the timeout controller or corrupt the request. Transport extras (TLS) still pass through; core fields now always win.claude-cli/2.1.160) and OAuth bootstrap (claude-code/2.1.160) pinned a stale version while/v1/messagesreported 2.1.165; both now derive fromclaudeCodeVersion.x-anthropic-billing-header:mid-text suppressing the entire Claude Code system-block injection (billing header, instruction, and cch attestation); the resumed-session guard now anchors withstartsWith.tool_use.inputstring leaves are now deep-sanitized withtoWellFormed(), while same-API Anthropic arguments stay byte-identical to keep prompt-cache prefixes stable.mergeHeadersmerging case-sensitively on the Copilot/client-options path, where a miscased user-configured header (e.g.authorizationnext to the synthesizedAuthorization) survived as two keys that theHeadersconstructor joins comma-separated on the wire.buildCopilotDynamicHeaders) and error-finalization failures now surface as anerrorevent instead of an unhandled rejection that leftstream.result()hanging forever; the spurious "cch billing placeholder not patched" warning no longer fires when the placeholder only appears in user content.@oh-my-pi/pi-coding-agent
Added
viewop to thetodotool that echoes the current list without mutating state, so the agent can recover exact task text instead of guessing it from memory.Changed
wc -l,sort | uniq -c,comm,diff) are legitimate bash, while commands that merely move, page, or trim bytes a dedicated tool can fetch remain banned — output trimming destroys data theartifact://capture would have saved.Fixed
import(...)inside functions passed to the browser tool'stab.evaluate/page.evaluatefailing with__omp_import__ is not defined. The eval/browser JS runtime rewrites dynamic-import callees to the worker-injected__omp_import__helper, but puppeteer serializes evaluate callbacks withFunction.prototype.toString()and re-runs them inside the page, where the helper does not exist. The rewriter now substitutes a guarded shim that falls back to native dynamic import when the helper is absent, so serialized code works in the page realm while in-worker imports keep resolving against the session cwd.findBlockContextLinesthen re-surfaced it under its post-edit number and the row was spliced in after the adjacent change run. New-file boundary lines are now translated back to pre-edit numbers (the compact-preview renumbering contract) and merged into a single old-numbered insertion pass — also fixing closers below a net-offset edit being dropped or renumbered incorrectly.cchattestation (viawrapFetchForCch) instead of shipping thecch=00000placeholder.deriveLiveCommitState) was all-or-nothing per block — one perpetually rewriting row (a task tool's ticking progress tree, per-agent cost/tool counters, spinner stats) suspended scrollback commits for the entire block, so once the block outgrew the viewport its static head (e.g. a task's prompt/context markdown) was neither committed nor on screen until the tool sealed, and was lost outright if the session ended mid-run. A stable-prefix ratchet now promotes leading rows that stayed visibly identical for a full 30-frame window as commit-safe, so the settled head reaches native scrollback while only the genuinely volatile tail stays deferred; a rewrite above the promoted run retreats the boundary and the engine audit recommits (duplication, never loss).</title>and cache/status lines into the interactive TUI scrollback (#2206)..claude/agents/*.mdas OMP subagents; direct task-agent discovery now only loads OMP-native.ompagent roots, while Claude marketplace plugin agents keep their existing provider path (#2209).Removed
clearOnShrinksetting and itsPI_CLEAR_ON_SHRINKenvironment variable: the rewritten renderer always clears shrunken rows exactly, so the flicker/perf tradeoff the setting controlled no longer exists. Existing config entries are ignored.@oh-my-pi/pi-tui
Fixed
findCommittedPrefixResync, exported for the stress harness's shadow ledger) samples the prefix tail SGR-stripped so theme restyles and single-row edits never trigger spurious recommits.Changed
NativeScrollbackLiveRegion) marks them final, and the visible window repaints in place with relative moves. The engine no longer probes the terminal's scroll position or guesses whether a destructive rebuild is safe — the entire ED3-risk/defer/checkpoint machinery (viewport probes, eager streaming mode, dirty-scrollback reconciliation, deferred shrink/mutation intents, streaming high-water rebuilds, ConPTY-specific defer paths) is deleted. ED3 (CSI 3 J) now fires only on explicit user gestures: session replace, resize outside multiplexers, andresetDisplay(). This structurally removes the yank / flash / duplicated-rows / invisible-until-resize failure families tracked across #1610, #1635, #1651, #1682, #1719, #1746, #1799, #1823, #1962, #1974, #2000, #2011, #2154.Removed
TUI.setEagerNativeScrollbackRebuild(),TUI.refreshNativeScrollbackIfDirty(),TUI.setClearOnShrink()/getClearOnShrink(),RenderRequestOptions.allowUnknownViewportMutation,NativeScrollbackRefreshOptions,Terminal.isNativeViewportAtBottom(),Terminal.hasEagerEraseScrollbackRisk(), and theeagerEraseScrollbackRisk/submitPinsViewportToTailcapability fields with their detectors.PI_TUI_ED3_SAFE,PI_CLEAR_ON_SHRINK, andPI_TUI_DEBUGenvironment variables (the levers they tuned no longer exist;PI_DEBUG_REDRAWnow logs the commit-ledger state per frame).What's Changed
Full Changelog: https://github.com/can1357/oh-my-pi/compare/v15.10.9...v15.10.10
v15.10.9Compare Source
@oh-my-pi/pi-ai
Added
antigravityRankingStrategyand registered it as the defaultCredentialRankingStrategyforgoogle-antigravity, so multi-account selection consumes the per-counter Antigravity usage reports (sorted ascending byremainingFractioninfetchAntigravityUsage) before falling back to round-robin — preventing the exhausted-counter credential from being chosen first when an unblocked sibling has headroom (#2187).ANTHROPIC_CURATED_FALLBACK_MODELSrather than waiting on models.dev (1M context / 128k output, adaptive thinking, $10/$50 per MTok). The model parser recognizes thefablekind so effort tiers (low→max), adaptive thinking, and Opus-4.7-style sampling restrictions apply; token limits and pricing are pinned inapplyAnthropicCatalogPolicy.Fixed
google-antigravitynot rotating to another stored OAuth account when Cloud Code Assist returns429 You have exhausted your capacity on this model. Your quota will reset after ….parseRateLimitReasonmatched the literalcapacitybefore thequota will resetsuffix and downgraded the failure toMODEL_CAPACITY_EXHAUSTED(45–75 s backoff), andisUsageLimitErrorreturned false for the same message — somarkUsageLimitReachedwas never invoked and the agent kept hammering the exhausted credential while the retry layer bailed on the multi-hourretry-after. Both paths now treat the Antigravity phrasing asQUOTA_EXHAUSTED/ usage-limit, blocking the current credential until reset and letting the session pick an unblocked sibling (#2187).cache_controlon empty assistant tool-call content. The cache marker now skips empty text and attaches to the most recent non-empty text part, avoiding HTTP 400 payloads with{type:"text", text:"", cache_control:...}."thinking.type.disabled" is not supported for this modelwhenever thinking was turned off (utility calls and forced-tool turns route through the disable path). These models accept onlythinking.type: "adaptive"; the request builder now omits the thinking field and pins the lowest adaptive effort instead of emittingtype: "disabled".OpenAI completions stream timed out while waiting for the first eventand silently retried. Mirrors the existing GLM coding-plan widening (#2177).@oh-my-pi/pi-coding-agent
Fixed
Fixed streaming thinking (and other styled assistant content) vanishing from native scrollback once it scrolled past the viewport top during a foreground turn. The transcript's append-only commit detector compared raw row bytes, so a styled paragraph wrapping onto a new row (the span-closing SGR and width padding move while the visible cells stay identical) or a streamed token pushing the last word down a line flagged the block as permanently volatile — the commit boundary froze and every later row that crossed the viewport top was committed nowhere. Rows are now compared by visible content, a wrap-shrink of the in-flight bottom line counts as append-only, and a genuine one-off interior rewrite only suspends commits until the block re-earns append-only (30 clean frames), after which the pinned emitter backfills the stalled gap contiguously. Periodically rewriting blocks (spinners, collapsing tool previews) never re-earn and stay deferred.
Fixed bracketed pastes containing multiple image file paths so each image is attached in order instead of treating the whole paste as one unreadable path.
Fixed MCP OAuth fallback prompts so the "Click here to authorize" label emits an auth-safe terminal hyperlink even when hyperlink auto-detection is unavailable, keeping non-browser MCP setup usable (#2196).
Fixed
task-spawned subagents repeating filesystem scans the parent had already completed.ExecutorOptionsand thecreateAgentSession()call insiderunSubprocess()did not forwardrules, the discovered extension paths, or the discovered.omp/tools/paths, so each subagent re-ranloadCapability<Rule>(),discoverAndLoadExtensions(), and the full.omp/tools/walk. The toolsession now cachessession.rules,session.extensionPaths, andsession.customToolPaths;runSubprocess()threads them through; andcreateAgentSession()accepts newpreloadedExtensionPathsandpreloadedCustomToolPathsoptions backed by new exporteddiscoverExtensionPaths()anddiscoverCustomToolPaths()helpers. Crucially, only path lists are forwarded — never loaded instances. Each session rebuilds its ownExtensionandLoadedCustomToolobjects so the per-sessionExtensionAPI/CustomToolAPI(cwd, eventBus, runtime, exec, pushPendingAction, UI) targets the right session; forwarding loaded instances would have routed extension handlers and custom-tool execution back through the parent. The CLI'spreloadedExtensionsshort-circuit is preserved for same-process reuse and now shallow-clones the caller'sextensionsarray so inline-extension augmentation (autoresearch + custom-tools wrapper) cannot bleed back into it (#2190).Fixed SSH tool cancellation hanging behind OpenSSH ControlMaster streams that stayed open after an Esc/user interrupt (#2180).
Fixed Windows stdio MCP servers launched through PATH shims such as
codegraph.cmdso bare commands likecodegraphresolve viaPATHEXTbefore spawn (#2174).Fixed compiled-binary extensions failing to load
@oh-my-pi/pi-*packages whenbun --compilequietly dropped one of the extra entrypoints (observed on macOS arm64 release builds): the legacy-pi compat shim's package-root override branch returned the bunfs path without checking the target was present, so the rewrite emitted afile://URL to a missing module and the #1216 fallback (scoped to the throwinggetResolvedSpecifierpath) never ran. Override targets are now validated against the on-disk filesystem at module init, missing entries are dropped, and resolution falls through to canonical lookup so Bun resolves the import from the extension's ownnode_modules(#2168).@oh-my-pi/pi-tui
Added
wrapDescriptionoption toSelectListLayoutOptions. When enabled, long descriptions wrap onto continuation rows indented under the description column instead of being silently truncated. The slash-command/skill autocomplete picker now opts in so descriptions like the bundled skills' remain fully readable at normal terminal widths.maxVisiblebecomes the picker's visual row budget so the popup height stays bounded even when items wrap (a single 5-row description withmaxVisible=3clips with the scrollbar carrying the offscreen tail). Navigation stays item-to-item, the narrow-width fallback (width <= 40) is unchanged, and theScrollViewscrollbar tracks visual rows so the thumb stays correct when items wrap unevenly. (#2169)Fixed
What's Changed
Full Changelog: https://github.com/can1357/oh-my-pi/compare/v15.10.8...v15.10.9
Configuration
📅 Schedule: (UTC)
🚦 Automerge: Enabled.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR has been generated by Mend Renovate.
1af64ea596caa5cbb52cchore(deps): update dependency can1357/oh-my-pi to v15.10.9to chore(deps): update dependency can1357/oh-my-pi to v15.10.10