@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,AuthStoragemerges persisted and in-memory blocks on read, and auth-broker snapshots/SSE carry per-entry blocks withPOST /v1/credential/:id/blockandDELETE /v1/credential/:id/blocksendpoints 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
exhaustedstatus or used fraction >= 1) with a liveresetsAt, 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-wideninganyOfunion of primitive types, stripping booleanadditionalProperties/unevaluatedProperties, and flattening nullabletypearrays 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:
TranscriptContainerreports one boundary (finalized blocks plus the first live block'sgetTranscriptBlockSettledRows(), 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 (deriveLiveCommitStateappend-only detection, stable-prefix ratchet, volatile cooldowns, rewrite floors),isTranscriptBlockCommitStable, and the per-rendererprovisionalPendingPreview/provisionalPartialResultflags are all removed. Ephemeral block retraction (displaceable todo/job cards, IRC cards) is now gated onTranscriptContainer.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_errorduring account rotation) render as a single dim note likerate-limited; switched account; retriedacross 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 isretryRecoveryon the assistant message andauto_retry_endsuccess events carry additiverecoveredErrorsdata.
Fixed
- Fixed raw
readranges not contributing to edit seen-line provenance, so re-reading an anchor range with:rawnow 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
setSessionNamepath (first-input titling,/rename, plan seeding, replan refresh) sets the OSC title consistently. - Fixed user-interrupt aborts rendering the persisted
Interrupted by userlabel 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 callingbrowser({action:"close", all:true})or a session-scoped tab reap).runInTabWithSnapshotintab-supervisor.tscreates aPromise.withResolvers()triple soreleaseTabcan signal in-flight runs, but the cmux branch used to awaitrunCmuxCode(...)directly and never awaited the local promise. WhenreleaseTabrejected 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 samepromise(sopending.rejectalways has an attached handler AND the caller seesTab "..." was closedimmediately instead of blocking to the run's timeout), and a newpending.closeAcis composed into the cmux run's abort signal sowait(...), 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
grepdirectory 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
grepcalls 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.
NativeScrollbackLiveRegionis 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/getNativeScrollbackSnapshotSafeEndand 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