"use client"; import { useEffect, useState } from "react"; import { useTranslations } from "next-intl"; import { maskAccount } from "@/shared/utils/formatting"; import { getProviderDisplayLabel } from "@/shared/utils/providerDisplayLabel"; import useEmailPrivacyStore from "@/store/emailPrivacyStore"; type ActiveRequestRow = { model: string; provider: string; account: string; startedAt: number; runningTimeMs: number; count: number; clientEndpoint?: string | null; clientRequest?: unknown; providerRequest?: unknown; providerUrl?: string | null; stage?: string | null; stageUpdatedAt?: number | null; }; const STAGE_LABELS: Record = { registered: "activeStageRegistered", payload_prepared: "activeStagePayloadPrepared", waiting_account_slot: "activeStageWaitingAccountSlot", waiting_rate_limit: "activeStageWaitingRateLimit", rate_limit_slot_acquired: "activeStageRateLimitSlotAcquired", sending_to_provider: "activeStageSendingToProvider", provider_response_started: "activeStageProviderResponseStarted", }; function formatDuration(ms: number): string { const totalSeconds = Math.max(0, Math.floor(ms / 1000)); const minutes = Math.floor(totalSeconds / 60); const seconds = totalSeconds % 60; if (minutes <= 0) return `${seconds}s`; if (minutes < 60) return `${minutes}m ${seconds}s`; const hours = Math.floor(minutes / 60); return `${hours}h ${minutes % 60}m`; } export default function ActiveRequestsPanel() { const t = useTranslations("logs"); const { emailsVisible } = useEmailPrivacyStore(); const [rows, setRows] = useState([]); const [loading, setLoading] = useState(true); const [selectedRow, setSelectedRow] = useState(null); const [providerNodes, setProviderNodes] = useState< Array<{ id?: string; prefix?: string; name?: string }> >([]); useEffect(() => { fetch("/api/provider-nodes") .then((r) => (r.ok ? r.json() : { nodes: [] })) .then((d) => setProviderNodes(d.nodes || [])) .catch(() => {}); }, []); useEffect(() => { let cancelled = false; const load = async () => { // Skip polling when tab is not visible to save resources if (document.visibilityState !== "visible") return; try { const res = await fetch("/api/logs/active", { cache: "no-store" }); if (!res.ok) return; const data = await res.json(); if (!cancelled) { setRows(Array.isArray(data.activeRequests) ? data.activeRequests : []); } } catch (error) { if (!cancelled) { console.error("Failed to load active requests:", error); } } finally { if (!cancelled) { setLoading(false); } } }; load(); const interval = setInterval(load, 15_000); return () => { cancelled = true; clearInterval(interval); }; }, []); const handleClearAll = async () => { if (!window.confirm(t("confirmClearActiveRequests") || "Clear all active requests?")) return; try { const res = await fetch("/api/logs/active", { method: "DELETE" }); if (res.ok) { setRows([]); setSelectedRow(null); } } catch (error) { console.error("Failed to clear active requests:", error); } }; if (!loading && rows.length === 0) { return null; } const selectedAccountLabel = selectedRow ? maskAccount(selectedRow.account, emailsVisible) : ""; const formatStage = (stage?: string | null): string => { if (!stage) return t("activeStageUnknown"); const key = STAGE_LABELS[stage]; if (key) return t(key); return stage.replace(/_/g, " "); }; return (

{t("runningRequests")}

{t("runningRequestsDesc")}

{loading ? t("loading") : t("activeCount", { count: rows.length })}
{rows.length > 0 && ( )}
{rows.map((row) => { const accountLabel = maskAccount(row.account, emailsVisible); return ( ); })}
{t("model")} {t("provider")} {t("account")} {t("elapsed")} {t("activeStage")} {t("count")} {t("payloads")}
{row.model} {getProviderDisplayLabel(row.provider, providerNodes) || row.provider} {accountLabel} {formatDuration(row.runningTimeMs)} {formatStage(row.stage)} {row.count}
{selectedRow && (

{getProviderDisplayLabel(selectedRow.provider, providerNodes) || selectedRow.provider}{" "} / {selectedRow.model}

{t("runningRequestDetailMeta", { account: selectedAccountLabel, elapsed: formatDuration(selectedRow.runningTimeMs), })}

{t("activeStage")}: {formatStage(selectedRow.stage)}

{t("clientPayload")}

{selectedRow.clientEndpoint || t("notAvailable")}

                  {JSON.stringify(selectedRow.clientRequest || {}, null, 2)}
                
{t("upstreamPayload")}

{selectedRow.providerUrl || formatStage(selectedRow.stage)}

                  {JSON.stringify(selectedRow.providerRequest || {}, null, 2)}
                
)}
); }