Skip to content

feat(acp): add Letta as a tier-2 preset harness - #3454

Draft
sarahwooders wants to merge 2 commits into
block:mainfrom
sarahwooders:letta-acp-preset
Draft

feat(acp): add Letta as a tier-2 preset harness#3454
sarahwooders wants to merge 2 commits into
block:mainfrom
sarahwooders:letta-acp-preset

Conversation

@sarahwooders

@sarahwooders sarahwooders commented Jul 29, 2026

Copy link
Copy Markdown

Adds Letta to the runtime catalog. Letta agents are stateful — memory persists across sessions and channels — so a Buzz agent backed by Letta accumulates context in the room it lives in rather than starting cold each turn. It speaks ACP through the letta-acp adapter (npm install -g @letta-ai/letta-acp).

Duplicates: none found for Letta. The closest open PRs are the other preset additions — #3450 (Cybara), #3287 (Kiro), #3225 (Devin) — and #3225 in particular proposes the same discovery/presets.rs extraction this PR needed (see below); happy to rebase onto whichever lands first.

Changes

  • PRESET_HARNESSES entryletta / letta-acp, no args. preset_harness_ids() derives the reserved-id set from this slice, so nothing else needs updating to keep custom harnesses from shadowing it. (The BYOH contributor guide's step 3, "add the preset id to BUILTIN_IDS", is stale relative to that — happy to fix it here if you'd like.)
  • default_agent_argsletta-acp is a zero-arg runtime, like claude-agent-acp and codex-acp. Without this, the legacy Goose-shaped acp default reaches it as a positional.
  • Preset data moved to discovery/presets.rs — second commit, pure code motion. discovery.rs is 1860 lines, over the 1000-line desktop file-size limit, so the ratchet in pnpm check forbids any growth and a new preset entry cannot land without this. Moving the tier-2 block drops it to ~1716 and gives presets a small file to grow in; the presetLogos guard now parses the new path.
  • Logo — inline RUNTIME_MARKS entry rather than a bitmap, so it adapts to dark/light. The mark comes from Letta's own Apache-2.0 letta-evals repo (leaderboard_site/src/letta-logo.svg, commit 2daaf0c); provenance recorded in CREDITS.md, and it already ships as currentColor paths.
  • Catalog copy — one neutral sentence, matching the existing content policy.
  • buzz-acp README — a "Running with Letta" section plus a backend table. Letta can run agents locally, on a self-hosted app server, or in Letta Cloud, and the choice decides where tools execute. The agent answers Buzz by shelling out to the buzz CLI, so the CLI has to be wherever that is: local and cloud-oauth inherit the harness environment; remote needs the CLI on the app server; plain cloud runs tools in Letta's sandbox and is not usable from Buzz.

Testing

  • cargo test -p buzz-acp --lib — 628 passed.
  • cargo test --lib managed_agents in desktop/src-tauri — 896 passed.
  • pnpm check (lint + format + file-size ratchet), pnpm test (3770 passed, including the presetLogos guard for the new id), and pnpm typecheck in desktop — all clean.
  • cargo fmt --all -- --check and the Tauri equivalent; cargo clippy --all-targets -- -D warnings for buzz-acp and buzz-desktop.
  • End to end: buzz-acp models --agent-command letta-acp against a locally built buzz-acp reports Agent: letta-acp v0.1.4 and completes initialize + session/new, on Letta's local, remote, and cloud-oauth backends.

Screenshots of the runtime catalog and the harnesses panel to follow.

Companion PR on the adapter side: letta-ai/letta-acp#28 teaches letta-acp to connect the MCP servers Buzz passes in session/new, honor a client-supplied systemPrompt, and report agentInfo (which is what turns Agent: unknown vunknown into a real name in the probe above). This PR does not depend on it — the CLI path works with the published 0.1.4.

Letta agents are stateful — memory persists across sessions — which maps
well onto a Buzz agent that lives in a channel over time. They speak ACP
through the letta-acp adapter (npm: @letta-ai/letta-acp), verified
against buzz-acp's `models` probe on the local, remote, and cloud-oauth
Letta backends.

- PRESET_HARNESSES entry (`letta`, command `letta-acp`, no args), which
  also reserves the id against custom harnesses.
- default_agent_args: letta-acp is a zero-arg runtime, so the legacy
  Goose-shaped "acp" default must not reach it as a positional.
- Inline theme-adaptive mark from Letta's own Apache-2.0 letta-evals
  repo, with provenance recorded in CREDITS.md, plus catalog copy.
- README: a "Running with Letta" section and a backend table — the agent
  answers Buzz through the `buzz` CLI, so the CLI has to live wherever
  the chosen backend runs tools.

Signed-off-by: Sarah Wooders <sarahwooders@gmail.com>
@sarahwooders
sarahwooders requested a review from a team as a code owner July 29, 2026 02:55
@sarahwooders
sarahwooders marked this pull request as draft July 29, 2026 02:59
discovery.rs is 1860 lines — over the 1000-line desktop file-size limit,
so the ratchet in `pnpm check` forbids any growth, and adding a preset
entry fails it. Move the tier-2 data (PresetHarness, PRESET_HARNESSES,
and the two helpers projecting it) into a sibling module, which drops
discovery.rs to ~1716 lines and gives presets a small file of their own
to grow in.

Pure code motion: visibility widens to pub(super) for the fields
discovery.rs reads, and the presetLogos guard now parses presets.rs.

Signed-off-by: Sarah Wooders <sarahwooders@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant