Skip to content

v2026.10.19

Choose a tag to compare

@github-actions github-actions released this 19 Oct 02:59
· 6219 commits to main since this release

@code-yeongyu/senpi

  • get_available_models reports each model's resolved serviceTier and upstreamModelId, including a -fast alias's pairing declared only in models.json or by an extension provider. Clients that verify a child opened on the base model of a requested -fast alias no longer refuse it as a substitution (#3666).

  • Esc or the turn deadline now also release an agent_before_settle (or other agent_end boundary) handler that never settles: an abort that joined the open boundary used to return before the grace-and-release ran, so the session stayed streaming (#3650).

  • The engine can offload tool runs to a per-session child process over a new wire protocol - the protocol layer (framing, single admission, payload refs) lands first (internal preview, fork-only until the offload stack ships) (#3566).

  • A session can be exported for a move to another device and imported there under the same id: the device it left keeps a read-only copy and refuses writes to it, the receiver takes ownership in one atomic step, queued input travels with it, and a declined move gives the session back with its queued input. release_session accepts reason: "move" with a moveId (#3630).

  • An extension handler that never settles on an agent lifecycle or boundary event (turn_end, agent_before_settle) no longer freezes the session: past extensionEventHandlerWarnMs (default 60 s) the session shows which extension and event it is waiting on, at extensionEventHandlerTimeoutMs (default 20 min) it stops waiting, persists the turn and delivers queued input, and an Esc or the turn deadline that the run does not honour within 10 s releases such a wait instead of only logging turn_deadline_unsettled; every stage, including a failure after the host stopped waiting, is logged as extension_handler_stalled in session.log. Input queued while agent_end handlers run is delivered once and the session settles however many async agent_end handlers run before it (#3650, #3351).

  • RPC get_pending_inputs reads the inputs in durable custody with an explicit outcome per known id, and pending_input_update publishes each change with its journal cursor; the module is also exported as @code-yeongyu/senpi/pending-input (#3549).

  • Queued input with a client id is kept in durable custody: it is journaled in the session file before it is queued, delivered only after its consumption is recorded, and edited or removed in its record and the queue together; a repeated identical submit queues it once and a reused id with another payload is refused (#3549).

Breaking Changes

Added

  • anthropicSubscriptionProvider.accountFallback: false keeps managed Claude requests on the selected account instead of automatically switching accounts, including subsequent requests while that account is blocked. Automatic account fallback remains enabled by default and is independent of model fallback (#3473 by @Yoonkeee).

Changed

Fixed

  • The mouse wheel scrolls the transcript again while an ask_user_question prompt is waiting. The first notch pauses option clicking (the hint says so) and any key turns it back on. The text-selection hint now names the right modifier per terminal, including VS Code on macOS (#3604).

  • The /btw panel stays one fixed region while a running eval's expanded output grows above it; the eval rows no longer overwrite the panel or repeat in the scrollback (#3649)

  • Alt+Q restores queued messages on WSL again: Windows keybinding defaults detect WSL through WSL_DISTRO_NAME/WSL_INTEROP/WSLENV or a /proc/version fallback when the environment is sanitized, and split-delivery ESC+q reassembly uses the standard 50ms window (100ms on WSL; a lone local Escape now settles up to 40ms later) (#3628).

Removed

@code-yeongyu/senpi-ai

Breaking Changes

Added

  • Anthropic requests of 4096+ characters to api.anthropic.com are sent gzip-compressed, as Claude Code does; compat.supportsGzipRequestBody turns it on or off per model, and an endpoint that refuses the encoding gets the same request uncompressed once and stays uncompressed. A custom fetch (or a test stub of the global fetch) for api.anthropic.com now receives those bodies as gzip bytes with Content-Encoding: gzip instead of a JSON string; set compat.supportsGzipRequestBody: false to keep the old behavior (#3643).

Changed

Fixed

  • ChatGPT subscription costs for the Fast tier are estimated at 2.5x Standard on every model (was 2x), and GPT-6 Astra / GPT-6.1 Sol Ultrafast at 8x (was 6x), the rates OpenAI meters against a plan's included usage (#3670).

Removed

@code-yeongyu/senpi-agent-core

Breaking Changes

Added

  • AgentOptions.queuedInputPort: the owner of queued input claims every drain, releases every restore, and commits consumption before any queued message reaches a provider request; a rejected commit keeps it queued (#3549).

Changed

Fixed

Removed

@code-yeongyu/senpi-codemode

Breaking Changes

Added

Changed

Fixed

Removed

@code-yeongyu/senpi-tui

Breaking Changes

Added

Changed

Fixed

  • In main-screen mode the mouse wheel scrolls the terminal's scrollback again while a component holds a mouse lease: the first wheel notch hands the mouse back to the terminal, and the next key press takes it back (#3604).

  • On Windows, a WezTerm build older than 20250208-160106 (including the 20240203 stable release) now shows the image placeholder with a hint to update WezTerm instead of a blank gap: its bundled ConPTY drops Kitty graphics before they reach WezTerm. Newer WezTerm nightly builds keep inline images (#3596).

  • Rows inserted at or above the viewport top (a running tool's expanded output above a tall live area such as the /btw panel) are no longer dropped, and stale copies of the live area are no longer pushed into the scrollback on every frame (#3649)

  • Alt+key chords split across reads merge into one key when the bytes arrive within the escape reassembly window; WSL sessions get the 100ms remote window (detected by env markers or /proc/version) and an over-window gap is now deterministically treated as a lone Escape. The plain default rises from 10ms to the standard 50ms, so a local lone-Escape press (interrupt) settles up to 40ms later than before; explicit escapeTimeout and PI_TUI_ESC_TIMEOUT settings are unchanged (#3628).

Removed