github can1357/oh-my-pi v15.9.67

latest releases: v15.10.0, v15.9.69
9 hours ago

@oh-my-pi/pi-ai

Fixed

  • Fixed llama.cpp/OpenAI Responses parallel tool calls losing arguments when function_call_arguments.done events omit output_index and item_id, by routing those identifierless final-argument events through the open function calls in item order. (#1970)
  • Fixed local Ollama (openai-responses) turns failing with HTTP 400 invalid reasoning value: "minimal" when a discovered model ran with minimal (or xhigh) thinking. Ollama's OpenAI-compatible reasoning.effort only accepts high|medium|low|max|none, so discovered reasoning-capable Ollama models now carry a compat.reasoningEffortMap remapping minimal → low and xhigh → max; non-reasoning models are left untouched.

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

Added

  • Added timeout-pause and timeout-resume eval bridge status events emitted around agent()/llm() operations
  • Added a /copy picker: /copy now opens a fullscreen, outlined tree of recent assistant messages with their code blocks nested beneath (like /tree). Navigate with ↑↓, and Enter copies the highlighted node — a whole message, an individual code block, "All N blocks", or a bash/eval command interleaved with the assistant turn that issued it. A live preview pane shows the selected target, wrapping prose and syntax-highlighting code/commands.

Changed

  • Changed eval timeout accounting so delegated bridge calls now suspend the cell watchdog and start a fresh timeout window when runtime control returns
  • Changed IdleTimeout to support reference-counted pauses so overlapping delegated bridge calls keep timeout paused until all calls complete
  • Changed the default app.message.followUp binding from Ctrl+Enter alone to [Ctrl+Q, Ctrl+Enter] so the follow-up shortcut works in Windows Terminal, which does not deliver a distinct Ctrl+Enter event to console apps. Ctrl+Q mirrors the GitHub Copilot CLI default for the same action; existing remaps in ~/.omp/agent/keybindings.yml are untouched, and if another user-remapped action already claims Ctrl+Q, that user binding wins while follow-up keeps Ctrl+Enter. Ctrl+Q is also reserved by ExtensionRunner so an extension cannot register that chord and be silently overwritten by the built-in follow-up handler (#1903).
  • Changed all scrollable TUI pickers and viewports to render through the shared ScrollView right-edge scrollbar for a uniform look, replacing their ad-hoc (N/M) / [a-b/total] text indicators (search hints and the tree filter-mode label are preserved). Covers the session/resume picker, model selector, OAuth provider selector, history search, session tree selector, agent dashboard list, extension list, user-message selector, the raw SSE debug viewer, the autoresearch dashboard overlay, and the session observer overlay.
  • Changed the /model and /switch selectors to dim and skip models whose context windows are smaller than the current chat context.
  • Changed /copy command targets to appear inline with recent assistant messages instead of as a separate "Last bash command" row at the end of the picker.

Fixed

  • Fixed the idle Working... loader freezing on ED3-risk terminals with unobservable native scrollback by keeping foreground live-region rendering enabled from agent_start until agent_end, before the first assistant or tool event arrives.
  • Fixed framed tool output blocks rendering one column inset inside tool boxes; modern bordered blocks now span the same width as legacy background-filled tool boxes.
  • Fixed potential TimeoutError aborts for short timeout eval cells during long bridged agent()/llm() work where no progress events are emitted until completion
  • Fixed retry recovery to allow automatic retries without switching models when retry.modelFallback is disabled.
  • Fixed ttsr.enabled: false being ignored at runtime. TTSR rules were still being registered with TtsrManager.addRule and matched against stream deltas even when the global toggle was off, so disabling TTSR did not suppress rule injection or stream abort. The manager now gates addRule, hasRules, and #matchBuffer on the enabled flag, so disabling fully short-circuits the TTSR path. Condition rules fall through to the rulebook bucket instead of being silently swallowed. (#1767)
  • Fixed the Python eval kernel hanging on Windows during import pandas / import numpy, with SIGINT unable to recover the cell. PythonKernel.start() spawned the runner with windowsHide: true, which in Bun maps to the Win32 CREATE_NO_WINDOW flag and detaches the long-lived child from any inherited console — so native extensions like numpy/_core/_multiarray_umath.pyd (and its bundled OpenBLAS/SLEEF thread-pool init) could deadlock inside LoadLibraryExW, and GenerateConsoleCtrlEvent-based SIGINT delivery silently became a no-op. The kernel now hides its window only when the host itself has no console to share (service / piped launch); an interactive TUI launch lets the kernel inherit the parent's console, matching the behavior of python.exe invoked from cmd.exe (#1960).
  • Fixed task renderer crashing the TUI with TypeError: completeData?.map is not a function when a subagent's extractedToolData.yield slot held a non-array value. renderAgentResult (and the live-progress sibling) cast the slot to Array<{ data }> and called ?.map, but optional chaining short-circuits only on null/undefined, so a plain object made .map undefined and threw — taking down every review task render. Both sites now go through normalizeYieldData, which wraps a single object as a 1-element array and drops primitives (#1987)
  • Fixed sdk-async-job-manager-singleton tests flaking under the full parallel suite. The four createAgentSession-based cases ran on the default 5000ms per-test timeout, which two real session startups can exceed when test:ts saturates the machine across packages; on timeout the still-running test body and afterEach reset raced, surfacing a spurious "Unhandled error between tests" on the AsyncJobManager.instance() assertion. They now carry an explicit 60000ms timeout, matching the convention used by the other session-creating tests in this suite.
  • Fixed streaming eval, bash, ssh, and task call previews overflowing the live transcript viewport and cutting off their top while pending. A volatile tool block taller than the viewport could strand its scrolled-off head out of native scrollback on ED3-risk terminals (committed nowhere, repainted nowhere) until the result landed. The pending eval source preview now follows the streaming edge in a bounded 12-line tail window (newest lines pinned to the bottom, "… N earlier lines" on top) so you can watch the code being written without the box overflowing; bash/ssh commands and task context use a bounded head+tail window. Ctrl+O still lifts the cap for a full view.
  • Fixed the streaming write call preview ignoring Ctrl+O so the expand toggle was a no-op while a file was being written. Unlike the eval/bash/ssh/task streaming previews, formatStreamingContent never received the expanded flag, leaving the preview pinned to a bounded 12-line tail window even after pressing Ctrl+O — so on a large write you could not widen past the streaming edge until the tool result landed. The preview now lifts the cap to the full file (head through tail) when expanded, matching the documented streaming-preview behavior of the other tools.
  • Fixed turn-ending provider errors rendering twice — once as the transcript's inline Error: … line and again in the pinned banner above the editor (added in 15.9.5). The inline line is now suppressed while the same error is mirrored in the banner and restored to the transcript when the banner clears at the next turn, so the error stays in history without the duplicate render at the error moment.

Removed

  • Removed the /copy last|code|all|cmd subcommands; every copy target is now reachable by picking it in the /copy tree.

@oh-my-pi/hashline

Breaking Changes

  • Changed hashline file section headers from ¶PATH#TAG to [PATH#TAG] so model-authored edits use ASCII delimiters instead of a pilcrow sigil.

Fixed

  • Fixed missing-header diagnostics and copied-content prefix stripping to consistently teach and recognize 4-hex snapshot tags.

@oh-my-pi/pi-tui

Added

  • Added setPaddingX to Box so horizontal padding can be updated programmatically after creation
  • Added ScrollView, a fixed-height viewport component for pre-rendered lines with optional right-edge scrollbars and imperative scroll/page controls.
  • Added optional Terminal.hasEagerEraseScrollbackRisk() so custom/test terminal implementations can override the global ED3-risk profile without mutating the shared TERMINAL object.

Changed

  • Changed SelectList to render its visible window through ScrollView, replacing the (N/M) text scroll indicator with a uniform right-edge scrollbar (the type-to-search hint line is preserved).

Fixed

  • Fixed unknown-viewport deferred renders freezing bottom-anchored live chrome; deferred history mutations can now repaint only the active-grid bottom row with relative cursor movement, so spinner/status tails keep advancing without rewriting rows a scrolled reader can still see.
  • Fixed autocomplete popups freezing live repaint on ED3-risk macOS/POSIX terminals with unknown native viewport position; direct autocomplete shrink frames now repaint the live viewport without zero-byte deferral and preserve the old bottom anchor when padding can clear stale popup rows without duplicating committed scrollback.
  • Fixed focused Up/Down navigation on ED3-risk macOS/POSIX terminals replaying the whole transcript after dirty foreground-stream renders; selector/editor frames now repaint non-destructively instead of emitting CSI 3 J on every arrow-key move (#1962).
  • Fixed tmux (and screen/zellij) pane scrollback losing the head of a long streamed assistant reply once it grew past the visible pane, and stranding the chrome/footer in pane history after a later collapse — producing the "repeating chunks and missing sections" reporters saw when scrolling back through tmux pane history (#1974). The renderer's foreground-streaming cap-to-viewport branch (introduced in 15.9.2 for ED3-risk hosts that can checkpoint-rebuild later) also activated inside multiplexers, where checkpoint reconcile is a no-op (refreshNativeScrollbackIfDirty short-circuits because \x1b[3J cannot erase pane history). Every streaming frame clipped lines to the visible tail and reset #scrollbackHighWater to 0, so any row that scrolled above the viewport top was committed nowhere — pane history stayed empty until streaming ended. Meanwhile #planLiveRegionPinnedRender was explicitly disabled for multiplexers, but its #emitLiveRegionPinnedRepaint is built from the exact primitives tmux accepts (relative cursor moves, per-line \x1b[2K, \r\n to scroll the sealed prefix past the viewport bottom) and never emits \x1b[2J/\x1b[3J. The pinned planner now runs in multiplexers too, the cap branch skips them, and the diff/append path commits incrementally into pane history; the actively-mutating live tail stays in the visible viewport only.

What's Changed

  • fix(hashline): accept spaces in edit paths by @roboomp in #1766
  • fix(keybindings): default Ctrl+Q for follow-up so Windows Terminal works by @roboomp in #1905
  • fix(eval): stop detaching the Python kernel's console on Windows by @roboomp in #1961
  • fix(tui): avoid dirty scrollback replay on arrow input by @roboomp in #1963
  • fix(ai): preserve llama.cpp parallel tool arguments by @roboomp in #1971
  • fix(tui): honor resume clear replay before initial paint by @roboomp in #1973
  • fix(tui): commit tmux pane history during streaming via pinned emit by @roboomp in #1975
  • fix(lsp): support rust-analyzer workspace loading by @roboomp in #1977
  • test(tui): widened slash autocomplete settle slack past debounce jitter by @roboomp in #1981
  • fix(coding-agent): guard task renderer against non-array yield slot by @roboomp in #1989
  • fix(coding-agent): honor ttsr.enabled: false in TtsrManager by @QianYan-Art in #1988
  • fix(coding-agent): allow retry without model fallback by @metaphorics in #1929
  • Add ScrollView component by @enieuwy in #1969

New Contributors

Full Changelog: v15.9.5...v15.9.67

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

NewReleases is sending notifications on new releases.