Repository navigation
v2026.10.12
@code-yeongyu/senpi
Breaking Changes
Added
-
The interactive editor paints OmO's reserved prompt keywords (
ulw/ultrawork,mass ulwand its aliases,ulw plan,ulw loop,ulw research) with the same per-character rainbow as the OmO desktop composer, only where the OmO engine would arm them (not inside identifiers, paths, URLs, quotes, relayed headers or "do not load ..." sentences): truecolor gradient, 256-colour fallback, and no decoration underNO_COLOR. Cursor, selection and wide-glyph widths are unchanged.findReservedKeywordSpansandfindReservedKeywordRunsare exported (#3160, requested by @code-yeongyu). -
Session-scoped
eval_cells.list,eval_cells.peek, andeval_cells.stopRPC commands and typed client methods expose live/recent eval cells, bounded UTF-8 output tails, and confirmed stop outcomes without model tool calls or history entries. Detached stops preserve the existing completion notification; RPC clients can consume the already-forwardedwake_source_stateevent (#3072). -
Extensions can use
ctx.getCompactionModel()to resolve a usable summary model without changing the active session selection. Healthy builtin compaction retains the current model; a spent account can use the held target, configured summary override, or an authenticated alternate with sufficient context capacity (#3131).
Changed
-
ChatGPT subscription GPT-6.1 Sol, Fast and Ultrafast now default to a 500,000-token context budget, with compaction and context-usage accounting following that window (#3150, requested by @code-yeongyu).
-
Web search uses the active model's in-turn server tool first on enabled routes. Existing direct Anthropic/Claude OAuth and OpenAI/Azure defaults are preserved; ChatGPT subscription search is enabled, and newly supported xAI Responses, Google Vertex and AI Studio, OpenRouter and compatible Anthropic gateways require explicit opt-in. Search-specific failures enable one standalone fallback and record its reason; cheaper auxiliary models remain defaults only on routes without an enabled server tool (#3122, requested by @code-yeongyu).
-
Server search remains default-on for direct Anthropic/Claude OAuth and OpenAI/Azure, unchanged from main, and is default-on for the live-verified first-party ChatGPT/Codex subscription route (except Spark). Gateways including ccapi and GLM coding plan on z.ai's Anthropic endpoint require
compat.supportsWebSearch: true; xAI Responses, Google Vertex and AI Studio, OpenRouter, Moonshot PAYG, Z.AI PAYG and Sonar native-bypass routing also require explicit compatibility opt-in. Kimi for Coding and DeepSeek are not live-verified and do not gain default-on search. A differentnativeModelsetting is ignored on enabled server-search routes: main search and fallback use the session model (#3122, requested by @code-yeongyu).
Fixed
-
A finished bash session no longer keeps its headless terminal screen (10,000 lines of scrollback plus replay history, about 20 MB for a 4,000-line output) until the 32-session limit evicts it; it keeps its final visible screen and its bounded output, so long sessions and task hosts no longer grow with every shell command (#3171).
-
A turn no longer fails when the session is replaced, reloaded, or disposed while its first
turn_endoragent_before_settleboundary preview is being built: the retired extension runner now stands down on that step like every other boundary step, discarding drafts and continuation without reporting a stale-context error (#3101). Thanks to @MoerAI (#3145). -
Prompts and timeout retries after accepted compaction no longer stop with "Context remains above the compaction threshold because compaction did not complete" because of pre-compaction usage, including when an extension message follows the checkpoint. Failed compaction preserves previous usage, and the existing first-response stale-usage exemption remains in place (#3137).
-
Internal control sockets keep their short-path fallback inside the configured temporary directory when it fits the Unix socket path limit (#3103).
-
Prompt-cache prewarm is now opt-in through
promptCache.keepAlive.enabled, which defaults tofalse: prewarm is off by default. When enabled, it starts only on the first composer edit, never on session start, resume, fork, reload, restored drafts, or extension UI text insertion. Submitting the first prompt uses that real request to warm the cache without an extra call. Restored Anthropic history also waits for first activity before scheduling keep-alive; completed turns, including extension-driven turns, retain their existing idle keep-alive behavior. Clipboard images dropped during compaction do not count as edits (#3140). -
Shared RPC hosts advertise
stoppingas soon as shutdown or draining begins and return a typedhost_stoppingrefusal to racing session opens. On supervised hosts this replaceshost_drainingfor opens during a drain; RPC clients matching the old code must handlehost_stopping. Bare hosts retainhost_draining. Launch-owning callers wait for the stopping generation to exit before starting a successor.senpi host status --jsonand eachstatus --allrow addlifecycle: "ready" | "stopping" | null; an unserved socket keeps the same field set withlifecycle: null(#3059). -
Resuming after accepted compaction uses the compacted summary and retained messages instead of pre-compaction provider usage, so a session that now fits is not refused or compacted again. Fresh provider usage supersedes the estimate on the next response (#3062).
-
Zero-attempt terminal failures still explain provider-requested long waits and retry-delay caps; only an initial account-usage failure omits a redundant retry-end event. RPC entry events, entry history, and trees now carry the same structured account-limit advice as message history, and reset parsing uses injected clocks (#3131).
-
Account-wide usage limits skip all fallback models on the spent provider and fail immediately when no other provider can serve. Manual and held-switch compaction use a usable model, and limit errors name the provider, reset hint, and
/modelor fallback configuration instead of raw 429 JSON (#3131). -
Locally refused prompts no longer extend a spent account's suppression window. Provider reset hints and retry-after delays bound that window, and an explicit
/modelselection clears it for a deliberate probe (#3131). -
Account-limit advice and its structured scope remain consistent between live messages, restored transcripts, and RPC
get_messages; the TUI no longer reports zero failed retry attempts when a turn failed without retrying (#3131). -
Cross-route Moonshot sanitization preserves intentional empty tool arrays on main requests with tool history when no declaration was removed, retaining compatibility with LiteLLM-style proxies (#3122).
-
Server-search failures are remembered for the actual failed request model across prompts and model switches. Cache-friendly compaction retains the original payload hook and exact main-turn tools/include prefix. Standalone summaries, titles and default projections exclude only server-search tools, preserve client
web_search, and do not add empty tool arrays. Fallback preserves provider-built function schemas and Google's single function-declaration entry. Moonshot's opt-in echo tool cannot be discovered or lazily activated through tool_search, and its declaration is stripped from non-Moonshot requests (#3122).
Removed
@code-yeongyu/senpi-ai
Breaking Changes
Added
- Assistant messages can carry a redaction-safe
errorCausefor usage limits, preserving account or model scope when the session replaces provider text with recovery advice (#3131).
Changed
-
The bundled model catalog is refreshed from models.dev and the providers' model listings (
openrouter,vercel-ai-gateway). -
ChatGPT subscription GPT-6.1 Sol, Fast and Ultrafast now default to a 500,000-token context budget, with compaction and context-usage accounting following that window (#3150, requested by @code-yeongyu).
-
xAI catalogs select the documented Responses
web_searchshape without enabling search by default; routes require explicitcompat.supportsWebSearchPreview: true. Google Vertex and AI Studio models now support typedcompat.supportsWebSearchopt-in (#3122).
Fixed
-
An Anthropic session no longer wedges once a replayed native web search result expires. A request rejected with
400 Invalid \encrypted_content` in `search_result` block` is retried with the expired search turned into text (query, result titles and URLs), newer search results keep replaying unchanged, and the session remembers the demotion (#3201). -
The shared provider-failure formatter explains account-wide usage limits with the provider, reset hint, and model-switch recovery instead of raw 429 JSON (#3131).
-
Responses search declarations honor endpoint compatibility, and completed/failed
web_search_callitems replay only on the same provider/API/model. Opted-in GLM coding-plan Anthropic requests now preserve paired nativetool_resultblocks during replay as well as displaying them in the response; a zero server-search usage counter does not hide those blocks (#3122). -
Fixed Gemini 3+ (Vertex and AI Studio) rejecting replayed tool-call history with 400 "Function call is missing a thought_signature in functionCall parts". When an assistant step in the current turn lacks a usable thought signature on its first tool call, calls and paired results replay as text with inline image support; earlier turns and steps with a valid first signature retain structured replay. The current turn ends at the last user message carrying content, an image-only user turn included (#3055). Thanks to @Bearmancer.
Removed
@code-yeongyu/senpi-agent-core
Breaking Changes
Added
Changed
Fixed
Removed
@code-yeongyu/senpi-codemode
Breaking Changes
Added
- Session-owned eval cell RPC handlers share the eval tool's manager, bound output tails, return typed unknown-cell failures and confirmed stop snapshots, and preserve ordinary detached completion notifications (#3072).
Changed
- The eval tool's stop action also cancels listed running foreground cells, returning their terminal outcome. Concurrent stops await the same interrupt and confirm whether kernel state survived (#3072).
Fixed
- Pip installs preserve successful results, typed install errors and cancellation when scratch cleanup fails. Cleanup retries before reporting exhausted retries as a warning (#3103).
Removed
@code-yeongyu/senpi-tui
Breaking Changes
Added
EditorTheme.keywordHighlight(EditorKeywordHighlight) decorates keyword runs per character with the offset inside the run, so a gradient stays continuous across wrapped rows; a mention or the cursor grapheme takes precedence, and row widths never change (#3160, requested by @code-yeongyu).
Changed
Fixed
PI_TUI_DEBUGrender dumps honor the configured OS temporary directory instead of writing to a hard-coded/tmp/tuipath (#3103).
Removed
@code-yeongyu/senpi-pty
Fixed
- A terminal screen's replay history (up to 1,000,000 chars per terminal) is kept as flat strings:
sanitizeStringno longer builds its result one character at a time, which cost about 31 bytes per char, and an oversized chunk trimmed to the cap no longer keeps the whole chunk alive (#3170).