github 0xPlaygrounds/rig v0.46.0
rig-v0.46.0

2 hours ago

Added

  • (rig-mcp-client) new plugin crate rig-mcp-client (rig_mcp_client::McpPlugin), listed off in the default plugins.toml: MCP servers' tools (stdio and streamable HTTP) as <server>__<tool>, from $RIG_HOME/mcp.json and <project>/.rig/mcp.json. A project's server starts only once approved as written (/mcp approve, /mcp deny); /mcp add and /mcp remove edit the right file. McpCorePlugin and AddMcpServer let a front add its client's servers for one run. The mcpServers format with type, disabled and ${VAR} expansion, with other fields refused by name for that server only, and [mcp] connect_timeout_secs (30). A sessionless run starts no mcp.json server. Headless --tools can 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 as rig-claude-cloak and listed disabled in the default plugins.toml (by gold-silver-copper) (#2875, #2891)
  • (rig-traffic) new default plugin rig_traffic::TrafficPlugin: --traffic-log, or [traffic] log = true in settings.toml, records every model provider exchange in the session's traffic.jsonl, beside effects.jsonl. It runs on rig-cassette's traffic::TrafficLog (feature traffic), which writes each exchange as one scrubbed, versioned JSON line (by gold-silver-copper) (#2893)
  • (rig-basics) AgentsMdPlugin puts the AGENTS.md files from the working directory up to the repository root, and RIG_HOME/AGENTS.md, in the system prompt. SkillsPlugin lists skills (SKILL.md, the Agent Skills format) from .rig/skills, .agents/skills, RIG_HOME/skills and ~/.agents/skills, with /skill:<name> [text]. /login <provider> saves a provider's API key, used before its environment variable, and /logout removes it (by gold-silver-copper) (#2873)
  • (sqlite, postgres) SqliteSessionStore and PostgresSessionStore (feature memory): rig-memory sessions kept in a database shared by every process or worker. The facade's memory feature enables them with sqlite or postgres; rig_memory::conformance::check_store (feature test-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_log reports what each compaction took out (by gold-silver-copper) (#2899, #2918)
  • (agent) AgentBuilder::provider_tool and provider_tools: provider-hosted tools ride on every request the agent makes, after its function tools, and satisfy ToolChoice::Required. The run_budget example caps a run's tokens and tool calls with hooks, and test_utils::HookTestHarness (feature test-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 selections opencode and opencode-go and their models in the catalog. Ollama::anthropic_completion reaches 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::Flex and Priority, reasoning effort and top_p there. CompletionRequest::cache_points become prompt_cache_breakpoint markers on Responses from GPT-5.6 on, and OpenAiResponsesOptions::input sends caller-built Responses input items verbatim. Moonshot's Responses requests send later system messages as developer messages, 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_tokens and input_limit() read limit.input, and ModelSpec::details holds 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-terra and the Azure, Bedrock, Copilot, OpenRouter and Venice ids). Overrides of part of modalities, provider, experimental.modes or cost.context_over_200k keep 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_PRO and MIMO_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_timeout changes or disables the limit. With test-utils, the scripted MockError gains Stalled(Duration) (by gold-silver-copper) (#2880)
  • (rig) a clean interactive exit of a saved session prints a copy-pasteable rig --resume line. rig --version (-V) prints the launcher's version. rig -p and piped runs keep the agent build's output in RIG_HOME/build.log. rig plugin add <type> no longer needs --crate for 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_run refuses a run from a plugin; signals::ExitWhenUnread makes 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::claim lets 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_header and supports_output_format quirks 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, /compact keeps the earlier messages on screen above the summary, and the context counter shows ctx ? 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 auto reasoning summary, so models that summarise, such as gpt-6-astra, stream their reasoning text (by gold-silver-copper) (#2912)

Fixed

  • (rig-tools) [breaking] the shell tool waits until its command ends unless the call sets timeout_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] read returns 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. Once shell cuts an output, each kept line is cut at 2000 characters instead of a long line being dropped whole. @path image 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's cwd; ~bob is 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, not Compacted, 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. /retry is removed. The input kept across /reload is 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 --json and rig --json close every tool call and turn an exit cuts off, and the exit line comes last and names its error; a turn that ends with no answer text fails (exit 1); an unknown --tools name is refused with exit code 2 before any model call, also at a terminal; in rig -p and --json an unknown --model exits 2; a -p or --json run stops (exit 130) once nobody reads its stdout. Every line has ms, turn_end has first_token_ms, and every tool_result has cancelled. A failed run names the unanswered message (rig: not answered: <text> on stderr, a recalled event in JSON), and rig -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 reload tool and rig_basics::reload::{SELF_EXTENSION_TAG, self_extension, ReloadAsked, MAX_RELOADS, ORIGIN} are removed, while /reload stays (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.jsonl is 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 write call 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 /resume picker 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 RunInTerminal program 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, and TerminalExit::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 --tools allowlists, 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_tokens field 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 retry value past u64 saturates, and NdjsonFramer::finish drops 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: false conversation sends earlier reasoning items back instead of dropping them; MiniMax's China base URLs use api.minimax.cn (by gold-silver-copper) (#2888)
  • (rig-mongodb) MongoDbVectorIndex::new tags the client's handshake metadata with rig-mongodb and 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_order and float_roundtrip features; applications choose JSON property ordering and exact float parsing. Native gains baseline and edited (by gold-silver-copper) (#2934)
  • (core) [breaking] Native::reasoning_blob takes no Api; it reads the new Native::blob_slot, which a wire declares through ReplayTarget::blob_slots. Blob::key is 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::new takes the dialect's Quirks; openai::wire::Quirks gains catalog_priced and short_lived_key; history::IMAGE_OMITTED replaces USER_IMAGE_OMITTED and ASSISTANT_IMAGE_OMITTED; ImageDetail no longer implements FromStr. Diagnostics scrub any request header marked sensitive and every key shape redact knows (by gold-silver-copper) (#2897)
  • (providers) [breaking] Ollama is registered in two families, so the bare selection ollama is ambiguous; name ollama/openai or ollama/anthropic. Identity::session_ids is replaced by Quirks::session_header (by gold-silver-copper) (#2889)
  • (catalog) [breaking] the override key chat_tools_need_reasoning_off becomes chat_tools (ChatTools: any, never or reasoning_off); tools on Chat Completions are refused for GPT-6.1 Terra at every effort. CacheRetention::Long on Responses for GPT-5.6 and later asks for OpenAI's 12 hour prompt cache. The retired MIMO_V2_FLASH, MIMO_V2_OMNI and MIMO_V2_PRO are removed. (by gold-silver-copper) (#2880, #2956)
  • (core) [breaking] Observe::event is called for every streamed item and Recorder::event also for a stream's first, even when keep_events() is false; EffectRecord gains first_item_ms. TurnEnd::Stopped gains at and calls, rig-tui's CallState gains Stopped, and the stop note is reworded. rig_tools::attach::attached_file moved to rig_core::conversation::attached_file (by gold-silver-copper) (#2894, #2895, #2918)
  • (memory) [breaking] Summarizer::request takes the CompactReason instead of a focus string, Summarizer::instruction takes a token budget, rig_memory::output_room is removed, and ContextUse::window is renamed ContextUse::limit. MemoryStore::read_log refuses a name check_log_name refuses with InvalidInput (by gold-silver-copper) (#2880, #2890, #2894)
  • (cassette) [breaking] DirectRecordingHttpClient is removed; ProviderCassette::direct_http() gives the direct session's client, which also records streamed and non-success replies, and DirectRecorder::record_http_interaction is 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::Adapt and AdaptOutermost instead of through Adapter, Adapters and ModelStarts; per-call tools implement PerCallTool::at. The Retry event, Conversation::resume and SubagentSystems::StopRestored are removed, and a plugin that carries a turn across a restart opts in with CarryOn. A model call's connection is chosen once, after PrepareSystems::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 TranscriptRender schedule, writing through RenderBatch; looks return LookLines, and highlight and ToolCallView::header_spans are removed. The OSC 133 mark nonce comes from the variable [tui] mark_nonce_env names. TranscriptLayout::lay_out takes &mut World (by gold-silver-copper) (#2897, #2900, #2952)
  • (rig-basics, rig-tools, rig-harness) [breaking] login_chatgpt::ChatgptLoginPlugin is now login::LoginPlugin; [shell] max_timeout, ShellSettings, Shell::max_timeout, Shell::quiet, Ended::Quiet and Process::forced are removed and Process::run loses its quiet argument; Read's output is ToolOutput; PickItem gains more; ActivityStatus gains Writing; SessionPicker::show and SessionItem are removed. SessionEntry::label() no longer holds the session directory; detail() gives the compact folder and more() the full one (by gold-silver-copper) (#2873, #2874, #2900, #2913, #2917)
  • (rig-basics) [breaking] AGENTS.md is loaded only by AgentsMdPlugin, and CLAUDE.md is no longer read. An existing RIG_HOME/plugins.toml is 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)

Contributors

Don't miss a new rig release

NewReleases is sending notifications on new releases.