diff --git a/apps/ai-game-creator-shell/scripts/smoke-agent-run-local-provider.mjs b/apps/ai-game-creator-shell/scripts/smoke-agent-run-local-provider.mjs
index b2ddbac7b..e8a78f9f1 100644
--- a/apps/ai-game-creator-shell/scripts/smoke-agent-run-local-provider.mjs
+++ b/apps/ai-game-creator-shell/scripts/smoke-agent-run-local-provider.mjs
@@ -722,7 +722,7 @@ function runAgent() {
stderr += chunk.toString();
});
child.on('error', reject);
- child.on('close', (code) => {
+ child.on('close', (code, signal) => {
const output = `${stdout}${stderr}`;
if (previewReadError) {
reject(previewReadError);
@@ -740,13 +740,24 @@ function runAgent() {
previewDom,
});
} else {
- reject(new Error(output || `agent run exited with ${code}`));
+ reject(
+ new Error(
+ `agent run failed: exitCode=${code}, signal=${signal ?? 'none'}\n` +
+ `stderr tail (last 8000 characters):\n${stderr.slice(-8000)}\n` +
+ `stdout tail (last 4000 characters):\n${stdout.slice(-4000)}`,
+ ),
+ );
}
});
});
}
async function seedLocalAsset() {
+ await fs.mkdir(path.join(projectRoot, 'game'), { recursive: true });
+ await fs.writeFile(
+ path.join(projectRoot, 'game/index.html'),
+ '
还没有生成游戏',
+ );
await fs.mkdir(path.join(projectRoot, 'assets/uploads'), { recursive: true });
await fs.mkdir(path.join(projectRoot, '.agent'), { recursive: true });
await seedConversationContext();
diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/direct_runtime.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/direct_runtime.rs
index e7974ba25..d40b85804 100644
--- a/apps/ai-game-creator-shell/src-tauri/src/agent/direct_runtime.rs
+++ b/apps/ai-game-creator-shell/src-tauri/src/agent/direct_runtime.rs
@@ -4710,10 +4710,10 @@ mod tests {
assert!(!prompt.contains("你是 Codex"));
assert!(prompt.contains("不要等待 Supervisor"));
assert!(prompt.contains("提示词与技能"));
- assert!(prompt.contains("AGC 工程合同(仅说明项目边界,不是流程门槛)"));
+ assert!(prompt.contains("AGC 工程合同:当前 cwd 是用户选择的项目目录"));
assert!(prompt.contains("客户端扩展列表中用户已启用的第三方 MCP"));
assert!(prompt.contains("用户明确指定第三方 MCP Server 或工具时"));
- assert!(prompt.contains("先按需读取当前 cwd 下适用的 `AGENTS.md`"));
+ assert!(prompt.contains("先读取当前 cwd 下适用的 AGENTS.md、README 或项目说明"));
assert!(prompt.contains("agc_write_file"));
assert!(prompt.contains("content 必须是目标文件的完整原始 UTF-8 正文"));
assert!(prompt.contains("不得把 command.exec 的 Exit code、Wall time、Output 包装"));
diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/generation.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/generation.rs
index 8d3977878..a83b6dba4 100644
--- a/apps/ai-game-creator-shell/src-tauri/src/agent/generation.rs
+++ b/apps/ai-game-creator-shell/src-tauri/src/agent/generation.rs
@@ -27,8 +27,9 @@ pub(in crate::agent) use canvas_generation::{
commit_prepared_platform_art_asset_at, commit_prepared_platform_art_asset_strict_slices_at,
generate_platform_art_asset_with_retained_runtime_options_at,
generate_platform_art_asset_with_runtime_options_at,
- platform_art_generation_error_result_unknown, register_existing_platform_art_slices_at,
- request_platform_art_asset_with_runtime_options_at, restore_platform_art_asset_bytes_at,
+ platform_art_generation_error_result_unknown, recover_persisted_visual_generation_options,
+ register_existing_platform_art_slices_at, request_platform_art_asset_with_runtime_options_at,
+ restore_platform_art_asset_bytes_at,
retained_platform_art_generation_runtime_spritesheet_identity_at,
retained_platform_art_generation_runtime_state_matches_direct_stage_at,
validate_platform_art_png_bytes_with_limits,
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 0e7a97084..8d098b8e6 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
@@ -429,6 +429,87 @@ impl Default for PlatformArtAssetGenerationOptions {
}
}
+pub(in crate::agent) fn recover_persisted_visual_generation_options(
+ root: &Path,
+ pending: &AgentRuntimePendingToolAction,
+ prompt: &str,
+ requested: &PlatformArtAssetGenerationOptions,
+) -> Result