From 46b86527f972c8dce059006c44dfd363ac0f3015 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Wed, 23 Sep 2026 15:36:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B3=A8=E9=87=8A=EF=BC=9A=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=20Direct=20=E5=91=BD=E4=BB=A4=E6=8E=A5=E5=8D=95=E5=8C=96?= =?UTF-8?q?=E7=9A=84=20TODO=20=E4=B8=8E=E5=AE=9E=E7=8E=B0=E8=A6=81?= =?UTF-8?q?=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `direct_runtime/user_input.rs` 命令入口加 TODO:目标形状(接单 + spawn、`turn.started` 与终态守卫下沉、接单后早退必须补终态、环境类失败升为回合级、宿主侧承担留痕与上报)与两条已决策的作废项 - `useDirectProjectChatController.ts` 的 catch 加同一份 TODO,说明它现在兼职"接单被拒"与"回合失败"、将来只剩前者 - 两处都指向草案 `docs/adr/【ADR】DirectProject命令接单化-2026-09-23.md`,本次不实施、不提交该草案 --- .../src/agent/direct_runtime/user_input.rs | 14 ++++++++++++++ .../controller/useDirectProjectChatController.ts | 4 ++++ 2 files changed, 18 insertions(+) diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/direct_runtime/user_input.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/direct_runtime/user_input.rs index 9689eff11..d2c3ec105 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/direct_runtime/user_input.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/direct_runtime/user_input.rs @@ -32,6 +32,20 @@ pub(crate) fn normalize_direct_client_turn_id( /// /// 字符串只在这里、由 [`DirectTurnError`] 的 `Display` 生成一次;前端拿到的仍是"一句给用户看的话", /// 而 Rust 侧从命令入口到宿主出口全程只传 typed 错误。 +/// +// TODO(Direct 命令接单化,未实施):现在这个命令 await 整轮,于是"命令边界"承担了不属于它的角色—— +// 回合失败的文案要靠这条 Err 回到界面,认证失败重试也只能挂在它上面。目标形状(草案见 +// `docs/adr/【ADR】DirectProject命令接单化-2026-09-23.md`,落地前不要照抄这里的一半): +// 1. 命令只负责**接单**:校验 + 权限门 + 用户条目落盘 + 占用调用身份,然后 spawn 整轮任务并立刻 +// 返回;"这一轮跑成什么"只由订阅事件回答。 +// 2. `turn.started` 与终态兜底守卫的所有权下沉到接单任务:接单之后**任何**早退(连不上 +// app-server、配置 / 凭据未就绪、历史注入构建失败、`turn/start` 被拒)都必须有终态事件收口, +// 否则前端的乐观气泡会永远停在"宿主还没确认"。 +// 3. 于是连接 / 环境类失败要从调用级升成回合级:`EnvironmentNotReady` 只留"接单前就能判定"的 +// 语义(目录 / 权限 / 输入 / 并发)。 +// 4. 诊断留痕与错误上报必须在宿主侧完成:接单之后命令不再返回 Err,前端 catch 看不到这些失败。 +// 5. 顺带作废两条现役行为(已决策):删掉由 invoke 拒绝驱动的认证重试;失败横幅改由 reducer +// 供数据;"接单被拒"的文案不再占用状态行,改成这条消息下面的本地助手气泡。 #[tauri::command] pub(crate) async fn chat_with_game_creator_direct_codex( project_path: String, diff --git a/apps/ai-game-creator-shell/src/view/project-development/chat/controller/useDirectProjectChatController.ts b/apps/ai-game-creator-shell/src/view/project-development/chat/controller/useDirectProjectChatController.ts index 4e8f3bd32..2eb9ae155 100644 --- a/apps/ai-game-creator-shell/src/view/project-development/chat/controller/useDirectProjectChatController.ts +++ b/apps/ai-game-creator-shell/src/view/project-development/chat/controller/useDirectProjectChatController.ts @@ -582,6 +582,10 @@ export function useDirectProjectChatController({ runAnalytics.settle(); } // 清单刷新统一交给 startTurn 的 finally:成功与报错路径都覆盖,且只读一次。 + // TODO(Direct 命令接单化,未实施):下面这个 catch 现在兼职"接单被拒"与"回合失败"两种回执。 + // 计划(`docs/adr/【ADR】DirectProject命令接单化-2026-09-23.md`,草案)是让命令只负责接单、 + // 整轮结果只由订阅事件的载荷回答:届时这里只剩接单被拒,文案改成这条消息下面的本地助手 + // 气泡,状态行改由 reducer 供数据,而 invoke 拒绝驱动的认证重试作废。 } catch (error) { if ( isDirectCodexTurnAlreadyRunningError(error) ||