feat(acp): add Letta as a tier-2 preset harness - #3454
Draft
sarahwooders wants to merge 2 commits into
Draft
Conversation
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
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.rsextraction this PR needed (see below); happy to rebase onto whichever lands first.Changes
PRESET_HARNESSESentry —letta/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 toBUILTIN_IDS", is stale relative to that — happy to fix it here if you'd like.)default_agent_args—letta-acpis a zero-arg runtime, likeclaude-agent-acpandcodex-acp. Without this, the legacy Goose-shapedacpdefault reaches it as a positional.discovery/presets.rs— second commit, pure code motion.discovery.rsis 1860 lines, over the 1000-line desktop file-size limit, so the ratchet inpnpm checkforbids 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; thepresetLogosguard now parses the new path.RUNTIME_MARKSentry 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, commit2daaf0c); provenance recorded inCREDITS.md, and it already ships ascurrentColorpaths.buzz-acpREADME — 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 thebuzzCLI, so the CLI has to be wherever that is:localandcloud-oauthinherit the harness environment;remoteneeds the CLI on the app server; plaincloudruns tools in Letta's sandbox and is not usable from Buzz.Testing
cargo test -p buzz-acp --lib— 628 passed.cargo test --lib managed_agentsindesktop/src-tauri— 896 passed.pnpm check(lint + format + file-size ratchet),pnpm test(3770 passed, including thepresetLogosguard for the new id), andpnpm typecheckindesktop— all clean.cargo fmt --all -- --checkand the Tauri equivalent;cargo clippy --all-targets -- -D warningsforbuzz-acpandbuzz-desktop.buzz-acp models --agent-command letta-acpagainst a locally builtbuzz-acpreportsAgent: letta-acp v0.1.4and completesinitialize+session/new, on Letta'slocal,remote, andcloud-oauthbackends.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-suppliedsystemPrompt, and reportagentInfo(which is what turnsAgent: unknown vunknowninto a real name in the probe above). This PR does not depend on it — the CLI path works with the published 0.1.4.