diff --git a/apps/ai-game-creator-shell/src-tauri/src/project/resource_editor.rs b/apps/ai-game-creator-shell/src-tauri/src/project/resource_editor.rs
index 4317d10e3..145330f56 100644
--- a/apps/ai-game-creator-shell/src-tauri/src/project/resource_editor.rs
+++ b/apps/ai-game-creator-shell/src-tauri/src/project/resource_editor.rs
@@ -1415,7 +1415,7 @@ fn resolve_resource_edit_source(
| LocalProjectResourceEditKind::BackgroundRemoval
if !lower_media_type.starts_with("image/") =>
{
- return Err("图片参考编辑只能用于图片资源".to_string());
+ return Err("此操作只能用于图片资源".to_string());
}
_ => {}
}
diff --git a/apps/ai-game-creator-shell/src/view/project-development/index.tsx b/apps/ai-game-creator-shell/src/view/project-development/index.tsx
index a34a3be64..32f97425b 100644
--- a/apps/ai-game-creator-shell/src/view/project-development/index.tsx
+++ b/apps/ai-game-creator-shell/src/view/project-development/index.tsx
@@ -463,9 +463,20 @@ type ResourceEditServiceIdentityConfirmation = {
expiresAt: number;
};
-function pendingResourceEditKindLabel(editKind: string) {
+function pendingResourceEditKindLabel({
+ editKind,
+ backgroundMode,
+ screenColor,
+}: PendingLocalProjectResourceEdit) {
if (editKind === 'image') return '图片编辑';
- if (editKind === 'background-removal') return '图片抠图';
+ if (editKind === 'background-removal') {
+ if (backgroundMode === 'complex') return '图片抠图 · 复杂背景';
+ if (backgroundMode === 'flat') {
+ const color = screenColor === 'auto' ? '自动背景色' : screenColor;
+ return `图片抠图 · 平面背景${color ? ` · ${color}` : ''}`;
+ }
+ return '图片抠图';
+ }
if (editKind === 'text') return '文本编辑';
if (editKind === 'agent-result') return '智能体结果编辑';
return '资源编辑';
@@ -9111,7 +9122,7 @@ export default function ProjectDevelopmentView({
{pending.assetName}
- {pendingResourceEditKindLabel(pending.editKind)} ·{' '}
+ {pendingResourceEditKindLabel(pending)} ·{' '}
{pendingResourceEditCreatedAtLabel(pending.createdAt)}
diff --git a/apps/ai-game-creator-shell/tests/projectResourceLiveIntegration.test.tsx b/apps/ai-game-creator-shell/tests/projectResourceLiveIntegration.test.tsx
index 48938bee7..175b58953 100644
--- a/apps/ai-game-creator-shell/tests/projectResourceLiveIntegration.test.tsx
+++ b/apps/ai-game-creator-shell/tests/projectResourceLiveIntegration.test.tsx
@@ -109,6 +109,8 @@ type PendingResourceEditFixture = {
editKind: string;
sourceResourceId: string;
assetName: string;
+ backgroundMode?: string | null;
+ screenColor?: string | null;
phase: string;
createdAt: number;
};
@@ -1294,6 +1296,42 @@ describe('project resource live canvas integration', () => {
});
});
+ it('恢复面板显示同名抠图的模式和颜色,缺失字段不推断默认值', async () => {
+ installTauri({
+ pendingResourceEdits: [
+ { backgroundMode: 'complex' },
+ { backgroundMode: 'flat', screenColor: 'auto' },
+ { backgroundMode: 'flat', screenColor: '#AABBCC' },
+ { backgroundMode: 'flat' },
+ {},
+ ].map((options, index) => ({
+ operationId: `background-${index}`,
+ editKind: 'background-removal',
+ sourceResourceId: 'source-art',
+ assetName: '透明底',
+ phase: 'accepted',
+ createdAt: 1,
+ ...options,
+ })),
+ });
+ render();
+ fireEvent.click(
+ await screen.findByRole('button', { name: '管理未完成编辑 (5)' }),
+ );
+ const labels = screen
+ .getAllByText('透明底')
+ .map((name) => name.nextElementSibling?.textContent);
+ expect(
+ labels.map((label) => label?.split(' · ').slice(0, -1).join(' · ')),
+ ).toEqual([
+ '图片抠图 · 复杂背景',
+ '图片抠图 · 平面背景 · 自动背景色',
+ '图片抠图 · 平面背景 · #AABBCC',
+ '图片抠图 · 平面背景',
+ '图片抠图',
+ ]);
+ });
+
it('恢复面板可跳过首条失败任务继续任意 operation,且对账项不会被重放', async () => {
const failedOperationId = '11111111-1111-4111-8111-111111111111';
const resumableOperationId = '22222222-2222-4222-8222-222222222222';
diff --git a/docs/project-memory/shared-memory/decision-log.md b/docs/project-memory/shared-memory/decision-log.md
index f003b5be3..d61481bb8 100644
--- a/docs/project-memory/shared-memory/decision-log.md
+++ b/docs/project-memory/shared-memory/decision-log.md
@@ -8205,7 +8205,7 @@ CI 上 `background_agent_runtime_recovers_stale_running_before_pending_task` 在
## 2026-08-24 AGC Direct 抠图语义工具
- 决策:将抠图能力通过 `agc_remove_background` 加入受控 `agc_tools`。工具只接受当前 manifest 的图片 `sourceLocalAssetId` 与结果名称;普通登录态使用账号鉴权的 `/api/editor/images/background-removals`,ExternalDeveloper 模式使用 External v1 `/api/external/v1/editor/images/background-removals`。客户端负责正式 resourceId、画布/素材目录、稳定 operation/idempotency 身份、权限和错误脱敏,不向 Codex 暴露内部 BgFilter worker、凭据或任意 API。
-- 约束:异步结果只投影有界队列状态,不允许模型自行构造源 URL 或在不确定提交后更换请求身份;两种路由都接收客户端稳定幂等身份,External v1 继续负责 API Key、幂等接收与统一 operation 查询,客户端不得绕过该契约。
+- 约束:异步结果与恢复语义以本文「2026-09-17 AGC 抠图接入本地资源编辑恢复闭环」决策为准。不允许模型自行构造源 URL 或在不确定提交后更换请求身份;两种路由都接收客户端稳定幂等身份,External v1 继续负责 API Key、幂等接收与统一 operation 查询,客户端不得绕过该契约。
## 2026-08-24 资源详情动作、空态滚动与最终图多步恢复
@@ -8864,3 +8864,4 @@ CI 上 `background_agent_runtime_recovers_stale_running_before_pending_task` 在
- 决策:抠图作为 `LocalProjectResourceEditKind::BackgroundRemoval` 接入现有资源编辑账本,模式和背景色写入 operation 身份;提交后复用同一套轮询、结果下载、staging、manifest 提交和恢复逻辑。已有账本优先恢复,禁止在未知结果时换 operation/idempotency 重发。
- 边界:主站异步队列、BgFilter 和 SpacetimeDB schema 不变;Agent 只获得本地完成资源和安全身份投影,不接触内部 worker 或凭据。
- 恢复:已受理任务中断后按原 operation 续查;提交结果不确定时保留账本并人工对账。升级前无账本的 queued 回执不自动迁移或重发,已有远端成果通过正式素材导入恢复。
+- 展示:恢复面板按账本显示抠图模式,平面背景模式同时显示已记录的自动背景色或颜色值,缺失字段不推断默认值,帮助区分同名待处理任务。
diff --git a/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md b/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md
index 7ec33d686..ea98b88be 100644
--- a/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md
+++ b/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md
@@ -12,6 +12,7 @@
## 资源画布交互与工作台状态同步
+- 未完成抠图的恢复项在现有类型行显示账本中的复杂/平面背景模式;平面模式显示已记录的自动背景色或颜色值,缺失模式/颜色不补默认值,恢复仍按原 operation 身份执行。
- 活动回合初始空快照、首次成功读取的空结果及禁用后的空态保持同一数组引用;快照签名初值与空态重置值均为 `[]`。无原生 invoke 的窗口测试只期待首次状态发布,异步空结果测试显式控制请求完成,不以初始空数组作为请求已完成的证据。
- 工作台向窗口标题栏发布正在运行的项目时,输入未变化不得形成重复发布与清理的渲染循环;打开项目动作始终使用当前工作台处理逻辑,退出工作台后清除其标题栏状态。
- 资源子画布(含「所有资源」)保留空白处左键框选、资源卡左键选中/拖动、触摸板双指平移及捏合缩放;右键按住空白处或资源卡拖动时平移画布,不改变资源选择与布局。中键和空格抓手继续可用。总览保留既有左键平移,并支持右键平移。