import { useEffect, useReducer, useState, type ReactNode } from "react"; import { blankConnection, ConnectionCenter, ConnectionEditor, MemoryMockConnectionAdapter } from "./features/connections"; import { ArtifactsPage, AuditPage, EventsPage, OverviewPage, SessionDetailPage, TasksPage } from "./features/workbench"; import { createSessionTableViewState, SessionQueryIntent, SessionTable } from "./SessionTable"; import { demoSessions } from "./protocol/fixtures"; import { initializeSessionTableStates, updateSessionTableState } from "./sessionTableState"; import { toSessionRow } from "./sessionPresentation"; import { WorkspaceLayout } from "./shell"; import { Dialog, Toast } from "./ui"; import { createInitialWorkspaceState, selectActiveTab, selectActiveWorkspace, workspaceReducer } from "./workspace"; const fixtureNow = new Date("2026-08-03T19:12:02Z"); const sessions = demoSessions.map((session, index) => ({ ...toSessionRow(session, fixtureNow), capabilities: index === 0 ? ["session.processes", "session.files"] : [] })); const connectionAdapter = new MemoryMockConnectionAdapter(); export function App() { useEffect(() => { const disableNativeMenu = (event: globalThis.MouseEvent) => event.preventDefault(); document.addEventListener("contextmenu", disableNativeMenu); return () => document.removeEventListener("contextmenu", disableNativeMenu); }, []); const [workspace, dispatch] = useReducer(workspaceReducer, undefined, createInitialWorkspaceState); const [tableStates, setTableStates] = useState(() => initializeSessionTableStates(workspace.serverOrder)); const [lastQueryIntent, setLastQueryIntent] = useState>({}); const [addOpen, setAddOpen] = useState(false); const [connectionAddresses, setConnectionAddresses] = useState([]); const [notice, setNotice] = useState(""); const server = selectActiveWorkspace(workspace); const activeTab = selectActiveTab(server); const tableState = { ...(tableStates[server.id] ?? createSessionTableViewState()), filter: server.filter }; const navigate = (page: string) => { const title = page === "Sessions" ? "Sessions" : page; dispatch({ type: "navigate", serverId: server.id, project: server.activeProject, navigation: page }); dispatch({ type: "openTab", serverId: server.id, tab: { id: `${server.activeProject.toLowerCase()}-${page.toLowerCase().replaceAll(" ", "-")}`, title, context: { serverId: server.id, project: server.activeProject, session: "Project" } } }); }; const sessionsPage = <>

Sessions

{activeTab.context.project} 中的 248 个 Session · 4 个实时更新

演示数据 · 内存 adapter · 未连接真实 Teamserver

{ if (state.filter !== server.filter) dispatch({ type: "setFilter", serverId: server.id, filter: state.filter }); setTableStates((current) => updateSessionTableState(current, server.id, state)); }} onOpenSession={(session) => dispatch({ type: "openTab", serverId: server.id, tab: { id: `${server.id}-${activeTab.context.project}-${session.id}-overview`, title: "Session Overview", context: { serverId: server.id, project: activeTab.context.project, session: session.id } } })} onOpenOperation={(session, operation) => dispatch({ type: "openTab", serverId: server.id, tab: { id: `${server.id}-${activeTab.context.project}-${session.id}-${operation}`, title: operation === "processes" ? "进程" : operation === "files" ? "文件" : "打开操作", context: { serverId: server.id, project: activeTab.context.project, session: session.id }, dirty: operation === "operation" } })} onQueryIntent={(intent) => setLastQueryIntent((current) => ({ ...current, [server.id]: intent }))} />{lastQueryIntent[server.id] ? `查询意图:${lastQueryIntent[server.id]?.type}` : "等待服务端查询意图"}; const pages: Record = { Overview: , Sessions: sessionsPage, "Session Overview": , Tasks: , "Task Output": , Events: , Artifacts: , Audit: , "连接中心": }; const operationBoundary = ["进程", "文件", "打开操作"].includes(activeTab.title) ?

{activeTab.title}

{activeTab.context.serverId} / {activeTab.context.project} / {activeTab.context.session}

Mock 界面边界:需要真实 Teamserver adapter 才能执行或读取数据。

: undefined; return <> workspace.servers[id])} server={server} activeTab={activeTab} activePage={server.navigation} onNavigate={navigate} onSwitchServer={(serverId) => dispatch({ type: "switchServer", serverId })} onAddServer={() => setAddOpen(true)} onActivateTab={(tabId) => dispatch({ type: "activateTab", serverId: server.id, tabId })} onCloseTab={(tabId) => dispatch({ type: "closeTab", serverId: server.id, tabId })} onTogglePin={(tabId) => dispatch({ type: "togglePinTab", serverId: server.id, tabId })}>
{pages[activeTab.title] ?? operationBoundary ?? }
setAddOpen(false)} onSave={async (config) => { await connectionAdapter.save(config); setConnectionAddresses((current) => [...current, config.address.trim()]); const tab = { id: `${config.id}-connections`, title: "连接中心", context: { serverId: config.id, project: "尚未选择 Project", session: "Project" } }; dispatch({ type: "addServer", server: { id: config.id, name: config.name, shortName: config.name.trim().slice(0, 2).toUpperCase(), connection: "DEGRADED", unread: 0, activeProject: "尚未选择 Project", navigation: "连接中心", filter: "", activeTabId: tab.id, tabs: [tab] } }); setAddOpen(false); setNotice("连接配置已创建,尚未建立真实连接。"); }} />{notice && setNotice("")}>{notice}}; }