// CxLLMSidebar — sidebar navigation for the CxLLM module surface, alongside the WebView. // Phase 4 wiring: each section imports its CxLLM-SDK module and renders a status card. // Real per-module UI lands in Phase 3. import SwiftUI import CxCode import CxAWS import CxGit import CxAgent import CxMCP import CxModels import CxChat import CxInstrument import CxLangBridge enum SidebarItem: String, Identifiable, CaseIterable, Hashable { case web = "Web" case chat = "Chat" case agent = "Agent" case mcp = "MCP" case models = "Models" case code = "Code" case aws = "AWS" case git = "Git" case bridge = "LangBridge" case telemetry = "Telemetry" var id: String { rawValue } var systemImage: String { switch self { case .web: return "globe" case .chat: return "bubble.left.and.bubble.right" case .agent: return "person.crop.square.filled.and.at.rectangle" case .mcp: return "antenna.radiowaves.left.and.right" case .models: return "cube.transparent" case .code: return "chevron.left.forwardslash.chevron.right" case .aws: return "cloud" case .git: return "arrow.triangle.branch" case .bridge: return "link" case .telemetry: return "waveform.path.ecg" } } } struct CxLLMSectionView: View { let item: SidebarItem var body: some View { VStack(alignment: .leading, spacing: 16) { Label(item.rawValue, systemImage: item.systemImage) .font(.title) Divider() switch item { case .chat: moduleCard(name: "CxChat", version: "seed") case .agent: moduleCard(name: "CxAgent", version: "seed") case .mcp: moduleCard(name: "CxMCP", version: "seed") case .models: moduleCard(name: "CxModels", version: "seed") case .code: moduleCard(name: "CxCode", version: "seed") case .aws: moduleCard(name: "CxAWS", version: "seed") case .git: moduleCard(name: "CxGit", version: "seed") case .bridge: moduleCard(name: "CxLangBridge", version: "seed") case .telemetry: moduleCard(name: "CxInstrument", version: "seed") case .web: EmptyView() } Spacer() } .padding(24) .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) } @ViewBuilder private func moduleCard(name: String, version: String) -> some View { VStack(alignment: .leading, spacing: 8) { Text(name).font(.headline) Text("Imported from CxLLM-SDK. Phase 3 will replace this card with the real UI surface.") .font(.callout).foregroundStyle(.secondary) HStack(spacing: 12) { Text("module").font(.caption2).foregroundStyle(.tertiary) Text(name).font(.caption.monospaced()) Text("•").font(.caption2).foregroundStyle(.tertiary) Text("v\(version)").font(.caption.monospaced()) } .padding(.top, 4) } .padding(16) .background(.quaternary.opacity(0.4), in: RoundedRectangle(cornerRadius: 10)) } }