From 4bb33d0d52b87600b8d6ca6df35fde39bf8c610b Mon Sep 17 00:00:00 2001 From: Codex Date: Wed, 20 May 2026 03:54:02 +0000 Subject: [PATCH] fix: sync code queue retry trace display --- scripts/src/e2e.ts | 323 ++++++++++++++++++++- src/components/frontend/public/app.js | 175 ++++++----- src/components/frontend/public/style.css | 16 + src/components/frontend/src/code-queue.tsx | 211 ++++++++++++-- 4 files changed, 615 insertions(+), 110 deletions(-) diff --git a/scripts/src/e2e.ts b/scripts/src/e2e.ts index e063cd92..d0cd5027 100644 --- a/scripts/src/e2e.ts +++ b/scripts/src/e2e.ts @@ -155,6 +155,9 @@ const FRONTEND_CHECK_NAMES = [ "frontend:code-queue-trace-full-load", "frontend:code-queue-judge-wrap", "frontend:code-queue-error-red-markers", + "frontend:code-queue-retry-attempt-trace-current", + "frontend:code-queue-step-missing-diagnostic", + "frontend:code-queue-judge-feedback-attempt-order", "frontend:claudeqq-integrated-visible", "frontend:url-route-deeplink", "frontend:pipeline-integrated-visible", @@ -978,6 +981,288 @@ async function runCodeQueueLongPromptObservation(page: Page): Promise { }; } +async function runCodeQueueRetryTraceFixture(page: Page, frontendUrl: string): Promise { + const taskId = "codex_2000000000000_issue12_retry_fixture"; + const now = new Date().toISOString(); + const attempt1Started = "2026-05-20T03:00:00.000Z"; + const attempt1Finished = "2026-05-20T03:04:00.000Z"; + const attempt2Started = "2026-05-20T03:05:00.000Z"; + const traceRequests: string[] = []; + const promptRequests: string[] = []; + const task = { + id: taskId, + queueId: "issue12-fixture", + queueEnteredAt: attempt2Started, + displayPrompt: "Issue #12 retry current attempt fixture", + basePrompt: "Issue #12 retry current attempt fixture", + displayPromptPreview: "Issue #12 retry current attempt fixture", + providerId: "D601-dev", + executionMode: "default", + cwd: "/workspace-dev", + model: "gpt-5.5", + maxAttempts: 99, + status: "running", + createdAt: "2026-05-20T02:59:00.000Z", + updatedAt: now, + startedAt: attempt1Started, + finishedAt: null, + currentAttempt: 2, + currentMode: "retry", + codexThreadId: "thread_issue12_fixture", + activeTurnId: "turn_issue12_attempt_2", + finalResponse: "", + lastJudge: { + decision: "retry", + confidence: 0.82, + reason: "Attempt 1 judge: missing live verification.", + continuePrompt: "Continue with attempt 2 and gather live trace evidence.", + source: "fixture", + }, + stepCount: 0, + llmStepCount: 0, + outputCount: 0, + eventCount: 0, + attemptCount: 1, + attempts: [{ + index: 1, + mode: "initial", + startedAt: attempt1Started, + finishedAt: attempt1Finished, + terminalStatus: "completed", + finalResponsePreview: "Attempt 1 stopped after planning.", + finalResponseChars: 33, + judge: { + decision: "retry", + confidence: 0.82, + reason: "Attempt 1 judge: missing live verification.", + continuePrompt: "Continue with attempt 2 and gather live trace evidence.", + source: "fixture", + }, + feedbackPromptPreview: "Continue with attempt 2 and gather live trace evidence.", + feedbackPromptChars: 56, + feedbackPromptLines: 1, + feedbackPromptSource: "judge-continue-prompt", + feedbackPromptForAttempt: 2, + statsSource: "unavailable", + traceStats: null, + execution: { + durationMs: 240000, + traceLineCount: 5, + stepCount: 5, + editedFiles: [], + commands: ["bun test"], + statsSource: "unavailable", + traceStats: null, + }, + }], + summaryOnly: true, + promptEditable: false, + timing: { durationMs: 330000, totalElapsedMs: 390000 }, + }; + const summary = { + id: taskId, + taskId, + queueId: "issue12-fixture", + status: "running", + providerId: "D601-dev", + executionMode: "default", + model: "gpt-5.5", + cwd: "/workspace-dev", + createdAt: task.createdAt, + startedAt: task.startedAt, + finishedAt: null, + updatedAt: now, + currentAttempt: 2, + maxAttempts: 99, + stepCount: null, + llmStepCount: null, + retainedStepCount: 0, + traceStats: null, + statsSource: "unavailable", + prompt: { + basePrompt: task.basePrompt, + basePromptLines: 1, + promptChars: task.basePrompt.length, + promptLines: 1, + }, + execution: { + durationMs: 390000, + traceLineCount: 0, + stepCount: null, + editedFiles: [], + commands: [], + statsSource: "unavailable", + traceStats: null, + }, + finalResponse: "", + lastJudge: task.lastJudge, + attempts: task.attempts, + timing: task.timing, + }; + const overview = { + ok: true, + queue: { + activeTaskId: taskId, + activeTaskIds: [taskId], + total: 1, + unreadTerminal: 0, + counts: { running: 1, queued: 0, retry_wait: 0, judging: 0 }, + queues: [{ id: "issue12-fixture", name: "Issue 12 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: "默认容器/本机" }], + }, + 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 }, + }; + const attempt2Steps = [ + { + seq: 201, + at: "2026-05-20T03:05:20.000Z", + kind: "message", + title: "Assistant message", + status: "streaming", + rawSeqs: [201], + summaryLines: ["Attempt 2 running: fixture trace is visible."], + hasDetail: true, + }, + { + seq: 202, + at: "2026-05-20T03:05:40.000Z", + kind: "ran", + title: "Ran bun --check target files", + status: "running", + rawSeqs: [202], + summaryLines: ["Attempt 2 running command trace should appear before old judge."], + hasDetail: true, + }, + ]; + const routePattern = "**/api/microservices/code-queue/proxy/api/**"; + 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, ""); + 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 }) }); + return; + } + if (path === `/api/tasks/${encodeURIComponent(taskId)}/trace-steps` || path === `/api/tasks/${taskId}/trace-steps`) { + traceRequests.push(url.search); + const attempt = url.searchParams.get("attempt") || ""; + const steps = attempt === "2" ? attempt2Steps : []; + await route.fulfill({ status: 200, contentType: "application/json", body: JSON.stringify({ ok: true, taskId, attempt: attempt ? Number(attempt) : null, source: "fixture", steps, total: steps.length, hasMore: false, nextAfterSeq: steps.at(-1)?.seq || 0 }) }); + return; + } + if (path === `/api/tasks/${encodeURIComponent(taskId)}/prompt` || path === `/api/tasks/${taskId}/prompt`) { + promptRequests.push(url.search); + await route.fulfill({ status: 200, contentType: "application/json", body: JSON.stringify({ ok: true, part: url.searchParams.get("part"), attempt: Number(url.searchParams.get("attempt") || 0), text: "Continue with attempt 2 and gather live trace evidence.", chars: 56, lines: 1, forAttempt: 2 }) }); + 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 }); + await page.waitForSelector(`[data-testid="codex-task-${taskId}"]`, { timeout: 15000 }); + await page.waitForSelector('[data-testid="codex-execution-summary-current"]', { timeout: 15000 }); + await page.waitForFunction(() => { + const current = document.querySelector('[data-testid="codex-execution-summary-current"]') as HTMLDetailsElement | null; + const text = current?.textContent || ""; + return current?.getAttribute("data-attempt-index") === "2" + && current?.getAttribute("data-running") === "true" + && text.includes("Attempt 2 running"); + }, undefined, { timeout: 15000 }); + const beforeExpand = await page.evaluate((id) => { + const card = document.querySelector(`[data-testid="codex-task-${id}"]`) as HTMLElement | null; + const current = document.querySelector('[data-testid="codex-execution-summary-current"]') as HTMLElement | null; + const attempt1Judge = document.querySelector('[data-testid="codex-progressive-judge-attempt-1"]') as HTMLElement | null; + const feedback = document.querySelector('[data-testid="codex-judge-feedback-prompt-attempt-1"]') as HTMLElement | null; + const currentStep = document.querySelector('[data-testid="codex-execution-summary-current-step-count"]') as HTMLElement | null; + const root = document.querySelector('[data-testid="codex-output"]') as HTMLElement | null; + const order = ["codex-execution-summary-current", "codex-progressive-judge-attempt-1", "codex-judge-feedback-prompt-attempt-1"] + .map((testId) => { + const element = document.querySelector(`[data-testid="${testId}"]`); + return element && root ? Array.prototype.indexOf.call(root.querySelectorAll("[data-testid]"), element) : -1; + }); + return { + cardText: card?.innerText || "", + cardAttemptVisible: (card?.innerText || "").includes("2/99"), + cardStepText: card?.querySelector('[data-testid^="codex-task-step-count-"]')?.textContent || "", + cardStepState: card?.querySelector('[data-testid^="codex-task-step-count-"]')?.getAttribute("data-step-state") || "", + currentText: current?.textContent || "", + currentAttempt: current?.getAttribute("data-attempt-index") || "", + currentRunning: current?.getAttribute("data-running") || "", + currentStepText: currentStep?.textContent || "", + currentStepState: currentStep?.getAttribute("data-step-state") || "", + attempt1JudgeText: attempt1Judge?.textContent || "", + feedbackText: feedback?.textContent || "", + currentBeforeJudge: order[0] >= 0 && order[1] >= 0 && order[0] < order[1], + judgeBeforeFeedback: order[1] >= 0 && order[2] >= 0 && order[1] < order[2], + currentJudgeMissing: document.querySelector('[data-testid="codex-progressive-judge-current"]') === null, + legacyCurrentAliasMissing: document.querySelector('[data-testid="codex-progressive-judge"]') === null || (document.querySelector('[data-testid="codex-progressive-judge"]') as HTMLElement | null)?.getAttribute("data-attempt-index") !== "2", + }; + }, taskId); + await page.locator('[data-testid="codex-judge-feedback-prompt-attempt-1"] summary').click(); + await page.waitForFunction(() => (document.querySelector('[data-testid="codex-judge-feedback-prompt-attempt-1"]') as HTMLDetailsElement | null)?.open === true, undefined, { timeout: 5000 }); + const feedbackText = await page.getByTestId("codex-judge-feedback-prompt-attempt-1-text").innerText({ timeout: 5000 }); + const currentStepRows = await page.locator('[data-testid="codex-execution-summary-current"] .codex-trace-step').count(); + return { + checked: true, + taskId, + fixture: { + cardAttempt: "2/99", + summaryAttempts: summary.attempts.length, + attempt2Steps: attempt2Steps.length, + }, + beforeExpand, + currentStepRows, + traceRequests, + promptRequests, + feedbackText, + ok: beforeExpand.cardAttemptVisible === true + && beforeExpand.currentAttempt === "2" + && beforeExpand.currentRunning === "true" + && beforeExpand.currentText.includes("Attempt 2 running") + && beforeExpand.currentBeforeJudge === true + && beforeExpand.judgeBeforeFeedback === true + && beforeExpand.currentJudgeMissing === true + && beforeExpand.cardStepText !== "STEP --" + && beforeExpand.currentStepText !== "STEP --" + && ["syncing", "raw-trace"].includes(beforeExpand.cardStepState) + && ["syncing", "raw-trace"].includes(beforeExpand.currentStepState) + && currentStepRows >= 2 + && traceRequests.some((search) => search.includes("attempt=2")) + && promptRequests.some((search) => search.includes("part=feedback") && search.includes("attempt=1")) + && feedbackText.includes("Continue with attempt 2"), + }; + } 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", @@ -1885,6 +2170,9 @@ async function frontendCheck(config: UniDeskConfig, urls: PublicUrls, checks: E2 "frontend:code-queue-trace-full-load", "frontend:code-queue-judge-wrap", "frontend:code-queue-error-red-markers", + "frontend:code-queue-retry-attempt-trace-current", + "frontend:code-queue-step-missing-diagnostic", + "frontend:code-queue-judge-feedback-attempt-order", ]); const needCodeQueueFullSurface = wantsAny([ "frontend:code-queue-integrated-visible", @@ -1895,6 +2183,11 @@ async function frontendCheck(config: UniDeskConfig, urls: PublicUrls, checks: E2 "frontend:code-queue-judge-wrap", "frontend:code-queue-error-red-markers", ]); + const needCodeQueueRetryTraceFixture = wantsAny([ + "frontend:code-queue-retry-attempt-trace-current", + "frontend:code-queue-step-missing-diagnostic", + "frontend:code-queue-judge-feedback-attempt-order", + ]); const needClaudeqq = wants("frontend:claudeqq-integrated-visible"); const needRouteDeepLink = wants("frontend:url-route-deeplink"); const needPipeline = wantsAny([ @@ -2004,6 +2297,7 @@ async function frontendCheck(config: UniDeskConfig, urls: PublicUrls, checks: E2 let codexTraceFullMetrics: any = { candidateFound: false }; let codexJudgeWrapMetrics: any = { checked: false }; let codeQueueErrorHighlightMetrics: any = { checked: false, candidateFound: false }; + let codeQueueRetryTraceFixtureMetrics: any = { checked: false }; let claudeqqText = ""; let routeDeepLinkText = ""; let routeInitialPath = ""; @@ -3002,10 +3296,13 @@ async function frontendCheck(config: UniDeskConfig, urls: PublicUrls, checks: E2 const cards = Array.from(document.querySelectorAll('[data-testid^="codex-task-codex_"]')).map((node) => (node as HTMLElement).innerText); return cards.length === 0 || cards.every((text) => text.includes(`queue=${queueId}`)); }, targetQueueId, { timeout: 15000 }); - codeQueueSwitchMetrics = { ...codeQueueSwitchMetrics, targetQueueId, switched: true }; + codeQueueSwitchMetrics = { ...codeQueueSwitchMetrics, targetQueueId, switched: true }; await page.getByTestId("code-queue-filter-select").selectOption("__all__"); } } + if (needCodeQueueRetryTraceFixture) { + codeQueueRetryTraceFixtureMetrics = await runCodeQueueRetryTraceFixture(page, urls.frontendUrl); + } if (needClaudeqq) { await page.getByRole("button", { name: /ClaudeQQ/ }).click(); await page.waitForSelector('[data-testid="claudeqq-page"]', { timeout: 10000 }); @@ -3664,6 +3961,30 @@ async function frontendCheck(config: UniDeskConfig, urls: PublicUrls, checks: E2 addSelectedCheck(checks, options, "frontend:code-queue-judge-wrap", codexJudgeWrapMetrics.checked === true && codexJudgeWrapMetrics.ok === true, { codexJudgeWrapMetrics }); + addSelectedCheck(checks, options, "frontend:code-queue-retry-attempt-trace-current", + codeQueueRetryTraceFixtureMetrics.checked === true + && codeQueueRetryTraceFixtureMetrics.ok === true + && codeQueueRetryTraceFixtureMetrics.beforeExpand?.cardAttemptVisible === true + && codeQueueRetryTraceFixtureMetrics.beforeExpand?.currentAttempt === "2" + && codeQueueRetryTraceFixtureMetrics.beforeExpand?.currentRunning === "true" + && Number(codeQueueRetryTraceFixtureMetrics.currentStepRows || 0) >= 2 + && (codeQueueRetryTraceFixtureMetrics.traceRequests || []).some((search: string) => String(search).includes("attempt=2")), + { codeQueueRetryTraceFixtureMetrics }); + addSelectedCheck(checks, options, "frontend:code-queue-step-missing-diagnostic", + codeQueueRetryTraceFixtureMetrics.checked === true + && codeQueueRetryTraceFixtureMetrics.beforeExpand?.cardStepText !== "STEP --" + && codeQueueRetryTraceFixtureMetrics.beforeExpand?.currentStepText !== "STEP --" + && ["syncing", "raw-trace"].includes(String(codeQueueRetryTraceFixtureMetrics.beforeExpand?.cardStepState || "")) + && ["syncing", "raw-trace"].includes(String(codeQueueRetryTraceFixtureMetrics.beforeExpand?.currentStepState || "")), + { codeQueueRetryTraceFixtureMetrics }); + addSelectedCheck(checks, options, "frontend:code-queue-judge-feedback-attempt-order", + codeQueueRetryTraceFixtureMetrics.checked === true + && codeQueueRetryTraceFixtureMetrics.beforeExpand?.currentBeforeJudge === true + && codeQueueRetryTraceFixtureMetrics.beforeExpand?.judgeBeforeFeedback === true + && codeQueueRetryTraceFixtureMetrics.beforeExpand?.currentJudgeMissing === true + && String(codeQueueRetryTraceFixtureMetrics.feedbackText || "").includes("Continue with attempt 2") + && (codeQueueRetryTraceFixtureMetrics.promptRequests || []).some((search: string) => String(search).includes("part=feedback") && String(search).includes("attempt=1")), + { codeQueueRetryTraceFixtureMetrics }); addSelectedCheck(checks, options, "frontend:claudeqq-integrated-visible", claudeqqTextLower.includes("claudeqq 工作台") && claudeqqText.includes("D601") && claudeqqText.includes("D601 k3s Service") && claudeqqText.includes("k3s://unidesk/claudeqq") && claudeqqText.includes("QQ 事件订阅") && claudeqqText.includes("消息推送") && claudeqqText.includes("事件缓存") && claudeqqText.includes("主用户私聊账号") && claudeqqText.includes("645275593") && claudeqqTextLower.includes("napcat 容器登录") && claudeqqText.includes("已登录") && /health\s+ok/i.test(claudeqqText) && claudeqqText.includes("仅 UniDesk frontend 代理访问") && !claudeqqText.includes("{\n"), { claudeqqTextPreview: claudeqqText.slice(0, 1400) }); addSelectedCheck(checks, options, "frontend:url-route-deeplink", routeInitialPath === "/app/pipeline/" && routeDockerPath === "/nodes/docker/" && routeBackPath === "/app/pipeline/" && routeOverviewPath === "/ops/status/" && routeCodexPath === "/app/code-queue/" && routeDeepLinkText.toLowerCase().includes("pipeline v2 工作台".toLowerCase()) && routeOverviewText.includes("核心指标") && routeCodexShellMetrics.appShell === true && routeCodexShellMetrics.standalone === false && routeCodexShellMetrics.topbar === true && routeCodexShellMetrics.codexPage === true && String(routeCodexShellMetrics.railText || "").includes("用户服务") && String(routeCodexShellMetrics.tabsText || "").includes("Code Queue"), { routeInitialPath, routeDockerPath, routeBackIntermediatePath, routeBackPath, routeOverviewPath, routeCodexPath, routeCodexShellMetrics, routeDeepLinkPreview: routeDeepLinkText.slice(0, 1200), routeOverviewPreview: routeOverviewText.slice(0, 800) }); addSelectedCheck(checks, options, "frontend:pipeline-integrated-visible", diff --git a/src/components/frontend/public/app.js b/src/components/frontend/public/app.js index a73267c0..86ba72f8 100644 --- a/src/components/frontend/public/app.js +++ b/src/components/frontend/public/app.js @@ -1,45 +1,60 @@ -(()=>{var GT=Object.create;var{getPrototypeOf:TT,defineProperty:j7,getOwnPropertyNames:mT}=Object;var KT=Object.prototype.hasOwnProperty;function zT(l){return this[l]}var ET,OT,Rl=(l,u,r)=>{var f=l!=null&&typeof l==="object";if(f){var n=u?ET??=new WeakMap:OT??=new WeakMap,i=n.get(l);if(i)return i}r=l!=null?GT(TT(l)):{};let t=u||!l||!l.__esModule?j7(r,"default",{value:l,enumerable:!0}):r;for(let y of mT(l))if(!KT.call(t,y))j7(t,y,{get:zT.bind(l,y),enumerable:!0});if(f)n.set(l,t);return t};var cf=(l,u)=>()=>(u||l((u={exports:{}}).exports,u),u.exports);var tu=((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 m7=cf((el)=>{var Iy=Symbol.for("react.element"),ZT=Symbol.for("react.portal"),pT=Symbol.for("react.fragment"),HT=Symbol.for("react.strict_mode"),BT=Symbol.for("react.profiler"),DT=Symbol.for("react.provider"),VT=Symbol.for("react.context"),ST=Symbol.for("react.forward_ref"),XT=Symbol.for("react.suspense"),YT=Symbol.for("react.memo"),PT=Symbol.for("react.lazy"),F7=Symbol.iterator;function CT(l){if(l===null||typeof l!=="object")return null;return l=F7&&l[F7]||l["@@iterator"],typeof l==="function"?l:null}var N7={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Q7=Object.assign,w7={};function Qt(l,u,r){this.props=l,this.context=u,this.refs=w7,this.updater=r||N7}Qt.prototype.isReactComponent={};Qt.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")};Qt.prototype.forceUpdate=function(l){this.updater.enqueueForceUpdate(this,l,"forceUpdate")};function q7(){}q7.prototype=Qt.prototype;function O6(l,u,r){this.props=l,this.context=u,this.refs=w7,this.updater=r||N7}var Z6=O6.prototype=new q7;Z6.constructor=O6;Q7(Z6,Qt.prototype);Z6.isPureReactComponent=!0;var J7=Array.isArray,W7=Object.prototype.hasOwnProperty,p6={current:null},L7={key:!0,ref:!0,__self:!0,__source:!0};function G7(l,u,r){var f,n={},i=null,t=null;if(u!=null)for(f in u.ref!==void 0&&(t=u.ref),u.key!==void 0&&(i=""+u.key),u)W7.call(u,f)&&!L7.hasOwnProperty(f)&&(n[f]=u[f]);var y=arguments.length-2;if(y===1)n.children=r;else if(1{K7.exports=m7()});var S7=cf((Wu)=>{function S6(l,u){var r=l.length;l.push(u);l:for(;0>>1,n=l[f];if(0>>1;fp_(y,r))cp_($,y)?(l[f]=$,l[c]=r,f=c):(l[f]=y,l[t]=r,f=t);else if(cp_($,r))l[f]=$,l[c]=r,f=c;else break l}}return u}function p_(l,u){var r=l.sortIndex-u.sortIndex;return r!==0?r:l.id-u.id}if(typeof performance==="object"&&typeof performance.now==="function")X6=performance,Wu.unstable_now=function(){return X6.now()};else H_=Date,Y6=H_.now(),Wu.unstable_now=function(){return H_.now()-Y6};var X6,H_,Y6,cn=[],Ai=[],kT=1,mf=null,Wr=3,S_=!1,J0=!1,oy=!1,p7=typeof setTimeout==="function"?setTimeout:null,H7=typeof clearTimeout==="function"?clearTimeout:null,Z7=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function P6(l){for(var u=hf(Ai);u!==null;){if(u.callback===null)V_(Ai);else if(u.startTime<=l)V_(Ai),u.sortIndex=u.expirationTime,S6(cn,u);else break;u=hf(Ai)}}function M6(l){if(oy=!1,P6(l),!J0)if(hf(cn)!==null)J0=!0,R6(h6);else{var u=hf(Ai);u!==null&&x6(M6,u.startTime-l)}}function h6(l,u){J0=!1,oy&&(oy=!1,H7(dy),dy=-1),S_=!0;var r=Wr;try{P6(u);for(mf=hf(cn);mf!==null&&(!(mf.expirationTime>u)||l&&!V7());){var f=mf.callback;if(typeof f==="function"){mf.callback=null,Wr=mf.priorityLevel;var n=f(mf.expirationTime<=u);u=Wu.unstable_now(),typeof n==="function"?mf.callback=n:mf===hf(cn)&&V_(cn),P6(u)}else V_(cn);mf=hf(cn)}if(mf!==null)var i=!0;else{var t=hf(Ai);t!==null&&x6(M6,t.startTime-u),i=!1}return i}finally{mf=null,Wr=r,S_=!1}}var X_=!1,B_=null,dy=-1,B7=5,D7=-1;function V7(){return Wu.unstable_now()-D7l||125f?(l.sortIndex=r,S6(Ai,l),hf(cn)===null&&l===hf(Ai)&&(oy?(H7(dy),dy=-1):oy=!0,x6(M6,r-f))):(l.sortIndex=n,S6(cn,l),J0||S_||(J0=!0,R6(h6))),l};Wu.unstable_shouldYield=V7;Wu.unstable_wrapCallback=function(l){var u=Wr;return function(){var r=Wr;Wr=u;try{return l.apply(this,arguments)}finally{Wr=r}}}});var Y7=cf((SP,X7)=>{X7.exports=S7()});var CU=cf((Jf)=>{var gT=Ju(),jf=Y7();function Ul(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"),A8=Object.prototype.hasOwnProperty,IT=/^[: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]*$/,P7={},C7={};function aT(l){if(A8.call(C7,l))return!0;if(A8.call(P7,l))return!1;if(IT.test(l))return C7[l]=!0;return P7[l]=!0,!1}function oT(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 dT(l,u,r,f){if(u===null||typeof u>"u"||oT(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 Sr(l,u,r,f,n,i,t){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=i,this.removeEmptyString=t}var Jr={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(l){Jr[l]=new Sr(l,0,!1,l,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(l){var u=l[0];Jr[u]=new Sr(u,1,!1,l[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(l){Jr[l]=new Sr(l,2,!1,l.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(l){Jr[l]=new Sr(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){Jr[l]=new Sr(l,3,!1,l.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(l){Jr[l]=new Sr(l,3,!0,l,null,!1,!1)});["capture","download"].forEach(function(l){Jr[l]=new Sr(l,4,!1,l,null,!1,!1)});["cols","rows","size","span"].forEach(function(l){Jr[l]=new Sr(l,6,!1,l,null,!1,!1)});["rowSpan","start"].forEach(function(l){Jr[l]=new Sr(l,5,!1,l.toLowerCase(),null,!1,!1)});var i4=/[\-:]([a-z])/g;function t4(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(i4,t4);Jr[u]=new Sr(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(i4,t4);Jr[u]=new Sr(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(i4,t4);Jr[u]=new Sr(u,1,!1,l,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(l){Jr[l]=new Sr(l,1,!1,l.toLowerCase(),null,!1,!1)});Jr.xlinkHref=new Sr("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(l){Jr[l]=new Sr(l,1,!1,l.toLowerCase(),null,!0,!0)});function y4(l,u,r,f){var n=Jr.hasOwnProperty(u)?Jr[u]:null;if(n!==null?n.type!==0:f||!(2y||n[t]!==i[y]){var c=` -`+n[t].replace(" at new "," at ");return l.displayName&&c.includes("")&&(c=c.replace("",l.displayName)),c}while(1<=t&&0<=y);break}}}finally{v6=!1,Error.prepareStackTrace=r}return(l=l?l.displayName||l.name:"")?t1(l):""}function eT(l){switch(l.tag){case 5:return t1(l.type);case 16:return t1("Lazy");case 13:return t1("Suspense");case 19:return t1("SuspenseList");case 0:case 2:case 15:return l=s6(l.type,!1),l;case 11:return l=s6(l.type.render,!1),l;case 1:return l=s6(l.type,!0),l;default:return""}}function U8(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 Lt:return"Fragment";case Wt:return"Portal";case j8:return"Profiler";case c4:return"StrictMode";case F8:return"Suspense";case J8:return"SuspenseList"}if(typeof l==="object")switch(l.$$typeof){case bF:return(l.displayName||"Context")+".Consumer";case xF:return(l._context.displayName||"Context")+".Provider";case _4:var u=l.render;return l=l.displayName,l||(l=u.displayName||u.name||"",l=l!==""?"ForwardRef("+l+")":"ForwardRef"),l;case $4:return u=l.displayName||null,u!==null?u:U8(l.type)||"Memo";case Fi:u=l._payload,l=l._init;try{return U8(l(u))}catch(r){}}return null}function lm(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 U8(u);case 8:return u===c4?"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 Ei(l){switch(typeof l){case"boolean":case"number":case"string":case"undefined":return l;case"object":return l;default:return""}}function sF(l){var u=l.type;return(l=l.nodeName)&&l.toLowerCase()==="input"&&(u==="checkbox"||u==="radio")}function um(l){var u=sF(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:i}=r;return Object.defineProperty(l,u,{configurable:!0,get:function(){return n.call(this)},set:function(t){f=""+t,i.call(this,t)}}),Object.defineProperty(l,u,{enumerable:r.enumerable}),{getValue:function(){return f},setValue:function(t){f=""+t},stopTracking:function(){l._valueTracker=null,delete l[u]}}}}function P_(l){l._valueTracker||(l._valueTracker=um(l))}function kF(l){if(!l)return!1;var u=l._valueTracker;if(!u)return!0;var r=u.getValue(),f="";return l&&(f=sF(l)?l.checked?"true":"false":l.value),l=f,l!==r?(u.setValue(l),!0):!1}function _$(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 N8(l,u){var r=u.checked;return Bu({},u,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:r!=null?r:l._wrapperState.initialChecked})}function h7(l,u){var r=u.defaultValue==null?"":u.defaultValue,f=u.checked!=null?u.checked:u.defaultChecked;r=Ei(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 gF(l,u){u=u.checked,u!=null&&y4(l,"checked",u,!1)}function Q8(l,u){gF(l,u);var r=Ei(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")?w8(l,u.type,r):u.hasOwnProperty("defaultValue")&&w8(l,u.type,Ei(u.defaultValue)),u.checked==null&&u.defaultChecked!=null&&(l.defaultChecked=!!u.defaultChecked)}function R7(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 w8(l,u,r){if(u!=="number"||_$(l.ownerDocument)!==l)r==null?l.defaultValue=""+l._wrapperState.initialValue:l.defaultValue!==""+r&&(l.defaultValue=""+r)}var y1=Array.isArray;function Bt(l,u,r,f){if(l=l.options,u){u={};for(var n=0;n"+u.valueOf().toString()+"";for(u=C_.firstChild;l.firstChild;)l.removeChild(l.firstChild);for(;u.firstChild;)l.appendChild(u.firstChild)}});function m1(l,u){if(u){var r=l.firstChild;if(r&&r===l.lastChild&&r.nodeType===3){r.nodeValue=u;return}}l.textContent=u}var J1={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},rm=["Webkit","ms","Moz","O"];Object.keys(J1).forEach(function(l){rm.forEach(function(u){u=u+l.charAt(0).toUpperCase()+l.substring(1),J1[u]=J1[l]})});function dF(l,u,r){return u==null||typeof u==="boolean"||u===""?"":r||typeof u!=="number"||u===0||J1.hasOwnProperty(l)&&J1[l]?(""+u).trim():u+"px"}function eF(l,u){l=l.style;for(var r in u)if(u.hasOwnProperty(r)){var f=r.indexOf("--")===0,n=dF(r,u[r],f);r==="float"&&(r="cssFloat"),f?l.setProperty(r,n):l[r]=n}}var fm=Bu({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 L8(l,u){if(u){if(fm[l]&&(u.children!=null||u.dangerouslySetInnerHTML!=null))throw Error(Ul(137,l));if(u.dangerouslySetInnerHTML!=null){if(u.children!=null)throw Error(Ul(60));if(typeof u.dangerouslySetInnerHTML!=="object"||!("__html"in u.dangerouslySetInnerHTML))throw Error(Ul(61))}if(u.style!=null&&typeof u.style!=="object")throw Error(Ul(62))}}function G8(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 T8=null;function A4(l){return l=l.target||l.srcElement||window,l.correspondingUseElement&&(l=l.correspondingUseElement),l.nodeType===3?l.parentNode:l}var m8=null,Dt=null,Vt=null;function v7(l){if(l=R1(l)){if(typeof m8!=="function")throw Error(Ul(280));var u=l.stateNode;u&&(u=Y$(u),m8(l.stateNode,l.type,u))}}function lJ(l){Dt?Vt?Vt.push(l):Vt=[l]:Dt=l}function uJ(){if(Dt){var l=Dt,u=Vt;if(Vt=Dt=null,v7(l),u)for(l=0;l>>=0,l===0?32:31-(Jm(l)/Um|0)|0}var M_=64,h_=4194304;function c1(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 F$(l,u){var r=l.pendingLanes;if(r===0)return 0;var f=0,n=l.suspendedLanes,i=l.pingedLanes,t=r&268435455;if(t!==0){var y=t&~n;y!==0?f=c1(y):(i&=t,i!==0&&(f=c1(i)))}else t=r&~n,t!==0?f=c1(t):i!==0&&(f=c1(i));if(f===0)return 0;if(u!==0&&u!==f&&(u&n)===0&&(n=f&-f,i=u&-u,n>=i||n===16&&(i&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 M1(l,u,r){l.pendingLanes|=u,u!==536870912&&(l.suspendedLanes=0,l.pingedLanes=0),l=l.eventTimes,u=31-sf(u),l[u]=r}function qm(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=N1),lF=String.fromCharCode(32),uF=!1;function LJ(l,u){switch(l){case"keyup":return km.indexOf(u.keyCode)!==-1;case"keydown":return u.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function GJ(l){return l=l.detail,typeof l==="object"&&"data"in l?l.data:null}var Gt=!1;function Im(l,u){switch(l){case"compositionend":return GJ(u);case"keypress":if(u.which!==32)return null;return uF=!0,lF;case"textInput":return l=u.data,l===lF&&uF?null:l;default:return null}}function am(l,u){if(Gt)return l==="compositionend"||!q4&&LJ(l,u)?(l=qJ(),e_=N4=Qi=null,Gt=!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=nF(r)}}function zJ(l,u){return l&&u?l===u?!0:l&&l.nodeType===3?!1:u&&u.nodeType===3?zJ(l,u.parentNode):("contains"in l)?l.contains(u):l.compareDocumentPosition?!!(l.compareDocumentPosition(u)&16):!1:!1}function EJ(){for(var l=window,u=_$();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=_$(l.document)}return u}function W4(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 iK(l){var u=EJ(),r=l.focusedElem,f=l.selectionRange;if(u!==r&&r&&r.ownerDocument&&zJ(r.ownerDocument.documentElement,r)){if(f!==null&&W4(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,i=Math.min(f.start,n);f=f.end===void 0?i:Math.min(f.end,n),!l.extend&&i>f&&(n=f,f=i,i=n),n=iF(r,i);var t=iF(r,f);n&&t&&(l.rangeCount!==1||l.anchorNode!==n.node||l.anchorOffset!==n.offset||l.focusNode!==t.node||l.focusOffset!==t.offset)&&(u=u.createRange(),u.setStart(n.node,n.offset),l.removeAllRanges(),i>f?(l.addRange(u),l.extend(t.node,t.offset)):(u.setEnd(t.node,t.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,Tt=null,p8=null,w1=null,H8=!1;function tF(l,u,r){var f=r.window===r?r.document:r.nodeType===9?r:r.ownerDocument;H8||Tt==null||Tt!==_$(f)||(f=Tt,("selectionStart"in f)&&W4(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}),w1&&p1(w1,f)||(w1=f,f=N$(p8,"onSelect"),0zt||(l.current=C8[zt],C8[zt]=null,zt--)}function Lu(l,u){zt++,C8[zt]=l.current,l.current=u}var Oi={},mr=pi(Oi),sr=pi(!1),T0=Oi;function Ct(l,u){var r=l.type.contextTypes;if(!r)return Oi;var f=l.stateNode;if(f&&f.__reactInternalMemoizedUnmaskedChildContext===u)return f.__reactInternalMemoizedMaskedChildContext;var n={},i;for(i in r)n[i]=u[i];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 w$(){zu(sr),zu(mr)}function FF(l,u,r){if(mr.current!==Oi)throw Error(Ul(168));Lu(mr,u),Lu(sr,r)}function XJ(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(Ul(108,lm(l)||"Unknown",n));return Bu({},r,f)}function q$(l){return l=(l=l.stateNode)&&l.__reactInternalMemoizedMergedChildContext||Oi,T0=mr.current,Lu(mr,l),Lu(sr,sr.current),!0}function JF(l,u,r){var f=l.stateNode;if(!f)throw Error(Ul(169));r?(l=XJ(l,u,T0),f.__reactInternalMemoizedMergedChildContext=l,zu(sr),zu(mr),Lu(mr,l)):zu(sr),Lu(sr,r)}var Vn=null,P$=!1,r8=!1;function YJ(l){Vn===null?Vn=[l]:Vn.push(l)}function UK(l){P$=!0,YJ(l)}function Hi(){if(!r8&&Vn!==null){r8=!0;var l=0,u=Uu;try{var r=Vn;for(Uu=1;l>=t,n-=t,Sn=1<<32-sf(u)+n|r<E?(D=Z,Z=null):D=Z.sibling;var Y=F(J,Z,Q[E],q);if(Y===null){Z===null&&(Z=D);break}l&&Z&&Y.alternate===null&&u(J,Z),w=i(Y,w,E),O===null?T=Y:O.sibling=Y,O=Y,Z=D}if(E===Q.length)return r(J,Z),Ou&&N0(J,E),T;if(Z===null){for(;EE?(D=Z,Z=null):D=Z.sibling;var p=F(J,Z,Y.value,q);if(p===null){Z===null&&(Z=D);break}l&&Z&&p.alternate===null&&u(J,Z),w=i(p,w,E),O===null?T=p:O.sibling=p,O=p,Z=D}if(Y.done)return r(J,Z),Ou&&N0(J,E),T;if(Z===null){for(;!Y.done;E++,Y=Q.next())Y=j(J,Y.value,q),Y!==null&&(w=i(Y,w,E),O===null?T=Y:O.sibling=Y,O=Y);return Ou&&N0(J,E),T}for(Z=f(J,Z);!Y.done;E++,Y=Q.next())Y=U(Z,J,E,Y.value,q),Y!==null&&(l&&Y.alternate!==null&&Z.delete(Y.key===null?E:Y.key),w=i(Y,w,E),O===null?T=Y:O.sibling=Y,O=Y);return l&&Z.forEach(function(V){return u(J,V)}),Ou&&N0(J,E),T}function L(J,w,Q,q){if(typeof Q==="object"&&Q!==null&&Q.type===Lt&&Q.key===null&&(Q=Q.props.children),typeof Q==="object"&&Q!==null){switch(Q.$$typeof){case Y_:l:{for(var T=Q.key,O=w;O!==null;){if(O.key===T){if(T=Q.type,T===Lt){if(O.tag===7){r(J,O.sibling),w=n(O,Q.props.children),w.return=J,J=w;break l}}else if(O.elementType===T||typeof T==="object"&&T!==null&&T.$$typeof===Fi&&QF(T)===O.type){r(J,O.sibling),w=n(O,Q.props),w.ref=f1(J,O,Q),w.return=J,J=w;break l}r(J,O);break}else u(J,O);O=O.sibling}Q.type===Lt?(w=G0(Q.props.children,J.mode,q,Q.key),w.return=J,J=w):(q=c$(Q.type,Q.key,Q.props,null,J.mode,q),q.ref=f1(J,w,Q),q.return=J,J=q)}return t(J);case Wt:l:{for(O=Q.key;w!==null;){if(w.key===O)if(w.tag===4&&w.stateNode.containerInfo===Q.containerInfo&&w.stateNode.implementation===Q.implementation){r(J,w.sibling),w=n(w,Q.children||[]),w.return=J,J=w;break l}else{r(J,w);break}else u(J,w);w=w.sibling}w=$8(Q,J.mode,q),w.return=J,J=w}return t(J);case Fi:return O=Q._init,L(J,w,O(Q._payload),q)}if(y1(Q))return N(J,w,Q,q);if(ey(Q))return W(J,w,Q,q);g_(J,Q)}return typeof Q==="string"&&Q!==""||typeof Q==="number"?(Q=""+Q,w!==null&&w.tag===6?(r(J,w.sibling),w=n(w,Q),w.return=J,J=w):(r(J,w),w=_8(Q,J.mode,q),w.return=J,J=w),t(J)):r(J,w)}return L}var ht=hJ(!0),RJ=hJ(!1),G$=pi(null),T$=null,Zt=null,m4=null;function K4(){m4=Zt=T$=null}function z4(l){var u=G$.current;zu(G$),l._currentValue=u}function R8(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 Xt(l,u){T$=l,m4=Zt=null,l=l.dependencies,l!==null&&l.firstContext!==null&&((l.lanes&u)!==0&&(vr=!0),l.firstContext=null)}function Zf(l){var u=l._currentValue;if(m4!==l)if(l={context:l,memoizedValue:u,next:null},Zt===null){if(T$===null)throw Error(Ul(308));Zt=l,T$.dependencies={lanes:0,firstContext:l}}else Zt=Zt.next=l;return u}var q0=null;function E4(l){q0===null?q0=[l]:q0.push(l)}function xJ(l,u,r,f){var n=u.interleaved;return n===null?(r.next=r,E4(u)):(r.next=n.next,n.next=r),u.interleaved=r,Mn(l,f)}function Mn(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 Ji=!1;function O4(l){l.updateQueue={baseState:l.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function bJ(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 Yn(l,u){return{eventTime:l,lane:u,tag:0,payload:null,callback:null,next:null}}function Ti(l,u,r){var f=l.updateQueue;if(f===null)return null;if(f=f.shared,(_u&2)!==0){var n=f.pending;return n===null?u.next=u:(u.next=n.next,n.next=u),f.pending=u,Mn(l,r)}return n=f.interleaved,n===null?(u.next=u,E4(f)):(u.next=n.next,n.next=u),f.interleaved=u,Mn(l,r)}function r$(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,F4(l,r)}}function wF(l,u){var{updateQueue:r,alternate:f}=l;if(f!==null&&(f=f.updateQueue,r===f)){var n=null,i=null;if(r=r.firstBaseUpdate,r!==null){do{var t={eventTime:r.eventTime,lane:r.lane,tag:r.tag,payload:r.payload,callback:r.callback,next:null};i===null?n=i=t:i=i.next=t,r=r.next}while(r!==null);i===null?n=i=u:i=i.next=u}else n=i=u;r={baseState:f.baseState,firstBaseUpdate:n,lastBaseUpdate:i,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 m$(l,u,r,f){var n=l.updateQueue;Ji=!1;var{firstBaseUpdate:i,lastBaseUpdate:t}=n,y=n.shared.pending;if(y!==null){n.shared.pending=null;var c=y,$=c.next;c.next=null,t===null?i=$:t.next=$,t=c;var A=l.alternate;A!==null&&(A=A.updateQueue,y=A.lastBaseUpdate,y!==t&&(y===null?A.firstBaseUpdate=$:y.next=$,A.lastBaseUpdate=c))}if(i!==null){var j=n.baseState;t=0,A=$=c=null,y=i;do{var{lane:F,eventTime:U}=y;if((f&F)===F){A!==null&&(A=A.next={eventTime:U,lane:0,tag:y.tag,payload:y.payload,callback:y.callback,next:null});l:{var N=l,W=y;switch(F=u,U=r,W.tag){case 1:if(N=W.payload,typeof N==="function"){j=N.call(U,j,F);break l}j=N;break l;case 3:N.flags=N.flags&-65537|128;case 0:if(N=W.payload,F=typeof N==="function"?N.call(U,j,F):N,F===null||F===void 0)break l;j=Bu({},j,F);break l;case 2:Ji=!0}}y.callback!==null&&y.lane!==0&&(l.flags|=64,F=n.effects,F===null?n.effects=[y]:F.push(y))}else U={eventTime:U,lane:F,tag:y.tag,payload:y.payload,callback:y.callback,next:null},A===null?($=A=U,c=j):A=A.next=U,t|=F;if(y=y.next,y===null)if(y=n.shared.pending,y===null)break;else F=y,y=F.next,F.next=null,n.lastBaseUpdate=F,n.shared.pending=null}while(1);if(A===null&&(c=j),n.baseState=c,n.firstBaseUpdate=$,n.lastBaseUpdate=A,u=n.shared.interleaved,u!==null){n=u;do t|=n.lane,n=n.next;while(n!==u)}else i===null&&(n.shared.lanes=0);z0|=t,l.lanes=t,l.memoizedState=j}}function qF(l,u,r){if(l=u.effects,u.effects=null,l!==null)for(u=0;ur?r:4,l(!0);var f=n8.transition;n8.transition={};try{l(!1),u()}finally{Uu=r,n8.transition=f}}function yU(){return pf().memoizedState}function qK(l,u,r){var f=Ki(l);if(r={lane:f,action:r,hasEagerState:!1,eagerState:null,next:null},cU(l))_U(u,r);else if(r=xJ(l,u,r,f),r!==null){var n=Vr();kf(r,l,f,n),$U(r,u,f)}}function WK(l,u,r){var f=Ki(l),n={lane:f,action:r,hasEagerState:!1,eagerState:null,next:null};if(cU(l))_U(u,n);else{var i=l.alternate;if(l.lanes===0&&(i===null||i.lanes===0)&&(i=u.lastRenderedReducer,i!==null))try{var t=u.lastRenderedState,y=i(t,r);if(n.hasEagerState=!0,n.eagerState=y,gf(y,t)){var c=u.interleaved;c===null?(n.next=n,E4(u)):(n.next=c.next,c.next=n),u.interleaved=n;return}}catch($){}finally{}r=xJ(l,u,n,f),r!==null&&(n=Vr(),kf(r,l,f,n),$U(r,u,f))}}function cU(l){var u=l.alternate;return l===Hu||u!==null&&u===Hu}function _U(l,u){q1=z$=!0;var r=l.pending;r===null?u.next=u:(u.next=r.next,r.next=u),l.pending=u}function $U(l,u,r){if((r&4194240)!==0){var f=u.lanes;f&=l.pendingLanes,r|=f,u.lanes=r,F4(l,r)}}var E$={readContext:Zf,useCallback:Lr,useContext:Lr,useEffect:Lr,useImperativeHandle:Lr,useInsertionEffect:Lr,useLayoutEffect:Lr,useMemo:Lr,useReducer:Lr,useRef:Lr,useState:Lr,useDebugValue:Lr,useDeferredValue:Lr,useTransition:Lr,useMutableSource:Lr,useSyncExternalStore:Lr,useId:Lr,unstable_isNewReconciler:!1},LK={readContext:Zf,useCallback:function(l,u){return $n().memoizedState=[l,u===void 0?null:u],l},useContext:Zf,useEffect:LF,useImperativeHandle:function(l,u,r){return r=r!==null&&r!==void 0?r.concat([l]):null,n$(4194308,4,rU.bind(null,u,l),r)},useLayoutEffect:function(l,u){return n$(4194308,4,l,u)},useInsertionEffect:function(l,u){return n$(4,2,l,u)},useMemo:function(l,u){var r=$n();return u=u===void 0?null:u,l=l(),r.memoizedState=[l,u],l},useReducer:function(l,u,r){var f=$n();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=qK.bind(null,Hu,l),[f.memoizedState,l]},useRef:function(l){var u=$n();return l={current:l},u.memoizedState=l},useState:WF,useDebugValue:X4,useDeferredValue:function(l){return $n().memoizedState=l},useTransition:function(){var l=WF(!1),u=l[0];return l=wK.bind(null,l[1]),$n().memoizedState=l,[u,l]},useMutableSource:function(){},useSyncExternalStore:function(l,u,r){var f=Hu,n=$n();if(Ou){if(r===void 0)throw Error(Ul(407));r=r()}else{if(r=u(),_r===null)throw Error(Ul(349));(K0&30)!==0||gJ(f,u,r)}n.memoizedState=r;var i={value:r,getSnapshot:u};return n.queue=i,LF(aJ.bind(null,f,i,l),[l]),f.flags|=2048,P1(9,IJ.bind(null,f,i,r,u),void 0,null),r},useId:function(){var l=$n(),u=_r.identifierPrefix;if(Ou){var r=Xn,f=Sn;r=(f&~(1<<32-sf(f)-1)).toString(32)+r,u=":"+u+"R"+r,r=X1++,0",l=l.removeChild(l.firstChild)):typeof f.is==="string"?l=t.createElement(r,{is:f.is}):(l=t.createElement(r),r==="select"&&(t=l,f.multiple?t.multiple=!0:f.size&&(t.size=f.size))):l=t.createElementNS(l,r),l[An]=u,l[D1]=f,WU(l,u,!1,!1),u.stateNode=l;l:{switch(t=G8(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;nbt&&(u.flags|=128,f=!0,n1(i,!1),u.lanes=4194304)}else{if(!f)if(l=K$(t),l!==null){if(u.flags|=128,f=!0,r=l.updateQueue,r!==null&&(u.updateQueue=r,u.flags|=4),n1(i,!0),i.tail===null&&i.tailMode==="hidden"&&!t.alternate&&!Ou)return Gr(u),null}else 2*su()-i.renderingStartTime>bt&&r!==1073741824&&(u.flags|=128,f=!0,n1(i,!1),u.lanes=4194304);i.isBackwards?(t.sibling=u.child,u.child=t):(r=i.last,r!==null?r.sibling=t:u.child=t,i.last=t)}if(i.tail!==null)return u=i.tail,i.rendering=u,i.tail=u.sibling,i.renderingStartTime=su(),u.sibling=null,r=pu.current,Lu(pu,f?r&1|2:r&1),u;return Gr(u),null;case 22:case 23:return R4(),f=u.memoizedState!==null,l!==null&&l.memoizedState!==null!==f&&(u.flags|=8192),f&&(u.mode&1)!==0?(_f&1073741824)!==0&&(Gr(u),u.subtreeFlags&6&&(u.flags|=8192)):Gr(u),null;case 24:return null;case 25:return null}throw Error(Ul(156,u.tag))}function ZK(l,u){switch(G4(u),u.tag){case 1:return kr(u.type)&&w$(),l=u.flags,l&65536?(u.flags=l&-65537|128,u):null;case 3:return Rt(),zu(sr),zu(mr),H4(),l=u.flags,(l&65536)!==0&&(l&128)===0?(u.flags=l&-65537|128,u):null;case 5:return p4(u),null;case 13:if(zu(pu),l=u.memoizedState,l!==null&&l.dehydrated!==null){if(u.alternate===null)throw Error(Ul(340));Mt()}return l=u.flags,l&65536?(u.flags=l&-65537|128,u):null;case 19:return zu(pu),null;case 4:return Rt(),null;case 10:return z4(u.type._context),null;case 22:case 23:return R4(),null;case 24:return null;default:return null}}var a_=!1,Tr=!1,pK=typeof WeakSet==="function"?WeakSet:Set,Hl=null;function pt(l,u){var r=l.ref;if(r!==null)if(typeof r==="function")try{r(null)}catch(f){hu(l,u,f)}else r.current=null}function o8(l,u,r){try{r()}catch(f){hu(l,u,f)}}var BF=!1;function HK(l,u){if(V8=J$,l=EJ(),W4(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:i}=f;f=f.focusOffset;try{r.nodeType,i.nodeType}catch(q){r=null;break l}var t=0,y=-1,c=-1,$=0,A=0,j=l,F=null;u:for(;;){for(var U;;){if(j!==r||n!==0&&j.nodeType!==3||(y=t+n),j!==i||f!==0&&j.nodeType!==3||(c=t+f),j.nodeType===3&&(t+=j.nodeValue.length),(U=j.firstChild)===null)break;F=j,j=U}for(;;){if(j===l)break u;if(F===r&&++$===n&&(y=t),F===i&&++A===f&&(c=t),(U=j.nextSibling)!==null)break;j=F,F=j.parentNode}j=U}r=y===-1||c===-1?null:{start:y,end:c}}else r=null}r=r||{start:0,end:0}}else r=null;S8={focusedElem:l,selectionRange:r},J$=!1;for(Hl=u;Hl!==null;)if(u=Hl,l=u.child,(u.subtreeFlags&1028)!==0&&l!==null)l.return=u,Hl=l;else for(;Hl!==null;){u=Hl;try{var N=u.alternate;if((u.flags&1024)!==0)switch(u.tag){case 0:case 11:case 15:break;case 1:if(N!==null){var{memoizedProps:W,memoizedState:L}=N,J=u.stateNode,w=J.getSnapshotBeforeUpdate(u.elementType===u.type?W:xf(u.type,W),L);J.__reactInternalSnapshotBeforeUpdate=w}break;case 3:var Q=u.stateNode.containerInfo;Q.nodeType===1?Q.textContent="":Q.nodeType===9&&Q.documentElement&&Q.removeChild(Q.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(Ul(163))}}catch(q){hu(u,u.return,q)}if(l=u.sibling,l!==null){l.return=u.return,Hl=l;break}Hl=u.return}return N=BF,BF=!1,N}function W1(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 i=n.destroy;n.destroy=void 0,i!==void 0&&o8(u,r,i)}n=n.next}while(n!==f)}}function h$(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 d8(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 TU(l){var u=l.alternate;u!==null&&(l.alternate=null,TU(u)),l.child=null,l.deletions=null,l.sibling=null,l.tag===5&&(u=l.stateNode,u!==null&&(delete u[An],delete u[D1],delete u[P8],delete u[FK],delete u[JK])),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 mU(l){return l.tag===5||l.tag===3||l.tag===4}function DF(l){l:for(;;){for(;l.sibling===null;){if(l.return===null||mU(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 e8(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=Q$));else if(f!==4&&(l=l.child,l!==null))for(e8(l,u,r),l=l.sibling;l!==null;)e8(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 jr=null,bf=!1;function ji(l,u,r){for(r=r.child;r!==null;)KU(l,u,r),r=r.sibling}function KU(l,u,r){if(jn&&typeof jn.onCommitFiberUnmount==="function")try{jn.onCommitFiberUnmount(D$,r)}catch(y){}switch(r.tag){case 5:Tr||pt(r,u);case 6:var f=jr,n=bf;jr=null,ji(l,u,r),jr=f,bf=n,jr!==null&&(bf?(l=jr,r=r.stateNode,l.nodeType===8?l.parentNode.removeChild(r):l.removeChild(r)):jr.removeChild(r.stateNode));break;case 18:jr!==null&&(bf?(l=jr,r=r.stateNode,l.nodeType===8?u8(l.parentNode,r):l.nodeType===1&&u8(l,r),O1(l)):u8(jr,r.stateNode));break;case 4:f=jr,n=bf,jr=r.stateNode.containerInfo,bf=!0,ji(l,u,r),jr=f,bf=n;break;case 0:case 11:case 14:case 15:if(!Tr&&(f=r.updateQueue,f!==null&&(f=f.lastEffect,f!==null))){n=f=f.next;do{var i=n,t=i.destroy;i=i.tag,t!==void 0&&((i&2)!==0?o8(r,u,t):(i&4)!==0&&o8(r,u,t)),n=n.next}while(n!==f)}ji(l,u,r);break;case 1:if(!Tr&&(pt(r,u),f=r.stateNode,typeof f.componentWillUnmount==="function"))try{f.props=r.memoizedProps,f.state=r.memoizedState,f.componentWillUnmount()}catch(y){hu(r,u,y)}ji(l,u,r);break;case 21:ji(l,u,r);break;case 22:r.mode&1?(Tr=(f=Tr)||r.memoizedState!==null,ji(l,u,r),Tr=f):ji(l,u,r);break;default:ji(l,u,r)}}function VF(l){var u=l.updateQueue;if(u!==null){l.updateQueue=null;var r=l.stateNode;r===null&&(r=l.stateNode=new pK),u.forEach(function(f){var n=MK.bind(null,l,f);r.has(f)||(r.add(f),f.then(n,n))})}}function Rf(l,u){var r=u.deletions;if(r!==null)for(var f=0;fn&&(n=t),f&=~i}if(f=n,f=su()-f,f=(120>f?120:480>f?480:1080>f?1080:1920>f?1920:3000>f?3000:4320>f?4320:1960*DK(f/1960))-f,10l?16:l,wi===null)var f=!1;else{if(l=wi,wi=null,p$=0,(_u&6)!==0)throw Error(Ul(331));var n=_u;_u|=4;for(Hl=l.current;Hl!==null;){var i=Hl,t=i.child;if((Hl.flags&16)!==0){var y=i.deletions;if(y!==null){for(var c=0;csu()-M4?L0(l,0):C4|=r),gr(l,u)}function DU(l,u){u===0&&((l.mode&1)===0?u=1:(u=h_,h_<<=1,(h_&130023424)===0&&(h_=4194304)));var r=Vr();l=Mn(l,u),l!==null&&(M1(l,u,r),gr(l,r))}function CK(l){var u=l.memoizedState,r=0;u!==null&&(r=u.retryLane),DU(l,r)}function MK(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(Ul(314))}f!==null&&f.delete(u),DU(l,r)}var VU;VU=function(l,u,r){if(l!==null)if(l.memoizedProps!==u.pendingProps||sr.current)vr=!0;else{if((l.lanes&r)===0&&(u.flags&128)===0)return vr=!1,EK(l,u,r);vr=(l.flags&131072)!==0?!0:!1}else vr=!1,Ou&&(u.flags&1048576)!==0&&PJ(u,L$,u.index);switch(u.lanes=0,u.tag){case 2:var f=u.type;i$(l,u),l=u.pendingProps;var n=Ct(u,mr.current);Xt(u,r),n=D4(null,u,f,l,n,r);var i=V4();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)?(i=!0,q$(u)):i=!1,u.memoizedState=n.state!==null&&n.state!==void 0?n.state:null,O4(u),n.updater=M$,u.stateNode=n,n._reactInternals=u,b8(u,f,l,r),u=k8(null,u,f,!0,i,r)):(u.tag=0,Ou&&i&&L4(u),Dr(null,u,n,r),u=u.child),u;case 16:f=u.elementType;l:{switch(i$(l,u),l=u.pendingProps,n=f._init,f=n(f._payload),u.type=f,n=u.tag=RK(f),l=xf(f,l),n){case 0:u=s8(null,u,f,l,r);break l;case 1:u=ZF(null,u,f,l,r);break l;case 11:u=EF(null,u,f,l,r);break l;case 14:u=OF(null,u,f,xf(f.type,l),r);break l}throw Error(Ul(306,f,""))}return u;case 0:return f=u.type,n=u.pendingProps,n=u.elementType===f?n:xf(f,n),s8(l,u,f,n,r);case 1:return f=u.type,n=u.pendingProps,n=u.elementType===f?n:xf(f,n),ZF(l,u,f,n,r);case 3:l:{if(QU(u),l===null)throw Error(Ul(387));f=u.pendingProps,i=u.memoizedState,n=i.element,bJ(l,u),m$(u,f,null,r);var t=u.memoizedState;if(f=t.element,i.isDehydrated)if(i={element:f,isDehydrated:!1,cache:t.cache,pendingSuspenseBoundaries:t.pendingSuspenseBoundaries,transitions:t.transitions},u.updateQueue.baseState=i,u.memoizedState=i,u.flags&256){n=xt(Error(Ul(423)),u),u=pF(l,u,f,r,n);break l}else if(f!==n){n=xt(Error(Ul(424)),u),u=pF(l,u,f,r,n);break l}else for($f=Gi(u.stateNode.containerInfo.firstChild),Af=u,Ou=!0,vf=null,r=RJ(u,null,f,r),u.child=r;r;)r.flags=r.flags&-3|4096,r=r.sibling;else{if(Mt(),f===n){u=hn(l,u,r);break l}Dr(l,u,f,r)}u=u.child}return u;case 5:return vJ(u),l===null&&h8(u),f=u.type,n=u.pendingProps,i=l!==null?l.memoizedProps:null,t=n.children,X8(f,n)?t=null:i!==null&&X8(f,i)&&(u.flags|=32),NU(l,u),Dr(l,u,t,r),u.child;case 6:return l===null&&h8(u),null;case 13:return wU(l,u,r);case 4:return Z4(u,u.stateNode.containerInfo),f=u.pendingProps,l===null?u.child=ht(u,null,f,r):Dr(l,u,f,r),u.child;case 11:return f=u.type,n=u.pendingProps,n=u.elementType===f?n:xf(f,n),EF(l,u,f,n,r);case 7:return Dr(l,u,u.pendingProps,r),u.child;case 8:return Dr(l,u,u.pendingProps.children,r),u.child;case 12:return Dr(l,u,u.pendingProps.children,r),u.child;case 10:l:{if(f=u.type._context,n=u.pendingProps,i=u.memoizedProps,t=n.value,Lu(G$,f._currentValue),f._currentValue=t,i!==null)if(gf(i.value,t)){if(i.children===n.children&&!sr.current){u=hn(l,u,r);break l}}else for(i=u.child,i!==null&&(i.return=u);i!==null;){var y=i.dependencies;if(y!==null){t=i.child;for(var c=y.firstContext;c!==null;){if(c.context===f){if(i.tag===1){c=Yn(-1,r&-r),c.tag=2;var $=i.updateQueue;if($!==null){$=$.shared;var A=$.pending;A===null?c.next=c:(c.next=A.next,A.next=c),$.pending=c}}i.lanes|=r,c=i.alternate,c!==null&&(c.lanes|=r),R8(i.return,r,u),y.lanes|=r;break}c=c.next}}else if(i.tag===10)t=i.type===u.type?null:i.child;else if(i.tag===18){if(t=i.return,t===null)throw Error(Ul(341));t.lanes|=r,y=t.alternate,y!==null&&(y.lanes|=r),R8(t,r,u),t=i.sibling}else t=i.child;if(t!==null)t.return=i;else for(t=i;t!==null;){if(t===u){t=null;break}if(i=t.sibling,i!==null){i.return=t.return,t=i;break}t=t.return}i=t}Dr(l,u,n.children,r),u=u.child}return u;case 9:return n=u.type,f=u.pendingProps.children,Xt(u,r),n=Zf(n),f=f(n),u.flags|=1,Dr(l,u,f,r),u.child;case 14:return f=u.type,n=xf(f,u.pendingProps),n=xf(f.type,n),OF(l,u,f,n,r);case 15:return JU(l,u,u.type,u.pendingProps,r);case 17:return f=u.type,n=u.pendingProps,n=u.elementType===f?n:xf(f,n),i$(l,u),u.tag=1,kr(f)?(l=!0,q$(u)):l=!1,Xt(u,r),AU(u,f,n),b8(u,f,n,r),k8(null,u,f,!0,l,r);case 19:return qU(l,u,r);case 22:return UU(l,u,r)}throw Error(Ul(156,u.tag))};function SU(l,u){return cJ(l,u)}function hK(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 Ef(l,u,r,f){return new hK(l,u,r,f)}function b4(l){return l=l.prototype,!(!l||!l.isReactComponent)}function RK(l){if(typeof l==="function")return b4(l)?1:0;if(l!==void 0&&l!==null){if(l=l.$$typeof,l===_4)return 11;if(l===$4)return 14}return 2}function zi(l,u){var r=l.alternate;return r===null?(r=Ef(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 c$(l,u,r,f,n,i){var t=2;if(f=l,typeof l==="function")b4(l)&&(t=1);else if(typeof l==="string")t=5;else l:switch(l){case Lt:return G0(r.children,n,i,u);case c4:t=8,n|=8;break;case j8:return l=Ef(12,r,u,n|2),l.elementType=j8,l.lanes=i,l;case F8:return l=Ef(13,r,u,n),l.elementType=F8,l.lanes=i,l;case J8:return l=Ef(19,r,u,n),l.elementType=J8,l.lanes=i,l;case vF:return x$(r,n,i,u);default:if(typeof l==="object"&&l!==null)switch(l.$$typeof){case xF:t=10;break l;case bF:t=9;break l;case _4:t=11;break l;case $4:t=14;break l;case Fi:t=16,f=null;break l}throw Error(Ul(130,l==null?l:typeof l,""))}return u=Ef(t,r,u,n),u.elementType=l,u.type=f,u.lanes=i,u}function G0(l,u,r,f){return l=Ef(7,l,f,u),l.lanes=r,l}function x$(l,u,r,f){return l=Ef(22,l,f,u),l.elementType=vF,l.lanes=r,l.stateNode={isHidden:!1},l}function _8(l,u,r){return l=Ef(6,l,null,u),l.lanes=r,l}function $8(l,u,r){return u=Ef(4,l.children!==null?l.children:[],l.key,u),u.lanes=r,u.stateNode={containerInfo:l.containerInfo,pendingChildren:null,implementation:l.implementation},u}function xK(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=g6(0),this.expirationTimes=g6(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=g6(0),this.identifierPrefix=f,this.onRecoverableError=n,this.mutableSourceEagerHydrationData=null}function v4(l,u,r,f,n,i,t,y,c){return l=new xK(l,u,r,y,c),u===1?(u=1,i===!0&&(u|=8)):u=0,i=Ef(3,null,null,u),l.current=i,i.stateNode=l,i.memoizedState={element:f,isDehydrated:r,cache:null,transitions:null,pendingSuspenseBoundaries:null},O4(i),l}function bK(l,u,r){var f=3{function MU(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=="function")return;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(MU)}catch(l){console.error(l)}}MU(),hU.exports=CU()});var xU=cf((a4)=>{var RU=I4();a4.createRoot=RU.createRoot,a4.hydrateRoot=RU.hydrateRoot;var IK});var aQ=cf((X3)=>{var HZ=Ju(),BZ=Symbol.for("react.element"),DZ=Symbol.for("react.fragment"),VZ=Object.prototype.hasOwnProperty,SZ=HZ.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,XZ={key:!0,ref:!0,__self:!0,__source:!0};function IQ(l,u,r){var f,n={},i=null,t=null;r!==void 0&&(i=""+r),u.key!==void 0&&(i=""+u.key),u.ref!==void 0&&(t=u.ref);for(f in u)VZ.call(u,f)&&!XZ.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:BZ,type:l,key:i,ref:t,props:n,_owner:SZ.current}}X3.Fragment=DZ;X3.jsx=IQ;X3.jsxs=IQ});var dQ=cf((aC,oQ)=>{oQ.exports=aQ()});var Zq=cf((Oq)=>{var py=Ju();function eB(l,u){return l===u&&(l!==0||1/l===1/u)||l!==l&&u!==u}var lD=typeof Object.is==="function"?Object.is:eB,uD=py.useState,rD=py.useEffect,fD=py.useLayoutEffect,nD=py.useDebugValue;function iD(l,u){var r=u(),f=uD({inst:{value:r,getSnapshot:u}}),n=f[0].inst,i=f[1];return fD(function(){n.value=r,n.getSnapshot=u,s9(n)&&i({inst:n})},[l,r,u]),rD(function(){return s9(n)&&i({inst:n}),l(function(){s9(n)&&i({inst:n})})},[l]),nD(r),r}function s9(l){var u=l.getSnapshot;l=l.value;try{var r=u();return!lD(l,r)}catch(f){return!0}}function tD(l,u){return u()}var yD=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?tD:iD;Oq.useSyncExternalStore=py.useSyncExternalStore!==void 0?py.useSyncExternalStore:yD});var Hq=cf((xv,pq)=>{pq.exports=Zq()});var Dq=cf((Bq)=>{var ZA=Ju(),cD=Hq();function _D(l,u){return l===u&&(l!==0||1/l===1/u)||l!==l&&u!==u}var $D=typeof Object.is==="function"?Object.is:_D,AD=cD.useSyncExternalStore,jD=ZA.useRef,FD=ZA.useEffect,JD=ZA.useMemo,UD=ZA.useDebugValue;Bq.useSyncExternalStoreWithSelector=function(l,u,r,f,n){var i=jD(null);if(i.current===null){var t={hasValue:!1,value:null};i.current=t}else t=i.current;i=JD(function(){function c(U){if(!$){if($=!0,A=U,U=f(U),n!==void 0&&t.hasValue){var N=t.value;if(n(N,U))return j=N}return j=U}if(N=j,$D(A,U))return N;var W=f(U);if(n!==void 0&&n(N,W))return A=U,N;return A=U,j=W}var $=!1,A,j,F=r===void 0?null:r;return[function(){return c(u())},F===null?void 0:function(){return c(F())}]},[u,r,f,n]);var y=AD(l,i[0],i[1]);return FD(function(){t.hasValue=!0,t.value=y},[y]),UD(y),y}});var Sq=cf((vv,Vq)=>{Vq.exports=Dq()});var i0=Rl(Ju(),1);var Z_="北京时间";var bT={timeZone:"Asia/Shanghai",hour12:!1},vT={timeZone:"Asia/Shanghai",hour12:!1},sT=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 B6(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 z7(l){let u=B6(l);if(!u)return null;return sT.formatToParts(u).reduce((r,f)=>{if(f.type!=="literal")r[f.type]=f.value;return r},{})}function Wl(l){let u=B6(l);return u?u.toLocaleString("zh-CN",bT):"--"}function iu(l){let u=B6(l);return u?u.toLocaleTimeString("zh-CN",vT):"--"}function D6(l){let u=z7(l);if(!u)return"";let r=u.hour==="24"?"00":u.hour;return`${u.year}-${u.month}-${u.day}T${r}:${u.minute}`}function E7(l=new Date){let u=z7(l);if(!u)return"";return`${u.year}-${u.month}-${u.day}`}function O7(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,i,t,y="00"]=u,c=Date.UTC(Number(r),Number(f)-1,Number(n),Number(i)-8,Number(t),Number(y)),$=new Date(c),A=D6($);return Number.isNaN($.getTime())||A!==`${r}-${f}-${n}T${i}:${t}`?null:$.toISOString()}var _G=Rl(xU(),1);var a$=Rl(Ju(),1);var bU=Rl(Ju(),1),b1=bU.default.createElement;function aK({active:l=!0,label:u="正在加载"}){if(!l)return null;return b1("span",{className:"loading-spinner-indicator",role:"status","aria-label":u,title:u,"data-testid":"loading-title-indicator"},b1("span",{className:"loading-spinner-ring","aria-hidden":!0}))}function fu({title:l,children:u,loading:r,level:f=2,className:n="",label:i="正在加载"}){return b1(f===3?"h3":"h2",{className:`loading-title ${r?"is-loading":""} ${n}`.trim()},b1("span",{className:"loading-title-text"},u??l),b1(aK,{active:Boolean(r),label:i}))}class kt extends Error{unideskRequestError=!0;meta;constructor(l,u){super(l);this.name="UniDeskRequestError",this.meta=u}}function oK(l){return new Promise((u)=>setTimeout(u,l))}function k1(l,u="操作失败"){return l instanceof Error?l.message:String(l||u)}function g$(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 dK(l){try{let u=typeof location<"u"&&location.origin?location.origin:"http://localhost";return new URL(l,u).toString()}catch{return l}}function vU(l){return String(l.method||"GET").toUpperCase()}function eK(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 sU(l){let u=new Headers(l.headers||{}),r=eK(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 kU(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 lz(l,u){if(!l||typeof l!=="object"||Array.isArray(l))return!1;return u.some((r)=>r!==!1&&l[r]===!1)}function v1(l,u,r,f,n={}){return{kind:l,method:r,url:dK(u),occurredAt:f.toISOString(),...n}}function s1(l,u){if(!l)return"请求失败";return`HTTP ${l}${u?` ${u}`:""}`}function gU(l){try{return{body:l?JSON.parse(l):null,parseError:""}}catch(u){return{body:{text:l},parseError:k1(u,"parse failed")}}}async function ml(l,u={},r=0){let{failureFields:f=["ok"],strictJson:n=!1,retryInvalidJson:i=0,retryDelayMs:t=120,invalidJsonPrefix:y="服务返回了无效 JSON",invalidJsonPreview:c=!1,responsePreviewLength:$=500,...A}=u,j=vU(A),F=new Date,U;try{U=await fetch(l,sU(A))}catch(L){let J=k1(L,"网络请求失败");throw new kt(J,v1("network",l,j,F,{upstreamMessage:J}))}let N=await U.text(),W=gU(N);if(W.parseError){if(n&&j==="GET"&&r=300)?s1(l.meta.status,l.meta.statusText):"应用请求失败",i=l.meta.status?s1(l.meta.status):"",t=(c)=>!c||c===n||c===i,y=!t(l.message)?l.message:t(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:uz(l.meta.occurredAt),responsePreview:l.meta.responsePreview,parseError:l.meta.parseError,structured:!0}}let f=k1(l,u).split(/\r?\n/u);return{title:f[0]||u,message:f.slice(1).join(` -`),structured:f.length>1}}function rz(l,u="操作失败"){let r=o4(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(`状态: ${s1(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 El(l,u="操作失败"){return aU(l)?rz(l,u):k1(l,u)}var oU=Rl(Ju(),1);var Bi=oU.default.createElement;function g1(l,u){return u?[Bi("dt",{key:`${l}-label`},l),Bi("dd",{key:l},u)]:null}function lu({error:l,wide:u=!1,fallback:r="操作失败",className:f=""}){if(!l)return null;let n=o4(l,r),i=[g1("请求",[n.method,n.url].filter(Boolean).join(" ")),g1("状态",n.status?`HTTP ${n.status}${n.statusText?` ${n.statusText}`:""}`:""),g1("时间",n.occurredAt),g1("解析错误",n.parseError),g1("响应预览",n.responsePreview)].filter(Boolean);return Bi("div",{className:`form-error unidesk-error${u?" wide":""}${f?` ${f}`:""}`,role:"alert","data-testid":"unidesk-error"},Bi("div",{className:"unidesk-error-title"},Bi("strong",null,n.title),n.status?Bi("span",{className:"unidesk-error-code"},`HTTP ${n.status}`):null),n.message?Bi("pre",{className:"unidesk-error-message"},n.message):null,i.length>0?Bi("dl",{className:"unidesk-error-details"},i):null)}var Jn=Rl(Ju(),1),dU=Jn.default.createContext(null);function eU({children:l}){let[u,r]=Jn.default.useState([]),[f,n]=Jn.default.useState(Date.now()),i=Jn.default.useCallback((j,F)=>{let N={id:`notif_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,type:j,message:F,timestamp:Date.now()};r((W)=>{let L=[...W,N];if(L.length>50)return L.slice(-50);return L})},[]),t=Jn.default.useCallback((j)=>{r((F)=>F.filter((U)=>U.id!==j))},[]),y=Jn.default.useCallback(()=>{r([]),n(Date.now())},[]),c=Jn.default.useMemo(()=>{return u.filter((j)=>j.timestamp>f).length},[u,f]),$=c>0,A={notifications:u,addNotification:i,removeNotification:t,clearNotifications:y,unreadCount:c,hasUnread:$};return fz(dU.Provider,{value:A},l)}var fz=Jn.default.createElement;function Xr(){let l=Jn.default.useContext(dU);if(!l)throw Error("useNotification must be used within NotificationProvider");return l}var x=a$.default.createElement,{useEffect:I$}=a$.default,gt=a$.default.useState;function Kr(l,u={}){return ml(l,{failureFields:["ok","success"],...u})}function Yr(l,u){return`${l}/microservices/baidu-netdisk/proxy${u}`}function nz(l){let u=Number(l);return Number.isFinite(u)?u.toLocaleString("zh-CN"):"--"}function Di(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 at({title:l,text:u}){return x("div",{className:"empty-state"},x("strong",null,l),x("span",null,u))}function ot({title:l,text:u,href:r,badge:f,testId:n}){return x("a",{className:"doc-link-card",href:r,target:"_blank",rel:"noreferrer","data-testid":n},x("span",null,f||"DOC"),x("strong",null,l),x("p",null,u),x("code",null,r))}function iz(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function tz(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function yz(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function cz(l){return Array.isArray(l?.files)?l.files:[]}function _z(l){return Array.isArray(l?.jobs)?l.jobs:[]}function $z(l,u){if(!l||l===u)return u;let r=l.replace(/\/+$/u,""),f=r.slice(0,r.lastIndexOf("/"))||u;return f.lengthM.id==="baidu-netdisk")||null,[n,i]=gt({loading:!1,actionLoading:!1,error:"",message:"",health:null,account:null,files:null,transfers:null,logs:null,selfTest:null,refreshedAt:null}),[t,y]=gt("/"),[c,$]=gt(null),[A,j]=gt(""),[F,U]=gt({localPath:"sample.txt",remotePath:"/sample.txt"}),[N,W]=gt({fsId:"",localPath:"downloads/"}),{addNotification:L}=Xr(),J=n.health?.baidu?.appRoot||n.account?.rootPath||"/";I$(()=>{U((M)=>{let rl=new Set(["/sample.txt","/apps/UniDeskBaiduNetdisk/sample.txt"]);if(M.remotePath&&!rl.has(M.remotePath))return M;let cl=d4(J,"sample.txt");return M.remotePath===cl?M:{...M,remotePath:cl}})},[J]);async function w(M=t){let cl=await Kr(Yr(r,`/api/files?dir=${encodeURIComponent(M||J)}&limit=100`));i(($l)=>({...$l,files:cl}))}async function Q(){let M=await Kr(Yr(r,"/api/transfers?limit=80"));i((rl)=>({...rl,transfers:M}))}async function q(){if(!f)return;i((M)=>({...M,loading:!0,error:"",message:""}));try{let M=await Kr(`${r}/microservices/baidu-netdisk/health`),rl=M?.baidu?.appRoot||J,cl=null,$l=null;if(M?.auth?.loggedIn){cl=await Kr(Yr(r,"/api/account?refresh=1"));let Ol=t&&t.startsWith(rl)?t:rl;y(Ol),$l=await Kr(Yr(r,`/api/files?dir=${encodeURIComponent(Ol)}&limit=100`))}else y(rl);let Tl=await Kr(Yr(r,"/api/transfers?limit=80")),Ql=await Kr(Yr(r,"/logs?limit=60"));i((Ol)=>({...Ol,loading:!1,health:M,account:cl?.account||null,files:$l,transfers:Tl,logs:Ql,refreshedAt:new Date}))}catch(M){i((rl)=>({...rl,loading:!1,error:El(M,"百度网盘服务加载失败")}))}}async function T(){i((M)=>({...M,actionLoading:!0,error:"",message:""}));try{let M=await Kr(Yr(r,"/api/auth/device/start"),{method:"POST",body:{}});$(M.session||null),i((rl)=>({...rl,actionLoading:!1,message:"设备码已生成,请扫码授权"}))}catch(M){i((rl)=>({...rl,actionLoading:!1,error:El(M,"创建设备码失败")}))}}async function O(M=!1){if(!c?.id)return;if(M)i((rl)=>({...rl,actionLoading:!0,error:""}));try{let rl=await Kr(Yr(r,`/api/auth/device/status?sessionId=${encodeURIComponent(c.id)}`));if($(rl.session||null),rl.session?.status==="succeeded")i((cl)=>({...cl,actionLoading:!1,message:"授权成功,正在刷新账号与文件列表"})),await q();else if(M)i((cl)=>({...cl,actionLoading:!1}))}catch(rl){i((cl)=>({...cl,actionLoading:!1,error:El(rl,"轮询登录状态失败")}))}}async function Z(){i((M)=>({...M,actionLoading:!0,error:"",message:""}));try{await Kr(Yr(r,"/api/auth/logout"),{method:"POST",body:{}}),$(null),i((M)=>({...M,actionLoading:!1,account:null,files:null,message:"本地 token 已清除"})),await q()}catch(M){i((rl)=>({...rl,actionLoading:!1,error:El(M,"退出登录失败")}))}}async function E(M){M.preventDefault();let rl=A.trim();if(!rl)return;i((cl)=>({...cl,actionLoading:!0,error:"",message:""}));try{await Kr(Yr(r,"/api/folders"),{method:"POST",body:{path:d4(t,rl)}}),j(""),i((cl)=>({...cl,actionLoading:!1,message:"文件夹已创建"})),await w(t)}catch(cl){i(($l)=>({...$l,actionLoading:!1,error:El(cl,"创建文件夹失败")}))}}async function D(M){if(!M)return;i((rl)=>({...rl,actionLoading:!0,error:"",message:""}));try{await Kr(Yr(r,"/api/files/manage"),{method:"POST",body:{opera:"delete",filelist:[{path:M}],async:1}}),i((rl)=>({...rl,actionLoading:!1,message:"删除任务已提交"})),await w(t)}catch(rl){i((cl)=>({...cl,actionLoading:!1,error:El(rl,"删除失败")}))}}async function Y(M){M.preventDefault(),i((rl)=>({...rl,actionLoading:!0,error:"",message:""}));try{await Kr(Yr(r,"/api/transfers/upload-from-path"),{method:"POST",body:F}),i((rl)=>({...rl,actionLoading:!1,message:"上传任务已入队"})),await Q()}catch(rl){i((cl)=>({...cl,actionLoading:!1,error:El(rl,"上传任务创建失败")}))}}async function p(M){M.preventDefault(),i((rl)=>({...rl,actionLoading:!0,error:"",message:""}));try{await Kr(Yr(r,"/api/transfers/download-to-path"),{method:"POST",body:N}),i((rl)=>({...rl,actionLoading:!1,message:"下载任务已入队"})),await Q()}catch(rl){i((cl)=>({...cl,actionLoading:!1,error:El(rl,"下载任务创建失败")}))}}async function V(M,rl){i((cl)=>({...cl,actionLoading:!0,error:"",message:""}));try{await Kr(Yr(r,`/api/transfers/${encodeURIComponent(M)}/${rl}`),{method:"POST",body:{}}),i((cl)=>({...cl,actionLoading:!1,message:rl==="cancel"?"已请求取消任务":"任务已重新入队"})),await Q()}catch(cl){i(($l)=>({...$l,actionLoading:!1,error:El(cl,"任务操作失败")}))}}async function B(){i((M)=>({...M,actionLoading:!0,error:"",message:"正在运行上传/下载自测..."}));try{let M=await Kr(Yr(r,"/api/self-test"),{method:"POST",body:{}});i((rl)=>({...rl,actionLoading:!1,selfTest:M,message:`上传/下载自测通过:${M.remotePath||""}`})),await w(t),await Q()}catch(M){i((rl)=>({...rl,actionLoading:!1,error:El(M,"上传/下载自测失败")}))}}if(I$(()=>{if(!f)return;q();return},[f?.id,f?.runtime?.providerStatus]),I$(()=>{if(!c?.id||c.status!=="pending")return;let M=window.setInterval(()=>void O(!1),Math.max(5000,Number(c.pollIntervalSeconds||5)*1000));return()=>window.clearInterval(M)},[c?.id,c?.status,c?.pollIntervalSeconds]),I$(()=>{if(!f)return;let M=window.setInterval(()=>void Q(),5000);return()=>window.clearInterval(M)},[f?.id]),!f)return x(at,{title:"Baidu Netdisk 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=baidu-netdisk"});let m=iz(f),X=yz(f),S=tz(f),b=n.health||{},z=n.account||b.auth?.account||null,P=b.auth||{},s=cz(n.files),k=_z(n.transfers),v=z?.quota||{},tl=Boolean(P.loggedIn||z),I=Boolean(P.configured);return x("div",{className:"baidu-netdisk-page","data-testid":"baidu-netdisk-page"},x(H0,{title:"Baidu Netdisk 工作台",eyebrow:"Containerized Storage Gateway",loading:n.loading,actions:x("div",{className:"panel-actions"},x("a",{className:"ghost-btn",href:"/docs/issue/baidu-netdisk-env-setup.md",target:"_blank",rel:"noreferrer","data-testid":"baidu-netdisk-config-doc-link"},"配置文档"),x("button",{type:"button",className:"ghost-btn",onClick:q,disabled:n.loading,"data-testid":"baidu-netdisk-refresh"},n.loading?"刷新中":"刷新"),x(xn,{title:"Baidu Netdisk 用户服务",data:f,onOpen:u,testId:"raw-baidu-netdisk-service"}))},x("div",{className:"baidu-netdisk-hero"},x("div",null,x("div",{className:"node-version-line"},x(p0,{status:m.providerStatus==="online"?"online":"warn"},m.providerStatus||"unknown"),x("span",null,f.providerId),x(p0,{status:S.public?"warn":"private"},S.public?"公网暴露":"仅 UniDesk frontend 代理访问")),x("p",{className:"muted paragraph"},f.description)),x("div",{className:"microservice-ref-card"},x("span",null,"Repo"),x("strong",null,X.url||"--"),x("code",null,X.commitId||"--")),x("div",{className:"microservice-ref-card"},x("span",null,"Private Backend"),x("strong",null,`${S.nodeBindHost||"--"}:${S.nodePort||"--"}`),x("code",null,`${X.composeFile||"--"} / ${X.composeService||"--"}`))),x(lu,{error:n.error,wide:!0})),x("div",{className:"metric-grid"},x(It,{label:"Health",value:b.ok?"OK":"--",hint:b.storage?.postgres||"postgres",tone:b.ok?"ok":"warn"}),x(It,{label:"OAuth",value:I?"已配置":"待配置",hint:I?"client + secret + token key":"需要设置 UNIDESK_BAIDU_NETDISK_*",tone:I?"ok":"warn"}),x(It,{label:"Login",value:tl?"已登录":"未登录",hint:z?.username||"Device Code QR",tone:tl?"ok":"warn"}),x(It,{label:"Work Root",value:Az(J),hint:J}),x(It,{label:"Quota",value:Di(v.used),hint:v.total?`${v.usedPercent||0}% / ${Di(v.total)}`:"授权后刷新"}),x(It,{label:"Transfers",value:nz(k.length),hint:`running ${n.transfers?.counts?.running||0} / failed ${n.transfers?.counts?.failed||0}`})),x(H0,{title:"文件浏览器",eyebrow:t,className:"baidu-files-panel",loading:n.loading,actions:x("div",{className:"panel-actions inline-actions"},x("button",{type:"button",className:"ghost-btn",onClick:()=>{let M=$z(t,J);y(M),w(M)},disabled:!tl||t===J},"上级"),x("button",{type:"button",className:"ghost-btn",onClick:()=>w(t),disabled:!tl},"刷新文件"),x(xn,{title:"Baidu Files",data:n.files,onOpen:u,testId:"raw-baidu-files"}))},x("form",{className:"baidu-pathbar",onSubmit:(M)=>{M.preventDefault(),w(t)}},x("input",{value:t,onChange:(M)=>y(M.target.value),disabled:!tl}),x("button",{type:"submit",className:"ghost-btn",disabled:!tl},"打开路径")),x("form",{className:"baidu-pathbar",onSubmit:E},x("input",{value:A,onChange:(M)=>j(M.target.value),placeholder:"新文件夹名称",disabled:!tl}),x("button",{type:"submit",className:"primary-btn",disabled:!tl||!A.trim()},"新建文件夹")),!tl?x(at,{title:"等待授权",text:"登录后通过 /api/files 读取工作目录文件列表"}):s.length===0?x(at,{title:"目录为空",text:"可以从 staging 目录上传文件或新建文件夹"}):x("div",{className:"table-wrap","data-testid":"baidu-netdisk-file-table"},x("table",null,x("thead",null,x("tr",null,x("th",null,"名称"),x("th",null,"类型"),x("th",null,"大小"),x("th",null,"修改时间"),x("th",null,"fs_id"),x("th",null,"操作"))),x("tbody",null,s.map((M)=>x("tr",{key:M.fsId||M.path},x("td",null,x("strong",null,M.serverFilename||M.path),x("code",null,M.path||"--")),x("td",null,x(p0,{status:M.isDir?"queued":"private"},M.isDir?"DIR":"FILE")),x("td",null,M.isDir?"--":Di(M.size)),x("td",null,M.serverMtime?Wl(M.serverMtime*1000):"--"),x("td",null,x("code",null,M.fsId||"--")),x("td",null,x("div",{className:"inline-actions"},M.isDir?x("button",{type:"button",className:"ghost-btn",onClick:()=>{y(M.path),w(M.path)}},"打开"):x("button",{type:"button",className:"ghost-btn",onClick:()=>W((rl)=>({...rl,fsId:M.fsId}))},"填入下载"),x("button",{type:"button",className:"ghost-btn",onClick:()=>D(M.path),disabled:n.actionLoading},"删除"))))))))),x("div",{className:"baidu-netdisk-grid"},x(H0,{title:"配置与文档",eyebrow:"Deployment References",className:"baidu-docs-panel",actions:x("div",{className:"panel-actions inline-actions"},x("a",{className:"ghost-btn",href:"/docs/issue/baidu-netdisk-env-setup.md",target:"_blank",rel:"noreferrer"},"打开环境配置"),x("a",{className:"ghost-btn",href:"/docs/issue/baidu-netdisk-user-service.md",target:"_blank",rel:"noreferrer"},"打开服务方案"))},x("p",{className:"muted paragraph"},I?"OAuth 运行时变量已配置;如需轮换密钥、迁移部署或排查代理边界,可直接打开下面的项目内文档。":"首次使用请先按环境变量配置文档填入百度应用 client id / secret,然后重建 baidu-netdisk 服务并刷新本页。"),x("div",{className:"baidu-doc-grid","data-testid":"baidu-netdisk-doc-links"},x(ot,{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"}),x(ot,{title:"服务方案与 API",text:"说明 OAuth Device Code、根目录工作区、staging 上传下载任务和后端 API 设计。",href:"/docs/issue/baidu-netdisk-user-service.md",badge:"DESIGN"}),x(ot,{title:"用户服务安全边界",text:"查看 UniDesk microservice 私有代理、允许路径、frontendOnly 和密钥边界规则。",href:"/docs/reference/microservices.md",badge:"REF"}),x(ot,{title:"部署与重建流程",text:"查看 server rebuild、Compose 编排、健康检查和交付验证的长期规则。",href:"/docs/reference/deployment.md",badge:"DEPLOY"}),x(ot,{title:"CLI 验证命令",text:"查看 microservice health/proxy、server rebuild、job status 等命令入口。",href:"/docs/reference/cli.md",badge:"CLI"}),x(ot,{title:"百度设备码模式",text:"打开百度官方 OAuth Device Code 文档,对照扫码登录和轮询参数。",href:"https://pan.baidu.com/union/doc/fl1x114ti",badge:"OFFICIAL"}))),x(H0,{title:"设备码登录",eyebrow:"OAuth Device Code",className:"baidu-login-panel",loading:n.actionLoading,actions:x("div",{className:"panel-actions inline-actions"},x("button",{type:"button",className:"primary-btn",onClick:T,disabled:n.actionLoading||!I,"data-testid":"baidu-netdisk-start-login"},"生成二维码"),c?.id?x("button",{type:"button",className:"ghost-btn",onClick:()=>O(!0),disabled:n.actionLoading},"检查状态"):null,tl?x("button",{type:"button",className:"ghost-btn",onClick:Z,disabled:n.actionLoading},"清除本地登录"):null,x(xn,{title:"Baidu Device Session",data:c||P.latestSession,onOpen:u,testId:"raw-baidu-device-session"}))},x("div",{className:"baidu-login-card","data-testid":"baidu-netdisk-login-card"},x("div",{className:"baidu-qr-frame"},c?.qrcodeUrl?x("img",{src:c.qrcodeUrl,alt:"百度网盘设备码授权二维码","data-testid":"baidu-netdisk-qrcode"}):x(at,{title:I?"等待二维码":"OAuth 未配置",text:I?"点击生成二维码后使用百度网盘或百度 App 扫码":"设置 client id、secret 和 token key 后重建服务"})),x("div",{className:"claudeqq-login-copy"},x("div",{className:"node-version-line"},x(p0,{status:tl?"online":c?.status==="pending"?"warn":"unknown"},tl?"已登录":c?.status||"未开始"),x("span",null,c?.secondsRemaining!==void 0?`${c.secondsRemaining}s`:"--"),x("span",null,"scope basic,netdisk")),x("p",{className:"muted paragraph"},tl?"access token / refresh token 已加密保存到 PostgreSQL;前端只看到脱敏登录态。":"后端使用百度 OAuth Device Code 轮询换取 token;二维码过期后重新生成即可。"),x("div",{className:"microservice-ref-card"},x("span",null,"User Code"),x("strong",null,c?.userCode||"--"),x("code",null,c?.verificationUrl||"https://openapi.baidu.com/device")),x("div",{className:"microservice-ref-card"},x("span",null,"Expires"),x("strong",null,c?.expiresAt?Wl(c.expiresAt):"--"),x("code",null,c?.error||"no token exposed"))))),x(H0,{title:"账号与容量",eyebrow:n.refreshedAt?`Updated ${iu(n.refreshedAt)}`:"Account",loading:n.loading,actions:x("div",{className:"panel-actions inline-actions"},x(xn,{title:"Baidu Account",data:z,onOpen:u,testId:"raw-baidu-account"}))},z?x("div",{className:"baidu-account-card"},x("div",{className:"node-version-line"},x(p0,{status:"online"},"connected"),x("span",null,z.baiduUid||"--"),x("span",null,`VIP ${z.vipType??"--"}`)),x("h3",null,z.username||"Baidu Netdisk"),x("p",{className:"muted paragraph"},`工作目录固定在 ${z.rootPath||J};v1 上传/下载只读写容器 staging 目录,不把大文件字节流穿过 UniDesk proxy。`),x("div",{className:"quota-bar"},x("span",{style:{width:`${Math.max(0,Math.min(100,Number(v.usedPercent||0)))}%`}})),x("div",{className:"microservice-ref-card"},x("span",null,"Quota"),x("strong",null,`${Di(v.used)} / ${Di(v.total)}`),x("code",null,`${v.usedPercent||0}% used`))):x(at,{title:"尚未登录",text:"扫码授权后这里会显示账号、UID、会员状态和容量"})),x(H0,{title:"传输任务",eyebrow:"staging path jobs",className:"baidu-transfers-panel",loading:n.actionLoading,actions:x("div",{className:"panel-actions inline-actions"},x("button",{type:"button",className:"primary-btn",onClick:B,disabled:!tl||n.actionLoading,"data-testid":"baidu-netdisk-self-test"},"运行自测"),x("button",{type:"button",className:"ghost-btn",onClick:Q},"刷新任务"),x(xn,{title:"Baidu Transfers",data:n.transfers,onOpen:u,testId:"raw-baidu-transfers"}))},x("div",{className:"baidu-transfer-forms"},x("form",{className:"stack-form",onSubmit:Y,"data-testid":"baidu-upload-form"},x("label",null,"容器 staging 文件",x("input",{value:F.localPath,onChange:(M)=>U((rl)=>({...rl,localPath:M.target.value})),placeholder:"sample.txt"})),x("label",null,"百度网盘目标路径",x("input",{value:F.remotePath,onChange:(M)=>U((rl)=>({...rl,remotePath:M.target.value})),placeholder:d4(J,"sample.txt")})),x("button",{type:"submit",className:"primary-btn",disabled:!tl||n.actionLoading},"上传 staging 文件")),x("form",{className:"stack-form",onSubmit:p,"data-testid":"baidu-download-form"},x("label",null,"文件 fs_id",x("input",{value:N.fsId,onChange:(M)=>W((rl)=>({...rl,fsId:M.target.value})),placeholder:"从文件表填入"})),x("label",null,"保存到 staging 路径",x("input",{value:N.localPath,onChange:(M)=>W((rl)=>({...rl,localPath:M.target.value})),placeholder:"downloads/"})),x("button",{type:"submit",className:"primary-btn",disabled:!tl||!N.fsId||n.actionLoading},"下载到 staging"))),n.selfTest?x("div",{className:"baidu-account-card","data-testid":"baidu-netdisk-self-test-result"},x("div",{className:"node-version-line"},x(p0,{status:n.selfTest.ok?"online":"warn"},n.selfTest.ok?"self-test ok":"self-test"),x("span",null,Di(n.selfTest.sizeBytes))),x("h3",null,n.selfTest.remotePath||"Baidu self-test"),x("div",{className:"microservice-ref-card"},x("span",null,"fs_id"),x("strong",null,n.selfTest.fsId||"--"),x("code",null,n.selfTest.downloadedPath||"--")),x("div",{className:"microservice-ref-card"},x("span",null,"MD5"),x("strong",null,n.selfTest.downloadedMd5||"--"),x("code",null,n.selfTest.expectedMd5||"--")),x(xn,{title:"Baidu Self Test",data:n.selfTest,onOpen:u,testId:"raw-baidu-self-test"})):null,k.length===0?x(at,{title:"暂无传输任务",text:"上传/下载任务会在后端容器内执行,避免大文件穿过 UniDesk proxy"}):x("div",{className:"table-wrap","data-testid":"baidu-transfer-table"},x("table",null,x("thead",null,x("tr",null,x("th",null,"状态"),x("th",null,"方向"),x("th",null,"路径"),x("th",null,"进度"),x("th",null,"时间"),x("th",null,"操作"))),x("tbody",null,k.map((M)=>x("tr",{key:M.id},x("td",null,x(p0,{status:M.status},M.status)),x("td",null,M.direction),x("td",null,x("strong",null,M.remotePath||M.fsId||"--"),x("code",null,M.localPath||"--"),M.error?x("span",{className:"form-error"},M.error):null),x("td",null,x(jz,{percent:M.progressPercent}),x("span",{className:"muted"},`${Di(M.bytesDone)} / ${Di(M.sizeBytes)}`)),x("td",null,Wl(M.updatedAt)),x("td",null,x("div",{className:"inline-actions"},["queued","running"].includes(M.status)?x("button",{type:"button",className:"ghost-btn",onClick:()=>V(M.id,"cancel")},"取消"):null,["failed","canceled"].includes(M.status)?x("button",{type:"button",className:"ghost-btn",onClick:()=>V(M.id,"retry")},"重试"):null,x(xn,{title:`Transfer ${M.id}`,data:M,onOpen:u}))))))))),x(H0,{title:"安全与日志",eyebrow:"redacted diagnostics",className:"baidu-wide-panel",loading:n.loading,actions:x("div",{className:"panel-actions inline-actions"},x(xn,{title:"Baidu Health",data:b,onOpen:u,testId:"raw-baidu-health"}),x(xn,{title:"Baidu Logs",data:n.logs,onOpen:u,testId:"raw-baidu-logs"}))},x("div",{className:"policy-grid"},x("article",null,x("b",null,"私有后端"),x("span",null,"4244 只在 Compose 网络 expose,浏览器经 UniDesk 同源代理访问")),x("article",null,x("b",null,"Token 加密"),x("span",null,"access/refresh token 使用 BAIDU_NETDISK_TOKEN_KEY 加密后写入 PostgreSQL")),x("article",null,x("b",null,"无浏览器大文件流"),x("span",null,"上传/下载以容器 staging 目录为边界,避免 proxy 文本通道传输大字节流"))))))}var e$=Rl(Ju(),1);var d=e$.default.createElement,{useEffect:Fz}=e$.default,o$=e$.default.useState,B0={label:"主用户私聊账号",userId:645275593};function e4(l){let u=Number(l);return Number.isFinite(u)?u.toLocaleString("zh-CN"):"--"}async function Vi(l,u={}){return ml(l,{failureFields:["ok","success"],...u})}async function Jz(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 d$({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return d("span",{className:`status-badge ${r}`},u||l||"unknown")}function dt({label:l,value:u,hint:r,tone:f}){return d("article",{className:`metric-card ${f||""}`},d("div",{className:"metric-label"},l),d("div",{className:"metric-value"},u),d("div",{className:"metric-hint"},r))}function et({title:l,eyebrow:u,actions:r,children:f,className:n,loading:i}){return d("section",{className:`panel ${n||""}`},d("div",{className:"panel-head"},d("div",null,u?d("p",{className:"panel-eyebrow"},u):null,d(fu,{title:l,loading:i})),r?d("div",{className:"panel-actions"},r):null),d("div",{className:"panel-body"},f))}function I1({title:l,data:u,onOpen:r,testId:f}){return d("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:(n)=>{n?.stopPropagation?.(),r(l,u)}},"查看原始JSON")}function a1({title:l,text:u}){return d("div",{className:"empty-state"},d("strong",null,l),d("span",null,u))}function Uz(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function Nz(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function Qz(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function Si(l,u){return`${l}/microservices/claudeqq/proxy${u}`}function wz(l){return Array.isArray(l?.events)?l.events.slice(0,80):[]}function qz(l){return Array.isArray(l?.subscriptions)?l.subscriptions.slice(0,50):[]}function Wz(l){return Array.isArray(l?.messages)?l.messages.slice(0,30):[]}function uN(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 rN(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 fN({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((z)=>z.id==="claudeqq")||null,[n,i]=o$({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}),[t,y]=o$({targetType:"private",targetId:String(B0.userId),message:""}),[c,$]=o$({name:"unidesk-callback",targetUrl:"",eventTypes:"message",secret:""}),[A,j]=o$(""),{addNotification:F}=Xr();async function U(){if(!f)return;i((z)=>({...z,loading:!0,error:""}));try{let[z,P,s,k,v]=await Promise.all([Jz(`${r}/microservices/claudeqq/health`),Vi(Si(r,"/api/server/status")),Vi(Si(r,"/api/events/recent?limit=60")),Vi(Si(r,"/api/events/subscriptions")),Vi(Si(r,"/api/messages/sent?limit=20"))]);if(i((tl)=>({...tl,loading:!1,error:"",health:z,status:P,events:s,subscriptions:k,sent:v,refreshedAt:new Date})),!n.qrcodeFetched)N(!1)}catch(z){i((P)=>({...P,loading:!1,error:El(z,"ClaudeQQ 加载失败")}))}}async function N(z=!0){if(!f)return;i((P)=>({...P,qrLoading:!0,error:z?"":P.error}));try{let P=await Vi(Si(r,"/api/napcat/login")),s=P?.napcat?.qrcode||P?.qrcode||null;i((k)=>({...k,qrLoading:!1,error:"",napcatLogin:P,napcatQrcode:s,qrcodeFetched:!0,qrcodeRefreshedAt:new Date}))}catch(P){i((s)=>({...s,qrLoading:!1,error:z||!s.napcatQrcode?El(P,"NapCat 二维码加载失败"):s.error}))}}async function W(z){z.preventDefault(),j("");let P=Number(t.targetId);if(!Number.isFinite(P)||P<=0||t.message.trim().length===0){i((s)=>({...s,error:"请填写 QQ 目标和消息内容"}));return}try{await Vi(Si(r,"/api/push/text"),{method:"POST",body:JSON.stringify({userId:t.targetType==="private"?P:void 0,groupId:t.targetType==="group"?P:void 0,message:t.message})});let s="消息推送请求已提交";y((k)=>({...k,targetType:"private",targetId:String(B0.userId),message:""})),j(s),F("success",s),await U()}catch(s){i((k)=>({...k,error:El(s,"发送失败")}))}}async function L(z){if(z.preventDefault(),j(""),c.targetUrl.trim().length===0){i((P)=>({...P,error:"请填写订阅回调 URL"}));return}try{await Vi(Si(r,"/api/events/subscriptions"),{method:"POST",body:JSON.stringify({name:c.name,targetUrl:c.targetUrl,eventTypes:c.eventTypes.split(",").map((s)=>s.trim()).filter(Boolean),secret:c.secret||void 0,enabled:!0})});let P="事件订阅已创建";j(P),F("success",P),await U()}catch(P){i((s)=>({...s,error:El(P,"订阅失败")}))}}async function J(z){if(!z)return;j("");try{await Vi(Si(r,`/api/events/subscriptions/${encodeURIComponent(z)}`),{method:"DELETE"});let P="事件订阅已删除";j(P),F("success",P),await U()}catch(P){i((s)=>({...s,error:El(P,"删除订阅失败")}))}}if(Fz(()=>{if(!f)return;U();return},[f?.id,f?.runtime?.providerStatus]),!f)return d(a1,{title:"ClaudeQQ 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=claudeqq"});let w=Uz(f),Q=Qz(f),q=Nz(f),T=n.health||{},O=n.status||{},Z=n.napcatLogin||{},E=T.napcat||O.napcat||{},D={...Z.napcat||{},...E,qrcode:n.napcatQrcode||{},webui:E.webui||Z.napcat?.webui},Y=Z.login||{},p=n.napcatQrcode||{},V=wz(n.events),B=qz(n.subscriptions),m=Wz(n.sent),X=Boolean(D.httpConnected||Y.ready),S=String(D.loginState||Y.state||(X?"logged_in":"unknown")),b=Boolean(p.available&&p.dataUrl);return d("div",{className:"claudeqq-page","data-testid":"claudeqq-page"},d(et,{title:"ClaudeQQ 工作台",eyebrow:"D601 QQ Event Gateway",loading:n.loading,actions:d("div",{className:"panel-actions"},d("button",{type:"button",className:"ghost-btn",onClick:U,disabled:n.loading,"data-testid":"claudeqq-refresh-button"},n.loading?"刷新中":"刷新"),d(I1,{title:"ClaudeQQ 用户服务",data:f,onOpen:u,testId:"raw-claudeqq-service"}))},d("div",{className:"findjob-hero"},d("div",null,d("div",{className:"node-version-line"},d(d$,{status:w.providerStatus==="online"?"online":"warn"},w.providerStatus||"unknown"),d("span",null,f.providerId),d("span",null,q.public?"公网暴露":"仅 UniDesk frontend 代理访问")),d("p",{className:"muted paragraph"},f.description)),d("div",{className:"microservice-ref-card"},d("span",null,"Repo"),d("strong",null,Q.url||"--"),d("code",null,Q.commitId||"--")),d("div",{className:"microservice-ref-card"},d("span",null,"D601 k3s Service"),d("strong",null,`${q.nodeBindHost||"--"}:${q.nodePort||"--"}`),d("code",null,`${q.proxyMode||"--"} / ${Q.composeFile||"--"}`))),d(lu,{error:n.error,wide:!0})),d("div",{className:"metric-grid"},d(dt,{label:"Health",value:T.ok||T.status==="ok"?"OK":"--",hint:"D601 /health",tone:T.ok||T.status==="ok"?"ok":"warn"}),d(dt,{label:"NapCat HTTP",value:D.httpConnected||D.http?.connected?"OK":"离线",hint:`${D.httpHost||T.napcat?.httpHost||"--"}:${D.httpPort||T.napcat?.httpPort||"--"}`}),d(dt,{label:"NapCat WS",value:D.wsConnected||D.ws?.connected?"OK":"离线",hint:`${D.wsHost||T.napcat?.wsHost||"--"}:${D.wsPort||T.napcat?.wsPort||"--"}`}),d(dt,{label:"事件缓存",value:e4(n.events?.count??V.length),hint:"recent QQ events"}),d(dt,{label:"订阅",value:e4(n.subscriptions?.count??B.length),hint:"webhook subscribers"}),d(dt,{label:"已发送",value:e4(n.sent?.count??m.length),hint:"sent message log"})),d("div",{className:"findjob-grid"},d(et,{title:"NapCat 容器登录",eyebrow:"QR Login",className:"claudeqq-login-panel",loading:n.qrLoading,actions:d("div",{className:"panel-actions inline-actions"},d("button",{type:"button",className:"ghost-btn",onClick:()=>N(!0),disabled:n.qrLoading,"data-testid":"claudeqq-napcat-refresh"},n.qrLoading?"刷新中":"手动刷新二维码"),d(I1,{title:"NapCat Login",data:n.napcatLogin,onOpen:u,testId:"raw-claudeqq-napcat-login"}))},d("div",{className:"claudeqq-login-card","data-testid":"claudeqq-napcat-login"},d("div",{className:"claudeqq-qr-frame"},b?d("img",{src:p.dataUrl,alt:"NapCat QQ 登录二维码","data-testid":"claudeqq-napcat-qrcode"}):d(a1,{title:"等待二维码",text:"NapCat 容器启动后会把登录二维码写入 cache/qrcode.png"})),d("div",{className:"claudeqq-login-copy"},d("div",{className:"node-version-line"},d(d$,{status:X?"online":b?"warn":"unknown"},X?"已登录":b?"待扫码":"等待二维码"),d("span",null,S),d("span",null,"D601 containerized")),d("p",{className:"muted paragraph"},X?"NapCat 已登录,ClaudeQQ 可通过容器内 HTTP/WS 链路收发 QQ 消息。":"用手机 QQ 扫描二维码授权登录。二维码只在首次加载或手动刷新时更新,D601 的 NapCat 端口仍只绑定 127.0.0.1。"),d("div",{className:"microservice-ref-card"},d("span",null,"NapCat WebUI"),d("strong",null,D.webui?.url||"http://napcat:6099/webui"),d("code",null,"local-only / proxied QR login")),d("div",{className:"microservice-ref-card"},d("span",null,"QR Source"),d("strong",null,p.modifiedAt?Wl(p.modifiedAt):n.qrcodeRefreshedAt?Wl(n.qrcodeRefreshedAt):"--"),d("code",null,p.file||"/napcat/cache/qrcode.png"))))),d(et,{title:"消息推送",eyebrow:"Push API"},d("div",{className:"microservice-ref-card"},d("span",null,B0.label),d("strong",null,String(B0.userId)),d("code",null,"private userId / 默认推送测试目标")),d("form",{className:"stack-form",onSubmit:W,"data-testid":"claudeqq-push-form"},d("label",null,"目标类型",d("select",{value:t.targetType,onChange:(z)=>y((P)=>({...P,targetType:z.target.value}))},d("option",{value:"private"},"私聊 userId"),d("option",{value:"group"},"群 groupId"))),d("label",null,"QQ ID",d("input",{value:t.targetId,onChange:(z)=>y((P)=>({...P,targetId:z.target.value})),placeholder:String(B0.userId)})),d("label",null,"消息内容",d("textarea",{value:t.message,onChange:(z)=>y((P)=>({...P,message:z.target.value})),rows:4,placeholder:"通过 ClaudeQQ 推送一条 QQ 消息"})),d("button",{type:"submit",className:"primary-btn"},"发送 QQ 消息")),d("p",{className:"muted paragraph"},`主 server 和其他用户服务可通过 UniDesk 同源代理调用 /api/push/text;当前人工推送测试默认使用 ${B0.label} ${B0.userId},不需要暴露 D601 后端端口。`)),d(et,{title:"QQ 事件订阅",eyebrow:"Webhook Subscription",loading:n.loading},d("form",{className:"stack-form",onSubmit:L,"data-testid":"claudeqq-subscription-form"},d("label",null,"订阅名称",d("input",{value:c.name,onChange:(z)=>$((P)=>({...P,name:z.target.value}))})),d("label",null,"回调 URL",d("input",{value:c.targetUrl,onChange:(z)=>$((P)=>({...P,targetUrl:z.target.value})),placeholder:"http://host.docker.internal:18080/..."})),d("label",null,"事件类型",d("input",{value:c.eventTypes,onChange:(z)=>$((P)=>({...P,eventTypes:z.target.value})),placeholder:"message,notice"})),d("label",null,"签名密钥",d("input",{value:c.secret,onChange:(z)=>$((P)=>({...P,secret:z.target.value})),placeholder:"可选,生成 x-claudeqq-signature"})),d("button",{type:"submit",className:"primary-btn"},"创建订阅")),B.length===0?d(a1,{title:"暂无订阅",text:"可以为 main server 或其他用户服务注册 HTTP webhook"}):d("div",{className:"table-wrap","data-testid":"claudeqq-subscription-table"},d("table",null,d("thead",null,d("tr",null,d("th",null,"名称"),d("th",null,"状态"),d("th",null,"事件"),d("th",null,"回调"),d("th",null,"最近投递"),d("th",null,"操作"))),d("tbody",null,B.map((z)=>d("tr",{key:z.id},d("td",null,d("strong",null,z.name||z.id),d("code",null,z.id||"--")),d("td",null,d(d$,{status:z.enabled?"online":"warn"},z.enabled?"enabled":"disabled")),d("td",null,Array.isArray(z.eventTypes)?z.eventTypes.join(", "):"message"),d("td",null,z.targetUrl||"--"),d("td",null,z.lastDelivery?`${z.lastDelivery.ok?"OK":"FAIL"} ${Wl(z.lastDelivery.at)}`:"--"),d("td",null,d("button",{type:"button",className:"ghost-btn",onClick:()=>J(z.id)},"删除"))))))),d("div",{className:"panel-actions inline-actions"},d(I1,{title:"ClaudeQQ Subscriptions",data:n.subscriptions,onOpen:u,testId:"raw-claudeqq-subscriptions"}))),d(et,{title:"最近 QQ 事件",eyebrow:n.refreshedAt?`Updated ${iu(n.refreshedAt)}`:"Event Stream",loading:n.loading},V.length===0?d(a1,{title:"暂无事件",text:"等待 NapCat WebSocket 上报 QQ 消息事件,或通过订阅 API 消费后续事件"}):d("div",{className:"table-wrap","data-testid":"claudeqq-event-list"},d("table",null,d("thead",null,d("tr",null,d("th",null,"时间"),d("th",null,"类型"),d("th",null,"会话"),d("th",null,"消息"),d("th",null,"ID"))),d("tbody",null,V.map((z)=>d("tr",{key:z.id},d("td",null,Wl(z.receivedAt||z.timestamp)),d("td",null,d(d$,{status:z.postType||z.eventType},z.postType||z.eventType||"--")),d("td",null,rN(z)),d("td",null,uN(z)),d("td",null,d("code",null,z.messageId||z.id||"--"))))))),d("div",{className:"panel-actions inline-actions"},d(I1,{title:"ClaudeQQ Events",data:n.events,onOpen:u,testId:"raw-claudeqq-events"}))),d(et,{title:"已发送消息",eyebrow:`${m.length} Sent`,loading:n.loading},m.length===0?d(a1,{title:"暂无发送记录",text:"发送日志来自 ClaudeQQ bot_workspace/messages/sent_messages.jsonl"}):d("div",{className:"table-wrap"},d("table",null,d("thead",null,d("tr",null,d("th",null,"时间"),d("th",null,"目标"),d("th",null,"消息"),d("th",null,"结果"))),d("tbody",null,m.map((z,P)=>d("tr",{key:z.id||P},d("td",null,Wl(z.timestamp||z.sentAt||z.createdAt)),d("td",null,rN(z)),d("td",null,uN(z)),d("td",null,z.status||z.messageId||z.message_id||"--")))))),d("div",{className:"panel-actions inline-actions"},d(I1,{title:"ClaudeQQ Sent Messages",data:n.sent,onOpen:u,testId:"raw-claudeqq-sent"})))))}var yc=Rl(Ju(),1);var tN=Rl(Ju(),1),qu=tN.default.createElement;function d1({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},yN(f,"md"))}function yN(l,u){let r=Lz(l).split(` -`),f=[],n=0;while(n\s?/u.test(i)){let j=[];while(n\s?(.*)$/u);if(U!==null){j.push(U[1]),n+=1;continue}if(F.trim().length===0){j.push(""),n+=1;continue}break}f.push(qu("blockquote",{key:`${u}-quote-${n}`},yN(j.join(` -`),`${u}-quote-${n}`)));continue}if(_N(r,n)){let j=n,F=o1(r[n]??""),U=o1(r[n+1]??"");n+=2;let N=[];while(n0)N.push(o1(r[n]??"")),n+=1;f.push(zz(F,U,N,`${u}-table-${j}`));continue}let c=u3(i);if(c!==null){let j=n,F=c.ordered,U=c.start,N=[];while(nmz(L,`${u}-list-${j}-${J}`))));continue}let $=n,A=[];while(n0&&!Tz(r,n))A.push(r[n].trim()),n+=1;if(A.length===0)A.push(i.trim()),n+=1;f.push(qu("p",{key:`${u}-p-${$}`},Un(A.join(` -`),`${u}-p-${$}`)))}return f}function Lz(l){return String(l||"").replace(/\r\n/gu,` +(()=>{var aW=Object.create;var{getPrototypeOf:oW,defineProperty:Xj,getOwnPropertyNames:dW}=Object;var eW=Object.prototype.hasOwnProperty;function lT(l){return this[l]}var uT,rT,Ml=(l,u,r)=>{var f=l!=null&&typeof l==="object";if(f){var n=u?uT??=new WeakMap:rT??=new WeakMap,t=n.get(l);if(t)return t}r=l!=null?aW(oW(l)):{};let i=u||!l||!l.__esModule?Xj(r,"default",{value:l,enumerable:!0}):r;for(let y of dW(l))if(!eW.call(i,y))Xj(i,y,{get:lT.bind(l,y),enumerable:!0});if(f)n.set(l,i);return i};var Af=(l,u)=>()=>(u||l((u={exports:{}}).exports,u),u.exports);var iu=((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 Ij=Af((lu)=>{var nc=Symbol.for("react.element"),fT=Symbol.for("react.portal"),nT=Symbol.for("react.fragment"),tT=Symbol.for("react.strict_mode"),iT=Symbol.for("react.profiler"),yT=Symbol.for("react.provider"),cT=Symbol.for("react.context"),$T=Symbol.for("react.forward_ref"),_T=Symbol.for("react.suspense"),AT=Symbol.for("react.memo"),FT=Symbol.for("react.lazy"),Pj=Symbol.iterator;function jT(l){if(l===null||typeof l!=="object")return null;return l=Pj&&l[Pj]||l["@@iterator"],typeof l==="function"?l:null}var sj={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Mj=Object.assign,Rj={};function K0(l,u,r){this.props=l,this.context=u,this.refs=Rj,this.updater=r||sj}K0.prototype.isReactComponent={};K0.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")};K0.prototype.forceUpdate=function(l){this.updater.enqueueForceUpdate(this,l,"forceUpdate")};function xj(){}xj.prototype=K0.prototype;function v8(l,u,r){this.props=l,this.context=u,this.refs=Rj,this.updater=r||sj}var g8=v8.prototype=new xj;g8.constructor=v8;Mj(g8,K0.prototype);g8.isPureReactComponent=!0;var Cj=Array.isArray,bj=Object.prototype.hasOwnProperty,k8={current:null},vj={key:!0,ref:!0,__self:!0,__source:!0};function gj(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)bj.call(u,f)&&!vj.hasOwnProperty(f)&&(n[f]=u[f]);var y=arguments.length-2;if(y===1)n.children=r;else if(1{aj.exports=Ij()});var i7=Af((Lu)=>{function e8(l,u){var r=l.length;l.push(u);l:for(;0>>1,n=l[f];if(0>>1;fs$(y,r))cs$(_,y)?(l[f]=_,l[c]=r,f=c):(l[f]=y,l[i]=r,f=i);else if(cs$(_,r))l[f]=_,l[c]=r,f=c;else break l}}return u}function s$(l,u){var r=l.sortIndex-u.sortIndex;return r!==0?r:l.id-u.id}if(typeof performance==="object"&&typeof performance.now==="function")l6=performance,Lu.unstable_now=function(){return l6.now()};else M$=Date,u6=M$.now(),Lu.unstable_now=function(){return M$.now()-u6};var l6,M$,u6,jn=[],Nt=[],LT=1,Ef=null,Lr=3,v$=!1,mi=!1,ic=!1,u7=typeof setTimeout==="function"?setTimeout:null,r7=typeof clearTimeout==="function"?clearTimeout:null,l7=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function r6(l){for(var u=xf(Nt);u!==null;){if(u.callback===null)b$(Nt);else if(u.startTime<=l)b$(Nt),u.sortIndex=u.expirationTime,e8(jn,u);else break;u=xf(Nt)}}function n6(l){if(ic=!1,r6(l),!mi)if(xf(jn)!==null)mi=!0,i6(t6);else{var u=xf(Nt);u!==null&&y6(n6,u.startTime-l)}}function t6(l,u){mi=!1,ic&&(ic=!1,r7(yc),yc=-1),v$=!0;var r=Lr;try{r6(u);for(Ef=xf(jn);Ef!==null&&(!(Ef.expirationTime>u)||l&&!t7());){var f=Ef.callback;if(typeof f==="function"){Ef.callback=null,Lr=Ef.priorityLevel;var n=f(Ef.expirationTime<=u);u=Lu.unstable_now(),typeof n==="function"?Ef.callback=n:Ef===xf(jn)&&b$(jn),r6(u)}else b$(jn);Ef=xf(jn)}if(Ef!==null)var t=!0;else{var i=xf(Nt);i!==null&&y6(n6,i.startTime-u),t=!1}return t}finally{Ef=null,Lr=r,v$=!1}}var g$=!1,R$=null,yc=-1,f7=5,n7=-1;function t7(){return Lu.unstable_now()-n7l||125f?(l.sortIndex=r,e8(Nt,l),xf(jn)===null&&l===xf(Nt)&&(ic?(r7(yc),yc=-1):ic=!0,y6(n6,r-f))):(l.sortIndex=n,e8(jn,l),mi||v$||(mi=!0,i6(t6))),l};Lu.unstable_shouldYield=t7;Lu.unstable_wrapCallback=function(l){var u=Lr;return function(){var r=Lr;Lr=u;try{return l.apply(this,arguments)}finally{Lr=r}}}});var c7=Af((UC,y7)=>{y7.exports=i7()});var _U=Af((Qf)=>{var GT=Ju(),Jf=c7();function ml(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"),O6=Object.prototype.hasOwnProperty,WT=/^[: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]*$/,$7={},_7={};function TT(l){if(O6.call(_7,l))return!0;if(O6.call($7,l))return!1;if(WT.test(l))return _7[l]=!0;return $7[l]=!0,!1}function KT(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 ET(l,u,r,f){if(u===null||typeof u>"u"||KT(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 W4=/[\-:]([a-z])/g;function T4(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(W4,T4);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(W4,T4);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(W4,T4);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 K4(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{$6=!1,Error.prepareStackTrace=r}return(l=l?l.displayName||l.name:"")?Jc(l):""}function pT(l){switch(l.tag){case 5:return Jc(l.type);case 16:return Jc("Lazy");case 13:return Jc("Suspense");case 19:return Jc("SuspenseList");case 0:case 2:case 15:return l=_6(l.type,!1),l;case 11:return l=_6(l.type.render,!1),l;case 1:return l=_6(l.type,!0),l;default:return""}}function D6(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 O0:return"Fragment";case z0:return"Portal";case Z6:return"Profiler";case E4:return"StrictMode";case H6:return"Suspense";case B6:return"SuspenseList"}if(typeof l==="object")switch(l.$$typeof){case JN:return(l.displayName||"Context")+".Consumer";case NN:return(l._context.displayName||"Context")+".Provider";case p4: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:D6(l.type)||"Memo";case Ut:u=l._payload,l=l._init;try{return D6(l(u))}catch(r){}}return null}function zT(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 D6(u);case 8:return u===E4?"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 Zt(l){switch(typeof l){case"boolean":case"number":case"string":case"undefined":return l;case"object":return l;default:return""}}function QN(l){var u=l.type;return(l=l.nodeName)&&l.toLowerCase()==="input"&&(u==="checkbox"||u==="radio")}function OT(l){var u=QN(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 I$(l){l._valueTracker||(l._valueTracker=OT(l))}function mN(l){if(!l)return!1;var u=l._valueTracker;if(!u)return!0;var r=u.getValue(),f="";return l&&(f=QN(l)?l.checked?"true":"false":l.value),l=f,l!==r?(u.setValue(l),!0):!1}function q_(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 S6(l,u){var r=u.checked;return Du({},u,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:r!=null?r:l._wrapperState.initialChecked})}function F7(l,u){var r=u.defaultValue==null?"":u.defaultValue,f=u.checked!=null?u.checked:u.defaultChecked;r=Zt(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&&K4(l,"checked",u,!1)}function V6(l,u){wN(l,u);var r=Zt(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")?Y6(l,u.type,r):u.hasOwnProperty("defaultValue")&&Y6(l,u.type,Zt(u.defaultValue)),u.checked==null&&u.defaultChecked!=null&&(l.defaultChecked=!!u.defaultChecked)}function j7(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 Y6(l,u,r){if(u!=="number"||q_(l.ownerDocument)!==l)r==null?l.defaultValue=""+l._wrapperState.initialValue:l.defaultValue!==""+r&&(l.defaultValue=""+r)}var Uc=Array.isArray;function h0(l,u,r,f){if(l=l.options,u){u={};for(var n=0;n"+u.valueOf().toString()+"";for(u=a$.firstChild;l.firstChild;)l.removeChild(l.firstChild);for(;u.firstChild;)l.appendChild(u.firstChild)}});function Dc(l,u){if(u){var r=l.firstChild;if(r&&r===l.lastChild&&r.nodeType===3){r.nodeValue=u;return}}l.textContent=u}var Wc={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},ZT=["Webkit","ms","Moz","O"];Object.keys(Wc).forEach(function(l){ZT.forEach(function(u){u=u+l.charAt(0).toUpperCase()+l.substring(1),Wc[u]=Wc[l]})});function WN(l,u,r){return u==null||typeof u==="boolean"||u===""?"":r||typeof u!=="number"||u===0||Wc.hasOwnProperty(l)&&Wc[l]?(""+u).trim():u+"px"}function TN(l,u){l=l.style;for(var r in u)if(u.hasOwnProperty(r)){var f=r.indexOf("--")===0,n=WN(r,u[r],f);r==="float"&&(r="cssFloat"),f?l.setProperty(r,n):l[r]=n}}var HT=Du({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 C6(l,u){if(u){if(HT[l]&&(u.children!=null||u.dangerouslySetInnerHTML!=null))throw Error(ml(137,l));if(u.dangerouslySetInnerHTML!=null){if(u.children!=null)throw Error(ml(60));if(typeof u.dangerouslySetInnerHTML!=="object"||!("__html"in u.dangerouslySetInnerHTML))throw Error(ml(61))}if(u.style!=null&&typeof u.style!=="object")throw Error(ml(62))}}function h6(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 s6=null;function O4(l){return l=l.target||l.srcElement||window,l.correspondingUseElement&&(l=l.correspondingUseElement),l.nodeType===3?l.parentNode:l}var M6=null,s0=null,M0=null;function U7(l){if(l=oc(l)){if(typeof M6!=="function")throw Error(ml(280));var u=l.stateNode;u&&(u=k_(u),M6(l.stateNode,l.type,u))}}function KN(l){s0?M0?M0.push(l):M0=[l]:s0=l}function EN(){if(s0){var l=s0,u=M0;if(M0=s0=null,U7(l),u)for(l=0;l>>=0,l===0?32:31-(MT(l)/RT|0)|0}var o$=64,d$=4194304;function Qc(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 T_(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=Qc(y):(t&=i,t!==0&&(f=Qc(t)))}else i=r&~n,i!==0?f=Qc(i):t!==0&&(f=Qc(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 Ic(l,u,r){l.pendingLanes|=u,u!==536870912&&(l.suspendedLanes=0,l.pingedLanes=0),l=l.eventTimes,u=31-If(u),l[u]=r}function gT(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=Kc),K7=String.fromCharCode(32),E7=!1;function vN(l,u){switch(l){case"keyup":return LK.indexOf(u.keyCode)!==-1;case"keydown":return u.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function gN(l){return l=l.detail,typeof l==="object"&&"data"in l?l.data:null}var Z0=!1;function WK(l,u){switch(l){case"compositionend":return gN(u);case"keypress":if(u.which!==32)return null;return E7=!0,K7;case"textInput":return l=u.data,l===K7&&E7?null:l;default:return null}}function TK(l,u){if(Z0)return l==="compositionend"||!X4&&vN(l,u)?(l=xN(),__=S4=qt=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=O7(r)}}function oN(l,u){return l&&u?l===u?!0:l&&l.nodeType===3?!1:u&&u.nodeType===3?oN(l,u.parentNode):("contains"in l)?l.contains(u):l.compareDocumentPosition?!!(l.compareDocumentPosition(u)&16):!1:!1}function dN(){for(var l=window,u=q_();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=q_(l.document)}return u}function P4(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 DK(l){var u=dN(),r=l.focusedElem,f=l.selectionRange;if(u!==r&&r&&r.ownerDocument&&oN(r.ownerDocument.documentElement,r)){if(f!==null&&P4(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=Z7(r,t);var i=Z7(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,H0=null,k6=null,pc=null,I6=!1;function H7(l,u,r){var f=r.window===r?r.document:r.nodeType===9?r:r.ownerDocument;I6||H0==null||H0!==q_(f)||(f=H0,("selectionStart"in f)&&P4(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}),pc&&Cc(pc,f)||(pc=f,f=p_(k6,"onSelect"),0S0||(l.current=f4[S0],f4[S0]=null,S0--)}function Gu(l,u){S0++,f4[S0]=l.current,l.current=u}var Ht={},Kr=Dt(Ht),kr=Dt(!1),pi=Ht;function g0(l,u){var r=l.type.contextTypes;if(!r)return Ht;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 Ir(l){return l=l.childContextTypes,l!==null&&l!==void 0}function O_(){Eu(kr),Eu(Kr)}function P7(l,u,r){if(Kr.current!==Ht)throw Error(ml(168));Gu(Kr,u),Gu(kr,r)}function yJ(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(ml(108,zT(l)||"Unknown",n));return Du({},r,f)}function Z_(l){return l=(l=l.stateNode)&&l.__reactInternalMemoizedMergedChildContext||Ht,pi=Kr.current,Gu(Kr,l),Gu(kr,kr.current),!0}function C7(l,u,r){var f=l.stateNode;if(!f)throw Error(ml(169));r?(l=yJ(l,u,pi),f.__reactInternalMemoizedMergedChildContext=l,Eu(kr),Eu(Kr),Gu(Kr,l)):Eu(kr),Gu(kr,r)}var Cn=null,I_=!1,q6=!1;function cJ(l){Cn===null?Cn=[l]:Cn.push(l)}function RK(l){I_=!0,cJ(l)}function St(){if(!q6&&Cn!==null){q6=!0;var l=0,u=Uu;try{var r=Cn;for(Uu=1;l>=i,n-=i,hn=1<<32-If(u)+n|r<z?(B=O,O=null):B=O.sibling;var Y=j(N,O,m[z],q);if(Y===null){O===null&&(O=B);break}l&&O&&Y.alternate===null&&u(N,O),Q=t(Y,Q,z),p===null?W=Y:p.sibling=Y,p=Y,O=B}if(z===m.length)return r(N,O),Ou&&qi(N,z),W;if(O===null){for(;zz?(B=O,O=null):B=O.sibling;var H=j(N,O,Y.value,q);if(H===null){O===null&&(O=B);break}l&&O&&H.alternate===null&&u(N,O),Q=t(H,Q,z),p===null?W=H:p.sibling=H,p=H,O=B}if(Y.done)return r(N,O),Ou&&qi(N,z),W;if(O===null){for(;!Y.done;z++,Y=m.next())Y=F(N,Y.value,q),Y!==null&&(Q=t(Y,Q,z),p===null?W=Y:p.sibling=Y,p=Y);return Ou&&qi(N,z),W}for(O=f(N,O);!Y.done;z++,Y=m.next())Y=J(O,N,z,Y.value,q),Y!==null&&(l&&Y.alternate!==null&&O.delete(Y.key===null?z:Y.key),Q=t(Y,Q,z),p===null?W=Y:p.sibling=Y,p=Y);return l&&O.forEach(function(D){return u(N,D)}),Ou&&qi(N,z),W}function L(N,Q,m,q){if(typeof m==="object"&&m!==null&&m.type===O0&&m.key===null&&(m=m.props.children),typeof m==="object"&&m!==null){switch(m.$$typeof){case k$:l:{for(var W=m.key,p=Q;p!==null;){if(p.key===W){if(W=m.type,W===O0){if(p.tag===7){r(N,p.sibling),Q=n(p,m.props.children),Q.return=N,N=Q;break l}}else if(p.elementType===W||typeof W==="object"&&W!==null&&W.$$typeof===Ut&&M7(W)===p.type){r(N,p.sibling),Q=n(p,m.props),Q.ref=Fc(N,p,m),Q.return=N,N=Q;break l}r(N,p);break}else u(N,p);p=p.sibling}m.type===O0?(Q=Ei(m.props.children,N.mode,q,m.key),Q.return=N,N=Q):(q=w_(m.type,m.key,m.props,null,N.mode,q),q.ref=Fc(N,Q,m),q.return=N,N=q)}return i(N);case z0: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(N,Q.sibling),Q=n(Q,m.children||[]),Q.return=N,N=Q;break l}else{r(N,Q);break}else u(N,Q);Q=Q.sibling}Q=z6(m,N.mode,q),Q.return=N,N=Q}return i(N);case Ut:return p=m._init,L(N,Q,p(m._payload),q)}if(Uc(m))return U(N,Q,m,q);if(cc(m))return w(N,Q,m,q);t_(N,m)}return typeof m==="string"&&m!==""||typeof m==="number"?(m=""+m,Q!==null&&Q.tag===6?(r(N,Q.sibling),Q=n(Q,m),Q.return=N,N=Q):(r(N,Q),Q=p6(m,N.mode,q),Q.return=N,N=Q),i(N)):r(N,Q)}return L}var I0=FJ(!0),jJ=FJ(!1),D_=Dt(null),S_=null,X0=null,M4=null;function R4(){M4=X0=S_=null}function x4(l){var u=D_.current;Eu(D_),l._currentValue=u}function i4(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 x0(l,u){S_=l,M4=X0=null,l=l.dependencies,l!==null&&l.firstContext!==null&&((l.lanes&u)!==0&&(gr=!0),l.firstContext=null)}function Hf(l){var u=l._currentValue;if(M4!==l)if(l={context:l,memoizedValue:u,next:null},X0===null){if(S_===null)throw Error(ml(308));X0=l,S_.dependencies={lanes:0,firstContext:l}}else X0=X0.next=l;return u}var Wi=null;function b4(l){Wi===null?Wi=[l]:Wi.push(l)}function NJ(l,u,r,f){var n=u.interleaved;return n===null?(r.next=r,b4(u)):(r.next=n.next,n.next=r),u.interleaved=r,bn(l,f)}function bn(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 Qt=!1;function v4(l){l.updateQueue={baseState:l.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function JJ(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 Mn(l,u){return{eventTime:l,lane:u,tag:0,payload:null,callback:null,next:null}}function Et(l,u,r){var f=l.updateQueue;if(f===null)return null;if(f=f.shared,($u&2)!==0){var n=f.pending;return n===null?u.next=u:(u.next=n.next,n.next=u),f.pending=u,bn(l,r)}return n=f.interleaved,n===null?(u.next=u,b4(f)):(u.next=n.next,n.next=u),f.interleaved=u,bn(l,r)}function j_(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,H4(l,r)}}function R7(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 V_(l,u,r,f){var n=l.updateQueue;Qt=!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:J}=y;if((f&j)===j){A!==null&&(A=A.next={eventTime:J,lane:0,tag:y.tag,payload:y.payload,callback:y.callback,next:null});l:{var U=l,w=y;switch(j=u,J=r,w.tag){case 1:if(U=w.payload,typeof U==="function"){F=U.call(J,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(J,F,j):U,j===null||j===void 0)break l;F=Du({},F,j);break l;case 2:Qt=!0}}y.callback!==null&&y.lane!==0&&(l.flags|=64,j=n.effects,j===null?n.effects=[y]:j.push(y))}else J={eventTime:J,lane:j,tag:y.tag,payload:y.payload,callback:y.callback,next:null},A===null?(_=A=J,c=F):A=A.next=J,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);Zi|=i,l.lanes=i,l.memoizedState=F}}function x7(l,u,r){if(l=u.effects,u.effects=null,l!==null)for(u=0;ur?r:4,l(!0);var f=G6.transition;G6.transition={};try{l(!1),u()}finally{Uu=r,G6.transition=f}}function BJ(){return Bf().memoizedState}function gK(l,u,r){var f=zt(l);if(r={lane:f,action:r,hasEagerState:!1,eagerState:null,next:null},DJ(l))SJ(u,r);else if(r=NJ(l,u,r,f),r!==null){var n=Vr();af(r,l,f,n),VJ(r,u,f)}}function kK(l,u,r){var f=zt(l),n={lane:f,action:r,hasEagerState:!1,eagerState:null,next:null};if(DJ(l))SJ(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,of(y,i)){var c=u.interleaved;c===null?(n.next=n,b4(u)):(n.next=c.next,c.next=n),u.interleaved=n;return}}catch(_){}finally{}r=NJ(l,u,n,f),r!==null&&(n=Vr(),af(r,l,f,n),VJ(r,u,f))}}function DJ(l){var u=l.alternate;return l===Bu||u!==null&&u===Bu}function SJ(l,u){zc=X_=!0;var r=l.pending;r===null?u.next=u:(u.next=r.next,r.next=u),l.pending=u}function VJ(l,u,r){if((r&4194240)!==0){var f=u.lanes;f&=l.pendingLanes,r|=f,u.lanes=r,H4(l,r)}}var P_={readContext:Hf,useCallback:Gr,useContext:Gr,useEffect:Gr,useImperativeHandle:Gr,useInsertionEffect:Gr,useLayoutEffect:Gr,useMemo:Gr,useReducer:Gr,useRef:Gr,useState:Gr,useDebugValue:Gr,useDeferredValue:Gr,useTransition:Gr,useMutableSource:Gr,useSyncExternalStore:Gr,useId:Gr,unstable_isNewReconciler:!1},IK={readContext:Hf,useCallback:function(l,u){return Jn().memoizedState=[l,u===void 0?null:u],l},useContext:Hf,useEffect:v7,useImperativeHandle:function(l,u,r){return r=r!==null&&r!==void 0?r.concat([l]):null,J_(4194308,4,pJ.bind(null,u,l),r)},useLayoutEffect:function(l,u){return J_(4194308,4,l,u)},useInsertionEffect:function(l,u){return J_(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=gK.bind(null,Bu,l),[f.memoizedState,l]},useRef:function(l){var u=Jn();return l={current:l},u.memoizedState=l},useState:b7,useDebugValue:l2,useDeferredValue:function(l){return Jn().memoizedState=l},useTransition:function(){var l=b7(!1),u=l[0];return l=vK.bind(null,l[1]),Jn().memoizedState=l,[u,l]},useMutableSource:function(){},useSyncExternalStore:function(l,u,r){var f=Bu,n=Jn();if(Ou){if(r===void 0)throw Error(ml(407));r=r()}else{if(r=u(),$r===null)throw Error(ml(349));(Oi&30)!==0||wJ(f,u,r)}n.memoizedState=r;var t={value:r,getSnapshot:u};return n.queue=t,v7(LJ.bind(null,f,t,l),[l]),f.flags|=2048,gc(9,qJ.bind(null,f,t,r,u),void 0,null),r},useId:function(){var l=Jn(),u=$r.identifierPrefix;if(Ou){var r=sn,f=hn;r=(f&~(1<<32-If(f)-1)).toString(32)+r,u=":"+u+"R"+r,r=bc++,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[Mc]=f,bJ(l,u,!1,!1),u.stateNode=l;l:{switch(i=h6(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;nd0&&(u.flags|=128,f=!0,jc(t,!1),u.lanes=4194304)}else{if(!f)if(l=Y_(i),l!==null){if(u.flags|=128,f=!0,r=l.updateQueue,r!==null&&(u.updateQueue=r,u.flags|=4),jc(t,!0),t.tail===null&&t.tailMode==="hidden"&&!i.alternate&&!Ou)return Wr(u),null}else 2*vu()-t.renderingStartTime>d0&&r!==1073741824&&(u.flags|=128,f=!0,jc(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=vu(),u.sibling=null,r=Hu.current,Gu(Hu,f?r&1|2:r&1),u;return Wr(u),null;case 22:case 23:return i2(),f=u.memoizedState!==null,l!==null&&l.memoizedState!==null!==f&&(u.flags|=8192),f&&(u.mode&1)!==0?(Ff&1073741824)!==0&&(Wr(u),u.subtreeFlags&6&&(u.flags|=8192)):Wr(u),null;case 24:return null;case 25:return null}throw Error(ml(156,u.tag))}function fE(l,u){switch(h4(u),u.tag){case 1:return Ir(u.type)&&O_(),l=u.flags,l&65536?(u.flags=l&-65537|128,u):null;case 3:return a0(),Eu(kr),Eu(Kr),I4(),l=u.flags,(l&65536)!==0&&(l&128)===0?(u.flags=l&-65537|128,u):null;case 5:return k4(u),null;case 13:if(Eu(Hu),l=u.memoizedState,l!==null&&l.dehydrated!==null){if(u.alternate===null)throw Error(ml(340));k0()}return l=u.flags,l&65536?(u.flags=l&-65537|128,u):null;case 19:return Eu(Hu),null;case 4:return a0(),null;case 10:return x4(u.type._context),null;case 22:case 23:return i2(),null;case 24:return null;default:return null}}var y_=!1,Tr=!1,nE=typeof WeakSet==="function"?WeakSet:Set,Bl=null;function P0(l,u){var r=l.ref;if(r!==null)if(typeof r==="function")try{r(null)}catch(f){Mu(l,u,f)}else r.current=null}function J4(l,u,r){try{r()}catch(f){Mu(l,u,f)}}var fN=!1;function tE(l,u){if(d6=K_,l=dN(),P4(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 J;;){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),(J=F.firstChild)===null)break;j=F,F=J}for(;;){if(F===l)break u;if(j===r&&++_===n&&(y=i),j===t&&++A===f&&(c=i),(J=F.nextSibling)!==null)break;F=j,j=F.parentNode}F=J}r=y===-1||c===-1?null:{start:y,end:c}}else r=null}r=r||{start:0,end:0}}else r=null;e6={focusedElem:l,selectionRange:r},K_=!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:L}=U,N=u.stateNode,Q=N.getSnapshotBeforeUpdate(u.elementType===u.type?w:vf(u.type,w),L);N.__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(ml(163))}}catch(q){Mu(u,u.return,q)}if(l=u.sibling,l!==null){l.return=u.return,Bl=l;break}Bl=u.return}return U=fN,fN=!1,U}function Oc(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&&J4(u,r,t)}n=n.next}while(n!==f)}}function d_(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 U4(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 kJ(l){var u=l.alternate;u!==null&&(l.alternate=null,kJ(u)),l.child=null,l.deletions=null,l.sibling=null,l.tag===5&&(u=l.stateNode,u!==null&&(delete u[Un],delete u[Mc],delete u[r4],delete u[sK],delete u[MK])),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 IJ(l){return l.tag===5||l.tag===3||l.tag===4}function nN(l){l:for(;;){for(;l.sibling===null;){if(l.return===null||IJ(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=z_));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 m4(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(m4(l,u,r),l=l.sibling;l!==null;)m4(l,u,r),l=l.sibling}var Fr=null,gf=!1;function Jt(l,u,r){for(r=r.child;r!==null;)aJ(l,u,r),r=r.sibling}function aJ(l,u,r){if(Qn&&typeof Qn.onCommitFiberUnmount==="function")try{Qn.onCommitFiberUnmount(x_,r)}catch(y){}switch(r.tag){case 5:Tr||P0(r,u);case 6:var f=Fr,n=gf;Fr=null,Jt(l,u,r),Fr=f,gf=n,Fr!==null&&(gf?(l=Fr,r=r.stateNode,l.nodeType===8?l.parentNode.removeChild(r):l.removeChild(r)):Fr.removeChild(r.stateNode));break;case 18:Fr!==null&&(gf?(l=Fr,r=r.stateNode,l.nodeType===8?w6(l.parentNode,r):l.nodeType===1&&w6(l,r),Xc(l)):w6(Fr,r.stateNode));break;case 4:f=Fr,n=gf,Fr=r.stateNode.containerInfo,gf=!0,Jt(l,u,r),Fr=f,gf=n;break;case 0:case 11:case 14:case 15:if(!Tr&&(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?J4(r,u,i):(t&4)!==0&&J4(r,u,i)),n=n.next}while(n!==f)}Jt(l,u,r);break;case 1:if(!Tr&&(P0(r,u),f=r.stateNode,typeof f.componentWillUnmount==="function"))try{f.props=r.memoizedProps,f.state=r.memoizedState,f.componentWillUnmount()}catch(y){Mu(r,u,y)}Jt(l,u,r);break;case 21:Jt(l,u,r);break;case 22:r.mode&1?(Tr=(f=Tr)||r.memoizedState!==null,Jt(l,u,r),Tr=f):Jt(l,u,r);break;default:Jt(l,u,r)}}function tN(l){var u=l.updateQueue;if(u!==null){l.updateQueue=null;var r=l.stateNode;r===null&&(r=l.stateNode=new nE),u.forEach(function(f){var n=NE.bind(null,l,f);r.has(f)||(r.add(f),f.then(n,n))})}}function bf(l,u){var r=u.deletions;if(r!==null)for(var f=0;fn&&(n=i),f&=~t}if(f=n,f=vu()-f,f=(120>f?120:480>f?480:1080>f?1080:1920>f?1920:3000>f?3000:4320>f?4320:1960*yE(f/1960))-f,10l?16:l,Lt===null)var f=!1;else{if(l=Lt,Lt=null,s_=0,($u&6)!==0)throw Error(ml(331));var n=$u;$u|=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;cvu()-n2?Ki(l,0):f2|=r),ar(l,u)}function nU(l,u){u===0&&((l.mode&1)===0?u=1:(u=d$,d$<<=1,(d$&130023424)===0&&(d$=4194304)));var r=Vr();l=bn(l,u),l!==null&&(Ic(l,u,r),ar(l,r))}function jE(l){var u=l.memoizedState,r=0;u!==null&&(r=u.retryLane),nU(l,r)}function NE(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(ml(314))}f!==null&&f.delete(u),nU(l,r)}var tU;tU=function(l,u,r){if(l!==null)if(l.memoizedProps!==u.pendingProps||kr.current)gr=!0;else{if((l.lanes&r)===0&&(u.flags&128)===0)return gr=!1,uE(l,u,r);gr=(l.flags&131072)!==0?!0:!1}else gr=!1,Ou&&(u.flags&1048576)!==0&&$J(u,B_,u.index);switch(u.lanes=0,u.tag){case 2:var f=u.type;U_(l,u),l=u.pendingProps;var n=g0(u,Kr.current);x0(u,r),n=o4(null,u,f,l,n,r);var t=d4();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,Ir(f)?(t=!0,Z_(u)):t=!1,u.memoizedState=n.state!==null&&n.state!==void 0?n.state:null,v4(u),n.updater=o_,u.stateNode=n,n._reactInternals=u,c4(u,f,l,r),u=A4(null,u,f,!0,t,r)):(u.tag=0,Ou&&t&&C4(u),Sr(null,u,n,r),u=u.child),u;case 16:f=u.elementType;l:{switch(U_(l,u),l=u.pendingProps,n=f._init,f=n(f._payload),u.type=f,n=u.tag=UE(f),l=vf(f,l),n){case 0:u=_4(null,u,f,l,r);break l;case 1:u=lN(null,u,f,l,r);break l;case 11:u=d7(null,u,f,l,r);break l;case 14:u=e7(null,u,f,vf(f.type,l),r);break l}throw Error(ml(306,f,""))}return u;case 0:return f=u.type,n=u.pendingProps,n=u.elementType===f?n:vf(f,n),_4(l,u,f,n,r);case 1:return f=u.type,n=u.pendingProps,n=u.elementType===f?n:vf(f,n),lN(l,u,f,n,r);case 3:l:{if(MJ(u),l===null)throw Error(ml(387));f=u.pendingProps,t=u.memoizedState,n=t.element,JJ(l,u),V_(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=o0(Error(ml(423)),u),u=uN(l,u,f,r,n);break l}else if(f!==n){n=o0(Error(ml(424)),u),u=uN(l,u,f,r,n);break l}else for(jf=Kt(u.stateNode.containerInfo.firstChild),Nf=u,Ou=!0,kf=null,r=jJ(u,null,f,r),u.child=r;r;)r.flags=r.flags&-3|4096,r=r.sibling;else{if(k0(),f===n){u=vn(l,u,r);break l}Sr(l,u,f,r)}u=u.child}return u;case 5:return UJ(u),l===null&&t4(u),f=u.type,n=u.pendingProps,t=l!==null?l.memoizedProps:null,i=n.children,l4(f,n)?i=null:t!==null&&l4(f,t)&&(u.flags|=32),sJ(l,u),Sr(l,u,i,r),u.child;case 6:return l===null&&t4(u),null;case 13:return RJ(l,u,r);case 4:return g4(u,u.stateNode.containerInfo),f=u.pendingProps,l===null?u.child=I0(u,null,f,r):Sr(l,u,f,r),u.child;case 11:return f=u.type,n=u.pendingProps,n=u.elementType===f?n:vf(f,n),d7(l,u,f,n,r);case 7:return Sr(l,u,u.pendingProps,r),u.child;case 8:return Sr(l,u,u.pendingProps.children,r),u.child;case 12:return Sr(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(D_,f._currentValue),f._currentValue=i,t!==null)if(of(t.value,i)){if(t.children===n.children&&!kr.current){u=vn(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=Mn(-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),i4(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(ml(341));i.lanes|=r,y=i.alternate,y!==null&&(y.lanes|=r),i4(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}Sr(l,u,n.children,r),u=u.child}return u;case 9:return n=u.type,f=u.pendingProps.children,x0(u,r),n=Hf(n),f=f(n),u.flags|=1,Sr(l,u,f,r),u.child;case 14:return f=u.type,n=vf(f,u.pendingProps),n=vf(f.type,n),e7(l,u,f,n,r);case 15:return CJ(l,u,u.type,u.pendingProps,r);case 17:return f=u.type,n=u.pendingProps,n=u.elementType===f?n:vf(f,n),U_(l,u),u.tag=1,Ir(f)?(l=!0,Z_(u)):l=!1,x0(u,r),YJ(u,f,n),c4(u,f,n,r),A4(null,u,f,!0,l,r);case 19:return xJ(l,u,r);case 22:return hJ(l,u,r)}throw Error(ml(156,u.tag))};function iU(l,u){return DN(l,u)}function JE(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 JE(l,u,r,f)}function c2(l){return l=l.prototype,!(!l||!l.isReactComponent)}function UE(l){if(typeof l==="function")return c2(l)?1:0;if(l!==void 0&&l!==null){if(l=l.$$typeof,l===p4)return 11;if(l===z4)return 14}return 2}function Ot(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")c2(l)&&(i=1);else if(typeof l==="string")i=5;else l:switch(l){case O0:return Ei(r.children,n,t,u);case E4:i=8,n|=8;break;case Z6:return l=Of(12,r,u,n|2),l.elementType=Z6,l.lanes=t,l;case H6:return l=Of(13,r,u,n),l.elementType=H6,l.lanes=t,l;case B6:return l=Of(19,r,u,n),l.elementType=B6,l.lanes=t,l;case UN:return l3(r,n,t,u);default:if(typeof l==="object"&&l!==null)switch(l.$$typeof){case NN:i=10;break l;case JN:i=9;break l;case p4:i=11;break l;case z4:i=14;break l;case Ut:i=16,f=null;break l}throw Error(ml(130,l==null?l:typeof l,""))}return u=Of(i,r,u,n),u.elementType=l,u.type=f,u.lanes=t,u}function Ei(l,u,r,f){return l=Of(7,l,f,u),l.lanes=r,l}function l3(l,u,r,f){return l=Of(22,l,f,u),l.elementType=UN,l.lanes=r,l.stateNode={isHidden:!1},l}function p6(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 QE(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=F6(0),this.expirationTimes=F6(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=F6(0),this.identifierPrefix=f,this.onRecoverableError=n,this.mutableSourceEagerHydrationData=null}function $2(l,u,r,f,n,t,i,y,c){return l=new QE(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},v4(t),l}function mE(l,u,r){var f=3{function AU(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=="function")return;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(AU)}catch(l){console.error(l)}}AU(),FU.exports=_U()});var NU=Af((N2)=>{var jU=j2();N2.createRoot=jU.createRoot,N2.hydrateRoot=jU.hydrateRoot;var WE});var Tm=Af((e3)=>{var FZ=Ju(),jZ=Symbol.for("react.element"),NZ=Symbol.for("react.fragment"),JZ=Object.prototype.hasOwnProperty,UZ=FZ.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,QZ={key:!0,ref:!0,__self:!0,__source:!0};function Wm(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)JZ.call(u,f)&&!QZ.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:jZ,type:l,key:t,ref:i,props:n,_owner:UZ.current}}e3.Fragment=NZ;e3.jsx=Wm;e3.jsxs=Wm});var Em=Af((Hh,Km)=>{Km.exports=Tm()});var fq=Af((rq)=>{var Cy=Ju();function SD(l,u){return l===u&&(l!==0||1/l===1/u)||l!==l&&u!==u}var VD=typeof Object.is==="function"?Object.is:SD,YD=Cy.useState,XD=Cy.useEffect,PD=Cy.useLayoutEffect,CD=Cy.useDebugValue;function hD(l,u){var r=u(),f=YD({inst:{value:r,getSnapshot:u}}),n=f[0].inst,t=f[1];return PD(function(){n.value=r,n.getSnapshot=u,m9(n)&&t({inst:n})},[l,r,u]),XD(function(){return m9(n)&&t({inst:n}),l(function(){m9(n)&&t({inst:n})})},[l]),CD(r),r}function m9(l){var u=l.getSnapshot;l=l.value;try{var r=u();return!VD(l,r)}catch(f){return!0}}function sD(l,u){return u()}var MD=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?sD:hD;rq.useSyncExternalStore=Cy.useSyncExternalStore!==void 0?Cy.useSyncExternalStore:MD});var tq=Af((Tv,nq)=>{nq.exports=fq()});var yq=Af((iq)=>{var vA=Ju(),RD=tq();function xD(l,u){return l===u&&(l!==0||1/l===1/u)||l!==l&&u!==u}var bD=typeof Object.is==="function"?Object.is:xD,vD=RD.useSyncExternalStore,gD=vA.useRef,kD=vA.useEffect,ID=vA.useMemo,aD=vA.useDebugValue;iq.useSyncExternalStoreWithSelector=function(l,u,r,f,n){var t=gD(null);if(t.current===null){var i={hasValue:!1,value:null};t.current=i}else i=t.current;t=ID(function(){function c(J){if(!_){if(_=!0,A=J,J=f(J),n!==void 0&&i.hasValue){var U=i.value;if(n(U,J))return F=U}return F=J}if(U=F,bD(A,J))return U;var w=f(J);if(n!==void 0&&n(U,w))return A=J,U;return A=J,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=vD(l,t[0],t[1]);return kD(function(){i.hasValue=!0,i.value=y},[y]),aD(y),y}});var $q=Af((Ev,cq)=>{cq.exports=yq()});var $i=Ml(Ju(),1);var h$="北京时间";var mT={timeZone:"Asia/Shanghai",hour12:!1},wT={timeZone:"Asia/Shanghai",hour12:!1},qT=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 a8(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 oj(l){let u=a8(l);if(!u)return null;return qT.formatToParts(u).reduce((r,f)=>{if(f.type!=="literal")r[f.type]=f.value;return r},{})}function Gl(l){let u=a8(l);return u?u.toLocaleString("zh-CN",mT):"--"}function tu(l){let u=a8(l);return u?u.toLocaleTimeString("zh-CN",wT):"--"}function o8(l){let u=oj(l);if(!u)return"";let r=u.hour==="24"?"00":u.hour;return`${u.year}-${u.month}-${u.day}T${r}:${u.minute}`}function dj(l=new Date){let u=oj(l);if(!u)return"";return`${u.year}-${u.month}-${u.day}`}function ej(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=o8(_);return Number.isNaN(_.getTime())||A!==`${r}-${f}-${n}T${t}:${i}`?null:_.toISOString()}var XG=Ml(NU(),1);var y3=Ml(Ju(),1);var JU=Ml(Ju(),1),ec=JU.default.createElement;function TE({active:l=!0,label:u="正在加载"}){if(!l)return null;return ec("span",{className:"loading-spinner-indicator",role:"status","aria-label":u,title:u,"data-testid":"loading-title-indicator"},ec("span",{className:"loading-spinner-ring","aria-hidden":!0}))}function fu({title:l,children:u,loading:r,level:f=2,className:n="",label:t="正在加载"}){return ec(f===3?"h3":"h2",{className:`loading-title ${r?"is-loading":""} ${n}`.trim()},ec("span",{className:"loading-title-text"},u??l),ec(TE,{active:Boolean(r),label:t}))}class uy extends Error{unideskRequestError=!0;meta;constructor(l,u){super(l);this.name="UniDeskRequestError",this.meta=u}}function KE(l){return new Promise((u)=>setTimeout(u,l))}function r1(l,u="操作失败"){return l instanceof Error?l.message:String(l||u)}function t3(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 EE(l){try{let u=typeof location<"u"&&location.origin?location.origin:"http://localhost";return new URL(l,u).toString()}catch{return l}}function UU(l){return String(l.method||"GET").toUpperCase()}function pE(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 QU(l){let u=new Headers(l.headers||{}),r=pE(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 mU(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 zE(l,u){if(!l||typeof l!=="object"||Array.isArray(l))return!1;return u.some((r)=>r!==!1&&l[r]===!1)}function l1(l,u,r,f,n={}){return{kind:l,method:r,url:EE(u),occurredAt:f.toISOString(),...n}}function u1(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:r1(u,"parse failed")}}}async function El(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=UU(A),j=new Date,J;try{J=await fetch(l,QU(A))}catch(L){let N=r1(L,"网络请求失败");throw new uy(N,l1("network",l,F,j,{upstreamMessage:N}))}let U=await J.text(),w=wU(U);if(w.parseError){if(n&&F==="GET"&&r=300)?u1(l.meta.status,l.meta.statusText):"应用请求失败",t=l.meta.status?u1(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:OE(l.meta.occurredAt),responsePreview:l.meta.responsePreview,parseError:l.meta.parseError,structured:!0}}let f=r1(l,u).split(/\r?\n/u);return{title:f[0]||u,message:f.slice(1).join(` +`),structured:f.length>1}}function ZE(l,u="操作失败"){let r=J2(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(`状态: ${u1(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 LU(l)?ZE(l,u):r1(l,u)}var GU=Ml(Ju(),1);var Vt=GU.default.createElement;function f1(l,u){return u?[Vt("dt",{key:`${l}-label`},l),Vt("dd",{key:l},u)]:null}function el({error:l,wide:u=!1,fallback:r="操作失败",className:f=""}){if(!l)return null;let n=J2(l,r),t=[f1("请求",[n.method,n.url].filter(Boolean).join(" ")),f1("状态",n.status?`HTTP ${n.status}${n.statusText?` ${n.statusText}`:""}`:""),f1("时间",n.occurredAt),f1("解析错误",n.parseError),f1("响应预览",n.responsePreview)].filter(Boolean);return Vt("div",{className:`form-error unidesk-error${u?" wide":""}${f?` ${f}`:""}`,role:"alert","data-testid":"unidesk-error"},Vt("div",{className:"unidesk-error-title"},Vt("strong",null,n.title),n.status?Vt("span",{className:"unidesk-error-code"},`HTTP ${n.status}`):null),n.message?Vt("pre",{className:"unidesk-error-message"},n.message):null,t.length>0?Vt("dl",{className:"unidesk-error-details"},t):null)}var wn=Ml(Ju(),1),WU=wn.default.createContext(null);function TU({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 L=[...w,U];if(L.length>50)return L.slice(-50);return L})},[]),i=wn.default.useCallback((F)=>{r((j)=>j.filter((J)=>J.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 HE(WU.Provider,{value:A},l)}var HE=wn.default.createElement;function Xr(){let l=wn.default.useContext(WU);if(!l)throw Error("useNotification must be used within NotificationProvider");return l}var b=y3.default.createElement,{useEffect:i3}=y3.default,ry=y3.default.useState;function Er(l,u={}){return El(l,{failureFields:["ok","success"],...u})}function Pr(l,u){return`${l}/microservices/baidu-netdisk/proxy${u}`}function BE(l){let u=Number(l);return Number.isFinite(u)?u.toLocaleString("zh-CN"):"--"}function Yt(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 ny({title:l,text:u}){return b("div",{className:"empty-state"},b("strong",null,l),b("span",null,u))}function ty({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 DE(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function SE(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function VE(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function YE(l){return Array.isArray(l?.files)?l.files:[]}function XE(l){return Array.isArray(l?.jobs)?l.jobs:[]}function PE(l,u){if(!l||l===u)return u;let r=l.replace(/\/+$/u,""),f=r.slice(0,r.lastIndexOf("/"))||u;return f.lengthh.id==="baidu-netdisk")||null,[n,t]=ry({loading:!1,actionLoading:!1,error:"",message:"",health:null,account:null,files:null,transfers:null,logs:null,selfTest:null,refreshedAt:null}),[i,y]=ry("/"),[c,_]=ry(null),[A,F]=ry(""),[j,J]=ry({localPath:"sample.txt",remotePath:"/sample.txt"}),[U,w]=ry({fsId:"",localPath:"downloads/"}),{addNotification:L}=Xr(),N=n.health?.baidu?.appRoot||n.account?.rootPath||"/";i3(()=>{J((h)=>{let rl=new Set(["/sample.txt","/apps/UniDeskBaiduNetdisk/sample.txt"]);if(h.remotePath&&!rl.has(h.remotePath))return h;let _l=U2(N,"sample.txt");return h.remotePath===_l?h:{...h,remotePath:_l}})},[N]);async function Q(h=i){let _l=await Er(Pr(r,`/api/files?dir=${encodeURIComponent(h||N)}&limit=100`));t((Al)=>({...Al,files:_l}))}async function m(){let h=await Er(Pr(r,"/api/transfers?limit=80"));t((rl)=>({...rl,transfers:h}))}async function q(){if(!f)return;t((h)=>({...h,loading:!0,error:"",message:""}));try{let h=await Er(`${r}/microservices/baidu-netdisk/health`),rl=h?.baidu?.appRoot||N,_l=null,Al=null;if(h?.auth?.loggedIn){_l=await Er(Pr(r,"/api/account?refresh=1"));let pl=i&&i.startsWith(rl)?i:rl;y(pl),Al=await Er(Pr(r,`/api/files?dir=${encodeURIComponent(pl)}&limit=100`))}else y(rl);let Ll=await Er(Pr(r,"/api/transfers?limit=80")),Ql=await Er(Pr(r,"/logs?limit=60"));t((pl)=>({...pl,loading:!1,health:h,account:_l?.account||null,files:Al,transfers:Ll,logs:Ql,refreshedAt:new Date}))}catch(h){t((rl)=>({...rl,loading:!1,error:zl(h,"百度网盘服务加载失败")}))}}async function W(){t((h)=>({...h,actionLoading:!0,error:"",message:""}));try{let h=await Er(Pr(r,"/api/auth/device/start"),{method:"POST",body:{}});_(h.session||null),t((rl)=>({...rl,actionLoading:!1,message:"设备码已生成,请扫码授权"}))}catch(h){t((rl)=>({...rl,actionLoading:!1,error:zl(h,"创建设备码失败")}))}}async function p(h=!1){if(!c?.id)return;if(h)t((rl)=>({...rl,actionLoading:!0,error:""}));try{let rl=await Er(Pr(r,`/api/auth/device/status?sessionId=${encodeURIComponent(c.id)}`));if(_(rl.session||null),rl.session?.status==="succeeded")t((_l)=>({..._l,actionLoading:!1,message:"授权成功,正在刷新账号与文件列表"})),await q();else if(h)t((_l)=>({..._l,actionLoading:!1}))}catch(rl){t((_l)=>({..._l,actionLoading:!1,error:zl(rl,"轮询登录状态失败")}))}}async function O(){t((h)=>({...h,actionLoading:!0,error:"",message:""}));try{await Er(Pr(r,"/api/auth/logout"),{method:"POST",body:{}}),_(null),t((h)=>({...h,actionLoading:!1,account:null,files:null,message:"本地 token 已清除"})),await q()}catch(h){t((rl)=>({...rl,actionLoading:!1,error:zl(h,"退出登录失败")}))}}async function z(h){h.preventDefault();let rl=A.trim();if(!rl)return;t((_l)=>({..._l,actionLoading:!0,error:"",message:""}));try{await Er(Pr(r,"/api/folders"),{method:"POST",body:{path:U2(i,rl)}}),F(""),t((_l)=>({..._l,actionLoading:!1,message:"文件夹已创建"})),await Q(i)}catch(_l){t((Al)=>({...Al,actionLoading:!1,error:zl(_l,"创建文件夹失败")}))}}async function B(h){if(!h)return;t((rl)=>({...rl,actionLoading:!0,error:"",message:""}));try{await Er(Pr(r,"/api/files/manage"),{method:"POST",body:{opera:"delete",filelist:[{path:h}],async:1}}),t((rl)=>({...rl,actionLoading:!1,message:"删除任务已提交"})),await Q(i)}catch(rl){t((_l)=>({..._l,actionLoading:!1,error:zl(rl,"删除失败")}))}}async function Y(h){h.preventDefault(),t((rl)=>({...rl,actionLoading:!0,error:"",message:""}));try{await Er(Pr(r,"/api/transfers/upload-from-path"),{method:"POST",body:j}),t((rl)=>({...rl,actionLoading:!1,message:"上传任务已入队"})),await m()}catch(rl){t((_l)=>({..._l,actionLoading:!1,error:zl(rl,"上传任务创建失败")}))}}async function H(h){h.preventDefault(),t((rl)=>({...rl,actionLoading:!0,error:"",message:""}));try{await Er(Pr(r,"/api/transfers/download-to-path"),{method:"POST",body:U}),t((rl)=>({...rl,actionLoading:!1,message:"下载任务已入队"})),await m()}catch(rl){t((_l)=>({..._l,actionLoading:!1,error:zl(rl,"下载任务创建失败")}))}}async function D(h,rl){t((_l)=>({..._l,actionLoading:!0,error:"",message:""}));try{await Er(Pr(r,`/api/transfers/${encodeURIComponent(h)}/${rl}`),{method:"POST",body:{}}),t((_l)=>({..._l,actionLoading:!1,message:rl==="cancel"?"已请求取消任务":"任务已重新入队"})),await m()}catch(_l){t((Al)=>({...Al,actionLoading:!1,error:zl(_l,"任务操作失败")}))}}async function P(){t((h)=>({...h,actionLoading:!0,error:"",message:"正在运行上传/下载自测..."}));try{let h=await Er(Pr(r,"/api/self-test"),{method:"POST",body:{}});t((rl)=>({...rl,actionLoading:!1,selfTest:h,message:`上传/下载自测通过:${h.remotePath||""}`})),await Q(i),await m()}catch(h){t((rl)=>({...rl,actionLoading:!1,error:zl(h,"上传/下载自测失败")}))}}if(i3(()=>{if(!f)return;q();return},[f?.id,f?.runtime?.providerStatus]),i3(()=>{if(!c?.id||c.status!=="pending")return;let h=window.setInterval(()=>void p(!1),Math.max(5000,Number(c.pollIntervalSeconds||5)*1000));return()=>window.clearInterval(h)},[c?.id,c?.status,c?.pollIntervalSeconds]),i3(()=>{if(!f)return;let h=window.setInterval(()=>void m(),5000);return()=>window.clearInterval(h)},[f?.id]),!f)return b(ny,{title:"Baidu Netdisk 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=baidu-netdisk"});let E=DE(f),S=VE(f),V=SE(f),v=n.health||{},K=n.account||v.auth?.account||null,X=v.auth||{},I=YE(n.files),a=XE(n.transfers),R=K?.quota||{},nl=Boolean(X.loggedIn||K),d=Boolean(X.configured);return b("div",{className:"baidu-netdisk-page","data-testid":"baidu-netdisk-page"},b(Vi,{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(kn,{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:V.public?"warn":"private"},V.public?"公网暴露":"仅 UniDesk frontend 代理访问")),b("p",{className:"muted paragraph"},f.description)),b("div",{className:"microservice-ref-card"},b("span",null,"Repo"),b("strong",null,S.url||"--"),b("code",null,S.commitId||"--")),b("div",{className:"microservice-ref-card"},b("span",null,"Private Backend"),b("strong",null,`${V.nodeBindHost||"--"}:${V.nodePort||"--"}`),b("code",null,`${S.composeFile||"--"} / ${S.composeService||"--"}`))),b(el,{error:n.error,wide:!0})),b("div",{className:"metric-grid"},b(fy,{label:"Health",value:v.ok?"OK":"--",hint:v.storage?.postgres||"postgres",tone:v.ok?"ok":"warn"}),b(fy,{label:"OAuth",value:d?"已配置":"待配置",hint:d?"client + secret + token key":"需要设置 UNIDESK_BAIDU_NETDISK_*",tone:d?"ok":"warn"}),b(fy,{label:"Login",value:nl?"已登录":"未登录",hint:K?.username||"Device Code QR",tone:nl?"ok":"warn"}),b(fy,{label:"Work Root",value:CE(N),hint:N}),b(fy,{label:"Quota",value:Yt(R.used),hint:R.total?`${R.usedPercent||0}% / ${Yt(R.total)}`:"授权后刷新"}),b(fy,{label:"Transfers",value:BE(a.length),hint:`running ${n.transfers?.counts?.running||0} / failed ${n.transfers?.counts?.failed||0}`})),b(Vi,{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 h=PE(i,N);y(h),Q(h)},disabled:!nl||i===N},"上级"),b("button",{type:"button",className:"ghost-btn",onClick:()=>Q(i),disabled:!nl},"刷新文件"),b(kn,{title:"Baidu Files",data:n.files,onOpen:u,testId:"raw-baidu-files"}))},b("form",{className:"baidu-pathbar",onSubmit:(h)=>{h.preventDefault(),Q(i)}},b("input",{value:i,onChange:(h)=>y(h.target.value),disabled:!nl}),b("button",{type:"submit",className:"ghost-btn",disabled:!nl},"打开路径")),b("form",{className:"baidu-pathbar",onSubmit:z},b("input",{value:A,onChange:(h)=>F(h.target.value),placeholder:"新文件夹名称",disabled:!nl}),b("button",{type:"submit",className:"primary-btn",disabled:!nl||!A.trim()},"新建文件夹")),!nl?b(ny,{title:"等待授权",text:"登录后通过 /api/files 读取工作目录文件列表"}):I.length===0?b(ny,{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((h)=>b("tr",{key:h.fsId||h.path},b("td",null,b("strong",null,h.serverFilename||h.path),b("code",null,h.path||"--")),b("td",null,b(Si,{status:h.isDir?"queued":"private"},h.isDir?"DIR":"FILE")),b("td",null,h.isDir?"--":Yt(h.size)),b("td",null,h.serverMtime?Gl(h.serverMtime*1000):"--"),b("td",null,b("code",null,h.fsId||"--")),b("td",null,b("div",{className:"inline-actions"},h.isDir?b("button",{type:"button",className:"ghost-btn",onClick:()=>{y(h.path),Q(h.path)}},"打开"):b("button",{type:"button",className:"ghost-btn",onClick:()=>w((rl)=>({...rl,fsId:h.fsId}))},"填入下载"),b("button",{type:"button",className:"ghost-btn",onClick:()=>B(h.path),disabled:n.actionLoading},"删除"))))))))),b("div",{className:"baidu-netdisk-grid"},b(Vi,{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"},d?"OAuth 运行时变量已配置;如需轮换密钥、迁移部署或排查代理边界,可直接打开下面的项目内文档。":"首次使用请先按环境变量配置文档填入百度应用 client id / secret,然后重建 baidu-netdisk 服务并刷新本页。"),b("div",{className:"baidu-doc-grid","data-testid":"baidu-netdisk-doc-links"},b(ty,{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(ty,{title:"服务方案与 API",text:"说明 OAuth Device Code、根目录工作区、staging 上传下载任务和后端 API 设计。",href:"/docs/issue/baidu-netdisk-user-service.md",badge:"DESIGN"}),b(ty,{title:"用户服务安全边界",text:"查看 UniDesk microservice 私有代理、允许路径、frontendOnly 和密钥边界规则。",href:"/docs/reference/microservices.md",badge:"REF"}),b(ty,{title:"部署与重建流程",text:"查看 server rebuild、Compose 编排、健康检查和交付验证的长期规则。",href:"/docs/reference/deployment.md",badge:"DEPLOY"}),b(ty,{title:"CLI 验证命令",text:"查看 microservice health/proxy、server rebuild、job status 等命令入口。",href:"/docs/reference/cli.md",badge:"CLI"}),b(ty,{title:"百度设备码模式",text:"打开百度官方 OAuth Device Code 文档,对照扫码登录和轮询参数。",href:"https://pan.baidu.com/union/doc/fl1x114ti",badge:"OFFICIAL"}))),b(Vi,{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||!d,"data-testid":"baidu-netdisk-start-login"},"生成二维码"),c?.id?b("button",{type:"button",className:"ghost-btn",onClick:()=>p(!0),disabled:n.actionLoading},"检查状态"):null,nl?b("button",{type:"button",className:"ghost-btn",onClick:O,disabled:n.actionLoading},"清除本地登录"):null,b(kn,{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(ny,{title:d?"等待二维码":"OAuth 未配置",text:d?"点击生成二维码后使用百度网盘或百度 App 扫码":"设置 client id、secret 和 token key 后重建服务"})),b("div",{className:"claudeqq-login-copy"},b("div",{className:"node-version-line"},b(Si,{status:nl?"online":c?.status==="pending"?"warn":"unknown"},nl?"已登录":c?.status||"未开始"),b("span",null,c?.secondsRemaining!==void 0?`${c.secondsRemaining}s`:"--"),b("span",null,"scope basic,netdisk")),b("p",{className:"muted paragraph"},nl?"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?Gl(c.expiresAt):"--"),b("code",null,c?.error||"no token exposed"))))),b(Vi,{title:"账号与容量",eyebrow:n.refreshedAt?`Updated ${tu(n.refreshedAt)}`:"Account",loading:n.loading,actions:b("div",{className:"panel-actions inline-actions"},b(kn,{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||N};v1 上传/下载只读写容器 staging 目录,不把大文件字节流穿过 UniDesk proxy。`),b("div",{className:"quota-bar"},b("span",{style:{width:`${Math.max(0,Math.min(100,Number(R.usedPercent||0)))}%`}})),b("div",{className:"microservice-ref-card"},b("span",null,"Quota"),b("strong",null,`${Yt(R.used)} / ${Yt(R.total)}`),b("code",null,`${R.usedPercent||0}% used`))):b(ny,{title:"尚未登录",text:"扫码授权后这里会显示账号、UID、会员状态和容量"})),b(Vi,{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:P,disabled:!nl||n.actionLoading,"data-testid":"baidu-netdisk-self-test"},"运行自测"),b("button",{type:"button",className:"ghost-btn",onClick:m},"刷新任务"),b(kn,{title:"Baidu Transfers",data:n.transfers,onOpen:u,testId:"raw-baidu-transfers"}))},b("div",{className:"baidu-transfer-forms"},b("form",{className:"stack-form",onSubmit:Y,"data-testid":"baidu-upload-form"},b("label",null,"容器 staging 文件",b("input",{value:j.localPath,onChange:(h)=>J((rl)=>({...rl,localPath:h.target.value})),placeholder:"sample.txt"})),b("label",null,"百度网盘目标路径",b("input",{value:j.remotePath,onChange:(h)=>J((rl)=>({...rl,remotePath:h.target.value})),placeholder:U2(N,"sample.txt")})),b("button",{type:"submit",className:"primary-btn",disabled:!nl||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:(h)=>w((rl)=>({...rl,fsId:h.target.value})),placeholder:"从文件表填入"})),b("label",null,"保存到 staging 路径",b("input",{value:U.localPath,onChange:(h)=>w((rl)=>({...rl,localPath:h.target.value})),placeholder:"downloads/"})),b("button",{type:"submit",className:"primary-btn",disabled:!nl||!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,Yt(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(kn,{title:"Baidu Self Test",data:n.selfTest,onOpen:u,testId:"raw-baidu-self-test"})):null,a.length===0?b(ny,{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,a.map((h)=>b("tr",{key:h.id},b("td",null,b(Si,{status:h.status},h.status)),b("td",null,h.direction),b("td",null,b("strong",null,h.remotePath||h.fsId||"--"),b("code",null,h.localPath||"--"),h.error?b("span",{className:"form-error"},h.error):null),b("td",null,b(hE,{percent:h.progressPercent}),b("span",{className:"muted"},`${Yt(h.bytesDone)} / ${Yt(h.sizeBytes)}`)),b("td",null,Gl(h.updatedAt)),b("td",null,b("div",{className:"inline-actions"},["queued","running"].includes(h.status)?b("button",{type:"button",className:"ghost-btn",onClick:()=>D(h.id,"cancel")},"取消"):null,["failed","canceled"].includes(h.status)?b("button",{type:"button",className:"ghost-btn",onClick:()=>D(h.id,"retry")},"重试"):null,b(kn,{title:`Transfer ${h.id}`,data:h,onOpen:u}))))))))),b(Vi,{title:"安全与日志",eyebrow:"redacted diagnostics",className:"baidu-wide-panel",loading:n.loading,actions:b("div",{className:"panel-actions inline-actions"},b(kn,{title:"Baidu Health",data:v,onOpen:u,testId:"raw-baidu-health"}),b(kn,{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 _3=Ml(Ju(),1);var ll=_3.default.createElement,{useEffect:sE}=_3.default,c3=_3.default.useState,Yi={label:"主用户私聊账号",userId:645275593};function Q2(l){let u=Number(l);return Number.isFinite(u)?u.toLocaleString("zh-CN"):"--"}async function Xt(l,u={}){return El(l,{failureFields:["ok","success"],...u})}async function ME(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 $3({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return ll("span",{className:`status-badge ${r}`},u||l||"unknown")}function iy({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 yy({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(fu,{title:l,loading:t})),r?ll("div",{className:"panel-actions"},r):null),ll("div",{className:"panel-body"},f))}function n1({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 t1({title:l,text:u}){return ll("div",{className:"empty-state"},ll("strong",null,l),ll("span",null,u))}function RE(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function xE(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function bE(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function Pt(l,u){return`${l}/microservices/claudeqq/proxy${u}`}function vE(l){return Array.isArray(l?.events)?l.events.slice(0,80):[]}function gE(l){return Array.isArray(l?.subscriptions)?l.subscriptions.slice(0,50):[]}function kE(l){return Array.isArray(l?.messages)?l.messages.slice(0,30):[]}function EU(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 pU(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 zU({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((K)=>K.id==="claudeqq")||null,[n,t]=c3({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]=c3({targetType:"private",targetId:String(Yi.userId),message:""}),[c,_]=c3({name:"unidesk-callback",targetUrl:"",eventTypes:"message",secret:""}),[A,F]=c3(""),{addNotification:j}=Xr();async function J(){if(!f)return;t((K)=>({...K,loading:!0,error:""}));try{let[K,X,I,a,R]=await Promise.all([ME(`${r}/microservices/claudeqq/health`),Xt(Pt(r,"/api/server/status")),Xt(Pt(r,"/api/events/recent?limit=60")),Xt(Pt(r,"/api/events/subscriptions")),Xt(Pt(r,"/api/messages/sent?limit=20"))]);if(t((nl)=>({...nl,loading:!1,error:"",health:K,status:X,events:I,subscriptions:a,sent:R,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 Xt(Pt(r,"/api/napcat/login")),I=X?.napcat?.qrcode||X?.qrcode||null;t((a)=>({...a,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 Xt(Pt(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((a)=>({...a,targetType:"private",targetId:String(Yi.userId),message:""})),F(I),j("success",I),await J()}catch(I){t((a)=>({...a,error:zl(I,"发送失败")}))}}async function L(K){if(K.preventDefault(),F(""),c.targetUrl.trim().length===0){t((X)=>({...X,error:"请填写订阅回调 URL"}));return}try{await Xt(Pt(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 J()}catch(X){t((I)=>({...I,error:zl(X,"订阅失败")}))}}async function N(K){if(!K)return;F("");try{await Xt(Pt(r,`/api/events/subscriptions/${encodeURIComponent(K)}`),{method:"DELETE"});let X="事件订阅已删除";F(X),j("success",X),await J()}catch(X){t((I)=>({...I,error:zl(X,"删除订阅失败")}))}}if(sE(()=>{if(!f)return;J();return},[f?.id,f?.runtime?.providerStatus]),!f)return ll(t1,{title:"ClaudeQQ 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=claudeqq"});let Q=RE(f),m=bE(f),q=xE(f),W=n.health||{},p=n.status||{},O=n.napcatLogin||{},z=W.napcat||p.napcat||{},B={...O.napcat||{},...z,qrcode:n.napcatQrcode||{},webui:z.webui||O.napcat?.webui},Y=O.login||{},H=n.napcatQrcode||{},D=vE(n.events),P=gE(n.subscriptions),E=kE(n.sent),S=Boolean(B.httpConnected||Y.ready),V=String(B.loginState||Y.state||(S?"logged_in":"unknown")),v=Boolean(H.available&&H.dataUrl);return ll("div",{className:"claudeqq-page","data-testid":"claudeqq-page"},ll(yy,{title:"ClaudeQQ 工作台",eyebrow:"D601 QQ Event Gateway",loading:n.loading,actions:ll("div",{className:"panel-actions"},ll("button",{type:"button",className:"ghost-btn",onClick:J,disabled:n.loading,"data-testid":"claudeqq-refresh-button"},n.loading?"刷新中":"刷新"),ll(n1,{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($3,{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(iy,{label:"Health",value:W.ok||W.status==="ok"?"OK":"--",hint:"D601 /health",tone:W.ok||W.status==="ok"?"ok":"warn"}),ll(iy,{label:"NapCat HTTP",value:B.httpConnected||B.http?.connected?"OK":"离线",hint:`${B.httpHost||W.napcat?.httpHost||"--"}:${B.httpPort||W.napcat?.httpPort||"--"}`}),ll(iy,{label:"NapCat WS",value:B.wsConnected||B.ws?.connected?"OK":"离线",hint:`${B.wsHost||W.napcat?.wsHost||"--"}:${B.wsPort||W.napcat?.wsPort||"--"}`}),ll(iy,{label:"事件缓存",value:Q2(n.events?.count??D.length),hint:"recent QQ events"}),ll(iy,{label:"订阅",value:Q2(n.subscriptions?.count??P.length),hint:"webhook subscribers"}),ll(iy,{label:"已发送",value:Q2(n.sent?.count??E.length),hint:"sent message log"})),ll("div",{className:"findjob-grid"},ll(yy,{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(n1,{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(t1,{title:"等待二维码",text:"NapCat 容器启动后会把登录二维码写入 cache/qrcode.png"})),ll("div",{className:"claudeqq-login-copy"},ll("div",{className:"node-version-line"},ll($3,{status:S?"online":v?"warn":"unknown"},S?"已登录":v?"待扫码":"等待二维码"),ll("span",null,V),ll("span",null,"D601 containerized")),ll("p",{className:"muted paragraph"},S?"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,B.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?Gl(H.modifiedAt):n.qrcodeRefreshedAt?Gl(n.qrcodeRefreshedAt):"--"),ll("code",null,H.file||"/napcat/cache/qrcode.png"))))),ll(yy,{title:"消息推送",eyebrow:"Push API"},ll("div",{className:"microservice-ref-card"},ll("span",null,Yi.label),ll("strong",null,String(Yi.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(Yi.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;当前人工推送测试默认使用 ${Yi.label} ${Yi.userId},不需要暴露 D601 后端端口。`)),ll(yy,{title:"QQ 事件订阅",eyebrow:"Webhook Subscription",loading:n.loading},ll("form",{className:"stack-form",onSubmit:L,"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"},"创建订阅")),P.length===0?ll(t1,{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,P.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($3,{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"} ${Gl(K.lastDelivery.at)}`:"--"),ll("td",null,ll("button",{type:"button",className:"ghost-btn",onClick:()=>N(K.id)},"删除"))))))),ll("div",{className:"panel-actions inline-actions"},ll(n1,{title:"ClaudeQQ Subscriptions",data:n.subscriptions,onOpen:u,testId:"raw-claudeqq-subscriptions"}))),ll(yy,{title:"最近 QQ 事件",eyebrow:n.refreshedAt?`Updated ${tu(n.refreshedAt)}`:"Event Stream",loading:n.loading},D.length===0?ll(t1,{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,D.map((K)=>ll("tr",{key:K.id},ll("td",null,Gl(K.receivedAt||K.timestamp)),ll("td",null,ll($3,{status:K.postType||K.eventType},K.postType||K.eventType||"--")),ll("td",null,pU(K)),ll("td",null,EU(K)),ll("td",null,ll("code",null,K.messageId||K.id||"--"))))))),ll("div",{className:"panel-actions inline-actions"},ll(n1,{title:"ClaudeQQ Events",data:n.events,onOpen:u,testId:"raw-claudeqq-events"}))),ll(yy,{title:"已发送消息",eyebrow:`${E.length} Sent`,loading:n.loading},E.length===0?ll(t1,{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,Gl(K.timestamp||K.sentAt||K.createdAt)),ll("td",null,pU(K)),ll("td",null,EU(K)),ll("td",null,K.status||K.messageId||K.message_id||"--")))))),ll("div",{className:"panel-actions inline-actions"},ll(n1,{title:"ClaudeQQ Sent Messages",data:n.sent,onOpen:u,testId:"raw-claudeqq-sent"})))))}var Q1=Ml(Ju(),1);var HU=Ml(Ju(),1),qu=HU.default.createElement;function y1({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},BU(f,"md"))}function BU(l,u){let r=IE(l).split(` +`),f=[],n=0;while(n\s?/u.test(t)){let F=[];while(n\s?(.*)$/u);if(J!==null){F.push(J[1]),n+=1;continue}if(j.trim().length===0){F.push(""),n+=1;continue}break}f.push(qu("blockquote",{key:`${u}-quote-${n}`},BU(F.join(` +`),`${u}-quote-${n}`)));continue}if(SU(r,n)){let F=n,j=i1(r[n]??""),J=i1(r[n+1]??"");n+=2;let U=[];while(n0)U.push(i1(r[n]??"")),n+=1;f.push(lp(j,J,U,`${u}-table-${F}`));continue}let c=F3(t);if(c!==null){let F=n,j=c.ordered,J=c.start,U=[];while(ndE(L,`${u}-list-${F}-${N}`))));continue}let _=n,A=[];while(n0&&!oE(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 IE(l){return String(l||"").replace(/\r\n/gu,` `).replace(/\r/gu,` -`).trimEnd()}function cN(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 Gz(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 nN(l,u,r){let f=u.trim().length>0?`language-${Oz(u)}`:void 0;return qu("pre",{key:r,className:"markdown-code-block"},qu("code",{className:f},l))}function Tz(l,u){let r=l[u]??"";if(r.trim().length===0)return!0;return cN(r)!==null||l2(r)||/^(#{1,6})\s+.+$/u.test(r)||/^\s*(?:---+|\*\*\*+|___+)\s*$/u.test(r)||/^\s*>\s?/u.test(r)||_N(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 mz(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,Un(r[2],`${u}-task`)))}return qu("li",{key:u},Un(l,u))}function _N(l,u){let r=l[u]??"",f=l[u+1]??"";if(!r.includes("|")||!f.includes("|"))return!1;let n=o1(r),i=o1(f);return n.length>1&&i.length===n.length&&i.every((t)=>/^:?-{3,}:?$/u.test(t.trim()))}function o1(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 Kz(l){let u=l.trim();if(u.startsWith(":")&&u.endsWith(":"))return"center";if(u.endsWith(":"))return"right";if(u.startsWith(":"))return"left";return}function zz(l,u,r,f){let n=u.map(Kz);return qu("div",{key:f,className:"markdown-table-wrap"},qu("table",null,qu("thead",null,qu("tr",null,l.map((i,t)=>qu("th",{key:`${f}-h-${t}`,style:n[t]?{textAlign:n[t]}:void 0},Un(i,`${f}-h-${t}`))))),qu("tbody",null,r.map((i,t)=>qu("tr",{key:`${f}-r-${t}`},l.map((y,c)=>qu("td",{key:`${f}-r-${t}-${c}`,style:n[c]?{textAlign:n[c]}:void 0},Un(i[c]||"",`${f}-r-${t}-${c}`))))))))}function Un(l,u,r={}){let f=[],n=/`([^`\n]+)`|\[([^\]\n]+)\]\(([^)\s]+)(?:\s+"[^"]*")?\)|(https?:\/\/[^\s<>)]+)|\*\*([^*\n]+)\*\*|__([^_\n]+)__|~~([^~\n]+)~~|\*([^*\n]+)\*|_([^_\n]+)_/gu,i=r.linkify!==!1,t=0,y=0;for(let c of l.matchAll(n)){let $=c[0],A=c.index??0;l3(f,l.slice(t,A),`${u}-text-${y}`),t=A+$.length;let j=`${u}-inline-${y}`;if(y+=1,c[1]!==void 0){f.push(qu("code",{key:j},c[1]));continue}if(c[2]!==void 0&&c[3]!==void 0){if(!i){l3(f,$,`${j}-literal`);continue}f.push(iN(c[2],c[3],j));continue}if(c[4]!==void 0){if(!i){l3(f,$,`${j}-literal`);continue}f.push(iN(c[4],c[4],j));continue}let F=c[5]??c[6];if(F!==void 0){f.push(qu("strong",{key:j},Un(F,`${j}-strong`)));continue}if(c[7]!==void 0){f.push(qu("del",{key:j},Un(c[7],`${j}-del`)));continue}let U=c[8]??c[9];if(U!==void 0)f.push(qu("em",{key:j},Un(U,`${j}-em`)))}return l3(f,l.slice(t),`${u}-text-tail`),f}function l3(l,u,r){if(u.length===0)return;u.split(` -`).forEach((n,i)=>{if(i>0)l.push(qu("br",{key:`${r}-br-${i}`}));if(n.length>0)l.push(n)})}function iN(l,u,r){let f=Ez(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},Un(l,`${r}-label`,{linkify:!1}))}function Ez(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 Oz(l){return String(l||"").toLowerCase().replace(/[^a-z0-9_-]+/gu,"-").replace(/^-+|-+$/gu,"")||"text"}var t2=Rl(Ju(),1);var Pl=t2.default.createElement,{useEffect:Zz,useRef:$N}=t2.default;function pz(l,u){return zN(l.toTrace(u))}function Hz(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),i=r%60;if(f>0)return`${f}h ${String(n).padStart(2,"0")}m`;if(n>0)return`${n}m ${String(i).padStart(2,"0")}s`;return`${i}s`}function If(l){let u=Number(l);return Number.isFinite(u)&&u>=0?u:null}function uy(l,u=180){let r=String(l||"").replace(/\s+/gu," ").trim();return r.length>u?`${r.slice(0,u-1)}…`:r}function Bz(l){if(!l)return 0;return l.split(/\r?\n/u).length}function f2(l){return{ran:"Ran",explored:"Explored",edited:"Edited",toolGroup:"Tool calls",plan:"Plan",message:"Message",system:"System",error:"Error"}[l]||"Message"}function n2(l){let u=Number(l||0);return Number.isFinite(u)&&u>0?`… +${Math.floor(u)} lines`:""}function Dz(l){return(Array.isArray(l)?l:[]).reduce((u,r)=>Math.max(u,Number(r?.seq??0)),0)}function AN(l){return["explored","edited","ran"].includes(String(l?.kind||""))}function qN(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 WN(l){let u=qN(l);return`${u.read} read, ${u.edit} edit, ${u.run} run`}function LN(l){return l.replace(/^['"`([{<]+/u,"").replace(/['"`)\]}>.,;:]+$/u,"").replace(/:\d+(?::\d+)?$/u,"").trim()}function jN(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 i=LN(n);if(i.length<2||i.includes("..."))continue;if(/^(http|https|status|method)$/iu.test(i))continue;if(!f.includes(i))f.push(i)}return f}function u2(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 FN(l){let u="";for(let r of l){if(r.length===0)continue;if(u.length>0&&!u.endsWith(` +`).trimEnd()}function DU(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 aE(l,u){let r=l.trim();return r.length>=u.length&&r.split("").every((f)=>f===u.marker)}function m2(l){return/^(?: {4}|\t)/u.test(l)}function OU(l,u,r){let f=u.trim().length>0?`language-${rp(u)}`:void 0;return qu("pre",{key:r,className:"markdown-code-block"},qu("code",{className:f},l))}function oE(l,u){let r=l[u]??"";if(r.trim().length===0)return!0;return DU(r)!==null||m2(r)||/^(#{1,6})\s+.+$/u.test(r)||/^\s*(?:---+|\*\*\*+|___+)\s*$/u.test(r)||/^\s*>\s?/u.test(r)||SU(l,u)||F3(r)!==null}function F3(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 dE(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 SU(l,u){let r=l[u]??"",f=l[u+1]??"";if(!r.includes("|")||!f.includes("|"))return!1;let n=i1(r),t=i1(f);return n.length>1&&t.length===n.length&&t.every((i)=>/^:?-{3,}:?$/u.test(i.trim()))}function i1(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 eE(l){let u=l.trim();if(u.startsWith(":")&&u.endsWith(":"))return"center";if(u.endsWith(":"))return"right";if(u.startsWith(":"))return"left";return}function lp(l,u,r,f){let n=u.map(eE);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;A3(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){A3(f,_,`${F}-literal`);continue}f.push(ZU(c[2],c[3],F));continue}if(c[4]!==void 0){if(!t){A3(f,_,`${F}-literal`);continue}f.push(ZU(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 J=c[8]??c[9];if(J!==void 0)f.push(qu("em",{key:F},qn(J,`${F}-em`)))}return A3(f,l.slice(i),`${u}-text-tail`),f}function A3(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 ZU(l,u,r){let f=up(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 up(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 rp(l){return String(l||"").toLowerCase().replace(/[^a-z0-9_-]+/gu,"-").replace(/^-+|-+$/gu,"")||"text"}var T2=Ml(Ju(),1);var Pl=T2.default.createElement,{useEffect:fp,useRef:VU}=T2.default;function np(l,u){return oU(l.toTrace(u))}function tp(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 df(l){let u=Number(l);return Number.isFinite(u)&&u>=0?u:null}function $y(l,u=180){let r=String(l||"").replace(/\s+/gu," ").trim();return r.length>u?`${r.slice(0,u-1)}…`:r}function ip(l){if(!l)return 0;return l.split(/\r?\n/u).length}function L2(l){return{ran:"Ran",explored:"Explored",edited:"Edited",toolGroup:"Tool calls",plan:"Plan",message:"Message",system:"System",error:"Error"}[l]||"Message"}function G2(l){let u=Number(l||0);return Number.isFinite(u)&&u>0?`… +${Math.floor(u)} lines`:""}function yp(l){return(Array.isArray(l)?l:[]).reduce((u,r)=>Math.max(u,Number(r?.seq??0)),0)}function YU(l){return["explored","edited","ran"].includes(String(l?.kind||""))}function xU(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 bU(l){let u=xU(l);return`${u.read} read, ${u.edit} edit, ${u.run} run`}function vU(l){return l.replace(/^['"`([{<]+/u,"").replace(/['"`)\]}>.,;:]+$/u,"").replace(/:\d+(?::\d+)?$/u,"").trim()}function XU(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=vU(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 w2(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 PU(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 GN(l){let u=String(l||"").replace(/\r\n/gu,` +`;u+=r}return u}function gU(l){let u=String(l||"").replace(/\r\n/gu,` `).replace(/\r/gu,` `).trimEnd();return u.length>0?u.split(` -`):[]}function i2(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 Vz(l){let u=String(l.bodyPreview||"");return/file changes status=([A-Za-z0-9_-]+)/u.exec(u)?.[1]}function Sz(l){return/^item\/(?:started|completed): file changes status=/u.test(String(l||"").trim())}function TN(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&&f3(f).length>0}function ly(l){return LN(String(l||"").replace(/^[ab]\//u,"").trim())}function y2(l){let u=/^([AMDRCU?]{1,2})\s+(.+)$/u.exec(l);if(!u)return null;let r=ly(u[2]||"");return r.length>0?{status:u[1]||"M",path:r}:null}function c2(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=ly(u[2]||"");return n.length>0?{status:f,path:n}:null}let r=/^\*\*\*\s+Move to:\s+(.+)$/u.exec(l);if(r){let f=ly(r[1]||"");return f.length>0?{status:"R",path:f}:null}return null}function f3(l){let u=[],r=(n,i)=>{let t=ly(i);if(t.length===0||t==="/dev/null")return;let y=u.find((c)=>c.path===t);if(y){if(y.status==="M"&&n!=="M")y.status=n;return}u.push({status:n,path:t})},f="";for(let n of GN(l)){let i=y2(n)||c2(n);if(i!==null){r(i.status,i.path),f=i.path;continue}let t=/^diff --git a\/(.+?) b\/(.+)$/u.exec(n);if(t){let j=t[2]||t[1]||"";r("M",j),f=ly(j);continue}let y=/^\+\+\+ b\/(.+)$/u.exec(n);if(y&&y[1]!=="/dev/null"){r("M",y[1]||""),f=ly(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 Xz(l){if(y2(l)!==null||c2(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 _2(l){return GN(l).map((u)=>{let r=y2(u)||c2(u);if(r!==null)return{text:u,kind:"file",path:r.path,status:r.status};return{text:u,kind:Xz(u)}})}function Yz(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 JN(l,u){return`${u} ${l} line${l===1?"":"s"}`}function Pz(l,u){let r=[];if(l>0)r.push(JN(l,"Added"));if(u>0)r.push(JN(u,"removed"));return r.join(", ")}function Cz(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 Mz(l){return`${l} file${l===1?"":"s"}`}function mN(l){let u=l.length>0?l:[],r=FN(u.map((F)=>String(F.bodyPreview||""))),n=FN(u.map((F)=>String(F.bodyPreview||"")).filter((F)=>F.trim().length>0&&!Sz(F)))||r,i=f3(n||r),t=u.map((F)=>({method:i2(F),status:Vz(F),at:F.at})),y=_2(n||r),c=Yz(y),$=Pz(c.added,c.removed),A=i.length>0?Mz(i.length):"",j=$.length>0?`${$}${A?` in ${A}`:""}`:i.length>0?A:uy(n||r||"File changes",72);return{status:Cz(t),summary:j,files:i,stages:t,lines:y,addedLines:c.added,removedLines:c.removed,rawText:r}}function hz(l){let u=l[0],r=l[l.length-1]||u,f=mN(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,i)=>n+Number(i.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 Rz(l){let u=Array.isArray(l)?l:[],r=[],f=[],n=()=>{if(f.length===0)return;r.push(hz(f)),f=[]};for(let i of u){if(TN(i)){if(i2(i)==="item/started"&&f.length>0)n();if(f.push(i),i2(i)==="item/completed")n();continue}n(),r.push(i)}return n(),r}function KN(l){let u=[],r=[],f=[],n=($,A)=>{for(let j of A)if(!$.includes(j))$.push(j)};for(let $ of l){let A=String($?.kind||""),j=[$?.commandPreview,$?.bodyPreview,$?.title].map((F)=>String(F||"")).join(` -`);if(A==="explored")n(u,jN(j));else if(A==="edited")n(r,jN(j));else if(A==="ran"){let F=String($?.commandPreview||$?.title||"").trim();if(F.length>0&&!f.includes(F))f.push(uy(F,90))}}let i=l.map(($)=>Date.parse(String($?.at||""))).filter(($)=>Number.isFinite($)),t=i.length>=2?Math.max(0,Math.max(...i)-Math.min(...i)):0,y=l.reduce(($,A)=>$+(If(A?.durationMs)??If(A?.elapsedMs)??0),0),c=t>0?t:y;return{readFiles:u,editedFiles:r,runCommands:f,durationLabel:Hz(c)}}function xz(l,u=3){let r=Array.isArray(l)?l:[],f=[],n=[],i=Math.max(0,u),t=new Set;for(let c=r.length-1;c>=0&&i>0;c-=1){let $=r[c];if(!AN($))continue;t.add($),i-=1}let y=()=>{if(n.length>=2){let c=qN(n);f.push({seq:Number(n[0]?.seq??0),at:n[0]?.at||n.at(-1)?.at,kind:"toolGroup",title:WN(n),status:`${n.length} calls`,items:n,counts:c,digest:KN(n),rawSeqs:n.flatMap(($)=>Array.isArray($?.rawSeqs)?$.rawSeqs:[$?.seq]).filter(($)=>$!==void 0)})}else f.push(...n);n=[]};for(let c of r){if(AN(c)&&!t.has(c)){n.push(c);continue}y(),f.push(c)}return y(),f}function zN(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:If(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 e1(l){let u=If(l?.state?.time?.start)??If(l?.time?.start),r=If(l?.state?.time?.end)??If(l?.time?.end);return If(l?.durationMs)??If(l?.elapsedMs)??If(l?.timing?.durationMs)??If(l?.metadata?.durationMs)??(u!==null&&r!==null&&r>=u?r-u:null)??void 0}function lc(l,u){return l?.createdAt||l?.updatedAt||l?.completedAt||u||void 0}function r2(l,u){return l?.id||l?.messageId||u}function bz(l,u=1200){if(typeof l==="string")return l;if(l===void 0||l===null)return"";try{return uy(JSON.stringify(l),u)}catch{return uy(String(l),u)}}function EN(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 r3(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 UN(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 ON(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=r3(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"),i=r3(r,["filePath","filepath","path"])||r3(l,["filePath","filepath","path"]),t=r3(r,["pattern","query"]),y=UN(r,["offset"]),c=UN(r,["limit"]),$=[n];if(t.length>0)$.push(t);if(i.length>0)$.push(i);if(y!==null)$.push(`offset=${y}`);if(c!==null)$.push(`limit=${c}`);return $.length>1?$.join(" "):n}function vz(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(),i=l?.at||l?.timestamp||r?.updatedAt||r?.createdAt,t=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:{},$=ON(r,c),A=EN(c,r,l),j=ZN($,String(r?.tool||r?.title||"")),F=j==="edited"?{status:String(c?.status||r?.status||l?.status||""),summary:uy(A||$,72),files:f3(A),stages:[],lines:_2(A),addedLines:0,removedLines:0,rawText:A}:void 0;return{seq:t,at:lc(r,i),kind:j,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:e1(r),rawSeqs:[r?.id||r?.callID||l?.sessionID||t],editObservation:F}}let y=bz(r?.text??r?.content??r?.delta??l?.text??l?.content??l?.delta,3000).trim();if(y.length>0)return{seq:t,at:lc(r,i),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:e1(r),rawSeqs:[r?.id||l?.sessionID||t]};return null}function ZN(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 sz(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,i=String(f?.role||"assistant").toLowerCase(),t=Array.isArray(f?.parts)?f.parts:[];if(t.length===0){if(f?.part&&(f?.sessionID||String(f?.type||"").startsWith("step_")||String(f?.type||"").includes("tool"))){let y=vz(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:`${i||"assistant"} message`,status:i,bodyPreview:String(f.textPreview),rawSeqs:[f?.messageId||r]});continue}for(let y of t){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:lc(y,n),kind:"message",title:c==="reasoning"?"Reasoning":i==="user"?"User message":i==="system"?"System message":"Assistant message",status:c==="reasoning"?"reasoning":i,bodyPreview:A,durationMs:e1(y),rawSeqs:[r2(y,r)]});continue}if(c==="tool"){let A=y?.state&&typeof y.state==="object"&&!Array.isArray(y.state)?y.state:{},j=ON(y,A),F=EN(A,y,{}),U=ZN(j,String(y?.tool||y?.title||"")),N=U==="edited"?{status:String(A?.status||y?.status||""),summary:uy(F||j,72),files:f3(F),stages:[],lines:_2(F),addedLines:0,removedLines:0,rawText:F}:void 0;u.push({seq:r++,at:lc(y,n),kind:U,title:String(y?.title||y?.tool||"tool"),status:String(y?.status||""),commandPreview:j,bodyPreview:F,durationMs:e1(y),rawSeqs:[r2(y,r)],editObservation:N});continue}let $=String(y?.textPreview||y?.title||c||"").trim();if($)u.push({seq:r++,at:lc(y,n),kind:"system",title:c||"part",bodyPreview:$,status:String(y?.status||""),durationMs:e1(y),rawSeqs:[r2(y,r)]})}}return u}var pN={source:"opencode",toTrace:sz};function kz(l){return String(l||"unknown").toLowerCase().replace(/[^a-z0-9_-]+/gu,"-")||"unknown"}function NN(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 gz(l){if(l==="item/fileChange/outputDelta")return"delta";return l.replace(/^item\//u,"")}function Iz(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 ${NN(n)}`},Pl("span",{className:`codex-edit-file-status ${NN(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 az(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,i)=>Pl("span",{key:`${n.method}-${i}`,className:`codex-edit-stage ${kz(n.status||n.method)}`},Pl("b",null,gz(n.method)),n.status?Pl("em",null,n.status):null))):null,r.length>0?Pl("div",{className:"codex-edit-diff",role:"list"},r.map(Iz)):null,u?Pl("div",{className:"codex-edit-omitted"},`${u} (查看原始JSON获取完整记录)`):null)}function QN(l,u,r){let f=n2(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 HN(l,u=!1){let r=String(l.kind||"message"),f=["ran","explored","edited"].includes(r),n=n2(l.commandOmittedLines),i=n2(l.bodyOmittedLines),t=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,j=r==="edited"&&(l.editObservation!==void 0||TN(l))?l.editObservation||mN([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"},f2(r)),f&&j===null?null:Pl("strong",null,j!==null?"File changes":String(l.title||f2(r))),l.status?Pl("code",null,String(j?.status||l.status)):null,Pl("time",null,Wl(l.at))),t&&j===null?Pl("pre",{className:"codex-transcript-command"},t,n?` -${n}`:""):null,j!==null?az(j,i):$?Pl("div",{className:"codex-transcript-streams"},y.length>0?QN("stdout",y,l.stdoutOmittedLines):null,c.length>0?QN("stderr",c,l.stderrOmittedLines):null):l.bodyPreview?Pl("pre",{className:"codex-transcript-body"},String(l.bodyPreview),i?` -${i} (查看原始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||Bz(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 oz(l){let u=Array.isArray(l.items)?l.items:[],r=l.digest&&typeof l.digest==="object"?l.digest:KN(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"},f2("toolGroup")),Pl("strong",null,String(l.title||WN(u))),Pl("code",null,String(l.status||`${u.length} calls`)),Pl("time",null,Wl(l.at)))),Pl("div",{className:"codex-tool-group-digest"},Pl("span",null,`read: ${u2(Array.isArray(r.readFiles)?r.readFiles:[])}`),Pl("span",null,`edit: ${u2(Array.isArray(r.editedFiles)?r.editedFiles:[])}`),Pl("span",null,`run: ${u2(Array.isArray(r.runCommands)?r.runCommands:[],2)}`),Pl("span",null,`duration: ${r.durationLabel||"--"}`)),Pl("div",{className:"codex-tool-group-items"},u.map((f)=>HN(f,!0))))))}function dz(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 BN(l,u){if(u)return l;return l.flatMap((r)=>{if(String(r.kind||"")==="system"&&!dz(r))return[];if(String(r.kind||"")!=="toolGroup"||!Array.isArray(r.items))return[r];let f=BN(r.items,u);return[{...r,items:f}]})}var ez=16;function wN(l){return l.scrollHeight-l.scrollTop-l.clientHeight<=ez}function n3({items:l,input:u,port:r,autoScroll:f=!1,loading:n=!1,hasDetail:i=!0,emptyText:t="等待 Trace 输出...",loadingText:y="正在加载完整 Trace...",testId:c="trace-output",className:$="codex-transcript",keepRecentToolCalls:A=3,collapseTools:j=!0,showSystemEvents:F=!1}){let U=$N(null),N=$N(!0),W=BN(Rz(r?pz(r,u):zN(l)),Boolean(F)),L=j?xz(W,A):W,J=Dz(W);Zz(()=>{let q=U.current;if(!f||!q)return;if(!N.current&&!wN(q))return;q.scrollTop=q.scrollHeight,N.current=!0},[f,W.length,J]);let Q={className:$,ref:U,onScroll:(q)=>{let T=q.currentTarget;N.current=wN(T)},"data-testid":c};if(n&&!i)return Pl("div",Q,Pl("div",{className:"codex-output-empty"},y));return Pl("div",Q,L.length===0?Pl("div",{className:"codex-output-empty"},t):L.map((q)=>String(q.kind||"")==="toolGroup"?oz(q):HN(q)))}var DN=Rl(Ju(),1),D0=DN.default.createElement;function i3(...l){return l.filter(Boolean).join(" ")}function VN({title:l,children:u,actions:r,onClose:f,className:n,backdropClassName:i,bodyClassName:t,actionsClassName:y,titleId:c,testId:$,closeTestId:A,closeLabel:j="关闭",disableClose:F=!1,closeOnBackdrop:U=!0}){let N={className:i3("raw-dialog","unidesk-dialog",n),role:"dialog","aria-modal":"true"};if(c)N["aria-labelledby"]=c;else if(typeof l==="string")N["aria-label"]=l;if($)N["data-testid"]=$;return D0("div",{className:i3("modal-backdrop","unidesk-dialog-backdrop",i),role:"presentation",onClick:(W)=>{if(U&&!F&&W.target===W.currentTarget)f()}},D0("section",N,D0("div",{className:"raw-dialog-head unidesk-dialog-head"},D0("strong",c?{id:c}:null,l),D0("button",{type:"button",className:"ghost-btn",onClick:f,disabled:F,"data-testid":A},j)),D0("div",{className:i3("unidesk-dialog-body",t)},u),r?D0("div",{className:i3("unidesk-dialog-actions",y)},r):null))}var G=yc.default.createElement,{useEffect:vn,useMemo:SN,useRef:Ru}=yc.default,gl=yc.default.useState,lE=120,dN=12,eN=48,uE=1200;function $2(){return typeof document>"u"||document.visibilityState!=="hidden"}function xu(l,u="操作失败"){return El(l,u)}function of(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),i=r%60;if(f>0)return`${f}h ${String(n).padStart(2,"0")}m`;if(n>0)return`${n}m ${String(i).padStart(2,"0")}s`;return`${i}s`}function gn(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 lQ(l,u=Date.now()){let r=gn(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),i=Math.floor(f%86400/3600),t=Math.floor(f%3600/60),y=f%60;if(n>0)return`${n}天${i>0?`${i}小时`:""}前`;if(i>0)return`${i}小时${t>0?`${t}分钟`:""}前`;if(t>0)return`${t}分钟${y}秒前`;return`${y}秒前`}function uQ(...l){let u="",r=-1/0;for(let f of l){let n=String(f||"");if(n.length===0)continue;let i=gn(f);if(i!==null&&i>=r)u=n,r=i;else if(u.length===0)u=n}return u}function rE(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 Q2(l,u=180){let r=String(l||"").replace(/\s+/gu," ").trim();return r.length>u?`${r.slice(0,u-1)}…`:r}async function Vu(l,u={}){return ml(l,{strictJson:!0,retryInvalidJson:1,invalidJsonPrefix:"Code Queue 返回了无效 JSON",invalidJsonPreview:!0,responsePreviewLength:uE,...u})}function Y0({status:l,children:u,title:r}){let f=String(l||"unknown").toLowerCase();return G("span",{className:`status-badge ${f}`,title:r},u||l||"unknown")}function ry({title:l,eyebrow:u,summary:r,actions:f,children:n,className:i,loading:t}){return G("section",{className:`panel ${i||""}`},G("div",{className:"panel-head"},G("div",null,u?G("p",{className:"panel-eyebrow"},u):null,G(fu,{title:l,loading:t}),r?G("div",{className:"panel-summary"},r):null),f?G("div",{className:"panel-actions"},f):null),G("div",{className:"panel-body"},n))}function rQ({title:l,data:u,onOpen:r,testId:f}){return G("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function P0({title:l,text:u}){return G("div",{className:"empty-state"},G("strong",null,l),G("span",null,u))}function fE(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function nE(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function Su(l,u){return`${l}/microservices/code-queue/proxy${u}`}function iE(l){return`${l}/microservices/oa-event-flow/proxy/api/events/stream?tags=${encodeURIComponent("service:code-queue")}`}function m2(){return{headers:{"cache-control":"no-cache","x-unidesk-no-cache":"1"}}}function Du(l){return Array.isArray(l?.tasks)?l.tasks:[]}function Nn(l){return l?.pagination&&typeof l.pagination==="object"&&!Array.isArray(l.pagination)?l.pagination:{}}function XN(l){let u=Date.parse(String(l?.updatedAt||l?.createdAt||""));return Number.isFinite(u)?u:0}function YN(l){return gn(l?.queueEnteredAt)??gn(l?.createdAt)??gn(l?.updatedAt)??0}function tE(l,u){let r=YN(l)-YN(u);if(r!==0)return r;let f=(gn(l?.createdAt)??0)-(gn(u?.createdAt)??0);if(f!==0)return f;return String(l?.id||"").localeCompare(String(u?.id||""))}function yE(l,u=""){let r=new Map;for(let f of l)for(let n of f){let i=String(n?.id||"");if(i.length>0&&!r.has(i))r.set(i,n)}return Array.from(r.values()).sort((f,n)=>{let i=kN(f)-kN(n);if(i!==0)return i;let t=String(f?.id||"")===u?0:1,y=String(n?.id||"")===u?0:1;if(t!==y)return t-y;return XN(n)-XN(f)})}function Qn(l,u=""){let r=new Map;for(let f of l)for(let n of f){let i=String(n?.id||"");if(i.length===0)continue;r.set(i,{...r.get(i)||{},...n})}return yE([Array.from(r.values())],u)}function fy(l){return Array.isArray(l?.activeTaskIds)?l.activeTaskIds.map((u)=>String(u||"")).filter(Boolean):[String(l?.activeTaskId||"")].filter(Boolean)}var Yi="__all__",cE="(max-width: 760px)",_E="(min-width: 761px)";function Pr(l){return!l||l===Yi}function $E(){return typeof window<"u"&&window.matchMedia(cE).matches}function AE(l){return Pr(l)?"":`&queueId=${encodeURIComponent(l)}`}function w2(l){return String(l||"").trim().replace(/\s+/gu," ").slice(0,200)}function jE(l){let u=w2(l);return u.length===0?"":`&search=${encodeURIComponent(u)}`}function K2(l,u=""){return`${AE(l)}${jE(u)}`}function t3(l,u){return Number(l?.counts?.[u]||0)}function PN(l,u=""){let r=new Map;for(let n of Array.isArray(l?.queues)?l.queues:[]){let i=String(n?.id||"").trim();if(i.length>0)r.set(i,{...n,name:String(n?.name||i).trim()||i})}for(let n of[String(l?.defaultQueueId||"default"),u].map((i)=>i.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,i)=>{let t=String(n?.id||"")===String(l?.defaultQueueId||"default")?0:1,y=String(i?.id||"")===String(l?.defaultQueueId||"default")?0:1;if(t!==y)return t-y;return String(n?.id||"").localeCompare(String(i?.id||""))})}function fQ(l){let u=String(l?.id||"default"),r=String(l?.name||"").trim();return r.length>0?r:u}function q2(l){let u=String(l?.id||"default"),r=fQ(l);return r===u?u:`${r} (${u})`}function fc(l){let u=t3(l,"running")+t3(l,"judging"),r=t3(l,"queued")+t3(l,"retry_wait"),f=Number(l?.total||0),n=[q2(l),`${f} tasks`];if(u>0)n.push(`${u} running`);if(r>0)n.push(`${r} queued`);return n.join(" · ")}function iy(l,u){if(Pr(u))return null;return l.find((r)=>String(r?.id||"")===u)||null}function CN(l,u,r,f){if(Pr(r)){let i=fy(l);return String(l?.activeTaskId||i[0]||f.find((t)=>vN(t))?.id||"")}let n=iy(u,r);return String(n?.activeTaskId||f.find((i)=>vN(i))?.id||"")}function FE(l,u,r){if(!Pr(u)){let f=iy(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 MN(l,u=Yi,r=""){return Vu(Su(l,`/api/tasks/overview?limit=${dN}&transcriptLimit=1&compact=1&selected=0&includeActive=0&stats=0&skipTrace=1${K2(u,r)}`),m2())}async function A2(l,u,r=0,f=Yi,n="",i=!1,t={}){let y=t.selected===!1?"&selected=0":"",c=t.includeActive===!1?"&includeActive=0":"",$=t.stats===!1?"&stats=0":"",A=Number.isInteger(t.limit)&&t.limit>0?Math.min(500,t.limit):dN;return Vu(Su(l,`/api/tasks/overview?limit=${encodeURIComponent(String(A))}&transcriptLimit=3&compact=1&afterSeq=${encodeURIComponent(String(Math.max(0,r)))}&preferId=${encodeURIComponent(u)}${y}${c}${$}${i?"&skipTrace=1":""}${K2(f,n)}`),m2())}async function hN(l,u,r,f=eN,n=""){return Vu(Su(l,`/api/tasks/overview?limit=${encodeURIComponent(String(f))}&transcriptLimit=1&compact=1&selected=0&includeActive=0&stats=0&beforeId=${encodeURIComponent(r)}${K2(u,n)}`),m2())}async function JE(l,u){return Vu(Su(l,`/api/tasks/${encodeURIComponent(u)}/trace-summary`))}async function UE(l,u,r,f=null){let n=f===null||f===void 0||String(f).length===0?"":`&attempt=${encodeURIComponent(String(f))}`;return Vu(Su(l,`/api/tasks/${encodeURIComponent(u)}/prompt?part=${encodeURIComponent(r)}${n}`))}async function NE(l,u,r=0,f=500,n=null){let i=n===null||n===void 0||String(n).length===0?"":`&attempt=${encodeURIComponent(String(n))}`;return Vu(Su(l,`/api/tasks/${encodeURIComponent(u)}/trace-steps?afterSeq=${encodeURIComponent(String(r))}&limit=${encodeURIComponent(String(f))}${i}`))}async function QE(l,u,r){return Vu(Su(l,`/api/tasks/${encodeURIComponent(u)}/trace-step?seq=${encodeURIComponent(String(r))}`))}async function wE(l,u){return Vu(Su(l,`/api/tasks/${encodeURIComponent(u)}/read`),{method:"POST",body:{}})}async function qE(l){return Vu(Su(l,"/api/tasks/read-all"),{method:"POST",body:{}})}function WE(l){return Array.isArray(l?.output)?l.output:[]}function LE(l){return Array.isArray(l?.attempts)?l.attempts:[]}function j2(l){return l?.counts&&typeof l.counts==="object"&&!Array.isArray(l.counts)?l.counts:{}}function GE(l){return l.split(/^\s*---+\s*$/gmu).map((u)=>u.trim()).filter(Boolean)}function RN(l){let u=Number(l);return Number.isFinite(u)?Math.max(1,Math.min(50,Math.floor(u))):1}function V0(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 TE(l,u){let r=V0(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 mE(l){let f=l.trimStart();if(!f.startsWith("# Code Queue 已解析引用上下文"))return{hasInjection:!1,reference:"",userPrompt:l};let n=l.length-f.length,i=l.lastIndexOf(` +`):[]}function W2(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 cp(l){let u=String(l.bodyPreview||"");return/file changes status=([A-Za-z0-9_-]+)/u.exec(u)?.[1]}function $p(l){return/^item\/(?:started|completed): file changes status=/u.test(String(l||"").trim())}function kU(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&&N3(f).length>0}function cy(l){return vU(String(l||"").replace(/^[ab]\//u,"").trim())}function K2(l){let u=/^([AMDRCU?]{1,2})\s+(.+)$/u.exec(l);if(!u)return null;let r=cy(u[2]||"");return r.length>0?{status:u[1]||"M",path:r}:null}function E2(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=cy(u[2]||"");return n.length>0?{status:f,path:n}:null}let r=/^\*\*\*\s+Move to:\s+(.+)$/u.exec(l);if(r){let f=cy(r[1]||"");return f.length>0?{status:"R",path:f}:null}return null}function N3(l){let u=[],r=(n,t)=>{let i=cy(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 gU(l)){let t=K2(n)||E2(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=cy(F);continue}let y=/^\+\+\+ b\/(.+)$/u.exec(n);if(y&&y[1]!=="/dev/null"){r("M",y[1]||""),f=cy(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 _p(l){if(K2(l)!==null||E2(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 p2(l){return gU(l).map((u)=>{let r=K2(u)||E2(u);if(r!==null)return{text:u,kind:"file",path:r.path,status:r.status};return{text:u,kind:_p(u)}})}function Ap(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 CU(l,u){return`${u} ${l} line${l===1?"":"s"}`}function Fp(l,u){let r=[];if(l>0)r.push(CU(l,"Added"));if(u>0)r.push(CU(u,"removed"));return r.join(", ")}function jp(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 Np(l){return`${l} file${l===1?"":"s"}`}function IU(l){let u=l.length>0?l:[],r=PU(u.map((j)=>String(j.bodyPreview||""))),n=PU(u.map((j)=>String(j.bodyPreview||"")).filter((j)=>j.trim().length>0&&!$p(j)))||r,t=N3(n||r),i=u.map((j)=>({method:W2(j),status:cp(j),at:j.at})),y=p2(n||r),c=Ap(y),_=Fp(c.added,c.removed),A=t.length>0?Np(t.length):"",F=_.length>0?`${_}${A?` in ${A}`:""}`:t.length>0?A:$y(n||r||"File changes",72);return{status:jp(i),summary:F,files:t,stages:i,lines:y,addedLines:c.added,removedLines:c.removed,rawText:r}}function Jp(l){let u=l[0],r=l[l.length-1]||u,f=IU(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 Up(l){let u=Array.isArray(l)?l:[],r=[],f=[],n=()=>{if(f.length===0)return;r.push(Jp(f)),f=[]};for(let t of u){if(kU(t)){if(W2(t)==="item/started"&&f.length>0)n();if(f.push(t),W2(t)==="item/completed")n();continue}n(),r.push(t)}return n(),r}function aU(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,XU(F));else if(A==="edited")n(r,XU(F));else if(A==="ran"){let j=String(_?.commandPreview||_?.title||"").trim();if(j.length>0&&!f.includes(j))f.push($y(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)=>_+(df(A?.durationMs)??df(A?.elapsedMs)??0),0),c=i>0?i:y;return{readFiles:u,editedFiles:r,runCommands:f,durationLabel:tp(c)}}function Qp(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(!YU(_))continue;i.add(_),t-=1}let y=()=>{if(n.length>=2){let c=xU(n);f.push({seq:Number(n[0]?.seq??0),at:n[0]?.at||n.at(-1)?.at,kind:"toolGroup",title:bU(n),status:`${n.length} calls`,items:n,counts:c,digest:aU(n),rawSeqs:n.flatMap((_)=>Array.isArray(_?.rawSeqs)?_.rawSeqs:[_?.seq]).filter((_)=>_!==void 0)})}else f.push(...n);n=[]};for(let c of r){if(YU(c)&&!i.has(c)){n.push(c);continue}y(),f.push(c)}return y(),f}function oU(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:df(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 c1(l){let u=df(l?.state?.time?.start)??df(l?.time?.start),r=df(l?.state?.time?.end)??df(l?.time?.end);return df(l?.durationMs)??df(l?.elapsedMs)??df(l?.timing?.durationMs)??df(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 q2(l,u){return l?.id||l?.messageId||u}function mp(l,u=1200){if(typeof l==="string")return l;if(l===void 0||l===null)return"";try{return $y(JSON.stringify(l),u)}catch{return $y(String(l),u)}}function dU(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 j3(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 hU(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 eU(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=j3(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=j3(r,["filePath","filepath","path"])||j3(l,["filePath","filepath","path"]),i=j3(r,["pattern","query"]),y=hU(r,["offset"]),c=hU(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 wp(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:{},_=eU(r,c),A=dU(c,r,l),F=lQ(_,String(r?.tool||r?.title||"")),j=F==="edited"?{status:String(c?.status||r?.status||l?.status||""),summary:$y(A||_,72),files:N3(A),stages:[],lines:p2(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:c1(r),rawSeqs:[r?.id||r?.callID||l?.sessionID||i],editObservation:j}}let y=mp(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:c1(r),rawSeqs:[r?.id||l?.sessionID||i]};return null}function lQ(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 qp(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=wp(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:c1(y),rawSeqs:[q2(y,r)]});continue}if(c==="tool"){let A=y?.state&&typeof y.state==="object"&&!Array.isArray(y.state)?y.state:{},F=eU(y,A),j=dU(A,y,{}),J=lQ(F,String(y?.tool||y?.title||"")),U=J==="edited"?{status:String(A?.status||y?.status||""),summary:$y(j||F,72),files:N3(j),stages:[],lines:p2(j),addedLines:0,removedLines:0,rawText:j}:void 0;u.push({seq:r++,at:$1(y,n),kind:J,title:String(y?.title||y?.tool||"tool"),status:String(y?.status||""),commandPreview:F,bodyPreview:j,durationMs:c1(y),rawSeqs:[q2(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:c1(y),rawSeqs:[q2(y,r)]})}}return u}var uQ={source:"opencode",toTrace:qp};function Lp(l){return String(l||"unknown").toLowerCase().replace(/[^a-z0-9_-]+/gu,"-")||"unknown"}function sU(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 Gp(l){if(l==="item/fileChange/outputDelta")return"delta";return l.replace(/^item\//u,"")}function Wp(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 ${sU(n)}`},Pl("span",{className:`codex-edit-file-status ${sU(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 Tp(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 ${Lp(n.status||n.method)}`},Pl("b",null,Gp(n.method)),n.status?Pl("em",null,n.status):null))):null,r.length>0?Pl("div",{className:"codex-edit-diff",role:"list"},r.map(Wp)):null,u?Pl("div",{className:"codex-edit-omitted"},`${u} (查看原始JSON获取完整记录)`):null)}function MU(l,u,r){let f=G2(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 rQ(l,u=!1){let r=String(l.kind||"message"),f=["ran","explored","edited"].includes(r),n=G2(l.commandOmittedLines),t=G2(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||kU(l))?l.editObservation||IU([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"},L2(r)),f&&F===null?null:Pl("strong",null,F!==null?"File changes":String(l.title||L2(r))),l.status?Pl("code",null,String(F?.status||l.status)):null,Pl("time",null,Gl(l.at))),i&&F===null?Pl("pre",{className:"codex-transcript-command"},i,n?` +${n}`:""):null,F!==null?Tp(F,t):_?Pl("div",{className:"codex-transcript-streams"},y.length>0?MU("stdout",y,l.stdoutOmittedLines):null,c.length>0?MU("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||ip(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 Kp(l){let u=Array.isArray(l.items)?l.items:[],r=l.digest&&typeof l.digest==="object"?l.digest:aU(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"},L2("toolGroup")),Pl("strong",null,String(l.title||bU(u))),Pl("code",null,String(l.status||`${u.length} calls`)),Pl("time",null,Gl(l.at)))),Pl("div",{className:"codex-tool-group-digest"},Pl("span",null,`read: ${w2(Array.isArray(r.readFiles)?r.readFiles:[])}`),Pl("span",null,`edit: ${w2(Array.isArray(r.editedFiles)?r.editedFiles:[])}`),Pl("span",null,`run: ${w2(Array.isArray(r.runCommands)?r.runCommands:[],2)}`),Pl("span",null,`duration: ${r.durationLabel||"--"}`)),Pl("div",{className:"codex-tool-group-items"},u.map((f)=>rQ(f,!0))))))}function Ep(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 fQ(l,u){if(u)return l;return l.flatMap((r)=>{if(String(r.kind||"")==="system"&&!Ep(r))return[];if(String(r.kind||"")!=="toolGroup"||!Array.isArray(r.items))return[r];let f=fQ(r.items,u);return[{...r,items:f}]})}var pp=16;function RU(l){return l.scrollHeight-l.scrollTop-l.clientHeight<=pp}function J3({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 J=VU(null),U=VU(!0),w=fQ(Up(r?np(r,u):oU(l)),Boolean(j)),L=F?Qp(w,A):w,N=yp(w);fp(()=>{let q=J.current;if(!f||!q)return;if(!U.current&&!RU(q))return;q.scrollTop=q.scrollHeight,U.current=!0},[f,w.length,N]);let m={className:_,ref:J,onScroll:(q)=>{let W=q.currentTarget;U.current=RU(W)},"data-testid":c};if(n&&!t)return Pl("div",m,Pl("div",{className:"codex-output-empty"},y));return Pl("div",m,L.length===0?Pl("div",{className:"codex-output-empty"},i):L.map((q)=>String(q.kind||"")==="toolGroup"?Kp(q):rQ(q)))}var nQ=Ml(Ju(),1),Xi=nQ.default.createElement;function U3(...l){return l.filter(Boolean).join(" ")}function tQ({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:J=!0}){let U={className:U3("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 Xi("div",{className:U3("modal-backdrop","unidesk-dialog-backdrop",t),role:"presentation",onClick:(w)=>{if(J&&!j&&w.target===w.currentTarget)f()}},Xi("section",U,Xi("div",{className:"raw-dialog-head unidesk-dialog-head"},Xi("strong",c?{id:c}:null,l),Xi("button",{type:"button",className:"ghost-btn",onClick:f,disabled:j,"data-testid":A},F)),Xi("div",{className:U3("unidesk-dialog-body",i)},u),r?Xi("div",{className:U3("unidesk-dialog-actions",y)},r):null))}var G=Q1.default.createElement,{useEffect:Wn,useMemo:iQ,useRef:Ru}=Q1.default,Il=Q1.default.useState,zp=120,GQ=12,WQ=48,Op=1200;function z2(){return typeof document>"u"||document.visibilityState!=="hidden"}function Su(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 on(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 N1(l,u=Date.now()){let r=on(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 M2(...l){let u="",r=-1/0;for(let f of l){let n=String(f||"");if(n.length===0)continue;let t=on(f);if(t!==null&&t>=r)u=n,r=t;else if(u.length===0)u=n}return u}function Zp(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 W3(l,u=180){let r=String(l||"").replace(/\s+/gu," ").trim();return r.length>u?`${r.slice(0,u-1)}…`:r}async function Yu(l,u={}){return El(l,{strictJson:!0,retryInvalidJson:1,invalidJsonPrefix:"Code Queue 返回了无效 JSON",invalidJsonPreview:!0,responsePreviewLength:Op,...u})}function Mi({status:l,children:u,title:r}){let f=String(l||"unknown").toLowerCase();return G("span",{className:`status-badge ${f}`,title:r},u||l||"unknown")}function Ci({title:l,eyebrow:u,summary:r,actions:f,children:n,className:t,loading:i}){return G("section",{className:`panel ${t||""}`},G("div",{className:"panel-head"},G("div",null,u?G("p",{className:"panel-eyebrow"},u):null,G(fu,{title:l,loading:i}),r?G("div",{className:"panel-summary"},r):null),f?G("div",{className:"panel-actions"},f):null),G("div",{className:"panel-body"},n))}function R2({title:l,data:u,onOpen:r,testId:f}){return G("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function Ri({title:l,text:u}){return G("div",{className:"empty-state"},G("strong",null,l),G("span",null,u))}function Hp(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function Bp(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function Xu(l,u){return`${l}/microservices/code-queue/proxy${u}`}function Dp(l){return`${l}/microservices/oa-event-flow/proxy/api/events/stream?tags=${encodeURIComponent("service:code-queue")}`}function x2(){return{headers:{"cache-control":"no-cache","x-unidesk-no-cache":"1"}}}function Vu(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 yQ(l){let u=Date.parse(String(l?.updatedAt||l?.createdAt||""));return Number.isFinite(u)?u:0}function cQ(l){return on(l?.queueEnteredAt)??on(l?.createdAt)??on(l?.updatedAt)??0}function Sp(l,u){let r=cQ(l)-cQ(u);if(r!==0)return r;let f=(on(l?.createdAt)??0)-(on(u?.createdAt)??0);if(f!==0)return f;return String(l?.id||"").localeCompare(String(u?.id||""))}function Vp(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=QQ(f)-QQ(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 yQ(n)-yQ(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 Vp([Array.from(r.values())],u)}function Ay(l){return Array.isArray(l?.activeTaskIds)?l.activeTaskIds.map((u)=>String(u||"")).filter(Boolean):[String(l?.activeTaskId||"")].filter(Boolean)}function or(l){return Array.isArray(l)?l.map((u)=>String(u||"")).filter(Boolean):[]}function _y(l,u=3){let r=or(l);if(r.length===0)return"--";let f=r.slice(0,u).join(" / ");return r.length>u?`${f} +${r.length-u}`:f}function Yp(l,u){return _u(l?.executionDiagnostics)||_u(u?.body?.queue?.executionDiagnostics)||_u(u?.queue?.executionDiagnostics)||_u(u?.body?.executionDiagnostics)||_u(u?.executionDiagnostics)||{}}function b2(l){return Array.from(new Set([...or(l?.heartbeatRiskTaskIds),...or(l?.heartbeatExpiredTaskIds),...or(l?.heartbeatMissingTaskIds),...or(l?.staleRecoveryCandidateTaskIds)])).sort()}function TQ(l){if(typeof l?.splitBrainLive==="boolean")return l.splitBrainLive;return String(l?.state||l?.health||"").toLowerCase()==="split-brain"&&or(l?.heartbeatFreshTaskIds).length>0&&b2(l).length===0}function KQ(l){let u=String(l?.effectiveLiveness||"").toLowerCase();if(u)return u;if(b2(l).length>0)return"at-risk";if(TQ(l))return"live";let r=String(l?.state||l?.health||"unknown").toLowerCase();return r==="healthy"?"healthy":r==="unknown"?"unknown":"degraded"}function Xp(l){let u=KQ(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 ht="__all__",Pp="(max-width: 760px)",Cp="(min-width: 761px)";function Cr(l){return!l||l===ht}function hp(){return typeof window<"u"&&window.matchMedia(Pp).matches}function sp(l){return Cr(l)?"":`&queueId=${encodeURIComponent(l)}`}function X2(l){return String(l||"").trim().replace(/\s+/gu," ").slice(0,200)}function Mp(l){let u=X2(l);return u.length===0?"":`&search=${encodeURIComponent(u)}`}function v2(l,u=""){return`${sp(l)}${Mp(u)}`}function Q3(l,u){return Number(l?.counts?.[u]||0)}function $Q(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 EQ(l){let u=String(l?.id||"default"),r=String(l?.name||"").trim();return r.length>0?r:u}function P2(l){let u=String(l?.id||"default"),r=EQ(l);return r===u?u:`${r} (${u})`}function F1(l){let u=Q3(l,"running")+Q3(l,"judging"),r=Q3(l,"queued")+Q3(l,"retry_wait"),f=Number(l?.total||0),n=[P2(l),`${f} tasks`];if(u>0)n.push(`${u} running`);if(r>0)n.push(`${r} queued`);return n.join(" · ")}function jy(l,u){if(Cr(u))return null;return l.find((r)=>String(r?.id||"")===u)||null}function _Q(l,u,r,f){if(Cr(r)){let t=Ay(l);return String(l?.activeTaskId||t[0]||f.find((i)=>st(i))?.id||"")}let n=jy(u,r);return String(n?.activeTaskId||f.find((t)=>st(t))?.id||"")}function Rp(l,u,r){if(!Cr(u)){let f=jy(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 AQ(l,u=ht,r=""){return Yu(Xu(l,`/api/tasks/overview?limit=${GQ}&transcriptLimit=1&compact=1&selected=0&includeActive=0&stats=0&skipTrace=1${v2(u,r)}`),x2())}async function O2(l,u,r=0,f=ht,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):GQ;return Yu(Xu(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":""}${v2(f,n)}`),x2())}async function FQ(l,u,r,f=WQ,n=""){return Yu(Xu(l,`/api/tasks/overview?limit=${encodeURIComponent(String(f))}&transcriptLimit=1&compact=1&selected=0&includeActive=0&stats=0&beforeId=${encodeURIComponent(r)}${v2(u,n)}`),x2())}async function xp(l,u){return Yu(Xu(l,`/api/tasks/${encodeURIComponent(u)}/trace-summary`))}async function bp(l,u,r,f=null){let n=f===null||f===void 0||String(f).length===0?"":`&attempt=${encodeURIComponent(String(f))}`;return Yu(Xu(l,`/api/tasks/${encodeURIComponent(u)}/prompt?part=${encodeURIComponent(r)}${n}`))}async function vp(l,u,r=0,f=500,n=null){let t=n===null||n===void 0||String(n).length===0?"":`&attempt=${encodeURIComponent(String(n))}`;return Yu(Xu(l,`/api/tasks/${encodeURIComponent(u)}/trace-steps?afterSeq=${encodeURIComponent(String(r))}&limit=${encodeURIComponent(String(f))}${t}`))}async function gp(l,u,r){return Yu(Xu(l,`/api/tasks/${encodeURIComponent(u)}/trace-step?seq=${encodeURIComponent(String(r))}`))}async function kp(l,u){return Yu(Xu(l,`/api/tasks/${encodeURIComponent(u)}/read`),{method:"POST",body:{}})}async function Ip(l){return Yu(Xu(l,"/api/tasks/read-all"),{method:"POST",body:{}})}function ap(l){return Array.isArray(l?.output)?l.output:[]}function op(l){return Array.isArray(l?.attempts)?l.attempts:[]}function Z2(l){return l?.counts&&typeof l.counts==="object"&&!Array.isArray(l.counts)?l.counts:{}}function dp(l){return l.split(/^\s*---+\s*$/gmu).map((u)=>u.trim()).filter(Boolean)}function jQ(l){let u=Number(l);return Number.isFinite(u)?Math.max(1,Math.min(50,Math.floor(u))):1}function Pi(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 ep(l,u){let r=Pi(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 lz(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(i0?l.split(/\r\n|\r|\n/u).length:0}function nQ(l){let u=String(l?.displayPrompt||"");if(u.length>0)return u;let r=String(l?.prompt||"");return KE(mE(r).userPrompt)}function Uf(l){return l?._traceSummary&&typeof l._traceSummary==="object"&&!Array.isArray(l._traceSummary)?l._traceSummary:null}function $3(l){return l?._promptDetails&&typeof l._promptDetails==="object"&&!Array.isArray(l._promptDetails)?l._promptDetails:{}}function z2(l){let u=Uf(l)?.prompt;return u&&typeof u==="object"&&!Array.isArray(u)?u:{}}function iQ(l){let u=Uf(l)?.execution;return u&&typeof u==="object"&&!Array.isArray(u)?u:{}}function xN(l){let u=Number(l);return Number.isFinite(u)&&u>=0?Math.floor(u):0}function kn(l){let u=Number(l);return Number.isFinite(u)&&u>=0?Math.floor(u):null}function tQ(l){let u=Gu(l?.traceStats);if(u&&(l?.statsSource==="oa-event-flow"||u.source==="oa-event-flow"))return u;let r=Uf(l),f=Gu(r?.traceStats);if(f&&(r?.statsSource==="oa-event-flow"||f.source==="oa-event-flow"))return f;return null}function zE(l,u){let r=Gu(u?.traceStats)||Gu(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 EE(l,u){return kn(tQ(l)?.[u])}function yQ(l){let u=EE(l,"stepCount");if(u!==null)return u;let r=Uf(l);if(r!==null)return OE(r);return null}function OE(l){let u=Gu(l?.traceStats);if(!u||l?.statsSource!=="oa-event-flow"&&u.source!=="oa-event-flow")return null;return kn(u.stepCount)}function y3(l){if(!l||l?._traceSummaryLoaded!==!0)return!1;let u=Uf(l),r=String(l?._traceSummaryUpdatedAt||u?.updatedAt||""),f=String(l?.updatedAt||"");if(f.length>0){let n=gn(r),i=gn(f);if(n!==null&&i!==null){if(n+10?r:nQ(l)}function cQ(l){let u=Uf(l);return String(u?.finalResponse||l?.finalResponse||"").trimEnd()}function _Q(l){let r=Uf(l)?.lastJudge||l?.lastJudge;return r&&typeof r==="object"&&!Array.isArray(r)?r:null}function Gu(l){return l&&typeof l==="object"&&!Array.isArray(l)?l:null}function ZE(l){let u=Gu(l?.raw),r=Gu(l?.failureDetails)||Gu(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(([,i])=>i!==void 0&&i!==null&&String(i).length>0).map(([i,t])=>`${i}: ${String(t)}`).join(` -`)}function $Q({judge:l,testId:u="codex-judge-failure-details"}){let r=ZE(l);if(r.length===0)return null;return G("details",{className:"codex-judge-failure-details","data-testid":u},G("summary",null,"MiniMax failure details"),G("pre",null,r))}function pE(l){let u=Uf(l)?.attempts;if(Array.isArray(u)&&u.length>0)return u;let r=iQ(l),f=cQ(l),n=_Q(l);if(Object.keys(r).length===0&&f.length===0&&n===null)return[];return[{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 HE(l,u){return Gu(u?.execution)||iQ(l)}function BE(l,u,r,f){let n=Uf(l),i=Number(n?.currentAttempt||l?.currentAttempt||0),t=Number(r),y=Number.isFinite(t)&&t>0&&t===i,c=uQ(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 DE(l,u){let r=String(u?.finalResponse||u?.finalResponsePreview||"");if(Object.prototype.hasOwnProperty.call(u||{},"finalResponse")||Object.prototype.hasOwnProperty.call(u||{},"finalResponsePreview"))return r.trimEnd();return r.length>0?r.trimEnd():cQ(l)}function AQ(l,u){if(Object.prototype.hasOwnProperty.call(u||{},"judge"))return Gu(u?.judge);return _Q(l)}function VE(l,u,r){if(!lO(l))return!1;if(E2(u,r))return!1;if(u?.finishedAt)return!1;if(["succeeded","failed","canceled"].includes(String(u?.terminalStatus||"")))return!1;let f=Uf(l),n=Number(f?.currentAttempt||l?.currentAttempt||0),i=Number(r);if(Number.isFinite(i)&&i>0&&Number.isFinite(n)&&n>0)return i===n;return!0}function jQ(l){return`feedback:${String(l||"latest")}`}function SE(l,u,r){let f=String(u?.feedbackPrompt||"").trimEnd(),n=String(u?.feedbackPromptPreview||f||"").trimEnd(),i=Number(u?.feedbackPromptChars||f.length||n.length||0),t=Number(u?.feedbackPromptLines||X0(f||n));if(f.length>0||n.length>0||i>0)return{text:f,preview:n,chars:i,lines:t,source:u?.feedbackPromptSource||"judge-feedback",forAttempt:u?.feedbackPromptForAttempt||Number(r||0)+1,truncated:Boolean(u?.feedbackPromptTruncated)};let y=AQ(l,u),c=String(y?.continuePrompt||"").trimEnd();if(y?.decision==="retry"&&c.length>0)return{text:"",preview:c,chars:c.length,lines:X0(c),source:"judge-continue-prompt",forAttempt:Number(r||0)+1,truncated:!1};return null}function XE(l){let u=z2(l);return Boolean(u.hasReferenceInjection||Number(u.referencePromptChars||0)>0||l?.referenceInjection||l?.referenceInjectionSummary)}function FQ(l,u=null){if(u!==null&&u!==void 0){let f=(Gu(l?._traceStepsByAttempt)||{})[String(u)];return Array.isArray(f)?f:[]}return Array.isArray(l?._traceSteps)?l._traceSteps:[]}function tc(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 YE(l){return(Array.isArray(l)?l:[]).reduce((u,r)=>Math.max(u,tc(r)),0)}function PE(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)=>tc(f)-tc(n))}function C0(l){return(Array.isArray(l?.summaryLines)?l.summaryLines:[]).map((u)=>String(u||""))}function CE(l){let u=String(l?.kind||"").trim().toLowerCase(),r=String(l?.status||"").trim().toLowerCase();return u==="error"||r==="error"}function A3(l){let u=String(l?.status||"").trim();if(u.length>0)return u;let r=C0(l).join(` -`);return/^(item\/[A-Za-z]+(?:\/[A-Za-z]+)?):/u.exec(r)?.[1]||""}function bN(l){return/^item\/(?:started|completed): file changes status=/u.test(String(l||"").trim())}function ME(l){let u=C0(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=A3(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 hE(l){if(String(l?.kind||"")!=="edited")return!1;let u=String(l?.title||""),r=String(l?.status||""),f=C0(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 RE(l){if(l.length<=1)return l[0];let u=l.find((i)=>A3(i)==="item/fileChange/outputDelta")||l.find((i)=>C0(i).some((t)=>!bN(t)))||l.at(-1)||l[0],r=l.flatMap((i)=>Array.isArray(i?.rawSeqs)?i.rawSeqs:[i?.seq]).filter((i)=>i!==void 0),f=l.flatMap(C0).filter((i)=>i.trim().length>0&&!bN(i)),n=l[l.length-1]||u;return{...u,at:u?.at||n?.at,title:String(u?.title||"Edited files"),status:ME(n),summaryLines:f.length>0?f:C0(u),rawSeqs:r}}function xE(l){let u=Array.isArray(l)?l:[],r=[],f=[],n=()=>{if(f.length>0)r.push(RE(f));f=[]};for(let i of u){if(hE(i)){if(A3(i)==="item/started"&&f.length>0)n();if(f.push(i),A3(i)==="item/completed")n();continue}n(),r.push(i)}return n(),r}function bE(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 vE(l){if(l.length<=1)return l[0];let u=l[0],r=l.at(-1)||u,f=l.flatMap((t)=>Array.isArray(t?.rawSeqs)?t.rawSeqs:[t?.seq]).filter((t)=>t!==void 0),n=[];for(let t of f)if(!n.includes(t))n.push(t);let i=l.flatMap(C0).filter((t)=>t.trim().length>0);return{...u,seq:tc(r)||tc(u),at:r?.at||u?.at,summaryLines:i.length>0?[i.at(-1)||i[0]]:[],rawSeqs:n}}function sE(l){let u=Array.isArray(l)?l:[],r=[],f=[],n="",i=()=>{if(f.length>0)r.push(vE(f));f=[],n=""};for(let t of u){let y=bE(t);if(y.length>0&&y===n){f.push(t);continue}if(i(),y.length>0)f=[t],n=y;else r.push(t)}return i(),r}function kE(l){return sE(xE(l))}function gE(l){return{...l}}function W2(l,u=null){if(u!==null&&u!==void 0){let r=Gu(l?._traceStepsLoadedByAttempt)||{};return Boolean(r[String(u)])}return Boolean(l?._traceStepsLoaded)}function L2(l){return l?._traceStepDetails&&typeof l._traceStepDetails==="object"&&!Array.isArray(l._traceStepDetails)?l._traceStepDetails:{}}function IE(l,u){let r=Number(l?.index);return Number.isFinite(r)?r:u+1}function E2(l,u){return Boolean(l?.synthetic)||Number(u)<=0}function j3(l){let u=Number(l);return Number.isFinite(u)?String(u):void 0}function aE(l){let u=l?.timing&&typeof l.timing==="object"?l.timing:{},r=String(l?.status||"");if(["queued"].includes(r))return`等待 ${of(u.queueWaitMs??u.totalElapsedMs)}`;if(["running","judging","retry_wait"].includes(r))return`耗时 ${of(u.durationMs??u.totalElapsedMs)}`;return`耗时 ${of(u.durationMs??u.totalElapsedMs)}`}function ty(l){return String(l?.queueId||"default")}function JQ(l){return Gu(l?.queuedReason)}function UQ(l){let u=String(l?.queuedReasonLabel||"").trim();if(u.length>0)return u.toUpperCase();let r=JQ(l),f=String(r?.label||"").trim();return f.length>0?f.toUpperCase():""}function oE(l){let u=String(l?.status||"unknown");if(u!=="queued")return u;let r=UQ(l);return r.length>0?`QUEUED(${r})`:"QUEUED"}function dE(l){if(String(l?.status||"")!=="queued")return;let u=JQ(l),r=String(u?.message||"").trim(),f=UQ(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 eE(l){return{system:"SYS",user:"YOU",assistant:"GPT",reasoning:"THINK",command:"CMD",diff:"DIFF",tool:"TOOL",error:"ERR"}[l]||l.toUpperCase()}function vN(l){return["running","judging","retry_wait"].includes(String(l?.status||""))}function lO(l){return String(l?.status||"")==="running"}function af(l){return["succeeded","failed","canceled"].includes(String(l?.status||""))}function NQ(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 sn(l){if(!af(l))return!1;if(l?.terminalUnread===!0)return!0;if(l?.terminalUnread===!1)return!1;return!l?.readAt}function au(l){let u=Number(l||0);return Number.isFinite(u)?u:0}function uO(l){return au(l.queued)+au(l.retry_wait)}function rO(l){return au(l.running)+au(l.judging)}function fO(l,u){return Gu(l?.statistics)||Gu(u?.statistics)||{}}function nO(l){return Array.isArray(l?.daily)?l.daily:[]}function iO(l){return Gu(l?.totals)||{}}function O2(l,u){let r=Number(l?.[u]??0);return Number.isFinite(r)&&r>0?r:0}function F2(l,u){return l.reduce((r,f)=>Math.max(r,O2(f,u)),0)}var S0=700,sN=220,Xi=30,ny=24,ic=184,G2=ic-ny;function QQ(l,u){if(u<=1)return S0/2;return Xi+l*(S0-Xi*2)/(u-1)}function wQ(l,u){let r=u>0?u:1;return ic-Math.min(1,l/r)*G2}function J2(l,u,r){let f=l.length>0?l:[{[u]:0}],n=f.length>1?f:[f[0],f[0]];return n.map((i,t)=>`${QQ(t,n.length).toFixed(2)},${wQ(O2(i,u),r).toFixed(2)}`).join(" ")}function bn(l){let u=String(l||"");return/^\d{4}-\d{2}-\d{2}$/u.test(u)?u.slice(5):u||"--"}function c3(l){if(!l)return"";return`${String(l.seriesKey||"")}:${String(l.row?.date||l.index||"")}`}function tO(l,u,r,f){let n=O2(l,f.key);return{...f,row:l,index:u,value:n,valueLabel:f.format(n),x:QQ(u,r),y:wQ(n,f.max),seriesKey:f.key}}function kN(l){if(sn(l))return 0;return{running:1,judging:2,retry_wait:3,queued:4,succeeded:8,failed:8,canceled:8}[String(l?.status||"")]??9}function uc(l){if(!l)return!1;if(l?._traceSummaryLoaded===!0)return!1;return l?.summaryOnly===!0||l?._metaLoaded!==!0}function yO(l){return Boolean(l?._metaLoaded)||l?.summaryOnly===!1}function cO(l,u,r){let f=String(l?.[r]||""),n=String(u?.[r]||"");return f.length>n.length?f:n}function T2(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 gN(l,u){let r=u?.summaryOnly===!0&&yO(l),f={...l,...u};if(!r)return f;for(let n of["prompt","basePrompt","displayPrompt","finalResponse"])f[n]=cO(l,u,n);for(let n of["promptHistory","attempts","output","events"])f[n]=T2(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 IN(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&&af(r)),_transcriptPreview:n,_summaryLoaded:!0}}let f=Du(l)[0];return f?{...f,_summaryLoaded:!0}:null}function U2(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")}`,i=r.get(n);if(!i){r.set(n,f);continue}let t={...i,...f};for(let[y,c]of[["bodyPreview","bodyOmittedLines"],["commandPreview","commandOmittedLines"]]){let $=String(i?.[y]||""),A=String(f?.[y]||"");if($.length>A.length)t[y]=i[y],t[c]=i[c]}r.set(n,t)}return Array.from(r.values()).sort((f,n)=>Number(f?.seq??0)-Number(n?.seq??0))}function rc(l){return(Array.isArray(l)?l:[]).reduce((u,r)=>Math.max(u,Number(r?.seq??0)),0)}function aN(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,i)=>n-i);if(r.length===0)return 0;let f=r[Math.max(0,r.length-u)]??0;return Math.max(0,f-0.001)}function _O(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 $O(l,u){let f=(Array.isArray(l?.executionProviders)?l.executionProviders:[]).map((t)=>({id:String(t?.id||"").trim(),label:String(t?.label||t?.id||"").trim(),defaultWorkdir:String(t?.defaultWorkdir||"").trim(),supportsWindowsNativeCodex:t?.supportsWindowsNativeCodex===!0,windowsNativeDefaultWorkdir:String(t?.windowsNativeDefaultWorkdir||"").trim(),kind:String(t?.kind||"").trim()})).filter((t)=>t.id.length>0),n=String(l?.mainProviderId||l?.defaultProviderId||"D601").trim()||"D601",i=new Map;for(let t of[...f,{id:n,label:`${n} (local)`,defaultWorkdir:String(l?.defaultWorkdir||"/workspace"),supportsWindowsNativeCodex:!1,windowsNativeDefaultWorkdir:"",kind:"local"},u?{id:u,label:u,defaultWorkdir:Z2(l,u),supportsWindowsNativeCodex:u!==n,windowsNativeDefaultWorkdir:String(l?.windowsNativeCodexDefaultWorkdir||"/mnt/f/Work/ConStart"),kind:""}:null].filter(Boolean))if(!i.has(t.id))i.set(t.id,t);return Array.from(i.values())}function AO(l,u){let f=(Array.isArray(l?.executionModes)?l.executionModes:[]).map((t)=>({id:String(t?.id||t?.kind||"").trim(),label:String(t?.label||t?.id||t?.kind||"").trim(),description:String(t?.description||"").trim(),defaultWorkdir:String(t?.defaultWorkdir||"").trim(),requiresProvider:t?.requiresProvider===!0,requiresWindowsCwd:t?.requiresWindowsCwd===!0})).filter((t)=>t.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}],i=new Map;for(let t of[...f,...n,u?{id:u,label:u,description:"",defaultWorkdir:"",requiresProvider:u==="windows-native",requiresWindowsCwd:u==="windows-native"}:null].filter(Boolean))if(!i.has(t.id))i.set(t.id,t);return Array.from(i.values())}function nc(l,u,r){if(u!=="windows-native")return Z2(l,r);let f=Array.isArray(l?.executionModes)?l.executionModes.find((i)=>String(i?.id||i?.kind||"")==="windows-native"):null,n=Array.isArray(l?.executionProviders)?l.executionProviders.find((i)=>String(i?.id||"")===r):null;return String(n?.windowsNativeDefaultWorkdir||f?.defaultWorkdir||l?.windowsNativeCodexDefaultWorkdir||"/mnt/f/Work/ConStart")}function Z2(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((t)=>String(t?.id||"")===r):null;if(typeof n?.defaultWorkdir==="string"&&n.defaultWorkdir.trim().length>0)return n.defaultWorkdir.trim();let i=String(l?.mainProviderId||l?.defaultProviderId||"D601");return r===i?String(l?.defaultWorkdir||"/workspace"):String(l?.remoteDefaultWorkdir||"/home/ubuntu")}function yy(l){return String(l||"").trim().replace(/\/+$/u,"")||"/"}function jO(l,u,r){return String(l?.providerId||"")===String(u||"")&&String(l?.executionMode||"default")===String(r||"default")&&String(l?.path||"").trim().length>0}function FO(l,u,r,f,n){let i=new Map,t=yy(n),y=(c,$,A={})=>{let j=yy(c);if(j.length===0||i.has(j))return;i.set(j,{providerId:r,executionMode:f,path:j,source:$,createdAt:A?.createdAt||"",updatedAt:A?.updatedAt||""})};y(nc(l,f,r),"default");for(let c of Array.isArray(u)?u:[])if(jO(c,r,f))y(c.path,"saved",c);return y(n,"current"),Array.from(i.values()).sort((c,$)=>{if(c.path===t)return-1;if($.path===t)return 1;if(c.source==="default"&&$.source!=="default")return-1;if($.source==="default"&&c.source!=="default")return 1;return c.path.localeCompare($.path)})}function JO(l){return yQ(l)}function UO({task:l,selected:u,onSelect:r,onCopy:f,onReference:n,onMarkRead:i,copied:t,markingRead:y}){let c=l?.lastJudge||{},$=String(l?.id||""),A=sn(l),j=uQ(l?.updatedAt,Uf(l)?.updatedAt),F=`最近更新: ${lQ(j)}`,U=JO(l),N=U===null?"--":String(U),W=U===null?"STEP 统计中心同步中":"STEP 来自 OA Event Flow 统计中心";return G("article",{role:"button",tabIndex:0,className:`codex-task-card ${u?"selected":""} ${A?"unread-terminal":""}`,onClick:r,onKeyDown:(L)=>{if(L.key==="Enter"||L.key===" ")L.preventDefault(),r()},"data-unread-terminal":A?"true":"false","data-testid":`codex-task-${l?.id||"unknown"}`},A?G("span",{className:"codex-unread-badge",title:"待读","aria-label":"待读","data-testid":`codex-unread-task-${$||"unknown"}`}):null,G("div",{className:"codex-task-card-head"},G("div",{className:"codex-task-status-line"},G(Y0,{status:l?.status,title:dE(l)},oE(l))),G("span",{className:"mono-text"},`${l?.currentAttempt||0}/${l?.maxAttempts||0}`)),G("div",{className:"codex-task-id-row"},G("code",{title:$},$||"unknown"),G("div",{className:"codex-task-id-actions"},G("button",{type:"button",className:"codex-copy-id-btn",onClick:(L)=>{L.stopPropagation(),n($)},"data-testid":`codex-reference-task-${$||"unknown"}`},"引用"),G("button",{type:"button",className:"codex-copy-id-btn",onClick:(L)=>{L.stopPropagation(),f($)},"data-testid":`codex-copy-task-id-${$||"unknown"}`},t?"已复制":"复制ID"),A?G("button",{type:"button",className:"codex-copy-id-btn codex-mark-read-btn",disabled:Boolean(y),onClick:(L)=>{L.stopPropagation(),i($)},"data-testid":`codex-mark-task-read-${$||"unknown"}`},y?"标记中":"标为已读"):null)),G("strong",null,Q2(nQ(l),120)||"空任务"),G("div",{className:"codex-task-meta"},G("span",null,`queue=${ty(l)}`),G("span",null,`provider=${l?.providerId||"D601"}`),G("span",null,`mode=${l?.executionMode||"default"}`),G("span",null,l?.model||"--"),G("span",null,aE(l))),G("div",{className:"codex-task-meta codex-task-update-meta"},G("span",{className:"codex-task-recent-update codex-task-step-count",title:W,"data-testid":`codex-task-step-count-${$||"unknown"}`},`STEP ${N}`),G("span",{className:"codex-task-recent-update",title:j?`更新时间: ${Wl(j)}`:F,"data-testid":`codex-task-recent-update-${$||"unknown"}`},F),G("span",null,Wl(j||l?.updatedAt))),NQ(l)?G("div",{className:"codex-judge-line","data-testid":`codex-task-prompt-editable-${$||"unknown"}`},"queued prompt 可编辑"):null,c?.decision?G("div",{className:"codex-judge-line"},`judge=${c.decision} ${Math.round(Number(c.confidence||0)*100)}%`):null)}function N2({title:l,tasks:u,selectedId:r,onSelect:f,onCopy:n,onReference:i,onMarkRead:t,copiedTaskId:y,markingReadTaskId:c,emptyText:$}){let A=Array.isArray(u)?u:[];return G("section",{className:"codex-task-section"},G("div",{className:"codex-task-section-head"},G("span",null,l),G("code",null,String(A.length))),A.length===0?G("p",{className:"codex-task-section-empty"},$):G("div",{className:"codex-task-section-list"},A.map((j)=>G(UO,{key:j.id,task:j,selected:r===j.id,onSelect:()=>f(j.id),onCopy:n,onReference:i,onMarkRead:t,copied:y===j.id,markingRead:c===j.id}))))}function NO(){return G("span",{className:"codex-stats-icon","aria-hidden":"true"},G("svg",{viewBox:"0 0 36 24",focusable:"false"},G("path",{className:"grid",d:"M3 20.5H33M3 12.5H33M3 4.5H33"}),G("polyline",{className:"line tasks",points:"3,18 9,14 15,15 21,8 27,10 33,4"}),G("polyline",{className:"line retry",points:"3,20 9,17 15,18 21,13 27,14 33,9"})))}function QO({stats:l,queueName:u,onRaw:r}){let f=nO(l),n=iO(l),i=f.at(-1)||{},t=F2(f,"executedTasks"),y=F2(f,"retryAttempts"),c=F2(f,"avgDurationMs"),$=f.length>0,A=Gu(l?.range)||{},[j,F]=gl(null),[U,N]=gl(null),W=[];if(t>0)W.push(`tasks ${t}`);if(y>0)W.push(`retry ${y}`);if(c>0)W.push(`avg ${of(c)}`);let L=[{key:"executedTasks",className:"tasks",label:"执行任务",max:t,format:(E)=>`${au(E)} tasks`},{key:"retryAttempts",className:"retry",label:"重试次数",max:y,format:(E)=>`${au(E)} retries`},{key:"avgDurationMs",className:"duration",label:"平均耗时",max:c,format:(E)=>of(E)}],J=j||U,w=c3(J),Q=String(J?.row?.date||""),q=J?{left:`${Math.max(8,Math.min(92,Number(J.x)/S0*100))}%`,top:`${Math.max(14,Math.min(86,Number(J.y)/sN*100))}%`}:void 0;vn(()=>{F(null),N(null)},[u,A.startDate,A.endDate,f.length]);let T=(E)=>{F(E)},O=(E)=>{let D=c3(E);N((Y)=>c3(Y)===D?null:E),F(E)},Z=L.flatMap((E)=>f.map((D,Y)=>{let p=tO(D,Y,f.length,E),V=c3(p),B=w===V,m=String(D?.date||`day-${Y}`),X=`${bn(m)} ${E.label}: ${p.valueLabel}`;return G("g",{key:`${E.key}-${m}`,className:`stat-point-group ${E.className} ${B?"active":""}`,role:"button",tabIndex:0,"aria-label":X,"data-testid":`codex-stats-point-${E.className}-${m}`,onMouseEnter:()=>T(p),onFocus:()=>T(p),onClick:()=>O(p),onKeyDown:(S)=>{if(S.key==="Enter"||S.key===" ")S.preventDefault(),O(p)}},G("circle",{className:"stat-hit-point",cx:p.x,cy:p.y,r:13}),G("circle",{className:`stat-point ${E.className} ${B?"active":""}`,cx:p.x,cy:p.y,r:B?5.6:4.2}))}));return G(ry,{title:"统计曲线",eyebrow:`Daily task stats / ${u}`,className:"codex-stats-panel",summary:G("span",null,`${bn(A.startDate)} -> ${bn(A.endDate)} · ${l?.timezone||"Asia/Shanghai"}`),actions:Gu(l)?G(rQ,{title:"Code Queue Stats",data:l,onOpen:r,testId:"raw-codex-stats"}):null},G("div",{className:"codex-stats-hero","data-testid":"codex-stats-panel"},G(NO),G("div",null,G("strong",null,`${au(n.executedTasks)} tasks / ${au(n.retryAttempts)} retries`),G("span",null,`平均完成耗时 ${of(n.avgDurationMs??void 0)} · 终态 ${au(n.completedTasks)} 个`))),$?G("div",{className:"codex-stats-chart","data-testid":"codex-stats-chart",onMouseLeave:()=>F(null)},G("svg",{viewBox:`0 0 ${S0} ${sN}`,preserveAspectRatio:"none",role:"img","aria-label":"Code Queue daily task statistics"},G("line",{className:"axis",x1:Xi,x2:S0-Xi,y1:ic,y2:ic}),G("line",{className:"grid",x1:Xi,x2:S0-Xi,y1:ny+G2/2,y2:ny+G2/2}),G("line",{className:"grid",x1:Xi,x2:S0-Xi,y1:ny,y2:ny}),G("polyline",{className:"stat-line tasks",points:J2(f,"executedTasks",t)}),G("polyline",{className:"stat-line retry",points:J2(f,"retryAttempts",y)}),G("polyline",{className:"stat-line duration",points:J2(f,"avgDurationMs",c)}),J?G("g",{className:"stat-cursor-layer","data-testid":"codex-stats-active-point"},G("line",{className:"stat-cursor",x1:J.x,x2:J.x,y1:ny,y2:ic}),G("circle",{className:`stat-point-active ${J.className}`,cx:J.x,cy:J.y,r:8})):null,G("g",{className:"stat-point-layer"},Z)),J?G("div",{className:"codex-stats-tooltip active",style:q,"data-testid":"codex-stats-tooltip"},G("b",null,bn(J.row?.date)),G("span",null,`${J.label} · ${J.valueLabel}`),G("code",null,`${au(J.row?.executedTasks)} exec / ${au(J.row?.retryAttempts)} retry / ${of(J.row?.avgDurationMs??void 0)}`)):null,G("div",{className:"codex-stats-legend"},G("span",{className:"tasks"},"执行任务"),G("span",{className:"retry"},"重试次数"),G("span",{className:"duration"},"平均耗时")),G("div",{className:"codex-stats-scale"},G("span",null,bn(f[0]?.date)),G("span",null,W.join(" · ")||"暂无峰值"),G("span",null,bn(f.at(-1)?.date))),G("div",{className:`codex-stats-focus ${J?"active":""}`,"data-testid":"codex-stats-focus"},J?G(yc.default.Fragment,null,G("div",null,G("strong",null,bn(J.row?.date)),G("span",null,`${J.label} · ${J.valueLabel}`)),G("div",{className:"codex-stats-focus-metrics"},G("code",null,`${au(J.row?.executedTasks)} exec`),G("code",null,`${au(J.row?.retryAttempts)} retry`),G("code",null,of(J.row?.avgDurationMs??void 0)))):G("span",null,"将鼠标悬停到曲线数据点查看明细,点击数据点可固定。"))):G(P0,{title:"暂无统计",text:"任务开始执行后会生成按天汇总的曲线。"}),G("div",{className:"codex-stats-summary-grid"},G("article",null,G("span",null,"今日执行"),G("strong",null,String(au(i.executedTasks))),G("code",null,bn(i.date))),G("article",null,G("span",null,"今日重试"),G("strong",null,String(au(i.retryAttempts))),G("code",null,`累计 ${au(n.retryAttempts)}`)),G("article",null,G("span",null,"平均耗时"),G("strong",null,of(n.avgDurationMs??void 0)),G("code",null,`${au(n.durationSamples)} samples`))),G("div",{className:"codex-stats-daily-list","data-testid":"codex-stats-daily-list"},f.slice(-7).map((E)=>G("div",{key:String(E?.date||""),className:`codex-stats-daily-row ${Q===String(E?.date||"")?"active":""}`,"data-testid":`codex-stats-day-${String(E?.date||"unknown")}`},G("span",null,bn(E?.date)),G("b",null,`${au(E?.executedTasks)} exec`),G("b",null,`${au(E?.retryAttempts)} retry`),G("code",null,of(E?.avgDurationMs??void 0))))))}function wO({task:l,queueRows:u,busy:r,onMove:f}){let n=String(l?.id||""),i=ty(l),[t,y]=gl(i);vn(()=>{y(i)},[n,i]);let c=!n||r||["running","judging","retry_wait"].includes(String(l?.status||""));return G("div",{className:"codex-task-move-control","data-testid":"codex-task-queue-move-control"},G("label",null,"任务 queue",G("select",{value:t,disabled:!n||r,onChange:($)=>y(String($.target.value||i)),"data-testid":"codex-task-queue-move-select"},u.map(($)=>G("option",{key:String($?.id||""),value:String($?.id||"")},fc($))))),G("button",{type:"button",className:"ghost-btn",disabled:c||t===i,onClick:()=>f(t),title:c?"运行中 / judging / retry_wait 的任务不能移动;请先打断或等当前 turn 结束":"移动已创建任务到另一个 queue","data-testid":"codex-task-queue-move-button"},"移动"))}function oN(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 qO({task:l,loading:u,onLoadPromptPart:r,testId:f="codex-initial-prompt-full",textTestId:n="codex-initial-prompt-full-text",baseTextTestId:i="codex-initial-prompt-base"}){let t=z2(l),y=$3(l),c=_3(l).trimEnd(),$=String(y.full?.text||""),A=XE(l),j=Number(t.promptChars||l?.promptChars||$.length),F=Number(t.basePromptLines||X0(c)),U=Number(t.promptLines||X0($));return G("section",{className:"codex-progressive-card codex-progressive-prompt","data-testid":"codex-progressive-prompt"},G("div",{className:"codex-progressive-card-head"},G("span",{className:"codex-output-channel"},"Prompt"),G("strong",null,"Submitted prompt / 原始用户 prompt"),G("code",null,`${F||X0(c)} lines / ${c.length} chars`)),G("pre",{className:"codex-prompt-full","data-testid":i},c||"空 prompt"),A?G("details",{className:"codex-reference-injection codex-progressive-full-prompt","data-testid":f,onToggle:(N)=>{if(N.currentTarget?.open&&!$)r?.("full")}},G("summary",null,G("span",null,"引用注入已折叠,点击按需拉取最终进入 Code agent 的完整 prompt"),G("code",null,$?`${U||X0($)} lines / ${$.length} chars`:`${Number.isFinite(j)&&j>0?j:"--"} chars`)),G("pre",{className:"codex-prompt-full codex-prompt-final-full","data-testid":n},$||(u?"正在按需拉取完整 prompt...":"展开后将只请求 full prompt,不拉取完整 transcript。"))):null)}function qQ({task:l,attempt:u,attemptIndex:r,loading:f,onLoadSteps:n,onLoadStep:i,testId:t="codex-execution-summary"}){let y=kE(FQ(l,r)),c=gE(HE(l,u)),$=u?zE(l,u):tQ(l),A=L2(l),j=W2(l,r),F=kn($?.errorCount),U=kn($?.stepCount??$?.llmStepCount),N=kn($?.readCount),W=kn($?.editCount),L=kn($?.runCount),J=kn($?.stepCount??$?.llmStepCount),w=U===null?"--":String(U),Q=J===null?"--":String(J),q=Array.isArray(c.editedFiles)?c.editedFiles:[],T=Array.isArray(c.commands)?c.commands:[],Z=E2(u,r)?` · ${String(u?.label||"recovered thread execution")}`:r?` #${r}`:"",E=BE(l,u,r,c),D=`最近更新: ${lQ(E)}`,Y=VE(l,u,r);return G("details",{className:`codex-progressive-card codex-execution-summary ${Y?"running":""}`,"data-testid":t,"data-attempt-index":j3(r),"data-running":Y?"true":"false",onToggle:(p)=>{if(p.currentTarget?.open&&!j)n?.(r)}},G("summary",null,G("div",{className:"codex-progressive-card-head"},G("span",{className:"codex-output-channel"},"Summary"),G("strong",null,`执行过程摘要${Z}`),Y?G("span",{className:"codex-summary-running-pill","data-testid":`${t}-running`},"执行中"):null,G("code",{title:E?`最近更新: ${Wl(E)}`:D},`${of(c.durationMs??c.totalElapsedMs)} / ${w} tools / ${D}`)),G("div",{className:"codex-execution-digest"},G("span",{title:"来自 OA Event Flow 统计中心"},`read ${N===null?"--":N}`),G("span",{title:"来自 OA Event Flow 统计中心"},`edit ${W===null?"--":W}`),G("span",{title:"来自 OA Event Flow 统计中心"},`run ${L===null?"--":L}`),G("span",{title:"来自 OA Event Flow 统计中心"},`STEP ${Q}`),F!==null&&F>0?G("span",{className:"codex-execution-error-pill","data-testid":`${t}-error-count`},`Error ${F}`):null)),G("div",{className:"codex-execution-digest expanded"},G("span",null,`修改文件:${oN(q,6)}`),G("span",null,`执行命令:${oN(T,4)}`)),y.length===0?G("div",{className:"codex-output-empty"},f?"正在按需拉取步骤 summary...":"展开后将只请求执行步骤 summary,不拉取单步骤全量。"):G("div",{className:"codex-trace-step-list"},y.map((p)=>{let V=String(p?.seq??""),B=A[V],m=Array.isArray(p?.summaryLines)?p.summaryLines.slice(0,4):[],X=m.find((S)=>String(S||"").trim().length>0);return G("details",{key:V||`${p?.title}-${p?.at}`,className:`codex-trace-step ${String(p?.kind||"message")} ${CE(p)?"error":""}`,"data-testid":`codex-trace-step-${V||"unknown"}`,onToggle:(S)=>{if(S.currentTarget?.open&&!B)i?.(p?.seq)}},G("summary",null,G("span",{className:"codex-output-channel"},WO(p?.kind)),G("strong",null,String(p?.title||"Trace step")),p?.status?G("code",null,String(p.status)):null,X?G("span",{className:"codex-trace-step-inline-summary",title:String(X)},String(X)):null,G("time",null,Wl(p?.at))),G("div",{className:"codex-trace-step-summary"},m.length>0?m.map((S,b)=>G("pre",{key:`${V}-${b}`},String(S||""))):G("span",null,"无 summary")),B?.line?G(n3,{items:[B.line],autoScroll:!1,loading:!1,hasDetail:!0,emptyText:"无步骤详情",testId:`codex-trace-step-detail-${V||"unknown"}`,className:"codex-transcript codex-step-detail-transcript",collapseTools:!1}):G("div",{className:"codex-output-empty"},f?"正在按需拉取这个步骤的全量数据...":"展开后将只请求这个单步骤的全量数据。"))})))}function WO(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 WQ({task:l,attempt:u,attemptIndex:r,testId:f="codex-final-response"}){let n=DE(l,u);if(n.length===0)return null;let i=Number(u?.finalResponseChars||n.length),t=r?` #${r}`:"";return G("section",{className:"codex-progressive-card codex-final-response","data-testid":f,"data-attempt-index":j3(r)},G("div",{className:"codex-progressive-card-head"},G("span",{className:"codex-output-channel"},"Final"),G("strong",null,`最终 response${t}`),G("code",null,`${Number.isFinite(i)?i:n.length} chars`)),G(d1,{markdown:n,className:"codex-transcript-body codex-markdown",testId:`${f}-markdown`}))}function LQ({task:l,attempt:u,attemptIndex:r,testId:f="codex-progressive-judge"}){let n=AQ(l,u);if(!n?.decision)return null;let i=r?` #${r}`:"";return G("section",{className:"codex-progressive-card codex-progressive-judge","data-testid":f,"data-attempt-index":j3(r)},G("div",{className:"codex-progressive-card-head"},G("span",{className:"codex-output-channel"},"Judge"),G("strong",null,`完成判定${i}`),G("code",null,`${n.decision} ${Math.round(Number(n.confidence||0)*100)}%`)),G("div",{className:"codex-judge-card","data-testid":`${f}-card`},G(Y0,{status:n.decision},n.decision),G("strong",null,`${Math.round(Number(n.confidence||0)*100)}% confidence`),G("p",{"data-testid":`${f}-reason`},n.reason||"--"),G($Q,{judge:n,testId:`${f}-failure-details`}),n.continuePrompt?G("pre",{"data-testid":`${f}-continue-prompt`},String(n.continuePrompt||"")):null))}function LO({task:l,attempt:u,attemptIndex:r,loading:f,onLoadPromptPart:n,testId:i="codex-judge-feedback-prompt"}){let t=SE(l,u,r);if(t===null)return null;let y=jQ(r),$=$3(l)[y],A=String($?.text||"").trimEnd(),j=String(t.preview||t.text||"").trimEnd(),F=A||String(t.text||"").trimEnd(),U=Number($?.chars||t.chars||F.length||j.length),N=Number($?.lines||t.lines||X0(F||j)),W=$?.forAttempt||t.forAttempt||Number(r||0)+1;return G("details",{className:"codex-progressive-card codex-judge-feedback-prompt","data-testid":i,"data-attempt-index":j3(r),onToggle:(L)=>{if(L.currentTarget?.open&&!A)n?.("feedback",r)}},G("summary",null,G("div",{className:"codex-progressive-card-head"},G("span",{className:"codex-output-channel"},"Prompt"),G("strong",null,`judge feedback prompt #${r} -> #${W}`),G("code",null,`${N||"--"} lines / ${Number.isFinite(U)?U:j.length} chars`)),G("p",{className:"codex-feedback-preview","data-testid":`${i}-preview`},j||"展开后按需拉取 judge feedback prompt。")),G("pre",{className:"codex-prompt-full codex-feedback-full","data-testid":`${i}-text`},F||(f?"正在按需拉取 judge feedback prompt...":"展开后将只请求这一次 judge feedback prompt。")))}function GO({task:l,attempt:u,position:r,loading:f,onLoadPromptPart:n,onLoadSteps:i,onLoadStep:t}){let y=IE(u,r),c=r===0,$=E2(u,y),A=$?String(u?.label||"Recovered thread execution"):`Attempt ${y}`;return G("section",{className:"codex-attempt-cycle","data-testid":`codex-attempt-cycle-${y}`},G("div",{className:"codex-attempt-cycle-head"},G("span",{className:"codex-output-channel"},A),G("strong",null,String(u?.mode||(y<=1?"initial":"retry"))),u?.terminalStatus?G(Y0,{status:u.terminalStatus},u.terminalStatus):null,G("code",null,`${Wl(u?.startedAt)} -> ${Wl(u?.finishedAt)}`)),G(qQ,{task:l,attempt:u,attemptIndex:y,loading:f,onLoadSteps:i,onLoadStep:t,testId:c?"codex-execution-summary":`codex-execution-summary-attempt-${y}`}),$?null:G(WQ,{task:l,attempt:u,attemptIndex:y,testId:c?"codex-final-response":`codex-final-response-attempt-${y}`}),$?null:G(LQ,{task:l,attempt:u,attemptIndex:y,testId:c?"codex-progressive-judge":`codex-progressive-judge-attempt-${y}`}),$?null:G(LO,{task:l,attempt:u,attemptIndex:y,loading:f,onLoadPromptPart:n,testId:c?"codex-judge-feedback-prompt":`codex-judge-feedback-prompt-attempt-${y}`}))}function TO({task:l,loading:u,onLoadPromptPart:r,onLoadSteps:f,onLoadStep:n}){if(!l)return G(P0,{title:"未选择任务",text:"从左侧队列选择任务,或提交新 Codex 任务。"});let i=pE(l);return G("div",{className:"codex-transcript codex-progressive-trace","data-testid":"codex-output"},u&&!Uf(l)?G("div",{className:"codex-output-empty"},"正在加载 Trace Summary..."):null,G(qO,{task:l,loading:u,onLoadPromptPart:r}),i.length>0?i.map((t,y)=>G(GO,{key:`${t?.index||y+1}-${t?.startedAt||y}`,task:l,attempt:t,position:y,loading:u,onLoadPromptPart:r,onLoadSteps:f,onLoadStep:n})):[G(qQ,{key:"execution",task:l,loading:u,onLoadSteps:f,onLoadStep:n}),G(WQ,{key:"final",task:l}),G(LQ,{key:"judge",task:l})])}function mO({task:l}){let u=WE(l);if(!l||u.length===0)return G(P0,{title:"暂无原始消息",text:"原始 Codex app-server 消息会保留在任务 JSON 中。"});return G("details",{className:"codex-raw-output"},G("summary",null,`原始 messages (${u.length})`),G("div",null,u.map((r)=>G("article",{key:`${r.seq}-${r.channel}`,className:`codex-output-line ${r.channel||"system"}`},G("div",{className:"codex-output-meta"},G("span",{className:"codex-output-channel"},eE(String(r.channel||"system"))),G("span",null,Wl(r.at)),r.method?G("code",null,r.method):null),G("pre",null,String(r.text||""))))))}function KO({task:l}){let u=LE(l).slice().reverse();if(u.length===0)return G(P0,{title:"尚无 attempt",text:"任务开始运行后,这里会记录 Codex 终态、传输中断和 stderr tail。"});return G("div",{className:"table-wrap codex-attempt-table"},G("table",null,G("thead",null,G("tr",null,G("th",null,"#"),G("th",null,"模式"),G("th",null,"终态"),G("th",null,"传输"),G("th",null,"退出"),G("th",null,"完成时间"))),G("tbody",null,u.map((r)=>G("tr",{key:`${r.index}-${r.startedAt}`},G("td",null,r.index),G("td",null,r.mode),G("td",null,G(Y0,{status:r.terminalStatus||"unknown"},r.terminalStatus||"unknown")),G("td",null,r.transportClosedBeforeTerminal?G(Y0,{status:"failed"},"closed-before-terminal"):G(Y0,{status:"succeeded"},"normal")),G("td",null,`code=${r.appServerExitCode??"--"} signal=${r.appServerSignal??"--"}`),G("td",null,Wl(r.finishedAt)))))))}function GQ({microservices:l,onRaw:u,apiBaseUrl:r="/api",initialTasksData:f=null,standalone:n=!1}){let i=l.find((H)=>H.id==="code-queue")||null,t=IN(f),y=String(t?.id||""),c=new Map;if(t!==null&&y.length>0)c.set(y,{task:t,maxSeq:rc(Array.isArray(t.transcript)?t.transcript:[]),complete:Boolean(t._transcriptComplete),completeUpdatedAt:t._transcriptComplete?String(t.updatedAt||""):""});let $=typeof performance>"u"?0:performance.now(),A=Ru(y),j=Ru(0),F=Ru(0),U=Ru(0),N=Ru(!1),W=Ru(!1),L=Ru(!1),J=Ru(null),w=Ru(new Map),Q=Ru(new Map),q=Ru(new Map),T=Ru(new Map),O=Ru(new Set),Z=Ru(null),E=Ru(null),D=Ru(!1),Y=Ru(!1),p=Ru(Boolean(f)),V=Ru(new Map),B=Ru(new Set),m=Ru(c),X=Ru(f),[S,b]=gl(null),[z,P]=gl(f),[s,k]=gl(y),[v,tl]=gl(t),[I,M]=gl(!1),[rl,cl]=gl(""),[$l,Tl]=gl(null),[Ql,Ol]=gl(!1),[h,a]=gl(!1),ul=f?.queue||{},zl=String(ul?.mainProviderId||ul?.defaultProviderId||"D601").trim()||"D601",[o,ql]=gl(""),[pl,Bl]=gl(""),[Il,nu]=gl("default"),[Ml,wu]=gl(Yi),[Qr,Or]=gl(!1),[$r,ir]=gl(""),[tr,hr]=gl(zl),[jl,ol]=gl("default"),[wr,hl]=gl("gpt-5.5"),[Yu,eu]=gl(nc(ul,"default",zl)||"/workspace"),[rf,Ar]=gl(99),[Zr,Zn]=gl(1),[ff,ii]=gl(!1),[Au,nt]=gl(!1),[fl,Dl]=gl(""),[Cl,dl]=gl(""),[ju,ku]=gl(""),[$u,qr]=gl(!0),[Yf,Ry]=gl(()=>typeof window>"u"?!0:window.matchMedia(_E).matches),[mu,F_]=gl(!1),[c6,Fu]=gl(""),[bj,Pu]=gl(""),{addNotification:pr}=Xr(),[it,xy]=gl(""),[tt,J_]=gl(""),[by,U_]=gl(!1),[N_,y0]=gl(null),[yt,c0]=gl(!1),[Rr,Lf]=gl(f?{phase:"complete",taskId:y,queueMs:0,detailMs:0,totalMs:$,chunks:t?1:0,transcriptRows:Array.isArray(t?.transcript)?t.transcript.length:0,partial:Boolean(f?.selected?.hasMore||uc(t)),completedAt:new Date}:null),[Q_,ct]=gl(f?new Date:null),[vy,w_]=gl(!1),fn=tn(Du(z)),sy=fn.filter(sn),Cu=z?.queue||S?.body?.queue||S?.queue||{},_6=fO(z,Cu),q_=Nn(z),Pf=PN(Cu,Il),_0=String(Il||"default").trim()||"default",$0=Pf.filter((H)=>String(H?.id||"")!==_0),_t=iy(Pf,Ml),A0=Number((Pr(Ml)?Cu?.total:_t?.total)??q_.total??fn.length),$t=fy(Cu),vj=Pr(Ml)?$t:[String(iy(Pf,Ml)?.activeTaskId||"")].filter(Boolean),ti=CN(Cu,Pf,Ml,fn),sj=Pr(Ml)?j2(Cu):j2(_t||{}),W_=j2(Cu),ky=uO(W_),$6=Math.max(rO(W_),$t.length),A6=au((Pr(Ml)?Cu?.unreadTerminal:_t?.unreadTerminal)??sy.length),pn=z?sy.length:A6,L_=Pr(Ml)?"All queues":q2(_t||{id:Ml,name:Ml}),At=w2(rl),nf=At.length>0,kj=nf?tn(Du($l)):[],j6=Nn($l),nn=nf?kj:fn,gj=nn.filter(sn),pG=nn.filter((H)=>!af(H)).sort(tE),HG=nn.filter((H)=>af(H)&&!sn(H)),Ij=nf?j6:q_,jt=nf?Number(j6.total??kj.length):A0,aj=Ij.hasMore===!0&&String(Ij.nextBeforeId||"").length>0,F6=nf?h:vy,BG=i?fE(i):{},DG=i?nE(i):{},J6=SN(()=>GE(o),[o]),Hn=SN(()=>{let H=RN(Zr);return J6.flatMap((C)=>Array.from({length:H},()=>TE(C,pl)))},[J6,Zr,pl]),gy=Hn.length,oj=gy>1&&!ff,VG=Au||mu||gy===0||oj,dj=_O(Cu,wr),G_=$O(Cu,tr),ej=AO(Cu,jl),l7=nc(Cu,jl,tr),SG=Array.isArray(N_?.workdirs)?N_.workdirs:[],u7=FO(Cu,SG,tr,jl,Yu),U6=u7.some((H)=>H.source==="saved"&&yy(H.path)===yy(Yu)),N6=v?.id&&v?.activeTurnId&&String(v?.status)==="running",XG=v?.id&&!["succeeded","failed","canceled"].includes(String(v?.status||"")),YG=v?.id&&["succeeded","failed","canceled"].includes(String(v?.status||"")),Ft=v?.id&&NQ(v);function xr(H){let C=typeof H==="function"?H(X.current):H;return X.current=C,P(C),C}function PG(H,C,g=!0){let ll=Array.from(new Set(H.map((Al)=>String(Al||"")).filter(Boolean)));for(let Al of ll)if(V.current.set(Al,C),g)B.current.add(Al);return ll}function r7(H){for(let C of H.map((g)=>String(g||"")).filter(Boolean))V.current.delete(C),B.current.delete(C)}function T_(H){let C=String(H?.id||""),g=C?V.current.get(C):void 0;if(!g)return H;if(String(H?.status||"").length>0&&!af(H))return V.current.delete(C),B.current.delete(C),H;return{...H,readAt:H?.readAt||g,terminalUnread:!1}}function Q6(H){let C=String(H?.id||"");return C.length>0&&B.current.has(C)&&af(H)}function tn(H,C=!0){let g=[];for(let ll of Array.isArray(H)?H:[]){let Al=T_(ll);if(C&&Q6(Al))continue;g.push(Al)}return g}function CG(H,C=!0){if(!H||!Array.isArray(H?.tasks))return H;let g=tn(Du(H),C),ll=Nn(H);return{...H,tasks:g,pagination:H.pagination?{...ll,returned:g.length}:H.pagination}}function w6(H,C){return Pr(C)||ty(H)===C}function q6(H){let C=At.toLowerCase();if(C.length===0)return!0;return[H?.id,H?.status,H?.queueId,H?.providerId,H?.model,H?.cwd,H?.displayPrompt,H?.basePrompt,H?.prompt,H?.finalResponse,H?.lastError?.message].map((ll)=>String(ll||"").toLowerCase()).join(` -`).includes(C)}function MG(H,C){let g=H.filter((Zl)=>String(Zl?.id||"").length>0);if(g.length===0&&!C)return;let ll=g[0]||null,Al=String(ll?.id||""),Gl=g.filter((Zl)=>w6(Zl,Ml)),Ll=Gl.filter(q6),xl=String(C?.activeTaskId||fy(C)[0]||Al||ti||"");for(let Zl of g){let Xl=String(Zl?.id||"");if(!Xl)continue;let bl=Array.isArray(Zl?.transcript)?Zl.transcript:[];m.current.set(Xl,{...m.current.get(Xl)||{},task:{...Zl,_summaryLoaded:!0,_detailLoaded:bl.length>0,_transcriptComplete:!1,_transcriptPreview:!1},maxSeq:rc(bl),complete:!1,completeUpdatedAt:""})}if(xr((Zl)=>{if(!Zl&&(Gl.length===0||!C))return Zl;let Xl=Du(Zl),bl=tn(Qn([Xl,Gl],xl));return{...Zl||{},queue:C||Zl?.queue,tasks:bl,pagination:Zl?.pagination?{...Nn(Zl),returned:bl.length}:Zl?.pagination}}),nf)Tl((Zl)=>{if(!Zl||Ll.length===0)return Zl;let Xl=tn(Qn([Du(Zl),Ll],xl));return{...Zl,queue:C||Zl.queue,tasks:Xl,pagination:Zl.pagination?{...Nn(Zl),returned:Xl.length}:Zl.pagination}});if(ll&&w6(ll,Ml)&&q6(ll))U.current+=1,A.current=Al,k(Al),tl(m.current.get(Al)?.task||ll),M(!1),Lf({phase:"complete",taskId:Al,queueMs:0,detailMs:0,totalMs:0,chunks:1,transcriptRows:Array.isArray(ll?.transcript)?ll.transcript.length:0,partial:!0,completedAt:new Date});ct(new Date)}function hG(H){let C=String(H||Cu?.mainProviderId||"D601").trim()||"D601";hr(C),eu(nc(Cu,jl,C)),y0(null),m6().catch((g)=>Fu(xu(g,"加载工作目录失败")))}function RG(H){let C=String(H||"default").trim()||"default",g=tr;if(C==="windows-native"){if(!G_.find((Al)=>Al.id===tr)?.supportsWindowsNativeCodex)g=String(G_.find((Al)=>Al.supportsWindowsNativeCodex)?.id||tr||"D601"),hr(g)}ol(C),eu(nc(Cu,C,g)),y0(null),m6().catch((ll)=>Fu(xu(ll,"加载工作目录失败")))}function m_(H,C,g=null,ll=null){let Al=new Set(PG(H,C));if(Al.size===0&&ll===null&&g===null)return;xr((Gl)=>{if(!Gl)return Gl;let Ll=Du(Gl).flatMap((xl)=>{let Zl=String(xl?.id||"");if(!Al.has(Zl)){let cu=T_(xl);return Q6(cu)?[]:[cu]}let Xl=ll&&String(ll?.id||"")===Zl?ll:{},bl={...xl,...Xl,readAt:C,terminalUnread:!1};return Q6(bl)?[]:[bl]});return{...Gl,queue:g||Gl.queue,tasks:Al.size>0?Qn([Ll],ti):Ll}});for(let Gl of Al){let Ll=m.current.get(Gl);if(Ll?.task){let xl=ll&&String(ll?.id||"")===Gl?ll:{},Zl={...Ll.task,...xl,readAt:C,terminalUnread:!1};if(m.current.set(Gl,{...Ll,task:Zl}),A.current===Gl)tl(Zl)}}}vn(()=>{ii(!1)},[o,Zr,pl]),vn(()=>{let H=w2(rl);F.current+=1;let C=F.current;if(!i||H.length===0){Tl(null),Ol(!1),a(!1),L.current=!1;return}Ol(!0),Tl(null);let g=window.setTimeout(()=>{(async()=>{try{let ll=await MN(r,Ml,H);if(C!==F.current)return;Tl(CG(ll))}catch(ll){if(C===F.current)Tl(null),Fu(xu(ll,"搜索 Codex tasks 失败"))}finally{if(C===F.current)Ol(!1)}})()},240);return()=>window.clearTimeout(g)},[i?.id,r,Ml,rl]),vn(()=>{dl(v?_3(v):""),ku(Array.isArray(v?.referenceTaskIds)?v.referenceTaskIds.join(" "):"")},[s]);function Cf(H,C,g){let ll=m.current.get(H)||{},Al=ll.task||{},Gl=Array.isArray(Al.transcript)?Al.transcript:[],Ll=gN(Al,C),xl=Object.prototype.hasOwnProperty.call(C,"transcript")?U2(Gl,Array.isArray(C.transcript)?C.transcript:[]):Gl,Zl={...Al,...Ll,transcript:xl,output:Array.isArray(Ll.output)?T2(Al,Ll,"output"):Array.isArray(Al.output)?Al.output:[],events:Array.isArray(Ll.events)?T2(Al,Ll,"events"):Array.isArray(Al.events)?Al.events:[]},Xl=T_(Zl),bl=String(Xl?.updatedAt||""),cu=Boolean(C._transcriptComplete)&&af(Xl),lr=Boolean(ll.complete)&&af(Xl)&&String(ll.completeUpdatedAt||"")===bl,ru=cu||lr,yr={...ll,task:Xl,maxSeq:rc(xl),complete:ru,completeUpdatedAt:ru?bl:""};if(m.current.set(H,yr),g===U.current&&A.current===H)tl(Xl);return yr}async function yi(H,C=!1,g,ll){if(!i||!H)return;let Gl=m.current.get(H)?.task;if(!C&&y3(Gl))return;let Ll=H,xl=w.current.get(Ll);if(xl){if(C||!y3(Gl))xl.refreshAfter=!0;return xl.promise}let Zl=U.current,Xl=performance.now();if(A.current===H)M(!0);let bl={promise:Promise.resolve(),refreshAfter:!1},cu=(async()=>{try{let lr=await JE(r,H);if(Zl!==U.current||A.current!==H)return;let ru=lr?.summary||{},yr=String(ru.updatedAt||"");Cf(H,{id:H,status:ru.status,updatedAt:yr,startedAt:ru.startedAt,finishedAt:ru.finishedAt,currentAttempt:ru.currentAttempt,maxAttempts:ru.maxAttempts,finalResponse:ru.finalResponse,lastJudge:ru.lastJudge,lastError:ru.lastError,attempts:Array.isArray(ru.attempts)?ru.attempts:[],stepCount:ru.stepCount,llmStepCount:ru.llmStepCount,traceStats:ru.traceStats,statsSource:ru.statsSource,timing:ru.timing,_traceSummary:ru,_traceSummaryLoaded:!0,_traceSummaryUpdatedAt:yr,_detailLoaded:!0},Zl),Lf({phase:"complete",taskId:H,queueMs:ll??0,detailMs:performance.now()-Xl,totalMs:g===void 0?performance.now()-Xl:performance.now()-g,chunks:1,transcriptRows:Number(ru?.execution?.traceLineCount||ru?.execution?.stepCount||0),partial:!1,completedAt:new Date})}finally{let lr=Boolean(bl.refreshAfter&&A.current===H&&!y3(m.current.get(H)?.task));if(w.current.delete(Ll),Zl===U.current&&A.current===H)M(!1);if(lr)window.setTimeout(()=>{yi(H,!0).catch((ru)=>Fu(xu(ru,"自动刷新 Trace Summary 失败")))},0)}})();bl.promise=cu,w.current.set(Ll,bl),await cu}async function xG(H,C=null){let g=A.current;if(!i||!g||!H)return;let ll=m.current.get(g)?.task,Al=$3(ll),Gl=H==="feedback"||H==="judge-feedback"?jQ(C):H;if(Al[Gl]?.text)return;let Ll=`${g}:${Gl}`,xl=Q.current.get(Ll);if(xl)return xl;let Zl=U.current;if(A.current===g)M(!0);let Xl=(async()=>{try{let bl=await UE(r,g,H,C);if(Zl!==U.current||A.current!==g)return;let cu=m.current.get(g)?.task,lr=$3(cu);Cf(g,{...H==="full"?{prompt:String(bl?.text||""),promptChars:Number(bl?.chars||0)}:{},_promptDetails:{...lr,[Gl]:bl}},Zl)}finally{if(Q.current.delete(Ll),Zl===U.current&&A.current===g)M(!1)}})();Q.current.set(Ll,Xl),await Xl}async function W6(H=null,C={}){let g=A.current;if(!i||!g)return;let ll=m.current.get(g)?.task,Al=H===null||H===void 0||String(H).length===0?"":String(H),Gl=W2(ll,Al||null),Ll=Boolean(C.force),xl=Boolean(C.incremental);if(Gl&&!Ll)return;let Zl=FQ(ll,Al||null),Xl=xl&&Zl.length>0?YE(Zl):0,bl=`${g}:${Al||"all"}:${Xl}`,cu=q.current.get(bl);if(cu)return cu;let lr=U.current;if(A.current===g)M(!0);let ru=(async()=>{try{let yr=await NE(r,g,Xl,500,Al||null);if(lr!==U.current||A.current!==g)return;let yn=Array.isArray(yr?.steps)?yr.steps:[],Bn=Xl>0?PE(Zl,yn):yn;if(Al){let ci=m.current.get(g)?.task,Jt=Gu(ci?._traceStepsByAttempt)||{},Mf=Gu(ci?._traceStepsLoadedByAttempt)||{},Gf=Gu(ci?._traceStepsNextAfterSeqByAttempt)||{};Cf(g,{_traceStepsByAttempt:{...Jt,[Al]:Bn},_traceStepsLoadedByAttempt:{...Mf,[Al]:!0},_traceStepsNextAfterSeqByAttempt:{...Gf,[Al]:yr?.nextAfterSeq}},lr)}else Cf(g,{_traceSteps:Bn,_traceStepsLoaded:!0,_traceStepsHasMore:Boolean(yr?.hasMore),_traceStepsNextAfterSeq:yr?.nextAfterSeq},lr)}finally{if(q.current.delete(bl),lr===U.current&&A.current===g)M(!1)}})();q.current.set(bl,ru),await ru}async function bG(H){let C=A.current,g=String(H??"");if(!i||!C||g.length===0)return;let ll=m.current.get(C)?.task;if(L2(ll)[g]?.line)return;let Gl=`${C}:${g}`,Ll=T.current.get(Gl);if(Ll)return Ll;let xl=U.current;if(A.current===C)M(!0);let Zl=(async()=>{try{let Xl=await QE(r,C,H);if(xl!==U.current||A.current!==C)return;let bl=m.current.get(C)?.task,cu=L2(bl);Cf(C,{_traceStepDetails:{...cu,[g]:Xl}},xl)}finally{if(T.current.delete(Gl),xl===U.current&&A.current===C)M(!1)}})();T.current.set(Gl,Zl),await Zl}function vG(H){if(A.current!==H)return;let C=m.current.get(H)?.task;if(!C)return;if(W2(C,null))W6(null,{force:!0,incremental:!0}).catch((ll)=>Fu(xu(ll,"增量刷新 Trace Steps 失败")));let g=Gu(C?._traceStepsLoadedByAttempt)||{};for(let ll of Object.keys(g).filter((Al)=>g[Al]))W6(ll,{force:!0,incremental:!0}).catch((Al)=>Fu(xu(Al,"增量刷新 Attempt Trace Steps 失败")))}async function ZP(H,C,g){if(!i||!H)return;let ll=performance.now(),Al=U.current,Gl=m.current.get(H);if(Gl?.task){if(tl(Gl.task),M(uc(Gl.task)||!Gl.complete),!uc(Gl.task)&&Gl.complete&&af(Gl.task)&&String(Gl.completeUpdatedAt||"")===String(Gl.task?.updatedAt||"")){Lf({phase:"complete",taskId:H,queueMs:g??0,detailMs:0,totalMs:C===void 0?0:performance.now()-C,chunks:0,transcriptRows:Array.isArray(Gl.task.transcript)?Gl.task.transcript.length:0,completedAt:new Date});return}}else M(!0);let Ll=J.current;if(Ll?.taskId===H&&Ll.token===Al)return Ll.promise;let xl=(async()=>{try{let Zl=await Vu(Su(r,`/api/tasks/${encodeURIComponent(H)}?meta=1`));if(Al!==U.current||A.current!==H)return;let Xl=m.current.get(H),bl=Array.isArray(Xl?.task?.transcript)?Xl.task.transcript:[],cu=Zl?.task||{},lr=Boolean(Xl?.complete)&&String(Xl?.completeUpdatedAt||"")===String(cu?.updatedAt||"");Cf(H,{...cu,summaryOnly:!1,_metaLoaded:!0,transcript:bl,_detailLoaded:bl.length>0,_transcriptComplete:lr},Al);let ru=uc(Xl?.task)||Boolean(Xl?.task?._transcriptPreview),yr=ru?0:bl.length>0?aN(bl):0,yn=!ru&&Xl?.complete&&af(cu)&&String(Xl?.completeUpdatedAt||"")===String(cu?.updatedAt||"")?rc(bl):yr,Bn=!0,ci=0,Jt=bl.length;while(Bn){let Mf=await Vu(Su(r,`/api/tasks/${encodeURIComponent(H)}/transcript?afterSeq=${encodeURIComponent(String(yn))}&limit=${lE}&fullText=1`));if(Al!==U.current||A.current!==H)return;let Gf=m.current.get(H),Ut=Array.isArray(Gf?.task?.transcript)?Gf.task.transcript:[],j0=U2(Ut,Array.isArray(Mf?.transcript)?Mf.transcript:[]);ci+=1,Jt=j0.length;let Mu=Boolean(!Mf?.hasMore);if(Cf(H,{status:Mf?.status||cu.status,updatedAt:Mf?.updatedAt||cu.updatedAt,transcript:j0,_detailLoaded:Mu||j0.length>0,_transcriptComplete:Mu,_transcriptPreview:ru&&!Mu},Al),Bn=Boolean(Mf?.hasMore),yn=Number(Mf?.nextAfterSeq??rc(j0)),!Bn)break;await new Promise((A7)=>window.setTimeout(A7,0))}Lf({phase:"complete",taskId:H,queueMs:g??0,detailMs:performance.now()-ll,totalMs:C===void 0?performance.now()-ll:performance.now()-C,chunks:ci,transcriptRows:Jt,completedAt:new Date})}finally{if(J.current?.taskId===H&&J.current?.token===Al)J.current=null;if(Al===U.current&&A.current===H)M(!1)}})();J.current={taskId:H,token:Al,promise:xl},await xl}async function tf(H=A.current,C=!0,g=Ml){if(!i)return;if(!C&&Y.current)return;let ll=performance.now();if(C)Y.current=!0;if(C)Lf({phase:"loading",taskId:String(H||A.current||""),startedAt:new Date});let Al=j.current+1;j.current=Al;let Gl=String(H||A.current||""),Ll=Gl?m.current.get(Gl):null,xl=Array.isArray(Ll?.task?.transcript)?Ll.task.transcript:[],Zl=aN(xl),Xl=null,bl=C&&Gl.length===0;if(Xl=bl?await MN(r,g,""):await A2(r,Gl,Zl,g,"",!0,{stats:!1}),Al!==j.current){if(C)Y.current=!1;return}let cu=performance.now()-ll;b(S||{});let lr=Xl?.queue||{},ru=String(lr?.activeTaskId||fy(lr)[0]||""),yr=Xl;xr((gu)=>{let _i=Du(Xl),yf=Du(gu),Tf=yf.length>0?Qn([yf,_i],ru):Qn([_i],ru),$i=tn(Tf),K_=Nn(Xl),F0=Nn(gu),z6=yf.length>_i.length&&(F0.hasMore===!1||String(F0.nextBeforeId||"").length>0),LT={...K_,...z6?{hasMore:F0.hasMore,nextBeforeId:F0.nextBeforeId}:{},returned:$i.length};return yr={...Xl,tasks:$i,pagination:LT},yr});let yn=Du(yr),Bn=PN(lr,Il),ci=CN(lr,Bn,g,yn),Jt=FE(Bn,g,yn),Mf=Gl||A.current,Gf=yr?.selected||null,Ut=Gf?.task||null,j0=Array.isArray(Gf?.transcript)?Gf.transcript:null,Mu=Mf||ci||Jt||yn[0]?.id||"";if(A.current!==Mu)U.current+=1;A.current=Mu,k(Mu);let Nt=yn.find((gu)=>gu.id===Mu);if(Nt){let gu=m.current.get(Mu);if(gu?.task)m.current.set(Mu,{...gu,task:{...Nt,...gu.task,status:Nt.status,updatedAt:Nt.updatedAt}})}if(bl&&Nt){if(Cf(Mu,{...Nt,_summaryLoaded:!1,transcript:[],_detailLoaded:!1,_transcriptComplete:!1,_transcriptPreview:!0},U.current),M(!0),Lf({phase:"complete",taskId:Mu,queueMs:cu,detailMs:0,totalMs:performance.now()-ll,chunks:0,transcriptRows:0,partial:!0,completedAt:new Date}),ct(new Date),C)Y.current=!1;yi(Mu,!0).catch((gu)=>Fu(xu(gu,"加载 Codex Trace Summary 失败"))),A2(r,Mu,0,g,"",!1).then((gu)=>{if(Al!==j.current)return;let _i=Du(gu),yf=IN(gu);if(_i.length>0)xr((Tf)=>{let $i=Qn([Du(Tf),_i],ru);return{...Tf,statistics:gu?.statistics||Tf?.statistics,tasks:tn($i)}});if(yf?.id===A.current){let Tf=Array.isArray(yf.transcript)?yf.transcript:[];Cf(yf.id,{...yf,transcript:Tf,_summaryLoaded:!0,_detailLoaded:Tf.length>0,_transcriptPreview:Boolean(gu?.selected?.preview)},U.current)}}).catch(()=>{});return}if(Ut?.id===Mu&&j0!==null){let gu=m.current.get(Mu),_i=Array.isArray(gu?.task?.transcript)?gu.task.transcript:[],yf=U2(_i,j0),Tf=Boolean(Gf?.preview);if(Cf(Mu,{...Ut,_summaryLoaded:!0,transcript:yf,_detailLoaded:!Gf?.hasMore||yf.length>0,_transcriptComplete:!Tf&&!Gf?.hasMore&&af(Ut),_transcriptPreview:Tf},U.current),M(!1),C)Lf({phase:"complete",taskId:Mu,queueMs:cu,detailMs:Math.max(0,performance.now()-ll-cu),totalMs:performance.now()-ll,chunks:1,transcriptRows:yf.length,partial:Boolean(Tf||Gf?.hasMore||uc(Ut)),completedAt:new Date});if(ct(new Date),C)Y.current=!1;yi(Mu,!1,C?ll:void 0,C?cu:void 0).catch(($i)=>Fu(xu($i,"加载 Codex Trace Summary 失败"))),A2(r,Gl,Zl,g,"",!1).then(($i)=>{if(Al!==j.current)return;let K_=Du($i);if(K_.length>0)xr((F0)=>{let z6=Qn([Du(F0),K_],ru);return{...F0,tasks:tn(z6)}})}).catch(()=>{});return}if(C)Lf({phase:"session",taskId:Mu,queueMs:cu,totalMs:cu,startedAt:new Date(Date.now()-cu)});if(Mu)yi(Mu,!0,C?ll:void 0,C?cu:void 0).catch((gu)=>Fu(xu(gu,"加载 Codex Trace Summary 失败")));else if(U.current+=1,tl(null),M(!1),C)Lf({phase:"complete",taskId:"",queueMs:cu,detailMs:0,totalMs:performance.now()-ll,chunks:0,transcriptRows:0,completedAt:new Date});if(ct(new Date),C)Y.current=!1}async function f7(){if(nf){if(!i||h||L.current)return;let C=String(j6.nextBeforeId||"");if(!C)return;L.current=!0,a(!0),Fu("");try{let g=await hN(r,Ml,C,eN,At),ll=Du(g),Al=g?.queue||Cu||{},Gl=String(Al?.activeTaskId||fy(Al)[0]||ti||"");Tl((Ll)=>{let xl=tn(Qn([Du(Ll),ll],Gl)),Zl=Nn(g);return{...Ll||{},queue:Al,tasks:xl,pagination:{...Zl,returned:xl.length}}})}catch(g){Fu(xu(g,"加载更多搜索结果失败"))}finally{L.current=!1,a(!1)}return}if(!i||vy||W.current)return;let H=String(Nn(z).nextBeforeId||"");if(!H)return;W.current=!0,w_(!0),Fu("");try{let C=await hN(r,Ml,H),g=Du(C),ll=C?.queue||Cu||{},Al=String(ll?.activeTaskId||fy(ll)[0]||ti||"");xr((Gl)=>{let Ll=tn(Qn([Du(Gl),g],Al)),xl=Nn(C);return{...Gl||{},queue:ll,statistics:C?.statistics||Gl?.statistics,tasks:Ll,pagination:{...xl,returned:Ll.length}}})}catch(C){Fu(xu(C,"加载更早 Codex tasks 失败"))}finally{W.current=!1,w_(!1)}}function sG(H){let C=H.currentTarget;if(!C||F6||!aj)return;if(C.scrollHeight-C.scrollTop-C.clientHeight<120)f7()}async function Hr(H,C){F_(!0),Fu("");try{await H()}catch(g){Fu(xu(g,C))}finally{F_(!1)}}async function L6(H){if(!H)return;try{let C=!1;try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(H),C=!0}catch{C=!1}if(!C){let ll=document.createElement("textarea");ll.value=H,ll.style.position="fixed",ll.style.opacity="0",document.body.appendChild(ll),ll.select(),C=document.execCommand("copy"),document.body.removeChild(ll)}if(!C)throw Error("browser clipboard rejected the copy request");xy(H);let g=`已复制任务 ID:${H}`;Pu(g),pr("success",g),window.setTimeout(()=>xy((ll)=>ll===H?"":ll),1600)}catch(C){Fu(`复制任务 ID 失败:${xu(C)}`)}}function G6(H){if(!H)return;Bl(H);let C=`已引用任务 ID:${H};提交时后端会读取并注入该任务上下文`;Pu(C),pr("success",C)}async function T6(H){if(!i||!H)return;let C=new Date().toISOString();j.current+=1,m_([H],C,null,{id:H,readAt:C,terminalUnread:!1}),J_(H);let g=!1;if(await Hr(async()=>{let ll=await wE(r,H),Al=ll?.task||{id:H,readAt:new Date().toISOString(),terminalUnread:!1},Gl=String(Al?.readAt||new Date().toISOString());m_([H],Gl,ll?.queue||null,Al),g=!0;let Ll=`已将任务 ${H} 标为已读`;Pu(Ll),pr("success",Ll)},"标记 Codex task 已读失败"),!g)r7([H]),tf(A.current,!1).catch((ll)=>Fu(xu(ll,"刷新 Codex tasks 失败")));J_((ll)=>ll===H?"":ll)}async function kG(){if(!i||by)return;U_(!0);let H=new Date().toISOString(),C=Array.from(new Set([...Du(X.current).filter(sn).map((ll)=>String(ll?.id||"")).filter(Boolean),...Array.from(m.current.entries()).filter(([,ll])=>sn(ll?.task)).map(([ll])=>ll)]));if(j.current+=1,C.length>0)m_(C,H);let g=!1;if(await Hr(async()=>{let ll=await qE(r),Al=String(ll?.readAt||new Date().toISOString()),Gl=Du(X.current).filter(sn).map((bl)=>String(bl?.id||"")).filter(Boolean),Ll=Array.from(m.current.entries()).filter(([,bl])=>sn(bl?.task)).map(([bl])=>bl),xl=Array.from(new Set([...C,...Gl,...Ll]));m_(xl,Al,ll?.queue||null);let Zl=Number(ll?.count||xl.length);g=!0;let Xl=`已将 ${Zl} 个已结束未读任务标为已读`;Pu(Xl),pr("success",Xl)},"全部标为已读失败"),!g&&C.length>0)r7(C),tf(A.current,!1).catch((ll)=>Fu(xu(ll,"刷新 Codex tasks 失败")));U_(!1)}function gG(H){let C=H||Yi;if(wu(C),!Pr(C))nu(C);if(xr(null),!(Pr(C)?A.current:""))A.current="",U.current+=1,k(""),tl(null),M(!0)}async function m6(){if(!i)return;let H=await Vu(Su(r,"/api/workdirs"));y0(H)}async function IG(){let H=Yu.trim()||l7||"/workspace",C=typeof window>"u"?H:window.prompt("输入新的工作目录绝对路径",H),g=String(C||"").trim();if(!g)return;c0(!0),await Hr(async()=>{let ll=await Vu(Su(r,"/api/workdirs"),{method:"POST",body:{providerId:tr,executionMode:jl,path:g,ensure:!0}});y0((Gl)=>({...Gl||{},...ll})),eu(String(ll?.workdir?.path||g));let Al=`已保存工作目录:${String(ll?.workdir?.path||g)}`;Pu(Al),pr("success",Al)},"创建工作目录失败"),c0(!1)}async function aG(){let H=yy(Yu);if(!U6){Pu("当前工作目录还没有保存到下拉菜单。");return}if(!(typeof window>"u"?!0:window.confirm(`从下拉菜单删除工作目录选项? -${H} +本次任务:`,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 q3(l){if(typeof l==="string")return l;if(l&&typeof l==="object"&&!Array.isArray(l)&&typeof l.text==="string")return l.text;return""}function pQ(l,u={}){if(u.preview===!0){let n=q3(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 uz(lz(f).userPrompt)}function Jr(l){return l?._traceSummary&&typeof l._traceSummary==="object"&&!Array.isArray(l._traceSummary)?l._traceSummary:null}function T3(l){return l?._promptDetails&&typeof l._promptDetails==="object"&&!Array.isArray(l._promptDetails)?l._promptDetails:{}}function g2(l){let u=Jr(l)?.prompt;return u&&typeof u==="object"&&!Array.isArray(u)?u:{}}function zQ(l){let u=Jr(l)?.execution;return u&&typeof u==="object"&&!Array.isArray(u)?u:{}}function NQ(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 k2(l){let u=_u(l?.traceStats);if(u&&(l?.statsSource==="oa-event-flow"||u.source==="oa-event-flow"))return u;let r=Jr(l),f=_u(r?.traceStats);if(f&&(r?.statsSource==="oa-event-flow"||f.source==="oa-event-flow"))return f;return null}function rz(l,u){let r=_u(u?.traceStats)||_u(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 fz(l,u){return un(k2(l)?.[u])}function nz(l){let u=fz(l,"stepCount");if(u!==null)return u;let r=Jr(l);if(r!==null)return yz(r);return null}function OQ(...l){for(let u of l){let r=un(u);if(r!==null)return r}return null}function tz(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 iz(l){let u=k2(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=st(l)&&l?._traceSummaryLoaded!==!0&&un(l?.outputCount??l?.retainedOutputCount)===0,t=OQ(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(st(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 yz(l){let u=_u(l?.traceStats);if(!u||l?.statsSource!=="oa-event-flow"&&u.source!=="oa-event-flow")return null;return un(u.stepCount)}function m3(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=on(r),t=on(f);if(n!==null&&t!==null){if(n+10)return r;let f=String(l?.basePrompt||"");return f.length>0?f:pQ(l)}function ZQ(l){let u=Jr(l);return String(u?.finalResponse||l?.finalResponse||"").trimEnd()}function HQ(l){let r=Jr(l)?.lastJudge||l?.lastJudge;return r&&typeof r==="object"&&!Array.isArray(r)?r:null}function _u(l){return l&&typeof l==="object"&&!Array.isArray(l)?l:null}function cz(l){let u=_u(l?.raw),r=_u(l?.failureDetails)||_u(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 BQ({judge:l,testId:u="codex-judge-failure-details"}){let r=cz(l);if(r.length===0)return null;return G("details",{className:"codex-judge-failure-details","data-testid":u},G("summary",null,"MiniMax failure details"),G("pre",null,r))}function $z(l){let u=Jr(l)?.attempts;if(Array.isArray(u)&&u.length>0)return B2(l,H2(l,u));let r=zQ(l),f=ZQ(l),n=HQ(l);if(Object.keys(r).length===0&&f.length===0&&n===null)return B2(l,H2(l,[]));return B2(l,H2(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 K3(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 I2(l,u){return st(l)&&K3(l,u)}function H2(l,u){let r=Array.isArray(u)?u.filter(Boolean):[],f=Jr(l),n=Number(f?.currentAttempt||l?.currentAttempt||0);if(!st(l)||!Number.isFinite(n)||n<=0)return r;if(r.some((i)=>Number(i?.index)===n))return r;let t=M2(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 B2(l,u){let r=[...Array.isArray(u)?u:[]];if(!st(l))return r;return r.sort((f,n)=>{let t=Number(f?.index),i=Number(n?.index),y=K3(l,t)?0:1,c=K3(l,i)?0:1;if(y!==c)return y-c;return t-i})}function _z(l,u){return _u(u?.execution)||zQ(l)}function Az(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=M2(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 Fz(l,u){let r=String(u?.finalResponse||u?.finalResponsePreview||"");if(I2(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():ZQ(l)}function DQ(l,u,r=u?.index){if(I2(l,r))return null;if(Object.prototype.hasOwnProperty.call(u||{},"judge"))return _u(u?.judge);return HQ(l)}function jz(l,u,r){if(!PQ(l))return!1;if(a2(u,r))return!1;if(u?.finishedAt)return!1;if(["succeeded","failed","canceled"].includes(String(u?.terminalStatus||"")))return!1;if(K3(l,r))return!0;let f=Number(Jr(l)?.currentAttempt||l?.currentAttempt||0);if(Number.isFinite(f)&&f>0)return!1;return!0}function SQ(l){return`feedback:${String(l||"latest")}`}function Nz(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=DQ(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 Jz(l){let u=g2(l);return Boolean(u.hasReferenceInjection||Number(u.referencePromptChars||0)>0||l?.referenceInjection||l?.referenceInjectionSummary)}function VQ(l,u=null){if(u!==null&&u!==void 0){let f=(_u(l?._traceStepsByAttempt)||{})[String(u)];return Array.isArray(f)?f:[]}return Array.isArray(l?._traceSteps)?l._traceSteps:[]}function U1(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 Uz(l){return(Array.isArray(l)?l:[]).reduce((u,r)=>Math.max(u,U1(r)),0)}function Qz(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)=>U1(f)-U1(n))}function xi(l){return(Array.isArray(l?.summaryLines)?l.summaryLines:[]).map((u)=>String(u||""))}function mz(l){let u=String(l?.kind||"").trim().toLowerCase(),r=String(l?.status||"").trim().toLowerCase();return u==="error"||r==="error"}function E3(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 JQ(l){return/^item\/(?:started|completed): file changes status=/u.test(String(l||"").trim())}function wz(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=E3(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 qz(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 Lz(l){if(l.length<=1)return l[0];let u=l.find((t)=>E3(t)==="item/fileChange/outputDelta")||l.find((t)=>xi(t).some((i)=>!JQ(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&&!JQ(t)),n=l[l.length-1]||u;return{...u,at:u?.at||n?.at,title:String(u?.title||"Edited files"),status:wz(n),summaryLines:f.length>0?f:xi(u),rawSeqs:r}}function Gz(l){let u=Array.isArray(l)?l:[],r=[],f=[],n=()=>{if(f.length>0)r.push(Lz(f));f=[]};for(let t of u){if(qz(t)){if(E3(t)==="item/started"&&f.length>0)n();if(f.push(t),E3(t)==="item/completed")n();continue}n(),r.push(t)}return n(),r}function Wz(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 Tz(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:U1(r)||U1(u),at:r?.at||u?.at,summaryLines:t.length>0?[t.at(-1)||t[0]]:[],rawSeqs:n}}function Kz(l){let u=Array.isArray(l)?l:[],r=[],f=[],n="",t=()=>{if(f.length>0)r.push(Tz(f));f=[],n=""};for(let i of u){let y=Wz(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 Ez(l){return Kz(Gz(l))}function pz(l){return{...l}}function G3(l,u=null){if(u!==null&&u!==void 0){let r=_u(l?._traceStepsLoadedByAttempt)||{};return Boolean(r[String(u)])}return Boolean(l?._traceStepsLoaded)}function C2(l){return l?._traceStepDetails&&typeof l._traceStepDetails==="object"&&!Array.isArray(l._traceStepDetails)?l._traceStepDetails:{}}function zz(l,u){let r=Number(l?.index);return Number.isFinite(r)?r:u+1}function a2(l,u){return Boolean(l?.synthetic)||Number(u)<=0}function p3(l){let u=Number(l);return Number.isFinite(u)?String(u):void 0}function Oz(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 Ny(l){return String(l?.queueId||"default")}function YQ(l){return _u(l?.queuedReason)}function XQ(l){let u=String(l?.queuedReasonLabel||"").trim();if(u.length>0)return u.toUpperCase();let r=YQ(l),f=String(r?.label||"").trim();return f.length>0?f.toUpperCase():""}function Zz(l){let u=String(l?.status||"unknown");if(u!=="queued")return u;let r=XQ(l);return r.length>0?`QUEUED(${r})`:"QUEUED"}function Hz(l){if(String(l?.status||"")!=="queued")return;let u=YQ(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 Bz(l){return{system:"SYS",user:"YOU",assistant:"GPT",reasoning:"THINK",command:"CMD",diff:"DIFF",tool:"TOOL",error:"ERR"}[l]||l.toUpperCase()}function st(l){return["running","judging","retry_wait"].includes(String(l?.status||""))}function PQ(l){return String(l?.status||"")==="running"}function ef(l){return["succeeded","failed","canceled"].includes(String(l?.status||""))}function CQ(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 an(l){if(!ef(l))return!1;if(l?.terminalUnread===!0)return!0;if(l?.terminalUnread===!1)return!1;return!l?.readAt}function au(l){let u=Number(l||0);return Number.isFinite(u)?u:0}function Dz(l){return au(l.queued)+au(l.retry_wait)}function Sz(l){return au(l.running)+au(l.judging)}function Vz(l,u){return _u(l?.statistics)||_u(u?.statistics)||{}}function Yz(l){return Array.isArray(l?.daily)?l.daily:[]}function Xz(l){return _u(l?.totals)||{}}function o2(l,u){let r=Number(l?.[u]??0);return Number.isFinite(r)&&r>0?r:0}function D2(l,u){return l.reduce((r,f)=>Math.max(r,o2(f,u)),0)}var hi=700,UQ=220,Ct=30,Fy=24,J1=184,h2=J1-Fy;function hQ(l,u){if(u<=1)return hi/2;return Ct+l*(hi-Ct*2)/(u-1)}function sQ(l,u){let r=u>0?u:1;return J1-Math.min(1,l/r)*h2}function S2(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)=>`${hQ(i,n.length).toFixed(2)},${sQ(o2(t,u),r).toFixed(2)}`).join(" ")}function In(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 Pz(l,u,r,f){let n=o2(l,f.key);return{...f,row:l,index:u,value:n,valueLabel:f.format(n),x:hQ(u,r),y:sQ(n,f.max),seriesKey:f.key}}function QQ(l){if(an(l))return 0;return{running:1,judging:2,retry_wait:3,queued:4,succeeded:8,failed:8,canceled:8}[String(l?.status||"")]??9}function _1(l){if(!l)return!1;if(l?._traceSummaryLoaded===!0)return!1;return l?.summaryOnly===!0||l?._metaLoaded!==!0}function Cz(l){return Boolean(l?._metaLoaded)||l?.summaryOnly===!1}function hz(l,u,r){let f=String(l?.[r]||""),n=String(u?.[r]||"");return f.length>n.length?f:n}function s2(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 mQ(l,u){let r=u?.summaryOnly===!0&&Cz(l),f={...l,...u};if(!r)return f;for(let n of["prompt","basePrompt","displayPrompt","finalResponse"])f[n]=hz(l,u,n);for(let n of["promptHistory","attempts","output","events"])f[n]=s2(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 wQ(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=Vu(l)[0];return f?{...f,_summaryLoaded:!0}:null}function V2(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 A1(l){return(Array.isArray(l)?l:[]).reduce((u,r)=>Math.max(u,Number(r?.seq??0)),0)}function qQ(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 sz(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 Mz(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:d2(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 Rz(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 j1(l,u,r){if(u!=="windows-native")return d2(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 d2(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 xz(l,u,r){return String(l?.providerId||"")===String(u||"")&&String(l?.executionMode||"default")===String(r||"default")&&String(l?.path||"").trim().length>0}function bz(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(j1(l,f,r),"default");for(let c of Array.isArray(u)?u:[])if(xz(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 vz({task:l,selected:u,onSelect:r,onCopy:f,onReference:n,onMarkRead:t,copied:i,markingRead:y}){let c=l?.lastJudge||{},_=String(l?.id||""),A=an(l),F=M2(l?.updatedAt,Jr(l)?.updatedAt),j=`最近更新: ${N1(F)}`,J=iz(l),U=J.title;return G("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?G("span",{className:"codex-unread-badge",title:"待读","aria-label":"待读","data-testid":`codex-unread-task-${_||"unknown"}`}):null,G("div",{className:"codex-task-card-head"},G("div",{className:"codex-task-status-line"},G(Mi,{status:l?.status,title:Hz(l)},Zz(l))),G("span",{className:"mono-text"},`${l?.currentAttempt||0}/${l?.maxAttempts||0}`)),G("div",{className:"codex-task-id-row"},G("code",{title:_},_||"unknown"),G("div",{className:"codex-task-id-actions"},G("button",{type:"button",className:"codex-copy-id-btn",onClick:(w)=>{w.stopPropagation(),n(_)},"data-testid":`codex-reference-task-${_||"unknown"}`},"引用"),G("button",{type:"button",className:"codex-copy-id-btn",onClick:(w)=>{w.stopPropagation(),f(_)},"data-testid":`codex-copy-task-id-${_||"unknown"}`},i?"已复制":"复制ID"),A?G("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)),G("strong",null,W3(pQ(l,{preview:!0}),120)||"空任务"),G("div",{className:"codex-task-meta"},G("span",null,`queue=${Ny(l)}`),G("span",null,`provider=${l?.providerId||"D601"}`),G("span",null,`mode=${l?.executionMode||"default"}`),G("span",null,l?.model||"--"),G("span",null,Oz(l))),G("div",{className:"codex-task-meta codex-task-update-meta"},G("span",{className:`codex-task-recent-update codex-task-step-count ${J.state}`,title:U,"data-testid":`codex-task-step-count-${_||"unknown"}`,"data-step-state":J.state,"data-step-source":J.source},tz(J)),G("span",{className:"codex-task-recent-update",title:F?`更新时间: ${Gl(F)}`:j,"data-testid":`codex-task-recent-update-${_||"unknown"}`},j),G("span",null,Gl(F||l?.updatedAt))),CQ(l)?G("div",{className:"codex-judge-line","data-testid":`codex-task-prompt-editable-${_||"unknown"}`},"queued prompt 可编辑"):null,c?.decision?G("div",{className:"codex-judge-line"},`judge=${c.decision} ${Math.round(Number(c.confidence||0)*100)}%`):null)}function Y2({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 G("section",{className:"codex-task-section"},G("div",{className:"codex-task-section-head"},G("span",null,l),G("code",null,String(A.length))),A.length===0?G("p",{className:"codex-task-section-empty"},_):G("div",{className:"codex-task-section-list"},A.map((F)=>G(vz,{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 gz(){return G("span",{className:"codex-stats-icon","aria-hidden":"true"},G("svg",{viewBox:"0 0 36 24",focusable:"false"},G("path",{className:"grid",d:"M3 20.5H33M3 12.5H33M3 4.5H33"}),G("polyline",{className:"line tasks",points:"3,18 9,14 15,15 21,8 27,10 33,4"}),G("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 G("div",{className:`codex-liveness-metric ${f||""}`},G("span",null,l),G("strong",null,u??"--"),r?G("code",null,r):null)}function kz({diagnostics:l,queue:u,onRaw:r}){let f=String(l?.state||l?.health||"unknown"),n=_u(l?.oaPublisher),t=or(l?.reasons).slice(0,3),i=b2(l),y=TQ(l),c=KQ(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=Xp(l),j=y?"split-brain live":f;return G(Ci,{title:"执行活性",eyebrow:`${String(l?.executionStateSource||u?.executionStateSource||"unknown")} / ${String(l?.controlPlane||"code-queue")}`,summary:G("div",{className:"codex-trace-status"},G("span",{className:`codex-trace-status-chip liveness ${F}`},G("b",null,"状态"),j),G("span",{className:`codex-trace-status-chip liveness ${F}`},G("b",null,"liveness"),c),G("span",{className:"codex-trace-status-chip"},G("b",null,"DB active"),String(l?.databaseActiveTaskCount??u?.databaseActiveTaskCount??0)),G("span",{className:"codex-trace-status-chip"},G("b",null,"scheduler slots"),String(l?.schedulerActiveRunSlotCount??u?.activeRunSlotCount??0)),G("span",{className:"codex-trace-status-chip"},G("b",null,"heartbeat"),`${or(l?.heartbeatFreshTaskIds).length} fresh / ${or(l?.heartbeatExpiredTaskIds).length} expired`),n?G("span",{className:"codex-trace-status-chip"},G("b",null,"OA"),`${Number(n.pending||0)} pending${n.lastError?" / error":""}`):null),actions:G(R2,{title:"Code Queue Execution Diagnostics",data:l,onOpen:r,testId:"raw-code-queue-execution-diagnostics"}),className:"codex-liveness-panel"},G("div",{className:"codex-liveness-grid","data-testid":"codex-liveness-diagnostics"},G(Df,{tone:F,label:"健康状态",value:j,hint:_}),G(Df,{tone:F,label:"Effective liveness",value:c,hint:A}),G(Df,{label:"PostgreSQL active",value:String(l?.databaseActiveTaskCount??u?.databaseActiveTaskCount??0),hint:_y(l?.databaseActiveTaskIds??u?.databaseActiveTaskIds)}),G(Df,{label:"Scheduler active",value:String(l?.schedulerActiveRunSlotCount??u?.activeRunSlotCount??0),hint:_y(l?.schedulerActiveTaskIds??u?.activeTaskIds)}),G(Df,{label:"Fresh heartbeat",value:String(or(l?.heartbeatFreshTaskIds).length),hint:_y(l?.heartbeatFreshTaskIds)}),G(Df,{tone:i.length>0?"failed":y?"warn":"",label:"Heartbeat risk",value:String(i.length),hint:i.length>0?_y(i):y?"fresh heartbeat: keep supervising":"--"}),G(Df,{tone:or(l?.traceGapNotStaleTaskIds).length>0?"warn":"",label:"Trace gap",value:String(or(l?.traceGapTaskIds).length),hint:_y(l?.traceGapNotStaleTaskIds)}),G(Df,{tone:or(l?.staleRecoveryCandidateTaskIds).length>0?"failed":"",label:"Stale candidates",value:String(or(l?.staleRecoveryCandidateTaskIds).length),hint:_y(l?.staleRecoveryCandidateTaskIds)}),G(Df,{label:"Last scheduler heartbeat",value:N1(l?.lastSchedulerHeartbeatAt),hint:String(l?.lastSchedulerHeartbeatAt||"--")}),G(Df,{label:"Last agent event",value:N1(l?.lastObservedAgentEventAt),hint:String(l?.lastObservedAgentEventAt||"--")}),G(Df,{label:"Last trace persist",value:N1(l?.lastPersistedTraceAt),hint:String(l?.lastPersistedTraceAt||"--")}),G(Df,{tone:n?.lastError?"warn":"",label:"OA publisher",value:`${Number(n?.pending||0)} pending`,hint:n?.lastError?W3(n.lastError,90):"ok"})),G("div",{className:`codex-liveness-advisory ${F}`},G("b",null,y?"Observing split":i.length>0?"Heartbeat risk":"Liveness note"),G("span",null,A)),t.length>0?G("div",{className:"codex-liveness-reasons"},t.map((J)=>G("span",{key:J},J))):null)}function Iz({stats:l,queueName:u,onRaw:r}){let f=Yz(l),n=Xz(l),t=f.at(-1)||{},i=D2(f,"executedTasks"),y=D2(f,"retryAttempts"),c=D2(f,"avgDurationMs"),_=f.length>0,A=_u(l?.range)||{},[F,j]=Il(null),[J,U]=Il(null),w=[];if(i>0)w.push(`tasks ${i}`);if(y>0)w.push(`retry ${y}`);if(c>0)w.push(`avg ${ln(c)}`);let L=[{key:"executedTasks",className:"tasks",label:"执行任务",max:i,format:(z)=>`${au(z)} tasks`},{key:"retryAttempts",className:"retry",label:"重试次数",max:y,format:(z)=>`${au(z)} retries`},{key:"avgDurationMs",className:"duration",label:"平均耗时",max:c,format:(z)=>ln(z)}],N=F||J,Q=w3(N),m=String(N?.row?.date||""),q=N?{left:`${Math.max(8,Math.min(92,Number(N.x)/hi*100))}%`,top:`${Math.max(14,Math.min(86,Number(N.y)/UQ*100))}%`}:void 0;Wn(()=>{j(null),U(null)},[u,A.startDate,A.endDate,f.length]);let W=(z)=>{j(z)},p=(z)=>{let B=w3(z);U((Y)=>w3(Y)===B?null:z),j(z)},O=L.flatMap((z)=>f.map((B,Y)=>{let H=Pz(B,Y,f.length,z),D=w3(H),P=Q===D,E=String(B?.date||`day-${Y}`),S=`${In(E)} ${z.label}: ${H.valueLabel}`;return G("g",{key:`${z.key}-${E}`,className:`stat-point-group ${z.className} ${P?"active":""}`,role:"button",tabIndex:0,"aria-label":S,"data-testid":`codex-stats-point-${z.className}-${E}`,onMouseEnter:()=>W(H),onFocus:()=>W(H),onClick:()=>p(H),onKeyDown:(V)=>{if(V.key==="Enter"||V.key===" ")V.preventDefault(),p(H)}},G("circle",{className:"stat-hit-point",cx:H.x,cy:H.y,r:13}),G("circle",{className:`stat-point ${z.className} ${P?"active":""}`,cx:H.x,cy:H.y,r:P?5.6:4.2}))}));return G(Ci,{title:"统计曲线",eyebrow:`Daily task stats / ${u}`,className:"codex-stats-panel",summary:G("span",null,`${In(A.startDate)} -> ${In(A.endDate)} · ${l?.timezone||"Asia/Shanghai"}`),actions:_u(l)?G(R2,{title:"Code Queue Stats",data:l,onOpen:r,testId:"raw-codex-stats"}):null},G("div",{className:"codex-stats-hero","data-testid":"codex-stats-panel"},G(gz),G("div",null,G("strong",null,`${au(n.executedTasks)} tasks / ${au(n.retryAttempts)} retries`),G("span",null,`平均完成耗时 ${ln(n.avgDurationMs??void 0)} · 终态 ${au(n.completedTasks)} 个`))),_?G("div",{className:"codex-stats-chart","data-testid":"codex-stats-chart",onMouseLeave:()=>j(null)},G("svg",{viewBox:`0 0 ${hi} ${UQ}`,preserveAspectRatio:"none",role:"img","aria-label":"Code Queue daily task statistics"},G("line",{className:"axis",x1:Ct,x2:hi-Ct,y1:J1,y2:J1}),G("line",{className:"grid",x1:Ct,x2:hi-Ct,y1:Fy+h2/2,y2:Fy+h2/2}),G("line",{className:"grid",x1:Ct,x2:hi-Ct,y1:Fy,y2:Fy}),G("polyline",{className:"stat-line tasks",points:S2(f,"executedTasks",i)}),G("polyline",{className:"stat-line retry",points:S2(f,"retryAttempts",y)}),G("polyline",{className:"stat-line duration",points:S2(f,"avgDurationMs",c)}),N?G("g",{className:"stat-cursor-layer","data-testid":"codex-stats-active-point"},G("line",{className:"stat-cursor",x1:N.x,x2:N.x,y1:Fy,y2:J1}),G("circle",{className:`stat-point-active ${N.className}`,cx:N.x,cy:N.y,r:8})):null,G("g",{className:"stat-point-layer"},O)),N?G("div",{className:"codex-stats-tooltip active",style:q,"data-testid":"codex-stats-tooltip"},G("b",null,In(N.row?.date)),G("span",null,`${N.label} · ${N.valueLabel}`),G("code",null,`${au(N.row?.executedTasks)} exec / ${au(N.row?.retryAttempts)} retry / ${ln(N.row?.avgDurationMs??void 0)}`)):null,G("div",{className:"codex-stats-legend"},G("span",{className:"tasks"},"执行任务"),G("span",{className:"retry"},"重试次数"),G("span",{className:"duration"},"平均耗时")),G("div",{className:"codex-stats-scale"},G("span",null,In(f[0]?.date)),G("span",null,w.join(" · ")||"暂无峰值"),G("span",null,In(f.at(-1)?.date))),G("div",{className:`codex-stats-focus ${N?"active":""}`,"data-testid":"codex-stats-focus"},N?G(Q1.default.Fragment,null,G("div",null,G("strong",null,In(N.row?.date)),G("span",null,`${N.label} · ${N.valueLabel}`)),G("div",{className:"codex-stats-focus-metrics"},G("code",null,`${au(N.row?.executedTasks)} exec`),G("code",null,`${au(N.row?.retryAttempts)} retry`),G("code",null,ln(N.row?.avgDurationMs??void 0)))):G("span",null,"将鼠标悬停到曲线数据点查看明细,点击数据点可固定。"))):G(Ri,{title:"暂无统计",text:"任务开始执行后会生成按天汇总的曲线。"}),G("div",{className:"codex-stats-summary-grid"},G("article",null,G("span",null,"今日执行"),G("strong",null,String(au(t.executedTasks))),G("code",null,In(t.date))),G("article",null,G("span",null,"今日重试"),G("strong",null,String(au(t.retryAttempts))),G("code",null,`累计 ${au(n.retryAttempts)}`)),G("article",null,G("span",null,"平均耗时"),G("strong",null,ln(n.avgDurationMs??void 0)),G("code",null,`${au(n.durationSamples)} samples`))),G("div",{className:"codex-stats-daily-list","data-testid":"codex-stats-daily-list"},f.slice(-7).map((z)=>G("div",{key:String(z?.date||""),className:`codex-stats-daily-row ${m===String(z?.date||"")?"active":""}`,"data-testid":`codex-stats-day-${String(z?.date||"unknown")}`},G("span",null,In(z?.date)),G("b",null,`${au(z?.executedTasks)} exec`),G("b",null,`${au(z?.retryAttempts)} retry`),G("code",null,ln(z?.avgDurationMs??void 0))))))}function az({task:l,queueRows:u,busy:r,onMove:f}){let n=String(l?.id||""),t=Ny(l),[i,y]=Il(t);Wn(()=>{y(t)},[n,t]);let c=!n||r||["running","judging","retry_wait"].includes(String(l?.status||""));return G("div",{className:"codex-task-move-control","data-testid":"codex-task-queue-move-control"},G("label",null,"任务 queue",G("select",{value:i,disabled:!n||r,onChange:(_)=>y(String(_.target.value||t)),"data-testid":"codex-task-queue-move-select"},u.map((_)=>G("option",{key:String(_?.id||""),value:String(_?.id||"")},F1(_))))),G("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 LQ(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 oz({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=g2(l),y=T3(l),c=L3(l).trimEnd(),_=String(y.full?.text||""),A=Jz(l),F=Number(i.promptChars||l?.promptChars||_.length),j=Number(i.basePromptLines||si(c)),J=Number(i.promptLines||si(_));return G("section",{className:"codex-progressive-card codex-progressive-prompt","data-testid":"codex-progressive-prompt"},G("div",{className:"codex-progressive-card-head"},G("span",{className:"codex-output-channel"},"Prompt"),G("strong",null,"Submitted prompt / 原始用户 prompt"),G("code",null,`${j||si(c)} lines / ${c.length} chars`)),G("pre",{className:"codex-prompt-full","data-testid":t},c||"空 prompt"),A?G("details",{className:"codex-reference-injection codex-progressive-full-prompt","data-testid":f,onToggle:(U)=>{if(U.currentTarget?.open&&!_)r?.("full")}},G("summary",null,G("span",null,"引用注入已折叠,点击按需拉取最终进入 Code agent 的完整 prompt"),G("code",null,_?`${J||si(_)} lines / ${_.length} chars`:`${Number.isFinite(F)&&F>0?F:"--"} chars`)),G("pre",{className:"codex-prompt-full codex-prompt-final-full","data-testid":n},_||(u?"正在按需拉取完整 prompt...":"展开后将只请求 full prompt,不拉取完整 transcript。"))):null)}function MQ({task:l,attempt:u,attemptIndex:r,loading:f,onLoadSteps:n,onLoadStep:t,testId:i="codex-execution-summary"}){let y=Ez(VQ(l,r)),c=pz(_z(l,u)),_=u?rz(l,u):k2(l),A=C2(l),F=G3(l,r),j=un(_?.errorCount),J=OQ(y.length>0?y.length:null,u?.stepCount,u?.execution?.stepCount,c.traceLineCount,c.stepCount,u?.outputCount),U=un(_?.stepCount??_?.llmStepCount),w=U??J,L=un(_?.readCount),N=un(_?.editCount),Q=un(_?.runCount),m=U??J,q=U!==null?"oa-event-flow":J!==null?"raw-trace":st(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:[],B=Array.isArray(c.commands)?c.commands:[],H=a2(u,r)?` · ${String(u?.label||"recovered thread execution")}`:r?` #${r}`:"",D=Az(l,u,r,c),P=`最近更新: ${N1(D)}`,E=jz(l,u,r);return G("details",{className:`codex-progressive-card codex-execution-summary ${E?"running":""}`,"data-testid":i,"data-attempt-index":p3(r),"data-running":E?"true":"false",onToggle:(S)=>{if(S.currentTarget?.open&&!F)n?.(r)}},G("summary",null,G("div",{className:"codex-progressive-card-head"},G("span",{className:"codex-output-channel"},"Summary"),G("strong",null,`执行过程摘要${H}`),E?G("span",{className:"codex-summary-running-pill","data-testid":`${i}-running`},"执行中"):null,G("code",{title:`${D?`最近更新: ${Gl(D)}`:P};${O}`},`${ln(c.durationMs??c.totalElapsedMs)} / ${W} tools / ${P}`)),G("div",{className:"codex-execution-digest"},G("span",{title:"来自 OA Event Flow 统计中心"},`read ${L===null?"--":L}`),G("span",{title:"来自 OA Event Flow 统计中心"},`edit ${N===null?"--":N}`),G("span",{title:"来自 OA Event Flow 统计中心"},`run ${Q===null?"--":Q}`),G("span",{title:O,"data-testid":`${i}-step-count`,"data-step-state":q},`STEP ${p}`),j!==null&&j>0?G("span",{className:"codex-execution-error-pill","data-testid":`${i}-error-count`},`Error ${j}`):null)),G("div",{className:"codex-execution-digest expanded"},G("span",null,`修改文件:${LQ(z,6)}`),G("span",null,`执行命令:${LQ(B,4)}`)),y.length===0?G("div",{className:"codex-output-empty"},f?"正在按需拉取步骤 summary...":"展开后将只请求执行步骤 summary,不拉取单步骤全量。"):G("div",{className:"codex-trace-step-list"},y.map((S)=>{let V=String(S?.seq??""),v=A[V],K=Array.isArray(S?.summaryLines)?S.summaryLines.slice(0,4):[],X=K.find((I)=>String(I||"").trim().length>0);return G("details",{key:V||`${S?.title}-${S?.at}`,className:`codex-trace-step ${String(S?.kind||"message")} ${mz(S)?"error":""}`,"data-testid":`codex-trace-step-${V||"unknown"}`,onToggle:(I)=>{if(I.currentTarget?.open&&!v)t?.(S?.seq)}},G("summary",null,G("span",{className:"codex-output-channel"},dz(S?.kind)),G("strong",null,String(S?.title||"Trace step")),S?.status?G("code",null,String(S.status)):null,X?G("span",{className:"codex-trace-step-inline-summary",title:String(X)},String(X)):null,G("time",null,Gl(S?.at))),G("div",{className:"codex-trace-step-summary"},K.length>0?K.map((I,a)=>G("pre",{key:`${V}-${a}`},String(I||""))):G("span",null,"无 summary")),v?.line?G(J3,{items:[v.line],autoScroll:!1,loading:!1,hasDetail:!0,emptyText:"无步骤详情",testId:`codex-trace-step-detail-${V||"unknown"}`,className:"codex-transcript codex-step-detail-transcript",collapseTools:!1}):G("div",{className:"codex-output-empty"},f?"正在按需拉取这个步骤的全量数据...":"展开后将只请求这个单步骤的全量数据。"))})))}function dz(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 RQ({task:l,attempt:u,attemptIndex:r,testId:f="codex-final-response"}){let n=Fz(l,u);if(n.length===0)return null;let t=Number(u?.finalResponseChars||n.length),i=r?` #${r}`:"";return G("section",{className:"codex-progressive-card codex-final-response","data-testid":f,"data-attempt-index":p3(r)},G("div",{className:"codex-progressive-card-head"},G("span",{className:"codex-output-channel"},"Final"),G("strong",null,`最终 response${i}`),G("code",null,`${Number.isFinite(t)?t:n.length} chars`)),G(y1,{markdown:n,className:"codex-transcript-body codex-markdown",testId:`${f}-markdown`}))}function xQ({task:l,attempt:u,attemptIndex:r,testId:f="codex-progressive-judge"}){let n=DQ(l,u,r);if(!n?.decision)return null;let t=r?` #${r}`:"";return G("section",{className:"codex-progressive-card codex-progressive-judge","data-testid":f,"data-attempt-index":p3(r)},G("div",{className:"codex-progressive-card-head"},G("span",{className:"codex-output-channel"},"Judge"),G("strong",null,`完成判定${t}`),G("code",null,`${n.decision} ${Math.round(Number(n.confidence||0)*100)}%`)),G("div",{className:"codex-judge-card","data-testid":`${f}-card`},G(Mi,{status:n.decision},n.decision),G("strong",null,`${Math.round(Number(n.confidence||0)*100)}% confidence`),G("p",{"data-testid":`${f}-reason`},n.reason||"--"),G(BQ,{judge:n,testId:`${f}-failure-details`}),n.continuePrompt?G("pre",{"data-testid":`${f}-continue-prompt`},String(n.continuePrompt||"")):null))}function ez({task:l,attempt:u,attemptIndex:r,loading:f,onLoadPromptPart:n,testId:t="codex-judge-feedback-prompt"}){let i=Nz(l,u,r);if(i===null)return null;let y=SQ(r),_=T3(l)[y],A=String(_?.text||"").trimEnd(),F=String(i.preview||i.text||"").trimEnd(),j=A||String(i.text||"").trimEnd(),J=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 G("details",{className:"codex-progressive-card codex-judge-feedback-prompt","data-testid":t,"data-attempt-index":p3(r),onToggle:(L)=>{if(L.currentTarget?.open&&!A)n?.("feedback",r)}},G("summary",null,G("div",{className:"codex-progressive-card-head"},G("span",{className:"codex-output-channel"},"Prompt"),G("strong",null,`judge feedback prompt #${r} -> #${w}`),G("code",null,`${U||"--"} lines / ${Number.isFinite(J)?J:F.length} chars`)),G("p",{className:"codex-feedback-preview","data-testid":`${t}-preview`},F||"展开后按需拉取 judge feedback prompt。")),G("pre",{className:"codex-prompt-full codex-feedback-full","data-testid":`${t}-text`},j||(f?"正在按需拉取 judge feedback prompt...":"展开后将只请求这一次 judge feedback prompt。")))}function lO({task:l,attempt:u,position:r,loading:f,onLoadPromptPart:n,onLoadSteps:t,onLoadStep:i}){let y=zz(u,r),c=I2(l,y),_=r===0&&!c,A=a2(u,y),F=A?String(u?.label||"Recovered thread execution"):`Attempt ${y}`;return G("section",{className:"codex-attempt-cycle","data-testid":`codex-attempt-cycle-${y}`},G("div",{className:"codex-attempt-cycle-head"},G("span",{className:"codex-output-channel"},F),G("strong",null,String(u?.mode||(y<=1?"initial":"retry"))),u?.terminalStatus?G(Mi,{status:u.terminalStatus},u.terminalStatus):null,G("code",null,`${Gl(u?.startedAt)} -> ${Gl(u?.finishedAt)}`)),G(MQ,{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:G(RQ,{task:l,attempt:u,attemptIndex:y,testId:c?"codex-final-response-current":_?"codex-final-response":`codex-final-response-attempt-${y}`}),A?null:G(xQ,{task:l,attempt:u,attemptIndex:y,testId:c?"codex-progressive-judge-current":_?"codex-progressive-judge":`codex-progressive-judge-attempt-${y}`}),A?null:G(ez,{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 uO({task:l,loading:u,onLoadPromptPart:r,onLoadSteps:f,onLoadStep:n}){if(!l)return G(Ri,{title:"未选择任务",text:"从左侧队列选择任务,或提交新 Codex 任务。"});let t=$z(l);return G("div",{className:"codex-transcript codex-progressive-trace","data-testid":"codex-output"},u&&!Jr(l)?G("div",{className:"codex-output-empty"},"正在加载 Trace Summary..."):null,G(oz,{task:l,loading:u,onLoadPromptPart:r}),t.length>0?t.map((i,y)=>G(lO,{key:`${i?.index||y+1}-${i?.startedAt||y}`,task:l,attempt:i,position:y,loading:u,onLoadPromptPart:r,onLoadSteps:f,onLoadStep:n})):[G(MQ,{key:"execution",task:l,loading:u,onLoadSteps:f,onLoadStep:n}),G(RQ,{key:"final",task:l}),G(xQ,{key:"judge",task:l})])}function rO({task:l}){let u=ap(l);if(!l||u.length===0)return G(Ri,{title:"暂无原始消息",text:"原始 Codex app-server 消息会保留在任务 JSON 中。"});return G("details",{className:"codex-raw-output"},G("summary",null,`原始 messages (${u.length})`),G("div",null,u.map((r)=>G("article",{key:`${r.seq}-${r.channel}`,className:`codex-output-line ${r.channel||"system"}`},G("div",{className:"codex-output-meta"},G("span",{className:"codex-output-channel"},Bz(String(r.channel||"system"))),G("span",null,Gl(r.at)),r.method?G("code",null,r.method):null),G("pre",null,String(r.text||""))))))}function fO({task:l}){let u=op(l).slice().reverse();if(u.length===0)return G(Ri,{title:"尚无 attempt",text:"任务开始运行后,这里会记录 Codex 终态、传输中断和 stderr tail。"});return G("div",{className:"table-wrap codex-attempt-table"},G("table",null,G("thead",null,G("tr",null,G("th",null,"#"),G("th",null,"模式"),G("th",null,"终态"),G("th",null,"传输"),G("th",null,"退出"),G("th",null,"完成时间"))),G("tbody",null,u.map((r)=>G("tr",{key:`${r.index}-${r.startedAt}`},G("td",null,r.index),G("td",null,r.mode),G("td",null,G(Mi,{status:r.terminalStatus||"unknown"},r.terminalStatus||"unknown")),G("td",null,r.transportClosedBeforeTerminal?G(Mi,{status:"failed"},"closed-before-terminal"):G(Mi,{status:"succeeded"},"normal")),G("td",null,`code=${r.appServerExitCode??"--"} signal=${r.appServerSignal??"--"}`),G("td",null,Gl(r.finishedAt)))))))}function bQ({microservices:l,onRaw:u,apiBaseUrl:r="/api",initialTasksData:f=null,standalone:n=!1}){let t=l.find((Z)=>Z.id==="code-queue")||null,i=wQ(f),y=String(i?.id||""),c=new Map;if(i!==null&&y.length>0)c.set(y,{task:i,maxSeq:A1(Array.isArray(i.transcript)?i.transcript:[]),complete:Boolean(i._transcriptComplete),completeUpdatedAt:i._transcriptComplete?String(i.updatedAt||""):""});let _=typeof performance>"u"?0:performance.now(),A=Ru(y),F=Ru(0),j=Ru(0),J=Ru(0),U=Ru(!1),w=Ru(!1),L=Ru(!1),N=Ru(null),Q=Ru(new Map),m=Ru(new Map),q=Ru(new Map),W=Ru(new Map),p=Ru(new Set),O=Ru(null),z=Ru(null),B=Ru(!1),Y=Ru(!1),H=Ru(Boolean(f)),D=Ru(new Map),P=Ru(new Set),E=Ru(c),S=Ru(f),[V,v]=Il(null),[K,X]=Il(f),[I,a]=Il(y),[R,nl]=Il(i),[d,h]=Il(!1),[rl,_l]=Il(""),[Al,Ll]=Il(null),[Ql,pl]=Il(!1),[s,e]=Il(!1),fl=f?.queue||{},k=String(fl?.mainProviderId||fl?.defaultProviderId||"D601").trim()||"D601",[g,yl]=Il(""),[Tl,Zl]=Il(""),[vl,nu]=Il("default"),[hl,wu]=Il(ht),[mr,Or]=Il(!1),[_r,tr]=Il(""),[ir,Rr]=Il(k),[Nl,ol]=Il("default"),[wr,sl]=Il("gpt-5.5"),[Cu,eu]=Il(j1(fl,"default",k)||"/workspace"),[tf,Ar]=Il(99),[Zr,Vn]=Il(1),[yf,ct]=Il(!1),[Fu,A0]=Il(!1),[tl,Dl]=Il(""),[Cl,dl]=Il(""),[Nu,gu]=Il(""),[Au,qr]=Il(!0),[hf,oy]=Il(()=>typeof window>"u"?!0:window.matchMedia(Cp).matches),[Tu,W$]=Il(!1),[K8,ju]=Il(""),[Uj,hu]=Il(""),{addNotification:Hr}=Xr(),[F0,dy]=Il(""),[j0,T$]=Il(""),[ey,K$]=Il(!1),[E$,Ai]=Il(null),[N0,Fi]=Il(!1),[xr,Wf]=Il(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||_1(i)),completedAt:new Date}:null),[p$,J0]=Il(f?new Date:null),[lc,z$]=Il(!1),$n=An(Vu(K)),uc=$n.filter(an),zu=K?.queue||V?.body?.queue||V?.queue||{},E8=Yp(zu,V),p8=Vz(K,zu),O$=Ln(K),sf=$Q(zu,vl),ji=String(vl||"default").trim()||"default",Ni=sf.filter((Z)=>String(Z?.id||"")!==ji),U0=jy(sf,hl),$t=Number((Cr(hl)?zu?.total:U0?.total)??O$.total??$n.length),rc=Ay(zu),z8=Cr(hl)?rc:[String(jy(sf,hl)?.activeTaskId||"")].filter(Boolean),Ji=_Q(zu,sf,hl,$n),Qj=Cr(hl)?Z2(zu):Z2(U0||{}),Q0=Z2(zu),O8=Dz(Q0),Z8=Math.max(Sz(Q0),rc.length),Z$=au((Cr(hl)?zu?.unreadTerminal:U0?.unreadTerminal)??uc.length),m0=K?uc.length:Z$,H$=Cr(hl)?"All queues":P2(U0||{id:hl,name:hl}),w0=X2(rl),cf=w0.length>0,mj=cf?An(Vu(Al)):[],H8=Ln(Al),_n=cf?mj:$n,wj=_n.filter(an),nW=_n.filter((Z)=>!ef(Z)).sort(Sp),tW=_n.filter((Z)=>ef(Z)&&!an(Z)),qj=cf?H8:O$,q0=cf?Number(H8.total??mj.length):$t,Lj=qj.hasMore===!0&&String(qj.nextBeforeId||"").length>0,B8=cf?s:lc,iW=t?Hp(t):{},yW=t?Bp(t):{},D8=iQ(()=>dp(g),[g]),Yn=iQ(()=>{let Z=jQ(Zr);return D8.flatMap((C)=>Array.from({length:Z},()=>ep(C,Tl)))},[D8,Zr,Tl]),fc=Yn.length,Gj=fc>1&&!yf,cW=Fu||Tu||fc===0||Gj,Wj=sz(zu,wr),B$=Mz(zu,ir),Tj=Rz(zu,Nl),Kj=j1(zu,Nl,ir),$W=Array.isArray(E$?.workdirs)?E$.workdirs:[],Ej=bz(zu,$W,ir,Nl,Cu),S8=Ej.some((Z)=>Z.source==="saved"&&Jy(Z.path)===Jy(Cu)),V8=R?.id&&R?.activeTurnId&&String(R?.status)==="running",_W=R?.id&&!["succeeded","failed","canceled"].includes(String(R?.status||"")),AW=R?.id&&["succeeded","failed","canceled"].includes(String(R?.status||"")),L0=R?.id&&CQ(R);function br(Z){let C=typeof Z==="function"?Z(S.current):Z;return S.current=C,X(C),C}function FW(Z,C,o=!0){let ul=Array.from(new Set(Z.map((jl)=>String(jl||"")).filter(Boolean)));for(let jl of ul)if(D.current.set(jl,C),o)P.current.add(jl);return ul}function pj(Z){for(let C of Z.map((o)=>String(o||"")).filter(Boolean))D.current.delete(C),P.current.delete(C)}function D$(Z){let C=String(Z?.id||""),o=C?D.current.get(C):void 0;if(!o)return Z;if(String(Z?.status||"").length>0&&!ef(Z))return D.current.delete(C),P.current.delete(C),Z;return{...Z,readAt:Z?.readAt||o,terminalUnread:!1}}function Y8(Z){let C=String(Z?.id||"");return C.length>0&&P.current.has(C)&&ef(Z)}function An(Z,C=!0){let o=[];for(let ul of Array.isArray(Z)?Z:[]){let jl=D$(ul);if(C&&Y8(jl))continue;o.push(jl)}return o}function jW(Z,C=!0){if(!Z||!Array.isArray(Z?.tasks))return Z;let o=An(Vu(Z),C),ul=Ln(Z);return{...Z,tasks:o,pagination:Z.pagination?{...ul,returned:o.length}:Z.pagination}}function X8(Z,C){return Cr(C)||Ny(Z)===C}function P8(Z){let C=w0.toLowerCase();if(C.length===0)return!0;return[Z?.id,Z?.status,Z?.queueId,Z?.providerId,Z?.model,Z?.cwd,Z?.displayPrompt,Z?.basePrompt,Z?.prompt,q3(Z?.displayPromptPreview),q3(Z?.basePromptPreview),q3(Z?.promptPreview),Z?.finalResponse,Z?.lastError?.message].map((ul)=>String(ul||"").toLowerCase()).join(` +`).includes(C)}function NW(Z,C){let o=Z.filter((Hl)=>String(Hl?.id||"").length>0);if(o.length===0&&!C)return;let ul=o[0]||null,jl=String(ul?.id||""),Kl=o.filter((Hl)=>X8(Hl,hl)),Wl=Kl.filter(P8),Rl=String(C?.activeTaskId||Ay(C)[0]||jl||Ji||"");for(let Hl of o){let Yl=String(Hl?.id||"");if(!Yl)continue;let xl=Array.isArray(Hl?.transcript)?Hl.transcript:[];E.current.set(Yl,{...E.current.get(Yl)||{},task:{...Hl,_summaryLoaded:!0,_detailLoaded:xl.length>0,_transcriptComplete:!1,_transcriptPreview:!1},maxSeq:A1(xl),complete:!1,completeUpdatedAt:""})}if(br((Hl)=>{if(!Hl&&(Kl.length===0||!C))return Hl;let Yl=Vu(Hl),xl=An(Gn([Yl,Kl],Rl));return{...Hl||{},queue:C||Hl?.queue,tasks:xl,pagination:Hl?.pagination?{...Ln(Hl),returned:xl.length}:Hl?.pagination}}),cf)Ll((Hl)=>{if(!Hl||Wl.length===0)return Hl;let Yl=An(Gn([Vu(Hl),Wl],Rl));return{...Hl,queue:C||Hl.queue,tasks:Yl,pagination:Hl.pagination?{...Ln(Hl),returned:Yl.length}:Hl.pagination}});if(ul&&X8(ul,hl)&&P8(ul))J.current+=1,A.current=jl,a(jl),nl(E.current.get(jl)?.task||ul),h(!1),Wf({phase:"complete",taskId:jl,queueMs:0,detailMs:0,totalMs:0,chunks:1,transcriptRows:Array.isArray(ul?.transcript)?ul.transcript.length:0,partial:!0,completedAt:new Date});J0(new Date)}function JW(Z){let C=String(Z||zu?.mainProviderId||"D601").trim()||"D601";Rr(C),eu(j1(zu,Nl,C)),Ai(null),M8().catch((o)=>ju(Su(o,"加载工作目录失败")))}function UW(Z){let C=String(Z||"default").trim()||"default",o=ir;if(C==="windows-native"){if(!B$.find((jl)=>jl.id===ir)?.supportsWindowsNativeCodex)o=String(B$.find((jl)=>jl.supportsWindowsNativeCodex)?.id||ir||"D601"),Rr(o)}ol(C),eu(j1(zu,C,o)),Ai(null),M8().catch((ul)=>ju(Su(ul,"加载工作目录失败")))}function S$(Z,C,o=null,ul=null){let jl=new Set(FW(Z,C));if(jl.size===0&&ul===null&&o===null)return;br((Kl)=>{if(!Kl)return Kl;let Wl=Vu(Kl).flatMap((Rl)=>{let Hl=String(Rl?.id||"");if(!jl.has(Hl)){let cu=D$(Rl);return Y8(cu)?[]:[cu]}let Yl=ul&&String(ul?.id||"")===Hl?ul:{},xl={...Rl,...Yl,readAt:C,terminalUnread:!1};return Y8(xl)?[]:[xl]});return{...Kl,queue:o||Kl.queue,tasks:jl.size>0?Gn([Wl],Ji):Wl}});for(let Kl of jl){let Wl=E.current.get(Kl);if(Wl?.task){let Rl=ul&&String(ul?.id||"")===Kl?ul:{},Hl={...Wl.task,...Rl,readAt:C,terminalUnread:!1};if(E.current.set(Kl,{...Wl,task:Hl}),A.current===Kl)nl(Hl)}}}Wn(()=>{ct(!1)},[g,Zr,Tl]),Wn(()=>{let Z=X2(rl);j.current+=1;let C=j.current;if(!t||Z.length===0){Ll(null),pl(!1),e(!1),L.current=!1;return}pl(!0),Ll(null);let o=window.setTimeout(()=>{(async()=>{try{let ul=await AQ(r,hl,Z);if(C!==j.current)return;Ll(jW(ul))}catch(ul){if(C===j.current)Ll(null),ju(Su(ul,"搜索 Codex tasks 失败"))}finally{if(C===j.current)pl(!1)}})()},240);return()=>window.clearTimeout(o)},[t?.id,r,hl,rl]),Wn(()=>{dl(R?L3(R):""),gu(Array.isArray(R?.referenceTaskIds)?R.referenceTaskIds.join(" "):"")},[I]);function Mf(Z,C,o){let ul=E.current.get(Z)||{},jl=ul.task||{},Kl=Array.isArray(jl.transcript)?jl.transcript:[],Wl=mQ(jl,C),Rl=Object.prototype.hasOwnProperty.call(C,"transcript")?V2(Kl,Array.isArray(C.transcript)?C.transcript:[]):Kl,Hl={...jl,...Wl,transcript:Rl,output:Array.isArray(Wl.output)?s2(jl,Wl,"output"):Array.isArray(jl.output)?jl.output:[],events:Array.isArray(Wl.events)?s2(jl,Wl,"events"):Array.isArray(jl.events)?jl.events:[]},Yl=D$(Hl),xl=String(Yl?.updatedAt||""),cu=Boolean(C._transcriptComplete)&&ef(Yl),lr=Boolean(ul.complete)&&ef(Yl)&&String(ul.completeUpdatedAt||"")===xl,ru=cu||lr,yr={...ul,task:Yl,maxSeq:A1(Rl),complete:ru,completeUpdatedAt:ru?xl:""};if(E.current.set(Z,yr),o===J.current&&A.current===Z)nl(Yl);return yr}async function _t(Z,C=!1,o,ul){if(!t||!Z)return;let Kl=E.current.get(Z)?.task;if(!C&&m3(Kl))return;let Wl=Z,Rl=Q.current.get(Wl);if(Rl){if(C||!m3(Kl))Rl.refreshAfter=!0;return Rl.promise}let Hl=J.current,Yl=performance.now();if(A.current===Z)h(!0);let xl={promise:Promise.resolve(),refreshAfter:!1},cu=(async()=>{try{let lr=await xp(r,Z);if(Hl!==J.current||A.current!==Z)return;let ru=lr?.summary||{},yr=String(ru.updatedAt||"");Mf(Z,{id:Z,status:ru.status,updatedAt:yr,startedAt:ru.startedAt,finishedAt:ru.finishedAt,currentAttempt:ru.currentAttempt,maxAttempts:ru.maxAttempts,finalResponse:ru.finalResponse,lastJudge:ru.lastJudge,lastError:ru.lastError,attempts:Array.isArray(ru.attempts)?ru.attempts:[],stepCount:ru.stepCount,llmStepCount:ru.llmStepCount,traceStats:ru.traceStats,statsSource:ru.statsSource,timing:ru.timing,_traceSummary:ru,_traceSummaryLoaded:!0,_traceSummaryUpdatedAt:yr,_detailLoaded:!0},Hl),Wf({phase:"complete",taskId:Z,queueMs:ul??0,detailMs:performance.now()-Yl,totalMs:o===void 0?performance.now()-Yl:performance.now()-o,chunks:1,transcriptRows:Number(ru?.execution?.traceLineCount||ru?.execution?.stepCount||0),partial:!1,completedAt:new Date})}finally{let lr=Boolean(xl.refreshAfter&&A.current===Z&&!m3(E.current.get(Z)?.task));if(Q.current.delete(Wl),Hl===J.current&&A.current===Z)h(!1);if(lr)window.setTimeout(()=>{_t(Z,!0).catch((ru)=>ju(Su(ru,"自动刷新 Trace Summary 失败")))},0)}})();xl.promise=cu,Q.current.set(Wl,xl),await cu}async function QW(Z,C=null){let o=A.current;if(!t||!o||!Z)return;let ul=E.current.get(o)?.task,jl=T3(ul),Kl=Z==="feedback"||Z==="judge-feedback"?SQ(C):Z;if(jl[Kl]?.text)return;let Wl=`${o}:${Kl}`,Rl=m.current.get(Wl);if(Rl)return Rl;let Hl=J.current;if(A.current===o)h(!0);let Yl=(async()=>{try{let xl=await bp(r,o,Z,C);if(Hl!==J.current||A.current!==o)return;let cu=E.current.get(o)?.task,lr=T3(cu);Mf(o,{...Z==="full"?{prompt:String(xl?.text||""),promptChars:Number(xl?.chars||0)}:{},_promptDetails:{...lr,[Kl]:xl}},Hl)}finally{if(m.current.delete(Wl),Hl===J.current&&A.current===o)h(!1)}})();m.current.set(Wl,Yl),await Yl}async function V$(Z=null,C={}){let o=A.current;if(!t||!o)return;let ul=E.current.get(o)?.task,jl=Z===null||Z===void 0||String(Z).length===0?"":String(Z),Kl=G3(ul,jl||null),Wl=Boolean(C.force),Rl=Boolean(C.incremental);if(Kl&&!Wl)return;let Hl=VQ(ul,jl||null),Yl=Rl&&Hl.length>0?Uz(Hl):0,xl=`${o}:${jl||"all"}:${Yl}`,cu=q.current.get(xl);if(cu)return cu;let lr=J.current;if(A.current===o)h(!0);let ru=(async()=>{try{let yr=await vp(r,o,Yl,500,jl||null);if(lr!==J.current||A.current!==o)return;let Fn=Array.isArray(yr?.steps)?yr.steps:[],Xn=Yl>0?Qz(Hl,Fn):Fn;if(jl){let At=E.current.get(o)?.task,G0=_u(At?._traceStepsByAttempt)||{},Rf=_u(At?._traceStepsLoadedByAttempt)||{},Tf=_u(At?._traceStepsNextAfterSeqByAttempt)||{};Mf(o,{_traceStepsByAttempt:{...G0,[jl]:Xn},_traceStepsLoadedByAttempt:{...Rf,[jl]:!0},_traceStepsNextAfterSeqByAttempt:{...Tf,[jl]:yr?.nextAfterSeq}},lr)}else Mf(o,{_traceSteps:Xn,_traceStepsLoaded:!0,_traceStepsHasMore:Boolean(yr?.hasMore),_traceStepsNextAfterSeq:yr?.nextAfterSeq},lr)}finally{if(q.current.delete(xl),lr===J.current&&A.current===o)h(!1)}})();q.current.set(xl,ru),await ru}async function mW(Z){let C=A.current,o=String(Z??"");if(!t||!C||o.length===0)return;let ul=E.current.get(C)?.task;if(C2(ul)[o]?.line)return;let Kl=`${C}:${o}`,Wl=W.current.get(Kl);if(Wl)return Wl;let Rl=J.current;if(A.current===C)h(!0);let Hl=(async()=>{try{let Yl=await gp(r,C,Z);if(Rl!==J.current||A.current!==C)return;let xl=E.current.get(C)?.task,cu=C2(xl);Mf(C,{_traceStepDetails:{...cu,[o]:Yl}},Rl)}finally{if(W.current.delete(Kl),Rl===J.current&&A.current===C)h(!1)}})();W.current.set(Kl,Hl),await Hl}function wW(Z){if(A.current!==Z)return;let C=E.current.get(Z)?.task;if(!C)return;if(G3(C,null))V$(null,{force:!0,incremental:!0}).catch((ul)=>ju(Su(ul,"增量刷新 Trace Steps 失败")));let o=_u(C?._traceStepsLoadedByAttempt)||{};for(let ul of Object.keys(o).filter((jl)=>o[jl]))V$(ul,{force:!0,incremental:!0}).catch((jl)=>ju(Su(jl,"增量刷新 Attempt Trace Steps 失败")))}async function _C(Z,C,o){if(!t||!Z)return;let ul=performance.now(),jl=J.current,Kl=E.current.get(Z);if(Kl?.task){if(nl(Kl.task),h(_1(Kl.task)||!Kl.complete),!_1(Kl.task)&&Kl.complete&&ef(Kl.task)&&String(Kl.completeUpdatedAt||"")===String(Kl.task?.updatedAt||"")){Wf({phase:"complete",taskId:Z,queueMs:o??0,detailMs:0,totalMs:C===void 0?0:performance.now()-C,chunks:0,transcriptRows:Array.isArray(Kl.task.transcript)?Kl.task.transcript.length:0,completedAt:new Date});return}}else h(!0);let Wl=N.current;if(Wl?.taskId===Z&&Wl.token===jl)return Wl.promise;let Rl=(async()=>{try{let Hl=await Yu(Xu(r,`/api/tasks/${encodeURIComponent(Z)}?meta=1`));if(jl!==J.current||A.current!==Z)return;let Yl=E.current.get(Z),xl=Array.isArray(Yl?.task?.transcript)?Yl.task.transcript:[],cu=Hl?.task||{},lr=Boolean(Yl?.complete)&&String(Yl?.completeUpdatedAt||"")===String(cu?.updatedAt||"");Mf(Z,{...cu,summaryOnly:!1,_metaLoaded:!0,transcript:xl,_detailLoaded:xl.length>0,_transcriptComplete:lr},jl);let ru=_1(Yl?.task)||Boolean(Yl?.task?._transcriptPreview),yr=ru?0:xl.length>0?qQ(xl):0,Fn=!ru&&Yl?.complete&&ef(cu)&&String(Yl?.completeUpdatedAt||"")===String(cu?.updatedAt||"")?A1(xl):yr,Xn=!0,At=0,G0=xl.length;while(Xn){let Rf=await Yu(Xu(r,`/api/tasks/${encodeURIComponent(Z)}/transcript?afterSeq=${encodeURIComponent(String(Fn))}&limit=${zp}&fullText=1`));if(jl!==J.current||A.current!==Z)return;let Tf=E.current.get(Z),W0=Array.isArray(Tf?.task?.transcript)?Tf.task.transcript:[],Ui=V2(W0,Array.isArray(Rf?.transcript)?Rf.transcript:[]);At+=1,G0=Ui.length;let su=Boolean(!Rf?.hasMore);if(Mf(Z,{status:Rf?.status||cu.status,updatedAt:Rf?.updatedAt||cu.updatedAt,transcript:Ui,_detailLoaded:su||Ui.length>0,_transcriptComplete:su,_transcriptPreview:ru&&!su},jl),Xn=Boolean(Rf?.hasMore),Fn=Number(Rf?.nextAfterSeq??A1(Ui)),!Xn)break;await new Promise((Yj)=>window.setTimeout(Yj,0))}Wf({phase:"complete",taskId:Z,queueMs:o??0,detailMs:performance.now()-ul,totalMs:C===void 0?performance.now()-ul:performance.now()-C,chunks:At,transcriptRows:G0,completedAt:new Date})}finally{if(N.current?.taskId===Z&&N.current?.token===jl)N.current=null;if(jl===J.current&&A.current===Z)h(!1)}})();N.current={taskId:Z,token:jl,promise:Rl},await Rl}async function $f(Z=A.current,C=!0,o=hl){if(!t)return;if(!C&&Y.current)return;let ul=performance.now();if(C)Y.current=!0;if(C)Wf({phase:"loading",taskId:String(Z||A.current||""),startedAt:new Date});let jl=F.current+1;F.current=jl;let Kl=String(Z||A.current||""),Wl=Kl?E.current.get(Kl):null,Rl=Array.isArray(Wl?.task?.transcript)?Wl.task.transcript:[],Hl=qQ(Rl),Yl=null,xl=C&&Kl.length===0;if(Yl=xl?await AQ(r,o,""):await O2(r,Kl,Hl,o,"",!0,{stats:!1}),jl!==F.current){if(C)Y.current=!1;return}let cu=performance.now()-ul;v(V||{});let lr=Yl?.queue||{},ru=String(lr?.activeTaskId||Ay(lr)[0]||""),yr=Yl;br((ku)=>{let Ft=Vu(Yl),_f=Vu(ku),Kf=_f.length>0?Gn([_f,Ft],ru):Gn([Ft],ru),jt=An(Kf),Y$=Ln(Yl),Qi=Ln(ku),x8=_f.length>Ft.length&&(Qi.hasMore===!1||String(Qi.nextBeforeId||"").length>0),IW={...Y$,...x8?{hasMore:Qi.hasMore,nextBeforeId:Qi.nextBeforeId}:{},returned:jt.length};return yr={...Yl,tasks:jt,pagination:IW},yr});let Fn=Vu(yr),Xn=$Q(lr,vl),At=_Q(lr,Xn,o,Fn),G0=Rp(Xn,o,Fn),Rf=Kl||A.current,Tf=yr?.selected||null,W0=Tf?.task||null,Ui=Array.isArray(Tf?.transcript)?Tf.transcript:null,su=Rf||At||G0||Fn[0]?.id||"";if(A.current!==su)J.current+=1;A.current=su,a(su);let T0=Fn.find((ku)=>ku.id===su);if(T0){let ku=E.current.get(su);if(ku?.task)E.current.set(su,{...ku,task:{...T0,...ku.task,status:T0.status,updatedAt:T0.updatedAt}})}if(xl&&T0){if(Mf(su,{...T0,_summaryLoaded:!1,transcript:[],_detailLoaded:!1,_transcriptComplete:!1,_transcriptPreview:!0},J.current),h(!0),Wf({phase:"complete",taskId:su,queueMs:cu,detailMs:0,totalMs:performance.now()-ul,chunks:0,transcriptRows:0,partial:!0,completedAt:new Date}),J0(new Date),C)Y.current=!1;_t(su,!0).catch((ku)=>ju(Su(ku,"加载 Codex Trace Summary 失败"))),O2(r,su,0,o,"",!1).then((ku)=>{if(jl!==F.current)return;let Ft=Vu(ku),_f=wQ(ku);if(Ft.length>0)br((Kf)=>{let jt=Gn([Vu(Kf),Ft],ru);return{...Kf,statistics:ku?.statistics||Kf?.statistics,tasks:An(jt)}});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(ku?.selected?.preview)},J.current)}}).catch(()=>{});return}if(W0?.id===su&&Ui!==null){let ku=E.current.get(su),Ft=Array.isArray(ku?.task?.transcript)?ku.task.transcript:[],_f=V2(Ft,Ui),Kf=Boolean(Tf?.preview);if(Mf(su,{...W0,_summaryLoaded:!0,transcript:_f,_detailLoaded:!Tf?.hasMore||_f.length>0,_transcriptComplete:!Kf&&!Tf?.hasMore&&ef(W0),_transcriptPreview:Kf},J.current),h(!1),C)Wf({phase:"complete",taskId:su,queueMs:cu,detailMs:Math.max(0,performance.now()-ul-cu),totalMs:performance.now()-ul,chunks:1,transcriptRows:_f.length,partial:Boolean(Kf||Tf?.hasMore||_1(W0)),completedAt:new Date});if(J0(new Date),C)Y.current=!1;_t(su,!1,C?ul:void 0,C?cu:void 0).catch((jt)=>ju(Su(jt,"加载 Codex Trace Summary 失败"))),O2(r,Kl,Hl,o,"",!1).then((jt)=>{if(jl!==F.current)return;let Y$=Vu(jt);if(Y$.length>0)br((Qi)=>{let x8=Gn([Vu(Qi),Y$],ru);return{...Qi,tasks:An(x8)}})}).catch(()=>{});return}if(C)Wf({phase:"session",taskId:su,queueMs:cu,totalMs:cu,startedAt:new Date(Date.now()-cu)});if(su)_t(su,!0,C?ul:void 0,C?cu:void 0).catch((ku)=>ju(Su(ku,"加载 Codex Trace Summary 失败")));else if(J.current+=1,nl(null),h(!1),C)Wf({phase:"complete",taskId:"",queueMs:cu,detailMs:0,totalMs:performance.now()-ul,chunks:0,transcriptRows:0,completedAt:new Date});if(J0(new Date),C)Y.current=!1}async function zj(){if(cf){if(!t||s||L.current)return;let C=String(H8.nextBeforeId||"");if(!C)return;L.current=!0,e(!0),ju("");try{let o=await FQ(r,hl,C,WQ,w0),ul=Vu(o),jl=o?.queue||zu||{},Kl=String(jl?.activeTaskId||Ay(jl)[0]||Ji||"");Ll((Wl)=>{let Rl=An(Gn([Vu(Wl),ul],Kl)),Hl=Ln(o);return{...Wl||{},queue:jl,tasks:Rl,pagination:{...Hl,returned:Rl.length}}})}catch(o){ju(Su(o,"加载更多搜索结果失败"))}finally{L.current=!1,e(!1)}return}if(!t||lc||w.current)return;let Z=String(Ln(K).nextBeforeId||"");if(!Z)return;w.current=!0,z$(!0),ju("");try{let C=await FQ(r,hl,Z),o=Vu(C),ul=C?.queue||zu||{},jl=String(ul?.activeTaskId||Ay(ul)[0]||Ji||"");br((Kl)=>{let Wl=An(Gn([Vu(Kl),o],jl)),Rl=Ln(C);return{...Kl||{},queue:ul,statistics:C?.statistics||Kl?.statistics,tasks:Wl,pagination:{...Rl,returned:Wl.length}}})}catch(C){ju(Su(C,"加载更早 Codex tasks 失败"))}finally{w.current=!1,z$(!1)}}function qW(Z){let C=Z.currentTarget;if(!C||B8||!Lj)return;if(C.scrollHeight-C.scrollTop-C.clientHeight<120)zj()}async function Br(Z,C){W$(!0),ju("");try{await Z()}catch(o){ju(Su(o,C))}finally{W$(!1)}}async function C8(Z){if(!Z)return;try{let C=!1;try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(Z),C=!0}catch{C=!1}if(!C){let ul=document.createElement("textarea");ul.value=Z,ul.style.position="fixed",ul.style.opacity="0",document.body.appendChild(ul),ul.select(),C=document.execCommand("copy"),document.body.removeChild(ul)}if(!C)throw Error("browser clipboard rejected the copy request");dy(Z);let o=`已复制任务 ID:${Z}`;hu(o),Hr("success",o),window.setTimeout(()=>dy((ul)=>ul===Z?"":ul),1600)}catch(C){ju(`复制任务 ID 失败:${Su(C)}`)}}function h8(Z){if(!Z)return;Zl(Z);let C=`已引用任务 ID:${Z};提交时后端会读取并注入该任务上下文`;hu(C),Hr("success",C)}async function s8(Z){if(!t||!Z)return;let C=new Date().toISOString();F.current+=1,S$([Z],C,null,{id:Z,readAt:C,terminalUnread:!1}),T$(Z);let o=!1;if(await Br(async()=>{let ul=await kp(r,Z),jl=ul?.task||{id:Z,readAt:new Date().toISOString(),terminalUnread:!1},Kl=String(jl?.readAt||new Date().toISOString());S$([Z],Kl,ul?.queue||null,jl),o=!0;let Wl=`已将任务 ${Z} 标为已读`;hu(Wl),Hr("success",Wl)},"标记 Codex task 已读失败"),!o)pj([Z]),$f(A.current,!1).catch((ul)=>ju(Su(ul,"刷新 Codex tasks 失败")));T$((ul)=>ul===Z?"":ul)}async function LW(){if(!t||ey)return;K$(!0);let Z=new Date().toISOString(),C=Array.from(new Set([...Vu(S.current).filter(an).map((ul)=>String(ul?.id||"")).filter(Boolean),...Array.from(E.current.entries()).filter(([,ul])=>an(ul?.task)).map(([ul])=>ul)]));if(F.current+=1,C.length>0)S$(C,Z);let o=!1;if(await Br(async()=>{let ul=await Ip(r),jl=String(ul?.readAt||new Date().toISOString()),Kl=Vu(S.current).filter(an).map((xl)=>String(xl?.id||"")).filter(Boolean),Wl=Array.from(E.current.entries()).filter(([,xl])=>an(xl?.task)).map(([xl])=>xl),Rl=Array.from(new Set([...C,...Kl,...Wl]));S$(Rl,jl,ul?.queue||null);let Hl=Number(ul?.count||Rl.length);o=!0;let Yl=`已将 ${Hl} 个已结束未读任务标为已读`;hu(Yl),Hr("success",Yl)},"全部标为已读失败"),!o&&C.length>0)pj(C),$f(A.current,!1).catch((ul)=>ju(Su(ul,"刷新 Codex tasks 失败")));K$(!1)}function GW(Z){let C=Z||ht;if(wu(C),!Cr(C))nu(C);if(br(null),!(Cr(C)?A.current:""))A.current="",J.current+=1,a(""),nl(null),h(!0)}async function M8(){if(!t)return;let Z=await Yu(Xu(r,"/api/workdirs"));Ai(Z)}async function WW(){let Z=Cu.trim()||Kj||"/workspace",C=typeof window>"u"?Z:window.prompt("输入新的工作目录绝对路径",Z),o=String(C||"").trim();if(!o)return;Fi(!0),await Br(async()=>{let ul=await Yu(Xu(r,"/api/workdirs"),{method:"POST",body:{providerId:ir,executionMode:Nl,path:o,ensure:!0}});Ai((Kl)=>({...Kl||{},...ul})),eu(String(ul?.workdir?.path||o));let jl=`已保存工作目录:${String(ul?.workdir?.path||o)}`;hu(jl),Hr("success",jl)},"创建工作目录失败"),Fi(!1)}async function TW(){let Z=Jy(Cu);if(!S8){hu("当前工作目录还没有保存到下拉菜单。");return}if(!(typeof window>"u"?!0:window.confirm(`从下拉菜单删除工作目录选项? +${Z} -不会删除磁盘上的实际目录。`)))return;c0(!0),await Hr(async()=>{let g=await Vu(Su(r,`/api/workdirs/${encodeURIComponent(tr)}/${encodeURIComponent(jl)}/${encodeURIComponent(H)}`),{method:"DELETE"});y0((Al)=>({...Al||{},...g}));let ll=`已从下拉菜单删除工作目录:${H}`;Pu(ll),pr("success",ll)},"删除工作目录失败"),c0(!1)}async function oG(){let H=typeof window>"u"?"":window.prompt("输入新的 Codex queue ID(字母/数字/._-,最长 64)","new-lane"),C=String(H||"").trim();if(!C)return;await Hr(async()=>{let g=await Vu(Su(r,"/api/queues"),{method:"POST",body:{queueId:C}}),ll=String(g?.queue?.id||C);nu(ll),wu(ll),xr(null),A.current="",U.current+=1,k(""),tl(null);let Al=`已创建并切换到 queue:${ll}`;Pu(Al),pr("success",Al),await tf("",!0,ll)},"创建 Codex queue 失败")}async function dG(){let H=String(Il||"default").trim()||"default",C=iy(Pf,H)||{id:H,name:H},g=typeof window>"u"?null:window.prompt(`输入 queue 显示名称(ID 不变:${H};留空恢复为 ID)`,fQ(C));if(g===null)return;await Hr(async()=>{let ll=await Vu(Su(r,`/api/queues/${encodeURIComponent(H)}`),{method:"PATCH",body:{name:String(g)}}),Al=ll?.queue||{id:H,name:String(g||H)};if(ll?.summary)xr((Ll)=>Ll?{...Ll,queue:ll.summary}:Ll);let Gl=`已更新 queue 名称:${q2(Al)}`;Pu(Gl),pr("success",Gl),await tf(A.current,!0,Ml)},"修改 Codex queue 名称失败")}function eG(){if($0.length===0){Pu("没有可合并的其他 queue;请先创建或选择另一个 queue。");return}let H=$0.some((C)=>String(C?.id||"")===$r)?$r:"";ir(H),Or(!0)}async function lT(){let H=_0;if($0.length===0){Pu("没有可合并的其他 queue;请先创建或选择另一个 queue。");return}let g=String($r||""||"").trim();if(!g){Pu("请先选择要合并的源 queue。");return}if(g===H){Fu("源 queue 和目标 queue 不能相同。");return}await Hr(async()=>{let ll=await Vu(Su(r,`/api/queues/${encodeURIComponent(H)}/merge`),{method:"POST",body:{sourceQueueId:g}});if(ll?.summary)xr((Ll)=>Ll?{...Ll,queue:ll.summary}:Ll);nu(H),wu(H),xr(null);let Al=Number(ll?.mergedTaskCount||0),Gl=`已将 queue=${g} 合并到 ${H},移动 ${Al} 个任务;源 queue 已自动删除。`;Pu(Gl),pr("success",Gl),Or(!1),ir(""),await tf(A.current,!0,H)},"合并 Codex queue 失败")}async function uT(H){if(H.preventDefault(),N.current){Pu("任务正在提交中,请等待当前请求完成,已阻止重复提交。");return}if(Hn.length>1&&!ff){Fu(`检测到将创建 ${Hn.length} 个任务;请先勾选“确认批量入队”,避免误传多个任务。`);return}N.current=!0,nt(!0),Pu("正在提交 Code Queue 任务,请等待后端确认,输入已临时锁定。"),await Hr(async()=>{if(Hn.length===0)throw Error("prompt 不能为空");let C=V0(pl),g=Il.trim()||"default",ll=[...Hn],Al=(bl)=>({prompt:bl,queueId:g,providerId:tr,executionMode:jl,model:wr,cwd:Yu,maxAttempts:Number(rf),...C.length>0?{referenceTaskIds:C}:{}}),Gl=ll.length===1?Al(ll[0]):{tasks:ll.map(Al)},Ll=await Vu(Su(r,ll.length===1?"/api/tasks":"/api/tasks/batch"),{method:"POST",body:Gl}),xl=Ll?.tasks?.[0]?.id||"",Zl=Array.isArray(Ll?.tasks)?Ll.tasks.map((bl)=>String(bl?.id||"")).filter(Boolean):[],Xl=`已创建 ${Zl.length||ll.length} 个任务${Zl.length>0?`:${Zl.join(" / ")}`:""}`;if(MG(Array.isArray(Ll?.tasks)?Ll.tasks:[],Ll?.queue||null),Pu(Xl),pr("success",Xl),ql(""),Bl(""),ii(!1),nu(g),xl&&w6(Ll?.tasks?.[0],Ml)&&q6(Ll?.tasks?.[0]))yi(String(xl),!1).catch((bl)=>Fu(xu(bl,"加载 Codex Trace Summary 失败")))},"Codex 任务入队失败"),N.current=!1,nt(!1)}async function rT(H){if(H.preventDefault(),!v?.id)return;await Hr(async()=>{await Vu(Su(r,`/api/tasks/${encodeURIComponent(v.id)}/steer`),{method:"POST",body:{prompt:fl}}),Dl(""),await tf(v.id)},"追加 prompt 失败")}async function fT(H){H.preventDefault();let C=String(v?.id||"");if(!C||!Ft)return;await Hr(async()=>{let g=V0(ju),ll=await Vu(Su(r,`/api/tasks/${encodeURIComponent(C)}/edit`),{method:"POST",body:{prompt:Cl,referenceTaskIds:g}}),Al={...ll?.task||v||{},_traceSummary:null,_traceSummaryLoaded:!1,_traceSummaryUpdatedAt:"",_promptDetails:{},_traceSteps:[],_traceStepsLoaded:!1,_traceStepsByAttempt:{},_traceStepsLoadedByAttempt:{},_traceStepsNextAfterSeqByAttempt:{},_traceStepDetails:{}};m.current.set(C,{...m.current.get(C)||{},task:Al,complete:!1,completeUpdatedAt:""}),A.current=C,tl(Al),k(C),dl(_3(Al)),ku(Array.isArray(Al?.referenceTaskIds)?Al.referenceTaskIds.join(" "):""),xr((Ll)=>{if(!Ll)return Ll;let xl=Du(Ll).map((Zl)=>String(Zl?.id||"")===C?{...Zl,...Al}:Zl);return{...Ll,queue:ll?.queue||Ll.queue,tasks:Qn([xl],ti)}});let Gl=ll?.changed===!1?`任务 ${C} 的 prompt 未变化`:`已更新 queued 任务 ${C} 的用户 prompt`;Pu(Gl),pr("success",Gl),await tf(C,!0,Ml)},"编辑 queued 任务 prompt 失败")}async function nT(){if(!v?.id)return;await Hr(async()=>{await Vu(Su(r,`/api/tasks/${encodeURIComponent(v.id)}/interrupt`),{method:"POST",body:{}}),await tf(v.id)},"打断 Codex session 失败")}async function iT(){if(!v?.id)return;await Hr(async()=>{await Vu(Su(r,`/api/tasks/${encodeURIComponent(v.id)}/retry`),{method:"POST",body:{}}),await tf(v.id)},"重新入队失败")}async function tT(H){let C=String(v?.id||""),g=String(H||"").trim();if(!C||!g)return;let ll=ty(v);if(g===ll){Pu(`任务 ${C} 已在 queue=${g}`);return}await Hr(async()=>{let Gl=(await Vu(Su(r,`/api/tasks/${encodeURIComponent(C)}/move`),{method:"POST",body:{queueId:g}}))?.task||{...v,queueId:g};if(m.current.set(C,{...m.current.get(C)||{},task:Gl}),A.current=C,tl(Gl),k(C),nu(g),!Pr(Ml))xr(null),wu(g);let Ll=`已将任务 ${C} 从 ${ll} 移动到 ${g}`;Pu(Ll),pr("success",Ll),await tf(C,!0,Pr(Ml)?Yi:g)},"移动任务 queue 失败")}async function yT(){let H=A.current;if(!H)return;let C=performance.now();await Hr(async()=>{Lf({phase:"session",taskId:H,queueMs:0,totalMs:0,partial:!0,startedAt:new Date}),await yi(H,!0,C,0)},"刷新 Trace Summary 失败")}function cT(H){A.current=H,U.current+=1,k(H);let C=m.current.get(H);if(C?.task)tl(C.task),M(!1);else{M(!0);let g=fn.find((ll)=>ll.id===H);if(g)tl(g);else tl(null)}tf(H).catch((g)=>Fu(xu(g,"切换 Codex session 失败")))}function K6(H){if(cT(H),$E())Ry(!1)}function n7(H,C,g){if(!H||!Array.isArray(H?.tasks)||C.length===0||Object.keys(g).length===0)return H;let ll=!1,Al=Du(H).map((Gl)=>{if(String(Gl?.id||"")!==C)return Gl;return ll=!0,T_(gN(Gl,g))});return ll?{...H,tasks:Al}:H}function _T(H,C){xr((g)=>n7(g,H,C)),Tl((g)=>n7(g,H,C))}function $T(H,C,g){let ll=String(H?.type||"");if(ll==="queue-updated")return!0;if(ll==="trace-stats-updated"||ll==="trace-step-created")return!1;if(C.length===0)return!0;if(!g)return!0;if(H?.queueId&&String(H.queueId)!==ty(g))return!0;if(H?.status&&String(H.status)!==String(g?.status||""))return!0;return String(H?.reason||"")!=="output"}function i7(){if(!i||!$2())return;if(Z.current!==null)window.clearTimeout(Z.current);Z.current=window.setTimeout(()=>{Z.current=null,tf(A.current,!1).catch((H)=>Fu(xu(H,"Code Queue 事件刷新失败")))},120)}function AT(H,C){if(!i||!$2()||A.current!==H)return;if(D.current=D.current||C,E.current!==null)return;E.current=window.setTimeout(()=>{E.current=null;let g=D.current;if(D.current=!1,yi(H,!0).catch((ll)=>Fu(xu(ll,"事件刷新 Trace Summary 失败"))),g)vG(H)},250)}function jT(H){let C=Gu(H?.payload)||H,g=Gu(C?.stats),ll=String(H?.type||C?.type||""),Al=String(C?.subjectKind||g?.subjectKind||""),Gl=String(C?.scopeId||g?.scopeId||""),Ll=String(C?.taskId||(Al==="task"?C?.subjectId:"")||g?.taskId||H?.taskId||""),xl=C?.attemptIndex??g?.attemptIndex,Zl=xl===null||xl===void 0||xl===""?null:kn(xl),Xl=g||Gu(C?.traceStats),bl=Xl?.stepCount??Xl?.llmStepCount,cu=Xl?.outputMaxSeq;return{...C,type:ll,eventId:H?.eventId||C?.eventId,sequence:H?.sequence??C?.sequence,taskId:Ll,subjectKind:Al,scopeId:Gl,attemptIndex:Zl,stepCount:bl,outputMaxSeq:cu,updatedAt:Xl?.updatedAt||C?.updatedAt||H?.createdAt,traceStats:Xl,statsSource:Xl?"oa-event-flow":C?.statsSource}}function FT(H){let C=jT(H),g=String(C?.taskId||""),ll=String(C?.scopeId||C?.traceStats?.scopeId||""),Al=String(C?.subjectKind||C?.traceStats?.subjectKind||"")==="task-attempt"||Number(C?.attemptIndex)>0||/:attempt:\d+$/u.test(ll),Gl=xN(C?.stepCount),Ll={},xl=g.length>0?Du(X.current).find((Zl)=>String(Zl?.id||"")===g):null;if(g.length>0){if(C?.status)Ll.status=String(C.status);if(C?.updatedAt)Ll.updatedAt=String(C.updatedAt);if(C?.queueId)Ll.queueId=String(C.queueId);if(!Al&&Number.isFinite(Number(C?.stepCount)))Ll.stepCount=Gl,Ll.llmStepCount=Gl;if(!Al&&Number.isFinite(Number(C?.outputMaxSeq)))Ll.outputMaxSeq=xN(C.outputMaxSeq);if(!Al&&Gu(C?.traceStats))Ll.traceStats=C.traceStats,Ll.statsSource="oa-event-flow";if(Object.keys(Ll).length>0&&(m.current.has(g)||A.current===g))Cf(g,Ll,U.current);if(Object.keys(Ll).length>0)_T(g,Ll);if(A.current===g&&(C?.type==="trace-step-created"||C?.type==="task-updated"||C?.type==="trace-stats-updated")){let Zl=yQ(xl),Xl=C?.type==="trace-step-created"||C?.type==="trace-stats-updated"&&!Al&&Number.isFinite(Number(C?.stepCount))&&(Zl===null||Gl>Zl);AT(g,Xl)}}if($T(C,g,xl))i7()}vn(()=>{if(p.current){p.current=!1;return}Hr(()=>tf(A.current),"Code Queue 加载失败")},[i?.id,Ml]),vn(()=>{if(!i||typeof EventSource>"u")return;let H=new EventSource(iE(r),{withCredentials:!0}),C=(ll)=>{try{FT(JSON.parse(String(ll.data||"{}")))}catch(Al){Fu(xu(Al,"解析 Code Queue 事件失败"))}},g=()=>{if($2())i7()};return H.addEventListener("trace-step-created",C),H.addEventListener("task-updated",C),H.addEventListener("queue-updated",C),H.addEventListener("trace-stats-updated",C),document.addEventListener("visibilitychange",g),()=>{if(H.close(),document.removeEventListener("visibilitychange",g),Z.current!==null)window.clearTimeout(Z.current),Z.current=null;if(E.current!==null)window.clearTimeout(E.current),E.current=null}},[i?.id,r,Ml]),vn(()=>{if(!i||!v||I)return;let H=String(v.id||"");if(!H)return;let C=String(v.updatedAt||"");if(y3(v))return;let g=`${H}:${C||"unknown"}:${String(v?._traceSummaryUpdatedAt||"")}`;if(O.current.has(g))return;O.current.add(g),yi(H,!0).catch((ll)=>Fu(xu(ll,"自动加载 Trace Summary 失败")))},[i?.id,v?.id,v?.updatedAt,v?.traceStats?.statsRevision,v?._traceSummaryUpdatedAt,v?._traceSummaryLoaded,I]),vn(()=>{if(!i)return;m6().catch((H)=>Fu(xu(H,"加载工作目录失败")));return},[i?.id]);let JT=nn.length===0?G(P0,{title:nf?Ql?"搜索中":"没有匹配任务":"队列为空",text:nf?Ql?`正在搜索包含“${At}”的 task...`:`未找到包含“${At}”的 task;可换个关键词或切换 queue。`:"提交一个任务后,Codex 会串行执行并保存输出。"}):[gj.length>0?G(N2,{key:"unread",title:"已结束未读",tasks:gj,selectedId:s,emptyText:"暂无已结束未读任务。",onSelect:K6,onCopy:L6,onReference:G6,onMarkRead:T6,copiedTaskId:it,markingReadTaskId:tt}):null,G(N2,{key:"active",title:"运行 / 排队",tasks:pG,selectedId:s,emptyText:"当前没有运行或排队任务。",onSelect:K6,onCopy:L6,onReference:G6,onMarkRead:T6,copiedTaskId:it,markingReadTaskId:tt}),G(N2,{key:"history",title:"历史 session",tasks:HG,selectedId:s,emptyText:"最近没有完成、失败或取消的 session。",onSelect:K6,onCopy:L6,onReference:G6,onMarkRead:T6,copiedTaskId:it,markingReadTaskId:tt}),G("div",{key:"pagination",className:"codex-task-pagination","data-testid":"codex-task-pagination"},G("span",null,nf?`搜索“${At}” · 已显示 ${nn.length} / ${Number.isFinite(jt)?jt:nn.length}`:`已加载 ${nn.length} / ${Number.isFinite(jt)?jt:nn.length}`),aj?G("button",{type:"button",className:"ghost-btn",disabled:F6,onClick:()=>void f7(),"data-testid":"codex-load-more-tasks-button"},F6?"加载中":nf?"加载更多结果":"加载更早任务"):G("code",null,nf?"已到结果末尾":"已到队列末尾"))],t7=(H,C=!1)=>G("label",{className:`code-queue-switcher ${C?"compact":""}`},G("span",null,C?"Queue":"查看 queue"),G("select",{value:Ml,onChange:(g)=>gG(String(g.target.value||Yi)),"data-testid":H},G("option",{value:Yi},`All queues · ${Number.isFinite(A0)?A0:fn.length} tasks · ${$t.length} running`),Pf.map((g)=>G("option",{key:String(g?.id||""),value:String(g?.id||"")},fc(g))))),UT=G("div",{className:"codex-task-search","data-testid":"codex-task-search"},G("label",{htmlFor:"codex-task-search-input"},"搜索 task"),G("div",{className:"codex-task-search-row"},G("input",{id:"codex-task-search-input",type:"search",value:rl,placeholder:"关键词 / task ID / prompt",autoComplete:"off",onChange:(H)=>cl(String(H.target.value||"")),"data-testid":"codex-task-search-input"}),rl?G("button",{type:"button",className:"ghost-btn",onClick:()=>cl(""),"data-testid":"codex-task-search-clear"},"清除"):null),G("small",{"data-testid":"codex-task-search-summary"},nf?Ql?"搜索中...":`匹配 ${nn.length}/${Number.isFinite(jt)?jt:nn.length}`:"支持 task ID、prompt、状态、provider、模型和最近输出关键词")),NT=G("div",{className:"codex-trace-status","data-testid":"codex-trace-status-summary"},G("span",{className:"codex-trace-status-chip queued"},G("b",null,"排队"),String(ky)),G("span",{className:"codex-trace-status-chip running"},G("b",null,"运行"),String($6)),G("span",{className:`codex-trace-status-chip unread ${pn>0?"warn":""}`},G("b",null,"结束未读"),String(pn)),G("span",{className:"codex-trace-status-chip service"},G("b",null,"服务"),`${BG.providerStatus||"unknown"} · ${i?.providerId||"D601"} · ${DG.public?"公网暴露":"仅 UniDesk frontend 代理访问"}`),G("span",{className:"codex-trace-status-chip"},G("b",null,"执行节点"),G_.map((H)=>H.id).join(" / ")),G("span",{className:"codex-trace-status-chip"},G("b",null,"执行模式"),ej.map((H)=>H.id).join(" / ")),G("span",{className:"codex-trace-status-chip"},G("b",null,"模型"),dj.join(" / ")),G("span",{className:"codex-trace-status-chip"},G("b",null,"加载"),Rr?.phase==="complete"?rE(Rr?.totalMs):String(Rr?.phase||"idle")),G("span",{className:"codex-trace-status-chip"},G("b",null,"刷新"),Q_?iu(Q_):"--")),QT=G(ry,{title:v?`Trace ${String(v.id).slice(0,22)}`:"Trace 输出",eyebrow:v?`${v.status} / view=${L_} / task queue=${ty(v)} / provider=${v.providerId||"D601"} / mode=${v.executionMode||"default"} / ${v.model} / agent loop trace`:`Agent loop trace / view=${L_}`,summary:NT,loading:I||vy||Ql||h||Rr?.phase==="loading",actions:G("div",{className:"panel-actions"},t7("code-queue-filter-select"),G("button",{type:"button",className:"ghost-btn codex-mark-all-read-btn",disabled:pn===0||mu||by,onClick:()=>void kG(),"data-testid":"codex-mark-all-read-button"},by?"标记中":`全部标已读${pn>0?` (${pn})`:""}`),v?G("button",{type:"button",className:"ghost-btn",disabled:I||mu,onClick:()=>void yT(),"data-testid":"codex-load-full-trace-button"},I?"加载中":Uf(v)?"刷新 Summary":"加载 Summary"):null,G("button",{type:"button",className:"codex-session-title-toggle",onClick:()=>Ry((H)=>!H),"data-testid":"code-queue-sidebar-toggle"},Yf?"收起队列":"展开队列"),G("label",{className:"inline-check"},G("input",{type:"checkbox",checked:$u,onChange:(H)=>qr(Boolean(H.target.checked))}),"自动滚动"),G("button",{type:"button",className:"ghost-btn",disabled:!XG||mu,onClick:()=>void nT(),"data-testid":"codex-interrupt-button"},"打断"),G("button",{type:"button",className:"ghost-btn",disabled:!YG||mu,onClick:()=>void iT()},"重试"),v?G(rQ,{title:"Codex Task",data:v,onOpen:u,testId:"raw-codex-task"}):null),className:"codex-output-panel"},G("div",{className:`codex-session-shell ${Yf?"":"queue-collapsed"}`},Yf?G("aside",{className:"codex-session-sidebar","data-testid":"codex-session-sidebar"},G("div",{className:"codex-session-sidebar-head"},G("div",null,G("span",null,Pr(Ml)?"All queues":"Queue lane"),G("strong",null,`${L_} · ${fn.length}/${Number.isFinite(A0)?A0:fn.length} sessions · 未读 ${pn}`)),G("button",{type:"button",className:"ghost-btn",onClick:()=>Ry(!1)},"收起")),t7("code-queue-filter-sidebar",!0),UT,G("div",{className:"codex-task-list codex-task-list-session",onScroll:sG,"data-testid":"codex-task-list-scroll"},JT)):null,G("div",{className:"codex-session-main"},G("div",{className:"codex-output-stack"},G(TO,{task:v,loading:I,onLoadPromptPart:xG,onLoadSteps:W6,onLoadStep:bG}),G(mO,{task:v})))));if(!i)return G(P0,{title:"Code Queue 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=code-queue"});let y7=Number(Rr?.totalMs),c7=Number(Rr?.queueMs),_7=Number(Rr?.detailMs),$7=Number(Rr?.transcriptRows),wT=Rr?.phase==="complete"?"complete":String(Rr?.phase||"idle"),qT=iy(Pf,_0)||{id:_0,name:_0},WT=Qr?G(VN,{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:mu,onClose:()=>Or(!1),actions:[G("button",{key:"cancel",type:"button",className:"ghost-btn",onClick:()=>Or(!1),disabled:mu,"data-testid":"codex-merge-queue-cancel"},"取消"),G("button",{key:"confirm",type:"button",className:"primary-btn",onClick:()=>void lT(),disabled:mu||Au||!$r,"data-testid":"codex-merge-queue-confirm"},mu?"合并中...":"确认合并")]},G("p",{className:"codex-merge-dialog-target"},"目标 queue:",G("code",null,fc(qT))),G("label",null,"源 queue",G("select",{value:$r,disabled:mu||Au,onChange:(H)=>ir(String(H.target.value||"")),"data-testid":"codex-merge-source-queue-select"},G("option",{value:""},"选择要合并进来的源 queue"),$0.map((H)=>G("option",{key:String(H?.id||""),value:String(H?.id||"")},fc(H))))),G("p",{className:"codex-merge-dialog-note"},"会把源 queue 的任务归属合并到目标 queue,并自动删除源 queue;目标 queue 会按原 queueEnteredAt/createdAt 时间顺序运行。")):null;return G("div",{className:`code-queue-page ${n?"codex-standalone-page":""}`,"data-testid":"code-queue-page","data-load-state":wT,"data-load-total-ms":Number.isFinite(y7)?String(Math.round(y7*10)/10):"","data-load-queue-ms":Number.isFinite(c7)?String(Math.round(c7*10)/10):"","data-load-detail-ms":Number.isFinite(_7)?String(Math.round(_7*10)/10):"","data-load-transcript-rows":Number.isFinite($7)?String($7):"","data-load-task-id":String(Rr?.taskId||s||""),"data-load-partial":Rr?.partial?"true":"false"},G(lu,{error:c6,wide:!0}),WT,G("div",{className:"codex-session-stage codex-session-stage-top"},QT),G("div",{className:"code-queue-layout"},G("div",{className:"codex-left-rail"},G(ry,{title:"提交任务",eyebrow:Au?"Submitting...":Hn.length>1?`${Hn.length} tasks`:"Single or Batch",className:"codex-compose-panel",loading:Au},G("form",{className:`codex-task-form ${Au?"is-submitting":""}`,onSubmit:uT,"data-testid":"code-queue-task-form","aria-busy":Au?"true":"false"},G("label",null,"Prompt / 多任务用单独一行 --- 分隔",G("textarea",{value:o,rows:8,disabled:Au,onChange:(H)=>ql(H.target.value),placeholder:"写入 Codex 任务;多个任务之间用 --- 分隔。"})),G("label",{className:"codex-reference-field"},"引用任务 ID(可选)",G("input",{value:pl,disabled:Au,onChange:(H)=>Bl(H.target.value),placeholder:"codex_...;支持空格/逗号分隔多个 ID","data-testid":"codex-reference-task-id"}),V0(pl).length>0?G("code",null,`后端将解析并注入:${V0(pl).join(" / ")}`):null),G("div",{className:"codex-form-grid"},G("label",{className:"codex-submit-queue-field"},"Queue",G("div",{className:"codex-submit-queue-row"},G("select",{className:"codex-submit-queue-select",value:Il,disabled:Au,onChange:(H)=>nu(String(H.target.value||"default")),"data-testid":"code-queue-id-select"},Pf.map((H)=>G("option",{key:String(H?.id||""),value:String(H?.id||"")},fc(H)))),G("button",{type:"button",className:"ghost-btn codex-rename-queue-btn",onClick:()=>void dG(),disabled:mu||Au||!Il,title:"修改当前 queue 的显示名称,ID 不变","data-testid":"codex-rename-queue-button"},"改名"),G("button",{type:"button",className:"ghost-btn codex-merge-queue-btn",onClick:()=>eG(),disabled:mu||Au||$0.length===0,title:"打开独立窗口选择源 queue 并合并到当前 queue;合并后自动删除源 queue","data-testid":"codex-merge-queue-button"},"合并 queue"),G("button",{type:"button",className:"ghost-btn codex-create-queue-btn",onClick:()=>void oG(),disabled:mu||Au,"data-testid":"codex-create-queue-button"},"创建 queue"))),G("label",null,"模型",G("select",{value:wr,disabled:Au,onChange:(H)=>hl(H.target.value),"data-testid":"codex-model-select"},dj.map((H)=>G("option",{key:H,value:H},H)))),G("label",null,"执行 Provider",G("select",{value:tr,disabled:Au,onChange:(H)=>hG(String(H.target.value||"D601")),"data-testid":"codex-provider-select"},G_.map((H)=>G("option",{key:H.id,value:H.id},`${H.label||H.id} · ${H.defaultWorkdir||Z2(Cu,H.id)}${H.supportsWindowsNativeCodex?" · Windows native":""}`)))),G("label",null,"执行模式",G("select",{value:jl,disabled:Au,onChange:(H)=>RG(String(H.target.value||"default")),"data-testid":"codex-execution-mode-select"},ej.map((H)=>G("option",{key:H.id,value:H.id},`${H.label||H.id}${H.id==="windows-native"?" · 宿主 Codex":""}`)))),G("label",{className:"codex-workdir-field"},"工作目录",G("div",{className:"codex-workdir-row"},G("input",{value:Yu,disabled:Au,onChange:(H)=>eu(H.target.value),placeholder:l7||Cu?.defaultWorkdir||"/workspace","data-testid":"codex-cwd-input"}),G("select",{value:yy(Yu),disabled:Au||yt,onChange:(H)=>eu(String(H.target.value||"")),"data-testid":"codex-cwd-select"},u7.map((H)=>G("option",{key:`${H.providerId}:${H.executionMode}:${H.path}`,value:H.path},`${H.path}${H.source==="default"?" · 默认":""}`))),G("button",{type:"button",className:"ghost-btn codex-workdir-create-btn",disabled:Au||mu||yt,onClick:()=>void IG(),"data-testid":"codex-cwd-create-button"},yt?"处理中":"新建"),G("button",{type:"button",className:"ghost-btn codex-workdir-delete-btn",disabled:Au||mu||yt||!U6,onClick:()=>void aG(),title:U6?"从工作目录下拉菜单删除这个选项,不删除磁盘目录":"当前工作目录尚未保存到下拉菜单","data-testid":"codex-cwd-delete-button"},"删除"))),G("label",null,"最大尝试",G("input",{type:"number",min:1,max:99,value:rf,disabled:Au,onChange:(H)=>Ar(Number(H.target.value)),"data-testid":"codex-max-attempts-input"})),G("label",null,"入队份数",G("input",{type:"number",min:1,max:50,value:Zr,disabled:Au,onChange:(H)=>Zn(Number(H.target.value)),"data-testid":"codex-repeat-count-input"}))),gy>1?G("label",{className:`codex-batch-confirm ${ff?"confirmed":""}`,"data-testid":"codex-batch-confirm-row"},G("input",{type:"checkbox",checked:ff,disabled:Au,onChange:(H)=>ii(Boolean(H.target.checked)),"data-testid":"codex-batch-confirm-checkbox"}),G("span",null,`确认批量入队 ${gy} 个任务(prompt 分段 ${J6.length} × 入队份数 ${RN(Zr)})`)):null,Au?G("div",{className:"codex-submit-wait","data-testid":"codex-submit-wait"},"正在提交到后端,已锁定输入以防重复提交..."):null,G("div",{className:"codex-form-actions"},G("button",{type:"button",className:"ghost-btn",disabled:mu||Au||o.length===0&&pl.length===0,onClick:()=>{ql(""),Bl(""),ii(!1);let H="已清空任务输入栏";Pu(H),pr("success",H)},"data-testid":"codex-clear-input-button"},"清空输入"),G("button",{type:"submit",className:"primary-btn",disabled:VG,"data-testid":"codex-enqueue-button"},Au?"提交中,请等待...":oj?`请确认批量入队 ${gy} 个任务`:Hn.length>1?`批量入队 ${Hn.length} 个任务`:"入队并运行"))))),G("div",{className:"codex-main-stage"},G("div",{className:"codex-detail-grid"},G(ry,{title:"运行控制",eyebrow:Ft?"Queued prompt editable":N6?"Active turn steer":"Steer when running",loading:mu},G("div",{className:"codex-run-control-stack"},G(wO,{task:v,queueRows:Pf,busy:mu,onMove:tT}),v?.id?G("form",{className:"codex-steer-form codex-edit-prompt-form",onSubmit:fT,"data-testid":"codex-edit-prompt-form"},G("label",null,"编辑 queued 用户 prompt",G("textarea",{value:Cl,rows:5,onChange:(H)=>dl(H.target.value),placeholder:"仅 QUEUED 且尚未开始运行的任务可在这里修改原始用户 prompt。",disabled:!Ft||mu,"data-testid":"codex-edit-prompt-textarea"})),G("label",{className:"codex-reference-field"},"引用任务 ID(可选,留空会清除引用)",G("input",{value:ju,disabled:!Ft||mu,onChange:(H)=>ku(H.target.value),placeholder:"codex_...;支持空格/逗号分隔多个 ID","data-testid":"codex-edit-reference-task-id"}),V0(ju).length>0?G("code",null,`将保留/注入:${V0(ju).join(" / ")}`):null),G("div",{className:"codex-form-actions"},G("button",{type:"button",className:"ghost-btn",disabled:!v?.id||mu,onClick:()=>{dl(v?_3(v):""),ku(Array.isArray(v?.referenceTaskIds)?v.referenceTaskIds.join(" "):"")},"data-testid":"codex-edit-prompt-reset"},"恢复当前值"),G("button",{type:"submit",className:"primary-btn",disabled:!Ft||mu||Cl.trim().length===0,title:Ft?"保存后会重写尚未运行任务的用户 prompt":"只有 QUEUED 且尚未开始的任务可编辑 prompt","data-testid":"codex-edit-prompt-submit"},"保存 queued prompt"))):null,G("form",{className:"codex-steer-form",onSubmit:rT},G("label",null,"追加 prompt",G("textarea",{value:fl,rows:4,onChange:(H)=>Dl(H.target.value),placeholder:"给正在运行的 Codex session 推入新的指令或纠偏。",disabled:!N6})),G("button",{type:"submit",className:"primary-btn",disabled:!N6||mu||fl.trim().length===0,"data-testid":"codex-steer-button"},"推入运行中 session")))),G(ry,{title:"完成判定",eyebrow:v?.lastJudge?v.lastJudge.source:"judge",loading:I},v?.lastJudge?G("div",{className:"codex-judge-card","data-testid":"codex-task-judge-card"},G(Y0,{status:v.lastJudge.decision},v.lastJudge.decision),G("strong",null,`${Math.round(Number(v.lastJudge.confidence||0)*100)}% confidence`),G("p",{"data-testid":"codex-task-judge-reason"},Q2(v.lastJudge.reason||"--",180)),G($Q,{judge:v.lastJudge,testId:"codex-task-judge-failure-details"}),v.lastJudge.continuePrompt?G("code",{"data-testid":"codex-task-judge-continue-prompt"},Q2(v.lastJudge.continuePrompt,160)):null):G(P0,{title:"尚未判定",text:"Codex turn 结束后会由 MiniMax M2.7 或 fallback judge 判定 complete/retry/fail;retry 会在已有 thread 追加继续执行 prompt。"}))),G(QO,{stats:_6,queueName:L_,onRaw:u}),G(ry,{title:"Attempts",eyebrow:"terminal vs interruption",loading:I},G(KO,{task:v})))))}var _y=Rl(Ju(),1);var e=_y.default.createElement,{useEffect:p2}=_y.default,cc=_y.default.useState,zO=["all","meeting","decision","goal","blocker","debt","experiment"],EO=["all","G0","G1","G2","G3","P0","P1","P2","P3","none"],OO=["all","active","blocked","parked","done"];function U3({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return e("span",{className:`status-badge ${r}`},u||l||"unknown")}function F3({label:l,value:u,hint:r,tone:f}){return e("article",{className:`metric-card ${f||""}`},e("div",{className:"metric-label"},l),e("div",{className:"metric-value"},u),e("div",{className:"metric-hint"},r))}function wn({title:l,eyebrow:u,actions:r,children:f,className:n,loading:i}){return e("section",{className:`panel ${n||""}`},e("div",{className:"panel-head"},e("div",null,u?e("p",{className:"panel-eyebrow"},u):null,e(fu,{title:l,loading:i})),r?e("div",{className:"panel-actions"},r):null),e("div",{className:"panel-body"},f))}function cy({title:l,data:u,onOpen:r,testId:f}){return e("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function Pi({title:l,text:u}){return e("div",{className:"empty-state"},e("strong",null,l),e("span",null,u))}function ZO(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function pO(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function HO(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function _c(l,u){return`${l}/microservices/decision-center/proxy${u}`}function TQ(l){if(l==="G0"||l==="G1")return"online";if(l==="P0"||l==="P1")return"failed";if(l==="none")return"unknown";return"warn"}function mQ(l){if(l==="done")return"online";if(l==="blocked")return"failed";if(l==="parked")return"warn";return"unknown"}function B2(l){return Wl(l)||"--"}function N3(l,u=220){let r=String(l||"").replace(/\s+/gu," ").trim();return r.length>u?`${r.slice(0,u-1)}...`:r}function J3({record:l,onRaw:u,compact:r}){let f=Array.isArray(l.tags)?l.tags:[],n=Array.isArray(l.evidenceLinks)?l.evidenceLinks:[];return e("article",{className:`decision-record-card ${r?"compact":""}`,"data-testid":`decision-record-${String(l.id||"").replace(/[^A-Za-z0-9_-]+/g,"-")}`},e("div",{className:"decision-record-head"},e("div",null,e("div",{className:"decision-record-meta"},e("span",null,l.type||"--"),e(U3,{status:TQ(l.level)},l.level||"none"),e(U3,{status:mQ(l.status)},l.status||"--")),e("strong",null,l.title||"--")),e(cy,{title:`Decision ${l.id}`,data:l,onOpen:u})),r?e("p",{className:"decision-summary"},N3(l.summary||l.body)):e(d1,{markdown:l.body||l.summary||"",className:"decision-markdown"}),e("div",{className:"decision-record-foot"},l.linkedGoalId?e("code",null,`goal:${l.linkedGoalId}`):null,l.taskId?e("code",null,`task:${l.taskId}`):null,l.commitId?e("code",null,l.commitId.slice(0,12)):null,e("span",null,B2(l.updatedAt))),f.length>0?e("div",{className:"decision-tags"},f.slice(0,8).map((i)=>e("span",{key:i},i))):null,n.length>0?e("div",{className:"decision-evidence"},n.slice(0,4).map((i)=>e("a",{key:i,href:i,target:"_blank",rel:"noreferrer"},N3(i,58)))):null)}function BO({records:l,onRaw:u}){if(!l.length)return e(Pi,{title:"暂无记录",text:"通过 CLI 上传会议记录或决议后会显示在这里。"});return e("div",{className:"table-wrap"},e("table",{className:"decision-table","data-testid":"decision-center-record-table"},e("thead",null,e("tr",null,e("th",null,"等级"),e("th",null,"状态"),e("th",null,"类型"),e("th",null,"标题"),e("th",null,"摘要"),e("th",null,"证据"),e("th",null,"更新"),e("th",null,"操作"))),e("tbody",null,l.map((r)=>e("tr",{key:r.id},e("td",null,e(U3,{status:TQ(r.level)},r.level||"none")),e("td",null,e(U3,{status:mQ(r.status)},r.status||"--")),e("td",null,r.type||"--"),e("td",null,e("strong",null,r.title||"--"),r.linkedGoalId?e("code",null,r.linkedGoalId):null),e("td",null,N3(r.summary||r.body,180)),e("td",null,Array.isArray(r.evidenceLinks)?r.evidenceLinks.length:0),e("td",null,B2(r.updatedAt)),e("td",null,e(cy,{title:`Decision ${r.id}`,data:r,onOpen:u})))))))}function H2(l){return l.map((u)=>e("option",{key:u,value:u},u))}function DO(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 VO(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 SO({entry:l,selected:u,onSelect:r,onRaw:f}){return e("article",{className:`diary-entry-card ${u?"selected":""}`,"data-testid":`diary-entry-${String(l.date||l.id||"").replace(/[^A-Za-z0-9_-]+/g,"-")}`},e("button",{type:"button",className:"diary-entry-main",onClick:()=>r(l)},e("span",{className:"diary-date"},l.date||"--"),e("strong",null,l.title||l.markdownPath||"--"),e("span",null,N3(l.summary||l.body,180))),e("div",{className:"decision-record-foot"},e("code",null,l.markdownPath||"--"),e("span",null,B2(l.updatedAt||l.importedAt)),e(cy,{title:`Diary ${l.date||l.id}`,data:l,onOpen:f})))}function KQ({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((B)=>B.id==="decision-center")||null,[n,i]=cc({loading:!1,error:"",health:null,records:[],refreshedAt:null}),[t,y]=cc({type:"all",status:"all",level:"all",linkedGoalId:""}),[c,$]=cc("records"),[A,j]=cc({loading:!1,error:"",entries:[],months:[],selected:null,refreshedAt:null}),[F,U]=cc({month:"all",from:"",to:""});async function N(){if(!f)return;i((B)=>({...B,loading:!0,error:""}));try{let B=DO(t),m=await ml(_c(r,`/api/records?${B}`)),X=await ml(_c(r,"/api/diary/months")),S=n.health,b="";try{S=await ml(`${r}/microservices/decision-center/health`)}catch(z){b=El(z,"Decision Center health 检查失败")}i({loading:!1,error:b,health:S,records:Array.isArray(m.records)?m.records:[],refreshedAt:new Date}),j((z)=>({...z,months:Array.isArray(X.months)?X.months:[]}))}catch(B){i((m)=>({...m,loading:!1,error:El(B,"Decision Center 加载失败")}))}}async function W(){if(!f)return;j((B)=>({...B,loading:!0,error:""}));try{let B=await ml(_c(r,`/api/diary/entries?${VO(F)}`)),m=await ml(_c(r,"/api/diary/months")),X=Array.isArray(B.entries)?B.entries:[];j((S)=>({loading:!1,error:"",entries:X,months:Array.isArray(m.months)?m.months:S.months,selected:S.selected&&X.some((b)=>b.id===S.selected?.id)?S.selected:X[0]||null,refreshedAt:new Date}))}catch(B){j((m)=>({...m,loading:!1,error:El(B,"日记加载失败")}))}}async function L(B){j((m)=>({...m,selected:B}));try{let m=await ml(_c(r,`/api/diary/entries/${encodeURIComponent(B.date||B.id)}`));j((X)=>({...X,selected:m.entry||B}))}catch(m){j((X)=>({...X,error:El(m,"日记正文加载失败")}))}}if(p2(()=>{N()},[f?.id,f?.runtime?.providerStatus]),p2(()=>{let B=setTimeout(()=>void N(),120);return()=>clearTimeout(B)},[t.type,t.status,t.level,t.linkedGoalId]),p2(()=>{if(c!=="diary")return;let B=setTimeout(()=>void W(),120);return()=>clearTimeout(B)},[c,F.month,F.from,F.to,f?.id,f?.runtime?.providerStatus]),!f)return e(Pi,{title:"Decision Center 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=decision-center"});let J=ZO(f),w=HO(f),Q=pO(f),q=Array.isArray(n.records)?n.records:[],T=q.filter((B)=>B.type==="goal"&&["G0","G1"].includes(B.level)&&B.status!=="done").slice(0,8),O=q.filter((B)=>B.type==="blocker"&&["P0","P1"].includes(B.level)&&B.status!=="done").slice(0,8),Z=q.filter((B)=>B.status==="parked").slice(0,8),E=q.filter((B)=>B.type==="meeting"||B.type==="decision").slice(0,12),D=Array.isArray(A.entries)?A.entries:[],Y=Array.isArray(A.months)?A.months:[],p=A.selected,V=Number(n.health?.diaryEntryCount??0);return e("div",{className:"decision-center-page","data-testid":"decision-center-page"},e(wn,{title:"Decision Center",eyebrow:"Authority Records",loading:n.loading,actions:e("div",{className:"inline-actions"},e("button",{type:"button",className:"ghost-btn",onClick:()=>void N(),disabled:n.loading},n.loading?"刷新中":"刷新"),e(cy,{title:"Decision Center Health",data:n.health,onOpen:u,testId:"raw-decision-center-health"}))},e("div",{className:"decision-hero"},e("div",{className:"metric-grid"},e(F3,{label:"记录数",value:q.length,hint:`PostgreSQL / ${n.health?.storage||"postgres"}`,tone:"ok"}),e(F3,{label:"日记",value:V,hint:"按月 Markdown",tone:V>0?"ok":"warn"}),e(F3,{label:"G0/G1 目标",value:T.length,hint:"active authority goals",tone:"ok"}),e(F3,{label:"P0/P1 Blocker",value:O.length,hint:"requires decision",tone:O.length>0?"warn":"ok"})),e("div",{className:"microservice-ref-card"},e("span",null,"Runtime"),e("strong",null,J.orchestrator||f.deployment?.mode||"k3sctl"),e("code",null,`${f.providerId} / ${Q.nodeBindHost||"--"}:${Q.nodePort||"--"}`),e("code",null,w.commitId||"--"))),e(lu,{error:n.error,title:"Decision Center 请求失败"})),e("div",{className:"decision-tabs",role:"tablist"},e("button",{type:"button",className:c==="records"?"active":"",onClick:()=>$("records")},"权威记录"),e("button",{type:"button",className:c==="diary"?"active":"",onClick:()=>$("diary")},"工作日记")),c==="diary"?e(_y.default.Fragment,null,e(wn,{title:"日记筛选",eyebrow:"Markdown by Month",loading:A.loading,actions:e("div",{className:"inline-actions"},e("button",{type:"button",className:"ghost-btn",onClick:()=>void W(),disabled:A.loading},A.loading?"刷新中":"刷新"),e(cy,{title:"Diary Months",data:Y,onOpen:u,testId:"raw-decision-center-diary-months"}))},e("div",{className:"decision-filter-bar"},e("label",null,"月份",e("select",{value:F.month,onChange:(B)=>U((m)=>({...m,month:B.target.value}))},e("option",{value:"all"},"all"),Y.map((B)=>e("option",{key:B.month,value:B.month},`${B.month} (${B.count})`)))),e("label",null,"开始日期",e("input",{type:"date",value:F.from,onChange:(B)=>U((m)=>({...m,from:B.target.value}))})),e("label",null,"结束日期",e("input",{type:"date",value:F.to,onChange:(B)=>U((m)=>({...m,to:B.target.value}))})),e("label",null,"存储",e("input",{value:"PostgreSQL / YYYY-MM/YYYY-MM-DD.md",readOnly:!0}))),e(lu,{error:A.error,title:"日记请求失败"})),e("div",{className:"diary-layout"},e(wn,{title:"按天条目",eyebrow:`${D.length} Entries`,loading:A.loading},D.length===0?e(Pi,{title:"暂无日记",text:"使用 CLI 导入按日期标题拆分的工作日志 Markdown。"}):e("div",{className:"diary-entry-list"},D.map((B)=>e(SO,{key:B.id,entry:B,selected:p?.id===B.id,onSelect:L,onRaw:u})))),e(wn,{title:p?.title||"日记正文",eyebrow:p?.markdownPath||"Daily Markdown",actions:p?e(cy,{title:`Diary ${p.date}`,data:p,onOpen:u,testId:"raw-decision-center-diary-selected"}):null},p?e(d1,{markdown:p.body||p.summary||"",className:"decision-markdown diary-markdown"}):e(Pi,{title:"未选择日记",text:"从左侧选择一天查看 Markdown 正文。"})))):e(_y.default.Fragment,null,e(wn,{title:"筛选",eyebrow:"Type / Status / Level"},e("div",{className:"decision-filter-bar","data-testid":"decision-center-filters"},e("label",null,"类型",e("select",{value:t.type,onChange:(B)=>y((m)=>({...m,type:B.target.value}))},H2(zO))),e("label",null,"状态",e("select",{value:t.status,onChange:(B)=>y((m)=>({...m,status:B.target.value}))},H2(OO))),e("label",null,"等级",e("select",{value:t.level,onChange:(B)=>y((m)=>({...m,level:B.target.value}))},H2(EO))),e("label",null,"Linked Goal",e("input",{value:t.linkedGoalId,onChange:(B)=>y((m)=>({...m,linkedGoalId:B.target.value})),placeholder:"goal id"})))),e("div",{className:"decision-default-grid"},e(wn,{title:"G0/G1 目标",eyebrow:`${T.length} Goals`},T.length===0?e(Pi,{title:"暂无当前目标",text:"目标记录使用 type=goal 且 level=G0/G1。"}):e("div",{className:"decision-card-list"},T.map((B)=>e(J3,{key:B.id,record:B,onRaw:u,compact:!0})))),e(wn,{title:"P0/P1 Blocker",eyebrow:`${O.length} Blockers`},O.length===0?e(Pi,{title:"暂无高优先级阻塞",text:"阻塞记录使用 type=blocker 且 level=P0/P1。"}):e("div",{className:"decision-card-list"},O.map((B)=>e(J3,{key:B.id,record:B,onRaw:u,compact:!0})))),e(wn,{title:"停放事项",eyebrow:`${Z.length} Parked`},Z.length===0?e(Pi,{title:"暂无停放事项",text:"status=parked 的记录会集中展示。"}):e("div",{className:"decision-card-list"},Z.map((B)=>e(J3,{key:B.id,record:B,onRaw:u,compact:!0})))),e(wn,{title:"最近会议/决议",eyebrow:`${E.length} Recent`},E.length===0?e(Pi,{title:"暂无会议或决议",text:"使用 CLI 上传 Markdown 会议记录后会显示。"}):e("div",{className:"decision-card-list"},E.map((B)=>e(J3,{key:B.id,record:B,onRaw:u,compact:!0}))))),e(wn,{title:"全部记录",eyebrow:`${q.length} Records`,actions:n.refreshedAt?e("span",{className:"muted"},`刷新 ${iu(n.refreshedAt)}`):null},e(BO,{records:q,onRaw:u}))))}var $c=Rl(Ju(),1);var Vl=$c.default.createElement,{useEffect:D2}=$c.default,V2=$c.default.useState,XO=$c.default.useRef,X2=` +不会删除磁盘上的实际目录。`)))return;Fi(!0),await Br(async()=>{let o=await Yu(Xu(r,`/api/workdirs/${encodeURIComponent(ir)}/${encodeURIComponent(Nl)}/${encodeURIComponent(Z)}`),{method:"DELETE"});Ai((jl)=>({...jl||{},...o}));let ul=`已从下拉菜单删除工作目录:${Z}`;hu(ul),Hr("success",ul)},"删除工作目录失败"),Fi(!1)}async function KW(){let Z=typeof window>"u"?"":window.prompt("输入新的 Codex queue ID(字母/数字/._-,最长 64)","new-lane"),C=String(Z||"").trim();if(!C)return;await Br(async()=>{let o=await Yu(Xu(r,"/api/queues"),{method:"POST",body:{queueId:C}}),ul=String(o?.queue?.id||C);nu(ul),wu(ul),br(null),A.current="",J.current+=1,a(""),nl(null);let jl=`已创建并切换到 queue:${ul}`;hu(jl),Hr("success",jl),await $f("",!0,ul)},"创建 Codex queue 失败")}async function EW(){let Z=String(vl||"default").trim()||"default",C=jy(sf,Z)||{id:Z,name:Z},o=typeof window>"u"?null:window.prompt(`输入 queue 显示名称(ID 不变:${Z};留空恢复为 ID)`,EQ(C));if(o===null)return;await Br(async()=>{let ul=await Yu(Xu(r,`/api/queues/${encodeURIComponent(Z)}`),{method:"PATCH",body:{name:String(o)}}),jl=ul?.queue||{id:Z,name:String(o||Z)};if(ul?.summary)br((Wl)=>Wl?{...Wl,queue:ul.summary}:Wl);let Kl=`已更新 queue 名称:${P2(jl)}`;hu(Kl),Hr("success",Kl),await $f(A.current,!0,hl)},"修改 Codex queue 名称失败")}function pW(){if(Ni.length===0){hu("没有可合并的其他 queue;请先创建或选择另一个 queue。");return}let Z=Ni.some((C)=>String(C?.id||"")===_r)?_r:"";tr(Z),Or(!0)}async function zW(){let Z=ji;if(Ni.length===0){hu("没有可合并的其他 queue;请先创建或选择另一个 queue。");return}let o=String(_r||""||"").trim();if(!o){hu("请先选择要合并的源 queue。");return}if(o===Z){ju("源 queue 和目标 queue 不能相同。");return}await Br(async()=>{let ul=await Yu(Xu(r,`/api/queues/${encodeURIComponent(Z)}/merge`),{method:"POST",body:{sourceQueueId:o}});if(ul?.summary)br((Wl)=>Wl?{...Wl,queue:ul.summary}:Wl);nu(Z),wu(Z),br(null);let jl=Number(ul?.mergedTaskCount||0),Kl=`已将 queue=${o} 合并到 ${Z},移动 ${jl} 个任务;源 queue 已自动删除。`;hu(Kl),Hr("success",Kl),Or(!1),tr(""),await $f(A.current,!0,Z)},"合并 Codex queue 失败")}async function OW(Z){if(Z.preventDefault(),U.current){hu("任务正在提交中,请等待当前请求完成,已阻止重复提交。");return}if(Yn.length>1&&!yf){ju(`检测到将创建 ${Yn.length} 个任务;请先勾选“确认批量入队”,避免误传多个任务。`);return}U.current=!0,A0(!0),hu("正在提交 Code Queue 任务,请等待后端确认,输入已临时锁定。"),await Br(async()=>{if(Yn.length===0)throw Error("prompt 不能为空");let C=Pi(Tl),o=vl.trim()||"default",ul=[...Yn],jl=(xl)=>({prompt:xl,queueId:o,providerId:ir,executionMode:Nl,model:wr,cwd:Cu,maxAttempts:Number(tf),...C.length>0?{referenceTaskIds:C}:{}}),Kl=ul.length===1?jl(ul[0]):{tasks:ul.map(jl)},Wl=await Yu(Xu(r,ul.length===1?"/api/tasks":"/api/tasks/batch"),{method:"POST",body:Kl}),Rl=Wl?.tasks?.[0]?.id||"",Hl=Array.isArray(Wl?.tasks)?Wl.tasks.map((xl)=>String(xl?.id||"")).filter(Boolean):[],Yl=`已创建 ${Hl.length||ul.length} 个任务${Hl.length>0?`:${Hl.join(" / ")}`:""}`;if(NW(Array.isArray(Wl?.tasks)?Wl.tasks:[],Wl?.queue||null),hu(Yl),Hr("success",Yl),yl(""),Zl(""),ct(!1),nu(o),Rl&&X8(Wl?.tasks?.[0],hl)&&P8(Wl?.tasks?.[0]))_t(String(Rl),!1).catch((xl)=>ju(Su(xl,"加载 Codex Trace Summary 失败")))},"Codex 任务入队失败"),U.current=!1,A0(!1)}async function ZW(Z){if(Z.preventDefault(),!R?.id)return;await Br(async()=>{await Yu(Xu(r,`/api/tasks/${encodeURIComponent(R.id)}/steer`),{method:"POST",body:{prompt:tl}}),Dl(""),await $f(R.id)},"追加 prompt 失败")}async function HW(Z){Z.preventDefault();let C=String(R?.id||"");if(!C||!L0)return;await Br(async()=>{let o=Pi(Nu),ul=await Yu(Xu(r,`/api/tasks/${encodeURIComponent(C)}/edit`),{method:"POST",body:{prompt:Cl,referenceTaskIds:o}}),jl={...ul?.task||R||{},_traceSummary:null,_traceSummaryLoaded:!1,_traceSummaryUpdatedAt:"",_promptDetails:{},_traceSteps:[],_traceStepsLoaded:!1,_traceStepsByAttempt:{},_traceStepsLoadedByAttempt:{},_traceStepsNextAfterSeqByAttempt:{},_traceStepDetails:{}};E.current.set(C,{...E.current.get(C)||{},task:jl,complete:!1,completeUpdatedAt:""}),A.current=C,nl(jl),a(C),dl(L3(jl)),gu(Array.isArray(jl?.referenceTaskIds)?jl.referenceTaskIds.join(" "):""),br((Wl)=>{if(!Wl)return Wl;let Rl=Vu(Wl).map((Hl)=>String(Hl?.id||"")===C?{...Hl,...jl}:Hl);return{...Wl,queue:ul?.queue||Wl.queue,tasks:Gn([Rl],Ji)}});let Kl=ul?.changed===!1?`任务 ${C} 的 prompt 未变化`:`已更新 queued 任务 ${C} 的用户 prompt`;hu(Kl),Hr("success",Kl),await $f(C,!0,hl)},"编辑 queued 任务 prompt 失败")}async function BW(){if(!R?.id)return;await Br(async()=>{await Yu(Xu(r,`/api/tasks/${encodeURIComponent(R.id)}/interrupt`),{method:"POST",body:{}}),await $f(R.id)},"打断 Codex session 失败")}async function DW(){if(!R?.id)return;await Br(async()=>{await Yu(Xu(r,`/api/tasks/${encodeURIComponent(R.id)}/retry`),{method:"POST",body:{}}),await $f(R.id)},"重新入队失败")}async function SW(Z){let C=String(R?.id||""),o=String(Z||"").trim();if(!C||!o)return;let ul=Ny(R);if(o===ul){hu(`任务 ${C} 已在 queue=${o}`);return}await Br(async()=>{let Kl=(await Yu(Xu(r,`/api/tasks/${encodeURIComponent(C)}/move`),{method:"POST",body:{queueId:o}}))?.task||{...R,queueId:o};if(E.current.set(C,{...E.current.get(C)||{},task:Kl}),A.current=C,nl(Kl),a(C),nu(o),!Cr(hl))br(null),wu(o);let Wl=`已将任务 ${C} 从 ${ul} 移动到 ${o}`;hu(Wl),Hr("success",Wl),await $f(C,!0,Cr(hl)?ht:o)},"移动任务 queue 失败")}async function VW(){let Z=A.current;if(!Z)return;let C=performance.now();await Br(async()=>{Wf({phase:"session",taskId:Z,queueMs:0,totalMs:0,partial:!0,startedAt:new Date}),await _t(Z,!0,C,0)},"刷新 Trace Summary 失败")}function YW(Z){A.current=Z,J.current+=1,a(Z);let C=E.current.get(Z);if(C?.task)nl(C.task),h(!1);else{h(!0);let o=$n.find((ul)=>ul.id===Z);if(o)nl(o);else nl(null)}$f(Z).catch((o)=>ju(Su(o,"切换 Codex session 失败")))}function R8(Z){if(YW(Z),hp())oy(!1)}function Oj(Z,C,o){if(!Z||!Array.isArray(Z?.tasks)||C.length===0||Object.keys(o).length===0)return Z;let ul=!1,jl=Vu(Z).map((Kl)=>{if(String(Kl?.id||"")!==C)return Kl;return ul=!0,D$(mQ(Kl,o))});return ul?{...Z,tasks:jl}:Z}function XW(Z,C){br((o)=>Oj(o,Z,C)),Ll((o)=>Oj(o,Z,C))}function PW(Z,C,o){let ul=String(Z?.type||"");if(ul==="queue-updated")return!0;if(ul==="trace-stats-updated"||ul==="trace-step-created")return!1;if(C.length===0)return!0;if(!o)return!0;if(Z?.queueId&&String(Z.queueId)!==Ny(o))return!0;if(Z?.status&&String(Z.status)!==String(o?.status||""))return!0;return String(Z?.reason||"")!=="output"}function Zj(){if(!t||!z2())return;if(O.current!==null)window.clearTimeout(O.current);O.current=window.setTimeout(()=>{O.current=null,$f(A.current,!1).catch((Z)=>ju(Su(Z,"Code Queue 事件刷新失败")))},120)}function CW(Z,C){if(!t||!z2()||A.current!==Z)return;if(B.current=B.current||C,z.current!==null)return;z.current=window.setTimeout(()=>{z.current=null;let o=B.current;if(B.current=!1,_t(Z,!0).catch((ul)=>ju(Su(ul,"事件刷新 Trace Summary 失败"))),o)wW(Z)},250)}function hW(Z){let C=_u(Z?.payload)||Z,o=_u(C?.stats),ul=String(Z?.type||C?.type||""),jl=String(C?.subjectKind||o?.subjectKind||""),Kl=String(C?.scopeId||o?.scopeId||""),Wl=String(C?.taskId||(jl==="task"?C?.subjectId:"")||o?.taskId||Z?.taskId||""),Rl=C?.attemptIndex??o?.attemptIndex,Hl=Rl===null||Rl===void 0||Rl===""?null:un(Rl),Yl=o||_u(C?.traceStats),xl=Yl?.stepCount??Yl?.llmStepCount,cu=Yl?.outputMaxSeq;return{...C,type:ul,eventId:Z?.eventId||C?.eventId,sequence:Z?.sequence??C?.sequence,taskId:Wl,subjectKind:jl,scopeId:Kl,attemptIndex:Hl,stepCount:xl,outputMaxSeq:cu,updatedAt:Yl?.updatedAt||C?.updatedAt||Z?.createdAt,traceStats:Yl,statsSource:Yl?"oa-event-flow":C?.statsSource}}function sW(Z){let C=hW(Z),o=String(C?.taskId||""),ul=String(C?.scopeId||C?.traceStats?.scopeId||""),jl=String(C?.subjectKind||C?.traceStats?.subjectKind||"")==="task-attempt"||Number(C?.attemptIndex)>0||/:attempt:\d+$/u.test(ul),Kl=NQ(C?.stepCount),Wl={},Rl=o.length>0?Vu(S.current).find((Hl)=>String(Hl?.id||"")===o):null;if(o.length>0){if(C?.status)Wl.status=String(C.status);if(C?.updatedAt)Wl.updatedAt=String(C.updatedAt);if(C?.queueId)Wl.queueId=String(C.queueId);if(!jl&&Number.isFinite(Number(C?.stepCount)))Wl.stepCount=Kl,Wl.llmStepCount=Kl;if(!jl&&Number.isFinite(Number(C?.outputMaxSeq)))Wl.outputMaxSeq=NQ(C.outputMaxSeq);if(!jl&&_u(C?.traceStats))Wl.traceStats=C.traceStats,Wl.statsSource="oa-event-flow";if(Object.keys(Wl).length>0&&(E.current.has(o)||A.current===o))Mf(o,Wl,J.current);if(Object.keys(Wl).length>0)XW(o,Wl);if(A.current===o&&(C?.type==="trace-step-created"||C?.type==="task-updated"||C?.type==="trace-stats-updated")){let Hl=nz(Rl),Yl=C?.type==="trace-step-created"||C?.type==="trace-stats-updated"&&Number.isFinite(Number(C?.stepCount))&&(jl||Hl===null||Kl>Hl);CW(o,Yl)}}if(PW(C,o,Rl))Zj()}Wn(()=>{if(H.current){H.current=!1;return}Br(()=>$f(A.current),"Code Queue 加载失败")},[t?.id,hl]),Wn(()=>{if(!t||typeof EventSource>"u")return;let Z=new EventSource(Dp(r),{withCredentials:!0}),C=(ul)=>{try{sW(JSON.parse(String(ul.data||"{}")))}catch(jl){ju(Su(jl,"解析 Code Queue 事件失败"))}},o=()=>{if(z2())Zj()};return Z.addEventListener("trace-step-created",C),Z.addEventListener("task-updated",C),Z.addEventListener("queue-updated",C),Z.addEventListener("trace-stats-updated",C),document.addEventListener("visibilitychange",o),()=>{if(Z.close(),document.removeEventListener("visibilitychange",o),O.current!==null)window.clearTimeout(O.current),O.current=null;if(z.current!==null)window.clearTimeout(z.current),z.current=null}},[t?.id,r,hl]),Wn(()=>{if(!t||!R||d)return;let Z=String(R.id||"");if(!Z)return;let C=String(R.updatedAt||"");if(m3(R))return;let o=`${Z}:${C||"unknown"}:${String(R?._traceSummaryUpdatedAt||"")}`;if(p.current.has(o))return;p.current.add(o),_t(Z,!0).catch((ul)=>ju(Su(ul,"自动加载 Trace Summary 失败")))},[t?.id,R?.id,R?.updatedAt,R?.traceStats?.statsRevision,R?._traceSummaryUpdatedAt,R?._traceSummaryLoaded,d]),Wn(()=>{if(!t||!R||d)return;let Z=String(R.id||""),C=Number(Jr(R)?.currentAttempt||R?.currentAttempt||0);if(!Z||!PQ(R)||!Number.isFinite(C)||C<=0)return;if(G3(R,C))return;let o=`${Z}:current-attempt:${C}:${String(R?.updatedAt||"")}`;if(p.current.has(o))return;p.current.add(o),V$(C).catch((ul)=>ju(Su(ul,"自动加载当前 Attempt Trace Steps 失败")))},[t?.id,R?.id,R?.status,R?.currentAttempt,R?.updatedAt,R?._traceSummaryUpdatedAt,d]),Wn(()=>{if(!t)return;M8().catch((Z)=>ju(Su(Z,"加载工作目录失败")));return},[t?.id]);let MW=_n.length===0?G(Ri,{title:cf?Ql?"搜索中":"没有匹配任务":"队列为空",text:cf?Ql?`正在搜索包含“${w0}”的 task...`:`未找到包含“${w0}”的 task;可换个关键词或切换 queue。`:"提交一个任务后,Codex 会串行执行并保存输出。"}):[wj.length>0?G(Y2,{key:"unread",title:"已结束未读",tasks:wj,selectedId:I,emptyText:"暂无已结束未读任务。",onSelect:R8,onCopy:C8,onReference:h8,onMarkRead:s8,copiedTaskId:F0,markingReadTaskId:j0}):null,G(Y2,{key:"active",title:"运行 / 排队",tasks:nW,selectedId:I,emptyText:"当前没有运行或排队任务。",onSelect:R8,onCopy:C8,onReference:h8,onMarkRead:s8,copiedTaskId:F0,markingReadTaskId:j0}),G(Y2,{key:"history",title:"历史 session",tasks:tW,selectedId:I,emptyText:"最近没有完成、失败或取消的 session。",onSelect:R8,onCopy:C8,onReference:h8,onMarkRead:s8,copiedTaskId:F0,markingReadTaskId:j0}),G("div",{key:"pagination",className:"codex-task-pagination","data-testid":"codex-task-pagination"},G("span",null,cf?`搜索“${w0}” · 已显示 ${_n.length} / ${Number.isFinite(q0)?q0:_n.length}`:`已加载 ${_n.length} / ${Number.isFinite(q0)?q0:_n.length}`),Lj?G("button",{type:"button",className:"ghost-btn",disabled:B8,onClick:()=>void zj(),"data-testid":"codex-load-more-tasks-button"},B8?"加载中":cf?"加载更多结果":"加载更早任务"):G("code",null,cf?"已到结果末尾":"已到队列末尾"))],Hj=(Z,C=!1)=>G("label",{className:`code-queue-switcher ${C?"compact":""}`},G("span",null,C?"Queue":"查看 queue"),G("select",{value:hl,onChange:(o)=>GW(String(o.target.value||ht)),"data-testid":Z},G("option",{value:ht},`All queues · ${Number.isFinite($t)?$t:$n.length} tasks · ${rc.length} running`),sf.map((o)=>G("option",{key:String(o?.id||""),value:String(o?.id||"")},F1(o))))),RW=G("div",{className:"codex-task-search","data-testid":"codex-task-search"},G("label",{htmlFor:"codex-task-search-input"},"搜索 task"),G("div",{className:"codex-task-search-row"},G("input",{id:"codex-task-search-input",type:"search",value:rl,placeholder:"关键词 / task ID / prompt",autoComplete:"off",onChange:(Z)=>_l(String(Z.target.value||"")),"data-testid":"codex-task-search-input"}),rl?G("button",{type:"button",className:"ghost-btn",onClick:()=>_l(""),"data-testid":"codex-task-search-clear"},"清除"):null),G("small",{"data-testid":"codex-task-search-summary"},cf?Ql?"搜索中...":`匹配 ${_n.length}/${Number.isFinite(q0)?q0:_n.length}`:"支持 task ID、prompt、状态、provider、模型和最近输出关键词")),xW=G("div",{className:"codex-trace-status","data-testid":"codex-trace-status-summary"},G("span",{className:"codex-trace-status-chip queued"},G("b",null,"排队"),String(O8)),G("span",{className:"codex-trace-status-chip running"},G("b",null,"运行"),String(Z8)),G("span",{className:`codex-trace-status-chip unread ${m0>0?"warn":""}`},G("b",null,"结束未读"),String(m0)),G("span",{className:"codex-trace-status-chip service"},G("b",null,"服务"),`${iW.providerStatus||"unknown"} · ${t?.providerId||"D601"} · ${yW.public?"公网暴露":"仅 UniDesk frontend 代理访问"}`),G("span",{className:"codex-trace-status-chip"},G("b",null,"执行节点"),B$.map((Z)=>Z.id).join(" / ")),G("span",{className:"codex-trace-status-chip"},G("b",null,"执行模式"),Tj.map((Z)=>Z.id).join(" / ")),G("span",{className:"codex-trace-status-chip"},G("b",null,"模型"),Wj.join(" / ")),G("span",{className:"codex-trace-status-chip"},G("b",null,"加载"),xr?.phase==="complete"?Zp(xr?.totalMs):String(xr?.phase||"idle")),G("span",{className:"codex-trace-status-chip"},G("b",null,"刷新"),p$?tu(p$):"--")),bW=G(Ci,{title:R?`Trace ${String(R.id).slice(0,22)}`:"Trace 输出",eyebrow:R?`${R.status} / view=${H$} / task queue=${Ny(R)} / provider=${R.providerId||"D601"} / mode=${R.executionMode||"default"} / ${R.model} / agent loop trace`:`Agent loop trace / view=${H$}`,summary:xW,loading:d||lc||Ql||s||xr?.phase==="loading",actions:G("div",{className:"panel-actions"},Hj("code-queue-filter-select"),G("button",{type:"button",className:"ghost-btn codex-mark-all-read-btn",disabled:m0===0||Tu||ey,onClick:()=>void LW(),"data-testid":"codex-mark-all-read-button"},ey?"标记中":`全部标已读${m0>0?` (${m0})`:""}`),R?G("button",{type:"button",className:"ghost-btn",disabled:d||Tu,onClick:()=>void VW(),"data-testid":"codex-load-full-trace-button"},d?"加载中":Jr(R)?"刷新 Summary":"加载 Summary"):null,G("button",{type:"button",className:"codex-session-title-toggle",onClick:()=>oy((Z)=>!Z),"data-testid":"code-queue-sidebar-toggle"},hf?"收起队列":"展开队列"),G("label",{className:"inline-check"},G("input",{type:"checkbox",checked:Au,onChange:(Z)=>qr(Boolean(Z.target.checked))}),"自动滚动"),G("button",{type:"button",className:"ghost-btn",disabled:!_W||Tu,onClick:()=>void BW(),"data-testid":"codex-interrupt-button"},"打断"),G("button",{type:"button",className:"ghost-btn",disabled:!AW||Tu,onClick:()=>void DW()},"重试"),R?G(R2,{title:"Codex Task",data:R,onOpen:u,testId:"raw-codex-task"}):null),className:"codex-output-panel"},G("div",{className:`codex-session-shell ${hf?"":"queue-collapsed"}`},hf?G("aside",{className:"codex-session-sidebar","data-testid":"codex-session-sidebar"},G("div",{className:"codex-session-sidebar-head"},G("div",null,G("span",null,Cr(hl)?"All queues":"Queue lane"),G("strong",null,`${H$} · ${$n.length}/${Number.isFinite($t)?$t:$n.length} sessions · 未读 ${m0}`)),G("button",{type:"button",className:"ghost-btn",onClick:()=>oy(!1)},"收起")),Hj("code-queue-filter-sidebar",!0),RW,G("div",{className:"codex-task-list codex-task-list-session",onScroll:qW,"data-testid":"codex-task-list-scroll"},MW)):null,G("div",{className:"codex-session-main"},G("div",{className:"codex-output-stack"},G(uO,{task:R,loading:d,onLoadPromptPart:QW,onLoadSteps:V$,onLoadStep:mW}),G(rO,{task:R})))));if(!t)return G(Ri,{title:"Code Queue 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=code-queue"});let Bj=Number(xr?.totalMs),Dj=Number(xr?.queueMs),Sj=Number(xr?.detailMs),Vj=Number(xr?.transcriptRows),vW=xr?.phase==="complete"?"complete":String(xr?.phase||"idle"),gW=jy(sf,ji)||{id:ji,name:ji},kW=mr?G(tQ,{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:()=>Or(!1),actions:[G("button",{key:"cancel",type:"button",className:"ghost-btn",onClick:()=>Or(!1),disabled:Tu,"data-testid":"codex-merge-queue-cancel"},"取消"),G("button",{key:"confirm",type:"button",className:"primary-btn",onClick:()=>void zW(),disabled:Tu||Fu||!_r,"data-testid":"codex-merge-queue-confirm"},Tu?"合并中...":"确认合并")]},G("p",{className:"codex-merge-dialog-target"},"目标 queue:",G("code",null,F1(gW))),G("label",null,"源 queue",G("select",{value:_r,disabled:Tu||Fu,onChange:(Z)=>tr(String(Z.target.value||"")),"data-testid":"codex-merge-source-queue-select"},G("option",{value:""},"选择要合并进来的源 queue"),Ni.map((Z)=>G("option",{key:String(Z?.id||""),value:String(Z?.id||"")},F1(Z))))),G("p",{className:"codex-merge-dialog-note"},"会把源 queue 的任务归属合并到目标 queue,并自动删除源 queue;目标 queue 会按原 queueEnteredAt/createdAt 时间顺序运行。")):null;return G("div",{className:`code-queue-page ${n?"codex-standalone-page":""}`,"data-testid":"code-queue-page","data-load-state":vW,"data-load-total-ms":Number.isFinite(Bj)?String(Math.round(Bj*10)/10):"","data-load-queue-ms":Number.isFinite(Dj)?String(Math.round(Dj*10)/10):"","data-load-detail-ms":Number.isFinite(Sj)?String(Math.round(Sj*10)/10):"","data-load-transcript-rows":Number.isFinite(Vj)?String(Vj):"","data-load-task-id":String(xr?.taskId||I||""),"data-load-partial":xr?.partial?"true":"false"},G(el,{error:K8,wide:!0}),kW,G("div",{className:"codex-session-stage codex-session-stage-top"},G(kz,{diagnostics:E8,queue:zu,onRaw:u}),bW),G("div",{className:"code-queue-layout"},G("div",{className:"codex-left-rail"},G(Ci,{title:"提交任务",eyebrow:Fu?"Submitting...":Yn.length>1?`${Yn.length} tasks`:"Single or Batch",className:"codex-compose-panel",loading:Fu},G("form",{className:`codex-task-form ${Fu?"is-submitting":""}`,onSubmit:OW,"data-testid":"code-queue-task-form","aria-busy":Fu?"true":"false"},G("label",null,"Prompt / 多任务用单独一行 --- 分隔",G("textarea",{value:g,rows:8,disabled:Fu,onChange:(Z)=>yl(Z.target.value),placeholder:"写入 Codex 任务;多个任务之间用 --- 分隔。"})),G("label",{className:"codex-reference-field"},"引用任务 ID(可选)",G("input",{value:Tl,disabled:Fu,onChange:(Z)=>Zl(Z.target.value),placeholder:"codex_...;支持空格/逗号分隔多个 ID","data-testid":"codex-reference-task-id"}),Pi(Tl).length>0?G("code",null,`后端将解析并注入:${Pi(Tl).join(" / ")}`):null),G("div",{className:"codex-form-grid"},G("label",{className:"codex-submit-queue-field"},"Queue",G("div",{className:"codex-submit-queue-row"},G("select",{className:"codex-submit-queue-select",value:vl,disabled:Fu,onChange:(Z)=>nu(String(Z.target.value||"default")),"data-testid":"code-queue-id-select"},sf.map((Z)=>G("option",{key:String(Z?.id||""),value:String(Z?.id||"")},F1(Z)))),G("button",{type:"button",className:"ghost-btn codex-rename-queue-btn",onClick:()=>void EW(),disabled:Tu||Fu||!vl,title:"修改当前 queue 的显示名称,ID 不变","data-testid":"codex-rename-queue-button"},"改名"),G("button",{type:"button",className:"ghost-btn codex-merge-queue-btn",onClick:()=>pW(),disabled:Tu||Fu||Ni.length===0,title:"打开独立窗口选择源 queue 并合并到当前 queue;合并后自动删除源 queue","data-testid":"codex-merge-queue-button"},"合并 queue"),G("button",{type:"button",className:"ghost-btn codex-create-queue-btn",onClick:()=>void KW(),disabled:Tu||Fu,"data-testid":"codex-create-queue-button"},"创建 queue"))),G("label",null,"模型",G("select",{value:wr,disabled:Fu,onChange:(Z)=>sl(Z.target.value),"data-testid":"codex-model-select"},Wj.map((Z)=>G("option",{key:Z,value:Z},Z)))),G("label",null,"执行 Provider",G("select",{value:ir,disabled:Fu,onChange:(Z)=>JW(String(Z.target.value||"D601")),"data-testid":"codex-provider-select"},B$.map((Z)=>G("option",{key:Z.id,value:Z.id},`${Z.label||Z.id} · ${Z.defaultWorkdir||d2(zu,Z.id)}${Z.supportsWindowsNativeCodex?" · Windows native":""}`)))),G("label",null,"执行模式",G("select",{value:Nl,disabled:Fu,onChange:(Z)=>UW(String(Z.target.value||"default")),"data-testid":"codex-execution-mode-select"},Tj.map((Z)=>G("option",{key:Z.id,value:Z.id},`${Z.label||Z.id}${Z.id==="windows-native"?" · 宿主 Codex":""}`)))),G("label",{className:"codex-workdir-field"},"工作目录",G("div",{className:"codex-workdir-row"},G("input",{value:Cu,disabled:Fu,onChange:(Z)=>eu(Z.target.value),placeholder:Kj||zu?.defaultWorkdir||"/workspace","data-testid":"codex-cwd-input"}),G("select",{value:Jy(Cu),disabled:Fu||N0,onChange:(Z)=>eu(String(Z.target.value||"")),"data-testid":"codex-cwd-select"},Ej.map((Z)=>G("option",{key:`${Z.providerId}:${Z.executionMode}:${Z.path}`,value:Z.path},`${Z.path}${Z.source==="default"?" · 默认":""}`))),G("button",{type:"button",className:"ghost-btn codex-workdir-create-btn",disabled:Fu||Tu||N0,onClick:()=>void WW(),"data-testid":"codex-cwd-create-button"},N0?"处理中":"新建"),G("button",{type:"button",className:"ghost-btn codex-workdir-delete-btn",disabled:Fu||Tu||N0||!S8,onClick:()=>void TW(),title:S8?"从工作目录下拉菜单删除这个选项,不删除磁盘目录":"当前工作目录尚未保存到下拉菜单","data-testid":"codex-cwd-delete-button"},"删除"))),G("label",null,"最大尝试",G("input",{type:"number",min:1,max:99,value:tf,disabled:Fu,onChange:(Z)=>Ar(Number(Z.target.value)),"data-testid":"codex-max-attempts-input"})),G("label",null,"入队份数",G("input",{type:"number",min:1,max:50,value:Zr,disabled:Fu,onChange:(Z)=>Vn(Number(Z.target.value)),"data-testid":"codex-repeat-count-input"}))),fc>1?G("label",{className:`codex-batch-confirm ${yf?"confirmed":""}`,"data-testid":"codex-batch-confirm-row"},G("input",{type:"checkbox",checked:yf,disabled:Fu,onChange:(Z)=>ct(Boolean(Z.target.checked)),"data-testid":"codex-batch-confirm-checkbox"}),G("span",null,`确认批量入队 ${fc} 个任务(prompt 分段 ${D8.length} × 入队份数 ${jQ(Zr)})`)):null,Fu?G("div",{className:"codex-submit-wait","data-testid":"codex-submit-wait"},"正在提交到后端,已锁定输入以防重复提交..."):null,G("div",{className:"codex-form-actions"},G("button",{type:"button",className:"ghost-btn",disabled:Tu||Fu||g.length===0&&Tl.length===0,onClick:()=>{yl(""),Zl(""),ct(!1);let Z="已清空任务输入栏";hu(Z),Hr("success",Z)},"data-testid":"codex-clear-input-button"},"清空输入"),G("button",{type:"submit",className:"primary-btn",disabled:cW,"data-testid":"codex-enqueue-button"},Fu?"提交中,请等待...":Gj?`请确认批量入队 ${fc} 个任务`:Yn.length>1?`批量入队 ${Yn.length} 个任务`:"入队并运行"))))),G("div",{className:"codex-main-stage"},G("div",{className:"codex-detail-grid"},G(Ci,{title:"运行控制",eyebrow:L0?"Queued prompt editable":V8?"Active turn steer":"Steer when running",loading:Tu},G("div",{className:"codex-run-control-stack"},G(az,{task:R,queueRows:sf,busy:Tu,onMove:SW}),R?.id?G("form",{className:"codex-steer-form codex-edit-prompt-form",onSubmit:HW,"data-testid":"codex-edit-prompt-form"},G("label",null,"编辑 queued 用户 prompt",G("textarea",{value:Cl,rows:5,onChange:(Z)=>dl(Z.target.value),placeholder:"仅 QUEUED 且尚未开始运行的任务可在这里修改原始用户 prompt。",disabled:!L0||Tu,"data-testid":"codex-edit-prompt-textarea"})),G("label",{className:"codex-reference-field"},"引用任务 ID(可选,留空会清除引用)",G("input",{value:Nu,disabled:!L0||Tu,onChange:(Z)=>gu(Z.target.value),placeholder:"codex_...;支持空格/逗号分隔多个 ID","data-testid":"codex-edit-reference-task-id"}),Pi(Nu).length>0?G("code",null,`将保留/注入:${Pi(Nu).join(" / ")}`):null),G("div",{className:"codex-form-actions"},G("button",{type:"button",className:"ghost-btn",disabled:!R?.id||Tu,onClick:()=>{dl(R?L3(R):""),gu(Array.isArray(R?.referenceTaskIds)?R.referenceTaskIds.join(" "):"")},"data-testid":"codex-edit-prompt-reset"},"恢复当前值"),G("button",{type:"submit",className:"primary-btn",disabled:!L0||Tu||Cl.trim().length===0,title:L0?"保存后会重写尚未运行任务的用户 prompt":"只有 QUEUED 且尚未开始的任务可编辑 prompt","data-testid":"codex-edit-prompt-submit"},"保存 queued prompt"))):null,G("form",{className:"codex-steer-form",onSubmit:ZW},G("label",null,"追加 prompt",G("textarea",{value:tl,rows:4,onChange:(Z)=>Dl(Z.target.value),placeholder:"给正在运行的 Codex session 推入新的指令或纠偏。",disabled:!V8})),G("button",{type:"submit",className:"primary-btn",disabled:!V8||Tu||tl.trim().length===0,"data-testid":"codex-steer-button"},"推入运行中 session")))),G(Ci,{title:"完成判定",eyebrow:R?.lastJudge?R.lastJudge.source:"judge",loading:d},R?.lastJudge?G("div",{className:"codex-judge-card","data-testid":"codex-task-judge-card"},G(Mi,{status:R.lastJudge.decision},R.lastJudge.decision),G("strong",null,`${Math.round(Number(R.lastJudge.confidence||0)*100)}% confidence`),G("p",{"data-testid":"codex-task-judge-reason"},W3(R.lastJudge.reason||"--",180)),G(BQ,{judge:R.lastJudge,testId:"codex-task-judge-failure-details"}),R.lastJudge.continuePrompt?G("code",{"data-testid":"codex-task-judge-continue-prompt"},W3(R.lastJudge.continuePrompt,160)):null):G(Ri,{title:"尚未判定",text:"Codex turn 结束后会由 MiniMax M2.7 或 fallback judge 判定 complete/retry/fail;retry 会在已有 thread 追加继续执行 prompt。"}))),G(Iz,{stats:p8,queueName:H$,onRaw:u}),G(Ci,{title:"Attempts",eyebrow:"terminal vs interruption",loading:d},G(fO,{task:R})))))}var my=Ml(Ju(),1);var M=my.default.createElement,{useEffect:e2}=my.default,Tn=my.default.useState,gQ=["all","meeting","decision","goal","blocker","debt","experiment"],kQ=["all","G0","G1","G2","G3","P0","P1","P2","P3","none"],IQ=["all","active","blocked","parked","done"],nO=[{id:"all",label:"全部需求"},{id:"external-goal",label:"外部目标"},{id:"internal-goal",label:"内部目标"},{id:"blocker",label:"阻塞"},{id:"parked",label:"停放事项"},{id:"authority",label:"决议/实验/债务"}],u5=[{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"]}],m1="frontend-work-diary.md";function w1({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return M("span",{className:`status-badge ${r}`},u||l||"unknown")}function z3({label:l,value:u,hint:r,tone:f}){return M("article",{className:`metric-card ${f||""}`},M("div",{className:"metric-label"},l),M("div",{className:"metric-value"},u),M("div",{className:"metric-hint"},r))}function hr({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return M("section",{className:`panel ${n||""}`},M("div",{className:"panel-head"},M("div",null,u?M("p",{className:"panel-eyebrow"},u):null,M(fu,{title:l,loading:t})),r?M("div",{className:"panel-actions"},r):null),M("div",{className:"panel-body"},f))}function Uy({title:l,data:u,onOpen:r,testId:f}){return M("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function rn({title:l,text:u}){return M("div",{className:"empty-state"},M("strong",null,l),M("span",null,u))}function tO(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function iO(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function yO(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function Mt(l,u){return`${l}/microservices/decision-center/proxy${u}`}function aQ(l){if(l==="G0"||l==="G1")return"online";if(l==="P0"||l==="P1")return"failed";if(l==="none")return"unknown";return"warn"}function oQ(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 f5(l){return Gl(l)||"--"}function Z3(l,u=220){let r=String(l||"").replace(/\s+/gu," ").trim();return r.length>u?`${r.slice(0,u-1)}...`:r}function H3(l){return String(l||"").replace(/[^A-Za-z0-9_-]+/g,"-")||"item"}function r5(l){return String(l||"").split(",").map((u)=>u.trim()).filter(Boolean).slice(0,50)}function B3(l){return Array.isArray(l)?l.join(", "):String(l||"")}function l5(l){let u=u5.find((r)=>r.id===l)||u5[0];return{id:"",category:u?.id||"external-goal",type:u?.type||"goal",level:u?.level||"G0",status:u?.status||"active",title:"",body:"",linkedGoalId:"",tags:B3(u?.tags||[]),evidenceLinks:"",sourceSession:"frontend",taskId:"",commitId:""}}function vQ(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:B3(l?.tags),evidenceLinks:B3(l?.evidenceLinks),sourceSession:l?.sourceSession||"frontend",taskId:l?.taskId||"",commitId:l?.commitId||""}}function cO(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:r5(l.tags),evidenceLinks:r5(l.evidenceLinks),sourceSession:String(l.sourceSession||"").trim(),taskId:String(l.taskId||"").trim(),commitId:String(l.commitId||"").trim()}}function D3(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 n5(l){let u=Array.isArray(l.tags)?l.tags.map((r)=>r.toLowerCase()):[];return l.type==="goal"&&l.status!=="blocked"&&l.status!=="parked"&&!D3(l)&&(["G1","G2","G3"].includes(l.level)||u.includes("internal-goal"))}function dQ(l,u){if(u==="external-goal")return D3(l);if(u==="internal-goal")return n5(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 O3(l){let u=l?.date||vi();return{date:u,title:l?.title||`${u} 工作日记`,body:l?.body||"",sourceFile:l?.sourceFile||m1,tags:B3(l?.tags||["frontend"])}}function $O(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 M("article",{className:`decision-record-card ${r?"compact":""}`,"data-testid":`decision-record-${H3(l.id)}`},M("div",{className:"decision-record-head"},M("div",null,M("div",{className:"decision-record-meta"},M("span",null,l.type||"--"),M(w1,{status:aQ(l.level)},l.level||"none"),M(w1,{status:oQ(l.status)},l.status||"--")),M("strong",null,l.title||"--")),M("div",{className:"inline-actions"},f?M("button",{type:"button",className:"ghost-btn",onClick:()=>f(l),"data-testid":`edit-record-${H3(l.id)}`},"编辑"):null,M(Uy,{title:`Decision ${l.id}`,data:l,onOpen:u}))),r?M("p",{className:"decision-summary"},Z3(l.summary||l.body)):M(y1,{markdown:l.body||l.summary||"",className:"decision-markdown"}),M("div",{className:"decision-record-foot"},l.linkedGoalId?M("code",null,`goal:${l.linkedGoalId}`):null,l.taskId?M("code",null,`task:${l.taskId}`):null,l.commitId?M("code",null,l.commitId.slice(0,12)):null,M("span",null,f5(l.updatedAt))),n.length>0?M("div",{className:"decision-tags"},n.slice(0,8).map((i)=>M("span",{key:i},i))):null,t.length>0?M("div",{className:"decision-evidence"},t.slice(0,4).map((i)=>M("a",{key:i,href:i,target:"_blank",rel:"noreferrer"},Z3(i,58)))):null)}function _O({records:l,onRaw:u,onEdit:r}){if(!l.length)return M(rn,{title:"暂无记录",text:"通过 CLI 上传会议记录或决议后会显示在这里。"});return M("div",{className:"table-wrap"},M("table",{className:"decision-table","data-testid":"decision-center-record-table"},M("thead",null,M("tr",null,M("th",null,"等级"),M("th",null,"状态"),M("th",null,"类型"),M("th",null,"标题"),M("th",null,"摘要"),M("th",null,"证据"),M("th",null,"更新"),M("th",null,"操作"))),M("tbody",null,l.map((f)=>M("tr",{key:f.id},M("td",null,M(w1,{status:aQ(f.level)},f.level||"none")),M("td",null,M(w1,{status:oQ(f.status)},f.status||"--")),M("td",null,f.type||"--"),M("td",null,M("strong",null,f.title||"--"),f.linkedGoalId?M("code",null,f.linkedGoalId):null),M("td",null,Z3(f.summary||f.body,180)),M("td",null,Array.isArray(f.evidenceLinks)?f.evidenceLinks.length:0),M("td",null,f5(f.updatedAt)),M("td",null,M("div",{className:"inline-actions"},r?M("button",{type:"button",className:"ghost-btn",onClick:()=>r(f),"data-testid":`table-edit-record-${H3(f.id)}`},"编辑"):null,M(Uy,{title:`Decision ${f.id}`,data:f,onOpen:u}))))))))}function Qy(l){return l.map((u)=>M("option",{key:u,value:u},u))}function AO(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 FO(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 jO({entry:l,selected:u,onSelect:r,onRaw:f}){return M("article",{className:`diary-entry-card ${u?"selected":""}`,"data-testid":`diary-entry-${H3(l.date||l.id)}`},M("button",{type:"button",className:"diary-entry-main",onClick:()=>r(l)},M("span",{className:"diary-date"},l.date||"--"),M("strong",null,l.title||l.markdownPath||"--"),M("span",null,Z3(l.summary||l.body,180))),M("div",{className:"decision-record-foot"},M("code",null,l.markdownPath||"--"),M("span",null,f5(l.updatedAt||l.importedAt)),M(Uy,{title:`Diary ${l.date||l.id}`,data:l,onOpen:f})))}function NO({records:l,activeView:u,onView:r,onEdit:f,onRaw:n}){let t=[{id:"external-goal",title:"外部目标",eyebrow:"G0 / user-facing",records:l.filter(D3)},{id:"internal-goal",title:"内部目标",eyebrow:"G1-G3 / delivery",records:l.filter(n5)},{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 M("div",{className:"requirement-workspace","data-testid":"requirement-workspace"},M("div",{className:"requirement-switcher",role:"tablist","aria-label":"需求视图"},nO.map((i)=>M("button",{key:i.id,type:"button",className:u===i.id?"active":"",onClick:()=>r(i.id),"data-testid":`requirement-filter-${i.id}`},i.label))),M("div",{className:"requirement-lanes"},t.map((i)=>{let y=i.records.filter((c)=>dQ(c,u)).slice(0,10);return M("section",{key:i.id,className:"requirement-lane","data-testid":`requirement-lane-${i.id}`},M("div",{className:"requirement-lane-head"},M("div",null,M("p",{className:"panel-eyebrow"},i.eyebrow),M("strong",null,i.title)),M(w1,{status:i.records.length>0?"unknown":"warn"},i.records.length)),y.length===0?M(rn,{title:"暂无条目",text:"用右侧录入台补齐该类需求或筛选条件。"}):M("div",{className:"decision-card-list"},y.map((c)=>M(bi,{key:c.id,record:c,onRaw:n,onEdit:f,compact:!0}))))})))}function JO({form:l,saving:u,message:r,error:f,onChange:n,onCategory:t,onSubmit:i,onReset:y}){return M("form",{className:"record-editor-form",onSubmit:i,"data-testid":"record-editor"},M("div",{className:"editor-mode-grid"},u5.map((c)=>M("button",{key:c.id,type:"button",className:l.category===c.id?"active":"",onClick:()=>t(c.id),"data-testid":`record-template-${c.id}`},c.label))),M("div",{className:"decision-form-grid"},M("label",null,"标题",M("input",{value:l.title,onChange:(c)=>n("title",c.target.value),placeholder:"需求、阻塞、决议或实验标题","data-testid":"record-title-input"})),M("label",null,"类型",M("select",{value:l.type,onChange:(c)=>n("type",c.target.value),"data-testid":"record-type-select"},Qy(gQ.filter((c)=>c!=="all")))),M("label",null,"等级",M("select",{value:l.level,onChange:(c)=>n("level",c.target.value),"data-testid":"record-level-select"},Qy(kQ.filter((c)=>c!=="all")))),M("label",null,"状态",M("select",{value:l.status,onChange:(c)=>n("status",c.target.value),"data-testid":"record-status-select"},Qy(IQ.filter((c)=>c!=="all")))),M("label",null,"Linked Goal",M("input",{value:l.linkedGoalId,onChange:(c)=>n("linkedGoalId",c.target.value),placeholder:"关联目标 id"})),M("label",null,"Tags",M("input",{value:l.tags,onChange:(c)=>n("tags",c.target.value),placeholder:"external-goal, requirement"})),M("label",{className:"wide"},"正文 Markdown",M("textarea",{value:l.body,onChange:(c)=>n("body",c.target.value),placeholder:`- 背景 +- 验收标准 +- 下一步`,"data-testid":"record-body-editor"})),M("label",null,"证据链接",M("input",{value:l.evidenceLinks,onChange:(c)=>n("evidenceLinks",c.target.value),placeholder:"逗号分隔 URL"})),M("label",null,"Task ID",M("input",{value:l.taskId,onChange:(c)=>n("taskId",c.target.value),placeholder:"可选"})),M("label",null,"Commit ID",M("input",{value:l.commitId,onChange:(c)=>n("commitId",c.target.value),placeholder:"可选"}))),M("div",{className:"dispatch-actions"},M("button",{type:"submit",disabled:u||!String(l.title||"").trim(),"data-testid":"save-record-button"},u?"保存中":l.id?"保存记录":"创建记录"),M("button",{type:"button",className:"ghost-btn",disabled:u,onClick:y},"新建"),l.id?M("code",null,l.id):null),r?M("p",{className:"muted paragraph","data-testid":"record-editor-message"},r):null,M(el,{error:f,title:"记录保存失败",wide:!0}))}function UO({form:l,saving:u,message:r,error:f,onChange:n,onToday:t,onSubmit:i}){return M("form",{className:"diary-editor-form",onSubmit:i,"data-testid":"diary-editor"},M("div",{className:"decision-form-grid diary-editor-grid"},M("label",null,"日期",M("input",{type:"date",value:l.date,onChange:(y)=>n("date",y.target.value),"data-testid":"diary-date-input"})),M("label",null,"标题",M("input",{value:l.title,onChange:(y)=>n("title",y.target.value),placeholder:"工作日记标题"})),M("label",null,"Source File",M("input",{value:l.sourceFile,onChange:(y)=>n("sourceFile",y.target.value),placeholder:m1})),M("label",null,"Tags",M("input",{value:l.tags,onChange:(y)=>n("tags",y.target.value),placeholder:"frontend, daily"})),M("label",{className:"wide"},"Markdown",M("textarea",{value:l.body,onChange:(y)=>n("body",y.target.value),placeholder:`## 今日进展 + +## 阻塞 + +## 下一步`,"data-testid":"diary-body-editor"}))),M("div",{className:"dispatch-actions"},M("button",{type:"button",className:"ghost-btn",onClick:t,disabled:u,"data-testid":"today-diary-button"},"今天"),M("button",{type:"submit",disabled:u||!String(l.date||"").trim(),"data-testid":"save-diary-button"},u?"保存中":"保存日记"),M("code",null,`${String(l.date||vi()).slice(0,7)}/${l.date||vi()}.md`)),r?M("p",{className:"muted paragraph","data-testid":"diary-editor-message"},r):null,M(el,{error:f,title:"日记保存失败",wide:!0}))}function eQ({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((k)=>k.id==="decision-center")||null,[n,t]=Tn({loading:!1,error:"",health:null,records:[],refreshedAt:null}),[i,y]=Tn({type:"all",status:"all",level:"all",linkedGoalId:""}),[c,_]=Tn("records"),[A,F]=Tn("all"),[j,J]=Tn(l5("external-goal")),[U,w]=Tn({saving:!1,error:"",message:""}),[L,N]=Tn({loading:!1,error:"",entries:[],months:[],selected:null,refreshedAt:null}),[Q,m]=Tn({month:"all",from:"",to:""}),[q,W]=Tn(O3({date:vi(),title:`${vi()} 工作日记`,tags:["frontend"]})),[p,O]=Tn({saving:!1,error:"",message:""});async function z(){if(!f)return;t((k)=>({...k,loading:!0,error:""}));try{let k=AO(i),g=await El(Mt(r,`/api/records?${k}`)),yl=await El(Mt(r,"/api/diary/months")),Tl=n.health,Zl="";try{Tl=await El(`${r}/microservices/decision-center/health`)}catch(vl){Zl=zl(vl,"Decision Center health 检查失败")}t({loading:!1,error:Zl,health:Tl,records:Array.isArray(g.records)?g.records:[],refreshedAt:new Date}),N((vl)=>({...vl,months:Array.isArray(yl.months)?yl.months:[]}))}catch(k){t((g)=>({...g,loading:!1,error:zl(k,"Decision Center 加载失败")}))}}async function B(){if(!f)return;N((k)=>({...k,loading:!0,error:""}));try{let k=await El(Mt(r,`/api/diary/entries?${FO(Q)}`)),g=await El(Mt(r,"/api/diary/months")),yl=Array.isArray(k.entries)?k.entries:[],Tl=X(yl,L.selected);if(N((Zl)=>({loading:!1,error:"",entries:yl,months:Array.isArray(g.months)?g.months:Zl.months,selected:Tl,refreshedAt:new Date})),Tl&&!Tl.body)Y(Tl)}catch(k){N((g)=>({...g,loading:!1,error:zl(k,"日记加载失败")}))}}async function Y(k){N((g)=>({...g,selected:k}));try{let yl=(await El(Mt(r,`/api/diary/entries/${encodeURIComponent(k.date||k.id)}`))).entry||k;N((Tl)=>({...Tl,selected:yl})),W(O3(yl))}catch(g){N((yl)=>({...yl,error:zl(g,"日记正文加载失败")}))}}function H(k="external-goal"){J(l5(k)),w({saving:!1,error:"",message:""})}function D(k,g){J((yl)=>({...yl,[k]:g,category:k==="type"||k==="level"||k==="status"?"custom":yl.category}))}function P(k){let g=l5(k);J((yl)=>({...yl,...g,id:yl.id||"",title:yl.title||"",body:yl.body||"",linkedGoalId:yl.linkedGoalId||"",evidenceLinks:yl.evidenceLinks||"",sourceSession:yl.sourceSession||"frontend",taskId:yl.taskId||"",commitId:yl.commitId||""}))}function E(k){J(vQ(k)),w({saving:!1,error:"",message:`正在编辑 ${k?.id||""}`}),_("records")}async function S(k){k.preventDefault();let g=cO(j);if(!g.title){w({saving:!1,error:"标题不能为空",message:""});return}w({saving:!0,error:"",message:""});try{let yl=String(j.id||"").trim(),Zl=(await El(Mt(r,yl?`/api/records/${encodeURIComponent(yl)}`:"/api/records"),{method:yl?"PUT":"POST",body:g})).record;J(vQ(Zl||{...g,id:yl})),w({saving:!1,error:"",message:`${yl?"已保存":"已创建"} ${Zl?.id||yl||""}`}),await z()}catch(yl){w({saving:!1,error:zl(yl,"记录保存失败"),message:""})}}function V(k,g){W((yl)=>({...yl,[k]:g}))}async function v(){let k=vi();_("diary"),O({saving:!1,error:"",message:""});try{let yl=(await El(Mt(r,`/api/diary/entries/${encodeURIComponent(k)}`))).entry;N((Tl)=>({...Tl,selected:yl||Tl.selected})),W(O3(yl||{date:k,title:`${k} 工作日记`,tags:["frontend"]})),O({saving:!1,error:"",message:yl?`已打开今天 ${k}`:`已准备今天 ${k}`})}catch{W(O3({date:k,title:`${k} 工作日记`,body:`## 今日进展 + +## 阻塞 + +## 下一步 +`,sourceFile:m1,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 yl=$O(q),Tl=await El(Mt(r,"/api/diary/import"),{method:"POST",body:{markdown:yl,sourceFile:String(q.sourceFile||m1).trim()||m1,tags:r5(q.tags)}}),Zl=Array.isArray(Tl.entries)?Tl.entries.find((vl)=>vl.date===g)||Tl.entries[0]:null;if(O({saving:!1,error:"",message:`已保存 ${g} / ${Tl.pathPattern||"YYYY-MM/YYYY-MM-DD.md"}`}),await B(),Zl)await Y(Zl)}catch(yl){O({saving:!1,error:zl(yl,"日记保存失败"),message:""})}}function X(k,g){if(g&&k.some((yl)=>yl.id===g.id))return g;return k[0]||null}if(e2(()=>{z()},[f?.id,f?.runtime?.providerStatus]),e2(()=>{let k=setTimeout(()=>void z(),120);return()=>clearTimeout(k)},[i.type,i.status,i.level,i.linkedGoalId]),e2(()=>{if(c!=="diary")return;let k=setTimeout(()=>void B(),120);return()=>clearTimeout(k)},[c,Q.month,Q.from,Q.to,f?.id,f?.runtime?.providerStatus]),!f)return M(rn,{title:"Decision Center 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=decision-center"});let I=tO(f),a=yO(f),R=iO(f),nl=Array.isArray(n.records)?n.records:[],d=nl.filter((k)=>D3(k)&&k.status!=="done"),h=nl.filter((k)=>n5(k)&&k.status!=="done"),rl=nl.filter((k)=>(k.type==="blocker"||k.status==="blocked")&&k.status!=="done").slice(0,8),_l=nl.filter((k)=>k.status==="parked").slice(0,8),Al=nl.filter((k)=>["decision","experiment","debt"].includes(k.type)).slice(0,12),Ll=nl.filter((k)=>k.type==="meeting"||k.type==="decision").slice(0,12),Ql=nl.filter((k)=>dQ(k,A)),pl=Array.isArray(L.entries)?L.entries:[],s=Array.isArray(L.months)?L.months:[],e=L.selected,fl=Number(n.health?.diaryEntryCount??0);return M("div",{className:"decision-center-page","data-testid":"decision-center-page"},M(hr,{title:"Decision Center",eyebrow:"Authority Records",loading:n.loading,actions:M("div",{className:"inline-actions"},M("button",{type:"button",className:"ghost-btn",onClick:()=>void z(),disabled:n.loading},n.loading?"刷新中":"刷新"),M(Uy,{title:"Decision Center Health",data:n.health,onOpen:u,testId:"raw-decision-center-health"}))},M("div",{className:"decision-hero"},M("div",{className:"metric-grid"},M(z3,{label:"记录数",value:nl.length,hint:`PostgreSQL / ${n.health?.storage||"postgres"}`,tone:"ok"}),M(z3,{label:"日记",value:fl,hint:"按月 Markdown",tone:fl>0?"ok":"warn"}),M(z3,{label:"外部/内部目标",value:`${d.length}/${h.length}`,hint:"G0-facing / G1-G3 delivery",tone:"ok"}),M(z3,{label:"P0/P1 Blocker",value:rl.length,hint:"requires decision",tone:rl.length>0?"warn":"ok"})),M("div",{className:"microservice-ref-card"},M("span",null,"Runtime"),M("strong",null,I.orchestrator||f.deployment?.mode||"k3sctl"),M("code",null,`${f.providerId} / ${R.nodeBindHost||"--"}:${R.nodePort||"--"}`),M("code",null,a.commitId||"--"))),M(el,{error:n.error,title:"Decision Center 请求失败"})),M("div",{className:"decision-tabs",role:"tablist"},M("button",{type:"button",className:c==="records"?"active":"",onClick:()=>_("records"),"data-testid":"decision-tab-requirements"},"需求管理"),M("button",{type:"button",className:c==="diary"?"active":"",onClick:()=>_("diary"),"data-testid":"decision-tab-diary"},"工作日记")),c==="diary"?M(my.default.Fragment,null,M(hr,{title:"工作日记编辑台",eyebrow:"Daily Markdown",loading:p.saving,actions:M("div",{className:"inline-actions"},M("button",{type:"button",className:"ghost-btn",onClick:()=>void v(),disabled:p.saving,"data-testid":"today-diary"},"今天"))},M(UO,{form:q,saving:p.saving,message:p.message,error:p.error,onChange:V,onToday:()=>void v(),onSubmit:(k)=>void K(k)})),M(hr,{title:"日记筛选",eyebrow:"Markdown by Month",loading:L.loading,actions:M("div",{className:"inline-actions"},M("button",{type:"button",className:"ghost-btn",onClick:()=>void B(),disabled:L.loading},L.loading?"刷新中":"刷新"),M(Uy,{title:"Diary Months",data:s,onOpen:u,testId:"raw-decision-center-diary-months"}))},M("div",{className:"decision-filter-bar"},M("label",null,"月份",M("select",{value:Q.month,onChange:(k)=>m((g)=>({...g,month:k.target.value}))},M("option",{value:"all"},"all"),s.map((k)=>M("option",{key:k.month,value:k.month},`${k.month} (${k.count})`)))),M("label",null,"开始日期",M("input",{type:"date",value:Q.from,onChange:(k)=>m((g)=>({...g,from:k.target.value}))})),M("label",null,"结束日期",M("input",{type:"date",value:Q.to,onChange:(k)=>m((g)=>({...g,to:k.target.value}))})),M("label",null,"存储",M("input",{value:"PostgreSQL / YYYY-MM/YYYY-MM-DD.md",readOnly:!0}))),M(el,{error:L.error,title:"日记请求失败"})),M("div",{className:"diary-layout"},M(hr,{title:"按天条目",eyebrow:`${pl.length} Entries`,loading:L.loading},pl.length===0?M(rn,{title:"暂无日记",text:"点击“今天”后可自动创建当天 Markdown 日记。"}):M("div",{className:"diary-entry-list"},pl.map((k)=>M(jO,{key:k.id,entry:k,selected:e?.id===k.id,onSelect:Y,onRaw:u})))),M(hr,{title:e?.title||"日记正文",eyebrow:e?.markdownPath||"Daily Markdown",actions:e?M(Uy,{title:`Diary ${e.date}`,data:e,onOpen:u,testId:"raw-decision-center-diary-selected"}):null},e?M(y1,{markdown:e.body||e.summary||"",className:"decision-markdown diary-markdown"}):M(rn,{title:"未选择日记",text:"从左侧选择一天查看 Markdown 正文。"})))):M(my.default.Fragment,null,M(hr,{title:"需求管理工作区",eyebrow:`${Ql.length} Filtered`,loading:n.loading},M(NO,{records:nl,activeView:A,onView:F,onEdit:E,onRaw:u})),M(hr,{title:j.id?"编辑需求记录":"录入需求记录",eyebrow:"Record Editor",loading:U.saving},M(JO,{form:j,saving:U.saving,message:U.message,error:U.error,onChange:D,onCategory:P,onSubmit:(k)=>void S(k),onReset:()=>H()})),M(hr,{title:"筛选",eyebrow:"Type / Status / Level"},M("div",{className:"decision-filter-bar","data-testid":"decision-center-filters"},M("label",null,"类型",M("select",{value:i.type,onChange:(k)=>y((g)=>({...g,type:k.target.value}))},Qy(gQ))),M("label",null,"状态",M("select",{value:i.status,onChange:(k)=>y((g)=>({...g,status:k.target.value}))},Qy(IQ))),M("label",null,"等级",M("select",{value:i.level,onChange:(k)=>y((g)=>({...g,level:k.target.value}))},Qy(kQ))),M("label",null,"Linked Goal",M("input",{value:i.linkedGoalId,onChange:(k)=>y((g)=>({...g,linkedGoalId:k.target.value})),placeholder:"goal id"})))),M("div",{className:"decision-default-grid"},M(hr,{title:"外部目标",eyebrow:`${d.length} External Goals`},d.length===0?M(rn,{title:"暂无外部目标",text:"外部目标使用 G0 或 external-goal tag。"}):M("div",{className:"decision-card-list"},d.slice(0,8).map((k)=>M(bi,{key:k.id,record:k,onRaw:u,onEdit:E,compact:!0})))),M(hr,{title:"内部目标",eyebrow:`${h.length} Internal Goals`},h.length===0?M(rn,{title:"暂无内部目标",text:"内部目标使用 G1/G2/G3 或 internal-goal tag。"}):M("div",{className:"decision-card-list"},h.slice(0,8).map((k)=>M(bi,{key:k.id,record:k,onRaw:u,onEdit:E,compact:!0})))),M(hr,{title:"P0/P1 Blocker",eyebrow:`${rl.length} Blockers`},rl.length===0?M(rn,{title:"暂无高优先级阻塞",text:"阻塞记录使用 type=blocker 且 level=P0/P1。"}):M("div",{className:"decision-card-list"},rl.map((k)=>M(bi,{key:k.id,record:k,onRaw:u,onEdit:E,compact:!0})))),M(hr,{title:"停放事项",eyebrow:`${_l.length} Parked`},_l.length===0?M(rn,{title:"暂无停放事项",text:"status=parked 的记录会集中展示。"}):M("div",{className:"decision-card-list"},_l.map((k)=>M(bi,{key:k.id,record:k,onRaw:u,onEdit:E,compact:!0})))),M(hr,{title:"决议/实验/债务",eyebrow:`${Al.length} Authority`},Al.length===0?M(rn,{title:"暂无权威事项",text:"决议、实验和债务会集中展示。"}):M("div",{className:"decision-card-list"},Al.map((k)=>M(bi,{key:k.id,record:k,onRaw:u,onEdit:E,compact:!0})))),M(hr,{title:"最近会议/决议",eyebrow:`${Ll.length} Recent`},Ll.length===0?M(rn,{title:"暂无会议或决议",text:"使用 CLI 上传 Markdown 会议记录后会显示。"}):M("div",{className:"decision-card-list"},Ll.map((k)=>M(bi,{key:k.id,record:k,onRaw:u,onEdit:E,compact:!0}))))),M(hr,{title:"全部记录",eyebrow:`${nl.length} Records`,actions:n.refreshedAt?M("span",{className:"muted"},`刷新 ${tu(n.refreshedAt)}`):null},M(_O,{records:nl,onRaw:u,onEdit:E}))))}var q1=Ml(Ju(),1);var Sl=q1.default.createElement,{useEffect:t5}=q1.default,i5=q1.default.useState,QO=q1.default.useRef,c5=` :root { --surfacePrimary: #ffffff; --surfaceSecondary: #f8fafc; @@ -230,64 +245,64 @@ nav .material-icons::before { display: none !important; } } -`;function S2({title:l,eyebrow:u,actions:r,children:f,className:n,loading:i}){return Vl("section",{className:`panel ${n||""}`},Vl("div",{className:"panel-head"},Vl("div",null,u?Vl("p",{className:"panel-eyebrow"},u):null,Vl(fu,{title:l,loading:i})),r?Vl("div",{className:"panel-actions"},r):null),Vl("div",{className:"panel-body"},f))}function YO({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 PO({title:l,text:u}){return Vl("div",{className:"empty-state"},Vl("strong",null,l),Vl("span",null,u))}function zQ(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function EQ(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function OQ(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function CO(l){return l.filter((r)=>r?.id==="filebrowser"||String(r?.id||"").startsWith("filebrowser-")).sort((r,f)=>{let n=(i)=>i.providerId==="D518"?0:i.providerId==="D601"?1:i.id==="filebrowser"?2:3;return n(r)-n(f)||String(r.id).localeCompare(String(f.id))})}function MO(l){if(l?.providerId==="D518")return"D518";return l?.providerId||l?.name||l?.id||"Unknown"}function hO(l,u,r="/"){let f=r.startsWith("/")?r:`/${r}`;return`${l}/microservices/${encodeURIComponent(u)}/proxy${f}`}function RO(l,u){return`${l}/microservices/${encodeURIComponent(u)}/health`}async function xO(l,u=16000){let r=new AbortController,f=setTimeout(()=>r.abort(),u);try{return await ml(l,{signal:r.signal,failureFields:[!1]})}finally{clearTimeout(f)}}function ZQ(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 Q3(l){return l?.status==="OK"||l?.ok===!0}function bO({service:l,active:u,health:r,onSelect:f,onRaw:n}){let i=zQ(l),t=EQ(l),y=OQ(l),c=i.container||{},$=Q3(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":i.providerStatus==="online"?"running":"warn"}`},$?"Health OK":i.providerStatus||"unknown"),Vl("strong",null,l.name||l.id),Vl("span",null,ZQ(l)),Vl("code",null,`${t.nodeBindHost||"--"}:${t.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 pQ(l){try{return l?.contentDocument||l?.contentWindow?.document||null}catch{return null}}function Y2(l){let u=pQ(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!==X2)r.textContent=X2;return!0}function vO(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 sO(l,u){let r=pQ(l);if(r===null||r.documentElement===null)throw Error("无法访问 File Browser iframe 文档");Y2(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)),i=r.documentElement.cloneNode(!0);i.querySelectorAll("script, style, link[rel='stylesheet'], link[rel='preload'], link[rel='icon']").forEach((A)=>A.remove()),i.querySelectorAll("img").forEach((A)=>{A.removeAttribute("src"),A.removeAttribute("srcset")});let t=i.querySelector("head");if(t===null)t=r.createElement("head"),i.insertBefore(t,i.firstChild);let y=r.createElement("style");y.textContent=`${X2} -html,body{width:${f}px!important;min-height:${n}px!important;overflow:hidden!important;}`,t.appendChild(y);let c=new XMLSerializer().serializeToString(i),$=`${c}`;vO(new Blob([$],{type:"image/svg+xml;charset=utf-8"}),u.replace(/\.png$/i,".svg"))}function HQ({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=CO(Array.isArray(l)?l:[]),n=new URLSearchParams(window.location.search).get("target")||"",i=n==="filebrowser-d518"?"filebrowser":n,t=f.some((O)=>O.id===i)?i:f[0]?.id||"",[y,c]=V2(t),[$,A]=V2({loading:!1,refreshedAt:null,health:{},error:""}),[j,F]=V2({exporting:!1,message:"",error:""}),U=XO(null),N=f.find((O)=>O.id===y)||f[0]||null,W=zQ(N),L=EQ(N),J=OQ(N),w=N?$.health[N.id]:null,Q=N?hO(r,N.id,"/"):"about:blank";D2(()=>{if(f.length===0)return;if(!y||!f.some((O)=>O.id===y))c(f[0].id)},[f.map((O)=>O.id).join(",")]),D2(()=>{let O=0,Z=setInterval(()=>{if(O+=1,Y2(U.current)||O>=24)clearInterval(Z)},500);return()=>clearInterval(Z)},[Q]),D2(()=>{if(f.length===0)return;let O=!1;async function Z(){A((Y)=>({...Y,loading:!0,error:""}));let D=await Promise.all(f.map(async(Y)=>{try{let p=await xO(RO(r,Y.id));return[Y.id,{ok:!0,body:p}]}catch(p){return[Y.id,{ok:!1,error:El(p,"File Browser health failed")}]}}));if(O)return;A({loading:!1,refreshedAt:new Date().toISOString(),health:Object.fromEntries(D),error:""})}Z();let E=setInterval(Z,30000);return()=>{O=!0,clearInterval(E)}},[f.map((O)=>`${O.id}:${O.runtime?.providerStatus||""}`).join(","),r]);function q(O){c(O);let Z=new URL(window.location.href);Z.searchParams.set("target",O),window.history.replaceState({},"",`${Z.pathname}${Z.search}`)}async function T(){if(j.exporting)return;F({exporting:!0,message:"",error:""});try{let O=new Date().toISOString().replace(/[-:.TZ]/g,"").slice(0,14);await sO(U.current,`unidesk-filebrowser-${N?.id||"target"}-${O}.png`),F({exporting:!1,message:"截图已导出",error:""})}catch(O){F({exporting:!1,message:"",error:El(O,"截图导出失败")})}}if(f.length===0)return Vl(PO,{title:"File Browser 未登记",text:"请在 config.json 的 microservices 中登记 id=filebrowser 或 filebrowser-* 用户服务"});return Vl("div",{className:"filebrowser-page","data-testid":"filebrowser-page"},$.error?Vl(lu,{error:$.error,wide:!0}):null,Vl(S2,{title:"文件管理器",eyebrow:"File Browser / Host Files",loading:$.loading,actions:Vl("div",{className:"panel-actions"},N?Vl("button",{type:"button",className:"ghost-btn",onClick:T,disabled:j.exporting,"data-testid":"filebrowser-export-screenshot"},j.exporting?"导出中...":"导出截图"):null,N?Vl("a",{className:"ghost-btn",href:Q,target:"_blank",rel:"noreferrer"},"新窗口打开"):null,N?Vl(YO,{title:"File Browser 当前目标",data:{service:N,health:w},onOpen:u,testId:"raw-filebrowser-active"}):null)},Vl("div",{className:"filebrowser-hero"},Vl("div",null,Vl("span",{className:`status-badge ${Q3(w?.body)?"ok":"warn"}`},Q3(w?.body)?"Health OK":"Health Pending"),Vl("h3",null,N?.name||"File Browser"),Vl("p",{className:"muted paragraph"},N?.description||"通过 UniDesk 登录态代理访问,不开放 File Browser 公网端口。"),j.error?Vl("p",{className:"filebrowser-shot-error"},j.error):null,j.message?Vl("p",{className:"filebrowser-shot-ok"},j.message):null),Vl("div",{className:"microservice-ref-card"},Vl("span",null,"Provider"),Vl("strong",null,N?.providerId||"--"),Vl("code",null,W.providerName||N?.providerId||"--")),Vl("div",{className:"microservice-ref-card"},Vl("span",null,"Private Backend"),Vl("strong",null,`${L.nodeBindHost||"--"}:${L.nodePort||"--"}`),Vl("code",null,L.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,ZQ(N)),Vl("code",null,N?.providerId==="main-server"?"/root, /var, /home":"/home, /mnt/c, /mnt/d")))),Vl(S2,{title:"浏览目标",eyebrow:`${f.length} host targets`,loading:$.loading},Vl("div",{className:"filebrowser-target-grid"},f.map((O)=>Vl(bO,{key:O.id,service:O,active:O.id===N?.id,health:$.health[O.id],onSelect:()=>q(O.id),onRaw:u})))),Vl(S2,{title:`${MO(N)} 文件视图`,eyebrow:w?.body?`Health ${Q3(w.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/${N?.id||"filebrowser"}/proxy`),Vl("span",null,"Root"),Vl("code",null,"/srv"),Vl("span",{className:"filebrowser-compact-note"},"Compact layout injected")),Vl("iframe",{ref:U,key:Q,title:`${N?.name||"File Browser"} WebUI`,src:Q,className:"filebrowser-frame","data-testid":"filebrowser-frame",onLoad:(O)=>Y2(O.currentTarget),sandbox:"allow-downloads allow-forms allow-modals allow-same-origin allow-scripts"}))))}var L3=Rl(Ju(),1);var Jl=L3.default.createElement,{useEffect:kO}=L3.default,gO=L3.default.useState;function w3({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return Jl("span",{className:`status-badge ${r}`},u||l||"unknown")}function Ci({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 q3({title:l,eyebrow:u,actions:r,children:f,className:n,loading:i}){return Jl("section",{className:`panel ${n||""}`},Jl("div",{className:"panel-head"},Jl("div",null,u?Jl("p",{className:"panel-eyebrow"},u):null,Jl(fu,{title:l,loading:i})),r?Jl("div",{className:"panel-actions"},r):null),Jl("div",{className:"panel-body"},f))}function W3({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 P2({title:l,text:u}){return Jl("div",{className:"empty-state"},Jl("strong",null,l),Jl("span",null,u))}function IO(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function aO(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function oO(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function M0(l,u){let r=l&&typeof l==="object"?l[u]:void 0;return Number.isFinite(Number(r))?String(r):"--"}function dO(l){return(Array.isArray(l?.jobs)?l.jobs:[]).slice(0,40)}function eO(l){return(Array.isArray(l?.drafts)?l.drafts:[]).slice(0,12)}function BQ({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((N)=>N.id==="findjob")||null,[n,i]=gO({loading:!1,error:"",health:null,summary:null,jobs:null,drafts:null,refreshedAt:null});async function t(){if(!f)return;i((N)=>({...N,loading:!0,error:""}));try{let[N,W,L,J]=await Promise.all([ml(`${r}/microservices/findjob/health`),ml(`${r}/microservices/findjob/proxy/api/summary`),ml(`${r}/microservices/findjob/proxy/api/jobs?__unideskArrayLimit=jobs:40`),ml(`${r}/microservices/findjob/proxy/api/drafts`)]);i({loading:!1,error:"",health:N,summary:W,jobs:L,drafts:J,refreshedAt:new Date})}catch(N){i((W)=>({...W,loading:!1,error:El(N,"FindJob 加载失败")}))}}if(kO(()=>{t()},[f?.id,f?.runtime?.providerStatus]),!f)return Jl(P2,{title:"FindJob 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=findjob"});let y=IO(f),c=oO(f),$=aO(f),A=n.summary||{},j=dO(n.jobs),F=eO(n.drafts),U=n.jobs?._unidesk?.arrayLimits?.jobs;return Jl("div",{className:"findjob-page","data-testid":"findjob-page"},Jl(q3,{title:"FindJob 工作台",eyebrow:"D601 用户服务",loading:n.loading,actions:Jl("div",{className:"panel-actions"},Jl("button",{type:"button",className:"ghost-btn",onClick:t,disabled:n.loading,"data-testid":"findjob-refresh-button"},n.loading?"刷新中":"刷新"),Jl(W3,{title:"FindJob 用户服务",data:f,onOpen:u,testId:"raw-findjob-service"}))},Jl("div",{className:"findjob-hero"},Jl("div",null,Jl("div",{className:"node-version-line"},Jl(w3,{status:y.providerStatus==="online"?"online":"warn"},y.providerStatus||"unknown"),Jl("span",null,f.providerId),Jl("span",null,$.public?"公网暴露":"仅 UniDesk frontend 代理访问")),Jl("p",{className:"muted paragraph"},f.description)),Jl("div",{className:"microservice-ref-card"},Jl("span",null,"Repo"),Jl("strong",null,c.url||"--"),Jl("code",null,c.commitId||"--")),Jl("div",{className:"microservice-ref-card"},Jl("span",null,"D601 Docker"),Jl("strong",null,`${$.nodeBindHost||"--"}:${$.nodePort||"--"}`),Jl("code",null,`${c.composeFile||"--"} / ${c.composeService||"--"}`))),Jl(lu,{error:n.error,wide:!0})),Jl("div",{className:"findjob-grid"},Jl(q3,{title:"岗位指标",eyebrow:n.refreshedAt?`Updated ${iu(n.refreshedAt)}`:"Summary",loading:n.loading},Jl("div",{className:"metric-grid"},Jl(Ci,{label:"岗位总量",value:M0(A,"totalJobs"),hint:"tracked jobs",tone:"ok"}),Jl(Ci,{label:"原始岗位",value:M0(A,"rawJobs"),hint:"raw queue"}),Jl(Ci,{label:"已验证",value:M0(A,"verifiedJobs"),hint:"verified set"}),Jl(Ci,{label:"优先处理",value:M0(A,"prioritizedJobs"),hint:"prioritized"}),Jl(Ci,{label:"过期",value:M0(A,"staleJobs"),hint:"stale jobs",tone:"warn"}),Jl(Ci,{label:"无效",value:M0(A,"invalidJobs"),hint:"invalid jobs",tone:"warn"}),Jl(Ci,{label:"上海",value:M0(A,"shanghaiJobs"),hint:"city filter"}),Jl(Ci,{label:"Health",value:n.health?.ok?"OK":"--",hint:"D601 /api/health"})),Jl("div",{className:"panel-actions inline-actions"},Jl(W3,{title:"FindJob Summary",data:A,onOpen:u,testId:"raw-findjob-summary"}))),Jl(q3,{title:"近期岗位",eyebrow:U?`${U.returnedLength}/${U.originalLength} Preview`:`${j.length} Preview`,loading:n.loading},j.length===0?Jl(P2,{title:"暂无岗位预览",text:"等待 D601 findjob backend 返回 /api/jobs"}):Jl("div",{className:"table-wrap findjob-job-table"},Jl("table",null,Jl("thead",null,Jl("tr",null,Jl("th",null,"优先级"),Jl("th",null,"状态"),Jl("th",null,"单位"),Jl("th",null,"职位"),Jl("th",null,"城市"),Jl("th",null,"阶段"),Jl("th",null,"截止"),Jl("th",null,"证据"))),Jl("tbody",null,j.map((N)=>Jl("tr",{key:N.id},Jl("td",null,Jl(w3,{status:String(N.priority||"").toLowerCase()||"unknown"},N.priority||"--")),Jl("td",null,Jl(w3,{status:String(N.status||"").toLowerCase()||"unknown"},N.status||"--")),Jl("td",null,N.organization_name||"--",Jl("code",null,N.id||"--")),Jl("td",null,N.display_title||N.title||"--"),Jl("td",null,N.display_city||N.city||"--"),Jl("td",null,N.workflow_stage||"--"),Jl("td",null,N.deadline||"--"),Jl("td",null,N.evidence_url?Jl("a",{href:N.evidence_url,target:"_blank",rel:"noreferrer"},"打开"):Jl("span",{className:"muted"},"无"))))))),Jl("div",{className:"panel-actions inline-actions"},Jl(W3,{title:"FindJob Jobs Preview",data:n.jobs,onOpen:u,testId:"raw-findjob-jobs"}))),Jl(q3,{title:"草稿与报告",eyebrow:`${F.length} Drafts`,loading:n.loading},F.length===0?Jl(P2,{title:"暂无草稿",text:"D601 findjob backend 未返回 drafts"}):Jl("div",{className:"draft-list"},F.map((N)=>Jl("article",{key:N.id,className:"draft-card"},Jl("div",{className:"node-card-head"},Jl("strong",null,N.id),Jl(w3,{status:N.status},N.status||"--")),Jl("div",{className:"docker-meta compact"},Jl("span",null,N.workflow_stage||"--"),Jl("span",null,`jobs ${N.counts?.jobs??0}`),Jl("span",null,`reports ${N.counts?.reports??0}`)),Jl("span",null,N.latestReportPath||"暂无报告"),Jl("code",null,Wl(N.updated_at||N.updatedAt))))),Jl("div",{className:"panel-actions inline-actions"},Jl(W3,{title:"FindJob Drafts",data:n.drafts,onOpen:u,testId:"raw-findjob-drafts"})))))}var Jc=Rl(Ju(),1);var R=Jc.default.createElement,{useEffect:lZ}=Jc.default,C2=Jc.default.useState;function Ac(l){let u=Number(l);return Number.isFinite(u)?`${Math.max(0,Math.min(100,u)).toFixed(1)}%`:"--"}function h2(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 R2(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 Fc(l){if(l===null||l===void 0||l==="")return"--";if(typeof l==="boolean")return l?"true":"false";if(typeof l==="number")return R2(l,4);if(Array.isArray(l))return l.map((u)=>Fc(u)).join(" x ");if(typeof l==="object")return"已上报";return String(l)}function G3(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 T3(l){return l.replace(/[^a-zA-Z0-9_-]/g,"-")}function Ir(l){return l&&typeof l==="object"&&!Array.isArray(l)?l:{}}function jc({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return R("span",{className:`status-badge ${r}`},u||l||"unknown")}function Mi({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 M2({title:l,eyebrow:u,actions:r,children:f,className:n,loading:i}){return R("section",{className:`panel ${n||""}`},R("div",{className:"panel-head"},R("div",null,u?R("p",{className:"panel-eyebrow"},u):null,R(fu,{title:l,loading:i})),r?R("div",{className:"panel-actions"},r):null),R("div",{className:"panel-body"},f))}function $y({title:l,data:u,onOpen:r,testId:f}){return R("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:(n)=>{n?.stopPropagation?.(),r(l,u)}},"查看原始JSON")}function In({title:l,text:u}){return R("div",{className:"empty-state"},R("strong",null,l),R("span",null,u))}function uZ(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function rZ(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function fZ(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function nZ(l){return l?.counts&&typeof l.counts==="object"&&!Array.isArray(l.counts)?l.counts:{}}function iZ(l){return Array.isArray(l?.jobs)?l.jobs.slice(0,240):[]}function tZ(l){return Array.isArray(l?.projects)?l.projects.slice(0,1000):[]}function m3(l){return Array.isArray(l?.projects)?l.projects:[]}function yZ(l,u){if(Array.isArray(u?.gpu))return u.gpu;if(Array.isArray(l?.gpu))return l.gpu;return[]}function Nf(l,u){return`${l}/microservices/met-nonlinear/proxy${u}`}function DQ(l){return l.startedAt&&l.finishedAt?h2((Date.parse(l.finishedAt)-Date.parse(l.startedAt))/1000):"--"}function cZ(l){let u=l.progress||{};if(u.etaSeconds!==null&&u.etaSeconds!==void 0&&u.etaSeconds!==""){let t=Number(u.etaSeconds);if(Number.isFinite(t))return Math.max(0,t)}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 i=Math.max(0,(Date.now()-n)/1000);if(i<=0)return null;return Math.max(0,i/r*(f-r))}function VQ(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 i=Number(u.currentEpoch??l.epochTarget);if(!Number.isFinite(i)||i<=0)return null;return i/((n-f)/3600000)}function SQ(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 XQ(l,u,r){return{name:l,path:u,depth:r,count:0,children:[],project:null}}function _Z(l){let u=XQ("","",-1);for(let f of l){let i=String(f?.projectPath||"").replace(/\\/g,"/").split("/").filter(Boolean);if(i.length===0)continue;let t=u,y=[];for(let[c,$]of i.entries()){y.push($);let A=y.join("/"),j=t.children.find((F)=>F.path===A);if(!j)j=XQ($,A,c),t.children.push(j);if(c===i.length-1)j.project=f;t=j}}let r=(f)=>{let n=f.children.reduce((i,t)=>i+r(t),0);return f.count=(f.project?1:0)+n,f.children.sort((i,t)=>{if(Boolean(i.project)!==Boolean(t.project))return i.project?1:-1;return i.name.localeCompare(t.name,"zh-CN",{numeric:!0,sensitivity:"base"})}),f.count};return r(u),u}function $Z(l){let u=Ir(l.data);return Ir(u.project).projectPath?Ir(u.project):u}function AZ(l){return Ir(Ir(l.data).job)}function YQ({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((h)=>h.id==="met-nonlinear")||null,[n,i]=C2({loading:!1,actionBusy:!1,error:"",health:null,summary:null,queue:null,projects:null,history:null,images:null,refreshedAt:null}),[t,y]=C2({loading:!1,error:"",kind:"",key:"",title:"",data:null}),[c,$]=C2(()=>({activeTab:"projects",selectedProjects:{},expandedProjectDirs:{},sourceProject:"",forkCount:1,forkEpochs:200,forkPrefix:`ui_fork_${Date.now()}`,maxConcurrency:3,targetGpuName:"2080 Ti",actionMessage:""}));function A(h){$((a)=>({...a,...h}))}async function j(h=c.activeTab){if(!f)return;i((a)=>({...a,loading:!0,error:""}));try{let a=[["health",ml(`${r}/microservices/met-nonlinear/health`)],["summary",ml(Nf(r,"/api/summary"))]];if(h==="projects")a.push(["projectsRoot",ml(Nf(r,"/api/projects?root=projects&limit=500"))]),a.push(["exProjectsRoot",ml(Nf(r,"/api/projects?root=ex_projects&limit=500"))]);if(h==="current"||h==="completed"||h==="failed")a.push(["queue",ml(Nf(r,"/api/queue"))]);if(h==="completed"||h==="failed")a.push(["history",ml(Nf(r,"/api/history"))]);if(h==="gpu")a.push(["images",ml(Nf(r,"/api/images"))]);let ul=Object.fromEntries(await Promise.all(a.map(async([o,ql])=>[o,await ql]))),zl={loading:!1,actionBusy:!1,error:"",health:ul.health,summary:ul.summary,refreshedAt:new Date};if(ul.projectsRoot||ul.exProjectsRoot){let{projectsRoot:o,exProjectsRoot:ql}=ul;zl.projects={ok:o?.ok!==!1&&ql?.ok!==!1,roots:[{root:"projects",count:m3(o).length},{root:"ex_projects",count:m3(ql).length}],projects:[...m3(o),...m3(ql)]}}if(ul.queue)zl.queue=ul.queue;if(ul.history)zl.history=ul.history;if(ul.images)zl.images=ul.images;i((o)=>({...o,...zl}))}catch(a){i((ul)=>({...ul,loading:!1,actionBusy:!1,error:El(a,"MET Nonlinear 加载失败")}))}}async function F(h,a){i((ul)=>({...ul,actionBusy:!0,error:""})),A({actionMessage:`${h}...`});try{let ul=await a();A({actionMessage:ul||`${h}完成`}),await j()}catch(ul){i((zl)=>({...zl,actionBusy:!1,error:El(ul,`${h}失败`)}))}}async function U(){await F("保存并发设置",async()=>{await ml(Nf(r,"/api/queue/settings"),{method:"PUT",body:JSON.stringify({maxConcurrency:Number(c.maxConcurrency),targetGpuName:c.targetGpuName})})})}function N(){return Object.entries(c.selectedProjects).filter(([,h])=>h).map(([h])=>h)}async function W(){let h=N();if(h.length===0)throw Error("请先选择至少一个 project");await F("加入待启动队列",async()=>{await ml(Nf(r,"/api/queue"),{method:"POST",body:JSON.stringify({projectPaths:h,maxConcurrency:Number(c.maxConcurrency),targetGpuName:c.targetGpuName,start:!1})}),A({activeTab:"current",selectedProjects:{}})})}async function L(){let h=c.sourceProject||B[0]?.projectPath;if(!h)throw Error("请先选择源 project");await F("Fork Project",async()=>{let a=await ml(Nf(r,"/api/projects/fork"),{method:"POST",body:JSON.stringify({sourceProject:h,count:Number(c.forkCount),epochs:Number(c.forkEpochs),prefix:c.forkPrefix})}),ul=Array.isArray(a.projectPaths)?a.projectPaths:[],zl=ul.reduce((o,ql)=>{return o[ql]=!0,o},{...c.selectedProjects});return A({selectedProjects:zl}),`已 fork ${ul.length} 个 project,并已自动勾选;请确认后点击加入待启动队列。`})}async function J(){await F("启动队列",async()=>{await ml(Nf(r,"/api/queue/start"),{method:"POST",body:JSON.stringify({maxConcurrency:Number(c.maxConcurrency),targetGpuName:c.targetGpuName})}),A({activeTab:"current"})})}async function w(h){await F("取消任务",async()=>{await ml(Nf(r,`/api/jobs/${encodeURIComponent(h.id)}/cancel`),{method:"POST",body:JSON.stringify({})})})}async function Q(h){let a=String(h?.projectPath||"");if(!a)return;y({loading:!0,error:"",kind:"project",key:a,title:a,data:null});try{let ul=await ml(Nf(r,`/api/projects/config?path=${encodeURIComponent(a)}`));y({loading:!1,error:"",kind:"project",key:a,title:a,data:ul})}catch(ul){y({loading:!1,error:El(ul,"Project 详情加载失败"),kind:"project",key:a,title:a,data:null})}}async function q(h){let a=String(h?.id||"");if(!a)return;y({loading:!0,error:"",kind:"job",key:a,title:h.projectPath||a,data:null});try{let ul=await ml(Nf(r,`/api/jobs/${encodeURIComponent(a)}`));y({loading:!1,error:"",kind:"job",key:a,title:ul?.job?.projectPath||h.projectPath||a,data:ul})}catch(ul){y({loading:!1,error:El(ul,"Job 详情加载失败"),kind:"job",key:a,title:h.projectPath||a,data:null})}}if(lZ(()=>{j(c.activeTab)},[f?.id,f?.runtime?.providerStatus,c.activeTab]),!f)return R(In,{title:"MET Nonlinear 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=met-nonlinear"});let T=uZ(f),O=fZ(f),Z=rZ(f),E=nZ(n.queue?.queue||n.summary?.queue),D=yZ(n.health,n.queue),Y=n.health?.targetGpu||n.summary?.targetGpu||D.find((h)=>String(h.name||"").includes("2080")),p=n.images?.mlImage||n.health?.image||{},V=iZ(n.queue),B=tZ(n.projects),m=_Z(B),X=c.sourceProject||B[0]?.projectPath||"",S=V.filter((h)=>["staged","queued","running"].includes(h.status)),b=V.filter((h)=>h.status==="succeeded"),z=V.filter((h)=>["failed","canceled"].includes(h.status)),P=Array.isArray(n.history?.jobs)?n.history.jobs.slice(0,120):[],s=[{id:"projects",label:"项目库",count:B.length},{id:"current",label:"当前队列",count:S.length||Number(E.staged||0)+Number(E.queued||0)+Number(E.running||0)},{id:"completed",label:"已完成",count:b.length||Number(E.succeeded||0)},{id:"failed",label:"失败诊断",count:z.length||Number(E.failed||0)+Number(E.canceled||0)},{id:"gpu",label:"GPU/镜像",count:D.length}];function k(h,a){if(h.length===0)return R(In,{title:a==="current"?"当前队列为空":"暂无记录",text:a==="current"?"从项目库选择或 fork project 后先加入待启动队列,再启动队列。":"终态任务会显示耗时、exit code 和失败诊断。"});return R("div",{className:"table-wrap met-job-table"},R("table",null,R("thead",null,R("tr",null,R("th",null,"状态"),R("th",null,"Project"),R("th",null,"Epoch"),R("th",null,"速度"),R("th",null,"ETA/耗时"),R("th",null,"GPU"),R("th",null,"Exit"),R("th",null,"更新时间"),R("th",null,"操作"))),R("tbody",null,h.map((ul)=>{let zl=ul.progress||{},o=["staged","queued","running"].includes(ul.status),ql=t.kind==="job"&&t.key===ul.id;return R("tr",{key:ul.id,className:`met-click-row ${ql?"active":""}`,onClick:()=>q(ul),"data-testid":`met-job-row-${T3(ul.id)}`},R("td",null,R(jc,{status:ul.status},SQ(ul.status))),R("td",null,R("button",{type:"button",className:"met-inline-link",onClick:(pl)=>{pl.stopPropagation(),q(ul)}},ul.projectPath),R("code",null,ul.id)),R("td",null,R("span",null,`${zl.currentEpoch??"--"} / ${zl.epochTarget??ul.epochTarget??"--"}`),R("div",{className:"met-progress"},R("span",{style:{width:Ac(zl.progressPercent)}}))),R("td",null,R("strong",null,G3(VQ(ul)))),R("td",null,ul.status==="succeeded"||ul.status==="failed"||ul.status==="canceled"?DQ(ul):ul.status==="running"?`ETA ${h2(cZ(ul))}`:"--"),R("td",null,ul.gpuName||"--"),R("td",null,ul.exitCode??"--"),R("td",null,Wl(ul.updatedAt)),R("td",null,o?R("button",{type:"button",className:"ghost-btn mini",onClick:(pl)=>{pl.stopPropagation(),w(ul)},disabled:n.actionBusy},"取消"):null,R($y,{title:`MET Job ${ul.id}`,data:ul,onOpen:u,testId:`raw-met-job-${ul.id}`})))}))))}function v(){return R("div",{className:"met-queue-summary","data-testid":"met-current-summary"},R(jc,{status:"staged"},`待启动 ${E.staged??0}`),R(jc,{status:"queued"},`排队中 ${E.queued??0}`),R(jc,{status:"running"},`训练中 ${E.running??0}`),R("span",null,`最大并发 ${n.summary?.queue?.maxConcurrency??n.queue?.queue?.maxConcurrency??c.maxConcurrency}`),R("span",null,`目标 GPU ${n.summary?.queue?.targetGpuName??n.queue?.queue?.targetGpuName??c.targetGpuName}`))}function tl(h,a){let ul=c.expandedProjectDirs[h];return ul===void 0?a<2:Boolean(ul)}function I(h,a){let ul=tl(h,a);A({expandedProjectDirs:{...c.expandedProjectDirs,[h]:!ul}})}function M(h){let a=8+Math.max(0,h.depth)*16;if(Boolean(h.project)){let o=h.project,ql=Boolean(c.selectedProjects[o.projectPath]),pl=t.kind==="project"&&t.key===o.projectPath;return R("div",{key:h.path,className:`met-tree-row project ${ql?"selected":""} ${pl?"active":""}`,style:{paddingLeft:a},onClick:()=>Q(o),"data-testid":`met-project-node-${T3(o.projectPath)}`},R("div",{className:"met-tree-name"},R("input",{type:"checkbox",checked:ql,onClick:(Bl)=>Bl.stopPropagation(),onChange:(Bl)=>A({selectedProjects:{...c.selectedProjects,[o.projectPath]:Bl.target.checked}}),"data-testid":`met-project-checkbox-${T3(o.projectPath)}`}),R("button",{type:"button",className:"met-inline-link project-path",onClick:(Bl)=>{Bl.stopPropagation(),Q(o)}},h.name)),R("span",null,o.useModel||"--"),R("span",null,o.epochTrain??"--"),R("span",null,Ac(o.progress?.progressPercent)),R("span",null,G3(o.progress?.epochPerHour)))}let zl=tl(h.path,h.depth);return R(Jc.default.Fragment,{key:h.path},R("div",{className:"met-tree-row folder",style:{paddingLeft:a},"data-testid":`met-project-folder-${T3(h.path)}`},R("button",{type:"button",className:"met-tree-toggle",onClick:()=>I(h.path,h.depth),"aria-label":zl?`折叠 ${h.path}`:`展开 ${h.path}`},zl?"-":"+"),R("strong",null,h.name),R("span",{className:"met-tree-count"},`${h.count} projects`)),zl?h.children.map((o)=>M(o)):null)}function rl(h){return R("div",{className:"met-detail-kv"},h.map((a)=>R("div",{key:a.label,className:"met-detail-kv-item"},R("span",null,a.label),R("strong",null,Fc(a.value)),a.hint?R("small",null,a.hint):null)))}function cl(h,a){return R("div",{className:"met-detail-section"},R("h3",null,h),rl(a))}function $l(h){if(!Array.isArray(h)||h.length===0)return R(In,{title:"模型层未上报",text:"等待 data/model_info.json 或 compute_analysis.json 生成。"});return R("div",{className:"table-wrap met-layer-table"},R("table",null,R("thead",null,R("tr",null,R("th",null,"Layer"),R("th",null,"Type"),R("th",null,"Params"),R("th",null,"Trainable"),R("th",null,"Compute"))),R("tbody",null,h.slice(0,18).map((a,ul)=>R("tr",{key:`${a.name||"layer"}-${ul}`},R("td",null,a.name||`#${ul+1}`),R("td",null,a.type||"--"),R("td",null,R2(a.num_params)),R("td",null,a.trainable===void 0?"--":String(Boolean(a.trainable))),R("td",null,R2(a.compute?.total??a.estimated_cost?.weighted_units?.total)))))))}function Tl(h){let a=Array.isArray(h)?h:[];if(a.length===0)return R(In,{title:"data/ 暂无文件",text:"训练或评估完成后会生成 training_state、metrics、model_info 等文件。"});return R("div",{className:"met-file-chip-grid"},a.slice(0,48).map((ul)=>R("span",{key:ul},ul)),a.length>48?R("span",null,`+${a.length-48}`):null)}function Ql(h){let a=String(h||"").replace(/\x1b\[[0-9;]*[A-Za-z]/g,"").split(/\r?\n/).map((ul)=>ul.trim()).filter(Boolean).slice(-12);if(a.length===0)return R(In,{title:"暂无日志尾部",text:"该任务未上报 logTail 或日志已轮转。"});return R("div",{className:"met-log-lines"},a.map((ul,zl)=>R("div",{key:`${zl}-${ul.slice(0,16)}`},ul)))}function Ol(){if(t.loading)return R("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},R("div",{className:"panel-head compact"},R("div",null,R("p",{className:"panel-eyebrow"},"Detail Loading"),R(fu,{title:"详情加载中",loading:!0}))),R(In,{title:"详情加载中",text:t.title||"正在读取 D601 data/ 和 config.json"}));if(t.error)return R("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},R(lu,{error:t.error,wide:!0}));if(!t.data)return R("section",{className:"met-detail-panel muted","data-testid":"met-detail-panel"},R(In,{title:"选择一个项目或任务查看详情",text:"项目库、当前队列、已完成和失败诊断中的行都可以点击;默认只展示结构化字段,原始 JSON 需显式点击按钮。"}));let h=$Z(t),a=AZ(t),ul=Ir(h.config),zl=Ir(h.progress||a.progress),o=Ir(h.data),ql=Ir(h.metrics||o.metrics||zl.trainingInfo?.evaluation_metrics),pl=Ir(o.trainingInfo||zl.trainingInfo),Bl=Ir(o.trainingState),Il=Ir(h.model||o.model),nu=Array.isArray(Il.modelSummary)&&Il.modelSummary.length>0?Il.modelSummary:Il.computeLayers,Ml=Ir(pl.evaluation_metrics),wu=t.kind==="job"?"训练任务详情":"Project 详情";return R("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},R("div",{className:"panel-head compact"},R("div",null,R("p",{className:"panel-eyebrow"},t.kind==="job"?"Job + Project Detail":"Project Library Detail"),R(fu,{title:wu}),R("code",null,h.projectPath||a.projectPath||t.title)),R("div",{className:"panel-actions"},R($y,{title:`MET ${wu}`,data:t.data,onOpen:u,testId:"raw-met-detail"}))),t.kind==="job"?cl("任务状态",[{label:"Job ID",value:a.id},{label:"状态",value:SQ(a.status)},{label:"GPU",value:a.gpuName},{label:"Exit Code",value:a.exitCode},{label:"耗时",value:DQ(a)},{label:"训练速度",value:G3(VQ({...a,progress:zl}))}]):null,cl("config.json",[{label:"use_model",value:ul.use_model},{label:"epoch_train",value:ul.epoch_train},{label:"step_per_epoch",value:ul.step_per_epoch},{label:"learning_rate",value:ul.learning_rate},{label:"using_gpu",value:ul.using_gpu},{label:"use_points",value:ul.use_points},{label:"sample_rate",value:ul.sample_rate},{label:"time_clipped_s",value:ul.time_clipped_s},{label:"H_UNITS",value:ul.H_UNITS},{label:"INNER_KAN_UNITS",value:ul.INNER_KAN_UNITS},{label:"INNER_KAN_LAYERS",value:ul.INNER_KAN_LAYERS},{label:"GRID_SIZE",value:ul.GRID_SIZE},{label:"SPLINE_ORDER",value:ul.SPLINE_ORDER},{label:"USE_FAST_MODEL",value:ul.USE_FAST_MODEL},{label:"IIR_TRAINABLE",value:ul.IIR_TRAINABLE}]),cl("data/ 训练状态",[{label:"Epoch",value:`${zl.currentEpoch??Bl.current_epoch??Bl.completed_epoch??"--"} / ${zl.epochTarget??ul.epoch_train??"--"}`},{label:"Progress",value:Ac(zl.progressPercent)},{label:"Last Loss",value:zl.lastLoss??Bl.loss},{label:"Last Val Loss",value:zl.lastValLoss??Bl.val_loss},{label:"Min Loss",value:pl.min_loss??Bl.min_loss},{label:"Min Val Loss",value:pl.min_val_loss??Bl.min_val_loss},{label:"Log Lines",value:zl.logLineCount},{label:"ETA",value:h2(zl.etaSeconds??Bl.remaining_time)},{label:"训练速度",value:G3(zl.epochPerHour??Bl.smoothed_speed)},{label:"Training Alive",value:Bl.training_alive}]),cl("模型参数",[{label:"Model Type",value:Il.modelType??ul.use_model},{label:"Total Params",value:Il.totalParams,hint:Il.totalParams===null||Il.totalParams===void 0?"未上报":"data/model_info.json"},{label:"Trainable",value:Il.trainableParams},{label:"Non-trainable",value:Il.nonTrainableParams},{label:"Compute Cost",value:Il.computeCost},{label:"Estimate Status",value:Il.estimateStatus},{label:"Unsupported Layers",value:Il.unsupportedLayerCount}]),cl("指标",[{label:"train_loss",value:ql.train_loss??Ml.train_loss},{label:"val_loss",value:ql.val_loss??Ml.val_loss},{label:"train_mae",value:ql.train_mae??Ml.train_mae},{label:"val_mae",value:ql.val_mae??Ml.val_mae},{label:"train_afmae",value:ql.train_afmae??Ml.train_afmae},{label:"val_afmae",value:ql.val_afmae??Ml.val_afmae},{label:"freq_drift_hz",value:ql.freq_drift_hz},{label:"sens_drift_percent",value:ql.sens_drift_percent},{label:"linearity_percent",value:ql.linearity_percent},{label:"weights_source",value:ql.weights_source??Ml.weights_source},{label:"lr min/mean/max",value:`${Fc(pl.learning_rate_min)} / ${Fc(pl.learning_rate_mean)} / ${Fc(pl.learning_rate_max)}`}]),R("div",{className:"met-detail-section"},R("h3",null,"模型层"),$l(nu)),R("div",{className:"met-detail-section"},R("h3",null,"data/ 文件"),Tl(o.files)),t.kind==="job"?R("div",{className:"met-detail-section"},R("h3",null,"日志尾部"),Ql(Ir(t.data).logTail)):null)}return R("div",{className:"met-page","data-testid":"met-nonlinear-page"},R(M2,{title:"MET Nonlinear 训练编排",eyebrow:"D601 GPU 用户服务",loading:n.loading||n.actionBusy,actions:R("div",{className:"panel-actions"},R("button",{type:"button",className:"ghost-btn",onClick:j,disabled:n.loading,"data-testid":"met-refresh-button"},n.loading?"刷新中":"刷新"),R($y,{title:"MET Nonlinear 用户服务",data:f,onOpen:u,testId:"raw-met-service"}))},R("div",{className:"findjob-hero"},R("div",null,R("div",{className:"node-version-line"},R(jc,{status:T.providerStatus==="online"?"online":"warn"},T.providerStatus||"unknown"),R("span",null,f.providerId),R("span",null,Z.public?"公网暴露":"仅 UniDesk frontend 代理访问")),R("p",{className:"muted paragraph"},f.description)),R("div",{className:"microservice-ref-card"},R("span",null,"Repo"),R("strong",null,O.url||"--"),R("code",null,O.commitId||"--")),R("div",{className:"microservice-ref-card"},R("span",null,"D601 Docker"),R("strong",null,`${Z.nodeBindHost||"--"}:${Z.nodePort||"--"}`),R("code",null,`${O.composeFile||"--"} / ${O.containerName||"--"}`))),R(lu,{error:n.error,wide:!0}),c.actionMessage?R("div",{className:"met-action-log","data-testid":"met-action-message"},c.actionMessage):null),R("div",{className:"met-grid"},R(M2,{title:"核心状态",eyebrow:n.refreshedAt?`Updated ${iu(n.refreshedAt)}`:"Queue + GPU",loading:n.loading},R("div",{className:"metric-grid"},R(Mi,{label:"Staged",value:E.staged??0,hint:"加入队列未开始",tone:Number(E.staged||0)>0?"warn":""}),R(Mi,{label:"Queued",value:E.queued??0,hint:"排队等待调度",tone:Number(E.queued||0)>0?"warn":""}),R(Mi,{label:"Running",value:E.running??0,hint:`max ${n.summary?.queue?.maxConcurrency??n.queue?.queue?.maxConcurrency??"--"}`,tone:Number(E.running||0)>0?"ok":""}),R(Mi,{label:"Succeeded",value:E.succeeded??0,hint:"已完成"}),R(Mi,{label:"Failed",value:E.failed??0,hint:"需要诊断",tone:Number(E.failed||0)>0?"warn":""}),R(Mi,{label:"2080Ti Free",value:Y?Ac(Number(Y.freeRatio)*100):"--",hint:Y?`${Y.memoryFreeMiB}/${Y.memoryTotalMiB} MiB`:"等待 GPU 上报"}),R(Mi,{label:"ML Image",value:p.present?"READY":"MISSING",hint:p.image||"met-nonlinear-ml:tf26",tone:p.present?"ok":"warn"}),R(Mi,{label:"Health",value:n.health?.ok?"OK":"--",hint:"D601 /health"}))),R(M2,{title:"队列控制",eyebrow:"Downloader-like staging",loading:n.actionBusy},R("div",{className:"met-control-strip"},R("label",null,"最大并发",R("input",{type:"number",min:1,max:16,value:c.maxConcurrency,"data-testid":"met-max-concurrency-input",onChange:(h)=>A({maxConcurrency:h.target.value})})),R("label",null,"目标 GPU",R("input",{value:c.targetGpuName,"data-testid":"met-target-gpu-input",onChange:(h)=>A({targetGpuName:h.target.value})})),R("button",{type:"button",className:"ghost-btn",onClick:U,disabled:n.actionBusy,"data-testid":"met-save-settings-button"},"保存设置"),R("button",{type:"button",className:"primary-btn",onClick:J,disabled:n.actionBusy||Number(E.staged||0)===0,"data-testid":"met-start-queue-button"},"启动队列")),R("p",{className:"muted paragraph"},"Project 先进入待启动队列,不会立即训练;点击启动队列后才切换为排队中,并由 D601 scheduler 按最大并发和 2080Ti 显存策略调度。")),R("section",{className:"panel met-workspace"},R("div",{className:"met-tabs",role:"tablist"},s.map((h)=>R("button",{key:h.id,type:"button",className:c.activeTab===h.id?"active":"",onClick:()=>A({activeTab:h.id}),"data-testid":`met-tab-${h.id}`},`${h.label} ${h.count}`))),R("div",{className:"panel-body"},c.activeTab==="projects"?R("div",{className:"met-form-grid","data-testid":"met-projects-pane"},R("div",{className:"met-fork-card"},R("h3",null,"Fork Project"),R("label",null,"源 Project",R("select",{value:X,"data-testid":"met-source-project-select",onChange:(h)=>A({sourceProject:h.target.value})},B.map((h)=>R("option",{key:h.projectPath,value:h.projectPath},`${h.projectPath} · ${h.useModel||"model?"}`)))),R("label",null,"Fork 数量",R("input",{type:"number",min:1,max:100,value:c.forkCount,"data-testid":"met-fork-count-input",onChange:(h)=>A({forkCount:h.target.value})})),R("label",null,"训练轮数",R("input",{type:"number",min:1,max:1e5,value:c.forkEpochs,"data-testid":"met-fork-epochs-input",onChange:(h)=>A({forkEpochs:h.target.value})})),R("label",null,"目标前缀",R("input",{value:c.forkPrefix,"data-testid":"met-fork-prefix-input",onChange:(h)=>A({forkPrefix:h.target.value})})),R("button",{type:"button",className:"primary-btn",onClick:L,disabled:n.actionBusy||!X,"data-testid":"met-fork-button"},"Fork Project"),R("p",{className:"muted paragraph"},"Fork 只创建新 Project 并自动勾选,不会直接训练;需要在右侧确认后加入待启动队列。")),R("div",{className:"met-project-list"},R("div",{className:"panel-head compact"},R("div",null,R("p",{className:"panel-eyebrow"},`Existing Projects · ${(n.projects?.roots||[]).map((h)=>`${h.root} ${h.count}`).join(" / ")}`),R(fu,{title:"选择已有 Project",loading:n.loading||n.actionBusy})),R("button",{type:"button",className:"ghost-btn",onClick:W,disabled:n.actionBusy||N().length===0,"data-testid":"met-stage-selected-button"},`加入待启动队列 (${N().length})`)),B.length===0?R(In,{title:"暂无 project",text:"等待 D601 返回 /api/projects"}):R("div",{className:"met-project-table","data-testid":"met-project-tree"},R("div",{className:"met-tree-header"},R("span",null,"文件树 Project"),R("span",null,"Model"),R("span",null,"Epochs"),R("span",null,"Progress"),R("span",null,"速度")),m.children.map((h)=>M(h)))),Ol()):null,c.activeTab==="current"?R("div",{"data-testid":"met-current-pane"},v(),k(S,"current"),Ol(),R("div",{className:"panel-actions inline-actions"},R($y,{title:"MET Queue",data:n.queue,onOpen:u,testId:"raw-met-queue"}))):null,c.activeTab==="completed"?R("div",{"data-testid":"met-completed-pane"},k(b.length>0?b:P.filter((h)=>h.status==="succeeded"),"completed"),Ol()):null,c.activeTab==="failed"?R("div",{"data-testid":"met-failed-pane"},k(z.length>0?z:P.filter((h)=>["failed","canceled"].includes(h.status)),"failed"),Ol(),R("div",{className:"panel-actions inline-actions"},R($y,{title:"MET History",data:n.history,onOpen:u,testId:"raw-met-history"}))):null,c.activeTab==="gpu"?R("div",{className:"met-gpu-pane","data-testid":"met-gpu-pane"},D.length===0?R(In,{title:"暂无 GPU 上报",text:"等待 D601 met-nonlinear-ts 或 ML image 提供 nvidia-smi 数据"}):R("div",{className:"table-wrap"},R("table",null,R("thead",null,R("tr",null,R("th",null,"Index"),R("th",null,"Name"),R("th",null,"Free"),R("th",null,"Policy"))),R("tbody",null,D.map((h)=>R("tr",{key:h.index},R("td",null,h.index),R("td",null,h.name),R("td",null,`${h.memoryFreeMiB} / ${h.memoryTotalMiB} MiB`,R("div",{className:"met-progress"},R("span",{style:{width:Ac(Number(h.freeRatio)*100)}}))),R("td",null,String(h.name||"").includes("2080")?"target 2080Ti, <20% 限制并发":"non-target")))))),R("div",{className:"panel-actions inline-actions"},R($y,{title:"MET Images",data:n.images,onOpen:u,testId:"raw-met-images"}))):null))))}var O3=Rl(Ju(),1);var Nl=O3.default.createElement,{useEffect:PQ,useMemo:jZ}=O3.default,K3=O3.default.useState;function CQ({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return Nl("span",{className:`status-badge ${r}`},u||l||"unknown")}function Uc({label:l,value:u,hint:r,tone:f}){return Nl("article",{className:`metric-card ${f||""}`},Nl("div",{className:"metric-label"},l),Nl("div",{className:"metric-value"},u),Nl("div",{className:"metric-hint"},r))}function z3({title:l,eyebrow:u,actions:r,children:f,className:n,loading:i}){return Nl("section",{className:`panel ${n||""}`},Nl("div",{className:"panel-head"},Nl("div",null,u?Nl("p",{className:"panel-eyebrow"},u):null,Nl(fu,{title:l,loading:i})),r?Nl("div",{className:"panel-actions"},r):null),Nl("div",{className:"panel-body"},f))}function x2({title:l,data:u,onOpen:r,testId:f}){return Nl("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function E3({title:l,text:u}){return Nl("div",{className:"empty-state"},Nl("strong",null,l),Nl("span",null,u))}function FZ(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function JZ(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function UZ(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function Ay(l,u){return`${l}/microservices/mdtodo/proxy${u}`}function MQ(l){if(l==="completed")return"已完成";if(l==="in_progress")return"进行中";return"待处理"}function NZ(l){if(l==="completed")return"online";if(l==="in_progress")return"warn";return"unknown"}function b2(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 QZ({tasks:l,selectedId:u,onSelect:r}){if(!l.length)return Nl(E3,{title:"暂无任务",text:"当前文件没有 R 编号任务。"});let f=(n)=>Nl("li",{key:n.id},Nl("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,"-")}`},Nl(CQ,{status:NZ(n.status)},MQ(n.status)),Nl("code",null,n.id),Nl("span",{className:"mdtodo-task-title"},n.title||"--"),Nl("span",{className:"mdtodo-link-count"},`${n.linkExists??0}/${n.linkCount??0}`)),Array.isArray(n.children)&&n.children.length>0?Nl("ol",null,n.children.map(f)):null);return Nl("ol",{className:"mdtodo-tree"},l.map(f))}function hQ({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((Y)=>Y.id==="mdtodo")||null,[n,i]=K3({loading:!1,saving:!1,error:"",notice:"",health:null,files:[],todo:null,selectedFile:"",selectedTaskId:"",refreshedAt:null,command:null}),[t,y]=K3(""),[c,$]=K3(""),[A,j]=K3(""),F=Array.isArray(n.todo?.tasks)?n.todo.tasks:[],U=jZ(()=>b2(F),[n.todo]),N=U.find((Y)=>Y.id===n.selectedTaskId)||U[0]||null,W=n.todo?.stats||{};async function L(Y=n.selectedFile){if(!f)return;i((p)=>({...p,loading:!0,error:"",notice:""}));try{let[p,V]=await Promise.all([ml(`${r}/microservices/mdtodo/health`),ml(Ay(r,"/api/files"))]),B=Array.isArray(V.files)?V.files:[],m=Y||B[0]?.path||"",X=m?await ml(Ay(r,`/api/tasks?file=${encodeURIComponent(m)}`)):null,S=Array.isArray(X?.tasks)?b2(X.tasks):[],b=S.some((z)=>z.id===n.selectedTaskId)?n.selectedTaskId:S[0]?.id||"";i({loading:!1,saving:!1,error:"",notice:"",health:p,files:B,todo:X,selectedFile:m,selectedTaskId:b,refreshedAt:new Date,command:n.command})}catch(p){i((V)=>({...V,loading:!1,error:El(p,"MDTODO 加载失败")}))}}if(PQ(()=>{L()},[f?.id,f?.runtime?.providerStatus]),PQ(()=>{y(N?.title||""),$(N?.rawContent||"")},[N?.id,n.selectedFile]),!f)return Nl(E3,{title:"MDTODO 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=mdtodo"});let J=FZ(f),w=UZ(f),Q=JZ(f);async function q(Y){i((p)=>({...p,selectedFile:Y,selectedTaskId:"",command:null})),await L(Y)}async function T(Y){if(!N||!n.selectedFile)return;i((p)=>({...p,saving:!0,error:"",notice:""}));try{let p=await ml(Ay(r,`/api/tasks/${encodeURIComponent(N.id)}`),{method:"PATCH",body:{file:n.selectedFile,...Y}});i((V)=>({...V,saving:!1,todo:p.file,notice:p.result?.message||"任务已更新"}))}catch(p){i((V)=>({...V,saving:!1,error:El(p,"任务更新失败")}))}}async function O(){await T({title:t,rawContent:c})}async function Z(Y){if(!n.selectedFile)return;i((p)=>({...p,saving:!0,error:"",notice:""}));try{let p=await ml(Ay(r,"/api/tasks"),{method:"POST",body:{file:n.selectedFile,parentId:Y,title:A||"新任务"}});j(""),i((V)=>({...V,saving:!1,todo:p.file,selectedTaskId:p.result?.taskId||V.selectedTaskId,notice:p.result?.message||"任务已创建"})),await L(n.selectedFile)}catch(p){i((V)=>({...V,saving:!1,error:El(p,"创建任务失败")}))}}async function E(){if(!N||!n.selectedFile)return;if(!window.confirm(`删除 ${N.id} 及其子任务?`))return;i((Y)=>({...Y,saving:!0,error:"",notice:""}));try{let Y=await ml(Ay(r,`/api/tasks/${encodeURIComponent(N.id)}?file=${encodeURIComponent(n.selectedFile)}`),{method:"DELETE"}),p=b2(Y.file?.tasks||[]);i((V)=>({...V,saving:!1,todo:Y.file,selectedTaskId:p[0]?.id||"",notice:Y.result?.message||"任务已删除"}))}catch(Y){i((p)=>({...p,saving:!1,error:El(Y,"删除任务失败")}))}}async function D(){if(!N||!n.selectedFile)return;i((Y)=>({...Y,saving:!0,error:"",command:null}));try{let Y=await ml(Ay(r,"/api/execute-command"),{method:"POST",body:{file:n.selectedFile,taskId:N.id,mode:"codex"}});i((p)=>({...p,saving:!1,command:Y,notice:"执行命令已生成"}))}catch(Y){i((p)=>({...p,saving:!1,error:El(Y,"执行命令生成失败")}))}}return Nl("div",{className:"mdtodo-page","data-testid":"mdtodo-page"},Nl(z3,{title:"MDTODO 工作台",eyebrow:"D601 k3s managed service",loading:n.loading,actions:Nl("div",{className:"panel-actions"},Nl("button",{type:"button",className:"ghost-btn",onClick:()=>void L(),disabled:n.loading,"data-testid":"mdtodo-refresh-button"},n.loading?"刷新中":"刷新"),Nl(x2,{title:"MDTODO 用户服务",data:f,onOpen:u,testId:"raw-mdtodo-service"}))},Nl("div",{className:"findjob-hero"},Nl("div",null,Nl("div",{className:"node-version-line"},Nl(CQ,{status:J.providerStatus==="online"?"online":"warn"},J.providerStatus||"unknown"),Nl("span",null,f.providerId),Nl("span",null,Q.proxyMode||"--")),Nl("p",{className:"muted paragraph"},f.description)),Nl("div",{className:"microservice-ref-card"},Nl("span",null,"Repo"),Nl("strong",null,w.url||"--"),Nl("code",null,w.composeFile||"--")),Nl("div",{className:"microservice-ref-card"},Nl("span",null,"Workspace"),Nl("strong",null,n.health?.rootDir||"/workspace"),Nl("code",null,`${Q.nodeBindHost||"--"}:${Q.nodePort||"--"}`))),Nl(lu,{error:n.error,wide:!0}),n.notice?Nl("div",{className:"notice-line"},n.notice):null),Nl("div",{className:"metric-grid"},Nl(Uc,{label:"TODO 文件",value:n.files.length,hint:n.health?.rootExists?"hostPath ready":"hostPath missing",tone:n.health?.ok?"ok":"warn"}),Nl(Uc,{label:"任务总数",value:W.total??"--",hint:n.selectedFile||"--"}),Nl(Uc,{label:"已完成",value:W.completed??"--",hint:"completed",tone:"ok"}),Nl(Uc,{label:"进行中",value:W.inProgress??"--",hint:"in progress",tone:"warn"}),Nl(Uc,{label:"待处理",value:W.pending??"--",hint:n.refreshedAt?iu(n.refreshedAt):"pending"})),Nl("div",{className:"mdtodo-layout"},Nl(z3,{title:"文件",eyebrow:`${n.files.length} Markdown`,loading:n.loading,className:"mdtodo-file-panel"},n.files.length===0?Nl(E3,{title:"暂无 TODO 文件",text:"等待后端扫描 MDTODO 工作区。"}):Nl("div",{className:"mdtodo-file-list"},n.files.map((Y)=>Nl("button",{key:Y.path,type:"button",className:`mdtodo-file-item ${n.selectedFile===Y.path?"active":""}`,onClick:()=>void q(Y.path)},Nl("strong",null,Y.name),Nl("span",null,Y.directory||"."),Nl("code",null,`${Y.stats?.total??"--"} tasks / ${Wl(Y.mtime)}`))))),Nl(z3,{title:"任务树",eyebrow:n.selectedFile||"Tasks",loading:n.loading,actions:Nl("div",{className:"panel-actions"},Nl("input",{value:A,onChange:(Y)=>j(Y.target.value),placeholder:"新任务标题","data-testid":"mdtodo-new-title"}),Nl("button",{type:"button",className:"ghost-btn",onClick:()=>void Z(),disabled:n.saving||!n.selectedFile},"新增"),N?Nl("button",{type:"button",className:"ghost-btn",onClick:()=>void Z(N.id),disabled:n.saving},"新增子任务"):null,n.todo?Nl(x2,{title:"MDTODO 当前文件",data:n.todo,onOpen:u,testId:"raw-mdtodo-file"}):null)},Nl(QZ,{tasks:F,selectedId:N?.id||"",onSelect:(Y)=>i((p)=>({...p,selectedTaskId:Y,command:null}))})),Nl(z3,{title:N?`${N.id} 详情`:"任务详情",eyebrow:N?MQ(N.status):"Detail",loading:n.saving,className:"mdtodo-detail-panel",actions:N?Nl("div",{className:"panel-actions"},Nl("button",{type:"button",className:"ghost-btn",onClick:()=>void T({status:"pending"}),disabled:n.saving},"待处理"),Nl("button",{type:"button",className:"ghost-btn",onClick:()=>void T({status:"in_progress"}),disabled:n.saving},"进行中"),Nl("button",{type:"button",className:"primary-btn",onClick:()=>void T({status:"completed"}),disabled:n.saving},"完成")):null},!N?Nl(E3,{title:"未选中任务",text:"请选择一个任务。"}):Nl("div",{className:"mdtodo-editor"},Nl("label",null,"标题",Nl("input",{value:t,onChange:(Y)=>y(Y.target.value),"data-testid":"mdtodo-title-input"})),Nl("label",null,"正文",Nl("textarea",{value:c,onChange:(Y)=>$(Y.target.value),rows:12,"data-testid":"mdtodo-raw-input"})),Nl("div",{className:"docker-meta compact"},Nl("span",null,`line ${Number(N.lineNumber??0)+1}`),Nl("span",null,`depth ${N.depth??0}`),Nl("span",null,`links ${N.linkExists??0}/${N.linkCount??0}`)),Nl("div",{className:"inline-actions"},Nl("button",{type:"button",className:"primary-btn",onClick:O,disabled:n.saving},n.saving?"保存中":"保存"),Nl("button",{type:"button",className:"ghost-btn",onClick:D,disabled:n.saving},"生成执行命令"),Nl("button",{type:"button",className:"danger-btn",onClick:E,disabled:n.saving},"删除"),Nl(x2,{title:`MDTODO ${N.id}`,data:N,onOpen:u,testId:"raw-mdtodo-task"})),n.command?Nl("div",{className:"mdtodo-command"},Nl("span",null,n.command.prompt||"--"),Nl("code",null,n.command.command||"--")):null))))}var p3=[{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:"安全边界"}]}],Nc=Object.fromEntries(p3.map((l)=>[l.id,l.tabs[0]?.id??""]));function wZ(l){let u=String(l||"").trim();if(!u)return"";try{return decodeURIComponent(u)}catch{return u}}function Z3(l){let u=String(l||"/"),[r]=u.split(/[?#]/u,1);if(r==="/")return"/";let n=`/${r.split("/").map(wZ).filter(Boolean).join("/")}`;return n.endsWith("/")?n:`${n}/`}function qZ(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 v2(l){return String(l||"").normalize("NFKD").replace(/[\u0300-\u036f]/gu,"").toLowerCase().replace(/[^a-z0-9]+/gu,"-").replace(/^-+|-+$/gu,"")}function RQ(l){return String(l||"").trim().toLowerCase().replace(/[\s/\\?#%]+/gu,"-").replace(/-+/gu,"-").replace(/^-+|-+$/gu,"")}function xQ(l){let u=v2(l.routeSegment||"")||RQ(l.routeSegment||"");if(u)return u;let r=v2(l.id||"");if(r)return r;let f=v2(l.label||"")||RQ(l.label||"");if(f)return f;return`route-${qZ(JSON.stringify(l))}`}function s2(l,u){return`${l}:${u}`}function bQ(l){let u=l.map((c)=>{let $=xQ(c);return{...c,routeSegment:$,tabs:c.tabs.map((A)=>({...A,routeSegment:xQ(A)}))}}),r={},f={},n={},i=u.map((c)=>{let $=c.tabs[0]?.id??"";n[c.id]=$;let A=c.tabs.map((U)=>{let N=`/${c.routeSegment}/${U.routeSegment}/`,W=[N],L={moduleId:c.id,tabId:U.id};for(let J of W)r[Z3(J)]=L;return f[s2(c.id,U.id)]=N,{...U,canonicalPath:N,aliases:W}}),j=`/${c.routeSegment}/`,F={moduleId:c.id,tabId:$};return r[Z3(j)]=F,{...c,routeSegment:c.routeSegment,canonicalPath:j,tabs:A}}),t=i[0],y={moduleId:t?.id||"",tabId:t?.tabs[0]?.id||""};return r["/"]=y,{modules:i,moduleById:Object.fromEntries(i.map((c)=>[c.id,c])),defaultActiveTabs:n,routeMap:r,canonicalPathByTarget:f,fallbackTarget:y}}function k2(l,u){return l.routeMap[Z3(u)]||l.fallbackTarget}function H3(l,u,r){return l.canonicalPathByTarget[s2(u,r)]||l.canonicalPathByTarget[s2(l.fallbackTarget.moduleId,l.fallbackTarget.tabId)]||"/"}function vQ(l,u){let r=l.routeMap[Z3(u)];if(!r)return null;return H3(l,r.moduleId,r.tabId)}var S3=Rl(Ju(),1);var il=S3.default.createElement,{useEffect:sQ,useMemo:WZ}=S3.default,g2=S3.default.useState;function V3({status:l,children:u,title:r}){let f=String(l||"unknown").toLowerCase();return il("span",{className:`status-badge ${f}`,title:r},u||l||"unknown")}function Qc({label:l,value:u,hint:r,tone:f}){return il("article",{className:`metric-card ${f||""}`},il("div",{className:"metric-label"},l),il("div",{className:"metric-value"},u),il("div",{className:"metric-hint"},r))}function B3({title:l,eyebrow:u,actions:r,children:f,className:n,loading:i}){return il("section",{className:`panel ${n||""}`},il("div",{className:"panel-head"},il("div",null,u?il("p",{className:"panel-eyebrow"},u):null,il(fu,{title:l,loading:i})),r?il("div",{className:"panel-actions"},r):null),il("div",{className:"panel-body"},f))}function wc({title:l,data:u,onOpen:r,testId:f}){return il("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r?.(l,u)},"查看原始JSON")}function I2({title:l,text:u}){return il("div",{className:"empty-state"},il("strong",null,l),il("span",null,u))}function LZ(l){return l&&typeof l==="object"&&!Array.isArray(l)?l:null}function an(l){return Array.isArray(l)?l:[]}function ar(l){let u=Number(l);return Number.isFinite(u)?u.toLocaleString("zh-CN"):"--"}function kQ(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 GZ(l){return an(l?.tags).map((u)=>String(u||"").trim()).filter(Boolean)}function h0(l){let u=Number(l);return Number.isFinite(u)&&u>=0?Math.floor(u):0}function TZ(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function mZ(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function KZ(l){return String(l||"").split(/[\s,]+/u).map((u)=>u.trim()).filter(Boolean).join(",")}function D3(l,u){return`${l}/microservices/oa-event-flow/proxy${u}`}function zZ(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 EZ(l){let u=String(l?.subjectKind||"trace"),r=String(l?.subjectId||l?.scopeId||"");return r?`${u}:${r}`:String(l?.scopeId||"--")}function OZ({tags:l}){let u=GZ({tags:l}).slice(0,6);return il("div",{className:"oa-tag-rail"},u.length===0?il("span",{className:"muted"},"--"):u.map((r)=>il("code",{key:r},r)))}function ZZ({events:l,onRaw:u}){let r=[...an(l)].reverse();return r.length===0?il(I2,{title:"事件表暂无记录",text:"等待 Code Queue 或 Pipeline 按 tag 发布 OA 事件"}):il("div",{className:"table-wrap oa-event-table-wrap"},il("table",{className:"oa-event-table","data-testid":"oa-event-flow-event-table"},il("thead",null,il("tr",null,il("th",null,"Seq"),il("th",null,"Type"),il("th",null,"Source"),il("th",null,"Aggregate"),il("th",null,"Tags"),il("th",null,"Payload"),il("th",null,"Created"),il("th",null,"Raw"))),il("tbody",null,r.map((f)=>{let n=String(f?.type||"event"),i=`${String(f?.aggregateType||"--")}:${String(f?.aggregateId||"--")}`;return il("tr",{key:f?.eventId||f?.sequence},il("td",null,il("code",null,ar(f?.sequence))),il("td",null,il(V3,{status:zZ(n)},n)),il("td",null,il("strong",null,f?.sourceId||"--"),il("code",null,f?.sourceKind||"--")),il("td",null,il("code",null,i)),il("td",null,il(OZ,{tags:f?.tags})),il("td",null,il("span",{className:"oa-payload-preview"},kQ(f?.payload,180))),il("td",null,Wl(f?.createdAt)),il("td",null,il(wc,{title:`OA Event ${f?.sequence||""}`,data:f,onOpen:u,testId:`raw-oa-event-${f?.sequence||"unknown"}`})))}))))}function pZ({stats:l,onRaw:u}){let r=an(l);return r.length===0?il(I2,{title:"统计中心暂无投影",text:"trace-stats-snapshot / trace-step-created 进入事件流后会更新这里"}):il("div",{className:"table-wrap oa-stats-table-wrap"},il("table",{className:"oa-stats-table","data-testid":"oa-event-flow-stats"},il("thead",null,il("tr",null,il("th",null,"Scope"),il("th",null,"Service"),il("th",null,"STEP"),il("th",null,"Read"),il("th",null,"Edit"),il("th",null,"Run"),il("th",null,"Error"),il("th",null,"Output Seq"),il("th",null,"Revision"),il("th",null,"Updated"),il("th",null,"Raw"))),il("tbody",null,r.map((f)=>il("tr",{key:f?.scopeId||`${f?.serviceId}-${f?.subjectId}`},il("td",null,il("strong",null,EZ(f)),il("code",null,f?.scopeId||"--")),il("td",null,il(V3,{status:String(f?.serviceId||"unknown")==="code-queue"?"running":"queued"},f?.serviceId||"--")),il("td",null,il("strong",null,ar(h0(f?.stepCount??f?.llmStepCount)))),il("td",null,ar(h0(f?.readCount))),il("td",null,ar(h0(f?.editCount))),il("td",null,ar(h0(f?.runCount))),il("td",null,ar(h0(f?.errorCount))),il("td",null,il("code",null,ar(h0(f?.outputMaxSeq)))),il("td",null,ar(h0(f?.statsRevision))),il("td",null,Wl(f?.updatedAt)),il("td",null,il(wc,{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 gQ({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((T)=>T.id==="oa-event-flow")||null,[n,i]=g2("service:code-queue"),[t,y]=g2({loading:!1,error:"",health:null,diagnostics:null,events:[],stats:[],refreshedAt:null}),[c,$]=g2({status:"idle",message:"未连接",lastEventAt:""}),A=WZ(()=>KZ(n),[n]);async function j(){if(!f)return;y((T)=>({...T,loading:!0,error:""}));try{let T=A?`tags=${encodeURIComponent(A)}&`:"",[O,Z,E,D]=await Promise.all([ml(`${r}/microservices/oa-event-flow/health`,{failureFields:[]}),ml(D3(r,"/api/diagnostics")),ml(D3(r,`/api/events?${T}limit=100`)),ml(D3(r,`/api/stats/trace?${T}limit=100`))]);y({loading:!1,error:"",health:O,diagnostics:Z,events:an(E?.events),stats:an(D?.stats),refreshedAt:new Date})}catch(T){y((O)=>({...O,loading:!1,error:El(T,"OA Event Flow 加载失败")}))}}if(sQ(()=>{j()},[f?.id,f?.runtime?.providerStatus,A]),sQ(()=>{if(!f||typeof EventSource>"u")return;let T=A?`?tags=${encodeURIComponent(A)}`:"",O=new EventSource(`${D3(r,"/api/events/stream")}${T}`,{withCredentials:!0});$({status:"running",message:"SSE connecting",lastEventAt:""});let Z=(Y)=>{$({status:"online",message:kQ(Y.data,120),lastEventAt:new Date().toISOString()})},E=(Y)=>{try{let p=JSON.parse(String(Y.data||"{}"));$({status:"online",message:String(p?.type||Y.type||"event"),lastEventAt:new Date().toISOString()}),y((V)=>{let B=[...an(V.events).filter((X)=>String(X?.eventId||"")!==String(p?.eventId||"")),p].sort((X,S)=>Number(X?.sequence||0)-Number(S?.sequence||0)).slice(-100),m=p?.type==="trace-stats-updated"&&LZ(p?.payload?.stats)?[p.payload.stats,...an(V.stats).filter((X)=>String(X?.scopeId||"")!==String(p.payload.stats.scopeId||""))].slice(0,100):V.stats;return{...V,events:B,stats:m}})}catch(p){$({status:"warn",message:El(p,"SSE 事件解析失败"),lastEventAt:new Date().toISOString()})}},D=()=>{$((Y)=>({...Y,status:"warn",message:"SSE reconnecting"}))};return O.addEventListener("hello",Z),O.addEventListener("task-updated",E),O.addEventListener("queue-updated",E),O.addEventListener("trace-step-created",E),O.addEventListener("trace-stats-snapshot",E),O.addEventListener("trace-stats-updated",E),O.addEventListener("trace-error",E),O.onerror=D,()=>O.close()},[f?.id,r,A]),!f)return il(I2,{title:"OA Event Flow 未登记",text:"请在 config.json 的 microservices 中登记 id=oa-event-flow"});let F=TZ(f),U=mZ(f),N=t.diagnostics||{},W=t.health||{},L=N.eventCount??W.eventCount,J=N.traceStatsCount??W.traceStatsCount,w=N.latestSequence??W.latestSequence,Q=N.pipelineBridge||W.pipelineBridge||{},q=an(N.eventTypes).slice(0,8);return il("div",{className:"oa-event-flow-page","data-testid":"oa-event-flow-page"},il(B3,{title:"OA Event Flow 控制台",eyebrow:"Unified OA Event Bus + Stats Projection",loading:t.loading,actions:il("div",{className:"panel-actions"},il("button",{type:"button",className:"ghost-btn",onClick:j,disabled:t.loading,"data-testid":"oa-event-flow-refresh"},t.loading?"刷新中":"刷新"),il(wc,{title:"OA Event Flow Service",data:f,onOpen:u,testId:"raw-oa-event-flow-service"}))},il("div",{className:"oa-flow-hero"},il("div",null,il("div",{className:"node-version-line"},il(V3,{status:W?.ok||F.providerStatus==="online"?"online":"warn"},W?.ok?"HEALTH OK":F.providerStatus||"unknown"),il(V3,{status:c.status},c.status.toUpperCase()),il("span",null,U.public?"公网暴露":"仅 UniDesk frontend 代理访问")),il("p",{className:"muted paragraph"},"独立事件流微服务统一承载 Code Queue 与 Pipeline 的事件发布、tag 订阅、事件表审计和 Trace/STEP 统计投影。")),il("div",{className:"oa-flow-signal"},il("span",null,"stream"),il("strong",null,c.message||"--"),il("code",null,c.lastEventAt?iu(new Date(c.lastEventAt)):"waiting"))),il(lu,{error:t.error,wide:!0})),il("div",{className:"oa-flow-metrics"},il(Qc,{label:"事件总量",value:ar(L),hint:`latest seq ${ar(w)}`,tone:"ok"}),il(Qc,{label:"Trace Stats",value:ar(J),hint:"oa_trace_stats 投影"}),il(Qc,{label:"SSE Clients",value:ar(W?.sseClientCount??an(N.sseClients).length),hint:c.message||"tag subscription"}),il(Qc,{label:"Pipeline Bridge",value:Q?.enabled?ar(Q?.insertedCount):"OFF",hint:Q?.lastError||Q?.lastFinishedAt||`${Q?.mode||"snapshot"} service:pipeline`}),il(Qc,{label:"DB",value:W?.databaseReady||N.databaseReady?"READY":"WAIT",hint:W?.databaseLastError||N.databaseLastError||"PostgreSQL persisted"})),il(B3,{title:"标签订阅",eyebrow:t.refreshedAt?`Updated ${iu(t.refreshedAt)}`:"Tag Pub/Sub"},il("div",{className:"oa-filter-bar"},il("label",null,il("span",null,"tags"),il("input",{value:n,onChange:(T)=>i(T.target.value),placeholder:"service:code-queue, trace","data-testid":"oa-event-flow-tag-filter"})),il("div",{className:"oa-filter-presets"},il("button",{type:"button",className:"ghost-btn",onClick:()=>i("service:code-queue")},"Code Queue"),il("button",{type:"button",className:"ghost-btn",onClick:()=>i("service:pipeline")},"Pipeline"),il("button",{type:"button",className:"ghost-btn",onClick:()=>i("trace")},"Trace"),il("button",{type:"button",className:"ghost-btn",onClick:()=>i("")},"All")),il("code",null,A||"all events")),il("div",{className:"oa-type-strip"},q.length===0?il("span",{className:"muted"},"等待事件类型统计"):q.map((T)=>il("span",{key:T.type,className:"data-chip"},`${T.type} ${ar(T.count)}`)))),il("div",{className:"oa-flow-grid"},il(B3,{title:"事件表",eyebrow:"oa_events persisted log",className:"oa-flow-wide",loading:t.loading,actions:il(wc,{title:"OA Event Query",data:{events:t.events,diagnostics:N},onOpen:u,testId:"raw-oa-events"})},il(ZZ,{events:t.events,onRaw:u})),il(B3,{title:"统计中心",eyebrow:"oa_trace_stats read model",className:"oa-flow-wide",loading:t.loading,actions:il(wc,{title:"OA Trace Stats",data:t.stats,onOpen:u,testId:"raw-oa-trace-stats"})},il(pZ,{stats:t.stats,onRaw:u}))))}var l0=Rl(Ju(),1);var nl=Rl(dQ(),1),yl=Rl(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 lw(){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}})}Y3.prototype=lw.prototype={constructor:Y3,on:function(l,u){var r=this._,f=PZ(l+"",r),n,i=-1,t=f.length;if(arguments.length<2){while(++i0)for(var r=Array(n),f=0,n,i;f=0&&(u=l.slice(0,r))!=="xmlns")l=l.slice(r+1);return a2.hasOwnProperty(u)?{space:a2[u],local:l}:l}function o2(l){let u;while(u=l.sourceEvent)l=u;return l}function zr(l,u){if(l=o2(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 MZ(){}function hi(l){return l==null?MZ:function(){return this.querySelector(l)}}function d2(l){if(typeof l!=="function")l=hi(l);for(var u=this._groups,r=u.length,f=Array(r),n=0;n=Q)Q=w+1;while(!(T=L[Q])&&++Q=0;)if(t=f[n]){if(i&&t.compareDocumentPosition(i)^4)i.parentNode.insertBefore(t,i);i=t}return this}function A5(l){if(!l)l=eZ;function u(j,F){return j&&F?l(j.__data__,F.__data__):!j-!F}for(var r=this._groups,f=r.length,n=Array(f),i=0;iu?1:l>=u?0:NaN}function j5(){var l=arguments[0];return arguments[0]=this,l.apply(null,arguments),this}function F5(){return Array.from(this)}function J5(){for(var l=this._groups,u=0,r=l.length;u1?this.each((u==null?tp:typeof u==="function"?cp:yp)(l,u,r==null?"":r)):Ri(this.node(),l)}function Ri(l,u){return l.style.getPropertyValue(u)||Lc(l).getComputedStyle(l,null).getPropertyValue(u)}function _p(l){return function(){delete this[l]}}function $p(l,u){return function(){this[l]=u}}function Ap(l,u){return function(){var r=u.apply(this,arguments);if(r==null)delete this[l];else this[l]=r}}function W5(l,u){return arguments.length>1?this.each((u==null?_p:typeof u==="function"?Ap:$p)(l,u)):this.node()[l]}function uw(l){return l.trim().split(/^|\s+/)}function L5(l){return l.classList||new rw(l)}function rw(l){this._node=l,this._names=uw(l.getAttribute("class")||"")}rw.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 fw(l,u){var r=L5(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 Hp(l){return function(){var u=this.__on;if(!u)return;for(var r=0,f=-1,n=u.length,i;r()=>l;function Kc(l,{sourceEvent:u,subject:r,target:f,identifier:n,active:i,x:t,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:i,enumerable:!0,configurable:!0},x:{value:t,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}})}Kc.prototype.on=function(){var l=this._.on.apply(this._,arguments);return l===this._?this:l};function xp(l){return!l.ctrlKey&&!l.button}function bp(){return this.parentNode}function vp(l,u){return u==null?{x:l.x,y:l.y}:u}function sp(){return navigator.maxTouchPoints||"ontouchstart"in this}function zc(){var l=xp,u=bp,r=vp,f=sp,n={},i=R0("start","drag","end"),t=0,y,c,$,A,j=0;function F(q){q.on("mousedown.drag",U).filter(f).on("touchstart.drag",L).on("touchmove.drag",J,yw).on("touchend.drag touchcancel.drag",w).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function U(q,T){if(A||!l.call(this,q,T))return;var O=Q(this,u.call(this,q,T),q,T,"mouse");if(!O)return;fr(q.view).on("mousemove.drag",N,x0).on("mouseup.drag",W,x0),Jy(q.view),M3(q),$=!1,y=q.clientX,c=q.clientY,O("start",q)}function N(q){if(dn(q),!$){var T=q.clientX-y,O=q.clientY-c;$=T*T+O*O>j}n.mouse("drag",q)}function W(q){fr(q.view).on("mousemove.drag mouseup.drag",null),Tc(q.view,$),dn(q),n.mouse("end",q)}function L(q,T){if(!l.call(this,q,T))return;var O=q.changedTouches,Z=u.call(this,q,T),E=O.length,D,Y;for(D=0;D>8&15|u>>4&240,u>>4&15|u&240,(u&15)<<4|u&15,1):r===8?h3(u>>24&255,u>>16&255,u>>8&255,(u&255)/255):r===4?h3(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=gp.exec(l))?new or(u[1],u[2],u[3],1):(u=Ip.exec(l))?new or(u[1]*255/100,u[2]*255/100,u[3]*255/100,1):(u=ap.exec(l))?h3(u[1],u[2],u[3],u[4]):(u=op.exec(l))?h3(u[1]*255/100,u[2]*255/100,u[3]*255/100,u[4]):(u=dp.exec(l))?Jw(u[1],u[2]/100,u[3]/100,1):(u=ep.exec(l))?Jw(u[1],u[2]/100,u[3]/100,u[4]):cw.hasOwnProperty(l)?Aw(cw[l]):l==="transparent"?new or(NaN,NaN,NaN,0):null}function Aw(l){return new or(l>>16&255,l>>8&255,l&255,1)}function h3(l,u,r,f){if(f<=0)l=u=r=NaN;return new or(l,u,r,f)}function rH(l){if(!(l instanceof pc))l=ef(l);if(!l)return new or;return l=l.rgb(),new or(l.r,l.g,l.b,l.opacity)}function Ny(l,u,r,f){return arguments.length===1?rH(l):new or(l,u,r,f==null?1:f)}function or(l,u,r,f){this.r=+l,this.g=+u,this.b=+r,this.opacity=+f}Ec(or,Ny,X5(pc,{brighter(l){return l=l==null?x3:Math.pow(x3,l),new or(this.r*l,this.g*l,this.b*l,this.opacity)},darker(l){return l=l==null?Oc:Math.pow(Oc,l),new or(this.r*l,this.g*l,this.b*l,this.opacity)},rgb(){return this},clamp(){return new or(v0(this.r),v0(this.g),v0(this.b),b3(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:jw,formatHex:jw,formatHex8:fH,formatRgb:Fw,toString:Fw}));function jw(){return`#${b0(this.r)}${b0(this.g)}${b0(this.b)}`}function fH(){return`#${b0(this.r)}${b0(this.g)}${b0(this.b)}${b0((isNaN(this.opacity)?1:this.opacity)*255)}`}function Fw(){let l=b3(this.opacity);return`${l===1?"rgb(":"rgba("}${v0(this.r)}, ${v0(this.g)}, ${v0(this.b)}${l===1?")":`, ${l})`}`}function b3(l){return isNaN(l)?1:Math.max(0,Math.min(1,l))}function v0(l){return Math.max(0,Math.min(255,Math.round(l)||0))}function b0(l){return l=v0(l),(l<16?"0":"")+l.toString(16)}function Jw(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 df(l,u,r,f)}function Nw(l){if(l instanceof df)return new df(l.h,l.s,l.l,l.opacity);if(!(l instanceof pc))l=ef(l);if(!l)return new df;if(l instanceof df)return l;l=l.rgb();var u=l.r/255,r=l.g/255,f=l.b/255,n=Math.min(u,r,f),i=Math.max(u,r,f),t=NaN,y=i-n,c=(i+n)/2;if(y){if(u===i)t=(r-f)/y+(r0&&c<1?0:t;return new df(t,y,c,l.opacity)}function Qw(l,u,r,f){return arguments.length===1?Nw(l):new df(l,u,r,f==null?1:f)}function df(l,u,r,f){this.h=+l,this.s=+u,this.l=+r,this.opacity=+f}Ec(df,Qw,X5(pc,{brighter(l){return l=l==null?x3:Math.pow(x3,l),new df(this.h,this.s,this.l*l,this.opacity)},darker(l){return l=l==null?Oc:Math.pow(Oc,l),new df(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 or(Y5(l>=240?l-240:l+120,n,f),Y5(l,n,f),Y5(l<120?l+240:l-120,n,f),this.opacity)},clamp(){return new df(Uw(this.h),R3(this.s),R3(this.l),b3(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=b3(this.opacity);return`${l===1?"hsl(":"hsla("}${Uw(this.h)}, ${R3(this.s)*100}%, ${R3(this.l)*100}%${l===1?")":`, ${l})`}`}}));function Uw(l){return l=(l||0)%360,l<0?l+360:l}function R3(l){return Math.max(0,Math.min(1,l||0))}function Y5(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 P5(l,u,r,f,n){var i=l*l,t=i*l;return((1-3*l+3*i-t)*u+(4-6*i+3*t)*r+(1+3*l+3*i-3*t)*f+t*n)/6}function C5(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],i=l[f+1],t=f>0?l[f-1]:2*n-i,y=f()=>l;function iH(l,u){return function(r){return l+r*u}}function tH(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 ww(l){return(l=+l)===1?s3:function(u,r){return r-u?tH(u,r,l):Hc(isNaN(u)?r:u)}}function s3(l,u){var r=u-l;return r?iH(l,r):Hc(isNaN(l)?u:l)}var s0=function l(u){var r=ww(u);function f(n,i){var t=r((n=Ny(n)).r,(i=Ny(i)).r),y=r(n.g,i.g),c=r(n.b,i.b),$=s3(n.opacity,i.opacity);return function(A){return n.r=t(A),n.g=y(A),n.b=c(A),n.opacity=$(A),n+""}}return f.gamma=l,f}(1);function qw(l){return function(u){var r=u.length,f=Array(r),n=Array(r),i=Array(r),t,y;for(t=0;tr)if(i=u.slice(r,i),y[t])y[t]+=i;else y[++t]=i;if((f=f[0])===(n=n[0]))if(y[t])y[t]+=n;else y[++t]=n;else y[++t]=null,c.push({i:t,x:Er(f,n)});r=b5.lastIndex}if(r180)A+=360;else if(A-$>180)$+=360;F.push({i:j.push(n(j)+"rotate(",null,f)-2,x:Er($,A)})}else if(A)j.push(n(j)+"rotate("+A+f)}function y($,A,j,F){if($!==A)F.push({i:j.push(n(j)+"skewX(",null,f)-2,x:Er($,A)});else if(A)j.push(n(j)+"skewX("+A+f)}function c($,A,j,F,U,N){if($!==j||A!==F){var W=U.push(n(U)+"scale(",null,",",null,")");N.push({i:W-4,x:Er($,j)},{i:W-2,x:Er(A,F)})}else if(j!==1||F!==1)U.push(n(U)+"scale("+j+","+F+")")}return function($,A){var j=[],F=[];return $=l($),A=l(A),i($.translateX,$.translateY,A.translateX,A.translateY,j,F),t($.rotate,A.rotate,j,F),y($.skewX,A.skewX,j,F),c($.scaleX,$.scaleY,A.scaleX,A.scaleY,j,F),$=A=null,function(U){var N=-1,W=F.length,L;while(++N=0)l._call.call(void 0,u);l=l._next}--wy}function pw(){g0=(o3=Sc.now())+d3,wy=Dc=0;try{Dw()}finally{wy=0,OH(),g0=0}}function EH(){var l=Sc.now(),u=l-o3;if(u>Hw)d3-=u,o3=l}function OH(){var l,u=a3,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:a3=r;Vc=l,g5(f)}function g5(l){if(wy)return;if(Dc)Dc=clearTimeout(Dc);var u=l-g0;if(u>24){if(l<1/0)Dc=setTimeout(pw,l-Sc.now()-d3);if(Bc)Bc=clearInterval(Bc)}else{if(!Bc)o3=Sc.now(),Bc=setInterval(EH,Hw);wy=1,Bw(pw)}}function Pc(l,u,r){var f=new Xc;return u=u==null?0:+u,f.restart((n)=>{f.stop(),l(n+u)},u,r),f}var pH=R0("start","end","cancel","interrupt"),HH=[],Xw=0,Vw=1,uA=2,lA=3,Sw=4,rA=5,Cc=6;function en(l,u,r,f,n,i){var t=l.__transition;if(!t)l.__transition={};else if(r in t)return;BH(l,r,{name:u,index:f,group:n,on:pH,tween:HH,time:i.time,delay:i.delay,duration:i.duration,ease:i.ease,timer:null,state:Xw})}function Mc(l,u){var r=nr(l,u);if(r.state>Xw)throw Error("too late; already scheduled");return r}function Ur(l,u){var r=nr(l,u);if(r.state>lA)throw Error("too late; already running");return r}function nr(l,u){var r=l.__transition;if(!r||!(r=r[u]))throw Error("transition not found");return r}function BH(l,u,r){var f=l.__transition,n;f[u]=r,r.timer=e3(i,0,r.time);function i($){if(r.state=Vw,r.timer.restart(t,r.delay,r.time),r.delay<=$)t($-r.delay)}function t($){var A,j,F,U;if(r.state!==Vw)return c();for(A in f){if(U=f[A],U.name!==r.name)continue;if(U.state===lA)return Pc(t);if(U.state===Sw)U.state=Cc,U.timer.stop(),U.on.call("interrupt",l,l.__data__,U.index,U.group),delete f[A];else if(+AuA&&f.state=0)u=u.slice(0,r);return!u||u==="start"})}function dH(l,u,r){var f,n,i=oH(u)?Mc:Ur;return function(){var t=i(this,l),y=t.on;if(y!==f)(n=(f=y).copy()).on(u,r);t.on=n}}function i9(l,u){var r=this._id;return arguments.length<2?nr(this.node(),r).on.on(l):this.each(dH(r,l,u))}function eH(l){return function(){var u=this.parentNode;for(var r in this.__transition)if(+r!==l)return;if(u)u.removeChild(this)}}function t9(){return this.on("end.remove",eH(this._id))}function y9(l){var u=this._name,r=this._id;if(typeof l!=="function")l=hi(l);for(var f=this._groups,n=f.length,i=Array(n),t=0;t()=>l;function Q9(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 ln(l,u,r){this.k=l,this.x=u,this.y=r}ln.prototype={constructor:ln,scale:function(l){return l===1?this:new ln(this.k*l,this.x,this.y)},translate:function(l,u){return l===0&u===0?this:new ln(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 I0=new ln(1,0,0);xc.prototype=ln.prototype;function xc(l){while(!l.__zoom)if(!(l=l.parentNode))return I0;return l.__zoom}function FA(l){l.stopImmediatePropagation()}function a0(l){l.preventDefault(),l.stopImmediatePropagation()}function UB(l){return(!l.ctrlKey||l.type==="wheel")&&!l.button}function NB(){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 Cw(){return this.__zoom||I0}function QB(l){return-l.deltaY*(l.deltaMode===1?0.05:l.deltaMode?1:0.002)*(l.ctrlKey?10:1)}function wB(){return navigator.maxTouchPoints||"ontouchstart"in this}function qB(l,u,r){var f=l.invertX(u[0][0])-r[0][0],n=l.invertX(u[1][0])-r[1][0],i=l.invertY(u[0][1])-r[0][1],t=l.invertY(u[1][1])-r[1][1];return l.translate(n>f?(f+n)/2:Math.min(0,f)||Math.max(0,n),t>i?(i+t)/2:Math.min(0,i)||Math.max(0,t))}function bc(){var l=UB,u=NB,r=qB,f=QB,n=wB,i=[0,1/0],t=[[-1/0,-1/0],[1/0,1/0]],y=250,c=k0,$=R0("start","zoom","end"),A,j,F,U=500,N=150,W=0,L=10;function J(m){m.property("__zoom",Cw).on("wheel.zoom",E,{passive:!1}).on("mousedown.zoom",D).on("dblclick.zoom",Y).filter(n).on("touchstart.zoom",p).on("touchmove.zoom",V).on("touchend.zoom touchcancel.zoom",B).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}J.transform=function(m,X,S,b){var z=m.selection?m.selection():m;if(z.property("__zoom",Cw),m!==z)T(m,X,S,b);else z.interrupt().each(function(){O(this,arguments).event(b).start().zoom(null,typeof X==="function"?X.apply(this,arguments):X).end()})},J.scaleBy=function(m,X,S,b){J.scaleTo(m,function(){var z=this.__zoom.k,P=typeof X==="function"?X.apply(this,arguments):X;return z*P},S,b)},J.scaleTo=function(m,X,S,b){J.transform(m,function(){var z=u.apply(this,arguments),P=this.__zoom,s=S==null?q(z):typeof S==="function"?S.apply(this,arguments):S,k=P.invert(s),v=typeof X==="function"?X.apply(this,arguments):X;return r(Q(w(P,v),s,k),z,t)},S,b)},J.translateBy=function(m,X,S,b){J.transform(m,function(){return r(this.__zoom.translate(typeof X==="function"?X.apply(this,arguments):X,typeof S==="function"?S.apply(this,arguments):S),u.apply(this,arguments),t)},null,b)},J.translateTo=function(m,X,S,b,z){J.transform(m,function(){var P=u.apply(this,arguments),s=this.__zoom,k=b==null?q(P):typeof b==="function"?b.apply(this,arguments):b;return r(I0.translate(k[0],k[1]).scale(s.k).translate(typeof X==="function"?-X.apply(this,arguments):-X,typeof S==="function"?-S.apply(this,arguments):-S),P,t)},b,z)};function w(m,X){return X=Math.max(i[0],Math.min(i[1],X)),X===m.k?m:new ln(X,m.x,m.y)}function Q(m,X,S){var b=X[0]-S[0]*m.k,z=X[1]-S[1]*m.k;return b===m.x&&z===m.y?m:new ln(m.k,b,z)}function q(m){return[(+m[0][0]+ +m[1][0])/2,(+m[0][1]+ +m[1][1])/2]}function T(m,X,S,b){m.on("start.zoom",function(){O(this,arguments).event(b).start()}).on("interrupt.zoom end.zoom",function(){O(this,arguments).event(b).end()}).tween("zoom",function(){var z=this,P=arguments,s=O(z,P).event(b),k=u.apply(z,P),v=S==null?q(k):typeof S==="function"?S.apply(z,P):S,tl=Math.max(k[1][0]-k[0][0],k[1][1]-k[0][1]),I=z.__zoom,M=typeof X==="function"?X.apply(z,P):X,rl=c(I.invert(v).concat(tl/I.k),M.invert(v).concat(tl/M.k));return function(cl){if(cl===1)cl=M;else{var $l=rl(cl),Tl=tl/$l[2];cl=new ln(Tl,v[0]-$l[0]*Tl,v[1]-$l[1]*Tl)}s.zoom(null,cl)}})}function O(m,X,S){return!S&&m.__zooming||new Z(m,X)}function Z(m,X){this.that=m,this.args=X,this.active=0,this.sourceEvent=null,this.extent=u.apply(m,X),this.taps=0}Z.prototype={event:function(m){if(m)this.sourceEvent=m;return this},start:function(){if(++this.active===1)this.that.__zooming=this,this.emit("start");return this},zoom:function(m,X){if(this.mouse&&m!=="mouse")this.mouse[1]=X.invert(this.mouse[0]);if(this.touch0&&m!=="touch")this.touch0[1]=X.invert(this.touch0[0]);if(this.touch1&&m!=="touch")this.touch1[1]=X.invert(this.touch1[0]);return this.that.__zoom=X,this.emit("zoom"),this},end:function(){if(--this.active===0)delete this.that.__zooming,this.emit("end");return this},emit:function(m){var X=fr(this.that).datum();$.call(m,this.that,new Q9(m,{sourceEvent:this.sourceEvent,target:J,type:m,transform:this.that.__zoom,dispatch:$}),X)}};function E(m,...X){if(!l.apply(this,arguments))return;var S=O(this,X).event(m),b=this.__zoom,z=Math.max(i[0],Math.min(i[1],b.k*Math.pow(2,f.apply(this,arguments)))),P=zr(m);if(S.wheel){if(S.mouse[0][0]!==P[0]||S.mouse[0][1]!==P[1])S.mouse[1]=b.invert(S.mouse[0]=P);clearTimeout(S.wheel)}else if(b.k===z)return;else S.mouse=[P,b.invert(P)],xi(this),S.start();a0(m),S.wheel=setTimeout(s,N),S.zoom("mouse",r(Q(w(b,z),S.mouse[0],S.mouse[1]),S.extent,t));function s(){S.wheel=null,S.end()}}function D(m,...X){if(F||!l.apply(this,arguments))return;var S=m.currentTarget,b=O(this,X,!0).event(m),z=fr(m.view).on("mousemove.zoom",v,!0).on("mouseup.zoom",tl,!0),P=zr(m,S),s=m.clientX,k=m.clientY;Jy(m.view),FA(m),b.mouse=[P,this.__zoom.invert(P)],xi(this),b.start();function v(I){if(a0(I),!b.moved){var M=I.clientX-s,rl=I.clientY-k;b.moved=M*M+rl*rl>W}b.event(I).zoom("mouse",r(Q(b.that.__zoom,b.mouse[0]=zr(I,S),b.mouse[1]),b.extent,t))}function tl(I){z.on("mousemove.zoom mouseup.zoom",null),Tc(I.view,b.moved),a0(I),b.event(I).end()}}function Y(m,...X){if(!l.apply(this,arguments))return;var S=this.__zoom,b=zr(m.changedTouches?m.changedTouches[0]:m,this),z=S.invert(b),P=S.k*(m.shiftKey?0.5:2),s=r(Q(w(S,P),b,z),u.apply(this,X),t);if(a0(m),y>0)fr(this).transition().duration(y).call(T,s,b,m);else fr(this).call(J.transform,s,b,m)}function p(m,...X){if(!l.apply(this,arguments))return;var S=m.touches,b=S.length,z=O(this,X,m.changedTouches.length===b).event(m),P,s,k,v;FA(m);for(s=0;s"[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."},my=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],G9=["Enter"," ","Escape"],T9={"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"},si;(function(l){l.Strict="strict",l.Loose="loose"})(si||(si={}));var ui;(function(l){l.Free="free",l.Vertical="vertical",l.Horizontal="horizontal"})(ui||(ui={}));var o0;(function(l){l.Partial="partial",l.Full="full"})(o0||(o0={}));var m9={inProgress:!1,isValid:null,from:null,fromHandle:null,fromPosition:null,fromNode:null,to:null,toHandle:null,toPosition:null,toNode:null,pointer:null},Gn;(function(l){l.Bezier="default",l.Straight="straight",l.Step="step",l.SmoothStep="smoothstep",l.SimpleBezier="simplebezier"})(Gn||(Gn={}));var ki;(function(l){l.Arrow="arrow",l.ArrowClosed="arrowclosed"})(ki||(ki={}));var Kl;(function(l){l.Left="left",l.Top="top",l.Right="right",l.Bottom="bottom"})(Kl||(Kl={}));var Mw={[Kl.Left]:Kl.Right,[Kl.Right]:Kl.Left,[Kl.Top]:Kl.Bottom,[Kl.Bottom]:Kl.Top};function K9(l){return l===null?null:l?"valid":"invalid"}var z9=(l)=>("id"in l)&&("source"in l)&&("target"in l),ew=(l)=>("id"in l)&&("position"in l)&&!("source"in l)&&!("target"in l),E9=(l)=>("id"in l)&&("internals"in l)&&!("source"in l)&&!("target"in l);var kc=(l,u=[0,0])=>{let{width:r,height:f}=Tn(l),n=l.origin??u,i=r*n[0],t=f*n[1];return{x:l.position.x-i,y:l.position.y-t}},O9=(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 i=typeof n==="string",t=!u.nodeLookup&&!i?n:void 0;if(u.nodeLookup)t=i?u.nodeLookup.get(n):!E9(n)?u.nodeLookup.get(n.id):n;let y=t?NA(t,u.nodeOrigin):{x:0,y:0,x2:0,y2:0};return wA(f,y)},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return qA(r)},Ky=(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=wA(r,NA(n)),f=!0}),f?qA(r):{x:0,y:0,width:0,height:0}},QA=(l,u,[r,f,n]=[0,0,1],i=!1,t=!1)=>{let y={...Oy(u,[r,f,n]),width:u.width/n,height:u.height/n},c=[];for(let $ of l.values()){let{measured:A,selectable:j=!0,hidden:F=!1}=$;if(t&&!j||F)continue;let U=A.width??$.width??$.initialWidth??null,N=A.height??$.height??$.initialHeight??null,W=zy(y,e0($)),L=(U??0)*(N??0),J=i&&W>0;if(!$.internals.handleBounds||J||W>=L||$.dragging)c.push($)}return c},lq=(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 WB(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 uq({nodes:l,width:u,height:r,panZoom:f,minZoom:n,maxZoom:i},t){if(l.size===0)return Promise.resolve(!0);let y=WB(l,t),c=Ky(y),$=gc(c,u,r,t?.minZoom??n,t?.maxZoom??i,t?.padding??0.1);return await f.setViewport($,{duration:t?.duration,ease:t?.ease,interpolate:t?.interpolate}),Promise.resolve(!0)}function Z9({nodeId:l,nextPosition:u,nodeLookup:r,nodeOrigin:f=[0,0],nodeExtent:n,onError:i}){let t=r.get(l),y=t.parentId?r.get(t.parentId):void 0,{x:c,y:$}=y?y.internals.positionAbsolute:{x:0,y:0},A=t.origin??f,j=t.extent||n;if(t.extent==="parent"&&!t.expandParent)if(!y)i?.("005",Qf.error005());else{let U=y.measured.width,N=y.measured.height;if(U&&N)j=[[c,$],[c+U,$+N]]}else if(y&&Ty(t.extent))j=[[t.extent[0][0]+c,t.extent[0][1]+$],[t.extent[1][0]+c,t.extent[1][1]+$]];let F=Ty(j)?d0(u,j,t.measured):u;if(t.measured.width===void 0||t.measured.height===void 0)i?.("015",Qf.error015());return{position:{x:F.x-c+(t.measured.width??0)*A[0],y:F.y-$+(t.measured.height??0)*A[1]},positionAbsolute:F}}async function rq({nodesToRemove:l=[],edgesToRemove:u=[],nodes:r,edges:f,onBeforeDelete:n}){let i=new Set(l.map((F)=>F.id)),t=[];for(let F of r){if(F.deletable===!1)continue;let U=i.has(F.id),N=!U&&F.parentId&&t.find((W)=>W.id===F.parentId);if(U||N)t.push(F)}let y=new Set(u.map((F)=>F.id)),c=f.filter((F)=>F.deletable!==!1),A=lq(t,c);for(let F of c)if(y.has(F.id)&&!A.find((N)=>N.id===F.id))A.push(F);if(!n)return{edges:A,nodes:t};let j=await n({nodes:t,edges:A});if(typeof j==="boolean")return j?{edges:A,nodes:t}:{edges:[],nodes:[]};return j}var Gy=(l,u=0,r=1)=>Math.min(Math.max(l,u),r),d0=(l={x:0,y:0},u,r)=>({x:Gy(l.x,u[0][0],u[1][0]-(r?.width??0)),y:Gy(l.y,u[0][1],u[1][1]-(r?.height??0))});function fq(l,u,r){let{width:f,height:n}=Tn(r),{x:i,y:t}=r.internals.positionAbsolute;return d0(l,[[i,t],[i+f,t+n]],u)}var hw=(l,u,r)=>{if(lr)return-Gy(Math.abs(l-r),1,u)/u;return 0},nq=(l,u,r=15,f=40)=>{let n=hw(l.x,f,u.width-f)*r,i=hw(l.y,f,u.height-f)*r;return[n,i]},wA=(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)}),L9=({x:l,y:u,width:r,height:f})=>({x:l,y:u,x2:l+r,y2:u+f}),qA=({x:l,y:u,x2:r,y2:f})=>({x:l,y:u,width:r-l,height:f-u}),e0=(l,u=[0,0])=>{let{x:r,y:f}=E9(l)?l.internals.positionAbsolute:kc(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}},NA=(l,u=[0,0])=>{let{x:r,y:f}=E9(l)?l.internals.positionAbsolute:kc(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)}},p9=(l,u)=>qA(wA(L9(l),L9(u))),zy=(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)},H9=(l)=>Hf(l.width)&&Hf(l.height)&&Hf(l.x)&&Hf(l.y),Hf=(l)=>!isNaN(l)&&isFinite(l),B9=(l,u)=>{},Ey=(l,u=[1,1])=>{return{x:u[0]*Math.round(l.x/u[0]),y:u[1]*Math.round(l.y/u[1])}},Oy=({x:l,y:u},[r,f,n],i=!1,t=[1,1])=>{let y={x:(l-r)/n,y:(u-f)/n};return i?Ey(y,t):y},sc=({x:l,y:u},[r,f,n])=>{return{x:l*n+r,y:u*n+f}};function Wy(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 LB(l,u,r){if(typeof l==="string"||typeof l==="number"){let f=Wy(l,r),n=Wy(l,u);return{top:f,right:n,bottom:f,left:n,x:n*2,y:f*2}}if(typeof l==="object"){let f=Wy(l.top??l.y??0,r),n=Wy(l.bottom??l.y??0,r),i=Wy(l.left??l.x??0,u),t=Wy(l.right??l.x??0,u);return{top:f,right:t,bottom:n,left:i,x:i+t,y:f+n}}return{top:0,right:0,bottom:0,left:0,x:0,y:0}}function GB(l,u,r,f,n,i){let{x:t,y}=sc(l,[u,r,f]),{x:c,y:$}=sc({x:l.x+l.width,y:l.y+l.height},[u,r,f]),A=n-c,j=i-$;return{left:Math.floor(t),top:Math.floor(y),right:Math.floor(A),bottom:Math.floor(j)}}var gc=(l,u,r,f,n,i)=>{let t=LB(i,u,r),y=(u-t.x)/l.width,c=(r-t.y)/l.height,$=Math.min(y,c),A=Gy($,f,n),j=l.x+l.width/2,F=l.y+l.height/2,U=u/2-j*A,N=r/2-F*A,W=GB(l,U,N,A,u,r),L={left:Math.min(W.left-t.left,0),top:Math.min(W.top-t.top,0),right:Math.min(W.right-t.right,0),bottom:Math.min(W.bottom-t.bottom,0)};return{x:U-L.left+L.right,y:N-L.top+L.bottom,zoom:A}},Zy=()=>typeof navigator<"u"&&navigator?.userAgent?.indexOf("Mac")>=0;function Ty(l){return l!==void 0&&l!==null&&l!=="parent"}function Tn(l){return{width:l.measured?.width??l.width??l.initialWidth??0,height:l.measured?.height??l.height??l.initialHeight??0}}function D9(l){return(l.measured?.width??l.width??l.initialWidth)!==void 0&&(l.measured?.height??l.height??l.initialHeight)!==void 0}function V9(l,u={width:0,height:0},r,f,n){let i={...l},t=f.get(r);if(t){let y=t.origin||n;i.x+=t.internals.positionAbsolute.x-(u.width??0)*y[0],i.y+=t.internals.positionAbsolute.y-(u.height??0)*y[1]}return i}function S9(l,u){if(l.size!==u.size)return!1;for(let r of l)if(!u.has(r))return!1;return!0}function iq(){let l,u;return{promise:new Promise((f,n)=>{l=f,u=n}),resolve:l,reject:u}}function tq(l){return{...T9,...l||{}}}function vc(l,{snapGrid:u=[0,0],snapToGrid:r=!1,transform:f,containerBounds:n}){let{x:i,y:t}=Bf(l),y=Oy({x:i-(n?.left??0),y:t-(n?.top??0)},f),{x:c,y:$}=r?Ey(y,u):y;return{xSnapped:c,ySnapped:$,...y}}var WA=(l)=>({width:l.offsetWidth,height:l.offsetHeight}),X9=(l)=>l?.getRootNode?.()||window?.document,TB=["INPUT","SELECT","TEXTAREA"];function Y9(l){let u=l.composedPath?.()?.[0]||l.target;if(u?.nodeType!==1)return!1;return TB.includes(u.nodeName)||u.hasAttribute("contenteditable")||!!u.closest(".nokey")}var P9=(l)=>("clientX"in l),Bf=(l,u)=>{let r=P9(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)}},Rw=(l,u,r,f,n)=>{let i=u.querySelectorAll(`.${l}`);if(!i||!i.length)return null;return Array.from(i).map((t)=>{let y=t.getBoundingClientRect();return{id:t.getAttribute("data-handleid"),type:l,nodeId:n,position:t.getAttribute("data-handlepos"),x:(y.left-r.left)/f,y:(y.top-r.top)/f,...WA(t)}})};function LA({sourceX:l,sourceY:u,targetX:r,targetY:f,sourceControlX:n,sourceControlY:i,targetControlX:t,targetControlY:y}){let c=l*0.125+n*0.375+t*0.375+r*0.125,$=u*0.125+i*0.375+y*0.375+f*0.125,A=Math.abs(c-l),j=Math.abs($-u);return[c,$,A,j]}function JA(l,u){if(l>=0)return 0.5*l;return u*25*Math.sqrt(-l)}function xw({pos:l,x1:u,y1:r,x2:f,y2:n,c:i}){switch(l){case Kl.Left:return[u-JA(u-f,i),r];case Kl.Right:return[u+JA(f-u,i),r];case Kl.Top:return[u,r-JA(r-n,i)];case Kl.Bottom:return[u,r+JA(n-r,i)]}}function GA({sourceX:l,sourceY:u,sourcePosition:r=Kl.Bottom,targetX:f,targetY:n,targetPosition:i=Kl.Top,curvature:t=0.25}){let[y,c]=xw({pos:r,x1:l,y1:u,x2:f,y2:n,c:t}),[$,A]=xw({pos:i,x1:f,y1:n,x2:l,y2:u,c:t}),[j,F,U,N]=LA({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}`,j,F,U,N]}function C9({sourceX:l,sourceY:u,targetX:r,targetY:f}){let n=Math.abs(r-l)/2,i=r0}var mB=({source:l,sourceHandle:u,target:r,targetHandle:f})=>`xy-edge__${l}${u||""}-${r}${f||""}`,KB=(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))},M9=(l,u,r={})=>{if(!l.source||!l.target)return B9("006",Qf.error006()),u;let f=r.getEdgeId||mB,n;if(z9(l))n={...l};else n={...l,id:f(l)};if(KB(n,u))return u;if(n.sourceHandle===null)delete n.sourceHandle;if(n.targetHandle===null)delete n.targetHandle;return u.concat(n)};function TA({sourceX:l,sourceY:u,targetX:r,targetY:f}){let[n,i,t,y]=C9({sourceX:l,sourceY:u,targetX:r,targetY:f});return[`M ${l},${u}L ${r},${f}`,n,i,t,y]}var bw={[Kl.Left]:{x:-1,y:0},[Kl.Right]:{x:1,y:0},[Kl.Top]:{x:0,y:-1},[Kl.Bottom]:{x:0,y:1}},zB=({source:l,sourcePosition:u=Kl.Bottom,target:r})=>{if(u===Kl.Left||u===Kl.Right)return l.xMath.sqrt(Math.pow(u.x-l.x,2)+Math.pow(u.y-l.y,2));function EB({source:l,sourcePosition:u=Kl.Bottom,target:r,targetPosition:f=Kl.Top,center:n,offset:i,stepPosition:t}){let y=bw[u],c=bw[f],$={x:l.x+y.x*i,y:l.y+y.y*i},A={x:r.x+c.x*i,y:r.y+c.y*i},j=zB({source:$,sourcePosition:u,target:A}),F=j.x!==0?"x":"y",U=j[F],N=[],W,L,J={x:0,y:0},w={x:0,y:0},[,,Q,q]=C9({sourceX:l.x,sourceY:l.y,targetX:r.x,targetY:r.y});if(y[F]*c[F]===-1){if(F==="x")W=n.x??$.x+(A.x-$.x)*t,L=n.y??($.y+A.y)/2;else W=n.x??($.x+A.x)/2,L=n.y??$.y+(A.y-$.y)*t;let E=[{x:W,y:$.y},{x:W,y:A.y}],D=[{x:$.x,y:L},{x:A.x,y:L}];if(y[F]===U)N=F==="x"?E:D;else N=F==="x"?D:E}else{let E=[{x:$.x,y:A.y}],D=[{x:A.x,y:$.y}];if(F==="x")N=y.x===U?D:E;else N=y.y===U?E:D;if(u===f){let m=Math.abs(l[F]-r[F]);if(m<=i){let X=Math.min(i-1,i-m);if(y[F]===U)J[F]=($[F]>l[F]?-1:1)*X;else w[F]=(A[F]>r[F]?-1:1)*X}}if(u!==f){let m=F==="x"?"y":"x",X=y[F]===c[m],S=$[m]>A[m],b=$[m]=B)W=(Y.x+p.x)/2,L=N[0].y;else W=N[0].x,L=(Y.y+p.y)/2}let T={x:$.x+J.x,y:$.y+J.y},O={x:A.x+w.x,y:A.y+w.y};return[[l,...T.x!==N[0].x||T.y!==N[0].y?[T]:[],...N,...O.x!==N[N.length-1].x||O.y!==N[N.length-1].y?[O]:[],r],W,L,Q,q]}function OB(l,u,r,f){let n=Math.min(vw(l,u)/2,vw(u,r)/2,f),{x:i,y:t}=u;if(l.x===i&&i===r.x||l.y===t&&t===r.y)return`L${i} ${t}`;if(l.y===t){let $=l.xr.id===u))||null}function mA(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 $q(l,{id:u,defaultColor:r,defaultMarkerStart:f,defaultMarkerEnd:n}){let i=new Set;return l.reduce((t,y)=>{return[y.markerStart||f,y.markerEnd||n].forEach((c)=>{if(c&&typeof c==="object"){let $=mA(c,u);if(!i.has($))t.push({id:$,color:c.color||r,...c}),i.add($)}}),t},[]).sort((t,y)=>t.id.localeCompare(y.id))}var Aq=1000,ZB=10,h9={nodeOrigin:[0,0],nodeExtent:my,elevateNodesOnSelect:!0,zIndexMode:"basic",defaults:{}},pB={...h9,checkEquality:!0};function R9(l,u){let r={...l};for(let f in u)if(u[f]!==void 0)r[f]=u[f];return r}function jq(l,u,r){let f=R9(h9,r);for(let n of l.values())if(n.parentId)b9(n,l,u,f);else{let i=kc(n,f.nodeOrigin),t=Ty(n.extent)?n.extent:f.nodeExtent,y=d0(i,t,Tn(n));n.internals.positionAbsolute=y}}function HB(l,u){if(!l.handles)return!l.measured?void 0:u?.internals.handleBounds;let r=[],f=[];for(let n of l.handles){let i={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(i);else if(n.type==="target")f.push(i)}return{source:r,target:f}}function x9(l){return l==="manual"}function KA(l,u,r,f={}){let n=R9(pB,f),i={i:0},t=new Map(u),y=n?.elevateNodesOnSelect&&!x9(n.zIndexMode)?Aq:0,c=l.length>0,$=!1;u.clear(),r.clear();for(let A of l){let j=t.get(A.id);if(n.checkEquality&&A===j?.internals.userNode)u.set(A.id,j);else{let F=kc(A,n.nodeOrigin),U=Ty(A.extent)?A.extent:n.nodeExtent,N=d0(F,U,Tn(A));j={...n.defaults,...A,measured:{width:A.measured?.width,height:A.measured?.height},internals:{positionAbsolute:N,handleBounds:HB(A,j),z:Fq(A,y,n.zIndexMode),userNode:A}},u.set(A.id,j)}if((j.measured===void 0||j.measured.width===void 0||j.measured.height===void 0)&&!j.hidden)c=!1;if(A.parentId)b9(j,u,r,f,i);$||=A.selected??!1}return{nodesInitialized:c,hasSelectedNodes:$}}function BB(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 b9(l,u,r,f,n){let{elevateNodesOnSelect:i,nodeOrigin:t,nodeExtent:y,zIndexMode:c}=R9(h9,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(BB(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*ZB;if(n&&A.internals.rootParentIndex!==void 0)n.i=A.internals.rootParentIndex;let j=i&&!x9(c)?Aq:0,{x:F,y:U,z:N}=DB(l,A,t,y,j,c),{positionAbsolute:W}=l.internals,L=F!==W.x||U!==W.y;if(L||N!==l.internals.z)u.set(l.id,{...l,internals:{...l.internals,positionAbsolute:L?{x:F,y:U}:W,z:N}})}function Fq(l,u,r){let f=Hf(l.zIndex)?l.zIndex:0;if(x9(r))return f;return f+(l.selected?u:0)}function DB(l,u,r,f,n,i){let{x:t,y}=u.internals.positionAbsolute,c=Tn(l),$=kc(l,r),A=Ty(l.extent)?d0($,l.extent,c):$,j=d0({x:t+A.x,y:y+A.y},f,c);if(l.extent==="parent")j=fq(j,c,u);let F=Fq(l,n,i),U=u.internals.z??0;return{x:j.x,y:j.y,z:U>=F?U+1:F}}function zA(l,u,r,f=[0,0]){let n=[],i=new Map;for(let t of l){let y=u.get(t.parentId);if(!y)continue;let c=i.get(t.parentId)?.expandedRect??e0(y),$=p9(c,t.rect);i.set(t.parentId,{expandedRect:$,parent:y})}if(i.size>0)i.forEach(({expandedRect:t,parent:y},c)=>{let $=y.internals.positionAbsolute,A=Tn(y),j=y.origin??f,F=t.x<$.x?Math.round(Math.abs($.x-t.x)):0,U=t.y<$.y?Math.round(Math.abs($.y-t.y)):0,N=Math.max(A.width,Math.round(t.width)),W=Math.max(A.height,Math.round(t.height)),L=(N-A.width)*j[0],J=(W-A.height)*j[1];if(F>0||U>0||L||J)n.push({id:c,type:"position",position:{x:y.position.x-F+L,y:y.position.y-U+J}}),r.get(c)?.forEach((w)=>{if(!l.some((Q)=>Q.id===w.id))n.push({id:w.id,type:"position",position:{x:w.position.x+F,y:w.position.y+U}})});if(A.width0){let U=zA(F,u,r,n);$.push(...U)}return{changes:$,updatedInternals:c}}async function Uq({delta:l,panZoom:u,transform:r,translateExtent:f,width:n,height:i}){if(!u||!l.x&&!l.y)return Promise.resolve(!1);let t=await u.setViewportConstrained({x:r[0]+l.x,y:r[1]+l.y,zoom:r[2]},[[0,0],[n,i]],f),y=!!t&&(t.x!==r[0]||t.y!==r[1]||t.k!==r[2]);return Promise.resolve(y)}function Iw(l,u,r,f,n,i){let t=n,y=f.get(t)||new Map;f.set(t,y.set(r,u)),t=`${n}-${l}`;let c=f.get(t)||new Map;if(f.set(t,c.set(r,u)),i){t=`${n}-${l}-${i}`;let $=f.get(t)||new Map;f.set(t,$.set(r,u))}}function v9(l,u,r){l.clear(),u.clear();for(let f of r){let{source:n,target:i,sourceHandle:t=null,targetHandle:y=null}=f,c={edgeId:f.id,source:n,target:i,sourceHandle:t,targetHandle:y},$=`${n}-${t}--${i}-${y}`,A=`${i}-${y}--${n}-${t}`;Iw("source",c,A,l,n,t),Iw("target",c,$,l,i,y),u.set(f.id,f)}}function Nq(l,u){if(!l.parentId)return!1;let r=u.get(l.parentId);if(!r)return!1;if(r.selected)return!0;return Nq(r,u)}function aw(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 VB(l,u,r,f){let n=new Map;for(let[i,t]of l)if((t.selected||t.id===f)&&(!t.parentId||!Nq(t,l))&&(t.draggable||u&&typeof t.draggable>"u")){let y=l.get(i);if(y)n.set(i,{id:i,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 w9({nodeId:l,dragItems:u,nodeLookup:r,dragging:f=!0}){let n=[];for(let[t,y]of u){let c=r.get(t)?.internals.userNode;if(c)n.push({...c,position:y.position,dragging:f})}if(!l)return[n[0],n];let i=r.get(l)?.internals.userNode;return[!i?n[0]:{...i,position:u.get(l)?.position||i.position,dragging:f},n]}function SB({dragItems:l,snapGrid:u,x:r,y:f}){let n=l.values().next().value;if(!n)return null;let i={x:r-n.distance.x,y:f-n.distance.y},t=Ey(i,u);return{x:t.x-i.x,y:t.y-i.y}}function Qq({onNodeMouseDown:l,getStoreItems:u,onDragStart:r,onDrag:f,onDragStop:n}){let i={x:null,y:null},t=0,y=new Map,c=!1,$={x:0,y:0},A=null,j=!1,F=null,U=!1,N=!1,W=null;function L({noDragClassName:w,handleSelector:Q,domNode:q,isSelectable:T,nodeId:O,nodeClickDistance:Z=0}){F=fr(q);function E({x:V,y:B}){let{nodeLookup:m,nodeExtent:X,snapGrid:S,snapToGrid:b,nodeOrigin:z,onNodeDrag:P,onSelectionDrag:s,onError:k,updateNodePositions:v}=u();i={x:V,y:B};let tl=!1,I=y.size>1,M=I&&X?L9(Ky(y)):null,rl=I&&b?SB({dragItems:y,snapGrid:S,x:V,y:B}):null;for(let[cl,$l]of y){if(!m.has(cl))continue;let Tl={x:V-$l.distance.x,y:B-$l.distance.y};if(b)Tl=rl?{x:Math.round(Tl.x+rl.x),y:Math.round(Tl.y+rl.y)}:Ey(Tl,S);let Ql=null;if(I&&X&&!$l.extent&&M){let{positionAbsolute:a}=$l.internals,ul=a.x-M.x+X[0][0],zl=a.x+$l.measured.width-M.x2+X[1][0],o=a.y-M.y+X[0][1],ql=a.y+$l.measured.height-M.y2+X[1][1];Ql=[[ul,o],[zl,ql]]}let{position:Ol,positionAbsolute:h}=Z9({nodeId:cl,nextPosition:Tl,nodeLookup:m,nodeExtent:Ql?Ql:X,nodeOrigin:z,onError:k});tl=tl||$l.position.x!==Ol.x||$l.position.y!==Ol.y,$l.position=Ol,$l.internals.positionAbsolute=h}if(N=N||tl,!tl)return;if(v(y,!0),W&&(f||P||!O&&s)){let[cl,$l]=w9({nodeId:O,dragItems:y,nodeLookup:m});if(f?.(W,y,cl,$l),P?.(W,cl,$l),!O)s?.(W,$l)}}async function D(){if(!A)return;let{transform:V,panBy:B,autoPanSpeed:m,autoPanOnNodeDrag:X}=u();if(!X){c=!1,cancelAnimationFrame(t);return}let[S,b]=nq($,A,m);if(S!==0||b!==0){if(i.x=(i.x??0)-S/V[2],i.y=(i.y??0)-b/V[2],await B({x:S,y:b}))E(i)}t=requestAnimationFrame(D)}function Y(V){let{nodeLookup:B,multiSelectionActive:m,nodesDraggable:X,transform:S,snapGrid:b,snapToGrid:z,selectNodesOnDrag:P,onNodeDragStart:s,onSelectionDragStart:k,unselectNodesAndEdges:v}=u();if(j=!0,(!P||!T)&&!m&&O){if(!B.get(O)?.selected)v()}if(T&&P&&O)l?.(O);let tl=vc(V.sourceEvent,{transform:S,snapGrid:b,snapToGrid:z,containerBounds:A});if(i=tl,y=VB(B,X,tl,O),y.size>0&&(r||s||!O&&k)){let[I,M]=w9({nodeId:O,dragItems:y,nodeLookup:B});if(r?.(V.sourceEvent,y,I,M),s?.(V.sourceEvent,I,M),!O)k?.(V.sourceEvent,M)}}let p=zc().clickDistance(Z).on("start",(V)=>{let{domNode:B,nodeDragThreshold:m,transform:X,snapGrid:S,snapToGrid:b}=u();if(A=B?.getBoundingClientRect()||null,U=!1,N=!1,W=V.sourceEvent,m===0)Y(V);i=vc(V.sourceEvent,{transform:X,snapGrid:S,snapToGrid:b,containerBounds:A}),$=Bf(V.sourceEvent,A)}).on("drag",(V)=>{let{autoPanOnNodeDrag:B,transform:m,snapGrid:X,snapToGrid:S,nodeDragThreshold:b,nodeLookup:z}=u(),P=vc(V.sourceEvent,{transform:m,snapGrid:X,snapToGrid:S,containerBounds:A});if(W=V.sourceEvent,V.sourceEvent.type==="touchmove"&&V.sourceEvent.touches.length>1||O&&!z.has(O))U=!0;if(U)return;if(!c&&B&&j)c=!0,D();if(!j){let s=Bf(V.sourceEvent,A),k=s.x-$.x,v=s.y-$.y;if(Math.sqrt(k*k+v*v)>b)Y(V)}if((i.x!==P.xSnapped||i.y!==P.ySnapped)&&y&&j)$=Bf(V.sourceEvent,A),E(P)}).on("end",(V)=>{if(!j||U)return;if(c=!1,j=!1,cancelAnimationFrame(t),y.size>0){let{nodeLookup:B,updateNodePositions:m,onNodeDragStop:X,onSelectionDragStop:S}=u();if(N)m(y,!1),N=!1;if(n||X||!O&&S){let[b,z]=w9({nodeId:O,dragItems:y,nodeLookup:B,dragging:!1});if(n?.(V.sourceEvent,y,b,z),X?.(V.sourceEvent,b,z),!O)S?.(V.sourceEvent,z)}}}).filter((V)=>{let B=V.target;return!V.button&&(!w||!aw(B,`.${w}`,q))&&(!Q||aw(B,Q,q))});F.call(p)}function J(){F?.on(".drag",null)}return{update:L,destroy:J}}function XB(l,u,r){let f=[],n={x:l.x-r,y:l.y-r,width:r*2,height:r*2};for(let i of u.values())if(zy(n,e0(i))>0)f.push(i);return f}var YB=250;function PB(l,u,r,f){let n=[],i=1/0,t=XB(l,r,u+YB);for(let y of t){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:j}=gi(y,$,$.position,!0),F=Math.sqrt(Math.pow(A-l.x,2)+Math.pow(j-l.y,2));if(F>u)continue;if(F1){let y=f.type==="source"?"target":"source";return n.find((c)=>c.type===y)??n[0]}return n[0]}function wq(l,u,r,f,n,i=!1){let t=f.get(l);if(!t)return null;let y=n==="strict"?t.internals.handleBounds?.[u]:[...t.internals.handleBounds?.source??[],...t.internals.handleBounds?.target??[]],c=(r?y?.find(($)=>$.id===r):y?.[0])??null;return c&&i?{...c,...gi(t,c,c.position,!0)}:c}function qq(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 CB(l,u){let r=null;if(u)r=!0;else if(l&&!u)r=!1;return r}var Wq=()=>!0;function MB(l,{connectionMode:u,connectionRadius:r,handleId:f,nodeId:n,edgeUpdaterType:i,isTarget:t,domNode:y,nodeLookup:c,lib:$,autoPanOnConnect:A,flowId:j,panBy:F,cancelConnection:U,onConnectStart:N,onConnect:W,onConnectEnd:L,isValidConnection:J=Wq,onReconnectEnd:w,updateConnection:Q,getTransform:q,getFromHandle:T,autoPanSpeed:O,dragThreshold:Z=1,handleDomNode:E}){let D=X9(l.target),Y=0,p,{x:V,y:B}=Bf(l),m=qq(i,E),X=y?.getBoundingClientRect(),S=!1;if(!X||!m)return;let b=wq(n,m,f,c,u);if(!b)return;let z=Bf(l,X),P=!1,s=null,k=!1,v=null;function tl(){if(!A||!X)return;let[Ol,h]=nq(z,X,O);F({x:Ol,y:h}),Y=requestAnimationFrame(tl)}let I={...b,nodeId:n,type:m,position:b.position},M=c.get(n),cl={inProgress:!0,isValid:null,from:gi(M,I,Kl.Left,!0),fromHandle:I,fromPosition:I.position,fromNode:M,to:z,toHandle:null,toPosition:Mw[I.position],toNode:null,pointer:z};function $l(){S=!0,Q(cl),N?.(l,{nodeId:n,handleId:f,handleType:m})}if(Z===0)$l();function Tl(Ol){if(!S){let{x:ql,y:pl}=Bf(Ol),Bl=ql-V,Il=pl-B;if(!(Bl*Bl+Il*Il>Z*Z))return;$l()}if(!T()||!I){Ql(Ol);return}let h=q();if(z=Bf(Ol,X),p=PB(Oy(z,h,!1,[1,1]),r,c,I),!P)tl(),P=!0;let a=Lq(Ol,{handle:p,connectionMode:u,fromNodeId:n,fromHandleId:f,fromType:t?"target":"source",isValidConnection:J,doc:D,lib:$,flowId:j,nodeLookup:c});v=a.handleDomNode,s=a.connection,k=CB(!!p,a.isValid);let ul=c.get(n),zl=ul?gi(ul,I,Kl.Left,!0):cl.from,o={...cl,from:zl,isValid:k,to:a.toHandle&&k?sc({x:a.toHandle.x,y:a.toHandle.y},h):z,toHandle:a.toHandle,toPosition:k&&a.toHandle?a.toHandle.position:Mw[I.position],toNode:a.toHandle?c.get(a.toHandle.nodeId):null,pointer:z};Q(o),cl=o}function Ql(Ol){if("touches"in Ol&&Ol.touches.length>0)return;if(S){if((p||v)&&s&&k)W?.(s);let{inProgress:h,...a}=cl,ul={...a,toPosition:cl.toHandle?cl.toPosition:null};if(L?.(Ol,ul),i)w?.(Ol,ul)}U(),cancelAnimationFrame(Y),P=!1,k=!1,s=null,v=null,D.removeEventListener("mousemove",Tl),D.removeEventListener("mouseup",Ql),D.removeEventListener("touchmove",Tl),D.removeEventListener("touchend",Ql)}D.addEventListener("mousemove",Tl),D.addEventListener("mouseup",Ql),D.addEventListener("touchmove",Tl),D.addEventListener("touchend",Ql)}function Lq(l,{handle:u,connectionMode:r,fromNodeId:f,fromHandleId:n,fromType:i,doc:t,lib:y,flowId:c,isValidConnection:$=Wq,nodeLookup:A}){let j=i==="target",F=u?t.querySelector(`.${y}-flow__handle[data-id="${c}-${u?.nodeId}-${u?.id}-${u?.type}"]`):null,{x:U,y:N}=Bf(l),W=t.elementFromPoint(U,N),L=W?.classList.contains(`${y}-flow__handle`)?W:F,J={handleDomNode:L,isValid:!1,connection:null,toHandle:null};if(L){let w=qq(void 0,L),Q=L.getAttribute("data-nodeid"),q=L.getAttribute("data-handleid"),T=L.classList.contains("connectable"),O=L.classList.contains("connectableend");if(!Q||!w)return J;let Z={source:j?Q:f,sourceHandle:j?q:n,target:j?f:Q,targetHandle:j?n:q};J.connection=Z;let D=T&&O&&(r===si.Strict?j&&w==="source"||!j&&w==="target":Q!==f||q!==n);J.isValid=D&&$(Z),J.toHandle=wq(Q,w,q,A,r,!0)}return J}var EA={onPointerDown:MB,isValid:Lq};function Gq({domNode:l,panZoom:u,getTransform:r,getViewScale:f}){let n=fr(l);function i({translateExtent:y,width:c,height:$,zoomStep:A=1,pannable:j=!0,zoomable:F=!0,inversePan:U=!1}){let N=(Q)=>{if(Q.sourceEvent.type!=="wheel"||!u)return;let q=r(),T=Q.sourceEvent.ctrlKey&&Zy()?10:1,O=-Q.sourceEvent.deltaY*(Q.sourceEvent.deltaMode===1?0.05:Q.sourceEvent.deltaMode?1:0.002)*A,Z=q[2]*Math.pow(2,O*T);u.scaleTo(Z)},W=[0,0],L=(Q)=>{if(Q.sourceEvent.type==="mousedown"||Q.sourceEvent.type==="touchstart")W=[Q.sourceEvent.clientX??Q.sourceEvent.touches[0].clientX,Q.sourceEvent.clientY??Q.sourceEvent.touches[0].clientY]},J=(Q)=>{let q=r();if(Q.sourceEvent.type!=="mousemove"&&Q.sourceEvent.type!=="touchmove"||!u)return;let T=[Q.sourceEvent.clientX??Q.sourceEvent.touches[0].clientX,Q.sourceEvent.clientY??Q.sourceEvent.touches[0].clientY],O=[T[0]-W[0],T[1]-W[1]];W=T;let Z=f()*Math.max(q[2],Math.log(q[2]))*(U?-1:1),E={x:q[0]-O[0]*Z,y:q[1]-O[1]*Z},D=[[0,0],[c,$]];u.setViewportConstrained({x:E.x,y:E.y,zoom:q[2]},D,y)},w=bc().on("start",L).on("zoom",j?J:null).on("zoom.wheel",F?N:null);n.call(w,{})}function t(){n.on("zoom",null)}return{update:i,destroy:t,pointer:zr}}var OA=(l)=>({x:l.x,y:l.y,zoom:l.k}),q9=({x:l,y:u,zoom:r})=>I0.translate(l,u).scale(r),Ly=(l,u)=>l.target.closest(`.${u}`),Tq=(l,u)=>u===2&&Array.isArray(l)&&l.includes(2),hB=(l)=>((l*=2)<=1?l*l*l:(l-=2)*l*l+2)/2,W9=(l,u=0,r=hB,f=()=>{})=>{let n=typeof u==="number"&&u>0;if(!n)f();return n?l.transition().duration(u).ease(r).on("end",f):l},mq=(l)=>{let u=l.ctrlKey&&Zy()?10:1;return-l.deltaY*(l.deltaMode===1?0.05:l.deltaMode?1:0.002)*u};function RB({zoomPanValues:l,noWheelClassName:u,d3Selection:r,d3Zoom:f,panOnScrollMode:n,panOnScrollSpeed:i,zoomOnPinch:t,onPanZoomStart:y,onPanZoom:c,onPanZoomEnd:$}){return(A)=>{if(Ly(A,u)){if(A.ctrlKey)A.preventDefault();return!1}A.preventDefault(),A.stopImmediatePropagation();let j=r.property("__zoom").k||1;if(A.ctrlKey&&t){let L=zr(A),J=mq(A),w=j*Math.pow(2,J);f.scaleTo(r,w,L,A);return}let F=A.deltaMode===1?20:1,U=n===ui.Vertical?0:A.deltaX*F,N=n===ui.Horizontal?0:A.deltaY*F;if(!Zy()&&A.shiftKey&&n!==ui.Vertical)U=A.deltaY*F,N=0;f.translateBy(r,-(U/j)*i,-(N/j)*i,{internal:!0});let W=OA(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 xB({noWheelClassName:l,preventScrolling:u,d3ZoomHandler:r}){return function(f,n){let i=f.type==="wheel",t=!u&&i&&!f.ctrlKey,y=Ly(f,l);if(f.ctrlKey&&i&&y)f.preventDefault();if(t||y)return null;f.preventDefault(),r.call(this,f,n)}}function bB({zoomPanValues:l,onDraggingChange:u,onPanZoomStart:r}){return(f)=>{if(f.sourceEvent?.internal)return;let n=OA(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 vB({zoomPanValues:l,panOnDrag:u,onPaneContextMenu:r,onTransformChange:f,onPanZoom:n}){return(i)=>{if(l.usedRightMouseButton=!!(r&&Tq(u,l.mouseButton??0)),!i.sourceEvent?.sync)f([i.transform.x,i.transform.y,i.transform.k]);if(n&&!i.sourceEvent?.internal)n?.(i.sourceEvent,OA(i.transform))}}function sB({zoomPanValues:l,panOnDrag:u,panOnScroll:r,onDraggingChange:f,onPanZoomEnd:n,onPaneContextMenu:i}){return(t)=>{if(t.sourceEvent?.internal)return;if(l.isZoomingOrPanning=!1,i&&Tq(u,l.mouseButton??0)&&!l.usedRightMouseButton&&t.sourceEvent)i(t.sourceEvent);if(l.usedRightMouseButton=!1,f(!1),n){let y=OA(t.transform);l.prevViewport=y,clearTimeout(l.timerId),l.timerId=setTimeout(()=>{n?.(t.sourceEvent,y)},r?150:0)}}}function kB({zoomActivationKeyPressed:l,zoomOnScroll:u,zoomOnPinch:r,panOnDrag:f,panOnScroll:n,zoomOnDoubleClick:i,userSelectionActive:t,noWheelClassName:y,noPanClassName:c,lib:$,connectionInProgress:A}){return(j)=>{let F=l||u,U=r&&j.ctrlKey,N=j.type==="wheel";if(j.button===1&&j.type==="mousedown"&&(Ly(j,`${$}-flow__node`)||Ly(j,`${$}-flow__edge`)))return!0;if(!f&&!F&&!n&&!i&&!r)return!1;if(t)return!1;if(A&&!N)return!1;if(Ly(j,y)&&N)return!1;if(Ly(j,c)&&(!N||n&&N&&!l))return!1;if(!r&&j.ctrlKey&&N)return!1;if(!r&&j.type==="touchstart"&&j.touches?.length>1)return j.preventDefault(),!1;if(!F&&!n&&!U&&N)return!1;if(!f&&(j.type==="mousedown"||j.type==="touchstart"))return!1;if(Array.isArray(f)&&!f.includes(j.button)&&j.type==="mousedown")return!1;let W=Array.isArray(f)&&f.includes(j.button)||!j.button||j.button<=1;return(!j.ctrlKey||N)&&W}}function Kq({domNode:l,minZoom:u,maxZoom:r,translateExtent:f,viewport:n,onPanZoom:i,onPanZoomStart:t,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(),j=bc().scaleExtent([u,r]).translateExtent(f),F=fr(l).call(j);w({x:n.x,y:n.y,zoom:Gy(n.zoom,u,r)},[[0,0],[A.width,A.height]],f);let U=F.on("wheel.zoom"),N=F.on("dblclick.zoom");j.wheelDelta(mq);function W(p,V){if(F)return new Promise((B)=>{j?.interpolate(V?.interpolate==="linear"?Ln:k0).transform(W9(F,V?.duration,V?.ease,()=>B(!0)),p)});return Promise.resolve(!1)}function L({noWheelClassName:p,noPanClassName:V,onPaneContextMenu:B,userSelectionActive:m,panOnScroll:X,panOnDrag:S,panOnScrollMode:b,panOnScrollSpeed:z,preventScrolling:P,zoomOnPinch:s,zoomOnScroll:k,zoomOnDoubleClick:v,zoomActivationKeyPressed:tl,lib:I,onTransformChange:M,connectionInProgress:rl,paneClickDistance:cl,selectionOnDrag:$l}){if(m&&!$.isZoomingOrPanning)J();let Tl=X&&!tl&&!m;j.clickDistance($l?1/0:!Hf(cl)||cl<0?0:cl);let Ql=Tl?RB({zoomPanValues:$,noWheelClassName:p,d3Selection:F,d3Zoom:j,panOnScrollMode:b,panOnScrollSpeed:z,zoomOnPinch:s,onPanZoomStart:t,onPanZoom:i,onPanZoomEnd:y}):xB({noWheelClassName:p,preventScrolling:P,d3ZoomHandler:U});if(F.on("wheel.zoom",Ql,{passive:!1}),!m){let h=bB({zoomPanValues:$,onDraggingChange:c,onPanZoomStart:t});j.on("start",h);let a=vB({zoomPanValues:$,panOnDrag:S,onPaneContextMenu:!!B,onPanZoom:i,onTransformChange:M});j.on("zoom",a);let ul=sB({zoomPanValues:$,panOnDrag:S,panOnScroll:X,onPaneContextMenu:B,onPanZoomEnd:y,onDraggingChange:c});j.on("end",ul)}let Ol=kB({zoomActivationKeyPressed:tl,panOnDrag:S,zoomOnScroll:k,panOnScroll:X,zoomOnDoubleClick:v,zoomOnPinch:s,userSelectionActive:m,noPanClassName:V,noWheelClassName:p,lib:I,connectionInProgress:rl});if(j.filter(Ol),v)F.on("dblclick.zoom",N);else F.on("dblclick.zoom",null)}function J(){j.on("zoom",null)}async function w(p,V,B){let m=q9(p),X=j?.constrain()(m,V,B);if(X)await W(X);return new Promise((S)=>S(X))}async function Q(p,V){let B=q9(p);return await W(B,V),new Promise((m)=>m(B))}function q(p){if(F){let V=q9(p),B=F.property("__zoom");if(B.k!==p.zoom||B.x!==p.x||B.y!==p.y)j?.transform(F,V,null,{sync:!0})}}function T(){let p=F?xc(F.node()):{x:0,y:0,k:1};return{x:p.x,y:p.y,zoom:p.k}}function O(p,V){if(F)return new Promise((B)=>{j?.interpolate(V?.interpolate==="linear"?Ln:k0).scaleTo(W9(F,V?.duration,V?.ease,()=>B(!0)),p)});return Promise.resolve(!1)}function Z(p,V){if(F)return new Promise((B)=>{j?.interpolate(V?.interpolate==="linear"?Ln:k0).scaleBy(W9(F,V?.duration,V?.ease,()=>B(!0)),p)});return Promise.resolve(!1)}function E(p){j?.scaleExtent(p)}function D(p){j?.translateExtent(p)}function Y(p){let V=!Hf(p)||p<0?0:p;j?.clickDistance(V)}return{update:L,destroy:J,setViewport:Q,setViewportConstrained:w,getViewport:T,scaleTo:O,scaleBy:Z,setScaleExtent:E,setTranslateExtent:D,syncViewport:q,setClickDistance:Y}}var Ii;(function(l){l.Line="line",l.Handle="handle"})(Ii||(Ii={}));function gB({width:l,prevWidth:u,height:r,prevHeight:f,affectsX:n,affectsY:i}){let t=l-u,y=r-f,c=[t>0?1:t<0?-1:0,y>0?1:y<0?-1:0];if(t&&n)c[0]=c[0]*-1;if(y&&i)c[1]=c[1]*-1;return c}function ow(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 bi(l,u){return Math.max(0,u-l)}function vi(l,u){return Math.max(0,l-u)}function UA(l,u,r){return Math.max(0,u-l,l-r)}function dw(l,u){return l?!u:u}function IB(l,u,r,f,n,i,t,y){let{affectsX:c,affectsY:$}=u,{isHorizontal:A,isVertical:j}=u,F=A&&j,{xSnapped:U,ySnapped:N}=r,{minWidth:W,maxWidth:L,minHeight:J,maxHeight:w}=f,{x:Q,y:q,width:T,height:O,aspectRatio:Z}=l,E=Math.floor(A?U-l.pointerX:0),D=Math.floor(j?N-l.pointerY:0),Y=T+(c?-E:E),p=O+($?-D:D),V=-i[0]*T,B=-i[1]*O,m=UA(Y,W,L),X=UA(p,J,w);if(t){let z=0,P=0;if(c&&E<0)z=bi(Q+E+V,t[0][0]);else if(!c&&E>0)z=vi(Q+Y+V,t[1][0]);if($&&D<0)P=bi(q+D+B,t[0][1]);else if(!$&&D>0)P=vi(q+p+B,t[1][1]);m=Math.max(m,z),X=Math.max(X,P)}if(y){let z=0,P=0;if(c&&E>0)z=vi(Q+E,y[0][0]);else if(!c&&E<0)z=bi(Q+Y,y[1][0]);if($&&D>0)P=vi(q+D,y[0][1]);else if(!$&&D<0)P=bi(q+p,y[1][1]);m=Math.max(m,z),X=Math.max(X,P)}if(n){if(A){let z=UA(Y/Z,J,w)*Z;if(m=Math.max(m,z),t){let P=0;if(!c&&!$||c&&!$&&F)P=vi(q+B+Y/Z,t[1][1])*Z;else P=bi(q+B+(c?E:-E)/Z,t[0][1])*Z;m=Math.max(m,P)}if(y){let P=0;if(!c&&!$||c&&!$&&F)P=bi(q+Y/Z,y[1][1])*Z;else P=vi(q+(c?E:-E)/Z,y[0][1])*Z;m=Math.max(m,P)}}if(j){let z=UA(p*Z,W,L)/Z;if(X=Math.max(X,z),t){let P=0;if(!c&&!$||$&&!c&&F)P=vi(Q+p*Z+V,t[1][0])/Z;else P=bi(Q+($?D:-D)*Z+V,t[0][0])/Z;X=Math.max(X,P)}if(y){let P=0;if(!c&&!$||$&&!c&&F)P=bi(Q+p*Z,y[1][0])/Z;else P=vi(Q+($?D:-D)*Z,y[0][0])/Z;X=Math.max(X,P)}}}if(D=D+(D<0?X:-X),E=E+(E<0?m:-m),n)if(F)if(Y>p*Z)D=(dw(c,$)?-E:E)/Z;else E=(dw(c,$)?-D:D)*Z;else if(A)D=E/Z,$=c;else E=D*Z,c=$;let S=c?Q+E:Q,b=$?q+D:q;return{width:T+(c?-E:E),height:O+($?-D:D),x:i[0]*E*(!c?1:-1)+S,y:i[1]*D*(!$?1:-1)+b}}var zq={width:0,height:0,x:0,y:0},aB={...zq,pointerX:0,pointerY:0,aspectRatio:1};function oB(l){return[[0,0],[l.measured.width,l.measured.height]]}function dB(l,u,r){let f=u.position.x+l.position.x,n=u.position.y+l.position.y,i=l.measured.width??0,t=l.measured.height??0,y=r[0]*i,c=r[1]*t;return[[f-y,n-c],[f+i-y,n+t-c]]}function Eq({domNode:l,nodeId:u,getStoreItems:r,onChange:f,onEnd:n}){let i=fr(l),t={controlDirection:ow("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:j,resizeDirection:F,onResizeStart:U,onResize:N,onResizeEnd:W,shouldResize:L}){let J={...zq},w={...aB};t={boundaries:A,resizeDirection:F,keepAspectRatio:j,controlDirection:ow($)};let Q=void 0,q=null,T=[],O=void 0,Z=void 0,E=void 0,D=!1,Y=zc().on("start",(p)=>{let{nodeLookup:V,transform:B,snapGrid:m,snapToGrid:X,nodeOrigin:S,paneDomNode:b}=r();if(Q=V.get(u),!Q)return;q=b?.getBoundingClientRect()??null;let{xSnapped:z,ySnapped:P}=vc(p.sourceEvent,{transform:B,snapGrid:m,snapToGrid:X,containerBounds:q});if(J={width:Q.measured.width??0,height:Q.measured.height??0,x:Q.position.x??0,y:Q.position.y??0},w={...J,pointerX:z,pointerY:P,aspectRatio:J.width/J.height},O=void 0,Q.parentId&&(Q.extent==="parent"||Q.expandParent))O=V.get(Q.parentId),Z=O&&Q.extent==="parent"?oB(O):void 0;T=[],E=void 0;for(let[s,k]of V)if(k.parentId===u){if(T.push({id:s,position:{...k.position},extent:k.extent}),k.extent==="parent"||k.expandParent){let v=dB(k,Q,k.origin??S);if(E)E=[[Math.min(v[0][0],E[0][0]),Math.min(v[0][1],E[0][1])],[Math.max(v[1][0],E[1][0]),Math.max(v[1][1],E[1][1])]];else E=v}}U?.(p,{...J})}).on("drag",(p)=>{let{transform:V,snapGrid:B,snapToGrid:m,nodeOrigin:X}=r(),S=vc(p.sourceEvent,{transform:V,snapGrid:B,snapToGrid:m,containerBounds:q}),b=[];if(!Q)return;let{x:z,y:P,width:s,height:k}=J,v={},tl=Q.origin??X,{width:I,height:M,x:rl,y:cl}=IB(w,t.controlDirection,S,t.boundaries,t.keepAspectRatio,tl,Z,E),$l=I!==s,Tl=M!==k,Ql=rl!==z&&$l,Ol=cl!==P&&Tl;if(!Ql&&!Ol&&!$l&&!Tl)return;if(Ql||Ol||tl[0]===1||tl[1]===1){if(v.x=Ql?rl:J.x,v.y=Ol?cl:J.y,J.x=v.x,J.y=v.y,T.length>0){let zl=rl-z,o=cl-P;for(let ql of T)ql.position={x:ql.position.x-zl+tl[0]*(I-s),y:ql.position.y-o+tl[1]*(M-k)},b.push(ql)}}if($l||Tl)v.width=$l&&(!t.resizeDirection||t.resizeDirection==="horizontal")?I:J.width,v.height=Tl&&(!t.resizeDirection||t.resizeDirection==="vertical")?M:J.height,J.width=v.width,J.height=v.height;if(O&&Q.expandParent){let zl=tl[0]*(v.width??0);if(v.x&&v.x{if(!D)return;W?.(p,{...J}),n?.({...J}),D=!1});i.call(Y)}function c(){i.on(".drag",null)}return{update:y,destroy:c}}var Cq=Rl(Ju(),1),Mq=Rl(Sq(),1);var Xq=(l)=>{let u,r=new Set,f=(A,j)=>{let F=typeof A==="function"?A(u):A;if(!Object.is(F,u)){let U=u;u=(j!=null?j:typeof F!=="object"||F===null)?F:Object.assign({},u,F),r.forEach((N)=>N(u,U))}},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},Yq=(l)=>l?Xq(l):Xq;var{useDebugValue:ND}=Cq.default,{useSyncExternalStoreWithSelector:QD}=Mq.default,wD=(l)=>l;function k9(l,u=wD,r){let f=QD(l.subscribe,l.getState,l.getServerState||l.getInitialState,u,r);return ND(f),f}var Pq=(l,u)=>{let r=Yq(l),f=(n,i=u)=>k9(r,n,i);return Object.assign(f,r),f},hq=(l,u)=>l?Pq(l,u):Pq;function Eu(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 qD=Rl(I4(),1),DA=yl.createContext(null),WD=DA.Provider,AW=Qf.error001();function yu(l,u){let r=yl.useContext(DA);if(r===null)throw Error(AW);return k9(r,l,u)}function Zu(){let l=yl.useContext(DA);if(l===null)throw Error(AW);return yl.useMemo(()=>({getState:l.getState,setState:l.setState,subscribe:l.subscribe}),[l])}var Rq={display:"none"},LD={position:"absolute",width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0px, 0px, 0px, 0px)",clipPath:"inset(100%)"},jW="react-flow__node-desc",FW="react-flow__edge-desc",GD="react-flow__aria-live",TD=(l)=>l.ariaLiveMessage,mD=(l)=>l.ariaLabelConfig;function KD({rfId:l}){let u=yu(TD);return nl.jsx("div",{id:`${GD}-${l}`,"aria-live":"assertive","aria-atomic":"true",style:LD,children:u})}function zD({rfId:l,disableKeyboardA11y:u}){let r=yu(mD);return nl.jsxs(nl.Fragment,{children:[nl.jsx("div",{id:`${jW}-${l}`,style:Rq,children:u?r["node.a11yDescription.default"]:r["node.a11yDescription.keyboardDisabled"]}),nl.jsx("div",{id:`${FW}-${l}`,style:Rq,children:r["edge.a11yDescription.default"]}),!u&&nl.jsx(KD,{rfId:l})]})}var VA=yl.forwardRef(({position:l="top-left",children:u,className:r,style:f,...n},i)=>{let t=`${l}`.split("-");return nl.jsx("div",{className:bu(["react-flow__panel",r,...t]),style:f,ref:i,...n,children:u})});VA.displayName="Panel";function ED({proOptions:l,position:u="bottom-right"}){if(l?.hideAttribution)return null;return nl.jsx(VA,{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:nl.jsx("a",{href:"https://reactflow.dev",target:"_blank",rel:"noopener noreferrer","aria-label":"React Flow attribution",children:"React Flow"})})}var OD=(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}},pA=(l)=>l.id;function ZD(l,u){return Eu(l.selectedNodes.map(pA),u.selectedNodes.map(pA))&&Eu(l.selectedEdges.map(pA),u.selectedEdges.map(pA))}function pD({onSelectionChange:l}){let u=Zu(),{selectedNodes:r,selectedEdges:f}=yu(OD,ZD);return yl.useEffect(()=>{let n={nodes:r,edges:f};l?.(n),u.getState().onSelectionChangeHandlers.forEach((i)=>i(n))},[r,f,l]),null}var HD=(l)=>!!l.onSelectionChangeHandlers;function BD({onSelectionChange:l}){let u=yu(HD);if(l||u)return nl.jsx(pD,{onSelectionChange:l});return null}var a9=typeof window<"u"?yl.useLayoutEffect:yl.useEffect,JW=[0,0],DD={x:0,y:0,zoom:1},VD=["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"],xq=[...VD,"rfId"],SD=(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}),bq={translateExtent:my,nodeOrigin:JW,minZoom:0.5,maxZoom:2,elementsSelectable:!0,noPanClassName:"nopan",rfId:"1"};function XD(l){let{setNodes:u,setEdges:r,setMinZoom:f,setMaxZoom:n,setTranslateExtent:i,setNodeExtent:t,reset:y,setDefaultNodesAndEdges:c}=yu(SD,Eu),$=Zu();a9(()=>{return c(l.defaultNodes,l.defaultEdges),()=>{A.current=bq,y()}},[]);let A=yl.useRef(bq);return a9(()=>{for(let j of xq){let F=l[j],U=A.current[j];if(F===U)continue;if(typeof l[j]>"u")continue;if(j==="nodes")u(F);else if(j==="edges")r(F);else if(j==="minZoom")f(F);else if(j==="maxZoom")n(F);else if(j==="translateExtent")i(F);else if(j==="nodeExtent")t(F);else if(j==="ariaLabelConfig")$.setState({ariaLabelConfig:tq(F)});else if(j==="fitView")$.setState({fitViewQueued:F});else if(j==="fitViewOptions")$.setState({fitViewOptions:F});else $.setState({[j]:F})}A.current=l},xq.map((j)=>l[j])),null}function vq(){if(typeof window>"u"||!window.matchMedia)return null;return window.matchMedia("(prefers-color-scheme: dark)")}function YD(l){let[u,r]=yl.useState(l==="system"?null:l);return yl.useEffect(()=>{if(l!=="system"){r(l);return}let f=vq(),n=()=>r(f?.matches?"dark":"light");return n(),f?.addEventListener("change",n),()=>{f?.removeEventListener("change",n)}},[l]),u!==null?u:vq()?.matches?"dark":"light"}var sq=typeof document<"u"?document:null;function ac(l=null,u={target:sq,actInsideInputWithModifier:!0}){let[r,f]=yl.useState(!1),n=yl.useRef(!1),i=yl.useRef(new Set([])),[t,y]=yl.useMemo(()=>{if(l!==null){let $=(Array.isArray(l)?l:[l]).filter((j)=>typeof j==="string").map((j)=>j.replace("+",` +`;function y5({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return Sl("section",{className:`panel ${n||""}`},Sl("div",{className:"panel-head"},Sl("div",null,u?Sl("p",{className:"panel-eyebrow"},u):null,Sl(fu,{title:l,loading:t})),r?Sl("div",{className:"panel-actions"},r):null),Sl("div",{className:"panel-body"},f))}function mO({title:l,data:u,onOpen:r,testId:f}){return Sl("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function wO({title:l,text:u}){return Sl("div",{className:"empty-state"},Sl("strong",null,l),Sl("span",null,u))}function lm(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function um(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function rm(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function qO(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 LO(l){if(l?.providerId==="D518")return"D518";return l?.providerId||l?.name||l?.id||"Unknown"}function GO(l,u,r="/"){let f=r.startsWith("/")?r:`/${r}`;return`${l}/microservices/${encodeURIComponent(u)}/proxy${f}`}function WO(l,u){return`${l}/microservices/${encodeURIComponent(u)}/health`}async function TO(l,u=16000){let r=new AbortController,f=setTimeout(()=>r.abort(),u);try{return await El(l,{signal:r.signal,failureFields:[!1]})}finally{clearTimeout(f)}}function fm(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 S3(l){return l?.status==="OK"||l?.ok===!0}function KO({service:l,active:u,health:r,onSelect:f,onRaw:n}){let t=lm(l),i=um(l),y=rm(l),c=t.container||{},_=S3(r?.body);return Sl("button",{type:"button",className:`filebrowser-target-card ${u?"active":""}`,"data-testid":`filebrowser-target-card-${l.id}`,onClick:f},Sl("span",{className:`status-badge ${_?"ok":t.providerStatus==="online"?"running":"warn"}`},_?"Health OK":t.providerStatus||"unknown"),Sl("strong",null,l.name||l.id),Sl("span",null,fm(l)),Sl("code",null,`${i.nodeBindHost||"--"}:${i.nodePort||"--"}`),Sl("small",null,c.name?`${c.name} / ${c.state||"--"}`:`${y.composeService||"--"}`),Sl("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 $5(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!==c5)r.textContent=c5;return!0}function EO(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 pO(l,u){let r=nm(l);if(r===null||r.documentElement===null)throw Error("无法访问 File Browser iframe 文档");$5(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=`${c5} +html,body{width:${f}px!important;min-height:${n}px!important;overflow:hidden!important;}`,i.appendChild(y);let c=new XMLSerializer().serializeToString(t),_=`${c}`;EO(new Blob([_],{type:"image/svg+xml;charset=utf-8"}),u.replace(/\.png$/i,".svg"))}function tm({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=qO(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]=i5(i),[_,A]=i5({loading:!1,refreshedAt:null,health:{},error:""}),[F,j]=i5({exporting:!1,message:"",error:""}),J=QO(null),U=f.find((p)=>p.id===y)||f[0]||null,w=lm(U),L=um(U),N=rm(U),Q=U?_.health[U.id]:null,m=U?GO(r,U.id,"/"):"about:blank";t5(()=>{if(f.length===0)return;if(!y||!f.some((p)=>p.id===y))c(f[0].id)},[f.map((p)=>p.id).join(",")]),t5(()=>{let p=0,O=setInterval(()=>{if(p+=1,$5(J.current)||p>=24)clearInterval(O)},500);return()=>clearInterval(O)},[m]),t5(()=>{if(f.length===0)return;let p=!1;async function O(){A((Y)=>({...Y,loading:!0,error:""}));let B=await Promise.all(f.map(async(Y)=>{try{let H=await TO(WO(r,Y.id));return[Y.id,{ok:!0,body:H}]}catch(H){return[Y.id,{ok:!1,error:zl(H,"File Browser health failed")}]}}));if(p)return;A({loading:!1,refreshedAt:new Date().toISOString(),health:Object.fromEntries(B),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 pO(J.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 Sl(wO,{title:"File Browser 未登记",text:"请在 config.json 的 microservices 中登记 id=filebrowser 或 filebrowser-* 用户服务"});return Sl("div",{className:"filebrowser-page","data-testid":"filebrowser-page"},_.error?Sl(el,{error:_.error,wide:!0}):null,Sl(y5,{title:"文件管理器",eyebrow:"File Browser / Host Files",loading:_.loading,actions:Sl("div",{className:"panel-actions"},U?Sl("button",{type:"button",className:"ghost-btn",onClick:W,disabled:F.exporting,"data-testid":"filebrowser-export-screenshot"},F.exporting?"导出中...":"导出截图"):null,U?Sl("a",{className:"ghost-btn",href:m,target:"_blank",rel:"noreferrer"},"新窗口打开"):null,U?Sl(mO,{title:"File Browser 当前目标",data:{service:U,health:Q},onOpen:u,testId:"raw-filebrowser-active"}):null)},Sl("div",{className:"filebrowser-hero"},Sl("div",null,Sl("span",{className:`status-badge ${S3(Q?.body)?"ok":"warn"}`},S3(Q?.body)?"Health OK":"Health Pending"),Sl("h3",null,U?.name||"File Browser"),Sl("p",{className:"muted paragraph"},U?.description||"通过 UniDesk 登录态代理访问,不开放 File Browser 公网端口。"),F.error?Sl("p",{className:"filebrowser-shot-error"},F.error):null,F.message?Sl("p",{className:"filebrowser-shot-ok"},F.message):null),Sl("div",{className:"microservice-ref-card"},Sl("span",null,"Provider"),Sl("strong",null,U?.providerId||"--"),Sl("code",null,w.providerName||U?.providerId||"--")),Sl("div",{className:"microservice-ref-card"},Sl("span",null,"Private Backend"),Sl("strong",null,`${L.nodeBindHost||"--"}:${L.nodePort||"--"}`),Sl("code",null,L.nodeBaseUrl||"--")),Sl("div",{className:"microservice-ref-card"},Sl("span",null,"Image"),Sl("strong",null,N.dockerfile||"filebrowser/filebrowser:v2.63.3"),Sl("code",null,N.commitId||"--")),Sl("div",{className:"microservice-ref-card"},Sl("span",null,"Mount"),Sl("strong",null,fm(U)),Sl("code",null,U?.providerId==="main-server"?"/root, /var, /home":"/home, /mnt/c, /mnt/d")))),Sl(y5,{title:"浏览目标",eyebrow:`${f.length} host targets`,loading:_.loading},Sl("div",{className:"filebrowser-target-grid"},f.map((p)=>Sl(KO,{key:p.id,service:p,active:p.id===U?.id,health:_.health[p.id],onSelect:()=>q(p.id),onRaw:u})))),Sl(y5,{title:`${LO(U)} 文件视图`,eyebrow:Q?.body?`Health ${S3(Q.body)?"OK":"UNKNOWN"} / ${_.refreshedAt?tu(_.refreshedAt):"--"}`:"Embedded WebUI",className:"filebrowser-frame-panel"},Sl("div",{className:"filebrowser-frame-shell"},Sl("div",{className:"filebrowser-frame-toolbar"},Sl("span",null,"BaseURL"),Sl("code",null,`/api/microservices/${U?.id||"filebrowser"}/proxy`),Sl("span",null,"Root"),Sl("code",null,"/srv"),Sl("span",{className:"filebrowser-compact-note"},"Compact layout injected")),Sl("iframe",{ref:J,key:m,title:`${U?.name||"File Browser"} WebUI`,src:m,className:"filebrowser-frame","data-testid":"filebrowser-frame",onLoad:(p)=>$5(p.currentTarget),sandbox:"allow-downloads allow-forms allow-modals allow-same-origin allow-scripts"}))))}var P3=Ml(Ju(),1);var Ul=P3.default.createElement,{useEffect:zO}=P3.default,OO=P3.default.useState;function V3({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return Ul("span",{className:`status-badge ${r}`},u||l||"unknown")}function Rt({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 Y3({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(fu,{title:l,loading:t})),r?Ul("div",{className:"panel-actions"},r):null),Ul("div",{className:"panel-body"},f))}function X3({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 _5({title:l,text:u}){return Ul("div",{className:"empty-state"},Ul("strong",null,l),Ul("span",null,u))}function ZO(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function HO(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function BO(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 DO(l){return(Array.isArray(l?.jobs)?l.jobs:[]).slice(0,40)}function SO(l){return(Array.isArray(l?.drafts)?l.drafts:[]).slice(0,12)}function im({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((U)=>U.id==="findjob")||null,[n,t]=OO({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,L,N]=await Promise.all([El(`${r}/microservices/findjob/health`),El(`${r}/microservices/findjob/proxy/api/summary`),El(`${r}/microservices/findjob/proxy/api/jobs?__unideskArrayLimit=jobs:40`),El(`${r}/microservices/findjob/proxy/api/drafts`)]);t({loading:!1,error:"",health:U,summary:w,jobs:L,drafts:N,refreshedAt:new Date})}catch(U){t((w)=>({...w,loading:!1,error:zl(U,"FindJob 加载失败")}))}}if(zO(()=>{i()},[f?.id,f?.runtime?.providerStatus]),!f)return Ul(_5,{title:"FindJob 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=findjob"});let y=ZO(f),c=BO(f),_=HO(f),A=n.summary||{},F=DO(n.jobs),j=SO(n.drafts),J=n.jobs?._unidesk?.arrayLimits?.jobs;return Ul("div",{className:"findjob-page","data-testid":"findjob-page"},Ul(Y3,{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(X3,{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(V3,{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(Y3,{title:"岗位指标",eyebrow:n.refreshedAt?`Updated ${tu(n.refreshedAt)}`:"Summary",loading:n.loading},Ul("div",{className:"metric-grid"},Ul(Rt,{label:"岗位总量",value:gi(A,"totalJobs"),hint:"tracked jobs",tone:"ok"}),Ul(Rt,{label:"原始岗位",value:gi(A,"rawJobs"),hint:"raw queue"}),Ul(Rt,{label:"已验证",value:gi(A,"verifiedJobs"),hint:"verified set"}),Ul(Rt,{label:"优先处理",value:gi(A,"prioritizedJobs"),hint:"prioritized"}),Ul(Rt,{label:"过期",value:gi(A,"staleJobs"),hint:"stale jobs",tone:"warn"}),Ul(Rt,{label:"无效",value:gi(A,"invalidJobs"),hint:"invalid jobs",tone:"warn"}),Ul(Rt,{label:"上海",value:gi(A,"shanghaiJobs"),hint:"city filter"}),Ul(Rt,{label:"Health",value:n.health?.ok?"OK":"--",hint:"D601 /api/health"})),Ul("div",{className:"panel-actions inline-actions"},Ul(X3,{title:"FindJob Summary",data:A,onOpen:u,testId:"raw-findjob-summary"}))),Ul(Y3,{title:"近期岗位",eyebrow:J?`${J.returnedLength}/${J.originalLength} Preview`:`${F.length} Preview`,loading:n.loading},F.length===0?Ul(_5,{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(V3,{status:String(U.priority||"").toLowerCase()||"unknown"},U.priority||"--")),Ul("td",null,Ul(V3,{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(X3,{title:"FindJob Jobs Preview",data:n.jobs,onOpen:u,testId:"raw-findjob-jobs"}))),Ul(Y3,{title:"草稿与报告",eyebrow:`${j.length} Drafts`,loading:n.loading},j.length===0?Ul(_5,{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(V3,{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,Gl(U.updated_at||U.updatedAt))))),Ul("div",{className:"panel-actions inline-actions"},Ul(X3,{title:"FindJob Drafts",data:n.drafts,onOpen:u,testId:"raw-findjob-drafts"})))))}var T1=Ml(Ju(),1);var x=T1.default.createElement,{useEffect:VO}=T1.default,A5=T1.default.useState;function L1(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 N5(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 W1(l){if(l===null||l===void 0||l==="")return"--";if(typeof l==="boolean")return l?"true":"false";if(typeof l==="number")return N5(l,4);if(Array.isArray(l))return l.map((u)=>W1(u)).join(" x ");if(typeof l==="object")return"已上报";return String(l)}function C3(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 h3(l){return l.replace(/[^a-zA-Z0-9_-]/g,"-")}function dr(l){return l&&typeof l==="object"&&!Array.isArray(l)?l:{}}function G1({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return x("span",{className:`status-badge ${r}`},u||l||"unknown")}function xt({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 F5({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(fu,{title:l,loading:t})),r?x("div",{className:"panel-actions"},r):null),x("div",{className:"panel-body"},f))}function wy({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 dn({title:l,text:u}){return x("div",{className:"empty-state"},x("strong",null,l),x("span",null,u))}function YO(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function XO(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function PO(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function CO(l){return l?.counts&&typeof l.counts==="object"&&!Array.isArray(l.counts)?l.counts:{}}function hO(l){return Array.isArray(l?.jobs)?l.jobs.slice(0,240):[]}function sO(l){return Array.isArray(l?.projects)?l.projects.slice(0,1000):[]}function s3(l){return Array.isArray(l?.projects)?l.projects:[]}function MO(l,u){if(Array.isArray(u?.gpu))return u.gpu;if(Array.isArray(l?.gpu))return l.gpu;return[]}function mf(l,u){return`${l}/microservices/met-nonlinear/proxy${u}`}function ym(l){return l.startedAt&&l.finishedAt?j5((Date.parse(l.finishedAt)-Date.parse(l.startedAt))/1000):"--"}function RO(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 cm(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 $m(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 _m(l,u,r){return{name:l,path:u,depth:r,count:0,children:[],project:null}}function xO(l){let u=_m("","",-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=_m(_,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 bO(l){let u=dr(l.data);return dr(u.project).projectPath?dr(u.project):u}function vO(l){return dr(dr(l.data).job)}function Am({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((s)=>s.id==="met-nonlinear")||null,[n,t]=A5({loading:!1,actionBusy:!1,error:"",health:null,summary:null,queue:null,projects:null,history:null,images:null,refreshedAt:null}),[i,y]=A5({loading:!1,error:"",kind:"",key:"",title:"",data:null}),[c,_]=A5(()=>({activeTab:"projects",selectedProjects:{},expandedProjectDirs:{},sourceProject:"",forkCount:1,forkEpochs:200,forkPrefix:`ui_fork_${Date.now()}`,maxConcurrency:3,targetGpuName:"2080 Ti",actionMessage:""}));function A(s){_((e)=>({...e,...s}))}async function F(s=c.activeTab){if(!f)return;t((e)=>({...e,loading:!0,error:""}));try{let e=[["health",El(`${r}/microservices/met-nonlinear/health`)],["summary",El(mf(r,"/api/summary"))]];if(s==="projects")e.push(["projectsRoot",El(mf(r,"/api/projects?root=projects&limit=500"))]),e.push(["exProjectsRoot",El(mf(r,"/api/projects?root=ex_projects&limit=500"))]);if(s==="current"||s==="completed"||s==="failed")e.push(["queue",El(mf(r,"/api/queue"))]);if(s==="completed"||s==="failed")e.push(["history",El(mf(r,"/api/history"))]);if(s==="gpu")e.push(["images",El(mf(r,"/api/images"))]);let fl=Object.fromEntries(await Promise.all(e.map(async([g,yl])=>[g,await yl]))),k={loading:!1,actionBusy:!1,error:"",health:fl.health,summary:fl.summary,refreshedAt:new Date};if(fl.projectsRoot||fl.exProjectsRoot){let{projectsRoot:g,exProjectsRoot:yl}=fl;k.projects={ok:g?.ok!==!1&&yl?.ok!==!1,roots:[{root:"projects",count:s3(g).length},{root:"ex_projects",count:s3(yl).length}],projects:[...s3(g),...s3(yl)]}}if(fl.queue)k.queue=fl.queue;if(fl.history)k.history=fl.history;if(fl.images)k.images=fl.images;t((g)=>({...g,...k}))}catch(e){t((fl)=>({...fl,loading:!1,actionBusy:!1,error:zl(e,"MET Nonlinear 加载失败")}))}}async function j(s,e){t((fl)=>({...fl,actionBusy:!0,error:""})),A({actionMessage:`${s}...`});try{let fl=await e();A({actionMessage:fl||`${s}完成`}),await F()}catch(fl){t((k)=>({...k,actionBusy:!1,error:zl(fl,`${s}失败`)}))}}async function J(){await j("保存并发设置",async()=>{await El(mf(r,"/api/queue/settings"),{method:"PUT",body:JSON.stringify({maxConcurrency:Number(c.maxConcurrency),targetGpuName:c.targetGpuName})})})}function U(){return Object.entries(c.selectedProjects).filter(([,s])=>s).map(([s])=>s)}async function w(){let s=U();if(s.length===0)throw Error("请先选择至少一个 project");await j("加入待启动队列",async()=>{await El(mf(r,"/api/queue"),{method:"POST",body:JSON.stringify({projectPaths:s,maxConcurrency:Number(c.maxConcurrency),targetGpuName:c.targetGpuName,start:!1})}),A({activeTab:"current",selectedProjects:{}})})}async function L(){let s=c.sourceProject||P[0]?.projectPath;if(!s)throw Error("请先选择源 project");await j("Fork Project",async()=>{let e=await El(mf(r,"/api/projects/fork"),{method:"POST",body:JSON.stringify({sourceProject:s,count:Number(c.forkCount),epochs:Number(c.forkEpochs),prefix:c.forkPrefix})}),fl=Array.isArray(e.projectPaths)?e.projectPaths:[],k=fl.reduce((g,yl)=>{return g[yl]=!0,g},{...c.selectedProjects});return A({selectedProjects:k}),`已 fork ${fl.length} 个 project,并已自动勾选;请确认后点击加入待启动队列。`})}async function N(){await j("启动队列",async()=>{await El(mf(r,"/api/queue/start"),{method:"POST",body:JSON.stringify({maxConcurrency:Number(c.maxConcurrency),targetGpuName:c.targetGpuName})}),A({activeTab:"current"})})}async function Q(s){await j("取消任务",async()=>{await El(mf(r,`/api/jobs/${encodeURIComponent(s.id)}/cancel`),{method:"POST",body:JSON.stringify({})})})}async function m(s){let e=String(s?.projectPath||"");if(!e)return;y({loading:!0,error:"",kind:"project",key:e,title:e,data:null});try{let fl=await El(mf(r,`/api/projects/config?path=${encodeURIComponent(e)}`));y({loading:!1,error:"",kind:"project",key:e,title:e,data:fl})}catch(fl){y({loading:!1,error:zl(fl,"Project 详情加载失败"),kind:"project",key:e,title:e,data:null})}}async function q(s){let e=String(s?.id||"");if(!e)return;y({loading:!0,error:"",kind:"job",key:e,title:s.projectPath||e,data:null});try{let fl=await El(mf(r,`/api/jobs/${encodeURIComponent(e)}`));y({loading:!1,error:"",kind:"job",key:e,title:fl?.job?.projectPath||s.projectPath||e,data:fl})}catch(fl){y({loading:!1,error:zl(fl,"Job 详情加载失败"),kind:"job",key:e,title:s.projectPath||e,data:null})}}if(VO(()=>{F(c.activeTab)},[f?.id,f?.runtime?.providerStatus,c.activeTab]),!f)return x(dn,{title:"MET Nonlinear 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=met-nonlinear"});let W=YO(f),p=PO(f),O=XO(f),z=CO(n.queue?.queue||n.summary?.queue),B=MO(n.health,n.queue),Y=n.health?.targetGpu||n.summary?.targetGpu||B.find((s)=>String(s.name||"").includes("2080")),H=n.images?.mlImage||n.health?.image||{},D=hO(n.queue),P=sO(n.projects),E=xO(P),S=c.sourceProject||P[0]?.projectPath||"",V=D.filter((s)=>["staged","queued","running"].includes(s.status)),v=D.filter((s)=>s.status==="succeeded"),K=D.filter((s)=>["failed","canceled"].includes(s.status)),X=Array.isArray(n.history?.jobs)?n.history.jobs.slice(0,120):[],I=[{id:"projects",label:"项目库",count:P.length},{id:"current",label:"当前队列",count:V.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:B.length}];function a(s,e){if(s.length===0)return x(dn,{title:e==="current"?"当前队列为空":"暂无记录",text:e==="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,s.map((fl)=>{let k=fl.progress||{},g=["staged","queued","running"].includes(fl.status),yl=i.kind==="job"&&i.key===fl.id;return x("tr",{key:fl.id,className:`met-click-row ${yl?"active":""}`,onClick:()=>q(fl),"data-testid":`met-job-row-${h3(fl.id)}`},x("td",null,x(G1,{status:fl.status},$m(fl.status))),x("td",null,x("button",{type:"button",className:"met-inline-link",onClick:(Tl)=>{Tl.stopPropagation(),q(fl)}},fl.projectPath),x("code",null,fl.id)),x("td",null,x("span",null,`${k.currentEpoch??"--"} / ${k.epochTarget??fl.epochTarget??"--"}`),x("div",{className:"met-progress"},x("span",{style:{width:L1(k.progressPercent)}}))),x("td",null,x("strong",null,C3(cm(fl)))),x("td",null,fl.status==="succeeded"||fl.status==="failed"||fl.status==="canceled"?ym(fl):fl.status==="running"?`ETA ${j5(RO(fl))}`:"--"),x("td",null,fl.gpuName||"--"),x("td",null,fl.exitCode??"--"),x("td",null,Gl(fl.updatedAt)),x("td",null,g?x("button",{type:"button",className:"ghost-btn mini",onClick:(Tl)=>{Tl.stopPropagation(),Q(fl)},disabled:n.actionBusy},"取消"):null,x(wy,{title:`MET Job ${fl.id}`,data:fl,onOpen:u,testId:`raw-met-job-${fl.id}`})))}))))}function R(){return x("div",{className:"met-queue-summary","data-testid":"met-current-summary"},x(G1,{status:"staged"},`待启动 ${z.staged??0}`),x(G1,{status:"queued"},`排队中 ${z.queued??0}`),x(G1,{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 nl(s,e){let fl=c.expandedProjectDirs[s];return fl===void 0?e<2:Boolean(fl)}function d(s,e){let fl=nl(s,e);A({expandedProjectDirs:{...c.expandedProjectDirs,[s]:!fl}})}function h(s){let e=8+Math.max(0,s.depth)*16;if(Boolean(s.project)){let g=s.project,yl=Boolean(c.selectedProjects[g.projectPath]),Tl=i.kind==="project"&&i.key===g.projectPath;return x("div",{key:s.path,className:`met-tree-row project ${yl?"selected":""} ${Tl?"active":""}`,style:{paddingLeft:e},onClick:()=>m(g),"data-testid":`met-project-node-${h3(g.projectPath)}`},x("div",{className:"met-tree-name"},x("input",{type:"checkbox",checked:yl,onClick:(Zl)=>Zl.stopPropagation(),onChange:(Zl)=>A({selectedProjects:{...c.selectedProjects,[g.projectPath]:Zl.target.checked}}),"data-testid":`met-project-checkbox-${h3(g.projectPath)}`}),x("button",{type:"button",className:"met-inline-link project-path",onClick:(Zl)=>{Zl.stopPropagation(),m(g)}},s.name)),x("span",null,g.useModel||"--"),x("span",null,g.epochTrain??"--"),x("span",null,L1(g.progress?.progressPercent)),x("span",null,C3(g.progress?.epochPerHour)))}let k=nl(s.path,s.depth);return x(T1.default.Fragment,{key:s.path},x("div",{className:"met-tree-row folder",style:{paddingLeft:e},"data-testid":`met-project-folder-${h3(s.path)}`},x("button",{type:"button",className:"met-tree-toggle",onClick:()=>d(s.path,s.depth),"aria-label":k?`折叠 ${s.path}`:`展开 ${s.path}`},k?"-":"+"),x("strong",null,s.name),x("span",{className:"met-tree-count"},`${s.count} projects`)),k?s.children.map((g)=>h(g)):null)}function rl(s){return x("div",{className:"met-detail-kv"},s.map((e)=>x("div",{key:e.label,className:"met-detail-kv-item"},x("span",null,e.label),x("strong",null,W1(e.value)),e.hint?x("small",null,e.hint):null)))}function _l(s,e){return x("div",{className:"met-detail-section"},x("h3",null,s),rl(e))}function Al(s){if(!Array.isArray(s)||s.length===0)return x(dn,{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,s.slice(0,18).map((e,fl)=>x("tr",{key:`${e.name||"layer"}-${fl}`},x("td",null,e.name||`#${fl+1}`),x("td",null,e.type||"--"),x("td",null,N5(e.num_params)),x("td",null,e.trainable===void 0?"--":String(Boolean(e.trainable))),x("td",null,N5(e.compute?.total??e.estimated_cost?.weighted_units?.total)))))))}function Ll(s){let e=Array.isArray(s)?s:[];if(e.length===0)return x(dn,{title:"data/ 暂无文件",text:"训练或评估完成后会生成 training_state、metrics、model_info 等文件。"});return x("div",{className:"met-file-chip-grid"},e.slice(0,48).map((fl)=>x("span",{key:fl},fl)),e.length>48?x("span",null,`+${e.length-48}`):null)}function Ql(s){let e=String(s||"").replace(/\x1b\[[0-9;]*[A-Za-z]/g,"").split(/\r?\n/).map((fl)=>fl.trim()).filter(Boolean).slice(-12);if(e.length===0)return x(dn,{title:"暂无日志尾部",text:"该任务未上报 logTail 或日志已轮转。"});return x("div",{className:"met-log-lines"},e.map((fl,k)=>x("div",{key:`${k}-${fl.slice(0,16)}`},fl)))}function pl(){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(fu,{title:"详情加载中",loading:!0}))),x(dn,{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(dn,{title:"选择一个项目或任务查看详情",text:"项目库、当前队列、已完成和失败诊断中的行都可以点击;默认只展示结构化字段,原始 JSON 需显式点击按钮。"}));let s=bO(i),e=vO(i),fl=dr(s.config),k=dr(s.progress||e.progress),g=dr(s.data),yl=dr(s.metrics||g.metrics||k.trainingInfo?.evaluation_metrics),Tl=dr(g.trainingInfo||k.trainingInfo),Zl=dr(g.trainingState),vl=dr(s.model||g.model),nu=Array.isArray(vl.modelSummary)&&vl.modelSummary.length>0?vl.modelSummary:vl.computeLayers,hl=dr(Tl.evaluation_metrics),wu=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(fu,{title:wu}),x("code",null,s.projectPath||e.projectPath||i.title)),x("div",{className:"panel-actions"},x(wy,{title:`MET ${wu}`,data:i.data,onOpen:u,testId:"raw-met-detail"}))),i.kind==="job"?_l("任务状态",[{label:"Job ID",value:e.id},{label:"状态",value:$m(e.status)},{label:"GPU",value:e.gpuName},{label:"Exit Code",value:e.exitCode},{label:"耗时",value:ym(e)},{label:"训练速度",value:C3(cm({...e,progress:k}))}]):null,_l("config.json",[{label:"use_model",value:fl.use_model},{label:"epoch_train",value:fl.epoch_train},{label:"step_per_epoch",value:fl.step_per_epoch},{label:"learning_rate",value:fl.learning_rate},{label:"using_gpu",value:fl.using_gpu},{label:"use_points",value:fl.use_points},{label:"sample_rate",value:fl.sample_rate},{label:"time_clipped_s",value:fl.time_clipped_s},{label:"H_UNITS",value:fl.H_UNITS},{label:"INNER_KAN_UNITS",value:fl.INNER_KAN_UNITS},{label:"INNER_KAN_LAYERS",value:fl.INNER_KAN_LAYERS},{label:"GRID_SIZE",value:fl.GRID_SIZE},{label:"SPLINE_ORDER",value:fl.SPLINE_ORDER},{label:"USE_FAST_MODEL",value:fl.USE_FAST_MODEL},{label:"IIR_TRAINABLE",value:fl.IIR_TRAINABLE}]),_l("data/ 训练状态",[{label:"Epoch",value:`${k.currentEpoch??Zl.current_epoch??Zl.completed_epoch??"--"} / ${k.epochTarget??fl.epoch_train??"--"}`},{label:"Progress",value:L1(k.progressPercent)},{label:"Last Loss",value:k.lastLoss??Zl.loss},{label:"Last Val Loss",value:k.lastValLoss??Zl.val_loss},{label:"Min Loss",value:Tl.min_loss??Zl.min_loss},{label:"Min Val Loss",value:Tl.min_val_loss??Zl.min_val_loss},{label:"Log Lines",value:k.logLineCount},{label:"ETA",value:j5(k.etaSeconds??Zl.remaining_time)},{label:"训练速度",value:C3(k.epochPerHour??Zl.smoothed_speed)},{label:"Training Alive",value:Zl.training_alive}]),_l("模型参数",[{label:"Model Type",value:vl.modelType??fl.use_model},{label:"Total Params",value:vl.totalParams,hint:vl.totalParams===null||vl.totalParams===void 0?"未上报":"data/model_info.json"},{label:"Trainable",value:vl.trainableParams},{label:"Non-trainable",value:vl.nonTrainableParams},{label:"Compute Cost",value:vl.computeCost},{label:"Estimate Status",value:vl.estimateStatus},{label:"Unsupported Layers",value:vl.unsupportedLayerCount}]),_l("指标",[{label:"train_loss",value:yl.train_loss??hl.train_loss},{label:"val_loss",value:yl.val_loss??hl.val_loss},{label:"train_mae",value:yl.train_mae??hl.train_mae},{label:"val_mae",value:yl.val_mae??hl.val_mae},{label:"train_afmae",value:yl.train_afmae??hl.train_afmae},{label:"val_afmae",value:yl.val_afmae??hl.val_afmae},{label:"freq_drift_hz",value:yl.freq_drift_hz},{label:"sens_drift_percent",value:yl.sens_drift_percent},{label:"linearity_percent",value:yl.linearity_percent},{label:"weights_source",value:yl.weights_source??hl.weights_source},{label:"lr min/mean/max",value:`${W1(Tl.learning_rate_min)} / ${W1(Tl.learning_rate_mean)} / ${W1(Tl.learning_rate_max)}`}]),x("div",{className:"met-detail-section"},x("h3",null,"模型层"),Al(nu)),x("div",{className:"met-detail-section"},x("h3",null,"data/ 文件"),Ll(g.files)),i.kind==="job"?x("div",{className:"met-detail-section"},x("h3",null,"日志尾部"),Ql(dr(i.data).logTail)):null)}return x("div",{className:"met-page","data-testid":"met-nonlinear-page"},x(F5,{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(wy,{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(G1,{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(F5,{title:"核心状态",eyebrow:n.refreshedAt?`Updated ${tu(n.refreshedAt)}`:"Queue + GPU",loading:n.loading},x("div",{className:"metric-grid"},x(xt,{label:"Staged",value:z.staged??0,hint:"加入队列未开始",tone:Number(z.staged||0)>0?"warn":""}),x(xt,{label:"Queued",value:z.queued??0,hint:"排队等待调度",tone:Number(z.queued||0)>0?"warn":""}),x(xt,{label:"Running",value:z.running??0,hint:`max ${n.summary?.queue?.maxConcurrency??n.queue?.queue?.maxConcurrency??"--"}`,tone:Number(z.running||0)>0?"ok":""}),x(xt,{label:"Succeeded",value:z.succeeded??0,hint:"已完成"}),x(xt,{label:"Failed",value:z.failed??0,hint:"需要诊断",tone:Number(z.failed||0)>0?"warn":""}),x(xt,{label:"2080Ti Free",value:Y?L1(Number(Y.freeRatio)*100):"--",hint:Y?`${Y.memoryFreeMiB}/${Y.memoryTotalMiB} MiB`:"等待 GPU 上报"}),x(xt,{label:"ML Image",value:H.present?"READY":"MISSING",hint:H.image||"met-nonlinear-ml:tf26",tone:H.present?"ok":"warn"}),x(xt,{label:"Health",value:n.health?.ok?"OK":"--",hint:"D601 /health"}))),x(F5,{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:(s)=>A({maxConcurrency:s.target.value})})),x("label",null,"目标 GPU",x("input",{value:c.targetGpuName,"data-testid":"met-target-gpu-input",onChange:(s)=>A({targetGpuName:s.target.value})})),x("button",{type:"button",className:"ghost-btn",onClick:J,disabled:n.actionBusy,"data-testid":"met-save-settings-button"},"保存设置"),x("button",{type:"button",className:"primary-btn",onClick:N,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((s)=>x("button",{key:s.id,type:"button",className:c.activeTab===s.id?"active":"",onClick:()=>A({activeTab:s.id}),"data-testid":`met-tab-${s.id}`},`${s.label} ${s.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:S,"data-testid":"met-source-project-select",onChange:(s)=>A({sourceProject:s.target.value})},P.map((s)=>x("option",{key:s.projectPath,value:s.projectPath},`${s.projectPath} · ${s.useModel||"model?"}`)))),x("label",null,"Fork 数量",x("input",{type:"number",min:1,max:100,value:c.forkCount,"data-testid":"met-fork-count-input",onChange:(s)=>A({forkCount:s.target.value})})),x("label",null,"训练轮数",x("input",{type:"number",min:1,max:1e5,value:c.forkEpochs,"data-testid":"met-fork-epochs-input",onChange:(s)=>A({forkEpochs:s.target.value})})),x("label",null,"目标前缀",x("input",{value:c.forkPrefix,"data-testid":"met-fork-prefix-input",onChange:(s)=>A({forkPrefix:s.target.value})})),x("button",{type:"button",className:"primary-btn",onClick:L,disabled:n.actionBusy||!S,"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((s)=>`${s.root} ${s.count}`).join(" / ")}`),x(fu,{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})`)),P.length===0?x(dn,{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((s)=>h(s)))),pl()):null,c.activeTab==="current"?x("div",{"data-testid":"met-current-pane"},R(),a(V,"current"),pl(),x("div",{className:"panel-actions inline-actions"},x(wy,{title:"MET Queue",data:n.queue,onOpen:u,testId:"raw-met-queue"}))):null,c.activeTab==="completed"?x("div",{"data-testid":"met-completed-pane"},a(v.length>0?v:X.filter((s)=>s.status==="succeeded"),"completed"),pl()):null,c.activeTab==="failed"?x("div",{"data-testid":"met-failed-pane"},a(K.length>0?K:X.filter((s)=>["failed","canceled"].includes(s.status)),"failed"),pl(),x("div",{className:"panel-actions inline-actions"},x(wy,{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"},B.length===0?x(dn,{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,B.map((s)=>x("tr",{key:s.index},x("td",null,s.index),x("td",null,s.name),x("td",null,`${s.memoryFreeMiB} / ${s.memoryTotalMiB} MiB`,x("div",{className:"met-progress"},x("span",{style:{width:L1(Number(s.freeRatio)*100)}}))),x("td",null,String(s.name||"").includes("2080")?"target 2080Ti, <20% 限制并发":"non-target")))))),x("div",{className:"panel-actions inline-actions"},x(wy,{title:"MET Images",data:n.images,onOpen:u,testId:"raw-met-images"}))):null))))}var b3=Ml(Ju(),1);var wl=b3.default.createElement,{useEffect:Fm,useMemo:gO}=b3.default,M3=b3.default.useState;function jm({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return wl("span",{className:`status-badge ${r}`},u||l||"unknown")}function K1({label:l,value:u,hint:r,tone:f}){return wl("article",{className:`metric-card ${f||""}`},wl("div",{className:"metric-label"},l),wl("div",{className:"metric-value"},u),wl("div",{className:"metric-hint"},r))}function R3({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return wl("section",{className:`panel ${n||""}`},wl("div",{className:"panel-head"},wl("div",null,u?wl("p",{className:"panel-eyebrow"},u):null,wl(fu,{title:l,loading:t})),r?wl("div",{className:"panel-actions"},r):null),wl("div",{className:"panel-body"},f))}function J5({title:l,data:u,onOpen:r,testId:f}){return wl("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function x3({title:l,text:u}){return wl("div",{className:"empty-state"},wl("strong",null,l),wl("span",null,u))}function kO(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function IO(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function aO(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function qy(l,u){return`${l}/microservices/mdtodo/proxy${u}`}function Nm(l){if(l==="completed")return"已完成";if(l==="in_progress")return"进行中";return"待处理"}function oO(l){if(l==="completed")return"online";if(l==="in_progress")return"warn";return"unknown"}function U5(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 dO({tasks:l,selectedId:u,onSelect:r}){if(!l.length)return wl(x3,{title:"暂无任务",text:"当前文件没有 R 编号任务。"});let f=(n)=>wl("li",{key:n.id},wl("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,"-")}`},wl(jm,{status:oO(n.status)},Nm(n.status)),wl("code",null,n.id),wl("span",{className:"mdtodo-task-title"},n.title||"--"),wl("span",{className:"mdtodo-link-count"},`${n.linkExists??0}/${n.linkCount??0}`)),Array.isArray(n.children)&&n.children.length>0?wl("ol",null,n.children.map(f)):null);return wl("ol",{className:"mdtodo-tree"},l.map(f))}function Jm({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((Y)=>Y.id==="mdtodo")||null,[n,t]=M3({loading:!1,saving:!1,error:"",notice:"",health:null,files:[],todo:null,selectedFile:"",selectedTaskId:"",refreshedAt:null,command:null}),[i,y]=M3(""),[c,_]=M3(""),[A,F]=M3(""),j=Array.isArray(n.todo?.tasks)?n.todo.tasks:[],J=gO(()=>U5(j),[n.todo]),U=J.find((Y)=>Y.id===n.selectedTaskId)||J[0]||null,w=n.todo?.stats||{};async function L(Y=n.selectedFile){if(!f)return;t((H)=>({...H,loading:!0,error:"",notice:""}));try{let[H,D]=await Promise.all([El(`${r}/microservices/mdtodo/health`),El(qy(r,"/api/files"))]),P=Array.isArray(D.files)?D.files:[],E=Y||P[0]?.path||"",S=E?await El(qy(r,`/api/tasks?file=${encodeURIComponent(E)}`)):null,V=Array.isArray(S?.tasks)?U5(S.tasks):[],v=V.some((K)=>K.id===n.selectedTaskId)?n.selectedTaskId:V[0]?.id||"";t({loading:!1,saving:!1,error:"",notice:"",health:H,files:P,todo:S,selectedFile:E,selectedTaskId:v,refreshedAt:new Date,command:n.command})}catch(H){t((D)=>({...D,loading:!1,error:zl(H,"MDTODO 加载失败")}))}}if(Fm(()=>{L()},[f?.id,f?.runtime?.providerStatus]),Fm(()=>{y(U?.title||""),_(U?.rawContent||"")},[U?.id,n.selectedFile]),!f)return wl(x3,{title:"MDTODO 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=mdtodo"});let N=kO(f),Q=aO(f),m=IO(f);async function q(Y){t((H)=>({...H,selectedFile:Y,selectedTaskId:"",command:null})),await L(Y)}async function W(Y){if(!U||!n.selectedFile)return;t((H)=>({...H,saving:!0,error:"",notice:""}));try{let H=await El(qy(r,`/api/tasks/${encodeURIComponent(U.id)}`),{method:"PATCH",body:{file:n.selectedFile,...Y}});t((D)=>({...D,saving:!1,todo:H.file,notice:H.result?.message||"任务已更新"}))}catch(H){t((D)=>({...D,saving:!1,error:zl(H,"任务更新失败")}))}}async function p(){await W({title:i,rawContent:c})}async function O(Y){if(!n.selectedFile)return;t((H)=>({...H,saving:!0,error:"",notice:""}));try{let H=await El(qy(r,"/api/tasks"),{method:"POST",body:{file:n.selectedFile,parentId:Y,title:A||"新任务"}});F(""),t((D)=>({...D,saving:!1,todo:H.file,selectedTaskId:H.result?.taskId||D.selectedTaskId,notice:H.result?.message||"任务已创建"})),await L(n.selectedFile)}catch(H){t((D)=>({...D,saving:!1,error:zl(H,"创建任务失败")}))}}async function z(){if(!U||!n.selectedFile)return;if(!window.confirm(`删除 ${U.id} 及其子任务?`))return;t((Y)=>({...Y,saving:!0,error:"",notice:""}));try{let Y=await El(qy(r,`/api/tasks/${encodeURIComponent(U.id)}?file=${encodeURIComponent(n.selectedFile)}`),{method:"DELETE"}),H=U5(Y.file?.tasks||[]);t((D)=>({...D,saving:!1,todo:Y.file,selectedTaskId:H[0]?.id||"",notice:Y.result?.message||"任务已删除"}))}catch(Y){t((H)=>({...H,saving:!1,error:zl(Y,"删除任务失败")}))}}async function B(){if(!U||!n.selectedFile)return;t((Y)=>({...Y,saving:!0,error:"",command:null}));try{let Y=await El(qy(r,"/api/execute-command"),{method:"POST",body:{file:n.selectedFile,taskId:U.id,mode:"codex"}});t((H)=>({...H,saving:!1,command:Y,notice:"执行命令已生成"}))}catch(Y){t((H)=>({...H,saving:!1,error:zl(Y,"执行命令生成失败")}))}}return wl("div",{className:"mdtodo-page","data-testid":"mdtodo-page"},wl(R3,{title:"MDTODO 工作台",eyebrow:"D601 k3s managed service",loading:n.loading,actions:wl("div",{className:"panel-actions"},wl("button",{type:"button",className:"ghost-btn",onClick:()=>void L(),disabled:n.loading,"data-testid":"mdtodo-refresh-button"},n.loading?"刷新中":"刷新"),wl(J5,{title:"MDTODO 用户服务",data:f,onOpen:u,testId:"raw-mdtodo-service"}))},wl("div",{className:"findjob-hero"},wl("div",null,wl("div",{className:"node-version-line"},wl(jm,{status:N.providerStatus==="online"?"online":"warn"},N.providerStatus||"unknown"),wl("span",null,f.providerId),wl("span",null,m.proxyMode||"--")),wl("p",{className:"muted paragraph"},f.description)),wl("div",{className:"microservice-ref-card"},wl("span",null,"Repo"),wl("strong",null,Q.url||"--"),wl("code",null,Q.composeFile||"--")),wl("div",{className:"microservice-ref-card"},wl("span",null,"Workspace"),wl("strong",null,n.health?.rootDir||"/workspace"),wl("code",null,`${m.nodeBindHost||"--"}:${m.nodePort||"--"}`))),wl(el,{error:n.error,wide:!0}),n.notice?wl("div",{className:"notice-line"},n.notice):null),wl("div",{className:"metric-grid"},wl(K1,{label:"TODO 文件",value:n.files.length,hint:n.health?.rootExists?"hostPath ready":"hostPath missing",tone:n.health?.ok?"ok":"warn"}),wl(K1,{label:"任务总数",value:w.total??"--",hint:n.selectedFile||"--"}),wl(K1,{label:"已完成",value:w.completed??"--",hint:"completed",tone:"ok"}),wl(K1,{label:"进行中",value:w.inProgress??"--",hint:"in progress",tone:"warn"}),wl(K1,{label:"待处理",value:w.pending??"--",hint:n.refreshedAt?tu(n.refreshedAt):"pending"})),wl("div",{className:"mdtodo-layout"},wl(R3,{title:"文件",eyebrow:`${n.files.length} Markdown`,loading:n.loading,className:"mdtodo-file-panel"},n.files.length===0?wl(x3,{title:"暂无 TODO 文件",text:"等待后端扫描 MDTODO 工作区。"}):wl("div",{className:"mdtodo-file-list"},n.files.map((Y)=>wl("button",{key:Y.path,type:"button",className:`mdtodo-file-item ${n.selectedFile===Y.path?"active":""}`,onClick:()=>void q(Y.path)},wl("strong",null,Y.name),wl("span",null,Y.directory||"."),wl("code",null,`${Y.stats?.total??"--"} tasks / ${Gl(Y.mtime)}`))))),wl(R3,{title:"任务树",eyebrow:n.selectedFile||"Tasks",loading:n.loading,actions:wl("div",{className:"panel-actions"},wl("input",{value:A,onChange:(Y)=>F(Y.target.value),placeholder:"新任务标题","data-testid":"mdtodo-new-title"}),wl("button",{type:"button",className:"ghost-btn",onClick:()=>void O(),disabled:n.saving||!n.selectedFile},"新增"),U?wl("button",{type:"button",className:"ghost-btn",onClick:()=>void O(U.id),disabled:n.saving},"新增子任务"):null,n.todo?wl(J5,{title:"MDTODO 当前文件",data:n.todo,onOpen:u,testId:"raw-mdtodo-file"}):null)},wl(dO,{tasks:j,selectedId:U?.id||"",onSelect:(Y)=>t((H)=>({...H,selectedTaskId:Y,command:null}))})),wl(R3,{title:U?`${U.id} 详情`:"任务详情",eyebrow:U?Nm(U.status):"Detail",loading:n.saving,className:"mdtodo-detail-panel",actions:U?wl("div",{className:"panel-actions"},wl("button",{type:"button",className:"ghost-btn",onClick:()=>void W({status:"pending"}),disabled:n.saving},"待处理"),wl("button",{type:"button",className:"ghost-btn",onClick:()=>void W({status:"in_progress"}),disabled:n.saving},"进行中"),wl("button",{type:"button",className:"primary-btn",onClick:()=>void W({status:"completed"}),disabled:n.saving},"完成")):null},!U?wl(x3,{title:"未选中任务",text:"请选择一个任务。"}):wl("div",{className:"mdtodo-editor"},wl("label",null,"标题",wl("input",{value:i,onChange:(Y)=>y(Y.target.value),"data-testid":"mdtodo-title-input"})),wl("label",null,"正文",wl("textarea",{value:c,onChange:(Y)=>_(Y.target.value),rows:12,"data-testid":"mdtodo-raw-input"})),wl("div",{className:"docker-meta compact"},wl("span",null,`line ${Number(U.lineNumber??0)+1}`),wl("span",null,`depth ${U.depth??0}`),wl("span",null,`links ${U.linkExists??0}/${U.linkCount??0}`)),wl("div",{className:"inline-actions"},wl("button",{type:"button",className:"primary-btn",onClick:p,disabled:n.saving},n.saving?"保存中":"保存"),wl("button",{type:"button",className:"ghost-btn",onClick:B,disabled:n.saving},"生成执行命令"),wl("button",{type:"button",className:"danger-btn",onClick:z,disabled:n.saving},"删除"),wl(J5,{title:`MDTODO ${U.id}`,data:U,onOpen:u,testId:"raw-mdtodo-task"})),n.command?wl("div",{className:"mdtodo-command"},wl("span",null,n.command.prompt||"--"),wl("code",null,n.command.command||"--")):null))))}var g3=[{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:"安全边界"}]}],E1=Object.fromEntries(g3.map((l)=>[l.id,l.tabs[0]?.id??""]));function eO(l){let u=String(l||"").trim();if(!u)return"";try{return decodeURIComponent(u)}catch{return u}}function v3(l){let u=String(l||"/"),[r]=u.split(/[?#]/u,1);if(r==="/")return"/";let n=`/${r.split("/").map(eO).filter(Boolean).join("/")}`;return n.endsWith("/")?n:`${n}/`}function lZ(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 Um(l){return String(l||"").trim().toLowerCase().replace(/[\s/\\?#%]+/gu,"-").replace(/-+/gu,"-").replace(/^-+|-+$/gu,"")}function Qm(l){let u=Q5(l.routeSegment||"")||Um(l.routeSegment||"");if(u)return u;let r=Q5(l.id||"");if(r)return r;let f=Q5(l.label||"")||Um(l.label||"");if(f)return f;return`route-${lZ(JSON.stringify(l))}`}function m5(l,u){return`${l}:${u}`}function mm(l){let u=l.map((c)=>{let _=Qm(c);return{...c,routeSegment:_,tabs:c.tabs.map((A)=>({...A,routeSegment:Qm(A)}))}}),r={},f={},n={},t=u.map((c)=>{let _=c.tabs[0]?.id??"";n[c.id]=_;let A=c.tabs.map((J)=>{let U=`/${c.routeSegment}/${J.routeSegment}/`,w=[U],L={moduleId:c.id,tabId:J.id};for(let N of w)r[v3(N)]=L;return f[m5(c.id,J.id)]=U,{...J,canonicalPath:U,aliases:w}}),F=`/${c.routeSegment}/`,j={moduleId:c.id,tabId:_};return r[v3(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 w5(l,u){return l.routeMap[v3(u)]||l.fallbackTarget}function k3(l,u,r){return l.canonicalPathByTarget[m5(u,r)]||l.canonicalPathByTarget[m5(l.fallbackTarget.moduleId,l.fallbackTarget.tabId)]||"/"}function wm(l,u){let r=l.routeMap[v3(u)];if(!r)return null;return k3(l,r.moduleId,r.tabId)}var d3=Ml(Ju(),1);var cl=d3.default.createElement,{useEffect:qm,useMemo:uZ}=d3.default,q5=d3.default.useState;function o3({status:l,children:u,title:r}){let f=String(l||"unknown").toLowerCase();return cl("span",{className:`status-badge ${f}`,title:r},u||l||"unknown")}function p1({label:l,value:u,hint:r,tone:f}){return cl("article",{className:`metric-card ${f||""}`},cl("div",{className:"metric-label"},l),cl("div",{className:"metric-value"},u),cl("div",{className:"metric-hint"},r))}function I3({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return cl("section",{className:`panel ${n||""}`},cl("div",{className:"panel-head"},cl("div",null,u?cl("p",{className:"panel-eyebrow"},u):null,cl(fu,{title:l,loading:t})),r?cl("div",{className:"panel-actions"},r):null),cl("div",{className:"panel-body"},f))}function z1({title:l,data:u,onOpen:r,testId:f}){return cl("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r?.(l,u)},"查看原始JSON")}function L5({title:l,text:u}){return cl("div",{className:"empty-state"},cl("strong",null,l),cl("span",null,u))}function rZ(l){return l&&typeof l==="object"&&!Array.isArray(l)?l:null}function en(l){return Array.isArray(l)?l:[]}function er(l){let u=Number(l);return Number.isFinite(u)?u.toLocaleString("zh-CN"):"--"}function Lm(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 fZ(l){return en(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 nZ(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function tZ(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function iZ(l){return String(l||"").split(/[\s,]+/u).map((u)=>u.trim()).filter(Boolean).join(",")}function a3(l,u){return`${l}/microservices/oa-event-flow/proxy${u}`}function yZ(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 cZ(l){let u=String(l?.subjectKind||"trace"),r=String(l?.subjectId||l?.scopeId||"");return r?`${u}:${r}`:String(l?.scopeId||"--")}function $Z({tags:l}){let u=fZ({tags:l}).slice(0,6);return cl("div",{className:"oa-tag-rail"},u.length===0?cl("span",{className:"muted"},"--"):u.map((r)=>cl("code",{key:r},r)))}function _Z({events:l,onRaw:u}){let r=[...en(l)].reverse();return r.length===0?cl(L5,{title:"事件表暂无记录",text:"等待 Code Queue 或 Pipeline 按 tag 发布 OA 事件"}):cl("div",{className:"table-wrap oa-event-table-wrap"},cl("table",{className:"oa-event-table","data-testid":"oa-event-flow-event-table"},cl("thead",null,cl("tr",null,cl("th",null,"Seq"),cl("th",null,"Type"),cl("th",null,"Source"),cl("th",null,"Aggregate"),cl("th",null,"Tags"),cl("th",null,"Payload"),cl("th",null,"Created"),cl("th",null,"Raw"))),cl("tbody",null,r.map((f)=>{let n=String(f?.type||"event"),t=`${String(f?.aggregateType||"--")}:${String(f?.aggregateId||"--")}`;return cl("tr",{key:f?.eventId||f?.sequence},cl("td",null,cl("code",null,er(f?.sequence))),cl("td",null,cl(o3,{status:yZ(n)},n)),cl("td",null,cl("strong",null,f?.sourceId||"--"),cl("code",null,f?.sourceKind||"--")),cl("td",null,cl("code",null,t)),cl("td",null,cl($Z,{tags:f?.tags})),cl("td",null,cl("span",{className:"oa-payload-preview"},Lm(f?.payload,180))),cl("td",null,Gl(f?.createdAt)),cl("td",null,cl(z1,{title:`OA Event ${f?.sequence||""}`,data:f,onOpen:u,testId:`raw-oa-event-${f?.sequence||"unknown"}`})))}))))}function AZ({stats:l,onRaw:u}){let r=en(l);return r.length===0?cl(L5,{title:"统计中心暂无投影",text:"trace-stats-snapshot / trace-step-created 进入事件流后会更新这里"}):cl("div",{className:"table-wrap oa-stats-table-wrap"},cl("table",{className:"oa-stats-table","data-testid":"oa-event-flow-stats"},cl("thead",null,cl("tr",null,cl("th",null,"Scope"),cl("th",null,"Service"),cl("th",null,"STEP"),cl("th",null,"Read"),cl("th",null,"Edit"),cl("th",null,"Run"),cl("th",null,"Error"),cl("th",null,"Output Seq"),cl("th",null,"Revision"),cl("th",null,"Updated"),cl("th",null,"Raw"))),cl("tbody",null,r.map((f)=>cl("tr",{key:f?.scopeId||`${f?.serviceId}-${f?.subjectId}`},cl("td",null,cl("strong",null,cZ(f)),cl("code",null,f?.scopeId||"--")),cl("td",null,cl(o3,{status:String(f?.serviceId||"unknown")==="code-queue"?"running":"queued"},f?.serviceId||"--")),cl("td",null,cl("strong",null,er(ki(f?.stepCount??f?.llmStepCount)))),cl("td",null,er(ki(f?.readCount))),cl("td",null,er(ki(f?.editCount))),cl("td",null,er(ki(f?.runCount))),cl("td",null,er(ki(f?.errorCount))),cl("td",null,cl("code",null,er(ki(f?.outputMaxSeq)))),cl("td",null,er(ki(f?.statsRevision))),cl("td",null,Gl(f?.updatedAt)),cl("td",null,cl(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 Gm({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((W)=>W.id==="oa-event-flow")||null,[n,t]=q5("service:code-queue"),[i,y]=q5({loading:!1,error:"",health:null,diagnostics:null,events:[],stats:[],refreshedAt:null}),[c,_]=q5({status:"idle",message:"未连接",lastEventAt:""}),A=uZ(()=>iZ(n),[n]);async function F(){if(!f)return;y((W)=>({...W,loading:!0,error:""}));try{let W=A?`tags=${encodeURIComponent(A)}&`:"",[p,O,z,B]=await Promise.all([El(`${r}/microservices/oa-event-flow/health`,{failureFields:[]}),El(a3(r,"/api/diagnostics")),El(a3(r,`/api/events?${W}limit=100`)),El(a3(r,`/api/stats/trace?${W}limit=100`))]);y({loading:!1,error:"",health:p,diagnostics:O,events:en(z?.events),stats:en(B?.stats),refreshedAt:new Date})}catch(W){y((p)=>({...p,loading:!1,error:zl(W,"OA Event Flow 加载失败")}))}}if(qm(()=>{F()},[f?.id,f?.runtime?.providerStatus,A]),qm(()=>{if(!f||typeof EventSource>"u")return;let W=A?`?tags=${encodeURIComponent(A)}`:"",p=new EventSource(`${a3(r,"/api/events/stream")}${W}`,{withCredentials:!0});_({status:"running",message:"SSE connecting",lastEventAt:""});let O=(Y)=>{_({status:"online",message:Lm(Y.data,120),lastEventAt:new Date().toISOString()})},z=(Y)=>{try{let H=JSON.parse(String(Y.data||"{}"));_({status:"online",message:String(H?.type||Y.type||"event"),lastEventAt:new Date().toISOString()}),y((D)=>{let P=[...en(D.events).filter((S)=>String(S?.eventId||"")!==String(H?.eventId||"")),H].sort((S,V)=>Number(S?.sequence||0)-Number(V?.sequence||0)).slice(-100),E=H?.type==="trace-stats-updated"&&rZ(H?.payload?.stats)?[H.payload.stats,...en(D.stats).filter((S)=>String(S?.scopeId||"")!==String(H.payload.stats.scopeId||""))].slice(0,100):D.stats;return{...D,events:P,stats:E}})}catch(H){_({status:"warn",message:zl(H,"SSE 事件解析失败"),lastEventAt:new Date().toISOString()})}},B=()=>{_((Y)=>({...Y,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=B,()=>p.close()},[f?.id,r,A]),!f)return cl(L5,{title:"OA Event Flow 未登记",text:"请在 config.json 的 microservices 中登记 id=oa-event-flow"});let j=nZ(f),J=tZ(f),U=i.diagnostics||{},w=i.health||{},L=U.eventCount??w.eventCount,N=U.traceStatsCount??w.traceStatsCount,Q=U.latestSequence??w.latestSequence,m=U.pipelineBridge||w.pipelineBridge||{},q=en(U.eventTypes).slice(0,8);return cl("div",{className:"oa-event-flow-page","data-testid":"oa-event-flow-page"},cl(I3,{title:"OA Event Flow 控制台",eyebrow:"Unified OA Event Bus + Stats Projection",loading:i.loading,actions:cl("div",{className:"panel-actions"},cl("button",{type:"button",className:"ghost-btn",onClick:F,disabled:i.loading,"data-testid":"oa-event-flow-refresh"},i.loading?"刷新中":"刷新"),cl(z1,{title:"OA Event Flow Service",data:f,onOpen:u,testId:"raw-oa-event-flow-service"}))},cl("div",{className:"oa-flow-hero"},cl("div",null,cl("div",{className:"node-version-line"},cl(o3,{status:w?.ok||j.providerStatus==="online"?"online":"warn"},w?.ok?"HEALTH OK":j.providerStatus||"unknown"),cl(o3,{status:c.status},c.status.toUpperCase()),cl("span",null,J.public?"公网暴露":"仅 UniDesk frontend 代理访问")),cl("p",{className:"muted paragraph"},"独立事件流微服务统一承载 Code Queue 与 Pipeline 的事件发布、tag 订阅、事件表审计和 Trace/STEP 统计投影。")),cl("div",{className:"oa-flow-signal"},cl("span",null,"stream"),cl("strong",null,c.message||"--"),cl("code",null,c.lastEventAt?tu(new Date(c.lastEventAt)):"waiting"))),cl(el,{error:i.error,wide:!0})),cl("div",{className:"oa-flow-metrics"},cl(p1,{label:"事件总量",value:er(L),hint:`latest seq ${er(Q)}`,tone:"ok"}),cl(p1,{label:"Trace Stats",value:er(N),hint:"oa_trace_stats 投影"}),cl(p1,{label:"SSE Clients",value:er(w?.sseClientCount??en(U.sseClients).length),hint:c.message||"tag subscription"}),cl(p1,{label:"Pipeline Bridge",value:m?.enabled?er(m?.insertedCount):"OFF",hint:m?.lastError||m?.lastFinishedAt||`${m?.mode||"snapshot"} service:pipeline`}),cl(p1,{label:"DB",value:w?.databaseReady||U.databaseReady?"READY":"WAIT",hint:w?.databaseLastError||U.databaseLastError||"PostgreSQL persisted"})),cl(I3,{title:"标签订阅",eyebrow:i.refreshedAt?`Updated ${tu(i.refreshedAt)}`:"Tag Pub/Sub"},cl("div",{className:"oa-filter-bar"},cl("label",null,cl("span",null,"tags"),cl("input",{value:n,onChange:(W)=>t(W.target.value),placeholder:"service:code-queue, trace","data-testid":"oa-event-flow-tag-filter"})),cl("div",{className:"oa-filter-presets"},cl("button",{type:"button",className:"ghost-btn",onClick:()=>t("service:code-queue")},"Code Queue"),cl("button",{type:"button",className:"ghost-btn",onClick:()=>t("service:pipeline")},"Pipeline"),cl("button",{type:"button",className:"ghost-btn",onClick:()=>t("trace")},"Trace"),cl("button",{type:"button",className:"ghost-btn",onClick:()=>t("")},"All")),cl("code",null,A||"all events")),cl("div",{className:"oa-type-strip"},q.length===0?cl("span",{className:"muted"},"等待事件类型统计"):q.map((W)=>cl("span",{key:W.type,className:"data-chip"},`${W.type} ${er(W.count)}`)))),cl("div",{className:"oa-flow-grid"},cl(I3,{title:"事件表",eyebrow:"oa_events persisted log",className:"oa-flow-wide",loading:i.loading,actions:cl(z1,{title:"OA Event Query",data:{events:i.events,diagnostics:U},onOpen:u,testId:"raw-oa-events"})},cl(_Z,{events:i.events,onRaw:u})),cl(I3,{title:"统计中心",eyebrow:"oa_trace_stats read model",className:"oa-flow-wide",loading:i.loading,actions:cl(z1,{title:"OA Trace Stats",data:i.stats,onOpen:u,testId:"raw-oa-trace-stats"})},cl(AZ,{stats:i.stats,onRaw:u}))))}var ni=Ml(Ju(),1);var il=Ml(Em(),1),$l=Ml(Ju(),1);function xu(l){if(typeof l==="string"||typeof l==="number")return""+l;let u="";if(Array.isArray(l)){for(let r=0,f;r{}};function zm(){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}})}lA.prototype=zm.prototype={constructor:lA,on:function(l,u){var r=this._,f=wZ(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 G5.hasOwnProperty(u)?{space:G5[u],local:l}:l}function W5(l){let u;while(u=l.sourceEvent)l=u;return l}function pr(l,u){if(l=W5(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 LZ(){}function bt(l){return l==null?LZ:function(){return this.querySelector(l)}}function T5(l){if(typeof l!=="function")l=bt(l);for(var u=this._groups,r=u.length,f=Array(r),n=0;n=m)m=Q+1;while(!(W=L[m])&&++m=0;)if(i=f[n]){if(t&&i.compareDocumentPosition(t)^4)t.parentNode.insertBefore(i,t);t=i}return this}function X5(l){if(!l)l=SZ;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 P5(){var l=arguments[0];return arguments[0]=this,l.apply(null,arguments),this}function C5(){return Array.from(this)}function h5(){for(var l=this._groups,u=0,r=l.length;u1?this.each((u==null?sZ:typeof u==="function"?RZ:MZ)(l,u,r==null?"":r)):vt(this.node(),l)}function vt(l,u){return l.style.getPropertyValue(u)||H1(l).getComputedStyle(l,null).getPropertyValue(u)}function xZ(l){return function(){delete this[l]}}function bZ(l,u){return function(){this[l]=u}}function vZ(l,u){return function(){var r=u.apply(this,arguments);if(r==null)delete this[l];else this[l]=r}}function v5(l,u){return arguments.length>1?this.each((u==null?xZ:typeof u==="function"?vZ:bZ)(l,u)):this.node()[l]}function Om(l){return l.trim().split(/^|\s+/)}function g5(l){return l.classList||new Zm(l)}function Zm(l){this._node=l,this._names=Om(l.getAttribute("class")||"")}Zm.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 Hm(l,u){var r=g5(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 FH(l){return function(){var u=this.__on;if(!u)return;for(var r=0,f=-1,n=u.length,t;r()=>l;function V1(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}})}V1.prototype.on=function(){var l=this._.on.apply(this._,arguments);return l===this._?this:l};function TH(l){return!l.ctrlKey&&!l.button}function KH(){return this.parentNode}function EH(l,u){return u==null?{x:l.x,y:l.y}:u}function pH(){return navigator.maxTouchPoints||"ontouchstart"in this}function Y1(){var l=TH,u=KH,r=EH,f=pH,n={},t=Ii("start","drag","end"),i=0,y,c,_,A,F=0;function j(q){q.on("mousedown.drag",J).filter(f).on("touchstart.drag",L).on("touchmove.drag",N,Vm).on("touchend.drag touchcancel.drag",Q).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function J(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;fr(q.view).on("mousemove.drag",U,ai).on("mouseup.drag",w,ai),Wy(q.view),fA(q),_=!1,y=q.clientX,c=q.clientY,p("start",q)}function U(q){if(ut(q),!_){var W=q.clientX-y,p=q.clientY-c;_=W*W+p*p>F}n.mouse("drag",q)}function w(q){fr(q.view).on("mousemove.drag mouseup.drag",null),D1(q.view,_),ut(q),n.mouse("end",q)}function L(q,W){if(!l.call(this,q,W))return;var p=q.changedTouches,O=u.call(this,q,W),z=p.length,B,Y;for(B=0;B>8&15|u>>4&240,u>>4&15|u&240,(u&15)<<4|u&15,1):r===8?nA(u>>24&255,u>>16&255,u>>8&255,(u&255)/255):r===4?nA(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=OH.exec(l))?new lf(u[1],u[2],u[3],1):(u=ZH.exec(l))?new lf(u[1]*255/100,u[2]*255/100,u[3]*255/100,1):(u=HH.exec(l))?nA(u[1],u[2],u[3],u[4]):(u=BH.exec(l))?nA(u[1]*255/100,u[2]*255/100,u[3]*255/100,u[4]):(u=DH.exec(l))?Mm(u[1],u[2]/100,u[3]/100,1):(u=SH.exec(l))?Mm(u[1],u[2]/100,u[3]/100,u[4]):Ym.hasOwnProperty(l)?Cm(Ym[l]):l==="transparent"?new lf(NaN,NaN,NaN,0):null}function Cm(l){return new lf(l>>16&255,l>>8&255,l&255,1)}function nA(l,u,r,f){if(f<=0)l=u=r=NaN;return new lf(l,u,r,f)}function XH(l){if(!(l instanceof h1))l=nn(l);if(!l)return new lf;return l=l.rgb(),new lf(l.r,l.g,l.b,l.opacity)}function Ky(l,u,r,f){return arguments.length===1?XH(l):new lf(l,u,r,f==null?1:f)}function lf(l,u,r,f){this.r=+l,this.g=+u,this.b=+r,this.opacity=+f}X1(lf,Ky,cF(h1,{brighter(l){return l=l==null?iA:Math.pow(iA,l),new lf(this.r*l,this.g*l,this.b*l,this.opacity)},darker(l){return l=l==null?P1:Math.pow(P1,l),new lf(this.r*l,this.g*l,this.b*l,this.opacity)},rgb(){return this},clamp(){return new lf(di(this.r),di(this.g),di(this.b),yA(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:hm,formatHex:hm,formatHex8:PH,formatRgb:sm,toString:sm}));function hm(){return`#${oi(this.r)}${oi(this.g)}${oi(this.b)}`}function PH(){return`#${oi(this.r)}${oi(this.g)}${oi(this.b)}${oi((isNaN(this.opacity)?1:this.opacity)*255)}`}function sm(){let l=yA(this.opacity);return`${l===1?"rgb(":"rgba("}${di(this.r)}, ${di(this.g)}, ${di(this.b)}${l===1?")":`, ${l})`}`}function yA(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 Mm(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 xm(l){if(l instanceof fn)return new fn(l.h,l.s,l.l,l.opacity);if(!(l instanceof h1))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 bm(l,u,r,f){return arguments.length===1?xm(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}X1(fn,bm,cF(h1,{brighter(l){return l=l==null?iA:Math.pow(iA,l),new fn(this.h,this.s,this.l*l,this.opacity)},darker(l){return l=l==null?P1:Math.pow(P1,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 lf($F(l>=240?l-240:l+120,n,f),$F(l,n,f),$F(l<120?l+240:l-120,n,f),this.opacity)},clamp(){return new fn(Rm(this.h),tA(this.s),tA(this.l),yA(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=yA(this.opacity);return`${l===1?"hsl(":"hsla("}${Rm(this.h)}, ${tA(this.s)*100}%, ${tA(this.l)*100}%${l===1?")":`, ${l})`}`}}));function Rm(l){return l=(l||0)%360,l<0?l+360:l}function tA(l){return Math.max(0,Math.min(1,l||0))}function $F(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 _F(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 AF(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 hH(l,u){return function(r){return l+r*u}}function sH(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 vm(l){return(l=+l)===1?$A:function(u,r){return r-u?sH(u,r,l):s1(isNaN(u)?r:u)}}function $A(l,u){var r=u-l;return r?hH(l,r):s1(isNaN(l)?u:l)}var ei=function l(u){var r=vm(u);function f(n,t){var i=r((n=Ky(n)).r,(t=Ky(t)).r),y=r(n.g,t.g),c=r(n.b,t.b),_=$A(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 gm(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:zr(f,n)});r=UF.lastIndex}if(r180)A+=360;else if(A-_>180)_+=360;j.push({i:F.push(n(F)+"rotate(",null,f)-2,x:zr(_,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:zr(_,A)});else if(A)F.push(n(F)+"skewX("+A+f)}function c(_,A,F,j,J,U){if(_!==F||A!==j){var w=J.push(n(J)+"scale(",null,",",null,")");U.push({i:w-4,x:zr(_,F)},{i:w-2,x:zr(A,j)})}else if(F!==1||j!==1)J.push(n(J)+"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(J){var U=-1,w=j.length,L;while(++U=0)l._call.call(void 0,u);l=l._next}--py}function nw(){u0=(NA=b1.now())+JA,py=R1=0;try{yw()}finally{py=0,$B(),u0=0}}function cB(){var l=b1.now(),u=l-NA;if(u>tw)JA-=u,NA=l}function $B(){var l,u=jA,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:jA=r;x1=l,qF(f)}function qF(l){if(py)return;if(R1)R1=clearTimeout(R1);var u=l-u0;if(u>24){if(l<1/0)R1=setTimeout(nw,l-b1.now()-JA);if(M1)M1=clearInterval(M1)}else{if(!M1)NA=b1.now(),M1=setInterval(cB,tw);py=1,iw(nw)}}function k1(l,u,r){var f=new v1;return u=u==null?0:+u,f.restart((n)=>{f.stop(),l(n+u)},u,r),f}var AB=Ii("start","end","cancel","interrupt"),FB=[],_w=0,cw=1,mA=2,QA=3,$w=4,wA=5,I1=6;function rt(l,u,r,f,n,t){var i=l.__transition;if(!i)l.__transition={};else if(r in i)return;jB(l,r,{name:u,index:f,group:n,on:AB,tween:FB,time:t.time,delay:t.delay,duration:t.duration,ease:t.ease,timer:null,state:_w})}function a1(l,u){var r=nr(l,u);if(r.state>_w)throw Error("too late; already scheduled");return r}function Ur(l,u){var r=nr(l,u);if(r.state>QA)throw Error("too late; already running");return r}function nr(l,u){var r=l.__transition;if(!r||!(r=r[u]))throw Error("transition not found");return r}function jB(l,u,r){var f=l.__transition,n;f[u]=r,r.timer=UA(t,0,r.time);function t(_){if(r.state=cw,r.timer.restart(i,r.delay,r.time),r.delay<=_)i(_-r.delay)}function i(_){var A,F,j,J;if(r.state!==cw)return c();for(A in f){if(J=f[A],J.name!==r.name)continue;if(J.state===QA)return k1(i);if(J.state===$w)J.state=I1,J.timer.stop(),J.on.call("interrupt",l,l.__data__,J.index,J.group),delete f[A];else if(+AmA&&f.state=0)u=u.slice(0,r);return!u||u==="start"})}function DB(l,u,r){var f,n,t=BB(u)?a1: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 HF(l,u){var r=this._id;return arguments.length<2?nr(this.node(),r).on.on(l):this.each(DB(r,l,u))}function SB(l){return function(){var u=this.parentNode;for(var r in this.__transition)if(+r!==l)return;if(u)u.removeChild(this)}}function BF(){return this.on("end.remove",SB(this._id))}function DF(l){var u=this._name,r=this._id;if(typeof l!=="function")l=bt(l);for(var f=this._groups,n=f.length,t=Array(n),i=0;i()=>l;function RF(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);e1.prototype=tn.prototype;function e1(l){while(!l.__zoom)if(!(l=l.parentNode))return r0;return l.__zoom}function ZA(l){l.stopImmediatePropagation()}function f0(l){l.preventDefault(),l.stopImmediatePropagation()}function aB(l){return(!l.ctrlKey||l.type==="wheel")&&!l.button}function oB(){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 jw(){return this.__zoom||r0}function dB(l){return-l.deltaY*(l.deltaMode===1?0.05:l.deltaMode?1:0.002)*(l.ctrlKey?10:1)}function eB(){return navigator.maxTouchPoints||"ontouchstart"in this}function lD(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 l$(){var l=aB,u=oB,r=lD,f=dB,n=eB,t=[0,1/0],i=[[-1/0,-1/0],[1/0,1/0]],y=250,c=l0,_=Ii("start","zoom","end"),A,F,j,J=500,U=150,w=0,L=10;function N(E){E.property("__zoom",jw).on("wheel.zoom",z,{passive:!1}).on("mousedown.zoom",B).on("dblclick.zoom",Y).filter(n).on("touchstart.zoom",H).on("touchmove.zoom",D).on("touchend.zoom touchcancel.zoom",P).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}N.transform=function(E,S,V,v){var K=E.selection?E.selection():E;if(K.property("__zoom",jw),E!==K)W(E,S,V,v);else K.interrupt().each(function(){p(this,arguments).event(v).start().zoom(null,typeof S==="function"?S.apply(this,arguments):S).end()})},N.scaleBy=function(E,S,V,v){N.scaleTo(E,function(){var K=this.__zoom.k,X=typeof S==="function"?S.apply(this,arguments):S;return K*X},V,v)},N.scaleTo=function(E,S,V,v){N.transform(E,function(){var K=u.apply(this,arguments),X=this.__zoom,I=V==null?q(K):typeof V==="function"?V.apply(this,arguments):V,a=X.invert(I),R=typeof S==="function"?S.apply(this,arguments):S;return r(m(Q(X,R),I,a),K,i)},V,v)},N.translateBy=function(E,S,V,v){N.transform(E,function(){return r(this.__zoom.translate(typeof S==="function"?S.apply(this,arguments):S,typeof V==="function"?V.apply(this,arguments):V),u.apply(this,arguments),i)},null,v)},N.translateTo=function(E,S,V,v,K){N.transform(E,function(){var X=u.apply(this,arguments),I=this.__zoom,a=v==null?q(X):typeof v==="function"?v.apply(this,arguments):v;return r(r0.translate(a[0],a[1]).scale(I.k).translate(typeof S==="function"?-S.apply(this,arguments):-S,typeof V==="function"?-V.apply(this,arguments):-V),X,i)},v,K)};function Q(E,S){return S=Math.max(t[0],Math.min(t[1],S)),S===E.k?E:new tn(S,E.x,E.y)}function m(E,S,V){var v=S[0]-V[0]*E.k,K=S[1]-V[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,S,V,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),a=u.apply(K,X),R=V==null?q(a):typeof V==="function"?V.apply(K,X):V,nl=Math.max(a[1][0]-a[0][0],a[1][1]-a[0][1]),d=K.__zoom,h=typeof S==="function"?S.apply(K,X):S,rl=c(d.invert(R).concat(nl/d.k),h.invert(R).concat(nl/h.k));return function(_l){if(_l===1)_l=h;else{var Al=rl(_l),Ll=nl/Al[2];_l=new tn(Ll,R[0]-Al[0]*Ll,R[1]-Al[1]*Ll)}I.zoom(null,_l)}})}function p(E,S,V){return!V&&E.__zooming||new O(E,S)}function O(E,S){this.that=E,this.args=S,this.active=0,this.sourceEvent=null,this.extent=u.apply(E,S),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,S){if(this.mouse&&E!=="mouse")this.mouse[1]=S.invert(this.mouse[0]);if(this.touch0&&E!=="touch")this.touch0[1]=S.invert(this.touch0[0]);if(this.touch1&&E!=="touch")this.touch1[1]=S.invert(this.touch1[0]);return this.that.__zoom=S,this.emit("zoom"),this},end:function(){if(--this.active===0)delete this.that.__zooming,this.emit("end");return this},emit:function(E){var S=fr(this.that).datum();_.call(E,this.that,new RF(E,{sourceEvent:this.sourceEvent,target:N,type:E,transform:this.that.__zoom,dispatch:_}),S)}};function z(E,...S){if(!l.apply(this,arguments))return;var V=p(this,S).event(E),v=this.__zoom,K=Math.max(t[0],Math.min(t[1],v.k*Math.pow(2,f.apply(this,arguments)))),X=pr(E);if(V.wheel){if(V.mouse[0][0]!==X[0]||V.mouse[0][1]!==X[1])V.mouse[1]=v.invert(V.mouse[0]=X);clearTimeout(V.wheel)}else if(v.k===K)return;else V.mouse=[X,v.invert(X)],gt(this),V.start();f0(E),V.wheel=setTimeout(I,U),V.zoom("mouse",r(m(Q(v,K),V.mouse[0],V.mouse[1]),V.extent,i));function I(){V.wheel=null,V.end()}}function B(E,...S){if(j||!l.apply(this,arguments))return;var V=E.currentTarget,v=p(this,S,!0).event(E),K=fr(E.view).on("mousemove.zoom",R,!0).on("mouseup.zoom",nl,!0),X=pr(E,V),I=E.clientX,a=E.clientY;Wy(E.view),ZA(E),v.mouse=[X,this.__zoom.invert(X)],gt(this),v.start();function R(d){if(f0(d),!v.moved){var h=d.clientX-I,rl=d.clientY-a;v.moved=h*h+rl*rl>w}v.event(d).zoom("mouse",r(m(v.that.__zoom,v.mouse[0]=pr(d,V),v.mouse[1]),v.extent,i))}function nl(d){K.on("mousemove.zoom mouseup.zoom",null),D1(d.view,v.moved),f0(d),v.event(d).end()}}function Y(E,...S){if(!l.apply(this,arguments))return;var V=this.__zoom,v=pr(E.changedTouches?E.changedTouches[0]:E,this),K=V.invert(v),X=V.k*(E.shiftKey?0.5:2),I=r(m(Q(V,X),v,K),u.apply(this,S),i);if(f0(E),y>0)fr(this).transition().duration(y).call(W,I,v,E);else fr(this).call(N.transform,I,v,E)}function H(E,...S){if(!l.apply(this,arguments))return;var V=E.touches,v=V.length,K=p(this,S,E.changedTouches.length===v).event(E),X,I,a,R;ZA(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."},Dy=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],kF=["Enter"," ","Escape"],IF={"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"},at;(function(l){l.Strict="strict",l.Loose="loose"})(at||(at={}));var nt;(function(l){l.Free="free",l.Vertical="vertical",l.Horizontal="horizontal"})(nt||(nt={}));var n0;(function(l){l.Partial="partial",l.Full="full"})(n0||(n0={}));var aF={inProgress:!1,isValid:null,from:null,fromHandle:null,fromPosition:null,fromNode:null,to:null,toHandle:null,toPosition:null,toNode:null,pointer:null},zn;(function(l){l.Bezier="default",l.Straight="straight",l.Step="step",l.SmoothStep="smoothstep",l.SimpleBezier="simplebezier"})(zn||(zn={}));var ot;(function(l){l.Arrow="arrow",l.ArrowClosed="arrowclosed"})(ot||(ot={}));var Ol;(function(l){l.Left="left",l.Top="top",l.Right="right",l.Bottom="bottom"})(Ol||(Ol={}));var Nw={[Ol.Left]:Ol.Right,[Ol.Right]:Ol.Left,[Ol.Top]:Ol.Bottom,[Ol.Bottom]:Ol.Top};function oF(l){return l===null?null:l?"valid":"invalid"}var dF=(l)=>("id"in l)&&("source"in l)&&("target"in l),pw=(l)=>("id"in l)&&("position"in l)&&!("source"in l)&&!("target"in l),eF=(l)=>("id"in l)&&("internals"in l)&&!("source"in l)&&!("target"in l);var f$=(l,u=[0,0])=>{let{width:r,height:f}=On(l),n=l.origin??u,t=r*n[0],i=f*n[1];return{x:l.position.x-t,y:l.position.y-i}},l9=(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):!eF(n)?u.nodeLookup.get(n.id):n;let y=i?DA(i,u.nodeOrigin):{x:0,y:0,x2:0,y2:0};return VA(f,y)},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return YA(r)},Sy=(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=VA(r,DA(n)),f=!0}),f?YA(r):{x:0,y:0,width:0,height:0}},SA=(l,u,[r,f,n]=[0,0,1],t=!1,i=!1)=>{let y={...Xy(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 J=A.width??_.width??_.initialWidth??null,U=A.height??_.height??_.initialHeight??null,w=Vy(y,i0(_)),L=(J??0)*(U??0),N=t&&w>0;if(!_.internals.handleBounds||N||w>=L||_.dragging)c.push(_)}return c},zw=(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 uD(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 Ow({nodes:l,width:u,height:r,panZoom:f,minZoom:n,maxZoom:t},i){if(l.size===0)return Promise.resolve(!0);let y=uD(l,i),c=Sy(y),_=n$(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 u9({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",wf.error005());else{let J=y.measured.width,U=y.measured.height;if(J&&U)F=[[c,_],[c+J,_+U]]}else if(y&&By(i.extent))F=[[i.extent[0][0]+c,i.extent[0][1]+_],[i.extent[1][0]+c,i.extent[1][1]+_]];let j=By(F)?t0(u,F,i.measured):u;if(i.measured.width===void 0||i.measured.height===void 0)t?.("015",wf.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 Zw({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 J=t.has(j.id),U=!J&&j.parentId&&i.find((w)=>w.id===j.parentId);if(J||U)i.push(j)}let y=new Set(u.map((j)=>j.id)),c=f.filter((j)=>j.deletable!==!1),A=zw(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 Hy=(l,u=0,r=1)=>Math.min(Math.max(l,u),r),t0=(l={x:0,y:0},u,r)=>({x:Hy(l.x,u[0][0],u[1][0]-(r?.width??0)),y:Hy(l.y,u[0][1],u[1][1]-(r?.height??0))});function Hw(l,u,r){let{width:f,height:n}=On(r),{x:t,y:i}=r.internals.positionAbsolute;return t0(l,[[t,i],[t+f,i+n]],u)}var Jw=(l,u,r)=>{if(lr)return-Hy(Math.abs(l-r),1,u)/u;return 0},Bw=(l,u,r=15,f=40)=>{let n=Jw(l.x,f,u.width-f)*r,t=Jw(l.y,f,u.height-f)*r;return[n,t]},VA=(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)}),gF=({x:l,y:u,width:r,height:f})=>({x:l,y:u,x2:l+r,y2:u+f}),YA=({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}=eF(l)?l.internals.positionAbsolute:f$(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}},DA=(l,u=[0,0])=>{let{x:r,y:f}=eF(l)?l.internals.positionAbsolute:f$(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)}},r9=(l,u)=>YA(VA(gF(l),gF(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)},f9=(l)=>Sf(l.width)&&Sf(l.height)&&Sf(l.x)&&Sf(l.y),Sf=(l)=>!isNaN(l)&&isFinite(l),n9=(l,u)=>{},Yy=(l,u=[1,1])=>{return{x:u[0]*Math.round(l.x/u[0]),y:u[1]*Math.round(l.y/u[1])}},Xy=({x:l,y:u},[r,f,n],t=!1,i=[1,1])=>{let y={x:(l-r)/n,y:(u-f)/n};return t?Yy(y,i):y},r$=({x:l,y:u},[r,f,n])=>{return{x:l*n+r,y:u*n+f}};function Oy(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 rD(l,u,r){if(typeof l==="string"||typeof l==="number"){let f=Oy(l,r),n=Oy(l,u);return{top:f,right:n,bottom:f,left:n,x:n*2,y:f*2}}if(typeof l==="object"){let f=Oy(l.top??l.y??0,r),n=Oy(l.bottom??l.y??0,r),t=Oy(l.left??l.x??0,u),i=Oy(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 fD(l,u,r,f,n,t){let{x:i,y}=r$(l,[u,r,f]),{x:c,y:_}=r$({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 n$=(l,u,r,f,n,t)=>{let i=rD(t,u,r),y=(u-i.x)/l.width,c=(r-i.y)/l.height,_=Math.min(y,c),A=Hy(_,f,n),F=l.x+l.width/2,j=l.y+l.height/2,J=u/2-F*A,U=r/2-j*A,w=fD(l,J,U,A,u,r),L={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:J-L.left+L.right,y:U-L.top+L.bottom,zoom:A}},Py=()=>typeof navigator<"u"&&navigator?.userAgent?.indexOf("Mac")>=0;function By(l){return l!==void 0&&l!==null&&l!=="parent"}function On(l){return{width:l.measured?.width??l.width??l.initialWidth??0,height:l.measured?.height??l.height??l.initialHeight??0}}function t9(l){return(l.measured?.width??l.width??l.initialWidth)!==void 0&&(l.measured?.height??l.height??l.initialHeight)!==void 0}function i9(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 y9(l,u){if(l.size!==u.size)return!1;for(let r of l)if(!u.has(r))return!1;return!0}function Dw(){let l,u;return{promise:new Promise((f,n)=>{l=f,u=n}),resolve:l,reject:u}}function Sw(l){return{...IF,...l||{}}}function u$(l,{snapGrid:u=[0,0],snapToGrid:r=!1,transform:f,containerBounds:n}){let{x:t,y:i}=Vf(l),y=Xy({x:t-(n?.left??0),y:i-(n?.top??0)},f),{x:c,y:_}=r?Yy(y,u):y;return{xSnapped:c,ySnapped:_,...y}}var XA=(l)=>({width:l.offsetWidth,height:l.offsetHeight}),c9=(l)=>l?.getRootNode?.()||window?.document,nD=["INPUT","SELECT","TEXTAREA"];function $9(l){let u=l.composedPath?.()?.[0]||l.target;if(u?.nodeType!==1)return!1;return nD.includes(u.nodeName)||u.hasAttribute("contenteditable")||!!u.closest(".nokey")}var _9=(l)=>("clientX"in l),Vf=(l,u)=>{let r=_9(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)}},Uw=(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,...XA(i)}})};function PA({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 HA(l,u){if(l>=0)return 0.5*l;return u*25*Math.sqrt(-l)}function Qw({pos:l,x1:u,y1:r,x2:f,y2:n,c:t}){switch(l){case Ol.Left:return[u-HA(u-f,t),r];case Ol.Right:return[u+HA(f-u,t),r];case Ol.Top:return[u,r-HA(r-n,t)];case Ol.Bottom:return[u,r+HA(n-r,t)]}}function CA({sourceX:l,sourceY:u,sourcePosition:r=Ol.Bottom,targetX:f,targetY:n,targetPosition:t=Ol.Top,curvature:i=0.25}){let[y,c]=Qw({pos:r,x1:l,y1:u,x2:f,y2:n,c:i}),[_,A]=Qw({pos:t,x1:f,y1:n,x2:l,y2:u,c:i}),[F,j,J,U]=PA({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,J,U]}function A9({sourceX:l,sourceY:u,targetX:r,targetY:f}){let n=Math.abs(r-l)/2,t=r0}var tD=({source:l,sourceHandle:u,target:r,targetHandle:f})=>`xy-edge__${l}${u||""}-${r}${f||""}`,iD=(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))},F9=(l,u,r={})=>{if(!l.source||!l.target)return n9("006",wf.error006()),u;let f=r.getEdgeId||tD,n;if(dF(l))n={...l};else n={...l,id:f(l)};if(iD(n,u))return u;if(n.sourceHandle===null)delete n.sourceHandle;if(n.targetHandle===null)delete n.targetHandle;return u.concat(n)};function hA({sourceX:l,sourceY:u,targetX:r,targetY:f}){let[n,t,i,y]=A9({sourceX:l,sourceY:u,targetX:r,targetY:f});return[`M ${l},${u}L ${r},${f}`,n,t,i,y]}var mw={[Ol.Left]:{x:-1,y:0},[Ol.Right]:{x:1,y:0},[Ol.Top]:{x:0,y:-1},[Ol.Bottom]:{x:0,y:1}},yD=({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 cD({source:l,sourcePosition:u=Ol.Bottom,target:r,targetPosition:f=Ol.Top,center:n,offset:t,stepPosition:i}){let y=mw[u],c=mw[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=yD({source:_,sourcePosition:u,target:A}),j=F.x!==0?"x":"y",J=F[j],U=[],w,L,N={x:0,y:0},Q={x:0,y:0},[,,m,q]=A9({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,L=n.y??(_.y+A.y)/2;else w=n.x??(_.x+A.x)/2,L=n.y??_.y+(A.y-_.y)*i;let z=[{x:w,y:_.y},{x:w,y:A.y}],B=[{x:_.x,y:L},{x:A.x,y:L}];if(y[j]===J)U=j==="x"?z:B;else U=j==="x"?B:z}else{let z=[{x:_.x,y:A.y}],B=[{x:A.x,y:_.y}];if(j==="x")U=y.x===J?B:z;else U=y.y===J?z:B;if(u===f){let E=Math.abs(l[j]-r[j]);if(E<=t){let S=Math.min(t-1,t-E);if(y[j]===J)N[j]=(_[j]>l[j]?-1:1)*S;else Q[j]=(A[j]>r[j]?-1:1)*S}}if(u!==f){let E=j==="x"?"y":"x",S=y[j]===c[E],V=_[E]>A[E],v=_[E]=P)w=(Y.x+H.x)/2,L=U[0].y;else w=U[0].x,L=(Y.y+H.y)/2}let W={x:_.x+N.x,y:_.y+N.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,L,m,q]}function $D(l,u,r,f){let n=Math.min(ww(l,u)/2,ww(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 sA(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 Pw(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 _=sA(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 Cw=1000,_D=10,j9={nodeOrigin:[0,0],nodeExtent:Dy,elevateNodesOnSelect:!0,zIndexMode:"basic",defaults:{}},AD={...j9,checkEquality:!0};function N9(l,u){let r={...l};for(let f in u)if(u[f]!==void 0)r[f]=u[f];return r}function hw(l,u,r){let f=N9(j9,r);for(let n of l.values())if(n.parentId)U9(n,l,u,f);else{let t=f$(n,f.nodeOrigin),i=By(n.extent)?n.extent:f.nodeExtent,y=t0(t,i,On(n));n.internals.positionAbsolute=y}}function FD(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 J9(l){return l==="manual"}function MA(l,u,r,f={}){let n=N9(AD,f),t={i:0},i=new Map(u),y=n?.elevateNodesOnSelect&&!J9(n.zIndexMode)?Cw: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=f$(A,n.nodeOrigin),J=By(A.extent)?A.extent:n.nodeExtent,U=t0(j,J,On(A));F={...n.defaults,...A,measured:{width:A.measured?.width,height:A.measured?.height},internals:{positionAbsolute:U,handleBounds:FD(A,F),z:sw(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)U9(F,u,r,f,t);_||=A.selected??!1}return{nodesInitialized:c,hasSelectedNodes:_}}function jD(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 U9(l,u,r,f,n){let{elevateNodesOnSelect:t,nodeOrigin:i,nodeExtent:y,zIndexMode:c}=N9(j9,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(jD(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*_D;if(n&&A.internals.rootParentIndex!==void 0)n.i=A.internals.rootParentIndex;let F=t&&!J9(c)?Cw:0,{x:j,y:J,z:U}=ND(l,A,i,y,F,c),{positionAbsolute:w}=l.internals,L=j!==w.x||J!==w.y;if(L||U!==l.internals.z)u.set(l.id,{...l,internals:{...l.internals,positionAbsolute:L?{x:j,y:J}:w,z:U}})}function sw(l,u,r){let f=Sf(l.zIndex)?l.zIndex:0;if(J9(r))return f;return f+(l.selected?u:0)}function ND(l,u,r,f,n,t){let{x:i,y}=u.internals.positionAbsolute,c=On(l),_=f$(l,r),A=By(l.extent)?t0(_,l.extent,c):_,F=t0({x:i+A.x,y:y+A.y},f,c);if(l.extent==="parent")F=Hw(F,c,u);let j=sw(l,n,t),J=u.internals.z??0;return{x:F.x,y:F.y,z:J>=j?J+1:j}}function RA(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),_=r9(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=On(y),F=y.origin??f,j=i.x<_.x?Math.round(Math.abs(_.x-i.x)):0,J=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)),L=(U-A.width)*F[0],N=(w-A.height)*F[1];if(j>0||J>0||L||N)n.push({id:c,type:"position",position:{x:y.position.x-j+L,y:y.position.y-J+N}}),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+J}})});if(A.width0){let J=RA(j,u,r,n);_.push(...J)}return{changes:_,updatedInternals:c}}async function Rw({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 Ww(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 Q9(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}`;Ww("source",c,A,l,n,i),Ww("target",c,_,l,t,y),u.set(f.id,f)}}function xw(l,u){if(!l.parentId)return!1;let r=u.get(l.parentId);if(!r)return!1;if(r.selected)return!0;return xw(r,u)}function Tw(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 JD(l,u,r,f){let n=new Map;for(let[t,i]of l)if((i.selected||i.id===f)&&(!i.parentId||!xw(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 xF({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 UD({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=Yy(t,u);return{x:i.x-t.x,y:i.y-t.y}}function bw({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,J=!1,U=!1,w=null;function L({noDragClassName:Q,handleSelector:m,domNode:q,isSelectable:W,nodeId:p,nodeClickDistance:O=0}){j=fr(q);function z({x:D,y:P}){let{nodeLookup:E,nodeExtent:S,snapGrid:V,snapToGrid:v,nodeOrigin:K,onNodeDrag:X,onSelectionDrag:I,onError:a,updateNodePositions:R}=u();t={x:D,y:P};let nl=!1,d=y.size>1,h=d&&S?gF(Sy(y)):null,rl=d&&v?UD({dragItems:y,snapGrid:V,x:D,y:P}):null;for(let[_l,Al]of y){if(!E.has(_l))continue;let Ll={x:D-Al.distance.x,y:P-Al.distance.y};if(v)Ll=rl?{x:Math.round(Ll.x+rl.x),y:Math.round(Ll.y+rl.y)}:Yy(Ll,V);let Ql=null;if(d&&S&&!Al.extent&&h){let{positionAbsolute:e}=Al.internals,fl=e.x-h.x+S[0][0],k=e.x+Al.measured.width-h.x2+S[1][0],g=e.y-h.y+S[0][1],yl=e.y+Al.measured.height-h.y2+S[1][1];Ql=[[fl,g],[k,yl]]}let{position:pl,positionAbsolute:s}=u9({nodeId:_l,nextPosition:Ll,nodeLookup:E,nodeExtent:Ql?Ql:S,nodeOrigin:K,onError:a});nl=nl||Al.position.x!==pl.x||Al.position.y!==pl.y,Al.position=pl,Al.internals.positionAbsolute=s}if(U=U||nl,!nl)return;if(R(y,!0),w&&(f||X||!p&&I)){let[_l,Al]=xF({nodeId:p,dragItems:y,nodeLookup:E});if(f?.(w,y,_l,Al),X?.(w,_l,Al),!p)I?.(w,Al)}}async function B(){if(!A)return;let{transform:D,panBy:P,autoPanSpeed:E,autoPanOnNodeDrag:S}=u();if(!S){c=!1,cancelAnimationFrame(i);return}let[V,v]=Bw(_,A,E);if(V!==0||v!==0){if(t.x=(t.x??0)-V/D[2],t.y=(t.y??0)-v/D[2],await P({x:V,y:v}))z(t)}i=requestAnimationFrame(B)}function Y(D){let{nodeLookup:P,multiSelectionActive:E,nodesDraggable:S,transform:V,snapGrid:v,snapToGrid:K,selectNodesOnDrag:X,onNodeDragStart:I,onSelectionDragStart:a,unselectNodesAndEdges:R}=u();if(F=!0,(!X||!W)&&!E&&p){if(!P.get(p)?.selected)R()}if(W&&X&&p)l?.(p);let nl=u$(D.sourceEvent,{transform:V,snapGrid:v,snapToGrid:K,containerBounds:A});if(t=nl,y=JD(P,S,nl,p),y.size>0&&(r||I||!p&&a)){let[d,h]=xF({nodeId:p,dragItems:y,nodeLookup:P});if(r?.(D.sourceEvent,y,d,h),I?.(D.sourceEvent,d,h),!p)a?.(D.sourceEvent,h)}}let H=Y1().clickDistance(O).on("start",(D)=>{let{domNode:P,nodeDragThreshold:E,transform:S,snapGrid:V,snapToGrid:v}=u();if(A=P?.getBoundingClientRect()||null,J=!1,U=!1,w=D.sourceEvent,E===0)Y(D);t=u$(D.sourceEvent,{transform:S,snapGrid:V,snapToGrid:v,containerBounds:A}),_=Vf(D.sourceEvent,A)}).on("drag",(D)=>{let{autoPanOnNodeDrag:P,transform:E,snapGrid:S,snapToGrid:V,nodeDragThreshold:v,nodeLookup:K}=u(),X=u$(D.sourceEvent,{transform:E,snapGrid:S,snapToGrid:V,containerBounds:A});if(w=D.sourceEvent,D.sourceEvent.type==="touchmove"&&D.sourceEvent.touches.length>1||p&&!K.has(p))J=!0;if(J)return;if(!c&&P&&F)c=!0,B();if(!F){let I=Vf(D.sourceEvent,A),a=I.x-_.x,R=I.y-_.y;if(Math.sqrt(a*a+R*R)>v)Y(D)}if((t.x!==X.xSnapped||t.y!==X.ySnapped)&&y&&F)_=Vf(D.sourceEvent,A),z(X)}).on("end",(D)=>{if(!F||J)return;if(c=!1,F=!1,cancelAnimationFrame(i),y.size>0){let{nodeLookup:P,updateNodePositions:E,onNodeDragStop:S,onSelectionDragStop:V}=u();if(U)E(y,!1),U=!1;if(n||S||!p&&V){let[v,K]=xF({nodeId:p,dragItems:y,nodeLookup:P,dragging:!1});if(n?.(D.sourceEvent,y,v,K),S?.(D.sourceEvent,v,K),!p)V?.(D.sourceEvent,K)}}}).filter((D)=>{let P=D.target;return!D.button&&(!Q||!Tw(P,`.${Q}`,q))&&(!m||Tw(P,m,q))});j.call(H)}function N(){j?.on(".drag",null)}return{update:L,destroy:N}}function QD(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 mD=250;function wD(l,u,r,f){let n=[],t=1/0,i=QD(l,r,u+mD);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}=dt(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 vw(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,...dt(i,c,c.position,!0)}:c}function gw(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 qD(l,u){let r=null;if(u)r=!0;else if(l&&!u)r=!1;return r}var kw=()=>!0;function LD(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:J,onConnectStart:U,onConnect:w,onConnectEnd:L,isValidConnection:N=kw,onReconnectEnd:Q,updateConnection:m,getTransform:q,getFromHandle:W,autoPanSpeed:p,dragThreshold:O=1,handleDomNode:z}){let B=c9(l.target),Y=0,H,{x:D,y:P}=Vf(l),E=gw(t,z),S=y?.getBoundingClientRect(),V=!1;if(!S||!E)return;let v=vw(n,E,f,c,u);if(!v)return;let K=Vf(l,S),X=!1,I=null,a=!1,R=null;function nl(){if(!A||!S)return;let[pl,s]=Bw(K,S,p);j({x:pl,y:s}),Y=requestAnimationFrame(nl)}let d={...v,nodeId:n,type:E,position:v.position},h=c.get(n),_l={inProgress:!0,isValid:null,from:dt(h,d,Ol.Left,!0),fromHandle:d,fromPosition:d.position,fromNode:h,to:K,toHandle:null,toPosition:Nw[d.position],toNode:null,pointer:K};function Al(){V=!0,m(_l),U?.(l,{nodeId:n,handleId:f,handleType:E})}if(O===0)Al();function Ll(pl){if(!V){let{x:yl,y:Tl}=Vf(pl),Zl=yl-D,vl=Tl-P;if(!(Zl*Zl+vl*vl>O*O))return;Al()}if(!W()||!d){Ql(pl);return}let s=q();if(K=Vf(pl,S),H=wD(Xy(K,s,!1,[1,1]),r,c,d),!X)nl(),X=!0;let e=Iw(pl,{handle:H,connectionMode:u,fromNodeId:n,fromHandleId:f,fromType:i?"target":"source",isValidConnection:N,doc:B,lib:_,flowId:F,nodeLookup:c});R=e.handleDomNode,I=e.connection,a=qD(!!H,e.isValid);let fl=c.get(n),k=fl?dt(fl,d,Ol.Left,!0):_l.from,g={..._l,from:k,isValid:a,to:e.toHandle&&a?r$({x:e.toHandle.x,y:e.toHandle.y},s):K,toHandle:e.toHandle,toPosition:a&&e.toHandle?e.toHandle.position:Nw[d.position],toNode:e.toHandle?c.get(e.toHandle.nodeId):null,pointer:K};m(g),_l=g}function Ql(pl){if("touches"in pl&&pl.touches.length>0)return;if(V){if((H||R)&&I&&a)w?.(I);let{inProgress:s,...e}=_l,fl={...e,toPosition:_l.toHandle?_l.toPosition:null};if(L?.(pl,fl),t)Q?.(pl,fl)}J(),cancelAnimationFrame(Y),X=!1,a=!1,I=null,R=null,B.removeEventListener("mousemove",Ll),B.removeEventListener("mouseup",Ql),B.removeEventListener("touchmove",Ll),B.removeEventListener("touchend",Ql)}B.addEventListener("mousemove",Ll),B.addEventListener("mouseup",Ql),B.addEventListener("touchmove",Ll),B.addEventListener("touchend",Ql)}function Iw(l,{handle:u,connectionMode:r,fromNodeId:f,fromHandleId:n,fromType:t,doc:i,lib:y,flowId:c,isValidConnection:_=kw,nodeLookup:A}){let F=t==="target",j=u?i.querySelector(`.${y}-flow__handle[data-id="${c}-${u?.nodeId}-${u?.id}-${u?.type}"]`):null,{x:J,y:U}=Vf(l),w=i.elementFromPoint(J,U),L=w?.classList.contains(`${y}-flow__handle`)?w:j,N={handleDomNode:L,isValid:!1,connection:null,toHandle:null};if(L){let Q=gw(void 0,L),m=L.getAttribute("data-nodeid"),q=L.getAttribute("data-handleid"),W=L.classList.contains("connectable"),p=L.classList.contains("connectableend");if(!m||!Q)return N;let O={source:F?m:f,sourceHandle:F?q:n,target:F?f:m,targetHandle:F?n:q};N.connection=O;let B=W&&p&&(r===at.Strict?F&&Q==="source"||!F&&Q==="target":m!==f||q!==n);N.isValid=B&&_(O),N.toHandle=vw(m,Q,q,A,r,!0)}return N}var xA={onPointerDown:LD,isValid:Iw};function aw({domNode:l,panZoom:u,getTransform:r,getViewScale:f}){let n=fr(l);function t({translateExtent:y,width:c,height:_,zoomStep:A=1,pannable:F=!0,zoomable:j=!0,inversePan:J=!1}){let U=(m)=>{if(m.sourceEvent.type!=="wheel"||!u)return;let q=r(),W=m.sourceEvent.ctrlKey&&Py()?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],L=(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]},N=(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]))*(J?-1:1),z={x:q[0]-p[0]*O,y:q[1]-p[1]*O},B=[[0,0],[c,_]];u.setViewportConstrained({x:z.x,y:z.y,zoom:q[2]},B,y)},Q=l$().on("start",L).on("zoom",F?N:null).on("zoom.wheel",j?U:null);n.call(Q,{})}function i(){n.on("zoom",null)}return{update:t,destroy:i,pointer:pr}}var bA=(l)=>({x:l.x,y:l.y,zoom:l.k}),bF=({x:l,y:u,zoom:r})=>r0.translate(l,u).scale(r),Zy=(l,u)=>l.target.closest(`.${u}`),ow=(l,u)=>u===2&&Array.isArray(l)&&l.includes(2),GD=(l)=>((l*=2)<=1?l*l*l:(l-=2)*l*l+2)/2,vF=(l,u=0,r=GD,f=()=>{})=>{let n=typeof u==="number"&&u>0;if(!n)f();return n?l.transition().duration(u).ease(r).on("end",f):l},dw=(l)=>{let u=l.ctrlKey&&Py()?10:1;return-l.deltaY*(l.deltaMode===1?0.05:l.deltaMode?1:0.002)*u};function WD({zoomPanValues:l,noWheelClassName:u,d3Selection:r,d3Zoom:f,panOnScrollMode:n,panOnScrollSpeed:t,zoomOnPinch:i,onPanZoomStart:y,onPanZoom:c,onPanZoomEnd:_}){return(A)=>{if(Zy(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 L=pr(A),N=dw(A),Q=F*Math.pow(2,N);f.scaleTo(r,Q,L,A);return}let j=A.deltaMode===1?20:1,J=n===nt.Vertical?0:A.deltaX*j,U=n===nt.Horizontal?0:A.deltaY*j;if(!Py()&&A.shiftKey&&n!==nt.Vertical)J=A.deltaY*j,U=0;f.translateBy(r,-(J/F)*t,-(U/F)*t,{internal:!0});let w=bA(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 TD({noWheelClassName:l,preventScrolling:u,d3ZoomHandler:r}){return function(f,n){let t=f.type==="wheel",i=!u&&t&&!f.ctrlKey,y=Zy(f,l);if(f.ctrlKey&&t&&y)f.preventDefault();if(i||y)return null;f.preventDefault(),r.call(this,f,n)}}function KD({zoomPanValues:l,onDraggingChange:u,onPanZoomStart:r}){return(f)=>{if(f.sourceEvent?.internal)return;let n=bA(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 ED({zoomPanValues:l,panOnDrag:u,onPaneContextMenu:r,onTransformChange:f,onPanZoom:n}){return(t)=>{if(l.usedRightMouseButton=!!(r&&ow(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,bA(t.transform))}}function pD({zoomPanValues:l,panOnDrag:u,panOnScroll:r,onDraggingChange:f,onPanZoomEnd:n,onPaneContextMenu:t}){return(i)=>{if(i.sourceEvent?.internal)return;if(l.isZoomingOrPanning=!1,t&&ow(u,l.mouseButton??0)&&!l.usedRightMouseButton&&i.sourceEvent)t(i.sourceEvent);if(l.usedRightMouseButton=!1,f(!1),n){let y=bA(i.transform);l.prevViewport=y,clearTimeout(l.timerId),l.timerId=setTimeout(()=>{n?.(i.sourceEvent,y)},r?150:0)}}}function zD({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,J=r&&F.ctrlKey,U=F.type==="wheel";if(F.button===1&&F.type==="mousedown"&&(Zy(F,`${_}-flow__node`)||Zy(F,`${_}-flow__edge`)))return!0;if(!f&&!j&&!n&&!t&&!r)return!1;if(i)return!1;if(A&&!U)return!1;if(Zy(F,y)&&U)return!1;if(Zy(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&&!J&&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 ew({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=l$().scaleExtent([u,r]).translateExtent(f),j=fr(l).call(F);Q({x:n.x,y:n.y,zoom:Hy(n.zoom,u,r)},[[0,0],[A.width,A.height]],f);let J=j.on("wheel.zoom"),U=j.on("dblclick.zoom");F.wheelDelta(dw);function w(H,D){if(j)return new Promise((P)=>{F?.interpolate(D?.interpolate==="linear"?pn:l0).transform(vF(j,D?.duration,D?.ease,()=>P(!0)),H)});return Promise.resolve(!1)}function L({noWheelClassName:H,noPanClassName:D,onPaneContextMenu:P,userSelectionActive:E,panOnScroll:S,panOnDrag:V,panOnScrollMode:v,panOnScrollSpeed:K,preventScrolling:X,zoomOnPinch:I,zoomOnScroll:a,zoomOnDoubleClick:R,zoomActivationKeyPressed:nl,lib:d,onTransformChange:h,connectionInProgress:rl,paneClickDistance:_l,selectionOnDrag:Al}){if(E&&!_.isZoomingOrPanning)N();let Ll=S&&!nl&&!E;F.clickDistance(Al?1/0:!Sf(_l)||_l<0?0:_l);let Ql=Ll?WD({zoomPanValues:_,noWheelClassName:H,d3Selection:j,d3Zoom:F,panOnScrollMode:v,panOnScrollSpeed:K,zoomOnPinch:I,onPanZoomStart:i,onPanZoom:t,onPanZoomEnd:y}):TD({noWheelClassName:H,preventScrolling:X,d3ZoomHandler:J});if(j.on("wheel.zoom",Ql,{passive:!1}),!E){let s=KD({zoomPanValues:_,onDraggingChange:c,onPanZoomStart:i});F.on("start",s);let e=ED({zoomPanValues:_,panOnDrag:V,onPaneContextMenu:!!P,onPanZoom:t,onTransformChange:h});F.on("zoom",e);let fl=pD({zoomPanValues:_,panOnDrag:V,panOnScroll:S,onPaneContextMenu:P,onPanZoomEnd:y,onDraggingChange:c});F.on("end",fl)}let pl=zD({zoomActivationKeyPressed:nl,panOnDrag:V,zoomOnScroll:a,panOnScroll:S,zoomOnDoubleClick:R,zoomOnPinch:I,userSelectionActive:E,noPanClassName:D,noWheelClassName:H,lib:d,connectionInProgress:rl});if(F.filter(pl),R)j.on("dblclick.zoom",U);else j.on("dblclick.zoom",null)}function N(){F.on("zoom",null)}async function Q(H,D,P){let E=bF(H),S=F?.constrain()(E,D,P);if(S)await w(S);return new Promise((V)=>V(S))}async function m(H,D){let P=bF(H);return await w(P,D),new Promise((E)=>E(P))}function q(H){if(j){let D=bF(H),P=j.property("__zoom");if(P.k!==H.zoom||P.x!==H.x||P.y!==H.y)F?.transform(j,D,null,{sync:!0})}}function W(){let H=j?e1(j.node()):{x:0,y:0,k:1};return{x:H.x,y:H.y,zoom:H.k}}function p(H,D){if(j)return new Promise((P)=>{F?.interpolate(D?.interpolate==="linear"?pn:l0).scaleTo(vF(j,D?.duration,D?.ease,()=>P(!0)),H)});return Promise.resolve(!1)}function O(H,D){if(j)return new Promise((P)=>{F?.interpolate(D?.interpolate==="linear"?pn:l0).scaleBy(vF(j,D?.duration,D?.ease,()=>P(!0)),H)});return Promise.resolve(!1)}function z(H){F?.scaleExtent(H)}function B(H){F?.translateExtent(H)}function Y(H){let D=!Sf(H)||H<0?0:H;F?.clickDistance(D)}return{update:L,destroy:N,setViewport:m,setViewportConstrained:Q,getViewport:W,scaleTo:p,scaleBy:O,setScaleExtent:z,setTranslateExtent:B,syncViewport:q,setClickDistance:Y}}var et;(function(l){l.Line="line",l.Handle="handle"})(et||(et={}));function OD({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 Kw(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 kt(l,u){return Math.max(0,u-l)}function It(l,u){return Math.max(0,l-u)}function BA(l,u,r){return Math.max(0,u-l,l-r)}function Ew(l,u){return l?!u:u}function ZD(l,u,r,f,n,t,i,y){let{affectsX:c,affectsY:_}=u,{isHorizontal:A,isVertical:F}=u,j=A&&F,{xSnapped:J,ySnapped:U}=r,{minWidth:w,maxWidth:L,minHeight:N,maxHeight:Q}=f,{x:m,y:q,width:W,height:p,aspectRatio:O}=l,z=Math.floor(A?J-l.pointerX:0),B=Math.floor(F?U-l.pointerY:0),Y=W+(c?-z:z),H=p+(_?-B:B),D=-t[0]*W,P=-t[1]*p,E=BA(Y,w,L),S=BA(H,N,Q);if(i){let K=0,X=0;if(c&&z<0)K=kt(m+z+D,i[0][0]);else if(!c&&z>0)K=It(m+Y+D,i[1][0]);if(_&&B<0)X=kt(q+B+P,i[0][1]);else if(!_&&B>0)X=It(q+H+P,i[1][1]);E=Math.max(E,K),S=Math.max(S,X)}if(y){let K=0,X=0;if(c&&z>0)K=It(m+z,y[0][0]);else if(!c&&z<0)K=kt(m+Y,y[1][0]);if(_&&B>0)X=It(q+B,y[0][1]);else if(!_&&B<0)X=kt(q+H,y[1][1]);E=Math.max(E,K),S=Math.max(S,X)}if(n){if(A){let K=BA(Y/O,N,Q)*O;if(E=Math.max(E,K),i){let X=0;if(!c&&!_||c&&!_&&j)X=It(q+P+Y/O,i[1][1])*O;else X=kt(q+P+(c?z:-z)/O,i[0][1])*O;E=Math.max(E,X)}if(y){let X=0;if(!c&&!_||c&&!_&&j)X=kt(q+Y/O,y[1][1])*O;else X=It(q+(c?z:-z)/O,y[0][1])*O;E=Math.max(E,X)}}if(F){let K=BA(H*O,w,L)/O;if(S=Math.max(S,K),i){let X=0;if(!c&&!_||_&&!c&&j)X=It(m+H*O+D,i[1][0])/O;else X=kt(m+(_?B:-B)*O+D,i[0][0])/O;S=Math.max(S,X)}if(y){let X=0;if(!c&&!_||_&&!c&&j)X=kt(m+H*O,y[1][0])/O;else X=It(m+(_?B:-B)*O,y[0][0])/O;S=Math.max(S,X)}}}if(B=B+(B<0?S:-S),z=z+(z<0?E:-E),n)if(j)if(Y>H*O)B=(Ew(c,_)?-z:z)/O;else z=(Ew(c,_)?-B:B)*O;else if(A)B=z/O,_=c;else z=B*O,c=_;let V=c?m+z:m,v=_?q+B:q;return{width:W+(c?-z:z),height:p+(_?-B:B),x:t[0]*z*(!c?1:-1)+V,y:t[1]*B*(!_?1:-1)+v}}var lq={width:0,height:0,x:0,y:0},HD={...lq,pointerX:0,pointerY:0,aspectRatio:1};function BD(l){return[[0,0],[l.measured.width,l.measured.height]]}function DD(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 uq({domNode:l,nodeId:u,getStoreItems:r,onChange:f,onEnd:n}){let t=fr(l),i={controlDirection:Kw("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:J,onResize:U,onResizeEnd:w,shouldResize:L}){let N={...lq},Q={...HD};i={boundaries:A,resizeDirection:j,keepAspectRatio:F,controlDirection:Kw(_)};let m=void 0,q=null,W=[],p=void 0,O=void 0,z=void 0,B=!1,Y=Y1().on("start",(H)=>{let{nodeLookup:D,transform:P,snapGrid:E,snapToGrid:S,nodeOrigin:V,paneDomNode:v}=r();if(m=D.get(u),!m)return;q=v?.getBoundingClientRect()??null;let{xSnapped:K,ySnapped:X}=u$(H.sourceEvent,{transform:P,snapGrid:E,snapToGrid:S,containerBounds:q});if(N={width:m.measured.width??0,height:m.measured.height??0,x:m.position.x??0,y:m.position.y??0},Q={...N,pointerX:K,pointerY:X,aspectRatio:N.width/N.height},p=void 0,m.parentId&&(m.extent==="parent"||m.expandParent))p=D.get(m.parentId),O=p&&m.extent==="parent"?BD(p):void 0;W=[],z=void 0;for(let[I,a]of D)if(a.parentId===u){if(W.push({id:I,position:{...a.position},extent:a.extent}),a.extent==="parent"||a.expandParent){let R=DD(a,m,a.origin??V);if(z)z=[[Math.min(R[0][0],z[0][0]),Math.min(R[0][1],z[0][1])],[Math.max(R[1][0],z[1][0]),Math.max(R[1][1],z[1][1])]];else z=R}}J?.(H,{...N})}).on("drag",(H)=>{let{transform:D,snapGrid:P,snapToGrid:E,nodeOrigin:S}=r(),V=u$(H.sourceEvent,{transform:D,snapGrid:P,snapToGrid:E,containerBounds:q}),v=[];if(!m)return;let{x:K,y:X,width:I,height:a}=N,R={},nl=m.origin??S,{width:d,height:h,x:rl,y:_l}=ZD(Q,i.controlDirection,V,i.boundaries,i.keepAspectRatio,nl,O,z),Al=d!==I,Ll=h!==a,Ql=rl!==K&&Al,pl=_l!==X&⋘if(!Ql&&!pl&&!Al&&!Ll)return;if(Ql||pl||nl[0]===1||nl[1]===1){if(R.x=Ql?rl:N.x,R.y=pl?_l:N.y,N.x=R.x,N.y=R.y,W.length>0){let k=rl-K,g=_l-X;for(let yl of W)yl.position={x:yl.position.x-k+nl[0]*(d-I),y:yl.position.y-g+nl[1]*(h-a)},v.push(yl)}}if(Al||Ll)R.width=Al&&(!i.resizeDirection||i.resizeDirection==="horizontal")?d:N.width,R.height=Ll&&(!i.resizeDirection||i.resizeDirection==="vertical")?h:N.height,N.width=R.width,N.height=R.height;if(p&&m.expandParent){let k=nl[0]*(R.width??0);if(R.x&&R.x{if(!B)return;w?.(H,{...N}),n?.({...N}),B=!1});t.call(Y)}function c(){t.on(".drag",null)}return{update:y,destroy:c}}var jq=Ml(Ju(),1),Nq=Ml($q(),1);var _q=(l)=>{let u,r=new Set,f=(A,F)=>{let j=typeof A==="function"?A(u):A;if(!Object.is(j,u)){let J=u;u=(F!=null?F:typeof j!=="object"||j===null)?j:Object.assign({},u,j),r.forEach((U)=>U(u,J))}},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},Aq=(l)=>l?_q(l):_q;var{useDebugValue:oD}=jq.default,{useSyncExternalStoreWithSelector:dD}=Nq.default,eD=(l)=>l;function w9(l,u=eD,r){let f=dD(l.subscribe,l.getState,l.getServerState||l.getInitialState,u,r);return oD(f),f}var Fq=(l,u)=>{let r=Aq(l),f=(n,t=u)=>w9(r,n,t);return Object.assign(f,r),f},Jq=(l,u)=>l?Fq(l,u):Fq;function pu(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 lS=Ml(j2(),1),aA=$l.createContext(null),uS=aA.Provider,Cq=wf.error001();function yu(l,u){let r=$l.useContext(aA);if(r===null)throw Error(Cq);return w9(r,l,u)}function Zu(){let l=$l.useContext(aA);if(l===null)throw Error(Cq);return $l.useMemo(()=>({getState:l.getState,setState:l.setState,subscribe:l.subscribe}),[l])}var Uq={display:"none"},rS={position:"absolute",width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0px, 0px, 0px, 0px)",clipPath:"inset(100%)"},hq="react-flow__node-desc",sq="react-flow__edge-desc",fS="react-flow__aria-live",nS=(l)=>l.ariaLiveMessage,tS=(l)=>l.ariaLabelConfig;function iS({rfId:l}){let u=yu(nS);return il.jsx("div",{id:`${fS}-${l}`,"aria-live":"assertive","aria-atomic":"true",style:rS,children:u})}function yS({rfId:l,disableKeyboardA11y:u}){let r=yu(tS);return il.jsxs(il.Fragment,{children:[il.jsx("div",{id:`${hq}-${l}`,style:Uq,children:u?r["node.a11yDescription.default"]:r["node.a11yDescription.keyboardDisabled"]}),il.jsx("div",{id:`${sq}-${l}`,style:Uq,children:r["edge.a11yDescription.default"]}),!u&&il.jsx(iS,{rfId:l})]})}var oA=$l.forwardRef(({position:l="top-left",children:u,className:r,style:f,...n},t)=>{let i=`${l}`.split("-");return il.jsx("div",{className:xu(["react-flow__panel",r,...i]),style:f,ref:t,...n,children:u})});oA.displayName="Panel";function cS({proOptions:l,position:u="bottom-right"}){if(l?.hideAttribution)return null;return il.jsx(oA,{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 $S=(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}},gA=(l)=>l.id;function _S(l,u){return pu(l.selectedNodes.map(gA),u.selectedNodes.map(gA))&&pu(l.selectedEdges.map(gA),u.selectedEdges.map(gA))}function AS({onSelectionChange:l}){let u=Zu(),{selectedNodes:r,selectedEdges:f}=yu($S,_S);return $l.useEffect(()=>{let n={nodes:r,edges:f};l?.(n),u.getState().onSelectionChangeHandlers.forEach((t)=>t(n))},[r,f,l]),null}var FS=(l)=>!!l.onSelectionChangeHandlers;function jS({onSelectionChange:l}){let u=yu(FS);if(l||u)return il.jsx(AS,{onSelectionChange:l});return null}var G9=typeof window<"u"?$l.useLayoutEffect:$l.useEffect,Mq=[0,0],NS={x:0,y:0,zoom:1},JS=["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"],Qq=[...JS,"rfId"],US=(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}),mq={translateExtent:Dy,nodeOrigin:Mq,minZoom:0.5,maxZoom:2,elementsSelectable:!0,noPanClassName:"nopan",rfId:"1"};function QS(l){let{setNodes:u,setEdges:r,setMinZoom:f,setMaxZoom:n,setTranslateExtent:t,setNodeExtent:i,reset:y,setDefaultNodesAndEdges:c}=yu(US,pu),_=Zu();G9(()=>{return c(l.defaultNodes,l.defaultEdges),()=>{A.current=mq,y()}},[]);let A=$l.useRef(mq);return G9(()=>{for(let F of Qq){let j=l[F],J=A.current[F];if(j===J)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:Sw(j)});else if(F==="fitView")_.setState({fitViewQueued:j});else if(F==="fitViewOptions")_.setState({fitViewOptions:j});else _.setState({[F]:j})}A.current=l},Qq.map((F)=>l[F])),null}function wq(){if(typeof window>"u"||!window.matchMedia)return null;return window.matchMedia("(prefers-color-scheme: dark)")}function mS(l){let[u,r]=$l.useState(l==="system"?null:l);return $l.useEffect(()=>{if(l!=="system"){r(l);return}let f=wq(),n=()=>r(f?.matches?"dark":"light");return n(),f?.addEventListener("change",n),()=>{f?.removeEventListener("change",n)}},[l]),u!==null?u:wq()?.matches?"dark":"light"}var qq=typeof document<"u"?document:null;function i$(l=null,u={target:qq,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((j,F)=>j.concat(...F),[]);return[$,A]}return[[],[]]},[l]);return yl.useEffect(()=>{let c=u?.target??sq,$=u?.actInsideInputWithModifier??!0;if(l!==null){let A=(U)=>{if(n.current=U.ctrlKey||U.metaKey||U.shiftKey||U.altKey,(!n.current||n.current&&!$)&&Y9(U))return!1;let W=gq(U.code,y);if(i.current.add(U[W]),kq(t,i.current,!1)){let L=U.composedPath?.()?.[0]||U.target,J=L?.nodeName==="BUTTON"||L?.nodeName==="A";if(u.preventDefault!==!1&&(n.current||!J))U.preventDefault();f(!0)}},j=(U)=>{let N=gq(U.code,y);if(kq(t,i.current,!0))f(!1),i.current.clear();else i.current.delete(U[N]);if(U.key==="Meta")i.current.clear();n.current=!1},F=()=>{i.current.clear(),f(!1)};return c?.addEventListener("keydown",A),c?.addEventListener("keyup",j),window.addEventListener("blur",F),window.addEventListener("contextmenu",F),()=>{c?.removeEventListener("keydown",A),c?.removeEventListener("keyup",j),window.removeEventListener("blur",F),window.removeEventListener("contextmenu",F)}}},[l,f]),r}function kq(l,u,r){return l.filter((f)=>r||f.length===u.size).some((f)=>f.every((n)=>u.has(n)))}function gq(l,u){return u.includes(l)?"code":"key"}var PD=()=>{let l=Zu();return yl.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,i],panZoom:t}=l.getState();if(!t)return Promise.resolve(!1);return await t.setViewport({x:u.x??f,y:u.y??n,zoom:u.zoom??i},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:i,maxZoom:t,panZoom:y}=l.getState(),c=gc(u,f,n,i,t,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:i,domNode:t}=l.getState();if(!t)return u;let{x:y,y:c}=t.getBoundingClientRect(),$={x:u.x-y,y:u.y-c},A=r.snapGrid??n,j=r.snapToGrid??i;return Oy($,f,j,A)},flowToScreenPosition:(u)=>{let{transform:r,domNode:f}=l.getState();if(!f)return u;let{x:n,y:i}=f.getBoundingClientRect(),t=sc(u,r);return{x:t.x+n,y:t.y+i}}}},[])};function UW(l,u){let r=[],f=new Map,n=[];for(let i of l)if(i.type==="add"){n.push(i);continue}else if(i.type==="remove"||i.type==="replace")f.set(i.id,[i]);else{let t=f.get(i.id);if(t)t.push(i);else f.set(i.id,[i])}for(let i of u){let t=f.get(i.id);if(!t){r.push(i);continue}if(t[0].type==="remove")continue;if(t[0].type==="replace"){r.push({...t[0].item});continue}let y={...i};for(let c of t)CD(c,y);r.push(y)}if(n.length)n.forEach((i)=>{if(i.index!==void 0)r.splice(i.index,0,{...i.item});else r.push({...i.item})});return r}function CD(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 MD(l,u){return UW(l,u)}function hD(l,u){return UW(l,u)}function lt(l,u){return{id:l,type:"select",selected:u}}function Hy(l,u=new Set,r=!1){let f=[];for(let[n,i]of l){let t=u.has(n);if(!(i.selected===void 0&&!t)&&i.selected!==t){if(r)i.selected=t;f.push(lt(i.id,t))}}return f}function Iq({items:l=[],lookup:u}){let r=[],f=new Map(l.map((n)=>[n.id,n]));for(let[n,i]of l.entries()){let t=u.get(i.id),y=t?.internals?.userNode??t;if(y!==void 0&&y!==i)r.push({id:i.id,item:i,type:"replace"});if(y===void 0)r.push({item:i,type:"add",index:n})}for(let[n]of u)if(f.get(n)===void 0)r.push({id:n,type:"remove"});return r}function aq(l){return{id:l.id,type:"remove"}}var oq=(l)=>ew(l),RD=(l)=>z9(l);function NW(l){return yl.forwardRef(l)}function dq(l){let[u,r]=yl.useState(BigInt(0)),[f]=yl.useState(()=>xD(()=>r((n)=>n+BigInt(1))));return a9(()=>{let n=f.get();if(n.length)l(n),f.reset()},[u]),f}function xD(l){let u=[];return{get:()=>u,reset:()=>{u=[]},push:(r)=>{u.push(r),l()}}}var QW=yl.createContext(null);function bD({children:l}){let u=Zu(),r=yl.useCallback((y)=>{let{nodes:c=[],setNodes:$,hasDefaultNodes:A,onNodesChange:j,nodeLookup:F,fitViewQueued:U,onNodesChangeMiddlewareMap:N}=u.getState(),W=c;for(let J of y)W=typeof J==="function"?J(W):J;let L=Iq({items:W,lookup:F});for(let J of N.values())L=J(L);if(A)$(W);if(L.length>0)j?.(L);else if(U)window.requestAnimationFrame(()=>{let{fitViewQueued:J,nodes:w,setNodes:Q}=u.getState();if(J)Q(w)})},[]),f=dq(r),n=yl.useCallback((y)=>{let{edges:c=[],setEdges:$,hasDefaultEdges:A,onEdgesChange:j,edgeLookup:F}=u.getState(),U=c;for(let N of y)U=typeof N==="function"?N(U):N;if(A)$(U);else if(j)j(Iq({items:U,lookup:F}))},[]),i=dq(n),t=yl.useMemo(()=>({nodeQueue:f,edgeQueue:i}),[]);return nl.jsx(QW.Provider,{value:t,children:l})}function vD(){let l=yl.useContext(QW);if(!l)throw Error("useBatchContext must be used within a BatchProvider");return l}var sD=(l)=>!!l.panZoom;function d9(){let l=PD(),u=Zu(),r=vD(),f=yu(sD),n=yl.useMemo(()=>{let i=(j)=>u.getState().nodeLookup.get(j),t=(j)=>{r.nodeQueue.push(j)},y=(j)=>{r.edgeQueue.push(j)},c=(j)=>{let{nodeLookup:F,nodeOrigin:U}=u.getState(),N=oq(j)?j:F.get(j.id),W=N.parentId?V9(N.position,N.measured,N.parentId,F,U):N.position,L={...N,position:W,width:N.measured?.width??N.width,height:N.measured?.height??N.height};return e0(L)},$=(j,F,U={replace:!1})=>{t((N)=>N.map((W)=>{if(W.id===j){let L=typeof F==="function"?F(W):F;return U.replace&&oq(L)?L:{...W,...L}}return W}))},A=(j,F,U={replace:!1})=>{y((N)=>N.map((W)=>{if(W.id===j){let L=typeof F==="function"?F(W):F;return U.replace&&RD(L)?L:{...W,...L}}return W}))};return{getNodes:()=>u.getState().nodes.map((j)=>({...j})),getNode:(j)=>i(j)?.internals.userNode,getInternalNode:i,getEdges:()=>{let{edges:j=[]}=u.getState();return j.map((F)=>({...F}))},getEdge:(j)=>u.getState().edgeLookup.get(j),setNodes:t,setEdges:y,addNodes:(j)=>{let F=Array.isArray(j)?j:[j];r.nodeQueue.push((U)=>[...U,...F])},addEdges:(j)=>{let F=Array.isArray(j)?j:[j];r.edgeQueue.push((U)=>[...U,...F])},toObject:()=>{let{nodes:j=[],edges:F=[],transform:U}=u.getState(),[N,W,L]=U;return{nodes:j.map((J)=>({...J})),edges:F.map((J)=>({...J})),viewport:{x:N,y:W,zoom:L}}},deleteElements:async({nodes:j=[],edges:F=[]})=>{let{nodes:U,edges:N,onNodesDelete:W,onEdgesDelete:L,triggerNodeChanges:J,triggerEdgeChanges:w,onDelete:Q,onBeforeDelete:q}=u.getState(),{nodes:T,edges:O}=await rq({nodesToRemove:j,edgesToRemove:F,nodes:U,edges:N,onBeforeDelete:q}),Z=O.length>0,E=T.length>0;if(Z){let D=O.map(aq);L?.(O),w(D)}if(E){let D=T.map(aq);W?.(T),J(D)}if(E||Z)Q?.({nodes:T,edges:O});return{deletedNodes:T,deletedEdges:O}},getIntersectingNodes:(j,F=!0,U)=>{let N=H9(j),W=N?j:c(j),L=U!==void 0;if(!W)return[];return(U||u.getState().nodes).filter((J)=>{let w=u.getState().nodeLookup.get(J.id);if(w&&!N&&(J.id===j.id||!w.internals.positionAbsolute))return!1;let Q=e0(L?J:w),q=zy(Q,W);return F&&q>0||q>=Q.width*Q.height||q>=W.width*W.height})},isNodeIntersecting:(j,F,U=!0)=>{let W=H9(j)?j:c(j);if(!W)return!1;let L=zy(W,F);return U&&L>0||L>=F.width*F.height||L>=W.width*W.height},updateNode:$,updateNodeData:(j,F,U={replace:!1})=>{$(j,(N)=>{let W=typeof F==="function"?F(N):F;return U.replace?{...N,data:W}:{...N,data:{...N.data,...W}}},U)},updateEdge:A,updateEdgeData:(j,F,U={replace:!1})=>{A(j,(N)=>{let W=typeof F==="function"?F(N):F;return U.replace?{...N,data:W}:{...N,data:{...N.data,...W}}},U)},getNodesBounds:(j)=>{let{nodeLookup:F,nodeOrigin:U}=u.getState();return O9(j,{nodeLookup:F,nodeOrigin:U})},getHandleConnections:({type:j,id:F,nodeId:U})=>Array.from(u.getState().connectionLookup.get(`${U}-${j}${F?`-${F}`:""}`)?.values()??[]),getNodeConnections:({type:j,handleId:F,nodeId:U})=>Array.from(u.getState().connectionLookup.get(`${U}${j?F?`-${j}-${F}`:`-${j}`:""}`)?.values()??[]),fitView:async(j)=>{let F=u.getState().fitViewResolver??iq();return u.setState({fitViewQueued:!0,fitViewOptions:j,fitViewResolver:F}),r.nodeQueue.push((U)=>[...U]),F.promise}}},[]);return yl.useMemo(()=>{return{...n,...l,viewportInitialized:f}},[f])}var eq=(l)=>l.selected,kD=typeof window<"u"?window:void 0;function gD({deleteKeyCode:l,multiSelectionKeyCode:u}){let r=Zu(),{deleteElements:f}=d9(),n=ac(l,{actInsideInputWithModifier:!1}),i=ac(u,{target:kD});yl.useEffect(()=>{if(n){let{edges:t,nodes:y}=r.getState();f({nodes:y.filter(eq),edges:t.filter(eq)}),r.setState({nodesSelectionActive:!1})}},[n]),yl.useEffect(()=>{r.setState({multiSelectionActive:i})},[i])}function ID(l){let u=Zu();yl.useEffect(()=>{let r=()=>{if(!l.current||!(l.current.checkVisibility?.()??!0))return!1;let f=WA(l.current);if(f.height===0||f.width===0)u.getState().onError?.("004",Qf.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 SA={position:"absolute",width:"100%",height:"100%",top:0,left:0},aD=(l)=>({userSelectionActive:l.userSelectionActive,lib:l.lib,connectionInProgress:l.connection.inProgress});function oD({onPaneContextMenu:l,zoomOnScroll:u=!0,zoomOnPinch:r=!0,panOnScroll:f=!1,panOnScrollSpeed:n=0.5,panOnScrollMode:i=ui.Free,zoomOnDoubleClick:t=!0,panOnDrag:y=!0,defaultViewport:c,translateExtent:$,minZoom:A,maxZoom:j,zoomActivationKeyCode:F,preventScrolling:U=!0,children:N,noWheelClassName:W,noPanClassName:L,onViewportChange:J,isControlledViewport:w,paneClickDistance:Q,selectionOnDrag:q}){let T=Zu(),O=yl.useRef(null),{userSelectionActive:Z,lib:E,connectionInProgress:D}=yu(aD,Eu),Y=ac(F),p=yl.useRef();ID(O);let V=yl.useCallback((B)=>{if(J?.({x:B[0],y:B[1],zoom:B[2]}),!w)T.setState({transform:B})},[J,w]);return yl.useEffect(()=>{if(O.current){p.current=Kq({domNode:O.current,minZoom:A,maxZoom:j,translateExtent:$,viewport:c,onDraggingChange:(S)=>T.setState((b)=>b.paneDragging===S?b:{paneDragging:S}),onPanZoomStart:(S,b)=>{let{onViewportChangeStart:z,onMoveStart:P}=T.getState();P?.(S,b),z?.(b)},onPanZoom:(S,b)=>{let{onViewportChange:z,onMove:P}=T.getState();P?.(S,b),z?.(b)},onPanZoomEnd:(S,b)=>{let{onViewportChangeEnd:z,onMoveEnd:P}=T.getState();P?.(S,b),z?.(b)}});let{x:B,y:m,zoom:X}=p.current.getViewport();return T.setState({panZoom:p.current,transform:[B,m,X],domNode:O.current.closest(".react-flow")}),()=>{p.current?.destroy()}}},[]),yl.useEffect(()=>{p.current?.update({onPaneContextMenu:l,zoomOnScroll:u,zoomOnPinch:r,panOnScroll:f,panOnScrollSpeed:n,panOnScrollMode:i,zoomOnDoubleClick:t,panOnDrag:y,zoomActivationKeyPressed:Y,preventScrolling:U,noPanClassName:L,userSelectionActive:Z,noWheelClassName:W,lib:E,onTransformChange:V,connectionInProgress:D,selectionOnDrag:q,paneClickDistance:Q})},[l,u,r,f,n,i,t,y,Y,U,L,Z,W,E,V,D,q,Q]),nl.jsx("div",{className:"react-flow__renderer",ref:O,style:SA,children:N})}var dD=(l)=>({userSelectionActive:l.userSelectionActive,userSelectionRect:l.userSelectionRect});function eD(){let{userSelectionActive:l,userSelectionRect:u}=yu(dD,Eu);if(!(l&&u))return null;return nl.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 g9=(l,u)=>{return(r)=>{if(r.target!==u.current)return;l?.(r)}},lV=(l)=>({userSelectionActive:l.userSelectionActive,elementsSelectable:l.elementsSelectable,connectionInProgress:l.connection.inProgress,dragging:l.paneDragging});function uV({isSelecting:l,selectionKeyPressed:u,selectionMode:r=o0.Full,panOnDrag:f,paneClickDistance:n,selectionOnDrag:i,onSelectionStart:t,onSelectionEnd:y,onPaneClick:c,onPaneContextMenu:$,onPaneScroll:A,onPaneMouseEnter:j,onPaneMouseMove:F,onPaneMouseLeave:U,children:N}){let W=Zu(),{userSelectionActive:L,elementsSelectable:J,dragging:w,connectionInProgress:Q}=yu(lV,Eu),q=J&&(l||L),T=yl.useRef(null),O=yl.useRef(),Z=yl.useRef(new Set),E=yl.useRef(new Set),D=yl.useRef(!1),Y=(z)=>{if(D.current||Q){D.current=!1;return}c?.(z),W.getState().resetSelectedElements(),W.setState({nodesSelectionActive:!1})},p=(z)=>{if(Array.isArray(f)&&f?.includes(2)){z.preventDefault();return}$?.(z)},V=A?(z)=>A(z):void 0,B=(z)=>{if(D.current)z.stopPropagation(),D.current=!1},m=(z)=>{let{domNode:P}=W.getState();if(O.current=P?.getBoundingClientRect(),!O.current)return;let s=z.target===T.current;if(!s&&!!z.target.closest(".nokey")||!l||!(i&&s||u)||z.button!==0||!z.isPrimary)return;z.target?.setPointerCapture?.(z.pointerId),D.current=!1;let{x:tl,y:I}=Bf(z.nativeEvent,O.current);if(W.setState({userSelectionRect:{width:0,height:0,startX:tl,startY:I,x:tl,y:I}}),!s)z.stopPropagation(),z.preventDefault()},X=(z)=>{let{userSelectionRect:P,transform:s,nodeLookup:k,edgeLookup:v,connectionLookup:tl,triggerNodeChanges:I,triggerEdgeChanges:M,defaultEdgeOptions:rl,resetSelectedElements:cl}=W.getState();if(!O.current||!P)return;let{x:$l,y:Tl}=Bf(z.nativeEvent,O.current),{startX:Ql,startY:Ol}=P;if(!D.current){let o=u?0:n;if(Math.hypot($l-Ql,Tl-Ol)<=o)return;cl(),t?.(z)}D.current=!0;let h={startX:Ql,startY:Ol,x:$lo.id)),E.current=new Set;let zl=rl?.selectable??!0;for(let o of Z.current){let ql=tl.get(o);if(!ql)continue;for(let{edgeId:pl}of ql.values()){let Bl=v.get(pl);if(Bl&&(Bl.selectable??zl))E.current.add(pl)}}if(!S9(a,Z.current)){let o=Hy(k,Z.current,!0);I(o)}if(!S9(ul,E.current)){let o=Hy(v,E.current);M(o)}W.setState({userSelectionRect:h,userSelectionActive:!0,nodesSelectionActive:!1})},S=(z)=>{if(z.button!==0)return;if(z.target?.releasePointerCapture?.(z.pointerId),!L&&z.target===T.current&&W.getState().userSelectionRect)Y?.(z);if(W.setState({userSelectionActive:!1,userSelectionRect:null}),D.current)y?.(z),W.setState({nodesSelectionActive:Z.current.size>0})},b=f===!0||Array.isArray(f)&&f.includes(0);return nl.jsxs("div",{className:bu(["react-flow__pane",{draggable:b,dragging:w,selection:l}]),onClick:q?void 0:g9(Y,T),onContextMenu:g9(p,T),onWheel:g9(V,T),onPointerEnter:q?void 0:j,onPointerMove:q?X:F,onPointerUp:q?S:void 0,onPointerDownCapture:q?m:void 0,onClickCapture:q?B:void 0,onPointerLeave:U,ref:T,style:SA,children:[N,nl.jsx(eD,{})]})}function o9({id:l,store:u,unselect:r=!1,nodeRef:f}){let{addSelectedNodes:n,unselectNodesAndEdges:i,multiSelectionActive:t,nodeLookup:y,onError:c}=u.getState(),$=y.get(l);if(!$){c?.("012",Qf.error012(l));return}if(u.setState({nodesSelectionActive:!1}),!$.selected)n([l]);else if(r||$.selected&&t)i({nodes:[$],edges:[]}),requestAnimationFrame(()=>f?.current?.blur())}function wW({nodeRef:l,disabled:u=!1,noDragClassName:r,handleSelector:f,nodeId:n,isSelectable:i,nodeClickDistance:t}){let y=Zu(),[c,$]=yl.useState(!1),A=yl.useRef();return yl.useEffect(()=>{A.current=Qq({getStoreItems:()=>y.getState(),onNodeMouseDown:(j)=>{o9({id:j,store:y,nodeRef:l})},onDragStart:()=>{$(!0)},onDragStop:()=>{$(!1)}})},[]),yl.useEffect(()=>{if(u||!l.current||!A.current)return;return A.current.update({noDragClassName:r,handleSelector:f,domNode:l.current,isSelectable:i,nodeId:n,nodeClickDistance:t}),()=>{A.current?.destroy()}},[r,f,u,i,l,n,t]),c}var rV=(l)=>(u)=>u.selected&&(u.draggable||l&&typeof u.draggable>"u");function qW(){let l=Zu();return yl.useCallback((r)=>{let{nodeExtent:f,snapToGrid:n,snapGrid:i,nodesDraggable:t,onError:y,updateNodePositions:c,nodeLookup:$,nodeOrigin:A}=l.getState(),j=new Map,F=rV(t),U=n?i[0]:5,N=n?i[1]:5,W=r.direction.x*U*r.factor,L=r.direction.y*N*r.factor;for(let[,J]of $){if(!F(J))continue;let w={x:J.internals.positionAbsolute.x+W,y:J.internals.positionAbsolute.y+L};if(n)w=Ey(w,i);let{position:Q,positionAbsolute:q}=Z9({nodeId:J.id,nextPosition:w,nodeLookup:$,nodeExtent:f,nodeOrigin:A,onError:y});J.position=Q,J.internals.positionAbsolute=q,j.set(J.id,J)}c(j)},[])}var e9=yl.createContext(null),fV=e9.Provider;e9.Consumer;var WW=()=>{return yl.useContext(e9)},nV=(l)=>({connectOnClick:l.connectOnClick,noPanClassName:l.noPanClassName,rfId:l.rfId}),iV=(l,u,r)=>(f)=>{let{connectionClickStartHandle:n,connectionMode:i,connection:t}=f,{fromHandle:y,toHandle:c,isValid:$}=t,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:i===si.Strict?y?.type!==r:l!==y?.nodeId||u!==y?.id,connectionInProcess:!!y,clickConnectionInProcess:!!n,valid:A&&$}};function tV({type:l="source",position:u=Kl.Top,isValidConnection:r,isConnectable:f=!0,isConnectableStart:n=!0,isConnectableEnd:i=!0,id:t,onConnect:y,children:c,className:$,onMouseDown:A,onTouchStart:j,...F},U){let N=t||null,W=l==="target",L=Zu(),J=WW(),{connectOnClick:w,noPanClassName:Q,rfId:q}=yu(nV,Eu),{connectingFrom:T,connectingTo:O,clickConnecting:Z,isPossibleEndHandle:E,connectionInProcess:D,clickConnectionInProcess:Y,valid:p}=yu(iV(J,N,l),Eu);if(!J)L.getState().onError?.("010",Qf.error010());let V=(X)=>{let{defaultEdgeOptions:S,onConnect:b,hasDefaultEdges:z}=L.getState(),P={...S,...X};if(z){let{edges:s,setEdges:k}=L.getState();k(M9(P,s))}b?.(P),y?.(P)},B=(X)=>{if(!J)return;let S=P9(X.nativeEvent);if(n&&(S&&X.button===0||!S)){let b=L.getState();EA.onPointerDown(X.nativeEvent,{handleDomNode:X.currentTarget,autoPanOnConnect:b.autoPanOnConnect,connectionMode:b.connectionMode,connectionRadius:b.connectionRadius,domNode:b.domNode,nodeLookup:b.nodeLookup,lib:b.lib,isTarget:W,handleId:N,nodeId:J,flowId:b.rfId,panBy:b.panBy,cancelConnection:b.cancelConnection,onConnectStart:b.onConnectStart,onConnectEnd:(...z)=>L.getState().onConnectEnd?.(...z),updateConnection:b.updateConnection,onConnect:V,isValidConnection:r||((...z)=>L.getState().isValidConnection?.(...z)??!0),getTransform:()=>L.getState().transform,getFromHandle:()=>L.getState().connection.fromHandle,autoPanSpeed:b.autoPanSpeed,dragThreshold:b.connectionDragThreshold})}if(S)A?.(X);else j?.(X)},m=(X)=>{let{onClickConnectStart:S,onClickConnectEnd:b,connectionClickStartHandle:z,connectionMode:P,isValidConnection:s,lib:k,rfId:v,nodeLookup:tl,connection:I}=L.getState();if(!J||!z&&!n)return;if(!z){S?.(X.nativeEvent,{nodeId:J,handleId:N,handleType:l}),L.setState({connectionClickStartHandle:{nodeId:J,type:l,id:N}});return}let M=X9(X.target),rl=r||s,{connection:cl,isValid:$l}=EA.isValid(X.nativeEvent,{handle:{nodeId:J,id:N,type:l},connectionMode:P,fromNodeId:z.nodeId,fromHandleId:z.id||null,fromType:z.type,isValidConnection:rl,flowId:v,doc:M,lib:k,nodeLookup:tl});if($l&&cl)V(cl);let Tl=structuredClone(I);delete Tl.inProgress,Tl.toPosition=Tl.toHandle?Tl.toHandle.position:null,b?.(X,Tl),L.setState({connectionClickStartHandle:null})};return nl.jsx("div",{"data-handleid":N,"data-nodeid":J,"data-handlepos":u,"data-id":`${q}-${J}-${N}-${l}`,className:bu(["react-flow__handle",`react-flow__handle-${u}`,"nodrag",Q,$,{source:!W,target:W,connectable:f,connectablestart:n,connectableend:i,clickconnecting:Z,connectingfrom:T,connectingto:O,valid:p,connectionindicator:f&&(!D||E)&&(D||Y?i:n)}]),onMouseDown:B,onTouchStart:B,onClick:w?m:void 0,ref:U,...F,children:c})}var ut=yl.memo(NW(tV));function yV({data:l,isConnectable:u,sourcePosition:r=Kl.Bottom}){return nl.jsxs(nl.Fragment,{children:[l?.label,nl.jsx(ut,{type:"source",position:r,isConnectable:u})]})}function cV({data:l,isConnectable:u,targetPosition:r=Kl.Top,sourcePosition:f=Kl.Bottom}){return nl.jsxs(nl.Fragment,{children:[nl.jsx(ut,{type:"target",position:r,isConnectable:u}),l?.label,nl.jsx(ut,{type:"source",position:f,isConnectable:u})]})}function _V(){return null}function $V({data:l,isConnectable:u,targetPosition:r=Kl.Top}){return nl.jsxs(nl.Fragment,{children:[nl.jsx(ut,{type:"target",position:r,isConnectable:u}),l?.label]})}var BA={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}},lW={input:yV,default:cV,output:$V,group:_V};function AV(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 jV=(l)=>{let{width:u,height:r,x:f,y:n}=Ky(l.nodeLookup,{filter:(i)=>!!i.selected});return{width:Hf(u)?u:null,height:Hf(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 FV({onSelectionContextMenu:l,noPanClassName:u,disableKeyboardA11y:r}){let f=Zu(),{width:n,height:i,transformString:t,userSelectionActive:y}=yu(jV,Eu),c=qW(),$=yl.useRef(null);yl.useEffect(()=>{if(!r)$.current?.focus({preventScroll:!0})},[r]);let A=!y&&n!==null&&i!==null;if(wW({nodeRef:$,disabled:!A}),!A)return null;let j=l?(U)=>{let N=f.getState().nodes.filter((W)=>W.selected);l(U,N)}:void 0,F=(U)=>{if(Object.prototype.hasOwnProperty.call(BA,U.key))U.preventDefault(),c({direction:BA[U.key],factor:U.shiftKey?4:1})};return nl.jsx("div",{className:bu(["react-flow__nodesselection","react-flow__container",u]),style:{transform:t},children:nl.jsx("div",{ref:$,className:"react-flow__nodesselection-rect",onContextMenu:j,tabIndex:r?void 0:-1,onKeyDown:r?void 0:F,style:{width:n,height:i}})})}var uW=typeof window<"u"?window:void 0,JV=(l)=>{return{nodesSelectionActive:l.nodesSelectionActive,userSelectionActive:l.userSelectionActive}};function LW({children:l,onPaneClick:u,onPaneMouseEnter:r,onPaneMouseMove:f,onPaneMouseLeave:n,onPaneContextMenu:i,onPaneScroll:t,paneClickDistance:y,deleteKeyCode:c,selectionKeyCode:$,selectionOnDrag:A,selectionMode:j,onSelectionStart:F,onSelectionEnd:U,multiSelectionKeyCode:N,panActivationKeyCode:W,zoomActivationKeyCode:L,elementsSelectable:J,zoomOnScroll:w,zoomOnPinch:Q,panOnScroll:q,panOnScrollSpeed:T,panOnScrollMode:O,zoomOnDoubleClick:Z,panOnDrag:E,defaultViewport:D,translateExtent:Y,minZoom:p,maxZoom:V,preventScrolling:B,onSelectionContextMenu:m,noWheelClassName:X,noPanClassName:S,disableKeyboardA11y:b,onViewportChange:z,isControlledViewport:P}){let{nodesSelectionActive:s,userSelectionActive:k}=yu(JV,Eu),v=ac($,{target:uW}),tl=ac(W,{target:uW}),I=tl||E,M=tl||q,rl=A&&I!==!0,cl=v||k||rl;return gD({deleteKeyCode:c,multiSelectionKeyCode:N}),nl.jsx(oD,{onPaneContextMenu:i,elementsSelectable:J,zoomOnScroll:w,zoomOnPinch:Q,panOnScroll:M,panOnScrollSpeed:T,panOnScrollMode:O,zoomOnDoubleClick:Z,panOnDrag:!v&&I,defaultViewport:D,translateExtent:Y,minZoom:p,maxZoom:V,zoomActivationKeyCode:L,preventScrolling:B,noWheelClassName:X,noPanClassName:S,onViewportChange:z,isControlledViewport:P,paneClickDistance:y,selectionOnDrag:rl,children:nl.jsxs(uV,{onSelectionStart:F,onSelectionEnd:U,onPaneClick:u,onPaneMouseEnter:r,onPaneMouseMove:f,onPaneMouseLeave:n,onPaneContextMenu:i,onPaneScroll:t,panOnDrag:I,isSelecting:!!cl,selectionMode:j,selectionKeyPressed:v,paneClickDistance:y,selectionOnDrag:rl,children:[l,s&&nl.jsx(FV,{onSelectionContextMenu:m,noPanClassName:S,disableKeyboardA11y:b})]})})}LW.displayName="FlowRenderer";var UV=yl.memo(LW),NV=(l)=>(u)=>{return l?QA(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 QV(l){return yu(yl.useCallback(NV(l),[l]),Eu)}var wV=(l)=>l.updateNodeInternals;function qV(){let l=yu(wV),[u]=yl.useState(()=>{if(typeof ResizeObserver>"u")return null;return new ResizeObserver((r)=>{let f=new Map;r.forEach((n)=>{let i=n.target.getAttribute("data-id");f.set(i,{id:i,nodeElement:n.target,force:!0})}),l(f)})});return yl.useEffect(()=>{return()=>{u?.disconnect()}},[u]),u}function WV({node:l,nodeType:u,hasDimensions:r,resizeObserver:f}){let n=Zu(),i=yl.useRef(null),t=yl.useRef(null),y=yl.useRef(l.sourcePosition),c=yl.useRef(l.targetPosition),$=yl.useRef(u),A=r&&!!l.internals.handleBounds;return yl.useEffect(()=>{if(i.current&&!l.hidden&&(!A||t.current!==i.current)){if(t.current)f?.unobserve(t.current);f?.observe(i.current),t.current=i.current}},[A,l.hidden]),yl.useEffect(()=>{return()=>{if(t.current)f?.unobserve(t.current),t.current=null}},[]),yl.useEffect(()=>{if(i.current){let j=$.current!==u,F=y.current!==l.sourcePosition,U=c.current!==l.targetPosition;if(j||F||U)$.current=u,y.current=l.sourcePosition,c.current=l.targetPosition,n.getState().updateNodeInternals(new Map([[l.id,{id:l.id,nodeElement:i.current,force:!0}]]))}},[l.id,u,l.sourcePosition,l.targetPosition]),i}function LV({id:l,onClick:u,onMouseEnter:r,onMouseMove:f,onMouseLeave:n,onContextMenu:i,onDoubleClick:t,nodesDraggable:y,elementsSelectable:c,nodesConnectable:$,nodesFocusable:A,resizeObserver:j,noDragClassName:F,noPanClassName:U,disableKeyboardA11y:N,rfId:W,nodeTypes:L,nodeClickDistance:J,onError:w}){let{node:Q,internals:q,isParent:T}=yu(($l)=>{let Tl=$l.nodeLookup.get(l),Ql=$l.parentLookup.has(l);return{node:Tl,internals:Tl.internals,isParent:Ql}},Eu),O=Q.type||"default",Z=L?.[O]||lW[O];if(Z===void 0)w?.("003",Qf.error003(O)),O="default",Z=L?.default||lW.default;let E=!!(Q.draggable||y&&typeof Q.draggable>"u"),D=!!(Q.selectable||c&&typeof Q.selectable>"u"),Y=!!(Q.connectable||$&&typeof Q.connectable>"u"),p=!!(Q.focusable||A&&typeof Q.focusable>"u"),V=Zu(),B=D9(Q),m=WV({node:Q,nodeType:O,hasDimensions:B,resizeObserver:j}),X=wW({nodeRef:m,disabled:Q.hidden||!E,noDragClassName:F,handleSelector:Q.dragHandle,nodeId:l,isSelectable:D,nodeClickDistance:J}),S=qW();if(Q.hidden)return null;let b=Tn(Q),z=AV(Q),P=D||E||u||r||f||n,s=r?($l)=>r($l,{...q.userNode}):void 0,k=f?($l)=>f($l,{...q.userNode}):void 0,v=n?($l)=>n($l,{...q.userNode}):void 0,tl=i?($l)=>i($l,{...q.userNode}):void 0,I=t?($l)=>t($l,{...q.userNode}):void 0,M=($l)=>{let{selectNodesOnDrag:Tl,nodeDragThreshold:Ql}=V.getState();if(D&&(!Tl||!E||Ql>0))o9({id:l,store:V,nodeRef:m});if(u)u($l,{...q.userNode})},rl=($l)=>{if(Y9($l.nativeEvent)||N)return;if(G9.includes($l.key)&&D){let Tl=$l.key==="Escape";o9({id:l,store:V,unselect:Tl,nodeRef:m})}else if(E&&Q.selected&&Object.prototype.hasOwnProperty.call(BA,$l.key)){$l.preventDefault();let{ariaLabelConfig:Tl}=V.getState();V.setState({ariaLiveMessage:Tl["node.a11yDescription.ariaLiveMessage"]({direction:$l.key.replace("Arrow","").toLowerCase(),x:~~q.positionAbsolute.x,y:~~q.positionAbsolute.y})}),S({direction:BA[$l.key],factor:$l.shiftKey?4:1})}},cl=()=>{if(N||!m.current?.matches(":focus-visible"))return;let{transform:$l,width:Tl,height:Ql,autoPanOnNodeFocus:Ol,setCenter:h}=V.getState();if(!Ol)return;if(!(QA(new Map([[l,Q]]),{x:0,y:0,width:Tl,height:Ql},$l,!0).length>0))h(Q.position.x+b.width/2,Q.position.y+b.height/2,{zoom:$l[2]})};return nl.jsx("div",{className:bu(["react-flow__node",`react-flow__node-${O}`,{[U]:E},Q.className,{selected:Q.selected,selectable:D,parent:T,draggable:E,dragging:X}]),ref:m,style:{zIndex:q.z,transform:`translate(${q.positionAbsolute.x}px,${q.positionAbsolute.y}px)`,pointerEvents:P?"all":"none",visibility:B?"visible":"hidden",...Q.style,...z},"data-id":l,"data-testid":`rf__node-${l}`,onMouseEnter:s,onMouseMove:k,onMouseLeave:v,onContextMenu:tl,onClick:M,onDoubleClick:I,onKeyDown:p?rl:void 0,tabIndex:p?0:void 0,onFocus:p?cl:void 0,role:Q.ariaRole??(p?"group":void 0),"aria-roledescription":"node","aria-describedby":N?void 0:`${jW}-${W}`,"aria-label":Q.ariaLabel,...Q.domAttributes,children:nl.jsx(fV,{value:l,children:nl.jsx(Z,{id:l,data:Q.data,type:O,positionAbsoluteX:q.positionAbsolute.x,positionAbsoluteY:q.positionAbsolute.y,selected:Q.selected??!1,selectable:D,draggable:E,deletable:Q.deletable??!0,isConnectable:Y,sourcePosition:Q.sourcePosition,targetPosition:Q.targetPosition,dragging:X,dragHandle:Q.dragHandle,zIndex:q.z,parentId:Q.parentId,...b})})})}var GV=yl.memo(LV),TV=(l)=>({nodesDraggable:l.nodesDraggable,nodesConnectable:l.nodesConnectable,nodesFocusable:l.nodesFocusable,elementsSelectable:l.elementsSelectable,onError:l.onError});function GW(l){let{nodesDraggable:u,nodesConnectable:r,nodesFocusable:f,elementsSelectable:n,onError:i}=yu(TV,Eu),t=QV(l.onlyRenderVisibleElements),y=qV();return nl.jsx("div",{className:"react-flow__nodes",style:SA,children:t.map((c)=>{return nl.jsx(GV,{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:i},c)})})}GW.displayName="NodeRenderer";var mV=yl.memo(GW);function KV(l){return yu(yl.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 i=r.nodeLookup.get(n.source),t=r.nodeLookup.get(n.target);if(i&&t&&cq({sourceNode:i,targetNode:t,width:r.width,height:r.height,transform:r.transform}))f.push(n.id)}return f},[l]),Eu)}var zV=({color:l="none",strokeWidth:u=1})=>{let r={strokeWidth:u,...l&&{stroke:l}};return nl.jsx("polyline",{className:"arrow",style:r,strokeLinecap:"round",fill:"none",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4"})},EV=({color:l="none",strokeWidth:u=1})=>{let r={strokeWidth:u,...l&&{stroke:l,fill:l}};return nl.jsx("polyline",{className:"arrowclosed",style:r,strokeLinecap:"round",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4 -5,-4"})},rW={[ki.Arrow]:zV,[ki.ArrowClosed]:EV};function OV(l){let u=Zu();return yl.useMemo(()=>{if(!Object.prototype.hasOwnProperty.call(rW,l))return u.getState().onError?.("009",Qf.error009(l)),null;return rW[l]},[l])}var ZV=({id:l,type:u,color:r,width:f=12.5,height:n=12.5,markerUnits:i="strokeWidth",strokeWidth:t,orient:y="auto-start-reverse"})=>{let c=OV(u);if(!c)return null;return nl.jsx("marker",{className:"react-flow__arrowhead",id:l,markerWidth:`${f}`,markerHeight:`${n}`,viewBox:"-10 -10 20 20",markerUnits:i,orient:y,refX:"0",refY:"0",children:nl.jsx(c,{color:r,strokeWidth:t})})},TW=({defaultColor:l,rfId:u})=>{let r=yu((i)=>i.edges),f=yu((i)=>i.defaultEdgeOptions),n=yl.useMemo(()=>{return $q(r,{id:u,defaultColor:l,defaultMarkerStart:f?.markerStart,defaultMarkerEnd:f?.markerEnd})},[r,f,u,l]);if(!n.length)return null;return nl.jsx("svg",{className:"react-flow__marker","aria-hidden":"true",children:nl.jsx("defs",{children:n.map((i)=>nl.jsx(ZV,{id:i.id,type:i.type,color:i.color,width:i.width,height:i.height,markerUnits:i.markerUnits,strokeWidth:i.strokeWidth,orient:i.orient},i.id))})})};TW.displayName="MarkerDefinitions";var pV=yl.memo(TW);function mW({x:l,y:u,label:r,labelStyle:f,labelShowBg:n=!0,labelBgStyle:i,labelBgPadding:t=[2,4],labelBgBorderRadius:y=2,children:c,className:$,...A}){let[j,F]=yl.useState({x:1,y:0,width:0,height:0}),U=bu(["react-flow__edge-textwrapper",$]),N=yl.useRef(null);if(yl.useEffect(()=>{if(N.current){let W=N.current.getBBox();F({x:W.x,y:W.y,width:W.width,height:W.height})}},[r]),!r)return null;return nl.jsxs("g",{transform:`translate(${l-j.width/2} ${u-j.height/2})`,className:U,visibility:j.width?"visible":"hidden",...A,children:[n&&nl.jsx("rect",{width:j.width+2*t[0],x:-t[0],y:-t[1],height:j.height+2*t[1],className:"react-flow__edge-textbg",style:i,rx:y,ry:y}),nl.jsx("text",{className:"react-flow__edge-text",y:j.height/2,dy:"0.3em",ref:N,style:f,children:r}),c]})}mW.displayName="EdgeText";var HV=yl.memo(mW);function By({path:l,labelX:u,labelY:r,label:f,labelStyle:n,labelShowBg:i,labelBgStyle:t,labelBgPadding:y,labelBgBorderRadius:c,interactionWidth:$=20,...A}){return nl.jsxs(nl.Fragment,{children:[nl.jsx("path",{...A,d:l,fill:"none",className:bu(["react-flow__edge-path",A.className])}),$?nl.jsx("path",{d:l,fill:"none",strokeOpacity:0,strokeWidth:$,className:"react-flow__edge-interaction"}):null,f&&Hf(u)&&Hf(r)?nl.jsx(HV,{x:u,y:r,label:f,labelStyle:n,labelShowBg:i,labelBgStyle:t,labelBgPadding:y,labelBgBorderRadius:c}):null]})}function fW({pos:l,x1:u,y1:r,x2:f,y2:n}){if(l===Kl.Left||l===Kl.Right)return[0.5*(u+f),r];return[u,0.5*(r+n)]}function KW({sourceX:l,sourceY:u,sourcePosition:r=Kl.Bottom,targetX:f,targetY:n,targetPosition:i=Kl.Top}){let[t,y]=fW({pos:r,x1:l,y1:u,x2:f,y2:n}),[c,$]=fW({pos:i,x1:f,y1:n,x2:l,y2:u}),[A,j,F,U]=LA({sourceX:l,sourceY:u,targetX:f,targetY:n,sourceControlX:t,sourceControlY:y,targetControlX:c,targetControlY:$});return[`M${l},${u} C${t},${y} ${c},${$} ${f},${n}`,A,j,F,U]}function zW(l){return yl.memo(({id:u,sourceX:r,sourceY:f,targetX:n,targetY:i,sourcePosition:t,targetPosition:y,label:c,labelStyle:$,labelShowBg:A,labelBgStyle:j,labelBgPadding:F,labelBgBorderRadius:U,style:N,markerEnd:W,markerStart:L,interactionWidth:J})=>{let[w,Q,q]=KW({sourceX:r,sourceY:f,sourcePosition:t,targetX:n,targetY:i,targetPosition:y}),T=l.isInternal?void 0:u;return nl.jsx(By,{id:T,path:w,labelX:Q,labelY:q,label:c,labelStyle:$,labelShowBg:A,labelBgStyle:j,labelBgPadding:F,labelBgBorderRadius:U,style:N,markerEnd:W,markerStart:L,interactionWidth:J})})}var BV=zW({isInternal:!1}),EW=zW({isInternal:!0});BV.displayName="SimpleBezierEdge";EW.displayName="SimpleBezierEdgeInternal";function OW(l){return yl.memo(({id:u,sourceX:r,sourceY:f,targetX:n,targetY:i,label:t,labelStyle:y,labelShowBg:c,labelBgStyle:$,labelBgPadding:A,labelBgBorderRadius:j,style:F,sourcePosition:U=Kl.Bottom,targetPosition:N=Kl.Top,markerEnd:W,markerStart:L,pathOptions:J,interactionWidth:w})=>{let[Q,q,T]=Ic({sourceX:r,sourceY:f,sourcePosition:U,targetX:n,targetY:i,targetPosition:N,borderRadius:J?.borderRadius,offset:J?.offset,stepPosition:J?.stepPosition}),O=l.isInternal?void 0:u;return nl.jsx(By,{id:O,path:Q,labelX:q,labelY:T,label:t,labelStyle:y,labelShowBg:c,labelBgStyle:$,labelBgPadding:A,labelBgBorderRadius:j,style:F,markerEnd:W,markerStart:L,interactionWidth:w})})}var ZW=OW({isInternal:!1}),pW=OW({isInternal:!0});ZW.displayName="SmoothStepEdge";pW.displayName="SmoothStepEdgeInternal";function HW(l){return yl.memo(({id:u,...r})=>{let f=l.isInternal?void 0:u;return nl.jsx(ZW,{...r,id:f,pathOptions:yl.useMemo(()=>({borderRadius:0,offset:r.pathOptions?.offset}),[r.pathOptions?.offset])})})}var DV=HW({isInternal:!1}),BW=HW({isInternal:!0});DV.displayName="StepEdge";BW.displayName="StepEdgeInternal";function DW(l){return yl.memo(({id:u,sourceX:r,sourceY:f,targetX:n,targetY:i,label:t,labelStyle:y,labelShowBg:c,labelBgStyle:$,labelBgPadding:A,labelBgBorderRadius:j,style:F,markerEnd:U,markerStart:N,interactionWidth:W})=>{let[L,J,w]=TA({sourceX:r,sourceY:f,targetX:n,targetY:i}),Q=l.isInternal?void 0:u;return nl.jsx(By,{id:Q,path:L,labelX:J,labelY:w,label:t,labelStyle:y,labelShowBg:c,labelBgStyle:$,labelBgPadding:A,labelBgBorderRadius:j,style:F,markerEnd:U,markerStart:N,interactionWidth:W})})}var VV=DW({isInternal:!1}),VW=DW({isInternal:!0});VV.displayName="StraightEdge";VW.displayName="StraightEdgeInternal";function SW(l){return yl.memo(({id:u,sourceX:r,sourceY:f,targetX:n,targetY:i,sourcePosition:t=Kl.Bottom,targetPosition:y=Kl.Top,label:c,labelStyle:$,labelShowBg:A,labelBgStyle:j,labelBgPadding:F,labelBgBorderRadius:U,style:N,markerEnd:W,markerStart:L,pathOptions:J,interactionWidth:w})=>{let[Q,q,T]=GA({sourceX:r,sourceY:f,sourcePosition:t,targetX:n,targetY:i,targetPosition:y,curvature:J?.curvature}),O=l.isInternal?void 0:u;return nl.jsx(By,{id:O,path:Q,labelX:q,labelY:T,label:c,labelStyle:$,labelShowBg:A,labelBgStyle:j,labelBgPadding:F,labelBgBorderRadius:U,style:N,markerEnd:W,markerStart:L,interactionWidth:w})})}var SV=SW({isInternal:!1}),XW=SW({isInternal:!0});SV.displayName="BezierEdge";XW.displayName="BezierEdgeInternal";var nW={default:XW,straight:VW,step:BW,smoothstep:pW,simplebezier:EW},iW={sourceX:null,sourceY:null,targetX:null,targetY:null,sourcePosition:null,targetPosition:null},XV=(l,u,r)=>{if(r===Kl.Left)return l-u;if(r===Kl.Right)return l+u;return l},YV=(l,u,r)=>{if(r===Kl.Top)return l-u;if(r===Kl.Bottom)return l+u;return l},tW="react-flow__edgeupdater";function yW({position:l,centerX:u,centerY:r,radius:f=10,onMouseDown:n,onMouseEnter:i,onMouseOut:t,type:y}){return nl.jsx("circle",{onMouseDown:n,onMouseEnter:i,onMouseOut:t,className:bu([tW,`${tW}-${y}`]),cx:XV(u,f,l),cy:YV(r,f,l),r:f,stroke:"transparent",fill:"transparent"})}function PV({isReconnectable:l,reconnectRadius:u,edge:r,sourceX:f,sourceY:n,targetX:i,targetY:t,sourcePosition:y,targetPosition:c,onReconnect:$,onReconnectStart:A,onReconnectEnd:j,setReconnecting:F,setUpdateHover:U}){let N=Zu(),W=(q,T)=>{if(q.button!==0)return;let{autoPanOnConnect:O,domNode:Z,connectionMode:E,connectionRadius:D,lib:Y,onConnectStart:p,cancelConnection:V,nodeLookup:B,rfId:m,panBy:X,updateConnection:S}=N.getState(),b=T.type==="target",z=(k,v)=>{F(!1),j?.(k,r,T.type,v)},P=(k)=>$?.(r,k),s=(k,v)=>{F(!0),A?.(q,r,T.type),p?.(k,v)};EA.onPointerDown(q.nativeEvent,{autoPanOnConnect:O,connectionMode:E,connectionRadius:D,domNode:Z,handleId:T.id,nodeId:T.nodeId,nodeLookup:B,isTarget:b,edgeUpdaterType:T.type,lib:Y,flowId:m,cancelConnection:V,panBy:X,isValidConnection:(...k)=>N.getState().isValidConnection?.(...k)??!0,onConnect:P,onConnectStart:s,onConnectEnd:(...k)=>N.getState().onConnectEnd?.(...k),onReconnectEnd:z,updateConnection:S,getTransform:()=>N.getState().transform,getFromHandle:()=>N.getState().connection.fromHandle,dragThreshold:N.getState().connectionDragThreshold,handleDomNode:q.currentTarget})},L=(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"}),w=()=>U(!0),Q=()=>U(!1);return nl.jsxs(nl.Fragment,{children:[(l===!0||l==="source")&&nl.jsx(yW,{position:y,centerX:f,centerY:n,radius:u,onMouseDown:L,onMouseEnter:w,onMouseOut:Q,type:"source"}),(l===!0||l==="target")&&nl.jsx(yW,{position:c,centerX:i,centerY:t,radius:u,onMouseDown:J,onMouseEnter:w,onMouseOut:Q,type:"target"})]})}function CV({id:l,edgesFocusable:u,edgesReconnectable:r,elementsSelectable:f,onClick:n,onDoubleClick:i,onContextMenu:t,onMouseEnter:y,onMouseMove:c,onMouseLeave:$,reconnectRadius:A,onReconnect:j,onReconnectStart:F,onReconnectEnd:U,rfId:N,edgeTypes:W,noPanClassName:L,onError:J,disableKeyboardA11y:w}){let Q=yu((h)=>h.edgeLookup.get(l)),q=yu((h)=>h.defaultEdgeOptions);Q=q?{...q,...Q}:Q;let T=Q.type||"default",O=W?.[T]||nW[T];if(O===void 0)J?.("011",Qf.error011(T)),T="default",O=W?.default||nW.default;let Z=!!(Q.focusable||u&&typeof Q.focusable>"u"),E=typeof j<"u"&&(Q.reconnectable||r&&typeof Q.reconnectable>"u"),D=!!(Q.selectable||f&&typeof Q.selectable>"u"),Y=yl.useRef(null),[p,V]=yl.useState(!1),[B,m]=yl.useState(!1),X=Zu(),{zIndex:S,sourceX:b,sourceY:z,targetX:P,targetY:s,sourcePosition:k,targetPosition:v}=yu(yl.useCallback((h)=>{let a=h.nodeLookup.get(Q.source),ul=h.nodeLookup.get(Q.target);if(!a||!ul)return{zIndex:Q.zIndex,...iW};let zl=_q({id:l,sourceNode:a,targetNode:ul,sourceHandle:Q.sourceHandle||null,targetHandle:Q.targetHandle||null,connectionMode:h.connectionMode,onError:J});return{zIndex:yq({selected:Q.selected,zIndex:Q.zIndex,sourceNode:a,targetNode:ul,elevateOnSelect:h.elevateEdgesOnSelect,zIndexMode:h.zIndexMode}),...zl||iW}},[Q.source,Q.target,Q.sourceHandle,Q.targetHandle,Q.selected,Q.zIndex]),Eu),tl=yl.useMemo(()=>Q.markerStart?`url('#${mA(Q.markerStart,N)}')`:void 0,[Q.markerStart,N]),I=yl.useMemo(()=>Q.markerEnd?`url('#${mA(Q.markerEnd,N)}')`:void 0,[Q.markerEnd,N]);if(Q.hidden||b===null||z===null||P===null||s===null)return null;let M=(h)=>{let{addSelectedEdges:a,unselectNodesAndEdges:ul,multiSelectionActive:zl}=X.getState();if(D)if(X.setState({nodesSelectionActive:!1}),Q.selected&&zl)ul({nodes:[],edges:[Q]}),Y.current?.blur();else a([l]);if(n)n(h,Q)},rl=i?(h)=>{i(h,{...Q})}:void 0,cl=t?(h)=>{t(h,{...Q})}:void 0,$l=y?(h)=>{y(h,{...Q})}:void 0,Tl=c?(h)=>{c(h,{...Q})}:void 0,Ql=$?(h)=>{$(h,{...Q})}:void 0,Ol=(h)=>{if(!w&&G9.includes(h.key)&&D){let{unselectNodesAndEdges:a,addSelectedEdges:ul}=X.getState();if(h.key==="Escape")Y.current?.blur(),a({edges:[Q]});else ul([l])}};return nl.jsx("svg",{style:{zIndex:S},children:nl.jsxs("g",{className:bu(["react-flow__edge",`react-flow__edge-${T}`,Q.className,L,{selected:Q.selected,animated:Q.animated,inactive:!D&&!n,updating:p,selectable:D}]),onClick:M,onDoubleClick:rl,onContextMenu:cl,onMouseEnter:$l,onMouseMove:Tl,onMouseLeave:Ql,onKeyDown:Z?Ol:void 0,tabIndex:Z?0:void 0,role:Q.ariaRole??(Z?"group":"img"),"aria-roledescription":"edge","data-id":l,"data-testid":`rf__edge-${l}`,"aria-label":Q.ariaLabel===null?void 0:Q.ariaLabel||`Edge from ${Q.source} to ${Q.target}`,"aria-describedby":Z?`${FW}-${N}`:void 0,ref:Y,...Q.domAttributes,children:[!B&&nl.jsx(O,{id:l,source:Q.source,target:Q.target,type:Q.type,selected:Q.selected,animated:Q.animated,selectable:D,deletable:Q.deletable??!0,label:Q.label,labelStyle:Q.labelStyle,labelShowBg:Q.labelShowBg,labelBgStyle:Q.labelBgStyle,labelBgPadding:Q.labelBgPadding,labelBgBorderRadius:Q.labelBgBorderRadius,sourceX:b,sourceY:z,targetX:P,targetY:s,sourcePosition:k,targetPosition:v,data:Q.data,style:Q.style,sourceHandleId:Q.sourceHandle,targetHandleId:Q.targetHandle,markerStart:tl,markerEnd:I,pathOptions:"pathOptions"in Q?Q.pathOptions:void 0,interactionWidth:Q.interactionWidth}),E&&nl.jsx(PV,{edge:Q,isReconnectable:E,reconnectRadius:A,onReconnect:j,onReconnectStart:F,onReconnectEnd:U,sourceX:b,sourceY:z,targetX:P,targetY:s,sourcePosition:k,targetPosition:v,setUpdateHover:V,setReconnecting:m})]})})}var MV=yl.memo(CV),hV=(l)=>({edgesFocusable:l.edgesFocusable,edgesReconnectable:l.edgesReconnectable,elementsSelectable:l.elementsSelectable,connectionMode:l.connectionMode,onError:l.onError});function YW({defaultMarkerColor:l,onlyRenderVisibleElements:u,rfId:r,edgeTypes:f,noPanClassName:n,onReconnect:i,onEdgeContextMenu:t,onEdgeMouseEnter:y,onEdgeMouseMove:c,onEdgeMouseLeave:$,onEdgeClick:A,reconnectRadius:j,onEdgeDoubleClick:F,onReconnectStart:U,onReconnectEnd:N,disableKeyboardA11y:W}){let{edgesFocusable:L,edgesReconnectable:J,elementsSelectable:w,onError:Q}=yu(hV,Eu),q=KV(u);return nl.jsxs("div",{className:"react-flow__edges",children:[nl.jsx(pV,{defaultColor:l,rfId:r}),q.map((T)=>{return nl.jsx(MV,{id:T,edgesFocusable:L,edgesReconnectable:J,elementsSelectable:w,noPanClassName:n,onReconnect:i,onContextMenu:t,onMouseEnter:y,onMouseMove:c,onMouseLeave:$,onClick:A,reconnectRadius:j,onDoubleClick:F,onReconnectStart:U,onReconnectEnd:N,rfId:r,onError:Q,edgeTypes:f,disableKeyboardA11y:W},T)})]})}YW.displayName="EdgeRenderer";var RV=yl.memo(YW),xV=(l)=>`translate(${l.transform[0]}px,${l.transform[1]}px) scale(${l.transform[2]})`;function bV({children:l}){let u=yu(xV);return nl.jsx("div",{className:"react-flow__viewport xyflow__viewport react-flow__container",style:{transform:u},children:l})}function vV(l){let u=d9(),r=yl.useRef(!1);yl.useEffect(()=>{if(!r.current&&u.viewportInitialized&&l)setTimeout(()=>l(u),1),r.current=!0},[l,u.viewportInitialized])}var sV=(l)=>l.panZoom?.syncViewport;function kV(l){let u=yu(sV),r=Zu();return yl.useEffect(()=>{if(l)u?.(l),r.setState({transform:[l.x,l.y,l.zoom]})},[l,u]),null}function cW(l){return l.connection.inProgress?{...l.connection,to:Oy(l.connection.to,l.transform)}:{...l.connection}}function gV(l){if(l)return(r)=>{let f=cW(r);return l(f)};return cW}function IV(l){let u=gV(l);return yu(u,Eu)}var aV=(l)=>({nodesConnectable:l.nodesConnectable,isValid:l.connection.isValid,inProgress:l.connection.inProgress,width:l.width,height:l.height});function oV({containerStyle:l,style:u,type:r,component:f}){let{nodesConnectable:n,width:i,height:t,isValid:y,inProgress:c}=yu(aV,Eu);if(!(i&&n&&c))return null;return nl.jsx("svg",{style:l,width:i,height:t,className:"react-flow__connectionline react-flow__container",children:nl.jsx("g",{className:bu(["react-flow__connection",K9(y)]),children:nl.jsx(PW,{style:u,type:r,CustomComponent:f,isValid:y})})})}var PW=({style:l,type:u=Gn.Bezier,CustomComponent:r,isValid:f})=>{let{inProgress:n,from:i,fromNode:t,fromHandle:y,fromPosition:c,to:$,toNode:A,toHandle:j,toPosition:F,pointer:U}=IV();if(!n)return;if(r)return nl.jsx(r,{connectionLineType:u,connectionLineStyle:l,fromNode:t,fromHandle:y,fromX:i.x,fromY:i.y,toX:$.x,toY:$.y,fromPosition:c,toPosition:F,connectionStatus:K9(f),toNode:A,toHandle:j,pointer:U});let N="",W={sourceX:i.x,sourceY:i.y,sourcePosition:c,targetX:$.x,targetY:$.y,targetPosition:F};switch(u){case Gn.Bezier:[N]=GA(W);break;case Gn.SimpleBezier:[N]=KW(W);break;case Gn.Step:[N]=Ic({...W,borderRadius:0});break;case Gn.SmoothStep:[N]=Ic(W);break;default:[N]=TA(W)}return nl.jsx("path",{d:N,fill:"none",className:"react-flow__connection-path",style:l})};PW.displayName="ConnectionLine";var dV={};function _W(l=dV){let u=yl.useRef(l),r=Zu();yl.useEffect(()=>{},[l])}function eV(){let l=Zu(),u=yl.useRef(!1);yl.useEffect(()=>{},[])}function CW({nodeTypes:l,edgeTypes:u,onInit:r,onNodeClick:f,onEdgeClick:n,onNodeDoubleClick:i,onEdgeDoubleClick:t,onNodeMouseEnter:y,onNodeMouseMove:c,onNodeMouseLeave:$,onNodeContextMenu:A,onSelectionContextMenu:j,onSelectionStart:F,onSelectionEnd:U,connectionLineType:N,connectionLineStyle:W,connectionLineComponent:L,connectionLineContainerStyle:J,selectionKeyCode:w,selectionOnDrag:Q,selectionMode:q,multiSelectionKeyCode:T,panActivationKeyCode:O,zoomActivationKeyCode:Z,deleteKeyCode:E,onlyRenderVisibleElements:D,elementsSelectable:Y,defaultViewport:p,translateExtent:V,minZoom:B,maxZoom:m,preventScrolling:X,defaultMarkerColor:S,zoomOnScroll:b,zoomOnPinch:z,panOnScroll:P,panOnScrollSpeed:s,panOnScrollMode:k,zoomOnDoubleClick:v,panOnDrag:tl,onPaneClick:I,onPaneMouseEnter:M,onPaneMouseMove:rl,onPaneMouseLeave:cl,onPaneScroll:$l,onPaneContextMenu:Tl,paneClickDistance:Ql,nodeClickDistance:Ol,onEdgeContextMenu:h,onEdgeMouseEnter:a,onEdgeMouseMove:ul,onEdgeMouseLeave:zl,reconnectRadius:o,onReconnect:ql,onReconnectStart:pl,onReconnectEnd:Bl,noDragClassName:Il,noWheelClassName:nu,noPanClassName:Ml,disableKeyboardA11y:wu,nodeExtent:Qr,rfId:Or,viewport:$r,onViewportChange:ir}){return _W(l),_W(u),eV(),vV(r),kV($r),nl.jsx(UV,{onPaneClick:I,onPaneMouseEnter:M,onPaneMouseMove:rl,onPaneMouseLeave:cl,onPaneContextMenu:Tl,onPaneScroll:$l,paneClickDistance:Ql,deleteKeyCode:E,selectionKeyCode:w,selectionOnDrag:Q,selectionMode:q,onSelectionStart:F,onSelectionEnd:U,multiSelectionKeyCode:T,panActivationKeyCode:O,zoomActivationKeyCode:Z,elementsSelectable:Y,zoomOnScroll:b,zoomOnPinch:z,zoomOnDoubleClick:v,panOnScroll:P,panOnScrollSpeed:s,panOnScrollMode:k,panOnDrag:tl,defaultViewport:p,translateExtent:V,minZoom:B,maxZoom:m,onSelectionContextMenu:j,preventScrolling:X,noDragClassName:Il,noWheelClassName:nu,noPanClassName:Ml,disableKeyboardA11y:wu,onViewportChange:ir,isControlledViewport:!!$r,children:nl.jsxs(bV,{children:[nl.jsx(RV,{edgeTypes:u,onEdgeClick:n,onEdgeDoubleClick:t,onReconnect:ql,onReconnectStart:pl,onReconnectEnd:Bl,onlyRenderVisibleElements:D,onEdgeContextMenu:h,onEdgeMouseEnter:a,onEdgeMouseMove:ul,onEdgeMouseLeave:zl,reconnectRadius:o,defaultMarkerColor:S,noPanClassName:Ml,disableKeyboardA11y:wu,rfId:Or}),nl.jsx(oV,{style:W,type:N,component:L,containerStyle:J}),nl.jsx("div",{className:"react-flow__edgelabel-renderer"}),nl.jsx(mV,{nodeTypes:l,onNodeClick:f,onNodeDoubleClick:i,onNodeMouseEnter:y,onNodeMouseMove:c,onNodeMouseLeave:$,onNodeContextMenu:A,nodeClickDistance:Ol,onlyRenderVisibleElements:D,noPanClassName:Ml,noDragClassName:Il,disableKeyboardA11y:wu,nodeExtent:Qr,rfId:Or}),nl.jsx("div",{className:"react-flow__viewport-portal"})]})})}CW.displayName="GraphView";var lS=yl.memo(CW),$W=({nodes:l,edges:u,defaultNodes:r,defaultEdges:f,width:n,height:i,fitView:t,fitViewOptions:y,minZoom:c=0.5,maxZoom:$=2,nodeOrigin:A,nodeExtent:j,zIndexMode:F="basic"}={})=>{let U=new Map,N=new Map,W=new Map,L=new Map,J=f??u??[],w=r??l??[],Q=A??[0,0],q=j??my;v9(W,L,J);let{nodesInitialized:T}=KA(w,U,N,{nodeOrigin:Q,nodeExtent:q,zIndexMode:F}),O=[0,0,1];if(t&&n&&i){let Z=Ky(U,{filter:(p)=>!!((p.width||p.initialWidth)&&(p.height||p.initialHeight))}),{x:E,y:D,zoom:Y}=gc(Z,n,i,c,$,y?.padding??0.1);O=[E,D,Y]}return{rfId:"1",width:n??0,height:i??0,transform:O,nodes:w,nodesInitialized:T,nodeLookup:U,parentLookup:N,edges:J,edgeLookup:L,connectionLookup:W,onNodesChange:null,onEdgesChange:null,hasDefaultNodes:r!==void 0,hasDefaultEdges:f!==void 0,panZoom:null,minZoom:c,maxZoom:$,translateExtent:my,nodeExtent:q,nodesSelectionActive:!1,userSelectionActive:!1,userSelectionRect:null,connectionMode:si.Strict,domNode:null,paneDragging:!1,noPanClassName:"nopan",nodeOrigin:Q,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:t??!1,fitViewOptions:y,fitViewResolver:null,connection:{...m9},connectionClickStartHandle:null,connectOnClick:!0,ariaLiveMessage:"",autoPanOnConnect:!0,autoPanOnNodeDrag:!0,autoPanOnNodeFocus:!0,autoPanSpeed:15,connectionRadius:20,onError:B9,isValidConnection:void 0,onSelectionChangeHandlers:[],lib:"react",debug:!1,ariaLabelConfig:T9,zIndexMode:F,onNodesChangeMiddlewareMap:new Map,onEdgesChangeMiddlewareMap:new Map}},uS=({nodes:l,edges:u,defaultNodes:r,defaultEdges:f,width:n,height:i,fitView:t,fitViewOptions:y,minZoom:c,maxZoom:$,nodeOrigin:A,nodeExtent:j,zIndexMode:F})=>hq((U,N)=>{async function W(){let{nodeLookup:L,panZoom:J,fitViewOptions:w,fitViewResolver:Q,width:q,height:T,minZoom:O,maxZoom:Z}=N();if(!J)return;await uq({nodes:L,width:q,height:T,panZoom:J,minZoom:O,maxZoom:Z},w),Q?.resolve(!0),U({fitViewResolver:null})}return{...$W({nodes:l,edges:u,width:n,height:i,fitView:t,fitViewOptions:y,minZoom:c,maxZoom:$,nodeOrigin:A,nodeExtent:j,defaultNodes:r,defaultEdges:f,zIndexMode:F}),setNodes:(L)=>{let{nodeLookup:J,parentLookup:w,nodeOrigin:Q,elevateNodesOnSelect:q,fitViewQueued:T,zIndexMode:O,nodesSelectionActive:Z}=N(),{nodesInitialized:E,hasSelectedNodes:D}=KA(L,J,w,{nodeOrigin:Q,nodeExtent:j,elevateNodesOnSelect:q,checkEquality:!0,zIndexMode:O}),Y=Z&&D;if(T&&E)W(),U({nodes:L,nodesInitialized:E,fitViewQueued:!1,fitViewOptions:void 0,nodesSelectionActive:Y});else U({nodes:L,nodesInitialized:E,nodesSelectionActive:Y})},setEdges:(L)=>{let{connectionLookup:J,edgeLookup:w}=N();v9(J,w,L),U({edges:L})},setDefaultNodesAndEdges:(L,J)=>{if(L){let{setNodes:w}=N();w(L),U({hasDefaultNodes:!0})}if(J){let{setEdges:w}=N();w(J),U({hasDefaultEdges:!0})}},updateNodeInternals:(L)=>{let{triggerNodeChanges:J,nodeLookup:w,parentLookup:Q,domNode:q,nodeOrigin:T,nodeExtent:O,debug:Z,fitViewQueued:E,zIndexMode:D}=N(),{changes:Y,updatedInternals:p}=Jq(L,w,Q,q,T,O,D);if(!p)return;if(jq(w,Q,{nodeOrigin:T,nodeExtent:O,zIndexMode:D}),E)W(),U({fitViewQueued:!1,fitViewOptions:void 0});else U({});if(Y?.length>0){if(Z)console.log("React Flow: trigger node changes",Y);J?.(Y)}},updateNodePositions:(L,J=!1)=>{let w=[],Q=[],{nodeLookup:q,triggerNodeChanges:T,connection:O,updateConnection:Z,onNodesChangeMiddlewareMap:E}=N();for(let[D,Y]of L){let p=q.get(D),V=!!(p?.expandParent&&p?.parentId&&Y?.position),B={id:D,type:"position",position:V?{x:Math.max(0,Y.position.x),y:Math.max(0,Y.position.y)}:Y.position,dragging:J};if(p&&O.inProgress&&O.fromNode.id===p.id){let m=gi(p,O.fromHandle,Kl.Left,!0);Z({...O,from:m})}if(V&&p.parentId)w.push({id:D,parentId:p.parentId,rect:{...Y.internals.positionAbsolute,width:Y.measured.width??0,height:Y.measured.height??0}});Q.push(B)}if(w.length>0){let{parentLookup:D,nodeOrigin:Y}=N(),p=zA(w,q,D,Y);Q.push(...p)}for(let D of E.values())Q=D(Q);T(Q)},triggerNodeChanges:(L)=>{let{onNodesChange:J,setNodes:w,nodes:Q,hasDefaultNodes:q,debug:T}=N();if(L?.length){if(q){let O=MD(L,Q);w(O)}if(T)console.log("React Flow: trigger node changes",L);J?.(L)}},triggerEdgeChanges:(L)=>{let{onEdgesChange:J,setEdges:w,edges:Q,hasDefaultEdges:q,debug:T}=N();if(L?.length){if(q){let O=hD(L,Q);w(O)}if(T)console.log("React Flow: trigger edge changes",L);J?.(L)}},addSelectedNodes:(L)=>{let{multiSelectionActive:J,edgeLookup:w,nodeLookup:Q,triggerNodeChanges:q,triggerEdgeChanges:T}=N();if(J){let O=L.map((Z)=>lt(Z,!0));q(O);return}q(Hy(Q,new Set([...L]),!0)),T(Hy(w))},addSelectedEdges:(L)=>{let{multiSelectionActive:J,edgeLookup:w,nodeLookup:Q,triggerNodeChanges:q,triggerEdgeChanges:T}=N();if(J){let O=L.map((Z)=>lt(Z,!0));T(O);return}T(Hy(w,new Set([...L]))),q(Hy(Q,new Set,!0))},unselectNodesAndEdges:({nodes:L,edges:J}={})=>{let{edges:w,nodes:Q,nodeLookup:q,triggerNodeChanges:T,triggerEdgeChanges:O}=N(),Z=L?L:Q,E=J?J:w,D=[];for(let p of Z){if(!p.selected)continue;let V=q.get(p.id);if(V)V.selected=!1;D.push(lt(p.id,!1))}let Y=[];for(let p of E){if(!p.selected)continue;Y.push(lt(p.id,!1))}T(D),O(Y)},setMinZoom:(L)=>{let{panZoom:J,maxZoom:w}=N();J?.setScaleExtent([L,w]),U({minZoom:L})},setMaxZoom:(L)=>{let{panZoom:J,minZoom:w}=N();J?.setScaleExtent([w,L]),U({maxZoom:L})},setTranslateExtent:(L)=>{N().panZoom?.setTranslateExtent(L),U({translateExtent:L})},resetSelectedElements:()=>{let{edges:L,nodes:J,triggerNodeChanges:w,triggerEdgeChanges:Q,elementsSelectable:q}=N();if(!q)return;let T=J.reduce((Z,E)=>E.selected?[...Z,lt(E.id,!1)]:Z,[]),O=L.reduce((Z,E)=>E.selected?[...Z,lt(E.id,!1)]:Z,[]);w(T),Q(O)},setNodeExtent:(L)=>{let{nodes:J,nodeLookup:w,parentLookup:Q,nodeOrigin:q,elevateNodesOnSelect:T,nodeExtent:O,zIndexMode:Z}=N();if(L[0][0]===O[0][0]&&L[0][1]===O[0][1]&&L[1][0]===O[1][0]&&L[1][1]===O[1][1])return;KA(J,w,Q,{nodeOrigin:q,nodeExtent:L,elevateNodesOnSelect:T,checkEquality:!1,zIndexMode:Z}),U({nodeExtent:L})},panBy:(L)=>{let{transform:J,width:w,height:Q,panZoom:q,translateExtent:T}=N();return Uq({delta:L,panZoom:q,transform:J,translateExtent:T,width:w,height:Q})},setCenter:async(L,J,w)=>{let{width:Q,height:q,maxZoom:T,panZoom:O}=N();if(!O)return Promise.resolve(!1);let Z=typeof w?.zoom<"u"?w.zoom:T;return await O.setViewport({x:Q/2-L*Z,y:q/2-J*Z,zoom:Z},{duration:w?.duration,ease:w?.ease,interpolate:w?.interpolate}),Promise.resolve(!0)},cancelConnection:()=>{U({connection:{...m9}})},updateConnection:(L)=>{U({connection:L})},reset:()=>U({...$W()})}},Object.is);function rS({initialNodes:l,initialEdges:u,defaultNodes:r,defaultEdges:f,initialWidth:n,initialHeight:i,initialMinZoom:t,initialMaxZoom:y,initialFitViewOptions:c,fitView:$,nodeOrigin:A,nodeExtent:j,zIndexMode:F,children:U}){let[N]=yl.useState(()=>uS({nodes:l,edges:u,defaultNodes:r,defaultEdges:f,width:n,height:i,fitView:$,minZoom:t,maxZoom:y,fitViewOptions:c,nodeOrigin:A,nodeExtent:j,zIndexMode:F}));return nl.jsx(WD,{value:N,children:nl.jsx(bD,{children:U})})}function fS({children:l,nodes:u,edges:r,defaultNodes:f,defaultEdges:n,width:i,height:t,fitView:y,fitViewOptions:c,minZoom:$,maxZoom:A,nodeOrigin:j,nodeExtent:F,zIndexMode:U}){if(yl.useContext(DA))return nl.jsx(nl.Fragment,{children:l});return nl.jsx(rS,{initialNodes:u,initialEdges:r,defaultNodes:f,defaultEdges:n,initialWidth:i,initialHeight:t,fitView:y,initialFitViewOptions:c,initialMinZoom:$,initialMaxZoom:A,nodeOrigin:j,nodeExtent:F,zIndexMode:U,children:l})}var nS={width:"100%",height:"100%",overflow:"hidden",position:"relative",zIndex:0};function iS({nodes:l,edges:u,defaultNodes:r,defaultEdges:f,className:n,nodeTypes:i,edgeTypes:t,onNodeClick:y,onEdgeClick:c,onInit:$,onMove:A,onMoveStart:j,onMoveEnd:F,onConnect:U,onConnectStart:N,onConnectEnd:W,onClickConnectStart:L,onClickConnectEnd:J,onNodeMouseEnter:w,onNodeMouseMove:Q,onNodeMouseLeave:q,onNodeContextMenu:T,onNodeDoubleClick:O,onNodeDragStart:Z,onNodeDrag:E,onNodeDragStop:D,onNodesDelete:Y,onEdgesDelete:p,onDelete:V,onSelectionChange:B,onSelectionDragStart:m,onSelectionDrag:X,onSelectionDragStop:S,onSelectionContextMenu:b,onSelectionStart:z,onSelectionEnd:P,onBeforeDelete:s,connectionMode:k,connectionLineType:v=Gn.Bezier,connectionLineStyle:tl,connectionLineComponent:I,connectionLineContainerStyle:M,deleteKeyCode:rl="Backspace",selectionKeyCode:cl="Shift",selectionOnDrag:$l=!1,selectionMode:Tl=o0.Full,panActivationKeyCode:Ql="Space",multiSelectionKeyCode:Ol=Zy()?"Meta":"Control",zoomActivationKeyCode:h=Zy()?"Meta":"Control",snapToGrid:a,snapGrid:ul,onlyRenderVisibleElements:zl=!1,selectNodesOnDrag:o,nodesDraggable:ql,autoPanOnNodeFocus:pl,nodesConnectable:Bl,nodesFocusable:Il,nodeOrigin:nu=JW,edgesFocusable:Ml,edgesReconnectable:wu,elementsSelectable:Qr=!0,defaultViewport:Or=DD,minZoom:$r=0.5,maxZoom:ir=2,translateExtent:tr=my,preventScrolling:hr=!0,nodeExtent:jl,defaultMarkerColor:ol="#b1b1b7",zoomOnScroll:wr=!0,zoomOnPinch:hl=!0,panOnScroll:Yu=!1,panOnScrollSpeed:eu=0.5,panOnScrollMode:rf=ui.Free,zoomOnDoubleClick:Ar=!0,panOnDrag:Zr=!0,onPaneClick:Zn,onPaneMouseEnter:ff,onPaneMouseMove:ii,onPaneMouseLeave:Au,onPaneScroll:nt,onPaneContextMenu:fl,paneClickDistance:Dl=1,nodeClickDistance:Cl=0,children:dl,onReconnect:ju,onReconnectStart:ku,onReconnectEnd:$u,onEdgeContextMenu:qr,onEdgeDoubleClick:Yf,onEdgeMouseEnter:Ry,onEdgeMouseMove:mu,onEdgeMouseLeave:F_,reconnectRadius:c6=10,onNodesChange:Fu,onEdgesChange:bj,noDragClassName:Pu="nodrag",noWheelClassName:pr="nowheel",noPanClassName:it="nopan",fitView:xy,fitViewOptions:tt,connectOnClick:J_,attributionPosition:by,proOptions:U_,defaultEdgeOptions:N_,elevateNodesOnSelect:y0=!0,elevateEdgesOnSelect:yt=!1,disableKeyboardA11y:c0=!1,autoPanOnConnect:Rr,autoPanOnNodeDrag:Lf,autoPanSpeed:Q_,connectionRadius:ct,isValidConnection:vy,onError:w_,style:fn,id:sy,nodeDragThreshold:Cu,connectionDragThreshold:_6,viewport:q_,onViewportChange:Pf,width:_0,height:$0,colorMode:_t="light",debug:A0,onScroll:$t,ariaLabelConfig:vj,zIndexMode:ti="basic",...sj},W_){let ky=sy||"1",$6=YD(_t),A6=yl.useCallback((pn)=>{pn.currentTarget.scrollTo({top:0,left:0,behavior:"instant"}),$t?.(pn)},[$t]);return nl.jsx("div",{"data-testid":"rf__wrapper",...sj,onScroll:A6,style:{...fn,...nS},ref:W_,className:bu(["react-flow",n,$6]),id:sy,role:"application",children:nl.jsxs(fS,{nodes:l,edges:u,width:_0,height:$0,fitView:xy,fitViewOptions:tt,minZoom:$r,maxZoom:ir,nodeOrigin:nu,nodeExtent:jl,zIndexMode:ti,children:[nl.jsx(XD,{nodes:l,edges:u,defaultNodes:r,defaultEdges:f,onConnect:U,onConnectStart:N,onConnectEnd:W,onClickConnectStart:L,onClickConnectEnd:J,nodesDraggable:ql,autoPanOnNodeFocus:pl,nodesConnectable:Bl,nodesFocusable:Il,edgesFocusable:Ml,edgesReconnectable:wu,elementsSelectable:Qr,elevateNodesOnSelect:y0,elevateEdgesOnSelect:yt,minZoom:$r,maxZoom:ir,nodeExtent:jl,onNodesChange:Fu,onEdgesChange:bj,snapToGrid:a,snapGrid:ul,connectionMode:k,translateExtent:tr,connectOnClick:J_,defaultEdgeOptions:N_,fitView:xy,fitViewOptions:tt,onNodesDelete:Y,onEdgesDelete:p,onDelete:V,onNodeDragStart:Z,onNodeDrag:E,onNodeDragStop:D,onSelectionDrag:X,onSelectionDragStart:m,onSelectionDragStop:S,onMove:A,onMoveStart:j,onMoveEnd:F,noPanClassName:it,nodeOrigin:nu,rfId:ky,autoPanOnConnect:Rr,autoPanOnNodeDrag:Lf,autoPanSpeed:Q_,onError:w_,connectionRadius:ct,isValidConnection:vy,selectNodesOnDrag:o,nodeDragThreshold:Cu,connectionDragThreshold:_6,onBeforeDelete:s,debug:A0,ariaLabelConfig:vj,zIndexMode:ti}),nl.jsx(lS,{onInit:$,onNodeClick:y,onEdgeClick:c,onNodeMouseEnter:w,onNodeMouseMove:Q,onNodeMouseLeave:q,onNodeContextMenu:T,onNodeDoubleClick:O,nodeTypes:i,edgeTypes:t,connectionLineType:v,connectionLineStyle:tl,connectionLineComponent:I,connectionLineContainerStyle:M,selectionKeyCode:cl,selectionOnDrag:$l,selectionMode:Tl,deleteKeyCode:rl,multiSelectionKeyCode:Ol,panActivationKeyCode:Ql,zoomActivationKeyCode:h,onlyRenderVisibleElements:zl,defaultViewport:Or,translateExtent:tr,minZoom:$r,maxZoom:ir,preventScrolling:hr,zoomOnScroll:wr,zoomOnPinch:hl,zoomOnDoubleClick:Ar,panOnScroll:Yu,panOnScrollSpeed:eu,panOnScrollMode:rf,panOnDrag:Zr,onPaneClick:Zn,onPaneMouseEnter:ff,onPaneMouseMove:ii,onPaneMouseLeave:Au,onPaneScroll:nt,onPaneContextMenu:fl,paneClickDistance:Dl,nodeClickDistance:Cl,onSelectionContextMenu:b,onSelectionStart:z,onSelectionEnd:P,onReconnect:ju,onReconnectStart:ku,onReconnectEnd:$u,onEdgeContextMenu:qr,onEdgeDoubleClick:Yf,onEdgeMouseEnter:Ry,onEdgeMouseMove:mu,onEdgeMouseLeave:F_,reconnectRadius:c6,defaultMarkerColor:ol,noDragClassName:Pu,noWheelClassName:pr,noPanClassName:it,rfId:ky,disableKeyboardA11y:c0,nodeExtent:jl,viewport:q_,onViewportChange:Pf}),nl.jsx(BD,{onSelectionChange:B}),dl,nl.jsx(ED,{proOptions:U_,position:by}),nl.jsx(zD,{rfId:ky,disableKeyboardA11y:c0})]})})}var MW=NW(iS);var $s=Qf.error014();function tS({dimensions:l,lineWidth:u,variant:r,className:f}){return nl.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 yS({radius:l,className:u}){return nl.jsx("circle",{cx:l,cy:l,r:l,className:bu(["react-flow__background-pattern","dots",u])})}var ai;(function(l){l.Lines="lines",l.Dots="dots",l.Cross="cross"})(ai||(ai={}));var cS={[ai.Dots]:1,[ai.Lines]:1,[ai.Cross]:6},_S=(l)=>({transform:l.transform,patternId:`pattern-${l.rfId}`});function hW({id:l,variant:u=ai.Dots,gap:r=20,size:f,lineWidth:n=1,offset:i=0,color:t,bgColor:y,style:c,className:$,patternClassName:A}){let j=yl.useRef(null),{transform:F,patternId:U}=yu(_S,Eu),N=f||cS[u],W=u===ai.Dots,L=u===ai.Cross,J=Array.isArray(r)?r:[r,r],w=[J[0]*F[2]||1,J[1]*F[2]||1],Q=N*F[2],q=Array.isArray(i)?i:[i,i],T=L?[Q,Q]:w,O=[q[0]*F[2]||1+T[0]/2,q[1]*F[2]||1+T[1]/2],Z=`${U}${l?l:""}`;return nl.jsxs("svg",{className:bu(["react-flow__background",$]),style:{...c,...SA,"--xy-background-color-props":y,"--xy-background-pattern-color-props":t},ref:j,"data-testid":"rf__background",children:[nl.jsx("pattern",{id:Z,x:F[0]%w[0],y:F[1]%w[1],width:w[0],height:w[1],patternUnits:"userSpaceOnUse",patternTransform:`translate(-${O[0]},-${O[1]})`,children:W?nl.jsx(yS,{radius:Q/2,className:A}):nl.jsx(tS,{dimensions:T,lineWidth:n,variant:u,className:A})}),nl.jsx("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:`url(#${Z})`})]})}hW.displayName="Background";var RW=yl.memo(hW);function $S(){return nl.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",children:nl.jsx("path",{d:"M32 18.133H18.133V32h-4.266V18.133H0v-4.266h13.867V0h4.266v13.867H32z"})})}function AS(){return nl.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 5",children:nl.jsx("path",{d:"M0 0h32v4.2H0z"})})}function jS(){return nl.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 30",children:nl.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 FS(){return nl.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:nl.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 JS(){return nl.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:nl.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 HA({children:l,className:u,...r}){return nl.jsx("button",{type:"button",className:bu(["react-flow__controls-button",u]),...r,children:l})}var US=(l)=>({isInteractive:l.nodesDraggable||l.nodesConnectable||l.elementsSelectable,minZoomReached:l.transform[2]<=l.minZoom,maxZoomReached:l.transform[2]>=l.maxZoom,ariaLabelConfig:l.ariaLabelConfig});function xW({style:l,showZoom:u=!0,showFitView:r=!0,showInteractive:f=!0,fitViewOptions:n,onZoomIn:i,onZoomOut:t,onFitView:y,onInteractiveChange:c,className:$,children:A,position:j="bottom-left",orientation:F="vertical","aria-label":U}){let N=Zu(),{isInteractive:W,minZoomReached:L,maxZoomReached:J,ariaLabelConfig:w}=yu(US,Eu),{zoomIn:Q,zoomOut:q,fitView:T}=d9(),O=()=>{Q(),i?.()},Z=()=>{q(),t?.()},E=()=>{T(n),y?.()},D=()=>{N.setState({nodesDraggable:!W,nodesConnectable:!W,elementsSelectable:!W}),c?.(!W)};return nl.jsxs(VA,{className:bu(["react-flow__controls",F==="horizontal"?"horizontal":"vertical",$]),position:j,style:l,"data-testid":"rf__controls","aria-label":U??w["controls.ariaLabel"],children:[u&&nl.jsxs(nl.Fragment,{children:[nl.jsx(HA,{onClick:O,className:"react-flow__controls-zoomin",title:w["controls.zoomIn.ariaLabel"],"aria-label":w["controls.zoomIn.ariaLabel"],disabled:J,children:nl.jsx($S,{})}),nl.jsx(HA,{onClick:Z,className:"react-flow__controls-zoomout",title:w["controls.zoomOut.ariaLabel"],"aria-label":w["controls.zoomOut.ariaLabel"],disabled:L,children:nl.jsx(AS,{})})]}),r&&nl.jsx(HA,{className:"react-flow__controls-fitview",onClick:E,title:w["controls.fitView.ariaLabel"],"aria-label":w["controls.fitView.ariaLabel"],children:nl.jsx(jS,{})}),f&&nl.jsx(HA,{className:"react-flow__controls-interactive",onClick:D,title:w["controls.interactive.ariaLabel"],"aria-label":w["controls.interactive.ariaLabel"],children:W?nl.jsx(JS,{}):nl.jsx(FS,{})}),A]})}xW.displayName="Controls";var bW=yl.memo(xW);function NS({id:l,x:u,y:r,width:f,height:n,style:i,color:t,strokeColor:y,strokeWidth:c,className:$,borderRadius:A,shapeRendering:j,selected:F,onClick:U}){let{background:N,backgroundColor:W}=i||{},L=t||N||W;return nl.jsx("rect",{className:bu(["react-flow__minimap-node",{selected:F},$]),x:u,y:r,rx:A,ry:A,width:f,height:n,style:{fill:L,stroke:y,strokeWidth:c},shapeRendering:j,onClick:U?(J)=>U(J,l):void 0})}var QS=yl.memo(NS),wS=(l)=>l.nodes.map((u)=>u.id),I9=(l)=>l instanceof Function?l:()=>l;function qS({nodeStrokeColor:l,nodeColor:u,nodeClassName:r="",nodeBorderRadius:f=5,nodeStrokeWidth:n,nodeComponent:i=QS,onClick:t}){let y=yu(wS,Eu),c=I9(u),$=I9(l),A=I9(r),j=typeof window>"u"||!!window.chrome?"crispEdges":"geometricPrecision";return nl.jsx(nl.Fragment,{children:y.map((F)=>nl.jsx(LS,{id:F,nodeColorFunc:c,nodeStrokeColorFunc:$,nodeClassNameFunc:A,nodeBorderRadius:f,nodeStrokeWidth:n,NodeComponent:i,onClick:t,shapeRendering:j},F))})}function WS({id:l,nodeColorFunc:u,nodeStrokeColorFunc:r,nodeClassNameFunc:f,nodeBorderRadius:n,nodeStrokeWidth:i,shapeRendering:t,NodeComponent:y,onClick:c}){let{node:$,x:A,y:j,width:F,height:U}=yu((N)=>{let W=N.nodeLookup.get(l);if(!W)return{node:void 0,x:0,y:0,width:0,height:0};let L=W.internals.userNode,{x:J,y:w}=W.internals.positionAbsolute,{width:Q,height:q}=Tn(L);return{node:L,x:J,y:w,width:Q,height:q}},Eu);if(!$||$.hidden||!D9($))return null;return nl.jsx(y,{x:A,y:j,width:F,height:U,style:$.style,selected:!!$.selected,className:f($),color:u($),borderRadius:n,strokeColor:r($),strokeWidth:i,shapeRendering:t,onClick:c,id:$.id})}var LS=yl.memo(WS),GS=yl.memo(qS),TS=200,mS=150,KS=(l)=>!l.hidden,zS=(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?p9(Ky(l.nodeLookup,{filter:KS}),u):u,rfId:l.rfId,panZoom:l.panZoom,translateExtent:l.translateExtent,flowWidth:l.width,flowHeight:l.height,ariaLabelConfig:l.ariaLabelConfig}},ES="react-flow__minimap-desc";function vW({style:l,className:u,nodeStrokeColor:r,nodeColor:f,nodeClassName:n="",nodeBorderRadius:i=5,nodeStrokeWidth:t,nodeComponent:y,bgColor:c,maskColor:$,maskStrokeColor:A,maskStrokeWidth:j,position:F="bottom-right",onClick:U,onNodeClick:N,pannable:W=!1,zoomable:L=!1,ariaLabel:J,inversePan:w,zoomStep:Q=1,offsetScale:q=5}){let T=Zu(),O=yl.useRef(null),{boundingRect:Z,viewBB:E,rfId:D,panZoom:Y,translateExtent:p,flowWidth:V,flowHeight:B,ariaLabelConfig:m}=yu(zS,Eu),X=l?.width??TS,S=l?.height??mS,b=Z.width/X,z=Z.height/S,P=Math.max(b,z),s=P*X,k=P*S,v=q*P,tl=Z.x-(s-Z.width)/2-v,I=Z.y-(k-Z.height)/2-v,M=s+v*2,rl=k+v*2,cl=`${ES}-${D}`,$l=yl.useRef(0),Tl=yl.useRef();$l.current=P,yl.useEffect(()=>{if(O.current&&Y)return Tl.current=Gq({domNode:O.current,panZoom:Y,getTransform:()=>T.getState().transform,getViewScale:()=>$l.current}),()=>{Tl.current?.destroy()}},[Y]),yl.useEffect(()=>{Tl.current?.update({translateExtent:p,width:V,height:B,inversePan:w,pannable:W,zoomStep:Q,zoomable:L})},[W,L,w,Q,p,V,B]);let Ql=U?(a)=>{let[ul,zl]=Tl.current?.pointer(a)||[0,0];U(a,{x:ul,y:zl})}:void 0,Ol=N?yl.useCallback((a,ul)=>{let zl=T.getState().nodeLookup.get(ul).internals.userNode;N(a,zl)},[]):void 0,h=J??m["minimap.ariaLabel"];return nl.jsx(VA,{position:F,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 j==="number"?j*P: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 t==="number"?t:void 0},className:bu(["react-flow__minimap",u]),"data-testid":"rf__minimap",children:nl.jsxs("svg",{width:X,height:S,viewBox:`${tl} ${I} ${M} ${rl}`,className:"react-flow__minimap-svg",role:"img","aria-labelledby":cl,ref:O,onClick:Ql,children:[h&&nl.jsx("title",{id:cl,children:h}),nl.jsx(GS,{onClick:Ol,nodeColor:f,nodeStrokeColor:r,nodeBorderRadius:i,nodeClassName:n,nodeStrokeWidth:t,nodeComponent:y}),nl.jsx("path",{className:"react-flow__minimap-mask",d:`M${tl-v},${I-v}h${M+v*2}v${rl+v*2}h${-M-v*2}z - M${E.x},${E.y}h${E.width}v${E.height}h${-E.width}z`,fillRule:"evenodd",pointerEvents:"none"})]})})}vW.displayName="MiniMap";var As=yl.memo(vW),OS=(l)=>(u)=>l?`${Math.max(1/u.transform[2],1)}`:void 0,ZS={[Ii.Line]:"right",[Ii.Handle]:"bottom-right"};function pS({nodeId:l,position:u,variant:r=Ii.Handle,className:f,style:n=void 0,children:i,color:t,minWidth:y=10,minHeight:c=10,maxWidth:$=Number.MAX_VALUE,maxHeight:A=Number.MAX_VALUE,keepAspectRatio:j=!1,resizeDirection:F,autoScale:U=!0,shouldResize:N,onResizeStart:W,onResize:L,onResizeEnd:J}){let w=WW(),Q=typeof l==="string"?l:w,q=Zu(),T=yl.useRef(null),O=r===Ii.Handle,Z=yu(yl.useCallback(OS(O&&U),[O,U]),Eu),E=yl.useRef(null),D=u??ZS[r];yl.useEffect(()=>{if(!T.current||!Q)return;if(!E.current)E.current=Eq({domNode:T.current,nodeId:Q,getStoreItems:()=>{let{nodeLookup:p,transform:V,snapGrid:B,snapToGrid:m,nodeOrigin:X,domNode:S}=q.getState();return{nodeLookup:p,transform:V,snapGrid:B,snapToGrid:m,nodeOrigin:X,paneDomNode:S}},onChange:(p,V)=>{let{triggerNodeChanges:B,nodeLookup:m,parentLookup:X,nodeOrigin:S}=q.getState(),b=[],z={x:p.x,y:p.y},P=m.get(Q);if(P&&P.expandParent&&P.parentId){let s=P.origin??S,k=p.width??P.measured.width??0,v=p.height??P.measured.height??0,tl={id:P.id,parentId:P.parentId,rect:{width:k,height:v,...V9({x:p.x??P.position.x,y:p.y??P.position.y},{width:k,height:v},P.parentId,m,s)}},I=zA([tl],m,X,S);b.push(...I),z.x=p.x?Math.max(s[0]*k,p.x):void 0,z.y=p.y?Math.max(s[1]*v,p.y):void 0}if(z.x!==void 0&&z.y!==void 0){let s={id:Q,type:"position",position:{...z}};b.push(s)}if(p.width!==void 0&&p.height!==void 0){let k={id:Q,type:"dimensions",resizing:!0,setAttributes:!F?!0:F==="horizontal"?"width":"height",dimensions:{width:p.width,height:p.height}};b.push(k)}for(let s of V){let k={...s,type:"position"};b.push(k)}B(b)},onEnd:({width:p,height:V})=>{let B={id:Q,type:"dimensions",resizing:!1,dimensions:{width:p,height:V}};q.getState().triggerNodeChanges([B])}});return E.current.update({controlPosition:D,boundaries:{minWidth:y,minHeight:c,maxWidth:$,maxHeight:A},keepAspectRatio:j,resizeDirection:F,onResizeStart:W,onResize:L,onResizeEnd:J,shouldResize:N}),()=>{E.current?.destroy()}},[D,y,c,$,A,j,W,L,J,N]);let Y=D.split("-");return nl.jsx("div",{className:bu(["react-flow__resize-control","nodrag",...Y,r,f]),ref:T,style:{...n,scale:Z,...t&&{[O?"backgroundColor":"borderColor"]:t}},children:i})}var js=yl.memo(pS);var K=l0.default.createElement,{useEffect:zn}=l0.default,dr=l0.default.useState,ei=l0.default.useRef,r_=[{id:"in-left",side:"left",position:Kl.Left,style:{top:"50%"}},{id:"in-top-left",side:"top",slot:"left",slotIndex:-1,position:Kl.Top,style:{left:"28%"}},{id:"in-top-mid",side:"top",slot:"mid",slotIndex:0,position:Kl.Top,style:{left:"50%"}},{id:"in-top-right",side:"top",slot:"right",slotIndex:1,position:Kl.Top,style:{left:"72%"}},{id:"in-bottom-left",side:"bottom",slot:"left",slotIndex:-1,position:Kl.Bottom,style:{left:"28%"}},{id:"in-bottom-mid",side:"bottom",slot:"mid",slotIndex:0,position:Kl.Bottom,style:{left:"50%"}},{id:"in-bottom-right",side:"bottom",slot:"right",slotIndex:1,position:Kl.Bottom,style:{left:"72%"}}],ec=[{id:"out-right",position:Kl.Right,style:{top:"50%"}}],sW=["#4eb7a8","#d7a13a","#69aee8","#e0835f","#b7d86b","#d98bd2","#5fc6bf"],Vy=236,Sy=88,kW=15000,HS=10,lj=96,mn=72,uj=64,gW=12;function XA(){return typeof document>"u"||document.visibilityState!=="hidden"}function IW(l,u){let r=Number.parseFloat(String(l||""));return Number.isFinite(r)?r/100:u}function BS(l,u,r){let f=String(l.side||"");if(f!=="top"&&f!=="bottom")return 0;let n=Number(l.slotIndex||0),i=f==="top"?"in-top-mid":"in-bottom-mid",t=u.get(l.id)||0,y=u.get(i)||0;if(n===0)return y===0?-26:28+t*74;let c=r===0?Math.abs(n)*2:Math.sign(r)===Math.sign(n)?-3:3;if(y>0&&t===0)return-14+c;return 8+t*74+c}function YA(l){let u=l.filter((i,t)=>{let y=l[t-1];return!y||Math.abs(y.x-i.x)>0.5||Math.abs(y.y-i.y)>0.5});if(u.length<2)return"";let r=`M ${u[0].x},${u[0].y}`,f=u[0];for(let i=1;i0.5||Math.abs(F.y-f.y)>0.5)r+=` L ${F.x},${F.y}`;r+=` Q ${y.x},${y.y} ${U.x},${U.y}`,f=U}let n=u[u.length-1];return`${r} L ${n.x},${n.y}`}function FL(l,u,r,f,n,i,t=""){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)),j=Math.min(280,Math.abs(i));if(y&&n===Kl.Left&&j<4&&$<28&&c<420)return`M ${l},${u} C ${l+A},${u} ${r-A},${f} ${r},${f}`;if(y&&n===Kl.Left&&(t==="direct-forward-left"||c<=260&&$<=210)){let J=Math.max(42,Math.min(140,c*0.48)),w=Math.max(-28,Math.min(28,i*0.18));return`M ${l},${u} C ${l+J},${u+w} ${r-J},${f} ${r},${f}`}if(y){let J=l+A;if(n===Kl.Top||n===Kl.Bottom){let q=n===Kl.Top?-1:1,T=f+q*(54+j*0.42);return YA([{x:l,y:u},{x:J,y:u},{x:J+Math.min(120,c*0.18),y:T},{x:r,y:T},{x:r,y:f+q*34},{x:r,y:f}])}let w=r-A,Q=(u+f)/2+i;return YA([{x:l,y:u},{x:J,y:u},{x:J+Math.min(110,c*0.16),y:Q},{x:w-Math.min(90,c*0.12),y:Q},{x:w,y:f},{x:r,y:f}])}let N=n===Kl.Bottom?1:n===Kl.Top?-1:i>=0?1:-1,W=Math.max(l,r)+92+Math.min(180,j*0.52),L=N<0?Math.min(u,f)-84-j*0.62:Math.max(u,f)+84+j*0.62;if(n===Kl.Top||n===Kl.Bottom)return YA([{x:l,y:u},{x:l+A,y:u},{x:W,y:L},{x:r,y:L},{x:r,y:f+N*38},{x:r,y:f}]);return YA([{x:l,y:u},{x:l+A,y:u},{x:W,y:L},{x:r-A,y:L},{x:r-A,y:f},{x:r,y:f}])}function DS({data:l}){return K("div",{className:"pipeline-flow-node-body"},r_.map((u)=>K(ut,{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})),ec.map((u)=>K(ut,{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 VS({id:l,sourceX:u,sourceY:r,targetX:f,targetY:n,targetPosition:i,markerEnd:t,markerStart:y,style:c,data:$}){let A=Number($?.laneOffset||0),j=FL(u,r,f,n,i,A,String($?.routeMode||""));return K(By,{id:l,path:j,markerEnd:t,markerStart:y,style:c,interactionWidth:28})}var SS={pipelineCurve:VS},XS={pipelineNode:DS};function hA(l){if(!l)return"--";let u=new Date(l);if(Number.isNaN(u.getTime()))return"--";return iu(u)}function Vf(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 rj(l){let u=Number(l);if(!Number.isFinite(u))return"--";return u.toLocaleString("zh-CN")}function aW(l){let u=Number(l);if(!Number.isFinite(u))return"--";return`${Math.round(Math.max(0,Math.min(1,u))*100)}%`}function Yl(l){return typeof l==="object"&&l!==null&&!Array.isArray(l)}function Sl(l){return Array.isArray(l)?l:[]}function al(l){if(!l)return null;let u=new Date(l);return Number.isNaN(u.getTime())?null:u.getTime()}function f_(l){return Number.isFinite(Number(l))?new Date(Number(l)).toISOString():""}function t_(...l){for(let u of l){let r=al(u);if(r!==null)return new Date(r).toISOString()}return""}function Qj(...l){let u=l.map(al).filter((r)=>r!==null);return u.length>0?new Date(Math.max(...u)).toISOString():""}function wj(l){return["succeeded","failed","skipped","cancelled","canceled","completed"].includes(String(l||"").toLowerCase())}function JL(l){let u=QL(l).toLowerCase();return["running","active","in-progress","in_progress"].includes(u)}function oW(l,u="status"){return l.reduce((r,f)=>{let n=String(f?.[u]||"unknown").toLowerCase();return r[n]=(r[n]||0)+1,r},{})}function UL(l){if(!l||typeof l!=="string")return null;try{let u=JSON.parse(l);return Yl(u)?u:null}catch{return null}}function fj(l){let u=l.map(UL).filter((i)=>Boolean(i)),r=u.flatMap((i)=>[i.timestamp,i.createdAt,i.updatedAt]).filter(Boolean),f=Qj(...r),n=Array.from(new Set(u.map((i)=>String(i.event||i.action||i.type||"")).filter(Boolean))).slice(0,3);return{total:l.length,parsed:u.length,lastAt:f,eventKinds:n}}function RA(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 NL(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 QL(l){if(typeof l==="string")return l;if(Yl(l))return String(l.status||l.state||l.phase||"unknown");return"unknown"}function YS(l){return l.filter((u)=>u&&u.value!==void 0&&u.value!==null&&String(u.value)!=="")}function _j({items:l}){let u=YS(Sl(l));return K("div",{className:"pipeline-kv-grid"},u.map((r)=>K("span",{key:r.label},K("b",null,r.label),K("span",null,r.value))))}function qj({items:l}){let u=Sl(l).map((r)=>String(r||"")).filter(Boolean);if(u.length===0)return null;return K("div",{className:"pipeline-chip-row"},u.map((r,f)=>K("span",{key:`${f}-${r}`},r)))}function $j(l,u){let r=String(u?.procedureRunId||""),f=Sl(l?.procedureRuns);return f.find((n)=>String(Sf(n))===r)||f.at(-1)||null}function PS(l,u){let r=String(u||"");if(!r)return null;return Sl(l?.procedureRuns).find((f)=>Sf(f)===r)||null}function nj(l){return Sl(l?.attempts).length}function dW(l){return Sl(l?.attempts).reduce((u,r)=>u+IA(r).length,0)}function IA(l){return Sl(l?.opencodeMessages?.steps).filter(Yl)}function wL(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 CS(l,u){let r=jj(l.map((i)=>i?.agent)).slice(0,3),f=jj(l.map((i)=>i?.model)).slice(0,3),n=u.length<=2?u.map((i)=>`session ${i}`):[`sessions ${u.length}`,...u.slice(0,2).map((i)=>`session ${i}`)];return[...r.map((i)=>`agent ${i}`),...f.map((i)=>`model ${i}`),...n]}function l_(l,u=0){return String(l?.messageId||l?.index||"")||`step-${u}`}function MS({steps:l,sessionIds:u,sessionFacts:r,matchedStepKey:f}){let n=Sl(l),i=n.findIndex((L,J)=>l_(L,J)===f),t=i>=0?n[i]:null,y=n.flatMap((L)=>[al(L?.createdAt),al(L?.completedAt)]).filter((L)=>L!==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,j=n.reduce((L,J)=>L+Sl(J?.parts).filter((w)=>String(w?.type||"").toLowerCase()==="tool").length,0),F=n.reduce((L,J)=>L+Sl(J?.parts).filter((w)=>["text","reasoning"].includes(String(w?.type||"").toLowerCase())).length,0),U=n.reduce((L,J)=>L+Sl(J?.parts).filter((w)=>String(w?.type||"").toLowerCase()==="tool"&&wL(w)==="failed").length,0),N=[`${n.length} steps`,`${u.length} sessions`,`${F} messages`,`${j} tools`,A!==null?`duration ${Vf(A)}`:"",U>0?`${U} failed tools`:""].filter(Boolean),W=t?[`Step ${t?.index??i+1}`,String(t?.role||"role --"),t?.model?`model ${t.model}`:"",t?.finish?`finish ${t.finish}`:"",t?.durationMs!==void 0&&t?.durationMs!==null?`duration ${Vf(t.durationMs)}`:""].filter(Boolean):[];return K("section",{className:"pipeline-trace-timeline","data-testid":"pipeline-step-timeline"},K("div",{className:"pipeline-trace-head"},K("div",null,K("b",null,"OpenCode Trace"),K("span",null,"Trace 使用 Code Queue 统一样式展示完整 agent loop;Pipeline 旧 step/message/tool 卡片样式已废弃。")),K("div",{className:"pipeline-trace-session-head","data-testid":"pipeline-step-timeline-session"},K("span",null,N.join(" / ")||"Trace"),r.length>0?K(qj,{items:r}):null)),t?K("div",{className:"pipeline-trace-focus","data-testid":"pipeline-trace-matched-step"},K("span",{className:"codex-output-channel"},"Matched"),K("strong",null,`Gantt selection -> ${W.join(" / ")}`),K("time",null,`${hA(t?.createdAt)} -> ${hA(t?.completedAt)}`)):null,K(n3,{port:pN,input:n,className:"codex-transcript pipeline-trace",testId:"pipeline-opencode-step-trace",emptyText:"暂无 OpenCode Trace 输出",keepRecentToolCalls:3}))}function Aj(l){return Sl(l).flatMap((u)=>{if(Yl(u))return[u];let r=UL(u);return r?[r]:[]})}function un(l){return String(l?.event||l?.action||l?.requestedAction||l?.type||"").toLowerCase()}function Dy(l){return t_(l?.timestamp,l?.createdAt,l?.updatedAt,l?.startedAt,l?.finishedAt)}function hS(l){return al(Dy(l))}function aA(l){return String(l?.attempt||l?.id||"")}function jj(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 eW(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 rt(l){return String(l?.requestedAction||l?.action||"").toLowerCase()}function u_(l){switch(rt(l)){case"guide":return"引导";case"modify":return"修改";case"approve":return"审核通过";case"restart":return"重启";case"redo":return"重做";default:return String(l?.requestedAction||l?.action||"控制")}}function lL(l){switch(un(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`${u_(l)} 已发起`;case"control-command-applied":return`${u_(l)} 已生效`;case"control-command-ignored":return`${u_(l)} 已忽略`;default:return String(l?.event||l?.action||l?.requestedAction||"event")}}function uL(l){return NL(l?.promptPreview||l?.reasonPreview||l?.prompt||l?.reason||"",240)}function RS(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 ij(l){let u=IA(l),r=u.map((c)=>al(c?.createdAt)).filter((c)=>c!==null),f=u.map((c)=>al(c?.completedAt)??al(c?.createdAt)).filter((c)=>c!==null),n=Aj(l?.controlEventRecords).map((c)=>hS(c)).filter((c)=>c!==null),i=Sl(l?.assistantOutputs).map((c)=>al(c?.updatedAt)).filter((c)=>c!==null),t=r[0]??n[0]??i[0]??null,y=f.at(-1)??n.at(-1)??i.at(-1)??t;return{startMs:t,endMs:y}}function xS(l,u,r,f,n=""){let i=Sl(l?.procedureRuns).filter((y)=>oA(y,u)===r);if(i.length===0)return null;if(n){let y=i.find((c)=>Sf(c)===n);if(y)return y}if(f===null)return i.at(-1)||null;let t=i.find((y)=>{let c=al(PA(y,l)),$=al(CA(y,l))??c;return c!==null&&$!==null&&f>=c-1000&&f<=$+1000});if(t)return t;return i.slice().sort((y,c)=>{let $=al(PA(y,l))??f,A=al(CA(y,l))??$,j=al(PA(c,l))??f,F=al(CA(c,l))??j,U=Math.min(Math.abs($-f),Math.abs(A-f)),N=Math.min(Math.abs(j-f),Math.abs(F-f));return U-N})[0]||null}function qL(l,u){let r=Sl(l?.attempts).filter(Yl);if(r.length===0)return null;let f=String(u?.attempt||"");if(f){let t=r.find((y)=>aA(y)===f);if(t)return t}let n=Number.isFinite(Number(u?.ms))?Number(u.ms):null;if(n===null)return r.at(-1)||null;let i=r.find((t)=>{let y=ij(t);return Number.isFinite(y.startMs)&&Number.isFinite(y.endMs)&&n>=Number(y.startMs)-1000&&n<=Number(y.endMs)+1000});if(i)return i;return r.slice().sort((t,y)=>{let c=ij(t),$=ij(y),A=Math.min(Math.abs(Number(c.startMs??n)-n),Math.abs(Number(c.endMs??n)-n)),j=Math.min(Math.abs(Number($.startMs??n)-n),Math.abs(Number($.endMs??n)-n));return A-j})[0]||r.at(-1)||null}function WL(l,u){let r=IA(l);if(r.length===0)return{step:null,stepIndex:-1,stepKey:""};if(u===null){let i=r[0];return{step:i,stepIndex:0,stepKey:l_(i,0)}}for(let i=0;i=y-1000&&u<=c+1000)return{step:t,stepIndex:i,stepKey:l_(t,i)}}let f=r.findIndex((i)=>{let t=al(i?.createdAt)??al(i?.completedAt);return t!==null&&t>=u});if(f>=0){let i=r[f];return{step:i,stepIndex:f,stepKey:l_(i,f)}}let n=Math.max(0,r.length-1);return{step:r[n],stepIndex:n,stepKey:l_(r[n],n)}}function bS(l,u){let r=String(u?.runId||l?.runId||"");if(String(u?.mode||"")==="interval"){let $=u?.interval||{},A=$j(l,$)||$.raw||{};return{mode:"interval",runId:r,interval:$,marker:null,nodeId:String($?.nodeId||oA(A,r)||""),procedure:A,attempt:null,matchedStep:null,matchedStepIndex:-1,matchedStepKey:""}}let f=Yl(u?.marker)?u.marker:{},n=Number.isFinite(Number(f?.ms))?Number(f.ms):null,i=String(f?.nodeId||""),t=i?xS(l,r,i,n,String(f?.procedureRunId||"")):null,y=t?qL(t,f):null,c=y?WL(y,n):{step:null,stepIndex:-1,stepKey:""};return{mode:"event",runId:r,interval:null,marker:f,nodeId:i,procedure:t,attempt:y,matchedStep:c.step,matchedStepIndex:c.stepIndex,matchedStepKey:c.stepKey}}function vS({procedure:l,matchedStepKey:u="",matchedAttemptId:r=""}){let f=Sl(l?.attempts);if(f.length===0)return K(qf,{title:"暂无 attempt 详情",text:"当前 procedure 还没有可展示的 attempt / OpenCode Trace;若刚点击甘特线,请等待 node 详情抓取完成。"});return f.map((n,i)=>{let t=n?.opencodeMessages||{},y=IA(n),c=Sl(t.sessionIds).map((F)=>String(F)).filter(Boolean),$=CS(y,c),A=aA(n)||`attempt-${i+1}`,j=y.reduce((F,U)=>F+Sl(U?.parts).filter((N)=>String(N?.type||"").toLowerCase()==="tool"&&wL(N)==="failed").length,0);return K("article",{key:A,className:`pipeline-attempt-card ${r===A?"matched":""}`},K("div",{className:"pipeline-attempt-head"},K("div",null,K("strong",null,A),K("span",null,t.source||"opencode")),K("div",{className:"pipeline-attempt-badges"},K("span",null,`${y.length} steps`),K("span",null,`${t.toolCallCount??"--"} tools`),j>0?K("span",{className:"danger"},`${j} failed`):null)),K(_j,{items:[{label:"messages",value:t.messageCount??"--"},{label:"steps",value:t.stepCount??"--"},{label:"tools",value:t.toolCallCount??"--"},{label:"updated",value:Wl(t.updatedAt)},{label:"sessions",value:c.join(", ")||"--"}]}),y.length===0?K("p",{className:"muted paragraph"},"当前 attempt 尚未返回 OpenCode Trace;请确认 D601 pipeline-control 已重建并重新抓取。"):K(MS,{steps:y,sessionIds:c,sessionFacts:$,matchedStepKey:u}))})}function tj(l,u){return`${l}::${u}`}function xA(l,u,r){if(!Yl(l))return null;return String(l.runId||"")===u&&String(l.nodeId||"")===r?l:null}function sS(l,u){let r=Yl(l)?l:{};if(!Yl(u))return r;let f=Sl(u.attempts),n=Sl(r.attempts);return{...r,...u,attempts:f.length>0?f:n}}function kS(l,u,r,f){if(!xA(u,r,f))return l;let n=Sl(u.procedureRuns),i=Yl(l)?l:{};return{...i,...u,controlEvents:Sl(u.controlEvents).length>0?u.controlEvents:i.controlEvents,procedureRuns:n.length>0?n:i.procedureRuns}}function gS({selection:l,runDetails:u,nodeDetails:r,nodeDetailsState:f,onRaw:n,onCollapse:i}){if(!l?.mode)return K("aside",{className:"pipeline-gantt-detail-panel empty","data-testid":"pipeline-gantt-detail-panel"},K("div",{className:"pipeline-gantt-detail-head"},K("div",null,K("span",{className:"panel-eyebrow"},"Gantt Detail"),K(fu,{title:"未选择元素",level:3})),K("button",{type:"button",className:"ghost-btn mini",onClick:i,"data-testid":"pipeline-gantt-sidebar-collapse"},"收起")),K(qf,{title:"选择一条执行线或一个控制点",text:"点击甘特图中的 node 执行线、prompt 点或控制点,在这里查看结构化过程和 OpenCode step。"}));let t=String(l?.runId||""),y=String(l?.interval?.nodeId||l?.marker?.nodeId||""),c=u?.runId===t?u.details:null,$=xA(r,t,y),A=String(f?.runId||"")===t&&String(f?.nodeId||"")===y,j=kS(c,$,t,y),F=(String(u?.runId||"")!==t||Boolean(u?.loading))&&!j,U=String(u?.runId||"")===t?String(u?.error||""):"",N=A?String(f?.error||""):"",W=j?bS(j,l):null,L=W?.interval||l?.interval||null,J=W?.marker||l?.marker||null,w=String(L?.procedureRunId||J?.procedureRunId||""),Q=$?PS($,w)||$j($,L||{procedureRunId:w}):null,q=W?.procedure||(j?$j(j,L||{procedureRunId:w}):null)||L?.raw||{};if(Q&&(nj(q)===0||dW(Q)>=dW(q)))q=sS(q,Q);let T=W?.attempt||null,O=String(W?.matchedStepKey||"");if(!T&&J&&nj(q)>0)T=qL(q,J),O=String(WL(T,Number.isFinite(Number(J?.ms))?Number(J.ms):null).stepKey||"");let Z=aA(T),E=nj(q)>0,D=A&&Boolean(f?.loading)&&!E,Y=Boolean(F||D),p=[E?"":U,N].filter(Boolean).join(" / "),V=A&&f?.fetchedAt?f.fetchedAt:u?.fetchedAt,B=QL(q?.status||L?.status||J?.status||J?.event),m=l?.mode==="event"?J?.label||lL(J?.raw||J)||"event":W?.nodeId||L?.nodeId||"node",X=J?RS(J?.raw||J):[],S=J?[un(J?.raw||J)?`event ${un(J?.raw||J)}`:"",J?.promptEvent?`prompt ${J.promptEvent}`:"",J?.action?`action ${J.action}`:"",J?.sourceKind?`source ${eW(J.sourceKind)}`:"",J?.sourceNodeId?`from ${J.sourceNodeId}`:"",J?.targetNodeId?`to ${J.targetNodeId}`:"",J?.snapReason?`draw ${J.snapReason}`:""].filter(Boolean):[];return K("aside",{className:"pipeline-gantt-detail-panel","data-testid":"pipeline-gantt-detail-panel"},K("div",{className:"pipeline-gantt-detail-head"},K("div",null,K("span",{className:"panel-eyebrow"},l?.mode==="event"?"Gantt Event Detail":"Gantt Line Detail"),K(fu,{title:m,level:3,loading:Y})),K("div",{className:"pipeline-gantt-detail-head-actions"},K(u0,{status:B},B),K("button",{type:"button",className:"ghost-btn mini",onClick:i,"data-testid":"pipeline-gantt-sidebar-collapse"},"收起"))),J?K("article",{className:"pipeline-event-card"},K("div",{className:"pipeline-event-card-head"},K("strong",null,J?.label||lL(J?.raw||J)),K(qj,{items:S})),K(_j,{items:[{label:"event time",value:Wl(J?.timestampIso||J?.timestamp||"--")},J?.snapped?{label:"drawn time",value:Wl(J?.renderedTimestampIso||J?.ms)}:null,{label:"node",value:J?.nodeId||"--"},{label:"procedure",value:J?.procedureRunId||Sf(q)||"--"},{label:"attempt",value:J?.attempt||Z||"--"},{label:"source kind",value:J?.sourceKind?eW(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]}),X.length>0?K("div",{className:"pipeline-event-blocks"},X.map((b,z)=>K("section",{key:`${b.label}-${z}`,className:"pipeline-event-text-block"},K("b",null,b.label),K("p",null,b.value)))):null,uL(J?.raw||J)?K("p",{className:"pipeline-text-preview"},uL(J?.raw||J)):null):null,K(_j,{items:[{label:"epoch",value:t||L?.runId||"--"},{label:"node",value:W?.nodeId||L?.nodeId||J?.nodeId||"--"},{label:"procedure",value:L?.procedureRunId||J?.procedureRunId||Sf(q)||"--"},{label:"started",value:Wl(L?.startedAt||q?.startedAt)},{label:"finished",value:Wl(L?.finishedAt||q?.finishedAt)},{label:"duration",value:Vf(L?.durationMs||q?.durationMs)},{label:"fetched",value:V?iu(V):"--"},W?.matchedStep?{label:"matched step",value:`Step ${W.matchedStep.index??W.matchedStepIndex+1}`}:null]}),K(lu,{error:p}),K("div",{className:"pipeline-gantt-detail-actions"},K(rn,{title:`Procedure ${L?.procedureRunId||J?.procedureRunId||W?.nodeId||"node"}`,data:q,onOpen:n,testId:"raw-pipeline-gantt-procedure"}),J?K(rn,{title:`Pipeline event ${J?.id||J?.commandId||J?.eventId||W?.nodeId||"event"}`,data:J?.raw||J,onOpen:n,testId:"raw-pipeline-gantt-event"}):null,j?K(rn,{title:`Pipeline run ${t||"--"}`,data:j,onOpen:n,testId:"raw-pipeline-gantt-node-details"}):null),!Y&&!Sf(q)&&!J?K(qf,{title:"暂无过程详情",text:"当前选择还没有可匹配的 procedure 运行记录。"}):null,!Y&&Sf(q)?K(vS,{procedure:q,matchedStepKey:O,matchedAttemptId:Z}):null)}function IS({value:l}){let r=String(l||"--").split(/([_-])/u);return K(l0.default.Fragment,null,r.map((f,n)=>f==="-"||f==="_"?K(l0.default.Fragment,{key:n},f,K("wbr",null)):K(l0.default.Fragment,{key:n},f)))}async function oi(l,u={}){return ml(l,{invalidJsonPrefix:"Pipeline 返回了无效 JSON",...u})}function u0({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return K("span",{className:`status-badge ${r}`},u||l||"unknown")}function Mr({label:l,value:u,hint:r,tone:f}){return K("article",{className:`metric-card ${f||""}`},K("div",{className:"metric-label"},l),K("div",{className:"metric-value"},u),K("div",{className:"metric-hint"},r))}function Kn({title:l,eyebrow:u,actions:r,children:f,className:n,loading:i}){return K("section",{className:`panel ${n||""}`},K("div",{className:"panel-head"},K("div",null,u?K("p",{className:"panel-eyebrow"},u):null,K(fu,{title:l,loading:i})),r?K("div",{className:"panel-actions"},r):null),K("div",{className:"panel-body"},f))}function rn({title:l,data:u,onOpen:r,testId:f}){return K("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function Df({title:l,subtitle:u,facts:r,data:f,onRaw:n,testId:i}){let t=Sl(r).map((y)=>String(y||"")).filter(Boolean);return K("article",{className:"pipeline-evidence-row"},K("div",{className:"pipeline-evidence-main"},K("strong",null,l),u?K("span",null,u):null),K("div",{className:"pipeline-evidence-facts"},t.map((y,c)=>K("span",{key:`${c}-${y.slice(0,16)}`},y))),f!==void 0?K(rn,{title:l,data:f,onOpen:n,testId:i}):null)}function qf({title:l,text:u}){return K("div",{className:"empty-state"},K("strong",null,l),K("span",null,u))}function aS(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function oS(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function dS(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function eS(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 rL(l,u,r){let f=l?._unidesk?.arrayLimits?.[u],n=Number(f?.originalLength);return Number.isFinite(n)?n:r}function LL(l){if(!l||typeof l!=="object"||Array.isArray(l))return"--";return`${l.componentClass||"--"}/${l.id||"--"}`}function bA(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 Wj(l){return l?.config&&typeof l.config==="object"&&!Array.isArray(l.config)?l.config:{}}function GL(l){let u=Wj(l),r=Array.isArray(u.nodes)?u.nodes:Array.isArray(l?.nodes)?l.nodes:[],f=new Map;for(let t of r){let y=String(t?.id||t?.nodeId||"");if(y)f.set(y,{...t,id:y})}let n=Lj(l),i=(t)=>{if(t&&!f.has(t))f.set(t,{id:t})};for(let t of Gj(l))n_(t).forEach(i);for(let t of n)i(String(t?.from||t?.source||"")),i(String(t?.to||t?.target||""));return Array.from(f.values())}function Lj(l){let u=Wj(l);return Array.isArray(u.edges)?u.edges:Array.isArray(l?.edges)?l.edges:[]}function Gj(l){let u=Wj(l);return Array.isArray(u.topologicalBatches)?u.topologicalBatches:Array.isArray(l?.topologicalBatches)?l.topologicalBatches:[]}function lX(l){let u=new Map;for(let r of l){let f=bA(r);if(f)u.set(f,r);let n=Array.isArray(r?.refs)?r.refs:[];for(let i of n){let t=bA(i);if(t)u.set(t,r)}}return u}function fL(l,u){let r=u.get(bA(l?.componentRef));if(r)return r;let f=bA({componentClass:l?.kind,id:l?.id});return f?u.get(f)||null:null}function nL(l,u){let r=TL(l,u);return String(r?.status||"pending")}function TL(l,u){return(Array.isArray(l?.nodes)?l.nodes:[]).find((f)=>f?.nodeId===u||f?.id===u)||null}function uX(l){return l.reduce((u,r)=>{let f=String(r?.status||"unknown").toLowerCase();return u[f]=(u[f]||0)+1,u},{})}function rX(l){if(Array.isArray(l?.scorers))return l.scorers.filter(Yl);if(Array.isArray(l?.summary?.scorers))return l.summary.scorers.filter(Yl);if(Array.isArray(l?.artifact?.summary?.scorers))return l.artifact.summary.scorers.filter(Yl);return[]}function fX(l){if(Yl(l?.run))return l.run;if(Yl(l?.runSummary))return l.runSummary;return null}function nX(l,u){if(!Yl(l)&&!Yl(u))return null;if(!Yl(l))return u;if(!Yl(u))return l;return{...l,...u,request:Yl(l.request)||Yl(u.request)?{...Yl(l.request)?l.request:{},...Yl(u.request)?u.request:{}}:u.request??l.request,artifact:Yl(l.artifact)||Yl(u.artifact)?{...Yl(l.artifact)?l.artifact:{},...Yl(u.artifact)?u.artifact:{}}:u.artifact??l.artifact,summary:Yl(l.summary)||Yl(u.summary)?{...Yl(l.summary)?l.summary:{},...Yl(u.summary)?u.summary:{}}:u.summary??l.summary}}function vA(l){let u=rX(l),r=u.find((A)=>Yl(A?.score))||u[0]||null,f=Yl(r?.score)?r.score:{},n=Number(f.passed),i=Number(f.total),t=Number(f.ratio),y=Number.isFinite(t)?t:Number.isFinite(n)&&Number.isFinite(i)&&i>0?n/i: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(i)?`${n}/${i}`:""));return{scorer:r,scorers:u,score:f,passed:Number.isFinite(n)?n:null,total:Number.isFinite(i)?i:null,percent:c,text:$}}function Fj(l){let u=vA(l);return u.text||(u.scorers.length>0?String(u.scorer?.status||"pending"):"--")}function Tj(l){let u=vA(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 iX(l){return Array.isArray(l?.items)?l.items.filter(Yl):[]}function tX({run:l}){let u=Fj(l);return K("span",{className:`pipeline-score-badge ${Tj(l)}`},`score ${u}`)}function yX({run:l,onRaw:u}){let f=vA(l).scorers;if(!l)return K(qf,{title:"暂无评分",text:"选择一个 epoch 后会显示 scorer 结果。"});if(f.length===0)return K("div",{className:"pipeline-score-empty"},K("strong",null,"评分器等待中"),K("span",null,"DAG 完成后,Pipeline control backend 会把 scorer summary 追加到 run artifact,并通过 UniDesk 显示。"));return K("div",{className:"pipeline-score-board","data-testid":"pipeline-score-board"},f.map((n,i)=>{let t=vA({scorers:[n]}),y=iX(n),c=t.percent??0;return K("article",{key:`${n.scorerId||n.component||i}`,className:`pipeline-score-card ${Tj({scorers:[n]})}`},K("div",{className:"pipeline-score-head"},K("div",null,K("span",null,n.scorerId||n.component||"scorer"),K("strong",null,t.text||n.status||"--")),K(u0,{status:n.status||"unknown"},n.status||"unknown")),K("div",{className:"pipeline-score-meter","aria-label":`score ${c}%`},K("span",{style:{width:`${c}%`}})),K("div",{className:"pipeline-score-facts"},K("span",null,`${c}%`),K("span",null,n.component||"--"),K("span",null,n.applicationCheckoutRef||"--")),y.length>0?K("div",{className:"pipeline-score-items"},y.map(($)=>K("span",{key:`${$.id||$.filter}`,className:`pipeline-score-item ${String($.status||"").toLowerCase()}`,title:`${$.filter||"--"} / ran=${$.ran??"?"}`},K("b",null,$.id||"--"),K("small",null,$.status||"--")))):K("p",{className:"muted paragraph"},"当前 scorer 尚未返回 item 级结果。"),n.error?K("p",{className:"pipeline-score-error"},NL(n.error,360)):null,K("div",{className:"panel-actions inline-actions"},K(rn,{title:`Scorer ${n.scorerId||i}`,data:n,onOpen:u,testId:"raw-pipeline-score"})))}))}function cX(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 n_(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 n_(l.nodes);if(Array.isArray(l?.nodeIds))return n_(l.nodeIds);return[]}function _X(l){return Yl(l?.instanceInputs?.monitor)?l.instanceInputs.monitor:{}}function mL(l,u){if(String(l?.kind||"").toLowerCase()!=="procedure")return!1;let r=_X(l);if(l?.instanceInputs?.monitorMode===!0||r.enabled===!0)return!0;let f=LL(l?.componentRef);return String(u?.id||u?.config?.id||f||"").toLowerCase().includes("monitor")}function $X(l){return l.filter((u)=>mL(u)).map((u)=>String(u?.id||"")).filter(Boolean)}function AX(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 jX(l,u){if(u.length===0)return l;let r=new Set(u),f=u.filter((i)=>l.some((t)=>t.includes(i)));if(f.length===0)return l;let n=l.map((i)=>i.filter((t)=>!r.has(t))).filter((i)=>i.length>0);return[f,...n]}function FX(l,u,r){let n=Gj(l).map(n_).filter((F)=>F.length>0);if(n.length>0)return n;let i=u.map((F)=>String(F?.id||"")).filter(Boolean),t=new Set(i),y=new Map(i.map((F)=>[F,0])),c=new Map(i.map((F)=>[F,[]]));for(let F of r){let U=String(F?.from||F?.source||""),N=String(F?.to||F?.target||"");if(!t.has(U)||!t.has(N))continue;c.get(U)?.push(N),y.set(N,(y.get(N)||0)+1)}let $=new Map,A=i.filter((F)=>(y.get(F)||0)===0);for(let F of A)$.set(F,0);while(A.length>0){let F=A.shift(),U=($.get(F)||0)+1;for(let N of c.get(F)||[])if(y.set(N,Math.max(0,(y.get(N)||0)-1)),$.set(N,Math.max($.get(N)||0,U)),(y.get(N)||0)===0)A.push(N)}i.forEach((F)=>{if(!$.has(F))$.set(F,0)});let j=Math.max(0,...Array.from($.values()));return Array.from({length:j+1},(F,U)=>i.filter((N)=>$.get(N)===U)).filter((F)=>F.length>0)}function JX(l,u,r){let n=Gj(l).map(n_).filter((y)=>y.length>0),i=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])),j=new Map(y.map((W)=>[W,[]]));for(let W of $){let L=String(W?.from||W?.source||""),J=String(W?.to||W?.target||"");if(!c.has(L)||!c.has(J))continue;j.get(L)?.push(J),A.set(J,(A.get(J)||0)+1)}let F=new Map,U=y.filter((W)=>(A.get(W)||0)===0);for(let W of U)F.set(W,0);while(U.length>0){let W=U.shift(),L=(F.get(W)||0)+1;for(let J of j.get(W)||[])if(A.set(J,Math.max(0,(A.get(J)||0)-1)),F.set(J,Math.max(F.get(J)||0,L)),(A.get(J)||0)===0)U.push(J)}y.forEach((W)=>{if(!F.has(W))F.set(W,0)});let N=Math.max(0,...Array.from(F.values()));return Array.from({length:N+1},(W,L)=>y.filter((J)=>F.get(J)===L)).flatMap((W)=>W)})(),t=new Set(i);for(let y of u){let c=String(y?.id||"");if(!c||t.has(c))continue;i.push(c),t.add(c)}return AX(i,$X(u))}function oc(l){return`${l.source}->${l.target}-${l.index}`}function iL(l,u,r){let f=GL(l),n=Lj(l),i=lX(r),t=new Map(f.map((B)=>[String(B?.id||""),B])),y=f.filter((B)=>mL(B,fL(B,i))).map((B)=>String(B?.id||"")).filter(Boolean),c=jX(FX(l,f,n),y),$=[],A=new Map,j=330,F=122;c.forEach((B,m)=>{let X=B.length*122;B.forEach((S,b)=>{let z=t.get(S)||{id:S},P=fL(z,i),s=nL(u,S).toLowerCase(),k=String(z.kind||P?.componentClass||"node").toLowerCase(),v=LL(z.componentRef||P),tl=String(P?.config?.version||P?.version||""),I=String(P?.config?.description||P?.description||""),M=b*122-Math.floor(X/2);A.set(S,{column:m,row:b,y:M}),$.push({id:S,type:"pipelineNode",position:{x:m*330,y:M},data:{exportLabel:{id:S,kind:k,componentRef:v,componentVersion:tl,componentDescription:I,status:s},label:K("div",{className:"flow-node-label"},K("strong",null,S),K("span",null,k),K("code",{title:I||v},tl?`${v}@${tl}`:v),K(u0,{status:s},s))},className:`pipeline-flow-node ${k} ${s}`})})});let U=n.flatMap((B,m)=>{let X=String(B?.from||B?.source||""),S=String(B?.to||B?.target||"");if(!t.has(X)||!t.has(S))return[];return[{source:X,target:S,index:m,condition:B?.condition,edgeType:B?.edgeType}]}),N=U.reduce((B,m)=>B.set(m.source,(B.get(m.source)||0)+1),new Map),W=U.reduce((B,m)=>B.set(m.target,(B.get(m.target)||0)+1),new Map),L=U.reduce((B,m)=>{let X=`${m.source}->${m.target}`;return B.set(X,(B.get(X)||0)+1)},new Map),J=new Map,w=new Map,Q=new Map,q=new Map,T=new Map,O=new Map,Z=U.reduce((B,m)=>{let X=A.get(m.source),S=A.get(m.target),b=(S?.column||0)-(X?.column||0);if(b<=0||String(m.edgeType||"").toLowerCase()==="rework"||b!==1)return B;let P=`${m.source}->column:${S?.column??""}`,s=B.get(P)||[];return s.push(m),B.set(P,s),B},new Map);for(let B of Z.values()){if(B.length<2)continue;B.slice().sort((m,X)=>{let S=A.get(m.target),b=A.get(X.target);return(S?.y||0)-(b?.y||0)||m.index-X.index}).forEach((m,X,S)=>{O.set(oc(m),{slot:X-(S.length-1)/2,count:S.length})})}[...U].sort((B,m)=>{let X=A.get(B.source),S=A.get(B.target),b=A.get(m.source),z=A.get(m.target),P=Math.abs((S?.column||0)-(X?.column||0))*330+Math.abs((S?.y||0)-(X?.y||0)),s=Math.abs((z?.column||0)-(b?.column||0))*330+Math.abs((z?.y||0)-(b?.y||0));return P-s||B.index-m.index}).forEach((B)=>{let m=A.get(B.source)||{column:0,row:0,y:0},X=A.get(B.target)||{column:0,row:0,y:0},S=X.column-m.column,b=Math.max(0,S),z=S<=0||String(B.edgeType||"").toLowerCase()==="rework",P=m.y-X.y,s=W.get(B.target)||1,k=O.has(oc(B)),v=!z&&b<=1&&(k||s===1),tl=T.get(B.target)||new Map;T.set(B.target,tl);let I=r_.slice().sort((M,rl)=>{let cl=(Ol)=>{let h=String(Ol.side),a=0;if(z){if(h==="left")a+=86;if(h==="top")a+=X.y<=0?-22:12;if(h==="bottom")a+=X.y>=0?-22:12;if(Math.abs(X.y)<12&&h!=="left")a+=B.index%2===0?h==="top"?-6:6:h==="bottom"?-6:6;return a}if(v){if(h==="left")a-=k?72:44;if(h!=="left")a+=k?72:44;return a+Math.abs(P)*0.02}if(h==="left")a+=b<=1?0:24;if(h==="top")a+=P<-36?-18:42;if(h==="bottom")a+=P>36?-18:42;if(b<=1&&Math.abs(P)<=82&&h!=="left")a+=38;if(b>1&&h!=="left")a-=10;return a},$l=m.y-X.y,Tl=$l!==0?$l:B.index%2===0?-1:1,Ql=(Ol)=>{let h=tl.get(Ol.id)||0;return cl(Ol)+h*64+BS(Ol,tl,Tl)};return Ql(M)-Ql(rl)||String(M.id).localeCompare(String(rl.id))})[0];tl.set(I.id,(tl.get(I.id)||0)+1),q.set(oc(B),I)});let D=U.map((B)=>{let m=nL(u,B.target).toLowerCase(),X=`${B.source}->${B.target}`,S=J.get(B.source)||0,b=w.get(B.target)||0,z=Q.get(X)||0;J.set(B.source,S+1),w.set(B.target,b+1),Q.set(X,z+1);let P=S-((N.get(B.source)||1)-1)/2,s=b-((W.get(B.target)||1)-1)/2,k=z-((L.get(X)||1)-1)/2,v=A.get(B.source),tl=A.get(B.target),I=(tl?.column||0)-(v?.column||0),M=Math.max(1,Math.abs(I)),rl=I<=0||String(B.edgeType||"").toLowerCase()==="rework",cl=Math.abs((tl?.y||0)-(v?.y||0)),$l=O.get(oc(B)),Tl=!rl&&I===1&&(W.get(B.target)||0)>1,Ql=$l?$l.slot:k*2+P+s*0.45,Ol=Ql===0?B.index%2===0?-1:1:Math.sign(Ql),h=q.get(oc(B))||r_[1],a=h.side==="top"?-1:h.side==="bottom"?1:Ol,ul=rl||M>1||cl>96||Math.abs(Ql)>0.2||h.side!=="left",zl=rl?118+M*18:22+M*16,o=h.side==="left"?0:28,ql=ul?Math.max(-280,Math.min(280,a*Math.min(180,zl+o+cl*0.22)+Ql*28)):0,pl=Math.max(0,Math.min(ec.length-1,Math.round(P+(ec.length-1)/2))),Bl=ec[pl]||ec[1],Il=m==="succeeded"?"var(--accent-2)":m==="running"?"var(--accent)":m==="failed"?"var(--danger)":"rgba(129, 147, 159, 0.78)",nu=v?.column||0,Ml=tl?.column||0,wu=ql===0?0:Math.sign(ql),Qr=rl?`feedback:${nu}->${Ml}:${wu}`:$l?`fanout:${nu}->${Ml}:${B.source}`:Tl?`fanin:${nu}->${Ml}:${B.target}`:h.side!=="left"||M>1?`corridor:${nu}->${Ml}:${h.side}:${wu}:${Math.round(Math.abs(ql)/56)}`:"";return{id:`${B.source}->${B.target}-${B.index}`,source:B.source,target:B.target,sourceHandle:Bl.id,targetHandle:h.id,type:"pipelineCurve",zIndex:12,animated:m==="running",data:{baseEdgeColor:Il,laneOffset:ql,routeMode:$l&&h.side==="left"?"direct-forward-left":"",targetSide:h.side,isFeedback:rl,overlapGroup:Qr},targetStatus:m}}),Y=D.reduce((B,m)=>{let X=String(m.data?.overlapGroup||"");return X?B.set(X,(B.get(X)||0)+1):B},new Map),p=new Map,V=D.map((B)=>{let m=String(B.targetStatus||"pending"),X={...B};delete X.targetStatus;let S=String(B.data?.overlapGroup||""),b=S?Y.get(S)||0:0,z=b>1?p.get(S)||0:-1;if(b>1)p.set(S,z+1);let P=z>=0?sW[z%sW.length]:String(B.data.baseEdgeColor),s={stroke:P};if(B.data.isFeedback)s.strokeDasharray="9 7";return{...X,data:{...B.data,edgeColor:P,overlapSlot:z,overlapCount:b},style:s,markerEnd:{type:ki.ArrowClosed,color:P},className:`pipeline-flow-edge ${m} ${B.data.isFeedback?"feedback":""} ${z>=0?"overlap-colored":""}`}});return{nodes:$,edges:V}}function er(l){return String(l??"").replace(/&/g,"&").replace(//g,">").replace(/"/g,""")}function tL(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 sA(l){return`arrow-${l.replace(/[^a-zA-Z0-9_-]+/g,"")}`}function KL(l,u="pipeline"){return String(l||u).replace(/[^a-zA-Z0-9_-]+/g,"-").replace(/^-|-$/g,"")||u}function yL(l,u){let r=l.position.x,f=l.position.y,n=r_.find((i)=>i.id===u);if(n?.side==="top")return{x:r+Vy*IW(n.style?.left,0.5),y:f,position:Kl.Top};if(n?.side==="bottom")return{x:r+Vy*IW(n.style?.left,0.5),y:f+Sy,position:Kl.Bottom};return{x:r,y:f+Sy/2,position:Kl.Left}}function UX(l){return{x:l.position.x+Vy,y:l.position.y+Sy/2}}function NX(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+Vy),1)+220,i=Math.max(...l.nodes.map((W)=>W.position.y+Sy),1)+220,t=Math.ceil(n-r),y=Math.ceil(i-f),c=new Map(l.nodes.map((W)=>[W.id,W])),$=l.edges.map((W)=>tL(W.data?.edgeColor||W.style?.stroke)),j=Array.from(new Set(["#4eb7a8","#d7a13a","#cf6a54","#81939f",...$])).map((W)=>``).join(""),F=l.edges.flatMap((W)=>{let L=c.get(W.source),J=c.get(W.target);if(!L||!J)return[];let w=UX(L),Q=yL(J,String(W.targetHandle||"in-left")),q=FL(w.x,w.y,Q.x,Q.y,Q.position,Number(W.data?.laneOffset||0),String(W.data?.routeMode||"")),T=tL(W.data?.edgeColor||W.style?.stroke),O=W.data?.isFeedback?' stroke-dasharray="9 7"':"";return``}).join(` -`),U=l.nodes.map((W)=>{let L=W.data?.exportLabel||{},J=String(L.status||"pending").toLowerCase(),w=J==="succeeded"?"#4eb7a8":J==="running"?"#d7a13a":J==="failed"?"#cf6a54":"#81939f",Q=W.position.x,q=W.position.y,T=r_.map((O)=>{let Z=yL(W,O.id);if(O.side==="top"||O.side==="bottom")return``;return``}).join(` +`)),A=_.reduce((F,j)=>F.concat(...j),[]);return[_,A]}return[[],[]]},[l]);return $l.useEffect(()=>{let c=u?.target??qq,_=u?.actInsideInputWithModifier??!0;if(l!==null){let A=(J)=>{if(n.current=J.ctrlKey||J.metaKey||J.shiftKey||J.altKey,(!n.current||n.current&&!_)&&$9(J))return!1;let w=Gq(J.code,y);if(t.current.add(J[w]),Lq(i,t.current,!1)){let L=J.composedPath?.()?.[0]||J.target,N=L?.nodeName==="BUTTON"||L?.nodeName==="A";if(u.preventDefault!==!1&&(n.current||!N))J.preventDefault();f(!0)}},F=(J)=>{let U=Gq(J.code,y);if(Lq(i,t.current,!0))f(!1),t.current.clear();else t.current.delete(J[U]);if(J.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 Lq(l,u,r){return l.filter((f)=>r||f.length===u.size).some((f)=>f.every((n)=>u.has(n)))}function Gq(l,u){return u.includes(l)?"code":"key"}var wS=()=>{let l=Zu();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=n$(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 Xy(_,f,F,A)},flowToScreenPosition:(u)=>{let{transform:r,domNode:f}=l.getState();if(!f)return u;let{x:n,y:t}=f.getBoundingClientRect(),i=r$(u,r);return{x:i.x+n,y:i.y+t}}}},[])};function Rq(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)qS(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 qS(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 LS(l,u){return Rq(l,u)}function GS(l,u){return Rq(l,u)}function y0(l,u){return{id:l,type:"select",selected:u}}function hy(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 Wq({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 Tq(l){return{id:l.id,type:"remove"}}var Kq=(l)=>pw(l),WS=(l)=>dF(l);function xq(l){return $l.forwardRef(l)}function Eq(l){let[u,r]=$l.useState(BigInt(0)),[f]=$l.useState(()=>TS(()=>r((n)=>n+BigInt(1))));return G9(()=>{let n=f.get();if(n.length)l(n),f.reset()},[u]),f}function TS(l){let u=[];return{get:()=>u,reset:()=>{u=[]},push:(r)=>{u.push(r),l()}}}var bq=$l.createContext(null);function KS({children:l}){let u=Zu(),r=$l.useCallback((y)=>{let{nodes:c=[],setNodes:_,hasDefaultNodes:A,onNodesChange:F,nodeLookup:j,fitViewQueued:J,onNodesChangeMiddlewareMap:U}=u.getState(),w=c;for(let N of y)w=typeof N==="function"?N(w):N;let L=Wq({items:w,lookup:j});for(let N of U.values())L=N(L);if(A)_(w);if(L.length>0)F?.(L);else if(J)window.requestAnimationFrame(()=>{let{fitViewQueued:N,nodes:Q,setNodes:m}=u.getState();if(N)m(Q)})},[]),f=Eq(r),n=$l.useCallback((y)=>{let{edges:c=[],setEdges:_,hasDefaultEdges:A,onEdgesChange:F,edgeLookup:j}=u.getState(),J=c;for(let U of y)J=typeof U==="function"?U(J):U;if(A)_(J);else if(F)F(Wq({items:J,lookup:j}))},[]),t=Eq(n),i=$l.useMemo(()=>({nodeQueue:f,edgeQueue:t}),[]);return il.jsx(bq.Provider,{value:i,children:l})}function ES(){let l=$l.useContext(bq);if(!l)throw Error("useBatchContext must be used within a BatchProvider");return l}var pS=(l)=>!!l.panZoom;function T9(){let l=wS(),u=Zu(),r=ES(),f=yu(pS),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:J}=u.getState(),U=Kq(F)?F:j.get(F.id),w=U.parentId?i9(U.position,U.measured,U.parentId,j,J):U.position,L={...U,position:w,width:U.measured?.width??U.width,height:U.measured?.height??U.height};return i0(L)},_=(F,j,J={replace:!1})=>{i((U)=>U.map((w)=>{if(w.id===F){let L=typeof j==="function"?j(w):j;return J.replace&&Kq(L)?L:{...w,...L}}return w}))},A=(F,j,J={replace:!1})=>{y((U)=>U.map((w)=>{if(w.id===F){let L=typeof j==="function"?j(w):j;return J.replace&&WS(L)?L:{...w,...L}}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((J)=>[...J,...j])},addEdges:(F)=>{let j=Array.isArray(F)?F:[F];r.edgeQueue.push((J)=>[...J,...j])},toObject:()=>{let{nodes:F=[],edges:j=[],transform:J}=u.getState(),[U,w,L]=J;return{nodes:F.map((N)=>({...N})),edges:j.map((N)=>({...N})),viewport:{x:U,y:w,zoom:L}}},deleteElements:async({nodes:F=[],edges:j=[]})=>{let{nodes:J,edges:U,onNodesDelete:w,onEdgesDelete:L,triggerNodeChanges:N,triggerEdgeChanges:Q,onDelete:m,onBeforeDelete:q}=u.getState(),{nodes:W,edges:p}=await Zw({nodesToRemove:F,edgesToRemove:j,nodes:J,edges:U,onBeforeDelete:q}),O=p.length>0,z=W.length>0;if(O){let B=p.map(Tq);L?.(p),Q(B)}if(z){let B=W.map(Tq);w?.(W),N(B)}if(z||O)m?.({nodes:W,edges:p});return{deletedNodes:W,deletedEdges:p}},getIntersectingNodes:(F,j=!0,J)=>{let U=f9(F),w=U?F:c(F),L=J!==void 0;if(!w)return[];return(J||u.getState().nodes).filter((N)=>{let Q=u.getState().nodeLookup.get(N.id);if(Q&&!U&&(N.id===F.id||!Q.internals.positionAbsolute))return!1;let m=i0(L?N:Q),q=Vy(m,w);return j&&q>0||q>=m.width*m.height||q>=w.width*w.height})},isNodeIntersecting:(F,j,J=!0)=>{let w=f9(F)?F:c(F);if(!w)return!1;let L=Vy(w,j);return J&&L>0||L>=j.width*j.height||L>=w.width*w.height},updateNode:_,updateNodeData:(F,j,J={replace:!1})=>{_(F,(U)=>{let w=typeof j==="function"?j(U):j;return J.replace?{...U,data:w}:{...U,data:{...U.data,...w}}},J)},updateEdge:A,updateEdgeData:(F,j,J={replace:!1})=>{A(F,(U)=>{let w=typeof j==="function"?j(U):j;return J.replace?{...U,data:w}:{...U,data:{...U.data,...w}}},J)},getNodesBounds:(F)=>{let{nodeLookup:j,nodeOrigin:J}=u.getState();return l9(F,{nodeLookup:j,nodeOrigin:J})},getHandleConnections:({type:F,id:j,nodeId:J})=>Array.from(u.getState().connectionLookup.get(`${J}-${F}${j?`-${j}`:""}`)?.values()??[]),getNodeConnections:({type:F,handleId:j,nodeId:J})=>Array.from(u.getState().connectionLookup.get(`${J}${F?j?`-${F}-${j}`:`-${F}`:""}`)?.values()??[]),fitView:async(F)=>{let j=u.getState().fitViewResolver??Dw();return u.setState({fitViewQueued:!0,fitViewOptions:F,fitViewResolver:j}),r.nodeQueue.push((J)=>[...J]),j.promise}}},[]);return $l.useMemo(()=>{return{...n,...l,viewportInitialized:f}},[f])}var pq=(l)=>l.selected,zS=typeof window<"u"?window:void 0;function OS({deleteKeyCode:l,multiSelectionKeyCode:u}){let r=Zu(),{deleteElements:f}=T9(),n=i$(l,{actInsideInputWithModifier:!1}),t=i$(u,{target:zS});$l.useEffect(()=>{if(n){let{edges:i,nodes:y}=r.getState();f({nodes:y.filter(pq),edges:i.filter(pq)}),r.setState({nodesSelectionActive:!1})}},[n]),$l.useEffect(()=>{r.setState({multiSelectionActive:t})},[t])}function ZS(l){let u=Zu();$l.useEffect(()=>{let r=()=>{if(!l.current||!(l.current.checkVisibility?.()??!0))return!1;let f=XA(l.current);if(f.height===0||f.width===0)u.getState().onError?.("004",wf.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 dA={position:"absolute",width:"100%",height:"100%",top:0,left:0},HS=(l)=>({userSelectionActive:l.userSelectionActive,lib:l.lib,connectionInProgress:l.connection.inProgress});function BS({onPaneContextMenu:l,zoomOnScroll:u=!0,zoomOnPinch:r=!0,panOnScroll:f=!1,panOnScrollSpeed:n=0.5,panOnScrollMode:t=nt.Free,zoomOnDoubleClick:i=!0,panOnDrag:y=!0,defaultViewport:c,translateExtent:_,minZoom:A,maxZoom:F,zoomActivationKeyCode:j,preventScrolling:J=!0,children:U,noWheelClassName:w,noPanClassName:L,onViewportChange:N,isControlledViewport:Q,paneClickDistance:m,selectionOnDrag:q}){let W=Zu(),p=$l.useRef(null),{userSelectionActive:O,lib:z,connectionInProgress:B}=yu(HS,pu),Y=i$(j),H=$l.useRef();ZS(p);let D=$l.useCallback((P)=>{if(N?.({x:P[0],y:P[1],zoom:P[2]}),!Q)W.setState({transform:P})},[N,Q]);return $l.useEffect(()=>{if(p.current){H.current=ew({domNode:p.current,minZoom:A,maxZoom:F,translateExtent:_,viewport:c,onDraggingChange:(V)=>W.setState((v)=>v.paneDragging===V?v:{paneDragging:V}),onPanZoomStart:(V,v)=>{let{onViewportChangeStart:K,onMoveStart:X}=W.getState();X?.(V,v),K?.(v)},onPanZoom:(V,v)=>{let{onViewportChange:K,onMove:X}=W.getState();X?.(V,v),K?.(v)},onPanZoomEnd:(V,v)=>{let{onViewportChangeEnd:K,onMoveEnd:X}=W.getState();X?.(V,v),K?.(v)}});let{x:P,y:E,zoom:S}=H.current.getViewport();return W.setState({panZoom:H.current,transform:[P,E,S],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:Y,preventScrolling:J,noPanClassName:L,userSelectionActive:O,noWheelClassName:w,lib:z,onTransformChange:D,connectionInProgress:B,selectionOnDrag:q,paneClickDistance:m})},[l,u,r,f,n,t,i,y,Y,J,L,O,w,z,D,B,q,m]),il.jsx("div",{className:"react-flow__renderer",ref:p,style:dA,children:U})}var DS=(l)=>({userSelectionActive:l.userSelectionActive,userSelectionRect:l.userSelectionRect});function SS(){let{userSelectionActive:l,userSelectionRect:u}=yu(DS,pu);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 q9=(l,u)=>{return(r)=>{if(r.target!==u.current)return;l?.(r)}},VS=(l)=>({userSelectionActive:l.userSelectionActive,elementsSelectable:l.elementsSelectable,connectionInProgress:l.connection.inProgress,dragging:l.paneDragging});function YS({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:J,children:U}){let w=Zu(),{userSelectionActive:L,elementsSelectable:N,dragging:Q,connectionInProgress:m}=yu(VS,pu),q=N&&(l||L),W=$l.useRef(null),p=$l.useRef(),O=$l.useRef(new Set),z=$l.useRef(new Set),B=$l.useRef(!1),Y=(K)=>{if(B.current||m){B.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)},D=A?(K)=>A(K):void 0,P=(K)=>{if(B.current)K.stopPropagation(),B.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),B.current=!1;let{x:nl,y:d}=Vf(K.nativeEvent,p.current);if(w.setState({userSelectionRect:{width:0,height:0,startX:nl,startY:d,x:nl,y:d}}),!I)K.stopPropagation(),K.preventDefault()},S=(K)=>{let{userSelectionRect:X,transform:I,nodeLookup:a,edgeLookup:R,connectionLookup:nl,triggerNodeChanges:d,triggerEdgeChanges:h,defaultEdgeOptions:rl,resetSelectedElements:_l}=w.getState();if(!p.current||!X)return;let{x:Al,y:Ll}=Vf(K.nativeEvent,p.current),{startX:Ql,startY:pl}=X;if(!B.current){let g=u?0:n;if(Math.hypot(Al-Ql,Ll-pl)<=g)return;_l(),i?.(K)}B.current=!0;let s={startX:Ql,startY:pl,x:Alg.id)),z.current=new Set;let k=rl?.selectable??!0;for(let g of O.current){let yl=nl.get(g);if(!yl)continue;for(let{edgeId:Tl}of yl.values()){let Zl=R.get(Tl);if(Zl&&(Zl.selectable??k))z.current.add(Tl)}}if(!y9(e,O.current)){let g=hy(a,O.current,!0);d(g)}if(!y9(fl,z.current)){let g=hy(R,z.current);h(g)}w.setState({userSelectionRect:s,userSelectionActive:!0,nodesSelectionActive:!1})},V=(K)=>{if(K.button!==0)return;if(K.target?.releasePointerCapture?.(K.pointerId),!L&&K.target===W.current&&w.getState().userSelectionRect)Y?.(K);if(w.setState({userSelectionActive:!1,userSelectionRect:null}),B.current)y?.(K),w.setState({nodesSelectionActive:O.current.size>0})},v=f===!0||Array.isArray(f)&&f.includes(0);return il.jsxs("div",{className:xu(["react-flow__pane",{draggable:v,dragging:Q,selection:l}]),onClick:q?void 0:q9(Y,W),onContextMenu:q9(H,W),onWheel:q9(D,W),onPointerEnter:q?void 0:F,onPointerMove:q?S:j,onPointerUp:q?V:void 0,onPointerDownCapture:q?E:void 0,onClickCapture:q?P:void 0,onPointerLeave:J,ref:W,style:dA,children:[U,il.jsx(SS,{})]})}function W9({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",wf.error012(l));return}if(u.setState({nodesSelectionActive:!1}),!_.selected)n([l]);else if(r||_.selected&&i)t({nodes:[_],edges:[]}),requestAnimationFrame(()=>f?.current?.blur())}function vq({nodeRef:l,disabled:u=!1,noDragClassName:r,handleSelector:f,nodeId:n,isSelectable:t,nodeClickDistance:i}){let y=Zu(),[c,_]=$l.useState(!1),A=$l.useRef();return $l.useEffect(()=>{A.current=bw({getStoreItems:()=>y.getState(),onNodeMouseDown:(F)=>{W9({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 XS=(l)=>(u)=>u.selected&&(u.draggable||l&&typeof u.draggable>"u");function gq(){let l=Zu();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=XS(i),J=n?t[0]:5,U=n?t[1]:5,w=r.direction.x*J*r.factor,L=r.direction.y*U*r.factor;for(let[,N]of _){if(!j(N))continue;let Q={x:N.internals.positionAbsolute.x+w,y:N.internals.positionAbsolute.y+L};if(n)Q=Yy(Q,t);let{position:m,positionAbsolute:q}=u9({nodeId:N.id,nextPosition:Q,nodeLookup:_,nodeExtent:f,nodeOrigin:A,onError:y});N.position=m,N.internals.positionAbsolute=q,F.set(N.id,N)}c(F)},[])}var K9=$l.createContext(null),PS=K9.Provider;K9.Consumer;var kq=()=>{return $l.useContext(K9)},CS=(l)=>({connectOnClick:l.connectOnClick,noPanClassName:l.noPanClassName,rfId:l.rfId}),hS=(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===at.Strict?y?.type!==r:l!==y?.nodeId||u!==y?.id,connectionInProcess:!!y,clickConnectionInProcess:!!n,valid:A&&_}};function sS({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},J){let U=i||null,w=l==="target",L=Zu(),N=kq(),{connectOnClick:Q,noPanClassName:m,rfId:q}=yu(CS,pu),{connectingFrom:W,connectingTo:p,clickConnecting:O,isPossibleEndHandle:z,connectionInProcess:B,clickConnectionInProcess:Y,valid:H}=yu(hS(N,U,l),pu);if(!N)L.getState().onError?.("010",wf.error010());let D=(S)=>{let{defaultEdgeOptions:V,onConnect:v,hasDefaultEdges:K}=L.getState(),X={...V,...S};if(K){let{edges:I,setEdges:a}=L.getState();a(F9(X,I))}v?.(X),y?.(X)},P=(S)=>{if(!N)return;let V=_9(S.nativeEvent);if(n&&(V&&S.button===0||!V)){let v=L.getState();xA.onPointerDown(S.nativeEvent,{handleDomNode:S.currentTarget,autoPanOnConnect:v.autoPanOnConnect,connectionMode:v.connectionMode,connectionRadius:v.connectionRadius,domNode:v.domNode,nodeLookup:v.nodeLookup,lib:v.lib,isTarget:w,handleId:U,nodeId:N,flowId:v.rfId,panBy:v.panBy,cancelConnection:v.cancelConnection,onConnectStart:v.onConnectStart,onConnectEnd:(...K)=>L.getState().onConnectEnd?.(...K),updateConnection:v.updateConnection,onConnect:D,isValidConnection:r||((...K)=>L.getState().isValidConnection?.(...K)??!0),getTransform:()=>L.getState().transform,getFromHandle:()=>L.getState().connection.fromHandle,autoPanSpeed:v.autoPanSpeed,dragThreshold:v.connectionDragThreshold})}if(V)A?.(S);else F?.(S)},E=(S)=>{let{onClickConnectStart:V,onClickConnectEnd:v,connectionClickStartHandle:K,connectionMode:X,isValidConnection:I,lib:a,rfId:R,nodeLookup:nl,connection:d}=L.getState();if(!N||!K&&!n)return;if(!K){V?.(S.nativeEvent,{nodeId:N,handleId:U,handleType:l}),L.setState({connectionClickStartHandle:{nodeId:N,type:l,id:U}});return}let h=c9(S.target),rl=r||I,{connection:_l,isValid:Al}=xA.isValid(S.nativeEvent,{handle:{nodeId:N,id:U,type:l},connectionMode:X,fromNodeId:K.nodeId,fromHandleId:K.id||null,fromType:K.type,isValidConnection:rl,flowId:R,doc:h,lib:a,nodeLookup:nl});if(Al&&_l)D(_l);let Ll=structuredClone(d);delete Ll.inProgress,Ll.toPosition=Ll.toHandle?Ll.toHandle.position:null,v?.(S,Ll),L.setState({connectionClickStartHandle:null})};return il.jsx("div",{"data-handleid":U,"data-nodeid":N,"data-handlepos":u,"data-id":`${q}-${N}-${U}-${l}`,className:xu(["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&&(!B||z)&&(B||Y?t:n)}]),onMouseDown:P,onTouchStart:P,onClick:Q?E:void 0,ref:J,...j,children:c})}var c0=$l.memo(xq(sS));function MS({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 RS({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 xS(){return null}function bS({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 IA={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}},zq={input:MS,default:RS,output:bS,group:xS};function vS(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 gS=(l)=>{let{width:u,height:r,x:f,y:n}=Sy(l.nodeLookup,{filter:(t)=>!!t.selected});return{width:Sf(u)?u:null,height:Sf(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 kS({onSelectionContextMenu:l,noPanClassName:u,disableKeyboardA11y:r}){let f=Zu(),{width:n,height:t,transformString:i,userSelectionActive:y}=yu(gS,pu),c=gq(),_=$l.useRef(null);$l.useEffect(()=>{if(!r)_.current?.focus({preventScroll:!0})},[r]);let A=!y&&n!==null&&t!==null;if(vq({nodeRef:_,disabled:!A}),!A)return null;let F=l?(J)=>{let U=f.getState().nodes.filter((w)=>w.selected);l(J,U)}:void 0,j=(J)=>{if(Object.prototype.hasOwnProperty.call(IA,J.key))J.preventDefault(),c({direction:IA[J.key],factor:J.shiftKey?4:1})};return il.jsx("div",{className:xu(["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 Oq=typeof window<"u"?window:void 0,IS=(l)=>{return{nodesSelectionActive:l.nodesSelectionActive,userSelectionActive:l.userSelectionActive}};function Iq({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:J,multiSelectionKeyCode:U,panActivationKeyCode:w,zoomActivationKeyCode:L,elementsSelectable:N,zoomOnScroll:Q,zoomOnPinch:m,panOnScroll:q,panOnScrollSpeed:W,panOnScrollMode:p,zoomOnDoubleClick:O,panOnDrag:z,defaultViewport:B,translateExtent:Y,minZoom:H,maxZoom:D,preventScrolling:P,onSelectionContextMenu:E,noWheelClassName:S,noPanClassName:V,disableKeyboardA11y:v,onViewportChange:K,isControlledViewport:X}){let{nodesSelectionActive:I,userSelectionActive:a}=yu(IS,pu),R=i$(_,{target:Oq}),nl=i$(w,{target:Oq}),d=nl||z,h=nl||q,rl=A&&d!==!0,_l=R||a||rl;return OS({deleteKeyCode:c,multiSelectionKeyCode:U}),il.jsx(BS,{onPaneContextMenu:t,elementsSelectable:N,zoomOnScroll:Q,zoomOnPinch:m,panOnScroll:h,panOnScrollSpeed:W,panOnScrollMode:p,zoomOnDoubleClick:O,panOnDrag:!R&&d,defaultViewport:B,translateExtent:Y,minZoom:H,maxZoom:D,zoomActivationKeyCode:L,preventScrolling:P,noWheelClassName:S,noPanClassName:V,onViewportChange:K,isControlledViewport:X,paneClickDistance:y,selectionOnDrag:rl,children:il.jsxs(YS,{onSelectionStart:j,onSelectionEnd:J,onPaneClick:u,onPaneMouseEnter:r,onPaneMouseMove:f,onPaneMouseLeave:n,onPaneContextMenu:t,onPaneScroll:i,panOnDrag:d,isSelecting:!!_l,selectionMode:F,selectionKeyPressed:R,paneClickDistance:y,selectionOnDrag:rl,children:[l,I&&il.jsx(kS,{onSelectionContextMenu:E,noPanClassName:V,disableKeyboardA11y:v})]})})}Iq.displayName="FlowRenderer";var aS=$l.memo(Iq),oS=(l)=>(u)=>{return l?SA(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 dS(l){return yu($l.useCallback(oS(l),[l]),pu)}var eS=(l)=>l.updateNodeInternals;function lV(){let l=yu(eS),[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 uV({node:l,nodeType:u,hasDimensions:r,resizeObserver:f}){let n=Zu(),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,J=c.current!==l.targetPosition;if(F||j||J)_.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 rV({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:J,disableKeyboardA11y:U,rfId:w,nodeTypes:L,nodeClickDistance:N,onError:Q}){let{node:m,internals:q,isParent:W}=yu((Al)=>{let Ll=Al.nodeLookup.get(l),Ql=Al.parentLookup.has(l);return{node:Ll,internals:Ll.internals,isParent:Ql}},pu),p=m.type||"default",O=L?.[p]||zq[p];if(O===void 0)Q?.("003",wf.error003(p)),p="default",O=L?.default||zq.default;let z=!!(m.draggable||y&&typeof m.draggable>"u"),B=!!(m.selectable||c&&typeof m.selectable>"u"),Y=!!(m.connectable||_&&typeof m.connectable>"u"),H=!!(m.focusable||A&&typeof m.focusable>"u"),D=Zu(),P=t9(m),E=uV({node:m,nodeType:p,hasDimensions:P,resizeObserver:F}),S=vq({nodeRef:E,disabled:m.hidden||!z,noDragClassName:j,handleSelector:m.dragHandle,nodeId:l,isSelectable:B,nodeClickDistance:N}),V=gq();if(m.hidden)return null;let v=On(m),K=vS(m),X=B||z||u||r||f||n,I=r?(Al)=>r(Al,{...q.userNode}):void 0,a=f?(Al)=>f(Al,{...q.userNode}):void 0,R=n?(Al)=>n(Al,{...q.userNode}):void 0,nl=t?(Al)=>t(Al,{...q.userNode}):void 0,d=i?(Al)=>i(Al,{...q.userNode}):void 0,h=(Al)=>{let{selectNodesOnDrag:Ll,nodeDragThreshold:Ql}=D.getState();if(B&&(!Ll||!z||Ql>0))W9({id:l,store:D,nodeRef:E});if(u)u(Al,{...q.userNode})},rl=(Al)=>{if($9(Al.nativeEvent)||U)return;if(kF.includes(Al.key)&&B){let Ll=Al.key==="Escape";W9({id:l,store:D,unselect:Ll,nodeRef:E})}else if(z&&m.selected&&Object.prototype.hasOwnProperty.call(IA,Al.key)){Al.preventDefault();let{ariaLabelConfig:Ll}=D.getState();D.setState({ariaLiveMessage:Ll["node.a11yDescription.ariaLiveMessage"]({direction:Al.key.replace("Arrow","").toLowerCase(),x:~~q.positionAbsolute.x,y:~~q.positionAbsolute.y})}),V({direction:IA[Al.key],factor:Al.shiftKey?4:1})}},_l=()=>{if(U||!E.current?.matches(":focus-visible"))return;let{transform:Al,width:Ll,height:Ql,autoPanOnNodeFocus:pl,setCenter:s}=D.getState();if(!pl)return;if(!(SA(new Map([[l,m]]),{x:0,y:0,width:Ll,height:Ql},Al,!0).length>0))s(m.position.x+v.width/2,m.position.y+v.height/2,{zoom:Al[2]})};return il.jsx("div",{className:xu(["react-flow__node",`react-flow__node-${p}`,{[J]:z},m.className,{selected:m.selected,selectable:B,parent:W,draggable:z,dragging:S}]),ref:E,style:{zIndex:q.z,transform:`translate(${q.positionAbsolute.x}px,${q.positionAbsolute.y}px)`,pointerEvents:X?"all":"none",visibility:P?"visible":"hidden",...m.style,...K},"data-id":l,"data-testid":`rf__node-${l}`,onMouseEnter:I,onMouseMove:a,onMouseLeave:R,onContextMenu:nl,onClick:h,onDoubleClick:d,onKeyDown:H?rl:void 0,tabIndex:H?0:void 0,onFocus:H?_l:void 0,role:m.ariaRole??(H?"group":void 0),"aria-roledescription":"node","aria-describedby":U?void 0:`${hq}-${w}`,"aria-label":m.ariaLabel,...m.domAttributes,children:il.jsx(PS,{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:B,draggable:z,deletable:m.deletable??!0,isConnectable:Y,sourcePosition:m.sourcePosition,targetPosition:m.targetPosition,dragging:S,dragHandle:m.dragHandle,zIndex:q.z,parentId:m.parentId,...v})})})}var fV=$l.memo(rV),nV=(l)=>({nodesDraggable:l.nodesDraggable,nodesConnectable:l.nodesConnectable,nodesFocusable:l.nodesFocusable,elementsSelectable:l.elementsSelectable,onError:l.onError});function aq(l){let{nodesDraggable:u,nodesConnectable:r,nodesFocusable:f,elementsSelectable:n,onError:t}=yu(nV,pu),i=dS(l.onlyRenderVisibleElements),y=lV();return il.jsx("div",{className:"react-flow__nodes",style:dA,children:i.map((c)=>{return il.jsx(fV,{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)})})}aq.displayName="NodeRenderer";var tV=$l.memo(aq);function iV(l){return yu($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&&Yw({sourceNode:t,targetNode:i,width:r.width,height:r.height,transform:r.transform}))f.push(n.id)}return f},[l]),pu)}var yV=({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"})},cV=({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"})},Zq={[ot.Arrow]:yV,[ot.ArrowClosed]:cV};function $V(l){let u=Zu();return $l.useMemo(()=>{if(!Object.prototype.hasOwnProperty.call(Zq,l))return u.getState().onError?.("009",wf.error009(l)),null;return Zq[l]},[l])}var _V=({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=$V(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})})},oq=({defaultColor:l,rfId:u})=>{let r=yu((t)=>t.edges),f=yu((t)=>t.defaultEdgeOptions),n=$l.useMemo(()=>{return Pw(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(_V,{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))})})};oq.displayName="MarkerDefinitions";var AV=$l.memo(oq);function dq({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}),J=xu(["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:J,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]})}dq.displayName="EdgeText";var FV=$l.memo(dq);function sy({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:xu(["react-flow__edge-path",A.className])}),_?il.jsx("path",{d:l,fill:"none",strokeOpacity:0,strokeWidth:_,className:"react-flow__edge-interaction"}):null,f&&Sf(u)&&Sf(r)?il.jsx(FV,{x:u,y:r,label:f,labelStyle:n,labelShowBg:t,labelBgStyle:i,labelBgPadding:y,labelBgBorderRadius:c}):null]})}function Hq({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 eq({sourceX:l,sourceY:u,sourcePosition:r=Ol.Bottom,targetX:f,targetY:n,targetPosition:t=Ol.Top}){let[i,y]=Hq({pos:r,x1:l,y1:u,x2:f,y2:n}),[c,_]=Hq({pos:t,x1:f,y1:n,x2:l,y2:u}),[A,F,j,J]=PA({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,J]}function lL(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:J,style:U,markerEnd:w,markerStart:L,interactionWidth:N})=>{let[Q,m,q]=eq({sourceX:r,sourceY:f,sourcePosition:i,targetX:n,targetY:t,targetPosition:y}),W=l.isInternal?void 0:u;return il.jsx(sy,{id:W,path:Q,labelX:m,labelY:q,label:c,labelStyle:_,labelShowBg:A,labelBgStyle:F,labelBgPadding:j,labelBgBorderRadius:J,style:U,markerEnd:w,markerStart:L,interactionWidth:N})})}var jV=lL({isInternal:!1}),uL=lL({isInternal:!0});jV.displayName="SimpleBezierEdge";uL.displayName="SimpleBezierEdgeInternal";function rL(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:J=Ol.Bottom,targetPosition:U=Ol.Top,markerEnd:w,markerStart:L,pathOptions:N,interactionWidth:Q})=>{let[m,q,W]=t$({sourceX:r,sourceY:f,sourcePosition:J,targetX:n,targetY:t,targetPosition:U,borderRadius:N?.borderRadius,offset:N?.offset,stepPosition:N?.stepPosition}),p=l.isInternal?void 0:u;return il.jsx(sy,{id:p,path:m,labelX:q,labelY:W,label:i,labelStyle:y,labelShowBg:c,labelBgStyle:_,labelBgPadding:A,labelBgBorderRadius:F,style:j,markerEnd:w,markerStart:L,interactionWidth:Q})})}var fL=rL({isInternal:!1}),nL=rL({isInternal:!0});fL.displayName="SmoothStepEdge";nL.displayName="SmoothStepEdgeInternal";function tL(l){return $l.memo(({id:u,...r})=>{let f=l.isInternal?void 0:u;return il.jsx(fL,{...r,id:f,pathOptions:$l.useMemo(()=>({borderRadius:0,offset:r.pathOptions?.offset}),[r.pathOptions?.offset])})})}var NV=tL({isInternal:!1}),iL=tL({isInternal:!0});NV.displayName="StepEdge";iL.displayName="StepEdgeInternal";function yL(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:J,markerStart:U,interactionWidth:w})=>{let[L,N,Q]=hA({sourceX:r,sourceY:f,targetX:n,targetY:t}),m=l.isInternal?void 0:u;return il.jsx(sy,{id:m,path:L,labelX:N,labelY:Q,label:i,labelStyle:y,labelShowBg:c,labelBgStyle:_,labelBgPadding:A,labelBgBorderRadius:F,style:j,markerEnd:J,markerStart:U,interactionWidth:w})})}var JV=yL({isInternal:!1}),cL=yL({isInternal:!0});JV.displayName="StraightEdge";cL.displayName="StraightEdgeInternal";function $L(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:J,style:U,markerEnd:w,markerStart:L,pathOptions:N,interactionWidth:Q})=>{let[m,q,W]=CA({sourceX:r,sourceY:f,sourcePosition:i,targetX:n,targetY:t,targetPosition:y,curvature:N?.curvature}),p=l.isInternal?void 0:u;return il.jsx(sy,{id:p,path:m,labelX:q,labelY:W,label:c,labelStyle:_,labelShowBg:A,labelBgStyle:F,labelBgPadding:j,labelBgBorderRadius:J,style:U,markerEnd:w,markerStart:L,interactionWidth:Q})})}var UV=$L({isInternal:!1}),_L=$L({isInternal:!0});UV.displayName="BezierEdge";_L.displayName="BezierEdgeInternal";var Bq={default:_L,straight:cL,step:iL,smoothstep:nL,simplebezier:uL},Dq={sourceX:null,sourceY:null,targetX:null,targetY:null,sourcePosition:null,targetPosition:null},QV=(l,u,r)=>{if(r===Ol.Left)return l-u;if(r===Ol.Right)return l+u;return l},mV=(l,u,r)=>{if(r===Ol.Top)return l-u;if(r===Ol.Bottom)return l+u;return l},Sq="react-flow__edgeupdater";function Vq({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:xu([Sq,`${Sq}-${y}`]),cx:QV(u,f,l),cy:mV(r,f,l),r:f,stroke:"transparent",fill:"transparent"})}function wV({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:J}){let U=Zu(),w=(q,W)=>{if(q.button!==0)return;let{autoPanOnConnect:p,domNode:O,connectionMode:z,connectionRadius:B,lib:Y,onConnectStart:H,cancelConnection:D,nodeLookup:P,rfId:E,panBy:S,updateConnection:V}=U.getState(),v=W.type==="target",K=(a,R)=>{j(!1),F?.(a,r,W.type,R)},X=(a)=>_?.(r,a),I=(a,R)=>{j(!0),A?.(q,r,W.type),H?.(a,R)};xA.onPointerDown(q.nativeEvent,{autoPanOnConnect:p,connectionMode:z,connectionRadius:B,domNode:O,handleId:W.id,nodeId:W.nodeId,nodeLookup:P,isTarget:v,edgeUpdaterType:W.type,lib:Y,flowId:E,cancelConnection:D,panBy:S,isValidConnection:(...a)=>U.getState().isValidConnection?.(...a)??!0,onConnect:X,onConnectStart:I,onConnectEnd:(...a)=>U.getState().onConnectEnd?.(...a),onReconnectEnd:K,updateConnection:V,getTransform:()=>U.getState().transform,getFromHandle:()=>U.getState().connection.fromHandle,dragThreshold:U.getState().connectionDragThreshold,handleDomNode:q.currentTarget})},L=(q)=>w(q,{nodeId:r.target,id:r.targetHandle??null,type:"target"}),N=(q)=>w(q,{nodeId:r.source,id:r.sourceHandle??null,type:"source"}),Q=()=>J(!0),m=()=>J(!1);return il.jsxs(il.Fragment,{children:[(l===!0||l==="source")&&il.jsx(Vq,{position:y,centerX:f,centerY:n,radius:u,onMouseDown:L,onMouseEnter:Q,onMouseOut:m,type:"source"}),(l===!0||l==="target")&&il.jsx(Vq,{position:c,centerX:t,centerY:i,radius:u,onMouseDown:N,onMouseEnter:Q,onMouseOut:m,type:"target"})]})}function qV({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:J,rfId:U,edgeTypes:w,noPanClassName:L,onError:N,disableKeyboardA11y:Q}){let m=yu((s)=>s.edgeLookup.get(l)),q=yu((s)=>s.defaultEdgeOptions);m=q?{...q,...m}:m;let W=m.type||"default",p=w?.[W]||Bq[W];if(p===void 0)N?.("011",wf.error011(W)),W="default",p=w?.default||Bq.default;let O=!!(m.focusable||u&&typeof m.focusable>"u"),z=typeof F<"u"&&(m.reconnectable||r&&typeof m.reconnectable>"u"),B=!!(m.selectable||f&&typeof m.selectable>"u"),Y=$l.useRef(null),[H,D]=$l.useState(!1),[P,E]=$l.useState(!1),S=Zu(),{zIndex:V,sourceX:v,sourceY:K,targetX:X,targetY:I,sourcePosition:a,targetPosition:R}=yu($l.useCallback((s)=>{let e=s.nodeLookup.get(m.source),fl=s.nodeLookup.get(m.target);if(!e||!fl)return{zIndex:m.zIndex,...Dq};let k=Xw({id:l,sourceNode:e,targetNode:fl,sourceHandle:m.sourceHandle||null,targetHandle:m.targetHandle||null,connectionMode:s.connectionMode,onError:N});return{zIndex:Vw({selected:m.selected,zIndex:m.zIndex,sourceNode:e,targetNode:fl,elevateOnSelect:s.elevateEdgesOnSelect,zIndexMode:s.zIndexMode}),...k||Dq}},[m.source,m.target,m.sourceHandle,m.targetHandle,m.selected,m.zIndex]),pu),nl=$l.useMemo(()=>m.markerStart?`url('#${sA(m.markerStart,U)}')`:void 0,[m.markerStart,U]),d=$l.useMemo(()=>m.markerEnd?`url('#${sA(m.markerEnd,U)}')`:void 0,[m.markerEnd,U]);if(m.hidden||v===null||K===null||X===null||I===null)return null;let h=(s)=>{let{addSelectedEdges:e,unselectNodesAndEdges:fl,multiSelectionActive:k}=S.getState();if(B)if(S.setState({nodesSelectionActive:!1}),m.selected&&k)fl({nodes:[],edges:[m]}),Y.current?.blur();else e([l]);if(n)n(s,m)},rl=t?(s)=>{t(s,{...m})}:void 0,_l=i?(s)=>{i(s,{...m})}:void 0,Al=y?(s)=>{y(s,{...m})}:void 0,Ll=c?(s)=>{c(s,{...m})}:void 0,Ql=_?(s)=>{_(s,{...m})}:void 0,pl=(s)=>{if(!Q&&kF.includes(s.key)&&B){let{unselectNodesAndEdges:e,addSelectedEdges:fl}=S.getState();if(s.key==="Escape")Y.current?.blur(),e({edges:[m]});else fl([l])}};return il.jsx("svg",{style:{zIndex:V},children:il.jsxs("g",{className:xu(["react-flow__edge",`react-flow__edge-${W}`,m.className,L,{selected:m.selected,animated:m.animated,inactive:!B&&!n,updating:H,selectable:B}]),onClick:h,onDoubleClick:rl,onContextMenu:_l,onMouseEnter:Al,onMouseMove:Ll,onMouseLeave:Ql,onKeyDown:O?pl: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?`${sq}-${U}`:void 0,ref:Y,...m.domAttributes,children:[!P&&il.jsx(p,{id:l,source:m.source,target:m.target,type:m.type,selected:m.selected,animated:m.animated,selectable:B,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:a,targetPosition:R,data:m.data,style:m.style,sourceHandleId:m.sourceHandle,targetHandleId:m.targetHandle,markerStart:nl,markerEnd:d,pathOptions:"pathOptions"in m?m.pathOptions:void 0,interactionWidth:m.interactionWidth}),z&&il.jsx(wV,{edge:m,isReconnectable:z,reconnectRadius:A,onReconnect:F,onReconnectStart:j,onReconnectEnd:J,sourceX:v,sourceY:K,targetX:X,targetY:I,sourcePosition:a,targetPosition:R,setUpdateHover:D,setReconnecting:E})]})})}var LV=$l.memo(qV),GV=(l)=>({edgesFocusable:l.edgesFocusable,edgesReconnectable:l.edgesReconnectable,elementsSelectable:l.elementsSelectable,connectionMode:l.connectionMode,onError:l.onError});function AL({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:J,onReconnectEnd:U,disableKeyboardA11y:w}){let{edgesFocusable:L,edgesReconnectable:N,elementsSelectable:Q,onError:m}=yu(GV,pu),q=iV(u);return il.jsxs("div",{className:"react-flow__edges",children:[il.jsx(AV,{defaultColor:l,rfId:r}),q.map((W)=>{return il.jsx(LV,{id:W,edgesFocusable:L,edgesReconnectable:N,elementsSelectable:Q,noPanClassName:n,onReconnect:t,onContextMenu:i,onMouseEnter:y,onMouseMove:c,onMouseLeave:_,onClick:A,reconnectRadius:F,onDoubleClick:j,onReconnectStart:J,onReconnectEnd:U,rfId:r,onError:m,edgeTypes:f,disableKeyboardA11y:w},W)})]})}AL.displayName="EdgeRenderer";var WV=$l.memo(AL),TV=(l)=>`translate(${l.transform[0]}px,${l.transform[1]}px) scale(${l.transform[2]})`;function KV({children:l}){let u=yu(TV);return il.jsx("div",{className:"react-flow__viewport xyflow__viewport react-flow__container",style:{transform:u},children:l})}function EV(l){let u=T9(),r=$l.useRef(!1);$l.useEffect(()=>{if(!r.current&&u.viewportInitialized&&l)setTimeout(()=>l(u),1),r.current=!0},[l,u.viewportInitialized])}var pV=(l)=>l.panZoom?.syncViewport;function zV(l){let u=yu(pV),r=Zu();return $l.useEffect(()=>{if(l)u?.(l),r.setState({transform:[l.x,l.y,l.zoom]})},[l,u]),null}function Yq(l){return l.connection.inProgress?{...l.connection,to:Xy(l.connection.to,l.transform)}:{...l.connection}}function OV(l){if(l)return(r)=>{let f=Yq(r);return l(f)};return Yq}function ZV(l){let u=OV(l);return yu(u,pu)}var HV=(l)=>({nodesConnectable:l.nodesConnectable,isValid:l.connection.isValid,inProgress:l.connection.inProgress,width:l.width,height:l.height});function BV({containerStyle:l,style:u,type:r,component:f}){let{nodesConnectable:n,width:t,height:i,isValid:y,inProgress:c}=yu(HV,pu);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:xu(["react-flow__connection",oF(y)]),children:il.jsx(FL,{style:u,type:r,CustomComponent:f,isValid:y})})})}var FL=({style:l,type:u=zn.Bezier,CustomComponent:r,isValid:f})=>{let{inProgress:n,from:t,fromNode:i,fromHandle:y,fromPosition:c,to:_,toNode:A,toHandle:F,toPosition:j,pointer:J}=ZV();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:oF(f),toNode:A,toHandle:F,pointer:J});let U="",w={sourceX:t.x,sourceY:t.y,sourcePosition:c,targetX:_.x,targetY:_.y,targetPosition:j};switch(u){case zn.Bezier:[U]=CA(w);break;case zn.SimpleBezier:[U]=eq(w);break;case zn.Step:[U]=t$({...w,borderRadius:0});break;case zn.SmoothStep:[U]=t$(w);break;default:[U]=hA(w)}return il.jsx("path",{d:U,fill:"none",className:"react-flow__connection-path",style:l})};FL.displayName="ConnectionLine";var DV={};function Xq(l=DV){let u=$l.useRef(l),r=Zu();$l.useEffect(()=>{},[l])}function SV(){let l=Zu(),u=$l.useRef(!1);$l.useEffect(()=>{},[])}function jL({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:J,connectionLineType:U,connectionLineStyle:w,connectionLineComponent:L,connectionLineContainerStyle:N,selectionKeyCode:Q,selectionOnDrag:m,selectionMode:q,multiSelectionKeyCode:W,panActivationKeyCode:p,zoomActivationKeyCode:O,deleteKeyCode:z,onlyRenderVisibleElements:B,elementsSelectable:Y,defaultViewport:H,translateExtent:D,minZoom:P,maxZoom:E,preventScrolling:S,defaultMarkerColor:V,zoomOnScroll:v,zoomOnPinch:K,panOnScroll:X,panOnScrollSpeed:I,panOnScrollMode:a,zoomOnDoubleClick:R,panOnDrag:nl,onPaneClick:d,onPaneMouseEnter:h,onPaneMouseMove:rl,onPaneMouseLeave:_l,onPaneScroll:Al,onPaneContextMenu:Ll,paneClickDistance:Ql,nodeClickDistance:pl,onEdgeContextMenu:s,onEdgeMouseEnter:e,onEdgeMouseMove:fl,onEdgeMouseLeave:k,reconnectRadius:g,onReconnect:yl,onReconnectStart:Tl,onReconnectEnd:Zl,noDragClassName:vl,noWheelClassName:nu,noPanClassName:hl,disableKeyboardA11y:wu,nodeExtent:mr,rfId:Or,viewport:_r,onViewportChange:tr}){return Xq(l),Xq(u),SV(),EV(r),zV(_r),il.jsx(aS,{onPaneClick:d,onPaneMouseEnter:h,onPaneMouseMove:rl,onPaneMouseLeave:_l,onPaneContextMenu:Ll,onPaneScroll:Al,paneClickDistance:Ql,deleteKeyCode:z,selectionKeyCode:Q,selectionOnDrag:m,selectionMode:q,onSelectionStart:j,onSelectionEnd:J,multiSelectionKeyCode:W,panActivationKeyCode:p,zoomActivationKeyCode:O,elementsSelectable:Y,zoomOnScroll:v,zoomOnPinch:K,zoomOnDoubleClick:R,panOnScroll:X,panOnScrollSpeed:I,panOnScrollMode:a,panOnDrag:nl,defaultViewport:H,translateExtent:D,minZoom:P,maxZoom:E,onSelectionContextMenu:F,preventScrolling:S,noDragClassName:vl,noWheelClassName:nu,noPanClassName:hl,disableKeyboardA11y:wu,onViewportChange:tr,isControlledViewport:!!_r,children:il.jsxs(KV,{children:[il.jsx(WV,{edgeTypes:u,onEdgeClick:n,onEdgeDoubleClick:i,onReconnect:yl,onReconnectStart:Tl,onReconnectEnd:Zl,onlyRenderVisibleElements:B,onEdgeContextMenu:s,onEdgeMouseEnter:e,onEdgeMouseMove:fl,onEdgeMouseLeave:k,reconnectRadius:g,defaultMarkerColor:V,noPanClassName:hl,disableKeyboardA11y:wu,rfId:Or}),il.jsx(BV,{style:w,type:U,component:L,containerStyle:N}),il.jsx("div",{className:"react-flow__edgelabel-renderer"}),il.jsx(tV,{nodeTypes:l,onNodeClick:f,onNodeDoubleClick:t,onNodeMouseEnter:y,onNodeMouseMove:c,onNodeMouseLeave:_,onNodeContextMenu:A,nodeClickDistance:pl,onlyRenderVisibleElements:B,noPanClassName:hl,noDragClassName:vl,disableKeyboardA11y:wu,nodeExtent:mr,rfId:Or}),il.jsx("div",{className:"react-flow__viewport-portal"})]})})}jL.displayName="GraphView";var VV=$l.memo(jL),Pq=({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 J=new Map,U=new Map,w=new Map,L=new Map,N=f??u??[],Q=r??l??[],m=A??[0,0],q=F??Dy;Q9(w,L,N);let{nodesInitialized:W}=MA(Q,J,U,{nodeOrigin:m,nodeExtent:q,zIndexMode:j}),p=[0,0,1];if(i&&n&&t){let O=Sy(J,{filter:(H)=>!!((H.width||H.initialWidth)&&(H.height||H.initialHeight))}),{x:z,y:B,zoom:Y}=n$(O,n,t,c,_,y?.padding??0.1);p=[z,B,Y]}return{rfId:"1",width:n??0,height:t??0,transform:p,nodes:Q,nodesInitialized:W,nodeLookup:J,parentLookup:U,edges:N,edgeLookup:L,connectionLookup:w,onNodesChange:null,onEdgesChange:null,hasDefaultNodes:r!==void 0,hasDefaultEdges:f!==void 0,panZoom:null,minZoom:c,maxZoom:_,translateExtent:Dy,nodeExtent:q,nodesSelectionActive:!1,userSelectionActive:!1,userSelectionRect:null,connectionMode:at.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:{...aF},connectionClickStartHandle:null,connectOnClick:!0,ariaLiveMessage:"",autoPanOnConnect:!0,autoPanOnNodeDrag:!0,autoPanOnNodeFocus:!0,autoPanSpeed:15,connectionRadius:20,onError:n9,isValidConnection:void 0,onSelectionChangeHandlers:[],lib:"react",debug:!1,ariaLabelConfig:IF,zIndexMode:j,onNodesChangeMiddlewareMap:new Map,onEdgesChangeMiddlewareMap:new Map}},YV=({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})=>Jq((J,U)=>{async function w(){let{nodeLookup:L,panZoom:N,fitViewOptions:Q,fitViewResolver:m,width:q,height:W,minZoom:p,maxZoom:O}=U();if(!N)return;await Ow({nodes:L,width:q,height:W,panZoom:N,minZoom:p,maxZoom:O},Q),m?.resolve(!0),J({fitViewResolver:null})}return{...Pq({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:(L)=>{let{nodeLookup:N,parentLookup:Q,nodeOrigin:m,elevateNodesOnSelect:q,fitViewQueued:W,zIndexMode:p,nodesSelectionActive:O}=U(),{nodesInitialized:z,hasSelectedNodes:B}=MA(L,N,Q,{nodeOrigin:m,nodeExtent:F,elevateNodesOnSelect:q,checkEquality:!0,zIndexMode:p}),Y=O&&B;if(W&&z)w(),J({nodes:L,nodesInitialized:z,fitViewQueued:!1,fitViewOptions:void 0,nodesSelectionActive:Y});else J({nodes:L,nodesInitialized:z,nodesSelectionActive:Y})},setEdges:(L)=>{let{connectionLookup:N,edgeLookup:Q}=U();Q9(N,Q,L),J({edges:L})},setDefaultNodesAndEdges:(L,N)=>{if(L){let{setNodes:Q}=U();Q(L),J({hasDefaultNodes:!0})}if(N){let{setEdges:Q}=U();Q(N),J({hasDefaultEdges:!0})}},updateNodeInternals:(L)=>{let{triggerNodeChanges:N,nodeLookup:Q,parentLookup:m,domNode:q,nodeOrigin:W,nodeExtent:p,debug:O,fitViewQueued:z,zIndexMode:B}=U(),{changes:Y,updatedInternals:H}=Mw(L,Q,m,q,W,p,B);if(!H)return;if(hw(Q,m,{nodeOrigin:W,nodeExtent:p,zIndexMode:B}),z)w(),J({fitViewQueued:!1,fitViewOptions:void 0});else J({});if(Y?.length>0){if(O)console.log("React Flow: trigger node changes",Y);N?.(Y)}},updateNodePositions:(L,N=!1)=>{let Q=[],m=[],{nodeLookup:q,triggerNodeChanges:W,connection:p,updateConnection:O,onNodesChangeMiddlewareMap:z}=U();for(let[B,Y]of L){let H=q.get(B),D=!!(H?.expandParent&&H?.parentId&&Y?.position),P={id:B,type:"position",position:D?{x:Math.max(0,Y.position.x),y:Math.max(0,Y.position.y)}:Y.position,dragging:N};if(H&&p.inProgress&&p.fromNode.id===H.id){let E=dt(H,p.fromHandle,Ol.Left,!0);O({...p,from:E})}if(D&&H.parentId)Q.push({id:B,parentId:H.parentId,rect:{...Y.internals.positionAbsolute,width:Y.measured.width??0,height:Y.measured.height??0}});m.push(P)}if(Q.length>0){let{parentLookup:B,nodeOrigin:Y}=U(),H=RA(Q,q,B,Y);m.push(...H)}for(let B of z.values())m=B(m);W(m)},triggerNodeChanges:(L)=>{let{onNodesChange:N,setNodes:Q,nodes:m,hasDefaultNodes:q,debug:W}=U();if(L?.length){if(q){let p=LS(L,m);Q(p)}if(W)console.log("React Flow: trigger node changes",L);N?.(L)}},triggerEdgeChanges:(L)=>{let{onEdgesChange:N,setEdges:Q,edges:m,hasDefaultEdges:q,debug:W}=U();if(L?.length){if(q){let p=GS(L,m);Q(p)}if(W)console.log("React Flow: trigger edge changes",L);N?.(L)}},addSelectedNodes:(L)=>{let{multiSelectionActive:N,edgeLookup:Q,nodeLookup:m,triggerNodeChanges:q,triggerEdgeChanges:W}=U();if(N){let p=L.map((O)=>y0(O,!0));q(p);return}q(hy(m,new Set([...L]),!0)),W(hy(Q))},addSelectedEdges:(L)=>{let{multiSelectionActive:N,edgeLookup:Q,nodeLookup:m,triggerNodeChanges:q,triggerEdgeChanges:W}=U();if(N){let p=L.map((O)=>y0(O,!0));W(p);return}W(hy(Q,new Set([...L]))),q(hy(m,new Set,!0))},unselectNodesAndEdges:({nodes:L,edges:N}={})=>{let{edges:Q,nodes:m,nodeLookup:q,triggerNodeChanges:W,triggerEdgeChanges:p}=U(),O=L?L:m,z=N?N:Q,B=[];for(let H of O){if(!H.selected)continue;let D=q.get(H.id);if(D)D.selected=!1;B.push(y0(H.id,!1))}let Y=[];for(let H of z){if(!H.selected)continue;Y.push(y0(H.id,!1))}W(B),p(Y)},setMinZoom:(L)=>{let{panZoom:N,maxZoom:Q}=U();N?.setScaleExtent([L,Q]),J({minZoom:L})},setMaxZoom:(L)=>{let{panZoom:N,minZoom:Q}=U();N?.setScaleExtent([Q,L]),J({maxZoom:L})},setTranslateExtent:(L)=>{U().panZoom?.setTranslateExtent(L),J({translateExtent:L})},resetSelectedElements:()=>{let{edges:L,nodes:N,triggerNodeChanges:Q,triggerEdgeChanges:m,elementsSelectable:q}=U();if(!q)return;let W=N.reduce((O,z)=>z.selected?[...O,y0(z.id,!1)]:O,[]),p=L.reduce((O,z)=>z.selected?[...O,y0(z.id,!1)]:O,[]);Q(W),m(p)},setNodeExtent:(L)=>{let{nodes:N,nodeLookup:Q,parentLookup:m,nodeOrigin:q,elevateNodesOnSelect:W,nodeExtent:p,zIndexMode:O}=U();if(L[0][0]===p[0][0]&&L[0][1]===p[0][1]&&L[1][0]===p[1][0]&&L[1][1]===p[1][1])return;MA(N,Q,m,{nodeOrigin:q,nodeExtent:L,elevateNodesOnSelect:W,checkEquality:!1,zIndexMode:O}),J({nodeExtent:L})},panBy:(L)=>{let{transform:N,width:Q,height:m,panZoom:q,translateExtent:W}=U();return Rw({delta:L,panZoom:q,transform:N,translateExtent:W,width:Q,height:m})},setCenter:async(L,N,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-L*O,y:q/2-N*O,zoom:O},{duration:Q?.duration,ease:Q?.ease,interpolate:Q?.interpolate}),Promise.resolve(!0)},cancelConnection:()=>{J({connection:{...aF}})},updateConnection:(L)=>{J({connection:L})},reset:()=>J({...Pq()})}},Object.is);function XV({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:J}){let[U]=$l.useState(()=>YV({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(uS,{value:U,children:il.jsx(KS,{children:J})})}function PV({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:J}){if($l.useContext(aA))return il.jsx(il.Fragment,{children:l});return il.jsx(XV,{initialNodes:u,initialEdges:r,defaultNodes:f,defaultEdges:n,initialWidth:t,initialHeight:i,fitView:y,initialFitViewOptions:c,initialMinZoom:_,initialMaxZoom:A,nodeOrigin:F,nodeExtent:j,zIndexMode:J,children:l})}var CV={width:"100%",height:"100%",overflow:"hidden",position:"relative",zIndex:0};function hV({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:J,onConnectStart:U,onConnectEnd:w,onClickConnectStart:L,onClickConnectEnd:N,onNodeMouseEnter:Q,onNodeMouseMove:m,onNodeMouseLeave:q,onNodeContextMenu:W,onNodeDoubleClick:p,onNodeDragStart:O,onNodeDrag:z,onNodeDragStop:B,onNodesDelete:Y,onEdgesDelete:H,onDelete:D,onSelectionChange:P,onSelectionDragStart:E,onSelectionDrag:S,onSelectionDragStop:V,onSelectionContextMenu:v,onSelectionStart:K,onSelectionEnd:X,onBeforeDelete:I,connectionMode:a,connectionLineType:R=zn.Bezier,connectionLineStyle:nl,connectionLineComponent:d,connectionLineContainerStyle:h,deleteKeyCode:rl="Backspace",selectionKeyCode:_l="Shift",selectionOnDrag:Al=!1,selectionMode:Ll=n0.Full,panActivationKeyCode:Ql="Space",multiSelectionKeyCode:pl=Py()?"Meta":"Control",zoomActivationKeyCode:s=Py()?"Meta":"Control",snapToGrid:e,snapGrid:fl,onlyRenderVisibleElements:k=!1,selectNodesOnDrag:g,nodesDraggable:yl,autoPanOnNodeFocus:Tl,nodesConnectable:Zl,nodesFocusable:vl,nodeOrigin:nu=Mq,edgesFocusable:hl,edgesReconnectable:wu,elementsSelectable:mr=!0,defaultViewport:Or=NS,minZoom:_r=0.5,maxZoom:tr=2,translateExtent:ir=Dy,preventScrolling:Rr=!0,nodeExtent:Nl,defaultMarkerColor:ol="#b1b1b7",zoomOnScroll:wr=!0,zoomOnPinch:sl=!0,panOnScroll:Cu=!1,panOnScrollSpeed:eu=0.5,panOnScrollMode:tf=nt.Free,zoomOnDoubleClick:Ar=!0,panOnDrag:Zr=!0,onPaneClick:Vn,onPaneMouseEnter:yf,onPaneMouseMove:ct,onPaneMouseLeave:Fu,onPaneScroll:A0,onPaneContextMenu:tl,paneClickDistance:Dl=1,nodeClickDistance:Cl=0,children:dl,onReconnect:Nu,onReconnectStart:gu,onReconnectEnd:Au,onEdgeContextMenu:qr,onEdgeDoubleClick:hf,onEdgeMouseEnter:oy,onEdgeMouseMove:Tu,onEdgeMouseLeave:W$,reconnectRadius:K8=10,onNodesChange:ju,onEdgesChange:Uj,noDragClassName:hu="nodrag",noWheelClassName:Hr="nowheel",noPanClassName:F0="nopan",fitView:dy,fitViewOptions:j0,connectOnClick:T$,attributionPosition:ey,proOptions:K$,defaultEdgeOptions:E$,elevateNodesOnSelect:Ai=!0,elevateEdgesOnSelect:N0=!1,disableKeyboardA11y:Fi=!1,autoPanOnConnect:xr,autoPanOnNodeDrag:Wf,autoPanSpeed:p$,connectionRadius:J0,isValidConnection:lc,onError:z$,style:$n,id:uc,nodeDragThreshold:zu,connectionDragThreshold:E8,viewport:p8,onViewportChange:O$,width:sf,height:ji,colorMode:Ni="light",debug:U0,onScroll:$t,ariaLabelConfig:rc,zIndexMode:z8="basic",...Ji},Qj){let Q0=uc||"1",O8=mS(Ni),Z8=$l.useCallback((Z$)=>{Z$.currentTarget.scrollTo({top:0,left:0,behavior:"instant"}),$t?.(Z$)},[$t]);return il.jsx("div",{"data-testid":"rf__wrapper",...Ji,onScroll:Z8,style:{...$n,...CV},ref:Qj,className:xu(["react-flow",n,O8]),id:uc,role:"application",children:il.jsxs(PV,{nodes:l,edges:u,width:sf,height:ji,fitView:dy,fitViewOptions:j0,minZoom:_r,maxZoom:tr,nodeOrigin:nu,nodeExtent:Nl,zIndexMode:z8,children:[il.jsx(QS,{nodes:l,edges:u,defaultNodes:r,defaultEdges:f,onConnect:J,onConnectStart:U,onConnectEnd:w,onClickConnectStart:L,onClickConnectEnd:N,nodesDraggable:yl,autoPanOnNodeFocus:Tl,nodesConnectable:Zl,nodesFocusable:vl,edgesFocusable:hl,edgesReconnectable:wu,elementsSelectable:mr,elevateNodesOnSelect:Ai,elevateEdgesOnSelect:N0,minZoom:_r,maxZoom:tr,nodeExtent:Nl,onNodesChange:ju,onEdgesChange:Uj,snapToGrid:e,snapGrid:fl,connectionMode:a,translateExtent:ir,connectOnClick:T$,defaultEdgeOptions:E$,fitView:dy,fitViewOptions:j0,onNodesDelete:Y,onEdgesDelete:H,onDelete:D,onNodeDragStart:O,onNodeDrag:z,onNodeDragStop:B,onSelectionDrag:S,onSelectionDragStart:E,onSelectionDragStop:V,onMove:A,onMoveStart:F,onMoveEnd:j,noPanClassName:F0,nodeOrigin:nu,rfId:Q0,autoPanOnConnect:xr,autoPanOnNodeDrag:Wf,autoPanSpeed:p$,onError:z$,connectionRadius:J0,isValidConnection:lc,selectNodesOnDrag:g,nodeDragThreshold:zu,connectionDragThreshold:E8,onBeforeDelete:I,debug:U0,ariaLabelConfig:rc,zIndexMode:z8}),il.jsx(VV,{onInit:_,onNodeClick:y,onEdgeClick:c,onNodeMouseEnter:Q,onNodeMouseMove:m,onNodeMouseLeave:q,onNodeContextMenu:W,onNodeDoubleClick:p,nodeTypes:t,edgeTypes:i,connectionLineType:R,connectionLineStyle:nl,connectionLineComponent:d,connectionLineContainerStyle:h,selectionKeyCode:_l,selectionOnDrag:Al,selectionMode:Ll,deleteKeyCode:rl,multiSelectionKeyCode:pl,panActivationKeyCode:Ql,zoomActivationKeyCode:s,onlyRenderVisibleElements:k,defaultViewport:Or,translateExtent:ir,minZoom:_r,maxZoom:tr,preventScrolling:Rr,zoomOnScroll:wr,zoomOnPinch:sl,zoomOnDoubleClick:Ar,panOnScroll:Cu,panOnScrollSpeed:eu,panOnScrollMode:tf,panOnDrag:Zr,onPaneClick:Vn,onPaneMouseEnter:yf,onPaneMouseMove:ct,onPaneMouseLeave:Fu,onPaneScroll:A0,onPaneContextMenu:tl,paneClickDistance:Dl,nodeClickDistance:Cl,onSelectionContextMenu:v,onSelectionStart:K,onSelectionEnd:X,onReconnect:Nu,onReconnectStart:gu,onReconnectEnd:Au,onEdgeContextMenu:qr,onEdgeDoubleClick:hf,onEdgeMouseEnter:oy,onEdgeMouseMove:Tu,onEdgeMouseLeave:W$,reconnectRadius:K8,defaultMarkerColor:ol,noDragClassName:hu,noWheelClassName:Hr,noPanClassName:F0,rfId:Q0,disableKeyboardA11y:Fi,nodeExtent:Nl,viewport:p8,onViewportChange:O$}),il.jsx(jS,{onSelectionChange:P}),dl,il.jsx(cS,{proOptions:K$,position:ey}),il.jsx(yS,{rfId:Q0,disableKeyboardA11y:Fi})]})})}var NL=xq(hV);var bv=wf.error014();function sV({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:xu(["react-flow__background-pattern",r,f])})}function MV({radius:l,className:u}){return il.jsx("circle",{cx:l,cy:l,r:l,className:xu(["react-flow__background-pattern","dots",u])})}var li;(function(l){l.Lines="lines",l.Dots="dots",l.Cross="cross"})(li||(li={}));var RV={[li.Dots]:1,[li.Lines]:1,[li.Cross]:6},xV=(l)=>({transform:l.transform,patternId:`pattern-${l.rfId}`});function JL({id:l,variant:u=li.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:J}=yu(xV,pu),U=f||RV[u],w=u===li.Dots,L=u===li.Cross,N=Array.isArray(r)?r:[r,r],Q=[N[0]*j[2]||1,N[1]*j[2]||1],m=U*j[2],q=Array.isArray(t)?t:[t,t],W=L?[m,m]:Q,p=[q[0]*j[2]||1+W[0]/2,q[1]*j[2]||1+W[1]/2],O=`${J}${l?l:""}`;return il.jsxs("svg",{className:xu(["react-flow__background",_]),style:{...c,...dA,"--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(MV,{radius:m/2,className:A}):il.jsx(sV,{dimensions:W,lineWidth:n,variant:u,className:A})}),il.jsx("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:`url(#${O})`})]})}JL.displayName="Background";var UL=$l.memo(JL);function bV(){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 vV(){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 gV(){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 kV(){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 IV(){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 kA({children:l,className:u,...r}){return il.jsx("button",{type:"button",className:xu(["react-flow__controls-button",u]),...r,children:l})}var aV=(l)=>({isInteractive:l.nodesDraggable||l.nodesConnectable||l.elementsSelectable,minZoomReached:l.transform[2]<=l.minZoom,maxZoomReached:l.transform[2]>=l.maxZoom,ariaLabelConfig:l.ariaLabelConfig});function QL({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":J}){let U=Zu(),{isInteractive:w,minZoomReached:L,maxZoomReached:N,ariaLabelConfig:Q}=yu(aV,pu),{zoomIn:m,zoomOut:q,fitView:W}=T9(),p=()=>{m(),t?.()},O=()=>{q(),i?.()},z=()=>{W(n),y?.()},B=()=>{U.setState({nodesDraggable:!w,nodesConnectable:!w,elementsSelectable:!w}),c?.(!w)};return il.jsxs(oA,{className:xu(["react-flow__controls",j==="horizontal"?"horizontal":"vertical",_]),position:F,style:l,"data-testid":"rf__controls","aria-label":J??Q["controls.ariaLabel"],children:[u&&il.jsxs(il.Fragment,{children:[il.jsx(kA,{onClick:p,className:"react-flow__controls-zoomin",title:Q["controls.zoomIn.ariaLabel"],"aria-label":Q["controls.zoomIn.ariaLabel"],disabled:N,children:il.jsx(bV,{})}),il.jsx(kA,{onClick:O,className:"react-flow__controls-zoomout",title:Q["controls.zoomOut.ariaLabel"],"aria-label":Q["controls.zoomOut.ariaLabel"],disabled:L,children:il.jsx(vV,{})})]}),r&&il.jsx(kA,{className:"react-flow__controls-fitview",onClick:z,title:Q["controls.fitView.ariaLabel"],"aria-label":Q["controls.fitView.ariaLabel"],children:il.jsx(gV,{})}),f&&il.jsx(kA,{className:"react-flow__controls-interactive",onClick:B,title:Q["controls.interactive.ariaLabel"],"aria-label":Q["controls.interactive.ariaLabel"],children:w?il.jsx(IV,{}):il.jsx(kV,{})}),A]})}QL.displayName="Controls";var mL=$l.memo(QL);function oV({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:J}){let{background:U,backgroundColor:w}=t||{},L=i||U||w;return il.jsx("rect",{className:xu(["react-flow__minimap-node",{selected:j},_]),x:u,y:r,rx:A,ry:A,width:f,height:n,style:{fill:L,stroke:y,strokeWidth:c},shapeRendering:F,onClick:J?(N)=>J(N,l):void 0})}var dV=$l.memo(oV),eV=(l)=>l.nodes.map((u)=>u.id),L9=(l)=>l instanceof Function?l:()=>l;function lY({nodeStrokeColor:l,nodeColor:u,nodeClassName:r="",nodeBorderRadius:f=5,nodeStrokeWidth:n,nodeComponent:t=dV,onClick:i}){let y=yu(eV,pu),c=L9(u),_=L9(l),A=L9(r),F=typeof window>"u"||!!window.chrome?"crispEdges":"geometricPrecision";return il.jsx(il.Fragment,{children:y.map((j)=>il.jsx(rY,{id:j,nodeColorFunc:c,nodeStrokeColorFunc:_,nodeClassNameFunc:A,nodeBorderRadius:f,nodeStrokeWidth:n,NodeComponent:t,onClick:i,shapeRendering:F},j))})}function uY({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:J}=yu((U)=>{let w=U.nodeLookup.get(l);if(!w)return{node:void 0,x:0,y:0,width:0,height:0};let L=w.internals.userNode,{x:N,y:Q}=w.internals.positionAbsolute,{width:m,height:q}=On(L);return{node:L,x:N,y:Q,width:m,height:q}},pu);if(!_||_.hidden||!t9(_))return null;return il.jsx(y,{x:A,y:F,width:j,height:J,style:_.style,selected:!!_.selected,className:f(_),color:u(_),borderRadius:n,strokeColor:r(_),strokeWidth:t,shapeRendering:i,onClick:c,id:_.id})}var rY=$l.memo(uY),fY=$l.memo(lY),nY=200,tY=150,iY=(l)=>!l.hidden,yY=(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?r9(Sy(l.nodeLookup,{filter:iY}),u):u,rfId:l.rfId,panZoom:l.panZoom,translateExtent:l.translateExtent,flowWidth:l.width,flowHeight:l.height,ariaLabelConfig:l.ariaLabelConfig}},cY="react-flow__minimap-desc";function wL({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:J,onNodeClick:U,pannable:w=!1,zoomable:L=!1,ariaLabel:N,inversePan:Q,zoomStep:m=1,offsetScale:q=5}){let W=Zu(),p=$l.useRef(null),{boundingRect:O,viewBB:z,rfId:B,panZoom:Y,translateExtent:H,flowWidth:D,flowHeight:P,ariaLabelConfig:E}=yu(yY,pu),S=l?.width??nY,V=l?.height??tY,v=O.width/S,K=O.height/V,X=Math.max(v,K),I=X*S,a=X*V,R=q*X,nl=O.x-(I-O.width)/2-R,d=O.y-(a-O.height)/2-R,h=I+R*2,rl=a+R*2,_l=`${cY}-${B}`,Al=$l.useRef(0),Ll=$l.useRef();Al.current=X,$l.useEffect(()=>{if(p.current&&Y)return Ll.current=aw({domNode:p.current,panZoom:Y,getTransform:()=>W.getState().transform,getViewScale:()=>Al.current}),()=>{Ll.current?.destroy()}},[Y]),$l.useEffect(()=>{Ll.current?.update({translateExtent:H,width:D,height:P,inversePan:Q,pannable:w,zoomStep:m,zoomable:L})},[w,L,Q,m,H,D,P]);let Ql=J?(e)=>{let[fl,k]=Ll.current?.pointer(e)||[0,0];J(e,{x:fl,y:k})}:void 0,pl=U?$l.useCallback((e,fl)=>{let k=W.getState().nodeLookup.get(fl).internals.userNode;U(e,k)},[]):void 0,s=N??E["minimap.ariaLabel"];return il.jsx(oA,{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:xu(["react-flow__minimap",u]),"data-testid":"rf__minimap",children:il.jsxs("svg",{width:S,height:V,viewBox:`${nl} ${d} ${h} ${rl}`,className:"react-flow__minimap-svg",role:"img","aria-labelledby":_l,ref:p,onClick:Ql,children:[s&&il.jsx("title",{id:_l,children:s}),il.jsx(fY,{onClick:pl,nodeColor:f,nodeStrokeColor:r,nodeBorderRadius:t,nodeClassName:n,nodeStrokeWidth:i,nodeComponent:y}),il.jsx("path",{className:"react-flow__minimap-mask",d:`M${nl-R},${d-R}h${h+R*2}v${rl+R*2}h${-h-R*2}z + M${z.x},${z.y}h${z.width}v${z.height}h${-z.width}z`,fillRule:"evenodd",pointerEvents:"none"})]})})}wL.displayName="MiniMap";var vv=$l.memo(wL),$Y=(l)=>(u)=>l?`${Math.max(1/u.transform[2],1)}`:void 0,_Y={[et.Line]:"right",[et.Handle]:"bottom-right"};function AY({nodeId:l,position:u,variant:r=et.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:J=!0,shouldResize:U,onResizeStart:w,onResize:L,onResizeEnd:N}){let Q=kq(),m=typeof l==="string"?l:Q,q=Zu(),W=$l.useRef(null),p=r===et.Handle,O=yu($l.useCallback($Y(p&&J),[p,J]),pu),z=$l.useRef(null),B=u??_Y[r];$l.useEffect(()=>{if(!W.current||!m)return;if(!z.current)z.current=uq({domNode:W.current,nodeId:m,getStoreItems:()=>{let{nodeLookup:H,transform:D,snapGrid:P,snapToGrid:E,nodeOrigin:S,domNode:V}=q.getState();return{nodeLookup:H,transform:D,snapGrid:P,snapToGrid:E,nodeOrigin:S,paneDomNode:V}},onChange:(H,D)=>{let{triggerNodeChanges:P,nodeLookup:E,parentLookup:S,nodeOrigin:V}=q.getState(),v=[],K={x:H.x,y:H.y},X=E.get(m);if(X&&X.expandParent&&X.parentId){let I=X.origin??V,a=H.width??X.measured.width??0,R=H.height??X.measured.height??0,nl={id:X.id,parentId:X.parentId,rect:{width:a,height:R,...i9({x:H.x??X.position.x,y:H.y??X.position.y},{width:a,height:R},X.parentId,E,I)}},d=RA([nl],E,S,V);v.push(...d),K.x=H.x?Math.max(I[0]*a,H.x):void 0,K.y=H.y?Math.max(I[1]*R,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 a={id:m,type:"dimensions",resizing:!0,setAttributes:!j?!0:j==="horizontal"?"width":"height",dimensions:{width:H.width,height:H.height}};v.push(a)}for(let I of D){let a={...I,type:"position"};v.push(a)}P(v)},onEnd:({width:H,height:D})=>{let P={id:m,type:"dimensions",resizing:!1,dimensions:{width:H,height:D}};q.getState().triggerNodeChanges([P])}});return z.current.update({controlPosition:B,boundaries:{minWidth:y,minHeight:c,maxWidth:_,maxHeight:A},keepAspectRatio:F,resizeDirection:j,onResizeStart:w,onResize:L,onResizeEnd:N,shouldResize:U}),()=>{z.current?.destroy()}},[B,y,c,_,A,F,w,L,N,U]);let Y=B.split("-");return il.jsx("div",{className:xu(["react-flow__resize-control","nodrag",...Y,r,f]),ref:W,style:{...n,scale:O,...i&&{[p?"backgroundColor":"borderColor"]:i}},children:t})}var gv=$l.memo(AY);var T=ni.default.createElement,{useEffect:Bn}=ni.default,uf=ni.default.useState,fi=ni.default.useRef,F$=[{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%"}}],$$=[{id:"out-right",position:Ol.Right,style:{top:"50%"}}],qL=["#4eb7a8","#d7a13a","#69aee8","#e0835f","#b7d86b","#d98bd2","#5fc6bf"],Ry=236,xy=88,LL=15000,FY=10,E9=96,Zn=72,p9=64,GL=12;function eA(){return typeof document>"u"||document.visibilityState!=="hidden"}function WL(l,u){let r=Number.parseFloat(String(l||""));return Number.isFinite(r)?r/100:u}function jY(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 l8(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} ${J.x},${J.y}`,f=J}let n=u[u.length-1];return`${r} L ${n.x},${n.y}`}function sL(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 N=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+N},${u+Q} ${r-N},${f} ${r},${f}`}if(y){let N=l+A;if(n===Ol.Top||n===Ol.Bottom){let q=n===Ol.Top?-1:1,W=f+q*(54+F*0.42);return l8([{x:l,y:u},{x:N,y:u},{x:N+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 l8([{x:l,y:u},{x:N,y:u},{x:N+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),L=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 l8([{x:l,y:u},{x:l+A,y:u},{x:w,y:L},{x:r,y:L},{x:r,y:f+U*38},{x:r,y:f}]);return l8([{x:l,y:u},{x:l+A,y:u},{x:w,y:L},{x:r-A,y:L},{x:r-A,y:f},{x:r,y:f}])}function NY({data:l}){return T("div",{className:"pipeline-flow-node-body"},F$.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})),$$.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 JY({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=sL(u,r,f,n,t,A,String(_?.routeMode||""));return T(sy,{id:l,path:F,markerEnd:i,markerStart:y,style:c,interactionWidth:28})}var UY={pipelineCurve:JY},QY={pipelineNode:NY};function n8(l){if(!l)return"--";let u=new Date(l);if(Number.isNaN(u.getTime()))return"--";return tu(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 z9(l){let u=Number(l);if(!Number.isFinite(u))return"--";return u.toLocaleString("zh-CN")}function TL(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 Vl(l){return Array.isArray(l)?l:[]}function al(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 U$(...l){for(let u of l){let r=al(u);if(r!==null)return new Date(r).toISOString()}return""}function R9(...l){let u=l.map(al).filter((r)=>r!==null);return u.length>0?new Date(Math.max(...u)).toISOString():""}function x9(l){return["succeeded","failed","skipped","cancelled","canceled","completed"].includes(String(l||"").toLowerCase())}function ML(l){let u=bL(l).toLowerCase();return["running","active","in-progress","in_progress"].includes(u)}function KL(l,u="status"){return l.reduce((r,f)=>{let n=String(f?.[u]||"unknown").toLowerCase();return r[n]=(r[n]||0)+1,r},{})}function RL(l){if(!l||typeof l!=="string")return null;try{let u=JSON.parse(l);return Xl(u)?u:null}catch{return null}}function O9(l){let u=l.map(RL).filter((t)=>Boolean(t)),r=u.flatMap((t)=>[t.timestamp,t.createdAt,t.updatedAt]).filter(Boolean),f=R9(...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 t8(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 xL(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 bL(l){if(typeof l==="string")return l;if(Xl(l))return String(l.status||l.state||l.phase||"unknown");return"unknown"}function mY(l){return l.filter((u)=>u&&u.value!==void 0&&u.value!==null&&String(u.value)!=="")}function V9({items:l}){let u=mY(Vl(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 b9({items:l}){let u=Vl(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 Y9(l,u){let r=String(u?.procedureRunId||""),f=Vl(l?.procedureRuns);return f.find((n)=>String(Pf(n))===r)||f.at(-1)||null}function wY(l,u){let r=String(u||"");if(!r)return null;return Vl(l?.procedureRuns).find((f)=>Pf(f)===r)||null}function Z9(l){return Vl(l?.attempts).length}function EL(l){return Vl(l?.attempts).reduce((u,r)=>u+F8(r).length,0)}function F8(l){return Vl(l?.opencodeMessages?.steps).filter(Xl)}function vL(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 qY(l,u){let r=P9(l.map((t)=>t?.agent)).slice(0,3),f=P9(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 _$(l,u=0){return String(l?.messageId||l?.index||"")||`step-${u}`}function LY({steps:l,sessionIds:u,sessionFacts:r,matchedStepKey:f}){let n=Vl(l),t=n.findIndex((L,N)=>_$(L,N)===f),i=t>=0?n[t]:null,y=n.flatMap((L)=>[al(L?.createdAt),al(L?.completedAt)]).filter((L)=>L!==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((L,N)=>L+Vl(N?.parts).filter((Q)=>String(Q?.type||"").toLowerCase()==="tool").length,0),j=n.reduce((L,N)=>L+Vl(N?.parts).filter((Q)=>["text","reasoning"].includes(String(Q?.type||"").toLowerCase())).length,0),J=n.reduce((L,N)=>L+Vl(N?.parts).filter((Q)=>String(Q?.type||"").toLowerCase()==="tool"&&vL(Q)==="failed").length,0),U=[`${n.length} steps`,`${u.length} sessions`,`${j} messages`,`${F} tools`,A!==null?`duration ${Xf(A)}`:"",J>0?`${J} 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(b9,{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,`${n8(i?.createdAt)} -> ${n8(i?.completedAt)}`)):null,T(J3,{port:uQ,input:n,className:"codex-transcript pipeline-trace",testId:"pipeline-opencode-step-trace",emptyText:"暂无 OpenCode Trace 输出",keepRecentToolCalls:3}))}function X9(l){return Vl(l).flatMap((u)=>{if(Xl(u))return[u];let r=RL(u);return r?[r]:[]})}function yn(l){return String(l?.event||l?.action||l?.requestedAction||l?.type||"").toLowerCase()}function My(l){return U$(l?.timestamp,l?.createdAt,l?.updatedAt,l?.startedAt,l?.finishedAt)}function GY(l){return al(My(l))}function j8(l){return String(l?.attempt||l?.id||"")}function P9(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 pL(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 A$(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 zL(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`${A$(l)} 已发起`;case"control-command-applied":return`${A$(l)} 已生效`;case"control-command-ignored":return`${A$(l)} 已忽略`;default:return String(l?.event||l?.action||l?.requestedAction||"event")}}function OL(l){return xL(l?.promptPreview||l?.reasonPreview||l?.prompt||l?.reason||"",240)}function WY(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,Vl(l?.resetNodeIds).length>0?{label:"reset nodes",value:Vl(l.resetNodeIds).join(", ")}:null,Vl(l?.runningResetNodeIds).length>0?{label:"interrupted running nodes",value:Vl(l.runningResetNodeIds).join(", ")}:null,Vl(l?.interruptedProcedureRunIds).length>0?{label:"interrupted procedures",value:Vl(l.interruptedProcedureRunIds).join(", ")}:null,l?.interruptedProcedureRunId?{label:"interrupted procedure",value:String(l.interruptedProcedureRunId)}:null].filter(Boolean)}function H9(l){let u=F8(l),r=u.map((c)=>al(c?.createdAt)).filter((c)=>c!==null),f=u.map((c)=>al(c?.completedAt)??al(c?.createdAt)).filter((c)=>c!==null),n=X9(l?.controlEventRecords).map((c)=>GY(c)).filter((c)=>c!==null),t=Vl(l?.assistantOutputs).map((c)=>al(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 TY(l,u,r,f,n=""){let t=Vl(l?.procedureRuns).filter((y)=>N8(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=al(u8(y,l)),_=al(r8(y,l))??c;return c!==null&&_!==null&&f>=c-1000&&f<=_+1000});if(i)return i;return t.slice().sort((y,c)=>{let _=al(u8(y,l))??f,A=al(r8(y,l))??_,F=al(u8(c,l))??f,j=al(r8(c,l))??F,J=Math.min(Math.abs(_-f),Math.abs(A-f)),U=Math.min(Math.abs(F-f),Math.abs(j-f));return J-U})[0]||null}function gL(l,u){let r=Vl(l?.attempts).filter(Xl);if(r.length===0)return null;let f=String(u?.attempt||"");if(f){let i=r.find((y)=>j8(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=H9(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=H9(i),_=H9(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 kL(l,u){let r=F8(l);if(r.length===0)return{step:null,stepIndex:-1,stepKey:""};if(u===null){let t=r[0];return{step:t,stepIndex:0,stepKey:_$(t,0)}}for(let t=0;t=y-1000&&u<=c+1000)return{step:i,stepIndex:t,stepKey:_$(i,t)}}let f=r.findIndex((t)=>{let i=al(t?.createdAt)??al(t?.completedAt);return i!==null&&i>=u});if(f>=0){let t=r[f];return{step:t,stepIndex:f,stepKey:_$(t,f)}}let n=Math.max(0,r.length-1);return{step:r[n],stepIndex:n,stepKey:_$(r[n],n)}}function KY(l,u){let r=String(u?.runId||l?.runId||"");if(String(u?.mode||"")==="interval"){let _=u?.interval||{},A=Y9(l,_)||_.raw||{};return{mode:"interval",runId:r,interval:_,marker:null,nodeId:String(_?.nodeId||N8(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?TY(l,r,t,n,String(f?.procedureRunId||"")):null,y=i?gL(i,f):null,c=y?kL(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 EY({procedure:l,matchedStepKey:u="",matchedAttemptId:r=""}){let f=Vl(l?.attempts);if(f.length===0)return T(Lf,{title:"暂无 attempt 详情",text:"当前 procedure 还没有可展示的 attempt / OpenCode Trace;若刚点击甘特线,请等待 node 详情抓取完成。"});return f.map((n,t)=>{let i=n?.opencodeMessages||{},y=F8(n),c=Vl(i.sessionIds).map((j)=>String(j)).filter(Boolean),_=qY(y,c),A=j8(n)||`attempt-${t+1}`,F=y.reduce((j,J)=>j+Vl(J?.parts).filter((U)=>String(U?.type||"").toLowerCase()==="tool"&&vL(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(V9,{items:[{label:"messages",value:i.messageCount??"--"},{label:"steps",value:i.stepCount??"--"},{label:"tools",value:i.toolCallCount??"--"},{label:"updated",value:Gl(i.updatedAt)},{label:"sessions",value:c.join(", ")||"--"}]}),y.length===0?T("p",{className:"muted paragraph"},"当前 attempt 尚未返回 OpenCode Trace;请确认 D601 pipeline-control 已重建并重新抓取。"):T(LY,{steps:y,sessionIds:c,sessionFacts:_,matchedStepKey:u}))})}function B9(l,u){return`${l}::${u}`}function i8(l,u,r){if(!Xl(l))return null;return String(l.runId||"")===u&&String(l.nodeId||"")===r?l:null}function pY(l,u){let r=Xl(l)?l:{};if(!Xl(u))return r;let f=Vl(u.attempts),n=Vl(r.attempts);return{...r,...u,attempts:f.length>0?f:n}}function zY(l,u,r,f){if(!i8(u,r,f))return l;let n=Vl(u.procedureRuns),t=Xl(l)?l:{};return{...t,...u,controlEvents:Vl(u.controlEvents).length>0?u.controlEvents:t.controlEvents,procedureRuns:n.length>0?n:t.procedureRuns}}function OY({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(fu,{title:"未选择元素",level:3})),T("button",{type:"button",className:"ghost-btn mini",onClick:t,"data-testid":"pipeline-gantt-sidebar-collapse"},"收起")),T(Lf,{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,_=i8(r,i,y),A=String(f?.runId||"")===i&&String(f?.nodeId||"")===y,F=zY(c,_,i,y),j=(String(u?.runId||"")!==i||Boolean(u?.loading))&&!F,J=String(u?.runId||"")===i?String(u?.error||""):"",U=A?String(f?.error||""):"",w=F?KY(F,l):null,L=w?.interval||l?.interval||null,N=w?.marker||l?.marker||null,Q=String(L?.procedureRunId||N?.procedureRunId||""),m=_?wY(_,Q)||Y9(_,L||{procedureRunId:Q}):null,q=w?.procedure||(F?Y9(F,L||{procedureRunId:Q}):null)||L?.raw||{};if(m&&(Z9(q)===0||EL(m)>=EL(q)))q=pY(q,m);let W=w?.attempt||null,p=String(w?.matchedStepKey||"");if(!W&&N&&Z9(q)>0)W=gL(q,N),p=String(kL(W,Number.isFinite(Number(N?.ms))?Number(N.ms):null).stepKey||"");let O=j8(W),z=Z9(q)>0,B=A&&Boolean(f?.loading)&&!z,Y=Boolean(j||B),H=[z?"":J,U].filter(Boolean).join(" / "),D=A&&f?.fetchedAt?f.fetchedAt:u?.fetchedAt,P=bL(q?.status||L?.status||N?.status||N?.event),E=l?.mode==="event"?N?.label||zL(N?.raw||N)||"event":w?.nodeId||L?.nodeId||"node",S=N?WY(N?.raw||N):[],V=N?[yn(N?.raw||N)?`event ${yn(N?.raw||N)}`:"",N?.promptEvent?`prompt ${N.promptEvent}`:"",N?.action?`action ${N.action}`:"",N?.sourceKind?`source ${pL(N.sourceKind)}`:"",N?.sourceNodeId?`from ${N.sourceNodeId}`:"",N?.targetNodeId?`to ${N.targetNodeId}`:"",N?.snapReason?`draw ${N.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(fu,{title:E,level:3,loading:Y})),T("div",{className:"pipeline-gantt-detail-head-actions"},T(ti,{status:P},P),T("button",{type:"button",className:"ghost-btn mini",onClick:t,"data-testid":"pipeline-gantt-sidebar-collapse"},"收起"))),N?T("article",{className:"pipeline-event-card"},T("div",{className:"pipeline-event-card-head"},T("strong",null,N?.label||zL(N?.raw||N)),T(b9,{items:V})),T(V9,{items:[{label:"event time",value:Gl(N?.timestampIso||N?.timestamp||"--")},N?.snapped?{label:"drawn time",value:Gl(N?.renderedTimestampIso||N?.ms)}:null,{label:"node",value:N?.nodeId||"--"},{label:"procedure",value:N?.procedureRunId||Pf(q)||"--"},{label:"attempt",value:N?.attempt||O||"--"},{label:"source kind",value:N?.sourceKind?pL(N.sourceKind):"--"},{label:"source node",value:N?.sourceNodeId||"--"},{label:"target node",value:N?.targetNodeId||"--"},{label:"command",value:N?.commandId||N?.eventId||"--"},N?.snapReason?{label:"placement",value:N.snapReason}:null]}),S.length>0?T("div",{className:"pipeline-event-blocks"},S.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,OL(N?.raw||N)?T("p",{className:"pipeline-text-preview"},OL(N?.raw||N)):null):null,T(V9,{items:[{label:"epoch",value:i||L?.runId||"--"},{label:"node",value:w?.nodeId||L?.nodeId||N?.nodeId||"--"},{label:"procedure",value:L?.procedureRunId||N?.procedureRunId||Pf(q)||"--"},{label:"started",value:Gl(L?.startedAt||q?.startedAt)},{label:"finished",value:Gl(L?.finishedAt||q?.finishedAt)},{label:"duration",value:Xf(L?.durationMs||q?.durationMs)},{label:"fetched",value:D?tu(D):"--"},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 ${L?.procedureRunId||N?.procedureRunId||w?.nodeId||"node"}`,data:q,onOpen:n,testId:"raw-pipeline-gantt-procedure"}),N?T(cn,{title:`Pipeline event ${N?.id||N?.commandId||N?.eventId||w?.nodeId||"event"}`,data:N?.raw||N,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),!Y&&!Pf(q)&&!N?T(Lf,{title:"暂无过程详情",text:"当前选择还没有可匹配的 procedure 运行记录。"}):null,!Y&&Pf(q)?T(EY,{procedure:q,matchedStepKey:p,matchedAttemptId:O}):null)}function ZY({value:l}){let r=String(l||"--").split(/([_-])/u);return T(ni.default.Fragment,null,r.map((f,n)=>f==="-"||f==="_"?T(ni.default.Fragment,{key:n},f,T("wbr",null)):T(ni.default.Fragment,{key:n},f)))}async function ui(l,u={}){return El(l,{invalidJsonPrefix:"Pipeline 返回了无效 JSON",...u})}function ti({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return T("span",{className:`status-badge ${r}`},u||l||"unknown")}function Mr({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 Hn({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(fu,{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=Vl(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 Lf({title:l,text:u}){return T("div",{className:"empty-state"},T("strong",null,l),T("span",null,u))}function HY(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function BY(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function DY(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function SY(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 ZL(l,u,r){let f=l?._unidesk?.arrayLimits?.[u],n=Number(f?.originalLength);return Number.isFinite(n)?n:r}function IL(l){if(!l||typeof l!=="object"||Array.isArray(l))return"--";return`${l.componentClass||"--"}/${l.id||"--"}`}function y8(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 v9(l){return l?.config&&typeof l.config==="object"&&!Array.isArray(l.config)?l.config:{}}function aL(l){let u=v9(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=g9(l),t=(i)=>{if(i&&!f.has(i))f.set(i,{id:i})};for(let i of k9(l))N$(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 g9(l){let u=v9(l);return Array.isArray(u.edges)?u.edges:Array.isArray(l?.edges)?l.edges:[]}function k9(l){let u=v9(l);return Array.isArray(u.topologicalBatches)?u.topologicalBatches:Array.isArray(l?.topologicalBatches)?l.topologicalBatches:[]}function VY(l){let u=new Map;for(let r of l){let f=y8(r);if(f)u.set(f,r);let n=Array.isArray(r?.refs)?r.refs:[];for(let t of n){let i=y8(t);if(i)u.set(i,r)}}return u}function HL(l,u){let r=u.get(y8(l?.componentRef));if(r)return r;let f=y8({componentClass:l?.kind,id:l?.id});return f?u.get(f)||null:null}function BL(l,u){let r=oL(l,u);return String(r?.status||"pending")}function oL(l,u){return(Array.isArray(l?.nodes)?l.nodes:[]).find((f)=>f?.nodeId===u||f?.id===u)||null}function YY(l){return l.reduce((u,r)=>{let f=String(r?.status||"unknown").toLowerCase();return u[f]=(u[f]||0)+1,u},{})}function XY(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 PY(l){if(Xl(l?.run))return l.run;if(Xl(l?.runSummary))return l.runSummary;return null}function CY(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 c8(l){let u=XY(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 C9(l){let u=c8(l);return u.text||(u.scorers.length>0?String(u.scorer?.status||"pending"):"--")}function I9(l){let u=c8(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 hY(l){return Array.isArray(l?.items)?l.items.filter(Xl):[]}function sY({run:l}){let u=C9(l);return T("span",{className:`pipeline-score-badge ${I9(l)}`},`score ${u}`)}function MY({run:l,onRaw:u}){let f=c8(l).scorers;if(!l)return T(Lf,{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=c8({scorers:[n]}),y=hY(n),c=i.percent??0;return T("article",{key:`${n.scorerId||n.component||t}`,className:`pipeline-score-card ${I9({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(ti,{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"},xL(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 RY(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 N$(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 N$(l.nodes);if(Array.isArray(l?.nodeIds))return N$(l.nodeIds);return[]}function xY(l){return Xl(l?.instanceInputs?.monitor)?l.instanceInputs.monitor:{}}function dL(l,u){if(String(l?.kind||"").toLowerCase()!=="procedure")return!1;let r=xY(l);if(l?.instanceInputs?.monitorMode===!0||r.enabled===!0)return!0;let f=IL(l?.componentRef);return String(u?.id||u?.config?.id||f||"").toLowerCase().includes("monitor")}function bY(l){return l.filter((u)=>dL(u)).map((u)=>String(u?.id||"")).filter(Boolean)}function vY(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 gY(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 kY(l,u,r){let n=k9(l).map(N$).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 J=String(j?.from||j?.source||""),U=String(j?.to||j?.target||"");if(!i.has(J)||!i.has(U))continue;c.get(J)?.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(),J=(_.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,J)),(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,J)=>t.filter((U)=>_.get(U)===J)).filter((j)=>j.length>0)}function IY(l,u,r){let n=k9(l).map(N$).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 L=String(w?.from||w?.source||""),N=String(w?.to||w?.target||"");if(!c.has(L)||!c.has(N))continue;F.get(L)?.push(N),A.set(N,(A.get(N)||0)+1)}let j=new Map,J=y.filter((w)=>(A.get(w)||0)===0);for(let w of J)j.set(w,0);while(J.length>0){let w=J.shift(),L=(j.get(w)||0)+1;for(let N of F.get(w)||[])if(A.set(N,Math.max(0,(A.get(N)||0)-1)),j.set(N,Math.max(j.get(N)||0,L)),(A.get(N)||0)===0)J.push(N)}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,L)=>y.filter((N)=>j.get(N)===L)).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 vY(t,bY(u))}function y$(l){return`${l.source}->${l.target}-${l.index}`}function DL(l,u,r){let f=aL(l),n=g9(l),t=VY(r),i=new Map(f.map((P)=>[String(P?.id||""),P])),y=f.filter((P)=>dL(P,HL(P,t))).map((P)=>String(P?.id||"")).filter(Boolean),c=gY(kY(l,f,n),y),_=[],A=new Map,F=330,j=122;c.forEach((P,E)=>{let S=P.length*122;P.forEach((V,v)=>{let K=i.get(V)||{id:V},X=HL(K,t),I=BL(u,V).toLowerCase(),a=String(K.kind||X?.componentClass||"node").toLowerCase(),R=IL(K.componentRef||X),nl=String(X?.config?.version||X?.version||""),d=String(X?.config?.description||X?.description||""),h=v*122-Math.floor(S/2);A.set(V,{column:E,row:v,y:h}),_.push({id:V,type:"pipelineNode",position:{x:E*330,y:h},data:{exportLabel:{id:V,kind:a,componentRef:R,componentVersion:nl,componentDescription:d,status:I},label:T("div",{className:"flow-node-label"},T("strong",null,V),T("span",null,a),T("code",{title:d||R},nl?`${R}@${nl}`:R),T(ti,{status:I},I))},className:`pipeline-flow-node ${a} ${I}`})})});let J=n.flatMap((P,E)=>{let S=String(P?.from||P?.source||""),V=String(P?.to||P?.target||"");if(!i.has(S)||!i.has(V))return[];return[{source:S,target:V,index:E,condition:P?.condition,edgeType:P?.edgeType}]}),U=J.reduce((P,E)=>P.set(E.source,(P.get(E.source)||0)+1),new Map),w=J.reduce((P,E)=>P.set(E.target,(P.get(E.target)||0)+1),new Map),L=J.reduce((P,E)=>{let S=`${E.source}->${E.target}`;return P.set(S,(P.get(S)||0)+1)},new Map),N=new Map,Q=new Map,m=new Map,q=new Map,W=new Map,p=new Map,O=J.reduce((P,E)=>{let S=A.get(E.source),V=A.get(E.target),v=(V?.column||0)-(S?.column||0);if(v<=0||String(E.edgeType||"").toLowerCase()==="rework"||v!==1)return P;let X=`${E.source}->column:${V?.column??""}`,I=P.get(X)||[];return I.push(E),P.set(X,I),P},new Map);for(let P of O.values()){if(P.length<2)continue;P.slice().sort((E,S)=>{let V=A.get(E.target),v=A.get(S.target);return(V?.y||0)-(v?.y||0)||E.index-S.index}).forEach((E,S,V)=>{p.set(y$(E),{slot:S-(V.length-1)/2,count:V.length})})}[...J].sort((P,E)=>{let S=A.get(P.source),V=A.get(P.target),v=A.get(E.source),K=A.get(E.target),X=Math.abs((V?.column||0)-(S?.column||0))*330+Math.abs((V?.y||0)-(S?.y||0)),I=Math.abs((K?.column||0)-(v?.column||0))*330+Math.abs((K?.y||0)-(v?.y||0));return X-I||P.index-E.index}).forEach((P)=>{let E=A.get(P.source)||{column:0,row:0,y:0},S=A.get(P.target)||{column:0,row:0,y:0},V=S.column-E.column,v=Math.max(0,V),K=V<=0||String(P.edgeType||"").toLowerCase()==="rework",X=E.y-S.y,I=w.get(P.target)||1,a=p.has(y$(P)),R=!K&&v<=1&&(a||I===1),nl=W.get(P.target)||new Map;W.set(P.target,nl);let d=F$.slice().sort((h,rl)=>{let _l=(pl)=>{let s=String(pl.side),e=0;if(K){if(s==="left")e+=86;if(s==="top")e+=S.y<=0?-22:12;if(s==="bottom")e+=S.y>=0?-22:12;if(Math.abs(S.y)<12&&s!=="left")e+=P.index%2===0?s==="top"?-6:6:s==="bottom"?-6:6;return e}if(R){if(s==="left")e-=a?72:44;if(s!=="left")e+=a?72:44;return e+Math.abs(X)*0.02}if(s==="left")e+=v<=1?0:24;if(s==="top")e+=X<-36?-18:42;if(s==="bottom")e+=X>36?-18:42;if(v<=1&&Math.abs(X)<=82&&s!=="left")e+=38;if(v>1&&s!=="left")e-=10;return e},Al=E.y-S.y,Ll=Al!==0?Al:P.index%2===0?-1:1,Ql=(pl)=>{let s=nl.get(pl.id)||0;return _l(pl)+s*64+jY(pl,nl,Ll)};return Ql(h)-Ql(rl)||String(h.id).localeCompare(String(rl.id))})[0];nl.set(d.id,(nl.get(d.id)||0)+1),q.set(y$(P),d)});let B=J.map((P)=>{let E=BL(u,P.target).toLowerCase(),S=`${P.source}->${P.target}`,V=N.get(P.source)||0,v=Q.get(P.target)||0,K=m.get(S)||0;N.set(P.source,V+1),Q.set(P.target,v+1),m.set(S,K+1);let X=V-((U.get(P.source)||1)-1)/2,I=v-((w.get(P.target)||1)-1)/2,a=K-((L.get(S)||1)-1)/2,R=A.get(P.source),nl=A.get(P.target),d=(nl?.column||0)-(R?.column||0),h=Math.max(1,Math.abs(d)),rl=d<=0||String(P.edgeType||"").toLowerCase()==="rework",_l=Math.abs((nl?.y||0)-(R?.y||0)),Al=p.get(y$(P)),Ll=!rl&&d===1&&(w.get(P.target)||0)>1,Ql=Al?Al.slot:a*2+X+I*0.45,pl=Ql===0?P.index%2===0?-1:1:Math.sign(Ql),s=q.get(y$(P))||F$[1],e=s.side==="top"?-1:s.side==="bottom"?1:pl,fl=rl||h>1||_l>96||Math.abs(Ql)>0.2||s.side!=="left",k=rl?118+h*18:22+h*16,g=s.side==="left"?0:28,yl=fl?Math.max(-280,Math.min(280,e*Math.min(180,k+g+_l*0.22)+Ql*28)):0,Tl=Math.max(0,Math.min($$.length-1,Math.round(X+($$.length-1)/2))),Zl=$$[Tl]||$$[1],vl=E==="succeeded"?"var(--accent-2)":E==="running"?"var(--accent)":E==="failed"?"var(--danger)":"rgba(129, 147, 159, 0.78)",nu=R?.column||0,hl=nl?.column||0,wu=yl===0?0:Math.sign(yl),mr=rl?`feedback:${nu}->${hl}:${wu}`:Al?`fanout:${nu}->${hl}:${P.source}`:Ll?`fanin:${nu}->${hl}:${P.target}`:s.side!=="left"||h>1?`corridor:${nu}->${hl}:${s.side}:${wu}:${Math.round(Math.abs(yl)/56)}`:"";return{id:`${P.source}->${P.target}-${P.index}`,source:P.source,target:P.target,sourceHandle:Zl.id,targetHandle:s.id,type:"pipelineCurve",zIndex:12,animated:E==="running",data:{baseEdgeColor:vl,laneOffset:yl,routeMode:Al&&s.side==="left"?"direct-forward-left":"",targetSide:s.side,isFeedback:rl,overlapGroup:mr},targetStatus:E}}),Y=B.reduce((P,E)=>{let S=String(E.data?.overlapGroup||"");return S?P.set(S,(P.get(S)||0)+1):P},new Map),H=new Map,D=B.map((P)=>{let E=String(P.targetStatus||"pending"),S={...P};delete S.targetStatus;let V=String(P.data?.overlapGroup||""),v=V?Y.get(V)||0:0,K=v>1?H.get(V)||0:-1;if(v>1)H.set(V,K+1);let X=K>=0?qL[K%qL.length]:String(P.data.baseEdgeColor),I={stroke:X};if(P.data.isFeedback)I.strokeDasharray="9 7";return{...S,data:{...P.data,edgeColor:X,overlapSlot:K,overlapCount:v},style:I,markerEnd:{type:ot.ArrowClosed,color:X},className:`pipeline-flow-edge ${E} ${P.data.isFeedback?"feedback":""} ${K>=0?"overlap-colored":""}`}});return{nodes:_,edges:D}}function rf(l){return String(l??"").replace(/&/g,"&").replace(//g,">").replace(/"/g,""")}function SL(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 $8(l){return`arrow-${l.replace(/[^a-zA-Z0-9_-]+/g,"")}`}function eL(l,u="pipeline"){return String(l||u).replace(/[^a-zA-Z0-9_-]+/g,"-").replace(/^-|-$/g,"")||u}function VL(l,u){let r=l.position.x,f=l.position.y,n=F$.find((t)=>t.id===u);if(n?.side==="top")return{x:r+Ry*WL(n.style?.left,0.5),y:f,position:Ol.Top};if(n?.side==="bottom")return{x:r+Ry*WL(n.style?.left,0.5),y:f+xy,position:Ol.Bottom};return{x:r,y:f+xy/2,position:Ol.Left}}function aY(l){return{x:l.position.x+Ry,y:l.position.y+xy/2}}function oY(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+Ry),1)+220,t=Math.max(...l.nodes.map((w)=>w.position.y+xy),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)=>SL(w.data?.edgeColor||w.style?.stroke)),F=Array.from(new Set(["#4eb7a8","#d7a13a","#cf6a54","#81939f",..._])).map((w)=>``).join(""),j=l.edges.flatMap((w)=>{let L=c.get(w.source),N=c.get(w.target);if(!L||!N)return[];let Q=aY(L),m=VL(N,String(w.targetHandle||"in-left")),q=sL(Q.x,Q.y,m.x,m.y,m.position,Number(w.data?.laneOffset||0),String(w.data?.routeMode||"")),W=SL(w.data?.edgeColor||w.style?.stroke),p=w.data?.isFeedback?' stroke-dasharray="9 7"':"";return``}).join(` +`),J=l.nodes.map((w)=>{let L=w.data?.exportLabel||{},N=String(L.status||"pending").toLowerCase(),Q=N==="succeeded"?"#4eb7a8":N==="running"?"#d7a13a":N==="failed"?"#cf6a54":"#81939f",m=w.position.x,q=w.position.y,W=F$.map((p)=>{let O=VL(w,p.id);if(p.side==="top"||p.side==="bottom")return``;return``}).join(` `);return` - - ${T} - - ${er(L.id||W.id)} - ${er(L.kind||"node")} - ${er(L.componentRef||"--")} - ${er(J)} + + ${W} + + ${rf(L.id||w.id)} + ${rf(L.kind||"node")} + ${rf(L.componentRef||"--")} + ${rf(N)} `}).join(` -`);return{svg:` - ${j} +`);return{svg:` + ${F} - ${er(u)} - ${U}${F} - `,width:t,height:y}}function QX(l){let u=String(l||"").toLowerCase();if(u==="succeeded"||u==="completed")return"#4eb7a8";if(u==="failed")return"#cf6a54";if(JL(u))return"#69aee8";return"#d7a13a"}function wX(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 cL(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 qX(l,u,r){let f=wX(l),n=String(l?.kind||"");if(n==="control-source")return``;if(n==="control-target"){let t=String(l?.tone||"").toLowerCase()==="approve"?"rgba(78,183,168,0.22)":"#081118";return``}return``}function WX(l){let u=Sl(l.visibleNodeIds).map((z)=>String(z||"")).filter(Boolean),r=Sl(l.intervals).filter(Yl),f=Sl(l.markers).filter(Yl),n=Sl(l.arrows).filter(Yl),i=Sl(l.ticks).filter(Yl),t=Yl(l.bounds)?l.bounds:{},y=Yl(l.backendLayout)?l.backendLayout:null,c=Math.max(240,Math.round(Number(l.chartHeight||360))),$=Math.max(mn,108),A=128,j=24,F=58,U=56,N=128+Math.max(1,u.length)*$,W=Math.max(760,N+48),L=114+c+24,J=24,w=58,Q=114,q=(z)=>152+z*$,T=(z)=>q(z)+$/2,O=Sl(l.meta).map((z)=>String(z||"")).filter(Boolean).slice(0,4).join(" · "),Z=new Map(f.map((z)=>[String(z.id||""),z])),D=Array.from(new Set(["#4eb7a8","#69aee8","#d7a13a","#cf6a54","#8aa0ad",...n.map(cL)])).map((z)=>``).join(""),Y=i.map((z)=>{let P=114+DL(z,t,c,y);return` - - ${er(Wl(z.ms))} - +${er(Vf(Number(z.offsetMs??Number(z.ms)-Number(t.startMs))))} + ${rf(u)} + ${J}${j} + `,width:i,height:y}}function dY(l){let u=String(l||"").toLowerCase();if(u==="succeeded"||u==="completed")return"#4eb7a8";if(u==="failed")return"#cf6a54";if(ML(u))return"#69aee8";return"#d7a13a"}function eY(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 YL(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 lX(l,u,r){let f=eY(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 uX(l){let u=Vl(l.visibleNodeIds).map((K)=>String(K||"")).filter(Boolean),r=Vl(l.intervals).filter(Xl),f=Vl(l.markers).filter(Xl),n=Vl(l.arrows).filter(Xl),t=Vl(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(Zn,108),A=128,F=24,j=58,J=56,U=128+Math.max(1,u.length)*_,w=Math.max(760,U+48),L=114+c+24,N=24,Q=58,m=114,q=(K)=>152+K*_,W=(K)=>q(K)+_/2,p=Vl(l.meta).map((K)=>String(K||"")).filter(Boolean).slice(0,4).join(" · "),O=new Map(f.map((K)=>[String(K.id||""),K])),B=Array.from(new Set(["#4eb7a8","#69aee8","#d7a13a","#cf6a54","#8aa0ad",...n.map(YL)])).map((K)=>``).join(""),Y=t.map((K)=>{let X=114+yG(K,i,c,y);return` + + ${rf(Gl(K.ms))} + +${rf(Xf(Number(K.offsetMs??Number(K.ms)-Number(i.startMs))))} `}).join(` -`),p=['','TIME',...u.map((z,P)=>{let s=q(P),k=z.length>18?`${z.slice(0,16)}…`:z;return` - - ${er(k)} - node ${P+1} +`),H=['','TIME',...u.map((K,X)=>{let I=q(X),a=K.length>18?`${K.slice(0,16)}…`:K;return` + + ${rf(a)} + node ${X+1} `})].join(` -`),V=u.map((z,P)=>{return``}).join(` -`),B=r.map((z)=>{let P=u.indexOf(String(z.nodeId||""));if(P<0)return"";let s=114+gA(z,t,c,y),k=Math.max(2,BL(z,t,c,y)),v=QX(z.status),tl=T(P)-3.5,I=z.live?``:"",M=k>=28?`${er(String(z.status||"working"))} - ${er(Vf(z.durationMs))}`:"";return` - - ${I} - ${M} +`),D=u.map((K,X)=>{return``}).join(` +`),P=r.map((K)=>{let X=u.indexOf(String(K.nodeId||""));if(X<0)return"";let I=114+A8(K,i,c,y),a=Math.max(2,iG(K,i,c,y)),R=dY(K.status),nl=W(X)-3.5,d=K.live?``:"",h=a>=28?`${rf(String(K.status||"working"))} + ${rf(Xf(K.durationMs))}`:"";return` + + ${d} + ${h} `}).join(` -`),m=f.map((z)=>{let P=u.indexOf(String(z.nodeId||""));if(P<0)return"";let s=114+wf(z,t,c,y);return qX(z,T(P),s)}).join(` -`),X=n.map((z)=>{let P=Z.get(String(z.targetMarkerId||""));if(!P)return"";let s=Z.get(String(z.sourceMarkerId||"")),k=String(s?.nodeId||z.sourceNodeId||""),v=String(P.nodeId||z.targetNodeId||""),tl=u.indexOf(k),I=u.indexOf(v);if(tl<0||I<0)return"";let M=T(tl)-24-128,rl=T(I)-24-128,cl=Xy(y)?Xu(z.sourceY??z.y1)??(s?wf(s,t,c,y):wf(P,t,c,y)):s?wf(s,t,c,y):wf(P,t,c,y),$l=Xy(y)?Xu(z.targetY??z.y2)??wf(P,t,c,y):wf(P,t,c,y),Tl=cL(z),Ql=String(z.action||"").toLowerCase()==="observe"?"3 4":"6 5",Ol=er(VL(M,cl,rl,$l));return` - `}).join(` -`),S=u.length===0?'No visible Gantt nodes':"";return{svg:` - ${D} +`),E=f.map((K)=>{let X=u.indexOf(String(K.nodeId||""));if(X<0)return"";let I=114+qf(K,i,c,y);return lX(K,W(X),I)}).join(` +`),S=n.map((K)=>{let X=O.get(String(K.targetMarkerId||""));if(!X)return"";let I=O.get(String(K.sourceMarkerId||"")),a=String(I?.nodeId||K.sourceNodeId||""),R=String(X.nodeId||K.targetNodeId||""),nl=u.indexOf(a),d=u.indexOf(R);if(nl<0||d<0)return"";let h=W(nl)-24-128,rl=W(d)-24-128,_l=by(y)?Pu(K.sourceY??K.y1)??(I?qf(I,i,c,y):qf(X,i,c,y)):I?qf(I,i,c,y):qf(X,i,c,y),Al=by(y)?Pu(K.targetY??K.y2)??qf(X,i,c,y):qf(X,i,c,y),Ll=YL(K),Ql=String(K.action||"").toLowerCase()==="observe"?"3 4":"6 5",pl=rf(cG(h,_l,rl,Al));return` + `}).join(` +`),V=u.length===0?'No visible Gantt nodes':"";return{svg:` + ${B} - - ${er(l.title||"Pipeline Epoch Gantt")} - ${er(O)} - ${p} + + ${rf(l.title||"Pipeline Epoch Gantt")} + ${rf(p)} + ${H} - ${V} + ${D} ${Y} - ${B} - ${X} - ${m} - ${S} - `,width:W,height:L}}function kA(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 zL(l,u){let r=KL(u,"pipeline"),{svg:f,width:n,height:i}=NX(l,u),t=new Blob([f],{type:"image/svg+xml;charset=utf-8"}),y=URL.createObjectURL(t);try{let c=new Image;await new Promise((F,U)=>{c.onload=()=>F(),c.onerror=()=>U(Error("svg image load failed")),c.src=y});let $=document.createElement("canvas");$.width=n,$.height=i;let A=$.getContext("2d");if(!A)throw Error("canvas unavailable");A.drawImage(c,0,0);let j=await new Promise((F)=>$.toBlob(F,"image/png"));if(!j)throw Error("png export failed");kA(j,`${r}.png`)}catch{kA(t,`${r}.svg`)}finally{URL.revokeObjectURL(y)}}async function LX(l){let u=KL(String(l?.title||"pipeline-gantt"),"pipeline-gantt"),{svg:r,width:f,height:n}=WX(l),i=new Blob([r],{type:"image/svg+xml;charset=utf-8"}),t=URL.createObjectURL(i);try{let y=new Image;await new Promise((j,F)=>{y.onload=()=>j(),y.onerror=()=>F(Error("gantt svg image load failed")),y.src=t});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((j)=>c.toBlob(j,"image/png"));if(!A)throw Error("gantt png export failed");kA(A,`${u}.png`)}catch{kA(i,`${u}.svg`)}finally{URL.revokeObjectURL(t)}}async function GX(l){for(let u of l){if(u.flow.nodes.length===0)continue;await zL(u.flow,u.title),await new Promise((r)=>setTimeout(r,750))}}function _L(l,u){return l.find((r)=>String(r?.pipelineId||"")===u)||null}function $L(l){return al(l?.startedAt)??al(l?.artifact?.startedAt)??al(l?.request?.createdAt)??al(l?.updatedAt)??0}function TX(l,u){return l.filter((r)=>String(r?.pipelineId||"")===u).slice().sort((r,f)=>$L(r)-$L(f)||String(r?.runId||"").localeCompare(String(f?.runId||"")))}function Jj(l,u){let r=String(u?.runId||""),f=l.findIndex((t)=>String(t?.runId||"")===r),n=f>=0?f+1:l.length,i=String(u?.status||"--");return`Epoch ${n} / ${r||"--"} / ${i}`}function Sf(l){return String(l?.procedureRunId||l?.runId||"")}function oA(l,u){let r=String(l?.nodeId||l?.request?.nodeId||"");if(r)return r;let f=Sf(l),n=`${u}__`;if(f.startsWith(n))return f.slice(n.length).replace(/__\d+$/u,"");return""}function PA(l,u){let r=Yl(l?.artifact)?l.artifact:{},f=Yl(l?.request)?l.request:{};return t_(l?.startedAt,r.startedAt,f.createdAt,f.startedAt,l?.createdAt,l?.updatedAt,u?.startedAt,u?.request?.createdAt)}function CA(l,u){let r=String(l?.status?.status||l?.artifact?.status||l?.status||"").toLowerCase(),f=Yl(l?.artifact)?l.artifact:{},n=wj(r);return t_(l?.finishedAt,f.finishedAt,l?.completedAt,n?l?.updatedAt:void 0,n?f.updatedAt:void 0,n?u?.updatedAt:void 0)}function EL(l,u,r=Date.now()){let f=String(l?.runId||""),n=new Set(u.map((i)=>String(i?.id||"")).filter(Boolean));return Sl(l?.procedureRuns).flatMap((i)=>{let t=oA(i,f);if(!t)return[];let y=String(i?.status?.status||i?.artifact?.status||i?.status||"unknown").toLowerCase(),c=PA(i,l),$=al(c);if($===null)return[];let A=CA(i,l),j=al(A)??(wj(y)?al(i?.updatedAt)??$+1000:r),F=Math.max($+1000,j);return[{nodeId:t,knownNode:n.has(t),procedureRunId:Sf(i),status:y,startMs:$,endMs:F,startedAt:f_($),finishedAt:f_(F),durationMs:F-$,runId:f,raw:i}]}).sort((i,t)=>i.startMs-t.startMs||i.endMs-t.endMs||i.nodeId.localeCompare(t.nodeId))}function mX(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 j=Xu(A?.eventMs??A?.ms);if(j!==null)f.push(j),n.push(j)}let i=al(l?.startedAt)??al(l?.artifact?.startedAt)??al(l?.request?.createdAt),t=al(l?.finishedAt)??al(l?.artifact?.finishedAt)??al(l?.updatedAt);if(i!==null)f.push(i);if(t!==null)n.push(t);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 MA=12,OL=20,Uj=100,KX=!1;function r0(l){let u=Number(l);if(!Number.isFinite(u))return 0;return Math.max(0,Math.min(100,Math.round(u*100)/100))}function zX(l){let u=Math.max(MA,Number(l||MA)),r=Math.log(u/MA)/Math.log(OL);return r0(r*100)}var i_=zX(Uj);function mj(l){let u=r0(l)/100,r=MA*Math.pow(OL,u),f=u<0.24?"全局":u<0.64?"均衡":"细节";return{value:r0(u*100),pxPerMinute:r,label:f}}function yj(l){let u=Math.round(Number(l));return Math.abs(u-Uj)<=1?Uj:u}function EX(l,u=i_){let r=Math.max(1,Number(l.durationMs||0)/60000),f=mj(u);return Math.round(Math.max(360,Math.min(7200,r*Number(f.pxPerMinute||48))))}function OX(l,u=7){let r=Math.max(1,Number(l.endMs||0)-Number(l.startMs||0));return Array.from({length:u},(f,n)=>{let i=u===1?0:n/(u-1);return{ms:Number(l.startMs)+r*i,percent:i*100}})}function ZX(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 Xu(l){let u=Number(l);return Number.isFinite(u)?u:null}function Kj(l){return JL(l?.status)&&!wj(l?.status)}function ZL(l,u,r,f){let n=Math.max(1,r-u),i=Math.max(0,Math.min(1,(l-u)/n));return Number((i*f).toFixed(3))}function AL(l,u){if(!u)return null;let r=Xu(u?.startMs),f=Xu(u?.endMs),n=Xu(u?.chartHeight);if(r===null||f===null||n===null)return null;return ZL(l,r,f,n)}function pL(l,u){let r=Xu(l?.rawStartMs??l?.startMs)??Xu(l?.startMs)??u,f=Xu(l?.endMs)??r+1000;if(!Kj(l))return Math.max(r+1000,f);return Math.max(r+1000,f,u)}function pX(l,u,r,f){let n=Xu(l?.startMs)??f-60000,i=Xu(l?.endMs)??f,t=r.reduce((N,W)=>Math.max(N,pL(W,f)),i),y=Math.max(n+60000,i,t),c=Math.max(1,y-n),$={startMs:n,endMs:y,durationMs:c},A=EX($,u),j=mj(u),F=Math.max(5,Math.min(18,Math.round(A/150))),U=OX($,F).map((N)=>{let W=Number(N.ms),L=ZL(W,n,y,A);return{...N,y:L,timestamp:f_(W),offsetMs:W-n}});return{source:"frontend-y",startMs:n,endMs:y,durationMs:c,chartHeight:A,scale:r0(u),normalizedScale:Number((r0(u)/100).toFixed(3)),pxPerMinute:Number(Number(j.pxPerMinute||0).toFixed(3)),ticks:U}}function HX(l,u,r){if(!Kj(l))return l;let f=Xu(l?.rawStartMs??l?.startMs)??Xu(l?.startMs)??r,n=pL(l,r),i=AL(f,u),t=AL(n,u),y=Xu(i??l?.y1??l?.startY)??0,c=Xu(t??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:f_(n),y1:y,y2:c,startY:y,endY:c,height:$}}function zj(l,u,r){return ZX(l,u)/100*r}function Xy(l){return Boolean(l&&String(l?.source||"")!=="frontend-y")}function HL(l,u,r,f,n){if(Xy(f))for(let t of n){let y=Xu(l?.[t]);if(y!==null)return y}let i=Xu(l?.ms??l?.eventMs??l?.startMs);return zj(i??Number(u.startMs),u,r)}function gA(l,u,r,f){return HL(l,u,r,f,["y1","startY"])}function Nj(l,u,r,f){if(Xy(f)){let i=Xu(l?.y2??l?.endY);if(i!==null)return i}let n=Xu(l?.endMs)??Number(u.endMs);return zj(n,u,r)}function BL(l,u,r,f){if(Xy(f)){let i=Xu(l?.height);if(i!==null)return Math.max(1,i)}let n=l?.live?24:10;return Math.max(n,Nj(l,u,r,f)-gA(l,u,r,f))}function wf(l,u,r,f){return HL(l,u,r,f,["y","timeAxisY"])}function DL(l,u,r,f){if(Xy(f)||String(f?.source||"")==="frontend-y"){let t=Xu(l?.y);if(t!==null)return t}let n=Xu(l?.percent);if(n!==null)return n/100*r;let i=Xu(l?.ms)??Number(u.startMs);return zj(i,u,r)}function BX(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 DX(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 i=BX(n),t=String(n?.nodeId||""),y=String(n?.id||"");if(!i||!t||!y)continue;let c=[i,t,y,"observe"].join(":");if(r.has(c))continue;r.add(c),f.push({id:`observation-arrow:${y}:${i}:${t}`,commandId:String(n?.commandId||n?.eventId||y),sourceNodeId:i,targetNodeId:t,sourceMarkerId:"",targetMarkerId:y,sourceKind:"monitor",action:"observe",status:"observation"})}return{markers:l,arrows:f}}function VX(l){let u=un(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 SX(l){return Sl(l?.tags||l?.raw?.tags).map((u)=>String(u||"")).filter(Boolean)}function XX(l){let u=un(l),r=String(l?.promptEvent||"");if(u==="initial-prompt-delivered")return"初始 prompt";if(r==="node-long-running-observation")return"长任务观察";if(r==="node-finished")return SX(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 jL(l){let u=un(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 YX(l,u){let r=String(l?.commandId||"");if(r)return`command:${r}`;return["control-event",Dy(l)||t_(l?.createdAt,l?.timestamp)||`index-${u}`,String(l?.sourceKind||""),String(l?.sourceNodeId||""),String(l?.targetNodeId||""),rt(l)].join(":")}function PX(l){return jj([l?.targetNodeId,...Sl(l?.resetNodeIds)])}function CX(l,u){let r=u_(l),f=un(l),n=String(l?.targetNodeId||""),i=Boolean(n)&&u!==n;if(f==="control-command-applied")return i?`${r} 波及`:`${r} 生效`;if(f==="control-command-ignored")return`${r} 忽略`;if(f==="control-command-queued")return`${r} 已发起`;return i?`${r} 波及`:r}function MX(l){if(un(l)==="control-command-ignored")return"ignored";let r=rt(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 hX(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 RX(l,u,r,f){let n=l.filter(($)=>String($.nodeId||"")===u).sort(($,A)=>Number($.startMs)-Number(A.startMs)),i=n.find(($)=>r>=Number($.startMs)-1000&&r<=Number($.endMs)+1000);if(i)return{ms:r,onInterval:!0,snapReason:"inside-interval",procedureRunId:String(i.procedureRunId||"")};let t=rt(f),y=n.slice().reverse().find(($)=>Number($.endMs)<=r+1000);if(y&&t==="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(t))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 VL(l,u,r,f){let n=Math.hypot(r-l,f-u),i=n>gW?gW:0,t=i>0?r-(r-l)/n*i:r,y=i>0?f-(f-u)/n*i:f,c=t-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} ${t-A*$},${y} ${t},${y}`}function xX(l,u){let r=String(l?.runId||u?.runId||""),f=EL({...Yl(u)?u:{},...Yl(l)?l:{},runId:r,procedureRuns:Sl(l?.procedureRuns).length>0?l.procedureRuns:u?.procedureRuns},[]),n=[],i=[],t=[],y=new Set,c=new Map,$=(F,U)=>{if(!F.nodeId||!Number.isFinite(Number(F.ms)))return;if(y.has(F.id))return;y.add(F.id),U.push(F)};for(let F of Sl(l?.procedureRuns)){let U=oA(F,r),N=Sf(F);if(!U)continue;for(let W of Sl(F?.attempts)){let L=aA(W);for(let J of Aj(W?.controlEventRecords)){let w=un(J);if(!["initial-prompt-delivered","append-prompt-delivered","monitor-prompt-delivered"].includes(w))continue;let Q=Dy(J),q=al(Q);if(q===null)continue;let T=String(J?.eventId||"");$({id:`prompt:${T||`${N}:${L}:${w}:${q}`}`,runId:r,nodeId:U,procedureRunId:N,attempt:L,kind:"prompt",tone:VX(J),status:"delivered",label:XX(J),ms:q,timestampIso:Q,sourceKind:String(J?.sourceKind||""),sourceNodeId:String(J?.sourceNodeId||""),targetNodeId:U,action:"",eventId:T,commandId:String(J?.commandId||""),raw:J},n)}}}let A=new Map;Aj(l?.controlEvents).forEach((F,U)=>{let N=YX(F,U),W=A.get(N)||{key:N,events:[]};W.events.push(F),A.set(N,W)});for(let F of A.values()){let U=Sl(F.events).slice().sort((p,V)=>jL(V)-jL(p)),N=Sl(F.events).find((p)=>un(p)==="control-command-queued")||null,W=U[0]||N;if(!N&&!W)continue;let L=String(N?.sourceNodeId||W?.sourceNodeId||""),J=String(N?.sourceKind||W?.sourceKind||""),w=Dy(N)||Dy(W)||t_(N?.createdAt,W?.createdAt),Q=al(w),q=String(W?.commandId||N?.commandId||F.key),T=(un(W)||"control-command-queued").replace(/^control-command-/u,""),O="";if(L&&Q!==null)O=`control-source:${q}:${L}`,c.set(q,O),$({id:O,runId:r,nodeId:L,procedureRunId:String(N?.procedureRunId||W?.procedureRunId||""),attempt:"",kind:"control-source",tone:hX(N||W),status:T,label:`${u_(N||W)} 发起`,ms:Q,timestampIso:w,action:rt(N||W),sourceKind:J,sourceNodeId:L,targetNodeId:String(W?.targetNodeId||N?.targetNodeId||""),commandId:q,raw:N||W},i);let Z=W||N,E=Dy(Z)||w,D=al(E);if(D===null)continue;let Y=PX(Z);for(let p of Y){let V=RX(f,p,D,Z),B=`control-target:${q}:${p}`;if($({id:B,runId:r,nodeId:p,procedureRunId:V.procedureRunId,attempt:"",kind:"control-target",tone:MX(Z),status:T,label:CX(Z,p),ms:V.ms,eventMs:D,onInterval:V.onInterval,snapReason:V.snapReason,snapped:Number(V.ms)!==D,timestampIso:E,renderedTimestampIso:f_(Number(V.ms)),action:rt(Z),sourceKind:J,sourceNodeId:L,targetNodeId:p,commandId:q,raw:Z},i),O&&L&&L!==p)t.push({id:`control-arrow:${q}:${L}:${p}`,commandId:q,sourceNodeId:L,targetNodeId:p,sourceMarkerId:O,targetMarkerId:B,sourceKind:J,action:rt(Z),status:T})}}let j=[...n,...i].sort((F,U)=>Number(F.ms)-Number(U.ms)||String(F.nodeId).localeCompare(String(U.nodeId))||String(F.id).localeCompare(String(U.id)));return{...DX(j,t),sourceMarkerByCommand:c}}function bX({details:l,selectedNodeId:u,selectedNodeRuntime:r,control:f,onRaw:n}){if(!l)return K("span",{className:"muted"},"点击“抓取过程”读取 node 运行材料;主界面只显示结构化摘要,完整内容需点开原始 JSON。");let i=Sl(l.procedureRuns),t=i.at(-1)||{},y=Sl(t.attempts),c=y.at(-1)||{},$=Sl(t.workerLogTail),A=Sl(c.controlEventsTail),j=Sl(c.controlPromptsTail),F=Sl(c.monitorPromptsTail),U=fj(A),N=fj(j),W=fj(F),L=c.opencodeMessages||{};return K("div",{className:"pipeline-evidence-list compact"},K(Df,{title:"Node runtime",subtitle:u||"--",facts:[`status ${r?.status||"pending"}`,`attempts ${r?.attempts??y.length}`,`procedure ${r?.currentProcedureRunId||Sf(t)||"--"}`,f.fetchedAt?`fetched ${iu(f.fetchedAt)}`:"not fetched"],data:l.node||l,onRaw:n,testId:"raw-pipeline-node-runtime"}),K(Df,{title:"Procedure runs",subtitle:`${i.length} groups`,facts:[`latest ${t.status?.status||t.status||"--"}`,`steps ${Sl(t.recentSteps).length}`,`duration ${Vf(al(t.finishedAt)&&al(t.startedAt)?Number(al(t.finishedAt))-Number(al(t.startedAt)):t.durationMs)}`],data:i,onRaw:n,testId:"raw-pipeline-node-procedures"}),K(Df,{title:"OpenCode messages",subtitle:String(L.exists?"available":"not indexed"),facts:[`messages ${RA(L.messageCount)}`,`size ${RA(L.size)}`,`updated ${Wl(L.updatedAt)}`],data:L,onRaw:n,testId:"raw-pipeline-node-messages"}),K(Df,{title:"Control prompts",subtitle:"manual / monitor append queues",facts:[`manual tail ${N.total}`,`monitor tail ${W.total}`,`last ${Wl(Qj(N.lastAt,W.lastAt))}`],data:{controlPromptsTail:j,monitorPromptsTail:F},onRaw:n,testId:"raw-pipeline-node-prompts"}),K(Df,{title:"Control events",subtitle:U.eventKinds.length>0?U.eventKinds.join(", "):"event tail",facts:[`tail ${U.total}`,`parsed ${U.parsed}`,`last ${Wl(U.lastAt)}`],data:A,onRaw:n,testId:"raw-pipeline-node-events"}),K(Df,{title:"Worker log",subtitle:"tail is hidden on main canvas",facts:[`tail ${$.length} lines`,"raw only via button",`procedure ${Sf(t)||"--"}`],data:$,onRaw:n,testId:"raw-pipeline-node-worker-log"}))}function vX({activeRun:l,onRaw:u}){if(!l)return K(qf,{title:"暂无运行材料",text:"没有 Pipeline epoch 时不会展示运行材料索引。"});let r=Sl(l.nodes),f=Sl(l.procedureRuns),n=Sl(l.submissions),i=Sl(l.workerLogTail),t=oW(r),y=oW(f),c=f.filter((A)=>String(A?.status||"").toLowerCase()==="failed"),$=Qj(...f.flatMap((A)=>[A.updatedAt,A.finishedAt,A.startedAt]));return K("div",{className:"pipeline-evidence-list"},K(Df,{title:"Epoch overview",subtitle:l.runId||"--",facts:[`pipeline ${l.pipelineId||"--"}`,`status ${l.status||"--"}`,`started ${Wl(l.startedAt)}`,`updated ${Wl(l.updatedAt)}`],data:l,onRaw:u,testId:"raw-pipeline-run"}),K(Df,{title:"Node states",subtitle:`${r.length} nodes`,facts:[`running ${t.running||0}`,`succeeded ${t.succeeded||0}`,`failed ${t.failed||0}`,`pending ${t.pending||0}`],data:r,onRaw:u,testId:"raw-pipeline-run-nodes"}),K(Df,{title:"Procedure run index",subtitle:`${f.length} procedure records`,facts:[`succeeded ${y.succeeded||0}`,`failed ${y.failed||0}`,`latest ${Wl($)}`,`errors ${c.length}`],data:f,onRaw:u,testId:"raw-pipeline-run-procedures"}),K(Df,{title:"OA submissions",subtitle:`${n.length} submission files`,facts:[`records ${n.length}`,`task ${RA(l.task)}`,"raw grouped by run"],data:n,onRaw:u,testId:"raw-pipeline-run-submissions"}),K(Df,{title:"Worker log tail",subtitle:"hidden from main interface",facts:[`tail ${i.length} lines`,"display raw only after click",`updated ${Wl(l.updatedAt)}`],data:i,onRaw:u,testId:"raw-pipeline-run-worker-log"}))}function sX({diagnostics:l,onRaw:u}){let r=Sl(l?.runs).filter(Yl),f=Sl(l?.forbiddenResiduals),n=Yl(l?.guarantees)?l.guarantees:{},i=l?.hasNeutralNodeFinishedEvidence===!0&&l?.hasNoAuditPolicyEvidence===!0&&l?.hasAuditPolicyEvidence===!0,t=l?.ok===!0&&i&&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 K("div",{className:"pipeline-oa-panel","data-testid":"pipeline-oa-event-flow-panel"},K("div",{className:"metric-grid compact"},K(Mr,{label:"OA Flow",value:t?"100%":"--",hint:String(l?.mode||"waiting diagnostics"),tone:t?"ok":"warn"}),K(Mr,{label:"禁止残留",value:f.length,hint:f.length===0?"source scan clean":"needs cleanup",tone:f.length===0?"ok":"warn"}),K(Mr,{label:"No-audit",value:l?.hasNoAuditPolicyEvidence?"OK":"--",hint:"OA 下游策略证据",tone:l?.hasNoAuditPolicyEvidence?"ok":"warn"}),K(Mr,{label:"Monitor 审核",value:l?.hasAuditPolicyEvidence?"OK":"--",hint:"OA 控制事件闭环",tone:l?.hasAuditPolicyEvidence?"ok":"warn"})),K("div",{className:"pipeline-oa-guarantees"},c.map(($)=>K("article",{key:$.label,className:`pipeline-oa-guarantee ${$.ok?"ok":"warn"}`},K(u0,{status:$.ok?"online":"warn"},$.ok?"OK":"MISS"),K("div",null,K("strong",null,$.label),K("span",null,$.hint))))),K("div",{className:"pipeline-evidence-list compact"},r.slice(0,6).map(($)=>K(Df,{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?K("p",{className:"muted paragraph"},`最新证据 ${y.runId}: ${y.nodeFinishedCount||0} 个 node-finished,${y.controlAppliedCount||0} 个控制结果。`):K(qf,{title:"暂无 OA 事件流证据",text:"等待 Pipeline backend 暴露 diagnostics。"}),l?K("div",{className:"panel-actions inline-actions"},K(rn,{title:"Pipeline OA Event Flow Diagnostics",data:l,onOpen:u,testId:"raw-pipeline-oa-event-flow"})):null)}function kX({quota:l,onRaw:u}){let r=Yl(l?.summary)?l.summary:{},f=Yl(l?.target)?l.target:{},n=Yl(l?.cache)?l.cache:{},i=l?.ok===!0,t=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),j=r.usageRatio??(Number.isFinite(Number(y))&&Number(y)>0&&Number.isFinite(Number(c))?Number(c)/Number(y):void 0),F=r.resetAt||f.endAt,U=r.remainsMs??f.remainsMs,N=Number($),W=!i||Number.isFinite(N)&&N<=0?"warn":"ok",L=[i?`endpoint ${l?.endpoint||"--"}`:"quota unavailable",`fetched ${hA(l?.fetchedAt)}`,n.hit?`cache ${Vf(n.ageMs)}`:"live quota"];return K("div",{className:"pipeline-minimax-quota-panel","data-testid":"pipeline-minimax-quota-panel"},K("div",{className:"metric-grid compact"},K(Mr,{label:"MiniMax",value:i?t:"--",hint:l?.modelComponent||l?.error||"model/minimax-m27",tone:W}),K(Mr,{label:"当前窗口",value:`${rj(c)}/${rj(y)}`,hint:`已用 ${aW(j)}`,tone:W}),K(Mr,{label:"剩余额度",value:rj($),hint:`剩余 ${aW(A)}`,tone:W}),K(Mr,{label:"重置时间",value:hA(F),hint:U!==void 0?`约 ${Vf(U)}`:Wl(F),tone:W})),K(qj,{items:L}),i?K("p",{className:"muted paragraph"},`MiniMax 限额来自 D601 Pipeline 后端实时查询;当前模型匹配 ${r.modelName||f.modelName||t}。`):K(lu,{error:l?.error||"MiniMax 限额查询失败"}),l?K("div",{className:"panel-actions inline-actions"},K(rn,{title:"Pipeline MiniMax Quota",data:l,onOpen:u,testId:"raw-pipeline-minimax-quota"})):null)}function gX({epochs:l,activeRun:u,activePipeline:r,pipelineNodes:f,pipelineEdges:n,runDetails:i,nodeDetails:t,nodeDetailsState:y,ganttScale:c=i_,onGanttScaleChange:$,onRunChange:A,onIntervalSelect:j,onMarkerSelect:F,selection:U,detailOpen:N,onDetailOpenChange:W,onRaw:L}){let[J,w]=dr(KX),[Q,q]=dr({startY:0,endY:0,startMs:0,endMs:0}),[T,O]=dr(Date.now()),Z=ei(null),E=String(u?.runId||""),D=Boolean(N),Y=(jl)=>{if(typeof W==="function")W(jl)},p=r0(c??i_),V=String(i?.runId||"")===E?i?.details:null,B=V?{...Yl(u)?u:{},...Yl(V)?V:{},runId:E,procedureRuns:Sl(V?.procedureRuns).length>0?V.procedureRuns:u?.procedureRuns}:u,m=EL(B,f,T),X=V?xX(V,B):{markers:[],arrows:[]},S=Sl(X.markers),b=mX(B,m,S),z=pX(b,p,m,T),P=String(z.source||"frontend-y"),s=m.map((jl)=>HX(jl,z,T)),k={startMs:Number(z.startMs),endMs:Number(z.endMs),durationMs:Math.max(1,Number(z.durationMs??Number(z.endMs)-Number(z.startMs)))},v=mj(p),tl={...v,pxPerMinute:Number(z.pxPerMinute??v.pxPerMinute)},I=Math.round(Number(z.chartHeight||360)),M=m.some(Kj);zn(()=>{if(!E||!M)return;let jl=window.setInterval(()=>O(Date.now()),1000);return()=>window.clearInterval(jl)},[E,M]);let rl=JX(r,f,Array.isArray(n)?n:[]),cl=f.map((jl)=>String(jl?.id||"")).filter(Boolean),$l=s.map((jl)=>String(jl.nodeId||"")).filter(Boolean),Tl=S.map((jl)=>String(jl.nodeId||"")).filter(Boolean),Ql=Array.from(new Set([...rl,...cl,...$l,...Tl])),Ol={startY:0,endY:I,startMs:Number(k.startMs),endMs:Number(k.endMs)},h=Number(Q?.endY||0)>0?Q:Ol,a=(jl)=>{return gA(jl,k,I,z)<=Number(h.endY)&&Nj(jl,k,I,z)>=Number(h.startY)},ul=(jl)=>{let ol=wf(jl,k,I,z);return ol>=Number(h.startY)&&ol<=Number(h.endY)},zl=new Set(Ql.filter((jl)=>s.some((ol)=>ol.nodeId===jl&&a(ol))||S.some((ol)=>ol.nodeId===jl&&ul(ol)))),o=J?Ql.filter((jl)=>zl.has(jl)):Ql,ql=`${lj}px ${o.length>0?o.map(()=>`${mn}px`).join(" "):"minmax(160px, 1fr)"}`,pl=Sl(z.ticks).filter(Yl),Bl=String(U?.mode==="interval"?U?.interval?.procedureRunId||"":""),Il=String(U?.mode==="event"?U?.marker?.id||"":""),nu=()=>{let jl=Z.current;if(!jl){q(Ol);return}let ol=Math.max(0,jl.scrollTop-uj),wr=Math.max(120,jl.clientHeight-uj),hl=Math.min(I,ol+wr),Yu={startY:ol,endY:hl,startMs:Number(k.startMs),endMs:Number(k.endMs)},eu=Math.max(0,Math.min(1,ol/I)),rf=Math.max(eu,Math.min(1,hl/I)),Ar=Math.max(1,Number(k.endMs)-Number(k.startMs));Yu.startMs=Number(k.startMs)+Ar*eu,Yu.endMs=Number(k.startMs)+Ar*rf,q(Yu)};zn(()=>{let jl=Z.current,ol=window.setTimeout(nu,0);return jl?.addEventListener("scroll",nu),window.addEventListener("resize",nu),()=>{window.clearTimeout(ol),jl?.removeEventListener("scroll",nu),window.removeEventListener("resize",nu)}},[E,k.startMs,k.endMs,I]);let Ml=Math.max(0,Ql.length-o.length),wu=new Set(S.filter((jl)=>o.includes(String(jl.nodeId||""))&&ul(jl)).map((jl)=>String(jl.id))),Qr=new Map(S.map((jl)=>[String(jl.id),jl])),Or=Sl(X.arrows).filter((jl)=>{if(!wu.has(String(jl.targetMarkerId||"")))return!1;if(String(jl.action||"")==="observe")return o.includes(String(jl.sourceNodeId||""));return wu.has(String(jl.sourceMarkerId||""))}),$r=lj+Math.max(1,o.length)*mn,ir=(jl)=>{let ol=r0(jl.target.value);if(typeof $==="function")$(ol);window.setTimeout(nu,0)},tr=()=>LX({title:`${r?.id||"pipeline"}-${E||"epoch"}-gantt`,meta:[`run ${E||"--"}`,`${Wl(k.startMs)} -> ${Wl(k.endMs)}`,`duration ${Vf(k.durationMs)}`,`${tl.label} / ${yj(tl.pxPerMinute)} px/min`,`${o.length}/${Ql.length} nodes`,`${S.length} markers`],visibleNodeIds:o,intervals:s,markers:S.filter((jl)=>o.includes(String(jl.nodeId||""))),arrows:Or,ticks:pl,bounds:k,chartHeight:I,backendLayout:z}),hr=Yl(V?.gantt?.diagnostics)?V.gantt.diagnostics:null;return K(Kn,{title:"Epoch 甘特图",eyebrow:`${r?.id||"pipeline"} / ${l.length} epochs`,className:"pipeline-wide-panel",loading:i?.loading,actions:K("div",{className:"pipeline-gantt-actions"},K("select",{value:E,disabled:l.length===0,onChange:(jl)=>A(jl.target.value),"data-testid":"pipeline-epoch-select"},l.map((jl)=>K("option",{key:jl.runId,value:jl.runId},Jj(l,jl)))),K("label",{className:"pipeline-gantt-toggle"},K("input",{type:"checkbox","data-testid":"pipeline-gantt-auto-hide-idle",checked:J,onChange:(jl)=>{w(Boolean(jl.target.checked)),window.setTimeout(nu,0)}}),K("span",null,"自动隐藏空闲列")),K("label",{className:"pipeline-gantt-scale"},K("span",null,K("b",null,"时间尺度"),K("em",{"data-testid":"pipeline-gantt-scale-label"},`${tl.label} · ${yj(tl.pxPerMinute)} px/min`)),K("input",{type:"range",min:0,max:100,step:0.01,value:p,onChange:ir,"aria-label":"调整甘特图时间尺度","data-testid":"pipeline-gantt-time-scale"}),K("small",null,K("span",null,"全局"),K("span",null,"细节"))),u?K("button",{type:"button",className:"ghost-btn",onClick:tr,disabled:o.length===0,"data-testid":"pipeline-export-gantt"},"导出甘特图"):null,u?K(rn,{title:`Pipeline Epoch ${u.runId}`,data:u,onOpen:L,testId:"raw-pipeline-epoch-gantt"}):null)},!u?K(qf,{title:"暂无 Epoch",text:"当前 pipeline 还没有完整运行记录。"}):s.length===0?K(qf,{title:"暂无时间区间",text:"等待 D601 Pipeline backend 在 procedure summary 中返回 startedAt / finishedAt。"}):K("div",{className:"pipeline-gantt-wrap"},K("div",{className:`pipeline-gantt-detail-layout ${D?"detail-open":"detail-collapsed"}`,"data-testid":"pipeline-gantt-detail-layout","data-sidebar-open":D?"true":"false"},K("div",{className:"pipeline-gantt-main"},K("div",{className:"pipeline-gantt-main-head"},K("div",{className:"pipeline-gantt-meta"},K("span",null,`time ${Wl(k.startMs)} -> ${Wl(k.endMs)}`),K("span",null,`duration ${Vf(k.durationMs)}`),K("span",null,`scale ${tl.label} / ${yj(tl.pxPerMinute)} px/min`),K("span",null,`layout ${P}`),hr?K("span",null,`align ${hr.timeAxisAlignmentOk===!1?"check":"ok"}`):null,K("span",null,`visible ${o.length}/${Ql.length} nodes`),V?K("span",null,`markers ${S.length}`):null,J&&Ml>0?K("span",null,`hidden idle ${Ml}`):null),!D?K("button",{type:"button",className:"pipeline-sidecar-tab right",disabled:!U?.mode,onClick:()=>Y(!0),"data-testid":"pipeline-gantt-sidebar-toggle"},U?.mode?"展开详情":"点击甘特图元素展开详情"):null),K("div",{className:"pipeline-gantt-viewport",ref:Z,"data-testid":"pipeline-epoch-gantt","data-pipeline-id":r?.id||"","data-run-id":E,"data-layout-source":P,"data-start-ms":String(k.startMs),"data-end-ms":String(k.endMs),"data-chart-height":String(I)},K("div",{className:"pipeline-gantt-board",style:{gridTemplateColumns:ql,minWidth:`${$r}px`}},K("div",{className:"pipeline-gantt-head time"},"Time"),o.length===0?K("div",{className:"pipeline-gantt-head empty"},"当前时间窗无工作节点"):o.map((jl)=>K("div",{key:`head-${jl}`,className:"pipeline-gantt-head node",title:jl,"data-testid":"pipeline-gantt-head-node","data-node-id":jl},K(IS,{value:jl}))),K("div",{className:"pipeline-gantt-time-axis",style:{height:`${I}px`}},pl.map((jl)=>{let ol=DL(jl,k,I,z);return K("div",{key:`tick-${jl.ms}-${ol}`,className:"pipeline-gantt-tick",style:{top:`${ol}px`},"data-testid":"pipeline-gantt-tick","data-ms":String(jl.ms),"data-y":String(ol)},K("b",null,Wl(jl.ms)),K("span",null,`+${Vf(Number(jl.offsetMs??Number(jl.ms)-Number(k.startMs)))}`))})),o.length>0?K("svg",{className:"pipeline-gantt-arrow-layer",width:o.length*mn,height:I,viewBox:`0 0 ${o.length*mn} ${I}`,style:{left:`${lj}px`,top:`${uj}px`,width:`${o.length*mn}px`,height:`${I}px`},"aria-hidden":"true"},K("defs",null,K("marker",{id:"pipeline-gantt-arrowhead",viewBox:"0 0 10 10",refX:9,refY:5,markerWidth:6,markerHeight:6,orient:"auto-start-reverse"},K("path",{d:"M 0 0 L 10 5 L 0 10 z",fill:"context-stroke"}))),Or.map((jl)=>{let ol=Qr.get(String(jl.targetMarkerId||""));if(!ol)return null;let wr=Qr.get(String(jl.sourceMarkerId||"")),hl=String(wr?.nodeId||jl.sourceNodeId||""),Yu=o.indexOf(hl),eu=o.indexOf(String(ol.nodeId||""));if(Yu<0||eu<0)return null;let rf=Yu*mn+mn/2,Ar=eu*mn+mn/2,Zr=wr?wf(wr,k,I,z):wf(ol,k,I,z),Zn=wf(ol,k,I,z);return K("path",{key:jl.id,className:`pipeline-gantt-arrow ${String(jl.sourceKind||"").toLowerCase()} ${String(jl.status||"").toLowerCase()} ${String(jl.action||"").toLowerCase()}`,d:VL(rf,Zr,Ar,Zn),markerEnd:"url(#pipeline-gantt-arrowhead)","data-testid":String(jl.action||"")==="observe"?"pipeline-gantt-observation-arrow":"pipeline-gantt-arrow","data-source-node-id":String(jl.sourceNodeId||""),"data-target-node-id":String(jl.targetNodeId||""),"data-target-marker-id":String(jl.targetMarkerId||""),"data-action":String(jl.action||""),"data-source-y":String(Zr),"data-target-y":String(Zn)})})):null,o.length===0?K("div",{className:"pipeline-gantt-empty-col",style:{height:`${I}px`}},"滚动到有活动的时间段后,相关 node 列会自动出现。"):o.map((jl)=>{let ol=s.filter((hl)=>hl.nodeId===jl),wr=S.filter((hl)=>String(hl.nodeId||"")===jl);return K("div",{key:`col-${jl}`,className:"pipeline-gantt-node-col",style:{height:`${I}px`}},ol.map((hl)=>{let Yu=gA(hl,k,I,z),eu=Nj(hl,k,I,z),rf=BL(hl,k,I,z),Ar=String(hl.procedureRunId||`${jl}-${hl.startMs}`);return K("button",{key:Ar,type:"button",className:`pipeline-gantt-bar ${hl.status} ${hl.live?"live":""} ${Bl===Ar?"selected":""}`,style:{top:`${Yu}px`,height:`${rf}px`},title:`${jl} ${hl.status} ${Wl(hl.startedAt||hl.startMs)} -> ${Wl(hl.finishedAt||hl.endMs)}`,onClick:()=>j(hl),"data-testid":"pipeline-gantt-line","data-node-id":jl,"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(Yu),"data-y2":String(eu),"data-natural-height":String(Math.max(0,eu-Yu))},K("strong",null,hl.status||"working"),K("span",null,Vf(hl.durationMs)))}),wr.map((hl)=>K("button",{key:hl.id,type:"button",className:`pipeline-gantt-marker ${hl.kind} ${hl.tone||""} ${hl.status||""} ${Il===String(hl.id)?"selected":""}`,style:{top:`${wf(hl,k,I,z)}px`},title:`${hl.label||"event"} / ${Wl(hl.timestampIso||hl.timestamp||hl.ms)}`,onClick:()=>F(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,k,I,z))})))})))),D?K(gS,{selection:U,runDetails:i,nodeDetails:t,nodeDetailsState:y,onRaw:L,onCollapse:()=>Y(!1)}):null)))}function ri(){return{loading:!1,actionLoading:"",error:"",message:"",details:null,fetchedAt:null,appendPrompt:"",guidePrompt:"",modifyPrompt:"",approveReason:"",redoReason:""}}function di(){return{mode:"",runId:"",interval:null,marker:null}}function cj(){return{runId:"",loading:!1,error:"",details:null,fetchedAt:null}}function dc(l,u){return`${l}/microservices/pipeline/proxy${u}`}function IX({activeRun:l,pipelineRuns:u,selectedRunId:r,onRunChange:f,selectedNodeId:n,selectedNodeConfig:i,selectedNodeRuntime:t,control:y,onControlChange:c,onFetch:$,onAction:A,onRaw:j,onCollapse:F}){let U=String(l?.runId||""),N=String(t?.status||"pending"),W=!U||!n||y.loading||Boolean(y.actionLoading),L=(w)=>(Q)=>c({[w]:Q.target.value,error:"",message:""}),J=u.length>0?u:l?[l]:[];return K("aside",{className:"pipeline-node-control","data-testid":"pipeline-node-control"},K("div",{className:"pipeline-node-control-head"},K("div",null,K("p",{className:"panel-eyebrow"},"Manual Node Control"),K(fu,{title:n||"点击控制图中的 node",level:3,loading:y.loading||Boolean(y.actionLoading)})),K("div",{className:"pipeline-node-control-head-actions"},n?K(u0,{status:N},N):K(u0,{status:"pending"},"idle"),K("button",{type:"button",className:"ghost-btn mini",onClick:F,"data-testid":"pipeline-node-sidebar-collapse"},"收起"))),K("div",{className:"pipeline-control-runbar"},K("label",null,K("span",null,"目标 run"),K("select",{value:U||r,disabled:J.length===0,onChange:(w)=>f(w.target.value),"data-testid":"pipeline-node-run-select"},J.map((w)=>K("option",{key:w.runId,value:w.runId},`${w.runId||"--"} / ${w.status||"--"}`)))),K("button",{type:"button",className:"ghost-btn",disabled:W,onClick:$,"data-testid":"pipeline-node-fetch"},y.loading?"抓取中":"抓取过程"),y.details?K(rn,{title:`Pipeline Node ${n}`,data:y.details,onOpen:j,testId:"raw-pipeline-node-control"}):null),K("div",{className:"pipeline-control-meta"},K("span",null,K("b",null,"kind"),String(i?.kind||"--")),K("span",null,K("b",null,"procedure"),String(t?.currentProcedureRunId||"--")),K("span",null,K("b",null,"attempts"),String(t?.attempts??"--")),K("span",null,K("b",null,"updated"),Wl(l?.updatedAt))),!n?K(qf,{title:"未选择 node",text:"点击 React Flow 控制图中的任意 node 后,可抓取执行过程、追加 prompt、下发引导、增量修改、审核通过或重做。"}):null,K(lu,{error:y.error,wide:!0}),K("div",{className:"pipeline-control-actions"},K("label",null,K("span",null,"实时追加 prompt(仅 running node)"),K("textarea",{value:y.appendPrompt,onChange:L("appendPrompt"),placeholder:"让当前执行中的 agent 继续、补充检查或调整当前步骤...",rows:4,disabled:!n,"data-testid":"pipeline-node-append-input"}),K("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")),K("label",null,K("span",null,"下次尝试引导 prompt"),K("textarea",{value:y.guidePrompt,onChange:L("guidePrompt"),placeholder:"给该 node 下一次 attempt 的执行提示;不会立即打断当前 session。",rows:4,disabled:!n,"data-testid":"pipeline-node-guide-input"}),K("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")),K("label",null,K("span",null,"完成后增量修改 prompt"),K("textarea",{value:y.modifyPrompt,onChange:L("modifyPrompt"),placeholder:"在该 node 已完成结果基础上追加修改要求;runner 会重跑目标 node,并保留同 node 既有 OA 输出作为上下文。",rows:4,disabled:!n,"data-testid":"pipeline-node-modify-input"}),K("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")),K("label",null,K("span",null,"Monitor 审核通过原因"),K("textarea",{value:y.approveReason,onChange:L("approveReason"),placeholder:"当流程配置开启 monitor 审核时,记录审核通过原因并释放后续 node。",rows:3,disabled:!n,"data-testid":"pipeline-node-approve-input"}),K("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"?"提交中":"审核通过")),K("label",null,K("span",null,"重做 / restart 原因"),K("textarea",{value:y.redoReason,onChange:L("redoReason"),placeholder:"说明为什么需要重做;runner 会重置目标 node 以及非 rework 下游 node。",rows:4,disabled:!n,"data-testid":"pipeline-node-redo-input"}),K("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"))),K("div",{className:"pipeline-control-evidence"},K("strong",null,"Node 过程索引"),K(bX,{details:y.details,selectedNodeId:n,selectedNodeRuntime:t,control:y,onRaw:j})))}function SL({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((fl)=>fl.id==="pipeline")||null,[n,i]=dr({loading:!1,error:"",health:null,snapshot:null,oaDiagnostics:null,minimaxQuota:null,refreshedAt:null}),[t,y]=dr(""),[c,$]=dr(""),[A,j]=dr(""),[F,U]=dr(ri()),[N,W]=dr({}),[L,J]=dr(di()),[w,Q]=dr(cj()),[q,T]=dr(i_),[O,Z]=dr(!1),[E,D]=dr(!1),Y=ei(0),{addNotification:p}=Xr(),V=ei(!1),B=ei(0),m=ei(""),X=ei({}),S=ei(""),b=ei("");async function z(fl={}){let Dl=fl.silent===!0;if(!f)return;if(V.current)return;V.current=!0;let Cl=Y.current+1;if(Y.current=Cl,!Dl)i((dl)=>({...dl,loading:!0,error:""}));try{let dl=`__unideskArrayLimit=registry.components:80,runs:${HS}`,[ju,ku,$u]=await Promise.all([oi(`${r}/microservices/pipeline/proxy/api/snapshot?${dl}`,{cache:"no-store"}),oi(`${r}/microservices/pipeline/proxy/api/oa-event-flow/diagnostics`,{cache:"no-store"}).catch((Yf)=>({ok:!1,error:El(Yf,"OA event flow diagnostics failed")})),oi(`${r}/microservices/pipeline/proxy/api/model-quota/minimax`,{cache:"no-store"}).catch((Yf)=>({ok:!1,error:El(Yf,"MiniMax quota failed")}))]);if(Cl!==Y.current)return;let qr={ok:ju?.ok!==!1,service:"pipeline-v2-control snapshot"};i({loading:!1,error:"",health:qr,snapshot:ju,oaDiagnostics:ku,minimaxQuota:$u,refreshedAt:new Date})}catch(dl){if(Cl!==Y.current)return;i((ju)=>({...ju,loading:!1,error:El(dl,"Pipeline 加载失败")}))}finally{V.current=!1}}zn(()=>{if(z(),!f)return;let fl=()=>{if(XA())z({silent:!0})},Dl=window.setInterval(()=>{fl()},kW),Cl=()=>{if(XA())fl()};return document.addEventListener("visibilitychange",Cl),()=>{window.clearInterval(Dl),document.removeEventListener("visibilitychange",Cl)}},[f?.id,f?.runtime?.providerStatus,r]);let P=aS(f),s=dS(f),k=oS(f),v=n.snapshot||{},tl=n.oaDiagnostics||null,I=n.minimaxQuota||null,{components:M,pipelines:rl,runs:cl}=eS(v),$l=String(cl[0]?.pipelineId||""),Tl=($l?rl.find((fl)=>String(fl.id||"")===$l):null)||rl[0]||{},Ql=rl.find((fl)=>String(fl.id||"")===t)||Tl,Ol=String(Ql.id||""),h=GL(Ql),a=Lj(Ql),ul=_L(cl,Ol),zl=TX(cl,Ol),o=zl.find((fl)=>String(fl?.runId||"")===c)||ul,ql=String(w.runId||"")===String(o?.runId||"")?fX(w.details):null,pl=nX(o,ql),Bl=String(pl?.runId||""),Il=h.find((fl)=>String(fl?.id||"")===A)||null,nu=A?TL(pl,A):null,Ml=uX(cl),wu=cX(M),Qr=Number(n.health?.components)||rL(v,"registry.components",M.length),Or=rL(v,"runs",cl.length),$r=iL(Ql,pl,M),ir={nodes:$r.nodes.map((fl)=>fl.id===A?{...fl,selected:!0,className:`${fl.className||""} selected-control-node`}:fl),edges:$r.edges},tr=rl.map((fl)=>{let Dl=String(fl.id||"pipeline"),Cl=_L(cl,Dl);return{title:`${Dl}-${Cl?.runId||"snapshot"}`,flow:iL(fl,Cl,M)}}),hr=String(L?.runId||Bl||""),jl=String(L?.interval?.nodeId||L?.marker?.nodeId||""),ol=hr&&jl?N[tj(hr,jl)]||null:null,wr=xA(F.details,hr,jl),hl=xA(ol?.details,hr,jl)||wr,Yu=hr&&jl?{...Yl(ol)?ol:{},runId:hr,nodeId:jl,details:hl,loading:Boolean(ol?.loading)||!hl&&Boolean(F.loading)&&A===jl,error:String(ol?.error||""),fetchedAt:ol?.fetchedAt||(wr?F.fetchedAt:null)}:null,eu=zl.map((fl)=>String(fl?.runId||"")).filter(Boolean).join("|"),rf=h.map((fl)=>String(fl?.id||"")).filter(Boolean).join("|");zn(()=>{S.current=A},[A]),zn(()=>{b.current=Bl},[Bl]),zn(()=>{if(!c||eu.split("|").includes(c))return;$("")},[c,eu]),zn(()=>{if(!A||rf.split("|").includes(A))return;j(""),U(ri()),J(di()),Z(!1),D(!1)},[A,rf]),zn(()=>{if(!A)Z(!1)},[A]),zn(()=>{if(!L.mode)D(!1)},[L.mode]);async function Ar(fl=Bl,Dl={}){if(!fl){Q(cj());return}let Cl=r0(Dl.scale??q??i_),dl=`${fl}:timeline`;if(m.current===dl)return;m.current=dl;let ju=Dl.silent===!0,ku=B.current+1;B.current=ku,Q(($u)=>({runId:fl,scale:Cl,loading:!ju||String($u.runId||"")!==fl||!$u.details,error:"",details:ju&&$u.runId===fl?$u.details:$u.runId===fl?$u.details:null,fetchedAt:$u.runId===fl?$u.fetchedAt:null}));try{let[$u,qr]=await Promise.all([oi(dc(r,`/api/node-control/runs/${encodeURIComponent(fl)}?tail=160&view=timeline`),{cache:"no-store",strictJson:!0}),oi(dc(r,`/api/runs/${encodeURIComponent(fl)}`),{cache:"no-store"}).catch((Yf)=>({ok:!1,runSummaryError:El(Yf,"抓取评分失败")}))]);if(ku!==B.current)return;Q({runId:fl,scale:Cl,loading:!1,error:"",details:{...$u,run:Yl(qr?.run)?qr.run:void 0,runSummaryError:qr?.runSummaryError},fetchedAt:new Date})}catch($u){if(ku!==B.current)return;Q((qr)=>({runId:fl,scale:Cl,loading:!1,error:El($u,"抓取 epoch 执行过程失败"),details:qr.runId===fl?qr.details:null,fetchedAt:qr.runId===fl?qr.fetchedAt:null}))}finally{if(m.current===dl)m.current=""}}function Zr(fl,Dl,Cl){let dl=tj(fl,Dl);W((ju)=>{let ku={...ju,[dl]:{...Yl(ju?.[dl])?ju[dl]:{},runId:fl,nodeId:Dl,...Cl}},$u=Object.keys(ku);if($u.length>32)for(let qr of $u.slice(0,$u.length-32))delete ku[qr];return ku})}async function Zn(fl,Dl){if(!fl||!Dl)return;let Cl=tj(fl,Dl),dl=Number(X.current?.[Cl]||0)+1;X.current={...X.current,[Cl]:dl},Zr(fl,Dl,{loading:!0,error:""});try{let ju=await oi(dc(r,`/api/node-control/runs/${encodeURIComponent(fl)}/nodes/${encodeURIComponent(Dl)}?tail=160`),{cache:"no-store",strictJson:!0});if(Number(X.current?.[Cl]||0)!==dl)return;let ku=new Date;if(Zr(fl,Dl,{loading:!1,details:ju,fetchedAt:ku,error:""}),S.current===Dl&&b.current===fl)U(($u)=>({...$u,loading:!1,details:ju,fetchedAt:ku,error:""}))}catch(ju){if(Number(X.current?.[Cl]||0)!==dl)return;Zr(fl,Dl,{loading:!1,error:El(ju,"抓取 Gantt node 详情失败")})}}zn(()=>{if(!Bl){Q(cj());return}Ar(Bl);let fl=()=>{if(XA())Ar(Bl,{silent:!0})},Dl=window.setInterval(()=>{fl()},kW),Cl=()=>{if(XA())fl()};return document.addEventListener("visibilitychange",Cl),()=>{window.clearInterval(Dl),document.removeEventListener("visibilitychange",Cl)}},[Bl,r]);async function ff(fl=Bl,Dl=A){if(!fl||!Dl){U((Cl)=>({...Cl,error:"请先选择 run 和 node",message:""}));return}U((Cl)=>({...Cl,loading:!0,error:"",message:""}));try{let Cl=await oi(dc(r,`/api/node-control/runs/${encodeURIComponent(fl)}/nodes/${encodeURIComponent(Dl)}?tail=160`),{cache:"no-store",strictJson:!0}),dl=new Date;U((ju)=>({...ju,loading:!1,details:Cl,fetchedAt:dl,error:""})),Zr(fl,Dl,{loading:!1,details:Cl,fetchedAt:dl,error:""})}catch(Cl){U((dl)=>({...dl,loading:!1,error:El(Cl,"抓取 node 执行过程失败")}))}}async function ii(fl){let Dl=String(fl?.runId||Bl||""),Cl=String(fl?.nodeId||"");if(J({mode:"interval",runId:Dl,interval:fl,marker:null}),D(!0),!Dl||!Cl)return;if(Dl!==Bl)$(Dl);j(Cl),U(ri()),Ar(Dl,{silent:!0}),Zn(Dl,Cl)}async function Au(fl){let Dl=String(fl?.runId||Bl||""),Cl=String(fl?.nodeId||"");if(J({mode:"event",runId:Dl,interval:null,marker:fl}),D(!0),!Dl)return;if(Dl!==Bl)$(Dl);if(Ar(Dl,{silent:!0}),!Cl)return;j(Cl),U(ri()),Zn(Dl,Cl)}async function nt(fl){if(!Bl||!A){U((dl)=>({...dl,error:"请先选择 run 和 node",message:""}));return}let Dl=fl==="append"?"prompts":fl,Cl=fl==="append"?F.appendPrompt:fl==="guide"?F.guidePrompt:fl==="modify"?F.modifyPrompt:fl==="approve"?F.approveReason:F.redoReason;if(!String(Cl||"").trim()){U((dl)=>({...dl,error:"操作内容不能为空",message:""}));return}U((dl)=>({...dl,actionLoading:fl,error:"",message:""}));try{let dl=fl==="redo"||fl==="approve"?{reason:Cl,source:"unidesk-frontend",sourceKind:"webui"}:{prompt:Cl,source:"unidesk-frontend",sourceKind:"webui"},ju=await oi(dc(r,`/api/node-control/runs/${encodeURIComponent(Bl)}/nodes/${encodeURIComponent(A)}/${Dl}`),{method:"POST",body:JSON.stringify(dl)});if(U(($u)=>({...$u,actionLoading:"",details:ju,fetchedAt:new Date,appendPrompt:fl==="append"?"":$u.appendPrompt,guidePrompt:fl==="guide"?"":$u.guidePrompt,modifyPrompt:fl==="modify"?"":$u.modifyPrompt,approveReason:fl==="approve"?"":$u.approveReason,redoReason:fl==="redo"?"":$u.redoReason,message:fl==="append"?"已追加到运行中 node":fl==="guide"?"已下发 guide,等待 runner 处理":fl==="modify"?"已排队增量修改命令":fl==="approve"?"已提交审核通过决策":"已排队重做命令"})),p("success",fl==="append"?"已追加到运行中 node":fl==="guide"?"已下发 guide,等待 runner 处理":fl==="modify"?"已排队增量修改命令":fl==="approve"?"已提交审核通过决策":"已排队重做命令"),await ff(Bl,A),await Ar(Bl,{silent:!0}),fl!=="append")await z()}catch(dl){U((ju)=>({...ju,actionLoading:"",error:El(dl,"node 控制操作失败")}))}}if(!f)return K(qf,{title:"Pipeline 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=pipeline"});return K("div",{className:"pipeline-page","data-testid":"pipeline-page"},K(Kn,{title:"Pipeline v2 工作台",eyebrow:"D601 Snapshot 用户服务",loading:n.loading,actions:K("div",{className:"panel-actions"},K("button",{type:"button",className:"ghost-btn",onClick:z,disabled:n.loading,"data-testid":"pipeline-refresh-button"},n.loading?"刷新中":"刷新"),K(rn,{title:"Pipeline 用户服务",data:f,onOpen:u,testId:"raw-pipeline-service"}))},K("div",{className:"pipeline-hero"},K("div",null,K("div",{className:"node-version-line"},K(u0,{status:P.providerStatus==="online"?"online":"warn"},P.providerStatus||"unknown"),K("span",null,f.providerId),K("span",null,k.public?"公网暴露":"仅 UniDesk frontend 代理访问")),K("p",{className:"muted paragraph"},f.description)),K("div",{className:"microservice-ref-card"},K("span",null,"Repo"),K("strong",null,s.url||"--"),K("code",null,s.commitId||"--")),K("div",{className:"microservice-ref-card"},K("span",null,"D601 Docker"),K("strong",null,`${k.nodeBindHost||"--"}:${k.nodePort||"--"}`),K("code",null,`${s.composeFile||"--"} / ${s.composeService||"--"}`))),K(lu,{error:n.error,wide:!0})),K("div",{className:"pipeline-grid"},K(Kn,{title:"控制图",eyebrow:`${Ql.id||"pipeline"} / run ${pl?.status||"--"}`,className:"pipeline-wide-panel",loading:n.loading,actions:K("div",{className:"pipeline-toolbar"},K("select",{value:Ol,disabled:rl.length===0,onChange:(fl)=>{y(fl.target.value),$(""),j(""),U(ri()),J(di()),Z(!1),D(!1)},"data-testid":"pipeline-select"},rl.map((fl)=>K("option",{key:fl.id,value:fl.id},fl.id||fl.key))),K("select",{value:Bl,disabled:zl.length===0,onChange:(fl)=>{if($(fl.target.value),U(ri()),J(di()),Z(!1),D(!1),A)ff(fl.target.value,A)},"data-testid":"pipeline-run-select"},zl.map((fl)=>K("option",{key:fl.runId,value:fl.runId},Jj(zl,fl)))),K("button",{type:"button",className:"ghost-btn",disabled:ir.nodes.length===0,onClick:()=>zL(ir,`${Ql.id||"pipeline"}-${pl?.runId||"snapshot"}`),"data-testid":"pipeline-export-graph"},"导出渲染图"),K("button",{type:"button",className:"ghost-btn",disabled:tr.every((fl)=>fl.flow.nodes.length===0),onClick:()=>GX(tr),"data-testid":"pipeline-export-all-graphs"},"批量导出"))},h.length===0?K(qf,{title:"暂无控制图",text:"等待 D601 pipeline backend 返回 config.nodes / config.edges"}):K("div",{className:`pipeline-control-shell ${O?"detail-open":"detail-collapsed"}`,"data-testid":"pipeline-control-shell","data-sidebar-open":O?"true":"false"},K("div",{className:"pipeline-flow-frame","data-testid":"pipeline-react-flow"},K(MW,{nodes:ir.nodes,edges:ir.edges,nodeTypes:XS,edgeTypes:SS,fitView:!0,fitViewOptions:{padding:0.18},nodesDraggable:!1,nodesConnectable:!1,elementsSelectable:!0,minZoom:0.25,maxZoom:1.4,proOptions:{hideAttribution:!0},onNodeClick:(fl,Dl)=>{let Cl=String(Dl.id);if(j(Cl),U(ri()),Z(!0),Bl)ff(Bl,Cl)}},K(RW,{gap:22,size:1,color:"rgba(215, 161, 58, 0.24)"}),K(bW,{showInteractive:!1})),!O?K("button",{type:"button",className:"pipeline-sidecar-tab right",disabled:!A,onClick:()=>Z(!0),"data-testid":"pipeline-node-sidebar-toggle"},A?"展开 node 控制":"点击 node 展开控制"):null),O?K(IX,{activeRun:pl,pipelineRuns:zl,selectedRunId:c,onRunChange:(fl)=>{if($(fl),U(ri()),J(di()),A)ff(fl,A)},selectedNodeId:A,selectedNodeConfig:Il,selectedNodeRuntime:nu,control:F,onControlChange:(fl)=>U((Dl)=>({...Dl,...fl})),onFetch:()=>ff(),onAction:nt,onRaw:u,onCollapse:()=>Z(!1)}):null),K("div",{className:"pipeline-flow-summary"},K("span",null,`${ir.nodes.length} nodes`),K("span",null,`${ir.edges.length} edges`),K("span",null,`${rl.length} pipelines`),K("span",null,`source config+components(${M.length})`),K("span",null,`run ${pl?.runId||"--"}`),K("span",null,`score ${Fj(pl)}`),K("span",null,A?`selected ${A}`:"click node to control"))),K(gX,{epochs:zl,activeRun:pl,activePipeline:Ql,pipelineNodes:h,pipelineEdges:a,selection:L,detailOpen:E,onDetailOpenChange:D,runDetails:w,nodeDetails:hl,nodeDetailsState:Yu,ganttScale:q,onGanttScaleChange:T,onIntervalSelect:ii,onMarkerSelect:Au,onRunChange:(fl)=>{if($(fl),U(ri()),J(di()),D(!1),A)ff(fl,A)},onRaw:u}),K(Kn,{title:"观测指标",eyebrow:n.refreshedAt?`Updated ${iu(n.refreshedAt)}`:"Snapshot",loading:n.loading},K("div",{className:"metric-grid"},K(Mr,{label:"Health",value:n.health?.ok?"OK":"--",hint:n.health?.service||"D601 /health",tone:n.health?.ok?"ok":"warn"}),K(Mr,{label:"组件",value:Qr,hint:"components registry",tone:v?.registry?.ok===!1?"warn":"ok"}),K(Mr,{label:"Pipeline",value:rl.length,hint:`${h.length} nodes / ${a.length} edges`}),K(Mr,{label:"运行记录",value:Or,hint:`${Ml.succeeded||0} succeeded / ${Ml.running||0} running`}),K(Mr,{label:"OA 记录",value:Array.isArray(ul?.submissions)?ul.submissions.length:0,hint:ul?.runId||"latest run"}),K(Mr,{label:"Procedure",value:Array.isArray(ul?.procedureRuns)?ul.procedureRuns.length:0,hint:ul?.status||"no run"}),K(Mr,{label:"Score",value:Fj(pl),hint:pl?.runId||"selected epoch",tone:Tj(pl)})),K("div",{className:"panel-actions inline-actions"},K(rn,{title:"Pipeline Snapshot",data:v,onOpen:u,testId:"raw-pipeline-snapshot"}))),K(Kn,{title:"评分器",eyebrow:pl?.runId||"selected epoch",loading:n.loading},K(yX,{run:pl,onRaw:u})),K(Kn,{title:"MiniMax 限额",eyebrow:"model/minimax-m27 quota",loading:n.loading},K(kX,{quota:I,onRaw:u})),K(Kn,{title:"OA 事件流",eyebrow:"100% event-driven diagnostics",className:"pipeline-wide-panel",loading:n.loading},K(sX,{diagnostics:tl,onRaw:u})),K(Kn,{title:"组件矩阵",eyebrow:`${wu.length} classes`,loading:n.loading},wu.length===0?K(qf,{title:"暂无组件",text:"等待 D601 pipeline backend 返回 registry.components"}):K("div",{className:"component-strata"},wu.map((fl)=>K("article",{key:fl.name,className:"component-stratum"},K("span",null,fl.name),K("strong",null,fl.count)))),K("div",{className:"pipeline-component-list"},M.slice(0,12).map((fl)=>K("span",{key:fl.key,className:"data-chip"},K("b",null,fl.componentClass||"--"),K("span",null,fl.id||fl.key||"--"))))),K(Kn,{title:"Epoch 列表",eyebrow:`${zl.length}/${Or} preview`,loading:n.loading},zl.length===0?K(qf,{title:"暂无运行记录",text:"当前 pipeline 在 .state/pipeline-runs 中还没有 epoch。"}):K("div",{className:"pipeline-run-list"},zl.map((fl)=>{let Dl=String(fl?.runId||"")===Bl?pl:fl;return K("article",{key:fl.runId,className:`pipeline-run-card ${String(fl.runId||"")===Bl?"active":""}`,role:"button",tabIndex:0,onClick:()=>{$(String(fl.runId||"")),J(di())},onKeyDown:(Cl)=>{if(Cl.key==="Enter"||Cl.key===" ")$(String(fl.runId||"")),J(di())}},K("div",{className:"node-card-head"},K("strong",null,Jj(zl,fl)),K(u0,{status:fl.status},fl.status||"--")),K("div",{className:"docker-meta compact"},K("span",null,Dl?.pipelineId||"--"),K("span",null,`nodes ${Array.isArray(Dl?.nodes)?Dl.nodes.length:0}`),K("span",null,`oa ${Array.isArray(Dl?.submissions)?Dl.submissions.length:0}`),K("span",null,`procedures ${Array.isArray(Dl?.procedureRuns)?Dl.procedureRuns.length:0}`),K(tX,{run:Dl})),K("p",{className:"muted paragraph"},RA(Dl?.task)),K("span",{className:"pipeline-run-time"},Wl(Dl?.updatedAt)))}))),K(Kn,{title:"运行材料索引",eyebrow:pl?.runId||"selected epoch",className:"pipeline-wide-panel",loading:n.loading},K(vX,{activeRun:pl,onRaw:u}))))}var l6=Rl(Ju(),1);var _l=l6.default.createElement,{useEffect:aX}=l6.default,dA=l6.default.useState,Ej={id:"",sequenceNo:"",contractNo:"",name:"",currentStatus:"",pending:"",paymentStatus:"",notes:""};function oX({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return _l("span",{className:`status-badge ${r}`},u||l||"unknown")}function eA({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 Oj({title:l,eyebrow:u,actions:r,children:f,className:n,loading:i}){return _l("section",{className:`panel ${n||""}`},_l("div",{className:"panel-head"},_l("div",null,u?_l("p",{className:"panel-eyebrow"},u):null,_l(fu,{title:l,loading:i})),r?_l("div",{className:"panel-actions"},r):null),_l("div",{className:"panel-body"},f))}function XL({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 YL({title:l,text:u}){return _l("div",{className:"empty-state"},_l("strong",null,l),_l("span",null,u))}function dX(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function eX(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function lY(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function Yy(l,u){return`${l}/microservices/project-manager/proxy${u}`}function uY(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 rY(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 Zj(l){return String(l||"item").replace(/[^A-Za-z0-9_-]+/g,"-")}function fY(l){let u=new Uint8Array(l),r="",f=32768;for(let n=0;n_l("tr",{key:n.id,className:u===n.id?"active-row":"","data-testid":`project-manager-row-${Zj(n.id)}`},_l("td",null,n.sequenceNo??"--"),_l("td",null,_l("strong",null,n.contractNo||"--"),_l("code",null,n.id||"--")),_l("td",null,_l("strong",null,n.name||"--"),_l("span",{className:"muted block"},n.sourceFile||"--")),_l("td",null,n.currentStatus||"--"),_l("td",null,_l("span",{className:"preline"},n.pending||"--")),_l("td",null,_l(oX,{status:Number(n.paymentRatio||0)>=1?"online":"warn"},n.paymentStatus||"--")),_l("td",null,n.notes||"--"),_l("td",null,_l("div",{className:"inline-actions"},_l("button",{type:"button",className:"ghost-btn",onClick:()=>r(n),"data-testid":`project-manager-edit-${Zj(n.id)}`},"编辑"),_l(XL,{title:`Project ${n.contractNo||n.id}`,data:n,onOpen:f,testId:`raw-project-${Zj(n.id)}`}))))))))}function PL({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((E)=>E.id==="project-manager")||null,[n,i]=dA({loading:!1,saving:!1,importing:!1,exporting:!1,error:"",notice:"",health:null,list:null,refreshedAt:null}),[t,y]=dA({...Ej}),[c,$]=dA(""),[A,j]=dA("all"),{addNotification:F}=Xr();async function U(E=c,D=A){if(!f)return;i((Y)=>({...Y,loading:!0,error:""}));try{let Y=new URLSearchParams({pageSize:"200",status:D});if(E.trim())Y.set("q",E.trim());let[p,V]=await Promise.all([ml(`${r}/microservices/project-manager/health`),ml(Yy(r,`/api/projects?${Y.toString()}`))]);i((B)=>({...B,loading:!1,health:p,list:V,refreshedAt:new Date,error:""}))}catch(Y){i((p)=>({...p,loading:!1,error:El(Y,"Project Manager 加载失败")}))}}aX(()=>{U()},[f?.id,f?.runtime?.providerStatus]);async function N(E){E.preventDefault(),i((D)=>({...D,saving:!0,error:"",notice:""}));try{let D=rY(t);if(t.id)await ml(Yy(r,`/api/projects/${encodeURIComponent(t.id)}`),{method:"PUT",body:JSON.stringify(D)});else await ml(Yy(r,"/api/projects"),{method:"POST",body:JSON.stringify(D)});let Y=t.id?"项目已更新":"项目已创建";i((p)=>({...p,saving:!1,notice:Y})),F("success",Y),await U()}catch(D){i((Y)=>({...Y,saving:!1,error:El(D,"保存项目失败")}))}}async function W(){if(!t.id)return;if(!window.confirm(`删除项目 ${t.contractNo||t.name||t.id} ?`))return;i((E)=>({...E,saving:!0,error:"",notice:""}));try{await ml(Yy(r,`/api/projects/${encodeURIComponent(t.id)}`),{method:"DELETE"}),y({...Ej});let E="项目已删除";i((D)=>({...D,saving:!1,notice:E})),F("success",E),await U()}catch(E){i((D)=>({...D,saving:!1,error:El(E,"删除项目失败")}))}}async function L(E){let D=E.target.files?.[0];if(!D)return;i((Y)=>({...Y,importing:!0,error:"",notice:""}));try{let Y=fY(await D.arrayBuffer()),V=`Excel 已导入 ${(await ml(Yy(r,"/api/import/excel"),{method:"POST",body:JSON.stringify({fileName:D.name,contentBase64:Y,replace:!1})})).imported||0} 条项目`;i((B)=>({...B,importing:!1,notice:V})),F("success",V),E.target.value="",await U()}catch(Y){i((p)=>({...p,importing:!1,error:El(Y,"Excel 导入失败")}))}}async function J(){i((E)=>({...E,exporting:!0,error:""}));try{let E=await IU(Yy(r,"/api/projects/export.xlsx")),D=URL.createObjectURL(E),Y=document.createElement("a");Y.href=D,Y.download=`project-manager-${E7()}.xlsx`,document.body.appendChild(Y),Y.click(),Y.remove(),URL.revokeObjectURL(D),i((p)=>({...p,exporting:!1,notice:"Excel 已导出"}))}catch(E){i((D)=>({...D,exporting:!1,error:El(E,"Excel 导出失败")}))}}if(!f)return _l(YL,{title:"Project Manager 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=project-manager"});let w=dX(f),Q=lY(f),q=eX(f),T=Array.isArray(n.list?.projects)?n.list.projects:[],O=n.list?.summary||{},Z=n.health||{};return _l("div",{className:"project-manager-page","data-testid":"project-manager-page"},_l(Oj,{title:"项目管理工作台",eyebrow:"Main Server PostgreSQL 用户服务",loading:n.loading||n.exporting,actions:_l("div",{className:"panel-actions"},_l("button",{type:"button",className:"ghost-btn",disabled:n.loading,onClick:()=>U(),"data-testid":"project-manager-refresh-button"},n.loading?"刷新中":"刷新"),_l("button",{type:"button",className:"ghost-btn",disabled:n.exporting,onClick:J,"data-testid":"project-manager-export-button"},n.exporting?"导出中":"导出 Excel"),_l(XL,{title:"Project Manager 用户服务",data:f,onOpen:u,testId:"raw-project-manager-service"}))},_l("div",{className:"project-manager-hero"},_l(eA,{label:"项目总数",value:O.total??T.length,hint:`PG 表 ${Z.storage?.table||"project_manager_projects"}`,tone:"ok"}),_l(eA,{label:"进行中",value:O.active??"--",hint:"当前状态未完全完成"}),_l(eA,{label:"已完成",value:O.completed??"--",hint:"按 完成 关键字统计",tone:"ok"}),_l(eA,{label:"未全款",value:O.unpaid??"--",hint:"付款比例 < 1",tone:Number(O.unpaid||0)>0?"warn":"ok"})),_l(lu,{error:n.error}),n.notice?_l("div",{className:"form-success"},n.notice):null),_l("div",{className:"project-manager-hero"},_l("div",{className:"microservice-ref-card"},_l("span",null,"Repo"),_l("strong",null,Q.url||"--"),_l("code",null,Q.commitId||"--")),_l("div",{className:"microservice-ref-card"},_l("span",null,"Main Server Docker"),_l("strong",null,`${q.nodeBindHost||"--"}:${q.nodePort||"--"}`),_l("code",null,`${Q.composeService||"--"} / ${Q.containerName||"--"}`)),_l("div",{className:"microservice-ref-card"},_l("span",null,"Runtime"),_l("strong",null,w.providerName||f.providerId),_l("code",null,`Health ${Z.ok?"OK":"--"} / ${n.refreshedAt?iu(n.refreshedAt):"--"}`)),_l("div",{className:"microservice-ref-card"},_l("span",null,"Import Source"),_l("strong",null,"D601 WeChat Excel"),_l("code",null,"合作项目列表_I_20260309.xlsx"))),_l("div",{className:"project-manager-layout"},_l(Oj,{title:"项目清单",eyebrow:"CRUD + Excel Export",loading:n.loading||n.importing||n.exporting,actions:_l("div",{className:"inline-actions project-manager-filters"},_l("input",{value:c,onChange:(E)=>$(E.target.value),placeholder:"搜索合同号 / 项目名称 / 状态","data-testid":"project-manager-search"}),_l("select",{value:A,onChange:(E)=>{j(E.target.value),U(c,E.target.value)},"data-testid":"project-manager-status-filter"},_l("option",{value:"all"},"全部"),_l("option",{value:"active"},"进行中"),_l("option",{value:"completed"},"已完成"),_l("option",{value:"unpaid"},"未全款")),_l("button",{type:"button",className:"ghost-btn",onClick:()=>U(c,A)},"筛选"))},_l(nY,{projects:T,activeId:t.id,onSelect:(E)=>y(uY(E)),onRaw:u})),_l(Oj,{title:t.id?"编辑项目":"新建项目",eyebrow:"PostgreSQL Write Path",loading:n.saving||n.importing},_l("form",{className:"stack-form project-manager-form",onSubmit:N,"data-testid":"project-manager-form"},t.id?_l("label",null,"项目 ID",_l("input",{value:t.id,disabled:!0})):null,_l("label",null,"序号",_l("input",{type:"number",value:t.sequenceNo,onChange:(E)=>y((D)=>({...D,sequenceNo:E.target.value}))})),_l("label",null,"合同号",_l("input",{value:t.contractNo,onChange:(E)=>y((D)=>({...D,contractNo:E.target.value})),required:!0})),_l("label",null,"项目名称",_l("input",{value:t.name,onChange:(E)=>y((D)=>({...D,name:E.target.value})),required:!0})),_l("label",null,"当前状况",_l("textarea",{value:t.currentStatus,onChange:(E)=>y((D)=>({...D,currentStatus:E.target.value}))})),_l("label",null,"待完成",_l("textarea",{value:t.pending,onChange:(E)=>y((D)=>({...D,pending:E.target.value}))})),_l("label",null,"付款情况",_l("input",{value:t.paymentStatus,onChange:(E)=>y((D)=>({...D,paymentStatus:E.target.value})),placeholder:"例如 1 / 0.5 / 50%"})),_l("label",null,"其它",_l("input",{value:t.notes,onChange:(E)=>y((D)=>({...D,notes:E.target.value}))})),_l("div",{className:"inline-actions"},_l("button",{type:"submit",className:"primary-btn",disabled:n.saving,"data-testid":"project-manager-save-button"},n.saving?"保存中":t.id?"保存修改":"创建项目"),_l("button",{type:"button",className:"ghost-btn",onClick:()=>y({...Ej})},"清空"),t.id?_l("button",{type:"button",className:"danger-btn",disabled:n.saving,onClick:W,"data-testid":"project-manager-delete-button"},"删除"):null)),_l("div",{className:"project-manager-import"},_l("p",{className:"muted paragraph"},"浏览器只访问 UniDesk frontend;后端通过同源用户服务代理写入主 PostgreSQL,不暴露 4233 公网端口。"),_l("label",{className:"file-import"},n.importing?"导入中...":"导入 Excel",_l("input",{type:"file",accept:".xlsx",onChange:L,disabled:n.importing,"data-testid":"project-manager-import-input"}))))))}var f6=Rl(Ju(),1);var Fl=f6.default.createElement,{useEffect:iY}=f6.default,lf=f6.default.useState;function tY({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return Fl("span",{className:`status-badge ${r}`},u||l||"unknown")}function u6({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 pj({title:l,eyebrow:u,actions:r,children:f,className:n,loading:i}){return Fl("section",{className:`panel ${n||""}`},Fl("div",{className:"panel-head"},Fl("div",null,u?Fl("p",{className:"panel-eyebrow"},u):null,Fl(fu,{title:l,loading:i})),r?Fl("div",{className:"panel-actions"},r):null),Fl("div",{className:"panel-body"},f))}function CL({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 r6({title:l,text:u}){return Fl("div",{className:"empty-state"},Fl("strong",null,l),Fl("span",null,u))}function yY(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function cY(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function _Y(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function hL(l){return String(l).replace(/[^a-zA-Z0-9_-]/g,"_")}function $Y(l){if(!Number.isFinite(l))return"--";return`${l.toFixed(1)}%`}function Py(l,u){return`${l}/microservices/todo-note/proxy${u}`}function RL(l){return l.reduce((u,r)=>{let f=RL(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 Bj(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)=>Bj(n,u))}function ML(l){return Array.isArray(l?.instances)?l.instances:[]}function Hj(l,u){for(let r of l){if(r?.id===u)return Array.isArray(r.children)?r.children:[];let f=Hj(Array.isArray(r?.children)?r.children:[],u);if(f.length>0)return f}return[]}function xL({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((o)=>o.id==="todo-note")||null,[n,i]=lf(null),[t,y]=lf(null),[c,$]=lf(""),[A,j]=lf(null),[F,U]=lf("all"),[N,W]=lf(13),[L,J]=lf(""),[w,Q]=lf(""),[q,T]=lf(""),[O,Z]=lf(""),[E,D]=lf(""),[Y,p]=lf(!1),[V,B]=lf(""),[m,X]=lf(null),S=ML(t),b=RL(Array.isArray(A?.todos)?A.todos:[]),z=f?yY(f):{},P=f?_Y(f):{},s=f?cY(f):{};async function k(o=c){let[ql,pl]=await Promise.all([ml(`${r}/microservices/todo-note/health`),ml(Py(r,"/api/instances"))]);i(ql),y(pl);let Bl=ML(pl),Il=Bl.some((nu)=>nu.id===o)?o:Bl[0]?.id||"";return $(Il),Il}async function v(o=c){if(!o){j(null);return}let ql=await ml(Py(r,`/api/instances/${encodeURIComponent(o)}`));j(ql)}async function tl(o=c){if(!f)return;p(!0),B("");try{let ql=await k(o);await v(ql),X(new Date)}catch(ql){B(El(ql,"Todo Note 加载失败"))}finally{p(!1)}}async function I(o){if(!c)return null;B("");try{let ql=await ml(Py(r,`/api/instances/${encodeURIComponent(c)}/actions`),{method:"POST",body:JSON.stringify({action:o})});return j(ql),await k(c),ql}catch(ql){return B(El(ql,"Todo 操作失败")),null}}async function M(o){o.preventDefault();let ql=L.trim();if(!ql)return;p(!0),B("");try{let pl=await ml(Py(r,"/api/instances"),{method:"POST",body:JSON.stringify({name:ql})});J(""),await tl(pl.id)}catch(pl){B(El(pl,"创建清单失败"))}finally{p(!1)}}async function rl(o){if(!window.confirm("确认删除这个 Todo Note 清单?"))return;p(!0),B("");try{await ml(Py(r,`/api/instances/${encodeURIComponent(o)}`),{method:"DELETE"}),await tl(c===o?"":c)}catch(ql){B(El(ql,"删除清单失败"))}finally{p(!1)}}async function cl(o){o.preventDefault();let ql=w.trim();if(!ql)return;Q(""),await I({type:"addTodo",title:ql})}async function $l(o){if(!c)return;B("");try{let ql=await ml(Py(r,`/api/instances/${encodeURIComponent(c)}/${o}`),{method:"POST",body:JSON.stringify({})});j(ql),await k(c)}catch(ql){B(El(ql,`${o} 失败`))}}function Tl(o){T(o.id),Z(String(o.title||""))}async function Ql(o){let ql=O.trim();if(T(""),Z(""),ql)await I({type:"updateTodoTitle",todoId:o,title:ql})}async function Ol(o){let pl=window.prompt("新增子任务标题")?.trim();if(!pl)return;let Bl=Hj(Array.isArray(A?.todos)?A.todos:[],o),Il=new Set(Bl.map((Qr)=>Qr.id)),nu=await I({type:"addTodo",title:pl,parentId:o,targetIndex:0});if(!nu)return;let Ml=Hj(Array.isArray(nu?.todos)?nu.todos:[],o),wu=Ml.find((Qr)=>!Il.has(Qr.id));if(wu&&Ml[0]?.id!==wu.id)await I({type:"moveTodo",todoId:wu.id,targetParentId:o,targetIndex:0})}async function h(o,ql){if(!E)return;let pl={type:"moveTodo",todoId:E,targetIndex:ql};if(o)pl.targetParentId=o;D(""),await I(pl)}if(iY(()=>{tl()},[f?.id,f?.runtime?.providerStatus]),!f)return Fl(r6,{title:"Todo Note 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=todo-note"});let a=S.find((o)=>o.id===c)||null,ul=Array.isArray(A?.todos)?A.todos:[],zl=ul.map((o,ql)=>({todo:o,index:ql})).filter((o)=>Bj(o.todo,F));return Fl("div",{className:"todo-note-page","data-testid":"todo-note-page"},Fl(pj,{title:"Todo Note 工作台",eyebrow:"Main Server 用户服务",loading:Y,actions:Fl("div",{className:"panel-actions"},Fl("button",{type:"button",className:"ghost-btn",disabled:Y,onClick:()=>tl(c),"data-testid":"todo-note-refresh-button"},Y?"刷新中":"刷新"),Fl(CL,{title:"Todo Note 用户服务",data:f,onOpen:u,testId:"raw-todo-note-service"}))},Fl("div",{className:"todo-note-hero"},Fl("div",null,Fl("div",{className:"node-version-line"},Fl(tY,{status:z.providerStatus==="online"?"online":"warn"},z.providerStatus||"unknown"),Fl("span",null,f.providerId),Fl("span",null,s.public?"公网暴露":"仅 UniDesk frontend 代理访问"),Fl("span",null,n?.ok?"Health OK":"Health --")),Fl("p",{className:"muted paragraph"},f.description)),Fl("div",{className:"microservice-ref-card"},Fl("span",null,"Repo"),Fl("strong",null,P.url||"--"),Fl("code",null,P.commitId||"--")),Fl("div",{className:"microservice-ref-card"},Fl("span",null,"Main Server Docker"),Fl("strong",null,`${s.nodeBindHost||"--"}:${s.nodePort||"--"}`),Fl("code",null,`${P.composeService||"--"} / ${P.containerName||"--"}`))),Fl(lu,{error:V,wide:!0})),Fl("div",{className:"todo-note-layout"},Fl(pj,{title:"清单",eyebrow:`${S.length} Instances`,className:"todo-list-panel",loading:Y},Fl("form",{className:"todo-create-list",onSubmit:M},Fl("input",{placeholder:"新清单名称",value:L,onChange:(o)=>J(o.target.value),"aria-label":"新清单名称"}),Fl("button",{type:"submit",className:"ghost-btn",disabled:Y||!L.trim()},"创建")),S.length===0?Fl(r6,{title:"暂无清单",text:"迁移或创建清单后会出现在这里"}):Fl("div",{className:"todo-instance-list"},S.map((o)=>Fl("button",{key:o.id,type:"button",className:`todo-instance-row ${c===o.id?"active":""}`,onClick:()=>{$(o.id),v(o.id)},"data-testid":`todo-instance-${hL(o.id)}`},Fl("strong",null,o.name),Fl("span",null,`${o.completedCount??0}/${o.todoCount??0} 完成`),Fl("code",null,o.id))))),Fl("div",{className:"todo-main-stack"},Fl(pj,{title:a?.name||"待选择清单",eyebrow:m?`Updated ${iu(m)}`:"Todo Tree",loading:Y,actions:A?Fl("div",{className:"panel-actions"},Fl("button",{type:"button",className:"ghost-btn",onClick:()=>I({type:"renameInstance",name:window.prompt("清单新名称",A.name)||A.name})},"重命名"),Fl("button",{type:"button",className:"ghost-btn danger",onClick:()=>rl(c)},"删除清单"),Fl(CL,{title:`Todo Instance ${c}`,data:A,onOpen:u,testId:"raw-todo-instance"})):null},!A?Fl(r6,{title:"未选择清单",text:"左侧选择一个 Todo Note 清单"}):Fl("div",{className:"todo-workbench",style:{"--todo-font-size":`${N}px`}},Fl("div",{className:"todo-toolbar"},Fl("form",{className:"todo-add-form",onSubmit:cl},Fl("input",{placeholder:"新增根任务",value:w,onChange:(o)=>Q(o.target.value),"aria-label":"新增根任务"}),Fl("button",{type:"submit",className:"ghost-btn",disabled:!w.trim()},"新增")),Fl("div",{className:"todo-filter-strip"},["all","active","completed"].map((o)=>Fl("button",{key:o,type:"button",className:`todo-filter ${F===o?"active":""}`,onClick:()=>U(o)},o==="all"?"全部":o==="active"?"未完成":"已完成"))),Fl("div",{className:"todo-toolbar-actions"},Fl("button",{type:"button",className:"ghost-btn",onClick:()=>I({type:"setAllTodosExpanded",expanded:!0})},"全部展开"),Fl("button",{type:"button",className:"ghost-btn",onClick:()=>I({type:"setAllTodosExpanded",expanded:!1})},"全部收起"),Fl("button",{type:"button",className:"ghost-btn",onClick:()=>$l("undo")},"撤销"),Fl("button",{type:"button",className:"ghost-btn",onClick:()=>$l("redo")},"重做"),Fl("label",{className:"todo-font-control"},"字号",Fl("input",{type:"range",min:11,max:18,value:N,onChange:(o)=>W(Number(o.target.value))})))),Fl("div",{className:"todo-stats-grid"},Fl(u6,{label:"总任务",value:b.total,hint:`${S.length} lists`}),Fl(u6,{label:"已完成",value:b.completed,hint:`${$Y(b.total?b.completed/b.total*100:0)}`,tone:"ok"}),Fl(u6,{label:"未完成",value:b.active,hint:F==="active"?"当前筛选":"active tasks",tone:b.active>0?"warn":"ok"}),Fl(u6,{label:"历史指针",value:A.historyPointer??0,hint:"undo / redo"})),Fl("div",{className:"todo-root-drop",onDragOver:(o)=>o.preventDefault(),onDrop:(o)=>{o.preventDefault(),h(null,ul.length)}},"拖到这里可移为根任务末尾"),Fl("div",{className:"todo-tree","data-testid":"todo-note-tree"},zl.length===0?Fl(r6,{title:"没有匹配任务",text:"调整筛选或新增任务"}):zl.map(({todo:o,index:ql})=>Fl(bL,{key:o.id,todo:o,depth:0,parentId:null,index:ql,siblingCount:ul.length,filter:F,editingId:q,editingTitle:O,setEditingTitle:Z,beginEdit:Tl,saveEdit:Ql,applyTodoAction:I,addChild:Ol,dragTodoId:E,setDragTodoId:D,dropTodo:h}))))))))}function bL(l){let{todo:u,depth:r,parentId:f,index:n,siblingCount:i,filter:t,editingId:y,editingTitle:c,setEditingTitle:$,beginEdit:A,saveEdit:j,applyTodoAction:F,addChild:U,dragTodoId:N,setDragTodoId:W,dropTodo:L}=l,J=Array.isArray(u.children)?u.children:[],w=J.map((T,O)=>({child:T,childIndex:O})).filter((T)=>Bj(T.child,t)),Q=y===u.id,q=f||null;return Fl("div",{className:"todo-row-wrap"},Fl("article",{className:`todo-row ${u.completed?"completed":""} ${N===u.id?"dragging":""}`,style:{"--todo-depth":r},draggable:!0,onDragStart:(T)=>{W(u.id),T.dataTransfer.effectAllowed="move"},onDragOver:(T)=>T.preventDefault(),onDrop:(T)=>{T.preventDefault(),L(u.id,J.length)},"data-testid":`todo-row-${hL(u.id)}`},Fl("button",{type:"button",className:"todo-expand",disabled:J.length===0,onClick:()=>F({type:"toggleTodoExpanded",todoId:u.id})},J.length===0?"·":u.expanded?"▾":"▸"),Fl("input",{type:"checkbox",checked:Boolean(u.completed),onChange:()=>F({type:"toggleTodoCompleted",todoId:u.id}),"aria-label":`完成 ${u.title}`}),Fl("div",{className:"todo-title-cell",onDoubleClick:()=>A(u)},Q?Fl("div",{className:"todo-edit-inline"},Fl("input",{value:c,autoFocus:!0,onChange:(T)=>$(T.target.value),onKeyDown:(T)=>{if(T.key==="Enter")j(u.id);if(T.key==="Escape")A({id:"",title:""})}}),Fl("button",{type:"button",className:"ghost-btn",onClick:()=>j(u.id)},"保存")):Fl("strong",null,u.title||"Untitled"),Fl("div",{className:"todo-meta-line"},Fl("span",null,`子项 ${J.length}`),Fl("span",null,`更新 ${Wl(u.updatedAt)}`),u.reminderAt?Fl("span",{className:"todo-reminder"},`提醒 ${Wl(u.reminderAt)}`):Fl("span",null,"无提醒"))),Fl("input",{className:"todo-reminder-input",type:"datetime-local",value:D6(u.reminderAt),onChange:(T)=>F({type:"setTodoReminder",todoId:u.id,reminderAt:O7(T.target.value)})}),Fl("div",{className:"todo-row-actions"},Fl("button",{type:"button",className:"ghost-btn",onClick:()=>A(u)},"编辑"),Fl("button",{type:"button",className:"ghost-btn",onClick:()=>U(u.id)},"子项"),Fl("button",{type:"button",className:"ghost-btn",disabled:n<=0,onClick:()=>F({type:"moveTodo",todoId:u.id,...q?{targetParentId:q}:{},targetIndex:n-1})},"上移"),Fl("button",{type:"button",className:"ghost-btn",disabled:n<=0,onClick:()=>F({type:"moveTodo",todoId:u.id,...q?{targetParentId:q}:{},targetIndex:0})},"置顶"),Fl("button",{type:"button",className:"ghost-btn",disabled:n>=i-1,onClick:()=>F({type:"moveTodo",todoId:u.id,...q?{targetParentId:q}:{},targetIndex:n+1})},"下移"),Fl("button",{type:"button",className:"ghost-btn",disabled:!f,onClick:()=>F({type:"moveTodo",todoId:u.id,targetIndex:9999})},"提升"),Fl("button",{type:"button",className:"ghost-btn danger",onClick:()=>F({type:"deleteTodo",todoId:u.id})},"删除"))),u.expanded&&w.length>0?Fl("div",{className:"todo-children"},w.map(({child:T,childIndex:O})=>Fl(bL,{key:T.id,todo:T,depth:r+1,parentId:u.id,index:O,siblingCount:J.length,filter:t,editingId:y,editingTitle:c,setEditingTitle:$,beginEdit:A,saveEdit:j,applyTodoAction:F,addChild:U,dragTodoId:N,setDragTodoId:W,dropTodo:L}))):null)}var vL=Rl(Ju(),1),f0=vL.default.createElement;function sL({title:l,items:u,actions:r,className:f,testId:n}){let i=Array.isArray(u)?u:[];return f0("section",{className:`top-status-bar ${f||""}`,"data-testid":n},f0("div",{className:"top-status-main"},l?f0("strong",{className:"top-status-title"},l):null,f0("div",{className:"top-status-chips"},i.map((t,y)=>f0("span",{key:t?.key||`${t?.label||"status"}-${y}`,className:`top-status-chip ${t?.tone||""}`,"data-testid":t?.testId},t?.label?f0("b",null,t.label):null,f0("span",null,t?.value??"--"))))),r?f0("div",{className:"top-status-actions"},r):null)}var y_=Rl(Ju(),1);var wl=y_.default.createElement,{useEffect:AY,useMemo:jY}=y_.default,FY=y_.default.useState;function kL({status:l,children:u,title:r}){let f=String(l||"unknown").toLowerCase();return wl("span",{className:`status-badge ${f}`,title:r},u||l||"unknown")}function n6({label:l,value:u,hint:r,tone:f}){return wl("article",{className:`metric-card ${f||""}`},wl("div",{className:"metric-label"},l),wl("div",{className:"metric-value"},u),wl("div",{className:"metric-hint"},r))}function Dj({title:l,eyebrow:u,actions:r,children:f,className:n,loading:i}){return wl("section",{className:`panel ${n||""}`},wl("div",{className:"panel-head"},wl("div",null,u?wl("p",{className:"panel-eyebrow"},u):null,wl(fu,{title:l,loading:i})),r?wl("div",{className:"panel-actions"},r):null),wl("div",{className:"panel-body"},f))}function gL({title:l,data:u,onOpen:r,testId:f}){return wl("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r?.(l,u)},"查看原始JSON")}function Vj({title:l,text:u}){return wl("div",{className:"empty-state"},wl("strong",null,l),wl("span",null,u))}function Cy(l){return Array.isArray(l)?l:[]}function Sj(l){return l&&typeof l==="object"&&!Array.isArray(l)?l:{}}function JY(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function UY(l,u){return`${l}/microservices/k3sctl-adapter/proxy${u}`}function NY(l){return l.find((u)=>String(u?.id||"")==="k3sctl-adapter")||null}function QY(l){if(l?.healthy===!0)return"online";if(String(l?.role||"")==="standby")return"warn";return"failed"}function wY(l){return l?.healthy===!0?"online":"failed"}function qY(l){if(l===!0)return"YES";if(l===!1)return"NO";return"--"}function WY(l){return Array.from(new Set(l.flatMap((u)=>Cy(u?.expectedNodeIds).map((r)=>String(r))))).filter(Boolean).sort()}function LY(l){let u=l.find((r)=>r?.id==="code-queue")||l[0];return String(u?.activeInstanceId||"--")}function GY(l){return wl("article",{key:l?.id||l?.nodeId,className:"k3s-instance-card"},wl("div",{className:"node-card-head"},wl("strong",null,l?.nodeId||l?.id||"--"),wl(kL,{status:QY(l)},l?.healthy?"HEALTHY":"DEGRADED")),wl("div",{className:"k3s-instance-role"},wl("span",null,String(l?.role||"worker").toUpperCase()),wl("code",null,l?.id||"--")),wl("dl",{className:"k3s-kv"},wl("dt",null,"Base URL"),wl("dd",null,wl("code",null,l?.baseUrl||"--")),wl("dt",null,"Proxy"),wl("dd",null,l?.proxyMode||"--"),wl("dt",null,"Health"),wl("dd",null,`${l?.upstreamStatus??"--"} / ${l?.status||"unknown"}`),wl("dt",null,"Checked"),wl("dd",null,Wl(l?.checkedAt))))}function TY(l,u){let r=Cy(l?.instances),f=Sj(l?.active);return wl(Dj,{key:l?.id||"service",title:l?.id||"managed-service",eyebrow:`${l?.namespace||"unidesk"} / k3s managed service`,className:"k3s-service-panel",actions:wl(gL,{title:`k3s service ${l?.id||""}`,data:l,onOpen:u,testId:`raw-k3s-service-${l?.id||"unknown"}`})},wl("div",{className:"k3s-service-summary"},wl("div",null,wl("span",null,"状态"),wl(kL,{status:wY(l)},l?.status||"unknown")),wl("div",null,wl("span",null,"Active"),wl("strong",null,l?.activeInstanceId||"--")),wl("div",null,wl("span",null,"Single Writer"),wl("strong",null,qY(l?.singleWriter))),wl("div",null,wl("span",null,"Active Health"),wl("strong",null,f?.upstreamStatus??"--"))),r.length===0?wl(Vj,{title:"暂无 k3s 实例",text:"adapter 没有返回该服务的 endpoint 列表"}):wl("div",{className:"k3s-instance-grid"},r.map(GY)))}function IL({microservices:l,onRaw:u,apiBaseUrl:r,onNavigate:f}){let n=NY(Array.isArray(l)?l:[]),i=JY(n),[t,y]=FY({loading:!1,error:"",data:null,refreshedAt:null});async function c(){y((w)=>({...w,loading:!0,error:""}));try{let w=await ml(UY(r,"/api/control-plane"));y({loading:!1,error:"",data:w,refreshedAt:new Date})}catch(w){y((Q)=>({...Q,loading:!1,error:El(w,"加载 k3s 控制平面失败")}))}}AY(()=>{c()},[r]);let $=jY(()=>Cy(t.data?.services),[t.data]),A=WY($),j=$.filter((w)=>w?.healthy===!0).length,F=$.reduce((w,Q)=>w+Cy(Q?.instances).length,0),U=$.reduce((w,Q)=>w+Cy(Q?.instances).filter((q)=>q?.healthy===!0).length,0),N=LY($),W=Sj(t.data?.kubectl),L=Sj(t.data?.kubeApiProxy),J=Cy(t.data?.manifestPaths).map((w)=>String(w));if(!n)return wl(Vj,{title:"k3sctl-adapter 未登记",text:"请在 config.json 的 microservices 中登记 id=k3sctl-adapter,并通过该微服务连接 k3s 控制平面。"});return wl("div",{className:"k3s-page","data-testid":"k3sctl-page"},wl(Dj,{title:"k3s Control Plane",eyebrow:"Managed by k3sctl-adapter",className:"k3s-hero-panel",loading:t.loading,actions:wl(y_.default.Fragment,null,wl("button",{type:"button",className:"ghost-btn",onClick:c,disabled:t.loading,"data-testid":"k3s-refresh-button"},t.loading?"刷新中":"刷新"),f?wl("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","code-queue"),"data-testid":"k3s-open-code-queue"},"打开 Code Queue"):null,wl(gL,{title:"k3sctl-adapter microservice",data:n,onOpen:u,testId:"raw-k3s-adapter"}))},wl("div",{className:"k3s-hero"},wl("div",{className:"k3s-orb","aria-hidden":"true"},wl("span",null,"k3s")),wl("div",{className:"k3s-hero-copy"},wl("p",{className:"eyebrow"},"D601 native control plane"),wl("h2",null,"UniDesk 只管理 adapter;业务微服务交给 k3s 标准服务路由"),wl("p",{className:"muted paragraph"},"Code Queue 的前端/API 请求进入 k3sctl-adapter,再由 adapter 转发到 k3s active service。provider-gateway 只用于维护 adapter 和节点诊断,不再直接管理 Code Queue 容器。"),wl("div",{className:"k3s-route-strip"},wl("span",null,"NO FALLBACK"),wl("code",null,t.data?.runtimePath||"frontend -> backend-core -> k3sctl-adapter")))),wl("div",{className:"metric-grid"},wl(n6,{label:"控制面",value:t.data?.clusterId||"D601",hint:`adapter ${i.providerStatus||"unknown"}`,tone:i.providerStatus==="online"?"ok":"warn"}),wl(n6,{label:"代管服务",value:$.length,hint:`${j}/${$.length||0} healthy`,tone:j===$.length&&$.length>0?"ok":"warn"}),wl(n6,{label:"节点",value:A.join(" / ")||"--",hint:"expected k3s nodes"}),wl(n6,{label:"实例",value:`${U}/${F}`,hint:`active ${N}`,tone:U===F&&F>0?"ok":"warn"})),wl("div",{className:"k3s-control-plane-grid"},wl("article",{className:"k3s-control-plane-card"},wl("span",null,"service proxy"),wl("strong",null,L.configured===!0?"K8S API PROXY":"PROXY DEGRADED"),wl("p",null,L.configured===!0?`${L.mode||"kubernetes-api-service-proxy"} via ${L.connectHost||"--"}`:"adapter 必须通过 k8s API service proxy 访问业务服务,不回退到业务容器直连。")),wl("article",{className:"k3s-control-plane-card"},wl("span",null,"manifests"),wl("strong",null,J.length||"--"),wl("p",null,J.join(" / ")||"未配置 manifest")),wl("article",{className:"k3s-control-plane-card"},wl("span",null,"cluster snapshot"),wl("strong",null,W.enabled===!0?W.ok===!0?"KUBECTL OK":"KUBECTL DEGRADED":"API ONLY"),wl("p",null,W.enabled===!0?`nodes ${W.nodeCount??"--"}`:"控制面页面以 adapter 返回的 k8s service proxy 状态为准;kubectl 只作为可选快照。"))),t.error?wl(lu,{error:t.error}):null,t.refreshedAt?wl("p",{className:"muted paragraph"},`最近刷新 ${iu(t.refreshedAt)}`):null),$.length===0?wl(Dj,{title:"代管服务",eyebrow:"k3s services",loading:t.loading},wl(Vj,{title:"暂无 k3s 服务",text:"等待 k3sctl-adapter 返回 /api/services;Code Queue 应显示 D601 scheduler/read/write 服务实例。"})):$.map((w)=>TY(w,u)))}var c_=Rl(Ju(),1);var ou=c_.default.createElement;function aL({onClose:l}){let{notifications:u,removeNotification:r,clearNotifications:f}=Xr(),n=c_.default.useRef(null);if(c_.default.useEffect(()=>{let i=(t)=>{if(n.current&&!n.current.contains(t.target))l()};return document.addEventListener("mousedown",i),()=>document.removeEventListener("mousedown",i)},[l]),u.length===0)return ou("div",{className:"notification-popup",ref:n},ou("div",{className:"notification-popup-header"},ou("span",null,"通知"),ou("button",{className:"notification-popup-close",onClick:l},"×")),ou("div",{className:"notification-popup-empty"},"暂无通知"));return ou("div",{className:"notification-popup",ref:n},ou("div",{className:"notification-popup-header"},ou("span",null,`通知 (${u.length})`),ou("div",{className:"notification-popup-actions"},ou("button",{className:"notification-popup-clear",onClick:f},"清空"),ou("button",{className:"notification-popup-close",onClick:l},"×"))),ou("div",{className:"notification-popup-list"},u.slice().reverse().map((i)=>ou("div",{key:i.id,className:`notification-item ${i.type}`},ou("span",{className:"notification-item-icon"},i.type==="success"?"✓":"×"),ou("span",{className:"notification-item-message"},i.message),ou("button",{className:"notification-item-dismiss",onClick:()=>r(i.id)},"×")))))}function oL({notification:l}){let{removeNotification:u}=Xr();return c_.default.useEffect(()=>{let r=setTimeout(()=>{u(l.id)},3000);return()=>clearTimeout(r)},[l.id,u]),ou("div",{className:`notification-banner ${l.type}`,role:"alert"},ou("span",{className:"notification-banner-icon"},l.type==="success"?"✓":"×"),ou("span",{className:"notification-banner-message"},l.message),ou("button",{className:"notification-banner-dismiss",onClick:()=>u(l.id)},"×"))}function $G(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 sl=$G("data-config",{apiBaseUrl:"/api",authUsername:"admin"}),dL=sl.environment&&typeof sl.environment==="object"?sl.environment:{},mY=$G("data-codex-overview",null),_=i0.default.createElement,{useEffect:En,useMemo:A_}=i0.default,kl=i0.default.useState,Cj=i0.default.createContext(!1),Xf=bQ(p3),KY={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 eL(){return typeof document>"u"||document.visibilityState!=="hidden"}function AG(l){return l?.environment==="dev"||l?.namespace==="unidesk-dev"}function zY(l){let u=typeof l==="string"?l:"";return u.length>=7?u.slice(0,7):u||"unknown"}function EY(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 OY(l){if(!l?._summaryOnly||!l?.id)return l;return(await ml(`${sl.apiBaseUrl}/tasks/${encodeURIComponent(String(l.id))}`))?.task||l}function j_(l){return l?._summaryOnly?{...l,_loadRaw:()=>OY(l)}:l}function fi(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 Wf(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 fi(u/1000)}function Nr(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 ft(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 pY(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=Wl(u);if(n!=="--")return n}if(l==="bodyText"&&typeof u==="string")return`${/^\s*[{[]/.test(u)?"JSON":"HTTP"} body ${u.length} chars`;return ft(u)}function JG(l){if(!l||typeof l!=="object"||Array.isArray(l))return[];return Object.entries(l)}function uf(l){return String(l).replace(/[^a-zA-Z0-9_-]/g,"_")}function hj(l,u){return l&&typeof l==="object"&&!Array.isArray(l)?l[u]:void 0}function t6(l,u,r="未知"){let f=hj(l?.labels,u);return typeof f==="string"&&f.length>0?f:r}function UG(l){return t6(l,"providerGatewayVersion")}function $_(l){return t6(l,"providerGatewayUpgradePolicy")}function lG(l){return t6(l,"providerGatewayStartedAt","")}function NG(l){let u=hj(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 QG(l,u){return NG(l).includes(u)}function uG(l,u){let r=hj(l?.labels,u);return r===!0||r==="true"||r==="1"}function HY(l){if(!QG(l,"host.ssh"))return{tone:"fail",label:"不可用",detail:"未声明 host.ssh"};if(!uG(l,"hostSshConfigured"))return{tone:"warn",label:"未配置",detail:"缺少 SSH 环境变量"};if(!uG(l,"hostSshKeyPresent"))return{tone:"warn",label:"缺 key",detail:"私钥未挂载"};return{tone:"ok",label:"可用",detail:t6(l,"hostSshTarget","host.ssh ready")}}function BY(l){if(!QG(l,"provider.upgrade"))return{tone:"fail",label:"不可用",detail:"未声明 provider.upgrade"};let u=$_(l);if(u!=="always-enabled")return{tone:"warn",label:"待确认",detail:`策略 ${u}`};return{tone:"ok",label:"可用",detail:"always-enabled"}}function Rj(l){let u=typeof l==="string"&&l.length>0?l:"未知";if(u==="未知")return"版本未知";return u.startsWith("v")?u:`v${u}`}function wG(l){return l?.payload&&typeof l.payload==="object"&&!Array.isArray(l.payload)?l.payload:{}}function y6(l){return l?.result&&typeof l.result==="object"&&!Array.isArray(l.result)?l.result:{}}function i6(l){let u=wG(l),r=y6(l);return(u.mode??r.mode)==="schedule"?"schedule":"plan"}function DY(l){let u=wG(l).source;return typeof u==="string"&&u.length>0?u:"unknown"}function VY(l){let u=y6(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 qG(l){let u=y6(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?Rj(f):"版本未知"}function WG(l){if(String(l?.status||"").toLowerCase()==="failed")return FG(l);if(hy(l))return"等待 provider 回传升级终态";let r=y6(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 LG(l,u){return l.filter((r)=>r?.providerId===u&&r?.command==="provider.upgrade").sort((r,f)=>(On(f.updatedAt)??0)-(On(r.updatedAt)??0))}function SY(l){return l.find((u)=>i6(u)==="schedule")||l[0]||null}function GG(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function rG(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function XY(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function Tu({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return _("span",{className:`status-badge ${r}`},u||l||"unknown")}function Nu({label:l,value:u,hint:r,tone:f,onClick:n,testId:i}){let t=typeof n==="function";return _("article",{className:`metric-card ${f||""} ${t?"clickable":""}`,role:t?"button":void 0,tabIndex:t?0:void 0,"data-testid":i,onClick:n,onKeyDown:t?(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 uu({title:l,eyebrow:u,actions:r,children:f,className:n,loading:i}){let t=i0.default.useContext(Cj),y=Boolean(i)||t;return _("section",{className:`panel ${n||""}`},_("div",{className:"panel-head"},_("div",null,u?_("p",{className:"panel-eyebrow"},u):null,_(fu,{title:l,loading:y})),r?_("div",{className:"panel-actions"},r):null),_("div",{className:"panel-body"},f))}function du({title:l,data:u,onOpen:r,testId:f}){let[n,i]=kl(!1),t=u&&typeof u==="object"&&typeof u._loadRaw==="function"?u._loadRaw:null;async function y(){if(!t){r(l,u);return}i(!0);try{r(l,await t())}catch(c){r(l,{ok:!1,error:El(c,"读取原始 JSON 失败"),fallback:u})}finally{i(!1)}}return _("button",{type:"button",className:"ghost-btn","data-testid":f,disabled:n,onClick:()=>void y()},n?"读取中":"查看原始JSON")}function YY({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 TG({labels:l,limit:u=8}){let r=JG(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,ft(n)))))}function My({node:l}){let u=UG(l);return _("span",{className:`version-chip ${u==="未知"?"unknown":""}`,"data-testid":`gateway-version-${uf(l?.providerId||"unknown")}`},Rj(u))}function fG({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 xj({node:l}){let u=uf(l?.providerId||"unknown");return _("div",{className:"node-availability-strip"},_(fG,{title:"SSH 透传",state:HY(l),testId:`ssh-availability-${u}`}),_(fG,{title:"远程更新",state:BY(l),testId:`upgrade-availability-${u}`}))}function t0({data:l,empty:u="无数据"}){if(l===null||l===void 0)return _("span",{className:"muted"},u);if(typeof l!=="object")return _("span",{className:"summary-value"},ft(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,pY(f,n)))))}function Qu({title:l,text:u}){return _("div",{className:"empty-state"},_("strong",null,l),_("span",null,u))}function PY({onLogin:l}){let[u,r]=kl(sl.authUsername||"admin"),[f,n]=kl(""),[i,t]=kl(""),[y,c]=kl(!1);async function $(A){A.preventDefault(),c(!0),t("");try{let j=await ml("/login",{method:"POST",body:JSON.stringify({username:u,password:f})});l(j)}catch(j){t(El(j,"登录失败"))}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)})),_(lu,{error:i}),_("button",{type:"submit",disabled:y},y?"登录中":"登录")),_("div",{className:"login-note"},"默认账号由 config.json 注入;公网入口只暴露前端登录面。")))}function CY({connection:l,lastRefresh:u,onRefresh:r,onLogout:f,session:n,clock:i,activeStatusItems:t=[],onNotificationToggle:y,unreadCount:c=0,environment:$={}}){let A=AG($),j=[...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(t)?t:[],{key:"refresh",label:"刷新",value:u?iu(u):"未刷新"},{key:"clock",label:Z_,value:iu(i)},{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,zY($.commit||$.requestedCommit))):null),_(sL,{className:"global-top-status",title:"状态",items:j,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 MY(l){return!l.defaultPrevented&&l.button===0&&!l.metaKey&&!l.altKey&&!l.ctrlKey&&!l.shiftKey&&l.currentTarget.target!=="_blank"}function mG({moduleId:l,tabId:u,className:r,active:f=!1,title:n,testId:i,onNavigate:t,children:y}){let c=H3(Xf,l,u);return _("a",{href:c,role:"button",className:r,title:n,"aria-current":f?"page":void 0,"data-testid":i,"data-route":c,onClick:($)=>{if(!MY($))return;$.preventDefault(),t(l,u)}},y)}function hY({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?"»":"«")),p3.map((i)=>{let t=u[i.id]||Nc[i.id]||i.tabs[0]?.id||"";return _(mG,{key:i.id,moduleId:i.id,tabId:t,className:`module ${l===i.id?"active":""}`,active:l===i.id,title:i.label,onNavigate:r},_("span",{className:"module-code"},i.code),_("span",null,i.label))}))}function RY({module:l,activeTab:u,onNavigate:r}){return _("nav",{className:"tabs","aria-label":`${l.label} 子功能`},l.tabs.map((f)=>_(mG,{key:f.id,moduleId:l.id,tabId:f.id,className:`tab ${u===f.id?"active":""}`,active:u===f.id,onNavigate:r},f.label)))}function xY({data:l,onRaw:u,onNavigate:r}){let f=l.overview||{},n=l.nodes.filter((U)=>U.status==="online"),i=l.pendingTasks||l.tasks.filter(hy),t=f.pendingTaskCount??i.length,y=l.tasks.slice(0,5),c=f.pgdata||{},$=f.microserviceAvailability||{},A=vl($.totalCount),j=vl($.healthyCount),F=vl($.unhealthyCount);return _("div",{className:"page-grid overview-grid","data-testid":"overview-page"},_(uu,{title:"核心指标",eyebrow:"Control"},_("div",{className:"metric-grid"},_(Nu,{label:"数据库",value:f.dbReady?"READY":"WAIT",hint:"PostgreSQL internal network",tone:f.dbReady?"ok":"warn"}),_(Nu,{label:"PGDATA",value:Nr(c.databaseBytes),hint:`${c.volumeName||"unidesk_pgdata_10gb"} / ${c.databasePretty||"--"} / budget ${c.volumeSize||"--"}`,tone:"ok",testId:"pgdata-usage-card"}),_(Nu,{label:"在线节点",value:f.onlineNodeCount??0,hint:`${f.nodeCount??0} registered`,tone:"ok"}),_(Nu,{label:"WebSocket",value:f.activeSocketCount??0,hint:"Provider ingress sockets"}),_(Nu,{label:"用户服务可用",value:A>0?`${j}/${A}`:"--",hint:A>0?`healthyCount ${j} · unhealthyCount ${F}`:"strict /health probes",tone:A>0&&F===0?"ok":"warn",testId:"microservice-availability-card"}),_(Nu,{label:"待处理任务",value:t,hint:t>0?"点击查看具体任务":`timeout ${fi(Math.floor((f.taskPendingTimeoutMs??0)/1000))}`,tone:t>0?"warn":"ok",onClick:()=>r("tasks","pending"),testId:"pending-task-card"}))),_(uu,{title:"本机 Provider",eyebrow:"Self Connected"},n.length===0?_(Qu,{title:"暂无在线节点",text:"provider-gateway 未完成自接入"}):_("div",{className:"node-card-list"},n.slice(0,4).map((U)=>_(bY,{key:U.providerId,node:U,onRaw:u})))),_(uu,{title:"待处理任务明细",eyebrow:`${t} Pending`,actions:_("button",{type:"button",className:"ghost-btn",onClick:()=>r("tasks","pending"),"data-testid":"pending-task-detail-link"},"进入任务调度")},i.length===0?_(Qu,{title:"当前无待处理",text:"queued / dispatched / running 超时后会自动转为 failed,避免总览长期卡住"}):_("div",{className:"compact-list"},i.slice(0,5).map((U)=>_(yG,{key:U.id,task:U,onRaw:u})))),_(uu,{title:"最近任务",eyebrow:"Dispatch"},y.length===0?_(Qu,{title:"暂无任务",text:"可以在任务调度模块发起 docker.ps 或 echo"}):_("div",{className:"compact-list"},y.map((U)=>_(yG,{key:U.id,task:U,onRaw:u})))))}function bY({node:l,onRaw:u}){return _("article",{className:"node-card"},_("div",{className:"node-card-head"},_("div",null,_("strong",null,l.name),_("code",null,l.providerId)),_(Tu,{status:l.status})),_("div",{className:"node-version-line"},_(My,{node:l}),_("span",null,`升级策略 ${$_(l)}`)),_(xj,{node:l}),_(TG,{labels:l.labels,limit:6}),_("div",{className:"node-card-foot"},_("span",null,`心跳 ${Wl(l.lastHeartbeat)}`),_(du,{title:`Provider ${l.providerId}`,data:l,onOpen:u,testId:`raw-node-${uf(l.providerId)}`})))}function vY({events:l,onRaw:u}){return _(uu,{title:"事件摘要",eyebrow:"Latest 100"},l.length===0?_(Qu,{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,_(Tu,{status:r.type},r.type)),_("td",null,_("code",null,r.source)),_("td",null,_(t0,{data:r.payload})),_("td",null,Wl(r.createdAt)),_("td",null,_(du,{title:`Event ${r.id}`,data:r,onOpen:u}))))))))}function sY({logs:l,onRaw:u}){return _(uu,{title:"服务日志",eyebrow:"Core Recent"},l.length===0?_(Qu,{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,Wl(r.ts)),_("b",null,r.level||"info"),_("strong",null,r.message||"log"),_(t0,{data:r.data,empty:"无附加字段"}),_(du,{title:`Log ${r.message||f}`,data:r,onOpen:u})))))}function kY({nodes:l,onRaw:u}){return _(uu,{title:"节点清单",eyebrow:`${l.length} Providers`},l.length===0?_(Qu,{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,_(Tu,{status:r.status})),_("td",null,_("strong",null,r.name),_("code",null,r.providerId)),_("td",null,_("div",{className:"gateway-cell"},_(My,{node:r}),_("span",null,$_(r)))),_("td",null,_(xj,{node:r})),_("td",null,_(TG,{labels:r.labels,limit:5})),_("td",null,Wl(r.connectedAt)),_("td",null,Wl(r.lastHeartbeat)),_("td",null,_(du,{title:`Provider ${r.providerId}`,data:r,onOpen:u,testId:`raw-node-table-${uf(r.providerId)}`}))))))))}function gY({nodes:l}){let u=A_(()=>{let r=[];for(let f of l)for(let[n,i]of JG(f.labels))r.push({providerId:f.providerId,name:f.name,key:n,value:i});return r},[l]);return _(uu,{title:"资源标签",eyebrow:"Structured Labels"},u.length===0?_(Qu,{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,ft(r.value)),_("code",null,r.providerId)))))}function IY({nodes:l}){return _(uu,{title:"心跳状态",eyebrow:"Provider Liveness"},l.length===0?_(Qu,{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,Wl(u.connectedAt))),_("div",null,_("span",null,"last heartbeat"),_("b",null,Wl(u.lastHeartbeat)))))))}function aY({nodes:l,systemStatuses:u,tasks:r,onRaw:f,refresh:n}){let[i,t]=kl(""),y=A_(()=>l.map((W)=>{let L=u.find((J)=>J.providerId===W.providerId);return{...W,systemCurrent:L?.current||null,systemHistory:L?.history||[],systemUpdatedAt:L?.updatedAt||null}}),[l,u]),c=y.find((W)=>W.providerId===i)||y[0]||null;if(En(()=>{if(!i&&y[0])t(y[0].providerId)},[y.length,i]),!c)return _(Qu,{title:"暂无资源监控",text:"等待 provider 上报 CPU、内存和硬盘指标"});let $=c.systemCurrent,A=c.systemHistory||[],j=$?.cpu||{},F=$?.memory||{},U=$?.disk||{},N=A.length>0?A:$?[{at:$.collectedAt,cpuPercent:vl(j.percent),memoryPercent:vl(F.percent),diskPercent:vl(U.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:()=>t(W.providerId)},_("span",{className:`pulse ${W.status}`}),_("strong",null,W.name),_("code",null,W.providerId),_("span",null,W.systemCurrent?`CPU ${n0(W.systemCurrent.cpu?.percent)} / MEM ${n0(W.systemCurrent.memory?.percent)}`:"等待指标")))),_("div",{className:"monitor-layout"},_(uu,{title:"任务管理器视图",eyebrow:c.name,className:"monitor-main-panel",actions:$?_(du,{title:`System ${c.providerId}`,data:{current:$,history:A},onOpen:f}):null},!$?_(Qu,{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,`${j.cores||0} CPU cores`),_("span",null,`load ${vl(j.load1).toFixed(2)} / ${vl(j.load5).toFixed(2)} / ${vl(j.load15).toFixed(2)}`),_("span",null,`memory actual ${Nr(F.usedBytes)} / ${Nr(F.totalBytes)}`),_("span",null,`disk ${Nr(U.usedBytes)} / ${Nr(U.totalBytes)}`))),_(Tu,{status:$.ok?"online":"warn"},$.ok?"METRICS READY":"METRICS DEGRADED")),_("div",{className:"monitor-chart-grid"},_(Yj,{title:"CPU",metricKey:"cpuPercent",current:j.percent,points:N,detail:`${j.cores||0} cores / load ${vl(j.load1).toFixed(2)}`,tone:"cpu",testId:"metric-chart-cpu"}),_(Yj,{title:"Memory",metricKey:"memoryPercent",current:F.percent,points:N,detail:`${Nr(F.usedBytes)} actual / ${Nr(F.cacheBytes)} cache excluded`,tone:"memory",testId:"metric-chart-memory"}),_(Yj,{title:"Disk",metricKey:"diskPercent",current:U.percent,points:N,detail:`${U.path||"/"} mounted ${U.mount||"--"}`,tone:"disk",testId:"metric-chart-disk"})),_("div",{className:"monitor-summary-grid"},_(Nu,{label:"CPU 当前",value:n0(j.percent),hint:`history ${N.length} samples`,tone:"ok"}),_(Nu,{label:"实际内存",value:Nr(F.usedBytes),hint:`${n0(F.percent)} 不含缓存`}),_(Nu,{label:"硬盘已用",value:Nr(U.usedBytes),hint:n0(U.percent)}),_(Nu,{label:"更新时间",value:Wl(c.systemUpdatedAt||$.collectedAt),hint:c.providerId})),_(oY,{current:$,onRaw:f}))),_("div",{className:"monitor-side-stack"},_(iP,{provider:c,refresh:n,onRaw:f}),_(tP,{provider:c,tasks:r,onRaw:f,limit:5}),_(uu,{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 KG(l){return vl(l.memoryBytes,vl(l.pssBytes,vl(l.rssBytes)))}function nG(l,u){if(u==="memory")return KG(l);if(u==="cpu")return vl(l.cpuPercent);if(u==="disk")return vl(l.readBytesPerSecond)+vl(l.writeBytesPerSecond);if(u==="pid")return vl(l.pid);if(u==="threads")return vl(l.threads);if(u==="runtime")return vl(l.elapsedSeconds);if(u==="user")return String(l.user||"");return String(l.name||l.command||"")}function iG({value:l,label:u,tone:r}){let f=Math.max(1,Math.min(100,vl(l)));return _("div",{className:`process-meter ${r||""}`},_("span",{style:{width:`${f}%`}}),_("b",null,u))}function oY({current:l,onRaw:u}){let[r,f]=kl({key:"memory",direction:"desc"}),n=i0.default.useContext(Cj),i=l?.processSummary&&typeof l.processSummary==="object"?l.processSummary:{},t=Array.isArray(l?.processes)?l.processes:[],y=String(i.memoryMode||""),c=y.includes("pss_smaps_rollup")?"PSS":y==="rss_minus_shared_fallback"?"RSS-shared":"RSS fallback",$=A_(()=>{let j=r.direction==="asc"?1:-1;return[...t].sort((F,U)=>{let N=nG(F,r.key),W=nG(U,r.key);if(typeof N==="string"||typeof W==="string")return String(N).localeCompare(String(W),"zh-CN")*j;return(N-W)*j||vl(F.pid)-vl(U.pid)})},[t,r.key,r.direction]),A=(j,F)=>{let U=r.key===F,N=U?r.direction==="asc"?"ascending":"descending":"none";return _("th",{"aria-sort":N},_("button",{type:"button",className:`process-sort-button ${U?"active":""}`,"data-testid":`process-sort-${F}`,onClick:()=>f((W)=>({key:F,direction:W.key===F&&W.direction==="desc"?"asc":"desc"}))},j,_("span",null,U?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"),_(fu,{title:"进程资源占用",level:3,loading:n})),_("div",{className:"process-resource-actions"},_("span",{className:"data-chip"},"默认按内存排序"),_("span",{className:"data-chip"},`内存口径 ${c}`),_("span",{className:"data-chip"},`${vl(i.visible,$.length)} / ${vl(i.total,$.length)} 进程`),_(du,{title:"Process Resource Snapshot",data:{processSummary:i,processes:t},onOpen:u,testId:"raw-process-resources"}))),$.length===0?_(Qu,{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((j)=>{let F=vl(j.readBytesPerSecond)+vl(j.writeBytesPerSecond),U=KG(j);return _("tr",{key:`${j.pid}-${j.startedAt}`,"data-testid":`process-row-${uf(j.pid)}`,"data-memory-bytes":String(U),"data-cpu-percent":String(vl(j.cpuPercent)),"data-disk-bps":String(F),"data-pid":String(vl(j.pid))},_("td",null,_("div",{className:"process-name-cell"},_("strong",null,j.name||"--"),_("span",{className:"process-command"},j.command||"--"))),_("td",null,_("code",null,j.pid||"--")),_("td",null,j.user||`uid:${j.uid??"--"}`),_("td",null,_("span",{className:`process-state state-${uf(j.state||"unknown")}`},j.state||"?")),_("td",null,_(iG,{value:j.cpuPercent,label:ZY(j.cpuPercent),tone:"cpu"})),_("td",null,_(iG,{value:j.memoryPercent,label:n0(j.memoryPercent),tone:"memory"})),_("td",null,_("div",{className:"process-io-cell"},_("strong",null,Nr(U)),_("span",null,`RSS ${Nr(j.rssBytes)}`))),_("td",null,_("div",{className:"process-io-cell"},_("strong",null,Xj(F)),_("span",null,`R ${Xj(j.readBytesPerSecond)} / W ${Xj(j.writeBytesPerSecond)}`))),_("td",null,j.threads||0),_("td",null,fi(vl(j.elapsedSeconds))))})))))}function Yj({title:l,metricKey:u,current:r,points:f,detail:n,tone:i,testId:t}){let y=f.map((F)=>Math.max(0,Math.min(100,vl(F[u])))),c=y.length>1?y:[y[0]||0,y[0]||0],$=c.length<=1?100:100/(c.length-1),A=c.map((F,U)=>`${(U*$).toFixed(2)},${(46-F*0.42).toFixed(2)}`).join(" "),j=`0,48 ${A} 100,48`;return _("article",{className:`metric-chart ${i}`,"data-testid":t},_("div",{className:"metric-chart-head"},_("div",null,_("span",null,l),_("strong",null,n0(r))),_("code",null,`${f.length} pts`)),_("svg",{viewBox:"0 0 100 48",preserveAspectRatio:"none",role:"img","aria-label":`${l} usage curve`},_("polygon",{points:j}),_("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 ni(l){return Array.isArray(l)?l:[]}function dY(l){let u=ni(l?.core?.requests?.componentSummary);return[...ni(l?.frontend?.requests?.componentSummary),...u].sort((f,n)=>vl(n.requestCount)-vl(f.requestCount))}function eY(l){let u=ni(l?.core?.operations?.summary);return[...ni(l?.frontend?.operations?.summary),...u].sort((f,n)=>vl(n.count)-vl(f.count))}function lP(l){let u=ni(l?.core?.requests?.recentFailures).map((f)=>({source:"backend",...f}));return[...ni(l?.frontend?.requests?.recentFailures).map((f)=>({source:"frontend",...f})),...u].sort((f,n)=>(On(n.at)??0)-(On(f.at)??0)).slice(0,20)}function uP(l){let u=ni(l?.core?.operations?.recentSlowOperations);return[...ni(l?.frontend?.operations?.recentSlowOperations),...u].sort((f,n)=>vl(n.durationMs)-vl(f.durationMs)).slice(0,20)}function rP(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 vl(l?.process?.heapUsedBytes)}function fP({points:l}){let u=ni(l),r=u.map((F)=>vl(F.mb)),f=Math.max(1,...r),n=Math.max(0,Math.min(...r,0)),i=Math.max(1,f-n),t=u.length>1?u:[...u,...u],y=t.length<=1?100:100/(t.length-1),c=t.map((F,U)=>{let N=vl(F.mb);return`${(U*y).toFixed(2)},${(48-(N-n)/i*42).toFixed(2)}`}).join(" "),$=`0,50 ${c} 100,50`,A=u.at(-1),j=u[0];return _("article",{className:"performance-memory-card","data-testid":"performance-memory-chart"},_("div",{className:"performance-memory-head"},_("strong",null,`Bwebui: ${A?`${vl(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,j?iu(new Date(j.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 nP({onRaw:l}){let[u,r]=kl({core:null,frontend:null}),[f,n]=kl([]),[i,t]=kl(""),[y,c]=kl(!1),[$,A]=kl(null),[j,F]=kl(!1);async function U(){c(!0),t("");try{let[V,B]=await Promise.all([ml(`${sl.apiBaseUrl}/performance`,{cache:"no-store"}),ml(`${sl.apiBaseUrl}/frontend-performance`,{cache:"no-store"})]);r({core:V,frontend:B});let m=rP(B);n((X)=>[...X,{at:new Date().toISOString(),mb:m/1048576}].slice(-80))}catch(V){t(El(V,"性能指标加载失败"))}finally{c(!1)}}En(()=>{U();let V=setInterval(()=>void U(),5000);return()=>clearInterval(V)},[]);async function N(){F(!0),t(""),A(null);try{let V=await ml(`${sl.apiBaseUrl}/code-queue-load-test`,{method:"POST",body:JSON.stringify({targetMs:1000,timeoutMs:90000,url:sl.frontendPublicUrl||window.location.origin})});A(V),U()}catch(V){t(El(V,"Code Queue Playwright 测量失败"))}finally{F(!1)}}let W=dY(u),L=lP(u),J=eY(u),w=uP(u),Q=u.core?.process||{},q=u.frontend?.process||{},T=u.core?.database?.codeQueueStorage||{},O=vl(T.total),Z=$?.result||{},E=vl(Z.wallMs,NaN),D=vl(Z.networkIdleMs,NaN),Y=Z.withinTarget===!0,p=j?"running":$===null?"idle":$.measurementOk===!0?Y?"passed":"slow":"failed";return _("div",{className:"performance-page","data-testid":"performance-page"},_("div",{className:"performance-hero"},_("div",null,_("p",{className:"panel-eyebrow"},"Unified Performance"),_(fu,{title:"性能面板",loading:y||j}),_("p",null,"按组件统计 HTTP 请求、失败率、P95 延迟,并汇总 backend/frontend 内部操作耗时。")),_("div",{className:"inline-actions"},_("button",{type:"button",className:"ghost-btn",onClick:()=>void N(),disabled:j,"data-testid":"code-queue-load-test-button"},j?"测试中...":"测试 Code Queue 加载"),_("button",{type:"button",className:"ghost-btn",onClick:()=>void U(),disabled:y,"data-testid":"performance-refresh-button"},y?"刷新中":"刷新"),_(du,{title:"Performance Snapshot",data:u,onOpen:l,testId:"raw-performance"}))),_(lu,{error:i}),_("div",{className:"performance-top-grid"},_(fP,{points:f}),_("div",{className:"performance-metric-stack"},_(Nu,{label:"backend RSS",value:Nr(Q.rssBytes),hint:`heap ${Nr(Q.heapUsedBytes)}`}),_(Nu,{label:"frontend RSS",value:Nr(q.rssBytes),hint:`bundle ${Nr(u.frontend?.appBundleBytes)}`}),_(Nu,{label:"Codex PG 任务",value:O||"--",hint:T.ok?"unidesk_code_queue_tasks":"等待表初始化",tone:T.ok?"ok":"warn"}),_(Nu,{label:"请求样本",value:vl(u.core?.requests?.sampleCount)+vl(u.frontend?.requests?.sampleCount),hint:"rolling window 3000"}))),_(uu,{title:"Code Queue 加载基准",eyebrow:"Playwright / target <1s",className:"codex-load-test-panel",loading:j,actions:_("div",{className:"panel-actions"},_("button",{type:"button",className:"primary-btn",onClick:()=>void N(),disabled:j,"data-testid":"code-queue-load-test-panel-button"},j?"正在运行 Playwright...":"手动触发测试"),$?_(du,{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"},_(Nu,{label:"总耗时",value:j?"运行中":Number.isFinite(E)?Wf(E):"--",hint:$===null?"点击按钮启动远端 Playwright":`目标 ${Wf(Z.targetMs||1000)} / ${Z.url||"Code Queue"}`,tone:p==="passed"?"ok":p==="failed"||p==="slow"?"warn":""}),_(Nu,{label:"判定",value:j?"RUNNING":p==="passed"?"PASS <1s":p==="slow"?"SLOW":p==="failed"?"FAILED":"--",hint:$?.measurementOk===!1?String($.error||Z.error||"measurement failed").slice(0,120):"导航开始 -> DOMContentLoaded -> data-load-state=complete",tone:p==="passed"?"ok":p==="idle"||p==="running"?"":"fail"}),_(Nu,{label:"Network idle",value:Number.isFinite(D)?Wf(D):"--",hint:`DOMContentLoaded ${Wf(Z.domContentLoadedMs)} / ${Z.networkIdleReached===!1?"未在 5s 内空闲":"已空闲"}`,tone:Number.isFinite(D)&&D<=1000?"ok":"warn"}),_(Nu,{label:"组件耗时",value:Number.isFinite(vl(Z.componentLoadMs,NaN))?Wf(Z.componentLoadMs):"--",hint:`queue ${Wf(Z.queueMs)} / detail ${Wf(Z.detailMs)}`,tone:vl(Z.componentLoadMs)>1000?"warn":"ok"}),_(Nu,{label:"Trace 规模",value:Number.isFinite(vl(Z.transcriptRows,NaN))?String(Z.transcriptRows):"--",hint:`${Z.visibleTaskCount??0} visible tasks / ${Z.partial?"preview":"complete"}`})),j?_("div",{className:"performance-empty-line"},"正在通过 main-server Host SSH 启动 Playwright,完成后会显示 wall time、组件耗时和最慢 API。"):null,$&&Array.isArray(Z.slowestApi)&&Z.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((V)=>_("th",{key:V},V)))),_("tbody",null,Z.slowestApi.slice(0,5).map((V,B)=>_("tr",{key:`${V.url}-${B}`},_("td",null,_("code",null,V.url)),_("td",null,V.status),_("td",null,Wf(V.durationMs))))))):null),_("div",{className:"performance-grid"},_(uu,{title:"组件汇总",eyebrow:"Requests",loading:y},W.length===0?_(Qu,{title:"暂无请求样本",text:"刷新几次或打开页面后会自动形成组件统计"}):_("div",{className:"table-wrap performance-table-wrap"},_("table",{className:"performance-table"},_("thead",null,_("tr",null,["组件","请求数","失败数","失败率","平均延迟","P95"].map((V)=>_("th",{key:V},V)))),_("tbody",null,W.map((V)=>_("tr",{key:V.component},_("td",null,_("code",null,V.component)),_("td",null,V.requestCount),_("td",null,V.failureCount),_("td",null,n0(vl(V.failureRate)*100)),_("td",null,Wf(V.averageLatencyMs)),_("td",null,Wf(V.p95LatencyMs)))))))),_(uu,{title:"最近失败请求",eyebrow:"Failures",loading:y},L.length===0?_("div",{className:"performance-empty-line"},"最近没有失败请求"):_("div",{className:"table-wrap performance-table-wrap compact"},_("table",{className:"performance-table"},_("thead",null,_("tr",null,["时间","来源","组件","状态","路径"].map((V)=>_("th",{key:V},V)))),_("tbody",null,L.map((V,B)=>_("tr",{key:`${V.at}-${B}`},_("td",null,Wl(V.at)),_("td",null,V.source),_("td",null,_("code",null,V.component)),_("td",null,_(Tu,{status:"failed"},V.status)),_("td",null,_("code",null,V.path)))))))),_(uu,{title:"内部操作汇总",eyebrow:"Operations",loading:y},J.length===0?_(Qu,{title:"暂无内部操作样本",text:"API 查询和代理请求会自动记录内部操作耗时"}):_("div",{className:"table-wrap performance-table-wrap"},_("table",{className:"performance-table"},_("thead",null,_("tr",null,["服务","操作","次数","平均延迟","P95"].map((V)=>_("th",{key:V},V)))),_("tbody",null,J.map((V)=>_("tr",{key:`${V.service}-${V.operation}`},_("td",null,V.service),_("td",null,_("code",null,V.operation)),_("td",null,V.count),_("td",null,Wf(V.averageLatencyMs)),_("td",null,Wf(V.p95LatencyMs)))))))),_(uu,{title:"最近慢操作",eyebrow:"Slowest",loading:y},w.length===0?_(Qu,{title:"暂无慢操作",text:"后端会记录最近窗口内耗时最高的内部操作"}):_("div",{className:"table-wrap performance-table-wrap"},_("table",{className:"performance-table"},_("thead",null,_("tr",null,["时间","操作","耗时","结果","细节"].map((V)=>_("th",{key:V},V)))),_("tbody",null,w.map((V,B)=>_("tr",{key:`${V.at}-${V.operation}-${B}`},_("td",null,Wl(V.at)),_("td",null,_("code",null,V.operation)),_("td",null,Wf(V.durationMs)),_("td",null,V.ok?"成功":"失败"),_("td",null,V.detail||"-")))))))))}function iP({provider:l,refresh:u,onRaw:r}){let[f,n]=kl(""),[i,t]=kl(null),[y,c]=kl("");async function $(A){n(A),c("");try{let j=await ml(`${sl.apiBaseUrl}/dispatch`,{method:"POST",body:JSON.stringify({providerId:l.providerId,command:"provider.upgrade",payload:{mode:A,source:"frontend-resource-monitor",requestedAt:new Date().toISOString()}})});t({mode:A,...j}),await u()}catch(j){c(El(j,"升级命令下发失败"))}finally{n("")}}return _(uu,{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),_(My,{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"?"调度中":"执行升级")),_(lu,{error:y}),i?_("div",{className:"upgrade-result"},_(Tu,{status:i.status||"queued"},i.status||"queued"),_("span",null,`${i.mode==="schedule"?"执行升级":"预检升级"} 已下发`),_("span",null,`指定版本 ${Rj(UG(l))}`),_("code",null,i.taskId||"--"),_(du,{title:"Provider Upgrade Dispatch",data:i,onOpen:r})):_("span",{className:"muted"},"升级任务结果会进入任务历史;执行升级可能导致 provider 短暂重连。")))}function zG({records:l,onRaw:u,compact:r=!1}){if(l.length===0)return _(Qu,{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-${uf(f.id)}`},_("td",null,_(Tu,{status:f.status})),_("td",null,_("span",{className:`mode-chip ${i6(f)}`},i6(f)==="schedule"?"执行升级":"预检")),_("td",null,_("strong",null,"provider.upgrade"),_("code",null,f.id)),_("td",null,DY(f)),_("td",null,_(OG,{task:f})),_("td",null,VY(f)),_("td",null,_("span",{className:"version-chip"},qG(f))),_("td",null,_("span",{className:`upgrade-outcome ${String(f.status||"").toLowerCase()}`},WG(f))),_("td",null,Wl(f.updatedAt)),_("td",null,_(du,{title:`Provider Upgrade Task ${f.id}`,data:j_(f),onOpen:u})))))))}function tP({provider:l,tasks:u,onRaw:r,limit:f=5}){let n=LG(u,l.providerId).slice(0,f);return _(uu,{title:"远程更新记录",eyebrow:l.providerId,actions:_(My,{node:l}),className:"provider-upgrade-records-panel"},_("div",{"data-testid":`provider-upgrade-records-${uf(l.providerId)}`},_(zG,{records:n,onRaw:r,compact:!0})))}function yP({nodes:l,tasks:u,onRaw:r}){let f=A_(()=>l.map((i)=>{let t=LG(u,i.providerId);return{node:i,records:t,latest:SY(t),capabilities:NG(i)}}),[l,u]),n=f.reduce((i,t)=>i+t.records.length,0);return _("div",{className:"gateway-page","data-testid":"gateway-version-page"},_(uu,{title:"Provider Gateway 版本",eyebrow:`${l.length} Providers / ${n} 更新记录`},l.length===0?_(Qu,{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((i)=>_("tr",{key:i.node.providerId},_("td",null,_(Tu,{status:i.node.status})),_("td",null,_("strong",null,i.node.name),_("code",null,i.node.providerId)),_("td",null,_(My,{node:i.node})),_("td",null,$_(i.node)),_("td",null,_(xj,{node:i.node})),_("td",null,lG(i.node)?Wl(lG(i.node)):"待新版上报"),_("td",null,_("div",{className:"capability-row"},i.capabilities.length===0?_("span",{className:"muted"},"未声明"):i.capabilities.slice(0,5).map((t)=>_("span",{key:t,className:"data-chip"},t)))),_("td",null,i.latest?_("div",{className:"latest-upgrade-cell"},_(Tu,{status:i.latest.status}),_("span",null,`${i6(i.latest)==="schedule"?"执行升级":"预检"} / ${Wl(i.latest.updatedAt)}`),_("small",null,`Gateway ${qG(i.latest)}`),_("small",null,WG(i.latest))):_("span",{className:"muted"},"暂无记录")),_("td",null,_(du,{title:`Provider ${i.node.providerId}`,data:i.node,onOpen:r})))))))),_(uu,{title:"远程更新记录",eyebrow:"Structured provider.upgrade records"},l.length===0?_(Qu,{title:"暂无记录",text:"没有 provider 节点时不会生成远程更新记录"}):_("div",{className:"gateway-record-grid"},f.map((i)=>_("article",{key:i.node.providerId,className:"gateway-record-card","data-testid":`gateway-records-${uf(i.node.providerId)}`},_("div",{className:"gateway-record-head"},_("div",null,_("strong",null,i.node.name),_("code",null,i.node.providerId)),_(My,{node:i.node})),_("div",{className:"gateway-record-meta"},_("span",null,`心跳 ${Wl(i.node.lastHeartbeat)}`),_("span",null,`策略 ${$_(i.node)}`),_("span",null,`${i.records.length} 条记录`)),_(zG,{records:i.records.slice(0,8),onRaw:r,compact:!0}))))))}function cP(l){if(l==="running")return"online";if(l==="paused"||l==="restarting")return"warn";if(l==="exited"||l==="dead")return"offline";return"internal"}function EG(l){return/^[a-f0-9]{48,64}$/i.test(l)}function __(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 tG(l){let u=String(l?.name||""),r=String(l?.labels||"");if(__(l))return 0;if(r.includes("com.docker.compose.project=unidesk"))return 1;if(!EG(u))return 2;return 3}function _P(l){return[...l].sort((u,r)=>{let f=tG(u)-tG(r);if(f!==0)return f;return String(u.name||"").localeCompare(String(r.name||""))})}function $P({nodes:l,dockerStatuses:u,onRaw:r}){let[f,n]=kl(""),i=A_(()=>l.map((w)=>{let Q=u.find((q)=>q.providerId===w.providerId);return{...w,dockerStatus:Q?.dockerStatus||null,dockerUpdatedAt:Q?.updatedAt||null}}),[l,u]),t=i.find((w)=>w.providerId===f)||i[0]||null;if(En(()=>{if(!f&&i[0])n(i[0].providerId)},[i.length,f]),!t)return _(Qu,{title:"暂无 Docker 节点",text:"等待 provider 上报 Docker daemon 状态"});let y=t.dockerStatus,c=t.providerId==="main-server",$=y?.counts||{},A=y?.daemon||{},j=y?.containers||[],F=y?.images||[],U=_P(y?.volumes||[]),N=c?U.find(__):null,W=y?.networks||[],L=j.filter((w)=>w.state==="running"),J=j.filter((w)=>w.state!=="running");return _("div",{className:"docker-page","data-testid":"docker-status-page"},_("div",{className:"docker-node-strip"},i.map((w)=>_("button",{key:w.providerId,type:"button",className:`docker-node-tile ${t.providerId===w.providerId?"active":""}`,onClick:()=>n(w.providerId)},_("span",{className:`pulse ${w.status}`}),_("strong",null,w.name),_("code",null,w.providerId),_("span",null,w.dockerStatus?`Docker ${w.dockerStatus.ok?"ready":"degraded"}`:"等待上报")))),_("div",{className:"docker-layout"},_(uu,{title:"Docker Desktop 视图",eyebrow:t.name,className:"docker-main-panel",actions:y?_(du,{title:`Docker ${t.providerId}`,data:y,onOpen:r}):null},!y?_(Qu,{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||t.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 / ${Nr(A.memoryBytes)}`))),_(Tu,{status:y.ok?"online":"warn"},y.ok?"Docker Ready":"Docker Degraded")),_("div",{className:"docker-metrics"},_(Nu,{label:"Containers",value:$.containers??j.length,hint:`${$.running??L.length} running / ${$.stopped??J.length} stopped`,tone:"ok"}),_(Nu,{label:"Images",value:$.images??F.length,hint:`${$.daemonImages??$.images??F.length} daemon images`}),_(Nu,{label:"Volumes",value:$.volumes??U.length,hint:c?N?"database volume visible":"database volume missing":"node local volumes",tone:N?"ok":""}),_(Nu,{label:"Networks",value:$.networks??W.length,hint:A.driver?`driver ${A.driver}`:"docker networks"})),c?_(AP,{volume:N,volumeCount:U.length}):null,_("div",{className:"docker-section-head"},_("h3",null,"Containers"),_("span",null,`updated ${Wl(t.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,j.length===0?_("tr",null,_("td",{colSpan:8},"暂无容器")):j.map((w)=>_("tr",{key:`${w.id}-${w.name}`},_("td",null,_(Tu,{status:cP(w.state)},w.state||"unknown")),_("td",null,_("strong",null,w.name||"--"),_("code",null,w.id||"--")),_("td",null,w.image||"--"),_("td",null,w.ports||_("span",{className:"muted"},"未发布")),_("td",null,w.runningFor||w.status||"--"),_("td",null,w.restartPolicy?_(Tu,{status:w.restartPolicy==="always"?"online":"warn"},w.restartPolicy):"--"),_("td",null,w.pidMode?_("code",null,w.pidMode):"--"),_("td",null,w.size||"--")))))))),_("div",{className:"docker-side-stack"},_(Pj,{title:"Images",items:F,render:(w)=>_("article",{key:`${w.id}-${w.repository}`,className:"docker-side-row"},_("strong",null,`${w.repository}:${w.tag}`),_("span",null,w.size||"--"),_("code",null,w.id||"--"))}),_(Pj,{title:"Volumes",items:U,limit:U.length,render:(w)=>_("article",{key:w.name,className:`docker-side-row volume-row ${c&&__(w)?"database-volume":""}`,"data-testid":c&&__(w)?"database-volume-row":void 0},_("strong",null,w.name),_("span",null,c&&__(w)?"PostgreSQL":EG(String(w.name||""))?"anonymous":"named"),_("code",null,w.mountpoint||w.driver||w.scope||"--"))}),_(Pj,{title:"Networks",items:W,render:(w)=>_("article",{key:w.id||w.name,className:"docker-side-row"},_("strong",null,w.name),_("span",null,w.driver||"--"),_("code",null,w.id||"--"))}))))}function AP({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"),_(Tu,{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 Pj({title:l,items:u,render:r,limit:f}){let n=u.slice(0,f??12),i=Math.max(0,u.length-n.length);return _(uu,{title:l,eyebrow:`${u.length} items`,className:"docker-side-panel"},u.length===0?_(Qu,{title:`暂无 ${l}`,text:"等待 Docker 状态采集"}):_("div",{className:"docker-side-list"},n.map(r),i>0?_("div",{className:"docker-side-more"},`+ ${i} more`):null))}function jP({microservices:l,onRaw:u,onNavigate:r}){let f=l.filter((n)=>rG(n).public===!1);return _("div",{className:"microservice-page","data-testid":"microservice-catalog-page"},_(uu,{title:"用户服务目录",eyebrow:"Provider Mounted User Services"},_("div",{className:"metric-grid"},_(Nu,{label:"服务总数",value:l.length,hint:"config.json 用户服务登记"}),_(Nu,{label:"私有后端",value:f.length,hint:"不直接暴露公网",tone:"ok"}),_(Nu,{label:"D601 服务",value:l.filter((n)=>n.providerId==="D601").length,hint:"compute-node docker"}),_(Nu,{label:"集成前端",value:l.filter((n)=>n.frontend?.integrated).length,hint:"UniDesk React 页面"}))),_(uu,{title:"服务映射",eyebrow:"Repo Reference + Runtime"},l.length===0?_(Qu,{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 i=GG(n),t=XY(n),y=rG(n),c=i.availability||{},$=c.status||(i.providerStatus==="online"?"unknown":"unhealthy");return _("tr",{key:n.id,"data-testid":`microservice-row-${uf(n.id)}`},_("td",null,_("strong",null,n.name),_("code",null,n.id)),_("td",null,_("strong",null,i.providerName||n.providerId),_("code",null,n.providerId)),_("td",null,_("span",null,t.url||"--"),_("code",null,t.commitId||"--")),_("td",null,_("span",null,t.composeFile||"--"),_("code",null,`${t.composeService||"--"} / ${t.containerName||"--"}`)),_("td",null,_(Tu,{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,_(Tu,{status:$==="healthy"?"online":$==="unknown"?"warn":"failed"},$),_("span",null,c.reason||i.providerStatus||"unknown"),_(t0,{data:i.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,_(du,{title:`用户服务 ${n.id}`,data:n,onOpen:u}))))}))))))}function FP({nodes:l,onDispatched:u,onRaw:r}){let f=l.filter((p)=>p.status==="online"),[n,i]=kl(f[0]?.providerId||l[0]?.providerId||""),[t,y]=kl("docker.ps"),[c,$]=kl("frontend"),[A,j]=kl("operator-check"),[F,U]=kl("normal"),[N,W]=kl(!1),[L,J]=kl(""),[w,Q]=kl(!1),[q,T]=kl(null),[O,Z]=kl("");En(()=>{if(!n&&(f[0]?.providerId||l[0]?.providerId))i(f[0]?.providerId||l[0].providerId)},[l.length,f.length,n]);function E(){return{source:c,note:A,priority:F}}function D(){J(JSON.stringify(E(),null,2)),W(!0)}async function Y(p){p.preventDefault(),Q(!0),Z("");try{let V=N?JSON.parse(L||"{}"):E(),B=await ml(`${sl.apiBaseUrl}/dispatch`,{method:"POST",body:JSON.stringify({providerId:n,command:t,payload:V})});T(B),await u()}catch(V){Z(El(V,"下发失败"))}finally{Q(!1)}}return _("div",{className:"page-grid dispatch-grid"},_(uu,{title:"下发任务",eyebrow:"Real WebSocket Dispatch"},_("form",{className:"dispatch-form",onSubmit:Y},_("label",null,"Provider",_("select",{value:n,onChange:(p)=>i(p.target.value)},l.map((p)=>_("option",{key:p.providerId,value:p.providerId},`${p.name} / ${p.providerId}`)))),_("label",null,"Command",_("select",{value:t,onChange:(p)=>y(p.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:(p)=>$(p.target.value)})),_("label",null,"备注",_("input",{value:A,onChange:(p)=>j(p.target.value)})),_("label",null,"优先级",_("select",{value:F,onChange:(p)=>U(p.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:D},"查看原始JSON"),_("button",{type:"submit",disabled:w||!n},w?"下发中":"下发任务")),N?_("label",{className:"raw-editor-label"},"高级 Payload",_("textarea",{className:"raw-editor",value:L,onChange:(p)=>J(p.target.value)})):null,_(lu,{error:O,wide:!0}))),_(uu,{title:"下发结果",eyebrow:"Response"},q?_("div",{className:"result-card"},_(Tu,{status:q.status||"queued"},q.status||"queued"),_("dl",null,_("dt",null,"Task ID"),_("dd",null,_("code",null,q.taskId||"--")),_("dt",null,"Provider 在线"),_("dd",null,ft(q.providerOnline))),_(du,{title:"Dispatch Response",data:q,onOpen:r})):_(Qu,{title:"等待操作",text:"任务响应会以结构化结果卡展示"})))}function yG({task:l,onRaw:u}){return _("article",{className:"compact-row"},_(Tu,{status:l.status}),_("div",null,_("strong",null,l.command),_("code",null,l.id)),_("span",null,hy(l)?`已等待 ${Mj(l.updatedAt)}`:`耗时 ${fi(jG(l)??0)}`),_(du,{title:`Task ${l.id}`,data:j_(l),onOpen:u}))}function OG({task:l}){let u=jG(l),r=hy(l);return _("div",{className:"task-duration"},_("strong",null,u===null?"--":fi(u)),_("span",null,r?`已运行 / 创建 ${Wl(l.createdAt)}`:`创建 ${Wl(l.createdAt)}`))}function JP({task:l}){let u=String(l?.status||"").toLowerCase(),r=l?.result,f=r&&typeof r==="object"&&!Array.isArray(r)?r:{},i=["exitCode","code","signal","timeoutMs","previousStatus","mode"].filter((t)=>f[t]!==void 0&&f[t]!==null);if(u==="failed"){let t=FG(l);return _("div",{className:"task-diagnostic failed"},_("b",null,"失败原因"),_("span",{className:"diagnostic-reason"},ft(t)),i.length>0?_("div",{className:"diagnostic-meta"},i.map((y)=>_("span",{key:y,className:"data-chip"},_("b",null,y),_("span",null,ft(f[y]))))):null)}if(hy(l))return _("div",{className:"task-diagnostic warn"},_("b",null,"等待终态"),_("span",null,`最后更新 ${Mj(l.updatedAt)} 前`));return _("div",{className:"task-diagnostic ok"},_("b",null,"完成摘要"),_(t0,{data:r,empty:"无执行输出"}))}function UP({tasks:l,onRaw:u}){let r=l.filter(hy);return _("div",{"data-testid":"pending-task-page"},_(uu,{title:"待处理任务",eyebrow:`${r.length} Pending`},r.length===0?_(Qu,{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,_(Tu,{status:f.status})),_("td",null,_("strong",null,f.command),_("code",null,f.id)),_("td",null,_("code",null,f.providerId)),_("td",null,Mj(f.updatedAt)),_("td",null,_(t0,{data:f.payload})),_("td",null,_(du,{title:`Pending Task ${f.id}`,data:j_(f),onOpen:u})))))))))}function NP({tasks:l,onRaw:u}){return _("div",{"data-testid":"task-history-page"},_(uu,{title:"任务历史",eyebrow:`${l.length} Tasks`},l.length===0?_(Qu,{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-${uf(r.id)}`},_("td",null,_(Tu,{status:r.status})),_("td",null,_("strong",null,r.command),_("code",null,r.id)),_("td",null,_("code",null,r.providerId)),_("td",null,_(OG,{task:r})),_("td",null,_(t0,{data:r.payload})),_("td",null,_(JP,{task:r})),_("td",null,Wl(r.updatedAt)),_("td",null,_(du,{title:`Task ${r.id}`,data:j_(r),onOpen:u})))))))))}function QP({tasks:l,onRaw:u}){let r=l.filter((f)=>["succeeded","failed"].includes(f.status));return _(uu,{title:"执行结果",eyebrow:"Finished Tasks"},r.length===0?_(Qu,{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),_(Tu,{status:f.status})),_("code",null,f.id),_(t0,{data:f.result,empty:"无执行输出"}),_(du,{title:`Task Result ${f.id}`,data:j_(f),onOpen:u})))))}function wP(l){if(!l||typeof l!=="object")return"--";if(l.type==="interval")return`每 ${fi(Number(l.everySeconds||0))}`;return`每天 ${l.timeOfDay||"03:00"} UTC`}function qP(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 WP(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 LP(l){let u=Number(l?.durationMs);if(Number.isFinite(u)&&u>=0)return fi(u/1000);let r=On(l?.startedAt||l?.createdAt);if(r===null)return"--";let n=On(l?.finishedAt)??Date.now();return fi(Math.max(0,(n-r)/1000))}function cG(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 GP({schedules:l,scheduleRuns:u,nodes:r,refresh:f,onRaw:n}){let[i,t]=kl(cG(r||[])),[y,c]=kl(!1),[$,A]=kl(""),[j,F]=kl(""),U=[...u||[]].sort((q,T)=>(On(T.updatedAt)??0)-(On(q.updatedAt)??0));function N(q,T){t((O)=>({...O,[q]:T}))}function W(q){let T=q?.action||{};t({id:q?.id||"",name:q?.name||"",description:q?.description||"",enabled:q?.enabled!==!1,timeOfDay:q?.schedule?.timeOfDay||"03:30",actionType:T.type||"dispatch",providerId:T.providerId||r[0]?.providerId||"main-server",command:T.command||"echo",payloadJson:JSON.stringify(T.payload||{source:"scheduled-task"},null,2),remoteBaseDir:T.remoteBaseDir||"/SERVER_DATA/UNIDESK_PG_DATA",stagingSubdir:T.stagingSubdir||"server-data/unidesk-pg-data",timeoutMs:String(T.timeoutMs||3600000)}),F(`正在编辑 ${q?.id||""}`)}function L(){let q={id:i.id,name:i.name,description:i.description,enabled:i.enabled,concurrencyPolicy:"skip",schedule:{type:"daily",timeOfDay:i.timeOfDay,timezone:"Etc/UTC"}};if(i.actionType==="pgdata_backup")return{...q,action:{type:"pgdata_backup",volumeName:"unidesk_pgdata_10gb",remoteBaseDir:i.remoteBaseDir,stagingSubdir:i.stagingSubdir,timeoutMs:Number(i.timeoutMs)||3600000,cleanupLocal:!0}};return{...q,action:{type:"dispatch",providerId:i.providerId,command:i.command,payload:JSON.parse(i.payloadJson||"{}"),timeoutMs:Number(i.timeoutMs)||600000}}}async function J(q){q.preventDefault(),c(!0),A(""),F("");try{let T=L(),O=encodeURIComponent(String(T.id));await ml(`${sl.apiBaseUrl}/schedules/${O}`,{method:"PUT",body:JSON.stringify(T)}),F("定时任务已保存"),await f()}catch(T){A(El(T,"保存定时任务失败"))}finally{c(!1)}}async function w(q){if(!q?.id)return;c(!0),A(""),F("");try{await ml(`${sl.apiBaseUrl}/schedules/${encodeURIComponent(q.id)}`,{method:"DELETE"}),F(`已删除 ${q.id}`),await f()}catch(T){A(El(T,"删除定时任务失败"))}finally{c(!1)}}async function Q(q){if(!q?.id)return;c(!0),A(""),F("");try{let T=await ml(`${sl.apiBaseUrl}/schedules/${encodeURIComponent(q.id)}/run`,{method:"POST",body:"{}"});F(`已触发 ${q.id} / ${T?.run?.id||"run"}`),await f()}catch(T){A(El(T,"触发定时任务失败"))}finally{c(!1)}}return _("div",{className:"page-grid scheduled-task-page","data-testid":"scheduled-task-page"},_(uu,{title:"定时任务",eyebrow:`${(l||[]).length} Schedules`},(l||[]).length===0?_(Qu,{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-${uf(q.id)}`},_("div",{className:"node-card-head"},_("strong",null,q.name||q.id),_(Tu,{status:q.enabled?"online":"warn"},q.enabled?"enabled":"disabled")),_("code",null,q.id),_("dl",null,_("dt",null,"计划"),_("dd",null,wP(q.schedule)),_("dt",null,"动作"),_("dd",null,qP(q.action)),_("dt",null,"下次执行"),_("dd",null,Wl(q.nextRunAt)),_("dt",null,"最近执行"),_("dd",null,q.lastRunAt?`${Wl(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:()=>Q(q),"data-testid":`schedule-run-${uf(q.id)}`},"手动触发"),_("button",{type:"button",className:"ghost-btn danger",disabled:y,onClick:()=>w(q)},"删除"),_(du,{title:`Schedule ${q.id}`,data:q,onOpen:n})))))),_(uu,{title:i.id?"配置定时任务":"新建定时任务",eyebrow:"CRUD"},_("form",{className:"dispatch-form schedule-form",onSubmit:J},_("label",null,"ID",_("input",{value:i.id,onChange:(q)=>N("id",q.target.value)})),_("label",null,"名称",_("input",{value:i.name,onChange:(q)=>N("name",q.target.value)})),_("label",null,"每日执行时间 UTC",_("input",{value:i.timeOfDay,placeholder:"03:30",onChange:(q)=>N("timeOfDay",q.target.value)})),_("label",null,"启用",_("select",{value:i.enabled?"true":"false",onChange:(q)=>N("enabled",q.target.value==="true")},_("option",{value:"true"},"enabled"),_("option",{value:"false"},"disabled"))),_("label",null,"动作类型",_("select",{value:i.actionType,onChange:(q)=>N("actionType",q.target.value)},_("option",{value:"pgdata_backup"},"PGDATA 备份到百度网盘"),_("option",{value:"dispatch"},"Provider Dispatch"))),i.actionType==="pgdata_backup"?[_("label",{key:"remote"},"网盘根目录",_("input",{value:i.remoteBaseDir,onChange:(q)=>N("remoteBaseDir",q.target.value)})),_("label",{key:"staging"},"本地 staging 子目录",_("input",{value:i.stagingSubdir,onChange:(q)=>N("stagingSubdir",q.target.value)}))]:[_("label",{key:"provider"},"Provider",_("select",{value:i.providerId,onChange:(q)=>N("providerId",q.target.value)},(r||[]).map((q)=>_("option",{key:q.providerId,value:q.providerId},`${q.name} / ${q.providerId}`)))),_("label",{key:"command"},"Command",_("select",{value:i.command,onChange:(q)=>N("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:i.payloadJson,onChange:(q)=>N("payloadJson",q.target.value)}))],_("label",null,"超时 ms",_("input",{value:i.timeoutMs,onChange:(q)=>N("timeoutMs",q.target.value)})),_("label",{className:"raw-editor-label"},"描述",_("textarea",{className:"raw-editor compact",value:i.description,onChange:(q)=>N("description",q.target.value)})),_("div",{className:"dispatch-actions"},_("button",{type:"button",className:"ghost-btn",disabled:y,onClick:()=>t(cG(r||[]))},"重置"),_("button",{type:"submit",disabled:y||!i.id},y?"保存中":"保存任务")),j?_("p",{className:"muted paragraph"},j):null,_(lu,{error:$,wide:!0}))),_(uu,{title:"历史执行记录",eyebrow:`${U.length} Runs`},U.length===0?_(Qu,{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,U.map((q)=>_("tr",{key:q.id,"data-testid":`schedule-run-row-${uf(q.id)}`},_("td",null,_(Tu,{status:WP(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,LP(q)),_("td",null,_(t0,{data:q.result||q.error,empty:"无结果"})),_("td",null,Wl(q.updatedAt)),_("td",null,_(du,{title:`Schedule Run ${q.id}`,data:q,onOpen:n})))))))))}function TP({data:l}){let u=l.overview||{};return _("div",{className:"page-grid topology-grid"},_(uu,{title:"公开入口",eyebrow:"Public"},_("div",{className:"endpoint-list"},_("article",null,_("b",null,"Frontend"),_("span",null,sl.frontendPublicUrl||window.location.origin),_(Tu,{status:"online"},"public")),_("article",null,_("b",null,"Provider Ingress"),_("span",null,sl.providerIngressPublicUrl||"ws://public/ws/provider"),_(Tu,{status:"online"},"public")))),_(uu,{title:"内部服务",eyebrow:"Docker Network Only"},_("div",{className:"endpoint-list"},_("article",null,_("b",null,"backend-core API"),_("span",null,"http://backend-core:8080"),_(Tu,{status:"internal"},"internal")),_("article",null,_("b",null,"database"),_("span",null,"postgres://database:5432/unidesk"),_(Tu,{status:"internal"},"internal")))),_(uu,{title:"运行态",eyebrow:"Runtime"},_("div",{className:"metric-grid"},_(Nu,{label:"DB Ready",value:u.dbReady?"YES":"NO",hint:"internal health"}),_(Nu,{label:"Online Nodes",value:u.onlineNodeCount??0,hint:"provider-gateway self-link"}))))}function mP({session:l}){return _(uu,{title:"认证策略",eyebrow:"Frontend Login"},_("div",{className:"policy-grid"},_("article",null,_("span",null,"默认账号"),_("strong",null,sl.authUsername||"admin")),_("article",null,_("span",null,"当前会话"),_("strong",null,l?.user?.username||"--")),_("article",null,_("span",null,"Session TTL"),_("strong",null,`${sl.sessionTtlSeconds||0}s`)),_("article",null,_("span",null,"API 访问"),_("strong",null,"同源 Cookie 保护"))),_("p",{className:"muted paragraph"},"浏览器只访问 frontend 同源接口;frontend 容器使用 Docker 内网代理 backend-core API。"))}function KP(){return _(uu,{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 zP({activeModule:l,activeTab:u,data:r,session:f,refresh:n,onRaw:i,onNavigate:t}){if(l==="ops"&&u==="status")return _(xY,{data:r,onRaw:i,onNavigate:t});if(l==="ops"&&u==="performance")return _(nP,{onRaw:i});if(l==="ops"&&u==="events")return _(vY,{events:r.events,onRaw:i});if(l==="ops"&&u==="logs")return _(sY,{logs:r.logs,onRaw:i});if(l==="nodes"&&u==="list")return _(kY,{nodes:r.nodes,onRaw:i});if(l==="nodes"&&u==="monitor")return _(aY,{nodes:r.nodes,systemStatuses:r.systemStatuses,tasks:r.tasks,onRaw:i,refresh:n});if(l==="nodes"&&u==="docker")return _($P,{nodes:r.nodes,dockerStatuses:r.dockerStatuses,onRaw:i});if(l==="nodes"&&u==="gateway")return _(yP,{nodes:r.nodes,tasks:r.tasks,onRaw:i});if(l==="nodes"&&u==="labels")return _(gY,{nodes:r.nodes});if(l==="nodes"&&u==="heartbeats")return _(IY,{nodes:r.nodes});if(l==="tasks"&&u==="dispatch")return _(FP,{nodes:r.nodes,onDispatched:n,onRaw:i});if(l==="tasks"&&u==="scheduled")return _(GP,{schedules:r.schedules,scheduleRuns:r.scheduleRuns,nodes:r.nodes,refresh:n,onRaw:i});if(l==="tasks"&&u==="pending")return _(UP,{tasks:r.pendingTasks,onRaw:i});if(l==="tasks"&&u==="history")return _(NP,{tasks:r.tasks,onRaw:i});if(l==="tasks"&&u==="results")return _(QP,{tasks:r.tasks,onRaw:i});if(l==="apps"&&u==="catalog")return _(jP,{microservices:r.microservices,onRaw:i,onNavigate:t});if(l==="apps"&&u==="todo-note")return _(xL,{microservices:r.microservices,onRaw:i,apiBaseUrl:sl.apiBaseUrl});if(l==="apps"&&u==="findjob")return _(BQ,{microservices:r.microservices,onRaw:i,apiBaseUrl:sl.apiBaseUrl});if(l==="apps"&&u==="pipeline")return _(SL,{microservices:r.microservices,onRaw:i,apiBaseUrl:sl.apiBaseUrl});if(l==="apps"&&u==="met-nonlinear")return _(YQ,{microservices:r.microservices,onRaw:i,apiBaseUrl:sl.apiBaseUrl});if(l==="apps"&&u==="claudeqq")return _(fN,{microservices:r.microservices,onRaw:i,apiBaseUrl:sl.apiBaseUrl});if(l==="apps"&&u==="baidu-netdisk")return _(lN,{microservices:r.microservices,onRaw:i,apiBaseUrl:sl.apiBaseUrl});if(l==="apps"&&u==="filebrowser")return _(HQ,{microservices:r.microservices,onRaw:i,apiBaseUrl:sl.apiBaseUrl});if(l==="apps"&&u==="oa-event-flow")return _(gQ,{microservices:r.microservices,onRaw:i,apiBaseUrl:sl.apiBaseUrl});if(l==="apps"&&u==="k3sctl")return _(IL,{microservices:r.microservices,onRaw:i,apiBaseUrl:sl.apiBaseUrl,onNavigate:t});if(l==="apps"&&u==="code-queue")return _(GQ,{microservices:r.microservices,onRaw:i,apiBaseUrl:sl.apiBaseUrl,initialTasksData:mY});if(l==="apps"&&u==="mdtodo")return _(hQ,{microservices:r.microservices,onRaw:i,apiBaseUrl:sl.apiBaseUrl});if(l==="apps"&&u==="decision-center")return _(KQ,{microservices:r.microservices,onRaw:i,apiBaseUrl:sl.apiBaseUrl});if(l==="apps"&&u==="project-manager")return _(PL,{microservices:r.microservices,onRaw:i,apiBaseUrl:sl.apiBaseUrl});if(l==="config"&&u==="topology")return _(TP,{data:r});if(l==="config"&&u==="auth")return _(mP,{session:f});if(l==="config"&&u==="security")return _(KP);return _(Qu,{title:"未找到页面",text:"请选择左侧主模块和顶部子功能标签"})}function EP({session:l,onLogout:u}){let r=k2(Xf,window.location.pathname),[f,n]=kl(r.moduleId),[i,t]=kl({...Nc,[r.moduleId]:r.tabId}),[y,c]=kl({overview:null,nodes:[],systemStatuses:[],dockerStatuses:[],microservices:[],events:[],tasks:[],pendingTasks:[],schedules:[],scheduleRuns:[],logs:[]}),[$,A]=kl({ok:!1,text:"连接中"}),[j,F]=kl(null),[U,N]=kl(new Date),[W,L]=kl(null),[J,w]=kl(!1),[Q,q]=kl(!1),T=i0.default.useRef(!1),O=Xf.moduleById[f]||Xf.modules[0],Z=i[f]||Nc[f]||O.tabs[0].id,E=Array.isArray(y.microservices)?y.microservices:[],D=E.length===0&&f==="apps"&&Z==="code-queue"?[KY]:E,Y=D===E?y:{...y,microservices:D},p=f==="apps"?D.find((I)=>String(I?.id||"")===(Z==="k3sctl"?"k3sctl-adapter":Z)):null,V=p?GG(p):{},B=O.tabs.find((I)=>I.id===Z)?.label||Z,m=p?[{key:"microservice",label:"用户服务",value:`${B} ${V.providerStatus==="online"?"在线":V.providerStatus||"未知"}`,tone:V.providerStatus==="online"?"ok":"warn",testId:"active-microservice-status"}]:[];async function X(){if(T.current)return;T.current=!0,q(!0);try{let I=[],M=(Ql,Ol)=>{I.push([Ql,ml(Ol)])},rl=f==="ops"&&Z==="status",cl=rl||f==="config"&&Z==="topology",$l=rl||f==="nodes"||f==="tasks"&&(Z==="dispatch"||Z==="scheduled"),Tl=f==="apps"&&Z!=="code-queue";if(cl)M("overview",`${sl.apiBaseUrl}/overview`);if($l)M("nodes",`${sl.apiBaseUrl}/nodes`);if(f==="nodes"&&Z==="monitor")M("systemStatuses",`${sl.apiBaseUrl}/nodes/system-status?limit=60`),M("tasks",`${sl.apiBaseUrl}/tasks?limit=120&summary=1`);else if(f==="nodes"&&Z==="docker")M("dockerStatuses",`${sl.apiBaseUrl}/nodes/docker-status`);else if(f==="nodes"&&Z==="gateway")M("tasks",`${sl.apiBaseUrl}/tasks?limit=300&summary=1`);else if(f==="tasks"&&Z==="scheduled")M("schedules",`${sl.apiBaseUrl}/schedules?limit=100`),M("scheduleRuns",`${sl.apiBaseUrl}/schedules/runs?limit=100`);else if(f==="tasks"&&Z==="pending")M("pendingTasks",`${sl.apiBaseUrl}/tasks?status=pending&limit=100&summary=1`);else if(f==="tasks"&&(Z==="history"||Z==="results"))M("tasks",`${sl.apiBaseUrl}/tasks?limit=300&summary=1`);else if(rl)M("tasks",`${sl.apiBaseUrl}/tasks?limit=8&lite=1`),M("pendingTasks",`${sl.apiBaseUrl}/tasks?status=pending&limit=20&lite=1`);if(Tl)M("microservices",`${sl.apiBaseUrl}/microservices`);if(f==="ops"&&Z==="events")M("events",`${sl.apiBaseUrl}/events?limit=100`);if(f==="ops"&&Z==="logs")M("logs","/logs?limit=100");await Promise.all(I.map(async([Ql,Ol])=>{let h=await Ol,a={};if(Ql==="overview")a.overview=h;if(Ql==="nodes")a.nodes=h.nodes||[];if(Ql==="systemStatuses")a.systemStatuses=h.systemStatuses||[];if(Ql==="dockerStatuses")a.dockerStatuses=h.dockerStatuses||[];if(Ql==="microservices")a.microservices=h.microservices||[];if(Ql==="events")a.events=h.events||[];if(Ql==="tasks")a.tasks=h.tasks||[];if(Ql==="pendingTasks")a.pendingTasks=h.tasks||[];if(Ql==="schedules")a.schedules=h.schedules||[];if(Ql==="scheduleRuns")a.scheduleRuns=h.runs||[];if(Ql==="logs")a.logs=h.logs||[];c((ul)=>({...ul,...a}))})),A({ok:!0,text:"核心在线"}),F(new Date)}catch(I){if(A({ok:!1,text:El(I,"连接失败")}),I.status===401)u(!1)}finally{T.current=!1,q(!1)}}En(()=>{let I=()=>{if(!eL())return;X()};I();let M=setInterval(I,EY(f,Z)),rl=()=>{if(eL())I()};return document.addEventListener("visibilitychange",rl),()=>{clearInterval(M),document.removeEventListener("visibilitychange",rl)}},[f,Z]),En(()=>{let I=setInterval(()=>N(new Date),1000);return()=>clearInterval(I)},[]),En(()=>{let I=vQ(Xf,window.location.pathname);if(I&&window.location.pathname!==I)window.history.replaceState(null,"",I)},[]),En(()=>{let I=()=>{let M=k2(Xf,window.location.pathname);n(M.moduleId),t((rl)=>({...rl,[M.moduleId]:M.tabId})),L(null)};return window.addEventListener("popstate",I),()=>window.removeEventListener("popstate",I)},[]),En(()=>{window.scrollTo({top:0,left:0,behavior:"auto"})},[f,Z]);function S(I,M,rl="push"){let cl=Xf.moduleById[I]?I:Xf.fallbackTarget.moduleId,$l=Xf.moduleById[cl]?.tabs.some((Ql)=>Ql.id===M)?M:Nc[cl]||Xf.moduleById[cl]?.tabs[0]?.id||Xf.fallbackTarget.tabId;n(cl),t((Ql)=>({...Ql,[cl]:$l}));let Tl=H3(Xf,cl,$l);if(window.location.pathname!==Tl){let Ql=rl==="replace"?"replaceState":"pushState";window.history[Ql](null,"",Tl)}}function b(I,M){L({title:I,data:M})}let[z,P]=kl(!1),{unreadCount:s,notifications:k}=Xr(),v=k.length>0?k[k.length-1]:null,tl=AG(dL);return _("div",{className:`shell ${J?"rail-collapsed":""} ${tl?"dev-shell":""}`,"data-testid":"app-shell"},_(hY,{activeModule:f,activeTabs:i,onNavigate:S,collapsed:J,onToggle:()=>w((I)=>!I)}),_("main",{className:"workspace"},_(CY,{connection:$,lastRefresh:j,onRefresh:X,onLogout:()=>u(!0),session:l,clock:U,activeStatusItems:m,onNotificationToggle:()=>P((I)=>!I),unreadCount:s,environment:dL}),_(RY,{module:O,activeTab:Z,onNavigate:S}),_(Cj.Provider,{value:Q},_(zP,{activeModule:f,activeTab:Z,data:Y,session:l,refresh:X,onRaw:b,onNavigate:S}))),_(YY,{raw:W,onClose:()=>L(null)}),v&&_(oL,{key:v.id,notification:v}),z&&_(aL,{onClose:()=>P(!1)}))}function OP(){let[l,u]=kl(!0),[r,f]=kl(null);async function n(){u(!0);try{let t=await ml("/api/session");f(t.authenticated?t:null)}catch{f(null)}finally{u(!1)}}async function i(t){if(t)try{await ml("/logout",{method:"POST"})}catch{}f(null)}if(En(()=>{n()},[]),l)return _("main",{className:"loading-screen"},_("div",{className:"brand-mark"},"UD"),_("span",null,"加载会话"));if(!r)return _(PY,{onLogin:f});return _(eU,null,_(EP,{session:r,onLogout:i}))}var ZG=document.getElementById("root");if(ZG===null)throw Error("root element not found");_G.createRoot(ZG).render(_(OP));})(); + ${P} + ${S} + ${E} + ${V} + `,width:w,height:L}}function _8(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 lG(l,u){let r=eL(u,"pipeline"),{svg:f,width:n,height:t}=oY(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,J)=>{c.onload=()=>j(),c.onerror=()=>J(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");_8(F,`${r}.png`)}catch{_8(i,`${r}.svg`)}finally{URL.revokeObjectURL(y)}}async function rX(l){let u=eL(String(l?.title||"pipeline-gantt"),"pipeline-gantt"),{svg:r,width:f,height:n}=uX(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");_8(A,`${u}.png`)}catch{_8(t,`${u}.svg`)}finally{URL.revokeObjectURL(i)}}async function fX(l){for(let u of l){if(u.flow.nodes.length===0)continue;await lG(u.flow,u.title),await new Promise((r)=>setTimeout(r,750))}}function XL(l,u){return l.find((r)=>String(r?.pipelineId||"")===u)||null}function PL(l){return al(l?.startedAt)??al(l?.artifact?.startedAt)??al(l?.request?.createdAt)??al(l?.updatedAt)??0}function nX(l,u){return l.filter((r)=>String(r?.pipelineId||"")===u).slice().sort((r,f)=>PL(r)-PL(f)||String(r?.runId||"").localeCompare(String(f?.runId||"")))}function h9(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 N8(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 u8(l,u){let r=Xl(l?.artifact)?l.artifact:{},f=Xl(l?.request)?l.request:{};return U$(l?.startedAt,r.startedAt,f.createdAt,f.startedAt,l?.createdAt,l?.updatedAt,u?.startedAt,u?.request?.createdAt)}function r8(l,u){let r=String(l?.status?.status||l?.artifact?.status||l?.status||"").toLowerCase(),f=Xl(l?.artifact)?l.artifact:{},n=x9(r);return U$(l?.finishedAt,f.finishedAt,l?.completedAt,n?l?.updatedAt:void 0,n?f.updatedAt:void 0,n?u?.updatedAt:void 0)}function uG(l,u,r=Date.now()){let f=String(l?.runId||""),n=new Set(u.map((t)=>String(t?.id||"")).filter(Boolean));return Vl(l?.procedureRuns).flatMap((t)=>{let i=N8(t,f);if(!i)return[];let y=String(t?.status?.status||t?.artifact?.status||t?.status||"unknown").toLowerCase(),c=u8(t,l),_=al(c);if(_===null)return[];let A=r8(t,l),F=al(A)??(x9(y)?al(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 tX(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=Pu(A?.eventMs??A?.ms);if(F!==null)f.push(F),n.push(F)}let t=al(l?.startedAt)??al(l?.artifact?.startedAt)??al(l?.request?.createdAt),i=al(l?.finishedAt)??al(l?.artifact?.finishedAt)??al(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 f8=12,rG=20,s9=100,iX=!1;function ii(l){let u=Number(l);if(!Number.isFinite(u))return 0;return Math.max(0,Math.min(100,Math.round(u*100)/100))}function yX(l){let u=Math.max(f8,Number(l||f8)),r=Math.log(u/f8)/Math.log(rG);return ii(r*100)}var J$=yX(s9);function a9(l){let u=ii(l)/100,r=f8*Math.pow(rG,u),f=u<0.24?"全局":u<0.64?"均衡":"细节";return{value:ii(u*100),pxPerMinute:r,label:f}}function D9(l){let u=Math.round(Number(l));return Math.abs(u-s9)<=1?s9:u}function cX(l,u=J$){let r=Math.max(1,Number(l.durationMs||0)/60000),f=a9(u);return Math.round(Math.max(360,Math.min(7200,r*Number(f.pxPerMinute||48))))}function $X(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 _X(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 Pu(l){let u=Number(l);return Number.isFinite(u)?u:null}function o9(l){return ML(l?.status)&&!x9(l?.status)}function fG(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 CL(l,u){if(!u)return null;let r=Pu(u?.startMs),f=Pu(u?.endMs),n=Pu(u?.chartHeight);if(r===null||f===null||n===null)return null;return fG(l,r,f,n)}function nG(l,u){let r=Pu(l?.rawStartMs??l?.startMs)??Pu(l?.startMs)??u,f=Pu(l?.endMs)??r+1000;if(!o9(l))return Math.max(r+1000,f);return Math.max(r+1000,f,u)}function AX(l,u,r,f){let n=Pu(l?.startMs)??f-60000,t=Pu(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=cX(_,u),F=a9(u),j=Math.max(5,Math.min(18,Math.round(A/150))),J=$X(_,j).map((U)=>{let w=Number(U.ms),L=fG(w,n,y,A);return{...U,y:L,timestamp:j$(w),offsetMs:w-n}});return{source:"frontend-y",startMs:n,endMs:y,durationMs:c,chartHeight:A,scale:ii(u),normalizedScale:Number((ii(u)/100).toFixed(3)),pxPerMinute:Number(Number(F.pxPerMinute||0).toFixed(3)),ticks:J}}function FX(l,u,r){if(!o9(l))return l;let f=Pu(l?.rawStartMs??l?.startMs)??Pu(l?.startMs)??r,n=nG(l,r),t=CL(f,u),i=CL(n,u),y=Pu(t??l?.y1??l?.startY)??0,c=Pu(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 d9(l,u,r){return _X(l,u)/100*r}function by(l){return Boolean(l&&String(l?.source||"")!=="frontend-y")}function tG(l,u,r,f,n){if(by(f))for(let i of n){let y=Pu(l?.[i]);if(y!==null)return y}let t=Pu(l?.ms??l?.eventMs??l?.startMs);return d9(t??Number(u.startMs),u,r)}function A8(l,u,r,f){return tG(l,u,r,f,["y1","startY"])}function M9(l,u,r,f){if(by(f)){let t=Pu(l?.y2??l?.endY);if(t!==null)return t}let n=Pu(l?.endMs)??Number(u.endMs);return d9(n,u,r)}function iG(l,u,r,f){if(by(f)){let t=Pu(l?.height);if(t!==null)return Math.max(1,t)}let n=l?.live?24:10;return Math.max(n,M9(l,u,r,f)-A8(l,u,r,f))}function qf(l,u,r,f){return tG(l,u,r,f,["y","timeAxisY"])}function yG(l,u,r,f){if(by(f)||String(f?.source||"")==="frontend-y"){let i=Pu(l?.y);if(i!==null)return i}let n=Pu(l?.percent);if(n!==null)return n/100*r;let t=Pu(l?.ms)??Number(u.startMs);return d9(t,u,r)}function jX(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 NX(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=jX(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 JX(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 UX(l){return Vl(l?.tags||l?.raw?.tags).map((u)=>String(u||"")).filter(Boolean)}function QX(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 UX(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 hL(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 mX(l,u){let r=String(l?.commandId||"");if(r)return`command:${r}`;return["control-event",My(l)||U$(l?.createdAt,l?.timestamp)||`index-${u}`,String(l?.sourceKind||""),String(l?.sourceNodeId||""),String(l?.targetNodeId||""),$0(l)].join(":")}function wX(l){return P9([l?.targetNodeId,...Vl(l?.resetNodeIds)])}function qX(l,u){let r=A$(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 LX(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 GX(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 WX(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 cG(l,u,r,f){let n=Math.hypot(r-l,f-u),t=n>GL?GL: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 TX(l,u){let r=String(l?.runId||u?.runId||""),f=uG({...Xl(u)?u:{},...Xl(l)?l:{},runId:r,procedureRuns:Vl(l?.procedureRuns).length>0?l.procedureRuns:u?.procedureRuns},[]),n=[],t=[],i=[],y=new Set,c=new Map,_=(j,J)=>{if(!j.nodeId||!Number.isFinite(Number(j.ms)))return;if(y.has(j.id))return;y.add(j.id),J.push(j)};for(let j of Vl(l?.procedureRuns)){let J=N8(j,r),U=Pf(j);if(!J)continue;for(let w of Vl(j?.attempts)){let L=j8(w);for(let N of X9(w?.controlEventRecords)){let Q=yn(N);if(!["initial-prompt-delivered","append-prompt-delivered","monitor-prompt-delivered"].includes(Q))continue;let m=My(N),q=al(m);if(q===null)continue;let W=String(N?.eventId||"");_({id:`prompt:${W||`${U}:${L}:${Q}:${q}`}`,runId:r,nodeId:J,procedureRunId:U,attempt:L,kind:"prompt",tone:JX(N),status:"delivered",label:QX(N),ms:q,timestampIso:m,sourceKind:String(N?.sourceKind||""),sourceNodeId:String(N?.sourceNodeId||""),targetNodeId:J,action:"",eventId:W,commandId:String(N?.commandId||""),raw:N},n)}}}let A=new Map;X9(l?.controlEvents).forEach((j,J)=>{let U=mX(j,J),w=A.get(U)||{key:U,events:[]};w.events.push(j),A.set(U,w)});for(let j of A.values()){let J=Vl(j.events).slice().sort((H,D)=>hL(D)-hL(H)),U=Vl(j.events).find((H)=>yn(H)==="control-command-queued")||null,w=J[0]||U;if(!U&&!w)continue;let L=String(U?.sourceNodeId||w?.sourceNodeId||""),N=String(U?.sourceKind||w?.sourceKind||""),Q=My(U)||My(w)||U$(U?.createdAt,w?.createdAt),m=al(Q),q=String(w?.commandId||U?.commandId||j.key),W=(yn(w)||"control-command-queued").replace(/^control-command-/u,""),p="";if(L&&m!==null)p=`control-source:${q}:${L}`,c.set(q,p),_({id:p,runId:r,nodeId:L,procedureRunId:String(U?.procedureRunId||w?.procedureRunId||""),attempt:"",kind:"control-source",tone:GX(U||w),status:W,label:`${A$(U||w)} 发起`,ms:m,timestampIso:Q,action:$0(U||w),sourceKind:N,sourceNodeId:L,targetNodeId:String(w?.targetNodeId||U?.targetNodeId||""),commandId:q,raw:U||w},t);let O=w||U,z=My(O)||Q,B=al(z);if(B===null)continue;let Y=wX(O);for(let H of Y){let D=WX(f,H,B,O),P=`control-target:${q}:${H}`;if(_({id:P,runId:r,nodeId:H,procedureRunId:D.procedureRunId,attempt:"",kind:"control-target",tone:LX(O),status:W,label:qX(O,H),ms:D.ms,eventMs:B,onInterval:D.onInterval,snapReason:D.snapReason,snapped:Number(D.ms)!==B,timestampIso:z,renderedTimestampIso:j$(Number(D.ms)),action:$0(O),sourceKind:N,sourceNodeId:L,targetNodeId:H,commandId:q,raw:O},t),p&&L&&L!==H)i.push({id:`control-arrow:${q}:${L}:${H}`,commandId:q,sourceNodeId:L,targetNodeId:H,sourceMarkerId:p,targetMarkerId:P,sourceKind:N,action:$0(O),status:W})}}let F=[...n,...t].sort((j,J)=>Number(j.ms)-Number(J.ms)||String(j.nodeId).localeCompare(String(J.nodeId))||String(j.id).localeCompare(String(J.id)));return{...NX(F,i),sourceMarkerByCommand:c}}function KX({details:l,selectedNodeId:u,selectedNodeRuntime:r,control:f,onRaw:n}){if(!l)return T("span",{className:"muted"},"点击“抓取过程”读取 node 运行材料;主界面只显示结构化摘要,完整内容需点开原始 JSON。");let t=Vl(l.procedureRuns),i=t.at(-1)||{},y=Vl(i.attempts),c=y.at(-1)||{},_=Vl(i.workerLogTail),A=Vl(c.controlEventsTail),F=Vl(c.controlPromptsTail),j=Vl(c.monitorPromptsTail),J=O9(A),U=O9(F),w=O9(j),L=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 ${tu(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 ${Vl(i.recentSteps).length}`,`duration ${Xf(al(i.finishedAt)&&al(i.startedAt)?Number(al(i.finishedAt))-Number(al(i.startedAt)):i.durationMs)}`],data:t,onRaw:n,testId:"raw-pipeline-node-procedures"}),T(Yf,{title:"OpenCode messages",subtitle:String(L.exists?"available":"not indexed"),facts:[`messages ${t8(L.messageCount)}`,`size ${t8(L.size)}`,`updated ${Gl(L.updatedAt)}`],data:L,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 ${Gl(R9(U.lastAt,w.lastAt))}`],data:{controlPromptsTail:F,monitorPromptsTail:j},onRaw:n,testId:"raw-pipeline-node-prompts"}),T(Yf,{title:"Control events",subtitle:J.eventKinds.length>0?J.eventKinds.join(", "):"event tail",facts:[`tail ${J.total}`,`parsed ${J.parsed}`,`last ${Gl(J.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 EX({activeRun:l,onRaw:u}){if(!l)return T(Lf,{title:"暂无运行材料",text:"没有 Pipeline epoch 时不会展示运行材料索引。"});let r=Vl(l.nodes),f=Vl(l.procedureRuns),n=Vl(l.submissions),t=Vl(l.workerLogTail),i=KL(r),y=KL(f),c=f.filter((A)=>String(A?.status||"").toLowerCase()==="failed"),_=R9(...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 ${Gl(l.startedAt)}`,`updated ${Gl(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 ${Gl(_)}`,`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 ${t8(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 ${Gl(l.updatedAt)}`],data:t,onRaw:u,testId:"raw-pipeline-run-worker-log"}))}function pX({diagnostics:l,onRaw:u}){let r=Vl(l?.runs).filter(Xl),f=Vl(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(Mr,{label:"OA Flow",value:i?"100%":"--",hint:String(l?.mode||"waiting diagnostics"),tone:i?"ok":"warn"}),T(Mr,{label:"禁止残留",value:f.length,hint:f.length===0?"source scan clean":"needs cleanup",tone:f.length===0?"ok":"warn"}),T(Mr,{label:"No-audit",value:l?.hasNoAuditPolicyEvidence?"OK":"--",hint:"OA 下游策略证据",tone:l?.hasNoAuditPolicyEvidence?"ok":"warn"}),T(Mr,{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(ti,{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(Lf,{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 zX({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,J=r.remainsMs??f.remainsMs,U=Number(_),w=!t||Number.isFinite(U)&&U<=0?"warn":"ok",L=[t?`endpoint ${l?.endpoint||"--"}`:"quota unavailable",`fetched ${n8(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(Mr,{label:"MiniMax",value:t?i:"--",hint:l?.modelComponent||l?.error||"model/minimax-m27",tone:w}),T(Mr,{label:"当前窗口",value:`${z9(c)}/${z9(y)}`,hint:`已用 ${TL(F)}`,tone:w}),T(Mr,{label:"剩余额度",value:z9(_),hint:`剩余 ${TL(A)}`,tone:w}),T(Mr,{label:"重置时间",value:n8(j),hint:J!==void 0?`约 ${Xf(J)}`:Gl(j),tone:w})),T(b9,{items:L}),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 OX({epochs:l,activeRun:u,activePipeline:r,pipelineNodes:f,pipelineEdges:n,runDetails:t,nodeDetails:i,nodeDetailsState:y,ganttScale:c=J$,onGanttScaleChange:_,onRunChange:A,onIntervalSelect:F,onMarkerSelect:j,selection:J,detailOpen:U,onDetailOpenChange:w,onRaw:L}){let[N,Q]=uf(iX),[m,q]=uf({startY:0,endY:0,startMs:0,endMs:0}),[W,p]=uf(Date.now()),O=fi(null),z=String(u?.runId||""),B=Boolean(U),Y=(Nl)=>{if(typeof w==="function")w(Nl)},H=ii(c??J$),D=String(t?.runId||"")===z?t?.details:null,P=D?{...Xl(u)?u:{},...Xl(D)?D:{},runId:z,procedureRuns:Vl(D?.procedureRuns).length>0?D.procedureRuns:u?.procedureRuns}:u,E=uG(P,f,W),S=D?TX(D,P):{markers:[],arrows:[]},V=Vl(S.markers),v=tX(P,E,V),K=AX(v,H,E,W),X=String(K.source||"frontend-y"),I=E.map((Nl)=>FX(Nl,K,W)),a={startMs:Number(K.startMs),endMs:Number(K.endMs),durationMs:Math.max(1,Number(K.durationMs??Number(K.endMs)-Number(K.startMs)))},R=a9(H),nl={...R,pxPerMinute:Number(K.pxPerMinute??R.pxPerMinute)},d=Math.round(Number(K.chartHeight||360)),h=E.some(o9);Bn(()=>{if(!z||!h)return;let Nl=window.setInterval(()=>p(Date.now()),1000);return()=>window.clearInterval(Nl)},[z,h]);let rl=IY(r,f,Array.isArray(n)?n:[]),_l=f.map((Nl)=>String(Nl?.id||"")).filter(Boolean),Al=I.map((Nl)=>String(Nl.nodeId||"")).filter(Boolean),Ll=V.map((Nl)=>String(Nl.nodeId||"")).filter(Boolean),Ql=Array.from(new Set([...rl,..._l,...Al,...Ll])),pl={startY:0,endY:d,startMs:Number(a.startMs),endMs:Number(a.endMs)},s=Number(m?.endY||0)>0?m:pl,e=(Nl)=>{return A8(Nl,a,d,K)<=Number(s.endY)&&M9(Nl,a,d,K)>=Number(s.startY)},fl=(Nl)=>{let ol=qf(Nl,a,d,K);return ol>=Number(s.startY)&&ol<=Number(s.endY)},k=new Set(Ql.filter((Nl)=>I.some((ol)=>ol.nodeId===Nl&&e(ol))||V.some((ol)=>ol.nodeId===Nl&&fl(ol)))),g=N?Ql.filter((Nl)=>k.has(Nl)):Ql,yl=`${E9}px ${g.length>0?g.map(()=>`${Zn}px`).join(" "):"minmax(160px, 1fr)"}`,Tl=Vl(K.ticks).filter(Xl),Zl=String(J?.mode==="interval"?J?.interval?.procedureRunId||"":""),vl=String(J?.mode==="event"?J?.marker?.id||"":""),nu=()=>{let Nl=O.current;if(!Nl){q(pl);return}let ol=Math.max(0,Nl.scrollTop-p9),wr=Math.max(120,Nl.clientHeight-p9),sl=Math.min(d,ol+wr),Cu={startY:ol,endY:sl,startMs:Number(a.startMs),endMs:Number(a.endMs)},eu=Math.max(0,Math.min(1,ol/d)),tf=Math.max(eu,Math.min(1,sl/d)),Ar=Math.max(1,Number(a.endMs)-Number(a.startMs));Cu.startMs=Number(a.startMs)+Ar*eu,Cu.endMs=Number(a.startMs)+Ar*tf,q(Cu)};Bn(()=>{let Nl=O.current,ol=window.setTimeout(nu,0);return Nl?.addEventListener("scroll",nu),window.addEventListener("resize",nu),()=>{window.clearTimeout(ol),Nl?.removeEventListener("scroll",nu),window.removeEventListener("resize",nu)}},[z,a.startMs,a.endMs,d]);let hl=Math.max(0,Ql.length-g.length),wu=new Set(V.filter((Nl)=>g.includes(String(Nl.nodeId||""))&&fl(Nl)).map((Nl)=>String(Nl.id))),mr=new Map(V.map((Nl)=>[String(Nl.id),Nl])),Or=Vl(S.arrows).filter((Nl)=>{if(!wu.has(String(Nl.targetMarkerId||"")))return!1;if(String(Nl.action||"")==="observe")return g.includes(String(Nl.sourceNodeId||""));return wu.has(String(Nl.sourceMarkerId||""))}),_r=E9+Math.max(1,g.length)*Zn,tr=(Nl)=>{let ol=ii(Nl.target.value);if(typeof _==="function")_(ol);window.setTimeout(nu,0)},ir=()=>rX({title:`${r?.id||"pipeline"}-${z||"epoch"}-gantt`,meta:[`run ${z||"--"}`,`${Gl(a.startMs)} -> ${Gl(a.endMs)}`,`duration ${Xf(a.durationMs)}`,`${nl.label} / ${D9(nl.pxPerMinute)} px/min`,`${g.length}/${Ql.length} nodes`,`${V.length} markers`],visibleNodeIds:g,intervals:I,markers:V.filter((Nl)=>g.includes(String(Nl.nodeId||""))),arrows:Or,ticks:Tl,bounds:a,chartHeight:d,backendLayout:K}),Rr=Xl(D?.gantt?.diagnostics)?D.gantt.diagnostics:null;return T(Hn,{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},h9(l,Nl)))),T("label",{className:"pipeline-gantt-toggle"},T("input",{type:"checkbox","data-testid":"pipeline-gantt-auto-hide-idle",checked:N,onChange:(Nl)=>{Q(Boolean(Nl.target.checked)),window.setTimeout(nu,0)}}),T("span",null,"自动隐藏空闲列")),T("label",{className:"pipeline-gantt-scale"},T("span",null,T("b",null,"时间尺度"),T("em",{"data-testid":"pipeline-gantt-scale-label"},`${nl.label} · ${D9(nl.pxPerMinute)} px/min`)),T("input",{type:"range",min:0,max:100,step:0.01,value:H,onChange:tr,"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:ir,disabled:g.length===0,"data-testid":"pipeline-export-gantt"},"导出甘特图"):null,u?T(cn,{title:`Pipeline Epoch ${u.runId}`,data:u,onOpen:L,testId:"raw-pipeline-epoch-gantt"}):null)},!u?T(Lf,{title:"暂无 Epoch",text:"当前 pipeline 还没有完整运行记录。"}):I.length===0?T(Lf,{title:"暂无时间区间",text:"等待 D601 Pipeline backend 在 procedure summary 中返回 startedAt / finishedAt。"}):T("div",{className:"pipeline-gantt-wrap"},T("div",{className:`pipeline-gantt-detail-layout ${B?"detail-open":"detail-collapsed"}`,"data-testid":"pipeline-gantt-detail-layout","data-sidebar-open":B?"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 ${Gl(a.startMs)} -> ${Gl(a.endMs)}`),T("span",null,`duration ${Xf(a.durationMs)}`),T("span",null,`scale ${nl.label} / ${D9(nl.pxPerMinute)} px/min`),T("span",null,`layout ${X}`),Rr?T("span",null,`align ${Rr.timeAxisAlignmentOk===!1?"check":"ok"}`):null,T("span",null,`visible ${g.length}/${Ql.length} nodes`),D?T("span",null,`markers ${V.length}`):null,N&&hl>0?T("span",null,`hidden idle ${hl}`):null),!B?T("button",{type:"button",className:"pipeline-sidecar-tab right",disabled:!J?.mode,onClick:()=>Y(!0),"data-testid":"pipeline-gantt-sidebar-toggle"},J?.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(a.startMs),"data-end-ms":String(a.endMs),"data-chart-height":String(d)},T("div",{className:"pipeline-gantt-board",style:{gridTemplateColumns:yl,minWidth:`${_r}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(ZY,{value:Nl}))),T("div",{className:"pipeline-gantt-time-axis",style:{height:`${d}px`}},Tl.map((Nl)=>{let ol=yG(Nl,a,d,K);return T("div",{key:`tick-${Nl.ms}-${ol}`,className:"pipeline-gantt-tick",style:{top:`${ol}px`},"data-testid":"pipeline-gantt-tick","data-ms":String(Nl.ms),"data-y":String(ol)},T("b",null,Gl(Nl.ms)),T("span",null,`+${Xf(Number(Nl.offsetMs??Number(Nl.ms)-Number(a.startMs)))}`))})),g.length>0?T("svg",{className:"pipeline-gantt-arrow-layer",width:g.length*Zn,height:d,viewBox:`0 0 ${g.length*Zn} ${d}`,style:{left:`${E9}px`,top:`${p9}px`,width:`${g.length*Zn}px`,height:`${d}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"}))),Or.map((Nl)=>{let ol=mr.get(String(Nl.targetMarkerId||""));if(!ol)return null;let wr=mr.get(String(Nl.sourceMarkerId||"")),sl=String(wr?.nodeId||Nl.sourceNodeId||""),Cu=g.indexOf(sl),eu=g.indexOf(String(ol.nodeId||""));if(Cu<0||eu<0)return null;let tf=Cu*Zn+Zn/2,Ar=eu*Zn+Zn/2,Zr=wr?qf(wr,a,d,K):qf(ol,a,d,K),Vn=qf(ol,a,d,K);return T("path",{key:Nl.id,className:`pipeline-gantt-arrow ${String(Nl.sourceKind||"").toLowerCase()} ${String(Nl.status||"").toLowerCase()} ${String(Nl.action||"").toLowerCase()}`,d:cG(tf,Zr,Ar,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(Zr),"data-target-y":String(Vn)})})):null,g.length===0?T("div",{className:"pipeline-gantt-empty-col",style:{height:`${d}px`}},"滚动到有活动的时间段后,相关 node 列会自动出现。"):g.map((Nl)=>{let ol=I.filter((sl)=>sl.nodeId===Nl),wr=V.filter((sl)=>String(sl.nodeId||"")===Nl);return T("div",{key:`col-${Nl}`,className:"pipeline-gantt-node-col",style:{height:`${d}px`}},ol.map((sl)=>{let Cu=A8(sl,a,d,K),eu=M9(sl,a,d,K),tf=iG(sl,a,d,K),Ar=String(sl.procedureRunId||`${Nl}-${sl.startMs}`);return T("button",{key:Ar,type:"button",className:`pipeline-gantt-bar ${sl.status} ${sl.live?"live":""} ${Zl===Ar?"selected":""}`,style:{top:`${Cu}px`,height:`${tf}px`},title:`${Nl} ${sl.status} ${Gl(sl.startedAt||sl.startMs)} -> ${Gl(sl.finishedAt||sl.endMs)}`,onClick:()=>F(sl),"data-testid":"pipeline-gantt-line","data-node-id":Nl,"data-procedure-run-id":String(sl.procedureRunId||""),"data-status":String(sl.status||""),"data-live":sl.live?"true":"false","data-start-ms":String(sl.startMs||""),"data-end-ms":String(sl.endMs||""),"data-y1":String(Cu),"data-y2":String(eu),"data-natural-height":String(Math.max(0,eu-Cu))},T("strong",null,sl.status||"working"),T("span",null,Xf(sl.durationMs)))}),wr.map((sl)=>T("button",{key:sl.id,type:"button",className:`pipeline-gantt-marker ${sl.kind} ${sl.tone||""} ${sl.status||""} ${vl===String(sl.id)?"selected":""}`,style:{top:`${qf(sl,a,d,K)}px`},title:`${sl.label||"event"} / ${Gl(sl.timestampIso||sl.timestamp||sl.ms)}`,onClick:()=>j(sl),"data-testid":sl.kind==="prompt"?"pipeline-gantt-prompt-marker":"pipeline-gantt-control-marker","data-marker-id":String(sl.id||""),"data-ms":String(sl.ms??sl.eventMs??""),"data-y":String(qf(sl,a,d,K))})))})))),B?T(OY,{selection:J,runDetails:t,nodeDetails:i,nodeDetailsState:y,onRaw:L,onCollapse:()=>Y(!1)}):null)))}function tt(){return{loading:!1,actionLoading:"",error:"",message:"",details:null,fetchedAt:null,appendPrompt:"",guidePrompt:"",modifyPrompt:"",approveReason:"",redoReason:""}}function ri(){return{mode:"",runId:"",interval:null,marker:null}}function S9(){return{runId:"",loading:!1,error:"",details:null,fetchedAt:null}}function c$(l,u){return`${l}/microservices/pipeline/proxy${u}`}function ZX({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 J=String(l?.runId||""),U=String(i?.status||"pending"),w=!J||!n||y.loading||Boolean(y.actionLoading),L=(Q)=>(m)=>c({[Q]:m.target.value,error:"",message:""}),N=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(fu,{title:n||"点击控制图中的 node",level:3,loading:y.loading||Boolean(y.actionLoading)})),T("div",{className:"pipeline-node-control-head-actions"},n?T(ti,{status:U},U):T(ti,{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:J||r,disabled:N.length===0,onChange:(Q)=>f(Q.target.value),"data-testid":"pipeline-node-run-select"},N.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"),Gl(l?.updatedAt))),!n?T(Lf,{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:L("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:L("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:L("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:L("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:L("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(KX,{details:y.details,selectedNodeId:n,selectedNodeRuntime:i,control:y,onRaw:F})))}function $G({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((tl)=>tl.id==="pipeline")||null,[n,t]=uf({loading:!1,error:"",health:null,snapshot:null,oaDiagnostics:null,minimaxQuota:null,refreshedAt:null}),[i,y]=uf(""),[c,_]=uf(""),[A,F]=uf(""),[j,J]=uf(tt()),[U,w]=uf({}),[L,N]=uf(ri()),[Q,m]=uf(S9()),[q,W]=uf(J$),[p,O]=uf(!1),[z,B]=uf(!1),Y=fi(0),{addNotification:H}=Xr(),D=fi(!1),P=fi(0),E=fi(""),S=fi({}),V=fi(""),v=fi("");async function K(tl={}){let Dl=tl.silent===!0;if(!f)return;if(D.current)return;D.current=!0;let Cl=Y.current+1;if(Y.current=Cl,!Dl)t((dl)=>({...dl,loading:!0,error:""}));try{let dl=`__unideskArrayLimit=registry.components:80,runs:${FY}`,[Nu,gu,Au]=await Promise.all([ui(`${r}/microservices/pipeline/proxy/api/snapshot?${dl}`,{cache:"no-store"}),ui(`${r}/microservices/pipeline/proxy/api/oa-event-flow/diagnostics`,{cache:"no-store"}).catch((hf)=>({ok:!1,error:zl(hf,"OA event flow diagnostics failed")})),ui(`${r}/microservices/pipeline/proxy/api/model-quota/minimax`,{cache:"no-store"}).catch((hf)=>({ok:!1,error:zl(hf,"MiniMax quota failed")}))]);if(Cl!==Y.current)return;let qr={ok:Nu?.ok!==!1,service:"pipeline-v2-control snapshot"};t({loading:!1,error:"",health:qr,snapshot:Nu,oaDiagnostics:gu,minimaxQuota:Au,refreshedAt:new Date})}catch(dl){if(Cl!==Y.current)return;t((Nu)=>({...Nu,loading:!1,error:zl(dl,"Pipeline 加载失败")}))}finally{D.current=!1}}Bn(()=>{if(K(),!f)return;let tl=()=>{if(eA())K({silent:!0})},Dl=window.setInterval(()=>{tl()},LL),Cl=()=>{if(eA())tl()};return document.addEventListener("visibilitychange",Cl),()=>{window.clearInterval(Dl),document.removeEventListener("visibilitychange",Cl)}},[f?.id,f?.runtime?.providerStatus,r]);let X=HY(f),I=DY(f),a=BY(f),R=n.snapshot||{},nl=n.oaDiagnostics||null,d=n.minimaxQuota||null,{components:h,pipelines:rl,runs:_l}=SY(R),Al=String(_l[0]?.pipelineId||""),Ll=(Al?rl.find((tl)=>String(tl.id||"")===Al):null)||rl[0]||{},Ql=rl.find((tl)=>String(tl.id||"")===i)||Ll,pl=String(Ql.id||""),s=aL(Ql),e=g9(Ql),fl=XL(_l,pl),k=nX(_l,pl),g=k.find((tl)=>String(tl?.runId||"")===c)||fl,yl=String(Q.runId||"")===String(g?.runId||"")?PY(Q.details):null,Tl=CY(g,yl),Zl=String(Tl?.runId||""),vl=s.find((tl)=>String(tl?.id||"")===A)||null,nu=A?oL(Tl,A):null,hl=YY(_l),wu=RY(h),mr=Number(n.health?.components)||ZL(R,"registry.components",h.length),Or=ZL(R,"runs",_l.length),_r=DL(Ql,Tl,h),tr={nodes:_r.nodes.map((tl)=>tl.id===A?{...tl,selected:!0,className:`${tl.className||""} selected-control-node`}:tl),edges:_r.edges},ir=rl.map((tl)=>{let Dl=String(tl.id||"pipeline"),Cl=XL(_l,Dl);return{title:`${Dl}-${Cl?.runId||"snapshot"}`,flow:DL(tl,Cl,h)}}),Rr=String(L?.runId||Zl||""),Nl=String(L?.interval?.nodeId||L?.marker?.nodeId||""),ol=Rr&&Nl?U[B9(Rr,Nl)]||null:null,wr=i8(j.details,Rr,Nl),sl=i8(ol?.details,Rr,Nl)||wr,Cu=Rr&&Nl?{...Xl(ol)?ol:{},runId:Rr,nodeId:Nl,details:sl,loading:Boolean(ol?.loading)||!sl&&Boolean(j.loading)&&A===Nl,error:String(ol?.error||""),fetchedAt:ol?.fetchedAt||(wr?j.fetchedAt:null)}:null,eu=k.map((tl)=>String(tl?.runId||"")).filter(Boolean).join("|"),tf=s.map((tl)=>String(tl?.id||"")).filter(Boolean).join("|");Bn(()=>{V.current=A},[A]),Bn(()=>{v.current=Zl},[Zl]),Bn(()=>{if(!c||eu.split("|").includes(c))return;_("")},[c,eu]),Bn(()=>{if(!A||tf.split("|").includes(A))return;F(""),J(tt()),N(ri()),O(!1),B(!1)},[A,tf]),Bn(()=>{if(!A)O(!1)},[A]),Bn(()=>{if(!L.mode)B(!1)},[L.mode]);async function Ar(tl=Zl,Dl={}){if(!tl){m(S9());return}let Cl=ii(Dl.scale??q??J$),dl=`${tl}:timeline`;if(E.current===dl)return;E.current=dl;let Nu=Dl.silent===!0,gu=P.current+1;P.current=gu,m((Au)=>({runId:tl,scale:Cl,loading:!Nu||String(Au.runId||"")!==tl||!Au.details,error:"",details:Nu&&Au.runId===tl?Au.details:Au.runId===tl?Au.details:null,fetchedAt:Au.runId===tl?Au.fetchedAt:null}));try{let[Au,qr]=await Promise.all([ui(c$(r,`/api/node-control/runs/${encodeURIComponent(tl)}?tail=160&view=timeline`),{cache:"no-store",strictJson:!0}),ui(c$(r,`/api/runs/${encodeURIComponent(tl)}`),{cache:"no-store"}).catch((hf)=>({ok:!1,runSummaryError:zl(hf,"抓取评分失败")}))]);if(gu!==P.current)return;m({runId:tl,scale:Cl,loading:!1,error:"",details:{...Au,run:Xl(qr?.run)?qr.run:void 0,runSummaryError:qr?.runSummaryError},fetchedAt:new Date})}catch(Au){if(gu!==P.current)return;m((qr)=>({runId:tl,scale:Cl,loading:!1,error:zl(Au,"抓取 epoch 执行过程失败"),details:qr.runId===tl?qr.details:null,fetchedAt:qr.runId===tl?qr.fetchedAt:null}))}finally{if(E.current===dl)E.current=""}}function Zr(tl,Dl,Cl){let dl=B9(tl,Dl);w((Nu)=>{let gu={...Nu,[dl]:{...Xl(Nu?.[dl])?Nu[dl]:{},runId:tl,nodeId:Dl,...Cl}},Au=Object.keys(gu);if(Au.length>32)for(let qr of Au.slice(0,Au.length-32))delete gu[qr];return gu})}async function Vn(tl,Dl){if(!tl||!Dl)return;let Cl=B9(tl,Dl),dl=Number(S.current?.[Cl]||0)+1;S.current={...S.current,[Cl]:dl},Zr(tl,Dl,{loading:!0,error:""});try{let Nu=await ui(c$(r,`/api/node-control/runs/${encodeURIComponent(tl)}/nodes/${encodeURIComponent(Dl)}?tail=160`),{cache:"no-store",strictJson:!0});if(Number(S.current?.[Cl]||0)!==dl)return;let gu=new Date;if(Zr(tl,Dl,{loading:!1,details:Nu,fetchedAt:gu,error:""}),V.current===Dl&&v.current===tl)J((Au)=>({...Au,loading:!1,details:Nu,fetchedAt:gu,error:""}))}catch(Nu){if(Number(S.current?.[Cl]||0)!==dl)return;Zr(tl,Dl,{loading:!1,error:zl(Nu,"抓取 Gantt node 详情失败")})}}Bn(()=>{if(!Zl){m(S9());return}Ar(Zl);let tl=()=>{if(eA())Ar(Zl,{silent:!0})},Dl=window.setInterval(()=>{tl()},LL),Cl=()=>{if(eA())tl()};return document.addEventListener("visibilitychange",Cl),()=>{window.clearInterval(Dl),document.removeEventListener("visibilitychange",Cl)}},[Zl,r]);async function yf(tl=Zl,Dl=A){if(!tl||!Dl){J((Cl)=>({...Cl,error:"请先选择 run 和 node",message:""}));return}J((Cl)=>({...Cl,loading:!0,error:"",message:""}));try{let Cl=await ui(c$(r,`/api/node-control/runs/${encodeURIComponent(tl)}/nodes/${encodeURIComponent(Dl)}?tail=160`),{cache:"no-store",strictJson:!0}),dl=new Date;J((Nu)=>({...Nu,loading:!1,details:Cl,fetchedAt:dl,error:""})),Zr(tl,Dl,{loading:!1,details:Cl,fetchedAt:dl,error:""})}catch(Cl){J((dl)=>({...dl,loading:!1,error:zl(Cl,"抓取 node 执行过程失败")}))}}async function ct(tl){let Dl=String(tl?.runId||Zl||""),Cl=String(tl?.nodeId||"");if(N({mode:"interval",runId:Dl,interval:tl,marker:null}),B(!0),!Dl||!Cl)return;if(Dl!==Zl)_(Dl);F(Cl),J(tt()),Ar(Dl,{silent:!0}),Vn(Dl,Cl)}async function Fu(tl){let Dl=String(tl?.runId||Zl||""),Cl=String(tl?.nodeId||"");if(N({mode:"event",runId:Dl,interval:null,marker:tl}),B(!0),!Dl)return;if(Dl!==Zl)_(Dl);if(Ar(Dl,{silent:!0}),!Cl)return;F(Cl),J(tt()),Vn(Dl,Cl)}async function A0(tl){if(!Zl||!A){J((dl)=>({...dl,error:"请先选择 run 和 node",message:""}));return}let Dl=tl==="append"?"prompts":tl,Cl=tl==="append"?j.appendPrompt:tl==="guide"?j.guidePrompt:tl==="modify"?j.modifyPrompt:tl==="approve"?j.approveReason:j.redoReason;if(!String(Cl||"").trim()){J((dl)=>({...dl,error:"操作内容不能为空",message:""}));return}J((dl)=>({...dl,actionLoading:tl,error:"",message:""}));try{let dl=tl==="redo"||tl==="approve"?{reason:Cl,source:"unidesk-frontend",sourceKind:"webui"}:{prompt:Cl,source:"unidesk-frontend",sourceKind:"webui"},Nu=await ui(c$(r,`/api/node-control/runs/${encodeURIComponent(Zl)}/nodes/${encodeURIComponent(A)}/${Dl}`),{method:"POST",body:JSON.stringify(dl)});if(J((Au)=>({...Au,actionLoading:"",details:Nu,fetchedAt:new Date,appendPrompt:tl==="append"?"":Au.appendPrompt,guidePrompt:tl==="guide"?"":Au.guidePrompt,modifyPrompt:tl==="modify"?"":Au.modifyPrompt,approveReason:tl==="approve"?"":Au.approveReason,redoReason:tl==="redo"?"":Au.redoReason,message:tl==="append"?"已追加到运行中 node":tl==="guide"?"已下发 guide,等待 runner 处理":tl==="modify"?"已排队增量修改命令":tl==="approve"?"已提交审核通过决策":"已排队重做命令"})),H("success",tl==="append"?"已追加到运行中 node":tl==="guide"?"已下发 guide,等待 runner 处理":tl==="modify"?"已排队增量修改命令":tl==="approve"?"已提交审核通过决策":"已排队重做命令"),await yf(Zl,A),await Ar(Zl,{silent:!0}),tl!=="append")await K()}catch(dl){J((Nu)=>({...Nu,actionLoading:"",error:zl(dl,"node 控制操作失败")}))}}if(!f)return T(Lf,{title:"Pipeline 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=pipeline"});return T("div",{className:"pipeline-page","data-testid":"pipeline-page"},T(Hn,{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(ti,{status:X.providerStatus==="online"?"online":"warn"},X.providerStatus||"unknown"),T("span",null,f.providerId),T("span",null,a.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,`${a.nodeBindHost||"--"}:${a.nodePort||"--"}`),T("code",null,`${I.composeFile||"--"} / ${I.composeService||"--"}`))),T(el,{error:n.error,wide:!0})),T("div",{className:"pipeline-grid"},T(Hn,{title:"控制图",eyebrow:`${Ql.id||"pipeline"} / run ${Tl?.status||"--"}`,className:"pipeline-wide-panel",loading:n.loading,actions:T("div",{className:"pipeline-toolbar"},T("select",{value:pl,disabled:rl.length===0,onChange:(tl)=>{y(tl.target.value),_(""),F(""),J(tt()),N(ri()),O(!1),B(!1)},"data-testid":"pipeline-select"},rl.map((tl)=>T("option",{key:tl.id,value:tl.id},tl.id||tl.key))),T("select",{value:Zl,disabled:k.length===0,onChange:(tl)=>{if(_(tl.target.value),J(tt()),N(ri()),O(!1),B(!1),A)yf(tl.target.value,A)},"data-testid":"pipeline-run-select"},k.map((tl)=>T("option",{key:tl.runId,value:tl.runId},h9(k,tl)))),T("button",{type:"button",className:"ghost-btn",disabled:tr.nodes.length===0,onClick:()=>lG(tr,`${Ql.id||"pipeline"}-${Tl?.runId||"snapshot"}`),"data-testid":"pipeline-export-graph"},"导出渲染图"),T("button",{type:"button",className:"ghost-btn",disabled:ir.every((tl)=>tl.flow.nodes.length===0),onClick:()=>fX(ir),"data-testid":"pipeline-export-all-graphs"},"批量导出"))},s.length===0?T(Lf,{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(NL,{nodes:tr.nodes,edges:tr.edges,nodeTypes:QY,edgeTypes:UY,fitView:!0,fitViewOptions:{padding:0.18},nodesDraggable:!1,nodesConnectable:!1,elementsSelectable:!0,minZoom:0.25,maxZoom:1.4,proOptions:{hideAttribution:!0},onNodeClick:(tl,Dl)=>{let Cl=String(Dl.id);if(F(Cl),J(tt()),O(!0),Zl)yf(Zl,Cl)}},T(UL,{gap:22,size:1,color:"rgba(215, 161, 58, 0.24)"}),T(mL,{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(ZX,{activeRun:Tl,pipelineRuns:k,selectedRunId:c,onRunChange:(tl)=>{if(_(tl),J(tt()),N(ri()),A)yf(tl,A)},selectedNodeId:A,selectedNodeConfig:vl,selectedNodeRuntime:nu,control:j,onControlChange:(tl)=>J((Dl)=>({...Dl,...tl})),onFetch:()=>yf(),onAction:A0,onRaw:u,onCollapse:()=>O(!1)}):null),T("div",{className:"pipeline-flow-summary"},T("span",null,`${tr.nodes.length} nodes`),T("span",null,`${tr.edges.length} edges`),T("span",null,`${rl.length} pipelines`),T("span",null,`source config+components(${h.length})`),T("span",null,`run ${Tl?.runId||"--"}`),T("span",null,`score ${C9(Tl)}`),T("span",null,A?`selected ${A}`:"click node to control"))),T(OX,{epochs:k,activeRun:Tl,activePipeline:Ql,pipelineNodes:s,pipelineEdges:e,selection:L,detailOpen:z,onDetailOpenChange:B,runDetails:Q,nodeDetails:sl,nodeDetailsState:Cu,ganttScale:q,onGanttScaleChange:W,onIntervalSelect:ct,onMarkerSelect:Fu,onRunChange:(tl)=>{if(_(tl),J(tt()),N(ri()),B(!1),A)yf(tl,A)},onRaw:u}),T(Hn,{title:"观测指标",eyebrow:n.refreshedAt?`Updated ${tu(n.refreshedAt)}`:"Snapshot",loading:n.loading},T("div",{className:"metric-grid"},T(Mr,{label:"Health",value:n.health?.ok?"OK":"--",hint:n.health?.service||"D601 /health",tone:n.health?.ok?"ok":"warn"}),T(Mr,{label:"组件",value:mr,hint:"components registry",tone:R?.registry?.ok===!1?"warn":"ok"}),T(Mr,{label:"Pipeline",value:rl.length,hint:`${s.length} nodes / ${e.length} edges`}),T(Mr,{label:"运行记录",value:Or,hint:`${hl.succeeded||0} succeeded / ${hl.running||0} running`}),T(Mr,{label:"OA 记录",value:Array.isArray(fl?.submissions)?fl.submissions.length:0,hint:fl?.runId||"latest run"}),T(Mr,{label:"Procedure",value:Array.isArray(fl?.procedureRuns)?fl.procedureRuns.length:0,hint:fl?.status||"no run"}),T(Mr,{label:"Score",value:C9(Tl),hint:Tl?.runId||"selected epoch",tone:I9(Tl)})),T("div",{className:"panel-actions inline-actions"},T(cn,{title:"Pipeline Snapshot",data:R,onOpen:u,testId:"raw-pipeline-snapshot"}))),T(Hn,{title:"评分器",eyebrow:Tl?.runId||"selected epoch",loading:n.loading},T(MY,{run:Tl,onRaw:u})),T(Hn,{title:"MiniMax 限额",eyebrow:"model/minimax-m27 quota",loading:n.loading},T(zX,{quota:d,onRaw:u})),T(Hn,{title:"OA 事件流",eyebrow:"100% event-driven diagnostics",className:"pipeline-wide-panel",loading:n.loading},T(pX,{diagnostics:nl,onRaw:u})),T(Hn,{title:"组件矩阵",eyebrow:`${wu.length} classes`,loading:n.loading},wu.length===0?T(Lf,{title:"暂无组件",text:"等待 D601 pipeline backend 返回 registry.components"}):T("div",{className:"component-strata"},wu.map((tl)=>T("article",{key:tl.name,className:"component-stratum"},T("span",null,tl.name),T("strong",null,tl.count)))),T("div",{className:"pipeline-component-list"},h.slice(0,12).map((tl)=>T("span",{key:tl.key,className:"data-chip"},T("b",null,tl.componentClass||"--"),T("span",null,tl.id||tl.key||"--"))))),T(Hn,{title:"Epoch 列表",eyebrow:`${k.length}/${Or} preview`,loading:n.loading},k.length===0?T(Lf,{title:"暂无运行记录",text:"当前 pipeline 在 .state/pipeline-runs 中还没有 epoch。"}):T("div",{className:"pipeline-run-list"},k.map((tl)=>{let Dl=String(tl?.runId||"")===Zl?Tl:tl;return T("article",{key:tl.runId,className:`pipeline-run-card ${String(tl.runId||"")===Zl?"active":""}`,role:"button",tabIndex:0,onClick:()=>{_(String(tl.runId||"")),N(ri())},onKeyDown:(Cl)=>{if(Cl.key==="Enter"||Cl.key===" ")_(String(tl.runId||"")),N(ri())}},T("div",{className:"node-card-head"},T("strong",null,h9(k,tl)),T(ti,{status:tl.status},tl.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(sY,{run:Dl})),T("p",{className:"muted paragraph"},t8(Dl?.task)),T("span",{className:"pipeline-run-time"},Gl(Dl?.updatedAt)))}))),T(Hn,{title:"运行材料索引",eyebrow:Tl?.runId||"selected epoch",className:"pipeline-wide-panel",loading:n.loading},T(EX,{activeRun:Tl,onRaw:u}))))}var Q8=Ml(Ju(),1);var Fl=Q8.default.createElement,{useEffect:HX}=Q8.default,J8=Q8.default.useState,e9={id:"",sequenceNo:"",contractNo:"",name:"",currentStatus:"",pending:"",paymentStatus:"",notes:""};function BX({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return Fl("span",{className:`status-badge ${r}`},u||l||"unknown")}function U8({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 lj({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(fu,{title:l,loading:t})),r?Fl("div",{className:"panel-actions"},r):null),Fl("div",{className:"panel-body"},f))}function _G({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 AG({title:l,text:u}){return Fl("div",{className:"empty-state"},Fl("strong",null,l),Fl("span",null,u))}function DX(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function SX(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function VX(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function vy(l,u){return`${l}/microservices/project-manager/proxy${u}`}function YX(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 XX(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 uj(l){return String(l||"item").replace(/[^A-Za-z0-9_-]+/g,"-")}function PX(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-${uj(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(BX,{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-${uj(n.id)}`},"编辑"),Fl(_G,{title:`Project ${n.contractNo||n.id}`,data:n,onOpen:f,testId:`raw-project-${uj(n.id)}`}))))))))}function FG({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((z)=>z.id==="project-manager")||null,[n,t]=J8({loading:!1,saving:!1,importing:!1,exporting:!1,error:"",notice:"",health:null,list:null,refreshedAt:null}),[i,y]=J8({...e9}),[c,_]=J8(""),[A,F]=J8("all"),{addNotification:j}=Xr();async function J(z=c,B=A){if(!f)return;t((Y)=>({...Y,loading:!0,error:""}));try{let Y=new URLSearchParams({pageSize:"200",status:B});if(z.trim())Y.set("q",z.trim());let[H,D]=await Promise.all([El(`${r}/microservices/project-manager/health`),El(vy(r,`/api/projects?${Y.toString()}`))]);t((P)=>({...P,loading:!1,health:H,list:D,refreshedAt:new Date,error:""}))}catch(Y){t((H)=>({...H,loading:!1,error:zl(Y,"Project Manager 加载失败")}))}}HX(()=>{J()},[f?.id,f?.runtime?.providerStatus]);async function U(z){z.preventDefault(),t((B)=>({...B,saving:!0,error:"",notice:""}));try{let B=XX(i);if(i.id)await El(vy(r,`/api/projects/${encodeURIComponent(i.id)}`),{method:"PUT",body:JSON.stringify(B)});else await El(vy(r,"/api/projects"),{method:"POST",body:JSON.stringify(B)});let Y=i.id?"项目已更新":"项目已创建";t((H)=>({...H,saving:!1,notice:Y})),j("success",Y),await J()}catch(B){t((Y)=>({...Y,saving:!1,error:zl(B,"保存项目失败")}))}}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 El(vy(r,`/api/projects/${encodeURIComponent(i.id)}`),{method:"DELETE"}),y({...e9});let z="项目已删除";t((B)=>({...B,saving:!1,notice:z})),j("success",z),await J()}catch(z){t((B)=>({...B,saving:!1,error:zl(z,"删除项目失败")}))}}async function L(z){let B=z.target.files?.[0];if(!B)return;t((Y)=>({...Y,importing:!0,error:"",notice:""}));try{let Y=PX(await B.arrayBuffer()),D=`Excel 已导入 ${(await El(vy(r,"/api/import/excel"),{method:"POST",body:JSON.stringify({fileName:B.name,contentBase64:Y,replace:!1})})).imported||0} 条项目`;t((P)=>({...P,importing:!1,notice:D})),j("success",D),z.target.value="",await J()}catch(Y){t((H)=>({...H,importing:!1,error:zl(Y,"Excel 导入失败")}))}}async function N(){t((z)=>({...z,exporting:!0,error:""}));try{let z=await qU(vy(r,"/api/projects/export.xlsx")),B=URL.createObjectURL(z),Y=document.createElement("a");Y.href=B,Y.download=`project-manager-${dj()}.xlsx`,document.body.appendChild(Y),Y.click(),Y.remove(),URL.revokeObjectURL(B),t((H)=>({...H,exporting:!1,notice:"Excel 已导出"}))}catch(z){t((B)=>({...B,exporting:!1,error:zl(z,"Excel 导出失败")}))}}if(!f)return Fl(AG,{title:"Project Manager 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=project-manager"});let Q=DX(f),m=VX(f),q=SX(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(lj,{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:()=>J(),"data-testid":"project-manager-refresh-button"},n.loading?"刷新中":"刷新"),Fl("button",{type:"button",className:"ghost-btn",disabled:n.exporting,onClick:N,"data-testid":"project-manager-export-button"},n.exporting?"导出中":"导出 Excel"),Fl(_G,{title:"Project Manager 用户服务",data:f,onOpen:u,testId:"raw-project-manager-service"}))},Fl("div",{className:"project-manager-hero"},Fl(U8,{label:"项目总数",value:p.total??W.length,hint:`PG 表 ${O.storage?.table||"project_manager_projects"}`,tone:"ok"}),Fl(U8,{label:"进行中",value:p.active??"--",hint:"当前状态未完全完成"}),Fl(U8,{label:"已完成",value:p.completed??"--",hint:"按 完成 关键字统计",tone:"ok"}),Fl(U8,{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?tu(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(lj,{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),J(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:()=>J(c,A)},"筛选"))},Fl(CX,{projects:W,activeId:i.id,onSelect:(z)=>y(YX(z)),onRaw:u})),Fl(lj,{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((B)=>({...B,sequenceNo:z.target.value}))})),Fl("label",null,"合同号",Fl("input",{value:i.contractNo,onChange:(z)=>y((B)=>({...B,contractNo:z.target.value})),required:!0})),Fl("label",null,"项目名称",Fl("input",{value:i.name,onChange:(z)=>y((B)=>({...B,name:z.target.value})),required:!0})),Fl("label",null,"当前状况",Fl("textarea",{value:i.currentStatus,onChange:(z)=>y((B)=>({...B,currentStatus:z.target.value}))})),Fl("label",null,"待完成",Fl("textarea",{value:i.pending,onChange:(z)=>y((B)=>({...B,pending:z.target.value}))})),Fl("label",null,"付款情况",Fl("input",{value:i.paymentStatus,onChange:(z)=>y((B)=>({...B,paymentStatus:z.target.value})),placeholder:"例如 1 / 0.5 / 50%"})),Fl("label",null,"其它",Fl("input",{value:i.notes,onChange:(z)=>y((B)=>({...B,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({...e9})},"清空"),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:L,disabled:n.importing,"data-testid":"project-manager-import-input"}))))))}var q8=Ml(Ju(),1);var Jl=q8.default.createElement,{useEffect:hX}=q8.default,ff=q8.default.useState;function sX({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return Jl("span",{className:`status-badge ${r}`},u||l||"unknown")}function m8({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 rj({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(fu,{title:l,loading:t})),r?Jl("div",{className:"panel-actions"},r):null),Jl("div",{className:"panel-body"},f))}function jG({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 MX(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function RX(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function xX(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function JG(l){return String(l).replace(/[^a-zA-Z0-9_-]/g,"_")}function bX(l){if(!Number.isFinite(l))return"--";return`${l.toFixed(1)}%`}function gy(l,u){return`${l}/microservices/todo-note/proxy${u}`}function UG(l){return l.reduce((u,r)=>{let f=UG(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 nj(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)=>nj(n,u))}function NG(l){return Array.isArray(l?.instances)?l.instances:[]}function fj(l,u){for(let r of l){if(r?.id===u)return Array.isArray(r.children)?r.children:[];let f=fj(Array.isArray(r?.children)?r.children:[],u);if(f.length>0)return f}return[]}function QG({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((g)=>g.id==="todo-note")||null,[n,t]=ff(null),[i,y]=ff(null),[c,_]=ff(""),[A,F]=ff(null),[j,J]=ff("all"),[U,w]=ff(13),[L,N]=ff(""),[Q,m]=ff(""),[q,W]=ff(""),[p,O]=ff(""),[z,B]=ff(""),[Y,H]=ff(!1),[D,P]=ff(""),[E,S]=ff(null),V=NG(i),v=UG(Array.isArray(A?.todos)?A.todos:[]),K=f?MX(f):{},X=f?xX(f):{},I=f?RX(f):{};async function a(g=c){let[yl,Tl]=await Promise.all([El(`${r}/microservices/todo-note/health`),El(gy(r,"/api/instances"))]);t(yl),y(Tl);let Zl=NG(Tl),vl=Zl.some((nu)=>nu.id===g)?g:Zl[0]?.id||"";return _(vl),vl}async function R(g=c){if(!g){F(null);return}let yl=await El(gy(r,`/api/instances/${encodeURIComponent(g)}`));F(yl)}async function nl(g=c){if(!f)return;H(!0),P("");try{let yl=await a(g);await R(yl),S(new Date)}catch(yl){P(zl(yl,"Todo Note 加载失败"))}finally{H(!1)}}async function d(g){if(!c)return null;P("");try{let yl=await El(gy(r,`/api/instances/${encodeURIComponent(c)}/actions`),{method:"POST",body:JSON.stringify({action:g})});return F(yl),await a(c),yl}catch(yl){return P(zl(yl,"Todo 操作失败")),null}}async function h(g){g.preventDefault();let yl=L.trim();if(!yl)return;H(!0),P("");try{let Tl=await El(gy(r,"/api/instances"),{method:"POST",body:JSON.stringify({name:yl})});N(""),await nl(Tl.id)}catch(Tl){P(zl(Tl,"创建清单失败"))}finally{H(!1)}}async function rl(g){if(!window.confirm("确认删除这个 Todo Note 清单?"))return;H(!0),P("");try{await El(gy(r,`/api/instances/${encodeURIComponent(g)}`),{method:"DELETE"}),await nl(c===g?"":c)}catch(yl){P(zl(yl,"删除清单失败"))}finally{H(!1)}}async function _l(g){g.preventDefault();let yl=Q.trim();if(!yl)return;m(""),await d({type:"addTodo",title:yl})}async function Al(g){if(!c)return;P("");try{let yl=await El(gy(r,`/api/instances/${encodeURIComponent(c)}/${g}`),{method:"POST",body:JSON.stringify({})});F(yl),await a(c)}catch(yl){P(zl(yl,`${g} 失败`))}}function Ll(g){W(g.id),O(String(g.title||""))}async function Ql(g){let yl=p.trim();if(W(""),O(""),yl)await d({type:"updateTodoTitle",todoId:g,title:yl})}async function pl(g){let Tl=window.prompt("新增子任务标题")?.trim();if(!Tl)return;let Zl=fj(Array.isArray(A?.todos)?A.todos:[],g),vl=new Set(Zl.map((mr)=>mr.id)),nu=await d({type:"addTodo",title:Tl,parentId:g,targetIndex:0});if(!nu)return;let hl=fj(Array.isArray(nu?.todos)?nu.todos:[],g),wu=hl.find((mr)=>!vl.has(mr.id));if(wu&&hl[0]?.id!==wu.id)await d({type:"moveTodo",todoId:wu.id,targetParentId:g,targetIndex:0})}async function s(g,yl){if(!z)return;let Tl={type:"moveTodo",todoId:z,targetIndex:yl};if(g)Tl.targetParentId=g;B(""),await d(Tl)}if(hX(()=>{nl()},[f?.id,f?.runtime?.providerStatus]),!f)return Jl(w8,{title:"Todo Note 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=todo-note"});let e=V.find((g)=>g.id===c)||null,fl=Array.isArray(A?.todos)?A.todos:[],k=fl.map((g,yl)=>({todo:g,index:yl})).filter((g)=>nj(g.todo,j));return Jl("div",{className:"todo-note-page","data-testid":"todo-note-page"},Jl(rj,{title:"Todo Note 工作台",eyebrow:"Main Server 用户服务",loading:Y,actions:Jl("div",{className:"panel-actions"},Jl("button",{type:"button",className:"ghost-btn",disabled:Y,onClick:()=>nl(c),"data-testid":"todo-note-refresh-button"},Y?"刷新中":"刷新"),Jl(jG,{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(sX,{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:D,wide:!0})),Jl("div",{className:"todo-note-layout"},Jl(rj,{title:"清单",eyebrow:`${V.length} Instances`,className:"todo-list-panel",loading:Y},Jl("form",{className:"todo-create-list",onSubmit:h},Jl("input",{placeholder:"新清单名称",value:L,onChange:(g)=>N(g.target.value),"aria-label":"新清单名称"}),Jl("button",{type:"submit",className:"ghost-btn",disabled:Y||!L.trim()},"创建")),V.length===0?Jl(w8,{title:"暂无清单",text:"迁移或创建清单后会出现在这里"}):Jl("div",{className:"todo-instance-list"},V.map((g)=>Jl("button",{key:g.id,type:"button",className:`todo-instance-row ${c===g.id?"active":""}`,onClick:()=>{_(g.id),R(g.id)},"data-testid":`todo-instance-${JG(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(rj,{title:e?.name||"待选择清单",eyebrow:E?`Updated ${tu(E)}`:"Todo Tree",loading:Y,actions:A?Jl("div",{className:"panel-actions"},Jl("button",{type:"button",className:"ghost-btn",onClick:()=>d({type:"renameInstance",name:window.prompt("清单新名称",A.name)||A.name})},"重命名"),Jl("button",{type:"button",className:"ghost-btn danger",onClick:()=>rl(c)},"删除清单"),Jl(jG,{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:_l},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:()=>J(g)},g==="all"?"全部":g==="active"?"未完成":"已完成"))),Jl("div",{className:"todo-toolbar-actions"},Jl("button",{type:"button",className:"ghost-btn",onClick:()=>d({type:"setAllTodosExpanded",expanded:!0})},"全部展开"),Jl("button",{type:"button",className:"ghost-btn",onClick:()=>d({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(m8,{label:"总任务",value:v.total,hint:`${V.length} lists`}),Jl(m8,{label:"已完成",value:v.completed,hint:`${bX(v.total?v.completed/v.total*100:0)}`,tone:"ok"}),Jl(m8,{label:"未完成",value:v.active,hint:j==="active"?"当前筛选":"active tasks",tone:v.active>0?"warn":"ok"}),Jl(m8,{label:"历史指针",value:A.historyPointer??0,hint:"undo / redo"})),Jl("div",{className:"todo-root-drop",onDragOver:(g)=>g.preventDefault(),onDrop:(g)=>{g.preventDefault(),s(null,fl.length)}},"拖到这里可移为根任务末尾"),Jl("div",{className:"todo-tree","data-testid":"todo-note-tree"},k.length===0?Jl(w8,{title:"没有匹配任务",text:"调整筛选或新增任务"}):k.map(({todo:g,index:yl})=>Jl(mG,{key:g.id,todo:g,depth:0,parentId:null,index:yl,siblingCount:fl.length,filter:j,editingId:q,editingTitle:p,setEditingTitle:O,beginEdit:Ll,saveEdit:Ql,applyTodoAction:d,addChild:pl,dragTodoId:z,setDragTodoId:B,dropTodo:s}))))))))}function mG(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:J,dragTodoId:U,setDragTodoId:w,dropTodo:L}=l,N=Array.isArray(u.children)?u.children:[],Q=N.map((W,p)=>({child:W,childIndex:p})).filter((W)=>nj(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(),L(u.id,N.length)},"data-testid":`todo-row-${JG(u.id)}`},Jl("button",{type:"button",className:"todo-expand",disabled:N.length===0,onClick:()=>j({type:"toggleTodoExpanded",todoId:u.id})},N.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,`子项 ${N.length}`),Jl("span",null,`更新 ${Gl(u.updatedAt)}`),u.reminderAt?Jl("span",{className:"todo-reminder"},`提醒 ${Gl(u.reminderAt)}`):Jl("span",null,"无提醒"))),Jl("input",{className:"todo-reminder-input",type:"datetime-local",value:o8(u.reminderAt),onChange:(W)=>j({type:"setTodoReminder",todoId:u.id,reminderAt:ej(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:()=>J(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(mG,{key:W.id,todo:W,depth:r+1,parentId:u.id,index:p,siblingCount:N.length,filter:i,editingId:y,editingTitle:c,setEditingTitle:_,beginEdit:A,saveEdit:F,applyTodoAction:j,addChild:J,dragTodoId:U,setDragTodoId:w,dropTodo:L}))):null)}var wG=Ml(Ju(),1),yi=wG.default.createElement;function qG({title:l,items:u,actions:r,className:f,testId:n}){let t=Array.isArray(u)?u:[];return yi("section",{className:`top-status-bar ${f||""}`,"data-testid":n},yi("div",{className:"top-status-main"},l?yi("strong",{className:"top-status-title"},l):null,yi("div",{className:"top-status-chips"},t.map((i,y)=>yi("span",{key:i?.key||`${i?.label||"status"}-${y}`,className:`top-status-chip ${i?.tone||""}`,"data-testid":i?.testId},i?.label?yi("b",null,i.label):null,yi("span",null,i?.value??"--"))))),r?yi("div",{className:"top-status-actions"},r):null)}var Q$=Ml(Ju(),1);var ql=Q$.default.createElement,{useEffect:vX,useMemo:gX}=Q$.default,kX=Q$.default.useState;function LG({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 L8({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 tj({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(fu,{title:l,loading:t})),r?ql("div",{className:"panel-actions"},r):null),ql("div",{className:"panel-body"},f))}function GG({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 ij({title:l,text:u}){return ql("div",{className:"empty-state"},ql("strong",null,l),ql("span",null,u))}function ky(l){return Array.isArray(l)?l:[]}function yj(l){return l&&typeof l==="object"&&!Array.isArray(l)?l:{}}function IX(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function aX(l,u){return`${l}/microservices/k3sctl-adapter/proxy${u}`}function oX(l){return l.find((u)=>String(u?.id||"")==="k3sctl-adapter")||null}function dX(l){if(l?.healthy===!0)return"online";if(String(l?.role||"")==="standby")return"warn";return"failed"}function eX(l){return l?.healthy===!0?"online":"failed"}function lP(l){if(l===!0)return"YES";if(l===!1)return"NO";return"--"}function uP(l){return Array.from(new Set(l.flatMap((u)=>ky(u?.expectedNodeIds).map((r)=>String(r))))).filter(Boolean).sort()}function rP(l){let u=l.find((r)=>r?.id==="code-queue")||l[0];return String(u?.activeInstanceId||"--")}function fP(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(LG,{status:dX(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,Gl(l?.checkedAt))))}function nP(l,u){let r=ky(l?.instances),f=yj(l?.active);return ql(tj,{key:l?.id||"service",title:l?.id||"managed-service",eyebrow:`${l?.namespace||"unidesk"} / k3s managed service`,className:"k3s-service-panel",actions:ql(GG,{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(LG,{status:eX(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,lP(l?.singleWriter))),ql("div",null,ql("span",null,"Active Health"),ql("strong",null,f?.upstreamStatus??"--"))),r.length===0?ql(ij,{title:"暂无 k3s 实例",text:"adapter 没有返回该服务的 endpoint 列表"}):ql("div",{className:"k3s-instance-grid"},r.map(fP)))}function WG({microservices:l,onRaw:u,apiBaseUrl:r,onNavigate:f}){let n=oX(Array.isArray(l)?l:[]),t=IX(n),[i,y]=kX({loading:!1,error:"",data:null,refreshedAt:null});async function c(){y((Q)=>({...Q,loading:!0,error:""}));try{let Q=await El(aX(r,"/api/control-plane"));y({loading:!1,error:"",data:Q,refreshedAt:new Date})}catch(Q){y((m)=>({...m,loading:!1,error:zl(Q,"加载 k3s 控制平面失败")}))}}vX(()=>{c()},[r]);let _=gX(()=>ky(i.data?.services),[i.data]),A=uP(_),F=_.filter((Q)=>Q?.healthy===!0).length,j=_.reduce((Q,m)=>Q+ky(m?.instances).length,0),J=_.reduce((Q,m)=>Q+ky(m?.instances).filter((q)=>q?.healthy===!0).length,0),U=rP(_),w=yj(i.data?.kubectl),L=yj(i.data?.kubeApiProxy),N=ky(i.data?.manifestPaths).map((Q)=>String(Q));if(!n)return ql(ij,{title:"k3sctl-adapter 未登记",text:"请在 config.json 的 microservices 中登记 id=k3sctl-adapter,并通过该微服务连接 k3s 控制平面。"});return ql("div",{className:"k3s-page","data-testid":"k3sctl-page"},ql(tj,{title:"k3s Control Plane",eyebrow:"Managed by k3sctl-adapter",className:"k3s-hero-panel",loading:i.loading,actions:ql(Q$.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(GG,{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(L8,{label:"控制面",value:i.data?.clusterId||"D601",hint:`adapter ${t.providerStatus||"unknown"}`,tone:t.providerStatus==="online"?"ok":"warn"}),ql(L8,{label:"代管服务",value:_.length,hint:`${F}/${_.length||0} healthy`,tone:F===_.length&&_.length>0?"ok":"warn"}),ql(L8,{label:"节点",value:A.join(" / ")||"--",hint:"expected k3s nodes"}),ql(L8,{label:"实例",value:`${J}/${j}`,hint:`active ${U}`,tone:J===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,L.configured===!0?"K8S API PROXY":"PROXY DEGRADED"),ql("p",null,L.configured===!0?`${L.mode||"kubernetes-api-service-proxy"} via ${L.connectHost||"--"}`:"adapter 必须通过 k8s API service proxy 访问业务服务,不回退到业务容器直连。")),ql("article",{className:"k3s-control-plane-card"},ql("span",null,"manifests"),ql("strong",null,N.length||"--"),ql("p",null,N.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"},`最近刷新 ${tu(i.refreshedAt)}`):null),_.length===0?ql(tj,{title:"代管服务",eyebrow:"k3s services",loading:i.loading},ql(ij,{title:"暂无 k3s 服务",text:"等待 k3sctl-adapter 返回 /api/services;Code Queue 应显示 D601 scheduler/read/write 服务实例。"})):_.map((Q)=>nP(Q,u)))}var m$=Ml(Ju(),1);var ou=m$.default.createElement;function TG({onClose:l}){let{notifications:u,removeNotification:r,clearNotifications:f}=Xr(),n=m$.default.useRef(null);if(m$.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 ou("div",{className:"notification-popup",ref:n},ou("div",{className:"notification-popup-header"},ou("span",null,"通知"),ou("button",{className:"notification-popup-close",onClick:l},"×")),ou("div",{className:"notification-popup-empty"},"暂无通知"));return ou("div",{className:"notification-popup",ref:n},ou("div",{className:"notification-popup-header"},ou("span",null,`通知 (${u.length})`),ou("div",{className:"notification-popup-actions"},ou("button",{className:"notification-popup-clear",onClick:f},"清空"),ou("button",{className:"notification-popup-close",onClick:l},"×"))),ou("div",{className:"notification-popup-list"},u.slice().reverse().map((t)=>ou("div",{key:t.id,className:`notification-item ${t.type}`},ou("span",{className:"notification-item-icon"},t.type==="success"?"✓":"×"),ou("span",{className:"notification-item-message"},t.message),ou("button",{className:"notification-item-dismiss",onClick:()=>r(t.id)},"×")))))}function KG({notification:l}){let{removeNotification:u}=Xr();return m$.default.useEffect(()=>{let r=setTimeout(()=>{u(l.id)},3000);return()=>clearTimeout(r)},[l.id,u]),ou("div",{className:`notification-banner ${l.type}`,role:"alert"},ou("span",{className:"notification-banner-icon"},l.type==="success"?"✓":"×"),ou("span",{className:"notification-banner-message"},l.message),ou("button",{className:"notification-banner-dismiss",onClick:()=>u(l.id)},"×"))}function PG(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 gl=PG("data-config",{apiBaseUrl:"/api",authUsername:"admin"}),EG=gl.environment&&typeof gl.environment==="object"?gl.environment:{},tP=PG("data-codex-overview",null),$=$i.default.createElement,{useEffect:Dn,useMemo:L$}=$i.default,kl=$i.default.useState,Aj=$i.default.createContext(!1),Cf=mm(g3),iP={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 pG(){return typeof document>"u"||document.visibilityState!=="hidden"}function CG(l){return l?.environment==="dev"||l?.namespace==="unidesk-dev"}function yP(l){let u=typeof l==="string"?l:"";return u.length>=7?u.slice(0,7):u||"unknown"}function cP(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 $P(l){if(!l?._summaryOnly||!l?.id)return l;return(await El(`${gl.apiBaseUrl}/tasks/${encodeURIComponent(String(l.id))}`))?.task||l}function G$(l){return l?._summaryOnly?{...l,_loadRaw:()=>$P(l)}:l}function it(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 Gf(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 it(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 AP(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=Gl(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 MG(l){if(!l||typeof l!=="object"||Array.isArray(l))return[];return Object.entries(l)}function nf(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 W8(l,u,r="未知"){let f=jj(l?.labels,u);return typeof f==="string"&&f.length>0?f:r}function RG(l){return W8(l,"providerGatewayVersion")}function q$(l){return W8(l,"providerGatewayUpgradePolicy")}function zG(l){return W8(l,"providerGatewayStartedAt","")}function xG(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 bG(l,u){return xG(l).includes(u)}function OG(l,u){let r=jj(l?.labels,u);return r===!0||r==="true"||r==="1"}function FP(l){if(!bG(l,"host.ssh"))return{tone:"fail",label:"不可用",detail:"未声明 host.ssh"};if(!OG(l,"hostSshConfigured"))return{tone:"warn",label:"未配置",detail:"缺少 SSH 环境变量"};if(!OG(l,"hostSshKeyPresent"))return{tone:"warn",label:"缺 key",detail:"私钥未挂载"};return{tone:"ok",label:"可用",detail:W8(l,"hostSshTarget","host.ssh ready")}}function jP(l){if(!bG(l,"provider.upgrade"))return{tone:"fail",label:"不可用",detail:"未声明 provider.upgrade"};let u=q$(l);if(u!=="always-enabled")return{tone:"warn",label:"待确认",detail:`策略 ${u}`};return{tone:"ok",label:"可用",detail:"always-enabled"}}function Nj(l){let u=typeof l==="string"&&l.length>0?l:"未知";if(u==="未知")return"版本未知";return u.startsWith("v")?u:`v${u}`}function vG(l){return l?.payload&&typeof l.payload==="object"&&!Array.isArray(l.payload)?l.payload:{}}function T8(l){return l?.result&&typeof l.result==="object"&&!Array.isArray(l.result)?l.result:{}}function G8(l){let u=vG(l),r=T8(l);return(u.mode??r.mode)==="schedule"?"schedule":"plan"}function NP(l){let u=vG(l).source;return typeof u==="string"&&u.length>0?u:"unknown"}function JP(l){let u=T8(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 gG(l){let u=T8(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?Nj(f):"版本未知"}function kG(l){if(String(l?.status||"").toLowerCase()==="failed")return sG(l);if(ay(l))return"等待 provider 回传升级终态";let r=T8(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 IG(l,u){return l.filter((r)=>r?.providerId===u&&r?.command==="provider.upgrade").sort((r,f)=>(Sn(f.updatedAt)??0)-(Sn(r.updatedAt)??0))}function UP(l){return l.find((u)=>G8(u)==="schedule")||l[0]||null}function aG(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function ZG(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function QP(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 uu({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){let i=$i.default.useContext(Aj),y=Boolean(t)||i;return $("section",{className:`panel ${n||""}`},$("div",{className:"panel-head"},$("div",null,u?$("p",{className:"panel-eyebrow"},u):null,$(fu,{title:l,loading:y})),r?$("div",{className:"panel-actions"},r):null),$("div",{className:"panel-body"},f))}function du({title:l,data:u,onOpen:r,testId:f}){let[n,t]=kl(!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 mP({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 oG({labels:l,limit:u=8}){let r=MG(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 Iy({node:l}){let u=RG(l);return $("span",{className:`version-chip ${u==="未知"?"unknown":""}`,"data-testid":`gateway-version-${nf(l?.providerId||"unknown")}`},Nj(u))}function HG({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 Jj({node:l}){let u=nf(l?.providerId||"unknown");return $("div",{className:"node-availability-strip"},$(HG,{title:"SSH 透传",state:FP(l),testId:`ssh-availability-${u}`}),$(HG,{title:"远程更新",state:jP(l),testId:`upgrade-availability-${u}`}))}function _i({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,AP(f,n)))))}function mu({title:l,text:u}){return $("div",{className:"empty-state"},$("strong",null,l),$("span",null,u))}function wP({onLogin:l}){let[u,r]=kl(gl.authUsername||"admin"),[f,n]=kl(""),[t,i]=kl(""),[y,c]=kl(!1);async function _(A){A.preventDefault(),c(!0),i("");try{let F=await El("/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 qP({connection:l,lastRefresh:u,onRefresh:r,onLogout:f,session:n,clock:t,activeStatusItems:i=[],onNotificationToggle:y,unreadCount:c=0,environment:_={}}){let A=CG(_),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?tu(u):"未刷新"},{key:"clock",label:h$,value:tu(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,yP(_.commit||_.requestedCommit))):null),$(qG,{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 LP(l){return!l.defaultPrevented&&l.button===0&&!l.metaKey&&!l.altKey&&!l.ctrlKey&&!l.shiftKey&&l.currentTarget.target!=="_blank"}function dG({moduleId:l,tabId:u,className:r,active:f=!1,title:n,testId:t,onNavigate:i,children:y}){let c=k3(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(!LP(_))return;_.preventDefault(),i(l,u)}},y)}function GP({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?"»":"«")),g3.map((t)=>{let i=u[t.id]||E1[t.id]||t.tabs[0]?.id||"";return $(dG,{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 WP({module:l,activeTab:u,onNavigate:r}){return $("nav",{className:"tabs","aria-label":`${l.label} 子功能`},l.tabs.map((f)=>$(dG,{key:f.id,moduleId:l.id,tabId:f.id,className:`tab ${u===f.id?"active":""}`,active:u===f.id,onNavigate:r},f.label)))}function TP({data:l,onRaw:u,onNavigate:r}){let f=l.overview||{},n=l.nodes.filter((J)=>J.status==="online"),t=l.pendingTasks||l.tasks.filter(ay),i=f.pendingTaskCount??t.length,y=l.tasks.slice(0,5),c=f.pgdata||{},_=f.microserviceAvailability||{},A=bl(_.totalCount),F=bl(_.healthyCount),j=bl(_.unhealthyCount);return $("div",{className:"page-grid overview-grid","data-testid":"overview-page"},$(uu,{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 ${it(Math.floor((f.taskPendingTimeoutMs??0)/1000))}`,tone:i>0?"warn":"ok",onClick:()=>r("tasks","pending"),testId:"pending-task-card"}))),$(uu,{title:"本机 Provider",eyebrow:"Self Connected"},n.length===0?$(mu,{title:"暂无在线节点",text:"provider-gateway 未完成自接入"}):$("div",{className:"node-card-list"},n.slice(0,4).map((J)=>$(KP,{key:J.providerId,node:J,onRaw:u})))),$(uu,{title:"待处理任务明细",eyebrow:`${i} Pending`,actions:$("button",{type:"button",className:"ghost-btn",onClick:()=>r("tasks","pending"),"data-testid":"pending-task-detail-link"},"进入任务调度")},t.length===0?$(mu,{title:"当前无待处理",text:"queued / dispatched / running 超时后会自动转为 failed,避免总览长期卡住"}):$("div",{className:"compact-list"},t.slice(0,5).map((J)=>$(VG,{key:J.id,task:J,onRaw:u})))),$(uu,{title:"最近任务",eyebrow:"Dispatch"},y.length===0?$(mu,{title:"暂无任务",text:"可以在任务调度模块发起 docker.ps 或 echo"}):$("div",{className:"compact-list"},y.map((J)=>$(VG,{key:J.id,task:J,onRaw:u})))))}function KP({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"},$(Iy,{node:l}),$("span",null,`升级策略 ${q$(l)}`)),$(Jj,{node:l}),$(oG,{labels:l.labels,limit:6}),$("div",{className:"node-card-foot"},$("span",null,`心跳 ${Gl(l.lastHeartbeat)}`),$(du,{title:`Provider ${l.providerId}`,data:l,onOpen:u,testId:`raw-node-${nf(l.providerId)}`})))}function EP({events:l,onRaw:u}){return $(uu,{title:"事件摘要",eyebrow:"Latest 100"},l.length===0?$(mu,{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,$(_i,{data:r.payload})),$("td",null,Gl(r.createdAt)),$("td",null,$(du,{title:`Event ${r.id}`,data:r,onOpen:u}))))))))}function pP({logs:l,onRaw:u}){return $(uu,{title:"服务日志",eyebrow:"Core Recent"},l.length===0?$(mu,{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,Gl(r.ts)),$("b",null,r.level||"info"),$("strong",null,r.message||"log"),$(_i,{data:r.data,empty:"无附加字段"}),$(du,{title:`Log ${r.message||f}`,data:r,onOpen:u})))))}function zP({nodes:l,onRaw:u}){return $(uu,{title:"节点清单",eyebrow:`${l.length} Providers`},l.length===0?$(mu,{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"},$(Iy,{node:r}),$("span",null,q$(r)))),$("td",null,$(Jj,{node:r})),$("td",null,$(oG,{labels:r.labels,limit:5})),$("td",null,Gl(r.connectedAt)),$("td",null,Gl(r.lastHeartbeat)),$("td",null,$(du,{title:`Provider ${r.providerId}`,data:r,onOpen:u,testId:`raw-node-table-${nf(r.providerId)}`}))))))))}function OP({nodes:l}){let u=L$(()=>{let r=[];for(let f of l)for(let[n,t]of MG(f.labels))r.push({providerId:f.providerId,name:f.name,key:n,value:t});return r},[l]);return $(uu,{title:"资源标签",eyebrow:"Structured Labels"},u.length===0?$(mu,{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 ZP({nodes:l}){return $(uu,{title:"心跳状态",eyebrow:"Provider Liveness"},l.length===0?$(mu,{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,Gl(u.connectedAt))),$("div",null,$("span",null,"last heartbeat"),$("b",null,Gl(u.lastHeartbeat)))))))}function HP({nodes:l,systemStatuses:u,tasks:r,onRaw:f,refresh:n}){let[t,i]=kl(""),y=L$(()=>l.map((w)=>{let L=u.find((N)=>N.providerId===w.providerId);return{...w,systemCurrent:L?.current||null,systemHistory:L?.history||[],systemUpdatedAt:L?.updatedAt||null}}),[l,u]),c=y.find((w)=>w.providerId===t)||y[0]||null;if(Dn(()=>{if(!t&&y[0])i(y[0].providerId)},[y.length,t]),!c)return $(mu,{title:"暂无资源监控",text:"等待 provider 上报 CPU、内存和硬盘指标"});let _=c.systemCurrent,A=c.systemHistory||[],F=_?.cpu||{},j=_?.memory||{},J=_?.disk||{},U=A.length>0?A:_?[{at:_.collectedAt,cpuPercent:bl(F.percent),memoryPercent:bl(j.percent),diskPercent:bl(J.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 ${ci(w.systemCurrent.cpu?.percent)} / MEM ${ci(w.systemCurrent.memory?.percent)}`:"等待指标")))),$("div",{className:"monitor-layout"},$(uu,{title:"任务管理器视图",eyebrow:c.name,className:"monitor-main-panel",actions:_?$(du,{title:`System ${c.providerId}`,data:{current:_,history:A},onOpen:f}):null},!_?$(mu,{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 ${bl(F.load1).toFixed(2)} / ${bl(F.load5).toFixed(2)} / ${bl(F.load15).toFixed(2)}`),$("span",null,`memory actual ${Qr(j.usedBytes)} / ${Qr(j.totalBytes)}`),$("span",null,`disk ${Qr(J.usedBytes)} / ${Qr(J.totalBytes)}`))),$(Wu,{status:_.ok?"online":"warn"},_.ok?"METRICS READY":"METRICS DEGRADED")),$("div",{className:"monitor-chart-grid"},$($j,{title:"CPU",metricKey:"cpuPercent",current:F.percent,points:U,detail:`${F.cores||0} cores / load ${bl(F.load1).toFixed(2)}`,tone:"cpu",testId:"metric-chart-cpu"}),$($j,{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"}),$($j,{title:"Disk",metricKey:"diskPercent",current:J.percent,points:U,detail:`${J.path||"/"} mounted ${J.mount||"--"}`,tone:"disk",testId:"metric-chart-disk"})),$("div",{className:"monitor-summary-grid"},$(Qu,{label:"CPU 当前",value:ci(F.percent),hint:`history ${U.length} samples`,tone:"ok"}),$(Qu,{label:"实际内存",value:Qr(j.usedBytes),hint:`${ci(j.percent)} 不含缓存`}),$(Qu,{label:"硬盘已用",value:Qr(J.usedBytes),hint:ci(J.percent)}),$(Qu,{label:"更新时间",value:Gl(c.systemUpdatedAt||_.collectedAt),hint:c.providerId})),$(BP,{current:_,onRaw:f}))),$("div",{className:"monitor-side-stack"},$(hP,{provider:c,refresh:n,onRaw:f}),$(sP,{provider:c,tasks:r,onRaw:f,limit:5}),$(uu,{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 eG(l){return bl(l.memoryBytes,bl(l.pssBytes,bl(l.rssBytes)))}function BG(l,u){if(u==="memory")return eG(l);if(u==="cpu")return bl(l.cpuPercent);if(u==="disk")return bl(l.readBytesPerSecond)+bl(l.writeBytesPerSecond);if(u==="pid")return bl(l.pid);if(u==="threads")return bl(l.threads);if(u==="runtime")return bl(l.elapsedSeconds);if(u==="user")return String(l.user||"");return String(l.name||l.command||"")}function DG({value:l,label:u,tone:r}){let f=Math.max(1,Math.min(100,bl(l)));return $("div",{className:`process-meter ${r||""}`},$("span",{style:{width:`${f}%`}}),$("b",null,u))}function BP({current:l,onRaw:u}){let[r,f]=kl({key:"memory",direction:"desc"}),n=$i.default.useContext(Aj),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",_=L$(()=>{let F=r.direction==="asc"?1:-1;return[...i].sort((j,J)=>{let U=BG(j,r.key),w=BG(J,r.key);if(typeof U==="string"||typeof w==="string")return String(U).localeCompare(String(w),"zh-CN")*F;return(U-w)*F||bl(j.pid)-bl(J.pid)})},[i,r.key,r.direction]),A=(F,j)=>{let J=r.key===j,U=J?r.direction==="asc"?"ascending":"descending":"none";return $("th",{"aria-sort":U},$("button",{type:"button",className:`process-sort-button ${J?"active":""}`,"data-testid":`process-sort-${j}`,onClick:()=>f((w)=>({key:j,direction:w.key===j&&w.direction==="desc"?"asc":"desc"}))},F,$("span",null,J?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"),$(fu,{title:"进程资源占用",level:3,loading:n})),$("div",{className:"process-resource-actions"},$("span",{className:"data-chip"},"默认按内存排序"),$("span",{className:"data-chip"},`内存口径 ${c}`),$("span",{className:"data-chip"},`${bl(t.visible,_.length)} / ${bl(t.total,_.length)} 进程`),$(du,{title:"Process Resource Snapshot",data:{processSummary:t,processes:i},onOpen:u,testId:"raw-process-resources"}))),_.length===0?$(mu,{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=bl(F.readBytesPerSecond)+bl(F.writeBytesPerSecond),J=eG(F);return $("tr",{key:`${F.pid}-${F.startedAt}`,"data-testid":`process-row-${nf(F.pid)}`,"data-memory-bytes":String(J),"data-cpu-percent":String(bl(F.cpuPercent)),"data-disk-bps":String(j),"data-pid":String(bl(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-${nf(F.state||"unknown")}`},F.state||"?")),$("td",null,$(DG,{value:F.cpuPercent,label:_P(F.cpuPercent),tone:"cpu"})),$("td",null,$(DG,{value:F.memoryPercent,label:ci(F.memoryPercent),tone:"memory"})),$("td",null,$("div",{className:"process-io-cell"},$("strong",null,Qr(J)),$("span",null,`RSS ${Qr(F.rssBytes)}`))),$("td",null,$("div",{className:"process-io-cell"},$("strong",null,cj(j)),$("span",null,`R ${cj(F.readBytesPerSecond)} / W ${cj(F.writeBytesPerSecond)}`))),$("td",null,F.threads||0),$("td",null,it(bl(F.elapsedSeconds))))})))))}function $j({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,bl(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,J)=>`${(J*_).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,ci(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 yt(l){return Array.isArray(l)?l:[]}function DP(l){let u=yt(l?.core?.requests?.componentSummary);return[...yt(l?.frontend?.requests?.componentSummary),...u].sort((f,n)=>bl(n.requestCount)-bl(f.requestCount))}function SP(l){let u=yt(l?.core?.operations?.summary);return[...yt(l?.frontend?.operations?.summary),...u].sort((f,n)=>bl(n.count)-bl(f.count))}function VP(l){let u=yt(l?.core?.requests?.recentFailures).map((f)=>({source:"backend",...f}));return[...yt(l?.frontend?.requests?.recentFailures).map((f)=>({source:"frontend",...f})),...u].sort((f,n)=>(Sn(n.at)??0)-(Sn(f.at)??0)).slice(0,20)}function YP(l){let u=yt(l?.core?.operations?.recentSlowOperations);return[...yt(l?.frontend?.operations?.recentSlowOperations),...u].sort((f,n)=>bl(n.durationMs)-bl(f.durationMs)).slice(0,20)}function XP(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 bl(l?.process?.heapUsedBytes)}function PP({points:l}){let u=yt(l),r=u.map((j)=>bl(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,J)=>{let U=bl(j.mb);return`${(J*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?`${bl(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?tu(new Date(F.at)):"--"),$("span",null,"时间"),$("span",null,A?tu(new Date(A.at)):"--")),$("div",{className:"performance-axis-row"},$("span",null,`${n.toFixed(1)}`),$("span",null,"(MB)"),$("span",null,`${f.toFixed(1)}`)))}function CP({onRaw:l}){let[u,r]=kl({core:null,frontend:null}),[f,n]=kl([]),[t,i]=kl(""),[y,c]=kl(!1),[_,A]=kl(null),[F,j]=kl(!1);async function J(){c(!0),i("");try{let[D,P]=await Promise.all([El(`${gl.apiBaseUrl}/performance`,{cache:"no-store"}),El(`${gl.apiBaseUrl}/frontend-performance`,{cache:"no-store"})]);r({core:D,frontend:P});let E=XP(P);n((S)=>[...S,{at:new Date().toISOString(),mb:E/1048576}].slice(-80))}catch(D){i(zl(D,"性能指标加载失败"))}finally{c(!1)}}Dn(()=>{J();let D=setInterval(()=>void J(),5000);return()=>clearInterval(D)},[]);async function U(){j(!0),i(""),A(null);try{let D=await El(`${gl.apiBaseUrl}/code-queue-load-test`,{method:"POST",body:JSON.stringify({targetMs:1000,timeoutMs:90000,url:gl.frontendPublicUrl||window.location.origin})});A(D),J()}catch(D){i(zl(D,"Code Queue Playwright 测量失败"))}finally{j(!1)}}let w=DP(u),L=VP(u),N=SP(u),Q=YP(u),m=u.core?.process||{},q=u.frontend?.process||{},W=u.core?.database?.codeQueueStorage||{},p=bl(W.total),O=_?.result||{},z=bl(O.wallMs,NaN),B=bl(O.networkIdleMs,NaN),Y=O.withinTarget===!0,H=F?"running":_===null?"idle":_.measurementOk===!0?Y?"passed":"slow":"failed";return $("div",{className:"performance-page","data-testid":"performance-page"},$("div",{className:"performance-hero"},$("div",null,$("p",{className:"panel-eyebrow"},"Unified Performance"),$(fu,{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 J(),disabled:y,"data-testid":"performance-refresh-button"},y?"刷新中":"刷新"),$(du,{title:"Performance Snapshot",data:u,onOpen:l,testId:"raw-performance"}))),$(el,{error:t}),$("div",{className:"performance-top-grid"},$(PP,{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:bl(u.core?.requests?.sampleCount)+bl(u.frontend?.requests?.sampleCount),hint:"rolling window 3000"}))),$(uu,{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...":"手动触发测试"),_?$(du,{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)?Gf(z):"--",hint:_===null?"点击按钮启动远端 Playwright":`目标 ${Gf(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(B)?Gf(B):"--",hint:`DOMContentLoaded ${Gf(O.domContentLoadedMs)} / ${O.networkIdleReached===!1?"未在 5s 内空闲":"已空闲"}`,tone:Number.isFinite(B)&&B<=1000?"ok":"warn"}),$(Qu,{label:"组件耗时",value:Number.isFinite(bl(O.componentLoadMs,NaN))?Gf(O.componentLoadMs):"--",hint:`queue ${Gf(O.queueMs)} / detail ${Gf(O.detailMs)}`,tone:bl(O.componentLoadMs)>1000?"warn":"ok"}),$(Qu,{label:"Trace 规模",value:Number.isFinite(bl(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((D)=>$("th",{key:D},D)))),$("tbody",null,O.slowestApi.slice(0,5).map((D,P)=>$("tr",{key:`${D.url}-${P}`},$("td",null,$("code",null,D.url)),$("td",null,D.status),$("td",null,Gf(D.durationMs))))))):null),$("div",{className:"performance-grid"},$(uu,{title:"组件汇总",eyebrow:"Requests",loading:y},w.length===0?$(mu,{title:"暂无请求样本",text:"刷新几次或打开页面后会自动形成组件统计"}):$("div",{className:"table-wrap performance-table-wrap"},$("table",{className:"performance-table"},$("thead",null,$("tr",null,["组件","请求数","失败数","失败率","平均延迟","P95"].map((D)=>$("th",{key:D},D)))),$("tbody",null,w.map((D)=>$("tr",{key:D.component},$("td",null,$("code",null,D.component)),$("td",null,D.requestCount),$("td",null,D.failureCount),$("td",null,ci(bl(D.failureRate)*100)),$("td",null,Gf(D.averageLatencyMs)),$("td",null,Gf(D.p95LatencyMs)))))))),$(uu,{title:"最近失败请求",eyebrow:"Failures",loading:y},L.length===0?$("div",{className:"performance-empty-line"},"最近没有失败请求"):$("div",{className:"table-wrap performance-table-wrap compact"},$("table",{className:"performance-table"},$("thead",null,$("tr",null,["时间","来源","组件","状态","路径"].map((D)=>$("th",{key:D},D)))),$("tbody",null,L.map((D,P)=>$("tr",{key:`${D.at}-${P}`},$("td",null,Gl(D.at)),$("td",null,D.source),$("td",null,$("code",null,D.component)),$("td",null,$(Wu,{status:"failed"},D.status)),$("td",null,$("code",null,D.path)))))))),$(uu,{title:"内部操作汇总",eyebrow:"Operations",loading:y},N.length===0?$(mu,{title:"暂无内部操作样本",text:"API 查询和代理请求会自动记录内部操作耗时"}):$("div",{className:"table-wrap performance-table-wrap"},$("table",{className:"performance-table"},$("thead",null,$("tr",null,["服务","操作","次数","平均延迟","P95"].map((D)=>$("th",{key:D},D)))),$("tbody",null,N.map((D)=>$("tr",{key:`${D.service}-${D.operation}`},$("td",null,D.service),$("td",null,$("code",null,D.operation)),$("td",null,D.count),$("td",null,Gf(D.averageLatencyMs)),$("td",null,Gf(D.p95LatencyMs)))))))),$(uu,{title:"最近慢操作",eyebrow:"Slowest",loading:y},Q.length===0?$(mu,{title:"暂无慢操作",text:"后端会记录最近窗口内耗时最高的内部操作"}):$("div",{className:"table-wrap performance-table-wrap"},$("table",{className:"performance-table"},$("thead",null,$("tr",null,["时间","操作","耗时","结果","细节"].map((D)=>$("th",{key:D},D)))),$("tbody",null,Q.map((D,P)=>$("tr",{key:`${D.at}-${D.operation}-${P}`},$("td",null,Gl(D.at)),$("td",null,$("code",null,D.operation)),$("td",null,Gf(D.durationMs)),$("td",null,D.ok?"成功":"失败"),$("td",null,D.detail||"-")))))))))}function hP({provider:l,refresh:u,onRaw:r}){let[f,n]=kl(""),[t,i]=kl(null),[y,c]=kl("");async function _(A){n(A),c("");try{let F=await El(`${gl.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 $(uu,{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),$(Iy,{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,`指定版本 ${Nj(RG(l))}`),$("code",null,t.taskId||"--"),$(du,{title:"Provider Upgrade Dispatch",data:t,onOpen:r})):$("span",{className:"muted"},"升级任务结果会进入任务历史;执行升级可能导致 provider 短暂重连。")))}function lW({records:l,onRaw:u,compact:r=!1}){if(l.length===0)return $(mu,{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-${nf(f.id)}`},$("td",null,$(Wu,{status:f.status})),$("td",null,$("span",{className:`mode-chip ${G8(f)}`},G8(f)==="schedule"?"执行升级":"预检")),$("td",null,$("strong",null,"provider.upgrade"),$("code",null,f.id)),$("td",null,NP(f)),$("td",null,$(rW,{task:f})),$("td",null,JP(f)),$("td",null,$("span",{className:"version-chip"},gG(f))),$("td",null,$("span",{className:`upgrade-outcome ${String(f.status||"").toLowerCase()}`},kG(f))),$("td",null,Gl(f.updatedAt)),$("td",null,$(du,{title:`Provider Upgrade Task ${f.id}`,data:G$(f),onOpen:u})))))))}function sP({provider:l,tasks:u,onRaw:r,limit:f=5}){let n=IG(u,l.providerId).slice(0,f);return $(uu,{title:"远程更新记录",eyebrow:l.providerId,actions:$(Iy,{node:l}),className:"provider-upgrade-records-panel"},$("div",{"data-testid":`provider-upgrade-records-${nf(l.providerId)}`},$(lW,{records:n,onRaw:r,compact:!0})))}function MP({nodes:l,tasks:u,onRaw:r}){let f=L$(()=>l.map((t)=>{let i=IG(u,t.providerId);return{node:t,records:i,latest:UP(i),capabilities:xG(t)}}),[l,u]),n=f.reduce((t,i)=>t+i.records.length,0);return $("div",{className:"gateway-page","data-testid":"gateway-version-page"},$(uu,{title:"Provider Gateway 版本",eyebrow:`${l.length} Providers / ${n} 更新记录`},l.length===0?$(mu,{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,$(Iy,{node:t.node})),$("td",null,q$(t.node)),$("td",null,$(Jj,{node:t.node})),$("td",null,zG(t.node)?Gl(zG(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,`${G8(t.latest)==="schedule"?"执行升级":"预检"} / ${Gl(t.latest.updatedAt)}`),$("small",null,`Gateway ${gG(t.latest)}`),$("small",null,kG(t.latest))):$("span",{className:"muted"},"暂无记录")),$("td",null,$(du,{title:`Provider ${t.node.providerId}`,data:t.node,onOpen:r})))))))),$(uu,{title:"远程更新记录",eyebrow:"Structured provider.upgrade records"},l.length===0?$(mu,{title:"暂无记录",text:"没有 provider 节点时不会生成远程更新记录"}):$("div",{className:"gateway-record-grid"},f.map((t)=>$("article",{key:t.node.providerId,className:"gateway-record-card","data-testid":`gateway-records-${nf(t.node.providerId)}`},$("div",{className:"gateway-record-head"},$("div",null,$("strong",null,t.node.name),$("code",null,t.node.providerId)),$(Iy,{node:t.node})),$("div",{className:"gateway-record-meta"},$("span",null,`心跳 ${Gl(t.node.lastHeartbeat)}`),$("span",null,`策略 ${q$(t.node)}`),$("span",null,`${t.records.length} 条记录`)),$(lW,{records:t.records.slice(0,8),onRaw:r,compact:!0}))))))}function RP(l){if(l==="running")return"online";if(l==="paused"||l==="restarting")return"warn";if(l==="exited"||l==="dead")return"offline";return"internal"}function uW(l){return/^[a-f0-9]{48,64}$/i.test(l)}function w$(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 SG(l){let u=String(l?.name||""),r=String(l?.labels||"");if(w$(l))return 0;if(r.includes("com.docker.compose.project=unidesk"))return 1;if(!uW(u))return 2;return 3}function xP(l){return[...l].sort((u,r)=>{let f=SG(u)-SG(r);if(f!==0)return f;return String(u.name||"").localeCompare(String(r.name||""))})}function bP({nodes:l,dockerStatuses:u,onRaw:r}){let[f,n]=kl(""),t=L$(()=>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(Dn(()=>{if(!f&&t[0])n(t[0].providerId)},[t.length,f]),!i)return $(mu,{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||[],J=xP(y?.volumes||[]),U=c?J.find(w$):null,w=y?.networks||[],L=F.filter((Q)=>Q.state==="running"),N=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"},$(uu,{title:"Docker Desktop 视图",eyebrow:i.name,className:"docker-main-panel",actions:y?$(du,{title:`Docker ${i.providerId}`,data:y,onOpen:r}):null},!y?$(mu,{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??L.length} running / ${_.stopped??N.length} stopped`,tone:"ok"}),$(Qu,{label:"Images",value:_.images??j.length,hint:`${_.daemonImages??_.images??j.length} daemon images`}),$(Qu,{label:"Volumes",value:_.volumes??J.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?$(vP,{volume:U,volumeCount:J.length}):null,$("div",{className:"docker-section-head"},$("h3",null,"Containers"),$("span",null,`updated ${Gl(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:RP(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"},$(_j,{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||"--"))}),$(_j,{title:"Volumes",items:J,limit:J.length,render:(Q)=>$("article",{key:Q.name,className:`docker-side-row volume-row ${c&&w$(Q)?"database-volume":""}`,"data-testid":c&&w$(Q)?"database-volume-row":void 0},$("strong",null,Q.name),$("span",null,c&&w$(Q)?"PostgreSQL":uW(String(Q.name||""))?"anonymous":"named"),$("code",null,Q.mountpoint||Q.driver||Q.scope||"--"))}),$(_j,{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 vP({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 _j({title:l,items:u,render:r,limit:f}){let n=u.slice(0,f??12),t=Math.max(0,u.length-n.length);return $(uu,{title:l,eyebrow:`${u.length} items`,className:"docker-side-panel"},u.length===0?$(mu,{title:`暂无 ${l}`,text:"等待 Docker 状态采集"}):$("div",{className:"docker-side-list"},n.map(r),t>0?$("div",{className:"docker-side-more"},`+ ${t} more`):null))}function gP({microservices:l,onRaw:u,onNavigate:r}){let f=l.filter((n)=>ZG(n).public===!1);return $("div",{className:"microservice-page","data-testid":"microservice-catalog-page"},$(uu,{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 页面"}))),$(uu,{title:"服务映射",eyebrow:"Repo Reference + Runtime"},l.length===0?$(mu,{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=aG(n),i=QP(n),y=ZG(n),c=t.availability||{},_=c.status||(t.providerStatus==="online"?"unknown":"unhealthy");return $("tr",{key:n.id,"data-testid":`microservice-row-${nf(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"),$(_i,{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,$(du,{title:`用户服务 ${n.id}`,data:n,onOpen:u}))))}))))))}function kP({nodes:l,onDispatched:u,onRaw:r}){let f=l.filter((H)=>H.status==="online"),[n,t]=kl(f[0]?.providerId||l[0]?.providerId||""),[i,y]=kl("docker.ps"),[c,_]=kl("frontend"),[A,F]=kl("operator-check"),[j,J]=kl("normal"),[U,w]=kl(!1),[L,N]=kl(""),[Q,m]=kl(!1),[q,W]=kl(null),[p,O]=kl("");Dn(()=>{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 B(){N(JSON.stringify(z(),null,2)),w(!0)}async function Y(H){H.preventDefault(),m(!0),O("");try{let D=U?JSON.parse(L||"{}"):z(),P=await El(`${gl.apiBaseUrl}/dispatch`,{method:"POST",body:JSON.stringify({providerId:n,command:i,payload:D})});W(P),await u()}catch(D){O(zl(D,"下发失败"))}finally{m(!1)}}return $("div",{className:"page-grid dispatch-grid"},$(uu,{title:"下发任务",eyebrow:"Real WebSocket Dispatch"},$("form",{className:"dispatch-form",onSubmit:Y},$("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)=>J(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:B},"查看原始JSON"),$("button",{type:"submit",disabled:Q||!n},Q?"下发中":"下发任务")),U?$("label",{className:"raw-editor-label"},"高级 Payload",$("textarea",{className:"raw-editor",value:L,onChange:(H)=>N(H.target.value)})):null,$(el,{error:p,wide:!0}))),$(uu,{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))),$(du,{title:"Dispatch Response",data:q,onOpen:r})):$(mu,{title:"等待操作",text:"任务响应会以结构化结果卡展示"})))}function VG({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,ay(l)?`已等待 ${Fj(l.updatedAt)}`:`耗时 ${it(hG(l)??0)}`),$(du,{title:`Task ${l.id}`,data:G$(l),onOpen:u}))}function rW({task:l}){let u=hG(l),r=ay(l);return $("div",{className:"task-duration"},$("strong",null,u===null?"--":it(u)),$("span",null,r?`已运行 / 创建 ${Gl(l.createdAt)}`:`创建 ${Gl(l.createdAt)}`))}function IP({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=sG(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(ay(l))return $("div",{className:"task-diagnostic warn"},$("b",null,"等待终态"),$("span",null,`最后更新 ${Fj(l.updatedAt)} 前`));return $("div",{className:"task-diagnostic ok"},$("b",null,"完成摘要"),$(_i,{data:r,empty:"无执行输出"}))}function aP({tasks:l,onRaw:u}){let r=l.filter(ay);return $("div",{"data-testid":"pending-task-page"},$(uu,{title:"待处理任务",eyebrow:`${r.length} Pending`},r.length===0?$(mu,{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,Fj(f.updatedAt)),$("td",null,$(_i,{data:f.payload})),$("td",null,$(du,{title:`Pending Task ${f.id}`,data:G$(f),onOpen:u})))))))))}function oP({tasks:l,onRaw:u}){return $("div",{"data-testid":"task-history-page"},$(uu,{title:"任务历史",eyebrow:`${l.length} Tasks`},l.length===0?$(mu,{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-${nf(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,$(rW,{task:r})),$("td",null,$(_i,{data:r.payload})),$("td",null,$(IP,{task:r})),$("td",null,Gl(r.updatedAt)),$("td",null,$(du,{title:`Task ${r.id}`,data:G$(r),onOpen:u})))))))))}function dP({tasks:l,onRaw:u}){let r=l.filter((f)=>["succeeded","failed"].includes(f.status));return $(uu,{title:"执行结果",eyebrow:"Finished Tasks"},r.length===0?$(mu,{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),$(_i,{data:f.result,empty:"无执行输出"}),$(du,{title:`Task Result ${f.id}`,data:G$(f),onOpen:u})))))}function eP(l){if(!l||typeof l!=="object")return"--";if(l.type==="interval")return`每 ${it(Number(l.everySeconds||0))}`;return`每天 ${l.timeOfDay||"03:00"} UTC`}function lC(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 uC(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 rC(l){let u=Number(l?.durationMs);if(Number.isFinite(u)&&u>=0)return it(u/1000);let r=Sn(l?.startedAt||l?.createdAt);if(r===null)return"--";let n=Sn(l?.finishedAt)??Date.now();return it(Math.max(0,(n-r)/1000))}function YG(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 fC({schedules:l,scheduleRuns:u,nodes:r,refresh:f,onRaw:n}){let[t,i]=kl(YG(r||[])),[y,c]=kl(!1),[_,A]=kl(""),[F,j]=kl(""),J=[...u||[]].sort((q,W)=>(Sn(W.updatedAt)??0)-(Sn(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 L(){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 N(q){q.preventDefault(),c(!0),A(""),j("");try{let W=L(),p=encodeURIComponent(String(W.id));await El(`${gl.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 El(`${gl.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 El(`${gl.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"},$(uu,{title:"定时任务",eyebrow:`${(l||[]).length} Schedules`},(l||[]).length===0?$(mu,{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-${nf(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,eP(q.schedule)),$("dt",null,"动作"),$("dd",null,lC(q.action)),$("dt",null,"下次执行"),$("dd",null,Gl(q.nextRunAt)),$("dt",null,"最近执行"),$("dd",null,q.lastRunAt?`${Gl(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-${nf(q.id)}`},"手动触发"),$("button",{type:"button",className:"ghost-btn danger",disabled:y,onClick:()=>Q(q)},"删除"),$(du,{title:`Schedule ${q.id}`,data:q,onOpen:n})))))),$(uu,{title:t.id?"配置定时任务":"新建定时任务",eyebrow:"CRUD"},$("form",{className:"dispatch-form schedule-form",onSubmit:N},$("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(YG(r||[]))},"重置"),$("button",{type:"submit",disabled:y||!t.id},y?"保存中":"保存任务")),F?$("p",{className:"muted paragraph"},F):null,$(el,{error:_,wide:!0}))),$(uu,{title:"历史执行记录",eyebrow:`${J.length} Runs`},J.length===0?$(mu,{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,J.map((q)=>$("tr",{key:q.id,"data-testid":`schedule-run-row-${nf(q.id)}`},$("td",null,$(Wu,{status:uC(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,rC(q)),$("td",null,$(_i,{data:q.result||q.error,empty:"无结果"})),$("td",null,Gl(q.updatedAt)),$("td",null,$(du,{title:`Schedule Run ${q.id}`,data:q,onOpen:n})))))))))}function nC({data:l}){let u=l.overview||{};return $("div",{className:"page-grid topology-grid"},$(uu,{title:"公开入口",eyebrow:"Public"},$("div",{className:"endpoint-list"},$("article",null,$("b",null,"Frontend"),$("span",null,gl.frontendPublicUrl||window.location.origin),$(Wu,{status:"online"},"public")),$("article",null,$("b",null,"Provider Ingress"),$("span",null,gl.providerIngressPublicUrl||"ws://public/ws/provider"),$(Wu,{status:"online"},"public")))),$(uu,{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")))),$(uu,{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 tC({session:l}){return $(uu,{title:"认证策略",eyebrow:"Frontend Login"},$("div",{className:"policy-grid"},$("article",null,$("span",null,"默认账号"),$("strong",null,gl.authUsername||"admin")),$("article",null,$("span",null,"当前会话"),$("strong",null,l?.user?.username||"--")),$("article",null,$("span",null,"Session TTL"),$("strong",null,`${gl.sessionTtlSeconds||0}s`)),$("article",null,$("span",null,"API 访问"),$("strong",null,"同源 Cookie 保护"))),$("p",{className:"muted paragraph"},"浏览器只访问 frontend 同源接口;frontend 容器使用 Docker 内网代理 backend-core API。"))}function iC(){return $(uu,{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 yC({activeModule:l,activeTab:u,data:r,session:f,refresh:n,onRaw:t,onNavigate:i}){if(l==="ops"&&u==="status")return $(TP,{data:r,onRaw:t,onNavigate:i});if(l==="ops"&&u==="performance")return $(CP,{onRaw:t});if(l==="ops"&&u==="events")return $(EP,{events:r.events,onRaw:t});if(l==="ops"&&u==="logs")return $(pP,{logs:r.logs,onRaw:t});if(l==="nodes"&&u==="list")return $(zP,{nodes:r.nodes,onRaw:t});if(l==="nodes"&&u==="monitor")return $(HP,{nodes:r.nodes,systemStatuses:r.systemStatuses,tasks:r.tasks,onRaw:t,refresh:n});if(l==="nodes"&&u==="docker")return $(bP,{nodes:r.nodes,dockerStatuses:r.dockerStatuses,onRaw:t});if(l==="nodes"&&u==="gateway")return $(MP,{nodes:r.nodes,tasks:r.tasks,onRaw:t});if(l==="nodes"&&u==="labels")return $(OP,{nodes:r.nodes});if(l==="nodes"&&u==="heartbeats")return $(ZP,{nodes:r.nodes});if(l==="tasks"&&u==="dispatch")return $(kP,{nodes:r.nodes,onDispatched:n,onRaw:t});if(l==="tasks"&&u==="scheduled")return $(fC,{schedules:r.schedules,scheduleRuns:r.scheduleRuns,nodes:r.nodes,refresh:n,onRaw:t});if(l==="tasks"&&u==="pending")return $(aP,{tasks:r.pendingTasks,onRaw:t});if(l==="tasks"&&u==="history")return $(oP,{tasks:r.tasks,onRaw:t});if(l==="tasks"&&u==="results")return $(dP,{tasks:r.tasks,onRaw:t});if(l==="apps"&&u==="catalog")return $(gP,{microservices:r.microservices,onRaw:t,onNavigate:i});if(l==="apps"&&u==="todo-note")return $(QG,{microservices:r.microservices,onRaw:t,apiBaseUrl:gl.apiBaseUrl});if(l==="apps"&&u==="findjob")return $(im,{microservices:r.microservices,onRaw:t,apiBaseUrl:gl.apiBaseUrl});if(l==="apps"&&u==="pipeline")return $($G,{microservices:r.microservices,onRaw:t,apiBaseUrl:gl.apiBaseUrl});if(l==="apps"&&u==="met-nonlinear")return $(Am,{microservices:r.microservices,onRaw:t,apiBaseUrl:gl.apiBaseUrl});if(l==="apps"&&u==="claudeqq")return $(zU,{microservices:r.microservices,onRaw:t,apiBaseUrl:gl.apiBaseUrl});if(l==="apps"&&u==="baidu-netdisk")return $(KU,{microservices:r.microservices,onRaw:t,apiBaseUrl:gl.apiBaseUrl});if(l==="apps"&&u==="filebrowser")return $(tm,{microservices:r.microservices,onRaw:t,apiBaseUrl:gl.apiBaseUrl});if(l==="apps"&&u==="oa-event-flow")return $(Gm,{microservices:r.microservices,onRaw:t,apiBaseUrl:gl.apiBaseUrl});if(l==="apps"&&u==="k3sctl")return $(WG,{microservices:r.microservices,onRaw:t,apiBaseUrl:gl.apiBaseUrl,onNavigate:i});if(l==="apps"&&u==="code-queue")return $(bQ,{microservices:r.microservices,onRaw:t,apiBaseUrl:gl.apiBaseUrl,initialTasksData:tP});if(l==="apps"&&u==="mdtodo")return $(Jm,{microservices:r.microservices,onRaw:t,apiBaseUrl:gl.apiBaseUrl});if(l==="apps"&&u==="decision-center")return $(eQ,{microservices:r.microservices,onRaw:t,apiBaseUrl:gl.apiBaseUrl});if(l==="apps"&&u==="project-manager")return $(FG,{microservices:r.microservices,onRaw:t,apiBaseUrl:gl.apiBaseUrl});if(l==="config"&&u==="topology")return $(nC,{data:r});if(l==="config"&&u==="auth")return $(tC,{session:f});if(l==="config"&&u==="security")return $(iC);return $(mu,{title:"未找到页面",text:"请选择左侧主模块和顶部子功能标签"})}function cC({session:l,onLogout:u}){let r=w5(Cf,window.location.pathname),[f,n]=kl(r.moduleId),[t,i]=kl({...E1,[r.moduleId]:r.tabId}),[y,c]=kl({overview:null,nodes:[],systemStatuses:[],dockerStatuses:[],microservices:[],events:[],tasks:[],pendingTasks:[],schedules:[],scheduleRuns:[],logs:[]}),[_,A]=kl({ok:!1,text:"连接中"}),[F,j]=kl(null),[J,U]=kl(new Date),[w,L]=kl(null),[N,Q]=kl(!1),[m,q]=kl(!1),W=$i.default.useRef(!1),p=Cf.moduleById[f]||Cf.modules[0],O=t[f]||E1[f]||p.tabs[0].id,z=Array.isArray(y.microservices)?y.microservices:[],B=z.length===0&&f==="apps"&&O==="code-queue"?[iP]:z,Y=B===z?y:{...y,microservices:B},H=f==="apps"?B.find((d)=>String(d?.id||"")===(O==="k3sctl"?"k3sctl-adapter":O)):null,D=H?aG(H):{},P=p.tabs.find((d)=>d.id===O)?.label||O,E=H?[{key:"microservice",label:"用户服务",value:`${P} ${D.providerStatus==="online"?"在线":D.providerStatus||"未知"}`,tone:D.providerStatus==="online"?"ok":"warn",testId:"active-microservice-status"}]:[];async function S(){if(W.current)return;W.current=!0,q(!0);try{let d=[],h=(Ql,pl)=>{d.push([Ql,El(pl)])},rl=f==="ops"&&O==="status",_l=rl||f==="config"&&O==="topology",Al=rl||f==="nodes"||f==="tasks"&&(O==="dispatch"||O==="scheduled"),Ll=f==="apps"&&O!=="code-queue";if(_l)h("overview",`${gl.apiBaseUrl}/overview`);if(Al)h("nodes",`${gl.apiBaseUrl}/nodes`);if(f==="nodes"&&O==="monitor")h("systemStatuses",`${gl.apiBaseUrl}/nodes/system-status?limit=60`),h("tasks",`${gl.apiBaseUrl}/tasks?limit=120&summary=1`);else if(f==="nodes"&&O==="docker")h("dockerStatuses",`${gl.apiBaseUrl}/nodes/docker-status`);else if(f==="nodes"&&O==="gateway")h("tasks",`${gl.apiBaseUrl}/tasks?limit=300&summary=1`);else if(f==="tasks"&&O==="scheduled")h("schedules",`${gl.apiBaseUrl}/schedules?limit=100`),h("scheduleRuns",`${gl.apiBaseUrl}/schedules/runs?limit=100`);else if(f==="tasks"&&O==="pending")h("pendingTasks",`${gl.apiBaseUrl}/tasks?status=pending&limit=100&summary=1`);else if(f==="tasks"&&(O==="history"||O==="results"))h("tasks",`${gl.apiBaseUrl}/tasks?limit=300&summary=1`);else if(rl)h("tasks",`${gl.apiBaseUrl}/tasks?limit=8&lite=1`),h("pendingTasks",`${gl.apiBaseUrl}/tasks?status=pending&limit=20&lite=1`);if(Ll)h("microservices",`${gl.apiBaseUrl}/microservices`);if(f==="ops"&&O==="events")h("events",`${gl.apiBaseUrl}/events?limit=100`);if(f==="ops"&&O==="logs")h("logs","/logs?limit=100");await Promise.all(d.map(async([Ql,pl])=>{let s=await pl,e={};if(Ql==="overview")e.overview=s;if(Ql==="nodes")e.nodes=s.nodes||[];if(Ql==="systemStatuses")e.systemStatuses=s.systemStatuses||[];if(Ql==="dockerStatuses")e.dockerStatuses=s.dockerStatuses||[];if(Ql==="microservices")e.microservices=s.microservices||[];if(Ql==="events")e.events=s.events||[];if(Ql==="tasks")e.tasks=s.tasks||[];if(Ql==="pendingTasks")e.pendingTasks=s.tasks||[];if(Ql==="schedules")e.schedules=s.schedules||[];if(Ql==="scheduleRuns")e.scheduleRuns=s.runs||[];if(Ql==="logs")e.logs=s.logs||[];c((fl)=>({...fl,...e}))})),A({ok:!0,text:"核心在线"}),j(new Date)}catch(d){if(A({ok:!1,text:zl(d,"连接失败")}),d.status===401)u(!1)}finally{W.current=!1,q(!1)}}Dn(()=>{let d=()=>{if(!pG())return;S()};d();let h=setInterval(d,cP(f,O)),rl=()=>{if(pG())d()};return document.addEventListener("visibilitychange",rl),()=>{clearInterval(h),document.removeEventListener("visibilitychange",rl)}},[f,O]),Dn(()=>{let d=setInterval(()=>U(new Date),1000);return()=>clearInterval(d)},[]),Dn(()=>{let d=wm(Cf,window.location.pathname);if(d&&window.location.pathname!==d)window.history.replaceState(null,"",d)},[]),Dn(()=>{let d=()=>{let h=w5(Cf,window.location.pathname);n(h.moduleId),i((rl)=>({...rl,[h.moduleId]:h.tabId})),L(null)};return window.addEventListener("popstate",d),()=>window.removeEventListener("popstate",d)},[]),Dn(()=>{window.scrollTo({top:0,left:0,behavior:"auto"})},[f,O]);function V(d,h,rl="push"){let _l=Cf.moduleById[d]?d:Cf.fallbackTarget.moduleId,Al=Cf.moduleById[_l]?.tabs.some((Ql)=>Ql.id===h)?h:E1[_l]||Cf.moduleById[_l]?.tabs[0]?.id||Cf.fallbackTarget.tabId;n(_l),i((Ql)=>({...Ql,[_l]:Al}));let Ll=k3(Cf,_l,Al);if(window.location.pathname!==Ll){let Ql=rl==="replace"?"replaceState":"pushState";window.history[Ql](null,"",Ll)}}function v(d,h){L({title:d,data:h})}let[K,X]=kl(!1),{unreadCount:I,notifications:a}=Xr(),R=a.length>0?a[a.length-1]:null,nl=CG(EG);return $("div",{className:`shell ${N?"rail-collapsed":""} ${nl?"dev-shell":""}`,"data-testid":"app-shell"},$(GP,{activeModule:f,activeTabs:t,onNavigate:V,collapsed:N,onToggle:()=>Q((d)=>!d)}),$("main",{className:"workspace"},$(qP,{connection:_,lastRefresh:F,onRefresh:S,onLogout:()=>u(!0),session:l,clock:J,activeStatusItems:E,onNotificationToggle:()=>X((d)=>!d),unreadCount:I,environment:EG}),$(WP,{module:p,activeTab:O,onNavigate:V}),$(Aj.Provider,{value:m},$(yC,{activeModule:f,activeTab:O,data:Y,session:l,refresh:S,onRaw:v,onNavigate:V}))),$(mP,{raw:w,onClose:()=>L(null)}),R&&$(KG,{key:R.id,notification:R}),K&&$(TG,{onClose:()=>X(!1)}))}function $C(){let[l,u]=kl(!0),[r,f]=kl(null);async function n(){u(!0);try{let i=await El("/api/session");f(i.authenticated?i:null)}catch{f(null)}finally{u(!1)}}async function t(i){if(i)try{await El("/logout",{method:"POST"})}catch{}f(null)}if(Dn(()=>{n()},[]),l)return $("main",{className:"loading-screen"},$("div",{className:"brand-mark"},"UD"),$("span",null,"加载会话"));if(!r)return $(wP,{onLogin:f});return $(TU,null,$(cC,{session:r,onLogout:t}))}var fW=document.getElementById("root");if(fW===null)throw Error("root element not found");XG.createRoot(fW).render($($C));})(); diff --git a/src/components/frontend/public/style.css b/src/components/frontend/public/style.css index 3a6358db..fbf916ae 100644 --- a/src/components/frontend/public/style.css +++ b/src/components/frontend/public/style.css @@ -2983,6 +2983,22 @@ input:focus, select:focus, textarea:focus { border-color: var(--accent-2); } background: rgba(78, 183, 168, 0.08); letter-spacing: 0.04em; } +.codex-task-step-count.syncing, +.codex-task-step-count.unavailable { + border-color: rgba(215, 161, 58, 0.38); + color: #f0cf8a; + background: rgba(215, 161, 58, 0.08); +} +.codex-task-step-count.failed { + border-color: rgba(207, 106, 84, 0.52); + color: var(--danger); + background: rgba(207, 106, 84, 0.08); +} +.codex-task-step-count.fallback { + border-color: rgba(148, 190, 255, 0.40); + color: #b9d0ff; + background: rgba(148, 190, 255, 0.08); +} .codex-output-panel .panel-body { padding: 0; } diff --git a/src/components/frontend/src/code-queue.tsx b/src/components/frontend/src/code-queue.tsx index a9956b9e..18205521 100644 --- a/src/components/frontend/src/code-queue.tsx +++ b/src/components/frontend/src/code-queue.tsx @@ -681,6 +681,82 @@ function canonicalTaskStepCount(task: any): number | null { return null; } +function rawTraceStepCountFallback(...values: any[]): number | null { + for (const value of values) { + const count = statCount(value); + if (count !== null) return count; + } + return null; +} + +function traceStepCountLabel(state: AnyRecord): string { + if (state.state === "ready" || state.state === "fallback") return `STEP ${state.count}${state.state === "fallback" ? " raw" : ""}`; + if (state.state === "syncing") return "STEP sync"; + if (state.state === "failed") return "STEP failed"; + return "STEP N/A"; +} + +function traceStepCountState(task: any): AnyRecord { + const oaStats = taskOaTraceStats(task); + const oaCount = statCount(oaStats?.stepCount ?? oaStats?.llmStepCount); + if (oaCount !== null) { + return { + state: "ready", + count: oaCount, + label: `STEP ${oaCount}`, + title: "STEP 来自 OA Event Flow 统计中心", + source: "oa-event-flow", + }; + } + const summary = taskTraceSummary(task); + const activeWithoutRawRows = taskIsActive(task) + && task?._traceSummaryLoaded !== true + && statCount(task?.outputCount ?? task?.retainedOutputCount) === 0; + const rawCount = rawTraceStepCountFallback( + summary?.retainedStepCount, + summary?.execution?.traceLineCount, + summary?.execution?.stepCount, + task?.outputCount, + task?.retainedOutputCount, + activeWithoutRawRows ? null : task?.stepCount, + activeWithoutRawRows ? null : task?.llmStepCount, + ); + if (rawCount !== null) { + return { + state: "fallback", + count: rawCount, + label: `STEP ${rawCount} raw`, + title: "OA STEP 统计不可用,当前显示 raw trace fallback 行数", + source: "raw-trace", + }; + } + if (summary?.traceStatsError || task?.traceStatsError) { + return { + state: "failed", + count: null, + label: "STEP failed", + title: "STEP 统计读取失败;请查看 trace summary 原始 JSON", + source: "stats-error", + }; + } + if (taskIsActive(task) || task?._traceSummaryLoaded !== true) { + 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 traceSummaryStepCount(summary: AnyRecord | null): number | null { const stats = objectRecord(summary?.traceStats); if (!stats || (summary?.statsSource !== "oa-event-flow" && stats.source !== "oa-event-flow")) return null; @@ -764,12 +840,12 @@ function JudgeFailureDetails({ judge, testId = "codex-judge-failure-details" }: function taskProgressiveAttempts(task: any): any[] { const summaryAttempts = taskTraceSummary(task)?.attempts; - if (Array.isArray(summaryAttempts) && summaryAttempts.length > 0) return summaryAttempts; + if (Array.isArray(summaryAttempts) && summaryAttempts.length > 0) return currentFirstAttempts(task, withCurrentAttemptSegment(task, summaryAttempts)); const execution = taskExecutionSummary(task); const finalResponse = taskFinalResponseText(task); const judge = taskLastJudge(task); - if (Object.keys(execution).length === 0 && finalResponse.length === 0 && judge === null) return []; - return [{ + if (Object.keys(execution).length === 0 && finalResponse.length === 0 && judge === null) return currentFirstAttempts(task, withCurrentAttemptSegment(task, [])); + return currentFirstAttempts(task, withCurrentAttemptSegment(task, [{ index: Number(task?.currentAttempt || 1), mode: task?.currentMode || "initial", startedAt: task?.startedAt, @@ -779,7 +855,56 @@ function taskProgressiveAttempts(task: any): any[] { finalResponse, finalResponseChars: finalResponse.length, judge, - }]; + }])); +} + +function attemptIsCurrent(task: any, attemptIndex: any): boolean { + const summary = taskTraceSummary(task); + const currentAttempt = Number(summary?.currentAttempt || task?.currentAttempt || 0); + const numericAttempt = Number(attemptIndex); + return Number.isFinite(currentAttempt) && currentAttempt > 0 && Number.isFinite(numericAttempt) && numericAttempt === currentAttempt; +} + +function attemptIsActiveCurrent(task: any, attemptIndex: any): boolean { + return taskIsActive(task) && attemptIsCurrent(task, attemptIndex); +} + +function withCurrentAttemptSegment(task: any, attempts: any[]): any[] { + const rows = Array.isArray(attempts) ? attempts.filter(Boolean) : []; + const summary = taskTraceSummary(task); + const currentAttempt = Number(summary?.currentAttempt || task?.currentAttempt || 0); + if (!taskIsActive(task) || !Number.isFinite(currentAttempt) || currentAttempt <= 0) return rows; + if (rows.some((attempt) => Number(attempt?.index) === currentAttempt)) return rows; + const activeAt = latestTimestampValue(task?.startedAt, summary?.startedAt, task?.updatedAt, summary?.updatedAt); + return [ + ...rows, + { + index: currentAttempt, + mode: task?.currentMode || summary?.currentMode || (currentAttempt <= 1 ? "initial" : "retry"), + startedAt: activeAt || task?.startedAt || summary?.startedAt, + finishedAt: null, + terminalStatus: null, + execution: {}, + finalResponse: "", + finalResponsePreview: "", + finalResponseChars: 0, + judge: null, + currentPlaceholder: true, + }, + ]; +} + +function currentFirstAttempts(task: any, attempts: any[]): any[] { + const rows = [...(Array.isArray(attempts) ? attempts : [])]; + if (!taskIsActive(task)) return rows; + return rows.sort((left, right) => { + const leftIndex = Number(left?.index); + const rightIndex = Number(right?.index); + const leftCurrent = attemptIsCurrent(task, leftIndex) ? 0 : 1; + const rightCurrent = attemptIsCurrent(task, rightIndex) ? 0 : 1; + if (leftCurrent !== rightCurrent) return leftCurrent - rightCurrent; + return leftIndex - rightIndex; + }); } function attemptExecutionSummary(task: any, attempt: any): AnyRecord { @@ -807,11 +932,13 @@ function attemptExecutionUpdatedAt(task: any, attempt: any, attemptIndex: any, e function attemptFinalResponseText(task: any, attempt: any): string { const text = String(attempt?.finalResponse || attempt?.finalResponsePreview || ""); + if (attemptIsActiveCurrent(task, attempt?.index)) return ""; if (Object.prototype.hasOwnProperty.call(attempt || {}, "finalResponse") || Object.prototype.hasOwnProperty.call(attempt || {}, "finalResponsePreview")) return text.trimEnd(); return text.length > 0 ? text.trimEnd() : taskFinalResponseText(task); } -function attemptJudge(task: any, attempt: any): AnyRecord | null { +function attemptJudge(task: any, attempt: any, attemptIndex: any = attempt?.index): AnyRecord | null { + if (attemptIsActiveCurrent(task, attemptIndex)) return null; if (Object.prototype.hasOwnProperty.call(attempt || {}, "judge")) return objectRecord(attempt?.judge); return taskLastJudge(task); } @@ -821,12 +948,9 @@ function attemptExecutionIsRunning(task: any, attempt: any, attemptIndex: any): if (isSyntheticAttemptSegment(attempt, attemptIndex)) return false; if (attempt?.finishedAt) return false; if (["succeeded", "failed", "canceled"].includes(String(attempt?.terminalStatus || ""))) return false; - const summary = taskTraceSummary(task); - const currentAttempt = Number(summary?.currentAttempt || task?.currentAttempt || 0); - const numericAttempt = Number(attemptIndex); - if (Number.isFinite(numericAttempt) && numericAttempt > 0 && Number.isFinite(currentAttempt) && currentAttempt > 0) { - return numericAttempt === currentAttempt; - } + if (attemptIsCurrent(task, attemptIndex)) return true; + const currentAttempt = Number(taskTraceSummary(task)?.currentAttempt || task?.currentAttempt || 0); + if (Number.isFinite(currentAttempt) && currentAttempt > 0) return false; return true; } @@ -850,7 +974,7 @@ function attemptFeedbackPrompt(task: any, attempt: any, attemptIndex: any): AnyR truncated: Boolean(attempt?.feedbackPromptTruncated), }; } - const judge = attemptJudge(task, attempt); + const judge = attemptJudge(task, attempt, attemptIndex); const continuePrompt = String(judge?.continuePrompt || "").trimEnd(); if (judge?.decision === "retry" && continuePrompt.length > 0) { return { @@ -1485,9 +1609,8 @@ function TaskCard({ task, selected, onSelect, onCopy, onReference, onMarkRead, c const unread = taskIsUnreadTerminal(task); const updatedAt = latestTimestampValue(task?.updatedAt, taskTraceSummary(task)?.updatedAt); const recentUpdateLabel = `最近更新: ${fmtRelativeAge(updatedAt)}`; - const stepCount = taskStepCount(task); - const stepLabel = stepCount === null ? "--" : String(stepCount); - const stepTitle = stepCount === null ? "STEP 统计中心同步中" : "STEP 来自 OA Event Flow 统计中心"; + const stepState = traceStepCountState(task); + const stepTitle = stepState.title; return h("article", { role: "button", tabIndex: 0, @@ -1551,7 +1674,7 @@ function TaskCard({ task, selected, onSelect, onCopy, onReference, onMarkRead, c h("span", null, taskDurationLabel(task)), ), h("div", { className: "codex-task-meta codex-task-update-meta" }, - h("span", { className: "codex-task-recent-update codex-task-step-count", title: stepTitle, "data-testid": `codex-task-step-count-${taskId || "unknown"}` }, `STEP ${stepLabel}`), + h("span", { className: `codex-task-recent-update codex-task-step-count ${stepState.state}`, title: stepTitle, "data-testid": `codex-task-step-count-${taskId || "unknown"}`, "data-step-state": stepState.state, "data-step-source": stepState.source }, traceStepCountLabel(stepState)), h("span", { className: "codex-task-recent-update", title: updatedAt ? `更新时间: ${fmtDate(updatedAt)}` : recentUpdateLabel, "data-testid": `codex-task-recent-update-${taskId || "unknown"}` }, recentUpdateLabel), h("span", null, fmtDate(updatedAt || task?.updatedAt)), ), @@ -1871,13 +1994,30 @@ function ProgressiveExecutionSummary({ task, attempt, attemptIndex, loading, onL const stepDetails = taskTraceStepDetails(task); const stepsLoaded = taskTraceStepsLoaded(task, attemptIndex); const errorCount = statCount(stats?.errorCount); - const toolCount = statCount(stats?.stepCount ?? stats?.llmStepCount); + const fallbackStepCount = rawTraceStepCountFallback( + steps.length > 0 ? steps.length : null, + attempt?.stepCount, + attempt?.execution?.stepCount, + execution.traceLineCount, + execution.stepCount, + attempt?.outputCount, + ); + const statsStepCount = statCount(stats?.stepCount ?? stats?.llmStepCount); + const toolCount = statsStepCount ?? fallbackStepCount; const readCount = statCount(stats?.readCount); const editCount = statCount(stats?.editCount); const runCount = statCount(stats?.runCount); - const stepCount = statCount(stats?.stepCount ?? stats?.llmStepCount); - const toolsLabel = toolCount === null ? "--" : String(toolCount); - const stepLabel = stepCount === null ? "--" : String(stepCount); + const stepCount = statsStepCount ?? fallbackStepCount; + const countSource = statsStepCount !== null ? "oa-event-flow" : fallbackStepCount !== null ? "raw-trace" : taskIsActive(task) ? "syncing" : "unavailable"; + const toolsLabel = toolCount === null ? (countSource === "syncing" ? "sync" : "N/A") : String(toolCount); + const stepLabel = stepCount === null ? (countSource === "syncing" ? "sync" : "N/A") : `${stepCount}${countSource === "raw-trace" ? " raw" : ""}`; + const stepTitle = countSource === "oa-event-flow" + ? "STEP 来自 OA Event Flow 统计中心" + : countSource === "raw-trace" + ? "OA STEP 统计不可用,当前显示 raw trace fallback 行数" + : countSource === "syncing" + ? "STEP 统计同步中;展开后会按需读取当前 attempt trace" + : "当前 attempt 没有可用 STEP 统计"; const editedFiles = Array.isArray(execution.editedFiles) ? execution.editedFiles : []; const commands = Array.isArray(execution.commands) ? execution.commands : []; const synthetic = isSyntheticAttemptSegment(attempt, attemptIndex); @@ -1899,14 +2039,14 @@ function ProgressiveExecutionSummary({ task, attempt, attemptIndex, loading, onL h("span", { className: "codex-output-channel" }, "Summary"), h("strong", null, `执行过程摘要${labelSuffix}`), running ? h("span", { className: "codex-summary-running-pill", "data-testid": `${testId}-running` }, "执行中") : null, - h("code", { title: updatedAt ? `最近更新: ${fmtDate(updatedAt)}` : recentUpdateLabel }, + h("code", { title: `${updatedAt ? `最近更新: ${fmtDate(updatedAt)}` : recentUpdateLabel};${stepTitle}` }, `${fmtDuration(execution.durationMs ?? execution.totalElapsedMs)} / ${toolsLabel} tools / ${recentUpdateLabel}`), ), h("div", { className: "codex-execution-digest" }, h("span", { title: "来自 OA Event Flow 统计中心" }, `read ${readCount === null ? "--" : readCount}`), h("span", { title: "来自 OA Event Flow 统计中心" }, `edit ${editCount === null ? "--" : editCount}`), h("span", { title: "来自 OA Event Flow 统计中心" }, `run ${runCount === null ? "--" : runCount}`), - h("span", { title: "来自 OA Event Flow 统计中心" }, `STEP ${stepLabel}`), + h("span", { title: stepTitle, "data-testid": `${testId}-step-count`, "data-step-state": countSource }, `STEP ${stepLabel}`), errorCount !== null && errorCount > 0 ? h("span", { className: "codex-execution-error-pill", "data-testid": `${testId}-error-count` }, `Error ${errorCount}`) : null, ), ), @@ -1982,7 +2122,7 @@ function ProgressiveFinalResponse({ task, attempt, attemptIndex, testId = "codex } function ProgressiveJudge({ task, attempt, attemptIndex, testId = "codex-progressive-judge" }: AnyRecord) { - const judge = attemptJudge(task, attempt); + const judge = attemptJudge(task, attempt, attemptIndex); if (!judge?.decision) return null; const labelSuffix = attemptIndex ? ` #${attemptIndex}` : ""; return h("section", { className: "codex-progressive-card codex-progressive-judge", "data-testid": testId, "data-attempt-index": attemptDataIndex(attemptIndex) }, @@ -2036,7 +2176,8 @@ function ProgressiveJudgeFeedbackPrompt({ task, attempt, attemptIndex, loading, function ProgressiveAttemptCycle({ task, attempt, position, loading, onLoadPromptPart, onLoadSteps, onLoadStep }: AnyRecord) { const attemptIndex = attemptSegmentIndex(attempt, position); - const first = position === 0; + const current = attemptIsActiveCurrent(task, attemptIndex); + const first = position === 0 && !current; const synthetic = isSyntheticAttemptSegment(attempt, attemptIndex); const title = synthetic ? String(attempt?.label || "Recovered thread execution") : `Attempt ${attemptIndex}`; return h("section", { className: "codex-attempt-cycle", "data-testid": `codex-attempt-cycle-${attemptIndex}` }, @@ -2053,19 +2194,19 @@ function ProgressiveAttemptCycle({ task, attempt, position, loading, onLoadPromp loading, onLoadSteps, onLoadStep, - testId: first ? "codex-execution-summary" : `codex-execution-summary-attempt-${attemptIndex}`, + testId: current ? "codex-execution-summary-current" : first ? "codex-execution-summary" : `codex-execution-summary-attempt-${attemptIndex}`, }), synthetic ? null : h(ProgressiveFinalResponse, { task, attempt, attemptIndex, - testId: first ? "codex-final-response" : `codex-final-response-attempt-${attemptIndex}`, + testId: current ? "codex-final-response-current" : first ? "codex-final-response" : `codex-final-response-attempt-${attemptIndex}`, }), synthetic ? null : h(ProgressiveJudge, { task, attempt, attemptIndex, - testId: first ? "codex-progressive-judge" : `codex-progressive-judge-attempt-${attemptIndex}`, + testId: current ? "codex-progressive-judge-current" : first ? "codex-progressive-judge" : `codex-progressive-judge-attempt-${attemptIndex}`, }), synthetic ? null : h(ProgressiveJudgeFeedbackPrompt, { task, @@ -2073,7 +2214,7 @@ function ProgressiveAttemptCycle({ task, attempt, position, loading, onLoadPromp attemptIndex, loading, onLoadPromptPart, - testId: first ? "codex-judge-feedback-prompt" : `codex-judge-feedback-prompt-attempt-${attemptIndex}`, + testId: current ? "codex-judge-feedback-prompt-current" : first ? "codex-judge-feedback-prompt" : `codex-judge-feedback-prompt-attempt-${attemptIndex}`, }), ); } @@ -3682,7 +3823,7 @@ export function CodeQueuePage({ microservices, onRaw, apiBaseUrl = "/api", initi if (selectedIdRef.current === taskId && (normalizedEvent?.type === "trace-step-created" || normalizedEvent?.type === "task-updated" || normalizedEvent?.type === "trace-stats-updated")) { const previousStepCount = canonicalTaskStepCount(previousTask); const shouldRefreshSteps = normalizedEvent?.type === "trace-step-created" - || (normalizedEvent?.type === "trace-stats-updated" && !isAttemptStats && Number.isFinite(Number(normalizedEvent?.stepCount)) && (previousStepCount === null || stepCount > previousStepCount)); + || (normalizedEvent?.type === "trace-stats-updated" && Number.isFinite(Number(normalizedEvent?.stepCount)) && (isAttemptStats || previousStepCount === null || stepCount > previousStepCount)); scheduleSelectedTraceEventRefresh(taskId, shouldRefreshSteps); } } @@ -3741,6 +3882,18 @@ export function CodeQueuePage({ microservices, onRaw, apiBaseUrl = "/api", initi void ensureTraceSummary(taskId, true).catch((err) => setError(errorText(err, "自动加载 Trace Summary 失败"))); }, [service?.id, selectedTask?.id, selectedTask?.updatedAt, selectedTask?.traceStats?.statsRevision, selectedTask?._traceSummaryUpdatedAt, selectedTask?._traceSummaryLoaded, selectedDetailLoading]); + useEffect(() => { + if (!service || !selectedTask || selectedDetailLoading) return; + const taskId = String(selectedTask.id || ""); + const currentAttempt = Number(taskTraceSummary(selectedTask)?.currentAttempt || selectedTask?.currentAttempt || 0); + if (!taskId || !taskIsExecuting(selectedTask) || !Number.isFinite(currentAttempt) || currentAttempt <= 0) return; + if (taskTraceStepsLoaded(selectedTask, currentAttempt)) return; + const key = `${taskId}:current-attempt:${currentAttempt}:${String(selectedTask?.updatedAt || "")}`; + if (autoTraceLoadKeysRef.current.has(key)) return; + autoTraceLoadKeysRef.current.add(key); + void ensureTraceSteps(currentAttempt).catch((err) => setError(errorText(err, "自动加载当前 Attempt Trace Steps 失败"))); + }, [service?.id, selectedTask?.id, selectedTask?.status, selectedTask?.currentAttempt, selectedTask?.updatedAt, selectedTask?._traceSummaryUpdatedAt, selectedDetailLoading]); + useEffect(() => { if (!service) return undefined; void loadWorkdirs().catch((err) => setError(errorText(err, "加载工作目录失败")));