Skip to content
Closed
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
1 change: 1 addition & 0 deletions desktop/public/harness-logos/CREDITS.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ license permits redistribution.
| `devin.svg` | [Cognition Devin documentation](https://docs.devin.ai/cli) | Retrieved 2026-07-27 | Cognition trademark; nominative use to identify the Devin harness | Official documentation `logo/favicon.svg` | Added the official black mark to a white square canvas so it remains legible in both app themes |
| `hermes.png` | [NousResearch/hermes-agent](https://github.com/NousResearch/hermes-agent) | `6ad632b` | MIT © 2025 Nous Research | `website/static/img/logo.png` | Cropped the baked-in border frame, padded to square, resized to 64×64, quantised to a 16-colour palette |
| `openclaw.svg` | [openclaw/openclaw](https://github.com/openclaw/openclaw) | `b06f40a` | MIT © 2026 OpenClaw Foundation | `ui/public/favicon.svg` | Removed the SMIL animation elements (renders the upstream rest pose statically — verified pixel-identical to the upstream frame at t=0); minified paths |
| `pi.svg` | [earendil-works/pi](https://github.com/earendil-works/pi) | Retrieved 2026-08-21 | MIT © 2025 Mario Zechner | [`https://pi.dev/logo-auto.svg`](https://pi.dev/logo-auto.svg) | None |
| `omp.svg` | [can1357/oh-my-pi](https://github.com/can1357/oh-my-pi) | `667111575ebba136dadfd6989379e7f67e0d40d9` | MIT © 2025 Mario Zechner; © 2025–2026 Can Bölük | `assets/icon.svg` | None |
| `kimi.png` | [MoonshotAI/kimi-cli](https://github.com/MoonshotAI/kimi-cli) | `4a550effdfcb29a25a5d325bf935296cc50cd417` | Apache-2.0; NOTICE: Kimi Code CLI © 2025 Moonshot AI | `web/public/logo.png` | None |
| `grok.svg` | [SpaceXAI brand guidelines](https://x.ai/legal/brand-guidelines) | Retrieved 2026-07-25 | xAI Brand Guidelines: marks may be used to accurately refer to xAI or its services; logos must be used exactly as provided | `SpaceXAI_Grok_Assets.zip` → `Grok_Logomark_Dark.svg` | None |
Expand Down
28 changes: 28 additions & 0 deletions desktop/public/harness-logos/pi.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
37 changes: 37 additions & 0 deletions desktop/src-tauri/src/managed_agents/discovery/presets.rs
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,15 @@ pub(super) const PRESET_HARNESSES: &[PresetHarness] = &[
install_hint: "Buzz talks to Cursor through the cursor-agent CLI's ACP mode.",
underlying_cli: None,
},
PresetHarness {
id: "pi",
label: "Pi",
command: "pi-acp",
args: &[],
install_instructions_url: "https://github.com/svkozak/pi-acp",
install_hint: "Buzz talks to the standard Pi CLI through the pi-acp adapter. Follow the setup guide to install both pi and pi-acp so both commands are on your PATH.",
underlying_cli: Some("pi"),
},
PresetHarness {
id: "omp",
label: "Oh My Pi",
Expand Down Expand Up @@ -347,6 +356,34 @@ mod tests {
assert_eq!(entry.source, HarnessSource::Preset);
}

#[test]
fn pi_preset_uses_standard_pi_acp_adapter() {
let preset = PRESET_HARNESSES
.iter()
.find(|preset| preset.id == "pi")
.expect("Pi preset should be present");

assert_eq!(preset.label, "Pi");
assert_eq!(preset.command, "pi-acp");
assert!(preset.args.is_empty());
assert_eq!(preset.underlying_cli, Some("pi"));
assert_eq!(
preset.install_instructions_url,
"https://github.com/svkozak/pi-acp"
);

let entry = preset_catalog_entry(preset, |command| {
(command == "pi").then(|| PathBuf::from("/usr/local/bin/pi"))
});
assert_eq!(entry.availability, AcpAvailabilityStatus::AdapterMissing);
assert!(entry.command.is_none());
assert_eq!(
entry.underlying_cli_path.as_deref(),
Some("/usr/local/bin/pi")
);
assert!(entry.install_hint.contains("standard Pi CLI"));
}

#[test]
fn adapter_missing_when_underlying_cli_present() {
let entry = preset_catalog_entry(&ADAPTER_PRESET, |command| {
Expand Down
1 change: 1 addition & 0 deletions desktop/src/features/onboarding/ui/RuntimeIcon.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ const RUNTIME_LOGOS: Record<string, string> = {
// Keys match the preset `id` values emitted by the backend PRESET_HARNESSES.
export const PRESET_LOGOS: Record<string, string> = {
devin: "/harness-logos/devin.svg",
pi: "/harness-logos/pi.svg",
omp: "/harness-logos/omp.svg",
grok: "/harness-logos/grok.svg",
opencode: "/harness-logos/opencode.svg",
Expand Down
3 changes: 3 additions & 0 deletions desktop/src/features/settings/ui/harnessCatalogCopy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ const HARNESS_DESCRIPTIONS: Record<string, string> = {
// Bundled presets — sources per RESEARCH/BYOH_CATALOG_IA.md.
// Source: https://cursor.com/docs/cli/acp
cursor: "Cursor's coding agent, connected to Buzz through its ACP server.",
// Sources: https://github.com/earendil-works/pi,
// https://github.com/svkozak/pi-acp
pi: "A minimal terminal coding harness, connected through the pi-acp adapter.",
// Source: https://github.com/can1357/oh-my-pi
omp: "A terminal coding agent with integrated development tools.",
// Source: https://build.x.ai (docs unavailable during research; kept
Expand Down
29 changes: 27 additions & 2 deletions desktop/tests/e2e/harness-catalog-screenshots.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,24 @@ const CATALOG = [
auth_status: { status: "not_applicable" },
source: "preset",
},
{
id: "pi",
label: "Pi",
avatar_url: "",
availability: "adapter_missing",
command: null,
binary_path: null,
default_args: [],
mcp_command: null,
install_hint:
"Buzz talks to the standard Pi CLI through the pi-acp adapter. Follow the setup guide to install both pi and pi-acp so both commands are on your PATH.",
install_instructions_url: "https://github.com/svkozak/pi-acp",
can_auto_install: false,
underlying_cli_path: "/usr/local/bin/pi",
node_required: false,
auth_status: { status: "not_applicable" },
source: "preset",
},
{
id: "omp",
label: "Oh My Pi",
Expand Down Expand Up @@ -160,7 +178,14 @@ test("after: consolidated harnesses panel + catalog dialog", async ({
path: `${SHOTS}/after-catalog-needs-setup.png`,
});

// 3. Ready entry detail (Ready state, no install action). Ready entries
// 3. Standard Pi uses its own preset and reports the missing ACP adapter.
await page.getByTestId("harness-catalog-list-item-pi").click();
await page.waitForTimeout(300);
await page.getByTestId("harness-catalog-dialog").screenshot({
path: `${SHOTS}/after-catalog-pi.png`,
});

// 4. Ready entry detail (Ready state, no install action). Ready entries
// sit in the "Installed" accordion, collapsed by default — expand it.
await page.getByTestId("harness-catalog-section-installed").click();
await page.getByTestId("harness-catalog-list-item-claude").click();
Expand All @@ -169,7 +194,7 @@ test("after: consolidated harnesses panel + catalog dialog", async ({
path: `${SHOTS}/after-catalog-ready-detail.png`,
});

// 4. Custom harness form — all fields inline.
// 5. Custom harness form — all fields inline.
await page.getByTestId("harness-catalog-list-item-custom").click();
await expect(page.getByTestId("custom-harness-form")).toBeVisible();
await page.waitForTimeout(300);
Expand Down