refactor(agc): 收敛 codex provider 子树到一个模块,并只对该模块允许 dead code

用户决定(本 PR 内落地):把 codex 这块 provider 相关逻辑收敛到一个模块内,给该模块打上允许
dead code,而不是删除——上游 master 正在活跃编辑这些文件,删除会与其在飞工作反复冲突。
本次只影响 AGC 壳;server-rs、其它目录、其它 lint 与 CI 都不受影响。

逐行说明:
1. 新增 agent/codex_provider/mod.rs
   - 顶部 `#![allow(dead_code)]`:唯一落点,覆盖本模块及其子模块(实测可压过 AGC 壳的
     `#![cfg_attr(all(not(test), windows), deny(warnings))]`,但压不住 `unused_imports`)。
   - `#[path = "../codex_app_server/mod.rs"] pub(crate) mod app_server;`
     `#[path = "../codex_cli.rs"]          pub(crate) mod cli;`
     用 `#[path]` 就地挂载,不搬动文件——与上游活跃编辑区的冲突面只剩本文件与 agent.rs。
   - `pub(crate) use cli as codex_cli;`:子树内部既有的 `super::codex_cli::…` 相对路径照旧可用。
2. agent.rs
   - `mod codex_app_server;` + `mod codex_cli;` → `mod codex_provider;`
     `+ pub(crate) use codex_provider::{app_server as codex_app_server, cli as codex_cli};`
     对外路径(`crate::agent::codex_cli::…`、`super::codex_app_server::…`)不变,既有调用点零改动。
3. agent/codex_app_server/mod.rs:`resolve_direct_codex_project_authority` 由 `pub(super)` 放宽为
   `pub(in crate::agent)`——挂载多了一层后,保持它在挂载前对 agent 子树的有效可见性。
4. agent/codex_app_server/direct_project_identity.rs:`use super::super::*;` → `use crate::agent::*;`
   (同因,绝对路径与挂载前语义一致)。
5. agent/generation/llm_request.rs:删除 `AgentProgressEmitter` / `emit_agent_progress` 并同步模块文档。
   理由:其唯一消费方 `maybe_generate_platform_art_asset_step` 已随退役批次删除(我们那侧),
   master 对它的改动只是给死函数加日志;且 `allow(dead_code)` 压不住其它 lint,残留必须真删。
6. agent/thread_manager/turn_completion.rs:`host_dropped()` 加 `#[cfg(test)]`。理由:master 的生产
   Drop 已改用 `host_dropped_with_detail`,该兼容构造只剩用例引用,生产口径下是死码。
7. browser/process.rs:删除 `BrowserLaunchFailure::setup`。理由:master 把它改名成
   `setup_with_detail` 后遗留的未用构造(全仓无调用点)。
8. command_exec.rs:`project_command_actual_target` 收窄为 `#[cfg(target_os = "linux")]`。理由:
   master 新增该函数,但其调用点全在 Linux 编译面(沙箱启动路径与该平台用例),Windows 生产构建无消费方。

结果(Windows msvc / rustc 1.98.1,编辑器 feature):
- 生产口径 `cargo check`:0 warning / EXIT 0;
- `cargo check --all-targets`:EXIT 0(352 条告警全部落在这一个 bin 的 test harness 实例,属既有口径,
  与本提交无关);
- `npm run check:rustfmt`、`npm run check:encoding`、`git diff --check` 均通过。
This commit is contained in:
2026-10-07 14:00:21 +08:00
parent 3e13a6e407
commit c0d4f5c898
8 changed files with 45 additions and 60 deletions
@@ -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;
@@ -1,6 +1,6 @@
//! DirectProject 线程池身份的 canonical 解析与摘要。
use super::super::*;
use crate::agent::*;
use sha2::{Digest, Sha256};
pub(crate) fn direct_codex_canonical_project_identity(
@@ -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() {
@@ -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;
@@ -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,
@@ -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 }))
}
@@ -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<String>) -> Self {
let detail = detail.into();
Self {
@@ -967,6 +967,10 @@ fn resolve_project_command_executable(
}
/// Linux 上 npm 以 `node <npm-cli.js> <args>` 启动;其余情况保持 `executable + args`。
///
/// 调用点全在 Linux 编译面(`#[cfg(target_os = "linux")]` 的沙箱启动路径与该平台用例),
/// Windows 生产构建没有任何消费方,所以这里跟随调用点收窄到 Linux。
#[cfg(target_os = "linux")]
pub(crate) fn project_command_actual_target(spec: &ProjectCommandSpec) -> (PathBuf, Vec<String>) {
#[cfg(target_os = "linux")]
{