diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent.rs b/apps/ai-game-creator-shell/src-tauri/src/agent.rs index 63d8b9378..28c4dafa2 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent.rs @@ -3,8 +3,10 @@ use sha2::{Digest, Sha256}; mod art_manifest; mod claude_code_cli; -mod codex_app_server; -mod codex_cli; +mod codex_provider; +// 既有调用点仍按旧名引用这两棵子树(`crate::agent::codex_cli::…` 等);保留同义别名, +// 使收敛只改变挂载点,不改变对外路径。 +pub(crate) use codex_provider::{app_server as codex_app_server, cli as codex_cli}; mod codex_provider_proxy; mod design_runtime; pub(crate) mod design_tools; diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/codex_app_server/direct_project_identity.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/codex_app_server/direct_project_identity.rs index cf90638c4..7c91526a6 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/codex_app_server/direct_project_identity.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/codex_app_server/direct_project_identity.rs @@ -1,6 +1,6 @@ //! DirectProject 线程池身份的 canonical 解析与摘要。 -use super::super::*; +use crate::agent::*; use sha2::{Digest, Sha256}; pub(crate) fn direct_codex_canonical_project_identity( diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/codex_app_server/mod.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/codex_app_server/mod.rs index 61fea2476..1cefaa027 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/codex_app_server/mod.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/codex_app_server/mod.rs @@ -877,7 +877,7 @@ impl CodexAppServerWorkspaceMode { } } -pub(super) fn resolve_direct_codex_project_authority( +pub(in crate::agent) fn resolve_direct_codex_project_authority( project_root: &std::path::Path, ) -> Result<(std::path::PathBuf, std::path::PathBuf), String> { if !project_root.is_absolute() { diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/codex_provider/mod.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/codex_provider/mod.rs new file mode 100644 index 000000000..ca678f74a --- /dev/null +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/codex_provider/mod.rs @@ -0,0 +1,29 @@ +//! Codex provider 相关逻辑的收敛父模块:凭据、模型目录、OAuth 交接,以及 app-server 与 CLI +//! 两条请求路径。 +//! +//! 这两棵子树里的实现目前**休眠**:AGC 交付口径恒走平台会话 / DirectProject 路径,原生 +//! app-server 与内置 CLI 的请求入口在 Windows 生产构建里没有调用方(只在用例里被引用)。 +//! 上游 master 仍在活跃编辑这些文件,因此本分支**不删除**它们,改为由本模块统一承载,并在此 +//! 显式允许 dead code。 +//! +//! `#![allow(dead_code)]` 只作用于本模块及其子模块;其它 crate、其它目录与 CI 门禁不受影响。 +//! 代价是**本子树内后续新增的 dead code 不会再被任何机器检查发现**。这个例外的理由、失效边界 +//! 与退出条件写在 dev 运维文档「Rust 编译告警门禁」一节,改这里时请一并维护。 +//! +//! 两个子模块用 `#[path]` 就地挂载,不搬动文件:这样与上游活跃编辑区的冲突面只剩本文件与 +//! `agent.rs` 的两行,子树内部的相对路径(`super::…`)由下面的转发与别名保持不变。 +#![allow(dead_code)] + +use super::*; + +/// Codex app-server:连接、进程池、模型目录、OAuth 交接与 Direct 回合编排。 +#[path = "../codex_app_server/mod.rs"] +pub(crate) mod app_server; + +/// 内置 Codex CLI:随包定位与校验、CLI 请求路径。 +#[path = "../codex_cli.rs"] +pub(crate) mod cli; + +// 子树内部既有 `super::codex_cli::…`(相对路径)引用;挂载后 `super` 变成本模块,这里保留同义 +// 别名,免去改动活跃编辑中的文件。 +pub(crate) use cli as codex_cli; diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/generation/llm_request.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/generation/llm_request.rs index 4faf3fca1..7b09f0066 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/generation/llm_request.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/generation/llm_request.rs @@ -1,52 +1,12 @@ -//! LLM 文本请求与其额度 / 进度错误面:`request_game_creator_llm_text`、 -//! `emit_agent_progress` / `AgentProgressEmitter`,以及泥点(mud points)不足的判定、 -//! 消息构造与公开摘要。 +//! LLM 文本请求与其额度 / 错误面:`request_game_creator_llm_text`,以及泥点(mud points)不足的 +//! 判定、消息构造与公开摘要。 //! -//! 多 pass 循环编排已随 Agent Runtime 退役删除,本模块只剩请求与错误面。 +//! 多 pass 循环编排与进度发射面(`AgentProgressEmitter` / `emit_agent_progress`)已随 Agent +//! Runtime 退役删除,本模块只剩请求与错误面。 use super::*; use std::path::Path; -pub(crate) struct AgentProgressEmitter<'a> { - app: &'a tauri::AppHandle, - project_path: String, -} - -impl<'a> AgentProgressEmitter<'a> { - #[cfg(not(test))] - pub(crate) fn new(app: &'a tauri::AppHandle, project_path: &str) -> Self { - Self { - app, - project_path: project_path.to_string(), - } - } - - fn emit(&self, stage: &str, message: &str) { - if let Err(error) = self.app.emit( - "game-creator-agent-progress", - GameCreatorAgentProgressEvent { - project_path: self.project_path.clone(), - stage: stage.to_string(), - message: message.to_string(), - }, - ) { - app_log!( - "agent.generation.progress.emit_failed stage={} detail={error}", - stage - ); - } - } -} - -pub(crate) fn emit_agent_progress( - progress: Option<&AgentProgressEmitter<'_>>, - stage: &str, - message: &str, -) { - if let Some(progress) = progress { - progress.emit(stage, message); - } -} pub(crate) async fn request_game_creator_llm_text( client: &LlmClient, llm: &GameCreatorLlmConfig, diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/thread_manager/turn_completion.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/thread_manager/turn_completion.rs index 864d28acd..9aeb8b024 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/thread_manager/turn_completion.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/thread_manager/turn_completion.rs @@ -56,8 +56,9 @@ impl TurnCompletion { /// 宿主任务提前结束(panic / future 被丢弃 / 取消)的兜底终态。 /// - /// 旧调用方仍可构造没有正文的兼容载荷;生产 Drop 路径使用 + /// 只用于测试构造没有正文的兼容载荷;生产 Drop 路径一律走 /// [`Self::host_dropped_with_detail`],把能观测到的收场事实带给前端。 + #[cfg(test)] pub(crate) fn host_dropped() -> Self { Self::Failed(TurnFailure::HostDropped(HostDropped { detail: None })) } diff --git a/apps/ai-game-creator-shell/src-tauri/src/browser/process.rs b/apps/ai-game-creator-shell/src-tauri/src/browser/process.rs index 81682e790..8dda887ca 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/browser/process.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/browser/process.rs @@ -187,17 +187,6 @@ struct BrowserLaunchFailure { } impl BrowserLaunchFailure { - fn setup(code: &'static str) -> Self { - Self { - code, - stage: BrowserLaunchStage::Setup, - recoverable: false, - subprocess_exited: true, - cleanup_confirmed: true, - detail: None, - } - } - fn setup_with_detail(code: &'static str, detail: impl Into) -> Self { let detail = detail.into(); Self { diff --git a/apps/ai-game-creator-shell/src-tauri/src/command_exec.rs b/apps/ai-game-creator-shell/src-tauri/src/command_exec.rs index 1b76bfafc..ed1d70941 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/command_exec.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/command_exec.rs @@ -967,6 +967,10 @@ fn resolve_project_command_executable( } /// Linux 上 npm 以 `node ` 启动;其余情况保持 `executable + args`。 +/// +/// 调用点全在 Linux 编译面(`#[cfg(target_os = "linux")]` 的沙箱启动路径与该平台用例), +/// Windows 生产构建没有任何消费方,所以这里跟随调用点收窄到 Linux。 +#[cfg(target_os = "linux")] pub(crate) fn project_command_actual_target(spec: &ProjectCommandSpec) -> (PathBuf, Vec) { #[cfg(target_os = "linux")] {