// 工作区弹层(提案 T4/D25):深读经 OverlayHost 单层呈现。 // 服务端声明的工作区(领域插件槽位)对所有用户可见;插件管理面板仍只在系统管理区。 // 文件浏览已并入第三栏「文件」入口,本弹层只承载代理与领域工作区。 import { store, useStore } from '../store' import type { Run } from '../contracts' import { OverlayHost, type DocBridge } from '@ui' import { docBridge } from './Workbench' import { AgentRow } from './Workbench' import { buildWorkspaceEntries, type WorkspaceEntry } from '../workspaces' import { RdmAuditWorkspace } from './RdmAuditWorkspace' /** 体系工具(顺序即 ⌘ 序号)。服务端工作区全员可见;插件管理面板只在系统管理区。 */ export function workspaceEntries(): WorkspaceEntry[] { return buildWorkspaceEntries(store.getState().serverWorkspaces) } export function Workspaces() { const active = useStore(s => s.ui.activeWorkspace) const runs = useStore(s => s.runs) const pluginPanels = useStore(s => s.pluginPanels) const serverWorkspaces = useStore(s => s.serverWorkspaces) if (!active) return null const entry = workspaceEntries().find(e => e.key === active) const close = () => store.closeWorkspace() if (active === 'agents') { const convRuns = runs.filter(r => r.kind !== 'tool') return } if (active === 'rdm-audit') { return } if (active.startsWith('plugin:')) { const panel = pluginPanels.find(p => `plugin:${p.id}` === active) return store.refreshPlugins()} /> } if (active.startsWith('ws:')) { const ws = serverWorkspaces.find(w => `ws:${w.id}` === active) const title = ws?.title ?? '工作区' return store.refreshPlugins()} /> } return null } /** 代理面板(任务树;点击进 AgentTracker 深读)。 */ export function AgentsPanel({ runs }: { runs: Run[] }) { if (runs.length === 0) return 暂无运行——多代理任务会在此形成任务树(mock:#agents) const roots = runs.filter(r => !r.parentRunId) return {roots.map(r => ( {runs.filter(c => c.parentRunId === r.id).map(c => )} ))} } /** ⌘1–9 / Ctrl+1–9 全局快捷键(挂载于 App)。 */ export function workspaceShortcuts(e: KeyboardEvent) { if (!(e.metaKey || e.ctrlKey)) return const n = parseInt(e.key, 10) if (!Number.isInteger(n) || n < 1 || n > 9) return const entries = workspaceEntries() const hit = entries[n - 1] if (!hit) return e.preventDefault() store.openWorkspace(hit.key) }