fix: self-heal broken console view (tab-closed legacy state)

This commit is contained in:
Aisland
2026-08-21 01:24:16 +08:00
parent 14c21a10bd
commit 5196d0f768
3 changed files with 37 additions and 2 deletions
+20 -1
View File
@@ -311,6 +311,11 @@ let sessionBridge: { sessions: any; conversation: any; list: any; workspaces: an
const CONSOLE_ID = 'wt-console'
const CONSOLE_ICON = '🖥️'
/** 控制室布局是否健全:主窗格首格存在 console 类型标签(旧版关标签的坏存档没有它) */
function specHasConsoleTab(spec: LayoutSpec | undefined): boolean {
return !!spec?.main?.[0]?.tabs?.some((t) => t.content?.kind === 'builtin' && t.content.type === 'console')
}
/** 控制室默认布局:单一锁死大窗格(项目卡片网格)+ 右侧对话 */
function buildConsoleSpec(t: (key: string) => string): LayoutSpec {
return {
@@ -1083,6 +1088,16 @@ function WorktableSection(props: any) {
})
}
// 自愈:启动时若控制室存档是坏布局(旧版关掉控制室标签造成窗格退化成选择器),立即重建默认面板
useEffect(() => {
const saved = projects.views[CONSOLE_ID]
if (!specHasConsoleTab(saved)) {
const spec = buildConsoleSpec((k) => t(k as WorktableKey))
persistProjects((prev) => ({ ...prev, views: { ...prev.views, [CONSOLE_ID]: spec } }))
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [projects.views[CONSOLE_ID]])
// 子座位注册变化 → 刷新 id 序列
useEffect(() => {
const sync = () => setRegisteredIds([...registryStore.ids])
@@ -1302,7 +1317,11 @@ function buildCustomLayoutPrompt(req: string): string {
/** 打开「工作台」控制室:已绑定 → 打开并切换绑定对话;explicitBound 供强制绑定流程传入刚绑定的会话 */
const openConsole = useCallback((explicitBound?: string | null) => {
const spec = projects.views[CONSOLE_ID] ?? buildConsoleSpec((k) => t(k as WorktableKey))
const saved = projects.views[CONSOLE_ID]
// 自愈:坏存档(旧版关掉控制室标签导致窗格退化成选择器)→ 重建默认面板并写回
const broken = !specHasConsoleTab(saved)
const spec = broken ? buildConsoleSpec((k) => t(k as WorktableKey)) : (saved as LayoutSpec)
if (broken) persistProjects((prev) => ({ ...prev, views: { ...prev.views, [CONSOLE_ID]: spec } }))
engineIdsRef.current.add(CONSOLE_ID)
splitStore.open(spec)
if (splitStore.active && splitStore.spec?.id === CONSOLE_ID) {