"use client"; import { useState } from "react"; import { useTranslations } from "next-intl"; import { CertStatusIcon } from "./shared/CertStatusIcon"; import { UpstreamCaField } from "./UpstreamCaField"; import { BypassListEditor } from "./BypassListEditor"; import type { AgentBridgeServerState } from "../AgentBridgePageClient"; interface AgentBridgeServerCardProps { serverState: AgentBridgeServerState; onAction: (action: "start" | "stop" | "restart" | "trust-cert" | "regenerate-cert") => Promise; onUpstreamCaSave: (path: string) => Promise; onBypassSave: (patterns: string[]) => Promise; bypassPatterns: string[]; } /** * Global server card — status + action buttons + CA field + bypass list. * Matches plan 11 §3 AgentBridge Server layout. */ export function AgentBridgeServerCard({ serverState, onAction, onUpstreamCaSave, onBypassSave, bypassPatterns, }: AgentBridgeServerCardProps) { const t = useTranslations("agentBridge"); const [loading, setLoading] = useState(null); const [expanded, setExpanded] = useState(false); const [upstreamCa, setUpstreamCa] = useState(serverState.upstreamCa ?? ""); const runAction = async (action: "start" | "stop" | "restart" | "trust-cert" | "regenerate-cert") => { setLoading(action); try { await onAction(action); } finally { setLoading(null); } }; const isRunning = serverState.running; return (
{/* Header row */}
link

{t("serverCardTitle") || "AgentBridge Server"} {isRunning ? t("statusRunning") || "Running" : t("statusStopped") || "Stopped"}

{t("serverPort") || "Port"}: {serverState.port ?? 443} {serverState.activeConns !== undefined && ( {t("serverConns") || "Connections"}: {serverState.activeConns} )} {serverState.interceptedCount !== undefined && ( {t("serverIntercepted") || "Intercepted"}: {serverState.interceptedCount.toLocaleString()} )} {serverState.lastStartedAt && ( {t("serverLastStarted") || "Last started"}:{" "} {new Date(serverState.lastStartedAt).toLocaleTimeString()} )}
{/* Action buttons */}
download {t("downloadCert") || "Download Cert"}
{/* Expanded: CA + Bypass */} {expanded && (

{t("bypassSectionTitle") || "Bypass List"}

{t("bypassSectionDesc") || "Hosts matching these patterns are tunneled directly (no TLS decryption). Defaults include banks, .gov, and corporate SSO."}

)}
); }