diff --git a/README.md b/README.md index ba3cf225ed4..e60c5aa405f 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,7 @@ Superset works with any CLI-based coding agent, including: | [Gemini CLI](https://github.com/google-gemini/gemini-cli) | Fully supported | | [GitHub Copilot](https://github.com/features/copilot) | Fully supported | | [OpenCode](https://github.com/opencode-ai/opencode) | Fully supported | +| [Pi](https://github.com/badlogic/pi-mono/tree/main/packages/coding-agent) | Fully supported | | Any CLI agent | Will work | If it runs in a terminal, it runs on Superset diff --git a/apps/desktop/src/lib/trpc/routers/settings/index.ts b/apps/desktop/src/lib/trpc/routers/settings/index.ts index 26ffdc0cc04..be6cfe1a5a1 100644 --- a/apps/desktop/src/lib/trpc/routers/settings/index.ts +++ b/apps/desktop/src/lib/trpc/routers/settings/index.ts @@ -139,6 +139,7 @@ const DEFAULT_PRESET_AGENTS = [ "codex", "copilot", "opencode", + "pi", "gemini", ] as const; diff --git a/apps/desktop/src/renderer/routes/_authenticated/settings/utils/settings-search/settings-search.ts b/apps/desktop/src/renderer/routes/_authenticated/settings/utils/settings-search/settings-search.ts index 2838252c788..d7e56ed6276 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/settings/utils/settings-search/settings-search.ts +++ b/apps/desktop/src/renderer/routes/_authenticated/settings/utils/settings-search/settings-search.ts @@ -502,6 +502,7 @@ export const SETTINGS_ITEMS: SettingsItem[] = [ "superset chat", "claude", "codex", + "pi", ], }, { @@ -518,6 +519,7 @@ export const SETTINGS_ITEMS: SettingsItem[] = [ "codex", "gemini", "opencode", + "pi", "copilot", "cursor", ], @@ -572,6 +574,7 @@ export const SETTINGS_ITEMS: SettingsItem[] = [ "gemini", "cursor", "opencode", + "pi", "ai", "assistant", ], diff --git a/apps/desktop/src/shared/utils/agent-settings.test.ts b/apps/desktop/src/shared/utils/agent-settings.test.ts index 4c7f3f531eb..5b5c671c8f2 100644 --- a/apps/desktop/src/shared/utils/agent-settings.test.ts +++ b/apps/desktop/src/shared/utils/agent-settings.test.ts @@ -47,6 +47,19 @@ describe("resolveAgentConfigs", () => { taskPromptTemplate: "Chat {{slug}}", }); }); + + test("includes pi as a built-in terminal config", () => { + const pi = resolveAgentConfigs({}).find((preset) => preset.id === "pi"); + + expect(pi).toMatchObject({ + id: "pi", + kind: "terminal", + label: "Pi", + command: "pi", + promptCommand: "pi", + enabled: true, + }); + }); }); describe("createOverrideEnvelopeWithPatch", () => { diff --git a/apps/docs/content/docs/agent-integration.mdx b/apps/docs/content/docs/agent-integration.mdx index 6cbfec983c4..5112fb5a2cf 100644 --- a/apps/docs/content/docs/agent-integration.mdx +++ b/apps/docs/content/docs/agent-integration.mdx @@ -14,6 +14,7 @@ Run AI coding agents in isolated workspaces. Each agent works independently with - **Claude Code** - Anthropic's CLI - **Codex** - OpenAI's assistant - **OpenCode** - Open-source alternative +- **Pi** - Minimal terminal coding harness - **Gemini CLI** - Google's CLI agent - **Cursor Agent** - Cursor AI agent diff --git a/apps/docs/content/docs/mcp.mdx b/apps/docs/content/docs/mcp.mdx index c77fb615579..65fd7d06bc5 100644 --- a/apps/docs/content/docs/mcp.mdx +++ b/apps/docs/content/docs/mcp.mdx @@ -15,7 +15,7 @@ Superset provides an [MCP (Model Context Protocol)](https://modelcontextprotocol | **Workspaces** | Create, update, switch, delete, list, navigate workspaces | | **Devices** | List devices, projects, and app context | | **Organization** | List members and task statuses | -| **AI Sessions** | Start autonomous AI agent sessions (Claude, Codex, Gemini, OpenCode, Copilot, Cursor Agent) and subagents | +| **AI Sessions** | Start autonomous AI agent sessions (Claude, Codex, Gemini, OpenCode, Pi, Copilot, Cursor Agent) and subagents | ## Setup @@ -239,7 +239,7 @@ API keys grant full access to your organization. Keep them secret and never comm | Tool | Description | |------|-------------| -| `start_agent_session` | Start an autonomous AI agent session for a task. Supports multiple agents: Claude, Codex, Gemini, OpenCode, Copilot, and Cursor Agent (defaults to Claude). Launches the agent with task context in the specified workspace. When `paneId` is provided, adds a new terminal pane to the tab containing that pane (subagent behavior) instead of initializing the workspace. | +| `start_agent_session` | Start an autonomous AI agent session for a task. Supports multiple agents: Claude, Codex, Gemini, OpenCode, Pi, Copilot, and Cursor Agent (defaults to Claude). Launches the agent with task context in the specified workspace. When `paneId` is provided, adds a new terminal pane to the tab containing that pane (subagent behavior) instead of initializing the workspace. | ## Chat Integration diff --git a/apps/docs/content/docs/terminal-presets.mdx b/apps/docs/content/docs/terminal-presets.mdx index c57f4a03343..3d217f4c6a1 100644 --- a/apps/docs/content/docs/terminal-presets.mdx +++ b/apps/docs/content/docs/terminal-presets.mdx @@ -46,6 +46,7 @@ Pre-configured presets for popular AI agents: - **claude** - `claude --dangerously-skip-permissions` - **codex** - Full danger mode with high reasoning effort - **gemini** - `gemini --yolo` +- **pi** - `pi` - **cursor-agent** - Cursor AI agent - **opencode** - Open-source AI coding agent diff --git a/packages/mcp/src/tools/devices/start-agent-session/start-agent-session.ts b/packages/mcp/src/tools/devices/start-agent-session/start-agent-session.ts index 04b1733a157..8d5a83ac6d6 100644 --- a/packages/mcp/src/tools/devices/start-agent-session/start-agent-session.ts +++ b/packages/mcp/src/tools/devices/start-agent-session/start-agent-session.ts @@ -65,7 +65,7 @@ const inputSchemaShape = { .enum(STARTABLE_AGENT_TYPES) .optional() .describe( - 'AI agent to use: "claude", "codex", "gemini", "opencode", "copilot", "cursor-agent", or "superset-chat". Defaults to "claude".', + 'AI agent to use: "claude", "codex", "gemini", "opencode", "pi", "copilot", "cursor-agent", or "superset-chat". Defaults to "claude".', ), }; diff --git a/packages/shared/src/agent-command.test.ts b/packages/shared/src/agent-command.test.ts index 2b681f37d7a..7619707cef0 100644 --- a/packages/shared/src/agent-command.test.ts +++ b/packages/shared/src/agent-command.test.ts @@ -26,4 +26,15 @@ describe("buildAgentPromptCommand", () => { "claude --dangerously-skip-permissions \"$(cat <<'SUPERSET_PROMPT_abcdefgh'", ); }); + + it("uses pi interactive mode for prompt launches", () => { + const command = buildAgentPromptCommand({ + prompt: "hello", + randomId: "pi-1234", + agent: "pi", + }); + + expect(command).toStartWith("pi \"$(cat <<'SUPERSET_PROMPT_pi1234'"); + expect(command).not.toContain("pi -p"); + }); }); diff --git a/packages/shared/src/agent-command.ts b/packages/shared/src/agent-command.ts index 081622696ea..9fbea4cb831 100644 --- a/packages/shared/src/agent-command.ts +++ b/packages/shared/src/agent-command.ts @@ -8,6 +8,7 @@ export const AGENT_TYPES = [ "codex", "gemini", "opencode", + "pi", "copilot", "cursor-agent", ] as const; @@ -19,6 +20,7 @@ export const AGENT_LABELS: Record = { codex: "Codex", gemini: "Gemini", opencode: "OpenCode", + pi: "Pi", copilot: "Copilot", "cursor-agent": "Cursor Agent", }; @@ -30,6 +32,7 @@ export const AGENT_PRESET_COMMANDS: Record = { ], gemini: ["gemini --yolo"], opencode: ["opencode"], + pi: ["pi"], copilot: ["copilot --allow-all"], "cursor-agent": ["cursor-agent"], }; @@ -42,6 +45,7 @@ export const AGENT_PRESET_DESCRIPTIONS: Record = { gemini: "Google's open-source terminal agent for coding, problem-solving, and task work.", opencode: "Open-source coding agent for the terminal, IDE, and desktop.", + pi: "Minimal terminal coding harness for flexible coding workflows.", copilot: "GitHub's coding agent for planning, editing, and building in your repo.", "cursor-agent": @@ -70,6 +74,9 @@ export const AGENT_PROMPT_COMMANDS: Record< opencode: { command: "opencode --prompt", }, + pi: { + command: AGENT_PRESET_COMMANDS.pi[0] ?? "pi", + }, copilot: { command: "copilot -i --allow-all", suffix: "--yolo", diff --git a/packages/ui/src/assets/icons/preset-icons/index.ts b/packages/ui/src/assets/icons/preset-icons/index.ts index 1ee3ca48621..3c7b00b124d 100644 --- a/packages/ui/src/assets/icons/preset-icons/index.ts +++ b/packages/ui/src/assets/icons/preset-icons/index.ts @@ -7,6 +7,8 @@ import cursorAgentIcon from "./cursor.svg"; import geminiIcon from "./gemini.svg"; import opencodeIcon from "./opencode.svg"; import opencodeWhiteIcon from "./opencode-white.svg"; +import piIcon from "./pi.svg"; +import piWhiteIcon from "./pi-white.svg"; import supersetIcon from "./superset.svg"; export interface PresetIconSet { @@ -19,6 +21,7 @@ export const PRESET_ICONS: Record = { codex: { light: codexIcon, dark: codexWhiteIcon }, copilot: { light: copilotIcon, dark: copilotWhiteIcon }, gemini: { light: geminiIcon, dark: geminiIcon }, + pi: { light: piIcon, dark: piWhiteIcon }, superset: { light: supersetIcon, dark: supersetIcon }, "superset-chat": { light: supersetIcon, dark: supersetIcon }, "cursor-agent": { light: cursorAgentIcon, dark: cursorAgentIcon }, @@ -45,5 +48,7 @@ export { geminiIcon, opencodeIcon, opencodeWhiteIcon, + piIcon, + piWhiteIcon, supersetIcon, }; diff --git a/packages/ui/src/assets/icons/preset-icons/pi-white.svg b/packages/ui/src/assets/icons/preset-icons/pi-white.svg new file mode 100644 index 00000000000..df568173eb8 --- /dev/null +++ b/packages/ui/src/assets/icons/preset-icons/pi-white.svg @@ -0,0 +1,20 @@ + + + + + diff --git a/packages/ui/src/assets/icons/preset-icons/pi.svg b/packages/ui/src/assets/icons/preset-icons/pi.svg new file mode 100644 index 00000000000..9f9c9eb0695 --- /dev/null +++ b/packages/ui/src/assets/icons/preset-icons/pi.svg @@ -0,0 +1,20 @@ + + + + +