Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# T3 Code

T3 Code is a minimal GUI for coding agents. A Node WebSocket server wraps provider CLIs and agents (Codex, Claude Code, Cursor, Grok, OpenCode, Antigravity, Kiro) and serves web, desktop, and mobile clients.
T3 Code is a minimal GUI for coding agents. A Node WebSocket server wraps provider CLIs and agents (Codex, Claude Code, Cursor, Grok, OpenCode, Antigravity, Kiro, Mistral Vibe) and serves web, desktop, and mobile clients.

You can think of T3 Code as an open source "bring-your-own-subscription" alternative to apps like Claude Desktop, Codex App, Cursor Glass and Conductor.

Expand Down Expand Up @@ -68,7 +68,7 @@ The most common defect in this repo is a change that works on the path you teste

- **Entry points.** A behavior reachable from the chat view is usually also reachable from Settings, the command palette, and a keybinding. Fixing one is not fixing the feature.
- **Clients.** Web, desktop (wraps web, adds Electron shell/IPC), and mobile (React Native, separate navigation). Shared logic lives in `packages/client-runtime`
- **Providers.** Codex, Claude, Cursor, Grok, OpenCode, Antigravity, and Kiro each have an adapter. Provider-shaped features need a decision per adapter, even if the decision is "not supported here".
- **Providers.** Codex, Claude, Cursor, Grok, OpenCode, Antigravity, Kiro, and Mistral Vibe each have an adapter. Provider-shaped features need a decision per adapter, even if the decision is "not supported here".
- **Agents.** A capability a user can trigger is usually one an agent should reach through MCP tools, and scheduled tasks run the same paths. That only works when it is a service method, not handler code.
- **Contracts.** Anything crossing the wire is typed in `packages/contracts`. Change the schema and the server, web, mobile, and desktop all follow.
- **Reverse states.** If you added a way in, add the way out and the way to see it. Snooze needs unsnooze. Close needs reopen. A one-way door is a bug.
Expand Down
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

