import type { ReactNode } from "react"; import type { NodeInfo } from "../../../api"; import { NodeHealthDot } from "../../NodeHealthDot"; import type { SettingsFormState, SetSettingsForm } from "./context"; import { useTranslation } from "react-i18next"; function getNodeStatusLabel(status: "online" | "offline" | "connecting" | "error", t: ReturnType>["t"]): string { if (status === "online") return t("settings.nodeRouting.statusOnline", "Online"); if (status === "connecting") return t("settings.nodeRouting.statusConnecting", "Connecting"); if (status === "error") return t("settings.nodeRouting.statusError", "Error"); return t("settings.nodeRouting.statusOffline", "Offline"); } export interface NodeRoutingSectionProps { scopeBanner: ReactNode; form: SettingsFormState; setForm: SetSettingsForm; nodes: NodeInfo[]; } export function NodeRoutingSection({ scopeBanner, form, setForm, nodes }: NodeRoutingSectionProps) { const { t } = useTranslation("app"); return (<> {scopeBanner}

{t("settings.nodeRouting.nodeRouting", "Node Routing")}

{t("settings.nodeRouting.configureHowTasksAreRoutedToExecutionNodes", "Configure how tasks are routed to execution nodes.")}

{t("settings.nodeRouting.theseSettingsApplyAtTheProjectLevel", "These settings apply at the project level.")}

{(() => { const selectedNode = nodes.find((node) => node.id === form.defaultNodeId); if (!selectedNode) return null; return (
{t("settings.nodeRouting.selectedNode", "Selected node:")}
); })()} {t("settings.nodeRouting.usedWhenATaskHasNoNodeOverride", "Used when a task has no node override. Node status is shown for safer routing selection. No default \u2014 unset (local execution).")}
{t("settings.nodeRouting.unavailableNodePolicyHint", "Default: block execution.")}
); } export default NodeRoutingSection;