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) ||