Skip to content

v2026.10.18

Choose a tag to compare

@github-actions github-actions released this 18 Oct 10:32
· 3090 commits to main since this release

@code-yeongyu/senpi

Breaking Changes

Added

  • Command monitors accept human_input: true for watches that deliver messages a person wrote (a chat or inbox bridge). Those deliveries count as new user input for a running goal (oh-my-openagent#10280).

  • Provider accounts can be ordered: RPC account_order (names or null to clear) stores the order beside the pin, and every lane that picks an account (the generic credential pool, the Claude subscription lane and the Cursor CLI lane) then tries the pin, then the first unblocked account in that order, then the rest in hash order, failing over down the list. get_provider_accounts lists accounts in effective order with ordered. A Claude session keeps the account its conversation lives on while it can serve. The TUI footer names the account the order serves. No order keeps today's behavior (#3591).

  • The pending-input lifecycle module, its store and session journal, and cross-process writer claims; not wired in yet (#3549).

  • The monitor tool watches other sessions: monitor({ type: "rpc", target: "children" | "all" | <session id, path or st_ task id>, events?, exclude?, filter?, persistent? }) lists the matched sessions on arm, then injects each status change and effect receipt as a line, and with events: "all" their content too (streaming collapsed to one line per session per 2 s). It reads every RPC host and terminal endpoint through the status stream's mirror opt-in, so it never attaches; children spawned after arming are matched by the host; a persistent watch survives a restart and reports what changed while detached (#3226).

  • --tool-runtime in-process|child (env SENPI_TOOL_RUNTIME) selects where a session's heavy tool work runs. The default is in-process and nothing changes yet; a multi-session host and a single-session --mode rpc process advertise the choice as tool_runtime:<value> in get_protocol_info. An unknown value is a startup error (except for --version and --help) (#3566).

  • dequeue_message and edit_queued_message accept expectedRevision: every queued input carries a revision (1 when queued, +1 per edit), and a change based on a stale revision answers conflict with currentRevision and changes nothing, so two clients editing one queued message can no longer overwrite each other silently. Capability queued_message_revision (#3459).

  • Terminal control endpoints serve their own session like a host: open_session by path attaches with the host's record stream and replay, subscribe_sessions runs the status stream (with mirror) over that session, and steer/follow_up/prompt are delivered through the terminal's admission (the user's draft holds them) with the host's whenIdle choice, as remote deliveries; fields admission cannot carry (images, thinkingLevel, ...) are refused by name. admitExternalMessage gains whenIdle (start default, queue) (#3229).

  • SessionManager.getFullBranch() (also on ctx.sessionManager) returns the active path over the whole session history, including entries before the latest compaction (#3519).

Changed

  • Goals no longer stop after a fixed 150 automatic continuations. They stop only after 60 automatic continuations in a row without progress (no new tool effect, todo change, or new message from a person; re-running the same command, failing commands, and output that differs only in timings or ids are not progress), with a notice that says why and that any message resumes the goal (oh-my-openagent#10280).

Fixed

  • A host daemon now inherits every credential variable the engine reads, including CLAUDE_CODE_OAUTH_TOKEN, COPILOT_GITHUB_TOKEN, HF_TOKEN and numbered slots such as OPENAI_API_KEY_2, so a Claude subscription from the environment works through a host as it does in a direct process (#3531).

  • get_auth_providers reports a Claude subscription supplied by CLAUDE_CODE_OAUTH_TOKEN or an ambient Claude Code login on the subscription's sign-in row instead of its API-key row, so RPC clients show it as a connected subscription. The TUI /login picker and get_auth_providers share one rule, so a runtime --api-key never shows as a configured sign-in, and a stored subscription keeps its row beside one (#3537).

  • Opening a large session on a shared RPC host no longer stalls every other session: the transcript is read, parsed and indexed in short slices, and the tool-search history scan no longer serializes every message. On a 231 MB transcript the longest wait seen by another connection dropped from about 1 s to the level of opening an empty session (#3518).

  • A host emptied within a minute of its previous memory trim now trims once that minute ends, instead of keeping the freed memory until sessions come and go again (#3360).

  • The ripgrep grep fallback starts far fewer rg processes on the host. Explicitly named files no longer cost three launches each; they share one binary scan and one search. A capped directory walk also grows its batches instead of searching 200 files per launch. Every launch keeps its whole command line under the OS limit (32,000 characters on Windows, quoting included), so a large batch becomes several launches and no argument is truncated; a pattern or path too long for any launch fails with a clear error instead of an opaque spawn failure. A grep call over this repository now starts 5 to 14 rg processes instead of 63 to 87, with identical results (#3516).

  • RPC get_entries on a very long session no longer closes the connection: it reads in pages (limit, maxBytes, hasMore, nextSince), and an unpaged read too large for one answer (or an entry too large for any answer) returns response_too_large; RpcClient.getEntries can page (#3534).

  • A reopened session keeps only its latest compaction window in memory, so an RPC host holding long sessions no longer grows to multi-GB heaps; four of the largest local transcripts went from 1441 MB to 216 MB of live heap (#3519).

  • Usage totals no longer drop the turns a compaction trimmed, and forking or exporting (JSONL) a compacted session keeps the history from before the compaction (#3519).

Removed

@code-yeongyu/senpi-ai

Breaking Changes

Added

  • auth/pool/select: applyAccountOrder puts the accounts a user order names first, in that order, ahead of the ranked rest; withoutOrderedAccount drops a removed account from a stored order. PooledCredential gains order (#3591).
  • apiKeyEnvProviders() and providerCredentialEnvNames() list the providers and variable names the environment credential lookup reads (#3531).

Changed

  • The bundled model catalog is refreshed from models.dev and the providers' model listings (opengateway, openrouter).

Fixed

Removed

@code-yeongyu/senpi-agent-core

Breaking Changes

Added

Changed

Fixed

  • A turn you stop with a reason (abort("user stop"), or an object with a message) shows that reason, capped at 500 characters, not "Request was aborted" (#3510).
  • A turn you stop while its context transform or API key lookup is still running ends with your stop, not with "Provider stream start timed out" and advice to raise a timeout setting (#3481).

Removed

@code-yeongyu/senpi-codemode

Breaking Changes

Added

Changed

Fixed

Removed

@code-yeongyu/senpi-tui

Breaking Changes

Added

Changed

Fixed

Removed