ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

qwen-code Session Workflow Approval:在 Plan Mode 退出审批面板中展示 Todo 依赖工作流

qwen-code Session Workflow Approval:在 Plan Mode 退出审批面板中展示 Todo 依赖工作流 qwen-code Session Workflow Approval在 Plan Mode 退出审批面板中展示 Todo 依赖工作流【免费下载链接】qwen-codeAn open-source AI coding agent that lives in your terminal.项目地址: https://gitcode.com/GitHub_Trending/qw/qwen-code导读本文围绕 qwen-code 仓库中docs/plans/2026-07-23-session-workflow-approval.md描述的「Session Workflow Approval」实现展开当模型在 Plan Mode 中调用exit_plan_mode请求退出计划模式、正式开工执行前Web Shell 会在权限审批面板中内嵌一份当前活跃的 Todo 依赖关系图让用户在真正开始执行前先审阅任务依赖、状态与关联的 Subagent 执行。读完本文你将掌握该功能的完整设计思路、前后端实现落点ToolApproval/PlanExecutionView/todos.ts/exitPlanMode.ts、关键数据结构与测试验证矩阵能够直接对照仓库源码深入该模块。一、功能范围把 Todo 工作流搬进退出 Plan Mode 的审批面板原始设计文档用一句话界定了功能范围Scope在现有的exit_plan_mode权限面板内展示当前的 Todo 工作流使用户能在执行真正开始之前审阅依赖关系图。这句话包含三层含义不新增入口复用 Web Shell 已有的权限审批面板ToolApproval组件不另起新的弹窗或页面时机前置审批发生在「执行开始之前」这是用户最后一次以较低成本审视全盘计划的机会对象是依赖图面板中呈现的不是简单文本计划而是由todo_write产生的 Todo 任务及其blockedBy依赖关系构成的有向图。在仓库中的落地位置是 ToolApproval.tsx 与 PlanExecutionView.tsx前者是审批卡片本体后者是工作流图渲染组件。二、实现要点一为 ToolApproval 增加可选的 Todo 快照设计文档的第 1 个实现点给ToolApproval增加一个可选的 Todo 快照并且只对 Plan Mode 退出审批渲染PlanExecutionView。源码中ToolApproval新增了两个可选属性ToolApproval.tsxplanTodos?: readonly TodoItem[]—— 当前活跃计划的 Todo 快照planExecutionMode?: string—— 进入 Plan Mode 前的审批模式default/yolo/plan等用于决定批准后回到哪种执行模式。两个关键判定逻辑const isExitPlanApproval isExitPlanApprovalRequest(request); const showsPlanWorkflow planTodos.length 0 isExitPlanApproval;其中isExitPlanApprovalRequest定义在 todos.ts规则相当严格——必须是switch_mode工具类型且 wire 名称为exit_plan_mode二者缺一不可export function isExitPlanApprovalRequest( request: PickPermissionRequest, toolKind | toolName | null | undefined, ): boolean { return ( request?.toolKind switch_mode request?.toolName?.toLowerCase() exit_plan_mode ); }只有showsPlanWorkflow为真时才渲染工作流视图且渲染时传入的是空工具列表与空任务列表——审批阶段还没有任何 Agent 执行ToolApproval.tsx{showsPlanWorkflow ( div className{styles.workflow} PlanExecutionView todos{planTodos} tools{[]} tasks{[]} / /div )}这正对应设计文档「不把执行输出塞进 Todo 快照或任务轮询」的第 5 条约束审批阶段只是静态审阅图的节点状态完全由 Todo 自身的status与blockedBy推导。审批模式与选项重排当检测到hasPlanExecutionMode即「退出 Plan 审批」且服务器下发了执行模式时面板的选项会被过滤重排ToolApproval.tsx只保留restore_previous、reject_once、reject_always三类选项并给出面向工作流语义的本地化文案——restore_previous显示为「执行计划」Execute Plan / 按进入 Plan 前的模式恢复例如从 YOLO 进入 Plan 则批准后回到 YOLO普通的allow_once显示为「确认并开始」reject显示为「继续完善计划」。测试 ToolApproval.test.tsx 验证了「使用最新执行权限但不会自动批准计划」选项标签会随planExecutionMode从yolo切换到default而变化且确认动作只会显式触发。三、实现要点二主会话与 Split 面板都传递各自的活跃 Todo 快照设计文档第 2 个实现点从主会话视图和 split 会话面板两边都传入活跃的 Todo 快照。在 ChatPane.tsx 中planTodos的获取遵循两个前提sessionWorkflowEnabled开启且当前审批是 Plan Mode 退出审批随后用getActiveTodosForPlanRevision从转录transcript中按「计划修订」精确取出快照const isExitPlanApproval isExitPlanApprovalRequest(pendingToolApproval); const planTodos useMemo( () sessionWorkflowEnabled isExitPlanApproval ? getActiveTodosForPlanRevision(messages, pendingToolApproval?.todoPlan) : [], [isExitPlanApproval, messages, pendingToolApproval, sessionWorkflowEnabled], );getActiveTodosForPlanRevisiontodos.ts的核心是「修订绑定」它要求找到callId revision.sourceCallId且planId一致的todo_write工具调用从中解析出 Todo 数组。这避免了从转录里抓到「上一个计划」的陈旧快照——只有与当前待审批计划修订对应的 Todo 才会进入面板。由于 ChatPane 既是主会话视图的载体、也是 split 分屏中每个 pane 的载体同一组件在两种布局下复用「主视图和分屏都传入各自快照」这一要求通过组件自身的属性传递天然满足对应 wiring 测试见 ChatPane.test.tsx断言planTodos被透传到审批组件与 App.test.tsx无工作流能力时传入空数组。Todo 快照的解析规则getActiveTodosForPlanRevision依赖的extractTodosFromToolCalltodos.ts定义了快照来源的兼容矩阵工具名兼容todo_write与todowritewire 名称与 ACP plan bridge 的历史命名见isTodoWriteToolName解析顺序args.todos→args.entries→rawOutput.todos→rawOutput.entries每条 Todo 的id优先取_meta.qwenTodo.id现代 Qwen 计划元数据否则退回item.id再退回位置型plan-${index}blockedBy从_meta.qwenTodo.blockedBy读取——这正是依赖图的边数据来源。四、实现要点三ACP 计划正文作为纯文本兜底设计文档第 3 个实现点在没有 Todo 快照时保留 ACP 计划正文作为纯文本兜底非 Plan Mode 审批保持不变。对应源码行为当planTodos为空没有 Todo 快照或审批不属于exit_plan_mode时showsPlanWorkflow为假面板退化为传统形态标题、描述、计划正文pre内容块与选项按钮内容文本来自extractContentText(request)ToolApproval.tsx按content块中的text拼接特别地isExitPlanApproval时内容块会附加planContent样式类但语义不变——仍是纯文本展示。组件测试Plan Mode approval without Todos preserves its text contentToolApproval.test.tsx验证了这一点不传planTodos时[data-plan-workflow]不存在而计划文本Implement the approved workflow.依然可见。另外还有一个保护性约束isExitPlanApprovalRequest要求toolKind switch_mode测试does not show a stale workflow for another switch-mode toolToolApproval.test.tsx确认了其他switch_mode工具不会误渲染工作流。五、实现要点四节点可选图下展示完整详情设计文档第 4 个实现点让工作流节点可选并在图下方展示选中 Todo 的完整内容、状态、依赖以及关联的 Agent 执行。依赖图的分层算法PlanExecutionView的核心是layerPlanTodosPlanExecutionView.tsx基于blockedBy做拓扑分层Kahn 算法风格把互相依赖的 Todo 排进从左到右的层中形成一个真正的 DAG。几个值得注意的细节自依赖过滤dependencyId ! todo.id未知依赖不阻塞blockedBy中引用不存在的 Todo id 会被忽略对应测试does not block a todo on an unknown dependency环兜底残留入度的节点被推入maxDepth 1层避免死循环非递归测试用例特意构造了 3000 层深链验证不会栈溢出。分层的具体数据流layerPlanTodos产出layers同时构建layerByTodo、dependentsByTodo配合实测的 DOM 节点几何信息getBoundingClientRectResizeObserver动态生成 SVG path 边。跨层span1的依赖边会分配独立的「返回车道」lane按跨度排序嵌套避免长边相互压叠PlanExecutionView.tsx。边渲染有上限保护MAX_RENDERED_PLAN_EDGES 500超出后放弃画边只保留节点分层。节点状态机与无障碍设计节点状态由getPlanNodeStateFromIndexPlanExecutionView.tsx按优先级推导关联工具执行中running/in_progress→running执行暂停paused→pausedTodo 自身completed→completed存在未完成的blockedBy依赖 →blockedTodo 自身in_progress→in_progress其余 →ready。每个状态既用颜色表达也带字形PLAN_STATUS_GLYPH⋯、○、◐、‖、✓保证色盲、高对比度模式与灰度截图下状态依然可读。选中节点后图下方的 Step Details 区域展示测试 PlanExecutionView.test.tsx 逐一断言完整内容与状态Depends on:依赖与Unblocks:被谁依赖归组到该 Todo 的 Subagent 执行列表通过工具参数的todo_id归组见todoIdOf执行指标运行时长、工具调用次数、Token 消耗来自 daemon 任务statsOpen subagent details →入口。节点采用data-plan-interactive标记ToolApproval 的快捷键处理器对工作流内部元素提前 returnToolApproval.tsx避免在节点聚焦时误触发审批快捷键数字键、Escape 等对应测试does not apply approval shortcuts to a focused workflow node。六、实现要点五复用现有 Subagent 详情面板不扩展快照与轮询设计文档第 5 个实现点复用现有的 subagent 详情面板展示实时进度与最终输出不要把执行输出加进 Todo 快照也不要新增任务轮询。源码中这一约束体现在多处PlanExecutionView的onOpenSubagent回调接收一个ACPToolCall点击执行条目时通过openSubagentDetails转发给宿主PlanExecutionView.tsx由 App/ChatPane 层打开既有 Subagent 详情面板详情按钮受getSubagentDetailsUnavailableReason门控当 subagent 会话尚未就绪subagentSessionReady false时按钮置灰并显示「创建中」不会伪造一个不可用的详情入口测试gates parent and nested detail buttons with live child task审批阶段传入tools{[]} tasks{[]}意味着工作流图只消费 Todo 快照不额外拉取任务轮询getAttentionAgentToolPlanExecutionView.tsx只用于在运行中/回放时定位失败或取消的 Agent 工具属于详情面板的导航辅助与审批面板的静态审阅职责分离。嵌套 Agent 的展开同样复用转录数据nestedAgentToolsForTool沿subTools递归收集嵌套 Agent 工具nestedTasksFromIndex则从 daemon 任务索引还原实时嵌套层级两者通过toolUseId去重——「实时任务优先转录兜底」保证回放中断会话时节点徽章与详情一致。七、服务端出口exit_plan_mode 工具的审批契约为了理解 Web Shell 收到的审批请求从何而来需要回到核心层的工具实现 exitPlanMode.ts。该文件定义了exit_plan_mode的完整生命周期Schema必填planMarkdown 计划正文可选originalRequest、researchSummaryplan为空串会被validateToolParams拒绝权限层放行getDefaultPermission()恒返回allow真正的门禁在requiresUserInteraction()仅 Plan 模式下需要用户交互与execute()非 Plan 模式返回引导性错误审批快照getConfirmationDetails构建ToolPlanConfirmationDetails携带plan、prePlanMode、approvalModeRevision并注册onConfirm回调将审批结果映射为三种目标模式——RestorePrevious回到进入 Plan 前的模式、ProceedAlways自动编辑 Auto Edit、ProceedOnce默认 Ask Approval陈旧审批防护执行时校验approvalModeRevision与当前修订一致模式在审批期间被切换则拒绝执行成功出口llmContent固定为User approved./Leader approved.前缀PLAN_EXIT_APPROVED_LLM_CONTENT_PREFIXES工具调度器据此做历史清理。也就是说Web Shell 审批面板中用户看到的「执行计划 / 确认并开始 / 继续完善计划」选项最终会通过 ACP 通道回到这里映射成onConfirm的RestorePrevious / ProceedOnce / Cancel分支。这回答了「适配器测试ACP exit-plan content 到达审批请求」验证的端到端链路。八、验证矩阵从组件测试到构建设计文档的 Verification 部分列举了六类验证仓库中的对应实现如下验证项落点关键断言Plan Mode 审批渲染 Todo 依赖工作流ToolApproval.test.tsx[data-plan-workflow]存在节点文本与计划正文同时可见无 Todo 时保留纯文本内容同上#L436-L440无工作流节点计划文本保留ACP exit-plan content 到达审批请求适配器层switch_mode帧 exit_plan_mode名称判定见 todos.tsisExitPlanApprovalRequest严格双条件主/split 会话各自接收活跃 Todo 快照ChatPane.test.tsx、App.test.tsxplanTodos透传 / 能力关闭时为空选择节点展示详情并回调 Subagent 面板PlanExecutionView.test.tsxStep details 内容、onOpenSubagent回调、依赖与指标聚焦测试、类型检查与构建仓库 CI 脚本scripts/lint.js、Vitest 配置 vitest.config.ts—此外 PlanExecutionView.test.tsx 还覆盖了大量边界行为值得延伸阅读拓扑分层与 3000 层深链、live 状态优先于 Todo 状态、fork/join 分支边渲染branchedTodos的四条边断言、完成度百分比向下取整2/3 显示 66% 而非 67%避免长计划提前报 100%、当前步骤自动定位locate横纵双向居中、CSS 缩放坐标归一化、跨层边绕行等。九、使用与验证方式该功能随 Web Shell 会话默认能力开关sessionWorkflowEnabled生效用户侧不需要额外配置即可体验在 Plan Mode 下模型调用exit_plan_mode后审批面板会先展示 Todo 依赖图供审阅确认后才切换执行模式开始编码。开发侧验证步骤如下运行聚焦组件测试pnpm vitest run packages/web-shell/client/components/messages/PlanExecutionView.test.tsx packages/web-shell/client/components/messages/ToolApproval.test.tsx运行 wiring 测试packages/web-shell/client/components/ChatPane.test.tsx与packages/web-shell/client/App.test.tsx中与planTodos/planExecutionMode相关的用例类型检查与构建执行仓库 package.json 中定义的 typecheck / build 脚本或scripts/lint.js触发的全量校验。总结Session Workflow Approval 的设计精髓在于「审阅前置、渲染复用、数据不动」把已经存在于转录中的 Todo 快照todo_write产物以依赖图形式注入审批面板让用户在成本最低的时刻看清任务拓扑图的渲染完全复用既有的PlanExecutionView拓扑分层、状态机、节点选择、Subagent 详情入口审批选项映射到exit_plan_mode的既有审批契约既不扩展快照数据模型也不新增轮询通道。从设计文档到组件测试、从 Web Shell 面板到核心层工具这条链路在仓库中闭环可查是理解 qwen-code Plan Mode 工作流与权限体系的一个理想切入点。【免费下载链接】qwen-codeAn open-source AI coding agent that lives in your terminal.项目地址: https://gitcode.com/GitHub_Trending/qw/qwen-code创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表