@oh-my-pi/pi-agent-core
Added
- Added optional
AgentTool.matcherDigest(args)hook: tools whose streamed arguments encode content in a wire grammar (patch formats, escaped strings) can expose the real content they introduce, so stream-content matchers (e.g. TTSR rules) run against plain source text instead of the wire format.
Fixed
- Fixed the agent loop wedging the model when a
write/edittool call is truncated bystop_reason: length(e.g. an OpenCode Zen / Claude-3.5-Haiku turn that emits >~1000 lines of code, blowing past the 8Kmax_tokensoutput cap). The skipped tool result now surfaces an actionable hint — namingstop_reason: lengthand telling the model to split the payload into multiple smaller calls — instead of the generic "Tool call was not executed because the assistant ended its turn" placeholder, which left the auto-continue loop re-emitting the same oversized payload until the user gave up. Tools are still NOT executed when the arguments are truncated. (#1785)
@oh-my-pi/pi-ai
Fixed
- Fixed
opencode-zen/minimax-m3-free(and forward-compatopencode-zen/minimax-m3) andopencode-go/minimax-m3being routed toanthropic-messagesdespite the OpenCode Zen/Go gateways only serving these ids at/v1/chat/completions, which surfaced raw MiniMax/tool-call markup (<invoke name="bash">,<tool_call>,<description>,<cwd>,<|minimax|>) in the UI. Resolver overrides now pin these ids toopenai-completionsand the bundledmodels.jsonentries are flipped to match. (#1617) - Fixed MiniMax Coding Plan China login opening the international
platform.minimax.iosubscription page instead of the Chinaplatform.minimaxi.compage.
@oh-my-pi/pi-coding-agent
Added
- Added a bundled TypeScript rule that warns against leaving
@deprecatedcompatibility shims behind instead of finishing a refactor.
Fixed
- Fixed
/review's uncommitted-change mode in Jujutsu repositories to readjj diff --gitfrom the current workspace, so non-default JJ workspaces include their working-copy changes instead of falling back to the colocated Git checkout. - Fixed empty assistant stop retry continuations preserving auto-retry state until a non-empty assistant turn completes or recovery reaches its retry cap.
- Fixed TTSR rule conditions never matching streamed
edit/writetool calls whose wire format obscures the real content (hashline+body rows, apply_patch envelopes, JSON-escapedwritecontent). The edit and write tools now expose amatcherDigestnormalization and TTSR matches against the introduced source text, so rule regexes stay universal regardless of the active edit mode.
Changed
-
Changed the JJ utility API to mirror Git's scoped helpers: repository operations now live under
jj.repo(root,resolve,is,clearRootCache), and diff file listing is available asjj.diff.changedFiles. -
Changed the
search_tool_bm25tool description to name the hidden discoverable built-in tools (e.g.write,find,search,lsp,task) whentools.discoveryMode: "all"is active, so a model can form a targeted discovery query by name instead of guessing or falling back to shell.mcp-onlymode is unchanged (no built-ins are advertised) and theTotal discoverable tools available: Ncount still includes them.
@oh-my-pi/hashline
Fixed
- Fixed delimiter-balance boundary repair to also drop a single duplicated structural opener (e.g. a restated
foo(/if (x) {signature line surviving just above the range), not only duplicated closers. Zero-balance duplicates remain untouched.
@oh-my-pi/pi-tui
Added
- Added
PI_NO_SYNC_OUTPUT=1to disable DEC 2026 synchronized-output wrappers for terminals whose implementation is buggy or visually worse, while keeping the renderer's autowrap guards active during paints (#1765).
Fixed
- Fixed terminal resizes that land in the same render frame as streamed output splicing a phantom blank row into native scrollback and offsetting every later row by one. A height shrink (or width change carrying an append) with content overflowing the viewport fell through to the differential emitter, whose scroll math is anchored to the pre-resize viewport top and hardware-cursor row — both invalidated by the terminal's own resize reflow. Geometry-changed frames now rebuild native history when the viewport is at (or possibly at) the bottom, and defer non-destructively for a reader confirmed scrolled into history.
- Fixed Ghostty/kitty/Alacritty-style ED3-risk terminals freezing the prompt after a deferred shrink; focused keyboard input now uses the same explicit user-input viewport opt-in as autocomplete and can repaint immediately instead of waiting for a resize.
- Deferred eager live scrollback rebuilds under WSL fronted by Windows Terminal (
WT_SESSIONpresent in a Linux environment) so foreground streaming no longer emits ED3 (CSI 3 J) and yanks a reader scrolled into Windows Terminal's host scrollback; deferred rewrites still reconcile at the next prompt-submit checkpoint (#1610). - Fixed tmux (and screen/zellij) pane history gaining a complete duplicate copy of the transcript every time a deferred offscreen edit was followed by another render. Multiplexer panes never receive a destructive scrollback clear, so the dirty-scrollback rebuild path only appended the full transcript on top of preserved pane history — repeatedly. Live frames inside multiplexers now keep repainting the viewport and leave history reconciliation to explicit checkpoints, which also removes the O(transcript) write amplification per frame.
- Fixed tmux pane viewports corrupting and pane history duplicating when a resize coincides with rendering: a resize racing a streamed append reached the stale-anchor diff emitters (phantom rows in the pane), a forced render racing a resize replayed the whole transcript into preserved pane history, and the prompt-submit checkpoint did the same after any deferred offscreen edit. Geometry-changed frames inside multiplexers now repaint the viewport in place, and forced-render geometry replays plus checkpoint replays are disabled there — tmux reflows its own pane grid and its history cannot be cleared, only duplicated.
- Fixed terminal resize events whose dimensions net out unchanged by render time (rapid SIGWINCH round trips during a window drag, coalesced into one 16ms frame) being invisible to the renderer. The terminal reflows its buffer on every resize event — rows move between the viewport and scrollback and can be evicted at the scrollback cap — so diffing against the pre-resize screen splices blank phantom rows into the viewport. The renderer now tracks the resize event itself, not just the dimension delta, and routes such frames through the geometry-change repaint/rebuild paths.
- Fixed Termux terminal resizes (screen rotation or software-keyboard toggles) displacing or hiding output after the viewport height changed. Content-bearing resizes were routed to the differential emitter, whose scroll math is anchored to the pre-resize viewport, so appended rows landed too low; pure height changes were treated as no-ops, exposing blank rows that later appends could fill without growing native scrollback. Termux resizes now repaint or rebuild at the new geometry like every other non-multiplexer terminal.
- Fixed the turn-end teardown frame freezing on ED3-risk terminals (Ghostty/kitty/Alacritty/iTerm2): disabling eager scrollback rebuild now takes effect only after the in-flight frame is classified, so the loader/status removal still paints instead of deferring and leaving a stale spinner until the next keystroke.
- Fixed non-WT ConPTY terminals on Windows (Tabby, Hyper, VS Code, conhost) clearing scrollback and yanking the viewport to the top whenever streaming output or a prompt-submit rebuild arrived while the user was scrolled up. The kernel32 viewport probe describes the ConPTY pseudo-console buffer — which is pinned to the visible grid, invisible to host-UI scrollback — so it reported "at bottom" no matter where the user had scrolled, and the #1635 fix only distrusted it under
WT_SESSION, which Tabby and other ConPTY hosts never set. The probe is now removed entirely: every Windows host is treated as viewport-unobservable, live mutations defer destructive rebuilds (no\x1b[3J, no viewport movement), and native scrollback reconciles at the prompt-submit checkpoint where the Enter keystroke has already pinned the host viewport to the bottom (#1746). - Fixed emoji-presentation symbols (a default-text symbol followed by variation-selector-16
U+FE0F, e.g.⚠️,ℹ️,❤️, keycaps) measuring as 1 cell instead of 2 in the native width engine on macOS. The native scanner now keepsUnicodeWidthStras the source of truth for multi-codepoint graphemes and applies only the local macOS Hangul Compatibility Jamo character-width delta, preserving VS16/keycap sequence widths without reintroducing jamo cursor drift. - Deferred eager live scrollback rebuilds on macOS Terminal.app and iTerm2 so assistant/tool streaming no longer emits ED3 (
CSI 3 J) while their native viewport position is unobservable, preserving readers scrolled into terminal history (#1300). - Fixed width-shrink reflow leaving old-width rows in native history so later appends no longer undercount scrollback growth or duplicate wrapped content.
- Fixed hiding overlays after terminal reflow so stale dialog rows are scrubbed from native scrollback on non-multiplexer terminals.
Removed
- Removed
shouldTrustNativeViewportProbeandProcessTerminal's kernel32GetConsoleScreenBufferInfoviewport probe. No Windows environment can answer "is the user's viewport at the bottom" truthfully — under ConPTY (every modern host) the pseudo-console buffer is pinned to the visible grid so the probe always read "at bottom", and under legacy conhost the window tracks the output cursor rather than the buffer tail so it always read "scrolled up" — so the probe and its trust gate are gone;ProcessTerminalno longer implements the optionalTerminal.isNativeViewportAtBottom.
What's Changed
- fix(providers): use api key auth for OpenCode Go Anthropic models by @roboomp in #1737
- feat(coding-agent): name discoverable built-in tools in search_tool_bm25 description by @Kukkerem in #1724
- fix(ai): route MiniMax China login to minimaxi.com by @amaozhao in #1677
- fix(coding-agent): guard empty assistant stops by @superhedge22 in #1443
- fix(providers): route OpenCode Zen/Go MiniMax M3 to chat completions by @ajdiyassin in #1714
- Support JJ workspaces in review by @sundbp in #1703
- fix(agent): surface max_tokens truncation cause on skipped tool calls (#1785) by @roboomp in #1786
New Contributors
- @amaozhao made their first contribution in #1677
- @ajdiyassin made their first contribution in #1714
Full Changelog: v15.8.1...v15.8.2