Repository navigation
v2026.10.18
@code-yeongyu/senpi
Breaking Changes
Added
-
Command monitors accept
human_input: truefor 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(namesornullto 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_accountslists accounts in effective order withordered. 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
monitortool 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 withevents: "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'smirroropt-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(envSENPI_TOOL_RUNTIME) selects where a session's heavy tool work runs. The default isin-processand nothing changes yet; a multi-session host and a single-session--mode rpcprocess advertise the choice astool_runtime:<value>inget_protocol_info. An unknown value is a startup error (except for--versionand--help) (#3566). -
dequeue_messageandedit_queued_messageacceptexpectedRevision: every queued input carries arevision(1 when queued, +1 per edit), and a change based on a stale revision answersconflictwithcurrentRevisionand changes nothing, so two clients editing one queued message can no longer overwrite each other silently. Capabilityqueued_message_revision(#3459). -
Terminal control endpoints serve their own session like a host:
open_sessionby path attaches with the host's record stream and replay,subscribe_sessionsruns the status stream (withmirror) over that session, andsteer/follow_up/promptare delivered through the terminal's admission (the user's draft holds them) with the host'swhenIdlechoice, as remote deliveries; fields admission cannot carry (images,thinkingLevel, ...) are refused by name.admitExternalMessagegainswhenIdle(startdefault,queue) (#3229). -
SessionManager.getFullBranch()(also onctx.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_TOKENand numbered slots such asOPENAI_API_KEY_2, so a Claude subscription from the environment works through a host as it does in a direct process (#3531). -
get_auth_providersreports a Claude subscription supplied byCLAUDE_CODE_OAUTH_TOKENor 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/loginpicker andget_auth_providersshare one rule, so a runtime--api-keynever 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
rgprocesses 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. Agrepcall over this repository now starts 5 to 14 rg processes instead of 63 to 87, with identical results (#3516). -
RPC
get_entrieson 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) returnsresponse_too_large;RpcClient.getEntriescan 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:applyAccountOrderputs the accounts a user order names first, in that order, ahead of the ranked rest;withoutOrderedAccountdrops a removed account from a stored order.PooledCredentialgainsorder(#3591).apiKeyEnvProviders()andproviderCredentialEnvNames()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 amessage) 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).