AGC 窗口标题栏项目标签显示的是「正在运行的项目」而不是当前项目:当前项目未跑回合时标签被别的项目顶掉 #618

Closed
opened 2026-10-04 17:30:55 +08:00 by suzmii · 0 comments
Member

现象

AGC 客户端窗口标题栏中央那枚项目标签,展示的不是当前打开的项目,而是「正在运行的项目」里最晚启动的那一个。

现场(截图):

位置 实际值
当前打开的项目(工作台右侧对话头「已打开:」) gameagent-ff7f3240,对话不忙(当前项目没有在跑回合)
标题栏标签 gameagent-c3af9c7e(后台另一个项目在跑回合)

标签里没有任何"当前项目是谁"的信息,用户据此误判成"项目版本两边不一样,而且两个都是随机生成的"。

附带的口径差异让这件事更难看懂:同一个项目有回合在跑时标签显示目录名(gameagent-xxxxxxxx),没回合在跑时标签显示清单项目名(如「飞鸟 v2」)。

与 #613「优化 AGC 标题栏布局」不是同一处:#613 是工作台工具条(资源管理/运行/…那一行)的排版,本 issue 是窗口标题栏中央项目标签的语义。

原因(链路,从下往上)

  1. apps/ai-game-creator-shell/src/components/WindowChrome.tsx:174-196:只要 activeProjectRuns.activeTurns.length > 0 || readFailed,标题栏就整块换成 ActiveProjectRunsPanel,当前工作区名 window-chrome__title(title = currentProjectContext.projectName)被替换掉 —— 当前项目名从此不再出现在标签上。
  2. apps/ai-game-creator-shell/src/features/app-shell/ActiveProjectRunsPanel.tsx:118-155(placement="titlebar" 分支):按 startedAt 升序取最后一个(最晚启动)作为标签主文案,与"当前打开的是哪个项目"完全无关。
  3. ActiveProjectRunsPanel.tsx:53-56 的 activeTurnDisplayName = turn.projectName || projectNameFromPath(turn.projectPath);而 Rust 侧 src-tauri/src/agent/thread_manager/mod.rs:513-518 登记回合时 project_name 取的是 thread_id 的目录名,所以只要有回合在跑就一定命中目录名分支(projectNameFromPath 回落实际是死代码)→ 运行态标签恒为 gameagent-xxxxxxxx。
  4. 空闲态走 apps/ai-game-creator-shell/src/features/app-shell/WorkspaceLauncher.tsx:203-208 写入的 title(currentProjectContext.projectName,即清单项目名,useHomeProjectCreation.ts:1103)→ 与第 3 条的运行态口径不一致。
  5. 当前项目在展开菜单里只靠 aria-current 属性高亮(ActiveProjectRunsPanel.tsx:172-183),没有文字;当前项目压根不在运行列表里时,标签和菜单都给不出"我是谁"。
  6. readFailed 分支(ActiveProjectRunsPanel.tsx:96-102)同样整块顶掉当前项目名,显示「正在运行的项目读取失败」。

触发条件:当前项目没有在跑回合、而别的项目有(或运行快照读取失败)。当前项目自己在跑时看不出"少了一个项目",但标签文案会从项目名变成目录名。

打算怎么改

  1. 标签主文案恒为当前项目:进入项目后,标题栏标签主文案始终是当前项目名,与当前项目是否在跑回合无关;不在项目内(首页 / 项目组 / 模板库)时才回落到"正在运行的项目"语义(没有运行项目就不渲染,同现状)。
  2. 运行态降级为附加信息,不再抢主文案:标签上保留运行圆点 + 运行中数量徽标;当前项目自己在跑时圆点呈忙碌态。
  3. 展开菜单仍是「正在运行的项目」列表;当前项目那一行补文字「当前」标记(aria-current 保留)。
  4. readFailed 不再整块替换标签:标签保留当前项目名,读取失败降级为圆点告警 + 菜单内一行「正在运行的项目读取失败」(ActiveProjectRunsPanel 的 panel 形态提示文案不变)。
  5. 命名口径统一:运行中的项目名优先取清单项目名(commands.rs:624 的 game_creator_project_name(root) 已有实现),读不到再回落目录名;保证同一项目"在跑 / 不跑"标签文字一致。

验收判据

  • 进入项目 A(A 不跑回合),后台项目 B 有回合在跑:标签显示 A 的项目名;徽标显示运行中数量;展开菜单能看到 B 并可点进去。
  • 项目 A 自己在跑:标签仍是 A 的项目名,圆点为忙碌态;菜单里 A 带「当前」。
  • 不在项目内且没有运行项目:标签与现状一致(创作工作台 / 最近启动的运行项目)。
  • 运行快照读取失败:标签保留当前项目名,菜单里给出读取失败提示。
  • 定向用例补齐:tests/directActiveTurns.test.tsx 的 titlebar 用例增加「当前项目未运行 + 别的项目在跑」;WindowChrome 分支增加「有运行项目时当前项目名不消失」。
  • npm run typecheck / eslint / npm run check:encoding / AGC 全量用例通过。

范围

只改 AGC 壳前端(src/components/WindowChrome.tsx、src/features/app-shell/ActiveProjectRunsPanel.tsx、WorkspaceLauncher.tsx 接线、styles.css)+ 定向用例;若采纳第 5 条命名口径统一,Rust 侧只改 agent/thread_manager/mod.rs 登记回合时的 project_name 取值与对应单测。不改后端 HTTP 契约、OpenAPI 与 SpacetimeDB。

