
The Coding Agent Built
for Kimi, GLM & DeepSeek
A lean, native Rust coding agent for the terminal, built for Kimi (Moonshot AI), GLM (Z.AI) and DeepSeek models — with first-class Devscriptor code intelligence over MCP. Not another OpenAI-compatible shim: each request carries exactly the fields its endpoint documents.
Frontier models, lowest-common-denominator plumbing
Kimi, GLM and DeepSeek are among the strongest coding models available — and most agents reach them through a generic OpenAI-compatible interface that quietly discards what each one was built around. Rusta speaks each vendor’s own contract.
Reasoning is thrown away every turn
A generic client drops the reasoning a model streamed once the turn is over, so the model re-derives what it already worked out.
Preserved Thinking replays each stored reasoning block unchanged — what Kimi and GLM ask for, and what DeepSeek requires: a DeepSeek request that carries tools and drops the earlier reasoning fails with HTTP 400.
Reasoning effort goes where it is ignored — or refused
A generic client sends one top-level reasoning_effort to every model. Kimi Code reads the level inside the thinking object and answers an unknown one with HTTP 400; GLM-5.3 runs at max, its costliest level, when the field is missing; each vendor has a ladder of its own.
Rusta sends effort where each model reads it — thinking.effort on Kimi Code, a top-level reasoning_effort on Kimi’s platform K3 series, GLM-5.2 and newer, and DeepSeek — folded onto the levels the model lists, and never a value the endpoint would refuse.
Sampling is sent where it is fixed
A generic client sends a temperature and a top-p. Every model Kimi serves fixes both and answers any other value with HTTP 400; DeepSeek ignores the temperature while it thinks.
Rusta never sends sampling to Kimi — a configured value is dropped, with a warning — clamps GLM’s to the ranges Z.AI documents, and adds no temperature for DeepSeek.
The output budget is left to the endpoint
A generic client sends no max_tokens. DeepSeek’s default is then 8K without thinking and 64K with it, which cuts a long reasoning reply short.
Rusta always sends DeepSeek an explicit cap — the room the window has left, up to 256K — and compacts a DeepSeek conversation before it eats into that room.
Four providers, one binary
Each provider has its own wire handling in lm-bridge. Out of the box you get each vendor’s current coding model; --model and --base-url override it, whatever the billing implies, and any other --provider is rejected at startup.
| --provider | --billing | Default model | Base URL |
|---|---|---|---|
| kimi | subscriptiondefault | kimi-for-coding | https://api.kimi.com/coding/v1 |
| kimi | api | kimi-k3.1-pro | https://api.moonshot.ai/v1 |
| glm (zai) | subscriptiondefault | glm-5.3 | https://api.z.ai/api/coding/paas/v4 |
| glm (zai) | api | glm-5.3 | https://api.z.ai/api/paas/v4 |
| deepseek | — | deepseek-flash | https://api.deepseek.com |
| openai | — | gpt-4o-mini | https://api.openai.com/v1 |
Two keys that look identical
Kimi and Z.AI sell the same models twice — a Coding Plan subscription and pay-per-token credits — so --billing picks the endpoint that takes your key. Kimi refuses the other plan’s key with an invalid_authentication_error that reads like a typo; Z.AI takes either and bills it by its type. --region china selects the mainland deployments. DeepSeek has one door.
Any OpenAI-compatible endpoint
--provider openai speaks any /chat/completions endpoint — OpenAI itself, a gateway, or a server of your own with --base-url. It reads the reasoning dialect each endpoint uses (reasoning_content, reasoning as GPT-OSS and vLLM send it, or reasoning_details) and echoes thinking back under the same key.
model, base_url and api_key belong to the provider they were configured for: switching provider derives them again, rather than sending a Kimi key to Z.AI.
What “provider-native” means, vendor by vendor
The endpoints, models, effort ladders, caching and services of each vendor, and how Rusta handles each of them. Pick a vendor.
Kimi (Moonshot AI)
--provider kimi, the default. Kimi sells its models twice — a Coding Plan subscription and pay-per-token credits — at separate doors, and names them differently at each: the billing picks the door, and with it the model.
- API key
KIMI_API_KEY- Model override
--model·KIMI_MODEL_NAME- Keys from
kimi.com/code/console(Coding Plan) ·platform.kimi.ai/console/api-keys(pay-per-token)
Endpoints
| --billing | Default model | Base URL |
|---|---|---|
| subscription (default) | kimi-for-coding | https://api.kimi.com/coding/v1, or https://api.kimi.ai/coding/v1 for kimi.ai accounts |
| api | kimi-k3.1-pro | https://api.moonshot.ai/v1, or https://api.moonshot.cn/v1 with --region china |
Coding Plan models
| Model id | Model | Context | Input | Effort (default) | Plans |
|---|---|---|---|---|---|
| kimi-for-coding | K2.8 Preview | 1,048,576 | image, video | low / high / max (max) | Plus and above |
| kimi-for-coding-highspeed | K2.7 Code Highspeed: ~6× speed, ~3× quota | 262,144 | image, video | none; always thinks | Pro and above |
| k3 | K3 | 1,048,576 from Pro, 262,144 on Plus | image, video | low / high / max (high) | Plus and above |
| k3-256k | K3, about half k3’s quota | 262,144 | image | low / high / max (high) | Plus and above |
| k3.1-pro | K3.1 Pro | 1,048,576 from Pro, 262,144 on Plus | image, video | low / high / max (high) | Plus and above |
| k3.1-pro-highspeed | K3.1 Pro Highspeed: ~2–3× speed, ~2× quota | 1,048,576 | image, video | low / high / max (high) | Pro and above |
kimi-for-coding is the Coding Plan’s name for Kimi’s current coding model, upgraded in place. Rusta defaults to it: every plan that includes coding runs it with a 1M window, while k3 and k3.1-pro get 1M only from Pro.
Pay-per-token models
| Model id | Context | Thinking | Effort (default) | Dynamic tools |
|---|---|---|---|---|
| kimi-k3.1-pro | 1,048,576 | always | low / high / max (max) | yes |
| kimi-k3.1-pro-highspeed | 1,048,576 | always | low / high / max (max) | yes |
| kimi-k3 | 1,048,576 | always | low / high / max (max) | yes |
| kimi-k2.7-code | 262,144 | always | none | no |
| kimi-k2.7-code-highspeed | 262,144 | always | none | no |
| kimi-k2.6 | 262,144 | on request | none | no |
kimi-k3.1-pro, Kimi’s flagship, which the platform unlocks after a top-up of at least $1. All of them take images; video goes through Kimi’s Files API, which Rusta uses on the Kimi Code endpoints only.
Reasoning effort
| You pass | Kimi receives |
|---|---|
| ultra, max, xhigh | max |
| high, medium | high |
| low, minimum, minimal, light | low |
| off, none, disabled | thinking off, or the lowest effort where it cannot be turned off |
| unset or unrecognized | nothing, so the model default applies (Kimi answers an unknown effort with HTTP 400) |
Sent only to models that list effort levels: inside the thinking object as thinking.effort on Kimi Code, where Kimi validates it, and as a top-level reasoning_effort, with no thinking object, on the platform’s K3 series. A model without the mapped level gets the nearest one it has.
Two Coding hosts, one key
The Coding Plan has two hosts — api.kimi.com for kimi.com accounts, api.kimi.ai for kimi.ai accounts — and each refuses the other’s keys with the same invalid_authentication_error a mistyped key gets. rusta init asks both and pins the one that accepts the key; an unpinned run whose key is refused tries the other host once; rusta doctor names the host. A refusal that names a plan limit — no K3 access, K3 past 256K, no HighSpeed — is reported as it is.
The live model list
Each model’s window, image and video input, thinking and effort levels come from the endpoint’s GET /models, cached per host for a day in ~/.cache/rusta/ and refreshed in the background, so a new model or a changed window needs no Rusta release. /provider refresh fetches it at once; the tables above are the fallback for a machine that has never reached the endpoint. /model lists the models with Kimi’s names (kimi-for-coding — K2.8 Preview).
Thinking off, where it can be
kimi-for-coding, kimi-for-coding-highspeed, k3, k3-256k and kimi-k2.6 get thinking: {"type": "disabled"} (Kimi Code serves the first four with K2.8 Preview, without thinking). K3.1 Pro answers disabled with HTTP 400, the platform’s K3 series has no off switch, and kimi-k2.7-code’s thinking cannot be disabled: these run at their lowest effort instead, as Kimi advises for K3.1 Pro.
Sampling left to Kimi
Every model Kimi serves fixes its temperature (1.0; 0.6 for kimi-k2.6 without thinking) and its top-p (0.95), and answers any other value with HTTP 400. So the Kimi provider sends neither: a configured temperature or top_p is dropped, with a warning once per run.
Prompt cache, kept warm
Every request carries a prompt_cache_key — the session id, or a per-run id. The platform bills each cache write for its K3 series once, for five minutes by default or an hour at twice the write price: an interactive session asks for 1h, since its turns wait on you, and a headless run takes 5m; --prompt-cache-ttl chooses. Kimi Code and the K2 models bill no writes. Changing effort mid-session invalidates the cache, so pick one per session.
Tools loaded mid-session
Models whose list marks dynamic tools — kimi-for-coding, the k ids and the platform’s K3 series — take a tool loaded with select_tools on a system message, so the request’s tool list, and the cached prefix with it, stays unchanged. Kimi’s own $web_search built-in is offered too, and passed through as Kimi’s builtin_function.
Schemas Moonshot accepts
Moonshot’s validator is stricter than OpenAI’s, and realistic MCP tool schemas bounce. Rusta rewrites each one before it is sent: local $refs dereferenced, circular references kept, unreferenced definitions dropped, missing types filled in, and enum/const conflicts with type repaired.
Confirmed model switches
On the Coding Plan, /model <id> confirms the switches Kimi asks to confirm — to K3.1 inside a session begun on another model, which lowers output quality and cache hits, and to K3.1 Pro Highspeed, at about twice K3.1 Pro’s quota. Kimi serves the rules itself. In a session that has begun, the reply offers /new, /compact, or the same command again; in a new one the switch is made at once, with Kimi’s note.
Kimi Code’s own services
With the same key: /search and /fetch back web_search, $web_search and web_reader (the page comes back as Markdown; if the fetch fails, Rusta fetches the page itself), /tools writes session titles, and /files takes images and video by reference — uploaded once, referenced as ms://<id> afterwards, and uploaded again if Kimi no longer has it. A transient 402 “Unable to verify membership benefits” is retried, as Kimi documents.
$ rusta init
Rusta setup
Which provider?
1) Kimi (Moonshot) — kimi-for-coding / K2.8 Preview, 1M context
2) GLM (z.ai) — glm-5.3, 1M context
3) DeepSeek — deepseek-flash, 1M context, hybrid thinking, vision
4) OpenAI-compatible endpoint
Provider [1]: 1
Which key do you have? (they are not interchangeable)
1) Coding Plan subscription
2) API credits (pay-per-token)
Key type [1]: 1
endpoint https://api.kimi.com/coding/v1
model kimi-for-coding
Create a key: https://www.kimi.com/code/console
Paste your API key:
checking… key accepted
models on https://api.kimi.com/coding/v1:
kimi-for-coding (K2.8 Preview), 1M context, image and video input, effort low/high/max (default max)
kimi-for-coding-highspeed (K2.7 Code Highspeed), 256K context, image and video input
k3 (K3), 1M context, image and video input, effort low/high/max (default high)
k3-256k (K3-256k), 256K context, image input, effort low/high/max (default high)
k3.1-pro (K3.1 Pro), 1M context, image and video input, effort low/high/max (default high)
k3.1-pro-highspeed (K3.1 Pro Highspeed 2x Usage Cost), 1M context, image and video input, effort low/high/max (default high)
saved to ~/.config/rusta/config.toml
using kimi-for-coding on https://api.kimi.com/coding/v1Open weights. Kimi publishes open weights for K3, K2.7 Code and K2.6 (moonshotai/Kimi-K3, moonshotai/Kimi-K2.7-Code, moonshotai/Kimi-K2.6). K3.1 Pro and the K2.8 Preview that kimi-for-coding serves have none.
Preserved Thinking
Carry a turn's reasoning into the next request instead of discarding it. Rusta replays each stored reasoning block back to the provider unchanged, which is what the vendors require — and each spells it differently. Rusta translates.
| Kimi | GLM (Z.AI) | DeepSeek | |
|---|---|---|---|
| Wire field | thinking.keep | thinking.clear_thinking | reasoning_content, echoed in the history |
| Enabled | "all" | false | always, on requests that carry tools |
| Disabled | field omitted | true | — |
| Sent to | kimi-for-coding*, the Kimi Code k ids, kimi-k2.6 and newer | every thinking model | every model |
| Default when unset | on, whenever thinking is on | the endpoint decides | replayed |
Why it matters: a reasoning model that loses its reasoning every turn re-derives the same conclusions on the next one — spending tokens and time to arrive back where it started. Precedence is --thinking-keep → KIMI_MODEL_THINKING_KEEP → thinking_keep in the config file → the model's own default. A Kimi model whose schema lacks the field never receives it, and the platform's K3 series always keeps its reasoning and takes no thinking object at all.
Devscriptor, wired in on first run
Rusta detects an installed Devscriptor and registers it as the devscriptor MCP server — 75 tools, with no configuration.
Discovery and startup
- 1
$DEVSCRIPTOR_BIN— an explicit path - 2
$PATH - 3The platform install directories —
/usr/local/bin,~/.local/bin,/opt/homebrew/bin, …; on Windows,%LOCALAPPDATA%\Programs\devscriptorand the like
devscriptor mcp in the session's working directory, with an explicit absolute --database — the workspace's devscriptor.db, or, in a monorepo package without one, the index further up the repository — a 60 s startup timeout and a 180 s per-tool timeout. An explicit [[mcp_servers]] entry named devscriptor always wins over detection. The detected server comes from your own install, not from the repository, so it needs no workspace trust. rusta doctor reports whether it was found.Approvals that fit
A tool its server declares read-only runs without asking. Devscriptor declares 59 of its 75 — every search, navigation and LSP query — so those run freely, while in the default mode the 16 that change something (scans, notes, formatting, renames, pruning, server stops) are asked about. To let the routine ones run for the session:
# ~/.config/rusta/config.toml — the first matching rule wins
[[permissions.rules]]
name = "devscriptor-index-and-notes"
tool = "mcp__devscriptor__{scan_codebase,start_analysis,generate_embeddings,add_context_note,start_watching}"
action = "allow"
scope = "session"Formatting, renames, pruning and server stops still ask. Path sandboxing applies independently, so an allow rule never escapes allowed_paths; in a project's .rusta.toml, an allow rule applies only once you trust the folder.
The main tools at hand, the rest on demand. Devscriptor's 75 tools would swamp a tool table, so Rusta keeps the twelve that find and follow code there — search, definitions and references, relationships, the index's state and the Context Graph — and loads the rest with select_tools when needed. With Devscriptor connected, the system prompt carries its workflow — find code with it before grep, index first, record durable notes in the Context Graph — each conversation's first prompt comes with a reminder to start with it, and the explore and plan sub-agents get its read-only tools, so the agents that research code search it with Devscriptor too. A model reaches first for the tools it holds and for what comes with its task: on eight benchmark tasks run by three models, Devscriptor was called in 5 of 24 runs with every tool behind a loading step, and in 19 with the main tools at hand and the reminder.
Scaffolding that earns its keep
A good model still needs somewhere good to run. agent-core is the turn loop, the tool scheduler, the context manager and the guardrails — the same for every vendor.
Concurrent tool calls
The calls of one step whose resource accesses do not conflict — two reads of one file, edits of different files — run concurrently, and their results keep the order of the calls. Identical calls in one step run once.
Progressive tool disclosure
A large MCP server does not flood the tool table. A server with more than ten tools is deferred: announced by name and description, and loaded with select_tools when the model needs it — except the tools its preload list keeps in the table, which the model holds from the first request. deferred = true/false on a server, or default_deferred under [mcp], overrides the rule.
Compaction that summarizes
Past 90 % of the model’s window — 786,432 tokens on DeepSeek, which keeps 256K for output — the model writes a handoff summary: goals and constraints, decisions, commands run and files changed, what is still unknown, and the plan. Your oldest and most recent messages stay verbatim, with the live todo list and a pointer to the replaced lines in the records. A context overrun the provider reports, Z.AI’s 1261 included, takes the same path.
Repeated-call guard
A tool call repeated across steps draws a reminder at 3, 5 and 8 in a row, and on repeats interleaved with other calls; twelve in a row stop the turn. repeat_breaker = false turns both off.
Turns that hand the work back
max_turns (--max-turns, RUSTA_MAX_TURNS; default 100) caps a turn’s model round-trips. When it, or the repeated-call guard, stops a turn, the model gets one more step, with tools refused, to say what it completed, what is blocked and what comes next. The result carries a stop_reason.
Sub-agents and swarms
agent delegates to a sub-agent, and agent_swarm runs many at once — only when you ask for delegation, and swarms only in swarm mode, which you turn on. Delegation nests one level unless max_subagent_depth raises it. Each sub-agent keeps an agent_id and its records, so one that stopped, failed or ran past its deadline can be resumed.
Profiles and a model pool
Four profiles are built in — explore and plan (read-only), coder and default — and YAML profiles add your own. Declare [subagent.models] and the delegation tools gain a model parameter, so a file-locating sub-agent runs on a small fast model while the session stays on the flagship. An unknown alias fails the call rather than billing the flagship.
Forking a sub-agent
agent takes fork: true: the sub-agent starts from a one-time snapshot of the calling conversation, with its instructions, tools and model, so its first request repeats the caller’s prefix and hits the prompt cache. The agent call that created it is answered as “still executing when you were spawned; outcome unknown”, not left dangling.
Write safety
write_file overwrites only a file this agent has read and that has not changed on disk since — judged on length, modification time and a content digest, since the first two miss an equal-length rewrite inside one clock tick. edit_file needs its old_string to match exactly once. Creating a file needs no read.
Permissions and guardrails
Three modes — default, accept_edits, bypass_permissions — and ordered rules, the first match winning; a compound shell command is matched per segment. Writes to secrets (.env*, .ssh/, *.key, *.pem, …) and git push, reset, rebase, checkout -f and clean -f ask in every mode, --yes included. No command, hook or MCP server Rusta starts sees the variables it reads its API keys from.
Dangerous-command guard
In the default and accept_edits modes, bash asks before rm -rf, shutdown, mkfs, wipefs, dd to a device and the like — checked across the whole chain, sudo, sh -c, eval and command substitutions included — and before a command whose name is known only at run time. rm -rf on literal /tmp paths is exempt.
Workspace trust
A cloned repository’s .rusta.toml cannot start MCP servers, redirect requests or your key, loosen permissions or reach outside the folder until you trust it, and cannot declare hooks at all. An interactive session lists those settings and asks; a headless run leaves them out and says so. rusta trust trusts a folder ahead of time.
Plan mode, reviewed by you
Only you turn plan mode on — /plan, --plan, or plan = true. The agent researches and writes a plan, and every edit waits until you approve the plan in exit_plan_mode’s review, in every permission mode. A headless --yes run has nobody to review it: plan = true from the config is not applied there, and an explicit --plan ends the run with the plan unapproved and nothing edited.
Background work and scheduling
Background commands and sub-agents outlive the step that started them: task_list, task_output and task_stop manage them, and wait_for blocks inside the turn until one finishes. cron_create schedules a prompt, re-injected into this session when it is idle.
Bounded tool output
No single result floods the context: each is capped at 50,000 characters, with the full output saved to a spill file the model can read. read_file returns 100,000 characters a call by default, with the exact offset to continue from, and images are downsampled to 256 KiB and 2000 px.
Hooks
Run your own commands on session, turn and tool events — PreToolUse, UserPromptSubmit and Stop can block. Hooks live in your own config only, and fail open, so a broken script never blocks work.
Web content stays data
fetch refuses loopback, private, link-local and cloud-metadata addresses, checked after DNS resolution and on every redirect. A fetched page cannot pose as the harness: the system-reminder tags in web results are escaped, and the model is told web content is untrusted data.
Headless, REPL and sessions
Headless (-p) for scripts and CI, with --stream-json events, and an interactive REPL; a terminal UI builds with --features tui. Sessions are JSONL records, written by one process at a time: --resume continues one, rusta fork copies one, and rusta export packs one into a ZIP archive.
26 built-in tools
What a fresh agent has before a single MCP server is attached. MCP tools are namespaced mcp__<server>__<tool>.
Filesystem
read_filewrite_fileedit_filelist_dirglobgrepExecution
bashWeb
fetchweb_searchPlanning
todo_listexit_plan_modeDelegation
agentagent_swarmBackground work
task_listtask_outputtask_stopwait_forScheduling
cron_createcron_listcron_deleteGoals
create_goalget_goalInteraction
ask_userask_user_questionMedia
read_mediaTool disclosure
select_toolsupdate_goal and set_goal_budget are registered too, but hidden until a goal is active. web_reader joins when the provider has a page reader — Kimi’s Coding Plan, Z.AI’s pay-per-token API, DeepSeek — and skill when skills are loaded. A tool that cannot work in the session is not offered at all. The table is pinned by a snapshot test, so adding or renaming a tool fails the build until its documentation is updated.
One command, a key verified before it is saved
rusta init asks which provider you use, which kind of key you hold and, where it matters, the region; verifies the key against the endpoint before writing anything; and saves ~/.config/rusta/config.toml with mode 600. If the endpoint rejects the key, it offers the other plan rather than leaving you to guess. Re-run it to switch provider or rotate a key — it edits the config rather than replacing it. It is scriptable too: echo "$KEY" | rusta init. Each vendor's tab above shows a real session.
export KIMI_API_KEY=sk-...
rustaexport ZAI_API_KEY=...
rusta --provider glmexport DEEPSEEK_API_KEY=sk-...
rusta --provider deepseekConfigure once, or not at all
Rusta layers ~/.config/rusta/config.toml, then .rusta.toml in the session's working directory, then a --config file, each overriding the one below key by key. Environment variables override the files, and command-line flags override both. Every key is optional.
provider = "glm"
api_key = "zai-..."
# Which quota the key is billed against: subscription (default) | api.
# This picks the endpoint, and with it the default model.
billing = "subscription"
region = "global" # global (default) | china
# Both optional: leaving them out lets provider + billing choose the
# flagship and its endpoint. Set them to pin a specific one.
# model = "glm-5.3"
# base_url = "https://api.z.ai/api/coding/paas/v4"
# Sampling / budget
thinking = true
reasoning_effort = "high" # none | minimal | low | medium | high | xhigh | max
max_turns = 100
# Filesystem and context
allowed_paths = ["/srv/data"]
additional_dirs = ["../sibling-repo"]
project_context_files = ["NOTES.md"]
project_context_budget_tokens = 8192 # the default
permission_mode = "accept_edits"
# Sub-agents may run on a cheaper model than the session's own.
[subagent]
default_model = "fast"
[subagent.models.fast]
model = "glm-5.3-flash"
description = "Locating files, reading configs, simple lookups."
reasoning_effort = "low"
# Devscriptor is auto-detected — no entry needed here.
[[mcp_servers]]
name = "http-tools"
url = "http://localhost:8000/mcp"
# Permission policy; the first matching rule wins.
[[permissions.rules]]
name = "allow-cargo"
tool = "bash"
command = "^cargo (build|test|check)"
action = "allow"A project's .rusta.toml cannot start MCP servers, redirect requests, loosen permissions or reach outside the folder until you trust it. The full reference is in the configuration guide.
Own the whole stack, if you need to
All three vendors publish open weights for models Rusta runs — Kimi K3, K2.7 Code and K2.6; GLM-5.3 and GLM-5.3-Flash; DeepSeek V4.1-Flash and V4-Pro — so a team that cannot send source code to an outside provider can serve one on hardware it controls. Each vendor tab names its models.
Point --provider openai --base-url at your own OpenAI-compatible server, such as vLLM, and Rusta runs against weights you host. Pair it with Devscriptor, which analyses code on your machine with no backend, and every layer of the stack stays inside your perimeter: the model, the code index, and the agent that drives them.
Download Rusta 1.0.1
One self-contained binary per platform — no OpenSSL, nothing else to install. The terminal UI is not in the release binaries; build with --features tui for it.
Open source under the GNU General Public License v3.0: free to use, change and share, for personal and commercial work alike. Source on GitHub.
Rusta is not affiliated with or endorsed by the Rust Foundation or the Rust Project.
All Downloads
Linux
Intel/AMD (x64)
Linux
Apple Silicon / ARM64
macOS
Apple Silicon
macOS
Intel
Windows
Intel/AMD (x64)
One self-contained binary
Every archive holds one folder with the license and a single rusta executable — the agent, the Kimi, GLM, DeepSeek and OpenAI-compatible providers, the MCP client and the REPL. Run rusta init to pick a provider and verify your API key, then rusta doctor to check the rest. Download, extract, and add it to your PATH — or build it from source.
Or build from source
With Rust 1.89 or newer:
git clone https://github.com/vladimirpesic/rusta.git && cd rusta
cargo build --release -p rusta-cli # target/release/rusta
cargo build --release -p rusta-cli --features tui # with the terminal UIBetter together
Rusta drives the model. Devscriptor gives it a map of your codebase. Install both and the agent starts with 75 code-intelligence tools within reach. Together they resolved 75–81% of SWE-bench Multilingual with Kimi, GLM and DeepSeek models.