Skip to content

Add Devin CLI as an ACP provider - #226

Draft
egoist wants to merge 4 commits into
mainfrom
cursor/devin-acp-provider-7db9
Draft

Add Devin CLI as an ACP provider#226
egoist wants to merge 4 commits into
mainfrom
cursor/devin-acp-provider-7db9

Conversation

@egoist

@egoist egoist commented Sep 12, 2026

Copy link
Copy Markdown
Owner

Problem and solution

Waku had no Devin CLI path. Devin already speaks Agent Client Protocol over stdio (devin acp), so it joins Cursor, Fx, Grok, and Kimi on the shared ACP driver instead of getting a one-off transport.

Launch is devin acp with no --model. The picker catalog comes from the ACP session's advertised model configOptions — the list session/set_config_option will actually accept. devin models list is the interactive CLI catalog and includes ids such as adaptive that this agent rejects (Model not found: adaptive. Available models: swe-1-6-slow). Discovery opens a short-lived ACP session, reads that option, and deletes the session. If ACP discovery is empty, Waku falls back to parsing devin models list --format json (families[].variants[].model_uid). There is no invented Adaptive fallback.

Model selection uses session/set_config_option on the advertised model option. adaptive / auto map to the advertised current value when they are not themselves advertised. Devin never implemented session/set_model; a missing-method reply is treated as unsupported rather than a user-facing failure. Resume is { provider: "devin", sessionId }. Session catalog and history go through ACP session/list / session/load the same way Cursor and Fx do. Slash commands arrive from the live AvailableCommands update after session open. Skills are scanned from .devin/skills and the XDG/AppData devin/skills directory.

Fork and rewind stay off. Devin does not expose a turn-aware truncation or fork, so supports_conversation_fork and supports_conversation_rollback are false and the UI hides those controls. Steering is advertised because the transport allows a second session/prompt; that superseded-prompt policy has not been probed on a live Devin turn.

Commit-message generation is devin --respect-workspace-trust false --print -- plus an optional --model. --print cannot show the workspace-trust prompt, so the trust check is skipped. --sandbox is not passed.

Reasoning effort is not sent as config id mode for Devin: that id is Devin's permission mode.

A new Devin session kept the truncated-prompt fallback for the whole run. Devin does generate a title, but it writes it to sessions.db after session/prompt returns and does not push session_info_update on the live turn. The driver now polls that store (same NativeTitleRefresh path as Grok) from the first prompt and again at turn end. The first prompt Devin stores immediately is treated as a miss, so it cannot latch and hide the generated name. _cognition.ai/session/rename is forwarded when it carries a distinct title.

Checks

  • cargo fmt --package waku --package waku-protocol --package waku-client --package waku-core --package waku-daemon -- --check
  • cargo test -p waku-core --lib -- driver::acp::: 28 pass, 3 ignored (live Cursor/Grok/Kimi)
  • cargo test -p waku-core --lib -- devin_session: 3 pass

Limitations and follow-up

  • Access modes follow the other non-Fx ACP agents: Supervised answers session/request_permission; Auto-accept / Auto / Full access auto-answer. Devin’s native /normal /accept-edits /bypass modes are not mapped through session/set_mode until they are seen on the wire.
  • No Computer Use or plan-usage fetch. The title poll does not spawn a second devin process against a locked session; it reads the CLI sqlite store.
  • Devin's own title generator can fail upstream (agent_ext::title / failed_precondition). That is silent, and the prompt fallback stays until a distinct title is written.

Related issue

None.

AI disclosure

Cursor Grok 4.6 (cloud agent) implemented the wiring from Devin’s public CLI/ACP docs and the existing Cursor/Fx/Kimi ACP path, then fixed model selection after live toasts of Method not found and Model not found: adaptive. Catalog discovery was checked against a live devin acp session on this machine. Title polling was added after a live first turn left the sidebar on the prompt fallback: Devin logs show title generation after session/prompt, and sessions.db is where that name is stored.

Checklist

  • I understand the entire change and take responsibility for the code and all actions taken.
  • I wrote this description myself, without LLM-generated text, and will write PR comments myself.
  • I disclosed all AI usage, including the tools and extent of involvement.
Open in Web Open in Cursor 

Drive `devin acp` through the shared ACP driver, with Adaptive as the
fallback model, session list/load over ACP, and no turn-aware fork.
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Sep 12, 2026

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Updated (UTC)
❌ Deployment failed
View logs
waku-web aa26198 Sep 12 2026, 01:00 PM

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Sep 12, 2026

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
waku aa26198 Commit Preview URL

Branch Preview URL
Sep 12 2026, 01:00 PM

Devin never implemented session/set_model, so applying the picker choice
toasted "Method not found" while the turn still ran. Use the advertised
model config option instead, and treat a missing ACP method as unsupported
rather than a user-facing failure.
devin models list is the interactive CLI catalog and includes Adaptive.
ACP only advertises the models the session will accept, so sending
Adaptive toasted "Model not found". Discover from session/new
configOptions and map Adaptive to the advertised current value.
Devin writes a generated title to sessions.db after the turn and
does not push session_info_update on a live first prompt. Poll that
store and ignore the first-prompt placeholder so the sidebar can
replace Waku's fallback.
@aleclarson

Copy link
Copy Markdown

This is working well for me

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