"use client"; import { useState } from "react"; import type { TFunction } from "i18next"; import { useTranslation } from "react-i18next"; import { IconChevronDown, IconLoader2 } from "@tabler/icons-react"; import { Button } from "@kandev/ui/button"; import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, } from "@kandev/ui/command"; import { Popover, PopoverContent, PopoverTrigger } from "@kandev/ui/popover"; import { latestRuntimeVersions, resolveRuntimeActiveVersion } from "@/lib/agent-runtime-update"; import type { AgentUpdateJob, AgentUpdatePreview, AgentUpdateVersion } from "@/lib/api"; const ACTIVE_UPDATE_STATUSES = new Set([ "queued", "resolving", "updating", "refreshing", ]); function versionLabel( t: TFunction, version: AgentUpdateVersion, activeVersion?: string, defaultVersion?: string, ): string { const markers = [ version.latest ? t("agents:latestRuntimeVersion") : "", version.version === activeVersion ? t("agents:activeRuntimeVersionMarker") : "", version.version === defaultVersion ? t("agents:kandevDefaultRuntimeVersionMarker") : "", ] .filter(Boolean) .join(", "); if (!markers) return version.version; return t("agents:runtimeVersionOption", { version: version.version, markers: t("agents:runtimeVersionMarkerGroup", { markers }), }); } function RuntimeVersionBrowser({ agentName, browserId, versions, activeVersion, defaultVersion, selectedVersion, selectedUseDefault, onSelectTarget, }: { agentName: string; browserId: string; versions: AgentUpdateVersion[]; activeVersion?: string; defaultVersion?: string; selectedVersion?: string; selectedUseDefault: boolean; onSelectTarget: (targetVersion: string) => void; }) { const { t } = useTranslation(); return ( event.stopPropagation()} > {t("agents:noMatchingRuntimeVersions")} {versions.map((version) => { const isSelected = !selectedUseDefault && selectedVersion === version.version; return ( onSelectTarget(version.version)} > {version.version} {versionLabel(t, version, activeVersion, defaultVersion).slice( version.version.length, )} ); })} ); } function RuntimeVersionQuickChoices({ agentName, latestVersion, activeVersion, defaultVersion, selectedVersion, selectedUseDefault, disabled, onSelectTarget, onSelectDefault, }: { agentName: string; latestVersion: string; activeVersion?: string; defaultVersion?: string; selectedVersion?: string; selectedUseDefault: boolean; disabled: boolean; onSelectTarget: (targetVersion: string) => void; onSelectDefault: () => void; }) { const { t } = useTranslation(); return (

{t("agents:runtimeVersionQuickChoices")}

{defaultVersion && ( )}
); } export function RuntimeVersionPicker({ agentName, preview, selectedTarget, selectedUseDefault, loading, starting, job, onSelectTarget, onSelectDefault, }: { agentName: string; preview: AgentUpdatePreview; selectedTarget: string; selectedUseDefault: boolean; loading: boolean; starting: boolean; job?: AgentUpdateJob; onSelectTarget: (targetVersion: string) => void; onSelectDefault: () => void; }) { const { t } = useTranslation(); const [browseOpen, setBrowseOpen] = useState(false); const versions = latestRuntimeVersions( preview.available_versions ?? [{ version: preview.target_version, latest: false }], ); const latestVersion = versions.find((version) => version.latest)?.version ?? preview.target_version; const activeVersion = resolveRuntimeActiveVersion(preview, job); const selectedVersion = selectedUseDefault ? undefined : selectedTarget || preview.target_version; const disabled = Boolean(job && ACTIVE_UPDATE_STATUSES.has(job.status)) || starting || loading; const browserId = `agent-update-version-browser-${agentName}`; const selectTarget = (targetVersion: string) => { setBrowseOpen(false); onSelectTarget(targetVersion); }; const selectDefault = () => { setBrowseOpen(false); onSelectDefault(); }; return (

{t("agents:selectRuntimeVersion")}

); }