## 现象 AGC 客户端**窗口标题栏中央**那枚项目标签,展示的不是**当前打开的项目**,而是「正在运行的项目」里**最晚启动的那一个**。 现场(截图): | 位置 | 实际值 | | --- | --- | | 当前打开的项目(工作台右侧对话头「已打开:」) | `gameagent-ff7f3240`,对话不忙(当前项目没有在跑回合) | | 标题栏标签 | `gameagent-c3af9c7e`(后台另一个项目在跑回合) | 标签里没有任何"当前项目是谁"的信息,用户据此误判成"项目版本两边不一样,而且两个都是随机生成的"。 附带的口径差异让这件事更难看懂:同一个项目**有回合在跑**时标签显示**目录名**(`gameagent-xxxxxxxx`),**没回合在跑**时标签显示**清单项目名**(如「飞鸟 v2」)。 > 与 #613「优化 AGC 标题栏布局」不是同一处:#613 是工作台工具条(资源管理/运行/…那一行)的排版,本 issue 是**窗口标题栏**中央项目标签的**语义**。 ## 原因(链路,从下往上) 1. `apps/ai-game-creator-shell/src/components/WindowChrome.tsx:174-196`:只要 `activeProjectRuns.activeTurns.length > 0 || readFailed`,标题栏就**整块换成** `ActiveProjectRunsPanel`,当前工作区名 `window-chrome__title`(`title = currentProjectContext.projectName`)被替换掉 —— **当前项目名从此不再出现在标签上**。 2. `apps/ai-game-creator-shell/src/features/app-shell/ActiveProjectRunsPanel.tsx:118-155`(`placement="titlebar"` 分支):按 `startedAt` 升序取**最后一个**(最晚启动)作为标签主文案,与"当前打开的是哪个项目"完全无关。 3. `ActiveProjectRunsPanel.tsx:53-56` 的 `activeTurnDisplayName` = `turn.projectName || projectNameFromPath(turn.projectPath)`;而 Rust 侧 `src-tauri/src/agent/thread_manager/mod.rs:513-518` 登记回合时 `project_name` 取的是 `thread_id` 的**目录名**,所以只要有回合在跑就一定命中目录名分支(`projectNameFromPath` 回落实际是死代码)→ 运行态标签恒为 `gameagent-xxxxxxxx`。 4. 空闲态走 `apps/ai-game-creator-shell/src/features/app-shell/WorkspaceLauncher.tsx:203-208` 写入的 `title`(`currentProjectContext.projectName`,即清单项目名,`useHomeProjectCreation.ts:1103`)→ 与第 3 条的运行态口径不一致。 5. 当前项目在展开菜单里只靠 `aria-current` 属性高亮(`ActiveProjectRunsPanel.tsx:172-183`),**没有文字**;当前项目压根不在运行列表里时,标签和菜单都给不出"我是谁"。 6. `readFailed` 分支(`ActiveProjectRunsPanel.tsx:96-102`)同样整块顶掉当前项目名,显示「正在运行的项目读取失败」。 触发条件:**当前项目没有在跑回合、而别的项目有**(或运行快照读取失败)。当前项目自己在跑时看不出"少了一个项目",但标签文案会从项目名变成目录名。 ## 打算怎么改 1. **标签主文案恒为当前项目**:进入项目后,标题栏标签主文案始终是当前项目名,与当前项目是否在跑回合无关;不在项目内(首页 / 项目组 / 模板库)时才回落到"正在运行的项目"语义(没有运行项目就不渲染,同现状)。 2. **运行态降级为附加信息**,不再抢主文案:标签上保留运行圆点 + 运行中数量徽标;当前项目自己在跑时圆点呈忙碌态。 3. 展开菜单仍是「正在运行的项目」列表;当前项目那一行补文字「当前」标记(`aria-current` 保留)。 4. **`readFailed` 不再整块替换标签**:标签保留当前项目名,读取失败降级为圆点告警 + 菜单内一行「正在运行的项目读取失败」(`ActiveProjectRunsPanel` 的 panel 形态提示文案不变)。 5. **命名口径统一**:运行中的项目名优先取清单项目名(`commands.rs:624` 的 `game_creator_project_name(root)` 已有实现),读不到再回落目录名;保证同一项目"在跑 / 不跑"标签文字一致。 ## 验收判据 - 进入项目 A(A 不跑回合),后台项目 B 有回合在跑:标签显示 **A 的项目名**;徽标显示运行中数量;展开菜单能看到 B 并可点进去。 - 项目 A 自己在跑:标签仍是 A 的项目名,圆点为忙碌态;菜单里 A 带「当前」。 - 不在项目内且没有运行项目:标签与现状一致(`创作工作台` / 最近启动的运行项目)。 - 运行快照读取失败:标签保留当前项目名,菜单里给出读取失败提示。 - 定向用例补齐:`tests/directActiveTurns.test.tsx` 的 titlebar 用例增加「当前项目未运行 + 别的项目在跑」;WindowChrome 分支增加「有运行项目时当前项目名不消失」。 - `npm run typecheck` / eslint / `npm run check:encoding` / AGC 全量用例通过。 ## 范围 只改 AGC 壳前端(`src/components/WindowChrome.tsx`、`src/features/app-shell/ActiveProjectRunsPanel.tsx`、`WorkspaceLauncher.tsx` 接线、`styles.css`)+ 定向用例;若采纳第 5 条命名口径统一,Rust 侧只改 `agent/thread_manager/mod.rs` 登记回合时的 `project_name` 取值与对应单测。不改后端 HTTP 契约、OpenAPI 与 SpacetimeDB。
suzmii added the Kind/Bug
Priority
Medium
3
labels 2026-10-04 17:30:55 +08:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: GenarrativeAI/Genarrative#618