diff --git a/CHANGELOG.md b/CHANGELOG.md
index c608e426d..cd2fd731b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -680,7 +680,7 @@
### Added
-- Pi (pi.dev) agent provider — connect Pi as a new ACP-based agent type with thinking levels and tool call support
+- Pi (pi.dev) agent provider — connect Pi as a new agent type with thinking levels and tool call support
- Copilot agent provider re-enabled after ACP compatibility fixes
- `paseo .` and `paseo
One interface for all your Claude Code, Codex and OpenCode agents.
+One interface for Claude Code, Codex, Copilot, OpenCode, and Pi agents.
@@ -34,7 +34,7 @@
Run agents in parallel on your own machines. Ship from your phone or your desk.
- **Self-hosted:** Agents run on your machine with your full dev environment. Use your tools, your configs, and your skills.
-- **Multi-provider:** Claude Code, Codex, and OpenCode through the same interface. Pick the right model for each job.
+- **Multi-provider:** Claude Code, Codex, Copilot, OpenCode, and Pi through the same interface. Pick the right model for each job.
- **Voice control:** Dictate tasks or talk through problems in voice mode. Hands-free when you need it.
- **Cross-device:** iOS, Android, desktop, web, and CLI. Start work at your desk, check in from your phone, script it from the terminal.
- **Privacy-first:** Paseo doesn't have any telemetry, tracking, or forced log-ins.
@@ -49,7 +49,9 @@ You need at least one agent CLI installed and configured with your credentials:
- [Claude Code](https://docs.anthropic.com/en/docs/claude-code)
- [Codex](https://github.com/openai/codex)
+- [GitHub Copilot](https://github.com/features/copilot/cli/)
- [OpenCode](https://github.com/anomalyco/opencode)
+- [Pi](https://pi.dev)
### Desktop app (recommended)
diff --git a/docs/architecture.md b/docs/architecture.md
index 502854d9a..118b5b824 100644
--- a/docs/architecture.md
+++ b/docs/architecture.md
@@ -22,13 +22,13 @@ Your code never leaves your machine. Paseo is local-first.
│ (Node.js) │
└──────┬──────┘
│
- ┌────────────┼────────────┐
- │ │ │
-┌─────▼─────┐ ┌───▼────┐ ┌────▼─────┐
-│ Claude │ │ Codex │ │ OpenCode │
-│ Agent │ │ Agent │ │ Agent │
-│ SDK │ │ Server │ │ │
-└───────────┘ └────────┘ └──────────┘
+ ┌────────────┼────────────┬────────────┬────────────┐
+ │ │ │ │ │
+┌─────▼─────┐ ┌───▼────┐ ┌──────▼─────┐ ┌────▼─────┐ ┌────▼────┐
+│ Claude │ │ Codex │ │ Copilot │ │ OpenCode │ │ Pi │
+│ Agent │ │ Agent │ │ Agent │ │ Agent │ │ Agent │
+│ SDK │ │ Server │ │ ACP │ │ │ │ │
+└───────────┘ └────────┘ └────────────┘ └──────────┘ └─────────┘
```
## Components at a glance
@@ -215,16 +215,17 @@ initializing → idle ⇄ running
Each provider implements the `AgentClient` interface in `agent/agent-sdk-types.ts`. Provider implementations live in `agent/providers/`.
-The three first-class, user-facing providers are Claude Code, Codex, and OpenCode. Additional adapters exist in the same directory for ACP-compatible agents and internal use:
+The built-in, user-facing providers are Claude Code, Codex, Copilot, OpenCode, and Pi. Additional adapters exist in the same directory for ACP-compatible agents and internal use:
| Provider | Wraps | Session format |
| ------------------ | ------------------------------------ | -------------------------------------------------- |
| Claude (`claude/`) | Anthropic Agent SDK | `~/.claude/projects/{cwd}/{session-id}.jsonl` |
| Codex | Codex AppServer (`codex-app-server`) | `~/.codex/sessions/{date}/rollout-{ts}-{id}.jsonl` |
+| Copilot | GitHub Copilot via ACP | Provider-managed |
| OpenCode | OpenCode server / CLI | Provider-managed |
-| Cursor / Copilot | ACP wrapper (`acp-agent`) | Provider-managed |
+| Cursor | ACP wrapper (`acp-agent`) | Provider-managed |
| Generic ACP | ACP wrapper | Provider-managed |
-| Pi-direct | Direct Anthropic API call | Stateless |
+| Pi | Local Pi RPC process | Provider-managed |
| Mock load test | In-process fake | In-memory |
All providers:
diff --git a/docs/glossary.md b/docs/glossary.md
index 3a7c55e76..31fc812c9 100644
--- a/docs/glossary.md
+++ b/docs/glossary.md
@@ -15,7 +15,7 @@ Authoritative terminology. UI label wins. Don't invent synonyms; use what's here
- **Repository / Remote** — Internal git inputs (`remoteUrl`, `mainRepoRoot`) used to derive `projectKey`. No UI label.
- **Session** — Per-client connection to a daemon. Internal. Code: `Session` (`packages/server/src/server/session.ts`). Don't confuse with: provider-side agent session log.
- **Profile** — Internal name for the persisted shape of a host. Code: `HostProfile` (`packages/app/src/types/host-connection.ts:37`). Never user-facing.
-- **Provider** — Agent backend (Claude Code, Codex, OpenCode). UI: "Provider". Code: `ProviderSnapshotEntry` (`packages/server/src/shared/messages.ts:198`).
+- **Provider** — Agent backend (Claude Code, Codex, Copilot, OpenCode, Pi). UI: "Provider". Code: `ProviderSnapshotEntry` (`packages/server/src/shared/messages.ts:198`).
- **Model** — A specific LLM offered by a provider. UI: "Model" / "Select model". Code: `AgentModelDefinition` (`packages/server/src/shared/messages.ts:187`).
- **Terminal** — Workspace-scoped PTY shell streamed over the binary mux channel. UI: "Terminal". Code: `TerminalStreamFrame` (`packages/server/src/shared/terminal-stream-protocol.ts`).
- **Schedule** — Cron-style trigger that creates remote agents. UI: CLI only (`paseo schedule`). Code: `ScheduleCreateRequest` (re-exported from `packages/server/src/shared/messages.ts`). Don't confuse with: Loop (iterative re-execution of one agent).
diff --git a/docs/testing.md b/docs/testing.md
index 7891e748f..9344e09bb 100644
--- a/docs/testing.md
+++ b/docs/testing.md
@@ -102,14 +102,14 @@ When a test is labeled end-to-end, it calls the real service. No environment var
Vitest picks up tests by suffix. The suffix tells the runner which category it belongs to.
-| Suffix | What it is | Where it runs |
-| --------------------- | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
-| `*.test.ts(x)` | Unit test — pure, fast, no daemon | `npm run test:unit` |
-| `*.posix.test.ts` | Unit test that needs POSIX-only behavior | unit, skipped on Windows |
-| `*.browser.test.ts` | App test that needs a real browser (DOM) | `npm run test:browser` (Vitest browser mode, Playwright provider, headless Chromium) |
-| `*.e2e.test.ts` | End-to-end against a real daemon | `npm run test:e2e` |
-| `*.real.e2e.test.ts` | E2E that hits a real provider (Claude/Codex/OpenCode) — needs creds in `packages/server/.env.test` | `npm run test:integration:real` / `test:e2e:real` |
-| `*.local.e2e.test.ts` | E2E that needs a local-only resource | `npm run test:integration:local` / `test:e2e:local` |
+| Suffix | What it is | Where it runs |
+| --------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
+| `*.test.ts(x)` | Unit test — pure, fast, no daemon | `npm run test:unit` |
+| `*.posix.test.ts` | Unit test that needs POSIX-only behavior | unit, skipped on Windows |
+| `*.browser.test.ts` | App test that needs a real browser (DOM) | `npm run test:browser` (Vitest browser mode, Playwright provider, headless Chromium) |
+| `*.e2e.test.ts` | End-to-end against a real daemon | `npm run test:e2e` |
+| `*.real.e2e.test.ts` | E2E that hits a real provider (Claude/Codex/Copilot/OpenCode/Pi) — needs creds in `packages/server/.env.test` | `npm run test:integration:real` / `test:e2e:real` |
+| `*.local.e2e.test.ts` | E2E that needs a local-only resource | `npm run test:integration:local` / `test:e2e:local` |
App-level Playwright browser E2E lives in `packages/app/e2e/*.spec.ts` and runs via `npm run test:e2e --workspace=@getpaseo/app` (separate from Vitest E2E).
diff --git a/packages/server/CLAUDE.md b/packages/server/CLAUDE.md
index 76e9222ec..c398db6c7 100644
--- a/packages/server/CLAUDE.md
+++ b/packages/server/CLAUDE.md
@@ -4,7 +4,7 @@ For AI coding agents working in `packages/server`. Supplements [CLAUDE.md](../CL
## Project Overview
-Paseo is a mobile + CLI app for monitoring and controlling local AI coding agents (Claude Code, Codex, OpenCode). The daemon runs on your machine, manages agent processes, and streams their output over WebSocket to clients.
+Paseo is a mobile + CLI app for monitoring and controlling local AI coding agents (Claude Code, Codex, GitHub Copilot, OpenCode, Pi). The daemon runs on your machine, manages agent processes, and streams their output over WebSocket to clients.
---
@@ -166,7 +166,7 @@ packages/server/src/
│ └── agent/
│ ├── agent-manager.ts # Agent lifecycle state machine
│ └── agent-storage.ts # File-backed JSON persistence
-├── providers/ # Claude, Codex, OpenCode adapters
+├── providers/ # Claude, Codex, Copilot, OpenCode, Pi adapters
├── relay-transport.ts # Outbound relay connection
└── client/daemon-client.ts # Client library for daemon connection
```
diff --git a/packages/website/src/components/landing-page.tsx b/packages/website/src/components/landing-page.tsx
index d4248879e..0ca30f49d 100644
--- a/packages/website/src/components/landing-page.tsx
+++ b/packages/website/src/components/landing-page.tsx
@@ -1473,9 +1473,9 @@ function FAQ() {
We can't make promises on behalf of providers.
- That said, Paseo launches the official first-party CLIs (Claude Code, Codex, OpenCode) - as subprocesses. It doesn't extract tokens or call inference APIs directly. From - the provider's perspective, usage through Paseo is indistinguishable from running - the CLI yourself. + That said, Paseo launches each provider's local CLI or integration (Claude Code, + Codex, Copilot, OpenCode, Pi) as a subprocess. It doesn't extract tokens or call + inference APIs directly. From the provider's perspective, usage through Paseo is + indistinguishable from running the provider yourself.
I've been using Paseo with all providers for months without issue.