T3 Code is an "agent harness control surface". It enables control of the agents on your machine with a best-in-class mobile app ([iOS](https://apps.apple.com/us/app/t3-code-remote-claude-more/id6787819824), [Android](https://play.google.com/store/apps/details?id=com.t3tools.t3code)), [web app](https://app.t3.codes) and [Electron-based desktop app](https://t3.codes).

Works with your subscriptions on Claude Code, Codex, Cursor, Grok Build, OpenCode, Google Antigravity, and fx. If they're set up on your computer, T3 Code can control them.
Works with your subscriptions on Claude Code, Codex, Cursor, Grok Build, OpenCode, Google Antigravity, fx, and Mistral Vibe. If they're set up on your computer, T3 Code can control them.

## "Wait, what are you selling me?"

Expand All @@ -13,7 +13,7 @@ We wanted something performant, remote-ready, and truly open. If we ever go the
## Installation

> [!WARNING]
> T3 Code currently supports Codex, Claude, Cursor, Grok Build, OpenCode, Antigravity, and fx. Install and authenticate at least one provider before use:
> T3 Code currently supports Codex, Claude, Cursor, Grok Build, OpenCode, Antigravity, fx, and Mistral Vibe. Install and authenticate at least one provider before use:
>
> - Codex: install [Codex CLI](https://developers.openai.com/codex/cli) and run `codex login`
> - Claude: install [Claude Code](https://claude.com/product/claude-code) and run `claude auth login`
Expand All @@ -22,6 +22,7 @@ We wanted something performant, remote-ready, and truly open. If we ever go the
> - OpenCode: install [OpenCode](https://opencode.ai) and run `opencode auth login`
> - Antigravity: enable it in Settings, then use **Install Antigravity** and **Sign in with Google**. No CLI is required.
> - fx: install [fx](https://fx.sh) and run `fx login` on the machine running the T3 Code server ([setup guide](./docs/user/providers-fx.md))
> - Mistral Vibe: install [Mistral Vibe](https://github.com/mistralai/mistral-vibe) and run `vibe --setup` on the machine running the T3 Code server ([setup guide](./docs/user/providers-vibe.md))

### Command line

Expand Down
1 change: 1 addition & 0 deletions apps/server/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
"@t3tools/provider-muse": "workspace:*",
"@t3tools/provider-opencode": "workspace:*",
"@t3tools/provider-pi": "workspace:*",
"@t3tools/provider-vibe": "workspace:*",
"@t3tools/source-control-azure-devops": "workspace:*",
"@t3tools/source-control-bitbucket": "workspace:*",
"@t3tools/source-control-core": "workspace:*",
Expand Down
2 changes: 2 additions & 0 deletions apps/server/src/policy/managedProviders.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import { cursorClient } from "@t3tools/provider-cursor/client";
import { fxClient } from "@t3tools/provider-fx/client";
import { grokClient } from "@t3tools/provider-grok/client";
import { kiroClient } from "@t3tools/provider-kiro/client";
import { vibeClient } from "@t3tools/provider-vibe/client";
import { museClient } from "@t3tools/provider-muse/client";
import { openCodeClient } from "@t3tools/provider-opencode/client";
import { piClient } from "@t3tools/provider-pi/client";
Expand Down Expand Up @@ -47,6 +48,7 @@ const PACKAGED_CLIENTS: ReadonlyArray<ProviderClientDefinition> = [
grokClient,
fxClient,
kiroClient,
vibeClient,
museClient,
openCodeClient,
piClient,
Expand Down
3 changes: 3 additions & 0 deletions apps/server/src/provider/builtInDrivers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import type {
ProviderUsageReaderEnv,
} from "@t3tools/provider-core/server/driver";
import { KiroDriver, type KiroDriverEnv } from "@t3tools/provider-kiro/server";
import { VibeDriver, type VibeDriverEnv } from "@t3tools/provider-vibe/server";

export type BuiltInDriversEnv =
| AcpRegistryDriverEnv
Expand All @@ -26,6 +27,7 @@ export type BuiltInDriversEnv =
| FxDriverEnv
| GrokDriverEnv
| KiroDriverEnv
| VibeDriverEnv
| OpenCodeDriverEnv
| PiDriverEnv
| MuseDriverEnv;
Expand All @@ -39,6 +41,7 @@ export const BUILT_IN_DRIVERS: ReadonlyArray<AnyProviderDriver<BuiltInDriversEnv
OpenCodeDriver,
AntigravityDriver,
KiroDriver,
VibeDriver,
PiDriver,
MuseDriver,
AcpRegistryDriver,
Expand Down
6 changes: 6 additions & 0 deletions apps/server/src/provider/model-manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,12 @@
"recommendedRange": ">=2.27.0",
"ranges": [{ "range": ">=2.27.0", "status": "supported" }]
},
{
"driver": "vibe",
"t3CodeRange": ">=0.1.7",
"recommendedRange": ">=3.0.3",
"ranges": [{ "range": ">=3.0.3", "status": "supported" }]
},
{
"driver": "pi",
"t3CodeRange": ">=0.0.46",
Expand Down
1 change: 1 addition & 0 deletions apps/server/src/provider/providerStatusCache.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ const BUILT_IN_DRIVER_ORDER: ReadonlyArray<string> = [
"antigravity",
"fx",
"kiro",
"vibe",
];

const driverRank = (driver: string): number => {
Expand Down
2 changes: 2 additions & 0 deletions apps/server/src/settingsSecrets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import { acpRegistryClient } from "@t3tools/provider-acp-registry/client";
import { cursorClient } from "@t3tools/provider-cursor/client";
import { grokClient } from "@t3tools/provider-grok/client";
import { kiroClient } from "@t3tools/provider-kiro/client";
import { vibeClient } from "@t3tools/provider-vibe/client";
import { museClient } from "@t3tools/provider-muse/client";
import { openCodeClient } from "@t3tools/provider-opencode/client";
import { piClient } from "@t3tools/provider-pi/client";
Expand All @@ -35,6 +36,7 @@ const providerSecretFields = new Map([
cursorClient,
grokClient,
kiroClient,
vibeClient,
museClient,
openCodeClient,
piClient,
Expand Down
2 changes: 1 addition & 1 deletion docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
- [Running in the background](./user/background-service.md)
- [Updating T3 Code](./user/updating.md)
- [Triage an issue](./user/triage.md)
- Provider guides: [Codex](./user/providers-codex.md) · [Claude](./user/providers-claude.md) · [OpenCode](./user/providers-opencode.md) · [Antigravity](./user/providers-antigravity.md) · [Kiro](./user/providers-kiro.md) · [Pi](./user/providers-pi.md) · [Muse Code](./user/providers-muse.md) · [fx](./user/providers-fx.md)
- Provider guides: [Codex](./user/providers-codex.md) · [Claude](./user/providers-claude.md) · [OpenCode](./user/providers-opencode.md) · [Antigravity](./user/providers-antigravity.md) · [Kiro](./user/providers-kiro.md) · [Pi](./user/providers-pi.md) · [Muse Code](./user/providers-muse.md) · [fx](./user/providers-fx.md) · [Mistral Vibe](./user/providers-vibe.md)

---

Expand Down
28 changes: 15 additions & 13 deletions docs/user/install.md
Original file line number Diff line number Diff line change
Expand Up @@ -158,18 +158,19 @@ and enable the provider you want. Installation, login, and configuration belong
to that environment's machine, even when you connect from a phone or another
computer.

| Provider | Install and authenticate |
| ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Codex | [Connect with ChatGPT](./providers-codex.md#connect-with-chatgpt), or install [Codex CLI](https://developers.openai.com/codex/cli) and run `codex login`. |
| Claude | Install [Claude Code](https://claude.com/product/claude-code), then run `claude auth login`. |
| Cursor | Install [Cursor CLI](https://cursor.com/cli), then run `agent login`. |
| Grok Build | Install [Grok Build CLI](https://x.ai/cli), then run `grok login`. |
| Kiro | Install [Kiro CLI](https://kiro.dev/docs/cli/), then run `kiro-cli login`. |
| OpenCode | Install [OpenCode](https://opencode.ai), then run `opencode auth login`. |
| Antigravity | Install and sign in with Google from T3 Code's provider settings. |
| Pi | Install [Pi](./providers-pi.md#set-up-pi) with Node.js 22.19 or newer, then run `pi` and `/login`. |
| Muse Code | Install [Muse Code](https://dev.meta.ai/docs/muse-code) on the server, run `muse login`, then enable it in Settings → Providers. |
| fx | Install [fx](https://fx.sh) with `curl -fsSL https://fx.sh/setup.sh \| bash`, then run `fx login`. |
| Provider | Install and authenticate |
| ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Codex | [Connect with ChatGPT](./providers-codex.md#connect-with-chatgpt), or install [Codex CLI](https://developers.openai.com/codex/cli) and run `codex login`. |
| Claude | Install [Claude Code](https://claude.com/product/claude-code), then run `claude auth login`. |
| Cursor | Install [Cursor CLI](https://cursor.com/cli), then run `agent login`. |
| Grok Build | Install [Grok Build CLI](https://x.ai/cli), then run `grok login`. |
| Kiro | Install [Kiro CLI](https://kiro.dev/docs/cli/), then run `kiro-cli login`. |
| Mistral Vibe | Install [Mistral Vibe](./providers-vibe.md#set-up-mistral-vibe), then run `vibe --setup`. |
| OpenCode | Install [OpenCode](https://opencode.ai), then run `opencode auth login`. |
| Antigravity | Install and sign in with Google from T3 Code's provider settings. |
| Pi | Install [Pi](./providers-pi.md#set-up-pi) with Node.js 22.19 or newer, then run `pi` and `/login`. |
| Muse Code | Install [Muse Code](https://dev.meta.ai/docs/muse-code) on the server, run `muse login`, then enable it in Settings → Providers. |
| fx | Install [fx](https://fx.sh) with `curl -fsSL https://fx.sh/setup.sh \| bash`, then run `fx login`. |

Provider CLIs must be on the server's `PATH`. If T3 Code cannot find one, set its
**Binary path** in provider settings, especially when using a version manager.
Expand Down Expand Up @@ -200,7 +201,8 @@ their original values.
For provider-specific setup and accounts, see [Codex](./providers-codex.md),
[Claude](./providers-claude.md), [OpenCode](./providers-opencode.md),
[Antigravity](./providers-antigravity.md), [Kiro](./providers-kiro.md),
[Pi](./providers-pi.md), [Muse Code](./providers-muse.md), and [fx](./providers-fx.md).
[Pi](./providers-pi.md), [Muse Code](./providers-muse.md), [fx](./providers-fx.md), and
[Mistral Vibe](./providers-vibe.md).

## Next steps

Expand Down
2 changes: 1 addition & 1 deletion docs/user/managed-policy.md
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,7 @@ so restart T3 Code after that.

`providers.allowedDrivers` lists the providers that may run, by ID: `codex` (Codex),
`claudeAgent` (Claude), `cursor` (Cursor), `grok` (Grok), `opencode` (OpenCode), `antigravity`
(Antigravity), `fx` (fx), `kiro` (Kiro), `pi` (Pi), `muse` (Muse Code), and `acpRegistry` (ACP
(Antigravity), `fx` (fx), `kiro` (Kiro), `vibe` (Mistral Vibe), `pi` (Pi), `muse` (Muse Code), and `acpRegistry` (ACP
Registry).
`t3 policy check` rejects an ID this version does not know. Threads on other providers stay,
marked unavailable, and users can still turn those providers off.
Expand Down
3 changes: 3 additions & 0 deletions docs/user/permission-modes.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,4 +57,7 @@ approvals for actions that support them.
Kiro offers only **Supervised** and **Full access**. In **Supervised** Kiro also asks you to
review a turn's file changes. See [Kiro permissions](./providers-kiro.md#permission-modes).

Mistral Vibe offers no **Auto**. Each other mode runs the matching Vibe agent. See
[Mistral Vibe permissions](./providers-vibe.md#permission-modes).

See the [provider guides](./install.md#providers) for setup and provider-specific limits.
36 changes: 36 additions & 0 deletions docs/user/providers-vibe.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Mistral Vibe

T3 Code runs [Mistral Vibe](https://github.com/mistralai/mistral-vibe) as an agent through its ACP
server, `vibe-acp`, using your own Mistral account and Vibe configuration.

## Set Up Mistral Vibe

1. Install Vibe on the machine running the T3 Code server:
`curl -LsSf https://mistral.ai/vibe/install.sh | bash`, or `uv tool install mistral-vibe`.
2. Run `vibe --setup` once in a terminal. You can instead set `MISTRAL_API_KEY` in the Mistral Vibe
provider's **Mistral API key** field.
3. Open **Settings → Providers**, add **Mistral Vibe**, and enable it.

If `vibe-acp` is not on the server's `PATH`, set its **Binary path**. The installer usually puts it
in `~/.local/bin`.

## Models

The model picker lists the models Vibe offers once it is signed in. **Default** keeps the model
Vibe itself would start with. That model shows a **Thinking** setting with the levels Vibe offers
for it; other models run at Vibe's own thinking setting.

After changing your Vibe configuration or account, refresh provider status in **Settings →
Providers** to reload the model list.

## Permission Modes

The permission mode picks the Vibe agent a thread runs as:

- **Supervised** runs Vibe's `ask` agent. Commands and file changes wait for your approval; reads
and searches run without asking.
- **Auto-accept edits** runs `accept-edits`: Vibe applies file edits itself and asks before
other tools.
- **Full access** runs `auto-approve`, which runs every tool without asking.

Vibe offers no **Auto** mode in T3 Code.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
"report:renders": "node scripts/render-metrics.ts",
"lint": "vp lint --report-unused-disable-directives",
"knip": "knip --preprocessor ./scripts/knip-schemas.ts",
"knip:check": "knip --include files,dependencies --no-config-hints && knip --workspace apps/server --workspace apps/desktop --workspace apps/web --workspace packages/client-runtime --workspace packages/contracts --workspace packages/effect-acp --workspace packages/effect-codex-app-server --workspace packages/shared --workspace packages/ssh --workspace packages/tailscale --workspace packages/provider-core --workspace packages/provider-acp --workspace packages/provider-acp-registry --workspace packages/provider-testing --workspace packages/provider-pi --workspace packages/provider-muse --workspace packages/provider-opencode --workspace packages/provider-cursor --workspace packages/provider-fx --workspace packages/provider-grok --workspace packages/provider-kiro --workspace packages/secret-provider-core --workspace packages/secret-provider-definitions --workspace packages/secret-provider-onepassword --workspace packages/source-control-core --workspace packages/source-control-definitions --workspace packages/source-control-azure-devops --workspace packages/source-control-bitbucket --workspace packages/source-control-forgejo --workspace packages/source-control-gitcafe --workspace packages/source-control-github --workspace packages/source-control-gitlab --workspace packages/source-control-testing --exports --preprocessor ./scripts/knip-schemas.ts --no-config-hints",
"knip:check": "knip --include files,dependencies --no-config-hints && knip --workspace apps/server --workspace apps/desktop --workspace apps/web --workspace packages/client-runtime --workspace packages/contracts --workspace packages/effect-acp --workspace packages/effect-codex-app-server --workspace packages/shared --workspace packages/ssh --workspace packages/tailscale --workspace packages/provider-core --workspace packages/provider-acp --workspace packages/provider-acp-registry --workspace packages/provider-testing --workspace packages/provider-pi --workspace packages/provider-muse --workspace packages/provider-opencode --workspace packages/provider-cursor --workspace packages/provider-fx --workspace packages/provider-grok --workspace packages/provider-kiro --workspace packages/provider-vibe --workspace packages/secret-provider-core --workspace packages/secret-provider-definitions --workspace packages/secret-provider-onepassword --workspace packages/source-control-core --workspace packages/source-control-definitions --workspace packages/source-control-azure-devops --workspace packages/source-control-bitbucket --workspace packages/source-control-forgejo --workspace packages/source-control-gitcafe --workspace packages/source-control-github --workspace packages/source-control-gitlab --workspace packages/source-control-testing --exports --preprocessor ./scripts/knip-schemas.ts --no-config-hints",
"knip:production": "knip --production --preprocessor ./scripts/knip-schemas.ts",
"lint:mobile": "node scripts/mobile-native-static-check.ts",
"mobile:install": "node scripts/mobile-native-client.ts ensure",
Expand Down
1 change: 1 addition & 0 deletions packages/client-runtime/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -548,6 +548,7 @@
"@t3tools/provider-muse": "workspace:*",
"@t3tools/provider-opencode": "workspace:*",
"@t3tools/provider-pi": "workspace:*",
"@t3tools/provider-vibe": "workspace:*",
"@t3tools/shared": "workspace:*",
"@t3tools/source-control-core": "workspace:*",
"@t3tools/source-control-definitions": "workspace:*",
Expand Down
2 changes: 2 additions & 0 deletions packages/client-runtime/src/providerClients.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import { kiroClient } from "@t3tools/provider-kiro/client";
import { museClient } from "@t3tools/provider-muse/client";
import { openCodeClient } from "@t3tools/provider-opencode/client";
import { piClient } from "@t3tools/provider-pi/client";
import { vibeClient } from "@t3tools/provider-vibe/client";

export const providerClients = makeProviderClientRegistry([
{
Expand Down Expand Up @@ -43,6 +44,7 @@ export const providerClients = makeProviderClientRegistry([
settingsSchema: AntigravitySettings,
},
kiroClient,
vibeClient,
museClient,
piClient,
acpRegistryClient,
Expand Down
Loading
Loading