From d7c043ad5cd42f9e676e2e5d1fc8f907f6fd4604 Mon Sep 17 00:00:00 2001 From: Codex Date: Wed, 20 May 2026 06:27:34 +0000 Subject: [PATCH] fix: clarify live split brain liveness --- scripts/src/e2e.ts | 342 +++++++++++++++++- src/components/frontend/public/app.js | 76 ++-- src/components/frontend/public/style.css | 26 +- src/components/frontend/src/code-queue.tsx | 18 +- .../microservices/code-queue/Dockerfile | 3 + 5 files changed, 416 insertions(+), 49 deletions(-) diff --git a/scripts/src/e2e.ts b/scripts/src/e2e.ts index ecf21418..d6834134 100644 --- a/scripts/src/e2e.ts +++ b/scripts/src/e2e.ts @@ -157,6 +157,8 @@ const FRONTEND_CHECK_NAMES = [ "frontend:code-queue-error-red-markers", "frontend:code-queue-stats-visible", "frontend:code-queue-stats-degraded-visible", + "frontend:code-queue-split-brain-live-not-failed", + "frontend:code-queue-split-brain-stale-failed", "frontend:code-queue-retry-attempt-trace-current", "frontend:code-queue-step-missing-diagnostic", "frontend:code-queue-judge-feedback-attempt-order", @@ -190,6 +192,10 @@ const CODE_QUEUE_STATS_FIXTURE_CHECK_NAMES = [ "frontend:code-queue-stats-visible", "frontend:code-queue-stats-degraded-visible", ] as const; +const CODE_QUEUE_LIVENESS_UI_FIXTURE_CHECK_NAMES = [ + "frontend:code-queue-split-brain-live-not-failed", + "frontend:code-queue-split-brain-stale-failed", +] as const; const ALL_E2E_CHECK_NAMES = [ ...NETWORK_CHECK_NAMES, @@ -1462,6 +1468,280 @@ async function runCodeQueueStatsFixture(page: Page, frontendUrl: string, mode: " } } +function codeQueueSplitBrainFixtureOverview(mode: "live" | "stale"): any { + const taskId = mode === "live" ? "codex_issue14_split_brain_live" : "codex_issue14_split_brain_stale"; + const now = "2026-05-20T06:00:00.000Z"; + const freshAt = "2026-05-20T05:59:52.000Z"; + const staleAt = "2026-05-20T05:42:00.000Z"; + const activeAt = mode === "live" ? freshAt : staleAt; + const diagnostics = mode === "live" + ? { + state: "split-brain", + health: "split-brain", + degraded: true, + splitBrain: true, + splitBrainLive: true, + effectiveLiveness: "live", + recommendedAction: "continue-supervision", + livenessSummary: "PostgreSQL and the local control-plane view are split, but scheduler-owned heartbeat and trace are fresh; treat the task as live and continue supervision.", + executionStateSource: "postgres-control-plane", + controlPlane: "master-code-queue-mgr", + databaseActiveTaskIds: [taskId], + databaseActiveTaskCount: 1, + schedulerActiveTaskIds: [], + schedulerActiveTaskCount: 0, + schedulerActiveRunSlotCount: 0, + schedulerActiveQueueIds: [], + schedulerProcessingQueueIds: [], + schedulerOrphanedActiveTaskIds: [taskId], + schedulerOrphanedActiveTaskCount: 1, + activeHeartbeatTaskIds: [taskId], + activeHeartbeatCount: 1, + heartbeatFreshTaskIds: [taskId], + heartbeatExpiredTaskIds: [], + heartbeatMissingTaskIds: [], + staleRecoveryCandidateTaskIds: [], + heartbeatRiskTaskIds: [], + traceGapTaskIds: [], + traceGapNotStaleTaskIds: [taskId], + schedulerHeartbeatStaleMs: 300000, + now, + lastSchedulerHeartbeatAt: freshAt, + lastObservedAgentEventAt: freshAt, + lastPersistedTraceAt: freshAt, + oaPublisher: null, + reasons: ["postgres control-plane has database-active tasks while its local active slots are empty, but scheduler heartbeat is fresh"], + guidance: ["Continue supervision; do not restart solely because master activeRunSlotCount is zero."], + } + : { + state: "split-brain", + health: "split-brain", + degraded: true, + splitBrain: true, + splitBrainLive: false, + effectiveLiveness: "at-risk", + recommendedAction: "investigate-heartbeat-risk", + livenessSummary: "Heartbeat is expired for a database-active task; investigate before assuming the task is still live.", + executionStateSource: "postgres-control-plane", + controlPlane: "master-code-queue-mgr", + databaseActiveTaskIds: [taskId], + databaseActiveTaskCount: 1, + schedulerActiveTaskIds: [], + schedulerActiveTaskCount: 0, + schedulerActiveRunSlotCount: 0, + schedulerActiveQueueIds: [], + schedulerProcessingQueueIds: [], + schedulerOrphanedActiveTaskIds: [taskId], + schedulerOrphanedActiveTaskCount: 1, + activeHeartbeatTaskIds: [taskId], + activeHeartbeatCount: 1, + heartbeatFreshTaskIds: [], + heartbeatExpiredTaskIds: [taskId], + heartbeatMissingTaskIds: [], + staleRecoveryCandidateTaskIds: [taskId], + heartbeatRiskTaskIds: [taskId], + traceGapTaskIds: [taskId], + traceGapNotStaleTaskIds: [], + schedulerHeartbeatStaleMs: 300000, + now, + lastSchedulerHeartbeatAt: staleAt, + lastObservedAgentEventAt: staleAt, + lastPersistedTraceAt: staleAt, + oaPublisher: null, + reasons: ["owner heartbeat is expired and scheduler has no local active run for at least one database-active task"], + guidance: ["Investigate heartbeat risk before retry or restart."], + }; + const task = { + id: taskId, + queueId: "issue14-liveness-fixture", + queueEnteredAt: "2026-05-20T05:50:00.000Z", + displayPrompt: `Issue #14 ${mode} split-brain fixture`, + basePrompt: `Issue #14 ${mode} split-brain fixture`, + displayPromptPreview: `Issue #14 ${mode} split-brain fixture`, + providerId: "D601-dev", + executionMode: "default", + cwd: "/workspace-dev", + model: "gpt-5.5", + maxAttempts: 99, + status: "running", + createdAt: "2026-05-20T05:50:00.000Z", + updatedAt: activeAt, + startedAt: "2026-05-20T05:50:10.000Z", + finishedAt: null, + currentAttempt: 1, + currentMode: "initial", + codexThreadId: "thread_issue14_fixture", + activeTurnId: "turn_issue14_fixture", + finalResponse: "", + stepCount: mode === "live" ? 4 : 0, + llmStepCount: mode === "live" ? 2 : 0, + outputCount: mode === "live" ? 8 : 1, + eventCount: 1, + attemptCount: 0, + attempts: [], + summaryOnly: true, + promptEditable: false, + schedulerHeartbeat: { + taskId, + queueId: "issue14-liveness-fixture", + attempt: 1, + activeTurnId: "turn_issue14_fixture", + codexThreadId: "thread_issue14_fixture", + owner: "D601-dev", + schedulerInstance: "code-queue-scheduler-fixture", + executionPlane: "scheduler-execution-plane", + agentPort: "codex", + status: "running", + lastLocalHeartbeatAt: activeAt, + lastObservedAgentEventAt: activeAt, + lastPersistedTraceAt: activeAt, + outputMaxSeq: mode === "live" ? 8 : 1, + source: "scheduler", + }, + timing: { durationMs: 600000, totalElapsedMs: 600000 }, + }; + const queue = { + activeTaskId: taskId, + activeTaskIds: [taskId], + total: 1, + unreadTerminal: 0, + counts: { running: 1, queued: 0, retry_wait: 0, judging: 0 }, + queues: [{ id: "issue14-liveness-fixture", name: "Issue 14 Liveness Fixture", total: 1, activeTaskId: taskId, counts: { running: 1 } }], + mainProviderId: "D601-dev", + defaultProviderId: "D601-dev", + defaultWorkdir: "/workspace-dev", + defaultWorkdirByProvider: { "D601-dev": "/workspace-dev" }, + codeModels: ["gpt-5.5", "gpt-5.4-mini", "gpt-5.4"], + executionProviders: [{ id: "D601-dev", label: "D601 dev", defaultWorkdir: "/workspace-dev" }], + executionModes: [{ id: "default", label: "默认容器/本机" }], + executionDiagnostics: diagnostics, + }; + return { + ok: true, + queue, + statistics: { timezone: "Asia/Shanghai", range: { startDate: "2026-05-20", endDate: "2026-05-20" }, totals: {}, daily: [] }, + tasks: [task], + pagination: { returned: 1, total: 1, hasMore: false }, + selected: { task, transcript: [], hasMore: false, preview: true }, + }; +} + +async function runCodeQueueSplitBrainFixture(page: Page, frontendUrl: string, mode: "live" | "stale"): Promise { + const overview = codeQueueSplitBrainFixtureOverview(mode); + const taskId = String(overview.tasks[0]?.id || ""); + const diagnostics = overview.queue.executionDiagnostics; + const routePattern = "**/api/microservices/code-queue/proxy/api/**"; + const requests: string[] = []; + const handler = async (route: any, request: any): Promise => { + if (request.method() !== "GET") { + await route.continue(); + return; + } + const url = new URL(request.url()); + const path = url.pathname.replace(/^\/api\/microservices\/code-queue\/proxy/u, ""); + requests.push(`${path}${url.search}`); + if (path === "/api/tasks/overview") { + await route.fulfill({ status: 200, contentType: "application/json", body: JSON.stringify(overview) }); + return; + } + if (path === "/api/workdirs") { + await route.fulfill({ status: 200, contentType: "application/json", body: JSON.stringify({ ok: true, workdirs: [{ providerId: "D601-dev", executionMode: "default", path: "/workspace-dev", source: "fixture" }] }) }); + return; + } + if (path === "/api/queues") { + await route.fulfill({ status: 200, contentType: "application/json", body: JSON.stringify({ ok: true, queues: overview.queue.queues, summary: overview.queue }) }); + return; + } + if (path === `/api/tasks/${encodeURIComponent(taskId)}/trace-summary` || path === `/api/tasks/${taskId}/trace-summary`) { + await route.fulfill({ status: 200, contentType: "application/json", body: JSON.stringify({ ok: true, summary: { ...overview.tasks[0], finalResponse: "", attempts: [], prompt: {}, execution: { durationMs: 600000, traceLineCount: 2, stepCount: mode === "live" ? 2 : 0 } } }) }); + return; + } + await route.continue(); + }; + + await page.route(routePattern, handler); + try { + await page.goto(`${frontendUrl}/app/code-queue/`, { waitUntil: "domcontentloaded", timeout: 15000 }); + await page.waitForSelector('[data-testid="code-queue-page"]', { timeout: 15000, state: "attached" }); + await page.waitForSelector('[data-testid="codex-liveness-diagnostics"]', { timeout: 15000 }); + await page.waitForFunction((expectedAction) => { + const panel = document.querySelector(".codex-liveness-panel") as HTMLElement | null; + return Boolean(panel && (panel.textContent || "").includes(String(expectedAction))); + }, diagnostics.recommendedAction, { timeout: 15000 }); + const metrics = await page.evaluate(() => { + const panel = document.querySelector(".codex-liveness-panel") as HTMLElement | null; + const grid = document.querySelector('[data-testid="codex-liveness-diagnostics"]') as HTMLElement | null; + const metricRows = Array.from(grid?.querySelectorAll(".codex-liveness-metric") || []) as HTMLElement[]; + const metric = (label: string): any => { + const row = metricRows.find((item) => (item.querySelector("span")?.textContent || "").trim() === label) || null; + return { + className: String(row?.className || ""), + label: row?.querySelector("span")?.textContent || "", + value: row?.querySelector("strong")?.textContent || "", + hint: row?.querySelector("code")?.textContent || "", + }; + }; + const chips = Array.from(panel?.querySelectorAll(".codex-trace-status-chip.liveness") || []) as HTMLElement[]; + const advisory = panel?.querySelector(".codex-liveness-advisory") as HTMLElement | null; + const text = panel?.innerText || panel?.textContent || ""; + return { + panelText: text, + health: metric("健康状态"), + effective: metric("Effective liveness"), + heartbeatRisk: metric("Heartbeat risk"), + staleCandidates: metric("Stale candidates"), + livenessChipClasses: chips.map((chip) => String(chip.className || "")), + advisoryClass: String(advisory?.className || ""), + advisoryText: advisory?.textContent || "", + failedMetricCount: metricRows.filter((row) => row.classList.contains("failed")).length, + healthFailed: metric("健康状态").className.includes("failed"), + effectiveFailed: metric("Effective liveness").className.includes("failed"), + warns: metricRows.filter((row) => row.classList.contains("warn") || row.classList.contains("degraded-live")).length, + }; + }); + const ok = mode === "live" + ? metrics.health.value === "split-brain live" + && metrics.health.className.includes("degraded-live") + && !metrics.health.className.includes("failed") + && metrics.effective.value === "live" + && metrics.heartbeatRisk.value === "0" + && metrics.failedMetricCount === 0 + && metrics.panelText.includes("continue-supervision") + && metrics.panelText.includes("控制面/执行面观测分裂") + && metrics.panelText.includes("heartbeat/trace 新鲜") + && !/任务死亡|dead task|task death|必须重启|must restart/i.test(metrics.panelText) + : metrics.health.value === "split-brain" + && metrics.health.className.includes("failed") + && metrics.effective.value === "at-risk" + && metrics.heartbeatRisk.value === "1" + && metrics.heartbeatRisk.className.includes("failed") + && metrics.staleCandidates.value === "1" + && metrics.panelText.includes("investigate-heartbeat-risk") + && metrics.panelText.includes(taskId) + && metrics.failedMetricCount >= 3; + return { + checked: true, + mode, + taskId, + fixtureDiagnostics: { + state: diagnostics.state, + splitBrainLive: diagnostics.splitBrainLive, + effectiveLiveness: diagnostics.effectiveLiveness, + recommendedAction: diagnostics.recommendedAction, + heartbeatFreshTaskIds: diagnostics.heartbeatFreshTaskIds, + heartbeatRiskTaskIds: diagnostics.heartbeatRiskTaskIds, + traceGapNotStaleTaskIds: diagnostics.traceGapNotStaleTaskIds, + staleRecoveryCandidateTaskIds: diagnostics.staleRecoveryCandidateTaskIds, + }, + requests, + ...metrics, + ok, + }; + } finally { + await page.unroute(routePattern, handler).catch(() => undefined); + } +} + function runPsql(config: UniDeskConfig, sql: string): { ok: boolean; stdout: string; stderr: string; exitCode: number | null } { const result = runCommand([ "docker", @@ -2371,6 +2651,8 @@ async function frontendCheck(config: UniDeskConfig, urls: PublicUrls, checks: E2 "frontend:code-queue-error-red-markers", "frontend:code-queue-stats-visible", "frontend:code-queue-stats-degraded-visible", + "frontend:code-queue-split-brain-live-not-failed", + "frontend:code-queue-split-brain-stale-failed", "frontend:code-queue-retry-attempt-trace-current", "frontend:code-queue-step-missing-diagnostic", "frontend:code-queue-judge-feedback-attempt-order", @@ -2502,6 +2784,8 @@ async function frontendCheck(config: UniDeskConfig, urls: PublicUrls, checks: E2 let codeQueueErrorHighlightMetrics: any = { checked: false, candidateFound: false }; let codeQueueStatsVisibleMetrics: any = { checked: false }; let codeQueueStatsDegradedMetrics: any = { checked: false }; + let codeQueueSplitBrainLiveMetrics: any = { checked: false }; + let codeQueueSplitBrainStaleMetrics: any = { checked: false }; let codeQueueRetryTraceFixtureMetrics: any = { checked: false }; let claudeqqText = ""; let routeDeepLinkText = ""; @@ -3423,6 +3707,12 @@ async function frontendCheck(config: UniDeskConfig, urls: PublicUrls, checks: E2 if (wants("frontend:code-queue-stats-degraded-visible")) { codeQueueStatsDegradedMetrics = await runCodeQueueStatsFixture(page, urls.frontendUrl, "degraded"); } + if (wants("frontend:code-queue-split-brain-live-not-failed")) { + codeQueueSplitBrainLiveMetrics = await runCodeQueueSplitBrainFixture(page, urls.frontendUrl, "live"); + } + if (wants("frontend:code-queue-split-brain-stale-failed")) { + codeQueueSplitBrainStaleMetrics = await runCodeQueueSplitBrainFixture(page, urls.frontendUrl, "stale"); + } codeQueueOutputText = needCodeQueueFullSurface ? await page.locator('[data-testid="codex-output"]').innerText({ timeout: 5000 }) : ""; codeQueueText = await page.locator('[data-testid="code-queue-page"]').innerText({ timeout: 5000 }); codeQueueHtmlGuard = await page.evaluate(async () => { @@ -4180,6 +4470,29 @@ async function frontendCheck(config: UniDeskConfig, urls: PublicUrls, checks: E2 codeQueueStatsDegradedMetrics.checked === true && codeQueueStatsDegradedMetrics.ok === true, { codeQueueStatsDegradedMetrics }); + addSelectedCheck(checks, options, "frontend:code-queue-split-brain-live-not-failed", + codeQueueSplitBrainLiveMetrics.checked === true + && codeQueueSplitBrainLiveMetrics.ok === true + && codeQueueSplitBrainLiveMetrics.healthFailed === false + && codeQueueSplitBrainLiveMetrics.health?.value === "split-brain live" + && codeQueueSplitBrainLiveMetrics.health?.className.includes("degraded-live") + && codeQueueSplitBrainLiveMetrics.effective?.value === "live" + && codeQueueSplitBrainLiveMetrics.heartbeatRisk?.value === "0" + && Number(codeQueueSplitBrainLiveMetrics.failedMetricCount || 0) === 0 + && String(codeQueueSplitBrainLiveMetrics.panelText || "").includes("continue-supervision") + && String(codeQueueSplitBrainLiveMetrics.panelText || "").includes("控制面/执行面观测分裂") + && !/任务死亡|dead task|task death|必须重启|must restart/i.test(String(codeQueueSplitBrainLiveMetrics.panelText || "")), + { codeQueueSplitBrainLiveMetrics }); + addSelectedCheck(checks, options, "frontend:code-queue-split-brain-stale-failed", + codeQueueSplitBrainStaleMetrics.checked === true + && codeQueueSplitBrainStaleMetrics.ok === true + && codeQueueSplitBrainStaleMetrics.healthFailed === true + && codeQueueSplitBrainStaleMetrics.effective?.value === "at-risk" + && codeQueueSplitBrainStaleMetrics.heartbeatRisk?.value === "1" + && codeQueueSplitBrainStaleMetrics.heartbeatRisk?.className.includes("failed") + && codeQueueSplitBrainStaleMetrics.staleCandidates?.value === "1" + && String(codeQueueSplitBrainStaleMetrics.panelText || "").includes("investigate-heartbeat-risk"), + { codeQueueSplitBrainStaleMetrics }); addSelectedCheck(checks, options, "frontend:code-queue-retry-attempt-trace-current", codeQueueRetryTraceFixtureMetrics.checked === true && codeQueueRetryTraceFixtureMetrics.ok === true @@ -4345,10 +4658,12 @@ export async function runE2E( && selectedChecks.every((name) => [ ...(CODE_QUEUE_RETRY_TRACE_FIXTURE_CHECK_NAMES as readonly string[]), ...(CODE_QUEUE_STATS_FIXTURE_CHECK_NAMES as readonly string[]), + ...(CODE_QUEUE_LIVENESS_UI_FIXTURE_CHECK_NAMES as readonly string[]), ].includes(name)); const needFrontend = wantsPrefix(options, "frontend") && !onlyRetryTraceFixture && !onlyCodeQueueBrowserFixtures; const needRetryTraceFixture = wantsAnyCheck(options, [...CODE_QUEUE_RETRY_TRACE_FIXTURE_CHECK_NAMES]); const needStatsFixture = wantsAnyCheck(options, [...CODE_QUEUE_STATS_FIXTURE_CHECK_NAMES]); + const needLivenessUiFixture = wantsAnyCheck(options, [...CODE_QUEUE_LIVENESS_UI_FIXTURE_CHECK_NAMES]); const needCodeQueueFixtures = wantsAnyCheck(options, [...CODE_QUEUE_FIXTURE_CHECK_NAMES]); const executedSections: string[] = []; @@ -4376,7 +4691,7 @@ export async function runE2E( if (needFrontend) { executedSections.push("frontend"); frontend = await frontendCheck(config, urls, checks, options); - } else if (needRetryTraceFixture || needStatsFixture) { + } else if (needRetryTraceFixture || needStatsFixture || needLivenessUiFixture) { executedSections.push("frontend-code-queue-browser-fixtures"); const browser = await chromium.launch({ headless: true }); try { @@ -4394,6 +4709,8 @@ export async function runE2E( const codeQueueRetryTraceFixtureMetrics = needRetryTraceFixture ? await runCodeQueueRetryTraceFixture(page, urls.frontendUrl) : { checked: false }; const codeQueueStatsVisibleMetrics = wantsCheck(options, "frontend:code-queue-stats-visible") ? await runCodeQueueStatsFixture(page, urls.frontendUrl, "visible") : { checked: false }; const codeQueueStatsDegradedMetrics = wantsCheck(options, "frontend:code-queue-stats-degraded-visible") ? await runCodeQueueStatsFixture(page, urls.frontendUrl, "degraded") : { checked: false }; + const codeQueueSplitBrainLiveMetrics = wantsCheck(options, "frontend:code-queue-split-brain-live-not-failed") ? await runCodeQueueSplitBrainFixture(page, urls.frontendUrl, "live") : { checked: false }; + const codeQueueSplitBrainStaleMetrics = wantsCheck(options, "frontend:code-queue-split-brain-stale-failed") ? await runCodeQueueSplitBrainFixture(page, urls.frontendUrl, "stale") : { checked: false }; addSelectedCheck(checks, options, "frontend:code-queue-stats-visible", codeQueueStatsVisibleMetrics.checked === true && codeQueueStatsVisibleMetrics.ok === true, @@ -4402,6 +4719,29 @@ export async function runE2E( codeQueueStatsDegradedMetrics.checked === true && codeQueueStatsDegradedMetrics.ok === true, { codeQueueStatsDegradedMetrics }); + addSelectedCheck(checks, options, "frontend:code-queue-split-brain-live-not-failed", + codeQueueSplitBrainLiveMetrics.checked === true + && codeQueueSplitBrainLiveMetrics.ok === true + && codeQueueSplitBrainLiveMetrics.healthFailed === false + && codeQueueSplitBrainLiveMetrics.health?.value === "split-brain live" + && codeQueueSplitBrainLiveMetrics.health?.className.includes("degraded-live") + && codeQueueSplitBrainLiveMetrics.effective?.value === "live" + && codeQueueSplitBrainLiveMetrics.heartbeatRisk?.value === "0" + && Number(codeQueueSplitBrainLiveMetrics.failedMetricCount || 0) === 0 + && String(codeQueueSplitBrainLiveMetrics.panelText || "").includes("continue-supervision") + && String(codeQueueSplitBrainLiveMetrics.panelText || "").includes("控制面/执行面观测分裂") + && !/任务死亡|dead task|task death|必须重启|must restart/i.test(String(codeQueueSplitBrainLiveMetrics.panelText || "")), + { codeQueueSplitBrainLiveMetrics }); + addSelectedCheck(checks, options, "frontend:code-queue-split-brain-stale-failed", + codeQueueSplitBrainStaleMetrics.checked === true + && codeQueueSplitBrainStaleMetrics.ok === true + && codeQueueSplitBrainStaleMetrics.healthFailed === true + && codeQueueSplitBrainStaleMetrics.effective?.value === "at-risk" + && codeQueueSplitBrainStaleMetrics.heartbeatRisk?.value === "1" + && codeQueueSplitBrainStaleMetrics.heartbeatRisk?.className.includes("failed") + && codeQueueSplitBrainStaleMetrics.staleCandidates?.value === "1" + && String(codeQueueSplitBrainStaleMetrics.panelText || "").includes("investigate-heartbeat-risk"), + { codeQueueSplitBrainStaleMetrics }); addSelectedCheck(checks, options, "frontend:code-queue-retry-attempt-trace-current", codeQueueRetryTraceFixtureMetrics.checked === true && codeQueueRetryTraceFixtureMetrics.ok === true diff --git a/src/components/frontend/public/app.js b/src/components/frontend/public/app.js index e15fdad9..fb7ad6db 100644 --- a/src/components/frontend/public/app.js +++ b/src/components/frontend/public/app.js @@ -1,60 +1,60 @@ -(()=>{var cT=Object.create;var{getPrototypeOf:$T,defineProperty:Mj,getOwnPropertyNames:_T}=Object;var AT=Object.prototype.hasOwnProperty;function FT(l){return this[l]}var jT,NT,Ml=(l,u,r)=>{var f=l!=null&&typeof l==="object";if(f){var n=u?jT??=new WeakMap:NT??=new WeakMap,t=n.get(l);if(t)return t}r=l!=null?cT($T(l)):{};let i=u||!l||!l.__esModule?Mj(r,"default",{value:l,enumerable:!0}):r;for(let y of _T(l))if(!AT.call(i,y))Mj(i,y,{get:FT.bind(l,y),enumerable:!0});if(f)n.set(l,i);return i};var _f=(l,u)=>()=>(u||l((u={exports:{}}).exports,u),u.exports);var cu=((l)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(l,{get:(u,r)=>(typeof require<"u"?require:u)[r]}):l)(function(l){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+l+'" is not supported')});var ej=_f((uu)=>{var tc=Symbol.for("react.element"),JT=Symbol.for("react.portal"),UT=Symbol.for("react.fragment"),QT=Symbol.for("react.strict_mode"),mT=Symbol.for("react.profiler"),wT=Symbol.for("react.provider"),qT=Symbol.for("react.context"),LT=Symbol.for("react.forward_ref"),GT=Symbol.for("react.suspense"),WT=Symbol.for("react.memo"),TT=Symbol.for("react.lazy"),sj=Symbol.iterator;function KT(l){if(l===null||typeof l!=="object")return null;return l=sj&&l[sj]||l["@@iterator"],typeof l==="function"?l:null}var bj={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},vj=Object.assign,gj={};function W0(l,u,r){this.props=l,this.context=u,this.refs=gj,this.updater=r||bj}W0.prototype.isReactComponent={};W0.prototype.setState=function(l,u){if(typeof l!=="object"&&typeof l!=="function"&&l!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,l,u,"setState")};W0.prototype.forceUpdate=function(l){this.updater.enqueueForceUpdate(this,l,"forceUpdate")};function kj(){}kj.prototype=W0.prototype;function k8(l,u,r){this.props=l,this.context=u,this.refs=gj,this.updater=r||bj}var I8=k8.prototype=new kj;I8.constructor=k8;vj(I8,W0.prototype);I8.isPureReactComponent=!0;var Rj=Array.isArray,Ij=Object.prototype.hasOwnProperty,a8={current:null},aj={key:!0,ref:!0,__self:!0,__source:!0};function oj(l,u,r){var f,n={},t=null,i=null;if(u!=null)for(f in u.ref!==void 0&&(i=u.ref),u.key!==void 0&&(t=""+u.key),u)Ij.call(u,f)&&!aj.hasOwnProperty(f)&&(n[f]=u[f]);var y=arguments.length-2;if(y===1)n.children=r;else if(1{l7.exports=ej()});var _7=_f((Lu)=>{function u6(l,u){var r=l.length;l.push(u);l:for(;0>>1,n=l[f];if(0>>1;fb$(y,r))cb$(_,y)?(l[f]=_,l[c]=r,f=c):(l[f]=y,l[i]=r,f=i);else if(cb$(_,r))l[f]=_,l[c]=r,f=c;else break l}}return u}function b$(l,u){var r=l.sortIndex-u.sortIndex;return r!==0?r:l.id-u.id}if(typeof performance==="object"&&typeof performance.now==="function")r6=performance,Lu.unstable_now=function(){return r6.now()};else v$=Date,f6=v$.now(),Lu.unstable_now=function(){return v$.now()-f6};var r6,v$,f6,jn=[],wt=[],DT=1,Ef=null,wr=3,a$=!1,wi=!1,yc=!1,t7=typeof setTimeout==="function"?setTimeout:null,i7=typeof clearTimeout==="function"?clearTimeout:null,n7=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function n6(l){for(var u=Rf(wt);u!==null;){if(u.callback===null)I$(wt);else if(u.startTime<=l)I$(wt),u.sortIndex=u.expirationTime,u6(jn,u);else break;u=Rf(wt)}}function i6(l){if(yc=!1,n6(l),!wi)if(Rf(jn)!==null)wi=!0,c6(y6);else{var u=Rf(wt);u!==null&&$6(i6,u.startTime-l)}}function y6(l,u){wi=!1,yc&&(yc=!1,i7(cc),cc=-1),a$=!0;var r=wr;try{n6(u);for(Ef=Rf(jn);Ef!==null&&(!(Ef.expirationTime>u)||l&&!$7());){var f=Ef.callback;if(typeof f==="function"){Ef.callback=null,wr=Ef.priorityLevel;var n=f(Ef.expirationTime<=u);u=Lu.unstable_now(),typeof n==="function"?Ef.callback=n:Ef===Rf(jn)&&I$(jn),n6(u)}else I$(jn);Ef=Rf(jn)}if(Ef!==null)var t=!0;else{var i=Rf(wt);i!==null&&$6(i6,i.startTime-u),t=!1}return t}finally{Ef=null,wr=r,a$=!1}}var o$=!1,g$=null,cc=-1,y7=5,c7=-1;function $7(){return Lu.unstable_now()-c7l||125f?(l.sortIndex=r,u6(wt,l),Rf(jn)===null&&l===Rf(wt)&&(yc?(i7(cc),cc=-1):yc=!0,$6(i6,r-f))):(l.sortIndex=n,u6(jn,l),wi||a$||(wi=!0,c6(y6))),l};Lu.unstable_shouldYield=$7;Lu.unstable_wrapCallback=function(l){var u=wr;return function(){var r=wr;wr=u;try{return l.apply(this,arguments)}finally{wr=r}}}});var F7=_f((ZC,A7)=>{A7.exports=_7()});var NU=_f((Uf)=>{var VT=Ju(),Nf=F7();function Ql(l){for(var u="https://reactjs.org/docs/error-decoder.html?invariant="+l,r=1;r"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),H6=Object.prototype.hasOwnProperty,ST=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,j7={},N7={};function YT(l){if(H6.call(N7,l))return!0;if(H6.call(j7,l))return!1;if(ST.test(l))return N7[l]=!0;return j7[l]=!0,!1}function XT(l,u,r,f){if(r!==null&&r.type===0)return!1;switch(typeof u){case"function":case"symbol":return!0;case"boolean":if(f)return!1;if(r!==null)return!r.acceptsBooleans;return l=l.toLowerCase().slice(0,5),l!=="data-"&&l!=="aria-";default:return!1}}function PT(l,u,r,f){if(u===null||typeof u>"u"||XT(l,u,r,f))return!0;if(f)return!1;if(r!==null)switch(r.type){case 3:return!u;case 4:return u===!1;case 5:return isNaN(u);case 6:return isNaN(u)||1>u}return!1}function Yr(l,u,r,f,n,t,i){this.acceptsBooleans=u===2||u===3||u===4,this.attributeName=f,this.attributeNamespace=n,this.mustUseProperty=r,this.propertyName=l,this.type=u,this.sanitizeURL=t,this.removeEmptyString=i}var Nr={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(l){Nr[l]=new Yr(l,0,!1,l,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(l){var u=l[0];Nr[u]=new Yr(u,1,!1,l[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(l){Nr[l]=new Yr(l,2,!1,l.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(l){Nr[l]=new Yr(l,2,!1,l,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(l){Nr[l]=new Yr(l,3,!1,l.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(l){Nr[l]=new Yr(l,3,!0,l,null,!1,!1)});["capture","download"].forEach(function(l){Nr[l]=new Yr(l,4,!1,l,null,!1,!1)});["cols","rows","size","span"].forEach(function(l){Nr[l]=new Yr(l,6,!1,l,null,!1,!1)});["rowSpan","start"].forEach(function(l){Nr[l]=new Yr(l,5,!1,l.toLowerCase(),null,!1,!1)});var K4=/[\-:]([a-z])/g;function E4(l){return l[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(l){var u=l.replace(K4,E4);Nr[u]=new Yr(u,1,!1,l,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(l){var u=l.replace(K4,E4);Nr[u]=new Yr(u,1,!1,l,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(l){var u=l.replace(K4,E4);Nr[u]=new Yr(u,1,!1,l,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(l){Nr[l]=new Yr(l,1,!1,l.toLowerCase(),null,!1,!1)});Nr.xlinkHref=new Yr("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(l){Nr[l]=new Yr(l,1,!1,l.toLowerCase(),null,!0,!0)});function p4(l,u,r,f){var n=Nr.hasOwnProperty(u)?Nr[u]:null;if(n!==null?n.type!==0:f||!(2{var cT=Object.create;var{getPrototypeOf:$T,defineProperty:sj,getOwnPropertyNames:_T}=Object;var AT=Object.prototype.hasOwnProperty;function FT(l){return this[l]}var jT,NT,Ml=(l,u,r)=>{var f=l!=null&&typeof l==="object";if(f){var n=u?jT??=new WeakMap:NT??=new WeakMap,t=n.get(l);if(t)return t}r=l!=null?cT($T(l)):{};let i=u||!l||!l.__esModule?sj(r,"default",{value:l,enumerable:!0}):r;for(let y of _T(l))if(!AT.call(i,y))sj(i,y,{get:FT.bind(l,y),enumerable:!0});if(f)n.set(l,i);return i};var _f=(l,u)=>()=>(u||l((u={exports:{}}).exports,u),u.exports);var cu=((l)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(l,{get:(u,r)=>(typeof require<"u"?require:u)[r]}):l)(function(l){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+l+'" is not supported')});var l7=_f((uu)=>{var tc=Symbol.for("react.element"),JT=Symbol.for("react.portal"),UT=Symbol.for("react.fragment"),QT=Symbol.for("react.strict_mode"),mT=Symbol.for("react.profiler"),wT=Symbol.for("react.provider"),qT=Symbol.for("react.context"),LT=Symbol.for("react.forward_ref"),GT=Symbol.for("react.suspense"),WT=Symbol.for("react.memo"),TT=Symbol.for("react.lazy"),Rj=Symbol.iterator;function KT(l){if(l===null||typeof l!=="object")return null;return l=Rj&&l[Rj]||l["@@iterator"],typeof l==="function"?l:null}var vj={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},gj=Object.assign,kj={};function W0(l,u,r){this.props=l,this.context=u,this.refs=kj,this.updater=r||vj}W0.prototype.isReactComponent={};W0.prototype.setState=function(l,u){if(typeof l!=="object"&&typeof l!=="function"&&l!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,l,u,"setState")};W0.prototype.forceUpdate=function(l){this.updater.enqueueForceUpdate(this,l,"forceUpdate")};function Ij(){}Ij.prototype=W0.prototype;function I8(l,u,r){this.props=l,this.context=u,this.refs=kj,this.updater=r||vj}var a8=I8.prototype=new Ij;a8.constructor=I8;gj(a8,W0.prototype);a8.isPureReactComponent=!0;var xj=Array.isArray,aj=Object.prototype.hasOwnProperty,o8={current:null},oj={key:!0,ref:!0,__self:!0,__source:!0};function dj(l,u,r){var f,n={},t=null,i=null;if(u!=null)for(f in u.ref!==void 0&&(i=u.ref),u.key!==void 0&&(t=""+u.key),u)aj.call(u,f)&&!oj.hasOwnProperty(f)&&(n[f]=u[f]);var y=arguments.length-2;if(y===1)n.children=r;else if(1{u7.exports=l7()});var A7=_f((Lu)=>{function r6(l,u){var r=l.length;l.push(u);l:for(;0>>1,n=l[f];if(0>>1;fb$(y,r))cb$(_,y)?(l[f]=_,l[c]=r,f=c):(l[f]=y,l[i]=r,f=i);else if(cb$(_,r))l[f]=_,l[c]=r,f=c;else break l}}return u}function b$(l,u){var r=l.sortIndex-u.sortIndex;return r!==0?r:l.id-u.id}if(typeof performance==="object"&&typeof performance.now==="function")f6=performance,Lu.unstable_now=function(){return f6.now()};else v$=Date,n6=v$.now(),Lu.unstable_now=function(){return v$.now()-n6};var f6,v$,n6,jn=[],wt=[],DT=1,Ef=null,wr=3,a$=!1,wi=!1,yc=!1,i7=typeof setTimeout==="function"?setTimeout:null,y7=typeof clearTimeout==="function"?clearTimeout:null,t7=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function t6(l){for(var u=Rf(wt);u!==null;){if(u.callback===null)I$(wt);else if(u.startTime<=l)I$(wt),u.sortIndex=u.expirationTime,r6(jn,u);else break;u=Rf(wt)}}function y6(l){if(yc=!1,t6(l),!wi)if(Rf(jn)!==null)wi=!0,$6(c6);else{var u=Rf(wt);u!==null&&_6(y6,u.startTime-l)}}function c6(l,u){wi=!1,yc&&(yc=!1,y7(cc),cc=-1),a$=!0;var r=wr;try{t6(u);for(Ef=Rf(jn);Ef!==null&&(!(Ef.expirationTime>u)||l&&!_7());){var f=Ef.callback;if(typeof f==="function"){Ef.callback=null,wr=Ef.priorityLevel;var n=f(Ef.expirationTime<=u);u=Lu.unstable_now(),typeof n==="function"?Ef.callback=n:Ef===Rf(jn)&&I$(jn),t6(u)}else I$(jn);Ef=Rf(jn)}if(Ef!==null)var t=!0;else{var i=Rf(wt);i!==null&&_6(y6,i.startTime-u),t=!1}return t}finally{Ef=null,wr=r,a$=!1}}var o$=!1,g$=null,cc=-1,c7=5,$7=-1;function _7(){return Lu.unstable_now()-$7l||125f?(l.sortIndex=r,r6(wt,l),Rf(jn)===null&&l===Rf(wt)&&(yc?(y7(cc),cc=-1):yc=!0,_6(y6,r-f))):(l.sortIndex=n,r6(jn,l),wi||a$||(wi=!0,$6(c6))),l};Lu.unstable_shouldYield=_7;Lu.unstable_wrapCallback=function(l){var u=wr;return function(){var r=wr;wr=u;try{return l.apply(this,arguments)}finally{wr=r}}}});var j7=_f((ZC,F7)=>{F7.exports=A7()});var JU=_f((Uf)=>{var VT=Ju(),Nf=j7();function Ql(l){for(var u="https://reactjs.org/docs/error-decoder.html?invariant="+l,r=1;r"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),B6=Object.prototype.hasOwnProperty,ST=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,N7={},J7={};function YT(l){if(B6.call(J7,l))return!0;if(B6.call(N7,l))return!1;if(ST.test(l))return J7[l]=!0;return N7[l]=!0,!1}function XT(l,u,r,f){if(r!==null&&r.type===0)return!1;switch(typeof u){case"function":case"symbol":return!0;case"boolean":if(f)return!1;if(r!==null)return!r.acceptsBooleans;return l=l.toLowerCase().slice(0,5),l!=="data-"&&l!=="aria-";default:return!1}}function PT(l,u,r,f){if(u===null||typeof u>"u"||XT(l,u,r,f))return!0;if(f)return!1;if(r!==null)switch(r.type){case 3:return!u;case 4:return u===!1;case 5:return isNaN(u);case 6:return isNaN(u)||1>u}return!1}function Yr(l,u,r,f,n,t,i){this.acceptsBooleans=u===2||u===3||u===4,this.attributeName=f,this.attributeNamespace=n,this.mustUseProperty=r,this.propertyName=l,this.type=u,this.sanitizeURL=t,this.removeEmptyString=i}var Nr={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(l){Nr[l]=new Yr(l,0,!1,l,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(l){var u=l[0];Nr[u]=new Yr(u,1,!1,l[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(l){Nr[l]=new Yr(l,2,!1,l.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(l){Nr[l]=new Yr(l,2,!1,l,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(l){Nr[l]=new Yr(l,3,!1,l.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(l){Nr[l]=new Yr(l,3,!0,l,null,!1,!1)});["capture","download"].forEach(function(l){Nr[l]=new Yr(l,4,!1,l,null,!1,!1)});["cols","rows","size","span"].forEach(function(l){Nr[l]=new Yr(l,6,!1,l,null,!1,!1)});["rowSpan","start"].forEach(function(l){Nr[l]=new Yr(l,5,!1,l.toLowerCase(),null,!1,!1)});var E4=/[\-:]([a-z])/g;function p4(l){return l[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(l){var u=l.replace(E4,p4);Nr[u]=new Yr(u,1,!1,l,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(l){var u=l.replace(E4,p4);Nr[u]=new Yr(u,1,!1,l,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(l){var u=l.replace(E4,p4);Nr[u]=new Yr(u,1,!1,l,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(l){Nr[l]=new Yr(l,1,!1,l.toLowerCase(),null,!1,!1)});Nr.xlinkHref=new Yr("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(l){Nr[l]=new Yr(l,1,!1,l.toLowerCase(),null,!0,!0)});function z4(l,u,r,f){var n=Nr.hasOwnProperty(u)?Nr[u]:null;if(n!==null?n.type!==0:f||!(2y||n[i]!==t[y]){var c=` -`+n[i].replace(" at new "," at ");return l.displayName&&c.includes("")&&(c=c.replace("",l.displayName)),c}while(1<=i&&0<=y);break}}}finally{A6=!1,Error.prepareStackTrace=r}return(l=l?l.displayName||l.name:"")?Uc(l):""}function CT(l){switch(l.tag){case 5:return Uc(l.type);case 16:return Uc("Lazy");case 13:return Uc("Suspense");case 19:return Uc("SuspenseList");case 0:case 2:case 15:return l=F6(l.type,!1),l;case 11:return l=F6(l.type.render,!1),l;case 1:return l=F6(l.type,!0),l;default:return""}}function S6(l){if(l==null)return null;if(typeof l==="function")return l.displayName||l.name||null;if(typeof l==="string")return l;switch(l){case p0:return"Fragment";case E0:return"Portal";case B6:return"Profiler";case z4:return"StrictMode";case D6:return"Suspense";case V6:return"SuspenseList"}if(typeof l==="object")switch(l.$$typeof){case wN:return(l.displayName||"Context")+".Consumer";case mN:return(l._context.displayName||"Context")+".Provider";case O4:var u=l.render;return l=l.displayName,l||(l=u.displayName||u.name||"",l=l!==""?"ForwardRef("+l+")":"ForwardRef"),l;case Z4:return u=l.displayName||null,u!==null?u:S6(l.type)||"Memo";case Lt:u=l._payload,l=l._init;try{return S6(l(u))}catch(r){}}return null}function hT(l){var u=l.type;switch(l.tag){case 24:return"Cache";case 9:return(u.displayName||"Context")+".Consumer";case 10:return(u._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return l=u.render,l=l.displayName||l.name||"",u.displayName||(l!==""?"ForwardRef("+l+")":"ForwardRef");case 7:return"Fragment";case 5:return u;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return S6(u);case 8:return u===z4?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof u==="function")return u.displayName||u.name||null;if(typeof u==="string")return u}return null}function St(l){switch(typeof l){case"boolean":case"number":case"string":case"undefined":return l;case"object":return l;default:return""}}function LN(l){var u=l.type;return(l=l.nodeName)&&l.toLowerCase()==="input"&&(u==="checkbox"||u==="radio")}function MT(l){var u=LN(l)?"checked":"value",r=Object.getOwnPropertyDescriptor(l.constructor.prototype,u),f=""+l[u];if(!l.hasOwnProperty(u)&&typeof r<"u"&&typeof r.get==="function"&&typeof r.set==="function"){var{get:n,set:t}=r;return Object.defineProperty(l,u,{configurable:!0,get:function(){return n.call(this)},set:function(i){f=""+i,t.call(this,i)}}),Object.defineProperty(l,u,{enumerable:r.enumerable}),{getValue:function(){return f},setValue:function(i){f=""+i},stopTracking:function(){l._valueTracker=null,delete l[u]}}}}function e$(l){l._valueTracker||(l._valueTracker=MT(l))}function GN(l){if(!l)return!1;var u=l._valueTracker;if(!u)return!0;var r=u.getValue(),f="";return l&&(f=LN(l)?l.checked?"true":"false":l.value),l=f,l!==r?(u.setValue(l),!0):!1}function T_(l){if(l=l||(typeof document<"u"?document:void 0),typeof l>"u")return null;try{return l.activeElement||l.body}catch(u){return l.body}}function Y6(l,u){var r=u.checked;return Pu({},u,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:r!=null?r:l._wrapperState.initialChecked})}function U7(l,u){var r=u.defaultValue==null?"":u.defaultValue,f=u.checked!=null?u.checked:u.defaultChecked;r=St(u.value!=null?u.value:r),l._wrapperState={initialChecked:f,initialValue:r,controlled:u.type==="checkbox"||u.type==="radio"?u.checked!=null:u.value!=null}}function WN(l,u){u=u.checked,u!=null&&p4(l,"checked",u,!1)}function X6(l,u){WN(l,u);var r=St(u.value),f=u.type;if(r!=null)if(f==="number"){if(r===0&&l.value===""||l.value!=r)l.value=""+r}else l.value!==""+r&&(l.value=""+r);else if(f==="submit"||f==="reset"){l.removeAttribute("value");return}u.hasOwnProperty("value")?P6(l,u.type,r):u.hasOwnProperty("defaultValue")&&P6(l,u.type,St(u.defaultValue)),u.checked==null&&u.defaultChecked!=null&&(l.defaultChecked=!!u.defaultChecked)}function Q7(l,u,r){if(u.hasOwnProperty("value")||u.hasOwnProperty("defaultValue")){var f=u.type;if(!(f!=="submit"&&f!=="reset"||u.value!==void 0&&u.value!==null))return;u=""+l._wrapperState.initialValue,r||u===l.value||(l.value=u),l.defaultValue=u}r=l.name,r!==""&&(l.name=""),l.defaultChecked=!!l._wrapperState.initialChecked,r!==""&&(l.name=r)}function P6(l,u,r){if(u!=="number"||T_(l.ownerDocument)!==l)r==null?l.defaultValue=""+l._wrapperState.initialValue:l.defaultValue!==""+r&&(l.defaultValue=""+r)}var Qc=Array.isArray;function P0(l,u,r,f){if(l=l.options,u){u={};for(var n=0;n"+u.valueOf().toString()+"";for(u=l_.firstChild;l.firstChild;)l.removeChild(l.firstChild);for(;u.firstChild;)l.appendChild(u.firstChild)}});function Vc(l,u){if(u){var r=l.firstChild;if(r&&r===l.lastChild&&r.nodeType===3){r.nodeValue=u;return}}l.textContent=u}var Tc={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},sT=["Webkit","ms","Moz","O"];Object.keys(Tc).forEach(function(l){sT.forEach(function(u){u=u+l.charAt(0).toUpperCase()+l.substring(1),Tc[u]=Tc[l]})});function pN(l,u,r){return u==null||typeof u==="boolean"||u===""?"":r||typeof u!=="number"||u===0||Tc.hasOwnProperty(l)&&Tc[l]?(""+u).trim():u+"px"}function zN(l,u){l=l.style;for(var r in u)if(u.hasOwnProperty(r)){var f=r.indexOf("--")===0,n=pN(r,u[r],f);r==="float"&&(r="cssFloat"),f?l.setProperty(r,n):l[r]=n}}var RT=Pu({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function M6(l,u){if(u){if(RT[l]&&(u.children!=null||u.dangerouslySetInnerHTML!=null))throw Error(Ql(137,l));if(u.dangerouslySetInnerHTML!=null){if(u.children!=null)throw Error(Ql(60));if(typeof u.dangerouslySetInnerHTML!=="object"||!("__html"in u.dangerouslySetInnerHTML))throw Error(Ql(61))}if(u.style!=null&&typeof u.style!=="object")throw Error(Ql(62))}}function s6(l,u){if(l.indexOf("-")===-1)return typeof u.is==="string";switch(l){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var R6=null;function H4(l){return l=l.target||l.srcElement||window,l.correspondingUseElement&&(l=l.correspondingUseElement),l.nodeType===3?l.parentNode:l}var x6=null,C0=null,h0=null;function q7(l){if(l=dc(l)){if(typeof x6!=="function")throw Error(Ql(280));var u=l.stateNode;u&&(u=d_(u),x6(l.stateNode,l.type,u))}}function ON(l){C0?h0?h0.push(l):h0=[l]:C0=l}function ZN(){if(C0){var l=C0,u=h0;if(h0=C0=null,q7(l),u)for(l=0;l>>=0,l===0?32:31-(lK(l)/uK|0)|0}var u_=64,r_=4194304;function mc(l){switch(l&-l){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return l&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return l&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return l}}function z_(l,u){var r=l.pendingLanes;if(r===0)return 0;var f=0,n=l.suspendedLanes,t=l.pingedLanes,i=r&268435455;if(i!==0){var y=i&~n;y!==0?f=mc(y):(t&=i,t!==0&&(f=mc(t)))}else i=r&~n,i!==0?f=mc(i):t!==0&&(f=mc(t));if(f===0)return 0;if(u!==0&&u!==f&&(u&n)===0&&(n=f&-f,t=u&-u,n>=t||n===16&&(t&4194240)!==0))return u;if((f&4)!==0&&(f|=r&16),u=l.entangledLanes,u!==0)for(l=l.entanglements,u&=f;0r;r++)u.push(l);return u}function ac(l,u,r){l.pendingLanes|=u,u!==536870912&&(l.suspendedLanes=0,l.pingedLanes=0),l=l.eventTimes,u=31-kf(u),l[u]=r}function tK(l,u){var r=l.pendingLanes&~u;l.pendingLanes=u,l.suspendedLanes=0,l.pingedLanes=0,l.expiredLanes&=u,l.mutableReadLanes&=u,l.entangledLanes&=u,u=l.entanglements;var f=l.eventTimes;for(l=l.expirationTimes;0=Ec),O7=String.fromCharCode(32),Z7=!1;function aN(l,u){switch(l){case"keyup":return DK.indexOf(u.keyCode)!==-1;case"keydown":return u.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function oN(l){return l=l.detail,typeof l==="object"&&"data"in l?l.data:null}var z0=!1;function SK(l,u){switch(l){case"compositionend":return oN(u);case"keypress":if(u.which!==32)return null;return Z7=!0,O7;case"textInput":return l=u.data,l===O7&&Z7?null:l;default:return null}}function YK(l,u){if(z0)return l==="compositionend"||!C4&&aN(l,u)?(l=kN(),N_=Y4=Kt=null,z0=!1,l):null;switch(l){case"paste":return null;case"keypress":if(!(u.ctrlKey||u.altKey||u.metaKey)||u.ctrlKey&&u.altKey){if(u.char&&1=u)return{node:r,offset:u-l};l=f}l:{for(;r;){if(r.nextSibling){r=r.nextSibling;break l}r=r.parentNode}r=void 0}r=D7(r)}}function uJ(l,u){return l&&u?l===u?!0:l&&l.nodeType===3?!1:u&&u.nodeType===3?uJ(l,u.parentNode):("contains"in l)?l.contains(u):l.compareDocumentPosition?!!(l.compareDocumentPosition(u)&16):!1:!1}function rJ(){for(var l=window,u=T_();u instanceof l.HTMLIFrameElement;){try{var r=typeof u.contentWindow.location.href==="string"}catch(f){r=!1}if(r)l=u.contentWindow;else break;u=T_(l.document)}return u}function h4(l){var u=l&&l.nodeName&&l.nodeName.toLowerCase();return u&&(u==="input"&&(l.type==="text"||l.type==="search"||l.type==="tel"||l.type==="url"||l.type==="password")||u==="textarea"||l.contentEditable==="true")}function bK(l){var u=rJ(),r=l.focusedElem,f=l.selectionRange;if(u!==r&&r&&r.ownerDocument&&uJ(r.ownerDocument.documentElement,r)){if(f!==null&&h4(r)){if(u=f.start,l=f.end,l===void 0&&(l=u),"selectionStart"in r)r.selectionStart=u,r.selectionEnd=Math.min(l,r.value.length);else if(l=(u=r.ownerDocument||document)&&u.defaultView||window,l.getSelection){l=l.getSelection();var n=r.textContent.length,t=Math.min(f.start,n);f=f.end===void 0?t:Math.min(f.end,n),!l.extend&&t>f&&(n=f,f=t,t=n),n=V7(r,t);var i=V7(r,f);n&&i&&(l.rangeCount!==1||l.anchorNode!==n.node||l.anchorOffset!==n.offset||l.focusNode!==i.node||l.focusOffset!==i.offset)&&(u=u.createRange(),u.setStart(n.node,n.offset),l.removeAllRanges(),t>f?(l.addRange(u),l.extend(i.node,i.offset)):(u.setEnd(i.node,i.offset),l.addRange(u)))}}u=[];for(l=r;l=l.parentNode;)l.nodeType===1&&u.push({element:l,left:l.scrollLeft,top:l.scrollTop});typeof r.focus==="function"&&r.focus();for(r=0;r=document.documentMode,O0=null,a6=null,zc=null,o6=!1;function S7(l,u,r){var f=r.window===r?r.document:r.nodeType===9?r:r.ownerDocument;o6||O0==null||O0!==T_(f)||(f=O0,("selectionStart"in f)&&h4(f)?f={start:f.selectionStart,end:f.selectionEnd}:(f=(f.ownerDocument&&f.ownerDocument.defaultView||window).getSelection(),f={anchorNode:f.anchorNode,anchorOffset:f.anchorOffset,focusNode:f.focusNode,focusOffset:f.focusOffset}),zc&&hc(zc,f)||(zc=f,f=H_(a6,"onSelect"),0B0||(l.current=t4[B0],t4[B0]=null,B0--)}function Gu(l,u){B0++,t4[B0]=l.current,l.current=u}var Yt={},Wr=Pt(Yt),gr=Pt(!1),zi=Yt;function b0(l,u){var r=l.type.contextTypes;if(!r)return Yt;var f=l.stateNode;if(f&&f.__reactInternalMemoizedUnmaskedChildContext===u)return f.__reactInternalMemoizedMaskedChildContext;var n={},t;for(t in r)n[t]=u[t];return f&&(l=l.stateNode,l.__reactInternalMemoizedUnmaskedChildContext=u,l.__reactInternalMemoizedMaskedChildContext=n),n}function kr(l){return l=l.childContextTypes,l!==null&&l!==void 0}function D_(){Eu(gr),Eu(Wr)}function s7(l,u,r){if(Wr.current!==Yt)throw Error(Ql(168));Gu(Wr,u),Gu(gr,r)}function AJ(l,u,r){var f=l.stateNode;if(u=u.childContextTypes,typeof f.getChildContext!=="function")return r;f=f.getChildContext();for(var n in f)if(!(n in u))throw Error(Ql(108,hT(l)||"Unknown",n));return Pu({},r,f)}function V_(l){return l=(l=l.stateNode)&&l.__reactInternalMemoizedMergedChildContext||Yt,zi=Wr.current,Gu(Wr,l),Gu(gr,gr.current),!0}function R7(l,u,r){var f=l.stateNode;if(!f)throw Error(Ql(169));r?(l=AJ(l,u,zi),f.__reactInternalMemoizedMergedChildContext=l,Eu(gr),Eu(Wr),Gu(Wr,l)):Eu(gr),Gu(gr,r)}var hn=null,e_=!1,G6=!1;function FJ(l){hn===null?hn=[l]:hn.push(l)}function uE(l){e_=!0,FJ(l)}function Ct(){if(!G6&&hn!==null){G6=!0;var l=0,u=Uu;try{var r=hn;for(Uu=1;l>=i,n-=i,Mn=1<<32-kf(u)+n|r<Z?(V=O,O=null):V=O.sibling;var P=j(J,O,m[Z],q);if(P===null){O===null&&(O=V);break}l&&O&&P.alternate===null&&u(J,O),Q=t(P,Q,Z),p===null?W=P:p.sibling=P,p=P,O=V}if(Z===m.length)return r(J,O),Zu&&Li(J,Z),W;if(O===null){for(;ZZ?(V=O,O=null):V=O.sibling;var H=j(J,O,P.value,q);if(H===null){O===null&&(O=V);break}l&&O&&H.alternate===null&&u(J,O),Q=t(H,Q,Z),p===null?W=H:p.sibling=H,p=H,O=V}if(P.done)return r(J,O),Zu&&Li(J,Z),W;if(O===null){for(;!P.done;Z++,P=m.next())P=F(J,P.value,q),P!==null&&(Q=t(P,Q,Z),p===null?W=P:p.sibling=P,p=P);return Zu&&Li(J,Z),W}for(O=f(J,O);!P.done;Z++,P=m.next())P=N(O,J,Z,P.value,q),P!==null&&(l&&P.alternate!==null&&O.delete(P.key===null?Z:P.key),Q=t(P,Q,Z),p===null?W=P:p.sibling=P,p=P);return l&&O.forEach(function(B){return u(J,B)}),Zu&&Li(J,Z),W}function G(J,Q,m,q){if(typeof m==="object"&&m!==null&&m.type===p0&&m.key===null&&(m=m.props.children),typeof m==="object"&&m!==null){switch(m.$$typeof){case d$:l:{for(var W=m.key,p=Q;p!==null;){if(p.key===W){if(W=m.type,W===p0){if(p.tag===7){r(J,p.sibling),Q=n(p,m.props.children),Q.return=J,J=Q;break l}}else if(p.elementType===W||typeof W==="object"&&W!==null&&W.$$typeof===Lt&&v7(W)===p.type){r(J,p.sibling),Q=n(p,m.props),Q.ref=jc(J,p,m),Q.return=J,J=Q;break l}r(J,p);break}else u(J,p);p=p.sibling}m.type===p0?(Q=pi(m.props.children,J.mode,q,m.key),Q.return=J,J=Q):(q=W_(m.type,m.key,m.props,null,J.mode,q),q.ref=jc(J,Q,m),q.return=J,J=q)}return i(J);case E0:l:{for(p=m.key;Q!==null;){if(Q.key===p)if(Q.tag===4&&Q.stateNode.containerInfo===m.containerInfo&&Q.stateNode.implementation===m.implementation){r(J,Q.sibling),Q=n(Q,m.children||[]),Q.return=J,J=Q;break l}else{r(J,Q);break}else u(J,Q);Q=Q.sibling}Q=Z6(m,J.mode,q),Q.return=J,J=Q}return i(J);case Lt:return p=m._init,G(J,Q,p(m._payload),q)}if(Qc(m))return U(J,Q,m,q);if($c(m))return w(J,Q,m,q);$_(J,m)}return typeof m==="string"&&m!==""||typeof m==="number"?(m=""+m,Q!==null&&Q.tag===6?(r(J,Q.sibling),Q=n(Q,m),Q.return=J,J=Q):(r(J,Q),Q=O6(m,J.mode,q),Q.return=J,J=Q),i(J)):r(J,Q)}return G}var g0=UJ(!0),QJ=UJ(!1),X_=Pt(null),P_=null,S0=null,x4=null;function b4(){x4=S0=P_=null}function v4(l){var u=X_.current;Eu(X_),l._currentValue=u}function c4(l,u,r){for(;l!==null;){var f=l.alternate;if((l.childLanes&u)!==u?(l.childLanes|=u,f!==null&&(f.childLanes|=u)):f!==null&&(f.childLanes&u)!==u&&(f.childLanes|=u),l===r)break;l=l.return}}function s0(l,u){P_=l,x4=S0=null,l=l.dependencies,l!==null&&l.firstContext!==null&&((l.lanes&u)!==0&&(vr=!0),l.firstContext=null)}function Hf(l){var u=l._currentValue;if(x4!==l)if(l={context:l,memoizedValue:u,next:null},S0===null){if(P_===null)throw Error(Ql(308));S0=l,P_.dependencies={lanes:0,firstContext:l}}else S0=S0.next=l;return u}var Ti=null;function g4(l){Ti===null?Ti=[l]:Ti.push(l)}function mJ(l,u,r,f){var n=u.interleaved;return n===null?(r.next=r,g4(u)):(r.next=n.next,n.next=r),u.interleaved=r,vn(l,f)}function vn(l,u){l.lanes|=u;var r=l.alternate;r!==null&&(r.lanes|=u),r=l;for(l=l.return;l!==null;)l.childLanes|=u,r=l.alternate,r!==null&&(r.childLanes|=u),r=l,l=l.return;return r.tag===3?r.stateNode:null}var Gt=!1;function k4(l){l.updateQueue={baseState:l.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function wJ(l,u){l=l.updateQueue,u.updateQueue===l&&(u.updateQueue={baseState:l.baseState,firstBaseUpdate:l.firstBaseUpdate,lastBaseUpdate:l.lastBaseUpdate,shared:l.shared,effects:l.effects})}function Rn(l,u){return{eventTime:l,lane:u,tag:0,payload:null,callback:null,next:null}}function Ht(l,u,r){var f=l.updateQueue;if(f===null)return null;if(f=f.shared,(Fu&2)!==0){var n=f.pending;return n===null?u.next=u:(u.next=n.next,n.next=u),f.pending=u,vn(l,r)}return n=f.interleaved,n===null?(u.next=u,g4(f)):(u.next=n.next,n.next=u),f.interleaved=u,vn(l,r)}function Q_(l,u,r){if(u=u.updateQueue,u!==null&&(u=u.shared,(r&4194240)!==0)){var f=u.lanes;f&=l.pendingLanes,r|=f,u.lanes=r,D4(l,r)}}function g7(l,u){var{updateQueue:r,alternate:f}=l;if(f!==null&&(f=f.updateQueue,r===f)){var n=null,t=null;if(r=r.firstBaseUpdate,r!==null){do{var i={eventTime:r.eventTime,lane:r.lane,tag:r.tag,payload:r.payload,callback:r.callback,next:null};t===null?n=t=i:t=t.next=i,r=r.next}while(r!==null);t===null?n=t=u:t=t.next=u}else n=t=u;r={baseState:f.baseState,firstBaseUpdate:n,lastBaseUpdate:t,shared:f.shared,effects:f.effects},l.updateQueue=r;return}l=r.lastBaseUpdate,l===null?r.firstBaseUpdate=u:l.next=u,r.lastBaseUpdate=u}function C_(l,u,r,f){var n=l.updateQueue;Gt=!1;var{firstBaseUpdate:t,lastBaseUpdate:i}=n,y=n.shared.pending;if(y!==null){n.shared.pending=null;var c=y,_=c.next;c.next=null,i===null?t=_:i.next=_,i=c;var A=l.alternate;A!==null&&(A=A.updateQueue,y=A.lastBaseUpdate,y!==i&&(y===null?A.firstBaseUpdate=_:y.next=_,A.lastBaseUpdate=c))}if(t!==null){var F=n.baseState;i=0,A=_=c=null,y=t;do{var{lane:j,eventTime:N}=y;if((f&j)===j){A!==null&&(A=A.next={eventTime:N,lane:0,tag:y.tag,payload:y.payload,callback:y.callback,next:null});l:{var U=l,w=y;switch(j=u,N=r,w.tag){case 1:if(U=w.payload,typeof U==="function"){F=U.call(N,F,j);break l}F=U;break l;case 3:U.flags=U.flags&-65537|128;case 0:if(U=w.payload,j=typeof U==="function"?U.call(N,F,j):U,j===null||j===void 0)break l;F=Pu({},F,j);break l;case 2:Gt=!0}}y.callback!==null&&y.lane!==0&&(l.flags|=64,j=n.effects,j===null?n.effects=[y]:j.push(y))}else N={eventTime:N,lane:j,tag:y.tag,payload:y.payload,callback:y.callback,next:null},A===null?(_=A=N,c=F):A=A.next=N,i|=j;if(y=y.next,y===null)if(y=n.shared.pending,y===null)break;else j=y,y=j.next,j.next=null,n.lastBaseUpdate=j,n.shared.pending=null}while(1);if(A===null&&(c=F),n.baseState=c,n.firstBaseUpdate=_,n.lastBaseUpdate=A,u=n.shared.interleaved,u!==null){n=u;do i|=n.lane,n=n.next;while(n!==u)}else t===null&&(n.shared.lanes=0);Hi|=i,l.lanes=i,l.memoizedState=F}}function k7(l,u,r){if(l=u.effects,u.effects=null,l!==null)for(u=0;ur?r:4,l(!0);var f=T6.transition;T6.transition={};try{l(!1),u()}finally{Uu=r,T6.transition=f}}function YJ(){return Bf().memoizedState}function tE(l,u,r){var f=Dt(l);if(r={lane:f,action:r,hasEagerState:!1,eagerState:null,next:null},XJ(l))PJ(u,r);else if(r=mJ(l,u,r,f),r!==null){var n=Sr();If(r,l,f,n),CJ(r,u,f)}}function iE(l,u,r){var f=Dt(l),n={lane:f,action:r,hasEagerState:!1,eagerState:null,next:null};if(XJ(l))PJ(u,n);else{var t=l.alternate;if(l.lanes===0&&(t===null||t.lanes===0)&&(t=u.lastRenderedReducer,t!==null))try{var i=u.lastRenderedState,y=t(i,r);if(n.hasEagerState=!0,n.eagerState=y,af(y,i)){var c=u.interleaved;c===null?(n.next=n,g4(u)):(n.next=c.next,c.next=n),u.interleaved=n;return}}catch(_){}finally{}r=mJ(l,u,n,f),r!==null&&(n=Sr(),If(r,l,f,n),CJ(r,u,f))}}function XJ(l){var u=l.alternate;return l===Xu||u!==null&&u===Xu}function PJ(l,u){Oc=M_=!0;var r=l.pending;r===null?u.next=u:(u.next=r.next,r.next=u),l.pending=u}function CJ(l,u,r){if((r&4194240)!==0){var f=u.lanes;f&=l.pendingLanes,r|=f,u.lanes=r,D4(l,r)}}var s_={readContext:Hf,useCallback:qr,useContext:qr,useEffect:qr,useImperativeHandle:qr,useInsertionEffect:qr,useLayoutEffect:qr,useMemo:qr,useReducer:qr,useRef:qr,useState:qr,useDebugValue:qr,useDeferredValue:qr,useTransition:qr,useMutableSource:qr,useSyncExternalStore:qr,useId:qr,unstable_isNewReconciler:!1},yE={readContext:Hf,useCallback:function(l,u){return Jn().memoizedState=[l,u===void 0?null:u],l},useContext:Hf,useEffect:a7,useImperativeHandle:function(l,u,r){return r=r!==null&&r!==void 0?r.concat([l]):null,w_(4194308,4,HJ.bind(null,u,l),r)},useLayoutEffect:function(l,u){return w_(4194308,4,l,u)},useInsertionEffect:function(l,u){return w_(4,2,l,u)},useMemo:function(l,u){var r=Jn();return u=u===void 0?null:u,l=l(),r.memoizedState=[l,u],l},useReducer:function(l,u,r){var f=Jn();return u=r!==void 0?r(u):u,f.memoizedState=f.baseState=u,l={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:l,lastRenderedState:u},f.queue=l,l=l.dispatch=tE.bind(null,Xu,l),[f.memoizedState,l]},useRef:function(l){var u=Jn();return l={current:l},u.memoizedState=l},useState:I7,useDebugValue:r2,useDeferredValue:function(l){return Jn().memoizedState=l},useTransition:function(){var l=I7(!1),u=l[0];return l=nE.bind(null,l[1]),Jn().memoizedState=l,[u,l]},useMutableSource:function(){},useSyncExternalStore:function(l,u,r){var f=Xu,n=Jn();if(Zu){if(r===void 0)throw Error(Ql(407));r=r()}else{if(r=u(),Ar===null)throw Error(Ql(349));(Zi&30)!==0||WJ(f,u,r)}n.memoizedState=r;var t={value:r,getSnapshot:u};return n.queue=t,a7(KJ.bind(null,f,t,l),[l]),f.flags|=2048,kc(9,TJ.bind(null,f,t,r,u),void 0,null),r},useId:function(){var l=Jn(),u=Ar.identifierPrefix;if(Zu){var r=sn,f=Mn;r=(f&~(1<<32-kf(f)-1)).toString(32)+r,u=":"+u+"R"+r,r=vc++,0")&&(c=c.replace("",l.displayName)),c}while(1<=i&&0<=y);break}}}finally{F6=!1,Error.prepareStackTrace=r}return(l=l?l.displayName||l.name:"")?Uc(l):""}function CT(l){switch(l.tag){case 5:return Uc(l.type);case 16:return Uc("Lazy");case 13:return Uc("Suspense");case 19:return Uc("SuspenseList");case 0:case 2:case 15:return l=j6(l.type,!1),l;case 11:return l=j6(l.type.render,!1),l;case 1:return l=j6(l.type,!0),l;default:return""}}function Y6(l){if(l==null)return null;if(typeof l==="function")return l.displayName||l.name||null;if(typeof l==="string")return l;switch(l){case p0:return"Fragment";case E0:return"Portal";case D6:return"Profiler";case O4:return"StrictMode";case V6:return"Suspense";case S6:return"SuspenseList"}if(typeof l==="object")switch(l.$$typeof){case qN:return(l.displayName||"Context")+".Consumer";case wN:return(l._context.displayName||"Context")+".Provider";case Z4:var u=l.render;return l=l.displayName,l||(l=u.displayName||u.name||"",l=l!==""?"ForwardRef("+l+")":"ForwardRef"),l;case H4:return u=l.displayName||null,u!==null?u:Y6(l.type)||"Memo";case Lt:u=l._payload,l=l._init;try{return Y6(l(u))}catch(r){}}return null}function hT(l){var u=l.type;switch(l.tag){case 24:return"Cache";case 9:return(u.displayName||"Context")+".Consumer";case 10:return(u._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return l=u.render,l=l.displayName||l.name||"",u.displayName||(l!==""?"ForwardRef("+l+")":"ForwardRef");case 7:return"Fragment";case 5:return u;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Y6(u);case 8:return u===O4?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof u==="function")return u.displayName||u.name||null;if(typeof u==="string")return u}return null}function St(l){switch(typeof l){case"boolean":case"number":case"string":case"undefined":return l;case"object":return l;default:return""}}function GN(l){var u=l.type;return(l=l.nodeName)&&l.toLowerCase()==="input"&&(u==="checkbox"||u==="radio")}function MT(l){var u=GN(l)?"checked":"value",r=Object.getOwnPropertyDescriptor(l.constructor.prototype,u),f=""+l[u];if(!l.hasOwnProperty(u)&&typeof r<"u"&&typeof r.get==="function"&&typeof r.set==="function"){var{get:n,set:t}=r;return Object.defineProperty(l,u,{configurable:!0,get:function(){return n.call(this)},set:function(i){f=""+i,t.call(this,i)}}),Object.defineProperty(l,u,{enumerable:r.enumerable}),{getValue:function(){return f},setValue:function(i){f=""+i},stopTracking:function(){l._valueTracker=null,delete l[u]}}}}function e$(l){l._valueTracker||(l._valueTracker=MT(l))}function WN(l){if(!l)return!1;var u=l._valueTracker;if(!u)return!0;var r=u.getValue(),f="";return l&&(f=GN(l)?l.checked?"true":"false":l.value),l=f,l!==r?(u.setValue(l),!0):!1}function T_(l){if(l=l||(typeof document<"u"?document:void 0),typeof l>"u")return null;try{return l.activeElement||l.body}catch(u){return l.body}}function X6(l,u){var r=u.checked;return Pu({},u,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:r!=null?r:l._wrapperState.initialChecked})}function Q7(l,u){var r=u.defaultValue==null?"":u.defaultValue,f=u.checked!=null?u.checked:u.defaultChecked;r=St(u.value!=null?u.value:r),l._wrapperState={initialChecked:f,initialValue:r,controlled:u.type==="checkbox"||u.type==="radio"?u.checked!=null:u.value!=null}}function TN(l,u){u=u.checked,u!=null&&z4(l,"checked",u,!1)}function P6(l,u){TN(l,u);var r=St(u.value),f=u.type;if(r!=null)if(f==="number"){if(r===0&&l.value===""||l.value!=r)l.value=""+r}else l.value!==""+r&&(l.value=""+r);else if(f==="submit"||f==="reset"){l.removeAttribute("value");return}u.hasOwnProperty("value")?C6(l,u.type,r):u.hasOwnProperty("defaultValue")&&C6(l,u.type,St(u.defaultValue)),u.checked==null&&u.defaultChecked!=null&&(l.defaultChecked=!!u.defaultChecked)}function m7(l,u,r){if(u.hasOwnProperty("value")||u.hasOwnProperty("defaultValue")){var f=u.type;if(!(f!=="submit"&&f!=="reset"||u.value!==void 0&&u.value!==null))return;u=""+l._wrapperState.initialValue,r||u===l.value||(l.value=u),l.defaultValue=u}r=l.name,r!==""&&(l.name=""),l.defaultChecked=!!l._wrapperState.initialChecked,r!==""&&(l.name=r)}function C6(l,u,r){if(u!=="number"||T_(l.ownerDocument)!==l)r==null?l.defaultValue=""+l._wrapperState.initialValue:l.defaultValue!==""+r&&(l.defaultValue=""+r)}var Qc=Array.isArray;function P0(l,u,r,f){if(l=l.options,u){u={};for(var n=0;n"+u.valueOf().toString()+"";for(u=l_.firstChild;l.firstChild;)l.removeChild(l.firstChild);for(;u.firstChild;)l.appendChild(u.firstChild)}});function Vc(l,u){if(u){var r=l.firstChild;if(r&&r===l.lastChild&&r.nodeType===3){r.nodeValue=u;return}}l.textContent=u}var Tc={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},sT=["Webkit","ms","Moz","O"];Object.keys(Tc).forEach(function(l){sT.forEach(function(u){u=u+l.charAt(0).toUpperCase()+l.substring(1),Tc[u]=Tc[l]})});function zN(l,u,r){return u==null||typeof u==="boolean"||u===""?"":r||typeof u!=="number"||u===0||Tc.hasOwnProperty(l)&&Tc[l]?(""+u).trim():u+"px"}function ON(l,u){l=l.style;for(var r in u)if(u.hasOwnProperty(r)){var f=r.indexOf("--")===0,n=zN(r,u[r],f);r==="float"&&(r="cssFloat"),f?l.setProperty(r,n):l[r]=n}}var RT=Pu({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function s6(l,u){if(u){if(RT[l]&&(u.children!=null||u.dangerouslySetInnerHTML!=null))throw Error(Ql(137,l));if(u.dangerouslySetInnerHTML!=null){if(u.children!=null)throw Error(Ql(60));if(typeof u.dangerouslySetInnerHTML!=="object"||!("__html"in u.dangerouslySetInnerHTML))throw Error(Ql(61))}if(u.style!=null&&typeof u.style!=="object")throw Error(Ql(62))}}function R6(l,u){if(l.indexOf("-")===-1)return typeof u.is==="string";switch(l){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var x6=null;function B4(l){return l=l.target||l.srcElement||window,l.correspondingUseElement&&(l=l.correspondingUseElement),l.nodeType===3?l.parentNode:l}var b6=null,C0=null,h0=null;function L7(l){if(l=dc(l)){if(typeof b6!=="function")throw Error(Ql(280));var u=l.stateNode;u&&(u=d_(u),b6(l.stateNode,l.type,u))}}function ZN(l){C0?h0?h0.push(l):h0=[l]:C0=l}function HN(){if(C0){var l=C0,u=h0;if(h0=C0=null,L7(l),u)for(l=0;l>>=0,l===0?32:31-(lK(l)/uK|0)|0}var u_=64,r_=4194304;function mc(l){switch(l&-l){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return l&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return l&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return l}}function z_(l,u){var r=l.pendingLanes;if(r===0)return 0;var f=0,n=l.suspendedLanes,t=l.pingedLanes,i=r&268435455;if(i!==0){var y=i&~n;y!==0?f=mc(y):(t&=i,t!==0&&(f=mc(t)))}else i=r&~n,i!==0?f=mc(i):t!==0&&(f=mc(t));if(f===0)return 0;if(u!==0&&u!==f&&(u&n)===0&&(n=f&-f,t=u&-u,n>=t||n===16&&(t&4194240)!==0))return u;if((f&4)!==0&&(f|=r&16),u=l.entangledLanes,u!==0)for(l=l.entanglements,u&=f;0r;r++)u.push(l);return u}function ac(l,u,r){l.pendingLanes|=u,u!==536870912&&(l.suspendedLanes=0,l.pingedLanes=0),l=l.eventTimes,u=31-kf(u),l[u]=r}function tK(l,u){var r=l.pendingLanes&~u;l.pendingLanes=u,l.suspendedLanes=0,l.pingedLanes=0,l.expiredLanes&=u,l.mutableReadLanes&=u,l.entangledLanes&=u,u=l.entanglements;var f=l.eventTimes;for(l=l.expirationTimes;0=Ec),Z7=String.fromCharCode(32),H7=!1;function oN(l,u){switch(l){case"keyup":return DK.indexOf(u.keyCode)!==-1;case"keydown":return u.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function dN(l){return l=l.detail,typeof l==="object"&&"data"in l?l.data:null}var z0=!1;function SK(l,u){switch(l){case"compositionend":return dN(u);case"keypress":if(u.which!==32)return null;return H7=!0,Z7;case"textInput":return l=u.data,l===Z7&&H7?null:l;default:return null}}function YK(l,u){if(z0)return l==="compositionend"||!h4&&oN(l,u)?(l=IN(),N_=X4=Kt=null,z0=!1,l):null;switch(l){case"paste":return null;case"keypress":if(!(u.ctrlKey||u.altKey||u.metaKey)||u.ctrlKey&&u.altKey){if(u.char&&1=u)return{node:r,offset:u-l};l=f}l:{for(;r;){if(r.nextSibling){r=r.nextSibling;break l}r=r.parentNode}r=void 0}r=V7(r)}}function rJ(l,u){return l&&u?l===u?!0:l&&l.nodeType===3?!1:u&&u.nodeType===3?rJ(l,u.parentNode):("contains"in l)?l.contains(u):l.compareDocumentPosition?!!(l.compareDocumentPosition(u)&16):!1:!1}function fJ(){for(var l=window,u=T_();u instanceof l.HTMLIFrameElement;){try{var r=typeof u.contentWindow.location.href==="string"}catch(f){r=!1}if(r)l=u.contentWindow;else break;u=T_(l.document)}return u}function M4(l){var u=l&&l.nodeName&&l.nodeName.toLowerCase();return u&&(u==="input"&&(l.type==="text"||l.type==="search"||l.type==="tel"||l.type==="url"||l.type==="password")||u==="textarea"||l.contentEditable==="true")}function bK(l){var u=fJ(),r=l.focusedElem,f=l.selectionRange;if(u!==r&&r&&r.ownerDocument&&rJ(r.ownerDocument.documentElement,r)){if(f!==null&&M4(r)){if(u=f.start,l=f.end,l===void 0&&(l=u),"selectionStart"in r)r.selectionStart=u,r.selectionEnd=Math.min(l,r.value.length);else if(l=(u=r.ownerDocument||document)&&u.defaultView||window,l.getSelection){l=l.getSelection();var n=r.textContent.length,t=Math.min(f.start,n);f=f.end===void 0?t:Math.min(f.end,n),!l.extend&&t>f&&(n=f,f=t,t=n),n=S7(r,t);var i=S7(r,f);n&&i&&(l.rangeCount!==1||l.anchorNode!==n.node||l.anchorOffset!==n.offset||l.focusNode!==i.node||l.focusOffset!==i.offset)&&(u=u.createRange(),u.setStart(n.node,n.offset),l.removeAllRanges(),t>f?(l.addRange(u),l.extend(i.node,i.offset)):(u.setEnd(i.node,i.offset),l.addRange(u)))}}u=[];for(l=r;l=l.parentNode;)l.nodeType===1&&u.push({element:l,left:l.scrollLeft,top:l.scrollTop});typeof r.focus==="function"&&r.focus();for(r=0;r=document.documentMode,O0=null,o6=null,zc=null,d6=!1;function Y7(l,u,r){var f=r.window===r?r.document:r.nodeType===9?r:r.ownerDocument;d6||O0==null||O0!==T_(f)||(f=O0,("selectionStart"in f)&&M4(f)?f={start:f.selectionStart,end:f.selectionEnd}:(f=(f.ownerDocument&&f.ownerDocument.defaultView||window).getSelection(),f={anchorNode:f.anchorNode,anchorOffset:f.anchorOffset,focusNode:f.focusNode,focusOffset:f.focusOffset}),zc&&hc(zc,f)||(zc=f,f=H_(o6,"onSelect"),0B0||(l.current=i4[B0],i4[B0]=null,B0--)}function Gu(l,u){B0++,i4[B0]=l.current,l.current=u}var Yt={},Wr=Pt(Yt),gr=Pt(!1),zi=Yt;function b0(l,u){var r=l.type.contextTypes;if(!r)return Yt;var f=l.stateNode;if(f&&f.__reactInternalMemoizedUnmaskedChildContext===u)return f.__reactInternalMemoizedMaskedChildContext;var n={},t;for(t in r)n[t]=u[t];return f&&(l=l.stateNode,l.__reactInternalMemoizedUnmaskedChildContext=u,l.__reactInternalMemoizedMaskedChildContext=n),n}function kr(l){return l=l.childContextTypes,l!==null&&l!==void 0}function D_(){Eu(gr),Eu(Wr)}function R7(l,u,r){if(Wr.current!==Yt)throw Error(Ql(168));Gu(Wr,u),Gu(gr,r)}function FJ(l,u,r){var f=l.stateNode;if(u=u.childContextTypes,typeof f.getChildContext!=="function")return r;f=f.getChildContext();for(var n in f)if(!(n in u))throw Error(Ql(108,hT(l)||"Unknown",n));return Pu({},r,f)}function V_(l){return l=(l=l.stateNode)&&l.__reactInternalMemoizedMergedChildContext||Yt,zi=Wr.current,Gu(Wr,l),Gu(gr,gr.current),!0}function x7(l,u,r){var f=l.stateNode;if(!f)throw Error(Ql(169));r?(l=FJ(l,u,zi),f.__reactInternalMemoizedMergedChildContext=l,Eu(gr),Eu(Wr),Gu(Wr,l)):Eu(gr),Gu(gr,r)}var hn=null,e_=!1,W6=!1;function jJ(l){hn===null?hn=[l]:hn.push(l)}function uE(l){e_=!0,jJ(l)}function Ct(){if(!W6&&hn!==null){W6=!0;var l=0,u=Uu;try{var r=hn;for(Uu=1;l>=i,n-=i,Mn=1<<32-kf(u)+n|r<Z?(V=O,O=null):V=O.sibling;var P=j(J,O,m[Z],q);if(P===null){O===null&&(O=V);break}l&&O&&P.alternate===null&&u(J,O),Q=t(P,Q,Z),p===null?W=P:p.sibling=P,p=P,O=V}if(Z===m.length)return r(J,O),Zu&&Li(J,Z),W;if(O===null){for(;ZZ?(V=O,O=null):V=O.sibling;var H=j(J,O,P.value,q);if(H===null){O===null&&(O=V);break}l&&O&&H.alternate===null&&u(J,O),Q=t(H,Q,Z),p===null?W=H:p.sibling=H,p=H,O=V}if(P.done)return r(J,O),Zu&&Li(J,Z),W;if(O===null){for(;!P.done;Z++,P=m.next())P=F(J,P.value,q),P!==null&&(Q=t(P,Q,Z),p===null?W=P:p.sibling=P,p=P);return Zu&&Li(J,Z),W}for(O=f(J,O);!P.done;Z++,P=m.next())P=N(O,J,Z,P.value,q),P!==null&&(l&&P.alternate!==null&&O.delete(P.key===null?Z:P.key),Q=t(P,Q,Z),p===null?W=P:p.sibling=P,p=P);return l&&O.forEach(function(B){return u(J,B)}),Zu&&Li(J,Z),W}function G(J,Q,m,q){if(typeof m==="object"&&m!==null&&m.type===p0&&m.key===null&&(m=m.props.children),typeof m==="object"&&m!==null){switch(m.$$typeof){case d$:l:{for(var W=m.key,p=Q;p!==null;){if(p.key===W){if(W=m.type,W===p0){if(p.tag===7){r(J,p.sibling),Q=n(p,m.props.children),Q.return=J,J=Q;break l}}else if(p.elementType===W||typeof W==="object"&&W!==null&&W.$$typeof===Lt&&g7(W)===p.type){r(J,p.sibling),Q=n(p,m.props),Q.ref=jc(J,p,m),Q.return=J,J=Q;break l}r(J,p);break}else u(J,p);p=p.sibling}m.type===p0?(Q=pi(m.props.children,J.mode,q,m.key),Q.return=J,J=Q):(q=W_(m.type,m.key,m.props,null,J.mode,q),q.ref=jc(J,Q,m),q.return=J,J=q)}return i(J);case E0:l:{for(p=m.key;Q!==null;){if(Q.key===p)if(Q.tag===4&&Q.stateNode.containerInfo===m.containerInfo&&Q.stateNode.implementation===m.implementation){r(J,Q.sibling),Q=n(Q,m.children||[]),Q.return=J,J=Q;break l}else{r(J,Q);break}else u(J,Q);Q=Q.sibling}Q=H6(m,J.mode,q),Q.return=J,J=Q}return i(J);case Lt:return p=m._init,G(J,Q,p(m._payload),q)}if(Qc(m))return U(J,Q,m,q);if($c(m))return w(J,Q,m,q);$_(J,m)}return typeof m==="string"&&m!==""||typeof m==="number"?(m=""+m,Q!==null&&Q.tag===6?(r(J,Q.sibling),Q=n(Q,m),Q.return=J,J=Q):(r(J,Q),Q=Z6(m,J.mode,q),Q.return=J,J=Q),i(J)):r(J,Q)}return G}var g0=QJ(!0),mJ=QJ(!1),X_=Pt(null),P_=null,S0=null,b4=null;function v4(){b4=S0=P_=null}function g4(l){var u=X_.current;Eu(X_),l._currentValue=u}function $4(l,u,r){for(;l!==null;){var f=l.alternate;if((l.childLanes&u)!==u?(l.childLanes|=u,f!==null&&(f.childLanes|=u)):f!==null&&(f.childLanes&u)!==u&&(f.childLanes|=u),l===r)break;l=l.return}}function s0(l,u){P_=l,b4=S0=null,l=l.dependencies,l!==null&&l.firstContext!==null&&((l.lanes&u)!==0&&(vr=!0),l.firstContext=null)}function Hf(l){var u=l._currentValue;if(b4!==l)if(l={context:l,memoizedValue:u,next:null},S0===null){if(P_===null)throw Error(Ql(308));S0=l,P_.dependencies={lanes:0,firstContext:l}}else S0=S0.next=l;return u}var Ti=null;function k4(l){Ti===null?Ti=[l]:Ti.push(l)}function wJ(l,u,r,f){var n=u.interleaved;return n===null?(r.next=r,k4(u)):(r.next=n.next,n.next=r),u.interleaved=r,vn(l,f)}function vn(l,u){l.lanes|=u;var r=l.alternate;r!==null&&(r.lanes|=u),r=l;for(l=l.return;l!==null;)l.childLanes|=u,r=l.alternate,r!==null&&(r.childLanes|=u),r=l,l=l.return;return r.tag===3?r.stateNode:null}var Gt=!1;function I4(l){l.updateQueue={baseState:l.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function qJ(l,u){l=l.updateQueue,u.updateQueue===l&&(u.updateQueue={baseState:l.baseState,firstBaseUpdate:l.firstBaseUpdate,lastBaseUpdate:l.lastBaseUpdate,shared:l.shared,effects:l.effects})}function Rn(l,u){return{eventTime:l,lane:u,tag:0,payload:null,callback:null,next:null}}function Ht(l,u,r){var f=l.updateQueue;if(f===null)return null;if(f=f.shared,(Fu&2)!==0){var n=f.pending;return n===null?u.next=u:(u.next=n.next,n.next=u),f.pending=u,vn(l,r)}return n=f.interleaved,n===null?(u.next=u,k4(f)):(u.next=n.next,n.next=u),f.interleaved=u,vn(l,r)}function Q_(l,u,r){if(u=u.updateQueue,u!==null&&(u=u.shared,(r&4194240)!==0)){var f=u.lanes;f&=l.pendingLanes,r|=f,u.lanes=r,V4(l,r)}}function k7(l,u){var{updateQueue:r,alternate:f}=l;if(f!==null&&(f=f.updateQueue,r===f)){var n=null,t=null;if(r=r.firstBaseUpdate,r!==null){do{var i={eventTime:r.eventTime,lane:r.lane,tag:r.tag,payload:r.payload,callback:r.callback,next:null};t===null?n=t=i:t=t.next=i,r=r.next}while(r!==null);t===null?n=t=u:t=t.next=u}else n=t=u;r={baseState:f.baseState,firstBaseUpdate:n,lastBaseUpdate:t,shared:f.shared,effects:f.effects},l.updateQueue=r;return}l=r.lastBaseUpdate,l===null?r.firstBaseUpdate=u:l.next=u,r.lastBaseUpdate=u}function C_(l,u,r,f){var n=l.updateQueue;Gt=!1;var{firstBaseUpdate:t,lastBaseUpdate:i}=n,y=n.shared.pending;if(y!==null){n.shared.pending=null;var c=y,_=c.next;c.next=null,i===null?t=_:i.next=_,i=c;var A=l.alternate;A!==null&&(A=A.updateQueue,y=A.lastBaseUpdate,y!==i&&(y===null?A.firstBaseUpdate=_:y.next=_,A.lastBaseUpdate=c))}if(t!==null){var F=n.baseState;i=0,A=_=c=null,y=t;do{var{lane:j,eventTime:N}=y;if((f&j)===j){A!==null&&(A=A.next={eventTime:N,lane:0,tag:y.tag,payload:y.payload,callback:y.callback,next:null});l:{var U=l,w=y;switch(j=u,N=r,w.tag){case 1:if(U=w.payload,typeof U==="function"){F=U.call(N,F,j);break l}F=U;break l;case 3:U.flags=U.flags&-65537|128;case 0:if(U=w.payload,j=typeof U==="function"?U.call(N,F,j):U,j===null||j===void 0)break l;F=Pu({},F,j);break l;case 2:Gt=!0}}y.callback!==null&&y.lane!==0&&(l.flags|=64,j=n.effects,j===null?n.effects=[y]:j.push(y))}else N={eventTime:N,lane:j,tag:y.tag,payload:y.payload,callback:y.callback,next:null},A===null?(_=A=N,c=F):A=A.next=N,i|=j;if(y=y.next,y===null)if(y=n.shared.pending,y===null)break;else j=y,y=j.next,j.next=null,n.lastBaseUpdate=j,n.shared.pending=null}while(1);if(A===null&&(c=F),n.baseState=c,n.firstBaseUpdate=_,n.lastBaseUpdate=A,u=n.shared.interleaved,u!==null){n=u;do i|=n.lane,n=n.next;while(n!==u)}else t===null&&(n.shared.lanes=0);Hi|=i,l.lanes=i,l.memoizedState=F}}function I7(l,u,r){if(l=u.effects,u.effects=null,l!==null)for(u=0;ur?r:4,l(!0);var f=K6.transition;K6.transition={};try{l(!1),u()}finally{Uu=r,K6.transition=f}}function XJ(){return Bf().memoizedState}function tE(l,u,r){var f=Dt(l);if(r={lane:f,action:r,hasEagerState:!1,eagerState:null,next:null},PJ(l))CJ(u,r);else if(r=wJ(l,u,r,f),r!==null){var n=Sr();If(r,l,f,n),hJ(r,u,f)}}function iE(l,u,r){var f=Dt(l),n={lane:f,action:r,hasEagerState:!1,eagerState:null,next:null};if(PJ(l))CJ(u,n);else{var t=l.alternate;if(l.lanes===0&&(t===null||t.lanes===0)&&(t=u.lastRenderedReducer,t!==null))try{var i=u.lastRenderedState,y=t(i,r);if(n.hasEagerState=!0,n.eagerState=y,af(y,i)){var c=u.interleaved;c===null?(n.next=n,k4(u)):(n.next=c.next,c.next=n),u.interleaved=n;return}}catch(_){}finally{}r=wJ(l,u,n,f),r!==null&&(n=Sr(),If(r,l,f,n),hJ(r,u,f))}}function PJ(l){var u=l.alternate;return l===Xu||u!==null&&u===Xu}function CJ(l,u){Oc=M_=!0;var r=l.pending;r===null?u.next=u:(u.next=r.next,r.next=u),l.pending=u}function hJ(l,u,r){if((r&4194240)!==0){var f=u.lanes;f&=l.pendingLanes,r|=f,u.lanes=r,V4(l,r)}}var s_={readContext:Hf,useCallback:qr,useContext:qr,useEffect:qr,useImperativeHandle:qr,useInsertionEffect:qr,useLayoutEffect:qr,useMemo:qr,useReducer:qr,useRef:qr,useState:qr,useDebugValue:qr,useDeferredValue:qr,useTransition:qr,useMutableSource:qr,useSyncExternalStore:qr,useId:qr,unstable_isNewReconciler:!1},yE={readContext:Hf,useCallback:function(l,u){return Jn().memoizedState=[l,u===void 0?null:u],l},useContext:Hf,useEffect:o7,useImperativeHandle:function(l,u,r){return r=r!==null&&r!==void 0?r.concat([l]):null,w_(4194308,4,BJ.bind(null,u,l),r)},useLayoutEffect:function(l,u){return w_(4194308,4,l,u)},useInsertionEffect:function(l,u){return w_(4,2,l,u)},useMemo:function(l,u){var r=Jn();return u=u===void 0?null:u,l=l(),r.memoizedState=[l,u],l},useReducer:function(l,u,r){var f=Jn();return u=r!==void 0?r(u):u,f.memoizedState=f.baseState=u,l={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:l,lastRenderedState:u},f.queue=l,l=l.dispatch=tE.bind(null,Xu,l),[f.memoizedState,l]},useRef:function(l){var u=Jn();return l={current:l},u.memoizedState=l},useState:a7,useDebugValue:f2,useDeferredValue:function(l){return Jn().memoizedState=l},useTransition:function(){var l=a7(!1),u=l[0];return l=nE.bind(null,l[1]),Jn().memoizedState=l,[u,l]},useMutableSource:function(){},useSyncExternalStore:function(l,u,r){var f=Xu,n=Jn();if(Zu){if(r===void 0)throw Error(Ql(407));r=r()}else{if(r=u(),Ar===null)throw Error(Ql(349));(Zi&30)!==0||TJ(f,u,r)}n.memoizedState=r;var t={value:r,getSnapshot:u};return n.queue=t,o7(EJ.bind(null,f,t,l),[l]),f.flags|=2048,kc(9,KJ.bind(null,f,t,r,u),void 0,null),r},useId:function(){var l=Jn(),u=Ar.identifierPrefix;if(Zu){var r=sn,f=Mn;r=(f&~(1<<32-kf(f)-1)).toString(32)+r,u=":"+u+"R"+r,r=vc++,0",l=l.removeChild(l.firstChild)):typeof f.is==="string"?l=i.createElement(r,{is:f.is}):(l=i.createElement(r),r==="select"&&(i=l,f.multiple?i.multiple=!0:f.size&&(i.size=f.size))):l=i.createElementNS(l,r),l[Un]=u,l[Rc]=f,IJ(l,u,!1,!1),u.stateNode=l;l:{switch(i=s6(r,f),r){case"dialog":Ku("cancel",l),Ku("close",l),n=f;break;case"iframe":case"object":case"embed":Ku("load",l),n=f;break;case"video":case"audio":for(n=0;na0&&(u.flags|=128,f=!0,Nc(t,!1),u.lanes=4194304)}else{if(!f)if(l=h_(i),l!==null){if(u.flags|=128,f=!0,r=l.updateQueue,r!==null&&(u.updateQueue=r,u.flags|=4),Nc(t,!0),t.tail===null&&t.tailMode==="hidden"&&!i.alternate&&!Zu)return Lr(u),null}else 2*Iu()-t.renderingStartTime>a0&&r!==1073741824&&(u.flags|=128,f=!0,Nc(t,!1),u.lanes=4194304);t.isBackwards?(i.sibling=u.child,u.child=i):(r=t.last,r!==null?r.sibling=i:u.child=i,t.last=i)}if(t.tail!==null)return u=t.tail,t.rendering=u,t.tail=u.sibling,t.renderingStartTime=Iu(),u.sibling=null,r=Yu.current,Gu(Yu,f?r&1|2:r&1),u;return Lr(u),null;case 22:case 23:return c2(),f=u.memoizedState!==null,l!==null&&l.memoizedState!==null!==f&&(u.flags|=8192),f&&(u.mode&1)!==0?(Af&1073741824)!==0&&(Lr(u),u.subtreeFlags&6&&(u.flags|=8192)):Lr(u),null;case 24:return null;case 25:return null}throw Error(Ql(156,u.tag))}function JE(l,u){switch(s4(u),u.tag){case 1:return kr(u.type)&&D_(),l=u.flags,l&65536?(u.flags=l&-65537|128,u):null;case 3:return k0(),Eu(gr),Eu(Wr),o4(),l=u.flags,(l&65536)!==0&&(l&128)===0?(u.flags=l&-65537|128,u):null;case 5:return a4(u),null;case 13:if(Eu(Yu),l=u.memoizedState,l!==null&&l.dehydrated!==null){if(u.alternate===null)throw Error(Ql(340));v0()}return l=u.flags,l&65536?(u.flags=l&-65537|128,u):null;case 19:return Eu(Yu),null;case 4:return k0(),null;case 10:return v4(u.type._context),null;case 22:case 23:return c2(),null;case 24:return null;default:return null}}var A_=!1,Gr=!1,UE=typeof WeakSet==="function"?WeakSet:Set,Bl=null;function Y0(l,u){var r=l.ref;if(r!==null)if(typeof r==="function")try{r(null)}catch(f){Ru(l,u,f)}else r.current=null}function Q4(l,u,r){try{r()}catch(f){Ru(l,u,f)}}var yN=!1;function QE(l,u){if(l4=O_,l=rJ(),h4(l)){if("selectionStart"in l)var r={start:l.selectionStart,end:l.selectionEnd};else l:{r=(r=l.ownerDocument)&&r.defaultView||window;var f=r.getSelection&&r.getSelection();if(f&&f.rangeCount!==0){r=f.anchorNode;var{anchorOffset:n,focusNode:t}=f;f=f.focusOffset;try{r.nodeType,t.nodeType}catch(q){r=null;break l}var i=0,y=-1,c=-1,_=0,A=0,F=l,j=null;u:for(;;){for(var N;;){if(F!==r||n!==0&&F.nodeType!==3||(y=i+n),F!==t||f!==0&&F.nodeType!==3||(c=i+f),F.nodeType===3&&(i+=F.nodeValue.length),(N=F.firstChild)===null)break;j=F,F=N}for(;;){if(F===l)break u;if(j===r&&++_===n&&(y=i),j===t&&++A===f&&(c=i),(N=F.nextSibling)!==null)break;F=j,j=F.parentNode}F=N}r=y===-1||c===-1?null:{start:y,end:c}}else r=null}r=r||{start:0,end:0}}else r=null;u4={focusedElem:l,selectionRange:r},O_=!1;for(Bl=u;Bl!==null;)if(u=Bl,l=u.child,(u.subtreeFlags&1028)!==0&&l!==null)l.return=u,Bl=l;else for(;Bl!==null;){u=Bl;try{var U=u.alternate;if((u.flags&1024)!==0)switch(u.tag){case 0:case 11:case 15:break;case 1:if(U!==null){var{memoizedProps:w,memoizedState:G}=U,J=u.stateNode,Q=J.getSnapshotBeforeUpdate(u.elementType===u.type?w:bf(u.type,w),G);J.__reactInternalSnapshotBeforeUpdate=Q}break;case 3:var m=u.stateNode.containerInfo;m.nodeType===1?m.textContent="":m.nodeType===9&&m.documentElement&&m.removeChild(m.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(Ql(163))}}catch(q){Ru(u,u.return,q)}if(l=u.sibling,l!==null){l.return=u.return,Bl=l;break}Bl=u.return}return U=yN,yN=!1,U}function Zc(l,u,r){var f=u.updateQueue;if(f=f!==null?f.lastEffect:null,f!==null){var n=f=f.next;do{if((n.tag&l)===l){var t=n.destroy;n.destroy=void 0,t!==void 0&&Q4(u,r,t)}n=n.next}while(n!==f)}}function r3(l,u){if(u=u.updateQueue,u=u!==null?u.lastEffect:null,u!==null){var r=u=u.next;do{if((r.tag&l)===l){var f=r.create;r.destroy=f()}r=r.next}while(r!==u)}}function m4(l){var u=l.ref;if(u!==null){var r=l.stateNode;switch(l.tag){case 5:l=r;break;default:l=r}typeof u==="function"?u(l):u.current=l}}function dJ(l){var u=l.alternate;u!==null&&(l.alternate=null,dJ(u)),l.child=null,l.deletions=null,l.sibling=null,l.tag===5&&(u=l.stateNode,u!==null&&(delete u[Un],delete u[Rc],delete u[n4],delete u[eK],delete u[lE])),l.stateNode=null,l.return=null,l.dependencies=null,l.memoizedProps=null,l.memoizedState=null,l.pendingProps=null,l.stateNode=null,l.updateQueue=null}function eJ(l){return l.tag===5||l.tag===3||l.tag===4}function cN(l){l:for(;;){for(;l.sibling===null;){if(l.return===null||eJ(l.return))return null;l=l.return}l.sibling.return=l.return;for(l=l.sibling;l.tag!==5&&l.tag!==6&&l.tag!==18;){if(l.flags&2)continue l;if(l.child===null||l.tag===4)continue l;else l.child.return=l,l=l.child}if(!(l.flags&2))return l.stateNode}}function w4(l,u,r){var f=l.tag;if(f===5||f===6)l=l.stateNode,u?r.nodeType===8?r.parentNode.insertBefore(l,u):r.insertBefore(l,u):(r.nodeType===8?(u=r.parentNode,u.insertBefore(l,r)):(u=r,u.appendChild(l)),r=r._reactRootContainer,r!==null&&r!==void 0||u.onclick!==null||(u.onclick=B_));else if(f!==4&&(l=l.child,l!==null))for(w4(l,u,r),l=l.sibling;l!==null;)w4(l,u,r),l=l.sibling}function q4(l,u,r){var f=l.tag;if(f===5||f===6)l=l.stateNode,u?r.insertBefore(l,u):r.appendChild(l);else if(f!==4&&(l=l.child,l!==null))for(q4(l,u,r),l=l.sibling;l!==null;)q4(l,u,r),l=l.sibling}var Fr=null,vf=!1;function qt(l,u,r){for(r=r.child;r!==null;)lU(l,u,r),r=r.sibling}function lU(l,u,r){if(Qn&&typeof Qn.onCommitFiberUnmount==="function")try{Qn.onCommitFiberUnmount(k_,r)}catch(y){}switch(r.tag){case 5:Gr||Y0(r,u);case 6:var f=Fr,n=vf;Fr=null,qt(l,u,r),Fr=f,vf=n,Fr!==null&&(vf?(l=Fr,r=r.stateNode,l.nodeType===8?l.parentNode.removeChild(r):l.removeChild(r)):Fr.removeChild(r.stateNode));break;case 18:Fr!==null&&(vf?(l=Fr,r=r.stateNode,l.nodeType===8?L6(l.parentNode,r):l.nodeType===1&&L6(l,r),Pc(l)):L6(Fr,r.stateNode));break;case 4:f=Fr,n=vf,Fr=r.stateNode.containerInfo,vf=!0,qt(l,u,r),Fr=f,vf=n;break;case 0:case 11:case 14:case 15:if(!Gr&&(f=r.updateQueue,f!==null&&(f=f.lastEffect,f!==null))){n=f=f.next;do{var t=n,i=t.destroy;t=t.tag,i!==void 0&&((t&2)!==0?Q4(r,u,i):(t&4)!==0&&Q4(r,u,i)),n=n.next}while(n!==f)}qt(l,u,r);break;case 1:if(!Gr&&(Y0(r,u),f=r.stateNode,typeof f.componentWillUnmount==="function"))try{f.props=r.memoizedProps,f.state=r.memoizedState,f.componentWillUnmount()}catch(y){Ru(r,u,y)}qt(l,u,r);break;case 21:qt(l,u,r);break;case 22:r.mode&1?(Gr=(f=Gr)||r.memoizedState!==null,qt(l,u,r),Gr=f):qt(l,u,r);break;default:qt(l,u,r)}}function $N(l){var u=l.updateQueue;if(u!==null){l.updateQueue=null;var r=l.stateNode;r===null&&(r=l.stateNode=new UE),u.forEach(function(f){var n=EE.bind(null,l,f);r.has(f)||(r.add(f),f.then(n,n))})}}function xf(l,u){var r=u.deletions;if(r!==null)for(var f=0;fn&&(n=i),f&=~t}if(f=n,f=Iu()-f,f=(120>f?120:480>f?480:1080>f?1080:1920>f?1920:3000>f?3000:4320>f?4320:1960*wE(f/1960))-f,10l?16:l,Et===null)var f=!1;else{if(l=Et,Et=null,b_=0,(Fu&6)!==0)throw Error(Ql(331));var n=Fu;Fu|=4;for(Bl=l.current;Bl!==null;){var t=Bl,i=t.child;if((Bl.flags&16)!==0){var y=t.deletions;if(y!==null){for(var c=0;cIu()-i2?Ei(l,0):t2|=r),Ir(l,u)}function cU(l,u){u===0&&((l.mode&1)===0?u=1:(u=r_,r_<<=1,(r_&130023424)===0&&(r_=4194304)));var r=Sr();l=vn(l,u),l!==null&&(ac(l,u,r),Ir(l,r))}function KE(l){var u=l.memoizedState,r=0;u!==null&&(r=u.retryLane),cU(l,r)}function EE(l,u){var r=0;switch(l.tag){case 13:var{stateNode:f,memoizedState:n}=l;n!==null&&(r=n.retryLane);break;case 19:f=l.stateNode;break;default:throw Error(Ql(314))}f!==null&&f.delete(u),cU(l,r)}var $U;$U=function(l,u,r){if(l!==null)if(l.memoizedProps!==u.pendingProps||gr.current)vr=!0;else{if((l.lanes&r)===0&&(u.flags&128)===0)return vr=!1,jE(l,u,r);vr=(l.flags&131072)!==0?!0:!1}else vr=!1,Zu&&(u.flags&1048576)!==0&&jJ(u,Y_,u.index);switch(u.lanes=0,u.tag){case 2:var f=u.type;q_(l,u),l=u.pendingProps;var n=b0(u,Wr.current);s0(u,r),n=e4(null,u,f,l,n,r);var t=l2();return u.flags|=1,typeof n==="object"&&n!==null&&typeof n.render==="function"&&n.$$typeof===void 0?(u.tag=1,u.memoizedState=null,u.updateQueue=null,kr(f)?(t=!0,V_(u)):t=!1,u.memoizedState=n.state!==null&&n.state!==void 0?n.state:null,k4(u),n.updater=u3,u.stateNode=n,n._reactInternals=u,_4(u,f,l,r),u=j4(null,u,f,!0,t,r)):(u.tag=0,Zu&&t&&M4(u),Vr(null,u,n,r),u=u.child),u;case 16:f=u.elementType;l:{switch(q_(l,u),l=u.pendingProps,n=f._init,f=n(f._payload),u.type=f,n=u.tag=zE(f),l=bf(f,l),n){case 0:u=F4(null,u,f,l,r);break l;case 1:u=nN(null,u,f,l,r);break l;case 11:u=rN(null,u,f,l,r);break l;case 14:u=fN(null,u,f,bf(f.type,l),r);break l}throw Error(Ql(306,f,""))}return u;case 0:return f=u.type,n=u.pendingProps,n=u.elementType===f?n:bf(f,n),F4(l,u,f,n,r);case 1:return f=u.type,n=u.pendingProps,n=u.elementType===f?n:bf(f,n),nN(l,u,f,n,r);case 3:l:{if(vJ(u),l===null)throw Error(Ql(387));f=u.pendingProps,t=u.memoizedState,n=t.element,wJ(l,u),C_(u,f,null,r);var i=u.memoizedState;if(f=i.element,t.isDehydrated)if(t={element:f,isDehydrated:!1,cache:i.cache,pendingSuspenseBoundaries:i.pendingSuspenseBoundaries,transitions:i.transitions},u.updateQueue.baseState=t,u.memoizedState=t,u.flags&256){n=I0(Error(Ql(423)),u),u=tN(l,u,f,r,n);break l}else if(f!==n){n=I0(Error(Ql(424)),u),u=tN(l,u,f,r,n);break l}else for(Ff=Zt(u.stateNode.containerInfo.firstChild),jf=u,Zu=!0,gf=null,r=QJ(u,null,f,r),u.child=r;r;)r.flags=r.flags&-3|4096,r=r.sibling;else{if(v0(),f===n){u=gn(l,u,r);break l}Vr(l,u,f,r)}u=u.child}return u;case 5:return qJ(u),l===null&&y4(u),f=u.type,n=u.pendingProps,t=l!==null?l.memoizedProps:null,i=n.children,r4(f,n)?i=null:t!==null&&r4(f,t)&&(u.flags|=32),bJ(l,u),Vr(l,u,i,r),u.child;case 6:return l===null&&y4(u),null;case 13:return gJ(l,u,r);case 4:return I4(u,u.stateNode.containerInfo),f=u.pendingProps,l===null?u.child=g0(u,null,f,r):Vr(l,u,f,r),u.child;case 11:return f=u.type,n=u.pendingProps,n=u.elementType===f?n:bf(f,n),rN(l,u,f,n,r);case 7:return Vr(l,u,u.pendingProps,r),u.child;case 8:return Vr(l,u,u.pendingProps.children,r),u.child;case 12:return Vr(l,u,u.pendingProps.children,r),u.child;case 10:l:{if(f=u.type._context,n=u.pendingProps,t=u.memoizedProps,i=n.value,Gu(X_,f._currentValue),f._currentValue=i,t!==null)if(af(t.value,i)){if(t.children===n.children&&!gr.current){u=gn(l,u,r);break l}}else for(t=u.child,t!==null&&(t.return=u);t!==null;){var y=t.dependencies;if(y!==null){i=t.child;for(var c=y.firstContext;c!==null;){if(c.context===f){if(t.tag===1){c=Rn(-1,r&-r),c.tag=2;var _=t.updateQueue;if(_!==null){_=_.shared;var A=_.pending;A===null?c.next=c:(c.next=A.next,A.next=c),_.pending=c}}t.lanes|=r,c=t.alternate,c!==null&&(c.lanes|=r),c4(t.return,r,u),y.lanes|=r;break}c=c.next}}else if(t.tag===10)i=t.type===u.type?null:t.child;else if(t.tag===18){if(i=t.return,i===null)throw Error(Ql(341));i.lanes|=r,y=i.alternate,y!==null&&(y.lanes|=r),c4(i,r,u),i=t.sibling}else i=t.child;if(i!==null)i.return=t;else for(i=t;i!==null;){if(i===u){i=null;break}if(t=i.sibling,t!==null){t.return=i.return,i=t;break}i=i.return}t=i}Vr(l,u,n.children,r),u=u.child}return u;case 9:return n=u.type,f=u.pendingProps.children,s0(u,r),n=Hf(n),f=f(n),u.flags|=1,Vr(l,u,f,r),u.child;case 14:return f=u.type,n=bf(f,u.pendingProps),n=bf(f.type,n),fN(l,u,f,n,r);case 15:return RJ(l,u,u.type,u.pendingProps,r);case 17:return f=u.type,n=u.pendingProps,n=u.elementType===f?n:bf(f,n),q_(l,u),u.tag=1,kr(f)?(l=!0,V_(u)):l=!1,s0(u,r),hJ(u,f,n),_4(u,f,n,r),j4(null,u,f,!0,l,r);case 19:return kJ(l,u,r);case 22:return xJ(l,u,r)}throw Error(Ql(156,u.tag))};function _U(l,u){return XN(l,u)}function pE(l,u,r,f){this.tag=l,this.key=r,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=u,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=f,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Of(l,u,r,f){return new pE(l,u,r,f)}function _2(l){return l=l.prototype,!(!l||!l.isReactComponent)}function zE(l){if(typeof l==="function")return _2(l)?1:0;if(l!==void 0&&l!==null){if(l=l.$$typeof,l===O4)return 11;if(l===Z4)return 14}return 2}function Vt(l,u){var r=l.alternate;return r===null?(r=Of(l.tag,u,l.key,l.mode),r.elementType=l.elementType,r.type=l.type,r.stateNode=l.stateNode,r.alternate=l,l.alternate=r):(r.pendingProps=u,r.type=l.type,r.flags=0,r.subtreeFlags=0,r.deletions=null),r.flags=l.flags&14680064,r.childLanes=l.childLanes,r.lanes=l.lanes,r.child=l.child,r.memoizedProps=l.memoizedProps,r.memoizedState=l.memoizedState,r.updateQueue=l.updateQueue,u=l.dependencies,r.dependencies=u===null?null:{lanes:u.lanes,firstContext:u.firstContext},r.sibling=l.sibling,r.index=l.index,r.ref=l.ref,r}function W_(l,u,r,f,n,t){var i=2;if(f=l,typeof l==="function")_2(l)&&(i=1);else if(typeof l==="string")i=5;else l:switch(l){case p0:return pi(r.children,n,t,u);case z4:i=8,n|=8;break;case B6:return l=Of(12,r,u,n|2),l.elementType=B6,l.lanes=t,l;case D6:return l=Of(13,r,u,n),l.elementType=D6,l.lanes=t,l;case V6:return l=Of(19,r,u,n),l.elementType=V6,l.lanes=t,l;case qN:return n3(r,n,t,u);default:if(typeof l==="object"&&l!==null)switch(l.$$typeof){case mN:i=10;break l;case wN:i=9;break l;case O4:i=11;break l;case Z4:i=14;break l;case Lt:i=16,f=null;break l}throw Error(Ql(130,l==null?l:typeof l,""))}return u=Of(i,r,u,n),u.elementType=l,u.type=f,u.lanes=t,u}function pi(l,u,r,f){return l=Of(7,l,f,u),l.lanes=r,l}function n3(l,u,r,f){return l=Of(22,l,f,u),l.elementType=qN,l.lanes=r,l.stateNode={isHidden:!1},l}function O6(l,u,r){return l=Of(6,l,null,u),l.lanes=r,l}function Z6(l,u,r){return u=Of(4,l.children!==null?l.children:[],l.key,u),u.lanes=r,u.stateNode={containerInfo:l.containerInfo,pendingChildren:null,implementation:l.implementation},u}function OE(l,u,r,f,n){this.tag=u,this.containerInfo=l,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=N6(0),this.expirationTimes=N6(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=N6(0),this.identifierPrefix=f,this.onRecoverableError=n,this.mutableSourceEagerHydrationData=null}function A2(l,u,r,f,n,t,i,y,c){return l=new OE(l,u,r,y,c),u===1?(u=1,t===!0&&(u|=8)):u=0,t=Of(3,null,null,u),l.current=t,t.stateNode=l,t.memoizedState={element:f,isDehydrated:r,cache:null,transitions:null,pendingSuspenseBoundaries:null},k4(t),l}function ZE(l,u,r){var f=3{function JU(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=="function")return;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(JU)}catch(l){console.error(l)}}JU(),UU.exports=NU()});var mU=_f((U2)=>{var QU=J2();U2.createRoot=QU.createRoot,U2.hydrateRoot=QU.hydrateRoot;var SE});var Vm=_f((fA)=>{var EZ=Ju(),pZ=Symbol.for("react.element"),zZ=Symbol.for("react.fragment"),OZ=Object.prototype.hasOwnProperty,ZZ=EZ.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,HZ={key:!0,ref:!0,__self:!0,__source:!0};function Dm(l,u,r){var f,n={},t=null,i=null;r!==void 0&&(t=""+r),u.key!==void 0&&(t=""+u.key),u.ref!==void 0&&(i=u.ref);for(f in u)OZ.call(u,f)&&!HZ.hasOwnProperty(f)&&(n[f]=u[f]);if(l&&l.defaultProps)for(f in u=l.defaultProps,u)n[f]===void 0&&(n[f]=u[f]);return{$$typeof:pZ,type:l,key:t,ref:i,props:n,_owner:ZZ.current}}fA.Fragment=zZ;fA.jsx=Dm;fA.jsxs=Dm});var Ym=_f((bh,Sm)=>{Sm.exports=Vm()});var jq=_f((Fq)=>{var Py=Ju();function kD(l,u){return l===u&&(l!==0||1/l===1/u)||l!==l&&u!==u}var ID=typeof Object.is==="function"?Object.is:kD,aD=Py.useState,oD=Py.useEffect,dD=Py.useLayoutEffect,eD=Py.useDebugValue;function lV(l,u){var r=u(),f=aD({inst:{value:r,getSnapshot:u}}),n=f[0].inst,t=f[1];return dD(function(){n.value=r,n.getSnapshot=u,qF(n)&&t({inst:n})},[l,r,u]),oD(function(){return qF(n)&&t({inst:n}),l(function(){qF(n)&&t({inst:n})})},[l]),eD(r),r}function qF(l){var u=l.getSnapshot;l=l.value;try{var r=u();return!ID(l,r)}catch(f){return!0}}function uV(l,u){return u()}var rV=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?uV:lV;Fq.useSyncExternalStore=Py.useSyncExternalStore!==void 0?Py.useSyncExternalStore:rV});var Jq=_f((Pv,Nq)=>{Nq.exports=jq()});var Qq=_f((Uq)=>{var aA=Ju(),fV=Jq();function nV(l,u){return l===u&&(l!==0||1/l===1/u)||l!==l&&u!==u}var tV=typeof Object.is==="function"?Object.is:nV,iV=fV.useSyncExternalStore,yV=aA.useRef,cV=aA.useEffect,$V=aA.useMemo,_V=aA.useDebugValue;Uq.useSyncExternalStoreWithSelector=function(l,u,r,f,n){var t=yV(null);if(t.current===null){var i={hasValue:!1,value:null};t.current=i}else i=t.current;t=$V(function(){function c(N){if(!_){if(_=!0,A=N,N=f(N),n!==void 0&&i.hasValue){var U=i.value;if(n(U,N))return F=U}return F=N}if(U=F,tV(A,N))return U;var w=f(N);if(n!==void 0&&n(U,w))return A=N,U;return A=N,F=w}var _=!1,A,F,j=r===void 0?null:r;return[function(){return c(u())},j===null?void 0:function(){return c(j())}]},[u,r,f,n]);var y=iV(l,t[0],t[1]);return cV(function(){i.hasValue=!0,i.value=y},[y]),_V(y),y}});var wq=_f((hv,mq)=>{mq.exports=Qq()});var Ni=Ml(Ju(),1);var x$="北京时间";var ZT={timeZone:"Asia/Shanghai",hour12:!1},HT={timeZone:"Asia/Shanghai",hour12:!1},BT=new Intl.DateTimeFormat("en-CA",{timeZone:"Asia/Shanghai",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",hourCycle:"h23"});function d8(l){if(l===null||l===void 0||l==="")return null;let u=l instanceof Date?l:new Date(l);return Number.isNaN(u.getTime())?null:u}function u7(l){let u=d8(l);if(!u)return null;return BT.formatToParts(u).reduce((r,f)=>{if(f.type!=="literal")r[f.type]=f.value;return r},{})}function Ll(l){let u=d8(l);return u?u.toLocaleString("zh-CN",ZT):"--"}function iu(l){let u=d8(l);return u?u.toLocaleTimeString("zh-CN",HT):"--"}function e8(l){let u=u7(l);if(!u)return"";let r=u.hour==="24"?"00":u.hour;return`${u.year}-${u.month}-${u.day}T${r}:${u.minute}`}function r7(l=new Date){let u=u7(l);if(!u)return"";return`${u.year}-${u.month}-${u.day}`}function f7(l){if(!l)return null;let u=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(?::(\d{2}))?$/.exec(l);if(!u)return null;let[,r,f,n,t,i,y="00"]=u,c=Date.UTC(Number(r),Number(f)-1,Number(n),Number(t)-8,Number(i),Number(y)),_=new Date(c),A=e8(_);return Number.isNaN(_.getTime())||A!==`${r}-${f}-${n}T${t}:${i}`?null:_.toISOString()}var gG=Ml(mU(),1);var A3=Ml(Ju(),1);var wU=Ml(Ju(),1),l1=wU.default.createElement;function YE({active:l=!0,label:u="正在加载"}){if(!l)return null;return l1("span",{className:"loading-spinner-indicator",role:"status","aria-label":u,title:u,"data-testid":"loading-title-indicator"},l1("span",{className:"loading-spinner-ring","aria-hidden":!0}))}function nu({title:l,children:u,loading:r,level:f=2,className:n="",label:t="正在加载"}){return l1(f===3?"h3":"h2",{className:`loading-title ${r?"is-loading":""} ${n}`.trim()},l1("span",{className:"loading-title-text"},u??l),l1(YE,{active:Boolean(r),label:t}))}class e0 extends Error{unideskRequestError=!0;meta;constructor(l,u){super(l);this.name="UniDeskRequestError",this.meta=u}}function XE(l){return new Promise((u)=>setTimeout(u,l))}function f1(l,u="操作失败"){return l instanceof Error?l.message:String(l||u)}function $3(l,u=500){if(l===null||l===void 0)return"";let r=typeof l==="string"?l:JSON.stringify(l),f=String(r||"").replace(/\s+/gu," ").trim();return f.length>u?`${f.slice(0,u)}...`:f}function PE(l){try{let u=typeof location<"u"&&location.origin?location.origin:"http://localhost";return new URL(l,u).toString()}catch{return l}}function qU(l){return String(l.method||"GET").toUpperCase()}function CE(l){if(l===null||l===void 0)return!1;if(typeof l!=="object")return!1;if(typeof Blob<"u"&&l instanceof Blob)return!1;if(typeof FormData<"u"&&l instanceof FormData)return!1;if(typeof URLSearchParams<"u"&&l instanceof URLSearchParams)return!1;if(typeof ArrayBuffer<"u"&&l instanceof ArrayBuffer)return!1;return!0}function LU(l){let u=new Headers(l.headers||{}),r=CE(l.body)?JSON.stringify(l.body):l.body;if(r&&!u.has("content-type")&&typeof r==="string")u.set("content-type","application/json");return{...l,credentials:l.credentials||"same-origin",body:r,headers:u}}function GU(l){if(l?.error&&typeof l.error==="object"&&typeof l.error.message==="string")return l.error.message;if(typeof l?.error==="string")return l.error;if(typeof l?.message==="string")return l.message;if(typeof l?.detail==="string")return l.detail;return""}function hE(l,u){if(!l||typeof l!=="object"||Array.isArray(l))return!1;return u.some((r)=>r!==!1&&l[r]===!1)}function u1(l,u,r,f,n={}){return{kind:l,method:r,url:PE(u),occurredAt:f.toISOString(),...n}}function r1(l,u){if(!l)return"请求失败";return`HTTP ${l}${u?` ${u}`:""}`}function WU(l){try{return{body:l?JSON.parse(l):null,parseError:""}}catch(u){return{body:{text:l},parseError:f1(u,"parse failed")}}}async function Tl(l,u={},r=0){let{failureFields:f=["ok"],strictJson:n=!1,retryInvalidJson:t=0,retryDelayMs:i=120,invalidJsonPrefix:y="服务返回了无效 JSON",invalidJsonPreview:c=!1,responsePreviewLength:_=500,...A}=u,F=qU(A),j=new Date,N;try{N=await fetch(l,LU(A))}catch(G){let J=f1(G,"网络请求失败");throw new e0(J,u1("network",l,F,j,{upstreamMessage:J}))}let U=await N.text(),w=WU(U);if(w.parseError){if(n&&F==="GET"&&r=300)?r1(l.meta.status,l.meta.statusText):"应用请求失败",t=l.meta.status?r1(l.meta.status):"",i=(c)=>!c||c===n||c===t,y=!i(l.message)?l.message:i(l.meta.upstreamMessage)?"":l.meta.upstreamMessage||"";return{title:n,message:y,status:l.meta.status,statusText:l.meta.statusText,method:l.meta.method,url:l.meta.url,occurredAt:ME(l.meta.occurredAt),responsePreview:l.meta.responsePreview,parseError:l.meta.parseError,structured:!0}}let f=f1(l,u).split(/\r?\n/u);return{title:f[0]||u,message:f.slice(1).join(` -`),structured:f.length>1}}function sE(l,u="操作失败"){let r=Q2(l,u),f=[r.title];if(r.message)f.push(`原因: ${r.message}`);if(r.method||r.url)f.push(`请求: ${[r.method,r.url].filter(Boolean).join(" ")}`);if(r.status)f.push(`状态: ${r1(r.status,r.statusText)}`);if(r.occurredAt)f.push(`时间: ${r.occurredAt}`);if(r.parseError)f.push(`解析错误: ${r.parseError}`);if(r.responsePreview&&r.responsePreview!==r.message)f.push(`响应预览: ${r.responsePreview}`);return f.filter(Boolean).join(` -`)}function zl(l,u="操作失败"){return KU(l)?sE(l,u):f1(l,u)}var EU=Ml(Ju(),1);var ht=EU.default.createElement;function n1(l,u){return u?[ht("dt",{key:`${l}-label`},l),ht("dd",{key:l},u)]:null}function el({error:l,wide:u=!1,fallback:r="操作失败",className:f=""}){if(!l)return null;let n=Q2(l,r),t=[n1("请求",[n.method,n.url].filter(Boolean).join(" ")),n1("状态",n.status?`HTTP ${n.status}${n.statusText?` ${n.statusText}`:""}`:""),n1("时间",n.occurredAt),n1("解析错误",n.parseError),n1("响应预览",n.responsePreview)].filter(Boolean);return ht("div",{className:`form-error unidesk-error${u?" wide":""}${f?` ${f}`:""}`,role:"alert","data-testid":"unidesk-error"},ht("div",{className:"unidesk-error-title"},ht("strong",null,n.title),n.status?ht("span",{className:"unidesk-error-code"},`HTTP ${n.status}`):null),n.message?ht("pre",{className:"unidesk-error-message"},n.message):null,t.length>0?ht("dl",{className:"unidesk-error-details"},t):null)}var wn=Ml(Ju(),1),pU=wn.default.createContext(null);function zU({children:l}){let[u,r]=wn.default.useState([]),[f,n]=wn.default.useState(Date.now()),t=wn.default.useCallback((F,j)=>{let U={id:`notif_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,type:F,message:j,timestamp:Date.now()};r((w)=>{let G=[...w,U];if(G.length>50)return G.slice(-50);return G})},[]),i=wn.default.useCallback((F)=>{r((j)=>j.filter((N)=>N.id!==F))},[]),y=wn.default.useCallback(()=>{r([]),n(Date.now())},[]),c=wn.default.useMemo(()=>{return u.filter((F)=>F.timestamp>f).length},[u,f]),_=c>0,A={notifications:u,addNotification:t,removeNotification:i,clearNotifications:y,unreadCount:c,hasUnread:_};return RE(pU.Provider,{value:A},l)}var RE=wn.default.createElement;function Xr(){let l=wn.default.useContext(pU);if(!l)throw Error("useNotification must be used within NotificationProvider");return l}var b=A3.default.createElement,{useEffect:_3}=A3.default,ly=A3.default.useState;function Tr(l,u={}){return Tl(l,{failureFields:["ok","success"],...u})}function Pr(l,u){return`${l}/microservices/baidu-netdisk/proxy${u}`}function xE(l){let u=Number(l);return Number.isFinite(u)?u.toLocaleString("zh-CN"):"--"}function Mt(l){let u=Number(l);if(!Number.isFinite(u)||u<=0)return"--";let r=["B","KB","MB","GB","TB"],f=u,n=0;while(f>=1024&&n{n?.stopPropagation?.(),r(l,u)}},"查看原始JSON")}function ry({title:l,text:u}){return b("div",{className:"empty-state"},b("strong",null,l),b("span",null,u))}function fy({title:l,text:u,href:r,badge:f,testId:n}){return b("a",{className:"doc-link-card",href:r,target:"_blank",rel:"noreferrer","data-testid":n},b("span",null,f||"DOC"),b("strong",null,l),b("p",null,u),b("code",null,r))}function bE(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function vE(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function gE(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function kE(l){return Array.isArray(l?.files)?l.files:[]}function IE(l){return Array.isArray(l?.jobs)?l.jobs:[]}function aE(l,u){if(!l||l===u)return u;let r=l.replace(/\/+$/u,""),f=r.slice(0,r.lastIndexOf("/"))||u;return f.lengths.id==="baidu-netdisk")||null,[n,t]=ly({loading:!1,actionLoading:!1,error:"",message:"",health:null,account:null,files:null,transfers:null,logs:null,selfTest:null,refreshedAt:null}),[i,y]=ly("/"),[c,_]=ly(null),[A,F]=ly(""),[j,N]=ly({localPath:"sample.txt",remotePath:"/sample.txt"}),[U,w]=ly({fsId:"",localPath:"downloads/"}),{addNotification:G}=Xr(),J=n.health?.baidu?.appRoot||n.account?.rootPath||"/";_3(()=>{N((s)=>{let ul=new Set(["/sample.txt","/apps/UniDeskBaiduNetdisk/sample.txt"]);if(s.remotePath&&!ul.has(s.remotePath))return s;let tl=m2(J,"sample.txt");return s.remotePath===tl?s:{...s,remotePath:tl}})},[J]);async function Q(s=i){let tl=await Tr(Pr(r,`/api/files?dir=${encodeURIComponent(s||J)}&limit=100`));t((Al)=>({...Al,files:tl}))}async function m(){let s=await Tr(Pr(r,"/api/transfers?limit=80"));t((ul)=>({...ul,transfers:s}))}async function q(){if(!f)return;t((s)=>({...s,loading:!0,error:"",message:""}));try{let s=await Tr(`${r}/microservices/baidu-netdisk/health`),ul=s?.baidu?.appRoot||J,tl=null,Al=null;if(s?.auth?.loggedIn){tl=await Tr(Pr(r,"/api/account?refresh=1"));let El=i&&i.startsWith(ul)?i:ul;y(El),Al=await Tr(Pr(r,`/api/files?dir=${encodeURIComponent(El)}&limit=100`))}else y(ul);let Kl=await Tr(Pr(r,"/api/transfers?limit=80")),wl=await Tr(Pr(r,"/logs?limit=60"));t((El)=>({...El,loading:!1,health:s,account:tl?.account||null,files:Al,transfers:Kl,logs:wl,refreshedAt:new Date}))}catch(s){t((ul)=>({...ul,loading:!1,error:zl(s,"百度网盘服务加载失败")}))}}async function W(){t((s)=>({...s,actionLoading:!0,error:"",message:""}));try{let s=await Tr(Pr(r,"/api/auth/device/start"),{method:"POST",body:{}});_(s.session||null),t((ul)=>({...ul,actionLoading:!1,message:"设备码已生成,请扫码授权"}))}catch(s){t((ul)=>({...ul,actionLoading:!1,error:zl(s,"创建设备码失败")}))}}async function p(s=!1){if(!c?.id)return;if(s)t((ul)=>({...ul,actionLoading:!0,error:""}));try{let ul=await Tr(Pr(r,`/api/auth/device/status?sessionId=${encodeURIComponent(c.id)}`));if(_(ul.session||null),ul.session?.status==="succeeded")t((tl)=>({...tl,actionLoading:!1,message:"授权成功,正在刷新账号与文件列表"})),await q();else if(s)t((tl)=>({...tl,actionLoading:!1}))}catch(ul){t((tl)=>({...tl,actionLoading:!1,error:zl(ul,"轮询登录状态失败")}))}}async function O(){t((s)=>({...s,actionLoading:!0,error:"",message:""}));try{await Tr(Pr(r,"/api/auth/logout"),{method:"POST",body:{}}),_(null),t((s)=>({...s,actionLoading:!1,account:null,files:null,message:"本地 token 已清除"})),await q()}catch(s){t((ul)=>({...ul,actionLoading:!1,error:zl(s,"退出登录失败")}))}}async function Z(s){s.preventDefault();let ul=A.trim();if(!ul)return;t((tl)=>({...tl,actionLoading:!0,error:"",message:""}));try{await Tr(Pr(r,"/api/folders"),{method:"POST",body:{path:m2(i,ul)}}),F(""),t((tl)=>({...tl,actionLoading:!1,message:"文件夹已创建"})),await Q(i)}catch(tl){t((Al)=>({...Al,actionLoading:!1,error:zl(tl,"创建文件夹失败")}))}}async function V(s){if(!s)return;t((ul)=>({...ul,actionLoading:!0,error:"",message:""}));try{await Tr(Pr(r,"/api/files/manage"),{method:"POST",body:{opera:"delete",filelist:[{path:s}],async:1}}),t((ul)=>({...ul,actionLoading:!1,message:"删除任务已提交"})),await Q(i)}catch(ul){t((tl)=>({...tl,actionLoading:!1,error:zl(ul,"删除失败")}))}}async function P(s){s.preventDefault(),t((ul)=>({...ul,actionLoading:!0,error:"",message:""}));try{await Tr(Pr(r,"/api/transfers/upload-from-path"),{method:"POST",body:j}),t((ul)=>({...ul,actionLoading:!1,message:"上传任务已入队"})),await m()}catch(ul){t((tl)=>({...tl,actionLoading:!1,error:zl(ul,"上传任务创建失败")}))}}async function H(s){s.preventDefault(),t((ul)=>({...ul,actionLoading:!0,error:"",message:""}));try{await Tr(Pr(r,"/api/transfers/download-to-path"),{method:"POST",body:U}),t((ul)=>({...ul,actionLoading:!1,message:"下载任务已入队"})),await m()}catch(ul){t((tl)=>({...tl,actionLoading:!1,error:zl(ul,"下载任务创建失败")}))}}async function B(s,ul){t((tl)=>({...tl,actionLoading:!0,error:"",message:""}));try{await Tr(Pr(r,`/api/transfers/${encodeURIComponent(s)}/${ul}`),{method:"POST",body:{}}),t((tl)=>({...tl,actionLoading:!1,message:ul==="cancel"?"已请求取消任务":"任务已重新入队"})),await m()}catch(tl){t((Al)=>({...Al,actionLoading:!1,error:zl(tl,"任务操作失败")}))}}async function C(){t((s)=>({...s,actionLoading:!0,error:"",message:"正在运行上传/下载自测..."}));try{let s=await Tr(Pr(r,"/api/self-test"),{method:"POST",body:{}});t((ul)=>({...ul,actionLoading:!1,selfTest:s,message:`上传/下载自测通过:${s.remotePath||""}`})),await Q(i),await m()}catch(s){t((ul)=>({...ul,actionLoading:!1,error:zl(s,"上传/下载自测失败")}))}}if(_3(()=>{if(!f)return;q();return},[f?.id,f?.runtime?.providerStatus]),_3(()=>{if(!c?.id||c.status!=="pending")return;let s=window.setInterval(()=>void p(!1),Math.max(5000,Number(c.pollIntervalSeconds||5)*1000));return()=>window.clearInterval(s)},[c?.id,c?.status,c?.pollIntervalSeconds]),_3(()=>{if(!f)return;let s=window.setInterval(()=>void m(),5000);return()=>window.clearInterval(s)},[f?.id]),!f)return b(ry,{title:"Baidu Netdisk 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=baidu-netdisk"});let E=bE(f),D=gE(f),Y=vE(f),v=n.health||{},K=n.account||v.auth?.account||null,X=v.auth||{},I=kE(n.files),o=IE(n.transfers),fl=K?.quota||{},yl=Boolean(X.loggedIn||K),h=Boolean(X.configured);return b("div",{className:"baidu-netdisk-page","data-testid":"baidu-netdisk-page"},b(Yi,{title:"Baidu Netdisk 工作台",eyebrow:"Containerized Storage Gateway",loading:n.loading,actions:b("div",{className:"panel-actions"},b("a",{className:"ghost-btn",href:"/docs/issue/baidu-netdisk-env-setup.md",target:"_blank",rel:"noreferrer","data-testid":"baidu-netdisk-config-doc-link"},"配置文档"),b("button",{type:"button",className:"ghost-btn",onClick:q,disabled:n.loading,"data-testid":"baidu-netdisk-refresh"},n.loading?"刷新中":"刷新"),b(In,{title:"Baidu Netdisk 用户服务",data:f,onOpen:u,testId:"raw-baidu-netdisk-service"}))},b("div",{className:"baidu-netdisk-hero"},b("div",null,b("div",{className:"node-version-line"},b(Si,{status:E.providerStatus==="online"?"online":"warn"},E.providerStatus||"unknown"),b("span",null,f.providerId),b(Si,{status:Y.public?"warn":"private"},Y.public?"公网暴露":"仅 UniDesk frontend 代理访问")),b("p",{className:"muted paragraph"},f.description)),b("div",{className:"microservice-ref-card"},b("span",null,"Repo"),b("strong",null,D.url||"--"),b("code",null,D.commitId||"--")),b("div",{className:"microservice-ref-card"},b("span",null,"Private Backend"),b("strong",null,`${Y.nodeBindHost||"--"}:${Y.nodePort||"--"}`),b("code",null,`${D.composeFile||"--"} / ${D.composeService||"--"}`))),b(el,{error:n.error,wide:!0})),b("div",{className:"metric-grid"},b(uy,{label:"Health",value:v.ok?"OK":"--",hint:v.storage?.postgres||"postgres",tone:v.ok?"ok":"warn"}),b(uy,{label:"OAuth",value:h?"已配置":"待配置",hint:h?"client + secret + token key":"需要设置 UNIDESK_BAIDU_NETDISK_*",tone:h?"ok":"warn"}),b(uy,{label:"Login",value:yl?"已登录":"未登录",hint:K?.username||"Device Code QR",tone:yl?"ok":"warn"}),b(uy,{label:"Work Root",value:oE(J),hint:J}),b(uy,{label:"Quota",value:Mt(fl.used),hint:fl.total?`${fl.usedPercent||0}% / ${Mt(fl.total)}`:"授权后刷新"}),b(uy,{label:"Transfers",value:xE(o.length),hint:`running ${n.transfers?.counts?.running||0} / failed ${n.transfers?.counts?.failed||0}`})),b(Yi,{title:"文件浏览器",eyebrow:i,className:"baidu-files-panel",loading:n.loading,actions:b("div",{className:"panel-actions inline-actions"},b("button",{type:"button",className:"ghost-btn",onClick:()=>{let s=aE(i,J);y(s),Q(s)},disabled:!yl||i===J},"上级"),b("button",{type:"button",className:"ghost-btn",onClick:()=>Q(i),disabled:!yl},"刷新文件"),b(In,{title:"Baidu Files",data:n.files,onOpen:u,testId:"raw-baidu-files"}))},b("form",{className:"baidu-pathbar",onSubmit:(s)=>{s.preventDefault(),Q(i)}},b("input",{value:i,onChange:(s)=>y(s.target.value),disabled:!yl}),b("button",{type:"submit",className:"ghost-btn",disabled:!yl},"打开路径")),b("form",{className:"baidu-pathbar",onSubmit:Z},b("input",{value:A,onChange:(s)=>F(s.target.value),placeholder:"新文件夹名称",disabled:!yl}),b("button",{type:"submit",className:"primary-btn",disabled:!yl||!A.trim()},"新建文件夹")),!yl?b(ry,{title:"等待授权",text:"登录后通过 /api/files 读取工作目录文件列表"}):I.length===0?b(ry,{title:"目录为空",text:"可以从 staging 目录上传文件或新建文件夹"}):b("div",{className:"table-wrap","data-testid":"baidu-netdisk-file-table"},b("table",null,b("thead",null,b("tr",null,b("th",null,"名称"),b("th",null,"类型"),b("th",null,"大小"),b("th",null,"修改时间"),b("th",null,"fs_id"),b("th",null,"操作"))),b("tbody",null,I.map((s)=>b("tr",{key:s.fsId||s.path},b("td",null,b("strong",null,s.serverFilename||s.path),b("code",null,s.path||"--")),b("td",null,b(Si,{status:s.isDir?"queued":"private"},s.isDir?"DIR":"FILE")),b("td",null,s.isDir?"--":Mt(s.size)),b("td",null,s.serverMtime?Ll(s.serverMtime*1000):"--"),b("td",null,b("code",null,s.fsId||"--")),b("td",null,b("div",{className:"inline-actions"},s.isDir?b("button",{type:"button",className:"ghost-btn",onClick:()=>{y(s.path),Q(s.path)}},"打开"):b("button",{type:"button",className:"ghost-btn",onClick:()=>w((ul)=>({...ul,fsId:s.fsId}))},"填入下载"),b("button",{type:"button",className:"ghost-btn",onClick:()=>V(s.path),disabled:n.actionLoading},"删除"))))))))),b("div",{className:"baidu-netdisk-grid"},b(Yi,{title:"配置与文档",eyebrow:"Deployment References",className:"baidu-docs-panel",actions:b("div",{className:"panel-actions inline-actions"},b("a",{className:"ghost-btn",href:"/docs/issue/baidu-netdisk-env-setup.md",target:"_blank",rel:"noreferrer"},"打开环境配置"),b("a",{className:"ghost-btn",href:"/docs/issue/baidu-netdisk-user-service.md",target:"_blank",rel:"noreferrer"},"打开服务方案"))},b("p",{className:"muted paragraph"},h?"OAuth 运行时变量已配置;如需轮换密钥、迁移部署或排查代理边界,可直接打开下面的项目内文档。":"首次使用请先按环境变量配置文档填入百度应用 client id / secret,然后重建 baidu-netdisk 服务并刷新本页。"),b("div",{className:"baidu-doc-grid","data-testid":"baidu-netdisk-doc-links"},b(fy,{title:"环境变量配置",text:"填写 UNIDESK_BAIDU_NETDISK_CLIENT_ID、CLIENT_SECRET、TOKEN_KEY,并执行重建与健康检查。",href:"/docs/issue/baidu-netdisk-env-setup.md",badge:"SETUP",testId:"baidu-netdisk-env-doc-card"}),b(fy,{title:"服务方案与 API",text:"说明 OAuth Device Code、根目录工作区、staging 上传下载任务和后端 API 设计。",href:"/docs/issue/baidu-netdisk-user-service.md",badge:"DESIGN"}),b(fy,{title:"用户服务安全边界",text:"查看 UniDesk microservice 私有代理、允许路径、frontendOnly 和密钥边界规则。",href:"/docs/reference/microservices.md",badge:"REF"}),b(fy,{title:"部署与重建流程",text:"查看 server rebuild、Compose 编排、健康检查和交付验证的长期规则。",href:"/docs/reference/deployment.md",badge:"DEPLOY"}),b(fy,{title:"CLI 验证命令",text:"查看 microservice health/proxy、server rebuild、job status 等命令入口。",href:"/docs/reference/cli.md",badge:"CLI"}),b(fy,{title:"百度设备码模式",text:"打开百度官方 OAuth Device Code 文档,对照扫码登录和轮询参数。",href:"https://pan.baidu.com/union/doc/fl1x114ti",badge:"OFFICIAL"}))),b(Yi,{title:"设备码登录",eyebrow:"OAuth Device Code",className:"baidu-login-panel",loading:n.actionLoading,actions:b("div",{className:"panel-actions inline-actions"},b("button",{type:"button",className:"primary-btn",onClick:W,disabled:n.actionLoading||!h,"data-testid":"baidu-netdisk-start-login"},"生成二维码"),c?.id?b("button",{type:"button",className:"ghost-btn",onClick:()=>p(!0),disabled:n.actionLoading},"检查状态"):null,yl?b("button",{type:"button",className:"ghost-btn",onClick:O,disabled:n.actionLoading},"清除本地登录"):null,b(In,{title:"Baidu Device Session",data:c||X.latestSession,onOpen:u,testId:"raw-baidu-device-session"}))},b("div",{className:"baidu-login-card","data-testid":"baidu-netdisk-login-card"},b("div",{className:"baidu-qr-frame"},c?.qrcodeUrl?b("img",{src:c.qrcodeUrl,alt:"百度网盘设备码授权二维码","data-testid":"baidu-netdisk-qrcode"}):b(ry,{title:h?"等待二维码":"OAuth 未配置",text:h?"点击生成二维码后使用百度网盘或百度 App 扫码":"设置 client id、secret 和 token key 后重建服务"})),b("div",{className:"claudeqq-login-copy"},b("div",{className:"node-version-line"},b(Si,{status:yl?"online":c?.status==="pending"?"warn":"unknown"},yl?"已登录":c?.status||"未开始"),b("span",null,c?.secondsRemaining!==void 0?`${c.secondsRemaining}s`:"--"),b("span",null,"scope basic,netdisk")),b("p",{className:"muted paragraph"},yl?"access token / refresh token 已加密保存到 PostgreSQL;前端只看到脱敏登录态。":"后端使用百度 OAuth Device Code 轮询换取 token;二维码过期后重新生成即可。"),b("div",{className:"microservice-ref-card"},b("span",null,"User Code"),b("strong",null,c?.userCode||"--"),b("code",null,c?.verificationUrl||"https://openapi.baidu.com/device")),b("div",{className:"microservice-ref-card"},b("span",null,"Expires"),b("strong",null,c?.expiresAt?Ll(c.expiresAt):"--"),b("code",null,c?.error||"no token exposed"))))),b(Yi,{title:"账号与容量",eyebrow:n.refreshedAt?`Updated ${iu(n.refreshedAt)}`:"Account",loading:n.loading,actions:b("div",{className:"panel-actions inline-actions"},b(In,{title:"Baidu Account",data:K,onOpen:u,testId:"raw-baidu-account"}))},K?b("div",{className:"baidu-account-card"},b("div",{className:"node-version-line"},b(Si,{status:"online"},"connected"),b("span",null,K.baiduUid||"--"),b("span",null,`VIP ${K.vipType??"--"}`)),b("h3",null,K.username||"Baidu Netdisk"),b("p",{className:"muted paragraph"},`工作目录固定在 ${K.rootPath||J};v1 上传/下载只读写容器 staging 目录,不把大文件字节流穿过 UniDesk proxy。`),b("div",{className:"quota-bar"},b("span",{style:{width:`${Math.max(0,Math.min(100,Number(fl.usedPercent||0)))}%`}})),b("div",{className:"microservice-ref-card"},b("span",null,"Quota"),b("strong",null,`${Mt(fl.used)} / ${Mt(fl.total)}`),b("code",null,`${fl.usedPercent||0}% used`))):b(ry,{title:"尚未登录",text:"扫码授权后这里会显示账号、UID、会员状态和容量"})),b(Yi,{title:"传输任务",eyebrow:"staging path jobs",className:"baidu-transfers-panel",loading:n.actionLoading,actions:b("div",{className:"panel-actions inline-actions"},b("button",{type:"button",className:"primary-btn",onClick:C,disabled:!yl||n.actionLoading,"data-testid":"baidu-netdisk-self-test"},"运行自测"),b("button",{type:"button",className:"ghost-btn",onClick:m},"刷新任务"),b(In,{title:"Baidu Transfers",data:n.transfers,onOpen:u,testId:"raw-baidu-transfers"}))},b("div",{className:"baidu-transfer-forms"},b("form",{className:"stack-form",onSubmit:P,"data-testid":"baidu-upload-form"},b("label",null,"容器 staging 文件",b("input",{value:j.localPath,onChange:(s)=>N((ul)=>({...ul,localPath:s.target.value})),placeholder:"sample.txt"})),b("label",null,"百度网盘目标路径",b("input",{value:j.remotePath,onChange:(s)=>N((ul)=>({...ul,remotePath:s.target.value})),placeholder:m2(J,"sample.txt")})),b("button",{type:"submit",className:"primary-btn",disabled:!yl||n.actionLoading},"上传 staging 文件")),b("form",{className:"stack-form",onSubmit:H,"data-testid":"baidu-download-form"},b("label",null,"文件 fs_id",b("input",{value:U.fsId,onChange:(s)=>w((ul)=>({...ul,fsId:s.target.value})),placeholder:"从文件表填入"})),b("label",null,"保存到 staging 路径",b("input",{value:U.localPath,onChange:(s)=>w((ul)=>({...ul,localPath:s.target.value})),placeholder:"downloads/"})),b("button",{type:"submit",className:"primary-btn",disabled:!yl||!U.fsId||n.actionLoading},"下载到 staging"))),n.selfTest?b("div",{className:"baidu-account-card","data-testid":"baidu-netdisk-self-test-result"},b("div",{className:"node-version-line"},b(Si,{status:n.selfTest.ok?"online":"warn"},n.selfTest.ok?"self-test ok":"self-test"),b("span",null,Mt(n.selfTest.sizeBytes))),b("h3",null,n.selfTest.remotePath||"Baidu self-test"),b("div",{className:"microservice-ref-card"},b("span",null,"fs_id"),b("strong",null,n.selfTest.fsId||"--"),b("code",null,n.selfTest.downloadedPath||"--")),b("div",{className:"microservice-ref-card"},b("span",null,"MD5"),b("strong",null,n.selfTest.downloadedMd5||"--"),b("code",null,n.selfTest.expectedMd5||"--")),b(In,{title:"Baidu Self Test",data:n.selfTest,onOpen:u,testId:"raw-baidu-self-test"})):null,o.length===0?b(ry,{title:"暂无传输任务",text:"上传/下载任务会在后端容器内执行,避免大文件穿过 UniDesk proxy"}):b("div",{className:"table-wrap","data-testid":"baidu-transfer-table"},b("table",null,b("thead",null,b("tr",null,b("th",null,"状态"),b("th",null,"方向"),b("th",null,"路径"),b("th",null,"进度"),b("th",null,"时间"),b("th",null,"操作"))),b("tbody",null,o.map((s)=>b("tr",{key:s.id},b("td",null,b(Si,{status:s.status},s.status)),b("td",null,s.direction),b("td",null,b("strong",null,s.remotePath||s.fsId||"--"),b("code",null,s.localPath||"--"),s.error?b("span",{className:"form-error"},s.error):null),b("td",null,b(dE,{percent:s.progressPercent}),b("span",{className:"muted"},`${Mt(s.bytesDone)} / ${Mt(s.sizeBytes)}`)),b("td",null,Ll(s.updatedAt)),b("td",null,b("div",{className:"inline-actions"},["queued","running"].includes(s.status)?b("button",{type:"button",className:"ghost-btn",onClick:()=>B(s.id,"cancel")},"取消"):null,["failed","canceled"].includes(s.status)?b("button",{type:"button",className:"ghost-btn",onClick:()=>B(s.id,"retry")},"重试"):null,b(In,{title:`Transfer ${s.id}`,data:s,onOpen:u}))))))))),b(Yi,{title:"安全与日志",eyebrow:"redacted diagnostics",className:"baidu-wide-panel",loading:n.loading,actions:b("div",{className:"panel-actions inline-actions"},b(In,{title:"Baidu Health",data:v,onOpen:u,testId:"raw-baidu-health"}),b(In,{title:"Baidu Logs",data:n.logs,onOpen:u,testId:"raw-baidu-logs"}))},b("div",{className:"policy-grid"},b("article",null,b("b",null,"私有后端"),b("span",null,"4244 只在 Compose 网络 expose,浏览器经 UniDesk 同源代理访问")),b("article",null,b("b",null,"Token 加密"),b("span",null,"access/refresh token 使用 BAIDU_NETDISK_TOKEN_KEY 加密后写入 PostgreSQL")),b("article",null,b("b",null,"无浏览器大文件流"),b("span",null,"上传/下载以容器 staging 目录为边界,避免 proxy 文本通道传输大字节流"))))))}var N3=Ml(Ju(),1);var ll=N3.default.createElement,{useEffect:eE}=N3.default,F3=N3.default.useState,Xi={label:"主用户私聊账号",userId:645275593};function w2(l){let u=Number(l);return Number.isFinite(u)?u.toLocaleString("zh-CN"):"--"}async function st(l,u={}){return Tl(l,{failureFields:["ok","success"],...u})}async function lp(l){let u=await fetch(l,{credentials:"same-origin"}),r=await u.text();try{return r?JSON.parse(r):{ok:u.ok,status:u.status}}catch{return{ok:u.ok,status:u.status,text:r}}}function j3({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return ll("span",{className:`status-badge ${r}`},u||l||"unknown")}function ny({label:l,value:u,hint:r,tone:f}){return ll("article",{className:`metric-card ${f||""}`},ll("div",{className:"metric-label"},l),ll("div",{className:"metric-value"},u),ll("div",{className:"metric-hint"},r))}function ty({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return ll("section",{className:`panel ${n||""}`},ll("div",{className:"panel-head"},ll("div",null,u?ll("p",{className:"panel-eyebrow"},u):null,ll(nu,{title:l,loading:t})),r?ll("div",{className:"panel-actions"},r):null),ll("div",{className:"panel-body"},f))}function t1({title:l,data:u,onOpen:r,testId:f}){return ll("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:(n)=>{n?.stopPropagation?.(),r(l,u)}},"查看原始JSON")}function i1({title:l,text:u}){return ll("div",{className:"empty-state"},ll("strong",null,l),ll("span",null,u))}function up(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function rp(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function fp(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function Rt(l,u){return`${l}/microservices/claudeqq/proxy${u}`}function np(l){return Array.isArray(l?.events)?l.events.slice(0,80):[]}function tp(l){return Array.isArray(l?.subscriptions)?l.subscriptions.slice(0,50):[]}function ip(l){return Array.isArray(l?.messages)?l.messages.slice(0,30):[]}function ZU(l){let u=l?.text??l?.message??l?.raw?.raw_message;if(typeof u!=="string")return"--";return u.length>180?`${u.slice(0,177)}...`:u}function HU(l){let u=l?.groupId??l?.group_id??(l?.message_type==="group"?l?.target_id:void 0),r=l?.userId??l?.user_id??(l?.message_type==="private"?l?.target_id:void 0);if(u)return`群 ${u}`;if(r)return`私聊 ${r}`;return"--"}function BU({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((K)=>K.id==="claudeqq")||null,[n,t]=F3({loading:!1,qrLoading:!1,error:"",health:null,status:null,napcatLogin:null,napcatQrcode:null,qrcodeFetched:!1,qrcodeRefreshedAt:null,events:null,subscriptions:null,sent:null,refreshedAt:null}),[i,y]=F3({targetType:"private",targetId:String(Xi.userId),message:""}),[c,_]=F3({name:"unidesk-callback",targetUrl:"",eventTypes:"message",secret:""}),[A,F]=F3(""),{addNotification:j}=Xr();async function N(){if(!f)return;t((K)=>({...K,loading:!0,error:""}));try{let[K,X,I,o,fl]=await Promise.all([lp(`${r}/microservices/claudeqq/health`),st(Rt(r,"/api/server/status")),st(Rt(r,"/api/events/recent?limit=60")),st(Rt(r,"/api/events/subscriptions")),st(Rt(r,"/api/messages/sent?limit=20"))]);if(t((yl)=>({...yl,loading:!1,error:"",health:K,status:X,events:I,subscriptions:o,sent:fl,refreshedAt:new Date})),!n.qrcodeFetched)U(!1)}catch(K){t((X)=>({...X,loading:!1,error:zl(K,"ClaudeQQ 加载失败")}))}}async function U(K=!0){if(!f)return;t((X)=>({...X,qrLoading:!0,error:K?"":X.error}));try{let X=await st(Rt(r,"/api/napcat/login")),I=X?.napcat?.qrcode||X?.qrcode||null;t((o)=>({...o,qrLoading:!1,error:"",napcatLogin:X,napcatQrcode:I,qrcodeFetched:!0,qrcodeRefreshedAt:new Date}))}catch(X){t((I)=>({...I,qrLoading:!1,error:K||!I.napcatQrcode?zl(X,"NapCat 二维码加载失败"):I.error}))}}async function w(K){K.preventDefault(),F("");let X=Number(i.targetId);if(!Number.isFinite(X)||X<=0||i.message.trim().length===0){t((I)=>({...I,error:"请填写 QQ 目标和消息内容"}));return}try{await st(Rt(r,"/api/push/text"),{method:"POST",body:JSON.stringify({userId:i.targetType==="private"?X:void 0,groupId:i.targetType==="group"?X:void 0,message:i.message})});let I="消息推送请求已提交";y((o)=>({...o,targetType:"private",targetId:String(Xi.userId),message:""})),F(I),j("success",I),await N()}catch(I){t((o)=>({...o,error:zl(I,"发送失败")}))}}async function G(K){if(K.preventDefault(),F(""),c.targetUrl.trim().length===0){t((X)=>({...X,error:"请填写订阅回调 URL"}));return}try{await st(Rt(r,"/api/events/subscriptions"),{method:"POST",body:JSON.stringify({name:c.name,targetUrl:c.targetUrl,eventTypes:c.eventTypes.split(",").map((I)=>I.trim()).filter(Boolean),secret:c.secret||void 0,enabled:!0})});let X="事件订阅已创建";F(X),j("success",X),await N()}catch(X){t((I)=>({...I,error:zl(X,"订阅失败")}))}}async function J(K){if(!K)return;F("");try{await st(Rt(r,`/api/events/subscriptions/${encodeURIComponent(K)}`),{method:"DELETE"});let X="事件订阅已删除";F(X),j("success",X),await N()}catch(X){t((I)=>({...I,error:zl(X,"删除订阅失败")}))}}if(eE(()=>{if(!f)return;N();return},[f?.id,f?.runtime?.providerStatus]),!f)return ll(i1,{title:"ClaudeQQ 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=claudeqq"});let Q=up(f),m=fp(f),q=rp(f),W=n.health||{},p=n.status||{},O=n.napcatLogin||{},Z=W.napcat||p.napcat||{},V={...O.napcat||{},...Z,qrcode:n.napcatQrcode||{},webui:Z.webui||O.napcat?.webui},P=O.login||{},H=n.napcatQrcode||{},B=np(n.events),C=tp(n.subscriptions),E=ip(n.sent),D=Boolean(V.httpConnected||P.ready),Y=String(V.loginState||P.state||(D?"logged_in":"unknown")),v=Boolean(H.available&&H.dataUrl);return ll("div",{className:"claudeqq-page","data-testid":"claudeqq-page"},ll(ty,{title:"ClaudeQQ 工作台",eyebrow:"D601 QQ Event Gateway",loading:n.loading,actions:ll("div",{className:"panel-actions"},ll("button",{type:"button",className:"ghost-btn",onClick:N,disabled:n.loading,"data-testid":"claudeqq-refresh-button"},n.loading?"刷新中":"刷新"),ll(t1,{title:"ClaudeQQ 用户服务",data:f,onOpen:u,testId:"raw-claudeqq-service"}))},ll("div",{className:"findjob-hero"},ll("div",null,ll("div",{className:"node-version-line"},ll(j3,{status:Q.providerStatus==="online"?"online":"warn"},Q.providerStatus||"unknown"),ll("span",null,f.providerId),ll("span",null,q.public?"公网暴露":"仅 UniDesk frontend 代理访问")),ll("p",{className:"muted paragraph"},f.description)),ll("div",{className:"microservice-ref-card"},ll("span",null,"Repo"),ll("strong",null,m.url||"--"),ll("code",null,m.commitId||"--")),ll("div",{className:"microservice-ref-card"},ll("span",null,"D601 k3s Service"),ll("strong",null,`${q.nodeBindHost||"--"}:${q.nodePort||"--"}`),ll("code",null,`${q.proxyMode||"--"} / ${m.composeFile||"--"}`))),ll(el,{error:n.error,wide:!0})),ll("div",{className:"metric-grid"},ll(ny,{label:"Health",value:W.ok||W.status==="ok"?"OK":"--",hint:"D601 /health",tone:W.ok||W.status==="ok"?"ok":"warn"}),ll(ny,{label:"NapCat HTTP",value:V.httpConnected||V.http?.connected?"OK":"离线",hint:`${V.httpHost||W.napcat?.httpHost||"--"}:${V.httpPort||W.napcat?.httpPort||"--"}`}),ll(ny,{label:"NapCat WS",value:V.wsConnected||V.ws?.connected?"OK":"离线",hint:`${V.wsHost||W.napcat?.wsHost||"--"}:${V.wsPort||W.napcat?.wsPort||"--"}`}),ll(ny,{label:"事件缓存",value:w2(n.events?.count??B.length),hint:"recent QQ events"}),ll(ny,{label:"订阅",value:w2(n.subscriptions?.count??C.length),hint:"webhook subscribers"}),ll(ny,{label:"已发送",value:w2(n.sent?.count??E.length),hint:"sent message log"})),ll("div",{className:"findjob-grid"},ll(ty,{title:"NapCat 容器登录",eyebrow:"QR Login",className:"claudeqq-login-panel",loading:n.qrLoading,actions:ll("div",{className:"panel-actions inline-actions"},ll("button",{type:"button",className:"ghost-btn",onClick:()=>U(!0),disabled:n.qrLoading,"data-testid":"claudeqq-napcat-refresh"},n.qrLoading?"刷新中":"手动刷新二维码"),ll(t1,{title:"NapCat Login",data:n.napcatLogin,onOpen:u,testId:"raw-claudeqq-napcat-login"}))},ll("div",{className:"claudeqq-login-card","data-testid":"claudeqq-napcat-login"},ll("div",{className:"claudeqq-qr-frame"},v?ll("img",{src:H.dataUrl,alt:"NapCat QQ 登录二维码","data-testid":"claudeqq-napcat-qrcode"}):ll(i1,{title:"等待二维码",text:"NapCat 容器启动后会把登录二维码写入 cache/qrcode.png"})),ll("div",{className:"claudeqq-login-copy"},ll("div",{className:"node-version-line"},ll(j3,{status:D?"online":v?"warn":"unknown"},D?"已登录":v?"待扫码":"等待二维码"),ll("span",null,Y),ll("span",null,"D601 containerized")),ll("p",{className:"muted paragraph"},D?"NapCat 已登录,ClaudeQQ 可通过容器内 HTTP/WS 链路收发 QQ 消息。":"用手机 QQ 扫描二维码授权登录。二维码只在首次加载或手动刷新时更新,D601 的 NapCat 端口仍只绑定 127.0.0.1。"),ll("div",{className:"microservice-ref-card"},ll("span",null,"NapCat WebUI"),ll("strong",null,V.webui?.url||"http://napcat:6099/webui"),ll("code",null,"local-only / proxied QR login")),ll("div",{className:"microservice-ref-card"},ll("span",null,"QR Source"),ll("strong",null,H.modifiedAt?Ll(H.modifiedAt):n.qrcodeRefreshedAt?Ll(n.qrcodeRefreshedAt):"--"),ll("code",null,H.file||"/napcat/cache/qrcode.png"))))),ll(ty,{title:"消息推送",eyebrow:"Push API"},ll("div",{className:"microservice-ref-card"},ll("span",null,Xi.label),ll("strong",null,String(Xi.userId)),ll("code",null,"private userId / 默认推送测试目标")),ll("form",{className:"stack-form",onSubmit:w,"data-testid":"claudeqq-push-form"},ll("label",null,"目标类型",ll("select",{value:i.targetType,onChange:(K)=>y((X)=>({...X,targetType:K.target.value}))},ll("option",{value:"private"},"私聊 userId"),ll("option",{value:"group"},"群 groupId"))),ll("label",null,"QQ ID",ll("input",{value:i.targetId,onChange:(K)=>y((X)=>({...X,targetId:K.target.value})),placeholder:String(Xi.userId)})),ll("label",null,"消息内容",ll("textarea",{value:i.message,onChange:(K)=>y((X)=>({...X,message:K.target.value})),rows:4,placeholder:"通过 ClaudeQQ 推送一条 QQ 消息"})),ll("button",{type:"submit",className:"primary-btn"},"发送 QQ 消息")),ll("p",{className:"muted paragraph"},`主 server 和其他用户服务可通过 UniDesk 同源代理调用 /api/push/text;当前人工推送测试默认使用 ${Xi.label} ${Xi.userId},不需要暴露 D601 后端端口。`)),ll(ty,{title:"QQ 事件订阅",eyebrow:"Webhook Subscription",loading:n.loading},ll("form",{className:"stack-form",onSubmit:G,"data-testid":"claudeqq-subscription-form"},ll("label",null,"订阅名称",ll("input",{value:c.name,onChange:(K)=>_((X)=>({...X,name:K.target.value}))})),ll("label",null,"回调 URL",ll("input",{value:c.targetUrl,onChange:(K)=>_((X)=>({...X,targetUrl:K.target.value})),placeholder:"http://host.docker.internal:18080/..."})),ll("label",null,"事件类型",ll("input",{value:c.eventTypes,onChange:(K)=>_((X)=>({...X,eventTypes:K.target.value})),placeholder:"message,notice"})),ll("label",null,"签名密钥",ll("input",{value:c.secret,onChange:(K)=>_((X)=>({...X,secret:K.target.value})),placeholder:"可选,生成 x-claudeqq-signature"})),ll("button",{type:"submit",className:"primary-btn"},"创建订阅")),C.length===0?ll(i1,{title:"暂无订阅",text:"可以为 main server 或其他用户服务注册 HTTP webhook"}):ll("div",{className:"table-wrap","data-testid":"claudeqq-subscription-table"},ll("table",null,ll("thead",null,ll("tr",null,ll("th",null,"名称"),ll("th",null,"状态"),ll("th",null,"事件"),ll("th",null,"回调"),ll("th",null,"最近投递"),ll("th",null,"操作"))),ll("tbody",null,C.map((K)=>ll("tr",{key:K.id},ll("td",null,ll("strong",null,K.name||K.id),ll("code",null,K.id||"--")),ll("td",null,ll(j3,{status:K.enabled?"online":"warn"},K.enabled?"enabled":"disabled")),ll("td",null,Array.isArray(K.eventTypes)?K.eventTypes.join(", "):"message"),ll("td",null,K.targetUrl||"--"),ll("td",null,K.lastDelivery?`${K.lastDelivery.ok?"OK":"FAIL"} ${Ll(K.lastDelivery.at)}`:"--"),ll("td",null,ll("button",{type:"button",className:"ghost-btn",onClick:()=>J(K.id)},"删除"))))))),ll("div",{className:"panel-actions inline-actions"},ll(t1,{title:"ClaudeQQ Subscriptions",data:n.subscriptions,onOpen:u,testId:"raw-claudeqq-subscriptions"}))),ll(ty,{title:"最近 QQ 事件",eyebrow:n.refreshedAt?`Updated ${iu(n.refreshedAt)}`:"Event Stream",loading:n.loading},B.length===0?ll(i1,{title:"暂无事件",text:"等待 NapCat WebSocket 上报 QQ 消息事件,或通过订阅 API 消费后续事件"}):ll("div",{className:"table-wrap","data-testid":"claudeqq-event-list"},ll("table",null,ll("thead",null,ll("tr",null,ll("th",null,"时间"),ll("th",null,"类型"),ll("th",null,"会话"),ll("th",null,"消息"),ll("th",null,"ID"))),ll("tbody",null,B.map((K)=>ll("tr",{key:K.id},ll("td",null,Ll(K.receivedAt||K.timestamp)),ll("td",null,ll(j3,{status:K.postType||K.eventType},K.postType||K.eventType||"--")),ll("td",null,HU(K)),ll("td",null,ZU(K)),ll("td",null,ll("code",null,K.messageId||K.id||"--"))))))),ll("div",{className:"panel-actions inline-actions"},ll(t1,{title:"ClaudeQQ Events",data:n.events,onOpen:u,testId:"raw-claudeqq-events"}))),ll(ty,{title:"已发送消息",eyebrow:`${E.length} Sent`,loading:n.loading},E.length===0?ll(i1,{title:"暂无发送记录",text:"发送日志来自 ClaudeQQ bot_workspace/messages/sent_messages.jsonl"}):ll("div",{className:"table-wrap"},ll("table",null,ll("thead",null,ll("tr",null,ll("th",null,"时间"),ll("th",null,"目标"),ll("th",null,"消息"),ll("th",null,"结果"))),ll("tbody",null,E.map((K,X)=>ll("tr",{key:K.id||X},ll("td",null,Ll(K.timestamp||K.sentAt||K.createdAt)),ll("td",null,HU(K)),ll("td",null,ZU(K)),ll("td",null,K.status||K.messageId||K.message_id||"--")))))),ll("div",{className:"panel-actions inline-actions"},ll(t1,{title:"ClaudeQQ Sent Messages",data:n.sent,onOpen:u,testId:"raw-claudeqq-sent"})))))}var w1=Ml(Ju(),1);var SU=Ml(Ju(),1),qu=SU.default.createElement;function c1({markdown:l,className:u,testId:r}){let f=String(l??"").trimEnd(),n=["markdown-body",u].filter(Boolean).join(" ");return qu("div",{className:n,"data-testid":r},YU(f,"md"))}function YU(l,u){let r=yp(l).split(` -`),f=[],n=0;while(n\s?/u.test(t)){let F=[];while(n\s?(.*)$/u);if(N!==null){F.push(N[1]),n+=1;continue}if(j.trim().length===0){F.push(""),n+=1;continue}break}f.push(qu("blockquote",{key:`${u}-quote-${n}`},YU(F.join(` -`),`${u}-quote-${n}`)));continue}if(PU(r,n)){let F=n,j=y1(r[n]??""),N=y1(r[n+1]??"");n+=2;let U=[];while(n0)U.push(y1(r[n]??"")),n+=1;f.push(Fp(j,N,U,`${u}-table-${F}`));continue}let c=U3(t);if(c!==null){let F=n,j=c.ordered,N=c.start,U=[];while(n",l=l.removeChild(l.firstChild)):typeof f.is==="string"?l=i.createElement(r,{is:f.is}):(l=i.createElement(r),r==="select"&&(i=l,f.multiple?i.multiple=!0:f.size&&(i.size=f.size))):l=i.createElementNS(l,r),l[Un]=u,l[Rc]=f,aJ(l,u,!1,!1),u.stateNode=l;l:{switch(i=R6(r,f),r){case"dialog":Ku("cancel",l),Ku("close",l),n=f;break;case"iframe":case"object":case"embed":Ku("load",l),n=f;break;case"video":case"audio":for(n=0;na0&&(u.flags|=128,f=!0,Nc(t,!1),u.lanes=4194304)}else{if(!f)if(l=h_(i),l!==null){if(u.flags|=128,f=!0,r=l.updateQueue,r!==null&&(u.updateQueue=r,u.flags|=4),Nc(t,!0),t.tail===null&&t.tailMode==="hidden"&&!i.alternate&&!Zu)return Lr(u),null}else 2*Iu()-t.renderingStartTime>a0&&r!==1073741824&&(u.flags|=128,f=!0,Nc(t,!1),u.lanes=4194304);t.isBackwards?(i.sibling=u.child,u.child=i):(r=t.last,r!==null?r.sibling=i:u.child=i,t.last=i)}if(t.tail!==null)return u=t.tail,t.rendering=u,t.tail=u.sibling,t.renderingStartTime=Iu(),u.sibling=null,r=Yu.current,Gu(Yu,f?r&1|2:r&1),u;return Lr(u),null;case 22:case 23:return $2(),f=u.memoizedState!==null,l!==null&&l.memoizedState!==null!==f&&(u.flags|=8192),f&&(u.mode&1)!==0?(Af&1073741824)!==0&&(Lr(u),u.subtreeFlags&6&&(u.flags|=8192)):Lr(u),null;case 24:return null;case 25:return null}throw Error(Ql(156,u.tag))}function JE(l,u){switch(R4(u),u.tag){case 1:return kr(u.type)&&D_(),l=u.flags,l&65536?(u.flags=l&-65537|128,u):null;case 3:return k0(),Eu(gr),Eu(Wr),d4(),l=u.flags,(l&65536)!==0&&(l&128)===0?(u.flags=l&-65537|128,u):null;case 5:return o4(u),null;case 13:if(Eu(Yu),l=u.memoizedState,l!==null&&l.dehydrated!==null){if(u.alternate===null)throw Error(Ql(340));v0()}return l=u.flags,l&65536?(u.flags=l&-65537|128,u):null;case 19:return Eu(Yu),null;case 4:return k0(),null;case 10:return g4(u.type._context),null;case 22:case 23:return $2(),null;case 24:return null;default:return null}}var A_=!1,Gr=!1,UE=typeof WeakSet==="function"?WeakSet:Set,Bl=null;function Y0(l,u){var r=l.ref;if(r!==null)if(typeof r==="function")try{r(null)}catch(f){Ru(l,u,f)}else r.current=null}function m4(l,u,r){try{r()}catch(f){Ru(l,u,f)}}var cN=!1;function QE(l,u){if(u4=O_,l=fJ(),M4(l)){if("selectionStart"in l)var r={start:l.selectionStart,end:l.selectionEnd};else l:{r=(r=l.ownerDocument)&&r.defaultView||window;var f=r.getSelection&&r.getSelection();if(f&&f.rangeCount!==0){r=f.anchorNode;var{anchorOffset:n,focusNode:t}=f;f=f.focusOffset;try{r.nodeType,t.nodeType}catch(q){r=null;break l}var i=0,y=-1,c=-1,_=0,A=0,F=l,j=null;u:for(;;){for(var N;;){if(F!==r||n!==0&&F.nodeType!==3||(y=i+n),F!==t||f!==0&&F.nodeType!==3||(c=i+f),F.nodeType===3&&(i+=F.nodeValue.length),(N=F.firstChild)===null)break;j=F,F=N}for(;;){if(F===l)break u;if(j===r&&++_===n&&(y=i),j===t&&++A===f&&(c=i),(N=F.nextSibling)!==null)break;F=j,j=F.parentNode}F=N}r=y===-1||c===-1?null:{start:y,end:c}}else r=null}r=r||{start:0,end:0}}else r=null;r4={focusedElem:l,selectionRange:r},O_=!1;for(Bl=u;Bl!==null;)if(u=Bl,l=u.child,(u.subtreeFlags&1028)!==0&&l!==null)l.return=u,Bl=l;else for(;Bl!==null;){u=Bl;try{var U=u.alternate;if((u.flags&1024)!==0)switch(u.tag){case 0:case 11:case 15:break;case 1:if(U!==null){var{memoizedProps:w,memoizedState:G}=U,J=u.stateNode,Q=J.getSnapshotBeforeUpdate(u.elementType===u.type?w:bf(u.type,w),G);J.__reactInternalSnapshotBeforeUpdate=Q}break;case 3:var m=u.stateNode.containerInfo;m.nodeType===1?m.textContent="":m.nodeType===9&&m.documentElement&&m.removeChild(m.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(Ql(163))}}catch(q){Ru(u,u.return,q)}if(l=u.sibling,l!==null){l.return=u.return,Bl=l;break}Bl=u.return}return U=cN,cN=!1,U}function Zc(l,u,r){var f=u.updateQueue;if(f=f!==null?f.lastEffect:null,f!==null){var n=f=f.next;do{if((n.tag&l)===l){var t=n.destroy;n.destroy=void 0,t!==void 0&&m4(u,r,t)}n=n.next}while(n!==f)}}function r3(l,u){if(u=u.updateQueue,u=u!==null?u.lastEffect:null,u!==null){var r=u=u.next;do{if((r.tag&l)===l){var f=r.create;r.destroy=f()}r=r.next}while(r!==u)}}function w4(l){var u=l.ref;if(u!==null){var r=l.stateNode;switch(l.tag){case 5:l=r;break;default:l=r}typeof u==="function"?u(l):u.current=l}}function eJ(l){var u=l.alternate;u!==null&&(l.alternate=null,eJ(u)),l.child=null,l.deletions=null,l.sibling=null,l.tag===5&&(u=l.stateNode,u!==null&&(delete u[Un],delete u[Rc],delete u[t4],delete u[eK],delete u[lE])),l.stateNode=null,l.return=null,l.dependencies=null,l.memoizedProps=null,l.memoizedState=null,l.pendingProps=null,l.stateNode=null,l.updateQueue=null}function lU(l){return l.tag===5||l.tag===3||l.tag===4}function $N(l){l:for(;;){for(;l.sibling===null;){if(l.return===null||lU(l.return))return null;l=l.return}l.sibling.return=l.return;for(l=l.sibling;l.tag!==5&&l.tag!==6&&l.tag!==18;){if(l.flags&2)continue l;if(l.child===null||l.tag===4)continue l;else l.child.return=l,l=l.child}if(!(l.flags&2))return l.stateNode}}function q4(l,u,r){var f=l.tag;if(f===5||f===6)l=l.stateNode,u?r.nodeType===8?r.parentNode.insertBefore(l,u):r.insertBefore(l,u):(r.nodeType===8?(u=r.parentNode,u.insertBefore(l,r)):(u=r,u.appendChild(l)),r=r._reactRootContainer,r!==null&&r!==void 0||u.onclick!==null||(u.onclick=B_));else if(f!==4&&(l=l.child,l!==null))for(q4(l,u,r),l=l.sibling;l!==null;)q4(l,u,r),l=l.sibling}function L4(l,u,r){var f=l.tag;if(f===5||f===6)l=l.stateNode,u?r.insertBefore(l,u):r.appendChild(l);else if(f!==4&&(l=l.child,l!==null))for(L4(l,u,r),l=l.sibling;l!==null;)L4(l,u,r),l=l.sibling}var Fr=null,vf=!1;function qt(l,u,r){for(r=r.child;r!==null;)uU(l,u,r),r=r.sibling}function uU(l,u,r){if(Qn&&typeof Qn.onCommitFiberUnmount==="function")try{Qn.onCommitFiberUnmount(k_,r)}catch(y){}switch(r.tag){case 5:Gr||Y0(r,u);case 6:var f=Fr,n=vf;Fr=null,qt(l,u,r),Fr=f,vf=n,Fr!==null&&(vf?(l=Fr,r=r.stateNode,l.nodeType===8?l.parentNode.removeChild(r):l.removeChild(r)):Fr.removeChild(r.stateNode));break;case 18:Fr!==null&&(vf?(l=Fr,r=r.stateNode,l.nodeType===8?G6(l.parentNode,r):l.nodeType===1&&G6(l,r),Pc(l)):G6(Fr,r.stateNode));break;case 4:f=Fr,n=vf,Fr=r.stateNode.containerInfo,vf=!0,qt(l,u,r),Fr=f,vf=n;break;case 0:case 11:case 14:case 15:if(!Gr&&(f=r.updateQueue,f!==null&&(f=f.lastEffect,f!==null))){n=f=f.next;do{var t=n,i=t.destroy;t=t.tag,i!==void 0&&((t&2)!==0?m4(r,u,i):(t&4)!==0&&m4(r,u,i)),n=n.next}while(n!==f)}qt(l,u,r);break;case 1:if(!Gr&&(Y0(r,u),f=r.stateNode,typeof f.componentWillUnmount==="function"))try{f.props=r.memoizedProps,f.state=r.memoizedState,f.componentWillUnmount()}catch(y){Ru(r,u,y)}qt(l,u,r);break;case 21:qt(l,u,r);break;case 22:r.mode&1?(Gr=(f=Gr)||r.memoizedState!==null,qt(l,u,r),Gr=f):qt(l,u,r);break;default:qt(l,u,r)}}function _N(l){var u=l.updateQueue;if(u!==null){l.updateQueue=null;var r=l.stateNode;r===null&&(r=l.stateNode=new UE),u.forEach(function(f){var n=EE.bind(null,l,f);r.has(f)||(r.add(f),f.then(n,n))})}}function xf(l,u){var r=u.deletions;if(r!==null)for(var f=0;fn&&(n=i),f&=~t}if(f=n,f=Iu()-f,f=(120>f?120:480>f?480:1080>f?1080:1920>f?1920:3000>f?3000:4320>f?4320:1960*wE(f/1960))-f,10l?16:l,Et===null)var f=!1;else{if(l=Et,Et=null,b_=0,(Fu&6)!==0)throw Error(Ql(331));var n=Fu;Fu|=4;for(Bl=l.current;Bl!==null;){var t=Bl,i=t.child;if((Bl.flags&16)!==0){var y=t.deletions;if(y!==null){for(var c=0;cIu()-y2?Ei(l,0):i2|=r),Ir(l,u)}function $U(l,u){u===0&&((l.mode&1)===0?u=1:(u=r_,r_<<=1,(r_&130023424)===0&&(r_=4194304)));var r=Sr();l=vn(l,u),l!==null&&(ac(l,u,r),Ir(l,r))}function KE(l){var u=l.memoizedState,r=0;u!==null&&(r=u.retryLane),$U(l,r)}function EE(l,u){var r=0;switch(l.tag){case 13:var{stateNode:f,memoizedState:n}=l;n!==null&&(r=n.retryLane);break;case 19:f=l.stateNode;break;default:throw Error(Ql(314))}f!==null&&f.delete(u),$U(l,r)}var _U;_U=function(l,u,r){if(l!==null)if(l.memoizedProps!==u.pendingProps||gr.current)vr=!0;else{if((l.lanes&r)===0&&(u.flags&128)===0)return vr=!1,jE(l,u,r);vr=(l.flags&131072)!==0?!0:!1}else vr=!1,Zu&&(u.flags&1048576)!==0&&NJ(u,Y_,u.index);switch(u.lanes=0,u.tag){case 2:var f=u.type;q_(l,u),l=u.pendingProps;var n=b0(u,Wr.current);s0(u,r),n=l2(null,u,f,l,n,r);var t=u2();return u.flags|=1,typeof n==="object"&&n!==null&&typeof n.render==="function"&&n.$$typeof===void 0?(u.tag=1,u.memoizedState=null,u.updateQueue=null,kr(f)?(t=!0,V_(u)):t=!1,u.memoizedState=n.state!==null&&n.state!==void 0?n.state:null,I4(u),n.updater=u3,u.stateNode=n,n._reactInternals=u,A4(u,f,l,r),u=N4(null,u,f,!0,t,r)):(u.tag=0,Zu&&t&&s4(u),Vr(null,u,n,r),u=u.child),u;case 16:f=u.elementType;l:{switch(q_(l,u),l=u.pendingProps,n=f._init,f=n(f._payload),u.type=f,n=u.tag=zE(f),l=bf(f,l),n){case 0:u=j4(null,u,f,l,r);break l;case 1:u=tN(null,u,f,l,r);break l;case 11:u=fN(null,u,f,l,r);break l;case 14:u=nN(null,u,f,bf(f.type,l),r);break l}throw Error(Ql(306,f,""))}return u;case 0:return f=u.type,n=u.pendingProps,n=u.elementType===f?n:bf(f,n),j4(l,u,f,n,r);case 1:return f=u.type,n=u.pendingProps,n=u.elementType===f?n:bf(f,n),tN(l,u,f,n,r);case 3:l:{if(gJ(u),l===null)throw Error(Ql(387));f=u.pendingProps,t=u.memoizedState,n=t.element,qJ(l,u),C_(u,f,null,r);var i=u.memoizedState;if(f=i.element,t.isDehydrated)if(t={element:f,isDehydrated:!1,cache:i.cache,pendingSuspenseBoundaries:i.pendingSuspenseBoundaries,transitions:i.transitions},u.updateQueue.baseState=t,u.memoizedState=t,u.flags&256){n=I0(Error(Ql(423)),u),u=iN(l,u,f,r,n);break l}else if(f!==n){n=I0(Error(Ql(424)),u),u=iN(l,u,f,r,n);break l}else for(Ff=Zt(u.stateNode.containerInfo.firstChild),jf=u,Zu=!0,gf=null,r=mJ(u,null,f,r),u.child=r;r;)r.flags=r.flags&-3|4096,r=r.sibling;else{if(v0(),f===n){u=gn(l,u,r);break l}Vr(l,u,f,r)}u=u.child}return u;case 5:return LJ(u),l===null&&c4(u),f=u.type,n=u.pendingProps,t=l!==null?l.memoizedProps:null,i=n.children,f4(f,n)?i=null:t!==null&&f4(f,t)&&(u.flags|=32),vJ(l,u),Vr(l,u,i,r),u.child;case 6:return l===null&&c4(u),null;case 13:return kJ(l,u,r);case 4:return a4(u,u.stateNode.containerInfo),f=u.pendingProps,l===null?u.child=g0(u,null,f,r):Vr(l,u,f,r),u.child;case 11:return f=u.type,n=u.pendingProps,n=u.elementType===f?n:bf(f,n),fN(l,u,f,n,r);case 7:return Vr(l,u,u.pendingProps,r),u.child;case 8:return Vr(l,u,u.pendingProps.children,r),u.child;case 12:return Vr(l,u,u.pendingProps.children,r),u.child;case 10:l:{if(f=u.type._context,n=u.pendingProps,t=u.memoizedProps,i=n.value,Gu(X_,f._currentValue),f._currentValue=i,t!==null)if(af(t.value,i)){if(t.children===n.children&&!gr.current){u=gn(l,u,r);break l}}else for(t=u.child,t!==null&&(t.return=u);t!==null;){var y=t.dependencies;if(y!==null){i=t.child;for(var c=y.firstContext;c!==null;){if(c.context===f){if(t.tag===1){c=Rn(-1,r&-r),c.tag=2;var _=t.updateQueue;if(_!==null){_=_.shared;var A=_.pending;A===null?c.next=c:(c.next=A.next,A.next=c),_.pending=c}}t.lanes|=r,c=t.alternate,c!==null&&(c.lanes|=r),$4(t.return,r,u),y.lanes|=r;break}c=c.next}}else if(t.tag===10)i=t.type===u.type?null:t.child;else if(t.tag===18){if(i=t.return,i===null)throw Error(Ql(341));i.lanes|=r,y=i.alternate,y!==null&&(y.lanes|=r),$4(i,r,u),i=t.sibling}else i=t.child;if(i!==null)i.return=t;else for(i=t;i!==null;){if(i===u){i=null;break}if(t=i.sibling,t!==null){t.return=i.return,i=t;break}i=i.return}t=i}Vr(l,u,n.children,r),u=u.child}return u;case 9:return n=u.type,f=u.pendingProps.children,s0(u,r),n=Hf(n),f=f(n),u.flags|=1,Vr(l,u,f,r),u.child;case 14:return f=u.type,n=bf(f,u.pendingProps),n=bf(f.type,n),nN(l,u,f,n,r);case 15:return xJ(l,u,u.type,u.pendingProps,r);case 17:return f=u.type,n=u.pendingProps,n=u.elementType===f?n:bf(f,n),q_(l,u),u.tag=1,kr(f)?(l=!0,V_(u)):l=!1,s0(u,r),MJ(u,f,n),A4(u,f,n,r),N4(null,u,f,!0,l,r);case 19:return IJ(l,u,r);case 22:return bJ(l,u,r)}throw Error(Ql(156,u.tag))};function AU(l,u){return PN(l,u)}function pE(l,u,r,f){this.tag=l,this.key=r,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=u,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=f,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Of(l,u,r,f){return new pE(l,u,r,f)}function A2(l){return l=l.prototype,!(!l||!l.isReactComponent)}function zE(l){if(typeof l==="function")return A2(l)?1:0;if(l!==void 0&&l!==null){if(l=l.$$typeof,l===Z4)return 11;if(l===H4)return 14}return 2}function Vt(l,u){var r=l.alternate;return r===null?(r=Of(l.tag,u,l.key,l.mode),r.elementType=l.elementType,r.type=l.type,r.stateNode=l.stateNode,r.alternate=l,l.alternate=r):(r.pendingProps=u,r.type=l.type,r.flags=0,r.subtreeFlags=0,r.deletions=null),r.flags=l.flags&14680064,r.childLanes=l.childLanes,r.lanes=l.lanes,r.child=l.child,r.memoizedProps=l.memoizedProps,r.memoizedState=l.memoizedState,r.updateQueue=l.updateQueue,u=l.dependencies,r.dependencies=u===null?null:{lanes:u.lanes,firstContext:u.firstContext},r.sibling=l.sibling,r.index=l.index,r.ref=l.ref,r}function W_(l,u,r,f,n,t){var i=2;if(f=l,typeof l==="function")A2(l)&&(i=1);else if(typeof l==="string")i=5;else l:switch(l){case p0:return pi(r.children,n,t,u);case O4:i=8,n|=8;break;case D6:return l=Of(12,r,u,n|2),l.elementType=D6,l.lanes=t,l;case V6:return l=Of(13,r,u,n),l.elementType=V6,l.lanes=t,l;case S6:return l=Of(19,r,u,n),l.elementType=S6,l.lanes=t,l;case LN:return n3(r,n,t,u);default:if(typeof l==="object"&&l!==null)switch(l.$$typeof){case wN:i=10;break l;case qN:i=9;break l;case Z4:i=11;break l;case H4:i=14;break l;case Lt:i=16,f=null;break l}throw Error(Ql(130,l==null?l:typeof l,""))}return u=Of(i,r,u,n),u.elementType=l,u.type=f,u.lanes=t,u}function pi(l,u,r,f){return l=Of(7,l,f,u),l.lanes=r,l}function n3(l,u,r,f){return l=Of(22,l,f,u),l.elementType=LN,l.lanes=r,l.stateNode={isHidden:!1},l}function Z6(l,u,r){return l=Of(6,l,null,u),l.lanes=r,l}function H6(l,u,r){return u=Of(4,l.children!==null?l.children:[],l.key,u),u.lanes=r,u.stateNode={containerInfo:l.containerInfo,pendingChildren:null,implementation:l.implementation},u}function OE(l,u,r,f,n){this.tag=u,this.containerInfo=l,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=J6(0),this.expirationTimes=J6(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=J6(0),this.identifierPrefix=f,this.onRecoverableError=n,this.mutableSourceEagerHydrationData=null}function F2(l,u,r,f,n,t,i,y,c){return l=new OE(l,u,r,y,c),u===1?(u=1,t===!0&&(u|=8)):u=0,t=Of(3,null,null,u),l.current=t,t.stateNode=l,t.memoizedState={element:f,isDehydrated:r,cache:null,transitions:null,pendingSuspenseBoundaries:null},I4(t),l}function ZE(l,u,r){var f=3{function UU(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=="function")return;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(UU)}catch(l){console.error(l)}}UU(),QU.exports=JU()});var wU=_f((Q2)=>{var mU=U2();Q2.createRoot=mU.createRoot,Q2.hydrateRoot=mU.hydrateRoot;var SE});var Vm=_f((nA)=>{var EZ=Ju(),pZ=Symbol.for("react.element"),zZ=Symbol.for("react.fragment"),OZ=Object.prototype.hasOwnProperty,ZZ=EZ.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,HZ={key:!0,ref:!0,__self:!0,__source:!0};function Dm(l,u,r){var f,n={},t=null,i=null;r!==void 0&&(t=""+r),u.key!==void 0&&(t=""+u.key),u.ref!==void 0&&(i=u.ref);for(f in u)OZ.call(u,f)&&!HZ.hasOwnProperty(f)&&(n[f]=u[f]);if(l&&l.defaultProps)for(f in u=l.defaultProps,u)n[f]===void 0&&(n[f]=u[f]);return{$$typeof:pZ,type:l,key:t,ref:i,props:n,_owner:ZZ.current}}nA.Fragment=zZ;nA.jsx=Dm;nA.jsxs=Dm});var Ym=_f((bh,Sm)=>{Sm.exports=Vm()});var jq=_f((Fq)=>{var Py=Ju();function kD(l,u){return l===u&&(l!==0||1/l===1/u)||l!==l&&u!==u}var ID=typeof Object.is==="function"?Object.is:kD,aD=Py.useState,oD=Py.useEffect,dD=Py.useLayoutEffect,eD=Py.useDebugValue;function lV(l,u){var r=u(),f=aD({inst:{value:r,getSnapshot:u}}),n=f[0].inst,t=f[1];return dD(function(){n.value=r,n.getSnapshot=u,LF(n)&&t({inst:n})},[l,r,u]),oD(function(){return LF(n)&&t({inst:n}),l(function(){LF(n)&&t({inst:n})})},[l]),eD(r),r}function LF(l){var u=l.getSnapshot;l=l.value;try{var r=u();return!ID(l,r)}catch(f){return!0}}function uV(l,u){return u()}var rV=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?uV:lV;Fq.useSyncExternalStore=Py.useSyncExternalStore!==void 0?Py.useSyncExternalStore:rV});var Jq=_f((Pv,Nq)=>{Nq.exports=jq()});var Qq=_f((Uq)=>{var oA=Ju(),fV=Jq();function nV(l,u){return l===u&&(l!==0||1/l===1/u)||l!==l&&u!==u}var tV=typeof Object.is==="function"?Object.is:nV,iV=fV.useSyncExternalStore,yV=oA.useRef,cV=oA.useEffect,$V=oA.useMemo,_V=oA.useDebugValue;Uq.useSyncExternalStoreWithSelector=function(l,u,r,f,n){var t=yV(null);if(t.current===null){var i={hasValue:!1,value:null};t.current=i}else i=t.current;t=$V(function(){function c(N){if(!_){if(_=!0,A=N,N=f(N),n!==void 0&&i.hasValue){var U=i.value;if(n(U,N))return F=U}return F=N}if(U=F,tV(A,N))return U;var w=f(N);if(n!==void 0&&n(U,w))return A=N,U;return A=N,F=w}var _=!1,A,F,j=r===void 0?null:r;return[function(){return c(u())},j===null?void 0:function(){return c(j())}]},[u,r,f,n]);var y=iV(l,t[0],t[1]);return cV(function(){i.hasValue=!0,i.value=y},[y]),_V(y),y}});var wq=_f((hv,mq)=>{mq.exports=Qq()});var Ni=Ml(Ju(),1);var x$="北京时间";var ZT={timeZone:"Asia/Shanghai",hour12:!1},HT={timeZone:"Asia/Shanghai",hour12:!1},BT=new Intl.DateTimeFormat("en-CA",{timeZone:"Asia/Shanghai",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",hourCycle:"h23"});function e8(l){if(l===null||l===void 0||l==="")return null;let u=l instanceof Date?l:new Date(l);return Number.isNaN(u.getTime())?null:u}function r7(l){let u=e8(l);if(!u)return null;return BT.formatToParts(u).reduce((r,f)=>{if(f.type!=="literal")r[f.type]=f.value;return r},{})}function Ll(l){let u=e8(l);return u?u.toLocaleString("zh-CN",ZT):"--"}function iu(l){let u=e8(l);return u?u.toLocaleTimeString("zh-CN",HT):"--"}function l6(l){let u=r7(l);if(!u)return"";let r=u.hour==="24"?"00":u.hour;return`${u.year}-${u.month}-${u.day}T${r}:${u.minute}`}function f7(l=new Date){let u=r7(l);if(!u)return"";return`${u.year}-${u.month}-${u.day}`}function n7(l){if(!l)return null;let u=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(?::(\d{2}))?$/.exec(l);if(!u)return null;let[,r,f,n,t,i,y="00"]=u,c=Date.UTC(Number(r),Number(f)-1,Number(n),Number(t)-8,Number(i),Number(y)),_=new Date(c),A=l6(_);return Number.isNaN(_.getTime())||A!==`${r}-${f}-${n}T${t}:${i}`?null:_.toISOString()}var gG=Ml(wU(),1);var A3=Ml(Ju(),1);var qU=Ml(Ju(),1),l1=qU.default.createElement;function YE({active:l=!0,label:u="正在加载"}){if(!l)return null;return l1("span",{className:"loading-spinner-indicator",role:"status","aria-label":u,title:u,"data-testid":"loading-title-indicator"},l1("span",{className:"loading-spinner-ring","aria-hidden":!0}))}function nu({title:l,children:u,loading:r,level:f=2,className:n="",label:t="正在加载"}){return l1(f===3?"h3":"h2",{className:`loading-title ${r?"is-loading":""} ${n}`.trim()},l1("span",{className:"loading-title-text"},u??l),l1(YE,{active:Boolean(r),label:t}))}class e0 extends Error{unideskRequestError=!0;meta;constructor(l,u){super(l);this.name="UniDeskRequestError",this.meta=u}}function XE(l){return new Promise((u)=>setTimeout(u,l))}function f1(l,u="操作失败"){return l instanceof Error?l.message:String(l||u)}function $3(l,u=500){if(l===null||l===void 0)return"";let r=typeof l==="string"?l:JSON.stringify(l),f=String(r||"").replace(/\s+/gu," ").trim();return f.length>u?`${f.slice(0,u)}...`:f}function PE(l){try{let u=typeof location<"u"&&location.origin?location.origin:"http://localhost";return new URL(l,u).toString()}catch{return l}}function LU(l){return String(l.method||"GET").toUpperCase()}function CE(l){if(l===null||l===void 0)return!1;if(typeof l!=="object")return!1;if(typeof Blob<"u"&&l instanceof Blob)return!1;if(typeof FormData<"u"&&l instanceof FormData)return!1;if(typeof URLSearchParams<"u"&&l instanceof URLSearchParams)return!1;if(typeof ArrayBuffer<"u"&&l instanceof ArrayBuffer)return!1;return!0}function GU(l){let u=new Headers(l.headers||{}),r=CE(l.body)?JSON.stringify(l.body):l.body;if(r&&!u.has("content-type")&&typeof r==="string")u.set("content-type","application/json");return{...l,credentials:l.credentials||"same-origin",body:r,headers:u}}function WU(l){if(l?.error&&typeof l.error==="object"&&typeof l.error.message==="string")return l.error.message;if(typeof l?.error==="string")return l.error;if(typeof l?.message==="string")return l.message;if(typeof l?.detail==="string")return l.detail;return""}function hE(l,u){if(!l||typeof l!=="object"||Array.isArray(l))return!1;return u.some((r)=>r!==!1&&l[r]===!1)}function u1(l,u,r,f,n={}){return{kind:l,method:r,url:PE(u),occurredAt:f.toISOString(),...n}}function r1(l,u){if(!l)return"请求失败";return`HTTP ${l}${u?` ${u}`:""}`}function TU(l){try{return{body:l?JSON.parse(l):null,parseError:""}}catch(u){return{body:{text:l},parseError:f1(u,"parse failed")}}}async function Tl(l,u={},r=0){let{failureFields:f=["ok"],strictJson:n=!1,retryInvalidJson:t=0,retryDelayMs:i=120,invalidJsonPrefix:y="服务返回了无效 JSON",invalidJsonPreview:c=!1,responsePreviewLength:_=500,...A}=u,F=LU(A),j=new Date,N;try{N=await fetch(l,GU(A))}catch(G){let J=f1(G,"网络请求失败");throw new e0(J,u1("network",l,F,j,{upstreamMessage:J}))}let U=await N.text(),w=TU(U);if(w.parseError){if(n&&F==="GET"&&r=300)?r1(l.meta.status,l.meta.statusText):"应用请求失败",t=l.meta.status?r1(l.meta.status):"",i=(c)=>!c||c===n||c===t,y=!i(l.message)?l.message:i(l.meta.upstreamMessage)?"":l.meta.upstreamMessage||"";return{title:n,message:y,status:l.meta.status,statusText:l.meta.statusText,method:l.meta.method,url:l.meta.url,occurredAt:ME(l.meta.occurredAt),responsePreview:l.meta.responsePreview,parseError:l.meta.parseError,structured:!0}}let f=f1(l,u).split(/\r?\n/u);return{title:f[0]||u,message:f.slice(1).join(` +`),structured:f.length>1}}function sE(l,u="操作失败"){let r=m2(l,u),f=[r.title];if(r.message)f.push(`原因: ${r.message}`);if(r.method||r.url)f.push(`请求: ${[r.method,r.url].filter(Boolean).join(" ")}`);if(r.status)f.push(`状态: ${r1(r.status,r.statusText)}`);if(r.occurredAt)f.push(`时间: ${r.occurredAt}`);if(r.parseError)f.push(`解析错误: ${r.parseError}`);if(r.responsePreview&&r.responsePreview!==r.message)f.push(`响应预览: ${r.responsePreview}`);return f.filter(Boolean).join(` +`)}function zl(l,u="操作失败"){return EU(l)?sE(l,u):f1(l,u)}var pU=Ml(Ju(),1);var ht=pU.default.createElement;function n1(l,u){return u?[ht("dt",{key:`${l}-label`},l),ht("dd",{key:l},u)]:null}function el({error:l,wide:u=!1,fallback:r="操作失败",className:f=""}){if(!l)return null;let n=m2(l,r),t=[n1("请求",[n.method,n.url].filter(Boolean).join(" ")),n1("状态",n.status?`HTTP ${n.status}${n.statusText?` ${n.statusText}`:""}`:""),n1("时间",n.occurredAt),n1("解析错误",n.parseError),n1("响应预览",n.responsePreview)].filter(Boolean);return ht("div",{className:`form-error unidesk-error${u?" wide":""}${f?` ${f}`:""}`,role:"alert","data-testid":"unidesk-error"},ht("div",{className:"unidesk-error-title"},ht("strong",null,n.title),n.status?ht("span",{className:"unidesk-error-code"},`HTTP ${n.status}`):null),n.message?ht("pre",{className:"unidesk-error-message"},n.message):null,t.length>0?ht("dl",{className:"unidesk-error-details"},t):null)}var wn=Ml(Ju(),1),zU=wn.default.createContext(null);function OU({children:l}){let[u,r]=wn.default.useState([]),[f,n]=wn.default.useState(Date.now()),t=wn.default.useCallback((F,j)=>{let U={id:`notif_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,type:F,message:j,timestamp:Date.now()};r((w)=>{let G=[...w,U];if(G.length>50)return G.slice(-50);return G})},[]),i=wn.default.useCallback((F)=>{r((j)=>j.filter((N)=>N.id!==F))},[]),y=wn.default.useCallback(()=>{r([]),n(Date.now())},[]),c=wn.default.useMemo(()=>{return u.filter((F)=>F.timestamp>f).length},[u,f]),_=c>0,A={notifications:u,addNotification:t,removeNotification:i,clearNotifications:y,unreadCount:c,hasUnread:_};return RE(zU.Provider,{value:A},l)}var RE=wn.default.createElement;function Xr(){let l=wn.default.useContext(zU);if(!l)throw Error("useNotification must be used within NotificationProvider");return l}var b=A3.default.createElement,{useEffect:_3}=A3.default,ly=A3.default.useState;function Tr(l,u={}){return Tl(l,{failureFields:["ok","success"],...u})}function Pr(l,u){return`${l}/microservices/baidu-netdisk/proxy${u}`}function xE(l){let u=Number(l);return Number.isFinite(u)?u.toLocaleString("zh-CN"):"--"}function Mt(l){let u=Number(l);if(!Number.isFinite(u)||u<=0)return"--";let r=["B","KB","MB","GB","TB"],f=u,n=0;while(f>=1024&&n{n?.stopPropagation?.(),r(l,u)}},"查看原始JSON")}function ry({title:l,text:u}){return b("div",{className:"empty-state"},b("strong",null,l),b("span",null,u))}function fy({title:l,text:u,href:r,badge:f,testId:n}){return b("a",{className:"doc-link-card",href:r,target:"_blank",rel:"noreferrer","data-testid":n},b("span",null,f||"DOC"),b("strong",null,l),b("p",null,u),b("code",null,r))}function bE(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function vE(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function gE(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function kE(l){return Array.isArray(l?.files)?l.files:[]}function IE(l){return Array.isArray(l?.jobs)?l.jobs:[]}function aE(l,u){if(!l||l===u)return u;let r=l.replace(/\/+$/u,""),f=r.slice(0,r.lastIndexOf("/"))||u;return f.lengths.id==="baidu-netdisk")||null,[n,t]=ly({loading:!1,actionLoading:!1,error:"",message:"",health:null,account:null,files:null,transfers:null,logs:null,selfTest:null,refreshedAt:null}),[i,y]=ly("/"),[c,_]=ly(null),[A,F]=ly(""),[j,N]=ly({localPath:"sample.txt",remotePath:"/sample.txt"}),[U,w]=ly({fsId:"",localPath:"downloads/"}),{addNotification:G}=Xr(),J=n.health?.baidu?.appRoot||n.account?.rootPath||"/";_3(()=>{N((s)=>{let ul=new Set(["/sample.txt","/apps/UniDeskBaiduNetdisk/sample.txt"]);if(s.remotePath&&!ul.has(s.remotePath))return s;let tl=w2(J,"sample.txt");return s.remotePath===tl?s:{...s,remotePath:tl}})},[J]);async function Q(s=i){let tl=await Tr(Pr(r,`/api/files?dir=${encodeURIComponent(s||J)}&limit=100`));t((Al)=>({...Al,files:tl}))}async function m(){let s=await Tr(Pr(r,"/api/transfers?limit=80"));t((ul)=>({...ul,transfers:s}))}async function q(){if(!f)return;t((s)=>({...s,loading:!0,error:"",message:""}));try{let s=await Tr(`${r}/microservices/baidu-netdisk/health`),ul=s?.baidu?.appRoot||J,tl=null,Al=null;if(s?.auth?.loggedIn){tl=await Tr(Pr(r,"/api/account?refresh=1"));let El=i&&i.startsWith(ul)?i:ul;y(El),Al=await Tr(Pr(r,`/api/files?dir=${encodeURIComponent(El)}&limit=100`))}else y(ul);let Kl=await Tr(Pr(r,"/api/transfers?limit=80")),wl=await Tr(Pr(r,"/logs?limit=60"));t((El)=>({...El,loading:!1,health:s,account:tl?.account||null,files:Al,transfers:Kl,logs:wl,refreshedAt:new Date}))}catch(s){t((ul)=>({...ul,loading:!1,error:zl(s,"百度网盘服务加载失败")}))}}async function W(){t((s)=>({...s,actionLoading:!0,error:"",message:""}));try{let s=await Tr(Pr(r,"/api/auth/device/start"),{method:"POST",body:{}});_(s.session||null),t((ul)=>({...ul,actionLoading:!1,message:"设备码已生成,请扫码授权"}))}catch(s){t((ul)=>({...ul,actionLoading:!1,error:zl(s,"创建设备码失败")}))}}async function p(s=!1){if(!c?.id)return;if(s)t((ul)=>({...ul,actionLoading:!0,error:""}));try{let ul=await Tr(Pr(r,`/api/auth/device/status?sessionId=${encodeURIComponent(c.id)}`));if(_(ul.session||null),ul.session?.status==="succeeded")t((tl)=>({...tl,actionLoading:!1,message:"授权成功,正在刷新账号与文件列表"})),await q();else if(s)t((tl)=>({...tl,actionLoading:!1}))}catch(ul){t((tl)=>({...tl,actionLoading:!1,error:zl(ul,"轮询登录状态失败")}))}}async function O(){t((s)=>({...s,actionLoading:!0,error:"",message:""}));try{await Tr(Pr(r,"/api/auth/logout"),{method:"POST",body:{}}),_(null),t((s)=>({...s,actionLoading:!1,account:null,files:null,message:"本地 token 已清除"})),await q()}catch(s){t((ul)=>({...ul,actionLoading:!1,error:zl(s,"退出登录失败")}))}}async function Z(s){s.preventDefault();let ul=A.trim();if(!ul)return;t((tl)=>({...tl,actionLoading:!0,error:"",message:""}));try{await Tr(Pr(r,"/api/folders"),{method:"POST",body:{path:w2(i,ul)}}),F(""),t((tl)=>({...tl,actionLoading:!1,message:"文件夹已创建"})),await Q(i)}catch(tl){t((Al)=>({...Al,actionLoading:!1,error:zl(tl,"创建文件夹失败")}))}}async function V(s){if(!s)return;t((ul)=>({...ul,actionLoading:!0,error:"",message:""}));try{await Tr(Pr(r,"/api/files/manage"),{method:"POST",body:{opera:"delete",filelist:[{path:s}],async:1}}),t((ul)=>({...ul,actionLoading:!1,message:"删除任务已提交"})),await Q(i)}catch(ul){t((tl)=>({...tl,actionLoading:!1,error:zl(ul,"删除失败")}))}}async function P(s){s.preventDefault(),t((ul)=>({...ul,actionLoading:!0,error:"",message:""}));try{await Tr(Pr(r,"/api/transfers/upload-from-path"),{method:"POST",body:j}),t((ul)=>({...ul,actionLoading:!1,message:"上传任务已入队"})),await m()}catch(ul){t((tl)=>({...tl,actionLoading:!1,error:zl(ul,"上传任务创建失败")}))}}async function H(s){s.preventDefault(),t((ul)=>({...ul,actionLoading:!0,error:"",message:""}));try{await Tr(Pr(r,"/api/transfers/download-to-path"),{method:"POST",body:U}),t((ul)=>({...ul,actionLoading:!1,message:"下载任务已入队"})),await m()}catch(ul){t((tl)=>({...tl,actionLoading:!1,error:zl(ul,"下载任务创建失败")}))}}async function B(s,ul){t((tl)=>({...tl,actionLoading:!0,error:"",message:""}));try{await Tr(Pr(r,`/api/transfers/${encodeURIComponent(s)}/${ul}`),{method:"POST",body:{}}),t((tl)=>({...tl,actionLoading:!1,message:ul==="cancel"?"已请求取消任务":"任务已重新入队"})),await m()}catch(tl){t((Al)=>({...Al,actionLoading:!1,error:zl(tl,"任务操作失败")}))}}async function C(){t((s)=>({...s,actionLoading:!0,error:"",message:"正在运行上传/下载自测..."}));try{let s=await Tr(Pr(r,"/api/self-test"),{method:"POST",body:{}});t((ul)=>({...ul,actionLoading:!1,selfTest:s,message:`上传/下载自测通过:${s.remotePath||""}`})),await Q(i),await m()}catch(s){t((ul)=>({...ul,actionLoading:!1,error:zl(s,"上传/下载自测失败")}))}}if(_3(()=>{if(!f)return;q();return},[f?.id,f?.runtime?.providerStatus]),_3(()=>{if(!c?.id||c.status!=="pending")return;let s=window.setInterval(()=>void p(!1),Math.max(5000,Number(c.pollIntervalSeconds||5)*1000));return()=>window.clearInterval(s)},[c?.id,c?.status,c?.pollIntervalSeconds]),_3(()=>{if(!f)return;let s=window.setInterval(()=>void m(),5000);return()=>window.clearInterval(s)},[f?.id]),!f)return b(ry,{title:"Baidu Netdisk 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=baidu-netdisk"});let E=bE(f),D=gE(f),Y=vE(f),v=n.health||{},K=n.account||v.auth?.account||null,X=v.auth||{},I=kE(n.files),o=IE(n.transfers),fl=K?.quota||{},yl=Boolean(X.loggedIn||K),h=Boolean(X.configured);return b("div",{className:"baidu-netdisk-page","data-testid":"baidu-netdisk-page"},b(Yi,{title:"Baidu Netdisk 工作台",eyebrow:"Containerized Storage Gateway",loading:n.loading,actions:b("div",{className:"panel-actions"},b("a",{className:"ghost-btn",href:"/docs/issue/baidu-netdisk-env-setup.md",target:"_blank",rel:"noreferrer","data-testid":"baidu-netdisk-config-doc-link"},"配置文档"),b("button",{type:"button",className:"ghost-btn",onClick:q,disabled:n.loading,"data-testid":"baidu-netdisk-refresh"},n.loading?"刷新中":"刷新"),b(In,{title:"Baidu Netdisk 用户服务",data:f,onOpen:u,testId:"raw-baidu-netdisk-service"}))},b("div",{className:"baidu-netdisk-hero"},b("div",null,b("div",{className:"node-version-line"},b(Si,{status:E.providerStatus==="online"?"online":"warn"},E.providerStatus||"unknown"),b("span",null,f.providerId),b(Si,{status:Y.public?"warn":"private"},Y.public?"公网暴露":"仅 UniDesk frontend 代理访问")),b("p",{className:"muted paragraph"},f.description)),b("div",{className:"microservice-ref-card"},b("span",null,"Repo"),b("strong",null,D.url||"--"),b("code",null,D.commitId||"--")),b("div",{className:"microservice-ref-card"},b("span",null,"Private Backend"),b("strong",null,`${Y.nodeBindHost||"--"}:${Y.nodePort||"--"}`),b("code",null,`${D.composeFile||"--"} / ${D.composeService||"--"}`))),b(el,{error:n.error,wide:!0})),b("div",{className:"metric-grid"},b(uy,{label:"Health",value:v.ok?"OK":"--",hint:v.storage?.postgres||"postgres",tone:v.ok?"ok":"warn"}),b(uy,{label:"OAuth",value:h?"已配置":"待配置",hint:h?"client + secret + token key":"需要设置 UNIDESK_BAIDU_NETDISK_*",tone:h?"ok":"warn"}),b(uy,{label:"Login",value:yl?"已登录":"未登录",hint:K?.username||"Device Code QR",tone:yl?"ok":"warn"}),b(uy,{label:"Work Root",value:oE(J),hint:J}),b(uy,{label:"Quota",value:Mt(fl.used),hint:fl.total?`${fl.usedPercent||0}% / ${Mt(fl.total)}`:"授权后刷新"}),b(uy,{label:"Transfers",value:xE(o.length),hint:`running ${n.transfers?.counts?.running||0} / failed ${n.transfers?.counts?.failed||0}`})),b(Yi,{title:"文件浏览器",eyebrow:i,className:"baidu-files-panel",loading:n.loading,actions:b("div",{className:"panel-actions inline-actions"},b("button",{type:"button",className:"ghost-btn",onClick:()=>{let s=aE(i,J);y(s),Q(s)},disabled:!yl||i===J},"上级"),b("button",{type:"button",className:"ghost-btn",onClick:()=>Q(i),disabled:!yl},"刷新文件"),b(In,{title:"Baidu Files",data:n.files,onOpen:u,testId:"raw-baidu-files"}))},b("form",{className:"baidu-pathbar",onSubmit:(s)=>{s.preventDefault(),Q(i)}},b("input",{value:i,onChange:(s)=>y(s.target.value),disabled:!yl}),b("button",{type:"submit",className:"ghost-btn",disabled:!yl},"打开路径")),b("form",{className:"baidu-pathbar",onSubmit:Z},b("input",{value:A,onChange:(s)=>F(s.target.value),placeholder:"新文件夹名称",disabled:!yl}),b("button",{type:"submit",className:"primary-btn",disabled:!yl||!A.trim()},"新建文件夹")),!yl?b(ry,{title:"等待授权",text:"登录后通过 /api/files 读取工作目录文件列表"}):I.length===0?b(ry,{title:"目录为空",text:"可以从 staging 目录上传文件或新建文件夹"}):b("div",{className:"table-wrap","data-testid":"baidu-netdisk-file-table"},b("table",null,b("thead",null,b("tr",null,b("th",null,"名称"),b("th",null,"类型"),b("th",null,"大小"),b("th",null,"修改时间"),b("th",null,"fs_id"),b("th",null,"操作"))),b("tbody",null,I.map((s)=>b("tr",{key:s.fsId||s.path},b("td",null,b("strong",null,s.serverFilename||s.path),b("code",null,s.path||"--")),b("td",null,b(Si,{status:s.isDir?"queued":"private"},s.isDir?"DIR":"FILE")),b("td",null,s.isDir?"--":Mt(s.size)),b("td",null,s.serverMtime?Ll(s.serverMtime*1000):"--"),b("td",null,b("code",null,s.fsId||"--")),b("td",null,b("div",{className:"inline-actions"},s.isDir?b("button",{type:"button",className:"ghost-btn",onClick:()=>{y(s.path),Q(s.path)}},"打开"):b("button",{type:"button",className:"ghost-btn",onClick:()=>w((ul)=>({...ul,fsId:s.fsId}))},"填入下载"),b("button",{type:"button",className:"ghost-btn",onClick:()=>V(s.path),disabled:n.actionLoading},"删除"))))))))),b("div",{className:"baidu-netdisk-grid"},b(Yi,{title:"配置与文档",eyebrow:"Deployment References",className:"baidu-docs-panel",actions:b("div",{className:"panel-actions inline-actions"},b("a",{className:"ghost-btn",href:"/docs/issue/baidu-netdisk-env-setup.md",target:"_blank",rel:"noreferrer"},"打开环境配置"),b("a",{className:"ghost-btn",href:"/docs/issue/baidu-netdisk-user-service.md",target:"_blank",rel:"noreferrer"},"打开服务方案"))},b("p",{className:"muted paragraph"},h?"OAuth 运行时变量已配置;如需轮换密钥、迁移部署或排查代理边界,可直接打开下面的项目内文档。":"首次使用请先按环境变量配置文档填入百度应用 client id / secret,然后重建 baidu-netdisk 服务并刷新本页。"),b("div",{className:"baidu-doc-grid","data-testid":"baidu-netdisk-doc-links"},b(fy,{title:"环境变量配置",text:"填写 UNIDESK_BAIDU_NETDISK_CLIENT_ID、CLIENT_SECRET、TOKEN_KEY,并执行重建与健康检查。",href:"/docs/issue/baidu-netdisk-env-setup.md",badge:"SETUP",testId:"baidu-netdisk-env-doc-card"}),b(fy,{title:"服务方案与 API",text:"说明 OAuth Device Code、根目录工作区、staging 上传下载任务和后端 API 设计。",href:"/docs/issue/baidu-netdisk-user-service.md",badge:"DESIGN"}),b(fy,{title:"用户服务安全边界",text:"查看 UniDesk microservice 私有代理、允许路径、frontendOnly 和密钥边界规则。",href:"/docs/reference/microservices.md",badge:"REF"}),b(fy,{title:"部署与重建流程",text:"查看 server rebuild、Compose 编排、健康检查和交付验证的长期规则。",href:"/docs/reference/deployment.md",badge:"DEPLOY"}),b(fy,{title:"CLI 验证命令",text:"查看 microservice health/proxy、server rebuild、job status 等命令入口。",href:"/docs/reference/cli.md",badge:"CLI"}),b(fy,{title:"百度设备码模式",text:"打开百度官方 OAuth Device Code 文档,对照扫码登录和轮询参数。",href:"https://pan.baidu.com/union/doc/fl1x114ti",badge:"OFFICIAL"}))),b(Yi,{title:"设备码登录",eyebrow:"OAuth Device Code",className:"baidu-login-panel",loading:n.actionLoading,actions:b("div",{className:"panel-actions inline-actions"},b("button",{type:"button",className:"primary-btn",onClick:W,disabled:n.actionLoading||!h,"data-testid":"baidu-netdisk-start-login"},"生成二维码"),c?.id?b("button",{type:"button",className:"ghost-btn",onClick:()=>p(!0),disabled:n.actionLoading},"检查状态"):null,yl?b("button",{type:"button",className:"ghost-btn",onClick:O,disabled:n.actionLoading},"清除本地登录"):null,b(In,{title:"Baidu Device Session",data:c||X.latestSession,onOpen:u,testId:"raw-baidu-device-session"}))},b("div",{className:"baidu-login-card","data-testid":"baidu-netdisk-login-card"},b("div",{className:"baidu-qr-frame"},c?.qrcodeUrl?b("img",{src:c.qrcodeUrl,alt:"百度网盘设备码授权二维码","data-testid":"baidu-netdisk-qrcode"}):b(ry,{title:h?"等待二维码":"OAuth 未配置",text:h?"点击生成二维码后使用百度网盘或百度 App 扫码":"设置 client id、secret 和 token key 后重建服务"})),b("div",{className:"claudeqq-login-copy"},b("div",{className:"node-version-line"},b(Si,{status:yl?"online":c?.status==="pending"?"warn":"unknown"},yl?"已登录":c?.status||"未开始"),b("span",null,c?.secondsRemaining!==void 0?`${c.secondsRemaining}s`:"--"),b("span",null,"scope basic,netdisk")),b("p",{className:"muted paragraph"},yl?"access token / refresh token 已加密保存到 PostgreSQL;前端只看到脱敏登录态。":"后端使用百度 OAuth Device Code 轮询换取 token;二维码过期后重新生成即可。"),b("div",{className:"microservice-ref-card"},b("span",null,"User Code"),b("strong",null,c?.userCode||"--"),b("code",null,c?.verificationUrl||"https://openapi.baidu.com/device")),b("div",{className:"microservice-ref-card"},b("span",null,"Expires"),b("strong",null,c?.expiresAt?Ll(c.expiresAt):"--"),b("code",null,c?.error||"no token exposed"))))),b(Yi,{title:"账号与容量",eyebrow:n.refreshedAt?`Updated ${iu(n.refreshedAt)}`:"Account",loading:n.loading,actions:b("div",{className:"panel-actions inline-actions"},b(In,{title:"Baidu Account",data:K,onOpen:u,testId:"raw-baidu-account"}))},K?b("div",{className:"baidu-account-card"},b("div",{className:"node-version-line"},b(Si,{status:"online"},"connected"),b("span",null,K.baiduUid||"--"),b("span",null,`VIP ${K.vipType??"--"}`)),b("h3",null,K.username||"Baidu Netdisk"),b("p",{className:"muted paragraph"},`工作目录固定在 ${K.rootPath||J};v1 上传/下载只读写容器 staging 目录,不把大文件字节流穿过 UniDesk proxy。`),b("div",{className:"quota-bar"},b("span",{style:{width:`${Math.max(0,Math.min(100,Number(fl.usedPercent||0)))}%`}})),b("div",{className:"microservice-ref-card"},b("span",null,"Quota"),b("strong",null,`${Mt(fl.used)} / ${Mt(fl.total)}`),b("code",null,`${fl.usedPercent||0}% used`))):b(ry,{title:"尚未登录",text:"扫码授权后这里会显示账号、UID、会员状态和容量"})),b(Yi,{title:"传输任务",eyebrow:"staging path jobs",className:"baidu-transfers-panel",loading:n.actionLoading,actions:b("div",{className:"panel-actions inline-actions"},b("button",{type:"button",className:"primary-btn",onClick:C,disabled:!yl||n.actionLoading,"data-testid":"baidu-netdisk-self-test"},"运行自测"),b("button",{type:"button",className:"ghost-btn",onClick:m},"刷新任务"),b(In,{title:"Baidu Transfers",data:n.transfers,onOpen:u,testId:"raw-baidu-transfers"}))},b("div",{className:"baidu-transfer-forms"},b("form",{className:"stack-form",onSubmit:P,"data-testid":"baidu-upload-form"},b("label",null,"容器 staging 文件",b("input",{value:j.localPath,onChange:(s)=>N((ul)=>({...ul,localPath:s.target.value})),placeholder:"sample.txt"})),b("label",null,"百度网盘目标路径",b("input",{value:j.remotePath,onChange:(s)=>N((ul)=>({...ul,remotePath:s.target.value})),placeholder:w2(J,"sample.txt")})),b("button",{type:"submit",className:"primary-btn",disabled:!yl||n.actionLoading},"上传 staging 文件")),b("form",{className:"stack-form",onSubmit:H,"data-testid":"baidu-download-form"},b("label",null,"文件 fs_id",b("input",{value:U.fsId,onChange:(s)=>w((ul)=>({...ul,fsId:s.target.value})),placeholder:"从文件表填入"})),b("label",null,"保存到 staging 路径",b("input",{value:U.localPath,onChange:(s)=>w((ul)=>({...ul,localPath:s.target.value})),placeholder:"downloads/"})),b("button",{type:"submit",className:"primary-btn",disabled:!yl||!U.fsId||n.actionLoading},"下载到 staging"))),n.selfTest?b("div",{className:"baidu-account-card","data-testid":"baidu-netdisk-self-test-result"},b("div",{className:"node-version-line"},b(Si,{status:n.selfTest.ok?"online":"warn"},n.selfTest.ok?"self-test ok":"self-test"),b("span",null,Mt(n.selfTest.sizeBytes))),b("h3",null,n.selfTest.remotePath||"Baidu self-test"),b("div",{className:"microservice-ref-card"},b("span",null,"fs_id"),b("strong",null,n.selfTest.fsId||"--"),b("code",null,n.selfTest.downloadedPath||"--")),b("div",{className:"microservice-ref-card"},b("span",null,"MD5"),b("strong",null,n.selfTest.downloadedMd5||"--"),b("code",null,n.selfTest.expectedMd5||"--")),b(In,{title:"Baidu Self Test",data:n.selfTest,onOpen:u,testId:"raw-baidu-self-test"})):null,o.length===0?b(ry,{title:"暂无传输任务",text:"上传/下载任务会在后端容器内执行,避免大文件穿过 UniDesk proxy"}):b("div",{className:"table-wrap","data-testid":"baidu-transfer-table"},b("table",null,b("thead",null,b("tr",null,b("th",null,"状态"),b("th",null,"方向"),b("th",null,"路径"),b("th",null,"进度"),b("th",null,"时间"),b("th",null,"操作"))),b("tbody",null,o.map((s)=>b("tr",{key:s.id},b("td",null,b(Si,{status:s.status},s.status)),b("td",null,s.direction),b("td",null,b("strong",null,s.remotePath||s.fsId||"--"),b("code",null,s.localPath||"--"),s.error?b("span",{className:"form-error"},s.error):null),b("td",null,b(dE,{percent:s.progressPercent}),b("span",{className:"muted"},`${Mt(s.bytesDone)} / ${Mt(s.sizeBytes)}`)),b("td",null,Ll(s.updatedAt)),b("td",null,b("div",{className:"inline-actions"},["queued","running"].includes(s.status)?b("button",{type:"button",className:"ghost-btn",onClick:()=>B(s.id,"cancel")},"取消"):null,["failed","canceled"].includes(s.status)?b("button",{type:"button",className:"ghost-btn",onClick:()=>B(s.id,"retry")},"重试"):null,b(In,{title:`Transfer ${s.id}`,data:s,onOpen:u}))))))))),b(Yi,{title:"安全与日志",eyebrow:"redacted diagnostics",className:"baidu-wide-panel",loading:n.loading,actions:b("div",{className:"panel-actions inline-actions"},b(In,{title:"Baidu Health",data:v,onOpen:u,testId:"raw-baidu-health"}),b(In,{title:"Baidu Logs",data:n.logs,onOpen:u,testId:"raw-baidu-logs"}))},b("div",{className:"policy-grid"},b("article",null,b("b",null,"私有后端"),b("span",null,"4244 只在 Compose 网络 expose,浏览器经 UniDesk 同源代理访问")),b("article",null,b("b",null,"Token 加密"),b("span",null,"access/refresh token 使用 BAIDU_NETDISK_TOKEN_KEY 加密后写入 PostgreSQL")),b("article",null,b("b",null,"无浏览器大文件流"),b("span",null,"上传/下载以容器 staging 目录为边界,避免 proxy 文本通道传输大字节流"))))))}var N3=Ml(Ju(),1);var ll=N3.default.createElement,{useEffect:eE}=N3.default,F3=N3.default.useState,Xi={label:"主用户私聊账号",userId:645275593};function q2(l){let u=Number(l);return Number.isFinite(u)?u.toLocaleString("zh-CN"):"--"}async function st(l,u={}){return Tl(l,{failureFields:["ok","success"],...u})}async function lp(l){let u=await fetch(l,{credentials:"same-origin"}),r=await u.text();try{return r?JSON.parse(r):{ok:u.ok,status:u.status}}catch{return{ok:u.ok,status:u.status,text:r}}}function j3({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return ll("span",{className:`status-badge ${r}`},u||l||"unknown")}function ny({label:l,value:u,hint:r,tone:f}){return ll("article",{className:`metric-card ${f||""}`},ll("div",{className:"metric-label"},l),ll("div",{className:"metric-value"},u),ll("div",{className:"metric-hint"},r))}function ty({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return ll("section",{className:`panel ${n||""}`},ll("div",{className:"panel-head"},ll("div",null,u?ll("p",{className:"panel-eyebrow"},u):null,ll(nu,{title:l,loading:t})),r?ll("div",{className:"panel-actions"},r):null),ll("div",{className:"panel-body"},f))}function t1({title:l,data:u,onOpen:r,testId:f}){return ll("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:(n)=>{n?.stopPropagation?.(),r(l,u)}},"查看原始JSON")}function i1({title:l,text:u}){return ll("div",{className:"empty-state"},ll("strong",null,l),ll("span",null,u))}function up(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function rp(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function fp(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function Rt(l,u){return`${l}/microservices/claudeqq/proxy${u}`}function np(l){return Array.isArray(l?.events)?l.events.slice(0,80):[]}function tp(l){return Array.isArray(l?.subscriptions)?l.subscriptions.slice(0,50):[]}function ip(l){return Array.isArray(l?.messages)?l.messages.slice(0,30):[]}function HU(l){let u=l?.text??l?.message??l?.raw?.raw_message;if(typeof u!=="string")return"--";return u.length>180?`${u.slice(0,177)}...`:u}function BU(l){let u=l?.groupId??l?.group_id??(l?.message_type==="group"?l?.target_id:void 0),r=l?.userId??l?.user_id??(l?.message_type==="private"?l?.target_id:void 0);if(u)return`群 ${u}`;if(r)return`私聊 ${r}`;return"--"}function DU({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((K)=>K.id==="claudeqq")||null,[n,t]=F3({loading:!1,qrLoading:!1,error:"",health:null,status:null,napcatLogin:null,napcatQrcode:null,qrcodeFetched:!1,qrcodeRefreshedAt:null,events:null,subscriptions:null,sent:null,refreshedAt:null}),[i,y]=F3({targetType:"private",targetId:String(Xi.userId),message:""}),[c,_]=F3({name:"unidesk-callback",targetUrl:"",eventTypes:"message",secret:""}),[A,F]=F3(""),{addNotification:j}=Xr();async function N(){if(!f)return;t((K)=>({...K,loading:!0,error:""}));try{let[K,X,I,o,fl]=await Promise.all([lp(`${r}/microservices/claudeqq/health`),st(Rt(r,"/api/server/status")),st(Rt(r,"/api/events/recent?limit=60")),st(Rt(r,"/api/events/subscriptions")),st(Rt(r,"/api/messages/sent?limit=20"))]);if(t((yl)=>({...yl,loading:!1,error:"",health:K,status:X,events:I,subscriptions:o,sent:fl,refreshedAt:new Date})),!n.qrcodeFetched)U(!1)}catch(K){t((X)=>({...X,loading:!1,error:zl(K,"ClaudeQQ 加载失败")}))}}async function U(K=!0){if(!f)return;t((X)=>({...X,qrLoading:!0,error:K?"":X.error}));try{let X=await st(Rt(r,"/api/napcat/login")),I=X?.napcat?.qrcode||X?.qrcode||null;t((o)=>({...o,qrLoading:!1,error:"",napcatLogin:X,napcatQrcode:I,qrcodeFetched:!0,qrcodeRefreshedAt:new Date}))}catch(X){t((I)=>({...I,qrLoading:!1,error:K||!I.napcatQrcode?zl(X,"NapCat 二维码加载失败"):I.error}))}}async function w(K){K.preventDefault(),F("");let X=Number(i.targetId);if(!Number.isFinite(X)||X<=0||i.message.trim().length===0){t((I)=>({...I,error:"请填写 QQ 目标和消息内容"}));return}try{await st(Rt(r,"/api/push/text"),{method:"POST",body:JSON.stringify({userId:i.targetType==="private"?X:void 0,groupId:i.targetType==="group"?X:void 0,message:i.message})});let I="消息推送请求已提交";y((o)=>({...o,targetType:"private",targetId:String(Xi.userId),message:""})),F(I),j("success",I),await N()}catch(I){t((o)=>({...o,error:zl(I,"发送失败")}))}}async function G(K){if(K.preventDefault(),F(""),c.targetUrl.trim().length===0){t((X)=>({...X,error:"请填写订阅回调 URL"}));return}try{await st(Rt(r,"/api/events/subscriptions"),{method:"POST",body:JSON.stringify({name:c.name,targetUrl:c.targetUrl,eventTypes:c.eventTypes.split(",").map((I)=>I.trim()).filter(Boolean),secret:c.secret||void 0,enabled:!0})});let X="事件订阅已创建";F(X),j("success",X),await N()}catch(X){t((I)=>({...I,error:zl(X,"订阅失败")}))}}async function J(K){if(!K)return;F("");try{await st(Rt(r,`/api/events/subscriptions/${encodeURIComponent(K)}`),{method:"DELETE"});let X="事件订阅已删除";F(X),j("success",X),await N()}catch(X){t((I)=>({...I,error:zl(X,"删除订阅失败")}))}}if(eE(()=>{if(!f)return;N();return},[f?.id,f?.runtime?.providerStatus]),!f)return ll(i1,{title:"ClaudeQQ 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=claudeqq"});let Q=up(f),m=fp(f),q=rp(f),W=n.health||{},p=n.status||{},O=n.napcatLogin||{},Z=W.napcat||p.napcat||{},V={...O.napcat||{},...Z,qrcode:n.napcatQrcode||{},webui:Z.webui||O.napcat?.webui},P=O.login||{},H=n.napcatQrcode||{},B=np(n.events),C=tp(n.subscriptions),E=ip(n.sent),D=Boolean(V.httpConnected||P.ready),Y=String(V.loginState||P.state||(D?"logged_in":"unknown")),v=Boolean(H.available&&H.dataUrl);return ll("div",{className:"claudeqq-page","data-testid":"claudeqq-page"},ll(ty,{title:"ClaudeQQ 工作台",eyebrow:"D601 QQ Event Gateway",loading:n.loading,actions:ll("div",{className:"panel-actions"},ll("button",{type:"button",className:"ghost-btn",onClick:N,disabled:n.loading,"data-testid":"claudeqq-refresh-button"},n.loading?"刷新中":"刷新"),ll(t1,{title:"ClaudeQQ 用户服务",data:f,onOpen:u,testId:"raw-claudeqq-service"}))},ll("div",{className:"findjob-hero"},ll("div",null,ll("div",{className:"node-version-line"},ll(j3,{status:Q.providerStatus==="online"?"online":"warn"},Q.providerStatus||"unknown"),ll("span",null,f.providerId),ll("span",null,q.public?"公网暴露":"仅 UniDesk frontend 代理访问")),ll("p",{className:"muted paragraph"},f.description)),ll("div",{className:"microservice-ref-card"},ll("span",null,"Repo"),ll("strong",null,m.url||"--"),ll("code",null,m.commitId||"--")),ll("div",{className:"microservice-ref-card"},ll("span",null,"D601 k3s Service"),ll("strong",null,`${q.nodeBindHost||"--"}:${q.nodePort||"--"}`),ll("code",null,`${q.proxyMode||"--"} / ${m.composeFile||"--"}`))),ll(el,{error:n.error,wide:!0})),ll("div",{className:"metric-grid"},ll(ny,{label:"Health",value:W.ok||W.status==="ok"?"OK":"--",hint:"D601 /health",tone:W.ok||W.status==="ok"?"ok":"warn"}),ll(ny,{label:"NapCat HTTP",value:V.httpConnected||V.http?.connected?"OK":"离线",hint:`${V.httpHost||W.napcat?.httpHost||"--"}:${V.httpPort||W.napcat?.httpPort||"--"}`}),ll(ny,{label:"NapCat WS",value:V.wsConnected||V.ws?.connected?"OK":"离线",hint:`${V.wsHost||W.napcat?.wsHost||"--"}:${V.wsPort||W.napcat?.wsPort||"--"}`}),ll(ny,{label:"事件缓存",value:q2(n.events?.count??B.length),hint:"recent QQ events"}),ll(ny,{label:"订阅",value:q2(n.subscriptions?.count??C.length),hint:"webhook subscribers"}),ll(ny,{label:"已发送",value:q2(n.sent?.count??E.length),hint:"sent message log"})),ll("div",{className:"findjob-grid"},ll(ty,{title:"NapCat 容器登录",eyebrow:"QR Login",className:"claudeqq-login-panel",loading:n.qrLoading,actions:ll("div",{className:"panel-actions inline-actions"},ll("button",{type:"button",className:"ghost-btn",onClick:()=>U(!0),disabled:n.qrLoading,"data-testid":"claudeqq-napcat-refresh"},n.qrLoading?"刷新中":"手动刷新二维码"),ll(t1,{title:"NapCat Login",data:n.napcatLogin,onOpen:u,testId:"raw-claudeqq-napcat-login"}))},ll("div",{className:"claudeqq-login-card","data-testid":"claudeqq-napcat-login"},ll("div",{className:"claudeqq-qr-frame"},v?ll("img",{src:H.dataUrl,alt:"NapCat QQ 登录二维码","data-testid":"claudeqq-napcat-qrcode"}):ll(i1,{title:"等待二维码",text:"NapCat 容器启动后会把登录二维码写入 cache/qrcode.png"})),ll("div",{className:"claudeqq-login-copy"},ll("div",{className:"node-version-line"},ll(j3,{status:D?"online":v?"warn":"unknown"},D?"已登录":v?"待扫码":"等待二维码"),ll("span",null,Y),ll("span",null,"D601 containerized")),ll("p",{className:"muted paragraph"},D?"NapCat 已登录,ClaudeQQ 可通过容器内 HTTP/WS 链路收发 QQ 消息。":"用手机 QQ 扫描二维码授权登录。二维码只在首次加载或手动刷新时更新,D601 的 NapCat 端口仍只绑定 127.0.0.1。"),ll("div",{className:"microservice-ref-card"},ll("span",null,"NapCat WebUI"),ll("strong",null,V.webui?.url||"http://napcat:6099/webui"),ll("code",null,"local-only / proxied QR login")),ll("div",{className:"microservice-ref-card"},ll("span",null,"QR Source"),ll("strong",null,H.modifiedAt?Ll(H.modifiedAt):n.qrcodeRefreshedAt?Ll(n.qrcodeRefreshedAt):"--"),ll("code",null,H.file||"/napcat/cache/qrcode.png"))))),ll(ty,{title:"消息推送",eyebrow:"Push API"},ll("div",{className:"microservice-ref-card"},ll("span",null,Xi.label),ll("strong",null,String(Xi.userId)),ll("code",null,"private userId / 默认推送测试目标")),ll("form",{className:"stack-form",onSubmit:w,"data-testid":"claudeqq-push-form"},ll("label",null,"目标类型",ll("select",{value:i.targetType,onChange:(K)=>y((X)=>({...X,targetType:K.target.value}))},ll("option",{value:"private"},"私聊 userId"),ll("option",{value:"group"},"群 groupId"))),ll("label",null,"QQ ID",ll("input",{value:i.targetId,onChange:(K)=>y((X)=>({...X,targetId:K.target.value})),placeholder:String(Xi.userId)})),ll("label",null,"消息内容",ll("textarea",{value:i.message,onChange:(K)=>y((X)=>({...X,message:K.target.value})),rows:4,placeholder:"通过 ClaudeQQ 推送一条 QQ 消息"})),ll("button",{type:"submit",className:"primary-btn"},"发送 QQ 消息")),ll("p",{className:"muted paragraph"},`主 server 和其他用户服务可通过 UniDesk 同源代理调用 /api/push/text;当前人工推送测试默认使用 ${Xi.label} ${Xi.userId},不需要暴露 D601 后端端口。`)),ll(ty,{title:"QQ 事件订阅",eyebrow:"Webhook Subscription",loading:n.loading},ll("form",{className:"stack-form",onSubmit:G,"data-testid":"claudeqq-subscription-form"},ll("label",null,"订阅名称",ll("input",{value:c.name,onChange:(K)=>_((X)=>({...X,name:K.target.value}))})),ll("label",null,"回调 URL",ll("input",{value:c.targetUrl,onChange:(K)=>_((X)=>({...X,targetUrl:K.target.value})),placeholder:"http://host.docker.internal:18080/..."})),ll("label",null,"事件类型",ll("input",{value:c.eventTypes,onChange:(K)=>_((X)=>({...X,eventTypes:K.target.value})),placeholder:"message,notice"})),ll("label",null,"签名密钥",ll("input",{value:c.secret,onChange:(K)=>_((X)=>({...X,secret:K.target.value})),placeholder:"可选,生成 x-claudeqq-signature"})),ll("button",{type:"submit",className:"primary-btn"},"创建订阅")),C.length===0?ll(i1,{title:"暂无订阅",text:"可以为 main server 或其他用户服务注册 HTTP webhook"}):ll("div",{className:"table-wrap","data-testid":"claudeqq-subscription-table"},ll("table",null,ll("thead",null,ll("tr",null,ll("th",null,"名称"),ll("th",null,"状态"),ll("th",null,"事件"),ll("th",null,"回调"),ll("th",null,"最近投递"),ll("th",null,"操作"))),ll("tbody",null,C.map((K)=>ll("tr",{key:K.id},ll("td",null,ll("strong",null,K.name||K.id),ll("code",null,K.id||"--")),ll("td",null,ll(j3,{status:K.enabled?"online":"warn"},K.enabled?"enabled":"disabled")),ll("td",null,Array.isArray(K.eventTypes)?K.eventTypes.join(", "):"message"),ll("td",null,K.targetUrl||"--"),ll("td",null,K.lastDelivery?`${K.lastDelivery.ok?"OK":"FAIL"} ${Ll(K.lastDelivery.at)}`:"--"),ll("td",null,ll("button",{type:"button",className:"ghost-btn",onClick:()=>J(K.id)},"删除"))))))),ll("div",{className:"panel-actions inline-actions"},ll(t1,{title:"ClaudeQQ Subscriptions",data:n.subscriptions,onOpen:u,testId:"raw-claudeqq-subscriptions"}))),ll(ty,{title:"最近 QQ 事件",eyebrow:n.refreshedAt?`Updated ${iu(n.refreshedAt)}`:"Event Stream",loading:n.loading},B.length===0?ll(i1,{title:"暂无事件",text:"等待 NapCat WebSocket 上报 QQ 消息事件,或通过订阅 API 消费后续事件"}):ll("div",{className:"table-wrap","data-testid":"claudeqq-event-list"},ll("table",null,ll("thead",null,ll("tr",null,ll("th",null,"时间"),ll("th",null,"类型"),ll("th",null,"会话"),ll("th",null,"消息"),ll("th",null,"ID"))),ll("tbody",null,B.map((K)=>ll("tr",{key:K.id},ll("td",null,Ll(K.receivedAt||K.timestamp)),ll("td",null,ll(j3,{status:K.postType||K.eventType},K.postType||K.eventType||"--")),ll("td",null,BU(K)),ll("td",null,HU(K)),ll("td",null,ll("code",null,K.messageId||K.id||"--"))))))),ll("div",{className:"panel-actions inline-actions"},ll(t1,{title:"ClaudeQQ Events",data:n.events,onOpen:u,testId:"raw-claudeqq-events"}))),ll(ty,{title:"已发送消息",eyebrow:`${E.length} Sent`,loading:n.loading},E.length===0?ll(i1,{title:"暂无发送记录",text:"发送日志来自 ClaudeQQ bot_workspace/messages/sent_messages.jsonl"}):ll("div",{className:"table-wrap"},ll("table",null,ll("thead",null,ll("tr",null,ll("th",null,"时间"),ll("th",null,"目标"),ll("th",null,"消息"),ll("th",null,"结果"))),ll("tbody",null,E.map((K,X)=>ll("tr",{key:K.id||X},ll("td",null,Ll(K.timestamp||K.sentAt||K.createdAt)),ll("td",null,BU(K)),ll("td",null,HU(K)),ll("td",null,K.status||K.messageId||K.message_id||"--")))))),ll("div",{className:"panel-actions inline-actions"},ll(t1,{title:"ClaudeQQ Sent Messages",data:n.sent,onOpen:u,testId:"raw-claudeqq-sent"})))))}var w1=Ml(Ju(),1);var YU=Ml(Ju(),1),qu=YU.default.createElement;function c1({markdown:l,className:u,testId:r}){let f=String(l??"").trimEnd(),n=["markdown-body",u].filter(Boolean).join(" ");return qu("div",{className:n,"data-testid":r},XU(f,"md"))}function XU(l,u){let r=yp(l).split(` +`),f=[],n=0;while(n\s?/u.test(t)){let F=[];while(n\s?(.*)$/u);if(N!==null){F.push(N[1]),n+=1;continue}if(j.trim().length===0){F.push(""),n+=1;continue}break}f.push(qu("blockquote",{key:`${u}-quote-${n}`},XU(F.join(` +`),`${u}-quote-${n}`)));continue}if(CU(r,n)){let F=n,j=y1(r[n]??""),N=y1(r[n+1]??"");n+=2;let U=[];while(n0)U.push(y1(r[n]??"")),n+=1;f.push(Fp(j,N,U,`${u}-table-${F}`));continue}let c=U3(t);if(c!==null){let F=n,j=c.ordered,N=c.start,U=[];while(n_p(G,`${u}-list-${F}-${J}`))));continue}let _=n,A=[];while(n0&&!$p(r,n))A.push(r[n].trim()),n+=1;if(A.length===0)A.push(t.trim()),n+=1;f.push(qu("p",{key:`${u}-p-${_}`},qn(A.join(` `),`${u}-p-${_}`)))}return f}function yp(l){return String(l||"").replace(/\r\n/gu,` `).replace(/\r/gu,` -`).trimEnd()}function XU(l){let u=l.match(/^\s*(```+|~~~+)\s*([A-Za-z0-9_-]+)?\s*$/u);if(u===null)return null;let r=u[1];return{marker:r.startsWith("`")?"`":"~",length:r.length,language:u[2]||""}}function cp(l,u){let r=l.trim();return r.length>=u.length&&r.split("").every((f)=>f===u.marker)}function q2(l){return/^(?: {4}|\t)/u.test(l)}function DU(l,u,r){let f=u.trim().length>0?`language-${Np(u)}`:void 0;return qu("pre",{key:r,className:"markdown-code-block"},qu("code",{className:f},l))}function $p(l,u){let r=l[u]??"";if(r.trim().length===0)return!0;return XU(r)!==null||q2(r)||/^(#{1,6})\s+.+$/u.test(r)||/^\s*(?:---+|\*\*\*+|___+)\s*$/u.test(r)||/^\s*>\s?/u.test(r)||PU(l,u)||U3(r)!==null}function U3(l){let u=l.match(/^\s{0,3}[-*+]\s+(.+)$/u);if(u!==null)return{ordered:!1,text:u[1]};let r=l.match(/^\s{0,3}(\d+)[.)]\s+(.+)$/u);if(r!==null)return{ordered:!0,start:Number(r[1]),text:r[2]};return null}function _p(l,u){let r=l.match(/^\[([ xX])\]\s+(.+)$/u);if(r!==null){let f=r[1].toLowerCase()==="x";return qu("li",{key:u,className:"task-list-item"},qu("input",{type:"checkbox",checked:f,readOnly:!0,tabIndex:-1}),qu("span",null,qn(r[2],`${u}-task`)))}return qu("li",{key:u},qn(l,u))}function PU(l,u){let r=l[u]??"",f=l[u+1]??"";if(!r.includes("|")||!f.includes("|"))return!1;let n=y1(r),t=y1(f);return n.length>1&&t.length===n.length&&t.every((i)=>/^:?-{3,}:?$/u.test(i.trim()))}function y1(l){let u=l.trim();if(u.startsWith("|"))u=u.slice(1);if(u.endsWith("|"))u=u.slice(0,-1);return u.split("|").map((r)=>r.trim())}function Ap(l){let u=l.trim();if(u.startsWith(":")&&u.endsWith(":"))return"center";if(u.endsWith(":"))return"right";if(u.startsWith(":"))return"left";return}function Fp(l,u,r,f){let n=u.map(Ap);return qu("div",{key:f,className:"markdown-table-wrap"},qu("table",null,qu("thead",null,qu("tr",null,l.map((t,i)=>qu("th",{key:`${f}-h-${i}`,style:n[i]?{textAlign:n[i]}:void 0},qn(t,`${f}-h-${i}`))))),qu("tbody",null,r.map((t,i)=>qu("tr",{key:`${f}-r-${i}`},l.map((y,c)=>qu("td",{key:`${f}-r-${i}-${c}`,style:n[c]?{textAlign:n[c]}:void 0},qn(t[c]||"",`${f}-r-${i}-${c}`))))))))}function qn(l,u,r={}){let f=[],n=/`([^`\n]+)`|\[([^\]\n]+)\]\(([^)\s]+)(?:\s+"[^"]*")?\)|(https?:\/\/[^\s<>)]+)|\*\*([^*\n]+)\*\*|__([^_\n]+)__|~~([^~\n]+)~~|\*([^*\n]+)\*|_([^_\n]+)_/gu,t=r.linkify!==!1,i=0,y=0;for(let c of l.matchAll(n)){let _=c[0],A=c.index??0;J3(f,l.slice(i,A),`${u}-text-${y}`),i=A+_.length;let F=`${u}-inline-${y}`;if(y+=1,c[1]!==void 0){f.push(qu("code",{key:F},c[1]));continue}if(c[2]!==void 0&&c[3]!==void 0){if(!t){J3(f,_,`${F}-literal`);continue}f.push(VU(c[2],c[3],F));continue}if(c[4]!==void 0){if(!t){J3(f,_,`${F}-literal`);continue}f.push(VU(c[4],c[4],F));continue}let j=c[5]??c[6];if(j!==void 0){f.push(qu("strong",{key:F},qn(j,`${F}-strong`)));continue}if(c[7]!==void 0){f.push(qu("del",{key:F},qn(c[7],`${F}-del`)));continue}let N=c[8]??c[9];if(N!==void 0)f.push(qu("em",{key:F},qn(N,`${F}-em`)))}return J3(f,l.slice(i),`${u}-text-tail`),f}function J3(l,u,r){if(u.length===0)return;u.split(` -`).forEach((n,t)=>{if(t>0)l.push(qu("br",{key:`${r}-br-${t}`}));if(n.length>0)l.push(n)})}function VU(l,u,r){let f=jp(u);if(f===null)return qu("span",{key:r},l);let n=/^(?:https?:|mailto:)/iu.test(f);return qu("a",{key:r,href:f,target:n?"_blank":void 0,rel:n?"noreferrer":void 0},qn(l,`${r}-label`,{linkify:!1}))}function jp(l){let u=String(l||"").trim();if(/^(?:https?:|mailto:)/iu.test(u))return u;if(u.startsWith("/")&&!u.startsWith("//"))return u;if(u.startsWith("#"))return u;return null}function Np(l){return String(l||"").toLowerCase().replace(/[^a-z0-9_-]+/gu,"-").replace(/^-+|-+$/gu,"")||"text"}var E2=Ml(Ju(),1);var Pl=E2.default.createElement,{useEffect:Jp,useRef:CU}=E2.default;function Up(l,u){return uQ(l.toTrace(u))}function Qp(l){let u=Number(l);if(!Number.isFinite(u)||u<0)return"--";let r=Math.floor(u/1000),f=Math.floor(r/3600),n=Math.floor(r%3600/60),t=r%60;if(f>0)return`${f}h ${String(n).padStart(2,"0")}m`;if(n>0)return`${n}m ${String(t).padStart(2,"0")}s`;return`${t}s`}function of(l){let u=Number(l);return Number.isFinite(u)&&u>=0?u:null}function yy(l,u=180){let r=String(l||"").replace(/\s+/gu," ").trim();return r.length>u?`${r.slice(0,u-1)}…`:r}function mp(l){if(!l)return 0;return l.split(/\r?\n/u).length}function W2(l){return{ran:"Ran",explored:"Explored",edited:"Edited",toolGroup:"Tool calls",plan:"Plan",message:"Message",system:"System",error:"Error"}[l]||"Message"}function T2(l){let u=Number(l||0);return Number.isFinite(u)&&u>0?`… +${Math.floor(u)} lines`:""}function wp(l){return(Array.isArray(l)?l:[]).reduce((u,r)=>Math.max(u,Number(r?.seq??0)),0)}function hU(l){return["explored","edited","ran"].includes(String(l?.kind||""))}function kU(l){let u={read:0,edit:0,run:0};for(let r of l){let f=String(r?.kind||"");if(f==="explored")u.read+=1;else if(f==="edited")u.edit+=1;else if(f==="ran")u.run+=1}return u}function IU(l){let u=kU(l);return`${u.read} read, ${u.edit} edit, ${u.run} run`}function aU(l){return l.replace(/^['"`([{<]+/u,"").replace(/['"`)\]}>.,;:]+$/u,"").replace(/:\d+(?::\d+)?$/u,"").trim()}function MU(l){let r=String(l||"").match(/(?:~|\.{1,2}|\/)?(?:[A-Za-z0-9_.@+-]+\/)+[A-Za-z0-9_.@+-]+|[A-Za-z0-9_.@+-]+\.(?:c|cc|cpp|h|hpp|js|jsx|ts|tsx|json|md|py|sh|toml|ya?ml|txt|log|lock)/gu)||[],f=[];for(let n of r){let t=aU(n);if(t.length<2||t.includes("..."))continue;if(/^(http|https|status|method)$/iu.test(t))continue;if(!f.includes(t))f.push(t)}return f}function L2(l,u=4){if(l.length===0)return"--";let r=l.slice(0,u).join(", ");return l.length>u?`${r} +${l.length-u}`:r}function sU(l){let u="";for(let r of l){if(r.length===0)continue;if(u.length>0&&!u.endsWith(` +`).trimEnd()}function PU(l){let u=l.match(/^\s*(```+|~~~+)\s*([A-Za-z0-9_-]+)?\s*$/u);if(u===null)return null;let r=u[1];return{marker:r.startsWith("`")?"`":"~",length:r.length,language:u[2]||""}}function cp(l,u){let r=l.trim();return r.length>=u.length&&r.split("").every((f)=>f===u.marker)}function L2(l){return/^(?: {4}|\t)/u.test(l)}function VU(l,u,r){let f=u.trim().length>0?`language-${Np(u)}`:void 0;return qu("pre",{key:r,className:"markdown-code-block"},qu("code",{className:f},l))}function $p(l,u){let r=l[u]??"";if(r.trim().length===0)return!0;return PU(r)!==null||L2(r)||/^(#{1,6})\s+.+$/u.test(r)||/^\s*(?:---+|\*\*\*+|___+)\s*$/u.test(r)||/^\s*>\s?/u.test(r)||CU(l,u)||U3(r)!==null}function U3(l){let u=l.match(/^\s{0,3}[-*+]\s+(.+)$/u);if(u!==null)return{ordered:!1,text:u[1]};let r=l.match(/^\s{0,3}(\d+)[.)]\s+(.+)$/u);if(r!==null)return{ordered:!0,start:Number(r[1]),text:r[2]};return null}function _p(l,u){let r=l.match(/^\[([ xX])\]\s+(.+)$/u);if(r!==null){let f=r[1].toLowerCase()==="x";return qu("li",{key:u,className:"task-list-item"},qu("input",{type:"checkbox",checked:f,readOnly:!0,tabIndex:-1}),qu("span",null,qn(r[2],`${u}-task`)))}return qu("li",{key:u},qn(l,u))}function CU(l,u){let r=l[u]??"",f=l[u+1]??"";if(!r.includes("|")||!f.includes("|"))return!1;let n=y1(r),t=y1(f);return n.length>1&&t.length===n.length&&t.every((i)=>/^:?-{3,}:?$/u.test(i.trim()))}function y1(l){let u=l.trim();if(u.startsWith("|"))u=u.slice(1);if(u.endsWith("|"))u=u.slice(0,-1);return u.split("|").map((r)=>r.trim())}function Ap(l){let u=l.trim();if(u.startsWith(":")&&u.endsWith(":"))return"center";if(u.endsWith(":"))return"right";if(u.startsWith(":"))return"left";return}function Fp(l,u,r,f){let n=u.map(Ap);return qu("div",{key:f,className:"markdown-table-wrap"},qu("table",null,qu("thead",null,qu("tr",null,l.map((t,i)=>qu("th",{key:`${f}-h-${i}`,style:n[i]?{textAlign:n[i]}:void 0},qn(t,`${f}-h-${i}`))))),qu("tbody",null,r.map((t,i)=>qu("tr",{key:`${f}-r-${i}`},l.map((y,c)=>qu("td",{key:`${f}-r-${i}-${c}`,style:n[c]?{textAlign:n[c]}:void 0},qn(t[c]||"",`${f}-r-${i}-${c}`))))))))}function qn(l,u,r={}){let f=[],n=/`([^`\n]+)`|\[([^\]\n]+)\]\(([^)\s]+)(?:\s+"[^"]*")?\)|(https?:\/\/[^\s<>)]+)|\*\*([^*\n]+)\*\*|__([^_\n]+)__|~~([^~\n]+)~~|\*([^*\n]+)\*|_([^_\n]+)_/gu,t=r.linkify!==!1,i=0,y=0;for(let c of l.matchAll(n)){let _=c[0],A=c.index??0;J3(f,l.slice(i,A),`${u}-text-${y}`),i=A+_.length;let F=`${u}-inline-${y}`;if(y+=1,c[1]!==void 0){f.push(qu("code",{key:F},c[1]));continue}if(c[2]!==void 0&&c[3]!==void 0){if(!t){J3(f,_,`${F}-literal`);continue}f.push(SU(c[2],c[3],F));continue}if(c[4]!==void 0){if(!t){J3(f,_,`${F}-literal`);continue}f.push(SU(c[4],c[4],F));continue}let j=c[5]??c[6];if(j!==void 0){f.push(qu("strong",{key:F},qn(j,`${F}-strong`)));continue}if(c[7]!==void 0){f.push(qu("del",{key:F},qn(c[7],`${F}-del`)));continue}let N=c[8]??c[9];if(N!==void 0)f.push(qu("em",{key:F},qn(N,`${F}-em`)))}return J3(f,l.slice(i),`${u}-text-tail`),f}function J3(l,u,r){if(u.length===0)return;u.split(` +`).forEach((n,t)=>{if(t>0)l.push(qu("br",{key:`${r}-br-${t}`}));if(n.length>0)l.push(n)})}function SU(l,u,r){let f=jp(u);if(f===null)return qu("span",{key:r},l);let n=/^(?:https?:|mailto:)/iu.test(f);return qu("a",{key:r,href:f,target:n?"_blank":void 0,rel:n?"noreferrer":void 0},qn(l,`${r}-label`,{linkify:!1}))}function jp(l){let u=String(l||"").trim();if(/^(?:https?:|mailto:)/iu.test(u))return u;if(u.startsWith("/")&&!u.startsWith("//"))return u;if(u.startsWith("#"))return u;return null}function Np(l){return String(l||"").toLowerCase().replace(/[^a-z0-9_-]+/gu,"-").replace(/^-+|-+$/gu,"")||"text"}var p2=Ml(Ju(),1);var Pl=p2.default.createElement,{useEffect:Jp,useRef:hU}=p2.default;function Up(l,u){return rQ(l.toTrace(u))}function Qp(l){let u=Number(l);if(!Number.isFinite(u)||u<0)return"--";let r=Math.floor(u/1000),f=Math.floor(r/3600),n=Math.floor(r%3600/60),t=r%60;if(f>0)return`${f}h ${String(n).padStart(2,"0")}m`;if(n>0)return`${n}m ${String(t).padStart(2,"0")}s`;return`${t}s`}function of(l){let u=Number(l);return Number.isFinite(u)&&u>=0?u:null}function yy(l,u=180){let r=String(l||"").replace(/\s+/gu," ").trim();return r.length>u?`${r.slice(0,u-1)}…`:r}function mp(l){if(!l)return 0;return l.split(/\r?\n/u).length}function T2(l){return{ran:"Ran",explored:"Explored",edited:"Edited",toolGroup:"Tool calls",plan:"Plan",message:"Message",system:"System",error:"Error"}[l]||"Message"}function K2(l){let u=Number(l||0);return Number.isFinite(u)&&u>0?`… +${Math.floor(u)} lines`:""}function wp(l){return(Array.isArray(l)?l:[]).reduce((u,r)=>Math.max(u,Number(r?.seq??0)),0)}function MU(l){return["explored","edited","ran"].includes(String(l?.kind||""))}function IU(l){let u={read:0,edit:0,run:0};for(let r of l){let f=String(r?.kind||"");if(f==="explored")u.read+=1;else if(f==="edited")u.edit+=1;else if(f==="ran")u.run+=1}return u}function aU(l){let u=IU(l);return`${u.read} read, ${u.edit} edit, ${u.run} run`}function oU(l){return l.replace(/^['"`([{<]+/u,"").replace(/['"`)\]}>.,;:]+$/u,"").replace(/:\d+(?::\d+)?$/u,"").trim()}function sU(l){let r=String(l||"").match(/(?:~|\.{1,2}|\/)?(?:[A-Za-z0-9_.@+-]+\/)+[A-Za-z0-9_.@+-]+|[A-Za-z0-9_.@+-]+\.(?:c|cc|cpp|h|hpp|js|jsx|ts|tsx|json|md|py|sh|toml|ya?ml|txt|log|lock)/gu)||[],f=[];for(let n of r){let t=oU(n);if(t.length<2||t.includes("..."))continue;if(/^(http|https|status|method)$/iu.test(t))continue;if(!f.includes(t))f.push(t)}return f}function G2(l,u=4){if(l.length===0)return"--";let r=l.slice(0,u).join(", ");return l.length>u?`${r} +${l.length-u}`:r}function RU(l){let u="";for(let r of l){if(r.length===0)continue;if(u.length>0&&!u.endsWith(` `)&&!r.startsWith(` `))u+=` -`;u+=r}return u}function oU(l){let u=String(l||"").replace(/\r\n/gu,` +`;u+=r}return u}function dU(l){let u=String(l||"").replace(/\r\n/gu,` `).replace(/\r/gu,` `).trimEnd();return u.length>0?u.split(` -`):[]}function K2(l){let u=String(l.status||"").trim();if(u.length>0)return u;let r=String(l.bodyPreview||"");return/^(item\/[A-Za-z]+(?:\/[A-Za-z]+)?):/u.exec(r)?.[1]||"item/fileChange"}function qp(l){let u=String(l.bodyPreview||"");return/file changes status=([A-Za-z0-9_-]+)/u.exec(u)?.[1]}function Lp(l){return/^item\/(?:started|completed): file changes status=/u.test(String(l||"").trim())}function dU(l){if(String(l.kind||"")!=="edited")return!1;let u=String(l.status||""),r=String(l.title||""),f=String(l.bodyPreview||""),n=String(l.commandPreview||"");if(r==="Edited files")return!0;if(/^item\/fileChange\//u.test(u))return!0;if((u==="item/started"||u==="item/completed")&&/file changes status=/u.test(f))return!0;if(/^Success\. Updated the following files:/mu.test(f))return!0;if(/^diff --git /mu.test(f))return!0;return/^([AMDRCU?]{1,2})\s+\S+/mu.test(f)||n.length>0&&m3(f).length>0}function iy(l){return aU(String(l||"").replace(/^[ab]\//u,"").trim())}function p2(l){let u=/^([AMDRCU?]{1,2})\s+(.+)$/u.exec(l);if(!u)return null;let r=iy(u[2]||"");return r.length>0?{status:u[1]||"M",path:r}:null}function z2(l){let u=/^\*\*\*\s+(Add|Update|Delete)\s+File:\s+(.+)$/u.exec(l);if(u){let f=u[1]==="Add"?"A":u[1]==="Delete"?"D":"M",n=iy(u[2]||"");return n.length>0?{status:f,path:n}:null}let r=/^\*\*\*\s+Move to:\s+(.+)$/u.exec(l);if(r){let f=iy(r[1]||"");return f.length>0?{status:"R",path:f}:null}return null}function m3(l){let u=[],r=(n,t)=>{let i=iy(t);if(i.length===0||i==="/dev/null")return;let y=u.find((c)=>c.path===i);if(y){if(y.status==="M"&&n!=="M")y.status=n;return}u.push({status:n,path:i})},f="";for(let n of oU(l)){let t=p2(n)||z2(n);if(t!==null){r(t.status,t.path),f=t.path;continue}let i=/^diff --git a\/(.+?) b\/(.+)$/u.exec(n);if(i){let F=i[2]||i[1]||"";r("M",F),f=iy(F);continue}let y=/^\+\+\+ b\/(.+)$/u.exec(n);if(y&&y[1]!=="/dev/null"){r("M",y[1]||""),f=iy(y[1]||"");continue}if(/^new file mode /u.exec(n)&&f)r("A",f);if(/^deleted file mode /u.exec(n)&&f)r("D",f);let A=/^rename to (.+)$/u.exec(n);if(A)r("R",A[1]||"")}return u}function Gp(l){if(p2(l)!==null||z2(l)!==null)return"file";if(/^(diff --git |index |--- |\+\+\+ |\*\*\* Begin Patch|\*\*\* End Patch)/u.test(l))return"meta";if(/^@@ /u.test(l))return"hunk";if(/^\+/u.test(l))return"add";if(/^-/u.test(l))return"del";if(/^(Success\.|No changes|Updated\b|Created\b|Deleted\b|Added\s+\d+\s+lines?|Wrote\s+\d+\s+lines?|Read\s+\d+\s+files?|\.\.\.\[patch content truncated)/iu.test(l))return"note";return"context"}function O2(l){return oU(l).map((u)=>{let r=p2(u)||z2(u);if(r!==null)return{text:u,kind:"file",path:r.path,status:r.status};return{text:u,kind:Gp(u)}})}function Wp(l){return l.reduce((u,r)=>{if(r.kind==="add")u.added+=1;else if(r.kind==="del")u.removed+=1;return u},{added:0,removed:0})}function RU(l,u){return`${u} ${l} line${l===1?"":"s"}`}function Tp(l,u){let r=[];if(l>0)r.push(RU(l,"Added"));if(u>0)r.push(RU(u,"removed"));return r.join(", ")}function Kp(l){for(let r=l.length-1;r>=0;r-=1){let f=String(l[r]?.status||"").trim();if(f.length>0)return f}let u=String(l[l.length-1]?.method||"").trim();if(u==="item/fileChange/outputDelta")return"updated";if(u==="item/started")return"started";if(u==="item/completed")return"completed";return u.replace(/^item\//u,"")||"changed"}function Ep(l){return`${l} file${l===1?"":"s"}`}function eU(l){let u=l.length>0?l:[],r=sU(u.map((j)=>String(j.bodyPreview||""))),n=sU(u.map((j)=>String(j.bodyPreview||"")).filter((j)=>j.trim().length>0&&!Lp(j)))||r,t=m3(n||r),i=u.map((j)=>({method:K2(j),status:qp(j),at:j.at})),y=O2(n||r),c=Wp(y),_=Tp(c.added,c.removed),A=t.length>0?Ep(t.length):"",F=_.length>0?`${_}${A?` in ${A}`:""}`:t.length>0?A:yy(n||r||"File changes",72);return{status:Kp(i),summary:F,files:t,stages:i,lines:y,addedLines:c.added,removedLines:c.removed,rawText:r}}function pp(l){let u=l[0],r=l[l.length-1]||u,f=eU(l);return{...u,seq:Number.isFinite(Number(r?.seq))?Number(r?.seq):Number(u?.seq??0),at:r?.at||u?.at,title:f.files.length>0?`Edited ${f.summary}`:"Edited files",status:f.status,commandPreview:"",commandOmittedLines:void 0,bodyPreview:f.rawText,bodyOmittedLines:l.reduce((n,t)=>n+Number(t.bodyOmittedLines||0),0)||void 0,rawSeqs:l.flatMap((n)=>Array.isArray(n?.rawSeqs)?n.rawSeqs:[n?.seq]).filter((n)=>n!==void 0),editObservation:f}}function zp(l){let u=Array.isArray(l)?l:[],r=[],f=[],n=()=>{if(f.length===0)return;r.push(pp(f)),f=[]};for(let t of u){if(dU(t)){if(K2(t)==="item/started"&&f.length>0)n();if(f.push(t),K2(t)==="item/completed")n();continue}n(),r.push(t)}return n(),r}function lQ(l){let u=[],r=[],f=[],n=(_,A)=>{for(let F of A)if(!_.includes(F))_.push(F)};for(let _ of l){let A=String(_?.kind||""),F=[_?.commandPreview,_?.bodyPreview,_?.title].map((j)=>String(j||"")).join(` -`);if(A==="explored")n(u,MU(F));else if(A==="edited")n(r,MU(F));else if(A==="ran"){let j=String(_?.commandPreview||_?.title||"").trim();if(j.length>0&&!f.includes(j))f.push(yy(j,90))}}let t=l.map((_)=>Date.parse(String(_?.at||""))).filter((_)=>Number.isFinite(_)),i=t.length>=2?Math.max(0,Math.max(...t)-Math.min(...t)):0,y=l.reduce((_,A)=>_+(of(A?.durationMs)??of(A?.elapsedMs)??0),0),c=i>0?i:y;return{readFiles:u,editedFiles:r,runCommands:f,durationLabel:Qp(c)}}function Op(l,u=3){let r=Array.isArray(l)?l:[],f=[],n=[],t=Math.max(0,u),i=new Set;for(let c=r.length-1;c>=0&&t>0;c-=1){let _=r[c];if(!hU(_))continue;i.add(_),t-=1}let y=()=>{if(n.length>=2){let c=kU(n);f.push({seq:Number(n[0]?.seq??0),at:n[0]?.at||n.at(-1)?.at,kind:"toolGroup",title:IU(n),status:`${n.length} calls`,items:n,counts:c,digest:lQ(n),rawSeqs:n.flatMap((_)=>Array.isArray(_?.rawSeqs)?_.rawSeqs:[_?.seq]).filter((_)=>_!==void 0)})}else f.push(...n);n=[]};for(let c of r){if(hU(c)&&!i.has(c)){n.push(c);continue}y(),f.push(c)}return y(),f}function uQ(l){return(Array.isArray(l)?l:[]).map((u,r)=>({...u,seq:Number.isFinite(Number(u?.seq))?Number(u.seq):r+1,kind:String(u?.kind||"message"),at:u?.at===void 0?void 0:String(u.at),durationMs:of(u?.durationMs)??void 0,title:u?.title===void 0?void 0:String(u.title),status:u?.status===void 0?void 0:String(u.status)}))}function $1(l){let u=of(l?.state?.time?.start)??of(l?.time?.start),r=of(l?.state?.time?.end)??of(l?.time?.end);return of(l?.durationMs)??of(l?.elapsedMs)??of(l?.timing?.durationMs)??of(l?.metadata?.durationMs)??(u!==null&&r!==null&&r>=u?r-u:null)??void 0}function _1(l,u){return l?.createdAt||l?.updatedAt||l?.completedAt||u||void 0}function G2(l,u){return l?.id||l?.messageId||u}function Zp(l,u=1200){if(typeof l==="string")return l;if(l===void 0||l===null)return"";try{return yy(JSON.stringify(l),u)}catch{return yy(String(l),u)}}function rQ(l,u,r){if(typeof l?.metadata?.diff==="string"&&l.metadata.diff.length>0)return l.metadata.diff;if(typeof l?.metadata?.filediff?.patch==="string"&&l.metadata.filediff.patch.length>0)return l.metadata.filediff.patch;if(typeof l?.output==="string"&&l.output.length>0)return l.output;if(typeof l?.result==="string"&&l.result.length>0)return l.result;if(typeof u?.output==="string"&&u.output.length>0)return u.output;if(typeof r?.output==="string"&&r.output.length>0)return r.output;if(typeof l?.metadata?.output==="string"&&l.metadata.output.length>0)return l.metadata.output;return""}function Q3(l,u){if(!l||typeof l!=="object"||Array.isArray(l))return"";for(let r of u){let f=l[r];if(typeof f==="string"&&f.length>0)return f;if(f!==void 0&&f!==null&&typeof f!=="object")return String(f)}return""}function xU(l,u){if(!l||typeof l!=="object"||Array.isArray(l))return null;for(let r of u){let f=Number(l[r]);if(Number.isFinite(f))return f}return null}function fQ(l,u){let r=u?.input&&typeof u.input==="object"&&!Array.isArray(u.input)?u.input:l?.input&&typeof l.input==="object"&&!Array.isArray(l.input)?l.input:{},f=Q3(r,["command","cmd","script"]);if(f.length>0)return f;if(typeof l?.command==="string"&&l.command.length>0)return l.command;if(typeof u?.command==="string"&&u.command.length>0)return u.command;let n=String(l?.tool||l?.title||"tool"),t=Q3(r,["filePath","filepath","path"])||Q3(l,["filePath","filepath","path"]),i=Q3(r,["pattern","query"]),y=xU(r,["offset"]),c=xU(r,["limit"]),_=[n];if(i.length>0)_.push(i);if(t.length>0)_.push(t);if(y!==null)_.push(`offset=${y}`);if(c!==null)_.push(`limit=${c}`);return _.length>1?_.join(" "):n}function Hp(l,u){let r=l?.part&&typeof l.part==="object"&&!Array.isArray(l.part)?l.part:{},f=String(l?.type||l?.event||l?.name||r?.type||"").toLowerCase(),n=String(r?.type||"").toLowerCase(),t=l?.at||l?.timestamp||r?.updatedAt||r?.createdAt,i=Number.isFinite(Number(l?.seq))?Number(l.seq):u;if(f==="step_start"||f==="step-start"||n==="step-start")return null;if(f==="step_finish"||f==="step-finish"||n==="step-finish")return null;if(n==="tool"||/tool|bash|command/iu.test(`${f} ${n}`)){let c=r?.state&&typeof r.state==="object"&&!Array.isArray(r.state)?r.state:{},_=fQ(r,c),A=rQ(c,r,l),F=nQ(_,String(r?.tool||r?.title||"")),j=F==="edited"?{status:String(c?.status||r?.status||l?.status||""),summary:yy(A||_,72),files:m3(A),stages:[],lines:O2(A),addedLines:0,removedLines:0,rawText:A}:void 0;return{seq:i,at:_1(r,t),kind:F,title:String(c?.title||r?.title||c?.metadata?.description||r?.tool||"OpenCode tool"),status:String(c?.status||r?.status||l?.status||""),commandPreview:_,bodyPreview:A,durationMs:$1(r),rawSeqs:[r?.id||r?.callID||l?.sessionID||i],editObservation:j}}let y=Zp(r?.text??r?.content??r?.delta??l?.text??l?.content??l?.delta,3000).trim();if(y.length>0)return{seq:i,at:_1(r,t),kind:n==="reasoning"?"message":/error|failed/iu.test(`${f} ${n}`)?"error":"message",title:n==="reasoning"?"Reasoning":/error|failed/iu.test(`${f} ${n}`)?"OpenCode error":"Assistant message",status:`opencode/${f||n||"event"}`,bodyPreview:y,durationMs:$1(r),rawSeqs:[r?.id||l?.sessionID||i]};return null}function nQ(l,u){let r=`${u} ${l}`.toLowerCase();if(/\b(read|grep|glob|list|ls|find|search|view|cat|sed|rg|head|tail|wc|file)\b/iu.test(r))return"explored";if(/\b(edit|write|patch|apply|update|create|delete|apply_patch|git apply|cat >|tee .*<<|sed -i|python3? .*write_text|mkdir|rm |touch )\b/iu.test(r))return"edited";return"ran"}function Bp(l){let u=[],r=1;for(let f of Array.isArray(l)?l:[]){if(f?.kind&&f?.title){let y=String(f?.status||"");if(y==="opencode/step-start"||y==="opencode/step-finish")continue;u.push({...f,seq:Number.isFinite(Number(f?.seq))?Number(f.seq):r++});continue}let n=f?.createdAt||f?.updatedAt||f?.completedAt,t=String(f?.role||"assistant").toLowerCase(),i=Array.isArray(f?.parts)?f.parts:[];if(i.length===0){if(f?.part&&(f?.sessionID||String(f?.type||"").startsWith("step_")||String(f?.type||"").includes("tool"))){let y=Hp(f,r);if(y!==null)u.push(y),r=Math.max(r+1,Number(y.seq)+1)}else if(f?.textPreview)u.push({seq:r++,at:n,kind:"message",title:`${t||"assistant"} message`,status:t,bodyPreview:String(f.textPreview),rawSeqs:[f?.messageId||r]});continue}for(let y of i){let c=String(y?.type||"").toLowerCase();if(c==="step-start"||c==="step-finish")continue;if(c==="text"||c==="reasoning"){let A=String(y?.textPreview||f?.textPreview||"").trim();if(A.length===0)continue;u.push({seq:r++,at:_1(y,n),kind:"message",title:c==="reasoning"?"Reasoning":t==="user"?"User message":t==="system"?"System message":"Assistant message",status:c==="reasoning"?"reasoning":t,bodyPreview:A,durationMs:$1(y),rawSeqs:[G2(y,r)]});continue}if(c==="tool"){let A=y?.state&&typeof y.state==="object"&&!Array.isArray(y.state)?y.state:{},F=fQ(y,A),j=rQ(A,y,{}),N=nQ(F,String(y?.tool||y?.title||"")),U=N==="edited"?{status:String(A?.status||y?.status||""),summary:yy(j||F,72),files:m3(j),stages:[],lines:O2(j),addedLines:0,removedLines:0,rawText:j}:void 0;u.push({seq:r++,at:_1(y,n),kind:N,title:String(y?.title||y?.tool||"tool"),status:String(y?.status||""),commandPreview:F,bodyPreview:j,durationMs:$1(y),rawSeqs:[G2(y,r)],editObservation:U});continue}let _=String(y?.textPreview||y?.title||c||"").trim();if(_)u.push({seq:r++,at:_1(y,n),kind:"system",title:c||"part",bodyPreview:_,status:String(y?.status||""),durationMs:$1(y),rawSeqs:[G2(y,r)]})}}return u}var tQ={source:"opencode",toTrace:Bp};function Dp(l){return String(l||"unknown").toLowerCase().replace(/[^a-z0-9_-]+/gu,"-")||"unknown"}function bU(l){let u=String(l||"M").toUpperCase();if(u.startsWith("A")||u==="??")return"added";if(u.startsWith("D"))return"deleted";if(u.startsWith("R"))return"renamed";return"modified"}function Vp(l){if(l==="item/fileChange/outputDelta")return"delta";return l.replace(/^item\//u,"")}function Sp(l,u){if(l.kind==="file"){let n=String(l.status||"M");return Pl("div",{key:`${u}-${l.text}`,className:`codex-edit-diff-line file ${bU(n)}`},Pl("span",{className:`codex-edit-file-status ${bU(n)}`},n),Pl("code",null,l.path||l.text.replace(/^([AMDRCU?]{1,2})\s+/u,"")))}let r=l.kind==="add"||l.kind==="del"?l.text.slice(0,1):l.kind==="hunk"?"@@":l.kind==="note"?"ok":"",f=l.kind==="add"||l.kind==="del"?l.text.slice(1):l.text;return Pl("div",{key:`${u}-${l.text}`,className:`codex-edit-diff-line ${l.kind}`},Pl("span",{className:"codex-edit-diff-sign"},r),Pl("code",null,f||" "))}function Yp(l,u){let r=l.lines.length>0?l.lines:l.files.map((n)=>({text:`${n.status} ${n.path}`,kind:"file",path:n.path,status:n.status})),f=Number(l.addedLines||0)+Number(l.removedLines||0)>0;return Pl("div",{className:"codex-edit-observation","data-testid":"codex-edit-observation"},Pl("div",{className:"codex-edit-observation-head"},Pl("span",{className:"codex-edit-window-controls","aria-hidden":"true"},Pl("i",null),Pl("i",null),Pl("i",null)),Pl("strong",null,f?"git diff":"git diff --stat"),Pl("code",null,l.summary||"File changes")),l.stages.length>0?Pl("div",{className:"codex-edit-stage-strip"},l.stages.map((n,t)=>Pl("span",{key:`${n.method}-${t}`,className:`codex-edit-stage ${Dp(n.status||n.method)}`},Pl("b",null,Vp(n.method)),n.status?Pl("em",null,n.status):null))):null,r.length>0?Pl("div",{className:"codex-edit-diff",role:"list"},r.map(Sp)):null,u?Pl("div",{className:"codex-edit-omitted"},`${u} (查看原始JSON获取完整记录)`):null)}function vU(l,u,r){let f=T2(r);return Pl("div",{className:`codex-transcript-stream ${l}`,"data-testid":`codex-trace-${l}`},Pl("span",{className:"codex-transcript-stream-label"},l),Pl("pre",{className:"codex-transcript-body"},u,f?` -${f} (查看原始JSON获取完整记录)`:""))}function iQ(l,u=!1){let r=String(l.kind||"message"),f=["ran","explored","edited"].includes(r),n=T2(l.commandOmittedLines),t=T2(l.bodyOmittedLines),i=String(l.commandPreview||(f?l.title||"":"")),y=String(l.stdoutPreview||""),c=String(l.stderrPreview||""),_=y.length>0||c.length>0,A=Boolean(l.foldedReferencePrompt)&&String(l.fullPrompt||"").length>0,F=r==="edited"&&(l.editObservation!==void 0||dU(l))?l.editObservation||eU([l]):null;return Pl("article",{key:`${l.seq}-${r}`,className:`codex-transcript-item ${r} ${u?"nested":""}`},Pl("div",{className:"codex-transcript-main"},Pl("div",{className:"codex-transcript-title"},Pl("span",{className:"codex-output-channel"},W2(r)),f&&F===null?null:Pl("strong",null,F!==null?"File changes":String(l.title||W2(r))),l.status?Pl("code",null,String(F?.status||l.status)):null,Pl("time",null,Ll(l.at))),i&&F===null?Pl("pre",{className:"codex-transcript-command"},i,n?` -${n}`:""):null,F!==null?Yp(F,t):_?Pl("div",{className:"codex-transcript-streams"},y.length>0?vU("stdout",y,l.stdoutOmittedLines):null,c.length>0?vU("stderr",c,l.stderrOmittedLines):null):l.bodyPreview?Pl("pre",{className:"codex-transcript-body"},String(l.bodyPreview),t?` -${t} (查看原始JSON获取完整记录)`:""):null,A?Pl("details",{className:"codex-initial-prompt-full","data-testid":"codex-initial-prompt-full"},Pl("summary",null,Pl("span",null,"引用注入已折叠,点击查看最终传入 Codex 的完整 prompt"),Pl("code",null,`${l.fullPromptLines||mp(String(l.fullPrompt||""))} lines / ${l.fullPromptChars||String(l.fullPrompt||"").length} chars`)),Pl("pre",{className:"codex-transcript-body codex-transcript-full-prompt","data-testid":"codex-initial-prompt-full-text"},String(l.fullPrompt||""))):null))}function Xp(l){let u=Array.isArray(l.items)?l.items:[],r=l.digest&&typeof l.digest==="object"?l.digest:lQ(u);return Pl("article",{key:`${l.seq}-toolGroup`,className:"codex-transcript-item toolGroup"},Pl("div",{className:"codex-transcript-main"},Pl("details",{className:"codex-tool-group","data-testid":"codex-tool-group"},Pl("summary",null,Pl("div",{className:"codex-tool-group-head"},Pl("span",{className:"codex-output-channel"},W2("toolGroup")),Pl("strong",null,String(l.title||IU(u))),Pl("code",null,String(l.status||`${u.length} calls`)),Pl("time",null,Ll(l.at)))),Pl("div",{className:"codex-tool-group-digest"},Pl("span",null,`read: ${L2(Array.isArray(r.readFiles)?r.readFiles:[])}`),Pl("span",null,`edit: ${L2(Array.isArray(r.editedFiles)?r.editedFiles:[])}`),Pl("span",null,`run: ${L2(Array.isArray(r.runCommands)?r.runCommands:[],2)}`),Pl("span",null,`duration: ${r.durationLabel||"--"}`)),Pl("div",{className:"codex-tool-group-items"},u.map((f)=>iQ(f,!0))))))}function Pp(l){let u=[l.title,l.status,l.bodyPreview,l.commandPreview,l.stderrPreview,l.stdoutPreview].map((r)=>String(r||"")).join(` -`);return/\b(error|failed|failure|interrupt|interrupted|cancell?ed|watchdog|timeout|closed|refused|aborted|exception)\b/iu.test(u)}function yQ(l,u){if(u)return l;return l.flatMap((r)=>{if(String(r.kind||"")==="system"&&!Pp(r))return[];if(String(r.kind||"")!=="toolGroup"||!Array.isArray(r.items))return[r];let f=yQ(r.items,u);return[{...r,items:f}]})}var Cp=16;function gU(l){return l.scrollHeight-l.scrollTop-l.clientHeight<=Cp}function w3({items:l,input:u,port:r,autoScroll:f=!1,loading:n=!1,hasDetail:t=!0,emptyText:i="等待 Trace 输出...",loadingText:y="正在加载完整 Trace...",testId:c="trace-output",className:_="codex-transcript",keepRecentToolCalls:A=3,collapseTools:F=!0,showSystemEvents:j=!1}){let N=CU(null),U=CU(!0),w=yQ(zp(r?Up(r,u):uQ(l)),Boolean(j)),G=F?Op(w,A):w,J=wp(w);Jp(()=>{let q=N.current;if(!f||!q)return;if(!U.current&&!gU(q))return;q.scrollTop=q.scrollHeight,U.current=!0},[f,w.length,J]);let m={className:_,ref:N,onScroll:(q)=>{let W=q.currentTarget;U.current=gU(W)},"data-testid":c};if(n&&!t)return Pl("div",m,Pl("div",{className:"codex-output-empty"},y));return Pl("div",m,G.length===0?Pl("div",{className:"codex-output-empty"},i):G.map((q)=>String(q.kind||"")==="toolGroup"?Xp(q):iQ(q)))}var cQ=Ml(Ju(),1),Pi=cQ.default.createElement;function q3(...l){return l.filter(Boolean).join(" ")}function $Q({title:l,children:u,actions:r,onClose:f,className:n,backdropClassName:t,bodyClassName:i,actionsClassName:y,titleId:c,testId:_,closeTestId:A,closeLabel:F="关闭",disableClose:j=!1,closeOnBackdrop:N=!0}){let U={className:q3("raw-dialog","unidesk-dialog",n),role:"dialog","aria-modal":"true"};if(c)U["aria-labelledby"]=c;else if(typeof l==="string")U["aria-label"]=l;if(_)U["data-testid"]=_;return Pi("div",{className:q3("modal-backdrop","unidesk-dialog-backdrop",t),role:"presentation",onClick:(w)=>{if(N&&!j&&w.target===w.currentTarget)f()}},Pi("section",U,Pi("div",{className:"raw-dialog-head unidesk-dialog-head"},Pi("strong",c?{id:c}:null,l),Pi("button",{type:"button",className:"ghost-btn",onClick:f,disabled:j,"data-testid":A},F)),Pi("div",{className:q3("unidesk-dialog-body",i)},u),r?Pi("div",{className:q3("unidesk-dialog-actions",y)},r):null))}var L=w1.default.createElement,{useEffect:df,useMemo:_Q,useRef:xu}=w1.default,kl=w1.default.useState,hp=120,zQ=12,OQ=48,Mp=1200;function Z2(){return typeof document>"u"||document.visibilityState!=="hidden"}function Hu(l,u="操作失败"){return zl(l,u)}function ln(l){let u=Number(l);if(!Number.isFinite(u)||u<0)return"--";let r=Math.floor(u/1000),f=Math.floor(r/3600),n=Math.floor(r%3600/60),t=r%60;if(f>0)return`${f}h ${String(n).padStart(2,"0")}m`;if(n>0)return`${n}m ${String(t).padStart(2,"0")}s`;return`${t}s`}function en(l){if(l===null||l===void 0||l==="")return null;let u=l instanceof Date?l.getTime():new Date(l).getTime();return Number.isFinite(u)?u:null}function J1(l,u=Date.now()){let r=en(l);if(r===null)return"--";let f=Math.max(0,Math.floor((u-r)/1000));if(f<1)return"刚刚";let n=Math.floor(f/86400),t=Math.floor(f%86400/3600),i=Math.floor(f%3600/60),y=f%60;if(n>0)return`${n}天${t>0?`${t}小时`:""}前`;if(t>0)return`${t}小时${i>0?`${i}分钟`:""}前`;if(i>0)return`${i}分钟${y}秒前`;return`${y}秒前`}function x2(...l){let u="",r=-1/0;for(let f of l){let n=String(f||"");if(n.length===0)continue;let t=en(f);if(t!==null&&t>=r)u=n,r=t;else if(u.length===0)u=n}return u}function sp(l){let u=Number(l);if(!Number.isFinite(u)||u<0)return"--";if(u<1000)return`${Math.round(u)}ms`;return`${(u/1000).toFixed(u<1e4?2:1)}s`}function Q1(l,u=180){let r=String(l||"").replace(/\s+/gu," ").trim();return r.length>u?`${r.slice(0,u-1)}…`:r}async function Bu(l,u={}){return Tl(l,{strictJson:!0,retryInvalidJson:1,invalidJsonPrefix:"Code Queue 返回了无效 JSON",invalidJsonPreview:!0,responsePreviewLength:Mp,...u})}function Ri({status:l,children:u,title:r}){let f=String(l||"unknown").toLowerCase();return L("span",{className:`status-badge ${f}`,title:r},u||l||"unknown")}function hi({title:l,eyebrow:u,summary:r,actions:f,children:n,className:t,loading:i}){return L("section",{className:`panel ${t||""}`},L("div",{className:"panel-head"},L("div",null,u?L("p",{className:"panel-eyebrow"},u):null,L(nu,{title:l,loading:i}),r?L("div",{className:"panel-summary"},r):null),f?L("div",{className:"panel-actions"},f):null),L("div",{className:"panel-body"},n))}function b2({title:l,data:u,onOpen:r,testId:f}){return L("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function Ny({title:l,text:u}){return L("div",{className:"empty-state"},L("strong",null,l),L("span",null,u))}function Rp(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function xp(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function Du(l,u){return`${l}/microservices/code-queue/proxy${u}`}function bp(l){return`${l}/microservices/oa-event-flow/proxy/api/events/stream?tags=${encodeURIComponent("service:code-queue")}`}function Z3(){return{headers:{"cache-control":"no-cache","x-unidesk-no-cache":"1"}}}function Cu(l){return Array.isArray(l?.tasks)?l.tasks:[]}function Ln(l){return l?.pagination&&typeof l.pagination==="object"&&!Array.isArray(l.pagination)?l.pagination:{}}function AQ(l){let u=Date.parse(String(l?.updatedAt||l?.createdAt||""));return Number.isFinite(u)?u:0}function FQ(l){return en(l?.queueEnteredAt)??en(l?.createdAt)??en(l?.updatedAt)??0}function vp(l,u){let r=FQ(l)-FQ(u);if(r!==0)return r;let f=(en(l?.createdAt)??0)-(en(u?.createdAt)??0);if(f!==0)return f;return String(l?.id||"").localeCompare(String(u?.id||""))}function gp(l,u=""){let r=new Map;for(let f of l)for(let n of f){let t=String(n?.id||"");if(t.length>0&&!r.has(t))r.set(t,n)}return Array.from(r.values()).sort((f,n)=>{let t=WQ(f)-WQ(n);if(t!==0)return t;let i=String(f?.id||"")===u?0:1,y=String(n?.id||"")===u?0:1;if(i!==y)return i-y;return AQ(n)-AQ(f)})}function Gn(l,u=""){let r=new Map;for(let f of l)for(let n of f){let t=String(n?.id||"");if(t.length===0)continue;r.set(t,{...r.get(t)||{},...n})}return gp([Array.from(r.values())],u)}function $y(l){return Array.isArray(l?.activeTaskIds)?l.activeTaskIds.map((u)=>String(u||"")).filter(Boolean):[String(l?.activeTaskId||"")].filter(Boolean)}function ar(l){return Array.isArray(l)?l.map((u)=>String(u||"")).filter(Boolean):[]}function cy(l,u=3){let r=ar(l);if(r.length===0)return"--";let f=r.slice(0,u).join(" / ");return r.length>u?`${f} +${r.length-u}`:f}function kp(l,u){return ol(l?.executionDiagnostics)||ol(u?.body?.queue?.executionDiagnostics)||ol(u?.queue?.executionDiagnostics)||ol(u?.body?.executionDiagnostics)||ol(u?.executionDiagnostics)||{}}function v2(l){return Array.from(new Set([...ar(l?.heartbeatRiskTaskIds),...ar(l?.heartbeatExpiredTaskIds),...ar(l?.heartbeatMissingTaskIds),...ar(l?.staleRecoveryCandidateTaskIds)])).sort()}function ZQ(l){if(typeof l?.splitBrainLive==="boolean")return l.splitBrainLive;return String(l?.state||l?.health||"").toLowerCase()==="split-brain"&&ar(l?.heartbeatFreshTaskIds).length>0&&v2(l).length===0}function HQ(l){let u=String(l?.effectiveLiveness||"").toLowerCase();if(u)return u;if(v2(l).length>0)return"at-risk";if(ZQ(l))return"live";let r=String(l?.state||l?.health||"unknown").toLowerCase();return r==="healthy"?"healthy":r==="unknown"?"unknown":"degraded"}function Ip(l){let u=HQ(l);if(u==="live"||u==="degraded")return"warn";if(u==="at-risk")return"failed";let r=String(l?.state||l?.health||"unknown").toLowerCase();if(r==="healthy")return"ok";if(r==="stale-active")return"failed";if(r==="degraded")return"warn";return"unknown"}var dn="__all__",ap="(max-width: 760px)",op="(min-width: 761px)";function Cr(l){return!l||l===dn}function dp(){return typeof window<"u"&&window.matchMedia(ap).matches}function BQ(l){return Cr(l)?"":`&queueId=${encodeURIComponent(l)}`}function C2(l){return String(l||"").trim().replace(/\s+/gu," ").slice(0,200)}function ep(l){let u=C2(l);return u.length===0?"":`&search=${encodeURIComponent(u)}`}function g2(l,u=""){return`${BQ(l)}${ep(u)}`}function L3(l,u){return Number(l?.counts?.[u]||0)}function jQ(l,u=""){let r=new Map;for(let n of Array.isArray(l?.queues)?l.queues:[]){let t=String(n?.id||"").trim();if(t.length>0)r.set(t,{...n,name:String(n?.name||t).trim()||t})}for(let n of[String(l?.defaultQueueId||"default"),u].map((t)=>t.trim()).filter(Boolean))if(!r.has(n))r.set(n,{id:n,name:n,total:0,counts:{},activeTaskId:null,runnableTaskId:null,processing:!1});return Array.from(r.values()).sort((n,t)=>{let i=String(n?.id||"")===String(l?.defaultQueueId||"default")?0:1,y=String(t?.id||"")===String(l?.defaultQueueId||"default")?0:1;if(i!==y)return i-y;return String(n?.id||"").localeCompare(String(t?.id||""))})}function DQ(l){let u=String(l?.id||"default"),r=String(l?.name||"").trim();return r.length>0?r:u}function h2(l){let u=String(l?.id||"default"),r=DQ(l);return r===u?u:`${r} (${u})`}function j1(l){let u=L3(l,"running")+L3(l,"judging"),r=L3(l,"queued")+L3(l,"retry_wait"),f=Number(l?.total||0),n=[h2(l),`${f} tasks`];if(u>0)n.push(`${u} running`);if(r>0)n.push(`${r} queued`);return n.join(" · ")}function Ay(l,u){if(Cr(u))return null;return l.find((r)=>String(r?.id||"")===u)||null}function NQ(l,u,r,f){if(Cr(r)){let t=$y(l);return String(l?.activeTaskId||t[0]||f.find((i)=>vt(i))?.id||"")}let n=Ay(u,r);return String(n?.activeTaskId||f.find((t)=>vt(t))?.id||"")}function lz(l,u,r){if(!Cr(u)){let f=Ay(l,u);return String(f?.runnableTaskId||r.find((n)=>String(n?.status||"")==="queued"||String(n?.status||"")==="retry_wait")?.id||"")}return String(r.find((f)=>String(f?.status||"")==="queued"||String(f?.status||"")==="retry_wait")?.id||"")}async function JQ(l,u=dn,r=""){return Bu(Du(l,`/api/tasks/overview?limit=${zQ}&transcriptLimit=1&compact=1&selected=0&includeActive=0&stats=0&skipTrace=1${g2(u,r)}`),Z3())}async function H2(l,u,r=0,f=dn,n="",t=!1,i={}){let y=i.selected===!1?"&selected=0":"",c=i.includeActive===!1?"&includeActive=0":"",_=i.stats===!1?"&stats=0":"",A=Number.isInteger(i.limit)&&i.limit>0?Math.min(500,i.limit):zQ;return Bu(Du(l,`/api/tasks/overview?limit=${encodeURIComponent(String(A))}&transcriptLimit=3&compact=1&afterSeq=${encodeURIComponent(String(Math.max(0,r)))}&preferId=${encodeURIComponent(u)}${y}${c}${_}${t?"&skipTrace=1":""}${g2(f,n)}`),Z3())}async function uz(l,u=dn){return Bu(Du(l,`/api/tasks/stats?days=14${BQ(u)}`),Z3())}async function UQ(l,u,r,f=OQ,n=""){return Bu(Du(l,`/api/tasks/overview?limit=${encodeURIComponent(String(f))}&transcriptLimit=1&compact=1&selected=0&includeActive=0&stats=0&beforeId=${encodeURIComponent(r)}${g2(u,n)}`),Z3())}async function rz(l,u){return Bu(Du(l,`/api/tasks/${encodeURIComponent(u)}/trace-summary`))}async function fz(l,u,r,f=null){let n=f===null||f===void 0||String(f).length===0?"":`&attempt=${encodeURIComponent(String(f))}`;return Bu(Du(l,`/api/tasks/${encodeURIComponent(u)}/prompt?part=${encodeURIComponent(r)}${n}`))}async function nz(l,u,r=0,f=500,n=null){let t=n===null||n===void 0||String(n).length===0?"":`&attempt=${encodeURIComponent(String(n))}`;return Bu(Du(l,`/api/tasks/${encodeURIComponent(u)}/trace-steps?afterSeq=${encodeURIComponent(String(r))}&limit=${encodeURIComponent(String(f))}${t}`))}async function tz(l,u,r){return Bu(Du(l,`/api/tasks/${encodeURIComponent(u)}/trace-step?seq=${encodeURIComponent(String(r))}`))}async function iz(l,u){return Bu(Du(l,`/api/tasks/${encodeURIComponent(u)}/read`),{method:"POST",body:{}})}async function yz(l){return Bu(Du(l,"/api/tasks/read-all"),{method:"POST",body:{}})}function cz(l){return Array.isArray(l?.output)?l.output:[]}function $z(l){return Array.isArray(l?.attempts)?l.attempts:[]}function B2(l){return l?.counts&&typeof l.counts==="object"&&!Array.isArray(l.counts)?l.counts:{}}function _z(l){return l.split(/^\s*---+\s*$/gmu).map((u)=>u.trim()).filter(Boolean)}function QQ(l){let u=Number(l);return Number.isFinite(u)?Math.max(1,Math.min(50,Math.floor(u))):1}function Ci(l){let u=[];for(let r of l.split(/[\s,,;;]+/u)){let f=r.trim();if(/^codex_\d+_[A-Za-z0-9_-]+$/u.test(f)&&!u.includes(f))u.push(f)}return u}function Az(l,u){let r=Ci(u);if(r.length===0)return l;return[`引用 Code Queue 任务 ${r.join(" ")}。后端会在入队时只注入这些任务的 initial prompt 和 final response 全文;中间执行过程不注入,如需补充核查可运行:${r.map((f)=>`bun scripts/cli.ts codex task ${f}`).join(";")}`,"","本次任务:",l].join(` +`):[]}function E2(l){let u=String(l.status||"").trim();if(u.length>0)return u;let r=String(l.bodyPreview||"");return/^(item\/[A-Za-z]+(?:\/[A-Za-z]+)?):/u.exec(r)?.[1]||"item/fileChange"}function qp(l){let u=String(l.bodyPreview||"");return/file changes status=([A-Za-z0-9_-]+)/u.exec(u)?.[1]}function Lp(l){return/^item\/(?:started|completed): file changes status=/u.test(String(l||"").trim())}function eU(l){if(String(l.kind||"")!=="edited")return!1;let u=String(l.status||""),r=String(l.title||""),f=String(l.bodyPreview||""),n=String(l.commandPreview||"");if(r==="Edited files")return!0;if(/^item\/fileChange\//u.test(u))return!0;if((u==="item/started"||u==="item/completed")&&/file changes status=/u.test(f))return!0;if(/^Success\. Updated the following files:/mu.test(f))return!0;if(/^diff --git /mu.test(f))return!0;return/^([AMDRCU?]{1,2})\s+\S+/mu.test(f)||n.length>0&&m3(f).length>0}function iy(l){return oU(String(l||"").replace(/^[ab]\//u,"").trim())}function z2(l){let u=/^([AMDRCU?]{1,2})\s+(.+)$/u.exec(l);if(!u)return null;let r=iy(u[2]||"");return r.length>0?{status:u[1]||"M",path:r}:null}function O2(l){let u=/^\*\*\*\s+(Add|Update|Delete)\s+File:\s+(.+)$/u.exec(l);if(u){let f=u[1]==="Add"?"A":u[1]==="Delete"?"D":"M",n=iy(u[2]||"");return n.length>0?{status:f,path:n}:null}let r=/^\*\*\*\s+Move to:\s+(.+)$/u.exec(l);if(r){let f=iy(r[1]||"");return f.length>0?{status:"R",path:f}:null}return null}function m3(l){let u=[],r=(n,t)=>{let i=iy(t);if(i.length===0||i==="/dev/null")return;let y=u.find((c)=>c.path===i);if(y){if(y.status==="M"&&n!=="M")y.status=n;return}u.push({status:n,path:i})},f="";for(let n of dU(l)){let t=z2(n)||O2(n);if(t!==null){r(t.status,t.path),f=t.path;continue}let i=/^diff --git a\/(.+?) b\/(.+)$/u.exec(n);if(i){let F=i[2]||i[1]||"";r("M",F),f=iy(F);continue}let y=/^\+\+\+ b\/(.+)$/u.exec(n);if(y&&y[1]!=="/dev/null"){r("M",y[1]||""),f=iy(y[1]||"");continue}if(/^new file mode /u.exec(n)&&f)r("A",f);if(/^deleted file mode /u.exec(n)&&f)r("D",f);let A=/^rename to (.+)$/u.exec(n);if(A)r("R",A[1]||"")}return u}function Gp(l){if(z2(l)!==null||O2(l)!==null)return"file";if(/^(diff --git |index |--- |\+\+\+ |\*\*\* Begin Patch|\*\*\* End Patch)/u.test(l))return"meta";if(/^@@ /u.test(l))return"hunk";if(/^\+/u.test(l))return"add";if(/^-/u.test(l))return"del";if(/^(Success\.|No changes|Updated\b|Created\b|Deleted\b|Added\s+\d+\s+lines?|Wrote\s+\d+\s+lines?|Read\s+\d+\s+files?|\.\.\.\[patch content truncated)/iu.test(l))return"note";return"context"}function Z2(l){return dU(l).map((u)=>{let r=z2(u)||O2(u);if(r!==null)return{text:u,kind:"file",path:r.path,status:r.status};return{text:u,kind:Gp(u)}})}function Wp(l){return l.reduce((u,r)=>{if(r.kind==="add")u.added+=1;else if(r.kind==="del")u.removed+=1;return u},{added:0,removed:0})}function xU(l,u){return`${u} ${l} line${l===1?"":"s"}`}function Tp(l,u){let r=[];if(l>0)r.push(xU(l,"Added"));if(u>0)r.push(xU(u,"removed"));return r.join(", ")}function Kp(l){for(let r=l.length-1;r>=0;r-=1){let f=String(l[r]?.status||"").trim();if(f.length>0)return f}let u=String(l[l.length-1]?.method||"").trim();if(u==="item/fileChange/outputDelta")return"updated";if(u==="item/started")return"started";if(u==="item/completed")return"completed";return u.replace(/^item\//u,"")||"changed"}function Ep(l){return`${l} file${l===1?"":"s"}`}function lQ(l){let u=l.length>0?l:[],r=RU(u.map((j)=>String(j.bodyPreview||""))),n=RU(u.map((j)=>String(j.bodyPreview||"")).filter((j)=>j.trim().length>0&&!Lp(j)))||r,t=m3(n||r),i=u.map((j)=>({method:E2(j),status:qp(j),at:j.at})),y=Z2(n||r),c=Wp(y),_=Tp(c.added,c.removed),A=t.length>0?Ep(t.length):"",F=_.length>0?`${_}${A?` in ${A}`:""}`:t.length>0?A:yy(n||r||"File changes",72);return{status:Kp(i),summary:F,files:t,stages:i,lines:y,addedLines:c.added,removedLines:c.removed,rawText:r}}function pp(l){let u=l[0],r=l[l.length-1]||u,f=lQ(l);return{...u,seq:Number.isFinite(Number(r?.seq))?Number(r?.seq):Number(u?.seq??0),at:r?.at||u?.at,title:f.files.length>0?`Edited ${f.summary}`:"Edited files",status:f.status,commandPreview:"",commandOmittedLines:void 0,bodyPreview:f.rawText,bodyOmittedLines:l.reduce((n,t)=>n+Number(t.bodyOmittedLines||0),0)||void 0,rawSeqs:l.flatMap((n)=>Array.isArray(n?.rawSeqs)?n.rawSeqs:[n?.seq]).filter((n)=>n!==void 0),editObservation:f}}function zp(l){let u=Array.isArray(l)?l:[],r=[],f=[],n=()=>{if(f.length===0)return;r.push(pp(f)),f=[]};for(let t of u){if(eU(t)){if(E2(t)==="item/started"&&f.length>0)n();if(f.push(t),E2(t)==="item/completed")n();continue}n(),r.push(t)}return n(),r}function uQ(l){let u=[],r=[],f=[],n=(_,A)=>{for(let F of A)if(!_.includes(F))_.push(F)};for(let _ of l){let A=String(_?.kind||""),F=[_?.commandPreview,_?.bodyPreview,_?.title].map((j)=>String(j||"")).join(` +`);if(A==="explored")n(u,sU(F));else if(A==="edited")n(r,sU(F));else if(A==="ran"){let j=String(_?.commandPreview||_?.title||"").trim();if(j.length>0&&!f.includes(j))f.push(yy(j,90))}}let t=l.map((_)=>Date.parse(String(_?.at||""))).filter((_)=>Number.isFinite(_)),i=t.length>=2?Math.max(0,Math.max(...t)-Math.min(...t)):0,y=l.reduce((_,A)=>_+(of(A?.durationMs)??of(A?.elapsedMs)??0),0),c=i>0?i:y;return{readFiles:u,editedFiles:r,runCommands:f,durationLabel:Qp(c)}}function Op(l,u=3){let r=Array.isArray(l)?l:[],f=[],n=[],t=Math.max(0,u),i=new Set;for(let c=r.length-1;c>=0&&t>0;c-=1){let _=r[c];if(!MU(_))continue;i.add(_),t-=1}let y=()=>{if(n.length>=2){let c=IU(n);f.push({seq:Number(n[0]?.seq??0),at:n[0]?.at||n.at(-1)?.at,kind:"toolGroup",title:aU(n),status:`${n.length} calls`,items:n,counts:c,digest:uQ(n),rawSeqs:n.flatMap((_)=>Array.isArray(_?.rawSeqs)?_.rawSeqs:[_?.seq]).filter((_)=>_!==void 0)})}else f.push(...n);n=[]};for(let c of r){if(MU(c)&&!i.has(c)){n.push(c);continue}y(),f.push(c)}return y(),f}function rQ(l){return(Array.isArray(l)?l:[]).map((u,r)=>({...u,seq:Number.isFinite(Number(u?.seq))?Number(u.seq):r+1,kind:String(u?.kind||"message"),at:u?.at===void 0?void 0:String(u.at),durationMs:of(u?.durationMs)??void 0,title:u?.title===void 0?void 0:String(u.title),status:u?.status===void 0?void 0:String(u.status)}))}function $1(l){let u=of(l?.state?.time?.start)??of(l?.time?.start),r=of(l?.state?.time?.end)??of(l?.time?.end);return of(l?.durationMs)??of(l?.elapsedMs)??of(l?.timing?.durationMs)??of(l?.metadata?.durationMs)??(u!==null&&r!==null&&r>=u?r-u:null)??void 0}function _1(l,u){return l?.createdAt||l?.updatedAt||l?.completedAt||u||void 0}function W2(l,u){return l?.id||l?.messageId||u}function Zp(l,u=1200){if(typeof l==="string")return l;if(l===void 0||l===null)return"";try{return yy(JSON.stringify(l),u)}catch{return yy(String(l),u)}}function fQ(l,u,r){if(typeof l?.metadata?.diff==="string"&&l.metadata.diff.length>0)return l.metadata.diff;if(typeof l?.metadata?.filediff?.patch==="string"&&l.metadata.filediff.patch.length>0)return l.metadata.filediff.patch;if(typeof l?.output==="string"&&l.output.length>0)return l.output;if(typeof l?.result==="string"&&l.result.length>0)return l.result;if(typeof u?.output==="string"&&u.output.length>0)return u.output;if(typeof r?.output==="string"&&r.output.length>0)return r.output;if(typeof l?.metadata?.output==="string"&&l.metadata.output.length>0)return l.metadata.output;return""}function Q3(l,u){if(!l||typeof l!=="object"||Array.isArray(l))return"";for(let r of u){let f=l[r];if(typeof f==="string"&&f.length>0)return f;if(f!==void 0&&f!==null&&typeof f!=="object")return String(f)}return""}function bU(l,u){if(!l||typeof l!=="object"||Array.isArray(l))return null;for(let r of u){let f=Number(l[r]);if(Number.isFinite(f))return f}return null}function nQ(l,u){let r=u?.input&&typeof u.input==="object"&&!Array.isArray(u.input)?u.input:l?.input&&typeof l.input==="object"&&!Array.isArray(l.input)?l.input:{},f=Q3(r,["command","cmd","script"]);if(f.length>0)return f;if(typeof l?.command==="string"&&l.command.length>0)return l.command;if(typeof u?.command==="string"&&u.command.length>0)return u.command;let n=String(l?.tool||l?.title||"tool"),t=Q3(r,["filePath","filepath","path"])||Q3(l,["filePath","filepath","path"]),i=Q3(r,["pattern","query"]),y=bU(r,["offset"]),c=bU(r,["limit"]),_=[n];if(i.length>0)_.push(i);if(t.length>0)_.push(t);if(y!==null)_.push(`offset=${y}`);if(c!==null)_.push(`limit=${c}`);return _.length>1?_.join(" "):n}function Hp(l,u){let r=l?.part&&typeof l.part==="object"&&!Array.isArray(l.part)?l.part:{},f=String(l?.type||l?.event||l?.name||r?.type||"").toLowerCase(),n=String(r?.type||"").toLowerCase(),t=l?.at||l?.timestamp||r?.updatedAt||r?.createdAt,i=Number.isFinite(Number(l?.seq))?Number(l.seq):u;if(f==="step_start"||f==="step-start"||n==="step-start")return null;if(f==="step_finish"||f==="step-finish"||n==="step-finish")return null;if(n==="tool"||/tool|bash|command/iu.test(`${f} ${n}`)){let c=r?.state&&typeof r.state==="object"&&!Array.isArray(r.state)?r.state:{},_=nQ(r,c),A=fQ(c,r,l),F=tQ(_,String(r?.tool||r?.title||"")),j=F==="edited"?{status:String(c?.status||r?.status||l?.status||""),summary:yy(A||_,72),files:m3(A),stages:[],lines:Z2(A),addedLines:0,removedLines:0,rawText:A}:void 0;return{seq:i,at:_1(r,t),kind:F,title:String(c?.title||r?.title||c?.metadata?.description||r?.tool||"OpenCode tool"),status:String(c?.status||r?.status||l?.status||""),commandPreview:_,bodyPreview:A,durationMs:$1(r),rawSeqs:[r?.id||r?.callID||l?.sessionID||i],editObservation:j}}let y=Zp(r?.text??r?.content??r?.delta??l?.text??l?.content??l?.delta,3000).trim();if(y.length>0)return{seq:i,at:_1(r,t),kind:n==="reasoning"?"message":/error|failed/iu.test(`${f} ${n}`)?"error":"message",title:n==="reasoning"?"Reasoning":/error|failed/iu.test(`${f} ${n}`)?"OpenCode error":"Assistant message",status:`opencode/${f||n||"event"}`,bodyPreview:y,durationMs:$1(r),rawSeqs:[r?.id||l?.sessionID||i]};return null}function tQ(l,u){let r=`${u} ${l}`.toLowerCase();if(/\b(read|grep|glob|list|ls|find|search|view|cat|sed|rg|head|tail|wc|file)\b/iu.test(r))return"explored";if(/\b(edit|write|patch|apply|update|create|delete|apply_patch|git apply|cat >|tee .*<<|sed -i|python3? .*write_text|mkdir|rm |touch )\b/iu.test(r))return"edited";return"ran"}function Bp(l){let u=[],r=1;for(let f of Array.isArray(l)?l:[]){if(f?.kind&&f?.title){let y=String(f?.status||"");if(y==="opencode/step-start"||y==="opencode/step-finish")continue;u.push({...f,seq:Number.isFinite(Number(f?.seq))?Number(f.seq):r++});continue}let n=f?.createdAt||f?.updatedAt||f?.completedAt,t=String(f?.role||"assistant").toLowerCase(),i=Array.isArray(f?.parts)?f.parts:[];if(i.length===0){if(f?.part&&(f?.sessionID||String(f?.type||"").startsWith("step_")||String(f?.type||"").includes("tool"))){let y=Hp(f,r);if(y!==null)u.push(y),r=Math.max(r+1,Number(y.seq)+1)}else if(f?.textPreview)u.push({seq:r++,at:n,kind:"message",title:`${t||"assistant"} message`,status:t,bodyPreview:String(f.textPreview),rawSeqs:[f?.messageId||r]});continue}for(let y of i){let c=String(y?.type||"").toLowerCase();if(c==="step-start"||c==="step-finish")continue;if(c==="text"||c==="reasoning"){let A=String(y?.textPreview||f?.textPreview||"").trim();if(A.length===0)continue;u.push({seq:r++,at:_1(y,n),kind:"message",title:c==="reasoning"?"Reasoning":t==="user"?"User message":t==="system"?"System message":"Assistant message",status:c==="reasoning"?"reasoning":t,bodyPreview:A,durationMs:$1(y),rawSeqs:[W2(y,r)]});continue}if(c==="tool"){let A=y?.state&&typeof y.state==="object"&&!Array.isArray(y.state)?y.state:{},F=nQ(y,A),j=fQ(A,y,{}),N=tQ(F,String(y?.tool||y?.title||"")),U=N==="edited"?{status:String(A?.status||y?.status||""),summary:yy(j||F,72),files:m3(j),stages:[],lines:Z2(j),addedLines:0,removedLines:0,rawText:j}:void 0;u.push({seq:r++,at:_1(y,n),kind:N,title:String(y?.title||y?.tool||"tool"),status:String(y?.status||""),commandPreview:F,bodyPreview:j,durationMs:$1(y),rawSeqs:[W2(y,r)],editObservation:U});continue}let _=String(y?.textPreview||y?.title||c||"").trim();if(_)u.push({seq:r++,at:_1(y,n),kind:"system",title:c||"part",bodyPreview:_,status:String(y?.status||""),durationMs:$1(y),rawSeqs:[W2(y,r)]})}}return u}var iQ={source:"opencode",toTrace:Bp};function Dp(l){return String(l||"unknown").toLowerCase().replace(/[^a-z0-9_-]+/gu,"-")||"unknown"}function vU(l){let u=String(l||"M").toUpperCase();if(u.startsWith("A")||u==="??")return"added";if(u.startsWith("D"))return"deleted";if(u.startsWith("R"))return"renamed";return"modified"}function Vp(l){if(l==="item/fileChange/outputDelta")return"delta";return l.replace(/^item\//u,"")}function Sp(l,u){if(l.kind==="file"){let n=String(l.status||"M");return Pl("div",{key:`${u}-${l.text}`,className:`codex-edit-diff-line file ${vU(n)}`},Pl("span",{className:`codex-edit-file-status ${vU(n)}`},n),Pl("code",null,l.path||l.text.replace(/^([AMDRCU?]{1,2})\s+/u,"")))}let r=l.kind==="add"||l.kind==="del"?l.text.slice(0,1):l.kind==="hunk"?"@@":l.kind==="note"?"ok":"",f=l.kind==="add"||l.kind==="del"?l.text.slice(1):l.text;return Pl("div",{key:`${u}-${l.text}`,className:`codex-edit-diff-line ${l.kind}`},Pl("span",{className:"codex-edit-diff-sign"},r),Pl("code",null,f||" "))}function Yp(l,u){let r=l.lines.length>0?l.lines:l.files.map((n)=>({text:`${n.status} ${n.path}`,kind:"file",path:n.path,status:n.status})),f=Number(l.addedLines||0)+Number(l.removedLines||0)>0;return Pl("div",{className:"codex-edit-observation","data-testid":"codex-edit-observation"},Pl("div",{className:"codex-edit-observation-head"},Pl("span",{className:"codex-edit-window-controls","aria-hidden":"true"},Pl("i",null),Pl("i",null),Pl("i",null)),Pl("strong",null,f?"git diff":"git diff --stat"),Pl("code",null,l.summary||"File changes")),l.stages.length>0?Pl("div",{className:"codex-edit-stage-strip"},l.stages.map((n,t)=>Pl("span",{key:`${n.method}-${t}`,className:`codex-edit-stage ${Dp(n.status||n.method)}`},Pl("b",null,Vp(n.method)),n.status?Pl("em",null,n.status):null))):null,r.length>0?Pl("div",{className:"codex-edit-diff",role:"list"},r.map(Sp)):null,u?Pl("div",{className:"codex-edit-omitted"},`${u} (查看原始JSON获取完整记录)`):null)}function gU(l,u,r){let f=K2(r);return Pl("div",{className:`codex-transcript-stream ${l}`,"data-testid":`codex-trace-${l}`},Pl("span",{className:"codex-transcript-stream-label"},l),Pl("pre",{className:"codex-transcript-body"},u,f?` +${f} (查看原始JSON获取完整记录)`:""))}function yQ(l,u=!1){let r=String(l.kind||"message"),f=["ran","explored","edited"].includes(r),n=K2(l.commandOmittedLines),t=K2(l.bodyOmittedLines),i=String(l.commandPreview||(f?l.title||"":"")),y=String(l.stdoutPreview||""),c=String(l.stderrPreview||""),_=y.length>0||c.length>0,A=Boolean(l.foldedReferencePrompt)&&String(l.fullPrompt||"").length>0,F=r==="edited"&&(l.editObservation!==void 0||eU(l))?l.editObservation||lQ([l]):null;return Pl("article",{key:`${l.seq}-${r}`,className:`codex-transcript-item ${r} ${u?"nested":""}`},Pl("div",{className:"codex-transcript-main"},Pl("div",{className:"codex-transcript-title"},Pl("span",{className:"codex-output-channel"},T2(r)),f&&F===null?null:Pl("strong",null,F!==null?"File changes":String(l.title||T2(r))),l.status?Pl("code",null,String(F?.status||l.status)):null,Pl("time",null,Ll(l.at))),i&&F===null?Pl("pre",{className:"codex-transcript-command"},i,n?` +${n}`:""):null,F!==null?Yp(F,t):_?Pl("div",{className:"codex-transcript-streams"},y.length>0?gU("stdout",y,l.stdoutOmittedLines):null,c.length>0?gU("stderr",c,l.stderrOmittedLines):null):l.bodyPreview?Pl("pre",{className:"codex-transcript-body"},String(l.bodyPreview),t?` +${t} (查看原始JSON获取完整记录)`:""):null,A?Pl("details",{className:"codex-initial-prompt-full","data-testid":"codex-initial-prompt-full"},Pl("summary",null,Pl("span",null,"引用注入已折叠,点击查看最终传入 Codex 的完整 prompt"),Pl("code",null,`${l.fullPromptLines||mp(String(l.fullPrompt||""))} lines / ${l.fullPromptChars||String(l.fullPrompt||"").length} chars`)),Pl("pre",{className:"codex-transcript-body codex-transcript-full-prompt","data-testid":"codex-initial-prompt-full-text"},String(l.fullPrompt||""))):null))}function Xp(l){let u=Array.isArray(l.items)?l.items:[],r=l.digest&&typeof l.digest==="object"?l.digest:uQ(u);return Pl("article",{key:`${l.seq}-toolGroup`,className:"codex-transcript-item toolGroup"},Pl("div",{className:"codex-transcript-main"},Pl("details",{className:"codex-tool-group","data-testid":"codex-tool-group"},Pl("summary",null,Pl("div",{className:"codex-tool-group-head"},Pl("span",{className:"codex-output-channel"},T2("toolGroup")),Pl("strong",null,String(l.title||aU(u))),Pl("code",null,String(l.status||`${u.length} calls`)),Pl("time",null,Ll(l.at)))),Pl("div",{className:"codex-tool-group-digest"},Pl("span",null,`read: ${G2(Array.isArray(r.readFiles)?r.readFiles:[])}`),Pl("span",null,`edit: ${G2(Array.isArray(r.editedFiles)?r.editedFiles:[])}`),Pl("span",null,`run: ${G2(Array.isArray(r.runCommands)?r.runCommands:[],2)}`),Pl("span",null,`duration: ${r.durationLabel||"--"}`)),Pl("div",{className:"codex-tool-group-items"},u.map((f)=>yQ(f,!0))))))}function Pp(l){let u=[l.title,l.status,l.bodyPreview,l.commandPreview,l.stderrPreview,l.stdoutPreview].map((r)=>String(r||"")).join(` +`);return/\b(error|failed|failure|interrupt|interrupted|cancell?ed|watchdog|timeout|closed|refused|aborted|exception)\b/iu.test(u)}function cQ(l,u){if(u)return l;return l.flatMap((r)=>{if(String(r.kind||"")==="system"&&!Pp(r))return[];if(String(r.kind||"")!=="toolGroup"||!Array.isArray(r.items))return[r];let f=cQ(r.items,u);return[{...r,items:f}]})}var Cp=16;function kU(l){return l.scrollHeight-l.scrollTop-l.clientHeight<=Cp}function w3({items:l,input:u,port:r,autoScroll:f=!1,loading:n=!1,hasDetail:t=!0,emptyText:i="等待 Trace 输出...",loadingText:y="正在加载完整 Trace...",testId:c="trace-output",className:_="codex-transcript",keepRecentToolCalls:A=3,collapseTools:F=!0,showSystemEvents:j=!1}){let N=hU(null),U=hU(!0),w=cQ(zp(r?Up(r,u):rQ(l)),Boolean(j)),G=F?Op(w,A):w,J=wp(w);Jp(()=>{let q=N.current;if(!f||!q)return;if(!U.current&&!kU(q))return;q.scrollTop=q.scrollHeight,U.current=!0},[f,w.length,J]);let m={className:_,ref:N,onScroll:(q)=>{let W=q.currentTarget;U.current=kU(W)},"data-testid":c};if(n&&!t)return Pl("div",m,Pl("div",{className:"codex-output-empty"},y));return Pl("div",m,G.length===0?Pl("div",{className:"codex-output-empty"},i):G.map((q)=>String(q.kind||"")==="toolGroup"?Xp(q):yQ(q)))}var $Q=Ml(Ju(),1),Pi=$Q.default.createElement;function q3(...l){return l.filter(Boolean).join(" ")}function _Q({title:l,children:u,actions:r,onClose:f,className:n,backdropClassName:t,bodyClassName:i,actionsClassName:y,titleId:c,testId:_,closeTestId:A,closeLabel:F="关闭",disableClose:j=!1,closeOnBackdrop:N=!0}){let U={className:q3("raw-dialog","unidesk-dialog",n),role:"dialog","aria-modal":"true"};if(c)U["aria-labelledby"]=c;else if(typeof l==="string")U["aria-label"]=l;if(_)U["data-testid"]=_;return Pi("div",{className:q3("modal-backdrop","unidesk-dialog-backdrop",t),role:"presentation",onClick:(w)=>{if(N&&!j&&w.target===w.currentTarget)f()}},Pi("section",U,Pi("div",{className:"raw-dialog-head unidesk-dialog-head"},Pi("strong",c?{id:c}:null,l),Pi("button",{type:"button",className:"ghost-btn",onClick:f,disabled:j,"data-testid":A},F)),Pi("div",{className:q3("unidesk-dialog-body",i)},u),r?Pi("div",{className:q3("unidesk-dialog-actions",y)},r):null))}var L=w1.default.createElement,{useEffect:df,useMemo:AQ,useRef:xu}=w1.default,kl=w1.default.useState,hp=120,OQ=12,ZQ=48,Mp=1200;function H2(){return typeof document>"u"||document.visibilityState!=="hidden"}function Hu(l,u="操作失败"){return zl(l,u)}function ln(l){let u=Number(l);if(!Number.isFinite(u)||u<0)return"--";let r=Math.floor(u/1000),f=Math.floor(r/3600),n=Math.floor(r%3600/60),t=r%60;if(f>0)return`${f}h ${String(n).padStart(2,"0")}m`;if(n>0)return`${n}m ${String(t).padStart(2,"0")}s`;return`${t}s`}function en(l){if(l===null||l===void 0||l==="")return null;let u=l instanceof Date?l.getTime():new Date(l).getTime();return Number.isFinite(u)?u:null}function J1(l,u=Date.now()){let r=en(l);if(r===null)return"--";let f=Math.max(0,Math.floor((u-r)/1000));if(f<1)return"刚刚";let n=Math.floor(f/86400),t=Math.floor(f%86400/3600),i=Math.floor(f%3600/60),y=f%60;if(n>0)return`${n}天${t>0?`${t}小时`:""}前`;if(t>0)return`${t}小时${i>0?`${i}分钟`:""}前`;if(i>0)return`${i}分钟${y}秒前`;return`${y}秒前`}function b2(...l){let u="",r=-1/0;for(let f of l){let n=String(f||"");if(n.length===0)continue;let t=en(f);if(t!==null&&t>=r)u=n,r=t;else if(u.length===0)u=n}return u}function sp(l){let u=Number(l);if(!Number.isFinite(u)||u<0)return"--";if(u<1000)return`${Math.round(u)}ms`;return`${(u/1000).toFixed(u<1e4?2:1)}s`}function Q1(l,u=180){let r=String(l||"").replace(/\s+/gu," ").trim();return r.length>u?`${r.slice(0,u-1)}…`:r}async function Bu(l,u={}){return Tl(l,{strictJson:!0,retryInvalidJson:1,invalidJsonPrefix:"Code Queue 返回了无效 JSON",invalidJsonPreview:!0,responsePreviewLength:Mp,...u})}function Ri({status:l,children:u,title:r}){let f=String(l||"unknown").toLowerCase();return L("span",{className:`status-badge ${f}`,title:r},u||l||"unknown")}function hi({title:l,eyebrow:u,summary:r,actions:f,children:n,className:t,loading:i}){return L("section",{className:`panel ${t||""}`},L("div",{className:"panel-head"},L("div",null,u?L("p",{className:"panel-eyebrow"},u):null,L(nu,{title:l,loading:i}),r?L("div",{className:"panel-summary"},r):null),f?L("div",{className:"panel-actions"},f):null),L("div",{className:"panel-body"},n))}function v2({title:l,data:u,onOpen:r,testId:f}){return L("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function Ny({title:l,text:u}){return L("div",{className:"empty-state"},L("strong",null,l),L("span",null,u))}function Rp(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function xp(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function Du(l,u){return`${l}/microservices/code-queue/proxy${u}`}function bp(l){return`${l}/microservices/oa-event-flow/proxy/api/events/stream?tags=${encodeURIComponent("service:code-queue")}`}function Z3(){return{headers:{"cache-control":"no-cache","x-unidesk-no-cache":"1"}}}function Cu(l){return Array.isArray(l?.tasks)?l.tasks:[]}function Ln(l){return l?.pagination&&typeof l.pagination==="object"&&!Array.isArray(l.pagination)?l.pagination:{}}function FQ(l){let u=Date.parse(String(l?.updatedAt||l?.createdAt||""));return Number.isFinite(u)?u:0}function jQ(l){return en(l?.queueEnteredAt)??en(l?.createdAt)??en(l?.updatedAt)??0}function vp(l,u){let r=jQ(l)-jQ(u);if(r!==0)return r;let f=(en(l?.createdAt)??0)-(en(u?.createdAt)??0);if(f!==0)return f;return String(l?.id||"").localeCompare(String(u?.id||""))}function gp(l,u=""){let r=new Map;for(let f of l)for(let n of f){let t=String(n?.id||"");if(t.length>0&&!r.has(t))r.set(t,n)}return Array.from(r.values()).sort((f,n)=>{let t=TQ(f)-TQ(n);if(t!==0)return t;let i=String(f?.id||"")===u?0:1,y=String(n?.id||"")===u?0:1;if(i!==y)return i-y;return FQ(n)-FQ(f)})}function Gn(l,u=""){let r=new Map;for(let f of l)for(let n of f){let t=String(n?.id||"");if(t.length===0)continue;r.set(t,{...r.get(t)||{},...n})}return gp([Array.from(r.values())],u)}function $y(l){return Array.isArray(l?.activeTaskIds)?l.activeTaskIds.map((u)=>String(u||"")).filter(Boolean):[String(l?.activeTaskId||"")].filter(Boolean)}function ar(l){return Array.isArray(l)?l.map((u)=>String(u||"")).filter(Boolean):[]}function cy(l,u=3){let r=ar(l);if(r.length===0)return"--";let f=r.slice(0,u).join(" / ");return r.length>u?`${f} +${r.length-u}`:f}function kp(l,u){return ol(l?.executionDiagnostics)||ol(u?.body?.queue?.executionDiagnostics)||ol(u?.queue?.executionDiagnostics)||ol(u?.body?.executionDiagnostics)||ol(u?.executionDiagnostics)||{}}function H3(l){return Array.from(new Set([...ar(l?.heartbeatRiskTaskIds),...ar(l?.heartbeatExpiredTaskIds),...ar(l?.heartbeatMissingTaskIds),...ar(l?.staleRecoveryCandidateTaskIds)])).sort()}function g2(l){if(H3(l).length>0)return!1;if(typeof l?.splitBrainLive==="boolean")return l.splitBrainLive;let u=String(l?.state||l?.health||"").toLowerCase(),r=String(l?.effectiveLiveness||"").toLowerCase();return u==="split-brain"&&(r==="live"||ar(l?.heartbeatFreshTaskIds).length>0)}function HQ(l){let u=String(l?.effectiveLiveness||"").toLowerCase();if(u)return u;if(H3(l).length>0)return"at-risk";if(g2(l))return"live";let r=String(l?.state||l?.health||"unknown").toLowerCase();return r==="healthy"?"healthy":r==="unknown"?"unknown":"degraded"}function Ip(l){let u=HQ(l),r=H3(l),f=String(l?.state||l?.health||"unknown").toLowerCase();if(r.length>0||u==="at-risk"||f==="stale-active")return"failed";if(g2(l))return"degraded-live";if(u==="live"||u==="degraded")return"warn";if(["dead","failed","stale","unhealthy"].includes(u))return"failed";let n=String(l?.state||l?.health||"unknown").toLowerCase();if(n==="healthy")return"ok";if(n==="split-brain")return"warn";if(n==="degraded")return"warn";return"unknown"}var dn="__all__",ap="(max-width: 760px)",op="(min-width: 761px)";function Cr(l){return!l||l===dn}function dp(){return typeof window<"u"&&window.matchMedia(ap).matches}function BQ(l){return Cr(l)?"":`&queueId=${encodeURIComponent(l)}`}function h2(l){return String(l||"").trim().replace(/\s+/gu," ").slice(0,200)}function ep(l){let u=h2(l);return u.length===0?"":`&search=${encodeURIComponent(u)}`}function k2(l,u=""){return`${BQ(l)}${ep(u)}`}function L3(l,u){return Number(l?.counts?.[u]||0)}function NQ(l,u=""){let r=new Map;for(let n of Array.isArray(l?.queues)?l.queues:[]){let t=String(n?.id||"").trim();if(t.length>0)r.set(t,{...n,name:String(n?.name||t).trim()||t})}for(let n of[String(l?.defaultQueueId||"default"),u].map((t)=>t.trim()).filter(Boolean))if(!r.has(n))r.set(n,{id:n,name:n,total:0,counts:{},activeTaskId:null,runnableTaskId:null,processing:!1});return Array.from(r.values()).sort((n,t)=>{let i=String(n?.id||"")===String(l?.defaultQueueId||"default")?0:1,y=String(t?.id||"")===String(l?.defaultQueueId||"default")?0:1;if(i!==y)return i-y;return String(n?.id||"").localeCompare(String(t?.id||""))})}function DQ(l){let u=String(l?.id||"default"),r=String(l?.name||"").trim();return r.length>0?r:u}function M2(l){let u=String(l?.id||"default"),r=DQ(l);return r===u?u:`${r} (${u})`}function j1(l){let u=L3(l,"running")+L3(l,"judging"),r=L3(l,"queued")+L3(l,"retry_wait"),f=Number(l?.total||0),n=[M2(l),`${f} tasks`];if(u>0)n.push(`${u} running`);if(r>0)n.push(`${r} queued`);return n.join(" · ")}function Ay(l,u){if(Cr(u))return null;return l.find((r)=>String(r?.id||"")===u)||null}function JQ(l,u,r,f){if(Cr(r)){let t=$y(l);return String(l?.activeTaskId||t[0]||f.find((i)=>vt(i))?.id||"")}let n=Ay(u,r);return String(n?.activeTaskId||f.find((t)=>vt(t))?.id||"")}function lz(l,u,r){if(!Cr(u)){let f=Ay(l,u);return String(f?.runnableTaskId||r.find((n)=>String(n?.status||"")==="queued"||String(n?.status||"")==="retry_wait")?.id||"")}return String(r.find((f)=>String(f?.status||"")==="queued"||String(f?.status||"")==="retry_wait")?.id||"")}async function UQ(l,u=dn,r=""){return Bu(Du(l,`/api/tasks/overview?limit=${OQ}&transcriptLimit=1&compact=1&selected=0&includeActive=0&stats=0&skipTrace=1${k2(u,r)}`),Z3())}async function B2(l,u,r=0,f=dn,n="",t=!1,i={}){let y=i.selected===!1?"&selected=0":"",c=i.includeActive===!1?"&includeActive=0":"",_=i.stats===!1?"&stats=0":"",A=Number.isInteger(i.limit)&&i.limit>0?Math.min(500,i.limit):OQ;return Bu(Du(l,`/api/tasks/overview?limit=${encodeURIComponent(String(A))}&transcriptLimit=3&compact=1&afterSeq=${encodeURIComponent(String(Math.max(0,r)))}&preferId=${encodeURIComponent(u)}${y}${c}${_}${t?"&skipTrace=1":""}${k2(f,n)}`),Z3())}async function uz(l,u=dn){return Bu(Du(l,`/api/tasks/stats?days=14${BQ(u)}`),Z3())}async function QQ(l,u,r,f=ZQ,n=""){return Bu(Du(l,`/api/tasks/overview?limit=${encodeURIComponent(String(f))}&transcriptLimit=1&compact=1&selected=0&includeActive=0&stats=0&beforeId=${encodeURIComponent(r)}${k2(u,n)}`),Z3())}async function rz(l,u){return Bu(Du(l,`/api/tasks/${encodeURIComponent(u)}/trace-summary`))}async function fz(l,u,r,f=null){let n=f===null||f===void 0||String(f).length===0?"":`&attempt=${encodeURIComponent(String(f))}`;return Bu(Du(l,`/api/tasks/${encodeURIComponent(u)}/prompt?part=${encodeURIComponent(r)}${n}`))}async function nz(l,u,r=0,f=500,n=null){let t=n===null||n===void 0||String(n).length===0?"":`&attempt=${encodeURIComponent(String(n))}`;return Bu(Du(l,`/api/tasks/${encodeURIComponent(u)}/trace-steps?afterSeq=${encodeURIComponent(String(r))}&limit=${encodeURIComponent(String(f))}${t}`))}async function tz(l,u,r){return Bu(Du(l,`/api/tasks/${encodeURIComponent(u)}/trace-step?seq=${encodeURIComponent(String(r))}`))}async function iz(l,u){return Bu(Du(l,`/api/tasks/${encodeURIComponent(u)}/read`),{method:"POST",body:{}})}async function yz(l){return Bu(Du(l,"/api/tasks/read-all"),{method:"POST",body:{}})}function cz(l){return Array.isArray(l?.output)?l.output:[]}function $z(l){return Array.isArray(l?.attempts)?l.attempts:[]}function D2(l){return l?.counts&&typeof l.counts==="object"&&!Array.isArray(l.counts)?l.counts:{}}function _z(l){return l.split(/^\s*---+\s*$/gmu).map((u)=>u.trim()).filter(Boolean)}function mQ(l){let u=Number(l);return Number.isFinite(u)?Math.max(1,Math.min(50,Math.floor(u))):1}function Ci(l){let u=[];for(let r of l.split(/[\s,,;;]+/u)){let f=r.trim();if(/^codex_\d+_[A-Za-z0-9_-]+$/u.test(f)&&!u.includes(f))u.push(f)}return u}function Az(l,u){let r=Ci(u);if(r.length===0)return l;return[`引用 Code Queue 任务 ${r.join(" ")}。后端会在入队时只注入这些任务的 initial prompt 和 final response 全文;中间执行过程不注入,如需补充核查可运行:${r.map((f)=>`bun scripts/cli.ts codex task ${f}`).join(";")}`,"","本次任务:",l].join(` `)}function Fz(l){let f=l.trimStart();if(!f.startsWith("# Code Queue 已解析引用上下文"))return{hasInjection:!1,reference:"",userPrompt:l};let n=l.length-f.length,t=l.lastIndexOf(` # 本次任务 `);if(t0?l.split(/\r\n|\r|\n/u).length:0}function T3(l){if(typeof l==="string")return l;if(l&&typeof l==="object"&&!Array.isArray(l)&&typeof l.text==="string")return l.text;return""}function VQ(l,u={}){if(u.preview===!0){let n=T3(l?.displayPromptPreview||l?.basePromptPreview||l?.promptPreview);if(n.length>0)return n}let r=String(l?.displayPrompt||"");if(r.length>0)return r;let f=String(l?.prompt||"");return jz(Fz(f).userPrompt)}function Jr(l){return l?._traceSummary&&typeof l._traceSummary==="object"&&!Array.isArray(l._traceSummary)?l._traceSummary:null}function p3(l){return l?._promptDetails&&typeof l._promptDetails==="object"&&!Array.isArray(l._promptDetails)?l._promptDetails:{}}function k2(l){let u=Jr(l)?.prompt;return u&&typeof u==="object"&&!Array.isArray(u)?u:{}}function SQ(l){let u=Jr(l)?.execution;return u&&typeof u==="object"&&!Array.isArray(u)?u:{}}function mQ(l){let u=Number(l);return Number.isFinite(u)&&u>=0?Math.floor(u):0}function un(l){let u=Number(l);return Number.isFinite(u)&&u>=0?Math.floor(u):null}function I2(l){let u=ol(l?.traceStats);if(u&&(l?.statsSource==="oa-event-flow"||u.source==="oa-event-flow"))return u;let r=Jr(l),f=ol(r?.traceStats);if(f&&(r?.statsSource==="oa-event-flow"||f.source==="oa-event-flow"))return f;return null}function Nz(l,u){let r=ol(u?.traceStats)||ol(u?.execution?.traceStats),f=String(u?.statsSource||u?.execution?.statsSource||"");if(r&&(f==="oa-event-flow"||r.source==="oa-event-flow"))return r;return null}function Jz(l,u){return un(I2(l)?.[u])}function Uz(l){let u=Jz(l,"stepCount");if(u!==null)return u;let r=Jr(l);if(r!==null)return wz(r);return null}function YQ(...l){for(let u of l){let r=un(u);if(r!==null)return r}return null}function Qz(l){if(l.state==="ready"||l.state==="fallback")return`STEP ${l.count}${l.state==="fallback"?" raw":""}`;if(l.state==="syncing")return"STEP sync";if(l.state==="failed")return"STEP failed";return"STEP N/A"}function mz(l){let u=I2(l),r=un(u?.stepCount??u?.llmStepCount);if(r!==null)return{state:"ready",count:r,label:`STEP ${r}`,title:"STEP 来自 OA Event Flow 统计中心",source:"oa-event-flow"};let f=Jr(l),n=vt(l)&&l?._traceSummaryLoaded!==!0&&un(l?.outputCount??l?.retainedOutputCount)===0,t=YQ(f?.retainedStepCount,f?.execution?.traceLineCount,f?.execution?.stepCount,l?.outputCount,l?.retainedOutputCount,n?null:l?.stepCount,n?null:l?.llmStepCount);if(t!==null)return{state:"fallback",count:t,label:`STEP ${t} raw`,title:"OA STEP 统计不可用,当前显示 raw trace fallback 行数",source:"raw-trace"};if(f?.traceStatsError||l?.traceStatsError)return{state:"failed",count:null,label:"STEP failed",title:"STEP 统计读取失败;请查看 trace summary 原始 JSON",source:"stats-error"};if(vt(l)||l?._traceSummaryLoaded!==!0)return{state:"syncing",count:null,label:"STEP sync",title:"STEP 统计同步中;Trace Summary 或 OA 统计尚未返回",source:"syncing"};return{state:"unavailable",count:null,label:"STEP N/A",title:"当前任务没有可用 STEP 统计或 raw trace fallback",source:"unavailable"}}function wz(l){let u=ol(l?.traceStats);if(!u||l?.statsSource!=="oa-event-flow"&&u.source!=="oa-event-flow")return null;return un(u.stepCount)}function G3(l){if(!l||l?._traceSummaryLoaded!==!0)return!1;let u=Jr(l),r=String(l?._traceSummaryUpdatedAt||u?.updatedAt||""),f=String(l?.updatedAt||"");if(f.length>0){let n=en(r),t=en(f);if(n!==null&&t!==null){if(n+10)return r;let f=String(l?.basePrompt||"");return f.length>0?f:VQ(l)}function XQ(l){let u=Jr(l);return String(u?.finalResponse||l?.finalResponse||"").trimEnd()}function PQ(l){let r=Jr(l)?.lastJudge||l?.lastJudge;return r&&typeof r==="object"&&!Array.isArray(r)?r:null}function ol(l){return l&&typeof l==="object"&&!Array.isArray(l)?l:null}function qz(l){let u=ol(l?.raw),r=ol(l?.failureDetails)||ol(u?.minimaxFailure);if(r===null)return"";let f=r.repairAttempt===void 0?"":`${r.repairAttempt}/${r.maxRepairAttempts??"?"}`;return[["provider",r.provider||"minimax"],["stage",r.stage],["model",r.model],["timedOut",r.timedOut],["durationMs",r.durationMs],["timeoutMs",r.timeoutMs],["promptChars",r.promptChars],["promptLines",r.promptLines],["payloadBytes",r.payloadBytes],["responseStatus",r.responseStatus],["repairAttempt",f],["errorName",r.errorName],["error",r.errorMessage],["responseContentPreview",r.responseContentPreview],["responseTextPreview",r.responseTextPreview]].filter(([,t])=>t!==void 0&&t!==null&&String(t).length>0).map(([t,i])=>`${t}: ${String(i)}`).join(` -`)}function CQ({judge:l,testId:u="codex-judge-failure-details"}){let r=qz(l);if(r.length===0)return null;return L("details",{className:"codex-judge-failure-details","data-testid":u},L("summary",null,"MiniMax failure details"),L("pre",null,r))}function Lz(l){let u=Jr(l)?.attempts;if(Array.isArray(u)&&u.length>0)return V2(l,D2(l,u));let r=SQ(l),f=XQ(l),n=PQ(l);if(Object.keys(r).length===0&&f.length===0&&n===null)return V2(l,D2(l,[]));return V2(l,D2(l,[{index:Number(l?.currentAttempt||1),mode:l?.currentMode||"initial",startedAt:l?.startedAt,finishedAt:l?.finishedAt,terminalStatus:l?.status,execution:r,finalResponse:f,finalResponseChars:f.length,judge:n}]))}function z3(l,u){let r=Jr(l),f=Number(r?.currentAttempt||l?.currentAttempt||0),n=Number(u);return Number.isFinite(f)&&f>0&&Number.isFinite(n)&&n===f}function a2(l,u){return vt(l)&&z3(l,u)}function D2(l,u){let r=Array.isArray(u)?u.filter(Boolean):[],f=Jr(l),n=Number(f?.currentAttempt||l?.currentAttempt||0);if(!vt(l)||!Number.isFinite(n)||n<=0)return r;if(r.some((i)=>Number(i?.index)===n))return r;let t=x2(l?.startedAt,f?.startedAt,l?.updatedAt,f?.updatedAt);return[...r,{index:n,mode:l?.currentMode||f?.currentMode||(n<=1?"initial":"retry"),startedAt:t||l?.startedAt||f?.startedAt,finishedAt:null,terminalStatus:null,execution:{},finalResponse:"",finalResponsePreview:"",finalResponseChars:0,judge:null,currentPlaceholder:!0}]}function V2(l,u){let r=[...Array.isArray(u)?u:[]];if(!vt(l))return r;return r.sort((f,n)=>{let t=Number(f?.index),i=Number(n?.index),y=z3(l,t)?0:1,c=z3(l,i)?0:1;if(y!==c)return y-c;return t-i})}function Gz(l,u){return ol(u?.execution)||SQ(l)}function Wz(l,u,r,f){let n=Jr(l),t=Number(n?.currentAttempt||l?.currentAttempt||0),i=Number(r),y=Number.isFinite(i)&&i>0&&i===t,c=x2(l?.updatedAt,n?.updatedAt);if(y&&!u?.finishedAt&&c.length>0)return c;return String(u?.updatedAt||u?.finishedAt||f.effectiveEndAt||(y?c:"")||c||l?.finishedAt||l?.startedAt||"")}function Tz(l,u){let r=String(u?.finalResponse||u?.finalResponsePreview||"");if(a2(l,u?.index))return"";if(Object.prototype.hasOwnProperty.call(u||{},"finalResponse")||Object.prototype.hasOwnProperty.call(u||{},"finalResponsePreview"))return r.trimEnd();return r.length>0?r.trimEnd():XQ(l)}function hQ(l,u,r=u?.index){if(a2(l,r))return null;if(Object.prototype.hasOwnProperty.call(u||{},"judge"))return ol(u?.judge);return PQ(l)}function Kz(l,u,r){if(!bQ(l))return!1;if(o2(u,r))return!1;if(u?.finishedAt)return!1;if(["succeeded","failed","canceled"].includes(String(u?.terminalStatus||"")))return!1;if(z3(l,r))return!0;let f=Number(Jr(l)?.currentAttempt||l?.currentAttempt||0);if(Number.isFinite(f)&&f>0)return!1;return!0}function MQ(l){return`feedback:${String(l||"latest")}`}function Ez(l,u,r){let f=String(u?.feedbackPrompt||"").trimEnd(),n=String(u?.feedbackPromptPreview||f||"").trimEnd(),t=Number(u?.feedbackPromptChars||f.length||n.length||0),i=Number(u?.feedbackPromptLines||si(f||n));if(f.length>0||n.length>0||t>0)return{text:f,preview:n,chars:t,lines:i,source:u?.feedbackPromptSource||"judge-feedback",forAttempt:u?.feedbackPromptForAttempt||Number(r||0)+1,truncated:Boolean(u?.feedbackPromptTruncated)};let y=hQ(l,u,r),c=String(y?.continuePrompt||"").trimEnd();if(y?.decision==="retry"&&c.length>0)return{text:"",preview:c,chars:c.length,lines:si(c),source:"judge-continue-prompt",forAttempt:Number(r||0)+1,truncated:!1};return null}function pz(l){let u=k2(l);return Boolean(u.hasReferenceInjection||Number(u.referencePromptChars||0)>0||l?.referenceInjection||l?.referenceInjectionSummary)}function sQ(l,u=null){if(u!==null&&u!==void 0){let f=(ol(l?._traceStepsByAttempt)||{})[String(u)];return Array.isArray(f)?f:[]}return Array.isArray(l?._traceSteps)?l._traceSteps:[]}function m1(l){let r=[l?.seq,...Array.isArray(l?.rawSeqs)?l.rawSeqs:[]].map((f)=>Number(f)).filter((f)=>Number.isFinite(f));return r.length>0?Math.max(...r):0}function zz(l){return(Array.isArray(l)?l:[]).reduce((u,r)=>Math.max(u,m1(r)),0)}function Oz(l,u){let r=new Map;for(let f of[...Array.isArray(l)?l:[],...Array.isArray(u)?u:[]]){let n=String(f?.seq??`${f?.title||"step"}:${f?.at||""}`);r.set(n,{...r.get(n)||{},...f})}return Array.from(r.values()).sort((f,n)=>m1(f)-m1(n))}function xi(l){return(Array.isArray(l?.summaryLines)?l.summaryLines:[]).map((u)=>String(u||""))}function Zz(l){let u=String(l?.kind||"").trim().toLowerCase(),r=String(l?.status||"").trim().toLowerCase();return u==="error"||r==="error"}function O3(l){let u=String(l?.status||"").trim();if(u.length>0)return u;let r=xi(l).join(` -`);return/^(item\/[A-Za-z]+(?:\/[A-Za-z]+)?):/u.exec(r)?.[1]||""}function wQ(l){return/^item\/(?:started|completed): file changes status=/u.test(String(l||"").trim())}function Hz(l){let u=xi(l);for(let f=u.length-1;f>=0;f-=1){let n=/file changes status=([A-Za-z0-9_-]+)/u.exec(u[f]||"")?.[1];if(n)return n}let r=O3(l);if(r==="item/fileChange/outputDelta")return"updated";if(r==="item/started")return"started";if(r==="item/completed")return"completed";return r.replace(/^item\//u,"")||String(l?.status||"changed")}function Bz(l){if(String(l?.kind||"")!=="edited")return!1;let u=String(l?.title||""),r=String(l?.status||""),f=xi(l).join(` -`);if(u==="Edited files")return!0;if(/^item\/fileChange\//u.test(r))return!0;if((r==="item/started"||r==="item/completed")&&/file changes status=/u.test(f))return!0;if(/^Success\. Updated the following files:/mu.test(f))return!0;if(/^diff --git /mu.test(f))return!0;return/^([AMDRCU?]{1,2})\s+\S+/mu.test(f)}function Dz(l){if(l.length<=1)return l[0];let u=l.find((t)=>O3(t)==="item/fileChange/outputDelta")||l.find((t)=>xi(t).some((i)=>!wQ(i)))||l.at(-1)||l[0],r=l.flatMap((t)=>Array.isArray(t?.rawSeqs)?t.rawSeqs:[t?.seq]).filter((t)=>t!==void 0),f=l.flatMap(xi).filter((t)=>t.trim().length>0&&!wQ(t)),n=l[l.length-1]||u;return{...u,at:u?.at||n?.at,title:String(u?.title||"Edited files"),status:Hz(n),summaryLines:f.length>0?f:xi(u),rawSeqs:r}}function Vz(l){let u=Array.isArray(l)?l:[],r=[],f=[],n=()=>{if(f.length>0)r.push(Dz(f));f=[]};for(let t of u){if(Bz(t)){if(O3(t)==="item/started"&&f.length>0)n();if(f.push(t),O3(t)==="item/completed")n();continue}n(),r.push(t)}return n(),r}function Sz(l){if(String(l?.kind||"")!=="message")return"";let u=String(l?.title||"").trim().toLowerCase();if(u!=="assistant message"&&u!=="reasoning")return"";return`${u}:${String(l?.status||"")}`}function Yz(l){if(l.length<=1)return l[0];let u=l[0],r=l.at(-1)||u,f=l.flatMap((i)=>Array.isArray(i?.rawSeqs)?i.rawSeqs:[i?.seq]).filter((i)=>i!==void 0),n=[];for(let i of f)if(!n.includes(i))n.push(i);let t=l.flatMap(xi).filter((i)=>i.trim().length>0);return{...u,seq:m1(r)||m1(u),at:r?.at||u?.at,summaryLines:t.length>0?[t.at(-1)||t[0]]:[],rawSeqs:n}}function Xz(l){let u=Array.isArray(l)?l:[],r=[],f=[],n="",t=()=>{if(f.length>0)r.push(Yz(f));f=[],n=""};for(let i of u){let y=Sz(i);if(y.length>0&&y===n){f.push(i);continue}if(t(),y.length>0)f=[i],n=y;else r.push(i)}return t(),r}function Pz(l){return Xz(Vz(l))}function Cz(l){return{...l}}function E3(l,u=null){if(u!==null&&u!==void 0){let r=ol(l?._traceStepsLoadedByAttempt)||{};return Boolean(r[String(u)])}return Boolean(l?._traceStepsLoaded)}function M2(l){return l?._traceStepDetails&&typeof l._traceStepDetails==="object"&&!Array.isArray(l._traceStepDetails)?l._traceStepDetails:{}}function hz(l,u){let r=Number(l?.index);return Number.isFinite(r)?r:u+1}function o2(l,u){return Boolean(l?.synthetic)||Number(u)<=0}function H3(l){let u=Number(l);return Number.isFinite(u)?String(u):void 0}function Mz(l){let u=l?.timing&&typeof l.timing==="object"?l.timing:{},r=String(l?.status||"");if(["queued"].includes(r))return`等待 ${ln(u.queueWaitMs??u.totalElapsedMs)}`;if(["running","judging","retry_wait"].includes(r))return`耗时 ${ln(u.durationMs??u.totalElapsedMs)}`;return`耗时 ${ln(u.durationMs??u.totalElapsedMs)}`}function Fy(l){return String(l?.queueId||"default")}function RQ(l){return ol(l?.queuedReason)}function xQ(l){let u=String(l?.queuedReasonLabel||"").trim();if(u.length>0)return u.toUpperCase();let r=RQ(l),f=String(r?.label||"").trim();return f.length>0?f.toUpperCase():""}function sz(l){let u=String(l?.status||"unknown");if(u!=="queued")return u;let r=xQ(l);return r.length>0?`QUEUED(${r})`:"QUEUED"}function Rz(l){if(String(l?.status||"")!=="queued")return;let u=RQ(l),r=String(u?.message||"").trim(),f=xQ(l);if(r.length>0&&f.length>0)return`${f}: ${r}`;if(r.length>0)return r;return f.length>0?f:void 0}function xz(l){return{system:"SYS",user:"YOU",assistant:"GPT",reasoning:"THINK",command:"CMD",diff:"DIFF",tool:"TOOL",error:"ERR"}[l]||l.toUpperCase()}function vt(l){return["running","judging","retry_wait"].includes(String(l?.status||""))}function bQ(l){return String(l?.status||"")==="running"}function ef(l){return["succeeded","failed","canceled"].includes(String(l?.status||""))}function vQ(l){if(l?.promptEditable===!0)return!0;if(l?.promptEditable===!1)return!1;return String(l?.status||"")==="queued"&&!l?.startedAt&&Number(l?.currentAttempt||0)===0&&!l?.codexThreadId&&!l?.nextMode}function on(l){if(!ef(l))return!1;if(l?.terminalUnread===!0)return!0;if(l?.terminalUnread===!1)return!1;return!l?.readAt}function pu(l){let u=Number(l||0);return Number.isFinite(u)?u:0}function bz(l){return pu(l.queued)+pu(l.retry_wait)}function vz(l){return pu(l.running)+pu(l.judging)}function gz(l,u){return ol(l?.statistics)||ol(u?.statistics)||{}}function gQ(...l){return l.find((u)=>u!==void 0&&u!==null)}function kQ(l){let u=Number(l);return Number.isFinite(u)&&u>=0?u:null}function Kr(...l){for(let u of l){let r=kQ(u);if(r!==null)return Math.floor(r)}return 0}function d2(...l){for(let u of l){let r=kQ(u);if(r!==null)return Math.round(r)}return null}function kz(l){for(let u of[l?.daily,l?.dailyBuckets,l?.daily_buckets,l?.buckets,l?.rows,l?.series])if(Array.isArray(u))return u;return[]}function IQ(l){return kz(l).map((u,r)=>{let f=ol(u)||{},n=String(gQ(f.date,f.day,f.bucketDate,f.bucket,`day-${r}`)||"");return{...f,date:n,executedTasks:Kr(f.executedTasks,f.tasks,f.taskCount,f.startedTasks,f.started,f.executed,f.count),completedTasks:Kr(f.completedTasks,f.terminalTasks,f.terminalCount,f.finishedTasks,f.finished,f.completed),retryAttempts:Kr(f.retryAttempts,f.retries,f.retryCount,f.retryTasks),succeededTasks:Kr(f.succeededTasks,f.succeeded,f.success),failedTasks:Kr(f.failedTasks,f.failed,f.failures),canceledTasks:Kr(f.canceledTasks,f.cancelledTasks,f.canceled,f.cancelled),totalDurationMs:Kr(f.totalDurationMs,f.durationTotalMs,f.totalCompletionDurationMs),durationSamples:Kr(f.durationSamples,f.avgDurationSamples,f.samples,f.sampleCount),avgDurationMs:d2(f.avgDurationMs,f.averageDurationMs,f.avgCompletedDurationMs,f.averageCompletionMs,f.averageDuration,f.durationMs)}}).filter((u)=>u.date.length>0)}function xt(l,u){return l.reduce((r,f)=>r+pu(f?.[u]),0)}function Iz(l){let u=0,r=0;for(let f of l){let n=pu(f?.durationSamples),t=d2(f?.avgDurationMs);if(n>0&&t!==null)u+=t*n,r+=n}return r>0?Math.round(u/r):null}function az(l,u=IQ(l)){let r=ol(l?.totals)||ol(l?.summary)||{},f=Kr(r.durationSamples,r.avgDurationSamples,r.samples,l?.durationSamples,l?.samples,xt(u,"durationSamples")),n=Kr(r.totalDurationMs,r.durationTotalMs,l?.totalDurationMs,xt(u,"totalDurationMs")),t=d2(r.avgDurationMs,r.averageDurationMs,r.avgCompletedDurationMs,l?.avgDurationMs,l?.averageDurationMs,f>0&&n>0?n/f:null,Iz(u));return{...r,executedTasks:Kr(r.executedTasks,r.tasks,r.taskCount,l?.executedTasks,l?.tasks,l?.taskCount,xt(u,"executedTasks")),completedTasks:Kr(r.completedTasks,r.terminalTasks,r.terminalCount,r.finishedTasks,l?.completedTasks,l?.terminalTasks,l?.terminalCount,xt(u,"completedTasks")),retryAttempts:Kr(r.retryAttempts,r.retries,r.retryCount,l?.retryAttempts,l?.retries,l?.retryCount,xt(u,"retryAttempts")),succeededTasks:Kr(r.succeededTasks,l?.succeededTasks,xt(u,"succeededTasks")),failedTasks:Kr(r.failedTasks,l?.failedTasks,xt(u,"failedTasks")),canceledTasks:Kr(r.canceledTasks,r.cancelledTasks,l?.canceledTasks,l?.cancelledTasks,xt(u,"canceledTasks")),durationSamples:f,totalDurationMs:n,avgDurationMs:t}}function qQ(l){let u=gQ(l?.reason,l?.degradedReason,l?.statsReason,l?.error,l?.message,l?.detail);if(typeof u==="string"&&u.trim().length>0)return Q1(u,180);if(l?.skipped===!0)return"统计 API 返回 skipped,当前后端未提供 daily buckets。";if(l?.unavailable===!0)return"统计 API 当前不可用。";return"统计 API 未返回可用的 daily buckets。"}function oz(l,u,r){let f=ol(l)!==null,n=l?.unavailable===!0||l?._unavailable===!0||l?.available===!1,t=l?.skipped===!0,i=l?.degraded===!0||l?.isDegraded===!0||n||t,y=pu(r.executedTasks)+pu(r.retryAttempts)+pu(r.completedTasks);if(!f)return{state:"loading",label:"统计同步中",reason:"正在读取 Code Queue stats API。"};if(n||t||i&&u.length===0)return{state:"unavailable",label:"统计不可用",reason:qQ(l),degraded:!0};if(i)return{state:"degraded",label:"统计降级",reason:qQ(l),degraded:!0};if(u.length===0&&y===0)return{state:"empty",label:"暂无统计",reason:"任务开始执行后会生成按天汇总的曲线。"};return{state:"ready",label:"统计就绪",reason:""}}function LQ(l){return{source:"frontend-stats-fetch",unavailable:!0,degraded:!0,reason:Hu(l,"统计 API 不可用"),daily:[],totals:null}}function e2(l,u){let r=Number(l?.[u]??0);return Number.isFinite(r)&&r>0?r:0}function S2(l,u){return l.reduce((r,f)=>Math.max(r,e2(f,u)),0)}var Mi=700,GQ=220,bt=30,_y=24,U1=184,s2=U1-_y;function aQ(l,u){if(u<=1)return Mi/2;return bt+l*(Mi-bt*2)/(u-1)}function oQ(l,u){let r=u>0?u:1;return U1-Math.min(1,l/r)*s2}function Y2(l,u,r){let f=l.length>0?l:[{[u]:0}],n=f.length>1?f:[f[0],f[0]];return n.map((t,i)=>`${aQ(i,n.length).toFixed(2)},${oQ(e2(t,u),r).toFixed(2)}`).join(" ")}function an(l){let u=String(l||"");return/^\d{4}-\d{2}-\d{2}$/u.test(u)?u.slice(5):u||"--"}function W3(l){if(!l)return"";return`${String(l.seriesKey||"")}:${String(l.row?.date||l.index||"")}`}function dz(l,u,r,f){let n=e2(l,f.key);return{...f,row:l,index:u,value:n,valueLabel:f.format(n),x:aQ(u,r),y:oQ(n,f.max),seriesKey:f.key}}function WQ(l){if(on(l))return 0;return{running:1,judging:2,retry_wait:3,queued:4,succeeded:8,failed:8,canceled:8}[String(l?.status||"")]??9}function A1(l){if(!l)return!1;if(l?._traceSummaryLoaded===!0)return!1;return l?.summaryOnly===!0||l?._metaLoaded!==!0}function ez(l){return Boolean(l?._metaLoaded)||l?.summaryOnly===!1}function lO(l,u,r){let f=String(l?.[r]||""),n=String(u?.[r]||"");return f.length>n.length?f:n}function R2(l,u,r){let f=Array.isArray(l?.[r])?l[r]:[],n=Array.isArray(u?.[r])?u[r]:[];if(n.length===0&&f.length>0)return f;return f.length>n.length?f:n}function TQ(l,u){let r=u?.summaryOnly===!0&&ez(l),f={...l,...u};if(!r)return f;for(let n of["prompt","basePrompt","displayPrompt","finalResponse"])f[n]=lO(l,u,n);for(let n of["promptHistory","attempts","output","events"])f[n]=R2(l,u,n);if(l?.referenceInjection?.items&&!u?.referenceInjection?.items)f.referenceInjection=l.referenceInjection;if(l?.referenceInjectionSummary&&!u?.referenceInjectionSummary)f.referenceInjectionSummary=l.referenceInjectionSummary;f.summaryOnly=l?.summaryOnly===!1?!1:u.summaryOnly,f._metaLoaded=l?._metaLoaded,f._detailLoaded=l?._detailLoaded,f._transcriptComplete=l?._transcriptComplete,f._transcriptPreview=Object.prototype.hasOwnProperty.call(u,"_transcriptPreview")?u._transcriptPreview:l?._transcriptPreview;for(let n of["_traceSummary","_traceSummaryLoaded","_traceSteps","_traceStepsLoaded","_traceStepsByAttempt","_traceStepsLoadedByAttempt","_traceStepsNextAfterSeqByAttempt","_traceStepDetails","_promptDetails"])if(!Object.prototype.hasOwnProperty.call(u,n)&&Object.prototype.hasOwnProperty.call(l||{},n))f[n]=l[n];return f}function KQ(l){let u=l?.selected,r=u?.task&&typeof u.task==="object"?u.task:null;if(r!==null){let n=Boolean(u?.preview);return{...r,transcript:Array.isArray(u?.transcript)?u.transcript:[],_detailLoaded:Array.isArray(u?.transcript)&&u.transcript.length>0,_transcriptComplete:Boolean(!n&&!u?.hasMore&&ef(r)),_transcriptPreview:n,_summaryLoaded:!0}}let f=Cu(l)[0];return f?{...f,_summaryLoaded:!0}:null}function X2(l,u){let r=new Map;for(let f of[...Array.isArray(l)?l:[],...Array.isArray(u)?u:[]]){let n=`${Number(f?.seq??0)}:${String(f?.kind||"message")}`,t=r.get(n);if(!t){r.set(n,f);continue}let i={...t,...f};for(let[y,c]of[["bodyPreview","bodyOmittedLines"],["commandPreview","commandOmittedLines"]]){let _=String(t?.[y]||""),A=String(f?.[y]||"");if(_.length>A.length)i[y]=t[y],i[c]=t[c]}r.set(n,i)}return Array.from(r.values()).sort((f,n)=>Number(f?.seq??0)-Number(n?.seq??0))}function F1(l){return(Array.isArray(l)?l:[]).reduce((u,r)=>Math.max(u,Number(r?.seq??0)),0)}function EQ(l,u=8){let r=Array.from(new Set((Array.isArray(l)?l:[]).map((n)=>Number(n?.seq??0)).filter((n)=>Number.isFinite(n)&&n>0))).sort((n,t)=>n-t);if(r.length===0)return 0;let f=r[Math.max(0,r.length-u)]??0;return Math.max(0,f-0.001)}function uO(l,u){let r=Array.isArray(l?.codeModels)?l.codeModels:Array.isArray(l?.codexModels)?l.codexModels:[],f=["gpt-5.5","gpt-5.4-mini","gpt-5.4","minimax-m2.7"];return Array.from(new Set([...r,...f,u].map((n)=>String(n||"").trim()).filter(Boolean)))}function rO(l,u){let f=(Array.isArray(l?.executionProviders)?l.executionProviders:[]).map((i)=>({id:String(i?.id||"").trim(),label:String(i?.label||i?.id||"").trim(),defaultWorkdir:String(i?.defaultWorkdir||"").trim(),supportsWindowsNativeCodex:i?.supportsWindowsNativeCodex===!0,windowsNativeDefaultWorkdir:String(i?.windowsNativeDefaultWorkdir||"").trim(),kind:String(i?.kind||"").trim()})).filter((i)=>i.id.length>0),n=String(l?.mainProviderId||l?.defaultProviderId||"D601").trim()||"D601",t=new Map;for(let i of[...f,{id:n,label:`${n} (local)`,defaultWorkdir:String(l?.defaultWorkdir||"/workspace"),supportsWindowsNativeCodex:!1,windowsNativeDefaultWorkdir:"",kind:"local"},u?{id:u,label:u,defaultWorkdir:l5(l,u),supportsWindowsNativeCodex:u!==n,windowsNativeDefaultWorkdir:String(l?.windowsNativeCodexDefaultWorkdir||"/mnt/f/Work/ConStart"),kind:""}:null].filter(Boolean))if(!t.has(i.id))t.set(i.id,i);return Array.from(t.values())}function fO(l,u){let f=(Array.isArray(l?.executionModes)?l.executionModes:[]).map((i)=>({id:String(i?.id||i?.kind||"").trim(),label:String(i?.label||i?.id||i?.kind||"").trim(),description:String(i?.description||"").trim(),defaultWorkdir:String(i?.defaultWorkdir||"").trim(),requiresProvider:i?.requiresProvider===!0,requiresWindowsCwd:i?.requiresWindowsCwd===!0})).filter((i)=>i.id.length>0),n=[{id:"default",label:"默认容器/本机",description:"Code Queue 所在节点用本机 Codex;远程 Provider 用执行容器 Codex。",defaultWorkdir:"",requiresProvider:!1,requiresWindowsCwd:!1},{id:"windows-native",label:"Windows 原生 Codex",description:"启动执行容器,但容器只做 stdio relay,Codex 运行在 Provider 的 Windows 宿主。",defaultWorkdir:String(l?.windowsNativeCodexDefaultWorkdir||"/mnt/f/Work/ConStart"),requiresProvider:!0,requiresWindowsCwd:!0}],t=new Map;for(let i of[...f,...n,u?{id:u,label:u,description:"",defaultWorkdir:"",requiresProvider:u==="windows-native",requiresWindowsCwd:u==="windows-native"}:null].filter(Boolean))if(!t.has(i.id))t.set(i.id,i);return Array.from(t.values())}function N1(l,u,r){if(u!=="windows-native")return l5(l,r);let f=Array.isArray(l?.executionModes)?l.executionModes.find((t)=>String(t?.id||t?.kind||"")==="windows-native"):null,n=Array.isArray(l?.executionProviders)?l.executionProviders.find((t)=>String(t?.id||"")===r):null;return String(n?.windowsNativeDefaultWorkdir||f?.defaultWorkdir||l?.windowsNativeCodexDefaultWorkdir||"/mnt/f/Work/ConStart")}function l5(l,u){let r=String(u||"").trim(),f=l?.defaultWorkdirByProvider&&typeof l.defaultWorkdirByProvider==="object"?l.defaultWorkdirByProvider:{};if(typeof f[r]==="string"&&String(f[r]).trim().length>0)return String(f[r]).trim();let n=Array.isArray(l?.executionProviders)?l.executionProviders.find((i)=>String(i?.id||"")===r):null;if(typeof n?.defaultWorkdir==="string"&&n.defaultWorkdir.trim().length>0)return n.defaultWorkdir.trim();let t=String(l?.mainProviderId||l?.defaultProviderId||"D601");return r===t?String(l?.defaultWorkdir||"/workspace"):String(l?.remoteDefaultWorkdir||"/home/ubuntu")}function jy(l){return String(l||"").trim().replace(/\/+$/u,"")||"/"}function nO(l,u,r){return String(l?.providerId||"")===String(u||"")&&String(l?.executionMode||"default")===String(r||"default")&&String(l?.path||"").trim().length>0}function tO(l,u,r,f,n){let t=new Map,i=jy(n),y=(c,_,A={})=>{let F=jy(c);if(F.length===0||t.has(F))return;t.set(F,{providerId:r,executionMode:f,path:F,source:_,createdAt:A?.createdAt||"",updatedAt:A?.updatedAt||""})};y(N1(l,f,r),"default");for(let c of Array.isArray(u)?u:[])if(nO(c,r,f))y(c.path,"saved",c);return y(n,"current"),Array.from(t.values()).sort((c,_)=>{if(c.path===i)return-1;if(_.path===i)return 1;if(c.source==="default"&&_.source!=="default")return-1;if(_.source==="default"&&c.source!=="default")return 1;return c.path.localeCompare(_.path)})}function iO({task:l,selected:u,onSelect:r,onCopy:f,onReference:n,onMarkRead:t,copied:i,markingRead:y}){let c=l?.lastJudge||{},_=String(l?.id||""),A=on(l),F=x2(l?.updatedAt,Jr(l)?.updatedAt),j=`最近更新: ${J1(F)}`,N=mz(l),U=N.title;return L("article",{role:"button",tabIndex:0,className:`codex-task-card ${u?"selected":""} ${A?"unread-terminal":""}`,onClick:r,onKeyDown:(w)=>{if(w.key==="Enter"||w.key===" ")w.preventDefault(),r()},"data-unread-terminal":A?"true":"false","data-testid":`codex-task-${l?.id||"unknown"}`},A?L("span",{className:"codex-unread-badge",title:"待读","aria-label":"待读","data-testid":`codex-unread-task-${_||"unknown"}`}):null,L("div",{className:"codex-task-card-head"},L("div",{className:"codex-task-status-line"},L(Ri,{status:l?.status,title:Rz(l)},sz(l))),L("span",{className:"mono-text"},`${l?.currentAttempt||0}/${l?.maxAttempts||0}`)),L("div",{className:"codex-task-id-row"},L("code",{title:_},_||"unknown"),L("div",{className:"codex-task-id-actions"},L("button",{type:"button",className:"codex-copy-id-btn",onClick:(w)=>{w.stopPropagation(),n(_)},"data-testid":`codex-reference-task-${_||"unknown"}`},"引用"),L("button",{type:"button",className:"codex-copy-id-btn",onClick:(w)=>{w.stopPropagation(),f(_)},"data-testid":`codex-copy-task-id-${_||"unknown"}`},i?"已复制":"复制ID"),A?L("button",{type:"button",className:"codex-copy-id-btn codex-mark-read-btn",disabled:Boolean(y),onClick:(w)=>{w.stopPropagation(),t(_)},"data-testid":`codex-mark-task-read-${_||"unknown"}`},y?"标记中":"标为已读"):null)),L("strong",null,Q1(VQ(l,{preview:!0}),120)||"空任务"),L("div",{className:"codex-task-meta"},L("span",null,`queue=${Fy(l)}`),L("span",null,`provider=${l?.providerId||"D601"}`),L("span",null,`mode=${l?.executionMode||"default"}`),L("span",null,l?.model||"--"),L("span",null,Mz(l))),L("div",{className:"codex-task-meta codex-task-update-meta"},L("span",{className:`codex-task-recent-update codex-task-step-count ${N.state}`,title:U,"data-testid":`codex-task-step-count-${_||"unknown"}`,"data-step-state":N.state,"data-step-source":N.source},Qz(N)),L("span",{className:"codex-task-recent-update",title:F?`更新时间: ${Ll(F)}`:j,"data-testid":`codex-task-recent-update-${_||"unknown"}`},j),L("span",null,Ll(F||l?.updatedAt))),vQ(l)?L("div",{className:"codex-judge-line","data-testid":`codex-task-prompt-editable-${_||"unknown"}`},"queued prompt 可编辑"):null,c?.decision?L("div",{className:"codex-judge-line"},`judge=${c.decision} ${Math.round(Number(c.confidence||0)*100)}%`):null)}function P2({title:l,tasks:u,selectedId:r,onSelect:f,onCopy:n,onReference:t,onMarkRead:i,copiedTaskId:y,markingReadTaskId:c,emptyText:_}){let A=Array.isArray(u)?u:[];return L("section",{className:"codex-task-section"},L("div",{className:"codex-task-section-head"},L("span",null,l),L("code",null,String(A.length))),A.length===0?L("p",{className:"codex-task-section-empty"},_):L("div",{className:"codex-task-section-list"},A.map((F)=>L(iO,{key:F.id,task:F,selected:r===F.id,onSelect:()=>f(F.id),onCopy:n,onReference:t,onMarkRead:i,copied:y===F.id,markingRead:c===F.id}))))}function yO(){return L("span",{className:"codex-stats-icon","aria-hidden":"true"},L("svg",{viewBox:"0 0 36 24",focusable:"false"},L("path",{className:"grid",d:"M3 20.5H33M3 12.5H33M3 4.5H33"}),L("polyline",{className:"line tasks",points:"3,18 9,14 15,15 21,8 27,10 33,4"}),L("polyline",{className:"line retry",points:"3,20 9,17 15,18 21,13 27,14 33,9"})))}function Df({label:l,value:u,hint:r,tone:f}){return L("div",{className:`codex-liveness-metric ${f||""}`},L("span",null,l),L("strong",null,u??"--"),r?L("code",null,r):null)}function cO({diagnostics:l,queue:u,onRaw:r}){let f=String(l?.state||l?.health||"unknown"),n=ol(l?.oaPublisher),t=ar(l?.reasons).slice(0,3),i=v2(l),y=ZQ(l),c=HQ(l),_=String(l?.recommendedAction||(i.length>0?"investigate-heartbeat-risk":y?"continue-supervision":c==="degraded"?"observe-degraded":"none")),A=String(y?"执行面 heartbeat 新鲜,任务仍应继续监督。":i.length>0?"存在 expired/missing/stale heartbeat 风险,请先确认执行面状态。":l?.livenessSummary||(c==="degraded"?"Diagnostics are degraded; inspect heartbeat, trace, and OA progress together.":"Execution diagnostics are healthy.")),F=Ip(l),j=y?"split-brain live":f;return L(hi,{title:"执行活性",eyebrow:`${String(l?.executionStateSource||u?.executionStateSource||"unknown")} / ${String(l?.controlPlane||"code-queue")}`,summary:L("div",{className:"codex-trace-status"},L("span",{className:`codex-trace-status-chip liveness ${F}`},L("b",null,"状态"),j),L("span",{className:`codex-trace-status-chip liveness ${F}`},L("b",null,"liveness"),c),L("span",{className:"codex-trace-status-chip"},L("b",null,"DB active"),String(l?.databaseActiveTaskCount??u?.databaseActiveTaskCount??0)),L("span",{className:"codex-trace-status-chip"},L("b",null,"scheduler slots"),String(l?.schedulerActiveRunSlotCount??u?.activeRunSlotCount??0)),L("span",{className:"codex-trace-status-chip"},L("b",null,"heartbeat"),`${ar(l?.heartbeatFreshTaskIds).length} fresh / ${ar(l?.heartbeatExpiredTaskIds).length} expired`),n?L("span",{className:"codex-trace-status-chip"},L("b",null,"OA"),`${Number(n.pending||0)} pending${n.lastError?" / error":""}`):null),actions:L(b2,{title:"Code Queue Execution Diagnostics",data:l,onOpen:r,testId:"raw-code-queue-execution-diagnostics"}),className:"codex-liveness-panel"},L("div",{className:"codex-liveness-grid","data-testid":"codex-liveness-diagnostics"},L(Df,{tone:F,label:"健康状态",value:j,hint:_}),L(Df,{tone:F,label:"Effective liveness",value:c,hint:A}),L(Df,{label:"PostgreSQL active",value:String(l?.databaseActiveTaskCount??u?.databaseActiveTaskCount??0),hint:cy(l?.databaseActiveTaskIds??u?.databaseActiveTaskIds)}),L(Df,{label:"Scheduler active",value:String(l?.schedulerActiveRunSlotCount??u?.activeRunSlotCount??0),hint:cy(l?.schedulerActiveTaskIds??u?.activeTaskIds)}),L(Df,{label:"Fresh heartbeat",value:String(ar(l?.heartbeatFreshTaskIds).length),hint:cy(l?.heartbeatFreshTaskIds)}),L(Df,{tone:i.length>0?"failed":y?"warn":"",label:"Heartbeat risk",value:String(i.length),hint:i.length>0?cy(i):y?"fresh heartbeat: keep supervising":"--"}),L(Df,{tone:ar(l?.traceGapNotStaleTaskIds).length>0?"warn":"",label:"Trace gap",value:String(ar(l?.traceGapTaskIds).length),hint:cy(l?.traceGapNotStaleTaskIds)}),L(Df,{tone:ar(l?.staleRecoveryCandidateTaskIds).length>0?"failed":"",label:"Stale candidates",value:String(ar(l?.staleRecoveryCandidateTaskIds).length),hint:cy(l?.staleRecoveryCandidateTaskIds)}),L(Df,{label:"Last scheduler heartbeat",value:J1(l?.lastSchedulerHeartbeatAt),hint:String(l?.lastSchedulerHeartbeatAt||"--")}),L(Df,{label:"Last agent event",value:J1(l?.lastObservedAgentEventAt),hint:String(l?.lastObservedAgentEventAt||"--")}),L(Df,{label:"Last trace persist",value:J1(l?.lastPersistedTraceAt),hint:String(l?.lastPersistedTraceAt||"--")}),L(Df,{tone:n?.lastError?"warn":"",label:"OA publisher",value:`${Number(n?.pending||0)} pending`,hint:n?.lastError?Q1(n.lastError,90):"ok"})),L("div",{className:`codex-liveness-advisory ${F}`},L("b",null,y?"Observing split":i.length>0?"Heartbeat risk":"Liveness note"),L("span",null,A)),t.length>0?L("div",{className:"codex-liveness-reasons"},t.map((N)=>L("span",{key:N},N))):null)}function $O({stats:l,queueName:u,onRaw:r}){let f=IQ(l),n=az(l,f),t=f.at(-1)||{},i=S2(f,"executedTasks"),y=S2(f,"retryAttempts"),c=S2(f,"avgDurationMs"),_=f.length>0,A=ol(l?.range)||{},F=oz(l,f,n),j=String(F.label||""),N=String(F.reason||""),U=F.state==="ready"||F.state==="degraded"?"将鼠标悬停到曲线数据点查看明细,点击数据点可固定。":N||"等待统计数据。",[w,G]=kl(null),[J,Q]=kl(null),m=[];if(i>0)m.push(`tasks ${i}`);if(y>0)m.push(`retry ${y}`);if(c>0)m.push(`avg ${ln(c)}`);let q=[{key:"executedTasks",className:"tasks",label:"执行任务",max:i,format:(B)=>`${pu(B)} tasks`},{key:"retryAttempts",className:"retry",label:"重试次数",max:y,format:(B)=>`${pu(B)} retries`},{key:"avgDurationMs",className:"duration",label:"平均耗时",max:c,format:(B)=>ln(B)}],W=w||J,p=W3(W),O=String(W?.row?.date||""),Z=W?{left:`${Math.max(8,Math.min(92,Number(W.x)/Mi*100))}%`,top:`${Math.max(14,Math.min(86,Number(W.y)/GQ*100))}%`}:void 0;df(()=>{G(null),Q(null)},[u,A.startDate,A.endDate,f.length]);let V=(B)=>{G(B)},P=(B)=>{let C=W3(B);Q((E)=>W3(E)===C?null:B),G(B)},H=q.flatMap((B)=>f.map((C,E)=>{let D=dz(C,E,f.length,B),Y=W3(D),v=p===Y,K=String(C?.date||`day-${E}`),X=`${an(K)} ${B.label}: ${D.valueLabel}`;return L("g",{key:`${B.key}-${K}`,className:`stat-point-group ${B.className} ${v?"active":""}`,role:"button",tabIndex:0,"aria-label":X,"data-testid":`codex-stats-point-${B.className}-${K}`,onMouseEnter:()=>V(D),onFocus:()=>V(D),onClick:()=>P(D),onKeyDown:(I)=>{if(I.key==="Enter"||I.key===" ")I.preventDefault(),P(D)}},L("circle",{className:"stat-hit-point",cx:D.x,cy:D.y,r:13}),L("circle",{className:`stat-point ${B.className} ${v?"active":""}`,cx:D.x,cy:D.y,r:v?5.6:4.2}))}));return L(hi,{title:"统计曲线",eyebrow:`Daily task stats / ${u}`,className:`codex-stats-panel ${F.state}`,summary:L("span",null,`${an(A.startDate)} -> ${an(A.endDate)} · ${l?.timezone||"Asia/Shanghai"} · ${j}`),actions:ol(l)?L(b2,{title:"Code Queue Stats",data:l,onOpen:r,testId:"raw-codex-stats"}):null},L("div",{className:"codex-stats-hero","data-testid":"codex-stats-panel","data-stats-state":F.state,"data-stats-degraded":F.degraded===!0?"true":"false"},L(yO),L("div",null,L("strong",null,`${pu(n.executedTasks)} tasks / ${pu(n.retryAttempts)} retries`),L("span",null,`平均完成耗时 ${ln(n.avgDurationMs??void 0)} · 终态 ${pu(n.completedTasks)} 个`))),F.degraded===!0?L("div",{className:`codex-stats-diagnostic ${F.state}`,"data-testid":"codex-stats-diagnostic"},L("b",null,j),L("span",null,N),l?.source?L("code",null,`source=${String(l.source)}`):null):null,L("div",{className:`codex-stats-chart ${_?"has-data":"no-data"}`,"data-testid":"codex-stats-chart","data-empty":_?"false":"true",onMouseLeave:()=>G(null)},L("svg",{viewBox:`0 0 ${Mi} ${GQ}`,preserveAspectRatio:"none",role:"img","aria-label":"Code Queue daily task statistics"},L("line",{className:"axis",x1:bt,x2:Mi-bt,y1:U1,y2:U1}),L("line",{className:"grid",x1:bt,x2:Mi-bt,y1:_y+s2/2,y2:_y+s2/2}),L("line",{className:"grid",x1:bt,x2:Mi-bt,y1:_y,y2:_y}),L("polyline",{className:"stat-line tasks",points:Y2(f,"executedTasks",i)}),L("polyline",{className:"stat-line retry",points:Y2(f,"retryAttempts",y)}),L("polyline",{className:"stat-line duration",points:Y2(f,"avgDurationMs",c)}),W?L("g",{className:"stat-cursor-layer","data-testid":"codex-stats-active-point"},L("line",{className:"stat-cursor",x1:W.x,x2:W.x,y1:_y,y2:U1}),L("circle",{className:`stat-point-active ${W.className}`,cx:W.x,cy:W.y,r:8})):null,L("g",{className:"stat-point-layer"},H)),W?L("div",{className:"codex-stats-tooltip active",style:Z,"data-testid":"codex-stats-tooltip"},L("b",null,an(W.row?.date)),L("span",null,`${W.label} · ${W.valueLabel}`),L("code",null,`${pu(W.row?.executedTasks)} exec / ${pu(W.row?.retryAttempts)} retry / ${ln(W.row?.avgDurationMs??void 0)}`)):null,!_?L("div",{className:"codex-stats-chart-empty","data-testid":"codex-stats-empty"},L("strong",null,j),L("span",null,U)):null,L("div",{className:"codex-stats-legend"},L("span",{className:"tasks"},"执行任务"),L("span",{className:"retry"},"重试次数"),L("span",{className:"duration"},"平均耗时")),L("div",{className:"codex-stats-scale"},L("span",null,an(f[0]?.date)),L("span",null,m.join(" · ")||"暂无峰值"),L("span",null,an(f.at(-1)?.date))),L("div",{className:`codex-stats-focus ${W?"active":""}`,"data-testid":"codex-stats-focus"},W?L(w1.default.Fragment,null,L("div",null,L("strong",null,an(W.row?.date)),L("span",null,`${W.label} · ${W.valueLabel}`)),L("div",{className:"codex-stats-focus-metrics"},L("code",null,`${pu(W.row?.executedTasks)} exec`),L("code",null,`${pu(W.row?.retryAttempts)} retry`),L("code",null,ln(W.row?.avgDurationMs??void 0)))):L("span",null,U))),L("div",{className:"codex-stats-summary-grid"},L("article",null,L("span",null,"今日执行"),L("strong",null,String(pu(t.executedTasks))),L("code",null,an(t.date))),L("article",null,L("span",null,"今日重试"),L("strong",null,String(pu(t.retryAttempts))),L("code",null,`累计 ${pu(n.retryAttempts)}`)),L("article",null,L("span",null,"平均耗时"),L("strong",null,ln(n.avgDurationMs??void 0)),L("code",null,`${pu(n.durationSamples)} samples`))),L("div",{className:"codex-stats-daily-list","data-testid":"codex-stats-daily-list"},f.length===0?L("div",{className:`codex-stats-daily-row empty ${F.state}`,"data-testid":"codex-stats-day-empty"},L("span",null,j),L("b",null,N),L("b",null,"--"),L("code",null,F.state==="empty"?"true empty":"diagnostic")):f.slice(-7).map((B)=>L("div",{key:String(B?.date||""),className:`codex-stats-daily-row ${O===String(B?.date||"")?"active":""}`,"data-testid":`codex-stats-day-${String(B?.date||"unknown")}`},L("span",null,an(B?.date)),L("b",null,`${pu(B?.executedTasks)} exec`),L("b",null,`${pu(B?.retryAttempts)} retry`),L("code",null,ln(B?.avgDurationMs??void 0))))))}function _O({task:l,queueRows:u,busy:r,onMove:f}){let n=String(l?.id||""),t=Fy(l),[i,y]=kl(t);df(()=>{y(t)},[n,t]);let c=!n||r||["running","judging","retry_wait"].includes(String(l?.status||""));return L("div",{className:"codex-task-move-control","data-testid":"codex-task-queue-move-control"},L("label",null,"任务 queue",L("select",{value:i,disabled:!n||r,onChange:(_)=>y(String(_.target.value||t)),"data-testid":"codex-task-queue-move-select"},u.map((_)=>L("option",{key:String(_?.id||""),value:String(_?.id||"")},j1(_))))),L("button",{type:"button",className:"ghost-btn",disabled:c||i===t,onClick:()=>f(i),title:c?"运行中 / judging / retry_wait 的任务不能移动;请先打断或等当前 turn 结束":"移动已创建任务到另一个 queue","data-testid":"codex-task-queue-move-button"},"移动"))}function pQ(l,u=4){let r=(Array.isArray(l)?l:[]).map((n)=>String(n||"").trim()).filter(Boolean);if(r.length===0)return"--";let f=r.slice(0,u).join(" / ");return r.length>u?`${f} +${r.length-u}`:f}function AO({task:l,loading:u,onLoadPromptPart:r,testId:f="codex-initial-prompt-full",textTestId:n="codex-initial-prompt-full-text",baseTextTestId:t="codex-initial-prompt-base"}){let i=k2(l),y=p3(l),c=K3(l).trimEnd(),_=String(y.full?.text||""),A=pz(l),F=Number(i.promptChars||l?.promptChars||_.length),j=Number(i.basePromptLines||si(c)),N=Number(i.promptLines||si(_));return L("section",{className:"codex-progressive-card codex-progressive-prompt","data-testid":"codex-progressive-prompt"},L("div",{className:"codex-progressive-card-head"},L("span",{className:"codex-output-channel"},"Prompt"),L("strong",null,"Submitted prompt / 原始用户 prompt"),L("code",null,`${j||si(c)} lines / ${c.length} chars`)),L("pre",{className:"codex-prompt-full","data-testid":t},c||"空 prompt"),A?L("details",{className:"codex-reference-injection codex-progressive-full-prompt","data-testid":f,onToggle:(U)=>{if(U.currentTarget?.open&&!_)r?.("full")}},L("summary",null,L("span",null,"引用注入已折叠,点击按需拉取最终进入 Code agent 的完整 prompt"),L("code",null,_?`${N||si(_)} lines / ${_.length} chars`:`${Number.isFinite(F)&&F>0?F:"--"} chars`)),L("pre",{className:"codex-prompt-full codex-prompt-final-full","data-testid":n},_||(u?"正在按需拉取完整 prompt...":"展开后将只请求 full prompt,不拉取完整 transcript。"))):null)}function dQ({task:l,attempt:u,attemptIndex:r,loading:f,onLoadSteps:n,onLoadStep:t,testId:i="codex-execution-summary"}){let y=Pz(sQ(l,r)),c=Cz(Gz(l,u)),_=u?Nz(l,u):I2(l),A=M2(l),F=E3(l,r),j=un(_?.errorCount),N=YQ(y.length>0?y.length:null,u?.stepCount,u?.execution?.stepCount,c.traceLineCount,c.stepCount,u?.outputCount),U=un(_?.stepCount??_?.llmStepCount),w=U??N,G=un(_?.readCount),J=un(_?.editCount),Q=un(_?.runCount),m=U??N,q=U!==null?"oa-event-flow":N!==null?"raw-trace":vt(l)?"syncing":"unavailable",W=w===null?q==="syncing"?"sync":"N/A":String(w),p=m===null?q==="syncing"?"sync":"N/A":`${m}${q==="raw-trace"?" raw":""}`,O=q==="oa-event-flow"?"STEP 来自 OA Event Flow 统计中心":q==="raw-trace"?"OA STEP 统计不可用,当前显示 raw trace fallback 行数":q==="syncing"?"STEP 统计同步中;展开后会按需读取当前 attempt trace":"当前 attempt 没有可用 STEP 统计",Z=Array.isArray(c.editedFiles)?c.editedFiles:[],V=Array.isArray(c.commands)?c.commands:[],H=o2(u,r)?` · ${String(u?.label||"recovered thread execution")}`:r?` #${r}`:"",B=Wz(l,u,r,c),C=`最近更新: ${J1(B)}`,E=Kz(l,u,r);return L("details",{className:`codex-progressive-card codex-execution-summary ${E?"running":""}`,"data-testid":i,"data-attempt-index":H3(r),"data-running":E?"true":"false",onToggle:(D)=>{if(D.currentTarget?.open&&!F)n?.(r)}},L("summary",null,L("div",{className:"codex-progressive-card-head"},L("span",{className:"codex-output-channel"},"Summary"),L("strong",null,`执行过程摘要${H}`),E?L("span",{className:"codex-summary-running-pill","data-testid":`${i}-running`},"执行中"):null,L("code",{title:`${B?`最近更新: ${Ll(B)}`:C};${O}`},`${ln(c.durationMs??c.totalElapsedMs)} / ${W} tools / ${C}`)),L("div",{className:"codex-execution-digest"},L("span",{title:"来自 OA Event Flow 统计中心"},`read ${G===null?"--":G}`),L("span",{title:"来自 OA Event Flow 统计中心"},`edit ${J===null?"--":J}`),L("span",{title:"来自 OA Event Flow 统计中心"},`run ${Q===null?"--":Q}`),L("span",{title:O,"data-testid":`${i}-step-count`,"data-step-state":q},`STEP ${p}`),j!==null&&j>0?L("span",{className:"codex-execution-error-pill","data-testid":`${i}-error-count`},`Error ${j}`):null)),L("div",{className:"codex-execution-digest expanded"},L("span",null,`修改文件:${pQ(Z,6)}`),L("span",null,`执行命令:${pQ(V,4)}`)),y.length===0?L("div",{className:"codex-output-empty"},f?"正在按需拉取步骤 summary...":"展开后将只请求执行步骤 summary,不拉取单步骤全量。"):L("div",{className:"codex-trace-step-list"},y.map((D)=>{let Y=String(D?.seq??""),v=A[Y],K=Array.isArray(D?.summaryLines)?D.summaryLines.slice(0,4):[],X=K.find((I)=>String(I||"").trim().length>0);return L("details",{key:Y||`${D?.title}-${D?.at}`,className:`codex-trace-step ${String(D?.kind||"message")} ${Zz(D)?"error":""}`,"data-testid":`codex-trace-step-${Y||"unknown"}`,onToggle:(I)=>{if(I.currentTarget?.open&&!v)t?.(D?.seq)}},L("summary",null,L("span",{className:"codex-output-channel"},FO(D?.kind)),L("strong",null,String(D?.title||"Trace step")),D?.status?L("code",null,String(D.status)):null,X?L("span",{className:"codex-trace-step-inline-summary",title:String(X)},String(X)):null,L("time",null,Ll(D?.at))),L("div",{className:"codex-trace-step-summary"},K.length>0?K.map((I,o)=>L("pre",{key:`${Y}-${o}`},String(I||""))):L("span",null,"无 summary")),v?.line?L(w3,{items:[v.line],autoScroll:!1,loading:!1,hasDetail:!0,emptyText:"无步骤详情",testId:`codex-trace-step-detail-${Y||"unknown"}`,className:"codex-transcript codex-step-detail-transcript",collapseTools:!1}):L("div",{className:"codex-output-empty"},f?"正在按需拉取这个步骤的全量数据...":"展开后将只请求这个单步骤的全量数据。"))})))}function FO(l){let u=String(l||"");if(u==="ran")return"Ran";if(u==="explored")return"Explored";if(u==="edited")return"Edited";if(u==="error")return"Error";if(u==="system")return"System";return"Message"}function eQ({task:l,attempt:u,attemptIndex:r,testId:f="codex-final-response"}){let n=Tz(l,u);if(n.length===0)return null;let t=Number(u?.finalResponseChars||n.length),i=r?` #${r}`:"";return L("section",{className:"codex-progressive-card codex-final-response","data-testid":f,"data-attempt-index":H3(r)},L("div",{className:"codex-progressive-card-head"},L("span",{className:"codex-output-channel"},"Final"),L("strong",null,`最终 response${i}`),L("code",null,`${Number.isFinite(t)?t:n.length} chars`)),L(c1,{markdown:n,className:"codex-transcript-body codex-markdown",testId:`${f}-markdown`}))}function lm({task:l,attempt:u,attemptIndex:r,testId:f="codex-progressive-judge"}){let n=hQ(l,u,r);if(!n?.decision)return null;let t=r?` #${r}`:"";return L("section",{className:"codex-progressive-card codex-progressive-judge","data-testid":f,"data-attempt-index":H3(r)},L("div",{className:"codex-progressive-card-head"},L("span",{className:"codex-output-channel"},"Judge"),L("strong",null,`完成判定${t}`),L("code",null,`${n.decision} ${Math.round(Number(n.confidence||0)*100)}%`)),L("div",{className:"codex-judge-card","data-testid":`${f}-card`},L(Ri,{status:n.decision},n.decision),L("strong",null,`${Math.round(Number(n.confidence||0)*100)}% confidence`),L("p",{"data-testid":`${f}-reason`},n.reason||"--"),L(CQ,{judge:n,testId:`${f}-failure-details`}),n.continuePrompt?L("pre",{"data-testid":`${f}-continue-prompt`},String(n.continuePrompt||"")):null))}function jO({task:l,attempt:u,attemptIndex:r,loading:f,onLoadPromptPart:n,testId:t="codex-judge-feedback-prompt"}){let i=Ez(l,u,r);if(i===null)return null;let y=MQ(r),_=p3(l)[y],A=String(_?.text||"").trimEnd(),F=String(i.preview||i.text||"").trimEnd(),j=A||String(i.text||"").trimEnd(),N=Number(_?.chars||i.chars||j.length||F.length),U=Number(_?.lines||i.lines||si(j||F)),w=_?.forAttempt||i.forAttempt||Number(r||0)+1;return L("details",{className:"codex-progressive-card codex-judge-feedback-prompt","data-testid":t,"data-attempt-index":H3(r),onToggle:(G)=>{if(G.currentTarget?.open&&!A)n?.("feedback",r)}},L("summary",null,L("div",{className:"codex-progressive-card-head"},L("span",{className:"codex-output-channel"},"Prompt"),L("strong",null,`judge feedback prompt #${r} -> #${w}`),L("code",null,`${U||"--"} lines / ${Number.isFinite(N)?N:F.length} chars`)),L("p",{className:"codex-feedback-preview","data-testid":`${t}-preview`},F||"展开后按需拉取 judge feedback prompt。")),L("pre",{className:"codex-prompt-full codex-feedback-full","data-testid":`${t}-text`},j||(f?"正在按需拉取 judge feedback prompt...":"展开后将只请求这一次 judge feedback prompt。")))}function NO({task:l,attempt:u,position:r,loading:f,onLoadPromptPart:n,onLoadSteps:t,onLoadStep:i}){let y=hz(u,r),c=a2(l,y),_=r===0&&!c,A=o2(u,y),F=A?String(u?.label||"Recovered thread execution"):`Attempt ${y}`;return L("section",{className:"codex-attempt-cycle","data-testid":`codex-attempt-cycle-${y}`},L("div",{className:"codex-attempt-cycle-head"},L("span",{className:"codex-output-channel"},F),L("strong",null,String(u?.mode||(y<=1?"initial":"retry"))),u?.terminalStatus?L(Ri,{status:u.terminalStatus},u.terminalStatus):null,L("code",null,`${Ll(u?.startedAt)} -> ${Ll(u?.finishedAt)}`)),L(dQ,{task:l,attempt:u,attemptIndex:y,loading:f,onLoadSteps:t,onLoadStep:i,testId:c?"codex-execution-summary-current":_?"codex-execution-summary":`codex-execution-summary-attempt-${y}`}),A?null:L(eQ,{task:l,attempt:u,attemptIndex:y,testId:c?"codex-final-response-current":_?"codex-final-response":`codex-final-response-attempt-${y}`}),A?null:L(lm,{task:l,attempt:u,attemptIndex:y,testId:c?"codex-progressive-judge-current":_?"codex-progressive-judge":`codex-progressive-judge-attempt-${y}`}),A?null:L(jO,{task:l,attempt:u,attemptIndex:y,loading:f,onLoadPromptPart:n,testId:c?"codex-judge-feedback-prompt-current":_?"codex-judge-feedback-prompt":`codex-judge-feedback-prompt-attempt-${y}`}))}function JO({task:l,loading:u,onLoadPromptPart:r,onLoadSteps:f,onLoadStep:n}){if(!l)return L(Ny,{title:"未选择任务",text:"从左侧队列选择任务,或提交新 Codex 任务。"});let t=Lz(l);return L("div",{className:"codex-transcript codex-progressive-trace","data-testid":"codex-output"},u&&!Jr(l)?L("div",{className:"codex-output-empty"},"正在加载 Trace Summary..."):null,L(AO,{task:l,loading:u,onLoadPromptPart:r}),t.length>0?t.map((i,y)=>L(NO,{key:`${i?.index||y+1}-${i?.startedAt||y}`,task:l,attempt:i,position:y,loading:u,onLoadPromptPart:r,onLoadSteps:f,onLoadStep:n})):[L(dQ,{key:"execution",task:l,loading:u,onLoadSteps:f,onLoadStep:n}),L(eQ,{key:"final",task:l}),L(lm,{key:"judge",task:l})])}function UO({task:l}){let u=cz(l);if(!l||u.length===0)return L(Ny,{title:"暂无原始消息",text:"原始 Codex app-server 消息会保留在任务 JSON 中。"});return L("details",{className:"codex-raw-output"},L("summary",null,`原始 messages (${u.length})`),L("div",null,u.map((r)=>L("article",{key:`${r.seq}-${r.channel}`,className:`codex-output-line ${r.channel||"system"}`},L("div",{className:"codex-output-meta"},L("span",{className:"codex-output-channel"},xz(String(r.channel||"system"))),L("span",null,Ll(r.at)),r.method?L("code",null,r.method):null),L("pre",null,String(r.text||""))))))}function QO({task:l}){let u=$z(l).slice().reverse();if(u.length===0)return L(Ny,{title:"尚无 attempt",text:"任务开始运行后,这里会记录 Codex 终态、传输中断和 stderr tail。"});return L("div",{className:"table-wrap codex-attempt-table"},L("table",null,L("thead",null,L("tr",null,L("th",null,"#"),L("th",null,"模式"),L("th",null,"终态"),L("th",null,"传输"),L("th",null,"退出"),L("th",null,"完成时间"))),L("tbody",null,u.map((r)=>L("tr",{key:`${r.index}-${r.startedAt}`},L("td",null,r.index),L("td",null,r.mode),L("td",null,L(Ri,{status:r.terminalStatus||"unknown"},r.terminalStatus||"unknown")),L("td",null,r.transportClosedBeforeTerminal?L(Ri,{status:"failed"},"closed-before-terminal"):L(Ri,{status:"succeeded"},"normal")),L("td",null,`code=${r.appServerExitCode??"--"} signal=${r.appServerSignal??"--"}`),L("td",null,Ll(r.finishedAt)))))))}function um({microservices:l,onRaw:u,apiBaseUrl:r="/api",initialTasksData:f=null,standalone:n=!1}){let t=l.find((z)=>z.id==="code-queue")||null,i=KQ(f),y=String(i?.id||""),c=new Map;if(i!==null&&y.length>0)c.set(y,{task:i,maxSeq:F1(Array.isArray(i.transcript)?i.transcript:[]),complete:Boolean(i._transcriptComplete),completeUpdatedAt:i._transcriptComplete?String(i.updatedAt||""):""});let _=typeof performance>"u"?0:performance.now(),A=xu(y),F=xu(0),j=xu(0),N=xu(0),U=xu(!1),w=xu(!1),G=xu(!1),J=xu(null),Q=xu(new Map),m=xu(new Map),q=xu(new Map),W=xu(new Map),p=xu(new Set),O=xu(null),Z=xu(null),V=xu(!1),P=xu(!1),H=xu(Boolean(f)),B=xu(new Map),C=xu(new Set),E=xu(c),D=xu(f),[Y,v]=kl(null),[K,X]=kl(f),[I,o]=kl(ol(f?.statistics)),[fl,yl]=kl(y),[h,s]=kl(i),[ul,tl]=kl(!1),[Al,Kl]=kl(""),[wl,El]=kl(null),[M,d]=kl(!1),[nl,k]=kl(!1),g=f?.queue||{},cl=String(g?.mainProviderId||g?.defaultProviderId||"D601").trim()||"D601",[pl,Hl]=kl(""),[bl,_u]=kl(""),[tu,Nu]=kl("default"),[gl,zr]=kl(dn),[nf,lr]=kl(!1),[tf,Or]=kl(""),[Nl,al]=kl(cl),[gu,hl]=kl("default"),[yr,Zr]=kl("gpt-5.5"),[cr,ku]=kl(N1(g,"default",cl)||"/workspace"),[Gf,Vn]=kl(99),[Rr,ay]=kl(1),[_t,At]=kl(!1),[e,Dl]=kl(!1),[Cl,lu]=kl(""),[mu,au]=kl(""),[yu,ur]=kl(""),[Sn,O8]=kl(!0),[oy,dy]=kl(()=>typeof window>"u"?!0:window.matchMedia(op).matches),[Tu,K$]=kl(!1),[Z8,ju]=kl(""),[mj,Su]=kl(""),{addNotification:mr}=Xr(),[A0,E$]=kl(""),[ey,p$]=kl(""),[lc,z$]=kl(!1),[O$,Ft]=kl(null),[F0,j0]=kl(!1),[xr,Wf]=kl(f?{phase:"complete",taskId:y,queueMs:0,detailMs:0,totalMs:_,chunks:i?1:0,transcriptRows:Array.isArray(i?.transcript)?i.transcript.length:0,partial:Boolean(f?.selected?.hasMore||A1(i)),completedAt:new Date}:null),[Z$,N0]=kl(f?new Date:null),[uc,rc]=kl(!1),$n=An(Cu(K)),H$=$n.filter(on),Ou=K?.queue||Y?.body?.queue||Y?.queue||{},H8=kp(Ou,Y),B8=I||gz(K,Ou),B$=Ln(K),hf=jQ(Ou,tu),Ui=String(tu||"default").trim()||"default",jt=hf.filter((z)=>String(z?.id||"")!==Ui),J0=Ay(hf,gl),Nt=Number((Cr(gl)?Ou?.total:J0?.total)??B$.total??$n.length),fc=$y(Ou),wj=Cr(gl)?fc:[String(Ay(hf,gl)?.activeTaskId||"")].filter(Boolean),Yn=NQ(Ou,hf,gl,$n),qj=Cr(gl)?B2(Ou):B2(J0||{}),D$=B2(Ou),V$=bz(D$),NW=Math.max(vz(D$),fc.length),JW=pu((Cr(gl)?Ou?.unreadTerminal:J0?.unreadTerminal)??H$.length),U0=K?H$.length:JW,S$=Cr(gl)?"All queues":h2(J0||{id:gl,name:gl}),Q0=C2(Al),yf=Q0.length>0,Lj=yf?An(Cu(wl)):[],D8=Ln(wl),_n=yf?Lj:$n,Gj=_n.filter(on),UW=_n.filter((z)=>!ef(z)).sort(vp),QW=_n.filter((z)=>ef(z)&&!on(z)),Wj=yf?D8:B$,m0=yf?Number(D8.total??Lj.length):Nt,Tj=Wj.hasMore===!0&&String(Wj.nextBeforeId||"").length>0,V8=yf?nl:uc,mW=t?Rp(t):{},wW=t?xp(t):{},S8=_Q(()=>_z(pl),[pl]),Xn=_Q(()=>{let z=QQ(Rr);return S8.flatMap((S)=>Array.from({length:z},()=>Az(S,bl)))},[S8,Rr,bl]),nc=Xn.length,Kj=nc>1&&!_t,qW=e||Tu||nc===0||Kj,Ej=uO(Ou,yr),Y$=rO(Ou,Nl),pj=fO(Ou,gu),zj=N1(Ou,gu,Nl),LW=Array.isArray(O$?.workdirs)?O$.workdirs:[],Oj=tO(Ou,LW,Nl,gu,cr),Y8=Oj.some((z)=>z.source==="saved"&&jy(z.path)===jy(cr)),X8=h?.id&&h?.activeTurnId&&String(h?.status)==="running",GW=h?.id&&!["succeeded","failed","canceled"].includes(String(h?.status||"")),WW=h?.id&&["succeeded","failed","canceled"].includes(String(h?.status||"")),w0=h?.id&&vQ(h);function Hr(z){let S=typeof z==="function"?z(D.current):z;D.current=S;let a=ol(S?.statistics);if(a)o(a);return X(S),S}async function Zj(z=gl){if(!t)return;try{let S=await uz(r,z),a=ol(S?.statistics)||ol(S?.stats)||ol(S);if(a)o(a);if(S?.queue)Hr((rl)=>rl?{...rl,queue:S.queue}:{ok:!0,queue:S.queue,tasks:[],pagination:{returned:0,total:0,hasMore:!1}})}catch(S){o(LQ(S))}}function TW(z,S,a=!0){let rl=Array.from(new Set(z.map((jl)=>String(jl||"")).filter(Boolean)));for(let jl of rl)if(B.current.set(jl,S),a)C.current.add(jl);return rl}function Hj(z){for(let S of z.map((a)=>String(a||"")).filter(Boolean))B.current.delete(S),C.current.delete(S)}function X$(z){let S=String(z?.id||""),a=S?B.current.get(S):void 0;if(!a)return z;if(String(z?.status||"").length>0&&!ef(z))return B.current.delete(S),C.current.delete(S),z;return{...z,readAt:z?.readAt||a,terminalUnread:!1}}function P8(z){let S=String(z?.id||"");return S.length>0&&C.current.has(S)&&ef(z)}function An(z,S=!0){let a=[];for(let rl of Array.isArray(z)?z:[]){let jl=X$(rl);if(S&&P8(jl))continue;a.push(jl)}return a}function KW(z,S=!0){if(!z||!Array.isArray(z?.tasks))return z;let a=An(Cu(z),S),rl=Ln(z);return{...z,tasks:a,pagination:z.pagination?{...rl,returned:a.length}:z.pagination}}function C8(z,S){return Cr(S)||Fy(z)===S}function h8(z){let S=Q0.toLowerCase();if(S.length===0)return!0;return[z?.id,z?.status,z?.queueId,z?.providerId,z?.model,z?.cwd,z?.displayPrompt,z?.basePrompt,z?.prompt,T3(z?.displayPromptPreview),T3(z?.basePromptPreview),T3(z?.promptPreview),z?.finalResponse,z?.lastError?.message].map((rl)=>String(rl||"").toLowerCase()).join(` -`).includes(S)}function EW(z,S){let a=z.filter((Zl)=>String(Zl?.id||"").length>0);if(a.length===0&&!S)return;let rl=a[0]||null,jl=String(rl?.id||""),Wl=a.filter((Zl)=>C8(Zl,gl)),Gl=Wl.filter(h8),sl=String(S?.activeTaskId||$y(S)[0]||jl||Yn||"");for(let Zl of a){let Yl=String(Zl?.id||"");if(!Yl)continue;let Rl=Array.isArray(Zl?.transcript)?Zl.transcript:[];E.current.set(Yl,{...E.current.get(Yl)||{},task:{...Zl,_summaryLoaded:!0,_detailLoaded:Rl.length>0,_transcriptComplete:!1,_transcriptPreview:!1},maxSeq:F1(Rl),complete:!1,completeUpdatedAt:""})}if(Hr((Zl)=>{if(!Zl&&(Wl.length===0||!S))return Zl;let Yl=Cu(Zl),Rl=An(Gn([Yl,Wl],sl));return{...Zl||{},queue:S||Zl?.queue,tasks:Rl,pagination:Zl?.pagination?{...Ln(Zl),returned:Rl.length}:Zl?.pagination}}),yf)El((Zl)=>{if(!Zl||Gl.length===0)return Zl;let Yl=An(Gn([Cu(Zl),Gl],sl));return{...Zl,queue:S||Zl.queue,tasks:Yl,pagination:Zl.pagination?{...Ln(Zl),returned:Yl.length}:Zl.pagination}});if(rl&&C8(rl,gl)&&h8(rl))N.current+=1,A.current=jl,yl(jl),s(E.current.get(jl)?.task||rl),tl(!1),Wf({phase:"complete",taskId:jl,queueMs:0,detailMs:0,totalMs:0,chunks:1,transcriptRows:Array.isArray(rl?.transcript)?rl.transcript.length:0,partial:!0,completedAt:new Date});N0(new Date)}function pW(z){let S=String(z||Ou?.mainProviderId||"D601").trim()||"D601";al(S),ku(N1(Ou,gu,S)),Ft(null),x8().catch((a)=>ju(Hu(a,"加载工作目录失败")))}function zW(z){let S=String(z||"default").trim()||"default",a=Nl;if(S==="windows-native"){if(!Y$.find((jl)=>jl.id===Nl)?.supportsWindowsNativeCodex)a=String(Y$.find((jl)=>jl.supportsWindowsNativeCodex)?.id||Nl||"D601"),al(a)}hl(S),ku(N1(Ou,S,a)),Ft(null),x8().catch((rl)=>ju(Hu(rl,"加载工作目录失败")))}function P$(z,S,a=null,rl=null){let jl=new Set(TW(z,S));if(jl.size===0&&rl===null&&a===null)return;Hr((Wl)=>{if(!Wl)return Wl;let Gl=Cu(Wl).flatMap((sl)=>{let Zl=String(sl?.id||"");if(!jl.has(Zl)){let Au=X$(sl);return P8(Au)?[]:[Au]}let Yl=rl&&String(rl?.id||"")===Zl?rl:{},Rl={...sl,...Yl,readAt:S,terminalUnread:!1};return P8(Rl)?[]:[Rl]});return{...Wl,queue:a||Wl.queue,tasks:jl.size>0?Gn([Gl],Yn):Gl}});for(let Wl of jl){let Gl=E.current.get(Wl);if(Gl?.task){let sl=rl&&String(rl?.id||"")===Wl?rl:{},Zl={...Gl.task,...sl,readAt:S,terminalUnread:!1};if(E.current.set(Wl,{...Gl,task:Zl}),A.current===Wl)s(Zl)}}}df(()=>{At(!1)},[pl,Rr,bl]),df(()=>{let z=C2(Al);j.current+=1;let S=j.current;if(!t||z.length===0){El(null),d(!1),k(!1),G.current=!1;return}d(!0),El(null);let a=window.setTimeout(()=>{(async()=>{try{let rl=await JQ(r,gl,z);if(S!==j.current)return;El(KW(rl))}catch(rl){if(S===j.current)El(null),ju(Hu(rl,"搜索 Codex tasks 失败"))}finally{if(S===j.current)d(!1)}})()},240);return()=>window.clearTimeout(a)},[t?.id,r,gl,Al]),df(()=>{au(h?K3(h):""),ur(Array.isArray(h?.referenceTaskIds)?h.referenceTaskIds.join(" "):"")},[fl]);function Mf(z,S,a){let rl=E.current.get(z)||{},jl=rl.task||{},Wl=Array.isArray(jl.transcript)?jl.transcript:[],Gl=TQ(jl,S),sl=Object.prototype.hasOwnProperty.call(S,"transcript")?X2(Wl,Array.isArray(S.transcript)?S.transcript:[]):Wl,Zl={...jl,...Gl,transcript:sl,output:Array.isArray(Gl.output)?R2(jl,Gl,"output"):Array.isArray(jl.output)?jl.output:[],events:Array.isArray(Gl.events)?R2(jl,Gl,"events"):Array.isArray(jl.events)?jl.events:[]},Yl=X$(Zl),Rl=String(Yl?.updatedAt||""),Au=Boolean(S._transcriptComplete)&&ef(Yl),rr=Boolean(rl.complete)&&ef(Yl)&&String(rl.completeUpdatedAt||"")===Rl,fu=Au||rr,$r={...rl,task:Yl,maxSeq:F1(sl),complete:fu,completeUpdatedAt:fu?Rl:""};if(E.current.set(z,$r),a===N.current&&A.current===z)s(Yl);return $r}async function Jt(z,S=!1,a,rl){if(!t||!z)return;let Wl=E.current.get(z)?.task;if(!S&&G3(Wl))return;let Gl=z,sl=Q.current.get(Gl);if(sl){if(S||!G3(Wl))sl.refreshAfter=!0;return sl.promise}let Zl=N.current,Yl=performance.now();if(A.current===z)tl(!0);let Rl={promise:Promise.resolve(),refreshAfter:!1},Au=(async()=>{try{let rr=await rz(r,z);if(Zl!==N.current||A.current!==z)return;let fu=rr?.summary||{},$r=String(fu.updatedAt||"");Mf(z,{id:z,status:fu.status,updatedAt:$r,startedAt:fu.startedAt,finishedAt:fu.finishedAt,currentAttempt:fu.currentAttempt,maxAttempts:fu.maxAttempts,finalResponse:fu.finalResponse,lastJudge:fu.lastJudge,lastError:fu.lastError,attempts:Array.isArray(fu.attempts)?fu.attempts:[],stepCount:fu.stepCount,llmStepCount:fu.llmStepCount,traceStats:fu.traceStats,statsSource:fu.statsSource,timing:fu.timing,_traceSummary:fu,_traceSummaryLoaded:!0,_traceSummaryUpdatedAt:$r,_detailLoaded:!0},Zl),Wf({phase:"complete",taskId:z,queueMs:rl??0,detailMs:performance.now()-Yl,totalMs:a===void 0?performance.now()-Yl:performance.now()-a,chunks:1,transcriptRows:Number(fu?.execution?.traceLineCount||fu?.execution?.stepCount||0),partial:!1,completedAt:new Date})}finally{let rr=Boolean(Rl.refreshAfter&&A.current===z&&!G3(E.current.get(z)?.task));if(Q.current.delete(Gl),Zl===N.current&&A.current===z)tl(!1);if(rr)window.setTimeout(()=>{Jt(z,!0).catch((fu)=>ju(Hu(fu,"自动刷新 Trace Summary 失败")))},0)}})();Rl.promise=Au,Q.current.set(Gl,Rl),await Au}async function OW(z,S=null){let a=A.current;if(!t||!a||!z)return;let rl=E.current.get(a)?.task,jl=p3(rl),Wl=z==="feedback"||z==="judge-feedback"?MQ(S):z;if(jl[Wl]?.text)return;let Gl=`${a}:${Wl}`,sl=m.current.get(Gl);if(sl)return sl;let Zl=N.current;if(A.current===a)tl(!0);let Yl=(async()=>{try{let Rl=await fz(r,a,z,S);if(Zl!==N.current||A.current!==a)return;let Au=E.current.get(a)?.task,rr=p3(Au);Mf(a,{...z==="full"?{prompt:String(Rl?.text||""),promptChars:Number(Rl?.chars||0)}:{},_promptDetails:{...rr,[Wl]:Rl}},Zl)}finally{if(m.current.delete(Gl),Zl===N.current&&A.current===a)tl(!1)}})();m.current.set(Gl,Yl),await Yl}async function C$(z=null,S={}){let a=A.current;if(!t||!a)return;let rl=E.current.get(a)?.task,jl=z===null||z===void 0||String(z).length===0?"":String(z),Wl=E3(rl,jl||null),Gl=Boolean(S.force),sl=Boolean(S.incremental);if(Wl&&!Gl)return;let Zl=sQ(rl,jl||null),Yl=sl&&Zl.length>0?zz(Zl):0,Rl=`${a}:${jl||"all"}:${Yl}`,Au=q.current.get(Rl);if(Au)return Au;let rr=N.current;if(A.current===a)tl(!0);let fu=(async()=>{try{let $r=await nz(r,a,Yl,500,jl||null);if(rr!==N.current||A.current!==a)return;let Fn=Array.isArray($r?.steps)?$r.steps:[],Pn=Yl>0?Oz(Zl,Fn):Fn;if(jl){let Ut=E.current.get(a)?.task,q0=ol(Ut?._traceStepsByAttempt)||{},sf=ol(Ut?._traceStepsLoadedByAttempt)||{},Tf=ol(Ut?._traceStepsNextAfterSeqByAttempt)||{};Mf(a,{_traceStepsByAttempt:{...q0,[jl]:Pn},_traceStepsLoadedByAttempt:{...sf,[jl]:!0},_traceStepsNextAfterSeqByAttempt:{...Tf,[jl]:$r?.nextAfterSeq}},rr)}else Mf(a,{_traceSteps:Pn,_traceStepsLoaded:!0,_traceStepsHasMore:Boolean($r?.hasMore),_traceStepsNextAfterSeq:$r?.nextAfterSeq},rr)}finally{if(q.current.delete(Rl),rr===N.current&&A.current===a)tl(!1)}})();q.current.set(Rl,fu),await fu}async function ZW(z){let S=A.current,a=String(z??"");if(!t||!S||a.length===0)return;let rl=E.current.get(S)?.task;if(M2(rl)[a]?.line)return;let Wl=`${S}:${a}`,Gl=W.current.get(Wl);if(Gl)return Gl;let sl=N.current;if(A.current===S)tl(!0);let Zl=(async()=>{try{let Yl=await tz(r,S,z);if(sl!==N.current||A.current!==S)return;let Rl=E.current.get(S)?.task,Au=M2(Rl);Mf(S,{_traceStepDetails:{...Au,[a]:Yl}},sl)}finally{if(W.current.delete(Wl),sl===N.current&&A.current===S)tl(!1)}})();W.current.set(Wl,Zl),await Zl}function HW(z){if(A.current!==z)return;let S=E.current.get(z)?.task;if(!S)return;if(E3(S,null))C$(null,{force:!0,incremental:!0}).catch((rl)=>ju(Hu(rl,"增量刷新 Trace Steps 失败")));let a=ol(S?._traceStepsLoadedByAttempt)||{};for(let rl of Object.keys(a).filter((jl)=>a[jl]))C$(rl,{force:!0,incremental:!0}).catch((jl)=>ju(Hu(jl,"增量刷新 Attempt Trace Steps 失败")))}async function TC(z,S,a){if(!t||!z)return;let rl=performance.now(),jl=N.current,Wl=E.current.get(z);if(Wl?.task){if(s(Wl.task),tl(A1(Wl.task)||!Wl.complete),!A1(Wl.task)&&Wl.complete&&ef(Wl.task)&&String(Wl.completeUpdatedAt||"")===String(Wl.task?.updatedAt||"")){Wf({phase:"complete",taskId:z,queueMs:a??0,detailMs:0,totalMs:S===void 0?0:performance.now()-S,chunks:0,transcriptRows:Array.isArray(Wl.task.transcript)?Wl.task.transcript.length:0,completedAt:new Date});return}}else tl(!0);let Gl=J.current;if(Gl?.taskId===z&&Gl.token===jl)return Gl.promise;let sl=(async()=>{try{let Zl=await Bu(Du(r,`/api/tasks/${encodeURIComponent(z)}?meta=1`));if(jl!==N.current||A.current!==z)return;let Yl=E.current.get(z),Rl=Array.isArray(Yl?.task?.transcript)?Yl.task.transcript:[],Au=Zl?.task||{},rr=Boolean(Yl?.complete)&&String(Yl?.completeUpdatedAt||"")===String(Au?.updatedAt||"");Mf(z,{...Au,summaryOnly:!1,_metaLoaded:!0,transcript:Rl,_detailLoaded:Rl.length>0,_transcriptComplete:rr},jl);let fu=A1(Yl?.task)||Boolean(Yl?.task?._transcriptPreview),$r=fu?0:Rl.length>0?EQ(Rl):0,Fn=!fu&&Yl?.complete&&ef(Au)&&String(Yl?.completeUpdatedAt||"")===String(Au?.updatedAt||"")?F1(Rl):$r,Pn=!0,Ut=0,q0=Rl.length;while(Pn){let sf=await Bu(Du(r,`/api/tasks/${encodeURIComponent(z)}/transcript?afterSeq=${encodeURIComponent(String(Fn))}&limit=${hp}&fullText=1`));if(jl!==N.current||A.current!==z)return;let Tf=E.current.get(z),L0=Array.isArray(Tf?.task?.transcript)?Tf.task.transcript:[],Qi=X2(L0,Array.isArray(sf?.transcript)?sf.transcript:[]);Ut+=1,q0=Qi.length;let Mu=Boolean(!sf?.hasMore);if(Mf(z,{status:sf?.status||Au.status,updatedAt:sf?.updatedAt||Au.updatedAt,transcript:Qi,_detailLoaded:Mu||Qi.length>0,_transcriptComplete:Mu,_transcriptPreview:fu&&!Mu},jl),Pn=Boolean(sf?.hasMore),Fn=Number(sf?.nextAfterSeq??F1(Qi)),!Pn)break;await new Promise((hj)=>window.setTimeout(hj,0))}Wf({phase:"complete",taskId:z,queueMs:a??0,detailMs:performance.now()-rl,totalMs:S===void 0?performance.now()-rl:performance.now()-S,chunks:Ut,transcriptRows:q0,completedAt:new Date})}finally{if(J.current?.taskId===z&&J.current?.token===jl)J.current=null;if(jl===N.current&&A.current===z)tl(!1)}})();J.current={taskId:z,token:jl,promise:sl},await sl}async function cf(z=A.current,S=!0,a=gl){if(!t)return;if(!S&&P.current)return;let rl=performance.now();if(S)P.current=!0;if(S)Wf({phase:"loading",taskId:String(z||A.current||""),startedAt:new Date});let jl=F.current+1;F.current=jl;let Wl=String(z||A.current||""),Gl=Wl?E.current.get(Wl):null,sl=Array.isArray(Gl?.task?.transcript)?Gl.task.transcript:[],Zl=EQ(sl),Yl=null,Rl=S&&Wl.length===0;if(Yl=Rl?await JQ(r,a,""):await H2(r,Wl,Zl,a,"",!0,{stats:!1}),jl!==F.current){if(S)P.current=!1;return}let Au=performance.now()-rl;v(Y||{});let rr=Yl?.queue||{},fu=String(rr?.activeTaskId||$y(rr)[0]||""),$r=Yl;Hr((su)=>{let Qt=Cu(Yl),$f=Cu(su),Kf=$f.length>0?Gn([$f,Qt],fu):Gn([Qt],fu),mt=An(Kf),h$=Ln(Yl),mi=Ln(su),v8=$f.length>Qt.length&&(mi.hasMore===!1||String(mi.nextBeforeId||"").length>0),yT={...h$,...v8?{hasMore:mi.hasMore,nextBeforeId:mi.nextBeforeId}:{},returned:mt.length};return $r={...Yl,tasks:mt,pagination:yT},$r});let Fn=Cu($r),Pn=jQ(rr,tu),Ut=NQ(rr,Pn,a,Fn),q0=lz(Pn,a,Fn),sf=Wl||A.current,Tf=$r?.selected||null,L0=Tf?.task||null,Qi=Array.isArray(Tf?.transcript)?Tf.transcript:null,Mu=sf||Ut||q0||Fn[0]?.id||"";if(A.current!==Mu)N.current+=1;A.current=Mu,yl(Mu);let G0=Fn.find((su)=>su.id===Mu);if(G0){let su=E.current.get(Mu);if(su?.task)E.current.set(Mu,{...su,task:{...G0,...su.task,status:G0.status,updatedAt:G0.updatedAt}})}if(Rl&&G0){if(Mf(Mu,{...G0,_summaryLoaded:!1,transcript:[],_detailLoaded:!1,_transcriptComplete:!1,_transcriptPreview:!0},N.current),tl(!0),Wf({phase:"complete",taskId:Mu,queueMs:Au,detailMs:0,totalMs:performance.now()-rl,chunks:0,transcriptRows:0,partial:!0,completedAt:new Date}),N0(new Date),S)P.current=!1;Jt(Mu,!0).catch((su)=>ju(Hu(su,"加载 Codex Trace Summary 失败"))),H2(r,Mu,0,a,"",!1).then((su)=>{if(jl!==F.current)return;let Qt=Cu(su),$f=KQ(su);if(Qt.length>0)Hr((Kf)=>{let mt=Gn([Cu(Kf),Qt],fu);return{...Kf,statistics:su?.statistics||Kf?.statistics,tasks:An(mt)}});if($f?.id===A.current){let Kf=Array.isArray($f.transcript)?$f.transcript:[];Mf($f.id,{...$f,transcript:Kf,_summaryLoaded:!0,_detailLoaded:Kf.length>0,_transcriptPreview:Boolean(su?.selected?.preview)},N.current)}}).catch(()=>{});return}if(L0?.id===Mu&&Qi!==null){let su=E.current.get(Mu),Qt=Array.isArray(su?.task?.transcript)?su.task.transcript:[],$f=X2(Qt,Qi),Kf=Boolean(Tf?.preview);if(Mf(Mu,{...L0,_summaryLoaded:!0,transcript:$f,_detailLoaded:!Tf?.hasMore||$f.length>0,_transcriptComplete:!Kf&&!Tf?.hasMore&&ef(L0),_transcriptPreview:Kf},N.current),tl(!1),S)Wf({phase:"complete",taskId:Mu,queueMs:Au,detailMs:Math.max(0,performance.now()-rl-Au),totalMs:performance.now()-rl,chunks:1,transcriptRows:$f.length,partial:Boolean(Kf||Tf?.hasMore||A1(L0)),completedAt:new Date});if(N0(new Date),S)P.current=!1;Jt(Mu,!1,S?rl:void 0,S?Au:void 0).catch((mt)=>ju(Hu(mt,"加载 Codex Trace Summary 失败"))),H2(r,Wl,Zl,a,"",!1).then((mt)=>{if(jl!==F.current)return;let h$=Cu(mt);if(h$.length>0)Hr((mi)=>{let v8=Gn([Cu(mi),h$],fu);return{...mi,tasks:An(v8)}})}).catch(()=>{});return}if(S)Wf({phase:"session",taskId:Mu,queueMs:Au,totalMs:Au,startedAt:new Date(Date.now()-Au)});if(Mu)Jt(Mu,!0,S?rl:void 0,S?Au:void 0).catch((su)=>ju(Hu(su,"加载 Codex Trace Summary 失败")));else if(N.current+=1,s(null),tl(!1),S)Wf({phase:"complete",taskId:"",queueMs:Au,detailMs:0,totalMs:performance.now()-rl,chunks:0,transcriptRows:0,completedAt:new Date});if(N0(new Date),S)P.current=!1;Zj(a).catch((su)=>o(LQ(su)))}async function Bj(){if(yf){if(!t||nl||G.current)return;let S=String(D8.nextBeforeId||"");if(!S)return;G.current=!0,k(!0),ju("");try{let a=await UQ(r,gl,S,OQ,Q0),rl=Cu(a),jl=a?.queue||Ou||{},Wl=String(jl?.activeTaskId||$y(jl)[0]||Yn||"");El((Gl)=>{let sl=An(Gn([Cu(Gl),rl],Wl)),Zl=Ln(a);return{...Gl||{},queue:jl,tasks:sl,pagination:{...Zl,returned:sl.length}}})}catch(a){ju(Hu(a,"加载更多搜索结果失败"))}finally{G.current=!1,k(!1)}return}if(!t||uc||w.current)return;let z=String(Ln(K).nextBeforeId||"");if(!z)return;w.current=!0,rc(!0),ju("");try{let S=await UQ(r,gl,z),a=Cu(S),rl=S?.queue||Ou||{},jl=String(rl?.activeTaskId||$y(rl)[0]||Yn||"");Hr((Wl)=>{let Gl=An(Gn([Cu(Wl),a],jl)),sl=Ln(S);return{...Wl||{},queue:rl,statistics:S?.statistics||Wl?.statistics,tasks:Gl,pagination:{...sl,returned:Gl.length}}})}catch(S){ju(Hu(S,"加载更早 Codex tasks 失败"))}finally{w.current=!1,rc(!1)}}function BW(z){let S=z.currentTarget;if(!S||V8||!Tj)return;if(S.scrollHeight-S.scrollTop-S.clientHeight<120)Bj()}async function Br(z,S){K$(!0),ju("");try{await z()}catch(a){ju(Hu(a,S))}finally{K$(!1)}}async function M8(z){if(!z)return;try{let S=!1;try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(z),S=!0}catch{S=!1}if(!S){let rl=document.createElement("textarea");rl.value=z,rl.style.position="fixed",rl.style.opacity="0",document.body.appendChild(rl),rl.select(),S=document.execCommand("copy"),document.body.removeChild(rl)}if(!S)throw Error("browser clipboard rejected the copy request");E$(z);let a=`已复制任务 ID:${z}`;Su(a),mr("success",a),window.setTimeout(()=>E$((rl)=>rl===z?"":rl),1600)}catch(S){ju(`复制任务 ID 失败:${Hu(S)}`)}}function s8(z){if(!z)return;_u(z);let S=`已引用任务 ID:${z};提交时后端会读取并注入该任务上下文`;Su(S),mr("success",S)}async function R8(z){if(!t||!z)return;let S=new Date().toISOString();F.current+=1,P$([z],S,null,{id:z,readAt:S,terminalUnread:!1}),p$(z);let a=!1;if(await Br(async()=>{let rl=await iz(r,z),jl=rl?.task||{id:z,readAt:new Date().toISOString(),terminalUnread:!1},Wl=String(jl?.readAt||new Date().toISOString());P$([z],Wl,rl?.queue||null,jl),a=!0;let Gl=`已将任务 ${z} 标为已读`;Su(Gl),mr("success",Gl)},"标记 Codex task 已读失败"),!a)Hj([z]),cf(A.current,!1).catch((rl)=>ju(Hu(rl,"刷新 Codex tasks 失败")));p$((rl)=>rl===z?"":rl)}async function DW(){if(!t||lc)return;z$(!0);let z=new Date().toISOString(),S=Array.from(new Set([...Cu(D.current).filter(on).map((rl)=>String(rl?.id||"")).filter(Boolean),...Array.from(E.current.entries()).filter(([,rl])=>on(rl?.task)).map(([rl])=>rl)]));if(F.current+=1,S.length>0)P$(S,z);let a=!1;if(await Br(async()=>{let rl=await yz(r),jl=String(rl?.readAt||new Date().toISOString()),Wl=Cu(D.current).filter(on).map((Rl)=>String(Rl?.id||"")).filter(Boolean),Gl=Array.from(E.current.entries()).filter(([,Rl])=>on(Rl?.task)).map(([Rl])=>Rl),sl=Array.from(new Set([...S,...Wl,...Gl]));P$(sl,jl,rl?.queue||null);let Zl=Number(rl?.count||sl.length);a=!0;let Yl=`已将 ${Zl} 个已结束未读任务标为已读`;Su(Yl),mr("success",Yl)},"全部标为已读失败"),!a&&S.length>0)Hj(S),cf(A.current,!1).catch((rl)=>ju(Hu(rl,"刷新 Codex tasks 失败")));z$(!1)}function VW(z){let S=z||dn;if(zr(S),!Cr(S))Nu(S);if(Hr(null),!(Cr(S)?A.current:""))A.current="",N.current+=1,yl(""),s(null),tl(!0)}async function x8(){if(!t)return;let z=await Bu(Du(r,"/api/workdirs"));Ft(z)}async function SW(){let z=cr.trim()||zj||"/workspace",S=typeof window>"u"?z:window.prompt("输入新的工作目录绝对路径",z),a=String(S||"").trim();if(!a)return;j0(!0),await Br(async()=>{let rl=await Bu(Du(r,"/api/workdirs"),{method:"POST",body:{providerId:Nl,executionMode:gu,path:a,ensure:!0}});Ft((Wl)=>({...Wl||{},...rl})),ku(String(rl?.workdir?.path||a));let jl=`已保存工作目录:${String(rl?.workdir?.path||a)}`;Su(jl),mr("success",jl)},"创建工作目录失败"),j0(!1)}async function YW(){let z=jy(cr);if(!Y8){Su("当前工作目录还没有保存到下拉菜单。");return}if(!(typeof window>"u"?!0:window.confirm(`从下拉菜单删除工作目录选项? +本次任务:`,f=u.indexOf(r);if(f===-1)return l;return u.slice(f+r.length).trimStart()}function si(l){return l.length>0?l.split(/\r\n|\r|\n/u).length:0}function T3(l){if(typeof l==="string")return l;if(l&&typeof l==="object"&&!Array.isArray(l)&&typeof l.text==="string")return l.text;return""}function VQ(l,u={}){if(u.preview===!0){let n=T3(l?.displayPromptPreview||l?.basePromptPreview||l?.promptPreview);if(n.length>0)return n}let r=String(l?.displayPrompt||"");if(r.length>0)return r;let f=String(l?.prompt||"");return jz(Fz(f).userPrompt)}function Jr(l){return l?._traceSummary&&typeof l._traceSummary==="object"&&!Array.isArray(l._traceSummary)?l._traceSummary:null}function p3(l){return l?._promptDetails&&typeof l._promptDetails==="object"&&!Array.isArray(l._promptDetails)?l._promptDetails:{}}function I2(l){let u=Jr(l)?.prompt;return u&&typeof u==="object"&&!Array.isArray(u)?u:{}}function SQ(l){let u=Jr(l)?.execution;return u&&typeof u==="object"&&!Array.isArray(u)?u:{}}function wQ(l){let u=Number(l);return Number.isFinite(u)&&u>=0?Math.floor(u):0}function un(l){let u=Number(l);return Number.isFinite(u)&&u>=0?Math.floor(u):null}function a2(l){let u=ol(l?.traceStats);if(u&&(l?.statsSource==="oa-event-flow"||u.source==="oa-event-flow"))return u;let r=Jr(l),f=ol(r?.traceStats);if(f&&(r?.statsSource==="oa-event-flow"||f.source==="oa-event-flow"))return f;return null}function Nz(l,u){let r=ol(u?.traceStats)||ol(u?.execution?.traceStats),f=String(u?.statsSource||u?.execution?.statsSource||"");if(r&&(f==="oa-event-flow"||r.source==="oa-event-flow"))return r;return null}function Jz(l,u){return un(a2(l)?.[u])}function Uz(l){let u=Jz(l,"stepCount");if(u!==null)return u;let r=Jr(l);if(r!==null)return wz(r);return null}function YQ(...l){for(let u of l){let r=un(u);if(r!==null)return r}return null}function Qz(l){if(l.state==="ready"||l.state==="fallback")return`STEP ${l.count}${l.state==="fallback"?" raw":""}`;if(l.state==="syncing")return"STEP sync";if(l.state==="failed")return"STEP failed";return"STEP N/A"}function mz(l){let u=a2(l),r=un(u?.stepCount??u?.llmStepCount);if(r!==null)return{state:"ready",count:r,label:`STEP ${r}`,title:"STEP 来自 OA Event Flow 统计中心",source:"oa-event-flow"};let f=Jr(l),n=vt(l)&&l?._traceSummaryLoaded!==!0&&un(l?.outputCount??l?.retainedOutputCount)===0,t=YQ(f?.retainedStepCount,f?.execution?.traceLineCount,f?.execution?.stepCount,l?.outputCount,l?.retainedOutputCount,n?null:l?.stepCount,n?null:l?.llmStepCount);if(t!==null)return{state:"fallback",count:t,label:`STEP ${t} raw`,title:"OA STEP 统计不可用,当前显示 raw trace fallback 行数",source:"raw-trace"};if(f?.traceStatsError||l?.traceStatsError)return{state:"failed",count:null,label:"STEP failed",title:"STEP 统计读取失败;请查看 trace summary 原始 JSON",source:"stats-error"};if(vt(l)||l?._traceSummaryLoaded!==!0)return{state:"syncing",count:null,label:"STEP sync",title:"STEP 统计同步中;Trace Summary 或 OA 统计尚未返回",source:"syncing"};return{state:"unavailable",count:null,label:"STEP N/A",title:"当前任务没有可用 STEP 统计或 raw trace fallback",source:"unavailable"}}function wz(l){let u=ol(l?.traceStats);if(!u||l?.statsSource!=="oa-event-flow"&&u.source!=="oa-event-flow")return null;return un(u.stepCount)}function G3(l){if(!l||l?._traceSummaryLoaded!==!0)return!1;let u=Jr(l),r=String(l?._traceSummaryUpdatedAt||u?.updatedAt||""),f=String(l?.updatedAt||"");if(f.length>0){let n=en(r),t=en(f);if(n!==null&&t!==null){if(n+10)return r;let f=String(l?.basePrompt||"");return f.length>0?f:VQ(l)}function XQ(l){let u=Jr(l);return String(u?.finalResponse||l?.finalResponse||"").trimEnd()}function PQ(l){let r=Jr(l)?.lastJudge||l?.lastJudge;return r&&typeof r==="object"&&!Array.isArray(r)?r:null}function ol(l){return l&&typeof l==="object"&&!Array.isArray(l)?l:null}function qz(l){let u=ol(l?.raw),r=ol(l?.failureDetails)||ol(u?.minimaxFailure);if(r===null)return"";let f=r.repairAttempt===void 0?"":`${r.repairAttempt}/${r.maxRepairAttempts??"?"}`;return[["provider",r.provider||"minimax"],["stage",r.stage],["model",r.model],["timedOut",r.timedOut],["durationMs",r.durationMs],["timeoutMs",r.timeoutMs],["promptChars",r.promptChars],["promptLines",r.promptLines],["payloadBytes",r.payloadBytes],["responseStatus",r.responseStatus],["repairAttempt",f],["errorName",r.errorName],["error",r.errorMessage],["responseContentPreview",r.responseContentPreview],["responseTextPreview",r.responseTextPreview]].filter(([,t])=>t!==void 0&&t!==null&&String(t).length>0).map(([t,i])=>`${t}: ${String(i)}`).join(` +`)}function CQ({judge:l,testId:u="codex-judge-failure-details"}){let r=qz(l);if(r.length===0)return null;return L("details",{className:"codex-judge-failure-details","data-testid":u},L("summary",null,"MiniMax failure details"),L("pre",null,r))}function Lz(l){let u=Jr(l)?.attempts;if(Array.isArray(u)&&u.length>0)return S2(l,V2(l,u));let r=SQ(l),f=XQ(l),n=PQ(l);if(Object.keys(r).length===0&&f.length===0&&n===null)return S2(l,V2(l,[]));return S2(l,V2(l,[{index:Number(l?.currentAttempt||1),mode:l?.currentMode||"initial",startedAt:l?.startedAt,finishedAt:l?.finishedAt,terminalStatus:l?.status,execution:r,finalResponse:f,finalResponseChars:f.length,judge:n}]))}function z3(l,u){let r=Jr(l),f=Number(r?.currentAttempt||l?.currentAttempt||0),n=Number(u);return Number.isFinite(f)&&f>0&&Number.isFinite(n)&&n===f}function o2(l,u){return vt(l)&&z3(l,u)}function V2(l,u){let r=Array.isArray(u)?u.filter(Boolean):[],f=Jr(l),n=Number(f?.currentAttempt||l?.currentAttempt||0);if(!vt(l)||!Number.isFinite(n)||n<=0)return r;if(r.some((i)=>Number(i?.index)===n))return r;let t=b2(l?.startedAt,f?.startedAt,l?.updatedAt,f?.updatedAt);return[...r,{index:n,mode:l?.currentMode||f?.currentMode||(n<=1?"initial":"retry"),startedAt:t||l?.startedAt||f?.startedAt,finishedAt:null,terminalStatus:null,execution:{},finalResponse:"",finalResponsePreview:"",finalResponseChars:0,judge:null,currentPlaceholder:!0}]}function S2(l,u){let r=[...Array.isArray(u)?u:[]];if(!vt(l))return r;return r.sort((f,n)=>{let t=Number(f?.index),i=Number(n?.index),y=z3(l,t)?0:1,c=z3(l,i)?0:1;if(y!==c)return y-c;return t-i})}function Gz(l,u){return ol(u?.execution)||SQ(l)}function Wz(l,u,r,f){let n=Jr(l),t=Number(n?.currentAttempt||l?.currentAttempt||0),i=Number(r),y=Number.isFinite(i)&&i>0&&i===t,c=b2(l?.updatedAt,n?.updatedAt);if(y&&!u?.finishedAt&&c.length>0)return c;return String(u?.updatedAt||u?.finishedAt||f.effectiveEndAt||(y?c:"")||c||l?.finishedAt||l?.startedAt||"")}function Tz(l,u){let r=String(u?.finalResponse||u?.finalResponsePreview||"");if(o2(l,u?.index))return"";if(Object.prototype.hasOwnProperty.call(u||{},"finalResponse")||Object.prototype.hasOwnProperty.call(u||{},"finalResponsePreview"))return r.trimEnd();return r.length>0?r.trimEnd():XQ(l)}function hQ(l,u,r=u?.index){if(o2(l,r))return null;if(Object.prototype.hasOwnProperty.call(u||{},"judge"))return ol(u?.judge);return PQ(l)}function Kz(l,u,r){if(!bQ(l))return!1;if(d2(u,r))return!1;if(u?.finishedAt)return!1;if(["succeeded","failed","canceled"].includes(String(u?.terminalStatus||"")))return!1;if(z3(l,r))return!0;let f=Number(Jr(l)?.currentAttempt||l?.currentAttempt||0);if(Number.isFinite(f)&&f>0)return!1;return!0}function MQ(l){return`feedback:${String(l||"latest")}`}function Ez(l,u,r){let f=String(u?.feedbackPrompt||"").trimEnd(),n=String(u?.feedbackPromptPreview||f||"").trimEnd(),t=Number(u?.feedbackPromptChars||f.length||n.length||0),i=Number(u?.feedbackPromptLines||si(f||n));if(f.length>0||n.length>0||t>0)return{text:f,preview:n,chars:t,lines:i,source:u?.feedbackPromptSource||"judge-feedback",forAttempt:u?.feedbackPromptForAttempt||Number(r||0)+1,truncated:Boolean(u?.feedbackPromptTruncated)};let y=hQ(l,u,r),c=String(y?.continuePrompt||"").trimEnd();if(y?.decision==="retry"&&c.length>0)return{text:"",preview:c,chars:c.length,lines:si(c),source:"judge-continue-prompt",forAttempt:Number(r||0)+1,truncated:!1};return null}function pz(l){let u=I2(l);return Boolean(u.hasReferenceInjection||Number(u.referencePromptChars||0)>0||l?.referenceInjection||l?.referenceInjectionSummary)}function sQ(l,u=null){if(u!==null&&u!==void 0){let f=(ol(l?._traceStepsByAttempt)||{})[String(u)];return Array.isArray(f)?f:[]}return Array.isArray(l?._traceSteps)?l._traceSteps:[]}function m1(l){let r=[l?.seq,...Array.isArray(l?.rawSeqs)?l.rawSeqs:[]].map((f)=>Number(f)).filter((f)=>Number.isFinite(f));return r.length>0?Math.max(...r):0}function zz(l){return(Array.isArray(l)?l:[]).reduce((u,r)=>Math.max(u,m1(r)),0)}function Oz(l,u){let r=new Map;for(let f of[...Array.isArray(l)?l:[],...Array.isArray(u)?u:[]]){let n=String(f?.seq??`${f?.title||"step"}:${f?.at||""}`);r.set(n,{...r.get(n)||{},...f})}return Array.from(r.values()).sort((f,n)=>m1(f)-m1(n))}function xi(l){return(Array.isArray(l?.summaryLines)?l.summaryLines:[]).map((u)=>String(u||""))}function Zz(l){let u=String(l?.kind||"").trim().toLowerCase(),r=String(l?.status||"").trim().toLowerCase();return u==="error"||r==="error"}function O3(l){let u=String(l?.status||"").trim();if(u.length>0)return u;let r=xi(l).join(` +`);return/^(item\/[A-Za-z]+(?:\/[A-Za-z]+)?):/u.exec(r)?.[1]||""}function qQ(l){return/^item\/(?:started|completed): file changes status=/u.test(String(l||"").trim())}function Hz(l){let u=xi(l);for(let f=u.length-1;f>=0;f-=1){let n=/file changes status=([A-Za-z0-9_-]+)/u.exec(u[f]||"")?.[1];if(n)return n}let r=O3(l);if(r==="item/fileChange/outputDelta")return"updated";if(r==="item/started")return"started";if(r==="item/completed")return"completed";return r.replace(/^item\//u,"")||String(l?.status||"changed")}function Bz(l){if(String(l?.kind||"")!=="edited")return!1;let u=String(l?.title||""),r=String(l?.status||""),f=xi(l).join(` +`);if(u==="Edited files")return!0;if(/^item\/fileChange\//u.test(r))return!0;if((r==="item/started"||r==="item/completed")&&/file changes status=/u.test(f))return!0;if(/^Success\. Updated the following files:/mu.test(f))return!0;if(/^diff --git /mu.test(f))return!0;return/^([AMDRCU?]{1,2})\s+\S+/mu.test(f)}function Dz(l){if(l.length<=1)return l[0];let u=l.find((t)=>O3(t)==="item/fileChange/outputDelta")||l.find((t)=>xi(t).some((i)=>!qQ(i)))||l.at(-1)||l[0],r=l.flatMap((t)=>Array.isArray(t?.rawSeqs)?t.rawSeqs:[t?.seq]).filter((t)=>t!==void 0),f=l.flatMap(xi).filter((t)=>t.trim().length>0&&!qQ(t)),n=l[l.length-1]||u;return{...u,at:u?.at||n?.at,title:String(u?.title||"Edited files"),status:Hz(n),summaryLines:f.length>0?f:xi(u),rawSeqs:r}}function Vz(l){let u=Array.isArray(l)?l:[],r=[],f=[],n=()=>{if(f.length>0)r.push(Dz(f));f=[]};for(let t of u){if(Bz(t)){if(O3(t)==="item/started"&&f.length>0)n();if(f.push(t),O3(t)==="item/completed")n();continue}n(),r.push(t)}return n(),r}function Sz(l){if(String(l?.kind||"")!=="message")return"";let u=String(l?.title||"").trim().toLowerCase();if(u!=="assistant message"&&u!=="reasoning")return"";return`${u}:${String(l?.status||"")}`}function Yz(l){if(l.length<=1)return l[0];let u=l[0],r=l.at(-1)||u,f=l.flatMap((i)=>Array.isArray(i?.rawSeqs)?i.rawSeqs:[i?.seq]).filter((i)=>i!==void 0),n=[];for(let i of f)if(!n.includes(i))n.push(i);let t=l.flatMap(xi).filter((i)=>i.trim().length>0);return{...u,seq:m1(r)||m1(u),at:r?.at||u?.at,summaryLines:t.length>0?[t.at(-1)||t[0]]:[],rawSeqs:n}}function Xz(l){let u=Array.isArray(l)?l:[],r=[],f=[],n="",t=()=>{if(f.length>0)r.push(Yz(f));f=[],n=""};for(let i of u){let y=Sz(i);if(y.length>0&&y===n){f.push(i);continue}if(t(),y.length>0)f=[i],n=y;else r.push(i)}return t(),r}function Pz(l){return Xz(Vz(l))}function Cz(l){return{...l}}function E3(l,u=null){if(u!==null&&u!==void 0){let r=ol(l?._traceStepsLoadedByAttempt)||{};return Boolean(r[String(u)])}return Boolean(l?._traceStepsLoaded)}function s2(l){return l?._traceStepDetails&&typeof l._traceStepDetails==="object"&&!Array.isArray(l._traceStepDetails)?l._traceStepDetails:{}}function hz(l,u){let r=Number(l?.index);return Number.isFinite(r)?r:u+1}function d2(l,u){return Boolean(l?.synthetic)||Number(u)<=0}function B3(l){let u=Number(l);return Number.isFinite(u)?String(u):void 0}function Mz(l){let u=l?.timing&&typeof l.timing==="object"?l.timing:{},r=String(l?.status||"");if(["queued"].includes(r))return`等待 ${ln(u.queueWaitMs??u.totalElapsedMs)}`;if(["running","judging","retry_wait"].includes(r))return`耗时 ${ln(u.durationMs??u.totalElapsedMs)}`;return`耗时 ${ln(u.durationMs??u.totalElapsedMs)}`}function Fy(l){return String(l?.queueId||"default")}function RQ(l){return ol(l?.queuedReason)}function xQ(l){let u=String(l?.queuedReasonLabel||"").trim();if(u.length>0)return u.toUpperCase();let r=RQ(l),f=String(r?.label||"").trim();return f.length>0?f.toUpperCase():""}function sz(l){let u=String(l?.status||"unknown");if(u!=="queued")return u;let r=xQ(l);return r.length>0?`QUEUED(${r})`:"QUEUED"}function Rz(l){if(String(l?.status||"")!=="queued")return;let u=RQ(l),r=String(u?.message||"").trim(),f=xQ(l);if(r.length>0&&f.length>0)return`${f}: ${r}`;if(r.length>0)return r;return f.length>0?f:void 0}function xz(l){return{system:"SYS",user:"YOU",assistant:"GPT",reasoning:"THINK",command:"CMD",diff:"DIFF",tool:"TOOL",error:"ERR"}[l]||l.toUpperCase()}function vt(l){return["running","judging","retry_wait"].includes(String(l?.status||""))}function bQ(l){return String(l?.status||"")==="running"}function ef(l){return["succeeded","failed","canceled"].includes(String(l?.status||""))}function vQ(l){if(l?.promptEditable===!0)return!0;if(l?.promptEditable===!1)return!1;return String(l?.status||"")==="queued"&&!l?.startedAt&&Number(l?.currentAttempt||0)===0&&!l?.codexThreadId&&!l?.nextMode}function on(l){if(!ef(l))return!1;if(l?.terminalUnread===!0)return!0;if(l?.terminalUnread===!1)return!1;return!l?.readAt}function pu(l){let u=Number(l||0);return Number.isFinite(u)?u:0}function bz(l){return pu(l.queued)+pu(l.retry_wait)}function vz(l){return pu(l.running)+pu(l.judging)}function gz(l,u){return ol(l?.statistics)||ol(u?.statistics)||{}}function gQ(...l){return l.find((u)=>u!==void 0&&u!==null)}function kQ(l){let u=Number(l);return Number.isFinite(u)&&u>=0?u:null}function Kr(...l){for(let u of l){let r=kQ(u);if(r!==null)return Math.floor(r)}return 0}function e2(...l){for(let u of l){let r=kQ(u);if(r!==null)return Math.round(r)}return null}function kz(l){for(let u of[l?.daily,l?.dailyBuckets,l?.daily_buckets,l?.buckets,l?.rows,l?.series])if(Array.isArray(u))return u;return[]}function IQ(l){return kz(l).map((u,r)=>{let f=ol(u)||{},n=String(gQ(f.date,f.day,f.bucketDate,f.bucket,`day-${r}`)||"");return{...f,date:n,executedTasks:Kr(f.executedTasks,f.tasks,f.taskCount,f.startedTasks,f.started,f.executed,f.count),completedTasks:Kr(f.completedTasks,f.terminalTasks,f.terminalCount,f.finishedTasks,f.finished,f.completed),retryAttempts:Kr(f.retryAttempts,f.retries,f.retryCount,f.retryTasks),succeededTasks:Kr(f.succeededTasks,f.succeeded,f.success),failedTasks:Kr(f.failedTasks,f.failed,f.failures),canceledTasks:Kr(f.canceledTasks,f.cancelledTasks,f.canceled,f.cancelled),totalDurationMs:Kr(f.totalDurationMs,f.durationTotalMs,f.totalCompletionDurationMs),durationSamples:Kr(f.durationSamples,f.avgDurationSamples,f.samples,f.sampleCount),avgDurationMs:e2(f.avgDurationMs,f.averageDurationMs,f.avgCompletedDurationMs,f.averageCompletionMs,f.averageDuration,f.durationMs)}}).filter((u)=>u.date.length>0)}function xt(l,u){return l.reduce((r,f)=>r+pu(f?.[u]),0)}function Iz(l){let u=0,r=0;for(let f of l){let n=pu(f?.durationSamples),t=e2(f?.avgDurationMs);if(n>0&&t!==null)u+=t*n,r+=n}return r>0?Math.round(u/r):null}function az(l,u=IQ(l)){let r=ol(l?.totals)||ol(l?.summary)||{},f=Kr(r.durationSamples,r.avgDurationSamples,r.samples,l?.durationSamples,l?.samples,xt(u,"durationSamples")),n=Kr(r.totalDurationMs,r.durationTotalMs,l?.totalDurationMs,xt(u,"totalDurationMs")),t=e2(r.avgDurationMs,r.averageDurationMs,r.avgCompletedDurationMs,l?.avgDurationMs,l?.averageDurationMs,f>0&&n>0?n/f:null,Iz(u));return{...r,executedTasks:Kr(r.executedTasks,r.tasks,r.taskCount,l?.executedTasks,l?.tasks,l?.taskCount,xt(u,"executedTasks")),completedTasks:Kr(r.completedTasks,r.terminalTasks,r.terminalCount,r.finishedTasks,l?.completedTasks,l?.terminalTasks,l?.terminalCount,xt(u,"completedTasks")),retryAttempts:Kr(r.retryAttempts,r.retries,r.retryCount,l?.retryAttempts,l?.retries,l?.retryCount,xt(u,"retryAttempts")),succeededTasks:Kr(r.succeededTasks,l?.succeededTasks,xt(u,"succeededTasks")),failedTasks:Kr(r.failedTasks,l?.failedTasks,xt(u,"failedTasks")),canceledTasks:Kr(r.canceledTasks,r.cancelledTasks,l?.canceledTasks,l?.cancelledTasks,xt(u,"canceledTasks")),durationSamples:f,totalDurationMs:n,avgDurationMs:t}}function LQ(l){let u=gQ(l?.reason,l?.degradedReason,l?.statsReason,l?.error,l?.message,l?.detail);if(typeof u==="string"&&u.trim().length>0)return Q1(u,180);if(l?.skipped===!0)return"统计 API 返回 skipped,当前后端未提供 daily buckets。";if(l?.unavailable===!0)return"统计 API 当前不可用。";return"统计 API 未返回可用的 daily buckets。"}function oz(l,u,r){let f=ol(l)!==null,n=l?.unavailable===!0||l?._unavailable===!0||l?.available===!1,t=l?.skipped===!0,i=l?.degraded===!0||l?.isDegraded===!0||n||t,y=pu(r.executedTasks)+pu(r.retryAttempts)+pu(r.completedTasks);if(!f)return{state:"loading",label:"统计同步中",reason:"正在读取 Code Queue stats API。"};if(n||t||i&&u.length===0)return{state:"unavailable",label:"统计不可用",reason:LQ(l),degraded:!0};if(i)return{state:"degraded",label:"统计降级",reason:LQ(l),degraded:!0};if(u.length===0&&y===0)return{state:"empty",label:"暂无统计",reason:"任务开始执行后会生成按天汇总的曲线。"};return{state:"ready",label:"统计就绪",reason:""}}function GQ(l){return{source:"frontend-stats-fetch",unavailable:!0,degraded:!0,reason:Hu(l,"统计 API 不可用"),daily:[],totals:null}}function l5(l,u){let r=Number(l?.[u]??0);return Number.isFinite(r)&&r>0?r:0}function Y2(l,u){return l.reduce((r,f)=>Math.max(r,l5(f,u)),0)}var Mi=700,WQ=220,bt=30,_y=24,U1=184,R2=U1-_y;function aQ(l,u){if(u<=1)return Mi/2;return bt+l*(Mi-bt*2)/(u-1)}function oQ(l,u){let r=u>0?u:1;return U1-Math.min(1,l/r)*R2}function X2(l,u,r){let f=l.length>0?l:[{[u]:0}],n=f.length>1?f:[f[0],f[0]];return n.map((t,i)=>`${aQ(i,n.length).toFixed(2)},${oQ(l5(t,u),r).toFixed(2)}`).join(" ")}function an(l){let u=String(l||"");return/^\d{4}-\d{2}-\d{2}$/u.test(u)?u.slice(5):u||"--"}function W3(l){if(!l)return"";return`${String(l.seriesKey||"")}:${String(l.row?.date||l.index||"")}`}function dz(l,u,r,f){let n=l5(l,f.key);return{...f,row:l,index:u,value:n,valueLabel:f.format(n),x:aQ(u,r),y:oQ(n,f.max),seriesKey:f.key}}function TQ(l){if(on(l))return 0;return{running:1,judging:2,retry_wait:3,queued:4,succeeded:8,failed:8,canceled:8}[String(l?.status||"")]??9}function A1(l){if(!l)return!1;if(l?._traceSummaryLoaded===!0)return!1;return l?.summaryOnly===!0||l?._metaLoaded!==!0}function ez(l){return Boolean(l?._metaLoaded)||l?.summaryOnly===!1}function lO(l,u,r){let f=String(l?.[r]||""),n=String(u?.[r]||"");return f.length>n.length?f:n}function x2(l,u,r){let f=Array.isArray(l?.[r])?l[r]:[],n=Array.isArray(u?.[r])?u[r]:[];if(n.length===0&&f.length>0)return f;return f.length>n.length?f:n}function KQ(l,u){let r=u?.summaryOnly===!0&&ez(l),f={...l,...u};if(!r)return f;for(let n of["prompt","basePrompt","displayPrompt","finalResponse"])f[n]=lO(l,u,n);for(let n of["promptHistory","attempts","output","events"])f[n]=x2(l,u,n);if(l?.referenceInjection?.items&&!u?.referenceInjection?.items)f.referenceInjection=l.referenceInjection;if(l?.referenceInjectionSummary&&!u?.referenceInjectionSummary)f.referenceInjectionSummary=l.referenceInjectionSummary;f.summaryOnly=l?.summaryOnly===!1?!1:u.summaryOnly,f._metaLoaded=l?._metaLoaded,f._detailLoaded=l?._detailLoaded,f._transcriptComplete=l?._transcriptComplete,f._transcriptPreview=Object.prototype.hasOwnProperty.call(u,"_transcriptPreview")?u._transcriptPreview:l?._transcriptPreview;for(let n of["_traceSummary","_traceSummaryLoaded","_traceSteps","_traceStepsLoaded","_traceStepsByAttempt","_traceStepsLoadedByAttempt","_traceStepsNextAfterSeqByAttempt","_traceStepDetails","_promptDetails"])if(!Object.prototype.hasOwnProperty.call(u,n)&&Object.prototype.hasOwnProperty.call(l||{},n))f[n]=l[n];return f}function EQ(l){let u=l?.selected,r=u?.task&&typeof u.task==="object"?u.task:null;if(r!==null){let n=Boolean(u?.preview);return{...r,transcript:Array.isArray(u?.transcript)?u.transcript:[],_detailLoaded:Array.isArray(u?.transcript)&&u.transcript.length>0,_transcriptComplete:Boolean(!n&&!u?.hasMore&&ef(r)),_transcriptPreview:n,_summaryLoaded:!0}}let f=Cu(l)[0];return f?{...f,_summaryLoaded:!0}:null}function P2(l,u){let r=new Map;for(let f of[...Array.isArray(l)?l:[],...Array.isArray(u)?u:[]]){let n=`${Number(f?.seq??0)}:${String(f?.kind||"message")}`,t=r.get(n);if(!t){r.set(n,f);continue}let i={...t,...f};for(let[y,c]of[["bodyPreview","bodyOmittedLines"],["commandPreview","commandOmittedLines"]]){let _=String(t?.[y]||""),A=String(f?.[y]||"");if(_.length>A.length)i[y]=t[y],i[c]=t[c]}r.set(n,i)}return Array.from(r.values()).sort((f,n)=>Number(f?.seq??0)-Number(n?.seq??0))}function F1(l){return(Array.isArray(l)?l:[]).reduce((u,r)=>Math.max(u,Number(r?.seq??0)),0)}function pQ(l,u=8){let r=Array.from(new Set((Array.isArray(l)?l:[]).map((n)=>Number(n?.seq??0)).filter((n)=>Number.isFinite(n)&&n>0))).sort((n,t)=>n-t);if(r.length===0)return 0;let f=r[Math.max(0,r.length-u)]??0;return Math.max(0,f-0.001)}function uO(l,u){let r=Array.isArray(l?.codeModels)?l.codeModels:Array.isArray(l?.codexModels)?l.codexModels:[],f=["gpt-5.5","gpt-5.4-mini","gpt-5.4","minimax-m2.7"];return Array.from(new Set([...r,...f,u].map((n)=>String(n||"").trim()).filter(Boolean)))}function rO(l,u){let f=(Array.isArray(l?.executionProviders)?l.executionProviders:[]).map((i)=>({id:String(i?.id||"").trim(),label:String(i?.label||i?.id||"").trim(),defaultWorkdir:String(i?.defaultWorkdir||"").trim(),supportsWindowsNativeCodex:i?.supportsWindowsNativeCodex===!0,windowsNativeDefaultWorkdir:String(i?.windowsNativeDefaultWorkdir||"").trim(),kind:String(i?.kind||"").trim()})).filter((i)=>i.id.length>0),n=String(l?.mainProviderId||l?.defaultProviderId||"D601").trim()||"D601",t=new Map;for(let i of[...f,{id:n,label:`${n} (local)`,defaultWorkdir:String(l?.defaultWorkdir||"/workspace"),supportsWindowsNativeCodex:!1,windowsNativeDefaultWorkdir:"",kind:"local"},u?{id:u,label:u,defaultWorkdir:u5(l,u),supportsWindowsNativeCodex:u!==n,windowsNativeDefaultWorkdir:String(l?.windowsNativeCodexDefaultWorkdir||"/mnt/f/Work/ConStart"),kind:""}:null].filter(Boolean))if(!t.has(i.id))t.set(i.id,i);return Array.from(t.values())}function fO(l,u){let f=(Array.isArray(l?.executionModes)?l.executionModes:[]).map((i)=>({id:String(i?.id||i?.kind||"").trim(),label:String(i?.label||i?.id||i?.kind||"").trim(),description:String(i?.description||"").trim(),defaultWorkdir:String(i?.defaultWorkdir||"").trim(),requiresProvider:i?.requiresProvider===!0,requiresWindowsCwd:i?.requiresWindowsCwd===!0})).filter((i)=>i.id.length>0),n=[{id:"default",label:"默认容器/本机",description:"Code Queue 所在节点用本机 Codex;远程 Provider 用执行容器 Codex。",defaultWorkdir:"",requiresProvider:!1,requiresWindowsCwd:!1},{id:"windows-native",label:"Windows 原生 Codex",description:"启动执行容器,但容器只做 stdio relay,Codex 运行在 Provider 的 Windows 宿主。",defaultWorkdir:String(l?.windowsNativeCodexDefaultWorkdir||"/mnt/f/Work/ConStart"),requiresProvider:!0,requiresWindowsCwd:!0}],t=new Map;for(let i of[...f,...n,u?{id:u,label:u,description:"",defaultWorkdir:"",requiresProvider:u==="windows-native",requiresWindowsCwd:u==="windows-native"}:null].filter(Boolean))if(!t.has(i.id))t.set(i.id,i);return Array.from(t.values())}function N1(l,u,r){if(u!=="windows-native")return u5(l,r);let f=Array.isArray(l?.executionModes)?l.executionModes.find((t)=>String(t?.id||t?.kind||"")==="windows-native"):null,n=Array.isArray(l?.executionProviders)?l.executionProviders.find((t)=>String(t?.id||"")===r):null;return String(n?.windowsNativeDefaultWorkdir||f?.defaultWorkdir||l?.windowsNativeCodexDefaultWorkdir||"/mnt/f/Work/ConStart")}function u5(l,u){let r=String(u||"").trim(),f=l?.defaultWorkdirByProvider&&typeof l.defaultWorkdirByProvider==="object"?l.defaultWorkdirByProvider:{};if(typeof f[r]==="string"&&String(f[r]).trim().length>0)return String(f[r]).trim();let n=Array.isArray(l?.executionProviders)?l.executionProviders.find((i)=>String(i?.id||"")===r):null;if(typeof n?.defaultWorkdir==="string"&&n.defaultWorkdir.trim().length>0)return n.defaultWorkdir.trim();let t=String(l?.mainProviderId||l?.defaultProviderId||"D601");return r===t?String(l?.defaultWorkdir||"/workspace"):String(l?.remoteDefaultWorkdir||"/home/ubuntu")}function jy(l){return String(l||"").trim().replace(/\/+$/u,"")||"/"}function nO(l,u,r){return String(l?.providerId||"")===String(u||"")&&String(l?.executionMode||"default")===String(r||"default")&&String(l?.path||"").trim().length>0}function tO(l,u,r,f,n){let t=new Map,i=jy(n),y=(c,_,A={})=>{let F=jy(c);if(F.length===0||t.has(F))return;t.set(F,{providerId:r,executionMode:f,path:F,source:_,createdAt:A?.createdAt||"",updatedAt:A?.updatedAt||""})};y(N1(l,f,r),"default");for(let c of Array.isArray(u)?u:[])if(nO(c,r,f))y(c.path,"saved",c);return y(n,"current"),Array.from(t.values()).sort((c,_)=>{if(c.path===i)return-1;if(_.path===i)return 1;if(c.source==="default"&&_.source!=="default")return-1;if(_.source==="default"&&c.source!=="default")return 1;return c.path.localeCompare(_.path)})}function iO({task:l,selected:u,onSelect:r,onCopy:f,onReference:n,onMarkRead:t,copied:i,markingRead:y}){let c=l?.lastJudge||{},_=String(l?.id||""),A=on(l),F=b2(l?.updatedAt,Jr(l)?.updatedAt),j=`最近更新: ${J1(F)}`,N=mz(l),U=N.title;return L("article",{role:"button",tabIndex:0,className:`codex-task-card ${u?"selected":""} ${A?"unread-terminal":""}`,onClick:r,onKeyDown:(w)=>{if(w.key==="Enter"||w.key===" ")w.preventDefault(),r()},"data-unread-terminal":A?"true":"false","data-testid":`codex-task-${l?.id||"unknown"}`},A?L("span",{className:"codex-unread-badge",title:"待读","aria-label":"待读","data-testid":`codex-unread-task-${_||"unknown"}`}):null,L("div",{className:"codex-task-card-head"},L("div",{className:"codex-task-status-line"},L(Ri,{status:l?.status,title:Rz(l)},sz(l))),L("span",{className:"mono-text"},`${l?.currentAttempt||0}/${l?.maxAttempts||0}`)),L("div",{className:"codex-task-id-row"},L("code",{title:_},_||"unknown"),L("div",{className:"codex-task-id-actions"},L("button",{type:"button",className:"codex-copy-id-btn",onClick:(w)=>{w.stopPropagation(),n(_)},"data-testid":`codex-reference-task-${_||"unknown"}`},"引用"),L("button",{type:"button",className:"codex-copy-id-btn",onClick:(w)=>{w.stopPropagation(),f(_)},"data-testid":`codex-copy-task-id-${_||"unknown"}`},i?"已复制":"复制ID"),A?L("button",{type:"button",className:"codex-copy-id-btn codex-mark-read-btn",disabled:Boolean(y),onClick:(w)=>{w.stopPropagation(),t(_)},"data-testid":`codex-mark-task-read-${_||"unknown"}`},y?"标记中":"标为已读"):null)),L("strong",null,Q1(VQ(l,{preview:!0}),120)||"空任务"),L("div",{className:"codex-task-meta"},L("span",null,`queue=${Fy(l)}`),L("span",null,`provider=${l?.providerId||"D601"}`),L("span",null,`mode=${l?.executionMode||"default"}`),L("span",null,l?.model||"--"),L("span",null,Mz(l))),L("div",{className:"codex-task-meta codex-task-update-meta"},L("span",{className:`codex-task-recent-update codex-task-step-count ${N.state}`,title:U,"data-testid":`codex-task-step-count-${_||"unknown"}`,"data-step-state":N.state,"data-step-source":N.source},Qz(N)),L("span",{className:"codex-task-recent-update",title:F?`更新时间: ${Ll(F)}`:j,"data-testid":`codex-task-recent-update-${_||"unknown"}`},j),L("span",null,Ll(F||l?.updatedAt))),vQ(l)?L("div",{className:"codex-judge-line","data-testid":`codex-task-prompt-editable-${_||"unknown"}`},"queued prompt 可编辑"):null,c?.decision?L("div",{className:"codex-judge-line"},`judge=${c.decision} ${Math.round(Number(c.confidence||0)*100)}%`):null)}function C2({title:l,tasks:u,selectedId:r,onSelect:f,onCopy:n,onReference:t,onMarkRead:i,copiedTaskId:y,markingReadTaskId:c,emptyText:_}){let A=Array.isArray(u)?u:[];return L("section",{className:"codex-task-section"},L("div",{className:"codex-task-section-head"},L("span",null,l),L("code",null,String(A.length))),A.length===0?L("p",{className:"codex-task-section-empty"},_):L("div",{className:"codex-task-section-list"},A.map((F)=>L(iO,{key:F.id,task:F,selected:r===F.id,onSelect:()=>f(F.id),onCopy:n,onReference:t,onMarkRead:i,copied:y===F.id,markingRead:c===F.id}))))}function yO(){return L("span",{className:"codex-stats-icon","aria-hidden":"true"},L("svg",{viewBox:"0 0 36 24",focusable:"false"},L("path",{className:"grid",d:"M3 20.5H33M3 12.5H33M3 4.5H33"}),L("polyline",{className:"line tasks",points:"3,18 9,14 15,15 21,8 27,10 33,4"}),L("polyline",{className:"line retry",points:"3,20 9,17 15,18 21,13 27,14 33,9"})))}function Df({label:l,value:u,hint:r,tone:f}){return L("div",{className:`codex-liveness-metric ${f||""}`},L("span",null,l),L("strong",null,u??"--"),r?L("code",null,r):null)}function cO({diagnostics:l,queue:u,onRaw:r}){let f=String(l?.state||l?.health||"unknown"),n=ol(l?.oaPublisher),t=ar(l?.reasons).slice(0,3),i=H3(l),y=g2(l),c=HQ(l),_=String(l?.recommendedAction||(i.length>0?"investigate-heartbeat-risk":y?"continue-supervision":c==="degraded"?"observe-degraded":"none")),A=String(y?"控制面/执行面观测分裂,但 heartbeat/trace 新鲜,继续监督。":i.length>0?"存在 expired/missing/stale heartbeat 风险,请先确认执行面状态。":l?.livenessSummary||(c==="degraded"?"Diagnostics are degraded; inspect heartbeat, trace, and OA progress together.":"Execution diagnostics are healthy.")),F=Ip(l),j=y?"split-brain live":f;return L(hi,{title:"执行活性",eyebrow:`${String(l?.executionStateSource||u?.executionStateSource||"unknown")} / ${String(l?.controlPlane||"code-queue")}`,summary:L("div",{className:"codex-trace-status"},L("span",{className:`codex-trace-status-chip liveness ${F}`},L("b",null,"状态"),j),L("span",{className:`codex-trace-status-chip liveness ${F}`},L("b",null,"liveness"),c),L("span",{className:"codex-trace-status-chip"},L("b",null,"DB active"),String(l?.databaseActiveTaskCount??u?.databaseActiveTaskCount??0)),L("span",{className:"codex-trace-status-chip"},L("b",null,"scheduler slots"),String(l?.schedulerActiveRunSlotCount??u?.activeRunSlotCount??0)),L("span",{className:"codex-trace-status-chip"},L("b",null,"heartbeat"),`${ar(l?.heartbeatFreshTaskIds).length} fresh / ${ar(l?.heartbeatExpiredTaskIds).length} expired`),n?L("span",{className:"codex-trace-status-chip"},L("b",null,"OA"),`${Number(n.pending||0)} pending${n.lastError?" / error":""}`):null),actions:L(v2,{title:"Code Queue Execution Diagnostics",data:l,onOpen:r,testId:"raw-code-queue-execution-diagnostics"}),className:"codex-liveness-panel"},L("div",{className:"codex-liveness-grid","data-testid":"codex-liveness-diagnostics"},L(Df,{tone:F,label:"健康状态",value:j,hint:_}),L(Df,{tone:F,label:"Effective liveness",value:c,hint:A}),L(Df,{label:"PostgreSQL active",value:String(l?.databaseActiveTaskCount??u?.databaseActiveTaskCount??0),hint:cy(l?.databaseActiveTaskIds??u?.databaseActiveTaskIds)}),L(Df,{label:"Scheduler active",value:String(l?.schedulerActiveRunSlotCount??u?.activeRunSlotCount??0),hint:cy(l?.schedulerActiveTaskIds??u?.activeTaskIds)}),L(Df,{label:"Fresh heartbeat",value:String(ar(l?.heartbeatFreshTaskIds).length),hint:cy(l?.heartbeatFreshTaskIds)}),L(Df,{tone:i.length>0?"failed":y?"degraded-live":"",label:"Heartbeat risk",value:String(i.length),hint:i.length>0?cy(i):y?"fresh heartbeat/trace: keep supervising":"--"}),L(Df,{tone:ar(l?.traceGapNotStaleTaskIds).length>0?"warn":"",label:"Trace gap",value:String(ar(l?.traceGapTaskIds).length),hint:cy(l?.traceGapNotStaleTaskIds)}),L(Df,{tone:ar(l?.staleRecoveryCandidateTaskIds).length>0?"failed":"",label:"Stale candidates",value:String(ar(l?.staleRecoveryCandidateTaskIds).length),hint:cy(l?.staleRecoveryCandidateTaskIds)}),L(Df,{label:"Last scheduler heartbeat",value:J1(l?.lastSchedulerHeartbeatAt),hint:String(l?.lastSchedulerHeartbeatAt||"--")}),L(Df,{label:"Last agent event",value:J1(l?.lastObservedAgentEventAt),hint:String(l?.lastObservedAgentEventAt||"--")}),L(Df,{label:"Last trace persist",value:J1(l?.lastPersistedTraceAt),hint:String(l?.lastPersistedTraceAt||"--")}),L(Df,{tone:n?.lastError?"warn":"",label:"OA publisher",value:`${Number(n?.pending||0)} pending`,hint:n?.lastError?Q1(n.lastError,90):"ok"})),L("div",{className:`codex-liveness-advisory ${F}`},L("b",null,y?"Observing split":i.length>0?"Heartbeat risk":"Liveness note"),L("span",null,A),L("code",null,_)),t.length>0?L("div",{className:"codex-liveness-reasons"},t.map((N)=>L("span",{key:N},N))):null)}function $O({stats:l,queueName:u,onRaw:r}){let f=IQ(l),n=az(l,f),t=f.at(-1)||{},i=Y2(f,"executedTasks"),y=Y2(f,"retryAttempts"),c=Y2(f,"avgDurationMs"),_=f.length>0,A=ol(l?.range)||{},F=oz(l,f,n),j=String(F.label||""),N=String(F.reason||""),U=F.state==="ready"||F.state==="degraded"?"将鼠标悬停到曲线数据点查看明细,点击数据点可固定。":N||"等待统计数据。",[w,G]=kl(null),[J,Q]=kl(null),m=[];if(i>0)m.push(`tasks ${i}`);if(y>0)m.push(`retry ${y}`);if(c>0)m.push(`avg ${ln(c)}`);let q=[{key:"executedTasks",className:"tasks",label:"执行任务",max:i,format:(B)=>`${pu(B)} tasks`},{key:"retryAttempts",className:"retry",label:"重试次数",max:y,format:(B)=>`${pu(B)} retries`},{key:"avgDurationMs",className:"duration",label:"平均耗时",max:c,format:(B)=>ln(B)}],W=w||J,p=W3(W),O=String(W?.row?.date||""),Z=W?{left:`${Math.max(8,Math.min(92,Number(W.x)/Mi*100))}%`,top:`${Math.max(14,Math.min(86,Number(W.y)/WQ*100))}%`}:void 0;df(()=>{G(null),Q(null)},[u,A.startDate,A.endDate,f.length]);let V=(B)=>{G(B)},P=(B)=>{let C=W3(B);Q((E)=>W3(E)===C?null:B),G(B)},H=q.flatMap((B)=>f.map((C,E)=>{let D=dz(C,E,f.length,B),Y=W3(D),v=p===Y,K=String(C?.date||`day-${E}`),X=`${an(K)} ${B.label}: ${D.valueLabel}`;return L("g",{key:`${B.key}-${K}`,className:`stat-point-group ${B.className} ${v?"active":""}`,role:"button",tabIndex:0,"aria-label":X,"data-testid":`codex-stats-point-${B.className}-${K}`,onMouseEnter:()=>V(D),onFocus:()=>V(D),onClick:()=>P(D),onKeyDown:(I)=>{if(I.key==="Enter"||I.key===" ")I.preventDefault(),P(D)}},L("circle",{className:"stat-hit-point",cx:D.x,cy:D.y,r:13}),L("circle",{className:`stat-point ${B.className} ${v?"active":""}`,cx:D.x,cy:D.y,r:v?5.6:4.2}))}));return L(hi,{title:"统计曲线",eyebrow:`Daily task stats / ${u}`,className:`codex-stats-panel ${F.state}`,summary:L("span",null,`${an(A.startDate)} -> ${an(A.endDate)} · ${l?.timezone||"Asia/Shanghai"} · ${j}`),actions:ol(l)?L(v2,{title:"Code Queue Stats",data:l,onOpen:r,testId:"raw-codex-stats"}):null},L("div",{className:"codex-stats-hero","data-testid":"codex-stats-panel","data-stats-state":F.state,"data-stats-degraded":F.degraded===!0?"true":"false"},L(yO),L("div",null,L("strong",null,`${pu(n.executedTasks)} tasks / ${pu(n.retryAttempts)} retries`),L("span",null,`平均完成耗时 ${ln(n.avgDurationMs??void 0)} · 终态 ${pu(n.completedTasks)} 个`))),F.degraded===!0?L("div",{className:`codex-stats-diagnostic ${F.state}`,"data-testid":"codex-stats-diagnostic"},L("b",null,j),L("span",null,N),l?.source?L("code",null,`source=${String(l.source)}`):null):null,L("div",{className:`codex-stats-chart ${_?"has-data":"no-data"}`,"data-testid":"codex-stats-chart","data-empty":_?"false":"true",onMouseLeave:()=>G(null)},L("svg",{viewBox:`0 0 ${Mi} ${WQ}`,preserveAspectRatio:"none",role:"img","aria-label":"Code Queue daily task statistics"},L("line",{className:"axis",x1:bt,x2:Mi-bt,y1:U1,y2:U1}),L("line",{className:"grid",x1:bt,x2:Mi-bt,y1:_y+R2/2,y2:_y+R2/2}),L("line",{className:"grid",x1:bt,x2:Mi-bt,y1:_y,y2:_y}),L("polyline",{className:"stat-line tasks",points:X2(f,"executedTasks",i)}),L("polyline",{className:"stat-line retry",points:X2(f,"retryAttempts",y)}),L("polyline",{className:"stat-line duration",points:X2(f,"avgDurationMs",c)}),W?L("g",{className:"stat-cursor-layer","data-testid":"codex-stats-active-point"},L("line",{className:"stat-cursor",x1:W.x,x2:W.x,y1:_y,y2:U1}),L("circle",{className:`stat-point-active ${W.className}`,cx:W.x,cy:W.y,r:8})):null,L("g",{className:"stat-point-layer"},H)),W?L("div",{className:"codex-stats-tooltip active",style:Z,"data-testid":"codex-stats-tooltip"},L("b",null,an(W.row?.date)),L("span",null,`${W.label} · ${W.valueLabel}`),L("code",null,`${pu(W.row?.executedTasks)} exec / ${pu(W.row?.retryAttempts)} retry / ${ln(W.row?.avgDurationMs??void 0)}`)):null,!_?L("div",{className:"codex-stats-chart-empty","data-testid":"codex-stats-empty"},L("strong",null,j),L("span",null,U)):null,L("div",{className:"codex-stats-legend"},L("span",{className:"tasks"},"执行任务"),L("span",{className:"retry"},"重试次数"),L("span",{className:"duration"},"平均耗时")),L("div",{className:"codex-stats-scale"},L("span",null,an(f[0]?.date)),L("span",null,m.join(" · ")||"暂无峰值"),L("span",null,an(f.at(-1)?.date))),L("div",{className:`codex-stats-focus ${W?"active":""}`,"data-testid":"codex-stats-focus"},W?L(w1.default.Fragment,null,L("div",null,L("strong",null,an(W.row?.date)),L("span",null,`${W.label} · ${W.valueLabel}`)),L("div",{className:"codex-stats-focus-metrics"},L("code",null,`${pu(W.row?.executedTasks)} exec`),L("code",null,`${pu(W.row?.retryAttempts)} retry`),L("code",null,ln(W.row?.avgDurationMs??void 0)))):L("span",null,U))),L("div",{className:"codex-stats-summary-grid"},L("article",null,L("span",null,"今日执行"),L("strong",null,String(pu(t.executedTasks))),L("code",null,an(t.date))),L("article",null,L("span",null,"今日重试"),L("strong",null,String(pu(t.retryAttempts))),L("code",null,`累计 ${pu(n.retryAttempts)}`)),L("article",null,L("span",null,"平均耗时"),L("strong",null,ln(n.avgDurationMs??void 0)),L("code",null,`${pu(n.durationSamples)} samples`))),L("div",{className:"codex-stats-daily-list","data-testid":"codex-stats-daily-list"},f.length===0?L("div",{className:`codex-stats-daily-row empty ${F.state}`,"data-testid":"codex-stats-day-empty"},L("span",null,j),L("b",null,N),L("b",null,"--"),L("code",null,F.state==="empty"?"true empty":"diagnostic")):f.slice(-7).map((B)=>L("div",{key:String(B?.date||""),className:`codex-stats-daily-row ${O===String(B?.date||"")?"active":""}`,"data-testid":`codex-stats-day-${String(B?.date||"unknown")}`},L("span",null,an(B?.date)),L("b",null,`${pu(B?.executedTasks)} exec`),L("b",null,`${pu(B?.retryAttempts)} retry`),L("code",null,ln(B?.avgDurationMs??void 0))))))}function _O({task:l,queueRows:u,busy:r,onMove:f}){let n=String(l?.id||""),t=Fy(l),[i,y]=kl(t);df(()=>{y(t)},[n,t]);let c=!n||r||["running","judging","retry_wait"].includes(String(l?.status||""));return L("div",{className:"codex-task-move-control","data-testid":"codex-task-queue-move-control"},L("label",null,"任务 queue",L("select",{value:i,disabled:!n||r,onChange:(_)=>y(String(_.target.value||t)),"data-testid":"codex-task-queue-move-select"},u.map((_)=>L("option",{key:String(_?.id||""),value:String(_?.id||"")},j1(_))))),L("button",{type:"button",className:"ghost-btn",disabled:c||i===t,onClick:()=>f(i),title:c?"运行中 / judging / retry_wait 的任务不能移动;请先打断或等当前 turn 结束":"移动已创建任务到另一个 queue","data-testid":"codex-task-queue-move-button"},"移动"))}function zQ(l,u=4){let r=(Array.isArray(l)?l:[]).map((n)=>String(n||"").trim()).filter(Boolean);if(r.length===0)return"--";let f=r.slice(0,u).join(" / ");return r.length>u?`${f} +${r.length-u}`:f}function AO({task:l,loading:u,onLoadPromptPart:r,testId:f="codex-initial-prompt-full",textTestId:n="codex-initial-prompt-full-text",baseTextTestId:t="codex-initial-prompt-base"}){let i=I2(l),y=p3(l),c=K3(l).trimEnd(),_=String(y.full?.text||""),A=pz(l),F=Number(i.promptChars||l?.promptChars||_.length),j=Number(i.basePromptLines||si(c)),N=Number(i.promptLines||si(_));return L("section",{className:"codex-progressive-card codex-progressive-prompt","data-testid":"codex-progressive-prompt"},L("div",{className:"codex-progressive-card-head"},L("span",{className:"codex-output-channel"},"Prompt"),L("strong",null,"Submitted prompt / 原始用户 prompt"),L("code",null,`${j||si(c)} lines / ${c.length} chars`)),L("pre",{className:"codex-prompt-full","data-testid":t},c||"空 prompt"),A?L("details",{className:"codex-reference-injection codex-progressive-full-prompt","data-testid":f,onToggle:(U)=>{if(U.currentTarget?.open&&!_)r?.("full")}},L("summary",null,L("span",null,"引用注入已折叠,点击按需拉取最终进入 Code agent 的完整 prompt"),L("code",null,_?`${N||si(_)} lines / ${_.length} chars`:`${Number.isFinite(F)&&F>0?F:"--"} chars`)),L("pre",{className:"codex-prompt-full codex-prompt-final-full","data-testid":n},_||(u?"正在按需拉取完整 prompt...":"展开后将只请求 full prompt,不拉取完整 transcript。"))):null)}function dQ({task:l,attempt:u,attemptIndex:r,loading:f,onLoadSteps:n,onLoadStep:t,testId:i="codex-execution-summary"}){let y=Pz(sQ(l,r)),c=Cz(Gz(l,u)),_=u?Nz(l,u):a2(l),A=s2(l),F=E3(l,r),j=un(_?.errorCount),N=YQ(y.length>0?y.length:null,u?.stepCount,u?.execution?.stepCount,c.traceLineCount,c.stepCount,u?.outputCount),U=un(_?.stepCount??_?.llmStepCount),w=U??N,G=un(_?.readCount),J=un(_?.editCount),Q=un(_?.runCount),m=U??N,q=U!==null?"oa-event-flow":N!==null?"raw-trace":vt(l)?"syncing":"unavailable",W=w===null?q==="syncing"?"sync":"N/A":String(w),p=m===null?q==="syncing"?"sync":"N/A":`${m}${q==="raw-trace"?" raw":""}`,O=q==="oa-event-flow"?"STEP 来自 OA Event Flow 统计中心":q==="raw-trace"?"OA STEP 统计不可用,当前显示 raw trace fallback 行数":q==="syncing"?"STEP 统计同步中;展开后会按需读取当前 attempt trace":"当前 attempt 没有可用 STEP 统计",Z=Array.isArray(c.editedFiles)?c.editedFiles:[],V=Array.isArray(c.commands)?c.commands:[],H=d2(u,r)?` · ${String(u?.label||"recovered thread execution")}`:r?` #${r}`:"",B=Wz(l,u,r,c),C=`最近更新: ${J1(B)}`,E=Kz(l,u,r);return L("details",{className:`codex-progressive-card codex-execution-summary ${E?"running":""}`,"data-testid":i,"data-attempt-index":B3(r),"data-running":E?"true":"false",onToggle:(D)=>{if(D.currentTarget?.open&&!F)n?.(r)}},L("summary",null,L("div",{className:"codex-progressive-card-head"},L("span",{className:"codex-output-channel"},"Summary"),L("strong",null,`执行过程摘要${H}`),E?L("span",{className:"codex-summary-running-pill","data-testid":`${i}-running`},"执行中"):null,L("code",{title:`${B?`最近更新: ${Ll(B)}`:C};${O}`},`${ln(c.durationMs??c.totalElapsedMs)} / ${W} tools / ${C}`)),L("div",{className:"codex-execution-digest"},L("span",{title:"来自 OA Event Flow 统计中心"},`read ${G===null?"--":G}`),L("span",{title:"来自 OA Event Flow 统计中心"},`edit ${J===null?"--":J}`),L("span",{title:"来自 OA Event Flow 统计中心"},`run ${Q===null?"--":Q}`),L("span",{title:O,"data-testid":`${i}-step-count`,"data-step-state":q},`STEP ${p}`),j!==null&&j>0?L("span",{className:"codex-execution-error-pill","data-testid":`${i}-error-count`},`Error ${j}`):null)),L("div",{className:"codex-execution-digest expanded"},L("span",null,`修改文件:${zQ(Z,6)}`),L("span",null,`执行命令:${zQ(V,4)}`)),y.length===0?L("div",{className:"codex-output-empty"},f?"正在按需拉取步骤 summary...":"展开后将只请求执行步骤 summary,不拉取单步骤全量。"):L("div",{className:"codex-trace-step-list"},y.map((D)=>{let Y=String(D?.seq??""),v=A[Y],K=Array.isArray(D?.summaryLines)?D.summaryLines.slice(0,4):[],X=K.find((I)=>String(I||"").trim().length>0);return L("details",{key:Y||`${D?.title}-${D?.at}`,className:`codex-trace-step ${String(D?.kind||"message")} ${Zz(D)?"error":""}`,"data-testid":`codex-trace-step-${Y||"unknown"}`,onToggle:(I)=>{if(I.currentTarget?.open&&!v)t?.(D?.seq)}},L("summary",null,L("span",{className:"codex-output-channel"},FO(D?.kind)),L("strong",null,String(D?.title||"Trace step")),D?.status?L("code",null,String(D.status)):null,X?L("span",{className:"codex-trace-step-inline-summary",title:String(X)},String(X)):null,L("time",null,Ll(D?.at))),L("div",{className:"codex-trace-step-summary"},K.length>0?K.map((I,o)=>L("pre",{key:`${Y}-${o}`},String(I||""))):L("span",null,"无 summary")),v?.line?L(w3,{items:[v.line],autoScroll:!1,loading:!1,hasDetail:!0,emptyText:"无步骤详情",testId:`codex-trace-step-detail-${Y||"unknown"}`,className:"codex-transcript codex-step-detail-transcript",collapseTools:!1}):L("div",{className:"codex-output-empty"},f?"正在按需拉取这个步骤的全量数据...":"展开后将只请求这个单步骤的全量数据。"))})))}function FO(l){let u=String(l||"");if(u==="ran")return"Ran";if(u==="explored")return"Explored";if(u==="edited")return"Edited";if(u==="error")return"Error";if(u==="system")return"System";return"Message"}function eQ({task:l,attempt:u,attemptIndex:r,testId:f="codex-final-response"}){let n=Tz(l,u);if(n.length===0)return null;let t=Number(u?.finalResponseChars||n.length),i=r?` #${r}`:"";return L("section",{className:"codex-progressive-card codex-final-response","data-testid":f,"data-attempt-index":B3(r)},L("div",{className:"codex-progressive-card-head"},L("span",{className:"codex-output-channel"},"Final"),L("strong",null,`最终 response${i}`),L("code",null,`${Number.isFinite(t)?t:n.length} chars`)),L(c1,{markdown:n,className:"codex-transcript-body codex-markdown",testId:`${f}-markdown`}))}function lm({task:l,attempt:u,attemptIndex:r,testId:f="codex-progressive-judge"}){let n=hQ(l,u,r);if(!n?.decision)return null;let t=r?` #${r}`:"";return L("section",{className:"codex-progressive-card codex-progressive-judge","data-testid":f,"data-attempt-index":B3(r)},L("div",{className:"codex-progressive-card-head"},L("span",{className:"codex-output-channel"},"Judge"),L("strong",null,`完成判定${t}`),L("code",null,`${n.decision} ${Math.round(Number(n.confidence||0)*100)}%`)),L("div",{className:"codex-judge-card","data-testid":`${f}-card`},L(Ri,{status:n.decision},n.decision),L("strong",null,`${Math.round(Number(n.confidence||0)*100)}% confidence`),L("p",{"data-testid":`${f}-reason`},n.reason||"--"),L(CQ,{judge:n,testId:`${f}-failure-details`}),n.continuePrompt?L("pre",{"data-testid":`${f}-continue-prompt`},String(n.continuePrompt||"")):null))}function jO({task:l,attempt:u,attemptIndex:r,loading:f,onLoadPromptPart:n,testId:t="codex-judge-feedback-prompt"}){let i=Ez(l,u,r);if(i===null)return null;let y=MQ(r),_=p3(l)[y],A=String(_?.text||"").trimEnd(),F=String(i.preview||i.text||"").trimEnd(),j=A||String(i.text||"").trimEnd(),N=Number(_?.chars||i.chars||j.length||F.length),U=Number(_?.lines||i.lines||si(j||F)),w=_?.forAttempt||i.forAttempt||Number(r||0)+1;return L("details",{className:"codex-progressive-card codex-judge-feedback-prompt","data-testid":t,"data-attempt-index":B3(r),onToggle:(G)=>{if(G.currentTarget?.open&&!A)n?.("feedback",r)}},L("summary",null,L("div",{className:"codex-progressive-card-head"},L("span",{className:"codex-output-channel"},"Prompt"),L("strong",null,`judge feedback prompt #${r} -> #${w}`),L("code",null,`${U||"--"} lines / ${Number.isFinite(N)?N:F.length} chars`)),L("p",{className:"codex-feedback-preview","data-testid":`${t}-preview`},F||"展开后按需拉取 judge feedback prompt。")),L("pre",{className:"codex-prompt-full codex-feedback-full","data-testid":`${t}-text`},j||(f?"正在按需拉取 judge feedback prompt...":"展开后将只请求这一次 judge feedback prompt。")))}function NO({task:l,attempt:u,position:r,loading:f,onLoadPromptPart:n,onLoadSteps:t,onLoadStep:i}){let y=hz(u,r),c=o2(l,y),_=r===0&&!c,A=d2(u,y),F=A?String(u?.label||"Recovered thread execution"):`Attempt ${y}`;return L("section",{className:"codex-attempt-cycle","data-testid":`codex-attempt-cycle-${y}`},L("div",{className:"codex-attempt-cycle-head"},L("span",{className:"codex-output-channel"},F),L("strong",null,String(u?.mode||(y<=1?"initial":"retry"))),u?.terminalStatus?L(Ri,{status:u.terminalStatus},u.terminalStatus):null,L("code",null,`${Ll(u?.startedAt)} -> ${Ll(u?.finishedAt)}`)),L(dQ,{task:l,attempt:u,attemptIndex:y,loading:f,onLoadSteps:t,onLoadStep:i,testId:c?"codex-execution-summary-current":_?"codex-execution-summary":`codex-execution-summary-attempt-${y}`}),A?null:L(eQ,{task:l,attempt:u,attemptIndex:y,testId:c?"codex-final-response-current":_?"codex-final-response":`codex-final-response-attempt-${y}`}),A?null:L(lm,{task:l,attempt:u,attemptIndex:y,testId:c?"codex-progressive-judge-current":_?"codex-progressive-judge":`codex-progressive-judge-attempt-${y}`}),A?null:L(jO,{task:l,attempt:u,attemptIndex:y,loading:f,onLoadPromptPart:n,testId:c?"codex-judge-feedback-prompt-current":_?"codex-judge-feedback-prompt":`codex-judge-feedback-prompt-attempt-${y}`}))}function JO({task:l,loading:u,onLoadPromptPart:r,onLoadSteps:f,onLoadStep:n}){if(!l)return L(Ny,{title:"未选择任务",text:"从左侧队列选择任务,或提交新 Codex 任务。"});let t=Lz(l);return L("div",{className:"codex-transcript codex-progressive-trace","data-testid":"codex-output"},u&&!Jr(l)?L("div",{className:"codex-output-empty"},"正在加载 Trace Summary..."):null,L(AO,{task:l,loading:u,onLoadPromptPart:r}),t.length>0?t.map((i,y)=>L(NO,{key:`${i?.index||y+1}-${i?.startedAt||y}`,task:l,attempt:i,position:y,loading:u,onLoadPromptPart:r,onLoadSteps:f,onLoadStep:n})):[L(dQ,{key:"execution",task:l,loading:u,onLoadSteps:f,onLoadStep:n}),L(eQ,{key:"final",task:l}),L(lm,{key:"judge",task:l})])}function UO({task:l}){let u=cz(l);if(!l||u.length===0)return L(Ny,{title:"暂无原始消息",text:"原始 Codex app-server 消息会保留在任务 JSON 中。"});return L("details",{className:"codex-raw-output"},L("summary",null,`原始 messages (${u.length})`),L("div",null,u.map((r)=>L("article",{key:`${r.seq}-${r.channel}`,className:`codex-output-line ${r.channel||"system"}`},L("div",{className:"codex-output-meta"},L("span",{className:"codex-output-channel"},xz(String(r.channel||"system"))),L("span",null,Ll(r.at)),r.method?L("code",null,r.method):null),L("pre",null,String(r.text||""))))))}function QO({task:l}){let u=$z(l).slice().reverse();if(u.length===0)return L(Ny,{title:"尚无 attempt",text:"任务开始运行后,这里会记录 Codex 终态、传输中断和 stderr tail。"});return L("div",{className:"table-wrap codex-attempt-table"},L("table",null,L("thead",null,L("tr",null,L("th",null,"#"),L("th",null,"模式"),L("th",null,"终态"),L("th",null,"传输"),L("th",null,"退出"),L("th",null,"完成时间"))),L("tbody",null,u.map((r)=>L("tr",{key:`${r.index}-${r.startedAt}`},L("td",null,r.index),L("td",null,r.mode),L("td",null,L(Ri,{status:r.terminalStatus||"unknown"},r.terminalStatus||"unknown")),L("td",null,r.transportClosedBeforeTerminal?L(Ri,{status:"failed"},"closed-before-terminal"):L(Ri,{status:"succeeded"},"normal")),L("td",null,`code=${r.appServerExitCode??"--"} signal=${r.appServerSignal??"--"}`),L("td",null,Ll(r.finishedAt)))))))}function um({microservices:l,onRaw:u,apiBaseUrl:r="/api",initialTasksData:f=null,standalone:n=!1}){let t=l.find((z)=>z.id==="code-queue")||null,i=EQ(f),y=String(i?.id||""),c=new Map;if(i!==null&&y.length>0)c.set(y,{task:i,maxSeq:F1(Array.isArray(i.transcript)?i.transcript:[]),complete:Boolean(i._transcriptComplete),completeUpdatedAt:i._transcriptComplete?String(i.updatedAt||""):""});let _=typeof performance>"u"?0:performance.now(),A=xu(y),F=xu(0),j=xu(0),N=xu(0),U=xu(!1),w=xu(!1),G=xu(!1),J=xu(null),Q=xu(new Map),m=xu(new Map),q=xu(new Map),W=xu(new Map),p=xu(new Set),O=xu(null),Z=xu(null),V=xu(!1),P=xu(!1),H=xu(Boolean(f)),B=xu(new Map),C=xu(new Set),E=xu(c),D=xu(f),[Y,v]=kl(null),[K,X]=kl(f),[I,o]=kl(ol(f?.statistics)),[fl,yl]=kl(y),[h,s]=kl(i),[ul,tl]=kl(!1),[Al,Kl]=kl(""),[wl,El]=kl(null),[M,d]=kl(!1),[nl,k]=kl(!1),g=f?.queue||{},cl=String(g?.mainProviderId||g?.defaultProviderId||"D601").trim()||"D601",[pl,Hl]=kl(""),[bl,_u]=kl(""),[tu,Nu]=kl("default"),[gl,zr]=kl(dn),[nf,lr]=kl(!1),[tf,Or]=kl(""),[Nl,al]=kl(cl),[gu,hl]=kl("default"),[yr,Zr]=kl("gpt-5.5"),[cr,ku]=kl(N1(g,"default",cl)||"/workspace"),[Gf,Vn]=kl(99),[Rr,ay]=kl(1),[_t,At]=kl(!1),[e,Dl]=kl(!1),[Cl,lu]=kl(""),[mu,au]=kl(""),[yu,ur]=kl(""),[Sn,Z8]=kl(!0),[oy,dy]=kl(()=>typeof window>"u"?!0:window.matchMedia(op).matches),[Tu,K$]=kl(!1),[H8,ju]=kl(""),[wj,Su]=kl(""),{addNotification:mr}=Xr(),[A0,E$]=kl(""),[ey,p$]=kl(""),[lc,z$]=kl(!1),[O$,Ft]=kl(null),[F0,j0]=kl(!1),[xr,Wf]=kl(f?{phase:"complete",taskId:y,queueMs:0,detailMs:0,totalMs:_,chunks:i?1:0,transcriptRows:Array.isArray(i?.transcript)?i.transcript.length:0,partial:Boolean(f?.selected?.hasMore||A1(i)),completedAt:new Date}:null),[Z$,N0]=kl(f?new Date:null),[uc,rc]=kl(!1),$n=An(Cu(K)),H$=$n.filter(on),Ou=K?.queue||Y?.body?.queue||Y?.queue||{},B8=kp(Ou,Y),D8=I||gz(K,Ou),B$=Ln(K),hf=NQ(Ou,tu),Ui=String(tu||"default").trim()||"default",jt=hf.filter((z)=>String(z?.id||"")!==Ui),J0=Ay(hf,gl),Nt=Number((Cr(gl)?Ou?.total:J0?.total)??B$.total??$n.length),fc=$y(Ou),qj=Cr(gl)?fc:[String(Ay(hf,gl)?.activeTaskId||"")].filter(Boolean),Yn=JQ(Ou,hf,gl,$n),Lj=Cr(gl)?D2(Ou):D2(J0||{}),D$=D2(Ou),V$=bz(D$),NW=Math.max(vz(D$),fc.length),JW=pu((Cr(gl)?Ou?.unreadTerminal:J0?.unreadTerminal)??H$.length),U0=K?H$.length:JW,S$=Cr(gl)?"All queues":M2(J0||{id:gl,name:gl}),Q0=h2(Al),yf=Q0.length>0,Gj=yf?An(Cu(wl)):[],V8=Ln(wl),_n=yf?Gj:$n,Wj=_n.filter(on),UW=_n.filter((z)=>!ef(z)).sort(vp),QW=_n.filter((z)=>ef(z)&&!on(z)),Tj=yf?V8:B$,m0=yf?Number(V8.total??Gj.length):Nt,Kj=Tj.hasMore===!0&&String(Tj.nextBeforeId||"").length>0,S8=yf?nl:uc,mW=t?Rp(t):{},wW=t?xp(t):{},Y8=AQ(()=>_z(pl),[pl]),Xn=AQ(()=>{let z=mQ(Rr);return Y8.flatMap((S)=>Array.from({length:z},()=>Az(S,bl)))},[Y8,Rr,bl]),nc=Xn.length,Ej=nc>1&&!_t,qW=e||Tu||nc===0||Ej,pj=uO(Ou,yr),Y$=rO(Ou,Nl),zj=fO(Ou,gu),Oj=N1(Ou,gu,Nl),LW=Array.isArray(O$?.workdirs)?O$.workdirs:[],Zj=tO(Ou,LW,Nl,gu,cr),X8=Zj.some((z)=>z.source==="saved"&&jy(z.path)===jy(cr)),P8=h?.id&&h?.activeTurnId&&String(h?.status)==="running",GW=h?.id&&!["succeeded","failed","canceled"].includes(String(h?.status||"")),WW=h?.id&&["succeeded","failed","canceled"].includes(String(h?.status||"")),w0=h?.id&&vQ(h);function Hr(z){let S=typeof z==="function"?z(D.current):z;D.current=S;let a=ol(S?.statistics);if(a)o(a);return X(S),S}async function Hj(z=gl){if(!t)return;try{let S=await uz(r,z),a=ol(S?.statistics)||ol(S?.stats)||ol(S);if(a)o(a);if(S?.queue)Hr((rl)=>rl?{...rl,queue:S.queue}:{ok:!0,queue:S.queue,tasks:[],pagination:{returned:0,total:0,hasMore:!1}})}catch(S){o(GQ(S))}}function TW(z,S,a=!0){let rl=Array.from(new Set(z.map((jl)=>String(jl||"")).filter(Boolean)));for(let jl of rl)if(B.current.set(jl,S),a)C.current.add(jl);return rl}function Bj(z){for(let S of z.map((a)=>String(a||"")).filter(Boolean))B.current.delete(S),C.current.delete(S)}function X$(z){let S=String(z?.id||""),a=S?B.current.get(S):void 0;if(!a)return z;if(String(z?.status||"").length>0&&!ef(z))return B.current.delete(S),C.current.delete(S),z;return{...z,readAt:z?.readAt||a,terminalUnread:!1}}function C8(z){let S=String(z?.id||"");return S.length>0&&C.current.has(S)&&ef(z)}function An(z,S=!0){let a=[];for(let rl of Array.isArray(z)?z:[]){let jl=X$(rl);if(S&&C8(jl))continue;a.push(jl)}return a}function KW(z,S=!0){if(!z||!Array.isArray(z?.tasks))return z;let a=An(Cu(z),S),rl=Ln(z);return{...z,tasks:a,pagination:z.pagination?{...rl,returned:a.length}:z.pagination}}function h8(z,S){return Cr(S)||Fy(z)===S}function M8(z){let S=Q0.toLowerCase();if(S.length===0)return!0;return[z?.id,z?.status,z?.queueId,z?.providerId,z?.model,z?.cwd,z?.displayPrompt,z?.basePrompt,z?.prompt,T3(z?.displayPromptPreview),T3(z?.basePromptPreview),T3(z?.promptPreview),z?.finalResponse,z?.lastError?.message].map((rl)=>String(rl||"").toLowerCase()).join(` +`).includes(S)}function EW(z,S){let a=z.filter((Zl)=>String(Zl?.id||"").length>0);if(a.length===0&&!S)return;let rl=a[0]||null,jl=String(rl?.id||""),Wl=a.filter((Zl)=>h8(Zl,gl)),Gl=Wl.filter(M8),sl=String(S?.activeTaskId||$y(S)[0]||jl||Yn||"");for(let Zl of a){let Yl=String(Zl?.id||"");if(!Yl)continue;let Rl=Array.isArray(Zl?.transcript)?Zl.transcript:[];E.current.set(Yl,{...E.current.get(Yl)||{},task:{...Zl,_summaryLoaded:!0,_detailLoaded:Rl.length>0,_transcriptComplete:!1,_transcriptPreview:!1},maxSeq:F1(Rl),complete:!1,completeUpdatedAt:""})}if(Hr((Zl)=>{if(!Zl&&(Wl.length===0||!S))return Zl;let Yl=Cu(Zl),Rl=An(Gn([Yl,Wl],sl));return{...Zl||{},queue:S||Zl?.queue,tasks:Rl,pagination:Zl?.pagination?{...Ln(Zl),returned:Rl.length}:Zl?.pagination}}),yf)El((Zl)=>{if(!Zl||Gl.length===0)return Zl;let Yl=An(Gn([Cu(Zl),Gl],sl));return{...Zl,queue:S||Zl.queue,tasks:Yl,pagination:Zl.pagination?{...Ln(Zl),returned:Yl.length}:Zl.pagination}});if(rl&&h8(rl,gl)&&M8(rl))N.current+=1,A.current=jl,yl(jl),s(E.current.get(jl)?.task||rl),tl(!1),Wf({phase:"complete",taskId:jl,queueMs:0,detailMs:0,totalMs:0,chunks:1,transcriptRows:Array.isArray(rl?.transcript)?rl.transcript.length:0,partial:!0,completedAt:new Date});N0(new Date)}function pW(z){let S=String(z||Ou?.mainProviderId||"D601").trim()||"D601";al(S),ku(N1(Ou,gu,S)),Ft(null),b8().catch((a)=>ju(Hu(a,"加载工作目录失败")))}function zW(z){let S=String(z||"default").trim()||"default",a=Nl;if(S==="windows-native"){if(!Y$.find((jl)=>jl.id===Nl)?.supportsWindowsNativeCodex)a=String(Y$.find((jl)=>jl.supportsWindowsNativeCodex)?.id||Nl||"D601"),al(a)}hl(S),ku(N1(Ou,S,a)),Ft(null),b8().catch((rl)=>ju(Hu(rl,"加载工作目录失败")))}function P$(z,S,a=null,rl=null){let jl=new Set(TW(z,S));if(jl.size===0&&rl===null&&a===null)return;Hr((Wl)=>{if(!Wl)return Wl;let Gl=Cu(Wl).flatMap((sl)=>{let Zl=String(sl?.id||"");if(!jl.has(Zl)){let Au=X$(sl);return C8(Au)?[]:[Au]}let Yl=rl&&String(rl?.id||"")===Zl?rl:{},Rl={...sl,...Yl,readAt:S,terminalUnread:!1};return C8(Rl)?[]:[Rl]});return{...Wl,queue:a||Wl.queue,tasks:jl.size>0?Gn([Gl],Yn):Gl}});for(let Wl of jl){let Gl=E.current.get(Wl);if(Gl?.task){let sl=rl&&String(rl?.id||"")===Wl?rl:{},Zl={...Gl.task,...sl,readAt:S,terminalUnread:!1};if(E.current.set(Wl,{...Gl,task:Zl}),A.current===Wl)s(Zl)}}}df(()=>{At(!1)},[pl,Rr,bl]),df(()=>{let z=h2(Al);j.current+=1;let S=j.current;if(!t||z.length===0){El(null),d(!1),k(!1),G.current=!1;return}d(!0),El(null);let a=window.setTimeout(()=>{(async()=>{try{let rl=await UQ(r,gl,z);if(S!==j.current)return;El(KW(rl))}catch(rl){if(S===j.current)El(null),ju(Hu(rl,"搜索 Codex tasks 失败"))}finally{if(S===j.current)d(!1)}})()},240);return()=>window.clearTimeout(a)},[t?.id,r,gl,Al]),df(()=>{au(h?K3(h):""),ur(Array.isArray(h?.referenceTaskIds)?h.referenceTaskIds.join(" "):"")},[fl]);function Mf(z,S,a){let rl=E.current.get(z)||{},jl=rl.task||{},Wl=Array.isArray(jl.transcript)?jl.transcript:[],Gl=KQ(jl,S),sl=Object.prototype.hasOwnProperty.call(S,"transcript")?P2(Wl,Array.isArray(S.transcript)?S.transcript:[]):Wl,Zl={...jl,...Gl,transcript:sl,output:Array.isArray(Gl.output)?x2(jl,Gl,"output"):Array.isArray(jl.output)?jl.output:[],events:Array.isArray(Gl.events)?x2(jl,Gl,"events"):Array.isArray(jl.events)?jl.events:[]},Yl=X$(Zl),Rl=String(Yl?.updatedAt||""),Au=Boolean(S._transcriptComplete)&&ef(Yl),rr=Boolean(rl.complete)&&ef(Yl)&&String(rl.completeUpdatedAt||"")===Rl,fu=Au||rr,$r={...rl,task:Yl,maxSeq:F1(sl),complete:fu,completeUpdatedAt:fu?Rl:""};if(E.current.set(z,$r),a===N.current&&A.current===z)s(Yl);return $r}async function Jt(z,S=!1,a,rl){if(!t||!z)return;let Wl=E.current.get(z)?.task;if(!S&&G3(Wl))return;let Gl=z,sl=Q.current.get(Gl);if(sl){if(S||!G3(Wl))sl.refreshAfter=!0;return sl.promise}let Zl=N.current,Yl=performance.now();if(A.current===z)tl(!0);let Rl={promise:Promise.resolve(),refreshAfter:!1},Au=(async()=>{try{let rr=await rz(r,z);if(Zl!==N.current||A.current!==z)return;let fu=rr?.summary||{},$r=String(fu.updatedAt||"");Mf(z,{id:z,status:fu.status,updatedAt:$r,startedAt:fu.startedAt,finishedAt:fu.finishedAt,currentAttempt:fu.currentAttempt,maxAttempts:fu.maxAttempts,finalResponse:fu.finalResponse,lastJudge:fu.lastJudge,lastError:fu.lastError,attempts:Array.isArray(fu.attempts)?fu.attempts:[],stepCount:fu.stepCount,llmStepCount:fu.llmStepCount,traceStats:fu.traceStats,statsSource:fu.statsSource,timing:fu.timing,_traceSummary:fu,_traceSummaryLoaded:!0,_traceSummaryUpdatedAt:$r,_detailLoaded:!0},Zl),Wf({phase:"complete",taskId:z,queueMs:rl??0,detailMs:performance.now()-Yl,totalMs:a===void 0?performance.now()-Yl:performance.now()-a,chunks:1,transcriptRows:Number(fu?.execution?.traceLineCount||fu?.execution?.stepCount||0),partial:!1,completedAt:new Date})}finally{let rr=Boolean(Rl.refreshAfter&&A.current===z&&!G3(E.current.get(z)?.task));if(Q.current.delete(Gl),Zl===N.current&&A.current===z)tl(!1);if(rr)window.setTimeout(()=>{Jt(z,!0).catch((fu)=>ju(Hu(fu,"自动刷新 Trace Summary 失败")))},0)}})();Rl.promise=Au,Q.current.set(Gl,Rl),await Au}async function OW(z,S=null){let a=A.current;if(!t||!a||!z)return;let rl=E.current.get(a)?.task,jl=p3(rl),Wl=z==="feedback"||z==="judge-feedback"?MQ(S):z;if(jl[Wl]?.text)return;let Gl=`${a}:${Wl}`,sl=m.current.get(Gl);if(sl)return sl;let Zl=N.current;if(A.current===a)tl(!0);let Yl=(async()=>{try{let Rl=await fz(r,a,z,S);if(Zl!==N.current||A.current!==a)return;let Au=E.current.get(a)?.task,rr=p3(Au);Mf(a,{...z==="full"?{prompt:String(Rl?.text||""),promptChars:Number(Rl?.chars||0)}:{},_promptDetails:{...rr,[Wl]:Rl}},Zl)}finally{if(m.current.delete(Gl),Zl===N.current&&A.current===a)tl(!1)}})();m.current.set(Gl,Yl),await Yl}async function C$(z=null,S={}){let a=A.current;if(!t||!a)return;let rl=E.current.get(a)?.task,jl=z===null||z===void 0||String(z).length===0?"":String(z),Wl=E3(rl,jl||null),Gl=Boolean(S.force),sl=Boolean(S.incremental);if(Wl&&!Gl)return;let Zl=sQ(rl,jl||null),Yl=sl&&Zl.length>0?zz(Zl):0,Rl=`${a}:${jl||"all"}:${Yl}`,Au=q.current.get(Rl);if(Au)return Au;let rr=N.current;if(A.current===a)tl(!0);let fu=(async()=>{try{let $r=await nz(r,a,Yl,500,jl||null);if(rr!==N.current||A.current!==a)return;let Fn=Array.isArray($r?.steps)?$r.steps:[],Pn=Yl>0?Oz(Zl,Fn):Fn;if(jl){let Ut=E.current.get(a)?.task,q0=ol(Ut?._traceStepsByAttempt)||{},sf=ol(Ut?._traceStepsLoadedByAttempt)||{},Tf=ol(Ut?._traceStepsNextAfterSeqByAttempt)||{};Mf(a,{_traceStepsByAttempt:{...q0,[jl]:Pn},_traceStepsLoadedByAttempt:{...sf,[jl]:!0},_traceStepsNextAfterSeqByAttempt:{...Tf,[jl]:$r?.nextAfterSeq}},rr)}else Mf(a,{_traceSteps:Pn,_traceStepsLoaded:!0,_traceStepsHasMore:Boolean($r?.hasMore),_traceStepsNextAfterSeq:$r?.nextAfterSeq},rr)}finally{if(q.current.delete(Rl),rr===N.current&&A.current===a)tl(!1)}})();q.current.set(Rl,fu),await fu}async function ZW(z){let S=A.current,a=String(z??"");if(!t||!S||a.length===0)return;let rl=E.current.get(S)?.task;if(s2(rl)[a]?.line)return;let Wl=`${S}:${a}`,Gl=W.current.get(Wl);if(Gl)return Gl;let sl=N.current;if(A.current===S)tl(!0);let Zl=(async()=>{try{let Yl=await tz(r,S,z);if(sl!==N.current||A.current!==S)return;let Rl=E.current.get(S)?.task,Au=s2(Rl);Mf(S,{_traceStepDetails:{...Au,[a]:Yl}},sl)}finally{if(W.current.delete(Wl),sl===N.current&&A.current===S)tl(!1)}})();W.current.set(Wl,Zl),await Zl}function HW(z){if(A.current!==z)return;let S=E.current.get(z)?.task;if(!S)return;if(E3(S,null))C$(null,{force:!0,incremental:!0}).catch((rl)=>ju(Hu(rl,"增量刷新 Trace Steps 失败")));let a=ol(S?._traceStepsLoadedByAttempt)||{};for(let rl of Object.keys(a).filter((jl)=>a[jl]))C$(rl,{force:!0,incremental:!0}).catch((jl)=>ju(Hu(jl,"增量刷新 Attempt Trace Steps 失败")))}async function TC(z,S,a){if(!t||!z)return;let rl=performance.now(),jl=N.current,Wl=E.current.get(z);if(Wl?.task){if(s(Wl.task),tl(A1(Wl.task)||!Wl.complete),!A1(Wl.task)&&Wl.complete&&ef(Wl.task)&&String(Wl.completeUpdatedAt||"")===String(Wl.task?.updatedAt||"")){Wf({phase:"complete",taskId:z,queueMs:a??0,detailMs:0,totalMs:S===void 0?0:performance.now()-S,chunks:0,transcriptRows:Array.isArray(Wl.task.transcript)?Wl.task.transcript.length:0,completedAt:new Date});return}}else tl(!0);let Gl=J.current;if(Gl?.taskId===z&&Gl.token===jl)return Gl.promise;let sl=(async()=>{try{let Zl=await Bu(Du(r,`/api/tasks/${encodeURIComponent(z)}?meta=1`));if(jl!==N.current||A.current!==z)return;let Yl=E.current.get(z),Rl=Array.isArray(Yl?.task?.transcript)?Yl.task.transcript:[],Au=Zl?.task||{},rr=Boolean(Yl?.complete)&&String(Yl?.completeUpdatedAt||"")===String(Au?.updatedAt||"");Mf(z,{...Au,summaryOnly:!1,_metaLoaded:!0,transcript:Rl,_detailLoaded:Rl.length>0,_transcriptComplete:rr},jl);let fu=A1(Yl?.task)||Boolean(Yl?.task?._transcriptPreview),$r=fu?0:Rl.length>0?pQ(Rl):0,Fn=!fu&&Yl?.complete&&ef(Au)&&String(Yl?.completeUpdatedAt||"")===String(Au?.updatedAt||"")?F1(Rl):$r,Pn=!0,Ut=0,q0=Rl.length;while(Pn){let sf=await Bu(Du(r,`/api/tasks/${encodeURIComponent(z)}/transcript?afterSeq=${encodeURIComponent(String(Fn))}&limit=${hp}&fullText=1`));if(jl!==N.current||A.current!==z)return;let Tf=E.current.get(z),L0=Array.isArray(Tf?.task?.transcript)?Tf.task.transcript:[],Qi=P2(L0,Array.isArray(sf?.transcript)?sf.transcript:[]);Ut+=1,q0=Qi.length;let Mu=Boolean(!sf?.hasMore);if(Mf(z,{status:sf?.status||Au.status,updatedAt:sf?.updatedAt||Au.updatedAt,transcript:Qi,_detailLoaded:Mu||Qi.length>0,_transcriptComplete:Mu,_transcriptPreview:fu&&!Mu},jl),Pn=Boolean(sf?.hasMore),Fn=Number(sf?.nextAfterSeq??F1(Qi)),!Pn)break;await new Promise((Mj)=>window.setTimeout(Mj,0))}Wf({phase:"complete",taskId:z,queueMs:a??0,detailMs:performance.now()-rl,totalMs:S===void 0?performance.now()-rl:performance.now()-S,chunks:Ut,transcriptRows:q0,completedAt:new Date})}finally{if(J.current?.taskId===z&&J.current?.token===jl)J.current=null;if(jl===N.current&&A.current===z)tl(!1)}})();J.current={taskId:z,token:jl,promise:sl},await sl}async function cf(z=A.current,S=!0,a=gl){if(!t)return;if(!S&&P.current)return;let rl=performance.now();if(S)P.current=!0;if(S)Wf({phase:"loading",taskId:String(z||A.current||""),startedAt:new Date});let jl=F.current+1;F.current=jl;let Wl=String(z||A.current||""),Gl=Wl?E.current.get(Wl):null,sl=Array.isArray(Gl?.task?.transcript)?Gl.task.transcript:[],Zl=pQ(sl),Yl=null,Rl=S&&Wl.length===0;if(Yl=Rl?await UQ(r,a,""):await B2(r,Wl,Zl,a,"",!0,{stats:!1}),jl!==F.current){if(S)P.current=!1;return}let Au=performance.now()-rl;v(Y||{});let rr=Yl?.queue||{},fu=String(rr?.activeTaskId||$y(rr)[0]||""),$r=Yl;Hr((su)=>{let Qt=Cu(Yl),$f=Cu(su),Kf=$f.length>0?Gn([$f,Qt],fu):Gn([Qt],fu),mt=An(Kf),h$=Ln(Yl),mi=Ln(su),g8=$f.length>Qt.length&&(mi.hasMore===!1||String(mi.nextBeforeId||"").length>0),yT={...h$,...g8?{hasMore:mi.hasMore,nextBeforeId:mi.nextBeforeId}:{},returned:mt.length};return $r={...Yl,tasks:mt,pagination:yT},$r});let Fn=Cu($r),Pn=NQ(rr,tu),Ut=JQ(rr,Pn,a,Fn),q0=lz(Pn,a,Fn),sf=Wl||A.current,Tf=$r?.selected||null,L0=Tf?.task||null,Qi=Array.isArray(Tf?.transcript)?Tf.transcript:null,Mu=sf||Ut||q0||Fn[0]?.id||"";if(A.current!==Mu)N.current+=1;A.current=Mu,yl(Mu);let G0=Fn.find((su)=>su.id===Mu);if(G0){let su=E.current.get(Mu);if(su?.task)E.current.set(Mu,{...su,task:{...G0,...su.task,status:G0.status,updatedAt:G0.updatedAt}})}if(Rl&&G0){if(Mf(Mu,{...G0,_summaryLoaded:!1,transcript:[],_detailLoaded:!1,_transcriptComplete:!1,_transcriptPreview:!0},N.current),tl(!0),Wf({phase:"complete",taskId:Mu,queueMs:Au,detailMs:0,totalMs:performance.now()-rl,chunks:0,transcriptRows:0,partial:!0,completedAt:new Date}),N0(new Date),S)P.current=!1;Jt(Mu,!0).catch((su)=>ju(Hu(su,"加载 Codex Trace Summary 失败"))),B2(r,Mu,0,a,"",!1).then((su)=>{if(jl!==F.current)return;let Qt=Cu(su),$f=EQ(su);if(Qt.length>0)Hr((Kf)=>{let mt=Gn([Cu(Kf),Qt],fu);return{...Kf,statistics:su?.statistics||Kf?.statistics,tasks:An(mt)}});if($f?.id===A.current){let Kf=Array.isArray($f.transcript)?$f.transcript:[];Mf($f.id,{...$f,transcript:Kf,_summaryLoaded:!0,_detailLoaded:Kf.length>0,_transcriptPreview:Boolean(su?.selected?.preview)},N.current)}}).catch(()=>{});return}if(L0?.id===Mu&&Qi!==null){let su=E.current.get(Mu),Qt=Array.isArray(su?.task?.transcript)?su.task.transcript:[],$f=P2(Qt,Qi),Kf=Boolean(Tf?.preview);if(Mf(Mu,{...L0,_summaryLoaded:!0,transcript:$f,_detailLoaded:!Tf?.hasMore||$f.length>0,_transcriptComplete:!Kf&&!Tf?.hasMore&&ef(L0),_transcriptPreview:Kf},N.current),tl(!1),S)Wf({phase:"complete",taskId:Mu,queueMs:Au,detailMs:Math.max(0,performance.now()-rl-Au),totalMs:performance.now()-rl,chunks:1,transcriptRows:$f.length,partial:Boolean(Kf||Tf?.hasMore||A1(L0)),completedAt:new Date});if(N0(new Date),S)P.current=!1;Jt(Mu,!1,S?rl:void 0,S?Au:void 0).catch((mt)=>ju(Hu(mt,"加载 Codex Trace Summary 失败"))),B2(r,Wl,Zl,a,"",!1).then((mt)=>{if(jl!==F.current)return;let h$=Cu(mt);if(h$.length>0)Hr((mi)=>{let g8=Gn([Cu(mi),h$],fu);return{...mi,tasks:An(g8)}})}).catch(()=>{});return}if(S)Wf({phase:"session",taskId:Mu,queueMs:Au,totalMs:Au,startedAt:new Date(Date.now()-Au)});if(Mu)Jt(Mu,!0,S?rl:void 0,S?Au:void 0).catch((su)=>ju(Hu(su,"加载 Codex Trace Summary 失败")));else if(N.current+=1,s(null),tl(!1),S)Wf({phase:"complete",taskId:"",queueMs:Au,detailMs:0,totalMs:performance.now()-rl,chunks:0,transcriptRows:0,completedAt:new Date});if(N0(new Date),S)P.current=!1;Hj(a).catch((su)=>o(GQ(su)))}async function Dj(){if(yf){if(!t||nl||G.current)return;let S=String(V8.nextBeforeId||"");if(!S)return;G.current=!0,k(!0),ju("");try{let a=await QQ(r,gl,S,ZQ,Q0),rl=Cu(a),jl=a?.queue||Ou||{},Wl=String(jl?.activeTaskId||$y(jl)[0]||Yn||"");El((Gl)=>{let sl=An(Gn([Cu(Gl),rl],Wl)),Zl=Ln(a);return{...Gl||{},queue:jl,tasks:sl,pagination:{...Zl,returned:sl.length}}})}catch(a){ju(Hu(a,"加载更多搜索结果失败"))}finally{G.current=!1,k(!1)}return}if(!t||uc||w.current)return;let z=String(Ln(K).nextBeforeId||"");if(!z)return;w.current=!0,rc(!0),ju("");try{let S=await QQ(r,gl,z),a=Cu(S),rl=S?.queue||Ou||{},jl=String(rl?.activeTaskId||$y(rl)[0]||Yn||"");Hr((Wl)=>{let Gl=An(Gn([Cu(Wl),a],jl)),sl=Ln(S);return{...Wl||{},queue:rl,statistics:S?.statistics||Wl?.statistics,tasks:Gl,pagination:{...sl,returned:Gl.length}}})}catch(S){ju(Hu(S,"加载更早 Codex tasks 失败"))}finally{w.current=!1,rc(!1)}}function BW(z){let S=z.currentTarget;if(!S||S8||!Kj)return;if(S.scrollHeight-S.scrollTop-S.clientHeight<120)Dj()}async function Br(z,S){K$(!0),ju("");try{await z()}catch(a){ju(Hu(a,S))}finally{K$(!1)}}async function s8(z){if(!z)return;try{let S=!1;try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(z),S=!0}catch{S=!1}if(!S){let rl=document.createElement("textarea");rl.value=z,rl.style.position="fixed",rl.style.opacity="0",document.body.appendChild(rl),rl.select(),S=document.execCommand("copy"),document.body.removeChild(rl)}if(!S)throw Error("browser clipboard rejected the copy request");E$(z);let a=`已复制任务 ID:${z}`;Su(a),mr("success",a),window.setTimeout(()=>E$((rl)=>rl===z?"":rl),1600)}catch(S){ju(`复制任务 ID 失败:${Hu(S)}`)}}function R8(z){if(!z)return;_u(z);let S=`已引用任务 ID:${z};提交时后端会读取并注入该任务上下文`;Su(S),mr("success",S)}async function x8(z){if(!t||!z)return;let S=new Date().toISOString();F.current+=1,P$([z],S,null,{id:z,readAt:S,terminalUnread:!1}),p$(z);let a=!1;if(await Br(async()=>{let rl=await iz(r,z),jl=rl?.task||{id:z,readAt:new Date().toISOString(),terminalUnread:!1},Wl=String(jl?.readAt||new Date().toISOString());P$([z],Wl,rl?.queue||null,jl),a=!0;let Gl=`已将任务 ${z} 标为已读`;Su(Gl),mr("success",Gl)},"标记 Codex task 已读失败"),!a)Bj([z]),cf(A.current,!1).catch((rl)=>ju(Hu(rl,"刷新 Codex tasks 失败")));p$((rl)=>rl===z?"":rl)}async function DW(){if(!t||lc)return;z$(!0);let z=new Date().toISOString(),S=Array.from(new Set([...Cu(D.current).filter(on).map((rl)=>String(rl?.id||"")).filter(Boolean),...Array.from(E.current.entries()).filter(([,rl])=>on(rl?.task)).map(([rl])=>rl)]));if(F.current+=1,S.length>0)P$(S,z);let a=!1;if(await Br(async()=>{let rl=await yz(r),jl=String(rl?.readAt||new Date().toISOString()),Wl=Cu(D.current).filter(on).map((Rl)=>String(Rl?.id||"")).filter(Boolean),Gl=Array.from(E.current.entries()).filter(([,Rl])=>on(Rl?.task)).map(([Rl])=>Rl),sl=Array.from(new Set([...S,...Wl,...Gl]));P$(sl,jl,rl?.queue||null);let Zl=Number(rl?.count||sl.length);a=!0;let Yl=`已将 ${Zl} 个已结束未读任务标为已读`;Su(Yl),mr("success",Yl)},"全部标为已读失败"),!a&&S.length>0)Bj(S),cf(A.current,!1).catch((rl)=>ju(Hu(rl,"刷新 Codex tasks 失败")));z$(!1)}function VW(z){let S=z||dn;if(zr(S),!Cr(S))Nu(S);if(Hr(null),!(Cr(S)?A.current:""))A.current="",N.current+=1,yl(""),s(null),tl(!0)}async function b8(){if(!t)return;let z=await Bu(Du(r,"/api/workdirs"));Ft(z)}async function SW(){let z=cr.trim()||Oj||"/workspace",S=typeof window>"u"?z:window.prompt("输入新的工作目录绝对路径",z),a=String(S||"").trim();if(!a)return;j0(!0),await Br(async()=>{let rl=await Bu(Du(r,"/api/workdirs"),{method:"POST",body:{providerId:Nl,executionMode:gu,path:a,ensure:!0}});Ft((Wl)=>({...Wl||{},...rl})),ku(String(rl?.workdir?.path||a));let jl=`已保存工作目录:${String(rl?.workdir?.path||a)}`;Su(jl),mr("success",jl)},"创建工作目录失败"),j0(!1)}async function YW(){let z=jy(cr);if(!X8){Su("当前工作目录还没有保存到下拉菜单。");return}if(!(typeof window>"u"?!0:window.confirm(`从下拉菜单删除工作目录选项? ${z} -不会删除磁盘上的实际目录。`)))return;j0(!0),await Br(async()=>{let a=await Bu(Du(r,`/api/workdirs/${encodeURIComponent(Nl)}/${encodeURIComponent(gu)}/${encodeURIComponent(z)}`),{method:"DELETE"});Ft((jl)=>({...jl||{},...a}));let rl=`已从下拉菜单删除工作目录:${z}`;Su(rl),mr("success",rl)},"删除工作目录失败"),j0(!1)}async function XW(){let z=typeof window>"u"?"":window.prompt("输入新的 Codex queue ID(字母/数字/._-,最长 64)","new-lane"),S=String(z||"").trim();if(!S)return;await Br(async()=>{let a=await Bu(Du(r,"/api/queues"),{method:"POST",body:{queueId:S}}),rl=String(a?.queue?.id||S);Nu(rl),zr(rl),Hr(null),A.current="",N.current+=1,yl(""),s(null);let jl=`已创建并切换到 queue:${rl}`;Su(jl),mr("success",jl),await cf("",!0,rl)},"创建 Codex queue 失败")}async function PW(){let z=String(tu||"default").trim()||"default",S=Ay(hf,z)||{id:z,name:z},a=typeof window>"u"?null:window.prompt(`输入 queue 显示名称(ID 不变:${z};留空恢复为 ID)`,DQ(S));if(a===null)return;await Br(async()=>{let rl=await Bu(Du(r,`/api/queues/${encodeURIComponent(z)}`),{method:"PATCH",body:{name:String(a)}}),jl=rl?.queue||{id:z,name:String(a||z)};if(rl?.summary)Hr((Gl)=>Gl?{...Gl,queue:rl.summary}:Gl);let Wl=`已更新 queue 名称:${h2(jl)}`;Su(Wl),mr("success",Wl),await cf(A.current,!0,gl)},"修改 Codex queue 名称失败")}function CW(){if(jt.length===0){Su("没有可合并的其他 queue;请先创建或选择另一个 queue。");return}let z=jt.some((S)=>String(S?.id||"")===tf)?tf:"";Or(z),lr(!0)}async function hW(){let z=Ui;if(jt.length===0){Su("没有可合并的其他 queue;请先创建或选择另一个 queue。");return}let a=String(tf||""||"").trim();if(!a){Su("请先选择要合并的源 queue。");return}if(a===z){ju("源 queue 和目标 queue 不能相同。");return}await Br(async()=>{let rl=await Bu(Du(r,`/api/queues/${encodeURIComponent(z)}/merge`),{method:"POST",body:{sourceQueueId:a}});if(rl?.summary)Hr((Gl)=>Gl?{...Gl,queue:rl.summary}:Gl);Nu(z),zr(z),Hr(null);let jl=Number(rl?.mergedTaskCount||0),Wl=`已将 queue=${a} 合并到 ${z},移动 ${jl} 个任务;源 queue 已自动删除。`;Su(Wl),mr("success",Wl),lr(!1),Or(""),await cf(A.current,!0,z)},"合并 Codex queue 失败")}async function MW(z){if(z.preventDefault(),U.current){Su("任务正在提交中,请等待当前请求完成,已阻止重复提交。");return}if(Xn.length>1&&!_t){ju(`检测到将创建 ${Xn.length} 个任务;请先勾选“确认批量入队”,避免误传多个任务。`);return}U.current=!0,Dl(!0),Su("正在提交 Code Queue 任务,请等待后端确认,输入已临时锁定。"),await Br(async()=>{if(Xn.length===0)throw Error("prompt 不能为空");let S=Ci(bl),a=tu.trim()||"default",rl=[...Xn],jl=(Rl)=>({prompt:Rl,queueId:a,providerId:Nl,executionMode:gu,model:yr,cwd:cr,maxAttempts:Number(Gf),...S.length>0?{referenceTaskIds:S}:{}}),Wl=rl.length===1?jl(rl[0]):{tasks:rl.map(jl)},Gl=await Bu(Du(r,rl.length===1?"/api/tasks":"/api/tasks/batch"),{method:"POST",body:Wl}),sl=Gl?.tasks?.[0]?.id||"",Zl=Array.isArray(Gl?.tasks)?Gl.tasks.map((Rl)=>String(Rl?.id||"")).filter(Boolean):[],Yl=`已创建 ${Zl.length||rl.length} 个任务${Zl.length>0?`:${Zl.join(" / ")}`:""}`;if(EW(Array.isArray(Gl?.tasks)?Gl.tasks:[],Gl?.queue||null),Su(Yl),mr("success",Yl),Hl(""),_u(""),At(!1),Nu(a),sl&&C8(Gl?.tasks?.[0],gl)&&h8(Gl?.tasks?.[0]))Jt(String(sl),!1).catch((Rl)=>ju(Hu(Rl,"加载 Codex Trace Summary 失败")))},"Codex 任务入队失败"),U.current=!1,Dl(!1)}async function sW(z){if(z.preventDefault(),!h?.id)return;await Br(async()=>{await Bu(Du(r,`/api/tasks/${encodeURIComponent(h.id)}/steer`),{method:"POST",body:{prompt:Cl}}),lu(""),await cf(h.id)},"追加 prompt 失败")}async function RW(z){z.preventDefault();let S=String(h?.id||"");if(!S||!w0)return;await Br(async()=>{let a=Ci(yu),rl=await Bu(Du(r,`/api/tasks/${encodeURIComponent(S)}/edit`),{method:"POST",body:{prompt:mu,referenceTaskIds:a}}),jl={...rl?.task||h||{},_traceSummary:null,_traceSummaryLoaded:!1,_traceSummaryUpdatedAt:"",_promptDetails:{},_traceSteps:[],_traceStepsLoaded:!1,_traceStepsByAttempt:{},_traceStepsLoadedByAttempt:{},_traceStepsNextAfterSeqByAttempt:{},_traceStepDetails:{}};E.current.set(S,{...E.current.get(S)||{},task:jl,complete:!1,completeUpdatedAt:""}),A.current=S,s(jl),yl(S),au(K3(jl)),ur(Array.isArray(jl?.referenceTaskIds)?jl.referenceTaskIds.join(" "):""),Hr((Gl)=>{if(!Gl)return Gl;let sl=Cu(Gl).map((Zl)=>String(Zl?.id||"")===S?{...Zl,...jl}:Zl);return{...Gl,queue:rl?.queue||Gl.queue,tasks:Gn([sl],Yn)}});let Wl=rl?.changed===!1?`任务 ${S} 的 prompt 未变化`:`已更新 queued 任务 ${S} 的用户 prompt`;Su(Wl),mr("success",Wl),await cf(S,!0,gl)},"编辑 queued 任务 prompt 失败")}async function xW(){if(!h?.id)return;await Br(async()=>{await Bu(Du(r,`/api/tasks/${encodeURIComponent(h.id)}/interrupt`),{method:"POST",body:{}}),await cf(h.id)},"打断 Codex session 失败")}async function bW(){if(!h?.id)return;await Br(async()=>{await Bu(Du(r,`/api/tasks/${encodeURIComponent(h.id)}/retry`),{method:"POST",body:{}}),await cf(h.id)},"重新入队失败")}async function vW(z){let S=String(h?.id||""),a=String(z||"").trim();if(!S||!a)return;let rl=Fy(h);if(a===rl){Su(`任务 ${S} 已在 queue=${a}`);return}await Br(async()=>{let Wl=(await Bu(Du(r,`/api/tasks/${encodeURIComponent(S)}/move`),{method:"POST",body:{queueId:a}}))?.task||{...h,queueId:a};if(E.current.set(S,{...E.current.get(S)||{},task:Wl}),A.current=S,s(Wl),yl(S),Nu(a),!Cr(gl))Hr(null),zr(a);let Gl=`已将任务 ${S} 从 ${rl} 移动到 ${a}`;Su(Gl),mr("success",Gl),await cf(S,!0,Cr(gl)?dn:a)},"移动任务 queue 失败")}async function gW(){let z=A.current;if(!z)return;let S=performance.now();await Br(async()=>{Wf({phase:"session",taskId:z,queueMs:0,totalMs:0,partial:!0,startedAt:new Date}),await Jt(z,!0,S,0)},"刷新 Trace Summary 失败")}function kW(z){A.current=z,N.current+=1,yl(z);let S=E.current.get(z);if(S?.task)s(S.task),tl(!1);else{tl(!0);let a=$n.find((rl)=>rl.id===z);if(a)s(a);else s(null)}cf(z).catch((a)=>ju(Hu(a,"切换 Codex session 失败")))}function b8(z){if(kW(z),dp())dy(!1)}function Dj(z,S,a){if(!z||!Array.isArray(z?.tasks)||S.length===0||Object.keys(a).length===0)return z;let rl=!1,jl=Cu(z).map((Wl)=>{if(String(Wl?.id||"")!==S)return Wl;return rl=!0,X$(TQ(Wl,a))});return rl?{...z,tasks:jl}:z}function IW(z,S){Hr((a)=>Dj(a,z,S)),El((a)=>Dj(a,z,S))}function aW(z,S,a){let rl=String(z?.type||"");if(rl==="queue-updated")return!0;if(rl==="trace-stats-updated"||rl==="trace-step-created")return!1;if(S.length===0)return!0;if(!a)return!0;if(z?.queueId&&String(z.queueId)!==Fy(a))return!0;if(z?.status&&String(z.status)!==String(a?.status||""))return!0;return String(z?.reason||"")!=="output"}function Vj(){if(!t||!Z2())return;if(O.current!==null)window.clearTimeout(O.current);O.current=window.setTimeout(()=>{O.current=null,cf(A.current,!1).catch((z)=>ju(Hu(z,"Code Queue 事件刷新失败")))},120)}function oW(z,S){if(!t||!Z2()||A.current!==z)return;if(V.current=V.current||S,Z.current!==null)return;Z.current=window.setTimeout(()=>{Z.current=null;let a=V.current;if(V.current=!1,Jt(z,!0).catch((rl)=>ju(Hu(rl,"事件刷新 Trace Summary 失败"))),a)HW(z)},250)}function dW(z){let S=ol(z?.payload)||z,a=ol(S?.stats),rl=String(z?.type||S?.type||""),jl=String(S?.subjectKind||a?.subjectKind||""),Wl=String(S?.scopeId||a?.scopeId||""),Gl=String(S?.taskId||(jl==="task"?S?.subjectId:"")||a?.taskId||z?.taskId||""),sl=S?.attemptIndex??a?.attemptIndex,Zl=sl===null||sl===void 0||sl===""?null:un(sl),Yl=a||ol(S?.traceStats),Rl=Yl?.stepCount??Yl?.llmStepCount,Au=Yl?.outputMaxSeq;return{...S,type:rl,eventId:z?.eventId||S?.eventId,sequence:z?.sequence??S?.sequence,taskId:Gl,subjectKind:jl,scopeId:Wl,attemptIndex:Zl,stepCount:Rl,outputMaxSeq:Au,updatedAt:Yl?.updatedAt||S?.updatedAt||z?.createdAt,traceStats:Yl,statsSource:Yl?"oa-event-flow":S?.statsSource}}function eW(z){let S=dW(z),a=String(S?.taskId||""),rl=String(S?.scopeId||S?.traceStats?.scopeId||""),jl=String(S?.subjectKind||S?.traceStats?.subjectKind||"")==="task-attempt"||Number(S?.attemptIndex)>0||/:attempt:\d+$/u.test(rl),Wl=mQ(S?.stepCount),Gl={},sl=a.length>0?Cu(D.current).find((Zl)=>String(Zl?.id||"")===a):null;if(a.length>0){if(S?.status)Gl.status=String(S.status);if(S?.updatedAt)Gl.updatedAt=String(S.updatedAt);if(S?.queueId)Gl.queueId=String(S.queueId);if(!jl&&Number.isFinite(Number(S?.stepCount)))Gl.stepCount=Wl,Gl.llmStepCount=Wl;if(!jl&&Number.isFinite(Number(S?.outputMaxSeq)))Gl.outputMaxSeq=mQ(S.outputMaxSeq);if(!jl&&ol(S?.traceStats))Gl.traceStats=S.traceStats,Gl.statsSource="oa-event-flow";if(Object.keys(Gl).length>0&&(E.current.has(a)||A.current===a))Mf(a,Gl,N.current);if(Object.keys(Gl).length>0)IW(a,Gl);if(A.current===a&&(S?.type==="trace-step-created"||S?.type==="task-updated"||S?.type==="trace-stats-updated")){let Zl=Uz(sl),Yl=S?.type==="trace-step-created"||S?.type==="trace-stats-updated"&&Number.isFinite(Number(S?.stepCount))&&(jl||Zl===null||Wl>Zl);oW(a,Yl)}}if(aW(S,a,sl))Vj()}df(()=>{if(H.current){H.current=!1;return}Br(()=>cf(A.current),"Code Queue 加载失败")},[t?.id,gl]),df(()=>{if(!t||typeof EventSource>"u")return;let z=new EventSource(bp(r),{withCredentials:!0}),S=(rl)=>{try{eW(JSON.parse(String(rl.data||"{}")))}catch(jl){ju(Hu(jl,"解析 Code Queue 事件失败"))}},a=()=>{if(Z2())Vj()};return z.addEventListener("trace-step-created",S),z.addEventListener("task-updated",S),z.addEventListener("queue-updated",S),z.addEventListener("trace-stats-updated",S),document.addEventListener("visibilitychange",a),()=>{if(z.close(),document.removeEventListener("visibilitychange",a),O.current!==null)window.clearTimeout(O.current),O.current=null;if(Z.current!==null)window.clearTimeout(Z.current),Z.current=null}},[t?.id,r,gl]),df(()=>{if(!t||!h||ul)return;let z=String(h.id||"");if(!z)return;let S=String(h.updatedAt||"");if(G3(h))return;let a=`${z}:${S||"unknown"}:${String(h?._traceSummaryUpdatedAt||"")}`;if(p.current.has(a))return;p.current.add(a),Jt(z,!0).catch((rl)=>ju(Hu(rl,"自动加载 Trace Summary 失败")))},[t?.id,h?.id,h?.updatedAt,h?.traceStats?.statsRevision,h?._traceSummaryUpdatedAt,h?._traceSummaryLoaded,ul]),df(()=>{if(!t||!h||ul)return;let z=String(h.id||""),S=Number(Jr(h)?.currentAttempt||h?.currentAttempt||0);if(!z||!bQ(h)||!Number.isFinite(S)||S<=0)return;if(E3(h,S))return;let a=`${z}:current-attempt:${S}:${String(h?.updatedAt||"")}`;if(p.current.has(a))return;p.current.add(a),C$(S).catch((rl)=>ju(Hu(rl,"自动加载当前 Attempt Trace Steps 失败")))},[t?.id,h?.id,h?.status,h?.currentAttempt,h?.updatedAt,h?._traceSummaryUpdatedAt,ul]),df(()=>{if(!t)return;x8().catch((z)=>ju(Hu(z,"加载工作目录失败")));return},[t?.id]),df(()=>{if(!t)return;Zj(gl);return},[t?.id,r,gl]);let lT=_n.length===0?L(Ny,{title:yf?M?"搜索中":"没有匹配任务":"队列为空",text:yf?M?`正在搜索包含“${Q0}”的 task...`:`未找到包含“${Q0}”的 task;可换个关键词或切换 queue。`:"提交一个任务后,Codex 会串行执行并保存输出。"}):[Gj.length>0?L(P2,{key:"unread",title:"已结束未读",tasks:Gj,selectedId:fl,emptyText:"暂无已结束未读任务。",onSelect:b8,onCopy:M8,onReference:s8,onMarkRead:R8,copiedTaskId:A0,markingReadTaskId:ey}):null,L(P2,{key:"active",title:"运行 / 排队",tasks:UW,selectedId:fl,emptyText:"当前没有运行或排队任务。",onSelect:b8,onCopy:M8,onReference:s8,onMarkRead:R8,copiedTaskId:A0,markingReadTaskId:ey}),L(P2,{key:"history",title:"历史 session",tasks:QW,selectedId:fl,emptyText:"最近没有完成、失败或取消的 session。",onSelect:b8,onCopy:M8,onReference:s8,onMarkRead:R8,copiedTaskId:A0,markingReadTaskId:ey}),L("div",{key:"pagination",className:"codex-task-pagination","data-testid":"codex-task-pagination"},L("span",null,yf?`搜索“${Q0}” · 已显示 ${_n.length} / ${Number.isFinite(m0)?m0:_n.length}`:`已加载 ${_n.length} / ${Number.isFinite(m0)?m0:_n.length}`),Tj?L("button",{type:"button",className:"ghost-btn",disabled:V8,onClick:()=>void Bj(),"data-testid":"codex-load-more-tasks-button"},V8?"加载中":yf?"加载更多结果":"加载更早任务"):L("code",null,yf?"已到结果末尾":"已到队列末尾"))],Sj=(z,S=!1)=>L("label",{className:`code-queue-switcher ${S?"compact":""}`},L("span",null,S?"Queue":"查看 queue"),L("select",{value:gl,onChange:(a)=>VW(String(a.target.value||dn)),"data-testid":z},L("option",{value:dn},`All queues · ${Number.isFinite(Nt)?Nt:$n.length} tasks · ${fc.length} running`),hf.map((a)=>L("option",{key:String(a?.id||""),value:String(a?.id||"")},j1(a))))),uT=L("div",{className:"codex-task-search","data-testid":"codex-task-search"},L("label",{htmlFor:"codex-task-search-input"},"搜索 task"),L("div",{className:"codex-task-search-row"},L("input",{id:"codex-task-search-input",type:"search",value:Al,placeholder:"关键词 / task ID / prompt",autoComplete:"off",onChange:(z)=>Kl(String(z.target.value||"")),"data-testid":"codex-task-search-input"}),Al?L("button",{type:"button",className:"ghost-btn",onClick:()=>Kl(""),"data-testid":"codex-task-search-clear"},"清除"):null),L("small",{"data-testid":"codex-task-search-summary"},yf?M?"搜索中...":`匹配 ${_n.length}/${Number.isFinite(m0)?m0:_n.length}`:"支持 task ID、prompt、状态、provider、模型和最近输出关键词")),rT=L("div",{className:"codex-trace-status","data-testid":"codex-trace-status-summary"},L("span",{className:"codex-trace-status-chip queued"},L("b",null,"排队"),String(V$)),L("span",{className:"codex-trace-status-chip running"},L("b",null,"运行"),String(NW)),L("span",{className:`codex-trace-status-chip unread ${U0>0?"warn":""}`},L("b",null,"结束未读"),String(U0)),L("span",{className:"codex-trace-status-chip service"},L("b",null,"服务"),`${mW.providerStatus||"unknown"} · ${t?.providerId||"D601"} · ${wW.public?"公网暴露":"仅 UniDesk frontend 代理访问"}`),L("span",{className:"codex-trace-status-chip"},L("b",null,"执行节点"),Y$.map((z)=>z.id).join(" / ")),L("span",{className:"codex-trace-status-chip"},L("b",null,"执行模式"),pj.map((z)=>z.id).join(" / ")),L("span",{className:"codex-trace-status-chip"},L("b",null,"模型"),Ej.join(" / ")),L("span",{className:"codex-trace-status-chip"},L("b",null,"加载"),xr?.phase==="complete"?sp(xr?.totalMs):String(xr?.phase||"idle")),L("span",{className:"codex-trace-status-chip"},L("b",null,"刷新"),Z$?iu(Z$):"--")),fT=L(hi,{title:h?`Trace ${String(h.id).slice(0,22)}`:"Trace 输出",eyebrow:h?`${h.status} / view=${S$} / task queue=${Fy(h)} / provider=${h.providerId||"D601"} / mode=${h.executionMode||"default"} / ${h.model} / agent loop trace`:`Agent loop trace / view=${S$}`,summary:rT,loading:ul||uc||M||nl||xr?.phase==="loading",actions:L("div",{className:"panel-actions"},Sj("code-queue-filter-select"),L("button",{type:"button",className:"ghost-btn codex-mark-all-read-btn",disabled:U0===0||Tu||lc,onClick:()=>void DW(),"data-testid":"codex-mark-all-read-button"},lc?"标记中":`全部标已读${U0>0?` (${U0})`:""}`),h?L("button",{type:"button",className:"ghost-btn",disabled:ul||Tu,onClick:()=>void gW(),"data-testid":"codex-load-full-trace-button"},ul?"加载中":Jr(h)?"刷新 Summary":"加载 Summary"):null,L("button",{type:"button",className:"codex-session-title-toggle",onClick:()=>dy((z)=>!z),"data-testid":"code-queue-sidebar-toggle"},oy?"收起队列":"展开队列"),L("label",{className:"inline-check"},L("input",{type:"checkbox",checked:Sn,onChange:(z)=>O8(Boolean(z.target.checked))}),"自动滚动"),L("button",{type:"button",className:"ghost-btn",disabled:!GW||Tu,onClick:()=>void xW(),"data-testid":"codex-interrupt-button"},"打断"),L("button",{type:"button",className:"ghost-btn",disabled:!WW||Tu,onClick:()=>void bW()},"重试"),h?L(b2,{title:"Codex Task",data:h,onOpen:u,testId:"raw-codex-task"}):null),className:"codex-output-panel"},L("div",{className:`codex-session-shell ${oy?"":"queue-collapsed"}`},oy?L("aside",{className:"codex-session-sidebar","data-testid":"codex-session-sidebar"},L("div",{className:"codex-session-sidebar-head"},L("div",null,L("span",null,Cr(gl)?"All queues":"Queue lane"),L("strong",null,`${S$} · ${$n.length}/${Number.isFinite(Nt)?Nt:$n.length} sessions · 未读 ${U0}`)),L("button",{type:"button",className:"ghost-btn",onClick:()=>dy(!1)},"收起")),Sj("code-queue-filter-sidebar",!0),uT,L("div",{className:"codex-task-list codex-task-list-session",onScroll:BW,"data-testid":"codex-task-list-scroll"},lT)):null,L("div",{className:"codex-session-main"},L("div",{className:"codex-output-stack"},L(JO,{task:h,loading:ul,onLoadPromptPart:OW,onLoadSteps:C$,onLoadStep:ZW}),L(UO,{task:h})))));if(!t)return L(Ny,{title:"Code Queue 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=code-queue"});let Yj=Number(xr?.totalMs),Xj=Number(xr?.queueMs),Pj=Number(xr?.detailMs),Cj=Number(xr?.transcriptRows),nT=xr?.phase==="complete"?"complete":String(xr?.phase||"idle"),tT=Ay(hf,Ui)||{id:Ui,name:Ui},iT=nf?L($Q,{title:"合并 queue",titleId:"codex-merge-dialog-title",className:"codex-merge-dialog",backdropClassName:"codex-merge-dialog-backdrop",bodyClassName:"codex-merge-dialog-body",actionsClassName:"codex-merge-dialog-actions",testId:"codex-merge-queue-dialog",closeTestId:"codex-merge-queue-close",disableClose:Tu,onClose:()=>lr(!1),actions:[L("button",{key:"cancel",type:"button",className:"ghost-btn",onClick:()=>lr(!1),disabled:Tu,"data-testid":"codex-merge-queue-cancel"},"取消"),L("button",{key:"confirm",type:"button",className:"primary-btn",onClick:()=>void hW(),disabled:Tu||e||!tf,"data-testid":"codex-merge-queue-confirm"},Tu?"合并中...":"确认合并")]},L("p",{className:"codex-merge-dialog-target"},"目标 queue:",L("code",null,j1(tT))),L("label",null,"源 queue",L("select",{value:tf,disabled:Tu||e,onChange:(z)=>Or(String(z.target.value||"")),"data-testid":"codex-merge-source-queue-select"},L("option",{value:""},"选择要合并进来的源 queue"),jt.map((z)=>L("option",{key:String(z?.id||""),value:String(z?.id||"")},j1(z))))),L("p",{className:"codex-merge-dialog-note"},"会把源 queue 的任务归属合并到目标 queue,并自动删除源 queue;目标 queue 会按原 queueEnteredAt/createdAt 时间顺序运行。")):null;return L("div",{className:`code-queue-page ${n?"codex-standalone-page":""}`,"data-testid":"code-queue-page","data-load-state":nT,"data-load-total-ms":Number.isFinite(Yj)?String(Math.round(Yj*10)/10):"","data-load-queue-ms":Number.isFinite(Xj)?String(Math.round(Xj*10)/10):"","data-load-detail-ms":Number.isFinite(Pj)?String(Math.round(Pj*10)/10):"","data-load-transcript-rows":Number.isFinite(Cj)?String(Cj):"","data-load-task-id":String(xr?.taskId||fl||""),"data-load-partial":xr?.partial?"true":"false"},L(el,{error:Z8,wide:!0}),iT,L("div",{className:"codex-session-stage codex-session-stage-top"},L(cO,{diagnostics:H8,queue:Ou,onRaw:u}),fT),L("div",{className:"code-queue-layout"},L("div",{className:"codex-left-rail"},L(hi,{title:"提交任务",eyebrow:e?"Submitting...":Xn.length>1?`${Xn.length} tasks`:"Single or Batch",className:"codex-compose-panel",loading:e},L("form",{className:`codex-task-form ${e?"is-submitting":""}`,onSubmit:MW,"data-testid":"code-queue-task-form","aria-busy":e?"true":"false"},L("label",null,"Prompt / 多任务用单独一行 --- 分隔",L("textarea",{value:pl,rows:8,disabled:e,onChange:(z)=>Hl(z.target.value),placeholder:"写入 Codex 任务;多个任务之间用 --- 分隔。"})),L("label",{className:"codex-reference-field"},"引用任务 ID(可选)",L("input",{value:bl,disabled:e,onChange:(z)=>_u(z.target.value),placeholder:"codex_...;支持空格/逗号分隔多个 ID","data-testid":"codex-reference-task-id"}),Ci(bl).length>0?L("code",null,`后端将解析并注入:${Ci(bl).join(" / ")}`):null),L("div",{className:"codex-form-grid"},L("label",{className:"codex-submit-queue-field"},"Queue",L("div",{className:"codex-submit-queue-row"},L("select",{className:"codex-submit-queue-select",value:tu,disabled:e,onChange:(z)=>Nu(String(z.target.value||"default")),"data-testid":"code-queue-id-select"},hf.map((z)=>L("option",{key:String(z?.id||""),value:String(z?.id||"")},j1(z)))),L("button",{type:"button",className:"ghost-btn codex-rename-queue-btn",onClick:()=>void PW(),disabled:Tu||e||!tu,title:"修改当前 queue 的显示名称,ID 不变","data-testid":"codex-rename-queue-button"},"改名"),L("button",{type:"button",className:"ghost-btn codex-merge-queue-btn",onClick:()=>CW(),disabled:Tu||e||jt.length===0,title:"打开独立窗口选择源 queue 并合并到当前 queue;合并后自动删除源 queue","data-testid":"codex-merge-queue-button"},"合并 queue"),L("button",{type:"button",className:"ghost-btn codex-create-queue-btn",onClick:()=>void XW(),disabled:Tu||e,"data-testid":"codex-create-queue-button"},"创建 queue"))),L("label",null,"模型",L("select",{value:yr,disabled:e,onChange:(z)=>Zr(z.target.value),"data-testid":"codex-model-select"},Ej.map((z)=>L("option",{key:z,value:z},z)))),L("label",null,"执行 Provider",L("select",{value:Nl,disabled:e,onChange:(z)=>pW(String(z.target.value||"D601")),"data-testid":"codex-provider-select"},Y$.map((z)=>L("option",{key:z.id,value:z.id},`${z.label||z.id} · ${z.defaultWorkdir||l5(Ou,z.id)}${z.supportsWindowsNativeCodex?" · Windows native":""}`)))),L("label",null,"执行模式",L("select",{value:gu,disabled:e,onChange:(z)=>zW(String(z.target.value||"default")),"data-testid":"codex-execution-mode-select"},pj.map((z)=>L("option",{key:z.id,value:z.id},`${z.label||z.id}${z.id==="windows-native"?" · 宿主 Codex":""}`)))),L("label",{className:"codex-workdir-field"},"工作目录",L("div",{className:"codex-workdir-row"},L("input",{value:cr,disabled:e,onChange:(z)=>ku(z.target.value),placeholder:zj||Ou?.defaultWorkdir||"/workspace","data-testid":"codex-cwd-input"}),L("select",{value:jy(cr),disabled:e||F0,onChange:(z)=>ku(String(z.target.value||"")),"data-testid":"codex-cwd-select"},Oj.map((z)=>L("option",{key:`${z.providerId}:${z.executionMode}:${z.path}`,value:z.path},`${z.path}${z.source==="default"?" · 默认":""}`))),L("button",{type:"button",className:"ghost-btn codex-workdir-create-btn",disabled:e||Tu||F0,onClick:()=>void SW(),"data-testid":"codex-cwd-create-button"},F0?"处理中":"新建"),L("button",{type:"button",className:"ghost-btn codex-workdir-delete-btn",disabled:e||Tu||F0||!Y8,onClick:()=>void YW(),title:Y8?"从工作目录下拉菜单删除这个选项,不删除磁盘目录":"当前工作目录尚未保存到下拉菜单","data-testid":"codex-cwd-delete-button"},"删除"))),L("label",null,"最大尝试",L("input",{type:"number",min:1,max:99,value:Gf,disabled:e,onChange:(z)=>Vn(Number(z.target.value)),"data-testid":"codex-max-attempts-input"})),L("label",null,"入队份数",L("input",{type:"number",min:1,max:50,value:Rr,disabled:e,onChange:(z)=>ay(Number(z.target.value)),"data-testid":"codex-repeat-count-input"}))),nc>1?L("label",{className:`codex-batch-confirm ${_t?"confirmed":""}`,"data-testid":"codex-batch-confirm-row"},L("input",{type:"checkbox",checked:_t,disabled:e,onChange:(z)=>At(Boolean(z.target.checked)),"data-testid":"codex-batch-confirm-checkbox"}),L("span",null,`确认批量入队 ${nc} 个任务(prompt 分段 ${S8.length} × 入队份数 ${QQ(Rr)})`)):null,e?L("div",{className:"codex-submit-wait","data-testid":"codex-submit-wait"},"正在提交到后端,已锁定输入以防重复提交..."):null,L("div",{className:"codex-form-actions"},L("button",{type:"button",className:"ghost-btn",disabled:Tu||e||pl.length===0&&bl.length===0,onClick:()=>{Hl(""),_u(""),At(!1);let z="已清空任务输入栏";Su(z),mr("success",z)},"data-testid":"codex-clear-input-button"},"清空输入"),L("button",{type:"submit",className:"primary-btn",disabled:qW,"data-testid":"codex-enqueue-button"},e?"提交中,请等待...":Kj?`请确认批量入队 ${nc} 个任务`:Xn.length>1?`批量入队 ${Xn.length} 个任务`:"入队并运行"))))),L("div",{className:"codex-main-stage"},L("div",{className:"codex-detail-grid"},L(hi,{title:"运行控制",eyebrow:w0?"Queued prompt editable":X8?"Active turn steer":"Steer when running",loading:Tu},L("div",{className:"codex-run-control-stack"},L(_O,{task:h,queueRows:hf,busy:Tu,onMove:vW}),h?.id?L("form",{className:"codex-steer-form codex-edit-prompt-form",onSubmit:RW,"data-testid":"codex-edit-prompt-form"},L("label",null,"编辑 queued 用户 prompt",L("textarea",{value:mu,rows:5,onChange:(z)=>au(z.target.value),placeholder:"仅 QUEUED 且尚未开始运行的任务可在这里修改原始用户 prompt。",disabled:!w0||Tu,"data-testid":"codex-edit-prompt-textarea"})),L("label",{className:"codex-reference-field"},"引用任务 ID(可选,留空会清除引用)",L("input",{value:yu,disabled:!w0||Tu,onChange:(z)=>ur(z.target.value),placeholder:"codex_...;支持空格/逗号分隔多个 ID","data-testid":"codex-edit-reference-task-id"}),Ci(yu).length>0?L("code",null,`将保留/注入:${Ci(yu).join(" / ")}`):null),L("div",{className:"codex-form-actions"},L("button",{type:"button",className:"ghost-btn",disabled:!h?.id||Tu,onClick:()=>{au(h?K3(h):""),ur(Array.isArray(h?.referenceTaskIds)?h.referenceTaskIds.join(" "):"")},"data-testid":"codex-edit-prompt-reset"},"恢复当前值"),L("button",{type:"submit",className:"primary-btn",disabled:!w0||Tu||mu.trim().length===0,title:w0?"保存后会重写尚未运行任务的用户 prompt":"只有 QUEUED 且尚未开始的任务可编辑 prompt","data-testid":"codex-edit-prompt-submit"},"保存 queued prompt"))):null,L("form",{className:"codex-steer-form",onSubmit:sW},L("label",null,"追加 prompt",L("textarea",{value:Cl,rows:4,onChange:(z)=>lu(z.target.value),placeholder:"给正在运行的 Codex session 推入新的指令或纠偏。",disabled:!X8})),L("button",{type:"submit",className:"primary-btn",disabled:!X8||Tu||Cl.trim().length===0,"data-testid":"codex-steer-button"},"推入运行中 session")))),L(hi,{title:"完成判定",eyebrow:h?.lastJudge?h.lastJudge.source:"judge",loading:ul},h?.lastJudge?L("div",{className:"codex-judge-card","data-testid":"codex-task-judge-card"},L(Ri,{status:h.lastJudge.decision},h.lastJudge.decision),L("strong",null,`${Math.round(Number(h.lastJudge.confidence||0)*100)}% confidence`),L("p",{"data-testid":"codex-task-judge-reason"},Q1(h.lastJudge.reason||"--",180)),L(CQ,{judge:h.lastJudge,testId:"codex-task-judge-failure-details"}),h.lastJudge.continuePrompt?L("code",{"data-testid":"codex-task-judge-continue-prompt"},Q1(h.lastJudge.continuePrompt,160)):null):L(Ny,{title:"尚未判定",text:"Codex turn 结束后会由 MiniMax M2.7 或 fallback judge 判定 complete/retry/fail;retry 会在已有 thread 追加继续执行 prompt。"}))),L($O,{stats:B8,queueName:S$,onRaw:u}),L(hi,{title:"Attempts",eyebrow:"terminal vs interruption",loading:ul},L(QO,{task:h})))))}var Qy=Ml(Ju(),1);var R=Qy.default.createElement,{useEffect:u5}=Qy.default,Wn=Qy.default.useState,fm=["all","meeting","decision","goal","blocker","debt","experiment"],nm=["all","G0","G1","G2","G3","P0","P1","P2","P3","none"],tm=["all","active","blocked","parked","done"],mO=[{id:"all",label:"全部需求"},{id:"external-goal",label:"外部目标"},{id:"internal-goal",label:"内部目标"},{id:"blocker",label:"阻塞"},{id:"parked",label:"停放事项"},{id:"authority",label:"决议/实验/债务"}],f5=[{id:"external-goal",label:"外部目标",type:"goal",level:"G0",status:"active",tags:["external-goal","requirement"]},{id:"internal-goal",label:"内部目标",type:"goal",level:"G1",status:"active",tags:["internal-goal","requirement"]},{id:"blocker",label:"阻塞",type:"blocker",level:"P0",status:"blocked",tags:["blocker","requirement"]},{id:"parked",label:"停放事项",type:"goal",level:"G3",status:"parked",tags:["parked","requirement"]},{id:"decision",label:"决议",type:"decision",level:"none",status:"active",tags:["decision"]},{id:"experiment",label:"实验",type:"experiment",level:"G2",status:"active",tags:["experiment"]},{id:"debt",label:"债务",type:"debt",level:"P2",status:"active",tags:["debt"]}],q1="frontend-work-diary.md";function L1({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return R("span",{className:`status-badge ${r}`},u||l||"unknown")}function B3({label:l,value:u,hint:r,tone:f}){return R("article",{className:`metric-card ${f||""}`},R("div",{className:"metric-label"},l),R("div",{className:"metric-value"},u),R("div",{className:"metric-hint"},r))}function hr({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return R("section",{className:`panel ${n||""}`},R("div",{className:"panel-head"},R("div",null,u?R("p",{className:"panel-eyebrow"},u):null,R(nu,{title:l,loading:t})),r?R("div",{className:"panel-actions"},r):null),R("div",{className:"panel-body"},f))}function Jy({title:l,data:u,onOpen:r,testId:f}){return R("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function rn({title:l,text:u}){return R("div",{className:"empty-state"},R("strong",null,l),R("span",null,u))}function wO(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function qO(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function LO(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function gt(l,u){return`${l}/microservices/decision-center/proxy${u}`}function im(l){if(l==="G0"||l==="G1")return"online";if(l==="P0"||l==="P1")return"failed";if(l==="none")return"unknown";return"warn"}function ym(l){if(l==="done")return"online";if(l==="blocked")return"failed";if(l==="parked")return"warn";return"unknown"}function vi(l=new Date){let u=l.getFullYear(),r=String(l.getMonth()+1).padStart(2,"0"),f=String(l.getDate()).padStart(2,"0");return`${u}-${r}-${f}`}function t5(l){return Ll(l)||"--"}function V3(l,u=220){let r=String(l||"").replace(/\s+/gu," ").trim();return r.length>u?`${r.slice(0,u-1)}...`:r}function S3(l){return String(l||"").replace(/[^A-Za-z0-9_-]+/g,"-")||"item"}function n5(l){return String(l||"").split(",").map((u)=>u.trim()).filter(Boolean).slice(0,50)}function Y3(l){return Array.isArray(l)?l.join(", "):String(l||"")}function r5(l){let u=f5.find((r)=>r.id===l)||f5[0];return{id:"",category:u?.id||"external-goal",type:u?.type||"goal",level:u?.level||"G0",status:u?.status||"active",title:"",body:"",linkedGoalId:"",tags:Y3(u?.tags||[]),evidenceLinks:"",sourceSession:"frontend",taskId:"",commitId:""}}function rm(l){return{id:l?.id||"",category:"custom",type:l?.type||"meeting",level:l?.level||"none",status:l?.status||"active",title:l?.title||"",body:l?.body||l?.summary||"",linkedGoalId:l?.linkedGoalId||"",tags:Y3(l?.tags),evidenceLinks:Y3(l?.evidenceLinks),sourceSession:l?.sourceSession||"frontend",taskId:l?.taskId||"",commitId:l?.commitId||""}}function GO(l){return{type:l.type,level:l.level,status:l.status,title:String(l.title||"").trim(),body:String(l.body||"").trim(),linkedGoalId:String(l.linkedGoalId||"").trim(),tags:n5(l.tags),evidenceLinks:n5(l.evidenceLinks),sourceSession:String(l.sourceSession||"").trim(),taskId:String(l.taskId||"").trim(),commitId:String(l.commitId||"").trim()}}function X3(l){let u=Array.isArray(l.tags)?l.tags.map((r)=>r.toLowerCase()):[];return l.type==="goal"&&l.status!=="blocked"&&l.status!=="parked"&&(l.level==="G0"||u.includes("external-goal"))}function i5(l){let u=Array.isArray(l.tags)?l.tags.map((r)=>r.toLowerCase()):[];return l.type==="goal"&&l.status!=="blocked"&&l.status!=="parked"&&!X3(l)&&(["G1","G2","G3"].includes(l.level)||u.includes("internal-goal"))}function cm(l,u){if(u==="external-goal")return X3(l);if(u==="internal-goal")return i5(l);if(u==="blocker")return l.type==="blocker"||l.status==="blocked";if(u==="parked")return l.status==="parked";if(u==="authority")return["decision","experiment","debt"].includes(l.type);return!0}function D3(l){let u=l?.date||vi();return{date:u,title:l?.title||`${u} 工作日记`,body:l?.body||"",sourceFile:l?.sourceFile||q1,tags:Y3(l?.tags||["frontend"])}}function WO(l){let u=String(l.date||vi()).trim(),r=String(l.title||`${u} 工作日记`).trim(),f=String(l.body||"").trim(),n=f.split(` +不会删除磁盘上的实际目录。`)))return;j0(!0),await Br(async()=>{let a=await Bu(Du(r,`/api/workdirs/${encodeURIComponent(Nl)}/${encodeURIComponent(gu)}/${encodeURIComponent(z)}`),{method:"DELETE"});Ft((jl)=>({...jl||{},...a}));let rl=`已从下拉菜单删除工作目录:${z}`;Su(rl),mr("success",rl)},"删除工作目录失败"),j0(!1)}async function XW(){let z=typeof window>"u"?"":window.prompt("输入新的 Codex queue ID(字母/数字/._-,最长 64)","new-lane"),S=String(z||"").trim();if(!S)return;await Br(async()=>{let a=await Bu(Du(r,"/api/queues"),{method:"POST",body:{queueId:S}}),rl=String(a?.queue?.id||S);Nu(rl),zr(rl),Hr(null),A.current="",N.current+=1,yl(""),s(null);let jl=`已创建并切换到 queue:${rl}`;Su(jl),mr("success",jl),await cf("",!0,rl)},"创建 Codex queue 失败")}async function PW(){let z=String(tu||"default").trim()||"default",S=Ay(hf,z)||{id:z,name:z},a=typeof window>"u"?null:window.prompt(`输入 queue 显示名称(ID 不变:${z};留空恢复为 ID)`,DQ(S));if(a===null)return;await Br(async()=>{let rl=await Bu(Du(r,`/api/queues/${encodeURIComponent(z)}`),{method:"PATCH",body:{name:String(a)}}),jl=rl?.queue||{id:z,name:String(a||z)};if(rl?.summary)Hr((Gl)=>Gl?{...Gl,queue:rl.summary}:Gl);let Wl=`已更新 queue 名称:${M2(jl)}`;Su(Wl),mr("success",Wl),await cf(A.current,!0,gl)},"修改 Codex queue 名称失败")}function CW(){if(jt.length===0){Su("没有可合并的其他 queue;请先创建或选择另一个 queue。");return}let z=jt.some((S)=>String(S?.id||"")===tf)?tf:"";Or(z),lr(!0)}async function hW(){let z=Ui;if(jt.length===0){Su("没有可合并的其他 queue;请先创建或选择另一个 queue。");return}let a=String(tf||""||"").trim();if(!a){Su("请先选择要合并的源 queue。");return}if(a===z){ju("源 queue 和目标 queue 不能相同。");return}await Br(async()=>{let rl=await Bu(Du(r,`/api/queues/${encodeURIComponent(z)}/merge`),{method:"POST",body:{sourceQueueId:a}});if(rl?.summary)Hr((Gl)=>Gl?{...Gl,queue:rl.summary}:Gl);Nu(z),zr(z),Hr(null);let jl=Number(rl?.mergedTaskCount||0),Wl=`已将 queue=${a} 合并到 ${z},移动 ${jl} 个任务;源 queue 已自动删除。`;Su(Wl),mr("success",Wl),lr(!1),Or(""),await cf(A.current,!0,z)},"合并 Codex queue 失败")}async function MW(z){if(z.preventDefault(),U.current){Su("任务正在提交中,请等待当前请求完成,已阻止重复提交。");return}if(Xn.length>1&&!_t){ju(`检测到将创建 ${Xn.length} 个任务;请先勾选“确认批量入队”,避免误传多个任务。`);return}U.current=!0,Dl(!0),Su("正在提交 Code Queue 任务,请等待后端确认,输入已临时锁定。"),await Br(async()=>{if(Xn.length===0)throw Error("prompt 不能为空");let S=Ci(bl),a=tu.trim()||"default",rl=[...Xn],jl=(Rl)=>({prompt:Rl,queueId:a,providerId:Nl,executionMode:gu,model:yr,cwd:cr,maxAttempts:Number(Gf),...S.length>0?{referenceTaskIds:S}:{}}),Wl=rl.length===1?jl(rl[0]):{tasks:rl.map(jl)},Gl=await Bu(Du(r,rl.length===1?"/api/tasks":"/api/tasks/batch"),{method:"POST",body:Wl}),sl=Gl?.tasks?.[0]?.id||"",Zl=Array.isArray(Gl?.tasks)?Gl.tasks.map((Rl)=>String(Rl?.id||"")).filter(Boolean):[],Yl=`已创建 ${Zl.length||rl.length} 个任务${Zl.length>0?`:${Zl.join(" / ")}`:""}`;if(EW(Array.isArray(Gl?.tasks)?Gl.tasks:[],Gl?.queue||null),Su(Yl),mr("success",Yl),Hl(""),_u(""),At(!1),Nu(a),sl&&h8(Gl?.tasks?.[0],gl)&&M8(Gl?.tasks?.[0]))Jt(String(sl),!1).catch((Rl)=>ju(Hu(Rl,"加载 Codex Trace Summary 失败")))},"Codex 任务入队失败"),U.current=!1,Dl(!1)}async function sW(z){if(z.preventDefault(),!h?.id)return;await Br(async()=>{await Bu(Du(r,`/api/tasks/${encodeURIComponent(h.id)}/steer`),{method:"POST",body:{prompt:Cl}}),lu(""),await cf(h.id)},"追加 prompt 失败")}async function RW(z){z.preventDefault();let S=String(h?.id||"");if(!S||!w0)return;await Br(async()=>{let a=Ci(yu),rl=await Bu(Du(r,`/api/tasks/${encodeURIComponent(S)}/edit`),{method:"POST",body:{prompt:mu,referenceTaskIds:a}}),jl={...rl?.task||h||{},_traceSummary:null,_traceSummaryLoaded:!1,_traceSummaryUpdatedAt:"",_promptDetails:{},_traceSteps:[],_traceStepsLoaded:!1,_traceStepsByAttempt:{},_traceStepsLoadedByAttempt:{},_traceStepsNextAfterSeqByAttempt:{},_traceStepDetails:{}};E.current.set(S,{...E.current.get(S)||{},task:jl,complete:!1,completeUpdatedAt:""}),A.current=S,s(jl),yl(S),au(K3(jl)),ur(Array.isArray(jl?.referenceTaskIds)?jl.referenceTaskIds.join(" "):""),Hr((Gl)=>{if(!Gl)return Gl;let sl=Cu(Gl).map((Zl)=>String(Zl?.id||"")===S?{...Zl,...jl}:Zl);return{...Gl,queue:rl?.queue||Gl.queue,tasks:Gn([sl],Yn)}});let Wl=rl?.changed===!1?`任务 ${S} 的 prompt 未变化`:`已更新 queued 任务 ${S} 的用户 prompt`;Su(Wl),mr("success",Wl),await cf(S,!0,gl)},"编辑 queued 任务 prompt 失败")}async function xW(){if(!h?.id)return;await Br(async()=>{await Bu(Du(r,`/api/tasks/${encodeURIComponent(h.id)}/interrupt`),{method:"POST",body:{}}),await cf(h.id)},"打断 Codex session 失败")}async function bW(){if(!h?.id)return;await Br(async()=>{await Bu(Du(r,`/api/tasks/${encodeURIComponent(h.id)}/retry`),{method:"POST",body:{}}),await cf(h.id)},"重新入队失败")}async function vW(z){let S=String(h?.id||""),a=String(z||"").trim();if(!S||!a)return;let rl=Fy(h);if(a===rl){Su(`任务 ${S} 已在 queue=${a}`);return}await Br(async()=>{let Wl=(await Bu(Du(r,`/api/tasks/${encodeURIComponent(S)}/move`),{method:"POST",body:{queueId:a}}))?.task||{...h,queueId:a};if(E.current.set(S,{...E.current.get(S)||{},task:Wl}),A.current=S,s(Wl),yl(S),Nu(a),!Cr(gl))Hr(null),zr(a);let Gl=`已将任务 ${S} 从 ${rl} 移动到 ${a}`;Su(Gl),mr("success",Gl),await cf(S,!0,Cr(gl)?dn:a)},"移动任务 queue 失败")}async function gW(){let z=A.current;if(!z)return;let S=performance.now();await Br(async()=>{Wf({phase:"session",taskId:z,queueMs:0,totalMs:0,partial:!0,startedAt:new Date}),await Jt(z,!0,S,0)},"刷新 Trace Summary 失败")}function kW(z){A.current=z,N.current+=1,yl(z);let S=E.current.get(z);if(S?.task)s(S.task),tl(!1);else{tl(!0);let a=$n.find((rl)=>rl.id===z);if(a)s(a);else s(null)}cf(z).catch((a)=>ju(Hu(a,"切换 Codex session 失败")))}function v8(z){if(kW(z),dp())dy(!1)}function Vj(z,S,a){if(!z||!Array.isArray(z?.tasks)||S.length===0||Object.keys(a).length===0)return z;let rl=!1,jl=Cu(z).map((Wl)=>{if(String(Wl?.id||"")!==S)return Wl;return rl=!0,X$(KQ(Wl,a))});return rl?{...z,tasks:jl}:z}function IW(z,S){Hr((a)=>Vj(a,z,S)),El((a)=>Vj(a,z,S))}function aW(z,S,a){let rl=String(z?.type||"");if(rl==="queue-updated")return!0;if(rl==="trace-stats-updated"||rl==="trace-step-created")return!1;if(S.length===0)return!0;if(!a)return!0;if(z?.queueId&&String(z.queueId)!==Fy(a))return!0;if(z?.status&&String(z.status)!==String(a?.status||""))return!0;return String(z?.reason||"")!=="output"}function Sj(){if(!t||!H2())return;if(O.current!==null)window.clearTimeout(O.current);O.current=window.setTimeout(()=>{O.current=null,cf(A.current,!1).catch((z)=>ju(Hu(z,"Code Queue 事件刷新失败")))},120)}function oW(z,S){if(!t||!H2()||A.current!==z)return;if(V.current=V.current||S,Z.current!==null)return;Z.current=window.setTimeout(()=>{Z.current=null;let a=V.current;if(V.current=!1,Jt(z,!0).catch((rl)=>ju(Hu(rl,"事件刷新 Trace Summary 失败"))),a)HW(z)},250)}function dW(z){let S=ol(z?.payload)||z,a=ol(S?.stats),rl=String(z?.type||S?.type||""),jl=String(S?.subjectKind||a?.subjectKind||""),Wl=String(S?.scopeId||a?.scopeId||""),Gl=String(S?.taskId||(jl==="task"?S?.subjectId:"")||a?.taskId||z?.taskId||""),sl=S?.attemptIndex??a?.attemptIndex,Zl=sl===null||sl===void 0||sl===""?null:un(sl),Yl=a||ol(S?.traceStats),Rl=Yl?.stepCount??Yl?.llmStepCount,Au=Yl?.outputMaxSeq;return{...S,type:rl,eventId:z?.eventId||S?.eventId,sequence:z?.sequence??S?.sequence,taskId:Gl,subjectKind:jl,scopeId:Wl,attemptIndex:Zl,stepCount:Rl,outputMaxSeq:Au,updatedAt:Yl?.updatedAt||S?.updatedAt||z?.createdAt,traceStats:Yl,statsSource:Yl?"oa-event-flow":S?.statsSource}}function eW(z){let S=dW(z),a=String(S?.taskId||""),rl=String(S?.scopeId||S?.traceStats?.scopeId||""),jl=String(S?.subjectKind||S?.traceStats?.subjectKind||"")==="task-attempt"||Number(S?.attemptIndex)>0||/:attempt:\d+$/u.test(rl),Wl=wQ(S?.stepCount),Gl={},sl=a.length>0?Cu(D.current).find((Zl)=>String(Zl?.id||"")===a):null;if(a.length>0){if(S?.status)Gl.status=String(S.status);if(S?.updatedAt)Gl.updatedAt=String(S.updatedAt);if(S?.queueId)Gl.queueId=String(S.queueId);if(!jl&&Number.isFinite(Number(S?.stepCount)))Gl.stepCount=Wl,Gl.llmStepCount=Wl;if(!jl&&Number.isFinite(Number(S?.outputMaxSeq)))Gl.outputMaxSeq=wQ(S.outputMaxSeq);if(!jl&&ol(S?.traceStats))Gl.traceStats=S.traceStats,Gl.statsSource="oa-event-flow";if(Object.keys(Gl).length>0&&(E.current.has(a)||A.current===a))Mf(a,Gl,N.current);if(Object.keys(Gl).length>0)IW(a,Gl);if(A.current===a&&(S?.type==="trace-step-created"||S?.type==="task-updated"||S?.type==="trace-stats-updated")){let Zl=Uz(sl),Yl=S?.type==="trace-step-created"||S?.type==="trace-stats-updated"&&Number.isFinite(Number(S?.stepCount))&&(jl||Zl===null||Wl>Zl);oW(a,Yl)}}if(aW(S,a,sl))Sj()}df(()=>{if(H.current){H.current=!1;return}Br(()=>cf(A.current),"Code Queue 加载失败")},[t?.id,gl]),df(()=>{if(!t||typeof EventSource>"u")return;let z=new EventSource(bp(r),{withCredentials:!0}),S=(rl)=>{try{eW(JSON.parse(String(rl.data||"{}")))}catch(jl){ju(Hu(jl,"解析 Code Queue 事件失败"))}},a=()=>{if(H2())Sj()};return z.addEventListener("trace-step-created",S),z.addEventListener("task-updated",S),z.addEventListener("queue-updated",S),z.addEventListener("trace-stats-updated",S),document.addEventListener("visibilitychange",a),()=>{if(z.close(),document.removeEventListener("visibilitychange",a),O.current!==null)window.clearTimeout(O.current),O.current=null;if(Z.current!==null)window.clearTimeout(Z.current),Z.current=null}},[t?.id,r,gl]),df(()=>{if(!t||!h||ul)return;let z=String(h.id||"");if(!z)return;let S=String(h.updatedAt||"");if(G3(h))return;let a=`${z}:${S||"unknown"}:${String(h?._traceSummaryUpdatedAt||"")}`;if(p.current.has(a))return;p.current.add(a),Jt(z,!0).catch((rl)=>ju(Hu(rl,"自动加载 Trace Summary 失败")))},[t?.id,h?.id,h?.updatedAt,h?.traceStats?.statsRevision,h?._traceSummaryUpdatedAt,h?._traceSummaryLoaded,ul]),df(()=>{if(!t||!h||ul)return;let z=String(h.id||""),S=Number(Jr(h)?.currentAttempt||h?.currentAttempt||0);if(!z||!bQ(h)||!Number.isFinite(S)||S<=0)return;if(E3(h,S))return;let a=`${z}:current-attempt:${S}:${String(h?.updatedAt||"")}`;if(p.current.has(a))return;p.current.add(a),C$(S).catch((rl)=>ju(Hu(rl,"自动加载当前 Attempt Trace Steps 失败")))},[t?.id,h?.id,h?.status,h?.currentAttempt,h?.updatedAt,h?._traceSummaryUpdatedAt,ul]),df(()=>{if(!t)return;b8().catch((z)=>ju(Hu(z,"加载工作目录失败")));return},[t?.id]),df(()=>{if(!t)return;Hj(gl);return},[t?.id,r,gl]);let lT=_n.length===0?L(Ny,{title:yf?M?"搜索中":"没有匹配任务":"队列为空",text:yf?M?`正在搜索包含“${Q0}”的 task...`:`未找到包含“${Q0}”的 task;可换个关键词或切换 queue。`:"提交一个任务后,Codex 会串行执行并保存输出。"}):[Wj.length>0?L(C2,{key:"unread",title:"已结束未读",tasks:Wj,selectedId:fl,emptyText:"暂无已结束未读任务。",onSelect:v8,onCopy:s8,onReference:R8,onMarkRead:x8,copiedTaskId:A0,markingReadTaskId:ey}):null,L(C2,{key:"active",title:"运行 / 排队",tasks:UW,selectedId:fl,emptyText:"当前没有运行或排队任务。",onSelect:v8,onCopy:s8,onReference:R8,onMarkRead:x8,copiedTaskId:A0,markingReadTaskId:ey}),L(C2,{key:"history",title:"历史 session",tasks:QW,selectedId:fl,emptyText:"最近没有完成、失败或取消的 session。",onSelect:v8,onCopy:s8,onReference:R8,onMarkRead:x8,copiedTaskId:A0,markingReadTaskId:ey}),L("div",{key:"pagination",className:"codex-task-pagination","data-testid":"codex-task-pagination"},L("span",null,yf?`搜索“${Q0}” · 已显示 ${_n.length} / ${Number.isFinite(m0)?m0:_n.length}`:`已加载 ${_n.length} / ${Number.isFinite(m0)?m0:_n.length}`),Kj?L("button",{type:"button",className:"ghost-btn",disabled:S8,onClick:()=>void Dj(),"data-testid":"codex-load-more-tasks-button"},S8?"加载中":yf?"加载更多结果":"加载更早任务"):L("code",null,yf?"已到结果末尾":"已到队列末尾"))],Yj=(z,S=!1)=>L("label",{className:`code-queue-switcher ${S?"compact":""}`},L("span",null,S?"Queue":"查看 queue"),L("select",{value:gl,onChange:(a)=>VW(String(a.target.value||dn)),"data-testid":z},L("option",{value:dn},`All queues · ${Number.isFinite(Nt)?Nt:$n.length} tasks · ${fc.length} running`),hf.map((a)=>L("option",{key:String(a?.id||""),value:String(a?.id||"")},j1(a))))),uT=L("div",{className:"codex-task-search","data-testid":"codex-task-search"},L("label",{htmlFor:"codex-task-search-input"},"搜索 task"),L("div",{className:"codex-task-search-row"},L("input",{id:"codex-task-search-input",type:"search",value:Al,placeholder:"关键词 / task ID / prompt",autoComplete:"off",onChange:(z)=>Kl(String(z.target.value||"")),"data-testid":"codex-task-search-input"}),Al?L("button",{type:"button",className:"ghost-btn",onClick:()=>Kl(""),"data-testid":"codex-task-search-clear"},"清除"):null),L("small",{"data-testid":"codex-task-search-summary"},yf?M?"搜索中...":`匹配 ${_n.length}/${Number.isFinite(m0)?m0:_n.length}`:"支持 task ID、prompt、状态、provider、模型和最近输出关键词")),rT=L("div",{className:"codex-trace-status","data-testid":"codex-trace-status-summary"},L("span",{className:"codex-trace-status-chip queued"},L("b",null,"排队"),String(V$)),L("span",{className:"codex-trace-status-chip running"},L("b",null,"运行"),String(NW)),L("span",{className:`codex-trace-status-chip unread ${U0>0?"warn":""}`},L("b",null,"结束未读"),String(U0)),L("span",{className:"codex-trace-status-chip service"},L("b",null,"服务"),`${mW.providerStatus||"unknown"} · ${t?.providerId||"D601"} · ${wW.public?"公网暴露":"仅 UniDesk frontend 代理访问"}`),L("span",{className:"codex-trace-status-chip"},L("b",null,"执行节点"),Y$.map((z)=>z.id).join(" / ")),L("span",{className:"codex-trace-status-chip"},L("b",null,"执行模式"),zj.map((z)=>z.id).join(" / ")),L("span",{className:"codex-trace-status-chip"},L("b",null,"模型"),pj.join(" / ")),L("span",{className:"codex-trace-status-chip"},L("b",null,"加载"),xr?.phase==="complete"?sp(xr?.totalMs):String(xr?.phase||"idle")),L("span",{className:"codex-trace-status-chip"},L("b",null,"刷新"),Z$?iu(Z$):"--")),fT=L(hi,{title:h?`Trace ${String(h.id).slice(0,22)}`:"Trace 输出",eyebrow:h?`${h.status} / view=${S$} / task queue=${Fy(h)} / provider=${h.providerId||"D601"} / mode=${h.executionMode||"default"} / ${h.model} / agent loop trace`:`Agent loop trace / view=${S$}`,summary:rT,loading:ul||uc||M||nl||xr?.phase==="loading",actions:L("div",{className:"panel-actions"},Yj("code-queue-filter-select"),L("button",{type:"button",className:"ghost-btn codex-mark-all-read-btn",disabled:U0===0||Tu||lc,onClick:()=>void DW(),"data-testid":"codex-mark-all-read-button"},lc?"标记中":`全部标已读${U0>0?` (${U0})`:""}`),h?L("button",{type:"button",className:"ghost-btn",disabled:ul||Tu,onClick:()=>void gW(),"data-testid":"codex-load-full-trace-button"},ul?"加载中":Jr(h)?"刷新 Summary":"加载 Summary"):null,L("button",{type:"button",className:"codex-session-title-toggle",onClick:()=>dy((z)=>!z),"data-testid":"code-queue-sidebar-toggle"},oy?"收起队列":"展开队列"),L("label",{className:"inline-check"},L("input",{type:"checkbox",checked:Sn,onChange:(z)=>Z8(Boolean(z.target.checked))}),"自动滚动"),L("button",{type:"button",className:"ghost-btn",disabled:!GW||Tu,onClick:()=>void xW(),"data-testid":"codex-interrupt-button"},"打断"),L("button",{type:"button",className:"ghost-btn",disabled:!WW||Tu,onClick:()=>void bW()},"重试"),h?L(v2,{title:"Codex Task",data:h,onOpen:u,testId:"raw-codex-task"}):null),className:"codex-output-panel"},L("div",{className:`codex-session-shell ${oy?"":"queue-collapsed"}`},oy?L("aside",{className:"codex-session-sidebar","data-testid":"codex-session-sidebar"},L("div",{className:"codex-session-sidebar-head"},L("div",null,L("span",null,Cr(gl)?"All queues":"Queue lane"),L("strong",null,`${S$} · ${$n.length}/${Number.isFinite(Nt)?Nt:$n.length} sessions · 未读 ${U0}`)),L("button",{type:"button",className:"ghost-btn",onClick:()=>dy(!1)},"收起")),Yj("code-queue-filter-sidebar",!0),uT,L("div",{className:"codex-task-list codex-task-list-session",onScroll:BW,"data-testid":"codex-task-list-scroll"},lT)):null,L("div",{className:"codex-session-main"},L("div",{className:"codex-output-stack"},L(JO,{task:h,loading:ul,onLoadPromptPart:OW,onLoadSteps:C$,onLoadStep:ZW}),L(UO,{task:h})))));if(!t)return L(Ny,{title:"Code Queue 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=code-queue"});let Xj=Number(xr?.totalMs),Pj=Number(xr?.queueMs),Cj=Number(xr?.detailMs),hj=Number(xr?.transcriptRows),nT=xr?.phase==="complete"?"complete":String(xr?.phase||"idle"),tT=Ay(hf,Ui)||{id:Ui,name:Ui},iT=nf?L(_Q,{title:"合并 queue",titleId:"codex-merge-dialog-title",className:"codex-merge-dialog",backdropClassName:"codex-merge-dialog-backdrop",bodyClassName:"codex-merge-dialog-body",actionsClassName:"codex-merge-dialog-actions",testId:"codex-merge-queue-dialog",closeTestId:"codex-merge-queue-close",disableClose:Tu,onClose:()=>lr(!1),actions:[L("button",{key:"cancel",type:"button",className:"ghost-btn",onClick:()=>lr(!1),disabled:Tu,"data-testid":"codex-merge-queue-cancel"},"取消"),L("button",{key:"confirm",type:"button",className:"primary-btn",onClick:()=>void hW(),disabled:Tu||e||!tf,"data-testid":"codex-merge-queue-confirm"},Tu?"合并中...":"确认合并")]},L("p",{className:"codex-merge-dialog-target"},"目标 queue:",L("code",null,j1(tT))),L("label",null,"源 queue",L("select",{value:tf,disabled:Tu||e,onChange:(z)=>Or(String(z.target.value||"")),"data-testid":"codex-merge-source-queue-select"},L("option",{value:""},"选择要合并进来的源 queue"),jt.map((z)=>L("option",{key:String(z?.id||""),value:String(z?.id||"")},j1(z))))),L("p",{className:"codex-merge-dialog-note"},"会把源 queue 的任务归属合并到目标 queue,并自动删除源 queue;目标 queue 会按原 queueEnteredAt/createdAt 时间顺序运行。")):null;return L("div",{className:`code-queue-page ${n?"codex-standalone-page":""}`,"data-testid":"code-queue-page","data-load-state":nT,"data-load-total-ms":Number.isFinite(Xj)?String(Math.round(Xj*10)/10):"","data-load-queue-ms":Number.isFinite(Pj)?String(Math.round(Pj*10)/10):"","data-load-detail-ms":Number.isFinite(Cj)?String(Math.round(Cj*10)/10):"","data-load-transcript-rows":Number.isFinite(hj)?String(hj):"","data-load-task-id":String(xr?.taskId||fl||""),"data-load-partial":xr?.partial?"true":"false"},L(el,{error:H8,wide:!0}),iT,L("div",{className:"codex-session-stage codex-session-stage-top"},L(cO,{diagnostics:B8,queue:Ou,onRaw:u}),fT),L("div",{className:"code-queue-layout"},L("div",{className:"codex-left-rail"},L(hi,{title:"提交任务",eyebrow:e?"Submitting...":Xn.length>1?`${Xn.length} tasks`:"Single or Batch",className:"codex-compose-panel",loading:e},L("form",{className:`codex-task-form ${e?"is-submitting":""}`,onSubmit:MW,"data-testid":"code-queue-task-form","aria-busy":e?"true":"false"},L("label",null,"Prompt / 多任务用单独一行 --- 分隔",L("textarea",{value:pl,rows:8,disabled:e,onChange:(z)=>Hl(z.target.value),placeholder:"写入 Codex 任务;多个任务之间用 --- 分隔。"})),L("label",{className:"codex-reference-field"},"引用任务 ID(可选)",L("input",{value:bl,disabled:e,onChange:(z)=>_u(z.target.value),placeholder:"codex_...;支持空格/逗号分隔多个 ID","data-testid":"codex-reference-task-id"}),Ci(bl).length>0?L("code",null,`后端将解析并注入:${Ci(bl).join(" / ")}`):null),L("div",{className:"codex-form-grid"},L("label",{className:"codex-submit-queue-field"},"Queue",L("div",{className:"codex-submit-queue-row"},L("select",{className:"codex-submit-queue-select",value:tu,disabled:e,onChange:(z)=>Nu(String(z.target.value||"default")),"data-testid":"code-queue-id-select"},hf.map((z)=>L("option",{key:String(z?.id||""),value:String(z?.id||"")},j1(z)))),L("button",{type:"button",className:"ghost-btn codex-rename-queue-btn",onClick:()=>void PW(),disabled:Tu||e||!tu,title:"修改当前 queue 的显示名称,ID 不变","data-testid":"codex-rename-queue-button"},"改名"),L("button",{type:"button",className:"ghost-btn codex-merge-queue-btn",onClick:()=>CW(),disabled:Tu||e||jt.length===0,title:"打开独立窗口选择源 queue 并合并到当前 queue;合并后自动删除源 queue","data-testid":"codex-merge-queue-button"},"合并 queue"),L("button",{type:"button",className:"ghost-btn codex-create-queue-btn",onClick:()=>void XW(),disabled:Tu||e,"data-testid":"codex-create-queue-button"},"创建 queue"))),L("label",null,"模型",L("select",{value:yr,disabled:e,onChange:(z)=>Zr(z.target.value),"data-testid":"codex-model-select"},pj.map((z)=>L("option",{key:z,value:z},z)))),L("label",null,"执行 Provider",L("select",{value:Nl,disabled:e,onChange:(z)=>pW(String(z.target.value||"D601")),"data-testid":"codex-provider-select"},Y$.map((z)=>L("option",{key:z.id,value:z.id},`${z.label||z.id} · ${z.defaultWorkdir||u5(Ou,z.id)}${z.supportsWindowsNativeCodex?" · Windows native":""}`)))),L("label",null,"执行模式",L("select",{value:gu,disabled:e,onChange:(z)=>zW(String(z.target.value||"default")),"data-testid":"codex-execution-mode-select"},zj.map((z)=>L("option",{key:z.id,value:z.id},`${z.label||z.id}${z.id==="windows-native"?" · 宿主 Codex":""}`)))),L("label",{className:"codex-workdir-field"},"工作目录",L("div",{className:"codex-workdir-row"},L("input",{value:cr,disabled:e,onChange:(z)=>ku(z.target.value),placeholder:Oj||Ou?.defaultWorkdir||"/workspace","data-testid":"codex-cwd-input"}),L("select",{value:jy(cr),disabled:e||F0,onChange:(z)=>ku(String(z.target.value||"")),"data-testid":"codex-cwd-select"},Zj.map((z)=>L("option",{key:`${z.providerId}:${z.executionMode}:${z.path}`,value:z.path},`${z.path}${z.source==="default"?" · 默认":""}`))),L("button",{type:"button",className:"ghost-btn codex-workdir-create-btn",disabled:e||Tu||F0,onClick:()=>void SW(),"data-testid":"codex-cwd-create-button"},F0?"处理中":"新建"),L("button",{type:"button",className:"ghost-btn codex-workdir-delete-btn",disabled:e||Tu||F0||!X8,onClick:()=>void YW(),title:X8?"从工作目录下拉菜单删除这个选项,不删除磁盘目录":"当前工作目录尚未保存到下拉菜单","data-testid":"codex-cwd-delete-button"},"删除"))),L("label",null,"最大尝试",L("input",{type:"number",min:1,max:99,value:Gf,disabled:e,onChange:(z)=>Vn(Number(z.target.value)),"data-testid":"codex-max-attempts-input"})),L("label",null,"入队份数",L("input",{type:"number",min:1,max:50,value:Rr,disabled:e,onChange:(z)=>ay(Number(z.target.value)),"data-testid":"codex-repeat-count-input"}))),nc>1?L("label",{className:`codex-batch-confirm ${_t?"confirmed":""}`,"data-testid":"codex-batch-confirm-row"},L("input",{type:"checkbox",checked:_t,disabled:e,onChange:(z)=>At(Boolean(z.target.checked)),"data-testid":"codex-batch-confirm-checkbox"}),L("span",null,`确认批量入队 ${nc} 个任务(prompt 分段 ${Y8.length} × 入队份数 ${mQ(Rr)})`)):null,e?L("div",{className:"codex-submit-wait","data-testid":"codex-submit-wait"},"正在提交到后端,已锁定输入以防重复提交..."):null,L("div",{className:"codex-form-actions"},L("button",{type:"button",className:"ghost-btn",disabled:Tu||e||pl.length===0&&bl.length===0,onClick:()=>{Hl(""),_u(""),At(!1);let z="已清空任务输入栏";Su(z),mr("success",z)},"data-testid":"codex-clear-input-button"},"清空输入"),L("button",{type:"submit",className:"primary-btn",disabled:qW,"data-testid":"codex-enqueue-button"},e?"提交中,请等待...":Ej?`请确认批量入队 ${nc} 个任务`:Xn.length>1?`批量入队 ${Xn.length} 个任务`:"入队并运行"))))),L("div",{className:"codex-main-stage"},L("div",{className:"codex-detail-grid"},L(hi,{title:"运行控制",eyebrow:w0?"Queued prompt editable":P8?"Active turn steer":"Steer when running",loading:Tu},L("div",{className:"codex-run-control-stack"},L(_O,{task:h,queueRows:hf,busy:Tu,onMove:vW}),h?.id?L("form",{className:"codex-steer-form codex-edit-prompt-form",onSubmit:RW,"data-testid":"codex-edit-prompt-form"},L("label",null,"编辑 queued 用户 prompt",L("textarea",{value:mu,rows:5,onChange:(z)=>au(z.target.value),placeholder:"仅 QUEUED 且尚未开始运行的任务可在这里修改原始用户 prompt。",disabled:!w0||Tu,"data-testid":"codex-edit-prompt-textarea"})),L("label",{className:"codex-reference-field"},"引用任务 ID(可选,留空会清除引用)",L("input",{value:yu,disabled:!w0||Tu,onChange:(z)=>ur(z.target.value),placeholder:"codex_...;支持空格/逗号分隔多个 ID","data-testid":"codex-edit-reference-task-id"}),Ci(yu).length>0?L("code",null,`将保留/注入:${Ci(yu).join(" / ")}`):null),L("div",{className:"codex-form-actions"},L("button",{type:"button",className:"ghost-btn",disabled:!h?.id||Tu,onClick:()=>{au(h?K3(h):""),ur(Array.isArray(h?.referenceTaskIds)?h.referenceTaskIds.join(" "):"")},"data-testid":"codex-edit-prompt-reset"},"恢复当前值"),L("button",{type:"submit",className:"primary-btn",disabled:!w0||Tu||mu.trim().length===0,title:w0?"保存后会重写尚未运行任务的用户 prompt":"只有 QUEUED 且尚未开始的任务可编辑 prompt","data-testid":"codex-edit-prompt-submit"},"保存 queued prompt"))):null,L("form",{className:"codex-steer-form",onSubmit:sW},L("label",null,"追加 prompt",L("textarea",{value:Cl,rows:4,onChange:(z)=>lu(z.target.value),placeholder:"给正在运行的 Codex session 推入新的指令或纠偏。",disabled:!P8})),L("button",{type:"submit",className:"primary-btn",disabled:!P8||Tu||Cl.trim().length===0,"data-testid":"codex-steer-button"},"推入运行中 session")))),L(hi,{title:"完成判定",eyebrow:h?.lastJudge?h.lastJudge.source:"judge",loading:ul},h?.lastJudge?L("div",{className:"codex-judge-card","data-testid":"codex-task-judge-card"},L(Ri,{status:h.lastJudge.decision},h.lastJudge.decision),L("strong",null,`${Math.round(Number(h.lastJudge.confidence||0)*100)}% confidence`),L("p",{"data-testid":"codex-task-judge-reason"},Q1(h.lastJudge.reason||"--",180)),L(CQ,{judge:h.lastJudge,testId:"codex-task-judge-failure-details"}),h.lastJudge.continuePrompt?L("code",{"data-testid":"codex-task-judge-continue-prompt"},Q1(h.lastJudge.continuePrompt,160)):null):L(Ny,{title:"尚未判定",text:"Codex turn 结束后会由 MiniMax M2.7 或 fallback judge 判定 complete/retry/fail;retry 会在已有 thread 追加继续执行 prompt。"}))),L($O,{stats:D8,queueName:S$,onRaw:u}),L(hi,{title:"Attempts",eyebrow:"terminal vs interruption",loading:ul},L(QO,{task:h})))))}var Qy=Ml(Ju(),1);var R=Qy.default.createElement,{useEffect:r5}=Qy.default,Wn=Qy.default.useState,fm=["all","meeting","decision","goal","blocker","debt","experiment"],nm=["all","G0","G1","G2","G3","P0","P1","P2","P3","none"],tm=["all","active","blocked","parked","done"],mO=[{id:"all",label:"全部需求"},{id:"external-goal",label:"外部目标"},{id:"internal-goal",label:"内部目标"},{id:"blocker",label:"阻塞"},{id:"parked",label:"停放事项"},{id:"authority",label:"决议/实验/债务"}],n5=[{id:"external-goal",label:"外部目标",type:"goal",level:"G0",status:"active",tags:["external-goal","requirement"]},{id:"internal-goal",label:"内部目标",type:"goal",level:"G1",status:"active",tags:["internal-goal","requirement"]},{id:"blocker",label:"阻塞",type:"blocker",level:"P0",status:"blocked",tags:["blocker","requirement"]},{id:"parked",label:"停放事项",type:"goal",level:"G3",status:"parked",tags:["parked","requirement"]},{id:"decision",label:"决议",type:"decision",level:"none",status:"active",tags:["decision"]},{id:"experiment",label:"实验",type:"experiment",level:"G2",status:"active",tags:["experiment"]},{id:"debt",label:"债务",type:"debt",level:"P2",status:"active",tags:["debt"]}],q1="frontend-work-diary.md";function L1({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return R("span",{className:`status-badge ${r}`},u||l||"unknown")}function D3({label:l,value:u,hint:r,tone:f}){return R("article",{className:`metric-card ${f||""}`},R("div",{className:"metric-label"},l),R("div",{className:"metric-value"},u),R("div",{className:"metric-hint"},r))}function hr({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return R("section",{className:`panel ${n||""}`},R("div",{className:"panel-head"},R("div",null,u?R("p",{className:"panel-eyebrow"},u):null,R(nu,{title:l,loading:t})),r?R("div",{className:"panel-actions"},r):null),R("div",{className:"panel-body"},f))}function Jy({title:l,data:u,onOpen:r,testId:f}){return R("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function rn({title:l,text:u}){return R("div",{className:"empty-state"},R("strong",null,l),R("span",null,u))}function wO(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function qO(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function LO(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function gt(l,u){return`${l}/microservices/decision-center/proxy${u}`}function im(l){if(l==="G0"||l==="G1")return"online";if(l==="P0"||l==="P1")return"failed";if(l==="none")return"unknown";return"warn"}function ym(l){if(l==="done")return"online";if(l==="blocked")return"failed";if(l==="parked")return"warn";return"unknown"}function vi(l=new Date){let u=l.getFullYear(),r=String(l.getMonth()+1).padStart(2,"0"),f=String(l.getDate()).padStart(2,"0");return`${u}-${r}-${f}`}function i5(l){return Ll(l)||"--"}function S3(l,u=220){let r=String(l||"").replace(/\s+/gu," ").trim();return r.length>u?`${r.slice(0,u-1)}...`:r}function Y3(l){return String(l||"").replace(/[^A-Za-z0-9_-]+/g,"-")||"item"}function t5(l){return String(l||"").split(",").map((u)=>u.trim()).filter(Boolean).slice(0,50)}function X3(l){return Array.isArray(l)?l.join(", "):String(l||"")}function f5(l){let u=n5.find((r)=>r.id===l)||n5[0];return{id:"",category:u?.id||"external-goal",type:u?.type||"goal",level:u?.level||"G0",status:u?.status||"active",title:"",body:"",linkedGoalId:"",tags:X3(u?.tags||[]),evidenceLinks:"",sourceSession:"frontend",taskId:"",commitId:""}}function rm(l){return{id:l?.id||"",category:"custom",type:l?.type||"meeting",level:l?.level||"none",status:l?.status||"active",title:l?.title||"",body:l?.body||l?.summary||"",linkedGoalId:l?.linkedGoalId||"",tags:X3(l?.tags),evidenceLinks:X3(l?.evidenceLinks),sourceSession:l?.sourceSession||"frontend",taskId:l?.taskId||"",commitId:l?.commitId||""}}function GO(l){return{type:l.type,level:l.level,status:l.status,title:String(l.title||"").trim(),body:String(l.body||"").trim(),linkedGoalId:String(l.linkedGoalId||"").trim(),tags:t5(l.tags),evidenceLinks:t5(l.evidenceLinks),sourceSession:String(l.sourceSession||"").trim(),taskId:String(l.taskId||"").trim(),commitId:String(l.commitId||"").trim()}}function P3(l){let u=Array.isArray(l.tags)?l.tags.map((r)=>r.toLowerCase()):[];return l.type==="goal"&&l.status!=="blocked"&&l.status!=="parked"&&(l.level==="G0"||u.includes("external-goal"))}function y5(l){let u=Array.isArray(l.tags)?l.tags.map((r)=>r.toLowerCase()):[];return l.type==="goal"&&l.status!=="blocked"&&l.status!=="parked"&&!P3(l)&&(["G1","G2","G3"].includes(l.level)||u.includes("internal-goal"))}function cm(l,u){if(u==="external-goal")return P3(l);if(u==="internal-goal")return y5(l);if(u==="blocker")return l.type==="blocker"||l.status==="blocked";if(u==="parked")return l.status==="parked";if(u==="authority")return["decision","experiment","debt"].includes(l.type);return!0}function V3(l){let u=l?.date||vi();return{date:u,title:l?.title||`${u} 工作日记`,body:l?.body||"",sourceFile:l?.sourceFile||q1,tags:X3(l?.tags||["frontend"])}}function WO(l){let u=String(l.date||vi()).trim(),r=String(l.title||`${u} 工作日记`).trim(),f=String(l.body||"").trim(),n=f.split(` `)[0]?.trim()||"";if(n===`# ${u}`||n.startsWith(`# ${u} `)||n===`# ${r}`)return f;return`# ${u} ${f||`## ${r} -`}`.trim()}function bi({record:l,onRaw:u,compact:r,onEdit:f}){let n=Array.isArray(l.tags)?l.tags:[],t=Array.isArray(l.evidenceLinks)?l.evidenceLinks:[];return R("article",{className:`decision-record-card ${r?"compact":""}`,"data-testid":`decision-record-${S3(l.id)}`},R("div",{className:"decision-record-head"},R("div",null,R("div",{className:"decision-record-meta"},R("span",null,l.type||"--"),R(L1,{status:im(l.level)},l.level||"none"),R(L1,{status:ym(l.status)},l.status||"--")),R("strong",null,l.title||"--")),R("div",{className:"inline-actions"},f?R("button",{type:"button",className:"ghost-btn",onClick:()=>f(l),"data-testid":`edit-record-${S3(l.id)}`},"编辑"):null,R(Jy,{title:`Decision ${l.id}`,data:l,onOpen:u}))),r?R("p",{className:"decision-summary"},V3(l.summary||l.body)):R(c1,{markdown:l.body||l.summary||"",className:"decision-markdown"}),R("div",{className:"decision-record-foot"},l.linkedGoalId?R("code",null,`goal:${l.linkedGoalId}`):null,l.taskId?R("code",null,`task:${l.taskId}`):null,l.commitId?R("code",null,l.commitId.slice(0,12)):null,R("span",null,t5(l.updatedAt))),n.length>0?R("div",{className:"decision-tags"},n.slice(0,8).map((i)=>R("span",{key:i},i))):null,t.length>0?R("div",{className:"decision-evidence"},t.slice(0,4).map((i)=>R("a",{key:i,href:i,target:"_blank",rel:"noreferrer"},V3(i,58)))):null)}function TO({records:l,onRaw:u,onEdit:r}){if(!l.length)return R(rn,{title:"暂无记录",text:"通过 CLI 上传会议记录或决议后会显示在这里。"});return R("div",{className:"table-wrap"},R("table",{className:"decision-table","data-testid":"decision-center-record-table"},R("thead",null,R("tr",null,R("th",null,"等级"),R("th",null,"状态"),R("th",null,"类型"),R("th",null,"标题"),R("th",null,"摘要"),R("th",null,"证据"),R("th",null,"更新"),R("th",null,"操作"))),R("tbody",null,l.map((f)=>R("tr",{key:f.id},R("td",null,R(L1,{status:im(f.level)},f.level||"none")),R("td",null,R(L1,{status:ym(f.status)},f.status||"--")),R("td",null,f.type||"--"),R("td",null,R("strong",null,f.title||"--"),f.linkedGoalId?R("code",null,f.linkedGoalId):null),R("td",null,V3(f.summary||f.body,180)),R("td",null,Array.isArray(f.evidenceLinks)?f.evidenceLinks.length:0),R("td",null,t5(f.updatedAt)),R("td",null,R("div",{className:"inline-actions"},r?R("button",{type:"button",className:"ghost-btn",onClick:()=>r(f),"data-testid":`table-edit-record-${S3(f.id)}`},"编辑"):null,R(Jy,{title:`Decision ${f.id}`,data:f,onOpen:u}))))))))}function Uy(l){return l.map((u)=>R("option",{key:u,value:u},u))}function KO(l){let u=new URLSearchParams;if(l.type!=="all")u.set("type",l.type);if(l.status!=="all")u.set("status",l.status);if(l.level!=="all")u.set("level",l.level);if(l.linkedGoalId.trim())u.set("linkedGoalId",l.linkedGoalId.trim());return u.set("limit","240"),u.toString()}function EO(l){let u=new URLSearchParams;if(l.month!=="all")u.set("month",l.month);if(l.from.trim())u.set("from",l.from.trim());if(l.to.trim())u.set("to",l.to.trim());return u.set("limit","180"),u.toString()}function pO({entry:l,selected:u,onSelect:r,onRaw:f}){return R("article",{className:`diary-entry-card ${u?"selected":""}`,"data-testid":`diary-entry-${S3(l.date||l.id)}`},R("button",{type:"button",className:"diary-entry-main",onClick:()=>r(l)},R("span",{className:"diary-date"},l.date||"--"),R("strong",null,l.title||l.markdownPath||"--"),R("span",null,V3(l.summary||l.body,180))),R("div",{className:"decision-record-foot"},R("code",null,l.markdownPath||"--"),R("span",null,t5(l.updatedAt||l.importedAt)),R(Jy,{title:`Diary ${l.date||l.id}`,data:l,onOpen:f})))}function zO({records:l,activeView:u,onView:r,onEdit:f,onRaw:n}){let t=[{id:"external-goal",title:"外部目标",eyebrow:"G0 / user-facing",records:l.filter(X3)},{id:"internal-goal",title:"内部目标",eyebrow:"G1-G3 / delivery",records:l.filter(i5)},{id:"blocker",title:"阻塞",eyebrow:"P0-P1 / blocked",records:l.filter((i)=>i.type==="blocker"||i.status==="blocked")},{id:"parked",title:"停放事项",eyebrow:"Parked",records:l.filter((i)=>i.status==="parked")},{id:"authority",title:"决议/实验/债务",eyebrow:"Decision / Experiment / Debt",records:l.filter((i)=>["decision","experiment","debt"].includes(i.type))}];return R("div",{className:"requirement-workspace","data-testid":"requirement-workspace"},R("div",{className:"requirement-switcher",role:"tablist","aria-label":"需求视图"},mO.map((i)=>R("button",{key:i.id,type:"button",className:u===i.id?"active":"",onClick:()=>r(i.id),"data-testid":`requirement-filter-${i.id}`},i.label))),R("div",{className:"requirement-lanes"},t.map((i)=>{let y=i.records.filter((c)=>cm(c,u)).slice(0,10);return R("section",{key:i.id,className:"requirement-lane","data-testid":`requirement-lane-${i.id}`},R("div",{className:"requirement-lane-head"},R("div",null,R("p",{className:"panel-eyebrow"},i.eyebrow),R("strong",null,i.title)),R(L1,{status:i.records.length>0?"unknown":"warn"},i.records.length)),y.length===0?R(rn,{title:"暂无条目",text:"用右侧录入台补齐该类需求或筛选条件。"}):R("div",{className:"decision-card-list"},y.map((c)=>R(bi,{key:c.id,record:c,onRaw:n,onEdit:f,compact:!0}))))})))}function OO({form:l,saving:u,message:r,error:f,onChange:n,onCategory:t,onSubmit:i,onReset:y}){return R("form",{className:"record-editor-form",onSubmit:i,"data-testid":"record-editor"},R("div",{className:"editor-mode-grid"},f5.map((c)=>R("button",{key:c.id,type:"button",className:l.category===c.id?"active":"",onClick:()=>t(c.id),"data-testid":`record-template-${c.id}`},c.label))),R("div",{className:"decision-form-grid"},R("label",null,"标题",R("input",{value:l.title,onChange:(c)=>n("title",c.target.value),placeholder:"需求、阻塞、决议或实验标题","data-testid":"record-title-input"})),R("label",null,"类型",R("select",{value:l.type,onChange:(c)=>n("type",c.target.value),"data-testid":"record-type-select"},Uy(fm.filter((c)=>c!=="all")))),R("label",null,"等级",R("select",{value:l.level,onChange:(c)=>n("level",c.target.value),"data-testid":"record-level-select"},Uy(nm.filter((c)=>c!=="all")))),R("label",null,"状态",R("select",{value:l.status,onChange:(c)=>n("status",c.target.value),"data-testid":"record-status-select"},Uy(tm.filter((c)=>c!=="all")))),R("label",null,"Linked Goal",R("input",{value:l.linkedGoalId,onChange:(c)=>n("linkedGoalId",c.target.value),placeholder:"关联目标 id"})),R("label",null,"Tags",R("input",{value:l.tags,onChange:(c)=>n("tags",c.target.value),placeholder:"external-goal, requirement"})),R("label",{className:"wide"},"正文 Markdown",R("textarea",{value:l.body,onChange:(c)=>n("body",c.target.value),placeholder:`- 背景 +`}`.trim()}function bi({record:l,onRaw:u,compact:r,onEdit:f}){let n=Array.isArray(l.tags)?l.tags:[],t=Array.isArray(l.evidenceLinks)?l.evidenceLinks:[];return R("article",{className:`decision-record-card ${r?"compact":""}`,"data-testid":`decision-record-${Y3(l.id)}`},R("div",{className:"decision-record-head"},R("div",null,R("div",{className:"decision-record-meta"},R("span",null,l.type||"--"),R(L1,{status:im(l.level)},l.level||"none"),R(L1,{status:ym(l.status)},l.status||"--")),R("strong",null,l.title||"--")),R("div",{className:"inline-actions"},f?R("button",{type:"button",className:"ghost-btn",onClick:()=>f(l),"data-testid":`edit-record-${Y3(l.id)}`},"编辑"):null,R(Jy,{title:`Decision ${l.id}`,data:l,onOpen:u}))),r?R("p",{className:"decision-summary"},S3(l.summary||l.body)):R(c1,{markdown:l.body||l.summary||"",className:"decision-markdown"}),R("div",{className:"decision-record-foot"},l.linkedGoalId?R("code",null,`goal:${l.linkedGoalId}`):null,l.taskId?R("code",null,`task:${l.taskId}`):null,l.commitId?R("code",null,l.commitId.slice(0,12)):null,R("span",null,i5(l.updatedAt))),n.length>0?R("div",{className:"decision-tags"},n.slice(0,8).map((i)=>R("span",{key:i},i))):null,t.length>0?R("div",{className:"decision-evidence"},t.slice(0,4).map((i)=>R("a",{key:i,href:i,target:"_blank",rel:"noreferrer"},S3(i,58)))):null)}function TO({records:l,onRaw:u,onEdit:r}){if(!l.length)return R(rn,{title:"暂无记录",text:"通过 CLI 上传会议记录或决议后会显示在这里。"});return R("div",{className:"table-wrap"},R("table",{className:"decision-table","data-testid":"decision-center-record-table"},R("thead",null,R("tr",null,R("th",null,"等级"),R("th",null,"状态"),R("th",null,"类型"),R("th",null,"标题"),R("th",null,"摘要"),R("th",null,"证据"),R("th",null,"更新"),R("th",null,"操作"))),R("tbody",null,l.map((f)=>R("tr",{key:f.id},R("td",null,R(L1,{status:im(f.level)},f.level||"none")),R("td",null,R(L1,{status:ym(f.status)},f.status||"--")),R("td",null,f.type||"--"),R("td",null,R("strong",null,f.title||"--"),f.linkedGoalId?R("code",null,f.linkedGoalId):null),R("td",null,S3(f.summary||f.body,180)),R("td",null,Array.isArray(f.evidenceLinks)?f.evidenceLinks.length:0),R("td",null,i5(f.updatedAt)),R("td",null,R("div",{className:"inline-actions"},r?R("button",{type:"button",className:"ghost-btn",onClick:()=>r(f),"data-testid":`table-edit-record-${Y3(f.id)}`},"编辑"):null,R(Jy,{title:`Decision ${f.id}`,data:f,onOpen:u}))))))))}function Uy(l){return l.map((u)=>R("option",{key:u,value:u},u))}function KO(l){let u=new URLSearchParams;if(l.type!=="all")u.set("type",l.type);if(l.status!=="all")u.set("status",l.status);if(l.level!=="all")u.set("level",l.level);if(l.linkedGoalId.trim())u.set("linkedGoalId",l.linkedGoalId.trim());return u.set("limit","240"),u.toString()}function EO(l){let u=new URLSearchParams;if(l.month!=="all")u.set("month",l.month);if(l.from.trim())u.set("from",l.from.trim());if(l.to.trim())u.set("to",l.to.trim());return u.set("limit","180"),u.toString()}function pO({entry:l,selected:u,onSelect:r,onRaw:f}){return R("article",{className:`diary-entry-card ${u?"selected":""}`,"data-testid":`diary-entry-${Y3(l.date||l.id)}`},R("button",{type:"button",className:"diary-entry-main",onClick:()=>r(l)},R("span",{className:"diary-date"},l.date||"--"),R("strong",null,l.title||l.markdownPath||"--"),R("span",null,S3(l.summary||l.body,180))),R("div",{className:"decision-record-foot"},R("code",null,l.markdownPath||"--"),R("span",null,i5(l.updatedAt||l.importedAt)),R(Jy,{title:`Diary ${l.date||l.id}`,data:l,onOpen:f})))}function zO({records:l,activeView:u,onView:r,onEdit:f,onRaw:n}){let t=[{id:"external-goal",title:"外部目标",eyebrow:"G0 / user-facing",records:l.filter(P3)},{id:"internal-goal",title:"内部目标",eyebrow:"G1-G3 / delivery",records:l.filter(y5)},{id:"blocker",title:"阻塞",eyebrow:"P0-P1 / blocked",records:l.filter((i)=>i.type==="blocker"||i.status==="blocked")},{id:"parked",title:"停放事项",eyebrow:"Parked",records:l.filter((i)=>i.status==="parked")},{id:"authority",title:"决议/实验/债务",eyebrow:"Decision / Experiment / Debt",records:l.filter((i)=>["decision","experiment","debt"].includes(i.type))}];return R("div",{className:"requirement-workspace","data-testid":"requirement-workspace"},R("div",{className:"requirement-switcher",role:"tablist","aria-label":"需求视图"},mO.map((i)=>R("button",{key:i.id,type:"button",className:u===i.id?"active":"",onClick:()=>r(i.id),"data-testid":`requirement-filter-${i.id}`},i.label))),R("div",{className:"requirement-lanes"},t.map((i)=>{let y=i.records.filter((c)=>cm(c,u)).slice(0,10);return R("section",{key:i.id,className:"requirement-lane","data-testid":`requirement-lane-${i.id}`},R("div",{className:"requirement-lane-head"},R("div",null,R("p",{className:"panel-eyebrow"},i.eyebrow),R("strong",null,i.title)),R(L1,{status:i.records.length>0?"unknown":"warn"},i.records.length)),y.length===0?R(rn,{title:"暂无条目",text:"用右侧录入台补齐该类需求或筛选条件。"}):R("div",{className:"decision-card-list"},y.map((c)=>R(bi,{key:c.id,record:c,onRaw:n,onEdit:f,compact:!0}))))})))}function OO({form:l,saving:u,message:r,error:f,onChange:n,onCategory:t,onSubmit:i,onReset:y}){return R("form",{className:"record-editor-form",onSubmit:i,"data-testid":"record-editor"},R("div",{className:"editor-mode-grid"},n5.map((c)=>R("button",{key:c.id,type:"button",className:l.category===c.id?"active":"",onClick:()=>t(c.id),"data-testid":`record-template-${c.id}`},c.label))),R("div",{className:"decision-form-grid"},R("label",null,"标题",R("input",{value:l.title,onChange:(c)=>n("title",c.target.value),placeholder:"需求、阻塞、决议或实验标题","data-testid":"record-title-input"})),R("label",null,"类型",R("select",{value:l.type,onChange:(c)=>n("type",c.target.value),"data-testid":"record-type-select"},Uy(fm.filter((c)=>c!=="all")))),R("label",null,"等级",R("select",{value:l.level,onChange:(c)=>n("level",c.target.value),"data-testid":"record-level-select"},Uy(nm.filter((c)=>c!=="all")))),R("label",null,"状态",R("select",{value:l.status,onChange:(c)=>n("status",c.target.value),"data-testid":"record-status-select"},Uy(tm.filter((c)=>c!=="all")))),R("label",null,"Linked Goal",R("input",{value:l.linkedGoalId,onChange:(c)=>n("linkedGoalId",c.target.value),placeholder:"关联目标 id"})),R("label",null,"Tags",R("input",{value:l.tags,onChange:(c)=>n("tags",c.target.value),placeholder:"external-goal, requirement"})),R("label",{className:"wide"},"正文 Markdown",R("textarea",{value:l.body,onChange:(c)=>n("body",c.target.value),placeholder:`- 背景 - 验收标准 - 下一步`,"data-testid":"record-body-editor"})),R("label",null,"证据链接",R("input",{value:l.evidenceLinks,onChange:(c)=>n("evidenceLinks",c.target.value),placeholder:"逗号分隔 URL"})),R("label",null,"Task ID",R("input",{value:l.taskId,onChange:(c)=>n("taskId",c.target.value),placeholder:"可选"})),R("label",null,"Commit ID",R("input",{value:l.commitId,onChange:(c)=>n("commitId",c.target.value),placeholder:"可选"}))),R("div",{className:"dispatch-actions"},R("button",{type:"submit",disabled:u||!String(l.title||"").trim(),"data-testid":"save-record-button"},u?"保存中":l.id?"保存记录":"创建记录"),R("button",{type:"button",className:"ghost-btn",disabled:u,onClick:y},"新建"),l.id?R("code",null,l.id):null),r?R("p",{className:"muted paragraph","data-testid":"record-editor-message"},r):null,R(el,{error:f,title:"记录保存失败",wide:!0}))}function ZO({form:l,saving:u,message:r,error:f,onChange:n,onToday:t,onSubmit:i}){return R("form",{className:"diary-editor-form",onSubmit:i,"data-testid":"diary-editor"},R("div",{className:"decision-form-grid diary-editor-grid"},R("label",null,"日期",R("input",{type:"date",value:l.date,onChange:(y)=>n("date",y.target.value),"data-testid":"diary-date-input"})),R("label",null,"标题",R("input",{value:l.title,onChange:(y)=>n("title",y.target.value),placeholder:"工作日记标题"})),R("label",null,"Source File",R("input",{value:l.sourceFile,onChange:(y)=>n("sourceFile",y.target.value),placeholder:q1})),R("label",null,"Tags",R("input",{value:l.tags,onChange:(y)=>n("tags",y.target.value),placeholder:"frontend, daily"})),R("label",{className:"wide"},"Markdown",R("textarea",{value:l.body,onChange:(y)=>n("body",y.target.value),placeholder:`## 今日进展 ## 阻塞 -## 下一步`,"data-testid":"diary-body-editor"}))),R("div",{className:"dispatch-actions"},R("button",{type:"button",className:"ghost-btn",onClick:t,disabled:u,"data-testid":"today-diary-button"},"今天"),R("button",{type:"submit",disabled:u||!String(l.date||"").trim(),"data-testid":"save-diary-button"},u?"保存中":"保存日记"),R("code",null,`${String(l.date||vi()).slice(0,7)}/${l.date||vi()}.md`)),r?R("p",{className:"muted paragraph","data-testid":"diary-editor-message"},r):null,R(el,{error:f,title:"日记保存失败",wide:!0}))}function $m({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((k)=>k.id==="decision-center")||null,[n,t]=Wn({loading:!1,error:"",health:null,records:[],refreshedAt:null}),[i,y]=Wn({type:"all",status:"all",level:"all",linkedGoalId:""}),[c,_]=Wn("records"),[A,F]=Wn("all"),[j,N]=Wn(r5("external-goal")),[U,w]=Wn({saving:!1,error:"",message:""}),[G,J]=Wn({loading:!1,error:"",entries:[],months:[],selected:null,refreshedAt:null}),[Q,m]=Wn({month:"all",from:"",to:""}),[q,W]=Wn(D3({date:vi(),title:`${vi()} 工作日记`,tags:["frontend"]})),[p,O]=Wn({saving:!1,error:"",message:""});async function Z(){if(!f)return;t((k)=>({...k,loading:!0,error:""}));try{let k=KO(i),g=await Tl(gt(r,`/api/records?${k}`)),cl=await Tl(gt(r,"/api/diary/months")),pl=n.health,Hl="";try{pl=await Tl(`${r}/microservices/decision-center/health`)}catch(bl){Hl=zl(bl,"Decision Center health 检查失败")}t({loading:!1,error:Hl,health:pl,records:Array.isArray(g.records)?g.records:[],refreshedAt:new Date}),J((bl)=>({...bl,months:Array.isArray(cl.months)?cl.months:[]}))}catch(k){t((g)=>({...g,loading:!1,error:zl(k,"Decision Center 加载失败")}))}}async function V(){if(!f)return;J((k)=>({...k,loading:!0,error:""}));try{let k=await Tl(gt(r,`/api/diary/entries?${EO(Q)}`)),g=await Tl(gt(r,"/api/diary/months")),cl=Array.isArray(k.entries)?k.entries:[],pl=X(cl,G.selected);if(J((Hl)=>({loading:!1,error:"",entries:cl,months:Array.isArray(g.months)?g.months:Hl.months,selected:pl,refreshedAt:new Date})),pl&&!pl.body)P(pl)}catch(k){J((g)=>({...g,loading:!1,error:zl(k,"日记加载失败")}))}}async function P(k){J((g)=>({...g,selected:k}));try{let cl=(await Tl(gt(r,`/api/diary/entries/${encodeURIComponent(k.date||k.id)}`))).entry||k;J((pl)=>({...pl,selected:cl})),W(D3(cl))}catch(g){J((cl)=>({...cl,error:zl(g,"日记正文加载失败")}))}}function H(k="external-goal"){N(r5(k)),w({saving:!1,error:"",message:""})}function B(k,g){N((cl)=>({...cl,[k]:g,category:k==="type"||k==="level"||k==="status"?"custom":cl.category}))}function C(k){let g=r5(k);N((cl)=>({...cl,...g,id:cl.id||"",title:cl.title||"",body:cl.body||"",linkedGoalId:cl.linkedGoalId||"",evidenceLinks:cl.evidenceLinks||"",sourceSession:cl.sourceSession||"frontend",taskId:cl.taskId||"",commitId:cl.commitId||""}))}function E(k){N(rm(k)),w({saving:!1,error:"",message:`正在编辑 ${k?.id||""}`}),_("records")}async function D(k){k.preventDefault();let g=GO(j);if(!g.title){w({saving:!1,error:"标题不能为空",message:""});return}w({saving:!0,error:"",message:""});try{let cl=String(j.id||"").trim(),Hl=(await Tl(gt(r,cl?`/api/records/${encodeURIComponent(cl)}`:"/api/records"),{method:cl?"PUT":"POST",body:g})).record;N(rm(Hl||{...g,id:cl})),w({saving:!1,error:"",message:`${cl?"已保存":"已创建"} ${Hl?.id||cl||""}`}),await Z()}catch(cl){w({saving:!1,error:zl(cl,"记录保存失败"),message:""})}}function Y(k,g){W((cl)=>({...cl,[k]:g}))}async function v(){let k=vi();_("diary"),O({saving:!1,error:"",message:""});try{let cl=(await Tl(gt(r,`/api/diary/entries/${encodeURIComponent(k)}`))).entry;J((pl)=>({...pl,selected:cl||pl.selected})),W(D3(cl||{date:k,title:`${k} 工作日记`,tags:["frontend"]})),O({saving:!1,error:"",message:cl?`已打开今天 ${k}`:`已准备今天 ${k}`})}catch{W(D3({date:k,title:`${k} 工作日记`,body:`## 今日进展 +## 下一步`,"data-testid":"diary-body-editor"}))),R("div",{className:"dispatch-actions"},R("button",{type:"button",className:"ghost-btn",onClick:t,disabled:u,"data-testid":"today-diary-button"},"今天"),R("button",{type:"submit",disabled:u||!String(l.date||"").trim(),"data-testid":"save-diary-button"},u?"保存中":"保存日记"),R("code",null,`${String(l.date||vi()).slice(0,7)}/${l.date||vi()}.md`)),r?R("p",{className:"muted paragraph","data-testid":"diary-editor-message"},r):null,R(el,{error:f,title:"日记保存失败",wide:!0}))}function $m({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((k)=>k.id==="decision-center")||null,[n,t]=Wn({loading:!1,error:"",health:null,records:[],refreshedAt:null}),[i,y]=Wn({type:"all",status:"all",level:"all",linkedGoalId:""}),[c,_]=Wn("records"),[A,F]=Wn("all"),[j,N]=Wn(f5("external-goal")),[U,w]=Wn({saving:!1,error:"",message:""}),[G,J]=Wn({loading:!1,error:"",entries:[],months:[],selected:null,refreshedAt:null}),[Q,m]=Wn({month:"all",from:"",to:""}),[q,W]=Wn(V3({date:vi(),title:`${vi()} 工作日记`,tags:["frontend"]})),[p,O]=Wn({saving:!1,error:"",message:""});async function Z(){if(!f)return;t((k)=>({...k,loading:!0,error:""}));try{let k=KO(i),g=await Tl(gt(r,`/api/records?${k}`)),cl=await Tl(gt(r,"/api/diary/months")),pl=n.health,Hl="";try{pl=await Tl(`${r}/microservices/decision-center/health`)}catch(bl){Hl=zl(bl,"Decision Center health 检查失败")}t({loading:!1,error:Hl,health:pl,records:Array.isArray(g.records)?g.records:[],refreshedAt:new Date}),J((bl)=>({...bl,months:Array.isArray(cl.months)?cl.months:[]}))}catch(k){t((g)=>({...g,loading:!1,error:zl(k,"Decision Center 加载失败")}))}}async function V(){if(!f)return;J((k)=>({...k,loading:!0,error:""}));try{let k=await Tl(gt(r,`/api/diary/entries?${EO(Q)}`)),g=await Tl(gt(r,"/api/diary/months")),cl=Array.isArray(k.entries)?k.entries:[],pl=X(cl,G.selected);if(J((Hl)=>({loading:!1,error:"",entries:cl,months:Array.isArray(g.months)?g.months:Hl.months,selected:pl,refreshedAt:new Date})),pl&&!pl.body)P(pl)}catch(k){J((g)=>({...g,loading:!1,error:zl(k,"日记加载失败")}))}}async function P(k){J((g)=>({...g,selected:k}));try{let cl=(await Tl(gt(r,`/api/diary/entries/${encodeURIComponent(k.date||k.id)}`))).entry||k;J((pl)=>({...pl,selected:cl})),W(V3(cl))}catch(g){J((cl)=>({...cl,error:zl(g,"日记正文加载失败")}))}}function H(k="external-goal"){N(f5(k)),w({saving:!1,error:"",message:""})}function B(k,g){N((cl)=>({...cl,[k]:g,category:k==="type"||k==="level"||k==="status"?"custom":cl.category}))}function C(k){let g=f5(k);N((cl)=>({...cl,...g,id:cl.id||"",title:cl.title||"",body:cl.body||"",linkedGoalId:cl.linkedGoalId||"",evidenceLinks:cl.evidenceLinks||"",sourceSession:cl.sourceSession||"frontend",taskId:cl.taskId||"",commitId:cl.commitId||""}))}function E(k){N(rm(k)),w({saving:!1,error:"",message:`正在编辑 ${k?.id||""}`}),_("records")}async function D(k){k.preventDefault();let g=GO(j);if(!g.title){w({saving:!1,error:"标题不能为空",message:""});return}w({saving:!0,error:"",message:""});try{let cl=String(j.id||"").trim(),Hl=(await Tl(gt(r,cl?`/api/records/${encodeURIComponent(cl)}`:"/api/records"),{method:cl?"PUT":"POST",body:g})).record;N(rm(Hl||{...g,id:cl})),w({saving:!1,error:"",message:`${cl?"已保存":"已创建"} ${Hl?.id||cl||""}`}),await Z()}catch(cl){w({saving:!1,error:zl(cl,"记录保存失败"),message:""})}}function Y(k,g){W((cl)=>({...cl,[k]:g}))}async function v(){let k=vi();_("diary"),O({saving:!1,error:"",message:""});try{let cl=(await Tl(gt(r,`/api/diary/entries/${encodeURIComponent(k)}`))).entry;J((pl)=>({...pl,selected:cl||pl.selected})),W(V3(cl||{date:k,title:`${k} 工作日记`,tags:["frontend"]})),O({saving:!1,error:"",message:cl?`已打开今天 ${k}`:`已准备今天 ${k}`})}catch{W(V3({date:k,title:`${k} 工作日记`,body:`## 今日进展 ## 阻塞 ## 下一步 -`,sourceFile:q1,tags:["frontend"]})),O({saving:!1,error:"",message:`今天 ${k} 尚未存在,保存后自动创建`})}}async function K(k){k.preventDefault();let g=String(q.date||"").trim();if(!g){O({saving:!1,error:"日期不能为空",message:""});return}O({saving:!0,error:"",message:""});try{let cl=WO(q),pl=await Tl(gt(r,"/api/diary/import"),{method:"POST",body:{markdown:cl,sourceFile:String(q.sourceFile||q1).trim()||q1,tags:n5(q.tags)}}),Hl=Array.isArray(pl.entries)?pl.entries.find((bl)=>bl.date===g)||pl.entries[0]:null;if(O({saving:!1,error:"",message:`已保存 ${g} / ${pl.pathPattern||"YYYY-MM/YYYY-MM-DD.md"}`}),await V(),Hl)await P(Hl)}catch(cl){O({saving:!1,error:zl(cl,"日记保存失败"),message:""})}}function X(k,g){if(g&&k.some((cl)=>cl.id===g.id))return g;return k[0]||null}if(u5(()=>{Z()},[f?.id,f?.runtime?.providerStatus]),u5(()=>{let k=setTimeout(()=>void Z(),120);return()=>clearTimeout(k)},[i.type,i.status,i.level,i.linkedGoalId]),u5(()=>{if(c!=="diary")return;let k=setTimeout(()=>void V(),120);return()=>clearTimeout(k)},[c,Q.month,Q.from,Q.to,f?.id,f?.runtime?.providerStatus]),!f)return R(rn,{title:"Decision Center 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=decision-center"});let I=wO(f),o=LO(f),fl=qO(f),yl=Array.isArray(n.records)?n.records:[],h=yl.filter((k)=>X3(k)&&k.status!=="done"),s=yl.filter((k)=>i5(k)&&k.status!=="done"),ul=yl.filter((k)=>(k.type==="blocker"||k.status==="blocked")&&k.status!=="done").slice(0,8),tl=yl.filter((k)=>k.status==="parked").slice(0,8),Al=yl.filter((k)=>["decision","experiment","debt"].includes(k.type)).slice(0,12),Kl=yl.filter((k)=>k.type==="meeting"||k.type==="decision").slice(0,12),wl=yl.filter((k)=>cm(k,A)),El=Array.isArray(G.entries)?G.entries:[],M=Array.isArray(G.months)?G.months:[],d=G.selected,nl=Number(n.health?.diaryEntryCount??0);return R("div",{className:"decision-center-page","data-testid":"decision-center-page"},R(hr,{title:"Decision Center",eyebrow:"Authority Records",loading:n.loading,actions:R("div",{className:"inline-actions"},R("button",{type:"button",className:"ghost-btn",onClick:()=>void Z(),disabled:n.loading},n.loading?"刷新中":"刷新"),R(Jy,{title:"Decision Center Health",data:n.health,onOpen:u,testId:"raw-decision-center-health"}))},R("div",{className:"decision-hero"},R("div",{className:"metric-grid"},R(B3,{label:"记录数",value:yl.length,hint:`PostgreSQL / ${n.health?.storage||"postgres"}`,tone:"ok"}),R(B3,{label:"日记",value:nl,hint:"按月 Markdown",tone:nl>0?"ok":"warn"}),R(B3,{label:"外部/内部目标",value:`${h.length}/${s.length}`,hint:"G0-facing / G1-G3 delivery",tone:"ok"}),R(B3,{label:"P0/P1 Blocker",value:ul.length,hint:"requires decision",tone:ul.length>0?"warn":"ok"})),R("div",{className:"microservice-ref-card"},R("span",null,"Runtime"),R("strong",null,I.orchestrator||f.deployment?.mode||"k3sctl"),R("code",null,`${f.providerId} / ${fl.nodeBindHost||"--"}:${fl.nodePort||"--"}`),R("code",null,o.commitId||"--"))),R(el,{error:n.error,title:"Decision Center 请求失败"})),R("div",{className:"decision-tabs",role:"tablist"},R("button",{type:"button",className:c==="records"?"active":"",onClick:()=>_("records"),"data-testid":"decision-tab-requirements"},"需求管理"),R("button",{type:"button",className:c==="diary"?"active":"",onClick:()=>_("diary"),"data-testid":"decision-tab-diary"},"工作日记")),c==="diary"?R(Qy.default.Fragment,null,R(hr,{title:"工作日记编辑台",eyebrow:"Daily Markdown",loading:p.saving,actions:R("div",{className:"inline-actions"},R("button",{type:"button",className:"ghost-btn",onClick:()=>void v(),disabled:p.saving,"data-testid":"today-diary"},"今天"))},R(ZO,{form:q,saving:p.saving,message:p.message,error:p.error,onChange:Y,onToday:()=>void v(),onSubmit:(k)=>void K(k)})),R(hr,{title:"日记筛选",eyebrow:"Markdown by Month",loading:G.loading,actions:R("div",{className:"inline-actions"},R("button",{type:"button",className:"ghost-btn",onClick:()=>void V(),disabled:G.loading},G.loading?"刷新中":"刷新"),R(Jy,{title:"Diary Months",data:M,onOpen:u,testId:"raw-decision-center-diary-months"}))},R("div",{className:"decision-filter-bar"},R("label",null,"月份",R("select",{value:Q.month,onChange:(k)=>m((g)=>({...g,month:k.target.value}))},R("option",{value:"all"},"all"),M.map((k)=>R("option",{key:k.month,value:k.month},`${k.month} (${k.count})`)))),R("label",null,"开始日期",R("input",{type:"date",value:Q.from,onChange:(k)=>m((g)=>({...g,from:k.target.value}))})),R("label",null,"结束日期",R("input",{type:"date",value:Q.to,onChange:(k)=>m((g)=>({...g,to:k.target.value}))})),R("label",null,"存储",R("input",{value:"PostgreSQL / YYYY-MM/YYYY-MM-DD.md",readOnly:!0}))),R(el,{error:G.error,title:"日记请求失败"})),R("div",{className:"diary-layout"},R(hr,{title:"按天条目",eyebrow:`${El.length} Entries`,loading:G.loading},El.length===0?R(rn,{title:"暂无日记",text:"点击“今天”后可自动创建当天 Markdown 日记。"}):R("div",{className:"diary-entry-list"},El.map((k)=>R(pO,{key:k.id,entry:k,selected:d?.id===k.id,onSelect:P,onRaw:u})))),R(hr,{title:d?.title||"日记正文",eyebrow:d?.markdownPath||"Daily Markdown",actions:d?R(Jy,{title:`Diary ${d.date}`,data:d,onOpen:u,testId:"raw-decision-center-diary-selected"}):null},d?R(c1,{markdown:d.body||d.summary||"",className:"decision-markdown diary-markdown"}):R(rn,{title:"未选择日记",text:"从左侧选择一天查看 Markdown 正文。"})))):R(Qy.default.Fragment,null,R(hr,{title:"需求管理工作区",eyebrow:`${wl.length} Filtered`,loading:n.loading},R(zO,{records:yl,activeView:A,onView:F,onEdit:E,onRaw:u})),R(hr,{title:j.id?"编辑需求记录":"录入需求记录",eyebrow:"Record Editor",loading:U.saving},R(OO,{form:j,saving:U.saving,message:U.message,error:U.error,onChange:B,onCategory:C,onSubmit:(k)=>void D(k),onReset:()=>H()})),R(hr,{title:"筛选",eyebrow:"Type / Status / Level"},R("div",{className:"decision-filter-bar","data-testid":"decision-center-filters"},R("label",null,"类型",R("select",{value:i.type,onChange:(k)=>y((g)=>({...g,type:k.target.value}))},Uy(fm))),R("label",null,"状态",R("select",{value:i.status,onChange:(k)=>y((g)=>({...g,status:k.target.value}))},Uy(tm))),R("label",null,"等级",R("select",{value:i.level,onChange:(k)=>y((g)=>({...g,level:k.target.value}))},Uy(nm))),R("label",null,"Linked Goal",R("input",{value:i.linkedGoalId,onChange:(k)=>y((g)=>({...g,linkedGoalId:k.target.value})),placeholder:"goal id"})))),R("div",{className:"decision-default-grid"},R(hr,{title:"外部目标",eyebrow:`${h.length} External Goals`},h.length===0?R(rn,{title:"暂无外部目标",text:"外部目标使用 G0 或 external-goal tag。"}):R("div",{className:"decision-card-list"},h.slice(0,8).map((k)=>R(bi,{key:k.id,record:k,onRaw:u,onEdit:E,compact:!0})))),R(hr,{title:"内部目标",eyebrow:`${s.length} Internal Goals`},s.length===0?R(rn,{title:"暂无内部目标",text:"内部目标使用 G1/G2/G3 或 internal-goal tag。"}):R("div",{className:"decision-card-list"},s.slice(0,8).map((k)=>R(bi,{key:k.id,record:k,onRaw:u,onEdit:E,compact:!0})))),R(hr,{title:"P0/P1 Blocker",eyebrow:`${ul.length} Blockers`},ul.length===0?R(rn,{title:"暂无高优先级阻塞",text:"阻塞记录使用 type=blocker 且 level=P0/P1。"}):R("div",{className:"decision-card-list"},ul.map((k)=>R(bi,{key:k.id,record:k,onRaw:u,onEdit:E,compact:!0})))),R(hr,{title:"停放事项",eyebrow:`${tl.length} Parked`},tl.length===0?R(rn,{title:"暂无停放事项",text:"status=parked 的记录会集中展示。"}):R("div",{className:"decision-card-list"},tl.map((k)=>R(bi,{key:k.id,record:k,onRaw:u,onEdit:E,compact:!0})))),R(hr,{title:"决议/实验/债务",eyebrow:`${Al.length} Authority`},Al.length===0?R(rn,{title:"暂无权威事项",text:"决议、实验和债务会集中展示。"}):R("div",{className:"decision-card-list"},Al.map((k)=>R(bi,{key:k.id,record:k,onRaw:u,onEdit:E,compact:!0})))),R(hr,{title:"最近会议/决议",eyebrow:`${Kl.length} Recent`},Kl.length===0?R(rn,{title:"暂无会议或决议",text:"使用 CLI 上传 Markdown 会议记录后会显示。"}):R("div",{className:"decision-card-list"},Kl.map((k)=>R(bi,{key:k.id,record:k,onRaw:u,onEdit:E,compact:!0}))))),R(hr,{title:"全部记录",eyebrow:`${yl.length} Records`,actions:n.refreshedAt?R("span",{className:"muted"},`刷新 ${iu(n.refreshedAt)}`):null},R(TO,{records:yl,onRaw:u,onEdit:E}))))}var G1=Ml(Ju(),1);var Vl=G1.default.createElement,{useEffect:y5}=G1.default,c5=G1.default.useState,HO=G1.default.useRef,_5=` +`,sourceFile:q1,tags:["frontend"]})),O({saving:!1,error:"",message:`今天 ${k} 尚未存在,保存后自动创建`})}}async function K(k){k.preventDefault();let g=String(q.date||"").trim();if(!g){O({saving:!1,error:"日期不能为空",message:""});return}O({saving:!0,error:"",message:""});try{let cl=WO(q),pl=await Tl(gt(r,"/api/diary/import"),{method:"POST",body:{markdown:cl,sourceFile:String(q.sourceFile||q1).trim()||q1,tags:t5(q.tags)}}),Hl=Array.isArray(pl.entries)?pl.entries.find((bl)=>bl.date===g)||pl.entries[0]:null;if(O({saving:!1,error:"",message:`已保存 ${g} / ${pl.pathPattern||"YYYY-MM/YYYY-MM-DD.md"}`}),await V(),Hl)await P(Hl)}catch(cl){O({saving:!1,error:zl(cl,"日记保存失败"),message:""})}}function X(k,g){if(g&&k.some((cl)=>cl.id===g.id))return g;return k[0]||null}if(r5(()=>{Z()},[f?.id,f?.runtime?.providerStatus]),r5(()=>{let k=setTimeout(()=>void Z(),120);return()=>clearTimeout(k)},[i.type,i.status,i.level,i.linkedGoalId]),r5(()=>{if(c!=="diary")return;let k=setTimeout(()=>void V(),120);return()=>clearTimeout(k)},[c,Q.month,Q.from,Q.to,f?.id,f?.runtime?.providerStatus]),!f)return R(rn,{title:"Decision Center 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=decision-center"});let I=wO(f),o=LO(f),fl=qO(f),yl=Array.isArray(n.records)?n.records:[],h=yl.filter((k)=>P3(k)&&k.status!=="done"),s=yl.filter((k)=>y5(k)&&k.status!=="done"),ul=yl.filter((k)=>(k.type==="blocker"||k.status==="blocked")&&k.status!=="done").slice(0,8),tl=yl.filter((k)=>k.status==="parked").slice(0,8),Al=yl.filter((k)=>["decision","experiment","debt"].includes(k.type)).slice(0,12),Kl=yl.filter((k)=>k.type==="meeting"||k.type==="decision").slice(0,12),wl=yl.filter((k)=>cm(k,A)),El=Array.isArray(G.entries)?G.entries:[],M=Array.isArray(G.months)?G.months:[],d=G.selected,nl=Number(n.health?.diaryEntryCount??0);return R("div",{className:"decision-center-page","data-testid":"decision-center-page"},R(hr,{title:"Decision Center",eyebrow:"Authority Records",loading:n.loading,actions:R("div",{className:"inline-actions"},R("button",{type:"button",className:"ghost-btn",onClick:()=>void Z(),disabled:n.loading},n.loading?"刷新中":"刷新"),R(Jy,{title:"Decision Center Health",data:n.health,onOpen:u,testId:"raw-decision-center-health"}))},R("div",{className:"decision-hero"},R("div",{className:"metric-grid"},R(D3,{label:"记录数",value:yl.length,hint:`PostgreSQL / ${n.health?.storage||"postgres"}`,tone:"ok"}),R(D3,{label:"日记",value:nl,hint:"按月 Markdown",tone:nl>0?"ok":"warn"}),R(D3,{label:"外部/内部目标",value:`${h.length}/${s.length}`,hint:"G0-facing / G1-G3 delivery",tone:"ok"}),R(D3,{label:"P0/P1 Blocker",value:ul.length,hint:"requires decision",tone:ul.length>0?"warn":"ok"})),R("div",{className:"microservice-ref-card"},R("span",null,"Runtime"),R("strong",null,I.orchestrator||f.deployment?.mode||"k3sctl"),R("code",null,`${f.providerId} / ${fl.nodeBindHost||"--"}:${fl.nodePort||"--"}`),R("code",null,o.commitId||"--"))),R(el,{error:n.error,title:"Decision Center 请求失败"})),R("div",{className:"decision-tabs",role:"tablist"},R("button",{type:"button",className:c==="records"?"active":"",onClick:()=>_("records"),"data-testid":"decision-tab-requirements"},"需求管理"),R("button",{type:"button",className:c==="diary"?"active":"",onClick:()=>_("diary"),"data-testid":"decision-tab-diary"},"工作日记")),c==="diary"?R(Qy.default.Fragment,null,R(hr,{title:"工作日记编辑台",eyebrow:"Daily Markdown",loading:p.saving,actions:R("div",{className:"inline-actions"},R("button",{type:"button",className:"ghost-btn",onClick:()=>void v(),disabled:p.saving,"data-testid":"today-diary"},"今天"))},R(ZO,{form:q,saving:p.saving,message:p.message,error:p.error,onChange:Y,onToday:()=>void v(),onSubmit:(k)=>void K(k)})),R(hr,{title:"日记筛选",eyebrow:"Markdown by Month",loading:G.loading,actions:R("div",{className:"inline-actions"},R("button",{type:"button",className:"ghost-btn",onClick:()=>void V(),disabled:G.loading},G.loading?"刷新中":"刷新"),R(Jy,{title:"Diary Months",data:M,onOpen:u,testId:"raw-decision-center-diary-months"}))},R("div",{className:"decision-filter-bar"},R("label",null,"月份",R("select",{value:Q.month,onChange:(k)=>m((g)=>({...g,month:k.target.value}))},R("option",{value:"all"},"all"),M.map((k)=>R("option",{key:k.month,value:k.month},`${k.month} (${k.count})`)))),R("label",null,"开始日期",R("input",{type:"date",value:Q.from,onChange:(k)=>m((g)=>({...g,from:k.target.value}))})),R("label",null,"结束日期",R("input",{type:"date",value:Q.to,onChange:(k)=>m((g)=>({...g,to:k.target.value}))})),R("label",null,"存储",R("input",{value:"PostgreSQL / YYYY-MM/YYYY-MM-DD.md",readOnly:!0}))),R(el,{error:G.error,title:"日记请求失败"})),R("div",{className:"diary-layout"},R(hr,{title:"按天条目",eyebrow:`${El.length} Entries`,loading:G.loading},El.length===0?R(rn,{title:"暂无日记",text:"点击“今天”后可自动创建当天 Markdown 日记。"}):R("div",{className:"diary-entry-list"},El.map((k)=>R(pO,{key:k.id,entry:k,selected:d?.id===k.id,onSelect:P,onRaw:u})))),R(hr,{title:d?.title||"日记正文",eyebrow:d?.markdownPath||"Daily Markdown",actions:d?R(Jy,{title:`Diary ${d.date}`,data:d,onOpen:u,testId:"raw-decision-center-diary-selected"}):null},d?R(c1,{markdown:d.body||d.summary||"",className:"decision-markdown diary-markdown"}):R(rn,{title:"未选择日记",text:"从左侧选择一天查看 Markdown 正文。"})))):R(Qy.default.Fragment,null,R(hr,{title:"需求管理工作区",eyebrow:`${wl.length} Filtered`,loading:n.loading},R(zO,{records:yl,activeView:A,onView:F,onEdit:E,onRaw:u})),R(hr,{title:j.id?"编辑需求记录":"录入需求记录",eyebrow:"Record Editor",loading:U.saving},R(OO,{form:j,saving:U.saving,message:U.message,error:U.error,onChange:B,onCategory:C,onSubmit:(k)=>void D(k),onReset:()=>H()})),R(hr,{title:"筛选",eyebrow:"Type / Status / Level"},R("div",{className:"decision-filter-bar","data-testid":"decision-center-filters"},R("label",null,"类型",R("select",{value:i.type,onChange:(k)=>y((g)=>({...g,type:k.target.value}))},Uy(fm))),R("label",null,"状态",R("select",{value:i.status,onChange:(k)=>y((g)=>({...g,status:k.target.value}))},Uy(tm))),R("label",null,"等级",R("select",{value:i.level,onChange:(k)=>y((g)=>({...g,level:k.target.value}))},Uy(nm))),R("label",null,"Linked Goal",R("input",{value:i.linkedGoalId,onChange:(k)=>y((g)=>({...g,linkedGoalId:k.target.value})),placeholder:"goal id"})))),R("div",{className:"decision-default-grid"},R(hr,{title:"外部目标",eyebrow:`${h.length} External Goals`},h.length===0?R(rn,{title:"暂无外部目标",text:"外部目标使用 G0 或 external-goal tag。"}):R("div",{className:"decision-card-list"},h.slice(0,8).map((k)=>R(bi,{key:k.id,record:k,onRaw:u,onEdit:E,compact:!0})))),R(hr,{title:"内部目标",eyebrow:`${s.length} Internal Goals`},s.length===0?R(rn,{title:"暂无内部目标",text:"内部目标使用 G1/G2/G3 或 internal-goal tag。"}):R("div",{className:"decision-card-list"},s.slice(0,8).map((k)=>R(bi,{key:k.id,record:k,onRaw:u,onEdit:E,compact:!0})))),R(hr,{title:"P0/P1 Blocker",eyebrow:`${ul.length} Blockers`},ul.length===0?R(rn,{title:"暂无高优先级阻塞",text:"阻塞记录使用 type=blocker 且 level=P0/P1。"}):R("div",{className:"decision-card-list"},ul.map((k)=>R(bi,{key:k.id,record:k,onRaw:u,onEdit:E,compact:!0})))),R(hr,{title:"停放事项",eyebrow:`${tl.length} Parked`},tl.length===0?R(rn,{title:"暂无停放事项",text:"status=parked 的记录会集中展示。"}):R("div",{className:"decision-card-list"},tl.map((k)=>R(bi,{key:k.id,record:k,onRaw:u,onEdit:E,compact:!0})))),R(hr,{title:"决议/实验/债务",eyebrow:`${Al.length} Authority`},Al.length===0?R(rn,{title:"暂无权威事项",text:"决议、实验和债务会集中展示。"}):R("div",{className:"decision-card-list"},Al.map((k)=>R(bi,{key:k.id,record:k,onRaw:u,onEdit:E,compact:!0})))),R(hr,{title:"最近会议/决议",eyebrow:`${Kl.length} Recent`},Kl.length===0?R(rn,{title:"暂无会议或决议",text:"使用 CLI 上传 Markdown 会议记录后会显示。"}):R("div",{className:"decision-card-list"},Kl.map((k)=>R(bi,{key:k.id,record:k,onRaw:u,onEdit:E,compact:!0}))))),R(hr,{title:"全部记录",eyebrow:`${yl.length} Records`,actions:n.refreshedAt?R("span",{className:"muted"},`刷新 ${iu(n.refreshedAt)}`):null},R(TO,{records:yl,onRaw:u,onEdit:E}))))}var G1=Ml(Ju(),1);var Vl=G1.default.createElement,{useEffect:c5}=G1.default,$5=G1.default.useState,HO=G1.default.useRef,A5=` :root { --surfacePrimary: #ffffff; --surfaceSecondary: #f8fafc; @@ -245,15 +245,15 @@ nav .material-icons::before { display: none !important; } } -`;function $5({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return Vl("section",{className:`panel ${n||""}`},Vl("div",{className:"panel-head"},Vl("div",null,u?Vl("p",{className:"panel-eyebrow"},u):null,Vl(nu,{title:l,loading:t})),r?Vl("div",{className:"panel-actions"},r):null),Vl("div",{className:"panel-body"},f))}function BO({title:l,data:u,onOpen:r,testId:f}){return Vl("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function DO({title:l,text:u}){return Vl("div",{className:"empty-state"},Vl("strong",null,l),Vl("span",null,u))}function _m(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function Am(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function Fm(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function VO(l){return l.filter((r)=>r?.id==="filebrowser"||String(r?.id||"").startsWith("filebrowser-")).sort((r,f)=>{let n=(t)=>t.providerId==="D518"?0:t.providerId==="D601"?1:t.id==="filebrowser"?2:3;return n(r)-n(f)||String(r.id).localeCompare(String(f.id))})}function SO(l){if(l?.providerId==="D518")return"D518";return l?.providerId||l?.name||l?.id||"Unknown"}function YO(l,u,r="/"){let f=r.startsWith("/")?r:`/${r}`;return`${l}/microservices/${encodeURIComponent(u)}/proxy${f}`}function XO(l,u){return`${l}/microservices/${encodeURIComponent(u)}/health`}async function PO(l,u=16000){let r=new AbortController,f=setTimeout(()=>r.abort(),u);try{return await Tl(l,{signal:r.signal,failureFields:[!1]})}finally{clearTimeout(f)}}function jm(l){if(l?.providerId==="main-server")return"host / -> /srv";if(l?.providerId==="D601"||l?.providerId==="D518")return"WSL / + /mnt/c -> /srv";return"provider / -> /srv"}function P3(l){return l?.status==="OK"||l?.ok===!0}function CO({service:l,active:u,health:r,onSelect:f,onRaw:n}){let t=_m(l),i=Am(l),y=Fm(l),c=t.container||{},_=P3(r?.body);return Vl("button",{type:"button",className:`filebrowser-target-card ${u?"active":""}`,"data-testid":`filebrowser-target-card-${l.id}`,onClick:f},Vl("span",{className:`status-badge ${_?"ok":t.providerStatus==="online"?"running":"warn"}`},_?"Health OK":t.providerStatus||"unknown"),Vl("strong",null,l.name||l.id),Vl("span",null,jm(l)),Vl("code",null,`${i.nodeBindHost||"--"}:${i.nodePort||"--"}`),Vl("small",null,c.name?`${c.name} / ${c.state||"--"}`:`${y.composeService||"--"}`),Vl("span",{className:"filebrowser-card-raw",onClick:(A)=>{A.stopPropagation(),n(`${l.name} service`,l)}},"JSON"))}function Nm(l){try{return l?.contentDocument||l?.contentWindow?.document||null}catch{return null}}function A5(l){let u=Nm(l);if(u===null||u.head===null)return!1;let r=u.getElementById("unidesk-filebrowser-compact-style");if(r===null)r=u.createElement("style"),r.id="unidesk-filebrowser-compact-style",u.head.appendChild(r);if(r.textContent!==_5)r.textContent=_5;return!0}function hO(l,u){let r=URL.createObjectURL(l),f=document.createElement("a");f.href=r,f.download=u,document.body.appendChild(f),f.click(),f.remove(),setTimeout(()=>URL.revokeObjectURL(r),2000)}function MO(l,u){let r=Nm(l);if(r===null||r.documentElement===null)throw Error("无法访问 File Browser iframe 文档");A5(l);let f=Math.max(640,Math.ceil(l.clientWidth||r.documentElement.clientWidth||1280)),n=Math.max(480,Math.ceil(l.clientHeight||r.documentElement.clientHeight||720)),t=r.documentElement.cloneNode(!0);t.querySelectorAll("script, style, link[rel='stylesheet'], link[rel='preload'], link[rel='icon']").forEach((A)=>A.remove()),t.querySelectorAll("img").forEach((A)=>{A.removeAttribute("src"),A.removeAttribute("srcset")});let i=t.querySelector("head");if(i===null)i=r.createElement("head"),t.insertBefore(i,t.firstChild);let y=r.createElement("style");y.textContent=`${_5} -html,body{width:${f}px!important;min-height:${n}px!important;overflow:hidden!important;}`,i.appendChild(y);let c=new XMLSerializer().serializeToString(t),_=`${c}`;hO(new Blob([_],{type:"image/svg+xml;charset=utf-8"}),u.replace(/\.png$/i,".svg"))}function Jm({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=VO(Array.isArray(l)?l:[]),n=new URLSearchParams(window.location.search).get("target")||"",t=n==="filebrowser-d518"?"filebrowser":n,i=f.some((p)=>p.id===t)?t:f[0]?.id||"",[y,c]=c5(i),[_,A]=c5({loading:!1,refreshedAt:null,health:{},error:""}),[F,j]=c5({exporting:!1,message:"",error:""}),N=HO(null),U=f.find((p)=>p.id===y)||f[0]||null,w=_m(U),G=Am(U),J=Fm(U),Q=U?_.health[U.id]:null,m=U?YO(r,U.id,"/"):"about:blank";y5(()=>{if(f.length===0)return;if(!y||!f.some((p)=>p.id===y))c(f[0].id)},[f.map((p)=>p.id).join(",")]),y5(()=>{let p=0,O=setInterval(()=>{if(p+=1,A5(N.current)||p>=24)clearInterval(O)},500);return()=>clearInterval(O)},[m]),y5(()=>{if(f.length===0)return;let p=!1;async function O(){A((P)=>({...P,loading:!0,error:""}));let V=await Promise.all(f.map(async(P)=>{try{let H=await PO(XO(r,P.id));return[P.id,{ok:!0,body:H}]}catch(H){return[P.id,{ok:!1,error:zl(H,"File Browser health failed")}]}}));if(p)return;A({loading:!1,refreshedAt:new Date().toISOString(),health:Object.fromEntries(V),error:""})}O();let Z=setInterval(O,30000);return()=>{p=!0,clearInterval(Z)}},[f.map((p)=>`${p.id}:${p.runtime?.providerStatus||""}`).join(","),r]);function q(p){c(p);let O=new URL(window.location.href);O.searchParams.set("target",p),window.history.replaceState({},"",`${O.pathname}${O.search}`)}async function W(){if(F.exporting)return;j({exporting:!0,message:"",error:""});try{let p=new Date().toISOString().replace(/[-:.TZ]/g,"").slice(0,14);await MO(N.current,`unidesk-filebrowser-${U?.id||"target"}-${p}.png`),j({exporting:!1,message:"截图已导出",error:""})}catch(p){j({exporting:!1,message:"",error:zl(p,"截图导出失败")})}}if(f.length===0)return Vl(DO,{title:"File Browser 未登记",text:"请在 config.json 的 microservices 中登记 id=filebrowser 或 filebrowser-* 用户服务"});return Vl("div",{className:"filebrowser-page","data-testid":"filebrowser-page"},_.error?Vl(el,{error:_.error,wide:!0}):null,Vl($5,{title:"文件管理器",eyebrow:"File Browser / Host Files",loading:_.loading,actions:Vl("div",{className:"panel-actions"},U?Vl("button",{type:"button",className:"ghost-btn",onClick:W,disabled:F.exporting,"data-testid":"filebrowser-export-screenshot"},F.exporting?"导出中...":"导出截图"):null,U?Vl("a",{className:"ghost-btn",href:m,target:"_blank",rel:"noreferrer"},"新窗口打开"):null,U?Vl(BO,{title:"File Browser 当前目标",data:{service:U,health:Q},onOpen:u,testId:"raw-filebrowser-active"}):null)},Vl("div",{className:"filebrowser-hero"},Vl("div",null,Vl("span",{className:`status-badge ${P3(Q?.body)?"ok":"warn"}`},P3(Q?.body)?"Health OK":"Health Pending"),Vl("h3",null,U?.name||"File Browser"),Vl("p",{className:"muted paragraph"},U?.description||"通过 UniDesk 登录态代理访问,不开放 File Browser 公网端口。"),F.error?Vl("p",{className:"filebrowser-shot-error"},F.error):null,F.message?Vl("p",{className:"filebrowser-shot-ok"},F.message):null),Vl("div",{className:"microservice-ref-card"},Vl("span",null,"Provider"),Vl("strong",null,U?.providerId||"--"),Vl("code",null,w.providerName||U?.providerId||"--")),Vl("div",{className:"microservice-ref-card"},Vl("span",null,"Private Backend"),Vl("strong",null,`${G.nodeBindHost||"--"}:${G.nodePort||"--"}`),Vl("code",null,G.nodeBaseUrl||"--")),Vl("div",{className:"microservice-ref-card"},Vl("span",null,"Image"),Vl("strong",null,J.dockerfile||"filebrowser/filebrowser:v2.63.3"),Vl("code",null,J.commitId||"--")),Vl("div",{className:"microservice-ref-card"},Vl("span",null,"Mount"),Vl("strong",null,jm(U)),Vl("code",null,U?.providerId==="main-server"?"/root, /var, /home":"/home, /mnt/c, /mnt/d")))),Vl($5,{title:"浏览目标",eyebrow:`${f.length} host targets`,loading:_.loading},Vl("div",{className:"filebrowser-target-grid"},f.map((p)=>Vl(CO,{key:p.id,service:p,active:p.id===U?.id,health:_.health[p.id],onSelect:()=>q(p.id),onRaw:u})))),Vl($5,{title:`${SO(U)} 文件视图`,eyebrow:Q?.body?`Health ${P3(Q.body)?"OK":"UNKNOWN"} / ${_.refreshedAt?iu(_.refreshedAt):"--"}`:"Embedded WebUI",className:"filebrowser-frame-panel"},Vl("div",{className:"filebrowser-frame-shell"},Vl("div",{className:"filebrowser-frame-toolbar"},Vl("span",null,"BaseURL"),Vl("code",null,`/api/microservices/${U?.id||"filebrowser"}/proxy`),Vl("span",null,"Root"),Vl("code",null,"/srv"),Vl("span",{className:"filebrowser-compact-note"},"Compact layout injected")),Vl("iframe",{ref:N,key:m,title:`${U?.name||"File Browser"} WebUI`,src:m,className:"filebrowser-frame","data-testid":"filebrowser-frame",onLoad:(p)=>A5(p.currentTarget),sandbox:"allow-downloads allow-forms allow-modals allow-same-origin allow-scripts"}))))}var s3=Ml(Ju(),1);var Ul=s3.default.createElement,{useEffect:sO}=s3.default,RO=s3.default.useState;function C3({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return Ul("span",{className:`status-badge ${r}`},u||l||"unknown")}function kt({label:l,value:u,hint:r,tone:f}){return Ul("article",{className:`metric-card ${f||""}`},Ul("div",{className:"metric-label"},l),Ul("div",{className:"metric-value"},u),Ul("div",{className:"metric-hint"},r))}function h3({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return Ul("section",{className:`panel ${n||""}`},Ul("div",{className:"panel-head"},Ul("div",null,u?Ul("p",{className:"panel-eyebrow"},u):null,Ul(nu,{title:l,loading:t})),r?Ul("div",{className:"panel-actions"},r):null),Ul("div",{className:"panel-body"},f))}function M3({title:l,data:u,onOpen:r,testId:f}){return Ul("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function F5({title:l,text:u}){return Ul("div",{className:"empty-state"},Ul("strong",null,l),Ul("span",null,u))}function xO(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function bO(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function vO(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function gi(l,u){let r=l&&typeof l==="object"?l[u]:void 0;return Number.isFinite(Number(r))?String(r):"--"}function gO(l){return(Array.isArray(l?.jobs)?l.jobs:[]).slice(0,40)}function kO(l){return(Array.isArray(l?.drafts)?l.drafts:[]).slice(0,12)}function Um({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((U)=>U.id==="findjob")||null,[n,t]=RO({loading:!1,error:"",health:null,summary:null,jobs:null,drafts:null,refreshedAt:null});async function i(){if(!f)return;t((U)=>({...U,loading:!0,error:""}));try{let[U,w,G,J]=await Promise.all([Tl(`${r}/microservices/findjob/health`),Tl(`${r}/microservices/findjob/proxy/api/summary`),Tl(`${r}/microservices/findjob/proxy/api/jobs?__unideskArrayLimit=jobs:40`),Tl(`${r}/microservices/findjob/proxy/api/drafts`)]);t({loading:!1,error:"",health:U,summary:w,jobs:G,drafts:J,refreshedAt:new Date})}catch(U){t((w)=>({...w,loading:!1,error:zl(U,"FindJob 加载失败")}))}}if(sO(()=>{i()},[f?.id,f?.runtime?.providerStatus]),!f)return Ul(F5,{title:"FindJob 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=findjob"});let y=xO(f),c=vO(f),_=bO(f),A=n.summary||{},F=gO(n.jobs),j=kO(n.drafts),N=n.jobs?._unidesk?.arrayLimits?.jobs;return Ul("div",{className:"findjob-page","data-testid":"findjob-page"},Ul(h3,{title:"FindJob 工作台",eyebrow:"D601 用户服务",loading:n.loading,actions:Ul("div",{className:"panel-actions"},Ul("button",{type:"button",className:"ghost-btn",onClick:i,disabled:n.loading,"data-testid":"findjob-refresh-button"},n.loading?"刷新中":"刷新"),Ul(M3,{title:"FindJob 用户服务",data:f,onOpen:u,testId:"raw-findjob-service"}))},Ul("div",{className:"findjob-hero"},Ul("div",null,Ul("div",{className:"node-version-line"},Ul(C3,{status:y.providerStatus==="online"?"online":"warn"},y.providerStatus||"unknown"),Ul("span",null,f.providerId),Ul("span",null,_.public?"公网暴露":"仅 UniDesk frontend 代理访问")),Ul("p",{className:"muted paragraph"},f.description)),Ul("div",{className:"microservice-ref-card"},Ul("span",null,"Repo"),Ul("strong",null,c.url||"--"),Ul("code",null,c.commitId||"--")),Ul("div",{className:"microservice-ref-card"},Ul("span",null,"D601 Docker"),Ul("strong",null,`${_.nodeBindHost||"--"}:${_.nodePort||"--"}`),Ul("code",null,`${c.composeFile||"--"} / ${c.composeService||"--"}`))),Ul(el,{error:n.error,wide:!0})),Ul("div",{className:"findjob-grid"},Ul(h3,{title:"岗位指标",eyebrow:n.refreshedAt?`Updated ${iu(n.refreshedAt)}`:"Summary",loading:n.loading},Ul("div",{className:"metric-grid"},Ul(kt,{label:"岗位总量",value:gi(A,"totalJobs"),hint:"tracked jobs",tone:"ok"}),Ul(kt,{label:"原始岗位",value:gi(A,"rawJobs"),hint:"raw queue"}),Ul(kt,{label:"已验证",value:gi(A,"verifiedJobs"),hint:"verified set"}),Ul(kt,{label:"优先处理",value:gi(A,"prioritizedJobs"),hint:"prioritized"}),Ul(kt,{label:"过期",value:gi(A,"staleJobs"),hint:"stale jobs",tone:"warn"}),Ul(kt,{label:"无效",value:gi(A,"invalidJobs"),hint:"invalid jobs",tone:"warn"}),Ul(kt,{label:"上海",value:gi(A,"shanghaiJobs"),hint:"city filter"}),Ul(kt,{label:"Health",value:n.health?.ok?"OK":"--",hint:"D601 /api/health"})),Ul("div",{className:"panel-actions inline-actions"},Ul(M3,{title:"FindJob Summary",data:A,onOpen:u,testId:"raw-findjob-summary"}))),Ul(h3,{title:"近期岗位",eyebrow:N?`${N.returnedLength}/${N.originalLength} Preview`:`${F.length} Preview`,loading:n.loading},F.length===0?Ul(F5,{title:"暂无岗位预览",text:"等待 D601 findjob backend 返回 /api/jobs"}):Ul("div",{className:"table-wrap findjob-job-table"},Ul("table",null,Ul("thead",null,Ul("tr",null,Ul("th",null,"优先级"),Ul("th",null,"状态"),Ul("th",null,"单位"),Ul("th",null,"职位"),Ul("th",null,"城市"),Ul("th",null,"阶段"),Ul("th",null,"截止"),Ul("th",null,"证据"))),Ul("tbody",null,F.map((U)=>Ul("tr",{key:U.id},Ul("td",null,Ul(C3,{status:String(U.priority||"").toLowerCase()||"unknown"},U.priority||"--")),Ul("td",null,Ul(C3,{status:String(U.status||"").toLowerCase()||"unknown"},U.status||"--")),Ul("td",null,U.organization_name||"--",Ul("code",null,U.id||"--")),Ul("td",null,U.display_title||U.title||"--"),Ul("td",null,U.display_city||U.city||"--"),Ul("td",null,U.workflow_stage||"--"),Ul("td",null,U.deadline||"--"),Ul("td",null,U.evidence_url?Ul("a",{href:U.evidence_url,target:"_blank",rel:"noreferrer"},"打开"):Ul("span",{className:"muted"},"无"))))))),Ul("div",{className:"panel-actions inline-actions"},Ul(M3,{title:"FindJob Jobs Preview",data:n.jobs,onOpen:u,testId:"raw-findjob-jobs"}))),Ul(h3,{title:"草稿与报告",eyebrow:`${j.length} Drafts`,loading:n.loading},j.length===0?Ul(F5,{title:"暂无草稿",text:"D601 findjob backend 未返回 drafts"}):Ul("div",{className:"draft-list"},j.map((U)=>Ul("article",{key:U.id,className:"draft-card"},Ul("div",{className:"node-card-head"},Ul("strong",null,U.id),Ul(C3,{status:U.status},U.status||"--")),Ul("div",{className:"docker-meta compact"},Ul("span",null,U.workflow_stage||"--"),Ul("span",null,`jobs ${U.counts?.jobs??0}`),Ul("span",null,`reports ${U.counts?.reports??0}`)),Ul("span",null,U.latestReportPath||"暂无报告"),Ul("code",null,Ll(U.updated_at||U.updatedAt))))),Ul("div",{className:"panel-actions inline-actions"},Ul(M3,{title:"FindJob Drafts",data:n.drafts,onOpen:u,testId:"raw-findjob-drafts"})))))}var E1=Ml(Ju(),1);var x=E1.default.createElement,{useEffect:IO}=E1.default,j5=E1.default.useState;function W1(l){let u=Number(l);return Number.isFinite(u)?`${Math.max(0,Math.min(100,u)).toFixed(1)}%`:"--"}function J5(l){if(l===null||l===void 0||l==="")return"--";let u=Number(l);if(!Number.isFinite(u))return"--";if(u<60)return`${Math.max(0,Math.round(u))}s`;if(u<3600)return`${Math.floor(u/60)}m ${Math.round(u%60)}s`;return`${Math.floor(u/3600)}h ${Math.floor(u%3600/60)}m`}function U5(l,u=2){let r=Number(l);if(!Number.isFinite(r))return l===!1?"false":l===!0?"true":"--";let f=Math.abs(r);if(Number.isInteger(r)||f>=1000)return r.toLocaleString("zh-CN",{maximumFractionDigits:0});if(f>=1)return r.toLocaleString("zh-CN",{maximumFractionDigits:u});return r.toLocaleString("zh-CN",{maximumFractionDigits:Math.max(u,6)})}function K1(l){if(l===null||l===void 0||l==="")return"--";if(typeof l==="boolean")return l?"true":"false";if(typeof l==="number")return U5(l,4);if(Array.isArray(l))return l.map((u)=>K1(u)).join(" x ");if(typeof l==="object")return"已上报";return String(l)}function R3(l){let u=Number(l);if(!Number.isFinite(u)||u<=0)return"--";let r=u>=100?0:u>=10?1:2;return`${u.toLocaleString("zh-CN",{maximumFractionDigits:r})} epoch/h`}function x3(l){return l.replace(/[^a-zA-Z0-9_-]/g,"-")}function or(l){return l&&typeof l==="object"&&!Array.isArray(l)?l:{}}function T1({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return x("span",{className:`status-badge ${r}`},u||l||"unknown")}function It({label:l,value:u,hint:r,tone:f}){return x("article",{className:`metric-card ${f||""}`},x("div",{className:"metric-label"},l),x("div",{className:"metric-value"},u),x("div",{className:"metric-hint"},r))}function N5({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return x("section",{className:`panel ${n||""}`},x("div",{className:"panel-head"},x("div",null,u?x("p",{className:"panel-eyebrow"},u):null,x(nu,{title:l,loading:t})),r?x("div",{className:"panel-actions"},r):null),x("div",{className:"panel-body"},f))}function my({title:l,data:u,onOpen:r,testId:f}){return x("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:(n)=>{n?.stopPropagation?.(),r(l,u)}},"查看原始JSON")}function lt({title:l,text:u}){return x("div",{className:"empty-state"},x("strong",null,l),x("span",null,u))}function aO(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function oO(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function dO(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function eO(l){return l?.counts&&typeof l.counts==="object"&&!Array.isArray(l.counts)?l.counts:{}}function lZ(l){return Array.isArray(l?.jobs)?l.jobs.slice(0,240):[]}function uZ(l){return Array.isArray(l?.projects)?l.projects.slice(0,1000):[]}function b3(l){return Array.isArray(l?.projects)?l.projects:[]}function rZ(l,u){if(Array.isArray(u?.gpu))return u.gpu;if(Array.isArray(l?.gpu))return l.gpu;return[]}function Qf(l,u){return`${l}/microservices/met-nonlinear/proxy${u}`}function Qm(l){return l.startedAt&&l.finishedAt?J5((Date.parse(l.finishedAt)-Date.parse(l.startedAt))/1000):"--"}function fZ(l){let u=l.progress||{};if(u.etaSeconds!==null&&u.etaSeconds!==void 0&&u.etaSeconds!==""){let i=Number(u.etaSeconds);if(Number.isFinite(i))return Math.max(0,i)}let r=Number(u.currentEpoch),f=Number(u.epochTarget??l.epochTarget),n=Date.parse(l.startedAt||"");if(!Number.isFinite(r)||r<=0||!Number.isFinite(f)||f<=r||!Number.isFinite(n))return null;let t=Math.max(0,(Date.now()-n)/1000);if(t<=0)return null;return Math.max(0,t/r*(f-r))}function mm(l){let u=l.progress||{},r=Number(u.epochPerHour);if(Number.isFinite(r)&&r>0)return r;let f=Date.parse(l.startedAt||""),n=["succeeded","failed","canceled"].includes(l.status)?Date.parse(l.finishedAt||""):Date.now();if(!Number.isFinite(f)||!Number.isFinite(n)||n<=f)return null;let t=Number(u.currentEpoch??l.epochTarget);if(!Number.isFinite(t)||t<=0)return null;return t/((n-f)/3600000)}function wm(l){if(l==="staged")return"待启动";if(l==="queued")return"排队中";if(l==="running")return"训练中";if(l==="succeeded")return"已完成";if(l==="failed")return"失败";if(l==="canceled")return"已取消";return l||"unknown"}function qm(l,u,r){return{name:l,path:u,depth:r,count:0,children:[],project:null}}function nZ(l){let u=qm("","",-1);for(let f of l){let t=String(f?.projectPath||"").replace(/\\/g,"/").split("/").filter(Boolean);if(t.length===0)continue;let i=u,y=[];for(let[c,_]of t.entries()){y.push(_);let A=y.join("/"),F=i.children.find((j)=>j.path===A);if(!F)F=qm(_,A,c),i.children.push(F);if(c===t.length-1)F.project=f;i=F}}let r=(f)=>{let n=f.children.reduce((t,i)=>t+r(i),0);return f.count=(f.project?1:0)+n,f.children.sort((t,i)=>{if(Boolean(t.project)!==Boolean(i.project))return t.project?1:-1;return t.name.localeCompare(i.name,"zh-CN",{numeric:!0,sensitivity:"base"})}),f.count};return r(u),u}function tZ(l){let u=or(l.data);return or(u.project).projectPath?or(u.project):u}function iZ(l){return or(or(l.data).job)}function Lm({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((M)=>M.id==="met-nonlinear")||null,[n,t]=j5({loading:!1,actionBusy:!1,error:"",health:null,summary:null,queue:null,projects:null,history:null,images:null,refreshedAt:null}),[i,y]=j5({loading:!1,error:"",kind:"",key:"",title:"",data:null}),[c,_]=j5(()=>({activeTab:"projects",selectedProjects:{},expandedProjectDirs:{},sourceProject:"",forkCount:1,forkEpochs:200,forkPrefix:`ui_fork_${Date.now()}`,maxConcurrency:3,targetGpuName:"2080 Ti",actionMessage:""}));function A(M){_((d)=>({...d,...M}))}async function F(M=c.activeTab){if(!f)return;t((d)=>({...d,loading:!0,error:""}));try{let d=[["health",Tl(`${r}/microservices/met-nonlinear/health`)],["summary",Tl(Qf(r,"/api/summary"))]];if(M==="projects")d.push(["projectsRoot",Tl(Qf(r,"/api/projects?root=projects&limit=500"))]),d.push(["exProjectsRoot",Tl(Qf(r,"/api/projects?root=ex_projects&limit=500"))]);if(M==="current"||M==="completed"||M==="failed")d.push(["queue",Tl(Qf(r,"/api/queue"))]);if(M==="completed"||M==="failed")d.push(["history",Tl(Qf(r,"/api/history"))]);if(M==="gpu")d.push(["images",Tl(Qf(r,"/api/images"))]);let nl=Object.fromEntries(await Promise.all(d.map(async([g,cl])=>[g,await cl]))),k={loading:!1,actionBusy:!1,error:"",health:nl.health,summary:nl.summary,refreshedAt:new Date};if(nl.projectsRoot||nl.exProjectsRoot){let{projectsRoot:g,exProjectsRoot:cl}=nl;k.projects={ok:g?.ok!==!1&&cl?.ok!==!1,roots:[{root:"projects",count:b3(g).length},{root:"ex_projects",count:b3(cl).length}],projects:[...b3(g),...b3(cl)]}}if(nl.queue)k.queue=nl.queue;if(nl.history)k.history=nl.history;if(nl.images)k.images=nl.images;t((g)=>({...g,...k}))}catch(d){t((nl)=>({...nl,loading:!1,actionBusy:!1,error:zl(d,"MET Nonlinear 加载失败")}))}}async function j(M,d){t((nl)=>({...nl,actionBusy:!0,error:""})),A({actionMessage:`${M}...`});try{let nl=await d();A({actionMessage:nl||`${M}完成`}),await F()}catch(nl){t((k)=>({...k,actionBusy:!1,error:zl(nl,`${M}失败`)}))}}async function N(){await j("保存并发设置",async()=>{await Tl(Qf(r,"/api/queue/settings"),{method:"PUT",body:JSON.stringify({maxConcurrency:Number(c.maxConcurrency),targetGpuName:c.targetGpuName})})})}function U(){return Object.entries(c.selectedProjects).filter(([,M])=>M).map(([M])=>M)}async function w(){let M=U();if(M.length===0)throw Error("请先选择至少一个 project");await j("加入待启动队列",async()=>{await Tl(Qf(r,"/api/queue"),{method:"POST",body:JSON.stringify({projectPaths:M,maxConcurrency:Number(c.maxConcurrency),targetGpuName:c.targetGpuName,start:!1})}),A({activeTab:"current",selectedProjects:{}})})}async function G(){let M=c.sourceProject||C[0]?.projectPath;if(!M)throw Error("请先选择源 project");await j("Fork Project",async()=>{let d=await Tl(Qf(r,"/api/projects/fork"),{method:"POST",body:JSON.stringify({sourceProject:M,count:Number(c.forkCount),epochs:Number(c.forkEpochs),prefix:c.forkPrefix})}),nl=Array.isArray(d.projectPaths)?d.projectPaths:[],k=nl.reduce((g,cl)=>{return g[cl]=!0,g},{...c.selectedProjects});return A({selectedProjects:k}),`已 fork ${nl.length} 个 project,并已自动勾选;请确认后点击加入待启动队列。`})}async function J(){await j("启动队列",async()=>{await Tl(Qf(r,"/api/queue/start"),{method:"POST",body:JSON.stringify({maxConcurrency:Number(c.maxConcurrency),targetGpuName:c.targetGpuName})}),A({activeTab:"current"})})}async function Q(M){await j("取消任务",async()=>{await Tl(Qf(r,`/api/jobs/${encodeURIComponent(M.id)}/cancel`),{method:"POST",body:JSON.stringify({})})})}async function m(M){let d=String(M?.projectPath||"");if(!d)return;y({loading:!0,error:"",kind:"project",key:d,title:d,data:null});try{let nl=await Tl(Qf(r,`/api/projects/config?path=${encodeURIComponent(d)}`));y({loading:!1,error:"",kind:"project",key:d,title:d,data:nl})}catch(nl){y({loading:!1,error:zl(nl,"Project 详情加载失败"),kind:"project",key:d,title:d,data:null})}}async function q(M){let d=String(M?.id||"");if(!d)return;y({loading:!0,error:"",kind:"job",key:d,title:M.projectPath||d,data:null});try{let nl=await Tl(Qf(r,`/api/jobs/${encodeURIComponent(d)}`));y({loading:!1,error:"",kind:"job",key:d,title:nl?.job?.projectPath||M.projectPath||d,data:nl})}catch(nl){y({loading:!1,error:zl(nl,"Job 详情加载失败"),kind:"job",key:d,title:M.projectPath||d,data:null})}}if(IO(()=>{F(c.activeTab)},[f?.id,f?.runtime?.providerStatus,c.activeTab]),!f)return x(lt,{title:"MET Nonlinear 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=met-nonlinear"});let W=aO(f),p=dO(f),O=oO(f),Z=eO(n.queue?.queue||n.summary?.queue),V=rZ(n.health,n.queue),P=n.health?.targetGpu||n.summary?.targetGpu||V.find((M)=>String(M.name||"").includes("2080")),H=n.images?.mlImage||n.health?.image||{},B=lZ(n.queue),C=uZ(n.projects),E=nZ(C),D=c.sourceProject||C[0]?.projectPath||"",Y=B.filter((M)=>["staged","queued","running"].includes(M.status)),v=B.filter((M)=>M.status==="succeeded"),K=B.filter((M)=>["failed","canceled"].includes(M.status)),X=Array.isArray(n.history?.jobs)?n.history.jobs.slice(0,120):[],I=[{id:"projects",label:"项目库",count:C.length},{id:"current",label:"当前队列",count:Y.length||Number(Z.staged||0)+Number(Z.queued||0)+Number(Z.running||0)},{id:"completed",label:"已完成",count:v.length||Number(Z.succeeded||0)},{id:"failed",label:"失败诊断",count:K.length||Number(Z.failed||0)+Number(Z.canceled||0)},{id:"gpu",label:"GPU/镜像",count:V.length}];function o(M,d){if(M.length===0)return x(lt,{title:d==="current"?"当前队列为空":"暂无记录",text:d==="current"?"从项目库选择或 fork project 后先加入待启动队列,再启动队列。":"终态任务会显示耗时、exit code 和失败诊断。"});return x("div",{className:"table-wrap met-job-table"},x("table",null,x("thead",null,x("tr",null,x("th",null,"状态"),x("th",null,"Project"),x("th",null,"Epoch"),x("th",null,"速度"),x("th",null,"ETA/耗时"),x("th",null,"GPU"),x("th",null,"Exit"),x("th",null,"更新时间"),x("th",null,"操作"))),x("tbody",null,M.map((nl)=>{let k=nl.progress||{},g=["staged","queued","running"].includes(nl.status),cl=i.kind==="job"&&i.key===nl.id;return x("tr",{key:nl.id,className:`met-click-row ${cl?"active":""}`,onClick:()=>q(nl),"data-testid":`met-job-row-${x3(nl.id)}`},x("td",null,x(T1,{status:nl.status},wm(nl.status))),x("td",null,x("button",{type:"button",className:"met-inline-link",onClick:(pl)=>{pl.stopPropagation(),q(nl)}},nl.projectPath),x("code",null,nl.id)),x("td",null,x("span",null,`${k.currentEpoch??"--"} / ${k.epochTarget??nl.epochTarget??"--"}`),x("div",{className:"met-progress"},x("span",{style:{width:W1(k.progressPercent)}}))),x("td",null,x("strong",null,R3(mm(nl)))),x("td",null,nl.status==="succeeded"||nl.status==="failed"||nl.status==="canceled"?Qm(nl):nl.status==="running"?`ETA ${J5(fZ(nl))}`:"--"),x("td",null,nl.gpuName||"--"),x("td",null,nl.exitCode??"--"),x("td",null,Ll(nl.updatedAt)),x("td",null,g?x("button",{type:"button",className:"ghost-btn mini",onClick:(pl)=>{pl.stopPropagation(),Q(nl)},disabled:n.actionBusy},"取消"):null,x(my,{title:`MET Job ${nl.id}`,data:nl,onOpen:u,testId:`raw-met-job-${nl.id}`})))}))))}function fl(){return x("div",{className:"met-queue-summary","data-testid":"met-current-summary"},x(T1,{status:"staged"},`待启动 ${Z.staged??0}`),x(T1,{status:"queued"},`排队中 ${Z.queued??0}`),x(T1,{status:"running"},`训练中 ${Z.running??0}`),x("span",null,`最大并发 ${n.summary?.queue?.maxConcurrency??n.queue?.queue?.maxConcurrency??c.maxConcurrency}`),x("span",null,`目标 GPU ${n.summary?.queue?.targetGpuName??n.queue?.queue?.targetGpuName??c.targetGpuName}`))}function yl(M,d){let nl=c.expandedProjectDirs[M];return nl===void 0?d<2:Boolean(nl)}function h(M,d){let nl=yl(M,d);A({expandedProjectDirs:{...c.expandedProjectDirs,[M]:!nl}})}function s(M){let d=8+Math.max(0,M.depth)*16;if(Boolean(M.project)){let g=M.project,cl=Boolean(c.selectedProjects[g.projectPath]),pl=i.kind==="project"&&i.key===g.projectPath;return x("div",{key:M.path,className:`met-tree-row project ${cl?"selected":""} ${pl?"active":""}`,style:{paddingLeft:d},onClick:()=>m(g),"data-testid":`met-project-node-${x3(g.projectPath)}`},x("div",{className:"met-tree-name"},x("input",{type:"checkbox",checked:cl,onClick:(Hl)=>Hl.stopPropagation(),onChange:(Hl)=>A({selectedProjects:{...c.selectedProjects,[g.projectPath]:Hl.target.checked}}),"data-testid":`met-project-checkbox-${x3(g.projectPath)}`}),x("button",{type:"button",className:"met-inline-link project-path",onClick:(Hl)=>{Hl.stopPropagation(),m(g)}},M.name)),x("span",null,g.useModel||"--"),x("span",null,g.epochTrain??"--"),x("span",null,W1(g.progress?.progressPercent)),x("span",null,R3(g.progress?.epochPerHour)))}let k=yl(M.path,M.depth);return x(E1.default.Fragment,{key:M.path},x("div",{className:"met-tree-row folder",style:{paddingLeft:d},"data-testid":`met-project-folder-${x3(M.path)}`},x("button",{type:"button",className:"met-tree-toggle",onClick:()=>h(M.path,M.depth),"aria-label":k?`折叠 ${M.path}`:`展开 ${M.path}`},k?"-":"+"),x("strong",null,M.name),x("span",{className:"met-tree-count"},`${M.count} projects`)),k?M.children.map((g)=>s(g)):null)}function ul(M){return x("div",{className:"met-detail-kv"},M.map((d)=>x("div",{key:d.label,className:"met-detail-kv-item"},x("span",null,d.label),x("strong",null,K1(d.value)),d.hint?x("small",null,d.hint):null)))}function tl(M,d){return x("div",{className:"met-detail-section"},x("h3",null,M),ul(d))}function Al(M){if(!Array.isArray(M)||M.length===0)return x(lt,{title:"模型层未上报",text:"等待 data/model_info.json 或 compute_analysis.json 生成。"});return x("div",{className:"table-wrap met-layer-table"},x("table",null,x("thead",null,x("tr",null,x("th",null,"Layer"),x("th",null,"Type"),x("th",null,"Params"),x("th",null,"Trainable"),x("th",null,"Compute"))),x("tbody",null,M.slice(0,18).map((d,nl)=>x("tr",{key:`${d.name||"layer"}-${nl}`},x("td",null,d.name||`#${nl+1}`),x("td",null,d.type||"--"),x("td",null,U5(d.num_params)),x("td",null,d.trainable===void 0?"--":String(Boolean(d.trainable))),x("td",null,U5(d.compute?.total??d.estimated_cost?.weighted_units?.total)))))))}function Kl(M){let d=Array.isArray(M)?M:[];if(d.length===0)return x(lt,{title:"data/ 暂无文件",text:"训练或评估完成后会生成 training_state、metrics、model_info 等文件。"});return x("div",{className:"met-file-chip-grid"},d.slice(0,48).map((nl)=>x("span",{key:nl},nl)),d.length>48?x("span",null,`+${d.length-48}`):null)}function wl(M){let d=String(M||"").replace(/\x1b\[[0-9;]*[A-Za-z]/g,"").split(/\r?\n/).map((nl)=>nl.trim()).filter(Boolean).slice(-12);if(d.length===0)return x(lt,{title:"暂无日志尾部",text:"该任务未上报 logTail 或日志已轮转。"});return x("div",{className:"met-log-lines"},d.map((nl,k)=>x("div",{key:`${k}-${nl.slice(0,16)}`},nl)))}function El(){if(i.loading)return x("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},x("div",{className:"panel-head compact"},x("div",null,x("p",{className:"panel-eyebrow"},"Detail Loading"),x(nu,{title:"详情加载中",loading:!0}))),x(lt,{title:"详情加载中",text:i.title||"正在读取 D601 data/ 和 config.json"}));if(i.error)return x("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},x(el,{error:i.error,wide:!0}));if(!i.data)return x("section",{className:"met-detail-panel muted","data-testid":"met-detail-panel"},x(lt,{title:"选择一个项目或任务查看详情",text:"项目库、当前队列、已完成和失败诊断中的行都可以点击;默认只展示结构化字段,原始 JSON 需显式点击按钮。"}));let M=tZ(i),d=iZ(i),nl=or(M.config),k=or(M.progress||d.progress),g=or(M.data),cl=or(M.metrics||g.metrics||k.trainingInfo?.evaluation_metrics),pl=or(g.trainingInfo||k.trainingInfo),Hl=or(g.trainingState),bl=or(M.model||g.model),_u=Array.isArray(bl.modelSummary)&&bl.modelSummary.length>0?bl.modelSummary:bl.computeLayers,tu=or(pl.evaluation_metrics),Nu=i.kind==="job"?"训练任务详情":"Project 详情";return x("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},x("div",{className:"panel-head compact"},x("div",null,x("p",{className:"panel-eyebrow"},i.kind==="job"?"Job + Project Detail":"Project Library Detail"),x(nu,{title:Nu}),x("code",null,M.projectPath||d.projectPath||i.title)),x("div",{className:"panel-actions"},x(my,{title:`MET ${Nu}`,data:i.data,onOpen:u,testId:"raw-met-detail"}))),i.kind==="job"?tl("任务状态",[{label:"Job ID",value:d.id},{label:"状态",value:wm(d.status)},{label:"GPU",value:d.gpuName},{label:"Exit Code",value:d.exitCode},{label:"耗时",value:Qm(d)},{label:"训练速度",value:R3(mm({...d,progress:k}))}]):null,tl("config.json",[{label:"use_model",value:nl.use_model},{label:"epoch_train",value:nl.epoch_train},{label:"step_per_epoch",value:nl.step_per_epoch},{label:"learning_rate",value:nl.learning_rate},{label:"using_gpu",value:nl.using_gpu},{label:"use_points",value:nl.use_points},{label:"sample_rate",value:nl.sample_rate},{label:"time_clipped_s",value:nl.time_clipped_s},{label:"H_UNITS",value:nl.H_UNITS},{label:"INNER_KAN_UNITS",value:nl.INNER_KAN_UNITS},{label:"INNER_KAN_LAYERS",value:nl.INNER_KAN_LAYERS},{label:"GRID_SIZE",value:nl.GRID_SIZE},{label:"SPLINE_ORDER",value:nl.SPLINE_ORDER},{label:"USE_FAST_MODEL",value:nl.USE_FAST_MODEL},{label:"IIR_TRAINABLE",value:nl.IIR_TRAINABLE}]),tl("data/ 训练状态",[{label:"Epoch",value:`${k.currentEpoch??Hl.current_epoch??Hl.completed_epoch??"--"} / ${k.epochTarget??nl.epoch_train??"--"}`},{label:"Progress",value:W1(k.progressPercent)},{label:"Last Loss",value:k.lastLoss??Hl.loss},{label:"Last Val Loss",value:k.lastValLoss??Hl.val_loss},{label:"Min Loss",value:pl.min_loss??Hl.min_loss},{label:"Min Val Loss",value:pl.min_val_loss??Hl.min_val_loss},{label:"Log Lines",value:k.logLineCount},{label:"ETA",value:J5(k.etaSeconds??Hl.remaining_time)},{label:"训练速度",value:R3(k.epochPerHour??Hl.smoothed_speed)},{label:"Training Alive",value:Hl.training_alive}]),tl("模型参数",[{label:"Model Type",value:bl.modelType??nl.use_model},{label:"Total Params",value:bl.totalParams,hint:bl.totalParams===null||bl.totalParams===void 0?"未上报":"data/model_info.json"},{label:"Trainable",value:bl.trainableParams},{label:"Non-trainable",value:bl.nonTrainableParams},{label:"Compute Cost",value:bl.computeCost},{label:"Estimate Status",value:bl.estimateStatus},{label:"Unsupported Layers",value:bl.unsupportedLayerCount}]),tl("指标",[{label:"train_loss",value:cl.train_loss??tu.train_loss},{label:"val_loss",value:cl.val_loss??tu.val_loss},{label:"train_mae",value:cl.train_mae??tu.train_mae},{label:"val_mae",value:cl.val_mae??tu.val_mae},{label:"train_afmae",value:cl.train_afmae??tu.train_afmae},{label:"val_afmae",value:cl.val_afmae??tu.val_afmae},{label:"freq_drift_hz",value:cl.freq_drift_hz},{label:"sens_drift_percent",value:cl.sens_drift_percent},{label:"linearity_percent",value:cl.linearity_percent},{label:"weights_source",value:cl.weights_source??tu.weights_source},{label:"lr min/mean/max",value:`${K1(pl.learning_rate_min)} / ${K1(pl.learning_rate_mean)} / ${K1(pl.learning_rate_max)}`}]),x("div",{className:"met-detail-section"},x("h3",null,"模型层"),Al(_u)),x("div",{className:"met-detail-section"},x("h3",null,"data/ 文件"),Kl(g.files)),i.kind==="job"?x("div",{className:"met-detail-section"},x("h3",null,"日志尾部"),wl(or(i.data).logTail)):null)}return x("div",{className:"met-page","data-testid":"met-nonlinear-page"},x(N5,{title:"MET Nonlinear 训练编排",eyebrow:"D601 GPU 用户服务",loading:n.loading||n.actionBusy,actions:x("div",{className:"panel-actions"},x("button",{type:"button",className:"ghost-btn",onClick:F,disabled:n.loading,"data-testid":"met-refresh-button"},n.loading?"刷新中":"刷新"),x(my,{title:"MET Nonlinear 用户服务",data:f,onOpen:u,testId:"raw-met-service"}))},x("div",{className:"findjob-hero"},x("div",null,x("div",{className:"node-version-line"},x(T1,{status:W.providerStatus==="online"?"online":"warn"},W.providerStatus||"unknown"),x("span",null,f.providerId),x("span",null,O.public?"公网暴露":"仅 UniDesk frontend 代理访问")),x("p",{className:"muted paragraph"},f.description)),x("div",{className:"microservice-ref-card"},x("span",null,"Repo"),x("strong",null,p.url||"--"),x("code",null,p.commitId||"--")),x("div",{className:"microservice-ref-card"},x("span",null,"D601 Docker"),x("strong",null,`${O.nodeBindHost||"--"}:${O.nodePort||"--"}`),x("code",null,`${p.composeFile||"--"} / ${p.containerName||"--"}`))),x(el,{error:n.error,wide:!0}),c.actionMessage?x("div",{className:"met-action-log","data-testid":"met-action-message"},c.actionMessage):null),x("div",{className:"met-grid"},x(N5,{title:"核心状态",eyebrow:n.refreshedAt?`Updated ${iu(n.refreshedAt)}`:"Queue + GPU",loading:n.loading},x("div",{className:"metric-grid"},x(It,{label:"Staged",value:Z.staged??0,hint:"加入队列未开始",tone:Number(Z.staged||0)>0?"warn":""}),x(It,{label:"Queued",value:Z.queued??0,hint:"排队等待调度",tone:Number(Z.queued||0)>0?"warn":""}),x(It,{label:"Running",value:Z.running??0,hint:`max ${n.summary?.queue?.maxConcurrency??n.queue?.queue?.maxConcurrency??"--"}`,tone:Number(Z.running||0)>0?"ok":""}),x(It,{label:"Succeeded",value:Z.succeeded??0,hint:"已完成"}),x(It,{label:"Failed",value:Z.failed??0,hint:"需要诊断",tone:Number(Z.failed||0)>0?"warn":""}),x(It,{label:"2080Ti Free",value:P?W1(Number(P.freeRatio)*100):"--",hint:P?`${P.memoryFreeMiB}/${P.memoryTotalMiB} MiB`:"等待 GPU 上报"}),x(It,{label:"ML Image",value:H.present?"READY":"MISSING",hint:H.image||"met-nonlinear-ml:tf26",tone:H.present?"ok":"warn"}),x(It,{label:"Health",value:n.health?.ok?"OK":"--",hint:"D601 /health"}))),x(N5,{title:"队列控制",eyebrow:"Downloader-like staging",loading:n.actionBusy},x("div",{className:"met-control-strip"},x("label",null,"最大并发",x("input",{type:"number",min:1,max:16,value:c.maxConcurrency,"data-testid":"met-max-concurrency-input",onChange:(M)=>A({maxConcurrency:M.target.value})})),x("label",null,"目标 GPU",x("input",{value:c.targetGpuName,"data-testid":"met-target-gpu-input",onChange:(M)=>A({targetGpuName:M.target.value})})),x("button",{type:"button",className:"ghost-btn",onClick:N,disabled:n.actionBusy,"data-testid":"met-save-settings-button"},"保存设置"),x("button",{type:"button",className:"primary-btn",onClick:J,disabled:n.actionBusy||Number(Z.staged||0)===0,"data-testid":"met-start-queue-button"},"启动队列")),x("p",{className:"muted paragraph"},"Project 先进入待启动队列,不会立即训练;点击启动队列后才切换为排队中,并由 D601 scheduler 按最大并发和 2080Ti 显存策略调度。")),x("section",{className:"panel met-workspace"},x("div",{className:"met-tabs",role:"tablist"},I.map((M)=>x("button",{key:M.id,type:"button",className:c.activeTab===M.id?"active":"",onClick:()=>A({activeTab:M.id}),"data-testid":`met-tab-${M.id}`},`${M.label} ${M.count}`))),x("div",{className:"panel-body"},c.activeTab==="projects"?x("div",{className:"met-form-grid","data-testid":"met-projects-pane"},x("div",{className:"met-fork-card"},x("h3",null,"Fork Project"),x("label",null,"源 Project",x("select",{value:D,"data-testid":"met-source-project-select",onChange:(M)=>A({sourceProject:M.target.value})},C.map((M)=>x("option",{key:M.projectPath,value:M.projectPath},`${M.projectPath} · ${M.useModel||"model?"}`)))),x("label",null,"Fork 数量",x("input",{type:"number",min:1,max:100,value:c.forkCount,"data-testid":"met-fork-count-input",onChange:(M)=>A({forkCount:M.target.value})})),x("label",null,"训练轮数",x("input",{type:"number",min:1,max:1e5,value:c.forkEpochs,"data-testid":"met-fork-epochs-input",onChange:(M)=>A({forkEpochs:M.target.value})})),x("label",null,"目标前缀",x("input",{value:c.forkPrefix,"data-testid":"met-fork-prefix-input",onChange:(M)=>A({forkPrefix:M.target.value})})),x("button",{type:"button",className:"primary-btn",onClick:G,disabled:n.actionBusy||!D,"data-testid":"met-fork-button"},"Fork Project"),x("p",{className:"muted paragraph"},"Fork 只创建新 Project 并自动勾选,不会直接训练;需要在右侧确认后加入待启动队列。")),x("div",{className:"met-project-list"},x("div",{className:"panel-head compact"},x("div",null,x("p",{className:"panel-eyebrow"},`Existing Projects · ${(n.projects?.roots||[]).map((M)=>`${M.root} ${M.count}`).join(" / ")}`),x(nu,{title:"选择已有 Project",loading:n.loading||n.actionBusy})),x("button",{type:"button",className:"ghost-btn",onClick:w,disabled:n.actionBusy||U().length===0,"data-testid":"met-stage-selected-button"},`加入待启动队列 (${U().length})`)),C.length===0?x(lt,{title:"暂无 project",text:"等待 D601 返回 /api/projects"}):x("div",{className:"met-project-table","data-testid":"met-project-tree"},x("div",{className:"met-tree-header"},x("span",null,"文件树 Project"),x("span",null,"Model"),x("span",null,"Epochs"),x("span",null,"Progress"),x("span",null,"速度")),E.children.map((M)=>s(M)))),El()):null,c.activeTab==="current"?x("div",{"data-testid":"met-current-pane"},fl(),o(Y,"current"),El(),x("div",{className:"panel-actions inline-actions"},x(my,{title:"MET Queue",data:n.queue,onOpen:u,testId:"raw-met-queue"}))):null,c.activeTab==="completed"?x("div",{"data-testid":"met-completed-pane"},o(v.length>0?v:X.filter((M)=>M.status==="succeeded"),"completed"),El()):null,c.activeTab==="failed"?x("div",{"data-testid":"met-failed-pane"},o(K.length>0?K:X.filter((M)=>["failed","canceled"].includes(M.status)),"failed"),El(),x("div",{className:"panel-actions inline-actions"},x(my,{title:"MET History",data:n.history,onOpen:u,testId:"raw-met-history"}))):null,c.activeTab==="gpu"?x("div",{className:"met-gpu-pane","data-testid":"met-gpu-pane"},V.length===0?x(lt,{title:"暂无 GPU 上报",text:"等待 D601 met-nonlinear-ts 或 ML image 提供 nvidia-smi 数据"}):x("div",{className:"table-wrap"},x("table",null,x("thead",null,x("tr",null,x("th",null,"Index"),x("th",null,"Name"),x("th",null,"Free"),x("th",null,"Policy"))),x("tbody",null,V.map((M)=>x("tr",{key:M.index},x("td",null,M.index),x("td",null,M.name),x("td",null,`${M.memoryFreeMiB} / ${M.memoryTotalMiB} MiB`,x("div",{className:"met-progress"},x("span",{style:{width:W1(Number(M.freeRatio)*100)}}))),x("td",null,String(M.name||"").includes("2080")?"target 2080Ti, <20% 限制并发":"non-target")))))),x("div",{className:"panel-actions inline-actions"},x(my,{title:"MET Images",data:n.images,onOpen:u,testId:"raw-met-images"}))):null))))}var I3=Ml(Ju(),1);var ml=I3.default.createElement,{useEffect:Gm,useMemo:yZ}=I3.default,v3=I3.default.useState;function Wm({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return ml("span",{className:`status-badge ${r}`},u||l||"unknown")}function p1({label:l,value:u,hint:r,tone:f}){return ml("article",{className:`metric-card ${f||""}`},ml("div",{className:"metric-label"},l),ml("div",{className:"metric-value"},u),ml("div",{className:"metric-hint"},r))}function g3({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return ml("section",{className:`panel ${n||""}`},ml("div",{className:"panel-head"},ml("div",null,u?ml("p",{className:"panel-eyebrow"},u):null,ml(nu,{title:l,loading:t})),r?ml("div",{className:"panel-actions"},r):null),ml("div",{className:"panel-body"},f))}function Q5({title:l,data:u,onOpen:r,testId:f}){return ml("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function k3({title:l,text:u}){return ml("div",{className:"empty-state"},ml("strong",null,l),ml("span",null,u))}function cZ(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function $Z(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function _Z(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function wy(l,u){return`${l}/microservices/mdtodo/proxy${u}`}function Tm(l){if(l==="completed")return"已完成";if(l==="in_progress")return"进行中";return"待处理"}function AZ(l){if(l==="completed")return"online";if(l==="in_progress")return"warn";return"unknown"}function m5(l){let u=[],r=(f)=>{for(let n of f)if(u.push(n),Array.isArray(n.children))r(n.children)};return r(Array.isArray(l)?l:[]),u}function FZ({tasks:l,selectedId:u,onSelect:r}){if(!l.length)return ml(k3,{title:"暂无任务",text:"当前文件没有 R 编号任务。"});let f=(n)=>ml("li",{key:n.id},ml("button",{type:"button",className:`mdtodo-task-row ${u===n.id?"active":""}`,style:{"--task-depth":Math.min(Number(n.depth||0),6)},onClick:()=>r(n.id),"data-testid":`mdtodo-task-${String(n.id).replace(/[^A-Za-z0-9_-]+/g,"-")}`},ml(Wm,{status:AZ(n.status)},Tm(n.status)),ml("code",null,n.id),ml("span",{className:"mdtodo-task-title"},n.title||"--"),ml("span",{className:"mdtodo-link-count"},`${n.linkExists??0}/${n.linkCount??0}`)),Array.isArray(n.children)&&n.children.length>0?ml("ol",null,n.children.map(f)):null);return ml("ol",{className:"mdtodo-tree"},l.map(f))}function Km({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((P)=>P.id==="mdtodo")||null,[n,t]=v3({loading:!1,saving:!1,error:"",notice:"",health:null,files:[],todo:null,selectedFile:"",selectedTaskId:"",refreshedAt:null,command:null}),[i,y]=v3(""),[c,_]=v3(""),[A,F]=v3(""),j=Array.isArray(n.todo?.tasks)?n.todo.tasks:[],N=yZ(()=>m5(j),[n.todo]),U=N.find((P)=>P.id===n.selectedTaskId)||N[0]||null,w=n.todo?.stats||{};async function G(P=n.selectedFile){if(!f)return;t((H)=>({...H,loading:!0,error:"",notice:""}));try{let[H,B]=await Promise.all([Tl(`${r}/microservices/mdtodo/health`),Tl(wy(r,"/api/files"))]),C=Array.isArray(B.files)?B.files:[],E=P||C[0]?.path||"",D=E?await Tl(wy(r,`/api/tasks?file=${encodeURIComponent(E)}`)):null,Y=Array.isArray(D?.tasks)?m5(D.tasks):[],v=Y.some((K)=>K.id===n.selectedTaskId)?n.selectedTaskId:Y[0]?.id||"";t({loading:!1,saving:!1,error:"",notice:"",health:H,files:C,todo:D,selectedFile:E,selectedTaskId:v,refreshedAt:new Date,command:n.command})}catch(H){t((B)=>({...B,loading:!1,error:zl(H,"MDTODO 加载失败")}))}}if(Gm(()=>{G()},[f?.id,f?.runtime?.providerStatus]),Gm(()=>{y(U?.title||""),_(U?.rawContent||"")},[U?.id,n.selectedFile]),!f)return ml(k3,{title:"MDTODO 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=mdtodo"});let J=cZ(f),Q=_Z(f),m=$Z(f);async function q(P){t((H)=>({...H,selectedFile:P,selectedTaskId:"",command:null})),await G(P)}async function W(P){if(!U||!n.selectedFile)return;t((H)=>({...H,saving:!0,error:"",notice:""}));try{let H=await Tl(wy(r,`/api/tasks/${encodeURIComponent(U.id)}`),{method:"PATCH",body:{file:n.selectedFile,...P}});t((B)=>({...B,saving:!1,todo:H.file,notice:H.result?.message||"任务已更新"}))}catch(H){t((B)=>({...B,saving:!1,error:zl(H,"任务更新失败")}))}}async function p(){await W({title:i,rawContent:c})}async function O(P){if(!n.selectedFile)return;t((H)=>({...H,saving:!0,error:"",notice:""}));try{let H=await Tl(wy(r,"/api/tasks"),{method:"POST",body:{file:n.selectedFile,parentId:P,title:A||"新任务"}});F(""),t((B)=>({...B,saving:!1,todo:H.file,selectedTaskId:H.result?.taskId||B.selectedTaskId,notice:H.result?.message||"任务已创建"})),await G(n.selectedFile)}catch(H){t((B)=>({...B,saving:!1,error:zl(H,"创建任务失败")}))}}async function Z(){if(!U||!n.selectedFile)return;if(!window.confirm(`删除 ${U.id} 及其子任务?`))return;t((P)=>({...P,saving:!0,error:"",notice:""}));try{let P=await Tl(wy(r,`/api/tasks/${encodeURIComponent(U.id)}?file=${encodeURIComponent(n.selectedFile)}`),{method:"DELETE"}),H=m5(P.file?.tasks||[]);t((B)=>({...B,saving:!1,todo:P.file,selectedTaskId:H[0]?.id||"",notice:P.result?.message||"任务已删除"}))}catch(P){t((H)=>({...H,saving:!1,error:zl(P,"删除任务失败")}))}}async function V(){if(!U||!n.selectedFile)return;t((P)=>({...P,saving:!0,error:"",command:null}));try{let P=await Tl(wy(r,"/api/execute-command"),{method:"POST",body:{file:n.selectedFile,taskId:U.id,mode:"codex"}});t((H)=>({...H,saving:!1,command:P,notice:"执行命令已生成"}))}catch(P){t((H)=>({...H,saving:!1,error:zl(P,"执行命令生成失败")}))}}return ml("div",{className:"mdtodo-page","data-testid":"mdtodo-page"},ml(g3,{title:"MDTODO 工作台",eyebrow:"D601 k3s managed service",loading:n.loading,actions:ml("div",{className:"panel-actions"},ml("button",{type:"button",className:"ghost-btn",onClick:()=>void G(),disabled:n.loading,"data-testid":"mdtodo-refresh-button"},n.loading?"刷新中":"刷新"),ml(Q5,{title:"MDTODO 用户服务",data:f,onOpen:u,testId:"raw-mdtodo-service"}))},ml("div",{className:"findjob-hero"},ml("div",null,ml("div",{className:"node-version-line"},ml(Wm,{status:J.providerStatus==="online"?"online":"warn"},J.providerStatus||"unknown"),ml("span",null,f.providerId),ml("span",null,m.proxyMode||"--")),ml("p",{className:"muted paragraph"},f.description)),ml("div",{className:"microservice-ref-card"},ml("span",null,"Repo"),ml("strong",null,Q.url||"--"),ml("code",null,Q.composeFile||"--")),ml("div",{className:"microservice-ref-card"},ml("span",null,"Workspace"),ml("strong",null,n.health?.rootDir||"/workspace"),ml("code",null,`${m.nodeBindHost||"--"}:${m.nodePort||"--"}`))),ml(el,{error:n.error,wide:!0}),n.notice?ml("div",{className:"notice-line"},n.notice):null),ml("div",{className:"metric-grid"},ml(p1,{label:"TODO 文件",value:n.files.length,hint:n.health?.rootExists?"hostPath ready":"hostPath missing",tone:n.health?.ok?"ok":"warn"}),ml(p1,{label:"任务总数",value:w.total??"--",hint:n.selectedFile||"--"}),ml(p1,{label:"已完成",value:w.completed??"--",hint:"completed",tone:"ok"}),ml(p1,{label:"进行中",value:w.inProgress??"--",hint:"in progress",tone:"warn"}),ml(p1,{label:"待处理",value:w.pending??"--",hint:n.refreshedAt?iu(n.refreshedAt):"pending"})),ml("div",{className:"mdtodo-layout"},ml(g3,{title:"文件",eyebrow:`${n.files.length} Markdown`,loading:n.loading,className:"mdtodo-file-panel"},n.files.length===0?ml(k3,{title:"暂无 TODO 文件",text:"等待后端扫描 MDTODO 工作区。"}):ml("div",{className:"mdtodo-file-list"},n.files.map((P)=>ml("button",{key:P.path,type:"button",className:`mdtodo-file-item ${n.selectedFile===P.path?"active":""}`,onClick:()=>void q(P.path)},ml("strong",null,P.name),ml("span",null,P.directory||"."),ml("code",null,`${P.stats?.total??"--"} tasks / ${Ll(P.mtime)}`))))),ml(g3,{title:"任务树",eyebrow:n.selectedFile||"Tasks",loading:n.loading,actions:ml("div",{className:"panel-actions"},ml("input",{value:A,onChange:(P)=>F(P.target.value),placeholder:"新任务标题","data-testid":"mdtodo-new-title"}),ml("button",{type:"button",className:"ghost-btn",onClick:()=>void O(),disabled:n.saving||!n.selectedFile},"新增"),U?ml("button",{type:"button",className:"ghost-btn",onClick:()=>void O(U.id),disabled:n.saving},"新增子任务"):null,n.todo?ml(Q5,{title:"MDTODO 当前文件",data:n.todo,onOpen:u,testId:"raw-mdtodo-file"}):null)},ml(FZ,{tasks:j,selectedId:U?.id||"",onSelect:(P)=>t((H)=>({...H,selectedTaskId:P,command:null}))})),ml(g3,{title:U?`${U.id} 详情`:"任务详情",eyebrow:U?Tm(U.status):"Detail",loading:n.saving,className:"mdtodo-detail-panel",actions:U?ml("div",{className:"panel-actions"},ml("button",{type:"button",className:"ghost-btn",onClick:()=>void W({status:"pending"}),disabled:n.saving},"待处理"),ml("button",{type:"button",className:"ghost-btn",onClick:()=>void W({status:"in_progress"}),disabled:n.saving},"进行中"),ml("button",{type:"button",className:"primary-btn",onClick:()=>void W({status:"completed"}),disabled:n.saving},"完成")):null},!U?ml(k3,{title:"未选中任务",text:"请选择一个任务。"}):ml("div",{className:"mdtodo-editor"},ml("label",null,"标题",ml("input",{value:i,onChange:(P)=>y(P.target.value),"data-testid":"mdtodo-title-input"})),ml("label",null,"正文",ml("textarea",{value:c,onChange:(P)=>_(P.target.value),rows:12,"data-testid":"mdtodo-raw-input"})),ml("div",{className:"docker-meta compact"},ml("span",null,`line ${Number(U.lineNumber??0)+1}`),ml("span",null,`depth ${U.depth??0}`),ml("span",null,`links ${U.linkExists??0}/${U.linkCount??0}`)),ml("div",{className:"inline-actions"},ml("button",{type:"button",className:"primary-btn",onClick:p,disabled:n.saving},n.saving?"保存中":"保存"),ml("button",{type:"button",className:"ghost-btn",onClick:V,disabled:n.saving},"生成执行命令"),ml("button",{type:"button",className:"danger-btn",onClick:Z,disabled:n.saving},"删除"),ml(Q5,{title:`MDTODO ${U.id}`,data:U,onOpen:u,testId:"raw-mdtodo-task"})),n.command?ml("div",{className:"mdtodo-command"},ml("span",null,n.command.prompt||"--"),ml("code",null,n.command.command||"--")):null))))}var o3=[{id:"ops",label:"运行总览",code:"OPS",tabs:[{id:"status",label:"态势总览"},{id:"performance",label:"性能面板"},{id:"events",label:"事件摘要"},{id:"logs",label:"服务日志"}]},{id:"nodes",label:"资源节点",code:"NODE",tabs:[{id:"list",label:"节点清单"},{id:"monitor",label:"资源监控"},{id:"docker",label:"Docker 状态"},{id:"gateway",label:"网关版本"},{id:"labels",label:"资源标签"},{id:"heartbeats",label:"心跳状态"}]},{id:"tasks",label:"任务调度",code:"TASK",tabs:[{id:"dispatch",label:"下发任务"},{id:"scheduled",label:"定时任务"},{id:"pending",label:"待处理任务"},{id:"history",label:"任务历史"},{id:"results",label:"执行结果"}]},{id:"apps",label:"用户服务",code:"APP",routeSegment:"app",tabs:[{id:"catalog",label:"服务目录"},{id:"todo-note",label:"Todo Note"},{id:"findjob",label:"FindJob"},{id:"pipeline",label:"Pipeline"},{id:"met-nonlinear",label:"MET Nonlinear"},{id:"claudeqq",label:"ClaudeQQ"},{id:"baidu-netdisk",label:"Baidu Netdisk"},{id:"filebrowser",label:"File Browser"},{id:"oa-event-flow",label:"OA Event Flow"},{id:"k3sctl",label:"k3s Control"},{id:"code-queue",label:"Code Queue"},{id:"mdtodo",label:"MDTODO"},{id:"decision-center",label:"Decision Center"},{id:"project-manager",label:"Project Manager"}]},{id:"config",label:"系统配置",code:"CFG",tabs:[{id:"topology",label:"连接拓扑"},{id:"auth",label:"认证策略"},{id:"security",label:"安全边界"}]}],z1=Object.fromEntries(o3.map((l)=>[l.id,l.tabs[0]?.id??""]));function jZ(l){let u=String(l||"").trim();if(!u)return"";try{return decodeURIComponent(u)}catch{return u}}function a3(l){let u=String(l||"/"),[r]=u.split(/[?#]/u,1);if(r==="/")return"/";let n=`/${r.split("/").map(jZ).filter(Boolean).join("/")}`;return n.endsWith("/")?n:`${n}/`}function NZ(l){let u=2166136261;for(let r of l)u^=r.charCodeAt(0),u=Math.imul(u,16777619);return Math.abs(u>>>0).toString(36)}function w5(l){return String(l||"").normalize("NFKD").replace(/[\u0300-\u036f]/gu,"").toLowerCase().replace(/[^a-z0-9]+/gu,"-").replace(/^-+|-+$/gu,"")}function Em(l){return String(l||"").trim().toLowerCase().replace(/[\s/\\?#%]+/gu,"-").replace(/-+/gu,"-").replace(/^-+|-+$/gu,"")}function pm(l){let u=w5(l.routeSegment||"")||Em(l.routeSegment||"");if(u)return u;let r=w5(l.id||"");if(r)return r;let f=w5(l.label||"")||Em(l.label||"");if(f)return f;return`route-${NZ(JSON.stringify(l))}`}function q5(l,u){return`${l}:${u}`}function zm(l){let u=l.map((c)=>{let _=pm(c);return{...c,routeSegment:_,tabs:c.tabs.map((A)=>({...A,routeSegment:pm(A)}))}}),r={},f={},n={},t=u.map((c)=>{let _=c.tabs[0]?.id??"";n[c.id]=_;let A=c.tabs.map((N)=>{let U=`/${c.routeSegment}/${N.routeSegment}/`,w=[U],G={moduleId:c.id,tabId:N.id};for(let J of w)r[a3(J)]=G;return f[q5(c.id,N.id)]=U,{...N,canonicalPath:U,aliases:w}}),F=`/${c.routeSegment}/`,j={moduleId:c.id,tabId:_};return r[a3(F)]=j,{...c,routeSegment:c.routeSegment,canonicalPath:F,tabs:A}}),i=t[0],y={moduleId:i?.id||"",tabId:i?.tabs[0]?.id||""};return r["/"]=y,{modules:t,moduleById:Object.fromEntries(t.map((c)=>[c.id,c])),defaultActiveTabs:n,routeMap:r,canonicalPathByTarget:f,fallbackTarget:y}}function L5(l,u){return l.routeMap[a3(u)]||l.fallbackTarget}function d3(l,u,r){return l.canonicalPathByTarget[q5(u,r)]||l.canonicalPathByTarget[q5(l.fallbackTarget.moduleId,l.fallbackTarget.tabId)]||"/"}function Om(l,u){let r=l.routeMap[a3(u)];if(!r)return null;return d3(l,r.moduleId,r.tabId)}var rA=Ml(Ju(),1);var $l=rA.default.createElement,{useEffect:Zm,useMemo:JZ}=rA.default,G5=rA.default.useState;function uA({status:l,children:u,title:r}){let f=String(l||"unknown").toLowerCase();return $l("span",{className:`status-badge ${f}`,title:r},u||l||"unknown")}function O1({label:l,value:u,hint:r,tone:f}){return $l("article",{className:`metric-card ${f||""}`},$l("div",{className:"metric-label"},l),$l("div",{className:"metric-value"},u),$l("div",{className:"metric-hint"},r))}function e3({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return $l("section",{className:`panel ${n||""}`},$l("div",{className:"panel-head"},$l("div",null,u?$l("p",{className:"panel-eyebrow"},u):null,$l(nu,{title:l,loading:t})),r?$l("div",{className:"panel-actions"},r):null),$l("div",{className:"panel-body"},f))}function Z1({title:l,data:u,onOpen:r,testId:f}){return $l("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r?.(l,u)},"查看原始JSON")}function W5({title:l,text:u}){return $l("div",{className:"empty-state"},$l("strong",null,l),$l("span",null,u))}function UZ(l){return l&&typeof l==="object"&&!Array.isArray(l)?l:null}function ut(l){return Array.isArray(l)?l:[]}function dr(l){let u=Number(l);return Number.isFinite(u)?u.toLocaleString("zh-CN"):"--"}function Hm(l,u=140){if(l===null||l===void 0)return"--";let r=typeof l==="string"?l:JSON.stringify(l),f=String(r||"").replace(/\s+/gu," ").trim();return f.length>u?`${f.slice(0,u-1)}...`:f||"--"}function QZ(l){return ut(l?.tags).map((u)=>String(u||"").trim()).filter(Boolean)}function ki(l){let u=Number(l);return Number.isFinite(u)&&u>=0?Math.floor(u):0}function mZ(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function wZ(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function qZ(l){return String(l||"").split(/[\s,]+/u).map((u)=>u.trim()).filter(Boolean).join(",")}function lA(l,u){return`${l}/microservices/oa-event-flow/proxy${u}`}function LZ(l){if(l.includes("error")||l.includes("failed"))return"failed";if(l.includes("stats"))return"ok";if(l.includes("step")||l.includes("updated"))return"running";return"queued"}function GZ(l){let u=String(l?.subjectKind||"trace"),r=String(l?.subjectId||l?.scopeId||"");return r?`${u}:${r}`:String(l?.scopeId||"--")}function WZ({tags:l}){let u=QZ({tags:l}).slice(0,6);return $l("div",{className:"oa-tag-rail"},u.length===0?$l("span",{className:"muted"},"--"):u.map((r)=>$l("code",{key:r},r)))}function TZ({events:l,onRaw:u}){let r=[...ut(l)].reverse();return r.length===0?$l(W5,{title:"事件表暂无记录",text:"等待 Code Queue 或 Pipeline 按 tag 发布 OA 事件"}):$l("div",{className:"table-wrap oa-event-table-wrap"},$l("table",{className:"oa-event-table","data-testid":"oa-event-flow-event-table"},$l("thead",null,$l("tr",null,$l("th",null,"Seq"),$l("th",null,"Type"),$l("th",null,"Source"),$l("th",null,"Aggregate"),$l("th",null,"Tags"),$l("th",null,"Payload"),$l("th",null,"Created"),$l("th",null,"Raw"))),$l("tbody",null,r.map((f)=>{let n=String(f?.type||"event"),t=`${String(f?.aggregateType||"--")}:${String(f?.aggregateId||"--")}`;return $l("tr",{key:f?.eventId||f?.sequence},$l("td",null,$l("code",null,dr(f?.sequence))),$l("td",null,$l(uA,{status:LZ(n)},n)),$l("td",null,$l("strong",null,f?.sourceId||"--"),$l("code",null,f?.sourceKind||"--")),$l("td",null,$l("code",null,t)),$l("td",null,$l(WZ,{tags:f?.tags})),$l("td",null,$l("span",{className:"oa-payload-preview"},Hm(f?.payload,180))),$l("td",null,Ll(f?.createdAt)),$l("td",null,$l(Z1,{title:`OA Event ${f?.sequence||""}`,data:f,onOpen:u,testId:`raw-oa-event-${f?.sequence||"unknown"}`})))}))))}function KZ({stats:l,onRaw:u}){let r=ut(l);return r.length===0?$l(W5,{title:"统计中心暂无投影",text:"trace-stats-snapshot / trace-step-created 进入事件流后会更新这里"}):$l("div",{className:"table-wrap oa-stats-table-wrap"},$l("table",{className:"oa-stats-table","data-testid":"oa-event-flow-stats"},$l("thead",null,$l("tr",null,$l("th",null,"Scope"),$l("th",null,"Service"),$l("th",null,"STEP"),$l("th",null,"Read"),$l("th",null,"Edit"),$l("th",null,"Run"),$l("th",null,"Error"),$l("th",null,"Output Seq"),$l("th",null,"Revision"),$l("th",null,"Updated"),$l("th",null,"Raw"))),$l("tbody",null,r.map((f)=>$l("tr",{key:f?.scopeId||`${f?.serviceId}-${f?.subjectId}`},$l("td",null,$l("strong",null,GZ(f)),$l("code",null,f?.scopeId||"--")),$l("td",null,$l(uA,{status:String(f?.serviceId||"unknown")==="code-queue"?"running":"queued"},f?.serviceId||"--")),$l("td",null,$l("strong",null,dr(ki(f?.stepCount??f?.llmStepCount)))),$l("td",null,dr(ki(f?.readCount))),$l("td",null,dr(ki(f?.editCount))),$l("td",null,dr(ki(f?.runCount))),$l("td",null,dr(ki(f?.errorCount))),$l("td",null,$l("code",null,dr(ki(f?.outputMaxSeq)))),$l("td",null,dr(ki(f?.statsRevision))),$l("td",null,Ll(f?.updatedAt)),$l("td",null,$l(Z1,{title:`OA Trace Stats ${f?.scopeId||""}`,data:f,onOpen:u,testId:`raw-oa-stats-${String(f?.scopeId||"unknown").replace(/[^a-zA-Z0-9_-]/gu,"_")}`})))))))}function Bm({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((W)=>W.id==="oa-event-flow")||null,[n,t]=G5("service:code-queue"),[i,y]=G5({loading:!1,error:"",health:null,diagnostics:null,events:[],stats:[],refreshedAt:null}),[c,_]=G5({status:"idle",message:"未连接",lastEventAt:""}),A=JZ(()=>qZ(n),[n]);async function F(){if(!f)return;y((W)=>({...W,loading:!0,error:""}));try{let W=A?`tags=${encodeURIComponent(A)}&`:"",[p,O,Z,V]=await Promise.all([Tl(`${r}/microservices/oa-event-flow/health`,{failureFields:[]}),Tl(lA(r,"/api/diagnostics")),Tl(lA(r,`/api/events?${W}limit=100`)),Tl(lA(r,`/api/stats/trace?${W}limit=100`))]);y({loading:!1,error:"",health:p,diagnostics:O,events:ut(Z?.events),stats:ut(V?.stats),refreshedAt:new Date})}catch(W){y((p)=>({...p,loading:!1,error:zl(W,"OA Event Flow 加载失败")}))}}if(Zm(()=>{F()},[f?.id,f?.runtime?.providerStatus,A]),Zm(()=>{if(!f||typeof EventSource>"u")return;let W=A?`?tags=${encodeURIComponent(A)}`:"",p=new EventSource(`${lA(r,"/api/events/stream")}${W}`,{withCredentials:!0});_({status:"running",message:"SSE connecting",lastEventAt:""});let O=(P)=>{_({status:"online",message:Hm(P.data,120),lastEventAt:new Date().toISOString()})},Z=(P)=>{try{let H=JSON.parse(String(P.data||"{}"));_({status:"online",message:String(H?.type||P.type||"event"),lastEventAt:new Date().toISOString()}),y((B)=>{let C=[...ut(B.events).filter((D)=>String(D?.eventId||"")!==String(H?.eventId||"")),H].sort((D,Y)=>Number(D?.sequence||0)-Number(Y?.sequence||0)).slice(-100),E=H?.type==="trace-stats-updated"&&UZ(H?.payload?.stats)?[H.payload.stats,...ut(B.stats).filter((D)=>String(D?.scopeId||"")!==String(H.payload.stats.scopeId||""))].slice(0,100):B.stats;return{...B,events:C,stats:E}})}catch(H){_({status:"warn",message:zl(H,"SSE 事件解析失败"),lastEventAt:new Date().toISOString()})}},V=()=>{_((P)=>({...P,status:"warn",message:"SSE reconnecting"}))};return p.addEventListener("hello",O),p.addEventListener("task-updated",Z),p.addEventListener("queue-updated",Z),p.addEventListener("trace-step-created",Z),p.addEventListener("trace-stats-snapshot",Z),p.addEventListener("trace-stats-updated",Z),p.addEventListener("trace-error",Z),p.onerror=V,()=>p.close()},[f?.id,r,A]),!f)return $l(W5,{title:"OA Event Flow 未登记",text:"请在 config.json 的 microservices 中登记 id=oa-event-flow"});let j=mZ(f),N=wZ(f),U=i.diagnostics||{},w=i.health||{},G=U.eventCount??w.eventCount,J=U.traceStatsCount??w.traceStatsCount,Q=U.latestSequence??w.latestSequence,m=U.pipelineBridge||w.pipelineBridge||{},q=ut(U.eventTypes).slice(0,8);return $l("div",{className:"oa-event-flow-page","data-testid":"oa-event-flow-page"},$l(e3,{title:"OA Event Flow 控制台",eyebrow:"Unified OA Event Bus + Stats Projection",loading:i.loading,actions:$l("div",{className:"panel-actions"},$l("button",{type:"button",className:"ghost-btn",onClick:F,disabled:i.loading,"data-testid":"oa-event-flow-refresh"},i.loading?"刷新中":"刷新"),$l(Z1,{title:"OA Event Flow Service",data:f,onOpen:u,testId:"raw-oa-event-flow-service"}))},$l("div",{className:"oa-flow-hero"},$l("div",null,$l("div",{className:"node-version-line"},$l(uA,{status:w?.ok||j.providerStatus==="online"?"online":"warn"},w?.ok?"HEALTH OK":j.providerStatus||"unknown"),$l(uA,{status:c.status},c.status.toUpperCase()),$l("span",null,N.public?"公网暴露":"仅 UniDesk frontend 代理访问")),$l("p",{className:"muted paragraph"},"独立事件流微服务统一承载 Code Queue 与 Pipeline 的事件发布、tag 订阅、事件表审计和 Trace/STEP 统计投影。")),$l("div",{className:"oa-flow-signal"},$l("span",null,"stream"),$l("strong",null,c.message||"--"),$l("code",null,c.lastEventAt?iu(new Date(c.lastEventAt)):"waiting"))),$l(el,{error:i.error,wide:!0})),$l("div",{className:"oa-flow-metrics"},$l(O1,{label:"事件总量",value:dr(G),hint:`latest seq ${dr(Q)}`,tone:"ok"}),$l(O1,{label:"Trace Stats",value:dr(J),hint:"oa_trace_stats 投影"}),$l(O1,{label:"SSE Clients",value:dr(w?.sseClientCount??ut(U.sseClients).length),hint:c.message||"tag subscription"}),$l(O1,{label:"Pipeline Bridge",value:m?.enabled?dr(m?.insertedCount):"OFF",hint:m?.lastError||m?.lastFinishedAt||`${m?.mode||"snapshot"} service:pipeline`}),$l(O1,{label:"DB",value:w?.databaseReady||U.databaseReady?"READY":"WAIT",hint:w?.databaseLastError||U.databaseLastError||"PostgreSQL persisted"})),$l(e3,{title:"标签订阅",eyebrow:i.refreshedAt?`Updated ${iu(i.refreshedAt)}`:"Tag Pub/Sub"},$l("div",{className:"oa-filter-bar"},$l("label",null,$l("span",null,"tags"),$l("input",{value:n,onChange:(W)=>t(W.target.value),placeholder:"service:code-queue, trace","data-testid":"oa-event-flow-tag-filter"})),$l("div",{className:"oa-filter-presets"},$l("button",{type:"button",className:"ghost-btn",onClick:()=>t("service:code-queue")},"Code Queue"),$l("button",{type:"button",className:"ghost-btn",onClick:()=>t("service:pipeline")},"Pipeline"),$l("button",{type:"button",className:"ghost-btn",onClick:()=>t("trace")},"Trace"),$l("button",{type:"button",className:"ghost-btn",onClick:()=>t("")},"All")),$l("code",null,A||"all events")),$l("div",{className:"oa-type-strip"},q.length===0?$l("span",{className:"muted"},"等待事件类型统计"):q.map((W)=>$l("span",{key:W.type,className:"data-chip"},`${W.type} ${dr(W.count)}`)))),$l("div",{className:"oa-flow-grid"},$l(e3,{title:"事件表",eyebrow:"oa_events persisted log",className:"oa-flow-wide",loading:i.loading,actions:$l(Z1,{title:"OA Event Query",data:{events:i.events,diagnostics:U},onOpen:u,testId:"raw-oa-events"})},$l(TZ,{events:i.events,onRaw:u})),$l(e3,{title:"统计中心",eyebrow:"oa_trace_stats read model",className:"oa-flow-wide",loading:i.loading,actions:$l(Z1,{title:"OA Trace Stats",data:i.stats,onOpen:u,testId:"raw-oa-trace-stats"})},$l(KZ,{stats:i.stats,onRaw:u}))))}var $i=Ml(Ju(),1);var il=Ml(Ym(),1),_l=Ml(Ju(),1);function bu(l){if(typeof l==="string"||typeof l==="number")return""+l;let u="";if(Array.isArray(l)){for(let r=0,f;r{}};function Pm(){for(var l=0,u=arguments.length,r={},f;l=0)f=r.slice(n+1),r=r.slice(0,n);if(r&&!u.hasOwnProperty(r))throw Error("unknown type: "+r);return{type:r,name:f}})}nA.prototype=Pm.prototype={constructor:nA,on:function(l,u){var r=this._,f=DZ(l+"",r),n,t=-1,i=f.length;if(arguments.length<2){while(++t0)for(var r=Array(n),f=0,n,t;f=0&&(u=l.slice(0,r))!=="xmlns")l=l.slice(r+1);return T5.hasOwnProperty(u)?{space:T5[u],local:l}:l}function K5(l){let u;while(u=l.sourceEvent)l=u;return l}function Er(l,u){if(l=K5(l),u===void 0)u=l.currentTarget;if(u){var r=u.ownerSVGElement||u;if(r.createSVGPoint){var f=r.createSVGPoint();return f.x=l.clientX,f.y=l.clientY,f=f.matrixTransform(u.getScreenCTM().inverse()),[f.x,f.y]}if(u.getBoundingClientRect){var n=u.getBoundingClientRect();return[l.clientX-n.left-u.clientLeft,l.clientY-n.top-u.clientTop]}}return[l.pageX,l.pageY]}function SZ(){}function at(l){return l==null?SZ:function(){return this.querySelector(l)}}function E5(l){if(typeof l!=="function")l=at(l);for(var u=this._groups,r=u.length,f=Array(r),n=0;n=m)m=Q+1;while(!(W=G[m])&&++m=0;)if(i=f[n]){if(t&&i.compareDocumentPosition(t)^4)t.parentNode.insertBefore(i,t);t=i}return this}function C5(l){if(!l)l=kZ;function u(F,j){return F&&j?l(F.__data__,j.__data__):!F-!j}for(var r=this._groups,f=r.length,n=Array(f),t=0;tu?1:l>=u?0:NaN}function h5(){var l=arguments[0];return arguments[0]=this,l.apply(null,arguments),this}function M5(){return Array.from(this)}function s5(){for(var l=this._groups,u=0,r=l.length;u1?this.each((u==null?uH:typeof u==="function"?fH:rH)(l,u,r==null?"":r)):ot(this.node(),l)}function ot(l,u){return l.style.getPropertyValue(u)||D1(l).getComputedStyle(l,null).getPropertyValue(u)}function nH(l){return function(){delete this[l]}}function tH(l,u){return function(){this[l]=u}}function iH(l,u){return function(){var r=u.apply(this,arguments);if(r==null)delete this[l];else this[l]=r}}function k5(l,u){return arguments.length>1?this.each((u==null?nH:typeof u==="function"?iH:tH)(l,u)):this.node()[l]}function Cm(l){return l.trim().split(/^|\s+/)}function I5(l){return l.classList||new hm(l)}function hm(l){this._node=l,this._names=Cm(l.getAttribute("class")||"")}hm.prototype={add:function(l){var u=this._names.indexOf(l);if(u<0)this._names.push(l),this._node.setAttribute("class",this._names.join(" "))},remove:function(l){var u=this._names.indexOf(l);if(u>=0)this._names.splice(u,1),this._node.setAttribute("class",this._names.join(" "))},contains:function(l){return this._names.indexOf(l)>=0}};function Mm(l,u){var r=I5(l),f=-1,n=u.length;while(++f=0)r=u.slice(f+1),u=u.slice(0,f);return{type:u,name:r}})}function EH(l){return function(){var u=this.__on;if(!u)return;for(var r=0,f=-1,n=u.length,t;r()=>l;function X1(l,{sourceEvent:u,subject:r,target:f,identifier:n,active:t,x:i,y,dx:c,dy:_,dispatch:A}){Object.defineProperties(this,{type:{value:l,enumerable:!0,configurable:!0},sourceEvent:{value:u,enumerable:!0,configurable:!0},subject:{value:r,enumerable:!0,configurable:!0},target:{value:f,enumerable:!0,configurable:!0},identifier:{value:n,enumerable:!0,configurable:!0},active:{value:t,enumerable:!0,configurable:!0},x:{value:i,enumerable:!0,configurable:!0},y:{value:y,enumerable:!0,configurable:!0},dx:{value:c,enumerable:!0,configurable:!0},dy:{value:_,enumerable:!0,configurable:!0},_:{value:A}})}X1.prototype.on=function(){var l=this._.on.apply(this._,arguments);return l===this._?this:l};function PH(l){return!l.ctrlKey&&!l.button}function CH(){return this.parentNode}function hH(l,u){return u==null?{x:l.x,y:l.y}:u}function MH(){return navigator.maxTouchPoints||"ontouchstart"in this}function P1(){var l=PH,u=CH,r=hH,f=MH,n={},t=Ii("start","drag","end"),i=0,y,c,_,A,F=0;function j(q){q.on("mousedown.drag",N).filter(f).on("touchstart.drag",G).on("touchmove.drag",J,bm).on("touchend.drag touchcancel.drag",Q).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function N(q,W){if(A||!l.call(this,q,W))return;var p=m(this,u.call(this,q,W),q,W,"mouse");if(!p)return;tr(q.view).on("mousemove.drag",U,ai).on("mouseup.drag",w,ai),Gy(q.view),yA(q),_=!1,y=q.clientX,c=q.clientY,p("start",q)}function U(q){if(ft(q),!_){var W=q.clientX-y,p=q.clientY-c;_=W*W+p*p>F}n.mouse("drag",q)}function w(q){tr(q.view).on("mousemove.drag mouseup.drag",null),S1(q.view,_),ft(q),n.mouse("end",q)}function G(q,W){if(!l.call(this,q,W))return;var p=q.changedTouches,O=u.call(this,q,W),Z=p.length,V,P;for(V=0;V>8&15|u>>4&240,u>>4&15|u&240,(u&15)<<4|u&15,1):r===8?cA(u>>24&255,u>>16&255,u>>8&255,(u&255)/255):r===4?cA(u>>12&15|u>>8&240,u>>8&15|u>>4&240,u>>4&15|u&240,((u&15)<<4|u&15)/255):null):(u=RH.exec(l))?new er(u[1],u[2],u[3],1):(u=xH.exec(l))?new er(u[1]*255/100,u[2]*255/100,u[3]*255/100,1):(u=bH.exec(l))?cA(u[1],u[2],u[3],u[4]):(u=vH.exec(l))?cA(u[1]*255/100,u[2]*255/100,u[3]*255/100,u[4]):(u=gH.exec(l))?dm(u[1],u[2]/100,u[3]/100,1):(u=kH.exec(l))?dm(u[1],u[2]/100,u[3]/100,u[4]):vm.hasOwnProperty(l)?Im(vm[l]):l==="transparent"?new er(NaN,NaN,NaN,0):null}function Im(l){return new er(l>>16&255,l>>8&255,l&255,1)}function cA(l,u,r,f){if(f<=0)l=u=r=NaN;return new er(l,u,r,f)}function oH(l){if(!(l instanceof s1))l=nn(l);if(!l)return new er;return l=l.rgb(),new er(l.r,l.g,l.b,l.opacity)}function Ty(l,u,r,f){return arguments.length===1?oH(l):new er(l,u,r,f==null?1:f)}function er(l,u,r,f){this.r=+l,this.g=+u,this.b=+r,this.opacity=+f}C1(er,Ty,_9(s1,{brighter(l){return l=l==null?_A:Math.pow(_A,l),new er(this.r*l,this.g*l,this.b*l,this.opacity)},darker(l){return l=l==null?h1:Math.pow(h1,l),new er(this.r*l,this.g*l,this.b*l,this.opacity)},rgb(){return this},clamp(){return new er(di(this.r),di(this.g),di(this.b),AA(this.opacity))},displayable(){return-0.5<=this.r&&this.r<255.5&&(-0.5<=this.g&&this.g<255.5)&&(-0.5<=this.b&&this.b<255.5)&&(0<=this.opacity&&this.opacity<=1)},hex:am,formatHex:am,formatHex8:dH,formatRgb:om,toString:om}));function am(){return`#${oi(this.r)}${oi(this.g)}${oi(this.b)}`}function dH(){return`#${oi(this.r)}${oi(this.g)}${oi(this.b)}${oi((isNaN(this.opacity)?1:this.opacity)*255)}`}function om(){let l=AA(this.opacity);return`${l===1?"rgb(":"rgba("}${di(this.r)}, ${di(this.g)}, ${di(this.b)}${l===1?")":`, ${l})`}`}function AA(l){return isNaN(l)?1:Math.max(0,Math.min(1,l))}function di(l){return Math.max(0,Math.min(255,Math.round(l)||0))}function oi(l){return l=di(l),(l<16?"0":"")+l.toString(16)}function dm(l,u,r,f){if(f<=0)l=u=r=NaN;else if(r<=0||r>=1)l=u=NaN;else if(u<=0)l=NaN;return new fn(l,u,r,f)}function lw(l){if(l instanceof fn)return new fn(l.h,l.s,l.l,l.opacity);if(!(l instanceof s1))l=nn(l);if(!l)return new fn;if(l instanceof fn)return l;l=l.rgb();var u=l.r/255,r=l.g/255,f=l.b/255,n=Math.min(u,r,f),t=Math.max(u,r,f),i=NaN,y=t-n,c=(t+n)/2;if(y){if(u===t)i=(r-f)/y+(r0&&c<1?0:i;return new fn(i,y,c,l.opacity)}function uw(l,u,r,f){return arguments.length===1?lw(l):new fn(l,u,r,f==null?1:f)}function fn(l,u,r,f){this.h=+l,this.s=+u,this.l=+r,this.opacity=+f}C1(fn,uw,_9(s1,{brighter(l){return l=l==null?_A:Math.pow(_A,l),new fn(this.h,this.s,this.l*l,this.opacity)},darker(l){return l=l==null?h1:Math.pow(h1,l),new fn(this.h,this.s,this.l*l,this.opacity)},rgb(){var l=this.h%360+(this.h<0)*360,u=isNaN(l)||isNaN(this.s)?0:this.s,r=this.l,f=r+(r<0.5?r:1-r)*u,n=2*r-f;return new er(A9(l>=240?l-240:l+120,n,f),A9(l,n,f),A9(l<120?l+240:l-120,n,f),this.opacity)},clamp(){return new fn(em(this.h),$A(this.s),$A(this.l),AA(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&(0<=this.l&&this.l<=1)&&(0<=this.opacity&&this.opacity<=1)},formatHsl(){let l=AA(this.opacity);return`${l===1?"hsl(":"hsla("}${em(this.h)}, ${$A(this.s)*100}%, ${$A(this.l)*100}%${l===1?")":`, ${l})`}`}}));function em(l){return l=(l||0)%360,l<0?l+360:l}function $A(l){return Math.max(0,Math.min(1,l||0))}function A9(l,u,r){return(l<60?u+(r-u)*l/60:l<180?r:l<240?u+(r-u)*(240-l)/60:u)*255}function F9(l,u,r,f,n){var t=l*l,i=t*l;return((1-3*l+3*t-i)*u+(4-6*t+3*i)*r+(1+3*l+3*t-3*i)*f+i*n)/6}function j9(l){var u=l.length-1;return function(r){var f=r<=0?r=0:r>=1?(r=1,u-1):Math.floor(r*u),n=l[f],t=l[f+1],i=f>0?l[f-1]:2*n-t,y=f()=>l;function lB(l,u){return function(r){return l+r*u}}function uB(l,u,r){return l=Math.pow(l,r),u=Math.pow(u,r)-l,r=1/r,function(f){return Math.pow(l+f*u,r)}}function rw(l){return(l=+l)===1?jA:function(u,r){return r-u?uB(u,r,l):R1(isNaN(u)?r:u)}}function jA(l,u){var r=u-l;return r?lB(l,r):R1(isNaN(l)?u:l)}var ei=function l(u){var r=rw(u);function f(n,t){var i=r((n=Ty(n)).r,(t=Ty(t)).r),y=r(n.g,t.g),c=r(n.b,t.b),_=jA(n.opacity,t.opacity);return function(A){return n.r=i(A),n.g=y(A),n.b=c(A),n.opacity=_(A),n+""}}return f.gamma=l,f}(1);function fw(l){return function(u){var r=u.length,f=Array(r),n=Array(r),t=Array(r),i,y;for(i=0;ir)if(t=u.slice(r,t),y[i])y[i]+=t;else y[++i]=t;if((f=f[0])===(n=n[0]))if(y[i])y[i]+=n;else y[++i]=n;else y[++i]=null,c.push({i,x:pr(f,n)});r=m9.lastIndex}if(r180)A+=360;else if(A-_>180)_+=360;j.push({i:F.push(n(F)+"rotate(",null,f)-2,x:pr(_,A)})}else if(A)F.push(n(F)+"rotate("+A+f)}function y(_,A,F,j){if(_!==A)j.push({i:F.push(n(F)+"skewX(",null,f)-2,x:pr(_,A)});else if(A)F.push(n(F)+"skewX("+A+f)}function c(_,A,F,j,N,U){if(_!==F||A!==j){var w=N.push(n(N)+"scale(",null,",",null,")");U.push({i:w-4,x:pr(_,F)},{i:w-2,x:pr(A,j)})}else if(F!==1||j!==1)N.push(n(N)+"scale("+F+","+j+")")}return function(_,A){var F=[],j=[];return _=l(_),A=l(A),t(_.translateX,_.translateY,A.translateX,A.translateY,F,j),i(_.rotate,A.rotate,F,j),y(_.skewX,A.skewX,F,j),c(_.scaleX,_.scaleY,A.scaleX,A.scaleY,F,j),_=A=null,function(N){var U=-1,w=j.length,G;while(++U=0)l._call.call(void 0,u);l=l._next}--Ey}function Nw(){u0=(mA=g1.now())+wA,Ey=b1=0;try{Qw()}finally{Ey=0,WB(),u0=0}}function GB(){var l=g1.now(),u=l-mA;if(u>Jw)wA-=u,mA=l}function WB(){var l,u=QA,r,f=1/0;while(u)if(u._call){if(f>u._time)f=u._time;l=u,u=u._next}else r=u._next,u._next=null,u=l?l._next=r:QA=r;v1=l,G9(f)}function G9(l){if(Ey)return;if(b1)b1=clearTimeout(b1);var u=l-u0;if(u>24){if(l<1/0)b1=setTimeout(Nw,l-g1.now()-wA);if(x1)x1=clearInterval(x1)}else{if(!x1)mA=g1.now(),x1=setInterval(GB,Jw);Ey=1,Uw(Nw)}}function a1(l,u,r){var f=new k1;return u=u==null?0:+u,f.restart((n)=>{f.stop(),l(n+u)},u,r),f}var KB=Ii("start","end","cancel","interrupt"),EB=[],qw=0,mw=1,GA=2,LA=3,ww=4,WA=5,o1=6;function nt(l,u,r,f,n,t){var i=l.__transition;if(!i)l.__transition={};else if(r in i)return;pB(l,r,{name:u,index:f,group:n,on:KB,tween:EB,time:t.time,delay:t.delay,duration:t.duration,ease:t.ease,timer:null,state:qw})}function d1(l,u){var r=ir(l,u);if(r.state>qw)throw Error("too late; already scheduled");return r}function Ur(l,u){var r=ir(l,u);if(r.state>LA)throw Error("too late; already running");return r}function ir(l,u){var r=l.__transition;if(!r||!(r=r[u]))throw Error("transition not found");return r}function pB(l,u,r){var f=l.__transition,n;f[u]=r,r.timer=qA(t,0,r.time);function t(_){if(r.state=mw,r.timer.restart(i,r.delay,r.time),r.delay<=_)i(_-r.delay)}function i(_){var A,F,j,N;if(r.state!==mw)return c();for(A in f){if(N=f[A],N.name!==r.name)continue;if(N.state===LA)return a1(i);if(N.state===ww)N.state=o1,N.timer.stop(),N.on.call("interrupt",l,l.__data__,N.index,N.group),delete f[A];else if(+AGA&&f.state=0)u=u.slice(0,r);return!u||u==="start"})}function gB(l,u,r){var f,n,t=vB(u)?d1:Ur;return function(){var i=t(this,l),y=i.on;if(y!==f)(n=(f=y).copy()).on(u,r);i.on=n}}function D9(l,u){var r=this._id;return arguments.length<2?ir(this.node(),r).on.on(l):this.each(gB(r,l,u))}function kB(l){return function(){var u=this.parentNode;for(var r in this.__transition)if(+r!==l)return;if(u)u.removeChild(this)}}function V9(){return this.on("end.remove",kB(this._id))}function S9(l){var u=this._name,r=this._id;if(typeof l!=="function")l=at(l);for(var f=this._groups,n=f.length,t=Array(n),i=0;i()=>l;function b9(l,{sourceEvent:u,target:r,transform:f,dispatch:n}){Object.defineProperties(this,{type:{value:l,enumerable:!0,configurable:!0},sourceEvent:{value:u,enumerable:!0,configurable:!0},target:{value:r,enumerable:!0,configurable:!0},transform:{value:f,enumerable:!0,configurable:!0},_:{value:n}})}function tn(l,u,r){this.k=l,this.x=u,this.y=r}tn.prototype={constructor:tn,scale:function(l){return l===1?this:new tn(this.k*l,this.x,this.y)},translate:function(l,u){return l===0&u===0?this:new tn(this.k,this.x+this.k*l,this.y+this.k*u)},apply:function(l){return[l[0]*this.k+this.x,l[1]*this.k+this.y]},applyX:function(l){return l*this.k+this.x},applyY:function(l){return l*this.k+this.y},invert:function(l){return[(l[0]-this.x)/this.k,(l[1]-this.y)/this.k]},invertX:function(l){return(l-this.x)/this.k},invertY:function(l){return(l-this.y)/this.k},rescaleX:function(l){return l.copy().domain(l.range().map(this.invertX,this).map(l.invert,l))},rescaleY:function(l){return l.copy().domain(l.range().map(this.invertY,this).map(l.invert,l))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var r0=new tn(1,0,0);u$.prototype=tn.prototype;function u$(l){while(!l.__zoom)if(!(l=l.parentNode))return r0;return l.__zoom}function VA(l){l.stopImmediatePropagation()}function f0(l){l.preventDefault(),l.stopImmediatePropagation()}function _D(l){return(!l.ctrlKey||l.type==="wheel")&&!l.button}function AD(){var l=this;if(l instanceof SVGElement){if(l=l.ownerSVGElement||l,l.hasAttribute("viewBox"))return l=l.viewBox.baseVal,[[l.x,l.y],[l.x+l.width,l.y+l.height]];return[[0,0],[l.width.baseVal.value,l.height.baseVal.value]]}return[[0,0],[l.clientWidth,l.clientHeight]]}function Ww(){return this.__zoom||r0}function FD(l){return-l.deltaY*(l.deltaMode===1?0.05:l.deltaMode?1:0.002)*(l.ctrlKey?10:1)}function jD(){return navigator.maxTouchPoints||"ontouchstart"in this}function ND(l,u,r){var f=l.invertX(u[0][0])-r[0][0],n=l.invertX(u[1][0])-r[1][0],t=l.invertY(u[0][1])-r[0][1],i=l.invertY(u[1][1])-r[1][1];return l.translate(n>f?(f+n)/2:Math.min(0,f)||Math.max(0,n),i>t?(t+i)/2:Math.min(0,t)||Math.max(0,i))}function r$(){var l=_D,u=AD,r=ND,f=FD,n=jD,t=[0,1/0],i=[[-1/0,-1/0],[1/0,1/0]],y=250,c=l0,_=Ii("start","zoom","end"),A,F,j,N=500,U=150,w=0,G=10;function J(E){E.property("__zoom",Ww).on("wheel.zoom",Z,{passive:!1}).on("mousedown.zoom",V).on("dblclick.zoom",P).filter(n).on("touchstart.zoom",H).on("touchmove.zoom",B).on("touchend.zoom touchcancel.zoom",C).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}J.transform=function(E,D,Y,v){var K=E.selection?E.selection():E;if(K.property("__zoom",Ww),E!==K)W(E,D,Y,v);else K.interrupt().each(function(){p(this,arguments).event(v).start().zoom(null,typeof D==="function"?D.apply(this,arguments):D).end()})},J.scaleBy=function(E,D,Y,v){J.scaleTo(E,function(){var K=this.__zoom.k,X=typeof D==="function"?D.apply(this,arguments):D;return K*X},Y,v)},J.scaleTo=function(E,D,Y,v){J.transform(E,function(){var K=u.apply(this,arguments),X=this.__zoom,I=Y==null?q(K):typeof Y==="function"?Y.apply(this,arguments):Y,o=X.invert(I),fl=typeof D==="function"?D.apply(this,arguments):D;return r(m(Q(X,fl),I,o),K,i)},Y,v)},J.translateBy=function(E,D,Y,v){J.transform(E,function(){return r(this.__zoom.translate(typeof D==="function"?D.apply(this,arguments):D,typeof Y==="function"?Y.apply(this,arguments):Y),u.apply(this,arguments),i)},null,v)},J.translateTo=function(E,D,Y,v,K){J.transform(E,function(){var X=u.apply(this,arguments),I=this.__zoom,o=v==null?q(X):typeof v==="function"?v.apply(this,arguments):v;return r(r0.translate(o[0],o[1]).scale(I.k).translate(typeof D==="function"?-D.apply(this,arguments):-D,typeof Y==="function"?-Y.apply(this,arguments):-Y),X,i)},v,K)};function Q(E,D){return D=Math.max(t[0],Math.min(t[1],D)),D===E.k?E:new tn(D,E.x,E.y)}function m(E,D,Y){var v=D[0]-Y[0]*E.k,K=D[1]-Y[1]*E.k;return v===E.x&&K===E.y?E:new tn(E.k,v,K)}function q(E){return[(+E[0][0]+ +E[1][0])/2,(+E[0][1]+ +E[1][1])/2]}function W(E,D,Y,v){E.on("start.zoom",function(){p(this,arguments).event(v).start()}).on("interrupt.zoom end.zoom",function(){p(this,arguments).event(v).end()}).tween("zoom",function(){var K=this,X=arguments,I=p(K,X).event(v),o=u.apply(K,X),fl=Y==null?q(o):typeof Y==="function"?Y.apply(K,X):Y,yl=Math.max(o[1][0]-o[0][0],o[1][1]-o[0][1]),h=K.__zoom,s=typeof D==="function"?D.apply(K,X):D,ul=c(h.invert(fl).concat(yl/h.k),s.invert(fl).concat(yl/s.k));return function(tl){if(tl===1)tl=s;else{var Al=ul(tl),Kl=yl/Al[2];tl=new tn(Kl,fl[0]-Al[0]*Kl,fl[1]-Al[1]*Kl)}I.zoom(null,tl)}})}function p(E,D,Y){return!Y&&E.__zooming||new O(E,D)}function O(E,D){this.that=E,this.args=D,this.active=0,this.sourceEvent=null,this.extent=u.apply(E,D),this.taps=0}O.prototype={event:function(E){if(E)this.sourceEvent=E;return this},start:function(){if(++this.active===1)this.that.__zooming=this,this.emit("start");return this},zoom:function(E,D){if(this.mouse&&E!=="mouse")this.mouse[1]=D.invert(this.mouse[0]);if(this.touch0&&E!=="touch")this.touch0[1]=D.invert(this.touch0[0]);if(this.touch1&&E!=="touch")this.touch1[1]=D.invert(this.touch1[0]);return this.that.__zoom=D,this.emit("zoom"),this},end:function(){if(--this.active===0)delete this.that.__zooming,this.emit("end");return this},emit:function(E){var D=tr(this.that).datum();_.call(E,this.that,new b9(E,{sourceEvent:this.sourceEvent,target:J,type:E,transform:this.that.__zoom,dispatch:_}),D)}};function Z(E,...D){if(!l.apply(this,arguments))return;var Y=p(this,D).event(E),v=this.__zoom,K=Math.max(t[0],Math.min(t[1],v.k*Math.pow(2,f.apply(this,arguments)))),X=Er(E);if(Y.wheel){if(Y.mouse[0][0]!==X[0]||Y.mouse[0][1]!==X[1])Y.mouse[1]=v.invert(Y.mouse[0]=X);clearTimeout(Y.wheel)}else if(v.k===K)return;else Y.mouse=[X,v.invert(X)],dt(this),Y.start();f0(E),Y.wheel=setTimeout(I,U),Y.zoom("mouse",r(m(Q(v,K),Y.mouse[0],Y.mouse[1]),Y.extent,i));function I(){Y.wheel=null,Y.end()}}function V(E,...D){if(j||!l.apply(this,arguments))return;var Y=E.currentTarget,v=p(this,D,!0).event(E),K=tr(E.view).on("mousemove.zoom",fl,!0).on("mouseup.zoom",yl,!0),X=Er(E,Y),I=E.clientX,o=E.clientY;Gy(E.view),VA(E),v.mouse=[X,this.__zoom.invert(X)],dt(this),v.start();function fl(h){if(f0(h),!v.moved){var s=h.clientX-I,ul=h.clientY-o;v.moved=s*s+ul*ul>w}v.event(h).zoom("mouse",r(m(v.that.__zoom,v.mouse[0]=Er(h,Y),v.mouse[1]),v.extent,i))}function yl(h){K.on("mousemove.zoom mouseup.zoom",null),S1(h.view,v.moved),f0(h),v.event(h).end()}}function P(E,...D){if(!l.apply(this,arguments))return;var Y=this.__zoom,v=Er(E.changedTouches?E.changedTouches[0]:E,this),K=Y.invert(v),X=Y.k*(E.shiftKey?0.5:2),I=r(m(Q(Y,X),v,K),u.apply(this,D),i);if(f0(E),y>0)tr(this).transition().duration(y).call(W,I,v,E);else tr(this).call(J.transform,I,v,E)}function H(E,...D){if(!l.apply(this,arguments))return;var Y=E.touches,v=Y.length,K=p(this,D,E.changedTouches.length===v).event(E),X,I,o,fl;VA(E);for(I=0;I"[React Flow]: Seems like you have not used zustand provider as an ancestor. Help: https://reactflow.dev/error#001",error002:()=>"It looks like you've created a new nodeTypes or edgeTypes object. If this wasn't on purpose please define the nodeTypes/edgeTypes outside of the component or memoize them.",error003:(l)=>`Node type "${l}" not found. Using fallback type "default".`,error004:()=>"The React Flow parent container needs a width and a height to render the graph.",error005:()=>"Only child nodes can use a parent extent.",error006:()=>"Can't create edge. An edge needs a source and a target.",error007:(l)=>`The old edge with id=${l} does not exist.`,error009:(l)=>`Marker type "${l}" doesn't exist.`,error008:(l,{id:u,sourceHandle:r,targetHandle:f})=>`Couldn't create edge for ${l} handle id: "${l==="source"?r:f}", edge id: ${u}.`,error010:()=>"Handle: No node id found. Make sure to only use a Handle inside a custom Node.",error011:(l)=>`Edge type "${l}" not found. Using fallback type "default".`,error012:(l)=>`Node with id "${l}" does not exist, it may have been removed. This can happen when a node is deleted before the "onNodeClick" handler is called.`,error013:(l="react")=>`It seems that you haven't loaded the styles. Please import '@xyflow/${l}/dist/style.css' or base.css to make sure everything is working properly.`,error014:()=>"useNodeConnections: No node ID found. Call useNodeConnections inside a custom Node or provide a node ID.",error015:()=>"It seems that you are trying to drag a node that is not initialized. Please use onNodesChange as explained in the docs."},By=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],a9=["Enter"," ","Escape"],o9={"node.a11yDescription.default":"Press enter or space to select a node. Press delete to remove it and escape to cancel.","node.a11yDescription.keyboardDisabled":"Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.","node.a11yDescription.ariaLiveMessage":({direction:l,x:u,y:r})=>`Moved selected node ${l}. New position, x: ${u}, y: ${r}`,"edge.a11yDescription.default":"Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.","controls.ariaLabel":"Control Panel","controls.zoomIn.ariaLabel":"Zoom In","controls.zoomOut.ariaLabel":"Zoom Out","controls.fitView.ariaLabel":"Fit View","controls.interactive.ariaLabel":"Toggle Interactivity","minimap.ariaLabel":"Mini Map","handle.ariaLabel":"Handle"},ui;(function(l){l.Strict="strict",l.Loose="loose"})(ui||(ui={}));var it;(function(l){l.Free="free",l.Vertical="vertical",l.Horizontal="horizontal"})(it||(it={}));var n0;(function(l){l.Partial="partial",l.Full="full"})(n0||(n0={}));var d9={inProgress:!1,isValid:null,from:null,fromHandle:null,fromPosition:null,fromNode:null,to:null,toHandle:null,toPosition:null,toNode:null,pointer:null},pn;(function(l){l.Bezier="default",l.Straight="straight",l.Step="step",l.SmoothStep="smoothstep",l.SimpleBezier="simplebezier"})(pn||(pn={}));var ri;(function(l){l.Arrow="arrow",l.ArrowClosed="arrowclosed"})(ri||(ri={}));var Ol;(function(l){l.Left="left",l.Top="top",l.Right="right",l.Bottom="bottom"})(Ol||(Ol={}));var Tw={[Ol.Left]:Ol.Right,[Ol.Right]:Ol.Left,[Ol.Top]:Ol.Bottom,[Ol.Bottom]:Ol.Top};function e9(l){return l===null?null:l?"valid":"invalid"}var lF=(l)=>("id"in l)&&("source"in l)&&("target"in l),Xw=(l)=>("id"in l)&&("position"in l)&&!("source"in l)&&!("target"in l),uF=(l)=>("id"in l)&&("internals"in l)&&!("source"in l)&&!("target"in l);var t$=(l,u=[0,0])=>{let{width:r,height:f}=zn(l),n=l.origin??u,t=r*n[0],i=f*n[1];return{x:l.position.x-t,y:l.position.y-i}},rF=(l,u={nodeOrigin:[0,0]})=>{if(l.length===0)return{x:0,y:0,width:0,height:0};let r=l.reduce((f,n)=>{let t=typeof n==="string",i=!u.nodeLookup&&!t?n:void 0;if(u.nodeLookup)i=t?u.nodeLookup.get(n):!uF(n)?u.nodeLookup.get(n.id):n;let y=i?XA(i,u.nodeOrigin):{x:0,y:0,x2:0,y2:0};return CA(f,y)},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return hA(r)},Dy=(l,u={})=>{let r={x:1/0,y:1/0,x2:-1/0,y2:-1/0},f=!1;return l.forEach((n)=>{if(u.filter===void 0||u.filter(n))r=CA(r,XA(n)),f=!0}),f?hA(r):{x:0,y:0,width:0,height:0}},PA=(l,u,[r,f,n]=[0,0,1],t=!1,i=!1)=>{let y={...Yy(u,[r,f,n]),width:u.width/n,height:u.height/n},c=[];for(let _ of l.values()){let{measured:A,selectable:F=!0,hidden:j=!1}=_;if(i&&!F||j)continue;let N=A.width??_.width??_.initialWidth??null,U=A.height??_.height??_.initialHeight??null,w=Vy(y,i0(_)),G=(N??0)*(U??0),J=t&&w>0;if(!_.internals.handleBounds||J||w>=G||_.dragging)c.push(_)}return c},Pw=(l,u)=>{let r=new Set;return l.forEach((f)=>{r.add(f.id)}),u.filter((f)=>r.has(f.source)||r.has(f.target))};function JD(l,u){let r=new Map,f=u?.nodes?new Set(u.nodes.map((n)=>n.id)):null;return l.forEach((n)=>{if(n.measured.width&&n.measured.height&&(u?.includeHiddenNodes||!n.hidden)&&(!f||f.has(n.id)))r.set(n.id,n)}),r}async function Cw({nodes:l,width:u,height:r,panZoom:f,minZoom:n,maxZoom:t},i){if(l.size===0)return Promise.resolve(!0);let y=JD(l,i),c=Dy(y),_=i$(c,u,r,i?.minZoom??n,i?.maxZoom??t,i?.padding??0.1);return await f.setViewport(_,{duration:i?.duration,ease:i?.ease,interpolate:i?.interpolate}),Promise.resolve(!0)}function fF({nodeId:l,nextPosition:u,nodeLookup:r,nodeOrigin:f=[0,0],nodeExtent:n,onError:t}){let i=r.get(l),y=i.parentId?r.get(i.parentId):void 0,{x:c,y:_}=y?y.internals.positionAbsolute:{x:0,y:0},A=i.origin??f,F=i.extent||n;if(i.extent==="parent"&&!i.expandParent)if(!y)t?.("005",mf.error005());else{let N=y.measured.width,U=y.measured.height;if(N&&U)F=[[c,_],[c+N,_+U]]}else if(y&&Hy(i.extent))F=[[i.extent[0][0]+c,i.extent[0][1]+_],[i.extent[1][0]+c,i.extent[1][1]+_]];let j=Hy(F)?t0(u,F,i.measured):u;if(i.measured.width===void 0||i.measured.height===void 0)t?.("015",mf.error015());return{position:{x:j.x-c+(i.measured.width??0)*A[0],y:j.y-_+(i.measured.height??0)*A[1]},positionAbsolute:j}}async function hw({nodesToRemove:l=[],edgesToRemove:u=[],nodes:r,edges:f,onBeforeDelete:n}){let t=new Set(l.map((j)=>j.id)),i=[];for(let j of r){if(j.deletable===!1)continue;let N=t.has(j.id),U=!N&&j.parentId&&i.find((w)=>w.id===j.parentId);if(N||U)i.push(j)}let y=new Set(u.map((j)=>j.id)),c=f.filter((j)=>j.deletable!==!1),A=Pw(i,c);for(let j of c)if(y.has(j.id)&&!A.find((U)=>U.id===j.id))A.push(j);if(!n)return{edges:A,nodes:i};let F=await n({nodes:i,edges:A});if(typeof F==="boolean")return F?{edges:A,nodes:i}:{edges:[],nodes:[]};return F}var Zy=(l,u=0,r=1)=>Math.min(Math.max(l,u),r),t0=(l={x:0,y:0},u,r)=>({x:Zy(l.x,u[0][0],u[1][0]-(r?.width??0)),y:Zy(l.y,u[0][1],u[1][1]-(r?.height??0))});function Mw(l,u,r){let{width:f,height:n}=zn(r),{x:t,y:i}=r.internals.positionAbsolute;return t0(l,[[t,i],[t+f,i+n]],u)}var Kw=(l,u,r)=>{if(lr)return-Zy(Math.abs(l-r),1,u)/u;return 0},sw=(l,u,r=15,f=40)=>{let n=Kw(l.x,f,u.width-f)*r,t=Kw(l.y,f,u.height-f)*r;return[n,t]},CA=(l,u)=>({x:Math.min(l.x,u.x),y:Math.min(l.y,u.y),x2:Math.max(l.x2,u.x2),y2:Math.max(l.y2,u.y2)}),I9=({x:l,y:u,width:r,height:f})=>({x:l,y:u,x2:l+r,y2:u+f}),hA=({x:l,y:u,x2:r,y2:f})=>({x:l,y:u,width:r-l,height:f-u}),i0=(l,u=[0,0])=>{let{x:r,y:f}=uF(l)?l.internals.positionAbsolute:t$(l,u);return{x:r,y:f,width:l.measured?.width??l.width??l.initialWidth??0,height:l.measured?.height??l.height??l.initialHeight??0}},XA=(l,u=[0,0])=>{let{x:r,y:f}=uF(l)?l.internals.positionAbsolute:t$(l,u);return{x:r,y:f,x2:r+(l.measured?.width??l.width??l.initialWidth??0),y2:f+(l.measured?.height??l.height??l.initialHeight??0)}},nF=(l,u)=>hA(CA(I9(l),I9(u))),Vy=(l,u)=>{let r=Math.max(0,Math.min(l.x+l.width,u.x+u.width)-Math.max(l.x,u.x)),f=Math.max(0,Math.min(l.y+l.height,u.y+u.height)-Math.max(l.y,u.y));return Math.ceil(r*f)},tF=(l)=>Vf(l.width)&&Vf(l.height)&&Vf(l.x)&&Vf(l.y),Vf=(l)=>!isNaN(l)&&isFinite(l),iF=(l,u)=>{},Sy=(l,u=[1,1])=>{return{x:u[0]*Math.round(l.x/u[0]),y:u[1]*Math.round(l.y/u[1])}},Yy=({x:l,y:u},[r,f,n],t=!1,i=[1,1])=>{let y={x:(l-r)/n,y:(u-f)/n};return t?Sy(y,i):y},n$=({x:l,y:u},[r,f,n])=>{return{x:l*n+r,y:u*n+f}};function zy(l,u){if(typeof l==="number")return Math.floor((u-u/(1+l))*0.5);if(typeof l==="string"&&l.endsWith("px")){let r=parseFloat(l);if(!Number.isNaN(r))return Math.floor(r)}if(typeof l==="string"&&l.endsWith("%")){let r=parseFloat(l);if(!Number.isNaN(r))return Math.floor(u*r*0.01)}return console.error(`[React Flow] The padding value "${l}" is invalid. Please provide a number or a string with a valid unit (px or %).`),0}function UD(l,u,r){if(typeof l==="string"||typeof l==="number"){let f=zy(l,r),n=zy(l,u);return{top:f,right:n,bottom:f,left:n,x:n*2,y:f*2}}if(typeof l==="object"){let f=zy(l.top??l.y??0,r),n=zy(l.bottom??l.y??0,r),t=zy(l.left??l.x??0,u),i=zy(l.right??l.x??0,u);return{top:f,right:i,bottom:n,left:t,x:t+i,y:f+n}}return{top:0,right:0,bottom:0,left:0,x:0,y:0}}function QD(l,u,r,f,n,t){let{x:i,y}=n$(l,[u,r,f]),{x:c,y:_}=n$({x:l.x+l.width,y:l.y+l.height},[u,r,f]),A=n-c,F=t-_;return{left:Math.floor(i),top:Math.floor(y),right:Math.floor(A),bottom:Math.floor(F)}}var i$=(l,u,r,f,n,t)=>{let i=UD(t,u,r),y=(u-i.x)/l.width,c=(r-i.y)/l.height,_=Math.min(y,c),A=Zy(_,f,n),F=l.x+l.width/2,j=l.y+l.height/2,N=u/2-F*A,U=r/2-j*A,w=QD(l,N,U,A,u,r),G={left:Math.min(w.left-i.left,0),top:Math.min(w.top-i.top,0),right:Math.min(w.right-i.right,0),bottom:Math.min(w.bottom-i.bottom,0)};return{x:N-G.left+G.right,y:U-G.top+G.bottom,zoom:A}},Xy=()=>typeof navigator<"u"&&navigator?.userAgent?.indexOf("Mac")>=0;function Hy(l){return l!==void 0&&l!==null&&l!=="parent"}function zn(l){return{width:l.measured?.width??l.width??l.initialWidth??0,height:l.measured?.height??l.height??l.initialHeight??0}}function yF(l){return(l.measured?.width??l.width??l.initialWidth)!==void 0&&(l.measured?.height??l.height??l.initialHeight)!==void 0}function cF(l,u={width:0,height:0},r,f,n){let t={...l},i=f.get(r);if(i){let y=i.origin||n;t.x+=i.internals.positionAbsolute.x-(u.width??0)*y[0],t.y+=i.internals.positionAbsolute.y-(u.height??0)*y[1]}return t}function $F(l,u){if(l.size!==u.size)return!1;for(let r of l)if(!u.has(r))return!1;return!0}function Rw(){let l,u;return{promise:new Promise((f,n)=>{l=f,u=n}),resolve:l,reject:u}}function xw(l){return{...o9,...l||{}}}function f$(l,{snapGrid:u=[0,0],snapToGrid:r=!1,transform:f,containerBounds:n}){let{x:t,y:i}=Sf(l),y=Yy({x:t-(n?.left??0),y:i-(n?.top??0)},f),{x:c,y:_}=r?Sy(y,u):y;return{xSnapped:c,ySnapped:_,...y}}var MA=(l)=>({width:l.offsetWidth,height:l.offsetHeight}),_F=(l)=>l?.getRootNode?.()||window?.document,mD=["INPUT","SELECT","TEXTAREA"];function AF(l){let u=l.composedPath?.()?.[0]||l.target;if(u?.nodeType!==1)return!1;return mD.includes(u.nodeName)||u.hasAttribute("contenteditable")||!!u.closest(".nokey")}var FF=(l)=>("clientX"in l),Sf=(l,u)=>{let r=FF(l),f=r?l.clientX:l.touches?.[0].clientX,n=r?l.clientY:l.touches?.[0].clientY;return{x:f-(u?.left??0),y:n-(u?.top??0)}},Ew=(l,u,r,f,n)=>{let t=u.querySelectorAll(`.${l}`);if(!t||!t.length)return null;return Array.from(t).map((i)=>{let y=i.getBoundingClientRect();return{id:i.getAttribute("data-handleid"),type:l,nodeId:n,position:i.getAttribute("data-handlepos"),x:(y.left-r.left)/f,y:(y.top-r.top)/f,...MA(i)}})};function sA({sourceX:l,sourceY:u,targetX:r,targetY:f,sourceControlX:n,sourceControlY:t,targetControlX:i,targetControlY:y}){let c=l*0.125+n*0.375+i*0.375+r*0.125,_=u*0.125+t*0.375+y*0.375+f*0.125,A=Math.abs(c-l),F=Math.abs(_-u);return[c,_,A,F]}function SA(l,u){if(l>=0)return 0.5*l;return u*25*Math.sqrt(-l)}function pw({pos:l,x1:u,y1:r,x2:f,y2:n,c:t}){switch(l){case Ol.Left:return[u-SA(u-f,t),r];case Ol.Right:return[u+SA(f-u,t),r];case Ol.Top:return[u,r-SA(r-n,t)];case Ol.Bottom:return[u,r+SA(n-r,t)]}}function RA({sourceX:l,sourceY:u,sourcePosition:r=Ol.Bottom,targetX:f,targetY:n,targetPosition:t=Ol.Top,curvature:i=0.25}){let[y,c]=pw({pos:r,x1:l,y1:u,x2:f,y2:n,c:i}),[_,A]=pw({pos:t,x1:f,y1:n,x2:l,y2:u,c:i}),[F,j,N,U]=sA({sourceX:l,sourceY:u,targetX:f,targetY:n,sourceControlX:y,sourceControlY:c,targetControlX:_,targetControlY:A});return[`M${l},${u} C${y},${c} ${_},${A} ${f},${n}`,F,j,N,U]}function jF({sourceX:l,sourceY:u,targetX:r,targetY:f}){let n=Math.abs(r-l)/2,t=r0}var wD=({source:l,sourceHandle:u,target:r,targetHandle:f})=>`xy-edge__${l}${u||""}-${r}${f||""}`,qD=(l,u)=>{return u.some((r)=>r.source===l.source&&r.target===l.target&&(r.sourceHandle===l.sourceHandle||!r.sourceHandle&&!l.sourceHandle)&&(r.targetHandle===l.targetHandle||!r.targetHandle&&!l.targetHandle))},NF=(l,u,r={})=>{if(!l.source||!l.target)return iF("006",mf.error006()),u;let f=r.getEdgeId||wD,n;if(lF(l))n={...l};else n={...l,id:f(l)};if(qD(n,u))return u;if(n.sourceHandle===null)delete n.sourceHandle;if(n.targetHandle===null)delete n.targetHandle;return u.concat(n)};function xA({sourceX:l,sourceY:u,targetX:r,targetY:f}){let[n,t,i,y]=jF({sourceX:l,sourceY:u,targetX:r,targetY:f});return[`M ${l},${u}L ${r},${f}`,n,t,i,y]}var zw={[Ol.Left]:{x:-1,y:0},[Ol.Right]:{x:1,y:0},[Ol.Top]:{x:0,y:-1},[Ol.Bottom]:{x:0,y:1}},LD=({source:l,sourcePosition:u=Ol.Bottom,target:r})=>{if(u===Ol.Left||u===Ol.Right)return l.xMath.sqrt(Math.pow(u.x-l.x,2)+Math.pow(u.y-l.y,2));function GD({source:l,sourcePosition:u=Ol.Bottom,target:r,targetPosition:f=Ol.Top,center:n,offset:t,stepPosition:i}){let y=zw[u],c=zw[f],_={x:l.x+y.x*t,y:l.y+y.y*t},A={x:r.x+c.x*t,y:r.y+c.y*t},F=LD({source:_,sourcePosition:u,target:A}),j=F.x!==0?"x":"y",N=F[j],U=[],w,G,J={x:0,y:0},Q={x:0,y:0},[,,m,q]=jF({sourceX:l.x,sourceY:l.y,targetX:r.x,targetY:r.y});if(y[j]*c[j]===-1){if(j==="x")w=n.x??_.x+(A.x-_.x)*i,G=n.y??(_.y+A.y)/2;else w=n.x??(_.x+A.x)/2,G=n.y??_.y+(A.y-_.y)*i;let Z=[{x:w,y:_.y},{x:w,y:A.y}],V=[{x:_.x,y:G},{x:A.x,y:G}];if(y[j]===N)U=j==="x"?Z:V;else U=j==="x"?V:Z}else{let Z=[{x:_.x,y:A.y}],V=[{x:A.x,y:_.y}];if(j==="x")U=y.x===N?V:Z;else U=y.y===N?Z:V;if(u===f){let E=Math.abs(l[j]-r[j]);if(E<=t){let D=Math.min(t-1,t-E);if(y[j]===N)J[j]=(_[j]>l[j]?-1:1)*D;else Q[j]=(A[j]>r[j]?-1:1)*D}}if(u!==f){let E=j==="x"?"y":"x",D=y[j]===c[E],Y=_[E]>A[E],v=_[E]=C)w=(P.x+H.x)/2,G=U[0].y;else w=U[0].x,G=(P.y+H.y)/2}let W={x:_.x+J.x,y:_.y+J.y},p={x:A.x+Q.x,y:A.y+Q.y};return[[l,...W.x!==U[0].x||W.y!==U[0].y?[W]:[],...U,...p.x!==U[U.length-1].x||p.y!==U[U.length-1].y?[p]:[],r],w,G,m,q]}function WD(l,u,r,f){let n=Math.min(Ow(l,u)/2,Ow(u,r)/2,f),{x:t,y:i}=u;if(l.x===t&&t===r.x||l.y===i&&i===r.y)return`L${t} ${i}`;if(l.y===i){let _=l.xr.id===u))||null}function bA(l,u){if(!l)return"";if(typeof l==="string")return l;return`${u?`${u}__`:""}${Object.keys(l).sort().map((f)=>`${f}=${l[f]}`).join("&")}`}function kw(l,{id:u,defaultColor:r,defaultMarkerStart:f,defaultMarkerEnd:n}){let t=new Set;return l.reduce((i,y)=>{return[y.markerStart||f,y.markerEnd||n].forEach((c)=>{if(c&&typeof c==="object"){let _=bA(c,u);if(!t.has(_))i.push({id:_,color:c.color||r,...c}),t.add(_)}}),i},[]).sort((i,y)=>i.id.localeCompare(y.id))}var Iw=1000,TD=10,JF={nodeOrigin:[0,0],nodeExtent:By,elevateNodesOnSelect:!0,zIndexMode:"basic",defaults:{}},KD={...JF,checkEquality:!0};function UF(l,u){let r={...l};for(let f in u)if(u[f]!==void 0)r[f]=u[f];return r}function aw(l,u,r){let f=UF(JF,r);for(let n of l.values())if(n.parentId)mF(n,l,u,f);else{let t=t$(n,f.nodeOrigin),i=Hy(n.extent)?n.extent:f.nodeExtent,y=t0(t,i,zn(n));n.internals.positionAbsolute=y}}function ED(l,u){if(!l.handles)return!l.measured?void 0:u?.internals.handleBounds;let r=[],f=[];for(let n of l.handles){let t={id:n.id,width:n.width??1,height:n.height??1,nodeId:l.id,x:n.x,y:n.y,position:n.position,type:n.type};if(n.type==="source")r.push(t);else if(n.type==="target")f.push(t)}return{source:r,target:f}}function QF(l){return l==="manual"}function vA(l,u,r,f={}){let n=UF(KD,f),t={i:0},i=new Map(u),y=n?.elevateNodesOnSelect&&!QF(n.zIndexMode)?Iw:0,c=l.length>0,_=!1;u.clear(),r.clear();for(let A of l){let F=i.get(A.id);if(n.checkEquality&&A===F?.internals.userNode)u.set(A.id,F);else{let j=t$(A,n.nodeOrigin),N=Hy(A.extent)?A.extent:n.nodeExtent,U=t0(j,N,zn(A));F={...n.defaults,...A,measured:{width:A.measured?.width,height:A.measured?.height},internals:{positionAbsolute:U,handleBounds:ED(A,F),z:ow(A,y,n.zIndexMode),userNode:A}},u.set(A.id,F)}if((F.measured===void 0||F.measured.width===void 0||F.measured.height===void 0)&&!F.hidden)c=!1;if(A.parentId)mF(F,u,r,f,t);_||=A.selected??!1}return{nodesInitialized:c,hasSelectedNodes:_}}function pD(l,u){if(!l.parentId)return;let r=u.get(l.parentId);if(r)r.set(l.id,l);else u.set(l.parentId,new Map([[l.id,l]]))}function mF(l,u,r,f,n){let{elevateNodesOnSelect:t,nodeOrigin:i,nodeExtent:y,zIndexMode:c}=UF(JF,f),_=l.parentId,A=u.get(_);if(!A){console.warn(`Parent node ${_} not found. Please make sure that parent nodes are in front of their child nodes in the nodes array.`);return}if(pD(l,r),n&&!A.parentId&&A.internals.rootParentIndex===void 0&&c==="auto")A.internals.rootParentIndex=++n.i,A.internals.z=A.internals.z+n.i*TD;if(n&&A.internals.rootParentIndex!==void 0)n.i=A.internals.rootParentIndex;let F=t&&!QF(c)?Iw:0,{x:j,y:N,z:U}=zD(l,A,i,y,F,c),{positionAbsolute:w}=l.internals,G=j!==w.x||N!==w.y;if(G||U!==l.internals.z)u.set(l.id,{...l,internals:{...l.internals,positionAbsolute:G?{x:j,y:N}:w,z:U}})}function ow(l,u,r){let f=Vf(l.zIndex)?l.zIndex:0;if(QF(r))return f;return f+(l.selected?u:0)}function zD(l,u,r,f,n,t){let{x:i,y}=u.internals.positionAbsolute,c=zn(l),_=t$(l,r),A=Hy(l.extent)?t0(_,l.extent,c):_,F=t0({x:i+A.x,y:y+A.y},f,c);if(l.extent==="parent")F=Mw(F,c,u);let j=ow(l,n,t),N=u.internals.z??0;return{x:F.x,y:F.y,z:N>=j?N+1:j}}function gA(l,u,r,f=[0,0]){let n=[],t=new Map;for(let i of l){let y=u.get(i.parentId);if(!y)continue;let c=t.get(i.parentId)?.expandedRect??i0(y),_=nF(c,i.rect);t.set(i.parentId,{expandedRect:_,parent:y})}if(t.size>0)t.forEach(({expandedRect:i,parent:y},c)=>{let _=y.internals.positionAbsolute,A=zn(y),F=y.origin??f,j=i.x<_.x?Math.round(Math.abs(_.x-i.x)):0,N=i.y<_.y?Math.round(Math.abs(_.y-i.y)):0,U=Math.max(A.width,Math.round(i.width)),w=Math.max(A.height,Math.round(i.height)),G=(U-A.width)*F[0],J=(w-A.height)*F[1];if(j>0||N>0||G||J)n.push({id:c,type:"position",position:{x:y.position.x-j+G,y:y.position.y-N+J}}),r.get(c)?.forEach((Q)=>{if(!l.some((m)=>m.id===Q.id))n.push({id:Q.id,type:"position",position:{x:Q.position.x+j,y:Q.position.y+N}})});if(A.width0){let N=gA(j,u,r,n);_.push(...N)}return{changes:_,updatedInternals:c}}async function ew({delta:l,panZoom:u,transform:r,translateExtent:f,width:n,height:t}){if(!u||!l.x&&!l.y)return Promise.resolve(!1);let i=await u.setViewportConstrained({x:r[0]+l.x,y:r[1]+l.y,zoom:r[2]},[[0,0],[n,t]],f),y=!!i&&(i.x!==r[0]||i.y!==r[1]||i.k!==r[2]);return Promise.resolve(y)}function Dw(l,u,r,f,n,t){let i=n,y=f.get(i)||new Map;f.set(i,y.set(r,u)),i=`${n}-${l}`;let c=f.get(i)||new Map;if(f.set(i,c.set(r,u)),t){i=`${n}-${l}-${t}`;let _=f.get(i)||new Map;f.set(i,_.set(r,u))}}function wF(l,u,r){l.clear(),u.clear();for(let f of r){let{source:n,target:t,sourceHandle:i=null,targetHandle:y=null}=f,c={edgeId:f.id,source:n,target:t,sourceHandle:i,targetHandle:y},_=`${n}-${i}--${t}-${y}`,A=`${t}-${y}--${n}-${i}`;Dw("source",c,A,l,n,i),Dw("target",c,_,l,t,y),u.set(f.id,f)}}function lq(l,u){if(!l.parentId)return!1;let r=u.get(l.parentId);if(!r)return!1;if(r.selected)return!0;return lq(r,u)}function Vw(l,u,r){let f=l;do{if(f?.matches?.(u))return!0;if(f===r)return!1;f=f?.parentElement}while(f);return!1}function OD(l,u,r,f){let n=new Map;for(let[t,i]of l)if((i.selected||i.id===f)&&(!i.parentId||!lq(i,l))&&(i.draggable||u&&typeof i.draggable>"u")){let y=l.get(t);if(y)n.set(t,{id:t,position:y.position||{x:0,y:0},distance:{x:r.x-y.internals.positionAbsolute.x,y:r.y-y.internals.positionAbsolute.y},extent:y.extent,parentId:y.parentId,origin:y.origin,expandParent:y.expandParent,internals:{positionAbsolute:y.internals.positionAbsolute||{x:0,y:0}},measured:{width:y.measured.width??0,height:y.measured.height??0}})}return n}function v9({nodeId:l,dragItems:u,nodeLookup:r,dragging:f=!0}){let n=[];for(let[i,y]of u){let c=r.get(i)?.internals.userNode;if(c)n.push({...c,position:y.position,dragging:f})}if(!l)return[n[0],n];let t=r.get(l)?.internals.userNode;return[!t?n[0]:{...t,position:u.get(l)?.position||t.position,dragging:f},n]}function ZD({dragItems:l,snapGrid:u,x:r,y:f}){let n=l.values().next().value;if(!n)return null;let t={x:r-n.distance.x,y:f-n.distance.y},i=Sy(t,u);return{x:i.x-t.x,y:i.y-t.y}}function uq({onNodeMouseDown:l,getStoreItems:u,onDragStart:r,onDrag:f,onDragStop:n}){let t={x:null,y:null},i=0,y=new Map,c=!1,_={x:0,y:0},A=null,F=!1,j=null,N=!1,U=!1,w=null;function G({noDragClassName:Q,handleSelector:m,domNode:q,isSelectable:W,nodeId:p,nodeClickDistance:O=0}){j=tr(q);function Z({x:B,y:C}){let{nodeLookup:E,nodeExtent:D,snapGrid:Y,snapToGrid:v,nodeOrigin:K,onNodeDrag:X,onSelectionDrag:I,onError:o,updateNodePositions:fl}=u();t={x:B,y:C};let yl=!1,h=y.size>1,s=h&&D?I9(Dy(y)):null,ul=h&&v?ZD({dragItems:y,snapGrid:Y,x:B,y:C}):null;for(let[tl,Al]of y){if(!E.has(tl))continue;let Kl={x:B-Al.distance.x,y:C-Al.distance.y};if(v)Kl=ul?{x:Math.round(Kl.x+ul.x),y:Math.round(Kl.y+ul.y)}:Sy(Kl,Y);let wl=null;if(h&&D&&!Al.extent&&s){let{positionAbsolute:d}=Al.internals,nl=d.x-s.x+D[0][0],k=d.x+Al.measured.width-s.x2+D[1][0],g=d.y-s.y+D[0][1],cl=d.y+Al.measured.height-s.y2+D[1][1];wl=[[nl,g],[k,cl]]}let{position:El,positionAbsolute:M}=fF({nodeId:tl,nextPosition:Kl,nodeLookup:E,nodeExtent:wl?wl:D,nodeOrigin:K,onError:o});yl=yl||Al.position.x!==El.x||Al.position.y!==El.y,Al.position=El,Al.internals.positionAbsolute=M}if(U=U||yl,!yl)return;if(fl(y,!0),w&&(f||X||!p&&I)){let[tl,Al]=v9({nodeId:p,dragItems:y,nodeLookup:E});if(f?.(w,y,tl,Al),X?.(w,tl,Al),!p)I?.(w,Al)}}async function V(){if(!A)return;let{transform:B,panBy:C,autoPanSpeed:E,autoPanOnNodeDrag:D}=u();if(!D){c=!1,cancelAnimationFrame(i);return}let[Y,v]=sw(_,A,E);if(Y!==0||v!==0){if(t.x=(t.x??0)-Y/B[2],t.y=(t.y??0)-v/B[2],await C({x:Y,y:v}))Z(t)}i=requestAnimationFrame(V)}function P(B){let{nodeLookup:C,multiSelectionActive:E,nodesDraggable:D,transform:Y,snapGrid:v,snapToGrid:K,selectNodesOnDrag:X,onNodeDragStart:I,onSelectionDragStart:o,unselectNodesAndEdges:fl}=u();if(F=!0,(!X||!W)&&!E&&p){if(!C.get(p)?.selected)fl()}if(W&&X&&p)l?.(p);let yl=f$(B.sourceEvent,{transform:Y,snapGrid:v,snapToGrid:K,containerBounds:A});if(t=yl,y=OD(C,D,yl,p),y.size>0&&(r||I||!p&&o)){let[h,s]=v9({nodeId:p,dragItems:y,nodeLookup:C});if(r?.(B.sourceEvent,y,h,s),I?.(B.sourceEvent,h,s),!p)o?.(B.sourceEvent,s)}}let H=P1().clickDistance(O).on("start",(B)=>{let{domNode:C,nodeDragThreshold:E,transform:D,snapGrid:Y,snapToGrid:v}=u();if(A=C?.getBoundingClientRect()||null,N=!1,U=!1,w=B.sourceEvent,E===0)P(B);t=f$(B.sourceEvent,{transform:D,snapGrid:Y,snapToGrid:v,containerBounds:A}),_=Sf(B.sourceEvent,A)}).on("drag",(B)=>{let{autoPanOnNodeDrag:C,transform:E,snapGrid:D,snapToGrid:Y,nodeDragThreshold:v,nodeLookup:K}=u(),X=f$(B.sourceEvent,{transform:E,snapGrid:D,snapToGrid:Y,containerBounds:A});if(w=B.sourceEvent,B.sourceEvent.type==="touchmove"&&B.sourceEvent.touches.length>1||p&&!K.has(p))N=!0;if(N)return;if(!c&&C&&F)c=!0,V();if(!F){let I=Sf(B.sourceEvent,A),o=I.x-_.x,fl=I.y-_.y;if(Math.sqrt(o*o+fl*fl)>v)P(B)}if((t.x!==X.xSnapped||t.y!==X.ySnapped)&&y&&F)_=Sf(B.sourceEvent,A),Z(X)}).on("end",(B)=>{if(!F||N)return;if(c=!1,F=!1,cancelAnimationFrame(i),y.size>0){let{nodeLookup:C,updateNodePositions:E,onNodeDragStop:D,onSelectionDragStop:Y}=u();if(U)E(y,!1),U=!1;if(n||D||!p&&Y){let[v,K]=v9({nodeId:p,dragItems:y,nodeLookup:C,dragging:!1});if(n?.(B.sourceEvent,y,v,K),D?.(B.sourceEvent,v,K),!p)Y?.(B.sourceEvent,K)}}}).filter((B)=>{let C=B.target;return!B.button&&(!Q||!Vw(C,`.${Q}`,q))&&(!m||Vw(C,m,q))});j.call(H)}function J(){j?.on(".drag",null)}return{update:G,destroy:J}}function HD(l,u,r){let f=[],n={x:l.x-r,y:l.y-r,width:r*2,height:r*2};for(let t of u.values())if(Vy(n,i0(t))>0)f.push(t);return f}var BD=250;function DD(l,u,r,f){let n=[],t=1/0,i=HD(l,r,u+BD);for(let y of i){let c=[...y.internals.handleBounds?.source??[],...y.internals.handleBounds?.target??[]];for(let _ of c){if(f.nodeId===_.nodeId&&f.type===_.type&&f.id===_.id)continue;let{x:A,y:F}=fi(y,_,_.position,!0),j=Math.sqrt(Math.pow(A-l.x,2)+Math.pow(F-l.y,2));if(j>u)continue;if(j1){let y=f.type==="source"?"target":"source";return n.find((c)=>c.type===y)??n[0]}return n[0]}function rq(l,u,r,f,n,t=!1){let i=f.get(l);if(!i)return null;let y=n==="strict"?i.internals.handleBounds?.[u]:[...i.internals.handleBounds?.source??[],...i.internals.handleBounds?.target??[]],c=(r?y?.find((_)=>_.id===r):y?.[0])??null;return c&&t?{...c,...fi(i,c,c.position,!0)}:c}function fq(l,u){if(l)return l;else if(u?.classList.contains("target"))return"target";else if(u?.classList.contains("source"))return"source";return null}function VD(l,u){let r=null;if(u)r=!0;else if(l&&!u)r=!1;return r}var nq=()=>!0;function SD(l,{connectionMode:u,connectionRadius:r,handleId:f,nodeId:n,edgeUpdaterType:t,isTarget:i,domNode:y,nodeLookup:c,lib:_,autoPanOnConnect:A,flowId:F,panBy:j,cancelConnection:N,onConnectStart:U,onConnect:w,onConnectEnd:G,isValidConnection:J=nq,onReconnectEnd:Q,updateConnection:m,getTransform:q,getFromHandle:W,autoPanSpeed:p,dragThreshold:O=1,handleDomNode:Z}){let V=_F(l.target),P=0,H,{x:B,y:C}=Sf(l),E=fq(t,Z),D=y?.getBoundingClientRect(),Y=!1;if(!D||!E)return;let v=rq(n,E,f,c,u);if(!v)return;let K=Sf(l,D),X=!1,I=null,o=!1,fl=null;function yl(){if(!A||!D)return;let[El,M]=sw(K,D,p);j({x:El,y:M}),P=requestAnimationFrame(yl)}let h={...v,nodeId:n,type:E,position:v.position},s=c.get(n),tl={inProgress:!0,isValid:null,from:fi(s,h,Ol.Left,!0),fromHandle:h,fromPosition:h.position,fromNode:s,to:K,toHandle:null,toPosition:Tw[h.position],toNode:null,pointer:K};function Al(){Y=!0,m(tl),U?.(l,{nodeId:n,handleId:f,handleType:E})}if(O===0)Al();function Kl(El){if(!Y){let{x:cl,y:pl}=Sf(El),Hl=cl-B,bl=pl-C;if(!(Hl*Hl+bl*bl>O*O))return;Al()}if(!W()||!h){wl(El);return}let M=q();if(K=Sf(El,D),H=DD(Yy(K,M,!1,[1,1]),r,c,h),!X)yl(),X=!0;let d=tq(El,{handle:H,connectionMode:u,fromNodeId:n,fromHandleId:f,fromType:i?"target":"source",isValidConnection:J,doc:V,lib:_,flowId:F,nodeLookup:c});fl=d.handleDomNode,I=d.connection,o=VD(!!H,d.isValid);let nl=c.get(n),k=nl?fi(nl,h,Ol.Left,!0):tl.from,g={...tl,from:k,isValid:o,to:d.toHandle&&o?n$({x:d.toHandle.x,y:d.toHandle.y},M):K,toHandle:d.toHandle,toPosition:o&&d.toHandle?d.toHandle.position:Tw[h.position],toNode:d.toHandle?c.get(d.toHandle.nodeId):null,pointer:K};m(g),tl=g}function wl(El){if("touches"in El&&El.touches.length>0)return;if(Y){if((H||fl)&&I&&o)w?.(I);let{inProgress:M,...d}=tl,nl={...d,toPosition:tl.toHandle?tl.toPosition:null};if(G?.(El,nl),t)Q?.(El,nl)}N(),cancelAnimationFrame(P),X=!1,o=!1,I=null,fl=null,V.removeEventListener("mousemove",Kl),V.removeEventListener("mouseup",wl),V.removeEventListener("touchmove",Kl),V.removeEventListener("touchend",wl)}V.addEventListener("mousemove",Kl),V.addEventListener("mouseup",wl),V.addEventListener("touchmove",Kl),V.addEventListener("touchend",wl)}function tq(l,{handle:u,connectionMode:r,fromNodeId:f,fromHandleId:n,fromType:t,doc:i,lib:y,flowId:c,isValidConnection:_=nq,nodeLookup:A}){let F=t==="target",j=u?i.querySelector(`.${y}-flow__handle[data-id="${c}-${u?.nodeId}-${u?.id}-${u?.type}"]`):null,{x:N,y:U}=Sf(l),w=i.elementFromPoint(N,U),G=w?.classList.contains(`${y}-flow__handle`)?w:j,J={handleDomNode:G,isValid:!1,connection:null,toHandle:null};if(G){let Q=fq(void 0,G),m=G.getAttribute("data-nodeid"),q=G.getAttribute("data-handleid"),W=G.classList.contains("connectable"),p=G.classList.contains("connectableend");if(!m||!Q)return J;let O={source:F?m:f,sourceHandle:F?q:n,target:F?f:m,targetHandle:F?n:q};J.connection=O;let V=W&&p&&(r===ui.Strict?F&&Q==="source"||!F&&Q==="target":m!==f||q!==n);J.isValid=V&&_(O),J.toHandle=rq(m,Q,q,A,r,!0)}return J}var kA={onPointerDown:SD,isValid:tq};function iq({domNode:l,panZoom:u,getTransform:r,getViewScale:f}){let n=tr(l);function t({translateExtent:y,width:c,height:_,zoomStep:A=1,pannable:F=!0,zoomable:j=!0,inversePan:N=!1}){let U=(m)=>{if(m.sourceEvent.type!=="wheel"||!u)return;let q=r(),W=m.sourceEvent.ctrlKey&&Xy()?10:1,p=-m.sourceEvent.deltaY*(m.sourceEvent.deltaMode===1?0.05:m.sourceEvent.deltaMode?1:0.002)*A,O=q[2]*Math.pow(2,p*W);u.scaleTo(O)},w=[0,0],G=(m)=>{if(m.sourceEvent.type==="mousedown"||m.sourceEvent.type==="touchstart")w=[m.sourceEvent.clientX??m.sourceEvent.touches[0].clientX,m.sourceEvent.clientY??m.sourceEvent.touches[0].clientY]},J=(m)=>{let q=r();if(m.sourceEvent.type!=="mousemove"&&m.sourceEvent.type!=="touchmove"||!u)return;let W=[m.sourceEvent.clientX??m.sourceEvent.touches[0].clientX,m.sourceEvent.clientY??m.sourceEvent.touches[0].clientY],p=[W[0]-w[0],W[1]-w[1]];w=W;let O=f()*Math.max(q[2],Math.log(q[2]))*(N?-1:1),Z={x:q[0]-p[0]*O,y:q[1]-p[1]*O},V=[[0,0],[c,_]];u.setViewportConstrained({x:Z.x,y:Z.y,zoom:q[2]},V,y)},Q=r$().on("start",G).on("zoom",F?J:null).on("zoom.wheel",j?U:null);n.call(Q,{})}function i(){n.on("zoom",null)}return{update:t,destroy:i,pointer:Er}}var IA=(l)=>({x:l.x,y:l.y,zoom:l.k}),g9=({x:l,y:u,zoom:r})=>r0.translate(l,u).scale(r),Oy=(l,u)=>l.target.closest(`.${u}`),yq=(l,u)=>u===2&&Array.isArray(l)&&l.includes(2),YD=(l)=>((l*=2)<=1?l*l*l:(l-=2)*l*l+2)/2,k9=(l,u=0,r=YD,f=()=>{})=>{let n=typeof u==="number"&&u>0;if(!n)f();return n?l.transition().duration(u).ease(r).on("end",f):l},cq=(l)=>{let u=l.ctrlKey&&Xy()?10:1;return-l.deltaY*(l.deltaMode===1?0.05:l.deltaMode?1:0.002)*u};function XD({zoomPanValues:l,noWheelClassName:u,d3Selection:r,d3Zoom:f,panOnScrollMode:n,panOnScrollSpeed:t,zoomOnPinch:i,onPanZoomStart:y,onPanZoom:c,onPanZoomEnd:_}){return(A)=>{if(Oy(A,u)){if(A.ctrlKey)A.preventDefault();return!1}A.preventDefault(),A.stopImmediatePropagation();let F=r.property("__zoom").k||1;if(A.ctrlKey&&i){let G=Er(A),J=cq(A),Q=F*Math.pow(2,J);f.scaleTo(r,Q,G,A);return}let j=A.deltaMode===1?20:1,N=n===it.Vertical?0:A.deltaX*j,U=n===it.Horizontal?0:A.deltaY*j;if(!Xy()&&A.shiftKey&&n!==it.Vertical)N=A.deltaY*j,U=0;f.translateBy(r,-(N/F)*t,-(U/F)*t,{internal:!0});let w=IA(r.property("__zoom"));if(clearTimeout(l.panScrollTimeout),!l.isPanScrolling)l.isPanScrolling=!0,y?.(A,w);else c?.(A,w),l.panScrollTimeout=setTimeout(()=>{_?.(A,w),l.isPanScrolling=!1},150)}}function PD({noWheelClassName:l,preventScrolling:u,d3ZoomHandler:r}){return function(f,n){let t=f.type==="wheel",i=!u&&t&&!f.ctrlKey,y=Oy(f,l);if(f.ctrlKey&&t&&y)f.preventDefault();if(i||y)return null;f.preventDefault(),r.call(this,f,n)}}function CD({zoomPanValues:l,onDraggingChange:u,onPanZoomStart:r}){return(f)=>{if(f.sourceEvent?.internal)return;let n=IA(f.transform);if(l.mouseButton=f.sourceEvent?.button||0,l.isZoomingOrPanning=!0,l.prevViewport=n,f.sourceEvent?.type==="mousedown")u(!0);if(r)r?.(f.sourceEvent,n)}}function hD({zoomPanValues:l,panOnDrag:u,onPaneContextMenu:r,onTransformChange:f,onPanZoom:n}){return(t)=>{if(l.usedRightMouseButton=!!(r&&yq(u,l.mouseButton??0)),!t.sourceEvent?.sync)f([t.transform.x,t.transform.y,t.transform.k]);if(n&&!t.sourceEvent?.internal)n?.(t.sourceEvent,IA(t.transform))}}function MD({zoomPanValues:l,panOnDrag:u,panOnScroll:r,onDraggingChange:f,onPanZoomEnd:n,onPaneContextMenu:t}){return(i)=>{if(i.sourceEvent?.internal)return;if(l.isZoomingOrPanning=!1,t&&yq(u,l.mouseButton??0)&&!l.usedRightMouseButton&&i.sourceEvent)t(i.sourceEvent);if(l.usedRightMouseButton=!1,f(!1),n){let y=IA(i.transform);l.prevViewport=y,clearTimeout(l.timerId),l.timerId=setTimeout(()=>{n?.(i.sourceEvent,y)},r?150:0)}}}function sD({zoomActivationKeyPressed:l,zoomOnScroll:u,zoomOnPinch:r,panOnDrag:f,panOnScroll:n,zoomOnDoubleClick:t,userSelectionActive:i,noWheelClassName:y,noPanClassName:c,lib:_,connectionInProgress:A}){return(F)=>{let j=l||u,N=r&&F.ctrlKey,U=F.type==="wheel";if(F.button===1&&F.type==="mousedown"&&(Oy(F,`${_}-flow__node`)||Oy(F,`${_}-flow__edge`)))return!0;if(!f&&!j&&!n&&!t&&!r)return!1;if(i)return!1;if(A&&!U)return!1;if(Oy(F,y)&&U)return!1;if(Oy(F,c)&&(!U||n&&U&&!l))return!1;if(!r&&F.ctrlKey&&U)return!1;if(!r&&F.type==="touchstart"&&F.touches?.length>1)return F.preventDefault(),!1;if(!j&&!n&&!N&&U)return!1;if(!f&&(F.type==="mousedown"||F.type==="touchstart"))return!1;if(Array.isArray(f)&&!f.includes(F.button)&&F.type==="mousedown")return!1;let w=Array.isArray(f)&&f.includes(F.button)||!F.button||F.button<=1;return(!F.ctrlKey||U)&&w}}function $q({domNode:l,minZoom:u,maxZoom:r,translateExtent:f,viewport:n,onPanZoom:t,onPanZoomStart:i,onPanZoomEnd:y,onDraggingChange:c}){let _={isZoomingOrPanning:!1,usedRightMouseButton:!1,prevViewport:{x:0,y:0,zoom:0},mouseButton:0,timerId:void 0,panScrollTimeout:void 0,isPanScrolling:!1},A=l.getBoundingClientRect(),F=r$().scaleExtent([u,r]).translateExtent(f),j=tr(l).call(F);Q({x:n.x,y:n.y,zoom:Zy(n.zoom,u,r)},[[0,0],[A.width,A.height]],f);let N=j.on("wheel.zoom"),U=j.on("dblclick.zoom");F.wheelDelta(cq);function w(H,B){if(j)return new Promise((C)=>{F?.interpolate(B?.interpolate==="linear"?En:l0).transform(k9(j,B?.duration,B?.ease,()=>C(!0)),H)});return Promise.resolve(!1)}function G({noWheelClassName:H,noPanClassName:B,onPaneContextMenu:C,userSelectionActive:E,panOnScroll:D,panOnDrag:Y,panOnScrollMode:v,panOnScrollSpeed:K,preventScrolling:X,zoomOnPinch:I,zoomOnScroll:o,zoomOnDoubleClick:fl,zoomActivationKeyPressed:yl,lib:h,onTransformChange:s,connectionInProgress:ul,paneClickDistance:tl,selectionOnDrag:Al}){if(E&&!_.isZoomingOrPanning)J();let Kl=D&&!yl&&!E;F.clickDistance(Al?1/0:!Vf(tl)||tl<0?0:tl);let wl=Kl?XD({zoomPanValues:_,noWheelClassName:H,d3Selection:j,d3Zoom:F,panOnScrollMode:v,panOnScrollSpeed:K,zoomOnPinch:I,onPanZoomStart:i,onPanZoom:t,onPanZoomEnd:y}):PD({noWheelClassName:H,preventScrolling:X,d3ZoomHandler:N});if(j.on("wheel.zoom",wl,{passive:!1}),!E){let M=CD({zoomPanValues:_,onDraggingChange:c,onPanZoomStart:i});F.on("start",M);let d=hD({zoomPanValues:_,panOnDrag:Y,onPaneContextMenu:!!C,onPanZoom:t,onTransformChange:s});F.on("zoom",d);let nl=MD({zoomPanValues:_,panOnDrag:Y,panOnScroll:D,onPaneContextMenu:C,onPanZoomEnd:y,onDraggingChange:c});F.on("end",nl)}let El=sD({zoomActivationKeyPressed:yl,panOnDrag:Y,zoomOnScroll:o,panOnScroll:D,zoomOnDoubleClick:fl,zoomOnPinch:I,userSelectionActive:E,noPanClassName:B,noWheelClassName:H,lib:h,connectionInProgress:ul});if(F.filter(El),fl)j.on("dblclick.zoom",U);else j.on("dblclick.zoom",null)}function J(){F.on("zoom",null)}async function Q(H,B,C){let E=g9(H),D=F?.constrain()(E,B,C);if(D)await w(D);return new Promise((Y)=>Y(D))}async function m(H,B){let C=g9(H);return await w(C,B),new Promise((E)=>E(C))}function q(H){if(j){let B=g9(H),C=j.property("__zoom");if(C.k!==H.zoom||C.x!==H.x||C.y!==H.y)F?.transform(j,B,null,{sync:!0})}}function W(){let H=j?u$(j.node()):{x:0,y:0,k:1};return{x:H.x,y:H.y,zoom:H.k}}function p(H,B){if(j)return new Promise((C)=>{F?.interpolate(B?.interpolate==="linear"?En:l0).scaleTo(k9(j,B?.duration,B?.ease,()=>C(!0)),H)});return Promise.resolve(!1)}function O(H,B){if(j)return new Promise((C)=>{F?.interpolate(B?.interpolate==="linear"?En:l0).scaleBy(k9(j,B?.duration,B?.ease,()=>C(!0)),H)});return Promise.resolve(!1)}function Z(H){F?.scaleExtent(H)}function V(H){F?.translateExtent(H)}function P(H){let B=!Vf(H)||H<0?0:H;F?.clickDistance(B)}return{update:G,destroy:J,setViewport:m,setViewportConstrained:Q,getViewport:W,scaleTo:p,scaleBy:O,setScaleExtent:Z,setTranslateExtent:V,syncViewport:q,setClickDistance:P}}var ni;(function(l){l.Line="line",l.Handle="handle"})(ni||(ni={}));function RD({width:l,prevWidth:u,height:r,prevHeight:f,affectsX:n,affectsY:t}){let i=l-u,y=r-f,c=[i>0?1:i<0?-1:0,y>0?1:y<0?-1:0];if(i&&n)c[0]=c[0]*-1;if(y&&t)c[1]=c[1]*-1;return c}function Sw(l){let u=l.includes("right")||l.includes("left"),r=l.includes("bottom")||l.includes("top"),f=l.includes("left"),n=l.includes("top");return{isHorizontal:u,isVertical:r,affectsX:f,affectsY:n}}function et(l,u){return Math.max(0,u-l)}function li(l,u){return Math.max(0,l-u)}function YA(l,u,r){return Math.max(0,u-l,l-r)}function Yw(l,u){return l?!u:u}function xD(l,u,r,f,n,t,i,y){let{affectsX:c,affectsY:_}=u,{isHorizontal:A,isVertical:F}=u,j=A&&F,{xSnapped:N,ySnapped:U}=r,{minWidth:w,maxWidth:G,minHeight:J,maxHeight:Q}=f,{x:m,y:q,width:W,height:p,aspectRatio:O}=l,Z=Math.floor(A?N-l.pointerX:0),V=Math.floor(F?U-l.pointerY:0),P=W+(c?-Z:Z),H=p+(_?-V:V),B=-t[0]*W,C=-t[1]*p,E=YA(P,w,G),D=YA(H,J,Q);if(i){let K=0,X=0;if(c&&Z<0)K=et(m+Z+B,i[0][0]);else if(!c&&Z>0)K=li(m+P+B,i[1][0]);if(_&&V<0)X=et(q+V+C,i[0][1]);else if(!_&&V>0)X=li(q+H+C,i[1][1]);E=Math.max(E,K),D=Math.max(D,X)}if(y){let K=0,X=0;if(c&&Z>0)K=li(m+Z,y[0][0]);else if(!c&&Z<0)K=et(m+P,y[1][0]);if(_&&V>0)X=li(q+V,y[0][1]);else if(!_&&V<0)X=et(q+H,y[1][1]);E=Math.max(E,K),D=Math.max(D,X)}if(n){if(A){let K=YA(P/O,J,Q)*O;if(E=Math.max(E,K),i){let X=0;if(!c&&!_||c&&!_&&j)X=li(q+C+P/O,i[1][1])*O;else X=et(q+C+(c?Z:-Z)/O,i[0][1])*O;E=Math.max(E,X)}if(y){let X=0;if(!c&&!_||c&&!_&&j)X=et(q+P/O,y[1][1])*O;else X=li(q+(c?Z:-Z)/O,y[0][1])*O;E=Math.max(E,X)}}if(F){let K=YA(H*O,w,G)/O;if(D=Math.max(D,K),i){let X=0;if(!c&&!_||_&&!c&&j)X=li(m+H*O+B,i[1][0])/O;else X=et(m+(_?V:-V)*O+B,i[0][0])/O;D=Math.max(D,X)}if(y){let X=0;if(!c&&!_||_&&!c&&j)X=et(m+H*O,y[1][0])/O;else X=li(m+(_?V:-V)*O,y[0][0])/O;D=Math.max(D,X)}}}if(V=V+(V<0?D:-D),Z=Z+(Z<0?E:-E),n)if(j)if(P>H*O)V=(Yw(c,_)?-Z:Z)/O;else Z=(Yw(c,_)?-V:V)*O;else if(A)V=Z/O,_=c;else Z=V*O,c=_;let Y=c?m+Z:m,v=_?q+V:q;return{width:W+(c?-Z:Z),height:p+(_?-V:V),x:t[0]*Z*(!c?1:-1)+Y,y:t[1]*V*(!_?1:-1)+v}}var _q={width:0,height:0,x:0,y:0},bD={..._q,pointerX:0,pointerY:0,aspectRatio:1};function vD(l){return[[0,0],[l.measured.width,l.measured.height]]}function gD(l,u,r){let f=u.position.x+l.position.x,n=u.position.y+l.position.y,t=l.measured.width??0,i=l.measured.height??0,y=r[0]*t,c=r[1]*i;return[[f-y,n-c],[f+t-y,n+i-c]]}function Aq({domNode:l,nodeId:u,getStoreItems:r,onChange:f,onEnd:n}){let t=tr(l),i={controlDirection:Sw("bottom-right"),boundaries:{minWidth:0,minHeight:0,maxWidth:Number.MAX_VALUE,maxHeight:Number.MAX_VALUE},resizeDirection:void 0,keepAspectRatio:!1};function y({controlPosition:_,boundaries:A,keepAspectRatio:F,resizeDirection:j,onResizeStart:N,onResize:U,onResizeEnd:w,shouldResize:G}){let J={..._q},Q={...bD};i={boundaries:A,resizeDirection:j,keepAspectRatio:F,controlDirection:Sw(_)};let m=void 0,q=null,W=[],p=void 0,O=void 0,Z=void 0,V=!1,P=P1().on("start",(H)=>{let{nodeLookup:B,transform:C,snapGrid:E,snapToGrid:D,nodeOrigin:Y,paneDomNode:v}=r();if(m=B.get(u),!m)return;q=v?.getBoundingClientRect()??null;let{xSnapped:K,ySnapped:X}=f$(H.sourceEvent,{transform:C,snapGrid:E,snapToGrid:D,containerBounds:q});if(J={width:m.measured.width??0,height:m.measured.height??0,x:m.position.x??0,y:m.position.y??0},Q={...J,pointerX:K,pointerY:X,aspectRatio:J.width/J.height},p=void 0,m.parentId&&(m.extent==="parent"||m.expandParent))p=B.get(m.parentId),O=p&&m.extent==="parent"?vD(p):void 0;W=[],Z=void 0;for(let[I,o]of B)if(o.parentId===u){if(W.push({id:I,position:{...o.position},extent:o.extent}),o.extent==="parent"||o.expandParent){let fl=gD(o,m,o.origin??Y);if(Z)Z=[[Math.min(fl[0][0],Z[0][0]),Math.min(fl[0][1],Z[0][1])],[Math.max(fl[1][0],Z[1][0]),Math.max(fl[1][1],Z[1][1])]];else Z=fl}}N?.(H,{...J})}).on("drag",(H)=>{let{transform:B,snapGrid:C,snapToGrid:E,nodeOrigin:D}=r(),Y=f$(H.sourceEvent,{transform:B,snapGrid:C,snapToGrid:E,containerBounds:q}),v=[];if(!m)return;let{x:K,y:X,width:I,height:o}=J,fl={},yl=m.origin??D,{width:h,height:s,x:ul,y:tl}=xD(Q,i.controlDirection,Y,i.boundaries,i.keepAspectRatio,yl,O,Z),Al=h!==I,Kl=s!==o,wl=ul!==K&&Al,El=tl!==X&&Kl;if(!wl&&!El&&!Al&&!Kl)return;if(wl||El||yl[0]===1||yl[1]===1){if(fl.x=wl?ul:J.x,fl.y=El?tl:J.y,J.x=fl.x,J.y=fl.y,W.length>0){let k=ul-K,g=tl-X;for(let cl of W)cl.position={x:cl.position.x-k+yl[0]*(h-I),y:cl.position.y-g+yl[1]*(s-o)},v.push(cl)}}if(Al||Kl)fl.width=Al&&(!i.resizeDirection||i.resizeDirection==="horizontal")?h:J.width,fl.height=Kl&&(!i.resizeDirection||i.resizeDirection==="vertical")?s:J.height,J.width=fl.width,J.height=fl.height;if(p&&m.expandParent){let k=yl[0]*(fl.width??0);if(fl.x&&fl.x{if(!V)return;w?.(H,{...J}),n?.({...J}),V=!1});t.call(P)}function c(){t.on(".drag",null)}return{update:y,destroy:c}}var Wq=Ml(Ju(),1),Tq=Ml(wq(),1);var qq=(l)=>{let u,r=new Set,f=(A,F)=>{let j=typeof A==="function"?A(u):A;if(!Object.is(j,u)){let N=u;u=(F!=null?F:typeof j!=="object"||j===null)?j:Object.assign({},u,j),r.forEach((U)=>U(u,N))}},n=()=>u,c={setState:f,getState:n,getInitialState:()=>_,subscribe:(A)=>{return r.add(A),()=>r.delete(A)},destroy:()=>{r.clear()}},_=u=l(f,n,c);return c},Lq=(l)=>l?qq(l):qq;var{useDebugValue:AV}=Wq.default,{useSyncExternalStoreWithSelector:FV}=Tq.default,jV=(l)=>l;function LF(l,u=jV,r){let f=FV(l.subscribe,l.getState,l.getServerState||l.getInitialState,u,r);return AV(f),f}var Gq=(l,u)=>{let r=Lq(l),f=(n,t=u)=>LF(r,n,t);return Object.assign(f,r),f},Kq=(l,u)=>l?Gq(l,u):Gq;function zu(l,u){if(Object.is(l,u))return!0;if(typeof l!=="object"||l===null||typeof u!=="object"||u===null)return!1;if(l instanceof Map&&u instanceof Map){if(l.size!==u.size)return!1;for(let[f,n]of l)if(!Object.is(n,u.get(f)))return!1;return!0}if(l instanceof Set&&u instanceof Set){if(l.size!==u.size)return!1;for(let f of l)if(!u.has(f))return!1;return!0}let r=Object.keys(l);if(r.length!==Object.keys(u).length)return!1;for(let f of r)if(!Object.prototype.hasOwnProperty.call(u,f)||!Object.is(l[f],u[f]))return!1;return!0}var NV=Ml(J2(),1),l8=_l.createContext(null),JV=l8.Provider,Iq=mf.error001();function $u(l,u){let r=_l.useContext(l8);if(r===null)throw Error(Iq);return LF(r,l,u)}function Vu(){let l=_l.useContext(l8);if(l===null)throw Error(Iq);return _l.useMemo(()=>({getState:l.getState,setState:l.setState,subscribe:l.subscribe}),[l])}var Eq={display:"none"},UV={position:"absolute",width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0px, 0px, 0px, 0px)",clipPath:"inset(100%)"},aq="react-flow__node-desc",oq="react-flow__edge-desc",QV="react-flow__aria-live",mV=(l)=>l.ariaLiveMessage,wV=(l)=>l.ariaLabelConfig;function qV({rfId:l}){let u=$u(mV);return il.jsx("div",{id:`${QV}-${l}`,"aria-live":"assertive","aria-atomic":"true",style:UV,children:u})}function LV({rfId:l,disableKeyboardA11y:u}){let r=$u(wV);return il.jsxs(il.Fragment,{children:[il.jsx("div",{id:`${aq}-${l}`,style:Eq,children:u?r["node.a11yDescription.default"]:r["node.a11yDescription.keyboardDisabled"]}),il.jsx("div",{id:`${oq}-${l}`,style:Eq,children:r["edge.a11yDescription.default"]}),!u&&il.jsx(qV,{rfId:l})]})}var u8=_l.forwardRef(({position:l="top-left",children:u,className:r,style:f,...n},t)=>{let i=`${l}`.split("-");return il.jsx("div",{className:bu(["react-flow__panel",r,...i]),style:f,ref:t,...n,children:u})});u8.displayName="Panel";function GV({proOptions:l,position:u="bottom-right"}){if(l?.hideAttribution)return null;return il.jsx(u8,{position:u,className:"react-flow__attribution","data-message":"Please only hide this attribution when you are subscribed to React Flow Pro: https://pro.reactflow.dev",children:il.jsx("a",{href:"https://reactflow.dev",target:"_blank",rel:"noopener noreferrer","aria-label":"React Flow attribution",children:"React Flow"})})}var WV=(l)=>{let u=[],r=[];for(let[,f]of l.nodeLookup)if(f.selected)u.push(f.internals.userNode);for(let[,f]of l.edgeLookup)if(f.selected)r.push(f);return{selectedNodes:u,selectedEdges:r}},oA=(l)=>l.id;function TV(l,u){return zu(l.selectedNodes.map(oA),u.selectedNodes.map(oA))&&zu(l.selectedEdges.map(oA),u.selectedEdges.map(oA))}function KV({onSelectionChange:l}){let u=Vu(),{selectedNodes:r,selectedEdges:f}=$u(WV,TV);return _l.useEffect(()=>{let n={nodes:r,edges:f};l?.(n),u.getState().onSelectionChangeHandlers.forEach((t)=>t(n))},[r,f,l]),null}var EV=(l)=>!!l.onSelectionChangeHandlers;function pV({onSelectionChange:l}){let u=$u(EV);if(l||u)return il.jsx(KV,{onSelectionChange:l});return null}var TF=typeof window<"u"?_l.useLayoutEffect:_l.useEffect,dq=[0,0],zV={x:0,y:0,zoom:1},OV=["nodes","edges","defaultNodes","defaultEdges","onConnect","onConnectStart","onConnectEnd","onClickConnectStart","onClickConnectEnd","nodesDraggable","autoPanOnNodeFocus","nodesConnectable","nodesFocusable","edgesFocusable","edgesReconnectable","elevateNodesOnSelect","elevateEdgesOnSelect","minZoom","maxZoom","nodeExtent","onNodesChange","onEdgesChange","elementsSelectable","connectionMode","snapGrid","snapToGrid","translateExtent","connectOnClick","defaultEdgeOptions","fitView","fitViewOptions","onNodesDelete","onEdgesDelete","onDelete","onNodeDrag","onNodeDragStart","onNodeDragStop","onSelectionDrag","onSelectionDragStart","onSelectionDragStop","onMoveStart","onMove","onMoveEnd","noPanClassName","nodeOrigin","autoPanOnConnect","autoPanOnNodeDrag","onError","connectionRadius","isValidConnection","selectNodesOnDrag","nodeDragThreshold","connectionDragThreshold","onBeforeDelete","debug","autoPanSpeed","ariaLabelConfig","zIndexMode"],pq=[...OV,"rfId"],ZV=(l)=>({setNodes:l.setNodes,setEdges:l.setEdges,setMinZoom:l.setMinZoom,setMaxZoom:l.setMaxZoom,setTranslateExtent:l.setTranslateExtent,setNodeExtent:l.setNodeExtent,reset:l.reset,setDefaultNodesAndEdges:l.setDefaultNodesAndEdges}),zq={translateExtent:By,nodeOrigin:dq,minZoom:0.5,maxZoom:2,elementsSelectable:!0,noPanClassName:"nopan",rfId:"1"};function HV(l){let{setNodes:u,setEdges:r,setMinZoom:f,setMaxZoom:n,setTranslateExtent:t,setNodeExtent:i,reset:y,setDefaultNodesAndEdges:c}=$u(ZV,zu),_=Vu();TF(()=>{return c(l.defaultNodes,l.defaultEdges),()=>{A.current=zq,y()}},[]);let A=_l.useRef(zq);return TF(()=>{for(let F of pq){let j=l[F],N=A.current[F];if(j===N)continue;if(typeof l[F]>"u")continue;if(F==="nodes")u(j);else if(F==="edges")r(j);else if(F==="minZoom")f(j);else if(F==="maxZoom")n(j);else if(F==="translateExtent")t(j);else if(F==="nodeExtent")i(j);else if(F==="ariaLabelConfig")_.setState({ariaLabelConfig:xw(j)});else if(F==="fitView")_.setState({fitViewQueued:j});else if(F==="fitViewOptions")_.setState({fitViewOptions:j});else _.setState({[F]:j})}A.current=l},pq.map((F)=>l[F])),null}function Oq(){if(typeof window>"u"||!window.matchMedia)return null;return window.matchMedia("(prefers-color-scheme: dark)")}function BV(l){let[u,r]=_l.useState(l==="system"?null:l);return _l.useEffect(()=>{if(l!=="system"){r(l);return}let f=Oq(),n=()=>r(f?.matches?"dark":"light");return n(),f?.addEventListener("change",n),()=>{f?.removeEventListener("change",n)}},[l]),u!==null?u:Oq()?.matches?"dark":"light"}var Zq=typeof document<"u"?document:null;function c$(l=null,u={target:Zq,actInsideInputWithModifier:!0}){let[r,f]=_l.useState(!1),n=_l.useRef(!1),t=_l.useRef(new Set([])),[i,y]=_l.useMemo(()=>{if(l!==null){let _=(Array.isArray(l)?l:[l]).filter((F)=>typeof F==="string").map((F)=>F.replace("+",` +`;function _5({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return Vl("section",{className:`panel ${n||""}`},Vl("div",{className:"panel-head"},Vl("div",null,u?Vl("p",{className:"panel-eyebrow"},u):null,Vl(nu,{title:l,loading:t})),r?Vl("div",{className:"panel-actions"},r):null),Vl("div",{className:"panel-body"},f))}function BO({title:l,data:u,onOpen:r,testId:f}){return Vl("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function DO({title:l,text:u}){return Vl("div",{className:"empty-state"},Vl("strong",null,l),Vl("span",null,u))}function _m(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function Am(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function Fm(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function VO(l){return l.filter((r)=>r?.id==="filebrowser"||String(r?.id||"").startsWith("filebrowser-")).sort((r,f)=>{let n=(t)=>t.providerId==="D518"?0:t.providerId==="D601"?1:t.id==="filebrowser"?2:3;return n(r)-n(f)||String(r.id).localeCompare(String(f.id))})}function SO(l){if(l?.providerId==="D518")return"D518";return l?.providerId||l?.name||l?.id||"Unknown"}function YO(l,u,r="/"){let f=r.startsWith("/")?r:`/${r}`;return`${l}/microservices/${encodeURIComponent(u)}/proxy${f}`}function XO(l,u){return`${l}/microservices/${encodeURIComponent(u)}/health`}async function PO(l,u=16000){let r=new AbortController,f=setTimeout(()=>r.abort(),u);try{return await Tl(l,{signal:r.signal,failureFields:[!1]})}finally{clearTimeout(f)}}function jm(l){if(l?.providerId==="main-server")return"host / -> /srv";if(l?.providerId==="D601"||l?.providerId==="D518")return"WSL / + /mnt/c -> /srv";return"provider / -> /srv"}function C3(l){return l?.status==="OK"||l?.ok===!0}function CO({service:l,active:u,health:r,onSelect:f,onRaw:n}){let t=_m(l),i=Am(l),y=Fm(l),c=t.container||{},_=C3(r?.body);return Vl("button",{type:"button",className:`filebrowser-target-card ${u?"active":""}`,"data-testid":`filebrowser-target-card-${l.id}`,onClick:f},Vl("span",{className:`status-badge ${_?"ok":t.providerStatus==="online"?"running":"warn"}`},_?"Health OK":t.providerStatus||"unknown"),Vl("strong",null,l.name||l.id),Vl("span",null,jm(l)),Vl("code",null,`${i.nodeBindHost||"--"}:${i.nodePort||"--"}`),Vl("small",null,c.name?`${c.name} / ${c.state||"--"}`:`${y.composeService||"--"}`),Vl("span",{className:"filebrowser-card-raw",onClick:(A)=>{A.stopPropagation(),n(`${l.name} service`,l)}},"JSON"))}function Nm(l){try{return l?.contentDocument||l?.contentWindow?.document||null}catch{return null}}function F5(l){let u=Nm(l);if(u===null||u.head===null)return!1;let r=u.getElementById("unidesk-filebrowser-compact-style");if(r===null)r=u.createElement("style"),r.id="unidesk-filebrowser-compact-style",u.head.appendChild(r);if(r.textContent!==A5)r.textContent=A5;return!0}function hO(l,u){let r=URL.createObjectURL(l),f=document.createElement("a");f.href=r,f.download=u,document.body.appendChild(f),f.click(),f.remove(),setTimeout(()=>URL.revokeObjectURL(r),2000)}function MO(l,u){let r=Nm(l);if(r===null||r.documentElement===null)throw Error("无法访问 File Browser iframe 文档");F5(l);let f=Math.max(640,Math.ceil(l.clientWidth||r.documentElement.clientWidth||1280)),n=Math.max(480,Math.ceil(l.clientHeight||r.documentElement.clientHeight||720)),t=r.documentElement.cloneNode(!0);t.querySelectorAll("script, style, link[rel='stylesheet'], link[rel='preload'], link[rel='icon']").forEach((A)=>A.remove()),t.querySelectorAll("img").forEach((A)=>{A.removeAttribute("src"),A.removeAttribute("srcset")});let i=t.querySelector("head");if(i===null)i=r.createElement("head"),t.insertBefore(i,t.firstChild);let y=r.createElement("style");y.textContent=`${A5} +html,body{width:${f}px!important;min-height:${n}px!important;overflow:hidden!important;}`,i.appendChild(y);let c=new XMLSerializer().serializeToString(t),_=`${c}`;hO(new Blob([_],{type:"image/svg+xml;charset=utf-8"}),u.replace(/\.png$/i,".svg"))}function Jm({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=VO(Array.isArray(l)?l:[]),n=new URLSearchParams(window.location.search).get("target")||"",t=n==="filebrowser-d518"?"filebrowser":n,i=f.some((p)=>p.id===t)?t:f[0]?.id||"",[y,c]=$5(i),[_,A]=$5({loading:!1,refreshedAt:null,health:{},error:""}),[F,j]=$5({exporting:!1,message:"",error:""}),N=HO(null),U=f.find((p)=>p.id===y)||f[0]||null,w=_m(U),G=Am(U),J=Fm(U),Q=U?_.health[U.id]:null,m=U?YO(r,U.id,"/"):"about:blank";c5(()=>{if(f.length===0)return;if(!y||!f.some((p)=>p.id===y))c(f[0].id)},[f.map((p)=>p.id).join(",")]),c5(()=>{let p=0,O=setInterval(()=>{if(p+=1,F5(N.current)||p>=24)clearInterval(O)},500);return()=>clearInterval(O)},[m]),c5(()=>{if(f.length===0)return;let p=!1;async function O(){A((P)=>({...P,loading:!0,error:""}));let V=await Promise.all(f.map(async(P)=>{try{let H=await PO(XO(r,P.id));return[P.id,{ok:!0,body:H}]}catch(H){return[P.id,{ok:!1,error:zl(H,"File Browser health failed")}]}}));if(p)return;A({loading:!1,refreshedAt:new Date().toISOString(),health:Object.fromEntries(V),error:""})}O();let Z=setInterval(O,30000);return()=>{p=!0,clearInterval(Z)}},[f.map((p)=>`${p.id}:${p.runtime?.providerStatus||""}`).join(","),r]);function q(p){c(p);let O=new URL(window.location.href);O.searchParams.set("target",p),window.history.replaceState({},"",`${O.pathname}${O.search}`)}async function W(){if(F.exporting)return;j({exporting:!0,message:"",error:""});try{let p=new Date().toISOString().replace(/[-:.TZ]/g,"").slice(0,14);await MO(N.current,`unidesk-filebrowser-${U?.id||"target"}-${p}.png`),j({exporting:!1,message:"截图已导出",error:""})}catch(p){j({exporting:!1,message:"",error:zl(p,"截图导出失败")})}}if(f.length===0)return Vl(DO,{title:"File Browser 未登记",text:"请在 config.json 的 microservices 中登记 id=filebrowser 或 filebrowser-* 用户服务"});return Vl("div",{className:"filebrowser-page","data-testid":"filebrowser-page"},_.error?Vl(el,{error:_.error,wide:!0}):null,Vl(_5,{title:"文件管理器",eyebrow:"File Browser / Host Files",loading:_.loading,actions:Vl("div",{className:"panel-actions"},U?Vl("button",{type:"button",className:"ghost-btn",onClick:W,disabled:F.exporting,"data-testid":"filebrowser-export-screenshot"},F.exporting?"导出中...":"导出截图"):null,U?Vl("a",{className:"ghost-btn",href:m,target:"_blank",rel:"noreferrer"},"新窗口打开"):null,U?Vl(BO,{title:"File Browser 当前目标",data:{service:U,health:Q},onOpen:u,testId:"raw-filebrowser-active"}):null)},Vl("div",{className:"filebrowser-hero"},Vl("div",null,Vl("span",{className:`status-badge ${C3(Q?.body)?"ok":"warn"}`},C3(Q?.body)?"Health OK":"Health Pending"),Vl("h3",null,U?.name||"File Browser"),Vl("p",{className:"muted paragraph"},U?.description||"通过 UniDesk 登录态代理访问,不开放 File Browser 公网端口。"),F.error?Vl("p",{className:"filebrowser-shot-error"},F.error):null,F.message?Vl("p",{className:"filebrowser-shot-ok"},F.message):null),Vl("div",{className:"microservice-ref-card"},Vl("span",null,"Provider"),Vl("strong",null,U?.providerId||"--"),Vl("code",null,w.providerName||U?.providerId||"--")),Vl("div",{className:"microservice-ref-card"},Vl("span",null,"Private Backend"),Vl("strong",null,`${G.nodeBindHost||"--"}:${G.nodePort||"--"}`),Vl("code",null,G.nodeBaseUrl||"--")),Vl("div",{className:"microservice-ref-card"},Vl("span",null,"Image"),Vl("strong",null,J.dockerfile||"filebrowser/filebrowser:v2.63.3"),Vl("code",null,J.commitId||"--")),Vl("div",{className:"microservice-ref-card"},Vl("span",null,"Mount"),Vl("strong",null,jm(U)),Vl("code",null,U?.providerId==="main-server"?"/root, /var, /home":"/home, /mnt/c, /mnt/d")))),Vl(_5,{title:"浏览目标",eyebrow:`${f.length} host targets`,loading:_.loading},Vl("div",{className:"filebrowser-target-grid"},f.map((p)=>Vl(CO,{key:p.id,service:p,active:p.id===U?.id,health:_.health[p.id],onSelect:()=>q(p.id),onRaw:u})))),Vl(_5,{title:`${SO(U)} 文件视图`,eyebrow:Q?.body?`Health ${C3(Q.body)?"OK":"UNKNOWN"} / ${_.refreshedAt?iu(_.refreshedAt):"--"}`:"Embedded WebUI",className:"filebrowser-frame-panel"},Vl("div",{className:"filebrowser-frame-shell"},Vl("div",{className:"filebrowser-frame-toolbar"},Vl("span",null,"BaseURL"),Vl("code",null,`/api/microservices/${U?.id||"filebrowser"}/proxy`),Vl("span",null,"Root"),Vl("code",null,"/srv"),Vl("span",{className:"filebrowser-compact-note"},"Compact layout injected")),Vl("iframe",{ref:N,key:m,title:`${U?.name||"File Browser"} WebUI`,src:m,className:"filebrowser-frame","data-testid":"filebrowser-frame",onLoad:(p)=>F5(p.currentTarget),sandbox:"allow-downloads allow-forms allow-modals allow-same-origin allow-scripts"}))))}var R3=Ml(Ju(),1);var Ul=R3.default.createElement,{useEffect:sO}=R3.default,RO=R3.default.useState;function h3({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return Ul("span",{className:`status-badge ${r}`},u||l||"unknown")}function kt({label:l,value:u,hint:r,tone:f}){return Ul("article",{className:`metric-card ${f||""}`},Ul("div",{className:"metric-label"},l),Ul("div",{className:"metric-value"},u),Ul("div",{className:"metric-hint"},r))}function M3({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return Ul("section",{className:`panel ${n||""}`},Ul("div",{className:"panel-head"},Ul("div",null,u?Ul("p",{className:"panel-eyebrow"},u):null,Ul(nu,{title:l,loading:t})),r?Ul("div",{className:"panel-actions"},r):null),Ul("div",{className:"panel-body"},f))}function s3({title:l,data:u,onOpen:r,testId:f}){return Ul("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function j5({title:l,text:u}){return Ul("div",{className:"empty-state"},Ul("strong",null,l),Ul("span",null,u))}function xO(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function bO(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function vO(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function gi(l,u){let r=l&&typeof l==="object"?l[u]:void 0;return Number.isFinite(Number(r))?String(r):"--"}function gO(l){return(Array.isArray(l?.jobs)?l.jobs:[]).slice(0,40)}function kO(l){return(Array.isArray(l?.drafts)?l.drafts:[]).slice(0,12)}function Um({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((U)=>U.id==="findjob")||null,[n,t]=RO({loading:!1,error:"",health:null,summary:null,jobs:null,drafts:null,refreshedAt:null});async function i(){if(!f)return;t((U)=>({...U,loading:!0,error:""}));try{let[U,w,G,J]=await Promise.all([Tl(`${r}/microservices/findjob/health`),Tl(`${r}/microservices/findjob/proxy/api/summary`),Tl(`${r}/microservices/findjob/proxy/api/jobs?__unideskArrayLimit=jobs:40`),Tl(`${r}/microservices/findjob/proxy/api/drafts`)]);t({loading:!1,error:"",health:U,summary:w,jobs:G,drafts:J,refreshedAt:new Date})}catch(U){t((w)=>({...w,loading:!1,error:zl(U,"FindJob 加载失败")}))}}if(sO(()=>{i()},[f?.id,f?.runtime?.providerStatus]),!f)return Ul(j5,{title:"FindJob 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=findjob"});let y=xO(f),c=vO(f),_=bO(f),A=n.summary||{},F=gO(n.jobs),j=kO(n.drafts),N=n.jobs?._unidesk?.arrayLimits?.jobs;return Ul("div",{className:"findjob-page","data-testid":"findjob-page"},Ul(M3,{title:"FindJob 工作台",eyebrow:"D601 用户服务",loading:n.loading,actions:Ul("div",{className:"panel-actions"},Ul("button",{type:"button",className:"ghost-btn",onClick:i,disabled:n.loading,"data-testid":"findjob-refresh-button"},n.loading?"刷新中":"刷新"),Ul(s3,{title:"FindJob 用户服务",data:f,onOpen:u,testId:"raw-findjob-service"}))},Ul("div",{className:"findjob-hero"},Ul("div",null,Ul("div",{className:"node-version-line"},Ul(h3,{status:y.providerStatus==="online"?"online":"warn"},y.providerStatus||"unknown"),Ul("span",null,f.providerId),Ul("span",null,_.public?"公网暴露":"仅 UniDesk frontend 代理访问")),Ul("p",{className:"muted paragraph"},f.description)),Ul("div",{className:"microservice-ref-card"},Ul("span",null,"Repo"),Ul("strong",null,c.url||"--"),Ul("code",null,c.commitId||"--")),Ul("div",{className:"microservice-ref-card"},Ul("span",null,"D601 Docker"),Ul("strong",null,`${_.nodeBindHost||"--"}:${_.nodePort||"--"}`),Ul("code",null,`${c.composeFile||"--"} / ${c.composeService||"--"}`))),Ul(el,{error:n.error,wide:!0})),Ul("div",{className:"findjob-grid"},Ul(M3,{title:"岗位指标",eyebrow:n.refreshedAt?`Updated ${iu(n.refreshedAt)}`:"Summary",loading:n.loading},Ul("div",{className:"metric-grid"},Ul(kt,{label:"岗位总量",value:gi(A,"totalJobs"),hint:"tracked jobs",tone:"ok"}),Ul(kt,{label:"原始岗位",value:gi(A,"rawJobs"),hint:"raw queue"}),Ul(kt,{label:"已验证",value:gi(A,"verifiedJobs"),hint:"verified set"}),Ul(kt,{label:"优先处理",value:gi(A,"prioritizedJobs"),hint:"prioritized"}),Ul(kt,{label:"过期",value:gi(A,"staleJobs"),hint:"stale jobs",tone:"warn"}),Ul(kt,{label:"无效",value:gi(A,"invalidJobs"),hint:"invalid jobs",tone:"warn"}),Ul(kt,{label:"上海",value:gi(A,"shanghaiJobs"),hint:"city filter"}),Ul(kt,{label:"Health",value:n.health?.ok?"OK":"--",hint:"D601 /api/health"})),Ul("div",{className:"panel-actions inline-actions"},Ul(s3,{title:"FindJob Summary",data:A,onOpen:u,testId:"raw-findjob-summary"}))),Ul(M3,{title:"近期岗位",eyebrow:N?`${N.returnedLength}/${N.originalLength} Preview`:`${F.length} Preview`,loading:n.loading},F.length===0?Ul(j5,{title:"暂无岗位预览",text:"等待 D601 findjob backend 返回 /api/jobs"}):Ul("div",{className:"table-wrap findjob-job-table"},Ul("table",null,Ul("thead",null,Ul("tr",null,Ul("th",null,"优先级"),Ul("th",null,"状态"),Ul("th",null,"单位"),Ul("th",null,"职位"),Ul("th",null,"城市"),Ul("th",null,"阶段"),Ul("th",null,"截止"),Ul("th",null,"证据"))),Ul("tbody",null,F.map((U)=>Ul("tr",{key:U.id},Ul("td",null,Ul(h3,{status:String(U.priority||"").toLowerCase()||"unknown"},U.priority||"--")),Ul("td",null,Ul(h3,{status:String(U.status||"").toLowerCase()||"unknown"},U.status||"--")),Ul("td",null,U.organization_name||"--",Ul("code",null,U.id||"--")),Ul("td",null,U.display_title||U.title||"--"),Ul("td",null,U.display_city||U.city||"--"),Ul("td",null,U.workflow_stage||"--"),Ul("td",null,U.deadline||"--"),Ul("td",null,U.evidence_url?Ul("a",{href:U.evidence_url,target:"_blank",rel:"noreferrer"},"打开"):Ul("span",{className:"muted"},"无"))))))),Ul("div",{className:"panel-actions inline-actions"},Ul(s3,{title:"FindJob Jobs Preview",data:n.jobs,onOpen:u,testId:"raw-findjob-jobs"}))),Ul(M3,{title:"草稿与报告",eyebrow:`${j.length} Drafts`,loading:n.loading},j.length===0?Ul(j5,{title:"暂无草稿",text:"D601 findjob backend 未返回 drafts"}):Ul("div",{className:"draft-list"},j.map((U)=>Ul("article",{key:U.id,className:"draft-card"},Ul("div",{className:"node-card-head"},Ul("strong",null,U.id),Ul(h3,{status:U.status},U.status||"--")),Ul("div",{className:"docker-meta compact"},Ul("span",null,U.workflow_stage||"--"),Ul("span",null,`jobs ${U.counts?.jobs??0}`),Ul("span",null,`reports ${U.counts?.reports??0}`)),Ul("span",null,U.latestReportPath||"暂无报告"),Ul("code",null,Ll(U.updated_at||U.updatedAt))))),Ul("div",{className:"panel-actions inline-actions"},Ul(s3,{title:"FindJob Drafts",data:n.drafts,onOpen:u,testId:"raw-findjob-drafts"})))))}var E1=Ml(Ju(),1);var x=E1.default.createElement,{useEffect:IO}=E1.default,N5=E1.default.useState;function W1(l){let u=Number(l);return Number.isFinite(u)?`${Math.max(0,Math.min(100,u)).toFixed(1)}%`:"--"}function U5(l){if(l===null||l===void 0||l==="")return"--";let u=Number(l);if(!Number.isFinite(u))return"--";if(u<60)return`${Math.max(0,Math.round(u))}s`;if(u<3600)return`${Math.floor(u/60)}m ${Math.round(u%60)}s`;return`${Math.floor(u/3600)}h ${Math.floor(u%3600/60)}m`}function Q5(l,u=2){let r=Number(l);if(!Number.isFinite(r))return l===!1?"false":l===!0?"true":"--";let f=Math.abs(r);if(Number.isInteger(r)||f>=1000)return r.toLocaleString("zh-CN",{maximumFractionDigits:0});if(f>=1)return r.toLocaleString("zh-CN",{maximumFractionDigits:u});return r.toLocaleString("zh-CN",{maximumFractionDigits:Math.max(u,6)})}function K1(l){if(l===null||l===void 0||l==="")return"--";if(typeof l==="boolean")return l?"true":"false";if(typeof l==="number")return Q5(l,4);if(Array.isArray(l))return l.map((u)=>K1(u)).join(" x ");if(typeof l==="object")return"已上报";return String(l)}function x3(l){let u=Number(l);if(!Number.isFinite(u)||u<=0)return"--";let r=u>=100?0:u>=10?1:2;return`${u.toLocaleString("zh-CN",{maximumFractionDigits:r})} epoch/h`}function b3(l){return l.replace(/[^a-zA-Z0-9_-]/g,"-")}function or(l){return l&&typeof l==="object"&&!Array.isArray(l)?l:{}}function T1({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return x("span",{className:`status-badge ${r}`},u||l||"unknown")}function It({label:l,value:u,hint:r,tone:f}){return x("article",{className:`metric-card ${f||""}`},x("div",{className:"metric-label"},l),x("div",{className:"metric-value"},u),x("div",{className:"metric-hint"},r))}function J5({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return x("section",{className:`panel ${n||""}`},x("div",{className:"panel-head"},x("div",null,u?x("p",{className:"panel-eyebrow"},u):null,x(nu,{title:l,loading:t})),r?x("div",{className:"panel-actions"},r):null),x("div",{className:"panel-body"},f))}function my({title:l,data:u,onOpen:r,testId:f}){return x("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:(n)=>{n?.stopPropagation?.(),r(l,u)}},"查看原始JSON")}function lt({title:l,text:u}){return x("div",{className:"empty-state"},x("strong",null,l),x("span",null,u))}function aO(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function oO(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function dO(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function eO(l){return l?.counts&&typeof l.counts==="object"&&!Array.isArray(l.counts)?l.counts:{}}function lZ(l){return Array.isArray(l?.jobs)?l.jobs.slice(0,240):[]}function uZ(l){return Array.isArray(l?.projects)?l.projects.slice(0,1000):[]}function v3(l){return Array.isArray(l?.projects)?l.projects:[]}function rZ(l,u){if(Array.isArray(u?.gpu))return u.gpu;if(Array.isArray(l?.gpu))return l.gpu;return[]}function Qf(l,u){return`${l}/microservices/met-nonlinear/proxy${u}`}function Qm(l){return l.startedAt&&l.finishedAt?U5((Date.parse(l.finishedAt)-Date.parse(l.startedAt))/1000):"--"}function fZ(l){let u=l.progress||{};if(u.etaSeconds!==null&&u.etaSeconds!==void 0&&u.etaSeconds!==""){let i=Number(u.etaSeconds);if(Number.isFinite(i))return Math.max(0,i)}let r=Number(u.currentEpoch),f=Number(u.epochTarget??l.epochTarget),n=Date.parse(l.startedAt||"");if(!Number.isFinite(r)||r<=0||!Number.isFinite(f)||f<=r||!Number.isFinite(n))return null;let t=Math.max(0,(Date.now()-n)/1000);if(t<=0)return null;return Math.max(0,t/r*(f-r))}function mm(l){let u=l.progress||{},r=Number(u.epochPerHour);if(Number.isFinite(r)&&r>0)return r;let f=Date.parse(l.startedAt||""),n=["succeeded","failed","canceled"].includes(l.status)?Date.parse(l.finishedAt||""):Date.now();if(!Number.isFinite(f)||!Number.isFinite(n)||n<=f)return null;let t=Number(u.currentEpoch??l.epochTarget);if(!Number.isFinite(t)||t<=0)return null;return t/((n-f)/3600000)}function wm(l){if(l==="staged")return"待启动";if(l==="queued")return"排队中";if(l==="running")return"训练中";if(l==="succeeded")return"已完成";if(l==="failed")return"失败";if(l==="canceled")return"已取消";return l||"unknown"}function qm(l,u,r){return{name:l,path:u,depth:r,count:0,children:[],project:null}}function nZ(l){let u=qm("","",-1);for(let f of l){let t=String(f?.projectPath||"").replace(/\\/g,"/").split("/").filter(Boolean);if(t.length===0)continue;let i=u,y=[];for(let[c,_]of t.entries()){y.push(_);let A=y.join("/"),F=i.children.find((j)=>j.path===A);if(!F)F=qm(_,A,c),i.children.push(F);if(c===t.length-1)F.project=f;i=F}}let r=(f)=>{let n=f.children.reduce((t,i)=>t+r(i),0);return f.count=(f.project?1:0)+n,f.children.sort((t,i)=>{if(Boolean(t.project)!==Boolean(i.project))return t.project?1:-1;return t.name.localeCompare(i.name,"zh-CN",{numeric:!0,sensitivity:"base"})}),f.count};return r(u),u}function tZ(l){let u=or(l.data);return or(u.project).projectPath?or(u.project):u}function iZ(l){return or(or(l.data).job)}function Lm({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((M)=>M.id==="met-nonlinear")||null,[n,t]=N5({loading:!1,actionBusy:!1,error:"",health:null,summary:null,queue:null,projects:null,history:null,images:null,refreshedAt:null}),[i,y]=N5({loading:!1,error:"",kind:"",key:"",title:"",data:null}),[c,_]=N5(()=>({activeTab:"projects",selectedProjects:{},expandedProjectDirs:{},sourceProject:"",forkCount:1,forkEpochs:200,forkPrefix:`ui_fork_${Date.now()}`,maxConcurrency:3,targetGpuName:"2080 Ti",actionMessage:""}));function A(M){_((d)=>({...d,...M}))}async function F(M=c.activeTab){if(!f)return;t((d)=>({...d,loading:!0,error:""}));try{let d=[["health",Tl(`${r}/microservices/met-nonlinear/health`)],["summary",Tl(Qf(r,"/api/summary"))]];if(M==="projects")d.push(["projectsRoot",Tl(Qf(r,"/api/projects?root=projects&limit=500"))]),d.push(["exProjectsRoot",Tl(Qf(r,"/api/projects?root=ex_projects&limit=500"))]);if(M==="current"||M==="completed"||M==="failed")d.push(["queue",Tl(Qf(r,"/api/queue"))]);if(M==="completed"||M==="failed")d.push(["history",Tl(Qf(r,"/api/history"))]);if(M==="gpu")d.push(["images",Tl(Qf(r,"/api/images"))]);let nl=Object.fromEntries(await Promise.all(d.map(async([g,cl])=>[g,await cl]))),k={loading:!1,actionBusy:!1,error:"",health:nl.health,summary:nl.summary,refreshedAt:new Date};if(nl.projectsRoot||nl.exProjectsRoot){let{projectsRoot:g,exProjectsRoot:cl}=nl;k.projects={ok:g?.ok!==!1&&cl?.ok!==!1,roots:[{root:"projects",count:v3(g).length},{root:"ex_projects",count:v3(cl).length}],projects:[...v3(g),...v3(cl)]}}if(nl.queue)k.queue=nl.queue;if(nl.history)k.history=nl.history;if(nl.images)k.images=nl.images;t((g)=>({...g,...k}))}catch(d){t((nl)=>({...nl,loading:!1,actionBusy:!1,error:zl(d,"MET Nonlinear 加载失败")}))}}async function j(M,d){t((nl)=>({...nl,actionBusy:!0,error:""})),A({actionMessage:`${M}...`});try{let nl=await d();A({actionMessage:nl||`${M}完成`}),await F()}catch(nl){t((k)=>({...k,actionBusy:!1,error:zl(nl,`${M}失败`)}))}}async function N(){await j("保存并发设置",async()=>{await Tl(Qf(r,"/api/queue/settings"),{method:"PUT",body:JSON.stringify({maxConcurrency:Number(c.maxConcurrency),targetGpuName:c.targetGpuName})})})}function U(){return Object.entries(c.selectedProjects).filter(([,M])=>M).map(([M])=>M)}async function w(){let M=U();if(M.length===0)throw Error("请先选择至少一个 project");await j("加入待启动队列",async()=>{await Tl(Qf(r,"/api/queue"),{method:"POST",body:JSON.stringify({projectPaths:M,maxConcurrency:Number(c.maxConcurrency),targetGpuName:c.targetGpuName,start:!1})}),A({activeTab:"current",selectedProjects:{}})})}async function G(){let M=c.sourceProject||C[0]?.projectPath;if(!M)throw Error("请先选择源 project");await j("Fork Project",async()=>{let d=await Tl(Qf(r,"/api/projects/fork"),{method:"POST",body:JSON.stringify({sourceProject:M,count:Number(c.forkCount),epochs:Number(c.forkEpochs),prefix:c.forkPrefix})}),nl=Array.isArray(d.projectPaths)?d.projectPaths:[],k=nl.reduce((g,cl)=>{return g[cl]=!0,g},{...c.selectedProjects});return A({selectedProjects:k}),`已 fork ${nl.length} 个 project,并已自动勾选;请确认后点击加入待启动队列。`})}async function J(){await j("启动队列",async()=>{await Tl(Qf(r,"/api/queue/start"),{method:"POST",body:JSON.stringify({maxConcurrency:Number(c.maxConcurrency),targetGpuName:c.targetGpuName})}),A({activeTab:"current"})})}async function Q(M){await j("取消任务",async()=>{await Tl(Qf(r,`/api/jobs/${encodeURIComponent(M.id)}/cancel`),{method:"POST",body:JSON.stringify({})})})}async function m(M){let d=String(M?.projectPath||"");if(!d)return;y({loading:!0,error:"",kind:"project",key:d,title:d,data:null});try{let nl=await Tl(Qf(r,`/api/projects/config?path=${encodeURIComponent(d)}`));y({loading:!1,error:"",kind:"project",key:d,title:d,data:nl})}catch(nl){y({loading:!1,error:zl(nl,"Project 详情加载失败"),kind:"project",key:d,title:d,data:null})}}async function q(M){let d=String(M?.id||"");if(!d)return;y({loading:!0,error:"",kind:"job",key:d,title:M.projectPath||d,data:null});try{let nl=await Tl(Qf(r,`/api/jobs/${encodeURIComponent(d)}`));y({loading:!1,error:"",kind:"job",key:d,title:nl?.job?.projectPath||M.projectPath||d,data:nl})}catch(nl){y({loading:!1,error:zl(nl,"Job 详情加载失败"),kind:"job",key:d,title:M.projectPath||d,data:null})}}if(IO(()=>{F(c.activeTab)},[f?.id,f?.runtime?.providerStatus,c.activeTab]),!f)return x(lt,{title:"MET Nonlinear 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=met-nonlinear"});let W=aO(f),p=dO(f),O=oO(f),Z=eO(n.queue?.queue||n.summary?.queue),V=rZ(n.health,n.queue),P=n.health?.targetGpu||n.summary?.targetGpu||V.find((M)=>String(M.name||"").includes("2080")),H=n.images?.mlImage||n.health?.image||{},B=lZ(n.queue),C=uZ(n.projects),E=nZ(C),D=c.sourceProject||C[0]?.projectPath||"",Y=B.filter((M)=>["staged","queued","running"].includes(M.status)),v=B.filter((M)=>M.status==="succeeded"),K=B.filter((M)=>["failed","canceled"].includes(M.status)),X=Array.isArray(n.history?.jobs)?n.history.jobs.slice(0,120):[],I=[{id:"projects",label:"项目库",count:C.length},{id:"current",label:"当前队列",count:Y.length||Number(Z.staged||0)+Number(Z.queued||0)+Number(Z.running||0)},{id:"completed",label:"已完成",count:v.length||Number(Z.succeeded||0)},{id:"failed",label:"失败诊断",count:K.length||Number(Z.failed||0)+Number(Z.canceled||0)},{id:"gpu",label:"GPU/镜像",count:V.length}];function o(M,d){if(M.length===0)return x(lt,{title:d==="current"?"当前队列为空":"暂无记录",text:d==="current"?"从项目库选择或 fork project 后先加入待启动队列,再启动队列。":"终态任务会显示耗时、exit code 和失败诊断。"});return x("div",{className:"table-wrap met-job-table"},x("table",null,x("thead",null,x("tr",null,x("th",null,"状态"),x("th",null,"Project"),x("th",null,"Epoch"),x("th",null,"速度"),x("th",null,"ETA/耗时"),x("th",null,"GPU"),x("th",null,"Exit"),x("th",null,"更新时间"),x("th",null,"操作"))),x("tbody",null,M.map((nl)=>{let k=nl.progress||{},g=["staged","queued","running"].includes(nl.status),cl=i.kind==="job"&&i.key===nl.id;return x("tr",{key:nl.id,className:`met-click-row ${cl?"active":""}`,onClick:()=>q(nl),"data-testid":`met-job-row-${b3(nl.id)}`},x("td",null,x(T1,{status:nl.status},wm(nl.status))),x("td",null,x("button",{type:"button",className:"met-inline-link",onClick:(pl)=>{pl.stopPropagation(),q(nl)}},nl.projectPath),x("code",null,nl.id)),x("td",null,x("span",null,`${k.currentEpoch??"--"} / ${k.epochTarget??nl.epochTarget??"--"}`),x("div",{className:"met-progress"},x("span",{style:{width:W1(k.progressPercent)}}))),x("td",null,x("strong",null,x3(mm(nl)))),x("td",null,nl.status==="succeeded"||nl.status==="failed"||nl.status==="canceled"?Qm(nl):nl.status==="running"?`ETA ${U5(fZ(nl))}`:"--"),x("td",null,nl.gpuName||"--"),x("td",null,nl.exitCode??"--"),x("td",null,Ll(nl.updatedAt)),x("td",null,g?x("button",{type:"button",className:"ghost-btn mini",onClick:(pl)=>{pl.stopPropagation(),Q(nl)},disabled:n.actionBusy},"取消"):null,x(my,{title:`MET Job ${nl.id}`,data:nl,onOpen:u,testId:`raw-met-job-${nl.id}`})))}))))}function fl(){return x("div",{className:"met-queue-summary","data-testid":"met-current-summary"},x(T1,{status:"staged"},`待启动 ${Z.staged??0}`),x(T1,{status:"queued"},`排队中 ${Z.queued??0}`),x(T1,{status:"running"},`训练中 ${Z.running??0}`),x("span",null,`最大并发 ${n.summary?.queue?.maxConcurrency??n.queue?.queue?.maxConcurrency??c.maxConcurrency}`),x("span",null,`目标 GPU ${n.summary?.queue?.targetGpuName??n.queue?.queue?.targetGpuName??c.targetGpuName}`))}function yl(M,d){let nl=c.expandedProjectDirs[M];return nl===void 0?d<2:Boolean(nl)}function h(M,d){let nl=yl(M,d);A({expandedProjectDirs:{...c.expandedProjectDirs,[M]:!nl}})}function s(M){let d=8+Math.max(0,M.depth)*16;if(Boolean(M.project)){let g=M.project,cl=Boolean(c.selectedProjects[g.projectPath]),pl=i.kind==="project"&&i.key===g.projectPath;return x("div",{key:M.path,className:`met-tree-row project ${cl?"selected":""} ${pl?"active":""}`,style:{paddingLeft:d},onClick:()=>m(g),"data-testid":`met-project-node-${b3(g.projectPath)}`},x("div",{className:"met-tree-name"},x("input",{type:"checkbox",checked:cl,onClick:(Hl)=>Hl.stopPropagation(),onChange:(Hl)=>A({selectedProjects:{...c.selectedProjects,[g.projectPath]:Hl.target.checked}}),"data-testid":`met-project-checkbox-${b3(g.projectPath)}`}),x("button",{type:"button",className:"met-inline-link project-path",onClick:(Hl)=>{Hl.stopPropagation(),m(g)}},M.name)),x("span",null,g.useModel||"--"),x("span",null,g.epochTrain??"--"),x("span",null,W1(g.progress?.progressPercent)),x("span",null,x3(g.progress?.epochPerHour)))}let k=yl(M.path,M.depth);return x(E1.default.Fragment,{key:M.path},x("div",{className:"met-tree-row folder",style:{paddingLeft:d},"data-testid":`met-project-folder-${b3(M.path)}`},x("button",{type:"button",className:"met-tree-toggle",onClick:()=>h(M.path,M.depth),"aria-label":k?`折叠 ${M.path}`:`展开 ${M.path}`},k?"-":"+"),x("strong",null,M.name),x("span",{className:"met-tree-count"},`${M.count} projects`)),k?M.children.map((g)=>s(g)):null)}function ul(M){return x("div",{className:"met-detail-kv"},M.map((d)=>x("div",{key:d.label,className:"met-detail-kv-item"},x("span",null,d.label),x("strong",null,K1(d.value)),d.hint?x("small",null,d.hint):null)))}function tl(M,d){return x("div",{className:"met-detail-section"},x("h3",null,M),ul(d))}function Al(M){if(!Array.isArray(M)||M.length===0)return x(lt,{title:"模型层未上报",text:"等待 data/model_info.json 或 compute_analysis.json 生成。"});return x("div",{className:"table-wrap met-layer-table"},x("table",null,x("thead",null,x("tr",null,x("th",null,"Layer"),x("th",null,"Type"),x("th",null,"Params"),x("th",null,"Trainable"),x("th",null,"Compute"))),x("tbody",null,M.slice(0,18).map((d,nl)=>x("tr",{key:`${d.name||"layer"}-${nl}`},x("td",null,d.name||`#${nl+1}`),x("td",null,d.type||"--"),x("td",null,Q5(d.num_params)),x("td",null,d.trainable===void 0?"--":String(Boolean(d.trainable))),x("td",null,Q5(d.compute?.total??d.estimated_cost?.weighted_units?.total)))))))}function Kl(M){let d=Array.isArray(M)?M:[];if(d.length===0)return x(lt,{title:"data/ 暂无文件",text:"训练或评估完成后会生成 training_state、metrics、model_info 等文件。"});return x("div",{className:"met-file-chip-grid"},d.slice(0,48).map((nl)=>x("span",{key:nl},nl)),d.length>48?x("span",null,`+${d.length-48}`):null)}function wl(M){let d=String(M||"").replace(/\x1b\[[0-9;]*[A-Za-z]/g,"").split(/\r?\n/).map((nl)=>nl.trim()).filter(Boolean).slice(-12);if(d.length===0)return x(lt,{title:"暂无日志尾部",text:"该任务未上报 logTail 或日志已轮转。"});return x("div",{className:"met-log-lines"},d.map((nl,k)=>x("div",{key:`${k}-${nl.slice(0,16)}`},nl)))}function El(){if(i.loading)return x("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},x("div",{className:"panel-head compact"},x("div",null,x("p",{className:"panel-eyebrow"},"Detail Loading"),x(nu,{title:"详情加载中",loading:!0}))),x(lt,{title:"详情加载中",text:i.title||"正在读取 D601 data/ 和 config.json"}));if(i.error)return x("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},x(el,{error:i.error,wide:!0}));if(!i.data)return x("section",{className:"met-detail-panel muted","data-testid":"met-detail-panel"},x(lt,{title:"选择一个项目或任务查看详情",text:"项目库、当前队列、已完成和失败诊断中的行都可以点击;默认只展示结构化字段,原始 JSON 需显式点击按钮。"}));let M=tZ(i),d=iZ(i),nl=or(M.config),k=or(M.progress||d.progress),g=or(M.data),cl=or(M.metrics||g.metrics||k.trainingInfo?.evaluation_metrics),pl=or(g.trainingInfo||k.trainingInfo),Hl=or(g.trainingState),bl=or(M.model||g.model),_u=Array.isArray(bl.modelSummary)&&bl.modelSummary.length>0?bl.modelSummary:bl.computeLayers,tu=or(pl.evaluation_metrics),Nu=i.kind==="job"?"训练任务详情":"Project 详情";return x("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},x("div",{className:"panel-head compact"},x("div",null,x("p",{className:"panel-eyebrow"},i.kind==="job"?"Job + Project Detail":"Project Library Detail"),x(nu,{title:Nu}),x("code",null,M.projectPath||d.projectPath||i.title)),x("div",{className:"panel-actions"},x(my,{title:`MET ${Nu}`,data:i.data,onOpen:u,testId:"raw-met-detail"}))),i.kind==="job"?tl("任务状态",[{label:"Job ID",value:d.id},{label:"状态",value:wm(d.status)},{label:"GPU",value:d.gpuName},{label:"Exit Code",value:d.exitCode},{label:"耗时",value:Qm(d)},{label:"训练速度",value:x3(mm({...d,progress:k}))}]):null,tl("config.json",[{label:"use_model",value:nl.use_model},{label:"epoch_train",value:nl.epoch_train},{label:"step_per_epoch",value:nl.step_per_epoch},{label:"learning_rate",value:nl.learning_rate},{label:"using_gpu",value:nl.using_gpu},{label:"use_points",value:nl.use_points},{label:"sample_rate",value:nl.sample_rate},{label:"time_clipped_s",value:nl.time_clipped_s},{label:"H_UNITS",value:nl.H_UNITS},{label:"INNER_KAN_UNITS",value:nl.INNER_KAN_UNITS},{label:"INNER_KAN_LAYERS",value:nl.INNER_KAN_LAYERS},{label:"GRID_SIZE",value:nl.GRID_SIZE},{label:"SPLINE_ORDER",value:nl.SPLINE_ORDER},{label:"USE_FAST_MODEL",value:nl.USE_FAST_MODEL},{label:"IIR_TRAINABLE",value:nl.IIR_TRAINABLE}]),tl("data/ 训练状态",[{label:"Epoch",value:`${k.currentEpoch??Hl.current_epoch??Hl.completed_epoch??"--"} / ${k.epochTarget??nl.epoch_train??"--"}`},{label:"Progress",value:W1(k.progressPercent)},{label:"Last Loss",value:k.lastLoss??Hl.loss},{label:"Last Val Loss",value:k.lastValLoss??Hl.val_loss},{label:"Min Loss",value:pl.min_loss??Hl.min_loss},{label:"Min Val Loss",value:pl.min_val_loss??Hl.min_val_loss},{label:"Log Lines",value:k.logLineCount},{label:"ETA",value:U5(k.etaSeconds??Hl.remaining_time)},{label:"训练速度",value:x3(k.epochPerHour??Hl.smoothed_speed)},{label:"Training Alive",value:Hl.training_alive}]),tl("模型参数",[{label:"Model Type",value:bl.modelType??nl.use_model},{label:"Total Params",value:bl.totalParams,hint:bl.totalParams===null||bl.totalParams===void 0?"未上报":"data/model_info.json"},{label:"Trainable",value:bl.trainableParams},{label:"Non-trainable",value:bl.nonTrainableParams},{label:"Compute Cost",value:bl.computeCost},{label:"Estimate Status",value:bl.estimateStatus},{label:"Unsupported Layers",value:bl.unsupportedLayerCount}]),tl("指标",[{label:"train_loss",value:cl.train_loss??tu.train_loss},{label:"val_loss",value:cl.val_loss??tu.val_loss},{label:"train_mae",value:cl.train_mae??tu.train_mae},{label:"val_mae",value:cl.val_mae??tu.val_mae},{label:"train_afmae",value:cl.train_afmae??tu.train_afmae},{label:"val_afmae",value:cl.val_afmae??tu.val_afmae},{label:"freq_drift_hz",value:cl.freq_drift_hz},{label:"sens_drift_percent",value:cl.sens_drift_percent},{label:"linearity_percent",value:cl.linearity_percent},{label:"weights_source",value:cl.weights_source??tu.weights_source},{label:"lr min/mean/max",value:`${K1(pl.learning_rate_min)} / ${K1(pl.learning_rate_mean)} / ${K1(pl.learning_rate_max)}`}]),x("div",{className:"met-detail-section"},x("h3",null,"模型层"),Al(_u)),x("div",{className:"met-detail-section"},x("h3",null,"data/ 文件"),Kl(g.files)),i.kind==="job"?x("div",{className:"met-detail-section"},x("h3",null,"日志尾部"),wl(or(i.data).logTail)):null)}return x("div",{className:"met-page","data-testid":"met-nonlinear-page"},x(J5,{title:"MET Nonlinear 训练编排",eyebrow:"D601 GPU 用户服务",loading:n.loading||n.actionBusy,actions:x("div",{className:"panel-actions"},x("button",{type:"button",className:"ghost-btn",onClick:F,disabled:n.loading,"data-testid":"met-refresh-button"},n.loading?"刷新中":"刷新"),x(my,{title:"MET Nonlinear 用户服务",data:f,onOpen:u,testId:"raw-met-service"}))},x("div",{className:"findjob-hero"},x("div",null,x("div",{className:"node-version-line"},x(T1,{status:W.providerStatus==="online"?"online":"warn"},W.providerStatus||"unknown"),x("span",null,f.providerId),x("span",null,O.public?"公网暴露":"仅 UniDesk frontend 代理访问")),x("p",{className:"muted paragraph"},f.description)),x("div",{className:"microservice-ref-card"},x("span",null,"Repo"),x("strong",null,p.url||"--"),x("code",null,p.commitId||"--")),x("div",{className:"microservice-ref-card"},x("span",null,"D601 Docker"),x("strong",null,`${O.nodeBindHost||"--"}:${O.nodePort||"--"}`),x("code",null,`${p.composeFile||"--"} / ${p.containerName||"--"}`))),x(el,{error:n.error,wide:!0}),c.actionMessage?x("div",{className:"met-action-log","data-testid":"met-action-message"},c.actionMessage):null),x("div",{className:"met-grid"},x(J5,{title:"核心状态",eyebrow:n.refreshedAt?`Updated ${iu(n.refreshedAt)}`:"Queue + GPU",loading:n.loading},x("div",{className:"metric-grid"},x(It,{label:"Staged",value:Z.staged??0,hint:"加入队列未开始",tone:Number(Z.staged||0)>0?"warn":""}),x(It,{label:"Queued",value:Z.queued??0,hint:"排队等待调度",tone:Number(Z.queued||0)>0?"warn":""}),x(It,{label:"Running",value:Z.running??0,hint:`max ${n.summary?.queue?.maxConcurrency??n.queue?.queue?.maxConcurrency??"--"}`,tone:Number(Z.running||0)>0?"ok":""}),x(It,{label:"Succeeded",value:Z.succeeded??0,hint:"已完成"}),x(It,{label:"Failed",value:Z.failed??0,hint:"需要诊断",tone:Number(Z.failed||0)>0?"warn":""}),x(It,{label:"2080Ti Free",value:P?W1(Number(P.freeRatio)*100):"--",hint:P?`${P.memoryFreeMiB}/${P.memoryTotalMiB} MiB`:"等待 GPU 上报"}),x(It,{label:"ML Image",value:H.present?"READY":"MISSING",hint:H.image||"met-nonlinear-ml:tf26",tone:H.present?"ok":"warn"}),x(It,{label:"Health",value:n.health?.ok?"OK":"--",hint:"D601 /health"}))),x(J5,{title:"队列控制",eyebrow:"Downloader-like staging",loading:n.actionBusy},x("div",{className:"met-control-strip"},x("label",null,"最大并发",x("input",{type:"number",min:1,max:16,value:c.maxConcurrency,"data-testid":"met-max-concurrency-input",onChange:(M)=>A({maxConcurrency:M.target.value})})),x("label",null,"目标 GPU",x("input",{value:c.targetGpuName,"data-testid":"met-target-gpu-input",onChange:(M)=>A({targetGpuName:M.target.value})})),x("button",{type:"button",className:"ghost-btn",onClick:N,disabled:n.actionBusy,"data-testid":"met-save-settings-button"},"保存设置"),x("button",{type:"button",className:"primary-btn",onClick:J,disabled:n.actionBusy||Number(Z.staged||0)===0,"data-testid":"met-start-queue-button"},"启动队列")),x("p",{className:"muted paragraph"},"Project 先进入待启动队列,不会立即训练;点击启动队列后才切换为排队中,并由 D601 scheduler 按最大并发和 2080Ti 显存策略调度。")),x("section",{className:"panel met-workspace"},x("div",{className:"met-tabs",role:"tablist"},I.map((M)=>x("button",{key:M.id,type:"button",className:c.activeTab===M.id?"active":"",onClick:()=>A({activeTab:M.id}),"data-testid":`met-tab-${M.id}`},`${M.label} ${M.count}`))),x("div",{className:"panel-body"},c.activeTab==="projects"?x("div",{className:"met-form-grid","data-testid":"met-projects-pane"},x("div",{className:"met-fork-card"},x("h3",null,"Fork Project"),x("label",null,"源 Project",x("select",{value:D,"data-testid":"met-source-project-select",onChange:(M)=>A({sourceProject:M.target.value})},C.map((M)=>x("option",{key:M.projectPath,value:M.projectPath},`${M.projectPath} · ${M.useModel||"model?"}`)))),x("label",null,"Fork 数量",x("input",{type:"number",min:1,max:100,value:c.forkCount,"data-testid":"met-fork-count-input",onChange:(M)=>A({forkCount:M.target.value})})),x("label",null,"训练轮数",x("input",{type:"number",min:1,max:1e5,value:c.forkEpochs,"data-testid":"met-fork-epochs-input",onChange:(M)=>A({forkEpochs:M.target.value})})),x("label",null,"目标前缀",x("input",{value:c.forkPrefix,"data-testid":"met-fork-prefix-input",onChange:(M)=>A({forkPrefix:M.target.value})})),x("button",{type:"button",className:"primary-btn",onClick:G,disabled:n.actionBusy||!D,"data-testid":"met-fork-button"},"Fork Project"),x("p",{className:"muted paragraph"},"Fork 只创建新 Project 并自动勾选,不会直接训练;需要在右侧确认后加入待启动队列。")),x("div",{className:"met-project-list"},x("div",{className:"panel-head compact"},x("div",null,x("p",{className:"panel-eyebrow"},`Existing Projects · ${(n.projects?.roots||[]).map((M)=>`${M.root} ${M.count}`).join(" / ")}`),x(nu,{title:"选择已有 Project",loading:n.loading||n.actionBusy})),x("button",{type:"button",className:"ghost-btn",onClick:w,disabled:n.actionBusy||U().length===0,"data-testid":"met-stage-selected-button"},`加入待启动队列 (${U().length})`)),C.length===0?x(lt,{title:"暂无 project",text:"等待 D601 返回 /api/projects"}):x("div",{className:"met-project-table","data-testid":"met-project-tree"},x("div",{className:"met-tree-header"},x("span",null,"文件树 Project"),x("span",null,"Model"),x("span",null,"Epochs"),x("span",null,"Progress"),x("span",null,"速度")),E.children.map((M)=>s(M)))),El()):null,c.activeTab==="current"?x("div",{"data-testid":"met-current-pane"},fl(),o(Y,"current"),El(),x("div",{className:"panel-actions inline-actions"},x(my,{title:"MET Queue",data:n.queue,onOpen:u,testId:"raw-met-queue"}))):null,c.activeTab==="completed"?x("div",{"data-testid":"met-completed-pane"},o(v.length>0?v:X.filter((M)=>M.status==="succeeded"),"completed"),El()):null,c.activeTab==="failed"?x("div",{"data-testid":"met-failed-pane"},o(K.length>0?K:X.filter((M)=>["failed","canceled"].includes(M.status)),"failed"),El(),x("div",{className:"panel-actions inline-actions"},x(my,{title:"MET History",data:n.history,onOpen:u,testId:"raw-met-history"}))):null,c.activeTab==="gpu"?x("div",{className:"met-gpu-pane","data-testid":"met-gpu-pane"},V.length===0?x(lt,{title:"暂无 GPU 上报",text:"等待 D601 met-nonlinear-ts 或 ML image 提供 nvidia-smi 数据"}):x("div",{className:"table-wrap"},x("table",null,x("thead",null,x("tr",null,x("th",null,"Index"),x("th",null,"Name"),x("th",null,"Free"),x("th",null,"Policy"))),x("tbody",null,V.map((M)=>x("tr",{key:M.index},x("td",null,M.index),x("td",null,M.name),x("td",null,`${M.memoryFreeMiB} / ${M.memoryTotalMiB} MiB`,x("div",{className:"met-progress"},x("span",{style:{width:W1(Number(M.freeRatio)*100)}}))),x("td",null,String(M.name||"").includes("2080")?"target 2080Ti, <20% 限制并发":"non-target")))))),x("div",{className:"panel-actions inline-actions"},x(my,{title:"MET Images",data:n.images,onOpen:u,testId:"raw-met-images"}))):null))))}var a3=Ml(Ju(),1);var ml=a3.default.createElement,{useEffect:Gm,useMemo:yZ}=a3.default,g3=a3.default.useState;function Wm({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return ml("span",{className:`status-badge ${r}`},u||l||"unknown")}function p1({label:l,value:u,hint:r,tone:f}){return ml("article",{className:`metric-card ${f||""}`},ml("div",{className:"metric-label"},l),ml("div",{className:"metric-value"},u),ml("div",{className:"metric-hint"},r))}function k3({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return ml("section",{className:`panel ${n||""}`},ml("div",{className:"panel-head"},ml("div",null,u?ml("p",{className:"panel-eyebrow"},u):null,ml(nu,{title:l,loading:t})),r?ml("div",{className:"panel-actions"},r):null),ml("div",{className:"panel-body"},f))}function m5({title:l,data:u,onOpen:r,testId:f}){return ml("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function I3({title:l,text:u}){return ml("div",{className:"empty-state"},ml("strong",null,l),ml("span",null,u))}function cZ(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function $Z(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function _Z(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function wy(l,u){return`${l}/microservices/mdtodo/proxy${u}`}function Tm(l){if(l==="completed")return"已完成";if(l==="in_progress")return"进行中";return"待处理"}function AZ(l){if(l==="completed")return"online";if(l==="in_progress")return"warn";return"unknown"}function w5(l){let u=[],r=(f)=>{for(let n of f)if(u.push(n),Array.isArray(n.children))r(n.children)};return r(Array.isArray(l)?l:[]),u}function FZ({tasks:l,selectedId:u,onSelect:r}){if(!l.length)return ml(I3,{title:"暂无任务",text:"当前文件没有 R 编号任务。"});let f=(n)=>ml("li",{key:n.id},ml("button",{type:"button",className:`mdtodo-task-row ${u===n.id?"active":""}`,style:{"--task-depth":Math.min(Number(n.depth||0),6)},onClick:()=>r(n.id),"data-testid":`mdtodo-task-${String(n.id).replace(/[^A-Za-z0-9_-]+/g,"-")}`},ml(Wm,{status:AZ(n.status)},Tm(n.status)),ml("code",null,n.id),ml("span",{className:"mdtodo-task-title"},n.title||"--"),ml("span",{className:"mdtodo-link-count"},`${n.linkExists??0}/${n.linkCount??0}`)),Array.isArray(n.children)&&n.children.length>0?ml("ol",null,n.children.map(f)):null);return ml("ol",{className:"mdtodo-tree"},l.map(f))}function Km({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((P)=>P.id==="mdtodo")||null,[n,t]=g3({loading:!1,saving:!1,error:"",notice:"",health:null,files:[],todo:null,selectedFile:"",selectedTaskId:"",refreshedAt:null,command:null}),[i,y]=g3(""),[c,_]=g3(""),[A,F]=g3(""),j=Array.isArray(n.todo?.tasks)?n.todo.tasks:[],N=yZ(()=>w5(j),[n.todo]),U=N.find((P)=>P.id===n.selectedTaskId)||N[0]||null,w=n.todo?.stats||{};async function G(P=n.selectedFile){if(!f)return;t((H)=>({...H,loading:!0,error:"",notice:""}));try{let[H,B]=await Promise.all([Tl(`${r}/microservices/mdtodo/health`),Tl(wy(r,"/api/files"))]),C=Array.isArray(B.files)?B.files:[],E=P||C[0]?.path||"",D=E?await Tl(wy(r,`/api/tasks?file=${encodeURIComponent(E)}`)):null,Y=Array.isArray(D?.tasks)?w5(D.tasks):[],v=Y.some((K)=>K.id===n.selectedTaskId)?n.selectedTaskId:Y[0]?.id||"";t({loading:!1,saving:!1,error:"",notice:"",health:H,files:C,todo:D,selectedFile:E,selectedTaskId:v,refreshedAt:new Date,command:n.command})}catch(H){t((B)=>({...B,loading:!1,error:zl(H,"MDTODO 加载失败")}))}}if(Gm(()=>{G()},[f?.id,f?.runtime?.providerStatus]),Gm(()=>{y(U?.title||""),_(U?.rawContent||"")},[U?.id,n.selectedFile]),!f)return ml(I3,{title:"MDTODO 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=mdtodo"});let J=cZ(f),Q=_Z(f),m=$Z(f);async function q(P){t((H)=>({...H,selectedFile:P,selectedTaskId:"",command:null})),await G(P)}async function W(P){if(!U||!n.selectedFile)return;t((H)=>({...H,saving:!0,error:"",notice:""}));try{let H=await Tl(wy(r,`/api/tasks/${encodeURIComponent(U.id)}`),{method:"PATCH",body:{file:n.selectedFile,...P}});t((B)=>({...B,saving:!1,todo:H.file,notice:H.result?.message||"任务已更新"}))}catch(H){t((B)=>({...B,saving:!1,error:zl(H,"任务更新失败")}))}}async function p(){await W({title:i,rawContent:c})}async function O(P){if(!n.selectedFile)return;t((H)=>({...H,saving:!0,error:"",notice:""}));try{let H=await Tl(wy(r,"/api/tasks"),{method:"POST",body:{file:n.selectedFile,parentId:P,title:A||"新任务"}});F(""),t((B)=>({...B,saving:!1,todo:H.file,selectedTaskId:H.result?.taskId||B.selectedTaskId,notice:H.result?.message||"任务已创建"})),await G(n.selectedFile)}catch(H){t((B)=>({...B,saving:!1,error:zl(H,"创建任务失败")}))}}async function Z(){if(!U||!n.selectedFile)return;if(!window.confirm(`删除 ${U.id} 及其子任务?`))return;t((P)=>({...P,saving:!0,error:"",notice:""}));try{let P=await Tl(wy(r,`/api/tasks/${encodeURIComponent(U.id)}?file=${encodeURIComponent(n.selectedFile)}`),{method:"DELETE"}),H=w5(P.file?.tasks||[]);t((B)=>({...B,saving:!1,todo:P.file,selectedTaskId:H[0]?.id||"",notice:P.result?.message||"任务已删除"}))}catch(P){t((H)=>({...H,saving:!1,error:zl(P,"删除任务失败")}))}}async function V(){if(!U||!n.selectedFile)return;t((P)=>({...P,saving:!0,error:"",command:null}));try{let P=await Tl(wy(r,"/api/execute-command"),{method:"POST",body:{file:n.selectedFile,taskId:U.id,mode:"codex"}});t((H)=>({...H,saving:!1,command:P,notice:"执行命令已生成"}))}catch(P){t((H)=>({...H,saving:!1,error:zl(P,"执行命令生成失败")}))}}return ml("div",{className:"mdtodo-page","data-testid":"mdtodo-page"},ml(k3,{title:"MDTODO 工作台",eyebrow:"D601 k3s managed service",loading:n.loading,actions:ml("div",{className:"panel-actions"},ml("button",{type:"button",className:"ghost-btn",onClick:()=>void G(),disabled:n.loading,"data-testid":"mdtodo-refresh-button"},n.loading?"刷新中":"刷新"),ml(m5,{title:"MDTODO 用户服务",data:f,onOpen:u,testId:"raw-mdtodo-service"}))},ml("div",{className:"findjob-hero"},ml("div",null,ml("div",{className:"node-version-line"},ml(Wm,{status:J.providerStatus==="online"?"online":"warn"},J.providerStatus||"unknown"),ml("span",null,f.providerId),ml("span",null,m.proxyMode||"--")),ml("p",{className:"muted paragraph"},f.description)),ml("div",{className:"microservice-ref-card"},ml("span",null,"Repo"),ml("strong",null,Q.url||"--"),ml("code",null,Q.composeFile||"--")),ml("div",{className:"microservice-ref-card"},ml("span",null,"Workspace"),ml("strong",null,n.health?.rootDir||"/workspace"),ml("code",null,`${m.nodeBindHost||"--"}:${m.nodePort||"--"}`))),ml(el,{error:n.error,wide:!0}),n.notice?ml("div",{className:"notice-line"},n.notice):null),ml("div",{className:"metric-grid"},ml(p1,{label:"TODO 文件",value:n.files.length,hint:n.health?.rootExists?"hostPath ready":"hostPath missing",tone:n.health?.ok?"ok":"warn"}),ml(p1,{label:"任务总数",value:w.total??"--",hint:n.selectedFile||"--"}),ml(p1,{label:"已完成",value:w.completed??"--",hint:"completed",tone:"ok"}),ml(p1,{label:"进行中",value:w.inProgress??"--",hint:"in progress",tone:"warn"}),ml(p1,{label:"待处理",value:w.pending??"--",hint:n.refreshedAt?iu(n.refreshedAt):"pending"})),ml("div",{className:"mdtodo-layout"},ml(k3,{title:"文件",eyebrow:`${n.files.length} Markdown`,loading:n.loading,className:"mdtodo-file-panel"},n.files.length===0?ml(I3,{title:"暂无 TODO 文件",text:"等待后端扫描 MDTODO 工作区。"}):ml("div",{className:"mdtodo-file-list"},n.files.map((P)=>ml("button",{key:P.path,type:"button",className:`mdtodo-file-item ${n.selectedFile===P.path?"active":""}`,onClick:()=>void q(P.path)},ml("strong",null,P.name),ml("span",null,P.directory||"."),ml("code",null,`${P.stats?.total??"--"} tasks / ${Ll(P.mtime)}`))))),ml(k3,{title:"任务树",eyebrow:n.selectedFile||"Tasks",loading:n.loading,actions:ml("div",{className:"panel-actions"},ml("input",{value:A,onChange:(P)=>F(P.target.value),placeholder:"新任务标题","data-testid":"mdtodo-new-title"}),ml("button",{type:"button",className:"ghost-btn",onClick:()=>void O(),disabled:n.saving||!n.selectedFile},"新增"),U?ml("button",{type:"button",className:"ghost-btn",onClick:()=>void O(U.id),disabled:n.saving},"新增子任务"):null,n.todo?ml(m5,{title:"MDTODO 当前文件",data:n.todo,onOpen:u,testId:"raw-mdtodo-file"}):null)},ml(FZ,{tasks:j,selectedId:U?.id||"",onSelect:(P)=>t((H)=>({...H,selectedTaskId:P,command:null}))})),ml(k3,{title:U?`${U.id} 详情`:"任务详情",eyebrow:U?Tm(U.status):"Detail",loading:n.saving,className:"mdtodo-detail-panel",actions:U?ml("div",{className:"panel-actions"},ml("button",{type:"button",className:"ghost-btn",onClick:()=>void W({status:"pending"}),disabled:n.saving},"待处理"),ml("button",{type:"button",className:"ghost-btn",onClick:()=>void W({status:"in_progress"}),disabled:n.saving},"进行中"),ml("button",{type:"button",className:"primary-btn",onClick:()=>void W({status:"completed"}),disabled:n.saving},"完成")):null},!U?ml(I3,{title:"未选中任务",text:"请选择一个任务。"}):ml("div",{className:"mdtodo-editor"},ml("label",null,"标题",ml("input",{value:i,onChange:(P)=>y(P.target.value),"data-testid":"mdtodo-title-input"})),ml("label",null,"正文",ml("textarea",{value:c,onChange:(P)=>_(P.target.value),rows:12,"data-testid":"mdtodo-raw-input"})),ml("div",{className:"docker-meta compact"},ml("span",null,`line ${Number(U.lineNumber??0)+1}`),ml("span",null,`depth ${U.depth??0}`),ml("span",null,`links ${U.linkExists??0}/${U.linkCount??0}`)),ml("div",{className:"inline-actions"},ml("button",{type:"button",className:"primary-btn",onClick:p,disabled:n.saving},n.saving?"保存中":"保存"),ml("button",{type:"button",className:"ghost-btn",onClick:V,disabled:n.saving},"生成执行命令"),ml("button",{type:"button",className:"danger-btn",onClick:Z,disabled:n.saving},"删除"),ml(m5,{title:`MDTODO ${U.id}`,data:U,onOpen:u,testId:"raw-mdtodo-task"})),n.command?ml("div",{className:"mdtodo-command"},ml("span",null,n.command.prompt||"--"),ml("code",null,n.command.command||"--")):null))))}var d3=[{id:"ops",label:"运行总览",code:"OPS",tabs:[{id:"status",label:"态势总览"},{id:"performance",label:"性能面板"},{id:"events",label:"事件摘要"},{id:"logs",label:"服务日志"}]},{id:"nodes",label:"资源节点",code:"NODE",tabs:[{id:"list",label:"节点清单"},{id:"monitor",label:"资源监控"},{id:"docker",label:"Docker 状态"},{id:"gateway",label:"网关版本"},{id:"labels",label:"资源标签"},{id:"heartbeats",label:"心跳状态"}]},{id:"tasks",label:"任务调度",code:"TASK",tabs:[{id:"dispatch",label:"下发任务"},{id:"scheduled",label:"定时任务"},{id:"pending",label:"待处理任务"},{id:"history",label:"任务历史"},{id:"results",label:"执行结果"}]},{id:"apps",label:"用户服务",code:"APP",routeSegment:"app",tabs:[{id:"catalog",label:"服务目录"},{id:"todo-note",label:"Todo Note"},{id:"findjob",label:"FindJob"},{id:"pipeline",label:"Pipeline"},{id:"met-nonlinear",label:"MET Nonlinear"},{id:"claudeqq",label:"ClaudeQQ"},{id:"baidu-netdisk",label:"Baidu Netdisk"},{id:"filebrowser",label:"File Browser"},{id:"oa-event-flow",label:"OA Event Flow"},{id:"k3sctl",label:"k3s Control"},{id:"code-queue",label:"Code Queue"},{id:"mdtodo",label:"MDTODO"},{id:"decision-center",label:"Decision Center"},{id:"project-manager",label:"Project Manager"}]},{id:"config",label:"系统配置",code:"CFG",tabs:[{id:"topology",label:"连接拓扑"},{id:"auth",label:"认证策略"},{id:"security",label:"安全边界"}]}],z1=Object.fromEntries(d3.map((l)=>[l.id,l.tabs[0]?.id??""]));function jZ(l){let u=String(l||"").trim();if(!u)return"";try{return decodeURIComponent(u)}catch{return u}}function o3(l){let u=String(l||"/"),[r]=u.split(/[?#]/u,1);if(r==="/")return"/";let n=`/${r.split("/").map(jZ).filter(Boolean).join("/")}`;return n.endsWith("/")?n:`${n}/`}function NZ(l){let u=2166136261;for(let r of l)u^=r.charCodeAt(0),u=Math.imul(u,16777619);return Math.abs(u>>>0).toString(36)}function q5(l){return String(l||"").normalize("NFKD").replace(/[\u0300-\u036f]/gu,"").toLowerCase().replace(/[^a-z0-9]+/gu,"-").replace(/^-+|-+$/gu,"")}function Em(l){return String(l||"").trim().toLowerCase().replace(/[\s/\\?#%]+/gu,"-").replace(/-+/gu,"-").replace(/^-+|-+$/gu,"")}function pm(l){let u=q5(l.routeSegment||"")||Em(l.routeSegment||"");if(u)return u;let r=q5(l.id||"");if(r)return r;let f=q5(l.label||"")||Em(l.label||"");if(f)return f;return`route-${NZ(JSON.stringify(l))}`}function L5(l,u){return`${l}:${u}`}function zm(l){let u=l.map((c)=>{let _=pm(c);return{...c,routeSegment:_,tabs:c.tabs.map((A)=>({...A,routeSegment:pm(A)}))}}),r={},f={},n={},t=u.map((c)=>{let _=c.tabs[0]?.id??"";n[c.id]=_;let A=c.tabs.map((N)=>{let U=`/${c.routeSegment}/${N.routeSegment}/`,w=[U],G={moduleId:c.id,tabId:N.id};for(let J of w)r[o3(J)]=G;return f[L5(c.id,N.id)]=U,{...N,canonicalPath:U,aliases:w}}),F=`/${c.routeSegment}/`,j={moduleId:c.id,tabId:_};return r[o3(F)]=j,{...c,routeSegment:c.routeSegment,canonicalPath:F,tabs:A}}),i=t[0],y={moduleId:i?.id||"",tabId:i?.tabs[0]?.id||""};return r["/"]=y,{modules:t,moduleById:Object.fromEntries(t.map((c)=>[c.id,c])),defaultActiveTabs:n,routeMap:r,canonicalPathByTarget:f,fallbackTarget:y}}function G5(l,u){return l.routeMap[o3(u)]||l.fallbackTarget}function e3(l,u,r){return l.canonicalPathByTarget[L5(u,r)]||l.canonicalPathByTarget[L5(l.fallbackTarget.moduleId,l.fallbackTarget.tabId)]||"/"}function Om(l,u){let r=l.routeMap[o3(u)];if(!r)return null;return e3(l,r.moduleId,r.tabId)}var fA=Ml(Ju(),1);var $l=fA.default.createElement,{useEffect:Zm,useMemo:JZ}=fA.default,W5=fA.default.useState;function rA({status:l,children:u,title:r}){let f=String(l||"unknown").toLowerCase();return $l("span",{className:`status-badge ${f}`,title:r},u||l||"unknown")}function O1({label:l,value:u,hint:r,tone:f}){return $l("article",{className:`metric-card ${f||""}`},$l("div",{className:"metric-label"},l),$l("div",{className:"metric-value"},u),$l("div",{className:"metric-hint"},r))}function lA({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return $l("section",{className:`panel ${n||""}`},$l("div",{className:"panel-head"},$l("div",null,u?$l("p",{className:"panel-eyebrow"},u):null,$l(nu,{title:l,loading:t})),r?$l("div",{className:"panel-actions"},r):null),$l("div",{className:"panel-body"},f))}function Z1({title:l,data:u,onOpen:r,testId:f}){return $l("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r?.(l,u)},"查看原始JSON")}function T5({title:l,text:u}){return $l("div",{className:"empty-state"},$l("strong",null,l),$l("span",null,u))}function UZ(l){return l&&typeof l==="object"&&!Array.isArray(l)?l:null}function ut(l){return Array.isArray(l)?l:[]}function dr(l){let u=Number(l);return Number.isFinite(u)?u.toLocaleString("zh-CN"):"--"}function Hm(l,u=140){if(l===null||l===void 0)return"--";let r=typeof l==="string"?l:JSON.stringify(l),f=String(r||"").replace(/\s+/gu," ").trim();return f.length>u?`${f.slice(0,u-1)}...`:f||"--"}function QZ(l){return ut(l?.tags).map((u)=>String(u||"").trim()).filter(Boolean)}function ki(l){let u=Number(l);return Number.isFinite(u)&&u>=0?Math.floor(u):0}function mZ(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function wZ(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function qZ(l){return String(l||"").split(/[\s,]+/u).map((u)=>u.trim()).filter(Boolean).join(",")}function uA(l,u){return`${l}/microservices/oa-event-flow/proxy${u}`}function LZ(l){if(l.includes("error")||l.includes("failed"))return"failed";if(l.includes("stats"))return"ok";if(l.includes("step")||l.includes("updated"))return"running";return"queued"}function GZ(l){let u=String(l?.subjectKind||"trace"),r=String(l?.subjectId||l?.scopeId||"");return r?`${u}:${r}`:String(l?.scopeId||"--")}function WZ({tags:l}){let u=QZ({tags:l}).slice(0,6);return $l("div",{className:"oa-tag-rail"},u.length===0?$l("span",{className:"muted"},"--"):u.map((r)=>$l("code",{key:r},r)))}function TZ({events:l,onRaw:u}){let r=[...ut(l)].reverse();return r.length===0?$l(T5,{title:"事件表暂无记录",text:"等待 Code Queue 或 Pipeline 按 tag 发布 OA 事件"}):$l("div",{className:"table-wrap oa-event-table-wrap"},$l("table",{className:"oa-event-table","data-testid":"oa-event-flow-event-table"},$l("thead",null,$l("tr",null,$l("th",null,"Seq"),$l("th",null,"Type"),$l("th",null,"Source"),$l("th",null,"Aggregate"),$l("th",null,"Tags"),$l("th",null,"Payload"),$l("th",null,"Created"),$l("th",null,"Raw"))),$l("tbody",null,r.map((f)=>{let n=String(f?.type||"event"),t=`${String(f?.aggregateType||"--")}:${String(f?.aggregateId||"--")}`;return $l("tr",{key:f?.eventId||f?.sequence},$l("td",null,$l("code",null,dr(f?.sequence))),$l("td",null,$l(rA,{status:LZ(n)},n)),$l("td",null,$l("strong",null,f?.sourceId||"--"),$l("code",null,f?.sourceKind||"--")),$l("td",null,$l("code",null,t)),$l("td",null,$l(WZ,{tags:f?.tags})),$l("td",null,$l("span",{className:"oa-payload-preview"},Hm(f?.payload,180))),$l("td",null,Ll(f?.createdAt)),$l("td",null,$l(Z1,{title:`OA Event ${f?.sequence||""}`,data:f,onOpen:u,testId:`raw-oa-event-${f?.sequence||"unknown"}`})))}))))}function KZ({stats:l,onRaw:u}){let r=ut(l);return r.length===0?$l(T5,{title:"统计中心暂无投影",text:"trace-stats-snapshot / trace-step-created 进入事件流后会更新这里"}):$l("div",{className:"table-wrap oa-stats-table-wrap"},$l("table",{className:"oa-stats-table","data-testid":"oa-event-flow-stats"},$l("thead",null,$l("tr",null,$l("th",null,"Scope"),$l("th",null,"Service"),$l("th",null,"STEP"),$l("th",null,"Read"),$l("th",null,"Edit"),$l("th",null,"Run"),$l("th",null,"Error"),$l("th",null,"Output Seq"),$l("th",null,"Revision"),$l("th",null,"Updated"),$l("th",null,"Raw"))),$l("tbody",null,r.map((f)=>$l("tr",{key:f?.scopeId||`${f?.serviceId}-${f?.subjectId}`},$l("td",null,$l("strong",null,GZ(f)),$l("code",null,f?.scopeId||"--")),$l("td",null,$l(rA,{status:String(f?.serviceId||"unknown")==="code-queue"?"running":"queued"},f?.serviceId||"--")),$l("td",null,$l("strong",null,dr(ki(f?.stepCount??f?.llmStepCount)))),$l("td",null,dr(ki(f?.readCount))),$l("td",null,dr(ki(f?.editCount))),$l("td",null,dr(ki(f?.runCount))),$l("td",null,dr(ki(f?.errorCount))),$l("td",null,$l("code",null,dr(ki(f?.outputMaxSeq)))),$l("td",null,dr(ki(f?.statsRevision))),$l("td",null,Ll(f?.updatedAt)),$l("td",null,$l(Z1,{title:`OA Trace Stats ${f?.scopeId||""}`,data:f,onOpen:u,testId:`raw-oa-stats-${String(f?.scopeId||"unknown").replace(/[^a-zA-Z0-9_-]/gu,"_")}`})))))))}function Bm({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((W)=>W.id==="oa-event-flow")||null,[n,t]=W5("service:code-queue"),[i,y]=W5({loading:!1,error:"",health:null,diagnostics:null,events:[],stats:[],refreshedAt:null}),[c,_]=W5({status:"idle",message:"未连接",lastEventAt:""}),A=JZ(()=>qZ(n),[n]);async function F(){if(!f)return;y((W)=>({...W,loading:!0,error:""}));try{let W=A?`tags=${encodeURIComponent(A)}&`:"",[p,O,Z,V]=await Promise.all([Tl(`${r}/microservices/oa-event-flow/health`,{failureFields:[]}),Tl(uA(r,"/api/diagnostics")),Tl(uA(r,`/api/events?${W}limit=100`)),Tl(uA(r,`/api/stats/trace?${W}limit=100`))]);y({loading:!1,error:"",health:p,diagnostics:O,events:ut(Z?.events),stats:ut(V?.stats),refreshedAt:new Date})}catch(W){y((p)=>({...p,loading:!1,error:zl(W,"OA Event Flow 加载失败")}))}}if(Zm(()=>{F()},[f?.id,f?.runtime?.providerStatus,A]),Zm(()=>{if(!f||typeof EventSource>"u")return;let W=A?`?tags=${encodeURIComponent(A)}`:"",p=new EventSource(`${uA(r,"/api/events/stream")}${W}`,{withCredentials:!0});_({status:"running",message:"SSE connecting",lastEventAt:""});let O=(P)=>{_({status:"online",message:Hm(P.data,120),lastEventAt:new Date().toISOString()})},Z=(P)=>{try{let H=JSON.parse(String(P.data||"{}"));_({status:"online",message:String(H?.type||P.type||"event"),lastEventAt:new Date().toISOString()}),y((B)=>{let C=[...ut(B.events).filter((D)=>String(D?.eventId||"")!==String(H?.eventId||"")),H].sort((D,Y)=>Number(D?.sequence||0)-Number(Y?.sequence||0)).slice(-100),E=H?.type==="trace-stats-updated"&&UZ(H?.payload?.stats)?[H.payload.stats,...ut(B.stats).filter((D)=>String(D?.scopeId||"")!==String(H.payload.stats.scopeId||""))].slice(0,100):B.stats;return{...B,events:C,stats:E}})}catch(H){_({status:"warn",message:zl(H,"SSE 事件解析失败"),lastEventAt:new Date().toISOString()})}},V=()=>{_((P)=>({...P,status:"warn",message:"SSE reconnecting"}))};return p.addEventListener("hello",O),p.addEventListener("task-updated",Z),p.addEventListener("queue-updated",Z),p.addEventListener("trace-step-created",Z),p.addEventListener("trace-stats-snapshot",Z),p.addEventListener("trace-stats-updated",Z),p.addEventListener("trace-error",Z),p.onerror=V,()=>p.close()},[f?.id,r,A]),!f)return $l(T5,{title:"OA Event Flow 未登记",text:"请在 config.json 的 microservices 中登记 id=oa-event-flow"});let j=mZ(f),N=wZ(f),U=i.diagnostics||{},w=i.health||{},G=U.eventCount??w.eventCount,J=U.traceStatsCount??w.traceStatsCount,Q=U.latestSequence??w.latestSequence,m=U.pipelineBridge||w.pipelineBridge||{},q=ut(U.eventTypes).slice(0,8);return $l("div",{className:"oa-event-flow-page","data-testid":"oa-event-flow-page"},$l(lA,{title:"OA Event Flow 控制台",eyebrow:"Unified OA Event Bus + Stats Projection",loading:i.loading,actions:$l("div",{className:"panel-actions"},$l("button",{type:"button",className:"ghost-btn",onClick:F,disabled:i.loading,"data-testid":"oa-event-flow-refresh"},i.loading?"刷新中":"刷新"),$l(Z1,{title:"OA Event Flow Service",data:f,onOpen:u,testId:"raw-oa-event-flow-service"}))},$l("div",{className:"oa-flow-hero"},$l("div",null,$l("div",{className:"node-version-line"},$l(rA,{status:w?.ok||j.providerStatus==="online"?"online":"warn"},w?.ok?"HEALTH OK":j.providerStatus||"unknown"),$l(rA,{status:c.status},c.status.toUpperCase()),$l("span",null,N.public?"公网暴露":"仅 UniDesk frontend 代理访问")),$l("p",{className:"muted paragraph"},"独立事件流微服务统一承载 Code Queue 与 Pipeline 的事件发布、tag 订阅、事件表审计和 Trace/STEP 统计投影。")),$l("div",{className:"oa-flow-signal"},$l("span",null,"stream"),$l("strong",null,c.message||"--"),$l("code",null,c.lastEventAt?iu(new Date(c.lastEventAt)):"waiting"))),$l(el,{error:i.error,wide:!0})),$l("div",{className:"oa-flow-metrics"},$l(O1,{label:"事件总量",value:dr(G),hint:`latest seq ${dr(Q)}`,tone:"ok"}),$l(O1,{label:"Trace Stats",value:dr(J),hint:"oa_trace_stats 投影"}),$l(O1,{label:"SSE Clients",value:dr(w?.sseClientCount??ut(U.sseClients).length),hint:c.message||"tag subscription"}),$l(O1,{label:"Pipeline Bridge",value:m?.enabled?dr(m?.insertedCount):"OFF",hint:m?.lastError||m?.lastFinishedAt||`${m?.mode||"snapshot"} service:pipeline`}),$l(O1,{label:"DB",value:w?.databaseReady||U.databaseReady?"READY":"WAIT",hint:w?.databaseLastError||U.databaseLastError||"PostgreSQL persisted"})),$l(lA,{title:"标签订阅",eyebrow:i.refreshedAt?`Updated ${iu(i.refreshedAt)}`:"Tag Pub/Sub"},$l("div",{className:"oa-filter-bar"},$l("label",null,$l("span",null,"tags"),$l("input",{value:n,onChange:(W)=>t(W.target.value),placeholder:"service:code-queue, trace","data-testid":"oa-event-flow-tag-filter"})),$l("div",{className:"oa-filter-presets"},$l("button",{type:"button",className:"ghost-btn",onClick:()=>t("service:code-queue")},"Code Queue"),$l("button",{type:"button",className:"ghost-btn",onClick:()=>t("service:pipeline")},"Pipeline"),$l("button",{type:"button",className:"ghost-btn",onClick:()=>t("trace")},"Trace"),$l("button",{type:"button",className:"ghost-btn",onClick:()=>t("")},"All")),$l("code",null,A||"all events")),$l("div",{className:"oa-type-strip"},q.length===0?$l("span",{className:"muted"},"等待事件类型统计"):q.map((W)=>$l("span",{key:W.type,className:"data-chip"},`${W.type} ${dr(W.count)}`)))),$l("div",{className:"oa-flow-grid"},$l(lA,{title:"事件表",eyebrow:"oa_events persisted log",className:"oa-flow-wide",loading:i.loading,actions:$l(Z1,{title:"OA Event Query",data:{events:i.events,diagnostics:U},onOpen:u,testId:"raw-oa-events"})},$l(TZ,{events:i.events,onRaw:u})),$l(lA,{title:"统计中心",eyebrow:"oa_trace_stats read model",className:"oa-flow-wide",loading:i.loading,actions:$l(Z1,{title:"OA Trace Stats",data:i.stats,onOpen:u,testId:"raw-oa-trace-stats"})},$l(KZ,{stats:i.stats,onRaw:u}))))}var $i=Ml(Ju(),1);var il=Ml(Ym(),1),_l=Ml(Ju(),1);function bu(l){if(typeof l==="string"||typeof l==="number")return""+l;let u="";if(Array.isArray(l)){for(let r=0,f;r{}};function Pm(){for(var l=0,u=arguments.length,r={},f;l=0)f=r.slice(n+1),r=r.slice(0,n);if(r&&!u.hasOwnProperty(r))throw Error("unknown type: "+r);return{type:r,name:f}})}tA.prototype=Pm.prototype={constructor:tA,on:function(l,u){var r=this._,f=DZ(l+"",r),n,t=-1,i=f.length;if(arguments.length<2){while(++t0)for(var r=Array(n),f=0,n,t;f=0&&(u=l.slice(0,r))!=="xmlns")l=l.slice(r+1);return K5.hasOwnProperty(u)?{space:K5[u],local:l}:l}function E5(l){let u;while(u=l.sourceEvent)l=u;return l}function Er(l,u){if(l=E5(l),u===void 0)u=l.currentTarget;if(u){var r=u.ownerSVGElement||u;if(r.createSVGPoint){var f=r.createSVGPoint();return f.x=l.clientX,f.y=l.clientY,f=f.matrixTransform(u.getScreenCTM().inverse()),[f.x,f.y]}if(u.getBoundingClientRect){var n=u.getBoundingClientRect();return[l.clientX-n.left-u.clientLeft,l.clientY-n.top-u.clientTop]}}return[l.pageX,l.pageY]}function SZ(){}function at(l){return l==null?SZ:function(){return this.querySelector(l)}}function p5(l){if(typeof l!=="function")l=at(l);for(var u=this._groups,r=u.length,f=Array(r),n=0;n=m)m=Q+1;while(!(W=G[m])&&++m=0;)if(i=f[n]){if(t&&i.compareDocumentPosition(t)^4)t.parentNode.insertBefore(i,t);t=i}return this}function h5(l){if(!l)l=kZ;function u(F,j){return F&&j?l(F.__data__,j.__data__):!F-!j}for(var r=this._groups,f=r.length,n=Array(f),t=0;tu?1:l>=u?0:NaN}function M5(){var l=arguments[0];return arguments[0]=this,l.apply(null,arguments),this}function s5(){return Array.from(this)}function R5(){for(var l=this._groups,u=0,r=l.length;u1?this.each((u==null?uH:typeof u==="function"?fH:rH)(l,u,r==null?"":r)):ot(this.node(),l)}function ot(l,u){return l.style.getPropertyValue(u)||D1(l).getComputedStyle(l,null).getPropertyValue(u)}function nH(l){return function(){delete this[l]}}function tH(l,u){return function(){this[l]=u}}function iH(l,u){return function(){var r=u.apply(this,arguments);if(r==null)delete this[l];else this[l]=r}}function I5(l,u){return arguments.length>1?this.each((u==null?nH:typeof u==="function"?iH:tH)(l,u)):this.node()[l]}function Cm(l){return l.trim().split(/^|\s+/)}function a5(l){return l.classList||new hm(l)}function hm(l){this._node=l,this._names=Cm(l.getAttribute("class")||"")}hm.prototype={add:function(l){var u=this._names.indexOf(l);if(u<0)this._names.push(l),this._node.setAttribute("class",this._names.join(" "))},remove:function(l){var u=this._names.indexOf(l);if(u>=0)this._names.splice(u,1),this._node.setAttribute("class",this._names.join(" "))},contains:function(l){return this._names.indexOf(l)>=0}};function Mm(l,u){var r=a5(l),f=-1,n=u.length;while(++f=0)r=u.slice(f+1),u=u.slice(0,f);return{type:u,name:r}})}function EH(l){return function(){var u=this.__on;if(!u)return;for(var r=0,f=-1,n=u.length,t;r()=>l;function X1(l,{sourceEvent:u,subject:r,target:f,identifier:n,active:t,x:i,y,dx:c,dy:_,dispatch:A}){Object.defineProperties(this,{type:{value:l,enumerable:!0,configurable:!0},sourceEvent:{value:u,enumerable:!0,configurable:!0},subject:{value:r,enumerable:!0,configurable:!0},target:{value:f,enumerable:!0,configurable:!0},identifier:{value:n,enumerable:!0,configurable:!0},active:{value:t,enumerable:!0,configurable:!0},x:{value:i,enumerable:!0,configurable:!0},y:{value:y,enumerable:!0,configurable:!0},dx:{value:c,enumerable:!0,configurable:!0},dy:{value:_,enumerable:!0,configurable:!0},_:{value:A}})}X1.prototype.on=function(){var l=this._.on.apply(this._,arguments);return l===this._?this:l};function PH(l){return!l.ctrlKey&&!l.button}function CH(){return this.parentNode}function hH(l,u){return u==null?{x:l.x,y:l.y}:u}function MH(){return navigator.maxTouchPoints||"ontouchstart"in this}function P1(){var l=PH,u=CH,r=hH,f=MH,n={},t=Ii("start","drag","end"),i=0,y,c,_,A,F=0;function j(q){q.on("mousedown.drag",N).filter(f).on("touchstart.drag",G).on("touchmove.drag",J,bm).on("touchend.drag touchcancel.drag",Q).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function N(q,W){if(A||!l.call(this,q,W))return;var p=m(this,u.call(this,q,W),q,W,"mouse");if(!p)return;tr(q.view).on("mousemove.drag",U,ai).on("mouseup.drag",w,ai),Gy(q.view),cA(q),_=!1,y=q.clientX,c=q.clientY,p("start",q)}function U(q){if(ft(q),!_){var W=q.clientX-y,p=q.clientY-c;_=W*W+p*p>F}n.mouse("drag",q)}function w(q){tr(q.view).on("mousemove.drag mouseup.drag",null),S1(q.view,_),ft(q),n.mouse("end",q)}function G(q,W){if(!l.call(this,q,W))return;var p=q.changedTouches,O=u.call(this,q,W),Z=p.length,V,P;for(V=0;V>8&15|u>>4&240,u>>4&15|u&240,(u&15)<<4|u&15,1):r===8?$A(u>>24&255,u>>16&255,u>>8&255,(u&255)/255):r===4?$A(u>>12&15|u>>8&240,u>>8&15|u>>4&240,u>>4&15|u&240,((u&15)<<4|u&15)/255):null):(u=RH.exec(l))?new er(u[1],u[2],u[3],1):(u=xH.exec(l))?new er(u[1]*255/100,u[2]*255/100,u[3]*255/100,1):(u=bH.exec(l))?$A(u[1],u[2],u[3],u[4]):(u=vH.exec(l))?$A(u[1]*255/100,u[2]*255/100,u[3]*255/100,u[4]):(u=gH.exec(l))?dm(u[1],u[2]/100,u[3]/100,1):(u=kH.exec(l))?dm(u[1],u[2]/100,u[3]/100,u[4]):vm.hasOwnProperty(l)?Im(vm[l]):l==="transparent"?new er(NaN,NaN,NaN,0):null}function Im(l){return new er(l>>16&255,l>>8&255,l&255,1)}function $A(l,u,r,f){if(f<=0)l=u=r=NaN;return new er(l,u,r,f)}function oH(l){if(!(l instanceof s1))l=nn(l);if(!l)return new er;return l=l.rgb(),new er(l.r,l.g,l.b,l.opacity)}function Ty(l,u,r,f){return arguments.length===1?oH(l):new er(l,u,r,f==null?1:f)}function er(l,u,r,f){this.r=+l,this.g=+u,this.b=+r,this.opacity=+f}C1(er,Ty,A9(s1,{brighter(l){return l=l==null?AA:Math.pow(AA,l),new er(this.r*l,this.g*l,this.b*l,this.opacity)},darker(l){return l=l==null?h1:Math.pow(h1,l),new er(this.r*l,this.g*l,this.b*l,this.opacity)},rgb(){return this},clamp(){return new er(di(this.r),di(this.g),di(this.b),FA(this.opacity))},displayable(){return-0.5<=this.r&&this.r<255.5&&(-0.5<=this.g&&this.g<255.5)&&(-0.5<=this.b&&this.b<255.5)&&(0<=this.opacity&&this.opacity<=1)},hex:am,formatHex:am,formatHex8:dH,formatRgb:om,toString:om}));function am(){return`#${oi(this.r)}${oi(this.g)}${oi(this.b)}`}function dH(){return`#${oi(this.r)}${oi(this.g)}${oi(this.b)}${oi((isNaN(this.opacity)?1:this.opacity)*255)}`}function om(){let l=FA(this.opacity);return`${l===1?"rgb(":"rgba("}${di(this.r)}, ${di(this.g)}, ${di(this.b)}${l===1?")":`, ${l})`}`}function FA(l){return isNaN(l)?1:Math.max(0,Math.min(1,l))}function di(l){return Math.max(0,Math.min(255,Math.round(l)||0))}function oi(l){return l=di(l),(l<16?"0":"")+l.toString(16)}function dm(l,u,r,f){if(f<=0)l=u=r=NaN;else if(r<=0||r>=1)l=u=NaN;else if(u<=0)l=NaN;return new fn(l,u,r,f)}function lw(l){if(l instanceof fn)return new fn(l.h,l.s,l.l,l.opacity);if(!(l instanceof s1))l=nn(l);if(!l)return new fn;if(l instanceof fn)return l;l=l.rgb();var u=l.r/255,r=l.g/255,f=l.b/255,n=Math.min(u,r,f),t=Math.max(u,r,f),i=NaN,y=t-n,c=(t+n)/2;if(y){if(u===t)i=(r-f)/y+(r0&&c<1?0:i;return new fn(i,y,c,l.opacity)}function uw(l,u,r,f){return arguments.length===1?lw(l):new fn(l,u,r,f==null?1:f)}function fn(l,u,r,f){this.h=+l,this.s=+u,this.l=+r,this.opacity=+f}C1(fn,uw,A9(s1,{brighter(l){return l=l==null?AA:Math.pow(AA,l),new fn(this.h,this.s,this.l*l,this.opacity)},darker(l){return l=l==null?h1:Math.pow(h1,l),new fn(this.h,this.s,this.l*l,this.opacity)},rgb(){var l=this.h%360+(this.h<0)*360,u=isNaN(l)||isNaN(this.s)?0:this.s,r=this.l,f=r+(r<0.5?r:1-r)*u,n=2*r-f;return new er(F9(l>=240?l-240:l+120,n,f),F9(l,n,f),F9(l<120?l+240:l-120,n,f),this.opacity)},clamp(){return new fn(em(this.h),_A(this.s),_A(this.l),FA(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&(0<=this.l&&this.l<=1)&&(0<=this.opacity&&this.opacity<=1)},formatHsl(){let l=FA(this.opacity);return`${l===1?"hsl(":"hsla("}${em(this.h)}, ${_A(this.s)*100}%, ${_A(this.l)*100}%${l===1?")":`, ${l})`}`}}));function em(l){return l=(l||0)%360,l<0?l+360:l}function _A(l){return Math.max(0,Math.min(1,l||0))}function F9(l,u,r){return(l<60?u+(r-u)*l/60:l<180?r:l<240?u+(r-u)*(240-l)/60:u)*255}function j9(l,u,r,f,n){var t=l*l,i=t*l;return((1-3*l+3*t-i)*u+(4-6*t+3*i)*r+(1+3*l+3*t-3*i)*f+i*n)/6}function N9(l){var u=l.length-1;return function(r){var f=r<=0?r=0:r>=1?(r=1,u-1):Math.floor(r*u),n=l[f],t=l[f+1],i=f>0?l[f-1]:2*n-t,y=f()=>l;function lB(l,u){return function(r){return l+r*u}}function uB(l,u,r){return l=Math.pow(l,r),u=Math.pow(u,r)-l,r=1/r,function(f){return Math.pow(l+f*u,r)}}function rw(l){return(l=+l)===1?NA:function(u,r){return r-u?uB(u,r,l):R1(isNaN(u)?r:u)}}function NA(l,u){var r=u-l;return r?lB(l,r):R1(isNaN(l)?u:l)}var ei=function l(u){var r=rw(u);function f(n,t){var i=r((n=Ty(n)).r,(t=Ty(t)).r),y=r(n.g,t.g),c=r(n.b,t.b),_=NA(n.opacity,t.opacity);return function(A){return n.r=i(A),n.g=y(A),n.b=c(A),n.opacity=_(A),n+""}}return f.gamma=l,f}(1);function fw(l){return function(u){var r=u.length,f=Array(r),n=Array(r),t=Array(r),i,y;for(i=0;ir)if(t=u.slice(r,t),y[i])y[i]+=t;else y[++i]=t;if((f=f[0])===(n=n[0]))if(y[i])y[i]+=n;else y[++i]=n;else y[++i]=null,c.push({i,x:pr(f,n)});r=w9.lastIndex}if(r180)A+=360;else if(A-_>180)_+=360;j.push({i:F.push(n(F)+"rotate(",null,f)-2,x:pr(_,A)})}else if(A)F.push(n(F)+"rotate("+A+f)}function y(_,A,F,j){if(_!==A)j.push({i:F.push(n(F)+"skewX(",null,f)-2,x:pr(_,A)});else if(A)F.push(n(F)+"skewX("+A+f)}function c(_,A,F,j,N,U){if(_!==F||A!==j){var w=N.push(n(N)+"scale(",null,",",null,")");U.push({i:w-4,x:pr(_,F)},{i:w-2,x:pr(A,j)})}else if(F!==1||j!==1)N.push(n(N)+"scale("+F+","+j+")")}return function(_,A){var F=[],j=[];return _=l(_),A=l(A),t(_.translateX,_.translateY,A.translateX,A.translateY,F,j),i(_.rotate,A.rotate,F,j),y(_.skewX,A.skewX,F,j),c(_.scaleX,_.scaleY,A.scaleX,A.scaleY,F,j),_=A=null,function(N){var U=-1,w=j.length,G;while(++U=0)l._call.call(void 0,u);l=l._next}--Ey}function Nw(){u0=(wA=g1.now())+qA,Ey=b1=0;try{Qw()}finally{Ey=0,WB(),u0=0}}function GB(){var l=g1.now(),u=l-wA;if(u>Jw)qA-=u,wA=l}function WB(){var l,u=mA,r,f=1/0;while(u)if(u._call){if(f>u._time)f=u._time;l=u,u=u._next}else r=u._next,u._next=null,u=l?l._next=r:mA=r;v1=l,W9(f)}function W9(l){if(Ey)return;if(b1)b1=clearTimeout(b1);var u=l-u0;if(u>24){if(l<1/0)b1=setTimeout(Nw,l-g1.now()-qA);if(x1)x1=clearInterval(x1)}else{if(!x1)wA=g1.now(),x1=setInterval(GB,Jw);Ey=1,Uw(Nw)}}function a1(l,u,r){var f=new k1;return u=u==null?0:+u,f.restart((n)=>{f.stop(),l(n+u)},u,r),f}var KB=Ii("start","end","cancel","interrupt"),EB=[],qw=0,mw=1,WA=2,GA=3,ww=4,TA=5,o1=6;function nt(l,u,r,f,n,t){var i=l.__transition;if(!i)l.__transition={};else if(r in i)return;pB(l,r,{name:u,index:f,group:n,on:KB,tween:EB,time:t.time,delay:t.delay,duration:t.duration,ease:t.ease,timer:null,state:qw})}function d1(l,u){var r=ir(l,u);if(r.state>qw)throw Error("too late; already scheduled");return r}function Ur(l,u){var r=ir(l,u);if(r.state>GA)throw Error("too late; already running");return r}function ir(l,u){var r=l.__transition;if(!r||!(r=r[u]))throw Error("transition not found");return r}function pB(l,u,r){var f=l.__transition,n;f[u]=r,r.timer=LA(t,0,r.time);function t(_){if(r.state=mw,r.timer.restart(i,r.delay,r.time),r.delay<=_)i(_-r.delay)}function i(_){var A,F,j,N;if(r.state!==mw)return c();for(A in f){if(N=f[A],N.name!==r.name)continue;if(N.state===GA)return a1(i);if(N.state===ww)N.state=o1,N.timer.stop(),N.on.call("interrupt",l,l.__data__,N.index,N.group),delete f[A];else if(+AWA&&f.state=0)u=u.slice(0,r);return!u||u==="start"})}function gB(l,u,r){var f,n,t=vB(u)?d1:Ur;return function(){var i=t(this,l),y=i.on;if(y!==f)(n=(f=y).copy()).on(u,r);i.on=n}}function V9(l,u){var r=this._id;return arguments.length<2?ir(this.node(),r).on.on(l):this.each(gB(r,l,u))}function kB(l){return function(){var u=this.parentNode;for(var r in this.__transition)if(+r!==l)return;if(u)u.removeChild(this)}}function S9(){return this.on("end.remove",kB(this._id))}function Y9(l){var u=this._name,r=this._id;if(typeof l!=="function")l=at(l);for(var f=this._groups,n=f.length,t=Array(n),i=0;i()=>l;function v9(l,{sourceEvent:u,target:r,transform:f,dispatch:n}){Object.defineProperties(this,{type:{value:l,enumerable:!0,configurable:!0},sourceEvent:{value:u,enumerable:!0,configurable:!0},target:{value:r,enumerable:!0,configurable:!0},transform:{value:f,enumerable:!0,configurable:!0},_:{value:n}})}function tn(l,u,r){this.k=l,this.x=u,this.y=r}tn.prototype={constructor:tn,scale:function(l){return l===1?this:new tn(this.k*l,this.x,this.y)},translate:function(l,u){return l===0&u===0?this:new tn(this.k,this.x+this.k*l,this.y+this.k*u)},apply:function(l){return[l[0]*this.k+this.x,l[1]*this.k+this.y]},applyX:function(l){return l*this.k+this.x},applyY:function(l){return l*this.k+this.y},invert:function(l){return[(l[0]-this.x)/this.k,(l[1]-this.y)/this.k]},invertX:function(l){return(l-this.x)/this.k},invertY:function(l){return(l-this.y)/this.k},rescaleX:function(l){return l.copy().domain(l.range().map(this.invertX,this).map(l.invert,l))},rescaleY:function(l){return l.copy().domain(l.range().map(this.invertY,this).map(l.invert,l))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var r0=new tn(1,0,0);u$.prototype=tn.prototype;function u$(l){while(!l.__zoom)if(!(l=l.parentNode))return r0;return l.__zoom}function SA(l){l.stopImmediatePropagation()}function f0(l){l.preventDefault(),l.stopImmediatePropagation()}function _D(l){return(!l.ctrlKey||l.type==="wheel")&&!l.button}function AD(){var l=this;if(l instanceof SVGElement){if(l=l.ownerSVGElement||l,l.hasAttribute("viewBox"))return l=l.viewBox.baseVal,[[l.x,l.y],[l.x+l.width,l.y+l.height]];return[[0,0],[l.width.baseVal.value,l.height.baseVal.value]]}return[[0,0],[l.clientWidth,l.clientHeight]]}function Ww(){return this.__zoom||r0}function FD(l){return-l.deltaY*(l.deltaMode===1?0.05:l.deltaMode?1:0.002)*(l.ctrlKey?10:1)}function jD(){return navigator.maxTouchPoints||"ontouchstart"in this}function ND(l,u,r){var f=l.invertX(u[0][0])-r[0][0],n=l.invertX(u[1][0])-r[1][0],t=l.invertY(u[0][1])-r[0][1],i=l.invertY(u[1][1])-r[1][1];return l.translate(n>f?(f+n)/2:Math.min(0,f)||Math.max(0,n),i>t?(t+i)/2:Math.min(0,t)||Math.max(0,i))}function r$(){var l=_D,u=AD,r=ND,f=FD,n=jD,t=[0,1/0],i=[[-1/0,-1/0],[1/0,1/0]],y=250,c=l0,_=Ii("start","zoom","end"),A,F,j,N=500,U=150,w=0,G=10;function J(E){E.property("__zoom",Ww).on("wheel.zoom",Z,{passive:!1}).on("mousedown.zoom",V).on("dblclick.zoom",P).filter(n).on("touchstart.zoom",H).on("touchmove.zoom",B).on("touchend.zoom touchcancel.zoom",C).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}J.transform=function(E,D,Y,v){var K=E.selection?E.selection():E;if(K.property("__zoom",Ww),E!==K)W(E,D,Y,v);else K.interrupt().each(function(){p(this,arguments).event(v).start().zoom(null,typeof D==="function"?D.apply(this,arguments):D).end()})},J.scaleBy=function(E,D,Y,v){J.scaleTo(E,function(){var K=this.__zoom.k,X=typeof D==="function"?D.apply(this,arguments):D;return K*X},Y,v)},J.scaleTo=function(E,D,Y,v){J.transform(E,function(){var K=u.apply(this,arguments),X=this.__zoom,I=Y==null?q(K):typeof Y==="function"?Y.apply(this,arguments):Y,o=X.invert(I),fl=typeof D==="function"?D.apply(this,arguments):D;return r(m(Q(X,fl),I,o),K,i)},Y,v)},J.translateBy=function(E,D,Y,v){J.transform(E,function(){return r(this.__zoom.translate(typeof D==="function"?D.apply(this,arguments):D,typeof Y==="function"?Y.apply(this,arguments):Y),u.apply(this,arguments),i)},null,v)},J.translateTo=function(E,D,Y,v,K){J.transform(E,function(){var X=u.apply(this,arguments),I=this.__zoom,o=v==null?q(X):typeof v==="function"?v.apply(this,arguments):v;return r(r0.translate(o[0],o[1]).scale(I.k).translate(typeof D==="function"?-D.apply(this,arguments):-D,typeof Y==="function"?-Y.apply(this,arguments):-Y),X,i)},v,K)};function Q(E,D){return D=Math.max(t[0],Math.min(t[1],D)),D===E.k?E:new tn(D,E.x,E.y)}function m(E,D,Y){var v=D[0]-Y[0]*E.k,K=D[1]-Y[1]*E.k;return v===E.x&&K===E.y?E:new tn(E.k,v,K)}function q(E){return[(+E[0][0]+ +E[1][0])/2,(+E[0][1]+ +E[1][1])/2]}function W(E,D,Y,v){E.on("start.zoom",function(){p(this,arguments).event(v).start()}).on("interrupt.zoom end.zoom",function(){p(this,arguments).event(v).end()}).tween("zoom",function(){var K=this,X=arguments,I=p(K,X).event(v),o=u.apply(K,X),fl=Y==null?q(o):typeof Y==="function"?Y.apply(K,X):Y,yl=Math.max(o[1][0]-o[0][0],o[1][1]-o[0][1]),h=K.__zoom,s=typeof D==="function"?D.apply(K,X):D,ul=c(h.invert(fl).concat(yl/h.k),s.invert(fl).concat(yl/s.k));return function(tl){if(tl===1)tl=s;else{var Al=ul(tl),Kl=yl/Al[2];tl=new tn(Kl,fl[0]-Al[0]*Kl,fl[1]-Al[1]*Kl)}I.zoom(null,tl)}})}function p(E,D,Y){return!Y&&E.__zooming||new O(E,D)}function O(E,D){this.that=E,this.args=D,this.active=0,this.sourceEvent=null,this.extent=u.apply(E,D),this.taps=0}O.prototype={event:function(E){if(E)this.sourceEvent=E;return this},start:function(){if(++this.active===1)this.that.__zooming=this,this.emit("start");return this},zoom:function(E,D){if(this.mouse&&E!=="mouse")this.mouse[1]=D.invert(this.mouse[0]);if(this.touch0&&E!=="touch")this.touch0[1]=D.invert(this.touch0[0]);if(this.touch1&&E!=="touch")this.touch1[1]=D.invert(this.touch1[0]);return this.that.__zoom=D,this.emit("zoom"),this},end:function(){if(--this.active===0)delete this.that.__zooming,this.emit("end");return this},emit:function(E){var D=tr(this.that).datum();_.call(E,this.that,new v9(E,{sourceEvent:this.sourceEvent,target:J,type:E,transform:this.that.__zoom,dispatch:_}),D)}};function Z(E,...D){if(!l.apply(this,arguments))return;var Y=p(this,D).event(E),v=this.__zoom,K=Math.max(t[0],Math.min(t[1],v.k*Math.pow(2,f.apply(this,arguments)))),X=Er(E);if(Y.wheel){if(Y.mouse[0][0]!==X[0]||Y.mouse[0][1]!==X[1])Y.mouse[1]=v.invert(Y.mouse[0]=X);clearTimeout(Y.wheel)}else if(v.k===K)return;else Y.mouse=[X,v.invert(X)],dt(this),Y.start();f0(E),Y.wheel=setTimeout(I,U),Y.zoom("mouse",r(m(Q(v,K),Y.mouse[0],Y.mouse[1]),Y.extent,i));function I(){Y.wheel=null,Y.end()}}function V(E,...D){if(j||!l.apply(this,arguments))return;var Y=E.currentTarget,v=p(this,D,!0).event(E),K=tr(E.view).on("mousemove.zoom",fl,!0).on("mouseup.zoom",yl,!0),X=Er(E,Y),I=E.clientX,o=E.clientY;Gy(E.view),SA(E),v.mouse=[X,this.__zoom.invert(X)],dt(this),v.start();function fl(h){if(f0(h),!v.moved){var s=h.clientX-I,ul=h.clientY-o;v.moved=s*s+ul*ul>w}v.event(h).zoom("mouse",r(m(v.that.__zoom,v.mouse[0]=Er(h,Y),v.mouse[1]),v.extent,i))}function yl(h){K.on("mousemove.zoom mouseup.zoom",null),S1(h.view,v.moved),f0(h),v.event(h).end()}}function P(E,...D){if(!l.apply(this,arguments))return;var Y=this.__zoom,v=Er(E.changedTouches?E.changedTouches[0]:E,this),K=Y.invert(v),X=Y.k*(E.shiftKey?0.5:2),I=r(m(Q(Y,X),v,K),u.apply(this,D),i);if(f0(E),y>0)tr(this).transition().duration(y).call(W,I,v,E);else tr(this).call(J.transform,I,v,E)}function H(E,...D){if(!l.apply(this,arguments))return;var Y=E.touches,v=Y.length,K=p(this,D,E.changedTouches.length===v).event(E),X,I,o,fl;SA(E);for(I=0;I"[React Flow]: Seems like you have not used zustand provider as an ancestor. Help: https://reactflow.dev/error#001",error002:()=>"It looks like you've created a new nodeTypes or edgeTypes object. If this wasn't on purpose please define the nodeTypes/edgeTypes outside of the component or memoize them.",error003:(l)=>`Node type "${l}" not found. Using fallback type "default".`,error004:()=>"The React Flow parent container needs a width and a height to render the graph.",error005:()=>"Only child nodes can use a parent extent.",error006:()=>"Can't create edge. An edge needs a source and a target.",error007:(l)=>`The old edge with id=${l} does not exist.`,error009:(l)=>`Marker type "${l}" doesn't exist.`,error008:(l,{id:u,sourceHandle:r,targetHandle:f})=>`Couldn't create edge for ${l} handle id: "${l==="source"?r:f}", edge id: ${u}.`,error010:()=>"Handle: No node id found. Make sure to only use a Handle inside a custom Node.",error011:(l)=>`Edge type "${l}" not found. Using fallback type "default".`,error012:(l)=>`Node with id "${l}" does not exist, it may have been removed. This can happen when a node is deleted before the "onNodeClick" handler is called.`,error013:(l="react")=>`It seems that you haven't loaded the styles. Please import '@xyflow/${l}/dist/style.css' or base.css to make sure everything is working properly.`,error014:()=>"useNodeConnections: No node ID found. Call useNodeConnections inside a custom Node or provide a node ID.",error015:()=>"It seems that you are trying to drag a node that is not initialized. Please use onNodesChange as explained in the docs."},By=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],o9=["Enter"," ","Escape"],d9={"node.a11yDescription.default":"Press enter or space to select a node. Press delete to remove it and escape to cancel.","node.a11yDescription.keyboardDisabled":"Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.","node.a11yDescription.ariaLiveMessage":({direction:l,x:u,y:r})=>`Moved selected node ${l}. New position, x: ${u}, y: ${r}`,"edge.a11yDescription.default":"Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.","controls.ariaLabel":"Control Panel","controls.zoomIn.ariaLabel":"Zoom In","controls.zoomOut.ariaLabel":"Zoom Out","controls.fitView.ariaLabel":"Fit View","controls.interactive.ariaLabel":"Toggle Interactivity","minimap.ariaLabel":"Mini Map","handle.ariaLabel":"Handle"},ui;(function(l){l.Strict="strict",l.Loose="loose"})(ui||(ui={}));var it;(function(l){l.Free="free",l.Vertical="vertical",l.Horizontal="horizontal"})(it||(it={}));var n0;(function(l){l.Partial="partial",l.Full="full"})(n0||(n0={}));var e9={inProgress:!1,isValid:null,from:null,fromHandle:null,fromPosition:null,fromNode:null,to:null,toHandle:null,toPosition:null,toNode:null,pointer:null},pn;(function(l){l.Bezier="default",l.Straight="straight",l.Step="step",l.SmoothStep="smoothstep",l.SimpleBezier="simplebezier"})(pn||(pn={}));var ri;(function(l){l.Arrow="arrow",l.ArrowClosed="arrowclosed"})(ri||(ri={}));var Ol;(function(l){l.Left="left",l.Top="top",l.Right="right",l.Bottom="bottom"})(Ol||(Ol={}));var Tw={[Ol.Left]:Ol.Right,[Ol.Right]:Ol.Left,[Ol.Top]:Ol.Bottom,[Ol.Bottom]:Ol.Top};function lF(l){return l===null?null:l?"valid":"invalid"}var uF=(l)=>("id"in l)&&("source"in l)&&("target"in l),Xw=(l)=>("id"in l)&&("position"in l)&&!("source"in l)&&!("target"in l),rF=(l)=>("id"in l)&&("internals"in l)&&!("source"in l)&&!("target"in l);var t$=(l,u=[0,0])=>{let{width:r,height:f}=zn(l),n=l.origin??u,t=r*n[0],i=f*n[1];return{x:l.position.x-t,y:l.position.y-i}},fF=(l,u={nodeOrigin:[0,0]})=>{if(l.length===0)return{x:0,y:0,width:0,height:0};let r=l.reduce((f,n)=>{let t=typeof n==="string",i=!u.nodeLookup&&!t?n:void 0;if(u.nodeLookup)i=t?u.nodeLookup.get(n):!rF(n)?u.nodeLookup.get(n.id):n;let y=i?PA(i,u.nodeOrigin):{x:0,y:0,x2:0,y2:0};return hA(f,y)},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return MA(r)},Dy=(l,u={})=>{let r={x:1/0,y:1/0,x2:-1/0,y2:-1/0},f=!1;return l.forEach((n)=>{if(u.filter===void 0||u.filter(n))r=hA(r,PA(n)),f=!0}),f?MA(r):{x:0,y:0,width:0,height:0}},CA=(l,u,[r,f,n]=[0,0,1],t=!1,i=!1)=>{let y={...Yy(u,[r,f,n]),width:u.width/n,height:u.height/n},c=[];for(let _ of l.values()){let{measured:A,selectable:F=!0,hidden:j=!1}=_;if(i&&!F||j)continue;let N=A.width??_.width??_.initialWidth??null,U=A.height??_.height??_.initialHeight??null,w=Vy(y,i0(_)),G=(N??0)*(U??0),J=t&&w>0;if(!_.internals.handleBounds||J||w>=G||_.dragging)c.push(_)}return c},Pw=(l,u)=>{let r=new Set;return l.forEach((f)=>{r.add(f.id)}),u.filter((f)=>r.has(f.source)||r.has(f.target))};function JD(l,u){let r=new Map,f=u?.nodes?new Set(u.nodes.map((n)=>n.id)):null;return l.forEach((n)=>{if(n.measured.width&&n.measured.height&&(u?.includeHiddenNodes||!n.hidden)&&(!f||f.has(n.id)))r.set(n.id,n)}),r}async function Cw({nodes:l,width:u,height:r,panZoom:f,minZoom:n,maxZoom:t},i){if(l.size===0)return Promise.resolve(!0);let y=JD(l,i),c=Dy(y),_=i$(c,u,r,i?.minZoom??n,i?.maxZoom??t,i?.padding??0.1);return await f.setViewport(_,{duration:i?.duration,ease:i?.ease,interpolate:i?.interpolate}),Promise.resolve(!0)}function nF({nodeId:l,nextPosition:u,nodeLookup:r,nodeOrigin:f=[0,0],nodeExtent:n,onError:t}){let i=r.get(l),y=i.parentId?r.get(i.parentId):void 0,{x:c,y:_}=y?y.internals.positionAbsolute:{x:0,y:0},A=i.origin??f,F=i.extent||n;if(i.extent==="parent"&&!i.expandParent)if(!y)t?.("005",mf.error005());else{let N=y.measured.width,U=y.measured.height;if(N&&U)F=[[c,_],[c+N,_+U]]}else if(y&&Hy(i.extent))F=[[i.extent[0][0]+c,i.extent[0][1]+_],[i.extent[1][0]+c,i.extent[1][1]+_]];let j=Hy(F)?t0(u,F,i.measured):u;if(i.measured.width===void 0||i.measured.height===void 0)t?.("015",mf.error015());return{position:{x:j.x-c+(i.measured.width??0)*A[0],y:j.y-_+(i.measured.height??0)*A[1]},positionAbsolute:j}}async function hw({nodesToRemove:l=[],edgesToRemove:u=[],nodes:r,edges:f,onBeforeDelete:n}){let t=new Set(l.map((j)=>j.id)),i=[];for(let j of r){if(j.deletable===!1)continue;let N=t.has(j.id),U=!N&&j.parentId&&i.find((w)=>w.id===j.parentId);if(N||U)i.push(j)}let y=new Set(u.map((j)=>j.id)),c=f.filter((j)=>j.deletable!==!1),A=Pw(i,c);for(let j of c)if(y.has(j.id)&&!A.find((U)=>U.id===j.id))A.push(j);if(!n)return{edges:A,nodes:i};let F=await n({nodes:i,edges:A});if(typeof F==="boolean")return F?{edges:A,nodes:i}:{edges:[],nodes:[]};return F}var Zy=(l,u=0,r=1)=>Math.min(Math.max(l,u),r),t0=(l={x:0,y:0},u,r)=>({x:Zy(l.x,u[0][0],u[1][0]-(r?.width??0)),y:Zy(l.y,u[0][1],u[1][1]-(r?.height??0))});function Mw(l,u,r){let{width:f,height:n}=zn(r),{x:t,y:i}=r.internals.positionAbsolute;return t0(l,[[t,i],[t+f,i+n]],u)}var Kw=(l,u,r)=>{if(lr)return-Zy(Math.abs(l-r),1,u)/u;return 0},sw=(l,u,r=15,f=40)=>{let n=Kw(l.x,f,u.width-f)*r,t=Kw(l.y,f,u.height-f)*r;return[n,t]},hA=(l,u)=>({x:Math.min(l.x,u.x),y:Math.min(l.y,u.y),x2:Math.max(l.x2,u.x2),y2:Math.max(l.y2,u.y2)}),a9=({x:l,y:u,width:r,height:f})=>({x:l,y:u,x2:l+r,y2:u+f}),MA=({x:l,y:u,x2:r,y2:f})=>({x:l,y:u,width:r-l,height:f-u}),i0=(l,u=[0,0])=>{let{x:r,y:f}=rF(l)?l.internals.positionAbsolute:t$(l,u);return{x:r,y:f,width:l.measured?.width??l.width??l.initialWidth??0,height:l.measured?.height??l.height??l.initialHeight??0}},PA=(l,u=[0,0])=>{let{x:r,y:f}=rF(l)?l.internals.positionAbsolute:t$(l,u);return{x:r,y:f,x2:r+(l.measured?.width??l.width??l.initialWidth??0),y2:f+(l.measured?.height??l.height??l.initialHeight??0)}},tF=(l,u)=>MA(hA(a9(l),a9(u))),Vy=(l,u)=>{let r=Math.max(0,Math.min(l.x+l.width,u.x+u.width)-Math.max(l.x,u.x)),f=Math.max(0,Math.min(l.y+l.height,u.y+u.height)-Math.max(l.y,u.y));return Math.ceil(r*f)},iF=(l)=>Vf(l.width)&&Vf(l.height)&&Vf(l.x)&&Vf(l.y),Vf=(l)=>!isNaN(l)&&isFinite(l),yF=(l,u)=>{},Sy=(l,u=[1,1])=>{return{x:u[0]*Math.round(l.x/u[0]),y:u[1]*Math.round(l.y/u[1])}},Yy=({x:l,y:u},[r,f,n],t=!1,i=[1,1])=>{let y={x:(l-r)/n,y:(u-f)/n};return t?Sy(y,i):y},n$=({x:l,y:u},[r,f,n])=>{return{x:l*n+r,y:u*n+f}};function zy(l,u){if(typeof l==="number")return Math.floor((u-u/(1+l))*0.5);if(typeof l==="string"&&l.endsWith("px")){let r=parseFloat(l);if(!Number.isNaN(r))return Math.floor(r)}if(typeof l==="string"&&l.endsWith("%")){let r=parseFloat(l);if(!Number.isNaN(r))return Math.floor(u*r*0.01)}return console.error(`[React Flow] The padding value "${l}" is invalid. Please provide a number or a string with a valid unit (px or %).`),0}function UD(l,u,r){if(typeof l==="string"||typeof l==="number"){let f=zy(l,r),n=zy(l,u);return{top:f,right:n,bottom:f,left:n,x:n*2,y:f*2}}if(typeof l==="object"){let f=zy(l.top??l.y??0,r),n=zy(l.bottom??l.y??0,r),t=zy(l.left??l.x??0,u),i=zy(l.right??l.x??0,u);return{top:f,right:i,bottom:n,left:t,x:t+i,y:f+n}}return{top:0,right:0,bottom:0,left:0,x:0,y:0}}function QD(l,u,r,f,n,t){let{x:i,y}=n$(l,[u,r,f]),{x:c,y:_}=n$({x:l.x+l.width,y:l.y+l.height},[u,r,f]),A=n-c,F=t-_;return{left:Math.floor(i),top:Math.floor(y),right:Math.floor(A),bottom:Math.floor(F)}}var i$=(l,u,r,f,n,t)=>{let i=UD(t,u,r),y=(u-i.x)/l.width,c=(r-i.y)/l.height,_=Math.min(y,c),A=Zy(_,f,n),F=l.x+l.width/2,j=l.y+l.height/2,N=u/2-F*A,U=r/2-j*A,w=QD(l,N,U,A,u,r),G={left:Math.min(w.left-i.left,0),top:Math.min(w.top-i.top,0),right:Math.min(w.right-i.right,0),bottom:Math.min(w.bottom-i.bottom,0)};return{x:N-G.left+G.right,y:U-G.top+G.bottom,zoom:A}},Xy=()=>typeof navigator<"u"&&navigator?.userAgent?.indexOf("Mac")>=0;function Hy(l){return l!==void 0&&l!==null&&l!=="parent"}function zn(l){return{width:l.measured?.width??l.width??l.initialWidth??0,height:l.measured?.height??l.height??l.initialHeight??0}}function cF(l){return(l.measured?.width??l.width??l.initialWidth)!==void 0&&(l.measured?.height??l.height??l.initialHeight)!==void 0}function $F(l,u={width:0,height:0},r,f,n){let t={...l},i=f.get(r);if(i){let y=i.origin||n;t.x+=i.internals.positionAbsolute.x-(u.width??0)*y[0],t.y+=i.internals.positionAbsolute.y-(u.height??0)*y[1]}return t}function _F(l,u){if(l.size!==u.size)return!1;for(let r of l)if(!u.has(r))return!1;return!0}function Rw(){let l,u;return{promise:new Promise((f,n)=>{l=f,u=n}),resolve:l,reject:u}}function xw(l){return{...d9,...l||{}}}function f$(l,{snapGrid:u=[0,0],snapToGrid:r=!1,transform:f,containerBounds:n}){let{x:t,y:i}=Sf(l),y=Yy({x:t-(n?.left??0),y:i-(n?.top??0)},f),{x:c,y:_}=r?Sy(y,u):y;return{xSnapped:c,ySnapped:_,...y}}var sA=(l)=>({width:l.offsetWidth,height:l.offsetHeight}),AF=(l)=>l?.getRootNode?.()||window?.document,mD=["INPUT","SELECT","TEXTAREA"];function FF(l){let u=l.composedPath?.()?.[0]||l.target;if(u?.nodeType!==1)return!1;return mD.includes(u.nodeName)||u.hasAttribute("contenteditable")||!!u.closest(".nokey")}var jF=(l)=>("clientX"in l),Sf=(l,u)=>{let r=jF(l),f=r?l.clientX:l.touches?.[0].clientX,n=r?l.clientY:l.touches?.[0].clientY;return{x:f-(u?.left??0),y:n-(u?.top??0)}},Ew=(l,u,r,f,n)=>{let t=u.querySelectorAll(`.${l}`);if(!t||!t.length)return null;return Array.from(t).map((i)=>{let y=i.getBoundingClientRect();return{id:i.getAttribute("data-handleid"),type:l,nodeId:n,position:i.getAttribute("data-handlepos"),x:(y.left-r.left)/f,y:(y.top-r.top)/f,...sA(i)}})};function RA({sourceX:l,sourceY:u,targetX:r,targetY:f,sourceControlX:n,sourceControlY:t,targetControlX:i,targetControlY:y}){let c=l*0.125+n*0.375+i*0.375+r*0.125,_=u*0.125+t*0.375+y*0.375+f*0.125,A=Math.abs(c-l),F=Math.abs(_-u);return[c,_,A,F]}function YA(l,u){if(l>=0)return 0.5*l;return u*25*Math.sqrt(-l)}function pw({pos:l,x1:u,y1:r,x2:f,y2:n,c:t}){switch(l){case Ol.Left:return[u-YA(u-f,t),r];case Ol.Right:return[u+YA(f-u,t),r];case Ol.Top:return[u,r-YA(r-n,t)];case Ol.Bottom:return[u,r+YA(n-r,t)]}}function xA({sourceX:l,sourceY:u,sourcePosition:r=Ol.Bottom,targetX:f,targetY:n,targetPosition:t=Ol.Top,curvature:i=0.25}){let[y,c]=pw({pos:r,x1:l,y1:u,x2:f,y2:n,c:i}),[_,A]=pw({pos:t,x1:f,y1:n,x2:l,y2:u,c:i}),[F,j,N,U]=RA({sourceX:l,sourceY:u,targetX:f,targetY:n,sourceControlX:y,sourceControlY:c,targetControlX:_,targetControlY:A});return[`M${l},${u} C${y},${c} ${_},${A} ${f},${n}`,F,j,N,U]}function NF({sourceX:l,sourceY:u,targetX:r,targetY:f}){let n=Math.abs(r-l)/2,t=r0}var wD=({source:l,sourceHandle:u,target:r,targetHandle:f})=>`xy-edge__${l}${u||""}-${r}${f||""}`,qD=(l,u)=>{return u.some((r)=>r.source===l.source&&r.target===l.target&&(r.sourceHandle===l.sourceHandle||!r.sourceHandle&&!l.sourceHandle)&&(r.targetHandle===l.targetHandle||!r.targetHandle&&!l.targetHandle))},JF=(l,u,r={})=>{if(!l.source||!l.target)return yF("006",mf.error006()),u;let f=r.getEdgeId||wD,n;if(uF(l))n={...l};else n={...l,id:f(l)};if(qD(n,u))return u;if(n.sourceHandle===null)delete n.sourceHandle;if(n.targetHandle===null)delete n.targetHandle;return u.concat(n)};function bA({sourceX:l,sourceY:u,targetX:r,targetY:f}){let[n,t,i,y]=NF({sourceX:l,sourceY:u,targetX:r,targetY:f});return[`M ${l},${u}L ${r},${f}`,n,t,i,y]}var zw={[Ol.Left]:{x:-1,y:0},[Ol.Right]:{x:1,y:0},[Ol.Top]:{x:0,y:-1},[Ol.Bottom]:{x:0,y:1}},LD=({source:l,sourcePosition:u=Ol.Bottom,target:r})=>{if(u===Ol.Left||u===Ol.Right)return l.xMath.sqrt(Math.pow(u.x-l.x,2)+Math.pow(u.y-l.y,2));function GD({source:l,sourcePosition:u=Ol.Bottom,target:r,targetPosition:f=Ol.Top,center:n,offset:t,stepPosition:i}){let y=zw[u],c=zw[f],_={x:l.x+y.x*t,y:l.y+y.y*t},A={x:r.x+c.x*t,y:r.y+c.y*t},F=LD({source:_,sourcePosition:u,target:A}),j=F.x!==0?"x":"y",N=F[j],U=[],w,G,J={x:0,y:0},Q={x:0,y:0},[,,m,q]=NF({sourceX:l.x,sourceY:l.y,targetX:r.x,targetY:r.y});if(y[j]*c[j]===-1){if(j==="x")w=n.x??_.x+(A.x-_.x)*i,G=n.y??(_.y+A.y)/2;else w=n.x??(_.x+A.x)/2,G=n.y??_.y+(A.y-_.y)*i;let Z=[{x:w,y:_.y},{x:w,y:A.y}],V=[{x:_.x,y:G},{x:A.x,y:G}];if(y[j]===N)U=j==="x"?Z:V;else U=j==="x"?V:Z}else{let Z=[{x:_.x,y:A.y}],V=[{x:A.x,y:_.y}];if(j==="x")U=y.x===N?V:Z;else U=y.y===N?Z:V;if(u===f){let E=Math.abs(l[j]-r[j]);if(E<=t){let D=Math.min(t-1,t-E);if(y[j]===N)J[j]=(_[j]>l[j]?-1:1)*D;else Q[j]=(A[j]>r[j]?-1:1)*D}}if(u!==f){let E=j==="x"?"y":"x",D=y[j]===c[E],Y=_[E]>A[E],v=_[E]=C)w=(P.x+H.x)/2,G=U[0].y;else w=U[0].x,G=(P.y+H.y)/2}let W={x:_.x+J.x,y:_.y+J.y},p={x:A.x+Q.x,y:A.y+Q.y};return[[l,...W.x!==U[0].x||W.y!==U[0].y?[W]:[],...U,...p.x!==U[U.length-1].x||p.y!==U[U.length-1].y?[p]:[],r],w,G,m,q]}function WD(l,u,r,f){let n=Math.min(Ow(l,u)/2,Ow(u,r)/2,f),{x:t,y:i}=u;if(l.x===t&&t===r.x||l.y===i&&i===r.y)return`L${t} ${i}`;if(l.y===i){let _=l.xr.id===u))||null}function vA(l,u){if(!l)return"";if(typeof l==="string")return l;return`${u?`${u}__`:""}${Object.keys(l).sort().map((f)=>`${f}=${l[f]}`).join("&")}`}function kw(l,{id:u,defaultColor:r,defaultMarkerStart:f,defaultMarkerEnd:n}){let t=new Set;return l.reduce((i,y)=>{return[y.markerStart||f,y.markerEnd||n].forEach((c)=>{if(c&&typeof c==="object"){let _=vA(c,u);if(!t.has(_))i.push({id:_,color:c.color||r,...c}),t.add(_)}}),i},[]).sort((i,y)=>i.id.localeCompare(y.id))}var Iw=1000,TD=10,UF={nodeOrigin:[0,0],nodeExtent:By,elevateNodesOnSelect:!0,zIndexMode:"basic",defaults:{}},KD={...UF,checkEquality:!0};function QF(l,u){let r={...l};for(let f in u)if(u[f]!==void 0)r[f]=u[f];return r}function aw(l,u,r){let f=QF(UF,r);for(let n of l.values())if(n.parentId)wF(n,l,u,f);else{let t=t$(n,f.nodeOrigin),i=Hy(n.extent)?n.extent:f.nodeExtent,y=t0(t,i,zn(n));n.internals.positionAbsolute=y}}function ED(l,u){if(!l.handles)return!l.measured?void 0:u?.internals.handleBounds;let r=[],f=[];for(let n of l.handles){let t={id:n.id,width:n.width??1,height:n.height??1,nodeId:l.id,x:n.x,y:n.y,position:n.position,type:n.type};if(n.type==="source")r.push(t);else if(n.type==="target")f.push(t)}return{source:r,target:f}}function mF(l){return l==="manual"}function gA(l,u,r,f={}){let n=QF(KD,f),t={i:0},i=new Map(u),y=n?.elevateNodesOnSelect&&!mF(n.zIndexMode)?Iw:0,c=l.length>0,_=!1;u.clear(),r.clear();for(let A of l){let F=i.get(A.id);if(n.checkEquality&&A===F?.internals.userNode)u.set(A.id,F);else{let j=t$(A,n.nodeOrigin),N=Hy(A.extent)?A.extent:n.nodeExtent,U=t0(j,N,zn(A));F={...n.defaults,...A,measured:{width:A.measured?.width,height:A.measured?.height},internals:{positionAbsolute:U,handleBounds:ED(A,F),z:ow(A,y,n.zIndexMode),userNode:A}},u.set(A.id,F)}if((F.measured===void 0||F.measured.width===void 0||F.measured.height===void 0)&&!F.hidden)c=!1;if(A.parentId)wF(F,u,r,f,t);_||=A.selected??!1}return{nodesInitialized:c,hasSelectedNodes:_}}function pD(l,u){if(!l.parentId)return;let r=u.get(l.parentId);if(r)r.set(l.id,l);else u.set(l.parentId,new Map([[l.id,l]]))}function wF(l,u,r,f,n){let{elevateNodesOnSelect:t,nodeOrigin:i,nodeExtent:y,zIndexMode:c}=QF(UF,f),_=l.parentId,A=u.get(_);if(!A){console.warn(`Parent node ${_} not found. Please make sure that parent nodes are in front of their child nodes in the nodes array.`);return}if(pD(l,r),n&&!A.parentId&&A.internals.rootParentIndex===void 0&&c==="auto")A.internals.rootParentIndex=++n.i,A.internals.z=A.internals.z+n.i*TD;if(n&&A.internals.rootParentIndex!==void 0)n.i=A.internals.rootParentIndex;let F=t&&!mF(c)?Iw:0,{x:j,y:N,z:U}=zD(l,A,i,y,F,c),{positionAbsolute:w}=l.internals,G=j!==w.x||N!==w.y;if(G||U!==l.internals.z)u.set(l.id,{...l,internals:{...l.internals,positionAbsolute:G?{x:j,y:N}:w,z:U}})}function ow(l,u,r){let f=Vf(l.zIndex)?l.zIndex:0;if(mF(r))return f;return f+(l.selected?u:0)}function zD(l,u,r,f,n,t){let{x:i,y}=u.internals.positionAbsolute,c=zn(l),_=t$(l,r),A=Hy(l.extent)?t0(_,l.extent,c):_,F=t0({x:i+A.x,y:y+A.y},f,c);if(l.extent==="parent")F=Mw(F,c,u);let j=ow(l,n,t),N=u.internals.z??0;return{x:F.x,y:F.y,z:N>=j?N+1:j}}function kA(l,u,r,f=[0,0]){let n=[],t=new Map;for(let i of l){let y=u.get(i.parentId);if(!y)continue;let c=t.get(i.parentId)?.expandedRect??i0(y),_=tF(c,i.rect);t.set(i.parentId,{expandedRect:_,parent:y})}if(t.size>0)t.forEach(({expandedRect:i,parent:y},c)=>{let _=y.internals.positionAbsolute,A=zn(y),F=y.origin??f,j=i.x<_.x?Math.round(Math.abs(_.x-i.x)):0,N=i.y<_.y?Math.round(Math.abs(_.y-i.y)):0,U=Math.max(A.width,Math.round(i.width)),w=Math.max(A.height,Math.round(i.height)),G=(U-A.width)*F[0],J=(w-A.height)*F[1];if(j>0||N>0||G||J)n.push({id:c,type:"position",position:{x:y.position.x-j+G,y:y.position.y-N+J}}),r.get(c)?.forEach((Q)=>{if(!l.some((m)=>m.id===Q.id))n.push({id:Q.id,type:"position",position:{x:Q.position.x+j,y:Q.position.y+N}})});if(A.width0){let N=kA(j,u,r,n);_.push(...N)}return{changes:_,updatedInternals:c}}async function ew({delta:l,panZoom:u,transform:r,translateExtent:f,width:n,height:t}){if(!u||!l.x&&!l.y)return Promise.resolve(!1);let i=await u.setViewportConstrained({x:r[0]+l.x,y:r[1]+l.y,zoom:r[2]},[[0,0],[n,t]],f),y=!!i&&(i.x!==r[0]||i.y!==r[1]||i.k!==r[2]);return Promise.resolve(y)}function Dw(l,u,r,f,n,t){let i=n,y=f.get(i)||new Map;f.set(i,y.set(r,u)),i=`${n}-${l}`;let c=f.get(i)||new Map;if(f.set(i,c.set(r,u)),t){i=`${n}-${l}-${t}`;let _=f.get(i)||new Map;f.set(i,_.set(r,u))}}function qF(l,u,r){l.clear(),u.clear();for(let f of r){let{source:n,target:t,sourceHandle:i=null,targetHandle:y=null}=f,c={edgeId:f.id,source:n,target:t,sourceHandle:i,targetHandle:y},_=`${n}-${i}--${t}-${y}`,A=`${t}-${y}--${n}-${i}`;Dw("source",c,A,l,n,i),Dw("target",c,_,l,t,y),u.set(f.id,f)}}function lq(l,u){if(!l.parentId)return!1;let r=u.get(l.parentId);if(!r)return!1;if(r.selected)return!0;return lq(r,u)}function Vw(l,u,r){let f=l;do{if(f?.matches?.(u))return!0;if(f===r)return!1;f=f?.parentElement}while(f);return!1}function OD(l,u,r,f){let n=new Map;for(let[t,i]of l)if((i.selected||i.id===f)&&(!i.parentId||!lq(i,l))&&(i.draggable||u&&typeof i.draggable>"u")){let y=l.get(t);if(y)n.set(t,{id:t,position:y.position||{x:0,y:0},distance:{x:r.x-y.internals.positionAbsolute.x,y:r.y-y.internals.positionAbsolute.y},extent:y.extent,parentId:y.parentId,origin:y.origin,expandParent:y.expandParent,internals:{positionAbsolute:y.internals.positionAbsolute||{x:0,y:0}},measured:{width:y.measured.width??0,height:y.measured.height??0}})}return n}function g9({nodeId:l,dragItems:u,nodeLookup:r,dragging:f=!0}){let n=[];for(let[i,y]of u){let c=r.get(i)?.internals.userNode;if(c)n.push({...c,position:y.position,dragging:f})}if(!l)return[n[0],n];let t=r.get(l)?.internals.userNode;return[!t?n[0]:{...t,position:u.get(l)?.position||t.position,dragging:f},n]}function ZD({dragItems:l,snapGrid:u,x:r,y:f}){let n=l.values().next().value;if(!n)return null;let t={x:r-n.distance.x,y:f-n.distance.y},i=Sy(t,u);return{x:i.x-t.x,y:i.y-t.y}}function uq({onNodeMouseDown:l,getStoreItems:u,onDragStart:r,onDrag:f,onDragStop:n}){let t={x:null,y:null},i=0,y=new Map,c=!1,_={x:0,y:0},A=null,F=!1,j=null,N=!1,U=!1,w=null;function G({noDragClassName:Q,handleSelector:m,domNode:q,isSelectable:W,nodeId:p,nodeClickDistance:O=0}){j=tr(q);function Z({x:B,y:C}){let{nodeLookup:E,nodeExtent:D,snapGrid:Y,snapToGrid:v,nodeOrigin:K,onNodeDrag:X,onSelectionDrag:I,onError:o,updateNodePositions:fl}=u();t={x:B,y:C};let yl=!1,h=y.size>1,s=h&&D?a9(Dy(y)):null,ul=h&&v?ZD({dragItems:y,snapGrid:Y,x:B,y:C}):null;for(let[tl,Al]of y){if(!E.has(tl))continue;let Kl={x:B-Al.distance.x,y:C-Al.distance.y};if(v)Kl=ul?{x:Math.round(Kl.x+ul.x),y:Math.round(Kl.y+ul.y)}:Sy(Kl,Y);let wl=null;if(h&&D&&!Al.extent&&s){let{positionAbsolute:d}=Al.internals,nl=d.x-s.x+D[0][0],k=d.x+Al.measured.width-s.x2+D[1][0],g=d.y-s.y+D[0][1],cl=d.y+Al.measured.height-s.y2+D[1][1];wl=[[nl,g],[k,cl]]}let{position:El,positionAbsolute:M}=nF({nodeId:tl,nextPosition:Kl,nodeLookup:E,nodeExtent:wl?wl:D,nodeOrigin:K,onError:o});yl=yl||Al.position.x!==El.x||Al.position.y!==El.y,Al.position=El,Al.internals.positionAbsolute=M}if(U=U||yl,!yl)return;if(fl(y,!0),w&&(f||X||!p&&I)){let[tl,Al]=g9({nodeId:p,dragItems:y,nodeLookup:E});if(f?.(w,y,tl,Al),X?.(w,tl,Al),!p)I?.(w,Al)}}async function V(){if(!A)return;let{transform:B,panBy:C,autoPanSpeed:E,autoPanOnNodeDrag:D}=u();if(!D){c=!1,cancelAnimationFrame(i);return}let[Y,v]=sw(_,A,E);if(Y!==0||v!==0){if(t.x=(t.x??0)-Y/B[2],t.y=(t.y??0)-v/B[2],await C({x:Y,y:v}))Z(t)}i=requestAnimationFrame(V)}function P(B){let{nodeLookup:C,multiSelectionActive:E,nodesDraggable:D,transform:Y,snapGrid:v,snapToGrid:K,selectNodesOnDrag:X,onNodeDragStart:I,onSelectionDragStart:o,unselectNodesAndEdges:fl}=u();if(F=!0,(!X||!W)&&!E&&p){if(!C.get(p)?.selected)fl()}if(W&&X&&p)l?.(p);let yl=f$(B.sourceEvent,{transform:Y,snapGrid:v,snapToGrid:K,containerBounds:A});if(t=yl,y=OD(C,D,yl,p),y.size>0&&(r||I||!p&&o)){let[h,s]=g9({nodeId:p,dragItems:y,nodeLookup:C});if(r?.(B.sourceEvent,y,h,s),I?.(B.sourceEvent,h,s),!p)o?.(B.sourceEvent,s)}}let H=P1().clickDistance(O).on("start",(B)=>{let{domNode:C,nodeDragThreshold:E,transform:D,snapGrid:Y,snapToGrid:v}=u();if(A=C?.getBoundingClientRect()||null,N=!1,U=!1,w=B.sourceEvent,E===0)P(B);t=f$(B.sourceEvent,{transform:D,snapGrid:Y,snapToGrid:v,containerBounds:A}),_=Sf(B.sourceEvent,A)}).on("drag",(B)=>{let{autoPanOnNodeDrag:C,transform:E,snapGrid:D,snapToGrid:Y,nodeDragThreshold:v,nodeLookup:K}=u(),X=f$(B.sourceEvent,{transform:E,snapGrid:D,snapToGrid:Y,containerBounds:A});if(w=B.sourceEvent,B.sourceEvent.type==="touchmove"&&B.sourceEvent.touches.length>1||p&&!K.has(p))N=!0;if(N)return;if(!c&&C&&F)c=!0,V();if(!F){let I=Sf(B.sourceEvent,A),o=I.x-_.x,fl=I.y-_.y;if(Math.sqrt(o*o+fl*fl)>v)P(B)}if((t.x!==X.xSnapped||t.y!==X.ySnapped)&&y&&F)_=Sf(B.sourceEvent,A),Z(X)}).on("end",(B)=>{if(!F||N)return;if(c=!1,F=!1,cancelAnimationFrame(i),y.size>0){let{nodeLookup:C,updateNodePositions:E,onNodeDragStop:D,onSelectionDragStop:Y}=u();if(U)E(y,!1),U=!1;if(n||D||!p&&Y){let[v,K]=g9({nodeId:p,dragItems:y,nodeLookup:C,dragging:!1});if(n?.(B.sourceEvent,y,v,K),D?.(B.sourceEvent,v,K),!p)Y?.(B.sourceEvent,K)}}}).filter((B)=>{let C=B.target;return!B.button&&(!Q||!Vw(C,`.${Q}`,q))&&(!m||Vw(C,m,q))});j.call(H)}function J(){j?.on(".drag",null)}return{update:G,destroy:J}}function HD(l,u,r){let f=[],n={x:l.x-r,y:l.y-r,width:r*2,height:r*2};for(let t of u.values())if(Vy(n,i0(t))>0)f.push(t);return f}var BD=250;function DD(l,u,r,f){let n=[],t=1/0,i=HD(l,r,u+BD);for(let y of i){let c=[...y.internals.handleBounds?.source??[],...y.internals.handleBounds?.target??[]];for(let _ of c){if(f.nodeId===_.nodeId&&f.type===_.type&&f.id===_.id)continue;let{x:A,y:F}=fi(y,_,_.position,!0),j=Math.sqrt(Math.pow(A-l.x,2)+Math.pow(F-l.y,2));if(j>u)continue;if(j1){let y=f.type==="source"?"target":"source";return n.find((c)=>c.type===y)??n[0]}return n[0]}function rq(l,u,r,f,n,t=!1){let i=f.get(l);if(!i)return null;let y=n==="strict"?i.internals.handleBounds?.[u]:[...i.internals.handleBounds?.source??[],...i.internals.handleBounds?.target??[]],c=(r?y?.find((_)=>_.id===r):y?.[0])??null;return c&&t?{...c,...fi(i,c,c.position,!0)}:c}function fq(l,u){if(l)return l;else if(u?.classList.contains("target"))return"target";else if(u?.classList.contains("source"))return"source";return null}function VD(l,u){let r=null;if(u)r=!0;else if(l&&!u)r=!1;return r}var nq=()=>!0;function SD(l,{connectionMode:u,connectionRadius:r,handleId:f,nodeId:n,edgeUpdaterType:t,isTarget:i,domNode:y,nodeLookup:c,lib:_,autoPanOnConnect:A,flowId:F,panBy:j,cancelConnection:N,onConnectStart:U,onConnect:w,onConnectEnd:G,isValidConnection:J=nq,onReconnectEnd:Q,updateConnection:m,getTransform:q,getFromHandle:W,autoPanSpeed:p,dragThreshold:O=1,handleDomNode:Z}){let V=AF(l.target),P=0,H,{x:B,y:C}=Sf(l),E=fq(t,Z),D=y?.getBoundingClientRect(),Y=!1;if(!D||!E)return;let v=rq(n,E,f,c,u);if(!v)return;let K=Sf(l,D),X=!1,I=null,o=!1,fl=null;function yl(){if(!A||!D)return;let[El,M]=sw(K,D,p);j({x:El,y:M}),P=requestAnimationFrame(yl)}let h={...v,nodeId:n,type:E,position:v.position},s=c.get(n),tl={inProgress:!0,isValid:null,from:fi(s,h,Ol.Left,!0),fromHandle:h,fromPosition:h.position,fromNode:s,to:K,toHandle:null,toPosition:Tw[h.position],toNode:null,pointer:K};function Al(){Y=!0,m(tl),U?.(l,{nodeId:n,handleId:f,handleType:E})}if(O===0)Al();function Kl(El){if(!Y){let{x:cl,y:pl}=Sf(El),Hl=cl-B,bl=pl-C;if(!(Hl*Hl+bl*bl>O*O))return;Al()}if(!W()||!h){wl(El);return}let M=q();if(K=Sf(El,D),H=DD(Yy(K,M,!1,[1,1]),r,c,h),!X)yl(),X=!0;let d=tq(El,{handle:H,connectionMode:u,fromNodeId:n,fromHandleId:f,fromType:i?"target":"source",isValidConnection:J,doc:V,lib:_,flowId:F,nodeLookup:c});fl=d.handleDomNode,I=d.connection,o=VD(!!H,d.isValid);let nl=c.get(n),k=nl?fi(nl,h,Ol.Left,!0):tl.from,g={...tl,from:k,isValid:o,to:d.toHandle&&o?n$({x:d.toHandle.x,y:d.toHandle.y},M):K,toHandle:d.toHandle,toPosition:o&&d.toHandle?d.toHandle.position:Tw[h.position],toNode:d.toHandle?c.get(d.toHandle.nodeId):null,pointer:K};m(g),tl=g}function wl(El){if("touches"in El&&El.touches.length>0)return;if(Y){if((H||fl)&&I&&o)w?.(I);let{inProgress:M,...d}=tl,nl={...d,toPosition:tl.toHandle?tl.toPosition:null};if(G?.(El,nl),t)Q?.(El,nl)}N(),cancelAnimationFrame(P),X=!1,o=!1,I=null,fl=null,V.removeEventListener("mousemove",Kl),V.removeEventListener("mouseup",wl),V.removeEventListener("touchmove",Kl),V.removeEventListener("touchend",wl)}V.addEventListener("mousemove",Kl),V.addEventListener("mouseup",wl),V.addEventListener("touchmove",Kl),V.addEventListener("touchend",wl)}function tq(l,{handle:u,connectionMode:r,fromNodeId:f,fromHandleId:n,fromType:t,doc:i,lib:y,flowId:c,isValidConnection:_=nq,nodeLookup:A}){let F=t==="target",j=u?i.querySelector(`.${y}-flow__handle[data-id="${c}-${u?.nodeId}-${u?.id}-${u?.type}"]`):null,{x:N,y:U}=Sf(l),w=i.elementFromPoint(N,U),G=w?.classList.contains(`${y}-flow__handle`)?w:j,J={handleDomNode:G,isValid:!1,connection:null,toHandle:null};if(G){let Q=fq(void 0,G),m=G.getAttribute("data-nodeid"),q=G.getAttribute("data-handleid"),W=G.classList.contains("connectable"),p=G.classList.contains("connectableend");if(!m||!Q)return J;let O={source:F?m:f,sourceHandle:F?q:n,target:F?f:m,targetHandle:F?n:q};J.connection=O;let V=W&&p&&(r===ui.Strict?F&&Q==="source"||!F&&Q==="target":m!==f||q!==n);J.isValid=V&&_(O),J.toHandle=rq(m,Q,q,A,r,!0)}return J}var IA={onPointerDown:SD,isValid:tq};function iq({domNode:l,panZoom:u,getTransform:r,getViewScale:f}){let n=tr(l);function t({translateExtent:y,width:c,height:_,zoomStep:A=1,pannable:F=!0,zoomable:j=!0,inversePan:N=!1}){let U=(m)=>{if(m.sourceEvent.type!=="wheel"||!u)return;let q=r(),W=m.sourceEvent.ctrlKey&&Xy()?10:1,p=-m.sourceEvent.deltaY*(m.sourceEvent.deltaMode===1?0.05:m.sourceEvent.deltaMode?1:0.002)*A,O=q[2]*Math.pow(2,p*W);u.scaleTo(O)},w=[0,0],G=(m)=>{if(m.sourceEvent.type==="mousedown"||m.sourceEvent.type==="touchstart")w=[m.sourceEvent.clientX??m.sourceEvent.touches[0].clientX,m.sourceEvent.clientY??m.sourceEvent.touches[0].clientY]},J=(m)=>{let q=r();if(m.sourceEvent.type!=="mousemove"&&m.sourceEvent.type!=="touchmove"||!u)return;let W=[m.sourceEvent.clientX??m.sourceEvent.touches[0].clientX,m.sourceEvent.clientY??m.sourceEvent.touches[0].clientY],p=[W[0]-w[0],W[1]-w[1]];w=W;let O=f()*Math.max(q[2],Math.log(q[2]))*(N?-1:1),Z={x:q[0]-p[0]*O,y:q[1]-p[1]*O},V=[[0,0],[c,_]];u.setViewportConstrained({x:Z.x,y:Z.y,zoom:q[2]},V,y)},Q=r$().on("start",G).on("zoom",F?J:null).on("zoom.wheel",j?U:null);n.call(Q,{})}function i(){n.on("zoom",null)}return{update:t,destroy:i,pointer:Er}}var aA=(l)=>({x:l.x,y:l.y,zoom:l.k}),k9=({x:l,y:u,zoom:r})=>r0.translate(l,u).scale(r),Oy=(l,u)=>l.target.closest(`.${u}`),yq=(l,u)=>u===2&&Array.isArray(l)&&l.includes(2),YD=(l)=>((l*=2)<=1?l*l*l:(l-=2)*l*l+2)/2,I9=(l,u=0,r=YD,f=()=>{})=>{let n=typeof u==="number"&&u>0;if(!n)f();return n?l.transition().duration(u).ease(r).on("end",f):l},cq=(l)=>{let u=l.ctrlKey&&Xy()?10:1;return-l.deltaY*(l.deltaMode===1?0.05:l.deltaMode?1:0.002)*u};function XD({zoomPanValues:l,noWheelClassName:u,d3Selection:r,d3Zoom:f,panOnScrollMode:n,panOnScrollSpeed:t,zoomOnPinch:i,onPanZoomStart:y,onPanZoom:c,onPanZoomEnd:_}){return(A)=>{if(Oy(A,u)){if(A.ctrlKey)A.preventDefault();return!1}A.preventDefault(),A.stopImmediatePropagation();let F=r.property("__zoom").k||1;if(A.ctrlKey&&i){let G=Er(A),J=cq(A),Q=F*Math.pow(2,J);f.scaleTo(r,Q,G,A);return}let j=A.deltaMode===1?20:1,N=n===it.Vertical?0:A.deltaX*j,U=n===it.Horizontal?0:A.deltaY*j;if(!Xy()&&A.shiftKey&&n!==it.Vertical)N=A.deltaY*j,U=0;f.translateBy(r,-(N/F)*t,-(U/F)*t,{internal:!0});let w=aA(r.property("__zoom"));if(clearTimeout(l.panScrollTimeout),!l.isPanScrolling)l.isPanScrolling=!0,y?.(A,w);else c?.(A,w),l.panScrollTimeout=setTimeout(()=>{_?.(A,w),l.isPanScrolling=!1},150)}}function PD({noWheelClassName:l,preventScrolling:u,d3ZoomHandler:r}){return function(f,n){let t=f.type==="wheel",i=!u&&t&&!f.ctrlKey,y=Oy(f,l);if(f.ctrlKey&&t&&y)f.preventDefault();if(i||y)return null;f.preventDefault(),r.call(this,f,n)}}function CD({zoomPanValues:l,onDraggingChange:u,onPanZoomStart:r}){return(f)=>{if(f.sourceEvent?.internal)return;let n=aA(f.transform);if(l.mouseButton=f.sourceEvent?.button||0,l.isZoomingOrPanning=!0,l.prevViewport=n,f.sourceEvent?.type==="mousedown")u(!0);if(r)r?.(f.sourceEvent,n)}}function hD({zoomPanValues:l,panOnDrag:u,onPaneContextMenu:r,onTransformChange:f,onPanZoom:n}){return(t)=>{if(l.usedRightMouseButton=!!(r&&yq(u,l.mouseButton??0)),!t.sourceEvent?.sync)f([t.transform.x,t.transform.y,t.transform.k]);if(n&&!t.sourceEvent?.internal)n?.(t.sourceEvent,aA(t.transform))}}function MD({zoomPanValues:l,panOnDrag:u,panOnScroll:r,onDraggingChange:f,onPanZoomEnd:n,onPaneContextMenu:t}){return(i)=>{if(i.sourceEvent?.internal)return;if(l.isZoomingOrPanning=!1,t&&yq(u,l.mouseButton??0)&&!l.usedRightMouseButton&&i.sourceEvent)t(i.sourceEvent);if(l.usedRightMouseButton=!1,f(!1),n){let y=aA(i.transform);l.prevViewport=y,clearTimeout(l.timerId),l.timerId=setTimeout(()=>{n?.(i.sourceEvent,y)},r?150:0)}}}function sD({zoomActivationKeyPressed:l,zoomOnScroll:u,zoomOnPinch:r,panOnDrag:f,panOnScroll:n,zoomOnDoubleClick:t,userSelectionActive:i,noWheelClassName:y,noPanClassName:c,lib:_,connectionInProgress:A}){return(F)=>{let j=l||u,N=r&&F.ctrlKey,U=F.type==="wheel";if(F.button===1&&F.type==="mousedown"&&(Oy(F,`${_}-flow__node`)||Oy(F,`${_}-flow__edge`)))return!0;if(!f&&!j&&!n&&!t&&!r)return!1;if(i)return!1;if(A&&!U)return!1;if(Oy(F,y)&&U)return!1;if(Oy(F,c)&&(!U||n&&U&&!l))return!1;if(!r&&F.ctrlKey&&U)return!1;if(!r&&F.type==="touchstart"&&F.touches?.length>1)return F.preventDefault(),!1;if(!j&&!n&&!N&&U)return!1;if(!f&&(F.type==="mousedown"||F.type==="touchstart"))return!1;if(Array.isArray(f)&&!f.includes(F.button)&&F.type==="mousedown")return!1;let w=Array.isArray(f)&&f.includes(F.button)||!F.button||F.button<=1;return(!F.ctrlKey||U)&&w}}function $q({domNode:l,minZoom:u,maxZoom:r,translateExtent:f,viewport:n,onPanZoom:t,onPanZoomStart:i,onPanZoomEnd:y,onDraggingChange:c}){let _={isZoomingOrPanning:!1,usedRightMouseButton:!1,prevViewport:{x:0,y:0,zoom:0},mouseButton:0,timerId:void 0,panScrollTimeout:void 0,isPanScrolling:!1},A=l.getBoundingClientRect(),F=r$().scaleExtent([u,r]).translateExtent(f),j=tr(l).call(F);Q({x:n.x,y:n.y,zoom:Zy(n.zoom,u,r)},[[0,0],[A.width,A.height]],f);let N=j.on("wheel.zoom"),U=j.on("dblclick.zoom");F.wheelDelta(cq);function w(H,B){if(j)return new Promise((C)=>{F?.interpolate(B?.interpolate==="linear"?En:l0).transform(I9(j,B?.duration,B?.ease,()=>C(!0)),H)});return Promise.resolve(!1)}function G({noWheelClassName:H,noPanClassName:B,onPaneContextMenu:C,userSelectionActive:E,panOnScroll:D,panOnDrag:Y,panOnScrollMode:v,panOnScrollSpeed:K,preventScrolling:X,zoomOnPinch:I,zoomOnScroll:o,zoomOnDoubleClick:fl,zoomActivationKeyPressed:yl,lib:h,onTransformChange:s,connectionInProgress:ul,paneClickDistance:tl,selectionOnDrag:Al}){if(E&&!_.isZoomingOrPanning)J();let Kl=D&&!yl&&!E;F.clickDistance(Al?1/0:!Vf(tl)||tl<0?0:tl);let wl=Kl?XD({zoomPanValues:_,noWheelClassName:H,d3Selection:j,d3Zoom:F,panOnScrollMode:v,panOnScrollSpeed:K,zoomOnPinch:I,onPanZoomStart:i,onPanZoom:t,onPanZoomEnd:y}):PD({noWheelClassName:H,preventScrolling:X,d3ZoomHandler:N});if(j.on("wheel.zoom",wl,{passive:!1}),!E){let M=CD({zoomPanValues:_,onDraggingChange:c,onPanZoomStart:i});F.on("start",M);let d=hD({zoomPanValues:_,panOnDrag:Y,onPaneContextMenu:!!C,onPanZoom:t,onTransformChange:s});F.on("zoom",d);let nl=MD({zoomPanValues:_,panOnDrag:Y,panOnScroll:D,onPaneContextMenu:C,onPanZoomEnd:y,onDraggingChange:c});F.on("end",nl)}let El=sD({zoomActivationKeyPressed:yl,panOnDrag:Y,zoomOnScroll:o,panOnScroll:D,zoomOnDoubleClick:fl,zoomOnPinch:I,userSelectionActive:E,noPanClassName:B,noWheelClassName:H,lib:h,connectionInProgress:ul});if(F.filter(El),fl)j.on("dblclick.zoom",U);else j.on("dblclick.zoom",null)}function J(){F.on("zoom",null)}async function Q(H,B,C){let E=k9(H),D=F?.constrain()(E,B,C);if(D)await w(D);return new Promise((Y)=>Y(D))}async function m(H,B){let C=k9(H);return await w(C,B),new Promise((E)=>E(C))}function q(H){if(j){let B=k9(H),C=j.property("__zoom");if(C.k!==H.zoom||C.x!==H.x||C.y!==H.y)F?.transform(j,B,null,{sync:!0})}}function W(){let H=j?u$(j.node()):{x:0,y:0,k:1};return{x:H.x,y:H.y,zoom:H.k}}function p(H,B){if(j)return new Promise((C)=>{F?.interpolate(B?.interpolate==="linear"?En:l0).scaleTo(I9(j,B?.duration,B?.ease,()=>C(!0)),H)});return Promise.resolve(!1)}function O(H,B){if(j)return new Promise((C)=>{F?.interpolate(B?.interpolate==="linear"?En:l0).scaleBy(I9(j,B?.duration,B?.ease,()=>C(!0)),H)});return Promise.resolve(!1)}function Z(H){F?.scaleExtent(H)}function V(H){F?.translateExtent(H)}function P(H){let B=!Vf(H)||H<0?0:H;F?.clickDistance(B)}return{update:G,destroy:J,setViewport:m,setViewportConstrained:Q,getViewport:W,scaleTo:p,scaleBy:O,setScaleExtent:Z,setTranslateExtent:V,syncViewport:q,setClickDistance:P}}var ni;(function(l){l.Line="line",l.Handle="handle"})(ni||(ni={}));function RD({width:l,prevWidth:u,height:r,prevHeight:f,affectsX:n,affectsY:t}){let i=l-u,y=r-f,c=[i>0?1:i<0?-1:0,y>0?1:y<0?-1:0];if(i&&n)c[0]=c[0]*-1;if(y&&t)c[1]=c[1]*-1;return c}function Sw(l){let u=l.includes("right")||l.includes("left"),r=l.includes("bottom")||l.includes("top"),f=l.includes("left"),n=l.includes("top");return{isHorizontal:u,isVertical:r,affectsX:f,affectsY:n}}function et(l,u){return Math.max(0,u-l)}function li(l,u){return Math.max(0,l-u)}function XA(l,u,r){return Math.max(0,u-l,l-r)}function Yw(l,u){return l?!u:u}function xD(l,u,r,f,n,t,i,y){let{affectsX:c,affectsY:_}=u,{isHorizontal:A,isVertical:F}=u,j=A&&F,{xSnapped:N,ySnapped:U}=r,{minWidth:w,maxWidth:G,minHeight:J,maxHeight:Q}=f,{x:m,y:q,width:W,height:p,aspectRatio:O}=l,Z=Math.floor(A?N-l.pointerX:0),V=Math.floor(F?U-l.pointerY:0),P=W+(c?-Z:Z),H=p+(_?-V:V),B=-t[0]*W,C=-t[1]*p,E=XA(P,w,G),D=XA(H,J,Q);if(i){let K=0,X=0;if(c&&Z<0)K=et(m+Z+B,i[0][0]);else if(!c&&Z>0)K=li(m+P+B,i[1][0]);if(_&&V<0)X=et(q+V+C,i[0][1]);else if(!_&&V>0)X=li(q+H+C,i[1][1]);E=Math.max(E,K),D=Math.max(D,X)}if(y){let K=0,X=0;if(c&&Z>0)K=li(m+Z,y[0][0]);else if(!c&&Z<0)K=et(m+P,y[1][0]);if(_&&V>0)X=li(q+V,y[0][1]);else if(!_&&V<0)X=et(q+H,y[1][1]);E=Math.max(E,K),D=Math.max(D,X)}if(n){if(A){let K=XA(P/O,J,Q)*O;if(E=Math.max(E,K),i){let X=0;if(!c&&!_||c&&!_&&j)X=li(q+C+P/O,i[1][1])*O;else X=et(q+C+(c?Z:-Z)/O,i[0][1])*O;E=Math.max(E,X)}if(y){let X=0;if(!c&&!_||c&&!_&&j)X=et(q+P/O,y[1][1])*O;else X=li(q+(c?Z:-Z)/O,y[0][1])*O;E=Math.max(E,X)}}if(F){let K=XA(H*O,w,G)/O;if(D=Math.max(D,K),i){let X=0;if(!c&&!_||_&&!c&&j)X=li(m+H*O+B,i[1][0])/O;else X=et(m+(_?V:-V)*O+B,i[0][0])/O;D=Math.max(D,X)}if(y){let X=0;if(!c&&!_||_&&!c&&j)X=et(m+H*O,y[1][0])/O;else X=li(m+(_?V:-V)*O,y[0][0])/O;D=Math.max(D,X)}}}if(V=V+(V<0?D:-D),Z=Z+(Z<0?E:-E),n)if(j)if(P>H*O)V=(Yw(c,_)?-Z:Z)/O;else Z=(Yw(c,_)?-V:V)*O;else if(A)V=Z/O,_=c;else Z=V*O,c=_;let Y=c?m+Z:m,v=_?q+V:q;return{width:W+(c?-Z:Z),height:p+(_?-V:V),x:t[0]*Z*(!c?1:-1)+Y,y:t[1]*V*(!_?1:-1)+v}}var _q={width:0,height:0,x:0,y:0},bD={..._q,pointerX:0,pointerY:0,aspectRatio:1};function vD(l){return[[0,0],[l.measured.width,l.measured.height]]}function gD(l,u,r){let f=u.position.x+l.position.x,n=u.position.y+l.position.y,t=l.measured.width??0,i=l.measured.height??0,y=r[0]*t,c=r[1]*i;return[[f-y,n-c],[f+t-y,n+i-c]]}function Aq({domNode:l,nodeId:u,getStoreItems:r,onChange:f,onEnd:n}){let t=tr(l),i={controlDirection:Sw("bottom-right"),boundaries:{minWidth:0,minHeight:0,maxWidth:Number.MAX_VALUE,maxHeight:Number.MAX_VALUE},resizeDirection:void 0,keepAspectRatio:!1};function y({controlPosition:_,boundaries:A,keepAspectRatio:F,resizeDirection:j,onResizeStart:N,onResize:U,onResizeEnd:w,shouldResize:G}){let J={..._q},Q={...bD};i={boundaries:A,resizeDirection:j,keepAspectRatio:F,controlDirection:Sw(_)};let m=void 0,q=null,W=[],p=void 0,O=void 0,Z=void 0,V=!1,P=P1().on("start",(H)=>{let{nodeLookup:B,transform:C,snapGrid:E,snapToGrid:D,nodeOrigin:Y,paneDomNode:v}=r();if(m=B.get(u),!m)return;q=v?.getBoundingClientRect()??null;let{xSnapped:K,ySnapped:X}=f$(H.sourceEvent,{transform:C,snapGrid:E,snapToGrid:D,containerBounds:q});if(J={width:m.measured.width??0,height:m.measured.height??0,x:m.position.x??0,y:m.position.y??0},Q={...J,pointerX:K,pointerY:X,aspectRatio:J.width/J.height},p=void 0,m.parentId&&(m.extent==="parent"||m.expandParent))p=B.get(m.parentId),O=p&&m.extent==="parent"?vD(p):void 0;W=[],Z=void 0;for(let[I,o]of B)if(o.parentId===u){if(W.push({id:I,position:{...o.position},extent:o.extent}),o.extent==="parent"||o.expandParent){let fl=gD(o,m,o.origin??Y);if(Z)Z=[[Math.min(fl[0][0],Z[0][0]),Math.min(fl[0][1],Z[0][1])],[Math.max(fl[1][0],Z[1][0]),Math.max(fl[1][1],Z[1][1])]];else Z=fl}}N?.(H,{...J})}).on("drag",(H)=>{let{transform:B,snapGrid:C,snapToGrid:E,nodeOrigin:D}=r(),Y=f$(H.sourceEvent,{transform:B,snapGrid:C,snapToGrid:E,containerBounds:q}),v=[];if(!m)return;let{x:K,y:X,width:I,height:o}=J,fl={},yl=m.origin??D,{width:h,height:s,x:ul,y:tl}=xD(Q,i.controlDirection,Y,i.boundaries,i.keepAspectRatio,yl,O,Z),Al=h!==I,Kl=s!==o,wl=ul!==K&&Al,El=tl!==X&&Kl;if(!wl&&!El&&!Al&&!Kl)return;if(wl||El||yl[0]===1||yl[1]===1){if(fl.x=wl?ul:J.x,fl.y=El?tl:J.y,J.x=fl.x,J.y=fl.y,W.length>0){let k=ul-K,g=tl-X;for(let cl of W)cl.position={x:cl.position.x-k+yl[0]*(h-I),y:cl.position.y-g+yl[1]*(s-o)},v.push(cl)}}if(Al||Kl)fl.width=Al&&(!i.resizeDirection||i.resizeDirection==="horizontal")?h:J.width,fl.height=Kl&&(!i.resizeDirection||i.resizeDirection==="vertical")?s:J.height,J.width=fl.width,J.height=fl.height;if(p&&m.expandParent){let k=yl[0]*(fl.width??0);if(fl.x&&fl.x{if(!V)return;w?.(H,{...J}),n?.({...J}),V=!1});t.call(P)}function c(){t.on(".drag",null)}return{update:y,destroy:c}}var Wq=Ml(Ju(),1),Tq=Ml(wq(),1);var qq=(l)=>{let u,r=new Set,f=(A,F)=>{let j=typeof A==="function"?A(u):A;if(!Object.is(j,u)){let N=u;u=(F!=null?F:typeof j!=="object"||j===null)?j:Object.assign({},u,j),r.forEach((U)=>U(u,N))}},n=()=>u,c={setState:f,getState:n,getInitialState:()=>_,subscribe:(A)=>{return r.add(A),()=>r.delete(A)},destroy:()=>{r.clear()}},_=u=l(f,n,c);return c},Lq=(l)=>l?qq(l):qq;var{useDebugValue:AV}=Wq.default,{useSyncExternalStoreWithSelector:FV}=Tq.default,jV=(l)=>l;function GF(l,u=jV,r){let f=FV(l.subscribe,l.getState,l.getServerState||l.getInitialState,u,r);return AV(f),f}var Gq=(l,u)=>{let r=Lq(l),f=(n,t=u)=>GF(r,n,t);return Object.assign(f,r),f},Kq=(l,u)=>l?Gq(l,u):Gq;function zu(l,u){if(Object.is(l,u))return!0;if(typeof l!=="object"||l===null||typeof u!=="object"||u===null)return!1;if(l instanceof Map&&u instanceof Map){if(l.size!==u.size)return!1;for(let[f,n]of l)if(!Object.is(n,u.get(f)))return!1;return!0}if(l instanceof Set&&u instanceof Set){if(l.size!==u.size)return!1;for(let f of l)if(!u.has(f))return!1;return!0}let r=Object.keys(l);if(r.length!==Object.keys(u).length)return!1;for(let f of r)if(!Object.prototype.hasOwnProperty.call(u,f)||!Object.is(l[f],u[f]))return!1;return!0}var NV=Ml(U2(),1),u8=_l.createContext(null),JV=u8.Provider,Iq=mf.error001();function $u(l,u){let r=_l.useContext(u8);if(r===null)throw Error(Iq);return GF(r,l,u)}function Vu(){let l=_l.useContext(u8);if(l===null)throw Error(Iq);return _l.useMemo(()=>({getState:l.getState,setState:l.setState,subscribe:l.subscribe}),[l])}var Eq={display:"none"},UV={position:"absolute",width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0px, 0px, 0px, 0px)",clipPath:"inset(100%)"},aq="react-flow__node-desc",oq="react-flow__edge-desc",QV="react-flow__aria-live",mV=(l)=>l.ariaLiveMessage,wV=(l)=>l.ariaLabelConfig;function qV({rfId:l}){let u=$u(mV);return il.jsx("div",{id:`${QV}-${l}`,"aria-live":"assertive","aria-atomic":"true",style:UV,children:u})}function LV({rfId:l,disableKeyboardA11y:u}){let r=$u(wV);return il.jsxs(il.Fragment,{children:[il.jsx("div",{id:`${aq}-${l}`,style:Eq,children:u?r["node.a11yDescription.default"]:r["node.a11yDescription.keyboardDisabled"]}),il.jsx("div",{id:`${oq}-${l}`,style:Eq,children:r["edge.a11yDescription.default"]}),!u&&il.jsx(qV,{rfId:l})]})}var r8=_l.forwardRef(({position:l="top-left",children:u,className:r,style:f,...n},t)=>{let i=`${l}`.split("-");return il.jsx("div",{className:bu(["react-flow__panel",r,...i]),style:f,ref:t,...n,children:u})});r8.displayName="Panel";function GV({proOptions:l,position:u="bottom-right"}){if(l?.hideAttribution)return null;return il.jsx(r8,{position:u,className:"react-flow__attribution","data-message":"Please only hide this attribution when you are subscribed to React Flow Pro: https://pro.reactflow.dev",children:il.jsx("a",{href:"https://reactflow.dev",target:"_blank",rel:"noopener noreferrer","aria-label":"React Flow attribution",children:"React Flow"})})}var WV=(l)=>{let u=[],r=[];for(let[,f]of l.nodeLookup)if(f.selected)u.push(f.internals.userNode);for(let[,f]of l.edgeLookup)if(f.selected)r.push(f);return{selectedNodes:u,selectedEdges:r}},dA=(l)=>l.id;function TV(l,u){return zu(l.selectedNodes.map(dA),u.selectedNodes.map(dA))&&zu(l.selectedEdges.map(dA),u.selectedEdges.map(dA))}function KV({onSelectionChange:l}){let u=Vu(),{selectedNodes:r,selectedEdges:f}=$u(WV,TV);return _l.useEffect(()=>{let n={nodes:r,edges:f};l?.(n),u.getState().onSelectionChangeHandlers.forEach((t)=>t(n))},[r,f,l]),null}var EV=(l)=>!!l.onSelectionChangeHandlers;function pV({onSelectionChange:l}){let u=$u(EV);if(l||u)return il.jsx(KV,{onSelectionChange:l});return null}var KF=typeof window<"u"?_l.useLayoutEffect:_l.useEffect,dq=[0,0],zV={x:0,y:0,zoom:1},OV=["nodes","edges","defaultNodes","defaultEdges","onConnect","onConnectStart","onConnectEnd","onClickConnectStart","onClickConnectEnd","nodesDraggable","autoPanOnNodeFocus","nodesConnectable","nodesFocusable","edgesFocusable","edgesReconnectable","elevateNodesOnSelect","elevateEdgesOnSelect","minZoom","maxZoom","nodeExtent","onNodesChange","onEdgesChange","elementsSelectable","connectionMode","snapGrid","snapToGrid","translateExtent","connectOnClick","defaultEdgeOptions","fitView","fitViewOptions","onNodesDelete","onEdgesDelete","onDelete","onNodeDrag","onNodeDragStart","onNodeDragStop","onSelectionDrag","onSelectionDragStart","onSelectionDragStop","onMoveStart","onMove","onMoveEnd","noPanClassName","nodeOrigin","autoPanOnConnect","autoPanOnNodeDrag","onError","connectionRadius","isValidConnection","selectNodesOnDrag","nodeDragThreshold","connectionDragThreshold","onBeforeDelete","debug","autoPanSpeed","ariaLabelConfig","zIndexMode"],pq=[...OV,"rfId"],ZV=(l)=>({setNodes:l.setNodes,setEdges:l.setEdges,setMinZoom:l.setMinZoom,setMaxZoom:l.setMaxZoom,setTranslateExtent:l.setTranslateExtent,setNodeExtent:l.setNodeExtent,reset:l.reset,setDefaultNodesAndEdges:l.setDefaultNodesAndEdges}),zq={translateExtent:By,nodeOrigin:dq,minZoom:0.5,maxZoom:2,elementsSelectable:!0,noPanClassName:"nopan",rfId:"1"};function HV(l){let{setNodes:u,setEdges:r,setMinZoom:f,setMaxZoom:n,setTranslateExtent:t,setNodeExtent:i,reset:y,setDefaultNodesAndEdges:c}=$u(ZV,zu),_=Vu();KF(()=>{return c(l.defaultNodes,l.defaultEdges),()=>{A.current=zq,y()}},[]);let A=_l.useRef(zq);return KF(()=>{for(let F of pq){let j=l[F],N=A.current[F];if(j===N)continue;if(typeof l[F]>"u")continue;if(F==="nodes")u(j);else if(F==="edges")r(j);else if(F==="minZoom")f(j);else if(F==="maxZoom")n(j);else if(F==="translateExtent")t(j);else if(F==="nodeExtent")i(j);else if(F==="ariaLabelConfig")_.setState({ariaLabelConfig:xw(j)});else if(F==="fitView")_.setState({fitViewQueued:j});else if(F==="fitViewOptions")_.setState({fitViewOptions:j});else _.setState({[F]:j})}A.current=l},pq.map((F)=>l[F])),null}function Oq(){if(typeof window>"u"||!window.matchMedia)return null;return window.matchMedia("(prefers-color-scheme: dark)")}function BV(l){let[u,r]=_l.useState(l==="system"?null:l);return _l.useEffect(()=>{if(l!=="system"){r(l);return}let f=Oq(),n=()=>r(f?.matches?"dark":"light");return n(),f?.addEventListener("change",n),()=>{f?.removeEventListener("change",n)}},[l]),u!==null?u:Oq()?.matches?"dark":"light"}var Zq=typeof document<"u"?document:null;function c$(l=null,u={target:Zq,actInsideInputWithModifier:!0}){let[r,f]=_l.useState(!1),n=_l.useRef(!1),t=_l.useRef(new Set([])),[i,y]=_l.useMemo(()=>{if(l!==null){let _=(Array.isArray(l)?l:[l]).filter((F)=>typeof F==="string").map((F)=>F.replace("+",` `).replace(` `,` +`).split(` -`)),A=_.reduce((F,j)=>F.concat(...j),[]);return[_,A]}return[[],[]]},[l]);return _l.useEffect(()=>{let c=u?.target??Zq,_=u?.actInsideInputWithModifier??!0;if(l!==null){let A=(N)=>{if(n.current=N.ctrlKey||N.metaKey||N.shiftKey||N.altKey,(!n.current||n.current&&!_)&&AF(N))return!1;let w=Bq(N.code,y);if(t.current.add(N[w]),Hq(i,t.current,!1)){let G=N.composedPath?.()?.[0]||N.target,J=G?.nodeName==="BUTTON"||G?.nodeName==="A";if(u.preventDefault!==!1&&(n.current||!J))N.preventDefault();f(!0)}},F=(N)=>{let U=Bq(N.code,y);if(Hq(i,t.current,!0))f(!1),t.current.clear();else t.current.delete(N[U]);if(N.key==="Meta")t.current.clear();n.current=!1},j=()=>{t.current.clear(),f(!1)};return c?.addEventListener("keydown",A),c?.addEventListener("keyup",F),window.addEventListener("blur",j),window.addEventListener("contextmenu",j),()=>{c?.removeEventListener("keydown",A),c?.removeEventListener("keyup",F),window.removeEventListener("blur",j),window.removeEventListener("contextmenu",j)}}},[l,f]),r}function Hq(l,u,r){return l.filter((f)=>r||f.length===u.size).some((f)=>f.every((n)=>u.has(n)))}function Bq(l,u){return u.includes(l)?"code":"key"}var DV=()=>{let l=Vu();return _l.useMemo(()=>{return{zoomIn:(u)=>{let{panZoom:r}=l.getState();return r?r.scaleBy(1.2,u):Promise.resolve(!1)},zoomOut:(u)=>{let{panZoom:r}=l.getState();return r?r.scaleBy(0.8333333333333334,u):Promise.resolve(!1)},zoomTo:(u,r)=>{let{panZoom:f}=l.getState();return f?f.scaleTo(u,r):Promise.resolve(!1)},getZoom:()=>l.getState().transform[2],setViewport:async(u,r)=>{let{transform:[f,n,t],panZoom:i}=l.getState();if(!i)return Promise.resolve(!1);return await i.setViewport({x:u.x??f,y:u.y??n,zoom:u.zoom??t},r),Promise.resolve(!0)},getViewport:()=>{let[u,r,f]=l.getState().transform;return{x:u,y:r,zoom:f}},setCenter:async(u,r,f)=>{return l.getState().setCenter(u,r,f)},fitBounds:async(u,r)=>{let{width:f,height:n,minZoom:t,maxZoom:i,panZoom:y}=l.getState(),c=i$(u,f,n,t,i,r?.padding??0.1);if(!y)return Promise.resolve(!1);return await y.setViewport(c,{duration:r?.duration,ease:r?.ease,interpolate:r?.interpolate}),Promise.resolve(!0)},screenToFlowPosition:(u,r={})=>{let{transform:f,snapGrid:n,snapToGrid:t,domNode:i}=l.getState();if(!i)return u;let{x:y,y:c}=i.getBoundingClientRect(),_={x:u.x-y,y:u.y-c},A=r.snapGrid??n,F=r.snapToGrid??t;return Yy(_,f,F,A)},flowToScreenPosition:(u)=>{let{transform:r,domNode:f}=l.getState();if(!f)return u;let{x:n,y:t}=f.getBoundingClientRect(),i=n$(u,r);return{x:i.x+n,y:i.y+t}}}},[])};function eq(l,u){let r=[],f=new Map,n=[];for(let t of l)if(t.type==="add"){n.push(t);continue}else if(t.type==="remove"||t.type==="replace")f.set(t.id,[t]);else{let i=f.get(t.id);if(i)i.push(t);else f.set(t.id,[t])}for(let t of u){let i=f.get(t.id);if(!i){r.push(t);continue}if(i[0].type==="remove")continue;if(i[0].type==="replace"){r.push({...i[0].item});continue}let y={...t};for(let c of i)VV(c,y);r.push(y)}if(n.length)n.forEach((t)=>{if(t.index!==void 0)r.splice(t.index,0,{...t.item});else r.push({...t.item})});return r}function VV(l,u){switch(l.type){case"select":{u.selected=l.selected;break}case"position":{if(typeof l.position<"u")u.position=l.position;if(typeof l.dragging<"u")u.dragging=l.dragging;break}case"dimensions":{if(typeof l.dimensions<"u"){if(u.measured={...l.dimensions},l.setAttributes){if(l.setAttributes===!0||l.setAttributes==="width")u.width=l.dimensions.width;if(l.setAttributes===!0||l.setAttributes==="height")u.height=l.dimensions.height}}if(typeof l.resizing==="boolean")u.resizing=l.resizing;break}}}function SV(l,u){return eq(l,u)}function YV(l,u){return eq(l,u)}function y0(l,u){return{id:l,type:"select",selected:u}}function Cy(l,u=new Set,r=!1){let f=[];for(let[n,t]of l){let i=u.has(n);if(!(t.selected===void 0&&!i)&&t.selected!==i){if(r)t.selected=i;f.push(y0(t.id,i))}}return f}function Dq({items:l=[],lookup:u}){let r=[],f=new Map(l.map((n)=>[n.id,n]));for(let[n,t]of l.entries()){let i=u.get(t.id),y=i?.internals?.userNode??i;if(y!==void 0&&y!==t)r.push({id:t.id,item:t,type:"replace"});if(y===void 0)r.push({item:t,type:"add",index:n})}for(let[n]of u)if(f.get(n)===void 0)r.push({id:n,type:"remove"});return r}function Vq(l){return{id:l.id,type:"remove"}}var Sq=(l)=>Xw(l),XV=(l)=>lF(l);function lL(l){return _l.forwardRef(l)}function Yq(l){let[u,r]=_l.useState(BigInt(0)),[f]=_l.useState(()=>PV(()=>r((n)=>n+BigInt(1))));return TF(()=>{let n=f.get();if(n.length)l(n),f.reset()},[u]),f}function PV(l){let u=[];return{get:()=>u,reset:()=>{u=[]},push:(r)=>{u.push(r),l()}}}var uL=_l.createContext(null);function CV({children:l}){let u=Vu(),r=_l.useCallback((y)=>{let{nodes:c=[],setNodes:_,hasDefaultNodes:A,onNodesChange:F,nodeLookup:j,fitViewQueued:N,onNodesChangeMiddlewareMap:U}=u.getState(),w=c;for(let J of y)w=typeof J==="function"?J(w):J;let G=Dq({items:w,lookup:j});for(let J of U.values())G=J(G);if(A)_(w);if(G.length>0)F?.(G);else if(N)window.requestAnimationFrame(()=>{let{fitViewQueued:J,nodes:Q,setNodes:m}=u.getState();if(J)m(Q)})},[]),f=Yq(r),n=_l.useCallback((y)=>{let{edges:c=[],setEdges:_,hasDefaultEdges:A,onEdgesChange:F,edgeLookup:j}=u.getState(),N=c;for(let U of y)N=typeof U==="function"?U(N):U;if(A)_(N);else if(F)F(Dq({items:N,lookup:j}))},[]),t=Yq(n),i=_l.useMemo(()=>({nodeQueue:f,edgeQueue:t}),[]);return il.jsx(uL.Provider,{value:i,children:l})}function hV(){let l=_l.useContext(uL);if(!l)throw Error("useBatchContext must be used within a BatchProvider");return l}var MV=(l)=>!!l.panZoom;function EF(){let l=DV(),u=Vu(),r=hV(),f=$u(MV),n=_l.useMemo(()=>{let t=(F)=>u.getState().nodeLookup.get(F),i=(F)=>{r.nodeQueue.push(F)},y=(F)=>{r.edgeQueue.push(F)},c=(F)=>{let{nodeLookup:j,nodeOrigin:N}=u.getState(),U=Sq(F)?F:j.get(F.id),w=U.parentId?cF(U.position,U.measured,U.parentId,j,N):U.position,G={...U,position:w,width:U.measured?.width??U.width,height:U.measured?.height??U.height};return i0(G)},_=(F,j,N={replace:!1})=>{i((U)=>U.map((w)=>{if(w.id===F){let G=typeof j==="function"?j(w):j;return N.replace&&Sq(G)?G:{...w,...G}}return w}))},A=(F,j,N={replace:!1})=>{y((U)=>U.map((w)=>{if(w.id===F){let G=typeof j==="function"?j(w):j;return N.replace&&XV(G)?G:{...w,...G}}return w}))};return{getNodes:()=>u.getState().nodes.map((F)=>({...F})),getNode:(F)=>t(F)?.internals.userNode,getInternalNode:t,getEdges:()=>{let{edges:F=[]}=u.getState();return F.map((j)=>({...j}))},getEdge:(F)=>u.getState().edgeLookup.get(F),setNodes:i,setEdges:y,addNodes:(F)=>{let j=Array.isArray(F)?F:[F];r.nodeQueue.push((N)=>[...N,...j])},addEdges:(F)=>{let j=Array.isArray(F)?F:[F];r.edgeQueue.push((N)=>[...N,...j])},toObject:()=>{let{nodes:F=[],edges:j=[],transform:N}=u.getState(),[U,w,G]=N;return{nodes:F.map((J)=>({...J})),edges:j.map((J)=>({...J})),viewport:{x:U,y:w,zoom:G}}},deleteElements:async({nodes:F=[],edges:j=[]})=>{let{nodes:N,edges:U,onNodesDelete:w,onEdgesDelete:G,triggerNodeChanges:J,triggerEdgeChanges:Q,onDelete:m,onBeforeDelete:q}=u.getState(),{nodes:W,edges:p}=await hw({nodesToRemove:F,edgesToRemove:j,nodes:N,edges:U,onBeforeDelete:q}),O=p.length>0,Z=W.length>0;if(O){let V=p.map(Vq);G?.(p),Q(V)}if(Z){let V=W.map(Vq);w?.(W),J(V)}if(Z||O)m?.({nodes:W,edges:p});return{deletedNodes:W,deletedEdges:p}},getIntersectingNodes:(F,j=!0,N)=>{let U=tF(F),w=U?F:c(F),G=N!==void 0;if(!w)return[];return(N||u.getState().nodes).filter((J)=>{let Q=u.getState().nodeLookup.get(J.id);if(Q&&!U&&(J.id===F.id||!Q.internals.positionAbsolute))return!1;let m=i0(G?J:Q),q=Vy(m,w);return j&&q>0||q>=m.width*m.height||q>=w.width*w.height})},isNodeIntersecting:(F,j,N=!0)=>{let w=tF(F)?F:c(F);if(!w)return!1;let G=Vy(w,j);return N&&G>0||G>=j.width*j.height||G>=w.width*w.height},updateNode:_,updateNodeData:(F,j,N={replace:!1})=>{_(F,(U)=>{let w=typeof j==="function"?j(U):j;return N.replace?{...U,data:w}:{...U,data:{...U.data,...w}}},N)},updateEdge:A,updateEdgeData:(F,j,N={replace:!1})=>{A(F,(U)=>{let w=typeof j==="function"?j(U):j;return N.replace?{...U,data:w}:{...U,data:{...U.data,...w}}},N)},getNodesBounds:(F)=>{let{nodeLookup:j,nodeOrigin:N}=u.getState();return rF(F,{nodeLookup:j,nodeOrigin:N})},getHandleConnections:({type:F,id:j,nodeId:N})=>Array.from(u.getState().connectionLookup.get(`${N}-${F}${j?`-${j}`:""}`)?.values()??[]),getNodeConnections:({type:F,handleId:j,nodeId:N})=>Array.from(u.getState().connectionLookup.get(`${N}${F?j?`-${F}-${j}`:`-${F}`:""}`)?.values()??[]),fitView:async(F)=>{let j=u.getState().fitViewResolver??Rw();return u.setState({fitViewQueued:!0,fitViewOptions:F,fitViewResolver:j}),r.nodeQueue.push((N)=>[...N]),j.promise}}},[]);return _l.useMemo(()=>{return{...n,...l,viewportInitialized:f}},[f])}var Xq=(l)=>l.selected,sV=typeof window<"u"?window:void 0;function RV({deleteKeyCode:l,multiSelectionKeyCode:u}){let r=Vu(),{deleteElements:f}=EF(),n=c$(l,{actInsideInputWithModifier:!1}),t=c$(u,{target:sV});_l.useEffect(()=>{if(n){let{edges:i,nodes:y}=r.getState();f({nodes:y.filter(Xq),edges:i.filter(Xq)}),r.setState({nodesSelectionActive:!1})}},[n]),_l.useEffect(()=>{r.setState({multiSelectionActive:t})},[t])}function xV(l){let u=Vu();_l.useEffect(()=>{let r=()=>{if(!l.current||!(l.current.checkVisibility?.()??!0))return!1;let f=MA(l.current);if(f.height===0||f.width===0)u.getState().onError?.("004",mf.error004());u.setState({width:f.width||500,height:f.height||500})};if(l.current){r(),window.addEventListener("resize",r);let f=new ResizeObserver(()=>r());return f.observe(l.current),()=>{if(window.removeEventListener("resize",r),f&&l.current)f.unobserve(l.current)}}},[])}var r8={position:"absolute",width:"100%",height:"100%",top:0,left:0},bV=(l)=>({userSelectionActive:l.userSelectionActive,lib:l.lib,connectionInProgress:l.connection.inProgress});function vV({onPaneContextMenu:l,zoomOnScroll:u=!0,zoomOnPinch:r=!0,panOnScroll:f=!1,panOnScrollSpeed:n=0.5,panOnScrollMode:t=it.Free,zoomOnDoubleClick:i=!0,panOnDrag:y=!0,defaultViewport:c,translateExtent:_,minZoom:A,maxZoom:F,zoomActivationKeyCode:j,preventScrolling:N=!0,children:U,noWheelClassName:w,noPanClassName:G,onViewportChange:J,isControlledViewport:Q,paneClickDistance:m,selectionOnDrag:q}){let W=Vu(),p=_l.useRef(null),{userSelectionActive:O,lib:Z,connectionInProgress:V}=$u(bV,zu),P=c$(j),H=_l.useRef();xV(p);let B=_l.useCallback((C)=>{if(J?.({x:C[0],y:C[1],zoom:C[2]}),!Q)W.setState({transform:C})},[J,Q]);return _l.useEffect(()=>{if(p.current){H.current=$q({domNode:p.current,minZoom:A,maxZoom:F,translateExtent:_,viewport:c,onDraggingChange:(Y)=>W.setState((v)=>v.paneDragging===Y?v:{paneDragging:Y}),onPanZoomStart:(Y,v)=>{let{onViewportChangeStart:K,onMoveStart:X}=W.getState();X?.(Y,v),K?.(v)},onPanZoom:(Y,v)=>{let{onViewportChange:K,onMove:X}=W.getState();X?.(Y,v),K?.(v)},onPanZoomEnd:(Y,v)=>{let{onViewportChangeEnd:K,onMoveEnd:X}=W.getState();X?.(Y,v),K?.(v)}});let{x:C,y:E,zoom:D}=H.current.getViewport();return W.setState({panZoom:H.current,transform:[C,E,D],domNode:p.current.closest(".react-flow")}),()=>{H.current?.destroy()}}},[]),_l.useEffect(()=>{H.current?.update({onPaneContextMenu:l,zoomOnScroll:u,zoomOnPinch:r,panOnScroll:f,panOnScrollSpeed:n,panOnScrollMode:t,zoomOnDoubleClick:i,panOnDrag:y,zoomActivationKeyPressed:P,preventScrolling:N,noPanClassName:G,userSelectionActive:O,noWheelClassName:w,lib:Z,onTransformChange:B,connectionInProgress:V,selectionOnDrag:q,paneClickDistance:m})},[l,u,r,f,n,t,i,y,P,N,G,O,w,Z,B,V,q,m]),il.jsx("div",{className:"react-flow__renderer",ref:p,style:r8,children:U})}var gV=(l)=>({userSelectionActive:l.userSelectionActive,userSelectionRect:l.userSelectionRect});function kV(){let{userSelectionActive:l,userSelectionRect:u}=$u(gV,zu);if(!(l&&u))return null;return il.jsx("div",{className:"react-flow__selection react-flow__container",style:{width:u.width,height:u.height,transform:`translate(${u.x}px, ${u.y}px)`}})}var GF=(l,u)=>{return(r)=>{if(r.target!==u.current)return;l?.(r)}},IV=(l)=>({userSelectionActive:l.userSelectionActive,elementsSelectable:l.elementsSelectable,connectionInProgress:l.connection.inProgress,dragging:l.paneDragging});function aV({isSelecting:l,selectionKeyPressed:u,selectionMode:r=n0.Full,panOnDrag:f,paneClickDistance:n,selectionOnDrag:t,onSelectionStart:i,onSelectionEnd:y,onPaneClick:c,onPaneContextMenu:_,onPaneScroll:A,onPaneMouseEnter:F,onPaneMouseMove:j,onPaneMouseLeave:N,children:U}){let w=Vu(),{userSelectionActive:G,elementsSelectable:J,dragging:Q,connectionInProgress:m}=$u(IV,zu),q=J&&(l||G),W=_l.useRef(null),p=_l.useRef(),O=_l.useRef(new Set),Z=_l.useRef(new Set),V=_l.useRef(!1),P=(K)=>{if(V.current||m){V.current=!1;return}c?.(K),w.getState().resetSelectedElements(),w.setState({nodesSelectionActive:!1})},H=(K)=>{if(Array.isArray(f)&&f?.includes(2)){K.preventDefault();return}_?.(K)},B=A?(K)=>A(K):void 0,C=(K)=>{if(V.current)K.stopPropagation(),V.current=!1},E=(K)=>{let{domNode:X}=w.getState();if(p.current=X?.getBoundingClientRect(),!p.current)return;let I=K.target===W.current;if(!I&&!!K.target.closest(".nokey")||!l||!(t&&I||u)||K.button!==0||!K.isPrimary)return;K.target?.setPointerCapture?.(K.pointerId),V.current=!1;let{x:yl,y:h}=Sf(K.nativeEvent,p.current);if(w.setState({userSelectionRect:{width:0,height:0,startX:yl,startY:h,x:yl,y:h}}),!I)K.stopPropagation(),K.preventDefault()},D=(K)=>{let{userSelectionRect:X,transform:I,nodeLookup:o,edgeLookup:fl,connectionLookup:yl,triggerNodeChanges:h,triggerEdgeChanges:s,defaultEdgeOptions:ul,resetSelectedElements:tl}=w.getState();if(!p.current||!X)return;let{x:Al,y:Kl}=Sf(K.nativeEvent,p.current),{startX:wl,startY:El}=X;if(!V.current){let g=u?0:n;if(Math.hypot(Al-wl,Kl-El)<=g)return;tl(),i?.(K)}V.current=!0;let M={startX:wl,startY:El,x:Alg.id)),Z.current=new Set;let k=ul?.selectable??!0;for(let g of O.current){let cl=yl.get(g);if(!cl)continue;for(let{edgeId:pl}of cl.values()){let Hl=fl.get(pl);if(Hl&&(Hl.selectable??k))Z.current.add(pl)}}if(!$F(d,O.current)){let g=Cy(o,O.current,!0);h(g)}if(!$F(nl,Z.current)){let g=Cy(fl,Z.current);s(g)}w.setState({userSelectionRect:M,userSelectionActive:!0,nodesSelectionActive:!1})},Y=(K)=>{if(K.button!==0)return;if(K.target?.releasePointerCapture?.(K.pointerId),!G&&K.target===W.current&&w.getState().userSelectionRect)P?.(K);if(w.setState({userSelectionActive:!1,userSelectionRect:null}),V.current)y?.(K),w.setState({nodesSelectionActive:O.current.size>0})},v=f===!0||Array.isArray(f)&&f.includes(0);return il.jsxs("div",{className:bu(["react-flow__pane",{draggable:v,dragging:Q,selection:l}]),onClick:q?void 0:GF(P,W),onContextMenu:GF(H,W),onWheel:GF(B,W),onPointerEnter:q?void 0:F,onPointerMove:q?D:j,onPointerUp:q?Y:void 0,onPointerDownCapture:q?E:void 0,onClickCapture:q?C:void 0,onPointerLeave:N,ref:W,style:r8,children:[U,il.jsx(kV,{})]})}function KF({id:l,store:u,unselect:r=!1,nodeRef:f}){let{addSelectedNodes:n,unselectNodesAndEdges:t,multiSelectionActive:i,nodeLookup:y,onError:c}=u.getState(),_=y.get(l);if(!_){c?.("012",mf.error012(l));return}if(u.setState({nodesSelectionActive:!1}),!_.selected)n([l]);else if(r||_.selected&&i)t({nodes:[_],edges:[]}),requestAnimationFrame(()=>f?.current?.blur())}function rL({nodeRef:l,disabled:u=!1,noDragClassName:r,handleSelector:f,nodeId:n,isSelectable:t,nodeClickDistance:i}){let y=Vu(),[c,_]=_l.useState(!1),A=_l.useRef();return _l.useEffect(()=>{A.current=uq({getStoreItems:()=>y.getState(),onNodeMouseDown:(F)=>{KF({id:F,store:y,nodeRef:l})},onDragStart:()=>{_(!0)},onDragStop:()=>{_(!1)}})},[]),_l.useEffect(()=>{if(u||!l.current||!A.current)return;return A.current.update({noDragClassName:r,handleSelector:f,domNode:l.current,isSelectable:t,nodeId:n,nodeClickDistance:i}),()=>{A.current?.destroy()}},[r,f,u,t,l,n,i]),c}var oV=(l)=>(u)=>u.selected&&(u.draggable||l&&typeof u.draggable>"u");function fL(){let l=Vu();return _l.useCallback((r)=>{let{nodeExtent:f,snapToGrid:n,snapGrid:t,nodesDraggable:i,onError:y,updateNodePositions:c,nodeLookup:_,nodeOrigin:A}=l.getState(),F=new Map,j=oV(i),N=n?t[0]:5,U=n?t[1]:5,w=r.direction.x*N*r.factor,G=r.direction.y*U*r.factor;for(let[,J]of _){if(!j(J))continue;let Q={x:J.internals.positionAbsolute.x+w,y:J.internals.positionAbsolute.y+G};if(n)Q=Sy(Q,t);let{position:m,positionAbsolute:q}=fF({nodeId:J.id,nextPosition:Q,nodeLookup:_,nodeExtent:f,nodeOrigin:A,onError:y});J.position=m,J.internals.positionAbsolute=q,F.set(J.id,J)}c(F)},[])}var pF=_l.createContext(null),dV=pF.Provider;pF.Consumer;var nL=()=>{return _l.useContext(pF)},eV=(l)=>({connectOnClick:l.connectOnClick,noPanClassName:l.noPanClassName,rfId:l.rfId}),lS=(l,u,r)=>(f)=>{let{connectionClickStartHandle:n,connectionMode:t,connection:i}=f,{fromHandle:y,toHandle:c,isValid:_}=i,A=c?.nodeId===l&&c?.id===u&&c?.type===r;return{connectingFrom:y?.nodeId===l&&y?.id===u&&y?.type===r,connectingTo:A,clickConnecting:n?.nodeId===l&&n?.id===u&&n?.type===r,isPossibleEndHandle:t===ui.Strict?y?.type!==r:l!==y?.nodeId||u!==y?.id,connectionInProcess:!!y,clickConnectionInProcess:!!n,valid:A&&_}};function uS({type:l="source",position:u=Ol.Top,isValidConnection:r,isConnectable:f=!0,isConnectableStart:n=!0,isConnectableEnd:t=!0,id:i,onConnect:y,children:c,className:_,onMouseDown:A,onTouchStart:F,...j},N){let U=i||null,w=l==="target",G=Vu(),J=nL(),{connectOnClick:Q,noPanClassName:m,rfId:q}=$u(eV,zu),{connectingFrom:W,connectingTo:p,clickConnecting:O,isPossibleEndHandle:Z,connectionInProcess:V,clickConnectionInProcess:P,valid:H}=$u(lS(J,U,l),zu);if(!J)G.getState().onError?.("010",mf.error010());let B=(D)=>{let{defaultEdgeOptions:Y,onConnect:v,hasDefaultEdges:K}=G.getState(),X={...Y,...D};if(K){let{edges:I,setEdges:o}=G.getState();o(NF(X,I))}v?.(X),y?.(X)},C=(D)=>{if(!J)return;let Y=FF(D.nativeEvent);if(n&&(Y&&D.button===0||!Y)){let v=G.getState();kA.onPointerDown(D.nativeEvent,{handleDomNode:D.currentTarget,autoPanOnConnect:v.autoPanOnConnect,connectionMode:v.connectionMode,connectionRadius:v.connectionRadius,domNode:v.domNode,nodeLookup:v.nodeLookup,lib:v.lib,isTarget:w,handleId:U,nodeId:J,flowId:v.rfId,panBy:v.panBy,cancelConnection:v.cancelConnection,onConnectStart:v.onConnectStart,onConnectEnd:(...K)=>G.getState().onConnectEnd?.(...K),updateConnection:v.updateConnection,onConnect:B,isValidConnection:r||((...K)=>G.getState().isValidConnection?.(...K)??!0),getTransform:()=>G.getState().transform,getFromHandle:()=>G.getState().connection.fromHandle,autoPanSpeed:v.autoPanSpeed,dragThreshold:v.connectionDragThreshold})}if(Y)A?.(D);else F?.(D)},E=(D)=>{let{onClickConnectStart:Y,onClickConnectEnd:v,connectionClickStartHandle:K,connectionMode:X,isValidConnection:I,lib:o,rfId:fl,nodeLookup:yl,connection:h}=G.getState();if(!J||!K&&!n)return;if(!K){Y?.(D.nativeEvent,{nodeId:J,handleId:U,handleType:l}),G.setState({connectionClickStartHandle:{nodeId:J,type:l,id:U}});return}let s=_F(D.target),ul=r||I,{connection:tl,isValid:Al}=kA.isValid(D.nativeEvent,{handle:{nodeId:J,id:U,type:l},connectionMode:X,fromNodeId:K.nodeId,fromHandleId:K.id||null,fromType:K.type,isValidConnection:ul,flowId:fl,doc:s,lib:o,nodeLookup:yl});if(Al&&tl)B(tl);let Kl=structuredClone(h);delete Kl.inProgress,Kl.toPosition=Kl.toHandle?Kl.toHandle.position:null,v?.(D,Kl),G.setState({connectionClickStartHandle:null})};return il.jsx("div",{"data-handleid":U,"data-nodeid":J,"data-handlepos":u,"data-id":`${q}-${J}-${U}-${l}`,className:bu(["react-flow__handle",`react-flow__handle-${u}`,"nodrag",m,_,{source:!w,target:w,connectable:f,connectablestart:n,connectableend:t,clickconnecting:O,connectingfrom:W,connectingto:p,valid:H,connectionindicator:f&&(!V||Z)&&(V||P?t:n)}]),onMouseDown:C,onTouchStart:C,onClick:Q?E:void 0,ref:N,...j,children:c})}var c0=_l.memo(lL(uS));function rS({data:l,isConnectable:u,sourcePosition:r=Ol.Bottom}){return il.jsxs(il.Fragment,{children:[l?.label,il.jsx(c0,{type:"source",position:r,isConnectable:u})]})}function fS({data:l,isConnectable:u,targetPosition:r=Ol.Top,sourcePosition:f=Ol.Bottom}){return il.jsxs(il.Fragment,{children:[il.jsx(c0,{type:"target",position:r,isConnectable:u}),l?.label,il.jsx(c0,{type:"source",position:f,isConnectable:u})]})}function nS(){return null}function tS({data:l,isConnectable:u,targetPosition:r=Ol.Top}){return il.jsxs(il.Fragment,{children:[il.jsx(c0,{type:"target",position:r,isConnectable:u}),l?.label]})}var eA={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}},Pq={input:rS,default:fS,output:tS,group:nS};function iS(l){if(l.internals.handleBounds===void 0)return{width:l.width??l.initialWidth??l.style?.width,height:l.height??l.initialHeight??l.style?.height};return{width:l.width??l.style?.width,height:l.height??l.style?.height}}var yS=(l)=>{let{width:u,height:r,x:f,y:n}=Dy(l.nodeLookup,{filter:(t)=>!!t.selected});return{width:Vf(u)?u:null,height:Vf(r)?r:null,userSelectionActive:l.userSelectionActive,transformString:`translate(${l.transform[0]}px,${l.transform[1]}px) scale(${l.transform[2]}) translate(${f}px,${n}px)`}};function cS({onSelectionContextMenu:l,noPanClassName:u,disableKeyboardA11y:r}){let f=Vu(),{width:n,height:t,transformString:i,userSelectionActive:y}=$u(yS,zu),c=fL(),_=_l.useRef(null);_l.useEffect(()=>{if(!r)_.current?.focus({preventScroll:!0})},[r]);let A=!y&&n!==null&&t!==null;if(rL({nodeRef:_,disabled:!A}),!A)return null;let F=l?(N)=>{let U=f.getState().nodes.filter((w)=>w.selected);l(N,U)}:void 0,j=(N)=>{if(Object.prototype.hasOwnProperty.call(eA,N.key))N.preventDefault(),c({direction:eA[N.key],factor:N.shiftKey?4:1})};return il.jsx("div",{className:bu(["react-flow__nodesselection","react-flow__container",u]),style:{transform:i},children:il.jsx("div",{ref:_,className:"react-flow__nodesselection-rect",onContextMenu:F,tabIndex:r?void 0:-1,onKeyDown:r?void 0:j,style:{width:n,height:t}})})}var Cq=typeof window<"u"?window:void 0,$S=(l)=>{return{nodesSelectionActive:l.nodesSelectionActive,userSelectionActive:l.userSelectionActive}};function tL({children:l,onPaneClick:u,onPaneMouseEnter:r,onPaneMouseMove:f,onPaneMouseLeave:n,onPaneContextMenu:t,onPaneScroll:i,paneClickDistance:y,deleteKeyCode:c,selectionKeyCode:_,selectionOnDrag:A,selectionMode:F,onSelectionStart:j,onSelectionEnd:N,multiSelectionKeyCode:U,panActivationKeyCode:w,zoomActivationKeyCode:G,elementsSelectable:J,zoomOnScroll:Q,zoomOnPinch:m,panOnScroll:q,panOnScrollSpeed:W,panOnScrollMode:p,zoomOnDoubleClick:O,panOnDrag:Z,defaultViewport:V,translateExtent:P,minZoom:H,maxZoom:B,preventScrolling:C,onSelectionContextMenu:E,noWheelClassName:D,noPanClassName:Y,disableKeyboardA11y:v,onViewportChange:K,isControlledViewport:X}){let{nodesSelectionActive:I,userSelectionActive:o}=$u($S,zu),fl=c$(_,{target:Cq}),yl=c$(w,{target:Cq}),h=yl||Z,s=yl||q,ul=A&&h!==!0,tl=fl||o||ul;return RV({deleteKeyCode:c,multiSelectionKeyCode:U}),il.jsx(vV,{onPaneContextMenu:t,elementsSelectable:J,zoomOnScroll:Q,zoomOnPinch:m,panOnScroll:s,panOnScrollSpeed:W,panOnScrollMode:p,zoomOnDoubleClick:O,panOnDrag:!fl&&h,defaultViewport:V,translateExtent:P,minZoom:H,maxZoom:B,zoomActivationKeyCode:G,preventScrolling:C,noWheelClassName:D,noPanClassName:Y,onViewportChange:K,isControlledViewport:X,paneClickDistance:y,selectionOnDrag:ul,children:il.jsxs(aV,{onSelectionStart:j,onSelectionEnd:N,onPaneClick:u,onPaneMouseEnter:r,onPaneMouseMove:f,onPaneMouseLeave:n,onPaneContextMenu:t,onPaneScroll:i,panOnDrag:h,isSelecting:!!tl,selectionMode:F,selectionKeyPressed:fl,paneClickDistance:y,selectionOnDrag:ul,children:[l,I&&il.jsx(cS,{onSelectionContextMenu:E,noPanClassName:Y,disableKeyboardA11y:v})]})})}tL.displayName="FlowRenderer";var _S=_l.memo(tL),AS=(l)=>(u)=>{return l?PA(u.nodeLookup,{x:0,y:0,width:u.width,height:u.height},u.transform,!0).map((r)=>r.id):Array.from(u.nodeLookup.keys())};function FS(l){return $u(_l.useCallback(AS(l),[l]),zu)}var jS=(l)=>l.updateNodeInternals;function NS(){let l=$u(jS),[u]=_l.useState(()=>{if(typeof ResizeObserver>"u")return null;return new ResizeObserver((r)=>{let f=new Map;r.forEach((n)=>{let t=n.target.getAttribute("data-id");f.set(t,{id:t,nodeElement:n.target,force:!0})}),l(f)})});return _l.useEffect(()=>{return()=>{u?.disconnect()}},[u]),u}function JS({node:l,nodeType:u,hasDimensions:r,resizeObserver:f}){let n=Vu(),t=_l.useRef(null),i=_l.useRef(null),y=_l.useRef(l.sourcePosition),c=_l.useRef(l.targetPosition),_=_l.useRef(u),A=r&&!!l.internals.handleBounds;return _l.useEffect(()=>{if(t.current&&!l.hidden&&(!A||i.current!==t.current)){if(i.current)f?.unobserve(i.current);f?.observe(t.current),i.current=t.current}},[A,l.hidden]),_l.useEffect(()=>{return()=>{if(i.current)f?.unobserve(i.current),i.current=null}},[]),_l.useEffect(()=>{if(t.current){let F=_.current!==u,j=y.current!==l.sourcePosition,N=c.current!==l.targetPosition;if(F||j||N)_.current=u,y.current=l.sourcePosition,c.current=l.targetPosition,n.getState().updateNodeInternals(new Map([[l.id,{id:l.id,nodeElement:t.current,force:!0}]]))}},[l.id,u,l.sourcePosition,l.targetPosition]),t}function US({id:l,onClick:u,onMouseEnter:r,onMouseMove:f,onMouseLeave:n,onContextMenu:t,onDoubleClick:i,nodesDraggable:y,elementsSelectable:c,nodesConnectable:_,nodesFocusable:A,resizeObserver:F,noDragClassName:j,noPanClassName:N,disableKeyboardA11y:U,rfId:w,nodeTypes:G,nodeClickDistance:J,onError:Q}){let{node:m,internals:q,isParent:W}=$u((Al)=>{let Kl=Al.nodeLookup.get(l),wl=Al.parentLookup.has(l);return{node:Kl,internals:Kl.internals,isParent:wl}},zu),p=m.type||"default",O=G?.[p]||Pq[p];if(O===void 0)Q?.("003",mf.error003(p)),p="default",O=G?.default||Pq.default;let Z=!!(m.draggable||y&&typeof m.draggable>"u"),V=!!(m.selectable||c&&typeof m.selectable>"u"),P=!!(m.connectable||_&&typeof m.connectable>"u"),H=!!(m.focusable||A&&typeof m.focusable>"u"),B=Vu(),C=yF(m),E=JS({node:m,nodeType:p,hasDimensions:C,resizeObserver:F}),D=rL({nodeRef:E,disabled:m.hidden||!Z,noDragClassName:j,handleSelector:m.dragHandle,nodeId:l,isSelectable:V,nodeClickDistance:J}),Y=fL();if(m.hidden)return null;let v=zn(m),K=iS(m),X=V||Z||u||r||f||n,I=r?(Al)=>r(Al,{...q.userNode}):void 0,o=f?(Al)=>f(Al,{...q.userNode}):void 0,fl=n?(Al)=>n(Al,{...q.userNode}):void 0,yl=t?(Al)=>t(Al,{...q.userNode}):void 0,h=i?(Al)=>i(Al,{...q.userNode}):void 0,s=(Al)=>{let{selectNodesOnDrag:Kl,nodeDragThreshold:wl}=B.getState();if(V&&(!Kl||!Z||wl>0))KF({id:l,store:B,nodeRef:E});if(u)u(Al,{...q.userNode})},ul=(Al)=>{if(AF(Al.nativeEvent)||U)return;if(a9.includes(Al.key)&&V){let Kl=Al.key==="Escape";KF({id:l,store:B,unselect:Kl,nodeRef:E})}else if(Z&&m.selected&&Object.prototype.hasOwnProperty.call(eA,Al.key)){Al.preventDefault();let{ariaLabelConfig:Kl}=B.getState();B.setState({ariaLiveMessage:Kl["node.a11yDescription.ariaLiveMessage"]({direction:Al.key.replace("Arrow","").toLowerCase(),x:~~q.positionAbsolute.x,y:~~q.positionAbsolute.y})}),Y({direction:eA[Al.key],factor:Al.shiftKey?4:1})}},tl=()=>{if(U||!E.current?.matches(":focus-visible"))return;let{transform:Al,width:Kl,height:wl,autoPanOnNodeFocus:El,setCenter:M}=B.getState();if(!El)return;if(!(PA(new Map([[l,m]]),{x:0,y:0,width:Kl,height:wl},Al,!0).length>0))M(m.position.x+v.width/2,m.position.y+v.height/2,{zoom:Al[2]})};return il.jsx("div",{className:bu(["react-flow__node",`react-flow__node-${p}`,{[N]:Z},m.className,{selected:m.selected,selectable:V,parent:W,draggable:Z,dragging:D}]),ref:E,style:{zIndex:q.z,transform:`translate(${q.positionAbsolute.x}px,${q.positionAbsolute.y}px)`,pointerEvents:X?"all":"none",visibility:C?"visible":"hidden",...m.style,...K},"data-id":l,"data-testid":`rf__node-${l}`,onMouseEnter:I,onMouseMove:o,onMouseLeave:fl,onContextMenu:yl,onClick:s,onDoubleClick:h,onKeyDown:H?ul:void 0,tabIndex:H?0:void 0,onFocus:H?tl:void 0,role:m.ariaRole??(H?"group":void 0),"aria-roledescription":"node","aria-describedby":U?void 0:`${aq}-${w}`,"aria-label":m.ariaLabel,...m.domAttributes,children:il.jsx(dV,{value:l,children:il.jsx(O,{id:l,data:m.data,type:p,positionAbsoluteX:q.positionAbsolute.x,positionAbsoluteY:q.positionAbsolute.y,selected:m.selected??!1,selectable:V,draggable:Z,deletable:m.deletable??!0,isConnectable:P,sourcePosition:m.sourcePosition,targetPosition:m.targetPosition,dragging:D,dragHandle:m.dragHandle,zIndex:q.z,parentId:m.parentId,...v})})})}var QS=_l.memo(US),mS=(l)=>({nodesDraggable:l.nodesDraggable,nodesConnectable:l.nodesConnectable,nodesFocusable:l.nodesFocusable,elementsSelectable:l.elementsSelectable,onError:l.onError});function iL(l){let{nodesDraggable:u,nodesConnectable:r,nodesFocusable:f,elementsSelectable:n,onError:t}=$u(mS,zu),i=FS(l.onlyRenderVisibleElements),y=NS();return il.jsx("div",{className:"react-flow__nodes",style:r8,children:i.map((c)=>{return il.jsx(QS,{id:c,nodeTypes:l.nodeTypes,nodeExtent:l.nodeExtent,onClick:l.onNodeClick,onMouseEnter:l.onNodeMouseEnter,onMouseMove:l.onNodeMouseMove,onMouseLeave:l.onNodeMouseLeave,onContextMenu:l.onNodeContextMenu,onDoubleClick:l.onNodeDoubleClick,noDragClassName:l.noDragClassName,noPanClassName:l.noPanClassName,rfId:l.rfId,disableKeyboardA11y:l.disableKeyboardA11y,resizeObserver:y,nodesDraggable:u,nodesConnectable:r,nodesFocusable:f,elementsSelectable:n,nodeClickDistance:l.nodeClickDistance,onError:t},c)})})}iL.displayName="NodeRenderer";var wS=_l.memo(iL);function qS(l){return $u(_l.useCallback((r)=>{if(!l)return r.edges.map((n)=>n.id);let f=[];if(r.width&&r.height)for(let n of r.edges){let t=r.nodeLookup.get(n.source),i=r.nodeLookup.get(n.target);if(t&&i&&vw({sourceNode:t,targetNode:i,width:r.width,height:r.height,transform:r.transform}))f.push(n.id)}return f},[l]),zu)}var LS=({color:l="none",strokeWidth:u=1})=>{let r={strokeWidth:u,...l&&{stroke:l}};return il.jsx("polyline",{className:"arrow",style:r,strokeLinecap:"round",fill:"none",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4"})},GS=({color:l="none",strokeWidth:u=1})=>{let r={strokeWidth:u,...l&&{stroke:l,fill:l}};return il.jsx("polyline",{className:"arrowclosed",style:r,strokeLinecap:"round",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4 -5,-4"})},hq={[ri.Arrow]:LS,[ri.ArrowClosed]:GS};function WS(l){let u=Vu();return _l.useMemo(()=>{if(!Object.prototype.hasOwnProperty.call(hq,l))return u.getState().onError?.("009",mf.error009(l)),null;return hq[l]},[l])}var TS=({id:l,type:u,color:r,width:f=12.5,height:n=12.5,markerUnits:t="strokeWidth",strokeWidth:i,orient:y="auto-start-reverse"})=>{let c=WS(u);if(!c)return null;return il.jsx("marker",{className:"react-flow__arrowhead",id:l,markerWidth:`${f}`,markerHeight:`${n}`,viewBox:"-10 -10 20 20",markerUnits:t,orient:y,refX:"0",refY:"0",children:il.jsx(c,{color:r,strokeWidth:i})})},yL=({defaultColor:l,rfId:u})=>{let r=$u((t)=>t.edges),f=$u((t)=>t.defaultEdgeOptions),n=_l.useMemo(()=>{return kw(r,{id:u,defaultColor:l,defaultMarkerStart:f?.markerStart,defaultMarkerEnd:f?.markerEnd})},[r,f,u,l]);if(!n.length)return null;return il.jsx("svg",{className:"react-flow__marker","aria-hidden":"true",children:il.jsx("defs",{children:n.map((t)=>il.jsx(TS,{id:t.id,type:t.type,color:t.color,width:t.width,height:t.height,markerUnits:t.markerUnits,strokeWidth:t.strokeWidth,orient:t.orient},t.id))})})};yL.displayName="MarkerDefinitions";var KS=_l.memo(yL);function cL({x:l,y:u,label:r,labelStyle:f,labelShowBg:n=!0,labelBgStyle:t,labelBgPadding:i=[2,4],labelBgBorderRadius:y=2,children:c,className:_,...A}){let[F,j]=_l.useState({x:1,y:0,width:0,height:0}),N=bu(["react-flow__edge-textwrapper",_]),U=_l.useRef(null);if(_l.useEffect(()=>{if(U.current){let w=U.current.getBBox();j({x:w.x,y:w.y,width:w.width,height:w.height})}},[r]),!r)return null;return il.jsxs("g",{transform:`translate(${l-F.width/2} ${u-F.height/2})`,className:N,visibility:F.width?"visible":"hidden",...A,children:[n&&il.jsx("rect",{width:F.width+2*i[0],x:-i[0],y:-i[1],height:F.height+2*i[1],className:"react-flow__edge-textbg",style:t,rx:y,ry:y}),il.jsx("text",{className:"react-flow__edge-text",y:F.height/2,dy:"0.3em",ref:U,style:f,children:r}),c]})}cL.displayName="EdgeText";var ES=_l.memo(cL);function hy({path:l,labelX:u,labelY:r,label:f,labelStyle:n,labelShowBg:t,labelBgStyle:i,labelBgPadding:y,labelBgBorderRadius:c,interactionWidth:_=20,...A}){return il.jsxs(il.Fragment,{children:[il.jsx("path",{...A,d:l,fill:"none",className:bu(["react-flow__edge-path",A.className])}),_?il.jsx("path",{d:l,fill:"none",strokeOpacity:0,strokeWidth:_,className:"react-flow__edge-interaction"}):null,f&&Vf(u)&&Vf(r)?il.jsx(ES,{x:u,y:r,label:f,labelStyle:n,labelShowBg:t,labelBgStyle:i,labelBgPadding:y,labelBgBorderRadius:c}):null]})}function Mq({pos:l,x1:u,y1:r,x2:f,y2:n}){if(l===Ol.Left||l===Ol.Right)return[0.5*(u+f),r];return[u,0.5*(r+n)]}function $L({sourceX:l,sourceY:u,sourcePosition:r=Ol.Bottom,targetX:f,targetY:n,targetPosition:t=Ol.Top}){let[i,y]=Mq({pos:r,x1:l,y1:u,x2:f,y2:n}),[c,_]=Mq({pos:t,x1:f,y1:n,x2:l,y2:u}),[A,F,j,N]=sA({sourceX:l,sourceY:u,targetX:f,targetY:n,sourceControlX:i,sourceControlY:y,targetControlX:c,targetControlY:_});return[`M${l},${u} C${i},${y} ${c},${_} ${f},${n}`,A,F,j,N]}function _L(l){return _l.memo(({id:u,sourceX:r,sourceY:f,targetX:n,targetY:t,sourcePosition:i,targetPosition:y,label:c,labelStyle:_,labelShowBg:A,labelBgStyle:F,labelBgPadding:j,labelBgBorderRadius:N,style:U,markerEnd:w,markerStart:G,interactionWidth:J})=>{let[Q,m,q]=$L({sourceX:r,sourceY:f,sourcePosition:i,targetX:n,targetY:t,targetPosition:y}),W=l.isInternal?void 0:u;return il.jsx(hy,{id:W,path:Q,labelX:m,labelY:q,label:c,labelStyle:_,labelShowBg:A,labelBgStyle:F,labelBgPadding:j,labelBgBorderRadius:N,style:U,markerEnd:w,markerStart:G,interactionWidth:J})})}var pS=_L({isInternal:!1}),AL=_L({isInternal:!0});pS.displayName="SimpleBezierEdge";AL.displayName="SimpleBezierEdgeInternal";function FL(l){return _l.memo(({id:u,sourceX:r,sourceY:f,targetX:n,targetY:t,label:i,labelStyle:y,labelShowBg:c,labelBgStyle:_,labelBgPadding:A,labelBgBorderRadius:F,style:j,sourcePosition:N=Ol.Bottom,targetPosition:U=Ol.Top,markerEnd:w,markerStart:G,pathOptions:J,interactionWidth:Q})=>{let[m,q,W]=y$({sourceX:r,sourceY:f,sourcePosition:N,targetX:n,targetY:t,targetPosition:U,borderRadius:J?.borderRadius,offset:J?.offset,stepPosition:J?.stepPosition}),p=l.isInternal?void 0:u;return il.jsx(hy,{id:p,path:m,labelX:q,labelY:W,label:i,labelStyle:y,labelShowBg:c,labelBgStyle:_,labelBgPadding:A,labelBgBorderRadius:F,style:j,markerEnd:w,markerStart:G,interactionWidth:Q})})}var jL=FL({isInternal:!1}),NL=FL({isInternal:!0});jL.displayName="SmoothStepEdge";NL.displayName="SmoothStepEdgeInternal";function JL(l){return _l.memo(({id:u,...r})=>{let f=l.isInternal?void 0:u;return il.jsx(jL,{...r,id:f,pathOptions:_l.useMemo(()=>({borderRadius:0,offset:r.pathOptions?.offset}),[r.pathOptions?.offset])})})}var zS=JL({isInternal:!1}),UL=JL({isInternal:!0});zS.displayName="StepEdge";UL.displayName="StepEdgeInternal";function QL(l){return _l.memo(({id:u,sourceX:r,sourceY:f,targetX:n,targetY:t,label:i,labelStyle:y,labelShowBg:c,labelBgStyle:_,labelBgPadding:A,labelBgBorderRadius:F,style:j,markerEnd:N,markerStart:U,interactionWidth:w})=>{let[G,J,Q]=xA({sourceX:r,sourceY:f,targetX:n,targetY:t}),m=l.isInternal?void 0:u;return il.jsx(hy,{id:m,path:G,labelX:J,labelY:Q,label:i,labelStyle:y,labelShowBg:c,labelBgStyle:_,labelBgPadding:A,labelBgBorderRadius:F,style:j,markerEnd:N,markerStart:U,interactionWidth:w})})}var OS=QL({isInternal:!1}),mL=QL({isInternal:!0});OS.displayName="StraightEdge";mL.displayName="StraightEdgeInternal";function wL(l){return _l.memo(({id:u,sourceX:r,sourceY:f,targetX:n,targetY:t,sourcePosition:i=Ol.Bottom,targetPosition:y=Ol.Top,label:c,labelStyle:_,labelShowBg:A,labelBgStyle:F,labelBgPadding:j,labelBgBorderRadius:N,style:U,markerEnd:w,markerStart:G,pathOptions:J,interactionWidth:Q})=>{let[m,q,W]=RA({sourceX:r,sourceY:f,sourcePosition:i,targetX:n,targetY:t,targetPosition:y,curvature:J?.curvature}),p=l.isInternal?void 0:u;return il.jsx(hy,{id:p,path:m,labelX:q,labelY:W,label:c,labelStyle:_,labelShowBg:A,labelBgStyle:F,labelBgPadding:j,labelBgBorderRadius:N,style:U,markerEnd:w,markerStart:G,interactionWidth:Q})})}var ZS=wL({isInternal:!1}),qL=wL({isInternal:!0});ZS.displayName="BezierEdge";qL.displayName="BezierEdgeInternal";var sq={default:qL,straight:mL,step:UL,smoothstep:NL,simplebezier:AL},Rq={sourceX:null,sourceY:null,targetX:null,targetY:null,sourcePosition:null,targetPosition:null},HS=(l,u,r)=>{if(r===Ol.Left)return l-u;if(r===Ol.Right)return l+u;return l},BS=(l,u,r)=>{if(r===Ol.Top)return l-u;if(r===Ol.Bottom)return l+u;return l},xq="react-flow__edgeupdater";function bq({position:l,centerX:u,centerY:r,radius:f=10,onMouseDown:n,onMouseEnter:t,onMouseOut:i,type:y}){return il.jsx("circle",{onMouseDown:n,onMouseEnter:t,onMouseOut:i,className:bu([xq,`${xq}-${y}`]),cx:HS(u,f,l),cy:BS(r,f,l),r:f,stroke:"transparent",fill:"transparent"})}function DS({isReconnectable:l,reconnectRadius:u,edge:r,sourceX:f,sourceY:n,targetX:t,targetY:i,sourcePosition:y,targetPosition:c,onReconnect:_,onReconnectStart:A,onReconnectEnd:F,setReconnecting:j,setUpdateHover:N}){let U=Vu(),w=(q,W)=>{if(q.button!==0)return;let{autoPanOnConnect:p,domNode:O,connectionMode:Z,connectionRadius:V,lib:P,onConnectStart:H,cancelConnection:B,nodeLookup:C,rfId:E,panBy:D,updateConnection:Y}=U.getState(),v=W.type==="target",K=(o,fl)=>{j(!1),F?.(o,r,W.type,fl)},X=(o)=>_?.(r,o),I=(o,fl)=>{j(!0),A?.(q,r,W.type),H?.(o,fl)};kA.onPointerDown(q.nativeEvent,{autoPanOnConnect:p,connectionMode:Z,connectionRadius:V,domNode:O,handleId:W.id,nodeId:W.nodeId,nodeLookup:C,isTarget:v,edgeUpdaterType:W.type,lib:P,flowId:E,cancelConnection:B,panBy:D,isValidConnection:(...o)=>U.getState().isValidConnection?.(...o)??!0,onConnect:X,onConnectStart:I,onConnectEnd:(...o)=>U.getState().onConnectEnd?.(...o),onReconnectEnd:K,updateConnection:Y,getTransform:()=>U.getState().transform,getFromHandle:()=>U.getState().connection.fromHandle,dragThreshold:U.getState().connectionDragThreshold,handleDomNode:q.currentTarget})},G=(q)=>w(q,{nodeId:r.target,id:r.targetHandle??null,type:"target"}),J=(q)=>w(q,{nodeId:r.source,id:r.sourceHandle??null,type:"source"}),Q=()=>N(!0),m=()=>N(!1);return il.jsxs(il.Fragment,{children:[(l===!0||l==="source")&&il.jsx(bq,{position:y,centerX:f,centerY:n,radius:u,onMouseDown:G,onMouseEnter:Q,onMouseOut:m,type:"source"}),(l===!0||l==="target")&&il.jsx(bq,{position:c,centerX:t,centerY:i,radius:u,onMouseDown:J,onMouseEnter:Q,onMouseOut:m,type:"target"})]})}function VS({id:l,edgesFocusable:u,edgesReconnectable:r,elementsSelectable:f,onClick:n,onDoubleClick:t,onContextMenu:i,onMouseEnter:y,onMouseMove:c,onMouseLeave:_,reconnectRadius:A,onReconnect:F,onReconnectStart:j,onReconnectEnd:N,rfId:U,edgeTypes:w,noPanClassName:G,onError:J,disableKeyboardA11y:Q}){let m=$u((M)=>M.edgeLookup.get(l)),q=$u((M)=>M.defaultEdgeOptions);m=q?{...q,...m}:m;let W=m.type||"default",p=w?.[W]||sq[W];if(p===void 0)J?.("011",mf.error011(W)),W="default",p=w?.default||sq.default;let O=!!(m.focusable||u&&typeof m.focusable>"u"),Z=typeof F<"u"&&(m.reconnectable||r&&typeof m.reconnectable>"u"),V=!!(m.selectable||f&&typeof m.selectable>"u"),P=_l.useRef(null),[H,B]=_l.useState(!1),[C,E]=_l.useState(!1),D=Vu(),{zIndex:Y,sourceX:v,sourceY:K,targetX:X,targetY:I,sourcePosition:o,targetPosition:fl}=$u(_l.useCallback((M)=>{let d=M.nodeLookup.get(m.source),nl=M.nodeLookup.get(m.target);if(!d||!nl)return{zIndex:m.zIndex,...Rq};let k=gw({id:l,sourceNode:d,targetNode:nl,sourceHandle:m.sourceHandle||null,targetHandle:m.targetHandle||null,connectionMode:M.connectionMode,onError:J});return{zIndex:bw({selected:m.selected,zIndex:m.zIndex,sourceNode:d,targetNode:nl,elevateOnSelect:M.elevateEdgesOnSelect,zIndexMode:M.zIndexMode}),...k||Rq}},[m.source,m.target,m.sourceHandle,m.targetHandle,m.selected,m.zIndex]),zu),yl=_l.useMemo(()=>m.markerStart?`url('#${bA(m.markerStart,U)}')`:void 0,[m.markerStart,U]),h=_l.useMemo(()=>m.markerEnd?`url('#${bA(m.markerEnd,U)}')`:void 0,[m.markerEnd,U]);if(m.hidden||v===null||K===null||X===null||I===null)return null;let s=(M)=>{let{addSelectedEdges:d,unselectNodesAndEdges:nl,multiSelectionActive:k}=D.getState();if(V)if(D.setState({nodesSelectionActive:!1}),m.selected&&k)nl({nodes:[],edges:[m]}),P.current?.blur();else d([l]);if(n)n(M,m)},ul=t?(M)=>{t(M,{...m})}:void 0,tl=i?(M)=>{i(M,{...m})}:void 0,Al=y?(M)=>{y(M,{...m})}:void 0,Kl=c?(M)=>{c(M,{...m})}:void 0,wl=_?(M)=>{_(M,{...m})}:void 0,El=(M)=>{if(!Q&&a9.includes(M.key)&&V){let{unselectNodesAndEdges:d,addSelectedEdges:nl}=D.getState();if(M.key==="Escape")P.current?.blur(),d({edges:[m]});else nl([l])}};return il.jsx("svg",{style:{zIndex:Y},children:il.jsxs("g",{className:bu(["react-flow__edge",`react-flow__edge-${W}`,m.className,G,{selected:m.selected,animated:m.animated,inactive:!V&&!n,updating:H,selectable:V}]),onClick:s,onDoubleClick:ul,onContextMenu:tl,onMouseEnter:Al,onMouseMove:Kl,onMouseLeave:wl,onKeyDown:O?El:void 0,tabIndex:O?0:void 0,role:m.ariaRole??(O?"group":"img"),"aria-roledescription":"edge","data-id":l,"data-testid":`rf__edge-${l}`,"aria-label":m.ariaLabel===null?void 0:m.ariaLabel||`Edge from ${m.source} to ${m.target}`,"aria-describedby":O?`${oq}-${U}`:void 0,ref:P,...m.domAttributes,children:[!C&&il.jsx(p,{id:l,source:m.source,target:m.target,type:m.type,selected:m.selected,animated:m.animated,selectable:V,deletable:m.deletable??!0,label:m.label,labelStyle:m.labelStyle,labelShowBg:m.labelShowBg,labelBgStyle:m.labelBgStyle,labelBgPadding:m.labelBgPadding,labelBgBorderRadius:m.labelBgBorderRadius,sourceX:v,sourceY:K,targetX:X,targetY:I,sourcePosition:o,targetPosition:fl,data:m.data,style:m.style,sourceHandleId:m.sourceHandle,targetHandleId:m.targetHandle,markerStart:yl,markerEnd:h,pathOptions:"pathOptions"in m?m.pathOptions:void 0,interactionWidth:m.interactionWidth}),Z&&il.jsx(DS,{edge:m,isReconnectable:Z,reconnectRadius:A,onReconnect:F,onReconnectStart:j,onReconnectEnd:N,sourceX:v,sourceY:K,targetX:X,targetY:I,sourcePosition:o,targetPosition:fl,setUpdateHover:B,setReconnecting:E})]})})}var SS=_l.memo(VS),YS=(l)=>({edgesFocusable:l.edgesFocusable,edgesReconnectable:l.edgesReconnectable,elementsSelectable:l.elementsSelectable,connectionMode:l.connectionMode,onError:l.onError});function LL({defaultMarkerColor:l,onlyRenderVisibleElements:u,rfId:r,edgeTypes:f,noPanClassName:n,onReconnect:t,onEdgeContextMenu:i,onEdgeMouseEnter:y,onEdgeMouseMove:c,onEdgeMouseLeave:_,onEdgeClick:A,reconnectRadius:F,onEdgeDoubleClick:j,onReconnectStart:N,onReconnectEnd:U,disableKeyboardA11y:w}){let{edgesFocusable:G,edgesReconnectable:J,elementsSelectable:Q,onError:m}=$u(YS,zu),q=qS(u);return il.jsxs("div",{className:"react-flow__edges",children:[il.jsx(KS,{defaultColor:l,rfId:r}),q.map((W)=>{return il.jsx(SS,{id:W,edgesFocusable:G,edgesReconnectable:J,elementsSelectable:Q,noPanClassName:n,onReconnect:t,onContextMenu:i,onMouseEnter:y,onMouseMove:c,onMouseLeave:_,onClick:A,reconnectRadius:F,onDoubleClick:j,onReconnectStart:N,onReconnectEnd:U,rfId:r,onError:m,edgeTypes:f,disableKeyboardA11y:w},W)})]})}LL.displayName="EdgeRenderer";var XS=_l.memo(LL),PS=(l)=>`translate(${l.transform[0]}px,${l.transform[1]}px) scale(${l.transform[2]})`;function CS({children:l}){let u=$u(PS);return il.jsx("div",{className:"react-flow__viewport xyflow__viewport react-flow__container",style:{transform:u},children:l})}function hS(l){let u=EF(),r=_l.useRef(!1);_l.useEffect(()=>{if(!r.current&&u.viewportInitialized&&l)setTimeout(()=>l(u),1),r.current=!0},[l,u.viewportInitialized])}var MS=(l)=>l.panZoom?.syncViewport;function sS(l){let u=$u(MS),r=Vu();return _l.useEffect(()=>{if(l)u?.(l),r.setState({transform:[l.x,l.y,l.zoom]})},[l,u]),null}function vq(l){return l.connection.inProgress?{...l.connection,to:Yy(l.connection.to,l.transform)}:{...l.connection}}function RS(l){if(l)return(r)=>{let f=vq(r);return l(f)};return vq}function xS(l){let u=RS(l);return $u(u,zu)}var bS=(l)=>({nodesConnectable:l.nodesConnectable,isValid:l.connection.isValid,inProgress:l.connection.inProgress,width:l.width,height:l.height});function vS({containerStyle:l,style:u,type:r,component:f}){let{nodesConnectable:n,width:t,height:i,isValid:y,inProgress:c}=$u(bS,zu);if(!(t&&n&&c))return null;return il.jsx("svg",{style:l,width:t,height:i,className:"react-flow__connectionline react-flow__container",children:il.jsx("g",{className:bu(["react-flow__connection",e9(y)]),children:il.jsx(GL,{style:u,type:r,CustomComponent:f,isValid:y})})})}var GL=({style:l,type:u=pn.Bezier,CustomComponent:r,isValid:f})=>{let{inProgress:n,from:t,fromNode:i,fromHandle:y,fromPosition:c,to:_,toNode:A,toHandle:F,toPosition:j,pointer:N}=xS();if(!n)return;if(r)return il.jsx(r,{connectionLineType:u,connectionLineStyle:l,fromNode:i,fromHandle:y,fromX:t.x,fromY:t.y,toX:_.x,toY:_.y,fromPosition:c,toPosition:j,connectionStatus:e9(f),toNode:A,toHandle:F,pointer:N});let U="",w={sourceX:t.x,sourceY:t.y,sourcePosition:c,targetX:_.x,targetY:_.y,targetPosition:j};switch(u){case pn.Bezier:[U]=RA(w);break;case pn.SimpleBezier:[U]=$L(w);break;case pn.Step:[U]=y$({...w,borderRadius:0});break;case pn.SmoothStep:[U]=y$(w);break;default:[U]=xA(w)}return il.jsx("path",{d:U,fill:"none",className:"react-flow__connection-path",style:l})};GL.displayName="ConnectionLine";var gS={};function gq(l=gS){let u=_l.useRef(l),r=Vu();_l.useEffect(()=>{},[l])}function kS(){let l=Vu(),u=_l.useRef(!1);_l.useEffect(()=>{},[])}function WL({nodeTypes:l,edgeTypes:u,onInit:r,onNodeClick:f,onEdgeClick:n,onNodeDoubleClick:t,onEdgeDoubleClick:i,onNodeMouseEnter:y,onNodeMouseMove:c,onNodeMouseLeave:_,onNodeContextMenu:A,onSelectionContextMenu:F,onSelectionStart:j,onSelectionEnd:N,connectionLineType:U,connectionLineStyle:w,connectionLineComponent:G,connectionLineContainerStyle:J,selectionKeyCode:Q,selectionOnDrag:m,selectionMode:q,multiSelectionKeyCode:W,panActivationKeyCode:p,zoomActivationKeyCode:O,deleteKeyCode:Z,onlyRenderVisibleElements:V,elementsSelectable:P,defaultViewport:H,translateExtent:B,minZoom:C,maxZoom:E,preventScrolling:D,defaultMarkerColor:Y,zoomOnScroll:v,zoomOnPinch:K,panOnScroll:X,panOnScrollSpeed:I,panOnScrollMode:o,zoomOnDoubleClick:fl,panOnDrag:yl,onPaneClick:h,onPaneMouseEnter:s,onPaneMouseMove:ul,onPaneMouseLeave:tl,onPaneScroll:Al,onPaneContextMenu:Kl,paneClickDistance:wl,nodeClickDistance:El,onEdgeContextMenu:M,onEdgeMouseEnter:d,onEdgeMouseMove:nl,onEdgeMouseLeave:k,reconnectRadius:g,onReconnect:cl,onReconnectStart:pl,onReconnectEnd:Hl,noDragClassName:bl,noWheelClassName:_u,noPanClassName:tu,disableKeyboardA11y:Nu,nodeExtent:gl,rfId:zr,viewport:nf,onViewportChange:lr}){return gq(l),gq(u),kS(),hS(r),sS(nf),il.jsx(_S,{onPaneClick:h,onPaneMouseEnter:s,onPaneMouseMove:ul,onPaneMouseLeave:tl,onPaneContextMenu:Kl,onPaneScroll:Al,paneClickDistance:wl,deleteKeyCode:Z,selectionKeyCode:Q,selectionOnDrag:m,selectionMode:q,onSelectionStart:j,onSelectionEnd:N,multiSelectionKeyCode:W,panActivationKeyCode:p,zoomActivationKeyCode:O,elementsSelectable:P,zoomOnScroll:v,zoomOnPinch:K,zoomOnDoubleClick:fl,panOnScroll:X,panOnScrollSpeed:I,panOnScrollMode:o,panOnDrag:yl,defaultViewport:H,translateExtent:B,minZoom:C,maxZoom:E,onSelectionContextMenu:F,preventScrolling:D,noDragClassName:bl,noWheelClassName:_u,noPanClassName:tu,disableKeyboardA11y:Nu,onViewportChange:lr,isControlledViewport:!!nf,children:il.jsxs(CS,{children:[il.jsx(XS,{edgeTypes:u,onEdgeClick:n,onEdgeDoubleClick:i,onReconnect:cl,onReconnectStart:pl,onReconnectEnd:Hl,onlyRenderVisibleElements:V,onEdgeContextMenu:M,onEdgeMouseEnter:d,onEdgeMouseMove:nl,onEdgeMouseLeave:k,reconnectRadius:g,defaultMarkerColor:Y,noPanClassName:tu,disableKeyboardA11y:Nu,rfId:zr}),il.jsx(vS,{style:w,type:U,component:G,containerStyle:J}),il.jsx("div",{className:"react-flow__edgelabel-renderer"}),il.jsx(wS,{nodeTypes:l,onNodeClick:f,onNodeDoubleClick:t,onNodeMouseEnter:y,onNodeMouseMove:c,onNodeMouseLeave:_,onNodeContextMenu:A,nodeClickDistance:El,onlyRenderVisibleElements:V,noPanClassName:tu,noDragClassName:bl,disableKeyboardA11y:Nu,nodeExtent:gl,rfId:zr}),il.jsx("div",{className:"react-flow__viewport-portal"})]})})}WL.displayName="GraphView";var IS=_l.memo(WL),kq=({nodes:l,edges:u,defaultNodes:r,defaultEdges:f,width:n,height:t,fitView:i,fitViewOptions:y,minZoom:c=0.5,maxZoom:_=2,nodeOrigin:A,nodeExtent:F,zIndexMode:j="basic"}={})=>{let N=new Map,U=new Map,w=new Map,G=new Map,J=f??u??[],Q=r??l??[],m=A??[0,0],q=F??By;wF(w,G,J);let{nodesInitialized:W}=vA(Q,N,U,{nodeOrigin:m,nodeExtent:q,zIndexMode:j}),p=[0,0,1];if(i&&n&&t){let O=Dy(N,{filter:(H)=>!!((H.width||H.initialWidth)&&(H.height||H.initialHeight))}),{x:Z,y:V,zoom:P}=i$(O,n,t,c,_,y?.padding??0.1);p=[Z,V,P]}return{rfId:"1",width:n??0,height:t??0,transform:p,nodes:Q,nodesInitialized:W,nodeLookup:N,parentLookup:U,edges:J,edgeLookup:G,connectionLookup:w,onNodesChange:null,onEdgesChange:null,hasDefaultNodes:r!==void 0,hasDefaultEdges:f!==void 0,panZoom:null,minZoom:c,maxZoom:_,translateExtent:By,nodeExtent:q,nodesSelectionActive:!1,userSelectionActive:!1,userSelectionRect:null,connectionMode:ui.Strict,domNode:null,paneDragging:!1,noPanClassName:"nopan",nodeOrigin:m,nodeDragThreshold:1,connectionDragThreshold:1,snapGrid:[15,15],snapToGrid:!1,nodesDraggable:!0,nodesConnectable:!0,nodesFocusable:!0,edgesFocusable:!0,edgesReconnectable:!0,elementsSelectable:!0,elevateNodesOnSelect:!0,elevateEdgesOnSelect:!0,selectNodesOnDrag:!0,multiSelectionActive:!1,fitViewQueued:i??!1,fitViewOptions:y,fitViewResolver:null,connection:{...d9},connectionClickStartHandle:null,connectOnClick:!0,ariaLiveMessage:"",autoPanOnConnect:!0,autoPanOnNodeDrag:!0,autoPanOnNodeFocus:!0,autoPanSpeed:15,connectionRadius:20,onError:iF,isValidConnection:void 0,onSelectionChangeHandlers:[],lib:"react",debug:!1,ariaLabelConfig:o9,zIndexMode:j,onNodesChangeMiddlewareMap:new Map,onEdgesChangeMiddlewareMap:new Map}},aS=({nodes:l,edges:u,defaultNodes:r,defaultEdges:f,width:n,height:t,fitView:i,fitViewOptions:y,minZoom:c,maxZoom:_,nodeOrigin:A,nodeExtent:F,zIndexMode:j})=>Kq((N,U)=>{async function w(){let{nodeLookup:G,panZoom:J,fitViewOptions:Q,fitViewResolver:m,width:q,height:W,minZoom:p,maxZoom:O}=U();if(!J)return;await Cw({nodes:G,width:q,height:W,panZoom:J,minZoom:p,maxZoom:O},Q),m?.resolve(!0),N({fitViewResolver:null})}return{...kq({nodes:l,edges:u,width:n,height:t,fitView:i,fitViewOptions:y,minZoom:c,maxZoom:_,nodeOrigin:A,nodeExtent:F,defaultNodes:r,defaultEdges:f,zIndexMode:j}),setNodes:(G)=>{let{nodeLookup:J,parentLookup:Q,nodeOrigin:m,elevateNodesOnSelect:q,fitViewQueued:W,zIndexMode:p,nodesSelectionActive:O}=U(),{nodesInitialized:Z,hasSelectedNodes:V}=vA(G,J,Q,{nodeOrigin:m,nodeExtent:F,elevateNodesOnSelect:q,checkEquality:!0,zIndexMode:p}),P=O&&V;if(W&&Z)w(),N({nodes:G,nodesInitialized:Z,fitViewQueued:!1,fitViewOptions:void 0,nodesSelectionActive:P});else N({nodes:G,nodesInitialized:Z,nodesSelectionActive:P})},setEdges:(G)=>{let{connectionLookup:J,edgeLookup:Q}=U();wF(J,Q,G),N({edges:G})},setDefaultNodesAndEdges:(G,J)=>{if(G){let{setNodes:Q}=U();Q(G),N({hasDefaultNodes:!0})}if(J){let{setEdges:Q}=U();Q(J),N({hasDefaultEdges:!0})}},updateNodeInternals:(G)=>{let{triggerNodeChanges:J,nodeLookup:Q,parentLookup:m,domNode:q,nodeOrigin:W,nodeExtent:p,debug:O,fitViewQueued:Z,zIndexMode:V}=U(),{changes:P,updatedInternals:H}=dw(G,Q,m,q,W,p,V);if(!H)return;if(aw(Q,m,{nodeOrigin:W,nodeExtent:p,zIndexMode:V}),Z)w(),N({fitViewQueued:!1,fitViewOptions:void 0});else N({});if(P?.length>0){if(O)console.log("React Flow: trigger node changes",P);J?.(P)}},updateNodePositions:(G,J=!1)=>{let Q=[],m=[],{nodeLookup:q,triggerNodeChanges:W,connection:p,updateConnection:O,onNodesChangeMiddlewareMap:Z}=U();for(let[V,P]of G){let H=q.get(V),B=!!(H?.expandParent&&H?.parentId&&P?.position),C={id:V,type:"position",position:B?{x:Math.max(0,P.position.x),y:Math.max(0,P.position.y)}:P.position,dragging:J};if(H&&p.inProgress&&p.fromNode.id===H.id){let E=fi(H,p.fromHandle,Ol.Left,!0);O({...p,from:E})}if(B&&H.parentId)Q.push({id:V,parentId:H.parentId,rect:{...P.internals.positionAbsolute,width:P.measured.width??0,height:P.measured.height??0}});m.push(C)}if(Q.length>0){let{parentLookup:V,nodeOrigin:P}=U(),H=gA(Q,q,V,P);m.push(...H)}for(let V of Z.values())m=V(m);W(m)},triggerNodeChanges:(G)=>{let{onNodesChange:J,setNodes:Q,nodes:m,hasDefaultNodes:q,debug:W}=U();if(G?.length){if(q){let p=SV(G,m);Q(p)}if(W)console.log("React Flow: trigger node changes",G);J?.(G)}},triggerEdgeChanges:(G)=>{let{onEdgesChange:J,setEdges:Q,edges:m,hasDefaultEdges:q,debug:W}=U();if(G?.length){if(q){let p=YV(G,m);Q(p)}if(W)console.log("React Flow: trigger edge changes",G);J?.(G)}},addSelectedNodes:(G)=>{let{multiSelectionActive:J,edgeLookup:Q,nodeLookup:m,triggerNodeChanges:q,triggerEdgeChanges:W}=U();if(J){let p=G.map((O)=>y0(O,!0));q(p);return}q(Cy(m,new Set([...G]),!0)),W(Cy(Q))},addSelectedEdges:(G)=>{let{multiSelectionActive:J,edgeLookup:Q,nodeLookup:m,triggerNodeChanges:q,triggerEdgeChanges:W}=U();if(J){let p=G.map((O)=>y0(O,!0));W(p);return}W(Cy(Q,new Set([...G]))),q(Cy(m,new Set,!0))},unselectNodesAndEdges:({nodes:G,edges:J}={})=>{let{edges:Q,nodes:m,nodeLookup:q,triggerNodeChanges:W,triggerEdgeChanges:p}=U(),O=G?G:m,Z=J?J:Q,V=[];for(let H of O){if(!H.selected)continue;let B=q.get(H.id);if(B)B.selected=!1;V.push(y0(H.id,!1))}let P=[];for(let H of Z){if(!H.selected)continue;P.push(y0(H.id,!1))}W(V),p(P)},setMinZoom:(G)=>{let{panZoom:J,maxZoom:Q}=U();J?.setScaleExtent([G,Q]),N({minZoom:G})},setMaxZoom:(G)=>{let{panZoom:J,minZoom:Q}=U();J?.setScaleExtent([Q,G]),N({maxZoom:G})},setTranslateExtent:(G)=>{U().panZoom?.setTranslateExtent(G),N({translateExtent:G})},resetSelectedElements:()=>{let{edges:G,nodes:J,triggerNodeChanges:Q,triggerEdgeChanges:m,elementsSelectable:q}=U();if(!q)return;let W=J.reduce((O,Z)=>Z.selected?[...O,y0(Z.id,!1)]:O,[]),p=G.reduce((O,Z)=>Z.selected?[...O,y0(Z.id,!1)]:O,[]);Q(W),m(p)},setNodeExtent:(G)=>{let{nodes:J,nodeLookup:Q,parentLookup:m,nodeOrigin:q,elevateNodesOnSelect:W,nodeExtent:p,zIndexMode:O}=U();if(G[0][0]===p[0][0]&&G[0][1]===p[0][1]&&G[1][0]===p[1][0]&&G[1][1]===p[1][1])return;vA(J,Q,m,{nodeOrigin:q,nodeExtent:G,elevateNodesOnSelect:W,checkEquality:!1,zIndexMode:O}),N({nodeExtent:G})},panBy:(G)=>{let{transform:J,width:Q,height:m,panZoom:q,translateExtent:W}=U();return ew({delta:G,panZoom:q,transform:J,translateExtent:W,width:Q,height:m})},setCenter:async(G,J,Q)=>{let{width:m,height:q,maxZoom:W,panZoom:p}=U();if(!p)return Promise.resolve(!1);let O=typeof Q?.zoom<"u"?Q.zoom:W;return await p.setViewport({x:m/2-G*O,y:q/2-J*O,zoom:O},{duration:Q?.duration,ease:Q?.ease,interpolate:Q?.interpolate}),Promise.resolve(!0)},cancelConnection:()=>{N({connection:{...d9}})},updateConnection:(G)=>{N({connection:G})},reset:()=>N({...kq()})}},Object.is);function oS({initialNodes:l,initialEdges:u,defaultNodes:r,defaultEdges:f,initialWidth:n,initialHeight:t,initialMinZoom:i,initialMaxZoom:y,initialFitViewOptions:c,fitView:_,nodeOrigin:A,nodeExtent:F,zIndexMode:j,children:N}){let[U]=_l.useState(()=>aS({nodes:l,edges:u,defaultNodes:r,defaultEdges:f,width:n,height:t,fitView:_,minZoom:i,maxZoom:y,fitViewOptions:c,nodeOrigin:A,nodeExtent:F,zIndexMode:j}));return il.jsx(JV,{value:U,children:il.jsx(CV,{children:N})})}function dS({children:l,nodes:u,edges:r,defaultNodes:f,defaultEdges:n,width:t,height:i,fitView:y,fitViewOptions:c,minZoom:_,maxZoom:A,nodeOrigin:F,nodeExtent:j,zIndexMode:N}){if(_l.useContext(l8))return il.jsx(il.Fragment,{children:l});return il.jsx(oS,{initialNodes:u,initialEdges:r,defaultNodes:f,defaultEdges:n,initialWidth:t,initialHeight:i,fitView:y,initialFitViewOptions:c,initialMinZoom:_,initialMaxZoom:A,nodeOrigin:F,nodeExtent:j,zIndexMode:N,children:l})}var eS={width:"100%",height:"100%",overflow:"hidden",position:"relative",zIndex:0};function lY({nodes:l,edges:u,defaultNodes:r,defaultEdges:f,className:n,nodeTypes:t,edgeTypes:i,onNodeClick:y,onEdgeClick:c,onInit:_,onMove:A,onMoveStart:F,onMoveEnd:j,onConnect:N,onConnectStart:U,onConnectEnd:w,onClickConnectStart:G,onClickConnectEnd:J,onNodeMouseEnter:Q,onNodeMouseMove:m,onNodeMouseLeave:q,onNodeContextMenu:W,onNodeDoubleClick:p,onNodeDragStart:O,onNodeDrag:Z,onNodeDragStop:V,onNodesDelete:P,onEdgesDelete:H,onDelete:B,onSelectionChange:C,onSelectionDragStart:E,onSelectionDrag:D,onSelectionDragStop:Y,onSelectionContextMenu:v,onSelectionStart:K,onSelectionEnd:X,onBeforeDelete:I,connectionMode:o,connectionLineType:fl=pn.Bezier,connectionLineStyle:yl,connectionLineComponent:h,connectionLineContainerStyle:s,deleteKeyCode:ul="Backspace",selectionKeyCode:tl="Shift",selectionOnDrag:Al=!1,selectionMode:Kl=n0.Full,panActivationKeyCode:wl="Space",multiSelectionKeyCode:El=Xy()?"Meta":"Control",zoomActivationKeyCode:M=Xy()?"Meta":"Control",snapToGrid:d,snapGrid:nl,onlyRenderVisibleElements:k=!1,selectNodesOnDrag:g,nodesDraggable:cl,autoPanOnNodeFocus:pl,nodesConnectable:Hl,nodesFocusable:bl,nodeOrigin:_u=dq,edgesFocusable:tu,edgesReconnectable:Nu,elementsSelectable:gl=!0,defaultViewport:zr=zV,minZoom:nf=0.5,maxZoom:lr=2,translateExtent:tf=By,preventScrolling:Or=!0,nodeExtent:Nl,defaultMarkerColor:al="#b1b1b7",zoomOnScroll:gu=!0,zoomOnPinch:hl=!0,panOnScroll:yr=!1,panOnScrollSpeed:Zr=0.5,panOnScrollMode:cr=it.Free,zoomOnDoubleClick:ku=!0,panOnDrag:Gf=!0,onPaneClick:Vn,onPaneMouseEnter:Rr,onPaneMouseMove:ay,onPaneMouseLeave:_t,onPaneScroll:At,onPaneContextMenu:e,paneClickDistance:Dl=1,nodeClickDistance:Cl=0,children:lu,onReconnect:mu,onReconnectStart:au,onReconnectEnd:yu,onEdgeContextMenu:ur,onEdgeDoubleClick:Sn,onEdgeMouseEnter:O8,onEdgeMouseMove:oy,onEdgeMouseLeave:dy,reconnectRadius:Tu=10,onNodesChange:K$,onEdgesChange:Z8,noDragClassName:ju="nodrag",noWheelClassName:mj="nowheel",noPanClassName:Su="nopan",fitView:mr,fitViewOptions:A0,connectOnClick:E$,attributionPosition:ey,proOptions:p$,defaultEdgeOptions:lc,elevateNodesOnSelect:z$=!0,elevateEdgesOnSelect:O$=!1,disableKeyboardA11y:Ft=!1,autoPanOnConnect:F0,autoPanOnNodeDrag:j0,autoPanSpeed:xr,connectionRadius:Wf,isValidConnection:Z$,onError:N0,style:uc,id:rc,nodeDragThreshold:$n,connectionDragThreshold:H$,viewport:Ou,onViewportChange:H8,width:B8,height:B$,colorMode:hf="light",debug:Ui,onScroll:jt,ariaLabelConfig:J0,zIndexMode:Nt="basic",...fc},wj){let Yn=rc||"1",qj=BV(hf),D$=_l.useCallback((V$)=>{V$.currentTarget.scrollTo({top:0,left:0,behavior:"instant"}),jt?.(V$)},[jt]);return il.jsx("div",{"data-testid":"rf__wrapper",...fc,onScroll:D$,style:{...uc,...eS},ref:wj,className:bu(["react-flow",n,qj]),id:rc,role:"application",children:il.jsxs(dS,{nodes:l,edges:u,width:B8,height:B$,fitView:mr,fitViewOptions:A0,minZoom:nf,maxZoom:lr,nodeOrigin:_u,nodeExtent:Nl,zIndexMode:Nt,children:[il.jsx(HV,{nodes:l,edges:u,defaultNodes:r,defaultEdges:f,onConnect:N,onConnectStart:U,onConnectEnd:w,onClickConnectStart:G,onClickConnectEnd:J,nodesDraggable:cl,autoPanOnNodeFocus:pl,nodesConnectable:Hl,nodesFocusable:bl,edgesFocusable:tu,edgesReconnectable:Nu,elementsSelectable:gl,elevateNodesOnSelect:z$,elevateEdgesOnSelect:O$,minZoom:nf,maxZoom:lr,nodeExtent:Nl,onNodesChange:K$,onEdgesChange:Z8,snapToGrid:d,snapGrid:nl,connectionMode:o,translateExtent:tf,connectOnClick:E$,defaultEdgeOptions:lc,fitView:mr,fitViewOptions:A0,onNodesDelete:P,onEdgesDelete:H,onDelete:B,onNodeDragStart:O,onNodeDrag:Z,onNodeDragStop:V,onSelectionDrag:D,onSelectionDragStart:E,onSelectionDragStop:Y,onMove:A,onMoveStart:F,onMoveEnd:j,noPanClassName:Su,nodeOrigin:_u,rfId:Yn,autoPanOnConnect:F0,autoPanOnNodeDrag:j0,autoPanSpeed:xr,onError:N0,connectionRadius:Wf,isValidConnection:Z$,selectNodesOnDrag:g,nodeDragThreshold:$n,connectionDragThreshold:H$,onBeforeDelete:I,debug:Ui,ariaLabelConfig:J0,zIndexMode:Nt}),il.jsx(IS,{onInit:_,onNodeClick:y,onEdgeClick:c,onNodeMouseEnter:Q,onNodeMouseMove:m,onNodeMouseLeave:q,onNodeContextMenu:W,onNodeDoubleClick:p,nodeTypes:t,edgeTypes:i,connectionLineType:fl,connectionLineStyle:yl,connectionLineComponent:h,connectionLineContainerStyle:s,selectionKeyCode:tl,selectionOnDrag:Al,selectionMode:Kl,deleteKeyCode:ul,multiSelectionKeyCode:El,panActivationKeyCode:wl,zoomActivationKeyCode:M,onlyRenderVisibleElements:k,defaultViewport:zr,translateExtent:tf,minZoom:nf,maxZoom:lr,preventScrolling:Or,zoomOnScroll:gu,zoomOnPinch:hl,zoomOnDoubleClick:ku,panOnScroll:yr,panOnScrollSpeed:Zr,panOnScrollMode:cr,panOnDrag:Gf,onPaneClick:Vn,onPaneMouseEnter:Rr,onPaneMouseMove:ay,onPaneMouseLeave:_t,onPaneScroll:At,onPaneContextMenu:e,paneClickDistance:Dl,nodeClickDistance:Cl,onSelectionContextMenu:v,onSelectionStart:K,onSelectionEnd:X,onReconnect:mu,onReconnectStart:au,onReconnectEnd:yu,onEdgeContextMenu:ur,onEdgeDoubleClick:Sn,onEdgeMouseEnter:O8,onEdgeMouseMove:oy,onEdgeMouseLeave:dy,reconnectRadius:Tu,defaultMarkerColor:al,noDragClassName:ju,noWheelClassName:mj,noPanClassName:Su,rfId:Yn,disableKeyboardA11y:Ft,nodeExtent:Nl,viewport:Ou,onViewportChange:H8}),il.jsx(pV,{onSelectionChange:C}),lu,il.jsx(GV,{proOptions:p$,position:ey}),il.jsx(LV,{rfId:Yn,disableKeyboardA11y:Ft})]})})}var TL=lL(lY);var tg=mf.error014();function uY({dimensions:l,lineWidth:u,variant:r,className:f}){return il.jsx("path",{strokeWidth:u,d:`M${l[0]/2} 0 V${l[1]} M0 ${l[1]/2} H${l[0]}`,className:bu(["react-flow__background-pattern",r,f])})}function rY({radius:l,className:u}){return il.jsx("circle",{cx:l,cy:l,r:l,className:bu(["react-flow__background-pattern","dots",u])})}var ti;(function(l){l.Lines="lines",l.Dots="dots",l.Cross="cross"})(ti||(ti={}));var fY={[ti.Dots]:1,[ti.Lines]:1,[ti.Cross]:6},nY=(l)=>({transform:l.transform,patternId:`pattern-${l.rfId}`});function KL({id:l,variant:u=ti.Dots,gap:r=20,size:f,lineWidth:n=1,offset:t=0,color:i,bgColor:y,style:c,className:_,patternClassName:A}){let F=_l.useRef(null),{transform:j,patternId:N}=$u(nY,zu),U=f||fY[u],w=u===ti.Dots,G=u===ti.Cross,J=Array.isArray(r)?r:[r,r],Q=[J[0]*j[2]||1,J[1]*j[2]||1],m=U*j[2],q=Array.isArray(t)?t:[t,t],W=G?[m,m]:Q,p=[q[0]*j[2]||1+W[0]/2,q[1]*j[2]||1+W[1]/2],O=`${N}${l?l:""}`;return il.jsxs("svg",{className:bu(["react-flow__background",_]),style:{...c,...r8,"--xy-background-color-props":y,"--xy-background-pattern-color-props":i},ref:F,"data-testid":"rf__background",children:[il.jsx("pattern",{id:O,x:j[0]%Q[0],y:j[1]%Q[1],width:Q[0],height:Q[1],patternUnits:"userSpaceOnUse",patternTransform:`translate(-${p[0]},-${p[1]})`,children:w?il.jsx(rY,{radius:m/2,className:A}):il.jsx(uY,{dimensions:W,lineWidth:n,variant:u,className:A})}),il.jsx("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:`url(#${O})`})]})}KL.displayName="Background";var EL=_l.memo(KL);function tY(){return il.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",children:il.jsx("path",{d:"M32 18.133H18.133V32h-4.266V18.133H0v-4.266h13.867V0h4.266v13.867H32z"})})}function iY(){return il.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 5",children:il.jsx("path",{d:"M0 0h32v4.2H0z"})})}function yY(){return il.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 30",children:il.jsx("path",{d:"M3.692 4.63c0-.53.4-.938.939-.938h5.215V0H4.708C2.13 0 0 2.054 0 4.63v5.216h3.692V4.631zM27.354 0h-5.2v3.692h5.17c.53 0 .984.4.984.939v5.215H32V4.631A4.624 4.624 0 0027.354 0zm.954 24.83c0 .532-.4.94-.939.94h-5.215v3.768h5.215c2.577 0 4.631-2.13 4.631-4.707v-5.139h-3.692v5.139zm-23.677.94c-.531 0-.939-.4-.939-.94v-5.138H0v5.139c0 2.577 2.13 4.707 4.708 4.707h5.138V25.77H4.631z"})})}function cY(){return il.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:il.jsx("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0 8 0 4.571 3.429 4.571 7.619v3.048H3.048A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047zm4.724-13.866H7.467V7.619c0-2.59 2.133-4.724 4.723-4.724 2.591 0 4.724 2.133 4.724 4.724v3.048z"})})}function $Y(){return il.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:il.jsx("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0c-4.114 1.828-1.37 2.133.305 2.438 1.676.305 4.42 2.59 4.42 5.181v3.048H3.047A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047z"})})}function dA({children:l,className:u,...r}){return il.jsx("button",{type:"button",className:bu(["react-flow__controls-button",u]),...r,children:l})}var _Y=(l)=>({isInteractive:l.nodesDraggable||l.nodesConnectable||l.elementsSelectable,minZoomReached:l.transform[2]<=l.minZoom,maxZoomReached:l.transform[2]>=l.maxZoom,ariaLabelConfig:l.ariaLabelConfig});function pL({style:l,showZoom:u=!0,showFitView:r=!0,showInteractive:f=!0,fitViewOptions:n,onZoomIn:t,onZoomOut:i,onFitView:y,onInteractiveChange:c,className:_,children:A,position:F="bottom-left",orientation:j="vertical","aria-label":N}){let U=Vu(),{isInteractive:w,minZoomReached:G,maxZoomReached:J,ariaLabelConfig:Q}=$u(_Y,zu),{zoomIn:m,zoomOut:q,fitView:W}=EF(),p=()=>{m(),t?.()},O=()=>{q(),i?.()},Z=()=>{W(n),y?.()},V=()=>{U.setState({nodesDraggable:!w,nodesConnectable:!w,elementsSelectable:!w}),c?.(!w)};return il.jsxs(u8,{className:bu(["react-flow__controls",j==="horizontal"?"horizontal":"vertical",_]),position:F,style:l,"data-testid":"rf__controls","aria-label":N??Q["controls.ariaLabel"],children:[u&&il.jsxs(il.Fragment,{children:[il.jsx(dA,{onClick:p,className:"react-flow__controls-zoomin",title:Q["controls.zoomIn.ariaLabel"],"aria-label":Q["controls.zoomIn.ariaLabel"],disabled:J,children:il.jsx(tY,{})}),il.jsx(dA,{onClick:O,className:"react-flow__controls-zoomout",title:Q["controls.zoomOut.ariaLabel"],"aria-label":Q["controls.zoomOut.ariaLabel"],disabled:G,children:il.jsx(iY,{})})]}),r&&il.jsx(dA,{className:"react-flow__controls-fitview",onClick:Z,title:Q["controls.fitView.ariaLabel"],"aria-label":Q["controls.fitView.ariaLabel"],children:il.jsx(yY,{})}),f&&il.jsx(dA,{className:"react-flow__controls-interactive",onClick:V,title:Q["controls.interactive.ariaLabel"],"aria-label":Q["controls.interactive.ariaLabel"],children:w?il.jsx($Y,{}):il.jsx(cY,{})}),A]})}pL.displayName="Controls";var zL=_l.memo(pL);function AY({id:l,x:u,y:r,width:f,height:n,style:t,color:i,strokeColor:y,strokeWidth:c,className:_,borderRadius:A,shapeRendering:F,selected:j,onClick:N}){let{background:U,backgroundColor:w}=t||{},G=i||U||w;return il.jsx("rect",{className:bu(["react-flow__minimap-node",{selected:j},_]),x:u,y:r,rx:A,ry:A,width:f,height:n,style:{fill:G,stroke:y,strokeWidth:c},shapeRendering:F,onClick:N?(J)=>N(J,l):void 0})}var FY=_l.memo(AY),jY=(l)=>l.nodes.map((u)=>u.id),WF=(l)=>l instanceof Function?l:()=>l;function NY({nodeStrokeColor:l,nodeColor:u,nodeClassName:r="",nodeBorderRadius:f=5,nodeStrokeWidth:n,nodeComponent:t=FY,onClick:i}){let y=$u(jY,zu),c=WF(u),_=WF(l),A=WF(r),F=typeof window>"u"||!!window.chrome?"crispEdges":"geometricPrecision";return il.jsx(il.Fragment,{children:y.map((j)=>il.jsx(UY,{id:j,nodeColorFunc:c,nodeStrokeColorFunc:_,nodeClassNameFunc:A,nodeBorderRadius:f,nodeStrokeWidth:n,NodeComponent:t,onClick:i,shapeRendering:F},j))})}function JY({id:l,nodeColorFunc:u,nodeStrokeColorFunc:r,nodeClassNameFunc:f,nodeBorderRadius:n,nodeStrokeWidth:t,shapeRendering:i,NodeComponent:y,onClick:c}){let{node:_,x:A,y:F,width:j,height:N}=$u((U)=>{let w=U.nodeLookup.get(l);if(!w)return{node:void 0,x:0,y:0,width:0,height:0};let G=w.internals.userNode,{x:J,y:Q}=w.internals.positionAbsolute,{width:m,height:q}=zn(G);return{node:G,x:J,y:Q,width:m,height:q}},zu);if(!_||_.hidden||!yF(_))return null;return il.jsx(y,{x:A,y:F,width:j,height:N,style:_.style,selected:!!_.selected,className:f(_),color:u(_),borderRadius:n,strokeColor:r(_),strokeWidth:t,shapeRendering:i,onClick:c,id:_.id})}var UY=_l.memo(JY),QY=_l.memo(NY),mY=200,wY=150,qY=(l)=>!l.hidden,LY=(l)=>{let u={x:-l.transform[0]/l.transform[2],y:-l.transform[1]/l.transform[2],width:l.width/l.transform[2],height:l.height/l.transform[2]};return{viewBB:u,boundingRect:l.nodeLookup.size>0?nF(Dy(l.nodeLookup,{filter:qY}),u):u,rfId:l.rfId,panZoom:l.panZoom,translateExtent:l.translateExtent,flowWidth:l.width,flowHeight:l.height,ariaLabelConfig:l.ariaLabelConfig}},GY="react-flow__minimap-desc";function OL({style:l,className:u,nodeStrokeColor:r,nodeColor:f,nodeClassName:n="",nodeBorderRadius:t=5,nodeStrokeWidth:i,nodeComponent:y,bgColor:c,maskColor:_,maskStrokeColor:A,maskStrokeWidth:F,position:j="bottom-right",onClick:N,onNodeClick:U,pannable:w=!1,zoomable:G=!1,ariaLabel:J,inversePan:Q,zoomStep:m=1,offsetScale:q=5}){let W=Vu(),p=_l.useRef(null),{boundingRect:O,viewBB:Z,rfId:V,panZoom:P,translateExtent:H,flowWidth:B,flowHeight:C,ariaLabelConfig:E}=$u(LY,zu),D=l?.width??mY,Y=l?.height??wY,v=O.width/D,K=O.height/Y,X=Math.max(v,K),I=X*D,o=X*Y,fl=q*X,yl=O.x-(I-O.width)/2-fl,h=O.y-(o-O.height)/2-fl,s=I+fl*2,ul=o+fl*2,tl=`${GY}-${V}`,Al=_l.useRef(0),Kl=_l.useRef();Al.current=X,_l.useEffect(()=>{if(p.current&&P)return Kl.current=iq({domNode:p.current,panZoom:P,getTransform:()=>W.getState().transform,getViewScale:()=>Al.current}),()=>{Kl.current?.destroy()}},[P]),_l.useEffect(()=>{Kl.current?.update({translateExtent:H,width:B,height:C,inversePan:Q,pannable:w,zoomStep:m,zoomable:G})},[w,G,Q,m,H,B,C]);let wl=N?(d)=>{let[nl,k]=Kl.current?.pointer(d)||[0,0];N(d,{x:nl,y:k})}:void 0,El=U?_l.useCallback((d,nl)=>{let k=W.getState().nodeLookup.get(nl).internals.userNode;U(d,k)},[]):void 0,M=J??E["minimap.ariaLabel"];return il.jsx(u8,{position:j,style:{...l,"--xy-minimap-background-color-props":typeof c==="string"?c:void 0,"--xy-minimap-mask-background-color-props":typeof _==="string"?_:void 0,"--xy-minimap-mask-stroke-color-props":typeof A==="string"?A:void 0,"--xy-minimap-mask-stroke-width-props":typeof F==="number"?F*X:void 0,"--xy-minimap-node-background-color-props":typeof f==="string"?f:void 0,"--xy-minimap-node-stroke-color-props":typeof r==="string"?r:void 0,"--xy-minimap-node-stroke-width-props":typeof i==="number"?i:void 0},className:bu(["react-flow__minimap",u]),"data-testid":"rf__minimap",children:il.jsxs("svg",{width:D,height:Y,viewBox:`${yl} ${h} ${s} ${ul}`,className:"react-flow__minimap-svg",role:"img","aria-labelledby":tl,ref:p,onClick:wl,children:[M&&il.jsx("title",{id:tl,children:M}),il.jsx(QY,{onClick:El,nodeColor:f,nodeStrokeColor:r,nodeBorderRadius:t,nodeClassName:n,nodeStrokeWidth:i,nodeComponent:y}),il.jsx("path",{className:"react-flow__minimap-mask",d:`M${yl-fl},${h-fl}h${s+fl*2}v${ul+fl*2}h${-s-fl*2}z - M${Z.x},${Z.y}h${Z.width}v${Z.height}h${-Z.width}z`,fillRule:"evenodd",pointerEvents:"none"})]})})}OL.displayName="MiniMap";var ig=_l.memo(OL),WY=(l)=>(u)=>l?`${Math.max(1/u.transform[2],1)}`:void 0,TY={[ni.Line]:"right",[ni.Handle]:"bottom-right"};function KY({nodeId:l,position:u,variant:r=ni.Handle,className:f,style:n=void 0,children:t,color:i,minWidth:y=10,minHeight:c=10,maxWidth:_=Number.MAX_VALUE,maxHeight:A=Number.MAX_VALUE,keepAspectRatio:F=!1,resizeDirection:j,autoScale:N=!0,shouldResize:U,onResizeStart:w,onResize:G,onResizeEnd:J}){let Q=nL(),m=typeof l==="string"?l:Q,q=Vu(),W=_l.useRef(null),p=r===ni.Handle,O=$u(_l.useCallback(WY(p&&N),[p,N]),zu),Z=_l.useRef(null),V=u??TY[r];_l.useEffect(()=>{if(!W.current||!m)return;if(!Z.current)Z.current=Aq({domNode:W.current,nodeId:m,getStoreItems:()=>{let{nodeLookup:H,transform:B,snapGrid:C,snapToGrid:E,nodeOrigin:D,domNode:Y}=q.getState();return{nodeLookup:H,transform:B,snapGrid:C,snapToGrid:E,nodeOrigin:D,paneDomNode:Y}},onChange:(H,B)=>{let{triggerNodeChanges:C,nodeLookup:E,parentLookup:D,nodeOrigin:Y}=q.getState(),v=[],K={x:H.x,y:H.y},X=E.get(m);if(X&&X.expandParent&&X.parentId){let I=X.origin??Y,o=H.width??X.measured.width??0,fl=H.height??X.measured.height??0,yl={id:X.id,parentId:X.parentId,rect:{width:o,height:fl,...cF({x:H.x??X.position.x,y:H.y??X.position.y},{width:o,height:fl},X.parentId,E,I)}},h=gA([yl],E,D,Y);v.push(...h),K.x=H.x?Math.max(I[0]*o,H.x):void 0,K.y=H.y?Math.max(I[1]*fl,H.y):void 0}if(K.x!==void 0&&K.y!==void 0){let I={id:m,type:"position",position:{...K}};v.push(I)}if(H.width!==void 0&&H.height!==void 0){let o={id:m,type:"dimensions",resizing:!0,setAttributes:!j?!0:j==="horizontal"?"width":"height",dimensions:{width:H.width,height:H.height}};v.push(o)}for(let I of B){let o={...I,type:"position"};v.push(o)}C(v)},onEnd:({width:H,height:B})=>{let C={id:m,type:"dimensions",resizing:!1,dimensions:{width:H,height:B}};q.getState().triggerNodeChanges([C])}});return Z.current.update({controlPosition:V,boundaries:{minWidth:y,minHeight:c,maxWidth:_,maxHeight:A},keepAspectRatio:F,resizeDirection:j,onResizeStart:w,onResize:G,onResizeEnd:J,shouldResize:U}),()=>{Z.current?.destroy()}},[V,y,c,_,A,F,w,G,J,U]);let P=V.split("-");return il.jsx("div",{className:bu(["react-flow__resize-control","nodrag",...P,r,f]),ref:W,style:{...n,scale:O,...i&&{[p?"backgroundColor":"borderColor"]:i}},children:t})}var yg=_l.memo(KY);var T=$i.default.createElement,{useEffect:Hn}=$i.default,lf=$i.default.useState,ci=$i.default.useRef,N$=[{id:"in-left",side:"left",position:Ol.Left,style:{top:"50%"}},{id:"in-top-left",side:"top",slot:"left",slotIndex:-1,position:Ol.Top,style:{left:"28%"}},{id:"in-top-mid",side:"top",slot:"mid",slotIndex:0,position:Ol.Top,style:{left:"50%"}},{id:"in-top-right",side:"top",slot:"right",slotIndex:1,position:Ol.Top,style:{left:"72%"}},{id:"in-bottom-left",side:"bottom",slot:"left",slotIndex:-1,position:Ol.Bottom,style:{left:"28%"}},{id:"in-bottom-mid",side:"bottom",slot:"mid",slotIndex:0,position:Ol.Bottom,style:{left:"50%"}},{id:"in-bottom-right",side:"bottom",slot:"right",slotIndex:1,position:Ol.Bottom,style:{left:"72%"}}],A$=[{id:"out-right",position:Ol.Right,style:{top:"50%"}}],ZL=["#4eb7a8","#d7a13a","#69aee8","#e0835f","#b7d86b","#d98bd2","#5fc6bf"],sy=236,Ry=88,HL=15000,EY=10,zF=96,On=72,OF=64,BL=12;function f8(){return typeof document>"u"||document.visibilityState!=="hidden"}function DL(l,u){let r=Number.parseFloat(String(l||""));return Number.isFinite(r)?r/100:u}function pY(l,u,r){let f=String(l.side||"");if(f!=="top"&&f!=="bottom")return 0;let n=Number(l.slotIndex||0),t=f==="top"?"in-top-mid":"in-bottom-mid",i=u.get(l.id)||0,y=u.get(t)||0;if(n===0)return y===0?-26:28+i*74;let c=r===0?Math.abs(n)*2:Math.sign(r)===Math.sign(n)?-3:3;if(y>0&&i===0)return-14+c;return 8+i*74+c}function n8(l){let u=l.filter((t,i)=>{let y=l[i-1];return!y||Math.abs(y.x-t.x)>0.5||Math.abs(y.y-t.y)>0.5});if(u.length<2)return"";let r=`M ${u[0].x},${u[0].y}`,f=u[0];for(let t=1;t0.5||Math.abs(j.y-f.y)>0.5)r+=` L ${j.x},${j.y}`;r+=` Q ${y.x},${y.y} ${N.x},${N.y}`,f=N}let n=u[u.length-1];return`${r} L ${n.x},${n.y}`}function oL(l,u,r,f,n,t,i=""){let y=r>=l,c=Math.max(1,Math.abs(r-l)),_=Math.abs(f-u),A=Math.max(34,Math.min(118,c*0.26)),F=Math.min(280,Math.abs(t));if(y&&n===Ol.Left&&F<4&&_<28&&c<420)return`M ${l},${u} C ${l+A},${u} ${r-A},${f} ${r},${f}`;if(y&&n===Ol.Left&&(i==="direct-forward-left"||c<=260&&_<=210)){let J=Math.max(42,Math.min(140,c*0.48)),Q=Math.max(-28,Math.min(28,t*0.18));return`M ${l},${u} C ${l+J},${u+Q} ${r-J},${f} ${r},${f}`}if(y){let J=l+A;if(n===Ol.Top||n===Ol.Bottom){let q=n===Ol.Top?-1:1,W=f+q*(54+F*0.42);return n8([{x:l,y:u},{x:J,y:u},{x:J+Math.min(120,c*0.18),y:W},{x:r,y:W},{x:r,y:f+q*34},{x:r,y:f}])}let Q=r-A,m=(u+f)/2+t;return n8([{x:l,y:u},{x:J,y:u},{x:J+Math.min(110,c*0.16),y:m},{x:Q-Math.min(90,c*0.12),y:m},{x:Q,y:f},{x:r,y:f}])}let U=n===Ol.Bottom?1:n===Ol.Top?-1:t>=0?1:-1,w=Math.max(l,r)+92+Math.min(180,F*0.52),G=U<0?Math.min(u,f)-84-F*0.62:Math.max(u,f)+84+F*0.62;if(n===Ol.Top||n===Ol.Bottom)return n8([{x:l,y:u},{x:l+A,y:u},{x:w,y:G},{x:r,y:G},{x:r,y:f+U*38},{x:r,y:f}]);return n8([{x:l,y:u},{x:l+A,y:u},{x:w,y:G},{x:r-A,y:G},{x:r-A,y:f},{x:r,y:f}])}function zY({data:l}){return T("div",{className:"pipeline-flow-node-body"},N$.map((u)=>T(c0,{key:u.id,id:u.id,type:"target",position:u.position,isConnectable:!1,className:`pipeline-flow-handle input ${u.side} slot-${u.slot||"mid"}`,style:u.style})),A$.map((u)=>T(c0,{key:u.id,id:u.id,type:"source",position:u.position,isConnectable:!1,className:"pipeline-flow-handle output right",style:u.style})),l?.label)}function OY({id:l,sourceX:u,sourceY:r,targetX:f,targetY:n,targetPosition:t,markerEnd:i,markerStart:y,style:c,data:_}){let A=Number(_?.laneOffset||0),F=oL(u,r,f,n,t,A,String(_?.routeMode||""));return T(hy,{id:l,path:F,markerEnd:i,markerStart:y,style:c,interactionWidth:28})}var ZY={pipelineCurve:OY},HY={pipelineNode:zY};function c8(l){if(!l)return"--";let u=new Date(l);if(Number.isNaN(u.getTime()))return"--";return iu(u)}function Xf(l){let u=Number(l);if(!Number.isFinite(u)||u<0)return"--";let r=Math.round(u/1000);if(r<60)return`${r}s`;if(r<3600)return`${Math.floor(r/60)}m ${r%60}s`;return`${Math.floor(r/3600)}h ${Math.floor(r%3600/60)}m`}function ZF(l){let u=Number(l);if(!Number.isFinite(u))return"--";return u.toLocaleString("zh-CN")}function VL(l){let u=Number(l);if(!Number.isFinite(u))return"--";return`${Math.round(Math.max(0,Math.min(1,u))*100)}%`}function Xl(l){return typeof l==="object"&&l!==null&&!Array.isArray(l)}function Sl(l){return Array.isArray(l)?l:[]}function dl(l){if(!l)return null;let u=new Date(l);return Number.isNaN(u.getTime())?null:u.getTime()}function J$(l){return Number.isFinite(Number(l))?new Date(Number(l)).toISOString():""}function m$(...l){for(let u of l){let r=dl(u);if(r!==null)return new Date(r).toISOString()}return""}function bF(...l){let u=l.map(dl).filter((r)=>r!==null);return u.length>0?new Date(Math.max(...u)).toISOString():""}function vF(l){return["succeeded","failed","skipped","cancelled","canceled","completed"].includes(String(l||"").toLowerCase())}function dL(l){let u=uG(l).toLowerCase();return["running","active","in-progress","in_progress"].includes(u)}function SL(l,u="status"){return l.reduce((r,f)=>{let n=String(f?.[u]||"unknown").toLowerCase();return r[n]=(r[n]||0)+1,r},{})}function eL(l){if(!l||typeof l!=="string")return null;try{let u=JSON.parse(l);return Xl(u)?u:null}catch{return null}}function HF(l){let u=l.map(eL).filter((t)=>Boolean(t)),r=u.flatMap((t)=>[t.timestamp,t.createdAt,t.updatedAt]).filter(Boolean),f=bF(...r),n=Array.from(new Set(u.map((t)=>String(t.event||t.action||t.type||"")).filter(Boolean))).slice(0,3);return{total:l.length,parsed:u.length,lastAt:f,eventKinds:n}}function $8(l){if(l===null||l===void 0)return"--";if(typeof l==="boolean")return l?"是":"否";if(typeof l==="number")return String(l);if(typeof l==="string")return l.length>80?`${l.slice(0,77)}...`:l;if(Array.isArray(l))return`${l.length} 项`;if(typeof l==="object")return`${Object.keys(l).length} 字段`;return String(l)}function lG(l,u=280){if(l===null||l===void 0)return"";let f=(typeof l==="string"?l:String(l)).replace(/\r\n/gu,` -`).trim();return f.length>u?`${f.slice(0,Math.max(0,u-1))}...`:f}function uG(l){if(typeof l==="string")return l;if(Xl(l))return String(l.status||l.state||l.phase||"unknown");return"unknown"}function BY(l){return l.filter((u)=>u&&u.value!==void 0&&u.value!==null&&String(u.value)!=="")}function XF({items:l}){let u=BY(Sl(l));return T("div",{className:"pipeline-kv-grid"},u.map((r)=>T("span",{key:r.label},T("b",null,r.label),T("span",null,r.value))))}function gF({items:l}){let u=Sl(l).map((r)=>String(r||"")).filter(Boolean);if(u.length===0)return null;return T("div",{className:"pipeline-chip-row"},u.map((r,f)=>T("span",{key:`${f}-${r}`},r)))}function PF(l,u){let r=String(u?.procedureRunId||""),f=Sl(l?.procedureRuns);return f.find((n)=>String(Pf(n))===r)||f.at(-1)||null}function DY(l,u){let r=String(u||"");if(!r)return null;return Sl(l?.procedureRuns).find((f)=>Pf(f)===r)||null}function BF(l){return Sl(l?.attempts).length}function YL(l){return Sl(l?.attempts).reduce((u,r)=>u+U8(r).length,0)}function U8(l){return Sl(l?.opencodeMessages?.steps).filter(Xl)}function rG(l){let u=String(l?.status||"").toLowerCase();if(["error","failed","failure"].includes(u))return"failed";if(["completed","succeeded","success"].includes(u))return"succeeded";if(["running","started","in_progress"].includes(u))return"running";return"unknown"}function VY(l,u){let r=hF(l.map((t)=>t?.agent)).slice(0,3),f=hF(l.map((t)=>t?.model)).slice(0,3),n=u.length<=2?u.map((t)=>`session ${t}`):[`sessions ${u.length}`,...u.slice(0,2).map((t)=>`session ${t}`)];return[...r.map((t)=>`agent ${t}`),...f.map((t)=>`model ${t}`),...n]}function F$(l,u=0){return String(l?.messageId||l?.index||"")||`step-${u}`}function SY({steps:l,sessionIds:u,sessionFacts:r,matchedStepKey:f}){let n=Sl(l),t=n.findIndex((G,J)=>F$(G,J)===f),i=t>=0?n[t]:null,y=n.flatMap((G)=>[dl(G?.createdAt),dl(G?.completedAt)]).filter((G)=>G!==null),c=y.length>0?Math.min(...y):null,_=y.length>0?Math.max(...y):null,A=c!==null&&_!==null?Math.max(0,_-c):null,F=n.reduce((G,J)=>G+Sl(J?.parts).filter((Q)=>String(Q?.type||"").toLowerCase()==="tool").length,0),j=n.reduce((G,J)=>G+Sl(J?.parts).filter((Q)=>["text","reasoning"].includes(String(Q?.type||"").toLowerCase())).length,0),N=n.reduce((G,J)=>G+Sl(J?.parts).filter((Q)=>String(Q?.type||"").toLowerCase()==="tool"&&rG(Q)==="failed").length,0),U=[`${n.length} steps`,`${u.length} sessions`,`${j} messages`,`${F} tools`,A!==null?`duration ${Xf(A)}`:"",N>0?`${N} failed tools`:""].filter(Boolean),w=i?[`Step ${i?.index??t+1}`,String(i?.role||"role --"),i?.model?`model ${i.model}`:"",i?.finish?`finish ${i.finish}`:"",i?.durationMs!==void 0&&i?.durationMs!==null?`duration ${Xf(i.durationMs)}`:""].filter(Boolean):[];return T("section",{className:"pipeline-trace-timeline","data-testid":"pipeline-step-timeline"},T("div",{className:"pipeline-trace-head"},T("div",null,T("b",null,"OpenCode Trace"),T("span",null,"Trace 使用 Code Queue 统一样式展示完整 agent loop;Pipeline 旧 step/message/tool 卡片样式已废弃。")),T("div",{className:"pipeline-trace-session-head","data-testid":"pipeline-step-timeline-session"},T("span",null,U.join(" / ")||"Trace"),r.length>0?T(gF,{items:r}):null)),i?T("div",{className:"pipeline-trace-focus","data-testid":"pipeline-trace-matched-step"},T("span",{className:"codex-output-channel"},"Matched"),T("strong",null,`Gantt selection -> ${w.join(" / ")}`),T("time",null,`${c8(i?.createdAt)} -> ${c8(i?.completedAt)}`)):null,T(w3,{port:tQ,input:n,className:"codex-transcript pipeline-trace",testId:"pipeline-opencode-step-trace",emptyText:"暂无 OpenCode Trace 输出",keepRecentToolCalls:3}))}function CF(l){return Sl(l).flatMap((u)=>{if(Xl(u))return[u];let r=eL(u);return r?[r]:[]})}function yn(l){return String(l?.event||l?.action||l?.requestedAction||l?.type||"").toLowerCase()}function My(l){return m$(l?.timestamp,l?.createdAt,l?.updatedAt,l?.startedAt,l?.finishedAt)}function YY(l){return dl(My(l))}function Q8(l){return String(l?.attempt||l?.id||"")}function hF(l){let u=new Set,r=[];for(let f of l){let n=String(f||"");if(!n||u.has(n))continue;u.add(n),r.push(n)}return r}function XL(l){switch(String(l||"").toLowerCase()){case"monitor":return"monitor";case"webui":return"webui";case"cli":return"cli";case"system":return"runner";default:return String(l||"--")}}function $0(l){return String(l?.requestedAction||l?.action||"").toLowerCase()}function j$(l){switch($0(l)){case"guide":return"引导";case"modify":return"修改";case"approve":return"审核通过";case"restart":return"重启";case"redo":return"重做";default:return String(l?.requestedAction||l?.action||"控制")}}function PL(l){switch(yn(l)){case"initial-prompt-delivered":return"初始 prompt";case"append-prompt-delivered":return"追加 prompt";case"append-prompt-queued":return"追加 prompt 已排队";case"monitor-prompt-delivered":return"Monitor prompt";case"node-long-running-observation":return"长任务观察";case"node-finished":return"节点完成";case"oa-policy-downstream-evaluated":return"OA 下游策略";case"control-command-queued":return`${j$(l)} 已发起`;case"control-command-applied":return`${j$(l)} 已生效`;case"control-command-ignored":return`${j$(l)} 已忽略`;default:return String(l?.event||l?.action||l?.requestedAction||"event")}}function CL(l){return lG(l?.promptPreview||l?.reasonPreview||l?.prompt||l?.reason||"",240)}function XY(l){let u=String(l?.prompt||""),r=String(l?.reason||l?.restartReason||""),f=u?"":String(l?.promptPreview||""),n=r?"":String(l?.reasonPreview||"");return[u||f?{label:u?"prompt":"prompt preview",value:u||f}:null,r||n?{label:r?"reason":"reason preview",value:r||n}:null,Sl(l?.resetNodeIds).length>0?{label:"reset nodes",value:Sl(l.resetNodeIds).join(", ")}:null,Sl(l?.runningResetNodeIds).length>0?{label:"interrupted running nodes",value:Sl(l.runningResetNodeIds).join(", ")}:null,Sl(l?.interruptedProcedureRunIds).length>0?{label:"interrupted procedures",value:Sl(l.interruptedProcedureRunIds).join(", ")}:null,l?.interruptedProcedureRunId?{label:"interrupted procedure",value:String(l.interruptedProcedureRunId)}:null].filter(Boolean)}function DF(l){let u=U8(l),r=u.map((c)=>dl(c?.createdAt)).filter((c)=>c!==null),f=u.map((c)=>dl(c?.completedAt)??dl(c?.createdAt)).filter((c)=>c!==null),n=CF(l?.controlEventRecords).map((c)=>YY(c)).filter((c)=>c!==null),t=Sl(l?.assistantOutputs).map((c)=>dl(c?.updatedAt)).filter((c)=>c!==null),i=r[0]??n[0]??t[0]??null,y=f.at(-1)??n.at(-1)??t.at(-1)??i;return{startMs:i,endMs:y}}function PY(l,u,r,f,n=""){let t=Sl(l?.procedureRuns).filter((y)=>m8(y,u)===r);if(t.length===0)return null;if(n){let y=t.find((c)=>Pf(c)===n);if(y)return y}if(f===null)return t.at(-1)||null;let i=t.find((y)=>{let c=dl(t8(y,l)),_=dl(i8(y,l))??c;return c!==null&&_!==null&&f>=c-1000&&f<=_+1000});if(i)return i;return t.slice().sort((y,c)=>{let _=dl(t8(y,l))??f,A=dl(i8(y,l))??_,F=dl(t8(c,l))??f,j=dl(i8(c,l))??F,N=Math.min(Math.abs(_-f),Math.abs(A-f)),U=Math.min(Math.abs(F-f),Math.abs(j-f));return N-U})[0]||null}function fG(l,u){let r=Sl(l?.attempts).filter(Xl);if(r.length===0)return null;let f=String(u?.attempt||"");if(f){let i=r.find((y)=>Q8(y)===f);if(i)return i}let n=Number.isFinite(Number(u?.ms))?Number(u.ms):null;if(n===null)return r.at(-1)||null;let t=r.find((i)=>{let y=DF(i);return Number.isFinite(y.startMs)&&Number.isFinite(y.endMs)&&n>=Number(y.startMs)-1000&&n<=Number(y.endMs)+1000});if(t)return t;return r.slice().sort((i,y)=>{let c=DF(i),_=DF(y),A=Math.min(Math.abs(Number(c.startMs??n)-n),Math.abs(Number(c.endMs??n)-n)),F=Math.min(Math.abs(Number(_.startMs??n)-n),Math.abs(Number(_.endMs??n)-n));return A-F})[0]||r.at(-1)||null}function nG(l,u){let r=U8(l);if(r.length===0)return{step:null,stepIndex:-1,stepKey:""};if(u===null){let t=r[0];return{step:t,stepIndex:0,stepKey:F$(t,0)}}for(let t=0;t=y-1000&&u<=c+1000)return{step:i,stepIndex:t,stepKey:F$(i,t)}}let f=r.findIndex((t)=>{let i=dl(t?.createdAt)??dl(t?.completedAt);return i!==null&&i>=u});if(f>=0){let t=r[f];return{step:t,stepIndex:f,stepKey:F$(t,f)}}let n=Math.max(0,r.length-1);return{step:r[n],stepIndex:n,stepKey:F$(r[n],n)}}function CY(l,u){let r=String(u?.runId||l?.runId||"");if(String(u?.mode||"")==="interval"){let _=u?.interval||{},A=PF(l,_)||_.raw||{};return{mode:"interval",runId:r,interval:_,marker:null,nodeId:String(_?.nodeId||m8(A,r)||""),procedure:A,attempt:null,matchedStep:null,matchedStepIndex:-1,matchedStepKey:""}}let f=Xl(u?.marker)?u.marker:{},n=Number.isFinite(Number(f?.ms))?Number(f.ms):null,t=String(f?.nodeId||""),i=t?PY(l,r,t,n,String(f?.procedureRunId||"")):null,y=i?fG(i,f):null,c=y?nG(y,n):{step:null,stepIndex:-1,stepKey:""};return{mode:"event",runId:r,interval:null,marker:f,nodeId:t,procedure:i,attempt:y,matchedStep:c.step,matchedStepIndex:c.stepIndex,matchedStepKey:c.stepKey}}function hY({procedure:l,matchedStepKey:u="",matchedAttemptId:r=""}){let f=Sl(l?.attempts);if(f.length===0)return T(qf,{title:"暂无 attempt 详情",text:"当前 procedure 还没有可展示的 attempt / OpenCode Trace;若刚点击甘特线,请等待 node 详情抓取完成。"});return f.map((n,t)=>{let i=n?.opencodeMessages||{},y=U8(n),c=Sl(i.sessionIds).map((j)=>String(j)).filter(Boolean),_=VY(y,c),A=Q8(n)||`attempt-${t+1}`,F=y.reduce((j,N)=>j+Sl(N?.parts).filter((U)=>String(U?.type||"").toLowerCase()==="tool"&&rG(U)==="failed").length,0);return T("article",{key:A,className:`pipeline-attempt-card ${r===A?"matched":""}`},T("div",{className:"pipeline-attempt-head"},T("div",null,T("strong",null,A),T("span",null,i.source||"opencode")),T("div",{className:"pipeline-attempt-badges"},T("span",null,`${y.length} steps`),T("span",null,`${i.toolCallCount??"--"} tools`),F>0?T("span",{className:"danger"},`${F} failed`):null)),T(XF,{items:[{label:"messages",value:i.messageCount??"--"},{label:"steps",value:i.stepCount??"--"},{label:"tools",value:i.toolCallCount??"--"},{label:"updated",value:Ll(i.updatedAt)},{label:"sessions",value:c.join(", ")||"--"}]}),y.length===0?T("p",{className:"muted paragraph"},"当前 attempt 尚未返回 OpenCode Trace;请确认 D601 pipeline-control 已重建并重新抓取。"):T(SY,{steps:y,sessionIds:c,sessionFacts:_,matchedStepKey:u}))})}function VF(l,u){return`${l}::${u}`}function _8(l,u,r){if(!Xl(l))return null;return String(l.runId||"")===u&&String(l.nodeId||"")===r?l:null}function MY(l,u){let r=Xl(l)?l:{};if(!Xl(u))return r;let f=Sl(u.attempts),n=Sl(r.attempts);return{...r,...u,attempts:f.length>0?f:n}}function sY(l,u,r,f){if(!_8(u,r,f))return l;let n=Sl(u.procedureRuns),t=Xl(l)?l:{};return{...t,...u,controlEvents:Sl(u.controlEvents).length>0?u.controlEvents:t.controlEvents,procedureRuns:n.length>0?n:t.procedureRuns}}function RY({selection:l,runDetails:u,nodeDetails:r,nodeDetailsState:f,onRaw:n,onCollapse:t}){if(!l?.mode)return T("aside",{className:"pipeline-gantt-detail-panel empty","data-testid":"pipeline-gantt-detail-panel"},T("div",{className:"pipeline-gantt-detail-head"},T("div",null,T("span",{className:"panel-eyebrow"},"Gantt Detail"),T(nu,{title:"未选择元素",level:3})),T("button",{type:"button",className:"ghost-btn mini",onClick:t,"data-testid":"pipeline-gantt-sidebar-collapse"},"收起")),T(qf,{title:"选择一条执行线或一个控制点",text:"点击甘特图中的 node 执行线、prompt 点或控制点,在这里查看结构化过程和 OpenCode step。"}));let i=String(l?.runId||""),y=String(l?.interval?.nodeId||l?.marker?.nodeId||""),c=u?.runId===i?u.details:null,_=_8(r,i,y),A=String(f?.runId||"")===i&&String(f?.nodeId||"")===y,F=sY(c,_,i,y),j=(String(u?.runId||"")!==i||Boolean(u?.loading))&&!F,N=String(u?.runId||"")===i?String(u?.error||""):"",U=A?String(f?.error||""):"",w=F?CY(F,l):null,G=w?.interval||l?.interval||null,J=w?.marker||l?.marker||null,Q=String(G?.procedureRunId||J?.procedureRunId||""),m=_?DY(_,Q)||PF(_,G||{procedureRunId:Q}):null,q=w?.procedure||(F?PF(F,G||{procedureRunId:Q}):null)||G?.raw||{};if(m&&(BF(q)===0||YL(m)>=YL(q)))q=MY(q,m);let W=w?.attempt||null,p=String(w?.matchedStepKey||"");if(!W&&J&&BF(q)>0)W=fG(q,J),p=String(nG(W,Number.isFinite(Number(J?.ms))?Number(J.ms):null).stepKey||"");let O=Q8(W),Z=BF(q)>0,V=A&&Boolean(f?.loading)&&!Z,P=Boolean(j||V),H=[Z?"":N,U].filter(Boolean).join(" / "),B=A&&f?.fetchedAt?f.fetchedAt:u?.fetchedAt,C=uG(q?.status||G?.status||J?.status||J?.event),E=l?.mode==="event"?J?.label||PL(J?.raw||J)||"event":w?.nodeId||G?.nodeId||"node",D=J?XY(J?.raw||J):[],Y=J?[yn(J?.raw||J)?`event ${yn(J?.raw||J)}`:"",J?.promptEvent?`prompt ${J.promptEvent}`:"",J?.action?`action ${J.action}`:"",J?.sourceKind?`source ${XL(J.sourceKind)}`:"",J?.sourceNodeId?`from ${J.sourceNodeId}`:"",J?.targetNodeId?`to ${J.targetNodeId}`:"",J?.snapReason?`draw ${J.snapReason}`:""].filter(Boolean):[];return T("aside",{className:"pipeline-gantt-detail-panel","data-testid":"pipeline-gantt-detail-panel"},T("div",{className:"pipeline-gantt-detail-head"},T("div",null,T("span",{className:"panel-eyebrow"},l?.mode==="event"?"Gantt Event Detail":"Gantt Line Detail"),T(nu,{title:E,level:3,loading:P})),T("div",{className:"pipeline-gantt-detail-head-actions"},T(_i,{status:C},C),T("button",{type:"button",className:"ghost-btn mini",onClick:t,"data-testid":"pipeline-gantt-sidebar-collapse"},"收起"))),J?T("article",{className:"pipeline-event-card"},T("div",{className:"pipeline-event-card-head"},T("strong",null,J?.label||PL(J?.raw||J)),T(gF,{items:Y})),T(XF,{items:[{label:"event time",value:Ll(J?.timestampIso||J?.timestamp||"--")},J?.snapped?{label:"drawn time",value:Ll(J?.renderedTimestampIso||J?.ms)}:null,{label:"node",value:J?.nodeId||"--"},{label:"procedure",value:J?.procedureRunId||Pf(q)||"--"},{label:"attempt",value:J?.attempt||O||"--"},{label:"source kind",value:J?.sourceKind?XL(J.sourceKind):"--"},{label:"source node",value:J?.sourceNodeId||"--"},{label:"target node",value:J?.targetNodeId||"--"},{label:"command",value:J?.commandId||J?.eventId||"--"},J?.snapReason?{label:"placement",value:J.snapReason}:null]}),D.length>0?T("div",{className:"pipeline-event-blocks"},D.map((v,K)=>T("section",{key:`${v.label}-${K}`,className:"pipeline-event-text-block"},T("b",null,v.label),T("p",null,v.value)))):null,CL(J?.raw||J)?T("p",{className:"pipeline-text-preview"},CL(J?.raw||J)):null):null,T(XF,{items:[{label:"epoch",value:i||G?.runId||"--"},{label:"node",value:w?.nodeId||G?.nodeId||J?.nodeId||"--"},{label:"procedure",value:G?.procedureRunId||J?.procedureRunId||Pf(q)||"--"},{label:"started",value:Ll(G?.startedAt||q?.startedAt)},{label:"finished",value:Ll(G?.finishedAt||q?.finishedAt)},{label:"duration",value:Xf(G?.durationMs||q?.durationMs)},{label:"fetched",value:B?iu(B):"--"},w?.matchedStep?{label:"matched step",value:`Step ${w.matchedStep.index??w.matchedStepIndex+1}`}:null]}),T(el,{error:H}),T("div",{className:"pipeline-gantt-detail-actions"},T(cn,{title:`Procedure ${G?.procedureRunId||J?.procedureRunId||w?.nodeId||"node"}`,data:q,onOpen:n,testId:"raw-pipeline-gantt-procedure"}),J?T(cn,{title:`Pipeline event ${J?.id||J?.commandId||J?.eventId||w?.nodeId||"event"}`,data:J?.raw||J,onOpen:n,testId:"raw-pipeline-gantt-event"}):null,F?T(cn,{title:`Pipeline run ${i||"--"}`,data:F,onOpen:n,testId:"raw-pipeline-gantt-node-details"}):null),!P&&!Pf(q)&&!J?T(qf,{title:"暂无过程详情",text:"当前选择还没有可匹配的 procedure 运行记录。"}):null,!P&&Pf(q)?T(hY,{procedure:q,matchedStepKey:p,matchedAttemptId:O}):null)}function xY({value:l}){let r=String(l||"--").split(/([_-])/u);return T($i.default.Fragment,null,r.map((f,n)=>f==="-"||f==="_"?T($i.default.Fragment,{key:n},f,T("wbr",null)):T($i.default.Fragment,{key:n},f)))}async function ii(l,u={}){return Tl(l,{invalidJsonPrefix:"Pipeline 返回了无效 JSON",...u})}function _i({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return T("span",{className:`status-badge ${r}`},u||l||"unknown")}function sr({label:l,value:u,hint:r,tone:f}){return T("article",{className:`metric-card ${f||""}`},T("div",{className:"metric-label"},l),T("div",{className:"metric-value"},u),T("div",{className:"metric-hint"},r))}function Zn({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return T("section",{className:`panel ${n||""}`},T("div",{className:"panel-head"},T("div",null,u?T("p",{className:"panel-eyebrow"},u):null,T(nu,{title:l,loading:t})),r?T("div",{className:"panel-actions"},r):null),T("div",{className:"panel-body"},f))}function cn({title:l,data:u,onOpen:r,testId:f}){return T("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function Yf({title:l,subtitle:u,facts:r,data:f,onRaw:n,testId:t}){let i=Sl(r).map((y)=>String(y||"")).filter(Boolean);return T("article",{className:"pipeline-evidence-row"},T("div",{className:"pipeline-evidence-main"},T("strong",null,l),u?T("span",null,u):null),T("div",{className:"pipeline-evidence-facts"},i.map((y,c)=>T("span",{key:`${c}-${y.slice(0,16)}`},y))),f!==void 0?T(cn,{title:l,data:f,onOpen:n,testId:t}):null)}function qf({title:l,text:u}){return T("div",{className:"empty-state"},T("strong",null,l),T("span",null,u))}function bY(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function vY(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function gY(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function kY(l){return{components:Array.isArray(l?.registry?.components)?l.registry.components:[],pipelines:Array.isArray(l?.pipelines)?l.pipelines:[],runs:Array.isArray(l?.runs)?l.runs:[]}}function hL(l,u,r){let f=l?._unidesk?.arrayLimits?.[u],n=Number(f?.originalLength);return Number.isFinite(n)?n:r}function tG(l){if(!l||typeof l!=="object"||Array.isArray(l))return"--";return`${l.componentClass||"--"}/${l.id||"--"}`}function A8(l){if(!l||typeof l!=="object"||Array.isArray(l))return"";let u=String(l.componentClass||"").trim(),r=String(l.id||"").trim();return u&&r?`${u}/${r}`:""}function kF(l){return l?.config&&typeof l.config==="object"&&!Array.isArray(l.config)?l.config:{}}function iG(l){let u=kF(l),r=Array.isArray(u.nodes)?u.nodes:Array.isArray(l?.nodes)?l.nodes:[],f=new Map;for(let i of r){let y=String(i?.id||i?.nodeId||"");if(y)f.set(y,{...i,id:y})}let n=IF(l),t=(i)=>{if(i&&!f.has(i))f.set(i,{id:i})};for(let i of aF(l))U$(i).forEach(t);for(let i of n)t(String(i?.from||i?.source||"")),t(String(i?.to||i?.target||""));return Array.from(f.values())}function IF(l){let u=kF(l);return Array.isArray(u.edges)?u.edges:Array.isArray(l?.edges)?l.edges:[]}function aF(l){let u=kF(l);return Array.isArray(u.topologicalBatches)?u.topologicalBatches:Array.isArray(l?.topologicalBatches)?l.topologicalBatches:[]}function IY(l){let u=new Map;for(let r of l){let f=A8(r);if(f)u.set(f,r);let n=Array.isArray(r?.refs)?r.refs:[];for(let t of n){let i=A8(t);if(i)u.set(i,r)}}return u}function ML(l,u){let r=u.get(A8(l?.componentRef));if(r)return r;let f=A8({componentClass:l?.kind,id:l?.id});return f?u.get(f)||null:null}function sL(l,u){let r=yG(l,u);return String(r?.status||"pending")}function yG(l,u){return(Array.isArray(l?.nodes)?l.nodes:[]).find((f)=>f?.nodeId===u||f?.id===u)||null}function aY(l){return l.reduce((u,r)=>{let f=String(r?.status||"unknown").toLowerCase();return u[f]=(u[f]||0)+1,u},{})}function oY(l){if(Array.isArray(l?.scorers))return l.scorers.filter(Xl);if(Array.isArray(l?.summary?.scorers))return l.summary.scorers.filter(Xl);if(Array.isArray(l?.artifact?.summary?.scorers))return l.artifact.summary.scorers.filter(Xl);return[]}function dY(l){if(Xl(l?.run))return l.run;if(Xl(l?.runSummary))return l.runSummary;return null}function eY(l,u){if(!Xl(l)&&!Xl(u))return null;if(!Xl(l))return u;if(!Xl(u))return l;return{...l,...u,request:Xl(l.request)||Xl(u.request)?{...Xl(l.request)?l.request:{},...Xl(u.request)?u.request:{}}:u.request??l.request,artifact:Xl(l.artifact)||Xl(u.artifact)?{...Xl(l.artifact)?l.artifact:{},...Xl(u.artifact)?u.artifact:{}}:u.artifact??l.artifact,summary:Xl(l.summary)||Xl(u.summary)?{...Xl(l.summary)?l.summary:{},...Xl(u.summary)?u.summary:{}}:u.summary??l.summary}}function F8(l){let u=oY(l),r=u.find((A)=>Xl(A?.score))||u[0]||null,f=Xl(r?.score)?r.score:{},n=Number(f.passed),t=Number(f.total),i=Number(f.ratio),y=Number.isFinite(i)?i:Number.isFinite(n)&&Number.isFinite(t)&&t>0?n/t:null,c=y===null?null:Math.round(Math.max(0,Math.min(100,y<=1?y*100:y))),_=String(f.text||(Number.isFinite(n)&&Number.isFinite(t)?`${n}/${t}`:""));return{scorer:r,scorers:u,score:f,passed:Number.isFinite(n)?n:null,total:Number.isFinite(t)?t:null,percent:c,text:_}}function MF(l){let u=F8(l);return u.text||(u.scorers.length>0?String(u.scorer?.status||"pending"):"--")}function oF(l){let u=F8(l);if(u.total>0&&u.passed===u.total)return"succeeded";if(u.total>0&&u.passed>0)return"running";if(u.scorers.length>0)return"failed";return"pending"}function lX(l){return Array.isArray(l?.items)?l.items.filter(Xl):[]}function uX({run:l}){let u=MF(l);return T("span",{className:`pipeline-score-badge ${oF(l)}`},`score ${u}`)}function rX({run:l,onRaw:u}){let f=F8(l).scorers;if(!l)return T(qf,{title:"暂无评分",text:"选择一个 epoch 后会显示 scorer 结果。"});if(f.length===0)return T("div",{className:"pipeline-score-empty"},T("strong",null,"评分器等待中"),T("span",null,"DAG 完成后,Pipeline control backend 会把 scorer summary 追加到 run artifact,并通过 UniDesk 显示。"));return T("div",{className:"pipeline-score-board","data-testid":"pipeline-score-board"},f.map((n,t)=>{let i=F8({scorers:[n]}),y=lX(n),c=i.percent??0;return T("article",{key:`${n.scorerId||n.component||t}`,className:`pipeline-score-card ${oF({scorers:[n]})}`},T("div",{className:"pipeline-score-head"},T("div",null,T("span",null,n.scorerId||n.component||"scorer"),T("strong",null,i.text||n.status||"--")),T(_i,{status:n.status||"unknown"},n.status||"unknown")),T("div",{className:"pipeline-score-meter","aria-label":`score ${c}%`},T("span",{style:{width:`${c}%`}})),T("div",{className:"pipeline-score-facts"},T("span",null,`${c}%`),T("span",null,n.component||"--"),T("span",null,n.applicationCheckoutRef||"--")),y.length>0?T("div",{className:"pipeline-score-items"},y.map((_)=>T("span",{key:`${_.id||_.filter}`,className:`pipeline-score-item ${String(_.status||"").toLowerCase()}`,title:`${_.filter||"--"} / ran=${_.ran??"?"}`},T("b",null,_.id||"--"),T("small",null,_.status||"--")))):T("p",{className:"muted paragraph"},"当前 scorer 尚未返回 item 级结果。"),n.error?T("p",{className:"pipeline-score-error"},lG(n.error,360)):null,T("div",{className:"panel-actions inline-actions"},T(cn,{title:`Scorer ${n.scorerId||t}`,data:n,onOpen:u,testId:"raw-pipeline-score"})))}))}function fX(l){let u=l.reduce((r,f)=>{let n=String(f?.componentClass||"unknown");return r[n]=(r[n]||0)+1,r},{});return Object.entries(u).map(([r,f])=>({name:r,count:Number(f)})).sort((r,f)=>f.count-r.count||r.name.localeCompare(f.name))}function U$(l){if(Array.isArray(l))return l.map((u)=>typeof u==="string"?u:String(u?.id||u?.nodeId||"")).filter(Boolean);if(Array.isArray(l?.nodes))return U$(l.nodes);if(Array.isArray(l?.nodeIds))return U$(l.nodeIds);return[]}function nX(l){return Xl(l?.instanceInputs?.monitor)?l.instanceInputs.monitor:{}}function cG(l,u){if(String(l?.kind||"").toLowerCase()!=="procedure")return!1;let r=nX(l);if(l?.instanceInputs?.monitorMode===!0||r.enabled===!0)return!0;let f=tG(l?.componentRef);return String(u?.id||u?.config?.id||f||"").toLowerCase().includes("monitor")}function tX(l){return l.filter((u)=>cG(u)).map((u)=>String(u?.id||"")).filter(Boolean)}function iX(l,u){if(u.length===0)return l;let r=new Set(u),f=u.filter((n)=>l.includes(n));if(f.length===0)return l;return[...f,...l.filter((n)=>!r.has(n))]}function yX(l,u){if(u.length===0)return l;let r=new Set(u),f=u.filter((t)=>l.some((i)=>i.includes(t)));if(f.length===0)return l;let n=l.map((t)=>t.filter((i)=>!r.has(i))).filter((t)=>t.length>0);return[f,...n]}function cX(l,u,r){let n=aF(l).map(U$).filter((j)=>j.length>0);if(n.length>0)return n;let t=u.map((j)=>String(j?.id||"")).filter(Boolean),i=new Set(t),y=new Map(t.map((j)=>[j,0])),c=new Map(t.map((j)=>[j,[]]));for(let j of r){let N=String(j?.from||j?.source||""),U=String(j?.to||j?.target||"");if(!i.has(N)||!i.has(U))continue;c.get(N)?.push(U),y.set(U,(y.get(U)||0)+1)}let _=new Map,A=t.filter((j)=>(y.get(j)||0)===0);for(let j of A)_.set(j,0);while(A.length>0){let j=A.shift(),N=(_.get(j)||0)+1;for(let U of c.get(j)||[])if(y.set(U,Math.max(0,(y.get(U)||0)-1)),_.set(U,Math.max(_.get(U)||0,N)),(y.get(U)||0)===0)A.push(U)}t.forEach((j)=>{if(!_.has(j))_.set(j,0)});let F=Math.max(0,...Array.from(_.values()));return Array.from({length:F+1},(j,N)=>t.filter((U)=>_.get(U)===N)).filter((j)=>j.length>0)}function $X(l,u,r){let n=aF(l).map(U$).filter((y)=>y.length>0),t=n.length>0?n.flatMap((y)=>y):(()=>{let y=u.map((w)=>String(w?.id||"")).filter(Boolean),c=new Set(y),_=r.filter((w)=>String(w?.edgeType||"").toLowerCase()!=="rework"),A=new Map(y.map((w)=>[w,0])),F=new Map(y.map((w)=>[w,[]]));for(let w of _){let G=String(w?.from||w?.source||""),J=String(w?.to||w?.target||"");if(!c.has(G)||!c.has(J))continue;F.get(G)?.push(J),A.set(J,(A.get(J)||0)+1)}let j=new Map,N=y.filter((w)=>(A.get(w)||0)===0);for(let w of N)j.set(w,0);while(N.length>0){let w=N.shift(),G=(j.get(w)||0)+1;for(let J of F.get(w)||[])if(A.set(J,Math.max(0,(A.get(J)||0)-1)),j.set(J,Math.max(j.get(J)||0,G)),(A.get(J)||0)===0)N.push(J)}y.forEach((w)=>{if(!j.has(w))j.set(w,0)});let U=Math.max(0,...Array.from(j.values()));return Array.from({length:U+1},(w,G)=>y.filter((J)=>j.get(J)===G)).flatMap((w)=>w)})(),i=new Set(t);for(let y of u){let c=String(y?.id||"");if(!c||i.has(c))continue;t.push(c),i.add(c)}return iX(t,tX(u))}function $$(l){return`${l.source}->${l.target}-${l.index}`}function RL(l,u,r){let f=iG(l),n=IF(l),t=IY(r),i=new Map(f.map((C)=>[String(C?.id||""),C])),y=f.filter((C)=>cG(C,ML(C,t))).map((C)=>String(C?.id||"")).filter(Boolean),c=yX(cX(l,f,n),y),_=[],A=new Map,F=330,j=122;c.forEach((C,E)=>{let D=C.length*122;C.forEach((Y,v)=>{let K=i.get(Y)||{id:Y},X=ML(K,t),I=sL(u,Y).toLowerCase(),o=String(K.kind||X?.componentClass||"node").toLowerCase(),fl=tG(K.componentRef||X),yl=String(X?.config?.version||X?.version||""),h=String(X?.config?.description||X?.description||""),s=v*122-Math.floor(D/2);A.set(Y,{column:E,row:v,y:s}),_.push({id:Y,type:"pipelineNode",position:{x:E*330,y:s},data:{exportLabel:{id:Y,kind:o,componentRef:fl,componentVersion:yl,componentDescription:h,status:I},label:T("div",{className:"flow-node-label"},T("strong",null,Y),T("span",null,o),T("code",{title:h||fl},yl?`${fl}@${yl}`:fl),T(_i,{status:I},I))},className:`pipeline-flow-node ${o} ${I}`})})});let N=n.flatMap((C,E)=>{let D=String(C?.from||C?.source||""),Y=String(C?.to||C?.target||"");if(!i.has(D)||!i.has(Y))return[];return[{source:D,target:Y,index:E,condition:C?.condition,edgeType:C?.edgeType}]}),U=N.reduce((C,E)=>C.set(E.source,(C.get(E.source)||0)+1),new Map),w=N.reduce((C,E)=>C.set(E.target,(C.get(E.target)||0)+1),new Map),G=N.reduce((C,E)=>{let D=`${E.source}->${E.target}`;return C.set(D,(C.get(D)||0)+1)},new Map),J=new Map,Q=new Map,m=new Map,q=new Map,W=new Map,p=new Map,O=N.reduce((C,E)=>{let D=A.get(E.source),Y=A.get(E.target),v=(Y?.column||0)-(D?.column||0);if(v<=0||String(E.edgeType||"").toLowerCase()==="rework"||v!==1)return C;let X=`${E.source}->column:${Y?.column??""}`,I=C.get(X)||[];return I.push(E),C.set(X,I),C},new Map);for(let C of O.values()){if(C.length<2)continue;C.slice().sort((E,D)=>{let Y=A.get(E.target),v=A.get(D.target);return(Y?.y||0)-(v?.y||0)||E.index-D.index}).forEach((E,D,Y)=>{p.set($$(E),{slot:D-(Y.length-1)/2,count:Y.length})})}[...N].sort((C,E)=>{let D=A.get(C.source),Y=A.get(C.target),v=A.get(E.source),K=A.get(E.target),X=Math.abs((Y?.column||0)-(D?.column||0))*330+Math.abs((Y?.y||0)-(D?.y||0)),I=Math.abs((K?.column||0)-(v?.column||0))*330+Math.abs((K?.y||0)-(v?.y||0));return X-I||C.index-E.index}).forEach((C)=>{let E=A.get(C.source)||{column:0,row:0,y:0},D=A.get(C.target)||{column:0,row:0,y:0},Y=D.column-E.column,v=Math.max(0,Y),K=Y<=0||String(C.edgeType||"").toLowerCase()==="rework",X=E.y-D.y,I=w.get(C.target)||1,o=p.has($$(C)),fl=!K&&v<=1&&(o||I===1),yl=W.get(C.target)||new Map;W.set(C.target,yl);let h=N$.slice().sort((s,ul)=>{let tl=(El)=>{let M=String(El.side),d=0;if(K){if(M==="left")d+=86;if(M==="top")d+=D.y<=0?-22:12;if(M==="bottom")d+=D.y>=0?-22:12;if(Math.abs(D.y)<12&&M!=="left")d+=C.index%2===0?M==="top"?-6:6:M==="bottom"?-6:6;return d}if(fl){if(M==="left")d-=o?72:44;if(M!=="left")d+=o?72:44;return d+Math.abs(X)*0.02}if(M==="left")d+=v<=1?0:24;if(M==="top")d+=X<-36?-18:42;if(M==="bottom")d+=X>36?-18:42;if(v<=1&&Math.abs(X)<=82&&M!=="left")d+=38;if(v>1&&M!=="left")d-=10;return d},Al=E.y-D.y,Kl=Al!==0?Al:C.index%2===0?-1:1,wl=(El)=>{let M=yl.get(El.id)||0;return tl(El)+M*64+pY(El,yl,Kl)};return wl(s)-wl(ul)||String(s.id).localeCompare(String(ul.id))})[0];yl.set(h.id,(yl.get(h.id)||0)+1),q.set($$(C),h)});let V=N.map((C)=>{let E=sL(u,C.target).toLowerCase(),D=`${C.source}->${C.target}`,Y=J.get(C.source)||0,v=Q.get(C.target)||0,K=m.get(D)||0;J.set(C.source,Y+1),Q.set(C.target,v+1),m.set(D,K+1);let X=Y-((U.get(C.source)||1)-1)/2,I=v-((w.get(C.target)||1)-1)/2,o=K-((G.get(D)||1)-1)/2,fl=A.get(C.source),yl=A.get(C.target),h=(yl?.column||0)-(fl?.column||0),s=Math.max(1,Math.abs(h)),ul=h<=0||String(C.edgeType||"").toLowerCase()==="rework",tl=Math.abs((yl?.y||0)-(fl?.y||0)),Al=p.get($$(C)),Kl=!ul&&h===1&&(w.get(C.target)||0)>1,wl=Al?Al.slot:o*2+X+I*0.45,El=wl===0?C.index%2===0?-1:1:Math.sign(wl),M=q.get($$(C))||N$[1],d=M.side==="top"?-1:M.side==="bottom"?1:El,nl=ul||s>1||tl>96||Math.abs(wl)>0.2||M.side!=="left",k=ul?118+s*18:22+s*16,g=M.side==="left"?0:28,cl=nl?Math.max(-280,Math.min(280,d*Math.min(180,k+g+tl*0.22)+wl*28)):0,pl=Math.max(0,Math.min(A$.length-1,Math.round(X+(A$.length-1)/2))),Hl=A$[pl]||A$[1],bl=E==="succeeded"?"var(--accent-2)":E==="running"?"var(--accent)":E==="failed"?"var(--danger)":"rgba(129, 147, 159, 0.78)",_u=fl?.column||0,tu=yl?.column||0,Nu=cl===0?0:Math.sign(cl),gl=ul?`feedback:${_u}->${tu}:${Nu}`:Al?`fanout:${_u}->${tu}:${C.source}`:Kl?`fanin:${_u}->${tu}:${C.target}`:M.side!=="left"||s>1?`corridor:${_u}->${tu}:${M.side}:${Nu}:${Math.round(Math.abs(cl)/56)}`:"";return{id:`${C.source}->${C.target}-${C.index}`,source:C.source,target:C.target,sourceHandle:Hl.id,targetHandle:M.id,type:"pipelineCurve",zIndex:12,animated:E==="running",data:{baseEdgeColor:bl,laneOffset:cl,routeMode:Al&&M.side==="left"?"direct-forward-left":"",targetSide:M.side,isFeedback:ul,overlapGroup:gl},targetStatus:E}}),P=V.reduce((C,E)=>{let D=String(E.data?.overlapGroup||"");return D?C.set(D,(C.get(D)||0)+1):C},new Map),H=new Map,B=V.map((C)=>{let E=String(C.targetStatus||"pending"),D={...C};delete D.targetStatus;let Y=String(C.data?.overlapGroup||""),v=Y?P.get(Y)||0:0,K=v>1?H.get(Y)||0:-1;if(v>1)H.set(Y,K+1);let X=K>=0?ZL[K%ZL.length]:String(C.data.baseEdgeColor),I={stroke:X};if(C.data.isFeedback)I.strokeDasharray="9 7";return{...D,data:{...C.data,edgeColor:X,overlapSlot:K,overlapCount:v},style:I,markerEnd:{type:ri.ArrowClosed,color:X},className:`pipeline-flow-edge ${E} ${C.data.isFeedback?"feedback":""} ${K>=0?"overlap-colored":""}`}});return{nodes:_,edges:B}}function uf(l){return String(l??"").replace(/&/g,"&").replace(//g,">").replace(/"/g,""")}function xL(l){let u=String(l||"");if(u.includes("--accent-2"))return"#4eb7a8";if(u.includes("--accent"))return"#d7a13a";if(u.includes("--danger"))return"#cf6a54";return u.startsWith("#")?u:"#81939f"}function j8(l){return`arrow-${l.replace(/[^a-zA-Z0-9_-]+/g,"")}`}function $G(l,u="pipeline"){return String(l||u).replace(/[^a-zA-Z0-9_-]+/g,"-").replace(/^-|-$/g,"")||u}function bL(l,u){let r=l.position.x,f=l.position.y,n=N$.find((t)=>t.id===u);if(n?.side==="top")return{x:r+sy*DL(n.style?.left,0.5),y:f,position:Ol.Top};if(n?.side==="bottom")return{x:r+sy*DL(n.style?.left,0.5),y:f+Ry,position:Ol.Bottom};return{x:r,y:f+Ry/2,position:Ol.Left}}function _X(l){return{x:l.position.x+sy,y:l.position.y+Ry/2}}function AX(l,u){let r=Math.min(...l.nodes.map((w)=>w.position.x),0)-220,f=Math.min(...l.nodes.map((w)=>w.position.y),0)-220,n=Math.max(...l.nodes.map((w)=>w.position.x+sy),1)+220,t=Math.max(...l.nodes.map((w)=>w.position.y+Ry),1)+220,i=Math.ceil(n-r),y=Math.ceil(t-f),c=new Map(l.nodes.map((w)=>[w.id,w])),_=l.edges.map((w)=>xL(w.data?.edgeColor||w.style?.stroke)),F=Array.from(new Set(["#4eb7a8","#d7a13a","#cf6a54","#81939f",..._])).map((w)=>``).join(""),j=l.edges.flatMap((w)=>{let G=c.get(w.source),J=c.get(w.target);if(!G||!J)return[];let Q=_X(G),m=bL(J,String(w.targetHandle||"in-left")),q=oL(Q.x,Q.y,m.x,m.y,m.position,Number(w.data?.laneOffset||0),String(w.data?.routeMode||"")),W=xL(w.data?.edgeColor||w.style?.stroke),p=w.data?.isFeedback?' stroke-dasharray="9 7"':"";return``}).join(` +`)),A=_.reduce((F,j)=>F.concat(...j),[]);return[_,A]}return[[],[]]},[l]);return _l.useEffect(()=>{let c=u?.target??Zq,_=u?.actInsideInputWithModifier??!0;if(l!==null){let A=(N)=>{if(n.current=N.ctrlKey||N.metaKey||N.shiftKey||N.altKey,(!n.current||n.current&&!_)&&FF(N))return!1;let w=Bq(N.code,y);if(t.current.add(N[w]),Hq(i,t.current,!1)){let G=N.composedPath?.()?.[0]||N.target,J=G?.nodeName==="BUTTON"||G?.nodeName==="A";if(u.preventDefault!==!1&&(n.current||!J))N.preventDefault();f(!0)}},F=(N)=>{let U=Bq(N.code,y);if(Hq(i,t.current,!0))f(!1),t.current.clear();else t.current.delete(N[U]);if(N.key==="Meta")t.current.clear();n.current=!1},j=()=>{t.current.clear(),f(!1)};return c?.addEventListener("keydown",A),c?.addEventListener("keyup",F),window.addEventListener("blur",j),window.addEventListener("contextmenu",j),()=>{c?.removeEventListener("keydown",A),c?.removeEventListener("keyup",F),window.removeEventListener("blur",j),window.removeEventListener("contextmenu",j)}}},[l,f]),r}function Hq(l,u,r){return l.filter((f)=>r||f.length===u.size).some((f)=>f.every((n)=>u.has(n)))}function Bq(l,u){return u.includes(l)?"code":"key"}var DV=()=>{let l=Vu();return _l.useMemo(()=>{return{zoomIn:(u)=>{let{panZoom:r}=l.getState();return r?r.scaleBy(1.2,u):Promise.resolve(!1)},zoomOut:(u)=>{let{panZoom:r}=l.getState();return r?r.scaleBy(0.8333333333333334,u):Promise.resolve(!1)},zoomTo:(u,r)=>{let{panZoom:f}=l.getState();return f?f.scaleTo(u,r):Promise.resolve(!1)},getZoom:()=>l.getState().transform[2],setViewport:async(u,r)=>{let{transform:[f,n,t],panZoom:i}=l.getState();if(!i)return Promise.resolve(!1);return await i.setViewport({x:u.x??f,y:u.y??n,zoom:u.zoom??t},r),Promise.resolve(!0)},getViewport:()=>{let[u,r,f]=l.getState().transform;return{x:u,y:r,zoom:f}},setCenter:async(u,r,f)=>{return l.getState().setCenter(u,r,f)},fitBounds:async(u,r)=>{let{width:f,height:n,minZoom:t,maxZoom:i,panZoom:y}=l.getState(),c=i$(u,f,n,t,i,r?.padding??0.1);if(!y)return Promise.resolve(!1);return await y.setViewport(c,{duration:r?.duration,ease:r?.ease,interpolate:r?.interpolate}),Promise.resolve(!0)},screenToFlowPosition:(u,r={})=>{let{transform:f,snapGrid:n,snapToGrid:t,domNode:i}=l.getState();if(!i)return u;let{x:y,y:c}=i.getBoundingClientRect(),_={x:u.x-y,y:u.y-c},A=r.snapGrid??n,F=r.snapToGrid??t;return Yy(_,f,F,A)},flowToScreenPosition:(u)=>{let{transform:r,domNode:f}=l.getState();if(!f)return u;let{x:n,y:t}=f.getBoundingClientRect(),i=n$(u,r);return{x:i.x+n,y:i.y+t}}}},[])};function eq(l,u){let r=[],f=new Map,n=[];for(let t of l)if(t.type==="add"){n.push(t);continue}else if(t.type==="remove"||t.type==="replace")f.set(t.id,[t]);else{let i=f.get(t.id);if(i)i.push(t);else f.set(t.id,[t])}for(let t of u){let i=f.get(t.id);if(!i){r.push(t);continue}if(i[0].type==="remove")continue;if(i[0].type==="replace"){r.push({...i[0].item});continue}let y={...t};for(let c of i)VV(c,y);r.push(y)}if(n.length)n.forEach((t)=>{if(t.index!==void 0)r.splice(t.index,0,{...t.item});else r.push({...t.item})});return r}function VV(l,u){switch(l.type){case"select":{u.selected=l.selected;break}case"position":{if(typeof l.position<"u")u.position=l.position;if(typeof l.dragging<"u")u.dragging=l.dragging;break}case"dimensions":{if(typeof l.dimensions<"u"){if(u.measured={...l.dimensions},l.setAttributes){if(l.setAttributes===!0||l.setAttributes==="width")u.width=l.dimensions.width;if(l.setAttributes===!0||l.setAttributes==="height")u.height=l.dimensions.height}}if(typeof l.resizing==="boolean")u.resizing=l.resizing;break}}}function SV(l,u){return eq(l,u)}function YV(l,u){return eq(l,u)}function y0(l,u){return{id:l,type:"select",selected:u}}function Cy(l,u=new Set,r=!1){let f=[];for(let[n,t]of l){let i=u.has(n);if(!(t.selected===void 0&&!i)&&t.selected!==i){if(r)t.selected=i;f.push(y0(t.id,i))}}return f}function Dq({items:l=[],lookup:u}){let r=[],f=new Map(l.map((n)=>[n.id,n]));for(let[n,t]of l.entries()){let i=u.get(t.id),y=i?.internals?.userNode??i;if(y!==void 0&&y!==t)r.push({id:t.id,item:t,type:"replace"});if(y===void 0)r.push({item:t,type:"add",index:n})}for(let[n]of u)if(f.get(n)===void 0)r.push({id:n,type:"remove"});return r}function Vq(l){return{id:l.id,type:"remove"}}var Sq=(l)=>Xw(l),XV=(l)=>uF(l);function lL(l){return _l.forwardRef(l)}function Yq(l){let[u,r]=_l.useState(BigInt(0)),[f]=_l.useState(()=>PV(()=>r((n)=>n+BigInt(1))));return KF(()=>{let n=f.get();if(n.length)l(n),f.reset()},[u]),f}function PV(l){let u=[];return{get:()=>u,reset:()=>{u=[]},push:(r)=>{u.push(r),l()}}}var uL=_l.createContext(null);function CV({children:l}){let u=Vu(),r=_l.useCallback((y)=>{let{nodes:c=[],setNodes:_,hasDefaultNodes:A,onNodesChange:F,nodeLookup:j,fitViewQueued:N,onNodesChangeMiddlewareMap:U}=u.getState(),w=c;for(let J of y)w=typeof J==="function"?J(w):J;let G=Dq({items:w,lookup:j});for(let J of U.values())G=J(G);if(A)_(w);if(G.length>0)F?.(G);else if(N)window.requestAnimationFrame(()=>{let{fitViewQueued:J,nodes:Q,setNodes:m}=u.getState();if(J)m(Q)})},[]),f=Yq(r),n=_l.useCallback((y)=>{let{edges:c=[],setEdges:_,hasDefaultEdges:A,onEdgesChange:F,edgeLookup:j}=u.getState(),N=c;for(let U of y)N=typeof U==="function"?U(N):U;if(A)_(N);else if(F)F(Dq({items:N,lookup:j}))},[]),t=Yq(n),i=_l.useMemo(()=>({nodeQueue:f,edgeQueue:t}),[]);return il.jsx(uL.Provider,{value:i,children:l})}function hV(){let l=_l.useContext(uL);if(!l)throw Error("useBatchContext must be used within a BatchProvider");return l}var MV=(l)=>!!l.panZoom;function pF(){let l=DV(),u=Vu(),r=hV(),f=$u(MV),n=_l.useMemo(()=>{let t=(F)=>u.getState().nodeLookup.get(F),i=(F)=>{r.nodeQueue.push(F)},y=(F)=>{r.edgeQueue.push(F)},c=(F)=>{let{nodeLookup:j,nodeOrigin:N}=u.getState(),U=Sq(F)?F:j.get(F.id),w=U.parentId?$F(U.position,U.measured,U.parentId,j,N):U.position,G={...U,position:w,width:U.measured?.width??U.width,height:U.measured?.height??U.height};return i0(G)},_=(F,j,N={replace:!1})=>{i((U)=>U.map((w)=>{if(w.id===F){let G=typeof j==="function"?j(w):j;return N.replace&&Sq(G)?G:{...w,...G}}return w}))},A=(F,j,N={replace:!1})=>{y((U)=>U.map((w)=>{if(w.id===F){let G=typeof j==="function"?j(w):j;return N.replace&&XV(G)?G:{...w,...G}}return w}))};return{getNodes:()=>u.getState().nodes.map((F)=>({...F})),getNode:(F)=>t(F)?.internals.userNode,getInternalNode:t,getEdges:()=>{let{edges:F=[]}=u.getState();return F.map((j)=>({...j}))},getEdge:(F)=>u.getState().edgeLookup.get(F),setNodes:i,setEdges:y,addNodes:(F)=>{let j=Array.isArray(F)?F:[F];r.nodeQueue.push((N)=>[...N,...j])},addEdges:(F)=>{let j=Array.isArray(F)?F:[F];r.edgeQueue.push((N)=>[...N,...j])},toObject:()=>{let{nodes:F=[],edges:j=[],transform:N}=u.getState(),[U,w,G]=N;return{nodes:F.map((J)=>({...J})),edges:j.map((J)=>({...J})),viewport:{x:U,y:w,zoom:G}}},deleteElements:async({nodes:F=[],edges:j=[]})=>{let{nodes:N,edges:U,onNodesDelete:w,onEdgesDelete:G,triggerNodeChanges:J,triggerEdgeChanges:Q,onDelete:m,onBeforeDelete:q}=u.getState(),{nodes:W,edges:p}=await hw({nodesToRemove:F,edgesToRemove:j,nodes:N,edges:U,onBeforeDelete:q}),O=p.length>0,Z=W.length>0;if(O){let V=p.map(Vq);G?.(p),Q(V)}if(Z){let V=W.map(Vq);w?.(W),J(V)}if(Z||O)m?.({nodes:W,edges:p});return{deletedNodes:W,deletedEdges:p}},getIntersectingNodes:(F,j=!0,N)=>{let U=iF(F),w=U?F:c(F),G=N!==void 0;if(!w)return[];return(N||u.getState().nodes).filter((J)=>{let Q=u.getState().nodeLookup.get(J.id);if(Q&&!U&&(J.id===F.id||!Q.internals.positionAbsolute))return!1;let m=i0(G?J:Q),q=Vy(m,w);return j&&q>0||q>=m.width*m.height||q>=w.width*w.height})},isNodeIntersecting:(F,j,N=!0)=>{let w=iF(F)?F:c(F);if(!w)return!1;let G=Vy(w,j);return N&&G>0||G>=j.width*j.height||G>=w.width*w.height},updateNode:_,updateNodeData:(F,j,N={replace:!1})=>{_(F,(U)=>{let w=typeof j==="function"?j(U):j;return N.replace?{...U,data:w}:{...U,data:{...U.data,...w}}},N)},updateEdge:A,updateEdgeData:(F,j,N={replace:!1})=>{A(F,(U)=>{let w=typeof j==="function"?j(U):j;return N.replace?{...U,data:w}:{...U,data:{...U.data,...w}}},N)},getNodesBounds:(F)=>{let{nodeLookup:j,nodeOrigin:N}=u.getState();return fF(F,{nodeLookup:j,nodeOrigin:N})},getHandleConnections:({type:F,id:j,nodeId:N})=>Array.from(u.getState().connectionLookup.get(`${N}-${F}${j?`-${j}`:""}`)?.values()??[]),getNodeConnections:({type:F,handleId:j,nodeId:N})=>Array.from(u.getState().connectionLookup.get(`${N}${F?j?`-${F}-${j}`:`-${F}`:""}`)?.values()??[]),fitView:async(F)=>{let j=u.getState().fitViewResolver??Rw();return u.setState({fitViewQueued:!0,fitViewOptions:F,fitViewResolver:j}),r.nodeQueue.push((N)=>[...N]),j.promise}}},[]);return _l.useMemo(()=>{return{...n,...l,viewportInitialized:f}},[f])}var Xq=(l)=>l.selected,sV=typeof window<"u"?window:void 0;function RV({deleteKeyCode:l,multiSelectionKeyCode:u}){let r=Vu(),{deleteElements:f}=pF(),n=c$(l,{actInsideInputWithModifier:!1}),t=c$(u,{target:sV});_l.useEffect(()=>{if(n){let{edges:i,nodes:y}=r.getState();f({nodes:y.filter(Xq),edges:i.filter(Xq)}),r.setState({nodesSelectionActive:!1})}},[n]),_l.useEffect(()=>{r.setState({multiSelectionActive:t})},[t])}function xV(l){let u=Vu();_l.useEffect(()=>{let r=()=>{if(!l.current||!(l.current.checkVisibility?.()??!0))return!1;let f=sA(l.current);if(f.height===0||f.width===0)u.getState().onError?.("004",mf.error004());u.setState({width:f.width||500,height:f.height||500})};if(l.current){r(),window.addEventListener("resize",r);let f=new ResizeObserver(()=>r());return f.observe(l.current),()=>{if(window.removeEventListener("resize",r),f&&l.current)f.unobserve(l.current)}}},[])}var f8={position:"absolute",width:"100%",height:"100%",top:0,left:0},bV=(l)=>({userSelectionActive:l.userSelectionActive,lib:l.lib,connectionInProgress:l.connection.inProgress});function vV({onPaneContextMenu:l,zoomOnScroll:u=!0,zoomOnPinch:r=!0,panOnScroll:f=!1,panOnScrollSpeed:n=0.5,panOnScrollMode:t=it.Free,zoomOnDoubleClick:i=!0,panOnDrag:y=!0,defaultViewport:c,translateExtent:_,minZoom:A,maxZoom:F,zoomActivationKeyCode:j,preventScrolling:N=!0,children:U,noWheelClassName:w,noPanClassName:G,onViewportChange:J,isControlledViewport:Q,paneClickDistance:m,selectionOnDrag:q}){let W=Vu(),p=_l.useRef(null),{userSelectionActive:O,lib:Z,connectionInProgress:V}=$u(bV,zu),P=c$(j),H=_l.useRef();xV(p);let B=_l.useCallback((C)=>{if(J?.({x:C[0],y:C[1],zoom:C[2]}),!Q)W.setState({transform:C})},[J,Q]);return _l.useEffect(()=>{if(p.current){H.current=$q({domNode:p.current,minZoom:A,maxZoom:F,translateExtent:_,viewport:c,onDraggingChange:(Y)=>W.setState((v)=>v.paneDragging===Y?v:{paneDragging:Y}),onPanZoomStart:(Y,v)=>{let{onViewportChangeStart:K,onMoveStart:X}=W.getState();X?.(Y,v),K?.(v)},onPanZoom:(Y,v)=>{let{onViewportChange:K,onMove:X}=W.getState();X?.(Y,v),K?.(v)},onPanZoomEnd:(Y,v)=>{let{onViewportChangeEnd:K,onMoveEnd:X}=W.getState();X?.(Y,v),K?.(v)}});let{x:C,y:E,zoom:D}=H.current.getViewport();return W.setState({panZoom:H.current,transform:[C,E,D],domNode:p.current.closest(".react-flow")}),()=>{H.current?.destroy()}}},[]),_l.useEffect(()=>{H.current?.update({onPaneContextMenu:l,zoomOnScroll:u,zoomOnPinch:r,panOnScroll:f,panOnScrollSpeed:n,panOnScrollMode:t,zoomOnDoubleClick:i,panOnDrag:y,zoomActivationKeyPressed:P,preventScrolling:N,noPanClassName:G,userSelectionActive:O,noWheelClassName:w,lib:Z,onTransformChange:B,connectionInProgress:V,selectionOnDrag:q,paneClickDistance:m})},[l,u,r,f,n,t,i,y,P,N,G,O,w,Z,B,V,q,m]),il.jsx("div",{className:"react-flow__renderer",ref:p,style:f8,children:U})}var gV=(l)=>({userSelectionActive:l.userSelectionActive,userSelectionRect:l.userSelectionRect});function kV(){let{userSelectionActive:l,userSelectionRect:u}=$u(gV,zu);if(!(l&&u))return null;return il.jsx("div",{className:"react-flow__selection react-flow__container",style:{width:u.width,height:u.height,transform:`translate(${u.x}px, ${u.y}px)`}})}var WF=(l,u)=>{return(r)=>{if(r.target!==u.current)return;l?.(r)}},IV=(l)=>({userSelectionActive:l.userSelectionActive,elementsSelectable:l.elementsSelectable,connectionInProgress:l.connection.inProgress,dragging:l.paneDragging});function aV({isSelecting:l,selectionKeyPressed:u,selectionMode:r=n0.Full,panOnDrag:f,paneClickDistance:n,selectionOnDrag:t,onSelectionStart:i,onSelectionEnd:y,onPaneClick:c,onPaneContextMenu:_,onPaneScroll:A,onPaneMouseEnter:F,onPaneMouseMove:j,onPaneMouseLeave:N,children:U}){let w=Vu(),{userSelectionActive:G,elementsSelectable:J,dragging:Q,connectionInProgress:m}=$u(IV,zu),q=J&&(l||G),W=_l.useRef(null),p=_l.useRef(),O=_l.useRef(new Set),Z=_l.useRef(new Set),V=_l.useRef(!1),P=(K)=>{if(V.current||m){V.current=!1;return}c?.(K),w.getState().resetSelectedElements(),w.setState({nodesSelectionActive:!1})},H=(K)=>{if(Array.isArray(f)&&f?.includes(2)){K.preventDefault();return}_?.(K)},B=A?(K)=>A(K):void 0,C=(K)=>{if(V.current)K.stopPropagation(),V.current=!1},E=(K)=>{let{domNode:X}=w.getState();if(p.current=X?.getBoundingClientRect(),!p.current)return;let I=K.target===W.current;if(!I&&!!K.target.closest(".nokey")||!l||!(t&&I||u)||K.button!==0||!K.isPrimary)return;K.target?.setPointerCapture?.(K.pointerId),V.current=!1;let{x:yl,y:h}=Sf(K.nativeEvent,p.current);if(w.setState({userSelectionRect:{width:0,height:0,startX:yl,startY:h,x:yl,y:h}}),!I)K.stopPropagation(),K.preventDefault()},D=(K)=>{let{userSelectionRect:X,transform:I,nodeLookup:o,edgeLookup:fl,connectionLookup:yl,triggerNodeChanges:h,triggerEdgeChanges:s,defaultEdgeOptions:ul,resetSelectedElements:tl}=w.getState();if(!p.current||!X)return;let{x:Al,y:Kl}=Sf(K.nativeEvent,p.current),{startX:wl,startY:El}=X;if(!V.current){let g=u?0:n;if(Math.hypot(Al-wl,Kl-El)<=g)return;tl(),i?.(K)}V.current=!0;let M={startX:wl,startY:El,x:Alg.id)),Z.current=new Set;let k=ul?.selectable??!0;for(let g of O.current){let cl=yl.get(g);if(!cl)continue;for(let{edgeId:pl}of cl.values()){let Hl=fl.get(pl);if(Hl&&(Hl.selectable??k))Z.current.add(pl)}}if(!_F(d,O.current)){let g=Cy(o,O.current,!0);h(g)}if(!_F(nl,Z.current)){let g=Cy(fl,Z.current);s(g)}w.setState({userSelectionRect:M,userSelectionActive:!0,nodesSelectionActive:!1})},Y=(K)=>{if(K.button!==0)return;if(K.target?.releasePointerCapture?.(K.pointerId),!G&&K.target===W.current&&w.getState().userSelectionRect)P?.(K);if(w.setState({userSelectionActive:!1,userSelectionRect:null}),V.current)y?.(K),w.setState({nodesSelectionActive:O.current.size>0})},v=f===!0||Array.isArray(f)&&f.includes(0);return il.jsxs("div",{className:bu(["react-flow__pane",{draggable:v,dragging:Q,selection:l}]),onClick:q?void 0:WF(P,W),onContextMenu:WF(H,W),onWheel:WF(B,W),onPointerEnter:q?void 0:F,onPointerMove:q?D:j,onPointerUp:q?Y:void 0,onPointerDownCapture:q?E:void 0,onClickCapture:q?C:void 0,onPointerLeave:N,ref:W,style:f8,children:[U,il.jsx(kV,{})]})}function EF({id:l,store:u,unselect:r=!1,nodeRef:f}){let{addSelectedNodes:n,unselectNodesAndEdges:t,multiSelectionActive:i,nodeLookup:y,onError:c}=u.getState(),_=y.get(l);if(!_){c?.("012",mf.error012(l));return}if(u.setState({nodesSelectionActive:!1}),!_.selected)n([l]);else if(r||_.selected&&i)t({nodes:[_],edges:[]}),requestAnimationFrame(()=>f?.current?.blur())}function rL({nodeRef:l,disabled:u=!1,noDragClassName:r,handleSelector:f,nodeId:n,isSelectable:t,nodeClickDistance:i}){let y=Vu(),[c,_]=_l.useState(!1),A=_l.useRef();return _l.useEffect(()=>{A.current=uq({getStoreItems:()=>y.getState(),onNodeMouseDown:(F)=>{EF({id:F,store:y,nodeRef:l})},onDragStart:()=>{_(!0)},onDragStop:()=>{_(!1)}})},[]),_l.useEffect(()=>{if(u||!l.current||!A.current)return;return A.current.update({noDragClassName:r,handleSelector:f,domNode:l.current,isSelectable:t,nodeId:n,nodeClickDistance:i}),()=>{A.current?.destroy()}},[r,f,u,t,l,n,i]),c}var oV=(l)=>(u)=>u.selected&&(u.draggable||l&&typeof u.draggable>"u");function fL(){let l=Vu();return _l.useCallback((r)=>{let{nodeExtent:f,snapToGrid:n,snapGrid:t,nodesDraggable:i,onError:y,updateNodePositions:c,nodeLookup:_,nodeOrigin:A}=l.getState(),F=new Map,j=oV(i),N=n?t[0]:5,U=n?t[1]:5,w=r.direction.x*N*r.factor,G=r.direction.y*U*r.factor;for(let[,J]of _){if(!j(J))continue;let Q={x:J.internals.positionAbsolute.x+w,y:J.internals.positionAbsolute.y+G};if(n)Q=Sy(Q,t);let{position:m,positionAbsolute:q}=nF({nodeId:J.id,nextPosition:Q,nodeLookup:_,nodeExtent:f,nodeOrigin:A,onError:y});J.position=m,J.internals.positionAbsolute=q,F.set(J.id,J)}c(F)},[])}var zF=_l.createContext(null),dV=zF.Provider;zF.Consumer;var nL=()=>{return _l.useContext(zF)},eV=(l)=>({connectOnClick:l.connectOnClick,noPanClassName:l.noPanClassName,rfId:l.rfId}),lS=(l,u,r)=>(f)=>{let{connectionClickStartHandle:n,connectionMode:t,connection:i}=f,{fromHandle:y,toHandle:c,isValid:_}=i,A=c?.nodeId===l&&c?.id===u&&c?.type===r;return{connectingFrom:y?.nodeId===l&&y?.id===u&&y?.type===r,connectingTo:A,clickConnecting:n?.nodeId===l&&n?.id===u&&n?.type===r,isPossibleEndHandle:t===ui.Strict?y?.type!==r:l!==y?.nodeId||u!==y?.id,connectionInProcess:!!y,clickConnectionInProcess:!!n,valid:A&&_}};function uS({type:l="source",position:u=Ol.Top,isValidConnection:r,isConnectable:f=!0,isConnectableStart:n=!0,isConnectableEnd:t=!0,id:i,onConnect:y,children:c,className:_,onMouseDown:A,onTouchStart:F,...j},N){let U=i||null,w=l==="target",G=Vu(),J=nL(),{connectOnClick:Q,noPanClassName:m,rfId:q}=$u(eV,zu),{connectingFrom:W,connectingTo:p,clickConnecting:O,isPossibleEndHandle:Z,connectionInProcess:V,clickConnectionInProcess:P,valid:H}=$u(lS(J,U,l),zu);if(!J)G.getState().onError?.("010",mf.error010());let B=(D)=>{let{defaultEdgeOptions:Y,onConnect:v,hasDefaultEdges:K}=G.getState(),X={...Y,...D};if(K){let{edges:I,setEdges:o}=G.getState();o(JF(X,I))}v?.(X),y?.(X)},C=(D)=>{if(!J)return;let Y=jF(D.nativeEvent);if(n&&(Y&&D.button===0||!Y)){let v=G.getState();IA.onPointerDown(D.nativeEvent,{handleDomNode:D.currentTarget,autoPanOnConnect:v.autoPanOnConnect,connectionMode:v.connectionMode,connectionRadius:v.connectionRadius,domNode:v.domNode,nodeLookup:v.nodeLookup,lib:v.lib,isTarget:w,handleId:U,nodeId:J,flowId:v.rfId,panBy:v.panBy,cancelConnection:v.cancelConnection,onConnectStart:v.onConnectStart,onConnectEnd:(...K)=>G.getState().onConnectEnd?.(...K),updateConnection:v.updateConnection,onConnect:B,isValidConnection:r||((...K)=>G.getState().isValidConnection?.(...K)??!0),getTransform:()=>G.getState().transform,getFromHandle:()=>G.getState().connection.fromHandle,autoPanSpeed:v.autoPanSpeed,dragThreshold:v.connectionDragThreshold})}if(Y)A?.(D);else F?.(D)},E=(D)=>{let{onClickConnectStart:Y,onClickConnectEnd:v,connectionClickStartHandle:K,connectionMode:X,isValidConnection:I,lib:o,rfId:fl,nodeLookup:yl,connection:h}=G.getState();if(!J||!K&&!n)return;if(!K){Y?.(D.nativeEvent,{nodeId:J,handleId:U,handleType:l}),G.setState({connectionClickStartHandle:{nodeId:J,type:l,id:U}});return}let s=AF(D.target),ul=r||I,{connection:tl,isValid:Al}=IA.isValid(D.nativeEvent,{handle:{nodeId:J,id:U,type:l},connectionMode:X,fromNodeId:K.nodeId,fromHandleId:K.id||null,fromType:K.type,isValidConnection:ul,flowId:fl,doc:s,lib:o,nodeLookup:yl});if(Al&&tl)B(tl);let Kl=structuredClone(h);delete Kl.inProgress,Kl.toPosition=Kl.toHandle?Kl.toHandle.position:null,v?.(D,Kl),G.setState({connectionClickStartHandle:null})};return il.jsx("div",{"data-handleid":U,"data-nodeid":J,"data-handlepos":u,"data-id":`${q}-${J}-${U}-${l}`,className:bu(["react-flow__handle",`react-flow__handle-${u}`,"nodrag",m,_,{source:!w,target:w,connectable:f,connectablestart:n,connectableend:t,clickconnecting:O,connectingfrom:W,connectingto:p,valid:H,connectionindicator:f&&(!V||Z)&&(V||P?t:n)}]),onMouseDown:C,onTouchStart:C,onClick:Q?E:void 0,ref:N,...j,children:c})}var c0=_l.memo(lL(uS));function rS({data:l,isConnectable:u,sourcePosition:r=Ol.Bottom}){return il.jsxs(il.Fragment,{children:[l?.label,il.jsx(c0,{type:"source",position:r,isConnectable:u})]})}function fS({data:l,isConnectable:u,targetPosition:r=Ol.Top,sourcePosition:f=Ol.Bottom}){return il.jsxs(il.Fragment,{children:[il.jsx(c0,{type:"target",position:r,isConnectable:u}),l?.label,il.jsx(c0,{type:"source",position:f,isConnectable:u})]})}function nS(){return null}function tS({data:l,isConnectable:u,targetPosition:r=Ol.Top}){return il.jsxs(il.Fragment,{children:[il.jsx(c0,{type:"target",position:r,isConnectable:u}),l?.label]})}var l8={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}},Pq={input:rS,default:fS,output:tS,group:nS};function iS(l){if(l.internals.handleBounds===void 0)return{width:l.width??l.initialWidth??l.style?.width,height:l.height??l.initialHeight??l.style?.height};return{width:l.width??l.style?.width,height:l.height??l.style?.height}}var yS=(l)=>{let{width:u,height:r,x:f,y:n}=Dy(l.nodeLookup,{filter:(t)=>!!t.selected});return{width:Vf(u)?u:null,height:Vf(r)?r:null,userSelectionActive:l.userSelectionActive,transformString:`translate(${l.transform[0]}px,${l.transform[1]}px) scale(${l.transform[2]}) translate(${f}px,${n}px)`}};function cS({onSelectionContextMenu:l,noPanClassName:u,disableKeyboardA11y:r}){let f=Vu(),{width:n,height:t,transformString:i,userSelectionActive:y}=$u(yS,zu),c=fL(),_=_l.useRef(null);_l.useEffect(()=>{if(!r)_.current?.focus({preventScroll:!0})},[r]);let A=!y&&n!==null&&t!==null;if(rL({nodeRef:_,disabled:!A}),!A)return null;let F=l?(N)=>{let U=f.getState().nodes.filter((w)=>w.selected);l(N,U)}:void 0,j=(N)=>{if(Object.prototype.hasOwnProperty.call(l8,N.key))N.preventDefault(),c({direction:l8[N.key],factor:N.shiftKey?4:1})};return il.jsx("div",{className:bu(["react-flow__nodesselection","react-flow__container",u]),style:{transform:i},children:il.jsx("div",{ref:_,className:"react-flow__nodesselection-rect",onContextMenu:F,tabIndex:r?void 0:-1,onKeyDown:r?void 0:j,style:{width:n,height:t}})})}var Cq=typeof window<"u"?window:void 0,$S=(l)=>{return{nodesSelectionActive:l.nodesSelectionActive,userSelectionActive:l.userSelectionActive}};function tL({children:l,onPaneClick:u,onPaneMouseEnter:r,onPaneMouseMove:f,onPaneMouseLeave:n,onPaneContextMenu:t,onPaneScroll:i,paneClickDistance:y,deleteKeyCode:c,selectionKeyCode:_,selectionOnDrag:A,selectionMode:F,onSelectionStart:j,onSelectionEnd:N,multiSelectionKeyCode:U,panActivationKeyCode:w,zoomActivationKeyCode:G,elementsSelectable:J,zoomOnScroll:Q,zoomOnPinch:m,panOnScroll:q,panOnScrollSpeed:W,panOnScrollMode:p,zoomOnDoubleClick:O,panOnDrag:Z,defaultViewport:V,translateExtent:P,minZoom:H,maxZoom:B,preventScrolling:C,onSelectionContextMenu:E,noWheelClassName:D,noPanClassName:Y,disableKeyboardA11y:v,onViewportChange:K,isControlledViewport:X}){let{nodesSelectionActive:I,userSelectionActive:o}=$u($S,zu),fl=c$(_,{target:Cq}),yl=c$(w,{target:Cq}),h=yl||Z,s=yl||q,ul=A&&h!==!0,tl=fl||o||ul;return RV({deleteKeyCode:c,multiSelectionKeyCode:U}),il.jsx(vV,{onPaneContextMenu:t,elementsSelectable:J,zoomOnScroll:Q,zoomOnPinch:m,panOnScroll:s,panOnScrollSpeed:W,panOnScrollMode:p,zoomOnDoubleClick:O,panOnDrag:!fl&&h,defaultViewport:V,translateExtent:P,minZoom:H,maxZoom:B,zoomActivationKeyCode:G,preventScrolling:C,noWheelClassName:D,noPanClassName:Y,onViewportChange:K,isControlledViewport:X,paneClickDistance:y,selectionOnDrag:ul,children:il.jsxs(aV,{onSelectionStart:j,onSelectionEnd:N,onPaneClick:u,onPaneMouseEnter:r,onPaneMouseMove:f,onPaneMouseLeave:n,onPaneContextMenu:t,onPaneScroll:i,panOnDrag:h,isSelecting:!!tl,selectionMode:F,selectionKeyPressed:fl,paneClickDistance:y,selectionOnDrag:ul,children:[l,I&&il.jsx(cS,{onSelectionContextMenu:E,noPanClassName:Y,disableKeyboardA11y:v})]})})}tL.displayName="FlowRenderer";var _S=_l.memo(tL),AS=(l)=>(u)=>{return l?CA(u.nodeLookup,{x:0,y:0,width:u.width,height:u.height},u.transform,!0).map((r)=>r.id):Array.from(u.nodeLookup.keys())};function FS(l){return $u(_l.useCallback(AS(l),[l]),zu)}var jS=(l)=>l.updateNodeInternals;function NS(){let l=$u(jS),[u]=_l.useState(()=>{if(typeof ResizeObserver>"u")return null;return new ResizeObserver((r)=>{let f=new Map;r.forEach((n)=>{let t=n.target.getAttribute("data-id");f.set(t,{id:t,nodeElement:n.target,force:!0})}),l(f)})});return _l.useEffect(()=>{return()=>{u?.disconnect()}},[u]),u}function JS({node:l,nodeType:u,hasDimensions:r,resizeObserver:f}){let n=Vu(),t=_l.useRef(null),i=_l.useRef(null),y=_l.useRef(l.sourcePosition),c=_l.useRef(l.targetPosition),_=_l.useRef(u),A=r&&!!l.internals.handleBounds;return _l.useEffect(()=>{if(t.current&&!l.hidden&&(!A||i.current!==t.current)){if(i.current)f?.unobserve(i.current);f?.observe(t.current),i.current=t.current}},[A,l.hidden]),_l.useEffect(()=>{return()=>{if(i.current)f?.unobserve(i.current),i.current=null}},[]),_l.useEffect(()=>{if(t.current){let F=_.current!==u,j=y.current!==l.sourcePosition,N=c.current!==l.targetPosition;if(F||j||N)_.current=u,y.current=l.sourcePosition,c.current=l.targetPosition,n.getState().updateNodeInternals(new Map([[l.id,{id:l.id,nodeElement:t.current,force:!0}]]))}},[l.id,u,l.sourcePosition,l.targetPosition]),t}function US({id:l,onClick:u,onMouseEnter:r,onMouseMove:f,onMouseLeave:n,onContextMenu:t,onDoubleClick:i,nodesDraggable:y,elementsSelectable:c,nodesConnectable:_,nodesFocusable:A,resizeObserver:F,noDragClassName:j,noPanClassName:N,disableKeyboardA11y:U,rfId:w,nodeTypes:G,nodeClickDistance:J,onError:Q}){let{node:m,internals:q,isParent:W}=$u((Al)=>{let Kl=Al.nodeLookup.get(l),wl=Al.parentLookup.has(l);return{node:Kl,internals:Kl.internals,isParent:wl}},zu),p=m.type||"default",O=G?.[p]||Pq[p];if(O===void 0)Q?.("003",mf.error003(p)),p="default",O=G?.default||Pq.default;let Z=!!(m.draggable||y&&typeof m.draggable>"u"),V=!!(m.selectable||c&&typeof m.selectable>"u"),P=!!(m.connectable||_&&typeof m.connectable>"u"),H=!!(m.focusable||A&&typeof m.focusable>"u"),B=Vu(),C=cF(m),E=JS({node:m,nodeType:p,hasDimensions:C,resizeObserver:F}),D=rL({nodeRef:E,disabled:m.hidden||!Z,noDragClassName:j,handleSelector:m.dragHandle,nodeId:l,isSelectable:V,nodeClickDistance:J}),Y=fL();if(m.hidden)return null;let v=zn(m),K=iS(m),X=V||Z||u||r||f||n,I=r?(Al)=>r(Al,{...q.userNode}):void 0,o=f?(Al)=>f(Al,{...q.userNode}):void 0,fl=n?(Al)=>n(Al,{...q.userNode}):void 0,yl=t?(Al)=>t(Al,{...q.userNode}):void 0,h=i?(Al)=>i(Al,{...q.userNode}):void 0,s=(Al)=>{let{selectNodesOnDrag:Kl,nodeDragThreshold:wl}=B.getState();if(V&&(!Kl||!Z||wl>0))EF({id:l,store:B,nodeRef:E});if(u)u(Al,{...q.userNode})},ul=(Al)=>{if(FF(Al.nativeEvent)||U)return;if(o9.includes(Al.key)&&V){let Kl=Al.key==="Escape";EF({id:l,store:B,unselect:Kl,nodeRef:E})}else if(Z&&m.selected&&Object.prototype.hasOwnProperty.call(l8,Al.key)){Al.preventDefault();let{ariaLabelConfig:Kl}=B.getState();B.setState({ariaLiveMessage:Kl["node.a11yDescription.ariaLiveMessage"]({direction:Al.key.replace("Arrow","").toLowerCase(),x:~~q.positionAbsolute.x,y:~~q.positionAbsolute.y})}),Y({direction:l8[Al.key],factor:Al.shiftKey?4:1})}},tl=()=>{if(U||!E.current?.matches(":focus-visible"))return;let{transform:Al,width:Kl,height:wl,autoPanOnNodeFocus:El,setCenter:M}=B.getState();if(!El)return;if(!(CA(new Map([[l,m]]),{x:0,y:0,width:Kl,height:wl},Al,!0).length>0))M(m.position.x+v.width/2,m.position.y+v.height/2,{zoom:Al[2]})};return il.jsx("div",{className:bu(["react-flow__node",`react-flow__node-${p}`,{[N]:Z},m.className,{selected:m.selected,selectable:V,parent:W,draggable:Z,dragging:D}]),ref:E,style:{zIndex:q.z,transform:`translate(${q.positionAbsolute.x}px,${q.positionAbsolute.y}px)`,pointerEvents:X?"all":"none",visibility:C?"visible":"hidden",...m.style,...K},"data-id":l,"data-testid":`rf__node-${l}`,onMouseEnter:I,onMouseMove:o,onMouseLeave:fl,onContextMenu:yl,onClick:s,onDoubleClick:h,onKeyDown:H?ul:void 0,tabIndex:H?0:void 0,onFocus:H?tl:void 0,role:m.ariaRole??(H?"group":void 0),"aria-roledescription":"node","aria-describedby":U?void 0:`${aq}-${w}`,"aria-label":m.ariaLabel,...m.domAttributes,children:il.jsx(dV,{value:l,children:il.jsx(O,{id:l,data:m.data,type:p,positionAbsoluteX:q.positionAbsolute.x,positionAbsoluteY:q.positionAbsolute.y,selected:m.selected??!1,selectable:V,draggable:Z,deletable:m.deletable??!0,isConnectable:P,sourcePosition:m.sourcePosition,targetPosition:m.targetPosition,dragging:D,dragHandle:m.dragHandle,zIndex:q.z,parentId:m.parentId,...v})})})}var QS=_l.memo(US),mS=(l)=>({nodesDraggable:l.nodesDraggable,nodesConnectable:l.nodesConnectable,nodesFocusable:l.nodesFocusable,elementsSelectable:l.elementsSelectable,onError:l.onError});function iL(l){let{nodesDraggable:u,nodesConnectable:r,nodesFocusable:f,elementsSelectable:n,onError:t}=$u(mS,zu),i=FS(l.onlyRenderVisibleElements),y=NS();return il.jsx("div",{className:"react-flow__nodes",style:f8,children:i.map((c)=>{return il.jsx(QS,{id:c,nodeTypes:l.nodeTypes,nodeExtent:l.nodeExtent,onClick:l.onNodeClick,onMouseEnter:l.onNodeMouseEnter,onMouseMove:l.onNodeMouseMove,onMouseLeave:l.onNodeMouseLeave,onContextMenu:l.onNodeContextMenu,onDoubleClick:l.onNodeDoubleClick,noDragClassName:l.noDragClassName,noPanClassName:l.noPanClassName,rfId:l.rfId,disableKeyboardA11y:l.disableKeyboardA11y,resizeObserver:y,nodesDraggable:u,nodesConnectable:r,nodesFocusable:f,elementsSelectable:n,nodeClickDistance:l.nodeClickDistance,onError:t},c)})})}iL.displayName="NodeRenderer";var wS=_l.memo(iL);function qS(l){return $u(_l.useCallback((r)=>{if(!l)return r.edges.map((n)=>n.id);let f=[];if(r.width&&r.height)for(let n of r.edges){let t=r.nodeLookup.get(n.source),i=r.nodeLookup.get(n.target);if(t&&i&&vw({sourceNode:t,targetNode:i,width:r.width,height:r.height,transform:r.transform}))f.push(n.id)}return f},[l]),zu)}var LS=({color:l="none",strokeWidth:u=1})=>{let r={strokeWidth:u,...l&&{stroke:l}};return il.jsx("polyline",{className:"arrow",style:r,strokeLinecap:"round",fill:"none",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4"})},GS=({color:l="none",strokeWidth:u=1})=>{let r={strokeWidth:u,...l&&{stroke:l,fill:l}};return il.jsx("polyline",{className:"arrowclosed",style:r,strokeLinecap:"round",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4 -5,-4"})},hq={[ri.Arrow]:LS,[ri.ArrowClosed]:GS};function WS(l){let u=Vu();return _l.useMemo(()=>{if(!Object.prototype.hasOwnProperty.call(hq,l))return u.getState().onError?.("009",mf.error009(l)),null;return hq[l]},[l])}var TS=({id:l,type:u,color:r,width:f=12.5,height:n=12.5,markerUnits:t="strokeWidth",strokeWidth:i,orient:y="auto-start-reverse"})=>{let c=WS(u);if(!c)return null;return il.jsx("marker",{className:"react-flow__arrowhead",id:l,markerWidth:`${f}`,markerHeight:`${n}`,viewBox:"-10 -10 20 20",markerUnits:t,orient:y,refX:"0",refY:"0",children:il.jsx(c,{color:r,strokeWidth:i})})},yL=({defaultColor:l,rfId:u})=>{let r=$u((t)=>t.edges),f=$u((t)=>t.defaultEdgeOptions),n=_l.useMemo(()=>{return kw(r,{id:u,defaultColor:l,defaultMarkerStart:f?.markerStart,defaultMarkerEnd:f?.markerEnd})},[r,f,u,l]);if(!n.length)return null;return il.jsx("svg",{className:"react-flow__marker","aria-hidden":"true",children:il.jsx("defs",{children:n.map((t)=>il.jsx(TS,{id:t.id,type:t.type,color:t.color,width:t.width,height:t.height,markerUnits:t.markerUnits,strokeWidth:t.strokeWidth,orient:t.orient},t.id))})})};yL.displayName="MarkerDefinitions";var KS=_l.memo(yL);function cL({x:l,y:u,label:r,labelStyle:f,labelShowBg:n=!0,labelBgStyle:t,labelBgPadding:i=[2,4],labelBgBorderRadius:y=2,children:c,className:_,...A}){let[F,j]=_l.useState({x:1,y:0,width:0,height:0}),N=bu(["react-flow__edge-textwrapper",_]),U=_l.useRef(null);if(_l.useEffect(()=>{if(U.current){let w=U.current.getBBox();j({x:w.x,y:w.y,width:w.width,height:w.height})}},[r]),!r)return null;return il.jsxs("g",{transform:`translate(${l-F.width/2} ${u-F.height/2})`,className:N,visibility:F.width?"visible":"hidden",...A,children:[n&&il.jsx("rect",{width:F.width+2*i[0],x:-i[0],y:-i[1],height:F.height+2*i[1],className:"react-flow__edge-textbg",style:t,rx:y,ry:y}),il.jsx("text",{className:"react-flow__edge-text",y:F.height/2,dy:"0.3em",ref:U,style:f,children:r}),c]})}cL.displayName="EdgeText";var ES=_l.memo(cL);function hy({path:l,labelX:u,labelY:r,label:f,labelStyle:n,labelShowBg:t,labelBgStyle:i,labelBgPadding:y,labelBgBorderRadius:c,interactionWidth:_=20,...A}){return il.jsxs(il.Fragment,{children:[il.jsx("path",{...A,d:l,fill:"none",className:bu(["react-flow__edge-path",A.className])}),_?il.jsx("path",{d:l,fill:"none",strokeOpacity:0,strokeWidth:_,className:"react-flow__edge-interaction"}):null,f&&Vf(u)&&Vf(r)?il.jsx(ES,{x:u,y:r,label:f,labelStyle:n,labelShowBg:t,labelBgStyle:i,labelBgPadding:y,labelBgBorderRadius:c}):null]})}function Mq({pos:l,x1:u,y1:r,x2:f,y2:n}){if(l===Ol.Left||l===Ol.Right)return[0.5*(u+f),r];return[u,0.5*(r+n)]}function $L({sourceX:l,sourceY:u,sourcePosition:r=Ol.Bottom,targetX:f,targetY:n,targetPosition:t=Ol.Top}){let[i,y]=Mq({pos:r,x1:l,y1:u,x2:f,y2:n}),[c,_]=Mq({pos:t,x1:f,y1:n,x2:l,y2:u}),[A,F,j,N]=RA({sourceX:l,sourceY:u,targetX:f,targetY:n,sourceControlX:i,sourceControlY:y,targetControlX:c,targetControlY:_});return[`M${l},${u} C${i},${y} ${c},${_} ${f},${n}`,A,F,j,N]}function _L(l){return _l.memo(({id:u,sourceX:r,sourceY:f,targetX:n,targetY:t,sourcePosition:i,targetPosition:y,label:c,labelStyle:_,labelShowBg:A,labelBgStyle:F,labelBgPadding:j,labelBgBorderRadius:N,style:U,markerEnd:w,markerStart:G,interactionWidth:J})=>{let[Q,m,q]=$L({sourceX:r,sourceY:f,sourcePosition:i,targetX:n,targetY:t,targetPosition:y}),W=l.isInternal?void 0:u;return il.jsx(hy,{id:W,path:Q,labelX:m,labelY:q,label:c,labelStyle:_,labelShowBg:A,labelBgStyle:F,labelBgPadding:j,labelBgBorderRadius:N,style:U,markerEnd:w,markerStart:G,interactionWidth:J})})}var pS=_L({isInternal:!1}),AL=_L({isInternal:!0});pS.displayName="SimpleBezierEdge";AL.displayName="SimpleBezierEdgeInternal";function FL(l){return _l.memo(({id:u,sourceX:r,sourceY:f,targetX:n,targetY:t,label:i,labelStyle:y,labelShowBg:c,labelBgStyle:_,labelBgPadding:A,labelBgBorderRadius:F,style:j,sourcePosition:N=Ol.Bottom,targetPosition:U=Ol.Top,markerEnd:w,markerStart:G,pathOptions:J,interactionWidth:Q})=>{let[m,q,W]=y$({sourceX:r,sourceY:f,sourcePosition:N,targetX:n,targetY:t,targetPosition:U,borderRadius:J?.borderRadius,offset:J?.offset,stepPosition:J?.stepPosition}),p=l.isInternal?void 0:u;return il.jsx(hy,{id:p,path:m,labelX:q,labelY:W,label:i,labelStyle:y,labelShowBg:c,labelBgStyle:_,labelBgPadding:A,labelBgBorderRadius:F,style:j,markerEnd:w,markerStart:G,interactionWidth:Q})})}var jL=FL({isInternal:!1}),NL=FL({isInternal:!0});jL.displayName="SmoothStepEdge";NL.displayName="SmoothStepEdgeInternal";function JL(l){return _l.memo(({id:u,...r})=>{let f=l.isInternal?void 0:u;return il.jsx(jL,{...r,id:f,pathOptions:_l.useMemo(()=>({borderRadius:0,offset:r.pathOptions?.offset}),[r.pathOptions?.offset])})})}var zS=JL({isInternal:!1}),UL=JL({isInternal:!0});zS.displayName="StepEdge";UL.displayName="StepEdgeInternal";function QL(l){return _l.memo(({id:u,sourceX:r,sourceY:f,targetX:n,targetY:t,label:i,labelStyle:y,labelShowBg:c,labelBgStyle:_,labelBgPadding:A,labelBgBorderRadius:F,style:j,markerEnd:N,markerStart:U,interactionWidth:w})=>{let[G,J,Q]=bA({sourceX:r,sourceY:f,targetX:n,targetY:t}),m=l.isInternal?void 0:u;return il.jsx(hy,{id:m,path:G,labelX:J,labelY:Q,label:i,labelStyle:y,labelShowBg:c,labelBgStyle:_,labelBgPadding:A,labelBgBorderRadius:F,style:j,markerEnd:N,markerStart:U,interactionWidth:w})})}var OS=QL({isInternal:!1}),mL=QL({isInternal:!0});OS.displayName="StraightEdge";mL.displayName="StraightEdgeInternal";function wL(l){return _l.memo(({id:u,sourceX:r,sourceY:f,targetX:n,targetY:t,sourcePosition:i=Ol.Bottom,targetPosition:y=Ol.Top,label:c,labelStyle:_,labelShowBg:A,labelBgStyle:F,labelBgPadding:j,labelBgBorderRadius:N,style:U,markerEnd:w,markerStart:G,pathOptions:J,interactionWidth:Q})=>{let[m,q,W]=xA({sourceX:r,sourceY:f,sourcePosition:i,targetX:n,targetY:t,targetPosition:y,curvature:J?.curvature}),p=l.isInternal?void 0:u;return il.jsx(hy,{id:p,path:m,labelX:q,labelY:W,label:c,labelStyle:_,labelShowBg:A,labelBgStyle:F,labelBgPadding:j,labelBgBorderRadius:N,style:U,markerEnd:w,markerStart:G,interactionWidth:Q})})}var ZS=wL({isInternal:!1}),qL=wL({isInternal:!0});ZS.displayName="BezierEdge";qL.displayName="BezierEdgeInternal";var sq={default:qL,straight:mL,step:UL,smoothstep:NL,simplebezier:AL},Rq={sourceX:null,sourceY:null,targetX:null,targetY:null,sourcePosition:null,targetPosition:null},HS=(l,u,r)=>{if(r===Ol.Left)return l-u;if(r===Ol.Right)return l+u;return l},BS=(l,u,r)=>{if(r===Ol.Top)return l-u;if(r===Ol.Bottom)return l+u;return l},xq="react-flow__edgeupdater";function bq({position:l,centerX:u,centerY:r,radius:f=10,onMouseDown:n,onMouseEnter:t,onMouseOut:i,type:y}){return il.jsx("circle",{onMouseDown:n,onMouseEnter:t,onMouseOut:i,className:bu([xq,`${xq}-${y}`]),cx:HS(u,f,l),cy:BS(r,f,l),r:f,stroke:"transparent",fill:"transparent"})}function DS({isReconnectable:l,reconnectRadius:u,edge:r,sourceX:f,sourceY:n,targetX:t,targetY:i,sourcePosition:y,targetPosition:c,onReconnect:_,onReconnectStart:A,onReconnectEnd:F,setReconnecting:j,setUpdateHover:N}){let U=Vu(),w=(q,W)=>{if(q.button!==0)return;let{autoPanOnConnect:p,domNode:O,connectionMode:Z,connectionRadius:V,lib:P,onConnectStart:H,cancelConnection:B,nodeLookup:C,rfId:E,panBy:D,updateConnection:Y}=U.getState(),v=W.type==="target",K=(o,fl)=>{j(!1),F?.(o,r,W.type,fl)},X=(o)=>_?.(r,o),I=(o,fl)=>{j(!0),A?.(q,r,W.type),H?.(o,fl)};IA.onPointerDown(q.nativeEvent,{autoPanOnConnect:p,connectionMode:Z,connectionRadius:V,domNode:O,handleId:W.id,nodeId:W.nodeId,nodeLookup:C,isTarget:v,edgeUpdaterType:W.type,lib:P,flowId:E,cancelConnection:B,panBy:D,isValidConnection:(...o)=>U.getState().isValidConnection?.(...o)??!0,onConnect:X,onConnectStart:I,onConnectEnd:(...o)=>U.getState().onConnectEnd?.(...o),onReconnectEnd:K,updateConnection:Y,getTransform:()=>U.getState().transform,getFromHandle:()=>U.getState().connection.fromHandle,dragThreshold:U.getState().connectionDragThreshold,handleDomNode:q.currentTarget})},G=(q)=>w(q,{nodeId:r.target,id:r.targetHandle??null,type:"target"}),J=(q)=>w(q,{nodeId:r.source,id:r.sourceHandle??null,type:"source"}),Q=()=>N(!0),m=()=>N(!1);return il.jsxs(il.Fragment,{children:[(l===!0||l==="source")&&il.jsx(bq,{position:y,centerX:f,centerY:n,radius:u,onMouseDown:G,onMouseEnter:Q,onMouseOut:m,type:"source"}),(l===!0||l==="target")&&il.jsx(bq,{position:c,centerX:t,centerY:i,radius:u,onMouseDown:J,onMouseEnter:Q,onMouseOut:m,type:"target"})]})}function VS({id:l,edgesFocusable:u,edgesReconnectable:r,elementsSelectable:f,onClick:n,onDoubleClick:t,onContextMenu:i,onMouseEnter:y,onMouseMove:c,onMouseLeave:_,reconnectRadius:A,onReconnect:F,onReconnectStart:j,onReconnectEnd:N,rfId:U,edgeTypes:w,noPanClassName:G,onError:J,disableKeyboardA11y:Q}){let m=$u((M)=>M.edgeLookup.get(l)),q=$u((M)=>M.defaultEdgeOptions);m=q?{...q,...m}:m;let W=m.type||"default",p=w?.[W]||sq[W];if(p===void 0)J?.("011",mf.error011(W)),W="default",p=w?.default||sq.default;let O=!!(m.focusable||u&&typeof m.focusable>"u"),Z=typeof F<"u"&&(m.reconnectable||r&&typeof m.reconnectable>"u"),V=!!(m.selectable||f&&typeof m.selectable>"u"),P=_l.useRef(null),[H,B]=_l.useState(!1),[C,E]=_l.useState(!1),D=Vu(),{zIndex:Y,sourceX:v,sourceY:K,targetX:X,targetY:I,sourcePosition:o,targetPosition:fl}=$u(_l.useCallback((M)=>{let d=M.nodeLookup.get(m.source),nl=M.nodeLookup.get(m.target);if(!d||!nl)return{zIndex:m.zIndex,...Rq};let k=gw({id:l,sourceNode:d,targetNode:nl,sourceHandle:m.sourceHandle||null,targetHandle:m.targetHandle||null,connectionMode:M.connectionMode,onError:J});return{zIndex:bw({selected:m.selected,zIndex:m.zIndex,sourceNode:d,targetNode:nl,elevateOnSelect:M.elevateEdgesOnSelect,zIndexMode:M.zIndexMode}),...k||Rq}},[m.source,m.target,m.sourceHandle,m.targetHandle,m.selected,m.zIndex]),zu),yl=_l.useMemo(()=>m.markerStart?`url('#${vA(m.markerStart,U)}')`:void 0,[m.markerStart,U]),h=_l.useMemo(()=>m.markerEnd?`url('#${vA(m.markerEnd,U)}')`:void 0,[m.markerEnd,U]);if(m.hidden||v===null||K===null||X===null||I===null)return null;let s=(M)=>{let{addSelectedEdges:d,unselectNodesAndEdges:nl,multiSelectionActive:k}=D.getState();if(V)if(D.setState({nodesSelectionActive:!1}),m.selected&&k)nl({nodes:[],edges:[m]}),P.current?.blur();else d([l]);if(n)n(M,m)},ul=t?(M)=>{t(M,{...m})}:void 0,tl=i?(M)=>{i(M,{...m})}:void 0,Al=y?(M)=>{y(M,{...m})}:void 0,Kl=c?(M)=>{c(M,{...m})}:void 0,wl=_?(M)=>{_(M,{...m})}:void 0,El=(M)=>{if(!Q&&o9.includes(M.key)&&V){let{unselectNodesAndEdges:d,addSelectedEdges:nl}=D.getState();if(M.key==="Escape")P.current?.blur(),d({edges:[m]});else nl([l])}};return il.jsx("svg",{style:{zIndex:Y},children:il.jsxs("g",{className:bu(["react-flow__edge",`react-flow__edge-${W}`,m.className,G,{selected:m.selected,animated:m.animated,inactive:!V&&!n,updating:H,selectable:V}]),onClick:s,onDoubleClick:ul,onContextMenu:tl,onMouseEnter:Al,onMouseMove:Kl,onMouseLeave:wl,onKeyDown:O?El:void 0,tabIndex:O?0:void 0,role:m.ariaRole??(O?"group":"img"),"aria-roledescription":"edge","data-id":l,"data-testid":`rf__edge-${l}`,"aria-label":m.ariaLabel===null?void 0:m.ariaLabel||`Edge from ${m.source} to ${m.target}`,"aria-describedby":O?`${oq}-${U}`:void 0,ref:P,...m.domAttributes,children:[!C&&il.jsx(p,{id:l,source:m.source,target:m.target,type:m.type,selected:m.selected,animated:m.animated,selectable:V,deletable:m.deletable??!0,label:m.label,labelStyle:m.labelStyle,labelShowBg:m.labelShowBg,labelBgStyle:m.labelBgStyle,labelBgPadding:m.labelBgPadding,labelBgBorderRadius:m.labelBgBorderRadius,sourceX:v,sourceY:K,targetX:X,targetY:I,sourcePosition:o,targetPosition:fl,data:m.data,style:m.style,sourceHandleId:m.sourceHandle,targetHandleId:m.targetHandle,markerStart:yl,markerEnd:h,pathOptions:"pathOptions"in m?m.pathOptions:void 0,interactionWidth:m.interactionWidth}),Z&&il.jsx(DS,{edge:m,isReconnectable:Z,reconnectRadius:A,onReconnect:F,onReconnectStart:j,onReconnectEnd:N,sourceX:v,sourceY:K,targetX:X,targetY:I,sourcePosition:o,targetPosition:fl,setUpdateHover:B,setReconnecting:E})]})})}var SS=_l.memo(VS),YS=(l)=>({edgesFocusable:l.edgesFocusable,edgesReconnectable:l.edgesReconnectable,elementsSelectable:l.elementsSelectable,connectionMode:l.connectionMode,onError:l.onError});function LL({defaultMarkerColor:l,onlyRenderVisibleElements:u,rfId:r,edgeTypes:f,noPanClassName:n,onReconnect:t,onEdgeContextMenu:i,onEdgeMouseEnter:y,onEdgeMouseMove:c,onEdgeMouseLeave:_,onEdgeClick:A,reconnectRadius:F,onEdgeDoubleClick:j,onReconnectStart:N,onReconnectEnd:U,disableKeyboardA11y:w}){let{edgesFocusable:G,edgesReconnectable:J,elementsSelectable:Q,onError:m}=$u(YS,zu),q=qS(u);return il.jsxs("div",{className:"react-flow__edges",children:[il.jsx(KS,{defaultColor:l,rfId:r}),q.map((W)=>{return il.jsx(SS,{id:W,edgesFocusable:G,edgesReconnectable:J,elementsSelectable:Q,noPanClassName:n,onReconnect:t,onContextMenu:i,onMouseEnter:y,onMouseMove:c,onMouseLeave:_,onClick:A,reconnectRadius:F,onDoubleClick:j,onReconnectStart:N,onReconnectEnd:U,rfId:r,onError:m,edgeTypes:f,disableKeyboardA11y:w},W)})]})}LL.displayName="EdgeRenderer";var XS=_l.memo(LL),PS=(l)=>`translate(${l.transform[0]}px,${l.transform[1]}px) scale(${l.transform[2]})`;function CS({children:l}){let u=$u(PS);return il.jsx("div",{className:"react-flow__viewport xyflow__viewport react-flow__container",style:{transform:u},children:l})}function hS(l){let u=pF(),r=_l.useRef(!1);_l.useEffect(()=>{if(!r.current&&u.viewportInitialized&&l)setTimeout(()=>l(u),1),r.current=!0},[l,u.viewportInitialized])}var MS=(l)=>l.panZoom?.syncViewport;function sS(l){let u=$u(MS),r=Vu();return _l.useEffect(()=>{if(l)u?.(l),r.setState({transform:[l.x,l.y,l.zoom]})},[l,u]),null}function vq(l){return l.connection.inProgress?{...l.connection,to:Yy(l.connection.to,l.transform)}:{...l.connection}}function RS(l){if(l)return(r)=>{let f=vq(r);return l(f)};return vq}function xS(l){let u=RS(l);return $u(u,zu)}var bS=(l)=>({nodesConnectable:l.nodesConnectable,isValid:l.connection.isValid,inProgress:l.connection.inProgress,width:l.width,height:l.height});function vS({containerStyle:l,style:u,type:r,component:f}){let{nodesConnectable:n,width:t,height:i,isValid:y,inProgress:c}=$u(bS,zu);if(!(t&&n&&c))return null;return il.jsx("svg",{style:l,width:t,height:i,className:"react-flow__connectionline react-flow__container",children:il.jsx("g",{className:bu(["react-flow__connection",lF(y)]),children:il.jsx(GL,{style:u,type:r,CustomComponent:f,isValid:y})})})}var GL=({style:l,type:u=pn.Bezier,CustomComponent:r,isValid:f})=>{let{inProgress:n,from:t,fromNode:i,fromHandle:y,fromPosition:c,to:_,toNode:A,toHandle:F,toPosition:j,pointer:N}=xS();if(!n)return;if(r)return il.jsx(r,{connectionLineType:u,connectionLineStyle:l,fromNode:i,fromHandle:y,fromX:t.x,fromY:t.y,toX:_.x,toY:_.y,fromPosition:c,toPosition:j,connectionStatus:lF(f),toNode:A,toHandle:F,pointer:N});let U="",w={sourceX:t.x,sourceY:t.y,sourcePosition:c,targetX:_.x,targetY:_.y,targetPosition:j};switch(u){case pn.Bezier:[U]=xA(w);break;case pn.SimpleBezier:[U]=$L(w);break;case pn.Step:[U]=y$({...w,borderRadius:0});break;case pn.SmoothStep:[U]=y$(w);break;default:[U]=bA(w)}return il.jsx("path",{d:U,fill:"none",className:"react-flow__connection-path",style:l})};GL.displayName="ConnectionLine";var gS={};function gq(l=gS){let u=_l.useRef(l),r=Vu();_l.useEffect(()=>{},[l])}function kS(){let l=Vu(),u=_l.useRef(!1);_l.useEffect(()=>{},[])}function WL({nodeTypes:l,edgeTypes:u,onInit:r,onNodeClick:f,onEdgeClick:n,onNodeDoubleClick:t,onEdgeDoubleClick:i,onNodeMouseEnter:y,onNodeMouseMove:c,onNodeMouseLeave:_,onNodeContextMenu:A,onSelectionContextMenu:F,onSelectionStart:j,onSelectionEnd:N,connectionLineType:U,connectionLineStyle:w,connectionLineComponent:G,connectionLineContainerStyle:J,selectionKeyCode:Q,selectionOnDrag:m,selectionMode:q,multiSelectionKeyCode:W,panActivationKeyCode:p,zoomActivationKeyCode:O,deleteKeyCode:Z,onlyRenderVisibleElements:V,elementsSelectable:P,defaultViewport:H,translateExtent:B,minZoom:C,maxZoom:E,preventScrolling:D,defaultMarkerColor:Y,zoomOnScroll:v,zoomOnPinch:K,panOnScroll:X,panOnScrollSpeed:I,panOnScrollMode:o,zoomOnDoubleClick:fl,panOnDrag:yl,onPaneClick:h,onPaneMouseEnter:s,onPaneMouseMove:ul,onPaneMouseLeave:tl,onPaneScroll:Al,onPaneContextMenu:Kl,paneClickDistance:wl,nodeClickDistance:El,onEdgeContextMenu:M,onEdgeMouseEnter:d,onEdgeMouseMove:nl,onEdgeMouseLeave:k,reconnectRadius:g,onReconnect:cl,onReconnectStart:pl,onReconnectEnd:Hl,noDragClassName:bl,noWheelClassName:_u,noPanClassName:tu,disableKeyboardA11y:Nu,nodeExtent:gl,rfId:zr,viewport:nf,onViewportChange:lr}){return gq(l),gq(u),kS(),hS(r),sS(nf),il.jsx(_S,{onPaneClick:h,onPaneMouseEnter:s,onPaneMouseMove:ul,onPaneMouseLeave:tl,onPaneContextMenu:Kl,onPaneScroll:Al,paneClickDistance:wl,deleteKeyCode:Z,selectionKeyCode:Q,selectionOnDrag:m,selectionMode:q,onSelectionStart:j,onSelectionEnd:N,multiSelectionKeyCode:W,panActivationKeyCode:p,zoomActivationKeyCode:O,elementsSelectable:P,zoomOnScroll:v,zoomOnPinch:K,zoomOnDoubleClick:fl,panOnScroll:X,panOnScrollSpeed:I,panOnScrollMode:o,panOnDrag:yl,defaultViewport:H,translateExtent:B,minZoom:C,maxZoom:E,onSelectionContextMenu:F,preventScrolling:D,noDragClassName:bl,noWheelClassName:_u,noPanClassName:tu,disableKeyboardA11y:Nu,onViewportChange:lr,isControlledViewport:!!nf,children:il.jsxs(CS,{children:[il.jsx(XS,{edgeTypes:u,onEdgeClick:n,onEdgeDoubleClick:i,onReconnect:cl,onReconnectStart:pl,onReconnectEnd:Hl,onlyRenderVisibleElements:V,onEdgeContextMenu:M,onEdgeMouseEnter:d,onEdgeMouseMove:nl,onEdgeMouseLeave:k,reconnectRadius:g,defaultMarkerColor:Y,noPanClassName:tu,disableKeyboardA11y:Nu,rfId:zr}),il.jsx(vS,{style:w,type:U,component:G,containerStyle:J}),il.jsx("div",{className:"react-flow__edgelabel-renderer"}),il.jsx(wS,{nodeTypes:l,onNodeClick:f,onNodeDoubleClick:t,onNodeMouseEnter:y,onNodeMouseMove:c,onNodeMouseLeave:_,onNodeContextMenu:A,nodeClickDistance:El,onlyRenderVisibleElements:V,noPanClassName:tu,noDragClassName:bl,disableKeyboardA11y:Nu,nodeExtent:gl,rfId:zr}),il.jsx("div",{className:"react-flow__viewport-portal"})]})})}WL.displayName="GraphView";var IS=_l.memo(WL),kq=({nodes:l,edges:u,defaultNodes:r,defaultEdges:f,width:n,height:t,fitView:i,fitViewOptions:y,minZoom:c=0.5,maxZoom:_=2,nodeOrigin:A,nodeExtent:F,zIndexMode:j="basic"}={})=>{let N=new Map,U=new Map,w=new Map,G=new Map,J=f??u??[],Q=r??l??[],m=A??[0,0],q=F??By;qF(w,G,J);let{nodesInitialized:W}=gA(Q,N,U,{nodeOrigin:m,nodeExtent:q,zIndexMode:j}),p=[0,0,1];if(i&&n&&t){let O=Dy(N,{filter:(H)=>!!((H.width||H.initialWidth)&&(H.height||H.initialHeight))}),{x:Z,y:V,zoom:P}=i$(O,n,t,c,_,y?.padding??0.1);p=[Z,V,P]}return{rfId:"1",width:n??0,height:t??0,transform:p,nodes:Q,nodesInitialized:W,nodeLookup:N,parentLookup:U,edges:J,edgeLookup:G,connectionLookup:w,onNodesChange:null,onEdgesChange:null,hasDefaultNodes:r!==void 0,hasDefaultEdges:f!==void 0,panZoom:null,minZoom:c,maxZoom:_,translateExtent:By,nodeExtent:q,nodesSelectionActive:!1,userSelectionActive:!1,userSelectionRect:null,connectionMode:ui.Strict,domNode:null,paneDragging:!1,noPanClassName:"nopan",nodeOrigin:m,nodeDragThreshold:1,connectionDragThreshold:1,snapGrid:[15,15],snapToGrid:!1,nodesDraggable:!0,nodesConnectable:!0,nodesFocusable:!0,edgesFocusable:!0,edgesReconnectable:!0,elementsSelectable:!0,elevateNodesOnSelect:!0,elevateEdgesOnSelect:!0,selectNodesOnDrag:!0,multiSelectionActive:!1,fitViewQueued:i??!1,fitViewOptions:y,fitViewResolver:null,connection:{...e9},connectionClickStartHandle:null,connectOnClick:!0,ariaLiveMessage:"",autoPanOnConnect:!0,autoPanOnNodeDrag:!0,autoPanOnNodeFocus:!0,autoPanSpeed:15,connectionRadius:20,onError:yF,isValidConnection:void 0,onSelectionChangeHandlers:[],lib:"react",debug:!1,ariaLabelConfig:d9,zIndexMode:j,onNodesChangeMiddlewareMap:new Map,onEdgesChangeMiddlewareMap:new Map}},aS=({nodes:l,edges:u,defaultNodes:r,defaultEdges:f,width:n,height:t,fitView:i,fitViewOptions:y,minZoom:c,maxZoom:_,nodeOrigin:A,nodeExtent:F,zIndexMode:j})=>Kq((N,U)=>{async function w(){let{nodeLookup:G,panZoom:J,fitViewOptions:Q,fitViewResolver:m,width:q,height:W,minZoom:p,maxZoom:O}=U();if(!J)return;await Cw({nodes:G,width:q,height:W,panZoom:J,minZoom:p,maxZoom:O},Q),m?.resolve(!0),N({fitViewResolver:null})}return{...kq({nodes:l,edges:u,width:n,height:t,fitView:i,fitViewOptions:y,minZoom:c,maxZoom:_,nodeOrigin:A,nodeExtent:F,defaultNodes:r,defaultEdges:f,zIndexMode:j}),setNodes:(G)=>{let{nodeLookup:J,parentLookup:Q,nodeOrigin:m,elevateNodesOnSelect:q,fitViewQueued:W,zIndexMode:p,nodesSelectionActive:O}=U(),{nodesInitialized:Z,hasSelectedNodes:V}=gA(G,J,Q,{nodeOrigin:m,nodeExtent:F,elevateNodesOnSelect:q,checkEquality:!0,zIndexMode:p}),P=O&&V;if(W&&Z)w(),N({nodes:G,nodesInitialized:Z,fitViewQueued:!1,fitViewOptions:void 0,nodesSelectionActive:P});else N({nodes:G,nodesInitialized:Z,nodesSelectionActive:P})},setEdges:(G)=>{let{connectionLookup:J,edgeLookup:Q}=U();qF(J,Q,G),N({edges:G})},setDefaultNodesAndEdges:(G,J)=>{if(G){let{setNodes:Q}=U();Q(G),N({hasDefaultNodes:!0})}if(J){let{setEdges:Q}=U();Q(J),N({hasDefaultEdges:!0})}},updateNodeInternals:(G)=>{let{triggerNodeChanges:J,nodeLookup:Q,parentLookup:m,domNode:q,nodeOrigin:W,nodeExtent:p,debug:O,fitViewQueued:Z,zIndexMode:V}=U(),{changes:P,updatedInternals:H}=dw(G,Q,m,q,W,p,V);if(!H)return;if(aw(Q,m,{nodeOrigin:W,nodeExtent:p,zIndexMode:V}),Z)w(),N({fitViewQueued:!1,fitViewOptions:void 0});else N({});if(P?.length>0){if(O)console.log("React Flow: trigger node changes",P);J?.(P)}},updateNodePositions:(G,J=!1)=>{let Q=[],m=[],{nodeLookup:q,triggerNodeChanges:W,connection:p,updateConnection:O,onNodesChangeMiddlewareMap:Z}=U();for(let[V,P]of G){let H=q.get(V),B=!!(H?.expandParent&&H?.parentId&&P?.position),C={id:V,type:"position",position:B?{x:Math.max(0,P.position.x),y:Math.max(0,P.position.y)}:P.position,dragging:J};if(H&&p.inProgress&&p.fromNode.id===H.id){let E=fi(H,p.fromHandle,Ol.Left,!0);O({...p,from:E})}if(B&&H.parentId)Q.push({id:V,parentId:H.parentId,rect:{...P.internals.positionAbsolute,width:P.measured.width??0,height:P.measured.height??0}});m.push(C)}if(Q.length>0){let{parentLookup:V,nodeOrigin:P}=U(),H=kA(Q,q,V,P);m.push(...H)}for(let V of Z.values())m=V(m);W(m)},triggerNodeChanges:(G)=>{let{onNodesChange:J,setNodes:Q,nodes:m,hasDefaultNodes:q,debug:W}=U();if(G?.length){if(q){let p=SV(G,m);Q(p)}if(W)console.log("React Flow: trigger node changes",G);J?.(G)}},triggerEdgeChanges:(G)=>{let{onEdgesChange:J,setEdges:Q,edges:m,hasDefaultEdges:q,debug:W}=U();if(G?.length){if(q){let p=YV(G,m);Q(p)}if(W)console.log("React Flow: trigger edge changes",G);J?.(G)}},addSelectedNodes:(G)=>{let{multiSelectionActive:J,edgeLookup:Q,nodeLookup:m,triggerNodeChanges:q,triggerEdgeChanges:W}=U();if(J){let p=G.map((O)=>y0(O,!0));q(p);return}q(Cy(m,new Set([...G]),!0)),W(Cy(Q))},addSelectedEdges:(G)=>{let{multiSelectionActive:J,edgeLookup:Q,nodeLookup:m,triggerNodeChanges:q,triggerEdgeChanges:W}=U();if(J){let p=G.map((O)=>y0(O,!0));W(p);return}W(Cy(Q,new Set([...G]))),q(Cy(m,new Set,!0))},unselectNodesAndEdges:({nodes:G,edges:J}={})=>{let{edges:Q,nodes:m,nodeLookup:q,triggerNodeChanges:W,triggerEdgeChanges:p}=U(),O=G?G:m,Z=J?J:Q,V=[];for(let H of O){if(!H.selected)continue;let B=q.get(H.id);if(B)B.selected=!1;V.push(y0(H.id,!1))}let P=[];for(let H of Z){if(!H.selected)continue;P.push(y0(H.id,!1))}W(V),p(P)},setMinZoom:(G)=>{let{panZoom:J,maxZoom:Q}=U();J?.setScaleExtent([G,Q]),N({minZoom:G})},setMaxZoom:(G)=>{let{panZoom:J,minZoom:Q}=U();J?.setScaleExtent([Q,G]),N({maxZoom:G})},setTranslateExtent:(G)=>{U().panZoom?.setTranslateExtent(G),N({translateExtent:G})},resetSelectedElements:()=>{let{edges:G,nodes:J,triggerNodeChanges:Q,triggerEdgeChanges:m,elementsSelectable:q}=U();if(!q)return;let W=J.reduce((O,Z)=>Z.selected?[...O,y0(Z.id,!1)]:O,[]),p=G.reduce((O,Z)=>Z.selected?[...O,y0(Z.id,!1)]:O,[]);Q(W),m(p)},setNodeExtent:(G)=>{let{nodes:J,nodeLookup:Q,parentLookup:m,nodeOrigin:q,elevateNodesOnSelect:W,nodeExtent:p,zIndexMode:O}=U();if(G[0][0]===p[0][0]&&G[0][1]===p[0][1]&&G[1][0]===p[1][0]&&G[1][1]===p[1][1])return;gA(J,Q,m,{nodeOrigin:q,nodeExtent:G,elevateNodesOnSelect:W,checkEquality:!1,zIndexMode:O}),N({nodeExtent:G})},panBy:(G)=>{let{transform:J,width:Q,height:m,panZoom:q,translateExtent:W}=U();return ew({delta:G,panZoom:q,transform:J,translateExtent:W,width:Q,height:m})},setCenter:async(G,J,Q)=>{let{width:m,height:q,maxZoom:W,panZoom:p}=U();if(!p)return Promise.resolve(!1);let O=typeof Q?.zoom<"u"?Q.zoom:W;return await p.setViewport({x:m/2-G*O,y:q/2-J*O,zoom:O},{duration:Q?.duration,ease:Q?.ease,interpolate:Q?.interpolate}),Promise.resolve(!0)},cancelConnection:()=>{N({connection:{...e9}})},updateConnection:(G)=>{N({connection:G})},reset:()=>N({...kq()})}},Object.is);function oS({initialNodes:l,initialEdges:u,defaultNodes:r,defaultEdges:f,initialWidth:n,initialHeight:t,initialMinZoom:i,initialMaxZoom:y,initialFitViewOptions:c,fitView:_,nodeOrigin:A,nodeExtent:F,zIndexMode:j,children:N}){let[U]=_l.useState(()=>aS({nodes:l,edges:u,defaultNodes:r,defaultEdges:f,width:n,height:t,fitView:_,minZoom:i,maxZoom:y,fitViewOptions:c,nodeOrigin:A,nodeExtent:F,zIndexMode:j}));return il.jsx(JV,{value:U,children:il.jsx(CV,{children:N})})}function dS({children:l,nodes:u,edges:r,defaultNodes:f,defaultEdges:n,width:t,height:i,fitView:y,fitViewOptions:c,minZoom:_,maxZoom:A,nodeOrigin:F,nodeExtent:j,zIndexMode:N}){if(_l.useContext(u8))return il.jsx(il.Fragment,{children:l});return il.jsx(oS,{initialNodes:u,initialEdges:r,defaultNodes:f,defaultEdges:n,initialWidth:t,initialHeight:i,fitView:y,initialFitViewOptions:c,initialMinZoom:_,initialMaxZoom:A,nodeOrigin:F,nodeExtent:j,zIndexMode:N,children:l})}var eS={width:"100%",height:"100%",overflow:"hidden",position:"relative",zIndex:0};function lY({nodes:l,edges:u,defaultNodes:r,defaultEdges:f,className:n,nodeTypes:t,edgeTypes:i,onNodeClick:y,onEdgeClick:c,onInit:_,onMove:A,onMoveStart:F,onMoveEnd:j,onConnect:N,onConnectStart:U,onConnectEnd:w,onClickConnectStart:G,onClickConnectEnd:J,onNodeMouseEnter:Q,onNodeMouseMove:m,onNodeMouseLeave:q,onNodeContextMenu:W,onNodeDoubleClick:p,onNodeDragStart:O,onNodeDrag:Z,onNodeDragStop:V,onNodesDelete:P,onEdgesDelete:H,onDelete:B,onSelectionChange:C,onSelectionDragStart:E,onSelectionDrag:D,onSelectionDragStop:Y,onSelectionContextMenu:v,onSelectionStart:K,onSelectionEnd:X,onBeforeDelete:I,connectionMode:o,connectionLineType:fl=pn.Bezier,connectionLineStyle:yl,connectionLineComponent:h,connectionLineContainerStyle:s,deleteKeyCode:ul="Backspace",selectionKeyCode:tl="Shift",selectionOnDrag:Al=!1,selectionMode:Kl=n0.Full,panActivationKeyCode:wl="Space",multiSelectionKeyCode:El=Xy()?"Meta":"Control",zoomActivationKeyCode:M=Xy()?"Meta":"Control",snapToGrid:d,snapGrid:nl,onlyRenderVisibleElements:k=!1,selectNodesOnDrag:g,nodesDraggable:cl,autoPanOnNodeFocus:pl,nodesConnectable:Hl,nodesFocusable:bl,nodeOrigin:_u=dq,edgesFocusable:tu,edgesReconnectable:Nu,elementsSelectable:gl=!0,defaultViewport:zr=zV,minZoom:nf=0.5,maxZoom:lr=2,translateExtent:tf=By,preventScrolling:Or=!0,nodeExtent:Nl,defaultMarkerColor:al="#b1b1b7",zoomOnScroll:gu=!0,zoomOnPinch:hl=!0,panOnScroll:yr=!1,panOnScrollSpeed:Zr=0.5,panOnScrollMode:cr=it.Free,zoomOnDoubleClick:ku=!0,panOnDrag:Gf=!0,onPaneClick:Vn,onPaneMouseEnter:Rr,onPaneMouseMove:ay,onPaneMouseLeave:_t,onPaneScroll:At,onPaneContextMenu:e,paneClickDistance:Dl=1,nodeClickDistance:Cl=0,children:lu,onReconnect:mu,onReconnectStart:au,onReconnectEnd:yu,onEdgeContextMenu:ur,onEdgeDoubleClick:Sn,onEdgeMouseEnter:Z8,onEdgeMouseMove:oy,onEdgeMouseLeave:dy,reconnectRadius:Tu=10,onNodesChange:K$,onEdgesChange:H8,noDragClassName:ju="nodrag",noWheelClassName:wj="nowheel",noPanClassName:Su="nopan",fitView:mr,fitViewOptions:A0,connectOnClick:E$,attributionPosition:ey,proOptions:p$,defaultEdgeOptions:lc,elevateNodesOnSelect:z$=!0,elevateEdgesOnSelect:O$=!1,disableKeyboardA11y:Ft=!1,autoPanOnConnect:F0,autoPanOnNodeDrag:j0,autoPanSpeed:xr,connectionRadius:Wf,isValidConnection:Z$,onError:N0,style:uc,id:rc,nodeDragThreshold:$n,connectionDragThreshold:H$,viewport:Ou,onViewportChange:B8,width:D8,height:B$,colorMode:hf="light",debug:Ui,onScroll:jt,ariaLabelConfig:J0,zIndexMode:Nt="basic",...fc},qj){let Yn=rc||"1",Lj=BV(hf),D$=_l.useCallback((V$)=>{V$.currentTarget.scrollTo({top:0,left:0,behavior:"instant"}),jt?.(V$)},[jt]);return il.jsx("div",{"data-testid":"rf__wrapper",...fc,onScroll:D$,style:{...uc,...eS},ref:qj,className:bu(["react-flow",n,Lj]),id:rc,role:"application",children:il.jsxs(dS,{nodes:l,edges:u,width:D8,height:B$,fitView:mr,fitViewOptions:A0,minZoom:nf,maxZoom:lr,nodeOrigin:_u,nodeExtent:Nl,zIndexMode:Nt,children:[il.jsx(HV,{nodes:l,edges:u,defaultNodes:r,defaultEdges:f,onConnect:N,onConnectStart:U,onConnectEnd:w,onClickConnectStart:G,onClickConnectEnd:J,nodesDraggable:cl,autoPanOnNodeFocus:pl,nodesConnectable:Hl,nodesFocusable:bl,edgesFocusable:tu,edgesReconnectable:Nu,elementsSelectable:gl,elevateNodesOnSelect:z$,elevateEdgesOnSelect:O$,minZoom:nf,maxZoom:lr,nodeExtent:Nl,onNodesChange:K$,onEdgesChange:H8,snapToGrid:d,snapGrid:nl,connectionMode:o,translateExtent:tf,connectOnClick:E$,defaultEdgeOptions:lc,fitView:mr,fitViewOptions:A0,onNodesDelete:P,onEdgesDelete:H,onDelete:B,onNodeDragStart:O,onNodeDrag:Z,onNodeDragStop:V,onSelectionDrag:D,onSelectionDragStart:E,onSelectionDragStop:Y,onMove:A,onMoveStart:F,onMoveEnd:j,noPanClassName:Su,nodeOrigin:_u,rfId:Yn,autoPanOnConnect:F0,autoPanOnNodeDrag:j0,autoPanSpeed:xr,onError:N0,connectionRadius:Wf,isValidConnection:Z$,selectNodesOnDrag:g,nodeDragThreshold:$n,connectionDragThreshold:H$,onBeforeDelete:I,debug:Ui,ariaLabelConfig:J0,zIndexMode:Nt}),il.jsx(IS,{onInit:_,onNodeClick:y,onEdgeClick:c,onNodeMouseEnter:Q,onNodeMouseMove:m,onNodeMouseLeave:q,onNodeContextMenu:W,onNodeDoubleClick:p,nodeTypes:t,edgeTypes:i,connectionLineType:fl,connectionLineStyle:yl,connectionLineComponent:h,connectionLineContainerStyle:s,selectionKeyCode:tl,selectionOnDrag:Al,selectionMode:Kl,deleteKeyCode:ul,multiSelectionKeyCode:El,panActivationKeyCode:wl,zoomActivationKeyCode:M,onlyRenderVisibleElements:k,defaultViewport:zr,translateExtent:tf,minZoom:nf,maxZoom:lr,preventScrolling:Or,zoomOnScroll:gu,zoomOnPinch:hl,zoomOnDoubleClick:ku,panOnScroll:yr,panOnScrollSpeed:Zr,panOnScrollMode:cr,panOnDrag:Gf,onPaneClick:Vn,onPaneMouseEnter:Rr,onPaneMouseMove:ay,onPaneMouseLeave:_t,onPaneScroll:At,onPaneContextMenu:e,paneClickDistance:Dl,nodeClickDistance:Cl,onSelectionContextMenu:v,onSelectionStart:K,onSelectionEnd:X,onReconnect:mu,onReconnectStart:au,onReconnectEnd:yu,onEdgeContextMenu:ur,onEdgeDoubleClick:Sn,onEdgeMouseEnter:Z8,onEdgeMouseMove:oy,onEdgeMouseLeave:dy,reconnectRadius:Tu,defaultMarkerColor:al,noDragClassName:ju,noWheelClassName:wj,noPanClassName:Su,rfId:Yn,disableKeyboardA11y:Ft,nodeExtent:Nl,viewport:Ou,onViewportChange:B8}),il.jsx(pV,{onSelectionChange:C}),lu,il.jsx(GV,{proOptions:p$,position:ey}),il.jsx(LV,{rfId:Yn,disableKeyboardA11y:Ft})]})})}var TL=lL(lY);var tg=mf.error014();function uY({dimensions:l,lineWidth:u,variant:r,className:f}){return il.jsx("path",{strokeWidth:u,d:`M${l[0]/2} 0 V${l[1]} M0 ${l[1]/2} H${l[0]}`,className:bu(["react-flow__background-pattern",r,f])})}function rY({radius:l,className:u}){return il.jsx("circle",{cx:l,cy:l,r:l,className:bu(["react-flow__background-pattern","dots",u])})}var ti;(function(l){l.Lines="lines",l.Dots="dots",l.Cross="cross"})(ti||(ti={}));var fY={[ti.Dots]:1,[ti.Lines]:1,[ti.Cross]:6},nY=(l)=>({transform:l.transform,patternId:`pattern-${l.rfId}`});function KL({id:l,variant:u=ti.Dots,gap:r=20,size:f,lineWidth:n=1,offset:t=0,color:i,bgColor:y,style:c,className:_,patternClassName:A}){let F=_l.useRef(null),{transform:j,patternId:N}=$u(nY,zu),U=f||fY[u],w=u===ti.Dots,G=u===ti.Cross,J=Array.isArray(r)?r:[r,r],Q=[J[0]*j[2]||1,J[1]*j[2]||1],m=U*j[2],q=Array.isArray(t)?t:[t,t],W=G?[m,m]:Q,p=[q[0]*j[2]||1+W[0]/2,q[1]*j[2]||1+W[1]/2],O=`${N}${l?l:""}`;return il.jsxs("svg",{className:bu(["react-flow__background",_]),style:{...c,...f8,"--xy-background-color-props":y,"--xy-background-pattern-color-props":i},ref:F,"data-testid":"rf__background",children:[il.jsx("pattern",{id:O,x:j[0]%Q[0],y:j[1]%Q[1],width:Q[0],height:Q[1],patternUnits:"userSpaceOnUse",patternTransform:`translate(-${p[0]},-${p[1]})`,children:w?il.jsx(rY,{radius:m/2,className:A}):il.jsx(uY,{dimensions:W,lineWidth:n,variant:u,className:A})}),il.jsx("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:`url(#${O})`})]})}KL.displayName="Background";var EL=_l.memo(KL);function tY(){return il.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",children:il.jsx("path",{d:"M32 18.133H18.133V32h-4.266V18.133H0v-4.266h13.867V0h4.266v13.867H32z"})})}function iY(){return il.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 5",children:il.jsx("path",{d:"M0 0h32v4.2H0z"})})}function yY(){return il.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 30",children:il.jsx("path",{d:"M3.692 4.63c0-.53.4-.938.939-.938h5.215V0H4.708C2.13 0 0 2.054 0 4.63v5.216h3.692V4.631zM27.354 0h-5.2v3.692h5.17c.53 0 .984.4.984.939v5.215H32V4.631A4.624 4.624 0 0027.354 0zm.954 24.83c0 .532-.4.94-.939.94h-5.215v3.768h5.215c2.577 0 4.631-2.13 4.631-4.707v-5.139h-3.692v5.139zm-23.677.94c-.531 0-.939-.4-.939-.94v-5.138H0v5.139c0 2.577 2.13 4.707 4.708 4.707h5.138V25.77H4.631z"})})}function cY(){return il.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:il.jsx("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0 8 0 4.571 3.429 4.571 7.619v3.048H3.048A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047zm4.724-13.866H7.467V7.619c0-2.59 2.133-4.724 4.723-4.724 2.591 0 4.724 2.133 4.724 4.724v3.048z"})})}function $Y(){return il.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:il.jsx("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0c-4.114 1.828-1.37 2.133.305 2.438 1.676.305 4.42 2.59 4.42 5.181v3.048H3.047A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047z"})})}function eA({children:l,className:u,...r}){return il.jsx("button",{type:"button",className:bu(["react-flow__controls-button",u]),...r,children:l})}var _Y=(l)=>({isInteractive:l.nodesDraggable||l.nodesConnectable||l.elementsSelectable,minZoomReached:l.transform[2]<=l.minZoom,maxZoomReached:l.transform[2]>=l.maxZoom,ariaLabelConfig:l.ariaLabelConfig});function pL({style:l,showZoom:u=!0,showFitView:r=!0,showInteractive:f=!0,fitViewOptions:n,onZoomIn:t,onZoomOut:i,onFitView:y,onInteractiveChange:c,className:_,children:A,position:F="bottom-left",orientation:j="vertical","aria-label":N}){let U=Vu(),{isInteractive:w,minZoomReached:G,maxZoomReached:J,ariaLabelConfig:Q}=$u(_Y,zu),{zoomIn:m,zoomOut:q,fitView:W}=pF(),p=()=>{m(),t?.()},O=()=>{q(),i?.()},Z=()=>{W(n),y?.()},V=()=>{U.setState({nodesDraggable:!w,nodesConnectable:!w,elementsSelectable:!w}),c?.(!w)};return il.jsxs(r8,{className:bu(["react-flow__controls",j==="horizontal"?"horizontal":"vertical",_]),position:F,style:l,"data-testid":"rf__controls","aria-label":N??Q["controls.ariaLabel"],children:[u&&il.jsxs(il.Fragment,{children:[il.jsx(eA,{onClick:p,className:"react-flow__controls-zoomin",title:Q["controls.zoomIn.ariaLabel"],"aria-label":Q["controls.zoomIn.ariaLabel"],disabled:J,children:il.jsx(tY,{})}),il.jsx(eA,{onClick:O,className:"react-flow__controls-zoomout",title:Q["controls.zoomOut.ariaLabel"],"aria-label":Q["controls.zoomOut.ariaLabel"],disabled:G,children:il.jsx(iY,{})})]}),r&&il.jsx(eA,{className:"react-flow__controls-fitview",onClick:Z,title:Q["controls.fitView.ariaLabel"],"aria-label":Q["controls.fitView.ariaLabel"],children:il.jsx(yY,{})}),f&&il.jsx(eA,{className:"react-flow__controls-interactive",onClick:V,title:Q["controls.interactive.ariaLabel"],"aria-label":Q["controls.interactive.ariaLabel"],children:w?il.jsx($Y,{}):il.jsx(cY,{})}),A]})}pL.displayName="Controls";var zL=_l.memo(pL);function AY({id:l,x:u,y:r,width:f,height:n,style:t,color:i,strokeColor:y,strokeWidth:c,className:_,borderRadius:A,shapeRendering:F,selected:j,onClick:N}){let{background:U,backgroundColor:w}=t||{},G=i||U||w;return il.jsx("rect",{className:bu(["react-flow__minimap-node",{selected:j},_]),x:u,y:r,rx:A,ry:A,width:f,height:n,style:{fill:G,stroke:y,strokeWidth:c},shapeRendering:F,onClick:N?(J)=>N(J,l):void 0})}var FY=_l.memo(AY),jY=(l)=>l.nodes.map((u)=>u.id),TF=(l)=>l instanceof Function?l:()=>l;function NY({nodeStrokeColor:l,nodeColor:u,nodeClassName:r="",nodeBorderRadius:f=5,nodeStrokeWidth:n,nodeComponent:t=FY,onClick:i}){let y=$u(jY,zu),c=TF(u),_=TF(l),A=TF(r),F=typeof window>"u"||!!window.chrome?"crispEdges":"geometricPrecision";return il.jsx(il.Fragment,{children:y.map((j)=>il.jsx(UY,{id:j,nodeColorFunc:c,nodeStrokeColorFunc:_,nodeClassNameFunc:A,nodeBorderRadius:f,nodeStrokeWidth:n,NodeComponent:t,onClick:i,shapeRendering:F},j))})}function JY({id:l,nodeColorFunc:u,nodeStrokeColorFunc:r,nodeClassNameFunc:f,nodeBorderRadius:n,nodeStrokeWidth:t,shapeRendering:i,NodeComponent:y,onClick:c}){let{node:_,x:A,y:F,width:j,height:N}=$u((U)=>{let w=U.nodeLookup.get(l);if(!w)return{node:void 0,x:0,y:0,width:0,height:0};let G=w.internals.userNode,{x:J,y:Q}=w.internals.positionAbsolute,{width:m,height:q}=zn(G);return{node:G,x:J,y:Q,width:m,height:q}},zu);if(!_||_.hidden||!cF(_))return null;return il.jsx(y,{x:A,y:F,width:j,height:N,style:_.style,selected:!!_.selected,className:f(_),color:u(_),borderRadius:n,strokeColor:r(_),strokeWidth:t,shapeRendering:i,onClick:c,id:_.id})}var UY=_l.memo(JY),QY=_l.memo(NY),mY=200,wY=150,qY=(l)=>!l.hidden,LY=(l)=>{let u={x:-l.transform[0]/l.transform[2],y:-l.transform[1]/l.transform[2],width:l.width/l.transform[2],height:l.height/l.transform[2]};return{viewBB:u,boundingRect:l.nodeLookup.size>0?tF(Dy(l.nodeLookup,{filter:qY}),u):u,rfId:l.rfId,panZoom:l.panZoom,translateExtent:l.translateExtent,flowWidth:l.width,flowHeight:l.height,ariaLabelConfig:l.ariaLabelConfig}},GY="react-flow__minimap-desc";function OL({style:l,className:u,nodeStrokeColor:r,nodeColor:f,nodeClassName:n="",nodeBorderRadius:t=5,nodeStrokeWidth:i,nodeComponent:y,bgColor:c,maskColor:_,maskStrokeColor:A,maskStrokeWidth:F,position:j="bottom-right",onClick:N,onNodeClick:U,pannable:w=!1,zoomable:G=!1,ariaLabel:J,inversePan:Q,zoomStep:m=1,offsetScale:q=5}){let W=Vu(),p=_l.useRef(null),{boundingRect:O,viewBB:Z,rfId:V,panZoom:P,translateExtent:H,flowWidth:B,flowHeight:C,ariaLabelConfig:E}=$u(LY,zu),D=l?.width??mY,Y=l?.height??wY,v=O.width/D,K=O.height/Y,X=Math.max(v,K),I=X*D,o=X*Y,fl=q*X,yl=O.x-(I-O.width)/2-fl,h=O.y-(o-O.height)/2-fl,s=I+fl*2,ul=o+fl*2,tl=`${GY}-${V}`,Al=_l.useRef(0),Kl=_l.useRef();Al.current=X,_l.useEffect(()=>{if(p.current&&P)return Kl.current=iq({domNode:p.current,panZoom:P,getTransform:()=>W.getState().transform,getViewScale:()=>Al.current}),()=>{Kl.current?.destroy()}},[P]),_l.useEffect(()=>{Kl.current?.update({translateExtent:H,width:B,height:C,inversePan:Q,pannable:w,zoomStep:m,zoomable:G})},[w,G,Q,m,H,B,C]);let wl=N?(d)=>{let[nl,k]=Kl.current?.pointer(d)||[0,0];N(d,{x:nl,y:k})}:void 0,El=U?_l.useCallback((d,nl)=>{let k=W.getState().nodeLookup.get(nl).internals.userNode;U(d,k)},[]):void 0,M=J??E["minimap.ariaLabel"];return il.jsx(r8,{position:j,style:{...l,"--xy-minimap-background-color-props":typeof c==="string"?c:void 0,"--xy-minimap-mask-background-color-props":typeof _==="string"?_:void 0,"--xy-minimap-mask-stroke-color-props":typeof A==="string"?A:void 0,"--xy-minimap-mask-stroke-width-props":typeof F==="number"?F*X:void 0,"--xy-minimap-node-background-color-props":typeof f==="string"?f:void 0,"--xy-minimap-node-stroke-color-props":typeof r==="string"?r:void 0,"--xy-minimap-node-stroke-width-props":typeof i==="number"?i:void 0},className:bu(["react-flow__minimap",u]),"data-testid":"rf__minimap",children:il.jsxs("svg",{width:D,height:Y,viewBox:`${yl} ${h} ${s} ${ul}`,className:"react-flow__minimap-svg",role:"img","aria-labelledby":tl,ref:p,onClick:wl,children:[M&&il.jsx("title",{id:tl,children:M}),il.jsx(QY,{onClick:El,nodeColor:f,nodeStrokeColor:r,nodeBorderRadius:t,nodeClassName:n,nodeStrokeWidth:i,nodeComponent:y}),il.jsx("path",{className:"react-flow__minimap-mask",d:`M${yl-fl},${h-fl}h${s+fl*2}v${ul+fl*2}h${-s-fl*2}z + M${Z.x},${Z.y}h${Z.width}v${Z.height}h${-Z.width}z`,fillRule:"evenodd",pointerEvents:"none"})]})})}OL.displayName="MiniMap";var ig=_l.memo(OL),WY=(l)=>(u)=>l?`${Math.max(1/u.transform[2],1)}`:void 0,TY={[ni.Line]:"right",[ni.Handle]:"bottom-right"};function KY({nodeId:l,position:u,variant:r=ni.Handle,className:f,style:n=void 0,children:t,color:i,minWidth:y=10,minHeight:c=10,maxWidth:_=Number.MAX_VALUE,maxHeight:A=Number.MAX_VALUE,keepAspectRatio:F=!1,resizeDirection:j,autoScale:N=!0,shouldResize:U,onResizeStart:w,onResize:G,onResizeEnd:J}){let Q=nL(),m=typeof l==="string"?l:Q,q=Vu(),W=_l.useRef(null),p=r===ni.Handle,O=$u(_l.useCallback(WY(p&&N),[p,N]),zu),Z=_l.useRef(null),V=u??TY[r];_l.useEffect(()=>{if(!W.current||!m)return;if(!Z.current)Z.current=Aq({domNode:W.current,nodeId:m,getStoreItems:()=>{let{nodeLookup:H,transform:B,snapGrid:C,snapToGrid:E,nodeOrigin:D,domNode:Y}=q.getState();return{nodeLookup:H,transform:B,snapGrid:C,snapToGrid:E,nodeOrigin:D,paneDomNode:Y}},onChange:(H,B)=>{let{triggerNodeChanges:C,nodeLookup:E,parentLookup:D,nodeOrigin:Y}=q.getState(),v=[],K={x:H.x,y:H.y},X=E.get(m);if(X&&X.expandParent&&X.parentId){let I=X.origin??Y,o=H.width??X.measured.width??0,fl=H.height??X.measured.height??0,yl={id:X.id,parentId:X.parentId,rect:{width:o,height:fl,...$F({x:H.x??X.position.x,y:H.y??X.position.y},{width:o,height:fl},X.parentId,E,I)}},h=kA([yl],E,D,Y);v.push(...h),K.x=H.x?Math.max(I[0]*o,H.x):void 0,K.y=H.y?Math.max(I[1]*fl,H.y):void 0}if(K.x!==void 0&&K.y!==void 0){let I={id:m,type:"position",position:{...K}};v.push(I)}if(H.width!==void 0&&H.height!==void 0){let o={id:m,type:"dimensions",resizing:!0,setAttributes:!j?!0:j==="horizontal"?"width":"height",dimensions:{width:H.width,height:H.height}};v.push(o)}for(let I of B){let o={...I,type:"position"};v.push(o)}C(v)},onEnd:({width:H,height:B})=>{let C={id:m,type:"dimensions",resizing:!1,dimensions:{width:H,height:B}};q.getState().triggerNodeChanges([C])}});return Z.current.update({controlPosition:V,boundaries:{minWidth:y,minHeight:c,maxWidth:_,maxHeight:A},keepAspectRatio:F,resizeDirection:j,onResizeStart:w,onResize:G,onResizeEnd:J,shouldResize:U}),()=>{Z.current?.destroy()}},[V,y,c,_,A,F,w,G,J,U]);let P=V.split("-");return il.jsx("div",{className:bu(["react-flow__resize-control","nodrag",...P,r,f]),ref:W,style:{...n,scale:O,...i&&{[p?"backgroundColor":"borderColor"]:i}},children:t})}var yg=_l.memo(KY);var T=$i.default.createElement,{useEffect:Hn}=$i.default,lf=$i.default.useState,ci=$i.default.useRef,N$=[{id:"in-left",side:"left",position:Ol.Left,style:{top:"50%"}},{id:"in-top-left",side:"top",slot:"left",slotIndex:-1,position:Ol.Top,style:{left:"28%"}},{id:"in-top-mid",side:"top",slot:"mid",slotIndex:0,position:Ol.Top,style:{left:"50%"}},{id:"in-top-right",side:"top",slot:"right",slotIndex:1,position:Ol.Top,style:{left:"72%"}},{id:"in-bottom-left",side:"bottom",slot:"left",slotIndex:-1,position:Ol.Bottom,style:{left:"28%"}},{id:"in-bottom-mid",side:"bottom",slot:"mid",slotIndex:0,position:Ol.Bottom,style:{left:"50%"}},{id:"in-bottom-right",side:"bottom",slot:"right",slotIndex:1,position:Ol.Bottom,style:{left:"72%"}}],A$=[{id:"out-right",position:Ol.Right,style:{top:"50%"}}],ZL=["#4eb7a8","#d7a13a","#69aee8","#e0835f","#b7d86b","#d98bd2","#5fc6bf"],sy=236,Ry=88,HL=15000,EY=10,OF=96,On=72,ZF=64,BL=12;function n8(){return typeof document>"u"||document.visibilityState!=="hidden"}function DL(l,u){let r=Number.parseFloat(String(l||""));return Number.isFinite(r)?r/100:u}function pY(l,u,r){let f=String(l.side||"");if(f!=="top"&&f!=="bottom")return 0;let n=Number(l.slotIndex||0),t=f==="top"?"in-top-mid":"in-bottom-mid",i=u.get(l.id)||0,y=u.get(t)||0;if(n===0)return y===0?-26:28+i*74;let c=r===0?Math.abs(n)*2:Math.sign(r)===Math.sign(n)?-3:3;if(y>0&&i===0)return-14+c;return 8+i*74+c}function t8(l){let u=l.filter((t,i)=>{let y=l[i-1];return!y||Math.abs(y.x-t.x)>0.5||Math.abs(y.y-t.y)>0.5});if(u.length<2)return"";let r=`M ${u[0].x},${u[0].y}`,f=u[0];for(let t=1;t0.5||Math.abs(j.y-f.y)>0.5)r+=` L ${j.x},${j.y}`;r+=` Q ${y.x},${y.y} ${N.x},${N.y}`,f=N}let n=u[u.length-1];return`${r} L ${n.x},${n.y}`}function oL(l,u,r,f,n,t,i=""){let y=r>=l,c=Math.max(1,Math.abs(r-l)),_=Math.abs(f-u),A=Math.max(34,Math.min(118,c*0.26)),F=Math.min(280,Math.abs(t));if(y&&n===Ol.Left&&F<4&&_<28&&c<420)return`M ${l},${u} C ${l+A},${u} ${r-A},${f} ${r},${f}`;if(y&&n===Ol.Left&&(i==="direct-forward-left"||c<=260&&_<=210)){let J=Math.max(42,Math.min(140,c*0.48)),Q=Math.max(-28,Math.min(28,t*0.18));return`M ${l},${u} C ${l+J},${u+Q} ${r-J},${f} ${r},${f}`}if(y){let J=l+A;if(n===Ol.Top||n===Ol.Bottom){let q=n===Ol.Top?-1:1,W=f+q*(54+F*0.42);return t8([{x:l,y:u},{x:J,y:u},{x:J+Math.min(120,c*0.18),y:W},{x:r,y:W},{x:r,y:f+q*34},{x:r,y:f}])}let Q=r-A,m=(u+f)/2+t;return t8([{x:l,y:u},{x:J,y:u},{x:J+Math.min(110,c*0.16),y:m},{x:Q-Math.min(90,c*0.12),y:m},{x:Q,y:f},{x:r,y:f}])}let U=n===Ol.Bottom?1:n===Ol.Top?-1:t>=0?1:-1,w=Math.max(l,r)+92+Math.min(180,F*0.52),G=U<0?Math.min(u,f)-84-F*0.62:Math.max(u,f)+84+F*0.62;if(n===Ol.Top||n===Ol.Bottom)return t8([{x:l,y:u},{x:l+A,y:u},{x:w,y:G},{x:r,y:G},{x:r,y:f+U*38},{x:r,y:f}]);return t8([{x:l,y:u},{x:l+A,y:u},{x:w,y:G},{x:r-A,y:G},{x:r-A,y:f},{x:r,y:f}])}function zY({data:l}){return T("div",{className:"pipeline-flow-node-body"},N$.map((u)=>T(c0,{key:u.id,id:u.id,type:"target",position:u.position,isConnectable:!1,className:`pipeline-flow-handle input ${u.side} slot-${u.slot||"mid"}`,style:u.style})),A$.map((u)=>T(c0,{key:u.id,id:u.id,type:"source",position:u.position,isConnectable:!1,className:"pipeline-flow-handle output right",style:u.style})),l?.label)}function OY({id:l,sourceX:u,sourceY:r,targetX:f,targetY:n,targetPosition:t,markerEnd:i,markerStart:y,style:c,data:_}){let A=Number(_?.laneOffset||0),F=oL(u,r,f,n,t,A,String(_?.routeMode||""));return T(hy,{id:l,path:F,markerEnd:i,markerStart:y,style:c,interactionWidth:28})}var ZY={pipelineCurve:OY},HY={pipelineNode:zY};function $8(l){if(!l)return"--";let u=new Date(l);if(Number.isNaN(u.getTime()))return"--";return iu(u)}function Xf(l){let u=Number(l);if(!Number.isFinite(u)||u<0)return"--";let r=Math.round(u/1000);if(r<60)return`${r}s`;if(r<3600)return`${Math.floor(r/60)}m ${r%60}s`;return`${Math.floor(r/3600)}h ${Math.floor(r%3600/60)}m`}function HF(l){let u=Number(l);if(!Number.isFinite(u))return"--";return u.toLocaleString("zh-CN")}function VL(l){let u=Number(l);if(!Number.isFinite(u))return"--";return`${Math.round(Math.max(0,Math.min(1,u))*100)}%`}function Xl(l){return typeof l==="object"&&l!==null&&!Array.isArray(l)}function Sl(l){return Array.isArray(l)?l:[]}function dl(l){if(!l)return null;let u=new Date(l);return Number.isNaN(u.getTime())?null:u.getTime()}function J$(l){return Number.isFinite(Number(l))?new Date(Number(l)).toISOString():""}function m$(...l){for(let u of l){let r=dl(u);if(r!==null)return new Date(r).toISOString()}return""}function vF(...l){let u=l.map(dl).filter((r)=>r!==null);return u.length>0?new Date(Math.max(...u)).toISOString():""}function gF(l){return["succeeded","failed","skipped","cancelled","canceled","completed"].includes(String(l||"").toLowerCase())}function dL(l){let u=uG(l).toLowerCase();return["running","active","in-progress","in_progress"].includes(u)}function SL(l,u="status"){return l.reduce((r,f)=>{let n=String(f?.[u]||"unknown").toLowerCase();return r[n]=(r[n]||0)+1,r},{})}function eL(l){if(!l||typeof l!=="string")return null;try{let u=JSON.parse(l);return Xl(u)?u:null}catch{return null}}function BF(l){let u=l.map(eL).filter((t)=>Boolean(t)),r=u.flatMap((t)=>[t.timestamp,t.createdAt,t.updatedAt]).filter(Boolean),f=vF(...r),n=Array.from(new Set(u.map((t)=>String(t.event||t.action||t.type||"")).filter(Boolean))).slice(0,3);return{total:l.length,parsed:u.length,lastAt:f,eventKinds:n}}function _8(l){if(l===null||l===void 0)return"--";if(typeof l==="boolean")return l?"是":"否";if(typeof l==="number")return String(l);if(typeof l==="string")return l.length>80?`${l.slice(0,77)}...`:l;if(Array.isArray(l))return`${l.length} 项`;if(typeof l==="object")return`${Object.keys(l).length} 字段`;return String(l)}function lG(l,u=280){if(l===null||l===void 0)return"";let f=(typeof l==="string"?l:String(l)).replace(/\r\n/gu,` +`).trim();return f.length>u?`${f.slice(0,Math.max(0,u-1))}...`:f}function uG(l){if(typeof l==="string")return l;if(Xl(l))return String(l.status||l.state||l.phase||"unknown");return"unknown"}function BY(l){return l.filter((u)=>u&&u.value!==void 0&&u.value!==null&&String(u.value)!=="")}function PF({items:l}){let u=BY(Sl(l));return T("div",{className:"pipeline-kv-grid"},u.map((r)=>T("span",{key:r.label},T("b",null,r.label),T("span",null,r.value))))}function kF({items:l}){let u=Sl(l).map((r)=>String(r||"")).filter(Boolean);if(u.length===0)return null;return T("div",{className:"pipeline-chip-row"},u.map((r,f)=>T("span",{key:`${f}-${r}`},r)))}function CF(l,u){let r=String(u?.procedureRunId||""),f=Sl(l?.procedureRuns);return f.find((n)=>String(Pf(n))===r)||f.at(-1)||null}function DY(l,u){let r=String(u||"");if(!r)return null;return Sl(l?.procedureRuns).find((f)=>Pf(f)===r)||null}function DF(l){return Sl(l?.attempts).length}function YL(l){return Sl(l?.attempts).reduce((u,r)=>u+Q8(r).length,0)}function Q8(l){return Sl(l?.opencodeMessages?.steps).filter(Xl)}function rG(l){let u=String(l?.status||"").toLowerCase();if(["error","failed","failure"].includes(u))return"failed";if(["completed","succeeded","success"].includes(u))return"succeeded";if(["running","started","in_progress"].includes(u))return"running";return"unknown"}function VY(l,u){let r=MF(l.map((t)=>t?.agent)).slice(0,3),f=MF(l.map((t)=>t?.model)).slice(0,3),n=u.length<=2?u.map((t)=>`session ${t}`):[`sessions ${u.length}`,...u.slice(0,2).map((t)=>`session ${t}`)];return[...r.map((t)=>`agent ${t}`),...f.map((t)=>`model ${t}`),...n]}function F$(l,u=0){return String(l?.messageId||l?.index||"")||`step-${u}`}function SY({steps:l,sessionIds:u,sessionFacts:r,matchedStepKey:f}){let n=Sl(l),t=n.findIndex((G,J)=>F$(G,J)===f),i=t>=0?n[t]:null,y=n.flatMap((G)=>[dl(G?.createdAt),dl(G?.completedAt)]).filter((G)=>G!==null),c=y.length>0?Math.min(...y):null,_=y.length>0?Math.max(...y):null,A=c!==null&&_!==null?Math.max(0,_-c):null,F=n.reduce((G,J)=>G+Sl(J?.parts).filter((Q)=>String(Q?.type||"").toLowerCase()==="tool").length,0),j=n.reduce((G,J)=>G+Sl(J?.parts).filter((Q)=>["text","reasoning"].includes(String(Q?.type||"").toLowerCase())).length,0),N=n.reduce((G,J)=>G+Sl(J?.parts).filter((Q)=>String(Q?.type||"").toLowerCase()==="tool"&&rG(Q)==="failed").length,0),U=[`${n.length} steps`,`${u.length} sessions`,`${j} messages`,`${F} tools`,A!==null?`duration ${Xf(A)}`:"",N>0?`${N} failed tools`:""].filter(Boolean),w=i?[`Step ${i?.index??t+1}`,String(i?.role||"role --"),i?.model?`model ${i.model}`:"",i?.finish?`finish ${i.finish}`:"",i?.durationMs!==void 0&&i?.durationMs!==null?`duration ${Xf(i.durationMs)}`:""].filter(Boolean):[];return T("section",{className:"pipeline-trace-timeline","data-testid":"pipeline-step-timeline"},T("div",{className:"pipeline-trace-head"},T("div",null,T("b",null,"OpenCode Trace"),T("span",null,"Trace 使用 Code Queue 统一样式展示完整 agent loop;Pipeline 旧 step/message/tool 卡片样式已废弃。")),T("div",{className:"pipeline-trace-session-head","data-testid":"pipeline-step-timeline-session"},T("span",null,U.join(" / ")||"Trace"),r.length>0?T(kF,{items:r}):null)),i?T("div",{className:"pipeline-trace-focus","data-testid":"pipeline-trace-matched-step"},T("span",{className:"codex-output-channel"},"Matched"),T("strong",null,`Gantt selection -> ${w.join(" / ")}`),T("time",null,`${$8(i?.createdAt)} -> ${$8(i?.completedAt)}`)):null,T(w3,{port:iQ,input:n,className:"codex-transcript pipeline-trace",testId:"pipeline-opencode-step-trace",emptyText:"暂无 OpenCode Trace 输出",keepRecentToolCalls:3}))}function hF(l){return Sl(l).flatMap((u)=>{if(Xl(u))return[u];let r=eL(u);return r?[r]:[]})}function yn(l){return String(l?.event||l?.action||l?.requestedAction||l?.type||"").toLowerCase()}function My(l){return m$(l?.timestamp,l?.createdAt,l?.updatedAt,l?.startedAt,l?.finishedAt)}function YY(l){return dl(My(l))}function m8(l){return String(l?.attempt||l?.id||"")}function MF(l){let u=new Set,r=[];for(let f of l){let n=String(f||"");if(!n||u.has(n))continue;u.add(n),r.push(n)}return r}function XL(l){switch(String(l||"").toLowerCase()){case"monitor":return"monitor";case"webui":return"webui";case"cli":return"cli";case"system":return"runner";default:return String(l||"--")}}function $0(l){return String(l?.requestedAction||l?.action||"").toLowerCase()}function j$(l){switch($0(l)){case"guide":return"引导";case"modify":return"修改";case"approve":return"审核通过";case"restart":return"重启";case"redo":return"重做";default:return String(l?.requestedAction||l?.action||"控制")}}function PL(l){switch(yn(l)){case"initial-prompt-delivered":return"初始 prompt";case"append-prompt-delivered":return"追加 prompt";case"append-prompt-queued":return"追加 prompt 已排队";case"monitor-prompt-delivered":return"Monitor prompt";case"node-long-running-observation":return"长任务观察";case"node-finished":return"节点完成";case"oa-policy-downstream-evaluated":return"OA 下游策略";case"control-command-queued":return`${j$(l)} 已发起`;case"control-command-applied":return`${j$(l)} 已生效`;case"control-command-ignored":return`${j$(l)} 已忽略`;default:return String(l?.event||l?.action||l?.requestedAction||"event")}}function CL(l){return lG(l?.promptPreview||l?.reasonPreview||l?.prompt||l?.reason||"",240)}function XY(l){let u=String(l?.prompt||""),r=String(l?.reason||l?.restartReason||""),f=u?"":String(l?.promptPreview||""),n=r?"":String(l?.reasonPreview||"");return[u||f?{label:u?"prompt":"prompt preview",value:u||f}:null,r||n?{label:r?"reason":"reason preview",value:r||n}:null,Sl(l?.resetNodeIds).length>0?{label:"reset nodes",value:Sl(l.resetNodeIds).join(", ")}:null,Sl(l?.runningResetNodeIds).length>0?{label:"interrupted running nodes",value:Sl(l.runningResetNodeIds).join(", ")}:null,Sl(l?.interruptedProcedureRunIds).length>0?{label:"interrupted procedures",value:Sl(l.interruptedProcedureRunIds).join(", ")}:null,l?.interruptedProcedureRunId?{label:"interrupted procedure",value:String(l.interruptedProcedureRunId)}:null].filter(Boolean)}function VF(l){let u=Q8(l),r=u.map((c)=>dl(c?.createdAt)).filter((c)=>c!==null),f=u.map((c)=>dl(c?.completedAt)??dl(c?.createdAt)).filter((c)=>c!==null),n=hF(l?.controlEventRecords).map((c)=>YY(c)).filter((c)=>c!==null),t=Sl(l?.assistantOutputs).map((c)=>dl(c?.updatedAt)).filter((c)=>c!==null),i=r[0]??n[0]??t[0]??null,y=f.at(-1)??n.at(-1)??t.at(-1)??i;return{startMs:i,endMs:y}}function PY(l,u,r,f,n=""){let t=Sl(l?.procedureRuns).filter((y)=>w8(y,u)===r);if(t.length===0)return null;if(n){let y=t.find((c)=>Pf(c)===n);if(y)return y}if(f===null)return t.at(-1)||null;let i=t.find((y)=>{let c=dl(i8(y,l)),_=dl(y8(y,l))??c;return c!==null&&_!==null&&f>=c-1000&&f<=_+1000});if(i)return i;return t.slice().sort((y,c)=>{let _=dl(i8(y,l))??f,A=dl(y8(y,l))??_,F=dl(i8(c,l))??f,j=dl(y8(c,l))??F,N=Math.min(Math.abs(_-f),Math.abs(A-f)),U=Math.min(Math.abs(F-f),Math.abs(j-f));return N-U})[0]||null}function fG(l,u){let r=Sl(l?.attempts).filter(Xl);if(r.length===0)return null;let f=String(u?.attempt||"");if(f){let i=r.find((y)=>m8(y)===f);if(i)return i}let n=Number.isFinite(Number(u?.ms))?Number(u.ms):null;if(n===null)return r.at(-1)||null;let t=r.find((i)=>{let y=VF(i);return Number.isFinite(y.startMs)&&Number.isFinite(y.endMs)&&n>=Number(y.startMs)-1000&&n<=Number(y.endMs)+1000});if(t)return t;return r.slice().sort((i,y)=>{let c=VF(i),_=VF(y),A=Math.min(Math.abs(Number(c.startMs??n)-n),Math.abs(Number(c.endMs??n)-n)),F=Math.min(Math.abs(Number(_.startMs??n)-n),Math.abs(Number(_.endMs??n)-n));return A-F})[0]||r.at(-1)||null}function nG(l,u){let r=Q8(l);if(r.length===0)return{step:null,stepIndex:-1,stepKey:""};if(u===null){let t=r[0];return{step:t,stepIndex:0,stepKey:F$(t,0)}}for(let t=0;t=y-1000&&u<=c+1000)return{step:i,stepIndex:t,stepKey:F$(i,t)}}let f=r.findIndex((t)=>{let i=dl(t?.createdAt)??dl(t?.completedAt);return i!==null&&i>=u});if(f>=0){let t=r[f];return{step:t,stepIndex:f,stepKey:F$(t,f)}}let n=Math.max(0,r.length-1);return{step:r[n],stepIndex:n,stepKey:F$(r[n],n)}}function CY(l,u){let r=String(u?.runId||l?.runId||"");if(String(u?.mode||"")==="interval"){let _=u?.interval||{},A=CF(l,_)||_.raw||{};return{mode:"interval",runId:r,interval:_,marker:null,nodeId:String(_?.nodeId||w8(A,r)||""),procedure:A,attempt:null,matchedStep:null,matchedStepIndex:-1,matchedStepKey:""}}let f=Xl(u?.marker)?u.marker:{},n=Number.isFinite(Number(f?.ms))?Number(f.ms):null,t=String(f?.nodeId||""),i=t?PY(l,r,t,n,String(f?.procedureRunId||"")):null,y=i?fG(i,f):null,c=y?nG(y,n):{step:null,stepIndex:-1,stepKey:""};return{mode:"event",runId:r,interval:null,marker:f,nodeId:t,procedure:i,attempt:y,matchedStep:c.step,matchedStepIndex:c.stepIndex,matchedStepKey:c.stepKey}}function hY({procedure:l,matchedStepKey:u="",matchedAttemptId:r=""}){let f=Sl(l?.attempts);if(f.length===0)return T(qf,{title:"暂无 attempt 详情",text:"当前 procedure 还没有可展示的 attempt / OpenCode Trace;若刚点击甘特线,请等待 node 详情抓取完成。"});return f.map((n,t)=>{let i=n?.opencodeMessages||{},y=Q8(n),c=Sl(i.sessionIds).map((j)=>String(j)).filter(Boolean),_=VY(y,c),A=m8(n)||`attempt-${t+1}`,F=y.reduce((j,N)=>j+Sl(N?.parts).filter((U)=>String(U?.type||"").toLowerCase()==="tool"&&rG(U)==="failed").length,0);return T("article",{key:A,className:`pipeline-attempt-card ${r===A?"matched":""}`},T("div",{className:"pipeline-attempt-head"},T("div",null,T("strong",null,A),T("span",null,i.source||"opencode")),T("div",{className:"pipeline-attempt-badges"},T("span",null,`${y.length} steps`),T("span",null,`${i.toolCallCount??"--"} tools`),F>0?T("span",{className:"danger"},`${F} failed`):null)),T(PF,{items:[{label:"messages",value:i.messageCount??"--"},{label:"steps",value:i.stepCount??"--"},{label:"tools",value:i.toolCallCount??"--"},{label:"updated",value:Ll(i.updatedAt)},{label:"sessions",value:c.join(", ")||"--"}]}),y.length===0?T("p",{className:"muted paragraph"},"当前 attempt 尚未返回 OpenCode Trace;请确认 D601 pipeline-control 已重建并重新抓取。"):T(SY,{steps:y,sessionIds:c,sessionFacts:_,matchedStepKey:u}))})}function SF(l,u){return`${l}::${u}`}function A8(l,u,r){if(!Xl(l))return null;return String(l.runId||"")===u&&String(l.nodeId||"")===r?l:null}function MY(l,u){let r=Xl(l)?l:{};if(!Xl(u))return r;let f=Sl(u.attempts),n=Sl(r.attempts);return{...r,...u,attempts:f.length>0?f:n}}function sY(l,u,r,f){if(!A8(u,r,f))return l;let n=Sl(u.procedureRuns),t=Xl(l)?l:{};return{...t,...u,controlEvents:Sl(u.controlEvents).length>0?u.controlEvents:t.controlEvents,procedureRuns:n.length>0?n:t.procedureRuns}}function RY({selection:l,runDetails:u,nodeDetails:r,nodeDetailsState:f,onRaw:n,onCollapse:t}){if(!l?.mode)return T("aside",{className:"pipeline-gantt-detail-panel empty","data-testid":"pipeline-gantt-detail-panel"},T("div",{className:"pipeline-gantt-detail-head"},T("div",null,T("span",{className:"panel-eyebrow"},"Gantt Detail"),T(nu,{title:"未选择元素",level:3})),T("button",{type:"button",className:"ghost-btn mini",onClick:t,"data-testid":"pipeline-gantt-sidebar-collapse"},"收起")),T(qf,{title:"选择一条执行线或一个控制点",text:"点击甘特图中的 node 执行线、prompt 点或控制点,在这里查看结构化过程和 OpenCode step。"}));let i=String(l?.runId||""),y=String(l?.interval?.nodeId||l?.marker?.nodeId||""),c=u?.runId===i?u.details:null,_=A8(r,i,y),A=String(f?.runId||"")===i&&String(f?.nodeId||"")===y,F=sY(c,_,i,y),j=(String(u?.runId||"")!==i||Boolean(u?.loading))&&!F,N=String(u?.runId||"")===i?String(u?.error||""):"",U=A?String(f?.error||""):"",w=F?CY(F,l):null,G=w?.interval||l?.interval||null,J=w?.marker||l?.marker||null,Q=String(G?.procedureRunId||J?.procedureRunId||""),m=_?DY(_,Q)||CF(_,G||{procedureRunId:Q}):null,q=w?.procedure||(F?CF(F,G||{procedureRunId:Q}):null)||G?.raw||{};if(m&&(DF(q)===0||YL(m)>=YL(q)))q=MY(q,m);let W=w?.attempt||null,p=String(w?.matchedStepKey||"");if(!W&&J&&DF(q)>0)W=fG(q,J),p=String(nG(W,Number.isFinite(Number(J?.ms))?Number(J.ms):null).stepKey||"");let O=m8(W),Z=DF(q)>0,V=A&&Boolean(f?.loading)&&!Z,P=Boolean(j||V),H=[Z?"":N,U].filter(Boolean).join(" / "),B=A&&f?.fetchedAt?f.fetchedAt:u?.fetchedAt,C=uG(q?.status||G?.status||J?.status||J?.event),E=l?.mode==="event"?J?.label||PL(J?.raw||J)||"event":w?.nodeId||G?.nodeId||"node",D=J?XY(J?.raw||J):[],Y=J?[yn(J?.raw||J)?`event ${yn(J?.raw||J)}`:"",J?.promptEvent?`prompt ${J.promptEvent}`:"",J?.action?`action ${J.action}`:"",J?.sourceKind?`source ${XL(J.sourceKind)}`:"",J?.sourceNodeId?`from ${J.sourceNodeId}`:"",J?.targetNodeId?`to ${J.targetNodeId}`:"",J?.snapReason?`draw ${J.snapReason}`:""].filter(Boolean):[];return T("aside",{className:"pipeline-gantt-detail-panel","data-testid":"pipeline-gantt-detail-panel"},T("div",{className:"pipeline-gantt-detail-head"},T("div",null,T("span",{className:"panel-eyebrow"},l?.mode==="event"?"Gantt Event Detail":"Gantt Line Detail"),T(nu,{title:E,level:3,loading:P})),T("div",{className:"pipeline-gantt-detail-head-actions"},T(_i,{status:C},C),T("button",{type:"button",className:"ghost-btn mini",onClick:t,"data-testid":"pipeline-gantt-sidebar-collapse"},"收起"))),J?T("article",{className:"pipeline-event-card"},T("div",{className:"pipeline-event-card-head"},T("strong",null,J?.label||PL(J?.raw||J)),T(kF,{items:Y})),T(PF,{items:[{label:"event time",value:Ll(J?.timestampIso||J?.timestamp||"--")},J?.snapped?{label:"drawn time",value:Ll(J?.renderedTimestampIso||J?.ms)}:null,{label:"node",value:J?.nodeId||"--"},{label:"procedure",value:J?.procedureRunId||Pf(q)||"--"},{label:"attempt",value:J?.attempt||O||"--"},{label:"source kind",value:J?.sourceKind?XL(J.sourceKind):"--"},{label:"source node",value:J?.sourceNodeId||"--"},{label:"target node",value:J?.targetNodeId||"--"},{label:"command",value:J?.commandId||J?.eventId||"--"},J?.snapReason?{label:"placement",value:J.snapReason}:null]}),D.length>0?T("div",{className:"pipeline-event-blocks"},D.map((v,K)=>T("section",{key:`${v.label}-${K}`,className:"pipeline-event-text-block"},T("b",null,v.label),T("p",null,v.value)))):null,CL(J?.raw||J)?T("p",{className:"pipeline-text-preview"},CL(J?.raw||J)):null):null,T(PF,{items:[{label:"epoch",value:i||G?.runId||"--"},{label:"node",value:w?.nodeId||G?.nodeId||J?.nodeId||"--"},{label:"procedure",value:G?.procedureRunId||J?.procedureRunId||Pf(q)||"--"},{label:"started",value:Ll(G?.startedAt||q?.startedAt)},{label:"finished",value:Ll(G?.finishedAt||q?.finishedAt)},{label:"duration",value:Xf(G?.durationMs||q?.durationMs)},{label:"fetched",value:B?iu(B):"--"},w?.matchedStep?{label:"matched step",value:`Step ${w.matchedStep.index??w.matchedStepIndex+1}`}:null]}),T(el,{error:H}),T("div",{className:"pipeline-gantt-detail-actions"},T(cn,{title:`Procedure ${G?.procedureRunId||J?.procedureRunId||w?.nodeId||"node"}`,data:q,onOpen:n,testId:"raw-pipeline-gantt-procedure"}),J?T(cn,{title:`Pipeline event ${J?.id||J?.commandId||J?.eventId||w?.nodeId||"event"}`,data:J?.raw||J,onOpen:n,testId:"raw-pipeline-gantt-event"}):null,F?T(cn,{title:`Pipeline run ${i||"--"}`,data:F,onOpen:n,testId:"raw-pipeline-gantt-node-details"}):null),!P&&!Pf(q)&&!J?T(qf,{title:"暂无过程详情",text:"当前选择还没有可匹配的 procedure 运行记录。"}):null,!P&&Pf(q)?T(hY,{procedure:q,matchedStepKey:p,matchedAttemptId:O}):null)}function xY({value:l}){let r=String(l||"--").split(/([_-])/u);return T($i.default.Fragment,null,r.map((f,n)=>f==="-"||f==="_"?T($i.default.Fragment,{key:n},f,T("wbr",null)):T($i.default.Fragment,{key:n},f)))}async function ii(l,u={}){return Tl(l,{invalidJsonPrefix:"Pipeline 返回了无效 JSON",...u})}function _i({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return T("span",{className:`status-badge ${r}`},u||l||"unknown")}function sr({label:l,value:u,hint:r,tone:f}){return T("article",{className:`metric-card ${f||""}`},T("div",{className:"metric-label"},l),T("div",{className:"metric-value"},u),T("div",{className:"metric-hint"},r))}function Zn({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return T("section",{className:`panel ${n||""}`},T("div",{className:"panel-head"},T("div",null,u?T("p",{className:"panel-eyebrow"},u):null,T(nu,{title:l,loading:t})),r?T("div",{className:"panel-actions"},r):null),T("div",{className:"panel-body"},f))}function cn({title:l,data:u,onOpen:r,testId:f}){return T("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function Yf({title:l,subtitle:u,facts:r,data:f,onRaw:n,testId:t}){let i=Sl(r).map((y)=>String(y||"")).filter(Boolean);return T("article",{className:"pipeline-evidence-row"},T("div",{className:"pipeline-evidence-main"},T("strong",null,l),u?T("span",null,u):null),T("div",{className:"pipeline-evidence-facts"},i.map((y,c)=>T("span",{key:`${c}-${y.slice(0,16)}`},y))),f!==void 0?T(cn,{title:l,data:f,onOpen:n,testId:t}):null)}function qf({title:l,text:u}){return T("div",{className:"empty-state"},T("strong",null,l),T("span",null,u))}function bY(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function vY(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function gY(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function kY(l){return{components:Array.isArray(l?.registry?.components)?l.registry.components:[],pipelines:Array.isArray(l?.pipelines)?l.pipelines:[],runs:Array.isArray(l?.runs)?l.runs:[]}}function hL(l,u,r){let f=l?._unidesk?.arrayLimits?.[u],n=Number(f?.originalLength);return Number.isFinite(n)?n:r}function tG(l){if(!l||typeof l!=="object"||Array.isArray(l))return"--";return`${l.componentClass||"--"}/${l.id||"--"}`}function F8(l){if(!l||typeof l!=="object"||Array.isArray(l))return"";let u=String(l.componentClass||"").trim(),r=String(l.id||"").trim();return u&&r?`${u}/${r}`:""}function IF(l){return l?.config&&typeof l.config==="object"&&!Array.isArray(l.config)?l.config:{}}function iG(l){let u=IF(l),r=Array.isArray(u.nodes)?u.nodes:Array.isArray(l?.nodes)?l.nodes:[],f=new Map;for(let i of r){let y=String(i?.id||i?.nodeId||"");if(y)f.set(y,{...i,id:y})}let n=aF(l),t=(i)=>{if(i&&!f.has(i))f.set(i,{id:i})};for(let i of oF(l))U$(i).forEach(t);for(let i of n)t(String(i?.from||i?.source||"")),t(String(i?.to||i?.target||""));return Array.from(f.values())}function aF(l){let u=IF(l);return Array.isArray(u.edges)?u.edges:Array.isArray(l?.edges)?l.edges:[]}function oF(l){let u=IF(l);return Array.isArray(u.topologicalBatches)?u.topologicalBatches:Array.isArray(l?.topologicalBatches)?l.topologicalBatches:[]}function IY(l){let u=new Map;for(let r of l){let f=F8(r);if(f)u.set(f,r);let n=Array.isArray(r?.refs)?r.refs:[];for(let t of n){let i=F8(t);if(i)u.set(i,r)}}return u}function ML(l,u){let r=u.get(F8(l?.componentRef));if(r)return r;let f=F8({componentClass:l?.kind,id:l?.id});return f?u.get(f)||null:null}function sL(l,u){let r=yG(l,u);return String(r?.status||"pending")}function yG(l,u){return(Array.isArray(l?.nodes)?l.nodes:[]).find((f)=>f?.nodeId===u||f?.id===u)||null}function aY(l){return l.reduce((u,r)=>{let f=String(r?.status||"unknown").toLowerCase();return u[f]=(u[f]||0)+1,u},{})}function oY(l){if(Array.isArray(l?.scorers))return l.scorers.filter(Xl);if(Array.isArray(l?.summary?.scorers))return l.summary.scorers.filter(Xl);if(Array.isArray(l?.artifact?.summary?.scorers))return l.artifact.summary.scorers.filter(Xl);return[]}function dY(l){if(Xl(l?.run))return l.run;if(Xl(l?.runSummary))return l.runSummary;return null}function eY(l,u){if(!Xl(l)&&!Xl(u))return null;if(!Xl(l))return u;if(!Xl(u))return l;return{...l,...u,request:Xl(l.request)||Xl(u.request)?{...Xl(l.request)?l.request:{},...Xl(u.request)?u.request:{}}:u.request??l.request,artifact:Xl(l.artifact)||Xl(u.artifact)?{...Xl(l.artifact)?l.artifact:{},...Xl(u.artifact)?u.artifact:{}}:u.artifact??l.artifact,summary:Xl(l.summary)||Xl(u.summary)?{...Xl(l.summary)?l.summary:{},...Xl(u.summary)?u.summary:{}}:u.summary??l.summary}}function j8(l){let u=oY(l),r=u.find((A)=>Xl(A?.score))||u[0]||null,f=Xl(r?.score)?r.score:{},n=Number(f.passed),t=Number(f.total),i=Number(f.ratio),y=Number.isFinite(i)?i:Number.isFinite(n)&&Number.isFinite(t)&&t>0?n/t:null,c=y===null?null:Math.round(Math.max(0,Math.min(100,y<=1?y*100:y))),_=String(f.text||(Number.isFinite(n)&&Number.isFinite(t)?`${n}/${t}`:""));return{scorer:r,scorers:u,score:f,passed:Number.isFinite(n)?n:null,total:Number.isFinite(t)?t:null,percent:c,text:_}}function sF(l){let u=j8(l);return u.text||(u.scorers.length>0?String(u.scorer?.status||"pending"):"--")}function dF(l){let u=j8(l);if(u.total>0&&u.passed===u.total)return"succeeded";if(u.total>0&&u.passed>0)return"running";if(u.scorers.length>0)return"failed";return"pending"}function lX(l){return Array.isArray(l?.items)?l.items.filter(Xl):[]}function uX({run:l}){let u=sF(l);return T("span",{className:`pipeline-score-badge ${dF(l)}`},`score ${u}`)}function rX({run:l,onRaw:u}){let f=j8(l).scorers;if(!l)return T(qf,{title:"暂无评分",text:"选择一个 epoch 后会显示 scorer 结果。"});if(f.length===0)return T("div",{className:"pipeline-score-empty"},T("strong",null,"评分器等待中"),T("span",null,"DAG 完成后,Pipeline control backend 会把 scorer summary 追加到 run artifact,并通过 UniDesk 显示。"));return T("div",{className:"pipeline-score-board","data-testid":"pipeline-score-board"},f.map((n,t)=>{let i=j8({scorers:[n]}),y=lX(n),c=i.percent??0;return T("article",{key:`${n.scorerId||n.component||t}`,className:`pipeline-score-card ${dF({scorers:[n]})}`},T("div",{className:"pipeline-score-head"},T("div",null,T("span",null,n.scorerId||n.component||"scorer"),T("strong",null,i.text||n.status||"--")),T(_i,{status:n.status||"unknown"},n.status||"unknown")),T("div",{className:"pipeline-score-meter","aria-label":`score ${c}%`},T("span",{style:{width:`${c}%`}})),T("div",{className:"pipeline-score-facts"},T("span",null,`${c}%`),T("span",null,n.component||"--"),T("span",null,n.applicationCheckoutRef||"--")),y.length>0?T("div",{className:"pipeline-score-items"},y.map((_)=>T("span",{key:`${_.id||_.filter}`,className:`pipeline-score-item ${String(_.status||"").toLowerCase()}`,title:`${_.filter||"--"} / ran=${_.ran??"?"}`},T("b",null,_.id||"--"),T("small",null,_.status||"--")))):T("p",{className:"muted paragraph"},"当前 scorer 尚未返回 item 级结果。"),n.error?T("p",{className:"pipeline-score-error"},lG(n.error,360)):null,T("div",{className:"panel-actions inline-actions"},T(cn,{title:`Scorer ${n.scorerId||t}`,data:n,onOpen:u,testId:"raw-pipeline-score"})))}))}function fX(l){let u=l.reduce((r,f)=>{let n=String(f?.componentClass||"unknown");return r[n]=(r[n]||0)+1,r},{});return Object.entries(u).map(([r,f])=>({name:r,count:Number(f)})).sort((r,f)=>f.count-r.count||r.name.localeCompare(f.name))}function U$(l){if(Array.isArray(l))return l.map((u)=>typeof u==="string"?u:String(u?.id||u?.nodeId||"")).filter(Boolean);if(Array.isArray(l?.nodes))return U$(l.nodes);if(Array.isArray(l?.nodeIds))return U$(l.nodeIds);return[]}function nX(l){return Xl(l?.instanceInputs?.monitor)?l.instanceInputs.monitor:{}}function cG(l,u){if(String(l?.kind||"").toLowerCase()!=="procedure")return!1;let r=nX(l);if(l?.instanceInputs?.monitorMode===!0||r.enabled===!0)return!0;let f=tG(l?.componentRef);return String(u?.id||u?.config?.id||f||"").toLowerCase().includes("monitor")}function tX(l){return l.filter((u)=>cG(u)).map((u)=>String(u?.id||"")).filter(Boolean)}function iX(l,u){if(u.length===0)return l;let r=new Set(u),f=u.filter((n)=>l.includes(n));if(f.length===0)return l;return[...f,...l.filter((n)=>!r.has(n))]}function yX(l,u){if(u.length===0)return l;let r=new Set(u),f=u.filter((t)=>l.some((i)=>i.includes(t)));if(f.length===0)return l;let n=l.map((t)=>t.filter((i)=>!r.has(i))).filter((t)=>t.length>0);return[f,...n]}function cX(l,u,r){let n=oF(l).map(U$).filter((j)=>j.length>0);if(n.length>0)return n;let t=u.map((j)=>String(j?.id||"")).filter(Boolean),i=new Set(t),y=new Map(t.map((j)=>[j,0])),c=new Map(t.map((j)=>[j,[]]));for(let j of r){let N=String(j?.from||j?.source||""),U=String(j?.to||j?.target||"");if(!i.has(N)||!i.has(U))continue;c.get(N)?.push(U),y.set(U,(y.get(U)||0)+1)}let _=new Map,A=t.filter((j)=>(y.get(j)||0)===0);for(let j of A)_.set(j,0);while(A.length>0){let j=A.shift(),N=(_.get(j)||0)+1;for(let U of c.get(j)||[])if(y.set(U,Math.max(0,(y.get(U)||0)-1)),_.set(U,Math.max(_.get(U)||0,N)),(y.get(U)||0)===0)A.push(U)}t.forEach((j)=>{if(!_.has(j))_.set(j,0)});let F=Math.max(0,...Array.from(_.values()));return Array.from({length:F+1},(j,N)=>t.filter((U)=>_.get(U)===N)).filter((j)=>j.length>0)}function $X(l,u,r){let n=oF(l).map(U$).filter((y)=>y.length>0),t=n.length>0?n.flatMap((y)=>y):(()=>{let y=u.map((w)=>String(w?.id||"")).filter(Boolean),c=new Set(y),_=r.filter((w)=>String(w?.edgeType||"").toLowerCase()!=="rework"),A=new Map(y.map((w)=>[w,0])),F=new Map(y.map((w)=>[w,[]]));for(let w of _){let G=String(w?.from||w?.source||""),J=String(w?.to||w?.target||"");if(!c.has(G)||!c.has(J))continue;F.get(G)?.push(J),A.set(J,(A.get(J)||0)+1)}let j=new Map,N=y.filter((w)=>(A.get(w)||0)===0);for(let w of N)j.set(w,0);while(N.length>0){let w=N.shift(),G=(j.get(w)||0)+1;for(let J of F.get(w)||[])if(A.set(J,Math.max(0,(A.get(J)||0)-1)),j.set(J,Math.max(j.get(J)||0,G)),(A.get(J)||0)===0)N.push(J)}y.forEach((w)=>{if(!j.has(w))j.set(w,0)});let U=Math.max(0,...Array.from(j.values()));return Array.from({length:U+1},(w,G)=>y.filter((J)=>j.get(J)===G)).flatMap((w)=>w)})(),i=new Set(t);for(let y of u){let c=String(y?.id||"");if(!c||i.has(c))continue;t.push(c),i.add(c)}return iX(t,tX(u))}function $$(l){return`${l.source}->${l.target}-${l.index}`}function RL(l,u,r){let f=iG(l),n=aF(l),t=IY(r),i=new Map(f.map((C)=>[String(C?.id||""),C])),y=f.filter((C)=>cG(C,ML(C,t))).map((C)=>String(C?.id||"")).filter(Boolean),c=yX(cX(l,f,n),y),_=[],A=new Map,F=330,j=122;c.forEach((C,E)=>{let D=C.length*122;C.forEach((Y,v)=>{let K=i.get(Y)||{id:Y},X=ML(K,t),I=sL(u,Y).toLowerCase(),o=String(K.kind||X?.componentClass||"node").toLowerCase(),fl=tG(K.componentRef||X),yl=String(X?.config?.version||X?.version||""),h=String(X?.config?.description||X?.description||""),s=v*122-Math.floor(D/2);A.set(Y,{column:E,row:v,y:s}),_.push({id:Y,type:"pipelineNode",position:{x:E*330,y:s},data:{exportLabel:{id:Y,kind:o,componentRef:fl,componentVersion:yl,componentDescription:h,status:I},label:T("div",{className:"flow-node-label"},T("strong",null,Y),T("span",null,o),T("code",{title:h||fl},yl?`${fl}@${yl}`:fl),T(_i,{status:I},I))},className:`pipeline-flow-node ${o} ${I}`})})});let N=n.flatMap((C,E)=>{let D=String(C?.from||C?.source||""),Y=String(C?.to||C?.target||"");if(!i.has(D)||!i.has(Y))return[];return[{source:D,target:Y,index:E,condition:C?.condition,edgeType:C?.edgeType}]}),U=N.reduce((C,E)=>C.set(E.source,(C.get(E.source)||0)+1),new Map),w=N.reduce((C,E)=>C.set(E.target,(C.get(E.target)||0)+1),new Map),G=N.reduce((C,E)=>{let D=`${E.source}->${E.target}`;return C.set(D,(C.get(D)||0)+1)},new Map),J=new Map,Q=new Map,m=new Map,q=new Map,W=new Map,p=new Map,O=N.reduce((C,E)=>{let D=A.get(E.source),Y=A.get(E.target),v=(Y?.column||0)-(D?.column||0);if(v<=0||String(E.edgeType||"").toLowerCase()==="rework"||v!==1)return C;let X=`${E.source}->column:${Y?.column??""}`,I=C.get(X)||[];return I.push(E),C.set(X,I),C},new Map);for(let C of O.values()){if(C.length<2)continue;C.slice().sort((E,D)=>{let Y=A.get(E.target),v=A.get(D.target);return(Y?.y||0)-(v?.y||0)||E.index-D.index}).forEach((E,D,Y)=>{p.set($$(E),{slot:D-(Y.length-1)/2,count:Y.length})})}[...N].sort((C,E)=>{let D=A.get(C.source),Y=A.get(C.target),v=A.get(E.source),K=A.get(E.target),X=Math.abs((Y?.column||0)-(D?.column||0))*330+Math.abs((Y?.y||0)-(D?.y||0)),I=Math.abs((K?.column||0)-(v?.column||0))*330+Math.abs((K?.y||0)-(v?.y||0));return X-I||C.index-E.index}).forEach((C)=>{let E=A.get(C.source)||{column:0,row:0,y:0},D=A.get(C.target)||{column:0,row:0,y:0},Y=D.column-E.column,v=Math.max(0,Y),K=Y<=0||String(C.edgeType||"").toLowerCase()==="rework",X=E.y-D.y,I=w.get(C.target)||1,o=p.has($$(C)),fl=!K&&v<=1&&(o||I===1),yl=W.get(C.target)||new Map;W.set(C.target,yl);let h=N$.slice().sort((s,ul)=>{let tl=(El)=>{let M=String(El.side),d=0;if(K){if(M==="left")d+=86;if(M==="top")d+=D.y<=0?-22:12;if(M==="bottom")d+=D.y>=0?-22:12;if(Math.abs(D.y)<12&&M!=="left")d+=C.index%2===0?M==="top"?-6:6:M==="bottom"?-6:6;return d}if(fl){if(M==="left")d-=o?72:44;if(M!=="left")d+=o?72:44;return d+Math.abs(X)*0.02}if(M==="left")d+=v<=1?0:24;if(M==="top")d+=X<-36?-18:42;if(M==="bottom")d+=X>36?-18:42;if(v<=1&&Math.abs(X)<=82&&M!=="left")d+=38;if(v>1&&M!=="left")d-=10;return d},Al=E.y-D.y,Kl=Al!==0?Al:C.index%2===0?-1:1,wl=(El)=>{let M=yl.get(El.id)||0;return tl(El)+M*64+pY(El,yl,Kl)};return wl(s)-wl(ul)||String(s.id).localeCompare(String(ul.id))})[0];yl.set(h.id,(yl.get(h.id)||0)+1),q.set($$(C),h)});let V=N.map((C)=>{let E=sL(u,C.target).toLowerCase(),D=`${C.source}->${C.target}`,Y=J.get(C.source)||0,v=Q.get(C.target)||0,K=m.get(D)||0;J.set(C.source,Y+1),Q.set(C.target,v+1),m.set(D,K+1);let X=Y-((U.get(C.source)||1)-1)/2,I=v-((w.get(C.target)||1)-1)/2,o=K-((G.get(D)||1)-1)/2,fl=A.get(C.source),yl=A.get(C.target),h=(yl?.column||0)-(fl?.column||0),s=Math.max(1,Math.abs(h)),ul=h<=0||String(C.edgeType||"").toLowerCase()==="rework",tl=Math.abs((yl?.y||0)-(fl?.y||0)),Al=p.get($$(C)),Kl=!ul&&h===1&&(w.get(C.target)||0)>1,wl=Al?Al.slot:o*2+X+I*0.45,El=wl===0?C.index%2===0?-1:1:Math.sign(wl),M=q.get($$(C))||N$[1],d=M.side==="top"?-1:M.side==="bottom"?1:El,nl=ul||s>1||tl>96||Math.abs(wl)>0.2||M.side!=="left",k=ul?118+s*18:22+s*16,g=M.side==="left"?0:28,cl=nl?Math.max(-280,Math.min(280,d*Math.min(180,k+g+tl*0.22)+wl*28)):0,pl=Math.max(0,Math.min(A$.length-1,Math.round(X+(A$.length-1)/2))),Hl=A$[pl]||A$[1],bl=E==="succeeded"?"var(--accent-2)":E==="running"?"var(--accent)":E==="failed"?"var(--danger)":"rgba(129, 147, 159, 0.78)",_u=fl?.column||0,tu=yl?.column||0,Nu=cl===0?0:Math.sign(cl),gl=ul?`feedback:${_u}->${tu}:${Nu}`:Al?`fanout:${_u}->${tu}:${C.source}`:Kl?`fanin:${_u}->${tu}:${C.target}`:M.side!=="left"||s>1?`corridor:${_u}->${tu}:${M.side}:${Nu}:${Math.round(Math.abs(cl)/56)}`:"";return{id:`${C.source}->${C.target}-${C.index}`,source:C.source,target:C.target,sourceHandle:Hl.id,targetHandle:M.id,type:"pipelineCurve",zIndex:12,animated:E==="running",data:{baseEdgeColor:bl,laneOffset:cl,routeMode:Al&&M.side==="left"?"direct-forward-left":"",targetSide:M.side,isFeedback:ul,overlapGroup:gl},targetStatus:E}}),P=V.reduce((C,E)=>{let D=String(E.data?.overlapGroup||"");return D?C.set(D,(C.get(D)||0)+1):C},new Map),H=new Map,B=V.map((C)=>{let E=String(C.targetStatus||"pending"),D={...C};delete D.targetStatus;let Y=String(C.data?.overlapGroup||""),v=Y?P.get(Y)||0:0,K=v>1?H.get(Y)||0:-1;if(v>1)H.set(Y,K+1);let X=K>=0?ZL[K%ZL.length]:String(C.data.baseEdgeColor),I={stroke:X};if(C.data.isFeedback)I.strokeDasharray="9 7";return{...D,data:{...C.data,edgeColor:X,overlapSlot:K,overlapCount:v},style:I,markerEnd:{type:ri.ArrowClosed,color:X},className:`pipeline-flow-edge ${E} ${C.data.isFeedback?"feedback":""} ${K>=0?"overlap-colored":""}`}});return{nodes:_,edges:B}}function uf(l){return String(l??"").replace(/&/g,"&").replace(//g,">").replace(/"/g,""")}function xL(l){let u=String(l||"");if(u.includes("--accent-2"))return"#4eb7a8";if(u.includes("--accent"))return"#d7a13a";if(u.includes("--danger"))return"#cf6a54";return u.startsWith("#")?u:"#81939f"}function N8(l){return`arrow-${l.replace(/[^a-zA-Z0-9_-]+/g,"")}`}function $G(l,u="pipeline"){return String(l||u).replace(/[^a-zA-Z0-9_-]+/g,"-").replace(/^-|-$/g,"")||u}function bL(l,u){let r=l.position.x,f=l.position.y,n=N$.find((t)=>t.id===u);if(n?.side==="top")return{x:r+sy*DL(n.style?.left,0.5),y:f,position:Ol.Top};if(n?.side==="bottom")return{x:r+sy*DL(n.style?.left,0.5),y:f+Ry,position:Ol.Bottom};return{x:r,y:f+Ry/2,position:Ol.Left}}function _X(l){return{x:l.position.x+sy,y:l.position.y+Ry/2}}function AX(l,u){let r=Math.min(...l.nodes.map((w)=>w.position.x),0)-220,f=Math.min(...l.nodes.map((w)=>w.position.y),0)-220,n=Math.max(...l.nodes.map((w)=>w.position.x+sy),1)+220,t=Math.max(...l.nodes.map((w)=>w.position.y+Ry),1)+220,i=Math.ceil(n-r),y=Math.ceil(t-f),c=new Map(l.nodes.map((w)=>[w.id,w])),_=l.edges.map((w)=>xL(w.data?.edgeColor||w.style?.stroke)),F=Array.from(new Set(["#4eb7a8","#d7a13a","#cf6a54","#81939f",..._])).map((w)=>``).join(""),j=l.edges.flatMap((w)=>{let G=c.get(w.source),J=c.get(w.target);if(!G||!J)return[];let Q=_X(G),m=bL(J,String(w.targetHandle||"in-left")),q=oL(Q.x,Q.y,m.x,m.y,m.position,Number(w.data?.laneOffset||0),String(w.data?.routeMode||"")),W=xL(w.data?.edgeColor||w.style?.stroke),p=w.data?.isFeedback?' stroke-dasharray="9 7"':"";return``}).join(` `),N=l.nodes.map((w)=>{let G=w.data?.exportLabel||{},J=String(G.status||"pending").toLowerCase(),Q=J==="succeeded"?"#4eb7a8":J==="running"?"#d7a13a":J==="failed"?"#cf6a54":"#81939f",m=w.position.x,q=w.position.y,W=N$.map((p)=>{let O=bL(w,p.id);if(p.side==="top"||p.side==="bottom")return``;return``}).join(` `);return` @@ -270,7 +270,7 @@ html,body{width:${f}px!important;min-height:${n}px!important;overflow:hidden!imp ${uf(u)} ${N}${j} - `,width:i,height:y}}function FX(l){let u=String(l||"").toLowerCase();if(u==="succeeded"||u==="completed")return"#4eb7a8";if(u==="failed")return"#cf6a54";if(dL(u))return"#69aee8";return"#d7a13a"}function jX(l){let u=String(l?.kind||""),r=String(l?.tone||l?.status||"").toLowerCase();if(u==="prompt"&&r==="initial")return"#d7a13a";if(u==="prompt"&&r==="monitor")return"#69aee8";if(u==="prompt")return"#4eb7a8";if(r==="modify")return"#e0b95a";if(r==="approve"||r==="guide"||r==="monitor")return"#4eb7a8";if(r==="restart"||r==="redo")return"#d7a13a";if(r==="ignored")return"#81939f";if(r==="webui")return"#69aee8";if(r==="cli")return"#d7a13a";return"#a7bac5"}function vL(l){let u=String(l?.sourceKind||"").toLowerCase(),r=String(l?.action||"").toLowerCase(),f=String(l?.status||"").toLowerCase();if(r==="observe"||f==="observation"||u==="monitor")return"#4eb7a8";if(u==="webui")return"#69aee8";if(u==="cli")return"#d7a13a";if(f.includes("ignored"))return"#81939f";return"#8aa0ad"}function NX(l,u,r){let f=jX(l),n=String(l?.kind||"");if(n==="control-source")return``;if(n==="control-target"){let i=String(l?.tone||"").toLowerCase()==="approve"?"rgba(78,183,168,0.22)":"#081118";return``}return``}function JX(l){let u=Sl(l.visibleNodeIds).map((K)=>String(K||"")).filter(Boolean),r=Sl(l.intervals).filter(Xl),f=Sl(l.markers).filter(Xl),n=Sl(l.arrows).filter(Xl),t=Sl(l.ticks).filter(Xl),i=Xl(l.bounds)?l.bounds:{},y=Xl(l.backendLayout)?l.backendLayout:null,c=Math.max(240,Math.round(Number(l.chartHeight||360))),_=Math.max(On,108),A=128,F=24,j=58,N=56,U=128+Math.max(1,u.length)*_,w=Math.max(760,U+48),G=114+c+24,J=24,Q=58,m=114,q=(K)=>152+K*_,W=(K)=>q(K)+_/2,p=Sl(l.meta).map((K)=>String(K||"")).filter(Boolean).slice(0,4).join(" · "),O=new Map(f.map((K)=>[String(K.id||""),K])),V=Array.from(new Set(["#4eb7a8","#69aee8","#d7a13a","#cf6a54","#8aa0ad",...n.map(vL)])).map((K)=>``).join(""),P=t.map((K)=>{let X=114+QG(K,i,c,y);return` + `,width:i,height:y}}function FX(l){let u=String(l||"").toLowerCase();if(u==="succeeded"||u==="completed")return"#4eb7a8";if(u==="failed")return"#cf6a54";if(dL(u))return"#69aee8";return"#d7a13a"}function jX(l){let u=String(l?.kind||""),r=String(l?.tone||l?.status||"").toLowerCase();if(u==="prompt"&&r==="initial")return"#d7a13a";if(u==="prompt"&&r==="monitor")return"#69aee8";if(u==="prompt")return"#4eb7a8";if(r==="modify")return"#e0b95a";if(r==="approve"||r==="guide"||r==="monitor")return"#4eb7a8";if(r==="restart"||r==="redo")return"#d7a13a";if(r==="ignored")return"#81939f";if(r==="webui")return"#69aee8";if(r==="cli")return"#d7a13a";return"#a7bac5"}function vL(l){let u=String(l?.sourceKind||"").toLowerCase(),r=String(l?.action||"").toLowerCase(),f=String(l?.status||"").toLowerCase();if(r==="observe"||f==="observation"||u==="monitor")return"#4eb7a8";if(u==="webui")return"#69aee8";if(u==="cli")return"#d7a13a";if(f.includes("ignored"))return"#81939f";return"#8aa0ad"}function NX(l,u,r){let f=jX(l),n=String(l?.kind||"");if(n==="control-source")return``;if(n==="control-target"){let i=String(l?.tone||"").toLowerCase()==="approve"?"rgba(78,183,168,0.22)":"#081118";return``}return``}function JX(l){let u=Sl(l.visibleNodeIds).map((K)=>String(K||"")).filter(Boolean),r=Sl(l.intervals).filter(Xl),f=Sl(l.markers).filter(Xl),n=Sl(l.arrows).filter(Xl),t=Sl(l.ticks).filter(Xl),i=Xl(l.bounds)?l.bounds:{},y=Xl(l.backendLayout)?l.backendLayout:null,c=Math.max(240,Math.round(Number(l.chartHeight||360))),_=Math.max(On,108),A=128,F=24,j=58,N=56,U=128+Math.max(1,u.length)*_,w=Math.max(760,U+48),G=114+c+24,J=24,Q=58,m=114,q=(K)=>152+K*_,W=(K)=>q(K)+_/2,p=Sl(l.meta).map((K)=>String(K||"")).filter(Boolean).slice(0,4).join(" · "),O=new Map(f.map((K)=>[String(K.id||""),K])),V=Array.from(new Set(["#4eb7a8","#69aee8","#d7a13a","#cf6a54","#8aa0ad",...n.map(vL)])).map((K)=>``).join(""),P=t.map((K)=>{let X=114+QG(K,i,c,y);return` ${uf(Ll(K.ms))} +${uf(Xf(Number(K.offsetMs??Number(K.ms)-Number(i.startMs))))} @@ -281,7 +281,7 @@ html,body{width:${f}px!important;min-height:${n}px!important;overflow:hidden!imp node ${X+1} `})].join(` `),B=u.map((K,X)=>{return``}).join(` -`),C=r.map((K)=>{let X=u.indexOf(String(K.nodeId||""));if(X<0)return"";let I=114+J8(K,i,c,y),o=Math.max(2,UG(K,i,c,y)),fl=FX(K.status),yl=W(X)-3.5,h=K.live?``:"",s=o>=28?`${uf(String(K.status||"working"))} +`),C=r.map((K)=>{let X=u.indexOf(String(K.nodeId||""));if(X<0)return"";let I=114+U8(K,i,c,y),o=Math.max(2,UG(K,i,c,y)),fl=FX(K.status),yl=W(X)-3.5,h=K.live?``:"",s=o>=28?`${uf(String(K.status||"working"))} ${uf(Xf(K.durationMs))}`:"";return` ${h} @@ -289,7 +289,7 @@ html,body{width:${f}px!important;min-height:${n}px!important;overflow:hidden!imp `}).join(` `),E=f.map((K)=>{let X=u.indexOf(String(K.nodeId||""));if(X<0)return"";let I=114+wf(K,i,c,y);return NX(K,W(X),I)}).join(` `),D=n.map((K)=>{let X=O.get(String(K.targetMarkerId||""));if(!X)return"";let I=O.get(String(K.sourceMarkerId||"")),o=String(I?.nodeId||K.sourceNodeId||""),fl=String(X.nodeId||K.targetNodeId||""),yl=u.indexOf(o),h=u.indexOf(fl);if(yl<0||h<0)return"";let s=W(yl)-24-128,ul=W(h)-24-128,tl=xy(y)?hu(K.sourceY??K.y1)??(I?wf(I,i,c,y):wf(X,i,c,y)):I?wf(I,i,c,y):wf(X,i,c,y),Al=xy(y)?hu(K.targetY??K.y2)??wf(X,i,c,y):wf(X,i,c,y),Kl=vL(K),wl=String(K.action||"").toLowerCase()==="observe"?"3 4":"6 5",El=uf(mG(s,tl,ul,Al));return` - `}).join(` + `}).join(` `),Y=u.length===0?'No visible Gantt nodes':"";return{svg:` ${V} @@ -305,4 +305,4 @@ html,body{width:${f}px!important;min-height:${n}px!important;overflow:hidden!imp ${D} ${E} ${Y} - `,width:w,height:G}}function N8(l,u){let r=URL.createObjectURL(l),f=document.createElement("a");f.href=r,f.download=u,f.click(),setTimeout(()=>URL.revokeObjectURL(r),1000)}async function _G(l,u){let r=$G(u,"pipeline"),{svg:f,width:n,height:t}=AX(l,u),i=new Blob([f],{type:"image/svg+xml;charset=utf-8"}),y=URL.createObjectURL(i);try{let c=new Image;await new Promise((j,N)=>{c.onload=()=>j(),c.onerror=()=>N(Error("svg image load failed")),c.src=y});let _=document.createElement("canvas");_.width=n,_.height=t;let A=_.getContext("2d");if(!A)throw Error("canvas unavailable");A.drawImage(c,0,0);let F=await new Promise((j)=>_.toBlob(j,"image/png"));if(!F)throw Error("png export failed");N8(F,`${r}.png`)}catch{N8(i,`${r}.svg`)}finally{URL.revokeObjectURL(y)}}async function UX(l){let u=$G(String(l?.title||"pipeline-gantt"),"pipeline-gantt"),{svg:r,width:f,height:n}=JX(l),t=new Blob([r],{type:"image/svg+xml;charset=utf-8"}),i=URL.createObjectURL(t);try{let y=new Image;await new Promise((F,j)=>{y.onload=()=>F(),y.onerror=()=>j(Error("gantt svg image load failed")),y.src=i});let c=document.createElement("canvas");c.width=f,c.height=n;let _=c.getContext("2d");if(!_)throw Error("canvas unavailable");_.drawImage(y,0,0);let A=await new Promise((F)=>c.toBlob(F,"image/png"));if(!A)throw Error("gantt png export failed");N8(A,`${u}.png`)}catch{N8(t,`${u}.svg`)}finally{URL.revokeObjectURL(i)}}async function QX(l){for(let u of l){if(u.flow.nodes.length===0)continue;await _G(u.flow,u.title),await new Promise((r)=>setTimeout(r,750))}}function gL(l,u){return l.find((r)=>String(r?.pipelineId||"")===u)||null}function kL(l){return dl(l?.startedAt)??dl(l?.artifact?.startedAt)??dl(l?.request?.createdAt)??dl(l?.updatedAt)??0}function mX(l,u){return l.filter((r)=>String(r?.pipelineId||"")===u).slice().sort((r,f)=>kL(r)-kL(f)||String(r?.runId||"").localeCompare(String(f?.runId||"")))}function sF(l,u){let r=String(u?.runId||""),f=l.findIndex((i)=>String(i?.runId||"")===r),n=f>=0?f+1:l.length,t=String(u?.status||"--");return`Epoch ${n} / ${r||"--"} / ${t}`}function Pf(l){return String(l?.procedureRunId||l?.runId||"")}function m8(l,u){let r=String(l?.nodeId||l?.request?.nodeId||"");if(r)return r;let f=Pf(l),n=`${u}__`;if(f.startsWith(n))return f.slice(n.length).replace(/__\d+$/u,"");return""}function t8(l,u){let r=Xl(l?.artifact)?l.artifact:{},f=Xl(l?.request)?l.request:{};return m$(l?.startedAt,r.startedAt,f.createdAt,f.startedAt,l?.createdAt,l?.updatedAt,u?.startedAt,u?.request?.createdAt)}function i8(l,u){let r=String(l?.status?.status||l?.artifact?.status||l?.status||"").toLowerCase(),f=Xl(l?.artifact)?l.artifact:{},n=vF(r);return m$(l?.finishedAt,f.finishedAt,l?.completedAt,n?l?.updatedAt:void 0,n?f.updatedAt:void 0,n?u?.updatedAt:void 0)}function AG(l,u,r=Date.now()){let f=String(l?.runId||""),n=new Set(u.map((t)=>String(t?.id||"")).filter(Boolean));return Sl(l?.procedureRuns).flatMap((t)=>{let i=m8(t,f);if(!i)return[];let y=String(t?.status?.status||t?.artifact?.status||t?.status||"unknown").toLowerCase(),c=t8(t,l),_=dl(c);if(_===null)return[];let A=i8(t,l),F=dl(A)??(vF(y)?dl(t?.updatedAt)??_+1000:r),j=Math.max(_+1000,F);return[{nodeId:i,knownNode:n.has(i),procedureRunId:Pf(t),status:y,startMs:_,endMs:j,startedAt:J$(_),finishedAt:J$(j),durationMs:j-_,runId:f,raw:t}]}).sort((t,i)=>t.startMs-i.startMs||t.endMs-i.endMs||t.nodeId.localeCompare(i.nodeId))}function wX(l,u,r=[]){let f=u.map((A)=>Number(A.startMs)).filter(Number.isFinite),n=u.map((A)=>Number(A.endMs)).filter(Number.isFinite);for(let A of r){let F=hu(A?.eventMs??A?.ms);if(F!==null)f.push(F),n.push(F)}let t=dl(l?.startedAt)??dl(l?.artifact?.startedAt)??dl(l?.request?.createdAt),i=dl(l?.finishedAt)??dl(l?.artifact?.finishedAt)??dl(l?.updatedAt);if(t!==null)f.push(t);if(i!==null)n.push(i);let y=Date.now(),c=f.length>0?Math.min(...f):y-60000,_=Math.max(c+60000,n.length>0?Math.max(...n):y);return{startMs:c,endMs:_,durationMs:_-c}}var y8=12,FG=20,RF=100,qX=!1;function Ai(l){let u=Number(l);if(!Number.isFinite(u))return 0;return Math.max(0,Math.min(100,Math.round(u*100)/100))}function LX(l){let u=Math.max(y8,Number(l||y8)),r=Math.log(u/y8)/Math.log(FG);return Ai(r*100)}var Q$=LX(RF);function dF(l){let u=Ai(l)/100,r=y8*Math.pow(FG,u),f=u<0.24?"全局":u<0.64?"均衡":"细节";return{value:Ai(u*100),pxPerMinute:r,label:f}}function SF(l){let u=Math.round(Number(l));return Math.abs(u-RF)<=1?RF:u}function GX(l,u=Q$){let r=Math.max(1,Number(l.durationMs||0)/60000),f=dF(u);return Math.round(Math.max(360,Math.min(7200,r*Number(f.pxPerMinute||48))))}function WX(l,u=7){let r=Math.max(1,Number(l.endMs||0)-Number(l.startMs||0));return Array.from({length:u},(f,n)=>{let t=u===1?0:n/(u-1);return{ms:Number(l.startMs)+r*t,percent:t*100}})}function TX(l,u){let r=Math.max(1,Number(u.endMs)-Number(u.startMs));return Math.max(0,Math.min(100,(l-Number(u.startMs))/r*100))}function hu(l){let u=Number(l);return Number.isFinite(u)?u:null}function eF(l){return dL(l?.status)&&!vF(l?.status)}function jG(l,u,r,f){let n=Math.max(1,r-u),t=Math.max(0,Math.min(1,(l-u)/n));return Number((t*f).toFixed(3))}function IL(l,u){if(!u)return null;let r=hu(u?.startMs),f=hu(u?.endMs),n=hu(u?.chartHeight);if(r===null||f===null||n===null)return null;return jG(l,r,f,n)}function NG(l,u){let r=hu(l?.rawStartMs??l?.startMs)??hu(l?.startMs)??u,f=hu(l?.endMs)??r+1000;if(!eF(l))return Math.max(r+1000,f);return Math.max(r+1000,f,u)}function KX(l,u,r,f){let n=hu(l?.startMs)??f-60000,t=hu(l?.endMs)??f,i=r.reduce((U,w)=>Math.max(U,NG(w,f)),t),y=Math.max(n+60000,t,i),c=Math.max(1,y-n),_={startMs:n,endMs:y,durationMs:c},A=GX(_,u),F=dF(u),j=Math.max(5,Math.min(18,Math.round(A/150))),N=WX(_,j).map((U)=>{let w=Number(U.ms),G=jG(w,n,y,A);return{...U,y:G,timestamp:J$(w),offsetMs:w-n}});return{source:"frontend-y",startMs:n,endMs:y,durationMs:c,chartHeight:A,scale:Ai(u),normalizedScale:Number((Ai(u)/100).toFixed(3)),pxPerMinute:Number(Number(F.pxPerMinute||0).toFixed(3)),ticks:N}}function EX(l,u,r){if(!eF(l))return l;let f=hu(l?.rawStartMs??l?.startMs)??hu(l?.startMs)??r,n=NG(l,r),t=IL(f,u),i=IL(n,u),y=hu(t??l?.y1??l?.startY)??0,c=hu(i??l?.y2??l?.endY)??y+10,_=Math.max(24,c-y);return{...l,live:!0,startMs:f,endMs:n,durationMs:Math.max(1000,n-f),finishedAt:J$(n),y1:y,y2:c,startY:y,endY:c,height:_}}function lj(l,u,r){return TX(l,u)/100*r}function xy(l){return Boolean(l&&String(l?.source||"")!=="frontend-y")}function JG(l,u,r,f,n){if(xy(f))for(let i of n){let y=hu(l?.[i]);if(y!==null)return y}let t=hu(l?.ms??l?.eventMs??l?.startMs);return lj(t??Number(u.startMs),u,r)}function J8(l,u,r,f){return JG(l,u,r,f,["y1","startY"])}function xF(l,u,r,f){if(xy(f)){let t=hu(l?.y2??l?.endY);if(t!==null)return t}let n=hu(l?.endMs)??Number(u.endMs);return lj(n,u,r)}function UG(l,u,r,f){if(xy(f)){let t=hu(l?.height);if(t!==null)return Math.max(1,t)}let n=l?.live?24:10;return Math.max(n,xF(l,u,r,f)-J8(l,u,r,f))}function wf(l,u,r,f){return JG(l,u,r,f,["y","timeAxisY"])}function QG(l,u,r,f){if(xy(f)||String(f?.source||"")==="frontend-y"){let i=hu(l?.y);if(i!==null)return i}let n=hu(l?.percent);if(n!==null)return n/100*r;let t=hu(l?.ms)??Number(u.startMs);return lj(t,u,r)}function pX(l){let u=String(l?.promptEvent||l?.raw?.promptEvent||l?.event||"").toLowerCase();if(!["node-long-running-observation","node-finished"].includes(u))return"";let r=String(l?.sourceNodeId||l?.raw?.sourceNodeId||l?.raw?.detail?.nodeId||""),f=String(l?.nodeId||l?.targetNodeId||"");return r&&r!==f?r:""}function zX(l,u){let r=new Set(u.map((n)=>[String(n.sourceNodeId||""),String(n.targetNodeId||""),String(n.targetMarkerId||""),String(n.action||"")].join(":"))),f=[...u];for(let n of l){let t=pX(n),i=String(n?.nodeId||""),y=String(n?.id||"");if(!t||!i||!y)continue;let c=[t,i,y,"observe"].join(":");if(r.has(c))continue;r.add(c),f.push({id:`observation-arrow:${y}:${t}:${i}`,commandId:String(n?.commandId||n?.eventId||y),sourceNodeId:t,targetNodeId:i,sourceMarkerId:"",targetMarkerId:y,sourceKind:"monitor",action:"observe",status:"observation"})}return{markers:l,arrows:f}}function OX(l){let u=yn(l),r=String(l?.promptEvent||"");if(u==="initial-prompt-delivered")return"initial";if(r==="node-finished"||r==="node-long-running-observation"||r.startsWith("monitor-"))return"monitor";if(u==="monitor-prompt-delivered"||String(l?.sourceKind||"").toLowerCase()==="monitor")return"monitor";return"append"}function ZX(l){return Sl(l?.tags||l?.raw?.tags).map((u)=>String(u||"")).filter(Boolean)}function HX(l){let u=yn(l),r=String(l?.promptEvent||"");if(u==="initial-prompt-delivered")return"初始 prompt";if(r==="node-long-running-observation")return"长任务观察";if(r==="node-finished")return ZX(l).includes("monitor.audit")?"节点完成 / OA 审核":"节点完成";if(r==="monitor-interval")return"Monitor observation";if(r==="monitor-start")return"Monitor start";if(r==="monitor-stop")return"Monitor stop";if(u==="monitor-prompt-delivered")return"Monitor prompt";if(u==="append-prompt-queued")return"追加 prompt 已排队";return"追加 prompt"}function aL(l){let u=yn(l);if(u==="control-command-applied")return 3;if(u==="control-command-ignored")return 2;if(u==="control-command-queued")return 1;return 0}function BX(l,u){let r=String(l?.commandId||"");if(r)return`command:${r}`;return["control-event",My(l)||m$(l?.createdAt,l?.timestamp)||`index-${u}`,String(l?.sourceKind||""),String(l?.sourceNodeId||""),String(l?.targetNodeId||""),$0(l)].join(":")}function DX(l){return hF([l?.targetNodeId,...Sl(l?.resetNodeIds)])}function VX(l,u){let r=j$(l),f=yn(l),n=String(l?.targetNodeId||""),t=Boolean(n)&&u!==n;if(f==="control-command-applied")return t?`${r} 波及`:`${r} 生效`;if(f==="control-command-ignored")return`${r} 忽略`;if(f==="control-command-queued")return`${r} 已发起`;return t?`${r} 波及`:r}function SX(l){if(yn(l)==="control-command-ignored")return"ignored";let r=$0(l);if(r==="restart"||r==="redo")return"restart";if(r==="modify")return"modify";if(r==="approve")return"approve";if(r==="guide")return"guide";return"pending"}function YX(l){let u=String(l?.sourceKind||"").toLowerCase();if(u==="monitor")return"monitor";if(u==="webui")return"webui";if(u==="cli")return"cli";return"system"}function XX(l,u,r,f){let n=l.filter((_)=>String(_.nodeId||"")===u).sort((_,A)=>Number(_.startMs)-Number(A.startMs)),t=n.find((_)=>r>=Number(_.startMs)-1000&&r<=Number(_.endMs)+1000);if(t)return{ms:r,onInterval:!0,snapReason:"inside-interval",procedureRunId:String(t.procedureRunId||"")};let i=$0(f),y=n.slice().reverse().find((_)=>Number(_.endMs)<=r+1000);if(y&&i==="approve")return{ms:Number(y.endMs),onInterval:!0,snapReason:"previous-interval-end",procedureRunId:String(y.procedureRunId||"")};let c=n.find((_)=>Number(_.startMs)>=r-1000);if(c&&["guide","modify","restart","redo"].includes(i))return{ms:Number(c.startMs),onInterval:!0,snapReason:"next-interval-start",procedureRunId:String(c.procedureRunId||"")};return{ms:r,onInterval:!1,snapReason:"event-time",procedureRunId:String(f?.procedureRunId||"")}}function mG(l,u,r,f){let n=Math.hypot(r-l,f-u),t=n>BL?BL:0,i=t>0?r-(r-l)/n*t:r,y=t>0?f-(f-u)/n*t:f,c=i-l,_=Math.max(16,Math.min(42,Math.abs(c)*0.45+12)),A=c===0?1:Math.sign(c);return`M ${l},${u} C ${l+A*_},${u} ${i-A*_},${y} ${i},${y}`}function PX(l,u){let r=String(l?.runId||u?.runId||""),f=AG({...Xl(u)?u:{},...Xl(l)?l:{},runId:r,procedureRuns:Sl(l?.procedureRuns).length>0?l.procedureRuns:u?.procedureRuns},[]),n=[],t=[],i=[],y=new Set,c=new Map,_=(j,N)=>{if(!j.nodeId||!Number.isFinite(Number(j.ms)))return;if(y.has(j.id))return;y.add(j.id),N.push(j)};for(let j of Sl(l?.procedureRuns)){let N=m8(j,r),U=Pf(j);if(!N)continue;for(let w of Sl(j?.attempts)){let G=Q8(w);for(let J of CF(w?.controlEventRecords)){let Q=yn(J);if(!["initial-prompt-delivered","append-prompt-delivered","monitor-prompt-delivered"].includes(Q))continue;let m=My(J),q=dl(m);if(q===null)continue;let W=String(J?.eventId||"");_({id:`prompt:${W||`${U}:${G}:${Q}:${q}`}`,runId:r,nodeId:N,procedureRunId:U,attempt:G,kind:"prompt",tone:OX(J),status:"delivered",label:HX(J),ms:q,timestampIso:m,sourceKind:String(J?.sourceKind||""),sourceNodeId:String(J?.sourceNodeId||""),targetNodeId:N,action:"",eventId:W,commandId:String(J?.commandId||""),raw:J},n)}}}let A=new Map;CF(l?.controlEvents).forEach((j,N)=>{let U=BX(j,N),w=A.get(U)||{key:U,events:[]};w.events.push(j),A.set(U,w)});for(let j of A.values()){let N=Sl(j.events).slice().sort((H,B)=>aL(B)-aL(H)),U=Sl(j.events).find((H)=>yn(H)==="control-command-queued")||null,w=N[0]||U;if(!U&&!w)continue;let G=String(U?.sourceNodeId||w?.sourceNodeId||""),J=String(U?.sourceKind||w?.sourceKind||""),Q=My(U)||My(w)||m$(U?.createdAt,w?.createdAt),m=dl(Q),q=String(w?.commandId||U?.commandId||j.key),W=(yn(w)||"control-command-queued").replace(/^control-command-/u,""),p="";if(G&&m!==null)p=`control-source:${q}:${G}`,c.set(q,p),_({id:p,runId:r,nodeId:G,procedureRunId:String(U?.procedureRunId||w?.procedureRunId||""),attempt:"",kind:"control-source",tone:YX(U||w),status:W,label:`${j$(U||w)} 发起`,ms:m,timestampIso:Q,action:$0(U||w),sourceKind:J,sourceNodeId:G,targetNodeId:String(w?.targetNodeId||U?.targetNodeId||""),commandId:q,raw:U||w},t);let O=w||U,Z=My(O)||Q,V=dl(Z);if(V===null)continue;let P=DX(O);for(let H of P){let B=XX(f,H,V,O),C=`control-target:${q}:${H}`;if(_({id:C,runId:r,nodeId:H,procedureRunId:B.procedureRunId,attempt:"",kind:"control-target",tone:SX(O),status:W,label:VX(O,H),ms:B.ms,eventMs:V,onInterval:B.onInterval,snapReason:B.snapReason,snapped:Number(B.ms)!==V,timestampIso:Z,renderedTimestampIso:J$(Number(B.ms)),action:$0(O),sourceKind:J,sourceNodeId:G,targetNodeId:H,commandId:q,raw:O},t),p&&G&&G!==H)i.push({id:`control-arrow:${q}:${G}:${H}`,commandId:q,sourceNodeId:G,targetNodeId:H,sourceMarkerId:p,targetMarkerId:C,sourceKind:J,action:$0(O),status:W})}}let F=[...n,...t].sort((j,N)=>Number(j.ms)-Number(N.ms)||String(j.nodeId).localeCompare(String(N.nodeId))||String(j.id).localeCompare(String(N.id)));return{...zX(F,i),sourceMarkerByCommand:c}}function CX({details:l,selectedNodeId:u,selectedNodeRuntime:r,control:f,onRaw:n}){if(!l)return T("span",{className:"muted"},"点击“抓取过程”读取 node 运行材料;主界面只显示结构化摘要,完整内容需点开原始 JSON。");let t=Sl(l.procedureRuns),i=t.at(-1)||{},y=Sl(i.attempts),c=y.at(-1)||{},_=Sl(i.workerLogTail),A=Sl(c.controlEventsTail),F=Sl(c.controlPromptsTail),j=Sl(c.monitorPromptsTail),N=HF(A),U=HF(F),w=HF(j),G=c.opencodeMessages||{};return T("div",{className:"pipeline-evidence-list compact"},T(Yf,{title:"Node runtime",subtitle:u||"--",facts:[`status ${r?.status||"pending"}`,`attempts ${r?.attempts??y.length}`,`procedure ${r?.currentProcedureRunId||Pf(i)||"--"}`,f.fetchedAt?`fetched ${iu(f.fetchedAt)}`:"not fetched"],data:l.node||l,onRaw:n,testId:"raw-pipeline-node-runtime"}),T(Yf,{title:"Procedure runs",subtitle:`${t.length} groups`,facts:[`latest ${i.status?.status||i.status||"--"}`,`steps ${Sl(i.recentSteps).length}`,`duration ${Xf(dl(i.finishedAt)&&dl(i.startedAt)?Number(dl(i.finishedAt))-Number(dl(i.startedAt)):i.durationMs)}`],data:t,onRaw:n,testId:"raw-pipeline-node-procedures"}),T(Yf,{title:"OpenCode messages",subtitle:String(G.exists?"available":"not indexed"),facts:[`messages ${$8(G.messageCount)}`,`size ${$8(G.size)}`,`updated ${Ll(G.updatedAt)}`],data:G,onRaw:n,testId:"raw-pipeline-node-messages"}),T(Yf,{title:"Control prompts",subtitle:"manual / monitor append queues",facts:[`manual tail ${U.total}`,`monitor tail ${w.total}`,`last ${Ll(bF(U.lastAt,w.lastAt))}`],data:{controlPromptsTail:F,monitorPromptsTail:j},onRaw:n,testId:"raw-pipeline-node-prompts"}),T(Yf,{title:"Control events",subtitle:N.eventKinds.length>0?N.eventKinds.join(", "):"event tail",facts:[`tail ${N.total}`,`parsed ${N.parsed}`,`last ${Ll(N.lastAt)}`],data:A,onRaw:n,testId:"raw-pipeline-node-events"}),T(Yf,{title:"Worker log",subtitle:"tail is hidden on main canvas",facts:[`tail ${_.length} lines`,"raw only via button",`procedure ${Pf(i)||"--"}`],data:_,onRaw:n,testId:"raw-pipeline-node-worker-log"}))}function hX({activeRun:l,onRaw:u}){if(!l)return T(qf,{title:"暂无运行材料",text:"没有 Pipeline epoch 时不会展示运行材料索引。"});let r=Sl(l.nodes),f=Sl(l.procedureRuns),n=Sl(l.submissions),t=Sl(l.workerLogTail),i=SL(r),y=SL(f),c=f.filter((A)=>String(A?.status||"").toLowerCase()==="failed"),_=bF(...f.flatMap((A)=>[A.updatedAt,A.finishedAt,A.startedAt]));return T("div",{className:"pipeline-evidence-list"},T(Yf,{title:"Epoch overview",subtitle:l.runId||"--",facts:[`pipeline ${l.pipelineId||"--"}`,`status ${l.status||"--"}`,`started ${Ll(l.startedAt)}`,`updated ${Ll(l.updatedAt)}`],data:l,onRaw:u,testId:"raw-pipeline-run"}),T(Yf,{title:"Node states",subtitle:`${r.length} nodes`,facts:[`running ${i.running||0}`,`succeeded ${i.succeeded||0}`,`failed ${i.failed||0}`,`pending ${i.pending||0}`],data:r,onRaw:u,testId:"raw-pipeline-run-nodes"}),T(Yf,{title:"Procedure run index",subtitle:`${f.length} procedure records`,facts:[`succeeded ${y.succeeded||0}`,`failed ${y.failed||0}`,`latest ${Ll(_)}`,`errors ${c.length}`],data:f,onRaw:u,testId:"raw-pipeline-run-procedures"}),T(Yf,{title:"OA submissions",subtitle:`${n.length} submission files`,facts:[`records ${n.length}`,`task ${$8(l.task)}`,"raw grouped by run"],data:n,onRaw:u,testId:"raw-pipeline-run-submissions"}),T(Yf,{title:"Worker log tail",subtitle:"hidden from main interface",facts:[`tail ${t.length} lines`,"display raw only after click",`updated ${Ll(l.updatedAt)}`],data:t,onRaw:u,testId:"raw-pipeline-run-worker-log"}))}function MX({diagnostics:l,onRaw:u}){let r=Sl(l?.runs).filter(Xl),f=Sl(l?.forbiddenResiduals),n=Xl(l?.guarantees)?l.guarantees:{},t=l?.hasNeutralNodeFinishedEvidence===!0&&l?.hasNoAuditPolicyEvidence===!0&&l?.hasAuditPolicyEvidence===!0,i=l?.ok===!0&&t&&f.length===0,y=r[0]||null,c=[{label:"中性完成事实",ok:n.neutralNodeFinished===!0,hint:"node-finished 不携带流程策略"},{label:"Config 策略判定",ok:n.auditPolicyFromConfig===!0,hint:"OA backend 读取当前 epoch 配置"},{label:"控制命令来自 OA",ok:n.runnerConsumesControlCommandsFromOaEvents===!0,hint:"runner 只消费 OA control.command"},{label:"无独立审核事件",ok:n.noIndependentAuditRequestEvent===!0,hint:"审核由 node-finished + policy 派生"},{label:"无批次门禁",ok:n.noBatchFinishedControlGate===!0,hint:"下游启动由每个 node 完成驱动"}];return T("div",{className:"pipeline-oa-panel","data-testid":"pipeline-oa-event-flow-panel"},T("div",{className:"metric-grid compact"},T(sr,{label:"OA Flow",value:i?"100%":"--",hint:String(l?.mode||"waiting diagnostics"),tone:i?"ok":"warn"}),T(sr,{label:"禁止残留",value:f.length,hint:f.length===0?"source scan clean":"needs cleanup",tone:f.length===0?"ok":"warn"}),T(sr,{label:"No-audit",value:l?.hasNoAuditPolicyEvidence?"OK":"--",hint:"OA 下游策略证据",tone:l?.hasNoAuditPolicyEvidence?"ok":"warn"}),T(sr,{label:"Monitor 审核",value:l?.hasAuditPolicyEvidence?"OK":"--",hint:"OA 控制事件闭环",tone:l?.hasAuditPolicyEvidence?"ok":"warn"})),T("div",{className:"pipeline-oa-guarantees"},c.map((_)=>T("article",{key:_.label,className:`pipeline-oa-guarantee ${_.ok?"ok":"warn"}`},T(_i,{status:_.ok?"online":"warn"},_.ok?"OK":"MISS"),T("div",null,T("strong",null,_.label),T("span",null,_.hint))))),T("div",{className:"pipeline-evidence-list compact"},r.slice(0,6).map((_)=>T(Yf,{key:_.runId,title:String(_.runId||"--"),subtitle:[Number(_.monitorAuditNodeFinishedCount||0)>0?"monitor audit":"",Number(_.noAuditPolicyCount||0)>0?"no-audit policy":""].filter(Boolean).join(" / ")||"event evidence",facts:[`events ${_.eventCount||0}`,`node-finished ${_.nodeFinishedCount||0}`,`policy-in-detail ${_.nodeFinishedWithPolicyCount||0}`,`queued ${_.controlQueuedCount||0}`,`applied ${_.controlAppliedCount||0}`],data:_,onRaw:u,testId:`raw-pipeline-oa-run-${String(_.runId||"run").replace(/[^a-zA-Z0-9_.-]+/g,"-")}`}))),y?T("p",{className:"muted paragraph"},`最新证据 ${y.runId}: ${y.nodeFinishedCount||0} 个 node-finished,${y.controlAppliedCount||0} 个控制结果。`):T(qf,{title:"暂无 OA 事件流证据",text:"等待 Pipeline backend 暴露 diagnostics。"}),l?T("div",{className:"panel-actions inline-actions"},T(cn,{title:"Pipeline OA Event Flow Diagnostics",data:l,onOpen:u,testId:"raw-pipeline-oa-event-flow"})):null)}function sX({quota:l,onRaw:u}){let r=Xl(l?.summary)?l.summary:{},f=Xl(l?.target)?l.target:{},n=Xl(l?.cache)?l.cache:{},t=l?.ok===!0,i=String(l?.modelId||r.modelName||f.modelName||"MiniMax-M2.7"),y=r.totalCount??f.currentIntervalTotalCount,c=r.usageCount??f.currentIntervalUsageCount,_=r.remainingCount??f.currentIntervalRemainingCount,A=r.remainingRatio??(Number.isFinite(Number(y))&&Number(y)>0&&Number.isFinite(Number(_))?Number(_)/Number(y):void 0),F=r.usageRatio??(Number.isFinite(Number(y))&&Number(y)>0&&Number.isFinite(Number(c))?Number(c)/Number(y):void 0),j=r.resetAt||f.endAt,N=r.remainsMs??f.remainsMs,U=Number(_),w=!t||Number.isFinite(U)&&U<=0?"warn":"ok",G=[t?`endpoint ${l?.endpoint||"--"}`:"quota unavailable",`fetched ${c8(l?.fetchedAt)}`,n.hit?`cache ${Xf(n.ageMs)}`:"live quota"];return T("div",{className:"pipeline-minimax-quota-panel","data-testid":"pipeline-minimax-quota-panel"},T("div",{className:"metric-grid compact"},T(sr,{label:"MiniMax",value:t?i:"--",hint:l?.modelComponent||l?.error||"model/minimax-m27",tone:w}),T(sr,{label:"当前窗口",value:`${ZF(c)}/${ZF(y)}`,hint:`已用 ${VL(F)}`,tone:w}),T(sr,{label:"剩余额度",value:ZF(_),hint:`剩余 ${VL(A)}`,tone:w}),T(sr,{label:"重置时间",value:c8(j),hint:N!==void 0?`约 ${Xf(N)}`:Ll(j),tone:w})),T(gF,{items:G}),t?T("p",{className:"muted paragraph"},`MiniMax 限额来自 D601 Pipeline 后端实时查询;当前模型匹配 ${r.modelName||f.modelName||i}。`):T(el,{error:l?.error||"MiniMax 限额查询失败"}),l?T("div",{className:"panel-actions inline-actions"},T(cn,{title:"Pipeline MiniMax Quota",data:l,onOpen:u,testId:"raw-pipeline-minimax-quota"})):null)}function RX({epochs:l,activeRun:u,activePipeline:r,pipelineNodes:f,pipelineEdges:n,runDetails:t,nodeDetails:i,nodeDetailsState:y,ganttScale:c=Q$,onGanttScaleChange:_,onRunChange:A,onIntervalSelect:F,onMarkerSelect:j,selection:N,detailOpen:U,onDetailOpenChange:w,onRaw:G}){let[J,Q]=lf(qX),[m,q]=lf({startY:0,endY:0,startMs:0,endMs:0}),[W,p]=lf(Date.now()),O=ci(null),Z=String(u?.runId||""),V=Boolean(U),P=(Nl)=>{if(typeof w==="function")w(Nl)},H=Ai(c??Q$),B=String(t?.runId||"")===Z?t?.details:null,C=B?{...Xl(u)?u:{},...Xl(B)?B:{},runId:Z,procedureRuns:Sl(B?.procedureRuns).length>0?B.procedureRuns:u?.procedureRuns}:u,E=AG(C,f,W),D=B?PX(B,C):{markers:[],arrows:[]},Y=Sl(D.markers),v=wX(C,E,Y),K=KX(v,H,E,W),X=String(K.source||"frontend-y"),I=E.map((Nl)=>EX(Nl,K,W)),o={startMs:Number(K.startMs),endMs:Number(K.endMs),durationMs:Math.max(1,Number(K.durationMs??Number(K.endMs)-Number(K.startMs)))},fl=dF(H),yl={...fl,pxPerMinute:Number(K.pxPerMinute??fl.pxPerMinute)},h=Math.round(Number(K.chartHeight||360)),s=E.some(eF);Hn(()=>{if(!Z||!s)return;let Nl=window.setInterval(()=>p(Date.now()),1000);return()=>window.clearInterval(Nl)},[Z,s]);let ul=$X(r,f,Array.isArray(n)?n:[]),tl=f.map((Nl)=>String(Nl?.id||"")).filter(Boolean),Al=I.map((Nl)=>String(Nl.nodeId||"")).filter(Boolean),Kl=Y.map((Nl)=>String(Nl.nodeId||"")).filter(Boolean),wl=Array.from(new Set([...ul,...tl,...Al,...Kl])),El={startY:0,endY:h,startMs:Number(o.startMs),endMs:Number(o.endMs)},M=Number(m?.endY||0)>0?m:El,d=(Nl)=>{return J8(Nl,o,h,K)<=Number(M.endY)&&xF(Nl,o,h,K)>=Number(M.startY)},nl=(Nl)=>{let al=wf(Nl,o,h,K);return al>=Number(M.startY)&&al<=Number(M.endY)},k=new Set(wl.filter((Nl)=>I.some((al)=>al.nodeId===Nl&&d(al))||Y.some((al)=>al.nodeId===Nl&&nl(al)))),g=J?wl.filter((Nl)=>k.has(Nl)):wl,cl=`${zF}px ${g.length>0?g.map(()=>`${On}px`).join(" "):"minmax(160px, 1fr)"}`,pl=Sl(K.ticks).filter(Xl),Hl=String(N?.mode==="interval"?N?.interval?.procedureRunId||"":""),bl=String(N?.mode==="event"?N?.marker?.id||"":""),_u=()=>{let Nl=O.current;if(!Nl){q(El);return}let al=Math.max(0,Nl.scrollTop-OF),gu=Math.max(120,Nl.clientHeight-OF),hl=Math.min(h,al+gu),yr={startY:al,endY:hl,startMs:Number(o.startMs),endMs:Number(o.endMs)},Zr=Math.max(0,Math.min(1,al/h)),cr=Math.max(Zr,Math.min(1,hl/h)),ku=Math.max(1,Number(o.endMs)-Number(o.startMs));yr.startMs=Number(o.startMs)+ku*Zr,yr.endMs=Number(o.startMs)+ku*cr,q(yr)};Hn(()=>{let Nl=O.current,al=window.setTimeout(_u,0);return Nl?.addEventListener("scroll",_u),window.addEventListener("resize",_u),()=>{window.clearTimeout(al),Nl?.removeEventListener("scroll",_u),window.removeEventListener("resize",_u)}},[Z,o.startMs,o.endMs,h]);let tu=Math.max(0,wl.length-g.length),Nu=new Set(Y.filter((Nl)=>g.includes(String(Nl.nodeId||""))&&nl(Nl)).map((Nl)=>String(Nl.id))),gl=new Map(Y.map((Nl)=>[String(Nl.id),Nl])),zr=Sl(D.arrows).filter((Nl)=>{if(!Nu.has(String(Nl.targetMarkerId||"")))return!1;if(String(Nl.action||"")==="observe")return g.includes(String(Nl.sourceNodeId||""));return Nu.has(String(Nl.sourceMarkerId||""))}),nf=zF+Math.max(1,g.length)*On,lr=(Nl)=>{let al=Ai(Nl.target.value);if(typeof _==="function")_(al);window.setTimeout(_u,0)},tf=()=>UX({title:`${r?.id||"pipeline"}-${Z||"epoch"}-gantt`,meta:[`run ${Z||"--"}`,`${Ll(o.startMs)} -> ${Ll(o.endMs)}`,`duration ${Xf(o.durationMs)}`,`${yl.label} / ${SF(yl.pxPerMinute)} px/min`,`${g.length}/${wl.length} nodes`,`${Y.length} markers`],visibleNodeIds:g,intervals:I,markers:Y.filter((Nl)=>g.includes(String(Nl.nodeId||""))),arrows:zr,ticks:pl,bounds:o,chartHeight:h,backendLayout:K}),Or=Xl(B?.gantt?.diagnostics)?B.gantt.diagnostics:null;return T(Zn,{title:"Epoch 甘特图",eyebrow:`${r?.id||"pipeline"} / ${l.length} epochs`,className:"pipeline-wide-panel",loading:t?.loading,actions:T("div",{className:"pipeline-gantt-actions"},T("select",{value:Z,disabled:l.length===0,onChange:(Nl)=>A(Nl.target.value),"data-testid":"pipeline-epoch-select"},l.map((Nl)=>T("option",{key:Nl.runId,value:Nl.runId},sF(l,Nl)))),T("label",{className:"pipeline-gantt-toggle"},T("input",{type:"checkbox","data-testid":"pipeline-gantt-auto-hide-idle",checked:J,onChange:(Nl)=>{Q(Boolean(Nl.target.checked)),window.setTimeout(_u,0)}}),T("span",null,"自动隐藏空闲列")),T("label",{className:"pipeline-gantt-scale"},T("span",null,T("b",null,"时间尺度"),T("em",{"data-testid":"pipeline-gantt-scale-label"},`${yl.label} · ${SF(yl.pxPerMinute)} px/min`)),T("input",{type:"range",min:0,max:100,step:0.01,value:H,onChange:lr,"aria-label":"调整甘特图时间尺度","data-testid":"pipeline-gantt-time-scale"}),T("small",null,T("span",null,"全局"),T("span",null,"细节"))),u?T("button",{type:"button",className:"ghost-btn",onClick:tf,disabled:g.length===0,"data-testid":"pipeline-export-gantt"},"导出甘特图"):null,u?T(cn,{title:`Pipeline Epoch ${u.runId}`,data:u,onOpen:G,testId:"raw-pipeline-epoch-gantt"}):null)},!u?T(qf,{title:"暂无 Epoch",text:"当前 pipeline 还没有完整运行记录。"}):I.length===0?T(qf,{title:"暂无时间区间",text:"等待 D601 Pipeline backend 在 procedure summary 中返回 startedAt / finishedAt。"}):T("div",{className:"pipeline-gantt-wrap"},T("div",{className:`pipeline-gantt-detail-layout ${V?"detail-open":"detail-collapsed"}`,"data-testid":"pipeline-gantt-detail-layout","data-sidebar-open":V?"true":"false"},T("div",{className:"pipeline-gantt-main"},T("div",{className:"pipeline-gantt-main-head"},T("div",{className:"pipeline-gantt-meta"},T("span",null,`time ${Ll(o.startMs)} -> ${Ll(o.endMs)}`),T("span",null,`duration ${Xf(o.durationMs)}`),T("span",null,`scale ${yl.label} / ${SF(yl.pxPerMinute)} px/min`),T("span",null,`layout ${X}`),Or?T("span",null,`align ${Or.timeAxisAlignmentOk===!1?"check":"ok"}`):null,T("span",null,`visible ${g.length}/${wl.length} nodes`),B?T("span",null,`markers ${Y.length}`):null,J&&tu>0?T("span",null,`hidden idle ${tu}`):null),!V?T("button",{type:"button",className:"pipeline-sidecar-tab right",disabled:!N?.mode,onClick:()=>P(!0),"data-testid":"pipeline-gantt-sidebar-toggle"},N?.mode?"展开详情":"点击甘特图元素展开详情"):null),T("div",{className:"pipeline-gantt-viewport",ref:O,"data-testid":"pipeline-epoch-gantt","data-pipeline-id":r?.id||"","data-run-id":Z,"data-layout-source":X,"data-start-ms":String(o.startMs),"data-end-ms":String(o.endMs),"data-chart-height":String(h)},T("div",{className:"pipeline-gantt-board",style:{gridTemplateColumns:cl,minWidth:`${nf}px`}},T("div",{className:"pipeline-gantt-head time"},"Time"),g.length===0?T("div",{className:"pipeline-gantt-head empty"},"当前时间窗无工作节点"):g.map((Nl)=>T("div",{key:`head-${Nl}`,className:"pipeline-gantt-head node",title:Nl,"data-testid":"pipeline-gantt-head-node","data-node-id":Nl},T(xY,{value:Nl}))),T("div",{className:"pipeline-gantt-time-axis",style:{height:`${h}px`}},pl.map((Nl)=>{let al=QG(Nl,o,h,K);return T("div",{key:`tick-${Nl.ms}-${al}`,className:"pipeline-gantt-tick",style:{top:`${al}px`},"data-testid":"pipeline-gantt-tick","data-ms":String(Nl.ms),"data-y":String(al)},T("b",null,Ll(Nl.ms)),T("span",null,`+${Xf(Number(Nl.offsetMs??Number(Nl.ms)-Number(o.startMs)))}`))})),g.length>0?T("svg",{className:"pipeline-gantt-arrow-layer",width:g.length*On,height:h,viewBox:`0 0 ${g.length*On} ${h}`,style:{left:`${zF}px`,top:`${OF}px`,width:`${g.length*On}px`,height:`${h}px`},"aria-hidden":"true"},T("defs",null,T("marker",{id:"pipeline-gantt-arrowhead",viewBox:"0 0 10 10",refX:9,refY:5,markerWidth:6,markerHeight:6,orient:"auto-start-reverse"},T("path",{d:"M 0 0 L 10 5 L 0 10 z",fill:"context-stroke"}))),zr.map((Nl)=>{let al=gl.get(String(Nl.targetMarkerId||""));if(!al)return null;let gu=gl.get(String(Nl.sourceMarkerId||"")),hl=String(gu?.nodeId||Nl.sourceNodeId||""),yr=g.indexOf(hl),Zr=g.indexOf(String(al.nodeId||""));if(yr<0||Zr<0)return null;let cr=yr*On+On/2,ku=Zr*On+On/2,Gf=gu?wf(gu,o,h,K):wf(al,o,h,K),Vn=wf(al,o,h,K);return T("path",{key:Nl.id,className:`pipeline-gantt-arrow ${String(Nl.sourceKind||"").toLowerCase()} ${String(Nl.status||"").toLowerCase()} ${String(Nl.action||"").toLowerCase()}`,d:mG(cr,Gf,ku,Vn),markerEnd:"url(#pipeline-gantt-arrowhead)","data-testid":String(Nl.action||"")==="observe"?"pipeline-gantt-observation-arrow":"pipeline-gantt-arrow","data-source-node-id":String(Nl.sourceNodeId||""),"data-target-node-id":String(Nl.targetNodeId||""),"data-target-marker-id":String(Nl.targetMarkerId||""),"data-action":String(Nl.action||""),"data-source-y":String(Gf),"data-target-y":String(Vn)})})):null,g.length===0?T("div",{className:"pipeline-gantt-empty-col",style:{height:`${h}px`}},"滚动到有活动的时间段后,相关 node 列会自动出现。"):g.map((Nl)=>{let al=I.filter((hl)=>hl.nodeId===Nl),gu=Y.filter((hl)=>String(hl.nodeId||"")===Nl);return T("div",{key:`col-${Nl}`,className:"pipeline-gantt-node-col",style:{height:`${h}px`}},al.map((hl)=>{let yr=J8(hl,o,h,K),Zr=xF(hl,o,h,K),cr=UG(hl,o,h,K),ku=String(hl.procedureRunId||`${Nl}-${hl.startMs}`);return T("button",{key:ku,type:"button",className:`pipeline-gantt-bar ${hl.status} ${hl.live?"live":""} ${Hl===ku?"selected":""}`,style:{top:`${yr}px`,height:`${cr}px`},title:`${Nl} ${hl.status} ${Ll(hl.startedAt||hl.startMs)} -> ${Ll(hl.finishedAt||hl.endMs)}`,onClick:()=>F(hl),"data-testid":"pipeline-gantt-line","data-node-id":Nl,"data-procedure-run-id":String(hl.procedureRunId||""),"data-status":String(hl.status||""),"data-live":hl.live?"true":"false","data-start-ms":String(hl.startMs||""),"data-end-ms":String(hl.endMs||""),"data-y1":String(yr),"data-y2":String(Zr),"data-natural-height":String(Math.max(0,Zr-yr))},T("strong",null,hl.status||"working"),T("span",null,Xf(hl.durationMs)))}),gu.map((hl)=>T("button",{key:hl.id,type:"button",className:`pipeline-gantt-marker ${hl.kind} ${hl.tone||""} ${hl.status||""} ${bl===String(hl.id)?"selected":""}`,style:{top:`${wf(hl,o,h,K)}px`},title:`${hl.label||"event"} / ${Ll(hl.timestampIso||hl.timestamp||hl.ms)}`,onClick:()=>j(hl),"data-testid":hl.kind==="prompt"?"pipeline-gantt-prompt-marker":"pipeline-gantt-control-marker","data-marker-id":String(hl.id||""),"data-ms":String(hl.ms??hl.eventMs??""),"data-y":String(wf(hl,o,h,K))})))})))),V?T(RY,{selection:N,runDetails:t,nodeDetails:i,nodeDetailsState:y,onRaw:G,onCollapse:()=>P(!1)}):null)))}function yt(){return{loading:!1,actionLoading:"",error:"",message:"",details:null,fetchedAt:null,appendPrompt:"",guidePrompt:"",modifyPrompt:"",approveReason:"",redoReason:""}}function yi(){return{mode:"",runId:"",interval:null,marker:null}}function YF(){return{runId:"",loading:!1,error:"",details:null,fetchedAt:null}}function _$(l,u){return`${l}/microservices/pipeline/proxy${u}`}function xX({activeRun:l,pipelineRuns:u,selectedRunId:r,onRunChange:f,selectedNodeId:n,selectedNodeConfig:t,selectedNodeRuntime:i,control:y,onControlChange:c,onFetch:_,onAction:A,onRaw:F,onCollapse:j}){let N=String(l?.runId||""),U=String(i?.status||"pending"),w=!N||!n||y.loading||Boolean(y.actionLoading),G=(Q)=>(m)=>c({[Q]:m.target.value,error:"",message:""}),J=u.length>0?u:l?[l]:[];return T("aside",{className:"pipeline-node-control","data-testid":"pipeline-node-control"},T("div",{className:"pipeline-node-control-head"},T("div",null,T("p",{className:"panel-eyebrow"},"Manual Node Control"),T(nu,{title:n||"点击控制图中的 node",level:3,loading:y.loading||Boolean(y.actionLoading)})),T("div",{className:"pipeline-node-control-head-actions"},n?T(_i,{status:U},U):T(_i,{status:"pending"},"idle"),T("button",{type:"button",className:"ghost-btn mini",onClick:j,"data-testid":"pipeline-node-sidebar-collapse"},"收起"))),T("div",{className:"pipeline-control-runbar"},T("label",null,T("span",null,"目标 run"),T("select",{value:N||r,disabled:J.length===0,onChange:(Q)=>f(Q.target.value),"data-testid":"pipeline-node-run-select"},J.map((Q)=>T("option",{key:Q.runId,value:Q.runId},`${Q.runId||"--"} / ${Q.status||"--"}`)))),T("button",{type:"button",className:"ghost-btn",disabled:w,onClick:_,"data-testid":"pipeline-node-fetch"},y.loading?"抓取中":"抓取过程"),y.details?T(cn,{title:`Pipeline Node ${n}`,data:y.details,onOpen:F,testId:"raw-pipeline-node-control"}):null),T("div",{className:"pipeline-control-meta"},T("span",null,T("b",null,"kind"),String(t?.kind||"--")),T("span",null,T("b",null,"procedure"),String(i?.currentProcedureRunId||"--")),T("span",null,T("b",null,"attempts"),String(i?.attempts??"--")),T("span",null,T("b",null,"updated"),Ll(l?.updatedAt))),!n?T(qf,{title:"未选择 node",text:"点击 React Flow 控制图中的任意 node 后,可抓取执行过程、追加 prompt、下发引导、增量修改、审核通过或重做。"}):null,T(el,{error:y.error,wide:!0}),T("div",{className:"pipeline-control-actions"},T("label",null,T("span",null,"实时追加 prompt(仅 running node)"),T("textarea",{value:y.appendPrompt,onChange:G("appendPrompt"),placeholder:"让当前执行中的 agent 继续、补充检查或调整当前步骤...",rows:4,disabled:!n,"data-testid":"pipeline-node-append-input"}),T("button",{type:"button",className:"primary-btn compact",disabled:w||!String(y.appendPrompt||"").trim(),onClick:()=>A("append"),"data-testid":"pipeline-node-append-button"},y.actionLoading==="append"?"追加中":"追加到运行中 node")),T("label",null,T("span",null,"下次尝试引导 prompt"),T("textarea",{value:y.guidePrompt,onChange:G("guidePrompt"),placeholder:"给该 node 下一次 attempt 的执行提示;不会立即打断当前 session。",rows:4,disabled:!n,"data-testid":"pipeline-node-guide-input"}),T("button",{type:"button",className:"ghost-btn compact",disabled:w||!String(y.guidePrompt||"").trim(),onClick:()=>A("guide"),"data-testid":"pipeline-node-guide-button"},y.actionLoading==="guide"?"下发中":"下发 guide")),T("label",null,T("span",null,"完成后增量修改 prompt"),T("textarea",{value:y.modifyPrompt,onChange:G("modifyPrompt"),placeholder:"在该 node 已完成结果基础上追加修改要求;runner 会重跑目标 node,并保留同 node 既有 OA 输出作为上下文。",rows:4,disabled:!n,"data-testid":"pipeline-node-modify-input"}),T("button",{type:"button",className:"ghost-btn compact",disabled:w||!String(y.modifyPrompt||"").trim(),onClick:()=>A("modify"),"data-testid":"pipeline-node-modify-button"},y.actionLoading==="modify"?"排队中":"增量修改 node")),T("label",null,T("span",null,"Monitor 审核通过原因"),T("textarea",{value:y.approveReason,onChange:G("approveReason"),placeholder:"当流程配置开启 monitor 审核时,记录审核通过原因并释放后续 node。",rows:3,disabled:!n,"data-testid":"pipeline-node-approve-input"}),T("button",{type:"button",className:"primary-btn compact",disabled:w||!String(y.approveReason||"").trim(),onClick:()=>A("approve"),"data-testid":"pipeline-node-approve-button"},y.actionLoading==="approve"?"提交中":"审核通过")),T("label",null,T("span",null,"重做 / restart 原因"),T("textarea",{value:y.redoReason,onChange:G("redoReason"),placeholder:"说明为什么需要重做;runner 会重置目标 node 以及非 rework 下游 node。",rows:4,disabled:!n,"data-testid":"pipeline-node-redo-input"}),T("button",{type:"button",className:"danger-btn compact",disabled:w||!String(y.redoReason||"").trim(),onClick:()=>A("redo"),"data-testid":"pipeline-node-redo-button"},y.actionLoading==="redo"?"排队中":"重做 node"))),T("div",{className:"pipeline-control-evidence"},T("strong",null,"Node 过程索引"),T(CX,{details:y.details,selectedNodeId:n,selectedNodeRuntime:i,control:y,onRaw:F})))}function wG({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((e)=>e.id==="pipeline")||null,[n,t]=lf({loading:!1,error:"",health:null,snapshot:null,oaDiagnostics:null,minimaxQuota:null,refreshedAt:null}),[i,y]=lf(""),[c,_]=lf(""),[A,F]=lf(""),[j,N]=lf(yt()),[U,w]=lf({}),[G,J]=lf(yi()),[Q,m]=lf(YF()),[q,W]=lf(Q$),[p,O]=lf(!1),[Z,V]=lf(!1),P=ci(0),{addNotification:H}=Xr(),B=ci(!1),C=ci(0),E=ci(""),D=ci({}),Y=ci(""),v=ci("");async function K(e={}){let Dl=e.silent===!0;if(!f)return;if(B.current)return;B.current=!0;let Cl=P.current+1;if(P.current=Cl,!Dl)t((lu)=>({...lu,loading:!0,error:""}));try{let lu=`__unideskArrayLimit=registry.components:80,runs:${EY}`,[mu,au,yu]=await Promise.all([ii(`${r}/microservices/pipeline/proxy/api/snapshot?${lu}`,{cache:"no-store"}),ii(`${r}/microservices/pipeline/proxy/api/oa-event-flow/diagnostics`,{cache:"no-store"}).catch((Sn)=>({ok:!1,error:zl(Sn,"OA event flow diagnostics failed")})),ii(`${r}/microservices/pipeline/proxy/api/model-quota/minimax`,{cache:"no-store"}).catch((Sn)=>({ok:!1,error:zl(Sn,"MiniMax quota failed")}))]);if(Cl!==P.current)return;let ur={ok:mu?.ok!==!1,service:"pipeline-v2-control snapshot"};t({loading:!1,error:"",health:ur,snapshot:mu,oaDiagnostics:au,minimaxQuota:yu,refreshedAt:new Date})}catch(lu){if(Cl!==P.current)return;t((mu)=>({...mu,loading:!1,error:zl(lu,"Pipeline 加载失败")}))}finally{B.current=!1}}Hn(()=>{if(K(),!f)return;let e=()=>{if(f8())K({silent:!0})},Dl=window.setInterval(()=>{e()},HL),Cl=()=>{if(f8())e()};return document.addEventListener("visibilitychange",Cl),()=>{window.clearInterval(Dl),document.removeEventListener("visibilitychange",Cl)}},[f?.id,f?.runtime?.providerStatus,r]);let X=bY(f),I=gY(f),o=vY(f),fl=n.snapshot||{},yl=n.oaDiagnostics||null,h=n.minimaxQuota||null,{components:s,pipelines:ul,runs:tl}=kY(fl),Al=String(tl[0]?.pipelineId||""),Kl=(Al?ul.find((e)=>String(e.id||"")===Al):null)||ul[0]||{},wl=ul.find((e)=>String(e.id||"")===i)||Kl,El=String(wl.id||""),M=iG(wl),d=IF(wl),nl=gL(tl,El),k=mX(tl,El),g=k.find((e)=>String(e?.runId||"")===c)||nl,cl=String(Q.runId||"")===String(g?.runId||"")?dY(Q.details):null,pl=eY(g,cl),Hl=String(pl?.runId||""),bl=M.find((e)=>String(e?.id||"")===A)||null,_u=A?yG(pl,A):null,tu=aY(tl),Nu=fX(s),gl=Number(n.health?.components)||hL(fl,"registry.components",s.length),zr=hL(fl,"runs",tl.length),nf=RL(wl,pl,s),lr={nodes:nf.nodes.map((e)=>e.id===A?{...e,selected:!0,className:`${e.className||""} selected-control-node`}:e),edges:nf.edges},tf=ul.map((e)=>{let Dl=String(e.id||"pipeline"),Cl=gL(tl,Dl);return{title:`${Dl}-${Cl?.runId||"snapshot"}`,flow:RL(e,Cl,s)}}),Or=String(G?.runId||Hl||""),Nl=String(G?.interval?.nodeId||G?.marker?.nodeId||""),al=Or&&Nl?U[VF(Or,Nl)]||null:null,gu=_8(j.details,Or,Nl),hl=_8(al?.details,Or,Nl)||gu,yr=Or&&Nl?{...Xl(al)?al:{},runId:Or,nodeId:Nl,details:hl,loading:Boolean(al?.loading)||!hl&&Boolean(j.loading)&&A===Nl,error:String(al?.error||""),fetchedAt:al?.fetchedAt||(gu?j.fetchedAt:null)}:null,Zr=k.map((e)=>String(e?.runId||"")).filter(Boolean).join("|"),cr=M.map((e)=>String(e?.id||"")).filter(Boolean).join("|");Hn(()=>{Y.current=A},[A]),Hn(()=>{v.current=Hl},[Hl]),Hn(()=>{if(!c||Zr.split("|").includes(c))return;_("")},[c,Zr]),Hn(()=>{if(!A||cr.split("|").includes(A))return;F(""),N(yt()),J(yi()),O(!1),V(!1)},[A,cr]),Hn(()=>{if(!A)O(!1)},[A]),Hn(()=>{if(!G.mode)V(!1)},[G.mode]);async function ku(e=Hl,Dl={}){if(!e){m(YF());return}let Cl=Ai(Dl.scale??q??Q$),lu=`${e}:timeline`;if(E.current===lu)return;E.current=lu;let mu=Dl.silent===!0,au=C.current+1;C.current=au,m((yu)=>({runId:e,scale:Cl,loading:!mu||String(yu.runId||"")!==e||!yu.details,error:"",details:mu&&yu.runId===e?yu.details:yu.runId===e?yu.details:null,fetchedAt:yu.runId===e?yu.fetchedAt:null}));try{let[yu,ur]=await Promise.all([ii(_$(r,`/api/node-control/runs/${encodeURIComponent(e)}?tail=160&view=timeline`),{cache:"no-store",strictJson:!0}),ii(_$(r,`/api/runs/${encodeURIComponent(e)}`),{cache:"no-store"}).catch((Sn)=>({ok:!1,runSummaryError:zl(Sn,"抓取评分失败")}))]);if(au!==C.current)return;m({runId:e,scale:Cl,loading:!1,error:"",details:{...yu,run:Xl(ur?.run)?ur.run:void 0,runSummaryError:ur?.runSummaryError},fetchedAt:new Date})}catch(yu){if(au!==C.current)return;m((ur)=>({runId:e,scale:Cl,loading:!1,error:zl(yu,"抓取 epoch 执行过程失败"),details:ur.runId===e?ur.details:null,fetchedAt:ur.runId===e?ur.fetchedAt:null}))}finally{if(E.current===lu)E.current=""}}function Gf(e,Dl,Cl){let lu=VF(e,Dl);w((mu)=>{let au={...mu,[lu]:{...Xl(mu?.[lu])?mu[lu]:{},runId:e,nodeId:Dl,...Cl}},yu=Object.keys(au);if(yu.length>32)for(let ur of yu.slice(0,yu.length-32))delete au[ur];return au})}async function Vn(e,Dl){if(!e||!Dl)return;let Cl=VF(e,Dl),lu=Number(D.current?.[Cl]||0)+1;D.current={...D.current,[Cl]:lu},Gf(e,Dl,{loading:!0,error:""});try{let mu=await ii(_$(r,`/api/node-control/runs/${encodeURIComponent(e)}/nodes/${encodeURIComponent(Dl)}?tail=160`),{cache:"no-store",strictJson:!0});if(Number(D.current?.[Cl]||0)!==lu)return;let au=new Date;if(Gf(e,Dl,{loading:!1,details:mu,fetchedAt:au,error:""}),Y.current===Dl&&v.current===e)N((yu)=>({...yu,loading:!1,details:mu,fetchedAt:au,error:""}))}catch(mu){if(Number(D.current?.[Cl]||0)!==lu)return;Gf(e,Dl,{loading:!1,error:zl(mu,"抓取 Gantt node 详情失败")})}}Hn(()=>{if(!Hl){m(YF());return}ku(Hl);let e=()=>{if(f8())ku(Hl,{silent:!0})},Dl=window.setInterval(()=>{e()},HL),Cl=()=>{if(f8())e()};return document.addEventListener("visibilitychange",Cl),()=>{window.clearInterval(Dl),document.removeEventListener("visibilitychange",Cl)}},[Hl,r]);async function Rr(e=Hl,Dl=A){if(!e||!Dl){N((Cl)=>({...Cl,error:"请先选择 run 和 node",message:""}));return}N((Cl)=>({...Cl,loading:!0,error:"",message:""}));try{let Cl=await ii(_$(r,`/api/node-control/runs/${encodeURIComponent(e)}/nodes/${encodeURIComponent(Dl)}?tail=160`),{cache:"no-store",strictJson:!0}),lu=new Date;N((mu)=>({...mu,loading:!1,details:Cl,fetchedAt:lu,error:""})),Gf(e,Dl,{loading:!1,details:Cl,fetchedAt:lu,error:""})}catch(Cl){N((lu)=>({...lu,loading:!1,error:zl(Cl,"抓取 node 执行过程失败")}))}}async function ay(e){let Dl=String(e?.runId||Hl||""),Cl=String(e?.nodeId||"");if(J({mode:"interval",runId:Dl,interval:e,marker:null}),V(!0),!Dl||!Cl)return;if(Dl!==Hl)_(Dl);F(Cl),N(yt()),ku(Dl,{silent:!0}),Vn(Dl,Cl)}async function _t(e){let Dl=String(e?.runId||Hl||""),Cl=String(e?.nodeId||"");if(J({mode:"event",runId:Dl,interval:null,marker:e}),V(!0),!Dl)return;if(Dl!==Hl)_(Dl);if(ku(Dl,{silent:!0}),!Cl)return;F(Cl),N(yt()),Vn(Dl,Cl)}async function At(e){if(!Hl||!A){N((lu)=>({...lu,error:"请先选择 run 和 node",message:""}));return}let Dl=e==="append"?"prompts":e,Cl=e==="append"?j.appendPrompt:e==="guide"?j.guidePrompt:e==="modify"?j.modifyPrompt:e==="approve"?j.approveReason:j.redoReason;if(!String(Cl||"").trim()){N((lu)=>({...lu,error:"操作内容不能为空",message:""}));return}N((lu)=>({...lu,actionLoading:e,error:"",message:""}));try{let lu=e==="redo"||e==="approve"?{reason:Cl,source:"unidesk-frontend",sourceKind:"webui"}:{prompt:Cl,source:"unidesk-frontend",sourceKind:"webui"},mu=await ii(_$(r,`/api/node-control/runs/${encodeURIComponent(Hl)}/nodes/${encodeURIComponent(A)}/${Dl}`),{method:"POST",body:JSON.stringify(lu)});if(N((yu)=>({...yu,actionLoading:"",details:mu,fetchedAt:new Date,appendPrompt:e==="append"?"":yu.appendPrompt,guidePrompt:e==="guide"?"":yu.guidePrompt,modifyPrompt:e==="modify"?"":yu.modifyPrompt,approveReason:e==="approve"?"":yu.approveReason,redoReason:e==="redo"?"":yu.redoReason,message:e==="append"?"已追加到运行中 node":e==="guide"?"已下发 guide,等待 runner 处理":e==="modify"?"已排队增量修改命令":e==="approve"?"已提交审核通过决策":"已排队重做命令"})),H("success",e==="append"?"已追加到运行中 node":e==="guide"?"已下发 guide,等待 runner 处理":e==="modify"?"已排队增量修改命令":e==="approve"?"已提交审核通过决策":"已排队重做命令"),await Rr(Hl,A),await ku(Hl,{silent:!0}),e!=="append")await K()}catch(lu){N((mu)=>({...mu,actionLoading:"",error:zl(lu,"node 控制操作失败")}))}}if(!f)return T(qf,{title:"Pipeline 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=pipeline"});return T("div",{className:"pipeline-page","data-testid":"pipeline-page"},T(Zn,{title:"Pipeline v2 工作台",eyebrow:"D601 Snapshot 用户服务",loading:n.loading,actions:T("div",{className:"panel-actions"},T("button",{type:"button",className:"ghost-btn",onClick:K,disabled:n.loading,"data-testid":"pipeline-refresh-button"},n.loading?"刷新中":"刷新"),T(cn,{title:"Pipeline 用户服务",data:f,onOpen:u,testId:"raw-pipeline-service"}))},T("div",{className:"pipeline-hero"},T("div",null,T("div",{className:"node-version-line"},T(_i,{status:X.providerStatus==="online"?"online":"warn"},X.providerStatus||"unknown"),T("span",null,f.providerId),T("span",null,o.public?"公网暴露":"仅 UniDesk frontend 代理访问")),T("p",{className:"muted paragraph"},f.description)),T("div",{className:"microservice-ref-card"},T("span",null,"Repo"),T("strong",null,I.url||"--"),T("code",null,I.commitId||"--")),T("div",{className:"microservice-ref-card"},T("span",null,"D601 Docker"),T("strong",null,`${o.nodeBindHost||"--"}:${o.nodePort||"--"}`),T("code",null,`${I.composeFile||"--"} / ${I.composeService||"--"}`))),T(el,{error:n.error,wide:!0})),T("div",{className:"pipeline-grid"},T(Zn,{title:"控制图",eyebrow:`${wl.id||"pipeline"} / run ${pl?.status||"--"}`,className:"pipeline-wide-panel",loading:n.loading,actions:T("div",{className:"pipeline-toolbar"},T("select",{value:El,disabled:ul.length===0,onChange:(e)=>{y(e.target.value),_(""),F(""),N(yt()),J(yi()),O(!1),V(!1)},"data-testid":"pipeline-select"},ul.map((e)=>T("option",{key:e.id,value:e.id},e.id||e.key))),T("select",{value:Hl,disabled:k.length===0,onChange:(e)=>{if(_(e.target.value),N(yt()),J(yi()),O(!1),V(!1),A)Rr(e.target.value,A)},"data-testid":"pipeline-run-select"},k.map((e)=>T("option",{key:e.runId,value:e.runId},sF(k,e)))),T("button",{type:"button",className:"ghost-btn",disabled:lr.nodes.length===0,onClick:()=>_G(lr,`${wl.id||"pipeline"}-${pl?.runId||"snapshot"}`),"data-testid":"pipeline-export-graph"},"导出渲染图"),T("button",{type:"button",className:"ghost-btn",disabled:tf.every((e)=>e.flow.nodes.length===0),onClick:()=>QX(tf),"data-testid":"pipeline-export-all-graphs"},"批量导出"))},M.length===0?T(qf,{title:"暂无控制图",text:"等待 D601 pipeline backend 返回 config.nodes / config.edges"}):T("div",{className:`pipeline-control-shell ${p?"detail-open":"detail-collapsed"}`,"data-testid":"pipeline-control-shell","data-sidebar-open":p?"true":"false"},T("div",{className:"pipeline-flow-frame","data-testid":"pipeline-react-flow"},T(TL,{nodes:lr.nodes,edges:lr.edges,nodeTypes:HY,edgeTypes:ZY,fitView:!0,fitViewOptions:{padding:0.18},nodesDraggable:!1,nodesConnectable:!1,elementsSelectable:!0,minZoom:0.25,maxZoom:1.4,proOptions:{hideAttribution:!0},onNodeClick:(e,Dl)=>{let Cl=String(Dl.id);if(F(Cl),N(yt()),O(!0),Hl)Rr(Hl,Cl)}},T(EL,{gap:22,size:1,color:"rgba(215, 161, 58, 0.24)"}),T(zL,{showInteractive:!1})),!p?T("button",{type:"button",className:"pipeline-sidecar-tab right",disabled:!A,onClick:()=>O(!0),"data-testid":"pipeline-node-sidebar-toggle"},A?"展开 node 控制":"点击 node 展开控制"):null),p?T(xX,{activeRun:pl,pipelineRuns:k,selectedRunId:c,onRunChange:(e)=>{if(_(e),N(yt()),J(yi()),A)Rr(e,A)},selectedNodeId:A,selectedNodeConfig:bl,selectedNodeRuntime:_u,control:j,onControlChange:(e)=>N((Dl)=>({...Dl,...e})),onFetch:()=>Rr(),onAction:At,onRaw:u,onCollapse:()=>O(!1)}):null),T("div",{className:"pipeline-flow-summary"},T("span",null,`${lr.nodes.length} nodes`),T("span",null,`${lr.edges.length} edges`),T("span",null,`${ul.length} pipelines`),T("span",null,`source config+components(${s.length})`),T("span",null,`run ${pl?.runId||"--"}`),T("span",null,`score ${MF(pl)}`),T("span",null,A?`selected ${A}`:"click node to control"))),T(RX,{epochs:k,activeRun:pl,activePipeline:wl,pipelineNodes:M,pipelineEdges:d,selection:G,detailOpen:Z,onDetailOpenChange:V,runDetails:Q,nodeDetails:hl,nodeDetailsState:yr,ganttScale:q,onGanttScaleChange:W,onIntervalSelect:ay,onMarkerSelect:_t,onRunChange:(e)=>{if(_(e),N(yt()),J(yi()),V(!1),A)Rr(e,A)},onRaw:u}),T(Zn,{title:"观测指标",eyebrow:n.refreshedAt?`Updated ${iu(n.refreshedAt)}`:"Snapshot",loading:n.loading},T("div",{className:"metric-grid"},T(sr,{label:"Health",value:n.health?.ok?"OK":"--",hint:n.health?.service||"D601 /health",tone:n.health?.ok?"ok":"warn"}),T(sr,{label:"组件",value:gl,hint:"components registry",tone:fl?.registry?.ok===!1?"warn":"ok"}),T(sr,{label:"Pipeline",value:ul.length,hint:`${M.length} nodes / ${d.length} edges`}),T(sr,{label:"运行记录",value:zr,hint:`${tu.succeeded||0} succeeded / ${tu.running||0} running`}),T(sr,{label:"OA 记录",value:Array.isArray(nl?.submissions)?nl.submissions.length:0,hint:nl?.runId||"latest run"}),T(sr,{label:"Procedure",value:Array.isArray(nl?.procedureRuns)?nl.procedureRuns.length:0,hint:nl?.status||"no run"}),T(sr,{label:"Score",value:MF(pl),hint:pl?.runId||"selected epoch",tone:oF(pl)})),T("div",{className:"panel-actions inline-actions"},T(cn,{title:"Pipeline Snapshot",data:fl,onOpen:u,testId:"raw-pipeline-snapshot"}))),T(Zn,{title:"评分器",eyebrow:pl?.runId||"selected epoch",loading:n.loading},T(rX,{run:pl,onRaw:u})),T(Zn,{title:"MiniMax 限额",eyebrow:"model/minimax-m27 quota",loading:n.loading},T(sX,{quota:h,onRaw:u})),T(Zn,{title:"OA 事件流",eyebrow:"100% event-driven diagnostics",className:"pipeline-wide-panel",loading:n.loading},T(MX,{diagnostics:yl,onRaw:u})),T(Zn,{title:"组件矩阵",eyebrow:`${Nu.length} classes`,loading:n.loading},Nu.length===0?T(qf,{title:"暂无组件",text:"等待 D601 pipeline backend 返回 registry.components"}):T("div",{className:"component-strata"},Nu.map((e)=>T("article",{key:e.name,className:"component-stratum"},T("span",null,e.name),T("strong",null,e.count)))),T("div",{className:"pipeline-component-list"},s.slice(0,12).map((e)=>T("span",{key:e.key,className:"data-chip"},T("b",null,e.componentClass||"--"),T("span",null,e.id||e.key||"--"))))),T(Zn,{title:"Epoch 列表",eyebrow:`${k.length}/${zr} preview`,loading:n.loading},k.length===0?T(qf,{title:"暂无运行记录",text:"当前 pipeline 在 .state/pipeline-runs 中还没有 epoch。"}):T("div",{className:"pipeline-run-list"},k.map((e)=>{let Dl=String(e?.runId||"")===Hl?pl:e;return T("article",{key:e.runId,className:`pipeline-run-card ${String(e.runId||"")===Hl?"active":""}`,role:"button",tabIndex:0,onClick:()=>{_(String(e.runId||"")),J(yi())},onKeyDown:(Cl)=>{if(Cl.key==="Enter"||Cl.key===" ")_(String(e.runId||"")),J(yi())}},T("div",{className:"node-card-head"},T("strong",null,sF(k,e)),T(_i,{status:e.status},e.status||"--")),T("div",{className:"docker-meta compact"},T("span",null,Dl?.pipelineId||"--"),T("span",null,`nodes ${Array.isArray(Dl?.nodes)?Dl.nodes.length:0}`),T("span",null,`oa ${Array.isArray(Dl?.submissions)?Dl.submissions.length:0}`),T("span",null,`procedures ${Array.isArray(Dl?.procedureRuns)?Dl.procedureRuns.length:0}`),T(uX,{run:Dl})),T("p",{className:"muted paragraph"},$8(Dl?.task)),T("span",{className:"pipeline-run-time"},Ll(Dl?.updatedAt)))}))),T(Zn,{title:"运行材料索引",eyebrow:pl?.runId||"selected epoch",className:"pipeline-wide-panel",loading:n.loading},T(hX,{activeRun:pl,onRaw:u}))))}var L8=Ml(Ju(),1);var Fl=L8.default.createElement,{useEffect:bX}=L8.default,w8=L8.default.useState,uj={id:"",sequenceNo:"",contractNo:"",name:"",currentStatus:"",pending:"",paymentStatus:"",notes:""};function vX({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return Fl("span",{className:`status-badge ${r}`},u||l||"unknown")}function q8({label:l,value:u,hint:r,tone:f}){return Fl("article",{className:`metric-card ${f||""}`},Fl("div",{className:"metric-label"},l),Fl("div",{className:"metric-value"},u),Fl("div",{className:"metric-hint"},r))}function rj({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return Fl("section",{className:`panel ${n||""}`},Fl("div",{className:"panel-head"},Fl("div",null,u?Fl("p",{className:"panel-eyebrow"},u):null,Fl(nu,{title:l,loading:t})),r?Fl("div",{className:"panel-actions"},r):null),Fl("div",{className:"panel-body"},f))}function qG({title:l,data:u,onOpen:r,testId:f}){return Fl("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function LG({title:l,text:u}){return Fl("div",{className:"empty-state"},Fl("strong",null,l),Fl("span",null,u))}function gX(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function kX(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function IX(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function by(l,u){return`${l}/microservices/project-manager/proxy${u}`}function aX(l){return{id:String(l.id||""),sequenceNo:l.sequenceNo===null||l.sequenceNo===void 0?"":String(l.sequenceNo),contractNo:String(l.contractNo||""),name:String(l.name||""),currentStatus:String(l.currentStatus||""),pending:String(l.pending||""),paymentStatus:String(l.paymentStatus||""),notes:String(l.notes||"")}}function oX(l){return{sequenceNo:l.sequenceNo===""?null:Number(l.sequenceNo),contractNo:String(l.contractNo||"").trim(),name:String(l.name||"").trim(),currentStatus:String(l.currentStatus||"").trim(),pending:String(l.pending||"").trim(),paymentStatus:String(l.paymentStatus||"").trim(),paymentRatio:String(l.paymentStatus||"").trim(),notes:String(l.notes||"").trim()}}function fj(l){return String(l||"item").replace(/[^A-Za-z0-9_-]+/g,"-")}function dX(l){let u=new Uint8Array(l),r="",f=32768;for(let n=0;nFl("tr",{key:n.id,className:u===n.id?"active-row":"","data-testid":`project-manager-row-${fj(n.id)}`},Fl("td",null,n.sequenceNo??"--"),Fl("td",null,Fl("strong",null,n.contractNo||"--"),Fl("code",null,n.id||"--")),Fl("td",null,Fl("strong",null,n.name||"--"),Fl("span",{className:"muted block"},n.sourceFile||"--")),Fl("td",null,n.currentStatus||"--"),Fl("td",null,Fl("span",{className:"preline"},n.pending||"--")),Fl("td",null,Fl(vX,{status:Number(n.paymentRatio||0)>=1?"online":"warn"},n.paymentStatus||"--")),Fl("td",null,n.notes||"--"),Fl("td",null,Fl("div",{className:"inline-actions"},Fl("button",{type:"button",className:"ghost-btn",onClick:()=>r(n),"data-testid":`project-manager-edit-${fj(n.id)}`},"编辑"),Fl(qG,{title:`Project ${n.contractNo||n.id}`,data:n,onOpen:f,testId:`raw-project-${fj(n.id)}`}))))))))}function GG({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((Z)=>Z.id==="project-manager")||null,[n,t]=w8({loading:!1,saving:!1,importing:!1,exporting:!1,error:"",notice:"",health:null,list:null,refreshedAt:null}),[i,y]=w8({...uj}),[c,_]=w8(""),[A,F]=w8("all"),{addNotification:j}=Xr();async function N(Z=c,V=A){if(!f)return;t((P)=>({...P,loading:!0,error:""}));try{let P=new URLSearchParams({pageSize:"200",status:V});if(Z.trim())P.set("q",Z.trim());let[H,B]=await Promise.all([Tl(`${r}/microservices/project-manager/health`),Tl(by(r,`/api/projects?${P.toString()}`))]);t((C)=>({...C,loading:!1,health:H,list:B,refreshedAt:new Date,error:""}))}catch(P){t((H)=>({...H,loading:!1,error:zl(P,"Project Manager 加载失败")}))}}bX(()=>{N()},[f?.id,f?.runtime?.providerStatus]);async function U(Z){Z.preventDefault(),t((V)=>({...V,saving:!0,error:"",notice:""}));try{let V=oX(i);if(i.id)await Tl(by(r,`/api/projects/${encodeURIComponent(i.id)}`),{method:"PUT",body:JSON.stringify(V)});else await Tl(by(r,"/api/projects"),{method:"POST",body:JSON.stringify(V)});let P=i.id?"项目已更新":"项目已创建";t((H)=>({...H,saving:!1,notice:P})),j("success",P),await N()}catch(V){t((P)=>({...P,saving:!1,error:zl(V,"保存项目失败")}))}}async function w(){if(!i.id)return;if(!window.confirm(`删除项目 ${i.contractNo||i.name||i.id} ?`))return;t((Z)=>({...Z,saving:!0,error:"",notice:""}));try{await Tl(by(r,`/api/projects/${encodeURIComponent(i.id)}`),{method:"DELETE"}),y({...uj});let Z="项目已删除";t((V)=>({...V,saving:!1,notice:Z})),j("success",Z),await N()}catch(Z){t((V)=>({...V,saving:!1,error:zl(Z,"删除项目失败")}))}}async function G(Z){let V=Z.target.files?.[0];if(!V)return;t((P)=>({...P,importing:!0,error:"",notice:""}));try{let P=dX(await V.arrayBuffer()),B=`Excel 已导入 ${(await Tl(by(r,"/api/import/excel"),{method:"POST",body:JSON.stringify({fileName:V.name,contentBase64:P,replace:!1})})).imported||0} 条项目`;t((C)=>({...C,importing:!1,notice:B})),j("success",B),Z.target.value="",await N()}catch(P){t((H)=>({...H,importing:!1,error:zl(P,"Excel 导入失败")}))}}async function J(){t((Z)=>({...Z,exporting:!0,error:""}));try{let Z=await TU(by(r,"/api/projects/export.xlsx")),V=URL.createObjectURL(Z),P=document.createElement("a");P.href=V,P.download=`project-manager-${r7()}.xlsx`,document.body.appendChild(P),P.click(),P.remove(),URL.revokeObjectURL(V),t((H)=>({...H,exporting:!1,notice:"Excel 已导出"}))}catch(Z){t((V)=>({...V,exporting:!1,error:zl(Z,"Excel 导出失败")}))}}if(!f)return Fl(LG,{title:"Project Manager 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=project-manager"});let Q=gX(f),m=IX(f),q=kX(f),W=Array.isArray(n.list?.projects)?n.list.projects:[],p=n.list?.summary||{},O=n.health||{};return Fl("div",{className:"project-manager-page","data-testid":"project-manager-page"},Fl(rj,{title:"项目管理工作台",eyebrow:"Main Server PostgreSQL 用户服务",loading:n.loading||n.exporting,actions:Fl("div",{className:"panel-actions"},Fl("button",{type:"button",className:"ghost-btn",disabled:n.loading,onClick:()=>N(),"data-testid":"project-manager-refresh-button"},n.loading?"刷新中":"刷新"),Fl("button",{type:"button",className:"ghost-btn",disabled:n.exporting,onClick:J,"data-testid":"project-manager-export-button"},n.exporting?"导出中":"导出 Excel"),Fl(qG,{title:"Project Manager 用户服务",data:f,onOpen:u,testId:"raw-project-manager-service"}))},Fl("div",{className:"project-manager-hero"},Fl(q8,{label:"项目总数",value:p.total??W.length,hint:`PG 表 ${O.storage?.table||"project_manager_projects"}`,tone:"ok"}),Fl(q8,{label:"进行中",value:p.active??"--",hint:"当前状态未完全完成"}),Fl(q8,{label:"已完成",value:p.completed??"--",hint:"按 完成 关键字统计",tone:"ok"}),Fl(q8,{label:"未全款",value:p.unpaid??"--",hint:"付款比例 < 1",tone:Number(p.unpaid||0)>0?"warn":"ok"})),Fl(el,{error:n.error}),n.notice?Fl("div",{className:"form-success"},n.notice):null),Fl("div",{className:"project-manager-hero"},Fl("div",{className:"microservice-ref-card"},Fl("span",null,"Repo"),Fl("strong",null,m.url||"--"),Fl("code",null,m.commitId||"--")),Fl("div",{className:"microservice-ref-card"},Fl("span",null,"Main Server Docker"),Fl("strong",null,`${q.nodeBindHost||"--"}:${q.nodePort||"--"}`),Fl("code",null,`${m.composeService||"--"} / ${m.containerName||"--"}`)),Fl("div",{className:"microservice-ref-card"},Fl("span",null,"Runtime"),Fl("strong",null,Q.providerName||f.providerId),Fl("code",null,`Health ${O.ok?"OK":"--"} / ${n.refreshedAt?iu(n.refreshedAt):"--"}`)),Fl("div",{className:"microservice-ref-card"},Fl("span",null,"Import Source"),Fl("strong",null,"D601 WeChat Excel"),Fl("code",null,"合作项目列表_I_20260309.xlsx"))),Fl("div",{className:"project-manager-layout"},Fl(rj,{title:"项目清单",eyebrow:"CRUD + Excel Export",loading:n.loading||n.importing||n.exporting,actions:Fl("div",{className:"inline-actions project-manager-filters"},Fl("input",{value:c,onChange:(Z)=>_(Z.target.value),placeholder:"搜索合同号 / 项目名称 / 状态","data-testid":"project-manager-search"}),Fl("select",{value:A,onChange:(Z)=>{F(Z.target.value),N(c,Z.target.value)},"data-testid":"project-manager-status-filter"},Fl("option",{value:"all"},"全部"),Fl("option",{value:"active"},"进行中"),Fl("option",{value:"completed"},"已完成"),Fl("option",{value:"unpaid"},"未全款")),Fl("button",{type:"button",className:"ghost-btn",onClick:()=>N(c,A)},"筛选"))},Fl(eX,{projects:W,activeId:i.id,onSelect:(Z)=>y(aX(Z)),onRaw:u})),Fl(rj,{title:i.id?"编辑项目":"新建项目",eyebrow:"PostgreSQL Write Path",loading:n.saving||n.importing},Fl("form",{className:"stack-form project-manager-form",onSubmit:U,"data-testid":"project-manager-form"},i.id?Fl("label",null,"项目 ID",Fl("input",{value:i.id,disabled:!0})):null,Fl("label",null,"序号",Fl("input",{type:"number",value:i.sequenceNo,onChange:(Z)=>y((V)=>({...V,sequenceNo:Z.target.value}))})),Fl("label",null,"合同号",Fl("input",{value:i.contractNo,onChange:(Z)=>y((V)=>({...V,contractNo:Z.target.value})),required:!0})),Fl("label",null,"项目名称",Fl("input",{value:i.name,onChange:(Z)=>y((V)=>({...V,name:Z.target.value})),required:!0})),Fl("label",null,"当前状况",Fl("textarea",{value:i.currentStatus,onChange:(Z)=>y((V)=>({...V,currentStatus:Z.target.value}))})),Fl("label",null,"待完成",Fl("textarea",{value:i.pending,onChange:(Z)=>y((V)=>({...V,pending:Z.target.value}))})),Fl("label",null,"付款情况",Fl("input",{value:i.paymentStatus,onChange:(Z)=>y((V)=>({...V,paymentStatus:Z.target.value})),placeholder:"例如 1 / 0.5 / 50%"})),Fl("label",null,"其它",Fl("input",{value:i.notes,onChange:(Z)=>y((V)=>({...V,notes:Z.target.value}))})),Fl("div",{className:"inline-actions"},Fl("button",{type:"submit",className:"primary-btn",disabled:n.saving,"data-testid":"project-manager-save-button"},n.saving?"保存中":i.id?"保存修改":"创建项目"),Fl("button",{type:"button",className:"ghost-btn",onClick:()=>y({...uj})},"清空"),i.id?Fl("button",{type:"button",className:"danger-btn",disabled:n.saving,onClick:w,"data-testid":"project-manager-delete-button"},"删除"):null)),Fl("div",{className:"project-manager-import"},Fl("p",{className:"muted paragraph"},"浏览器只访问 UniDesk frontend;后端通过同源用户服务代理写入主 PostgreSQL,不暴露 4233 公网端口。"),Fl("label",{className:"file-import"},n.importing?"导入中...":"导入 Excel",Fl("input",{type:"file",accept:".xlsx",onChange:G,disabled:n.importing,"data-testid":"project-manager-import-input"}))))))}var T8=Ml(Ju(),1);var Jl=T8.default.createElement,{useEffect:lP}=T8.default,rf=T8.default.useState;function uP({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return Jl("span",{className:`status-badge ${r}`},u||l||"unknown")}function G8({label:l,value:u,hint:r,tone:f}){return Jl("article",{className:`metric-card ${f||""}`},Jl("div",{className:"metric-label"},l),Jl("div",{className:"metric-value"},u),Jl("div",{className:"metric-hint"},r))}function nj({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return Jl("section",{className:`panel ${n||""}`},Jl("div",{className:"panel-head"},Jl("div",null,u?Jl("p",{className:"panel-eyebrow"},u):null,Jl(nu,{title:l,loading:t})),r?Jl("div",{className:"panel-actions"},r):null),Jl("div",{className:"panel-body"},f))}function WG({title:l,data:u,onOpen:r,testId:f}){return Jl("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function W8({title:l,text:u}){return Jl("div",{className:"empty-state"},Jl("strong",null,l),Jl("span",null,u))}function rP(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function fP(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function nP(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function KG(l){return String(l).replace(/[^a-zA-Z0-9_-]/g,"_")}function tP(l){if(!Number.isFinite(l))return"--";return`${l.toFixed(1)}%`}function vy(l,u){return`${l}/microservices/todo-note/proxy${u}`}function EG(l){return l.reduce((u,r)=>{let f=EG(Array.isArray(r.children)?r.children:[]),n=Boolean(r.completed);return{total:u.total+1+f.total,completed:u.completed+(n?1:0)+f.completed,active:u.active+(n?0:1)+f.active}},{total:0,completed:0,active:0})}function ij(l,u){let r=u==="all"||(u==="completed"?Boolean(l.completed):!l.completed),f=Array.isArray(l.children)?l.children:[];return r||f.some((n)=>ij(n,u))}function TG(l){return Array.isArray(l?.instances)?l.instances:[]}function tj(l,u){for(let r of l){if(r?.id===u)return Array.isArray(r.children)?r.children:[];let f=tj(Array.isArray(r?.children)?r.children:[],u);if(f.length>0)return f}return[]}function pG({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((g)=>g.id==="todo-note")||null,[n,t]=rf(null),[i,y]=rf(null),[c,_]=rf(""),[A,F]=rf(null),[j,N]=rf("all"),[U,w]=rf(13),[G,J]=rf(""),[Q,m]=rf(""),[q,W]=rf(""),[p,O]=rf(""),[Z,V]=rf(""),[P,H]=rf(!1),[B,C]=rf(""),[E,D]=rf(null),Y=TG(i),v=EG(Array.isArray(A?.todos)?A.todos:[]),K=f?rP(f):{},X=f?nP(f):{},I=f?fP(f):{};async function o(g=c){let[cl,pl]=await Promise.all([Tl(`${r}/microservices/todo-note/health`),Tl(vy(r,"/api/instances"))]);t(cl),y(pl);let Hl=TG(pl),bl=Hl.some((_u)=>_u.id===g)?g:Hl[0]?.id||"";return _(bl),bl}async function fl(g=c){if(!g){F(null);return}let cl=await Tl(vy(r,`/api/instances/${encodeURIComponent(g)}`));F(cl)}async function yl(g=c){if(!f)return;H(!0),C("");try{let cl=await o(g);await fl(cl),D(new Date)}catch(cl){C(zl(cl,"Todo Note 加载失败"))}finally{H(!1)}}async function h(g){if(!c)return null;C("");try{let cl=await Tl(vy(r,`/api/instances/${encodeURIComponent(c)}/actions`),{method:"POST",body:JSON.stringify({action:g})});return F(cl),await o(c),cl}catch(cl){return C(zl(cl,"Todo 操作失败")),null}}async function s(g){g.preventDefault();let cl=G.trim();if(!cl)return;H(!0),C("");try{let pl=await Tl(vy(r,"/api/instances"),{method:"POST",body:JSON.stringify({name:cl})});J(""),await yl(pl.id)}catch(pl){C(zl(pl,"创建清单失败"))}finally{H(!1)}}async function ul(g){if(!window.confirm("确认删除这个 Todo Note 清单?"))return;H(!0),C("");try{await Tl(vy(r,`/api/instances/${encodeURIComponent(g)}`),{method:"DELETE"}),await yl(c===g?"":c)}catch(cl){C(zl(cl,"删除清单失败"))}finally{H(!1)}}async function tl(g){g.preventDefault();let cl=Q.trim();if(!cl)return;m(""),await h({type:"addTodo",title:cl})}async function Al(g){if(!c)return;C("");try{let cl=await Tl(vy(r,`/api/instances/${encodeURIComponent(c)}/${g}`),{method:"POST",body:JSON.stringify({})});F(cl),await o(c)}catch(cl){C(zl(cl,`${g} 失败`))}}function Kl(g){W(g.id),O(String(g.title||""))}async function wl(g){let cl=p.trim();if(W(""),O(""),cl)await h({type:"updateTodoTitle",todoId:g,title:cl})}async function El(g){let pl=window.prompt("新增子任务标题")?.trim();if(!pl)return;let Hl=tj(Array.isArray(A?.todos)?A.todos:[],g),bl=new Set(Hl.map((gl)=>gl.id)),_u=await h({type:"addTodo",title:pl,parentId:g,targetIndex:0});if(!_u)return;let tu=tj(Array.isArray(_u?.todos)?_u.todos:[],g),Nu=tu.find((gl)=>!bl.has(gl.id));if(Nu&&tu[0]?.id!==Nu.id)await h({type:"moveTodo",todoId:Nu.id,targetParentId:g,targetIndex:0})}async function M(g,cl){if(!Z)return;let pl={type:"moveTodo",todoId:Z,targetIndex:cl};if(g)pl.targetParentId=g;V(""),await h(pl)}if(lP(()=>{yl()},[f?.id,f?.runtime?.providerStatus]),!f)return Jl(W8,{title:"Todo Note 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=todo-note"});let d=Y.find((g)=>g.id===c)||null,nl=Array.isArray(A?.todos)?A.todos:[],k=nl.map((g,cl)=>({todo:g,index:cl})).filter((g)=>ij(g.todo,j));return Jl("div",{className:"todo-note-page","data-testid":"todo-note-page"},Jl(nj,{title:"Todo Note 工作台",eyebrow:"Main Server 用户服务",loading:P,actions:Jl("div",{className:"panel-actions"},Jl("button",{type:"button",className:"ghost-btn",disabled:P,onClick:()=>yl(c),"data-testid":"todo-note-refresh-button"},P?"刷新中":"刷新"),Jl(WG,{title:"Todo Note 用户服务",data:f,onOpen:u,testId:"raw-todo-note-service"}))},Jl("div",{className:"todo-note-hero"},Jl("div",null,Jl("div",{className:"node-version-line"},Jl(uP,{status:K.providerStatus==="online"?"online":"warn"},K.providerStatus||"unknown"),Jl("span",null,f.providerId),Jl("span",null,I.public?"公网暴露":"仅 UniDesk frontend 代理访问"),Jl("span",null,n?.ok?"Health OK":"Health --")),Jl("p",{className:"muted paragraph"},f.description)),Jl("div",{className:"microservice-ref-card"},Jl("span",null,"Repo"),Jl("strong",null,X.url||"--"),Jl("code",null,X.commitId||"--")),Jl("div",{className:"microservice-ref-card"},Jl("span",null,"Main Server Docker"),Jl("strong",null,`${I.nodeBindHost||"--"}:${I.nodePort||"--"}`),Jl("code",null,`${X.composeService||"--"} / ${X.containerName||"--"}`))),Jl(el,{error:B,wide:!0})),Jl("div",{className:"todo-note-layout"},Jl(nj,{title:"清单",eyebrow:`${Y.length} Instances`,className:"todo-list-panel",loading:P},Jl("form",{className:"todo-create-list",onSubmit:s},Jl("input",{placeholder:"新清单名称",value:G,onChange:(g)=>J(g.target.value),"aria-label":"新清单名称"}),Jl("button",{type:"submit",className:"ghost-btn",disabled:P||!G.trim()},"创建")),Y.length===0?Jl(W8,{title:"暂无清单",text:"迁移或创建清单后会出现在这里"}):Jl("div",{className:"todo-instance-list"},Y.map((g)=>Jl("button",{key:g.id,type:"button",className:`todo-instance-row ${c===g.id?"active":""}`,onClick:()=>{_(g.id),fl(g.id)},"data-testid":`todo-instance-${KG(g.id)}`},Jl("strong",null,g.name),Jl("span",null,`${g.completedCount??0}/${g.todoCount??0} 完成`),Jl("code",null,g.id))))),Jl("div",{className:"todo-main-stack"},Jl(nj,{title:d?.name||"待选择清单",eyebrow:E?`Updated ${iu(E)}`:"Todo Tree",loading:P,actions:A?Jl("div",{className:"panel-actions"},Jl("button",{type:"button",className:"ghost-btn",onClick:()=>h({type:"renameInstance",name:window.prompt("清单新名称",A.name)||A.name})},"重命名"),Jl("button",{type:"button",className:"ghost-btn danger",onClick:()=>ul(c)},"删除清单"),Jl(WG,{title:`Todo Instance ${c}`,data:A,onOpen:u,testId:"raw-todo-instance"})):null},!A?Jl(W8,{title:"未选择清单",text:"左侧选择一个 Todo Note 清单"}):Jl("div",{className:"todo-workbench",style:{"--todo-font-size":`${U}px`}},Jl("div",{className:"todo-toolbar"},Jl("form",{className:"todo-add-form",onSubmit:tl},Jl("input",{placeholder:"新增根任务",value:Q,onChange:(g)=>m(g.target.value),"aria-label":"新增根任务"}),Jl("button",{type:"submit",className:"ghost-btn",disabled:!Q.trim()},"新增")),Jl("div",{className:"todo-filter-strip"},["all","active","completed"].map((g)=>Jl("button",{key:g,type:"button",className:`todo-filter ${j===g?"active":""}`,onClick:()=>N(g)},g==="all"?"全部":g==="active"?"未完成":"已完成"))),Jl("div",{className:"todo-toolbar-actions"},Jl("button",{type:"button",className:"ghost-btn",onClick:()=>h({type:"setAllTodosExpanded",expanded:!0})},"全部展开"),Jl("button",{type:"button",className:"ghost-btn",onClick:()=>h({type:"setAllTodosExpanded",expanded:!1})},"全部收起"),Jl("button",{type:"button",className:"ghost-btn",onClick:()=>Al("undo")},"撤销"),Jl("button",{type:"button",className:"ghost-btn",onClick:()=>Al("redo")},"重做"),Jl("label",{className:"todo-font-control"},"字号",Jl("input",{type:"range",min:11,max:18,value:U,onChange:(g)=>w(Number(g.target.value))})))),Jl("div",{className:"todo-stats-grid"},Jl(G8,{label:"总任务",value:v.total,hint:`${Y.length} lists`}),Jl(G8,{label:"已完成",value:v.completed,hint:`${tP(v.total?v.completed/v.total*100:0)}`,tone:"ok"}),Jl(G8,{label:"未完成",value:v.active,hint:j==="active"?"当前筛选":"active tasks",tone:v.active>0?"warn":"ok"}),Jl(G8,{label:"历史指针",value:A.historyPointer??0,hint:"undo / redo"})),Jl("div",{className:"todo-root-drop",onDragOver:(g)=>g.preventDefault(),onDrop:(g)=>{g.preventDefault(),M(null,nl.length)}},"拖到这里可移为根任务末尾"),Jl("div",{className:"todo-tree","data-testid":"todo-note-tree"},k.length===0?Jl(W8,{title:"没有匹配任务",text:"调整筛选或新增任务"}):k.map(({todo:g,index:cl})=>Jl(zG,{key:g.id,todo:g,depth:0,parentId:null,index:cl,siblingCount:nl.length,filter:j,editingId:q,editingTitle:p,setEditingTitle:O,beginEdit:Kl,saveEdit:wl,applyTodoAction:h,addChild:El,dragTodoId:Z,setDragTodoId:V,dropTodo:M}))))))))}function zG(l){let{todo:u,depth:r,parentId:f,index:n,siblingCount:t,filter:i,editingId:y,editingTitle:c,setEditingTitle:_,beginEdit:A,saveEdit:F,applyTodoAction:j,addChild:N,dragTodoId:U,setDragTodoId:w,dropTodo:G}=l,J=Array.isArray(u.children)?u.children:[],Q=J.map((W,p)=>({child:W,childIndex:p})).filter((W)=>ij(W.child,i)),m=y===u.id,q=f||null;return Jl("div",{className:"todo-row-wrap"},Jl("article",{className:`todo-row ${u.completed?"completed":""} ${U===u.id?"dragging":""}`,style:{"--todo-depth":r},draggable:!0,onDragStart:(W)=>{w(u.id),W.dataTransfer.effectAllowed="move"},onDragOver:(W)=>W.preventDefault(),onDrop:(W)=>{W.preventDefault(),G(u.id,J.length)},"data-testid":`todo-row-${KG(u.id)}`},Jl("button",{type:"button",className:"todo-expand",disabled:J.length===0,onClick:()=>j({type:"toggleTodoExpanded",todoId:u.id})},J.length===0?"·":u.expanded?"▾":"▸"),Jl("input",{type:"checkbox",checked:Boolean(u.completed),onChange:()=>j({type:"toggleTodoCompleted",todoId:u.id}),"aria-label":`完成 ${u.title}`}),Jl("div",{className:"todo-title-cell",onDoubleClick:()=>A(u)},m?Jl("div",{className:"todo-edit-inline"},Jl("input",{value:c,autoFocus:!0,onChange:(W)=>_(W.target.value),onKeyDown:(W)=>{if(W.key==="Enter")F(u.id);if(W.key==="Escape")A({id:"",title:""})}}),Jl("button",{type:"button",className:"ghost-btn",onClick:()=>F(u.id)},"保存")):Jl("strong",null,u.title||"Untitled"),Jl("div",{className:"todo-meta-line"},Jl("span",null,`子项 ${J.length}`),Jl("span",null,`更新 ${Ll(u.updatedAt)}`),u.reminderAt?Jl("span",{className:"todo-reminder"},`提醒 ${Ll(u.reminderAt)}`):Jl("span",null,"无提醒"))),Jl("input",{className:"todo-reminder-input",type:"datetime-local",value:e8(u.reminderAt),onChange:(W)=>j({type:"setTodoReminder",todoId:u.id,reminderAt:f7(W.target.value)})}),Jl("div",{className:"todo-row-actions"},Jl("button",{type:"button",className:"ghost-btn",onClick:()=>A(u)},"编辑"),Jl("button",{type:"button",className:"ghost-btn",onClick:()=>N(u.id)},"子项"),Jl("button",{type:"button",className:"ghost-btn",disabled:n<=0,onClick:()=>j({type:"moveTodo",todoId:u.id,...q?{targetParentId:q}:{},targetIndex:n-1})},"上移"),Jl("button",{type:"button",className:"ghost-btn",disabled:n<=0,onClick:()=>j({type:"moveTodo",todoId:u.id,...q?{targetParentId:q}:{},targetIndex:0})},"置顶"),Jl("button",{type:"button",className:"ghost-btn",disabled:n>=t-1,onClick:()=>j({type:"moveTodo",todoId:u.id,...q?{targetParentId:q}:{},targetIndex:n+1})},"下移"),Jl("button",{type:"button",className:"ghost-btn",disabled:!f,onClick:()=>j({type:"moveTodo",todoId:u.id,targetIndex:9999})},"提升"),Jl("button",{type:"button",className:"ghost-btn danger",onClick:()=>j({type:"deleteTodo",todoId:u.id})},"删除"))),u.expanded&&Q.length>0?Jl("div",{className:"todo-children"},Q.map(({child:W,childIndex:p})=>Jl(zG,{key:W.id,todo:W,depth:r+1,parentId:u.id,index:p,siblingCount:J.length,filter:i,editingId:y,editingTitle:c,setEditingTitle:_,beginEdit:A,saveEdit:F,applyTodoAction:j,addChild:N,dragTodoId:U,setDragTodoId:w,dropTodo:G}))):null)}var OG=Ml(Ju(),1),Fi=OG.default.createElement;function ZG({title:l,items:u,actions:r,className:f,testId:n}){let t=Array.isArray(u)?u:[];return Fi("section",{className:`top-status-bar ${f||""}`,"data-testid":n},Fi("div",{className:"top-status-main"},l?Fi("strong",{className:"top-status-title"},l):null,Fi("div",{className:"top-status-chips"},t.map((i,y)=>Fi("span",{key:i?.key||`${i?.label||"status"}-${y}`,className:`top-status-chip ${i?.tone||""}`,"data-testid":i?.testId},i?.label?Fi("b",null,i.label):null,Fi("span",null,i?.value??"--"))))),r?Fi("div",{className:"top-status-actions"},r):null)}var w$=Ml(Ju(),1);var ql=w$.default.createElement,{useEffect:iP,useMemo:yP}=w$.default,cP=w$.default.useState;function HG({status:l,children:u,title:r}){let f=String(l||"unknown").toLowerCase();return ql("span",{className:`status-badge ${f}`,title:r},u||l||"unknown")}function K8({label:l,value:u,hint:r,tone:f}){return ql("article",{className:`metric-card ${f||""}`},ql("div",{className:"metric-label"},l),ql("div",{className:"metric-value"},u),ql("div",{className:"metric-hint"},r))}function yj({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return ql("section",{className:`panel ${n||""}`},ql("div",{className:"panel-head"},ql("div",null,u?ql("p",{className:"panel-eyebrow"},u):null,ql(nu,{title:l,loading:t})),r?ql("div",{className:"panel-actions"},r):null),ql("div",{className:"panel-body"},f))}function BG({title:l,data:u,onOpen:r,testId:f}){return ql("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r?.(l,u)},"查看原始JSON")}function cj({title:l,text:u}){return ql("div",{className:"empty-state"},ql("strong",null,l),ql("span",null,u))}function gy(l){return Array.isArray(l)?l:[]}function $j(l){return l&&typeof l==="object"&&!Array.isArray(l)?l:{}}function $P(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function _P(l,u){return`${l}/microservices/k3sctl-adapter/proxy${u}`}function AP(l){return l.find((u)=>String(u?.id||"")==="k3sctl-adapter")||null}function FP(l){if(l?.healthy===!0)return"online";if(String(l?.role||"")==="standby")return"warn";return"failed"}function jP(l){return l?.healthy===!0?"online":"failed"}function NP(l){if(l===!0)return"YES";if(l===!1)return"NO";return"--"}function JP(l){return Array.from(new Set(l.flatMap((u)=>gy(u?.expectedNodeIds).map((r)=>String(r))))).filter(Boolean).sort()}function UP(l){let u=l.find((r)=>r?.id==="code-queue")||l[0];return String(u?.activeInstanceId||"--")}function QP(l){return ql("article",{key:l?.id||l?.nodeId,className:"k3s-instance-card"},ql("div",{className:"node-card-head"},ql("strong",null,l?.nodeId||l?.id||"--"),ql(HG,{status:FP(l)},l?.healthy?"HEALTHY":"DEGRADED")),ql("div",{className:"k3s-instance-role"},ql("span",null,String(l?.role||"worker").toUpperCase()),ql("code",null,l?.id||"--")),ql("dl",{className:"k3s-kv"},ql("dt",null,"Base URL"),ql("dd",null,ql("code",null,l?.baseUrl||"--")),ql("dt",null,"Proxy"),ql("dd",null,l?.proxyMode||"--"),ql("dt",null,"Health"),ql("dd",null,`${l?.upstreamStatus??"--"} / ${l?.status||"unknown"}`),ql("dt",null,"Checked"),ql("dd",null,Ll(l?.checkedAt))))}function mP(l,u){let r=gy(l?.instances),f=$j(l?.active);return ql(yj,{key:l?.id||"service",title:l?.id||"managed-service",eyebrow:`${l?.namespace||"unidesk"} / k3s managed service`,className:"k3s-service-panel",actions:ql(BG,{title:`k3s service ${l?.id||""}`,data:l,onOpen:u,testId:`raw-k3s-service-${l?.id||"unknown"}`})},ql("div",{className:"k3s-service-summary"},ql("div",null,ql("span",null,"状态"),ql(HG,{status:jP(l)},l?.status||"unknown")),ql("div",null,ql("span",null,"Active"),ql("strong",null,l?.activeInstanceId||"--")),ql("div",null,ql("span",null,"Single Writer"),ql("strong",null,NP(l?.singleWriter))),ql("div",null,ql("span",null,"Active Health"),ql("strong",null,f?.upstreamStatus??"--"))),r.length===0?ql(cj,{title:"暂无 k3s 实例",text:"adapter 没有返回该服务的 endpoint 列表"}):ql("div",{className:"k3s-instance-grid"},r.map(QP)))}function DG({microservices:l,onRaw:u,apiBaseUrl:r,onNavigate:f}){let n=AP(Array.isArray(l)?l:[]),t=$P(n),[i,y]=cP({loading:!1,error:"",data:null,refreshedAt:null});async function c(){y((Q)=>({...Q,loading:!0,error:""}));try{let Q=await Tl(_P(r,"/api/control-plane"));y({loading:!1,error:"",data:Q,refreshedAt:new Date})}catch(Q){y((m)=>({...m,loading:!1,error:zl(Q,"加载 k3s 控制平面失败")}))}}iP(()=>{c()},[r]);let _=yP(()=>gy(i.data?.services),[i.data]),A=JP(_),F=_.filter((Q)=>Q?.healthy===!0).length,j=_.reduce((Q,m)=>Q+gy(m?.instances).length,0),N=_.reduce((Q,m)=>Q+gy(m?.instances).filter((q)=>q?.healthy===!0).length,0),U=UP(_),w=$j(i.data?.kubectl),G=$j(i.data?.kubeApiProxy),J=gy(i.data?.manifestPaths).map((Q)=>String(Q));if(!n)return ql(cj,{title:"k3sctl-adapter 未登记",text:"请在 config.json 的 microservices 中登记 id=k3sctl-adapter,并通过该微服务连接 k3s 控制平面。"});return ql("div",{className:"k3s-page","data-testid":"k3sctl-page"},ql(yj,{title:"k3s Control Plane",eyebrow:"Managed by k3sctl-adapter",className:"k3s-hero-panel",loading:i.loading,actions:ql(w$.default.Fragment,null,ql("button",{type:"button",className:"ghost-btn",onClick:c,disabled:i.loading,"data-testid":"k3s-refresh-button"},i.loading?"刷新中":"刷新"),f?ql("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","code-queue"),"data-testid":"k3s-open-code-queue"},"打开 Code Queue"):null,ql(BG,{title:"k3sctl-adapter microservice",data:n,onOpen:u,testId:"raw-k3s-adapter"}))},ql("div",{className:"k3s-hero"},ql("div",{className:"k3s-orb","aria-hidden":"true"},ql("span",null,"k3s")),ql("div",{className:"k3s-hero-copy"},ql("p",{className:"eyebrow"},"D601 native control plane"),ql("h2",null,"UniDesk 只管理 adapter;业务微服务交给 k3s 标准服务路由"),ql("p",{className:"muted paragraph"},"Code Queue 的前端/API 请求进入 k3sctl-adapter,再由 adapter 转发到 k3s active service。provider-gateway 只用于维护 adapter 和节点诊断,不再直接管理 Code Queue 容器。"),ql("div",{className:"k3s-route-strip"},ql("span",null,"NO FALLBACK"),ql("code",null,i.data?.runtimePath||"frontend -> backend-core -> k3sctl-adapter")))),ql("div",{className:"metric-grid"},ql(K8,{label:"控制面",value:i.data?.clusterId||"D601",hint:`adapter ${t.providerStatus||"unknown"}`,tone:t.providerStatus==="online"?"ok":"warn"}),ql(K8,{label:"代管服务",value:_.length,hint:`${F}/${_.length||0} healthy`,tone:F===_.length&&_.length>0?"ok":"warn"}),ql(K8,{label:"节点",value:A.join(" / ")||"--",hint:"expected k3s nodes"}),ql(K8,{label:"实例",value:`${N}/${j}`,hint:`active ${U}`,tone:N===j&&j>0?"ok":"warn"})),ql("div",{className:"k3s-control-plane-grid"},ql("article",{className:"k3s-control-plane-card"},ql("span",null,"service proxy"),ql("strong",null,G.configured===!0?"K8S API PROXY":"PROXY DEGRADED"),ql("p",null,G.configured===!0?`${G.mode||"kubernetes-api-service-proxy"} via ${G.connectHost||"--"}`:"adapter 必须通过 k8s API service proxy 访问业务服务,不回退到业务容器直连。")),ql("article",{className:"k3s-control-plane-card"},ql("span",null,"manifests"),ql("strong",null,J.length||"--"),ql("p",null,J.join(" / ")||"未配置 manifest")),ql("article",{className:"k3s-control-plane-card"},ql("span",null,"cluster snapshot"),ql("strong",null,w.enabled===!0?w.ok===!0?"KUBECTL OK":"KUBECTL DEGRADED":"API ONLY"),ql("p",null,w.enabled===!0?`nodes ${w.nodeCount??"--"}`:"控制面页面以 adapter 返回的 k8s service proxy 状态为准;kubectl 只作为可选快照。"))),i.error?ql(el,{error:i.error}):null,i.refreshedAt?ql("p",{className:"muted paragraph"},`最近刷新 ${iu(i.refreshedAt)}`):null),_.length===0?ql(yj,{title:"代管服务",eyebrow:"k3s services",loading:i.loading},ql(cj,{title:"暂无 k3s 服务",text:"等待 k3sctl-adapter 返回 /api/services;Code Queue 应显示 D601 scheduler/read/write 服务实例。"})):_.map((Q)=>mP(Q,u)))}var q$=Ml(Ju(),1);var du=q$.default.createElement;function VG({onClose:l}){let{notifications:u,removeNotification:r,clearNotifications:f}=Xr(),n=q$.default.useRef(null);if(q$.default.useEffect(()=>{let t=(i)=>{if(n.current&&!n.current.contains(i.target))l()};return document.addEventListener("mousedown",t),()=>document.removeEventListener("mousedown",t)},[l]),u.length===0)return du("div",{className:"notification-popup",ref:n},du("div",{className:"notification-popup-header"},du("span",null,"通知"),du("button",{className:"notification-popup-close",onClick:l},"×")),du("div",{className:"notification-popup-empty"},"暂无通知"));return du("div",{className:"notification-popup",ref:n},du("div",{className:"notification-popup-header"},du("span",null,`通知 (${u.length})`),du("div",{className:"notification-popup-actions"},du("button",{className:"notification-popup-clear",onClick:f},"清空"),du("button",{className:"notification-popup-close",onClick:l},"×"))),du("div",{className:"notification-popup-list"},u.slice().reverse().map((t)=>du("div",{key:t.id,className:`notification-item ${t.type}`},du("span",{className:"notification-item-icon"},t.type==="success"?"✓":"×"),du("span",{className:"notification-item-message"},t.message),du("button",{className:"notification-item-dismiss",onClick:()=>r(t.id)},"×")))))}function SG({notification:l}){let{removeNotification:u}=Xr();return q$.default.useEffect(()=>{let r=setTimeout(()=>{u(l.id)},3000);return()=>clearTimeout(r)},[l.id,u]),du("div",{className:`notification-banner ${l.type}`,role:"alert"},du("span",{className:"notification-banner-icon"},l.type==="success"?"✓":"×"),du("span",{className:"notification-banner-message"},l.message),du("button",{className:"notification-banner-dismiss",onClick:()=>u(l.id)},"×"))}function kG(l,u){let r=document.getElementById("root")?.getAttribute(l);if(!r)return u;try{let f=JSON.parse(r);return typeof f==="object"&&f!==null&&!Array.isArray(f)?f:u}catch{return u}}var vl=kG("data-config",{apiBaseUrl:"/api",authUsername:"admin"}),YG=vl.environment&&typeof vl.environment==="object"?vl.environment:{},wP=kG("data-codex-overview",null),$=Ni.default.createElement,{useEffect:Bn,useMemo:W$}=Ni.default,Il=Ni.default.useState,jj=Ni.default.createContext(!1),Cf=zm(o3),qP={id:"code-queue",name:"Code Queue",providerId:"D601",description:"Code Queue",repository:{containerName:"k3s:code-queue"},backend:{nodeBaseUrl:"k3s://code-queue",nodeBindHost:"k3s://unidesk/code-queue",nodePort:4222,proxyMode:"k3sctl-adapter-http",public:!1},deployment:{mode:"k3sctl-managed",adapterServiceId:"k3sctl-adapter",k3sServiceId:"code-queue"},runtime:{orchestrator:"k3sctl",providerStatus:"loading",providerName:"D601"}};function XG(){return typeof document>"u"||document.visibilityState!=="hidden"}function IG(l){return l?.environment==="dev"||l?.namespace==="unidesk-dev"}function LP(l){let u=typeof l==="string"?l:"";return u.length>=7?u.slice(0,7):u||"unknown"}function GP(l,u){if(l==="ops"&&u==="status")return 5000;if(l==="nodes"&&u==="monitor")return 5000;if(l==="tasks"&&(u==="dispatch"||u==="scheduled"||u==="pending"))return 5000;if(l==="nodes"||l==="ops")return 1e4;if(l==="apps")return 15000;if(l==="tasks")return 15000;return 30000}async function WP(l){if(!l?._summaryOnly||!l?.id)return l;return(await Tl(`${vl.apiBaseUrl}/tasks/${encodeURIComponent(String(l.id))}`))?.task||l}function T$(l){return l?._summaryOnly?{...l,_loadRaw:()=>WP(l)}:l}function ct(l){if(!Number.isFinite(l))return"--";let u=Math.max(0,l);if(u===0)return"0s";if(u<0.01)return"<0.01s";if(u<0.1)return`${u.toFixed(2)}s`;if(u<1)return`${u.toFixed(1)}s`;if(u<10&&!Number.isInteger(u))return`${u.toFixed(1)}s`;if(u<60)return`${Math.round(u)}s`;let r=Math.floor(u);if(r<3600)return`${Math.floor(r/60)}m ${r%60}s`;return`${Math.floor(r/3600)}h ${Math.floor(r%3600/60)}m`}function Lf(l){let u=Number(l);if(!Number.isFinite(u))return"--";if(u<1)return`${Math.max(0,u).toFixed(1)}ms`;if(u<10)return`${u.toFixed(1)}ms`;if(u<1000)return`${Math.round(u)}ms`;return ct(u/1000)}function Qr(l){let u=Number(l);if(!Number.isFinite(u)||u<=0)return"--";let r=["B","KB","MB","GB","TB"],f=u,n=0;while(f>=1024&&n0)return r[f]}return"任务失败但 provider 未返回明确原因"}function _0(l){if(l===null||l===void 0)return"--";if(typeof l==="boolean")return l?"是":"否";if(typeof l==="number")return String(l);if(typeof l==="string")return l.length>80?`${l.slice(0,77)}...`:l;if(Array.isArray(l))return`${l.length} 项`;if(typeof l==="object")return`${Object.keys(l).length} 字段`;return String(l)}function KP(l,u){let r=l.replace(/[-_\s]/g,"").toLowerCase(),f=r==="ts"||r.endsWith("at")||r.endsWith("timestamp")||r.endsWith("heartbeat");if((typeof u==="string"||typeof u==="number")&&f){let n=Ll(u);if(n!=="--")return n}if(l==="bodyText"&&typeof u==="string")return`${/^\s*[{[]/.test(u)?"JSON":"HTTP"} body ${u.length} chars`;return _0(u)}function dG(l){if(!l||typeof l!=="object"||Array.isArray(l))return[];return Object.entries(l)}function ff(l){return String(l).replace(/[^a-zA-Z0-9_-]/g,"_")}function Jj(l,u){return l&&typeof l==="object"&&!Array.isArray(l)?l[u]:void 0}function p8(l,u,r="未知"){let f=Jj(l?.labels,u);return typeof f==="string"&&f.length>0?f:r}function eG(l){return p8(l,"providerGatewayVersion")}function G$(l){return p8(l,"providerGatewayUpgradePolicy")}function PG(l){return p8(l,"providerGatewayStartedAt","")}function lW(l){let u=Jj(l?.labels,"unideskCapabilities");if(typeof u==="string")return u.split(",").map((r)=>r.trim()).filter(Boolean);return Array.isArray(u)?u.filter((r)=>typeof r==="string"):[]}function uW(l,u){return lW(l).includes(u)}function CG(l,u){let r=Jj(l?.labels,u);return r===!0||r==="true"||r==="1"}function EP(l){if(!uW(l,"host.ssh"))return{tone:"fail",label:"不可用",detail:"未声明 host.ssh"};if(!CG(l,"hostSshConfigured"))return{tone:"warn",label:"未配置",detail:"缺少 SSH 环境变量"};if(!CG(l,"hostSshKeyPresent"))return{tone:"warn",label:"缺 key",detail:"私钥未挂载"};return{tone:"ok",label:"可用",detail:p8(l,"hostSshTarget","host.ssh ready")}}function pP(l){if(!uW(l,"provider.upgrade"))return{tone:"fail",label:"不可用",detail:"未声明 provider.upgrade"};let u=G$(l);if(u!=="always-enabled")return{tone:"warn",label:"待确认",detail:`策略 ${u}`};return{tone:"ok",label:"可用",detail:"always-enabled"}}function Uj(l){let u=typeof l==="string"&&l.length>0?l:"未知";if(u==="未知")return"版本未知";return u.startsWith("v")?u:`v${u}`}function rW(l){return l?.payload&&typeof l.payload==="object"&&!Array.isArray(l.payload)?l.payload:{}}function z8(l){return l?.result&&typeof l.result==="object"&&!Array.isArray(l.result)?l.result:{}}function E8(l){let u=rW(l),r=z8(l);return(u.mode??r.mode)==="schedule"?"schedule":"plan"}function zP(l){let u=rW(l).source;return typeof u==="string"&&u.length>0?u:"unknown"}function OP(l){let u=z8(l),r=u.plan&&typeof u.plan==="object"&&!Array.isArray(u.plan)?u.plan:{},f=u.policy??r.policy;return typeof f==="string"&&f.length>0?f:"--"}function fW(l){let u=z8(l),r=u.plan&&typeof u.plan==="object"&&!Array.isArray(u.plan)?u.plan:{},f=u.targetProviderGatewayVersion??u.providerGatewayVersion??r.targetProviderGatewayVersion??r.providerGatewayVersion;return typeof f==="string"&&f.length>0?Uj(f):"版本未知"}function nW(l){if(String(l?.status||"").toLowerCase()==="failed")return oG(l);if(Iy(l))return"等待 provider 回传升级终态";let r=z8(l);if(typeof r.updaterContainerId==="string"&&r.updaterContainerId.length>0)return`updater ${r.updaterContainerId.slice(0,18)}`;if(typeof r.message==="string"&&r.message.length>0)return r.message;if(r.plan)return"升级计划已生成";return"无升级结果摘要"}function tW(l,u){return l.filter((r)=>r?.providerId===u&&r?.command==="provider.upgrade").sort((r,f)=>(Dn(f.updatedAt)??0)-(Dn(r.updatedAt)??0))}function ZP(l){return l.find((u)=>E8(u)==="schedule")||l[0]||null}function iW(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function hG(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function HP(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function Wu({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return $("span",{className:`status-badge ${r}`},u||l||"unknown")}function Qu({label:l,value:u,hint:r,tone:f,onClick:n,testId:t}){let i=typeof n==="function";return $("article",{className:`metric-card ${f||""} ${i?"clickable":""}`,role:i?"button":void 0,tabIndex:i?0:void 0,"data-testid":t,onClick:n,onKeyDown:i?(y)=>{if(y.key==="Enter"||y.key===" ")y.preventDefault(),n()}:void 0},$("div",{className:"metric-label"},l),$("div",{className:"metric-value"},u),$("div",{className:"metric-hint"},r))}function ru({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){let i=Ni.default.useContext(jj),y=Boolean(t)||i;return $("section",{className:`panel ${n||""}`},$("div",{className:"panel-head"},$("div",null,u?$("p",{className:"panel-eyebrow"},u):null,$(nu,{title:l,loading:y})),r?$("div",{className:"panel-actions"},r):null),$("div",{className:"panel-body"},f))}function eu({title:l,data:u,onOpen:r,testId:f}){let[n,t]=Il(!1),i=u&&typeof u==="object"&&typeof u._loadRaw==="function"?u._loadRaw:null;async function y(){if(!i){r(l,u);return}t(!0);try{r(l,await i())}catch(c){r(l,{ok:!1,error:zl(c,"读取原始 JSON 失败"),fallback:u})}finally{t(!1)}}return $("button",{type:"button",className:"ghost-btn","data-testid":f,disabled:n,onClick:()=>void y()},n?"读取中":"查看原始JSON")}function BP({raw:l,onClose:u}){if(!l)return null;return $("div",{className:"modal-backdrop",role:"presentation"},$("section",{className:"raw-dialog",role:"dialog","aria-modal":"true","aria-label":l.title},$("div",{className:"raw-dialog-head"},$("h2",null,l.title),$("button",{type:"button",className:"ghost-btn",onClick:u},"关闭")),$("pre",{className:"raw-json","data-testid":"raw-json"},JSON.stringify(l.data,null,2))))}function yW({labels:l,limit:u=8}){let r=dG(l).slice(0,u);if(r.length===0)return $("span",{className:"muted"},"无标签");return $("div",{className:"chip-row"},r.map(([f,n])=>$("span",{key:f,className:"data-chip"},$("b",null,f),$("span",null,_0(n)))))}function ky({node:l}){let u=eG(l);return $("span",{className:`version-chip ${u==="未知"?"unknown":""}`,"data-testid":`gateway-version-${ff(l?.providerId||"unknown")}`},Uj(u))}function MG({title:l,state:u,testId:r}){return $("span",{className:`capability-badge ${u.tone}`,title:u.detail,"data-testid":r},$("b",null,l),$("strong",null,u.label),$("small",null,u.detail))}function Qj({node:l}){let u=ff(l?.providerId||"unknown");return $("div",{className:"node-availability-strip"},$(MG,{title:"SSH 透传",state:EP(l),testId:`ssh-availability-${u}`}),$(MG,{title:"远程更新",state:pP(l),testId:`upgrade-availability-${u}`}))}function Ji({data:l,empty:u="无数据"}){if(l===null||l===void 0)return $("span",{className:"muted"},u);if(typeof l!=="object")return $("span",{className:"summary-value"},_0(l));if(Array.isArray(l))return $("span",{className:"summary-value"},`${l.length} 项列表`);let r=Object.entries(l).slice(0,5);if(r.length===0)return $("span",{className:"muted"},u);return $("div",{className:"summary-grid"},r.map(([f,n])=>$("span",{key:f,className:"summary-item"},$("b",null,f),$("span",null,KP(f,n)))))}function wu({title:l,text:u}){return $("div",{className:"empty-state"},$("strong",null,l),$("span",null,u))}function DP({onLogin:l}){let[u,r]=Il(vl.authUsername||"admin"),[f,n]=Il(""),[t,i]=Il(""),[y,c]=Il(!1);async function _(A){A.preventDefault(),c(!0),i("");try{let F=await Tl("/login",{method:"POST",body:JSON.stringify({username:u,password:f})});l(F)}catch(F){i(zl(F,"登录失败"))}finally{c(!1)}}return $("main",{className:"login-screen","data-testid":"login-screen"},$("section",{className:"login-card"},$("div",{className:"login-brand"},$("span",{className:"brand-mark"},"UD"),$("div",null,$("h1",null,"UniDesk"),$("p",null,"Control Plane Login"))),$("form",{className:"login-form",onSubmit:_},$("label",null,"账号",$("input",{name:"username",autoComplete:"username",value:u,onChange:(A)=>r(A.target.value)})),$("label",null,"密码",$("input",{name:"password",type:"password",autoComplete:"current-password",value:f,onChange:(A)=>n(A.target.value)})),$(el,{error:t}),$("button",{type:"submit",disabled:y},y?"登录中":"登录")),$("div",{className:"login-note"},"默认账号由 config.json 注入;公网入口只暴露前端登录面。")))}function VP({connection:l,lastRefresh:u,onRefresh:r,onLogout:f,session:n,clock:t,activeStatusItems:i=[],onNotificationToggle:y,unreadCount:c=0,environment:_={}}){let A=IG(_),F=[...A?[{key:"environment",label:"环境",value:`${_.namespace||"unidesk-dev"}`,tone:"warn"}]:[],{key:"core",label:"核心",value:l.text,tone:l.ok?"ok":"fail",testId:"conn-text"},...Array.isArray(i)?i:[],{key:"refresh",label:"刷新",value:u?iu(u):"未刷新"},{key:"clock",label:x$,value:iu(t)},{key:"user",label:"用户",value:n?.user?.username||"--",tone:"user"}];return $("header",{className:"topbar"},$("div",null,$("p",{className:"eyebrow"},"Distributed Work Platform"),$("h1",null,"UniDesk 控制平面"),A?$("div",{className:"dev-env-ribbon","data-testid":"dev-environment-ribbon"},$("b",null,"DEV"),$("span",null,_.namespace||"unidesk-dev"),$("span",null,_.deployRef||"origin/master:deploy.json#environments.dev"),$("span",null,LP(_.commit||_.requestedCommit))):null),$(ZG,{className:"global-top-status",title:"状态",items:F,actions:[$("button",{key:"notification",type:"button",className:`notification-icon-btn ${c>0?"has-unread":""}`,onClick:y,"aria-label":"通知"},"\uD83D\uDD14",c>0?$("span",{key:"badge",className:"notification-badge"},c>99?"99+":c):null),$("button",{key:"refresh",type:"button",className:"ghost-btn",onClick:r},"刷新"),$("button",{key:"logout",type:"button",className:"ghost-btn danger",onClick:f},"退出")]}))}function SP(l){return!l.defaultPrevented&&l.button===0&&!l.metaKey&&!l.altKey&&!l.ctrlKey&&!l.shiftKey&&l.currentTarget.target!=="_blank"}function cW({moduleId:l,tabId:u,className:r,active:f=!1,title:n,testId:t,onNavigate:i,children:y}){let c=d3(Cf,l,u);return $("a",{href:c,role:"button",className:r,title:n,"aria-current":f?"page":void 0,"data-testid":t,"data-route":c,onClick:(_)=>{if(!SP(_))return;_.preventDefault(),i(l,u)}},y)}function YP({activeModule:l,activeTabs:u,onNavigate:r,collapsed:f,onToggle:n}){return $("aside",{className:`rail ${f?"collapsed":""}`,"aria-label":"主模块"},$("div",{className:"brand"},$("span",{className:"brand-mark"},"UD"),$("span",{className:"brand-text"},"UniDesk"),$("button",{type:"button",className:"rail-toggle",onClick:n,"aria-label":f?"展开左侧边栏":"收起左侧边栏","data-testid":"rail-toggle"},f?"»":"«")),o3.map((t)=>{let i=u[t.id]||z1[t.id]||t.tabs[0]?.id||"";return $(cW,{key:t.id,moduleId:t.id,tabId:i,className:`module ${l===t.id?"active":""}`,active:l===t.id,title:t.label,onNavigate:r},$("span",{className:"module-code"},t.code),$("span",null,t.label))}))}function XP({module:l,activeTab:u,onNavigate:r}){return $("nav",{className:"tabs","aria-label":`${l.label} 子功能`},l.tabs.map((f)=>$(cW,{key:f.id,moduleId:l.id,tabId:f.id,className:`tab ${u===f.id?"active":""}`,active:u===f.id,onNavigate:r},f.label)))}function PP({data:l,onRaw:u,onNavigate:r}){let f=l.overview||{},n=l.nodes.filter((N)=>N.status==="online"),t=l.pendingTasks||l.tasks.filter(Iy),i=f.pendingTaskCount??t.length,y=l.tasks.slice(0,5),c=f.pgdata||{},_=f.microserviceAvailability||{},A=xl(_.totalCount),F=xl(_.healthyCount),j=xl(_.unhealthyCount);return $("div",{className:"page-grid overview-grid","data-testid":"overview-page"},$(ru,{title:"核心指标",eyebrow:"Control"},$("div",{className:"metric-grid"},$(Qu,{label:"数据库",value:f.dbReady?"READY":"WAIT",hint:"PostgreSQL internal network",tone:f.dbReady?"ok":"warn"}),$(Qu,{label:"PGDATA",value:Qr(c.databaseBytes),hint:`${c.volumeName||"unidesk_pgdata_10gb"} / ${c.databasePretty||"--"} / budget ${c.volumeSize||"--"}`,tone:"ok",testId:"pgdata-usage-card"}),$(Qu,{label:"在线节点",value:f.onlineNodeCount??0,hint:`${f.nodeCount??0} registered`,tone:"ok"}),$(Qu,{label:"WebSocket",value:f.activeSocketCount??0,hint:"Provider ingress sockets"}),$(Qu,{label:"用户服务可用",value:A>0?`${F}/${A}`:"--",hint:A>0?`healthyCount ${F} · unhealthyCount ${j}`:"strict /health probes",tone:A>0&&j===0?"ok":"warn",testId:"microservice-availability-card"}),$(Qu,{label:"待处理任务",value:i,hint:i>0?"点击查看具体任务":`timeout ${ct(Math.floor((f.taskPendingTimeoutMs??0)/1000))}`,tone:i>0?"warn":"ok",onClick:()=>r("tasks","pending"),testId:"pending-task-card"}))),$(ru,{title:"本机 Provider",eyebrow:"Self Connected"},n.length===0?$(wu,{title:"暂无在线节点",text:"provider-gateway 未完成自接入"}):$("div",{className:"node-card-list"},n.slice(0,4).map((N)=>$(CP,{key:N.providerId,node:N,onRaw:u})))),$(ru,{title:"待处理任务明细",eyebrow:`${i} Pending`,actions:$("button",{type:"button",className:"ghost-btn",onClick:()=>r("tasks","pending"),"data-testid":"pending-task-detail-link"},"进入任务调度")},t.length===0?$(wu,{title:"当前无待处理",text:"queued / dispatched / running 超时后会自动转为 failed,避免总览长期卡住"}):$("div",{className:"compact-list"},t.slice(0,5).map((N)=>$(bG,{key:N.id,task:N,onRaw:u})))),$(ru,{title:"最近任务",eyebrow:"Dispatch"},y.length===0?$(wu,{title:"暂无任务",text:"可以在任务调度模块发起 docker.ps 或 echo"}):$("div",{className:"compact-list"},y.map((N)=>$(bG,{key:N.id,task:N,onRaw:u})))))}function CP({node:l,onRaw:u}){return $("article",{className:"node-card"},$("div",{className:"node-card-head"},$("div",null,$("strong",null,l.name),$("code",null,l.providerId)),$(Wu,{status:l.status})),$("div",{className:"node-version-line"},$(ky,{node:l}),$("span",null,`升级策略 ${G$(l)}`)),$(Qj,{node:l}),$(yW,{labels:l.labels,limit:6}),$("div",{className:"node-card-foot"},$("span",null,`心跳 ${Ll(l.lastHeartbeat)}`),$(eu,{title:`Provider ${l.providerId}`,data:l,onOpen:u,testId:`raw-node-${ff(l.providerId)}`})))}function hP({events:l,onRaw:u}){return $(ru,{title:"事件摘要",eyebrow:"Latest 100"},l.length===0?$(wu,{title:"暂无事件",text:"Provider 注册、心跳超时和任务状态会写入事件流"}):$("div",{className:"table-wrap"},$("table",null,$("thead",null,$("tr",null,$("th",null,"ID"),$("th",null,"类型"),$("th",null,"来源"),$("th",null,"摘要"),$("th",null,"时间"),$("th",null,"操作"))),$("tbody",null,l.map((r)=>$("tr",{key:r.id},$("td",null,$("code",null,r.id)),$("td",null,$(Wu,{status:r.type},r.type)),$("td",null,$("code",null,r.source)),$("td",null,$(Ji,{data:r.payload})),$("td",null,Ll(r.createdAt)),$("td",null,$(eu,{title:`Event ${r.id}`,data:r,onOpen:u}))))))))}function MP({logs:l,onRaw:u}){return $(ru,{title:"服务日志",eyebrow:"Core Recent"},l.length===0?$(wu,{title:"暂无日志",text:"backend-core 内存日志会在请求和 provider 事件后出现"}):$("div",{className:"log-list"},l.slice(-80).reverse().map((r,f)=>$("article",{key:f,className:`log-row ${r.level||"info"}`},$("span",null,Ll(r.ts)),$("b",null,r.level||"info"),$("strong",null,r.message||"log"),$(Ji,{data:r.data,empty:"无附加字段"}),$(eu,{title:`Log ${r.message||f}`,data:r,onOpen:u})))))}function sP({nodes:l,onRaw:u}){return $(ru,{title:"节点清单",eyebrow:`${l.length} Providers`},l.length===0?$(wu,{title:"暂无 Provider 节点",text:"确认 provider-gateway 已连接 provider ingress"}):$("div",{className:"table-wrap"},$("table",{className:"node-list-table"},$("thead",null,$("tr",null,$("th",null,"状态"),$("th",null,"Provider"),$("th",null,"网关版本"),$("th",null,"运维可用性"),$("th",null,"资源标签"),$("th",null,"连接时间"),$("th",null,"最后心跳"),$("th",null,"操作"))),$("tbody",null,l.map((r)=>$("tr",{key:r.providerId},$("td",null,$(Wu,{status:r.status})),$("td",null,$("strong",null,r.name),$("code",null,r.providerId)),$("td",null,$("div",{className:"gateway-cell"},$(ky,{node:r}),$("span",null,G$(r)))),$("td",null,$(Qj,{node:r})),$("td",null,$(yW,{labels:r.labels,limit:5})),$("td",null,Ll(r.connectedAt)),$("td",null,Ll(r.lastHeartbeat)),$("td",null,$(eu,{title:`Provider ${r.providerId}`,data:r,onOpen:u,testId:`raw-node-table-${ff(r.providerId)}`}))))))))}function RP({nodes:l}){let u=W$(()=>{let r=[];for(let f of l)for(let[n,t]of dG(f.labels))r.push({providerId:f.providerId,name:f.name,key:n,value:t});return r},[l]);return $(ru,{title:"资源标签",eyebrow:"Structured Labels"},u.length===0?$(wu,{title:"暂无标签",text:"provider-gateway 注册消息会同步资源标签"}):$("div",{className:"label-matrix"},u.map((r)=>$("article",{key:`${r.providerId}-${r.key}`,className:"label-card"},$("span",null,r.key),$("strong",null,_0(r.value)),$("code",null,r.providerId)))))}function xP({nodes:l}){return $(ru,{title:"心跳状态",eyebrow:"Provider Liveness"},l.length===0?$(wu,{title:"无心跳",text:"等待 provider 注册和 heartbeat"}):$("div",{className:"heartbeat-list"},l.map((u)=>$("article",{key:u.providerId,className:"heartbeat-row"},$("span",{className:`pulse ${u.status}`}),$("div",null,$("strong",null,u.name),$("code",null,u.providerId)),$("div",null,$("span",null,"connected"),$("b",null,Ll(u.connectedAt))),$("div",null,$("span",null,"last heartbeat"),$("b",null,Ll(u.lastHeartbeat)))))))}function bP({nodes:l,systemStatuses:u,tasks:r,onRaw:f,refresh:n}){let[t,i]=Il(""),y=W$(()=>l.map((w)=>{let G=u.find((J)=>J.providerId===w.providerId);return{...w,systemCurrent:G?.current||null,systemHistory:G?.history||[],systemUpdatedAt:G?.updatedAt||null}}),[l,u]),c=y.find((w)=>w.providerId===t)||y[0]||null;if(Bn(()=>{if(!t&&y[0])i(y[0].providerId)},[y.length,t]),!c)return $(wu,{title:"暂无资源监控",text:"等待 provider 上报 CPU、内存和硬盘指标"});let _=c.systemCurrent,A=c.systemHistory||[],F=_?.cpu||{},j=_?.memory||{},N=_?.disk||{},U=A.length>0?A:_?[{at:_.collectedAt,cpuPercent:xl(F.percent),memoryPercent:xl(j.percent),diskPercent:xl(N.percent)}]:[];return $("div",{className:"monitor-page","data-testid":"node-monitor-page"},$("div",{className:"docker-node-strip"},y.map((w)=>$("button",{key:w.providerId,type:"button",className:`docker-node-tile ${c.providerId===w.providerId?"active":""}`,onClick:()=>i(w.providerId)},$("span",{className:`pulse ${w.status}`}),$("strong",null,w.name),$("code",null,w.providerId),$("span",null,w.systemCurrent?`CPU ${ji(w.systemCurrent.cpu?.percent)} / MEM ${ji(w.systemCurrent.memory?.percent)}`:"等待指标")))),$("div",{className:"monitor-layout"},$(ru,{title:"任务管理器视图",eyebrow:c.name,className:"monitor-main-panel",actions:_?$(eu,{title:`System ${c.providerId}`,data:{current:_,history:A},onOpen:f}):null},!_?$(wu,{title:"系统指标未上报",text:"provider-gateway 会周期性采集 /proc 与 df,并保存历史曲线"}):$("div",null,$("div",{className:"monitor-hero"},$("div",null,$("p",{className:"panel-eyebrow"},"Node Performance"),$("h3",null,c.name),$("div",{className:"docker-meta"},$("span",null,`${F.cores||0} CPU cores`),$("span",null,`load ${xl(F.load1).toFixed(2)} / ${xl(F.load5).toFixed(2)} / ${xl(F.load15).toFixed(2)}`),$("span",null,`memory actual ${Qr(j.usedBytes)} / ${Qr(j.totalBytes)}`),$("span",null,`disk ${Qr(N.usedBytes)} / ${Qr(N.totalBytes)}`))),$(Wu,{status:_.ok?"online":"warn"},_.ok?"METRICS READY":"METRICS DEGRADED")),$("div",{className:"monitor-chart-grid"},$(Aj,{title:"CPU",metricKey:"cpuPercent",current:F.percent,points:U,detail:`${F.cores||0} cores / load ${xl(F.load1).toFixed(2)}`,tone:"cpu",testId:"metric-chart-cpu"}),$(Aj,{title:"Memory",metricKey:"memoryPercent",current:j.percent,points:U,detail:`${Qr(j.usedBytes)} actual / ${Qr(j.cacheBytes)} cache excluded`,tone:"memory",testId:"metric-chart-memory"}),$(Aj,{title:"Disk",metricKey:"diskPercent",current:N.percent,points:U,detail:`${N.path||"/"} mounted ${N.mount||"--"}`,tone:"disk",testId:"metric-chart-disk"})),$("div",{className:"monitor-summary-grid"},$(Qu,{label:"CPU 当前",value:ji(F.percent),hint:`history ${U.length} samples`,tone:"ok"}),$(Qu,{label:"实际内存",value:Qr(j.usedBytes),hint:`${ji(j.percent)} 不含缓存`}),$(Qu,{label:"硬盘已用",value:Qr(N.usedBytes),hint:ji(N.percent)}),$(Qu,{label:"更新时间",value:Ll(c.systemUpdatedAt||_.collectedAt),hint:c.providerId})),$(vP,{current:_,onRaw:f}))),$("div",{className:"monitor-side-stack"},$(lC,{provider:c,refresh:n,onRaw:f}),$(uC,{provider:c,tasks:r,onRaw:f,limit:5}),$(ru,{title:"采样说明",eyebrow:"Retention"},$("div",{className:"monitor-note-list"},$("article",null,$("b",null,"CPU"),$("span",null,"从 /proc/stat 计算相邻采样差值,首个采样用 load/cores 近似")),$("article",null,$("b",null,"Memory"),$("span",null,"实际内存 = MemTotal - MemFree - Buffers - Cached - SReclaimable + Shmem,不把 page cache / buffer 计入占用")),$("article",null,$("b",null,"Disk"),$("span",null,"使用 df -PB1 对配置路径采样,默认监控根文件系统")),$("article",null,$("b",null,"Process"),$("span",null,"从 /proc/[pid] 采集进程 CPU、实际内存 PSS、RSS、线程数和磁盘 I/O 速率;PSS 不重复计算共享内存,表格默认按内存占用降序")))))))}function $W(l){return xl(l.memoryBytes,xl(l.pssBytes,xl(l.rssBytes)))}function sG(l,u){if(u==="memory")return $W(l);if(u==="cpu")return xl(l.cpuPercent);if(u==="disk")return xl(l.readBytesPerSecond)+xl(l.writeBytesPerSecond);if(u==="pid")return xl(l.pid);if(u==="threads")return xl(l.threads);if(u==="runtime")return xl(l.elapsedSeconds);if(u==="user")return String(l.user||"");return String(l.name||l.command||"")}function RG({value:l,label:u,tone:r}){let f=Math.max(1,Math.min(100,xl(l)));return $("div",{className:`process-meter ${r||""}`},$("span",{style:{width:`${f}%`}}),$("b",null,u))}function vP({current:l,onRaw:u}){let[r,f]=Il({key:"memory",direction:"desc"}),n=Ni.default.useContext(jj),t=l?.processSummary&&typeof l.processSummary==="object"?l.processSummary:{},i=Array.isArray(l?.processes)?l.processes:[],y=String(t.memoryMode||""),c=y.includes("pss_smaps_rollup")?"PSS":y==="rss_minus_shared_fallback"?"RSS-shared":"RSS fallback",_=W$(()=>{let F=r.direction==="asc"?1:-1;return[...i].sort((j,N)=>{let U=sG(j,r.key),w=sG(N,r.key);if(typeof U==="string"||typeof w==="string")return String(U).localeCompare(String(w),"zh-CN")*F;return(U-w)*F||xl(j.pid)-xl(N.pid)})},[i,r.key,r.direction]),A=(F,j)=>{let N=r.key===j,U=N?r.direction==="asc"?"ascending":"descending":"none";return $("th",{"aria-sort":U},$("button",{type:"button",className:`process-sort-button ${N?"active":""}`,"data-testid":`process-sort-${j}`,onClick:()=>f((w)=>({key:j,direction:w.key===j&&w.direction==="desc"?"asc":"desc"}))},F,$("span",null,N?r.direction==="desc"?"↓":"↑":"↕")))};return $("section",{className:"process-resource-panel","data-testid":"process-resource-panel"},$("div",{className:"process-resource-head"},$("div",null,$("p",{className:"panel-eyebrow"},"Windows Resource Monitor Style"),$(nu,{title:"进程资源占用",level:3,loading:n})),$("div",{className:"process-resource-actions"},$("span",{className:"data-chip"},"默认按内存排序"),$("span",{className:"data-chip"},`内存口径 ${c}`),$("span",{className:"data-chip"},`${xl(t.visible,_.length)} / ${xl(t.total,_.length)} 进程`),$(eu,{title:"Process Resource Snapshot",data:{processSummary:t,processes:i},onOpen:u,testId:"raw-process-resources"}))),_.length===0?$(wu,{title:"暂无进程资源数据",text:"等待 provider-gateway 上报 /proc/[pid] 采样;旧版 provider 需要先升级到支持进程资源表的版本"}):$("div",{className:"process-table-wrap"},$("table",{className:"process-resource-table","data-testid":"process-resource-table"},$("thead",null,$("tr",null,A("进程","name"),A("PID","pid"),A("用户","user"),$("th",null,"状态"),A("CPU","cpu"),A("内存","memory"),$("th",null,"PSS / RSS"),A("磁盘 I/O","disk"),A("线程","threads"),A("运行时长","runtime"))),$("tbody",null,_.map((F)=>{let j=xl(F.readBytesPerSecond)+xl(F.writeBytesPerSecond),N=$W(F);return $("tr",{key:`${F.pid}-${F.startedAt}`,"data-testid":`process-row-${ff(F.pid)}`,"data-memory-bytes":String(N),"data-cpu-percent":String(xl(F.cpuPercent)),"data-disk-bps":String(j),"data-pid":String(xl(F.pid))},$("td",null,$("div",{className:"process-name-cell"},$("strong",null,F.name||"--"),$("span",{className:"process-command"},F.command||"--"))),$("td",null,$("code",null,F.pid||"--")),$("td",null,F.user||`uid:${F.uid??"--"}`),$("td",null,$("span",{className:`process-state state-${ff(F.state||"unknown")}`},F.state||"?")),$("td",null,$(RG,{value:F.cpuPercent,label:TP(F.cpuPercent),tone:"cpu"})),$("td",null,$(RG,{value:F.memoryPercent,label:ji(F.memoryPercent),tone:"memory"})),$("td",null,$("div",{className:"process-io-cell"},$("strong",null,Qr(N)),$("span",null,`RSS ${Qr(F.rssBytes)}`))),$("td",null,$("div",{className:"process-io-cell"},$("strong",null,_j(j)),$("span",null,`R ${_j(F.readBytesPerSecond)} / W ${_j(F.writeBytesPerSecond)}`))),$("td",null,F.threads||0),$("td",null,ct(xl(F.elapsedSeconds))))})))))}function Aj({title:l,metricKey:u,current:r,points:f,detail:n,tone:t,testId:i}){let y=f.map((j)=>Math.max(0,Math.min(100,xl(j[u])))),c=y.length>1?y:[y[0]||0,y[0]||0],_=c.length<=1?100:100/(c.length-1),A=c.map((j,N)=>`${(N*_).toFixed(2)},${(46-j*0.42).toFixed(2)}`).join(" "),F=`0,48 ${A} 100,48`;return $("article",{className:`metric-chart ${t}`,"data-testid":i},$("div",{className:"metric-chart-head"},$("div",null,$("span",null,l),$("strong",null,ji(r))),$("code",null,`${f.length} pts`)),$("svg",{viewBox:"0 0 100 48",preserveAspectRatio:"none",role:"img","aria-label":`${l} usage curve`},$("polygon",{points:F}),$("polyline",{points:A}),$("line",{x1:"0",x2:"100",y1:"24",y2:"24"})),$("div",{className:"metric-chart-foot"},$("span",null,"0%"),$("span",null,n),$("span",null,"100%")))}function $t(l){return Array.isArray(l)?l:[]}function gP(l){let u=$t(l?.core?.requests?.componentSummary);return[...$t(l?.frontend?.requests?.componentSummary),...u].sort((f,n)=>xl(n.requestCount)-xl(f.requestCount))}function kP(l){let u=$t(l?.core?.operations?.summary);return[...$t(l?.frontend?.operations?.summary),...u].sort((f,n)=>xl(n.count)-xl(f.count))}function IP(l){let u=$t(l?.core?.requests?.recentFailures).map((f)=>({source:"backend",...f}));return[...$t(l?.frontend?.requests?.recentFailures).map((f)=>({source:"frontend",...f})),...u].sort((f,n)=>(Dn(n.at)??0)-(Dn(f.at)??0)).slice(0,20)}function aP(l){let u=$t(l?.core?.operations?.recentSlowOperations);return[...$t(l?.frontend?.operations?.recentSlowOperations),...u].sort((f,n)=>xl(n.durationMs)-xl(f.durationMs)).slice(0,20)}function oP(l){let u=performance.memory,r=Number(u?.usedJSHeapSize);if(Number.isFinite(r)&&r>0)return r;let f=Number(l?.appBundleBytes);if(Number.isFinite(f)&&f>0)return f;return xl(l?.process?.heapUsedBytes)}function dP({points:l}){let u=$t(l),r=u.map((j)=>xl(j.mb)),f=Math.max(1,...r),n=Math.max(0,Math.min(...r,0)),t=Math.max(1,f-n),i=u.length>1?u:[...u,...u],y=i.length<=1?100:100/(i.length-1),c=i.map((j,N)=>{let U=xl(j.mb);return`${(N*y).toFixed(2)},${(48-(U-n)/t*42).toFixed(2)}`}).join(" "),_=`0,50 ${c} 100,50`,A=u.at(-1),F=u[0];return $("article",{className:"performance-memory-card","data-testid":"performance-memory-chart"},$("div",{className:"performance-memory-head"},$("strong",null,`Bwebui: ${A?`${xl(A.mb).toFixed(1)}MB`:"--"}`),$("span",null,u.length>0?`${u.length} samples`:"等待采样")),$("svg",{viewBox:"0 0 100 50",preserveAspectRatio:"none",role:"img","aria-label":"Bwebui memory trend"},$("polygon",{points:_}),$("polyline",{points:c}),$("line",{x1:"0",x2:"100",y1:"25",y2:"25"})),$("div",{className:"performance-axis-row"},$("span",null,F?iu(new Date(F.at)):"--"),$("span",null,"时间"),$("span",null,A?iu(new Date(A.at)):"--")),$("div",{className:"performance-axis-row"},$("span",null,`${n.toFixed(1)}`),$("span",null,"(MB)"),$("span",null,`${f.toFixed(1)}`)))}function eP({onRaw:l}){let[u,r]=Il({core:null,frontend:null}),[f,n]=Il([]),[t,i]=Il(""),[y,c]=Il(!1),[_,A]=Il(null),[F,j]=Il(!1);async function N(){c(!0),i("");try{let[B,C]=await Promise.all([Tl(`${vl.apiBaseUrl}/performance`,{cache:"no-store"}),Tl(`${vl.apiBaseUrl}/frontend-performance`,{cache:"no-store"})]);r({core:B,frontend:C});let E=oP(C);n((D)=>[...D,{at:new Date().toISOString(),mb:E/1048576}].slice(-80))}catch(B){i(zl(B,"性能指标加载失败"))}finally{c(!1)}}Bn(()=>{N();let B=setInterval(()=>void N(),5000);return()=>clearInterval(B)},[]);async function U(){j(!0),i(""),A(null);try{let B=await Tl(`${vl.apiBaseUrl}/code-queue-load-test`,{method:"POST",body:JSON.stringify({targetMs:1000,timeoutMs:90000,url:vl.frontendPublicUrl||window.location.origin})});A(B),N()}catch(B){i(zl(B,"Code Queue Playwright 测量失败"))}finally{j(!1)}}let w=gP(u),G=IP(u),J=kP(u),Q=aP(u),m=u.core?.process||{},q=u.frontend?.process||{},W=u.core?.database?.codeQueueStorage||{},p=xl(W.total),O=_?.result||{},Z=xl(O.wallMs,NaN),V=xl(O.networkIdleMs,NaN),P=O.withinTarget===!0,H=F?"running":_===null?"idle":_.measurementOk===!0?P?"passed":"slow":"failed";return $("div",{className:"performance-page","data-testid":"performance-page"},$("div",{className:"performance-hero"},$("div",null,$("p",{className:"panel-eyebrow"},"Unified Performance"),$(nu,{title:"性能面板",loading:y||F}),$("p",null,"按组件统计 HTTP 请求、失败率、P95 延迟,并汇总 backend/frontend 内部操作耗时。")),$("div",{className:"inline-actions"},$("button",{type:"button",className:"ghost-btn",onClick:()=>void U(),disabled:F,"data-testid":"code-queue-load-test-button"},F?"测试中...":"测试 Code Queue 加载"),$("button",{type:"button",className:"ghost-btn",onClick:()=>void N(),disabled:y,"data-testid":"performance-refresh-button"},y?"刷新中":"刷新"),$(eu,{title:"Performance Snapshot",data:u,onOpen:l,testId:"raw-performance"}))),$(el,{error:t}),$("div",{className:"performance-top-grid"},$(dP,{points:f}),$("div",{className:"performance-metric-stack"},$(Qu,{label:"backend RSS",value:Qr(m.rssBytes),hint:`heap ${Qr(m.heapUsedBytes)}`}),$(Qu,{label:"frontend RSS",value:Qr(q.rssBytes),hint:`bundle ${Qr(u.frontend?.appBundleBytes)}`}),$(Qu,{label:"Codex PG 任务",value:p||"--",hint:W.ok?"unidesk_code_queue_tasks":"等待表初始化",tone:W.ok?"ok":"warn"}),$(Qu,{label:"请求样本",value:xl(u.core?.requests?.sampleCount)+xl(u.frontend?.requests?.sampleCount),hint:"rolling window 3000"}))),$(ru,{title:"Code Queue 加载基准",eyebrow:"Playwright / target <1s",className:"codex-load-test-panel",loading:F,actions:$("div",{className:"panel-actions"},$("button",{type:"button",className:"primary-btn",onClick:()=>void U(),disabled:F,"data-testid":"code-queue-load-test-panel-button"},F?"正在运行 Playwright...":"手动触发测试"),_?$(eu,{title:"Code Queue Load Test",data:_,onOpen:l,testId:"raw-code-queue-load-test"}):null)},$("div",{className:"codex-load-test-grid","data-testid":"code-queue-load-test-result"},$(Qu,{label:"总耗时",value:F?"运行中":Number.isFinite(Z)?Lf(Z):"--",hint:_===null?"点击按钮启动远端 Playwright":`目标 ${Lf(O.targetMs||1000)} / ${O.url||"Code Queue"}`,tone:H==="passed"?"ok":H==="failed"||H==="slow"?"warn":""}),$(Qu,{label:"判定",value:F?"RUNNING":H==="passed"?"PASS <1s":H==="slow"?"SLOW":H==="failed"?"FAILED":"--",hint:_?.measurementOk===!1?String(_.error||O.error||"measurement failed").slice(0,120):"导航开始 -> DOMContentLoaded -> data-load-state=complete",tone:H==="passed"?"ok":H==="idle"||H==="running"?"":"fail"}),$(Qu,{label:"Network idle",value:Number.isFinite(V)?Lf(V):"--",hint:`DOMContentLoaded ${Lf(O.domContentLoadedMs)} / ${O.networkIdleReached===!1?"未在 5s 内空闲":"已空闲"}`,tone:Number.isFinite(V)&&V<=1000?"ok":"warn"}),$(Qu,{label:"组件耗时",value:Number.isFinite(xl(O.componentLoadMs,NaN))?Lf(O.componentLoadMs):"--",hint:`queue ${Lf(O.queueMs)} / detail ${Lf(O.detailMs)}`,tone:xl(O.componentLoadMs)>1000?"warn":"ok"}),$(Qu,{label:"Trace 规模",value:Number.isFinite(xl(O.transcriptRows,NaN))?String(O.transcriptRows):"--",hint:`${O.visibleTaskCount??0} visible tasks / ${O.partial?"preview":"complete"}`})),F?$("div",{className:"performance-empty-line"},"正在通过 main-server Host SSH 启动 Playwright,完成后会显示 wall time、组件耗时和最慢 API。"):null,_&&Array.isArray(O.slowestApi)&&O.slowestApi.length>0?$("div",{className:"table-wrap performance-table-wrap compact codex-load-api-table"},$("table",{className:"performance-table"},$("thead",null,$("tr",null,["API","状态","耗时"].map((B)=>$("th",{key:B},B)))),$("tbody",null,O.slowestApi.slice(0,5).map((B,C)=>$("tr",{key:`${B.url}-${C}`},$("td",null,$("code",null,B.url)),$("td",null,B.status),$("td",null,Lf(B.durationMs))))))):null),$("div",{className:"performance-grid"},$(ru,{title:"组件汇总",eyebrow:"Requests",loading:y},w.length===0?$(wu,{title:"暂无请求样本",text:"刷新几次或打开页面后会自动形成组件统计"}):$("div",{className:"table-wrap performance-table-wrap"},$("table",{className:"performance-table"},$("thead",null,$("tr",null,["组件","请求数","失败数","失败率","平均延迟","P95"].map((B)=>$("th",{key:B},B)))),$("tbody",null,w.map((B)=>$("tr",{key:B.component},$("td",null,$("code",null,B.component)),$("td",null,B.requestCount),$("td",null,B.failureCount),$("td",null,ji(xl(B.failureRate)*100)),$("td",null,Lf(B.averageLatencyMs)),$("td",null,Lf(B.p95LatencyMs)))))))),$(ru,{title:"最近失败请求",eyebrow:"Failures",loading:y},G.length===0?$("div",{className:"performance-empty-line"},"最近没有失败请求"):$("div",{className:"table-wrap performance-table-wrap compact"},$("table",{className:"performance-table"},$("thead",null,$("tr",null,["时间","来源","组件","状态","路径"].map((B)=>$("th",{key:B},B)))),$("tbody",null,G.map((B,C)=>$("tr",{key:`${B.at}-${C}`},$("td",null,Ll(B.at)),$("td",null,B.source),$("td",null,$("code",null,B.component)),$("td",null,$(Wu,{status:"failed"},B.status)),$("td",null,$("code",null,B.path)))))))),$(ru,{title:"内部操作汇总",eyebrow:"Operations",loading:y},J.length===0?$(wu,{title:"暂无内部操作样本",text:"API 查询和代理请求会自动记录内部操作耗时"}):$("div",{className:"table-wrap performance-table-wrap"},$("table",{className:"performance-table"},$("thead",null,$("tr",null,["服务","操作","次数","平均延迟","P95"].map((B)=>$("th",{key:B},B)))),$("tbody",null,J.map((B)=>$("tr",{key:`${B.service}-${B.operation}`},$("td",null,B.service),$("td",null,$("code",null,B.operation)),$("td",null,B.count),$("td",null,Lf(B.averageLatencyMs)),$("td",null,Lf(B.p95LatencyMs)))))))),$(ru,{title:"最近慢操作",eyebrow:"Slowest",loading:y},Q.length===0?$(wu,{title:"暂无慢操作",text:"后端会记录最近窗口内耗时最高的内部操作"}):$("div",{className:"table-wrap performance-table-wrap"},$("table",{className:"performance-table"},$("thead",null,$("tr",null,["时间","操作","耗时","结果","细节"].map((B)=>$("th",{key:B},B)))),$("tbody",null,Q.map((B,C)=>$("tr",{key:`${B.at}-${B.operation}-${C}`},$("td",null,Ll(B.at)),$("td",null,$("code",null,B.operation)),$("td",null,Lf(B.durationMs)),$("td",null,B.ok?"成功":"失败"),$("td",null,B.detail||"-")))))))))}function lC({provider:l,refresh:u,onRaw:r}){let[f,n]=Il(""),[t,i]=Il(null),[y,c]=Il("");async function _(A){n(A),c("");try{let F=await Tl(`${vl.apiBaseUrl}/dispatch`,{method:"POST",body:JSON.stringify({providerId:l.providerId,command:"provider.upgrade",payload:{mode:A,source:"frontend-resource-monitor",requestedAt:new Date().toISOString()}})});i({mode:A,...F}),await u()}catch(F){c(zl(F,"升级命令下发失败"))}finally{n("")}}return $(ru,{title:"Provider Gateway 升级",eyebrow:"Remote Control",loading:Boolean(f)},$("div",{className:"upgrade-control","data-testid":"provider-upgrade-control"},$("p",null,"通过 UniDesk WebSocket 向当前计算节点下发 provider.upgrade;预检只生成升级计划,执行升级会调度节点本地 updater 容器。"),$("div",{className:"upgrade-target-line"},$("span",null,"指定 Provider"),$("code",null,l.providerId),$(ky,{node:l})),$("div",{className:"upgrade-actions"},$("button",{type:"button",className:"ghost-btn",disabled:Boolean(f),onClick:()=>_("plan"),"data-testid":"upgrade-plan-button"},f==="plan"?"预检中":"预检升级"),$("button",{type:"button",className:"ghost-btn danger",disabled:Boolean(f),onClick:()=>_("schedule"),"data-testid":"upgrade-schedule-button"},f==="schedule"?"调度中":"执行升级")),$(el,{error:y}),t?$("div",{className:"upgrade-result"},$(Wu,{status:t.status||"queued"},t.status||"queued"),$("span",null,`${t.mode==="schedule"?"执行升级":"预检升级"} 已下发`),$("span",null,`指定版本 ${Uj(eG(l))}`),$("code",null,t.taskId||"--"),$(eu,{title:"Provider Upgrade Dispatch",data:t,onOpen:r})):$("span",{className:"muted"},"升级任务结果会进入任务历史;执行升级可能导致 provider 短暂重连。")))}function _W({records:l,onRaw:u,compact:r=!1}){if(l.length===0)return $(wu,{title:"暂无远程更新记录",text:"该节点还没有 provider.upgrade 任务;执行预检或升级后会在这里形成结构化记录"});return $("div",{className:`upgrade-record-table-wrap table-wrap ${r?"compact":""}`},$("table",{className:"upgrade-record-table"},$("thead",null,$("tr",null,$("th",null,"状态"),$("th",null,"模式"),$("th",null,"任务"),$("th",null,"来源"),$("th",null,"耗时"),$("th",null,"策略"),$("th",null,"Gateway 版本"),$("th",null,"结果记录"),$("th",null,"更新时间"),$("th",null,"操作"))),$("tbody",null,l.map((f)=>$("tr",{key:f.id,"data-testid":`gateway-upgrade-record-${ff(f.id)}`},$("td",null,$(Wu,{status:f.status})),$("td",null,$("span",{className:`mode-chip ${E8(f)}`},E8(f)==="schedule"?"执行升级":"预检")),$("td",null,$("strong",null,"provider.upgrade"),$("code",null,f.id)),$("td",null,zP(f)),$("td",null,$(FW,{task:f})),$("td",null,OP(f)),$("td",null,$("span",{className:"version-chip"},fW(f))),$("td",null,$("span",{className:`upgrade-outcome ${String(f.status||"").toLowerCase()}`},nW(f))),$("td",null,Ll(f.updatedAt)),$("td",null,$(eu,{title:`Provider Upgrade Task ${f.id}`,data:T$(f),onOpen:u})))))))}function uC({provider:l,tasks:u,onRaw:r,limit:f=5}){let n=tW(u,l.providerId).slice(0,f);return $(ru,{title:"远程更新记录",eyebrow:l.providerId,actions:$(ky,{node:l}),className:"provider-upgrade-records-panel"},$("div",{"data-testid":`provider-upgrade-records-${ff(l.providerId)}`},$(_W,{records:n,onRaw:r,compact:!0})))}function rC({nodes:l,tasks:u,onRaw:r}){let f=W$(()=>l.map((t)=>{let i=tW(u,t.providerId);return{node:t,records:i,latest:ZP(i),capabilities:lW(t)}}),[l,u]),n=f.reduce((t,i)=>t+i.records.length,0);return $("div",{className:"gateway-page","data-testid":"gateway-version-page"},$(ru,{title:"Provider Gateway 版本",eyebrow:`${l.length} Providers / ${n} 更新记录`},l.length===0?$(wu,{title:"暂无 Provider 节点",text:"等待 provider-gateway 注册后显示版本号和升级记录"}):$("div",{className:"table-wrap gateway-version-table-wrap"},$("table",{className:"gateway-version-table"},$("thead",null,$("tr",null,$("th",null,"状态"),$("th",null,"Provider"),$("th",null,"Gateway 版本"),$("th",null,"升级策略"),$("th",null,"运维可用性"),$("th",null,"运行时间"),$("th",null,"能力"),$("th",null,"最近远程更新"),$("th",null,"操作"))),$("tbody",null,f.map((t)=>$("tr",{key:t.node.providerId},$("td",null,$(Wu,{status:t.node.status})),$("td",null,$("strong",null,t.node.name),$("code",null,t.node.providerId)),$("td",null,$(ky,{node:t.node})),$("td",null,G$(t.node)),$("td",null,$(Qj,{node:t.node})),$("td",null,PG(t.node)?Ll(PG(t.node)):"待新版上报"),$("td",null,$("div",{className:"capability-row"},t.capabilities.length===0?$("span",{className:"muted"},"未声明"):t.capabilities.slice(0,5).map((i)=>$("span",{key:i,className:"data-chip"},i)))),$("td",null,t.latest?$("div",{className:"latest-upgrade-cell"},$(Wu,{status:t.latest.status}),$("span",null,`${E8(t.latest)==="schedule"?"执行升级":"预检"} / ${Ll(t.latest.updatedAt)}`),$("small",null,`Gateway ${fW(t.latest)}`),$("small",null,nW(t.latest))):$("span",{className:"muted"},"暂无记录")),$("td",null,$(eu,{title:`Provider ${t.node.providerId}`,data:t.node,onOpen:r})))))))),$(ru,{title:"远程更新记录",eyebrow:"Structured provider.upgrade records"},l.length===0?$(wu,{title:"暂无记录",text:"没有 provider 节点时不会生成远程更新记录"}):$("div",{className:"gateway-record-grid"},f.map((t)=>$("article",{key:t.node.providerId,className:"gateway-record-card","data-testid":`gateway-records-${ff(t.node.providerId)}`},$("div",{className:"gateway-record-head"},$("div",null,$("strong",null,t.node.name),$("code",null,t.node.providerId)),$(ky,{node:t.node})),$("div",{className:"gateway-record-meta"},$("span",null,`心跳 ${Ll(t.node.lastHeartbeat)}`),$("span",null,`策略 ${G$(t.node)}`),$("span",null,`${t.records.length} 条记录`)),$(_W,{records:t.records.slice(0,8),onRaw:r,compact:!0}))))))}function fC(l){if(l==="running")return"online";if(l==="paused"||l==="restarting")return"warn";if(l==="exited"||l==="dead")return"offline";return"internal"}function AW(l){return/^[a-f0-9]{48,64}$/i.test(l)}function L$(l){let u=String(l?.name||""),r=String(l?.labels||"");return u==="unidesk_pgdata_10gb"||r.includes("com.docker.compose.volume=unidesk_pgdata_10gb")||u.toLowerCase().includes("pgdata")}function xG(l){let u=String(l?.name||""),r=String(l?.labels||"");if(L$(l))return 0;if(r.includes("com.docker.compose.project=unidesk"))return 1;if(!AW(u))return 2;return 3}function nC(l){return[...l].sort((u,r)=>{let f=xG(u)-xG(r);if(f!==0)return f;return String(u.name||"").localeCompare(String(r.name||""))})}function tC({nodes:l,dockerStatuses:u,onRaw:r}){let[f,n]=Il(""),t=W$(()=>l.map((Q)=>{let m=u.find((q)=>q.providerId===Q.providerId);return{...Q,dockerStatus:m?.dockerStatus||null,dockerUpdatedAt:m?.updatedAt||null}}),[l,u]),i=t.find((Q)=>Q.providerId===f)||t[0]||null;if(Bn(()=>{if(!f&&t[0])n(t[0].providerId)},[t.length,f]),!i)return $(wu,{title:"暂无 Docker 节点",text:"等待 provider 上报 Docker daemon 状态"});let y=i.dockerStatus,c=i.providerId==="main-server",_=y?.counts||{},A=y?.daemon||{},F=y?.containers||[],j=y?.images||[],N=nC(y?.volumes||[]),U=c?N.find(L$):null,w=y?.networks||[],G=F.filter((Q)=>Q.state==="running"),J=F.filter((Q)=>Q.state!=="running");return $("div",{className:"docker-page","data-testid":"docker-status-page"},$("div",{className:"docker-node-strip"},t.map((Q)=>$("button",{key:Q.providerId,type:"button",className:`docker-node-tile ${i.providerId===Q.providerId?"active":""}`,onClick:()=>n(Q.providerId)},$("span",{className:`pulse ${Q.status}`}),$("strong",null,Q.name),$("code",null,Q.providerId),$("span",null,Q.dockerStatus?`Docker ${Q.dockerStatus.ok?"ready":"degraded"}`:"等待上报")))),$("div",{className:"docker-layout"},$(ru,{title:"Docker Desktop 视图",eyebrow:i.name,className:"docker-main-panel",actions:y?$(eu,{title:`Docker ${i.providerId}`,data:y,onOpen:r}):null},!y?$(wu,{title:"Docker 状态未上报",text:"provider-gateway 会在连接后周期性采集 docker info / ps / images / volume / network"}):$("div",null,$("div",{className:"docker-hero"},$("div",null,$("p",{className:"panel-eyebrow"},"Daemon"),$("h3",null,A.name||i.providerId),$("div",{className:"docker-meta"},$("span",null,A.serverVersion?`Engine ${A.serverVersion}`:"Engine --"),$("span",null,A.operatingSystem||"OS --"),$("span",null,A.architecture||"arch --"),$("span",null,`${A.cpus||0} CPU / ${Qr(A.memoryBytes)}`))),$(Wu,{status:y.ok?"online":"warn"},y.ok?"Docker Ready":"Docker Degraded")),$("div",{className:"docker-metrics"},$(Qu,{label:"Containers",value:_.containers??F.length,hint:`${_.running??G.length} running / ${_.stopped??J.length} stopped`,tone:"ok"}),$(Qu,{label:"Images",value:_.images??j.length,hint:`${_.daemonImages??_.images??j.length} daemon images`}),$(Qu,{label:"Volumes",value:_.volumes??N.length,hint:c?U?"database volume visible":"database volume missing":"node local volumes",tone:U?"ok":""}),$(Qu,{label:"Networks",value:_.networks??w.length,hint:A.driver?`driver ${A.driver}`:"docker networks"})),c?$(iC,{volume:U,volumeCount:N.length}):null,$("div",{className:"docker-section-head"},$("h3",null,"Containers"),$("span",null,`updated ${Ll(i.dockerUpdatedAt||y.collectedAt)}`)),$("div",{className:"docker-container-table table-wrap","data-testid":"docker-container-table"},$("table",null,$("thead",null,$("tr",null,$("th",null,"状态"),$("th",null,"容器"),$("th",null,"镜像"),$("th",null,"端口"),$("th",null,"运行时间"),$("th",null,"重启策略"),$("th",null,"PID"),$("th",null,"大小"))),$("tbody",null,F.length===0?$("tr",null,$("td",{colSpan:8},"暂无容器")):F.map((Q)=>$("tr",{key:`${Q.id}-${Q.name}`},$("td",null,$(Wu,{status:fC(Q.state)},Q.state||"unknown")),$("td",null,$("strong",null,Q.name||"--"),$("code",null,Q.id||"--")),$("td",null,Q.image||"--"),$("td",null,Q.ports||$("span",{className:"muted"},"未发布")),$("td",null,Q.runningFor||Q.status||"--"),$("td",null,Q.restartPolicy?$(Wu,{status:Q.restartPolicy==="always"?"online":"warn"},Q.restartPolicy):"--"),$("td",null,Q.pidMode?$("code",null,Q.pidMode):"--"),$("td",null,Q.size||"--")))))))),$("div",{className:"docker-side-stack"},$(Fj,{title:"Images",items:j,render:(Q)=>$("article",{key:`${Q.id}-${Q.repository}`,className:"docker-side-row"},$("strong",null,`${Q.repository}:${Q.tag}`),$("span",null,Q.size||"--"),$("code",null,Q.id||"--"))}),$(Fj,{title:"Volumes",items:N,limit:N.length,render:(Q)=>$("article",{key:Q.name,className:`docker-side-row volume-row ${c&&L$(Q)?"database-volume":""}`,"data-testid":c&&L$(Q)?"database-volume-row":void 0},$("strong",null,Q.name),$("span",null,c&&L$(Q)?"PostgreSQL":AW(String(Q.name||""))?"anonymous":"named"),$("code",null,Q.mountpoint||Q.driver||Q.scope||"--"))}),$(Fj,{title:"Networks",items:w,render:(Q)=>$("article",{key:Q.id||Q.name,className:"docker-side-row"},$("strong",null,Q.name),$("span",null,Q.driver||"--"),$("code",null,Q.id||"--"))}))))}function iC({volume:l,volumeCount:u}){return $("section",{className:`docker-volume-focus ${l?"ready":"missing"}`,"data-testid":"database-volume-card"},$("div",{className:"volume-focus-head"},$("span",{className:"panel-eyebrow"},"Database Named Volume"),$(Wu,{status:l?"online":"warn"},l?"FOUND":"MISSING")),l?$("div",{className:"volume-focus-body"},$("strong",null,l.name),$("span",null,"PostgreSQL data volume for unidesk-database"),$("div",{className:"volume-route"},$("code",null,l.mountpoint||"/var/lib/docker/volumes/unidesk_pgdata_10gb/_data"),$("span",null,"->"),$("code",null,"unidesk-database:/var/lib/postgresql/data")),$("div",{className:"docker-meta compact"},$("span",null,`driver ${l.driver||"--"}`),$("span",null,`scope ${l.scope||"--"}`),$("span",null,`${u} volumes reported`))):$("div",{className:"volume-focus-body"},$("strong",null,"unidesk_pgdata_10gb"),$("span",null,"当前 Docker 快照没有发现数据库命名卷;请检查 provider-gateway 的 Docker volume 上报。")))}function Fj({title:l,items:u,render:r,limit:f}){let n=u.slice(0,f??12),t=Math.max(0,u.length-n.length);return $(ru,{title:l,eyebrow:`${u.length} items`,className:"docker-side-panel"},u.length===0?$(wu,{title:`暂无 ${l}`,text:"等待 Docker 状态采集"}):$("div",{className:"docker-side-list"},n.map(r),t>0?$("div",{className:"docker-side-more"},`+ ${t} more`):null))}function yC({microservices:l,onRaw:u,onNavigate:r}){let f=l.filter((n)=>hG(n).public===!1);return $("div",{className:"microservice-page","data-testid":"microservice-catalog-page"},$(ru,{title:"用户服务目录",eyebrow:"Provider Mounted User Services"},$("div",{className:"metric-grid"},$(Qu,{label:"服务总数",value:l.length,hint:"config.json 用户服务登记"}),$(Qu,{label:"私有后端",value:f.length,hint:"不直接暴露公网",tone:"ok"}),$(Qu,{label:"D601 服务",value:l.filter((n)=>n.providerId==="D601").length,hint:"compute-node docker"}),$(Qu,{label:"集成前端",value:l.filter((n)=>n.frontend?.integrated).length,hint:"UniDesk React 页面"}))),$(ru,{title:"服务映射",eyebrow:"Repo Reference + Runtime"},l.length===0?$(wu,{title:"暂无用户服务",text:"在 config.json 的 microservices 中登记用户服务的 provider、仓库引用和后端映射"}):$("div",{className:"table-wrap"},$("table",{className:"microservice-table"},$("thead",null,$("tr",null,$("th",null,"服务"),$("th",null,"Provider"),$("th",null,"代码引用"),$("th",null,"Docker 引用"),$("th",null,"后端映射"),$("th",null,"开发入口"),$("th",null,"运行态"),$("th",null,"操作"))),$("tbody",null,l.map((n)=>{let t=iW(n),i=HP(n),y=hG(n),c=t.availability||{},_=c.status||(t.providerStatus==="online"?"unknown":"unhealthy");return $("tr",{key:n.id,"data-testid":`microservice-row-${ff(n.id)}`},$("td",null,$("strong",null,n.name),$("code",null,n.id)),$("td",null,$("strong",null,t.providerName||n.providerId),$("code",null,n.providerId)),$("td",null,$("span",null,i.url||"--"),$("code",null,i.commitId||"--")),$("td",null,$("span",null,i.composeFile||"--"),$("code",null,`${i.composeService||"--"} / ${i.containerName||"--"}`)),$("td",null,$(Wu,{status:y.public?"warn":"online"},y.public?"public":"private"),$("code",null,`${y.nodeBindHost||"--"}:${y.nodePort||"--"} -> ${y.proxyMode||"--"}`)),$("td",null,$("span",null,n.development?.sshPassthrough?"SSH 透传":"未配置"),$("code",null,n.development?.worktreePath||"--")),$("td",null,$(Wu,{status:_==="healthy"?"online":_==="unknown"?"warn":"failed"},_),$("span",null,c.reason||t.providerStatus||"unknown"),$(Ji,{data:t.container,empty:"容器快照未上报"})),$("td",null,$("div",{className:"microservice-actions"},n.id==="findjob"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","findjob"),"data-testid":"open-findjob-button"},"打开"):null,n.id==="pipeline"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","pipeline"),"data-testid":"open-pipeline-button"},"打开"):null,n.id==="todo-note"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","todo-note"),"data-testid":"open-todo-note-button"},"打开"):null,n.id==="met-nonlinear"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","met-nonlinear"),"data-testid":"open-met-nonlinear-button"},"打开"):null,n.id==="claudeqq"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","claudeqq"),"data-testid":"open-claudeqq-button"},"打开"):null,n.id==="baidu-netdisk"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","baidu-netdisk"),"data-testid":"open-baidu-netdisk-button"},"打开"):null,n.id==="oa-event-flow"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","oa-event-flow"),"data-testid":"open-oa-event-flow-button"},"打开"):null,n.id==="k3sctl-adapter"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","k3sctl"),"data-testid":"open-k3sctl-button"},"打开"):null,n.id==="code-queue"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","code-queue"),"data-testid":"open-code-queue-button"},"打开"):null,n.id==="mdtodo"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","mdtodo"),"data-testid":"open-mdtodo-button"},"打开"):null,n.id==="decision-center"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","decision-center"),"data-testid":"open-decision-center-button"},"打开"):null,n.id==="project-manager"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","project-manager"),"data-testid":"open-project-manager-button"},"打开"):null,$(eu,{title:`用户服务 ${n.id}`,data:n,onOpen:u}))))}))))))}function cC({nodes:l,onDispatched:u,onRaw:r}){let f=l.filter((H)=>H.status==="online"),[n,t]=Il(f[0]?.providerId||l[0]?.providerId||""),[i,y]=Il("docker.ps"),[c,_]=Il("frontend"),[A,F]=Il("operator-check"),[j,N]=Il("normal"),[U,w]=Il(!1),[G,J]=Il(""),[Q,m]=Il(!1),[q,W]=Il(null),[p,O]=Il("");Bn(()=>{if(!n&&(f[0]?.providerId||l[0]?.providerId))t(f[0]?.providerId||l[0].providerId)},[l.length,f.length,n]);function Z(){return{source:c,note:A,priority:j}}function V(){J(JSON.stringify(Z(),null,2)),w(!0)}async function P(H){H.preventDefault(),m(!0),O("");try{let B=U?JSON.parse(G||"{}"):Z(),C=await Tl(`${vl.apiBaseUrl}/dispatch`,{method:"POST",body:JSON.stringify({providerId:n,command:i,payload:B})});W(C),await u()}catch(B){O(zl(B,"下发失败"))}finally{m(!1)}}return $("div",{className:"page-grid dispatch-grid"},$(ru,{title:"下发任务",eyebrow:"Real WebSocket Dispatch"},$("form",{className:"dispatch-form",onSubmit:P},$("label",null,"Provider",$("select",{value:n,onChange:(H)=>t(H.target.value)},l.map((H)=>$("option",{key:H.providerId,value:H.providerId},`${H.name} / ${H.providerId}`)))),$("label",null,"Command",$("select",{value:i,onChange:(H)=>y(H.target.value)},$("option",{value:"docker.ps"},"docker.ps"),$("option",{value:"host.ssh"},"host.ssh"),$("option",{value:"microservice.http"},"microservice.http"),$("option",{value:"echo"},"echo"))),$("label",null,"来源",$("input",{value:c,onChange:(H)=>_(H.target.value)})),$("label",null,"备注",$("input",{value:A,onChange:(H)=>F(H.target.value)})),$("label",null,"优先级",$("select",{value:j,onChange:(H)=>N(H.target.value)},$("option",{value:"normal"},"normal"),$("option",{value:"low"},"low"),$("option",{value:"urgent"},"urgent"))),$("div",{className:"dispatch-actions"},$("button",{type:"button",className:"ghost-btn",onClick:V},"查看原始JSON"),$("button",{type:"submit",disabled:Q||!n},Q?"下发中":"下发任务")),U?$("label",{className:"raw-editor-label"},"高级 Payload",$("textarea",{className:"raw-editor",value:G,onChange:(H)=>J(H.target.value)})):null,$(el,{error:p,wide:!0}))),$(ru,{title:"下发结果",eyebrow:"Response"},q?$("div",{className:"result-card"},$(Wu,{status:q.status||"queued"},q.status||"queued"),$("dl",null,$("dt",null,"Task ID"),$("dd",null,$("code",null,q.taskId||"--")),$("dt",null,"Provider 在线"),$("dd",null,_0(q.providerOnline))),$(eu,{title:"Dispatch Response",data:q,onOpen:r})):$(wu,{title:"等待操作",text:"任务响应会以结构化结果卡展示"})))}function bG({task:l,onRaw:u}){return $("article",{className:"compact-row"},$(Wu,{status:l.status}),$("div",null,$("strong",null,l.command),$("code",null,l.id)),$("span",null,Iy(l)?`已等待 ${Nj(l.updatedAt)}`:`耗时 ${ct(aG(l)??0)}`),$(eu,{title:`Task ${l.id}`,data:T$(l),onOpen:u}))}function FW({task:l}){let u=aG(l),r=Iy(l);return $("div",{className:"task-duration"},$("strong",null,u===null?"--":ct(u)),$("span",null,r?`已运行 / 创建 ${Ll(l.createdAt)}`:`创建 ${Ll(l.createdAt)}`))}function $C({task:l}){let u=String(l?.status||"").toLowerCase(),r=l?.result,f=r&&typeof r==="object"&&!Array.isArray(r)?r:{},t=["exitCode","code","signal","timeoutMs","previousStatus","mode"].filter((i)=>f[i]!==void 0&&f[i]!==null);if(u==="failed"){let i=oG(l);return $("div",{className:"task-diagnostic failed"},$("b",null,"失败原因"),$("span",{className:"diagnostic-reason"},_0(i)),t.length>0?$("div",{className:"diagnostic-meta"},t.map((y)=>$("span",{key:y,className:"data-chip"},$("b",null,y),$("span",null,_0(f[y]))))):null)}if(Iy(l))return $("div",{className:"task-diagnostic warn"},$("b",null,"等待终态"),$("span",null,`最后更新 ${Nj(l.updatedAt)} 前`));return $("div",{className:"task-diagnostic ok"},$("b",null,"完成摘要"),$(Ji,{data:r,empty:"无执行输出"}))}function _C({tasks:l,onRaw:u}){let r=l.filter(Iy);return $("div",{"data-testid":"pending-task-page"},$(ru,{title:"待处理任务",eyebrow:`${r.length} Pending`},r.length===0?$(wu,{title:"当前无待处理任务",text:"queued / dispatched / running 会在超时后自动转为 failed;历史记录仍可在任务历史中查看"}):$("div",{className:"table-wrap","data-testid":"pending-task-table"},$("table",null,$("thead",null,$("tr",null,$("th",null,"状态"),$("th",null,"任务"),$("th",null,"Provider"),$("th",null,"已等待"),$("th",null,"载荷摘要"),$("th",null,"操作"))),$("tbody",null,r.map((f)=>$("tr",{key:f.id},$("td",null,$(Wu,{status:f.status})),$("td",null,$("strong",null,f.command),$("code",null,f.id)),$("td",null,$("code",null,f.providerId)),$("td",null,Nj(f.updatedAt)),$("td",null,$(Ji,{data:f.payload})),$("td",null,$(eu,{title:`Pending Task ${f.id}`,data:T$(f),onOpen:u})))))))))}function AC({tasks:l,onRaw:u}){return $("div",{"data-testid":"task-history-page"},$(ru,{title:"任务历史",eyebrow:`${l.length} Tasks`},l.length===0?$(wu,{title:"暂无任务",text:"下发任务后会在这里看到生命周期"}):$("div",{className:"table-wrap"},$("table",{className:"task-history-table"},$("thead",null,$("tr",null,$("th",null,"状态"),$("th",null,"任务"),$("th",null,"Provider"),$("th",null,"任务耗时"),$("th",null,"载荷摘要"),$("th",null,"诊断信息"),$("th",null,"更新时间"),$("th",null,"操作"))),$("tbody",null,l.map((r)=>$("tr",{key:r.id,"data-testid":`task-row-${ff(r.id)}`},$("td",null,$(Wu,{status:r.status})),$("td",null,$("strong",null,r.command),$("code",null,r.id)),$("td",null,$("code",null,r.providerId)),$("td",null,$(FW,{task:r})),$("td",null,$(Ji,{data:r.payload})),$("td",null,$($C,{task:r})),$("td",null,Ll(r.updatedAt)),$("td",null,$(eu,{title:`Task ${r.id}`,data:T$(r),onOpen:u})))))))))}function FC({tasks:l,onRaw:u}){let r=l.filter((f)=>["succeeded","failed"].includes(f.status));return $(ru,{title:"执行结果",eyebrow:"Finished Tasks"},r.length===0?$(wu,{title:"暂无结果",text:"任务完成后展示 provider 返回的结构化摘要"}):$("div",{className:"result-grid"},r.map((f)=>$("article",{key:f.id,className:"result-card"},$("div",{className:"node-card-head"},$("strong",null,f.command),$(Wu,{status:f.status})),$("code",null,f.id),$(Ji,{data:f.result,empty:"无执行输出"}),$(eu,{title:`Task Result ${f.id}`,data:T$(f),onOpen:u})))))}function jC(l){if(!l||typeof l!=="object")return"--";if(l.type==="interval")return`每 ${ct(Number(l.everySeconds||0))}`;return`每天 ${l.timeOfDay||"03:00"} UTC`}function NC(l){if(!l||typeof l!=="object")return"--";if(l.type==="pgdata_backup")return`PGDATA -> ${l.remoteBaseDir||"/SERVER_DATA/UNIDESK_PG_DATA"}`;if(l.type==="dispatch")return`${l.providerId||"--"} / ${l.command||"--"}`;return String(l.type||"--")}function JC(l){let u=String(l||"").toLowerCase();if(u==="succeeded")return"online";if(u==="failed")return"failed";if(u==="running"||u==="queued")return"warn";return u}function UC(l){let u=Number(l?.durationMs);if(Number.isFinite(u)&&u>=0)return ct(u/1000);let r=Dn(l?.startedAt||l?.createdAt);if(r===null)return"--";let n=Dn(l?.finishedAt)??Date.now();return ct(Math.max(0,(n-r)/1000))}function vG(l){return{id:"unidesk-pgdata-baidu-daily",name:"PGDATA daily Baidu Netdisk backup",description:"Daily PostgreSQL physical base backup uploaded to Baidu Netdisk /SERVER_DATA with monthly rotation.",enabled:!0,timeOfDay:"03:30",actionType:"pgdata_backup",providerId:l[0]?.providerId||"main-server",command:"echo",payloadJson:JSON.stringify({source:"scheduled-task",message:"hello from scheduler"},null,2),remoteBaseDir:"/SERVER_DATA/UNIDESK_PG_DATA",stagingSubdir:"server-data/unidesk-pg-data",timeoutMs:"3600000"}}function QC({schedules:l,scheduleRuns:u,nodes:r,refresh:f,onRaw:n}){let[t,i]=Il(vG(r||[])),[y,c]=Il(!1),[_,A]=Il(""),[F,j]=Il(""),N=[...u||[]].sort((q,W)=>(Dn(W.updatedAt)??0)-(Dn(q.updatedAt)??0));function U(q,W){i((p)=>({...p,[q]:W}))}function w(q){let W=q?.action||{};i({id:q?.id||"",name:q?.name||"",description:q?.description||"",enabled:q?.enabled!==!1,timeOfDay:q?.schedule?.timeOfDay||"03:30",actionType:W.type||"dispatch",providerId:W.providerId||r[0]?.providerId||"main-server",command:W.command||"echo",payloadJson:JSON.stringify(W.payload||{source:"scheduled-task"},null,2),remoteBaseDir:W.remoteBaseDir||"/SERVER_DATA/UNIDESK_PG_DATA",stagingSubdir:W.stagingSubdir||"server-data/unidesk-pg-data",timeoutMs:String(W.timeoutMs||3600000)}),j(`正在编辑 ${q?.id||""}`)}function G(){let q={id:t.id,name:t.name,description:t.description,enabled:t.enabled,concurrencyPolicy:"skip",schedule:{type:"daily",timeOfDay:t.timeOfDay,timezone:"Etc/UTC"}};if(t.actionType==="pgdata_backup")return{...q,action:{type:"pgdata_backup",volumeName:"unidesk_pgdata_10gb",remoteBaseDir:t.remoteBaseDir,stagingSubdir:t.stagingSubdir,timeoutMs:Number(t.timeoutMs)||3600000,cleanupLocal:!0}};return{...q,action:{type:"dispatch",providerId:t.providerId,command:t.command,payload:JSON.parse(t.payloadJson||"{}"),timeoutMs:Number(t.timeoutMs)||600000}}}async function J(q){q.preventDefault(),c(!0),A(""),j("");try{let W=G(),p=encodeURIComponent(String(W.id));await Tl(`${vl.apiBaseUrl}/schedules/${p}`,{method:"PUT",body:JSON.stringify(W)}),j("定时任务已保存"),await f()}catch(W){A(zl(W,"保存定时任务失败"))}finally{c(!1)}}async function Q(q){if(!q?.id)return;c(!0),A(""),j("");try{await Tl(`${vl.apiBaseUrl}/schedules/${encodeURIComponent(q.id)}`,{method:"DELETE"}),j(`已删除 ${q.id}`),await f()}catch(W){A(zl(W,"删除定时任务失败"))}finally{c(!1)}}async function m(q){if(!q?.id)return;c(!0),A(""),j("");try{let W=await Tl(`${vl.apiBaseUrl}/schedules/${encodeURIComponent(q.id)}/run`,{method:"POST",body:"{}"});j(`已触发 ${q.id} / ${W?.run?.id||"run"}`),await f()}catch(W){A(zl(W,"触发定时任务失败"))}finally{c(!1)}}return $("div",{className:"page-grid scheduled-task-page","data-testid":"scheduled-task-page"},$(ru,{title:"定时任务",eyebrow:`${(l||[]).length} Schedules`},(l||[]).length===0?$(wu,{title:"暂无定时任务",text:"创建 daily / dispatch / PGDATA backup 任务后会在这里展示下一次执行时间和最近结果"}):$("div",{className:"schedule-card-grid"},(l||[]).map((q)=>$("article",{key:q.id,className:"schedule-card","data-testid":`schedule-row-${ff(q.id)}`},$("div",{className:"node-card-head"},$("strong",null,q.name||q.id),$(Wu,{status:q.enabled?"online":"warn"},q.enabled?"enabled":"disabled")),$("code",null,q.id),$("dl",null,$("dt",null,"计划"),$("dd",null,jC(q.schedule)),$("dt",null,"动作"),$("dd",null,NC(q.action)),$("dt",null,"下次执行"),$("dd",null,Ll(q.nextRunAt)),$("dt",null,"最近执行"),$("dd",null,q.lastRunAt?`${Ll(q.lastRunAt)} / ${q.lastRunId||"--"}`:"--")),$("div",{className:"dispatch-actions"},$("button",{type:"button",className:"ghost-btn",disabled:y,onClick:()=>w(q)},"编辑"),$("button",{type:"button",className:"ghost-btn",disabled:y,onClick:()=>m(q),"data-testid":`schedule-run-${ff(q.id)}`},"手动触发"),$("button",{type:"button",className:"ghost-btn danger",disabled:y,onClick:()=>Q(q)},"删除"),$(eu,{title:`Schedule ${q.id}`,data:q,onOpen:n})))))),$(ru,{title:t.id?"配置定时任务":"新建定时任务",eyebrow:"CRUD"},$("form",{className:"dispatch-form schedule-form",onSubmit:J},$("label",null,"ID",$("input",{value:t.id,onChange:(q)=>U("id",q.target.value)})),$("label",null,"名称",$("input",{value:t.name,onChange:(q)=>U("name",q.target.value)})),$("label",null,"每日执行时间 UTC",$("input",{value:t.timeOfDay,placeholder:"03:30",onChange:(q)=>U("timeOfDay",q.target.value)})),$("label",null,"启用",$("select",{value:t.enabled?"true":"false",onChange:(q)=>U("enabled",q.target.value==="true")},$("option",{value:"true"},"enabled"),$("option",{value:"false"},"disabled"))),$("label",null,"动作类型",$("select",{value:t.actionType,onChange:(q)=>U("actionType",q.target.value)},$("option",{value:"pgdata_backup"},"PGDATA 备份到百度网盘"),$("option",{value:"dispatch"},"Provider Dispatch"))),t.actionType==="pgdata_backup"?[$("label",{key:"remote"},"网盘根目录",$("input",{value:t.remoteBaseDir,onChange:(q)=>U("remoteBaseDir",q.target.value)})),$("label",{key:"staging"},"本地 staging 子目录",$("input",{value:t.stagingSubdir,onChange:(q)=>U("stagingSubdir",q.target.value)}))]:[$("label",{key:"provider"},"Provider",$("select",{value:t.providerId,onChange:(q)=>U("providerId",q.target.value)},(r||[]).map((q)=>$("option",{key:q.providerId,value:q.providerId},`${q.name} / ${q.providerId}`)))),$("label",{key:"command"},"Command",$("select",{value:t.command,onChange:(q)=>U("command",q.target.value)},$("option",{value:"echo"},"echo"),$("option",{value:"docker.ps"},"docker.ps"),$("option",{value:"host.ssh"},"host.ssh"),$("option",{value:"microservice.http"},"microservice.http"))),$("label",{key:"payload",className:"raw-editor-label"},"Payload JSON",$("textarea",{className:"raw-editor",value:t.payloadJson,onChange:(q)=>U("payloadJson",q.target.value)}))],$("label",null,"超时 ms",$("input",{value:t.timeoutMs,onChange:(q)=>U("timeoutMs",q.target.value)})),$("label",{className:"raw-editor-label"},"描述",$("textarea",{className:"raw-editor compact",value:t.description,onChange:(q)=>U("description",q.target.value)})),$("div",{className:"dispatch-actions"},$("button",{type:"button",className:"ghost-btn",disabled:y,onClick:()=>i(vG(r||[]))},"重置"),$("button",{type:"submit",disabled:y||!t.id},y?"保存中":"保存任务")),F?$("p",{className:"muted paragraph"},F):null,$(el,{error:_,wide:!0}))),$(ru,{title:"历史执行记录",eyebrow:`${N.length} Runs`},N.length===0?$(wu,{title:"暂无执行记录",text:"定时触发或手动触发后会生成 run history"}):$("div",{className:"table-wrap"},$("table",{className:"task-history-table schedule-run-table"},$("thead",null,$("tr",null,$("th",null,"状态"),$("th",null,"任务"),$("th",null,"触发"),$("th",null,"耗时"),$("th",null,"结果摘要"),$("th",null,"更新时间"),$("th",null,"操作"))),$("tbody",null,N.map((q)=>$("tr",{key:q.id,"data-testid":`schedule-run-row-${ff(q.id)}`},$("td",null,$(Wu,{status:JC(q.status)},q.status)),$("td",null,$("strong",null,q.scheduleId),$("code",null,q.id),q.taskId?$("code",null,q.taskId):null),$("td",null,q.trigger||"--"),$("td",null,UC(q)),$("td",null,$(Ji,{data:q.result||q.error,empty:"无结果"})),$("td",null,Ll(q.updatedAt)),$("td",null,$(eu,{title:`Schedule Run ${q.id}`,data:q,onOpen:n})))))))))}function mC({data:l}){let u=l.overview||{};return $("div",{className:"page-grid topology-grid"},$(ru,{title:"公开入口",eyebrow:"Public"},$("div",{className:"endpoint-list"},$("article",null,$("b",null,"Frontend"),$("span",null,vl.frontendPublicUrl||window.location.origin),$(Wu,{status:"online"},"public")),$("article",null,$("b",null,"Provider Ingress"),$("span",null,vl.providerIngressPublicUrl||"ws://public/ws/provider"),$(Wu,{status:"online"},"public")))),$(ru,{title:"内部服务",eyebrow:"Docker Network Only"},$("div",{className:"endpoint-list"},$("article",null,$("b",null,"backend-core API"),$("span",null,"http://backend-core:8080"),$(Wu,{status:"internal"},"internal")),$("article",null,$("b",null,"database"),$("span",null,"postgres://database:5432/unidesk"),$(Wu,{status:"internal"},"internal")))),$(ru,{title:"运行态",eyebrow:"Runtime"},$("div",{className:"metric-grid"},$(Qu,{label:"DB Ready",value:u.dbReady?"YES":"NO",hint:"internal health"}),$(Qu,{label:"Online Nodes",value:u.onlineNodeCount??0,hint:"provider-gateway self-link"}))))}function wC({session:l}){return $(ru,{title:"认证策略",eyebrow:"Frontend Login"},$("div",{className:"policy-grid"},$("article",null,$("span",null,"默认账号"),$("strong",null,vl.authUsername||"admin")),$("article",null,$("span",null,"当前会话"),$("strong",null,l?.user?.username||"--")),$("article",null,$("span",null,"Session TTL"),$("strong",null,`${vl.sessionTtlSeconds||0}s`)),$("article",null,$("span",null,"API 访问"),$("strong",null,"同源 Cookie 保护"))),$("p",{className:"muted paragraph"},"浏览器只访问 frontend 同源接口;frontend 容器使用 Docker 内网代理 backend-core API。"))}function qC(){return $(ru,{title:"安全边界",eyebrow:"Exposure Rule"},$("div",{className:"security-board"},$("article",{className:"allow"},$("b",null,"允许公网"),$("span",null,"frontend 登录入口"),$("span",null,"provider ingress WebSocket/health")),$("article",{className:"deny"},$("b",null,"禁止公网"),$("span",null,"backend-core REST API"),$("span",null,"PostgreSQL database")),$("article",null,$("b",null,"数据库卷"),$("span",null,"named volume unidesk_pgdata_10gb"),$("span",null,"CLI stop/start 不删除数据卷"))))}function LC({activeModule:l,activeTab:u,data:r,session:f,refresh:n,onRaw:t,onNavigate:i}){if(l==="ops"&&u==="status")return $(PP,{data:r,onRaw:t,onNavigate:i});if(l==="ops"&&u==="performance")return $(eP,{onRaw:t});if(l==="ops"&&u==="events")return $(hP,{events:r.events,onRaw:t});if(l==="ops"&&u==="logs")return $(MP,{logs:r.logs,onRaw:t});if(l==="nodes"&&u==="list")return $(sP,{nodes:r.nodes,onRaw:t});if(l==="nodes"&&u==="monitor")return $(bP,{nodes:r.nodes,systemStatuses:r.systemStatuses,tasks:r.tasks,onRaw:t,refresh:n});if(l==="nodes"&&u==="docker")return $(tC,{nodes:r.nodes,dockerStatuses:r.dockerStatuses,onRaw:t});if(l==="nodes"&&u==="gateway")return $(rC,{nodes:r.nodes,tasks:r.tasks,onRaw:t});if(l==="nodes"&&u==="labels")return $(RP,{nodes:r.nodes});if(l==="nodes"&&u==="heartbeats")return $(xP,{nodes:r.nodes});if(l==="tasks"&&u==="dispatch")return $(cC,{nodes:r.nodes,onDispatched:n,onRaw:t});if(l==="tasks"&&u==="scheduled")return $(QC,{schedules:r.schedules,scheduleRuns:r.scheduleRuns,nodes:r.nodes,refresh:n,onRaw:t});if(l==="tasks"&&u==="pending")return $(_C,{tasks:r.pendingTasks,onRaw:t});if(l==="tasks"&&u==="history")return $(AC,{tasks:r.tasks,onRaw:t});if(l==="tasks"&&u==="results")return $(FC,{tasks:r.tasks,onRaw:t});if(l==="apps"&&u==="catalog")return $(yC,{microservices:r.microservices,onRaw:t,onNavigate:i});if(l==="apps"&&u==="todo-note")return $(pG,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="findjob")return $(Um,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="pipeline")return $(wG,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="met-nonlinear")return $(Lm,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="claudeqq")return $(BU,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="baidu-netdisk")return $(OU,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="filebrowser")return $(Jm,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="oa-event-flow")return $(Bm,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="k3sctl")return $(DG,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl,onNavigate:i});if(l==="apps"&&u==="code-queue")return $(um,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl,initialTasksData:wP});if(l==="apps"&&u==="mdtodo")return $(Km,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="decision-center")return $($m,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="project-manager")return $(GG,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="config"&&u==="topology")return $(mC,{data:r});if(l==="config"&&u==="auth")return $(wC,{session:f});if(l==="config"&&u==="security")return $(qC);return $(wu,{title:"未找到页面",text:"请选择左侧主模块和顶部子功能标签"})}function GC({session:l,onLogout:u}){let r=L5(Cf,window.location.pathname),[f,n]=Il(r.moduleId),[t,i]=Il({...z1,[r.moduleId]:r.tabId}),[y,c]=Il({overview:null,nodes:[],systemStatuses:[],dockerStatuses:[],microservices:[],events:[],tasks:[],pendingTasks:[],schedules:[],scheduleRuns:[],logs:[]}),[_,A]=Il({ok:!1,text:"连接中"}),[F,j]=Il(null),[N,U]=Il(new Date),[w,G]=Il(null),[J,Q]=Il(!1),[m,q]=Il(!1),W=Ni.default.useRef(!1),p=Cf.moduleById[f]||Cf.modules[0],O=t[f]||z1[f]||p.tabs[0].id,Z=Array.isArray(y.microservices)?y.microservices:[],V=Z.length===0&&f==="apps"&&O==="code-queue"?[qP]:Z,P=V===Z?y:{...y,microservices:V},H=f==="apps"?V.find((h)=>String(h?.id||"")===(O==="k3sctl"?"k3sctl-adapter":O)):null,B=H?iW(H):{},C=p.tabs.find((h)=>h.id===O)?.label||O,E=H?[{key:"microservice",label:"用户服务",value:`${C} ${B.providerStatus==="online"?"在线":B.providerStatus||"未知"}`,tone:B.providerStatus==="online"?"ok":"warn",testId:"active-microservice-status"}]:[];async function D(){if(W.current)return;W.current=!0,q(!0);try{let h=[],s=(wl,El)=>{h.push([wl,Tl(El)])},ul=f==="ops"&&O==="status",tl=ul||f==="config"&&O==="topology",Al=ul||f==="nodes"||f==="tasks"&&(O==="dispatch"||O==="scheduled"),Kl=f==="apps"&&O!=="code-queue";if(tl)s("overview",`${vl.apiBaseUrl}/overview`);if(Al)s("nodes",`${vl.apiBaseUrl}/nodes`);if(f==="nodes"&&O==="monitor")s("systemStatuses",`${vl.apiBaseUrl}/nodes/system-status?limit=60`),s("tasks",`${vl.apiBaseUrl}/tasks?limit=120&summary=1`);else if(f==="nodes"&&O==="docker")s("dockerStatuses",`${vl.apiBaseUrl}/nodes/docker-status`);else if(f==="nodes"&&O==="gateway")s("tasks",`${vl.apiBaseUrl}/tasks?limit=300&summary=1`);else if(f==="tasks"&&O==="scheduled")s("schedules",`${vl.apiBaseUrl}/schedules?limit=100`),s("scheduleRuns",`${vl.apiBaseUrl}/schedules/runs?limit=100`);else if(f==="tasks"&&O==="pending")s("pendingTasks",`${vl.apiBaseUrl}/tasks?status=pending&limit=100&summary=1`);else if(f==="tasks"&&(O==="history"||O==="results"))s("tasks",`${vl.apiBaseUrl}/tasks?limit=300&summary=1`);else if(ul)s("tasks",`${vl.apiBaseUrl}/tasks?limit=8&lite=1`),s("pendingTasks",`${vl.apiBaseUrl}/tasks?status=pending&limit=20&lite=1`);if(Kl)s("microservices",`${vl.apiBaseUrl}/microservices`);if(f==="ops"&&O==="events")s("events",`${vl.apiBaseUrl}/events?limit=100`);if(f==="ops"&&O==="logs")s("logs","/logs?limit=100");await Promise.all(h.map(async([wl,El])=>{let M=await El,d={};if(wl==="overview")d.overview=M;if(wl==="nodes")d.nodes=M.nodes||[];if(wl==="systemStatuses")d.systemStatuses=M.systemStatuses||[];if(wl==="dockerStatuses")d.dockerStatuses=M.dockerStatuses||[];if(wl==="microservices")d.microservices=M.microservices||[];if(wl==="events")d.events=M.events||[];if(wl==="tasks")d.tasks=M.tasks||[];if(wl==="pendingTasks")d.pendingTasks=M.tasks||[];if(wl==="schedules")d.schedules=M.schedules||[];if(wl==="scheduleRuns")d.scheduleRuns=M.runs||[];if(wl==="logs")d.logs=M.logs||[];c((nl)=>({...nl,...d}))})),A({ok:!0,text:"核心在线"}),j(new Date)}catch(h){if(A({ok:!1,text:zl(h,"连接失败")}),h.status===401)u(!1)}finally{W.current=!1,q(!1)}}Bn(()=>{let h=()=>{if(!XG())return;D()};h();let s=setInterval(h,GP(f,O)),ul=()=>{if(XG())h()};return document.addEventListener("visibilitychange",ul),()=>{clearInterval(s),document.removeEventListener("visibilitychange",ul)}},[f,O]),Bn(()=>{let h=setInterval(()=>U(new Date),1000);return()=>clearInterval(h)},[]),Bn(()=>{let h=Om(Cf,window.location.pathname);if(h&&window.location.pathname!==h)window.history.replaceState(null,"",h)},[]),Bn(()=>{let h=()=>{let s=L5(Cf,window.location.pathname);n(s.moduleId),i((ul)=>({...ul,[s.moduleId]:s.tabId})),G(null)};return window.addEventListener("popstate",h),()=>window.removeEventListener("popstate",h)},[]),Bn(()=>{window.scrollTo({top:0,left:0,behavior:"auto"})},[f,O]);function Y(h,s,ul="push"){let tl=Cf.moduleById[h]?h:Cf.fallbackTarget.moduleId,Al=Cf.moduleById[tl]?.tabs.some((wl)=>wl.id===s)?s:z1[tl]||Cf.moduleById[tl]?.tabs[0]?.id||Cf.fallbackTarget.tabId;n(tl),i((wl)=>({...wl,[tl]:Al}));let Kl=d3(Cf,tl,Al);if(window.location.pathname!==Kl){let wl=ul==="replace"?"replaceState":"pushState";window.history[wl](null,"",Kl)}}function v(h,s){G({title:h,data:s})}let[K,X]=Il(!1),{unreadCount:I,notifications:o}=Xr(),fl=o.length>0?o[o.length-1]:null,yl=IG(YG);return $("div",{className:`shell ${J?"rail-collapsed":""} ${yl?"dev-shell":""}`,"data-testid":"app-shell"},$(YP,{activeModule:f,activeTabs:t,onNavigate:Y,collapsed:J,onToggle:()=>Q((h)=>!h)}),$("main",{className:"workspace"},$(VP,{connection:_,lastRefresh:F,onRefresh:D,onLogout:()=>u(!0),session:l,clock:N,activeStatusItems:E,onNotificationToggle:()=>X((h)=>!h),unreadCount:I,environment:YG}),$(XP,{module:p,activeTab:O,onNavigate:Y}),$(jj.Provider,{value:m},$(LC,{activeModule:f,activeTab:O,data:P,session:l,refresh:D,onRaw:v,onNavigate:Y}))),$(BP,{raw:w,onClose:()=>G(null)}),fl&&$(SG,{key:fl.id,notification:fl}),K&&$(VG,{onClose:()=>X(!1)}))}function WC(){let[l,u]=Il(!0),[r,f]=Il(null);async function n(){u(!0);try{let i=await Tl("/api/session");f(i.authenticated?i:null)}catch{f(null)}finally{u(!1)}}async function t(i){if(i)try{await Tl("/logout",{method:"POST"})}catch{}f(null)}if(Bn(()=>{n()},[]),l)return $("main",{className:"loading-screen"},$("div",{className:"brand-mark"},"UD"),$("span",null,"加载会话"));if(!r)return $(DP,{onLogin:f});return $(zU,null,$(GC,{session:r,onLogout:t}))}var jW=document.getElementById("root");if(jW===null)throw Error("root element not found");gG.createRoot(jW).render($(WC));})(); + `,width:w,height:G}}function J8(l,u){let r=URL.createObjectURL(l),f=document.createElement("a");f.href=r,f.download=u,f.click(),setTimeout(()=>URL.revokeObjectURL(r),1000)}async function _G(l,u){let r=$G(u,"pipeline"),{svg:f,width:n,height:t}=AX(l,u),i=new Blob([f],{type:"image/svg+xml;charset=utf-8"}),y=URL.createObjectURL(i);try{let c=new Image;await new Promise((j,N)=>{c.onload=()=>j(),c.onerror=()=>N(Error("svg image load failed")),c.src=y});let _=document.createElement("canvas");_.width=n,_.height=t;let A=_.getContext("2d");if(!A)throw Error("canvas unavailable");A.drawImage(c,0,0);let F=await new Promise((j)=>_.toBlob(j,"image/png"));if(!F)throw Error("png export failed");J8(F,`${r}.png`)}catch{J8(i,`${r}.svg`)}finally{URL.revokeObjectURL(y)}}async function UX(l){let u=$G(String(l?.title||"pipeline-gantt"),"pipeline-gantt"),{svg:r,width:f,height:n}=JX(l),t=new Blob([r],{type:"image/svg+xml;charset=utf-8"}),i=URL.createObjectURL(t);try{let y=new Image;await new Promise((F,j)=>{y.onload=()=>F(),y.onerror=()=>j(Error("gantt svg image load failed")),y.src=i});let c=document.createElement("canvas");c.width=f,c.height=n;let _=c.getContext("2d");if(!_)throw Error("canvas unavailable");_.drawImage(y,0,0);let A=await new Promise((F)=>c.toBlob(F,"image/png"));if(!A)throw Error("gantt png export failed");J8(A,`${u}.png`)}catch{J8(t,`${u}.svg`)}finally{URL.revokeObjectURL(i)}}async function QX(l){for(let u of l){if(u.flow.nodes.length===0)continue;await _G(u.flow,u.title),await new Promise((r)=>setTimeout(r,750))}}function gL(l,u){return l.find((r)=>String(r?.pipelineId||"")===u)||null}function kL(l){return dl(l?.startedAt)??dl(l?.artifact?.startedAt)??dl(l?.request?.createdAt)??dl(l?.updatedAt)??0}function mX(l,u){return l.filter((r)=>String(r?.pipelineId||"")===u).slice().sort((r,f)=>kL(r)-kL(f)||String(r?.runId||"").localeCompare(String(f?.runId||"")))}function RF(l,u){let r=String(u?.runId||""),f=l.findIndex((i)=>String(i?.runId||"")===r),n=f>=0?f+1:l.length,t=String(u?.status||"--");return`Epoch ${n} / ${r||"--"} / ${t}`}function Pf(l){return String(l?.procedureRunId||l?.runId||"")}function w8(l,u){let r=String(l?.nodeId||l?.request?.nodeId||"");if(r)return r;let f=Pf(l),n=`${u}__`;if(f.startsWith(n))return f.slice(n.length).replace(/__\d+$/u,"");return""}function i8(l,u){let r=Xl(l?.artifact)?l.artifact:{},f=Xl(l?.request)?l.request:{};return m$(l?.startedAt,r.startedAt,f.createdAt,f.startedAt,l?.createdAt,l?.updatedAt,u?.startedAt,u?.request?.createdAt)}function y8(l,u){let r=String(l?.status?.status||l?.artifact?.status||l?.status||"").toLowerCase(),f=Xl(l?.artifact)?l.artifact:{},n=gF(r);return m$(l?.finishedAt,f.finishedAt,l?.completedAt,n?l?.updatedAt:void 0,n?f.updatedAt:void 0,n?u?.updatedAt:void 0)}function AG(l,u,r=Date.now()){let f=String(l?.runId||""),n=new Set(u.map((t)=>String(t?.id||"")).filter(Boolean));return Sl(l?.procedureRuns).flatMap((t)=>{let i=w8(t,f);if(!i)return[];let y=String(t?.status?.status||t?.artifact?.status||t?.status||"unknown").toLowerCase(),c=i8(t,l),_=dl(c);if(_===null)return[];let A=y8(t,l),F=dl(A)??(gF(y)?dl(t?.updatedAt)??_+1000:r),j=Math.max(_+1000,F);return[{nodeId:i,knownNode:n.has(i),procedureRunId:Pf(t),status:y,startMs:_,endMs:j,startedAt:J$(_),finishedAt:J$(j),durationMs:j-_,runId:f,raw:t}]}).sort((t,i)=>t.startMs-i.startMs||t.endMs-i.endMs||t.nodeId.localeCompare(i.nodeId))}function wX(l,u,r=[]){let f=u.map((A)=>Number(A.startMs)).filter(Number.isFinite),n=u.map((A)=>Number(A.endMs)).filter(Number.isFinite);for(let A of r){let F=hu(A?.eventMs??A?.ms);if(F!==null)f.push(F),n.push(F)}let t=dl(l?.startedAt)??dl(l?.artifact?.startedAt)??dl(l?.request?.createdAt),i=dl(l?.finishedAt)??dl(l?.artifact?.finishedAt)??dl(l?.updatedAt);if(t!==null)f.push(t);if(i!==null)n.push(i);let y=Date.now(),c=f.length>0?Math.min(...f):y-60000,_=Math.max(c+60000,n.length>0?Math.max(...n):y);return{startMs:c,endMs:_,durationMs:_-c}}var c8=12,FG=20,xF=100,qX=!1;function Ai(l){let u=Number(l);if(!Number.isFinite(u))return 0;return Math.max(0,Math.min(100,Math.round(u*100)/100))}function LX(l){let u=Math.max(c8,Number(l||c8)),r=Math.log(u/c8)/Math.log(FG);return Ai(r*100)}var Q$=LX(xF);function eF(l){let u=Ai(l)/100,r=c8*Math.pow(FG,u),f=u<0.24?"全局":u<0.64?"均衡":"细节";return{value:Ai(u*100),pxPerMinute:r,label:f}}function YF(l){let u=Math.round(Number(l));return Math.abs(u-xF)<=1?xF:u}function GX(l,u=Q$){let r=Math.max(1,Number(l.durationMs||0)/60000),f=eF(u);return Math.round(Math.max(360,Math.min(7200,r*Number(f.pxPerMinute||48))))}function WX(l,u=7){let r=Math.max(1,Number(l.endMs||0)-Number(l.startMs||0));return Array.from({length:u},(f,n)=>{let t=u===1?0:n/(u-1);return{ms:Number(l.startMs)+r*t,percent:t*100}})}function TX(l,u){let r=Math.max(1,Number(u.endMs)-Number(u.startMs));return Math.max(0,Math.min(100,(l-Number(u.startMs))/r*100))}function hu(l){let u=Number(l);return Number.isFinite(u)?u:null}function lj(l){return dL(l?.status)&&!gF(l?.status)}function jG(l,u,r,f){let n=Math.max(1,r-u),t=Math.max(0,Math.min(1,(l-u)/n));return Number((t*f).toFixed(3))}function IL(l,u){if(!u)return null;let r=hu(u?.startMs),f=hu(u?.endMs),n=hu(u?.chartHeight);if(r===null||f===null||n===null)return null;return jG(l,r,f,n)}function NG(l,u){let r=hu(l?.rawStartMs??l?.startMs)??hu(l?.startMs)??u,f=hu(l?.endMs)??r+1000;if(!lj(l))return Math.max(r+1000,f);return Math.max(r+1000,f,u)}function KX(l,u,r,f){let n=hu(l?.startMs)??f-60000,t=hu(l?.endMs)??f,i=r.reduce((U,w)=>Math.max(U,NG(w,f)),t),y=Math.max(n+60000,t,i),c=Math.max(1,y-n),_={startMs:n,endMs:y,durationMs:c},A=GX(_,u),F=eF(u),j=Math.max(5,Math.min(18,Math.round(A/150))),N=WX(_,j).map((U)=>{let w=Number(U.ms),G=jG(w,n,y,A);return{...U,y:G,timestamp:J$(w),offsetMs:w-n}});return{source:"frontend-y",startMs:n,endMs:y,durationMs:c,chartHeight:A,scale:Ai(u),normalizedScale:Number((Ai(u)/100).toFixed(3)),pxPerMinute:Number(Number(F.pxPerMinute||0).toFixed(3)),ticks:N}}function EX(l,u,r){if(!lj(l))return l;let f=hu(l?.rawStartMs??l?.startMs)??hu(l?.startMs)??r,n=NG(l,r),t=IL(f,u),i=IL(n,u),y=hu(t??l?.y1??l?.startY)??0,c=hu(i??l?.y2??l?.endY)??y+10,_=Math.max(24,c-y);return{...l,live:!0,startMs:f,endMs:n,durationMs:Math.max(1000,n-f),finishedAt:J$(n),y1:y,y2:c,startY:y,endY:c,height:_}}function uj(l,u,r){return TX(l,u)/100*r}function xy(l){return Boolean(l&&String(l?.source||"")!=="frontend-y")}function JG(l,u,r,f,n){if(xy(f))for(let i of n){let y=hu(l?.[i]);if(y!==null)return y}let t=hu(l?.ms??l?.eventMs??l?.startMs);return uj(t??Number(u.startMs),u,r)}function U8(l,u,r,f){return JG(l,u,r,f,["y1","startY"])}function bF(l,u,r,f){if(xy(f)){let t=hu(l?.y2??l?.endY);if(t!==null)return t}let n=hu(l?.endMs)??Number(u.endMs);return uj(n,u,r)}function UG(l,u,r,f){if(xy(f)){let t=hu(l?.height);if(t!==null)return Math.max(1,t)}let n=l?.live?24:10;return Math.max(n,bF(l,u,r,f)-U8(l,u,r,f))}function wf(l,u,r,f){return JG(l,u,r,f,["y","timeAxisY"])}function QG(l,u,r,f){if(xy(f)||String(f?.source||"")==="frontend-y"){let i=hu(l?.y);if(i!==null)return i}let n=hu(l?.percent);if(n!==null)return n/100*r;let t=hu(l?.ms)??Number(u.startMs);return uj(t,u,r)}function pX(l){let u=String(l?.promptEvent||l?.raw?.promptEvent||l?.event||"").toLowerCase();if(!["node-long-running-observation","node-finished"].includes(u))return"";let r=String(l?.sourceNodeId||l?.raw?.sourceNodeId||l?.raw?.detail?.nodeId||""),f=String(l?.nodeId||l?.targetNodeId||"");return r&&r!==f?r:""}function zX(l,u){let r=new Set(u.map((n)=>[String(n.sourceNodeId||""),String(n.targetNodeId||""),String(n.targetMarkerId||""),String(n.action||"")].join(":"))),f=[...u];for(let n of l){let t=pX(n),i=String(n?.nodeId||""),y=String(n?.id||"");if(!t||!i||!y)continue;let c=[t,i,y,"observe"].join(":");if(r.has(c))continue;r.add(c),f.push({id:`observation-arrow:${y}:${t}:${i}`,commandId:String(n?.commandId||n?.eventId||y),sourceNodeId:t,targetNodeId:i,sourceMarkerId:"",targetMarkerId:y,sourceKind:"monitor",action:"observe",status:"observation"})}return{markers:l,arrows:f}}function OX(l){let u=yn(l),r=String(l?.promptEvent||"");if(u==="initial-prompt-delivered")return"initial";if(r==="node-finished"||r==="node-long-running-observation"||r.startsWith("monitor-"))return"monitor";if(u==="monitor-prompt-delivered"||String(l?.sourceKind||"").toLowerCase()==="monitor")return"monitor";return"append"}function ZX(l){return Sl(l?.tags||l?.raw?.tags).map((u)=>String(u||"")).filter(Boolean)}function HX(l){let u=yn(l),r=String(l?.promptEvent||"");if(u==="initial-prompt-delivered")return"初始 prompt";if(r==="node-long-running-observation")return"长任务观察";if(r==="node-finished")return ZX(l).includes("monitor.audit")?"节点完成 / OA 审核":"节点完成";if(r==="monitor-interval")return"Monitor observation";if(r==="monitor-start")return"Monitor start";if(r==="monitor-stop")return"Monitor stop";if(u==="monitor-prompt-delivered")return"Monitor prompt";if(u==="append-prompt-queued")return"追加 prompt 已排队";return"追加 prompt"}function aL(l){let u=yn(l);if(u==="control-command-applied")return 3;if(u==="control-command-ignored")return 2;if(u==="control-command-queued")return 1;return 0}function BX(l,u){let r=String(l?.commandId||"");if(r)return`command:${r}`;return["control-event",My(l)||m$(l?.createdAt,l?.timestamp)||`index-${u}`,String(l?.sourceKind||""),String(l?.sourceNodeId||""),String(l?.targetNodeId||""),$0(l)].join(":")}function DX(l){return MF([l?.targetNodeId,...Sl(l?.resetNodeIds)])}function VX(l,u){let r=j$(l),f=yn(l),n=String(l?.targetNodeId||""),t=Boolean(n)&&u!==n;if(f==="control-command-applied")return t?`${r} 波及`:`${r} 生效`;if(f==="control-command-ignored")return`${r} 忽略`;if(f==="control-command-queued")return`${r} 已发起`;return t?`${r} 波及`:r}function SX(l){if(yn(l)==="control-command-ignored")return"ignored";let r=$0(l);if(r==="restart"||r==="redo")return"restart";if(r==="modify")return"modify";if(r==="approve")return"approve";if(r==="guide")return"guide";return"pending"}function YX(l){let u=String(l?.sourceKind||"").toLowerCase();if(u==="monitor")return"monitor";if(u==="webui")return"webui";if(u==="cli")return"cli";return"system"}function XX(l,u,r,f){let n=l.filter((_)=>String(_.nodeId||"")===u).sort((_,A)=>Number(_.startMs)-Number(A.startMs)),t=n.find((_)=>r>=Number(_.startMs)-1000&&r<=Number(_.endMs)+1000);if(t)return{ms:r,onInterval:!0,snapReason:"inside-interval",procedureRunId:String(t.procedureRunId||"")};let i=$0(f),y=n.slice().reverse().find((_)=>Number(_.endMs)<=r+1000);if(y&&i==="approve")return{ms:Number(y.endMs),onInterval:!0,snapReason:"previous-interval-end",procedureRunId:String(y.procedureRunId||"")};let c=n.find((_)=>Number(_.startMs)>=r-1000);if(c&&["guide","modify","restart","redo"].includes(i))return{ms:Number(c.startMs),onInterval:!0,snapReason:"next-interval-start",procedureRunId:String(c.procedureRunId||"")};return{ms:r,onInterval:!1,snapReason:"event-time",procedureRunId:String(f?.procedureRunId||"")}}function mG(l,u,r,f){let n=Math.hypot(r-l,f-u),t=n>BL?BL:0,i=t>0?r-(r-l)/n*t:r,y=t>0?f-(f-u)/n*t:f,c=i-l,_=Math.max(16,Math.min(42,Math.abs(c)*0.45+12)),A=c===0?1:Math.sign(c);return`M ${l},${u} C ${l+A*_},${u} ${i-A*_},${y} ${i},${y}`}function PX(l,u){let r=String(l?.runId||u?.runId||""),f=AG({...Xl(u)?u:{},...Xl(l)?l:{},runId:r,procedureRuns:Sl(l?.procedureRuns).length>0?l.procedureRuns:u?.procedureRuns},[]),n=[],t=[],i=[],y=new Set,c=new Map,_=(j,N)=>{if(!j.nodeId||!Number.isFinite(Number(j.ms)))return;if(y.has(j.id))return;y.add(j.id),N.push(j)};for(let j of Sl(l?.procedureRuns)){let N=w8(j,r),U=Pf(j);if(!N)continue;for(let w of Sl(j?.attempts)){let G=m8(w);for(let J of hF(w?.controlEventRecords)){let Q=yn(J);if(!["initial-prompt-delivered","append-prompt-delivered","monitor-prompt-delivered"].includes(Q))continue;let m=My(J),q=dl(m);if(q===null)continue;let W=String(J?.eventId||"");_({id:`prompt:${W||`${U}:${G}:${Q}:${q}`}`,runId:r,nodeId:N,procedureRunId:U,attempt:G,kind:"prompt",tone:OX(J),status:"delivered",label:HX(J),ms:q,timestampIso:m,sourceKind:String(J?.sourceKind||""),sourceNodeId:String(J?.sourceNodeId||""),targetNodeId:N,action:"",eventId:W,commandId:String(J?.commandId||""),raw:J},n)}}}let A=new Map;hF(l?.controlEvents).forEach((j,N)=>{let U=BX(j,N),w=A.get(U)||{key:U,events:[]};w.events.push(j),A.set(U,w)});for(let j of A.values()){let N=Sl(j.events).slice().sort((H,B)=>aL(B)-aL(H)),U=Sl(j.events).find((H)=>yn(H)==="control-command-queued")||null,w=N[0]||U;if(!U&&!w)continue;let G=String(U?.sourceNodeId||w?.sourceNodeId||""),J=String(U?.sourceKind||w?.sourceKind||""),Q=My(U)||My(w)||m$(U?.createdAt,w?.createdAt),m=dl(Q),q=String(w?.commandId||U?.commandId||j.key),W=(yn(w)||"control-command-queued").replace(/^control-command-/u,""),p="";if(G&&m!==null)p=`control-source:${q}:${G}`,c.set(q,p),_({id:p,runId:r,nodeId:G,procedureRunId:String(U?.procedureRunId||w?.procedureRunId||""),attempt:"",kind:"control-source",tone:YX(U||w),status:W,label:`${j$(U||w)} 发起`,ms:m,timestampIso:Q,action:$0(U||w),sourceKind:J,sourceNodeId:G,targetNodeId:String(w?.targetNodeId||U?.targetNodeId||""),commandId:q,raw:U||w},t);let O=w||U,Z=My(O)||Q,V=dl(Z);if(V===null)continue;let P=DX(O);for(let H of P){let B=XX(f,H,V,O),C=`control-target:${q}:${H}`;if(_({id:C,runId:r,nodeId:H,procedureRunId:B.procedureRunId,attempt:"",kind:"control-target",tone:SX(O),status:W,label:VX(O,H),ms:B.ms,eventMs:V,onInterval:B.onInterval,snapReason:B.snapReason,snapped:Number(B.ms)!==V,timestampIso:Z,renderedTimestampIso:J$(Number(B.ms)),action:$0(O),sourceKind:J,sourceNodeId:G,targetNodeId:H,commandId:q,raw:O},t),p&&G&&G!==H)i.push({id:`control-arrow:${q}:${G}:${H}`,commandId:q,sourceNodeId:G,targetNodeId:H,sourceMarkerId:p,targetMarkerId:C,sourceKind:J,action:$0(O),status:W})}}let F=[...n,...t].sort((j,N)=>Number(j.ms)-Number(N.ms)||String(j.nodeId).localeCompare(String(N.nodeId))||String(j.id).localeCompare(String(N.id)));return{...zX(F,i),sourceMarkerByCommand:c}}function CX({details:l,selectedNodeId:u,selectedNodeRuntime:r,control:f,onRaw:n}){if(!l)return T("span",{className:"muted"},"点击“抓取过程”读取 node 运行材料;主界面只显示结构化摘要,完整内容需点开原始 JSON。");let t=Sl(l.procedureRuns),i=t.at(-1)||{},y=Sl(i.attempts),c=y.at(-1)||{},_=Sl(i.workerLogTail),A=Sl(c.controlEventsTail),F=Sl(c.controlPromptsTail),j=Sl(c.monitorPromptsTail),N=BF(A),U=BF(F),w=BF(j),G=c.opencodeMessages||{};return T("div",{className:"pipeline-evidence-list compact"},T(Yf,{title:"Node runtime",subtitle:u||"--",facts:[`status ${r?.status||"pending"}`,`attempts ${r?.attempts??y.length}`,`procedure ${r?.currentProcedureRunId||Pf(i)||"--"}`,f.fetchedAt?`fetched ${iu(f.fetchedAt)}`:"not fetched"],data:l.node||l,onRaw:n,testId:"raw-pipeline-node-runtime"}),T(Yf,{title:"Procedure runs",subtitle:`${t.length} groups`,facts:[`latest ${i.status?.status||i.status||"--"}`,`steps ${Sl(i.recentSteps).length}`,`duration ${Xf(dl(i.finishedAt)&&dl(i.startedAt)?Number(dl(i.finishedAt))-Number(dl(i.startedAt)):i.durationMs)}`],data:t,onRaw:n,testId:"raw-pipeline-node-procedures"}),T(Yf,{title:"OpenCode messages",subtitle:String(G.exists?"available":"not indexed"),facts:[`messages ${_8(G.messageCount)}`,`size ${_8(G.size)}`,`updated ${Ll(G.updatedAt)}`],data:G,onRaw:n,testId:"raw-pipeline-node-messages"}),T(Yf,{title:"Control prompts",subtitle:"manual / monitor append queues",facts:[`manual tail ${U.total}`,`monitor tail ${w.total}`,`last ${Ll(vF(U.lastAt,w.lastAt))}`],data:{controlPromptsTail:F,monitorPromptsTail:j},onRaw:n,testId:"raw-pipeline-node-prompts"}),T(Yf,{title:"Control events",subtitle:N.eventKinds.length>0?N.eventKinds.join(", "):"event tail",facts:[`tail ${N.total}`,`parsed ${N.parsed}`,`last ${Ll(N.lastAt)}`],data:A,onRaw:n,testId:"raw-pipeline-node-events"}),T(Yf,{title:"Worker log",subtitle:"tail is hidden on main canvas",facts:[`tail ${_.length} lines`,"raw only via button",`procedure ${Pf(i)||"--"}`],data:_,onRaw:n,testId:"raw-pipeline-node-worker-log"}))}function hX({activeRun:l,onRaw:u}){if(!l)return T(qf,{title:"暂无运行材料",text:"没有 Pipeline epoch 时不会展示运行材料索引。"});let r=Sl(l.nodes),f=Sl(l.procedureRuns),n=Sl(l.submissions),t=Sl(l.workerLogTail),i=SL(r),y=SL(f),c=f.filter((A)=>String(A?.status||"").toLowerCase()==="failed"),_=vF(...f.flatMap((A)=>[A.updatedAt,A.finishedAt,A.startedAt]));return T("div",{className:"pipeline-evidence-list"},T(Yf,{title:"Epoch overview",subtitle:l.runId||"--",facts:[`pipeline ${l.pipelineId||"--"}`,`status ${l.status||"--"}`,`started ${Ll(l.startedAt)}`,`updated ${Ll(l.updatedAt)}`],data:l,onRaw:u,testId:"raw-pipeline-run"}),T(Yf,{title:"Node states",subtitle:`${r.length} nodes`,facts:[`running ${i.running||0}`,`succeeded ${i.succeeded||0}`,`failed ${i.failed||0}`,`pending ${i.pending||0}`],data:r,onRaw:u,testId:"raw-pipeline-run-nodes"}),T(Yf,{title:"Procedure run index",subtitle:`${f.length} procedure records`,facts:[`succeeded ${y.succeeded||0}`,`failed ${y.failed||0}`,`latest ${Ll(_)}`,`errors ${c.length}`],data:f,onRaw:u,testId:"raw-pipeline-run-procedures"}),T(Yf,{title:"OA submissions",subtitle:`${n.length} submission files`,facts:[`records ${n.length}`,`task ${_8(l.task)}`,"raw grouped by run"],data:n,onRaw:u,testId:"raw-pipeline-run-submissions"}),T(Yf,{title:"Worker log tail",subtitle:"hidden from main interface",facts:[`tail ${t.length} lines`,"display raw only after click",`updated ${Ll(l.updatedAt)}`],data:t,onRaw:u,testId:"raw-pipeline-run-worker-log"}))}function MX({diagnostics:l,onRaw:u}){let r=Sl(l?.runs).filter(Xl),f=Sl(l?.forbiddenResiduals),n=Xl(l?.guarantees)?l.guarantees:{},t=l?.hasNeutralNodeFinishedEvidence===!0&&l?.hasNoAuditPolicyEvidence===!0&&l?.hasAuditPolicyEvidence===!0,i=l?.ok===!0&&t&&f.length===0,y=r[0]||null,c=[{label:"中性完成事实",ok:n.neutralNodeFinished===!0,hint:"node-finished 不携带流程策略"},{label:"Config 策略判定",ok:n.auditPolicyFromConfig===!0,hint:"OA backend 读取当前 epoch 配置"},{label:"控制命令来自 OA",ok:n.runnerConsumesControlCommandsFromOaEvents===!0,hint:"runner 只消费 OA control.command"},{label:"无独立审核事件",ok:n.noIndependentAuditRequestEvent===!0,hint:"审核由 node-finished + policy 派生"},{label:"无批次门禁",ok:n.noBatchFinishedControlGate===!0,hint:"下游启动由每个 node 完成驱动"}];return T("div",{className:"pipeline-oa-panel","data-testid":"pipeline-oa-event-flow-panel"},T("div",{className:"metric-grid compact"},T(sr,{label:"OA Flow",value:i?"100%":"--",hint:String(l?.mode||"waiting diagnostics"),tone:i?"ok":"warn"}),T(sr,{label:"禁止残留",value:f.length,hint:f.length===0?"source scan clean":"needs cleanup",tone:f.length===0?"ok":"warn"}),T(sr,{label:"No-audit",value:l?.hasNoAuditPolicyEvidence?"OK":"--",hint:"OA 下游策略证据",tone:l?.hasNoAuditPolicyEvidence?"ok":"warn"}),T(sr,{label:"Monitor 审核",value:l?.hasAuditPolicyEvidence?"OK":"--",hint:"OA 控制事件闭环",tone:l?.hasAuditPolicyEvidence?"ok":"warn"})),T("div",{className:"pipeline-oa-guarantees"},c.map((_)=>T("article",{key:_.label,className:`pipeline-oa-guarantee ${_.ok?"ok":"warn"}`},T(_i,{status:_.ok?"online":"warn"},_.ok?"OK":"MISS"),T("div",null,T("strong",null,_.label),T("span",null,_.hint))))),T("div",{className:"pipeline-evidence-list compact"},r.slice(0,6).map((_)=>T(Yf,{key:_.runId,title:String(_.runId||"--"),subtitle:[Number(_.monitorAuditNodeFinishedCount||0)>0?"monitor audit":"",Number(_.noAuditPolicyCount||0)>0?"no-audit policy":""].filter(Boolean).join(" / ")||"event evidence",facts:[`events ${_.eventCount||0}`,`node-finished ${_.nodeFinishedCount||0}`,`policy-in-detail ${_.nodeFinishedWithPolicyCount||0}`,`queued ${_.controlQueuedCount||0}`,`applied ${_.controlAppliedCount||0}`],data:_,onRaw:u,testId:`raw-pipeline-oa-run-${String(_.runId||"run").replace(/[^a-zA-Z0-9_.-]+/g,"-")}`}))),y?T("p",{className:"muted paragraph"},`最新证据 ${y.runId}: ${y.nodeFinishedCount||0} 个 node-finished,${y.controlAppliedCount||0} 个控制结果。`):T(qf,{title:"暂无 OA 事件流证据",text:"等待 Pipeline backend 暴露 diagnostics。"}),l?T("div",{className:"panel-actions inline-actions"},T(cn,{title:"Pipeline OA Event Flow Diagnostics",data:l,onOpen:u,testId:"raw-pipeline-oa-event-flow"})):null)}function sX({quota:l,onRaw:u}){let r=Xl(l?.summary)?l.summary:{},f=Xl(l?.target)?l.target:{},n=Xl(l?.cache)?l.cache:{},t=l?.ok===!0,i=String(l?.modelId||r.modelName||f.modelName||"MiniMax-M2.7"),y=r.totalCount??f.currentIntervalTotalCount,c=r.usageCount??f.currentIntervalUsageCount,_=r.remainingCount??f.currentIntervalRemainingCount,A=r.remainingRatio??(Number.isFinite(Number(y))&&Number(y)>0&&Number.isFinite(Number(_))?Number(_)/Number(y):void 0),F=r.usageRatio??(Number.isFinite(Number(y))&&Number(y)>0&&Number.isFinite(Number(c))?Number(c)/Number(y):void 0),j=r.resetAt||f.endAt,N=r.remainsMs??f.remainsMs,U=Number(_),w=!t||Number.isFinite(U)&&U<=0?"warn":"ok",G=[t?`endpoint ${l?.endpoint||"--"}`:"quota unavailable",`fetched ${$8(l?.fetchedAt)}`,n.hit?`cache ${Xf(n.ageMs)}`:"live quota"];return T("div",{className:"pipeline-minimax-quota-panel","data-testid":"pipeline-minimax-quota-panel"},T("div",{className:"metric-grid compact"},T(sr,{label:"MiniMax",value:t?i:"--",hint:l?.modelComponent||l?.error||"model/minimax-m27",tone:w}),T(sr,{label:"当前窗口",value:`${HF(c)}/${HF(y)}`,hint:`已用 ${VL(F)}`,tone:w}),T(sr,{label:"剩余额度",value:HF(_),hint:`剩余 ${VL(A)}`,tone:w}),T(sr,{label:"重置时间",value:$8(j),hint:N!==void 0?`约 ${Xf(N)}`:Ll(j),tone:w})),T(kF,{items:G}),t?T("p",{className:"muted paragraph"},`MiniMax 限额来自 D601 Pipeline 后端实时查询;当前模型匹配 ${r.modelName||f.modelName||i}。`):T(el,{error:l?.error||"MiniMax 限额查询失败"}),l?T("div",{className:"panel-actions inline-actions"},T(cn,{title:"Pipeline MiniMax Quota",data:l,onOpen:u,testId:"raw-pipeline-minimax-quota"})):null)}function RX({epochs:l,activeRun:u,activePipeline:r,pipelineNodes:f,pipelineEdges:n,runDetails:t,nodeDetails:i,nodeDetailsState:y,ganttScale:c=Q$,onGanttScaleChange:_,onRunChange:A,onIntervalSelect:F,onMarkerSelect:j,selection:N,detailOpen:U,onDetailOpenChange:w,onRaw:G}){let[J,Q]=lf(qX),[m,q]=lf({startY:0,endY:0,startMs:0,endMs:0}),[W,p]=lf(Date.now()),O=ci(null),Z=String(u?.runId||""),V=Boolean(U),P=(Nl)=>{if(typeof w==="function")w(Nl)},H=Ai(c??Q$),B=String(t?.runId||"")===Z?t?.details:null,C=B?{...Xl(u)?u:{},...Xl(B)?B:{},runId:Z,procedureRuns:Sl(B?.procedureRuns).length>0?B.procedureRuns:u?.procedureRuns}:u,E=AG(C,f,W),D=B?PX(B,C):{markers:[],arrows:[]},Y=Sl(D.markers),v=wX(C,E,Y),K=KX(v,H,E,W),X=String(K.source||"frontend-y"),I=E.map((Nl)=>EX(Nl,K,W)),o={startMs:Number(K.startMs),endMs:Number(K.endMs),durationMs:Math.max(1,Number(K.durationMs??Number(K.endMs)-Number(K.startMs)))},fl=eF(H),yl={...fl,pxPerMinute:Number(K.pxPerMinute??fl.pxPerMinute)},h=Math.round(Number(K.chartHeight||360)),s=E.some(lj);Hn(()=>{if(!Z||!s)return;let Nl=window.setInterval(()=>p(Date.now()),1000);return()=>window.clearInterval(Nl)},[Z,s]);let ul=$X(r,f,Array.isArray(n)?n:[]),tl=f.map((Nl)=>String(Nl?.id||"")).filter(Boolean),Al=I.map((Nl)=>String(Nl.nodeId||"")).filter(Boolean),Kl=Y.map((Nl)=>String(Nl.nodeId||"")).filter(Boolean),wl=Array.from(new Set([...ul,...tl,...Al,...Kl])),El={startY:0,endY:h,startMs:Number(o.startMs),endMs:Number(o.endMs)},M=Number(m?.endY||0)>0?m:El,d=(Nl)=>{return U8(Nl,o,h,K)<=Number(M.endY)&&bF(Nl,o,h,K)>=Number(M.startY)},nl=(Nl)=>{let al=wf(Nl,o,h,K);return al>=Number(M.startY)&&al<=Number(M.endY)},k=new Set(wl.filter((Nl)=>I.some((al)=>al.nodeId===Nl&&d(al))||Y.some((al)=>al.nodeId===Nl&&nl(al)))),g=J?wl.filter((Nl)=>k.has(Nl)):wl,cl=`${OF}px ${g.length>0?g.map(()=>`${On}px`).join(" "):"minmax(160px, 1fr)"}`,pl=Sl(K.ticks).filter(Xl),Hl=String(N?.mode==="interval"?N?.interval?.procedureRunId||"":""),bl=String(N?.mode==="event"?N?.marker?.id||"":""),_u=()=>{let Nl=O.current;if(!Nl){q(El);return}let al=Math.max(0,Nl.scrollTop-ZF),gu=Math.max(120,Nl.clientHeight-ZF),hl=Math.min(h,al+gu),yr={startY:al,endY:hl,startMs:Number(o.startMs),endMs:Number(o.endMs)},Zr=Math.max(0,Math.min(1,al/h)),cr=Math.max(Zr,Math.min(1,hl/h)),ku=Math.max(1,Number(o.endMs)-Number(o.startMs));yr.startMs=Number(o.startMs)+ku*Zr,yr.endMs=Number(o.startMs)+ku*cr,q(yr)};Hn(()=>{let Nl=O.current,al=window.setTimeout(_u,0);return Nl?.addEventListener("scroll",_u),window.addEventListener("resize",_u),()=>{window.clearTimeout(al),Nl?.removeEventListener("scroll",_u),window.removeEventListener("resize",_u)}},[Z,o.startMs,o.endMs,h]);let tu=Math.max(0,wl.length-g.length),Nu=new Set(Y.filter((Nl)=>g.includes(String(Nl.nodeId||""))&&nl(Nl)).map((Nl)=>String(Nl.id))),gl=new Map(Y.map((Nl)=>[String(Nl.id),Nl])),zr=Sl(D.arrows).filter((Nl)=>{if(!Nu.has(String(Nl.targetMarkerId||"")))return!1;if(String(Nl.action||"")==="observe")return g.includes(String(Nl.sourceNodeId||""));return Nu.has(String(Nl.sourceMarkerId||""))}),nf=OF+Math.max(1,g.length)*On,lr=(Nl)=>{let al=Ai(Nl.target.value);if(typeof _==="function")_(al);window.setTimeout(_u,0)},tf=()=>UX({title:`${r?.id||"pipeline"}-${Z||"epoch"}-gantt`,meta:[`run ${Z||"--"}`,`${Ll(o.startMs)} -> ${Ll(o.endMs)}`,`duration ${Xf(o.durationMs)}`,`${yl.label} / ${YF(yl.pxPerMinute)} px/min`,`${g.length}/${wl.length} nodes`,`${Y.length} markers`],visibleNodeIds:g,intervals:I,markers:Y.filter((Nl)=>g.includes(String(Nl.nodeId||""))),arrows:zr,ticks:pl,bounds:o,chartHeight:h,backendLayout:K}),Or=Xl(B?.gantt?.diagnostics)?B.gantt.diagnostics:null;return T(Zn,{title:"Epoch 甘特图",eyebrow:`${r?.id||"pipeline"} / ${l.length} epochs`,className:"pipeline-wide-panel",loading:t?.loading,actions:T("div",{className:"pipeline-gantt-actions"},T("select",{value:Z,disabled:l.length===0,onChange:(Nl)=>A(Nl.target.value),"data-testid":"pipeline-epoch-select"},l.map((Nl)=>T("option",{key:Nl.runId,value:Nl.runId},RF(l,Nl)))),T("label",{className:"pipeline-gantt-toggle"},T("input",{type:"checkbox","data-testid":"pipeline-gantt-auto-hide-idle",checked:J,onChange:(Nl)=>{Q(Boolean(Nl.target.checked)),window.setTimeout(_u,0)}}),T("span",null,"自动隐藏空闲列")),T("label",{className:"pipeline-gantt-scale"},T("span",null,T("b",null,"时间尺度"),T("em",{"data-testid":"pipeline-gantt-scale-label"},`${yl.label} · ${YF(yl.pxPerMinute)} px/min`)),T("input",{type:"range",min:0,max:100,step:0.01,value:H,onChange:lr,"aria-label":"调整甘特图时间尺度","data-testid":"pipeline-gantt-time-scale"}),T("small",null,T("span",null,"全局"),T("span",null,"细节"))),u?T("button",{type:"button",className:"ghost-btn",onClick:tf,disabled:g.length===0,"data-testid":"pipeline-export-gantt"},"导出甘特图"):null,u?T(cn,{title:`Pipeline Epoch ${u.runId}`,data:u,onOpen:G,testId:"raw-pipeline-epoch-gantt"}):null)},!u?T(qf,{title:"暂无 Epoch",text:"当前 pipeline 还没有完整运行记录。"}):I.length===0?T(qf,{title:"暂无时间区间",text:"等待 D601 Pipeline backend 在 procedure summary 中返回 startedAt / finishedAt。"}):T("div",{className:"pipeline-gantt-wrap"},T("div",{className:`pipeline-gantt-detail-layout ${V?"detail-open":"detail-collapsed"}`,"data-testid":"pipeline-gantt-detail-layout","data-sidebar-open":V?"true":"false"},T("div",{className:"pipeline-gantt-main"},T("div",{className:"pipeline-gantt-main-head"},T("div",{className:"pipeline-gantt-meta"},T("span",null,`time ${Ll(o.startMs)} -> ${Ll(o.endMs)}`),T("span",null,`duration ${Xf(o.durationMs)}`),T("span",null,`scale ${yl.label} / ${YF(yl.pxPerMinute)} px/min`),T("span",null,`layout ${X}`),Or?T("span",null,`align ${Or.timeAxisAlignmentOk===!1?"check":"ok"}`):null,T("span",null,`visible ${g.length}/${wl.length} nodes`),B?T("span",null,`markers ${Y.length}`):null,J&&tu>0?T("span",null,`hidden idle ${tu}`):null),!V?T("button",{type:"button",className:"pipeline-sidecar-tab right",disabled:!N?.mode,onClick:()=>P(!0),"data-testid":"pipeline-gantt-sidebar-toggle"},N?.mode?"展开详情":"点击甘特图元素展开详情"):null),T("div",{className:"pipeline-gantt-viewport",ref:O,"data-testid":"pipeline-epoch-gantt","data-pipeline-id":r?.id||"","data-run-id":Z,"data-layout-source":X,"data-start-ms":String(o.startMs),"data-end-ms":String(o.endMs),"data-chart-height":String(h)},T("div",{className:"pipeline-gantt-board",style:{gridTemplateColumns:cl,minWidth:`${nf}px`}},T("div",{className:"pipeline-gantt-head time"},"Time"),g.length===0?T("div",{className:"pipeline-gantt-head empty"},"当前时间窗无工作节点"):g.map((Nl)=>T("div",{key:`head-${Nl}`,className:"pipeline-gantt-head node",title:Nl,"data-testid":"pipeline-gantt-head-node","data-node-id":Nl},T(xY,{value:Nl}))),T("div",{className:"pipeline-gantt-time-axis",style:{height:`${h}px`}},pl.map((Nl)=>{let al=QG(Nl,o,h,K);return T("div",{key:`tick-${Nl.ms}-${al}`,className:"pipeline-gantt-tick",style:{top:`${al}px`},"data-testid":"pipeline-gantt-tick","data-ms":String(Nl.ms),"data-y":String(al)},T("b",null,Ll(Nl.ms)),T("span",null,`+${Xf(Number(Nl.offsetMs??Number(Nl.ms)-Number(o.startMs)))}`))})),g.length>0?T("svg",{className:"pipeline-gantt-arrow-layer",width:g.length*On,height:h,viewBox:`0 0 ${g.length*On} ${h}`,style:{left:`${OF}px`,top:`${ZF}px`,width:`${g.length*On}px`,height:`${h}px`},"aria-hidden":"true"},T("defs",null,T("marker",{id:"pipeline-gantt-arrowhead",viewBox:"0 0 10 10",refX:9,refY:5,markerWidth:6,markerHeight:6,orient:"auto-start-reverse"},T("path",{d:"M 0 0 L 10 5 L 0 10 z",fill:"context-stroke"}))),zr.map((Nl)=>{let al=gl.get(String(Nl.targetMarkerId||""));if(!al)return null;let gu=gl.get(String(Nl.sourceMarkerId||"")),hl=String(gu?.nodeId||Nl.sourceNodeId||""),yr=g.indexOf(hl),Zr=g.indexOf(String(al.nodeId||""));if(yr<0||Zr<0)return null;let cr=yr*On+On/2,ku=Zr*On+On/2,Gf=gu?wf(gu,o,h,K):wf(al,o,h,K),Vn=wf(al,o,h,K);return T("path",{key:Nl.id,className:`pipeline-gantt-arrow ${String(Nl.sourceKind||"").toLowerCase()} ${String(Nl.status||"").toLowerCase()} ${String(Nl.action||"").toLowerCase()}`,d:mG(cr,Gf,ku,Vn),markerEnd:"url(#pipeline-gantt-arrowhead)","data-testid":String(Nl.action||"")==="observe"?"pipeline-gantt-observation-arrow":"pipeline-gantt-arrow","data-source-node-id":String(Nl.sourceNodeId||""),"data-target-node-id":String(Nl.targetNodeId||""),"data-target-marker-id":String(Nl.targetMarkerId||""),"data-action":String(Nl.action||""),"data-source-y":String(Gf),"data-target-y":String(Vn)})})):null,g.length===0?T("div",{className:"pipeline-gantt-empty-col",style:{height:`${h}px`}},"滚动到有活动的时间段后,相关 node 列会自动出现。"):g.map((Nl)=>{let al=I.filter((hl)=>hl.nodeId===Nl),gu=Y.filter((hl)=>String(hl.nodeId||"")===Nl);return T("div",{key:`col-${Nl}`,className:"pipeline-gantt-node-col",style:{height:`${h}px`}},al.map((hl)=>{let yr=U8(hl,o,h,K),Zr=bF(hl,o,h,K),cr=UG(hl,o,h,K),ku=String(hl.procedureRunId||`${Nl}-${hl.startMs}`);return T("button",{key:ku,type:"button",className:`pipeline-gantt-bar ${hl.status} ${hl.live?"live":""} ${Hl===ku?"selected":""}`,style:{top:`${yr}px`,height:`${cr}px`},title:`${Nl} ${hl.status} ${Ll(hl.startedAt||hl.startMs)} -> ${Ll(hl.finishedAt||hl.endMs)}`,onClick:()=>F(hl),"data-testid":"pipeline-gantt-line","data-node-id":Nl,"data-procedure-run-id":String(hl.procedureRunId||""),"data-status":String(hl.status||""),"data-live":hl.live?"true":"false","data-start-ms":String(hl.startMs||""),"data-end-ms":String(hl.endMs||""),"data-y1":String(yr),"data-y2":String(Zr),"data-natural-height":String(Math.max(0,Zr-yr))},T("strong",null,hl.status||"working"),T("span",null,Xf(hl.durationMs)))}),gu.map((hl)=>T("button",{key:hl.id,type:"button",className:`pipeline-gantt-marker ${hl.kind} ${hl.tone||""} ${hl.status||""} ${bl===String(hl.id)?"selected":""}`,style:{top:`${wf(hl,o,h,K)}px`},title:`${hl.label||"event"} / ${Ll(hl.timestampIso||hl.timestamp||hl.ms)}`,onClick:()=>j(hl),"data-testid":hl.kind==="prompt"?"pipeline-gantt-prompt-marker":"pipeline-gantt-control-marker","data-marker-id":String(hl.id||""),"data-ms":String(hl.ms??hl.eventMs??""),"data-y":String(wf(hl,o,h,K))})))})))),V?T(RY,{selection:N,runDetails:t,nodeDetails:i,nodeDetailsState:y,onRaw:G,onCollapse:()=>P(!1)}):null)))}function yt(){return{loading:!1,actionLoading:"",error:"",message:"",details:null,fetchedAt:null,appendPrompt:"",guidePrompt:"",modifyPrompt:"",approveReason:"",redoReason:""}}function yi(){return{mode:"",runId:"",interval:null,marker:null}}function XF(){return{runId:"",loading:!1,error:"",details:null,fetchedAt:null}}function _$(l,u){return`${l}/microservices/pipeline/proxy${u}`}function xX({activeRun:l,pipelineRuns:u,selectedRunId:r,onRunChange:f,selectedNodeId:n,selectedNodeConfig:t,selectedNodeRuntime:i,control:y,onControlChange:c,onFetch:_,onAction:A,onRaw:F,onCollapse:j}){let N=String(l?.runId||""),U=String(i?.status||"pending"),w=!N||!n||y.loading||Boolean(y.actionLoading),G=(Q)=>(m)=>c({[Q]:m.target.value,error:"",message:""}),J=u.length>0?u:l?[l]:[];return T("aside",{className:"pipeline-node-control","data-testid":"pipeline-node-control"},T("div",{className:"pipeline-node-control-head"},T("div",null,T("p",{className:"panel-eyebrow"},"Manual Node Control"),T(nu,{title:n||"点击控制图中的 node",level:3,loading:y.loading||Boolean(y.actionLoading)})),T("div",{className:"pipeline-node-control-head-actions"},n?T(_i,{status:U},U):T(_i,{status:"pending"},"idle"),T("button",{type:"button",className:"ghost-btn mini",onClick:j,"data-testid":"pipeline-node-sidebar-collapse"},"收起"))),T("div",{className:"pipeline-control-runbar"},T("label",null,T("span",null,"目标 run"),T("select",{value:N||r,disabled:J.length===0,onChange:(Q)=>f(Q.target.value),"data-testid":"pipeline-node-run-select"},J.map((Q)=>T("option",{key:Q.runId,value:Q.runId},`${Q.runId||"--"} / ${Q.status||"--"}`)))),T("button",{type:"button",className:"ghost-btn",disabled:w,onClick:_,"data-testid":"pipeline-node-fetch"},y.loading?"抓取中":"抓取过程"),y.details?T(cn,{title:`Pipeline Node ${n}`,data:y.details,onOpen:F,testId:"raw-pipeline-node-control"}):null),T("div",{className:"pipeline-control-meta"},T("span",null,T("b",null,"kind"),String(t?.kind||"--")),T("span",null,T("b",null,"procedure"),String(i?.currentProcedureRunId||"--")),T("span",null,T("b",null,"attempts"),String(i?.attempts??"--")),T("span",null,T("b",null,"updated"),Ll(l?.updatedAt))),!n?T(qf,{title:"未选择 node",text:"点击 React Flow 控制图中的任意 node 后,可抓取执行过程、追加 prompt、下发引导、增量修改、审核通过或重做。"}):null,T(el,{error:y.error,wide:!0}),T("div",{className:"pipeline-control-actions"},T("label",null,T("span",null,"实时追加 prompt(仅 running node)"),T("textarea",{value:y.appendPrompt,onChange:G("appendPrompt"),placeholder:"让当前执行中的 agent 继续、补充检查或调整当前步骤...",rows:4,disabled:!n,"data-testid":"pipeline-node-append-input"}),T("button",{type:"button",className:"primary-btn compact",disabled:w||!String(y.appendPrompt||"").trim(),onClick:()=>A("append"),"data-testid":"pipeline-node-append-button"},y.actionLoading==="append"?"追加中":"追加到运行中 node")),T("label",null,T("span",null,"下次尝试引导 prompt"),T("textarea",{value:y.guidePrompt,onChange:G("guidePrompt"),placeholder:"给该 node 下一次 attempt 的执行提示;不会立即打断当前 session。",rows:4,disabled:!n,"data-testid":"pipeline-node-guide-input"}),T("button",{type:"button",className:"ghost-btn compact",disabled:w||!String(y.guidePrompt||"").trim(),onClick:()=>A("guide"),"data-testid":"pipeline-node-guide-button"},y.actionLoading==="guide"?"下发中":"下发 guide")),T("label",null,T("span",null,"完成后增量修改 prompt"),T("textarea",{value:y.modifyPrompt,onChange:G("modifyPrompt"),placeholder:"在该 node 已完成结果基础上追加修改要求;runner 会重跑目标 node,并保留同 node 既有 OA 输出作为上下文。",rows:4,disabled:!n,"data-testid":"pipeline-node-modify-input"}),T("button",{type:"button",className:"ghost-btn compact",disabled:w||!String(y.modifyPrompt||"").trim(),onClick:()=>A("modify"),"data-testid":"pipeline-node-modify-button"},y.actionLoading==="modify"?"排队中":"增量修改 node")),T("label",null,T("span",null,"Monitor 审核通过原因"),T("textarea",{value:y.approveReason,onChange:G("approveReason"),placeholder:"当流程配置开启 monitor 审核时,记录审核通过原因并释放后续 node。",rows:3,disabled:!n,"data-testid":"pipeline-node-approve-input"}),T("button",{type:"button",className:"primary-btn compact",disabled:w||!String(y.approveReason||"").trim(),onClick:()=>A("approve"),"data-testid":"pipeline-node-approve-button"},y.actionLoading==="approve"?"提交中":"审核通过")),T("label",null,T("span",null,"重做 / restart 原因"),T("textarea",{value:y.redoReason,onChange:G("redoReason"),placeholder:"说明为什么需要重做;runner 会重置目标 node 以及非 rework 下游 node。",rows:4,disabled:!n,"data-testid":"pipeline-node-redo-input"}),T("button",{type:"button",className:"danger-btn compact",disabled:w||!String(y.redoReason||"").trim(),onClick:()=>A("redo"),"data-testid":"pipeline-node-redo-button"},y.actionLoading==="redo"?"排队中":"重做 node"))),T("div",{className:"pipeline-control-evidence"},T("strong",null,"Node 过程索引"),T(CX,{details:y.details,selectedNodeId:n,selectedNodeRuntime:i,control:y,onRaw:F})))}function wG({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((e)=>e.id==="pipeline")||null,[n,t]=lf({loading:!1,error:"",health:null,snapshot:null,oaDiagnostics:null,minimaxQuota:null,refreshedAt:null}),[i,y]=lf(""),[c,_]=lf(""),[A,F]=lf(""),[j,N]=lf(yt()),[U,w]=lf({}),[G,J]=lf(yi()),[Q,m]=lf(XF()),[q,W]=lf(Q$),[p,O]=lf(!1),[Z,V]=lf(!1),P=ci(0),{addNotification:H}=Xr(),B=ci(!1),C=ci(0),E=ci(""),D=ci({}),Y=ci(""),v=ci("");async function K(e={}){let Dl=e.silent===!0;if(!f)return;if(B.current)return;B.current=!0;let Cl=P.current+1;if(P.current=Cl,!Dl)t((lu)=>({...lu,loading:!0,error:""}));try{let lu=`__unideskArrayLimit=registry.components:80,runs:${EY}`,[mu,au,yu]=await Promise.all([ii(`${r}/microservices/pipeline/proxy/api/snapshot?${lu}`,{cache:"no-store"}),ii(`${r}/microservices/pipeline/proxy/api/oa-event-flow/diagnostics`,{cache:"no-store"}).catch((Sn)=>({ok:!1,error:zl(Sn,"OA event flow diagnostics failed")})),ii(`${r}/microservices/pipeline/proxy/api/model-quota/minimax`,{cache:"no-store"}).catch((Sn)=>({ok:!1,error:zl(Sn,"MiniMax quota failed")}))]);if(Cl!==P.current)return;let ur={ok:mu?.ok!==!1,service:"pipeline-v2-control snapshot"};t({loading:!1,error:"",health:ur,snapshot:mu,oaDiagnostics:au,minimaxQuota:yu,refreshedAt:new Date})}catch(lu){if(Cl!==P.current)return;t((mu)=>({...mu,loading:!1,error:zl(lu,"Pipeline 加载失败")}))}finally{B.current=!1}}Hn(()=>{if(K(),!f)return;let e=()=>{if(n8())K({silent:!0})},Dl=window.setInterval(()=>{e()},HL),Cl=()=>{if(n8())e()};return document.addEventListener("visibilitychange",Cl),()=>{window.clearInterval(Dl),document.removeEventListener("visibilitychange",Cl)}},[f?.id,f?.runtime?.providerStatus,r]);let X=bY(f),I=gY(f),o=vY(f),fl=n.snapshot||{},yl=n.oaDiagnostics||null,h=n.minimaxQuota||null,{components:s,pipelines:ul,runs:tl}=kY(fl),Al=String(tl[0]?.pipelineId||""),Kl=(Al?ul.find((e)=>String(e.id||"")===Al):null)||ul[0]||{},wl=ul.find((e)=>String(e.id||"")===i)||Kl,El=String(wl.id||""),M=iG(wl),d=aF(wl),nl=gL(tl,El),k=mX(tl,El),g=k.find((e)=>String(e?.runId||"")===c)||nl,cl=String(Q.runId||"")===String(g?.runId||"")?dY(Q.details):null,pl=eY(g,cl),Hl=String(pl?.runId||""),bl=M.find((e)=>String(e?.id||"")===A)||null,_u=A?yG(pl,A):null,tu=aY(tl),Nu=fX(s),gl=Number(n.health?.components)||hL(fl,"registry.components",s.length),zr=hL(fl,"runs",tl.length),nf=RL(wl,pl,s),lr={nodes:nf.nodes.map((e)=>e.id===A?{...e,selected:!0,className:`${e.className||""} selected-control-node`}:e),edges:nf.edges},tf=ul.map((e)=>{let Dl=String(e.id||"pipeline"),Cl=gL(tl,Dl);return{title:`${Dl}-${Cl?.runId||"snapshot"}`,flow:RL(e,Cl,s)}}),Or=String(G?.runId||Hl||""),Nl=String(G?.interval?.nodeId||G?.marker?.nodeId||""),al=Or&&Nl?U[SF(Or,Nl)]||null:null,gu=A8(j.details,Or,Nl),hl=A8(al?.details,Or,Nl)||gu,yr=Or&&Nl?{...Xl(al)?al:{},runId:Or,nodeId:Nl,details:hl,loading:Boolean(al?.loading)||!hl&&Boolean(j.loading)&&A===Nl,error:String(al?.error||""),fetchedAt:al?.fetchedAt||(gu?j.fetchedAt:null)}:null,Zr=k.map((e)=>String(e?.runId||"")).filter(Boolean).join("|"),cr=M.map((e)=>String(e?.id||"")).filter(Boolean).join("|");Hn(()=>{Y.current=A},[A]),Hn(()=>{v.current=Hl},[Hl]),Hn(()=>{if(!c||Zr.split("|").includes(c))return;_("")},[c,Zr]),Hn(()=>{if(!A||cr.split("|").includes(A))return;F(""),N(yt()),J(yi()),O(!1),V(!1)},[A,cr]),Hn(()=>{if(!A)O(!1)},[A]),Hn(()=>{if(!G.mode)V(!1)},[G.mode]);async function ku(e=Hl,Dl={}){if(!e){m(XF());return}let Cl=Ai(Dl.scale??q??Q$),lu=`${e}:timeline`;if(E.current===lu)return;E.current=lu;let mu=Dl.silent===!0,au=C.current+1;C.current=au,m((yu)=>({runId:e,scale:Cl,loading:!mu||String(yu.runId||"")!==e||!yu.details,error:"",details:mu&&yu.runId===e?yu.details:yu.runId===e?yu.details:null,fetchedAt:yu.runId===e?yu.fetchedAt:null}));try{let[yu,ur]=await Promise.all([ii(_$(r,`/api/node-control/runs/${encodeURIComponent(e)}?tail=160&view=timeline`),{cache:"no-store",strictJson:!0}),ii(_$(r,`/api/runs/${encodeURIComponent(e)}`),{cache:"no-store"}).catch((Sn)=>({ok:!1,runSummaryError:zl(Sn,"抓取评分失败")}))]);if(au!==C.current)return;m({runId:e,scale:Cl,loading:!1,error:"",details:{...yu,run:Xl(ur?.run)?ur.run:void 0,runSummaryError:ur?.runSummaryError},fetchedAt:new Date})}catch(yu){if(au!==C.current)return;m((ur)=>({runId:e,scale:Cl,loading:!1,error:zl(yu,"抓取 epoch 执行过程失败"),details:ur.runId===e?ur.details:null,fetchedAt:ur.runId===e?ur.fetchedAt:null}))}finally{if(E.current===lu)E.current=""}}function Gf(e,Dl,Cl){let lu=SF(e,Dl);w((mu)=>{let au={...mu,[lu]:{...Xl(mu?.[lu])?mu[lu]:{},runId:e,nodeId:Dl,...Cl}},yu=Object.keys(au);if(yu.length>32)for(let ur of yu.slice(0,yu.length-32))delete au[ur];return au})}async function Vn(e,Dl){if(!e||!Dl)return;let Cl=SF(e,Dl),lu=Number(D.current?.[Cl]||0)+1;D.current={...D.current,[Cl]:lu},Gf(e,Dl,{loading:!0,error:""});try{let mu=await ii(_$(r,`/api/node-control/runs/${encodeURIComponent(e)}/nodes/${encodeURIComponent(Dl)}?tail=160`),{cache:"no-store",strictJson:!0});if(Number(D.current?.[Cl]||0)!==lu)return;let au=new Date;if(Gf(e,Dl,{loading:!1,details:mu,fetchedAt:au,error:""}),Y.current===Dl&&v.current===e)N((yu)=>({...yu,loading:!1,details:mu,fetchedAt:au,error:""}))}catch(mu){if(Number(D.current?.[Cl]||0)!==lu)return;Gf(e,Dl,{loading:!1,error:zl(mu,"抓取 Gantt node 详情失败")})}}Hn(()=>{if(!Hl){m(XF());return}ku(Hl);let e=()=>{if(n8())ku(Hl,{silent:!0})},Dl=window.setInterval(()=>{e()},HL),Cl=()=>{if(n8())e()};return document.addEventListener("visibilitychange",Cl),()=>{window.clearInterval(Dl),document.removeEventListener("visibilitychange",Cl)}},[Hl,r]);async function Rr(e=Hl,Dl=A){if(!e||!Dl){N((Cl)=>({...Cl,error:"请先选择 run 和 node",message:""}));return}N((Cl)=>({...Cl,loading:!0,error:"",message:""}));try{let Cl=await ii(_$(r,`/api/node-control/runs/${encodeURIComponent(e)}/nodes/${encodeURIComponent(Dl)}?tail=160`),{cache:"no-store",strictJson:!0}),lu=new Date;N((mu)=>({...mu,loading:!1,details:Cl,fetchedAt:lu,error:""})),Gf(e,Dl,{loading:!1,details:Cl,fetchedAt:lu,error:""})}catch(Cl){N((lu)=>({...lu,loading:!1,error:zl(Cl,"抓取 node 执行过程失败")}))}}async function ay(e){let Dl=String(e?.runId||Hl||""),Cl=String(e?.nodeId||"");if(J({mode:"interval",runId:Dl,interval:e,marker:null}),V(!0),!Dl||!Cl)return;if(Dl!==Hl)_(Dl);F(Cl),N(yt()),ku(Dl,{silent:!0}),Vn(Dl,Cl)}async function _t(e){let Dl=String(e?.runId||Hl||""),Cl=String(e?.nodeId||"");if(J({mode:"event",runId:Dl,interval:null,marker:e}),V(!0),!Dl)return;if(Dl!==Hl)_(Dl);if(ku(Dl,{silent:!0}),!Cl)return;F(Cl),N(yt()),Vn(Dl,Cl)}async function At(e){if(!Hl||!A){N((lu)=>({...lu,error:"请先选择 run 和 node",message:""}));return}let Dl=e==="append"?"prompts":e,Cl=e==="append"?j.appendPrompt:e==="guide"?j.guidePrompt:e==="modify"?j.modifyPrompt:e==="approve"?j.approveReason:j.redoReason;if(!String(Cl||"").trim()){N((lu)=>({...lu,error:"操作内容不能为空",message:""}));return}N((lu)=>({...lu,actionLoading:e,error:"",message:""}));try{let lu=e==="redo"||e==="approve"?{reason:Cl,source:"unidesk-frontend",sourceKind:"webui"}:{prompt:Cl,source:"unidesk-frontend",sourceKind:"webui"},mu=await ii(_$(r,`/api/node-control/runs/${encodeURIComponent(Hl)}/nodes/${encodeURIComponent(A)}/${Dl}`),{method:"POST",body:JSON.stringify(lu)});if(N((yu)=>({...yu,actionLoading:"",details:mu,fetchedAt:new Date,appendPrompt:e==="append"?"":yu.appendPrompt,guidePrompt:e==="guide"?"":yu.guidePrompt,modifyPrompt:e==="modify"?"":yu.modifyPrompt,approveReason:e==="approve"?"":yu.approveReason,redoReason:e==="redo"?"":yu.redoReason,message:e==="append"?"已追加到运行中 node":e==="guide"?"已下发 guide,等待 runner 处理":e==="modify"?"已排队增量修改命令":e==="approve"?"已提交审核通过决策":"已排队重做命令"})),H("success",e==="append"?"已追加到运行中 node":e==="guide"?"已下发 guide,等待 runner 处理":e==="modify"?"已排队增量修改命令":e==="approve"?"已提交审核通过决策":"已排队重做命令"),await Rr(Hl,A),await ku(Hl,{silent:!0}),e!=="append")await K()}catch(lu){N((mu)=>({...mu,actionLoading:"",error:zl(lu,"node 控制操作失败")}))}}if(!f)return T(qf,{title:"Pipeline 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=pipeline"});return T("div",{className:"pipeline-page","data-testid":"pipeline-page"},T(Zn,{title:"Pipeline v2 工作台",eyebrow:"D601 Snapshot 用户服务",loading:n.loading,actions:T("div",{className:"panel-actions"},T("button",{type:"button",className:"ghost-btn",onClick:K,disabled:n.loading,"data-testid":"pipeline-refresh-button"},n.loading?"刷新中":"刷新"),T(cn,{title:"Pipeline 用户服务",data:f,onOpen:u,testId:"raw-pipeline-service"}))},T("div",{className:"pipeline-hero"},T("div",null,T("div",{className:"node-version-line"},T(_i,{status:X.providerStatus==="online"?"online":"warn"},X.providerStatus||"unknown"),T("span",null,f.providerId),T("span",null,o.public?"公网暴露":"仅 UniDesk frontend 代理访问")),T("p",{className:"muted paragraph"},f.description)),T("div",{className:"microservice-ref-card"},T("span",null,"Repo"),T("strong",null,I.url||"--"),T("code",null,I.commitId||"--")),T("div",{className:"microservice-ref-card"},T("span",null,"D601 Docker"),T("strong",null,`${o.nodeBindHost||"--"}:${o.nodePort||"--"}`),T("code",null,`${I.composeFile||"--"} / ${I.composeService||"--"}`))),T(el,{error:n.error,wide:!0})),T("div",{className:"pipeline-grid"},T(Zn,{title:"控制图",eyebrow:`${wl.id||"pipeline"} / run ${pl?.status||"--"}`,className:"pipeline-wide-panel",loading:n.loading,actions:T("div",{className:"pipeline-toolbar"},T("select",{value:El,disabled:ul.length===0,onChange:(e)=>{y(e.target.value),_(""),F(""),N(yt()),J(yi()),O(!1),V(!1)},"data-testid":"pipeline-select"},ul.map((e)=>T("option",{key:e.id,value:e.id},e.id||e.key))),T("select",{value:Hl,disabled:k.length===0,onChange:(e)=>{if(_(e.target.value),N(yt()),J(yi()),O(!1),V(!1),A)Rr(e.target.value,A)},"data-testid":"pipeline-run-select"},k.map((e)=>T("option",{key:e.runId,value:e.runId},RF(k,e)))),T("button",{type:"button",className:"ghost-btn",disabled:lr.nodes.length===0,onClick:()=>_G(lr,`${wl.id||"pipeline"}-${pl?.runId||"snapshot"}`),"data-testid":"pipeline-export-graph"},"导出渲染图"),T("button",{type:"button",className:"ghost-btn",disabled:tf.every((e)=>e.flow.nodes.length===0),onClick:()=>QX(tf),"data-testid":"pipeline-export-all-graphs"},"批量导出"))},M.length===0?T(qf,{title:"暂无控制图",text:"等待 D601 pipeline backend 返回 config.nodes / config.edges"}):T("div",{className:`pipeline-control-shell ${p?"detail-open":"detail-collapsed"}`,"data-testid":"pipeline-control-shell","data-sidebar-open":p?"true":"false"},T("div",{className:"pipeline-flow-frame","data-testid":"pipeline-react-flow"},T(TL,{nodes:lr.nodes,edges:lr.edges,nodeTypes:HY,edgeTypes:ZY,fitView:!0,fitViewOptions:{padding:0.18},nodesDraggable:!1,nodesConnectable:!1,elementsSelectable:!0,minZoom:0.25,maxZoom:1.4,proOptions:{hideAttribution:!0},onNodeClick:(e,Dl)=>{let Cl=String(Dl.id);if(F(Cl),N(yt()),O(!0),Hl)Rr(Hl,Cl)}},T(EL,{gap:22,size:1,color:"rgba(215, 161, 58, 0.24)"}),T(zL,{showInteractive:!1})),!p?T("button",{type:"button",className:"pipeline-sidecar-tab right",disabled:!A,onClick:()=>O(!0),"data-testid":"pipeline-node-sidebar-toggle"},A?"展开 node 控制":"点击 node 展开控制"):null),p?T(xX,{activeRun:pl,pipelineRuns:k,selectedRunId:c,onRunChange:(e)=>{if(_(e),N(yt()),J(yi()),A)Rr(e,A)},selectedNodeId:A,selectedNodeConfig:bl,selectedNodeRuntime:_u,control:j,onControlChange:(e)=>N((Dl)=>({...Dl,...e})),onFetch:()=>Rr(),onAction:At,onRaw:u,onCollapse:()=>O(!1)}):null),T("div",{className:"pipeline-flow-summary"},T("span",null,`${lr.nodes.length} nodes`),T("span",null,`${lr.edges.length} edges`),T("span",null,`${ul.length} pipelines`),T("span",null,`source config+components(${s.length})`),T("span",null,`run ${pl?.runId||"--"}`),T("span",null,`score ${sF(pl)}`),T("span",null,A?`selected ${A}`:"click node to control"))),T(RX,{epochs:k,activeRun:pl,activePipeline:wl,pipelineNodes:M,pipelineEdges:d,selection:G,detailOpen:Z,onDetailOpenChange:V,runDetails:Q,nodeDetails:hl,nodeDetailsState:yr,ganttScale:q,onGanttScaleChange:W,onIntervalSelect:ay,onMarkerSelect:_t,onRunChange:(e)=>{if(_(e),N(yt()),J(yi()),V(!1),A)Rr(e,A)},onRaw:u}),T(Zn,{title:"观测指标",eyebrow:n.refreshedAt?`Updated ${iu(n.refreshedAt)}`:"Snapshot",loading:n.loading},T("div",{className:"metric-grid"},T(sr,{label:"Health",value:n.health?.ok?"OK":"--",hint:n.health?.service||"D601 /health",tone:n.health?.ok?"ok":"warn"}),T(sr,{label:"组件",value:gl,hint:"components registry",tone:fl?.registry?.ok===!1?"warn":"ok"}),T(sr,{label:"Pipeline",value:ul.length,hint:`${M.length} nodes / ${d.length} edges`}),T(sr,{label:"运行记录",value:zr,hint:`${tu.succeeded||0} succeeded / ${tu.running||0} running`}),T(sr,{label:"OA 记录",value:Array.isArray(nl?.submissions)?nl.submissions.length:0,hint:nl?.runId||"latest run"}),T(sr,{label:"Procedure",value:Array.isArray(nl?.procedureRuns)?nl.procedureRuns.length:0,hint:nl?.status||"no run"}),T(sr,{label:"Score",value:sF(pl),hint:pl?.runId||"selected epoch",tone:dF(pl)})),T("div",{className:"panel-actions inline-actions"},T(cn,{title:"Pipeline Snapshot",data:fl,onOpen:u,testId:"raw-pipeline-snapshot"}))),T(Zn,{title:"评分器",eyebrow:pl?.runId||"selected epoch",loading:n.loading},T(rX,{run:pl,onRaw:u})),T(Zn,{title:"MiniMax 限额",eyebrow:"model/minimax-m27 quota",loading:n.loading},T(sX,{quota:h,onRaw:u})),T(Zn,{title:"OA 事件流",eyebrow:"100% event-driven diagnostics",className:"pipeline-wide-panel",loading:n.loading},T(MX,{diagnostics:yl,onRaw:u})),T(Zn,{title:"组件矩阵",eyebrow:`${Nu.length} classes`,loading:n.loading},Nu.length===0?T(qf,{title:"暂无组件",text:"等待 D601 pipeline backend 返回 registry.components"}):T("div",{className:"component-strata"},Nu.map((e)=>T("article",{key:e.name,className:"component-stratum"},T("span",null,e.name),T("strong",null,e.count)))),T("div",{className:"pipeline-component-list"},s.slice(0,12).map((e)=>T("span",{key:e.key,className:"data-chip"},T("b",null,e.componentClass||"--"),T("span",null,e.id||e.key||"--"))))),T(Zn,{title:"Epoch 列表",eyebrow:`${k.length}/${zr} preview`,loading:n.loading},k.length===0?T(qf,{title:"暂无运行记录",text:"当前 pipeline 在 .state/pipeline-runs 中还没有 epoch。"}):T("div",{className:"pipeline-run-list"},k.map((e)=>{let Dl=String(e?.runId||"")===Hl?pl:e;return T("article",{key:e.runId,className:`pipeline-run-card ${String(e.runId||"")===Hl?"active":""}`,role:"button",tabIndex:0,onClick:()=>{_(String(e.runId||"")),J(yi())},onKeyDown:(Cl)=>{if(Cl.key==="Enter"||Cl.key===" ")_(String(e.runId||"")),J(yi())}},T("div",{className:"node-card-head"},T("strong",null,RF(k,e)),T(_i,{status:e.status},e.status||"--")),T("div",{className:"docker-meta compact"},T("span",null,Dl?.pipelineId||"--"),T("span",null,`nodes ${Array.isArray(Dl?.nodes)?Dl.nodes.length:0}`),T("span",null,`oa ${Array.isArray(Dl?.submissions)?Dl.submissions.length:0}`),T("span",null,`procedures ${Array.isArray(Dl?.procedureRuns)?Dl.procedureRuns.length:0}`),T(uX,{run:Dl})),T("p",{className:"muted paragraph"},_8(Dl?.task)),T("span",{className:"pipeline-run-time"},Ll(Dl?.updatedAt)))}))),T(Zn,{title:"运行材料索引",eyebrow:pl?.runId||"selected epoch",className:"pipeline-wide-panel",loading:n.loading},T(hX,{activeRun:pl,onRaw:u}))))}var G8=Ml(Ju(),1);var Fl=G8.default.createElement,{useEffect:bX}=G8.default,q8=G8.default.useState,rj={id:"",sequenceNo:"",contractNo:"",name:"",currentStatus:"",pending:"",paymentStatus:"",notes:""};function vX({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return Fl("span",{className:`status-badge ${r}`},u||l||"unknown")}function L8({label:l,value:u,hint:r,tone:f}){return Fl("article",{className:`metric-card ${f||""}`},Fl("div",{className:"metric-label"},l),Fl("div",{className:"metric-value"},u),Fl("div",{className:"metric-hint"},r))}function fj({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return Fl("section",{className:`panel ${n||""}`},Fl("div",{className:"panel-head"},Fl("div",null,u?Fl("p",{className:"panel-eyebrow"},u):null,Fl(nu,{title:l,loading:t})),r?Fl("div",{className:"panel-actions"},r):null),Fl("div",{className:"panel-body"},f))}function qG({title:l,data:u,onOpen:r,testId:f}){return Fl("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function LG({title:l,text:u}){return Fl("div",{className:"empty-state"},Fl("strong",null,l),Fl("span",null,u))}function gX(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function kX(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function IX(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function by(l,u){return`${l}/microservices/project-manager/proxy${u}`}function aX(l){return{id:String(l.id||""),sequenceNo:l.sequenceNo===null||l.sequenceNo===void 0?"":String(l.sequenceNo),contractNo:String(l.contractNo||""),name:String(l.name||""),currentStatus:String(l.currentStatus||""),pending:String(l.pending||""),paymentStatus:String(l.paymentStatus||""),notes:String(l.notes||"")}}function oX(l){return{sequenceNo:l.sequenceNo===""?null:Number(l.sequenceNo),contractNo:String(l.contractNo||"").trim(),name:String(l.name||"").trim(),currentStatus:String(l.currentStatus||"").trim(),pending:String(l.pending||"").trim(),paymentStatus:String(l.paymentStatus||"").trim(),paymentRatio:String(l.paymentStatus||"").trim(),notes:String(l.notes||"").trim()}}function nj(l){return String(l||"item").replace(/[^A-Za-z0-9_-]+/g,"-")}function dX(l){let u=new Uint8Array(l),r="",f=32768;for(let n=0;nFl("tr",{key:n.id,className:u===n.id?"active-row":"","data-testid":`project-manager-row-${nj(n.id)}`},Fl("td",null,n.sequenceNo??"--"),Fl("td",null,Fl("strong",null,n.contractNo||"--"),Fl("code",null,n.id||"--")),Fl("td",null,Fl("strong",null,n.name||"--"),Fl("span",{className:"muted block"},n.sourceFile||"--")),Fl("td",null,n.currentStatus||"--"),Fl("td",null,Fl("span",{className:"preline"},n.pending||"--")),Fl("td",null,Fl(vX,{status:Number(n.paymentRatio||0)>=1?"online":"warn"},n.paymentStatus||"--")),Fl("td",null,n.notes||"--"),Fl("td",null,Fl("div",{className:"inline-actions"},Fl("button",{type:"button",className:"ghost-btn",onClick:()=>r(n),"data-testid":`project-manager-edit-${nj(n.id)}`},"编辑"),Fl(qG,{title:`Project ${n.contractNo||n.id}`,data:n,onOpen:f,testId:`raw-project-${nj(n.id)}`}))))))))}function GG({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((Z)=>Z.id==="project-manager")||null,[n,t]=q8({loading:!1,saving:!1,importing:!1,exporting:!1,error:"",notice:"",health:null,list:null,refreshedAt:null}),[i,y]=q8({...rj}),[c,_]=q8(""),[A,F]=q8("all"),{addNotification:j}=Xr();async function N(Z=c,V=A){if(!f)return;t((P)=>({...P,loading:!0,error:""}));try{let P=new URLSearchParams({pageSize:"200",status:V});if(Z.trim())P.set("q",Z.trim());let[H,B]=await Promise.all([Tl(`${r}/microservices/project-manager/health`),Tl(by(r,`/api/projects?${P.toString()}`))]);t((C)=>({...C,loading:!1,health:H,list:B,refreshedAt:new Date,error:""}))}catch(P){t((H)=>({...H,loading:!1,error:zl(P,"Project Manager 加载失败")}))}}bX(()=>{N()},[f?.id,f?.runtime?.providerStatus]);async function U(Z){Z.preventDefault(),t((V)=>({...V,saving:!0,error:"",notice:""}));try{let V=oX(i);if(i.id)await Tl(by(r,`/api/projects/${encodeURIComponent(i.id)}`),{method:"PUT",body:JSON.stringify(V)});else await Tl(by(r,"/api/projects"),{method:"POST",body:JSON.stringify(V)});let P=i.id?"项目已更新":"项目已创建";t((H)=>({...H,saving:!1,notice:P})),j("success",P),await N()}catch(V){t((P)=>({...P,saving:!1,error:zl(V,"保存项目失败")}))}}async function w(){if(!i.id)return;if(!window.confirm(`删除项目 ${i.contractNo||i.name||i.id} ?`))return;t((Z)=>({...Z,saving:!0,error:"",notice:""}));try{await Tl(by(r,`/api/projects/${encodeURIComponent(i.id)}`),{method:"DELETE"}),y({...rj});let Z="项目已删除";t((V)=>({...V,saving:!1,notice:Z})),j("success",Z),await N()}catch(Z){t((V)=>({...V,saving:!1,error:zl(Z,"删除项目失败")}))}}async function G(Z){let V=Z.target.files?.[0];if(!V)return;t((P)=>({...P,importing:!0,error:"",notice:""}));try{let P=dX(await V.arrayBuffer()),B=`Excel 已导入 ${(await Tl(by(r,"/api/import/excel"),{method:"POST",body:JSON.stringify({fileName:V.name,contentBase64:P,replace:!1})})).imported||0} 条项目`;t((C)=>({...C,importing:!1,notice:B})),j("success",B),Z.target.value="",await N()}catch(P){t((H)=>({...H,importing:!1,error:zl(P,"Excel 导入失败")}))}}async function J(){t((Z)=>({...Z,exporting:!0,error:""}));try{let Z=await KU(by(r,"/api/projects/export.xlsx")),V=URL.createObjectURL(Z),P=document.createElement("a");P.href=V,P.download=`project-manager-${f7()}.xlsx`,document.body.appendChild(P),P.click(),P.remove(),URL.revokeObjectURL(V),t((H)=>({...H,exporting:!1,notice:"Excel 已导出"}))}catch(Z){t((V)=>({...V,exporting:!1,error:zl(Z,"Excel 导出失败")}))}}if(!f)return Fl(LG,{title:"Project Manager 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=project-manager"});let Q=gX(f),m=IX(f),q=kX(f),W=Array.isArray(n.list?.projects)?n.list.projects:[],p=n.list?.summary||{},O=n.health||{};return Fl("div",{className:"project-manager-page","data-testid":"project-manager-page"},Fl(fj,{title:"项目管理工作台",eyebrow:"Main Server PostgreSQL 用户服务",loading:n.loading||n.exporting,actions:Fl("div",{className:"panel-actions"},Fl("button",{type:"button",className:"ghost-btn",disabled:n.loading,onClick:()=>N(),"data-testid":"project-manager-refresh-button"},n.loading?"刷新中":"刷新"),Fl("button",{type:"button",className:"ghost-btn",disabled:n.exporting,onClick:J,"data-testid":"project-manager-export-button"},n.exporting?"导出中":"导出 Excel"),Fl(qG,{title:"Project Manager 用户服务",data:f,onOpen:u,testId:"raw-project-manager-service"}))},Fl("div",{className:"project-manager-hero"},Fl(L8,{label:"项目总数",value:p.total??W.length,hint:`PG 表 ${O.storage?.table||"project_manager_projects"}`,tone:"ok"}),Fl(L8,{label:"进行中",value:p.active??"--",hint:"当前状态未完全完成"}),Fl(L8,{label:"已完成",value:p.completed??"--",hint:"按 完成 关键字统计",tone:"ok"}),Fl(L8,{label:"未全款",value:p.unpaid??"--",hint:"付款比例 < 1",tone:Number(p.unpaid||0)>0?"warn":"ok"})),Fl(el,{error:n.error}),n.notice?Fl("div",{className:"form-success"},n.notice):null),Fl("div",{className:"project-manager-hero"},Fl("div",{className:"microservice-ref-card"},Fl("span",null,"Repo"),Fl("strong",null,m.url||"--"),Fl("code",null,m.commitId||"--")),Fl("div",{className:"microservice-ref-card"},Fl("span",null,"Main Server Docker"),Fl("strong",null,`${q.nodeBindHost||"--"}:${q.nodePort||"--"}`),Fl("code",null,`${m.composeService||"--"} / ${m.containerName||"--"}`)),Fl("div",{className:"microservice-ref-card"},Fl("span",null,"Runtime"),Fl("strong",null,Q.providerName||f.providerId),Fl("code",null,`Health ${O.ok?"OK":"--"} / ${n.refreshedAt?iu(n.refreshedAt):"--"}`)),Fl("div",{className:"microservice-ref-card"},Fl("span",null,"Import Source"),Fl("strong",null,"D601 WeChat Excel"),Fl("code",null,"合作项目列表_I_20260309.xlsx"))),Fl("div",{className:"project-manager-layout"},Fl(fj,{title:"项目清单",eyebrow:"CRUD + Excel Export",loading:n.loading||n.importing||n.exporting,actions:Fl("div",{className:"inline-actions project-manager-filters"},Fl("input",{value:c,onChange:(Z)=>_(Z.target.value),placeholder:"搜索合同号 / 项目名称 / 状态","data-testid":"project-manager-search"}),Fl("select",{value:A,onChange:(Z)=>{F(Z.target.value),N(c,Z.target.value)},"data-testid":"project-manager-status-filter"},Fl("option",{value:"all"},"全部"),Fl("option",{value:"active"},"进行中"),Fl("option",{value:"completed"},"已完成"),Fl("option",{value:"unpaid"},"未全款")),Fl("button",{type:"button",className:"ghost-btn",onClick:()=>N(c,A)},"筛选"))},Fl(eX,{projects:W,activeId:i.id,onSelect:(Z)=>y(aX(Z)),onRaw:u})),Fl(fj,{title:i.id?"编辑项目":"新建项目",eyebrow:"PostgreSQL Write Path",loading:n.saving||n.importing},Fl("form",{className:"stack-form project-manager-form",onSubmit:U,"data-testid":"project-manager-form"},i.id?Fl("label",null,"项目 ID",Fl("input",{value:i.id,disabled:!0})):null,Fl("label",null,"序号",Fl("input",{type:"number",value:i.sequenceNo,onChange:(Z)=>y((V)=>({...V,sequenceNo:Z.target.value}))})),Fl("label",null,"合同号",Fl("input",{value:i.contractNo,onChange:(Z)=>y((V)=>({...V,contractNo:Z.target.value})),required:!0})),Fl("label",null,"项目名称",Fl("input",{value:i.name,onChange:(Z)=>y((V)=>({...V,name:Z.target.value})),required:!0})),Fl("label",null,"当前状况",Fl("textarea",{value:i.currentStatus,onChange:(Z)=>y((V)=>({...V,currentStatus:Z.target.value}))})),Fl("label",null,"待完成",Fl("textarea",{value:i.pending,onChange:(Z)=>y((V)=>({...V,pending:Z.target.value}))})),Fl("label",null,"付款情况",Fl("input",{value:i.paymentStatus,onChange:(Z)=>y((V)=>({...V,paymentStatus:Z.target.value})),placeholder:"例如 1 / 0.5 / 50%"})),Fl("label",null,"其它",Fl("input",{value:i.notes,onChange:(Z)=>y((V)=>({...V,notes:Z.target.value}))})),Fl("div",{className:"inline-actions"},Fl("button",{type:"submit",className:"primary-btn",disabled:n.saving,"data-testid":"project-manager-save-button"},n.saving?"保存中":i.id?"保存修改":"创建项目"),Fl("button",{type:"button",className:"ghost-btn",onClick:()=>y({...rj})},"清空"),i.id?Fl("button",{type:"button",className:"danger-btn",disabled:n.saving,onClick:w,"data-testid":"project-manager-delete-button"},"删除"):null)),Fl("div",{className:"project-manager-import"},Fl("p",{className:"muted paragraph"},"浏览器只访问 UniDesk frontend;后端通过同源用户服务代理写入主 PostgreSQL,不暴露 4233 公网端口。"),Fl("label",{className:"file-import"},n.importing?"导入中...":"导入 Excel",Fl("input",{type:"file",accept:".xlsx",onChange:G,disabled:n.importing,"data-testid":"project-manager-import-input"}))))))}var K8=Ml(Ju(),1);var Jl=K8.default.createElement,{useEffect:lP}=K8.default,rf=K8.default.useState;function uP({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return Jl("span",{className:`status-badge ${r}`},u||l||"unknown")}function W8({label:l,value:u,hint:r,tone:f}){return Jl("article",{className:`metric-card ${f||""}`},Jl("div",{className:"metric-label"},l),Jl("div",{className:"metric-value"},u),Jl("div",{className:"metric-hint"},r))}function tj({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return Jl("section",{className:`panel ${n||""}`},Jl("div",{className:"panel-head"},Jl("div",null,u?Jl("p",{className:"panel-eyebrow"},u):null,Jl(nu,{title:l,loading:t})),r?Jl("div",{className:"panel-actions"},r):null),Jl("div",{className:"panel-body"},f))}function WG({title:l,data:u,onOpen:r,testId:f}){return Jl("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function T8({title:l,text:u}){return Jl("div",{className:"empty-state"},Jl("strong",null,l),Jl("span",null,u))}function rP(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function fP(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function nP(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function KG(l){return String(l).replace(/[^a-zA-Z0-9_-]/g,"_")}function tP(l){if(!Number.isFinite(l))return"--";return`${l.toFixed(1)}%`}function vy(l,u){return`${l}/microservices/todo-note/proxy${u}`}function EG(l){return l.reduce((u,r)=>{let f=EG(Array.isArray(r.children)?r.children:[]),n=Boolean(r.completed);return{total:u.total+1+f.total,completed:u.completed+(n?1:0)+f.completed,active:u.active+(n?0:1)+f.active}},{total:0,completed:0,active:0})}function yj(l,u){let r=u==="all"||(u==="completed"?Boolean(l.completed):!l.completed),f=Array.isArray(l.children)?l.children:[];return r||f.some((n)=>yj(n,u))}function TG(l){return Array.isArray(l?.instances)?l.instances:[]}function ij(l,u){for(let r of l){if(r?.id===u)return Array.isArray(r.children)?r.children:[];let f=ij(Array.isArray(r?.children)?r.children:[],u);if(f.length>0)return f}return[]}function pG({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((g)=>g.id==="todo-note")||null,[n,t]=rf(null),[i,y]=rf(null),[c,_]=rf(""),[A,F]=rf(null),[j,N]=rf("all"),[U,w]=rf(13),[G,J]=rf(""),[Q,m]=rf(""),[q,W]=rf(""),[p,O]=rf(""),[Z,V]=rf(""),[P,H]=rf(!1),[B,C]=rf(""),[E,D]=rf(null),Y=TG(i),v=EG(Array.isArray(A?.todos)?A.todos:[]),K=f?rP(f):{},X=f?nP(f):{},I=f?fP(f):{};async function o(g=c){let[cl,pl]=await Promise.all([Tl(`${r}/microservices/todo-note/health`),Tl(vy(r,"/api/instances"))]);t(cl),y(pl);let Hl=TG(pl),bl=Hl.some((_u)=>_u.id===g)?g:Hl[0]?.id||"";return _(bl),bl}async function fl(g=c){if(!g){F(null);return}let cl=await Tl(vy(r,`/api/instances/${encodeURIComponent(g)}`));F(cl)}async function yl(g=c){if(!f)return;H(!0),C("");try{let cl=await o(g);await fl(cl),D(new Date)}catch(cl){C(zl(cl,"Todo Note 加载失败"))}finally{H(!1)}}async function h(g){if(!c)return null;C("");try{let cl=await Tl(vy(r,`/api/instances/${encodeURIComponent(c)}/actions`),{method:"POST",body:JSON.stringify({action:g})});return F(cl),await o(c),cl}catch(cl){return C(zl(cl,"Todo 操作失败")),null}}async function s(g){g.preventDefault();let cl=G.trim();if(!cl)return;H(!0),C("");try{let pl=await Tl(vy(r,"/api/instances"),{method:"POST",body:JSON.stringify({name:cl})});J(""),await yl(pl.id)}catch(pl){C(zl(pl,"创建清单失败"))}finally{H(!1)}}async function ul(g){if(!window.confirm("确认删除这个 Todo Note 清单?"))return;H(!0),C("");try{await Tl(vy(r,`/api/instances/${encodeURIComponent(g)}`),{method:"DELETE"}),await yl(c===g?"":c)}catch(cl){C(zl(cl,"删除清单失败"))}finally{H(!1)}}async function tl(g){g.preventDefault();let cl=Q.trim();if(!cl)return;m(""),await h({type:"addTodo",title:cl})}async function Al(g){if(!c)return;C("");try{let cl=await Tl(vy(r,`/api/instances/${encodeURIComponent(c)}/${g}`),{method:"POST",body:JSON.stringify({})});F(cl),await o(c)}catch(cl){C(zl(cl,`${g} 失败`))}}function Kl(g){W(g.id),O(String(g.title||""))}async function wl(g){let cl=p.trim();if(W(""),O(""),cl)await h({type:"updateTodoTitle",todoId:g,title:cl})}async function El(g){let pl=window.prompt("新增子任务标题")?.trim();if(!pl)return;let Hl=ij(Array.isArray(A?.todos)?A.todos:[],g),bl=new Set(Hl.map((gl)=>gl.id)),_u=await h({type:"addTodo",title:pl,parentId:g,targetIndex:0});if(!_u)return;let tu=ij(Array.isArray(_u?.todos)?_u.todos:[],g),Nu=tu.find((gl)=>!bl.has(gl.id));if(Nu&&tu[0]?.id!==Nu.id)await h({type:"moveTodo",todoId:Nu.id,targetParentId:g,targetIndex:0})}async function M(g,cl){if(!Z)return;let pl={type:"moveTodo",todoId:Z,targetIndex:cl};if(g)pl.targetParentId=g;V(""),await h(pl)}if(lP(()=>{yl()},[f?.id,f?.runtime?.providerStatus]),!f)return Jl(T8,{title:"Todo Note 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=todo-note"});let d=Y.find((g)=>g.id===c)||null,nl=Array.isArray(A?.todos)?A.todos:[],k=nl.map((g,cl)=>({todo:g,index:cl})).filter((g)=>yj(g.todo,j));return Jl("div",{className:"todo-note-page","data-testid":"todo-note-page"},Jl(tj,{title:"Todo Note 工作台",eyebrow:"Main Server 用户服务",loading:P,actions:Jl("div",{className:"panel-actions"},Jl("button",{type:"button",className:"ghost-btn",disabled:P,onClick:()=>yl(c),"data-testid":"todo-note-refresh-button"},P?"刷新中":"刷新"),Jl(WG,{title:"Todo Note 用户服务",data:f,onOpen:u,testId:"raw-todo-note-service"}))},Jl("div",{className:"todo-note-hero"},Jl("div",null,Jl("div",{className:"node-version-line"},Jl(uP,{status:K.providerStatus==="online"?"online":"warn"},K.providerStatus||"unknown"),Jl("span",null,f.providerId),Jl("span",null,I.public?"公网暴露":"仅 UniDesk frontend 代理访问"),Jl("span",null,n?.ok?"Health OK":"Health --")),Jl("p",{className:"muted paragraph"},f.description)),Jl("div",{className:"microservice-ref-card"},Jl("span",null,"Repo"),Jl("strong",null,X.url||"--"),Jl("code",null,X.commitId||"--")),Jl("div",{className:"microservice-ref-card"},Jl("span",null,"Main Server Docker"),Jl("strong",null,`${I.nodeBindHost||"--"}:${I.nodePort||"--"}`),Jl("code",null,`${X.composeService||"--"} / ${X.containerName||"--"}`))),Jl(el,{error:B,wide:!0})),Jl("div",{className:"todo-note-layout"},Jl(tj,{title:"清单",eyebrow:`${Y.length} Instances`,className:"todo-list-panel",loading:P},Jl("form",{className:"todo-create-list",onSubmit:s},Jl("input",{placeholder:"新清单名称",value:G,onChange:(g)=>J(g.target.value),"aria-label":"新清单名称"}),Jl("button",{type:"submit",className:"ghost-btn",disabled:P||!G.trim()},"创建")),Y.length===0?Jl(T8,{title:"暂无清单",text:"迁移或创建清单后会出现在这里"}):Jl("div",{className:"todo-instance-list"},Y.map((g)=>Jl("button",{key:g.id,type:"button",className:`todo-instance-row ${c===g.id?"active":""}`,onClick:()=>{_(g.id),fl(g.id)},"data-testid":`todo-instance-${KG(g.id)}`},Jl("strong",null,g.name),Jl("span",null,`${g.completedCount??0}/${g.todoCount??0} 完成`),Jl("code",null,g.id))))),Jl("div",{className:"todo-main-stack"},Jl(tj,{title:d?.name||"待选择清单",eyebrow:E?`Updated ${iu(E)}`:"Todo Tree",loading:P,actions:A?Jl("div",{className:"panel-actions"},Jl("button",{type:"button",className:"ghost-btn",onClick:()=>h({type:"renameInstance",name:window.prompt("清单新名称",A.name)||A.name})},"重命名"),Jl("button",{type:"button",className:"ghost-btn danger",onClick:()=>ul(c)},"删除清单"),Jl(WG,{title:`Todo Instance ${c}`,data:A,onOpen:u,testId:"raw-todo-instance"})):null},!A?Jl(T8,{title:"未选择清单",text:"左侧选择一个 Todo Note 清单"}):Jl("div",{className:"todo-workbench",style:{"--todo-font-size":`${U}px`}},Jl("div",{className:"todo-toolbar"},Jl("form",{className:"todo-add-form",onSubmit:tl},Jl("input",{placeholder:"新增根任务",value:Q,onChange:(g)=>m(g.target.value),"aria-label":"新增根任务"}),Jl("button",{type:"submit",className:"ghost-btn",disabled:!Q.trim()},"新增")),Jl("div",{className:"todo-filter-strip"},["all","active","completed"].map((g)=>Jl("button",{key:g,type:"button",className:`todo-filter ${j===g?"active":""}`,onClick:()=>N(g)},g==="all"?"全部":g==="active"?"未完成":"已完成"))),Jl("div",{className:"todo-toolbar-actions"},Jl("button",{type:"button",className:"ghost-btn",onClick:()=>h({type:"setAllTodosExpanded",expanded:!0})},"全部展开"),Jl("button",{type:"button",className:"ghost-btn",onClick:()=>h({type:"setAllTodosExpanded",expanded:!1})},"全部收起"),Jl("button",{type:"button",className:"ghost-btn",onClick:()=>Al("undo")},"撤销"),Jl("button",{type:"button",className:"ghost-btn",onClick:()=>Al("redo")},"重做"),Jl("label",{className:"todo-font-control"},"字号",Jl("input",{type:"range",min:11,max:18,value:U,onChange:(g)=>w(Number(g.target.value))})))),Jl("div",{className:"todo-stats-grid"},Jl(W8,{label:"总任务",value:v.total,hint:`${Y.length} lists`}),Jl(W8,{label:"已完成",value:v.completed,hint:`${tP(v.total?v.completed/v.total*100:0)}`,tone:"ok"}),Jl(W8,{label:"未完成",value:v.active,hint:j==="active"?"当前筛选":"active tasks",tone:v.active>0?"warn":"ok"}),Jl(W8,{label:"历史指针",value:A.historyPointer??0,hint:"undo / redo"})),Jl("div",{className:"todo-root-drop",onDragOver:(g)=>g.preventDefault(),onDrop:(g)=>{g.preventDefault(),M(null,nl.length)}},"拖到这里可移为根任务末尾"),Jl("div",{className:"todo-tree","data-testid":"todo-note-tree"},k.length===0?Jl(T8,{title:"没有匹配任务",text:"调整筛选或新增任务"}):k.map(({todo:g,index:cl})=>Jl(zG,{key:g.id,todo:g,depth:0,parentId:null,index:cl,siblingCount:nl.length,filter:j,editingId:q,editingTitle:p,setEditingTitle:O,beginEdit:Kl,saveEdit:wl,applyTodoAction:h,addChild:El,dragTodoId:Z,setDragTodoId:V,dropTodo:M}))))))))}function zG(l){let{todo:u,depth:r,parentId:f,index:n,siblingCount:t,filter:i,editingId:y,editingTitle:c,setEditingTitle:_,beginEdit:A,saveEdit:F,applyTodoAction:j,addChild:N,dragTodoId:U,setDragTodoId:w,dropTodo:G}=l,J=Array.isArray(u.children)?u.children:[],Q=J.map((W,p)=>({child:W,childIndex:p})).filter((W)=>yj(W.child,i)),m=y===u.id,q=f||null;return Jl("div",{className:"todo-row-wrap"},Jl("article",{className:`todo-row ${u.completed?"completed":""} ${U===u.id?"dragging":""}`,style:{"--todo-depth":r},draggable:!0,onDragStart:(W)=>{w(u.id),W.dataTransfer.effectAllowed="move"},onDragOver:(W)=>W.preventDefault(),onDrop:(W)=>{W.preventDefault(),G(u.id,J.length)},"data-testid":`todo-row-${KG(u.id)}`},Jl("button",{type:"button",className:"todo-expand",disabled:J.length===0,onClick:()=>j({type:"toggleTodoExpanded",todoId:u.id})},J.length===0?"·":u.expanded?"▾":"▸"),Jl("input",{type:"checkbox",checked:Boolean(u.completed),onChange:()=>j({type:"toggleTodoCompleted",todoId:u.id}),"aria-label":`完成 ${u.title}`}),Jl("div",{className:"todo-title-cell",onDoubleClick:()=>A(u)},m?Jl("div",{className:"todo-edit-inline"},Jl("input",{value:c,autoFocus:!0,onChange:(W)=>_(W.target.value),onKeyDown:(W)=>{if(W.key==="Enter")F(u.id);if(W.key==="Escape")A({id:"",title:""})}}),Jl("button",{type:"button",className:"ghost-btn",onClick:()=>F(u.id)},"保存")):Jl("strong",null,u.title||"Untitled"),Jl("div",{className:"todo-meta-line"},Jl("span",null,`子项 ${J.length}`),Jl("span",null,`更新 ${Ll(u.updatedAt)}`),u.reminderAt?Jl("span",{className:"todo-reminder"},`提醒 ${Ll(u.reminderAt)}`):Jl("span",null,"无提醒"))),Jl("input",{className:"todo-reminder-input",type:"datetime-local",value:l6(u.reminderAt),onChange:(W)=>j({type:"setTodoReminder",todoId:u.id,reminderAt:n7(W.target.value)})}),Jl("div",{className:"todo-row-actions"},Jl("button",{type:"button",className:"ghost-btn",onClick:()=>A(u)},"编辑"),Jl("button",{type:"button",className:"ghost-btn",onClick:()=>N(u.id)},"子项"),Jl("button",{type:"button",className:"ghost-btn",disabled:n<=0,onClick:()=>j({type:"moveTodo",todoId:u.id,...q?{targetParentId:q}:{},targetIndex:n-1})},"上移"),Jl("button",{type:"button",className:"ghost-btn",disabled:n<=0,onClick:()=>j({type:"moveTodo",todoId:u.id,...q?{targetParentId:q}:{},targetIndex:0})},"置顶"),Jl("button",{type:"button",className:"ghost-btn",disabled:n>=t-1,onClick:()=>j({type:"moveTodo",todoId:u.id,...q?{targetParentId:q}:{},targetIndex:n+1})},"下移"),Jl("button",{type:"button",className:"ghost-btn",disabled:!f,onClick:()=>j({type:"moveTodo",todoId:u.id,targetIndex:9999})},"提升"),Jl("button",{type:"button",className:"ghost-btn danger",onClick:()=>j({type:"deleteTodo",todoId:u.id})},"删除"))),u.expanded&&Q.length>0?Jl("div",{className:"todo-children"},Q.map(({child:W,childIndex:p})=>Jl(zG,{key:W.id,todo:W,depth:r+1,parentId:u.id,index:p,siblingCount:J.length,filter:i,editingId:y,editingTitle:c,setEditingTitle:_,beginEdit:A,saveEdit:F,applyTodoAction:j,addChild:N,dragTodoId:U,setDragTodoId:w,dropTodo:G}))):null)}var OG=Ml(Ju(),1),Fi=OG.default.createElement;function ZG({title:l,items:u,actions:r,className:f,testId:n}){let t=Array.isArray(u)?u:[];return Fi("section",{className:`top-status-bar ${f||""}`,"data-testid":n},Fi("div",{className:"top-status-main"},l?Fi("strong",{className:"top-status-title"},l):null,Fi("div",{className:"top-status-chips"},t.map((i,y)=>Fi("span",{key:i?.key||`${i?.label||"status"}-${y}`,className:`top-status-chip ${i?.tone||""}`,"data-testid":i?.testId},i?.label?Fi("b",null,i.label):null,Fi("span",null,i?.value??"--"))))),r?Fi("div",{className:"top-status-actions"},r):null)}var w$=Ml(Ju(),1);var ql=w$.default.createElement,{useEffect:iP,useMemo:yP}=w$.default,cP=w$.default.useState;function HG({status:l,children:u,title:r}){let f=String(l||"unknown").toLowerCase();return ql("span",{className:`status-badge ${f}`,title:r},u||l||"unknown")}function E8({label:l,value:u,hint:r,tone:f}){return ql("article",{className:`metric-card ${f||""}`},ql("div",{className:"metric-label"},l),ql("div",{className:"metric-value"},u),ql("div",{className:"metric-hint"},r))}function cj({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return ql("section",{className:`panel ${n||""}`},ql("div",{className:"panel-head"},ql("div",null,u?ql("p",{className:"panel-eyebrow"},u):null,ql(nu,{title:l,loading:t})),r?ql("div",{className:"panel-actions"},r):null),ql("div",{className:"panel-body"},f))}function BG({title:l,data:u,onOpen:r,testId:f}){return ql("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r?.(l,u)},"查看原始JSON")}function $j({title:l,text:u}){return ql("div",{className:"empty-state"},ql("strong",null,l),ql("span",null,u))}function gy(l){return Array.isArray(l)?l:[]}function _j(l){return l&&typeof l==="object"&&!Array.isArray(l)?l:{}}function $P(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function _P(l,u){return`${l}/microservices/k3sctl-adapter/proxy${u}`}function AP(l){return l.find((u)=>String(u?.id||"")==="k3sctl-adapter")||null}function FP(l){if(l?.healthy===!0)return"online";if(String(l?.role||"")==="standby")return"warn";return"failed"}function jP(l){return l?.healthy===!0?"online":"failed"}function NP(l){if(l===!0)return"YES";if(l===!1)return"NO";return"--"}function JP(l){return Array.from(new Set(l.flatMap((u)=>gy(u?.expectedNodeIds).map((r)=>String(r))))).filter(Boolean).sort()}function UP(l){let u=l.find((r)=>r?.id==="code-queue")||l[0];return String(u?.activeInstanceId||"--")}function QP(l){return ql("article",{key:l?.id||l?.nodeId,className:"k3s-instance-card"},ql("div",{className:"node-card-head"},ql("strong",null,l?.nodeId||l?.id||"--"),ql(HG,{status:FP(l)},l?.healthy?"HEALTHY":"DEGRADED")),ql("div",{className:"k3s-instance-role"},ql("span",null,String(l?.role||"worker").toUpperCase()),ql("code",null,l?.id||"--")),ql("dl",{className:"k3s-kv"},ql("dt",null,"Base URL"),ql("dd",null,ql("code",null,l?.baseUrl||"--")),ql("dt",null,"Proxy"),ql("dd",null,l?.proxyMode||"--"),ql("dt",null,"Health"),ql("dd",null,`${l?.upstreamStatus??"--"} / ${l?.status||"unknown"}`),ql("dt",null,"Checked"),ql("dd",null,Ll(l?.checkedAt))))}function mP(l,u){let r=gy(l?.instances),f=_j(l?.active);return ql(cj,{key:l?.id||"service",title:l?.id||"managed-service",eyebrow:`${l?.namespace||"unidesk"} / k3s managed service`,className:"k3s-service-panel",actions:ql(BG,{title:`k3s service ${l?.id||""}`,data:l,onOpen:u,testId:`raw-k3s-service-${l?.id||"unknown"}`})},ql("div",{className:"k3s-service-summary"},ql("div",null,ql("span",null,"状态"),ql(HG,{status:jP(l)},l?.status||"unknown")),ql("div",null,ql("span",null,"Active"),ql("strong",null,l?.activeInstanceId||"--")),ql("div",null,ql("span",null,"Single Writer"),ql("strong",null,NP(l?.singleWriter))),ql("div",null,ql("span",null,"Active Health"),ql("strong",null,f?.upstreamStatus??"--"))),r.length===0?ql($j,{title:"暂无 k3s 实例",text:"adapter 没有返回该服务的 endpoint 列表"}):ql("div",{className:"k3s-instance-grid"},r.map(QP)))}function DG({microservices:l,onRaw:u,apiBaseUrl:r,onNavigate:f}){let n=AP(Array.isArray(l)?l:[]),t=$P(n),[i,y]=cP({loading:!1,error:"",data:null,refreshedAt:null});async function c(){y((Q)=>({...Q,loading:!0,error:""}));try{let Q=await Tl(_P(r,"/api/control-plane"));y({loading:!1,error:"",data:Q,refreshedAt:new Date})}catch(Q){y((m)=>({...m,loading:!1,error:zl(Q,"加载 k3s 控制平面失败")}))}}iP(()=>{c()},[r]);let _=yP(()=>gy(i.data?.services),[i.data]),A=JP(_),F=_.filter((Q)=>Q?.healthy===!0).length,j=_.reduce((Q,m)=>Q+gy(m?.instances).length,0),N=_.reduce((Q,m)=>Q+gy(m?.instances).filter((q)=>q?.healthy===!0).length,0),U=UP(_),w=_j(i.data?.kubectl),G=_j(i.data?.kubeApiProxy),J=gy(i.data?.manifestPaths).map((Q)=>String(Q));if(!n)return ql($j,{title:"k3sctl-adapter 未登记",text:"请在 config.json 的 microservices 中登记 id=k3sctl-adapter,并通过该微服务连接 k3s 控制平面。"});return ql("div",{className:"k3s-page","data-testid":"k3sctl-page"},ql(cj,{title:"k3s Control Plane",eyebrow:"Managed by k3sctl-adapter",className:"k3s-hero-panel",loading:i.loading,actions:ql(w$.default.Fragment,null,ql("button",{type:"button",className:"ghost-btn",onClick:c,disabled:i.loading,"data-testid":"k3s-refresh-button"},i.loading?"刷新中":"刷新"),f?ql("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","code-queue"),"data-testid":"k3s-open-code-queue"},"打开 Code Queue"):null,ql(BG,{title:"k3sctl-adapter microservice",data:n,onOpen:u,testId:"raw-k3s-adapter"}))},ql("div",{className:"k3s-hero"},ql("div",{className:"k3s-orb","aria-hidden":"true"},ql("span",null,"k3s")),ql("div",{className:"k3s-hero-copy"},ql("p",{className:"eyebrow"},"D601 native control plane"),ql("h2",null,"UniDesk 只管理 adapter;业务微服务交给 k3s 标准服务路由"),ql("p",{className:"muted paragraph"},"Code Queue 的前端/API 请求进入 k3sctl-adapter,再由 adapter 转发到 k3s active service。provider-gateway 只用于维护 adapter 和节点诊断,不再直接管理 Code Queue 容器。"),ql("div",{className:"k3s-route-strip"},ql("span",null,"NO FALLBACK"),ql("code",null,i.data?.runtimePath||"frontend -> backend-core -> k3sctl-adapter")))),ql("div",{className:"metric-grid"},ql(E8,{label:"控制面",value:i.data?.clusterId||"D601",hint:`adapter ${t.providerStatus||"unknown"}`,tone:t.providerStatus==="online"?"ok":"warn"}),ql(E8,{label:"代管服务",value:_.length,hint:`${F}/${_.length||0} healthy`,tone:F===_.length&&_.length>0?"ok":"warn"}),ql(E8,{label:"节点",value:A.join(" / ")||"--",hint:"expected k3s nodes"}),ql(E8,{label:"实例",value:`${N}/${j}`,hint:`active ${U}`,tone:N===j&&j>0?"ok":"warn"})),ql("div",{className:"k3s-control-plane-grid"},ql("article",{className:"k3s-control-plane-card"},ql("span",null,"service proxy"),ql("strong",null,G.configured===!0?"K8S API PROXY":"PROXY DEGRADED"),ql("p",null,G.configured===!0?`${G.mode||"kubernetes-api-service-proxy"} via ${G.connectHost||"--"}`:"adapter 必须通过 k8s API service proxy 访问业务服务,不回退到业务容器直连。")),ql("article",{className:"k3s-control-plane-card"},ql("span",null,"manifests"),ql("strong",null,J.length||"--"),ql("p",null,J.join(" / ")||"未配置 manifest")),ql("article",{className:"k3s-control-plane-card"},ql("span",null,"cluster snapshot"),ql("strong",null,w.enabled===!0?w.ok===!0?"KUBECTL OK":"KUBECTL DEGRADED":"API ONLY"),ql("p",null,w.enabled===!0?`nodes ${w.nodeCount??"--"}`:"控制面页面以 adapter 返回的 k8s service proxy 状态为准;kubectl 只作为可选快照。"))),i.error?ql(el,{error:i.error}):null,i.refreshedAt?ql("p",{className:"muted paragraph"},`最近刷新 ${iu(i.refreshedAt)}`):null),_.length===0?ql(cj,{title:"代管服务",eyebrow:"k3s services",loading:i.loading},ql($j,{title:"暂无 k3s 服务",text:"等待 k3sctl-adapter 返回 /api/services;Code Queue 应显示 D601 scheduler/read/write 服务实例。"})):_.map((Q)=>mP(Q,u)))}var q$=Ml(Ju(),1);var du=q$.default.createElement;function VG({onClose:l}){let{notifications:u,removeNotification:r,clearNotifications:f}=Xr(),n=q$.default.useRef(null);if(q$.default.useEffect(()=>{let t=(i)=>{if(n.current&&!n.current.contains(i.target))l()};return document.addEventListener("mousedown",t),()=>document.removeEventListener("mousedown",t)},[l]),u.length===0)return du("div",{className:"notification-popup",ref:n},du("div",{className:"notification-popup-header"},du("span",null,"通知"),du("button",{className:"notification-popup-close",onClick:l},"×")),du("div",{className:"notification-popup-empty"},"暂无通知"));return du("div",{className:"notification-popup",ref:n},du("div",{className:"notification-popup-header"},du("span",null,`通知 (${u.length})`),du("div",{className:"notification-popup-actions"},du("button",{className:"notification-popup-clear",onClick:f},"清空"),du("button",{className:"notification-popup-close",onClick:l},"×"))),du("div",{className:"notification-popup-list"},u.slice().reverse().map((t)=>du("div",{key:t.id,className:`notification-item ${t.type}`},du("span",{className:"notification-item-icon"},t.type==="success"?"✓":"×"),du("span",{className:"notification-item-message"},t.message),du("button",{className:"notification-item-dismiss",onClick:()=>r(t.id)},"×")))))}function SG({notification:l}){let{removeNotification:u}=Xr();return q$.default.useEffect(()=>{let r=setTimeout(()=>{u(l.id)},3000);return()=>clearTimeout(r)},[l.id,u]),du("div",{className:`notification-banner ${l.type}`,role:"alert"},du("span",{className:"notification-banner-icon"},l.type==="success"?"✓":"×"),du("span",{className:"notification-banner-message"},l.message),du("button",{className:"notification-banner-dismiss",onClick:()=>u(l.id)},"×"))}function kG(l,u){let r=document.getElementById("root")?.getAttribute(l);if(!r)return u;try{let f=JSON.parse(r);return typeof f==="object"&&f!==null&&!Array.isArray(f)?f:u}catch{return u}}var vl=kG("data-config",{apiBaseUrl:"/api",authUsername:"admin"}),YG=vl.environment&&typeof vl.environment==="object"?vl.environment:{},wP=kG("data-codex-overview",null),$=Ni.default.createElement,{useEffect:Bn,useMemo:W$}=Ni.default,Il=Ni.default.useState,Nj=Ni.default.createContext(!1),Cf=zm(d3),qP={id:"code-queue",name:"Code Queue",providerId:"D601",description:"Code Queue",repository:{containerName:"k3s:code-queue"},backend:{nodeBaseUrl:"k3s://code-queue",nodeBindHost:"k3s://unidesk/code-queue",nodePort:4222,proxyMode:"k3sctl-adapter-http",public:!1},deployment:{mode:"k3sctl-managed",adapterServiceId:"k3sctl-adapter",k3sServiceId:"code-queue"},runtime:{orchestrator:"k3sctl",providerStatus:"loading",providerName:"D601"}};function XG(){return typeof document>"u"||document.visibilityState!=="hidden"}function IG(l){return l?.environment==="dev"||l?.namespace==="unidesk-dev"}function LP(l){let u=typeof l==="string"?l:"";return u.length>=7?u.slice(0,7):u||"unknown"}function GP(l,u){if(l==="ops"&&u==="status")return 5000;if(l==="nodes"&&u==="monitor")return 5000;if(l==="tasks"&&(u==="dispatch"||u==="scheduled"||u==="pending"))return 5000;if(l==="nodes"||l==="ops")return 1e4;if(l==="apps")return 15000;if(l==="tasks")return 15000;return 30000}async function WP(l){if(!l?._summaryOnly||!l?.id)return l;return(await Tl(`${vl.apiBaseUrl}/tasks/${encodeURIComponent(String(l.id))}`))?.task||l}function T$(l){return l?._summaryOnly?{...l,_loadRaw:()=>WP(l)}:l}function ct(l){if(!Number.isFinite(l))return"--";let u=Math.max(0,l);if(u===0)return"0s";if(u<0.01)return"<0.01s";if(u<0.1)return`${u.toFixed(2)}s`;if(u<1)return`${u.toFixed(1)}s`;if(u<10&&!Number.isInteger(u))return`${u.toFixed(1)}s`;if(u<60)return`${Math.round(u)}s`;let r=Math.floor(u);if(r<3600)return`${Math.floor(r/60)}m ${r%60}s`;return`${Math.floor(r/3600)}h ${Math.floor(r%3600/60)}m`}function Lf(l){let u=Number(l);if(!Number.isFinite(u))return"--";if(u<1)return`${Math.max(0,u).toFixed(1)}ms`;if(u<10)return`${u.toFixed(1)}ms`;if(u<1000)return`${Math.round(u)}ms`;return ct(u/1000)}function Qr(l){let u=Number(l);if(!Number.isFinite(u)||u<=0)return"--";let r=["B","KB","MB","GB","TB"],f=u,n=0;while(f>=1024&&n0)return r[f]}return"任务失败但 provider 未返回明确原因"}function _0(l){if(l===null||l===void 0)return"--";if(typeof l==="boolean")return l?"是":"否";if(typeof l==="number")return String(l);if(typeof l==="string")return l.length>80?`${l.slice(0,77)}...`:l;if(Array.isArray(l))return`${l.length} 项`;if(typeof l==="object")return`${Object.keys(l).length} 字段`;return String(l)}function KP(l,u){let r=l.replace(/[-_\s]/g,"").toLowerCase(),f=r==="ts"||r.endsWith("at")||r.endsWith("timestamp")||r.endsWith("heartbeat");if((typeof u==="string"||typeof u==="number")&&f){let n=Ll(u);if(n!=="--")return n}if(l==="bodyText"&&typeof u==="string")return`${/^\s*[{[]/.test(u)?"JSON":"HTTP"} body ${u.length} chars`;return _0(u)}function dG(l){if(!l||typeof l!=="object"||Array.isArray(l))return[];return Object.entries(l)}function ff(l){return String(l).replace(/[^a-zA-Z0-9_-]/g,"_")}function Uj(l,u){return l&&typeof l==="object"&&!Array.isArray(l)?l[u]:void 0}function z8(l,u,r="未知"){let f=Uj(l?.labels,u);return typeof f==="string"&&f.length>0?f:r}function eG(l){return z8(l,"providerGatewayVersion")}function G$(l){return z8(l,"providerGatewayUpgradePolicy")}function PG(l){return z8(l,"providerGatewayStartedAt","")}function lW(l){let u=Uj(l?.labels,"unideskCapabilities");if(typeof u==="string")return u.split(",").map((r)=>r.trim()).filter(Boolean);return Array.isArray(u)?u.filter((r)=>typeof r==="string"):[]}function uW(l,u){return lW(l).includes(u)}function CG(l,u){let r=Uj(l?.labels,u);return r===!0||r==="true"||r==="1"}function EP(l){if(!uW(l,"host.ssh"))return{tone:"fail",label:"不可用",detail:"未声明 host.ssh"};if(!CG(l,"hostSshConfigured"))return{tone:"warn",label:"未配置",detail:"缺少 SSH 环境变量"};if(!CG(l,"hostSshKeyPresent"))return{tone:"warn",label:"缺 key",detail:"私钥未挂载"};return{tone:"ok",label:"可用",detail:z8(l,"hostSshTarget","host.ssh ready")}}function pP(l){if(!uW(l,"provider.upgrade"))return{tone:"fail",label:"不可用",detail:"未声明 provider.upgrade"};let u=G$(l);if(u!=="always-enabled")return{tone:"warn",label:"待确认",detail:`策略 ${u}`};return{tone:"ok",label:"可用",detail:"always-enabled"}}function Qj(l){let u=typeof l==="string"&&l.length>0?l:"未知";if(u==="未知")return"版本未知";return u.startsWith("v")?u:`v${u}`}function rW(l){return l?.payload&&typeof l.payload==="object"&&!Array.isArray(l.payload)?l.payload:{}}function O8(l){return l?.result&&typeof l.result==="object"&&!Array.isArray(l.result)?l.result:{}}function p8(l){let u=rW(l),r=O8(l);return(u.mode??r.mode)==="schedule"?"schedule":"plan"}function zP(l){let u=rW(l).source;return typeof u==="string"&&u.length>0?u:"unknown"}function OP(l){let u=O8(l),r=u.plan&&typeof u.plan==="object"&&!Array.isArray(u.plan)?u.plan:{},f=u.policy??r.policy;return typeof f==="string"&&f.length>0?f:"--"}function fW(l){let u=O8(l),r=u.plan&&typeof u.plan==="object"&&!Array.isArray(u.plan)?u.plan:{},f=u.targetProviderGatewayVersion??u.providerGatewayVersion??r.targetProviderGatewayVersion??r.providerGatewayVersion;return typeof f==="string"&&f.length>0?Qj(f):"版本未知"}function nW(l){if(String(l?.status||"").toLowerCase()==="failed")return oG(l);if(Iy(l))return"等待 provider 回传升级终态";let r=O8(l);if(typeof r.updaterContainerId==="string"&&r.updaterContainerId.length>0)return`updater ${r.updaterContainerId.slice(0,18)}`;if(typeof r.message==="string"&&r.message.length>0)return r.message;if(r.plan)return"升级计划已生成";return"无升级结果摘要"}function tW(l,u){return l.filter((r)=>r?.providerId===u&&r?.command==="provider.upgrade").sort((r,f)=>(Dn(f.updatedAt)??0)-(Dn(r.updatedAt)??0))}function ZP(l){return l.find((u)=>p8(u)==="schedule")||l[0]||null}function iW(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function hG(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function HP(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function Wu({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return $("span",{className:`status-badge ${r}`},u||l||"unknown")}function Qu({label:l,value:u,hint:r,tone:f,onClick:n,testId:t}){let i=typeof n==="function";return $("article",{className:`metric-card ${f||""} ${i?"clickable":""}`,role:i?"button":void 0,tabIndex:i?0:void 0,"data-testid":t,onClick:n,onKeyDown:i?(y)=>{if(y.key==="Enter"||y.key===" ")y.preventDefault(),n()}:void 0},$("div",{className:"metric-label"},l),$("div",{className:"metric-value"},u),$("div",{className:"metric-hint"},r))}function ru({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){let i=Ni.default.useContext(Nj),y=Boolean(t)||i;return $("section",{className:`panel ${n||""}`},$("div",{className:"panel-head"},$("div",null,u?$("p",{className:"panel-eyebrow"},u):null,$(nu,{title:l,loading:y})),r?$("div",{className:"panel-actions"},r):null),$("div",{className:"panel-body"},f))}function eu({title:l,data:u,onOpen:r,testId:f}){let[n,t]=Il(!1),i=u&&typeof u==="object"&&typeof u._loadRaw==="function"?u._loadRaw:null;async function y(){if(!i){r(l,u);return}t(!0);try{r(l,await i())}catch(c){r(l,{ok:!1,error:zl(c,"读取原始 JSON 失败"),fallback:u})}finally{t(!1)}}return $("button",{type:"button",className:"ghost-btn","data-testid":f,disabled:n,onClick:()=>void y()},n?"读取中":"查看原始JSON")}function BP({raw:l,onClose:u}){if(!l)return null;return $("div",{className:"modal-backdrop",role:"presentation"},$("section",{className:"raw-dialog",role:"dialog","aria-modal":"true","aria-label":l.title},$("div",{className:"raw-dialog-head"},$("h2",null,l.title),$("button",{type:"button",className:"ghost-btn",onClick:u},"关闭")),$("pre",{className:"raw-json","data-testid":"raw-json"},JSON.stringify(l.data,null,2))))}function yW({labels:l,limit:u=8}){let r=dG(l).slice(0,u);if(r.length===0)return $("span",{className:"muted"},"无标签");return $("div",{className:"chip-row"},r.map(([f,n])=>$("span",{key:f,className:"data-chip"},$("b",null,f),$("span",null,_0(n)))))}function ky({node:l}){let u=eG(l);return $("span",{className:`version-chip ${u==="未知"?"unknown":""}`,"data-testid":`gateway-version-${ff(l?.providerId||"unknown")}`},Qj(u))}function MG({title:l,state:u,testId:r}){return $("span",{className:`capability-badge ${u.tone}`,title:u.detail,"data-testid":r},$("b",null,l),$("strong",null,u.label),$("small",null,u.detail))}function mj({node:l}){let u=ff(l?.providerId||"unknown");return $("div",{className:"node-availability-strip"},$(MG,{title:"SSH 透传",state:EP(l),testId:`ssh-availability-${u}`}),$(MG,{title:"远程更新",state:pP(l),testId:`upgrade-availability-${u}`}))}function Ji({data:l,empty:u="无数据"}){if(l===null||l===void 0)return $("span",{className:"muted"},u);if(typeof l!=="object")return $("span",{className:"summary-value"},_0(l));if(Array.isArray(l))return $("span",{className:"summary-value"},`${l.length} 项列表`);let r=Object.entries(l).slice(0,5);if(r.length===0)return $("span",{className:"muted"},u);return $("div",{className:"summary-grid"},r.map(([f,n])=>$("span",{key:f,className:"summary-item"},$("b",null,f),$("span",null,KP(f,n)))))}function wu({title:l,text:u}){return $("div",{className:"empty-state"},$("strong",null,l),$("span",null,u))}function DP({onLogin:l}){let[u,r]=Il(vl.authUsername||"admin"),[f,n]=Il(""),[t,i]=Il(""),[y,c]=Il(!1);async function _(A){A.preventDefault(),c(!0),i("");try{let F=await Tl("/login",{method:"POST",body:JSON.stringify({username:u,password:f})});l(F)}catch(F){i(zl(F,"登录失败"))}finally{c(!1)}}return $("main",{className:"login-screen","data-testid":"login-screen"},$("section",{className:"login-card"},$("div",{className:"login-brand"},$("span",{className:"brand-mark"},"UD"),$("div",null,$("h1",null,"UniDesk"),$("p",null,"Control Plane Login"))),$("form",{className:"login-form",onSubmit:_},$("label",null,"账号",$("input",{name:"username",autoComplete:"username",value:u,onChange:(A)=>r(A.target.value)})),$("label",null,"密码",$("input",{name:"password",type:"password",autoComplete:"current-password",value:f,onChange:(A)=>n(A.target.value)})),$(el,{error:t}),$("button",{type:"submit",disabled:y},y?"登录中":"登录")),$("div",{className:"login-note"},"默认账号由 config.json 注入;公网入口只暴露前端登录面。")))}function VP({connection:l,lastRefresh:u,onRefresh:r,onLogout:f,session:n,clock:t,activeStatusItems:i=[],onNotificationToggle:y,unreadCount:c=0,environment:_={}}){let A=IG(_),F=[...A?[{key:"environment",label:"环境",value:`${_.namespace||"unidesk-dev"}`,tone:"warn"}]:[],{key:"core",label:"核心",value:l.text,tone:l.ok?"ok":"fail",testId:"conn-text"},...Array.isArray(i)?i:[],{key:"refresh",label:"刷新",value:u?iu(u):"未刷新"},{key:"clock",label:x$,value:iu(t)},{key:"user",label:"用户",value:n?.user?.username||"--",tone:"user"}];return $("header",{className:"topbar"},$("div",null,$("p",{className:"eyebrow"},"Distributed Work Platform"),$("h1",null,"UniDesk 控制平面"),A?$("div",{className:"dev-env-ribbon","data-testid":"dev-environment-ribbon"},$("b",null,"DEV"),$("span",null,_.namespace||"unidesk-dev"),$("span",null,_.deployRef||"origin/master:deploy.json#environments.dev"),$("span",null,LP(_.commit||_.requestedCommit))):null),$(ZG,{className:"global-top-status",title:"状态",items:F,actions:[$("button",{key:"notification",type:"button",className:`notification-icon-btn ${c>0?"has-unread":""}`,onClick:y,"aria-label":"通知"},"\uD83D\uDD14",c>0?$("span",{key:"badge",className:"notification-badge"},c>99?"99+":c):null),$("button",{key:"refresh",type:"button",className:"ghost-btn",onClick:r},"刷新"),$("button",{key:"logout",type:"button",className:"ghost-btn danger",onClick:f},"退出")]}))}function SP(l){return!l.defaultPrevented&&l.button===0&&!l.metaKey&&!l.altKey&&!l.ctrlKey&&!l.shiftKey&&l.currentTarget.target!=="_blank"}function cW({moduleId:l,tabId:u,className:r,active:f=!1,title:n,testId:t,onNavigate:i,children:y}){let c=e3(Cf,l,u);return $("a",{href:c,role:"button",className:r,title:n,"aria-current":f?"page":void 0,"data-testid":t,"data-route":c,onClick:(_)=>{if(!SP(_))return;_.preventDefault(),i(l,u)}},y)}function YP({activeModule:l,activeTabs:u,onNavigate:r,collapsed:f,onToggle:n}){return $("aside",{className:`rail ${f?"collapsed":""}`,"aria-label":"主模块"},$("div",{className:"brand"},$("span",{className:"brand-mark"},"UD"),$("span",{className:"brand-text"},"UniDesk"),$("button",{type:"button",className:"rail-toggle",onClick:n,"aria-label":f?"展开左侧边栏":"收起左侧边栏","data-testid":"rail-toggle"},f?"»":"«")),d3.map((t)=>{let i=u[t.id]||z1[t.id]||t.tabs[0]?.id||"";return $(cW,{key:t.id,moduleId:t.id,tabId:i,className:`module ${l===t.id?"active":""}`,active:l===t.id,title:t.label,onNavigate:r},$("span",{className:"module-code"},t.code),$("span",null,t.label))}))}function XP({module:l,activeTab:u,onNavigate:r}){return $("nav",{className:"tabs","aria-label":`${l.label} 子功能`},l.tabs.map((f)=>$(cW,{key:f.id,moduleId:l.id,tabId:f.id,className:`tab ${u===f.id?"active":""}`,active:u===f.id,onNavigate:r},f.label)))}function PP({data:l,onRaw:u,onNavigate:r}){let f=l.overview||{},n=l.nodes.filter((N)=>N.status==="online"),t=l.pendingTasks||l.tasks.filter(Iy),i=f.pendingTaskCount??t.length,y=l.tasks.slice(0,5),c=f.pgdata||{},_=f.microserviceAvailability||{},A=xl(_.totalCount),F=xl(_.healthyCount),j=xl(_.unhealthyCount);return $("div",{className:"page-grid overview-grid","data-testid":"overview-page"},$(ru,{title:"核心指标",eyebrow:"Control"},$("div",{className:"metric-grid"},$(Qu,{label:"数据库",value:f.dbReady?"READY":"WAIT",hint:"PostgreSQL internal network",tone:f.dbReady?"ok":"warn"}),$(Qu,{label:"PGDATA",value:Qr(c.databaseBytes),hint:`${c.volumeName||"unidesk_pgdata_10gb"} / ${c.databasePretty||"--"} / budget ${c.volumeSize||"--"}`,tone:"ok",testId:"pgdata-usage-card"}),$(Qu,{label:"在线节点",value:f.onlineNodeCount??0,hint:`${f.nodeCount??0} registered`,tone:"ok"}),$(Qu,{label:"WebSocket",value:f.activeSocketCount??0,hint:"Provider ingress sockets"}),$(Qu,{label:"用户服务可用",value:A>0?`${F}/${A}`:"--",hint:A>0?`healthyCount ${F} · unhealthyCount ${j}`:"strict /health probes",tone:A>0&&j===0?"ok":"warn",testId:"microservice-availability-card"}),$(Qu,{label:"待处理任务",value:i,hint:i>0?"点击查看具体任务":`timeout ${ct(Math.floor((f.taskPendingTimeoutMs??0)/1000))}`,tone:i>0?"warn":"ok",onClick:()=>r("tasks","pending"),testId:"pending-task-card"}))),$(ru,{title:"本机 Provider",eyebrow:"Self Connected"},n.length===0?$(wu,{title:"暂无在线节点",text:"provider-gateway 未完成自接入"}):$("div",{className:"node-card-list"},n.slice(0,4).map((N)=>$(CP,{key:N.providerId,node:N,onRaw:u})))),$(ru,{title:"待处理任务明细",eyebrow:`${i} Pending`,actions:$("button",{type:"button",className:"ghost-btn",onClick:()=>r("tasks","pending"),"data-testid":"pending-task-detail-link"},"进入任务调度")},t.length===0?$(wu,{title:"当前无待处理",text:"queued / dispatched / running 超时后会自动转为 failed,避免总览长期卡住"}):$("div",{className:"compact-list"},t.slice(0,5).map((N)=>$(bG,{key:N.id,task:N,onRaw:u})))),$(ru,{title:"最近任务",eyebrow:"Dispatch"},y.length===0?$(wu,{title:"暂无任务",text:"可以在任务调度模块发起 docker.ps 或 echo"}):$("div",{className:"compact-list"},y.map((N)=>$(bG,{key:N.id,task:N,onRaw:u})))))}function CP({node:l,onRaw:u}){return $("article",{className:"node-card"},$("div",{className:"node-card-head"},$("div",null,$("strong",null,l.name),$("code",null,l.providerId)),$(Wu,{status:l.status})),$("div",{className:"node-version-line"},$(ky,{node:l}),$("span",null,`升级策略 ${G$(l)}`)),$(mj,{node:l}),$(yW,{labels:l.labels,limit:6}),$("div",{className:"node-card-foot"},$("span",null,`心跳 ${Ll(l.lastHeartbeat)}`),$(eu,{title:`Provider ${l.providerId}`,data:l,onOpen:u,testId:`raw-node-${ff(l.providerId)}`})))}function hP({events:l,onRaw:u}){return $(ru,{title:"事件摘要",eyebrow:"Latest 100"},l.length===0?$(wu,{title:"暂无事件",text:"Provider 注册、心跳超时和任务状态会写入事件流"}):$("div",{className:"table-wrap"},$("table",null,$("thead",null,$("tr",null,$("th",null,"ID"),$("th",null,"类型"),$("th",null,"来源"),$("th",null,"摘要"),$("th",null,"时间"),$("th",null,"操作"))),$("tbody",null,l.map((r)=>$("tr",{key:r.id},$("td",null,$("code",null,r.id)),$("td",null,$(Wu,{status:r.type},r.type)),$("td",null,$("code",null,r.source)),$("td",null,$(Ji,{data:r.payload})),$("td",null,Ll(r.createdAt)),$("td",null,$(eu,{title:`Event ${r.id}`,data:r,onOpen:u}))))))))}function MP({logs:l,onRaw:u}){return $(ru,{title:"服务日志",eyebrow:"Core Recent"},l.length===0?$(wu,{title:"暂无日志",text:"backend-core 内存日志会在请求和 provider 事件后出现"}):$("div",{className:"log-list"},l.slice(-80).reverse().map((r,f)=>$("article",{key:f,className:`log-row ${r.level||"info"}`},$("span",null,Ll(r.ts)),$("b",null,r.level||"info"),$("strong",null,r.message||"log"),$(Ji,{data:r.data,empty:"无附加字段"}),$(eu,{title:`Log ${r.message||f}`,data:r,onOpen:u})))))}function sP({nodes:l,onRaw:u}){return $(ru,{title:"节点清单",eyebrow:`${l.length} Providers`},l.length===0?$(wu,{title:"暂无 Provider 节点",text:"确认 provider-gateway 已连接 provider ingress"}):$("div",{className:"table-wrap"},$("table",{className:"node-list-table"},$("thead",null,$("tr",null,$("th",null,"状态"),$("th",null,"Provider"),$("th",null,"网关版本"),$("th",null,"运维可用性"),$("th",null,"资源标签"),$("th",null,"连接时间"),$("th",null,"最后心跳"),$("th",null,"操作"))),$("tbody",null,l.map((r)=>$("tr",{key:r.providerId},$("td",null,$(Wu,{status:r.status})),$("td",null,$("strong",null,r.name),$("code",null,r.providerId)),$("td",null,$("div",{className:"gateway-cell"},$(ky,{node:r}),$("span",null,G$(r)))),$("td",null,$(mj,{node:r})),$("td",null,$(yW,{labels:r.labels,limit:5})),$("td",null,Ll(r.connectedAt)),$("td",null,Ll(r.lastHeartbeat)),$("td",null,$(eu,{title:`Provider ${r.providerId}`,data:r,onOpen:u,testId:`raw-node-table-${ff(r.providerId)}`}))))))))}function RP({nodes:l}){let u=W$(()=>{let r=[];for(let f of l)for(let[n,t]of dG(f.labels))r.push({providerId:f.providerId,name:f.name,key:n,value:t});return r},[l]);return $(ru,{title:"资源标签",eyebrow:"Structured Labels"},u.length===0?$(wu,{title:"暂无标签",text:"provider-gateway 注册消息会同步资源标签"}):$("div",{className:"label-matrix"},u.map((r)=>$("article",{key:`${r.providerId}-${r.key}`,className:"label-card"},$("span",null,r.key),$("strong",null,_0(r.value)),$("code",null,r.providerId)))))}function xP({nodes:l}){return $(ru,{title:"心跳状态",eyebrow:"Provider Liveness"},l.length===0?$(wu,{title:"无心跳",text:"等待 provider 注册和 heartbeat"}):$("div",{className:"heartbeat-list"},l.map((u)=>$("article",{key:u.providerId,className:"heartbeat-row"},$("span",{className:`pulse ${u.status}`}),$("div",null,$("strong",null,u.name),$("code",null,u.providerId)),$("div",null,$("span",null,"connected"),$("b",null,Ll(u.connectedAt))),$("div",null,$("span",null,"last heartbeat"),$("b",null,Ll(u.lastHeartbeat)))))))}function bP({nodes:l,systemStatuses:u,tasks:r,onRaw:f,refresh:n}){let[t,i]=Il(""),y=W$(()=>l.map((w)=>{let G=u.find((J)=>J.providerId===w.providerId);return{...w,systemCurrent:G?.current||null,systemHistory:G?.history||[],systemUpdatedAt:G?.updatedAt||null}}),[l,u]),c=y.find((w)=>w.providerId===t)||y[0]||null;if(Bn(()=>{if(!t&&y[0])i(y[0].providerId)},[y.length,t]),!c)return $(wu,{title:"暂无资源监控",text:"等待 provider 上报 CPU、内存和硬盘指标"});let _=c.systemCurrent,A=c.systemHistory||[],F=_?.cpu||{},j=_?.memory||{},N=_?.disk||{},U=A.length>0?A:_?[{at:_.collectedAt,cpuPercent:xl(F.percent),memoryPercent:xl(j.percent),diskPercent:xl(N.percent)}]:[];return $("div",{className:"monitor-page","data-testid":"node-monitor-page"},$("div",{className:"docker-node-strip"},y.map((w)=>$("button",{key:w.providerId,type:"button",className:`docker-node-tile ${c.providerId===w.providerId?"active":""}`,onClick:()=>i(w.providerId)},$("span",{className:`pulse ${w.status}`}),$("strong",null,w.name),$("code",null,w.providerId),$("span",null,w.systemCurrent?`CPU ${ji(w.systemCurrent.cpu?.percent)} / MEM ${ji(w.systemCurrent.memory?.percent)}`:"等待指标")))),$("div",{className:"monitor-layout"},$(ru,{title:"任务管理器视图",eyebrow:c.name,className:"monitor-main-panel",actions:_?$(eu,{title:`System ${c.providerId}`,data:{current:_,history:A},onOpen:f}):null},!_?$(wu,{title:"系统指标未上报",text:"provider-gateway 会周期性采集 /proc 与 df,并保存历史曲线"}):$("div",null,$("div",{className:"monitor-hero"},$("div",null,$("p",{className:"panel-eyebrow"},"Node Performance"),$("h3",null,c.name),$("div",{className:"docker-meta"},$("span",null,`${F.cores||0} CPU cores`),$("span",null,`load ${xl(F.load1).toFixed(2)} / ${xl(F.load5).toFixed(2)} / ${xl(F.load15).toFixed(2)}`),$("span",null,`memory actual ${Qr(j.usedBytes)} / ${Qr(j.totalBytes)}`),$("span",null,`disk ${Qr(N.usedBytes)} / ${Qr(N.totalBytes)}`))),$(Wu,{status:_.ok?"online":"warn"},_.ok?"METRICS READY":"METRICS DEGRADED")),$("div",{className:"monitor-chart-grid"},$(Fj,{title:"CPU",metricKey:"cpuPercent",current:F.percent,points:U,detail:`${F.cores||0} cores / load ${xl(F.load1).toFixed(2)}`,tone:"cpu",testId:"metric-chart-cpu"}),$(Fj,{title:"Memory",metricKey:"memoryPercent",current:j.percent,points:U,detail:`${Qr(j.usedBytes)} actual / ${Qr(j.cacheBytes)} cache excluded`,tone:"memory",testId:"metric-chart-memory"}),$(Fj,{title:"Disk",metricKey:"diskPercent",current:N.percent,points:U,detail:`${N.path||"/"} mounted ${N.mount||"--"}`,tone:"disk",testId:"metric-chart-disk"})),$("div",{className:"monitor-summary-grid"},$(Qu,{label:"CPU 当前",value:ji(F.percent),hint:`history ${U.length} samples`,tone:"ok"}),$(Qu,{label:"实际内存",value:Qr(j.usedBytes),hint:`${ji(j.percent)} 不含缓存`}),$(Qu,{label:"硬盘已用",value:Qr(N.usedBytes),hint:ji(N.percent)}),$(Qu,{label:"更新时间",value:Ll(c.systemUpdatedAt||_.collectedAt),hint:c.providerId})),$(vP,{current:_,onRaw:f}))),$("div",{className:"monitor-side-stack"},$(lC,{provider:c,refresh:n,onRaw:f}),$(uC,{provider:c,tasks:r,onRaw:f,limit:5}),$(ru,{title:"采样说明",eyebrow:"Retention"},$("div",{className:"monitor-note-list"},$("article",null,$("b",null,"CPU"),$("span",null,"从 /proc/stat 计算相邻采样差值,首个采样用 load/cores 近似")),$("article",null,$("b",null,"Memory"),$("span",null,"实际内存 = MemTotal - MemFree - Buffers - Cached - SReclaimable + Shmem,不把 page cache / buffer 计入占用")),$("article",null,$("b",null,"Disk"),$("span",null,"使用 df -PB1 对配置路径采样,默认监控根文件系统")),$("article",null,$("b",null,"Process"),$("span",null,"从 /proc/[pid] 采集进程 CPU、实际内存 PSS、RSS、线程数和磁盘 I/O 速率;PSS 不重复计算共享内存,表格默认按内存占用降序")))))))}function $W(l){return xl(l.memoryBytes,xl(l.pssBytes,xl(l.rssBytes)))}function sG(l,u){if(u==="memory")return $W(l);if(u==="cpu")return xl(l.cpuPercent);if(u==="disk")return xl(l.readBytesPerSecond)+xl(l.writeBytesPerSecond);if(u==="pid")return xl(l.pid);if(u==="threads")return xl(l.threads);if(u==="runtime")return xl(l.elapsedSeconds);if(u==="user")return String(l.user||"");return String(l.name||l.command||"")}function RG({value:l,label:u,tone:r}){let f=Math.max(1,Math.min(100,xl(l)));return $("div",{className:`process-meter ${r||""}`},$("span",{style:{width:`${f}%`}}),$("b",null,u))}function vP({current:l,onRaw:u}){let[r,f]=Il({key:"memory",direction:"desc"}),n=Ni.default.useContext(Nj),t=l?.processSummary&&typeof l.processSummary==="object"?l.processSummary:{},i=Array.isArray(l?.processes)?l.processes:[],y=String(t.memoryMode||""),c=y.includes("pss_smaps_rollup")?"PSS":y==="rss_minus_shared_fallback"?"RSS-shared":"RSS fallback",_=W$(()=>{let F=r.direction==="asc"?1:-1;return[...i].sort((j,N)=>{let U=sG(j,r.key),w=sG(N,r.key);if(typeof U==="string"||typeof w==="string")return String(U).localeCompare(String(w),"zh-CN")*F;return(U-w)*F||xl(j.pid)-xl(N.pid)})},[i,r.key,r.direction]),A=(F,j)=>{let N=r.key===j,U=N?r.direction==="asc"?"ascending":"descending":"none";return $("th",{"aria-sort":U},$("button",{type:"button",className:`process-sort-button ${N?"active":""}`,"data-testid":`process-sort-${j}`,onClick:()=>f((w)=>({key:j,direction:w.key===j&&w.direction==="desc"?"asc":"desc"}))},F,$("span",null,N?r.direction==="desc"?"↓":"↑":"↕")))};return $("section",{className:"process-resource-panel","data-testid":"process-resource-panel"},$("div",{className:"process-resource-head"},$("div",null,$("p",{className:"panel-eyebrow"},"Windows Resource Monitor Style"),$(nu,{title:"进程资源占用",level:3,loading:n})),$("div",{className:"process-resource-actions"},$("span",{className:"data-chip"},"默认按内存排序"),$("span",{className:"data-chip"},`内存口径 ${c}`),$("span",{className:"data-chip"},`${xl(t.visible,_.length)} / ${xl(t.total,_.length)} 进程`),$(eu,{title:"Process Resource Snapshot",data:{processSummary:t,processes:i},onOpen:u,testId:"raw-process-resources"}))),_.length===0?$(wu,{title:"暂无进程资源数据",text:"等待 provider-gateway 上报 /proc/[pid] 采样;旧版 provider 需要先升级到支持进程资源表的版本"}):$("div",{className:"process-table-wrap"},$("table",{className:"process-resource-table","data-testid":"process-resource-table"},$("thead",null,$("tr",null,A("进程","name"),A("PID","pid"),A("用户","user"),$("th",null,"状态"),A("CPU","cpu"),A("内存","memory"),$("th",null,"PSS / RSS"),A("磁盘 I/O","disk"),A("线程","threads"),A("运行时长","runtime"))),$("tbody",null,_.map((F)=>{let j=xl(F.readBytesPerSecond)+xl(F.writeBytesPerSecond),N=$W(F);return $("tr",{key:`${F.pid}-${F.startedAt}`,"data-testid":`process-row-${ff(F.pid)}`,"data-memory-bytes":String(N),"data-cpu-percent":String(xl(F.cpuPercent)),"data-disk-bps":String(j),"data-pid":String(xl(F.pid))},$("td",null,$("div",{className:"process-name-cell"},$("strong",null,F.name||"--"),$("span",{className:"process-command"},F.command||"--"))),$("td",null,$("code",null,F.pid||"--")),$("td",null,F.user||`uid:${F.uid??"--"}`),$("td",null,$("span",{className:`process-state state-${ff(F.state||"unknown")}`},F.state||"?")),$("td",null,$(RG,{value:F.cpuPercent,label:TP(F.cpuPercent),tone:"cpu"})),$("td",null,$(RG,{value:F.memoryPercent,label:ji(F.memoryPercent),tone:"memory"})),$("td",null,$("div",{className:"process-io-cell"},$("strong",null,Qr(N)),$("span",null,`RSS ${Qr(F.rssBytes)}`))),$("td",null,$("div",{className:"process-io-cell"},$("strong",null,Aj(j)),$("span",null,`R ${Aj(F.readBytesPerSecond)} / W ${Aj(F.writeBytesPerSecond)}`))),$("td",null,F.threads||0),$("td",null,ct(xl(F.elapsedSeconds))))})))))}function Fj({title:l,metricKey:u,current:r,points:f,detail:n,tone:t,testId:i}){let y=f.map((j)=>Math.max(0,Math.min(100,xl(j[u])))),c=y.length>1?y:[y[0]||0,y[0]||0],_=c.length<=1?100:100/(c.length-1),A=c.map((j,N)=>`${(N*_).toFixed(2)},${(46-j*0.42).toFixed(2)}`).join(" "),F=`0,48 ${A} 100,48`;return $("article",{className:`metric-chart ${t}`,"data-testid":i},$("div",{className:"metric-chart-head"},$("div",null,$("span",null,l),$("strong",null,ji(r))),$("code",null,`${f.length} pts`)),$("svg",{viewBox:"0 0 100 48",preserveAspectRatio:"none",role:"img","aria-label":`${l} usage curve`},$("polygon",{points:F}),$("polyline",{points:A}),$("line",{x1:"0",x2:"100",y1:"24",y2:"24"})),$("div",{className:"metric-chart-foot"},$("span",null,"0%"),$("span",null,n),$("span",null,"100%")))}function $t(l){return Array.isArray(l)?l:[]}function gP(l){let u=$t(l?.core?.requests?.componentSummary);return[...$t(l?.frontend?.requests?.componentSummary),...u].sort((f,n)=>xl(n.requestCount)-xl(f.requestCount))}function kP(l){let u=$t(l?.core?.operations?.summary);return[...$t(l?.frontend?.operations?.summary),...u].sort((f,n)=>xl(n.count)-xl(f.count))}function IP(l){let u=$t(l?.core?.requests?.recentFailures).map((f)=>({source:"backend",...f}));return[...$t(l?.frontend?.requests?.recentFailures).map((f)=>({source:"frontend",...f})),...u].sort((f,n)=>(Dn(n.at)??0)-(Dn(f.at)??0)).slice(0,20)}function aP(l){let u=$t(l?.core?.operations?.recentSlowOperations);return[...$t(l?.frontend?.operations?.recentSlowOperations),...u].sort((f,n)=>xl(n.durationMs)-xl(f.durationMs)).slice(0,20)}function oP(l){let u=performance.memory,r=Number(u?.usedJSHeapSize);if(Number.isFinite(r)&&r>0)return r;let f=Number(l?.appBundleBytes);if(Number.isFinite(f)&&f>0)return f;return xl(l?.process?.heapUsedBytes)}function dP({points:l}){let u=$t(l),r=u.map((j)=>xl(j.mb)),f=Math.max(1,...r),n=Math.max(0,Math.min(...r,0)),t=Math.max(1,f-n),i=u.length>1?u:[...u,...u],y=i.length<=1?100:100/(i.length-1),c=i.map((j,N)=>{let U=xl(j.mb);return`${(N*y).toFixed(2)},${(48-(U-n)/t*42).toFixed(2)}`}).join(" "),_=`0,50 ${c} 100,50`,A=u.at(-1),F=u[0];return $("article",{className:"performance-memory-card","data-testid":"performance-memory-chart"},$("div",{className:"performance-memory-head"},$("strong",null,`Bwebui: ${A?`${xl(A.mb).toFixed(1)}MB`:"--"}`),$("span",null,u.length>0?`${u.length} samples`:"等待采样")),$("svg",{viewBox:"0 0 100 50",preserveAspectRatio:"none",role:"img","aria-label":"Bwebui memory trend"},$("polygon",{points:_}),$("polyline",{points:c}),$("line",{x1:"0",x2:"100",y1:"25",y2:"25"})),$("div",{className:"performance-axis-row"},$("span",null,F?iu(new Date(F.at)):"--"),$("span",null,"时间"),$("span",null,A?iu(new Date(A.at)):"--")),$("div",{className:"performance-axis-row"},$("span",null,`${n.toFixed(1)}`),$("span",null,"(MB)"),$("span",null,`${f.toFixed(1)}`)))}function eP({onRaw:l}){let[u,r]=Il({core:null,frontend:null}),[f,n]=Il([]),[t,i]=Il(""),[y,c]=Il(!1),[_,A]=Il(null),[F,j]=Il(!1);async function N(){c(!0),i("");try{let[B,C]=await Promise.all([Tl(`${vl.apiBaseUrl}/performance`,{cache:"no-store"}),Tl(`${vl.apiBaseUrl}/frontend-performance`,{cache:"no-store"})]);r({core:B,frontend:C});let E=oP(C);n((D)=>[...D,{at:new Date().toISOString(),mb:E/1048576}].slice(-80))}catch(B){i(zl(B,"性能指标加载失败"))}finally{c(!1)}}Bn(()=>{N();let B=setInterval(()=>void N(),5000);return()=>clearInterval(B)},[]);async function U(){j(!0),i(""),A(null);try{let B=await Tl(`${vl.apiBaseUrl}/code-queue-load-test`,{method:"POST",body:JSON.stringify({targetMs:1000,timeoutMs:90000,url:vl.frontendPublicUrl||window.location.origin})});A(B),N()}catch(B){i(zl(B,"Code Queue Playwright 测量失败"))}finally{j(!1)}}let w=gP(u),G=IP(u),J=kP(u),Q=aP(u),m=u.core?.process||{},q=u.frontend?.process||{},W=u.core?.database?.codeQueueStorage||{},p=xl(W.total),O=_?.result||{},Z=xl(O.wallMs,NaN),V=xl(O.networkIdleMs,NaN),P=O.withinTarget===!0,H=F?"running":_===null?"idle":_.measurementOk===!0?P?"passed":"slow":"failed";return $("div",{className:"performance-page","data-testid":"performance-page"},$("div",{className:"performance-hero"},$("div",null,$("p",{className:"panel-eyebrow"},"Unified Performance"),$(nu,{title:"性能面板",loading:y||F}),$("p",null,"按组件统计 HTTP 请求、失败率、P95 延迟,并汇总 backend/frontend 内部操作耗时。")),$("div",{className:"inline-actions"},$("button",{type:"button",className:"ghost-btn",onClick:()=>void U(),disabled:F,"data-testid":"code-queue-load-test-button"},F?"测试中...":"测试 Code Queue 加载"),$("button",{type:"button",className:"ghost-btn",onClick:()=>void N(),disabled:y,"data-testid":"performance-refresh-button"},y?"刷新中":"刷新"),$(eu,{title:"Performance Snapshot",data:u,onOpen:l,testId:"raw-performance"}))),$(el,{error:t}),$("div",{className:"performance-top-grid"},$(dP,{points:f}),$("div",{className:"performance-metric-stack"},$(Qu,{label:"backend RSS",value:Qr(m.rssBytes),hint:`heap ${Qr(m.heapUsedBytes)}`}),$(Qu,{label:"frontend RSS",value:Qr(q.rssBytes),hint:`bundle ${Qr(u.frontend?.appBundleBytes)}`}),$(Qu,{label:"Codex PG 任务",value:p||"--",hint:W.ok?"unidesk_code_queue_tasks":"等待表初始化",tone:W.ok?"ok":"warn"}),$(Qu,{label:"请求样本",value:xl(u.core?.requests?.sampleCount)+xl(u.frontend?.requests?.sampleCount),hint:"rolling window 3000"}))),$(ru,{title:"Code Queue 加载基准",eyebrow:"Playwright / target <1s",className:"codex-load-test-panel",loading:F,actions:$("div",{className:"panel-actions"},$("button",{type:"button",className:"primary-btn",onClick:()=>void U(),disabled:F,"data-testid":"code-queue-load-test-panel-button"},F?"正在运行 Playwright...":"手动触发测试"),_?$(eu,{title:"Code Queue Load Test",data:_,onOpen:l,testId:"raw-code-queue-load-test"}):null)},$("div",{className:"codex-load-test-grid","data-testid":"code-queue-load-test-result"},$(Qu,{label:"总耗时",value:F?"运行中":Number.isFinite(Z)?Lf(Z):"--",hint:_===null?"点击按钮启动远端 Playwright":`目标 ${Lf(O.targetMs||1000)} / ${O.url||"Code Queue"}`,tone:H==="passed"?"ok":H==="failed"||H==="slow"?"warn":""}),$(Qu,{label:"判定",value:F?"RUNNING":H==="passed"?"PASS <1s":H==="slow"?"SLOW":H==="failed"?"FAILED":"--",hint:_?.measurementOk===!1?String(_.error||O.error||"measurement failed").slice(0,120):"导航开始 -> DOMContentLoaded -> data-load-state=complete",tone:H==="passed"?"ok":H==="idle"||H==="running"?"":"fail"}),$(Qu,{label:"Network idle",value:Number.isFinite(V)?Lf(V):"--",hint:`DOMContentLoaded ${Lf(O.domContentLoadedMs)} / ${O.networkIdleReached===!1?"未在 5s 内空闲":"已空闲"}`,tone:Number.isFinite(V)&&V<=1000?"ok":"warn"}),$(Qu,{label:"组件耗时",value:Number.isFinite(xl(O.componentLoadMs,NaN))?Lf(O.componentLoadMs):"--",hint:`queue ${Lf(O.queueMs)} / detail ${Lf(O.detailMs)}`,tone:xl(O.componentLoadMs)>1000?"warn":"ok"}),$(Qu,{label:"Trace 规模",value:Number.isFinite(xl(O.transcriptRows,NaN))?String(O.transcriptRows):"--",hint:`${O.visibleTaskCount??0} visible tasks / ${O.partial?"preview":"complete"}`})),F?$("div",{className:"performance-empty-line"},"正在通过 main-server Host SSH 启动 Playwright,完成后会显示 wall time、组件耗时和最慢 API。"):null,_&&Array.isArray(O.slowestApi)&&O.slowestApi.length>0?$("div",{className:"table-wrap performance-table-wrap compact codex-load-api-table"},$("table",{className:"performance-table"},$("thead",null,$("tr",null,["API","状态","耗时"].map((B)=>$("th",{key:B},B)))),$("tbody",null,O.slowestApi.slice(0,5).map((B,C)=>$("tr",{key:`${B.url}-${C}`},$("td",null,$("code",null,B.url)),$("td",null,B.status),$("td",null,Lf(B.durationMs))))))):null),$("div",{className:"performance-grid"},$(ru,{title:"组件汇总",eyebrow:"Requests",loading:y},w.length===0?$(wu,{title:"暂无请求样本",text:"刷新几次或打开页面后会自动形成组件统计"}):$("div",{className:"table-wrap performance-table-wrap"},$("table",{className:"performance-table"},$("thead",null,$("tr",null,["组件","请求数","失败数","失败率","平均延迟","P95"].map((B)=>$("th",{key:B},B)))),$("tbody",null,w.map((B)=>$("tr",{key:B.component},$("td",null,$("code",null,B.component)),$("td",null,B.requestCount),$("td",null,B.failureCount),$("td",null,ji(xl(B.failureRate)*100)),$("td",null,Lf(B.averageLatencyMs)),$("td",null,Lf(B.p95LatencyMs)))))))),$(ru,{title:"最近失败请求",eyebrow:"Failures",loading:y},G.length===0?$("div",{className:"performance-empty-line"},"最近没有失败请求"):$("div",{className:"table-wrap performance-table-wrap compact"},$("table",{className:"performance-table"},$("thead",null,$("tr",null,["时间","来源","组件","状态","路径"].map((B)=>$("th",{key:B},B)))),$("tbody",null,G.map((B,C)=>$("tr",{key:`${B.at}-${C}`},$("td",null,Ll(B.at)),$("td",null,B.source),$("td",null,$("code",null,B.component)),$("td",null,$(Wu,{status:"failed"},B.status)),$("td",null,$("code",null,B.path)))))))),$(ru,{title:"内部操作汇总",eyebrow:"Operations",loading:y},J.length===0?$(wu,{title:"暂无内部操作样本",text:"API 查询和代理请求会自动记录内部操作耗时"}):$("div",{className:"table-wrap performance-table-wrap"},$("table",{className:"performance-table"},$("thead",null,$("tr",null,["服务","操作","次数","平均延迟","P95"].map((B)=>$("th",{key:B},B)))),$("tbody",null,J.map((B)=>$("tr",{key:`${B.service}-${B.operation}`},$("td",null,B.service),$("td",null,$("code",null,B.operation)),$("td",null,B.count),$("td",null,Lf(B.averageLatencyMs)),$("td",null,Lf(B.p95LatencyMs)))))))),$(ru,{title:"最近慢操作",eyebrow:"Slowest",loading:y},Q.length===0?$(wu,{title:"暂无慢操作",text:"后端会记录最近窗口内耗时最高的内部操作"}):$("div",{className:"table-wrap performance-table-wrap"},$("table",{className:"performance-table"},$("thead",null,$("tr",null,["时间","操作","耗时","结果","细节"].map((B)=>$("th",{key:B},B)))),$("tbody",null,Q.map((B,C)=>$("tr",{key:`${B.at}-${B.operation}-${C}`},$("td",null,Ll(B.at)),$("td",null,$("code",null,B.operation)),$("td",null,Lf(B.durationMs)),$("td",null,B.ok?"成功":"失败"),$("td",null,B.detail||"-")))))))))}function lC({provider:l,refresh:u,onRaw:r}){let[f,n]=Il(""),[t,i]=Il(null),[y,c]=Il("");async function _(A){n(A),c("");try{let F=await Tl(`${vl.apiBaseUrl}/dispatch`,{method:"POST",body:JSON.stringify({providerId:l.providerId,command:"provider.upgrade",payload:{mode:A,source:"frontend-resource-monitor",requestedAt:new Date().toISOString()}})});i({mode:A,...F}),await u()}catch(F){c(zl(F,"升级命令下发失败"))}finally{n("")}}return $(ru,{title:"Provider Gateway 升级",eyebrow:"Remote Control",loading:Boolean(f)},$("div",{className:"upgrade-control","data-testid":"provider-upgrade-control"},$("p",null,"通过 UniDesk WebSocket 向当前计算节点下发 provider.upgrade;预检只生成升级计划,执行升级会调度节点本地 updater 容器。"),$("div",{className:"upgrade-target-line"},$("span",null,"指定 Provider"),$("code",null,l.providerId),$(ky,{node:l})),$("div",{className:"upgrade-actions"},$("button",{type:"button",className:"ghost-btn",disabled:Boolean(f),onClick:()=>_("plan"),"data-testid":"upgrade-plan-button"},f==="plan"?"预检中":"预检升级"),$("button",{type:"button",className:"ghost-btn danger",disabled:Boolean(f),onClick:()=>_("schedule"),"data-testid":"upgrade-schedule-button"},f==="schedule"?"调度中":"执行升级")),$(el,{error:y}),t?$("div",{className:"upgrade-result"},$(Wu,{status:t.status||"queued"},t.status||"queued"),$("span",null,`${t.mode==="schedule"?"执行升级":"预检升级"} 已下发`),$("span",null,`指定版本 ${Qj(eG(l))}`),$("code",null,t.taskId||"--"),$(eu,{title:"Provider Upgrade Dispatch",data:t,onOpen:r})):$("span",{className:"muted"},"升级任务结果会进入任务历史;执行升级可能导致 provider 短暂重连。")))}function _W({records:l,onRaw:u,compact:r=!1}){if(l.length===0)return $(wu,{title:"暂无远程更新记录",text:"该节点还没有 provider.upgrade 任务;执行预检或升级后会在这里形成结构化记录"});return $("div",{className:`upgrade-record-table-wrap table-wrap ${r?"compact":""}`},$("table",{className:"upgrade-record-table"},$("thead",null,$("tr",null,$("th",null,"状态"),$("th",null,"模式"),$("th",null,"任务"),$("th",null,"来源"),$("th",null,"耗时"),$("th",null,"策略"),$("th",null,"Gateway 版本"),$("th",null,"结果记录"),$("th",null,"更新时间"),$("th",null,"操作"))),$("tbody",null,l.map((f)=>$("tr",{key:f.id,"data-testid":`gateway-upgrade-record-${ff(f.id)}`},$("td",null,$(Wu,{status:f.status})),$("td",null,$("span",{className:`mode-chip ${p8(f)}`},p8(f)==="schedule"?"执行升级":"预检")),$("td",null,$("strong",null,"provider.upgrade"),$("code",null,f.id)),$("td",null,zP(f)),$("td",null,$(FW,{task:f})),$("td",null,OP(f)),$("td",null,$("span",{className:"version-chip"},fW(f))),$("td",null,$("span",{className:`upgrade-outcome ${String(f.status||"").toLowerCase()}`},nW(f))),$("td",null,Ll(f.updatedAt)),$("td",null,$(eu,{title:`Provider Upgrade Task ${f.id}`,data:T$(f),onOpen:u})))))))}function uC({provider:l,tasks:u,onRaw:r,limit:f=5}){let n=tW(u,l.providerId).slice(0,f);return $(ru,{title:"远程更新记录",eyebrow:l.providerId,actions:$(ky,{node:l}),className:"provider-upgrade-records-panel"},$("div",{"data-testid":`provider-upgrade-records-${ff(l.providerId)}`},$(_W,{records:n,onRaw:r,compact:!0})))}function rC({nodes:l,tasks:u,onRaw:r}){let f=W$(()=>l.map((t)=>{let i=tW(u,t.providerId);return{node:t,records:i,latest:ZP(i),capabilities:lW(t)}}),[l,u]),n=f.reduce((t,i)=>t+i.records.length,0);return $("div",{className:"gateway-page","data-testid":"gateway-version-page"},$(ru,{title:"Provider Gateway 版本",eyebrow:`${l.length} Providers / ${n} 更新记录`},l.length===0?$(wu,{title:"暂无 Provider 节点",text:"等待 provider-gateway 注册后显示版本号和升级记录"}):$("div",{className:"table-wrap gateway-version-table-wrap"},$("table",{className:"gateway-version-table"},$("thead",null,$("tr",null,$("th",null,"状态"),$("th",null,"Provider"),$("th",null,"Gateway 版本"),$("th",null,"升级策略"),$("th",null,"运维可用性"),$("th",null,"运行时间"),$("th",null,"能力"),$("th",null,"最近远程更新"),$("th",null,"操作"))),$("tbody",null,f.map((t)=>$("tr",{key:t.node.providerId},$("td",null,$(Wu,{status:t.node.status})),$("td",null,$("strong",null,t.node.name),$("code",null,t.node.providerId)),$("td",null,$(ky,{node:t.node})),$("td",null,G$(t.node)),$("td",null,$(mj,{node:t.node})),$("td",null,PG(t.node)?Ll(PG(t.node)):"待新版上报"),$("td",null,$("div",{className:"capability-row"},t.capabilities.length===0?$("span",{className:"muted"},"未声明"):t.capabilities.slice(0,5).map((i)=>$("span",{key:i,className:"data-chip"},i)))),$("td",null,t.latest?$("div",{className:"latest-upgrade-cell"},$(Wu,{status:t.latest.status}),$("span",null,`${p8(t.latest)==="schedule"?"执行升级":"预检"} / ${Ll(t.latest.updatedAt)}`),$("small",null,`Gateway ${fW(t.latest)}`),$("small",null,nW(t.latest))):$("span",{className:"muted"},"暂无记录")),$("td",null,$(eu,{title:`Provider ${t.node.providerId}`,data:t.node,onOpen:r})))))))),$(ru,{title:"远程更新记录",eyebrow:"Structured provider.upgrade records"},l.length===0?$(wu,{title:"暂无记录",text:"没有 provider 节点时不会生成远程更新记录"}):$("div",{className:"gateway-record-grid"},f.map((t)=>$("article",{key:t.node.providerId,className:"gateway-record-card","data-testid":`gateway-records-${ff(t.node.providerId)}`},$("div",{className:"gateway-record-head"},$("div",null,$("strong",null,t.node.name),$("code",null,t.node.providerId)),$(ky,{node:t.node})),$("div",{className:"gateway-record-meta"},$("span",null,`心跳 ${Ll(t.node.lastHeartbeat)}`),$("span",null,`策略 ${G$(t.node)}`),$("span",null,`${t.records.length} 条记录`)),$(_W,{records:t.records.slice(0,8),onRaw:r,compact:!0}))))))}function fC(l){if(l==="running")return"online";if(l==="paused"||l==="restarting")return"warn";if(l==="exited"||l==="dead")return"offline";return"internal"}function AW(l){return/^[a-f0-9]{48,64}$/i.test(l)}function L$(l){let u=String(l?.name||""),r=String(l?.labels||"");return u==="unidesk_pgdata_10gb"||r.includes("com.docker.compose.volume=unidesk_pgdata_10gb")||u.toLowerCase().includes("pgdata")}function xG(l){let u=String(l?.name||""),r=String(l?.labels||"");if(L$(l))return 0;if(r.includes("com.docker.compose.project=unidesk"))return 1;if(!AW(u))return 2;return 3}function nC(l){return[...l].sort((u,r)=>{let f=xG(u)-xG(r);if(f!==0)return f;return String(u.name||"").localeCompare(String(r.name||""))})}function tC({nodes:l,dockerStatuses:u,onRaw:r}){let[f,n]=Il(""),t=W$(()=>l.map((Q)=>{let m=u.find((q)=>q.providerId===Q.providerId);return{...Q,dockerStatus:m?.dockerStatus||null,dockerUpdatedAt:m?.updatedAt||null}}),[l,u]),i=t.find((Q)=>Q.providerId===f)||t[0]||null;if(Bn(()=>{if(!f&&t[0])n(t[0].providerId)},[t.length,f]),!i)return $(wu,{title:"暂无 Docker 节点",text:"等待 provider 上报 Docker daemon 状态"});let y=i.dockerStatus,c=i.providerId==="main-server",_=y?.counts||{},A=y?.daemon||{},F=y?.containers||[],j=y?.images||[],N=nC(y?.volumes||[]),U=c?N.find(L$):null,w=y?.networks||[],G=F.filter((Q)=>Q.state==="running"),J=F.filter((Q)=>Q.state!=="running");return $("div",{className:"docker-page","data-testid":"docker-status-page"},$("div",{className:"docker-node-strip"},t.map((Q)=>$("button",{key:Q.providerId,type:"button",className:`docker-node-tile ${i.providerId===Q.providerId?"active":""}`,onClick:()=>n(Q.providerId)},$("span",{className:`pulse ${Q.status}`}),$("strong",null,Q.name),$("code",null,Q.providerId),$("span",null,Q.dockerStatus?`Docker ${Q.dockerStatus.ok?"ready":"degraded"}`:"等待上报")))),$("div",{className:"docker-layout"},$(ru,{title:"Docker Desktop 视图",eyebrow:i.name,className:"docker-main-panel",actions:y?$(eu,{title:`Docker ${i.providerId}`,data:y,onOpen:r}):null},!y?$(wu,{title:"Docker 状态未上报",text:"provider-gateway 会在连接后周期性采集 docker info / ps / images / volume / network"}):$("div",null,$("div",{className:"docker-hero"},$("div",null,$("p",{className:"panel-eyebrow"},"Daemon"),$("h3",null,A.name||i.providerId),$("div",{className:"docker-meta"},$("span",null,A.serverVersion?`Engine ${A.serverVersion}`:"Engine --"),$("span",null,A.operatingSystem||"OS --"),$("span",null,A.architecture||"arch --"),$("span",null,`${A.cpus||0} CPU / ${Qr(A.memoryBytes)}`))),$(Wu,{status:y.ok?"online":"warn"},y.ok?"Docker Ready":"Docker Degraded")),$("div",{className:"docker-metrics"},$(Qu,{label:"Containers",value:_.containers??F.length,hint:`${_.running??G.length} running / ${_.stopped??J.length} stopped`,tone:"ok"}),$(Qu,{label:"Images",value:_.images??j.length,hint:`${_.daemonImages??_.images??j.length} daemon images`}),$(Qu,{label:"Volumes",value:_.volumes??N.length,hint:c?U?"database volume visible":"database volume missing":"node local volumes",tone:U?"ok":""}),$(Qu,{label:"Networks",value:_.networks??w.length,hint:A.driver?`driver ${A.driver}`:"docker networks"})),c?$(iC,{volume:U,volumeCount:N.length}):null,$("div",{className:"docker-section-head"},$("h3",null,"Containers"),$("span",null,`updated ${Ll(i.dockerUpdatedAt||y.collectedAt)}`)),$("div",{className:"docker-container-table table-wrap","data-testid":"docker-container-table"},$("table",null,$("thead",null,$("tr",null,$("th",null,"状态"),$("th",null,"容器"),$("th",null,"镜像"),$("th",null,"端口"),$("th",null,"运行时间"),$("th",null,"重启策略"),$("th",null,"PID"),$("th",null,"大小"))),$("tbody",null,F.length===0?$("tr",null,$("td",{colSpan:8},"暂无容器")):F.map((Q)=>$("tr",{key:`${Q.id}-${Q.name}`},$("td",null,$(Wu,{status:fC(Q.state)},Q.state||"unknown")),$("td",null,$("strong",null,Q.name||"--"),$("code",null,Q.id||"--")),$("td",null,Q.image||"--"),$("td",null,Q.ports||$("span",{className:"muted"},"未发布")),$("td",null,Q.runningFor||Q.status||"--"),$("td",null,Q.restartPolicy?$(Wu,{status:Q.restartPolicy==="always"?"online":"warn"},Q.restartPolicy):"--"),$("td",null,Q.pidMode?$("code",null,Q.pidMode):"--"),$("td",null,Q.size||"--")))))))),$("div",{className:"docker-side-stack"},$(jj,{title:"Images",items:j,render:(Q)=>$("article",{key:`${Q.id}-${Q.repository}`,className:"docker-side-row"},$("strong",null,`${Q.repository}:${Q.tag}`),$("span",null,Q.size||"--"),$("code",null,Q.id||"--"))}),$(jj,{title:"Volumes",items:N,limit:N.length,render:(Q)=>$("article",{key:Q.name,className:`docker-side-row volume-row ${c&&L$(Q)?"database-volume":""}`,"data-testid":c&&L$(Q)?"database-volume-row":void 0},$("strong",null,Q.name),$("span",null,c&&L$(Q)?"PostgreSQL":AW(String(Q.name||""))?"anonymous":"named"),$("code",null,Q.mountpoint||Q.driver||Q.scope||"--"))}),$(jj,{title:"Networks",items:w,render:(Q)=>$("article",{key:Q.id||Q.name,className:"docker-side-row"},$("strong",null,Q.name),$("span",null,Q.driver||"--"),$("code",null,Q.id||"--"))}))))}function iC({volume:l,volumeCount:u}){return $("section",{className:`docker-volume-focus ${l?"ready":"missing"}`,"data-testid":"database-volume-card"},$("div",{className:"volume-focus-head"},$("span",{className:"panel-eyebrow"},"Database Named Volume"),$(Wu,{status:l?"online":"warn"},l?"FOUND":"MISSING")),l?$("div",{className:"volume-focus-body"},$("strong",null,l.name),$("span",null,"PostgreSQL data volume for unidesk-database"),$("div",{className:"volume-route"},$("code",null,l.mountpoint||"/var/lib/docker/volumes/unidesk_pgdata_10gb/_data"),$("span",null,"->"),$("code",null,"unidesk-database:/var/lib/postgresql/data")),$("div",{className:"docker-meta compact"},$("span",null,`driver ${l.driver||"--"}`),$("span",null,`scope ${l.scope||"--"}`),$("span",null,`${u} volumes reported`))):$("div",{className:"volume-focus-body"},$("strong",null,"unidesk_pgdata_10gb"),$("span",null,"当前 Docker 快照没有发现数据库命名卷;请检查 provider-gateway 的 Docker volume 上报。")))}function jj({title:l,items:u,render:r,limit:f}){let n=u.slice(0,f??12),t=Math.max(0,u.length-n.length);return $(ru,{title:l,eyebrow:`${u.length} items`,className:"docker-side-panel"},u.length===0?$(wu,{title:`暂无 ${l}`,text:"等待 Docker 状态采集"}):$("div",{className:"docker-side-list"},n.map(r),t>0?$("div",{className:"docker-side-more"},`+ ${t} more`):null))}function yC({microservices:l,onRaw:u,onNavigate:r}){let f=l.filter((n)=>hG(n).public===!1);return $("div",{className:"microservice-page","data-testid":"microservice-catalog-page"},$(ru,{title:"用户服务目录",eyebrow:"Provider Mounted User Services"},$("div",{className:"metric-grid"},$(Qu,{label:"服务总数",value:l.length,hint:"config.json 用户服务登记"}),$(Qu,{label:"私有后端",value:f.length,hint:"不直接暴露公网",tone:"ok"}),$(Qu,{label:"D601 服务",value:l.filter((n)=>n.providerId==="D601").length,hint:"compute-node docker"}),$(Qu,{label:"集成前端",value:l.filter((n)=>n.frontend?.integrated).length,hint:"UniDesk React 页面"}))),$(ru,{title:"服务映射",eyebrow:"Repo Reference + Runtime"},l.length===0?$(wu,{title:"暂无用户服务",text:"在 config.json 的 microservices 中登记用户服务的 provider、仓库引用和后端映射"}):$("div",{className:"table-wrap"},$("table",{className:"microservice-table"},$("thead",null,$("tr",null,$("th",null,"服务"),$("th",null,"Provider"),$("th",null,"代码引用"),$("th",null,"Docker 引用"),$("th",null,"后端映射"),$("th",null,"开发入口"),$("th",null,"运行态"),$("th",null,"操作"))),$("tbody",null,l.map((n)=>{let t=iW(n),i=HP(n),y=hG(n),c=t.availability||{},_=c.status||(t.providerStatus==="online"?"unknown":"unhealthy");return $("tr",{key:n.id,"data-testid":`microservice-row-${ff(n.id)}`},$("td",null,$("strong",null,n.name),$("code",null,n.id)),$("td",null,$("strong",null,t.providerName||n.providerId),$("code",null,n.providerId)),$("td",null,$("span",null,i.url||"--"),$("code",null,i.commitId||"--")),$("td",null,$("span",null,i.composeFile||"--"),$("code",null,`${i.composeService||"--"} / ${i.containerName||"--"}`)),$("td",null,$(Wu,{status:y.public?"warn":"online"},y.public?"public":"private"),$("code",null,`${y.nodeBindHost||"--"}:${y.nodePort||"--"} -> ${y.proxyMode||"--"}`)),$("td",null,$("span",null,n.development?.sshPassthrough?"SSH 透传":"未配置"),$("code",null,n.development?.worktreePath||"--")),$("td",null,$(Wu,{status:_==="healthy"?"online":_==="unknown"?"warn":"failed"},_),$("span",null,c.reason||t.providerStatus||"unknown"),$(Ji,{data:t.container,empty:"容器快照未上报"})),$("td",null,$("div",{className:"microservice-actions"},n.id==="findjob"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","findjob"),"data-testid":"open-findjob-button"},"打开"):null,n.id==="pipeline"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","pipeline"),"data-testid":"open-pipeline-button"},"打开"):null,n.id==="todo-note"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","todo-note"),"data-testid":"open-todo-note-button"},"打开"):null,n.id==="met-nonlinear"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","met-nonlinear"),"data-testid":"open-met-nonlinear-button"},"打开"):null,n.id==="claudeqq"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","claudeqq"),"data-testid":"open-claudeqq-button"},"打开"):null,n.id==="baidu-netdisk"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","baidu-netdisk"),"data-testid":"open-baidu-netdisk-button"},"打开"):null,n.id==="oa-event-flow"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","oa-event-flow"),"data-testid":"open-oa-event-flow-button"},"打开"):null,n.id==="k3sctl-adapter"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","k3sctl"),"data-testid":"open-k3sctl-button"},"打开"):null,n.id==="code-queue"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","code-queue"),"data-testid":"open-code-queue-button"},"打开"):null,n.id==="mdtodo"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","mdtodo"),"data-testid":"open-mdtodo-button"},"打开"):null,n.id==="decision-center"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","decision-center"),"data-testid":"open-decision-center-button"},"打开"):null,n.id==="project-manager"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","project-manager"),"data-testid":"open-project-manager-button"},"打开"):null,$(eu,{title:`用户服务 ${n.id}`,data:n,onOpen:u}))))}))))))}function cC({nodes:l,onDispatched:u,onRaw:r}){let f=l.filter((H)=>H.status==="online"),[n,t]=Il(f[0]?.providerId||l[0]?.providerId||""),[i,y]=Il("docker.ps"),[c,_]=Il("frontend"),[A,F]=Il("operator-check"),[j,N]=Il("normal"),[U,w]=Il(!1),[G,J]=Il(""),[Q,m]=Il(!1),[q,W]=Il(null),[p,O]=Il("");Bn(()=>{if(!n&&(f[0]?.providerId||l[0]?.providerId))t(f[0]?.providerId||l[0].providerId)},[l.length,f.length,n]);function Z(){return{source:c,note:A,priority:j}}function V(){J(JSON.stringify(Z(),null,2)),w(!0)}async function P(H){H.preventDefault(),m(!0),O("");try{let B=U?JSON.parse(G||"{}"):Z(),C=await Tl(`${vl.apiBaseUrl}/dispatch`,{method:"POST",body:JSON.stringify({providerId:n,command:i,payload:B})});W(C),await u()}catch(B){O(zl(B,"下发失败"))}finally{m(!1)}}return $("div",{className:"page-grid dispatch-grid"},$(ru,{title:"下发任务",eyebrow:"Real WebSocket Dispatch"},$("form",{className:"dispatch-form",onSubmit:P},$("label",null,"Provider",$("select",{value:n,onChange:(H)=>t(H.target.value)},l.map((H)=>$("option",{key:H.providerId,value:H.providerId},`${H.name} / ${H.providerId}`)))),$("label",null,"Command",$("select",{value:i,onChange:(H)=>y(H.target.value)},$("option",{value:"docker.ps"},"docker.ps"),$("option",{value:"host.ssh"},"host.ssh"),$("option",{value:"microservice.http"},"microservice.http"),$("option",{value:"echo"},"echo"))),$("label",null,"来源",$("input",{value:c,onChange:(H)=>_(H.target.value)})),$("label",null,"备注",$("input",{value:A,onChange:(H)=>F(H.target.value)})),$("label",null,"优先级",$("select",{value:j,onChange:(H)=>N(H.target.value)},$("option",{value:"normal"},"normal"),$("option",{value:"low"},"low"),$("option",{value:"urgent"},"urgent"))),$("div",{className:"dispatch-actions"},$("button",{type:"button",className:"ghost-btn",onClick:V},"查看原始JSON"),$("button",{type:"submit",disabled:Q||!n},Q?"下发中":"下发任务")),U?$("label",{className:"raw-editor-label"},"高级 Payload",$("textarea",{className:"raw-editor",value:G,onChange:(H)=>J(H.target.value)})):null,$(el,{error:p,wide:!0}))),$(ru,{title:"下发结果",eyebrow:"Response"},q?$("div",{className:"result-card"},$(Wu,{status:q.status||"queued"},q.status||"queued"),$("dl",null,$("dt",null,"Task ID"),$("dd",null,$("code",null,q.taskId||"--")),$("dt",null,"Provider 在线"),$("dd",null,_0(q.providerOnline))),$(eu,{title:"Dispatch Response",data:q,onOpen:r})):$(wu,{title:"等待操作",text:"任务响应会以结构化结果卡展示"})))}function bG({task:l,onRaw:u}){return $("article",{className:"compact-row"},$(Wu,{status:l.status}),$("div",null,$("strong",null,l.command),$("code",null,l.id)),$("span",null,Iy(l)?`已等待 ${Jj(l.updatedAt)}`:`耗时 ${ct(aG(l)??0)}`),$(eu,{title:`Task ${l.id}`,data:T$(l),onOpen:u}))}function FW({task:l}){let u=aG(l),r=Iy(l);return $("div",{className:"task-duration"},$("strong",null,u===null?"--":ct(u)),$("span",null,r?`已运行 / 创建 ${Ll(l.createdAt)}`:`创建 ${Ll(l.createdAt)}`))}function $C({task:l}){let u=String(l?.status||"").toLowerCase(),r=l?.result,f=r&&typeof r==="object"&&!Array.isArray(r)?r:{},t=["exitCode","code","signal","timeoutMs","previousStatus","mode"].filter((i)=>f[i]!==void 0&&f[i]!==null);if(u==="failed"){let i=oG(l);return $("div",{className:"task-diagnostic failed"},$("b",null,"失败原因"),$("span",{className:"diagnostic-reason"},_0(i)),t.length>0?$("div",{className:"diagnostic-meta"},t.map((y)=>$("span",{key:y,className:"data-chip"},$("b",null,y),$("span",null,_0(f[y]))))):null)}if(Iy(l))return $("div",{className:"task-diagnostic warn"},$("b",null,"等待终态"),$("span",null,`最后更新 ${Jj(l.updatedAt)} 前`));return $("div",{className:"task-diagnostic ok"},$("b",null,"完成摘要"),$(Ji,{data:r,empty:"无执行输出"}))}function _C({tasks:l,onRaw:u}){let r=l.filter(Iy);return $("div",{"data-testid":"pending-task-page"},$(ru,{title:"待处理任务",eyebrow:`${r.length} Pending`},r.length===0?$(wu,{title:"当前无待处理任务",text:"queued / dispatched / running 会在超时后自动转为 failed;历史记录仍可在任务历史中查看"}):$("div",{className:"table-wrap","data-testid":"pending-task-table"},$("table",null,$("thead",null,$("tr",null,$("th",null,"状态"),$("th",null,"任务"),$("th",null,"Provider"),$("th",null,"已等待"),$("th",null,"载荷摘要"),$("th",null,"操作"))),$("tbody",null,r.map((f)=>$("tr",{key:f.id},$("td",null,$(Wu,{status:f.status})),$("td",null,$("strong",null,f.command),$("code",null,f.id)),$("td",null,$("code",null,f.providerId)),$("td",null,Jj(f.updatedAt)),$("td",null,$(Ji,{data:f.payload})),$("td",null,$(eu,{title:`Pending Task ${f.id}`,data:T$(f),onOpen:u})))))))))}function AC({tasks:l,onRaw:u}){return $("div",{"data-testid":"task-history-page"},$(ru,{title:"任务历史",eyebrow:`${l.length} Tasks`},l.length===0?$(wu,{title:"暂无任务",text:"下发任务后会在这里看到生命周期"}):$("div",{className:"table-wrap"},$("table",{className:"task-history-table"},$("thead",null,$("tr",null,$("th",null,"状态"),$("th",null,"任务"),$("th",null,"Provider"),$("th",null,"任务耗时"),$("th",null,"载荷摘要"),$("th",null,"诊断信息"),$("th",null,"更新时间"),$("th",null,"操作"))),$("tbody",null,l.map((r)=>$("tr",{key:r.id,"data-testid":`task-row-${ff(r.id)}`},$("td",null,$(Wu,{status:r.status})),$("td",null,$("strong",null,r.command),$("code",null,r.id)),$("td",null,$("code",null,r.providerId)),$("td",null,$(FW,{task:r})),$("td",null,$(Ji,{data:r.payload})),$("td",null,$($C,{task:r})),$("td",null,Ll(r.updatedAt)),$("td",null,$(eu,{title:`Task ${r.id}`,data:T$(r),onOpen:u})))))))))}function FC({tasks:l,onRaw:u}){let r=l.filter((f)=>["succeeded","failed"].includes(f.status));return $(ru,{title:"执行结果",eyebrow:"Finished Tasks"},r.length===0?$(wu,{title:"暂无结果",text:"任务完成后展示 provider 返回的结构化摘要"}):$("div",{className:"result-grid"},r.map((f)=>$("article",{key:f.id,className:"result-card"},$("div",{className:"node-card-head"},$("strong",null,f.command),$(Wu,{status:f.status})),$("code",null,f.id),$(Ji,{data:f.result,empty:"无执行输出"}),$(eu,{title:`Task Result ${f.id}`,data:T$(f),onOpen:u})))))}function jC(l){if(!l||typeof l!=="object")return"--";if(l.type==="interval")return`每 ${ct(Number(l.everySeconds||0))}`;return`每天 ${l.timeOfDay||"03:00"} UTC`}function NC(l){if(!l||typeof l!=="object")return"--";if(l.type==="pgdata_backup")return`PGDATA -> ${l.remoteBaseDir||"/SERVER_DATA/UNIDESK_PG_DATA"}`;if(l.type==="dispatch")return`${l.providerId||"--"} / ${l.command||"--"}`;return String(l.type||"--")}function JC(l){let u=String(l||"").toLowerCase();if(u==="succeeded")return"online";if(u==="failed")return"failed";if(u==="running"||u==="queued")return"warn";return u}function UC(l){let u=Number(l?.durationMs);if(Number.isFinite(u)&&u>=0)return ct(u/1000);let r=Dn(l?.startedAt||l?.createdAt);if(r===null)return"--";let n=Dn(l?.finishedAt)??Date.now();return ct(Math.max(0,(n-r)/1000))}function vG(l){return{id:"unidesk-pgdata-baidu-daily",name:"PGDATA daily Baidu Netdisk backup",description:"Daily PostgreSQL physical base backup uploaded to Baidu Netdisk /SERVER_DATA with monthly rotation.",enabled:!0,timeOfDay:"03:30",actionType:"pgdata_backup",providerId:l[0]?.providerId||"main-server",command:"echo",payloadJson:JSON.stringify({source:"scheduled-task",message:"hello from scheduler"},null,2),remoteBaseDir:"/SERVER_DATA/UNIDESK_PG_DATA",stagingSubdir:"server-data/unidesk-pg-data",timeoutMs:"3600000"}}function QC({schedules:l,scheduleRuns:u,nodes:r,refresh:f,onRaw:n}){let[t,i]=Il(vG(r||[])),[y,c]=Il(!1),[_,A]=Il(""),[F,j]=Il(""),N=[...u||[]].sort((q,W)=>(Dn(W.updatedAt)??0)-(Dn(q.updatedAt)??0));function U(q,W){i((p)=>({...p,[q]:W}))}function w(q){let W=q?.action||{};i({id:q?.id||"",name:q?.name||"",description:q?.description||"",enabled:q?.enabled!==!1,timeOfDay:q?.schedule?.timeOfDay||"03:30",actionType:W.type||"dispatch",providerId:W.providerId||r[0]?.providerId||"main-server",command:W.command||"echo",payloadJson:JSON.stringify(W.payload||{source:"scheduled-task"},null,2),remoteBaseDir:W.remoteBaseDir||"/SERVER_DATA/UNIDESK_PG_DATA",stagingSubdir:W.stagingSubdir||"server-data/unidesk-pg-data",timeoutMs:String(W.timeoutMs||3600000)}),j(`正在编辑 ${q?.id||""}`)}function G(){let q={id:t.id,name:t.name,description:t.description,enabled:t.enabled,concurrencyPolicy:"skip",schedule:{type:"daily",timeOfDay:t.timeOfDay,timezone:"Etc/UTC"}};if(t.actionType==="pgdata_backup")return{...q,action:{type:"pgdata_backup",volumeName:"unidesk_pgdata_10gb",remoteBaseDir:t.remoteBaseDir,stagingSubdir:t.stagingSubdir,timeoutMs:Number(t.timeoutMs)||3600000,cleanupLocal:!0}};return{...q,action:{type:"dispatch",providerId:t.providerId,command:t.command,payload:JSON.parse(t.payloadJson||"{}"),timeoutMs:Number(t.timeoutMs)||600000}}}async function J(q){q.preventDefault(),c(!0),A(""),j("");try{let W=G(),p=encodeURIComponent(String(W.id));await Tl(`${vl.apiBaseUrl}/schedules/${p}`,{method:"PUT",body:JSON.stringify(W)}),j("定时任务已保存"),await f()}catch(W){A(zl(W,"保存定时任务失败"))}finally{c(!1)}}async function Q(q){if(!q?.id)return;c(!0),A(""),j("");try{await Tl(`${vl.apiBaseUrl}/schedules/${encodeURIComponent(q.id)}`,{method:"DELETE"}),j(`已删除 ${q.id}`),await f()}catch(W){A(zl(W,"删除定时任务失败"))}finally{c(!1)}}async function m(q){if(!q?.id)return;c(!0),A(""),j("");try{let W=await Tl(`${vl.apiBaseUrl}/schedules/${encodeURIComponent(q.id)}/run`,{method:"POST",body:"{}"});j(`已触发 ${q.id} / ${W?.run?.id||"run"}`),await f()}catch(W){A(zl(W,"触发定时任务失败"))}finally{c(!1)}}return $("div",{className:"page-grid scheduled-task-page","data-testid":"scheduled-task-page"},$(ru,{title:"定时任务",eyebrow:`${(l||[]).length} Schedules`},(l||[]).length===0?$(wu,{title:"暂无定时任务",text:"创建 daily / dispatch / PGDATA backup 任务后会在这里展示下一次执行时间和最近结果"}):$("div",{className:"schedule-card-grid"},(l||[]).map((q)=>$("article",{key:q.id,className:"schedule-card","data-testid":`schedule-row-${ff(q.id)}`},$("div",{className:"node-card-head"},$("strong",null,q.name||q.id),$(Wu,{status:q.enabled?"online":"warn"},q.enabled?"enabled":"disabled")),$("code",null,q.id),$("dl",null,$("dt",null,"计划"),$("dd",null,jC(q.schedule)),$("dt",null,"动作"),$("dd",null,NC(q.action)),$("dt",null,"下次执行"),$("dd",null,Ll(q.nextRunAt)),$("dt",null,"最近执行"),$("dd",null,q.lastRunAt?`${Ll(q.lastRunAt)} / ${q.lastRunId||"--"}`:"--")),$("div",{className:"dispatch-actions"},$("button",{type:"button",className:"ghost-btn",disabled:y,onClick:()=>w(q)},"编辑"),$("button",{type:"button",className:"ghost-btn",disabled:y,onClick:()=>m(q),"data-testid":`schedule-run-${ff(q.id)}`},"手动触发"),$("button",{type:"button",className:"ghost-btn danger",disabled:y,onClick:()=>Q(q)},"删除"),$(eu,{title:`Schedule ${q.id}`,data:q,onOpen:n})))))),$(ru,{title:t.id?"配置定时任务":"新建定时任务",eyebrow:"CRUD"},$("form",{className:"dispatch-form schedule-form",onSubmit:J},$("label",null,"ID",$("input",{value:t.id,onChange:(q)=>U("id",q.target.value)})),$("label",null,"名称",$("input",{value:t.name,onChange:(q)=>U("name",q.target.value)})),$("label",null,"每日执行时间 UTC",$("input",{value:t.timeOfDay,placeholder:"03:30",onChange:(q)=>U("timeOfDay",q.target.value)})),$("label",null,"启用",$("select",{value:t.enabled?"true":"false",onChange:(q)=>U("enabled",q.target.value==="true")},$("option",{value:"true"},"enabled"),$("option",{value:"false"},"disabled"))),$("label",null,"动作类型",$("select",{value:t.actionType,onChange:(q)=>U("actionType",q.target.value)},$("option",{value:"pgdata_backup"},"PGDATA 备份到百度网盘"),$("option",{value:"dispatch"},"Provider Dispatch"))),t.actionType==="pgdata_backup"?[$("label",{key:"remote"},"网盘根目录",$("input",{value:t.remoteBaseDir,onChange:(q)=>U("remoteBaseDir",q.target.value)})),$("label",{key:"staging"},"本地 staging 子目录",$("input",{value:t.stagingSubdir,onChange:(q)=>U("stagingSubdir",q.target.value)}))]:[$("label",{key:"provider"},"Provider",$("select",{value:t.providerId,onChange:(q)=>U("providerId",q.target.value)},(r||[]).map((q)=>$("option",{key:q.providerId,value:q.providerId},`${q.name} / ${q.providerId}`)))),$("label",{key:"command"},"Command",$("select",{value:t.command,onChange:(q)=>U("command",q.target.value)},$("option",{value:"echo"},"echo"),$("option",{value:"docker.ps"},"docker.ps"),$("option",{value:"host.ssh"},"host.ssh"),$("option",{value:"microservice.http"},"microservice.http"))),$("label",{key:"payload",className:"raw-editor-label"},"Payload JSON",$("textarea",{className:"raw-editor",value:t.payloadJson,onChange:(q)=>U("payloadJson",q.target.value)}))],$("label",null,"超时 ms",$("input",{value:t.timeoutMs,onChange:(q)=>U("timeoutMs",q.target.value)})),$("label",{className:"raw-editor-label"},"描述",$("textarea",{className:"raw-editor compact",value:t.description,onChange:(q)=>U("description",q.target.value)})),$("div",{className:"dispatch-actions"},$("button",{type:"button",className:"ghost-btn",disabled:y,onClick:()=>i(vG(r||[]))},"重置"),$("button",{type:"submit",disabled:y||!t.id},y?"保存中":"保存任务")),F?$("p",{className:"muted paragraph"},F):null,$(el,{error:_,wide:!0}))),$(ru,{title:"历史执行记录",eyebrow:`${N.length} Runs`},N.length===0?$(wu,{title:"暂无执行记录",text:"定时触发或手动触发后会生成 run history"}):$("div",{className:"table-wrap"},$("table",{className:"task-history-table schedule-run-table"},$("thead",null,$("tr",null,$("th",null,"状态"),$("th",null,"任务"),$("th",null,"触发"),$("th",null,"耗时"),$("th",null,"结果摘要"),$("th",null,"更新时间"),$("th",null,"操作"))),$("tbody",null,N.map((q)=>$("tr",{key:q.id,"data-testid":`schedule-run-row-${ff(q.id)}`},$("td",null,$(Wu,{status:JC(q.status)},q.status)),$("td",null,$("strong",null,q.scheduleId),$("code",null,q.id),q.taskId?$("code",null,q.taskId):null),$("td",null,q.trigger||"--"),$("td",null,UC(q)),$("td",null,$(Ji,{data:q.result||q.error,empty:"无结果"})),$("td",null,Ll(q.updatedAt)),$("td",null,$(eu,{title:`Schedule Run ${q.id}`,data:q,onOpen:n})))))))))}function mC({data:l}){let u=l.overview||{};return $("div",{className:"page-grid topology-grid"},$(ru,{title:"公开入口",eyebrow:"Public"},$("div",{className:"endpoint-list"},$("article",null,$("b",null,"Frontend"),$("span",null,vl.frontendPublicUrl||window.location.origin),$(Wu,{status:"online"},"public")),$("article",null,$("b",null,"Provider Ingress"),$("span",null,vl.providerIngressPublicUrl||"ws://public/ws/provider"),$(Wu,{status:"online"},"public")))),$(ru,{title:"内部服务",eyebrow:"Docker Network Only"},$("div",{className:"endpoint-list"},$("article",null,$("b",null,"backend-core API"),$("span",null,"http://backend-core:8080"),$(Wu,{status:"internal"},"internal")),$("article",null,$("b",null,"database"),$("span",null,"postgres://database:5432/unidesk"),$(Wu,{status:"internal"},"internal")))),$(ru,{title:"运行态",eyebrow:"Runtime"},$("div",{className:"metric-grid"},$(Qu,{label:"DB Ready",value:u.dbReady?"YES":"NO",hint:"internal health"}),$(Qu,{label:"Online Nodes",value:u.onlineNodeCount??0,hint:"provider-gateway self-link"}))))}function wC({session:l}){return $(ru,{title:"认证策略",eyebrow:"Frontend Login"},$("div",{className:"policy-grid"},$("article",null,$("span",null,"默认账号"),$("strong",null,vl.authUsername||"admin")),$("article",null,$("span",null,"当前会话"),$("strong",null,l?.user?.username||"--")),$("article",null,$("span",null,"Session TTL"),$("strong",null,`${vl.sessionTtlSeconds||0}s`)),$("article",null,$("span",null,"API 访问"),$("strong",null,"同源 Cookie 保护"))),$("p",{className:"muted paragraph"},"浏览器只访问 frontend 同源接口;frontend 容器使用 Docker 内网代理 backend-core API。"))}function qC(){return $(ru,{title:"安全边界",eyebrow:"Exposure Rule"},$("div",{className:"security-board"},$("article",{className:"allow"},$("b",null,"允许公网"),$("span",null,"frontend 登录入口"),$("span",null,"provider ingress WebSocket/health")),$("article",{className:"deny"},$("b",null,"禁止公网"),$("span",null,"backend-core REST API"),$("span",null,"PostgreSQL database")),$("article",null,$("b",null,"数据库卷"),$("span",null,"named volume unidesk_pgdata_10gb"),$("span",null,"CLI stop/start 不删除数据卷"))))}function LC({activeModule:l,activeTab:u,data:r,session:f,refresh:n,onRaw:t,onNavigate:i}){if(l==="ops"&&u==="status")return $(PP,{data:r,onRaw:t,onNavigate:i});if(l==="ops"&&u==="performance")return $(eP,{onRaw:t});if(l==="ops"&&u==="events")return $(hP,{events:r.events,onRaw:t});if(l==="ops"&&u==="logs")return $(MP,{logs:r.logs,onRaw:t});if(l==="nodes"&&u==="list")return $(sP,{nodes:r.nodes,onRaw:t});if(l==="nodes"&&u==="monitor")return $(bP,{nodes:r.nodes,systemStatuses:r.systemStatuses,tasks:r.tasks,onRaw:t,refresh:n});if(l==="nodes"&&u==="docker")return $(tC,{nodes:r.nodes,dockerStatuses:r.dockerStatuses,onRaw:t});if(l==="nodes"&&u==="gateway")return $(rC,{nodes:r.nodes,tasks:r.tasks,onRaw:t});if(l==="nodes"&&u==="labels")return $(RP,{nodes:r.nodes});if(l==="nodes"&&u==="heartbeats")return $(xP,{nodes:r.nodes});if(l==="tasks"&&u==="dispatch")return $(cC,{nodes:r.nodes,onDispatched:n,onRaw:t});if(l==="tasks"&&u==="scheduled")return $(QC,{schedules:r.schedules,scheduleRuns:r.scheduleRuns,nodes:r.nodes,refresh:n,onRaw:t});if(l==="tasks"&&u==="pending")return $(_C,{tasks:r.pendingTasks,onRaw:t});if(l==="tasks"&&u==="history")return $(AC,{tasks:r.tasks,onRaw:t});if(l==="tasks"&&u==="results")return $(FC,{tasks:r.tasks,onRaw:t});if(l==="apps"&&u==="catalog")return $(yC,{microservices:r.microservices,onRaw:t,onNavigate:i});if(l==="apps"&&u==="todo-note")return $(pG,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="findjob")return $(Um,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="pipeline")return $(wG,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="met-nonlinear")return $(Lm,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="claudeqq")return $(DU,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="baidu-netdisk")return $(ZU,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="filebrowser")return $(Jm,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="oa-event-flow")return $(Bm,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="k3sctl")return $(DG,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl,onNavigate:i});if(l==="apps"&&u==="code-queue")return $(um,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl,initialTasksData:wP});if(l==="apps"&&u==="mdtodo")return $(Km,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="decision-center")return $($m,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="project-manager")return $(GG,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="config"&&u==="topology")return $(mC,{data:r});if(l==="config"&&u==="auth")return $(wC,{session:f});if(l==="config"&&u==="security")return $(qC);return $(wu,{title:"未找到页面",text:"请选择左侧主模块和顶部子功能标签"})}function GC({session:l,onLogout:u}){let r=G5(Cf,window.location.pathname),[f,n]=Il(r.moduleId),[t,i]=Il({...z1,[r.moduleId]:r.tabId}),[y,c]=Il({overview:null,nodes:[],systemStatuses:[],dockerStatuses:[],microservices:[],events:[],tasks:[],pendingTasks:[],schedules:[],scheduleRuns:[],logs:[]}),[_,A]=Il({ok:!1,text:"连接中"}),[F,j]=Il(null),[N,U]=Il(new Date),[w,G]=Il(null),[J,Q]=Il(!1),[m,q]=Il(!1),W=Ni.default.useRef(!1),p=Cf.moduleById[f]||Cf.modules[0],O=t[f]||z1[f]||p.tabs[0].id,Z=Array.isArray(y.microservices)?y.microservices:[],V=Z.length===0&&f==="apps"&&O==="code-queue"?[qP]:Z,P=V===Z?y:{...y,microservices:V},H=f==="apps"?V.find((h)=>String(h?.id||"")===(O==="k3sctl"?"k3sctl-adapter":O)):null,B=H?iW(H):{},C=p.tabs.find((h)=>h.id===O)?.label||O,E=H?[{key:"microservice",label:"用户服务",value:`${C} ${B.providerStatus==="online"?"在线":B.providerStatus||"未知"}`,tone:B.providerStatus==="online"?"ok":"warn",testId:"active-microservice-status"}]:[];async function D(){if(W.current)return;W.current=!0,q(!0);try{let h=[],s=(wl,El)=>{h.push([wl,Tl(El)])},ul=f==="ops"&&O==="status",tl=ul||f==="config"&&O==="topology",Al=ul||f==="nodes"||f==="tasks"&&(O==="dispatch"||O==="scheduled"),Kl=f==="apps"&&O!=="code-queue";if(tl)s("overview",`${vl.apiBaseUrl}/overview`);if(Al)s("nodes",`${vl.apiBaseUrl}/nodes`);if(f==="nodes"&&O==="monitor")s("systemStatuses",`${vl.apiBaseUrl}/nodes/system-status?limit=60`),s("tasks",`${vl.apiBaseUrl}/tasks?limit=120&summary=1`);else if(f==="nodes"&&O==="docker")s("dockerStatuses",`${vl.apiBaseUrl}/nodes/docker-status`);else if(f==="nodes"&&O==="gateway")s("tasks",`${vl.apiBaseUrl}/tasks?limit=300&summary=1`);else if(f==="tasks"&&O==="scheduled")s("schedules",`${vl.apiBaseUrl}/schedules?limit=100`),s("scheduleRuns",`${vl.apiBaseUrl}/schedules/runs?limit=100`);else if(f==="tasks"&&O==="pending")s("pendingTasks",`${vl.apiBaseUrl}/tasks?status=pending&limit=100&summary=1`);else if(f==="tasks"&&(O==="history"||O==="results"))s("tasks",`${vl.apiBaseUrl}/tasks?limit=300&summary=1`);else if(ul)s("tasks",`${vl.apiBaseUrl}/tasks?limit=8&lite=1`),s("pendingTasks",`${vl.apiBaseUrl}/tasks?status=pending&limit=20&lite=1`);if(Kl)s("microservices",`${vl.apiBaseUrl}/microservices`);if(f==="ops"&&O==="events")s("events",`${vl.apiBaseUrl}/events?limit=100`);if(f==="ops"&&O==="logs")s("logs","/logs?limit=100");await Promise.all(h.map(async([wl,El])=>{let M=await El,d={};if(wl==="overview")d.overview=M;if(wl==="nodes")d.nodes=M.nodes||[];if(wl==="systemStatuses")d.systemStatuses=M.systemStatuses||[];if(wl==="dockerStatuses")d.dockerStatuses=M.dockerStatuses||[];if(wl==="microservices")d.microservices=M.microservices||[];if(wl==="events")d.events=M.events||[];if(wl==="tasks")d.tasks=M.tasks||[];if(wl==="pendingTasks")d.pendingTasks=M.tasks||[];if(wl==="schedules")d.schedules=M.schedules||[];if(wl==="scheduleRuns")d.scheduleRuns=M.runs||[];if(wl==="logs")d.logs=M.logs||[];c((nl)=>({...nl,...d}))})),A({ok:!0,text:"核心在线"}),j(new Date)}catch(h){if(A({ok:!1,text:zl(h,"连接失败")}),h.status===401)u(!1)}finally{W.current=!1,q(!1)}}Bn(()=>{let h=()=>{if(!XG())return;D()};h();let s=setInterval(h,GP(f,O)),ul=()=>{if(XG())h()};return document.addEventListener("visibilitychange",ul),()=>{clearInterval(s),document.removeEventListener("visibilitychange",ul)}},[f,O]),Bn(()=>{let h=setInterval(()=>U(new Date),1000);return()=>clearInterval(h)},[]),Bn(()=>{let h=Om(Cf,window.location.pathname);if(h&&window.location.pathname!==h)window.history.replaceState(null,"",h)},[]),Bn(()=>{let h=()=>{let s=G5(Cf,window.location.pathname);n(s.moduleId),i((ul)=>({...ul,[s.moduleId]:s.tabId})),G(null)};return window.addEventListener("popstate",h),()=>window.removeEventListener("popstate",h)},[]),Bn(()=>{window.scrollTo({top:0,left:0,behavior:"auto"})},[f,O]);function Y(h,s,ul="push"){let tl=Cf.moduleById[h]?h:Cf.fallbackTarget.moduleId,Al=Cf.moduleById[tl]?.tabs.some((wl)=>wl.id===s)?s:z1[tl]||Cf.moduleById[tl]?.tabs[0]?.id||Cf.fallbackTarget.tabId;n(tl),i((wl)=>({...wl,[tl]:Al}));let Kl=e3(Cf,tl,Al);if(window.location.pathname!==Kl){let wl=ul==="replace"?"replaceState":"pushState";window.history[wl](null,"",Kl)}}function v(h,s){G({title:h,data:s})}let[K,X]=Il(!1),{unreadCount:I,notifications:o}=Xr(),fl=o.length>0?o[o.length-1]:null,yl=IG(YG);return $("div",{className:`shell ${J?"rail-collapsed":""} ${yl?"dev-shell":""}`,"data-testid":"app-shell"},$(YP,{activeModule:f,activeTabs:t,onNavigate:Y,collapsed:J,onToggle:()=>Q((h)=>!h)}),$("main",{className:"workspace"},$(VP,{connection:_,lastRefresh:F,onRefresh:D,onLogout:()=>u(!0),session:l,clock:N,activeStatusItems:E,onNotificationToggle:()=>X((h)=>!h),unreadCount:I,environment:YG}),$(XP,{module:p,activeTab:O,onNavigate:Y}),$(Nj.Provider,{value:m},$(LC,{activeModule:f,activeTab:O,data:P,session:l,refresh:D,onRaw:v,onNavigate:Y}))),$(BP,{raw:w,onClose:()=>G(null)}),fl&&$(SG,{key:fl.id,notification:fl}),K&&$(VG,{onClose:()=>X(!1)}))}function WC(){let[l,u]=Il(!0),[r,f]=Il(null);async function n(){u(!0);try{let i=await Tl("/api/session");f(i.authenticated?i:null)}catch{f(null)}finally{u(!1)}}async function t(i){if(i)try{await Tl("/logout",{method:"POST"})}catch{}f(null)}if(Bn(()=>{n()},[]),l)return $("main",{className:"loading-screen"},$("div",{className:"brand-mark"},"UD"),$("span",null,"加载会话"));if(!r)return $(DP,{onLogin:f});return $(OU,null,$(GC,{session:r,onLogout:t}))}var jW=document.getElementById("root");if(jW===null)throw Error("root element not found");gG.createRoot(jW).render($(WC));})(); diff --git a/src/components/frontend/public/style.css b/src/components/frontend/public/style.css index 07b3937a..facd02ec 100644 --- a/src/components/frontend/public/style.css +++ b/src/components/frontend/public/style.css @@ -2173,13 +2173,18 @@ input:focus, select:focus, textarea:focus { border-color: var(--accent-2); } border-color: rgba(78, 183, 168, 0.50); color: var(--accent-2); } -.codex-trace-status-chip.liveness.warn { +.codex-trace-status-chip.liveness.warn, +.codex-trace-status-chip.liveness.degraded-live { border-color: rgba(215, 161, 58, 0.55); color: #ffe0a2; background: linear-gradient(135deg, rgba(215, 161, 58, 0.13), rgba(78, 183, 168, 0.06)), rgba(0,0,0,0.18); } +.codex-trace-status-chip.liveness.degraded-live { + border-color: rgba(215, 161, 58, 0.62); + box-shadow: inset 0 0 0 1px rgba(78, 183, 168, 0.10); +} .codex-trace-status-chip.liveness.failed { border-color: rgba(255, 98, 98, 0.58); color: #ffb2b2; @@ -2204,9 +2209,15 @@ input:focus, select:focus, textarea:focus { border-color: var(--accent-2); } linear-gradient(135deg, rgba(78, 183, 168, 0.08), rgba(255,255,255,0.015)), rgba(0,0,0,0.16); } -.codex-liveness-metric.warn { +.codex-liveness-metric.warn, +.codex-liveness-metric.degraded-live { border-color: rgba(215, 161, 58, 0.44); } +.codex-liveness-metric.degraded-live { + background: + linear-gradient(135deg, rgba(215, 161, 58, 0.12), rgba(78, 183, 168, 0.05)), + rgba(0,0,0,0.16); +} .codex-liveness-metric.failed { border-color: rgba(255, 98, 98, 0.46); } @@ -2252,16 +2263,23 @@ input:focus, select:focus, textarea:focus { border-color: var(--accent-2); } min-width: 0; overflow-wrap: anywhere; } -.codex-liveness-advisory.warn { +.codex-liveness-advisory.warn, +.codex-liveness-advisory.degraded-live { border-color: rgba(215, 161, 58, 0.42); background: rgba(215, 161, 58, 0.07); } -.codex-liveness-advisory.warn b { color: var(--warn); } +.codex-liveness-advisory.warn b, +.codex-liveness-advisory.degraded-live b { color: var(--warn); } .codex-liveness-advisory.failed { border-color: rgba(255, 98, 98, 0.46); background: rgba(207, 106, 84, 0.09); } .codex-liveness-advisory.failed b { color: #ffb2b2; } +.codex-liveness-advisory code { + max-width: 100%; + color: var(--text); + overflow-wrap: anywhere; +} .codex-liveness-reasons { display: flex; flex-wrap: wrap; diff --git a/src/components/frontend/src/code-queue.tsx b/src/components/frontend/src/code-queue.tsx index 1413b26c..f6719497 100644 --- a/src/components/frontend/src/code-queue.tsx +++ b/src/components/frontend/src/code-queue.tsx @@ -249,11 +249,12 @@ function diagnosticsHeartbeatRiskTaskIds(diagnostics: any): string[] { } function splitBrainLiveDiagnostics(diagnostics: any): boolean { + if (diagnosticsHeartbeatRiskTaskIds(diagnostics).length > 0) return false; if (typeof diagnostics?.splitBrainLive === "boolean") return diagnostics.splitBrainLive; const state = String(diagnostics?.state || diagnostics?.health || "").toLowerCase(); + const effective = String(diagnostics?.effectiveLiveness || "").toLowerCase(); return state === "split-brain" - && stringArray(diagnostics?.heartbeatFreshTaskIds).length > 0 - && diagnosticsHeartbeatRiskTaskIds(diagnostics).length === 0; + && (effective === "live" || stringArray(diagnostics?.heartbeatFreshTaskIds).length > 0); } function diagnosticsEffectiveLiveness(diagnostics: any): string { @@ -267,11 +268,15 @@ function diagnosticsEffectiveLiveness(diagnostics: any): string { function diagnosticsTone(diagnostics: any): string { const effective = diagnosticsEffectiveLiveness(diagnostics); + const heartbeatRiskTaskIds = diagnosticsHeartbeatRiskTaskIds(diagnostics); + const state = String(diagnostics?.state || diagnostics?.health || "unknown").toLowerCase(); + if (heartbeatRiskTaskIds.length > 0 || effective === "at-risk" || state === "stale-active") return "failed"; + if (splitBrainLiveDiagnostics(diagnostics)) return "degraded-live"; if (effective === "live" || effective === "degraded") return "warn"; - if (effective === "at-risk") return "failed"; + if (["dead", "failed", "stale", "unhealthy"].includes(effective)) return "failed"; const value = String(diagnostics?.state || diagnostics?.health || "unknown").toLowerCase(); if (value === "healthy") return "ok"; - if (value === "stale-active") return "failed"; + if (value === "split-brain") return "warn"; if (value === "degraded") return "warn"; return "unknown"; } @@ -1878,7 +1883,7 @@ function CodeQueueLivenessPanel({ diagnostics, queue, onRaw }: AnyRecord) { const effectiveLiveness = diagnosticsEffectiveLiveness(diagnostics); const recommendedAction = String(diagnostics?.recommendedAction || (heartbeatRiskTaskIds.length > 0 ? "investigate-heartbeat-risk" : splitBrainLive ? "continue-supervision" : effectiveLiveness === "degraded" ? "observe-degraded" : "none")); const livenessText = String(splitBrainLive - ? "执行面 heartbeat 新鲜,任务仍应继续监督。" + ? "控制面/执行面观测分裂,但 heartbeat/trace 新鲜,继续监督。" : heartbeatRiskTaskIds.length > 0 ? "存在 expired/missing/stale heartbeat 风险,请先确认执行面状态。" : diagnostics?.livenessSummary || (effectiveLiveness === "degraded" @@ -1906,7 +1911,7 @@ function CodeQueueLivenessPanel({ diagnostics, queue, onRaw }: AnyRecord) { h(LivenessMetric, { label: "PostgreSQL active", value: String(diagnostics?.databaseActiveTaskCount ?? queue?.databaseActiveTaskCount ?? 0), hint: compactIdList(diagnostics?.databaseActiveTaskIds ?? queue?.databaseActiveTaskIds) }), h(LivenessMetric, { label: "Scheduler active", value: String(diagnostics?.schedulerActiveRunSlotCount ?? queue?.activeRunSlotCount ?? 0), hint: compactIdList(diagnostics?.schedulerActiveTaskIds ?? queue?.activeTaskIds) }), h(LivenessMetric, { label: "Fresh heartbeat", value: String(stringArray(diagnostics?.heartbeatFreshTaskIds).length), hint: compactIdList(diagnostics?.heartbeatFreshTaskIds) }), - h(LivenessMetric, { tone: heartbeatRiskTaskIds.length > 0 ? "failed" : splitBrainLive ? "warn" : "", label: "Heartbeat risk", value: String(heartbeatRiskTaskIds.length), hint: heartbeatRiskTaskIds.length > 0 ? compactIdList(heartbeatRiskTaskIds) : splitBrainLive ? "fresh heartbeat: keep supervising" : "--" }), + h(LivenessMetric, { tone: heartbeatRiskTaskIds.length > 0 ? "failed" : splitBrainLive ? "degraded-live" : "", label: "Heartbeat risk", value: String(heartbeatRiskTaskIds.length), hint: heartbeatRiskTaskIds.length > 0 ? compactIdList(heartbeatRiskTaskIds) : splitBrainLive ? "fresh heartbeat/trace: keep supervising" : "--" }), h(LivenessMetric, { tone: stringArray(diagnostics?.traceGapNotStaleTaskIds).length > 0 ? "warn" : "", label: "Trace gap", value: String(stringArray(diagnostics?.traceGapTaskIds).length), hint: compactIdList(diagnostics?.traceGapNotStaleTaskIds) }), h(LivenessMetric, { tone: stringArray(diagnostics?.staleRecoveryCandidateTaskIds).length > 0 ? "failed" : "", label: "Stale candidates", value: String(stringArray(diagnostics?.staleRecoveryCandidateTaskIds).length), hint: compactIdList(diagnostics?.staleRecoveryCandidateTaskIds) }), h(LivenessMetric, { label: "Last scheduler heartbeat", value: fmtRelativeAge(diagnostics?.lastSchedulerHeartbeatAt), hint: String(diagnostics?.lastSchedulerHeartbeatAt || "--") }), @@ -1917,6 +1922,7 @@ function CodeQueueLivenessPanel({ diagnostics, queue, onRaw }: AnyRecord) { h("div", { className: `codex-liveness-advisory ${tone}` }, h("b", null, splitBrainLive ? "Observing split" : heartbeatRiskTaskIds.length > 0 ? "Heartbeat risk" : "Liveness note"), h("span", null, livenessText), + h("code", null, recommendedAction), ), reasons.length > 0 ? h("div", { className: "codex-liveness-reasons" }, reasons.map((reason: string) => h("span", { key: reason }, reason))) : null, ); diff --git a/src/components/microservices/code-queue/Dockerfile b/src/components/microservices/code-queue/Dockerfile index 90a41873..54153229 100644 --- a/src/components/microservices/code-queue/Dockerfile +++ b/src/components/microservices/code-queue/Dockerfile @@ -55,6 +55,9 @@ COPY package.json /app/package.json COPY bun.lock /app/bun.lock RUN bun install COPY src/components/shared /app/src/components/shared +COPY src/components/frontend/package.json /app/src/components/frontend/package.json +WORKDIR /app/src/components/frontend +RUN test -d node_modules/react || bun install WORKDIR /app/src/components/microservices/code-queue COPY src/components/microservices/code-queue/tsconfig.json ./tsconfig.json COPY src/components/microservices/code-queue/src ./src