v2026.10.2
Breaking Changes
Added
-
Added inherited
quietStartup: "header", which keeps the startup header with version and key hints but hides the model scope line and loaded-resource listing.trueandfalsekeep their meaning. See Settings. -
Added an inherited copy code login method to Anthropic
/loginfor headless setups where the browser runs on another machine (#10194 by @lucasmeijer). -
Added inherited Anthropic workload identity federation from the
ANTHROPIC_FEDERATION_RULE_ID,ANTHROPIC_ORGANIZATION_ID, andANTHROPIC_IDENTITY_TOKEN_FILEenvironment variables (see Providers) (#10177, #10242 by @philfreo). -
/reloadnow enables tools newly added to thedefaultToolssetting (inherited). Tools removed from it stay enabled, tools turned off during the session stay off unless newly added, and--tools,--no-tools, and--no-builtin-toolsstill override the setting (#10245). -
Shared RPC hosts report
runtimeBuildId, a content digest of the runtime they loaded at startup (engine files, plugins, flavour, platform), inget_protocol_infoandhost status, andhost ensurereports theclientRuntimeBuildIdit would launch, so a client can tell two builds of one version apart and see a bundle replaced in place.senpi host handoff --when idle --operation <id> --if-instance <id> --if-generation <n> --target-build <id>asks the running host to hand over to the caller's runtime at its next idle point: it stops admitting new work, lets running turns finish, never aborts one, answershandover_pendingmeanwhile, and keeps serving if the successor does not come up. A repeated operation id returns the existing operation. -
Settled user questions identify their answering surface (
resolvedBy) in tool results,ask-user:settlednotifications, and RPCquestion_resolvedframes. Extensions can also observe the newask-user:closedevent once for every terminal outcome, including silent cancellations;ask-user:settledkeeps firing for the same outcomes as before (#2533). -
RPC clients can retry prompts, steering, and follow-ups with durable client message and turn IDs without duplicating an accepted input. Admissions and prepared queues survive transcript reopen (including a started prompt displaced into the queue by a concurrent run, and a transcript holding an unreadable admission entry), conflicting payloads and a non-numeric
enqueueOrderare rejected, and queue records and turn events echo the IDs. Hosts advertisedurable_client_message_id(#1971).
Changed
--providerwithout--modelnow fails with an error instead of being ignored and running the default model of another provider (inherited, #10236).RpcClientstarted with onlyproviderkeeps its previous behaviour: it forwards--provideronly together with--model, so the spawned host still runs the default model.
Fixed
-
Anthropic sessions behind a relay that rejects replayed native tool-search results no longer stay stuck on
Tool reference '<name>' not found in available tools(for examplegenerate_imageright after atool_search_tool_bm25search). The rejected request is retried once with the search results replayed as text, the tools themselves stay available, and the rest of the session sends the text form directly (#2568). -
After a shared RPC host handoff, the replaced generation no longer deletes the successor's registration or boot settings on its way out. A predecessor that noticed its socket taken over before the handoff recorded the successor could remove both, so the next client attached to the running successor reported
pid: 0, and the next handoff lost the endpoint's lifecycle policy. A taken-over generation now removes only its own records (#2536). -
RPC prompt acknowledgement waits now account for observed conversation compaction instead of reporting failure after 30 seconds while the same input can still be admitted later. The real host response remains authoritative, waiting stays bounded, and transport failures still reject immediately (#2548 by @namseokyoo).
-
When one model family's usage limit runs out on an Anthropic subscription account (for example "You've reached your Fable limit"), only that family is blocked on that account, until its own reset. Opus and Sonnet on the same account keep serving, the fallback chain moves only the limited model to its next rung, and
/claude-accountand/accountshow the block as "blocked for fable until ...". Session and weekly limits, auth failures and disabled accounts still block the whole account, and existing account-level cooldowns are honoured until they expire (reported in oh-my-openagent#9421 by @hsnam-OBELAB) (#2555). -
Reloading or replacing a session while a monitor is watching no longer kills the process with "This extension ctx is stale after session replacement or reload". The footer's once-a-second monitor ticker now stops when its session's context is retired and starts again with the next live session; any other footer error still surfaces. A context retired by a reload is now recognized as stale too, so the goal footer tickers also stop on a reload instead of rethrowing (#2549 by @rhyme227).
-
The PR changelog gate no longer fails with
spawnSync git ENOBUFSonce a changelog grows past one mebibyte, which every pull request touching this changelog hit after the 2026.10.1-3 release. -
Clipboard images pasted with Ctrl+V now attach in direct local Warp-on-WSL sessions by handling Warp's empty bracketed-paste event. Raw Ctrl+V and Alt+V remain supported, without changing non-empty text paste or other terminal defaults (#2538 by @deopa0402).
-
Configuration hot-reload ignores creation of an empty project configuration directory or task runtime state, while still discovering real configuration added at the same time or later. It also waits for admitted first requests and rechecks readiness after asynchronous reload vetoes (omo#9363, omo#9365).
-
Long sessions stay responsive: typing, streaming a reply and background events no longer re-render the whole transcript on every frame. Finished messages and tool cards are rendered once and reused, read cards no longer walk the filesystem per frame, and the footer no longer re-counts context tokens over every message. In a 10,000-entry session a keystroke now appears in about 4 ms at p95 instead of about 30 ms, and the event loop no longer stalls while typing. A burst of background events (monitor, task or background-command notices) arriving while the agent works is answered in one turn instead of one turn per event, and an animated entry that scrolled into the terminal history no longer forces the whole transcript to be rewritten. In the regular mode the terminal now keeps the recent history (its own scrollback size where readable, else about 2,000 lines) under a line such as "9,700 earlier messages · /tree to browse, or switch to fullscreen", so resuming a 10,000-entry session accepts typing in under 1 s instead of 2-4 s; the session,
/tree, fullscreen, copy and export keep everything. Each background-triggered turn also stopped copying the whole session several times and re-parsing skill MCP declarations, so in a 10,000-entry session typing during a burst of 20 events per second stays responsive. A 50,000-entry session also uses about as much memory as a 10,000-entry one, and rows that scroll above the kept history drop their rendered lines; memory still grows with the entries a long event stream adds (#2537). Recording a shown tip no longer freezes typing while another senpi process holds the settings lock. Thanks @deadcode-walker, whose analysis in #2219 helped locate the per-frame costs (#2508). -
A long session that was compacted could later reuse the id of an entry that compaction had trimmed from memory; the next resume then hung on "opening session" forever. Ids now stay unique across the whole session file, and a file that already has a duplicated id opens normally and no longer freezes
/tree. Thanks to @jc01rho for the report. (#1247, #2508) -
Fixed inherited user messages in the transcript keeping two full-width copies of every rendered line; they keep one, with identical output.
-
Fixed inherited
systemtheme making pastel palettes such as Catppuccin Frappe much more vivid; palette colors now keep their chroma (#10255, #10293 by @dgtlntv). -
Fixed inherited slash command autocompletion not triggering when the input starts with whitespace (#10218 by @haoqixu).
-
Fixed inherited color bleeding past mouse selections and search highlights in fullscreen mode when a styled token ends at the highlight boundary (#10169).
-
Fixed inherited memory retained per rendered message in the transcript; a long assistant message keeps about a fifth of the heap it kept before.
-
Fixed inherited new sessions intermittently ignoring the saved default model, or warning that no models are available, when it belongs to an extension-registered native provider with a stored credential (#9962, #10190 by @davidbrai).
-
Fixed inherited prompt submission slowing down with session length, because resolving the session's model selection looked up the model catalog once per assistant message (#10198).
-
Fixed inherited model lookups slowing down for providers with a refreshed remote catalog, because merging remote catalog models took quadratic time.
-
Fixed the inherited
built-in-tool-renderer.tsandminimal-mode.tsextension examples removing the built-in tools' summaries and guidelines from the system prompt (#10072, #10193 by @christianklotz). -
Fixed inherited context overflow detection for Z.AI CN endpoint
Prompt exceeds max lengtherrors (#10208). -
Fixed inherited Anthropic requests failing when a tool schema uses keywords Anthropic strict tool use rejects, such as
minimum/maximum; such tools are now sent non-strict (#9953). -
Fixed inherited extension commands registered without a string name or handler crashing on
/; the extension now fails to load with an error instead (#10054).
Removed
Other packages in this release
AI providers (pi-ai)
Breaking Changes
Added
-
Added the inherited lightweight
@earendil-works/pi-ai/modelsentry point for model collections and provider construction without loading TypeBox, built-in catalogs, or provider SDKs. -
Added inherited Anthropic workload identity federation from the Anthropic SDK environment variables
ANTHROPIC_FEDERATION_RULE_ID,ANTHROPIC_ORGANIZATION_ID, andANTHROPIC_IDENTITY_TOKEN_FILE(plus optionalANTHROPIC_SERVICE_ACCOUNT_IDandANTHROPIC_WORKSPACE_ID). API keys andANTHROPIC_AUTH_TOKENtake precedence (#10177, #10242 by @philfreo). -
Added an inherited copy code login method to Anthropic OAuth, next to the fork's browser login with manual code fallback. Copy code login shows the authorization code on Anthropic's page for pasting and works when the browser runs on another machine (#10194 by @lucasmeijer).
-
OpenGateway models refresh at runtime once OpenGateway is configured: a chat model the gateway starts serving appears without a senpi release when the gateway publishes its price and context window (or it is a serving tier of a shipped model), sized and priced from the gateway's own listing and price table; a model the gateway retires or stops listing disappears. A failed refresh keeps the last good list. (#2552)
Changed
-
OAuth browser pages show the logo in color (inherited).
-
The OpenGateway catalog now takes context windows, max output, and prices from the gateway itself, and
-ultrafastserving tiers inherit their base model's capabilities. It addsdeepseek/deepseek-v4.1-flash-ultrafast,z-ai/glm-5.3-ultrafast, andz-ai/glm-5.3-flash-ultrafast, and corrects 20 models, includingmoonshotai/kimi-k3-ultrafast(max output 20,480),anthropic/claude-sonnet-4-6(max output 64,000),anthropic/claude-sonnet-4-5(context 200,000), and the DeepSeek, GLM, and Qwen prices the gateway bills. A daily job now opens a refresh PR whenever the gateway's catalog changes. (#2552)
Fixed
-
A request that replays a
tool_referenceand is rejected by an Anthropic-compatible relay with400 Tool reference ... not found in available toolsis retried once with the replay turned into text, and the tools those references named stay callable. Thanks to @ldz281. (#2568, #2574) -
Fixed inherited context overflow detection for Z.AI CN endpoint
Prompt exceeds max lengtherrors (#10208). -
Anthropic requests no longer fail when a
strict: "prefer"tool schema uses keywords Anthropic strict tool use rejects, such asminimum/maximum; such tools are sent non-strict through the shared constrained-sampling policy (inherited, #9953). -
OpenAI Responses requests no longer fail with
Expected an ID that begins with 'ctc'when replaying grammar tool calls from another provider or a gateway (inherited). -
Regenerating model catalogs without
--strictwhile OpenGateway is unreachable keeps the last good OpenGateway catalog instead of shipping it empty. (#2552) -
A faux provider registered through
@earendil-works/pi-ai/compatnow keeps answering afterresetApiProviders(), which a session reload runs, both globally and inside the provider scope it was registered in. Before, a request sent after a reload failed with "No API provider registered", and when the faux API id contained a word the retry classifier treats as transient, the failure sat in a retry backoff for over 15 seconds. (#2542)
Removed
Code mode (senpi-codemode)
Breaking Changes
Added
- An eval regression gate records the full prompt and schema surfaces, helper witnesses across five required runtime legs, codemode-scoped eager imports, measured teardown resources (including global, named-import, promise and AbortSignal timers, named by creation site) and legacy contract results against a frozen baseline. CI provisions every interpreter and publishes the report; unrelated host imports and slow child startup cannot cause a regression failure. (#2452)
Changed
Fixed
-
Fixed Mistral-hosted GLM 5.3 omitting required
evalrun fields when tool use is forced. (#2444 by @urbanbreach) -
Anthropic-compatible gateways that reject an
enuminside a rootanyOfbranch (HTTP 400, code 11133) accept theevalschema again. (#2569, reported and verified by @DevNewbie1826) -
Reloading or replacing a session while a detached eval cell is running no longer kills the process from the footer's elapsed-time ticker. The ticker stops when its session's context is retired and starts again with the next session's cells; any other footer error still surfaces (#2549 by @rhyme227).
-
JavaScript eval cells run in the session's project directory: a relative path in
Bun.file,Bun.write,node:fs,path.resolve,Bun.$, spawned children, orBun.Globnow resolves inside the project instead of the host process directory, which madeBun.file("src/todo.ts")fail with ENOENT in desktop threads and under--cwd. A missing or deleted session directory fails the cell withCodemodeSessionCwdUnavailableErrorinstead of falling back to another directory. The bash tool's working directory is unchanged (omo#9371). -
Stop now explicitly reports when a running
Bun.$wait forces the JavaScript kernel to restart and clears its variables, and recommendsBun.spawnor the bash tool for stoppable commands. Native shell semantics remain unchanged. Thanks to @floweredao for the investigation (#2475); native cancellation remains tracked in #2453.
Removed
Terminal UI (pi-tui)
Breaking Changes
Added
- Exported
isWarpWslSession()so clipboard handling can reuse the hardened direct-local Warp-on-WSL predicate without duplicating terminal detection; existing Shift+Enter normalization remains unchanged (#2538 by @deopa0402).
Changed
Fixed
-
Frames over long output no longer re-scan every line: a frame whose line count changed reuses the unchanged normalized prefix, image presence is measured once per frame, and the main-screen renderer no longer walks the whole component tree and copies every line on each frame. Components can report
getRenderRevision(), a change signal that containers caching their children's output use to tell when a child must render again (#2508). -
Fixed inherited color bleeding past mouse selections and search highlights in fullscreen mode when a styled token ends at the highlight boundary (#10169).
-
Fixed inherited memory retained per rendered message:
Markdownholds its parsed tokens weakly, andMarkdown,Text, andBoxflatten their cached lines. A long assistant message keeps about a fifth of the heap it kept before. -
Fixed inherited slash command autocompletion not triggering when the input starts with whitespace (#10218 by @haoqixu).
Removed
Agent core (pi-agent-core)
Breaking Changes
Added
Changed
Fixed
- In
one-at-a-timefollow-up and steering modes, consecutive queued non-user messages (custom notices) are delivered together in one turn; user messages are still delivered one per turn and in order (#2508).
Removed
Server (senpi-server)
Breaking Changes
SessionMetadatais now exported by the server package and requires onlyid; the package no longer depends on the agent core package (inherited). The testingTestServerHostkeeps an in-memory session map instead of aMemorySessionRepo, andTestHarnessexposesmetadatainstead ofsession.