Skip to content

v2026.10.2

Choose a tag to compare

@github-actions github-actions released this 02 Oct 23:04
· 139 commits to main since this release

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. true and false keep their meaning. See Settings.

  • Added an inherited copy code login method to Anthropic /login for 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, and ANTHROPIC_IDENTITY_TOKEN_FILE environment variables (see Providers) (#10177, #10242 by @philfreo).

  • /reload now enables tools newly added to the defaultTools setting (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-tools still override the setting (#10245).

  • Shared RPC hosts report runtimeBuildId, a content digest of the runtime they loaded at startup (engine files, plugins, flavour, platform), in get_protocol_info and host status, and host ensure reports the clientRuntimeBuildId it 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, answers handover_pending meanwhile, 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:settled notifications, and RPC question_resolved frames. Extensions can also observe the new ask-user:closed event once for every terminal outcome, including silent cancellations; ask-user:settled keeps 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 enqueueOrder are rejected, and queue records and turn events echo the IDs. Hosts advertise durable_client_message_id (#1971).

Changed

  • --provider without --model now fails with an error instead of being ignored and running the default model of another provider (inherited, #10236). RpcClient started with only provider keeps its previous behaviour: it forwards --provider only 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 example generate_image right after a tool_search_tool_bm25 search). 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-account and /account show 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 ENOBUFS once 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 system theme 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.ts and minimal-mode.ts extension 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 length errors (#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/models entry 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, and ANTHROPIC_IDENTITY_TOKEN_FILE (plus optional ANTHROPIC_SERVICE_ACCOUNT_ID and ANTHROPIC_WORKSPACE_ID). API keys and ANTHROPIC_AUTH_TOKEN take 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 -ultrafast serving tiers inherit their base model's capabilities. It adds deepseek/deepseek-v4.1-flash-ultrafast, z-ai/glm-5.3-ultrafast, and z-ai/glm-5.3-flash-ultrafast, and corrects 20 models, including moonshotai/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_reference and is rejected by an Anthropic-compatible relay with 400 Tool reference ... not found in available tools is 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 length errors (#10208).

  • Anthropic requests no longer fail when a strict: "prefer" tool schema uses keywords Anthropic strict tool use rejects, such as minimum/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 --strict while OpenGateway is unreachable keeps the last good OpenGateway catalog instead of shipping it empty. (#2552)

  • A faux provider registered through @earendil-works/pi-ai/compat now keeps answering after resetApiProviders(), 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 eval run fields when tool use is forced. (#2444 by @urbanbreach)

  • Anthropic-compatible gateways that reject an enum inside a root anyOf branch (HTTP 400, code 11133) accept the eval schema 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, or Bun.Glob now resolves inside the project instead of the host process directory, which made Bun.file("src/todo.ts") fail with ENOENT in desktop threads and under --cwd. A missing or deleted session directory fails the cell with CodemodeSessionCwdUnavailableError instead 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 recommends Bun.spawn or 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: Markdown holds its parsed tokens weakly, and Markdown, Text, and Box flatten 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-time follow-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

  • SessionMetadata is now exported by the server package and requires only id; the package no longer depends on the agent core package (inherited). The testing TestServerHost keeps an in-memory session map instead of a MemorySessionRepo, and TestHarness exposes metadata instead of session.

Changed

Fixed