[Bug]: Approving Devin's plan depends on the order of its plan-exit options, and one of them turns on bypass mode

未关闭
#34,257 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

还没有人认领这个 Issue。

评估

难度
3/5
预计耗时
1-2 天
新手友好度
62/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
活跃
技术栈
typescript

调研方向

Start by reading selectPermissionOptionId and selectAutoApprovedPermissionOption in packages/provider-acp/src/server/adapter.ts around lines 1302–1323, then trace how plan-exit permission options are selected for approval and automatic approval. Check how Devin's optionId values are handled. Done means approving a plan cannot select plan_bypass unless the user explicitly chooses it, regardless of option order.

由索引模型根据 Issue 内容生成。

描述

Before submitting
  • I searched existing issues and did not find a duplicate.
  • I included enough detail to reproduce or investigate the problem.
Area

apps/server

Steps to reproduce
  1. Run devin acp and create a session.
  2. Call session/set_mode with plan.
  3. Prompt: "Make a one-step plan to add a file named a.txt and then ask me to approve it using your plan exit tool."
  4. Devin first sends a tool_call titled "Exit plan mode" with kind: "switch_mode", then a session/request_permission for the same toolCallId with these options:
optionId kind name
plan_accept_edits allow_once Yes, implement plan and accept edits
plan_bypass allow_once Yes, implement plan and bypass permissions
reject_once reject_once No, plan needs changes
  1. Compare with selectPermissionOptionId and selectAutoApprovedPermissionOption in packages/provider-acp/src/server/adapter.ts (https://github.com/pingdotgg/t3code/blob/79bca436b24a6eabb05d3d1a95348ae40d31e713/packages/provider-acp/src/server/adapter.ts#L1302-L1323).

I got the same list, in the same order, in seven sessions, including ones that entered plan mode from each of Devin's other modes (accept-edits, smart, ask, bypass). Devin also has a plan_normal option ("Yes, implement plan"), which I did not see offered. The problem doesn't depend on a particular Devin release. It applies whenever Devin offers more than one allow_once option on plan exit.

Expected behavior

Approving a plan should never put Devin into bypass mode unless the user chose that. If T3 offers only one "approve" button, it should choose plan_accept_edits (or plan_normal) by id, whatever the order.

Actual behavior

Devin gives both "yes" options the kind allow_once. T3 shows its default approval card, and both Approve and "Always allow this session" answer with the first allow_once option. Under full access, the automatic approval does the same. Today that is plan_accept_edits, which returns Devin to its default mode, so nothing goes wrong.

If Devin listed plan_bypass first, the same button would switch Devin to bypass mode, which approves every later tool call without asking. The card does not show which of the two T3 is choosing, and the user cannot pick the other.

ACP v1 says "kind is only a UI hint. The option name describes the scope" and says nothing about option order.

This is separate from #33136 and #33144, which change the "this session" choice only. #33144 leaves Approve answering with the first allow_once. It is also separate from #25553, which decides whether T3 asks before a mode switch, not which option it sends.

Possible fix

A Devin-specific choice for "accept" on plan-exit requests: prefer plan_normal, then plan_accept_edits, and never plan_bypass unless the user picked it. The automatic approval would use the same rule. A Devin approvalOptions could also show the choices with Devin's names, so the user can see and pick bypass deliberately. Matching on optionId avoids parsing the free-text name.

Impact

Minor bug or occasional failure. This is a latent risk. I have not seen T3 choose plan_bypass.

Version or commit

Current main. The code link above is pinned to a commit only so the line numbers stay correct. Not specific to a Devin version.

Environment

macOS, Apple silicon, Devin over ACP.

主要语言
TypeScript
星标
24.8k
派生
6.4k
平均合并
10 小时 56 分钟
30 天内合并 PR
226

环境准备

在 Codespaces 中打开

在浏览器里用你自己的 GitHub 账号启动这个项目的开发容器。

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

pingdotgg/t3code 的其他 Issue

查看 pingdotgg/t3code 的全部 Issue

相似的 Issue

更多 TypeScript Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。