Skip to content

feat: add Buzz ACP compatibility adapter - #1423

Draft
cmpadden wants to merge 7 commits into
mainfrom
feat/eve-buzz-acp-adapter
Draft

feat: add Buzz ACP compatibility adapter#1423
cmpadden wants to merge 7 commits into
mainfrom
feat/eve-buzz-acp-adapter

Conversation

@cmpadden

@cmpadden cmpadden commented Jul 30, 2026

Copy link
Copy Markdown
Collaborator

Description

Adds the experimental eve-buzz-acp-adapter package, a host-local compatibility adapter that lets Buzz run an eve agent through stable ACP while publishing signed, threaded replies with the local Buzz CLI.

The package includes:

  • an interactive installer for local directories and deployed URLs;
  • verified Vercel login and Trusted Sources setup for protected deployments;
  • a Buzz custom-harness definition with no persisted credentials;
  • authored-model projection for Buzz's current custom-harness UI;
  • Buzz context parsing, secret filtering, reply publication, doctor, and uninstall flows;
  • documentation of the compatibility boundary and the upstream changes that would make the adapter unnecessary.

This PR is stacked on #1347, which provides the generic ACP adapter and verified remote ACP authentication. Related to #100.

How did you test your changes?

  • pnpm --filter eve-buzz-acp-adapter test:unit
  • pnpm --filter eve-buzz-acp-adapter typecheck
  • pnpm --filter eve-buzz-acp-adapter build
  • pnpm guard:invariants
  • pnpm docs:check
  • pnpm check:deps
  • packed the npm tarball and verified the CLI executable bit
  • smoke-tested local and deployed harness generation
  • validated the reply-sink flow against the weather agent and a fake Buzz publisher

PR Checklist

  • I linked an issue with prior discussion confirming this change is wanted
  • I ran the relevant checks from CONTRIBUTING.md
  • I added tests and documentation where relevant
  • I added a changeset if this touches a published package
  • DCO sign-off passes for every commit (git commit --signoff)

Relevant upstream Buzz issues

@vercel

vercel Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
eve-docs Error Error Jul 31, 2026 2:40pm
eve-docs-4759 Error Error Jul 31, 2026 2:40pm

Comment thread packages/eve-buzz-acp-adapter/src/proxy.ts

@vercel vercel Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Additional Suggestion:

Unused type-only import declaration in run.ts breaks the strict tsc build with TS6192 (all imports unused)

Fix on Vercel

Comment thread packages/eve-buzz-acp-adapter/src/line-reader.ts Outdated

export function publicationKey(route: BuzzRoute): string {
if (!route.replyTo) throw new Error("Buzz reply routes require an event anchor");
return createHash("sha256").update(`${route.channelId}\0${route.replyTo}`).digest("hex");

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Buzz uses the thread root as replyTo for every turn in a thread. This gives every turn the same publication key. After the first reply all later responses are skipped as already published. Can we track the triggering event ID separately and use it for idempotency? replyTo should only determine where the response is posted.

if (channel === null) return undefined;

const replyTo = context.match(new RegExp(`--reply-to\\s+(${EVENT_ID})`, "i"))?.[1];
if (!replyTo) return undefined;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Buzz omits --reply-to for a new top-level DM. This parser rejects the route even though the DM channel is valid. The eve turn completes but its response cannot be posted. Can we accept a channel-only route and publish a top-level DM when replyTo is absent?

await new Promise<void>((resolve, reject) => {
const child = spawn(options.buzzCli, publicationArguments(options.route), {
env: options.environment,
stdio: ["pipe", "ignore", "pipe"],

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

buzz messages send reports delivery as JSON with event_id and accepted. This discards that response and only checks the exit status. The CLI can exit successfully with accepted: false so the adapter may mark a rejected message as published. Can we capture stdout and commit only when accepted is true?

});
await reservation.commit();
} catch (error) {
if (turn.publication.signal.aborted) await reservation.commit();

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cancellation does not tell us whether Buzz received the message. This marks every cancelled send as published even when the message may not have been delivered. It also allows a retry after every other error even when the message may have been delivered. That can either lose the reply or post it twice. Can the publisher return delivered not delivered or unknown and use that result to update the reservation?

try {
return { info: await dependencies.readEveTargetInfo(targetOptions) };
} catch (error) {
if (!(error instanceof VercelDeploymentProtectionError) || options.target.kind !== "remote") {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The runtime uses the eve verified remote client but this installer probe does not. It fetches /eve/v1/info directly and only starts authentication after a Vercel Protection redirect. A normal eve 401 stops installation before login. Can this probe use the same verified remote client as eve acp?

turns.set(keyForId(message.id), {
cancelled: false,
publication: new AbortController(),
route: parseBuzzRoute(text),

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Buzz uses one ACP session per channel and can allow multiple people to trigger it. This route does not retain the verified sender identity. Every person who can trigger the agent therefore uses the same eve authentication and connections.

cmpadden added 7 commits July 31, 2026 10:39
Signed-off-by: Colton Padden <colton.padden@vercel.com>
Signed-off-by: Colton Padden <colton.padden@vercel.com>
Signed-off-by: Colton Padden <colton.padden@vercel.com>
Signed-off-by: Colton Padden <colton.padden@vercel.com>
Signed-off-by: Colton Padden <colton.padden@vercel.com>
Signed-off-by: Colton Padden <colton.padden@vercel.com>
Signed-off-by: Colton Padden <colton.padden@vercel.com>
@cmpadden
cmpadden force-pushed the feat/eve-buzz-acp-adapter branch from e8d0d59 to 466379a Compare July 31, 2026 14:39
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.

2 participants