From 600beb452bdc3960228b76ba652f88b94775d335 Mon Sep 17 00:00:00 2001 From: Linghong Date: Wed, 23 Sep 2026 12:18:32 +0000 Subject: [PATCH] =?UTF-8?q?=E6=B8=85=E7=90=86=E5=B1=80=E9=83=A8=E6=9C=AA?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E4=BB=A3=E7=A0=81=E5=B9=B6=E6=94=B6=E7=B4=A7?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=BC=96=E8=AF=91=E8=BE=B9=E7=95=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 删除无消费者的包装、声明和重导出 将Direct执行测试入口限定为测试构建 记录86条复核与33条清理结果,验证85项回归 --- .../src-tauri/src/agent.rs | 6 +- .../src/agent/codex_app_server/mod.rs | 23 +-- .../src/agent/direct_codex_user_item/mod.rs | 7 +- .../src-tauri/src/agent/direct_execution.rs | 1 + .../src-tauri/src/agent/direct_tools_mcp.rs | 4 - .../src/agent/generation/canvas_generation.rs | 4 - .../src-tauri/src/agent/prompt.rs | 14 -- .../src/agent/runtime_driver/entrypoints.rs | 4 - .../runtime_protocol/acceptance_graph.rs | 8 - .../runtime_protocol/autonomous_completion.rs | 11 -- .../agent/runtime_protocol/provider_retry.rs | 39 ----- .../src-tauri/src/agent/runtime_state.rs | 9 - .../src/agent/runtime_tools/policy.rs | 29 ---- .../src-tauri/src/browser.rs | 4 +- .../src-tauri/src/config.rs | 10 -- .../src/editor_adapters/execution.rs | 6 - .../src-tauri/src/error_report/queue.rs | 7 - .../src-tauri/src/goal.rs | 11 -- .../src-tauri/src/main.rs | 1 - .../src-tauri/src/platform_session.rs | 5 - .../src-tauri/src/project/agent_db.rs | 135 --------------- .../src-tauri/src/project/conversation.rs | 8 - .../src-tauri/src/project/export.rs | 12 -- .../src-tauri/src/runner.rs | 7 +- .../src-tauri/src/runner/client.rs | 26 --- ...解决】主要构建入口编译警告清单-2026-09-23.md | 163 ++++++++++++++++++ 26 files changed, 173 insertions(+), 381 deletions(-) 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 9abc27465..752548bd7 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent.rs @@ -47,10 +47,8 @@ mod runtime_tools; mod skill_pack; use codex_app_server::*; pub(crate) use codex_app_server::{ - cancel_direct_codex_turn_at, - direct_codex_canonical_project_identity_for_commands as direct_codex_canonical_project_identity, - direct_game_creator_codex_chat_at, direct_game_creator_home_codex_chat, - direct_thread_id_for_project, DirectTurnCancelView, + cancel_direct_codex_turn_at, direct_game_creator_codex_chat_at, + direct_game_creator_home_codex_chat, direct_thread_id_for_project, DirectTurnCancelView, }; use codex_cli::*; pub(crate) use codex_cli::{ 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 1fec303bc..25f478c81 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 @@ -16,11 +16,8 @@ use process_tree::{OwnedProcessTree, ProcessTreeExitProof}; mod direct_project_identity; mod execution; mod model_catalog; +pub(crate) use direct_project_identity::direct_thread_id_for_project; use direct_project_identity::*; -pub(crate) use direct_project_identity::{ - direct_codex_canonical_project_identity as direct_codex_canonical_project_identity_for_commands, - direct_thread_id_for_project, -}; use execution::ExecutionAdapter; const GAME_CREATOR_CODEX_APP_SERVER_PROVIDER_ID: &str = "genarrative_agc"; @@ -4998,24 +4995,6 @@ pub(crate) async fn direct_game_creator_codex_chat_at( .await } -pub(crate) async fn direct_game_creator_codex_chat_at_with_observer( - root: &std::path::Path, - system_prompt: String, - user_prompt: String, - observer: &mut (dyn FnMut(DirectCodexTurnObservation) + Send), -) -> Result { - direct_game_creator_codex_chat_at_with_optional_observer( - root, - system_prompt, - user_prompt, - DirectCodexTurnKind::User, - None, - Some(observer), - None, - ) - .await -} - pub(crate) async fn direct_game_creator_codex_chat_at_with_optional_observer( root: &std::path::Path, system_prompt: String, diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/direct_codex_user_item/mod.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/direct_codex_user_item/mod.rs index 946cb4de3..66ef283b4 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/direct_codex_user_item/mod.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/direct_codex_user_item/mod.rs @@ -4,12 +4,9 @@ mod model; mod validation; mod wire; -pub(crate) use model::{ - DirectCodexUserAttachmentReferencePart, DirectCodexUserContentPart, DirectCodexUserItem, - DirectCodexUserMessageItem, DirectCodexUserRole, DirectCodexUserRuntimeRegionPart, -}; +pub(crate) use model::DirectCodexUserItem; pub(crate) use validation::validate_direct_codex_user_item; pub(crate) use wire::{ direct_codex_user_item_to_codex_turn_input, direct_codex_user_item_to_prompt, - direct_codex_user_item_to_response_item, direct_codex_user_item_to_wire_input, + direct_codex_user_item_to_response_item, }; diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/direct_execution.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/direct_execution.rs index a31c360f1..ec31889d6 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/direct_execution.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/direct_execution.rs @@ -483,6 +483,7 @@ pub(super) async fn begin( Ok(ExecutionSessionGuard { session }) } +#[cfg(test)] pub(super) fn open_at( host: &Path, root: &Path, diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/direct_tools_mcp.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/direct_tools_mcp.rs index a8d44b2f7..28c506608 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/direct_tools_mcp.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/direct_tools_mcp.rs @@ -32,8 +32,6 @@ tokio::task_local! { pub(crate) struct ExternalMcpServer { _bridge: super::direct_tool_bridge::DirectToolBridge, - pub(crate) url: String, - pub(crate) token: String, task: tokio::task::JoinHandle<()>, } @@ -2159,8 +2157,6 @@ pub(crate) async fn start_external_mcp_loopback( } *guard = Some(ExternalMcpServer { _bridge: bridge, - url: url.clone(), - token: token.clone(), task, }); Ok((url, token)) diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/generation/canvas_generation.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/generation/canvas_generation.rs index e016b9101..da3076fc7 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/generation/canvas_generation.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/generation/canvas_generation.rs @@ -1746,10 +1746,6 @@ pub(in crate::agent) struct PreparedPlatformArtAssetGeneration { } impl PreparedPlatformArtAssetGeneration { - pub(in crate::agent) fn slice_count(&self) -> usize { - self.slices.len() - } - fn validate_frozen_session(&self) -> Result<(), String> { self.platform_session_fence .as_ref() diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/prompt.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/prompt.rs index a87287fd7..a28d7b60f 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/prompt.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/prompt.rs @@ -1,13 +1,6 @@ use super::*; use std::sync::OnceLock; -pub(super) fn render_agent_runtime_prompt_context( - root: &Path, - agent_id: &str, -) -> Result { - render_agent_runtime_prompt_context_for_session(root, agent_id, None, true) -} - pub(super) fn render_agent_runtime_prompt_context_for_session( root: &Path, agent_id: &str, @@ -394,13 +387,6 @@ pub(crate) fn build_game_creator_role_agent_chat_request_for_session( Ok((llm, config_path, request)) } -pub(super) fn build_game_creator_role_agent_context( - root: &Path, - agent_id: &str, -) -> Result<(GameCreatorLlmConfig, String, String), String> { - build_game_creator_role_agent_context_for_session(root, agent_id, None) -} - pub(super) fn build_game_creator_role_agent_context_for_session( root: &Path, agent_id: &str, diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_driver/entrypoints.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_driver/entrypoints.rs index 0d4a11336..4c371d177 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_driver/entrypoints.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_driver/entrypoints.rs @@ -262,10 +262,6 @@ pub(crate) fn register_game_creator_manifest_invalidation_event_sink( sinks.push(sink); } -fn remove_game_creator_manifest_invalidation_event_sink(token: &str) { - lock_game_creator_manifest_invalidation_event_sinks().retain(|sink| sink.token != token); -} - #[cfg(test)] pub(crate) struct GameCreatorManifestInvalidationEventSinkTestGuard { _isolation: std::sync::MutexGuard<'static, ()>, diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/acceptance_graph.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/acceptance_graph.rs index 085d69d5f..ac1814fcf 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/acceptance_graph.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/acceptance_graph.rs @@ -253,14 +253,6 @@ fn acceptance_evidence_tools_at<'a>( Ok(tools) } -#[derive(Clone, Debug, Eq, PartialEq)] -struct FastGddFileReadCoverage { - content_sha256: String, - start_line: usize, - end_line: usize, - total_lines: usize, -} - fn validate_acceptance_required_evidence( node: &AgentRuntimeGoalContractAcceptanceNode, evidence_tools: &BTreeSet, diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/autonomous_completion.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/autonomous_completion.rs index 6468106d3..e289e81e0 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/autonomous_completion.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/autonomous_completion.rs @@ -14464,17 +14464,6 @@ pub(in crate::agent) fn inherited_gameplay_semantics_gap_with_external_javascrip missing.map(str::to_string) } -pub(in crate::agent) fn inherited_gameplay_semantics_gap( - task: &str, - html: &[u8], -) -> Option { - inherited_gameplay_semantics_gap_with_external_javascript( - task, - html, - &ExternalGameplayJavascript::default(), - ) -} - fn autonomous_inherited_gameplay_semantics_gap_at( root: &Path, contract: &AgentRuntimeAutonomousCompletionContract, diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/provider_retry.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/provider_retry.rs index 1f2be5915..e40018b89 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/provider_retry.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/provider_retry.rs @@ -325,26 +325,6 @@ pub(in crate::agent) fn game_creator_agent_runtime_llm_request_fingerprint( Ok(format!("{:x}", Sha256::digest(serialized))) } -pub(in crate::agent) fn game_creator_agent_runtime_provider_config_fingerprint( - llm: &GameCreatorLlmConfig, -) -> Result { - let app_config = load_game_creator_app_config()?; - let agent_mode = normalize_game_creator_agent_mode(&app_config.agent_mode)?; - let codex_cli_version = if matches!( - agent_mode.as_str(), - GAME_CREATOR_AGENT_MODE_CODEX_APP_SERVER | GAME_CREATOR_AGENT_MODE_CODEX_CLI - ) { - Some(game_creator_codex_cli_version_identity()?) - } else { - None - }; - game_creator_agent_runtime_provider_config_fingerprint_for_mode( - &agent_mode, - codex_cli_version.as_deref(), - llm, - ) -} - fn game_creator_agent_runtime_provider_config_fingerprint_for_mode( agent_mode: &str, codex_cli_version: Option<&str>, @@ -1643,25 +1623,6 @@ pub(in crate::agent) fn game_creator_agent_runtime_provider_request_attempt_id( ) } -pub(in crate::agent) fn game_creator_agent_runtime_provider_request_slot_for_id( - snapshot: &AgentRuntimeProviderRequestSnapshot, - request_id: &str, -) -> Option { - let base_request_id = game_creator_agent_runtime_provider_request_id(snapshot); - for attempt in 0..=64_usize { - let candidate = - game_creator_agent_runtime_provider_request_attempt_id(&base_request_id, attempt); - if candidate == request_id { - return Some(if attempt == 0 { - snapshot.request_slot.clone() - } else { - format!("{}-transient-{attempt}", snapshot.request_slot) - }); - } - } - None -} - pub(in crate::agent) fn resolve_game_creator_agent_runtime_provider_request_attempt_at_locked( root: &Path, base_request_id: &str, diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_state.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_state.rs index ede8bb200..1421d71f0 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_state.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_state.rs @@ -280,15 +280,6 @@ fn game_creator_agent_runtime_public_event_text( Some(summary) } -pub(crate) fn start_game_creator_agent_runtime_turn_at( - root: &Path, - agent_id: &str, - prompt: &str, - run_id: &str, -) -> Result { - start_game_creator_agent_runtime_turn_for_session_at(root, agent_id, None, prompt, run_id) -} - pub(crate) fn start_game_creator_agent_runtime_turn_for_session_at( root: &Path, agent_id: &str, diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_tools/policy.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_tools/policy.rs index 4d174de7d..d95cf853e 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_tools/policy.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_tools/policy.rs @@ -26,35 +26,6 @@ fn autonomous_art_director_non_canvas_validation_command_is_denied( ) } -fn autonomous_design_foundation_command_is_allowed(command_id: &str) -> bool { - matches!( - command_id, - "memory.read" - | "conversation.read" - | "asset.list" - | "asset.library.list" - | "project.index" - | "project.search" - | "file.read" - | "project.diff" - | "git.inspect" - | "file.list" - | "file.write" - | "file.delete" - | "project.patchset" - | "task.list" - | "command.run_limited" - | "image.inspect" - | "canvas.asset_generate" - | "canvas.asset_import" - | "asset.register" - | "ui.workflow.run" - | "agent.audit" - | "agent.action_history" - | "agent.run_status" - ) -} - pub(in crate::agent) fn refresh_game_creator_agent_runtime_tool_policy( root: &Path, state: &mut AgentRuntimeState, diff --git a/apps/ai-game-creator-shell/src-tauri/src/browser.rs b/apps/ai-game-creator-shell/src-tauri/src/browser.rs index 16b4ed4bd..23e15d4ac 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/browser.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/browser.rs @@ -19,10 +19,8 @@ pub use model::{ DiscoveredBrowserKind, }; pub(crate) use process::check_browser_health; +pub use process::validate_local_preview_in_browser; pub(crate) use process::validate_local_preview_in_browser_with_cancellation; -pub use process::{ - validate_local_preview_in_browser, validate_local_preview_in_browser_with_interaction, -}; pub(crate) use sweep::sweep_stale_browser_processes; pub(crate) use model::required_viewport_playtests_passed; diff --git a/apps/ai-game-creator-shell/src-tauri/src/config.rs b/apps/ai-game-creator-shell/src-tauri/src/config.rs index 676eb6c71..d6a3855c3 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/config.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/config.rs @@ -2374,16 +2374,6 @@ pub(crate) fn initialize_windows_game_creator_directory_owner_for_current_user( secure_windows_game_creator_path_for_current_user_with_owner_policy(path, true, true, true) } -/// Repairs an AGC-managed private object after an explicit UAC elevation. -/// Foreign-owned regular files/directories are deliberately reassigned to the -/// current token user here. The caller has already rejected links/reparse -/// points, and the final strict verification below is mandatory. -#[cfg(windows)] -pub(crate) fn repair_game_creator_private_acl_for_current_user(path: &Path) -> Result<(), String> { - let target_user_sid = current_windows_token_user_sid_string()?; - repair_game_creator_private_acl_for_user_sid(path, &target_user_sid) -} - #[cfg(windows)] fn current_windows_token_user_sid_string() -> Result { use std::ffi::c_void; diff --git a/apps/ai-game-creator-shell/src-tauri/src/editor_adapters/execution.rs b/apps/ai-game-creator-shell/src-tauri/src/editor_adapters/execution.rs index 37a80a8c3..3f9d801d6 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/editor_adapters/execution.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/editor_adapters/execution.rs @@ -518,12 +518,6 @@ pub(crate) fn disconnect_managed_editor_project( pub(crate) fn unity_execution_fence_path(config: &Path) -> PathBuf { editor_execution_fence_path(ManagedEditor::Unity, config) } -pub(crate) fn unity_uncertain_fence_path(config: &Path) -> PathBuf { - editor_uncertain_fence_path(ManagedEditor::Unity, config) -} -pub(crate) fn mark_unity_execution_uncertain_at(config: &Path) -> Result<(), String> { - mark_editor_execution_uncertain_at(ManagedEditor::Unity, config) -} pub(crate) fn unity_execute_receipt_is_valid(value: &Value) -> bool { editor_execute_receipt_is_valid(value) } diff --git a/apps/ai-game-creator-shell/src-tauri/src/error_report/queue.rs b/apps/ai-game-creator-shell/src-tauri/src/error_report/queue.rs index acef69e10..8ec0d10f8 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/error_report/queue.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/error_report/queue.rs @@ -185,13 +185,6 @@ pub(crate) fn ack(event_ids: &[String]) { } } -pub(crate) fn generation() -> u64 { - let state = queue() - .lock() - .unwrap_or_else(|poisoned| poisoned.into_inner()); - state.sequence -} - #[cfg(test)] pub(crate) fn reset_for_tests() { let mut state = queue() diff --git a/apps/ai-game-creator-shell/src-tauri/src/goal.rs b/apps/ai-game-creator-shell/src-tauri/src/goal.rs index f279be148..e39945230 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/goal.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/goal.rs @@ -1034,17 +1034,6 @@ pub(crate) fn mark_game_creator_agent_goal_cleared_for_runtime_at_locked( Ok(Some(goal)) } -pub(crate) fn mark_game_creator_agent_goal_cleared_for_runtime_at( - root: &Path, - state: &AgentRuntimeState, -) -> Result, String> { - let _lock = acquire_game_creator_agent_runtime_project_write_lock_with_wait( - root, - "runtime.goal.cleared", - )?; - mark_game_creator_agent_goal_cleared_for_runtime_at_locked(root, state) -} - pub(crate) fn complete_game_creator_agent_goal_for_runtime_at_locked( root: &Path, state: &mut AgentRuntimeState, diff --git a/apps/ai-game-creator-shell/src-tauri/src/main.rs b/apps/ai-game-creator-shell/src-tauri/src/main.rs index 597935ded..9a5ed45da 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/main.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/main.rs @@ -1725,7 +1725,6 @@ struct LlmAgentHandoff { const DIAGNOSTIC_LOG_MAX_BYTES: u64 = 256 * 1024; static DIAGNOSTIC_LOG_LOCK: OnceLock> = OnceLock::new(); -static STARTUP_PANIC_LOG_PATH: OnceLock = OnceLock::new(); static STARTUP_ERROR_DIALOG_SHOWN: AtomicBool = AtomicBool::new(false); #[tauri::command] diff --git a/apps/ai-game-creator-shell/src-tauri/src/platform_session.rs b/apps/ai-game-creator-shell/src-tauri/src/platform_session.rs index e1df0f8d9..0f4b03cd4 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/platform_session.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/platform_session.rs @@ -702,11 +702,6 @@ pub(crate) fn platform_session_is_available() -> bool { current_platform_session().is_some() } -pub(crate) fn platform_session_service_identity() -> Option { - current_platform_session() - .map(|snapshot| format!("{}\nuser:{}", snapshot.api_base_url, snapshot.user_id)) -} - #[cfg(test)] static PLATFORM_SESSION_TEST_LOCK: OnceLock> = OnceLock::new(); diff --git a/apps/ai-game-creator-shell/src-tauri/src/project/agent_db.rs b/apps/ai-game-creator-shell/src-tauri/src/project/agent_db.rs index bcd6d99d4..fd382197e 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/project/agent_db.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/project/agent_db.rs @@ -2492,99 +2492,6 @@ pub(crate) fn read_agent_db_records_bounded( Ok((records.into_iter().collect(), truncated)) } -/// 全量扫描 Agent 本地索引,返回全部命中 `predicate` 的记录。 -/// -/// 有界尾窗(`read_agent_db_records_bounded`)保留的是最新的一段:它能证明「在」, -/// 证明不了「不在」,也看不见已经滑出窗口的更旧记录。凡是要拿扫描结果做 fail-closed -/// 判据的调用方——「这条回执消费过没有」「这个 (gddId, version) 下有没有第二条冲突 -/// audit」——都必须走这条路。用尾窗做这种判据只有两种输出,而两种都是错的:命不中就 -/// 报「不存在」会把视野缺失当成事实,命不中就报错会把首次写入拦在写之前。 -/// -/// 扫描上限与写侧的幂等扫描完全一致(`AGENT_DB_MAX_ACTION_RECEIPT_SCAN_BYTES` / -/// `AGENT_DB_MAX_SCAN_RECORDS`),所以只要追加还写得进去,这里就一定扫得完;不会出现 -/// 「写得进但读不到」的窗口——那正是尾窗留下的那道两个数量级的缺口。 -/// -/// `max_matches` 是命中数上限,超出报错而不是静默截断:判据宁可停,也不能拿一个不完 -/// 整的命中集合下结论。 -pub(crate) fn read_agent_db_records_matching( - root: &Path, - max_matches: usize, - predicate: impl Fn(&serde_json::Value) -> bool, -) -> Result, String> { - let path = root.join(".agent/agent.db"); - let Some(directory) = open_agent_db_directory(root, false)? else { - return Ok(Vec::new()); - }; - let append_lock = project_append_lock_for(&path)?; - let _append_guard = append_lock.lock_process("Agent 本地索引")?; - verify_agent_db_directory_current(&directory)?; - let Some(mut storage) = open_agent_db_storage(directory, false, false)? else { - return Ok(Vec::new()); - }; - let length = storage - .file - .metadata() - .map_err(|error| { - format!( - "读取 Agent 本地索引元数据失败:{}: {error}", - storage.path.display() - ) - })? - .len(); - if length > AGENT_DB_MAX_ACTION_RECEIPT_SCAN_BYTES { - return Err(format!( - "Agent 本地索引超过 {} 字节扫描上限:{}", - AGENT_DB_MAX_ACTION_RECEIPT_SCAN_BYTES, - storage.path.display() - )); - } - storage.file.seek(SeekFrom::Start(0)).map_err(|error| { - format!( - "定位 Agent 本地索引失败:{}: {error}", - storage.path.display() - ) - })?; - let mut reader = BufReader::new(&mut storage.file); - let mut matches = Vec::new(); - let mut record_count = 0usize; - while let Some(line) = read_agent_db_jsonl_line_bounded(&mut reader, &storage.path)? { - // 崩溃留下的残缺末行从未提交成功,写侧下一次追加会把它截掉。它不是记录,也不 - // 该让判据 fail closed——扫到这里停住就够了。 - if !line.complete { - break; - } - if line.content.iter().all(|byte| byte.is_ascii_whitespace()) { - continue; - } - record_count = record_count.saturating_add(1); - if record_count > AGENT_DB_MAX_SCAN_RECORDS { - return Err(format!( - "Agent 本地索引超过 {} 条记录扫描上限:{}", - AGENT_DB_MAX_SCAN_RECORDS, - storage.path.display() - )); - } - let record = - serde_json::from_slice::(&line.content).map_err(|error| { - format!( - "解析 Agent 本地索引失败:{}: {error}", - storage.path.display() - ) - })?; - if !predicate(&record) { - continue; - } - if matches.len() >= max_matches { - return Err(format!( - "Agent 本地索引命中记录超过 {max_matches} 条上限:{}", - storage.path.display() - )); - } - matches.push(record); - } - Ok(matches) -} - pub(crate) fn read_agent_db_action_receipts_by_identities( root: &Path, identities: &BTreeSet<(String, String, String)>, @@ -3186,48 +3093,6 @@ pub(crate) fn read_agent_db_lifecycle_transitions_at( .unwrap_or_default()) } -pub(crate) fn read_agent_db_lifecycle_transitions_matching_at( - root: &Path, - record_type: &str, - identity_field: &str, - identity_value: &str, - expected_identity: &serde_json::Value, -) -> Result, String> { - let (expected_identity_field, _) = agent_db_lifecycle_key_fields(record_type)?; - if identity_field != expected_identity_field - || (record_type == AGENT_DB_PROVIDER_REQUEST_LIFECYCLE_RECORD_TYPE - && !is_valid_agent_db_provider_request_id(identity_value)) - || (record_type == AGENT_DB_FINALIZATION_LIFECYCLE_RECORD_TYPE - && !is_valid_agent_db_finalization_id(identity_value)) - { - return Err("Agent DB lifecycle 查询身份或 recordType 不受支持".to_string()); - } - validate_agent_db_lifecycle_record_semantics(record_type, expected_identity, false)?; - let path = root.join(".agent/agent.db"); - let Some(directory) = open_agent_db_directory(root, false)? else { - return Ok(Vec::new()); - }; - let append_lock = project_append_lock_for(&path)?; - let _append_guard = append_lock.lock_process("Agent 本地索引 lifecycle identity 查询")?; - verify_agent_db_directory_current(&directory)?; - let Some(mut storage) = open_agent_db_storage(directory, false, false)? else { - return Ok(Vec::new()); - }; - verify_agent_db_storage_current(&storage)?; - let scan = - scan_agent_db_lifecycle_records_unlocked(&mut storage.file, &storage.path, record_type)?; - verify_agent_db_storage_current(&storage)?; - let Some(sequence) = scan.sequences.get(identity_value) else { - return Ok(Vec::new()); - }; - validate_agent_db_lifecycle_record_identity( - &sequence.identity_record, - expected_identity, - record_type, - )?; - Ok(sequence.transitions_in_physical_order.clone()) -} - pub(crate) fn read_agent_db_incomplete_provider_request_ids_at( root: &Path, agent_id: &str, diff --git a/apps/ai-game-creator-shell/src-tauri/src/project/conversation.rs b/apps/ai-game-creator-shell/src-tauri/src/project/conversation.rs index a2cc7952a..ecc03de66 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/project/conversation.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/project/conversation.rs @@ -1441,14 +1441,6 @@ pub(crate) fn conversation_file_path_for_session( )) } -pub(crate) fn conversation_file_path( - root: &Path, - agent_id: Option<&str>, -) -> Result<(PathBuf, Option), String> { - let (path, agent_id, _session_id) = conversation_file_path_for_session(root, agent_id, None)?; - Ok((path, agent_id)) -} - pub(crate) fn normalize_conversation_agent_id(agent_id: &str) -> Result { if agent_id.is_empty() || agent_id.contains("..") diff --git a/apps/ai-game-creator-shell/src-tauri/src/project/export.rs b/apps/ai-game-creator-shell/src-tauri/src/project/export.rs index 6b66c9420..3ed1dfe83 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/project/export.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/project/export.rs @@ -570,18 +570,6 @@ pub(crate) fn collect_project_export_package_files( Ok(files) } -pub(crate) fn ensure_project_export_package_dir( - root: &Path, - relative_dir: &str, -) -> Result<(), String> { - let dir = resolve_local_project_path(root, relative_dir)?; - let metadata = checked_export_package_metadata(&dir, relative_dir)?; - if !metadata.is_dir() { - return Err(format!("{relative_dir} 必须是目录")); - } - Ok(()) -} - pub(crate) fn collect_project_export_package_dir_files( root: &Path, relative_dir: &str, diff --git a/apps/ai-game-creator-shell/src-tauri/src/runner.rs b/apps/ai-game-creator-shell/src-tauri/src/runner.rs index 92deb5c11..1b529eac4 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/runner.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/runner.rs @@ -12,19 +12,18 @@ pub(crate) use client::{ clear_external_agent_runner_platform_session, compact_external_agent_runner_context, configure_external_agent_runner, configure_external_agent_runner_read_only, continue_external_agent_runner_action, ensure_external_agent_runner_started, - ensure_external_agent_runner_started_for_gui, hold_external_agent_runner_gui_participant_lock, + hold_external_agent_runner_gui_participant_lock, install_external_agent_runner_platform_session, notify_external_agent_runner, pause_external_agent_runner, read_external_agent_runner_status, require_external_agent_runner_configured_for_cli_runtime_write, require_external_agent_runner_for_cli_runtime_write, resume_external_agent_runner, - shutdown_external_agent_runner, shutdown_external_agent_runner_for_client_exit, shutdown_external_agent_runner_for_gui_exit, shutdown_external_agent_runner_if_idle, steer_external_agent_runner, wake_external_agent_runner_pending, wake_external_agent_runner_pending_for_run, }; pub(crate) use client::{ - call_external_managed_editor, disconnect_external_managed_editor, - disconnect_external_managed_editor_project, mark_external_editor_uncertain, + call_external_managed_editor, disconnect_external_managed_editor_project, + mark_external_editor_uncertain, }; pub(crate) use endpoint::external_agent_runner_process_start_identity; #[cfg(windows)] diff --git a/apps/ai-game-creator-shell/src-tauri/src/runner/client.rs b/apps/ai-game-creator-shell/src-tauri/src/runner/client.rs index a171ec157..dc43df5e5 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/runner/client.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/runner/client.rs @@ -1065,12 +1065,6 @@ fn force_terminate_external_agent_runner_process( Err("当前平台不支持核验并强制终止 Agent Runner".to_string()) } -pub(crate) fn shutdown_external_agent_runner() -> Result<(), String> { - let config_dir = external_agent_runner_config_dir() - .ok_or_else(|| "外部 Agent Runner 尚未配置 AppData;请显式传入 --config-dir".to_string())?; - shutdown_external_agent_runner_at(&config_dir) -} - pub(crate) fn attach_external_agent_runner_gui_owner( event_sink: &GameCreatorManifestInvalidationEventSink, ) -> Result<(), String> { @@ -1402,14 +1396,6 @@ pub(super) fn shutdown_external_agent_runner_for_client_exit_at( Ok(true) } -pub(crate) fn shutdown_external_agent_runner_for_client_exit() -> Result { - let _configure = lock_unpoisoned(external_agent_runner_configure_lock()); - let Some(config_dir) = external_agent_runner_config_dir() else { - return Ok(true); - }; - shutdown_external_agent_runner_for_client_exit_at(&config_dir) -} - /// 窗口退出的收尾:先释放本窗口参与锁,再决定 Runner 是否需要关闭。 /// /// 返回 `Ok(false)` 表示仍检测到其它窗口持有参与锁,Runner 必须保留给它们; @@ -1563,12 +1549,6 @@ pub(crate) fn ensure_external_agent_runner_started() -> Result<(), String> { ensure_external_agent_runner(&config_dir).map(|_| ()) } -pub(crate) fn ensure_external_agent_runner_started_for_gui() -> Result<(), String> { - EXTERNAL_AGENT_RUNNER_GUI_OWNER_REQUIRED_CLIENT - .store(true, std::sync::atomic::Ordering::Release); - ensure_external_agent_runner_started() -} - pub(crate) fn require_external_agent_runner_for_cli_runtime_write( root: &Path, ) -> Result<(), String> { @@ -1836,12 +1816,6 @@ pub(crate) fn call_external_managed_editor( } } -pub(crate) fn disconnect_external_managed_editor( - editor: crate::editor_adapters::ManagedEditor, -) -> Result<(), String> { - disconnect_external_managed_editor_project(editor, None) -} - pub(crate) fn disconnect_external_managed_editor_project( editor: crate::editor_adapters::ManagedEditor, project: Option<&Path>, diff --git a/docs/project-memory/todos/【待解决】主要构建入口编译警告清单-2026-09-23.md b/docs/project-memory/todos/【待解决】主要构建入口编译警告清单-2026-09-23.md index 86cb40580..afb5c9d96 100644 --- a/docs/project-memory/todos/【待解决】主要构建入口编译警告清单-2026-09-23.md +++ b/docs/project-memory/todos/【待解决】主要构建入口编译警告清单-2026-09-23.md @@ -220,6 +220,169 @@ three、FBX/GLTF loader、OrbitControls 已动态 import。不能把“改为动 验证:默认编译、修改文件 rustfmt、编码、文档索引和 diff 检查通过;独立只读审查未发现参数错位或现役链路回归。**41 个定向 Rust 测试通过**:`codex_provider_proxy::` 14 个(含鉴权、主站路由标记、并行、透传与模型记录),`direct_project_history::` 22 个,app-server 的 Direct 输入 / 宿主继续和事件投影 5 个。先通过 `cargo test --locked --offline` 构建并执行代理测试,再直接复用同一测试二进制执行后两组,均单线程运行。Unix 条件下的 fake app-server 协议用例未在 Windows 执行;未运行正式 editor features、Linux/macOS 编译、真实 Provider、GUI 或安装包验收。 +## 10. 原 86 条清理候选的逐项复核(2026-09-23) + +### 复核范围与结论 + +基线为 `268f45015`。本轮只复核第 8 节初审的 86 条 `no_retention_found` 候选,不包含已删除的 Direct 审计 / 计时 12 条,也不重新审计原 74 条测试用途项。86 条均能对应到第 9 节最近一次默认 Windows dev 编译的 183 条诊断;本轮未修改业务代码、未重新编译,183 不是本轮新测值。 + +逐项检查当前源码调用、测试导入与构造、平台条件、命令注册、现行文档及必要的 Git 决策记录。初审“未找到依据”不是删除结论;本轮纠正了漏计的测试和 Unix 消费者。 + +| 复核处置 | 诊断数 | 实施边界 | +| --- | ---: | --- | +| 可局部清理 | 33 | 无消费者的包装、声明、重导出或冗余副本;保留被包装的现役实现 | +| 需成组清理 | 30 | 旧入口与其专属调用链、测试或说明联动删除;不按整个文件机械删除 | +| 调整测试或平台编译边界 | 20 | 19 条涉及测试消费,1 条涉及 Unix 生产消费;优先精确 cfg,混合诊断按符号拆分 | +| 先厘清契约与实现 | 3 | W063、W069、W071;记录具体冲突,不能靠删除声明或 allow 掩盖 | +| **合计** | **86** | **63 条删除候选 + 20 条编译边界项 + 3 条待核定项;未实施删除** | + +### 关键纠正与清理边界 + +- **测试消费者**:`browser/tests.rs:24–28`、`:1015` 等使用 W193~W195;`tool_plan_handoff/tests.rs:1418–1419` 与 `tests/mod.rs:4452` 使用 W201;`analytics/store_tests.rs:352,1180` 使用 W092~W093。Runtime 的 11 条 facade 诊断同样包含测试出口,优先按测试编译,而非为了删除出口扩大子模块可见性。 +- **测试构造不等于未构造**:W075 的 `AgentRuntimePersistedProviderRequestOutcome::HandoffPrepared` 在 `runtime_protocol/provider_retry.rs:1347–1349` 的 `#[cfg(test)]` 路径实际构造。应保留故障注入测试覆盖,并核对整条返回 / 匹配链的 cfg;其他同名枚举分支不属于本条删除候选。 +- **Unix 现役路径**:W154 的 `runtime_directory()` 被 `runner/project_owner.rs:617,651,729,763,785` 的 Unix `openat / renameat / sync_all` 路径消费,涉及项目 owner 锁与诊断文件安全性。保留方法并精确限定平台,不能因 Windows warning 删除。 +- **Home 与附件链**:W016~W022、W027、W029~W034 对应未注册的 Home / 旧 sidecar 路径;`scripts/check-config.mjs:1256–1261` 禁止重新注册无项目 Home 命令。清理要更新专属测试和 app-server 分支,但 `direct_codex_attachments.rs` 的名称 / 媒体类型 / 路径清洗及数量上限仍被 canonical `validation.rs:70–100`、`wire.rs:109–119` 使用,不可整模块删。 +- **旧重生成文本判断可以退役**:W036~W038 无调用。进一步核对发现 `1f904d28e9` 已明确删除客户端文本授权判断;[主实施计划](../../technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md) 第 641~644 行与 [Skill / MCP 专题](../../technical/【技术方案】DirectProject客户端Skill与MCP扩展导入方案-2026-08-31.md) 第 19 行将高层业务意图交给 Codex,客户端继续负责账号、项目、权限、计费、幂等、锁和恢复。因此不能拿主实施计划第 1444 行、共享决策第 8397 行残留的旧独立语句规则要求恢复这些函数;实施清理时同步收敛这两处旧说明。当前回合绑定、稳定摘要、并发 / 重试保护和付费恢复继续保留。 +- **删除范围止于无用包装**:例如 W147 只涉及 `runner/client.rs:1405–1411` 无消费者的全局包装;其 `_at` 测试入口、测试协议及现役 GUI 参与锁退出链不随本条删除。W119~W120 只涉及 Unity 专用包装,通用编辑器不确定状态围栏仍在。W040 只涉及 registry 的未读 `url/token` 副本,HTTP state 的 Bearer 鉴权及返回凭据不变。 + +### 三条待核定项 + +| 编号 | 已确认事实 | 下一步判据 | +| --- | --- | --- | +| W063 | `runtime_driver.rs:391` 的 plan lifecycle v3 常量无引用;`runtime_protocol/provider_control.rs:355` 的现有 writer 使用通用 v2 常量;Fast GDD 文档第 1270 行仍要求 exact plan 的 v3 语义 | 跟踪 exact plan 请求实际 writer / reader,核定 v3 是否在别处实现、文档已过期或实现缺失;不凭一个常量删改持久化版本 | +| W069 | `finalization.rs:6–10` 的 Deferred 注释描述 project→execution 重取失败,当前无构造;`recovery_scan.rs:1092,1105,1114` 仍匹配,pending recovery 未发现注释所述释放 / 重取;Fast GDD 第 2144 行只承诺新增 planning 澄清路径锁序 | 明确旧注释 / 分支是否已经退役,再删除对应分支或另立行为修复;本轮不改变锁序 | +| W071 | `task_start.rs:745–753` 的孤立 helper 读取 Goal sidecar;相邻现役 `autonomous_root_goal_contract_persisted_at` 在验证身份后返回 `Ok(true)`,与第 755~758 行“缺 sidecar no-op、损坏报错”的注释不符 | 核定当前 scheduler 的 Goal 前置合同,再决定删除旧 helper / 更新注释还是修复检查;不把恒真入口视为已验证的 Goal 门禁 | + +### 逐条处置索引 + +位置相对 `apps/ai-game-creator-shell/src-tauri/`,行号对应本节基线。W 编号沿用原附录;N001 是第 7 节已记录的合并后新增 `runtime_driver.rs` 重导出诊断。一条诊断可能包含多个符号,表中边界优先于按整行删除。 + +#### 可局部清理(33 条) + +| 编号 | 当前证据入口 | 处理边界 | +| --- | --- | --- | +| W003 | `src/main.rs:1728` | 仅删除无读写的静态声明;panic hook/日志路径其他实现不扩删。 | +| W010 | `src/agent/codex_app_server/mod.rs:5001-5017` | 删除无调用包装;保留 optional_observer 和 DirectProject app-server 回合。 | +| W026 | `src/agent/direct_execution.rs:486-503` | 只删除无调用包装,保留 execution 会话持久状态和 analytics 入口。 | +| W040 | `src/agent/direct_tools_mcp.rs:33-43` | 仅移除 registry 对象中冗余 url/token 字段及构造赋值;绝不可删除 HTTP state.token、Bearer 比对、返回值或 _bridge/task 生命周期。 | +| W050 | `src/agent/generation/canvas_generation.rs:1749` | 只删 CanvasGeneration 所属 slice_count 方法;其他同名请求字段、Direct 参数和实际切片限制仍活跃。 | +| W052 | `src/agent/prompt.rs:4` | 只删无调用的无 session 包装;render_agent_runtime_prompt_context_for_session 仍用于 prompt 组装。 | +| W054 | `src/agent/prompt.rs:397` | 只删无调用的无 session 包装;build_game_creator_role_agent_context_for_session 仍为现役实现。 | +| W064 | `src/agent/runtime_protocol/acceptance_graph.rs:257` | 未构造 FastGddFileReadCoverage;requiredEvidence 当前按工具集合校验,限删旧结构,不动验收图持久内容和校验。 | +| W066 | `src/agent/runtime_driver/entrypoints.rs:265` | remove sink 无 caller;保留 register/validate 和现役窗口事件接收器,不推断外部 detach 协议变更。 | +| W072 | `src/agent/runtime_protocol/autonomous_completion.rs:14467` | 只删无调用的无外部 JS 包装;autonomous_inherited_gameplay_semantics_gap_at 仍经 with_external_javascript 执行连续性核对。 | +| W077 | `src/agent/runtime_protocol/provider_retry.rs:328` | 仅删 provider_config_fingerprint 旧包装;核对其签名内部委托的现役 fingerprint 算法和持久身份计算不变。 | +| W078 | `src/agent/runtime_protocol/provider_retry.rs:1646` | 仅删无调用 request_slot_for_id 包装;现役请求槽分配/恢复逻辑不动。 | +| W082 | `src/agent/runtime_state.rs:283` | 仅删无调用的 turn_at 包装;正式 turn 启动入口及状态写入不动。 | +| W091 | `src/agent/runtime_tools/policy.rs:29` | 无调用的旧 autonomous_design_foundation_command_is_allowed 文本判断;现役工具策略/许可函数保留。 | +| W108 | `src/config.rs:2377-2385` | 仅无调用包装器可移;保留显式 UAC 修复、SID 核验与拒绝 reparse 的安全路径。 | +| W119 | `src/editor_adapters/execution.rs:521-522` | 仅 Unity 专属无调用包装器可移;持久 fence 文件名及通用检查/恢复不可删除。 | +| W120 | `src/editor_adapters/execution.rs:524-525` | 仅 Unity 专属无调用包装器可移;通用 uncertain 写入、重启恢复和持久 fence 不动。 | +| W124 | `src/error_report/queue.rs:188-193` | 仅孤立 sequence getter 可移;通知 generation 对比及队列状态保留。 | +| W125 | `src/goal.rs:1037-1046` | 只移无调用锁包装;保留实际 goal cleared 状态写入及调用方现有锁顺序。 | +| W128 | `src/platform_session.rs:705-708` | 只移未消费的派生 getter;平台会话存储与校验功能保留。 | +| W132 | `src/project/agent_db.rs:2509` | 仅未消费的查询入口可移;不改变 .agent/agent.db 格式、追加扫描界限、锁或读取语义。 | +| W133 | `src/project/agent_db.rs:3189-3230` | 只移未消费的按身份查询入口;保留 lifecycle 持久记录、扫描器、锁及现役恢复读取。 | +| W137 | `src/project/conversation.rs:1444-1450` | 只移默认 session 两元组包装;对话文件路径规则与会话兼容读取不动。 | +| W138 | `src/project/export.rs:573-583` | 仅无调用目录辅助入口可移;导出校验、路径安全和项目 exports 内容不动。 | +| W145 | `src/runner/client.rs:1068-1072` | 只移无调用的无参包装;底层 shutdown_at 仍供升级/GUI 退出使用。 | +| W147 | `src/runner/client.rs:1405-1411` | 仅删除无消费者的全局包装,不删除 _at、测试协议或 GUI 参与锁退出路径。相关协议是否退役属于后续测试用途审计,不构成本包装的保留依据。 | +| W148 | `src/runner/client.rs:1566-1570` | 只移无调用启动包装;GUI owner flag 的现役设置和参与锁仍需保留。 | +| W150 | `src/runner/client.rs:1839-1842` | 只移无调用的无项目包装及 W199 对应重导出;project-aware 断开协议保留。 | +| W168 | `src/agent/direct_codex_user_item/mod.rs:7-10` | 仅移除五个未消费的顶层重导出;保留 model 类型、模块内部引用、DirectCodexUserItem 及 canonical 输入协议。 | +| W169 | `src/agent/direct_codex_user_item/mod.rs:12-15` | 仅移除 mod.rs 重导出;保留 wire.rs 的函数和其校验、摘要路径。 | +| W192 | `src/agent.rs:53` | agent.rs 中二次别名无消费者;codex_app_server 原身份函数/自身重导出不在本条清理范围。 | +| W196 | `src/browser.rs:23-25` | 仅删除 browser.rs 未消费的门面 re-export;保留 process.rs 函数与其生产调用。 | +| W199 | `src/runner.rs:25-28` | 仅该门面导出可移;project-aware 断开调用和 client 实现另按 W150 判断。 | + +#### 需成组清理(30 条) + +| 编号 | 当前证据入口 | 处理边界 | +| --- | --- | --- | +| W016 | `src/agent/direct_codex_attachments.rs:9` | 随旧 Home/sidecar 渲染清理并同步专属测试与 prompt 源边界清单;保留 canonical 附件清洗和现役 prompt bundle 其它 key。 | +| W017 | `src/agent/direct_codex_attachments.rs:10` | 只清旧 sidecar header/渲染及相应专属测试;不能删除现役 canonical 附件摘要、路径校验。 | +| W018 | `src/agent/direct_codex_attachments.rs:12-23` | 仅旧 Rust DTO 随 Home/sidecar 清理;保留 TS 附件映射、canonical Rust attachment reference part 和有效上传路径。 | +| W019 | `src/agent/direct_codex_attachments.rs:55-61` | 随旧 sidecar 状态渲染清理;保留 canonical 状态约束,不把状态白名单误删。 | +| W020 | `src/agent/direct_codex_attachments.rs:105-113` | 随旧 sidecar 的 home/project 分流删除;保留项目附件路径的 canonical 校验。 | +| W021 | `src/agent/direct_codex_attachments.rs:115-141` | 随旧 sidecar 行渲染清理;保留 sanitize_attachment_name/media_type/local_path,wire.rs 仍直接使用。 | +| W022 | `src/agent/direct_codex_attachments.rs:143-183` | 删旧 sidecar prompt 渲染及专属测试,不可整删附件模块:validation.rs:6-8,70-100、wire.rs:7-8,109-119 仍消费共用清洗函数/上限。 | +| W027 | `src/agent/direct_runtime/mod.rs:74` | 与旧 Home prompt/reply/command 成组清理 marker 和专属测试;勿影响项目创建正式命令。 | +| W029 | `src/agent/direct_runtime/mod.rs:323` | 只随旧 Home turn 清理三维首页提示;保留现役 Project 引擎指引。 | +| W030 | `src/agent/direct_runtime/mod.rs:4732-4741` | 仅旧 Home prompt 组装与已无消费者的 direct.home.* key 在核对 bundle schema 后清理;保留共享 Direct prompt 内容和生成器完整性校验。 | +| W031 | `src/agent/direct_runtime/mod.rs:4743-4748` | 随旧 Home reply/命令清理,保留现役 DirectProject 返回字符串和事件。 | +| W032 | `src/agent/direct_runtime/mod.rs:4750-4773` | 与 marker、Home reply 成组清理,不改变 DirectProject 完成事件和正文投影。 | +| W033 | `src/agent/direct_runtime/mod.rs:4775-4790` | 成组清理旧 Home turn 并复核 app-server DirectHome 分支/专属测试;保留共享 Codex connection、ToolHost 和 DirectProject mode。 | +| W034 | `src/agent/direct_runtime/mod.rs:5776-5782` | 仅退役未注册 Home 命令及上游链;保留 create_automatic_local_game_project、DirectProject 命令和 UI 附件导入。 | +| W036 | `src/agent/direct_tool_bridge.rs:308-324` | 旧客户端文本意图/授权启发式已由 2026-09-08 MCP 决策明确退役,三项应成组清理;不恢复旧独立语句关键词门禁。保留现役项目权限、付费计费、活动 clientTurnId、稳定 brief、幂等/恢复;同步修订主规范:1444 与共享记忆:8397 的过期叙述。 | +| W037 | `src/agent/direct_tool_bridge.rs:326-389` | 旧客户端文本意图/授权启发式已由 2026-09-08 MCP 决策明确退役,三项应成组清理;不恢复旧独立语句关键词门禁。保留现役项目权限、付费计费、活动 clientTurnId、稳定 brief、幂等/恢复;同步修订主规范:1444 与共享记忆:8397 的过期叙述。 | +| W038 | `src/agent/direct_tool_bridge.rs:391-646` | 旧客户端文本意图/授权启发式已由 2026-09-08 MCP 决策明确退役,三项应成组清理;不恢复旧独立语句关键词门禁。保留现役项目权限、付费计费、活动 clientTurnId、稳定 brief、幂等/恢复;同步修订主规范:1444 与共享记忆:8397 的过期叙述。 | +| W058 | `src/agent/runtime_actions/project_gates.rs:1838` | 短等候专用常量只被 W059 包装消费;与 W059 成组处理,不动有界正式写锁语义。 | +| W059 | `src/agent/runtime_actions/project_gates.rs:1900` | 短等候包装无 caller;连同 W058 常量清理,保留当前写锁获取函数及其调用。 | +| W060 | `src/agent/runtime_actions/project_gates.rs:1911` | 本体除 W180 facade 无 caller;与 W180 出口成组清理,不动 with_wait 正式写锁。 | +| W087 | `src/agent/runtime_tools/isolated_joins.rs:88` | 仅删无预算包装;ready_isolated_join_status_for_parent_with_budget_at 仍为现役路径。 | +| W089 | `src/agent/runtime_tools/isolated_joins.rs:200` | 仅删无预算包装;claim_ready_isolated_joins_with_budget_at 及锁内 claim 提交不动。 | +| W090 | `src/agent/runtime_tools/isolated_joins.rs:479` | 仅删无预算包装;select_isolated_join_claim_batch_with_limit 保留并继续执行 payload 限额。 | +| W105 | `src/commands.rs:3752-3764` | 与 W106 旧包装成组;保留底层素材获取及现役 Runtime account library 投影。 | +| W106 | `src/commands.rs:3766-3790` | 旧投影函数可与 W105 成组清理;现役工具仍须保持素材 ID/展示字段和凭据过滤。 | +| W149 | `src/runner/client.rs:1594-1612` | 与 W151 旧 string-kind 通知适配器成组;typed runtime 通知和受限 continue_action 身份校验保留。 | +| W151 | `src/runner/client.rs:2131-2140` | 与 W149 旧字符串通知适配器成组;现役 typed wake/resume 发送与 server dispatch 保留。 | +| W162 | `src/ui_editor/html_renderer/mod.rs:17-54` | 孤立 HTML 渲染链可成组清理;现役 JS 导出、共享 node/component/assets 和持久化 schema 保留。 | +| W163 | `src/ui_editor/html_renderer/mod.rs:139-155` | 仅 HTML 分支的树辅助函数与 W162 同组;不删 JS 共享渲染实现。 | +| W164 | `src/ui_editor/html_renderer/mod.rs:157-163` | 仅 HTML 分支的无缩放包装与 W162/163 同组;保留底层共享 node renderer。 | + +#### 调整测试或平台编译边界(20 条) + +| 编号 | 当前证据入口 | 处理边界 | +| --- | --- | --- | +| N001 | `src/agent/runtime_driver.rs:370` | 测试仍经该 facade 调用现役实现;优先把所需重导出限定为 #[cfg(test)],同组无消费者的导出可删除。保留底层实现及原测试覆盖,不为消除 warning 放宽模块可见性。 | +| W061 | `src/agent/runtime_actions/response_stream.rs:222` | 测试在 response_stream_tests.rs:215/257 直接使用 ready;生产 publisher 仍有 failed/handoff/persist 路径,需决定保留测试注入或用现役终态路径改写测试。 | +| W075 | `src/agent/runtime_protocol/models.rs:26` | 仅 AgentRuntimePersistedProviderRequestOutcome 的 HandoffPrepared 在生产未构造:provider_retry.rs:1347-1349 用 cfg(test) 故障注入构造,随后多层同名 enum 生产分支是活跃代码;不得批量删同名变体。 | +| W092 | `src/analytics/store.rs:24` | 当前测试使用观测计数,测试结构需保留或迁移断言;实际 analytics 队列不可一并删除。 | +| W093 | `src/analytics/store.rs:286-294` | 测试断言队列 dropped 行为;可选择 cfg(test) 缩窄但需确认调用跨 cfg 可编译。 | +| W154 | `src/runner/state.rs:248-252` | Unix 生产项目 owner 锁与诊断文件安全路径直接调用;Windows warning 不能作为跨平台删除依据。 | +| W175 | `src/agent/generation.rs:29` | 测试仍经该 facade 调用现役实现;优先把所需重导出限定为 #[cfg(test)],同组无消费者的导出可删除。保留底层实现及原测试覆盖,不为消除 warning 放宽模块可见性。 | +| W177 | `src/agent/runtime_actions.rs:60` | 测试仍经该 facade 调用现役实现;优先把所需重导出限定为 #[cfg(test)],同组无消费者的导出可删除。保留底层实现及原测试覆盖,不为消除 warning 放宽模块可见性。 | +| W178 | `src/agent/runtime_actions.rs:76` | 测试仍经该 facade 调用现役实现;优先把所需重导出限定为 #[cfg(test)],同组无消费者的导出可删除。保留底层实现及原测试覆盖,不为消除 warning 放宽模块可见性。 | +| W180 | `src/agent/runtime_actions.rs:98` | 混合诊断:前两个重导出供现役逻辑的测试使用,优先拆为 #[cfg(test)];try_acquire 的无调用实现与出口按 W060 联动清理。 | +| W182 | `src/agent/runtime_driver.rs:309` | 测试仍经该 facade 调用现役实现;优先把所需重导出限定为 #[cfg(test)],同组无消费者的导出可删除。保留底层实现及原测试覆盖,不为消除 warning 放宽模块可见性。 | +| W183 | `src/agent/runtime_driver.rs:331` | 测试仍经该 facade 调用现役实现;优先把所需重导出限定为 #[cfg(test)],同组无消费者的导出可删除。保留底层实现及原测试覆盖,不为消除 warning 放宽模块可见性。 | +| W185 | `src/agent/runtime_protocol.rs:43` | 测试仍经该 facade 调用现役实现;优先把所需重导出限定为 #[cfg(test)],同组无消费者的导出可删除。保留底层实现及原测试覆盖,不为消除 warning 放宽模块可见性。 | +| W186 | `src/agent/runtime_protocol.rs:73` | 测试仍经该 facade 调用现役实现;优先把所需重导出限定为 #[cfg(test)],同组无消费者的导出可删除。保留底层实现及原测试覆盖,不为消除 warning 放宽模块可见性。 | +| W187 | `src/agent/runtime_protocol.rs:75` | 测试仍经该 facade 调用现役实现;优先把所需重导出限定为 #[cfg(test)],同组无消费者的导出可删除。保留底层实现及原测试覆盖,不为消除 warning 放宽模块可见性。 | +| W189 | `src/agent/runtime_protocol.rs:86` | 测试仍经该 facade 调用现役实现;优先把所需重导出限定为 #[cfg(test)],同组无消费者的导出可删除。保留底层实现及原测试覆盖,不为消除 warning 放宽模块可见性。 | +| W193 | `src/browser/playtest/mod.rs:17-27` | 测试直接消费重导出;保留测试出口及 generic.rs 现役逻辑,若调整导入需同步测试。 | +| W194 | `src/browser/playtest/mod.rs:28` | 测试直接消费重导出;lane_defense.rs 生产算法和测试类型不可随 import 删除。 | +| W195 | `src/browser.rs:11` | 根层重导出供 browser 子模块测试 super::*;生产 discovery 函数仍被 process 使用。 | +| W201 | `src/tool_plan_handoff.rs:34-37` | 测试直接依赖门面;schema 常量及 ledger 类型也是现役持久化合同,不能删定义。 | + +#### 先厘清契约与实现(3 条) + +| 编号 | 当前证据入口 | 处理边界 | +| --- | --- | --- | +| W063 | `src/agent/runtime_driver.rs:391` | 常量 v3 当前仅声明,provider_control.rs:355 使用 v2;Fast GDD 文档明确 exact plan lifecycle v3,需先核实计划请求实际 writer/reader 是否别处落地,再定常量去留。 | +| W069 | `src/agent/runtime_driver/finalization.rs:10` | Deferred 在此 enum 无构造,但 recovery_scan 有三处 continue 及同步路径 Err;注释描述通用 project→execution 重取失败,pending_recovery 没有相应释放/重取,Fast GDD 文档锁序承诺只覆盖 planning 澄清。先确认旧注释/分支是否退役。 | +| W071 | `src/agent/runtime_driver/task_start.rs:745` | 死 helper 会读取 Goal sidecar;现役 autonomous_root_goal_contract_persisted_at 返回 Ok(true),ready-task parent validator 只查身份,和相邻注释承诺的 sidecar 未落盘 no-op/坏数据报错冲突。先裁定当前合同再动 helper。 | + +### 实施顺序与本轮验证 + +下一批优先选择上表 33 条局部清理项,按实际受影响模块运行默认编译、测试构建和定向回归;随后分别处理 Home / 附件、旧文本判断、通知 / HTML 等成组链路。20 条编译边界项保留其测试或平台用途,3 条待核定项独立收敛。不得承诺删除 63 条候选后 warning 恰好减少 63:删除上游入口可能暴露下游未使用诊断。 + +本轮只有审计文档变更。检查逐条记录共 86 条、编号无重复、与原候选的文件及诊断消息集合一致;执行编码、文档索引和 diff 检查。未运行新的 cargo check、Rust 测试、正式 editor feature 或 Linux/macOS 构建,未修改业务实现或用户项目数据。 + +## 11. 局部候选清理实施(2026-09-23) + +本批处理第 10 节的 33 条局部项,范围止于对应声明、无消费者包装、冗余重导出和 registry 字段;不扩展到 30 条成组链路或 3 条契约待核定项。现役会话、Provider 请求身份、编辑器不确定状态围栏、项目 / 追加锁、持久化格式、Runner 多窗口退出与 MCP 鉴权保持原行为。 + +实施前再次扫描源码调用,纠正 **W026**:`direct_execution::open_at` 实际被 `direct_tool_bridge`、`direct_delivery`、`direct_validation` 和 app-server 的测试夹具使用,因此本批保留函数并限定为 `#[cfg(test)]`,不删除测试调用或改写生产 analytics 入口。第 10 节保留实施前的审计快照;最新归类应为 32 条局部删除候选、30 条成组候选、21 条测试 / 平台边界项、3 条待核定项。本批完成的是原定 33 条诊断对应的处理,其中 32 条删除、1 条测试边界收紧。 + +W192 的外层别名删除后,首次编译暴露出 `codex_app_server/mod.rs` 中同链的 `direct_codex_canonical_project_identity_for_commands` 中间重导出也已无消费者;本批一起移除该别名。`direct_project_identity` 中实际项目身份校验及其现役调用保持不变。 + +默认 Windows dev `cargo check --locked --offline` 通过,warning **183 → 150,净减少 33 条,没有新增诊断**。减少项与第 10 节原 33 条局部清单逐项一致;其中 `dead_code` 146 → 118、`unused_imports` 27 → 22,9 条 `unused_variables` 与 1 条 `unused_assignments` 不变。另有 5 条 ts-rs 属性解析提示,未纳入上述编译器诊断计数。 + +测试目标构建通过,**85 个定向 Rust 测试全部通过**,单线程执行:Direct execution / delivery / validation、canonical userItem、app-server execution、外部 MCP HTTP 容量恢复、通用编辑器回执与围栏、Provider 配置身份、验收图证据、角色工具权限及 Runner client-exit。复用了现有用例,没有新增仅用于证明删除的测试。独立只读审查未发现现役行为变化或悬空引用;修改文件 rustfmt、编码、文档索引与 diff 检查通过。 + +本批未运行全部 Rust 用例、正式 editor features、Linux/macOS 构建、真实 Provider、GUI 或安装包验收。原 30 条成组候选、其余测试 / 平台边界项和 3 条契约待核定项仍待后续处理。 + ## 附录:237 条编译器诊断位置 以下是诊断的人工可读整理,不保存原始构建日志、本机路径或 target 缓存路径。位置相对 `apps/ai-game-creator-shell/src-tauri/`;行号只对应本节基线,修改后以符号搜索及重新编译为准。每条保留一个主要 span,编号用于本清单内跟踪,不表示独立业务缺陷。生成产物项须回到 `build_support/runtime_prompt_bundle.rs` 处理。