From 2fb2d25a6886ff0d55c666c05f6676150a7bc458 Mon Sep 17 00:00:00 2001 From: kdletters <61648117+kdletters@users.noreply.github.com> Date: Tue, 6 Oct 2026 14:31:00 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=B0=E5=BD=95=E5=89=8D=E7=AB=AF=E6=97=81?= =?UTF-8?q?=E8=B7=AF=20IPC=20=E4=B8=8E=E7=8A=B6=E6=80=81=E5=86=99=E5=85=A5?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 最近项目、全屏和 ACL 清理失败写入 WebView 诊断 补充旁路错误排障记录 --- apps/ai-game-creator-shell/src/App.tsx | 9 +++++++-- .../src/features/app-shell/aclElevation.ts | 11 ++++++++++- .../project-workspace/useElementFullscreen.ts | 19 +++++++++++++++++-- docs/project-memory/shared-memory/pitfalls.md | 2 ++ 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/apps/ai-game-creator-shell/src/App.tsx b/apps/ai-game-creator-shell/src/App.tsx index dbe32d86d..85bf40783 100644 --- a/apps/ai-game-creator-shell/src/App.tsx +++ b/apps/ai-game-creator-shell/src/App.tsx @@ -1258,8 +1258,13 @@ export function App({ setManifest(openedProject.manifest); setMessages(conversationMessages); setConversationVisibleCount(CONVERSATION_INITIAL_VISIBLE_COUNT); - void rememberRecentWorkspace(openedProject.projectPath).catch(() => { - // 最近项目是辅助投影;Rust 建项/打开结果不因偏好写入失败而回滚。 + void rememberRecentWorkspace(openedProject.projectPath).catch((error) => { + // 最近项目是辅助投影;Rust 建项/打开结果不因偏好写入失败而回滚, + // 但失败正文仍须进入诊断,不能静默丢掉本地 I/O 事实。 + appendWebviewLog('error', [ + '[AGC] 最近项目偏好写入失败', + visibleClientErrorMessage(error), + ]); }); setWorkspaceStatus(`已打开:${openedProject.projectPath}`); appendLocalPermissionLog( diff --git a/apps/ai-game-creator-shell/src/features/app-shell/aclElevation.ts b/apps/ai-game-creator-shell/src/features/app-shell/aclElevation.ts index 373ffb56a..e911bfe9a 100644 --- a/apps/ai-game-creator-shell/src/features/app-shell/aclElevation.ts +++ b/apps/ai-game-creator-shell/src/features/app-shell/aclElevation.ts @@ -1,4 +1,8 @@ import { resolveTauriInvoke } from '../../app/tauri'; +import { + appendWebviewLog, + visibleClientErrorMessage, +} from '../../services/errorReporting'; /** * 用户主动操作(打开/新建项目、选择目录、重命名刷新)时调用:解除 Rust 侧的 ACL 提权拒绝记忆。 @@ -16,7 +20,12 @@ export function clearAclElevationDenials() { return; } try { - void invoke('clear_game_creator_acl_elevation_denials').catch(() => {}); + void invoke('clear_game_creator_acl_elevation_denials').catch((error) => { + appendWebviewLog('error', [ + '[AGC] 清理 ACL 提权拒绝记忆失败', + visibleClientErrorMessage(error), + ]); + }); } catch { // 命令缺失等同步异常同样不影响本次操作:这只是一次旁路清零。 } diff --git a/apps/ai-game-creator-shell/src/features/project-workspace/useElementFullscreen.ts b/apps/ai-game-creator-shell/src/features/project-workspace/useElementFullscreen.ts index 2235ebb5d..d041ded4c 100644 --- a/apps/ai-game-creator-shell/src/features/project-workspace/useElementFullscreen.ts +++ b/apps/ai-game-creator-shell/src/features/project-workspace/useElementFullscreen.ts @@ -6,6 +6,11 @@ import { useState, } from 'react'; +import { + appendWebviewLog, + visibleClientErrorMessage, +} from '../../services/errorReporting'; + export type ElementFullscreenController = { /** 要全屏的那一格;挂在它的 `ref` 上。 */ ref: RefObject; @@ -63,12 +68,22 @@ export function useElementFullscreen< // 已经有人在全屏(本元素,或页面里别的东西)时这一步只负责退出:退出本身幂等, // 不需要先判断当前全屏的是不是自己。 if (ownerDocument.fullscreenElement) { - void ownerDocument.exitFullscreen?.()?.catch(() => {}); + void ownerDocument.exitFullscreen?.()?.catch((error) => { + appendWebviewLog('error', [ + '[AGC] 退出预览全屏失败', + visibleClientErrorMessage(error), + ]); + }); return; } // 失败(用户手势丢失、权限策略拒绝)不改按钮状态,界面回到「还是没全屏」的原样; // 拒绝的 Promise 必须接住,否则会冒成未处理拒绝。 - void element.requestFullscreen?.()?.catch(() => {}); + void element.requestFullscreen?.()?.catch((error) => { + appendWebviewLog('error', [ + '[AGC] 进入预览全屏失败', + visibleClientErrorMessage(error), + ]); + }); }, []); return { ref: elementRef, isFullscreen, isSupported, toggleFullscreen }; diff --git a/docs/project-memory/shared-memory/pitfalls.md b/docs/project-memory/shared-memory/pitfalls.md index 09d829f3e..9dc05111d 100644 --- a/docs/project-memory/shared-memory/pitfalls.md +++ b/docs/project-memory/shared-memory/pitfalls.md @@ -38,6 +38,8 @@ Direct 的 Tauri 进度、活动回合和 manifest 事件不能忽略 `app.emit` 更新安装完成后的 `restart_agc_app` 失败也必须写入诊断;安装已启动但重启 IPC 失败时,不能让用户只看到“下载完成”后客户端继续停留在旧进程。 +最近项目偏好写入、全屏 API、ACL 拒绝记忆清理等旁路操作也要记录失败正文;它们不阻断主操作,但静默吞错会让本地状态、权限冷却或预览状态无法解释。 + `WindowChrome.test.tsx` 当前没有在用例间清理挂载的 `WindowChrome`,多用例运行会出现重复标题和重复窗口按钮;这属于测试隔离问题,不能把它误判成窗口 IPC 行为回归。 ## 2026-10-03 AGC 随包 plugins 的 feature 档位必须与消费方一致,且门禁会因 build.rs 未重跑而假通过