Repository navigation
v2026.10.19
@code-yeongyu/senpi
-
get_available_modelsreports each model's resolvedserviceTierandupstreamModelId, including a-fastalias's pairing declared only inmodels.jsonor by an extension provider. Clients that verify a child opened on the base model of a requested-fastalias no longer refuse it as a substitution (#3666). -
Esc or the turn deadline now also release an
agent_before_settle(or otheragent_endboundary) 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_sessionacceptsreason: "move"with amoveId(#3630). -
An extension handler that never settles on an agent lifecycle or boundary event (
turn_end,agent_before_settle) no longer freezes the session: pastextensionEventHandlerWarnMs(default 60 s) the session shows which extension and event it is waiting on, atextensionEventHandlerTimeoutMs(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 loggingturn_deadline_unsettled; every stage, including a failure after the host stopped waiting, is logged asextension_handler_stalledin session.log. Input queued whileagent_endhandlers run is delivered once and the session settles however many asyncagent_endhandlers run before it (#3650, #3351). -
RPC
get_pending_inputsreads the inputs in durable custody with an explicit outcome per known id, andpending_input_updatepublishes 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: falsekeeps 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_questionprompt 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/WSLENVor a/proc/versionfallback 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.comare sent gzip-compressed, as Claude Code does;compat.supportsGzipRequestBodyturns it on or off per model, and an endpoint that refuses the encoding gets the same request uncompressed once and stays uncompressed. A customfetch(or a test stub of the global fetch) forapi.anthropic.comnow receives those bodies as gzip bytes withContent-Encoding: gzipinstead of a JSON string; setcompat.supportsGzipRequestBody: falseto 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; explicitescapeTimeoutandPI_TUI_ESC_TIMEOUTsettings are unchanged (#3628).