Added
- (rig-mcp-client) new plugin crate
rig-mcp-client(rig_mcp_client::McpPlugin), listed off in the defaultplugins.toml: MCP servers' tools (stdio and streamable HTTP) as<server>__<tool>, from$RIG_HOME/mcp.jsonand<project>/.rig/mcp.json. A project's server starts only once approved as written (/mcp approve,/mcp deny);/mcp addand/mcp removeedit the right file.McpCorePluginandAddMcpServerlet a front add its client's servers for one run. ThemcpServersformat withtype,disabledand${VAR}expansion, with other fields refused by name for that server only, and[mcp] connect_timeout_secs(30). A sessionless run starts nomcp.jsonserver. Headless--toolscan name a tool a plugin registers in the background, such as<server>__<tool>(by gold-silver-copper) (#2938, #2948) - (rig-acp)
rig acp, an optional plugin: the coding agent for ACP v1 clients (Zed, Neovim plugins), with a rig process per session, rig's models, sign-in, tools, sessions and slash commands, permissions and forms, client MCP servers through rig-mcp-client, and history replayed from rig's own session (by gold-silver-copper) (#2948) - (rig-claude-cloak) an opt-in Linux and macOS plugin for Anthropic subscription OAuth and compatible request shaping under a separate
claude-cloak/*provider, published with every release asrig-claude-cloakand listed disabled in the defaultplugins.toml(by gold-silver-copper) (#2875, #2891) - (rig-traffic) new default plugin
rig_traffic::TrafficPlugin:--traffic-log, or[traffic] log = trueinsettings.toml, records every model provider exchange in the session'straffic.jsonl, besideeffects.jsonl. It runs onrig-cassette'straffic::TrafficLog(featuretraffic), which writes each exchange as one scrubbed, versioned JSON line (by gold-silver-copper) (#2893) - (rig-basics)
AgentsMdPluginputs theAGENTS.mdfiles from the working directory up to the repository root, andRIG_HOME/AGENTS.md, in the system prompt.SkillsPluginlists skills (SKILL.md, the Agent Skills format) from.rig/skills,.agents/skills,RIG_HOME/skillsand~/.agents/skills, with/skill:<name> [text]./login <provider>saves a provider's API key, used before its environment variable, and/logoutremoves it (by gold-silver-copper) (#2873) - (sqlite, postgres)
SqliteSessionStoreandPostgresSessionStore(featurememory): rig-memory sessions kept in a database shared by every process or worker. The facade'smemoryfeature enables them withsqliteorpostgres;rig_memory::conformance::check_store(featuretest-utils) is the contract suite a store runs (by gold-silver-copper) (#2890) - (memory)
rig_memory::migration: a chain of whole-session format steps the agent runs when it opens a session in an earlier format, keeping a copy of the session as it was. The shipped chain has no step.rig_memory::summarized_in_logreports what each compaction took out (by gold-silver-copper) (#2899, #2918) - (agent)
AgentBuilder::provider_toolandprovider_tools: provider-hosted tools ride on every request the agent makes, after its function tools, and satisfyToolChoice::Required. Therun_budgetexample caps a run's tokens and tool calls with hooks, andtest_utils::HookTestHarness(featuretest-utils) tests hooks without running an agent (by gold-silver-copper) (#2886) - (telemetry) with content telemetry on, agent completion spans record each request's effective tool definitions on
gen_ai.tool.definitions(by gold-silver-copper) (#2885) - (providers) OpenCode Zen and Go (
providers::opencode) on the Chat Completions, Responses and Messages wires, with registry selectionsopencodeandopencode-goand their models in the catalog.Ollama::anthropic_completionreaches Ollama's Anthropic-compatible/v1/messages. DeepSeek strict tools use DeepSeek's strict function calling (by gold-silver-copper) (#2889) - (openai) MiniMax, Moonshot and Groq map typed generation options on their Responses route; Doubleword gains
ServiceTier::FlexandPriority, reasoning effort andtop_pthere.CompletionRequest::cache_pointsbecomeprompt_cache_breakpointmarkers on Responses from GPT-5.6 on, andOpenAiResponsesOptions::inputsends caller-built Responses input items verbatim. Moonshot's Responses requests send later system messages asdevelopermessages, and a dialect whose endpoint returns no reasoning ciphertext is not asked for it (ResponsesQuirks::reasoning_ciphertext) (by gold-silver-copper) (#2888) - (catalog) the catalog keeps every field models.dev publishes:
ModelSpec::max_input_tokensandinput_limit()readlimit.input, andModelSpec::detailsholds cost tiers, modalities, provider overrides, service modes and lifecycle dates. Refreshed from models.dev as of 2026-10-30, with Gemini 4 Argon and GPT-6.1 Terra (openai::GPT_6_1_TERRA,chatgpt/gpt-6.1-terraand the Azure, Bedrock, Copilot, OpenRouter and Venice ids). Overrides of part ofmodalities,provider,experimental.modesorcost.context_over_200kkeep the rest, and misspelled keys inside them are reported. Models models.dev retired follow each provider's rule for an unlisted model (by gold-silver-copper) (#2880, #2956) - (xiaomimimo)
MIMO_V2_6_FLASH,MIMO_V2_6_PROandMIMO_V2_6_PRO_ULTRASPEED(by gold-silver-copper) (#2956) - (driver) a streamed reply that sends nothing for five minutes fails as the retryable
ProviderError::Stalled, timed from the last bytes received;Model::with_idle_timeoutchanges or disables the limit. Withtest-utils, the scriptedMockErrorgainsStalled(Duration)(by gold-silver-copper) (#2880) - (rig) a clean interactive exit of a saved session prints a copy-pasteable
rig --resumeline.rig --version(-V) prints the launcher's version.rig -pand piped runs keep the agent build's output inRIG_HOME/build.log.rig plugin add <type>no longer needs--cratefor rig's own plugins. A path entry for a crate of another rig checkout than the agent's is refused with a message pointing at the plain crate entry (by gold-silver-copper) (#2891, #2899, #2915) - (rig-harness)
Picker::secret(), a picker whose typed answer a front hides;AppCliExt::refuse_runrefuses a run from a plugin;signals::ExitWhenUnreadmakes a front stop once nobody reads its output (by gold-silver-copper) (#2873, #2942) - (core, memory, ecs, tools, reqwest, http, harness-protocol, rig-tui, rig-basics) smaller public additions:
BaseInput::claimlets a wire place a provider-options field itself,catalog::edit_distance,ErrorReport::context_overflow,rig_memory::check_log_name,Backoff::after,rig_reqwest::non_success_body_error,RunDir::at,RunDir::kill_left_groups,SessionDir::set_working_directory,rig_tools::process::{record_groups, list_group, unlist_group},rig_tools::attach::typed_prompts,serve::Serving::new,SseFramer's opt-in recording mode,rig_tui::diff::change_lines,rig_basics::print::Work, and the Messages dialects'Auth,session_headerandsupports_output_formatquirks with the OpenAI dialects'Quirks::routes_by_catalog(by gold-silver-copper) (#2880, #2888, #2889, #2890, #2893, #2897, #2915, #2916, #2917, #2942, #2948) - (rig-tui) the stop is drawn under the turn it cut off (
[stopped]), a tool call stopped with Esc shows· stopped,/compactkeeps the earlier messages on screen above the summary, and the context counter showsctx ?after a compaction until the next reply reports a figure. Reasoning from every provider is drawn as dimmed markdown (by gold-silver-copper) (#2912, #2918) - (chatgpt) an effort level also asks the ChatGPT backend for an
autoreasoning summary, so models that summarise, such asgpt-6-astra, stream their reasoning text (by gold-silver-copper) (#2912)
Fixed
- (rig-tools) [breaking] the
shelltool waits until its command ends unless the call setstimeout_secs: no default timeout and no stop after a quiet minute. A command on a remote host stops with its call: on a timeout, an interrupt, rig quitting, or its transport killed on this machine. A remote read whose transport was killed by a signal is tried again, and the error names the signal (by gold-silver-copper) (#2874) - (rig-tools) [breaking]
readreturns PNG, JPEG, GIF and WebP files as an image, up to 3840 KB, and refuses a file that is not UTF-8 with a clear message. Onceshellcuts an output, each kept line is cut at 2000 characters instead of a long line being dropped whole.@pathimage attachments are capped at 3840 KB too, and a read line cut short gives the byte where its rest starts and a command that shows it (by gold-silver-copper) (#2913) - (rig-tools) [breaking] a tool path whose first component is
~is in the home directory, for read, write, edit, delete, move, list, search and the shell'scwd;~bobis not expanded (by gold-silver-copper) (#2940) - (compaction) compaction and the context meter measure requests against the model's input limit, not its context window. After an overflow, the older messages are summarized in a request of their own that reads at most half the input limit. A failed or cut-off summary is recorded as
Recovering::NotSummarized, notCompacted, and summaries may use up to 32,000 output tokens. Failed notes and summary calls are retried, counted with the turn's retries. Summaries list only files whose read, edit or write succeeded and say whether the last request was answered (by gold-silver-copper) (#2880, #2894, #2918) - (rig-basics) with the compaction plugin, a request with no output limit asks for at most 64,000 tokens plus any thinking budget and 1,024, never above the catalog's output limit, instead of the whole window left; a model with no known window or output limit keeps the server's default. An unknown or denied tool call gets feedback naming the agent's allowed tools, and a third call of one missing name in a turn fails that turn (by gold-silver-copper) (#2894)
- (agent) [breaking] a failed turn puts the user's unanswered messages back in the input; press Enter to send them again.
/retryis removed. The input kept across/reloadis redacted before it is written (by gold-silver-copper) (#2895) - (agent) [breaking] a reply stopped with Esc is sent back to the model as the text it had written, so it knows what it already said. Quitting mid-turn (Ctrl+D,
/quit, closing the terminal, a signal) stops the turn as Esc does, and resuming after a quit or a crash runs nothing until you send a message (by gold-silver-copper) (#2918, #2943) - (rig-basics) [breaking] headless runs:
rig -p --jsonandrig --jsonclose every tool call and turn an exit cuts off, and theexitline comes last and names its error; a turn that ends with no answer text fails (exit 1); an unknown--toolsname is refused with exit code 2 before any model call, also at a terminal; inrig -pand--jsonan unknown--modelexits 2; a-por--jsonrun stops (exit 130) once nobody reads its stdout. Every line hasms,turn_endhasfirst_token_ms, and everytool_resulthascancelled. A failed run names the unanswered message (rig: not answered: <text>on stderr, arecalledevent in JSON), andrig -r <id> -p "<prompt>"answers the new prompt without redoing a cut turn (by gold-silver-copper) (#2894, #2895, #2915, #2942, #2943) - (rig-harness) [breaking] SIGTERM always stops the agent cleanly; SIGINT and SIGHUP do unless rig started with them ignored. The launcher kills the tool process groups an agent left when it died without stopping them (by gold-silver-copper) (#2942, #2948)
- (rig-basics) [breaking] rig's default system prompt lets the user's request set the length, detail and form of the answer, and no longer tells the model to change its own plugins and restart; the model-facing
reloadtool andrig_basics::reload::{SELF_EXTENSION_TAG, self_extension, ReloadAsked, MAX_RELOADS, ORIGIN}are removed, while/reloadstays (by gold-silver-copper) (#2899, #2939) - (rig-tui) [breaking] the prompt history is per project and keeps each text once, with the shown conversation's prompts first on Up; the old
$RIG_HOME/data/tui/history.jsonlis no longer read. Up on your own text first moves to its start and never loses it; text dropped without sending goes into the history. One Ctrl+D on an empty input quits. A recalled slash command opens no completion list, and Up and Ctrl+P in a question's answer no longer browse earlier prompts (by gold-silver-copper) (#2909, #2916, #2947) - (rig-tui) resuming a long session is several times faster and a big file streaming into a
writecall no longer slows typing: code is colored only when it is on screen. Pickers align their detail columns and page by the visible height, edit hunks no longer repeat file paths, and a diff in tool output ends its hunk at the first line that cannot be in it. The/resumepicker no longer freezes while it previews a long session, and a grapheme split between two styles is no longer cut across two rows (by gold-silver-copper) (#2917, #2941, #2952) - (rig-tui) a
RunInTerminalprogram that exits with a failure code keeps its output on screen until Enter, Ctrl+C or Ctrl+D; on unix the terminal mode from before the program is restored after it, andTerminalExit::failure()says why a program failed (by gold-silver-copper) (#2914) - (sessions) a session is saved only once an agent's conversation has a user or assistant message, and a refused session keeps its name (by gold-silver-copper) (#2899, #2909)
- (rig-harness) CLI
--toolsallowlists, including empty lists, are enforced across TUI, print and JSON from the first model request through subagent dispatch (by gold-silver-copper) (#2875) - (anthropic) streamed content and raw documents survive duplicate envelopes and block starts; empty and error tool results encode correctly; the thinking-binding beta follows the actual request; the response-only
estimated_tokensfield is no longer replayed in thinking blocks; cache-write cost estimates use the reported TTL split (by gold-silver-copper) (#2875, #2897) - (rig-http) an SSE reply whose last line ends at a CR dispatches its last event instead of dropping it, and an SSE
retryvalue pastu64saturates, andNdjsonFramer::finishdrops a trailing CR (by gold-silver-copper) (#2887) - (reqwest) error-response diagnostics are bounded to 64 KiB and keep a partial body when the read fails (by gold-silver-copper) (#2875, #2893)
- (cassette) one scrubber for cassettes and live traffic, which also scrubs credentials echoed anywhere in an exchange, URL user info, encoded query and form secrets, secret JSON fields, and OpenAI user ids (by gold-silver-copper) (#2893, #2912)
- (openai) on Groq, Doubleword, MiniMax and Moonshot Responses, a
store: falseconversation sends earlier reasoning items back instead of dropping them; MiniMax's China base URLs useapi.minimax.cn(by gold-silver-copper) (#2888) - (rig-mongodb)
MongoDbVectorIndex::newtags the client's handshake metadata withrig-mongodband its version; requires mongodb 3.4.1 or newer (by gold-silver-copper) (#2887)
Other
- (core) [breaking] rig-core no longer forces serde_json's
preserve_orderandfloat_roundtripfeatures; applications choose JSON property ordering and exact float parsing.Nativegainsbaselineandedited(by gold-silver-copper) (#2934) - (core) [breaking]
Native::reasoning_blobtakes noApi; it reads the newNative::blob_slot, which a wire declares throughReplayTarget::blob_slots.Blob::keyis now&'a str. Gemini Interactions reports its thought steps' signature as a reasoning blob (by gold-silver-copper) (#2896) - (core) [breaking] catalog pricing is decided per wire (
ReplayTarget::catalog_priced,Quirks::catalog_priced);MessagesDecoder::newtakes the dialect'sQuirks;openai::wire::Quirksgainscatalog_pricedandshort_lived_key;history::IMAGE_OMITTEDreplacesUSER_IMAGE_OMITTEDandASSISTANT_IMAGE_OMITTED;ImageDetailno longer implementsFromStr. Diagnostics scrub any request header marked sensitive and every key shaperedactknows (by gold-silver-copper) (#2897) - (providers) [breaking] Ollama is registered in two families, so the bare selection
ollamais ambiguous; nameollama/openaiorollama/anthropic.Identity::session_idsis replaced byQuirks::session_header(by gold-silver-copper) (#2889) - (catalog) [breaking] the override key
chat_tools_need_reasoning_offbecomeschat_tools(ChatTools:any,neverorreasoning_off); tools on Chat Completions are refused for GPT-6.1 Terra at every effort.CacheRetention::Longon Responses for GPT-5.6 and later asks for OpenAI's 12 hour prompt cache. The retiredMIMO_V2_FLASH,MIMO_V2_OMNIandMIMO_V2_PROare removed. (by gold-silver-copper) (#2880, #2956) - (core) [breaking]
Observe::eventis called for every streamed item andRecorder::eventalso for a stream's first, even whenkeep_events()is false;EffectRecordgainsfirst_item_ms.TurnEnd::Stoppedgainsatandcalls, rig-tui'sCallStategainsStopped, and the stop note is reworded.rig_tools::attach::attached_filemoved torig_core::conversation::attached_file(by gold-silver-copper) (#2894, #2895, #2918) - (memory) [breaking]
Summarizer::requesttakes theCompactReasoninstead of a focus string,Summarizer::instructiontakes a token budget,rig_memory::output_roomis removed, andContextUse::windowis renamedContextUse::limit.MemoryStore::read_logrefuses a namecheck_log_namerefuses withInvalidInput(by gold-silver-copper) (#2880, #2890, #2894) - (cassette) [breaking]
DirectRecordingHttpClientis removed;ProviderCassette::direct_http()gives the direct session's client, which also records streamed and non-success replies, andDirectRecorder::record_http_interactionis synchronous. Proxy recording goes through the traffic recorder, which keeps replies byte for byte and records multipart and binary request bodies (by gold-silver-copper) (#2893) - (rig-ecs, rig-harness) [breaking] extension points are ECS data and systems: model calls are adapted in
PrepareSystems::AdaptandAdaptOutermostinstead of throughAdapter,AdaptersandModelStarts; per-call tools implementPerCallTool::at. TheRetryevent,Conversation::resumeandSubagentSystems::StopRestoredare removed, and a plugin that carries a turn across a restart opts in withCarryOn. A model call's connection is chosen once, afterPrepareSystems::Edit: a held call goes to the model it was prepared for even if its agent's model changed, and a call admitted without a model fails at Start (by gold-silver-copper) (#2895, #2900, #2943) - (rig-tui) [breaking] tool, entry, content and aside renderers and call and message decorators are ordinary systems in the
TranscriptRenderschedule, writing throughRenderBatch; looks returnLookLines, andhighlightandToolCallView::header_spansare removed. The OSC 133 mark nonce comes from the variable[tui] mark_nonce_envnames.TranscriptLayout::lay_outtakes&mut World(by gold-silver-copper) (#2897, #2900, #2952) - (rig-basics, rig-tools, rig-harness) [breaking]
login_chatgpt::ChatgptLoginPluginis nowlogin::LoginPlugin;[shell] max_timeout,ShellSettings,Shell::max_timeout,Shell::quiet,Ended::QuietandProcess::forcedare removed andProcess::runloses itsquietargument;Read's output isToolOutput;PickItemgainsmore;ActivityStatusgainsWriting;SessionPicker::showandSessionItemare removed.SessionEntry::label()no longer holds the session directory;detail()gives the compact folder andmore()the full one (by gold-silver-copper) (#2873, #2874, #2900, #2913, #2917) - (rig-basics) [breaking]
AGENTS.mdis loaded only byAgentsMdPlugin, andCLAUDE.mdis no longer read. An existingRIG_HOME/plugins.tomlis not updated: rename the login plugin and add the new default plugins, as the 0.45 → 0.46 migration guide shows (by gold-silver-copper) (#2873, #2893)