github can1357/oh-my-pi v16.3.6

2 hours ago

@oh-my-pi/pi-ai

Added

  • Persisted credential rate-limit blocks across processes: auth_credential_blocks (auth schema v5) stores per-credential blocks keyed by row id + provider key + block scope with MAX-upsert semantics, AuthStorage merges persisted and in-memory blocks on read, and auth-broker snapshots/SSE carry per-entry blocks with POST /v1/credential/:id/block and DELETE /v1/credential/:id/blocks endpoints so gateway and sibling omp processes stop re-discovering exhausted accounts by burning a 429 each.

Fixed

  • Fixed Anthropic credential selection sampling Fable/Mythos-exhausted accounts on every new session: a Fable/Mythos weekly cap now proactively hard-blocks the credential when confirmed exhausted (server exhausted status or used fraction >= 1) with a live resetsAt, and a live Fable 429 extends the reactive block to the confirmed tier reset instead of the 60s default. Unconfirmed rows (missing/expired reset, below cap) remain ranking hints only, preserving the false-100% guard.
  • Fixed Ollama/Ollama Cloud tool requests failing with HTTP 400 by rewriting boolean subschemas (true/false) into a value-widening anyOf union of primitive types, stripping boolean additionalProperties/unevaluatedProperties, and flattening nullable type arrays before serializing tool parameters, so unconstrained fields still advertise "any JSON value" to grammar-constrained samplers (llama.cpp) instead of collapsing to an empty object. (#4488)

@oh-my-pi/pi-coding-agent

Changed

  • Hided abort labels for user-interruptions in the transcript to match silent abort behavior
  • Updated transcript streaming to declare settled rows for scrollback exactness: TranscriptContainer reports one boundary (finalized blocks plus the first live block's getTranscriptBlockSettledRows(), fed by markdown's frozen-token prefix — completed content blocks in a streaming reply render final and settle in full, so long replies and visible thinking reach terminal scrollback as exact bytes mid-stream). The heuristic commit machinery (deriveLiveCommitState append-only detection, stable-prefix ratchet, volatile cooldowns, rewrite floors), isTranscriptBlockCommitStable, and the per-renderer provisionalPendingPreview/provisionalPartialResult flags are all removed. Ephemeral block retraction (displaceable todo/job cards, IRC cards) is now gated on TranscriptContainer.isBlockUncommitted() — cards whose rows already entered scrollback seal in place as history instead of being removed.
  • Recovered auto-retry errors now compact in the transcript: once a retry succeeds, the superseded error rows (e.g. Anthropic 429 rate_limit_error during account rotation) render as a single dim note like rate-limited; switched account; retried across live view, rebuilds, resume, and subagent/collab transcript views, and are excluded from model context on session resume. Terminal (unrecovered) errors keep full error rendering. The persisted marker is retryRecovery on the assistant message and auto_retry_end success events carry additive recoveredErrors data.

Fixed

  • Fixed raw read ranges not contributing to edit seen-line provenance, so re-reading an anchor range with :raw now unblocks hashline edits without adding non-raw line prefixes.
  • Fixed replan-driven session title refresh updating the statusline but not the terminal window title: terminal-title updates now fire from the session-name-changed listener, so every setSessionName path (first-input titling, /rename, plan seeding, replan refresh) sets the OSC title consistently.
  • Fixed user-interrupt aborts rendering the persisted Interrupted by user label in assistant transcripts; replay and live views now suppress that redundant line again while preserving generic/custom abort labels.
  • Fixed streamed assistant text and thinking disappearing from terminal scrollback while a long turn ran, and Ctrl+O-expanded tool results showing up half-rendered above the viewport: everything that scrolls off the window now reaches native scrollback (exact bytes for settled content, a frozen what-you-saw snapshot for still-running blocks, repaired at most once when the block finalizes). Streaming eval/bash boxes no longer spray duplicated stale copies; user-initiated !/$ execution blocks report a finalization contract.
  • Fixed turn-ending provider errors rendering with a doubled blank gap above the Error: block (caller and error block each added a spacer).
  • Fixed the write tool renderer crashing when persisted runtime content is a truthy non-string value; rendering now coerces display content before Windows CR normalization. (#4495)
  • Fixed cmux-backend browser({action:"run"}) calls crashing the entire process with an unhandled rejection when the tab was released mid-run (e.g. a sibling subagent calling browser({action:"close", all:true}) or a session-scoped tab reap). runInTabWithSnapshot in tab-supervisor.ts creates a Promise.withResolvers() triple so releaseTab can signal in-flight runs, but the cmux branch used to await runCmuxCode(...) directly and never awaited the local promise. When releaseTab rejected that orphaned promise ("Tab ... was closed"), Bun surfaced it as an unhandled rejection and the top-level handler tore the whole session down, killing every other tab and subagent sharing it. Both backends now await the same promise (so pending.reject always has an attached handler AND the caller sees Tab "..." was closed immediately instead of blocking to the run's timeout), and a new pending.closeAc is composed into the cmux run's abort signal so wait(...), in-flight cmux socket calls, and the facade proxies unwind promptly when the tab is closed rather than leaking to their own timeout (#4499).

@oh-my-pi/pi-natives

Changed

  • Rewrote native grep directory search to stream while the tree is walked: a work-stealing parallel traversal feeds searchers directly, and content-mode match budgets now terminate the walk itself instead of only the search. Limited searches keep deterministic path-ordered first pages at every budget size via windowed commits, with oversized files still deferred behind normal-sized results.
  • Faster filesystem walker: gitignore/ignore state is now derived from each directory's own listing instead of up to five per-directory stat probes, per-entry allocations were eliminated through pooled directory scratch buffers and reusable path builders, and a new parallel unordered file-candidate walk API backs full-scan grep.
  • Concurrent grep calls are no longer serialized against each other, searchers are reused per worker instead of rebuilt per file, and non-multiline patterns opt into grep-regex's line-terminator fast path with a compatibility fallback.

@oh-my-pi/pi-tui

Added

  • Added Markdown.getLastRenderSettledRows(): the rendered frozen-token-prefix row count of the most recent streaming render, exposed (hard-monotone per text lineage) for native-scrollback commit gating. Frozen-prefix code blocks now syntax-highlight during streaming renders so settled rows stay byte-stable across finalize.

Changed

  • Rewrote the native-scrollback commit law around a visual-record model: whatever scrolls above the viewport enters history exactly once, in order — nothing painted ever vanishes. NativeScrollbackLiveRegion is now a single method (getNativeScrollbackLiveRegionStart) reporting an exactness boundary: rows below it commit as exact audited bytes; rows above it commit as frozen visual snapshots that are audit-exempt while their source stays live and strict-verified exactly once when the boundary passes them (a divergence recommits the final content below the frozen fragment — duplication, never loss). getNativeScrollbackCommitSafeEnd/getNativeScrollbackSnapshotSafeEnd and the heuristic promotion machinery they fed are removed.
  • Simplified committed-prefix auditing to one hard-verified mark deriving three zones (verified/newly-final/frozen); a frame that shrinks below the committed row count re-bases at the first divergence against the recorded prefix so a collapsing live suffix never re-shows or re-commits already-recorded rows.

Fixed

  • Fixed live tool/eval preview boxes spraying duplicated stale copies into native scrollback mid-run: a still-live block's scrolled rows are now frozen visual snapshots that never re-anchor while it runs; at most one repair happens at finalize.
  • Fixed streamed content vanishing above the viewport mid-turn: scrolled-off rows always reach native scrollback (as exact bytes for declared-final content, as visual snapshots otherwise) instead of being deferred invisibly.

What's Changed

  • refactor(crates): clean up first-party Rust crates by @metaphorics in #4376
  • fix(ai): sanitize Ollama tool schemas by @roboomp in #4491
  • fix(coding-agent): guard write renderer content by @roboomp in #4497
  • fix(browser): swallowed cmux tab-close rejection to prevent session crash by @roboomp in #4502

Full Changelog: v16.3.5...v16.3.6

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

NewReleases is sending notifications on new releases.