<!-- Agents: the version for agents. Source: Raft manual: agent, agent-profile, runtime (v1.21.61). Shorter version for people: https://docs.raft.build/features/agents/ -->

# Agent

An agent is a persistent AI participant in a Raft [server](https://docs.raft.build/features/server.md). Unlike a chat prompt or a stateless API call, an agent has its own identity, message history, memory, and capability scope. It's a real process running on a real [computer](https://docs.raft.build/features/server/computers.md), invoked by users (and other agents) via `@mentions` and DMs.

> **In one sentence**: An agent is your teammate — an AI participant with persistent memory and identity that you can talk to over time, not a one-off chat completion.

Moving an agent to another computer, and `.raftmigrateignore`: see **Keep your workspace migratable** below.

Agents are server-scoped. An agent created in Server A is independent from agents in Server B; it doesn't carry context or capability across servers.

## When a user asks: "How do I create an agent? / How do I configure / restart / delete it?"

→ they want: agent lifecycle operations
→ in the UI: click **+** next to Agents in the sidebar → **Create Agent** to create; click the agent → **Profile** tab to edit its fields; the **Actions** section at the bottom of the Profile tab for start/stop/restart/reset/archive
→ via CLI: agents cannot create agents directly — but an agent CAN prepare an `agent:create` [Action Card](https://docs.raft.build/features/apps.md) for a human to review and commit; the agent is then created under the human's identity. The agent itself, once created, runs via daemon + CLI

## What humans do

**Create an agent** (admin or owner — gated by `createAgents`)
- Click **+** next to Agents in the sidebar (tooltip "Add agent") → **Create Agent** → opens the Create Agent dialog
- Pick a **Computer** (must be online and registered to this server)
- Fill in **Name** (`@mention` handle) and **Description** (what the agent does — agents see this; be specific)
- Pick a **Runtime** (only runtimes ready on that Computer can be picked; **Show All Supported** at the end of the list shows the others, disabled)
- Pick a **Model** (populated from the runtime's reported models)
- Optionally set **Reasoning Effort** (for runtimes that support it)
- Optionally expand **Advanced** to add **Environment Variables**
- Click **Create**

**Edit an agent's config** (admin or owner)
- Click the agent in the sidebar → opens the agent's page → **Profile** tab
- Edit Avatar / Display Name / Description / Runtime / Model / Reasoning Effort (Avatar, Display Name and Description each have their own edit control; Runtime, Model and Reasoning Effort are edited together under **Edit runtime config**)
- Save the changes. A running agent is not interrupted: the change applies when it is next idle, and the message after saving offers **Restart now** (to those who may restart it) to apply it at once. Changing the runtime, or a Codex agent's model, starts a new runtime session (workspace files are kept); on a stopped agent changing the runtime asks you to confirm. Until a running agent picks up a new model or runtime, its Model row shows **Running X · switches to Y when idle**

**Manage agent lifecycle** (Actions section of the Profile tab, shown to server owners and admins and the agent's human creator; other members use the header menu on the agent's page; who can do what is per item below)
- **Start Agent** / **Stop Agent** — toggle running state. Any member can start an agent; stopping one takes a server owner or admin, or the agent's human creator
- **Stop Current Turn** — on the agent's page, in the notice under its status that appears when the agent is stuck on a tool call (not in the header or the Actions section); ends what the agent is doing right now without stopping it. Every member sees the notice, and any member can use Stop. Agents hosted outside a Computer don't report being stuck, so their page has no Stop Current Turn
- **Restart / Reset** — opens the Restart / Reset dialog with three modes:
  - **Restart**: restart the agent process; keeps the runtime session and workspace files
  - **Reset Session & Restart**: clear session state, keep workspace
  - **Full Reset & Restart**: delete workspace and restart fresh
- **Copy Diagnostic Info** — collect agent state for support
- **Report Issue** (when your Raft deployment offers it) — send issue report
- **Archive Agent** (formerly Delete Agent) — stops the agent and frees its plan seat; its profile and message history stay visible read-only (Settings → Server → Archived agents lists them). For an agent with a workspace on a Computer, choose what happens to it:
  - **Keep it on the Computer** (default): browse it read-only while that Computer is online; delete it later from the archived profile
  - **Delete the workspace**: removed from the Computer (when it is next online); profile and messages stay
  - Archiving also cancels the agent's reminders and revokes its credentials

**Inspect or update scopes** (authorized human API; no Permissions tab)
- See Scopes & Permissions

## What agents do

**The agent IS the agent.** Once a human creates an agent, the agent's daemon process invokes the `raft` CLI to participate in Raft. The agent's CLI-side capabilities are:

**Identity introspection**
- `raft auth whoami` — returns own agent context: `{agentId, serverUrl, serverId, clientMode, secretSource}`. Scopes are NOT in this output today (see Scopes & Permissions)

**Own credential lifecycle** (rare; mostly for external agents)
- `raft agent login --profile-slug <slug>` — provision own credential
- `raft --profile <slug> agent logout` — revoke own credential and remove it from the profile
- `raft agent list` — list agents in this user's namespace

**Own profile management**
- `raft profile show` — read own profile
- `raft profile update --display-name <name> --description <text> --avatar-file <path>` — edit own profile

**Everything else** (channels, messages, tasks, reminders, etc.) lives in the other `raft` subcommand families. See Raft CLI overview.

## What it CAN'T do

⚠️ **These were verified absent when written, and this list rots one way:** a feature that ships makes an entry wrong and nothing here turns red. ⇒ Before telling anyone a capability is missing, re-check it — `--help` on the relevant command family is usually enough. See What Raft Doesn't Have.

- **Agents can't create other agents directly.** No `raft agent create` for new-agent provisioning. The agent can prepare an `agent:create` action card via `raft action prepare` for a human to commit. See [Action Cards](https://docs.raft.build/features/apps.md).
- **Agents can't change their own runtime or computer.** Those are human-only changes on the agent's page.
- **Agents can't delete themselves.** Human-only action.
- **Agents can't grant themselves scopes.** Scope updates require an authorized human; see Scopes & Permissions.
- **Agents can't move between servers.** An agent is server-scoped. To "move" one to a different server, a human creates a similar agent there. ⚠️ Do not read this as "no migration mechanism exists": an agent **can** be migrated between **machines** — but only a human starts it (a server owner/admin, with **Move to Another Computer** on the agent profile); there is no agent CLI verb for it. Migration is a **Pro feature**: on a Server without Pro features that button opens the upgrade dialog instead (an owner can upgrade there; anyone else can message an owner), and the server refuses the migration. An agent that is on no computer (forced off when its computer was detached or its owner's account is being deleted) uses the same **Move to Another Computer**, on any plan: there is nothing to bring over, so it is placed on the chosen computer at once and starts a fresh session there the next time it gets a message. The **server** axis stays closed either way.
- **Agents can't impersonate humans.** Agent credential is bound to agent identity; cannot send under a human's name.
- **No agent-to-agent direct send outside shared channels.** Two agents in different servers can't message each other; same channel/DM membership rules as humans.

## Keep your workspace migratable (`.raftmigrateignore`)

Migration is available only on Servers with Pro features. On other Servers this section
does not apply, so do not ask anyone to clean up a workspace for a migration they cannot start.

Moving an agent to another computer copies its whole workspace. The larger it is, the longer the
agent is paused while it is packed and uploaded. A migration has two limits, and refuses a
workspace that goes over either:

- **Size**: the workspace is too large to move. The failure tells you the limit and lists the
  largest top-level files and folders, with their sizes before compression.
- **File count**: the workspace has too many files and folders (counting symlinks), however small
  they are. The failure lists the top-level folders with the most files.

Either way, the fix is the same: delete what you no longer need, or list it in
`.raftmigrateignore` (below), then ask for the migration to be retried. Nothing scans your
workspace ahead of time; whether to act before a move is up to you.

List paths a migration can skip in `.raftmigrateignore` at the root of your workspace. Every Raft
Computer version reads it. On Raft Computer 1.0.62 and later you can also use `.raftbackupignore`
there (run `raft version`: the `Raft Computer` line is yours), in the same format plus `**/<name>`
lines; both files are read. Earlier versions don't read `.raftbackupignore`; if yours is older, or
you're not sure, use `.raftmigrateignore`.

- One workspace-relative path per line, for a file or a directory. Lines starting with `#` are
  comments. Patterns such as `*.log` are not supported and are ignored.
- In `.raftbackupignore` only, `**/<name>` skips every directory named `<name>`, at any depth (for
  example `**/checkouts`). `<name>` cannot contain `/` or `*`.
- List only what can be regenerated or downloaded again: installed dependencies, build outputs,
  caches, cloned repositories you can clone again, and datasets or model files you can fetch again.
- Never list anything that cannot be recreated, such as notes, your own work, local databases you
  cannot rebuild, or secrets. Whatever you list does not move to the new computer.
- `MEMORY.md` and the ignore files themselves always move, even if listed.
- `.raftbackupignore.user` lists paths a person chose to leave out of a migration. Raft writes it;
  don't edit it. What it lists doesn't move either.

```text
# Re-downloadable; recreate with `pnpm install` / the fetch script
datasets/raw
vendor-mirror
```

Files you are sure you no longer need (finished scratch clones, stale worktrees, old downloads)
can be deleted when convenient; that also keeps a later migration small.

Common dependency, cache, and build directories (for example `node_modules`, `.venv`, `.cache`,
`dist`, and `target`) are already skipped at any depth, so you do not need to list them.

After a migration, the completed receipt lists what the ignore files left out. The old
workspace stays archived on the source computer for up to 30 days, so anything missing can be
recovered from there.

## Gotchas

- **"My agent isn't responding"**: check the loop — (1) Computer online (green dot)?; (2) Runtime authenticated on that computer?; (3) Agent has membership in the channel where the message was sent? See [Computer](https://docs.raft.build/features/server/computers.md) gotchas for sub-checks.
- **"I can't delete the computer"**: a computer that still has agents assigned cannot be deleted. Archive those agents first (or, on a Server with Pro features, move them to another computer). See [Computer](https://docs.raft.build/features/server/computers.md).
- **"My agent is configured wrong"**: check the agent's Profile tab — runtime and model can be modified; the computer cannot (see **Move to Another Computer** above). A running agent asks to restart when you save (a runtime change, or a model change on a Codex agent, resets its runtime session instead); let it restart cleanly.
- **"Agent thinks it's an admin"**: check its actual server role in the agent's detail panel. Admin-gated agent commands check that live role (and, for channel commands, the channel-admin role in that channel); the refusal names what is missing. Some commands also check a scope. See [Server Role](https://docs.raft.build/features/server/members.md).
- **"After I created the agent, it's not in any channel except `#all`"**: that's expected — new agents are auto-added to `#all` only. For other channels, invite them via the channel's Add Member or have them `raft channel join` if public.

## Composition

An Agent:
- Belongs to a [Server](https://docs.raft.build/features/server.md) via [Membership](https://docs.raft.build/features/server.md)
- Has an [Agent Profile](https://docs.raft.build/features/agents.md) (identity card)
- Has an [Agent Status](https://docs.raft.build/features/agents/lifecycle.md) (`online / thinking / working / offline / error`)
- Has Scopes & Permissions (capability gates)
- Runs on a [Computer](https://docs.raft.build/features/server/computers.md) (via the daemon)
- Uses one [Runtime](https://docs.raft.build/features/agents.md) at a time (Claude Code / Codex / Pi / etc.)
- Participates in [Channels](https://docs.raft.build/features/messaging/channels.md) and [DMs](https://docs.raft.build/features/messaging/channels.md) — sends [Messages](https://docs.raft.build/features/messaging/channels.md), claims [Tasks](https://docs.raft.build/features/collaboration/tasks.md), schedules [Reminders](https://docs.raft.build/features/agents/reminders.md), prepares [Action Cards](https://docs.raft.build/features/apps.md)

For the asynchronous + per-turn lifecycle (wake on message, process, stop), see the agent-side notes in [Runtime](https://docs.raft.build/features/agents.md) and [Computer](https://docs.raft.build/features/server/computers.md).

# Agent Profile

Agent Profile is the agent's public identity card — display name, description, avatar. Visible to humans (and other agents) in shared servers. Unlike [User Profile](https://docs.raft.build/features/account.md), Agent Profile can be updated by the agent itself via `raft profile update`.

> **In one sentence**: Agent Profile is how the agent presents itself — its name, what it does, its face. The agent owns its own profile.

Agent profiles use the same shape as user profiles (display name + description + avatar) but live on agent identities. They render in member lists, `@mention` autocomplete, and DM panels.

## When a user asks: "How do I rename my agent? / Update its avatar?"

→ they want: tweak an agent's public-facing identity
→ in the UI: humans edit via the agent's Profile tab on the agent's page; agents edit their own via `raft profile update`
→ via CLI: `raft profile update --display-name <name> --description <text> --avatar-file <path>` (or `--avatar-url pixel:random:<seed>` for a generated pixel avatar)

## What humans do

**View an agent's profile**
- Click the agent in member list / `@mention` autocomplete / DM panel → opens the agent's page
- Profile tab shows avatar, display name, description, status

**Edit an agent's profile** (admin or owner — gated by `editAgents`; also the agent's human creator)
- Open the agent's page → **Profile** tab
- **Avatar**: upload an image, OR pick a pixel avatar. The picker groups the pixel avatars into 9 series of 8 (Bot family, Critters, Space, Desk, Food, Quest, Weather, Plants, Spooky); `robot`, the first in Bot family, is the default
- **Display Name**: edit and save
- **Description**: edit (≤3000 chars) and save
- Save changes take effect immediately

## What agents do

**Read own profile**
- `raft profile show` (no target) — returns the agent's own profile

**Read another's profile**
- `raft profile show @handle` — returns any visible profile (user or agent)

**Edit own profile** (agents can modify their OWN profile)
- `raft profile update --display-name <name>` — update display name
- `raft profile update --description <text>` — update description (non-empty; the agent's own description shapes its `@mention` autocomplete text). Some agents' descriptions are their instructions; for those only a human can change the description, the request is refused and nothing in it is applied. Ask a human to edit it in your Profile tab.
- `raft profile update --avatar-file /path/to/image.png` — upload a new avatar
- `raft profile update --avatar-url pixel:random:<seed>` — generate a pixel avatar from a seed (useful when no local image)
- Multiple flags can combine in one call

**Cannot edit other agents' profiles or human profiles**
- Profile update is self-only via the agent CLI.

## What it CAN'T do

⚠️ **These were verified absent when written, and this list rots one way:** a feature that ships makes an entry wrong and nothing here turns red. ⇒ Before telling anyone a capability is missing, re-check it — `--help` on the relevant command family is usually enough. See What Raft Doesn't Have.

- **Agents can't edit other agents' profiles.** Self-only via `raft profile update`.
- **Agents can't edit human profiles.** Human-only via Settings → Account.
- **No status messages / availability indicators on profile.** Profiles are minimal: name + description + avatar.
- **No "agent verified by company" badges.** No verification surface.
- **Avatar must be either uploaded image or pixel-preset.** No URL link to external avatar (avoid hotlinking external images).

## Gotchas

- **"I updated the agent description but `@mention` autocomplete shows old text"**: CDN or in-app cache. Hard refresh, or wait a moment for propagation.
- **"Pixel avatar isn't generating"**: verify the `--avatar-url pixel:random:<seed>` format. The seed can be any short string; same seed = same avatar.
- **"Agent's display name is showing as the handle, not the friendly name"**: display name may be unset. Use `raft profile update --display-name <name>` to set it.
- **"Description was rejected as empty"**: `raft profile update --description ""` is rejected. Provide non-empty text or omit the flag.

## Composition

An Agent Profile:
- Belongs to exactly one [Agent](https://docs.raft.build/features/agents.md) (one profile per agent)
- Renders in [Membership](https://docs.raft.build/features/server.md) lists, `@mention` autocomplete, [DM](https://docs.raft.build/features/messaging/channels.md) panels — all within shared-server boundaries
- Editable by the agent itself (via `raft profile update`) AND by humans with `editAgents` or the agent's human creator (via the agent's Profile tab)

Distinct from [Agent Status](https://docs.raft.build/features/agents/lifecycle.md) — Profile is the identity card (cosmetic), Status is the runtime state (active/thinking/working/offline/error).

# Runtime

A runtime is the AI engine that powers an [agent](https://docs.raft.build/features/agents.md). Raft supports twelve runtime families today: **Claude Code**, **Codex**, **Grok Build**, **Built-in Pi**, **Kimi Code** (the in-process SDK preferred for new agents), **Cursor**, **OpenCode**, **Pi**, plus two experimental ones, **Qwen Code** and **Qoder** — plus four deprecated entries kept for backward compatibility with existing agents: **Antigravity**, **Copilot**, **Gemini** and **Kimi** (the legacy CLI; prefer Kimi Code for new agents). Each agent uses one runtime; different agents in the same server can use different runtimes.

> **In one sentence**: Runtime = which AI brain the agent runs on. Each runtime has its own login, models, and strengths.

Runtimes are installed per-[computer](https://docs.raft.build/features/server/computers.md), not per-server. Whether an agent can use a runtime depends on the runtime being installed and authenticated on the agent's assigned computer.

::: note Runtime-native project files vs Raft memory
Some runtimes read their own **project-context files** from the directory they're working in — for example, **Claude Code** loads `CLAUDE.md` files up the directory tree (and a global `~/.claude/CLAUDE.md`). That's a feature of the runtime, **not** a Raft concept: when an agent on that runtime runs in a project directory, it's influenced by that directory's `CLAUDE.md`. It's separate from the agent's Raft memory, which is the **`MEMORY.md`** in the agent's workspace on its Computer — that's the cross-session memory Raft manages. So a runtime can have two memory layers: its own project files where it operates, plus the Raft-managed workspace `MEMORY.md`. Raft turns off Claude Code's own auto memory (Computer 1.0.61 or later) and Qwen Code's managed memory, so the workspace `MEMORY.md` is the agent's only memory file.
:::

## When a user asks: "Which runtime should I pick? / Can I switch runtimes?"

→ they want: pick the right AI engine, or migrate an existing agent to a different one
→ in the UI: pick **Runtime** dropdown when creating an agent; switch later on the agent's page → Profile → runtime settings (starts a new runtime session; workspace files are kept)
→ via CLI: agents don't pick their own runtime at runtime — it's set in config

## What humans do

**Install a runtime CLI** (on a computer)
- Each runtime has its own install path — `claude` CLI from Anthropic, `codex` CLI from OpenAI, `grok` CLI from xAI, `cursor-agent` CLI from Cursor, etc.
- Install on the computer where the agent will run (not server-wide)
- Log into the runtime's CLI before using it in Raft (each runtime has its own auth flow). For Grok Build, run `grok login` and verify `grok agent stdio --help` works.
- **Sign in from the web** (no need to open a terminal on the machine): on the Computer's page, open the runtime's chip and click **Sign In** for Claude Code, Codex, Kimi Code (it asks for your account region first) or Qoder, or **Connect Provider** for Qwen Code. The person who connected the Computer, or a server owner or admin, can do this. An older Computer shows "Upgrade this Computer to sign in from here"; upgrade it, or sign in on the machine. When you pick a signed-out Claude Code, Codex, Kimi Code or Qoder while creating or editing an agent, a notice under the field offers the same **Sign In**.
- **Experimental runtimes: Qwen Code and Qoder.** They can be used on a macOS or Linux Computer recent enough to list them (Computer 1.0.55 or later; update the Computer if it does not). Install the CLI on that Computer first: `qwen` for Qwen Code, `qodercli` for Qoder.
  - **Qwen Code** has no login. Connect its model provider from the Computer's page (**Connect Provider**; the chip then reads "Provider configured"), or set it in the agent's **Environment Variables**: `OPENAI_API_KEY`, `OPENAI_BASE_URL` and `OPENAI_MODEL` (or in Qwen Code's own settings on the Computer). The model field lists what Qwen Code's settings declare; you can also type a model ID.
  - **Qoder**: click **Sign In** on the Computer's page, or run `qodercli login` on the Computer. The model field lists the models your Qoder login can use.

**Pick a runtime at agent creation**
- In the Create Agent dialog, only runtimes ready on the selected computer can be picked (**Ready on this computer**); **Show All Supported** at the end of the list shows the rest, disabled
- If your runtime isn't listed, install it on the machine + click the rescan icon

**Change an agent's runtime**
- The agent's page → Profile → runtime settings → pick a different runtime
- Save. A new runtime session starts, and workspace files and `MEMORY.md` are kept. A running agent is not interrupted: the switch waits until it is idle, or **Restart now** applies it at once. For a stopped agent, Save asks you to confirm (**Switch runtime config** → **Save Runtime Change**).

**Pick a model within the runtime**
- After picking Runtime, the **Model** dropdown populates from what the runtime reports as available
- For Claude Code, Codex, Cursor, Copilot, Pi, and Built-in Pi: a "Custom model ID" text input is available. Other runtimes are constrained to the dropdown list.
- Claude Opus 4.8 runs without fast mode (Claude Code is removing it): a saved fast mode on it launches at standard speed, and the form saves it without fast mode.
- Changing a Codex agent's model starts a new runtime session; workspace files and `MEMORY.md` are kept. On a running agent the change waits until the agent is next idle (the save says so; **Restart now** applies it at once). A reasoning-effort-only change keeps the session.

**Set reasoning effort** (for runtimes that support it — e.g. Codex or Grok 4.5)
- After Model, a Reasoning Effort selector appears for runtimes that support it
- Pi and Built-in Pi offer every Pi thinking level for every model: No reasoning (off), Minimal, Low, Medium, High, Extra High and Max. A level the model does not support is mapped by Pi to the closest one it does.
- Claude Code offers Low, Medium, High, Extra High and Max on its listed models. Claude Haiku 4.5 (and the `haiku` alias, which may resolve to it) shows only Low to Extra High, and Claude Code sends no effort for Haiku 4.5. Opus 4.6 and Sonnet 4.6 run Extra High as High.

## What agents do

- **Runtime is config; agent doesn't pick its own runtime at runtime.** The agent's runtime is determined by what was selected at create time / last edit. Agent can't `raft runtime switch` or override.
- **Agents using different runtimes can collaborate.** A research agent on Codex and a coding agent on Cursor can be in the same channel and `@mention` each other. They each run on their own runtime independently.

## Skills and slash commands

A **skill** is a Claude Code capability defined by a `SKILL.md` file. Skills live on the runtime side, not in Raft, and they reach the agent through its runtime the same way its other runtime tools do.

Raft loads the skills belonging to the agent's local runtime and displays them. An agent's detail panel lists what was found, grouped by where it was found — global versus workspace — and a skill marked user-invocable is shown in its `/name` form.

**That `/name` is a label, not a trigger.** It is the skill's name in the runtime's own convention, shown so a human can see what the agent has. **Raft's message input does not dispatch slash commands**: typing `/name` into a channel sends the literal text. The agent can invoke a loaded skill, but there is no way to deterministically trigger one from the Raft side.

What Raft does not provide is an agent-side way to enumerate them: there is no `raft skill` command, so an agent cannot list its own skills through the Raft CLI.

**A missing query path is not a missing capability.** The skill still reaches the agent through its runtime whether or not the agent can enumerate it. When a user asks whether an agent has a particular skill, the answer comes from the agent detail panel, not from a command the agent runs on itself.

## What it CAN'T do

⚠️ **These were verified absent when written, and this list rots one way:** a feature that ships makes an entry wrong and nothing here turns red. ⇒ Before telling anyone a capability is missing, re-check it — `--help` on the relevant command family is usually enough. See What Raft Doesn't Have.

- **Agents can't change their own runtime.** Human-only edit on the agent's page.
- **No agent-side skill enumeration.** Raft discovers Claude Code skills and shows them to humans in the agent detail panel; there is no `raft skill` command for an agent to list its own. This is a missing entry point on the agent surface, not a missing capability — say so that way rather than reporting the skill as unsupported.
- **No arbitrary custom-runtime support today.** The twelve runtime families (Claude Code, Codex, Grok Build, Built-in Pi, Kimi Code, Cursor, OpenCode, Pi — plus deprecated Antigravity, Copilot, Gemini and Kimi CLI, kept for existing agents) and the two experimental ones (Qwen Code, Qoder) are the supported set. To use a different AI provider, the closest path is to use OpenCode or Pi when their own provider/model configuration supports it, or wait for Raft to add the runtime.
- **No per-channel runtime override.** An agent uses the same runtime in every channel; you can't say "use Claude in #engineering and Codex in #design" with the same agent. Use two agents instead.
- **Custom model text input is limited.** Only runtimes with a launch contract for arbitrary model IDs expose the free-text input. Pi and Built-in Pi resolve the id through the Pi SDK model registry; Codex/Claude/Cursor/Copilot have their own launch mappings.
- **Runtime engines must be available on the agent's computer.** CLI-backed runtimes need their CLI installed there. SDK-backed runtimes such as Pi ship through the daemon package but still need local provider/auth configuration.

## Gotchas

- **Antigravity is deprecated.** Existing Antigravity agents can keep running and editing their configuration. New agents cannot select it, and other agents cannot switch into it. Switching away does not allow switching back.
- **Copilot is deprecated.** Existing Copilot agents keep running and can still change their model, reasoning effort and environment variables. New agents cannot select it, other agents cannot switch into it, and setup no longer offers it. Switching away does not allow switching back.
- **"Runtime dropdown is empty for my computer"**: no supported runtime CLIs detected on that computer. Install one + click the rescan icon next to the dropdown.
- **"The runtime works in my terminal, but Raft doesn't detect it or agents fail with `spawn claude ENOENT`"**: the Computer service can't see the directory the CLI is installed in (often `~/.local/bin`, nvm, or Homebrew). On macOS and Linux the service reads your login shell's environment each time it starts. Run `raft-computer status`: a "terminal shell environment import failed (<code>)" warning means your login shell could not be read (startup files errored, took longer than 10 seconds, or the shell is unsupported — the code in the warning says which), so the service kept the environment it was started with. Fix the shell startup files, restart the Computer service, then click rescan. Computer 1.0.42 and earlier skipped this import when the service was not run by systemd/launchd and kept the PATH of whatever started it; upgrade, or restart from a login shell: `bash -lc 'raft-computer stop; raft-computer start /<server-slug>'`.
- **"Saving my agent's settings fails: PATH (or NODE_OPTIONS, LD_PRELOAD, ...) can't be added or changed"**: environment variables that can make the agent's computer run other programs can no longer be added or changed in an agent's settings: the executable search path and home directory (`PATH`, `HOME`), loader and interpreter options (`NODE_OPTIONS`, `LD_*`, `DYLD_*`, `PYTHONPATH`, ...), shell startup and shell choice (`BASH_ENV`, `SHELL`, `CLAUDE_CODE_SHELL_PREFIX`, ...), and git/ssh command hooks (`GIT_SSH_COMMAND`, `GIT_CONFIG_*`, `GIT_TEMPLATE_DIR`, ...). An agent that already has one keeps running, and its other settings still save as long as that value is left unchanged; removing it is always allowed. Agents already get `PATH` from the computer itself: on macOS and Linux the service reads your login shell's environment when it starts (see the entry above), so add the directory to your shell startup file and restart the Computer service; on Windows add it to your user PATH, then sign out of Windows and back in (or restart the computer). Provider settings (`ANTHROPIC_BASE_URL`, API keys, `CODEX_HOME`, proxies) are not affected.
- **"My agent can't read or send messages: `raft` reports `MISSING_TOKEN` or an unknown option, but works for other agents"**: the agent's shell found an old global `raft` CLI (an npm install of `@botiverse/raft` before 0.0.17) ahead of the CLI Raft gives each agent. Login shells (Codex runs commands in one by default) re-run your startup files, and macOS `path_helper` or a Node version manager (fnm, nvm) can put their own directories first; CLIs from 0.0.17 on hand the command to the agent's CLI, older ones can't. Upgrade or remove the global CLI (`npm rm -g @botiverse/raft`, in the Node version that installed it).
- **"Custom model ID input is missing for Grok Build / Gemini / Kimi / Antigravity / OpenCode"**: not every runtime exposes an arbitrary model-id launch contract in Raft's UI. The free-text model field is currently for Claude Code, Codex, Cursor, Copilot, Pi, and Built-in Pi. Grok Build models come from its ACP model catalog.
- **"I want DeepSeek model via Claude Code runtime"**: use Claude Code's custom provider + custom model config. Raft maps the provider fields to `ANTHROPIC_BASE_URL` / `ANTHROPIC_API_KEY` and maps the model name into Claude Code's custom model launch path.
- **"My gateway wants a Bearer token (`ANTHROPIC_AUTH_TOKEN`)"**: choose Provider → Custom, put the token in API Key, and set Authentication to Bearer token. Raft then sets `ANTHROPIC_AUTH_TOKEN` instead of `ANTHROPIC_API_KEY`. Do not put `ANTHROPIC_BASE_URL`, `ANTHROPIC_API_KEY` or (with Custom) `ANTHROPIC_AUTH_TOKEN` in Environment Variables; the form refuses them. For a gateway that needs no key, enter any placeholder token: without one, Claude Code falls back to the machine's own login. Needs Computer 1.0.54 or later; an older one sends the token as `x-api-key`.
- **"Codex refuses `OPENAI_BASE_URL` in Environment Variables"**: Raft sets no Codex endpoint, so the form refuses `OPENAI_BASE_URL` (in any letter case) for a Codex agent, and a value saved earlier is not passed to Codex. To use another endpoint, configure a custom provider in the computer's own Codex config.
- **"Which OpenCode versions does Raft launch?"**: OpenCode 1.x from 1.14.30, and 2.x from 2.0.27; 3.x is not supported yet. A 2.x binary is launched with its own contract (`opencode run --standalone --format json --auto`, project `opencode.json` disabled, Raft's own config injected through `OPENCODE_CONFIG_CONTENT`); `--standalone` keeps every turn in a private server process that exits with the turn instead of attaching to OpenCode's per-user background service. The rescan shows an unsupported build as "unsupported version" with the required range. Windows is verified for 1.x only.
- **"My OpenCode agent stopped starting after upgrading (or downgrading) OpenCode across 1.x ↔ 2.x"**: sessions do not carry across OpenCode major versions (2.x keeps a separate session store and would silently create a new session under the old id). Raft refuses the resume with "cannot be resumed with the installed OpenCode …" and pauses automatic restarts; the old session and its id are left untouched. Either open **Restart / Reset → Reset Session & Restart** (new session on the installed version; Raft messages and workspace files stay) or reinstall the OpenCode line the session was created with and restart the agent.
- **"OpenCode runtime sees custom DeepSeek model in dropdown"**: OpenCode runtime supports its own provider abstraction. Configure DeepSeek in `~/.config/opencode/opencode.json` provider config → rescan → DeepSeek models appear in Raft's Model dropdown (via `opencode models` detection).
- **"Built-in Pi + Anthropic Compatible + MiniMax-M3.1-Flash-Preview fails with `requires adaptive thinking`"**: that model never runs without thinking and rejects `thinking.type: "disabled"` (MiniMax docs). Computers **before 1.0.48** send exactly that on an unset effort, so the 400 is expected there, and a chosen Max is clamped to high. Starting with Computer 1.0.48, Raft Computer knows this exact pair — `https://api.minimax.cn/anthropic` or `https://api.minimax.io/anthropic` with the full model id — and sends adaptive thinking with the chosen effort; an unset effort uses MiniMax's own default for an omitted effort (`max`), and Max is sent as `max`. Other endpoints or other model ids get no such adaptation; an Anthropic-compatible endpoint + model pair that the Pi SDK catalog knows takes the catalog's metadata. Upgrade the Computer, then restart the agent.
- **"Pi runtime sees a configured provider model in dropdown"**: Pi runtime reports its local catalog via the Pi SDK model registry; Raft marks those machine-detected entries launchable and launches them through the same SDK model entry.
- **"Runtime authenticated locally but agent says runtime not logged in"**: agent runs as a separate process; runtime auth may not be shared. Sign in from the Computer's page (**Sign In** on the runtime's chip, for the runtimes listed above), or log into the runtime CLI in the agent's actual shell / environment.
- **"My agent stopped and messages/reminders no longer wake it"** (after a credential or plan error): when the runtime rejects the agent's model credential, or the plan does not include its model, retrying cannot help, so Raft stops waking the agent automatically and posts one notice in your DM with the agent (with the error and a link to the agent page). Messages and reminders that arrive meanwhile are kept, not lost. Fix the credential or model, then save a change to the agent's runtime settings (model, provider, API key or environment variables lift the pause) or start the agent manually; the next start carries everything that waited. You are told again only if the error comes back after a fix.
- **"The agent shows Idle right after it started background subagents"**: with Claude Code, starting a background subagent (or a background command) returns at once and the main turn ends, so the agent really is idle for message delivery. Starting with Computer 1.0.48, the status for that quiet turn reads **Working — Waiting for N background tasks** (yellow) until Claude reports each task finished (completed, failed or stopped); it then reads Idle unless the agent has already begun a new turn. Earlier Computers show Idle during that wait. Messages are delivered the same way in both cases.
- **"My agent hit its usage limit (5-hour or weekly quota)"**: when the runtime reports a used-up quota with a reset time, Raft holds the agent's messages until that reset, waiting at most an hour at a time (hitting the limit again starts another wait). Messages are kept, not lost, and the error status stays until the model answers again. Restarting does not lift a provider quota; tell the person the agent resumes when the limit resets, or switch the agent to another model or account to resume sooner. Repeated recoverable crashes (connection, server or stream errors, rate limits) are also retried with growing waits, from 10 seconds up to 5 minutes. Needs Computer 1.0.60 or later.
- **"Runtime keeps erroring — rate limit / auth failure / model unavailable, status dot orange"**: first check the runtime subscription/key is valid and has capacity, and that the provider isn't down. Recover the agent from its detail panel: **Actions → Restart / Reset** (a fresh session clears transient errors); if it stays stuck, restart Raft Computer on the machine running the agent with `raft-computer restart /<server-slug>`. To report it, use **Actions → Report Issue** (sends a report with the agent's diagnostics + session trace the team can use to investigate) or **Copy Diagnostic Info** to include when contacting the team at contact@raft.build. Deeper local diagnosis (terminal): `raft-computer doctor /<server-slug>`, or `raft-computer logs /<server-slug> --lines 200` (service-level: add `--service`) — don't paste tokens or secrets.

## Composition

A Runtime:
- Is one of twelve supported AI engine families (Claude Code · Codex · Grok Build · Built-in Pi · Kimi Code · Cursor · OpenCode · Pi · Antigravity (deprecated) · Copilot (deprecated) · Gemini (deprecated) · Kimi CLI (deprecated)) or one of the two experimental ones (Qwen Code · Qoder)
- Lives as a CLI or SDK-backed engine available on a [Computer](https://docs.raft.build/features/server/computers.md)
- Is selected when creating an [Agent](https://docs.raft.build/features/agents.md) (one runtime per agent)
- Has its own authentication (logged in separately from Raft)
- Has its own model selection within it

Different runtimes have different capabilities, costs, and behavior. Raft normalizes lifecycle and delivery events while each runtime still brings its own model behavior and capabilities. The agent's responses are shaped by both the runtime's underlying model AND the agent's own runtime configuration and agent description.

### Local Pi plugins in Built-in

Built-in isolates its provider credentials, model configuration, and sessions from the host Pi installation. In an agent’s advanced runtime settings, **Load local Pi extensions** opts that agent into the enabled extensions in the computer’s Pi agent directory (`~/.pi/agent`, or `PI_CODING_AGENT_DIR`). This includes extensions from already-installed Pi packages; missing packages are not installed. The option defaults off and does not import host skills, prompts, auth, or model settings. Saving changes to a running agent applies them when the agent is next idle (or at once with **Restart now**); stopped agents use the selection on their next start.
