Files
Genarrative/apps/ai-game-creator-shell/src-tauri/src/agent.rs
T
kdletters 361daf374d
Project CI / AI game creator shell Rust shard 1/4 (push) Failing after 4m49s
Project CI / AI game creator shell Rust shard 2/4 (push) Failing after 5m9s
Project CI / AI game creator shell Rust shard 3/4 (push) Failing after 4m34s
Project CI / AI game creator shell Rust smoke (push) Successful in 2m1s
Project CI / AI game creator shell Rust shard 4/4 (push) Failing after 4m20s
Project CI / AI game creator shell Rust crates (push) Successful in 2m27s
Project CI / Native shell tests (push) Failing after 2m36s
Project CI / AI game creator shell web tests (push) Failing after 47s
Project CI / Frontend tests (push) Successful in 4m23s
Project CI / Repository checks (push) Failing after 3m14s
Project CI / Backend tests (push) Successful in 7m17s
修复 AGC 统一错误诊断与素材验收 (#376)
## 变更内容

- 新增统一 Agent Runtime 错误事件和项目内诊断 sidecar,统一 DirectProject、Agent Runtime、app-server 与 AGC 工具桥的失败记录。
- 失败回执写回 DirectProject 对话历史,下一轮可读取上一轮失败证据;前端支持读取脱敏诊断详情。
- 区分 app-server 终态、空闲/硬超时、工具参数错误和试玩次数越界。
- 素材完成门扫描实际 npm 源码模块,并识别 manifest 中合法的自定义登记素材路径。
- 更新 AGC 技术规范、项目决策记录、里程碑和实施计划。

## 验证

- cargo check --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --tests
- 统一错误测试 6/6 通过
- DirectProject 失败诊断测试 4/4 通过
- npm 场景模块素材引用回归测试通过
- npm run --prefix apps/ai-game-creator-shell typecheck
- npm run check:encoding
- npm run check:doc-index
- git diff --check、Rust 格式检查

真实 Provider / 安装包 smoke 尚未在本 PR 中运行。

---------

Co-authored-by: Git Hooks Test <git-hooks-test@example.invalid>
Reviewed-on: #376
2026-09-15 20:21:53 +08:00

124 lines
4.0 KiB
Rust

use super::*;
use crate::provider_handoff;
use crate::provider_retry::{
self, AgentRuntimeProviderRetryIdentity, AgentRuntimeProviderRetryRecord,
};
use crate::tool_plan_handoff;
use sha2::{Digest, Sha256};
use std::collections::BTreeSet;
use std::io::{Seek, SeekFrom};
use std::sync::atomic::{AtomicBool, AtomicU64, Ordering};
mod codex_app_server;
mod codex_cli;
mod codex_provider_proxy;
mod design_runtime;
mod design_tools;
mod direct_codex_attachments;
mod direct_codex_audit;
mod direct_codex_references;
mod direct_project_history;
mod direct_project_turn_history;
mod direct_runtime;
mod direct_tool_bridge;
mod direct_tools_mcp;
mod generation;
mod interaction;
mod prompt;
mod runtime_actions;
mod runtime_adapter;
mod runtime_driver;
mod runtime_error;
mod runtime_protocol;
mod runtime_state;
mod runtime_tools;
mod skill_pack;
use codex_app_server::*;
pub(crate) use codex_app_server::{
direct_game_creator_codex_chat_at, direct_game_creator_home_codex_chat,
};
use codex_cli::*;
pub(crate) use codex_cli::{
game_creator_codex_cli_executable_path, game_creator_codex_cli_version_identity,
};
pub(crate) use codex_provider_proxy::*;
pub(crate) use design_runtime::*;
pub(crate) use direct_codex_attachments::*;
pub(crate) use direct_codex_audit::*;
pub(crate) use direct_codex_references::*;
pub(crate) use direct_project_history::*;
pub(crate) use direct_project_turn_history::*;
pub(crate) use direct_runtime::*;
pub(crate) use direct_tool_bridge::*;
pub(crate) use direct_tools_mcp::*;
pub(crate) use generation::*;
pub(crate) use interaction::*;
pub(crate) use prompt::*;
pub(crate) use runtime_actions::*;
pub(crate) use runtime_adapter::*;
pub(crate) use runtime_driver::*;
pub(crate) use runtime_error::*;
pub(crate) use runtime_protocol::*;
pub(crate) use runtime_state::*;
pub(crate) use runtime_tools::*;
pub(crate) use skill_pack::*;
pub(crate) fn shutdown_game_creator_codex_app_servers() -> Result<(), String> {
shutdown_game_creator_codex_app_servers_impl()
}
/// Execute a UI editor provider request under the active Agent Runtime
/// identity. UI State remains the persistence authority; this adapter only
/// routes the semantic request through the same mode/lifecycle/retry boundary
/// used by the autonomous Agent.
pub(crate) async fn request_game_creator_ui_editor_llm_at(
root: &Path,
agent_id: &str,
run_id: &str,
operation: &str,
request: LlmRunRequest,
) -> Result<platform_llm::LlmRunResponse, String> {
let config = load_game_creator_app_config()?;
let api_kind = parse_game_creator_llm_api_kind(&config.llm.api_kind)?;
let request = request
.with_api_kind(api_kind)
.with_model(config.llm.model.clone())
.with_request_timeout_ms(config.llm.request_timeout_ms);
let request = apply_game_creator_llm_reasoning_effort(request, &config.llm)?;
let snapshot = {
let _lock = acquire_game_creator_agent_runtime_project_write_lock_with_wait(
root,
"runtime.provider_request.capture.ui_editor",
)?;
let task = read_latest_game_creator_agent_runtime_task_by_run_id(root, agent_id, run_id)?
.ok_or_else(|| {
"UI 编辑器 Provider 请求缺少当前 Agent run 的持久任务".to_string()
})?;
let runtime = read_game_creator_agent_runtime_at(root, agent_id)?.state;
capture_game_creator_agent_runtime_provider_request_snapshot_at_locked(
root,
agent_id,
&task.session_id,
run_id,
operation,
&format!("ui-editor-{operation}-{}", task.task_id),
runtime.applied_steer_cursor,
)?
};
match request_game_creator_agent_runtime_llm_with_transient_retries(
root,
&snapshot,
&config.llm,
"llm",
operation,
&request,
)
.await?
{
Some(response) => Ok(response),
None => {
Err("UI 编辑器 Provider 请求未返回结果(当前 Runtime 正在等待恢复或确认)".to_string())
}
}
}