From 688376abc45225ea2e1ff930e82c55b22b8d4d7f Mon Sep 17 00:00:00 2001 From: Codex Date: Mon, 11 May 2026 08:08:17 +0000 Subject: [PATCH] perf: optimize overview/tasks/polling/microservice-cache and improve frontend progressive loading --- src/components/backend-core/src/index.ts | 350 +++++++++++++++++--- src/components/frontend/public/app.js | 106 +++--- src/components/frontend/src/app.tsx | 89 ++++- src/components/frontend/src/codex-queue.tsx | 63 +++- src/components/frontend/src/index.ts | 15 +- src/components/frontend/src/pipeline.tsx | 42 ++- 6 files changed, 521 insertions(+), 144 deletions(-) diff --git a/src/components/backend-core/src/index.ts b/src/components/backend-core/src/index.ts index da2a7be6..5c82cf4c 100644 --- a/src/components/backend-core/src/index.ts +++ b/src/components/backend-core/src/index.ts @@ -117,6 +117,7 @@ type TaskTerminalWaiter = (task: RawTaskRow | null) => void; interface MicroserviceProxyCacheEntry { expiresAt: number; + staleExpiresAt: number; status: number; contentType: string; bodyText: string; @@ -140,6 +141,7 @@ const operationPerformanceSamples: OperationPerformanceSample[] = []; const maxPerformanceSamples = 3000; const taskTerminalWaiters = new Map>(); const microserviceProxyCache = new Map(); +const microserviceProxyRefreshes = new Map>(); let lastTaskSweepAt = 0; let taskSweepInFlight: Promise | null = null; const microserviceProxyMaxBodyTextLength = 8 * 1024 * 1024; @@ -1062,8 +1064,169 @@ async function getEvents(limit: number): Promise { })); } -async function getTasks(limit: number, statusFilter = "all", lite = false): Promise { +function rowString(row: Record, key: string): string { + const value = row[key]; + return typeof value === "string" ? value : value === null || value === undefined ? "" : String(value); +} + +function rowNumber(row: Record, key: string): number | null { + const value = row[key]; + const parsed = typeof value === "number" ? value : typeof value === "string" ? Number(value) : NaN; + return Number.isFinite(parsed) ? parsed : null; +} + +function taskJsonSummary(row: Record, prefix: "payload" | "result"): JsonValue { + const type = rowString(row, `${prefix}_type`); + if (type.length === 0) return prefix === "result" ? null : {}; + const summary: Record = { summaryOnly: true, type }; + const fields = prefix === "payload" + ? ["source", "serviceId", "method", "path", "mode", "targetBaseUrl", "timeoutMs", "targetProviderGatewayVersion", "providerGatewayVersion"] + : ["error", "reason", "message", "status", "exitCode", "code", "signal", "timeoutMs", "previousStatus", "mode", "policy", "targetProviderGatewayVersion", "providerGatewayVersion", "updaterContainerId"]; + for (const field of fields) { + const value = row[`${prefix}_${field}`]; + if (value !== null && value !== undefined && String(value).length > 0) { + summary[field] = typeof value === "number" || typeof value === "boolean" ? value : String(value); + } + } + const bodyChars = rowNumber(row, `${prefix}_body_text_chars`); + if (bodyChars !== null) summary.bodyText = ``; + return summary; +} + +function taskSummaryFromRow(row: Record): ApiTask { + return { + id: String(row.id), + providerId: String(row.provider_id), + command: String(row.command), + status: String(row.status), + payload: taskJsonSummary(row, "payload"), + result: taskJsonSummary(row, "result"), + createdAt: row.created_at instanceof Date ? row.created_at.toISOString() : String(row.created_at), + updatedAt: row.updated_at instanceof Date ? row.updated_at.toISOString() : String(row.updated_at), + _summaryOnly: true, + } as ApiTask; +} + +async function getTask(taskId: string): Promise { + const rows = await sql>>` + SELECT + id, + provider_id, + command, + status, + CASE + WHEN payload ? 'bodyText' THEN jsonb_set(payload - 'bodyText', '{bodyText}', to_jsonb(('>'bodyText')::text || ' chars>')::text)) + ELSE payload + END AS payload, + CASE + WHEN result IS NOT NULL AND result ? 'bodyText' THEN jsonb_set(result - 'bodyText', '{bodyText}', to_jsonb(('>'bodyText')::text || ' chars>')::text)) + ELSE result + END AS result, + created_at, + updated_at + FROM unidesk_tasks + WHERE id = ${taskId} + LIMIT 1 + `; + const row = rows[0]; + if (row === undefined) return null; + return { + id: String(row.id), + providerId: String(row.provider_id), + command: String(row.command), + status: String(row.status), + payload: compactJson(row.payload ?? {}), + result: compactJson(row.result ?? null), + createdAt: row.created_at instanceof Date ? row.created_at.toISOString() : String(row.created_at), + updatedAt: row.updated_at instanceof Date ? row.updated_at.toISOString() : String(row.updated_at), + }; +} + +async function getTasks(limit: number, statusFilter = "all", lite = false, summary = false): Promise { await maybeMarkStaleTasksFailed(); + if (summary && !lite) { + const rows = statusFilter === "pending" + ? await sql>>` + SELECT + id, + provider_id, + command, + status, + jsonb_typeof(payload) AS payload_type, + payload->>'source' AS "payload_source", + payload->>'serviceId' AS "payload_serviceId", + payload->>'method' AS "payload_method", + payload->>'path' AS "payload_path", + payload->>'mode' AS "payload_mode", + payload->>'targetBaseUrl' AS "payload_targetBaseUrl", + payload->>'timeoutMs' AS "payload_timeoutMs", + payload->>'targetProviderGatewayVersion' AS "payload_targetProviderGatewayVersion", + payload->>'providerGatewayVersion' AS "payload_providerGatewayVersion", + CASE WHEN payload ? 'bodyText' THEN length(payload->>'bodyText') ELSE NULL END AS payload_body_text_chars, + jsonb_typeof(result) AS result_type, + result->>'error' AS "result_error", + result->>'reason' AS "result_reason", + result->>'message' AS "result_message", + result->>'status' AS "result_status", + result->>'exitCode' AS "result_exitCode", + result->>'code' AS "result_code", + result->>'signal' AS "result_signal", + result->>'timeoutMs' AS "result_timeoutMs", + result->>'previousStatus' AS "result_previousStatus", + result->>'mode' AS "result_mode", + COALESCE(result->>'policy', result #>> '{plan,policy}') AS "result_policy", + COALESCE(result->>'targetProviderGatewayVersion', result #>> '{plan,targetProviderGatewayVersion}') AS "result_targetProviderGatewayVersion", + COALESCE(result->>'providerGatewayVersion', result #>> '{plan,providerGatewayVersion}') AS "result_providerGatewayVersion", + result->>'updaterContainerId' AS "result_updaterContainerId", + CASE WHEN result ? 'bodyText' THEN length(result->>'bodyText') ELSE NULL END AS result_body_text_chars, + created_at, + updated_at + FROM unidesk_tasks + WHERE status IN ('queued', 'dispatched', 'running') + ORDER BY updated_at DESC + LIMIT ${limit} + ` + : await sql>>` + SELECT + id, + provider_id, + command, + status, + jsonb_typeof(payload) AS payload_type, + payload->>'source' AS "payload_source", + payload->>'serviceId' AS "payload_serviceId", + payload->>'method' AS "payload_method", + payload->>'path' AS "payload_path", + payload->>'mode' AS "payload_mode", + payload->>'targetBaseUrl' AS "payload_targetBaseUrl", + payload->>'timeoutMs' AS "payload_timeoutMs", + payload->>'targetProviderGatewayVersion' AS "payload_targetProviderGatewayVersion", + payload->>'providerGatewayVersion' AS "payload_providerGatewayVersion", + CASE WHEN payload ? 'bodyText' THEN length(payload->>'bodyText') ELSE NULL END AS payload_body_text_chars, + jsonb_typeof(result) AS result_type, + result->>'error' AS "result_error", + result->>'reason' AS "result_reason", + result->>'message' AS "result_message", + result->>'status' AS "result_status", + result->>'exitCode' AS "result_exitCode", + result->>'code' AS "result_code", + result->>'signal' AS "result_signal", + result->>'timeoutMs' AS "result_timeoutMs", + result->>'previousStatus' AS "result_previousStatus", + result->>'mode' AS "result_mode", + COALESCE(result->>'policy', result #>> '{plan,policy}') AS "result_policy", + COALESCE(result->>'targetProviderGatewayVersion', result #>> '{plan,targetProviderGatewayVersion}') AS "result_targetProviderGatewayVersion", + COALESCE(result->>'providerGatewayVersion', result #>> '{plan,providerGatewayVersion}') AS "result_providerGatewayVersion", + result->>'updaterContainerId' AS "result_updaterContainerId", + CASE WHEN result ? 'bodyText' THEN length(result->>'bodyText') ELSE NULL END AS result_body_text_chars, + created_at, + updated_at + FROM unidesk_tasks + ORDER BY updated_at DESC + LIMIT ${limit} + `; + return rows.map(taskSummaryFromRow); + } const rows = statusFilter === "pending" ? lite ? await sql>>` @@ -1161,22 +1324,39 @@ async function getPgdataUsage(): Promise { } async function getOverview(): Promise { - const nodes = await getNodes(); - const pendingTasks = await countPendingTasks(); - const dockerStatuses = await getNodeDockerStatuses(); - const systemStatuses = await getNodeSystemStatuses(1); - const pgdata = await getPgdataUsage(); - const online = nodes.filter((node) => node.status === "online").length; + const [nodeRows, dockerRows, systemRows, pendingTasks, pgdata] = await Promise.all([ + sql>` + SELECT + count(*)::int AS node_count, + count(*) FILTER (WHERE status = 'online')::int AS online_node_count + FROM unidesk_nodes + `, + sql>` + SELECT count(*) FILTER (WHERE d.status IS NOT NULL)::int AS docker_status_node_count + FROM unidesk_nodes n + LEFT JOIN unidesk_node_docker_status d ON d.provider_id = n.provider_id + `, + sql>` + SELECT count(*) FILTER (WHERE s.status IS NOT NULL)::int AS system_status_node_count + FROM unidesk_nodes n + LEFT JOIN unidesk_node_system_status s ON s.provider_id = n.provider_id + `, + countPendingTasks(), + getPgdataUsage(), + ]); + const nodeRow = nodeRows[0]; + const dockerRow = dockerRows[0]; + const systemRow = systemRows[0]; return { service: "unidesk-core", ok: true, dbReady, pgdata, uptimeSeconds: Math.floor((Date.now() - serviceStartedAt.getTime()) / 1000), - nodeCount: nodes.length, - onlineNodeCount: online, - dockerStatusNodeCount: dockerStatuses.filter((item) => item.dockerStatus !== null).length, - systemStatusNodeCount: systemStatuses.filter((item) => item.current !== null).length, + nodeCount: Number(nodeRow?.node_count ?? 0), + onlineNodeCount: Number(nodeRow?.online_node_count ?? 0), + dockerStatusNodeCount: Number(dockerRow?.docker_status_node_count ?? 0), + systemStatusNodeCount: Number(systemRow?.system_status_node_count ?? 0), pendingTaskCount: pendingTasks, taskPendingTimeoutMs: config.taskPendingTimeoutMs, activeSocketCount: activeProviders.size, @@ -1432,12 +1612,27 @@ function responseFromMicroserviceResult(task: Awaited } function microserviceCacheTtlMs(serviceId: string, targetPath: string): number { + if (serviceId === "pipeline" && targetPath === "/api/snapshot") return 6_000; + if (serviceId === "pipeline" && targetPath.startsWith("/api/oa-event-flow/")) return 20_000; + if (serviceId === "pipeline" && targetPath.startsWith("/api/model-quota/")) return 60_000; + if (serviceId === "pipeline" && targetPath.startsWith("/api/node-control/runs/")) return 6_000; + if (serviceId === "pipeline" && targetPath.startsWith("/api/runs/")) return 6_000; + if (serviceId === "findjob" && (targetPath === "/api/summary" || targetPath === "/api/jobs" || targetPath === "/api/drafts")) return 8_000; if (serviceId === "met-nonlinear" && (targetPath === "/api/images" || targetPath === "/api/projects")) return 15_000; - if (serviceId === "met-nonlinear" && (targetPath === "/api/queue" || targetPath === "/api/summary" || targetPath === "/api/history")) return 1_500; + if (serviceId === "met-nonlinear" && (targetPath === "/api/queue" || targetPath === "/api/summary" || targetPath === "/api/history")) return 5_000; if (serviceId === "codex-queue" && targetPath.includes("/transcript")) return 1_000; return 750; } +function microserviceCacheStaleMs(serviceId: string, targetPath: string): number { + if (serviceId === "pipeline" && targetPath.startsWith("/api/model-quota/")) return 5 * 60_000; + if (serviceId === "pipeline") return 45_000; + if (serviceId === "findjob") return 60_000; + if (serviceId === "met-nonlinear" && (targetPath === "/api/images" || targetPath === "/api/projects")) return 5 * 60_000; + if (serviceId === "met-nonlinear") return 45_000; + return 5_000; +} + function providerMicroserviceCacheTtlMs(serviceId: string, targetPath: string): number { if (serviceId === "met-nonlinear" && (targetPath === "/api/images" || targetPath === "/api/projects")) return 60_000; if (serviceId === "met-nonlinear" && targetPath === "/api/history") return 10_000; @@ -1451,22 +1646,38 @@ function microserviceCacheKey(service: MicroserviceConfig, method: string, targe return JSON.stringify([service.id, method, targetPath, proxyOptions.query, proxyOptions.jsonArrayLimits]); } -function readMicroserviceCache(key: string): Response | null { - const entry = microserviceProxyCache.get(key); - if (entry === undefined) return null; - if (entry.expiresAt <= Date.now()) { - microserviceProxyCache.delete(key); - return null; - } +function responseFromMicroserviceCache(entry: MicroserviceProxyCacheEntry, state: "hit" | "stale"): Response { return new Response(entry.bodyText, { status: entry.status, headers: { "content-type": entry.contentType, - "x-unidesk-cache": "hit", + "x-unidesk-cache": state, }, }); } +function readMicroserviceCache(key: string): Response | null { + const entry = microserviceProxyCache.get(key); + if (entry === undefined) return null; + if (entry.staleExpiresAt <= Date.now()) { + microserviceProxyCache.delete(key); + return null; + } + if (entry.expiresAt <= Date.now()) return null; + return responseFromMicroserviceCache(entry, "hit"); +} + +function readStaleMicroserviceCache(key: string): Response | null { + const entry = microserviceProxyCache.get(key); + if (entry === undefined) return null; + if (entry.staleExpiresAt <= Date.now()) { + microserviceProxyCache.delete(key); + return null; + } + if (entry.expiresAt > Date.now()) return null; + return responseFromMicroserviceCache(entry, "stale"); +} + async function cacheableResponseSnapshot(response: Response): Promise { if (response.status < 200 || response.status >= 300) return null; if (response.headers.get("x-unidesk-response-truncated") === "true") return null; @@ -1474,6 +1685,7 @@ async function cacheableResponseSnapshot(response: Response): Promise 2 * 1024 * 1024) return null; return { expiresAt: 0, + staleExpiresAt: 0, status: response.status, contentType: response.headers.get("content-type") ?? "application/octet-stream", bodyText, @@ -1482,7 +1694,9 @@ async function cacheableResponseSnapshot(response: Response): Promise 300) { const now = Date.now(); @@ -1550,6 +1764,56 @@ async function directMicroserviceResponse( } } +async function fetchMicroserviceUpstreamResponse( + service: MicroserviceConfig, + method: string, + targetPath: string, + proxyOptions: { query: string; jsonArrayLimits: Record }, + requestHeaders: Record, + bodyText: string, +): Promise { + if (canDirectProxyMicroservice(service)) { + return directMicroserviceResponse(service, method, targetPath, proxyOptions, requestHeaders, bodyText); + } + if (!(await providerSupports(service.providerId, "microservice.http"))) { + return jsonResponse({ ok: false, error: `provider does not declare microservice.http capability: ${service.providerId}` }, 409); + } + const { taskId, providerOnline } = await createAndSendTask(service.providerId, "microservice.http", { + source: "microservice-frontend-proxy", + serviceId: service.id, + method, + targetBaseUrl: service.backend.nodeBaseUrl, + path: targetPath, + query: proxyOptions.query, + requestHeaders, + bodyText, + jsonArrayLimits: proxyOptions.jsonArrayLimits, + timeoutMs: service.backend.timeoutMs, + cacheTtlMs: providerMicroserviceCacheTtlMs(service.id, targetPath), + }); + if (!providerOnline) return jsonResponse({ ok: false, error: `provider is offline: ${service.providerId}`, taskId }, 503); + const task = await waitForTaskTerminal(taskId, service.backend.timeoutMs + 3000); + return responseFromMicroserviceResult(task); +} + +function refreshMicroserviceCacheInBackground( + cacheKey: string, + ttlMs: number, + fetchResponse: () => Promise, +): void { + if (microserviceProxyRefreshes.has(cacheKey)) return; + const refresh = fetchResponse() + .then((response) => cacheableResponseSnapshot(response)) + .then((entry) => rememberMicroserviceCache(cacheKey, ttlMs, entry)) + .catch((error) => { + logger("warn", "microservice_cache_revalidate_failed", { cacheKey, error: errorToJson(error) }); + }) + .finally(() => { + microserviceProxyRefreshes.delete(cacheKey); + }); + microserviceProxyRefreshes.set(cacheKey, refresh); +} + async function microserviceRoute(req: Request, url: URL): Promise { const rest = url.pathname.slice("/api/microservices/".length); const slashIndex = rest.indexOf("/"); @@ -1580,12 +1844,9 @@ async function microserviceRoute(req: Request, url: URL): Promise { if (!isMicroservicePathAllowed(service, targetPath)) { return jsonResponse({ ok: false, error: "microservice path is not allowed", serviceId, targetPath }, 403); } - const directProxy = canDirectProxyMicroservice(service); - if (!directProxy && !(await providerSupports(service.providerId, "microservice.http"))) { - return jsonResponse({ ok: false, error: `provider does not declare microservice.http capability: ${service.providerId}` }, 409); - } const proxyOptions = readMicroserviceArrayLimits(url); const cacheKey = microserviceCacheKey(service, method, targetPath, proxyOptions); + const cacheTtlMs = microserviceCacheTtlMs(service.id, targetPath); if (method === "GET" || method === "HEAD") { const cached = readMicroserviceCache(cacheKey); if (cached !== null) return cached; @@ -1599,32 +1860,15 @@ async function microserviceRoute(req: Request, url: URL): Promise { const requestHeaders: Record = {}; const contentType = req.headers.get("content-type"); if (contentType !== null) requestHeaders["content-type"] = contentType.slice(0, 200); - if (directProxy) { - const response = await directMicroserviceResponse(service, method, targetPath, proxyOptions, requestHeaders, bodyText); - if (method === "GET" || method === "HEAD") { - rememberMicroserviceCache(cacheKey, microserviceCacheTtlMs(service.id, targetPath), await cacheableResponseSnapshot(response)); - } - return response; - } - const { taskId, providerOnline } = await createAndSendTask(service.providerId, "microservice.http", { - source: "microservice-frontend-proxy", - serviceId: service.id, - method, - targetBaseUrl: service.backend.nodeBaseUrl, - path: targetPath, - query: proxyOptions.query, - requestHeaders, - bodyText, - jsonArrayLimits: proxyOptions.jsonArrayLimits, - timeoutMs: service.backend.timeoutMs, - cacheTtlMs: providerMicroserviceCacheTtlMs(service.id, targetPath), - }); - if (!providerOnline) return jsonResponse({ ok: false, error: `provider is offline: ${service.providerId}`, taskId }, 503); - const task = await waitForTaskTerminal(taskId, service.backend.timeoutMs + 3000); - const response = responseFromMicroserviceResult(task); if (method === "GET" || method === "HEAD") { - rememberMicroserviceCache(cacheKey, microserviceCacheTtlMs(service.id, targetPath), await cacheableResponseSnapshot(response)); + const stale = readStaleMicroserviceCache(cacheKey); + if (stale !== null) { + refreshMicroserviceCacheInBackground(cacheKey, cacheTtlMs, () => fetchMicroserviceUpstreamResponse(service, method, targetPath, proxyOptions, requestHeaders, bodyText)); + return stale; + } } + const response = await fetchMicroserviceUpstreamResponse(service, method, targetPath, proxyOptions, requestHeaders, bodyText); + if (method === "GET" || method === "HEAD") rememberMicroserviceCache(cacheKey, cacheTtlMs, await cacheableResponseSnapshot(response)); return response; } @@ -1939,9 +2183,17 @@ async function routeInner(req: Request, server: Server): Promise getNodeSystemStatuses(readLimit(url, 60))) }); if (url.pathname === "/api/nodes/docker-status") return jsonResponse({ ok: true, dockerStatuses: await withPerformanceOperation("core", "node_docker_status", url.pathname, () => getNodeDockerStatuses()) }); if (url.pathname === "/api/events") return jsonResponse({ ok: true, events: await withPerformanceOperation("core", "events", url.search, () => getEvents(readLimit(url, 100))) }); + if (url.pathname.startsWith("/api/tasks/") && req.method === "GET") { + const taskId = decodeURIComponent(url.pathname.slice("/api/tasks/".length)); + if (taskId.length === 0 || taskId.includes("/")) return jsonResponse({ ok: false, error: "invalid task id" }, 400); + const task = await withPerformanceOperation("core", "task_detail", taskId, () => getTask(taskId)); + if (task === null) return jsonResponse({ ok: false, error: `task not found: ${taskId}` }, 404); + return jsonResponse({ ok: true, task }); + } if (url.pathname === "/api/tasks") { const lite = ["1", "true", "yes"].includes((url.searchParams.get("lite") ?? "").toLowerCase()); - return jsonResponse({ ok: true, tasks: await withPerformanceOperation("core", "tasks", url.search, () => getTasks(readLimit(url, 100), url.searchParams.get("status") ?? "all", lite)) }); + const summary = ["1", "true", "yes"].includes((url.searchParams.get("summary") ?? "").toLowerCase()); + return jsonResponse({ ok: true, tasks: await withPerformanceOperation("core", "tasks", url.search, () => getTasks(readLimit(url, 100), url.searchParams.get("status") ?? "all", lite, summary)) }); } if (url.pathname === "/api/microservices") return jsonResponse({ ok: true, microservices: await withPerformanceOperation("core", "microservices", url.pathname, () => getMicroservices()) }); if (url.pathname === "/api/performance") return jsonResponse(await getPerformance()); diff --git a/src/components/frontend/public/app.js b/src/components/frontend/public/app.js index a4a788c9..091b07a1 100644 --- a/src/components/frontend/public/app.js +++ b/src/components/frontend/public/app.js @@ -1,44 +1,44 @@ -(()=>{var gH=Object.create;var{getPrototypeOf:nH,defineProperty:EA,getOwnPropertyNames:tH}=Object;var sH=Object.prototype.hasOwnProperty;function oH(f){return this[f]}var aH,dH,Sf=(f,u,_)=>{var y=f!=null&&typeof f==="object";if(y){var l=u?aH??=new WeakMap:dH??=new WeakMap,$=l.get(f);if($)return $}_=f!=null?gH(nH(f)):{};let j=u||!f||!f.__esModule?EA(_,"default",{value:f,enumerable:!0}):_;for(let J of tH(f))if(!sH.call(j,J))EA(j,J,{get:oH.bind(f,J),enumerable:!0});if(y)l.set(f,j);return j};var Mu=(f,u)=>()=>(u||f((u={exports:{}}).exports,u),u.exports);var pf=((f)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(f,{get:(u,_)=>(typeof require<"u"?require:u)[_]}):f)(function(f){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+f+'" is not supported')});var SA=Mu((bf)=>{var Tl=Symbol.for("react.element"),eH=Symbol.for("react.portal"),fV=Symbol.for("react.fragment"),uV=Symbol.for("react.strict_mode"),_V=Symbol.for("react.profiler"),yV=Symbol.for("react.provider"),lV=Symbol.for("react.context"),$V=Symbol.for("react.forward_ref"),jV=Symbol.for("react.suspense"),JV=Symbol.for("react.memo"),FV=Symbol.for("react.lazy"),OA=Symbol.iterator;function AV(f){if(f===null||typeof f!=="object")return null;return f=OA&&f[OA]||f["@@iterator"],typeof f==="function"?f:null}var LA={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},YA=Object.assign,BA={};function j3(f,u,_){this.props=f,this.context=u,this.refs=BA,this.updater=_||LA}j3.prototype.isReactComponent={};j3.prototype.setState=function(f,u){if(typeof f!=="object"&&typeof f!=="function"&&f!=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,f,u,"setState")};j3.prototype.forceUpdate=function(f){this.updater.enqueueForceUpdate(this,f,"forceUpdate")};function wA(){}wA.prototype=j3.prototype;function L2(f,u,_){this.props=f,this.context=u,this.refs=BA,this.updater=_||LA}var Y2=L2.prototype=new wA;Y2.constructor=L2;YA(Y2,j3.prototype);Y2.isPureReactComponent=!0;var XA=Array.isArray,DA=Object.prototype.hasOwnProperty,B2={current:null},TA={key:!0,ref:!0,__self:!0,__source:!0};function MA(f,u,_){var y,l={},$=null,j=null;if(u!=null)for(y in u.ref!==void 0&&(j=u.ref),u.key!==void 0&&($=""+u.key),u)DA.call(u,y)&&!TA.hasOwnProperty(y)&&(l[y]=u[y]);var J=arguments.length-2;if(J===1)l.children=_;else if(1{PA.exports=SA()});var IA=Mu((y0)=>{function T2(f,u){var _=f.length;f.push(u);f:for(;0<_;){var y=_-1>>>1,l=f[y];if(0>>1;y<$;){var j=2*(y+1)-1,J=f[j],F=j+1,Q=f[F];if(0>a6(J,_))Fa6(Q,J)?(f[y]=Q,f[F]=_,y=F):(f[y]=J,f[j]=_,y=j);else if(Fa6(Q,_))f[y]=Q,f[F]=_,y=F;else break f}}return u}function a6(f,u){var _=f.sortIndex-u.sortIndex;return _!==0?_:f.id-u.id}if(typeof performance==="object"&&typeof performance.now==="function")M2=performance,y0.unstable_now=function(){return M2.now()};else d6=Date,r2=d6.now(),y0.unstable_now=function(){return d6.now()-r2};var M2,d6,r2,w1=[],G_=[],GV=1,tu=null,fu=3,_8=!1,Uy=!1,rl=!1,RA=typeof setTimeout==="function"?setTimeout:null,xA=typeof clearTimeout==="function"?clearTimeout:null,CA=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function S2(f){for(var u=F1(G_);u!==null;){if(u.callback===null)u8(G_);else if(u.startTime<=f)u8(G_),u.sortIndex=u.expirationTime,T2(w1,u);else break;u=F1(G_)}}function C2(f){if(rl=!1,S2(f),!Uy)if(F1(w1)!==null)Uy=!0,x2(R2);else{var u=F1(G_);u!==null&&v2(C2,u.startTime-f)}}function R2(f,u){Uy=!1,rl&&(rl=!1,xA(Sl),Sl=-1),_8=!0;var _=fu;try{S2(u);for(tu=F1(w1);tu!==null&&(!(tu.expirationTime>u)||f&&!hA());){var y=tu.callback;if(typeof y==="function"){tu.callback=null,fu=tu.priorityLevel;var l=y(tu.expirationTime<=u);u=y0.unstable_now(),typeof l==="function"?tu.callback=l:tu===F1(w1)&&u8(w1),S2(u)}else u8(w1);tu=F1(w1)}if(tu!==null)var $=!0;else{var j=F1(G_);j!==null&&v2(C2,j.startTime-u),$=!1}return $}finally{tu=null,fu=_,_8=!1}}var y8=!1,e6=null,Sl=-1,vA=5,bA=-1;function hA(){return y0.unstable_now()-bAf||125y?(f.sortIndex=_,T2(G_,f),F1(w1)===null&&f===F1(G_)&&(rl?(xA(Sl),Sl=-1):rl=!0,v2(C2,_-y))):(f.sortIndex=l,T2(w1,f),Uy||_8||(Uy=!0,x2(R2))),f};y0.unstable_shouldYield=hA;y0.unstable_wrapCallback=function(f){var u=fu;return function(){var _=fu;fu=u;try{return f.apply(this,arguments)}finally{fu=_}}}});var pA=Mu((lS,cA)=>{cA.exports=IA()});var kW=Mu((xu)=>{var KV=I0(),Cu=pA();function Ff(f){for(var u="https://reactjs.org/docs/error-decoder.html?invariant="+f,_=1;_"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),$9=Object.prototype.hasOwnProperty,ZV=/^[: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]*$/,mA={},kA={};function qV(f){if($9.call(kA,f))return!0;if($9.call(mA,f))return!1;if(ZV.test(f))return kA[f]=!0;return mA[f]=!0,!1}function HV(f,u,_,y){if(_!==null&&_.type===0)return!1;switch(typeof u){case"function":case"symbol":return!0;case"boolean":if(y)return!1;if(_!==null)return!_.acceptsBooleans;return f=f.toLowerCase().slice(0,5),f!=="data-"&&f!=="aria-";default:return!1}}function VV(f,u,_,y){if(u===null||typeof u>"u"||HV(f,u,_,y))return!0;if(y)return!1;if(_!==null)switch(_.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 Ku(f,u,_,y,l,$,j){this.acceptsBooleans=u===2||u===3||u===4,this.attributeName=y,this.attributeNamespace=l,this.mustUseProperty=_,this.propertyName=f,this.type=u,this.sanitizeURL=$,this.removeEmptyString=j}var s0={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(f){s0[f]=new Ku(f,0,!1,f,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(f){var u=f[0];s0[u]=new Ku(u,1,!1,f[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(f){s0[f]=new Ku(f,2,!1,f.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(f){s0[f]=new Ku(f,2,!1,f,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(f){s0[f]=new Ku(f,3,!1,f.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(f){s0[f]=new Ku(f,3,!0,f,null,!1,!1)});["capture","download"].forEach(function(f){s0[f]=new Ku(f,4,!1,f,null,!1,!1)});["cols","rows","size","span"].forEach(function(f){s0[f]=new Ku(f,6,!1,f,null,!1,!1)});["rowSpan","start"].forEach(function(f){s0[f]=new Ku(f,5,!1,f.toLowerCase(),null,!1,!1)});var e9=/[\-:]([a-z])/g;function f7(f){return f[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(f){var u=f.replace(e9,f7);s0[u]=new Ku(u,1,!1,f,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(f){var u=f.replace(e9,f7);s0[u]=new Ku(u,1,!1,f,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(f){var u=f.replace(e9,f7);s0[u]=new Ku(u,1,!1,f,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(f){s0[f]=new Ku(f,1,!1,f.toLowerCase(),null,!1,!1)});s0.xlinkHref=new Ku("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(f){s0[f]=new Ku(f,1,!1,f.toLowerCase(),null,!0,!0)});function u7(f,u,_,y){var l=s0.hasOwnProperty(u)?s0[u]:null;if(l!==null?l.type!==0:y||!(2J||l[j]!==$[J]){var F=` -`+l[j].replace(" at new "," at ");return f.displayName&&F.includes("")&&(F=F.replace("",f.displayName)),F}while(1<=j&&0<=J);break}}}finally{h2=!1,Error.prepareStackTrace=_}return(f=f?f.displayName||f.name:"")?Il(f):""}function EV(f){switch(f.tag){case 5:return Il(f.type);case 16:return Il("Lazy");case 13:return Il("Suspense");case 19:return Il("SuspenseList");case 0:case 2:case 15:return f=I2(f.type,!1),f;case 11:return f=I2(f.type.render,!1),f;case 1:return f=I2(f.type,!0),f;default:return""}}function A9(f){if(f==null)return null;if(typeof f==="function")return f.displayName||f.name||null;if(typeof f==="string")return f;switch(f){case Q3:return"Fragment";case A3:return"Portal";case j9:return"Profiler";case _7:return"StrictMode";case J9:return"Suspense";case F9:return"SuspenseList"}if(typeof f==="object")switch(f.$$typeof){case sQ:return(f.displayName||"Context")+".Consumer";case tQ:return(f._context.displayName||"Context")+".Provider";case y7:var u=f.render;return f=f.displayName,f||(f=u.displayName||u.name||"",f=f!==""?"ForwardRef("+f+")":"ForwardRef"),f;case l7:return u=f.displayName||null,u!==null?u:A9(f.type)||"Memo";case Z_:u=f._payload,f=f._init;try{return A9(f(u))}catch(_){}}return null}function OV(f){var u=f.type;switch(f.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 f=u.render,f=f.displayName||f.name||"",u.displayName||(f!==""?"ForwardRef("+f+")":"ForwardRef");case 7:return"Fragment";case 5:return u;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return A9(u);case 8:return u===_7?"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 M_(f){switch(typeof f){case"boolean":case"number":case"string":case"undefined":return f;case"object":return f;default:return""}}function aQ(f){var u=f.type;return(f=f.nodeName)&&f.toLowerCase()==="input"&&(u==="checkbox"||u==="radio")}function XV(f){var u=aQ(f)?"checked":"value",_=Object.getOwnPropertyDescriptor(f.constructor.prototype,u),y=""+f[u];if(!f.hasOwnProperty(u)&&typeof _<"u"&&typeof _.get==="function"&&typeof _.set==="function"){var{get:l,set:$}=_;return Object.defineProperty(f,u,{configurable:!0,get:function(){return l.call(this)},set:function(j){y=""+j,$.call(this,j)}}),Object.defineProperty(f,u,{enumerable:_.enumerable}),{getValue:function(){return y},setValue:function(j){y=""+j},stopTracking:function(){f._valueTracker=null,delete f[u]}}}}function $8(f){f._valueTracker||(f._valueTracker=XV(f))}function dQ(f){if(!f)return!1;var u=f._valueTracker;if(!u)return!0;var _=u.getValue(),y="";return f&&(y=aQ(f)?f.checked?"true":"false":f.value),f=y,f!==_?(u.setValue(f),!0):!1}function M8(f){if(f=f||(typeof document<"u"?document:void 0),typeof f>"u")return null;try{return f.activeElement||f.body}catch(u){return f.body}}function Q9(f,u){var _=u.checked;return q0({},u,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:_!=null?_:f._wrapperState.initialChecked})}function gA(f,u){var _=u.defaultValue==null?"":u.defaultValue,y=u.checked!=null?u.checked:u.defaultChecked;_=M_(u.value!=null?u.value:_),f._wrapperState={initialChecked:y,initialValue:_,controlled:u.type==="checkbox"||u.type==="radio"?u.checked!=null:u.value!=null}}function eQ(f,u){u=u.checked,u!=null&&u7(f,"checked",u,!1)}function U9(f,u){eQ(f,u);var _=M_(u.value),y=u.type;if(_!=null)if(y==="number"){if(_===0&&f.value===""||f.value!=_)f.value=""+_}else f.value!==""+_&&(f.value=""+_);else if(y==="submit"||y==="reset"){f.removeAttribute("value");return}u.hasOwnProperty("value")?W9(f,u.type,_):u.hasOwnProperty("defaultValue")&&W9(f,u.type,M_(u.defaultValue)),u.checked==null&&u.defaultChecked!=null&&(f.defaultChecked=!!u.defaultChecked)}function nA(f,u,_){if(u.hasOwnProperty("value")||u.hasOwnProperty("defaultValue")){var y=u.type;if(!(y!=="submit"&&y!=="reset"||u.value!==void 0&&u.value!==null))return;u=""+f._wrapperState.initialValue,_||u===f.value||(f.value=u),f.defaultValue=u}_=f.name,_!==""&&(f.name=""),f.defaultChecked=!!f._wrapperState.initialChecked,_!==""&&(f.name=_)}function W9(f,u,_){if(u!=="number"||M8(f.ownerDocument)!==f)_==null?f.defaultValue=""+f._wrapperState.initialValue:f.defaultValue!==""+_&&(f.defaultValue=""+_)}var cl=Array.isArray;function O3(f,u,_,y){if(f=f.options,u){u={};for(var l=0;l<_.length;l++)u["$"+_[l]]=!0;for(_=0;_"+u.valueOf().toString()+"";for(u=j8.firstChild;f.firstChild;)f.removeChild(f.firstChild);for(;u.firstChild;)f.appendChild(u.firstChild)}});function l$(f,u){if(u){var _=f.firstChild;if(_&&_===f.lastChild&&_.nodeType===3){_.nodeValue=u;return}}f.textContent=u}var tl={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},NV=["Webkit","ms","Moz","O"];Object.keys(tl).forEach(function(f){NV.forEach(function(u){u=u+f.charAt(0).toUpperCase()+f.substring(1),tl[u]=tl[f]})});function yU(f,u,_){return u==null||typeof u==="boolean"||u===""?"":_||typeof u!=="number"||u===0||tl.hasOwnProperty(f)&&tl[f]?(""+u).trim():u+"px"}function lU(f,u){f=f.style;for(var _ in u)if(u.hasOwnProperty(_)){var y=_.indexOf("--")===0,l=yU(_,u[_],y);_==="float"&&(_="cssFloat"),y?f.setProperty(_,l):f[_]=l}}var LV=q0({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 K9(f,u){if(u){if(LV[f]&&(u.children!=null||u.dangerouslySetInnerHTML!=null))throw Error(Ff(137,f));if(u.dangerouslySetInnerHTML!=null){if(u.children!=null)throw Error(Ff(60));if(typeof u.dangerouslySetInnerHTML!=="object"||!("__html"in u.dangerouslySetInnerHTML))throw Error(Ff(61))}if(u.style!=null&&typeof u.style!=="object")throw Error(Ff(62))}}function Z9(f,u){if(f.indexOf("-")===-1)return typeof u.is==="string";switch(f){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 q9=null;function $7(f){return f=f.target||f.srcElement||window,f.correspondingUseElement&&(f=f.correspondingUseElement),f.nodeType===3?f.parentNode:f}var H9=null,X3=null,N3=null;function oA(f){if(f=X$(f)){if(typeof H9!=="function")throw Error(Ff(280));var u=f.stateNode;u&&(u=l4(u),H9(f.stateNode,f.type,u))}}function $U(f){X3?N3?N3.push(f):N3=[f]:X3=f}function jU(){if(X3){var f=X3,u=N3;if(N3=X3=null,oA(f),u)for(f=0;f>>=0,f===0?32:31-(RV(f)/xV|0)|0}var J8=64,F8=4194304;function pl(f){switch(f&-f){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 f&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return f&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return f}}function C8(f,u){var _=f.pendingLanes;if(_===0)return 0;var y=0,l=f.suspendedLanes,$=f.pingedLanes,j=_&268435455;if(j!==0){var J=j&~l;J!==0?y=pl(J):($&=j,$!==0&&(y=pl($)))}else j=_&~l,j!==0?y=pl(j):$!==0&&(y=pl($));if(y===0)return 0;if(u!==0&&u!==y&&(u&l)===0&&(l=y&-y,$=u&-u,l>=$||l===16&&($&4194240)!==0))return u;if((y&4)!==0&&(y|=_&16),u=f.entangledLanes,u!==0)for(f=f.entanglements,u&=y;0_;_++)u.push(f);return u}function E$(f,u,_){f.pendingLanes|=u,u!==536870912&&(f.suspendedLanes=0,f.pingedLanes=0),f=f.eventTimes,u=31-z1(u),f[u]=_}function IV(f,u){var _=f.pendingLanes&~u;f.pendingLanes=u,f.suspendedLanes=0,f.pingedLanes=0,f.expiredLanes&=u,f.mutableReadLanes&=u,f.entangledLanes&=u,u=f.entanglements;var y=f.eventTimes;for(f=f.expirationTimes;0<_;){var l=31-z1(_),$=1<=ol),$Q=String.fromCharCode(32),jQ=!1;function BU(f,u){switch(f){case"keyup":return GE.indexOf(u.keyCode)!==-1;case"keydown":return u.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function wU(f){return f=f.detail,typeof f==="object"&&"data"in f?f.data:null}var U3=!1;function ZE(f,u){switch(f){case"compositionend":return wU(u);case"keypress":if(u.which!==32)return null;return jQ=!0,$Q;case"textInput":return f=u.data,f===$Q&&jQ?null:f;default:return null}}function qE(f,u){if(U3)return f==="compositionend"||!z7&&BU(f,u)?(f=LU(),E8=Q7=E_=null,U3=!1,f):null;switch(f){case"paste":return null;case"keypress":if(!(u.ctrlKey||u.altKey||u.metaKey)||u.ctrlKey&&u.altKey){if(u.char&&1=u)return{node:_,offset:u-f};f=y}f:{for(;_;){if(_.nextSibling){_=_.nextSibling;break f}_=_.parentNode}_=void 0}_=AQ(_)}}function rU(f,u){return f&&u?f===u?!0:f&&f.nodeType===3?!1:u&&u.nodeType===3?rU(f,u.parentNode):("contains"in f)?f.contains(u):f.compareDocumentPosition?!!(f.compareDocumentPosition(u)&16):!1:!1}function SU(){for(var f=window,u=M8();u instanceof f.HTMLIFrameElement;){try{var _=typeof u.contentWindow.location.href==="string"}catch(y){_=!1}if(_)f=u.contentWindow;else break;u=M8(f.document)}return u}function G7(f){var u=f&&f.nodeName&&f.nodeName.toLowerCase();return u&&(u==="input"&&(f.type==="text"||f.type==="search"||f.type==="tel"||f.type==="url"||f.type==="password")||u==="textarea"||f.contentEditable==="true")}function BE(f){var u=SU(),_=f.focusedElem,y=f.selectionRange;if(u!==_&&_&&_.ownerDocument&&rU(_.ownerDocument.documentElement,_)){if(y!==null&&G7(_)){if(u=y.start,f=y.end,f===void 0&&(f=u),"selectionStart"in _)_.selectionStart=u,_.selectionEnd=Math.min(f,_.value.length);else if(f=(u=_.ownerDocument||document)&&u.defaultView||window,f.getSelection){f=f.getSelection();var l=_.textContent.length,$=Math.min(y.start,l);y=y.end===void 0?$:Math.min(y.end,l),!f.extend&&$>y&&(l=y,y=$,$=l),l=QQ(_,$);var j=QQ(_,y);l&&j&&(f.rangeCount!==1||f.anchorNode!==l.node||f.anchorOffset!==l.offset||f.focusNode!==j.node||f.focusOffset!==j.offset)&&(u=u.createRange(),u.setStart(l.node,l.offset),f.removeAllRanges(),$>y?(f.addRange(u),f.extend(j.node,j.offset)):(u.setEnd(j.node,j.offset),f.addRange(u)))}}u=[];for(f=_;f=f.parentNode;)f.nodeType===1&&u.push({element:f,left:f.scrollLeft,top:f.scrollTop});typeof _.focus==="function"&&_.focus();for(_=0;_=document.documentMode,W3=null,L9=null,dl=null,Y9=!1;function UQ(f,u,_){var y=_.window===_?_.document:_.nodeType===9?_:_.ownerDocument;Y9||W3==null||W3!==M8(y)||(y=W3,("selectionStart"in y)&&G7(y)?y={start:y.selectionStart,end:y.selectionEnd}:(y=(y.ownerDocument&&y.ownerDocument.defaultView||window).getSelection(),y={anchorNode:y.anchorNode,anchorOffset:y.anchorOffset,focusNode:y.focusNode,focusOffset:y.focusOffset}),dl&&Q$(dl,y)||(dl=y,y=v8(L9,"onSelect"),0K3||(f.current=P9[K3],P9[K3]=null,K3--)}function l0(f,u){K3++,P9[K3]=f.current,f.current=u}var r_={},lu=P_(r_),Ou=P_(!1),Ey=r_;function D3(f,u){var _=f.type.contextTypes;if(!_)return r_;var y=f.stateNode;if(y&&y.__reactInternalMemoizedUnmaskedChildContext===u)return y.__reactInternalMemoizedMaskedChildContext;var l={},$;for($ in _)l[$]=u[$];return y&&(f=f.stateNode,f.__reactInternalMemoizedUnmaskedChildContext=u,f.__reactInternalMemoizedMaskedChildContext=l),l}function Xu(f){return f=f.childContextTypes,f!==null&&f!==void 0}function h8(){A0(Ou),A0(lu)}function HQ(f,u,_){if(lu.current!==r_)throw Error(Ff(168));l0(lu,u),l0(Ou,_)}function cU(f,u,_){var y=f.stateNode;if(u=u.childContextTypes,typeof y.getChildContext!=="function")return _;y=y.getChildContext();for(var l in y)if(!(l in u))throw Error(Ff(108,OV(f)||"Unknown",l));return q0({},_,y)}function I8(f){return f=(f=f.stateNode)&&f.__reactInternalMemoizedMergedChildContext||r_,Ey=lu.current,l0(lu,f),l0(Ou,Ou.current),!0}function VQ(f,u,_){var y=f.stateNode;if(!y)throw Error(Ff(169));_?(f=cU(f,u,Ey),y.__reactInternalMemoizedMergedChildContext=f,A0(Ou),A0(lu),l0(lu,f)):A0(Ou),l0(Ou,_)}var n1=null,$4=!1,o2=!1;function pU(f){n1===null?n1=[f]:n1.push(f)}function xE(f){$4=!0,pU(f)}function C_(){if(!o2&&n1!==null){o2=!0;var f=0,u=af;try{var _=n1;for(af=1;f<_.length;f++){var y=_[f];do y=y(!0);while(y!==null)}n1=null,$4=!1}catch(l){throw n1!==null&&(n1=n1.slice(f+1)),zU(j7,C_),l}finally{af=u,o2=!1}}return null}var Z3=[],q3=0,c8=null,p8=0,su=[],ou=0,Oy=null,t1=1,s1="";function zy(f,u){Z3[q3++]=p8,Z3[q3++]=c8,c8=f,p8=u}function mU(f,u,_){su[ou++]=t1,su[ou++]=s1,su[ou++]=Oy,Oy=f;var y=t1;f=s1;var l=32-z1(y)-1;y&=~(1<>=j,l-=j,t1=1<<32-z1(u)+l|_<w?(R=N,N=null):R=N.sibling;var p=W(G,N,Z[w],E);if(p===null){N===null&&(N=R);break}f&&N&&p.alternate===null&&u(G,N),H=$(p,H,w),M===null?L=p:M.sibling=p,M=p,N=R}if(w===Z.length)return _(G,N),U0&&zy(G,w),L;if(N===null){for(;ww?(R=N,N=null):R=N.sibling;var x=W(G,N,p.value,E);if(x===null){N===null&&(N=R);break}f&&N&&x.alternate===null&&u(G,N),H=$(x,H,w),M===null?L=x:M.sibling=x,M=x,N=R}if(p.done)return _(G,N),U0&&zy(G,w),L;if(N===null){for(;!p.done;w++,p=Z.next())p=z(G,p.value,E),p!==null&&(H=$(p,H,w),M===null?L=p:M.sibling=p,M=p);return U0&&zy(G,w),L}for(N=y(G,N);!p.done;w++,p=Z.next())p=K(N,G,w,p.value,E),p!==null&&(f&&p.alternate!==null&&N.delete(p.key===null?w:p.key),H=$(p,H,w),M===null?L=p:M.sibling=p,M=p);return f&&N.forEach(function(C){return u(G,C)}),U0&&zy(G,w),L}function O(G,H,Z,E){if(typeof Z==="object"&&Z!==null&&Z.type===Q3&&Z.key===null&&(Z=Z.props.children),typeof Z==="object"&&Z!==null){switch(Z.$$typeof){case l8:f:{for(var L=Z.key,M=H;M!==null;){if(M.key===L){if(L=Z.type,L===Q3){if(M.tag===7){_(G,M.sibling),H=l(M,Z.props.children),H.return=G,G=H;break f}}else if(M.elementType===L||typeof L==="object"&&L!==null&&L.$$typeof===Z_&&XQ(L)===M.type){_(G,M.sibling),H=l(M,Z.props),H.ref=vl(G,M,Z),H.return=G,G=H;break f}_(G,M);break}else u(G,M);M=M.sibling}Z.type===Q3?(H=Vy(Z.props.children,G.mode,E,Z.key),H.return=G,G=H):(E=T8(Z.type,Z.key,Z.props,null,G.mode,E),E.ref=vl(G,H,Z),E.return=G,G=E)}return j(G);case A3:f:{for(M=Z.key;H!==null;){if(H.key===M)if(H.tag===4&&H.stateNode.containerInfo===Z.containerInfo&&H.stateNode.implementation===Z.implementation){_(G,H.sibling),H=l(H,Z.children||[]),H.return=G,G=H;break f}else{_(G,H);break}else u(G,H);H=H.sibling}H=l9(Z,G.mode,E),H.return=G,G=H}return j(G);case Z_:return M=Z._init,O(G,H,M(Z._payload),E)}if(cl(Z))return q(G,H,Z,E);if(Pl(Z))return V(G,H,Z,E);K8(G,Z)}return typeof Z==="string"&&Z!==""||typeof Z==="number"?(Z=""+Z,H!==null&&H.tag===6?(_(G,H.sibling),H=l(H,Z),H.return=G,G=H):(_(G,H),H=y9(Z,G.mode,E),H.return=G,G=H),j(G)):_(G,H)}return O}var M3=gU(!0),nU=gU(!1),m8=P_(null),k8=null,H3=null,H7=null;function V7(){H7=H3=k8=null}function E7(f){var u=m8.current;A0(m8),f._currentValue=u}function x9(f,u,_){for(;f!==null;){var y=f.alternate;if((f.childLanes&u)!==u?(f.childLanes|=u,y!==null&&(y.childLanes|=u)):y!==null&&(y.childLanes&u)!==u&&(y.childLanes|=u),f===_)break;f=f.return}}function Y3(f,u){k8=f,H7=H3=null,f=f.dependencies,f!==null&&f.firstContext!==null&&((f.lanes&u)!==0&&(Eu=!0),f.firstContext=null)}function eu(f){var u=f._currentValue;if(H7!==f)if(f={context:f,memoizedValue:u,next:null},H3===null){if(k8===null)throw Error(Ff(308));H3=f,k8.dependencies={lanes:0,firstContext:f}}else H3=H3.next=f;return u}var Zy=null;function O7(f){Zy===null?Zy=[f]:Zy.push(f)}function tU(f,u,_,y){var l=u.interleaved;return l===null?(_.next=_,O7(u)):(_.next=l.next,l.next=_),u.interleaved=_,e1(f,y)}function e1(f,u){f.lanes|=u;var _=f.alternate;_!==null&&(_.lanes|=u),_=f;for(f=f.return;f!==null;)f.childLanes|=u,_=f.alternate,_!==null&&(_.childLanes|=u),_=f,f=f.return;return _.tag===3?_.stateNode:null}var q_=!1;function X7(f){f.updateQueue={baseState:f.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function sU(f,u){f=f.updateQueue,u.updateQueue===f&&(u.updateQueue={baseState:f.baseState,firstBaseUpdate:f.firstBaseUpdate,lastBaseUpdate:f.lastBaseUpdate,shared:f.shared,effects:f.effects})}function o1(f,u){return{eventTime:f,lane:u,tag:0,payload:null,callback:null,next:null}}function B_(f,u,_){var y=f.updateQueue;if(y===null)return null;if(y=y.shared,(gf&2)!==0){var l=y.pending;return l===null?u.next=u:(u.next=l.next,l.next=u),y.pending=u,e1(f,_)}return l=y.interleaved,l===null?(u.next=u,O7(y)):(u.next=l.next,l.next=u),y.interleaved=u,e1(f,_)}function N8(f,u,_){if(u=u.updateQueue,u!==null&&(u=u.shared,(_&4194240)!==0)){var y=u.lanes;y&=f.pendingLanes,_|=y,u.lanes=_,J7(f,_)}}function NQ(f,u){var{updateQueue:_,alternate:y}=f;if(y!==null&&(y=y.updateQueue,_===y)){var l=null,$=null;if(_=_.firstBaseUpdate,_!==null){do{var j={eventTime:_.eventTime,lane:_.lane,tag:_.tag,payload:_.payload,callback:_.callback,next:null};$===null?l=$=j:$=$.next=j,_=_.next}while(_!==null);$===null?l=$=u:$=$.next=u}else l=$=u;_={baseState:y.baseState,firstBaseUpdate:l,lastBaseUpdate:$,shared:y.shared,effects:y.effects},f.updateQueue=_;return}f=_.lastBaseUpdate,f===null?_.firstBaseUpdate=u:f.next=u,_.lastBaseUpdate=u}function i8(f,u,_,y){var l=f.updateQueue;q_=!1;var{firstBaseUpdate:$,lastBaseUpdate:j}=l,J=l.shared.pending;if(J!==null){l.shared.pending=null;var F=J,Q=F.next;F.next=null,j===null?$=Q:j.next=Q,j=F;var U=f.alternate;U!==null&&(U=U.updateQueue,J=U.lastBaseUpdate,J!==j&&(J===null?U.firstBaseUpdate=Q:J.next=Q,U.lastBaseUpdate=F))}if($!==null){var z=l.baseState;j=0,U=Q=F=null,J=$;do{var{lane:W,eventTime:K}=J;if((y&W)===W){U!==null&&(U=U.next={eventTime:K,lane:0,tag:J.tag,payload:J.payload,callback:J.callback,next:null});f:{var q=f,V=J;switch(W=u,K=_,V.tag){case 1:if(q=V.payload,typeof q==="function"){z=q.call(K,z,W);break f}z=q;break f;case 3:q.flags=q.flags&-65537|128;case 0:if(q=V.payload,W=typeof q==="function"?q.call(K,z,W):q,W===null||W===void 0)break f;z=q0({},z,W);break f;case 2:q_=!0}}J.callback!==null&&J.lane!==0&&(f.flags|=64,W=l.effects,W===null?l.effects=[J]:W.push(J))}else K={eventTime:K,lane:W,tag:J.tag,payload:J.payload,callback:J.callback,next:null},U===null?(Q=U=K,F=z):U=U.next=K,j|=W;if(J=J.next,J===null)if(J=l.shared.pending,J===null)break;else W=J,J=W.next,W.next=null,l.lastBaseUpdate=W,l.shared.pending=null}while(1);if(U===null&&(F=z),l.baseState=F,l.firstBaseUpdate=Q,l.lastBaseUpdate=U,u=l.shared.interleaved,u!==null){l=u;do j|=l.lane,l=l.next;while(l!==u)}else $===null&&(l.shared.lanes=0);Ny|=j,f.lanes=j,f.memoizedState=z}}function LQ(f,u,_){if(f=u.effects,u.effects=null,f!==null)for(u=0;u_?_:4,f(!0);var y=d2.transition;d2.transition={};try{f(!1),u()}finally{af=_,d2.transition=y}}function WW(){return f1().memoizedState}function IE(f,u,_){var y=D_(f);if(_={lane:y,action:_,hasEagerState:!1,eagerState:null,next:null},zW(f))GW(u,_);else if(_=tU(f,u,_,y),_!==null){var l=Gu();G1(_,f,y,l),KW(_,u,y)}}function cE(f,u,_){var y=D_(f),l={lane:y,action:_,hasEagerState:!1,eagerState:null,next:null};if(zW(f))GW(u,l);else{var $=f.alternate;if(f.lanes===0&&($===null||$.lanes===0)&&($=u.lastRenderedReducer,$!==null))try{var j=u.lastRenderedState,J=$(j,_);if(l.hasEagerState=!0,l.eagerState=J,K1(J,j)){var F=u.interleaved;F===null?(l.next=l,O7(u)):(l.next=F.next,F.next=l),u.interleaved=l;return}}catch(Q){}finally{}_=tU(f,u,l,y),_!==null&&(l=Gu(),G1(_,f,y,l),KW(_,u,y))}}function zW(f){var u=f.alternate;return f===Z0||u!==null&&u===Z0}function GW(f,u){el=n8=!0;var _=f.pending;_===null?u.next=u:(u.next=_.next,_.next=u),f.pending=u}function KW(f,u,_){if((_&4194240)!==0){var y=u.lanes;y&=f.pendingLanes,_|=y,u.lanes=_,J7(f,_)}}var t8={readContext:eu,useCallback:uu,useContext:uu,useEffect:uu,useImperativeHandle:uu,useInsertionEffect:uu,useLayoutEffect:uu,useMemo:uu,useReducer:uu,useRef:uu,useState:uu,useDebugValue:uu,useDeferredValue:uu,useTransition:uu,useMutableSource:uu,useSyncExternalStore:uu,useId:uu,unstable_isNewReconciler:!1},pE={readContext:eu,useCallback:function(f,u){return T1().memoizedState=[f,u===void 0?null:u],f},useContext:eu,useEffect:BQ,useImperativeHandle:function(f,u,_){return _=_!==null&&_!==void 0?_.concat([f]):null,Y8(4194308,4,JW.bind(null,u,f),_)},useLayoutEffect:function(f,u){return Y8(4194308,4,f,u)},useInsertionEffect:function(f,u){return Y8(4,2,f,u)},useMemo:function(f,u){var _=T1();return u=u===void 0?null:u,f=f(),_.memoizedState=[f,u],f},useReducer:function(f,u,_){var y=T1();return u=_!==void 0?_(u):u,y.memoizedState=y.baseState=u,f={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:f,lastRenderedState:u},y.queue=f,f=f.dispatch=IE.bind(null,Z0,f),[y.memoizedState,f]},useRef:function(f){var u=T1();return f={current:f},u.memoizedState=f},useState:YQ,useDebugValue:M7,useDeferredValue:function(f){return T1().memoizedState=f},useTransition:function(){var f=YQ(!1),u=f[0];return f=hE.bind(null,f[1]),T1().memoizedState=f,[u,f]},useMutableSource:function(){},useSyncExternalStore:function(f,u,_){var y=Z0,l=T1();if(U0){if(_===void 0)throw Error(Ff(407));_=_()}else{if(_=u(),p0===null)throw Error(Ff(349));(Xy&30)!==0||eU(y,u,_)}l.memoizedState=_;var $={value:_,getSnapshot:u};return l.queue=$,BQ(uW.bind(null,y,$,f),[f]),y.flags|=2048,H$(9,fW.bind(null,y,$,_,u),void 0,null),_},useId:function(){var f=T1(),u=p0.identifierPrefix;if(U0){var _=s1,y=t1;_=(y&~(1<<32-z1(y)-1)).toString(32)+_,u=":"+u+"R"+_,_=Z$++,0<_&&(u+="H"+_.toString(32)),u+=":"}else _=bE++,u=":"+u+"r"+_.toString(32)+":";return f.memoizedState=u},unstable_isNewReconciler:!1},mE={readContext:eu,useCallback:AW,useContext:eu,useEffect:T7,useImperativeHandle:FW,useInsertionEffect:$W,useLayoutEffect:jW,useMemo:QW,useReducer:e2,useRef:lW,useState:function(){return e2(q$)},useDebugValue:M7,useDeferredValue:function(f){var u=f1();return UW(u,S0.memoizedState,f)},useTransition:function(){var f=e2(q$)[0],u=f1().memoizedState;return[f,u]},useMutableSource:aU,useSyncExternalStore:dU,useId:WW,unstable_isNewReconciler:!1},kE={readContext:eu,useCallback:AW,useContext:eu,useEffect:T7,useImperativeHandle:FW,useInsertionEffect:$W,useLayoutEffect:jW,useMemo:QW,useReducer:f9,useRef:lW,useState:function(){return f9(q$)},useDebugValue:M7,useDeferredValue:function(f){var u=f1();return S0===null?u.memoizedState=f:UW(u,S0.memoizedState,f)},useTransition:function(){var f=f9(q$)[0],u=f1().memoizedState;return[f,u]},useMutableSource:aU,useSyncExternalStore:dU,useId:WW,unstable_isNewReconciler:!1};function Q1(f,u){if(f&&f.defaultProps){u=q0({},u),f=f.defaultProps;for(var _ in f)u[_]===void 0&&(u[_]=f[_]);return u}return u}function v9(f,u,_,y){u=f.memoizedState,_=_(y,u),_=_===null||_===void 0?u:q0({},u,_),f.memoizedState=_,f.lanes===0&&(f.updateQueue.baseState=_)}var J4={isMounted:function(f){return(f=f._reactInternals)?By(f)===f:!1},enqueueSetState:function(f,u,_){f=f._reactInternals;var y=Gu(),l=D_(f),$=o1(y,l);$.payload=u,_!==void 0&&_!==null&&($.callback=_),u=B_(f,$,l),u!==null&&(G1(u,f,l,y),N8(u,f,l))},enqueueReplaceState:function(f,u,_){f=f._reactInternals;var y=Gu(),l=D_(f),$=o1(y,l);$.tag=1,$.payload=u,_!==void 0&&_!==null&&($.callback=_),u=B_(f,$,l),u!==null&&(G1(u,f,l,y),N8(u,f,l))},enqueueForceUpdate:function(f,u){f=f._reactInternals;var _=Gu(),y=D_(f),l=o1(_,y);l.tag=2,u!==void 0&&u!==null&&(l.callback=u),u=B_(f,l,y),u!==null&&(G1(u,f,y,_),N8(u,f,y))}};function wQ(f,u,_,y,l,$,j){return f=f.stateNode,typeof f.shouldComponentUpdate==="function"?f.shouldComponentUpdate(y,$,j):u.prototype&&u.prototype.isPureReactComponent?!Q$(_,y)||!Q$(l,$):!0}function ZW(f,u,_){var y=!1,l=r_,$=u.contextType;return typeof $==="object"&&$!==null?$=eu($):(l=Xu(u)?Ey:lu.current,y=u.contextTypes,$=(y=y!==null&&y!==void 0)?D3(f,l):r_),u=new u(_,$),f.memoizedState=u.state!==null&&u.state!==void 0?u.state:null,u.updater=J4,f.stateNode=u,u._reactInternals=f,y&&(f=f.stateNode,f.__reactInternalMemoizedUnmaskedChildContext=l,f.__reactInternalMemoizedMaskedChildContext=$),u}function DQ(f,u,_,y){f=u.state,typeof u.componentWillReceiveProps==="function"&&u.componentWillReceiveProps(_,y),typeof u.UNSAFE_componentWillReceiveProps==="function"&&u.UNSAFE_componentWillReceiveProps(_,y),u.state!==f&&J4.enqueueReplaceState(u,u.state,null)}function b9(f,u,_,y){var l=f.stateNode;l.props=_,l.state=f.memoizedState,l.refs={},X7(f);var $=u.contextType;typeof $==="object"&&$!==null?l.context=eu($):($=Xu(u)?Ey:lu.current,l.context=D3(f,$)),l.state=f.memoizedState,$=u.getDerivedStateFromProps,typeof $==="function"&&(v9(f,u,$,_),l.state=f.memoizedState),typeof u.getDerivedStateFromProps==="function"||typeof l.getSnapshotBeforeUpdate==="function"||typeof l.UNSAFE_componentWillMount!=="function"&&typeof l.componentWillMount!=="function"||(u=l.state,typeof l.componentWillMount==="function"&&l.componentWillMount(),typeof l.UNSAFE_componentWillMount==="function"&&l.UNSAFE_componentWillMount(),u!==l.state&&J4.enqueueReplaceState(l,l.state,null),i8(f,_,l,y),l.state=f.memoizedState),typeof l.componentDidMount==="function"&&(f.flags|=4194308)}function S3(f,u){try{var _="",y=u;do _+=EV(y),y=y.return;while(y);var l=_}catch($){l=` -Error generating stack: `+$.message+` -`+$.stack}return{value:f,source:u,stack:l,digest:null}}function u9(f,u,_){return{value:f,source:null,stack:_!=null?_:null,digest:u!=null?u:null}}function h9(f,u){try{console.error(u.value)}catch(_){setTimeout(function(){throw _})}}var iE=typeof WeakMap==="function"?WeakMap:Map;function qW(f,u,_){_=o1(-1,_),_.tag=3,_.payload={element:null};var y=u.value;return _.callback=function(){o8||(o8=!0,s9=y),h9(f,u)},_}function HW(f,u,_){_=o1(-1,_),_.tag=3;var y=f.type.getDerivedStateFromError;if(typeof y==="function"){var l=u.value;_.payload=function(){return y(l)},_.callback=function(){h9(f,u)}}var $=f.stateNode;return $!==null&&typeof $.componentDidCatch==="function"&&(_.callback=function(){h9(f,u),typeof y!=="function"&&(w_===null?w_=new Set([this]):w_.add(this));var j=u.stack;this.componentDidCatch(u.value,{componentStack:j!==null?j:""})}),_}function TQ(f,u,_){var y=f.pingCache;if(y===null){y=f.pingCache=new iE;var l=new Set;y.set(u,l)}else l=y.get(u),l===void 0&&(l=new Set,y.set(u,l));l.has(_)||(l.add(_),f=$O.bind(null,f,u,_),u.then(f,f))}function MQ(f){do{var u;if(u=f.tag===13)u=f.memoizedState,u=u!==null?u.dehydrated!==null?!0:!1:!0;if(u)return f;f=f.return}while(f!==null);return null}function rQ(f,u,_,y,l){if((f.mode&1)===0)return f===u?f.flags|=65536:(f.flags|=128,_.flags|=131072,_.flags&=-52805,_.tag===1&&(_.alternate===null?_.tag=17:(u=o1(-1,1),u.tag=2,B_(_,u,1))),_.lanes|=1),f;return f.flags|=65536,f.lanes=l,f}var gE=u_.ReactCurrentOwner,Eu=!1;function zu(f,u,_,y){u.child=f===null?nU(u,null,_,y):M3(u,f.child,_,y)}function SQ(f,u,_,y,l){_=_.render;var $=u.ref;if(Y3(u,l),y=w7(f,u,_,y,$,l),_=D7(),f!==null&&!Eu)return u.updateQueue=f.updateQueue,u.flags&=-2053,f.lanes&=~l,f_(f,u,l);return U0&&_&&K7(u),u.flags|=1,zu(f,u,y,l),u.child}function PQ(f,u,_,y,l){if(f===null){var $=_.type;if(typeof $==="function"&&!b7($)&&$.defaultProps===void 0&&_.compare===null&&_.defaultProps===void 0)return u.tag=15,u.type=$,VW(f,u,$,y,l);return f=T8(_.type,null,y,u,u.mode,l),f.ref=u.ref,f.return=u,u.child=f}if($=f.child,(f.lanes&l)===0){var j=$.memoizedProps;if(_=_.compare,_=_!==null?_:Q$,_(j,y)&&f.ref===u.ref)return f_(f,u,l)}return u.flags|=1,f=T_($,y),f.ref=u.ref,f.return=u,u.child=f}function VW(f,u,_,y,l){if(f!==null){var $=f.memoizedProps;if(Q$($,y)&&f.ref===u.ref)if(Eu=!1,u.pendingProps=y=$,(f.lanes&l)!==0)(f.flags&131072)!==0&&(Eu=!0);else return u.lanes=f.lanes,f_(f,u,l)}return I9(f,u,_,y,l)}function EW(f,u,_){var y=u.pendingProps,l=y.children,$=f!==null?f.memoizedState:null;if(y.mode==="hidden")if((u.mode&1)===0)u.memoizedState={baseLanes:0,cachePool:null,transitions:null},l0(E3,ru),ru|=_;else{if((_&1073741824)===0)return f=$!==null?$.baseLanes|_:_,u.lanes=u.childLanes=1073741824,u.memoizedState={baseLanes:f,cachePool:null,transitions:null},u.updateQueue=null,l0(E3,ru),ru|=f,null;u.memoizedState={baseLanes:0,cachePool:null,transitions:null},y=$!==null?$.baseLanes:_,l0(E3,ru),ru|=y}else $!==null?(y=$.baseLanes|_,u.memoizedState=null):y=_,l0(E3,ru),ru|=y;return zu(f,u,l,_),u.child}function OW(f,u){var _=u.ref;if(f===null&&_!==null||f!==null&&f.ref!==_)u.flags|=512,u.flags|=2097152}function I9(f,u,_,y,l){var $=Xu(_)?Ey:lu.current;if($=D3(u,$),Y3(u,l),_=w7(f,u,_,y,$,l),y=D7(),f!==null&&!Eu)return u.updateQueue=f.updateQueue,u.flags&=-2053,f.lanes&=~l,f_(f,u,l);return U0&&y&&K7(u),u.flags|=1,zu(f,u,_,l),u.child}function CQ(f,u,_,y,l){if(Xu(_)){var $=!0;I8(u)}else $=!1;if(Y3(u,l),u.stateNode===null)B8(f,u),ZW(u,_,y),b9(u,_,y,l),y=!0;else if(f===null){var{stateNode:j,memoizedProps:J}=u;j.props=J;var F=j.context,Q=_.contextType;typeof Q==="object"&&Q!==null?Q=eu(Q):(Q=Xu(_)?Ey:lu.current,Q=D3(u,Q));var U=_.getDerivedStateFromProps,z=typeof U==="function"||typeof j.getSnapshotBeforeUpdate==="function";z||typeof j.UNSAFE_componentWillReceiveProps!=="function"&&typeof j.componentWillReceiveProps!=="function"||(J!==y||F!==Q)&&DQ(u,j,y,Q),q_=!1;var W=u.memoizedState;j.state=W,i8(u,y,j,l),F=u.memoizedState,J!==y||W!==F||Ou.current||q_?(typeof U==="function"&&(v9(u,_,U,y),F=u.memoizedState),(J=q_||wQ(u,_,J,y,W,F,Q))?(z||typeof j.UNSAFE_componentWillMount!=="function"&&typeof j.componentWillMount!=="function"||(typeof j.componentWillMount==="function"&&j.componentWillMount(),typeof j.UNSAFE_componentWillMount==="function"&&j.UNSAFE_componentWillMount()),typeof j.componentDidMount==="function"&&(u.flags|=4194308)):(typeof j.componentDidMount==="function"&&(u.flags|=4194308),u.memoizedProps=y,u.memoizedState=F),j.props=y,j.state=F,j.context=Q,y=J):(typeof j.componentDidMount==="function"&&(u.flags|=4194308),y=!1)}else{j=u.stateNode,sU(f,u),J=u.memoizedProps,Q=u.type===u.elementType?J:Q1(u.type,J),j.props=Q,z=u.pendingProps,W=j.context,F=_.contextType,typeof F==="object"&&F!==null?F=eu(F):(F=Xu(_)?Ey:lu.current,F=D3(u,F));var K=_.getDerivedStateFromProps;(U=typeof K==="function"||typeof j.getSnapshotBeforeUpdate==="function")||typeof j.UNSAFE_componentWillReceiveProps!=="function"&&typeof j.componentWillReceiveProps!=="function"||(J!==z||W!==F)&&DQ(u,j,y,F),q_=!1,W=u.memoizedState,j.state=W,i8(u,y,j,l);var q=u.memoizedState;J!==z||W!==q||Ou.current||q_?(typeof K==="function"&&(v9(u,_,K,y),q=u.memoizedState),(Q=q_||wQ(u,_,Q,y,W,q,F)||!1)?(U||typeof j.UNSAFE_componentWillUpdate!=="function"&&typeof j.componentWillUpdate!=="function"||(typeof j.componentWillUpdate==="function"&&j.componentWillUpdate(y,q,F),typeof j.UNSAFE_componentWillUpdate==="function"&&j.UNSAFE_componentWillUpdate(y,q,F)),typeof j.componentDidUpdate==="function"&&(u.flags|=4),typeof j.getSnapshotBeforeUpdate==="function"&&(u.flags|=1024)):(typeof j.componentDidUpdate!=="function"||J===f.memoizedProps&&W===f.memoizedState||(u.flags|=4),typeof j.getSnapshotBeforeUpdate!=="function"||J===f.memoizedProps&&W===f.memoizedState||(u.flags|=1024),u.memoizedProps=y,u.memoizedState=q),j.props=y,j.state=q,j.context=F,y=Q):(typeof j.componentDidUpdate!=="function"||J===f.memoizedProps&&W===f.memoizedState||(u.flags|=4),typeof j.getSnapshotBeforeUpdate!=="function"||J===f.memoizedProps&&W===f.memoizedState||(u.flags|=1024),y=!1)}return c9(f,u,_,y,$,l)}function c9(f,u,_,y,l,$){OW(f,u);var j=(u.flags&128)!==0;if(!y&&!j)return l&&VQ(u,_,!1),f_(f,u,$);y=u.stateNode,gE.current=u;var J=j&&typeof _.getDerivedStateFromError!=="function"?null:y.render();return u.flags|=1,f!==null&&j?(u.child=M3(u,f.child,null,$),u.child=M3(u,null,J,$)):zu(f,u,J,$),u.memoizedState=y.state,l&&VQ(u,_,!0),u.child}function XW(f){var u=f.stateNode;u.pendingContext?HQ(f,u.pendingContext,u.pendingContext!==u.context):u.context&&HQ(f,u.context,!1),N7(f,u.containerInfo)}function RQ(f,u,_,y,l){return T3(),q7(l),u.flags|=256,zu(f,u,_,y),u.child}var p9={dehydrated:null,treeContext:null,retryLane:0};function m9(f){return{baseLanes:f,cachePool:null,transitions:null}}function NW(f,u,_){var y=u.pendingProps,l=K0.current,$=!1,j=(u.flags&128)!==0,J;if((J=j)||(J=f!==null&&f.memoizedState===null?!1:(l&2)!==0),J)$=!0,u.flags&=-129;else if(f===null||f.memoizedState!==null)l|=1;if(l0(K0,l&1),f===null){if(R9(u),f=u.memoizedState,f!==null&&(f=f.dehydrated,f!==null))return(u.mode&1)===0?u.lanes=1:f.data==="$!"?u.lanes=8:u.lanes=1073741824,null;return j=y.children,f=y.fallback,$?(y=u.mode,$=u.child,j={mode:"hidden",children:j},(y&1)===0&&$!==null?($.childLanes=0,$.pendingProps=j):$=Q4(j,y,0,null),f=Vy(f,y,_,null),$.return=u,f.return=u,$.sibling=f,u.child=$,u.child.memoizedState=m9(_),u.memoizedState=p9,f):r7(u,j)}if(l=f.memoizedState,l!==null&&(J=l.dehydrated,J!==null))return nE(f,u,j,y,J,l,_);if($){$=y.fallback,j=u.mode,l=f.child,J=l.sibling;var F={mode:"hidden",children:y.children};return(j&1)===0&&u.child!==l?(y=u.child,y.childLanes=0,y.pendingProps=F,u.deletions=null):(y=T_(l,F),y.subtreeFlags=l.subtreeFlags&14680064),J!==null?$=T_(J,$):($=Vy($,j,_,null),$.flags|=2),$.return=u,y.return=u,y.sibling=$,u.child=y,y=$,$=u.child,j=f.child.memoizedState,j=j===null?m9(_):{baseLanes:j.baseLanes|_,cachePool:null,transitions:j.transitions},$.memoizedState=j,$.childLanes=f.childLanes&~_,u.memoizedState=p9,y}return $=f.child,f=$.sibling,y=T_($,{mode:"visible",children:y.children}),(u.mode&1)===0&&(y.lanes=_),y.return=u,y.sibling=null,f!==null&&(_=u.deletions,_===null?(u.deletions=[f],u.flags|=16):_.push(f)),u.child=y,u.memoizedState=null,y}function r7(f,u){return u=Q4({mode:"visible",children:u},f.mode,0,null),u.return=f,f.child=u}function Z8(f,u,_,y){return y!==null&&q7(y),M3(u,f.child,null,_),f=r7(u,u.pendingProps.children),f.flags|=2,u.memoizedState=null,f}function nE(f,u,_,y,l,$,j){if(_){if(u.flags&256)return u.flags&=-257,y=u9(Error(Ff(422))),Z8(f,u,j,y);if(u.memoizedState!==null)return u.child=f.child,u.flags|=128,null;return $=y.fallback,l=u.mode,y=Q4({mode:"visible",children:y.children},l,0,null),$=Vy($,l,j,null),$.flags|=2,y.return=u,$.return=u,y.sibling=$,u.child=y,(u.mode&1)!==0&&M3(u,f.child,null,j),u.child.memoizedState=m9(j),u.memoizedState=p9,$}if((u.mode&1)===0)return Z8(f,u,j,null);if(l.data==="$!"){if(y=l.nextSibling&&l.nextSibling.dataset,y)var J=y.dgst;return y=J,$=Error(Ff(419)),y=u9($,y,void 0),Z8(f,u,j,y)}if(J=(j&f.childLanes)!==0,Eu||J){if(y=p0,y!==null){switch(j&-j){case 4:l=2;break;case 16:l=8;break;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:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:l=32;break;case 536870912:l=268435456;break;default:l=0}l=(l&(y.suspendedLanes|j))!==0?0:l,l!==0&&l!==$.retryLane&&($.retryLane=l,e1(f,l),G1(y,f,l,-1))}return v7(),y=u9(Error(Ff(421))),Z8(f,u,j,y)}if(l.data==="$?")return u.flags|=128,u.child=f.child,u=jO.bind(null,f),l._reactRetry=u,null;return f=$.treeContext,Su=Y_(l.nextSibling),Pu=u,U0=!0,W1=null,f!==null&&(su[ou++]=t1,su[ou++]=s1,su[ou++]=Oy,t1=f.id,s1=f.overflow,Oy=u),u=r7(u,y.children),u.flags|=4096,u}function xQ(f,u,_){f.lanes|=u;var y=f.alternate;y!==null&&(y.lanes|=u),x9(f.return,u,_)}function _9(f,u,_,y,l){var $=f.memoizedState;$===null?f.memoizedState={isBackwards:u,rendering:null,renderingStartTime:0,last:y,tail:_,tailMode:l}:($.isBackwards=u,$.rendering=null,$.renderingStartTime=0,$.last=y,$.tail=_,$.tailMode=l)}function LW(f,u,_){var y=u.pendingProps,l=y.revealOrder,$=y.tail;if(zu(f,u,y.children,_),y=K0.current,(y&2)!==0)y=y&1|2,u.flags|=128;else{if(f!==null&&(f.flags&128)!==0)f:for(f=u.child;f!==null;){if(f.tag===13)f.memoizedState!==null&&xQ(f,_,u);else if(f.tag===19)xQ(f,_,u);else if(f.child!==null){f.child.return=f,f=f.child;continue}if(f===u)break f;for(;f.sibling===null;){if(f.return===null||f.return===u)break f;f=f.return}f.sibling.return=f.return,f=f.sibling}y&=1}if(l0(K0,y),(u.mode&1)===0)u.memoizedState=null;else switch(l){case"forwards":_=u.child;for(l=null;_!==null;)f=_.alternate,f!==null&&g8(f)===null&&(l=_),_=_.sibling;_=l,_===null?(l=u.child,u.child=null):(l=_.sibling,_.sibling=null),_9(u,!1,l,_,$);break;case"backwards":_=null,l=u.child;for(u.child=null;l!==null;){if(f=l.alternate,f!==null&&g8(f)===null){u.child=l;break}f=l.sibling,l.sibling=_,_=l,l=f}_9(u,!0,_,null,$);break;case"together":_9(u,!1,null,null,void 0);break;default:u.memoizedState=null}return u.child}function B8(f,u){(u.mode&1)===0&&f!==null&&(f.alternate=null,u.alternate=null,u.flags|=2)}function f_(f,u,_){if(f!==null&&(u.dependencies=f.dependencies),Ny|=u.lanes,(_&u.childLanes)===0)return null;if(f!==null&&u.child!==f.child)throw Error(Ff(153));if(u.child!==null){f=u.child,_=T_(f,f.pendingProps),u.child=_;for(_.return=u;f.sibling!==null;)f=f.sibling,_=_.sibling=T_(f,f.pendingProps),_.return=u;_.sibling=null}return u.child}function tE(f,u,_){switch(u.tag){case 3:XW(u),T3();break;case 5:oU(u);break;case 1:Xu(u.type)&&I8(u);break;case 4:N7(u,u.stateNode.containerInfo);break;case 10:var y=u.type._context,l=u.memoizedProps.value;l0(m8,y._currentValue),y._currentValue=l;break;case 13:if(y=u.memoizedState,y!==null){if(y.dehydrated!==null)return l0(K0,K0.current&1),u.flags|=128,null;if((_&u.child.childLanes)!==0)return NW(f,u,_);return l0(K0,K0.current&1),f=f_(f,u,_),f!==null?f.sibling:null}l0(K0,K0.current&1);break;case 19:if(y=(_&u.childLanes)!==0,(f.flags&128)!==0){if(y)return LW(f,u,_);u.flags|=128}if(l=u.memoizedState,l!==null&&(l.rendering=null,l.tail=null,l.lastEffect=null),l0(K0,K0.current),y)break;else return null;case 22:case 23:return u.lanes=0,EW(f,u,_)}return f_(f,u,_)}var YW,k9,BW,wW;YW=function(f,u){for(var _=u.child;_!==null;){if(_.tag===5||_.tag===6)f.appendChild(_.stateNode);else if(_.tag!==4&&_.child!==null){_.child.return=_,_=_.child;continue}if(_===u)break;for(;_.sibling===null;){if(_.return===null||_.return===u)return;_=_.return}_.sibling.return=_.return,_=_.sibling}};k9=function(){};BW=function(f,u,_,y){var l=f.memoizedProps;if(l!==y){f=u.stateNode,qy(S1.current);var $=null;switch(_){case"input":l=Q9(f,l),y=Q9(f,y),$=[];break;case"select":l=q0({},l,{value:void 0}),y=q0({},y,{value:void 0}),$=[];break;case"textarea":l=z9(f,l),y=z9(f,y),$=[];break;default:typeof l.onClick!=="function"&&typeof y.onClick==="function"&&(f.onclick=b8)}K9(_,y);var j;_=null;for(Q in l)if(!y.hasOwnProperty(Q)&&l.hasOwnProperty(Q)&&l[Q]!=null)if(Q==="style"){var J=l[Q];for(j in J)J.hasOwnProperty(j)&&(_||(_={}),_[j]="")}else Q!=="dangerouslySetInnerHTML"&&Q!=="children"&&Q!=="suppressContentEditableWarning"&&Q!=="suppressHydrationWarning"&&Q!=="autoFocus"&&(y$.hasOwnProperty(Q)?$||($=[]):($=$||[]).push(Q,null));for(Q in y){var F=y[Q];if(J=l!=null?l[Q]:void 0,y.hasOwnProperty(Q)&&F!==J&&(F!=null||J!=null))if(Q==="style")if(J){for(j in J)!J.hasOwnProperty(j)||F&&F.hasOwnProperty(j)||(_||(_={}),_[j]="");for(j in F)F.hasOwnProperty(j)&&J[j]!==F[j]&&(_||(_={}),_[j]=F[j])}else _||($||($=[]),$.push(Q,_)),_=F;else Q==="dangerouslySetInnerHTML"?(F=F?F.__html:void 0,J=J?J.__html:void 0,F!=null&&J!==F&&($=$||[]).push(Q,F)):Q==="children"?typeof F!=="string"&&typeof F!=="number"||($=$||[]).push(Q,""+F):Q!=="suppressContentEditableWarning"&&Q!=="suppressHydrationWarning"&&(y$.hasOwnProperty(Q)?(F!=null&&Q==="onScroll"&&F0("scroll",f),$||J===F||($=[])):($=$||[]).push(Q,F))}_&&($=$||[]).push("style",_);var Q=$;if(u.updateQueue=Q)u.flags|=4}};wW=function(f,u,_,y){_!==y&&(u.flags|=4)};function bl(f,u){if(!U0)switch(f.tailMode){case"hidden":u=f.tail;for(var _=null;u!==null;)u.alternate!==null&&(_=u),u=u.sibling;_===null?f.tail=null:_.sibling=null;break;case"collapsed":_=f.tail;for(var y=null;_!==null;)_.alternate!==null&&(y=_),_=_.sibling;y===null?u||f.tail===null?f.tail=null:f.tail.sibling=null:y.sibling=null}}function _u(f){var u=f.alternate!==null&&f.alternate.child===f.child,_=0,y=0;if(u)for(var l=f.child;l!==null;)_|=l.lanes|l.childLanes,y|=l.subtreeFlags&14680064,y|=l.flags&14680064,l.return=f,l=l.sibling;else for(l=f.child;l!==null;)_|=l.lanes|l.childLanes,y|=l.subtreeFlags,y|=l.flags,l.return=f,l=l.sibling;return f.subtreeFlags|=y,f.childLanes=_,u}function sE(f,u,_){var y=u.pendingProps;switch(Z7(u),u.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return _u(u),null;case 1:return Xu(u.type)&&h8(),_u(u),null;case 3:if(y=u.stateNode,r3(),A0(Ou),A0(lu),Y7(),y.pendingContext&&(y.context=y.pendingContext,y.pendingContext=null),f===null||f.child===null)G8(u)?u.flags|=4:f===null||f.memoizedState.isDehydrated&&(u.flags&256)===0||(u.flags|=1024,W1!==null&&(d9(W1),W1=null));return k9(f,u),_u(u),null;case 5:L7(u);var l=qy(K$.current);if(_=u.type,f!==null&&u.stateNode!=null)BW(f,u,_,y,l),f.ref!==u.ref&&(u.flags|=512,u.flags|=2097152);else{if(!y){if(u.stateNode===null)throw Error(Ff(166));return _u(u),null}if(f=qy(S1.current),G8(u)){y=u.stateNode,_=u.type;var $=u.memoizedProps;switch(y[M1]=u,y[z$]=$,f=(u.mode&1)!==0,_){case"dialog":F0("cancel",y),F0("close",y);break;case"iframe":case"object":case"embed":F0("load",y);break;case"video":case"audio":for(l=0;l",f=f.removeChild(f.firstChild)):typeof y.is==="string"?f=j.createElement(_,{is:y.is}):(f=j.createElement(_),_==="select"&&(j=f,y.multiple?j.multiple=!0:y.size&&(j.size=y.size))):f=j.createElementNS(f,_),f[M1]=u,f[z$]=y,YW(f,u,!1,!1),u.stateNode=f;f:{switch(j=Z9(_,y),_){case"dialog":F0("cancel",f),F0("close",f),l=y;break;case"iframe":case"object":case"embed":F0("load",f),l=y;break;case"video":case"audio":for(l=0;lP3&&(u.flags|=128,y=!0,bl($,!1),u.lanes=4194304)}else{if(!y)if(f=g8(j),f!==null){if(u.flags|=128,y=!0,_=f.updateQueue,_!==null&&(u.updateQueue=_,u.flags|=4),bl($,!0),$.tail===null&&$.tailMode==="hidden"&&!j.alternate&&!U0)return _u(u),null}else 2*w0()-$.renderingStartTime>P3&&_!==1073741824&&(u.flags|=128,y=!0,bl($,!1),u.lanes=4194304);$.isBackwards?(j.sibling=u.child,u.child=j):(_=$.last,_!==null?_.sibling=j:u.child=j,$.last=j)}if($.tail!==null)return u=$.tail,$.rendering=u,$.tail=u.sibling,$.renderingStartTime=w0(),u.sibling=null,_=K0.current,l0(K0,y?_&1|2:_&1),u;return _u(u),null;case 22:case 23:return x7(),y=u.memoizedState!==null,f!==null&&f.memoizedState!==null!==y&&(u.flags|=8192),y&&(u.mode&1)!==0?(ru&1073741824)!==0&&(_u(u),u.subtreeFlags&6&&(u.flags|=8192)):_u(u),null;case 24:return null;case 25:return null}throw Error(Ff(156,u.tag))}function oE(f,u){switch(Z7(u),u.tag){case 1:return Xu(u.type)&&h8(),f=u.flags,f&65536?(u.flags=f&-65537|128,u):null;case 3:return r3(),A0(Ou),A0(lu),Y7(),f=u.flags,(f&65536)!==0&&(f&128)===0?(u.flags=f&-65537|128,u):null;case 5:return L7(u),null;case 13:if(A0(K0),f=u.memoizedState,f!==null&&f.dehydrated!==null){if(u.alternate===null)throw Error(Ff(340));T3()}return f=u.flags,f&65536?(u.flags=f&-65537|128,u):null;case 19:return A0(K0),null;case 4:return r3(),null;case 10:return E7(u.type._context),null;case 22:case 23:return x7(),null;case 24:return null;default:return null}}var q8=!1,yu=!1,aE=typeof WeakSet==="function"?WeakSet:Set,qf=null;function V3(f,u){var _=f.ref;if(_!==null)if(typeof _==="function")try{_(null)}catch(y){L0(f,u,y)}else _.current=null}function i9(f,u,_){try{_()}catch(y){L0(f,u,y)}}var vQ=!1;function dE(f,u){if(D9=R8,f=SU(),G7(f)){if("selectionStart"in f)var _={start:f.selectionStart,end:f.selectionEnd};else f:{_=(_=f.ownerDocument)&&_.defaultView||window;var y=_.getSelection&&_.getSelection();if(y&&y.rangeCount!==0){_=y.anchorNode;var{anchorOffset:l,focusNode:$}=y;y=y.focusOffset;try{_.nodeType,$.nodeType}catch(E){_=null;break f}var j=0,J=-1,F=-1,Q=0,U=0,z=f,W=null;u:for(;;){for(var K;;){if(z!==_||l!==0&&z.nodeType!==3||(J=j+l),z!==$||y!==0&&z.nodeType!==3||(F=j+y),z.nodeType===3&&(j+=z.nodeValue.length),(K=z.firstChild)===null)break;W=z,z=K}for(;;){if(z===f)break u;if(W===_&&++Q===l&&(J=j),W===$&&++U===y&&(F=j),(K=z.nextSibling)!==null)break;z=W,W=z.parentNode}z=K}_=J===-1||F===-1?null:{start:J,end:F}}else _=null}_=_||{start:0,end:0}}else _=null;T9={focusedElem:f,selectionRange:_},R8=!1;for(qf=u;qf!==null;)if(u=qf,f=u.child,(u.subtreeFlags&1028)!==0&&f!==null)f.return=u,qf=f;else for(;qf!==null;){u=qf;try{var q=u.alternate;if((u.flags&1024)!==0)switch(u.tag){case 0:case 11:case 15:break;case 1:if(q!==null){var{memoizedProps:V,memoizedState:O}=q,G=u.stateNode,H=G.getSnapshotBeforeUpdate(u.elementType===u.type?V:Q1(u.type,V),O);G.__reactInternalSnapshotBeforeUpdate=H}break;case 3:var Z=u.stateNode.containerInfo;Z.nodeType===1?Z.textContent="":Z.nodeType===9&&Z.documentElement&&Z.removeChild(Z.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(Ff(163))}}catch(E){L0(u,u.return,E)}if(f=u.sibling,f!==null){f.return=u.return,qf=f;break}qf=u.return}return q=vQ,vQ=!1,q}function f$(f,u,_){var y=u.updateQueue;if(y=y!==null?y.lastEffect:null,y!==null){var l=y=y.next;do{if((l.tag&f)===f){var $=l.destroy;l.destroy=void 0,$!==void 0&&i9(u,_,$)}l=l.next}while(l!==y)}}function F4(f,u){if(u=u.updateQueue,u=u!==null?u.lastEffect:null,u!==null){var _=u=u.next;do{if((_.tag&f)===f){var y=_.create;_.destroy=y()}_=_.next}while(_!==u)}}function g9(f){var u=f.ref;if(u!==null){var _=f.stateNode;switch(f.tag){case 5:f=_;break;default:f=_}typeof u==="function"?u(f):u.current=f}}function DW(f){var u=f.alternate;u!==null&&(f.alternate=null,DW(u)),f.child=null,f.deletions=null,f.sibling=null,f.tag===5&&(u=f.stateNode,u!==null&&(delete u[M1],delete u[z$],delete u[S9],delete u[CE],delete u[RE])),f.stateNode=null,f.return=null,f.dependencies=null,f.memoizedProps=null,f.memoizedState=null,f.pendingProps=null,f.stateNode=null,f.updateQueue=null}function TW(f){return f.tag===5||f.tag===3||f.tag===4}function bQ(f){f:for(;;){for(;f.sibling===null;){if(f.return===null||TW(f.return))return null;f=f.return}f.sibling.return=f.return;for(f=f.sibling;f.tag!==5&&f.tag!==6&&f.tag!==18;){if(f.flags&2)continue f;if(f.child===null||f.tag===4)continue f;else f.child.return=f,f=f.child}if(!(f.flags&2))return f.stateNode}}function n9(f,u,_){var y=f.tag;if(y===5||y===6)f=f.stateNode,u?_.nodeType===8?_.parentNode.insertBefore(f,u):_.insertBefore(f,u):(_.nodeType===8?(u=_.parentNode,u.insertBefore(f,_)):(u=_,u.appendChild(f)),_=_._reactRootContainer,_!==null&&_!==void 0||u.onclick!==null||(u.onclick=b8));else if(y!==4&&(f=f.child,f!==null))for(n9(f,u,_),f=f.sibling;f!==null;)n9(f,u,_),f=f.sibling}function t9(f,u,_){var y=f.tag;if(y===5||y===6)f=f.stateNode,u?_.insertBefore(f,u):_.appendChild(f);else if(y!==4&&(f=f.child,f!==null))for(t9(f,u,_),f=f.sibling;f!==null;)t9(f,u,_),f=f.sibling}var n0=null,U1=!1;function K_(f,u,_){for(_=_.child;_!==null;)MW(f,u,_),_=_.sibling}function MW(f,u,_){if(r1&&typeof r1.onCommitFiberUnmount==="function")try{r1.onCommitFiberUnmount(f4,_)}catch(J){}switch(_.tag){case 5:yu||V3(_,u);case 6:var y=n0,l=U1;n0=null,K_(f,u,_),n0=y,U1=l,n0!==null&&(U1?(f=n0,_=_.stateNode,f.nodeType===8?f.parentNode.removeChild(_):f.removeChild(_)):n0.removeChild(_.stateNode));break;case 18:n0!==null&&(U1?(f=n0,_=_.stateNode,f.nodeType===8?s2(f.parentNode,_):f.nodeType===1&&s2(f,_),F$(f)):s2(n0,_.stateNode));break;case 4:y=n0,l=U1,n0=_.stateNode.containerInfo,U1=!0,K_(f,u,_),n0=y,U1=l;break;case 0:case 11:case 14:case 15:if(!yu&&(y=_.updateQueue,y!==null&&(y=y.lastEffect,y!==null))){l=y=y.next;do{var $=l,j=$.destroy;$=$.tag,j!==void 0&&(($&2)!==0?i9(_,u,j):($&4)!==0&&i9(_,u,j)),l=l.next}while(l!==y)}K_(f,u,_);break;case 1:if(!yu&&(V3(_,u),y=_.stateNode,typeof y.componentWillUnmount==="function"))try{y.props=_.memoizedProps,y.state=_.memoizedState,y.componentWillUnmount()}catch(J){L0(_,u,J)}K_(f,u,_);break;case 21:K_(f,u,_);break;case 22:_.mode&1?(yu=(y=yu)||_.memoizedState!==null,K_(f,u,_),yu=y):K_(f,u,_);break;default:K_(f,u,_)}}function hQ(f){var u=f.updateQueue;if(u!==null){f.updateQueue=null;var _=f.stateNode;_===null&&(_=f.stateNode=new aE),u.forEach(function(y){var l=JO.bind(null,f,y);_.has(y)||(_.add(y),y.then(l,l))})}}function A1(f,u){var _=u.deletions;if(_!==null)for(var y=0;y<_.length;y++){var l=_[y];try{var $=f,j=u,J=j;f:for(;J!==null;){switch(J.tag){case 5:n0=J.stateNode,U1=!1;break f;case 3:n0=J.stateNode.containerInfo,U1=!0;break f;case 4:n0=J.stateNode.containerInfo,U1=!0;break f}J=J.return}if(n0===null)throw Error(Ff(160));MW($,j,l),n0=null,U1=!1;var F=l.alternate;F!==null&&(F.return=null),l.return=null}catch(Q){L0(l,u,Q)}}if(u.subtreeFlags&12854)for(u=u.child;u!==null;)rW(u,f),u=u.sibling}function rW(f,u){var{alternate:_,flags:y}=f;switch(f.tag){case 0:case 11:case 14:case 15:if(A1(u,f),D1(f),y&4){try{f$(3,f,f.return),F4(3,f)}catch(V){L0(f,f.return,V)}try{f$(5,f,f.return)}catch(V){L0(f,f.return,V)}}break;case 1:A1(u,f),D1(f),y&512&&_!==null&&V3(_,_.return);break;case 5:if(A1(u,f),D1(f),y&512&&_!==null&&V3(_,_.return),f.flags&32){var l=f.stateNode;try{l$(l,"")}catch(V){L0(f,f.return,V)}}if(y&4&&(l=f.stateNode,l!=null)){var $=f.memoizedProps,j=_!==null?_.memoizedProps:$,J=f.type,F=f.updateQueue;if(f.updateQueue=null,F!==null)try{J==="input"&&$.type==="radio"&&$.name!=null&&eQ(l,$),Z9(J,j);var Q=Z9(J,$);for(j=0;jl&&(l=j),y&=~$}if(y=l,y=w0()-y,y=(120>y?120:480>y?480:1080>y?1080:1920>y?1920:3000>y?3000:4320>y?4320:1960*fO(y/1960))-y,10f?16:f,O_===null)var y=!1;else{if(f=O_,O_=null,a8=0,(gf&6)!==0)throw Error(Ff(331));var l=gf;gf|=4;for(qf=f.current;qf!==null;){var $=qf,j=$.child;if((qf.flags&16)!==0){var J=$.deletions;if(J!==null){for(var F=0;Fw0()-C7?Hy(f,0):P7|=_),Nu(f,u)}function bW(f,u){u===0&&((f.mode&1)===0?u=1:(u=F8,F8<<=1,(F8&130023424)===0&&(F8=4194304)));var _=Gu();f=e1(f,u),f!==null&&(E$(f,u,_),Nu(f,_))}function jO(f){var u=f.memoizedState,_=0;u!==null&&(_=u.retryLane),bW(f,_)}function JO(f,u){var _=0;switch(f.tag){case 13:var{stateNode:y,memoizedState:l}=f;l!==null&&(_=l.retryLane);break;case 19:y=f.stateNode;break;default:throw Error(Ff(314))}y!==null&&y.delete(u),bW(f,_)}var hW;hW=function(f,u,_){if(f!==null)if(f.memoizedProps!==u.pendingProps||Ou.current)Eu=!0;else{if((f.lanes&_)===0&&(u.flags&128)===0)return Eu=!1,tE(f,u,_);Eu=(f.flags&131072)!==0?!0:!1}else Eu=!1,U0&&(u.flags&1048576)!==0&&mU(u,p8,u.index);switch(u.lanes=0,u.tag){case 2:var y=u.type;B8(f,u),f=u.pendingProps;var l=D3(u,lu.current);Y3(u,_),l=w7(null,u,y,f,l,_);var $=D7();return u.flags|=1,typeof l==="object"&&l!==null&&typeof l.render==="function"&&l.$$typeof===void 0?(u.tag=1,u.memoizedState=null,u.updateQueue=null,Xu(y)?($=!0,I8(u)):$=!1,u.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,X7(u),l.updater=J4,u.stateNode=l,l._reactInternals=u,b9(u,y,f,_),u=c9(null,u,y,!0,$,_)):(u.tag=0,U0&&$&&K7(u),zu(null,u,l,_),u=u.child),u;case 16:y=u.elementType;f:{switch(B8(f,u),f=u.pendingProps,l=y._init,y=l(y._payload),u.type=y,l=u.tag=AO(y),f=Q1(y,f),l){case 0:u=I9(null,u,y,f,_);break f;case 1:u=CQ(null,u,y,f,_);break f;case 11:u=SQ(null,u,y,f,_);break f;case 14:u=PQ(null,u,y,Q1(y.type,f),_);break f}throw Error(Ff(306,y,""))}return u;case 0:return y=u.type,l=u.pendingProps,l=u.elementType===y?l:Q1(y,l),I9(f,u,y,l,_);case 1:return y=u.type,l=u.pendingProps,l=u.elementType===y?l:Q1(y,l),CQ(f,u,y,l,_);case 3:f:{if(XW(u),f===null)throw Error(Ff(387));y=u.pendingProps,$=u.memoizedState,l=$.element,sU(f,u),i8(u,y,null,_);var j=u.memoizedState;if(y=j.element,$.isDehydrated)if($={element:y,isDehydrated:!1,cache:j.cache,pendingSuspenseBoundaries:j.pendingSuspenseBoundaries,transitions:j.transitions},u.updateQueue.baseState=$,u.memoizedState=$,u.flags&256){l=S3(Error(Ff(423)),u),u=RQ(f,u,y,_,l);break f}else if(y!==l){l=S3(Error(Ff(424)),u),u=RQ(f,u,y,_,l);break f}else for(Su=Y_(u.stateNode.containerInfo.firstChild),Pu=u,U0=!0,W1=null,_=nU(u,null,y,_),u.child=_;_;)_.flags=_.flags&-3|4096,_=_.sibling;else{if(T3(),y===l){u=f_(f,u,_);break f}zu(f,u,y,_)}u=u.child}return u;case 5:return oU(u),f===null&&R9(u),y=u.type,l=u.pendingProps,$=f!==null?f.memoizedProps:null,j=l.children,M9(y,l)?j=null:$!==null&&M9(y,$)&&(u.flags|=32),OW(f,u),zu(f,u,j,_),u.child;case 6:return f===null&&R9(u),null;case 13:return NW(f,u,_);case 4:return N7(u,u.stateNode.containerInfo),y=u.pendingProps,f===null?u.child=M3(u,null,y,_):zu(f,u,y,_),u.child;case 11:return y=u.type,l=u.pendingProps,l=u.elementType===y?l:Q1(y,l),SQ(f,u,y,l,_);case 7:return zu(f,u,u.pendingProps,_),u.child;case 8:return zu(f,u,u.pendingProps.children,_),u.child;case 12:return zu(f,u,u.pendingProps.children,_),u.child;case 10:f:{if(y=u.type._context,l=u.pendingProps,$=u.memoizedProps,j=l.value,l0(m8,y._currentValue),y._currentValue=j,$!==null)if(K1($.value,j)){if($.children===l.children&&!Ou.current){u=f_(f,u,_);break f}}else for($=u.child,$!==null&&($.return=u);$!==null;){var J=$.dependencies;if(J!==null){j=$.child;for(var F=J.firstContext;F!==null;){if(F.context===y){if($.tag===1){F=o1(-1,_&-_),F.tag=2;var Q=$.updateQueue;if(Q!==null){Q=Q.shared;var U=Q.pending;U===null?F.next=F:(F.next=U.next,U.next=F),Q.pending=F}}$.lanes|=_,F=$.alternate,F!==null&&(F.lanes|=_),x9($.return,_,u),J.lanes|=_;break}F=F.next}}else if($.tag===10)j=$.type===u.type?null:$.child;else if($.tag===18){if(j=$.return,j===null)throw Error(Ff(341));j.lanes|=_,J=j.alternate,J!==null&&(J.lanes|=_),x9(j,_,u),j=$.sibling}else j=$.child;if(j!==null)j.return=$;else for(j=$;j!==null;){if(j===u){j=null;break}if($=j.sibling,$!==null){$.return=j.return,j=$;break}j=j.return}$=j}zu(f,u,l.children,_),u=u.child}return u;case 9:return l=u.type,y=u.pendingProps.children,Y3(u,_),l=eu(l),y=y(l),u.flags|=1,zu(f,u,y,_),u.child;case 14:return y=u.type,l=Q1(y,u.pendingProps),l=Q1(y.type,l),PQ(f,u,y,l,_);case 15:return VW(f,u,u.type,u.pendingProps,_);case 17:return y=u.type,l=u.pendingProps,l=u.elementType===y?l:Q1(y,l),B8(f,u),u.tag=1,Xu(y)?(f=!0,I8(u)):f=!1,Y3(u,_),ZW(u,y,l),b9(u,y,l,_),c9(null,u,y,!0,f,_);case 19:return LW(f,u,_);case 22:return EW(f,u,_)}throw Error(Ff(156,u.tag))};function IW(f,u){return zU(f,u)}function FO(f,u,_,y){this.tag=f,this.key=_,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=y,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function au(f,u,_,y){return new FO(f,u,_,y)}function b7(f){return f=f.prototype,!(!f||!f.isReactComponent)}function AO(f){if(typeof f==="function")return b7(f)?1:0;if(f!==void 0&&f!==null){if(f=f.$$typeof,f===y7)return 11;if(f===l7)return 14}return 2}function T_(f,u){var _=f.alternate;return _===null?(_=au(f.tag,u,f.key,f.mode),_.elementType=f.elementType,_.type=f.type,_.stateNode=f.stateNode,_.alternate=f,f.alternate=_):(_.pendingProps=u,_.type=f.type,_.flags=0,_.subtreeFlags=0,_.deletions=null),_.flags=f.flags&14680064,_.childLanes=f.childLanes,_.lanes=f.lanes,_.child=f.child,_.memoizedProps=f.memoizedProps,_.memoizedState=f.memoizedState,_.updateQueue=f.updateQueue,u=f.dependencies,_.dependencies=u===null?null:{lanes:u.lanes,firstContext:u.firstContext},_.sibling=f.sibling,_.index=f.index,_.ref=f.ref,_}function T8(f,u,_,y,l,$){var j=2;if(y=f,typeof f==="function")b7(f)&&(j=1);else if(typeof f==="string")j=5;else f:switch(f){case Q3:return Vy(_.children,l,$,u);case _7:j=8,l|=8;break;case j9:return f=au(12,_,u,l|2),f.elementType=j9,f.lanes=$,f;case J9:return f=au(13,_,u,l),f.elementType=J9,f.lanes=$,f;case F9:return f=au(19,_,u,l),f.elementType=F9,f.lanes=$,f;case oQ:return Q4(_,l,$,u);default:if(typeof f==="object"&&f!==null)switch(f.$$typeof){case tQ:j=10;break f;case sQ:j=9;break f;case y7:j=11;break f;case l7:j=14;break f;case Z_:j=16,y=null;break f}throw Error(Ff(130,f==null?f:typeof f,""))}return u=au(j,_,u,l),u.elementType=f,u.type=y,u.lanes=$,u}function Vy(f,u,_,y){return f=au(7,f,y,u),f.lanes=_,f}function Q4(f,u,_,y){return f=au(22,f,y,u),f.elementType=oQ,f.lanes=_,f.stateNode={isHidden:!1},f}function y9(f,u,_){return f=au(6,f,null,u),f.lanes=_,f}function l9(f,u,_){return u=au(4,f.children!==null?f.children:[],f.key,u),u.lanes=_,u.stateNode={containerInfo:f.containerInfo,pendingChildren:null,implementation:f.implementation},u}function QO(f,u,_,y,l){this.tag=u,this.containerInfo=f,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=p2(0),this.expirationTimes=p2(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=p2(0),this.identifierPrefix=y,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function h7(f,u,_,y,l,$,j,J,F){return f=new QO(f,u,_,J,F),u===1?(u=1,$===!0&&(u|=8)):u=0,$=au(3,null,null,u),f.current=$,$.stateNode=f,$.memoizedState={element:y,isDehydrated:_,cache:null,transitions:null,pendingSuspenseBoundaries:null},X7($),f}function UO(f,u,_){var y=3{function iW(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=="function")return;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(iW)}catch(f){console.error(f)}}iW(),gW.exports=kW()});var tW=Mu((k7)=>{var nW=m7();k7.createRoot=nW.createRoot,k7.hydrateRoot=nW.hydrateRoot;var ZO});var jG=Mu((h4)=>{var NN=I0(),LN=Symbol.for("react.element"),YN=Symbol.for("react.fragment"),BN=Object.prototype.hasOwnProperty,wN=NN.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,DN={key:!0,ref:!0,__self:!0,__source:!0};function $G(f,u,_){var y,l={},$=null,j=null;_!==void 0&&($=""+_),u.key!==void 0&&($=""+u.key),u.ref!==void 0&&(j=u.ref);for(y in u)BN.call(u,y)&&!DN.hasOwnProperty(y)&&(l[y]=u[y]);if(f&&f.defaultProps)for(y in u=f.defaultProps,u)l[y]===void 0&&(l[y]=u[y]);return{$$typeof:LN,type:f,key:$,ref:j,props:l,_owner:wN.current}}h4.Fragment=YN;h4.jsx=$G;h4.jsxs=$G});var FG=Mu((DS,JG)=>{JG.exports=jG()});var hK=Mu((bK)=>{var Jl=I0();function iB(f,u){return f===u&&(f!==0||1/f===1/u)||f!==f&&u!==u}var gB=typeof Object.is==="function"?Object.is:iB,nB=Jl.useState,tB=Jl.useEffect,sB=Jl.useLayoutEffect,oB=Jl.useDebugValue;function aB(f,u){var _=u(),y=nB({inst:{value:_,getSnapshot:u}}),l=y[0].inst,$=y[1];return sB(function(){l.value=_,l.getSnapshot=u,XF(l)&&$({inst:l})},[f,_,u]),tB(function(){return XF(l)&&$({inst:l}),f(function(){XF(l)&&$({inst:l})})},[f]),oB(_),_}function XF(f){var u=f.getSnapshot;f=f.value;try{var _=u();return!gB(f,_)}catch(y){return!0}}function dB(f,u){return u()}var eB=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?dB:aB;bK.useSyncExternalStore=Jl.useSyncExternalStore!==void 0?Jl.useSyncExternalStore:eB});var cK=Mu((Ob,IK)=>{IK.exports=hK()});var mK=Mu((pK)=>{var S5=I0(),fw=cK();function uw(f,u){return f===u&&(f!==0||1/f===1/u)||f!==f&&u!==u}var _w=typeof Object.is==="function"?Object.is:uw,yw=fw.useSyncExternalStore,lw=S5.useRef,$w=S5.useEffect,jw=S5.useMemo,Jw=S5.useDebugValue;pK.useSyncExternalStoreWithSelector=function(f,u,_,y,l){var $=lw(null);if($.current===null){var j={hasValue:!1,value:null};$.current=j}else j=$.current;$=jw(function(){function F(K){if(!Q){if(Q=!0,U=K,K=y(K),l!==void 0&&j.hasValue){var q=j.value;if(l(q,K))return z=q}return z=K}if(q=z,_w(U,K))return q;var V=y(K);if(l!==void 0&&l(q,V))return U=K,q;return U=K,z=V}var Q=!1,U,z,W=_===void 0?null:_;return[function(){return F(u())},W===null?void 0:function(){return F(W())}]},[u,_,y,l]);var J=yw(f,$[0],$[1]);return $w(function(){j.hasValue=!0,j.value=J},[J]),Jw(J),J}});var iK=Mu((Nb,kK)=>{kK.exports=mK()});var Q2=Sf(I0(),1),KH=Sf(tW(),1);var H4=Sf(I0(),1);class x3 extends Error{unideskRequestError=!0;meta;constructor(f,u){super(f);this.name="UniDeskRequestError",this.meta=u}}function qO(f){return new Promise((u)=>setTimeout(u,f))}function B$(f,u="操作失败"){return f instanceof Error?f.message:String(f||u)}function K4(f,u=500){if(f===null||f===void 0)return"";let _=typeof f==="string"?f:JSON.stringify(f),y=String(_||"").replace(/\s+/gu," ").trim();return y.length>u?`${y.slice(0,u)}...`:y}function HO(f){try{let u=typeof location<"u"&&location.origin?location.origin:"http://localhost";return new URL(f,u).toString()}catch{return f}}function sW(f){return String(f.method||"GET").toUpperCase()}function VO(f){if(f===null||f===void 0)return!1;if(typeof f!=="object")return!1;if(typeof Blob<"u"&&f instanceof Blob)return!1;if(typeof FormData<"u"&&f instanceof FormData)return!1;if(typeof URLSearchParams<"u"&&f instanceof URLSearchParams)return!1;if(typeof ArrayBuffer<"u"&&f instanceof ArrayBuffer)return!1;return!0}function oW(f){let u=new Headers(f.headers||{}),_=VO(f.body)?JSON.stringify(f.body):f.body;if(_&&!u.has("content-type")&&typeof _==="string")u.set("content-type","application/json");return{...f,credentials:f.credentials||"same-origin",body:_,headers:u}}function aW(f){if(f?.error&&typeof f.error==="object"&&typeof f.error.message==="string")return f.error.message;if(typeof f?.error==="string")return f.error;if(typeof f?.message==="string")return f.message;if(typeof f?.detail==="string")return f.detail;return""}function EO(f,u){if(!f||typeof f!=="object"||Array.isArray(f))return!1;return u.some((_)=>_!==!1&&f[_]===!1)}function L$(f,u,_,y,l={}){return{kind:f,method:_,url:HO(u),occurredAt:y.toISOString(),...l}}function Y$(f,u){if(!f)return"请求失败";return`HTTP ${f}${u?` ${u}`:""}`}function dW(f){try{return{body:f?JSON.parse(f):null,parseError:""}}catch(u){return{body:{text:f},parseError:B$(u,"parse failed")}}}async function Df(f,u={},_=0){let{failureFields:y=["ok"],strictJson:l=!1,retryInvalidJson:$=0,retryDelayMs:j=120,invalidJsonPrefix:J="服务返回了无效 JSON",invalidJsonPreview:F=!1,responsePreviewLength:Q=500,...U}=u,z=sW(U),W=new Date,K;try{K=await fetch(f,oW(U))}catch(O){let G=B$(O,"网络请求失败");throw new x3(G,L$("network",f,z,W,{upstreamMessage:G}))}let q=await K.text(),V=dW(q);if(V.parseError){if(l&&z==="GET"&&_<$)return await qO(j),Df(f,u,_+1);if(l){let O=F?`;响应预览:${K4(q,180)}`:"";throw new x3(`${J}(${q.length} bytes):${V.parseError}${O}`,L$("parse",f,z,W,{status:K.status,statusText:K.statusText,parseError:V.parseError,responsePreview:K4(q,Q)}))}}if(!K.ok||EO(V.body,y)){let O=aW(V.body),G=O||Y$(K.status,K.statusText);throw new x3(G,L$("http",f,z,W,{status:K.status,statusText:K.statusText,upstreamMessage:O,responsePreview:K4(V.parseError?q:V.body,Q)}))}return V.body}async function eW(f,u={}){let _=sW(u),y=new Date,l;try{l=await fetch(f,oW(u))}catch(Q){let U=B$(Q,"网络请求失败");throw new x3(U,L$("network",f,_,y,{upstreamMessage:U}))}if(l.ok)return l.blob();let $=await l.text(),j=dW($),J=aW(j.body),F=J||Y$(l.status,l.statusText);throw new x3(F,L$("http",f,_,y,{status:l.status,statusText:l.statusText,upstreamMessage:J,responsePreview:K4(j.parseError?$:j.body),parseError:j.parseError||void 0}))}function fz(f){return Boolean(f&&typeof f==="object"&&f.unideskRequestError===!0&&f.meta)}function OO(f){if(!f)return"";let u=new Date(f);if(Number.isNaN(u.getTime()))return f;return`${u.toLocaleString("zh-CN",{hour12:!1})} / ${u.toISOString()}`}function i7(f,u="操作失败"){if(fz(f)){let l=f.meta.kind==="parse"?"响应解析失败":f.meta.kind==="network"?"网络请求失败":f.meta.status&&(f.meta.status<200||f.meta.status>=300)?Y$(f.meta.status,f.meta.statusText):"应用请求失败",$=f.meta.status?Y$(f.meta.status):"",j=(F)=>!F||F===l||F===$,J=!j(f.message)?f.message:j(f.meta.upstreamMessage)?"":f.meta.upstreamMessage||"";return{title:l,message:J,status:f.meta.status,statusText:f.meta.statusText,method:f.meta.method,url:f.meta.url,occurredAt:OO(f.meta.occurredAt),responsePreview:f.meta.responsePreview,parseError:f.meta.parseError,structured:!0}}let y=B$(f,u).split(/\r?\n/u);return{title:y[0]||u,message:y.slice(1).join(` -`),structured:y.length>1}}function XO(f,u="操作失败"){let _=i7(f,u),y=[_.title];if(_.message)y.push(`原因: ${_.message}`);if(_.method||_.url)y.push(`请求: ${[_.method,_.url].filter(Boolean).join(" ")}`);if(_.status)y.push(`状态: ${Y$(_.status,_.statusText)}`);if(_.occurredAt)y.push(`时间: ${_.occurredAt}`);if(_.parseError)y.push(`解析错误: ${_.parseError}`);if(_.responsePreview&&_.responsePreview!==_.message)y.push(`响应预览: ${_.responsePreview}`);return y.filter(Boolean).join(` -`)}function Tf(f,u="操作失败"){return fz(f)?XO(f,u):B$(f,u)}var uz=Sf(I0(),1);var R_=uz.default.createElement;function w$(f,u){return u?[R_("dt",{key:`${f}-label`},f),R_("dd",{key:f},u)]:null}function H0({error:f,wide:u=!1,fallback:_="操作失败",className:y=""}){if(!f)return null;let l=i7(f,_),$=[w$("请求",[l.method,l.url].filter(Boolean).join(" ")),w$("状态",l.status?`HTTP ${l.status}${l.statusText?` ${l.statusText}`:""}`:""),w$("时间",l.occurredAt),w$("解析错误",l.parseError),w$("响应预览",l.responsePreview)].filter(Boolean);return R_("div",{className:`form-error unidesk-error${u?" wide":""}${y?` ${y}`:""}`,role:"alert","data-testid":"unidesk-error"},R_("div",{className:"unidesk-error-title"},R_("strong",null,l.title),l.status?R_("span",{className:"unidesk-error-code"},`HTTP ${l.status}`):null),l.message?R_("pre",{className:"unidesk-error-message"},l.message):null,$.length>0?R_("dl",{className:"unidesk-error-details"},$):null)}var i=H4.default.createElement,{useEffect:NO}=H4.default,Z4=H4.default.useState,wy={label:"主用户私聊账号",userId:645275593};function D$(f){if(!f)return"--";let u=new Date(f);if(Number.isNaN(u.getTime()))return"--";return u.toLocaleString("zh-CN",{hour12:!1})}function LO(f){return f.toLocaleTimeString("zh-CN",{hour12:!1})}function g7(f){let u=Number(f);return Number.isFinite(u)?u.toLocaleString("zh-CN"):"--"}async function __(f,u={}){return Df(f,{failureFields:["ok","success"],...u})}function q4({status:f,children:u}){let _=String(f||"unknown").toLowerCase();return i("span",{className:`status-badge ${_}`},u||f||"unknown")}function v3({label:f,value:u,hint:_,tone:y}){return i("article",{className:`metric-card ${y||""}`},i("div",{className:"metric-label"},f),i("div",{className:"metric-value"},u),i("div",{className:"metric-hint"},_))}function b3({title:f,eyebrow:u,actions:_,children:y,className:l}){return i("section",{className:`panel ${l||""}`},i("div",{className:"panel-head"},i("div",null,u?i("p",{className:"panel-eyebrow"},u):null,i("h2",null,f)),_?i("div",{className:"panel-actions"},_):null),i("div",{className:"panel-body"},y))}function T$({title:f,data:u,onOpen:_,testId:y}){return i("button",{type:"button",className:"ghost-btn","data-testid":y,onClick:(l)=>{l?.stopPropagation?.(),_(f,u)}},"查看原始JSON")}function M$({title:f,text:u}){return i("div",{className:"empty-state"},i("strong",null,f),i("span",null,u))}function YO(f){return f?.runtime&&typeof f.runtime==="object"&&!Array.isArray(f.runtime)?f.runtime:{}}function BO(f){return f?.backend&&typeof f.backend==="object"&&!Array.isArray(f.backend)?f.backend:{}}function wO(f){return f?.repository&&typeof f.repository==="object"&&!Array.isArray(f.repository)?f.repository:{}}function x_(f,u){return`${f}/microservices/claudeqq/proxy${u}`}function DO(f){return Array.isArray(f?.events)?f.events.slice(0,80):[]}function TO(f){return Array.isArray(f?.subscriptions)?f.subscriptions.slice(0,50):[]}function MO(f){return Array.isArray(f?.messages)?f.messages.slice(0,30):[]}function _z(f){let u=f?.text??f?.message??f?.raw?.raw_message;if(typeof u!=="string")return"--";return u.length>180?`${u.slice(0,177)}...`:u}function yz(f){let u=f?.groupId??f?.group_id??(f?.message_type==="group"?f?.target_id:void 0),_=f?.userId??f?.user_id??(f?.message_type==="private"?f?.target_id:void 0);if(u)return`群 ${u}`;if(_)return`私聊 ${_}`;return"--"}function lz({microservices:f,onRaw:u,apiBaseUrl:_="/api"}){let y=f.find((r)=>r.id==="claudeqq")||null,[l,$]=Z4({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}),[j,J]=Z4({targetType:"private",targetId:String(wy.userId),message:""}),[F,Q]=Z4({name:"unidesk-callback",targetUrl:"",eventTypes:"message",secret:""}),[U,z]=Z4("");async function W(){if(!y)return;$((r)=>({...r,loading:!0,error:""}));try{let[r,Y,v,m,c]=await Promise.all([__(`${_}/microservices/claudeqq/health`),__(x_(_,"/api/server/status")),__(x_(_,"/api/events/recent?limit=60")),__(x_(_,"/api/events/subscriptions")),__(x_(_,"/api/messages/sent?limit=20"))]);if($((o)=>({...o,loading:!1,error:"",health:r,status:Y,events:v,subscriptions:m,sent:c,refreshedAt:new Date})),!l.qrcodeFetched)K(!1)}catch(r){$((Y)=>({...Y,loading:!1,error:Tf(r,"ClaudeQQ 加载失败")}))}}async function K(r=!0){if(!y)return;$((Y)=>({...Y,qrLoading:!0,error:r?"":Y.error}));try{let Y=await __(x_(_,"/api/napcat/login")),v=Y?.napcat?.qrcode||Y?.qrcode||null;$((m)=>({...m,qrLoading:!1,error:"",napcatLogin:Y,napcatQrcode:v,qrcodeFetched:!0,qrcodeRefreshedAt:new Date}))}catch(Y){$((v)=>({...v,qrLoading:!1,error:r||!v.napcatQrcode?Tf(Y,"NapCat 二维码加载失败"):v.error}))}}async function q(r){r.preventDefault(),z("");let Y=Number(j.targetId);if(!Number.isFinite(Y)||Y<=0||j.message.trim().length===0){$((v)=>({...v,error:"请填写 QQ 目标和消息内容"}));return}try{await __(x_(_,"/api/push/text"),{method:"POST",body:JSON.stringify({userId:j.targetType==="private"?Y:void 0,groupId:j.targetType==="group"?Y:void 0,message:j.message})}),J((v)=>({...v,targetType:"private",targetId:String(wy.userId),message:""})),z("消息推送请求已提交"),await W()}catch(v){$((m)=>({...m,error:Tf(v,"发送失败")}))}}async function V(r){if(r.preventDefault(),z(""),F.targetUrl.trim().length===0){$((Y)=>({...Y,error:"请填写订阅回调 URL"}));return}try{await __(x_(_,"/api/events/subscriptions"),{method:"POST",body:JSON.stringify({name:F.name,targetUrl:F.targetUrl,eventTypes:F.eventTypes.split(",").map((Y)=>Y.trim()).filter(Boolean),secret:F.secret||void 0,enabled:!0})}),z("事件订阅已创建"),await W()}catch(Y){$((v)=>({...v,error:Tf(Y,"订阅失败")}))}}async function O(r){if(!r)return;z("");try{await __(x_(_,`/api/events/subscriptions/${encodeURIComponent(r)}`),{method:"DELETE"}),z("事件订阅已删除"),await W()}catch(Y){$((v)=>({...v,error:Tf(Y,"删除订阅失败")}))}}if(NO(()=>{if(!y)return;W();return},[y?.id,y?.runtime?.providerStatus]),!y)return i(M$,{title:"ClaudeQQ 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=claudeqq"});let G=YO(y),H=wO(y),Z=BO(y),E=l.health||{},L=l.status||{},M=l.napcatLogin||{},N=E.napcat||L.napcat||{},w={...M.napcat||{},...N,qrcode:l.napcatQrcode||{},webui:N.webui||M.napcat?.webui},R=M.login||{},p=l.napcatQrcode||{},x=DO(l.events),C=TO(l.subscriptions),P=MO(l.sent),D=Boolean(w.httpConnected||R.ready),T=String(w.loginState||R.state||(D?"logged_in":"unknown")),S=Boolean(p.available&&p.dataUrl);return i("div",{className:"claudeqq-page","data-testid":"claudeqq-page"},i(b3,{title:"ClaudeQQ 工作台",eyebrow:"D601 QQ Event Gateway",actions:i("div",{className:"panel-actions"},i("button",{type:"button",className:"ghost-btn",onClick:W,disabled:l.loading,"data-testid":"claudeqq-refresh-button"},l.loading?"刷新中":"刷新"),i(T$,{title:"ClaudeQQ 用户服务",data:y,onOpen:u,testId:"raw-claudeqq-service"}))},i("div",{className:"findjob-hero"},i("div",null,i("div",{className:"node-version-line"},i(q4,{status:G.providerStatus==="online"?"online":"warn"},G.providerStatus||"unknown"),i("span",null,y.providerId),i("span",null,Z.public?"公网暴露":"仅 UniDesk frontend 代理访问")),i("p",{className:"muted paragraph"},y.description)),i("div",{className:"microservice-ref-card"},i("span",null,"Repo"),i("strong",null,H.url||"--"),i("code",null,H.commitId||"--")),i("div",{className:"microservice-ref-card"},i("span",null,"D601 Docker"),i("strong",null,`${Z.nodeBindHost||"--"}:${Z.nodePort||"--"}`),i("code",null,`${H.composeFile||"--"} / ${H.composeService||"--"}`))),i(H0,{error:l.error,wide:!0}),U?i("div",{className:"form-success wide"},U):null),i("div",{className:"metric-grid"},i(v3,{label:"Health",value:E.ok||E.status==="ok"?"OK":"--",hint:"D601 /health",tone:E.ok||E.status==="ok"?"ok":"warn"}),i(v3,{label:"NapCat HTTP",value:w.httpConnected||w.http?.connected?"OK":"离线",hint:`${w.httpHost||E.napcat?.httpHost||"--"}:${w.httpPort||E.napcat?.httpPort||"--"}`}),i(v3,{label:"NapCat WS",value:w.wsConnected||w.ws?.connected?"OK":"离线",hint:`${w.wsHost||E.napcat?.wsHost||"--"}:${w.wsPort||E.napcat?.wsPort||"--"}`}),i(v3,{label:"事件缓存",value:g7(l.events?.count??x.length),hint:"recent QQ events"}),i(v3,{label:"订阅",value:g7(l.subscriptions?.count??C.length),hint:"webhook subscribers"}),i(v3,{label:"已发送",value:g7(l.sent?.count??P.length),hint:"sent message log"})),i("div",{className:"findjob-grid"},i(b3,{title:"NapCat 容器登录",eyebrow:"QR Login",className:"claudeqq-login-panel",actions:i("div",{className:"panel-actions inline-actions"},i("button",{type:"button",className:"ghost-btn",onClick:()=>K(!0),disabled:l.qrLoading,"data-testid":"claudeqq-napcat-refresh"},l.qrLoading?"刷新中":"手动刷新二维码"),i(T$,{title:"NapCat Login",data:l.napcatLogin,onOpen:u,testId:"raw-claudeqq-napcat-login"}))},i("div",{className:"claudeqq-login-card","data-testid":"claudeqq-napcat-login"},i("div",{className:"claudeqq-qr-frame"},S?i("img",{src:p.dataUrl,alt:"NapCat QQ 登录二维码","data-testid":"claudeqq-napcat-qrcode"}):i(M$,{title:"等待二维码",text:"NapCat 容器启动后会把登录二维码写入 cache/qrcode.png"})),i("div",{className:"claudeqq-login-copy"},i("div",{className:"node-version-line"},i(q4,{status:D?"online":S?"warn":"unknown"},D?"已登录":S?"待扫码":"等待二维码"),i("span",null,T),i("span",null,"D601 containerized")),i("p",{className:"muted paragraph"},D?"NapCat 已登录,ClaudeQQ 可通过容器内 HTTP/WS 链路收发 QQ 消息。":"用手机 QQ 扫描二维码授权登录。二维码只在首次加载或手动刷新时更新,D601 的 NapCat 端口仍只绑定 127.0.0.1。"),i("div",{className:"microservice-ref-card"},i("span",null,"NapCat WebUI"),i("strong",null,w.webui?.url||"http://napcat:6099/webui"),i("code",null,"local-only / proxied QR login")),i("div",{className:"microservice-ref-card"},i("span",null,"QR Source"),i("strong",null,p.modifiedAt?D$(p.modifiedAt):l.qrcodeRefreshedAt?D$(l.qrcodeRefreshedAt):"--"),i("code",null,p.file||"/napcat/cache/qrcode.png"))))),i(b3,{title:"消息推送",eyebrow:"Push API"},i("div",{className:"microservice-ref-card"},i("span",null,wy.label),i("strong",null,String(wy.userId)),i("code",null,"private userId / 默认推送测试目标")),i("form",{className:"stack-form",onSubmit:q,"data-testid":"claudeqq-push-form"},i("label",null,"目标类型",i("select",{value:j.targetType,onChange:(r)=>J((Y)=>({...Y,targetType:r.target.value}))},i("option",{value:"private"},"私聊 userId"),i("option",{value:"group"},"群 groupId"))),i("label",null,"QQ ID",i("input",{value:j.targetId,onChange:(r)=>J((Y)=>({...Y,targetId:r.target.value})),placeholder:String(wy.userId)})),i("label",null,"消息内容",i("textarea",{value:j.message,onChange:(r)=>J((Y)=>({...Y,message:r.target.value})),rows:4,placeholder:"通过 ClaudeQQ 推送一条 QQ 消息"})),i("button",{type:"submit",className:"primary-btn"},"发送 QQ 消息")),i("p",{className:"muted paragraph"},`主 server 和其他用户服务可通过 UniDesk 同源代理调用 /api/push/text;当前人工推送测试默认使用 ${wy.label} ${wy.userId},不需要暴露 D601 后端端口。`)),i(b3,{title:"QQ 事件订阅",eyebrow:"Webhook Subscription"},i("form",{className:"stack-form",onSubmit:V,"data-testid":"claudeqq-subscription-form"},i("label",null,"订阅名称",i("input",{value:F.name,onChange:(r)=>Q((Y)=>({...Y,name:r.target.value}))})),i("label",null,"回调 URL",i("input",{value:F.targetUrl,onChange:(r)=>Q((Y)=>({...Y,targetUrl:r.target.value})),placeholder:"http://host.docker.internal:18080/..."})),i("label",null,"事件类型",i("input",{value:F.eventTypes,onChange:(r)=>Q((Y)=>({...Y,eventTypes:r.target.value})),placeholder:"message,notice"})),i("label",null,"签名密钥",i("input",{value:F.secret,onChange:(r)=>Q((Y)=>({...Y,secret:r.target.value})),placeholder:"可选,生成 x-claudeqq-signature"})),i("button",{type:"submit",className:"primary-btn"},"创建订阅")),C.length===0?i(M$,{title:"暂无订阅",text:"可以为 main server 或其他用户服务注册 HTTP webhook"}):i("div",{className:"table-wrap","data-testid":"claudeqq-subscription-table"},i("table",null,i("thead",null,i("tr",null,i("th",null,"名称"),i("th",null,"状态"),i("th",null,"事件"),i("th",null,"回调"),i("th",null,"最近投递"),i("th",null,"操作"))),i("tbody",null,C.map((r)=>i("tr",{key:r.id},i("td",null,i("strong",null,r.name||r.id),i("code",null,r.id||"--")),i("td",null,i(q4,{status:r.enabled?"online":"warn"},r.enabled?"enabled":"disabled")),i("td",null,Array.isArray(r.eventTypes)?r.eventTypes.join(", "):"message"),i("td",null,r.targetUrl||"--"),i("td",null,r.lastDelivery?`${r.lastDelivery.ok?"OK":"FAIL"} ${D$(r.lastDelivery.at)}`:"--"),i("td",null,i("button",{type:"button",className:"ghost-btn",onClick:()=>O(r.id)},"删除"))))))),i("div",{className:"panel-actions inline-actions"},i(T$,{title:"ClaudeQQ Subscriptions",data:l.subscriptions,onOpen:u,testId:"raw-claudeqq-subscriptions"}))),i(b3,{title:"最近 QQ 事件",eyebrow:l.refreshedAt?`Updated ${LO(l.refreshedAt)}`:"Event Stream"},x.length===0?i(M$,{title:"暂无事件",text:"等待 NapCat WebSocket 上报 QQ 消息事件,或通过订阅 API 消费后续事件"}):i("div",{className:"table-wrap","data-testid":"claudeqq-event-list"},i("table",null,i("thead",null,i("tr",null,i("th",null,"时间"),i("th",null,"类型"),i("th",null,"会话"),i("th",null,"消息"),i("th",null,"ID"))),i("tbody",null,x.map((r)=>i("tr",{key:r.id},i("td",null,D$(r.receivedAt||r.timestamp)),i("td",null,i(q4,{status:r.postType||r.eventType},r.postType||r.eventType||"--")),i("td",null,yz(r)),i("td",null,_z(r)),i("td",null,i("code",null,r.messageId||r.id||"--"))))))),i("div",{className:"panel-actions inline-actions"},i(T$,{title:"ClaudeQQ Events",data:l.events,onOpen:u,testId:"raw-claudeqq-events"}))),i(b3,{title:"已发送消息",eyebrow:`${P.length} Sent`},P.length===0?i(M$,{title:"暂无发送记录",text:"发送日志来自 ClaudeQQ bot_workspace/messages/sent_messages.jsonl"}):i("div",{className:"table-wrap"},i("table",null,i("thead",null,i("tr",null,i("th",null,"时间"),i("th",null,"目标"),i("th",null,"消息"),i("th",null,"结果"))),i("tbody",null,P.map((r,Y)=>i("tr",{key:r.id||Y},i("td",null,D$(r.timestamp||r.sentAt||r.createdAt)),i("td",null,yz(r)),i("td",null,_z(r)),i("td",null,r.status||r.messageId||r.message_id||"--")))))),i("div",{className:"panel-actions inline-actions"},i(T$,{title:"ClaudeQQ Sent Messages",data:l.sent,onOpen:u,testId:"raw-claudeqq-sent"})))))}var D4=Sf(I0(),1);var uj=Sf(I0(),1),Lf=uj.default.createElement,{useEffect:rO,useRef:$z}=uj.default;function SO(f,u){return Xz(f.toTrace(u))}function zz(f){if(!f)return"--";let u=new Date(f);if(Number.isNaN(u.getTime()))return"--";return u.toLocaleString("zh-CN",{hour12:!1})}function PO(f){let u=Number(f);if(!Number.isFinite(u)||u<0)return"--";let _=Math.floor(u/1000),y=Math.floor(_/3600),l=Math.floor(_%3600/60),$=_%60;if(y>0)return`${y}h ${String(l).padStart(2,"0")}m`;if(l>0)return`${l}m ${String($).padStart(2,"0")}s`;return`${$}s`}function Dy(f){let u=Number(f);return Number.isFinite(u)&&u>=0?u:null}function Gz(f,u=180){let _=String(f||"").replace(/\s+/gu," ").trim();return _.length>u?`${_.slice(0,u-1)}…`:_}function CO(f){if(!f)return 0;return f.split(/\r?\n/u).length}function a7(f){return{ran:"Ran",explored:"Explored",edited:"Edited",toolGroup:"Tool calls",plan:"Plan",message:"Message",system:"System",error:"Error"}[f]||"Message"}function d7(f){let u=Number(f||0);return Number.isFinite(u)&&u>0?`… +${Math.floor(u)} lines`:""}function RO(f){return(Array.isArray(f)?f:[]).reduce((u,_)=>Math.max(u,Number(_?.seq??0)),0)}function jz(f){return["explored","edited","ran"].includes(String(f?.kind||""))}function Kz(f){let u={read:0,edit:0,run:0};for(let _ of f){let y=String(_?.kind||"");if(y==="explored")u.read+=1;else if(y==="edited")u.edit+=1;else if(y==="ran")u.run+=1}return u}function Zz(f){let u=Kz(f);return`${u.read} read, ${u.edit} edit, ${u.run} run`}function qz(f){return f.replace(/^['"`([{<]+/u,"").replace(/['"`)\]}>.,;:]+$/u,"").replace(/:\d+(?::\d+)?$/u,"").trim()}function Jz(f){let _=String(f||"").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)||[],y=[];for(let l of _){let $=qz(l);if($.length<2||$.includes("..."))continue;if(/^(http|https|status|method)$/iu.test($))continue;if(!y.includes($))y.push($)}return y}function n7(f,u=4){if(f.length===0)return"--";let _=f.slice(0,u).join(", ");return f.length>u?`${_} +${f.length-u}`:_}function Fz(f){let u="";for(let _ of f){if(_.length===0)continue;if(u.length>0&&!u.endsWith(` +(()=>{var dH=Object.create;var{getPrototypeOf:eH,defineProperty:NQ,getOwnPropertyNames:fE}=Object;var uE=Object.prototype.hasOwnProperty;function _E(f){return this[f]}var yE,$E,rf=(f,u,_)=>{var y=f!=null&&typeof f==="object";if(y){var $=u?yE??=new WeakMap:$E??=new WeakMap,l=$.get(f);if(l)return l}_=f!=null?dH(eH(f)):{};let j=u||!f||!f.__esModule?NQ(_,"default",{value:f,enumerable:!0}):_;for(let J of fE(f))if(!uE.call(j,J))NQ(j,J,{get:_E.bind(f,J),enumerable:!0});if(y)$.set(f,j);return j};var Mu=(f,u)=>()=>(u||f((u={exports:{}}).exports,u),u.exports);var pf=((f)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(f,{get:(u,_)=>(typeof require<"u"?require:u)[_]}):f)(function(f){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+f+'" is not supported')});var RQ=Mu((bf)=>{var M$=Symbol.for("react.element"),lE=Symbol.for("react.portal"),jE=Symbol.for("react.fragment"),JE=Symbol.for("react.strict_mode"),FE=Symbol.for("react.profiler"),QE=Symbol.for("react.provider"),AE=Symbol.for("react.context"),UE=Symbol.for("react.forward_ref"),WE=Symbol.for("react.suspense"),zE=Symbol.for("react.memo"),GE=Symbol.for("react.lazy"),LQ=Symbol.iterator;function KE(f){if(f===null||typeof f!=="object")return null;return f=LQ&&f[LQ]||f["@@iterator"],typeof f==="function"?f:null}var wQ={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},DQ=Object.assign,TQ={};function J3(f,u,_){this.props=f,this.context=u,this.refs=TQ,this.updater=_||wQ}J3.prototype.isReactComponent={};J3.prototype.setState=function(f,u){if(typeof f!=="object"&&typeof f!=="function"&&f!=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,f,u,"setState")};J3.prototype.forceUpdate=function(f){this.updater.enqueueForceUpdate(this,f,"forceUpdate")};function MQ(){}MQ.prototype=J3.prototype;function w2(f,u,_){this.props=f,this.context=u,this.refs=TQ,this.updater=_||wQ}var D2=w2.prototype=new MQ;D2.constructor=w2;DQ(D2,J3.prototype);D2.isPureReactComponent=!0;var YQ=Array.isArray,SQ=Object.prototype.hasOwnProperty,T2={current:null},rQ={key:!0,ref:!0,__self:!0,__source:!0};function PQ(f,u,_){var y,$={},l=null,j=null;if(u!=null)for(y in u.ref!==void 0&&(j=u.ref),u.key!==void 0&&(l=""+u.key),u)SQ.call(u,y)&&!rQ.hasOwnProperty(y)&&($[y]=u[y]);var J=arguments.length-2;if(J===1)$.children=_;else if(1{xQ.exports=RQ()});var mQ=Mu((y0)=>{function r2(f,u){var _=f.length;f.push(u);f:for(;0<_;){var y=_-1>>>1,$=f[y];if(0>>1;yf8(J,_))F<$&&0>f8(A,J)?(f[y]=A,f[F]=_,y=F):(f[y]=J,f[j]=_,y=j);else if(F<$&&0>f8(A,_))f[y]=A,f[F]=_,y=F;else break f}}return u}function f8(f,u){var _=f.sortIndex-u.sortIndex;return _!==0?_:f.id-u.id}if(typeof performance==="object"&&typeof performance.now==="function")P2=performance,y0.unstable_now=function(){return P2.now()};else u8=Date,C2=u8.now(),y0.unstable_now=function(){return u8.now()-C2};var P2,u8,C2,w1=[],G_=[],VE=1,tu=null,fu=3,l8=!1,Uy=!1,r$=!1,bQ=typeof setTimeout==="function"?setTimeout:null,hQ=typeof clearTimeout==="function"?clearTimeout:null,vQ=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function R2(f){for(var u=F1(G_);u!==null;){if(u.callback===null)$8(G_);else if(u.startTime<=f)$8(G_),u.sortIndex=u.expirationTime,r2(w1,u);else break;u=F1(G_)}}function v2(f){if(r$=!1,R2(f),!Uy)if(F1(w1)!==null)Uy=!0,h2(b2);else{var u=F1(G_);u!==null&&I2(v2,u.startTime-f)}}function b2(f,u){Uy=!1,r$&&(r$=!1,hQ(P$),P$=-1),l8=!0;var _=fu;try{R2(u);for(tu=F1(w1);tu!==null&&(!(tu.expirationTime>u)||f&&!pQ());){var y=tu.callback;if(typeof y==="function"){tu.callback=null,fu=tu.priorityLevel;var $=y(tu.expirationTime<=u);u=y0.unstable_now(),typeof $==="function"?tu.callback=$:tu===F1(w1)&&$8(w1),R2(u)}else $8(w1);tu=F1(w1)}if(tu!==null)var l=!0;else{var j=F1(G_);j!==null&&I2(v2,j.startTime-u),l=!1}return l}finally{tu=null,fu=_,l8=!1}}var j8=!1,_8=null,P$=-1,IQ=5,cQ=-1;function pQ(){return y0.unstable_now()-cQf||125y?(f.sortIndex=_,r2(G_,f),F1(w1)===null&&f===F1(G_)&&(r$?(hQ(P$),P$=-1):r$=!0,I2(v2,_-y))):(f.sortIndex=$,r2(w1,f),Uy||l8||(Uy=!0,h2(b2))),f};y0.unstable_shouldYield=pQ;y0.unstable_wrapCallback=function(f){var u=fu;return function(){var _=fu;fu=u;try{return f.apply(this,arguments)}finally{fu=_}}}});var iQ=Mu((Gr,kQ)=>{kQ.exports=mQ()});var nW=Mu((xu)=>{var OE=I0(),Cu=iQ();function Ff(f){for(var u="https://reactjs.org/docs/error-decoder.html?invariant="+f,_=1;_"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),F9=Object.prototype.hasOwnProperty,XE=/^[: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]*$/,gQ={},nQ={};function NE(f){if(F9.call(nQ,f))return!0;if(F9.call(gQ,f))return!1;if(XE.test(f))return nQ[f]=!0;return gQ[f]=!0,!1}function LE(f,u,_,y){if(_!==null&&_.type===0)return!1;switch(typeof u){case"function":case"symbol":return!0;case"boolean":if(y)return!1;if(_!==null)return!_.acceptsBooleans;return f=f.toLowerCase().slice(0,5),f!=="data-"&&f!=="aria-";default:return!1}}function YE(f,u,_,y){if(u===null||typeof u>"u"||LE(f,u,_,y))return!0;if(y)return!1;if(_!==null)switch(_.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 Ku(f,u,_,y,$,l,j){this.acceptsBooleans=u===2||u===3||u===4,this.attributeName=y,this.attributeNamespace=$,this.mustUseProperty=_,this.propertyName=f,this.type=u,this.sanitizeURL=l,this.removeEmptyString=j}var s0={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(f){s0[f]=new Ku(f,0,!1,f,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(f){var u=f[0];s0[u]=new Ku(u,1,!1,f[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(f){s0[f]=new Ku(f,2,!1,f.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(f){s0[f]=new Ku(f,2,!1,f,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(f){s0[f]=new Ku(f,3,!1,f.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(f){s0[f]=new Ku(f,3,!0,f,null,!1,!1)});["capture","download"].forEach(function(f){s0[f]=new Ku(f,4,!1,f,null,!1,!1)});["cols","rows","size","span"].forEach(function(f){s0[f]=new Ku(f,6,!1,f,null,!1,!1)});["rowSpan","start"].forEach(function(f){s0[f]=new Ku(f,5,!1,f.toLowerCase(),null,!1,!1)});var _7=/[\-:]([a-z])/g;function y7(f){return f[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(f){var u=f.replace(_7,y7);s0[u]=new Ku(u,1,!1,f,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(f){var u=f.replace(_7,y7);s0[u]=new Ku(u,1,!1,f,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(f){var u=f.replace(_7,y7);s0[u]=new Ku(u,1,!1,f,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(f){s0[f]=new Ku(f,1,!1,f.toLowerCase(),null,!1,!1)});s0.xlinkHref=new Ku("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(f){s0[f]=new Ku(f,1,!1,f.toLowerCase(),null,!0,!0)});function $7(f,u,_,y){var $=s0.hasOwnProperty(u)?s0[u]:null;if($!==null?$.type!==0:y||!(2J||$[j]!==l[J]){var F=` +`+$[j].replace(" at new "," at ");return f.displayName&&F.includes("")&&(F=F.replace("",f.displayName)),F}while(1<=j&&0<=J);break}}}finally{p2=!1,Error.prepareStackTrace=_}return(f=f?f.displayName||f.name:"")?c$(f):""}function BE(f){switch(f.tag){case 5:return c$(f.type);case 16:return c$("Lazy");case 13:return c$("Suspense");case 19:return c$("SuspenseList");case 0:case 2:case 15:return f=m2(f.type,!1),f;case 11:return f=m2(f.type.render,!1),f;case 1:return f=m2(f.type,!0),f;default:return""}}function W9(f){if(f==null)return null;if(typeof f==="function")return f.displayName||f.name||null;if(typeof f==="string")return f;switch(f){case U3:return"Fragment";case A3:return"Portal";case Q9:return"Profiler";case l7:return"StrictMode";case A9:return"Suspense";case U9:return"SuspenseList"}if(typeof f==="object")switch(f.$$typeof){case dA:return(f.displayName||"Context")+".Consumer";case aA:return(f._context.displayName||"Context")+".Provider";case j7:var u=f.render;return f=f.displayName,f||(f=u.displayName||u.name||"",f=f!==""?"ForwardRef("+f+")":"ForwardRef"),f;case J7:return u=f.displayName||null,u!==null?u:W9(f.type)||"Memo";case Z_:u=f._payload,f=f._init;try{return W9(f(u))}catch(_){}}return null}function wE(f){var u=f.type;switch(f.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 f=u.render,f=f.displayName||f.name||"",u.displayName||(f!==""?"ForwardRef("+f+")":"ForwardRef");case 7:return"Fragment";case 5:return u;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return W9(u);case 8:return u===l7?"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 M_(f){switch(typeof f){case"boolean":case"number":case"string":case"undefined":return f;case"object":return f;default:return""}}function fU(f){var u=f.type;return(f=f.nodeName)&&f.toLowerCase()==="input"&&(u==="checkbox"||u==="radio")}function DE(f){var u=fU(f)?"checked":"value",_=Object.getOwnPropertyDescriptor(f.constructor.prototype,u),y=""+f[u];if(!f.hasOwnProperty(u)&&typeof _<"u"&&typeof _.get==="function"&&typeof _.set==="function"){var{get:$,set:l}=_;return Object.defineProperty(f,u,{configurable:!0,get:function(){return $.call(this)},set:function(j){y=""+j,l.call(this,j)}}),Object.defineProperty(f,u,{enumerable:_.enumerable}),{getValue:function(){return y},setValue:function(j){y=""+j},stopTracking:function(){f._valueTracker=null,delete f[u]}}}}function F8(f){f._valueTracker||(f._valueTracker=DE(f))}function uU(f){if(!f)return!1;var u=f._valueTracker;if(!u)return!0;var _=u.getValue(),y="";return f&&(y=fU(f)?f.checked?"true":"false":f.value),f=y,f!==_?(u.setValue(f),!0):!1}function P8(f){if(f=f||(typeof document<"u"?document:void 0),typeof f>"u")return null;try{return f.activeElement||f.body}catch(u){return f.body}}function z9(f,u){var _=u.checked;return q0({},u,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:_!=null?_:f._wrapperState.initialChecked})}function sQ(f,u){var _=u.defaultValue==null?"":u.defaultValue,y=u.checked!=null?u.checked:u.defaultChecked;_=M_(u.value!=null?u.value:_),f._wrapperState={initialChecked:y,initialValue:_,controlled:u.type==="checkbox"||u.type==="radio"?u.checked!=null:u.value!=null}}function _U(f,u){u=u.checked,u!=null&&$7(f,"checked",u,!1)}function G9(f,u){_U(f,u);var _=M_(u.value),y=u.type;if(_!=null)if(y==="number"){if(_===0&&f.value===""||f.value!=_)f.value=""+_}else f.value!==""+_&&(f.value=""+_);else if(y==="submit"||y==="reset"){f.removeAttribute("value");return}u.hasOwnProperty("value")?K9(f,u.type,_):u.hasOwnProperty("defaultValue")&&K9(f,u.type,M_(u.defaultValue)),u.checked==null&&u.defaultChecked!=null&&(f.defaultChecked=!!u.defaultChecked)}function oQ(f,u,_){if(u.hasOwnProperty("value")||u.hasOwnProperty("defaultValue")){var y=u.type;if(!(y!=="submit"&&y!=="reset"||u.value!==void 0&&u.value!==null))return;u=""+f._wrapperState.initialValue,_||u===f.value||(f.value=u),f.defaultValue=u}_=f.name,_!==""&&(f.name=""),f.defaultChecked=!!f._wrapperState.initialChecked,_!==""&&(f.name=_)}function K9(f,u,_){if(u!=="number"||P8(f.ownerDocument)!==f)_==null?f.defaultValue=""+f._wrapperState.initialValue:f.defaultValue!==""+_&&(f.defaultValue=""+_)}var p$=Array.isArray;function X3(f,u,_,y){if(f=f.options,u){u={};for(var $=0;$<_.length;$++)u["$"+_[$]]=!0;for(_=0;_"+u.valueOf().toString()+"";for(u=Q8.firstChild;f.firstChild;)f.removeChild(f.firstChild);for(;u.firstChild;)f.appendChild(u.firstChild)}});function l6(f,u){if(u){var _=f.firstChild;if(_&&_===f.lastChild&&_.nodeType===3){_.nodeValue=u;return}}f.textContent=u}var s$={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},TE=["Webkit","ms","Moz","O"];Object.keys(s$).forEach(function(f){TE.forEach(function(u){u=u+f.charAt(0).toUpperCase()+f.substring(1),s$[u]=s$[f]})});function jU(f,u,_){return u==null||typeof u==="boolean"||u===""?"":_||typeof u!=="number"||u===0||s$.hasOwnProperty(f)&&s$[f]?(""+u).trim():u+"px"}function JU(f,u){f=f.style;for(var _ in u)if(u.hasOwnProperty(_)){var y=_.indexOf("--")===0,$=jU(_,u[_],y);_==="float"&&(_="cssFloat"),y?f.setProperty(_,$):f[_]=$}}var ME=q0({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 H9(f,u){if(u){if(ME[f]&&(u.children!=null||u.dangerouslySetInnerHTML!=null))throw Error(Ff(137,f));if(u.dangerouslySetInnerHTML!=null){if(u.children!=null)throw Error(Ff(60));if(typeof u.dangerouslySetInnerHTML!=="object"||!("__html"in u.dangerouslySetInnerHTML))throw Error(Ff(61))}if(u.style!=null&&typeof u.style!=="object")throw Error(Ff(62))}}function E9(f,u){if(f.indexOf("-")===-1)return typeof u.is==="string";switch(f){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 V9=null;function F7(f){return f=f.target||f.srcElement||window,f.correspondingUseElement&&(f=f.correspondingUseElement),f.nodeType===3?f.parentNode:f}var O9=null,N3=null,L3=null;function eQ(f){if(f=N6(f)){if(typeof O9!=="function")throw Error(Ff(280));var u=f.stateNode;u&&(u=J4(u),O9(f.stateNode,f.type,u))}}function FU(f){N3?L3?L3.push(f):L3=[f]:N3=f}function QU(){if(N3){var f=N3,u=L3;if(L3=N3=null,eQ(f),u)for(f=0;f>>=0,f===0?32:31-(cE(f)/pE|0)|0}var A8=64,U8=4194304;function m$(f){switch(f&-f){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 f&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return f&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return f}}function v8(f,u){var _=f.pendingLanes;if(_===0)return 0;var y=0,$=f.suspendedLanes,l=f.pingedLanes,j=_&268435455;if(j!==0){var J=j&~$;J!==0?y=m$(J):(l&=j,l!==0&&(y=m$(l)))}else j=_&~$,j!==0?y=m$(j):l!==0&&(y=m$(l));if(y===0)return 0;if(u!==0&&u!==y&&(u&$)===0&&($=y&-y,l=u&-u,$>=l||$===16&&(l&4194240)!==0))return u;if((y&4)!==0&&(y|=_&16),u=f.entangledLanes,u!==0)for(f=f.entanglements,u&=y;0_;_++)u.push(f);return u}function O6(f,u,_){f.pendingLanes|=u,u!==536870912&&(f.suspendedLanes=0,f.pingedLanes=0),f=f.eventTimes,u=31-z1(u),f[u]=_}function gE(f,u){var _=f.pendingLanes&~u;f.pendingLanes=u,f.suspendedLanes=0,f.pingedLanes=0,f.expiredLanes&=u,f.mutableReadLanes&=u,f.entangledLanes&=u,u=f.entanglements;var y=f.eventTimes;for(f=f.expirationTimes;0<_;){var $=31-z1(_),l=1<<$;u[$]=0,y[$]=-1,f[$]=-1,_&=~l}}function A7(f,u){var _=f.entangledLanes|=u;for(f=f.entanglements;_;){var y=31-z1(_),$=1<=a$),FA=String.fromCharCode(32),QA=!1;function TU(f,u){switch(f){case"keyup":return VV.indexOf(u.keyCode)!==-1;case"keydown":return u.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function MU(f){return f=f.detail,typeof f==="object"&&"data"in f?f.data:null}var W3=!1;function XV(f,u){switch(f){case"compositionend":return MU(u);case"keypress":if(u.which!==32)return null;return QA=!0,FA;case"textInput":return f=u.data,f===FA&&QA?null:f;default:return null}}function NV(f,u){if(W3)return f==="compositionend"||!Z7&&TU(f,u)?(f=wU(),N8=z7=V_=null,W3=!1,f):null;switch(f){case"paste":return null;case"keypress":if(!(u.ctrlKey||u.altKey||u.metaKey)||u.ctrlKey&&u.altKey){if(u.char&&1=u)return{node:_,offset:u-f};f=y}f:{for(;_;){if(_.nextSibling){_=_.nextSibling;break f}_=_.parentNode}_=void 0}_=WA(_)}}function CU(f,u){return f&&u?f===u?!0:f&&f.nodeType===3?!1:u&&u.nodeType===3?CU(f,u.parentNode):("contains"in f)?f.contains(u):f.compareDocumentPosition?!!(f.compareDocumentPosition(u)&16):!1:!1}function RU(){for(var f=window,u=P8();u instanceof f.HTMLIFrameElement;){try{var _=typeof u.contentWindow.location.href==="string"}catch(y){_=!1}if(_)f=u.contentWindow;else break;u=P8(f.document)}return u}function q7(f){var u=f&&f.nodeName&&f.nodeName.toLowerCase();return u&&(u==="input"&&(f.type==="text"||f.type==="search"||f.type==="tel"||f.type==="url"||f.type==="password")||u==="textarea"||f.contentEditable==="true")}function rV(f){var u=RU(),_=f.focusedElem,y=f.selectionRange;if(u!==_&&_&&_.ownerDocument&&CU(_.ownerDocument.documentElement,_)){if(y!==null&&q7(_)){if(u=y.start,f=y.end,f===void 0&&(f=u),"selectionStart"in _)_.selectionStart=u,_.selectionEnd=Math.min(f,_.value.length);else if(f=(u=_.ownerDocument||document)&&u.defaultView||window,f.getSelection){f=f.getSelection();var $=_.textContent.length,l=Math.min(y.start,$);y=y.end===void 0?l:Math.min(y.end,$),!f.extend&&l>y&&($=y,y=l,l=$),$=zA(_,l);var j=zA(_,y);$&&j&&(f.rangeCount!==1||f.anchorNode!==$.node||f.anchorOffset!==$.offset||f.focusNode!==j.node||f.focusOffset!==j.offset)&&(u=u.createRange(),u.setStart($.node,$.offset),f.removeAllRanges(),l>y?(f.addRange(u),f.extend(j.node,j.offset)):(u.setEnd(j.node,j.offset),f.addRange(u)))}}u=[];for(f=_;f=f.parentNode;)f.nodeType===1&&u.push({element:f,left:f.scrollLeft,top:f.scrollTop});typeof _.focus==="function"&&_.focus();for(_=0;_=document.documentMode,z3=null,w9=null,e$=null,D9=!1;function GA(f,u,_){var y=_.window===_?_.document:_.nodeType===9?_:_.ownerDocument;D9||z3==null||z3!==P8(y)||(y=z3,("selectionStart"in y)&&q7(y)?y={start:y.selectionStart,end:y.selectionEnd}:(y=(y.ownerDocument&&y.ownerDocument.defaultView||window).getSelection(),y={anchorNode:y.anchorNode,anchorOffset:y.anchorOffset,focusNode:y.focusNode,focusOffset:y.focusOffset}),e$&&U6(e$,y)||(e$=y,y=I8(w9,"onSelect"),0Z3||(f.current=x9[Z3],x9[Z3]=null,Z3--)}function $0(f,u){Z3++,x9[Z3]=f.current,f.current=u}var S_={},$u=P_(S_),Ou=P_(!1),Vy=S_;function T3(f,u){var _=f.type.contextTypes;if(!_)return S_;var y=f.stateNode;if(y&&y.__reactInternalMemoizedUnmaskedChildContext===u)return y.__reactInternalMemoizedMaskedChildContext;var $={},l;for(l in _)$[l]=u[l];return y&&(f=f.stateNode,f.__reactInternalMemoizedUnmaskedChildContext=u,f.__reactInternalMemoizedMaskedChildContext=$),$}function Xu(f){return f=f.childContextTypes,f!==null&&f!==void 0}function p8(){Q0(Ou),Q0($u)}function OA(f,u,_){if($u.current!==S_)throw Error(Ff(168));$0($u,u),$0(Ou,_)}function kU(f,u,_){var y=f.stateNode;if(u=u.childContextTypes,typeof y.getChildContext!=="function")return _;y=y.getChildContext();for(var $ in y)if(!($ in u))throw Error(Ff(108,wE(f)||"Unknown",$));return q0({},_,y)}function m8(f){return f=(f=f.stateNode)&&f.__reactInternalMemoizedMergedChildContext||S_,Vy=$u.current,$0($u,f),$0(Ou,Ou.current),!0}function XA(f,u,_){var y=f.stateNode;if(!y)throw Error(Ff(169));_?(f=kU(f,u,Vy),y.__reactInternalMemoizedMergedChildContext=f,Q0(Ou),Q0($u),$0($u,f)):Q0(Ou),$0(Ou,_)}var n1=null,F4=!1,e2=!1;function iU(f){n1===null?n1=[f]:n1.push(f)}function pV(f){F4=!0,iU(f)}function C_(){if(!e2&&n1!==null){e2=!0;var f=0,u=af;try{var _=n1;for(af=1;f<_.length;f++){var y=_[f];do y=y(!0);while(y!==null)}n1=null,F4=!1}catch($){throw n1!==null&&(n1=n1.slice(f+1)),ZU(Q7,C_),$}finally{af=u,e2=!1}}return null}var q3=[],H3=0,k8=null,i8=0,su=[],ou=0,Oy=null,t1=1,s1="";function zy(f,u){q3[H3++]=i8,q3[H3++]=k8,k8=f,i8=u}function gU(f,u,_){su[ou++]=t1,su[ou++]=s1,su[ou++]=Oy,Oy=f;var y=t1;f=s1;var $=32-z1(y)-1;y&=~(1<<$),_+=1;var l=32-z1(u)+$;if(30>=j,$-=j,t1=1<<32-z1(u)+$|_<<$|y,s1=l+f}else t1=1<D?(x=N,N=null):x=N.sibling;var c=W(G,N,Z[D],V);if(c===null){N===null&&(N=x);break}f&&N&&c.alternate===null&&u(G,N),H=l(c,H,D),M===null?L=c:M.sibling=c,M=c,N=x}if(D===Z.length)return _(G,N),U0&&zy(G,D),L;if(N===null){for(;DD?(x=N,N=null):x=N.sibling;var v=W(G,N,c.value,V);if(v===null){N===null&&(N=x);break}f&&N&&v.alternate===null&&u(G,N),H=l(v,H,D),M===null?L=v:M.sibling=v,M=v,N=x}if(c.done)return _(G,N),U0&&zy(G,D),L;if(N===null){for(;!c.done;D++,c=Z.next())c=z(G,c.value,V),c!==null&&(H=l(c,H,D),M===null?L=c:M.sibling=c,M=c);return U0&&zy(G,D),L}for(N=y(G,N);!c.done;D++,c=Z.next())c=K(N,G,D,c.value,V),c!==null&&(f&&c.alternate!==null&&N.delete(c.key===null?D:c.key),H=l(c,H,D),M===null?L=c:M.sibling=c,M=c);return f&&N.forEach(function(C){return u(G,C)}),U0&&zy(G,D),L}function O(G,H,Z,V){if(typeof Z==="object"&&Z!==null&&Z.type===U3&&Z.key===null&&(Z=Z.props.children),typeof Z==="object"&&Z!==null){switch(Z.$$typeof){case J8:f:{for(var L=Z.key,M=H;M!==null;){if(M.key===L){if(L=Z.type,L===U3){if(M.tag===7){_(G,M.sibling),H=$(M,Z.props.children),H.return=G,G=H;break f}}else if(M.elementType===L||typeof L==="object"&&L!==null&&L.$$typeof===Z_&&YA(L)===M.type){_(G,M.sibling),H=$(M,Z.props),H.ref=b$(G,M,Z),H.return=G,G=H;break f}_(G,M);break}else u(G,M);M=M.sibling}Z.type===U3?(H=Ey(Z.props.children,G.mode,V,Z.key),H.return=G,G=H):(V=r8(Z.type,Z.key,Z.props,null,G.mode,V),V.ref=b$(G,H,Z),V.return=G,G=V)}return j(G);case A3:f:{for(M=Z.key;H!==null;){if(H.key===M)if(H.tag===4&&H.stateNode.containerInfo===Z.containerInfo&&H.stateNode.implementation===Z.implementation){_(G,H.sibling),H=$(H,Z.children||[]),H.return=G,G=H;break f}else{_(G,H);break}else u(G,H);H=H.sibling}H=J9(Z,G.mode,V),H.return=G,G=H}return j(G);case Z_:return M=Z._init,O(G,H,M(Z._payload),V)}if(p$(Z))return q(G,H,Z,V);if(C$(Z))return E(G,H,Z,V);H8(G,Z)}return typeof Z==="string"&&Z!==""||typeof Z==="number"?(Z=""+Z,H!==null&&H.tag===6?(_(G,H.sibling),H=$(H,Z),H.return=G,G=H):(_(G,H),H=j9(Z,G.mode,V),H.return=G,G=H),j(G)):_(G,H)}return O}var S3=sU(!0),oU=sU(!1),g8=P_(null),n8=null,E3=null,O7=null;function X7(){O7=E3=n8=null}function N7(f){var u=g8.current;Q0(g8),f._currentValue=u}function h9(f,u,_){for(;f!==null;){var y=f.alternate;if((f.childLanes&u)!==u?(f.childLanes|=u,y!==null&&(y.childLanes|=u)):y!==null&&(y.childLanes&u)!==u&&(y.childLanes|=u),f===_)break;f=f.return}}function B3(f,u){n8=f,O7=E3=null,f=f.dependencies,f!==null&&f.firstContext!==null&&((f.lanes&u)!==0&&(Vu=!0),f.firstContext=null)}function eu(f){var u=f._currentValue;if(O7!==f)if(f={context:f,memoizedValue:u,next:null},E3===null){if(n8===null)throw Error(Ff(308));E3=f,n8.dependencies={lanes:0,firstContext:f}}else E3=E3.next=f;return u}var Zy=null;function L7(f){Zy===null?Zy=[f]:Zy.push(f)}function aU(f,u,_,y){var $=u.interleaved;return $===null?(_.next=_,L7(u)):(_.next=$.next,$.next=_),u.interleaved=_,e1(f,y)}function e1(f,u){f.lanes|=u;var _=f.alternate;_!==null&&(_.lanes|=u),_=f;for(f=f.return;f!==null;)f.childLanes|=u,_=f.alternate,_!==null&&(_.childLanes|=u),_=f,f=f.return;return _.tag===3?_.stateNode:null}var q_=!1;function Y7(f){f.updateQueue={baseState:f.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function dU(f,u){f=f.updateQueue,u.updateQueue===f&&(u.updateQueue={baseState:f.baseState,firstBaseUpdate:f.firstBaseUpdate,lastBaseUpdate:f.lastBaseUpdate,shared:f.shared,effects:f.effects})}function o1(f,u){return{eventTime:f,lane:u,tag:0,payload:null,callback:null,next:null}}function B_(f,u,_){var y=f.updateQueue;if(y===null)return null;if(y=y.shared,(gf&2)!==0){var $=y.pending;return $===null?u.next=u:(u.next=$.next,$.next=u),y.pending=u,e1(f,_)}return $=y.interleaved,$===null?(u.next=u,L7(y)):(u.next=$.next,$.next=u),y.interleaved=u,e1(f,_)}function B8(f,u,_){if(u=u.updateQueue,u!==null&&(u=u.shared,(_&4194240)!==0)){var y=u.lanes;y&=f.pendingLanes,_|=y,u.lanes=_,A7(f,_)}}function BA(f,u){var{updateQueue:_,alternate:y}=f;if(y!==null&&(y=y.updateQueue,_===y)){var $=null,l=null;if(_=_.firstBaseUpdate,_!==null){do{var j={eventTime:_.eventTime,lane:_.lane,tag:_.tag,payload:_.payload,callback:_.callback,next:null};l===null?$=l=j:l=l.next=j,_=_.next}while(_!==null);l===null?$=l=u:l=l.next=u}else $=l=u;_={baseState:y.baseState,firstBaseUpdate:$,lastBaseUpdate:l,shared:y.shared,effects:y.effects},f.updateQueue=_;return}f=_.lastBaseUpdate,f===null?_.firstBaseUpdate=u:f.next=u,_.lastBaseUpdate=u}function t8(f,u,_,y){var $=f.updateQueue;q_=!1;var{firstBaseUpdate:l,lastBaseUpdate:j}=$,J=$.shared.pending;if(J!==null){$.shared.pending=null;var F=J,A=F.next;F.next=null,j===null?l=A:j.next=A,j=F;var U=f.alternate;U!==null&&(U=U.updateQueue,J=U.lastBaseUpdate,J!==j&&(J===null?U.firstBaseUpdate=A:J.next=A,U.lastBaseUpdate=F))}if(l!==null){var z=$.baseState;j=0,U=A=F=null,J=l;do{var{lane:W,eventTime:K}=J;if((y&W)===W){U!==null&&(U=U.next={eventTime:K,lane:0,tag:J.tag,payload:J.payload,callback:J.callback,next:null});f:{var q=f,E=J;switch(W=u,K=_,E.tag){case 1:if(q=E.payload,typeof q==="function"){z=q.call(K,z,W);break f}z=q;break f;case 3:q.flags=q.flags&-65537|128;case 0:if(q=E.payload,W=typeof q==="function"?q.call(K,z,W):q,W===null||W===void 0)break f;z=q0({},z,W);break f;case 2:q_=!0}}J.callback!==null&&J.lane!==0&&(f.flags|=64,W=$.effects,W===null?$.effects=[J]:W.push(J))}else K={eventTime:K,lane:W,tag:J.tag,payload:J.payload,callback:J.callback,next:null},U===null?(A=U=K,F=z):U=U.next=K,j|=W;if(J=J.next,J===null)if(J=$.shared.pending,J===null)break;else W=J,J=W.next,W.next=null,$.lastBaseUpdate=W,$.shared.pending=null}while(1);if(U===null&&(F=z),$.baseState=F,$.firstBaseUpdate=A,$.lastBaseUpdate=U,u=$.shared.interleaved,u!==null){$=u;do j|=$.lane,$=$.next;while($!==u)}else l===null&&($.shared.lanes=0);Ny|=j,f.lanes=j,f.memoizedState=z}}function wA(f,u,_){if(f=u.effects,u.effects=null,f!==null)for(u=0;u_?_:4,f(!0);var y=u9.transition;u9.transition={};try{f(!1),u()}finally{af=_,u9.transition=y}}function KW(){return f1().memoizedState}function gV(f,u,_){var y=D_(f);if(_={lane:y,action:_,hasEagerState:!1,eagerState:null,next:null},ZW(f))qW(u,_);else if(_=aU(f,u,_,y),_!==null){var $=Gu();G1(_,f,y,$),HW(_,u,y)}}function nV(f,u,_){var y=D_(f),$={lane:y,action:_,hasEagerState:!1,eagerState:null,next:null};if(ZW(f))qW(u,$);else{var l=f.alternate;if(f.lanes===0&&(l===null||l.lanes===0)&&(l=u.lastRenderedReducer,l!==null))try{var j=u.lastRenderedState,J=l(j,_);if($.hasEagerState=!0,$.eagerState=J,K1(J,j)){var F=u.interleaved;F===null?($.next=$,L7(u)):($.next=F.next,F.next=$),u.interleaved=$;return}}catch(A){}finally{}_=aU(f,u,$,y),_!==null&&($=Gu(),G1(_,f,y,$),HW(_,u,y))}}function ZW(f){var u=f.alternate;return f===Z0||u!==null&&u===Z0}function qW(f,u){f6=o8=!0;var _=f.pending;_===null?u.next=u:(u.next=_.next,_.next=u),f.pending=u}function HW(f,u,_){if((_&4194240)!==0){var y=u.lanes;y&=f.pendingLanes,_|=y,u.lanes=_,A7(f,_)}}var a8={readContext:eu,useCallback:uu,useContext:uu,useEffect:uu,useImperativeHandle:uu,useInsertionEffect:uu,useLayoutEffect:uu,useMemo:uu,useReducer:uu,useRef:uu,useState:uu,useDebugValue:uu,useDeferredValue:uu,useTransition:uu,useMutableSource:uu,useSyncExternalStore:uu,useId:uu,unstable_isNewReconciler:!1},tV={readContext:eu,useCallback:function(f,u){return T1().memoizedState=[f,u===void 0?null:u],f},useContext:eu,useEffect:TA,useImperativeHandle:function(f,u,_){return _=_!==null&&_!==void 0?_.concat([f]):null,D8(4194308,4,AW.bind(null,u,f),_)},useLayoutEffect:function(f,u){return D8(4194308,4,f,u)},useInsertionEffect:function(f,u){return D8(4,2,f,u)},useMemo:function(f,u){var _=T1();return u=u===void 0?null:u,f=f(),_.memoizedState=[f,u],f},useReducer:function(f,u,_){var y=T1();return u=_!==void 0?_(u):u,y.memoizedState=y.baseState=u,f={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:f,lastRenderedState:u},y.queue=f,f=f.dispatch=gV.bind(null,Z0,f),[y.memoizedState,f]},useRef:function(f){var u=T1();return f={current:f},u.memoizedState=f},useState:DA,useDebugValue:P7,useDeferredValue:function(f){return T1().memoizedState=f},useTransition:function(){var f=DA(!1),u=f[0];return f=iV.bind(null,f[1]),T1().memoizedState=f,[u,f]},useMutableSource:function(){},useSyncExternalStore:function(f,u,_){var y=Z0,$=T1();if(U0){if(_===void 0)throw Error(Ff(407));_=_()}else{if(_=u(),p0===null)throw Error(Ff(349));(Xy&30)!==0||_W(y,u,_)}$.memoizedState=_;var l={value:_,getSnapshot:u};return $.queue=l,TA($W.bind(null,y,l,f),[f]),y.flags|=2048,E6(9,yW.bind(null,y,l,_,u),void 0,null),_},useId:function(){var f=T1(),u=p0.identifierPrefix;if(U0){var _=s1,y=t1;_=(y&~(1<<32-z1(y)-1)).toString(32)+_,u=":"+u+"R"+_,_=q6++,0<_&&(u+="H"+_.toString(32)),u+=":"}else _=kV++,u=":"+u+"r"+_.toString(32)+":";return f.memoizedState=u},unstable_isNewReconciler:!1},sV={readContext:eu,useCallback:WW,useContext:eu,useEffect:r7,useImperativeHandle:UW,useInsertionEffect:FW,useLayoutEffect:QW,useMemo:zW,useReducer:_9,useRef:JW,useState:function(){return _9(H6)},useDebugValue:P7,useDeferredValue:function(f){var u=f1();return GW(u,r0.memoizedState,f)},useTransition:function(){var f=_9(H6)[0],u=f1().memoizedState;return[f,u]},useMutableSource:fW,useSyncExternalStore:uW,useId:KW,unstable_isNewReconciler:!1},oV={readContext:eu,useCallback:WW,useContext:eu,useEffect:r7,useImperativeHandle:UW,useInsertionEffect:FW,useLayoutEffect:QW,useMemo:zW,useReducer:y9,useRef:JW,useState:function(){return y9(H6)},useDebugValue:P7,useDeferredValue:function(f){var u=f1();return r0===null?u.memoizedState=f:GW(u,r0.memoizedState,f)},useTransition:function(){var f=y9(H6)[0],u=f1().memoizedState;return[f,u]},useMutableSource:fW,useSyncExternalStore:uW,useId:KW,unstable_isNewReconciler:!1};function A1(f,u){if(f&&f.defaultProps){u=q0({},u),f=f.defaultProps;for(var _ in f)u[_]===void 0&&(u[_]=f[_]);return u}return u}function I9(f,u,_,y){u=f.memoizedState,_=_(y,u),_=_===null||_===void 0?u:q0({},u,_),f.memoizedState=_,f.lanes===0&&(f.updateQueue.baseState=_)}var A4={isMounted:function(f){return(f=f._reactInternals)?By(f)===f:!1},enqueueSetState:function(f,u,_){f=f._reactInternals;var y=Gu(),$=D_(f),l=o1(y,$);l.payload=u,_!==void 0&&_!==null&&(l.callback=_),u=B_(f,l,$),u!==null&&(G1(u,f,$,y),B8(u,f,$))},enqueueReplaceState:function(f,u,_){f=f._reactInternals;var y=Gu(),$=D_(f),l=o1(y,$);l.tag=1,l.payload=u,_!==void 0&&_!==null&&(l.callback=_),u=B_(f,l,$),u!==null&&(G1(u,f,$,y),B8(u,f,$))},enqueueForceUpdate:function(f,u){f=f._reactInternals;var _=Gu(),y=D_(f),$=o1(_,y);$.tag=2,u!==void 0&&u!==null&&($.callback=u),u=B_(f,$,y),u!==null&&(G1(u,f,y,_),B8(u,f,y))}};function MA(f,u,_,y,$,l,j){return f=f.stateNode,typeof f.shouldComponentUpdate==="function"?f.shouldComponentUpdate(y,l,j):u.prototype&&u.prototype.isPureReactComponent?!U6(_,y)||!U6($,l):!0}function EW(f,u,_){var y=!1,$=S_,l=u.contextType;return typeof l==="object"&&l!==null?l=eu(l):($=Xu(u)?Vy:$u.current,y=u.contextTypes,l=(y=y!==null&&y!==void 0)?T3(f,$):S_),u=new u(_,l),f.memoizedState=u.state!==null&&u.state!==void 0?u.state:null,u.updater=A4,f.stateNode=u,u._reactInternals=f,y&&(f=f.stateNode,f.__reactInternalMemoizedUnmaskedChildContext=$,f.__reactInternalMemoizedMaskedChildContext=l),u}function SA(f,u,_,y){f=u.state,typeof u.componentWillReceiveProps==="function"&&u.componentWillReceiveProps(_,y),typeof u.UNSAFE_componentWillReceiveProps==="function"&&u.UNSAFE_componentWillReceiveProps(_,y),u.state!==f&&A4.enqueueReplaceState(u,u.state,null)}function c9(f,u,_,y){var $=f.stateNode;$.props=_,$.state=f.memoizedState,$.refs={},Y7(f);var l=u.contextType;typeof l==="object"&&l!==null?$.context=eu(l):(l=Xu(u)?Vy:$u.current,$.context=T3(f,l)),$.state=f.memoizedState,l=u.getDerivedStateFromProps,typeof l==="function"&&(I9(f,u,l,_),$.state=f.memoizedState),typeof u.getDerivedStateFromProps==="function"||typeof $.getSnapshotBeforeUpdate==="function"||typeof $.UNSAFE_componentWillMount!=="function"&&typeof $.componentWillMount!=="function"||(u=$.state,typeof $.componentWillMount==="function"&&$.componentWillMount(),typeof $.UNSAFE_componentWillMount==="function"&&$.UNSAFE_componentWillMount(),u!==$.state&&A4.enqueueReplaceState($,$.state,null),t8(f,_,$,y),$.state=f.memoizedState),typeof $.componentDidMount==="function"&&(f.flags|=4194308)}function P3(f,u){try{var _="",y=u;do _+=BE(y),y=y.return;while(y);var $=_}catch(l){$=` +Error generating stack: `+l.message+` +`+l.stack}return{value:f,source:u,stack:$,digest:null}}function $9(f,u,_){return{value:f,source:null,stack:_!=null?_:null,digest:u!=null?u:null}}function p9(f,u){try{console.error(u.value)}catch(_){setTimeout(function(){throw _})}}var aV=typeof WeakMap==="function"?WeakMap:Map;function VW(f,u,_){_=o1(-1,_),_.tag=3,_.payload={element:null};var y=u.value;return _.callback=function(){e8||(e8=!0,d9=y),p9(f,u)},_}function OW(f,u,_){_=o1(-1,_),_.tag=3;var y=f.type.getDerivedStateFromError;if(typeof y==="function"){var $=u.value;_.payload=function(){return y($)},_.callback=function(){p9(f,u)}}var l=f.stateNode;return l!==null&&typeof l.componentDidCatch==="function"&&(_.callback=function(){p9(f,u),typeof y!=="function"&&(w_===null?w_=new Set([this]):w_.add(this));var j=u.stack;this.componentDidCatch(u.value,{componentStack:j!==null?j:""})}),_}function rA(f,u,_){var y=f.pingCache;if(y===null){y=f.pingCache=new aV;var $=new Set;y.set(u,$)}else $=y.get(u),$===void 0&&($=new Set,y.set(u,$));$.has(_)||($.add(_),f=UO.bind(null,f,u,_),u.then(f,f))}function PA(f){do{var u;if(u=f.tag===13)u=f.memoizedState,u=u!==null?u.dehydrated!==null?!0:!1:!0;if(u)return f;f=f.return}while(f!==null);return null}function CA(f,u,_,y,$){if((f.mode&1)===0)return f===u?f.flags|=65536:(f.flags|=128,_.flags|=131072,_.flags&=-52805,_.tag===1&&(_.alternate===null?_.tag=17:(u=o1(-1,1),u.tag=2,B_(_,u,1))),_.lanes|=1),f;return f.flags|=65536,f.lanes=$,f}var dV=u_.ReactCurrentOwner,Vu=!1;function zu(f,u,_,y){u.child=f===null?oU(u,null,_,y):S3(u,f.child,_,y)}function RA(f,u,_,y,$){_=_.render;var l=u.ref;if(B3(u,$),y=M7(f,u,_,y,l,$),_=S7(),f!==null&&!Vu)return u.updateQueue=f.updateQueue,u.flags&=-2053,f.lanes&=~$,f_(f,u,$);return U0&&_&&H7(u),u.flags|=1,zu(f,u,y,$),u.child}function xA(f,u,_,y,$){if(f===null){var l=_.type;if(typeof l==="function"&&!c7(l)&&l.defaultProps===void 0&&_.compare===null&&_.defaultProps===void 0)return u.tag=15,u.type=l,XW(f,u,l,y,$);return f=r8(_.type,null,y,u,u.mode,$),f.ref=u.ref,f.return=u,u.child=f}if(l=f.child,(f.lanes&$)===0){var j=l.memoizedProps;if(_=_.compare,_=_!==null?_:U6,_(j,y)&&f.ref===u.ref)return f_(f,u,$)}return u.flags|=1,f=T_(l,y),f.ref=u.ref,f.return=u,u.child=f}function XW(f,u,_,y,$){if(f!==null){var l=f.memoizedProps;if(U6(l,y)&&f.ref===u.ref)if(Vu=!1,u.pendingProps=y=l,(f.lanes&$)!==0)(f.flags&131072)!==0&&(Vu=!0);else return u.lanes=f.lanes,f_(f,u,$)}return m9(f,u,_,y,$)}function NW(f,u,_){var y=u.pendingProps,$=y.children,l=f!==null?f.memoizedState:null;if(y.mode==="hidden")if((u.mode&1)===0)u.memoizedState={baseLanes:0,cachePool:null,transitions:null},$0(O3,Su),Su|=_;else{if((_&1073741824)===0)return f=l!==null?l.baseLanes|_:_,u.lanes=u.childLanes=1073741824,u.memoizedState={baseLanes:f,cachePool:null,transitions:null},u.updateQueue=null,$0(O3,Su),Su|=f,null;u.memoizedState={baseLanes:0,cachePool:null,transitions:null},y=l!==null?l.baseLanes:_,$0(O3,Su),Su|=y}else l!==null?(y=l.baseLanes|_,u.memoizedState=null):y=_,$0(O3,Su),Su|=y;return zu(f,u,$,_),u.child}function LW(f,u){var _=u.ref;if(f===null&&_!==null||f!==null&&f.ref!==_)u.flags|=512,u.flags|=2097152}function m9(f,u,_,y,$){var l=Xu(_)?Vy:$u.current;if(l=T3(u,l),B3(u,$),_=M7(f,u,_,y,l,$),y=S7(),f!==null&&!Vu)return u.updateQueue=f.updateQueue,u.flags&=-2053,f.lanes&=~$,f_(f,u,$);return U0&&y&&H7(u),u.flags|=1,zu(f,u,_,$),u.child}function vA(f,u,_,y,$){if(Xu(_)){var l=!0;m8(u)}else l=!1;if(B3(u,$),u.stateNode===null)T8(f,u),EW(u,_,y),c9(u,_,y,$),y=!0;else if(f===null){var{stateNode:j,memoizedProps:J}=u;j.props=J;var F=j.context,A=_.contextType;typeof A==="object"&&A!==null?A=eu(A):(A=Xu(_)?Vy:$u.current,A=T3(u,A));var U=_.getDerivedStateFromProps,z=typeof U==="function"||typeof j.getSnapshotBeforeUpdate==="function";z||typeof j.UNSAFE_componentWillReceiveProps!=="function"&&typeof j.componentWillReceiveProps!=="function"||(J!==y||F!==A)&&SA(u,j,y,A),q_=!1;var W=u.memoizedState;j.state=W,t8(u,y,j,$),F=u.memoizedState,J!==y||W!==F||Ou.current||q_?(typeof U==="function"&&(I9(u,_,U,y),F=u.memoizedState),(J=q_||MA(u,_,J,y,W,F,A))?(z||typeof j.UNSAFE_componentWillMount!=="function"&&typeof j.componentWillMount!=="function"||(typeof j.componentWillMount==="function"&&j.componentWillMount(),typeof j.UNSAFE_componentWillMount==="function"&&j.UNSAFE_componentWillMount()),typeof j.componentDidMount==="function"&&(u.flags|=4194308)):(typeof j.componentDidMount==="function"&&(u.flags|=4194308),u.memoizedProps=y,u.memoizedState=F),j.props=y,j.state=F,j.context=A,y=J):(typeof j.componentDidMount==="function"&&(u.flags|=4194308),y=!1)}else{j=u.stateNode,dU(f,u),J=u.memoizedProps,A=u.type===u.elementType?J:A1(u.type,J),j.props=A,z=u.pendingProps,W=j.context,F=_.contextType,typeof F==="object"&&F!==null?F=eu(F):(F=Xu(_)?Vy:$u.current,F=T3(u,F));var K=_.getDerivedStateFromProps;(U=typeof K==="function"||typeof j.getSnapshotBeforeUpdate==="function")||typeof j.UNSAFE_componentWillReceiveProps!=="function"&&typeof j.componentWillReceiveProps!=="function"||(J!==z||W!==F)&&SA(u,j,y,F),q_=!1,W=u.memoizedState,j.state=W,t8(u,y,j,$);var q=u.memoizedState;J!==z||W!==q||Ou.current||q_?(typeof K==="function"&&(I9(u,_,K,y),q=u.memoizedState),(A=q_||MA(u,_,A,y,W,q,F)||!1)?(U||typeof j.UNSAFE_componentWillUpdate!=="function"&&typeof j.componentWillUpdate!=="function"||(typeof j.componentWillUpdate==="function"&&j.componentWillUpdate(y,q,F),typeof j.UNSAFE_componentWillUpdate==="function"&&j.UNSAFE_componentWillUpdate(y,q,F)),typeof j.componentDidUpdate==="function"&&(u.flags|=4),typeof j.getSnapshotBeforeUpdate==="function"&&(u.flags|=1024)):(typeof j.componentDidUpdate!=="function"||J===f.memoizedProps&&W===f.memoizedState||(u.flags|=4),typeof j.getSnapshotBeforeUpdate!=="function"||J===f.memoizedProps&&W===f.memoizedState||(u.flags|=1024),u.memoizedProps=y,u.memoizedState=q),j.props=y,j.state=q,j.context=F,y=A):(typeof j.componentDidUpdate!=="function"||J===f.memoizedProps&&W===f.memoizedState||(u.flags|=4),typeof j.getSnapshotBeforeUpdate!=="function"||J===f.memoizedProps&&W===f.memoizedState||(u.flags|=1024),y=!1)}return k9(f,u,_,y,l,$)}function k9(f,u,_,y,$,l){LW(f,u);var j=(u.flags&128)!==0;if(!y&&!j)return $&&XA(u,_,!1),f_(f,u,l);y=u.stateNode,dV.current=u;var J=j&&typeof _.getDerivedStateFromError!=="function"?null:y.render();return u.flags|=1,f!==null&&j?(u.child=S3(u,f.child,null,l),u.child=S3(u,null,J,l)):zu(f,u,J,l),u.memoizedState=y.state,$&&XA(u,_,!0),u.child}function YW(f){var u=f.stateNode;u.pendingContext?OA(f,u.pendingContext,u.pendingContext!==u.context):u.context&&OA(f,u.context,!1),B7(f,u.containerInfo)}function bA(f,u,_,y,$){return M3(),V7($),u.flags|=256,zu(f,u,_,y),u.child}var i9={dehydrated:null,treeContext:null,retryLane:0};function g9(f){return{baseLanes:f,cachePool:null,transitions:null}}function BW(f,u,_){var y=u.pendingProps,$=K0.current,l=!1,j=(u.flags&128)!==0,J;if((J=j)||(J=f!==null&&f.memoizedState===null?!1:($&2)!==0),J)l=!0,u.flags&=-129;else if(f===null||f.memoizedState!==null)$|=1;if($0(K0,$&1),f===null){if(b9(u),f=u.memoizedState,f!==null&&(f=f.dehydrated,f!==null))return(u.mode&1)===0?u.lanes=1:f.data==="$!"?u.lanes=8:u.lanes=1073741824,null;return j=y.children,f=y.fallback,l?(y=u.mode,l=u.child,j={mode:"hidden",children:j},(y&1)===0&&l!==null?(l.childLanes=0,l.pendingProps=j):l=z4(j,y,0,null),f=Ey(f,y,_,null),l.return=u,f.return=u,l.sibling=f,u.child=l,u.child.memoizedState=g9(_),u.memoizedState=i9,f):C7(u,j)}if($=f.memoizedState,$!==null&&(J=$.dehydrated,J!==null))return eV(f,u,j,y,J,$,_);if(l){l=y.fallback,j=u.mode,$=f.child,J=$.sibling;var F={mode:"hidden",children:y.children};return(j&1)===0&&u.child!==$?(y=u.child,y.childLanes=0,y.pendingProps=F,u.deletions=null):(y=T_($,F),y.subtreeFlags=$.subtreeFlags&14680064),J!==null?l=T_(J,l):(l=Ey(l,j,_,null),l.flags|=2),l.return=u,y.return=u,y.sibling=l,u.child=y,y=l,l=u.child,j=f.child.memoizedState,j=j===null?g9(_):{baseLanes:j.baseLanes|_,cachePool:null,transitions:j.transitions},l.memoizedState=j,l.childLanes=f.childLanes&~_,u.memoizedState=i9,y}return l=f.child,f=l.sibling,y=T_(l,{mode:"visible",children:y.children}),(u.mode&1)===0&&(y.lanes=_),y.return=u,y.sibling=null,f!==null&&(_=u.deletions,_===null?(u.deletions=[f],u.flags|=16):_.push(f)),u.child=y,u.memoizedState=null,y}function C7(f,u){return u=z4({mode:"visible",children:u},f.mode,0,null),u.return=f,f.child=u}function E8(f,u,_,y){return y!==null&&V7(y),S3(u,f.child,null,_),f=C7(u,u.pendingProps.children),f.flags|=2,u.memoizedState=null,f}function eV(f,u,_,y,$,l,j){if(_){if(u.flags&256)return u.flags&=-257,y=$9(Error(Ff(422))),E8(f,u,j,y);if(u.memoizedState!==null)return u.child=f.child,u.flags|=128,null;return l=y.fallback,$=u.mode,y=z4({mode:"visible",children:y.children},$,0,null),l=Ey(l,$,j,null),l.flags|=2,y.return=u,l.return=u,y.sibling=l,u.child=y,(u.mode&1)!==0&&S3(u,f.child,null,j),u.child.memoizedState=g9(j),u.memoizedState=i9,l}if((u.mode&1)===0)return E8(f,u,j,null);if($.data==="$!"){if(y=$.nextSibling&&$.nextSibling.dataset,y)var J=y.dgst;return y=J,l=Error(Ff(419)),y=$9(l,y,void 0),E8(f,u,j,y)}if(J=(j&f.childLanes)!==0,Vu||J){if(y=p0,y!==null){switch(j&-j){case 4:$=2;break;case 16:$=8;break;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:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:$=32;break;case 536870912:$=268435456;break;default:$=0}$=($&(y.suspendedLanes|j))!==0?0:$,$!==0&&$!==l.retryLane&&(l.retryLane=$,e1(f,$),G1(y,f,$,-1))}return I7(),y=$9(Error(Ff(421))),E8(f,u,j,y)}if($.data==="$?")return u.flags|=128,u.child=f.child,u=WO.bind(null,f),$._reactRetry=u,null;return f=l.treeContext,ru=Y_($.nextSibling),Pu=u,U0=!0,W1=null,f!==null&&(su[ou++]=t1,su[ou++]=s1,su[ou++]=Oy,t1=f.id,s1=f.overflow,Oy=u),u=C7(u,y.children),u.flags|=4096,u}function hA(f,u,_){f.lanes|=u;var y=f.alternate;y!==null&&(y.lanes|=u),h9(f.return,u,_)}function l9(f,u,_,y,$){var l=f.memoizedState;l===null?f.memoizedState={isBackwards:u,rendering:null,renderingStartTime:0,last:y,tail:_,tailMode:$}:(l.isBackwards=u,l.rendering=null,l.renderingStartTime=0,l.last=y,l.tail=_,l.tailMode=$)}function wW(f,u,_){var y=u.pendingProps,$=y.revealOrder,l=y.tail;if(zu(f,u,y.children,_),y=K0.current,(y&2)!==0)y=y&1|2,u.flags|=128;else{if(f!==null&&(f.flags&128)!==0)f:for(f=u.child;f!==null;){if(f.tag===13)f.memoizedState!==null&&hA(f,_,u);else if(f.tag===19)hA(f,_,u);else if(f.child!==null){f.child.return=f,f=f.child;continue}if(f===u)break f;for(;f.sibling===null;){if(f.return===null||f.return===u)break f;f=f.return}f.sibling.return=f.return,f=f.sibling}y&=1}if($0(K0,y),(u.mode&1)===0)u.memoizedState=null;else switch($){case"forwards":_=u.child;for($=null;_!==null;)f=_.alternate,f!==null&&s8(f)===null&&($=_),_=_.sibling;_=$,_===null?($=u.child,u.child=null):($=_.sibling,_.sibling=null),l9(u,!1,$,_,l);break;case"backwards":_=null,$=u.child;for(u.child=null;$!==null;){if(f=$.alternate,f!==null&&s8(f)===null){u.child=$;break}f=$.sibling,$.sibling=_,_=$,$=f}l9(u,!0,_,null,l);break;case"together":l9(u,!1,null,null,void 0);break;default:u.memoizedState=null}return u.child}function T8(f,u){(u.mode&1)===0&&f!==null&&(f.alternate=null,u.alternate=null,u.flags|=2)}function f_(f,u,_){if(f!==null&&(u.dependencies=f.dependencies),Ny|=u.lanes,(_&u.childLanes)===0)return null;if(f!==null&&u.child!==f.child)throw Error(Ff(153));if(u.child!==null){f=u.child,_=T_(f,f.pendingProps),u.child=_;for(_.return=u;f.sibling!==null;)f=f.sibling,_=_.sibling=T_(f,f.pendingProps),_.return=u;_.sibling=null}return u.child}function fO(f,u,_){switch(u.tag){case 3:YW(u),M3();break;case 5:eU(u);break;case 1:Xu(u.type)&&m8(u);break;case 4:B7(u,u.stateNode.containerInfo);break;case 10:var y=u.type._context,$=u.memoizedProps.value;$0(g8,y._currentValue),y._currentValue=$;break;case 13:if(y=u.memoizedState,y!==null){if(y.dehydrated!==null)return $0(K0,K0.current&1),u.flags|=128,null;if((_&u.child.childLanes)!==0)return BW(f,u,_);return $0(K0,K0.current&1),f=f_(f,u,_),f!==null?f.sibling:null}$0(K0,K0.current&1);break;case 19:if(y=(_&u.childLanes)!==0,(f.flags&128)!==0){if(y)return wW(f,u,_);u.flags|=128}if($=u.memoizedState,$!==null&&($.rendering=null,$.tail=null,$.lastEffect=null),$0(K0,K0.current),y)break;else return null;case 22:case 23:return u.lanes=0,NW(f,u,_)}return f_(f,u,_)}var DW,n9,TW,MW;DW=function(f,u){for(var _=u.child;_!==null;){if(_.tag===5||_.tag===6)f.appendChild(_.stateNode);else if(_.tag!==4&&_.child!==null){_.child.return=_,_=_.child;continue}if(_===u)break;for(;_.sibling===null;){if(_.return===null||_.return===u)return;_=_.return}_.sibling.return=_.return,_=_.sibling}};n9=function(){};TW=function(f,u,_,y){var $=f.memoizedProps;if($!==y){f=u.stateNode,qy(r1.current);var l=null;switch(_){case"input":$=z9(f,$),y=z9(f,y),l=[];break;case"select":$=q0({},$,{value:void 0}),y=q0({},y,{value:void 0}),l=[];break;case"textarea":$=Z9(f,$),y=Z9(f,y),l=[];break;default:typeof $.onClick!=="function"&&typeof y.onClick==="function"&&(f.onclick=c8)}H9(_,y);var j;_=null;for(A in $)if(!y.hasOwnProperty(A)&&$.hasOwnProperty(A)&&$[A]!=null)if(A==="style"){var J=$[A];for(j in J)J.hasOwnProperty(j)&&(_||(_={}),_[j]="")}else A!=="dangerouslySetInnerHTML"&&A!=="children"&&A!=="suppressContentEditableWarning"&&A!=="suppressHydrationWarning"&&A!=="autoFocus"&&($6.hasOwnProperty(A)?l||(l=[]):(l=l||[]).push(A,null));for(A in y){var F=y[A];if(J=$!=null?$[A]:void 0,y.hasOwnProperty(A)&&F!==J&&(F!=null||J!=null))if(A==="style")if(J){for(j in J)!J.hasOwnProperty(j)||F&&F.hasOwnProperty(j)||(_||(_={}),_[j]="");for(j in F)F.hasOwnProperty(j)&&J[j]!==F[j]&&(_||(_={}),_[j]=F[j])}else _||(l||(l=[]),l.push(A,_)),_=F;else A==="dangerouslySetInnerHTML"?(F=F?F.__html:void 0,J=J?J.__html:void 0,F!=null&&J!==F&&(l=l||[]).push(A,F)):A==="children"?typeof F!=="string"&&typeof F!=="number"||(l=l||[]).push(A,""+F):A!=="suppressContentEditableWarning"&&A!=="suppressHydrationWarning"&&($6.hasOwnProperty(A)?(F!=null&&A==="onScroll"&&F0("scroll",f),l||J===F||(l=[])):(l=l||[]).push(A,F))}_&&(l=l||[]).push("style",_);var A=l;if(u.updateQueue=A)u.flags|=4}};MW=function(f,u,_,y){_!==y&&(u.flags|=4)};function h$(f,u){if(!U0)switch(f.tailMode){case"hidden":u=f.tail;for(var _=null;u!==null;)u.alternate!==null&&(_=u),u=u.sibling;_===null?f.tail=null:_.sibling=null;break;case"collapsed":_=f.tail;for(var y=null;_!==null;)_.alternate!==null&&(y=_),_=_.sibling;y===null?u||f.tail===null?f.tail=null:f.tail.sibling=null:y.sibling=null}}function _u(f){var u=f.alternate!==null&&f.alternate.child===f.child,_=0,y=0;if(u)for(var $=f.child;$!==null;)_|=$.lanes|$.childLanes,y|=$.subtreeFlags&14680064,y|=$.flags&14680064,$.return=f,$=$.sibling;else for($=f.child;$!==null;)_|=$.lanes|$.childLanes,y|=$.subtreeFlags,y|=$.flags,$.return=f,$=$.sibling;return f.subtreeFlags|=y,f.childLanes=_,u}function uO(f,u,_){var y=u.pendingProps;switch(E7(u),u.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return _u(u),null;case 1:return Xu(u.type)&&p8(),_u(u),null;case 3:if(y=u.stateNode,r3(),Q0(Ou),Q0($u),D7(),y.pendingContext&&(y.context=y.pendingContext,y.pendingContext=null),f===null||f.child===null)q8(u)?u.flags|=4:f===null||f.memoizedState.isDehydrated&&(u.flags&256)===0||(u.flags|=1024,W1!==null&&(u7(W1),W1=null));return n9(f,u),_u(u),null;case 5:w7(u);var $=qy(Z6.current);if(_=u.type,f!==null&&u.stateNode!=null)TW(f,u,_,y,$),f.ref!==u.ref&&(u.flags|=512,u.flags|=2097152);else{if(!y){if(u.stateNode===null)throw Error(Ff(166));return _u(u),null}if(f=qy(r1.current),q8(u)){y=u.stateNode,_=u.type;var l=u.memoizedProps;switch(y[M1]=u,y[G6]=l,f=(u.mode&1)!==0,_){case"dialog":F0("cancel",y),F0("close",y);break;case"iframe":case"object":case"embed":F0("load",y);break;case"video":case"audio":for($=0;$",f=f.removeChild(f.firstChild)):typeof y.is==="string"?f=j.createElement(_,{is:y.is}):(f=j.createElement(_),_==="select"&&(j=f,y.multiple?j.multiple=!0:y.size&&(j.size=y.size))):f=j.createElementNS(f,_),f[M1]=u,f[G6]=y,DW(f,u,!1,!1),u.stateNode=f;f:{switch(j=E9(_,y),_){case"dialog":F0("cancel",f),F0("close",f),$=y;break;case"iframe":case"object":case"embed":F0("load",f),$=y;break;case"video":case"audio":for($=0;$C3&&(u.flags|=128,y=!0,h$(l,!1),u.lanes=4194304)}else{if(!y)if(f=s8(j),f!==null){if(u.flags|=128,y=!0,_=f.updateQueue,_!==null&&(u.updateQueue=_,u.flags|=4),h$(l,!0),l.tail===null&&l.tailMode==="hidden"&&!j.alternate&&!U0)return _u(u),null}else 2*w0()-l.renderingStartTime>C3&&_!==1073741824&&(u.flags|=128,y=!0,h$(l,!1),u.lanes=4194304);l.isBackwards?(j.sibling=u.child,u.child=j):(_=l.last,_!==null?_.sibling=j:u.child=j,l.last=j)}if(l.tail!==null)return u=l.tail,l.rendering=u,l.tail=u.sibling,l.renderingStartTime=w0(),u.sibling=null,_=K0.current,$0(K0,y?_&1|2:_&1),u;return _u(u),null;case 22:case 23:return h7(),y=u.memoizedState!==null,f!==null&&f.memoizedState!==null!==y&&(u.flags|=8192),y&&(u.mode&1)!==0?(Su&1073741824)!==0&&(_u(u),u.subtreeFlags&6&&(u.flags|=8192)):_u(u),null;case 24:return null;case 25:return null}throw Error(Ff(156,u.tag))}function _O(f,u){switch(E7(u),u.tag){case 1:return Xu(u.type)&&p8(),f=u.flags,f&65536?(u.flags=f&-65537|128,u):null;case 3:return r3(),Q0(Ou),Q0($u),D7(),f=u.flags,(f&65536)!==0&&(f&128)===0?(u.flags=f&-65537|128,u):null;case 5:return w7(u),null;case 13:if(Q0(K0),f=u.memoizedState,f!==null&&f.dehydrated!==null){if(u.alternate===null)throw Error(Ff(340));M3()}return f=u.flags,f&65536?(u.flags=f&-65537|128,u):null;case 19:return Q0(K0),null;case 4:return r3(),null;case 10:return N7(u.type._context),null;case 22:case 23:return h7(),null;case 24:return null;default:return null}}var V8=!1,yu=!1,yO=typeof WeakSet==="function"?WeakSet:Set,Hf=null;function V3(f,u){var _=f.ref;if(_!==null)if(typeof _==="function")try{_(null)}catch(y){L0(f,u,y)}else _.current=null}function t9(f,u,_){try{_()}catch(y){L0(f,u,y)}}var IA=!1;function $O(f,u){if(S9=b8,f=RU(),q7(f)){if("selectionStart"in f)var _={start:f.selectionStart,end:f.selectionEnd};else f:{_=(_=f.ownerDocument)&&_.defaultView||window;var y=_.getSelection&&_.getSelection();if(y&&y.rangeCount!==0){_=y.anchorNode;var{anchorOffset:$,focusNode:l}=y;y=y.focusOffset;try{_.nodeType,l.nodeType}catch(V){_=null;break f}var j=0,J=-1,F=-1,A=0,U=0,z=f,W=null;u:for(;;){for(var K;;){if(z!==_||$!==0&&z.nodeType!==3||(J=j+$),z!==l||y!==0&&z.nodeType!==3||(F=j+y),z.nodeType===3&&(j+=z.nodeValue.length),(K=z.firstChild)===null)break;W=z,z=K}for(;;){if(z===f)break u;if(W===_&&++A===$&&(J=j),W===l&&++U===y&&(F=j),(K=z.nextSibling)!==null)break;z=W,W=z.parentNode}z=K}_=J===-1||F===-1?null:{start:J,end:F}}else _=null}_=_||{start:0,end:0}}else _=null;r9={focusedElem:f,selectionRange:_},b8=!1;for(Hf=u;Hf!==null;)if(u=Hf,f=u.child,(u.subtreeFlags&1028)!==0&&f!==null)f.return=u,Hf=f;else for(;Hf!==null;){u=Hf;try{var q=u.alternate;if((u.flags&1024)!==0)switch(u.tag){case 0:case 11:case 15:break;case 1:if(q!==null){var{memoizedProps:E,memoizedState:O}=q,G=u.stateNode,H=G.getSnapshotBeforeUpdate(u.elementType===u.type?E:A1(u.type,E),O);G.__reactInternalSnapshotBeforeUpdate=H}break;case 3:var Z=u.stateNode.containerInfo;Z.nodeType===1?Z.textContent="":Z.nodeType===9&&Z.documentElement&&Z.removeChild(Z.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(Ff(163))}}catch(V){L0(u,u.return,V)}if(f=u.sibling,f!==null){f.return=u.return,Hf=f;break}Hf=u.return}return q=IA,IA=!1,q}function u6(f,u,_){var y=u.updateQueue;if(y=y!==null?y.lastEffect:null,y!==null){var $=y=y.next;do{if(($.tag&f)===f){var l=$.destroy;$.destroy=void 0,l!==void 0&&t9(u,_,l)}$=$.next}while($!==y)}}function U4(f,u){if(u=u.updateQueue,u=u!==null?u.lastEffect:null,u!==null){var _=u=u.next;do{if((_.tag&f)===f){var y=_.create;_.destroy=y()}_=_.next}while(_!==u)}}function s9(f){var u=f.ref;if(u!==null){var _=f.stateNode;switch(f.tag){case 5:f=_;break;default:f=_}typeof u==="function"?u(f):u.current=f}}function SW(f){var u=f.alternate;u!==null&&(f.alternate=null,SW(u)),f.child=null,f.deletions=null,f.sibling=null,f.tag===5&&(u=f.stateNode,u!==null&&(delete u[M1],delete u[G6],delete u[R9],delete u[IV],delete u[cV])),f.stateNode=null,f.return=null,f.dependencies=null,f.memoizedProps=null,f.memoizedState=null,f.pendingProps=null,f.stateNode=null,f.updateQueue=null}function rW(f){return f.tag===5||f.tag===3||f.tag===4}function cA(f){f:for(;;){for(;f.sibling===null;){if(f.return===null||rW(f.return))return null;f=f.return}f.sibling.return=f.return;for(f=f.sibling;f.tag!==5&&f.tag!==6&&f.tag!==18;){if(f.flags&2)continue f;if(f.child===null||f.tag===4)continue f;else f.child.return=f,f=f.child}if(!(f.flags&2))return f.stateNode}}function o9(f,u,_){var y=f.tag;if(y===5||y===6)f=f.stateNode,u?_.nodeType===8?_.parentNode.insertBefore(f,u):_.insertBefore(f,u):(_.nodeType===8?(u=_.parentNode,u.insertBefore(f,_)):(u=_,u.appendChild(f)),_=_._reactRootContainer,_!==null&&_!==void 0||u.onclick!==null||(u.onclick=c8));else if(y!==4&&(f=f.child,f!==null))for(o9(f,u,_),f=f.sibling;f!==null;)o9(f,u,_),f=f.sibling}function a9(f,u,_){var y=f.tag;if(y===5||y===6)f=f.stateNode,u?_.insertBefore(f,u):_.appendChild(f);else if(y!==4&&(f=f.child,f!==null))for(a9(f,u,_),f=f.sibling;f!==null;)a9(f,u,_),f=f.sibling}var n0=null,U1=!1;function K_(f,u,_){for(_=_.child;_!==null;)PW(f,u,_),_=_.sibling}function PW(f,u,_){if(S1&&typeof S1.onCommitFiberUnmount==="function")try{S1.onCommitFiberUnmount(y4,_)}catch(J){}switch(_.tag){case 5:yu||V3(_,u);case 6:var y=n0,$=U1;n0=null,K_(f,u,_),n0=y,U1=$,n0!==null&&(U1?(f=n0,_=_.stateNode,f.nodeType===8?f.parentNode.removeChild(_):f.removeChild(_)):n0.removeChild(_.stateNode));break;case 18:n0!==null&&(U1?(f=n0,_=_.stateNode,f.nodeType===8?d2(f.parentNode,_):f.nodeType===1&&d2(f,_),Q6(f)):d2(n0,_.stateNode));break;case 4:y=n0,$=U1,n0=_.stateNode.containerInfo,U1=!0,K_(f,u,_),n0=y,U1=$;break;case 0:case 11:case 14:case 15:if(!yu&&(y=_.updateQueue,y!==null&&(y=y.lastEffect,y!==null))){$=y=y.next;do{var l=$,j=l.destroy;l=l.tag,j!==void 0&&((l&2)!==0?t9(_,u,j):(l&4)!==0&&t9(_,u,j)),$=$.next}while($!==y)}K_(f,u,_);break;case 1:if(!yu&&(V3(_,u),y=_.stateNode,typeof y.componentWillUnmount==="function"))try{y.props=_.memoizedProps,y.state=_.memoizedState,y.componentWillUnmount()}catch(J){L0(_,u,J)}K_(f,u,_);break;case 21:K_(f,u,_);break;case 22:_.mode&1?(yu=(y=yu)||_.memoizedState!==null,K_(f,u,_),yu=y):K_(f,u,_);break;default:K_(f,u,_)}}function pA(f){var u=f.updateQueue;if(u!==null){f.updateQueue=null;var _=f.stateNode;_===null&&(_=f.stateNode=new yO),u.forEach(function(y){var $=zO.bind(null,f,y);_.has(y)||(_.add(y),y.then($,$))})}}function Q1(f,u){var _=u.deletions;if(_!==null)for(var y=0;y<_.length;y++){var $=_[y];try{var l=f,j=u,J=j;f:for(;J!==null;){switch(J.tag){case 5:n0=J.stateNode,U1=!1;break f;case 3:n0=J.stateNode.containerInfo,U1=!0;break f;case 4:n0=J.stateNode.containerInfo,U1=!0;break f}J=J.return}if(n0===null)throw Error(Ff(160));PW(l,j,$),n0=null,U1=!1;var F=$.alternate;F!==null&&(F.return=null),$.return=null}catch(A){L0($,u,A)}}if(u.subtreeFlags&12854)for(u=u.child;u!==null;)CW(u,f),u=u.sibling}function CW(f,u){var{alternate:_,flags:y}=f;switch(f.tag){case 0:case 11:case 14:case 15:if(Q1(u,f),D1(f),y&4){try{u6(3,f,f.return),U4(3,f)}catch(E){L0(f,f.return,E)}try{u6(5,f,f.return)}catch(E){L0(f,f.return,E)}}break;case 1:Q1(u,f),D1(f),y&512&&_!==null&&V3(_,_.return);break;case 5:if(Q1(u,f),D1(f),y&512&&_!==null&&V3(_,_.return),f.flags&32){var $=f.stateNode;try{l6($,"")}catch(E){L0(f,f.return,E)}}if(y&4&&($=f.stateNode,$!=null)){var l=f.memoizedProps,j=_!==null?_.memoizedProps:l,J=f.type,F=f.updateQueue;if(f.updateQueue=null,F!==null)try{J==="input"&&l.type==="radio"&&l.name!=null&&_U($,l),E9(J,j);var A=E9(J,l);for(j=0;j$&&($=j),y&=~l}if(y=$,y=w0()-y,y=(120>y?120:480>y?480:1080>y?1080:1920>y?1920:3000>y?3000:4320>y?4320:1960*jO(y/1960))-y,10f?16:f,O_===null)var y=!1;else{if(f=O_,O_=null,f4=0,(gf&6)!==0)throw Error(Ff(331));var $=gf;gf|=4;for(Hf=f.current;Hf!==null;){var l=Hf,j=l.child;if((Hf.flags&16)!==0){var J=l.deletions;if(J!==null){for(var F=0;Fw0()-v7?Hy(f,0):x7|=_),Nu(f,u)}function cW(f,u){u===0&&((f.mode&1)===0?u=1:(u=U8,U8<<=1,(U8&130023424)===0&&(U8=4194304)));var _=Gu();f=e1(f,u),f!==null&&(O6(f,u,_),Nu(f,_))}function WO(f){var u=f.memoizedState,_=0;u!==null&&(_=u.retryLane),cW(f,_)}function zO(f,u){var _=0;switch(f.tag){case 13:var{stateNode:y,memoizedState:$}=f;$!==null&&(_=$.retryLane);break;case 19:y=f.stateNode;break;default:throw Error(Ff(314))}y!==null&&y.delete(u),cW(f,_)}var pW;pW=function(f,u,_){if(f!==null)if(f.memoizedProps!==u.pendingProps||Ou.current)Vu=!0;else{if((f.lanes&_)===0&&(u.flags&128)===0)return Vu=!1,fO(f,u,_);Vu=(f.flags&131072)!==0?!0:!1}else Vu=!1,U0&&(u.flags&1048576)!==0&&gU(u,i8,u.index);switch(u.lanes=0,u.tag){case 2:var y=u.type;T8(f,u),f=u.pendingProps;var $=T3(u,$u.current);B3(u,_),$=M7(null,u,y,f,$,_);var l=S7();return u.flags|=1,typeof $==="object"&&$!==null&&typeof $.render==="function"&&$.$$typeof===void 0?(u.tag=1,u.memoizedState=null,u.updateQueue=null,Xu(y)?(l=!0,m8(u)):l=!1,u.memoizedState=$.state!==null&&$.state!==void 0?$.state:null,Y7(u),$.updater=A4,u.stateNode=$,$._reactInternals=u,c9(u,y,f,_),u=k9(null,u,y,!0,l,_)):(u.tag=0,U0&&l&&H7(u),zu(null,u,$,_),u=u.child),u;case 16:y=u.elementType;f:{switch(T8(f,u),f=u.pendingProps,$=y._init,y=$(y._payload),u.type=y,$=u.tag=KO(y),f=A1(y,f),$){case 0:u=m9(null,u,y,f,_);break f;case 1:u=vA(null,u,y,f,_);break f;case 11:u=RA(null,u,y,f,_);break f;case 14:u=xA(null,u,y,A1(y.type,f),_);break f}throw Error(Ff(306,y,""))}return u;case 0:return y=u.type,$=u.pendingProps,$=u.elementType===y?$:A1(y,$),m9(f,u,y,$,_);case 1:return y=u.type,$=u.pendingProps,$=u.elementType===y?$:A1(y,$),vA(f,u,y,$,_);case 3:f:{if(YW(u),f===null)throw Error(Ff(387));y=u.pendingProps,l=u.memoizedState,$=l.element,dU(f,u),t8(u,y,null,_);var j=u.memoizedState;if(y=j.element,l.isDehydrated)if(l={element:y,isDehydrated:!1,cache:j.cache,pendingSuspenseBoundaries:j.pendingSuspenseBoundaries,transitions:j.transitions},u.updateQueue.baseState=l,u.memoizedState=l,u.flags&256){$=P3(Error(Ff(423)),u),u=bA(f,u,y,_,$);break f}else if(y!==$){$=P3(Error(Ff(424)),u),u=bA(f,u,y,_,$);break f}else for(ru=Y_(u.stateNode.containerInfo.firstChild),Pu=u,U0=!0,W1=null,_=oU(u,null,y,_),u.child=_;_;)_.flags=_.flags&-3|4096,_=_.sibling;else{if(M3(),y===$){u=f_(f,u,_);break f}zu(f,u,y,_)}u=u.child}return u;case 5:return eU(u),f===null&&b9(u),y=u.type,$=u.pendingProps,l=f!==null?f.memoizedProps:null,j=$.children,P9(y,$)?j=null:l!==null&&P9(y,l)&&(u.flags|=32),LW(f,u),zu(f,u,j,_),u.child;case 6:return f===null&&b9(u),null;case 13:return BW(f,u,_);case 4:return B7(u,u.stateNode.containerInfo),y=u.pendingProps,f===null?u.child=S3(u,null,y,_):zu(f,u,y,_),u.child;case 11:return y=u.type,$=u.pendingProps,$=u.elementType===y?$:A1(y,$),RA(f,u,y,$,_);case 7:return zu(f,u,u.pendingProps,_),u.child;case 8:return zu(f,u,u.pendingProps.children,_),u.child;case 12:return zu(f,u,u.pendingProps.children,_),u.child;case 10:f:{if(y=u.type._context,$=u.pendingProps,l=u.memoizedProps,j=$.value,$0(g8,y._currentValue),y._currentValue=j,l!==null)if(K1(l.value,j)){if(l.children===$.children&&!Ou.current){u=f_(f,u,_);break f}}else for(l=u.child,l!==null&&(l.return=u);l!==null;){var J=l.dependencies;if(J!==null){j=l.child;for(var F=J.firstContext;F!==null;){if(F.context===y){if(l.tag===1){F=o1(-1,_&-_),F.tag=2;var A=l.updateQueue;if(A!==null){A=A.shared;var U=A.pending;U===null?F.next=F:(F.next=U.next,U.next=F),A.pending=F}}l.lanes|=_,F=l.alternate,F!==null&&(F.lanes|=_),h9(l.return,_,u),J.lanes|=_;break}F=F.next}}else if(l.tag===10)j=l.type===u.type?null:l.child;else if(l.tag===18){if(j=l.return,j===null)throw Error(Ff(341));j.lanes|=_,J=j.alternate,J!==null&&(J.lanes|=_),h9(j,_,u),j=l.sibling}else j=l.child;if(j!==null)j.return=l;else for(j=l;j!==null;){if(j===u){j=null;break}if(l=j.sibling,l!==null){l.return=j.return,j=l;break}j=j.return}l=j}zu(f,u,$.children,_),u=u.child}return u;case 9:return $=u.type,y=u.pendingProps.children,B3(u,_),$=eu($),y=y($),u.flags|=1,zu(f,u,y,_),u.child;case 14:return y=u.type,$=A1(y,u.pendingProps),$=A1(y.type,$),xA(f,u,y,$,_);case 15:return XW(f,u,u.type,u.pendingProps,_);case 17:return y=u.type,$=u.pendingProps,$=u.elementType===y?$:A1(y,$),T8(f,u),u.tag=1,Xu(y)?(f=!0,m8(u)):f=!1,B3(u,_),EW(u,y,$),c9(u,y,$,_),k9(null,u,y,!0,f,_);case 19:return wW(f,u,_);case 22:return NW(f,u,_)}throw Error(Ff(156,u.tag))};function mW(f,u){return ZU(f,u)}function GO(f,u,_,y){this.tag=f,this.key=_,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=y,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function au(f,u,_,y){return new GO(f,u,_,y)}function c7(f){return f=f.prototype,!(!f||!f.isReactComponent)}function KO(f){if(typeof f==="function")return c7(f)?1:0;if(f!==void 0&&f!==null){if(f=f.$$typeof,f===j7)return 11;if(f===J7)return 14}return 2}function T_(f,u){var _=f.alternate;return _===null?(_=au(f.tag,u,f.key,f.mode),_.elementType=f.elementType,_.type=f.type,_.stateNode=f.stateNode,_.alternate=f,f.alternate=_):(_.pendingProps=u,_.type=f.type,_.flags=0,_.subtreeFlags=0,_.deletions=null),_.flags=f.flags&14680064,_.childLanes=f.childLanes,_.lanes=f.lanes,_.child=f.child,_.memoizedProps=f.memoizedProps,_.memoizedState=f.memoizedState,_.updateQueue=f.updateQueue,u=f.dependencies,_.dependencies=u===null?null:{lanes:u.lanes,firstContext:u.firstContext},_.sibling=f.sibling,_.index=f.index,_.ref=f.ref,_}function r8(f,u,_,y,$,l){var j=2;if(y=f,typeof f==="function")c7(f)&&(j=1);else if(typeof f==="string")j=5;else f:switch(f){case U3:return Ey(_.children,$,l,u);case l7:j=8,$|=8;break;case Q9:return f=au(12,_,u,$|2),f.elementType=Q9,f.lanes=l,f;case A9:return f=au(13,_,u,$),f.elementType=A9,f.lanes=l,f;case U9:return f=au(19,_,u,$),f.elementType=U9,f.lanes=l,f;case eA:return z4(_,$,l,u);default:if(typeof f==="object"&&f!==null)switch(f.$$typeof){case aA:j=10;break f;case dA:j=9;break f;case j7:j=11;break f;case J7:j=14;break f;case Z_:j=16,y=null;break f}throw Error(Ff(130,f==null?f:typeof f,""))}return u=au(j,_,u,$),u.elementType=f,u.type=y,u.lanes=l,u}function Ey(f,u,_,y){return f=au(7,f,y,u),f.lanes=_,f}function z4(f,u,_,y){return f=au(22,f,y,u),f.elementType=eA,f.lanes=_,f.stateNode={isHidden:!1},f}function j9(f,u,_){return f=au(6,f,null,u),f.lanes=_,f}function J9(f,u,_){return u=au(4,f.children!==null?f.children:[],f.key,u),u.lanes=_,u.stateNode={containerInfo:f.containerInfo,pendingChildren:null,implementation:f.implementation},u}function ZO(f,u,_,y,$){this.tag=u,this.containerInfo=f,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=i2(0),this.expirationTimes=i2(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=i2(0),this.identifierPrefix=y,this.onRecoverableError=$,this.mutableSourceEagerHydrationData=null}function p7(f,u,_,y,$,l,j,J,F){return f=new ZO(f,u,_,J,F),u===1?(u=1,l===!0&&(u|=8)):u=0,l=au(3,null,null,u),f.current=l,l.stateNode=f,l.memoizedState={element:y,isDehydrated:_,cache:null,transitions:null,pendingSuspenseBoundaries:null},Y7(l),f}function qO(f,u,_){var y=3{function tW(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=="function")return;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(tW)}catch(f){console.error(f)}}tW(),sW.exports=nW()});var aW=Mu((n7)=>{var oW=g7();n7.createRoot=oW.createRoot,n7.hydrateRoot=oW.hydrateRoot;var XO});var UG=Mu((p4)=>{var SN=I0(),rN=Symbol.for("react.element"),PN=Symbol.for("react.fragment"),CN=Object.prototype.hasOwnProperty,RN=SN.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,xN={key:!0,ref:!0,__self:!0,__source:!0};function AG(f,u,_){var y,$={},l=null,j=null;_!==void 0&&(l=""+_),u.key!==void 0&&(l=""+u.key),u.ref!==void 0&&(j=u.ref);for(y in u)CN.call(u,y)&&!xN.hasOwnProperty(y)&&($[y]=u[y]);if(f&&f.defaultProps)for(y in u=f.defaultProps,u)$[y]===void 0&&($[y]=u[y]);return{$$typeof:rN,type:f,key:l,ref:j,props:$,_owner:RN.current}}p4.Fragment=PN;p4.jsx=AG;p4.jsxs=AG});var zG=Mu((br,WG)=>{WG.exports=UG()});var kK=Mu((mK)=>{var F$=I0();function eB(f,u){return f===u&&(f!==0||1/f===1/u)||f!==f&&u!==u}var fw=typeof Object.is==="function"?Object.is:eB,uw=F$.useState,_w=F$.useEffect,yw=F$.useLayoutEffect,$w=F$.useDebugValue;function lw(f,u){var _=u(),y=uw({inst:{value:_,getSnapshot:u}}),$=y[0].inst,l=y[1];return yw(function(){$.value=_,$.getSnapshot=u,YF($)&&l({inst:$})},[f,_,u]),_w(function(){return YF($)&&l({inst:$}),f(function(){YF($)&&l({inst:$})})},[f]),$w(_),_}function YF(f){var u=f.getSnapshot;f=f.value;try{var _=u();return!fw(f,_)}catch(y){return!0}}function jw(f,u){return u()}var Jw=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?jw:lw;mK.useSyncExternalStore=F$.useSyncExternalStore!==void 0?F$.useSyncExternalStore:Jw});var gK=Mu((Sb,iK)=>{iK.exports=kK()});var tK=Mu((nK)=>{var R5=I0(),Fw=gK();function Qw(f,u){return f===u&&(f!==0||1/f===1/u)||f!==f&&u!==u}var Aw=typeof Object.is==="function"?Object.is:Qw,Uw=Fw.useSyncExternalStore,Ww=R5.useRef,zw=R5.useEffect,Gw=R5.useMemo,Kw=R5.useDebugValue;nK.useSyncExternalStoreWithSelector=function(f,u,_,y,$){var l=Ww(null);if(l.current===null){var j={hasValue:!1,value:null};l.current=j}else j=l.current;l=Gw(function(){function F(K){if(!A){if(A=!0,U=K,K=y(K),$!==void 0&&j.hasValue){var q=j.value;if($(q,K))return z=q}return z=K}if(q=z,Aw(U,K))return q;var E=y(K);if($!==void 0&&$(q,E))return U=K,q;return U=K,z=E}var A=!1,U,z,W=_===void 0?null:_;return[function(){return F(u())},W===null?void 0:function(){return F(W())}]},[u,_,y,$]);var J=Uw(f,l[0],l[1]);return zw(function(){j.hasValue=!0,j.value=J},[J]),Kw(J),J}});var oK=Mu((Pb,sK)=>{sK.exports=tK()});var Pl=rf(I0(),1),OH=rf(aW(),1);var O4=rf(I0(),1);class v3 extends Error{unideskRequestError=!0;meta;constructor(f,u){super(f);this.name="UniDeskRequestError",this.meta=u}}function NO(f){return new Promise((u)=>setTimeout(u,f))}function w6(f,u="操作失败"){return f instanceof Error?f.message:String(f||u)}function H4(f,u=500){if(f===null||f===void 0)return"";let _=typeof f==="string"?f:JSON.stringify(f),y=String(_||"").replace(/\s+/gu," ").trim();return y.length>u?`${y.slice(0,u)}...`:y}function LO(f){try{let u=typeof location<"u"&&location.origin?location.origin:"http://localhost";return new URL(f,u).toString()}catch{return f}}function dW(f){return String(f.method||"GET").toUpperCase()}function YO(f){if(f===null||f===void 0)return!1;if(typeof f!=="object")return!1;if(typeof Blob<"u"&&f instanceof Blob)return!1;if(typeof FormData<"u"&&f instanceof FormData)return!1;if(typeof URLSearchParams<"u"&&f instanceof URLSearchParams)return!1;if(typeof ArrayBuffer<"u"&&f instanceof ArrayBuffer)return!1;return!0}function eW(f){let u=new Headers(f.headers||{}),_=YO(f.body)?JSON.stringify(f.body):f.body;if(_&&!u.has("content-type")&&typeof _==="string")u.set("content-type","application/json");return{...f,credentials:f.credentials||"same-origin",body:_,headers:u}}function fz(f){if(f?.error&&typeof f.error==="object"&&typeof f.error.message==="string")return f.error.message;if(typeof f?.error==="string")return f.error;if(typeof f?.message==="string")return f.message;if(typeof f?.detail==="string")return f.detail;return""}function BO(f,u){if(!f||typeof f!=="object"||Array.isArray(f))return!1;return u.some((_)=>_!==!1&&f[_]===!1)}function Y6(f,u,_,y,$={}){return{kind:f,method:_,url:LO(u),occurredAt:y.toISOString(),...$}}function B6(f,u){if(!f)return"请求失败";return`HTTP ${f}${u?` ${u}`:""}`}function uz(f){try{return{body:f?JSON.parse(f):null,parseError:""}}catch(u){return{body:{text:f},parseError:w6(u,"parse failed")}}}async function wf(f,u={},_=0){let{failureFields:y=["ok"],strictJson:$=!1,retryInvalidJson:l=0,retryDelayMs:j=120,invalidJsonPrefix:J="服务返回了无效 JSON",invalidJsonPreview:F=!1,responsePreviewLength:A=500,...U}=u,z=dW(U),W=new Date,K;try{K=await fetch(f,eW(U))}catch(O){let G=w6(O,"网络请求失败");throw new v3(G,Y6("network",f,z,W,{upstreamMessage:G}))}let q=await K.text(),E=uz(q);if(E.parseError){if($&&z==="GET"&&_=300)?B6(f.meta.status,f.meta.statusText):"应用请求失败",l=f.meta.status?B6(f.meta.status):"",j=(F)=>!F||F===$||F===l,J=!j(f.message)?f.message:j(f.meta.upstreamMessage)?"":f.meta.upstreamMessage||"";return{title:$,message:J,status:f.meta.status,statusText:f.meta.statusText,method:f.meta.method,url:f.meta.url,occurredAt:wO(f.meta.occurredAt),responsePreview:f.meta.responsePreview,parseError:f.meta.parseError,structured:!0}}let y=w6(f,u).split(/\r?\n/u);return{title:y[0]||u,message:y.slice(1).join(` +`),structured:y.length>1}}function DO(f,u="操作失败"){let _=t7(f,u),y=[_.title];if(_.message)y.push(`原因: ${_.message}`);if(_.method||_.url)y.push(`请求: ${[_.method,_.url].filter(Boolean).join(" ")}`);if(_.status)y.push(`状态: ${B6(_.status,_.statusText)}`);if(_.occurredAt)y.push(`时间: ${_.occurredAt}`);if(_.parseError)y.push(`解析错误: ${_.parseError}`);if(_.responsePreview&&_.responsePreview!==_.message)y.push(`响应预览: ${_.responsePreview}`);return y.filter(Boolean).join(` +`)}function Mf(f,u="操作失败"){return yz(f)?DO(f,u):w6(f,u)}var $z=rf(I0(),1);var R_=$z.default.createElement;function D6(f,u){return u?[R_("dt",{key:`${f}-label`},f),R_("dd",{key:f},u)]:null}function H0({error:f,wide:u=!1,fallback:_="操作失败",className:y=""}){if(!f)return null;let $=t7(f,_),l=[D6("请求",[$.method,$.url].filter(Boolean).join(" ")),D6("状态",$.status?`HTTP ${$.status}${$.statusText?` ${$.statusText}`:""}`:""),D6("时间",$.occurredAt),D6("解析错误",$.parseError),D6("响应预览",$.responsePreview)].filter(Boolean);return R_("div",{className:`form-error unidesk-error${u?" wide":""}${y?` ${y}`:""}`,role:"alert","data-testid":"unidesk-error"},R_("div",{className:"unidesk-error-title"},R_("strong",null,$.title),$.status?R_("span",{className:"unidesk-error-code"},`HTTP ${$.status}`):null),$.message?R_("pre",{className:"unidesk-error-message"},$.message):null,l.length>0?R_("dl",{className:"unidesk-error-details"},l):null)}var i=O4.default.createElement,{useEffect:TO}=O4.default,E4=O4.default.useState,wy={label:"主用户私聊账号",userId:645275593};function T6(f){if(!f)return"--";let u=new Date(f);if(Number.isNaN(u.getTime()))return"--";return u.toLocaleString("zh-CN",{hour12:!1})}function MO(f){return f.toLocaleTimeString("zh-CN",{hour12:!1})}function s7(f){let u=Number(f);return Number.isFinite(u)?u.toLocaleString("zh-CN"):"--"}async function __(f,u={}){return wf(f,{failureFields:["ok","success"],...u})}function V4({status:f,children:u}){let _=String(f||"unknown").toLowerCase();return i("span",{className:`status-badge ${_}`},u||f||"unknown")}function b3({label:f,value:u,hint:_,tone:y}){return i("article",{className:`metric-card ${y||""}`},i("div",{className:"metric-label"},f),i("div",{className:"metric-value"},u),i("div",{className:"metric-hint"},_))}function h3({title:f,eyebrow:u,actions:_,children:y,className:$}){return i("section",{className:`panel ${$||""}`},i("div",{className:"panel-head"},i("div",null,u?i("p",{className:"panel-eyebrow"},u):null,i("h2",null,f)),_?i("div",{className:"panel-actions"},_):null),i("div",{className:"panel-body"},y))}function M6({title:f,data:u,onOpen:_,testId:y}){return i("button",{type:"button",className:"ghost-btn","data-testid":y,onClick:($)=>{$?.stopPropagation?.(),_(f,u)}},"查看原始JSON")}function S6({title:f,text:u}){return i("div",{className:"empty-state"},i("strong",null,f),i("span",null,u))}function SO(f){return f?.runtime&&typeof f.runtime==="object"&&!Array.isArray(f.runtime)?f.runtime:{}}function rO(f){return f?.backend&&typeof f.backend==="object"&&!Array.isArray(f.backend)?f.backend:{}}function PO(f){return f?.repository&&typeof f.repository==="object"&&!Array.isArray(f.repository)?f.repository:{}}function x_(f,u){return`${f}/microservices/claudeqq/proxy${u}`}function CO(f){return Array.isArray(f?.events)?f.events.slice(0,80):[]}function RO(f){return Array.isArray(f?.subscriptions)?f.subscriptions.slice(0,50):[]}function xO(f){return Array.isArray(f?.messages)?f.messages.slice(0,30):[]}function lz(f){let u=f?.text??f?.message??f?.raw?.raw_message;if(typeof u!=="string")return"--";return u.length>180?`${u.slice(0,177)}...`:u}function jz(f){let u=f?.groupId??f?.group_id??(f?.message_type==="group"?f?.target_id:void 0),_=f?.userId??f?.user_id??(f?.message_type==="private"?f?.target_id:void 0);if(u)return`群 ${u}`;if(_)return`私聊 ${_}`;return"--"}function Jz({microservices:f,onRaw:u,apiBaseUrl:_="/api"}){let y=f.find((T)=>T.id==="claudeqq")||null,[$,l]=E4({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}),[j,J]=E4({targetType:"private",targetId:String(wy.userId),message:""}),[F,A]=E4({name:"unidesk-callback",targetUrl:"",eventTypes:"message",secret:""}),[U,z]=E4("");async function W(){if(!y)return;l((T)=>({...T,loading:!0,error:""}));try{let[T,Y,R,m,p]=await Promise.all([__(`${_}/microservices/claudeqq/health`),__(x_(_,"/api/server/status")),__(x_(_,"/api/events/recent?limit=60")),__(x_(_,"/api/events/subscriptions")),__(x_(_,"/api/messages/sent?limit=20"))]);if(l((n)=>({...n,loading:!1,error:"",health:T,status:Y,events:R,subscriptions:m,sent:p,refreshedAt:new Date})),!$.qrcodeFetched)K(!1)}catch(T){l((Y)=>({...Y,loading:!1,error:Mf(T,"ClaudeQQ 加载失败")}))}}async function K(T=!0){if(!y)return;l((Y)=>({...Y,qrLoading:!0,error:T?"":Y.error}));try{let Y=await __(x_(_,"/api/napcat/login")),R=Y?.napcat?.qrcode||Y?.qrcode||null;l((m)=>({...m,qrLoading:!1,error:"",napcatLogin:Y,napcatQrcode:R,qrcodeFetched:!0,qrcodeRefreshedAt:new Date}))}catch(Y){l((R)=>({...R,qrLoading:!1,error:T||!R.napcatQrcode?Mf(Y,"NapCat 二维码加载失败"):R.error}))}}async function q(T){T.preventDefault(),z("");let Y=Number(j.targetId);if(!Number.isFinite(Y)||Y<=0||j.message.trim().length===0){l((R)=>({...R,error:"请填写 QQ 目标和消息内容"}));return}try{await __(x_(_,"/api/push/text"),{method:"POST",body:JSON.stringify({userId:j.targetType==="private"?Y:void 0,groupId:j.targetType==="group"?Y:void 0,message:j.message})}),J((R)=>({...R,targetType:"private",targetId:String(wy.userId),message:""})),z("消息推送请求已提交"),await W()}catch(R){l((m)=>({...m,error:Mf(R,"发送失败")}))}}async function E(T){if(T.preventDefault(),z(""),F.targetUrl.trim().length===0){l((Y)=>({...Y,error:"请填写订阅回调 URL"}));return}try{await __(x_(_,"/api/events/subscriptions"),{method:"POST",body:JSON.stringify({name:F.name,targetUrl:F.targetUrl,eventTypes:F.eventTypes.split(",").map((Y)=>Y.trim()).filter(Boolean),secret:F.secret||void 0,enabled:!0})}),z("事件订阅已创建"),await W()}catch(Y){l((R)=>({...R,error:Mf(Y,"订阅失败")}))}}async function O(T){if(!T)return;z("");try{await __(x_(_,`/api/events/subscriptions/${encodeURIComponent(T)}`),{method:"DELETE"}),z("事件订阅已删除"),await W()}catch(Y){l((R)=>({...R,error:Mf(Y,"删除订阅失败")}))}}if(TO(()=>{if(!y)return;W();return},[y?.id,y?.runtime?.providerStatus]),!y)return i(S6,{title:"ClaudeQQ 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=claudeqq"});let G=SO(y),H=PO(y),Z=rO(y),V=$.health||{},L=$.status||{},M=$.napcatLogin||{},N=V.napcat||L.napcat||{},D={...M.napcat||{},...N,qrcode:$.napcatQrcode||{},webui:N.webui||M.napcat?.webui},x=M.login||{},c=$.napcatQrcode||{},v=CO($.events),C=RO($.subscriptions),P=xO($.sent),w=Boolean(D.httpConnected||x.ready),r=String(D.loginState||x.state||(w?"logged_in":"unknown")),S=Boolean(c.available&&c.dataUrl);return i("div",{className:"claudeqq-page","data-testid":"claudeqq-page"},i(h3,{title:"ClaudeQQ 工作台",eyebrow:"D601 QQ Event Gateway",actions:i("div",{className:"panel-actions"},i("button",{type:"button",className:"ghost-btn",onClick:W,disabled:$.loading,"data-testid":"claudeqq-refresh-button"},$.loading?"刷新中":"刷新"),i(M6,{title:"ClaudeQQ 用户服务",data:y,onOpen:u,testId:"raw-claudeqq-service"}))},i("div",{className:"findjob-hero"},i("div",null,i("div",{className:"node-version-line"},i(V4,{status:G.providerStatus==="online"?"online":"warn"},G.providerStatus||"unknown"),i("span",null,y.providerId),i("span",null,Z.public?"公网暴露":"仅 UniDesk frontend 代理访问")),i("p",{className:"muted paragraph"},y.description)),i("div",{className:"microservice-ref-card"},i("span",null,"Repo"),i("strong",null,H.url||"--"),i("code",null,H.commitId||"--")),i("div",{className:"microservice-ref-card"},i("span",null,"D601 Docker"),i("strong",null,`${Z.nodeBindHost||"--"}:${Z.nodePort||"--"}`),i("code",null,`${H.composeFile||"--"} / ${H.composeService||"--"}`))),i(H0,{error:$.error,wide:!0}),U?i("div",{className:"form-success wide"},U):null),i("div",{className:"metric-grid"},i(b3,{label:"Health",value:V.ok||V.status==="ok"?"OK":"--",hint:"D601 /health",tone:V.ok||V.status==="ok"?"ok":"warn"}),i(b3,{label:"NapCat HTTP",value:D.httpConnected||D.http?.connected?"OK":"离线",hint:`${D.httpHost||V.napcat?.httpHost||"--"}:${D.httpPort||V.napcat?.httpPort||"--"}`}),i(b3,{label:"NapCat WS",value:D.wsConnected||D.ws?.connected?"OK":"离线",hint:`${D.wsHost||V.napcat?.wsHost||"--"}:${D.wsPort||V.napcat?.wsPort||"--"}`}),i(b3,{label:"事件缓存",value:s7($.events?.count??v.length),hint:"recent QQ events"}),i(b3,{label:"订阅",value:s7($.subscriptions?.count??C.length),hint:"webhook subscribers"}),i(b3,{label:"已发送",value:s7($.sent?.count??P.length),hint:"sent message log"})),i("div",{className:"findjob-grid"},i(h3,{title:"NapCat 容器登录",eyebrow:"QR Login",className:"claudeqq-login-panel",actions:i("div",{className:"panel-actions inline-actions"},i("button",{type:"button",className:"ghost-btn",onClick:()=>K(!0),disabled:$.qrLoading,"data-testid":"claudeqq-napcat-refresh"},$.qrLoading?"刷新中":"手动刷新二维码"),i(M6,{title:"NapCat Login",data:$.napcatLogin,onOpen:u,testId:"raw-claudeqq-napcat-login"}))},i("div",{className:"claudeqq-login-card","data-testid":"claudeqq-napcat-login"},i("div",{className:"claudeqq-qr-frame"},S?i("img",{src:c.dataUrl,alt:"NapCat QQ 登录二维码","data-testid":"claudeqq-napcat-qrcode"}):i(S6,{title:"等待二维码",text:"NapCat 容器启动后会把登录二维码写入 cache/qrcode.png"})),i("div",{className:"claudeqq-login-copy"},i("div",{className:"node-version-line"},i(V4,{status:w?"online":S?"warn":"unknown"},w?"已登录":S?"待扫码":"等待二维码"),i("span",null,r),i("span",null,"D601 containerized")),i("p",{className:"muted paragraph"},w?"NapCat 已登录,ClaudeQQ 可通过容器内 HTTP/WS 链路收发 QQ 消息。":"用手机 QQ 扫描二维码授权登录。二维码只在首次加载或手动刷新时更新,D601 的 NapCat 端口仍只绑定 127.0.0.1。"),i("div",{className:"microservice-ref-card"},i("span",null,"NapCat WebUI"),i("strong",null,D.webui?.url||"http://napcat:6099/webui"),i("code",null,"local-only / proxied QR login")),i("div",{className:"microservice-ref-card"},i("span",null,"QR Source"),i("strong",null,c.modifiedAt?T6(c.modifiedAt):$.qrcodeRefreshedAt?T6($.qrcodeRefreshedAt):"--"),i("code",null,c.file||"/napcat/cache/qrcode.png"))))),i(h3,{title:"消息推送",eyebrow:"Push API"},i("div",{className:"microservice-ref-card"},i("span",null,wy.label),i("strong",null,String(wy.userId)),i("code",null,"private userId / 默认推送测试目标")),i("form",{className:"stack-form",onSubmit:q,"data-testid":"claudeqq-push-form"},i("label",null,"目标类型",i("select",{value:j.targetType,onChange:(T)=>J((Y)=>({...Y,targetType:T.target.value}))},i("option",{value:"private"},"私聊 userId"),i("option",{value:"group"},"群 groupId"))),i("label",null,"QQ ID",i("input",{value:j.targetId,onChange:(T)=>J((Y)=>({...Y,targetId:T.target.value})),placeholder:String(wy.userId)})),i("label",null,"消息内容",i("textarea",{value:j.message,onChange:(T)=>J((Y)=>({...Y,message:T.target.value})),rows:4,placeholder:"通过 ClaudeQQ 推送一条 QQ 消息"})),i("button",{type:"submit",className:"primary-btn"},"发送 QQ 消息")),i("p",{className:"muted paragraph"},`主 server 和其他用户服务可通过 UniDesk 同源代理调用 /api/push/text;当前人工推送测试默认使用 ${wy.label} ${wy.userId},不需要暴露 D601 后端端口。`)),i(h3,{title:"QQ 事件订阅",eyebrow:"Webhook Subscription"},i("form",{className:"stack-form",onSubmit:E,"data-testid":"claudeqq-subscription-form"},i("label",null,"订阅名称",i("input",{value:F.name,onChange:(T)=>A((Y)=>({...Y,name:T.target.value}))})),i("label",null,"回调 URL",i("input",{value:F.targetUrl,onChange:(T)=>A((Y)=>({...Y,targetUrl:T.target.value})),placeholder:"http://host.docker.internal:18080/..."})),i("label",null,"事件类型",i("input",{value:F.eventTypes,onChange:(T)=>A((Y)=>({...Y,eventTypes:T.target.value})),placeholder:"message,notice"})),i("label",null,"签名密钥",i("input",{value:F.secret,onChange:(T)=>A((Y)=>({...Y,secret:T.target.value})),placeholder:"可选,生成 x-claudeqq-signature"})),i("button",{type:"submit",className:"primary-btn"},"创建订阅")),C.length===0?i(S6,{title:"暂无订阅",text:"可以为 main server 或其他用户服务注册 HTTP webhook"}):i("div",{className:"table-wrap","data-testid":"claudeqq-subscription-table"},i("table",null,i("thead",null,i("tr",null,i("th",null,"名称"),i("th",null,"状态"),i("th",null,"事件"),i("th",null,"回调"),i("th",null,"最近投递"),i("th",null,"操作"))),i("tbody",null,C.map((T)=>i("tr",{key:T.id},i("td",null,i("strong",null,T.name||T.id),i("code",null,T.id||"--")),i("td",null,i(V4,{status:T.enabled?"online":"warn"},T.enabled?"enabled":"disabled")),i("td",null,Array.isArray(T.eventTypes)?T.eventTypes.join(", "):"message"),i("td",null,T.targetUrl||"--"),i("td",null,T.lastDelivery?`${T.lastDelivery.ok?"OK":"FAIL"} ${T6(T.lastDelivery.at)}`:"--"),i("td",null,i("button",{type:"button",className:"ghost-btn",onClick:()=>O(T.id)},"删除"))))))),i("div",{className:"panel-actions inline-actions"},i(M6,{title:"ClaudeQQ Subscriptions",data:$.subscriptions,onOpen:u,testId:"raw-claudeqq-subscriptions"}))),i(h3,{title:"最近 QQ 事件",eyebrow:$.refreshedAt?`Updated ${MO($.refreshedAt)}`:"Event Stream"},v.length===0?i(S6,{title:"暂无事件",text:"等待 NapCat WebSocket 上报 QQ 消息事件,或通过订阅 API 消费后续事件"}):i("div",{className:"table-wrap","data-testid":"claudeqq-event-list"},i("table",null,i("thead",null,i("tr",null,i("th",null,"时间"),i("th",null,"类型"),i("th",null,"会话"),i("th",null,"消息"),i("th",null,"ID"))),i("tbody",null,v.map((T)=>i("tr",{key:T.id},i("td",null,T6(T.receivedAt||T.timestamp)),i("td",null,i(V4,{status:T.postType||T.eventType},T.postType||T.eventType||"--")),i("td",null,jz(T)),i("td",null,lz(T)),i("td",null,i("code",null,T.messageId||T.id||"--"))))))),i("div",{className:"panel-actions inline-actions"},i(M6,{title:"ClaudeQQ Events",data:$.events,onOpen:u,testId:"raw-claudeqq-events"}))),i(h3,{title:"已发送消息",eyebrow:`${P.length} Sent`},P.length===0?i(S6,{title:"暂无发送记录",text:"发送日志来自 ClaudeQQ bot_workspace/messages/sent_messages.jsonl"}):i("div",{className:"table-wrap"},i("table",null,i("thead",null,i("tr",null,i("th",null,"时间"),i("th",null,"目标"),i("th",null,"消息"),i("th",null,"结果"))),i("tbody",null,P.map((T,Y)=>i("tr",{key:T.id||Y},i("td",null,T6(T.timestamp||T.sentAt||T.createdAt)),i("td",null,jz(T)),i("td",null,lz(T)),i("td",null,T.status||T.messageId||T.message_id||"--")))))),i("div",{className:"panel-actions inline-actions"},i(M6,{title:"ClaudeQQ Sent Messages",data:$.sent,onOpen:u,testId:"raw-claudeqq-sent"})))))}var S4=rf(I0(),1);var $j=rf(I0(),1),Lf=$j.default.createElement,{useEffect:vO,useRef:Fz}=$j.default;function bO(f,u){return Yz(f.toTrace(u))}function Zz(f){if(!f)return"--";let u=new Date(f);if(Number.isNaN(u.getTime()))return"--";return u.toLocaleString("zh-CN",{hour12:!1})}function hO(f){let u=Number(f);if(!Number.isFinite(u)||u<0)return"--";let _=Math.floor(u/1000),y=Math.floor(_/3600),$=Math.floor(_%3600/60),l=_%60;if(y>0)return`${y}h ${String($).padStart(2,"0")}m`;if($>0)return`${$}m ${String(l).padStart(2,"0")}s`;return`${l}s`}function Dy(f){let u=Number(f);return Number.isFinite(u)&&u>=0?u:null}function qz(f,u=180){let _=String(f||"").replace(/\s+/gu," ").trim();return _.length>u?`${_.slice(0,u-1)}…`:_}function IO(f){if(!f)return 0;return f.split(/\r?\n/u).length}function fj(f){return{ran:"Ran",explored:"Explored",edited:"Edited",toolGroup:"Tool calls",plan:"Plan",message:"Message",system:"System",error:"Error"}[f]||"Message"}function uj(f){let u=Number(f||0);return Number.isFinite(u)&&u>0?`… +${Math.floor(u)} lines`:""}function cO(f){return(Array.isArray(f)?f:[]).reduce((u,_)=>Math.max(u,Number(_?.seq??0)),0)}function Qz(f){return["explored","edited","ran"].includes(String(f?.kind||""))}function Hz(f){let u={read:0,edit:0,run:0};for(let _ of f){let y=String(_?.kind||"");if(y==="explored")u.read+=1;else if(y==="edited")u.edit+=1;else if(y==="ran")u.run+=1}return u}function Ez(f){let u=Hz(f);return`${u.read} read, ${u.edit} edit, ${u.run} run`}function Vz(f){return f.replace(/^['"`([{<]+/u,"").replace(/['"`)\]}>.,;:]+$/u,"").replace(/:\d+(?::\d+)?$/u,"").trim()}function Az(f){let _=String(f||"").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)||[],y=[];for(let $ of _){let l=Vz($);if(l.length<2||l.includes("..."))continue;if(/^(http|https|status|method)$/iu.test(l))continue;if(!y.includes(l))y.push(l)}return y}function o7(f,u=4){if(f.length===0)return"--";let _=f.slice(0,u).join(", ");return f.length>u?`${_} +${f.length-u}`:_}function Uz(f){let u="";for(let _ of f){if(_.length===0)continue;if(u.length>0&&!u.endsWith(` `)&&!_.startsWith(` `))u+=` -`;u+=_}return u}function Hz(f){let u=String(f||"").replace(/\r\n/gu,` +`;u+=_}return u}function Oz(f){let u=String(f||"").replace(/\r\n/gu,` `).replace(/\r/gu,` `).trimEnd();return u.length>0?u.split(` -`):[]}function e7(f){let u=String(f.status||"").trim();if(u.length>0)return u;let _=String(f.bodyPreview||"");return/^(item\/[A-Za-z]+(?:\/[A-Za-z]+)?):/u.exec(_)?.[1]||"item/fileChange"}function xO(f){let u=String(f.bodyPreview||"");return/file changes status=([A-Za-z0-9_-]+)/u.exec(u)?.[1]}function vO(f){return/^item\/(?:started|completed): file changes status=/u.test(String(f||"").trim())}function Vz(f){if(String(f.kind||"")!=="edited")return!1;let u=String(f.status||""),_=String(f.title||""),y=String(f.bodyPreview||""),l=String(f.commandPreview||"");if(_==="Edited files")return!0;if(/^item\/fileChange\//u.test(u))return!0;if((u==="item/started"||u==="item/completed")&&/file changes status=/u.test(y))return!0;if(/^Success\. Updated the following files:/mu.test(y))return!0;if(/^diff --git /mu.test(y))return!0;return l.length===0&&/^([AMDRCU?]{1,2})\s+\S+/mu.test(y)}function h3(f){return qz(String(f||"").replace(/^[ab]\//u,"").trim())}function _j(f){let u=/^([AMDRCU?]{1,2})\s+(.+)$/u.exec(f);if(!u)return null;let _=h3(u[2]||"");return _.length>0?{status:u[1]||"M",path:_}:null}function yj(f){let u=/^\*\*\*\s+(Add|Update|Delete)\s+File:\s+(.+)$/u.exec(f);if(u){let y=u[1]==="Add"?"A":u[1]==="Delete"?"D":"M",l=h3(u[2]||"");return l.length>0?{status:y,path:l}:null}let _=/^\*\*\*\s+Move to:\s+(.+)$/u.exec(f);if(_){let y=h3(_[1]||"");return y.length>0?{status:"R",path:y}:null}return null}function bO(f){let u=[],_=(l,$)=>{let j=h3($);if(j.length===0||j==="/dev/null")return;let J=u.find((F)=>F.path===j);if(J){if(J.status==="M"&&l!=="M")J.status=l;return}u.push({status:l,path:j})},y="";for(let l of Hz(f)){let $=_j(l)||yj(l);if($!==null){_($.status,$.path),y=$.path;continue}let j=/^diff --git a\/(.+?) b\/(.+)$/u.exec(l);if(j){let z=j[2]||j[1]||"";_("M",z),y=h3(z);continue}let J=/^\+\+\+ b\/(.+)$/u.exec(l);if(J&&J[1]!=="/dev/null"){_("M",J[1]||""),y=h3(J[1]||"");continue}if(/^new file mode /u.exec(l)&&y)_("A",y);if(/^deleted file mode /u.exec(l)&&y)_("D",y);let U=/^rename to (.+)$/u.exec(l);if(U)_("R",U[1]||"")}return u}function hO(f){if(_j(f)!==null||yj(f)!==null)return"file";if(/^(diff --git |index |--- |\+\+\+ |\*\*\* Begin Patch|\*\*\* End Patch)/u.test(f))return"meta";if(/^@@ /u.test(f))return"hunk";if(/^\+/u.test(f))return"add";if(/^-/u.test(f))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(f))return"note";return"context"}function IO(f){return Hz(f).map((u)=>{let _=_j(u)||yj(u);if(_!==null)return{text:u,kind:"file",path:_.path,status:_.status};return{text:u,kind:hO(u)}})}function cO(f){return f.reduce((u,_)=>{if(_.kind==="add")u.added+=1;else if(_.kind==="del")u.removed+=1;return u},{added:0,removed:0})}function Az(f,u){return`${u} ${f} line${f===1?"":"s"}`}function pO(f,u){let _=[];if(f>0)_.push(Az(f,"Added"));if(u>0)_.push(Az(u,"removed"));return _.join(", ")}function mO(f){for(let _=f.length-1;_>=0;_-=1){let y=String(f[_]?.status||"").trim();if(y.length>0)return y}let u=String(f[f.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 kO(f){return`${f} file${f===1?"":"s"}`}function Ez(f){let u=f.length>0?f:[],_=Fz(u.map((W)=>String(W.bodyPreview||""))),l=Fz(u.map((W)=>String(W.bodyPreview||"")).filter((W)=>W.trim().length>0&&!vO(W)))||_,$=bO(l||_),j=u.map((W)=>({method:e7(W),status:xO(W),at:W.at})),J=IO(l||_),F=cO(J),Q=pO(F.added,F.removed),U=$.length>0?kO($.length):"",z=Q.length>0?`${Q}${U?` in ${U}`:""}`:$.length>0?U:Gz(l||_||"File changes",72);return{status:mO(j),summary:z,files:$,stages:j,lines:J,addedLines:F.added,removedLines:F.removed,rawText:_}}function iO(f){let u=f[0],_=f[f.length-1]||u,y=Ez(f);return{...u,seq:Number.isFinite(Number(_?.seq))?Number(_?.seq):Number(u?.seq??0),at:_?.at||u?.at,title:y.files.length>0?`Edited ${y.summary}`:"Edited files",status:y.status,commandPreview:"",commandOmittedLines:void 0,bodyPreview:y.rawText,bodyOmittedLines:f.reduce((l,$)=>l+Number($.bodyOmittedLines||0),0)||void 0,rawSeqs:f.flatMap((l)=>Array.isArray(l?.rawSeqs)?l.rawSeqs:[l?.seq]).filter((l)=>l!==void 0),editObservation:y}}function gO(f){let u=Array.isArray(f)?f:[],_=[],y=[],l=()=>{if(y.length===0)return;_.push(iO(y)),y=[]};for(let $ of u){if(Vz($)){if(e7($)==="item/started"&&y.length>0)l();if(y.push($),e7($)==="item/completed")l();continue}l(),_.push($)}return l(),_}function Oz(f){let u=[],_=[],y=[],l=(Q,U)=>{for(let z of U)if(!Q.includes(z))Q.push(z)};for(let Q of f){let U=String(Q?.kind||""),z=[Q?.commandPreview,Q?.bodyPreview,Q?.title].map((W)=>String(W||"")).join(` -`);if(U==="explored")l(u,Jz(z));else if(U==="edited")l(_,Jz(z));else if(U==="ran"){let W=String(Q?.commandPreview||Q?.title||"").trim();if(W.length>0&&!y.includes(W))y.push(Gz(W,90))}}let $=f.map((Q)=>Date.parse(String(Q?.at||""))).filter((Q)=>Number.isFinite(Q)),j=$.length>=2?Math.max(0,Math.max(...$)-Math.min(...$)):0,J=f.reduce((Q,U)=>Q+(Dy(U?.durationMs)??Dy(U?.elapsedMs)??0),0),F=j>0?j:J;return{readFiles:u,editedFiles:_,runCommands:y,durationLabel:PO(F)}}function nO(f,u=3){let _=Array.isArray(f)?f:[],y=[],l=[],$=Math.max(0,u),j=new Set;for(let F=_.length-1;F>=0&&$>0;F-=1){let Q=_[F];if(!jz(Q))continue;j.add(Q),$-=1}let J=()=>{if(l.length>=2){let F=Kz(l);y.push({seq:Number(l[0]?.seq??0),at:l[0]?.at||l.at(-1)?.at,kind:"toolGroup",title:Zz(l),status:`${l.length} calls`,items:l,counts:F,digest:Oz(l),rawSeqs:l.flatMap((Q)=>Array.isArray(Q?.rawSeqs)?Q.rawSeqs:[Q?.seq]).filter((Q)=>Q!==void 0)})}else y.push(...l);l=[]};for(let F of _){if(jz(F)&&!j.has(F)){l.push(F);continue}J(),y.push(F)}return J(),y}function Xz(f){return(Array.isArray(f)?f:[]).map((u,_)=>({...u,seq:Number.isFinite(Number(u?.seq))?Number(u.seq):_+1,kind:String(u?.kind||"message"),at:u?.at===void 0?void 0:String(u.at),durationMs:Dy(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 t7(f){return Dy(f?.durationMs)??Dy(f?.elapsedMs)??Dy(f?.timing?.durationMs)??Dy(f?.metadata?.durationMs)??void 0}function s7(f,u){return f?.createdAt||f?.updatedAt||f?.completedAt||u||void 0}function o7(f,u){return f?.id||f?.messageId||u}function fj(f,u){let _=new Set(u.map((y)=>y.toLowerCase()));for(let y of Array.isArray(f?.inputFields)?f.inputFields:[]){let l=String(y?.key||"").toLowerCase();if(_.has(l))return String(y?.value||"")}return""}function tO(f){let u=String(f?.tool||f?.title||"").toLowerCase();if(/read|grep|glob|list|ls|find|search|view|cat|sed|rg/u.test(u))return"explored";if(/edit|write|patch|apply|update|create|delete/u.test(u))return"edited";let _=fj(f,["command","cmd"]);if(/\b(rg|grep|find|ls|cat|sed|tail|head|git status|git diff|ps)\b/u.test(_))return"explored";if(/\b(apply_patch|git apply|cat >|tee .*<<|sed -i|python3? .*write_text)\b/u.test(_))return"edited";return"ran"}function sO(f){let u=[],_=1;for(let y of Array.isArray(f)?f:[]){let l=y?.createdAt||y?.updatedAt||y?.completedAt,$=String(y?.role||"assistant").toLowerCase(),j=Array.isArray(y?.parts)?y.parts:[];for(let J of j){let F=String(J?.type||"").toLowerCase();if(F==="step-start"||F==="step-finish")continue;if(F==="text"||F==="reasoning"){let U=String(J?.textPreview||y?.textPreview||"").trim();if(U.length===0)continue;u.push({seq:_++,at:s7(J,l),kind:"message",title:F==="reasoning"?"Reasoning":$==="user"?"User message":$==="system"?"System message":"Assistant message",status:F==="reasoning"?"reasoning":$,bodyPreview:U,durationMs:t7(J),rawSeqs:[o7(J,_)]});continue}if(F==="tool"){let U=fj(J,["command","cmd"])||fj(J,["filePath","filepath","path"])||String(J?.title||J?.tool||"tool"),z=String(J?.outputPreview&&J.outputPreview!=="--"?J.outputPreview:J?.textPreview||"");u.push({seq:_++,at:s7(J,l),kind:tO(J),title:String(J?.title||J?.tool||"tool"),status:String(J?.status||""),commandPreview:U,bodyPreview:z,durationMs:t7(J),rawSeqs:[o7(J,_)]});continue}let Q=String(J?.textPreview||J?.title||F||"").trim();if(Q)u.push({seq:_++,at:s7(J,l),kind:"system",title:F||"part",bodyPreview:Q,status:String(J?.status||""),durationMs:t7(J),rawSeqs:[o7(J,_)]})}if(j.length===0&&y?.textPreview)u.push({seq:_++,at:l,kind:"message",title:`${$||"assistant"} message`,status:$,bodyPreview:String(y.textPreview),rawSeqs:[y?.messageId||_]})}return u}var Nz={source:"opencode",toTrace:sO};function oO(f){return String(f||"unknown").toLowerCase().replace(/[^a-z0-9_-]+/gu,"-")||"unknown"}function Qz(f){let u=String(f||"M").toUpperCase();if(u.startsWith("A")||u==="??")return"added";if(u.startsWith("D"))return"deleted";if(u.startsWith("R"))return"renamed";return"modified"}function aO(f){if(f==="item/fileChange/outputDelta")return"delta";return f.replace(/^item\//u,"")}function dO(f,u){if(f.kind==="file"){let l=String(f.status||"M");return Lf("div",{key:`${u}-${f.text}`,className:`codex-edit-diff-line file ${Qz(l)}`},Lf("span",{className:`codex-edit-file-status ${Qz(l)}`},l),Lf("code",null,f.path||f.text.replace(/^([AMDRCU?]{1,2})\s+/u,"")))}let _=f.kind==="add"||f.kind==="del"?f.text.slice(0,1):f.kind==="hunk"?"@@":f.kind==="note"?"ok":"",y=f.kind==="add"||f.kind==="del"?f.text.slice(1):f.text;return Lf("div",{key:`${u}-${f.text}`,className:`codex-edit-diff-line ${f.kind}`},Lf("span",{className:"codex-edit-diff-sign"},_),Lf("code",null,y||" "))}function eO(f,u){let _=f.lines.length>0?f.lines:f.files.map((l)=>({text:`${l.status} ${l.path}`,kind:"file",path:l.path,status:l.status})),y=Number(f.addedLines||0)+Number(f.removedLines||0)>0;return Lf("div",{className:"codex-edit-observation","data-testid":"codex-edit-observation"},Lf("div",{className:"codex-edit-observation-head"},Lf("span",{className:"codex-edit-window-controls","aria-hidden":"true"},Lf("i",null),Lf("i",null),Lf("i",null)),Lf("strong",null,y?"git diff":"git diff --stat"),Lf("code",null,f.summary||"File changes")),f.stages.length>0?Lf("div",{className:"codex-edit-stage-strip"},f.stages.map((l,$)=>Lf("span",{key:`${l.method}-${$}`,className:`codex-edit-stage ${oO(l.status||l.method)}`},Lf("b",null,aO(l.method)),l.status?Lf("em",null,l.status):null))):null,_.length>0?Lf("div",{className:"codex-edit-diff",role:"list"},_.map(dO)):null,u?Lf("div",{className:"codex-edit-omitted"},`${u} (查看原始JSON获取完整记录)`):null)}function Uz(f,u,_){let y=d7(_);return Lf("div",{className:`codex-transcript-stream ${f}`,"data-testid":`codex-trace-${f}`},Lf("span",{className:"codex-transcript-stream-label"},f),Lf("pre",{className:"codex-transcript-body"},u,y?` -${y} (查看原始JSON获取完整记录)`:""))}function Lz(f,u=!1){let _=String(f.kind||"message"),y=["ran","explored","edited"].includes(_),l=d7(f.commandOmittedLines),$=d7(f.bodyOmittedLines),j=String(f.commandPreview||(y?f.title||"":"")),J=String(f.stdoutPreview||""),F=String(f.stderrPreview||""),Q=J.length>0||F.length>0,U=Boolean(f.foldedReferencePrompt)&&String(f.fullPrompt||"").length>0,z=_==="edited"&&(f.editObservation!==void 0||Vz(f))?f.editObservation||Ez([f]):null;return Lf("article",{key:`${f.seq}-${_}`,className:`codex-transcript-item ${_} ${u?"nested":""}`},Lf("div",{className:"codex-transcript-main"},Lf("div",{className:"codex-transcript-title"},Lf("span",{className:"codex-output-channel"},a7(_)),y&&z===null?null:Lf("strong",null,z!==null?"File changes":String(f.title||a7(_))),f.status?Lf("code",null,String(z?.status||f.status)):null,Lf("time",null,zz(f.at))),j&&z===null?Lf("pre",{className:"codex-transcript-command"},j,l?` -${l}`:""):null,z!==null?eO(z,$):Q?Lf("div",{className:"codex-transcript-streams"},J.length>0?Uz("stdout",J,f.stdoutOmittedLines):null,F.length>0?Uz("stderr",F,f.stderrOmittedLines):null):f.bodyPreview?Lf("pre",{className:"codex-transcript-body"},String(f.bodyPreview),$?` -${$} (查看原始JSON获取完整记录)`:""):null,U?Lf("details",{className:"codex-initial-prompt-full","data-testid":"codex-initial-prompt-full"},Lf("summary",null,Lf("span",null,"引用注入已折叠,点击查看最终传入 Codex 的完整 prompt"),Lf("code",null,`${f.fullPromptLines||CO(String(f.fullPrompt||""))} lines / ${f.fullPromptChars||String(f.fullPrompt||"").length} chars`)),Lf("pre",{className:"codex-transcript-body codex-transcript-full-prompt","data-testid":"codex-initial-prompt-full-text"},String(f.fullPrompt||""))):null))}function fX(f){let u=Array.isArray(f.items)?f.items:[],_=f.digest&&typeof f.digest==="object"?f.digest:Oz(u);return Lf("article",{key:`${f.seq}-toolGroup`,className:"codex-transcript-item toolGroup"},Lf("div",{className:"codex-transcript-main"},Lf("details",{className:"codex-tool-group","data-testid":"codex-tool-group"},Lf("summary",null,Lf("div",{className:"codex-tool-group-head"},Lf("span",{className:"codex-output-channel"},a7("toolGroup")),Lf("strong",null,String(f.title||Zz(u))),Lf("code",null,String(f.status||`${u.length} calls`)),Lf("time",null,zz(f.at)))),Lf("div",{className:"codex-tool-group-digest"},Lf("span",null,`read: ${n7(Array.isArray(_.readFiles)?_.readFiles:[])}`),Lf("span",null,`edit: ${n7(Array.isArray(_.editedFiles)?_.editedFiles:[])}`),Lf("span",null,`run: ${n7(Array.isArray(_.runCommands)?_.runCommands:[],2)}`),Lf("span",null,`duration: ${_.durationLabel||"--"}`)),Lf("div",{className:"codex-tool-group-items"},u.map((y)=>Lz(y,!0))))))}var uX=16;function Wz(f){return f.scrollHeight-f.scrollTop-f.clientHeight<=uX}function V4({items:f,input:u,port:_,autoScroll:y=!1,loading:l=!1,hasDetail:$=!0,emptyText:j="等待 Trace 输出...",loadingText:J="正在加载完整 Trace...",testId:F="trace-output",className:Q="codex-transcript",keepRecentToolCalls:U=3,collapseTools:z=!0}){let W=$z(null),K=$z(!0),q=gO(_?SO(_,u):Xz(f)),V=z?nO(q,U):q,O=RO(q);rO(()=>{let Z=W.current;if(!y||!Z)return;if(!K.current&&!Wz(Z))return;Z.scrollTop=Z.scrollHeight,K.current=!0},[y,q.length,O]);let H={className:Q,ref:W,onScroll:(Z)=>{let E=Z.currentTarget;K.current=Wz(E)},"data-testid":F};if(l&&!$)return Lf("div",H,Lf("div",{className:"codex-output-empty"},J));return Lf("div",H,V.length===0?Lf("div",{className:"codex-output-empty"},j):V.map((Z)=>String(Z.kind||"")==="toolGroup"?fX(Z):Lz(Z)))}var B=D4.default.createElement,{useEffect:P$,useMemo:Yz,useRef:Zu}=D4.default,df=D4.default.useState,_X=120,Qj=24,yX=48;function Sy(f){if(!f)return"--";let u=new Date(f);if(Number.isNaN(u.getTime()))return"--";return u.toLocaleString("zh-CN",{hour12:!1})}function lX(f){return f.toLocaleTimeString("zh-CN",{hour12:!1})}function N4(f){let u=Number(f);if(!Number.isFinite(u)||u<0)return"--";let _=Math.floor(u/1000),y=Math.floor(_/3600),l=Math.floor(_%3600/60),$=_%60;if(y>0)return`${y}h ${String(l).padStart(2,"0")}m`;if(l>0)return`${l}m ${String($).padStart(2,"0")}s`;return`${$}s`}function lj(f){let u=Number(f);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 Rz(f,u=180){let _=String(f||"").replace(/\s+/gu," ").trim();return _.length>u?`${_.slice(0,u-1)}…`:_}async function M0(f,u={}){return Df(f,{strictJson:!0,retryInvalidJson:1,invalidJsonPrefix:"Codex Queue 返回了无效 JSON",invalidJsonPreview:!0,...u})}function y_({status:f,children:u}){let _=String(f||"unknown").toLowerCase();return B("span",{className:`status-badge ${_}`},u||f||"unknown")}function Ty({label:f,value:u,hint:_,tone:y}){return B("article",{className:`metric-card ${y||""}`},B("div",{className:"metric-label"},f),B("div",{className:"metric-value"},u),B("div",{className:"metric-hint"},_))}function My({title:f,eyebrow:u,summary:_,actions:y,children:l,className:$}){return B("section",{className:`panel ${$||""}`},B("div",{className:"panel-head"},B("div",null,u?B("p",{className:"panel-eyebrow"},u):null,B("h2",null,f),_?B("div",{className:"panel-summary"},_):null),y?B("div",{className:"panel-actions"},y):null),B("div",{className:"panel-body"},l))}function Bz({title:f,data:u,onOpen:_,testId:y}){return B("button",{type:"button",className:"ghost-btn","data-testid":y,onClick:()=>_(f,u)},"查看原始JSON")}function ry({title:f,text:u}){return B("div",{className:"empty-state"},B("strong",null,f),B("span",null,u))}function $X(f){return f?.runtime&&typeof f.runtime==="object"&&!Array.isArray(f.runtime)?f.runtime:{}}function jX(f){return f?.backend&&typeof f.backend==="object"&&!Array.isArray(f.backend)?f.backend:{}}function JX(f){return f?.repository&&typeof f.repository==="object"&&!Array.isArray(f.repository)?f.repository:{}}function r0(f,u){return`${f}/codex-queue-direct${u}`}function Z1(f){return Array.isArray(f?.tasks)?f.tasks:[]}function r$(f){return f?.pagination&&typeof f.pagination==="object"&&!Array.isArray(f.pagination)?f.pagination:{}}function wz(f){let u=Date.parse(String(f?.updatedAt||f?.createdAt||""));return Number.isFinite(u)?u:0}function xz(f,u=""){let _=new Map;for(let y of f)for(let l of y){let $=String(l?.id||"");if($.length>0&&!_.has($))_.set($,l)}return Array.from(_.values()).sort((y,l)=>{let $=Sz(y)-Sz(l);if($!==0)return $;let j=String(y?.id||"")===u?0:1,J=String(l?.id||"")===u?0:1;if(j!==J)return j-J;return wz(l)-wz(y)})}function E4(f,u=""){let _=new Map;for(let y of f)for(let l of y){let $=String(l?.id||"");if($.length===0)continue;_.set($,{..._.get($)||{},...l})}return xz([Array.from(_.values())],u)}function L4(f){return Array.isArray(f?.activeTaskIds)?f.activeTaskIds.map((u)=>String(u||"")).filter(Boolean):[String(f?.activeTaskId||"")].filter(Boolean)}var v_="__all__",FX="(max-width: 760px)",AX="(min-width: 761px)",vz="unidesk:codex-queue:read-at:v1";function vu(f){return!f||f===v_}function QX(){return typeof window<"u"&&window.matchMedia(FX).matches}function qj(f){return vu(f)?"":`&queueId=${encodeURIComponent(f)}`}function O4(f,u){return Number(f?.counts?.[u]||0)}function Dz(f,u=""){let _=new Map;for(let l of Array.isArray(f?.queues)?f.queues:[]){let $=String(l?.id||"").trim();if($.length>0)_.set($,l)}for(let l of[String(f?.defaultQueueId||"default"),u].map(($)=>$.trim()).filter(Boolean))if(!_.has(l))_.set(l,{id:l,total:0,counts:{},activeTaskId:null,runnableTaskId:null,processing:!1});return Array.from(_.values()).sort((l,$)=>{let j=String(l?.id||"")===String(f?.defaultQueueId||"default")?0:1,J=String($?.id||"")===String(f?.defaultQueueId||"default")?0:1;if(j!==J)return j-J;return String(l?.id||"").localeCompare(String($?.id||""))})}function Uj(f){let u=String(f?.id||"default"),_=O4(f,"running")+O4(f,"judging"),y=O4(f,"queued")+O4(f,"retry_wait"),l=Number(f?.total||0),$=[`${u}`,`${l} tasks`];if(_>0)$.push(`${_} running`);if(y>0)$.push(`${y} queued`);return $.join(" · ")}function B4(f,u){if(vu(u))return null;return f.find((_)=>String(_?.id||"")===u)||null}function Tz(f,u,_,y){if(vu(_)){let $=L4(f);return String(f?.activeTaskId||$[0]||y.find((j)=>rz(j))?.id||"")}let l=B4(u,_);return String(l?.activeTaskId||y.find(($)=>rz($))?.id||"")}function UX(f,u,_){if(!vu(u)){let y=B4(f,u);return String(y?.runnableTaskId||_.find((l)=>String(l?.status||"")==="queued"||String(l?.status||"")==="retry_wait")?.id||"")}return String(_.find((y)=>String(y?.status||"")==="queued"||String(y?.status||"")==="retry_wait")?.id||"")}async function WX(f,u,_=v_){let y=qj(_);try{return await M0(r0(f,`/api/tasks?limit=${Qj}&lite=1&devReady=0${y}`))}catch{let $=await Promise.all(["running","judging","retry_wait","queued"].map(async(Q)=>{try{return await M0(r0(f,`/api/tasks?status=${encodeURIComponent(Q)}&limit=80&lite=1&devReady=0${y}`))}catch{return null}})),j=await M0(r0(f,`/api/tasks?limit=${Qj}&lite=1&devReady=0${y}`)).catch(()=>null),J=$.find((Q)=>Q?.queue)?.queue||j?.queue||u?.queue||u?.body?.queue||{},F=xz([...$.map((Q)=>Z1(Q)),Z1(j)],String(J?.activeTaskId||""));if(F.length>0)return{ok:!0,queue:J,tasks:F};return M0(r0(f,`/api/tasks?limit=5&lite=1&devReady=0${y}`))}}async function zX(f,u,_=0,y=v_){return M0(r0(f,`/api/tasks/overview?limit=${Qj}&transcriptLimit=3&compact=1&afterSeq=${encodeURIComponent(String(Math.max(0,_)))}&preferId=${encodeURIComponent(u)}${qj(y)}`))}async function GX(f,u,_,y=yX){return M0(r0(f,`/api/tasks?limit=${encodeURIComponent(String(y))}&lite=1&devReady=0&includeActive=0&beforeId=${encodeURIComponent(_)}${qj(u)}`))}async function KX(f,u){return M0(r0(f,`/api/tasks/${encodeURIComponent(u)}/trace-summary`))}async function ZX(f,u,_,y=null){let l=y===null||y===void 0||String(y).length===0?"":`&attempt=${encodeURIComponent(String(y))}`;return M0(r0(f,`/api/tasks/${encodeURIComponent(u)}/prompt?part=${encodeURIComponent(_)}${l}`))}async function qX(f,u,_=0,y=500,l=null){let $=l===null||l===void 0||String(l).length===0?"":`&attempt=${encodeURIComponent(String(l))}`;return M0(r0(f,`/api/tasks/${encodeURIComponent(u)}/trace-steps?afterSeq=${encodeURIComponent(String(_))}&limit=${encodeURIComponent(String(y))}${$}`))}async function HX(f,u,_){return M0(r0(f,`/api/tasks/${encodeURIComponent(u)}/trace-step?seq=${encodeURIComponent(String(_))}`))}async function VX(f,u){return M0(r0(f,`/api/tasks/${encodeURIComponent(u)}/read`),{method:"POST",body:{}})}async function EX(f){return M0(r0(f,"/api/tasks/read-all"),{method:"POST",body:{}})}function OX(f){return Array.isArray(f?.output)?f.output:[]}function bz(f){return Array.isArray(f?.attempts)?f.attempts:[]}function $j(f){return f?.counts&&typeof f.counts==="object"&&!Array.isArray(f.counts)?f.counts:{}}function XX(f){return f.split(/^\s*---+\s*$/gmu).map((u)=>u.trim()).filter(Boolean)}function Mz(f){let u=Number(f);return Number.isFinite(u)?Math.max(1,Math.min(50,Math.floor(u))):1}function Y4(f){let u=[];for(let _ of f.split(/[\s,,;;]+/u)){let y=_.trim();if(/^codex_\d+_[A-Za-z0-9_-]+$/u.test(y)&&!u.includes(y))u.push(y)}return u}function NX(f,u){let _=Y4(u);if(_.length===0)return f;return[`引用 Codex Queue 任务 ${_.join(" ")}。后端会在入队时只注入这些任务的 initial prompt 和 final response 全文;中间执行过程不注入,如需补充核查可运行:${_.map((y)=>`bun scripts/cli.ts codex task ${y}`).join(";")}`,"","本次任务:",f].join(` -`)}function LX(f){let y=f.trimStart();if(!y.startsWith("# Codex Queue 已解析引用上下文"))return{hasInjection:!1,reference:"",userPrompt:f};let l=f.length-y.length,$=f.lastIndexOf(` +`):[]}function _j(f){let u=String(f.status||"").trim();if(u.length>0)return u;let _=String(f.bodyPreview||"");return/^(item\/[A-Za-z]+(?:\/[A-Za-z]+)?):/u.exec(_)?.[1]||"item/fileChange"}function pO(f){let u=String(f.bodyPreview||"");return/file changes status=([A-Za-z0-9_-]+)/u.exec(u)?.[1]}function mO(f){return/^item\/(?:started|completed): file changes status=/u.test(String(f||"").trim())}function Xz(f){if(String(f.kind||"")!=="edited")return!1;let u=String(f.status||""),_=String(f.title||""),y=String(f.bodyPreview||""),$=String(f.commandPreview||"");if(_==="Edited files")return!0;if(/^item\/fileChange\//u.test(u))return!0;if((u==="item/started"||u==="item/completed")&&/file changes status=/u.test(y))return!0;if(/^Success\. Updated the following files:/mu.test(y))return!0;if(/^diff --git /mu.test(y))return!0;return $.length===0&&/^([AMDRCU?]{1,2})\s+\S+/mu.test(y)}function I3(f){return Vz(String(f||"").replace(/^[ab]\//u,"").trim())}function lj(f){let u=/^([AMDRCU?]{1,2})\s+(.+)$/u.exec(f);if(!u)return null;let _=I3(u[2]||"");return _.length>0?{status:u[1]||"M",path:_}:null}function jj(f){let u=/^\*\*\*\s+(Add|Update|Delete)\s+File:\s+(.+)$/u.exec(f);if(u){let y=u[1]==="Add"?"A":u[1]==="Delete"?"D":"M",$=I3(u[2]||"");return $.length>0?{status:y,path:$}:null}let _=/^\*\*\*\s+Move to:\s+(.+)$/u.exec(f);if(_){let y=I3(_[1]||"");return y.length>0?{status:"R",path:y}:null}return null}function kO(f){let u=[],_=($,l)=>{let j=I3(l);if(j.length===0||j==="/dev/null")return;let J=u.find((F)=>F.path===j);if(J){if(J.status==="M"&&$!=="M")J.status=$;return}u.push({status:$,path:j})},y="";for(let $ of Oz(f)){let l=lj($)||jj($);if(l!==null){_(l.status,l.path),y=l.path;continue}let j=/^diff --git a\/(.+?) b\/(.+)$/u.exec($);if(j){let z=j[2]||j[1]||"";_("M",z),y=I3(z);continue}let J=/^\+\+\+ b\/(.+)$/u.exec($);if(J&&J[1]!=="/dev/null"){_("M",J[1]||""),y=I3(J[1]||"");continue}if(/^new file mode /u.exec($)&&y)_("A",y);if(/^deleted file mode /u.exec($)&&y)_("D",y);let U=/^rename to (.+)$/u.exec($);if(U)_("R",U[1]||"")}return u}function iO(f){if(lj(f)!==null||jj(f)!==null)return"file";if(/^(diff --git |index |--- |\+\+\+ |\*\*\* Begin Patch|\*\*\* End Patch)/u.test(f))return"meta";if(/^@@ /u.test(f))return"hunk";if(/^\+/u.test(f))return"add";if(/^-/u.test(f))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(f))return"note";return"context"}function gO(f){return Oz(f).map((u)=>{let _=lj(u)||jj(u);if(_!==null)return{text:u,kind:"file",path:_.path,status:_.status};return{text:u,kind:iO(u)}})}function nO(f){return f.reduce((u,_)=>{if(_.kind==="add")u.added+=1;else if(_.kind==="del")u.removed+=1;return u},{added:0,removed:0})}function Wz(f,u){return`${u} ${f} line${f===1?"":"s"}`}function tO(f,u){let _=[];if(f>0)_.push(Wz(f,"Added"));if(u>0)_.push(Wz(u,"removed"));return _.join(", ")}function sO(f){for(let _=f.length-1;_>=0;_-=1){let y=String(f[_]?.status||"").trim();if(y.length>0)return y}let u=String(f[f.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 oO(f){return`${f} file${f===1?"":"s"}`}function Nz(f){let u=f.length>0?f:[],_=Uz(u.map((W)=>String(W.bodyPreview||""))),$=Uz(u.map((W)=>String(W.bodyPreview||"")).filter((W)=>W.trim().length>0&&!mO(W)))||_,l=kO($||_),j=u.map((W)=>({method:_j(W),status:pO(W),at:W.at})),J=gO($||_),F=nO(J),A=tO(F.added,F.removed),U=l.length>0?oO(l.length):"",z=A.length>0?`${A}${U?` in ${U}`:""}`:l.length>0?U:qz($||_||"File changes",72);return{status:sO(j),summary:z,files:l,stages:j,lines:J,addedLines:F.added,removedLines:F.removed,rawText:_}}function aO(f){let u=f[0],_=f[f.length-1]||u,y=Nz(f);return{...u,seq:Number.isFinite(Number(_?.seq))?Number(_?.seq):Number(u?.seq??0),at:_?.at||u?.at,title:y.files.length>0?`Edited ${y.summary}`:"Edited files",status:y.status,commandPreview:"",commandOmittedLines:void 0,bodyPreview:y.rawText,bodyOmittedLines:f.reduce(($,l)=>$+Number(l.bodyOmittedLines||0),0)||void 0,rawSeqs:f.flatMap(($)=>Array.isArray($?.rawSeqs)?$.rawSeqs:[$?.seq]).filter(($)=>$!==void 0),editObservation:y}}function dO(f){let u=Array.isArray(f)?f:[],_=[],y=[],$=()=>{if(y.length===0)return;_.push(aO(y)),y=[]};for(let l of u){if(Xz(l)){if(_j(l)==="item/started"&&y.length>0)$();if(y.push(l),_j(l)==="item/completed")$();continue}$(),_.push(l)}return $(),_}function Lz(f){let u=[],_=[],y=[],$=(A,U)=>{for(let z of U)if(!A.includes(z))A.push(z)};for(let A of f){let U=String(A?.kind||""),z=[A?.commandPreview,A?.bodyPreview,A?.title].map((W)=>String(W||"")).join(` +`);if(U==="explored")$(u,Az(z));else if(U==="edited")$(_,Az(z));else if(U==="ran"){let W=String(A?.commandPreview||A?.title||"").trim();if(W.length>0&&!y.includes(W))y.push(qz(W,90))}}let l=f.map((A)=>Date.parse(String(A?.at||""))).filter((A)=>Number.isFinite(A)),j=l.length>=2?Math.max(0,Math.max(...l)-Math.min(...l)):0,J=f.reduce((A,U)=>A+(Dy(U?.durationMs)??Dy(U?.elapsedMs)??0),0),F=j>0?j:J;return{readFiles:u,editedFiles:_,runCommands:y,durationLabel:hO(F)}}function eO(f,u=3){let _=Array.isArray(f)?f:[],y=[],$=[],l=Math.max(0,u),j=new Set;for(let F=_.length-1;F>=0&&l>0;F-=1){let A=_[F];if(!Qz(A))continue;j.add(A),l-=1}let J=()=>{if($.length>=2){let F=Hz($);y.push({seq:Number($[0]?.seq??0),at:$[0]?.at||$.at(-1)?.at,kind:"toolGroup",title:Ez($),status:`${$.length} calls`,items:$,counts:F,digest:Lz($),rawSeqs:$.flatMap((A)=>Array.isArray(A?.rawSeqs)?A.rawSeqs:[A?.seq]).filter((A)=>A!==void 0)})}else y.push(...$);$=[]};for(let F of _){if(Qz(F)&&!j.has(F)){$.push(F);continue}J(),y.push(F)}return J(),y}function Yz(f){return(Array.isArray(f)?f:[]).map((u,_)=>({...u,seq:Number.isFinite(Number(u?.seq))?Number(u.seq):_+1,kind:String(u?.kind||"message"),at:u?.at===void 0?void 0:String(u.at),durationMs:Dy(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 a7(f){return Dy(f?.durationMs)??Dy(f?.elapsedMs)??Dy(f?.timing?.durationMs)??Dy(f?.metadata?.durationMs)??void 0}function d7(f,u){return f?.createdAt||f?.updatedAt||f?.completedAt||u||void 0}function e7(f,u){return f?.id||f?.messageId||u}function yj(f,u){let _=new Set(u.map((y)=>y.toLowerCase()));for(let y of Array.isArray(f?.inputFields)?f.inputFields:[]){let $=String(y?.key||"").toLowerCase();if(_.has($))return String(y?.value||"")}return""}function fX(f){let u=String(f?.tool||f?.title||"").toLowerCase();if(/read|grep|glob|list|ls|find|search|view|cat|sed|rg/u.test(u))return"explored";if(/edit|write|patch|apply|update|create|delete/u.test(u))return"edited";let _=yj(f,["command","cmd"]);if(/\b(rg|grep|find|ls|cat|sed|tail|head|git status|git diff|ps)\b/u.test(_))return"explored";if(/\b(apply_patch|git apply|cat >|tee .*<<|sed -i|python3? .*write_text)\b/u.test(_))return"edited";return"ran"}function uX(f){let u=[],_=1;for(let y of Array.isArray(f)?f:[]){let $=y?.createdAt||y?.updatedAt||y?.completedAt,l=String(y?.role||"assistant").toLowerCase(),j=Array.isArray(y?.parts)?y.parts:[];for(let J of j){let F=String(J?.type||"").toLowerCase();if(F==="step-start"||F==="step-finish")continue;if(F==="text"||F==="reasoning"){let U=String(J?.textPreview||y?.textPreview||"").trim();if(U.length===0)continue;u.push({seq:_++,at:d7(J,$),kind:"message",title:F==="reasoning"?"Reasoning":l==="user"?"User message":l==="system"?"System message":"Assistant message",status:F==="reasoning"?"reasoning":l,bodyPreview:U,durationMs:a7(J),rawSeqs:[e7(J,_)]});continue}if(F==="tool"){let U=yj(J,["command","cmd"])||yj(J,["filePath","filepath","path"])||String(J?.title||J?.tool||"tool"),z=String(J?.outputPreview&&J.outputPreview!=="--"?J.outputPreview:J?.textPreview||"");u.push({seq:_++,at:d7(J,$),kind:fX(J),title:String(J?.title||J?.tool||"tool"),status:String(J?.status||""),commandPreview:U,bodyPreview:z,durationMs:a7(J),rawSeqs:[e7(J,_)]});continue}let A=String(J?.textPreview||J?.title||F||"").trim();if(A)u.push({seq:_++,at:d7(J,$),kind:"system",title:F||"part",bodyPreview:A,status:String(J?.status||""),durationMs:a7(J),rawSeqs:[e7(J,_)]})}if(j.length===0&&y?.textPreview)u.push({seq:_++,at:$,kind:"message",title:`${l||"assistant"} message`,status:l,bodyPreview:String(y.textPreview),rawSeqs:[y?.messageId||_]})}return u}var Bz={source:"opencode",toTrace:uX};function _X(f){return String(f||"unknown").toLowerCase().replace(/[^a-z0-9_-]+/gu,"-")||"unknown"}function zz(f){let u=String(f||"M").toUpperCase();if(u.startsWith("A")||u==="??")return"added";if(u.startsWith("D"))return"deleted";if(u.startsWith("R"))return"renamed";return"modified"}function yX(f){if(f==="item/fileChange/outputDelta")return"delta";return f.replace(/^item\//u,"")}function $X(f,u){if(f.kind==="file"){let $=String(f.status||"M");return Lf("div",{key:`${u}-${f.text}`,className:`codex-edit-diff-line file ${zz($)}`},Lf("span",{className:`codex-edit-file-status ${zz($)}`},$),Lf("code",null,f.path||f.text.replace(/^([AMDRCU?]{1,2})\s+/u,"")))}let _=f.kind==="add"||f.kind==="del"?f.text.slice(0,1):f.kind==="hunk"?"@@":f.kind==="note"?"ok":"",y=f.kind==="add"||f.kind==="del"?f.text.slice(1):f.text;return Lf("div",{key:`${u}-${f.text}`,className:`codex-edit-diff-line ${f.kind}`},Lf("span",{className:"codex-edit-diff-sign"},_),Lf("code",null,y||" "))}function lX(f,u){let _=f.lines.length>0?f.lines:f.files.map(($)=>({text:`${$.status} ${$.path}`,kind:"file",path:$.path,status:$.status})),y=Number(f.addedLines||0)+Number(f.removedLines||0)>0;return Lf("div",{className:"codex-edit-observation","data-testid":"codex-edit-observation"},Lf("div",{className:"codex-edit-observation-head"},Lf("span",{className:"codex-edit-window-controls","aria-hidden":"true"},Lf("i",null),Lf("i",null),Lf("i",null)),Lf("strong",null,y?"git diff":"git diff --stat"),Lf("code",null,f.summary||"File changes")),f.stages.length>0?Lf("div",{className:"codex-edit-stage-strip"},f.stages.map(($,l)=>Lf("span",{key:`${$.method}-${l}`,className:`codex-edit-stage ${_X($.status||$.method)}`},Lf("b",null,yX($.method)),$.status?Lf("em",null,$.status):null))):null,_.length>0?Lf("div",{className:"codex-edit-diff",role:"list"},_.map($X)):null,u?Lf("div",{className:"codex-edit-omitted"},`${u} (查看原始JSON获取完整记录)`):null)}function Gz(f,u,_){let y=uj(_);return Lf("div",{className:`codex-transcript-stream ${f}`,"data-testid":`codex-trace-${f}`},Lf("span",{className:"codex-transcript-stream-label"},f),Lf("pre",{className:"codex-transcript-body"},u,y?` +${y} (查看原始JSON获取完整记录)`:""))}function wz(f,u=!1){let _=String(f.kind||"message"),y=["ran","explored","edited"].includes(_),$=uj(f.commandOmittedLines),l=uj(f.bodyOmittedLines),j=String(f.commandPreview||(y?f.title||"":"")),J=String(f.stdoutPreview||""),F=String(f.stderrPreview||""),A=J.length>0||F.length>0,U=Boolean(f.foldedReferencePrompt)&&String(f.fullPrompt||"").length>0,z=_==="edited"&&(f.editObservation!==void 0||Xz(f))?f.editObservation||Nz([f]):null;return Lf("article",{key:`${f.seq}-${_}`,className:`codex-transcript-item ${_} ${u?"nested":""}`},Lf("div",{className:"codex-transcript-main"},Lf("div",{className:"codex-transcript-title"},Lf("span",{className:"codex-output-channel"},fj(_)),y&&z===null?null:Lf("strong",null,z!==null?"File changes":String(f.title||fj(_))),f.status?Lf("code",null,String(z?.status||f.status)):null,Lf("time",null,Zz(f.at))),j&&z===null?Lf("pre",{className:"codex-transcript-command"},j,$?` +${$}`:""):null,z!==null?lX(z,l):A?Lf("div",{className:"codex-transcript-streams"},J.length>0?Gz("stdout",J,f.stdoutOmittedLines):null,F.length>0?Gz("stderr",F,f.stderrOmittedLines):null):f.bodyPreview?Lf("pre",{className:"codex-transcript-body"},String(f.bodyPreview),l?` +${l} (查看原始JSON获取完整记录)`:""):null,U?Lf("details",{className:"codex-initial-prompt-full","data-testid":"codex-initial-prompt-full"},Lf("summary",null,Lf("span",null,"引用注入已折叠,点击查看最终传入 Codex 的完整 prompt"),Lf("code",null,`${f.fullPromptLines||IO(String(f.fullPrompt||""))} lines / ${f.fullPromptChars||String(f.fullPrompt||"").length} chars`)),Lf("pre",{className:"codex-transcript-body codex-transcript-full-prompt","data-testid":"codex-initial-prompt-full-text"},String(f.fullPrompt||""))):null))}function jX(f){let u=Array.isArray(f.items)?f.items:[],_=f.digest&&typeof f.digest==="object"?f.digest:Lz(u);return Lf("article",{key:`${f.seq}-toolGroup`,className:"codex-transcript-item toolGroup"},Lf("div",{className:"codex-transcript-main"},Lf("details",{className:"codex-tool-group","data-testid":"codex-tool-group"},Lf("summary",null,Lf("div",{className:"codex-tool-group-head"},Lf("span",{className:"codex-output-channel"},fj("toolGroup")),Lf("strong",null,String(f.title||Ez(u))),Lf("code",null,String(f.status||`${u.length} calls`)),Lf("time",null,Zz(f.at)))),Lf("div",{className:"codex-tool-group-digest"},Lf("span",null,`read: ${o7(Array.isArray(_.readFiles)?_.readFiles:[])}`),Lf("span",null,`edit: ${o7(Array.isArray(_.editedFiles)?_.editedFiles:[])}`),Lf("span",null,`run: ${o7(Array.isArray(_.runCommands)?_.runCommands:[],2)}`),Lf("span",null,`duration: ${_.durationLabel||"--"}`)),Lf("div",{className:"codex-tool-group-items"},u.map((y)=>wz(y,!0))))))}var JX=16;function Kz(f){return f.scrollHeight-f.scrollTop-f.clientHeight<=JX}function X4({items:f,input:u,port:_,autoScroll:y=!1,loading:$=!1,hasDetail:l=!0,emptyText:j="等待 Trace 输出...",loadingText:J="正在加载完整 Trace...",testId:F="trace-output",className:A="codex-transcript",keepRecentToolCalls:U=3,collapseTools:z=!0}){let W=Fz(null),K=Fz(!0),q=dO(_?bO(_,u):Yz(f)),E=z?eO(q,U):q,O=cO(q);vO(()=>{let Z=W.current;if(!y||!Z)return;if(!K.current&&!Kz(Z))return;Z.scrollTop=Z.scrollHeight,K.current=!0},[y,q.length,O]);let H={className:A,ref:W,onScroll:(Z)=>{let V=Z.currentTarget;K.current=Kz(V)},"data-testid":F};if($&&!l)return Lf("div",H,Lf("div",{className:"codex-output-empty"},J));return Lf("div",H,E.length===0?Lf("div",{className:"codex-output-empty"},j):E.map((Z)=>String(Z.kind||"")==="toolGroup"?jX(Z):wz(Z)))}var B=S4.default.createElement,{useEffect:C6,useMemo:Dz,useRef:Zu}=S4.default,df=S4.default.useState,FX=120,zj=24,QX=48,AX=300,UX=1200;function Tz(){return typeof document>"u"||document.visibilityState!=="hidden"}function Ty(f,u="操作失败"){return Mf(f,u)}function Py(f){if(!f)return"--";let u=new Date(f);if(Number.isNaN(u.getTime()))return"--";return u.toLocaleString("zh-CN",{hour12:!1})}function WX(f){return f.toLocaleTimeString("zh-CN",{hour12:!1})}function B4(f){let u=Number(f);if(!Number.isFinite(u)||u<0)return"--";let _=Math.floor(u/1000),y=Math.floor(_/3600),$=Math.floor(_%3600/60),l=_%60;if(y>0)return`${y}h ${String($).padStart(2,"0")}m`;if($>0)return`${$}m ${String(l).padStart(2,"0")}s`;return`${l}s`}function Jj(f){let u=Number(f);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 hz(f,u=180){let _=String(f||"").replace(/\s+/gu," ").trim();return _.length>u?`${_.slice(0,u-1)}…`:_}async function M0(f,u={}){return wf(f,{strictJson:!0,retryInvalidJson:1,invalidJsonPrefix:"Codex Queue 返回了无效 JSON",invalidJsonPreview:!0,responsePreviewLength:UX,...u})}function y_({status:f,children:u}){let _=String(f||"unknown").toLowerCase();return B("span",{className:`status-badge ${_}`},u||f||"unknown")}function My({label:f,value:u,hint:_,tone:y}){return B("article",{className:`metric-card ${y||""}`},B("div",{className:"metric-label"},f),B("div",{className:"metric-value"},u),B("div",{className:"metric-hint"},_))}function Sy({title:f,eyebrow:u,summary:_,actions:y,children:$,className:l}){return B("section",{className:`panel ${l||""}`},B("div",{className:"panel-head"},B("div",null,u?B("p",{className:"panel-eyebrow"},u):null,B("h2",null,f),_?B("div",{className:"panel-summary"},_):null),y?B("div",{className:"panel-actions"},y):null),B("div",{className:"panel-body"},$))}function Mz({title:f,data:u,onOpen:_,testId:y}){return B("button",{type:"button",className:"ghost-btn","data-testid":y,onClick:()=>_(f,u)},"查看原始JSON")}function ry({title:f,text:u}){return B("div",{className:"empty-state"},B("strong",null,f),B("span",null,u))}function zX(f){return f?.runtime&&typeof f.runtime==="object"&&!Array.isArray(f.runtime)?f.runtime:{}}function GX(f){return f?.backend&&typeof f.backend==="object"&&!Array.isArray(f.backend)?f.backend:{}}function KX(f){return f?.repository&&typeof f.repository==="object"&&!Array.isArray(f.repository)?f.repository:{}}function S0(f,u){return`${f}/codex-queue-direct${u}`}function Z1(f){return Array.isArray(f?.tasks)?f.tasks:[]}function r6(f){return f?.pagination&&typeof f.pagination==="object"&&!Array.isArray(f.pagination)?f.pagination:{}}function Sz(f){let u=Date.parse(String(f?.updatedAt||f?.createdAt||""));return Number.isFinite(u)?u:0}function Iz(f,u=""){let _=new Map;for(let y of f)for(let $ of y){let l=String($?.id||"");if(l.length>0&&!_.has(l))_.set(l,$)}return Array.from(_.values()).sort((y,$)=>{let l=xz(y)-xz($);if(l!==0)return l;let j=String(y?.id||"")===u?0:1,J=String($?.id||"")===u?0:1;if(j!==J)return j-J;return Sz($)-Sz(y)})}function N4(f,u=""){let _=new Map;for(let y of f)for(let $ of y){let l=String($?.id||"");if(l.length===0)continue;_.set(l,{..._.get(l)||{},...$})}return Iz([Array.from(_.values())],u)}function w4(f){return Array.isArray(f?.activeTaskIds)?f.activeTaskIds.map((u)=>String(u||"")).filter(Boolean):[String(f?.activeTaskId||"")].filter(Boolean)}var v_="__all__",ZX="(max-width: 760px)",qX="(min-width: 761px)",cz="unidesk:codex-queue:read-at:v1";function vu(f){return!f||f===v_}function HX(){return typeof window<"u"&&window.matchMedia(ZX).matches}function Vj(f){return vu(f)?"":`&queueId=${encodeURIComponent(f)}`}function L4(f,u){return Number(f?.counts?.[u]||0)}function rz(f,u=""){let _=new Map;for(let $ of Array.isArray(f?.queues)?f.queues:[]){let l=String($?.id||"").trim();if(l.length>0)_.set(l,$)}for(let $ of[String(f?.defaultQueueId||"default"),u].map((l)=>l.trim()).filter(Boolean))if(!_.has($))_.set($,{id:$,total:0,counts:{},activeTaskId:null,runnableTaskId:null,processing:!1});return Array.from(_.values()).sort(($,l)=>{let j=String($?.id||"")===String(f?.defaultQueueId||"default")?0:1,J=String(l?.id||"")===String(f?.defaultQueueId||"default")?0:1;if(j!==J)return j-J;return String($?.id||"").localeCompare(String(l?.id||""))})}function Gj(f){let u=String(f?.id||"default"),_=L4(f,"running")+L4(f,"judging"),y=L4(f,"queued")+L4(f,"retry_wait"),$=Number(f?.total||0),l=[`${u}`,`${$} tasks`];if(_>0)l.push(`${_} running`);if(y>0)l.push(`${y} queued`);return l.join(" · ")}function T4(f,u){if(vu(u))return null;return f.find((_)=>String(_?.id||"")===u)||null}function Pz(f,u,_,y){if(vu(_)){let l=w4(f);return String(f?.activeTaskId||l[0]||y.find((j)=>Rz(j))?.id||"")}let $=T4(u,_);return String($?.activeTaskId||y.find((l)=>Rz(l))?.id||"")}function EX(f,u,_){if(!vu(u)){let y=T4(f,u);return String(y?.runnableTaskId||_.find(($)=>String($?.status||"")==="queued"||String($?.status||"")==="retry_wait")?.id||"")}return String(_.find((y)=>String(y?.status||"")==="queued"||String(y?.status||"")==="retry_wait")?.id||"")}async function VX(f,u,_=v_){let y=Vj(_);try{return await M0(S0(f,`/api/tasks?limit=${zj}&lite=1&devReady=0${y}`))}catch{let l=await Promise.all(["running","judging","retry_wait","queued"].map(async(A)=>{try{return await M0(S0(f,`/api/tasks?status=${encodeURIComponent(A)}&limit=80&lite=1&devReady=0${y}`))}catch{return null}})),j=await M0(S0(f,`/api/tasks?limit=${zj}&lite=1&devReady=0${y}`)).catch(()=>null),J=l.find((A)=>A?.queue)?.queue||j?.queue||u?.queue||u?.body?.queue||{},F=Iz([...l.map((A)=>Z1(A)),Z1(j)],String(J?.activeTaskId||""));if(F.length>0)return{ok:!0,queue:J,tasks:F};return M0(S0(f,`/api/tasks?limit=5&lite=1&devReady=0${y}`))}}async function OX(f,u,_=0,y=v_){return M0(S0(f,`/api/tasks/overview?limit=${zj}&transcriptLimit=3&compact=1&afterSeq=${encodeURIComponent(String(Math.max(0,_)))}&preferId=${encodeURIComponent(u)}${Vj(y)}`))}async function XX(f,u,_,y=QX){return M0(S0(f,`/api/tasks?limit=${encodeURIComponent(String(y))}&lite=1&devReady=0&includeActive=0&beforeId=${encodeURIComponent(_)}${Vj(u)}`))}async function NX(f,u){return M0(S0(f,`/api/tasks/${encodeURIComponent(u)}/trace-summary`))}async function LX(f,u,_,y=null){let $=y===null||y===void 0||String(y).length===0?"":`&attempt=${encodeURIComponent(String(y))}`;return M0(S0(f,`/api/tasks/${encodeURIComponent(u)}/prompt?part=${encodeURIComponent(_)}${$}`))}async function YX(f,u,_=0,y=500,$=null){let l=$===null||$===void 0||String($).length===0?"":`&attempt=${encodeURIComponent(String($))}`;return M0(S0(f,`/api/tasks/${encodeURIComponent(u)}/trace-steps?afterSeq=${encodeURIComponent(String(_))}&limit=${encodeURIComponent(String(y))}${l}`))}async function BX(f,u,_){return M0(S0(f,`/api/tasks/${encodeURIComponent(u)}/trace-step?seq=${encodeURIComponent(String(_))}`))}async function wX(f,u){return M0(S0(f,`/api/tasks/${encodeURIComponent(u)}/read`),{method:"POST",body:{}})}async function DX(f){return M0(S0(f,"/api/tasks/read-all"),{method:"POST",body:{}})}function TX(f){return Array.isArray(f?.output)?f.output:[]}function pz(f){return Array.isArray(f?.attempts)?f.attempts:[]}function Fj(f){return f?.counts&&typeof f.counts==="object"&&!Array.isArray(f.counts)?f.counts:{}}function MX(f){return f.split(/^\s*---+\s*$/gmu).map((u)=>u.trim()).filter(Boolean)}function Cz(f){let u=Number(f);return Number.isFinite(u)?Math.max(1,Math.min(50,Math.floor(u))):1}function D4(f){let u=[];for(let _ of f.split(/[\s,,;;]+/u)){let y=_.trim();if(/^codex_\d+_[A-Za-z0-9_-]+$/u.test(y)&&!u.includes(y))u.push(y)}return u}function SX(f,u){let _=D4(u);if(_.length===0)return f;return[`引用 Codex Queue 任务 ${_.join(" ")}。后端会在入队时只注入这些任务的 initial prompt 和 final response 全文;中间执行过程不注入,如需补充核查可运行:${_.map((y)=>`bun scripts/cli.ts codex task ${y}`).join(";")}`,"","本次任务:",f].join(` +`)}function rX(f){let y=f.trimStart();if(!y.startsWith("# Codex Queue 已解析引用上下文"))return{hasInjection:!1,reference:"",userPrompt:f};let $=f.length-y.length,l=f.lastIndexOf(` # 本次任务 -`);if($0?f.split(/\r\n|\r|\n/u).length:0}function hz(f){let u=String(f?.displayPrompt||"");if(u.length>0)return u;let _=String(f?.prompt||"");return YX(LX(_).userPrompt)}function Py(f){return f?._traceSummary&&typeof f._traceSummary==="object"&&!Array.isArray(f._traceSummary)?f._traceSummary:null}function C$(f){return f?._promptDetails&&typeof f._promptDetails==="object"&&!Array.isArray(f._promptDetails)?f._promptDetails:{}}function T4(f){let u=Py(f)?.prompt;return u&&typeof u==="object"&&!Array.isArray(u)?u:{}}function Wj(f){let u=Py(f)?.execution;return u&&typeof u==="object"&&!Array.isArray(u)?u:{}}function Iz(f){let u=T4(f),_=String(u.basePrompt||"");return _.length>0?_:hz(f)}function zj(f){let u=Py(f);return String(u?.finalResponse||f?.finalResponse||"").trimEnd()}function Gj(f){let _=Py(f)?.lastJudge||f?.lastJudge;return _&&typeof _==="object"&&!Array.isArray(_)?_:null}function b_(f){return f&&typeof f==="object"&&!Array.isArray(f)?f:null}function BX(f){let u=Py(f)?.attempts;if(Array.isArray(u)&&u.length>0)return u;let _=bz(f);if(_.length>0)return _.map((j,J)=>({...j,index:Number(j?.index||J+1),execution:J===_.length-1?Wj(f):b_(j?.execution)||{},finalResponse:String(j?.finalResponse||j?.finalResponsePreview||(J===_.length-1?zj(f):"")),judge:b_(j?.judge)||(J===_.length-1?Gj(f):null)}));let y=Wj(f),l=zj(f),$=Gj(f);if(Object.keys(y).length===0&&l.length===0&&$===null)return[];return[{index:Number(f?.currentAttempt||1),mode:f?.currentMode||"initial",startedAt:f?.startedAt,finishedAt:f?.finishedAt,terminalStatus:f?.status,execution:y,finalResponse:l,finalResponseChars:l.length,judge:$}]}function wX(f,u){return b_(u?.execution)||Wj(f)}function DX(f,u){let _=String(u?.finalResponse||u?.finalResponsePreview||"");if(Object.prototype.hasOwnProperty.call(u||{},"finalResponse")||Object.prototype.hasOwnProperty.call(u||{},"finalResponsePreview"))return _.trimEnd();return _.length>0?_.trimEnd():zj(f)}function cz(f,u){if(Object.prototype.hasOwnProperty.call(u||{},"judge"))return b_(u?.judge);return Gj(f)}function pz(f){return`feedback:${String(f||"latest")}`}function TX(f,u,_){let y=String(u?.feedbackPrompt||"").trimEnd(),l=String(u?.feedbackPromptPreview||y||"").trimEnd(),$=Number(u?.feedbackPromptChars||y.length||l.length||0),j=Number(u?.feedbackPromptLines||q1(y||l));if(y.length>0||l.length>0||$>0)return{text:y,preview:l,chars:$,lines:j,source:u?.feedbackPromptSource||"judge-feedback",forAttempt:u?.feedbackPromptForAttempt||Number(_||0)+1,truncated:Boolean(u?.feedbackPromptTruncated)};let J=cz(f,u),F=String(J?.continuePrompt||"").trimEnd();if(J?.decision==="retry"&&F.length>0)return{text:"",preview:F,chars:F.length,lines:q1(F),source:"judge-continue-prompt",forAttempt:Number(_||0)+1,truncated:!1};return null}function mz(f){let u=T4(f);return Boolean(u.hasReferenceInjection||Number(u.referencePromptChars||0)>0||f?.referenceInjection||f?.referenceInjectionSummary)}function MX(f,u=null){if(u!==null&&u!==void 0){let y=(b_(f?._traceStepsByAttempt)||{})[String(u)];return Array.isArray(y)?y:[]}return Array.isArray(f?._traceSteps)?f._traceSteps:[]}function kz(f,u=null){if(u!==null&&u!==void 0){let _=b_(f?._traceStepsLoadedByAttempt)||{};return Boolean(_[String(u)])}return Boolean(f?._traceStepsLoaded)}function Kj(f){return f?._traceStepDetails&&typeof f._traceStepDetails==="object"&&!Array.isArray(f._traceStepDetails)?f._traceStepDetails:{}}function rX(f){let u=f?.timing&&typeof f.timing==="object"?f.timing:{},_=String(f?.status||"");if(["queued"].includes(_))return`等待 ${N4(u.queueWaitMs??u.totalElapsedMs)}`;if(["running","judging","retry_wait"].includes(_))return`耗时 ${N4(u.durationMs??u.totalElapsedMs)}`;return`耗时 ${N4(u.durationMs??u.totalElapsedMs)}`}function w4(f){return String(f?.queueId||"default")}function SX(f){return{system:"SYS",user:"YOU",assistant:"GPT",reasoning:"THINK",command:"CMD",diff:"DIFF",tool:"TOOL",error:"ERR"}[f]||f.toUpperCase()}function rz(f){return["running","judging","retry_wait"].includes(String(f?.status||""))}function P1(f){return["succeeded","failed","canceled"].includes(String(f?.status||""))}function I3(f){if(!P1(f))return!1;if(f?.terminalUnread===!0)return!0;if(f?.terminalUnread===!1)return!1;return!f?.readAt}function PX(){if(typeof window>"u")return{};try{let f=JSON.parse(window.localStorage.getItem(vz)||"{}");return f&&typeof f==="object"&&!Array.isArray(f)?f:{}}catch{return{}}}function CX(f){if(typeof window>"u")return;try{window.localStorage.setItem(vz,JSON.stringify(f))}catch{}}function jj(f,u){let _=String(f?.id||""),y=String(u?.[_]||"");if(!P1(f)||y.length===0)return f;return{...f,readAt:f?.readAt||y,terminalUnread:!1}}function R$(f){let u=Number(f||0);return Number.isFinite(u)?u:0}function RX(f){return R$(f.queued)+R$(f.retry_wait)}function xX(f){return R$(f.running)+R$(f.judging)}function Sz(f){if(I3(f))return 0;return{running:1,judging:2,retry_wait:3,queued:4,succeeded:8,failed:8,canceled:8}[String(f?.status||"")]??9}function S$(f){if(!f)return!1;if(f?._traceSummaryLoaded===!0)return!1;return f?.summaryOnly===!0||f?._metaLoaded!==!0}function vX(f){return Boolean(f?._metaLoaded)||f?.summaryOnly===!1}function bX(f,u,_){let y=String(f?.[_]||""),l=String(u?.[_]||"");return y.length>l.length?y:l}function Zj(f,u,_){let y=Array.isArray(f?.[_])?f[_]:[],l=Array.isArray(u?.[_])?u[_]:[];if(l.length===0&&y.length>0)return y;return y.length>l.length?y:l}function hX(f,u){let _=u?.summaryOnly===!0&&vX(f),y={...f,...u};if(!_)return y;for(let l of["prompt","basePrompt","displayPrompt","finalResponse"])y[l]=bX(f,u,l);for(let l of["promptHistory","attempts","output","events"])y[l]=Zj(f,u,l);if(f?.referenceInjection?.items&&!u?.referenceInjection?.items)y.referenceInjection=f.referenceInjection;if(f?.referenceInjectionSummary&&!u?.referenceInjectionSummary)y.referenceInjectionSummary=f.referenceInjectionSummary;y.summaryOnly=f?.summaryOnly===!1?!1:u.summaryOnly,y._metaLoaded=f?._metaLoaded,y._detailLoaded=f?._detailLoaded,y._transcriptComplete=f?._transcriptComplete,y._transcriptPreview=Object.prototype.hasOwnProperty.call(u,"_transcriptPreview")?u._transcriptPreview:f?._transcriptPreview;for(let l of["_traceSummary","_traceSummaryLoaded","_traceSteps","_traceStepsLoaded","_traceStepsByAttempt","_traceStepsLoadedByAttempt","_traceStepDetails","_promptDetails"])if(!Object.prototype.hasOwnProperty.call(u,l)&&Object.prototype.hasOwnProperty.call(f||{},l))y[l]=f[l];return y}function IX(f){let u=f?.selected,_=u?.task&&typeof u.task==="object"?u.task:null;if(_!==null){let l=Boolean(u?.preview);return{..._,transcript:Array.isArray(u?.transcript)?u.transcript:[],_detailLoaded:Array.isArray(u?.transcript)&&u.transcript.length>0,_transcriptComplete:Boolean(!l&&!u?.hasMore&&P1(_)),_transcriptPreview:l,_summaryLoaded:!0}}let y=Z1(f)[0];return y?{...y,_summaryLoaded:!0}:null}function Jj(f,u){let _=new Map;for(let y of[...Array.isArray(f)?f:[],...Array.isArray(u)?u:[]]){let l=`${Number(y?.seq??0)}:${String(y?.kind||"message")}`,$=_.get(l);if(!$){_.set(l,y);continue}let j={...$,...y};for(let[J,F]of[["bodyPreview","bodyOmittedLines"],["commandPreview","commandOmittedLines"]]){let Q=String($?.[J]||""),U=String(y?.[J]||"");if(Q.length>U.length)j[J]=$[J],j[F]=$[F]}_.set(l,j)}return Array.from(_.values()).sort((y,l)=>Number(y?.seq??0)-Number(l?.seq??0))}function X4(f){return(Array.isArray(f)?f:[]).reduce((u,_)=>Math.max(u,Number(_?.seq??0)),0)}function Pz(f,u=8){let _=Array.from(new Set((Array.isArray(f)?f:[]).map((l)=>Number(l?.seq??0)).filter((l)=>Number.isFinite(l)&&l>0))).sort((l,$)=>l-$);if(_.length===0)return 0;let y=_[Math.max(0,_.length-u)]??0;return Math.max(0,y-0.001)}function Fj(f,u){let _=Number(f[u]??0);return Number.isFinite(_)?String(_):"0"}function cX(f,u){let _=Array.isArray(f?.codexModels)?f.codexModels:[],y=["gpt-5.5","gpt-5.4-mini","gpt-5.4"];return Array.from(new Set([..._,...y,u].map((l)=>String(l||"").trim()).filter(Boolean)))}function pX({task:f,selected:u,onSelect:_,onCopy:y,onReference:l,onMarkRead:$,copied:j,markingRead:J}){let F=f?.lastJudge||{},Q=String(f?.id||""),U=I3(f);return B("article",{role:"button",tabIndex:0,className:`codex-task-card ${u?"selected":""} ${U?"unread-terminal":""}`,onClick:_,onKeyDown:(z)=>{if(z.key==="Enter"||z.key===" ")z.preventDefault(),_()},"data-unread-terminal":U?"true":"false","data-testid":`codex-task-${f?.id||"unknown"}`},U?B("span",{className:"codex-unread-badge",title:"待读","aria-label":"待读","data-testid":`codex-unread-task-${Q||"unknown"}`}):null,B("div",{className:"codex-task-card-head"},B("div",{className:"codex-task-status-line"},B(y_,{status:f?.status},f?.status||"unknown")),B("span",{className:"mono-text"},`${f?.currentAttempt||0}/${f?.maxAttempts||0}`)),B("div",{className:"codex-task-id-row"},B("code",{title:Q},Q||"unknown"),B("div",{className:"codex-task-id-actions"},B("button",{type:"button",className:"codex-copy-id-btn",onClick:(z)=>{z.stopPropagation(),l(Q)},"data-testid":`codex-reference-task-${Q||"unknown"}`},"引用"),B("button",{type:"button",className:"codex-copy-id-btn",onClick:(z)=>{z.stopPropagation(),y(Q)},"data-testid":`codex-copy-task-id-${Q||"unknown"}`},j?"已复制":"复制ID"),U?B("button",{type:"button",className:"codex-copy-id-btn codex-mark-read-btn",disabled:Boolean(J),onClick:(z)=>{z.stopPropagation(),$(Q)},"data-testid":`codex-mark-task-read-${Q||"unknown"}`},J?"标记中":"标为已读"):null)),B("strong",null,Rz(hz(f),120)||"空任务"),B("div",{className:"codex-task-meta"},B("span",null,`queue=${w4(f)}`),B("span",null,f?.model||"--"),B("span",null,rX(f))),B("div",{className:"codex-task-meta"},B("span",null,Sy(f?.updatedAt))),F?.decision?B("div",{className:"codex-judge-line"},`judge=${F.decision} ${Math.round(Number(F.confidence||0)*100)}%`):null)}function Aj({title:f,tasks:u,selectedId:_,onSelect:y,onCopy:l,onReference:$,onMarkRead:j,copiedTaskId:J,markingReadTaskId:F,emptyText:Q}){let U=Array.isArray(u)?u:[];return B("section",{className:"codex-task-section"},B("div",{className:"codex-task-section-head"},B("span",null,f),B("code",null,String(U.length))),U.length===0?B("p",{className:"codex-task-section-empty"},Q):B("div",{className:"codex-task-section-list"},U.map((z)=>B(pX,{key:z.id,task:z,selected:_===z.id,onSelect:()=>y(z.id),onCopy:l,onReference:$,onMarkRead:j,copied:J===z.id,markingRead:F===z.id}))))}function mX({task:f,queueRows:u,busy:_,onMove:y}){let l=String(f?.id||""),$=w4(f),[j,J]=df($);P$(()=>{J($)},[l,$]);let F=!l||_||["running","judging","retry_wait"].includes(String(f?.status||""));return B("div",{className:"codex-task-move-control","data-testid":"codex-task-queue-move-control"},B("label",null,"任务 queue",B("select",{value:j,disabled:!l||_,onChange:(Q)=>J(String(Q.target.value||$)),"data-testid":"codex-task-queue-move-select"},u.map((Q)=>B("option",{key:String(Q?.id||""),value:String(Q?.id||"")},Uj(Q))))),B("button",{type:"button",className:"ghost-btn",disabled:F||j===$,onClick:()=>y(j),title:F?"运行中 / judging / retry_wait 的任务不能移动;请先打断或等当前 turn 结束":"移动已创建任务到另一个 queue","data-testid":"codex-task-queue-move-button"},"移动"))}function Cz(f,u=4){let _=(Array.isArray(f)?f:[]).map((l)=>String(l||"").trim()).filter(Boolean);if(_.length===0)return"--";let y=_.slice(0,u).join(" / ");return _.length>u?`${y} +${_.length-u}`:y}function kX({task:f,loading:u,onLoadPromptPart:_,testId:y="codex-initial-prompt-full",textTestId:l="codex-initial-prompt-full-text",baseTextTestId:$="codex-initial-prompt-base"}){let j=T4(f),J=C$(f),F=Iz(f).trimEnd(),Q=String(J.full?.text||""),U=mz(f),z=Number(j.promptChars||f?.promptChars||Q.length),W=Number(j.basePromptLines||q1(F)),K=Number(j.promptLines||q1(Q));return B("section",{className:"codex-progressive-card codex-progressive-prompt","data-testid":"codex-progressive-prompt"},B("div",{className:"codex-progressive-card-head"},B("span",{className:"codex-output-channel"},"Prompt"),B("strong",null,"Submitted prompt / 原始用户 prompt"),B("code",null,`${W||q1(F)} lines / ${F.length} chars`)),B("pre",{className:"codex-prompt-full","data-testid":$},F||"空 prompt"),U?B("details",{className:"codex-reference-injection codex-progressive-full-prompt","data-testid":y,onToggle:(q)=>{if(q.currentTarget?.open&&!Q)_?.("full")}},B("summary",null,B("span",null,"引用注入已折叠,点击按需拉取最终进入 opencode 的完整 prompt"),B("code",null,Q?`${K||q1(Q)} lines / ${Q.length} chars`:`${Number.isFinite(z)&&z>0?z:"--"} chars`)),B("pre",{className:"codex-prompt-full codex-prompt-final-full","data-testid":l},Q||(u?"正在按需拉取完整 prompt...":"展开后将只请求 full prompt,不拉取完整 transcript。"))):null)}function iz({task:f,attempt:u,attemptIndex:_,loading:y,onLoadSteps:l,onLoadStep:$,testId:j="codex-execution-summary"}){let J=wX(f,u),F=MX(f,_),Q=Kj(f),U=kz(f,_),z=Number(J.toolCallCount||0),W=Array.isArray(J.editedFiles)?J.editedFiles:[],K=Array.isArray(J.commands)?J.commands:[],q=_?` #${_}`:"";return B("details",{className:"codex-progressive-card codex-execution-summary","data-testid":j,"data-attempt-index":_?String(_):void 0,onToggle:(V)=>{if(V.currentTarget?.open&&!U)l?.(_)}},B("summary",null,B("div",{className:"codex-progressive-card-head"},B("span",{className:"codex-output-channel"},"Summary"),B("strong",null,`执行过程摘要${q}`),B("code",null,`${N4(J.durationMs??J.totalElapsedMs)} / ${z} tools`)),B("div",{className:"codex-execution-digest"},B("span",null,`read ${Number(J.readCount||0)}`),B("span",null,`edit ${Number(J.editCount||0)}`),B("span",null,`run ${Number(J.runCount||0)}`),B("span",null,`${Number(J.stepCount||F.length||0)} steps`))),B("div",{className:"codex-execution-digest expanded"},B("span",null,`修改文件:${Cz(W,6)}`),B("span",null,`执行命令:${Cz(K,4)}`)),F.length===0?B("div",{className:"codex-output-empty"},y?"正在按需拉取步骤 summary...":"展开后将只请求执行步骤 summary,不拉取单步骤全量。"):B("div",{className:"codex-trace-step-list"},F.map((V)=>{let O=String(V?.seq??""),G=Q[O],H=Array.isArray(V?.summaryLines)?V.summaryLines.slice(0,4):[];return B("details",{key:O||`${V?.title}-${V?.at}`,className:`codex-trace-step ${String(V?.kind||"message")}`,"data-testid":`codex-trace-step-${O||"unknown"}`,onToggle:(Z)=>{if(Z.currentTarget?.open&&!G)$?.(V?.seq)}},B("summary",null,B("span",{className:"codex-output-channel"},iX(V?.kind)),B("strong",null,String(V?.title||"Trace step")),V?.status?B("code",null,String(V.status)):null,B("time",null,Sy(V?.at))),B("div",{className:"codex-trace-step-summary"},H.length>0?H.map((Z,E)=>B("pre",{key:`${O}-${E}`},String(Z||""))):B("span",null,"无 summary")),G?.line?B(V4,{items:[G.line],autoScroll:!1,loading:!1,hasDetail:!0,emptyText:"无步骤详情",testId:`codex-trace-step-detail-${O||"unknown"}`,className:"codex-transcript codex-step-detail-transcript",collapseTools:!1}):B("div",{className:"codex-output-empty"},y?"正在按需拉取这个步骤的全量数据...":"展开后将只请求这个单步骤的全量数据。"))})))}function iX(f){let u=String(f||"");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 gz({task:f,attempt:u,attemptIndex:_,testId:y="codex-final-response"}){let l=DX(f,u),$=Number(u?.finalResponseChars||l.length),j=_?` #${_}`:"";return B("section",{className:"codex-progressive-card codex-final-response","data-testid":y,"data-attempt-index":_?String(_):void 0},B("div",{className:"codex-progressive-card-head"},B("span",{className:"codex-output-channel"},"Final"),B("strong",null,`最终 response${j}`),B("code",null,`${Number.isFinite($)?$:l.length} chars`)),B("pre",{className:"codex-transcript-body"},l||"暂无最终 response"))}function nz({task:f,attempt:u,attemptIndex:_,testId:y="codex-progressive-judge"}){let l=cz(f,u),$=_?` #${_}`:"";return B("section",{className:"codex-progressive-card codex-progressive-judge","data-testid":y,"data-attempt-index":_?String(_):void 0},B("div",{className:"codex-progressive-card-head"},B("span",{className:"codex-output-channel"},"Judge"),B("strong",null,`完成判定${$}`),l?.decision?B("code",null,`${l.decision} ${Math.round(Number(l.confidence||0)*100)}%`):null),l?B("div",{className:"codex-judge-card","data-testid":`${y}-card`},B(y_,{status:l.decision},l.decision),B("strong",null,`${Math.round(Number(l.confidence||0)*100)}% confidence`),B("p",{"data-testid":`${y}-reason`},l.reason||"--"),l.continuePrompt?B("pre",{"data-testid":`${y}-continue-prompt`},String(l.continuePrompt||"")):null):B("div",{className:"codex-output-empty"},"尚未判定"))}function gX({task:f,attempt:u,attemptIndex:_,loading:y,onLoadPromptPart:l,testId:$="codex-judge-feedback-prompt"}){let j=TX(f,u,_);if(j===null)return null;let J=pz(_),Q=C$(f)[J],U=String(Q?.text||"").trimEnd(),z=String(j.preview||j.text||"").trimEnd(),W=U||String(j.text||"").trimEnd(),K=Number(Q?.chars||j.chars||W.length||z.length),q=Number(Q?.lines||j.lines||q1(W||z)),V=Q?.forAttempt||j.forAttempt||Number(_||0)+1;return B("details",{className:"codex-progressive-card codex-judge-feedback-prompt","data-testid":$,"data-attempt-index":_?String(_):void 0,onToggle:(O)=>{if(O.currentTarget?.open&&!U)l?.("feedback",_)}},B("summary",null,B("div",{className:"codex-progressive-card-head"},B("span",{className:"codex-output-channel"},"Prompt"),B("strong",null,`judge feedback prompt #${_} -> #${V}`),B("code",null,`${q||"--"} lines / ${Number.isFinite(K)?K:z.length} chars`)),B("p",{className:"codex-feedback-preview","data-testid":`${$}-preview`},z||"展开后按需拉取 judge feedback prompt。")),B("pre",{className:"codex-prompt-full codex-feedback-full","data-testid":`${$}-text`},W||(y?"正在按需拉取 judge feedback prompt...":"展开后将只请求这一次 judge feedback prompt。")))}function nX({task:f,attempt:u,position:_,loading:y,onLoadPromptPart:l,onLoadSteps:$,onLoadStep:j}){let J=Number(u?.index||_+1),F=_===0;return B("section",{className:"codex-attempt-cycle","data-testid":`codex-attempt-cycle-${J}`},B("div",{className:"codex-attempt-cycle-head"},B("span",{className:"codex-output-channel"},`Attempt ${J}`),B("strong",null,String(u?.mode||(J<=1?"initial":"retry"))),u?.terminalStatus?B(y_,{status:u.terminalStatus},u.terminalStatus):null,B("code",null,`${Sy(u?.startedAt)} -> ${Sy(u?.finishedAt)}`)),B(iz,{task:f,attempt:u,attemptIndex:J,loading:y,onLoadSteps:$,onLoadStep:j,testId:F?"codex-execution-summary":`codex-execution-summary-attempt-${J}`}),B(gz,{task:f,attempt:u,attemptIndex:J,testId:F?"codex-final-response":`codex-final-response-attempt-${J}`}),B(nz,{task:f,attempt:u,attemptIndex:J,testId:F?"codex-progressive-judge":`codex-progressive-judge-attempt-${J}`}),B(gX,{task:f,attempt:u,attemptIndex:J,loading:y,onLoadPromptPart:l,testId:F?"codex-judge-feedback-prompt":`codex-judge-feedback-prompt-attempt-${J}`}))}function tX({task:f,loading:u,onLoadPromptPart:_,onLoadSteps:y,onLoadStep:l}){if(!f)return B(ry,{title:"未选择任务",text:"从左侧队列选择任务,或提交新 Codex 任务。"});let $=BX(f);return B("div",{className:"codex-transcript codex-progressive-trace","data-testid":"codex-output"},u&&!Py(f)?B("div",{className:"codex-output-empty"},"正在加载 Trace Summary..."):null,B(kX,{task:f,loading:u,onLoadPromptPart:_}),$.length>0?$.map((j,J)=>B(nX,{key:`${j?.index||J+1}-${j?.startedAt||J}`,task:f,attempt:j,position:J,loading:u,onLoadPromptPart:_,onLoadSteps:y,onLoadStep:l})):[B(iz,{key:"execution",task:f,loading:u,onLoadSteps:y,onLoadStep:l}),B(gz,{key:"final",task:f}),B(nz,{key:"judge",task:f})])}function sX({task:f,loading:u,onLoadPromptPart:_}){if(!f)return B(ry,{title:"未选择任务",text:"选择队列或历史 session 后,这里显示完整 prompt、模型和工作目录。"});let y=T4(f),l=C$(f),$=Iz(f).trimEnd(),j=String(l.full?.text||""),J=mz(f),F=Number(y.basePromptLines||q1($)),Q=Number(y.promptLines||q1(j)),U=Number(y.referencePromptLines||0),z=Number(y.promptChars||f?.promptChars||j.length);return B("div",{className:"codex-prompt-detail","data-testid":"codex-task-prompt-detail"},B("div",{className:"codex-prompt-meta"},B(y_,{status:f?.status},f?.status||"unknown"),B("span",null,`model=${f?.model||"--"}`),B("span",null,`cwd=${f?.cwd||"--"}`),B("span",null,`created=${Sy(f?.createdAt)}`),B("span",null,J?`task ${F} lines / total ${Number.isFinite(Q)&&Q>0?Q:"--"} lines`:`${F} lines / ${$.length} chars`)),B("div",{className:"codex-lazy-detail-callout","data-testid":"codex-task-summary-callout"},B("div",null,B("strong",null,"渐进式 Trace"),B("span",null,"首屏使用后端 Summary;展开 prompt / 步骤时只按需拉取对应片段,不一次性拉取完整 transcript。"))),J?B("details",{className:"codex-reference-injection codex-final-prompt-injection","data-testid":"codex-final-prompt-full",onToggle:(W)=>{if(W.currentTarget?.open&&!j)_?.("full")}},B("summary",null,B("span",null,"最终传入 Codex 的真实完整 prompt"),B("code",null,j?`${Q||q1(j)} lines / ${j.length} chars`:`${Number.isFinite(z)&&z>0?z:"--"} chars`)),B("pre",{className:"codex-prompt-full codex-prompt-final-full","data-testid":"codex-task-final-prompt-full"},j||(u?"正在按需拉取完整 prompt...":"展开后将只请求完整 prompt。"))):null,J?B("details",{className:"codex-reference-injection","data-testid":"codex-reference-injection",onToggle:(W)=>{if(W.currentTarget?.open&&!l.reference?.text)_?.("reference")}},B("summary",null,B("span",null,"引用注入已折叠"),B("code",null,l.reference?.text?`${q1(String(l.reference.text||""))} lines / ${String(l.reference.text||"").length} chars`:`${U||"--"} lines`)),B("pre",{className:"codex-prompt-full codex-prompt-reference-full","data-testid":"codex-task-reference-full"},String(l.reference?.text||"")||(u?"正在按需拉取引用注入...":"展开后将只请求引用注入片段。"))):null,B("pre",{className:"codex-prompt-full","data-testid":"codex-task-prompt-full"},$||"空 prompt"))}function oX({task:f}){let u=OX(f);if(!f||u.length===0)return B(ry,{title:"暂无原始消息",text:"原始 Codex app-server 消息会保留在任务 JSON 中。"});return B("details",{className:"codex-raw-output"},B("summary",null,`原始 messages (${u.length})`),B("div",null,u.map((_)=>B("article",{key:`${_.seq}-${_.channel}`,className:`codex-output-line ${_.channel||"system"}`},B("div",{className:"codex-output-meta"},B("span",{className:"codex-output-channel"},SX(String(_.channel||"system"))),B("span",null,Sy(_.at)),_.method?B("code",null,_.method):null),B("pre",null,String(_.text||""))))))}function aX({task:f}){let u=bz(f).slice().reverse();if(u.length===0)return B(ry,{title:"尚无 attempt",text:"任务开始运行后,这里会记录 Codex 终态、传输中断和 stderr tail。"});return B("div",{className:"table-wrap codex-attempt-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,u.map((_)=>B("tr",{key:`${_.index}-${_.startedAt}`},B("td",null,_.index),B("td",null,_.mode),B("td",null,B(y_,{status:_.terminalStatus||"unknown"},_.terminalStatus||"unknown")),B("td",null,_.transportClosedBeforeTerminal?B(y_,{status:"failed"},"closed-before-terminal"):B(y_,{status:"succeeded"},"normal")),B("td",null,`code=${_.appServerExitCode??"--"} signal=${_.appServerSignal??"--"}`),B("td",null,Sy(_.finishedAt)))))))}function tz({microservices:f,onRaw:u,apiBaseUrl:_="/api",initialTasksData:y=null,standalone:l=!1}){let $=f.find((k)=>k.id==="codex-queue")||null,j=IX(y),J=String(j?.id||""),F=new Map;if(j!==null&&J.length>0)F.set(J,{task:j,maxSeq:X4(Array.isArray(j.transcript)?j.transcript:[]),complete:Boolean(j._transcriptComplete),completeUpdatedAt:j._transcriptComplete?String(j.updatedAt||""):""});let Q=typeof performance>"u"?0:performance.now(),U=Zu(J),z=Zu(0),W=Zu(0),K=Zu(!1),q=Zu(!1),V=Zu(null),O=Zu(new Map),G=Zu(new Map),H=Zu(new Map),Z=Zu(new Map),E=Zu(new Set),L=Zu(!1),M=Zu(Boolean(y)),N=Zu(F),w=Zu(y),[R,p]=df(null),[x,C]=df(y),[P,D]=df(J),[T,S]=df(j),[r,Y]=df(!1),[v,m]=df(""),[c,o]=df(""),[ff,n]=df("default"),[lf,Gf]=df(v_),[zf,jf]=df("gpt-5.5"),[Wf,Vf]=df("/root/unidesk"),[Kf,h]=df(99),[g,I]=df(1),[yf,$f]=df(!1),[Qf,Yf]=df(!1),[xf,tf]=df(""),[j0,u0]=df(!0),[D0,Fu]=df(()=>typeof window>"u"?!0:window.matchMedia(AX).matches),[O0,x0]=df(!1),[ku,X0]=df(""),[Au,uf]=df(""),[vf,a0]=df(""),[Bf,v0]=df(""),[i0,d0]=df(!1),[b0,m1]=df(PX),[ef,iu]=df(y?{phase:"complete",taskId:J,queueMs:0,detailMs:0,totalMs:Q,chunks:j?1:0,transcriptRows:Array.isArray(j?.transcript)?j.transcript.length:0,partial:Boolean(y?.selected?.hasMore||S$(j)),completedAt:new Date}:null),[ey,f3]=df(y?new Date:null),[s,Nf]=df(!1),Of=Z1(x).map((k)=>jj(k,b0)),Cf=Of.filter(I3),_0=Of.filter((k)=>!P1(k)),G0=Of.filter((k)=>P1(k)&&!I3(k)),hf=x?.queue||R?.body?.queue||R?.queue||{},h0=r$(x),Qu=Dz(hf,ff),P6=B4(Qu,lf),L1=Number((vu(lf)?hf?.total:P6?.total)??h0.total??Of.length),C6=h0.hasMore===!0&&String(h0.nextBeforeId||"").length>0,u3=L4(hf),_3=vu(lf)?u3:[String(B4(Qu,lf)?.activeTaskId||"")].filter(Boolean),$y=Tz(hf,Qu,lf,Of),W_=vu(lf)?$j(hf):$j(P6||{}),R6=$j(hf),z2=RX(R6),x6=Math.max(xX(R6),u3.length),k1=R$(hf?.unreadTerminal??Cf.length),jy=vu(lf)?"All queues":lf,v6=$?$X($):{},G2=$?JX($):{},Vl=$?jX($):{},El=Yz(()=>XX(v),[v]),j1=Yz(()=>{let k=Mz(g);return El.flatMap((a)=>Array.from({length:k},()=>NX(a,c)))},[El,g,c]),Jy=j1.length,Ol=Jy>1&&!yf,K2=Qf||O0||Jy===0||Ol,b6=cX(hf,zf),Xl=T?.id&&T?.activeTurnId&&String(T?.status)==="running",Z2=T?.id&&!["succeeded","failed","canceled"].includes(String(T?.status||"")),q2=T?.id&&["succeeded","failed","canceled"].includes(String(T?.status||""));function i1(k){let a=typeof k==="function"?k(w.current):k;return w.current=a,C(a),a}function h6(k,a,Af=null,Zf=null){let wf=new Set(k.map((Ef)=>String(Ef||"")).filter(Boolean));if(wf.size===0&&Zf===null&&Af===null)return;i1((Ef)=>{if(!Ef)return Ef;let rf=Z1(Ef).map((Rf)=>{let cf=String(Rf?.id||"");if(!wf.has(cf))return Rf;let nf=Zf&&String(Zf?.id||"")===cf?Zf:{};return{...Rf,...nf,readAt:a,terminalUnread:!1}});return{...Ef,queue:Af||Ef.queue,tasks:wf.size>0?E4([rf],$y):rf}});for(let Ef of wf){let rf=N.current.get(Ef);if(rf?.task){let Rf=Zf&&String(Zf?.id||"")===Ef?Zf:{},cf={...rf.task,...Rf,readAt:a,terminalUnread:!1};if(N.current.set(Ef,{...rf,task:cf}),U.current===Ef)S(cf)}}}function Nl(k,a){let Af=k.map((Zf)=>String(Zf||"")).filter(Boolean);if(Af.length===0)return;m1((Zf)=>{let wf={...Zf||{}};for(let Ef of Af)wf[Ef]=a;return CX(wf),wf})}P$(()=>{$f(!1)},[v,g,c]);function Y1(k,a,Af){let Zf=N.current.get(k)||{},wf=Zf.task||{},Ef=Array.isArray(wf.transcript)?wf.transcript:[],rf=hX(wf,a),Rf=Object.prototype.hasOwnProperty.call(a,"transcript")?Jj(Ef,Array.isArray(a.transcript)?a.transcript:[]):Ef,cf={...wf,...rf,transcript:Rf,output:Array.isArray(rf.output)?Zj(wf,rf,"output"):Array.isArray(wf.output)?wf.output:[],events:Array.isArray(rf.events)?Zj(wf,rf,"events"):Array.isArray(wf.events)?wf.events:[]},nf=String(cf?.updatedAt||""),of=Boolean(a._transcriptComplete)&&P1(cf),J0=Boolean(Zf.complete)&&P1(cf)&&String(Zf.completeUpdatedAt||"")===nf,e0=of||J0,J1={...Zf,task:cf,maxSeq:X4(Rf),complete:e0,completeUpdatedAt:e0?nf:""};if(N.current.set(k,J1),Af===W.current&&U.current===k)S(cf);return J1}async function Ll(k,a=!1,Af,Zf){if(!$||!k)return;let Ef=N.current.get(k)?.task,rf=String(Ef?._traceSummaryUpdatedAt||""),Rf=String(Ef?.updatedAt||"");if(!a&&Ef?._traceSummaryLoaded===!0&&rf===Rf)return;let cf=k,nf=O.current.get(cf);if(nf)return nf;let of=W.current,J0=performance.now();if(U.current===k)Y(!0);let e0=(async()=>{try{let J1=await KX(_,k);if(of!==W.current||U.current!==k)return;let N0=J1?.summary||{};Y1(k,{id:k,status:N0.status,updatedAt:N0.updatedAt,startedAt:N0.startedAt,finishedAt:N0.finishedAt,currentAttempt:N0.currentAttempt,maxAttempts:N0.maxAttempts,finalResponse:N0.finalResponse,lastJudge:N0.lastJudge,lastError:N0.lastError,attempts:Array.isArray(N0.attempts)?N0.attempts:[],timing:N0.timing,_traceSummary:N0,_traceSummaryLoaded:!0,_traceSummaryUpdatedAt:String(N0.updatedAt||""),_detailLoaded:!0},of),iu({phase:"complete",taskId:k,queueMs:Zf??0,detailMs:performance.now()-J0,totalMs:Af===void 0?performance.now()-J0:performance.now()-Af,chunks:1,transcriptRows:Number(N0?.execution?.stepCount||0),partial:!1,completedAt:new Date})}finally{if(O.current.delete(cf),of===W.current&&U.current===k)Y(!1)}})();O.current.set(cf,e0),await e0}async function I6(k,a=null){let Af=U.current;if(!$||!Af||!k)return;let Zf=N.current.get(Af)?.task,wf=C$(Zf),Ef=k==="feedback"||k==="judge-feedback"?pz(a):k;if(wf[Ef]?.text)return;let rf=`${Af}:${Ef}`,Rf=G.current.get(rf);if(Rf)return Rf;let cf=W.current;if(U.current===Af)Y(!0);let nf=(async()=>{try{let of=await ZX(_,Af,k,a);if(cf!==W.current||U.current!==Af)return;let J0=N.current.get(Af)?.task,e0=C$(J0);Y1(Af,{...k==="full"?{prompt:String(of?.text||""),promptChars:Number(of?.chars||0)}:{},_promptDetails:{...e0,[Ef]:of}},cf)}finally{if(G.current.delete(rf),cf===W.current&&U.current===Af)Y(!1)}})();G.current.set(rf,nf),await nf}async function H2(k=null){let a=U.current;if(!$||!a)return;let Af=N.current.get(a)?.task,Zf=k===null||k===void 0||String(k).length===0?"":String(k);if(kz(Af,Zf||null))return;let wf=`${a}:${Zf||"all"}`,Ef=H.current.get(wf);if(Ef)return Ef;let rf=W.current;if(U.current===a)Y(!0);let Rf=(async()=>{try{let cf=await qX(_,a,0,500,Zf||null);if(rf!==W.current||U.current!==a)return;let nf=Array.isArray(cf?.steps)?cf.steps:[];if(Zf){let of=N.current.get(a)?.task,J0=b_(of?._traceStepsByAttempt)||{},e0=b_(of?._traceStepsLoadedByAttempt)||{};Y1(a,{_traceStepsByAttempt:{...J0,[Zf]:nf},_traceStepsLoadedByAttempt:{...e0,[Zf]:!0}},rf)}else Y1(a,{_traceSteps:nf,_traceStepsLoaded:!0,_traceStepsHasMore:Boolean(cf?.hasMore),_traceStepsNextAfterSeq:cf?.nextAfterSeq},rf)}finally{if(H.current.delete(wf),rf===W.current&&U.current===a)Y(!1)}})();H.current.set(wf,Rf),await Rf}async function V2(k){let a=U.current,Af=String(k??"");if(!$||!a||Af.length===0)return;let Zf=N.current.get(a)?.task;if(Kj(Zf)[Af]?.line)return;let Ef=`${a}:${Af}`,rf=Z.current.get(Ef);if(rf)return rf;let Rf=W.current;if(U.current===a)Y(!0);let cf=(async()=>{try{let nf=await HX(_,a,k);if(Rf!==W.current||U.current!==a)return;let of=N.current.get(a)?.task,J0=Kj(of);Y1(a,{_traceStepDetails:{...J0,[Af]:nf}},Rf)}finally{if(Z.current.delete(Ef),Rf===W.current&&U.current===a)Y(!1)}})();Z.current.set(Ef,cf),await cf}async function zA(k,a,Af){if(!$||!k)return;let Zf=performance.now(),wf=W.current,Ef=N.current.get(k);if(Ef?.task){if(S(Ef.task),Y(S$(Ef.task)||!Ef.complete),!S$(Ef.task)&&Ef.complete&&P1(Ef.task)&&String(Ef.completeUpdatedAt||"")===String(Ef.task?.updatedAt||"")){iu({phase:"complete",taskId:k,queueMs:Af??0,detailMs:0,totalMs:a===void 0?0:performance.now()-a,chunks:0,transcriptRows:Array.isArray(Ef.task.transcript)?Ef.task.transcript.length:0,completedAt:new Date});return}}else Y(!0);let rf=V.current;if(rf?.taskId===k&&rf.token===wf)return rf.promise;let Rf=(async()=>{try{let cf=await M0(r0(_,`/api/tasks/${encodeURIComponent(k)}?meta=1`));if(wf!==W.current||U.current!==k)return;let nf=N.current.get(k),of=Array.isArray(nf?.task?.transcript)?nf.task.transcript:[],J0=cf?.task||{},e0=Boolean(nf?.complete)&&String(nf?.completeUpdatedAt||"")===String(J0?.updatedAt||"");Y1(k,{...J0,summaryOnly:!1,_metaLoaded:!0,transcript:of,_detailLoaded:of.length>0,_transcriptComplete:e0},wf);let J1=S$(nf?.task)||Boolean(nf?.task?._transcriptPreview),N0=J1?0:of.length>0?Pz(of):0,z_=!J1&&nf?.complete&&P1(J0)&&String(nf?.completeUpdatedAt||"")===String(J0?.updatedAt||"")?X4(of):N0,l3=!0,k6=0,i6=of.length;while(l3){let nu=await M0(r0(_,`/api/tasks/${encodeURIComponent(k)}/transcript?afterSeq=${encodeURIComponent(String(z_))}&limit=${_X}&fullText=1`));if(wf!==W.current||U.current!==k)return;let B1=N.current.get(k),Fy=Array.isArray(B1?.task?.transcript)?B1.task.transcript:[],Ay=Jj(Fy,Array.isArray(nu?.transcript)?nu.transcript:[]);k6+=1,i6=Ay.length;let g0=Boolean(!nu?.hasMore);if(Y1(k,{status:nu?.status||J0.status,updatedAt:nu?.updatedAt||J0.updatedAt,transcript:Ay,_detailLoaded:g0||Ay.length>0,_transcriptComplete:g0,_transcriptPreview:J1&&!g0},wf),l3=Boolean(nu?.hasMore),z_=Number(nu?.nextAfterSeq??X4(Ay)),!l3)break;await new Promise((VA)=>window.setTimeout(VA,0))}iu({phase:"complete",taskId:k,queueMs:Af??0,detailMs:performance.now()-Zf,totalMs:a===void 0?performance.now()-Zf:performance.now()-a,chunks:k6,transcriptRows:i6,completedAt:new Date})}finally{if(V.current?.taskId===k&&V.current?.token===wf)V.current=null;if(wf===W.current&&U.current===k)Y(!1)}})();V.current={taskId:k,token:wf,promise:Rf},await Rf}async function gu(k=U.current,a=!0,Af=lf){if(!$)return;if(!a&&L.current)return;let Zf=performance.now();if(a)L.current=!0;if(a)iu({phase:"loading",taskId:String(k||U.current||""),startedAt:new Date});let wf=z.current+1;z.current=wf;let Ef=String(k||U.current||""),rf=Ef?N.current.get(Ef):null,Rf=Array.isArray(rf?.task?.transcript)?rf.task.transcript:[],cf=Pz(Rf),nf=R||{},of=null;try{of=await zX(_,Ef,cf,Af)}catch{of=await WX(_,nf,Af)}if(wf!==z.current){if(a)L.current=!1;return}let J0=performance.now()-Zf;p(nf);let e0=of?.queue||{},J1=String(e0?.activeTaskId||L4(e0)[0]||""),N0=of;i1((Uu)=>{let Dl=Z1(of),Qy=Z1(Uu),$3=Qy.length>0?E4([Qy,Dl],J1):E4([Dl],J1),mH=r$(of),n6=r$(Uu),kH=Qy.length>Dl.length&&(n6.hasMore===!1||String(n6.nextBeforeId||"").length>0),iH={...mH,...kH?{hasMore:n6.hasMore,nextBeforeId:n6.nextBeforeId}:{},returned:$3.length};return N0={...of,tasks:$3,pagination:iH},N0});let z_=Z1(N0),l3=Dz(e0,ff),k6=Tz(e0,l3,Af,z_),i6=UX(l3,Af,z_),nu=Ef||U.current,B1=N0?.selected||null,Fy=B1?.task||null,Ay=Array.isArray(B1?.transcript)?B1.transcript:null,g0=nu&&(z_.some((Uu)=>Uu.id===nu)||String(Fy?.id||"")===nu)?nu:k6||i6||z_[0]?.id||"";if(U.current!==g0)W.current+=1;U.current=g0,D(g0);let g6=z_.find((Uu)=>Uu.id===g0);if(g6){let Uu=N.current.get(g0);if(Uu?.task)N.current.set(g0,{...Uu,task:{...g6,...Uu.task,status:g6.status,updatedAt:g6.updatedAt}})}if(Fy?.id===g0&&Ay!==null){let Uu=N.current.get(g0),Dl=Array.isArray(Uu?.task?.transcript)?Uu.task.transcript:[],Qy=Jj(Dl,Ay),$3=Boolean(B1?.preview);if(Y1(g0,{...Fy,_summaryLoaded:!0,transcript:Qy,_detailLoaded:!B1?.hasMore||Qy.length>0,_transcriptComplete:!$3&&!B1?.hasMore&&P1(Fy),_transcriptPreview:$3},W.current),Y(!1),a)iu({phase:"complete",taskId:g0,queueMs:J0,detailMs:Math.max(0,performance.now()-Zf-J0),totalMs:performance.now()-Zf,chunks:1,transcriptRows:Qy.length,partial:Boolean($3||B1?.hasMore||S$(Fy)),completedAt:new Date});if(f3(new Date),a)L.current=!1;return}if(a)iu({phase:"session",taskId:g0,queueMs:J0,totalMs:J0,startedAt:new Date(Date.now()-J0)});if(g0)Ll(g0,!0,a?Zf:void 0,a?J0:void 0).catch((Uu)=>X0(Tf(Uu,"加载 Codex Trace Summary 失败")));else if(W.current+=1,S(null),Y(!1),a)iu({phase:"complete",taskId:"",queueMs:J0,detailMs:0,totalMs:performance.now()-Zf,chunks:0,transcriptRows:0,completedAt:new Date});if(f3(new Date),a)L.current=!1}async function c6(){if(!$||s||q.current)return;let k=String(r$(x).nextBeforeId||"");if(!k)return;q.current=!0,Nf(!0),X0("");try{let a=await GX(_,lf,k),Af=Z1(a),Zf=a?.queue||hf||{},wf=String(Zf?.activeTaskId||L4(Zf)[0]||$y||"");i1((Ef)=>{let rf=E4([Z1(Ef),Af],wf),Rf=r$(a);return{...Ef||{},queue:Zf,tasks:rf,pagination:{...Rf,returned:rf.length}}})}catch(a){X0(Tf(a,"加载更早 Codex tasks 失败"))}finally{q.current=!1,Nf(!1)}}function p6(k){let a=k.currentTarget;if(!a||s||!C6)return;if(a.scrollHeight-a.scrollTop-a.clientHeight<120)c6()}async function Tu(k,a){x0(!0),X0("");try{await k()}catch(Af){X0(Tf(Af,a))}finally{x0(!1)}}async function y3(k){if(!k)return;try{let a=!1;try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(k),a=!0}catch{a=!1}if(!a){let Af=document.createElement("textarea");Af.value=k,Af.style.position="fixed",Af.style.opacity="0",document.body.appendChild(Af),Af.select(),a=document.execCommand("copy"),document.body.removeChild(Af)}if(!a)throw Error("browser clipboard rejected the copy request");a0(k),uf(`已复制任务 ID:${k}`),window.setTimeout(()=>a0((Af)=>Af===k?"":Af),1600)}catch(a){X0(`复制任务 ID 失败:${Tf(a)}`)}}function Yl(k){if(!k)return;o(k),uf(`已引用任务 ID:${k};提交时后端会读取并注入该任务上下文`)}async function Bl(k){if(!$||!k)return;v0(k),await Tu(async()=>{let a=null,Af=!1;try{a=await VX(_,k)}catch{Af=!0}let Zf=a?.task||{id:k,readAt:new Date().toISOString(),terminalUnread:!1},wf=String(Zf?.readAt||new Date().toISOString());Nl([k],wf),h6([k],wf,a?.queue||null,Zf),uf(Af?`已在本浏览器将任务 ${k} 标为已读;后端升级后会同步持久化`:`已将任务 ${k} 标为已读`)},"标记 Codex task 已读失败"),v0((a)=>a===k?"":a)}async function wl(){if(!$||i0)return;d0(!0),await Tu(async()=>{let k=null,a=!1;try{k=await EX(_)}catch{a=!0}let Af=String(k?.readAt||new Date().toISOString()),Zf=Z1(w.current).map((Rf)=>jj(Rf,b0)).filter(I3).map((Rf)=>String(Rf?.id||"")).filter(Boolean),wf=Array.from(N.current.entries()).filter(([,Rf])=>I3(jj(Rf?.task,b0))).map(([Rf])=>Rf),Ef=Array.from(new Set([...Zf,...wf]));Nl(Ef,Af),h6(Ef,Af,k?.queue||null);let rf=a?Ef.length:Number(k?.count||Ef.length);uf(a?`已在本浏览器将 ${rf} 个已结束未读任务标为已读;后端升级后会同步持久化`:`已将 ${rf} 个已结束未读任务标为已读`)},"全部标为已读失败"),d0(!1)}function E2(k){let a=k||v_;if(Gf(a),!vu(a))n(a);if(i1(null),!(vu(a)?U.current:""))U.current="",W.current+=1,D(""),S(null),Y(!0)}async function O2(){let k=typeof window>"u"?"":window.prompt("输入新的 Codex queue ID(字母/数字/._-,最长 64)","new-lane"),a=String(k||"").trim();if(!a)return;await Tu(async()=>{let Af=await M0(r0(_,"/api/queues"),{method:"POST",body:{queueId:a}}),Zf=String(Af?.queue?.id||a);n(Zf),Gf(Zf),i1(null),U.current="",W.current+=1,D(""),S(null),uf(`已创建并切换到 queue:${Zf}`),await gu("",!0,Zf)},"创建 Codex queue 失败")}async function m6(k){if(k.preventDefault(),K.current){uf("任务正在提交中,请等待当前请求完成,已阻止重复提交。");return}if(j1.length>1&&!yf){X0(`检测到将创建 ${j1.length} 个任务;请先勾选“确认批量入队”,避免误传多个任务。`);return}K.current=!0,Yf(!0),uf("正在提交 Codex Queue 任务,请等待后端确认,输入已临时锁定。"),await Tu(async()=>{if(j1.length===0)throw Error("prompt 不能为空");let a=Y4(c),Af=ff.trim()||"default",Zf=[...j1],wf=(nf)=>({prompt:nf,queueId:Af,model:zf,cwd:Wf,maxAttempts:Number(Kf),...a.length>0?{referenceTaskIds:a}:{}}),Ef=Zf.length===1?wf(Zf[0]):{tasks:Zf.map(wf)},rf=await M0(r0(_,Zf.length===1?"/api/tasks":"/api/tasks/batch"),{method:"POST",body:Ef}),Rf=rf?.tasks?.[0]?.id||"",cf=Array.isArray(rf?.tasks)?rf.tasks.map((nf)=>String(nf?.id||"")).filter(Boolean):[];if(uf(`已创建 ${cf.length||Zf.length} 个任务${cf.length>0?`:${cf.join(" / ")}`:""}`),m(""),o(""),$f(!1),U.current=Rf,lf!==Af)i1(null);Gf(Af),n(Af),await gu(Rf,!0,Af)},"Codex 任务入队失败"),K.current=!1,Yf(!1)}async function PH(k){if(k.preventDefault(),!T?.id)return;await Tu(async()=>{await M0(r0(_,`/api/tasks/${encodeURIComponent(T.id)}/steer`),{method:"POST",body:{prompt:xf}}),tf(""),await gu(T.id)},"追加 prompt 失败")}async function CH(){if(!T?.id)return;await Tu(async()=>{await M0(r0(_,`/api/tasks/${encodeURIComponent(T.id)}/interrupt`),{method:"POST",body:{}}),await gu(T.id)},"打断 Codex session 失败")}async function RH(){if(!T?.id)return;await Tu(async()=>{await M0(r0(_,`/api/tasks/${encodeURIComponent(T.id)}/retry`),{method:"POST",body:{}}),await gu(T.id)},"重新入队失败")}async function xH(k){let a=String(T?.id||""),Af=String(k||"").trim();if(!a||!Af)return;let Zf=w4(T);if(Af===Zf){uf(`任务 ${a} 已在 queue=${Af}`);return}await Tu(async()=>{let Ef=(await M0(r0(_,`/api/tasks/${encodeURIComponent(a)}/move`),{method:"POST",body:{queueId:Af}}))?.task||{...T,queueId:Af};if(N.current.set(a,{...N.current.get(a)||{},task:Ef}),U.current=a,S(Ef),D(a),n(Af),!vu(lf))i1(null),Gf(Af);uf(`已将任务 ${a} 从 ${Zf} 移动到 ${Af}`),await gu(a,!0,vu(lf)?v_:Af)},"移动任务 queue 失败")}async function vH(){let k=U.current;if(!k)return;let a=performance.now();await Tu(async()=>{iu({phase:"session",taskId:k,queueMs:0,totalMs:0,partial:!0,startedAt:new Date}),await Ll(k,!0,a,0)},"刷新 Trace Summary 失败")}function bH(k){U.current=k,W.current+=1,D(k);let a=N.current.get(k);if(a?.task)S(a.task),Y(!1);else{Y(!0);let Af=Of.find((Zf)=>Zf.id===k);if(Af)S(Af);else S(null)}gu(k).catch((Af)=>X0(Tf(Af,"切换 Codex session 失败")))}function X2(k){if(bH(k),QX())Fu(!1)}P$(()=>{if(M.current){M.current=!1;return}Tu(()=>gu(U.current),"Codex Queue 加载失败")},[$?.id,lf]),P$(()=>{if(!$)return;let k=window.setInterval(()=>{gu(U.current,!1).catch((a)=>X0(Tf(a,"Codex Queue 轮询失败")))},1500);return()=>window.clearInterval(k)},[$?.id,lf]),P$(()=>{if(!$||!T||r)return;let k=String(T.id||"");if(!k)return;let a=String(T.updatedAt||""),Af=String(T._traceSummaryUpdatedAt||"");if(T._traceSummaryLoaded===!0&&Af===a)return;let Zf=`${k}:${a||"unknown"}`;if(E.current.has(Zf))return;E.current.add(Zf),Ll(k,!0).catch((wf)=>X0(Tf(wf,"自动加载 Trace Summary 失败")))},[$?.id,T?.id,T?.updatedAt,T?._traceSummaryUpdatedAt,T?._traceSummaryLoaded,r]);let hH=Of.length===0?B(ry,{title:"队列为空",text:"提交一个任务后,Codex 会串行执行并保存输出。"}):[Cf.length>0?B(Aj,{key:"unread",title:"已结束未读",tasks:Cf,selectedId:P,emptyText:"暂无已结束未读任务。",onSelect:X2,onCopy:y3,onReference:Yl,onMarkRead:Bl,copiedTaskId:vf,markingReadTaskId:Bf}):null,B(Aj,{key:"active",title:"运行 / 排队",tasks:_0,selectedId:P,emptyText:"当前没有运行或排队任务。",onSelect:X2,onCopy:y3,onReference:Yl,onMarkRead:Bl,copiedTaskId:vf,markingReadTaskId:Bf}),B(Aj,{key:"history",title:"历史 session",tasks:G0,selectedId:P,emptyText:"最近没有完成、失败或取消的 session。",onSelect:X2,onCopy:y3,onReference:Yl,onMarkRead:Bl,copiedTaskId:vf,markingReadTaskId:Bf}),B("div",{key:"pagination",className:"codex-task-pagination","data-testid":"codex-task-pagination"},B("span",null,`已加载 ${Of.length} / ${Number.isFinite(L1)?L1:Of.length}`),C6?B("button",{type:"button",className:"ghost-btn",disabled:s,onClick:()=>void c6(),"data-testid":"codex-load-more-tasks-button"},s?"加载中":"加载更早任务"):B("code",null,"已到队列末尾"))],GA=(k,a=!1)=>B("label",{className:`codex-queue-switcher ${a?"compact":""}`},B("span",null,a?"Queue":"查看 queue"),B("select",{value:lf,onChange:(Af)=>E2(String(Af.target.value||v_)),"data-testid":k},B("option",{value:v_},`All queues · ${Number.isFinite(L1)?L1:Of.length} tasks · ${u3.length} running`),Qu.map((Af)=>B("option",{key:String(Af?.id||""),value:String(Af?.id||"")},Uj(Af))))),IH=B("div",{className:"codex-trace-status","data-testid":"codex-trace-status-summary"},B("span",{className:"codex-trace-status-chip queued"},B("b",null,"排队"),String(z2)),B("span",{className:"codex-trace-status-chip running"},B("b",null,"运行"),String(x6)),B("span",{className:`codex-trace-status-chip unread ${k1>0?"warn":""}`},B("b",null,"结束未读"),String(k1))),cH=B(My,{title:T?`Trace ${String(T.id).slice(0,22)}`:"Trace 输出",eyebrow:T?`${T.status} / view=${jy} / task queue=${w4(T)} / ${T.model} / agent loop trace`:`Agent loop trace / view=${jy}`,summary:IH,actions:B("div",{className:"panel-actions"},GA("codex-queue-filter-select"),B("button",{type:"button",className:"ghost-btn codex-mark-all-read-btn",disabled:k1===0||O0||i0,onClick:()=>void wl(),"data-testid":"codex-mark-all-read-button"},i0?"标记中":`全部标已读${k1>0?` (${k1})`:""}`),T?B("button",{type:"button",className:"ghost-btn",disabled:r||O0,onClick:()=>void vH(),"data-testid":"codex-load-full-trace-button"},r?"加载中":Py(T)?"刷新 Summary":"加载 Summary"):null,B("button",{type:"button",className:"codex-session-title-toggle",onClick:()=>Fu((k)=>!k),"data-testid":"codex-queue-sidebar-toggle"},D0?"收起队列":"展开队列"),B("label",{className:"inline-check"},B("input",{type:"checkbox",checked:j0,onChange:(k)=>u0(Boolean(k.target.checked))}),"自动滚动"),B("button",{type:"button",className:"ghost-btn",disabled:!Z2||O0,onClick:()=>void CH(),"data-testid":"codex-interrupt-button"},"打断"),B("button",{type:"button",className:"ghost-btn",disabled:!q2||O0,onClick:()=>void RH()},"重试"),T?B(Bz,{title:"Codex Task",data:T,onOpen:u,testId:"raw-codex-task"}):null),className:"codex-output-panel"},B("div",{className:`codex-session-shell ${D0?"":"queue-collapsed"}`},D0?B("aside",{className:"codex-session-sidebar","data-testid":"codex-session-sidebar"},B("div",{className:"codex-session-sidebar-head"},B("div",null,B("span",null,vu(lf)?"All queues":"Queue lane"),B("strong",null,`${jy} · ${Of.length}/${Number.isFinite(L1)?L1:Of.length} sessions · 未读 ${k1}`)),B("button",{type:"button",className:"ghost-btn",onClick:()=>Fu(!1)},"收起")),GA("codex-queue-filter-sidebar",!0),B("div",{className:"codex-task-list codex-task-list-session",onScroll:p6,"data-testid":"codex-task-list-scroll"},hH)):null,B("div",{className:"codex-session-main"},B("div",{className:"codex-output-stack"},B(tX,{task:T,loading:r,onLoadPromptPart:I6,onLoadSteps:H2,onLoadStep:V2}),B(oX,{task:T})))));if(!$)return B(ry,{title:"Codex Queue 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=codex-queue"});let KA=Number(ef?.totalMs),ZA=Number(ef?.queueMs),qA=Number(ef?.detailMs),HA=Number(ef?.transcriptRows),pH=ef?.phase==="complete"?"complete":String(ef?.phase||"idle");return B("div",{className:`codex-queue-page ${l?"codex-standalone-page":""}`,"data-testid":"codex-queue-page","data-load-state":pH,"data-load-total-ms":Number.isFinite(KA)?String(Math.round(KA*10)/10):"","data-load-queue-ms":Number.isFinite(ZA)?String(Math.round(ZA*10)/10):"","data-load-detail-ms":Number.isFinite(qA)?String(Math.round(qA*10)/10):"","data-load-transcript-rows":Number.isFinite(HA)?String(HA):"","data-load-task-id":String(ef?.taskId||P||""),"data-load-partial":ef?.partial?"true":"false"},B(H0,{error:ku,wide:!0}),Au?B("div",{className:"form-success wide","data-testid":"codex-create-success"},Au):null,B("div",{className:"codex-session-stage codex-session-stage-top"},cH),B("div",{className:"codex-queue-layout"},B("div",{className:"codex-left-rail"},B(My,{title:"提交任务",eyebrow:Qf?"Submitting...":j1.length>1?`${j1.length} tasks`:"Single or Batch",className:"codex-compose-panel"},B("form",{className:`codex-task-form ${Qf?"is-submitting":""}`,onSubmit:m6,"data-testid":"codex-queue-task-form","aria-busy":Qf?"true":"false"},B("label",null,"Prompt / 多任务用单独一行 --- 分隔",B("textarea",{value:v,rows:8,disabled:Qf,onChange:(k)=>m(k.target.value),placeholder:"写入 Codex 任务;多个任务之间用 --- 分隔。"})),B("label",{className:"codex-reference-field"},"引用任务 ID(可选)",B("input",{value:c,disabled:Qf,onChange:(k)=>o(k.target.value),placeholder:"codex_...;支持空格/逗号分隔多个 ID","data-testid":"codex-reference-task-id"}),Y4(c).length>0?B("code",null,`后端将解析并注入:${Y4(c).join(" / ")}`):null),B("div",{className:"codex-form-grid"},B("label",{className:"codex-submit-queue-field"},"Queue",B("div",{className:"codex-submit-queue-row"},B("select",{value:ff,disabled:Qf,onChange:(k)=>n(String(k.target.value||"default")),"data-testid":"codex-queue-id-select"},Qu.map((k)=>B("option",{key:String(k?.id||""),value:String(k?.id||"")},Uj(k)))),B("button",{type:"button",className:"ghost-btn codex-create-queue-btn",onClick:()=>void O2(),disabled:O0||Qf,"data-testid":"codex-create-queue-button"},"创建 queue"))),B("label",null,"模型",B("select",{value:zf,disabled:Qf,onChange:(k)=>jf(k.target.value),"data-testid":"codex-model-select"},b6.map((k)=>B("option",{key:k,value:k},k)))),B("label",null,"工作目录",B("input",{value:Wf,disabled:Qf,onChange:(k)=>Vf(k.target.value),placeholder:hf?.defaultWorkdir||"/root/unidesk"})),B("label",null,"最大尝试",B("input",{type:"number",min:1,max:99,value:Kf,disabled:Qf,onChange:(k)=>h(Number(k.target.value)),"data-testid":"codex-max-attempts-input"})),B("label",null,"入队份数",B("input",{type:"number",min:1,max:50,value:g,disabled:Qf,onChange:(k)=>I(Number(k.target.value)),"data-testid":"codex-repeat-count-input"}))),Jy>1?B("label",{className:`codex-batch-confirm ${yf?"confirmed":""}`,"data-testid":"codex-batch-confirm-row"},B("input",{type:"checkbox",checked:yf,disabled:Qf,onChange:(k)=>$f(Boolean(k.target.checked)),"data-testid":"codex-batch-confirm-checkbox"}),B("span",null,`确认批量入队 ${Jy} 个任务(prompt 分段 ${El.length} × 入队份数 ${Mz(g)})`)):null,Qf?B("div",{className:"codex-submit-wait","data-testid":"codex-submit-wait"},"正在提交到后端,已锁定输入以防重复提交..."):null,B("div",{className:"codex-form-actions"},B("button",{type:"button",className:"ghost-btn",disabled:O0||Qf||v.length===0&&c.length===0,onClick:()=>{m(""),o(""),$f(!1),uf("已清空任务输入栏")},"data-testid":"codex-clear-input-button"},"清空输入"),B("button",{type:"submit",className:"primary-btn",disabled:K2,"data-testid":"codex-enqueue-button"},Qf?"提交中,请等待...":Ol?`请确认批量入队 ${Jy} 个任务`:j1.length>1?`批量入队 ${j1.length} 个任务`:"入队并运行"))))),B("div",{className:"codex-main-stage"},B("div",{className:"codex-detail-grid"},B(My,{title:"Prompt 全量",eyebrow:T?String(T.id):"selected task",className:"codex-prompt-panel"},B(sX,{task:T,loading:r,onLoadPromptPart:I6})),B(My,{title:"运行控制",eyebrow:Xl?"Active turn steer":"Steer when running"},B("div",{className:"codex-run-control-stack"},B(mX,{task:T,queueRows:Qu,busy:O0,onMove:xH}),B("form",{className:"codex-steer-form",onSubmit:PH},B("label",null,"追加 prompt",B("textarea",{value:xf,rows:4,onChange:(k)=>tf(k.target.value),placeholder:"给正在运行的 Codex session 推入新的指令或纠偏。",disabled:!Xl})),B("button",{type:"submit",className:"primary-btn",disabled:!Xl||O0||xf.trim().length===0,"data-testid":"codex-steer-button"},"推入运行中 session")))),B(My,{title:"完成判定",eyebrow:T?.lastJudge?T.lastJudge.source:"judge"},T?.lastJudge?B("div",{className:"codex-judge-card","data-testid":"codex-task-judge-card"},B(y_,{status:T.lastJudge.decision},T.lastJudge.decision),B("strong",null,`${Math.round(Number(T.lastJudge.confidence||0)*100)}% confidence`),B("p",{"data-testid":"codex-task-judge-reason"},T.lastJudge.reason||"--"),T.lastJudge.continuePrompt?B("code",{"data-testid":"codex-task-judge-continue-prompt"},Rz(T.lastJudge.continuePrompt,220)):null):B(ry,{title:"尚未判定",text:"Codex turn 结束后会由 MiniMax M2.7 或 fallback judge 判定 complete/retry/fail;retry 会在已有 thread 追加继续执行 prompt。"}))),B(My,{title:"Attempts",eyebrow:"terminal vs interruption"},B(aX,{task:T})))),B(My,{title:"运行概要",eyebrow:"用户服务",actions:B("div",{className:"panel-actions"},B("button",{type:"button",className:"ghost-btn",onClick:()=>void Tu(()=>gu(P),"刷新失败"),disabled:O0,"data-testid":"codex-refresh-button"},O0?"同步中":"刷新"),B(Bz,{title:"Codex Queue 用户服务",data:$,onOpen:u,testId:"raw-codex-queue-service"}))},B("div",{className:"codex-queue-hero"},B("div",null,B("div",{className:"node-version-line"},B(y_,{status:v6.providerStatus==="online"?"online":"warn"},v6.providerStatus||"unknown"),B("span",null,$.providerId),B("span",null,Vl.public?"公网暴露":"仅 UniDesk frontend 代理访问"),B("span",null,hf?.judgeConfigured?`MiniMax ${hf?.minimaxModel||"M2.7"}`:"Fallback judge")),B("p",{className:"muted paragraph"},$.description)),B("div",{className:"microservice-ref-card"},B("span",null,"Queue view"),B("strong",null,jy),B("code",null,`${Of.length}/${Number.isFinite(L1)?L1:Of.length} loaded / ${u3.length} active lanes`),B("code",null,`models: ${b6.join(" / ")}`)),B("div",{className:"microservice-ref-card"},B("span",null,"Backend"),B("strong",null,`${Vl.nodeBindHost||"--"}:${Vl.nodePort||"--"}`),B("code",null,G2.containerName||"codex-queue-backend")))),B("div",{className:"codex-queue-metrics"},B(Ty,{label:"Queues",value:String(hf?.queueCount??Qu.length??1),hint:`${Number(_3.length||0)} active lanes`,tone:_3.length>1?"warn":""}),B(Ty,{label:"排队",value:Fj(W_,"queued"),hint:"waiting turns"}),B(Ty,{label:"运行",value:Fj(W_,"running"),hint:_3.length>1?`${_3.length} parallel`:$y?`active ${String($y).slice(0,16)}`:"idle",tone:$y?"warn":"ok"}),B(Ty,{label:"成功",value:Fj(W_,"succeeded"),hint:"completed tasks",tone:"ok"}),B(Ty,{label:"异常/取消",value:String(Number(W_.failed||0)+Number(W_.canceled||0)),hint:"terminal non-success",tone:Number(W_.failed||0)>0?"fail":""}),B(Ty,{label:"加载耗时",value:lj(ef?.totalMs),hint:ef?.phase==="complete"?`queue ${lj(ef?.queueMs)} / session ${lj(ef?.detailMs)} / ${ef?.chunks??0} chunks${ef?.partial?" / preview":""}`:`${ef?.phase||"idle"}...`,tone:Number(ef?.totalMs||0)>1000?"warn":"ok"}),B(Ty,{label:"最近刷新",value:ey?lX(ey):"--",hint:"1.5s polling"})))}var P4=Sf(I0(),1);var Jf=P4.default.createElement,{useEffect:dX}=P4.default,eX=P4.default.useState;function fN(f){if(!f)return"--";let u=new Date(f);if(Number.isNaN(u.getTime()))return"--";return u.toLocaleString("zh-CN",{hour12:!1})}function uN(f){return f.toLocaleTimeString("zh-CN",{hour12:!1})}function M4({status:f,children:u}){let _=String(f||"unknown").toLowerCase();return Jf("span",{className:`status-badge ${_}`},u||f||"unknown")}function h_({label:f,value:u,hint:_,tone:y}){return Jf("article",{className:`metric-card ${y||""}`},Jf("div",{className:"metric-label"},f),Jf("div",{className:"metric-value"},u),Jf("div",{className:"metric-hint"},_))}function r4({title:f,eyebrow:u,actions:_,children:y,className:l}){return Jf("section",{className:`panel ${l||""}`},Jf("div",{className:"panel-head"},Jf("div",null,u?Jf("p",{className:"panel-eyebrow"},u):null,Jf("h2",null,f)),_?Jf("div",{className:"panel-actions"},_):null),Jf("div",{className:"panel-body"},y))}function S4({title:f,data:u,onOpen:_,testId:y}){return Jf("button",{type:"button",className:"ghost-btn","data-testid":y,onClick:()=>_(f,u)},"查看原始JSON")}function Hj({title:f,text:u}){return Jf("div",{className:"empty-state"},Jf("strong",null,f),Jf("span",null,u))}function _N(f){return f?.runtime&&typeof f.runtime==="object"&&!Array.isArray(f.runtime)?f.runtime:{}}function yN(f){return f?.backend&&typeof f.backend==="object"&&!Array.isArray(f.backend)?f.backend:{}}function lN(f){return f?.repository&&typeof f.repository==="object"&&!Array.isArray(f.repository)?f.repository:{}}function Cy(f,u){let _=f&&typeof f==="object"?f[u]:void 0;return Number.isFinite(Number(_))?String(_):"--"}function $N(f){return(Array.isArray(f?.jobs)?f.jobs:[]).slice(0,40)}function jN(f){return(Array.isArray(f?.drafts)?f.drafts:[]).slice(0,12)}function sz({microservices:f,onRaw:u,apiBaseUrl:_="/api"}){let y=f.find((q)=>q.id==="findjob")||null,[l,$]=eX({loading:!1,error:"",health:null,summary:null,jobs:null,drafts:null,refreshedAt:null});async function j(){if(!y)return;$((q)=>({...q,loading:!0,error:""}));try{let[q,V,O,G]=await Promise.all([Df(`${_}/microservices/findjob/health`),Df(`${_}/microservices/findjob/proxy/api/summary`),Df(`${_}/microservices/findjob/proxy/api/jobs?__unideskArrayLimit=jobs:40`),Df(`${_}/microservices/findjob/proxy/api/drafts`)]);$({loading:!1,error:"",health:q,summary:V,jobs:O,drafts:G,refreshedAt:new Date})}catch(q){$((V)=>({...V,loading:!1,error:Tf(q,"FindJob 加载失败")}))}}if(dX(()=>{j()},[y?.id,y?.runtime?.providerStatus]),!y)return Jf(Hj,{title:"FindJob 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=findjob"});let J=_N(y),F=lN(y),Q=yN(y),U=l.summary||{},z=$N(l.jobs),W=jN(l.drafts),K=l.jobs?._unidesk?.arrayLimits?.jobs;return Jf("div",{className:"findjob-page","data-testid":"findjob-page"},Jf(r4,{title:"FindJob 工作台",eyebrow:"D601 用户服务",actions:Jf("div",{className:"panel-actions"},Jf("button",{type:"button",className:"ghost-btn",onClick:j,disabled:l.loading,"data-testid":"findjob-refresh-button"},l.loading?"刷新中":"刷新"),Jf(S4,{title:"FindJob 用户服务",data:y,onOpen:u,testId:"raw-findjob-service"}))},Jf("div",{className:"findjob-hero"},Jf("div",null,Jf("div",{className:"node-version-line"},Jf(M4,{status:J.providerStatus==="online"?"online":"warn"},J.providerStatus||"unknown"),Jf("span",null,y.providerId),Jf("span",null,Q.public?"公网暴露":"仅 UniDesk frontend 代理访问")),Jf("p",{className:"muted paragraph"},y.description)),Jf("div",{className:"microservice-ref-card"},Jf("span",null,"Repo"),Jf("strong",null,F.url||"--"),Jf("code",null,F.commitId||"--")),Jf("div",{className:"microservice-ref-card"},Jf("span",null,"D601 Docker"),Jf("strong",null,`${Q.nodeBindHost||"--"}:${Q.nodePort||"--"}`),Jf("code",null,`${F.composeFile||"--"} / ${F.composeService||"--"}`))),Jf(H0,{error:l.error,wide:!0})),Jf("div",{className:"findjob-grid"},Jf(r4,{title:"岗位指标",eyebrow:l.refreshedAt?`Updated ${uN(l.refreshedAt)}`:"Summary"},Jf("div",{className:"metric-grid"},Jf(h_,{label:"岗位总量",value:Cy(U,"totalJobs"),hint:"tracked jobs",tone:"ok"}),Jf(h_,{label:"原始岗位",value:Cy(U,"rawJobs"),hint:"raw queue"}),Jf(h_,{label:"已验证",value:Cy(U,"verifiedJobs"),hint:"verified set"}),Jf(h_,{label:"优先处理",value:Cy(U,"prioritizedJobs"),hint:"prioritized"}),Jf(h_,{label:"过期",value:Cy(U,"staleJobs"),hint:"stale jobs",tone:"warn"}),Jf(h_,{label:"无效",value:Cy(U,"invalidJobs"),hint:"invalid jobs",tone:"warn"}),Jf(h_,{label:"上海",value:Cy(U,"shanghaiJobs"),hint:"city filter"}),Jf(h_,{label:"Health",value:l.health?.ok?"OK":"--",hint:"D601 /api/health"})),Jf("div",{className:"panel-actions inline-actions"},Jf(S4,{title:"FindJob Summary",data:U,onOpen:u,testId:"raw-findjob-summary"}))),Jf(r4,{title:"近期岗位",eyebrow:K?`${K.returnedLength}/${K.originalLength} Preview`:`${z.length} Preview`},z.length===0?Jf(Hj,{title:"暂无岗位预览",text:"等待 D601 findjob backend 返回 /api/jobs"}):Jf("div",{className:"table-wrap findjob-job-table"},Jf("table",null,Jf("thead",null,Jf("tr",null,Jf("th",null,"优先级"),Jf("th",null,"状态"),Jf("th",null,"单位"),Jf("th",null,"职位"),Jf("th",null,"城市"),Jf("th",null,"阶段"),Jf("th",null,"截止"),Jf("th",null,"证据"))),Jf("tbody",null,z.map((q)=>Jf("tr",{key:q.id},Jf("td",null,Jf(M4,{status:String(q.priority||"").toLowerCase()||"unknown"},q.priority||"--")),Jf("td",null,Jf(M4,{status:String(q.status||"").toLowerCase()||"unknown"},q.status||"--")),Jf("td",null,q.organization_name||"--",Jf("code",null,q.id||"--")),Jf("td",null,q.display_title||q.title||"--"),Jf("td",null,q.display_city||q.city||"--"),Jf("td",null,q.workflow_stage||"--"),Jf("td",null,q.deadline||"--"),Jf("td",null,q.evidence_url?Jf("a",{href:q.evidence_url,target:"_blank",rel:"noreferrer"},"打开"):Jf("span",{className:"muted"},"无"))))))),Jf("div",{className:"panel-actions inline-actions"},Jf(S4,{title:"FindJob Jobs Preview",data:l.jobs,onOpen:u,testId:"raw-findjob-jobs"}))),Jf(r4,{title:"草稿与报告",eyebrow:`${W.length} Drafts`},W.length===0?Jf(Hj,{title:"暂无草稿",text:"D601 findjob backend 未返回 drafts"}):Jf("div",{className:"draft-list"},W.map((q)=>Jf("article",{key:q.id,className:"draft-card"},Jf("div",{className:"node-card-head"},Jf("strong",null,q.id),Jf(M4,{status:q.status},q.status||"--")),Jf("div",{className:"docker-meta compact"},Jf("span",null,q.workflow_stage||"--"),Jf("span",null,`jobs ${q.counts?.jobs??0}`),Jf("span",null,`reports ${q.counts?.reports??0}`)),Jf("span",null,q.latestReportPath||"暂无报告"),Jf("code",null,fN(q.updated_at||q.updatedAt))))),Jf("div",{className:"panel-actions inline-actions"},Jf(S4,{title:"FindJob Drafts",data:l.drafts,onOpen:u,testId:"raw-findjob-drafts"})))))}var h$=Sf(I0(),1);var b=h$.default.createElement,{useEffect:JN}=h$.default,Vj=h$.default.useState;function FN(f){if(!f)return"--";let u=new Date(f);if(Number.isNaN(u.getTime()))return"--";return u.toLocaleString("zh-CN",{hour12:!1})}function AN(f){return f.toLocaleTimeString("zh-CN",{hour12:!1})}function x$(f){let u=Number(f);return Number.isFinite(u)?`${Math.max(0,Math.min(100,u)).toFixed(1)}%`:"--"}function Oj(f){if(f===null||f===void 0||f==="")return"--";let u=Number(f);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 Xj(f,u=2){let _=Number(f);if(!Number.isFinite(_))return f===!1?"false":f===!0?"true":"--";let y=Math.abs(_);if(Number.isInteger(_)||y>=1000)return _.toLocaleString("zh-CN",{maximumFractionDigits:0});if(y>=1)return _.toLocaleString("zh-CN",{maximumFractionDigits:u});return _.toLocaleString("zh-CN",{maximumFractionDigits:Math.max(u,6)})}function b$(f){if(f===null||f===void 0||f==="")return"--";if(typeof f==="boolean")return f?"true":"false";if(typeof f==="number")return Xj(f,4);if(Array.isArray(f))return f.map((u)=>b$(u)).join(" x ");if(typeof f==="object")return"已上报";return String(f)}function C4(f){let u=Number(f);if(!Number.isFinite(u)||u<=0)return"--";let _=u>=100?0:u>=10?1:2;return`${u.toLocaleString("zh-CN",{maximumFractionDigits:_})} epoch/h`}function R4(f){return f.replace(/[^a-zA-Z0-9_-]/g,"-")}function Lu(f){return f&&typeof f==="object"&&!Array.isArray(f)?f:{}}function v$({status:f,children:u}){let _=String(f||"unknown").toLowerCase();return b("span",{className:`status-badge ${_}`},u||f||"unknown")}function I_({label:f,value:u,hint:_,tone:y}){return b("article",{className:`metric-card ${y||""}`},b("div",{className:"metric-label"},f),b("div",{className:"metric-value"},u),b("div",{className:"metric-hint"},_))}function Ej({title:f,eyebrow:u,actions:_,children:y,className:l}){return b("section",{className:`panel ${l||""}`},b("div",{className:"panel-head"},b("div",null,u?b("p",{className:"panel-eyebrow"},u):null,b("h2",null,f)),_?b("div",{className:"panel-actions"},_):null),b("div",{className:"panel-body"},y))}function c3({title:f,data:u,onOpen:_,testId:y}){return b("button",{type:"button",className:"ghost-btn","data-testid":y,onClick:(l)=>{l?.stopPropagation?.(),_(f,u)}},"查看原始JSON")}function l_({title:f,text:u}){return b("div",{className:"empty-state"},b("strong",null,f),b("span",null,u))}function QN(f){return f?.runtime&&typeof f.runtime==="object"&&!Array.isArray(f.runtime)?f.runtime:{}}function UN(f){return f?.backend&&typeof f.backend==="object"&&!Array.isArray(f.backend)?f.backend:{}}function WN(f){return f?.repository&&typeof f.repository==="object"&&!Array.isArray(f.repository)?f.repository:{}}function zN(f){return f?.counts&&typeof f.counts==="object"&&!Array.isArray(f.counts)?f.counts:{}}function GN(f){return Array.isArray(f?.jobs)?f.jobs.slice(0,240):[]}function KN(f){return Array.isArray(f?.projects)?f.projects.slice(0,1000):[]}function x4(f){return Array.isArray(f?.projects)?f.projects:[]}function ZN(f,u){if(Array.isArray(u?.gpu))return u.gpu;if(Array.isArray(f?.gpu))return f.gpu;return[]}function bu(f,u){return`${f}/microservices/met-nonlinear/proxy${u}`}function oz(f){return f.startedAt&&f.finishedAt?Oj((Date.parse(f.finishedAt)-Date.parse(f.startedAt))/1000):"--"}function qN(f){let u=f.progress||{};if(u.etaSeconds!==null&&u.etaSeconds!==void 0&&u.etaSeconds!==""){let j=Number(u.etaSeconds);if(Number.isFinite(j))return Math.max(0,j)}let _=Number(u.currentEpoch),y=Number(u.epochTarget??f.epochTarget),l=Date.parse(f.startedAt||"");if(!Number.isFinite(_)||_<=0||!Number.isFinite(y)||y<=_||!Number.isFinite(l))return null;let $=Math.max(0,(Date.now()-l)/1000);if($<=0)return null;return Math.max(0,$/_*(y-_))}function az(f){let u=f.progress||{},_=Number(u.epochPerHour);if(Number.isFinite(_)&&_>0)return _;let y=Date.parse(f.startedAt||""),l=["succeeded","failed","canceled"].includes(f.status)?Date.parse(f.finishedAt||""):Date.now();if(!Number.isFinite(y)||!Number.isFinite(l)||l<=y)return null;let $=Number(u.currentEpoch??f.epochTarget);if(!Number.isFinite($)||$<=0)return null;return $/((l-y)/3600000)}function dz(f){if(f==="staged")return"待启动";if(f==="queued")return"排队中";if(f==="running")return"训练中";if(f==="succeeded")return"已完成";if(f==="failed")return"失败";if(f==="canceled")return"已取消";return f||"unknown"}function ez(f,u,_){return{name:f,path:u,depth:_,count:0,children:[],project:null}}function HN(f){let u=ez("","",-1);for(let y of f){let $=String(y?.projectPath||"").replace(/\\/g,"/").split("/").filter(Boolean);if($.length===0)continue;let j=u,J=[];for(let[F,Q]of $.entries()){J.push(Q);let U=J.join("/"),z=j.children.find((W)=>W.path===U);if(!z)z=ez(Q,U,F),j.children.push(z);if(F===$.length-1)z.project=y;j=z}}let _=(y)=>{let l=y.children.reduce(($,j)=>$+_(j),0);return y.count=(y.project?1:0)+l,y.children.sort(($,j)=>{if(Boolean($.project)!==Boolean(j.project))return $.project?1:-1;return $.name.localeCompare(j.name,"zh-CN",{numeric:!0,sensitivity:"base"})}),y.count};return _(u),u}function VN(f){let u=Lu(f.data);return Lu(u.project).projectPath?Lu(u.project):u}function EN(f){return Lu(Lu(f.data).job)}function fG({microservices:f,onRaw:u,apiBaseUrl:_="/api"}){let y=f.find((h)=>h.id==="met-nonlinear")||null,[l,$]=Vj({loading:!1,actionBusy:!1,error:"",health:null,summary:null,queue:null,projects:null,history:null,images:null,refreshedAt:null}),[j,J]=Vj({loading:!1,error:"",kind:"",key:"",title:"",data:null}),[F,Q]=Vj(()=>({activeTab:"projects",selectedProjects:{},expandedProjectDirs:{},sourceProject:"",forkCount:1,forkEpochs:200,forkPrefix:`ui_fork_${Date.now()}`,maxConcurrency:3,targetGpuName:"2080 Ti",actionMessage:""}));function U(h){Q((g)=>({...g,...h}))}async function z(h=F.activeTab){if(!y)return;$((g)=>({...g,loading:!0,error:""}));try{let g=[["health",Df(`${_}/microservices/met-nonlinear/health`)],["summary",Df(bu(_,"/api/summary"))]];if(h==="projects")g.push(["projectsRoot",Df(bu(_,"/api/projects?root=projects&limit=500"))]),g.push(["exProjectsRoot",Df(bu(_,"/api/projects?root=ex_projects&limit=500"))]);if(h==="current"||h==="completed"||h==="failed")g.push(["queue",Df(bu(_,"/api/queue"))]);if(h==="completed"||h==="failed")g.push(["history",Df(bu(_,"/api/history"))]);if(h==="gpu")g.push(["images",Df(bu(_,"/api/images"))]);let I=Object.fromEntries(await Promise.all(g.map(async([$f,Qf])=>[$f,await Qf]))),yf={loading:!1,actionBusy:!1,error:"",health:I.health,summary:I.summary,refreshedAt:new Date};if(I.projectsRoot||I.exProjectsRoot){let{projectsRoot:$f,exProjectsRoot:Qf}=I;yf.projects={ok:$f?.ok!==!1&&Qf?.ok!==!1,roots:[{root:"projects",count:x4($f).length},{root:"ex_projects",count:x4(Qf).length}],projects:[...x4($f),...x4(Qf)]}}if(I.queue)yf.queue=I.queue;if(I.history)yf.history=I.history;if(I.images)yf.images=I.images;$(($f)=>({...$f,...yf}))}catch(g){$((I)=>({...I,loading:!1,actionBusy:!1,error:Tf(g,"MET Nonlinear 加载失败")}))}}async function W(h,g){$((I)=>({...I,actionBusy:!0,error:""})),U({actionMessage:`${h}...`});try{let I=await g();U({actionMessage:I||`${h}完成`}),await z()}catch(I){$((yf)=>({...yf,actionBusy:!1,error:Tf(I,`${h}失败`)}))}}async function K(){await W("保存并发设置",async()=>{await Df(bu(_,"/api/queue/settings"),{method:"PUT",body:JSON.stringify({maxConcurrency:Number(F.maxConcurrency),targetGpuName:F.targetGpuName})})})}function q(){return Object.entries(F.selectedProjects).filter(([,h])=>h).map(([h])=>h)}async function V(){let h=q();if(h.length===0)throw Error("请先选择至少一个 project");await W("加入待启动队列",async()=>{await Df(bu(_,"/api/queue"),{method:"POST",body:JSON.stringify({projectPaths:h,maxConcurrency:Number(F.maxConcurrency),targetGpuName:F.targetGpuName,start:!1})}),U({activeTab:"current",selectedProjects:{}})})}async function O(){let h=F.sourceProject||P[0]?.projectPath;if(!h)throw Error("请先选择源 project");await W("Fork Project",async()=>{let g=await Df(bu(_,"/api/projects/fork"),{method:"POST",body:JSON.stringify({sourceProject:h,count:Number(F.forkCount),epochs:Number(F.forkEpochs),prefix:F.forkPrefix})}),I=Array.isArray(g.projectPaths)?g.projectPaths:[],yf=I.reduce(($f,Qf)=>{return $f[Qf]=!0,$f},{...F.selectedProjects});return U({selectedProjects:yf}),`已 fork ${I.length} 个 project,并已自动勾选;请确认后点击加入待启动队列。`})}async function G(){await W("启动队列",async()=>{await Df(bu(_,"/api/queue/start"),{method:"POST",body:JSON.stringify({maxConcurrency:Number(F.maxConcurrency),targetGpuName:F.targetGpuName})}),U({activeTab:"current"})})}async function H(h){await W("取消任务",async()=>{await Df(bu(_,`/api/jobs/${encodeURIComponent(h.id)}/cancel`),{method:"POST",body:JSON.stringify({})})})}async function Z(h){let g=String(h?.projectPath||"");if(!g)return;J({loading:!0,error:"",kind:"project",key:g,title:g,data:null});try{let I=await Df(bu(_,`/api/projects/config?path=${encodeURIComponent(g)}`));J({loading:!1,error:"",kind:"project",key:g,title:g,data:I})}catch(I){J({loading:!1,error:Tf(I,"Project 详情加载失败"),kind:"project",key:g,title:g,data:null})}}async function E(h){let g=String(h?.id||"");if(!g)return;J({loading:!0,error:"",kind:"job",key:g,title:h.projectPath||g,data:null});try{let I=await Df(bu(_,`/api/jobs/${encodeURIComponent(g)}`));J({loading:!1,error:"",kind:"job",key:g,title:I?.job?.projectPath||h.projectPath||g,data:I})}catch(I){J({loading:!1,error:Tf(I,"Job 详情加载失败"),kind:"job",key:g,title:h.projectPath||g,data:null})}}if(JN(()=>{z(F.activeTab)},[y?.id,y?.runtime?.providerStatus,F.activeTab]),!y)return b(l_,{title:"MET Nonlinear 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=met-nonlinear"});let L=QN(y),M=WN(y),N=UN(y),w=zN(l.queue?.queue||l.summary?.queue),R=ZN(l.health,l.queue),p=l.health?.targetGpu||l.summary?.targetGpu||R.find((h)=>String(h.name||"").includes("2080")),x=l.images?.mlImage||l.health?.image||{},C=GN(l.queue),P=KN(l.projects),D=HN(P),T=F.sourceProject||P[0]?.projectPath||"",S=C.filter((h)=>["staged","queued","running"].includes(h.status)),r=C.filter((h)=>h.status==="succeeded"),Y=C.filter((h)=>["failed","canceled"].includes(h.status)),v=Array.isArray(l.history?.jobs)?l.history.jobs.slice(0,120):[],m=[{id:"projects",label:"项目库",count:P.length},{id:"current",label:"当前队列",count:S.length||Number(w.staged||0)+Number(w.queued||0)+Number(w.running||0)},{id:"completed",label:"已完成",count:r.length||Number(w.succeeded||0)},{id:"failed",label:"失败诊断",count:Y.length||Number(w.failed||0)+Number(w.canceled||0)},{id:"gpu",label:"GPU/镜像",count:R.length}];function c(h,g){if(h.length===0)return b(l_,{title:g==="current"?"当前队列为空":"暂无记录",text:g==="current"?"从项目库选择或 fork project 后先加入待启动队列,再启动队列。":"终态任务会显示耗时、exit code 和失败诊断。"});return b("div",{className:"table-wrap met-job-table"},b("table",null,b("thead",null,b("tr",null,b("th",null,"状态"),b("th",null,"Project"),b("th",null,"Epoch"),b("th",null,"速度"),b("th",null,"ETA/耗时"),b("th",null,"GPU"),b("th",null,"Exit"),b("th",null,"更新时间"),b("th",null,"操作"))),b("tbody",null,h.map((I)=>{let yf=I.progress||{},$f=["staged","queued","running"].includes(I.status),Qf=j.kind==="job"&&j.key===I.id;return b("tr",{key:I.id,className:`met-click-row ${Qf?"active":""}`,onClick:()=>E(I),"data-testid":`met-job-row-${R4(I.id)}`},b("td",null,b(v$,{status:I.status},dz(I.status))),b("td",null,b("button",{type:"button",className:"met-inline-link",onClick:(Yf)=>{Yf.stopPropagation(),E(I)}},I.projectPath),b("code",null,I.id)),b("td",null,b("span",null,`${yf.currentEpoch??"--"} / ${yf.epochTarget??I.epochTarget??"--"}`),b("div",{className:"met-progress"},b("span",{style:{width:x$(yf.progressPercent)}}))),b("td",null,b("strong",null,C4(az(I)))),b("td",null,I.status==="succeeded"||I.status==="failed"||I.status==="canceled"?oz(I):I.status==="running"?`ETA ${Oj(qN(I))}`:"--"),b("td",null,I.gpuName||"--"),b("td",null,I.exitCode??"--"),b("td",null,FN(I.updatedAt)),b("td",null,$f?b("button",{type:"button",className:"ghost-btn mini",onClick:(Yf)=>{Yf.stopPropagation(),H(I)},disabled:l.actionBusy},"取消"):null,b(c3,{title:`MET Job ${I.id}`,data:I,onOpen:u,testId:`raw-met-job-${I.id}`})))}))))}function o(){return b("div",{className:"met-queue-summary","data-testid":"met-current-summary"},b(v$,{status:"staged"},`待启动 ${w.staged??0}`),b(v$,{status:"queued"},`排队中 ${w.queued??0}`),b(v$,{status:"running"},`训练中 ${w.running??0}`),b("span",null,`最大并发 ${l.summary?.queue?.maxConcurrency??l.queue?.queue?.maxConcurrency??F.maxConcurrency}`),b("span",null,`目标 GPU ${l.summary?.queue?.targetGpuName??l.queue?.queue?.targetGpuName??F.targetGpuName}`))}function ff(h,g){let I=F.expandedProjectDirs[h];return I===void 0?g<2:Boolean(I)}function n(h,g){let I=ff(h,g);U({expandedProjectDirs:{...F.expandedProjectDirs,[h]:!I}})}function lf(h){let g=8+Math.max(0,h.depth)*16;if(Boolean(h.project)){let $f=h.project,Qf=Boolean(F.selectedProjects[$f.projectPath]),Yf=j.kind==="project"&&j.key===$f.projectPath;return b("div",{key:h.path,className:`met-tree-row project ${Qf?"selected":""} ${Yf?"active":""}`,style:{paddingLeft:g},onClick:()=>Z($f),"data-testid":`met-project-node-${R4($f.projectPath)}`},b("div",{className:"met-tree-name"},b("input",{type:"checkbox",checked:Qf,onClick:(xf)=>xf.stopPropagation(),onChange:(xf)=>U({selectedProjects:{...F.selectedProjects,[$f.projectPath]:xf.target.checked}}),"data-testid":`met-project-checkbox-${R4($f.projectPath)}`}),b("button",{type:"button",className:"met-inline-link project-path",onClick:(xf)=>{xf.stopPropagation(),Z($f)}},h.name)),b("span",null,$f.useModel||"--"),b("span",null,$f.epochTrain??"--"),b("span",null,x$($f.progress?.progressPercent)),b("span",null,C4($f.progress?.epochPerHour)))}let yf=ff(h.path,h.depth);return b(h$.default.Fragment,{key:h.path},b("div",{className:"met-tree-row folder",style:{paddingLeft:g},"data-testid":`met-project-folder-${R4(h.path)}`},b("button",{type:"button",className:"met-tree-toggle",onClick:()=>n(h.path,h.depth),"aria-label":yf?`折叠 ${h.path}`:`展开 ${h.path}`},yf?"-":"+"),b("strong",null,h.name),b("span",{className:"met-tree-count"},`${h.count} projects`)),yf?h.children.map(($f)=>lf($f)):null)}function Gf(h){return b("div",{className:"met-detail-kv"},h.map((g)=>b("div",{key:g.label,className:"met-detail-kv-item"},b("span",null,g.label),b("strong",null,b$(g.value)),g.hint?b("small",null,g.hint):null)))}function zf(h,g){return b("div",{className:"met-detail-section"},b("h3",null,h),Gf(g))}function jf(h){if(!Array.isArray(h)||h.length===0)return b(l_,{title:"模型层未上报",text:"等待 data/model_info.json 或 compute_analysis.json 生成。"});return b("div",{className:"table-wrap met-layer-table"},b("table",null,b("thead",null,b("tr",null,b("th",null,"Layer"),b("th",null,"Type"),b("th",null,"Params"),b("th",null,"Trainable"),b("th",null,"Compute"))),b("tbody",null,h.slice(0,18).map((g,I)=>b("tr",{key:`${g.name||"layer"}-${I}`},b("td",null,g.name||`#${I+1}`),b("td",null,g.type||"--"),b("td",null,Xj(g.num_params)),b("td",null,g.trainable===void 0?"--":String(Boolean(g.trainable))),b("td",null,Xj(g.compute?.total??g.estimated_cost?.weighted_units?.total)))))))}function Wf(h){let g=Array.isArray(h)?h:[];if(g.length===0)return b(l_,{title:"data/ 暂无文件",text:"训练或评估完成后会生成 training_state、metrics、model_info 等文件。"});return b("div",{className:"met-file-chip-grid"},g.slice(0,48).map((I)=>b("span",{key:I},I)),g.length>48?b("span",null,`+${g.length-48}`):null)}function Vf(h){let g=String(h||"").replace(/\x1b\[[0-9;]*[A-Za-z]/g,"").split(/\r?\n/).map((I)=>I.trim()).filter(Boolean).slice(-12);if(g.length===0)return b(l_,{title:"暂无日志尾部",text:"该任务未上报 logTail 或日志已轮转。"});return b("div",{className:"met-log-lines"},g.map((I,yf)=>b("div",{key:`${yf}-${I.slice(0,16)}`},I)))}function Kf(){if(j.loading)return b("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},b(l_,{title:"详情加载中",text:j.title||"正在读取 D601 data/ 和 config.json"}));if(j.error)return b("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},b(H0,{error:j.error,wide:!0}));if(!j.data)return b("section",{className:"met-detail-panel muted","data-testid":"met-detail-panel"},b(l_,{title:"选择一个项目或任务查看详情",text:"项目库、当前队列、已完成和失败诊断中的行都可以点击;默认只展示结构化字段,原始 JSON 需显式点击按钮。"}));let h=VN(j),g=EN(j),I=Lu(h.config),yf=Lu(h.progress||g.progress),$f=Lu(h.data),Qf=Lu(h.metrics||$f.metrics||yf.trainingInfo?.evaluation_metrics),Yf=Lu($f.trainingInfo||yf.trainingInfo),xf=Lu($f.trainingState),tf=Lu(h.model||$f.model),j0=Array.isArray(tf.modelSummary)&&tf.modelSummary.length>0?tf.modelSummary:tf.computeLayers,u0=Lu(Yf.evaluation_metrics),D0=j.kind==="job"?"训练任务详情":"Project 详情";return b("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},b("div",{className:"panel-head compact"},b("div",null,b("p",{className:"panel-eyebrow"},j.kind==="job"?"Job + Project Detail":"Project Library Detail"),b("h2",null,D0),b("code",null,h.projectPath||g.projectPath||j.title)),b("div",{className:"panel-actions"},b(c3,{title:`MET ${D0}`,data:j.data,onOpen:u,testId:"raw-met-detail"}))),j.kind==="job"?zf("任务状态",[{label:"Job ID",value:g.id},{label:"状态",value:dz(g.status)},{label:"GPU",value:g.gpuName},{label:"Exit Code",value:g.exitCode},{label:"耗时",value:oz(g)},{label:"训练速度",value:C4(az({...g,progress:yf}))}]):null,zf("config.json",[{label:"use_model",value:I.use_model},{label:"epoch_train",value:I.epoch_train},{label:"step_per_epoch",value:I.step_per_epoch},{label:"learning_rate",value:I.learning_rate},{label:"using_gpu",value:I.using_gpu},{label:"use_points",value:I.use_points},{label:"sample_rate",value:I.sample_rate},{label:"time_clipped_s",value:I.time_clipped_s},{label:"H_UNITS",value:I.H_UNITS},{label:"INNER_KAN_UNITS",value:I.INNER_KAN_UNITS},{label:"INNER_KAN_LAYERS",value:I.INNER_KAN_LAYERS},{label:"GRID_SIZE",value:I.GRID_SIZE},{label:"SPLINE_ORDER",value:I.SPLINE_ORDER},{label:"USE_FAST_MODEL",value:I.USE_FAST_MODEL},{label:"IIR_TRAINABLE",value:I.IIR_TRAINABLE}]),zf("data/ 训练状态",[{label:"Epoch",value:`${yf.currentEpoch??xf.current_epoch??xf.completed_epoch??"--"} / ${yf.epochTarget??I.epoch_train??"--"}`},{label:"Progress",value:x$(yf.progressPercent)},{label:"Last Loss",value:yf.lastLoss??xf.loss},{label:"Last Val Loss",value:yf.lastValLoss??xf.val_loss},{label:"Min Loss",value:Yf.min_loss??xf.min_loss},{label:"Min Val Loss",value:Yf.min_val_loss??xf.min_val_loss},{label:"Log Lines",value:yf.logLineCount},{label:"ETA",value:Oj(yf.etaSeconds??xf.remaining_time)},{label:"训练速度",value:C4(yf.epochPerHour??xf.smoothed_speed)},{label:"Training Alive",value:xf.training_alive}]),zf("模型参数",[{label:"Model Type",value:tf.modelType??I.use_model},{label:"Total Params",value:tf.totalParams,hint:tf.totalParams===null||tf.totalParams===void 0?"未上报":"data/model_info.json"},{label:"Trainable",value:tf.trainableParams},{label:"Non-trainable",value:tf.nonTrainableParams},{label:"Compute Cost",value:tf.computeCost},{label:"Estimate Status",value:tf.estimateStatus},{label:"Unsupported Layers",value:tf.unsupportedLayerCount}]),zf("指标",[{label:"train_loss",value:Qf.train_loss??u0.train_loss},{label:"val_loss",value:Qf.val_loss??u0.val_loss},{label:"train_mae",value:Qf.train_mae??u0.train_mae},{label:"val_mae",value:Qf.val_mae??u0.val_mae},{label:"train_afmae",value:Qf.train_afmae??u0.train_afmae},{label:"val_afmae",value:Qf.val_afmae??u0.val_afmae},{label:"freq_drift_hz",value:Qf.freq_drift_hz},{label:"sens_drift_percent",value:Qf.sens_drift_percent},{label:"linearity_percent",value:Qf.linearity_percent},{label:"weights_source",value:Qf.weights_source??u0.weights_source},{label:"lr min/mean/max",value:`${b$(Yf.learning_rate_min)} / ${b$(Yf.learning_rate_mean)} / ${b$(Yf.learning_rate_max)}`}]),b("div",{className:"met-detail-section"},b("h3",null,"模型层"),jf(j0)),b("div",{className:"met-detail-section"},b("h3",null,"data/ 文件"),Wf($f.files)),j.kind==="job"?b("div",{className:"met-detail-section"},b("h3",null,"日志尾部"),Vf(Lu(j.data).logTail)):null)}return b("div",{className:"met-page","data-testid":"met-nonlinear-page"},b(Ej,{title:"MET Nonlinear 训练编排",eyebrow:"D601 GPU 用户服务",actions:b("div",{className:"panel-actions"},b("button",{type:"button",className:"ghost-btn",onClick:z,disabled:l.loading,"data-testid":"met-refresh-button"},l.loading?"刷新中":"刷新"),b(c3,{title:"MET Nonlinear 用户服务",data:y,onOpen:u,testId:"raw-met-service"}))},b("div",{className:"findjob-hero"},b("div",null,b("div",{className:"node-version-line"},b(v$,{status:L.providerStatus==="online"?"online":"warn"},L.providerStatus||"unknown"),b("span",null,y.providerId),b("span",null,N.public?"公网暴露":"仅 UniDesk frontend 代理访问")),b("p",{className:"muted paragraph"},y.description)),b("div",{className:"microservice-ref-card"},b("span",null,"Repo"),b("strong",null,M.url||"--"),b("code",null,M.commitId||"--")),b("div",{className:"microservice-ref-card"},b("span",null,"D601 Docker"),b("strong",null,`${N.nodeBindHost||"--"}:${N.nodePort||"--"}`),b("code",null,`${M.composeFile||"--"} / ${M.containerName||"--"}`))),b(H0,{error:l.error,wide:!0}),F.actionMessage?b("div",{className:"met-action-log","data-testid":"met-action-message"},F.actionMessage):null),b("div",{className:"met-grid"},b(Ej,{title:"核心状态",eyebrow:l.refreshedAt?`Updated ${AN(l.refreshedAt)}`:"Queue + GPU"},b("div",{className:"metric-grid"},b(I_,{label:"Staged",value:w.staged??0,hint:"加入队列未开始",tone:Number(w.staged||0)>0?"warn":""}),b(I_,{label:"Queued",value:w.queued??0,hint:"排队等待调度",tone:Number(w.queued||0)>0?"warn":""}),b(I_,{label:"Running",value:w.running??0,hint:`max ${l.summary?.queue?.maxConcurrency??l.queue?.queue?.maxConcurrency??"--"}`,tone:Number(w.running||0)>0?"ok":""}),b(I_,{label:"Succeeded",value:w.succeeded??0,hint:"已完成"}),b(I_,{label:"Failed",value:w.failed??0,hint:"需要诊断",tone:Number(w.failed||0)>0?"warn":""}),b(I_,{label:"2080Ti Free",value:p?x$(Number(p.freeRatio)*100):"--",hint:p?`${p.memoryFreeMiB}/${p.memoryTotalMiB} MiB`:"等待 GPU 上报"}),b(I_,{label:"ML Image",value:x.present?"READY":"MISSING",hint:x.image||"met-nonlinear-ml:tf26",tone:x.present?"ok":"warn"}),b(I_,{label:"Health",value:l.health?.ok?"OK":"--",hint:"D601 /health"}))),b(Ej,{title:"队列控制",eyebrow:"Downloader-like staging"},b("div",{className:"met-control-strip"},b("label",null,"最大并发",b("input",{type:"number",min:1,max:16,value:F.maxConcurrency,"data-testid":"met-max-concurrency-input",onChange:(h)=>U({maxConcurrency:h.target.value})})),b("label",null,"目标 GPU",b("input",{value:F.targetGpuName,"data-testid":"met-target-gpu-input",onChange:(h)=>U({targetGpuName:h.target.value})})),b("button",{type:"button",className:"ghost-btn",onClick:K,disabled:l.actionBusy,"data-testid":"met-save-settings-button"},"保存设置"),b("button",{type:"button",className:"primary-btn",onClick:G,disabled:l.actionBusy||Number(w.staged||0)===0,"data-testid":"met-start-queue-button"},"启动队列")),b("p",{className:"muted paragraph"},"Project 先进入待启动队列,不会立即训练;点击启动队列后才切换为排队中,并由 D601 scheduler 按最大并发和 2080Ti 显存策略调度。")),b("section",{className:"panel met-workspace"},b("div",{className:"met-tabs",role:"tablist"},m.map((h)=>b("button",{key:h.id,type:"button",className:F.activeTab===h.id?"active":"",onClick:()=>U({activeTab:h.id}),"data-testid":`met-tab-${h.id}`},`${h.label} ${h.count}`))),b("div",{className:"panel-body"},F.activeTab==="projects"?b("div",{className:"met-form-grid","data-testid":"met-projects-pane"},b("div",{className:"met-fork-card"},b("h3",null,"Fork Project"),b("label",null,"源 Project",b("select",{value:T,"data-testid":"met-source-project-select",onChange:(h)=>U({sourceProject:h.target.value})},P.map((h)=>b("option",{key:h.projectPath,value:h.projectPath},`${h.projectPath} · ${h.useModel||"model?"}`)))),b("label",null,"Fork 数量",b("input",{type:"number",min:1,max:100,value:F.forkCount,"data-testid":"met-fork-count-input",onChange:(h)=>U({forkCount:h.target.value})})),b("label",null,"训练轮数",b("input",{type:"number",min:1,max:1e5,value:F.forkEpochs,"data-testid":"met-fork-epochs-input",onChange:(h)=>U({forkEpochs:h.target.value})})),b("label",null,"目标前缀",b("input",{value:F.forkPrefix,"data-testid":"met-fork-prefix-input",onChange:(h)=>U({forkPrefix:h.target.value})})),b("button",{type:"button",className:"primary-btn",onClick:O,disabled:l.actionBusy||!T,"data-testid":"met-fork-button"},"Fork Project"),b("p",{className:"muted paragraph"},"Fork 只创建新 Project 并自动勾选,不会直接训练;需要在右侧确认后加入待启动队列。")),b("div",{className:"met-project-list"},b("div",{className:"panel-head compact"},b("div",null,b("p",{className:"panel-eyebrow"},`Existing Projects · ${(l.projects?.roots||[]).map((h)=>`${h.root} ${h.count}`).join(" / ")}`),b("h2",null,"选择已有 Project")),b("button",{type:"button",className:"ghost-btn",onClick:V,disabled:l.actionBusy||q().length===0,"data-testid":"met-stage-selected-button"},`加入待启动队列 (${q().length})`)),P.length===0?b(l_,{title:"暂无 project",text:"等待 D601 返回 /api/projects"}):b("div",{className:"met-project-table","data-testid":"met-project-tree"},b("div",{className:"met-tree-header"},b("span",null,"文件树 Project"),b("span",null,"Model"),b("span",null,"Epochs"),b("span",null,"Progress"),b("span",null,"速度")),D.children.map((h)=>lf(h)))),Kf()):null,F.activeTab==="current"?b("div",{"data-testid":"met-current-pane"},o(),c(S,"current"),Kf(),b("div",{className:"panel-actions inline-actions"},b(c3,{title:"MET Queue",data:l.queue,onOpen:u,testId:"raw-met-queue"}))):null,F.activeTab==="completed"?b("div",{"data-testid":"met-completed-pane"},c(r.length>0?r:v.filter((h)=>h.status==="succeeded"),"completed"),Kf()):null,F.activeTab==="failed"?b("div",{"data-testid":"met-failed-pane"},c(Y.length>0?Y:v.filter((h)=>["failed","canceled"].includes(h.status)),"failed"),Kf(),b("div",{className:"panel-actions inline-actions"},b(c3,{title:"MET History",data:l.history,onOpen:u,testId:"raw-met-history"}))):null,F.activeTab==="gpu"?b("div",{className:"met-gpu-pane","data-testid":"met-gpu-pane"},R.length===0?b(l_,{title:"暂无 GPU 上报",text:"等待 D601 met-nonlinear-ts 或 ML image 提供 nvidia-smi 数据"}):b("div",{className:"table-wrap"},b("table",null,b("thead",null,b("tr",null,b("th",null,"Index"),b("th",null,"Name"),b("th",null,"Free"),b("th",null,"Policy"))),b("tbody",null,R.map((h)=>b("tr",{key:h.index},b("td",null,h.index),b("td",null,h.name),b("td",null,`${h.memoryFreeMiB} / ${h.memoryTotalMiB} MiB`,b("div",{className:"met-progress"},b("span",{style:{width:x$(Number(h.freeRatio)*100)}}))),b("td",null,String(h.name||"").includes("2080")?"target 2080Ti, <20% 限制并发":"non-target")))))),b("div",{className:"panel-actions inline-actions"},b(c3,{title:"MET Images",data:l.images,onOpen:u,testId:"raw-met-images"}))):null))))}var b4=[{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:"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:"codex-queue",label:"Codex Queue"},{id:"project-manager",label:"Project Manager"}]},{id:"config",label:"系统配置",code:"CFG",tabs:[{id:"topology",label:"连接拓扑"},{id:"auth",label:"认证策略"},{id:"security",label:"安全边界"}]}],p3=Object.fromEntries(b4.map((f)=>[f.id,f.tabs[0]?.id??""]));function ON(f){let u=String(f||"").trim();if(!u)return"";try{return decodeURIComponent(u)}catch{return u}}function v4(f){let u=String(f||"/"),[_]=u.split(/[?#]/u,1);if(_==="/")return"/";let l=`/${_.split("/").map(ON).filter(Boolean).join("/")}`;return l.endsWith("/")?l:`${l}/`}function XN(f){let u=2166136261;for(let _ of f)u^=_.charCodeAt(0),u=Math.imul(u,16777619);return Math.abs(u>>>0).toString(36)}function Nj(f){return String(f||"").normalize("NFKD").replace(/[\u0300-\u036f]/gu,"").toLowerCase().replace(/[^a-z0-9]+/gu,"-").replace(/^-+|-+$/gu,"")}function uG(f){return String(f||"").trim().toLowerCase().replace(/[\s/\\?#%]+/gu,"-").replace(/-+/gu,"-").replace(/^-+|-+$/gu,"")}function _G(f){let u=Nj(f.routeSegment||"")||uG(f.routeSegment||"");if(u)return u;let _=Nj(f.id||"");if(_)return _;let y=Nj(f.label||"")||uG(f.label||"");if(y)return y;return`route-${XN(JSON.stringify(f))}`}function Lj(f,u){return`${f}:${u}`}function yG(f){let u=f.map((F)=>{let Q=_G(F);return{...F,routeSegment:Q,tabs:F.tabs.map((U)=>({...U,routeSegment:_G(U)}))}}),_={},y={},l={},$=u.map((F)=>{let Q=F.tabs[0]?.id??"";l[F.id]=Q;let U=F.tabs.map((K)=>{let q=`/${F.routeSegment}/${K.routeSegment}/`,V=[q],O={moduleId:F.id,tabId:K.id};for(let G of V)_[v4(G)]=O;return y[Lj(F.id,K.id)]=q,{...K,canonicalPath:q,aliases:V}}),z=`/${F.routeSegment}/`,W={moduleId:F.id,tabId:Q};return _[v4(z)]=W,{...F,routeSegment:F.routeSegment,canonicalPath:z,tabs:U}}),j=$[0],J={moduleId:j?.id||"",tabId:j?.tabs[0]?.id||""};return _["/"]=J,{modules:$,moduleById:Object.fromEntries($.map((F)=>[F.id,F])),defaultActiveTabs:l,routeMap:_,canonicalPathByTarget:y,fallbackTarget:J}}function Yj(f,u){return f.routeMap[v4(u)]||f.fallbackTarget}function I$(f,u,_){return f.canonicalPathByTarget[Lj(u,_)]||f.canonicalPathByTarget[Lj(f.fallbackTarget.moduleId,f.fallbackTarget.tabId)]||"/"}function lG(f,u){let _=f.routeMap[v4(u)];if(!_)return null;return I$(f,_.moduleId,_.tabId)}var fy=Sf(I0(),1);var t=Sf(FG(),1),d=Sf(I0(),1);function Y0(f){if(typeof f==="string"||typeof f==="number")return""+f;let u="";if(Array.isArray(f)){for(let _=0,y;_{}};function QG(){for(var f=0,u=arguments.length,_={},y;f=0)y=_.slice(l+1),_=_.slice(0,l);if(_&&!u.hasOwnProperty(_))throw Error("unknown type: "+_);return{type:_,name:y}})}I4.prototype=QG.prototype={constructor:I4,on:function(f,u){var _=this._,y=MN(f+"",_),l,$=-1,j=y.length;if(arguments.length<2){while(++$0)for(var _=Array(l),y=0,l,$;y=0&&(u=f.slice(0,_))!=="xmlns")f=f.slice(_+1);return Bj.hasOwnProperty(u)?{space:Bj[u],local:f}:f}function wj(f){let u;while(u=f.sourceEvent)f=u;return f}function $u(f,u){if(f=wj(f),u===void 0)u=f.currentTarget;if(u){var _=u.ownerSVGElement||u;if(_.createSVGPoint){var y=_.createSVGPoint();return y.x=f.clientX,y.y=f.clientY,y=y.matrixTransform(u.getScreenCTM().inverse()),[y.x,y.y]}if(u.getBoundingClientRect){var l=u.getBoundingClientRect();return[f.clientX-l.left-u.clientLeft,f.clientY-l.top-u.clientTop]}}return[f.pageX,f.pageY]}function SN(){}function c_(f){return f==null?SN:function(){return this.querySelector(f)}}function Dj(f){if(typeof f!=="function")f=c_(f);for(var u=this._groups,_=u.length,y=Array(_),l=0;l<_;++l)for(var $=u[l],j=$.length,J=y[l]=Array(j),F,Q,U=0;U=Z)Z=H+1;while(!(L=O[Z])&&++Z=0;)if(j=y[l]){if($&&j.compareDocumentPosition($)^4)$.parentNode.insertBefore(j,$);$=j}return this}function cj(f){if(!f)f=iN;function u(z,W){return z&&W?f(z.__data__,W.__data__):!z-!W}for(var _=this._groups,y=_.length,l=Array(y),$=0;$u?1:f>=u?0:NaN}function pj(){var f=arguments[0];return arguments[0]=this,f.apply(null,arguments),this}function mj(){return Array.from(this)}function kj(){for(var f=this._groups,u=0,_=f.length;u<_;++u)for(var y=f[u],l=0,$=y.length;l<$;++l){var j=y[l];if(j)return j}return null}function ij(){let f=0;for(let u of this)++f;return f}function gj(){return!this.node()}function nj(f){for(var u=this._groups,_=0,y=u.length;_1?this.each((u==null?dN:typeof u==="function"?fL:eN)(f,u,_==null?"":_)):p_(this.node(),f)}function p_(f,u){return f.style.getPropertyValue(u)||m$(f).getComputedStyle(f,null).getPropertyValue(u)}function uL(f){return function(){delete this[f]}}function _L(f,u){return function(){this[f]=u}}function yL(f,u){return function(){var _=u.apply(this,arguments);if(_==null)delete this[f];else this[f]=_}}function oj(f,u){return arguments.length>1?this.each((u==null?uL:typeof u==="function"?yL:_L)(f,u)):this.node()[f]}function UG(f){return f.trim().split(/^|\s+/)}function aj(f){return f.classList||new WG(f)}function WG(f){this._node=f,this._names=UG(f.getAttribute("class")||"")}WG.prototype={add:function(f){var u=this._names.indexOf(f);if(u<0)this._names.push(f),this._node.setAttribute("class",this._names.join(" "))},remove:function(f){var u=this._names.indexOf(f);if(u>=0)this._names.splice(u,1),this._node.setAttribute("class",this._names.join(" "))},contains:function(f){return this._names.indexOf(f)>=0}};function zG(f,u){var _=aj(f),y=-1,l=u.length;while(++y=0)_=u.slice(y+1),u=u.slice(0,y);return{type:u,name:_}})}function NL(f){return function(){var u=this.__on;if(!u)return;for(var _=0,y=-1,l=u.length,$;_()=>f;function n$(f,{sourceEvent:u,subject:_,target:y,identifier:l,active:$,x:j,y:J,dx:F,dy:Q,dispatch:U}){Object.defineProperties(this,{type:{value:f,enumerable:!0,configurable:!0},sourceEvent:{value:u,enumerable:!0,configurable:!0},subject:{value:_,enumerable:!0,configurable:!0},target:{value:y,enumerable:!0,configurable:!0},identifier:{value:l,enumerable:!0,configurable:!0},active:{value:$,enumerable:!0,configurable:!0},x:{value:j,enumerable:!0,configurable:!0},y:{value:J,enumerable:!0,configurable:!0},dx:{value:F,enumerable:!0,configurable:!0},dy:{value:Q,enumerable:!0,configurable:!0},_:{value:U}})}n$.prototype.on=function(){var f=this._.on.apply(this._,arguments);return f===this._?this:f};function RL(f){return!f.ctrlKey&&!f.button}function xL(){return this.parentNode}function vL(f,u){return u==null?{x:f.x,y:f.y}:u}function bL(){return navigator.maxTouchPoints||"ontouchstart"in this}function t$(){var f=RL,u=xL,_=vL,y=bL,l={},$=Ry("start","drag","end"),j=0,J,F,Q,U,z=0;function W(E){E.on("mousedown.drag",K).filter(y).on("touchstart.drag",O).on("touchmove.drag",G,qG).on("touchend.drag touchcancel.drag",H).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function K(E,L){if(U||!f.call(this,E,L))return;var M=Z(this,u.call(this,E,L),E,L,"mouse");if(!M)return;C0(E.view).on("mousemove.drag",q,xy).on("mouseup.drag",V,xy),i3(E.view),m4(E),Q=!1,J=E.clientX,F=E.clientY,M("start",E)}function q(E){if(j_(E),!Q){var L=E.clientX-J,M=E.clientY-F;Q=L*L+M*M>z}l.mouse("drag",E)}function V(E){C0(E.view).on("mousemove.drag mouseup.drag",null),i$(E.view,Q),j_(E),l.mouse("end",E)}function O(E,L){if(!f.call(this,E,L))return;var M=E.changedTouches,N=u.call(this,E,L),w=M.length,R,p;for(R=0;R>8&15|u>>4&240,u>>4&15|u&240,(u&15)<<4|u&15,1):_===8?k4(u>>24&255,u>>16&255,u>>8&255,(u&255)/255):_===4?k4(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=IL.exec(f))?new Yu(u[1],u[2],u[3],1):(u=cL.exec(f))?new Yu(u[1]*255/100,u[2]*255/100,u[3]*255/100,1):(u=pL.exec(f))?k4(u[1],u[2],u[3],u[4]):(u=mL.exec(f))?k4(u[1]*255/100,u[2]*255/100,u[3]*255/100,u[4]):(u=kL.exec(f))?LG(u[1],u[2]/100,u[3]/100,1):(u=iL.exec(f))?LG(u[1],u[2]/100,u[3]/100,u[4]):HG.hasOwnProperty(f)?OG(HG[f]):f==="transparent"?new Yu(NaN,NaN,NaN,0):null}function OG(f){return new Yu(f>>16&255,f>>8&255,f&255,1)}function k4(f,u,_,y){if(y<=0)f=u=_=NaN;return new Yu(f,u,_,y)}function tL(f){if(!(f instanceof d$))f=V1(f);if(!f)return new Yu;return f=f.rgb(),new Yu(f.r,f.g,f.b,f.opacity)}function n3(f,u,_,y){return arguments.length===1?tL(f):new Yu(f,u,_,y==null?1:y)}function Yu(f,u,_,y){this.r=+f,this.g=+u,this.b=+_,this.opacity=+y}s$(Yu,n3,WJ(d$,{brighter(f){return f=f==null?g4:Math.pow(g4,f),new Yu(this.r*f,this.g*f,this.b*f,this.opacity)},darker(f){return f=f==null?o$:Math.pow(o$,f),new Yu(this.r*f,this.g*f,this.b*f,this.opacity)},rgb(){return this},clamp(){return new Yu(by(this.r),by(this.g),by(this.b),n4(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:XG,formatHex:XG,formatHex8:sL,formatRgb:NG,toString:NG}));function XG(){return`#${vy(this.r)}${vy(this.g)}${vy(this.b)}`}function sL(){return`#${vy(this.r)}${vy(this.g)}${vy(this.b)}${vy((isNaN(this.opacity)?1:this.opacity)*255)}`}function NG(){let f=n4(this.opacity);return`${f===1?"rgb(":"rgba("}${by(this.r)}, ${by(this.g)}, ${by(this.b)}${f===1?")":`, ${f})`}`}function n4(f){return isNaN(f)?1:Math.max(0,Math.min(1,f))}function by(f){return Math.max(0,Math.min(255,Math.round(f)||0))}function vy(f){return f=by(f),(f<16?"0":"")+f.toString(16)}function LG(f,u,_,y){if(y<=0)f=u=_=NaN;else if(_<=0||_>=1)f=u=NaN;else if(u<=0)f=NaN;return new H1(f,u,_,y)}function BG(f){if(f instanceof H1)return new H1(f.h,f.s,f.l,f.opacity);if(!(f instanceof d$))f=V1(f);if(!f)return new H1;if(f instanceof H1)return f;f=f.rgb();var u=f.r/255,_=f.g/255,y=f.b/255,l=Math.min(u,_,y),$=Math.max(u,_,y),j=NaN,J=$-l,F=($+l)/2;if(J){if(u===$)j=(_-y)/J+(_0&&F<1?0:j;return new H1(j,J,F,f.opacity)}function wG(f,u,_,y){return arguments.length===1?BG(f):new H1(f,u,_,y==null?1:y)}function H1(f,u,_,y){this.h=+f,this.s=+u,this.l=+_,this.opacity=+y}s$(H1,wG,WJ(d$,{brighter(f){return f=f==null?g4:Math.pow(g4,f),new H1(this.h,this.s,this.l*f,this.opacity)},darker(f){return f=f==null?o$:Math.pow(o$,f),new H1(this.h,this.s,this.l*f,this.opacity)},rgb(){var f=this.h%360+(this.h<0)*360,u=isNaN(f)||isNaN(this.s)?0:this.s,_=this.l,y=_+(_<0.5?_:1-_)*u,l=2*_-y;return new Yu(zJ(f>=240?f-240:f+120,l,y),zJ(f,l,y),zJ(f<120?f+240:f-120,l,y),this.opacity)},clamp(){return new H1(YG(this.h),i4(this.s),i4(this.l),n4(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 f=n4(this.opacity);return`${f===1?"hsl(":"hsla("}${YG(this.h)}, ${i4(this.s)*100}%, ${i4(this.l)*100}%${f===1?")":`, ${f})`}`}}));function YG(f){return f=(f||0)%360,f<0?f+360:f}function i4(f){return Math.max(0,Math.min(1,f||0))}function zJ(f,u,_){return(f<60?u+(_-u)*f/60:f<180?_:f<240?u+(_-u)*(240-f)/60:u)*255}function GJ(f,u,_,y,l){var $=f*f,j=$*f;return((1-3*f+3*$-j)*u+(4-6*$+3*j)*_+(1+3*f+3*$-3*j)*y+j*l)/6}function KJ(f){var u=f.length-1;return function(_){var y=_<=0?_=0:_>=1?(_=1,u-1):Math.floor(_*u),l=f[y],$=f[y+1],j=y>0?f[y-1]:2*l-$,J=y()=>f;function aL(f,u){return function(_){return f+_*u}}function dL(f,u,_){return f=Math.pow(f,_),u=Math.pow(u,_)-f,_=1/_,function(y){return Math.pow(f+y*u,_)}}function DG(f){return(f=+f)===1?s4:function(u,_){return _-u?dL(u,_,f):e$(isNaN(u)?_:u)}}function s4(f,u){var _=u-f;return _?aL(f,_):e$(isNaN(f)?u:f)}var hy=function f(u){var _=DG(u);function y(l,$){var j=_((l=n3(l)).r,($=n3($)).r),J=_(l.g,$.g),F=_(l.b,$.b),Q=s4(l.opacity,$.opacity);return function(U){return l.r=j(U),l.g=J(U),l.b=F(U),l.opacity=Q(U),l+""}}return y.gamma=f,y}(1);function TG(f){return function(u){var _=u.length,y=Array(_),l=Array(_),$=Array(_),j,J;for(j=0;j<_;++j)J=n3(u[j]),y[j]=J.r||0,l[j]=J.g||0,$[j]=J.b||0;return y=f(y),l=f(l),$=f($),J.opacity=1,function(F){return J.r=y(F),J.g=l(F),J.b=$(F),J+""}}}var eL=TG(KJ),fY=TG(ZJ);function qJ(f,u){if(!u)u=[];var _=f?Math.min(u.length,f.length):0,y=u.slice(),l;return function($){for(l=0;l<_;++l)y[l]=f[l]*(1-$)+u[l]*$;return y}}function MG(f){return ArrayBuffer.isView(f)&&!(f instanceof DataView)}function rG(f,u){var _=u?u.length:0,y=f?Math.min(_,f.length):0,l=Array(y),$=Array(_),j;for(j=0;j_)if($=u.slice(_,$),J[j])J[j]+=$;else J[++j]=$;if((y=y[0])===(l=l[0]))if(J[j])J[j]+=l;else J[++j]=l;else J[++j]=null,F.push({i:j,x:ju(y,l)});_=EJ.lastIndex}if(_180)U+=360;else if(U-Q>180)Q+=360;W.push({i:z.push(l(z)+"rotate(",null,y)-2,x:ju(Q,U)})}else if(U)z.push(l(z)+"rotate("+U+y)}function J(Q,U,z,W){if(Q!==U)W.push({i:z.push(l(z)+"skewX(",null,y)-2,x:ju(Q,U)});else if(U)z.push(l(z)+"skewX("+U+y)}function F(Q,U,z,W,K,q){if(Q!==z||U!==W){var V=K.push(l(K)+"scale(",null,",",null,")");q.push({i:V-4,x:ju(Q,z)},{i:V-2,x:ju(U,W)})}else if(z!==1||W!==1)K.push(l(K)+"scale("+z+","+W+")")}return function(Q,U){var z=[],W=[];return Q=f(Q),U=f(U),$(Q.translateX,Q.translateY,U.translateX,U.translateY,z,W),j(Q.rotate,U.rotate,z,W),J(Q.skewX,U.skewX,z,W),F(Q.scaleX,Q.scaleY,U.scaleX,U.scaleY,z,W),Q=U=null,function(K){var q=-1,V=W.length,O;while(++q=0)f._call.call(void 0,u);f=f._next}--s3}function IG(){cy=(f5=y6.now())+u5,s3=u6=0;try{mG()}finally{s3=0,EY(),cy=0}}function VY(){var f=y6.now(),u=f-f5;if(u>cG)u5-=u,f5=f}function EY(){var f,u=e4,_,y=1/0;while(u)if(u._call){if(y>u._time)y=u._time;f=u,u=u._next}else _=u._next,u._next=null,u=f?f._next=_:e4=_;_6=f,LJ(y)}function LJ(f){if(s3)return;if(u6)u6=clearTimeout(u6);var u=f-cy;if(u>24){if(f<1/0)u6=setTimeout(IG,f-y6.now()-u5);if(f6)f6=clearInterval(f6)}else{if(!f6)f5=y6.now(),f6=setInterval(VY,cG);s3=1,pG(IG)}}function j6(f,u,_){var y=new l6;return u=u==null?0:+u,y.restart((l)=>{y.stop(),f(l+u)},u,_),y}var XY=Ry("start","end","cancel","interrupt"),NY=[],gG=0,kG=1,l5=2,y5=3,iG=4,$5=5,J6=6;function J_(f,u,_,y,l,$){var j=f.__transition;if(!j)f.__transition={};else if(_ in j)return;LY(f,_,{name:u,index:y,group:l,on:XY,tween:NY,time:$.time,delay:$.delay,duration:$.duration,ease:$.ease,timer:null,state:gG})}function F6(f,u){var _=R0(f,u);if(_.state>gG)throw Error("too late; already scheduled");return _}function o0(f,u){var _=R0(f,u);if(_.state>y5)throw Error("too late; already running");return _}function R0(f,u){var _=f.__transition;if(!_||!(_=_[u]))throw Error("transition not found");return _}function LY(f,u,_){var y=f.__transition,l;y[u]=_,_.timer=_5($,0,_.time);function $(Q){if(_.state=kG,_.timer.restart(j,_.delay,_.time),_.delay<=Q)j(Q-_.delay)}function j(Q){var U,z,W,K;if(_.state!==kG)return F();for(U in y){if(K=y[U],K.name!==_.name)continue;if(K.state===y5)return j6(j);if(K.state===iG)K.state=J6,K.timer.stop(),K.on.call("interrupt",f,f.__data__,K.index,K.group),delete y[U];else if(+Ul5&&y.state<$5,y.state=J6,y.timer.stop(),y.on.call(l?"interrupt":"cancel",f,f.__data__,y.index,y.group),delete _[j]}if($)delete f.__transition}function YJ(f){return this.each(function(){m_(this,f)})}function YY(f,u){var _,y;return function(){var l=o0(this,f),$=l.tween;if($!==_){y=_=$;for(var j=0,J=y.length;j=0)u=u.slice(0,_);return!u||u==="start"})}function kY(f,u,_){var y,l,$=mY(u)?F6:o0;return function(){var j=$(this,f),J=j.on;if(J!==y)(l=(y=J).copy()).on(u,_);j.on=l}}function RJ(f,u){var _=this._id;return arguments.length<2?R0(this.node(),_).on.on(f):this.each(kY(_,f,u))}function iY(f){return function(){var u=this.parentNode;for(var _ in this.__transition)if(+_!==f)return;if(u)u.removeChild(this)}}function xJ(){return this.on("end.remove",iY(this._id))}function vJ(f){var u=this._name,_=this._id;if(typeof f!=="function")f=c_(f);for(var y=this._groups,l=y.length,$=Array(l),j=0;j()=>f;function nJ(f,{sourceEvent:u,target:_,transform:y,dispatch:l}){Object.defineProperties(this,{type:{value:f,enumerable:!0,configurable:!0},sourceEvent:{value:u,enumerable:!0,configurable:!0},target:{value:_,enumerable:!0,configurable:!0},transform:{value:y,enumerable:!0,configurable:!0},_:{value:l}})}function E1(f,u,_){this.k=f,this.x=u,this.y=_}E1.prototype={constructor:E1,scale:function(f){return f===1?this:new E1(this.k*f,this.x,this.y)},translate:function(f,u){return f===0&u===0?this:new E1(this.k,this.x+this.k*f,this.y+this.k*u)},apply:function(f){return[f[0]*this.k+this.x,f[1]*this.k+this.y]},applyX:function(f){return f*this.k+this.x},applyY:function(f){return f*this.k+this.y},invert:function(f){return[(f[0]-this.x)/this.k,(f[1]-this.y)/this.k]},invertX:function(f){return(f-this.x)/this.k},invertY:function(f){return(f-this.y)/this.k},rescaleX:function(f){return f.copy().domain(f.range().map(this.invertX,this).map(f.invert,f))},rescaleY:function(f){return f.copy().domain(f.range().map(this.invertY,this).map(f.invert,f))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var py=new E1(1,0,0);U6.prototype=E1.prototype;function U6(f){while(!f.__zoom)if(!(f=f.parentNode))return py;return f.__zoom}function Z5(f){f.stopImmediatePropagation()}function my(f){f.preventDefault(),f.stopImmediatePropagation()}function JB(f){return(!f.ctrlKey||f.type==="wheel")&&!f.button}function FB(){var f=this;if(f instanceof SVGElement){if(f=f.ownerSVGElement||f,f.hasAttribute("viewBox"))return f=f.viewBox.baseVal,[[f.x,f.y],[f.x+f.width,f.y+f.height]];return[[0,0],[f.width.baseVal.value,f.height.baseVal.value]]}return[[0,0],[f.clientWidth,f.clientHeight]]}function sG(){return this.__zoom||py}function AB(f){return-f.deltaY*(f.deltaMode===1?0.05:f.deltaMode?1:0.002)*(f.ctrlKey?10:1)}function QB(){return navigator.maxTouchPoints||"ontouchstart"in this}function UB(f,u,_){var y=f.invertX(u[0][0])-_[0][0],l=f.invertX(u[1][0])-_[1][0],$=f.invertY(u[0][1])-_[0][1],j=f.invertY(u[1][1])-_[1][1];return f.translate(l>y?(y+l)/2:Math.min(0,y)||Math.max(0,l),j>$?($+j)/2:Math.min(0,$)||Math.max(0,j))}function W6(){var f=JB,u=FB,_=UB,y=AB,l=QB,$=[0,1/0],j=[[-1/0,-1/0],[1/0,1/0]],J=250,F=Iy,Q=Ry("start","zoom","end"),U,z,W,K=500,q=150,V=0,O=10;function G(D){D.property("__zoom",sG).on("wheel.zoom",w,{passive:!1}).on("mousedown.zoom",R).on("dblclick.zoom",p).filter(l).on("touchstart.zoom",x).on("touchmove.zoom",C).on("touchend.zoom touchcancel.zoom",P).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}G.transform=function(D,T,S,r){var Y=D.selection?D.selection():D;if(Y.property("__zoom",sG),D!==Y)L(D,T,S,r);else Y.interrupt().each(function(){M(this,arguments).event(r).start().zoom(null,typeof T==="function"?T.apply(this,arguments):T).end()})},G.scaleBy=function(D,T,S,r){G.scaleTo(D,function(){var Y=this.__zoom.k,v=typeof T==="function"?T.apply(this,arguments):T;return Y*v},S,r)},G.scaleTo=function(D,T,S,r){G.transform(D,function(){var Y=u.apply(this,arguments),v=this.__zoom,m=S==null?E(Y):typeof S==="function"?S.apply(this,arguments):S,c=v.invert(m),o=typeof T==="function"?T.apply(this,arguments):T;return _(Z(H(v,o),m,c),Y,j)},S,r)},G.translateBy=function(D,T,S,r){G.transform(D,function(){return _(this.__zoom.translate(typeof T==="function"?T.apply(this,arguments):T,typeof S==="function"?S.apply(this,arguments):S),u.apply(this,arguments),j)},null,r)},G.translateTo=function(D,T,S,r,Y){G.transform(D,function(){var v=u.apply(this,arguments),m=this.__zoom,c=r==null?E(v):typeof r==="function"?r.apply(this,arguments):r;return _(py.translate(c[0],c[1]).scale(m.k).translate(typeof T==="function"?-T.apply(this,arguments):-T,typeof S==="function"?-S.apply(this,arguments):-S),v,j)},r,Y)};function H(D,T){return T=Math.max($[0],Math.min($[1],T)),T===D.k?D:new E1(T,D.x,D.y)}function Z(D,T,S){var r=T[0]-S[0]*D.k,Y=T[1]-S[1]*D.k;return r===D.x&&Y===D.y?D:new E1(D.k,r,Y)}function E(D){return[(+D[0][0]+ +D[1][0])/2,(+D[0][1]+ +D[1][1])/2]}function L(D,T,S,r){D.on("start.zoom",function(){M(this,arguments).event(r).start()}).on("interrupt.zoom end.zoom",function(){M(this,arguments).event(r).end()}).tween("zoom",function(){var Y=this,v=arguments,m=M(Y,v).event(r),c=u.apply(Y,v),o=S==null?E(c):typeof S==="function"?S.apply(Y,v):S,ff=Math.max(c[1][0]-c[0][0],c[1][1]-c[0][1]),n=Y.__zoom,lf=typeof T==="function"?T.apply(Y,v):T,Gf=F(n.invert(o).concat(ff/n.k),lf.invert(o).concat(ff/lf.k));return function(zf){if(zf===1)zf=lf;else{var jf=Gf(zf),Wf=ff/jf[2];zf=new E1(Wf,o[0]-jf[0]*Wf,o[1]-jf[1]*Wf)}m.zoom(null,zf)}})}function M(D,T,S){return!S&&D.__zooming||new N(D,T)}function N(D,T){this.that=D,this.args=T,this.active=0,this.sourceEvent=null,this.extent=u.apply(D,T),this.taps=0}N.prototype={event:function(D){if(D)this.sourceEvent=D;return this},start:function(){if(++this.active===1)this.that.__zooming=this,this.emit("start");return this},zoom:function(D,T){if(this.mouse&&D!=="mouse")this.mouse[1]=T.invert(this.mouse[0]);if(this.touch0&&D!=="touch")this.touch0[1]=T.invert(this.touch0[0]);if(this.touch1&&D!=="touch")this.touch1[1]=T.invert(this.touch1[0]);return this.that.__zoom=T,this.emit("zoom"),this},end:function(){if(--this.active===0)delete this.that.__zooming,this.emit("end");return this},emit:function(D){var T=C0(this.that).datum();Q.call(D,this.that,new nJ(D,{sourceEvent:this.sourceEvent,target:G,type:D,transform:this.that.__zoom,dispatch:Q}),T)}};function w(D,...T){if(!f.apply(this,arguments))return;var S=M(this,T).event(D),r=this.__zoom,Y=Math.max($[0],Math.min($[1],r.k*Math.pow(2,y.apply(this,arguments)))),v=$u(D);if(S.wheel){if(S.mouse[0][0]!==v[0]||S.mouse[0][1]!==v[1])S.mouse[1]=r.invert(S.mouse[0]=v);clearTimeout(S.wheel)}else if(r.k===Y)return;else S.mouse=[v,r.invert(v)],m_(this),S.start();my(D),S.wheel=setTimeout(m,q),S.zoom("mouse",_(Z(H(r,Y),S.mouse[0],S.mouse[1]),S.extent,j));function m(){S.wheel=null,S.end()}}function R(D,...T){if(W||!f.apply(this,arguments))return;var S=D.currentTarget,r=M(this,T,!0).event(D),Y=C0(D.view).on("mousemove.zoom",o,!0).on("mouseup.zoom",ff,!0),v=$u(D,S),m=D.clientX,c=D.clientY;i3(D.view),Z5(D),r.mouse=[v,this.__zoom.invert(v)],m_(this),r.start();function o(n){if(my(n),!r.moved){var lf=n.clientX-m,Gf=n.clientY-c;r.moved=lf*lf+Gf*Gf>V}r.event(n).zoom("mouse",_(Z(r.that.__zoom,r.mouse[0]=$u(n,S),r.mouse[1]),r.extent,j))}function ff(n){Y.on("mousemove.zoom mouseup.zoom",null),i$(n.view,r.moved),my(n),r.event(n).end()}}function p(D,...T){if(!f.apply(this,arguments))return;var S=this.__zoom,r=$u(D.changedTouches?D.changedTouches[0]:D,this),Y=S.invert(r),v=S.k*(D.shiftKey?0.5:2),m=_(Z(H(S,v),r,Y),u.apply(this,T),j);if(my(D),J>0)C0(this).transition().duration(J).call(L,m,r,D);else C0(this).call(G.transform,m,r,D)}function x(D,...T){if(!f.apply(this,arguments))return;var S=D.touches,r=S.length,Y=M(this,T,D.changedTouches.length===r).event(D),v,m,c,o;Z5(D);for(m=0;m"[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:(f)=>`Node type "${f}" 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:(f)=>`The old edge with id=${f} does not exist.`,error009:(f)=>`Marker type "${f}" doesn't exist.`,error008:(f,{id:u,sourceHandle:_,targetHandle:y})=>`Couldn't create edge for ${f} handle id: "${f==="source"?_:y}", edge id: ${u}.`,error010:()=>"Handle: No node id found. Make sure to only use a Handle inside a custom Node.",error011:(f)=>`Edge type "${f}" not found. Using fallback type "default".`,error012:(f)=>`Node with id "${f}" does not exist, it may have been removed. This can happen when a node is deleted before the "onNodeClick" handler is called.`,error013:(f="react")=>`It seems that you haven't loaded the styles. Please import '@xyflow/${f}/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."},ul=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],dJ=["Enter"," ","Escape"],eJ={"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:f,x:u,y:_})=>`Moved selected node ${f}. New position, x: ${u}, y: ${_}`,"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"},g_;(function(f){f.Strict="strict",f.Loose="loose"})(g_||(g_={}));var A_;(function(f){f.Free="free",f.Vertical="vertical",f.Horizontal="horizontal"})(A_||(A_={}));var ky;(function(f){f.Partial="partial",f.Full="full"})(ky||(ky={}));var fF={inProgress:!1,isValid:null,from:null,fromHandle:null,fromPosition:null,fromNode:null,to:null,toHandle:null,toPosition:null,toNode:null,pointer:null},v1;(function(f){f.Bezier="default",f.Straight="straight",f.Step="step",f.SmoothStep="smoothstep",f.SimpleBezier="simplebezier"})(v1||(v1={}));var n_;(function(f){f.Arrow="arrow",f.ArrowClosed="arrowclosed"})(n_||(n_={}));var Uf;(function(f){f.Left="left",f.Top="top",f.Right="right",f.Bottom="bottom"})(Uf||(Uf={}));var oG={[Uf.Left]:Uf.Right,[Uf.Right]:Uf.Left,[Uf.Top]:Uf.Bottom,[Uf.Bottom]:Uf.Top};function uF(f){return f===null?null:f?"valid":"invalid"}var _F=(f)=>("id"in f)&&("source"in f)&&("target"in f),AK=(f)=>("id"in f)&&("position"in f)&&!("source"in f)&&!("target"in f),yF=(f)=>("id"in f)&&("internals"in f)&&!("source"in f)&&!("target"in f);var K6=(f,u=[0,0])=>{let{width:_,height:y}=b1(f),l=f.origin??u,$=_*l[0],j=y*l[1];return{x:f.position.x-$,y:f.position.y-j}},lF=(f,u={nodeOrigin:[0,0]})=>{if(f.length===0)return{x:0,y:0,width:0,height:0};let _=f.reduce((y,l)=>{let $=typeof l==="string",j=!u.nodeLookup&&!$?l:void 0;if(u.nodeLookup)j=$?u.nodeLookup.get(l):!yF(l)?u.nodeLookup.get(l.id):l;let J=j?V5(j,u.nodeOrigin):{x:0,y:0,x2:0,y2:0};return O5(y,J)},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return X5(_)},_l=(f,u={})=>{let _={x:1/0,y:1/0,x2:-1/0,y2:-1/0},y=!1;return f.forEach((l)=>{if(u.filter===void 0||u.filter(l))_=O5(_,V5(l)),y=!0}),y?X5(_):{x:0,y:0,width:0,height:0}},E5=(f,u,[_,y,l]=[0,0,1],$=!1,j=!1)=>{let J={...$l(u,[_,y,l]),width:u.width/l,height:u.height/l},F=[];for(let Q of f.values()){let{measured:U,selectable:z=!0,hidden:W=!1}=Q;if(j&&!z||W)continue;let K=U.width??Q.width??Q.initialWidth??null,q=U.height??Q.height??Q.initialHeight??null,V=yl(J,gy(Q)),O=(K??0)*(q??0),G=$&&V>0;if(!Q.internals.handleBounds||G||V>=O||Q.dragging)F.push(Q)}return F},QK=(f,u)=>{let _=new Set;return f.forEach((y)=>{_.add(y.id)}),u.filter((y)=>_.has(y.source)||_.has(y.target))};function WB(f,u){let _=new Map,y=u?.nodes?new Set(u.nodes.map((l)=>l.id)):null;return f.forEach((l)=>{if(l.measured.width&&l.measured.height&&(u?.includeHiddenNodes||!l.hidden)&&(!y||y.has(l.id)))_.set(l.id,l)}),_}async function UK({nodes:f,width:u,height:_,panZoom:y,minZoom:l,maxZoom:$},j){if(f.size===0)return Promise.resolve(!0);let J=WB(f,j),F=_l(J),Q=Z6(F,u,_,j?.minZoom??l,j?.maxZoom??$,j?.padding??0.1);return await y.setViewport(Q,{duration:j?.duration,ease:j?.ease,interpolate:j?.interpolate}),Promise.resolve(!0)}function $F({nodeId:f,nextPosition:u,nodeLookup:_,nodeOrigin:y=[0,0],nodeExtent:l,onError:$}){let j=_.get(f),J=j.parentId?_.get(j.parentId):void 0,{x:F,y:Q}=J?J.internals.positionAbsolute:{x:0,y:0},U=j.origin??y,z=j.extent||l;if(j.extent==="parent"&&!j.expandParent)if(!J)$?.("005",hu.error005());else{let K=J.measured.width,q=J.measured.height;if(K&&q)z=[[F,Q],[F+K,Q+q]]}else if(J&&fl(j.extent))z=[[j.extent[0][0]+F,j.extent[0][1]+Q],[j.extent[1][0]+F,j.extent[1][1]+Q]];let W=fl(z)?iy(u,z,j.measured):u;if(j.measured.width===void 0||j.measured.height===void 0)$?.("015",hu.error015());return{position:{x:W.x-F+(j.measured.width??0)*U[0],y:W.y-Q+(j.measured.height??0)*U[1]},positionAbsolute:W}}async function WK({nodesToRemove:f=[],edgesToRemove:u=[],nodes:_,edges:y,onBeforeDelete:l}){let $=new Set(f.map((W)=>W.id)),j=[];for(let W of _){if(W.deletable===!1)continue;let K=$.has(W.id),q=!K&&W.parentId&&j.find((V)=>V.id===W.parentId);if(K||q)j.push(W)}let J=new Set(u.map((W)=>W.id)),F=y.filter((W)=>W.deletable!==!1),U=QK(j,F);for(let W of F)if(J.has(W.id)&&!U.find((q)=>q.id===W.id))U.push(W);if(!l)return{edges:U,nodes:j};let z=await l({nodes:j,edges:U});if(typeof z==="boolean")return z?{edges:U,nodes:j}:{edges:[],nodes:[]};return z}var e3=(f,u=0,_=1)=>Math.min(Math.max(f,u),_),iy=(f={x:0,y:0},u,_)=>({x:e3(f.x,u[0][0],u[1][0]-(_?.width??0)),y:e3(f.y,u[0][1],u[1][1]-(_?.height??0))});function zK(f,u,_){let{width:y,height:l}=b1(_),{x:$,y:j}=_.internals.positionAbsolute;return iy(f,[[$,j],[$+y,j+l]],u)}var aG=(f,u,_)=>{if(f_)return-e3(Math.abs(f-_),1,u)/u;return 0},GK=(f,u,_=15,y=40)=>{let l=aG(f.x,y,u.width-y)*_,$=aG(f.y,y,u.height-y)*_;return[l,$]},O5=(f,u)=>({x:Math.min(f.x,u.x),y:Math.min(f.y,u.y),x2:Math.max(f.x2,u.x2),y2:Math.max(f.y2,u.y2)}),aJ=({x:f,y:u,width:_,height:y})=>({x:f,y:u,x2:f+_,y2:u+y}),X5=({x:f,y:u,x2:_,y2:y})=>({x:f,y:u,width:_-f,height:y-u}),gy=(f,u=[0,0])=>{let{x:_,y}=yF(f)?f.internals.positionAbsolute:K6(f,u);return{x:_,y,width:f.measured?.width??f.width??f.initialWidth??0,height:f.measured?.height??f.height??f.initialHeight??0}},V5=(f,u=[0,0])=>{let{x:_,y}=yF(f)?f.internals.positionAbsolute:K6(f,u);return{x:_,y,x2:_+(f.measured?.width??f.width??f.initialWidth??0),y2:y+(f.measured?.height??f.height??f.initialHeight??0)}},jF=(f,u)=>X5(O5(aJ(f),aJ(u))),yl=(f,u)=>{let _=Math.max(0,Math.min(f.x+f.width,u.x+u.width)-Math.max(f.x,u.x)),y=Math.max(0,Math.min(f.y+f.height,u.y+u.height)-Math.max(f.y,u.y));return Math.ceil(_*y)},JF=(f)=>u1(f.width)&&u1(f.height)&&u1(f.x)&&u1(f.y),u1=(f)=>!isNaN(f)&&isFinite(f),FF=(f,u)=>{},ll=(f,u=[1,1])=>{return{x:u[0]*Math.round(f.x/u[0]),y:u[1]*Math.round(f.y/u[1])}},$l=({x:f,y:u},[_,y,l],$=!1,j=[1,1])=>{let J={x:(f-_)/l,y:(u-y)/l};return $?ll(J,j):J},G6=({x:f,y:u},[_,y,l])=>{return{x:f*l+_,y:u*l+y}};function a3(f,u){if(typeof f==="number")return Math.floor((u-u/(1+f))*0.5);if(typeof f==="string"&&f.endsWith("px")){let _=parseFloat(f);if(!Number.isNaN(_))return Math.floor(_)}if(typeof f==="string"&&f.endsWith("%")){let _=parseFloat(f);if(!Number.isNaN(_))return Math.floor(u*_*0.01)}return console.error(`[React Flow] The padding value "${f}" is invalid. Please provide a number or a string with a valid unit (px or %).`),0}function zB(f,u,_){if(typeof f==="string"||typeof f==="number"){let y=a3(f,_),l=a3(f,u);return{top:y,right:l,bottom:y,left:l,x:l*2,y:y*2}}if(typeof f==="object"){let y=a3(f.top??f.y??0,_),l=a3(f.bottom??f.y??0,_),$=a3(f.left??f.x??0,u),j=a3(f.right??f.x??0,u);return{top:y,right:j,bottom:l,left:$,x:$+j,y:y+l}}return{top:0,right:0,bottom:0,left:0,x:0,y:0}}function GB(f,u,_,y,l,$){let{x:j,y:J}=G6(f,[u,_,y]),{x:F,y:Q}=G6({x:f.x+f.width,y:f.y+f.height},[u,_,y]),U=l-F,z=$-Q;return{left:Math.floor(j),top:Math.floor(J),right:Math.floor(U),bottom:Math.floor(z)}}var Z6=(f,u,_,y,l,$)=>{let j=zB($,u,_),J=(u-j.x)/f.width,F=(_-j.y)/f.height,Q=Math.min(J,F),U=e3(Q,y,l),z=f.x+f.width/2,W=f.y+f.height/2,K=u/2-z*U,q=_/2-W*U,V=GB(f,K,q,U,u,_),O={left:Math.min(V.left-j.left,0),top:Math.min(V.top-j.top,0),right:Math.min(V.right-j.right,0),bottom:Math.min(V.bottom-j.bottom,0)};return{x:K-O.left+O.right,y:q-O.top+O.bottom,zoom:U}},jl=()=>typeof navigator<"u"&&navigator?.userAgent?.indexOf("Mac")>=0;function fl(f){return f!==void 0&&f!==null&&f!=="parent"}function b1(f){return{width:f.measured?.width??f.width??f.initialWidth??0,height:f.measured?.height??f.height??f.initialHeight??0}}function AF(f){return(f.measured?.width??f.width??f.initialWidth)!==void 0&&(f.measured?.height??f.height??f.initialHeight)!==void 0}function QF(f,u={width:0,height:0},_,y,l){let $={...f},j=y.get(_);if(j){let J=j.origin||l;$.x+=j.internals.positionAbsolute.x-(u.width??0)*J[0],$.y+=j.internals.positionAbsolute.y-(u.height??0)*J[1]}return $}function UF(f,u){if(f.size!==u.size)return!1;for(let _ of f)if(!u.has(_))return!1;return!0}function KK(){let f,u;return{promise:new Promise((y,l)=>{f=y,u=l}),resolve:f,reject:u}}function ZK(f){return{...eJ,...f||{}}}function z6(f,{snapGrid:u=[0,0],snapToGrid:_=!1,transform:y,containerBounds:l}){let{x:$,y:j}=_1(f),J=$l({x:$-(l?.left??0),y:j-(l?.top??0)},y),{x:F,y:Q}=_?ll(J,u):J;return{xSnapped:F,ySnapped:Q,...J}}var N5=(f)=>({width:f.offsetWidth,height:f.offsetHeight}),WF=(f)=>f?.getRootNode?.()||window?.document,KB=["INPUT","SELECT","TEXTAREA"];function zF(f){let u=f.composedPath?.()?.[0]||f.target;if(u?.nodeType!==1)return!1;return KB.includes(u.nodeName)||u.hasAttribute("contenteditable")||!!u.closest(".nokey")}var GF=(f)=>("clientX"in f),_1=(f,u)=>{let _=GF(f),y=_?f.clientX:f.touches?.[0].clientX,l=_?f.clientY:f.touches?.[0].clientY;return{x:y-(u?.left??0),y:l-(u?.top??0)}},dG=(f,u,_,y,l)=>{let $=u.querySelectorAll(`.${f}`);if(!$||!$.length)return null;return Array.from($).map((j)=>{let J=j.getBoundingClientRect();return{id:j.getAttribute("data-handleid"),type:f,nodeId:l,position:j.getAttribute("data-handlepos"),x:(J.left-_.left)/y,y:(J.top-_.top)/y,...N5(j)}})};function L5({sourceX:f,sourceY:u,targetX:_,targetY:y,sourceControlX:l,sourceControlY:$,targetControlX:j,targetControlY:J}){let F=f*0.125+l*0.375+j*0.375+_*0.125,Q=u*0.125+$*0.375+J*0.375+y*0.125,U=Math.abs(F-f),z=Math.abs(Q-u);return[F,Q,U,z]}function q5(f,u){if(f>=0)return 0.5*f;return u*25*Math.sqrt(-f)}function eG({pos:f,x1:u,y1:_,x2:y,y2:l,c:$}){switch(f){case Uf.Left:return[u-q5(u-y,$),_];case Uf.Right:return[u+q5(y-u,$),_];case Uf.Top:return[u,_-q5(_-l,$)];case Uf.Bottom:return[u,_+q5(l-_,$)]}}function Y5({sourceX:f,sourceY:u,sourcePosition:_=Uf.Bottom,targetX:y,targetY:l,targetPosition:$=Uf.Top,curvature:j=0.25}){let[J,F]=eG({pos:_,x1:f,y1:u,x2:y,y2:l,c:j}),[Q,U]=eG({pos:$,x1:y,y1:l,x2:f,y2:u,c:j}),[z,W,K,q]=L5({sourceX:f,sourceY:u,targetX:y,targetY:l,sourceControlX:J,sourceControlY:F,targetControlX:Q,targetControlY:U});return[`M${f},${u} C${J},${F} ${Q},${U} ${y},${l}`,z,W,K,q]}function KF({sourceX:f,sourceY:u,targetX:_,targetY:y}){let l=Math.abs(_-f)/2,$=_0}var ZB=({source:f,sourceHandle:u,target:_,targetHandle:y})=>`xy-edge__${f}${u||""}-${_}${y||""}`,qB=(f,u)=>{return u.some((_)=>_.source===f.source&&_.target===f.target&&(_.sourceHandle===f.sourceHandle||!_.sourceHandle&&!f.sourceHandle)&&(_.targetHandle===f.targetHandle||!_.targetHandle&&!f.targetHandle))},ZF=(f,u,_={})=>{if(!f.source||!f.target)return FF("006",hu.error006()),u;let y=_.getEdgeId||ZB,l;if(_F(f))l={...f};else l={...f,id:y(f)};if(qB(l,u))return u;if(l.sourceHandle===null)delete l.sourceHandle;if(l.targetHandle===null)delete l.targetHandle;return u.concat(l)};function B5({sourceX:f,sourceY:u,targetX:_,targetY:y}){let[l,$,j,J]=KF({sourceX:f,sourceY:u,targetX:_,targetY:y});return[`M ${f},${u}L ${_},${y}`,l,$,j,J]}var fK={[Uf.Left]:{x:-1,y:0},[Uf.Right]:{x:1,y:0},[Uf.Top]:{x:0,y:-1},[Uf.Bottom]:{x:0,y:1}},HB=({source:f,sourcePosition:u=Uf.Bottom,target:_})=>{if(u===Uf.Left||u===Uf.Right)return f.x<_.x?{x:1,y:0}:{x:-1,y:0};return f.y<_.y?{x:0,y:1}:{x:0,y:-1}},uK=(f,u)=>Math.sqrt(Math.pow(u.x-f.x,2)+Math.pow(u.y-f.y,2));function VB({source:f,sourcePosition:u=Uf.Bottom,target:_,targetPosition:y=Uf.Top,center:l,offset:$,stepPosition:j}){let J=fK[u],F=fK[y],Q={x:f.x+J.x*$,y:f.y+J.y*$},U={x:_.x+F.x*$,y:_.y+F.y*$},z=HB({source:Q,sourcePosition:u,target:U}),W=z.x!==0?"x":"y",K=z[W],q=[],V,O,G={x:0,y:0},H={x:0,y:0},[,,Z,E]=KF({sourceX:f.x,sourceY:f.y,targetX:_.x,targetY:_.y});if(J[W]*F[W]===-1){if(W==="x")V=l.x??Q.x+(U.x-Q.x)*j,O=l.y??(Q.y+U.y)/2;else V=l.x??(Q.x+U.x)/2,O=l.y??Q.y+(U.y-Q.y)*j;let w=[{x:V,y:Q.y},{x:V,y:U.y}],R=[{x:Q.x,y:O},{x:U.x,y:O}];if(J[W]===K)q=W==="x"?w:R;else q=W==="x"?R:w}else{let w=[{x:Q.x,y:U.y}],R=[{x:U.x,y:Q.y}];if(W==="x")q=J.x===K?R:w;else q=J.y===K?w:R;if(u===y){let D=Math.abs(f[W]-_[W]);if(D<=$){let T=Math.min($-1,$-D);if(J[W]===K)G[W]=(Q[W]>f[W]?-1:1)*T;else H[W]=(U[W]>_[W]?-1:1)*T}}if(u!==y){let D=W==="x"?"y":"x",T=J[W]===F[D],S=Q[D]>U[D],r=Q[D]=P)V=(p.x+x.x)/2,O=q[0].y;else V=q[0].x,O=(p.y+x.y)/2}let L={x:Q.x+G.x,y:Q.y+G.y},M={x:U.x+H.x,y:U.y+H.y};return[[f,...L.x!==q[0].x||L.y!==q[0].y?[L]:[],...q,...M.x!==q[q.length-1].x||M.y!==q[q.length-1].y?[M]:[],_],V,O,Z,E]}function EB(f,u,_,y){let l=Math.min(uK(f,u)/2,uK(u,_)/2,y),{x:$,y:j}=u;if(f.x===$&&$===_.x||f.y===j&&j===_.y)return`L${$} ${j}`;if(f.y===j){let Q=f.x<_.x?-1:1,U=f.y<_.y?1:-1;return`L ${$+l*Q},${j}Q ${$},${j} ${$},${j+l*U}`}let J=f.x<_.x?1:-1,F=f.y<_.y?-1:1;return`L ${$},${j+l*F}Q ${$},${j} ${$+l*J},${j}`}function q6({sourceX:f,sourceY:u,sourcePosition:_=Uf.Bottom,targetX:y,targetY:l,targetPosition:$=Uf.Top,borderRadius:j=5,centerX:J,centerY:F,offset:Q=20,stepPosition:U=0.5}){let[z,W,K,q,V]=VB({source:{x:f,y:u},sourcePosition:_,target:{x:y,y:l},targetPosition:$,center:{x:J,y:F},offset:Q,stepPosition:U}),O=`M${z[0].x} ${z[0].y}`;for(let G=1;G_.id===u))||null}function w5(f,u){if(!f)return"";if(typeof f==="string")return f;return`${u?`${u}__`:""}${Object.keys(f).sort().map((y)=>`${y}=${f[y]}`).join("&")}`}function EK(f,{id:u,defaultColor:_,defaultMarkerStart:y,defaultMarkerEnd:l}){let $=new Set;return f.reduce((j,J)=>{return[J.markerStart||y,J.markerEnd||l].forEach((F)=>{if(F&&typeof F==="object"){let Q=w5(F,u);if(!$.has(Q))j.push({id:Q,color:F.color||_,...F}),$.add(Q)}}),j},[]).sort((j,J)=>j.id.localeCompare(J.id))}var OK=1000,OB=10,qF={nodeOrigin:[0,0],nodeExtent:ul,elevateNodesOnSelect:!0,zIndexMode:"basic",defaults:{}},XB={...qF,checkEquality:!0};function HF(f,u){let _={...f};for(let y in u)if(u[y]!==void 0)_[y]=u[y];return _}function XK(f,u,_){let y=HF(qF,_);for(let l of f.values())if(l.parentId)EF(l,f,u,y);else{let $=K6(l,y.nodeOrigin),j=fl(l.extent)?l.extent:y.nodeExtent,J=iy($,j,b1(l));l.internals.positionAbsolute=J}}function NB(f,u){if(!f.handles)return!f.measured?void 0:u?.internals.handleBounds;let _=[],y=[];for(let l of f.handles){let $={id:l.id,width:l.width??1,height:l.height??1,nodeId:f.id,x:l.x,y:l.y,position:l.position,type:l.type};if(l.type==="source")_.push($);else if(l.type==="target")y.push($)}return{source:_,target:y}}function VF(f){return f==="manual"}function D5(f,u,_,y={}){let l=HF(XB,y),$={i:0},j=new Map(u),J=l?.elevateNodesOnSelect&&!VF(l.zIndexMode)?OK:0,F=f.length>0,Q=!1;u.clear(),_.clear();for(let U of f){let z=j.get(U.id);if(l.checkEquality&&U===z?.internals.userNode)u.set(U.id,z);else{let W=K6(U,l.nodeOrigin),K=fl(U.extent)?U.extent:l.nodeExtent,q=iy(W,K,b1(U));z={...l.defaults,...U,measured:{width:U.measured?.width,height:U.measured?.height},internals:{positionAbsolute:q,handleBounds:NB(U,z),z:NK(U,J,l.zIndexMode),userNode:U}},u.set(U.id,z)}if((z.measured===void 0||z.measured.width===void 0||z.measured.height===void 0)&&!z.hidden)F=!1;if(U.parentId)EF(z,u,_,y,$);Q||=U.selected??!1}return{nodesInitialized:F,hasSelectedNodes:Q}}function LB(f,u){if(!f.parentId)return;let _=u.get(f.parentId);if(_)_.set(f.id,f);else u.set(f.parentId,new Map([[f.id,f]]))}function EF(f,u,_,y,l){let{elevateNodesOnSelect:$,nodeOrigin:j,nodeExtent:J,zIndexMode:F}=HF(qF,y),Q=f.parentId,U=u.get(Q);if(!U){console.warn(`Parent node ${Q} not found. Please make sure that parent nodes are in front of their child nodes in the nodes array.`);return}if(LB(f,_),l&&!U.parentId&&U.internals.rootParentIndex===void 0&&F==="auto")U.internals.rootParentIndex=++l.i,U.internals.z=U.internals.z+l.i*OB;if(l&&U.internals.rootParentIndex!==void 0)l.i=U.internals.rootParentIndex;let z=$&&!VF(F)?OK:0,{x:W,y:K,z:q}=YB(f,U,j,J,z,F),{positionAbsolute:V}=f.internals,O=W!==V.x||K!==V.y;if(O||q!==f.internals.z)u.set(f.id,{...f,internals:{...f.internals,positionAbsolute:O?{x:W,y:K}:V,z:q}})}function NK(f,u,_){let y=u1(f.zIndex)?f.zIndex:0;if(VF(_))return y;return y+(f.selected?u:0)}function YB(f,u,_,y,l,$){let{x:j,y:J}=u.internals.positionAbsolute,F=b1(f),Q=K6(f,_),U=fl(f.extent)?iy(Q,f.extent,F):Q,z=iy({x:j+U.x,y:J+U.y},y,F);if(f.extent==="parent")z=zK(z,F,u);let W=NK(f,l,$),K=u.internals.z??0;return{x:z.x,y:z.y,z:K>=W?K+1:W}}function T5(f,u,_,y=[0,0]){let l=[],$=new Map;for(let j of f){let J=u.get(j.parentId);if(!J)continue;let F=$.get(j.parentId)?.expandedRect??gy(J),Q=jF(F,j.rect);$.set(j.parentId,{expandedRect:Q,parent:J})}if($.size>0)$.forEach(({expandedRect:j,parent:J},F)=>{let Q=J.internals.positionAbsolute,U=b1(J),z=J.origin??y,W=j.x0||K>0||O||G)l.push({id:F,type:"position",position:{x:J.position.x-W+O,y:J.position.y-K+G}}),_.get(F)?.forEach((H)=>{if(!f.some((Z)=>Z.id===H.id))l.push({id:H.id,type:"position",position:{x:H.position.x+W,y:H.position.y+K}})});if(U.width0){let K=T5(W,u,_,l);Q.push(...K)}return{changes:Q,updatedInternals:F}}async function YK({delta:f,panZoom:u,transform:_,translateExtent:y,width:l,height:$}){if(!u||!f.x&&!f.y)return Promise.resolve(!1);let j=await u.setViewportConstrained({x:_[0]+f.x,y:_[1]+f.y,zoom:_[2]},[[0,0],[l,$]],y),J=!!j&&(j.x!==_[0]||j.y!==_[1]||j.k!==_[2]);return Promise.resolve(J)}function $K(f,u,_,y,l,$){let j=l,J=y.get(j)||new Map;y.set(j,J.set(_,u)),j=`${l}-${f}`;let F=y.get(j)||new Map;if(y.set(j,F.set(_,u)),$){j=`${l}-${f}-${$}`;let Q=y.get(j)||new Map;y.set(j,Q.set(_,u))}}function OF(f,u,_){f.clear(),u.clear();for(let y of _){let{source:l,target:$,sourceHandle:j=null,targetHandle:J=null}=y,F={edgeId:y.id,source:l,target:$,sourceHandle:j,targetHandle:J},Q=`${l}-${j}--${$}-${J}`,U=`${$}-${J}--${l}-${j}`;$K("source",F,U,f,l,j),$K("target",F,Q,f,$,J),u.set(y.id,y)}}function BK(f,u){if(!f.parentId)return!1;let _=u.get(f.parentId);if(!_)return!1;if(_.selected)return!0;return BK(_,u)}function jK(f,u,_){let y=f;do{if(y?.matches?.(u))return!0;if(y===_)return!1;y=y?.parentElement}while(y);return!1}function BB(f,u,_,y){let l=new Map;for(let[$,j]of f)if((j.selected||j.id===y)&&(!j.parentId||!BK(j,f))&&(j.draggable||u&&typeof j.draggable>"u")){let J=f.get($);if(J)l.set($,{id:$,position:J.position||{x:0,y:0},distance:{x:_.x-J.internals.positionAbsolute.x,y:_.y-J.internals.positionAbsolute.y},extent:J.extent,parentId:J.parentId,origin:J.origin,expandParent:J.expandParent,internals:{positionAbsolute:J.internals.positionAbsolute||{x:0,y:0}},measured:{width:J.measured.width??0,height:J.measured.height??0}})}return l}function tJ({nodeId:f,dragItems:u,nodeLookup:_,dragging:y=!0}){let l=[];for(let[j,J]of u){let F=_.get(j)?.internals.userNode;if(F)l.push({...F,position:J.position,dragging:y})}if(!f)return[l[0],l];let $=_.get(f)?.internals.userNode;return[!$?l[0]:{...$,position:u.get(f)?.position||$.position,dragging:y},l]}function wB({dragItems:f,snapGrid:u,x:_,y}){let l=f.values().next().value;if(!l)return null;let $={x:_-l.distance.x,y:y-l.distance.y},j=ll($,u);return{x:j.x-$.x,y:j.y-$.y}}function wK({onNodeMouseDown:f,getStoreItems:u,onDragStart:_,onDrag:y,onDragStop:l}){let $={x:null,y:null},j=0,J=new Map,F=!1,Q={x:0,y:0},U=null,z=!1,W=null,K=!1,q=!1,V=null;function O({noDragClassName:H,handleSelector:Z,domNode:E,isSelectable:L,nodeId:M,nodeClickDistance:N=0}){W=C0(E);function w({x:C,y:P}){let{nodeLookup:D,nodeExtent:T,snapGrid:S,snapToGrid:r,nodeOrigin:Y,onNodeDrag:v,onSelectionDrag:m,onError:c,updateNodePositions:o}=u();$={x:C,y:P};let ff=!1,n=J.size>1,lf=n&&T?aJ(_l(J)):null,Gf=n&&r?wB({dragItems:J,snapGrid:S,x:C,y:P}):null;for(let[zf,jf]of J){if(!D.has(zf))continue;let Wf={x:C-jf.distance.x,y:P-jf.distance.y};if(r)Wf=Gf?{x:Math.round(Wf.x+Gf.x),y:Math.round(Wf.y+Gf.y)}:ll(Wf,S);let Vf=null;if(n&&T&&!jf.extent&&lf){let{positionAbsolute:g}=jf.internals,I=g.x-lf.x+T[0][0],yf=g.x+jf.measured.width-lf.x2+T[1][0],$f=g.y-lf.y+T[0][1],Qf=g.y+jf.measured.height-lf.y2+T[1][1];Vf=[[I,$f],[yf,Qf]]}let{position:Kf,positionAbsolute:h}=$F({nodeId:zf,nextPosition:Wf,nodeLookup:D,nodeExtent:Vf?Vf:T,nodeOrigin:Y,onError:c});ff=ff||jf.position.x!==Kf.x||jf.position.y!==Kf.y,jf.position=Kf,jf.internals.positionAbsolute=h}if(q=q||ff,!ff)return;if(o(J,!0),V&&(y||v||!M&&m)){let[zf,jf]=tJ({nodeId:M,dragItems:J,nodeLookup:D});if(y?.(V,J,zf,jf),v?.(V,zf,jf),!M)m?.(V,jf)}}async function R(){if(!U)return;let{transform:C,panBy:P,autoPanSpeed:D,autoPanOnNodeDrag:T}=u();if(!T){F=!1,cancelAnimationFrame(j);return}let[S,r]=GK(Q,U,D);if(S!==0||r!==0){if($.x=($.x??0)-S/C[2],$.y=($.y??0)-r/C[2],await P({x:S,y:r}))w($)}j=requestAnimationFrame(R)}function p(C){let{nodeLookup:P,multiSelectionActive:D,nodesDraggable:T,transform:S,snapGrid:r,snapToGrid:Y,selectNodesOnDrag:v,onNodeDragStart:m,onSelectionDragStart:c,unselectNodesAndEdges:o}=u();if(z=!0,(!v||!L)&&!D&&M){if(!P.get(M)?.selected)o()}if(L&&v&&M)f?.(M);let ff=z6(C.sourceEvent,{transform:S,snapGrid:r,snapToGrid:Y,containerBounds:U});if($=ff,J=BB(P,T,ff,M),J.size>0&&(_||m||!M&&c)){let[n,lf]=tJ({nodeId:M,dragItems:J,nodeLookup:P});if(_?.(C.sourceEvent,J,n,lf),m?.(C.sourceEvent,n,lf),!M)c?.(C.sourceEvent,lf)}}let x=t$().clickDistance(N).on("start",(C)=>{let{domNode:P,nodeDragThreshold:D,transform:T,snapGrid:S,snapToGrid:r}=u();if(U=P?.getBoundingClientRect()||null,K=!1,q=!1,V=C.sourceEvent,D===0)p(C);$=z6(C.sourceEvent,{transform:T,snapGrid:S,snapToGrid:r,containerBounds:U}),Q=_1(C.sourceEvent,U)}).on("drag",(C)=>{let{autoPanOnNodeDrag:P,transform:D,snapGrid:T,snapToGrid:S,nodeDragThreshold:r,nodeLookup:Y}=u(),v=z6(C.sourceEvent,{transform:D,snapGrid:T,snapToGrid:S,containerBounds:U});if(V=C.sourceEvent,C.sourceEvent.type==="touchmove"&&C.sourceEvent.touches.length>1||M&&!Y.has(M))K=!0;if(K)return;if(!F&&P&&z)F=!0,R();if(!z){let m=_1(C.sourceEvent,U),c=m.x-Q.x,o=m.y-Q.y;if(Math.sqrt(c*c+o*o)>r)p(C)}if(($.x!==v.xSnapped||$.y!==v.ySnapped)&&J&&z)Q=_1(C.sourceEvent,U),w(v)}).on("end",(C)=>{if(!z||K)return;if(F=!1,z=!1,cancelAnimationFrame(j),J.size>0){let{nodeLookup:P,updateNodePositions:D,onNodeDragStop:T,onSelectionDragStop:S}=u();if(q)D(J,!1),q=!1;if(l||T||!M&&S){let[r,Y]=tJ({nodeId:M,dragItems:J,nodeLookup:P,dragging:!1});if(l?.(C.sourceEvent,J,r,Y),T?.(C.sourceEvent,r,Y),!M)S?.(C.sourceEvent,Y)}}}).filter((C)=>{let P=C.target;return!C.button&&(!H||!jK(P,`.${H}`,E))&&(!Z||jK(P,Z,E))});W.call(x)}function G(){W?.on(".drag",null)}return{update:O,destroy:G}}function DB(f,u,_){let y=[],l={x:f.x-_,y:f.y-_,width:_*2,height:_*2};for(let $ of u.values())if(yl(l,gy($))>0)y.push($);return y}var TB=250;function MB(f,u,_,y){let l=[],$=1/0,j=DB(f,_,u+TB);for(let J of j){let F=[...J.internals.handleBounds?.source??[],...J.internals.handleBounds?.target??[]];for(let Q of F){if(y.nodeId===Q.nodeId&&y.type===Q.type&&y.id===Q.id)continue;let{x:U,y:z}=t_(J,Q,Q.position,!0),W=Math.sqrt(Math.pow(U-f.x,2)+Math.pow(z-f.y,2));if(W>u)continue;if(W<$)l=[{...Q,x:U,y:z}],$=W;else if(W===$)l.push({...Q,x:U,y:z})}}if(!l.length)return null;if(l.length>1){let J=y.type==="source"?"target":"source";return l.find((F)=>F.type===J)??l[0]}return l[0]}function DK(f,u,_,y,l,$=!1){let j=y.get(f);if(!j)return null;let J=l==="strict"?j.internals.handleBounds?.[u]:[...j.internals.handleBounds?.source??[],...j.internals.handleBounds?.target??[]],F=(_?J?.find((Q)=>Q.id===_):J?.[0])??null;return F&&$?{...F,...t_(j,F,F.position,!0)}:F}function TK(f,u){if(f)return f;else if(u?.classList.contains("target"))return"target";else if(u?.classList.contains("source"))return"source";return null}function rB(f,u){let _=null;if(u)_=!0;else if(f&&!u)_=!1;return _}var MK=()=>!0;function SB(f,{connectionMode:u,connectionRadius:_,handleId:y,nodeId:l,edgeUpdaterType:$,isTarget:j,domNode:J,nodeLookup:F,lib:Q,autoPanOnConnect:U,flowId:z,panBy:W,cancelConnection:K,onConnectStart:q,onConnect:V,onConnectEnd:O,isValidConnection:G=MK,onReconnectEnd:H,updateConnection:Z,getTransform:E,getFromHandle:L,autoPanSpeed:M,dragThreshold:N=1,handleDomNode:w}){let R=WF(f.target),p=0,x,{x:C,y:P}=_1(f),D=TK($,w),T=J?.getBoundingClientRect(),S=!1;if(!T||!D)return;let r=DK(l,D,y,F,u);if(!r)return;let Y=_1(f,T),v=!1,m=null,c=!1,o=null;function ff(){if(!U||!T)return;let[Kf,h]=GK(Y,T,M);W({x:Kf,y:h}),p=requestAnimationFrame(ff)}let n={...r,nodeId:l,type:D,position:r.position},lf=F.get(l),zf={inProgress:!0,isValid:null,from:t_(lf,n,Uf.Left,!0),fromHandle:n,fromPosition:n.position,fromNode:lf,to:Y,toHandle:null,toPosition:oG[n.position],toNode:null,pointer:Y};function jf(){S=!0,Z(zf),q?.(f,{nodeId:l,handleId:y,handleType:D})}if(N===0)jf();function Wf(Kf){if(!S){let{x:Qf,y:Yf}=_1(Kf),xf=Qf-C,tf=Yf-P;if(!(xf*xf+tf*tf>N*N))return;jf()}if(!L()||!n){Vf(Kf);return}let h=E();if(Y=_1(Kf,T),x=MB($l(Y,h,!1,[1,1]),_,F,n),!v)ff(),v=!0;let g=rK(Kf,{handle:x,connectionMode:u,fromNodeId:l,fromHandleId:y,fromType:j?"target":"source",isValidConnection:G,doc:R,lib:Q,flowId:z,nodeLookup:F});o=g.handleDomNode,m=g.connection,c=rB(!!x,g.isValid);let I=F.get(l),yf=I?t_(I,n,Uf.Left,!0):zf.from,$f={...zf,from:yf,isValid:c,to:g.toHandle&&c?G6({x:g.toHandle.x,y:g.toHandle.y},h):Y,toHandle:g.toHandle,toPosition:c&&g.toHandle?g.toHandle.position:oG[n.position],toNode:g.toHandle?F.get(g.toHandle.nodeId):null,pointer:Y};Z($f),zf=$f}function Vf(Kf){if("touches"in Kf&&Kf.touches.length>0)return;if(S){if((x||o)&&m&&c)V?.(m);let{inProgress:h,...g}=zf,I={...g,toPosition:zf.toHandle?zf.toPosition:null};if(O?.(Kf,I),$)H?.(Kf,I)}K(),cancelAnimationFrame(p),v=!1,c=!1,m=null,o=null,R.removeEventListener("mousemove",Wf),R.removeEventListener("mouseup",Vf),R.removeEventListener("touchmove",Wf),R.removeEventListener("touchend",Vf)}R.addEventListener("mousemove",Wf),R.addEventListener("mouseup",Vf),R.addEventListener("touchmove",Wf),R.addEventListener("touchend",Vf)}function rK(f,{handle:u,connectionMode:_,fromNodeId:y,fromHandleId:l,fromType:$,doc:j,lib:J,flowId:F,isValidConnection:Q=MK,nodeLookup:U}){let z=$==="target",W=u?j.querySelector(`.${J}-flow__handle[data-id="${F}-${u?.nodeId}-${u?.id}-${u?.type}"]`):null,{x:K,y:q}=_1(f),V=j.elementFromPoint(K,q),O=V?.classList.contains(`${J}-flow__handle`)?V:W,G={handleDomNode:O,isValid:!1,connection:null,toHandle:null};if(O){let H=TK(void 0,O),Z=O.getAttribute("data-nodeid"),E=O.getAttribute("data-handleid"),L=O.classList.contains("connectable"),M=O.classList.contains("connectableend");if(!Z||!H)return G;let N={source:z?Z:y,sourceHandle:z?E:l,target:z?y:Z,targetHandle:z?l:E};G.connection=N;let R=L&&M&&(_===g_.Strict?z&&H==="source"||!z&&H==="target":Z!==y||E!==l);G.isValid=R&&Q(N),G.toHandle=DK(Z,H,E,U,_,!0)}return G}var M5={onPointerDown:SB,isValid:rK};function SK({domNode:f,panZoom:u,getTransform:_,getViewScale:y}){let l=C0(f);function $({translateExtent:J,width:F,height:Q,zoomStep:U=1,pannable:z=!0,zoomable:W=!0,inversePan:K=!1}){let q=(Z)=>{if(Z.sourceEvent.type!=="wheel"||!u)return;let E=_(),L=Z.sourceEvent.ctrlKey&&jl()?10:1,M=-Z.sourceEvent.deltaY*(Z.sourceEvent.deltaMode===1?0.05:Z.sourceEvent.deltaMode?1:0.002)*U,N=E[2]*Math.pow(2,M*L);u.scaleTo(N)},V=[0,0],O=(Z)=>{if(Z.sourceEvent.type==="mousedown"||Z.sourceEvent.type==="touchstart")V=[Z.sourceEvent.clientX??Z.sourceEvent.touches[0].clientX,Z.sourceEvent.clientY??Z.sourceEvent.touches[0].clientY]},G=(Z)=>{let E=_();if(Z.sourceEvent.type!=="mousemove"&&Z.sourceEvent.type!=="touchmove"||!u)return;let L=[Z.sourceEvent.clientX??Z.sourceEvent.touches[0].clientX,Z.sourceEvent.clientY??Z.sourceEvent.touches[0].clientY],M=[L[0]-V[0],L[1]-V[1]];V=L;let N=y()*Math.max(E[2],Math.log(E[2]))*(K?-1:1),w={x:E[0]-M[0]*N,y:E[1]-M[1]*N},R=[[0,0],[F,Q]];u.setViewportConstrained({x:w.x,y:w.y,zoom:E[2]},R,J)},H=W6().on("start",O).on("zoom",z?G:null).on("zoom.wheel",W?q:null);l.call(H,{})}function j(){l.on("zoom",null)}return{update:$,destroy:j,pointer:$u}}var r5=(f)=>({x:f.x,y:f.y,zoom:f.k}),sJ=({x:f,y:u,zoom:_})=>py.translate(f,u).scale(_),d3=(f,u)=>f.target.closest(`.${u}`),PK=(f,u)=>u===2&&Array.isArray(f)&&f.includes(2),PB=(f)=>((f*=2)<=1?f*f*f:(f-=2)*f*f+2)/2,oJ=(f,u=0,_=PB,y=()=>{})=>{let l=typeof u==="number"&&u>0;if(!l)y();return l?f.transition().duration(u).ease(_).on("end",y):f},CK=(f)=>{let u=f.ctrlKey&&jl()?10:1;return-f.deltaY*(f.deltaMode===1?0.05:f.deltaMode?1:0.002)*u};function CB({zoomPanValues:f,noWheelClassName:u,d3Selection:_,d3Zoom:y,panOnScrollMode:l,panOnScrollSpeed:$,zoomOnPinch:j,onPanZoomStart:J,onPanZoom:F,onPanZoomEnd:Q}){return(U)=>{if(d3(U,u)){if(U.ctrlKey)U.preventDefault();return!1}U.preventDefault(),U.stopImmediatePropagation();let z=_.property("__zoom").k||1;if(U.ctrlKey&&j){let O=$u(U),G=CK(U),H=z*Math.pow(2,G);y.scaleTo(_,H,O,U);return}let W=U.deltaMode===1?20:1,K=l===A_.Vertical?0:U.deltaX*W,q=l===A_.Horizontal?0:U.deltaY*W;if(!jl()&&U.shiftKey&&l!==A_.Vertical)K=U.deltaY*W,q=0;y.translateBy(_,-(K/z)*$,-(q/z)*$,{internal:!0});let V=r5(_.property("__zoom"));if(clearTimeout(f.panScrollTimeout),!f.isPanScrolling)f.isPanScrolling=!0,J?.(U,V);else F?.(U,V),f.panScrollTimeout=setTimeout(()=>{Q?.(U,V),f.isPanScrolling=!1},150)}}function RB({noWheelClassName:f,preventScrolling:u,d3ZoomHandler:_}){return function(y,l){let $=y.type==="wheel",j=!u&&$&&!y.ctrlKey,J=d3(y,f);if(y.ctrlKey&&$&&J)y.preventDefault();if(j||J)return null;y.preventDefault(),_.call(this,y,l)}}function xB({zoomPanValues:f,onDraggingChange:u,onPanZoomStart:_}){return(y)=>{if(y.sourceEvent?.internal)return;let l=r5(y.transform);if(f.mouseButton=y.sourceEvent?.button||0,f.isZoomingOrPanning=!0,f.prevViewport=l,y.sourceEvent?.type==="mousedown")u(!0);if(_)_?.(y.sourceEvent,l)}}function vB({zoomPanValues:f,panOnDrag:u,onPaneContextMenu:_,onTransformChange:y,onPanZoom:l}){return($)=>{if(f.usedRightMouseButton=!!(_&&PK(u,f.mouseButton??0)),!$.sourceEvent?.sync)y([$.transform.x,$.transform.y,$.transform.k]);if(l&&!$.sourceEvent?.internal)l?.($.sourceEvent,r5($.transform))}}function bB({zoomPanValues:f,panOnDrag:u,panOnScroll:_,onDraggingChange:y,onPanZoomEnd:l,onPaneContextMenu:$}){return(j)=>{if(j.sourceEvent?.internal)return;if(f.isZoomingOrPanning=!1,$&&PK(u,f.mouseButton??0)&&!f.usedRightMouseButton&&j.sourceEvent)$(j.sourceEvent);if(f.usedRightMouseButton=!1,y(!1),l){let J=r5(j.transform);f.prevViewport=J,clearTimeout(f.timerId),f.timerId=setTimeout(()=>{l?.(j.sourceEvent,J)},_?150:0)}}}function hB({zoomActivationKeyPressed:f,zoomOnScroll:u,zoomOnPinch:_,panOnDrag:y,panOnScroll:l,zoomOnDoubleClick:$,userSelectionActive:j,noWheelClassName:J,noPanClassName:F,lib:Q,connectionInProgress:U}){return(z)=>{let W=f||u,K=_&&z.ctrlKey,q=z.type==="wheel";if(z.button===1&&z.type==="mousedown"&&(d3(z,`${Q}-flow__node`)||d3(z,`${Q}-flow__edge`)))return!0;if(!y&&!W&&!l&&!$&&!_)return!1;if(j)return!1;if(U&&!q)return!1;if(d3(z,J)&&q)return!1;if(d3(z,F)&&(!q||l&&q&&!f))return!1;if(!_&&z.ctrlKey&&q)return!1;if(!_&&z.type==="touchstart"&&z.touches?.length>1)return z.preventDefault(),!1;if(!W&&!l&&!K&&q)return!1;if(!y&&(z.type==="mousedown"||z.type==="touchstart"))return!1;if(Array.isArray(y)&&!y.includes(z.button)&&z.type==="mousedown")return!1;let V=Array.isArray(y)&&y.includes(z.button)||!z.button||z.button<=1;return(!z.ctrlKey||q)&&V}}function RK({domNode:f,minZoom:u,maxZoom:_,translateExtent:y,viewport:l,onPanZoom:$,onPanZoomStart:j,onPanZoomEnd:J,onDraggingChange:F}){let Q={isZoomingOrPanning:!1,usedRightMouseButton:!1,prevViewport:{x:0,y:0,zoom:0},mouseButton:0,timerId:void 0,panScrollTimeout:void 0,isPanScrolling:!1},U=f.getBoundingClientRect(),z=W6().scaleExtent([u,_]).translateExtent(y),W=C0(f).call(z);H({x:l.x,y:l.y,zoom:e3(l.zoom,u,_)},[[0,0],[U.width,U.height]],y);let K=W.on("wheel.zoom"),q=W.on("dblclick.zoom");z.wheelDelta(CK);function V(x,C){if(W)return new Promise((P)=>{z?.interpolate(C?.interpolate==="linear"?x1:Iy).transform(oJ(W,C?.duration,C?.ease,()=>P(!0)),x)});return Promise.resolve(!1)}function O({noWheelClassName:x,noPanClassName:C,onPaneContextMenu:P,userSelectionActive:D,panOnScroll:T,panOnDrag:S,panOnScrollMode:r,panOnScrollSpeed:Y,preventScrolling:v,zoomOnPinch:m,zoomOnScroll:c,zoomOnDoubleClick:o,zoomActivationKeyPressed:ff,lib:n,onTransformChange:lf,connectionInProgress:Gf,paneClickDistance:zf,selectionOnDrag:jf}){if(D&&!Q.isZoomingOrPanning)G();let Wf=T&&!ff&&!D;z.clickDistance(jf?1/0:!u1(zf)||zf<0?0:zf);let Vf=Wf?CB({zoomPanValues:Q,noWheelClassName:x,d3Selection:W,d3Zoom:z,panOnScrollMode:r,panOnScrollSpeed:Y,zoomOnPinch:m,onPanZoomStart:j,onPanZoom:$,onPanZoomEnd:J}):RB({noWheelClassName:x,preventScrolling:v,d3ZoomHandler:K});if(W.on("wheel.zoom",Vf,{passive:!1}),!D){let h=xB({zoomPanValues:Q,onDraggingChange:F,onPanZoomStart:j});z.on("start",h);let g=vB({zoomPanValues:Q,panOnDrag:S,onPaneContextMenu:!!P,onPanZoom:$,onTransformChange:lf});z.on("zoom",g);let I=bB({zoomPanValues:Q,panOnDrag:S,panOnScroll:T,onPaneContextMenu:P,onPanZoomEnd:J,onDraggingChange:F});z.on("end",I)}let Kf=hB({zoomActivationKeyPressed:ff,panOnDrag:S,zoomOnScroll:c,panOnScroll:T,zoomOnDoubleClick:o,zoomOnPinch:m,userSelectionActive:D,noPanClassName:C,noWheelClassName:x,lib:n,connectionInProgress:Gf});if(z.filter(Kf),o)W.on("dblclick.zoom",q);else W.on("dblclick.zoom",null)}function G(){z.on("zoom",null)}async function H(x,C,P){let D=sJ(x),T=z?.constrain()(D,C,P);if(T)await V(T);return new Promise((S)=>S(T))}async function Z(x,C){let P=sJ(x);return await V(P,C),new Promise((D)=>D(P))}function E(x){if(W){let C=sJ(x),P=W.property("__zoom");if(P.k!==x.zoom||P.x!==x.x||P.y!==x.y)z?.transform(W,C,null,{sync:!0})}}function L(){let x=W?U6(W.node()):{x:0,y:0,k:1};return{x:x.x,y:x.y,zoom:x.k}}function M(x,C){if(W)return new Promise((P)=>{z?.interpolate(C?.interpolate==="linear"?x1:Iy).scaleTo(oJ(W,C?.duration,C?.ease,()=>P(!0)),x)});return Promise.resolve(!1)}function N(x,C){if(W)return new Promise((P)=>{z?.interpolate(C?.interpolate==="linear"?x1:Iy).scaleBy(oJ(W,C?.duration,C?.ease,()=>P(!0)),x)});return Promise.resolve(!1)}function w(x){z?.scaleExtent(x)}function R(x){z?.translateExtent(x)}function p(x){let C=!u1(x)||x<0?0:x;z?.clickDistance(C)}return{update:O,destroy:G,setViewport:Z,setViewportConstrained:H,getViewport:L,scaleTo:M,scaleBy:N,setScaleExtent:w,setTranslateExtent:R,syncViewport:E,setClickDistance:p}}var s_;(function(f){f.Line="line",f.Handle="handle"})(s_||(s_={}));function IB({width:f,prevWidth:u,height:_,prevHeight:y,affectsX:l,affectsY:$}){let j=f-u,J=_-y,F=[j>0?1:j<0?-1:0,J>0?1:J<0?-1:0];if(j&&l)F[0]=F[0]*-1;if(J&&$)F[1]=F[1]*-1;return F}function JK(f){let u=f.includes("right")||f.includes("left"),_=f.includes("bottom")||f.includes("top"),y=f.includes("left"),l=f.includes("top");return{isHorizontal:u,isVertical:_,affectsX:y,affectsY:l}}function k_(f,u){return Math.max(0,u-f)}function i_(f,u){return Math.max(0,f-u)}function H5(f,u,_){return Math.max(0,u-f,f-_)}function FK(f,u){return f?!u:u}function cB(f,u,_,y,l,$,j,J){let{affectsX:F,affectsY:Q}=u,{isHorizontal:U,isVertical:z}=u,W=U&&z,{xSnapped:K,ySnapped:q}=_,{minWidth:V,maxWidth:O,minHeight:G,maxHeight:H}=y,{x:Z,y:E,width:L,height:M,aspectRatio:N}=f,w=Math.floor(U?K-f.pointerX:0),R=Math.floor(z?q-f.pointerY:0),p=L+(F?-w:w),x=M+(Q?-R:R),C=-$[0]*L,P=-$[1]*M,D=H5(p,V,O),T=H5(x,G,H);if(j){let Y=0,v=0;if(F&&w<0)Y=k_(Z+w+C,j[0][0]);else if(!F&&w>0)Y=i_(Z+p+C,j[1][0]);if(Q&&R<0)v=k_(E+R+P,j[0][1]);else if(!Q&&R>0)v=i_(E+x+P,j[1][1]);D=Math.max(D,Y),T=Math.max(T,v)}if(J){let Y=0,v=0;if(F&&w>0)Y=i_(Z+w,J[0][0]);else if(!F&&w<0)Y=k_(Z+p,J[1][0]);if(Q&&R>0)v=i_(E+R,J[0][1]);else if(!Q&&R<0)v=k_(E+x,J[1][1]);D=Math.max(D,Y),T=Math.max(T,v)}if(l){if(U){let Y=H5(p/N,G,H)*N;if(D=Math.max(D,Y),j){let v=0;if(!F&&!Q||F&&!Q&&W)v=i_(E+P+p/N,j[1][1])*N;else v=k_(E+P+(F?w:-w)/N,j[0][1])*N;D=Math.max(D,v)}if(J){let v=0;if(!F&&!Q||F&&!Q&&W)v=k_(E+p/N,J[1][1])*N;else v=i_(E+(F?w:-w)/N,J[0][1])*N;D=Math.max(D,v)}}if(z){let Y=H5(x*N,V,O)/N;if(T=Math.max(T,Y),j){let v=0;if(!F&&!Q||Q&&!F&&W)v=i_(Z+x*N+C,j[1][0])/N;else v=k_(Z+(Q?R:-R)*N+C,j[0][0])/N;T=Math.max(T,v)}if(J){let v=0;if(!F&&!Q||Q&&!F&&W)v=k_(Z+x*N,J[1][0])/N;else v=i_(Z+(Q?R:-R)*N,J[0][0])/N;T=Math.max(T,v)}}}if(R=R+(R<0?T:-T),w=w+(w<0?D:-D),l)if(W)if(p>x*N)R=(FK(F,Q)?-w:w)/N;else w=(FK(F,Q)?-R:R)*N;else if(U)R=w/N,Q=F;else w=R*N,F=Q;let S=F?Z+w:Z,r=Q?E+R:E;return{width:L+(F?-w:w),height:M+(Q?-R:R),x:$[0]*w*(!F?1:-1)+S,y:$[1]*R*(!Q?1:-1)+r}}var xK={width:0,height:0,x:0,y:0},pB={...xK,pointerX:0,pointerY:0,aspectRatio:1};function mB(f){return[[0,0],[f.measured.width,f.measured.height]]}function kB(f,u,_){let y=u.position.x+f.position.x,l=u.position.y+f.position.y,$=f.measured.width??0,j=f.measured.height??0,J=_[0]*$,F=_[1]*j;return[[y-J,l-F],[y+$-J,l+j-F]]}function vK({domNode:f,nodeId:u,getStoreItems:_,onChange:y,onEnd:l}){let $=C0(f),j={controlDirection:JK("bottom-right"),boundaries:{minWidth:0,minHeight:0,maxWidth:Number.MAX_VALUE,maxHeight:Number.MAX_VALUE},resizeDirection:void 0,keepAspectRatio:!1};function J({controlPosition:Q,boundaries:U,keepAspectRatio:z,resizeDirection:W,onResizeStart:K,onResize:q,onResizeEnd:V,shouldResize:O}){let G={...xK},H={...pB};j={boundaries:U,resizeDirection:W,keepAspectRatio:z,controlDirection:JK(Q)};let Z=void 0,E=null,L=[],M=void 0,N=void 0,w=void 0,R=!1,p=t$().on("start",(x)=>{let{nodeLookup:C,transform:P,snapGrid:D,snapToGrid:T,nodeOrigin:S,paneDomNode:r}=_();if(Z=C.get(u),!Z)return;E=r?.getBoundingClientRect()??null;let{xSnapped:Y,ySnapped:v}=z6(x.sourceEvent,{transform:P,snapGrid:D,snapToGrid:T,containerBounds:E});if(G={width:Z.measured.width??0,height:Z.measured.height??0,x:Z.position.x??0,y:Z.position.y??0},H={...G,pointerX:Y,pointerY:v,aspectRatio:G.width/G.height},M=void 0,Z.parentId&&(Z.extent==="parent"||Z.expandParent))M=C.get(Z.parentId),N=M&&Z.extent==="parent"?mB(M):void 0;L=[],w=void 0;for(let[m,c]of C)if(c.parentId===u){if(L.push({id:m,position:{...c.position},extent:c.extent}),c.extent==="parent"||c.expandParent){let o=kB(c,Z,c.origin??S);if(w)w=[[Math.min(o[0][0],w[0][0]),Math.min(o[0][1],w[0][1])],[Math.max(o[1][0],w[1][0]),Math.max(o[1][1],w[1][1])]];else w=o}}K?.(x,{...G})}).on("drag",(x)=>{let{transform:C,snapGrid:P,snapToGrid:D,nodeOrigin:T}=_(),S=z6(x.sourceEvent,{transform:C,snapGrid:P,snapToGrid:D,containerBounds:E}),r=[];if(!Z)return;let{x:Y,y:v,width:m,height:c}=G,o={},ff=Z.origin??T,{width:n,height:lf,x:Gf,y:zf}=cB(H,j.controlDirection,S,j.boundaries,j.keepAspectRatio,ff,N,w),jf=n!==m,Wf=lf!==c,Vf=Gf!==Y&&jf,Kf=zf!==v&&Wf;if(!Vf&&!Kf&&!jf&&!Wf)return;if(Vf||Kf||ff[0]===1||ff[1]===1){if(o.x=Vf?Gf:G.x,o.y=Kf?zf:G.y,G.x=o.x,G.y=o.y,L.length>0){let yf=Gf-Y,$f=zf-v;for(let Qf of L)Qf.position={x:Qf.position.x-yf+ff[0]*(n-m),y:Qf.position.y-$f+ff[1]*(lf-c)},r.push(Qf)}}if(jf||Wf)o.width=jf&&(!j.resizeDirection||j.resizeDirection==="horizontal")?n:G.width,o.height=Wf&&(!j.resizeDirection||j.resizeDirection==="vertical")?lf:G.height,G.width=o.width,G.height=o.height;if(M&&Z.expandParent){let yf=ff[0]*(o.width??0);if(o.x&&o.x{if(!R)return;V?.(x,{...G}),l?.({...G}),R=!1});$.call(p)}function F(){$.on(".drag",null)}return{update:J,destroy:F}}var sK=Sf(I0(),1),oK=Sf(iK(),1);var gK=(f)=>{let u,_=new Set,y=(U,z)=>{let W=typeof U==="function"?U(u):U;if(!Object.is(W,u)){let K=u;u=(z!=null?z:typeof W!=="object"||W===null)?W:Object.assign({},u,W),_.forEach((q)=>q(u,K))}},l=()=>u,F={setState:y,getState:l,getInitialState:()=>Q,subscribe:(U)=>{return _.add(U),()=>_.delete(U)},destroy:()=>{_.clear()}},Q=u=f(y,l,F);return F},nK=(f)=>f?gK(f):gK;var{useDebugValue:Fw}=sK.default,{useSyncExternalStoreWithSelector:Aw}=oK.default,Qw=(f)=>f;function NF(f,u=Qw,_){let y=Aw(f.subscribe,f.getState,f.getServerState||f.getInitialState,u,_);return Fw(y),y}var tK=(f,u)=>{let _=nK(f),y=(l,$=u)=>NF(_,l,$);return Object.assign(y,_),y},aK=(f,u)=>f?tK(f,u):tK;function Q0(f,u){if(Object.is(f,u))return!0;if(typeof f!=="object"||f===null||typeof u!=="object"||u===null)return!1;if(f instanceof Map&&u instanceof Map){if(f.size!==u.size)return!1;for(let[y,l]of f)if(!Object.is(l,u.get(y)))return!1;return!0}if(f instanceof Set&&u instanceof Set){if(f.size!==u.size)return!1;for(let y of f)if(!u.has(y))return!1;return!0}let _=Object.keys(f);if(_.length!==Object.keys(u).length)return!1;for(let y of _)if(!Object.prototype.hasOwnProperty.call(u,y)||!Object.is(f[y],u[y]))return!1;return!0}var Uw=Sf(m7(),1),x5=d.createContext(null),Ww=x5.Provider,OZ=hu.error001();function mf(f,u){let _=d.useContext(x5);if(_===null)throw Error(OZ);return NF(_,f,u)}function W0(){let f=d.useContext(x5);if(f===null)throw Error(OZ);return d.useMemo(()=>({getState:f.getState,setState:f.setState,subscribe:f.subscribe}),[f])}var dK={display:"none"},zw={position:"absolute",width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0px, 0px, 0px, 0px)",clipPath:"inset(100%)"},XZ="react-flow__node-desc",NZ="react-flow__edge-desc",Gw="react-flow__aria-live",Kw=(f)=>f.ariaLiveMessage,Zw=(f)=>f.ariaLabelConfig;function qw({rfId:f}){let u=mf(Kw);return t.jsx("div",{id:`${Gw}-${f}`,"aria-live":"assertive","aria-atomic":"true",style:zw,children:u})}function Hw({rfId:f,disableKeyboardA11y:u}){let _=mf(Zw);return t.jsxs(t.Fragment,{children:[t.jsx("div",{id:`${XZ}-${f}`,style:dK,children:u?_["node.a11yDescription.default"]:_["node.a11yDescription.keyboardDisabled"]}),t.jsx("div",{id:`${NZ}-${f}`,style:dK,children:_["edge.a11yDescription.default"]}),!u&&t.jsx(qw,{rfId:f})]})}var v5=d.forwardRef(({position:f="top-left",children:u,className:_,style:y,...l},$)=>{let j=`${f}`.split("-");return t.jsx("div",{className:Y0(["react-flow__panel",_,...j]),style:y,ref:$,...l,children:u})});v5.displayName="Panel";function Vw({proOptions:f,position:u="bottom-right"}){if(f?.hideAttribution)return null;return t.jsx(v5,{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:t.jsx("a",{href:"https://reactflow.dev",target:"_blank",rel:"noopener noreferrer","aria-label":"React Flow attribution",children:"React Flow"})})}var Ew=(f)=>{let u=[],_=[];for(let[,y]of f.nodeLookup)if(y.selected)u.push(y.internals.userNode);for(let[,y]of f.edgeLookup)if(y.selected)_.push(y);return{selectedNodes:u,selectedEdges:_}},P5=(f)=>f.id;function Ow(f,u){return Q0(f.selectedNodes.map(P5),u.selectedNodes.map(P5))&&Q0(f.selectedEdges.map(P5),u.selectedEdges.map(P5))}function Xw({onSelectionChange:f}){let u=W0(),{selectedNodes:_,selectedEdges:y}=mf(Ew,Ow);return d.useEffect(()=>{let l={nodes:_,edges:y};f?.(l),u.getState().onSelectionChangeHandlers.forEach(($)=>$(l))},[_,y,f]),null}var Nw=(f)=>!!f.onSelectionChangeHandlers;function Lw({onSelectionChange:f}){let u=mf(Nw);if(f||u)return t.jsx(Xw,{onSelectionChange:f});return null}var BF=typeof window<"u"?d.useLayoutEffect:d.useEffect,LZ=[0,0],Yw={x:0,y:0,zoom:1},Bw=["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"],eK=[...Bw,"rfId"],ww=(f)=>({setNodes:f.setNodes,setEdges:f.setEdges,setMinZoom:f.setMinZoom,setMaxZoom:f.setMaxZoom,setTranslateExtent:f.setTranslateExtent,setNodeExtent:f.setNodeExtent,reset:f.reset,setDefaultNodesAndEdges:f.setDefaultNodesAndEdges}),fZ={translateExtent:ul,nodeOrigin:LZ,minZoom:0.5,maxZoom:2,elementsSelectable:!0,noPanClassName:"nopan",rfId:"1"};function Dw(f){let{setNodes:u,setEdges:_,setMinZoom:y,setMaxZoom:l,setTranslateExtent:$,setNodeExtent:j,reset:J,setDefaultNodesAndEdges:F}=mf(ww,Q0),Q=W0();BF(()=>{return F(f.defaultNodes,f.defaultEdges),()=>{U.current=fZ,J()}},[]);let U=d.useRef(fZ);return BF(()=>{for(let z of eK){let W=f[z],K=U.current[z];if(W===K)continue;if(typeof f[z]>"u")continue;if(z==="nodes")u(W);else if(z==="edges")_(W);else if(z==="minZoom")y(W);else if(z==="maxZoom")l(W);else if(z==="translateExtent")$(W);else if(z==="nodeExtent")j(W);else if(z==="ariaLabelConfig")Q.setState({ariaLabelConfig:ZK(W)});else if(z==="fitView")Q.setState({fitViewQueued:W});else if(z==="fitViewOptions")Q.setState({fitViewOptions:W});else Q.setState({[z]:W})}U.current=f},eK.map((z)=>f[z])),null}function uZ(){if(typeof window>"u"||!window.matchMedia)return null;return window.matchMedia("(prefers-color-scheme: dark)")}function Tw(f){let[u,_]=d.useState(f==="system"?null:f);return d.useEffect(()=>{if(f!=="system"){_(f);return}let y=uZ(),l=()=>_(y?.matches?"dark":"light");return l(),y?.addEventListener("change",l),()=>{y?.removeEventListener("change",l)}},[f]),u!==null?u:uZ()?.matches?"dark":"light"}var _Z=typeof document<"u"?document:null;function H6(f=null,u={target:_Z,actInsideInputWithModifier:!0}){let[_,y]=d.useState(!1),l=d.useRef(!1),$=d.useRef(new Set([])),[j,J]=d.useMemo(()=>{if(f!==null){let Q=(Array.isArray(f)?f:[f]).filter((z)=>typeof z==="string").map((z)=>z.replace("+",` +本次任务:`,y=u.indexOf(_);if(y===-1)return f;return u.slice(y+_.length).trimStart()}function q1(f){return f.length>0?f.split(/\r\n|\r|\n/u).length:0}function mz(f){let u=String(f?.displayPrompt||"");if(u.length>0)return u;let _=String(f?.prompt||"");return PX(rX(_).userPrompt)}function Cy(f){return f?._traceSummary&&typeof f._traceSummary==="object"&&!Array.isArray(f._traceSummary)?f._traceSummary:null}function R6(f){return f?._promptDetails&&typeof f._promptDetails==="object"&&!Array.isArray(f._promptDetails)?f._promptDetails:{}}function r4(f){let u=Cy(f)?.prompt;return u&&typeof u==="object"&&!Array.isArray(u)?u:{}}function Kj(f){let u=Cy(f)?.execution;return u&&typeof u==="object"&&!Array.isArray(u)?u:{}}function kz(f){let u=r4(f),_=String(u.basePrompt||"");return _.length>0?_:mz(f)}function Zj(f){let u=Cy(f);return String(u?.finalResponse||f?.finalResponse||"").trimEnd()}function qj(f){let _=Cy(f)?.lastJudge||f?.lastJudge;return _&&typeof _==="object"&&!Array.isArray(_)?_:null}function b_(f){return f&&typeof f==="object"&&!Array.isArray(f)?f:null}function CX(f){let u=Cy(f)?.attempts;if(Array.isArray(u)&&u.length>0)return u;let _=pz(f);if(_.length>0)return _.map((j,J)=>({...j,index:Number(j?.index||J+1),execution:J===_.length-1?Kj(f):b_(j?.execution)||{},finalResponse:String(j?.finalResponse||j?.finalResponsePreview||(J===_.length-1?Zj(f):"")),judge:b_(j?.judge)||(J===_.length-1?qj(f):null)}));let y=Kj(f),$=Zj(f),l=qj(f);if(Object.keys(y).length===0&&$.length===0&&l===null)return[];return[{index:Number(f?.currentAttempt||1),mode:f?.currentMode||"initial",startedAt:f?.startedAt,finishedAt:f?.finishedAt,terminalStatus:f?.status,execution:y,finalResponse:$,finalResponseChars:$.length,judge:l}]}function RX(f,u){return b_(u?.execution)||Kj(f)}function xX(f,u){let _=String(u?.finalResponse||u?.finalResponsePreview||"");if(Object.prototype.hasOwnProperty.call(u||{},"finalResponse")||Object.prototype.hasOwnProperty.call(u||{},"finalResponsePreview"))return _.trimEnd();return _.length>0?_.trimEnd():Zj(f)}function iz(f,u){if(Object.prototype.hasOwnProperty.call(u||{},"judge"))return b_(u?.judge);return qj(f)}function gz(f){return`feedback:${String(f||"latest")}`}function vX(f,u,_){let y=String(u?.feedbackPrompt||"").trimEnd(),$=String(u?.feedbackPromptPreview||y||"").trimEnd(),l=Number(u?.feedbackPromptChars||y.length||$.length||0),j=Number(u?.feedbackPromptLines||q1(y||$));if(y.length>0||$.length>0||l>0)return{text:y,preview:$,chars:l,lines:j,source:u?.feedbackPromptSource||"judge-feedback",forAttempt:u?.feedbackPromptForAttempt||Number(_||0)+1,truncated:Boolean(u?.feedbackPromptTruncated)};let J=iz(f,u),F=String(J?.continuePrompt||"").trimEnd();if(J?.decision==="retry"&&F.length>0)return{text:"",preview:F,chars:F.length,lines:q1(F),source:"judge-continue-prompt",forAttempt:Number(_||0)+1,truncated:!1};return null}function nz(f){let u=r4(f);return Boolean(u.hasReferenceInjection||Number(u.referencePromptChars||0)>0||f?.referenceInjection||f?.referenceInjectionSummary)}function bX(f,u=null){if(u!==null&&u!==void 0){let y=(b_(f?._traceStepsByAttempt)||{})[String(u)];return Array.isArray(y)?y:[]}return Array.isArray(f?._traceSteps)?f._traceSteps:[]}function tz(f,u=null){if(u!==null&&u!==void 0){let _=b_(f?._traceStepsLoadedByAttempt)||{};return Boolean(_[String(u)])}return Boolean(f?._traceStepsLoaded)}function Hj(f){return f?._traceStepDetails&&typeof f._traceStepDetails==="object"&&!Array.isArray(f._traceStepDetails)?f._traceStepDetails:{}}function hX(f){let u=f?.timing&&typeof f.timing==="object"?f.timing:{},_=String(f?.status||"");if(["queued"].includes(_))return`等待 ${B4(u.queueWaitMs??u.totalElapsedMs)}`;if(["running","judging","retry_wait"].includes(_))return`耗时 ${B4(u.durationMs??u.totalElapsedMs)}`;return`耗时 ${B4(u.durationMs??u.totalElapsedMs)}`}function M4(f){return String(f?.queueId||"default")}function IX(f){return{system:"SYS",user:"YOU",assistant:"GPT",reasoning:"THINK",command:"CMD",diff:"DIFF",tool:"TOOL",error:"ERR"}[f]||f.toUpperCase()}function Rz(f){return["running","judging","retry_wait"].includes(String(f?.status||""))}function P1(f){return["succeeded","failed","canceled"].includes(String(f?.status||""))}function c3(f){if(!P1(f))return!1;if(f?.terminalUnread===!0)return!0;if(f?.terminalUnread===!1)return!1;return!f?.readAt}function cX(){if(typeof window>"u")return{};try{let f=JSON.parse(window.localStorage.getItem(cz)||"{}");return f&&typeof f==="object"&&!Array.isArray(f)?sz(f):{}}catch{return{}}}function sz(f){let u=Object.entries(f||{}).filter(([,_])=>typeof _==="string"&&_.length>0).sort((_,y)=>{let $=Date.parse(String(_[1]||"")),l=Date.parse(String(y[1]||""));return(Number.isFinite(l)?l:0)-(Number.isFinite($)?$:0)}).slice(0,AX);return Object.fromEntries(u)}function pX(f){let u=sz(f);if(typeof window>"u")return u;try{window.localStorage.setItem(cz,JSON.stringify(u))}catch{}return u}function Qj(f,u){let _=String(f?.id||""),y=String(u?.[_]||"");if(!P1(f)||y.length===0)return f;return{...f,readAt:f?.readAt||y,terminalUnread:!1}}function x6(f){let u=Number(f||0);return Number.isFinite(u)?u:0}function mX(f){return x6(f.queued)+x6(f.retry_wait)}function kX(f){return x6(f.running)+x6(f.judging)}function xz(f){if(c3(f))return 0;return{running:1,judging:2,retry_wait:3,queued:4,succeeded:8,failed:8,canceled:8}[String(f?.status||"")]??9}function P6(f){if(!f)return!1;if(f?._traceSummaryLoaded===!0)return!1;return f?.summaryOnly===!0||f?._metaLoaded!==!0}function iX(f){return Boolean(f?._metaLoaded)||f?.summaryOnly===!1}function gX(f,u,_){let y=String(f?.[_]||""),$=String(u?.[_]||"");return y.length>$.length?y:$}function Ej(f,u,_){let y=Array.isArray(f?.[_])?f[_]:[],$=Array.isArray(u?.[_])?u[_]:[];if($.length===0&&y.length>0)return y;return y.length>$.length?y:$}function nX(f,u){let _=u?.summaryOnly===!0&&iX(f),y={...f,...u};if(!_)return y;for(let $ of["prompt","basePrompt","displayPrompt","finalResponse"])y[$]=gX(f,u,$);for(let $ of["promptHistory","attempts","output","events"])y[$]=Ej(f,u,$);if(f?.referenceInjection?.items&&!u?.referenceInjection?.items)y.referenceInjection=f.referenceInjection;if(f?.referenceInjectionSummary&&!u?.referenceInjectionSummary)y.referenceInjectionSummary=f.referenceInjectionSummary;y.summaryOnly=f?.summaryOnly===!1?!1:u.summaryOnly,y._metaLoaded=f?._metaLoaded,y._detailLoaded=f?._detailLoaded,y._transcriptComplete=f?._transcriptComplete,y._transcriptPreview=Object.prototype.hasOwnProperty.call(u,"_transcriptPreview")?u._transcriptPreview:f?._transcriptPreview;for(let $ of["_traceSummary","_traceSummaryLoaded","_traceSteps","_traceStepsLoaded","_traceStepsByAttempt","_traceStepsLoadedByAttempt","_traceStepDetails","_promptDetails"])if(!Object.prototype.hasOwnProperty.call(u,$)&&Object.prototype.hasOwnProperty.call(f||{},$))y[$]=f[$];return y}function tX(f){let u=f?.selected,_=u?.task&&typeof u.task==="object"?u.task:null;if(_!==null){let $=Boolean(u?.preview);return{..._,transcript:Array.isArray(u?.transcript)?u.transcript:[],_detailLoaded:Array.isArray(u?.transcript)&&u.transcript.length>0,_transcriptComplete:Boolean(!$&&!u?.hasMore&&P1(_)),_transcriptPreview:$,_summaryLoaded:!0}}let y=Z1(f)[0];return y?{...y,_summaryLoaded:!0}:null}function Aj(f,u){let _=new Map;for(let y of[...Array.isArray(f)?f:[],...Array.isArray(u)?u:[]]){let $=`${Number(y?.seq??0)}:${String(y?.kind||"message")}`,l=_.get($);if(!l){_.set($,y);continue}let j={...l,...y};for(let[J,F]of[["bodyPreview","bodyOmittedLines"],["commandPreview","commandOmittedLines"]]){let A=String(l?.[J]||""),U=String(y?.[J]||"");if(A.length>U.length)j[J]=l[J],j[F]=l[F]}_.set($,j)}return Array.from(_.values()).sort((y,$)=>Number(y?.seq??0)-Number($?.seq??0))}function Y4(f){return(Array.isArray(f)?f:[]).reduce((u,_)=>Math.max(u,Number(_?.seq??0)),0)}function vz(f,u=8){let _=Array.from(new Set((Array.isArray(f)?f:[]).map(($)=>Number($?.seq??0)).filter(($)=>Number.isFinite($)&&$>0))).sort(($,l)=>$-l);if(_.length===0)return 0;let y=_[Math.max(0,_.length-u)]??0;return Math.max(0,y-0.001)}function Uj(f,u){let _=Number(f[u]??0);return Number.isFinite(_)?String(_):"0"}function sX(f,u){let _=Array.isArray(f?.codexModels)?f.codexModels:[],y=["gpt-5.5","gpt-5.4-mini","gpt-5.4"];return Array.from(new Set([..._,...y,u].map(($)=>String($||"").trim()).filter(Boolean)))}function oX({task:f,selected:u,onSelect:_,onCopy:y,onReference:$,onMarkRead:l,copied:j,markingRead:J}){let F=f?.lastJudge||{},A=String(f?.id||""),U=c3(f);return B("article",{role:"button",tabIndex:0,className:`codex-task-card ${u?"selected":""} ${U?"unread-terminal":""}`,onClick:_,onKeyDown:(z)=>{if(z.key==="Enter"||z.key===" ")z.preventDefault(),_()},"data-unread-terminal":U?"true":"false","data-testid":`codex-task-${f?.id||"unknown"}`},U?B("span",{className:"codex-unread-badge",title:"待读","aria-label":"待读","data-testid":`codex-unread-task-${A||"unknown"}`}):null,B("div",{className:"codex-task-card-head"},B("div",{className:"codex-task-status-line"},B(y_,{status:f?.status},f?.status||"unknown")),B("span",{className:"mono-text"},`${f?.currentAttempt||0}/${f?.maxAttempts||0}`)),B("div",{className:"codex-task-id-row"},B("code",{title:A},A||"unknown"),B("div",{className:"codex-task-id-actions"},B("button",{type:"button",className:"codex-copy-id-btn",onClick:(z)=>{z.stopPropagation(),$(A)},"data-testid":`codex-reference-task-${A||"unknown"}`},"引用"),B("button",{type:"button",className:"codex-copy-id-btn",onClick:(z)=>{z.stopPropagation(),y(A)},"data-testid":`codex-copy-task-id-${A||"unknown"}`},j?"已复制":"复制ID"),U?B("button",{type:"button",className:"codex-copy-id-btn codex-mark-read-btn",disabled:Boolean(J),onClick:(z)=>{z.stopPropagation(),l(A)},"data-testid":`codex-mark-task-read-${A||"unknown"}`},J?"标记中":"标为已读"):null)),B("strong",null,hz(mz(f),120)||"空任务"),B("div",{className:"codex-task-meta"},B("span",null,`queue=${M4(f)}`),B("span",null,f?.model||"--"),B("span",null,hX(f))),B("div",{className:"codex-task-meta"},B("span",null,Py(f?.updatedAt))),F?.decision?B("div",{className:"codex-judge-line"},`judge=${F.decision} ${Math.round(Number(F.confidence||0)*100)}%`):null)}function Wj({title:f,tasks:u,selectedId:_,onSelect:y,onCopy:$,onReference:l,onMarkRead:j,copiedTaskId:J,markingReadTaskId:F,emptyText:A}){let U=Array.isArray(u)?u:[];return B("section",{className:"codex-task-section"},B("div",{className:"codex-task-section-head"},B("span",null,f),B("code",null,String(U.length))),U.length===0?B("p",{className:"codex-task-section-empty"},A):B("div",{className:"codex-task-section-list"},U.map((z)=>B(oX,{key:z.id,task:z,selected:_===z.id,onSelect:()=>y(z.id),onCopy:$,onReference:l,onMarkRead:j,copied:J===z.id,markingRead:F===z.id}))))}function aX({task:f,queueRows:u,busy:_,onMove:y}){let $=String(f?.id||""),l=M4(f),[j,J]=df(l);C6(()=>{J(l)},[$,l]);let F=!$||_||["running","judging","retry_wait"].includes(String(f?.status||""));return B("div",{className:"codex-task-move-control","data-testid":"codex-task-queue-move-control"},B("label",null,"任务 queue",B("select",{value:j,disabled:!$||_,onChange:(A)=>J(String(A.target.value||l)),"data-testid":"codex-task-queue-move-select"},u.map((A)=>B("option",{key:String(A?.id||""),value:String(A?.id||"")},Gj(A))))),B("button",{type:"button",className:"ghost-btn",disabled:F||j===l,onClick:()=>y(j),title:F?"运行中 / judging / retry_wait 的任务不能移动;请先打断或等当前 turn 结束":"移动已创建任务到另一个 queue","data-testid":"codex-task-queue-move-button"},"移动"))}function bz(f,u=4){let _=(Array.isArray(f)?f:[]).map(($)=>String($||"").trim()).filter(Boolean);if(_.length===0)return"--";let y=_.slice(0,u).join(" / ");return _.length>u?`${y} +${_.length-u}`:y}function dX({task:f,loading:u,onLoadPromptPart:_,testId:y="codex-initial-prompt-full",textTestId:$="codex-initial-prompt-full-text",baseTextTestId:l="codex-initial-prompt-base"}){let j=r4(f),J=R6(f),F=kz(f).trimEnd(),A=String(J.full?.text||""),U=nz(f),z=Number(j.promptChars||f?.promptChars||A.length),W=Number(j.basePromptLines||q1(F)),K=Number(j.promptLines||q1(A));return B("section",{className:"codex-progressive-card codex-progressive-prompt","data-testid":"codex-progressive-prompt"},B("div",{className:"codex-progressive-card-head"},B("span",{className:"codex-output-channel"},"Prompt"),B("strong",null,"Submitted prompt / 原始用户 prompt"),B("code",null,`${W||q1(F)} lines / ${F.length} chars`)),B("pre",{className:"codex-prompt-full","data-testid":l},F||"空 prompt"),U?B("details",{className:"codex-reference-injection codex-progressive-full-prompt","data-testid":y,onToggle:(q)=>{if(q.currentTarget?.open&&!A)_?.("full")}},B("summary",null,B("span",null,"引用注入已折叠,点击按需拉取最终进入 opencode 的完整 prompt"),B("code",null,A?`${K||q1(A)} lines / ${A.length} chars`:`${Number.isFinite(z)&&z>0?z:"--"} chars`)),B("pre",{className:"codex-prompt-full codex-prompt-final-full","data-testid":$},A||(u?"正在按需拉取完整 prompt...":"展开后将只请求 full prompt,不拉取完整 transcript。"))):null)}function oz({task:f,attempt:u,attemptIndex:_,loading:y,onLoadSteps:$,onLoadStep:l,testId:j="codex-execution-summary"}){let J=RX(f,u),F=bX(f,_),A=Hj(f),U=tz(f,_),z=Number(J.toolCallCount||0),W=Array.isArray(J.editedFiles)?J.editedFiles:[],K=Array.isArray(J.commands)?J.commands:[],q=_?` #${_}`:"";return B("details",{className:"codex-progressive-card codex-execution-summary","data-testid":j,"data-attempt-index":_?String(_):void 0,onToggle:(E)=>{if(E.currentTarget?.open&&!U)$?.(_)}},B("summary",null,B("div",{className:"codex-progressive-card-head"},B("span",{className:"codex-output-channel"},"Summary"),B("strong",null,`执行过程摘要${q}`),B("code",null,`${B4(J.durationMs??J.totalElapsedMs)} / ${z} tools`)),B("div",{className:"codex-execution-digest"},B("span",null,`read ${Number(J.readCount||0)}`),B("span",null,`edit ${Number(J.editCount||0)}`),B("span",null,`run ${Number(J.runCount||0)}`),B("span",null,`${Number(J.stepCount||F.length||0)} steps`))),B("div",{className:"codex-execution-digest expanded"},B("span",null,`修改文件:${bz(W,6)}`),B("span",null,`执行命令:${bz(K,4)}`)),F.length===0?B("div",{className:"codex-output-empty"},y?"正在按需拉取步骤 summary...":"展开后将只请求执行步骤 summary,不拉取单步骤全量。"):B("div",{className:"codex-trace-step-list"},F.map((E)=>{let O=String(E?.seq??""),G=A[O],H=Array.isArray(E?.summaryLines)?E.summaryLines.slice(0,4):[];return B("details",{key:O||`${E?.title}-${E?.at}`,className:`codex-trace-step ${String(E?.kind||"message")}`,"data-testid":`codex-trace-step-${O||"unknown"}`,onToggle:(Z)=>{if(Z.currentTarget?.open&&!G)l?.(E?.seq)}},B("summary",null,B("span",{className:"codex-output-channel"},eX(E?.kind)),B("strong",null,String(E?.title||"Trace step")),E?.status?B("code",null,String(E.status)):null,B("time",null,Py(E?.at))),B("div",{className:"codex-trace-step-summary"},H.length>0?H.map((Z,V)=>B("pre",{key:`${O}-${V}`},String(Z||""))):B("span",null,"无 summary")),G?.line?B(X4,{items:[G.line],autoScroll:!1,loading:!1,hasDetail:!0,emptyText:"无步骤详情",testId:`codex-trace-step-detail-${O||"unknown"}`,className:"codex-transcript codex-step-detail-transcript",collapseTools:!1}):B("div",{className:"codex-output-empty"},y?"正在按需拉取这个步骤的全量数据...":"展开后将只请求这个单步骤的全量数据。"))})))}function eX(f){let u=String(f||"");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 az({task:f,attempt:u,attemptIndex:_,testId:y="codex-final-response"}){let $=xX(f,u),l=Number(u?.finalResponseChars||$.length),j=_?` #${_}`:"";return B("section",{className:"codex-progressive-card codex-final-response","data-testid":y,"data-attempt-index":_?String(_):void 0},B("div",{className:"codex-progressive-card-head"},B("span",{className:"codex-output-channel"},"Final"),B("strong",null,`最终 response${j}`),B("code",null,`${Number.isFinite(l)?l:$.length} chars`)),B("pre",{className:"codex-transcript-body"},$||"暂无最终 response"))}function dz({task:f,attempt:u,attemptIndex:_,testId:y="codex-progressive-judge"}){let $=iz(f,u),l=_?` #${_}`:"";return B("section",{className:"codex-progressive-card codex-progressive-judge","data-testid":y,"data-attempt-index":_?String(_):void 0},B("div",{className:"codex-progressive-card-head"},B("span",{className:"codex-output-channel"},"Judge"),B("strong",null,`完成判定${l}`),$?.decision?B("code",null,`${$.decision} ${Math.round(Number($.confidence||0)*100)}%`):null),$?B("div",{className:"codex-judge-card","data-testid":`${y}-card`},B(y_,{status:$.decision},$.decision),B("strong",null,`${Math.round(Number($.confidence||0)*100)}% confidence`),B("p",{"data-testid":`${y}-reason`},$.reason||"--"),$.continuePrompt?B("pre",{"data-testid":`${y}-continue-prompt`},String($.continuePrompt||"")):null):B("div",{className:"codex-output-empty"},"尚未判定"))}function fN({task:f,attempt:u,attemptIndex:_,loading:y,onLoadPromptPart:$,testId:l="codex-judge-feedback-prompt"}){let j=vX(f,u,_);if(j===null)return null;let J=gz(_),A=R6(f)[J],U=String(A?.text||"").trimEnd(),z=String(j.preview||j.text||"").trimEnd(),W=U||String(j.text||"").trimEnd(),K=Number(A?.chars||j.chars||W.length||z.length),q=Number(A?.lines||j.lines||q1(W||z)),E=A?.forAttempt||j.forAttempt||Number(_||0)+1;return B("details",{className:"codex-progressive-card codex-judge-feedback-prompt","data-testid":l,"data-attempt-index":_?String(_):void 0,onToggle:(O)=>{if(O.currentTarget?.open&&!U)$?.("feedback",_)}},B("summary",null,B("div",{className:"codex-progressive-card-head"},B("span",{className:"codex-output-channel"},"Prompt"),B("strong",null,`judge feedback prompt #${_} -> #${E}`),B("code",null,`${q||"--"} lines / ${Number.isFinite(K)?K:z.length} chars`)),B("p",{className:"codex-feedback-preview","data-testid":`${l}-preview`},z||"展开后按需拉取 judge feedback prompt。")),B("pre",{className:"codex-prompt-full codex-feedback-full","data-testid":`${l}-text`},W||(y?"正在按需拉取 judge feedback prompt...":"展开后将只请求这一次 judge feedback prompt。")))}function uN({task:f,attempt:u,position:_,loading:y,onLoadPromptPart:$,onLoadSteps:l,onLoadStep:j}){let J=Number(u?.index||_+1),F=_===0;return B("section",{className:"codex-attempt-cycle","data-testid":`codex-attempt-cycle-${J}`},B("div",{className:"codex-attempt-cycle-head"},B("span",{className:"codex-output-channel"},`Attempt ${J}`),B("strong",null,String(u?.mode||(J<=1?"initial":"retry"))),u?.terminalStatus?B(y_,{status:u.terminalStatus},u.terminalStatus):null,B("code",null,`${Py(u?.startedAt)} -> ${Py(u?.finishedAt)}`)),B(oz,{task:f,attempt:u,attemptIndex:J,loading:y,onLoadSteps:l,onLoadStep:j,testId:F?"codex-execution-summary":`codex-execution-summary-attempt-${J}`}),B(az,{task:f,attempt:u,attemptIndex:J,testId:F?"codex-final-response":`codex-final-response-attempt-${J}`}),B(dz,{task:f,attempt:u,attemptIndex:J,testId:F?"codex-progressive-judge":`codex-progressive-judge-attempt-${J}`}),B(fN,{task:f,attempt:u,attemptIndex:J,loading:y,onLoadPromptPart:$,testId:F?"codex-judge-feedback-prompt":`codex-judge-feedback-prompt-attempt-${J}`}))}function _N({task:f,loading:u,onLoadPromptPart:_,onLoadSteps:y,onLoadStep:$}){if(!f)return B(ry,{title:"未选择任务",text:"从左侧队列选择任务,或提交新 Codex 任务。"});let l=CX(f);return B("div",{className:"codex-transcript codex-progressive-trace","data-testid":"codex-output"},u&&!Cy(f)?B("div",{className:"codex-output-empty"},"正在加载 Trace Summary..."):null,B(dX,{task:f,loading:u,onLoadPromptPart:_}),l.length>0?l.map((j,J)=>B(uN,{key:`${j?.index||J+1}-${j?.startedAt||J}`,task:f,attempt:j,position:J,loading:u,onLoadPromptPart:_,onLoadSteps:y,onLoadStep:$})):[B(oz,{key:"execution",task:f,loading:u,onLoadSteps:y,onLoadStep:$}),B(az,{key:"final",task:f}),B(dz,{key:"judge",task:f})])}function yN({task:f,loading:u,onLoadPromptPart:_}){if(!f)return B(ry,{title:"未选择任务",text:"选择队列或历史 session 后,这里显示完整 prompt、模型和工作目录。"});let y=r4(f),$=R6(f),l=kz(f).trimEnd(),j=String($.full?.text||""),J=nz(f),F=Number(y.basePromptLines||q1(l)),A=Number(y.promptLines||q1(j)),U=Number(y.referencePromptLines||0),z=Number(y.promptChars||f?.promptChars||j.length);return B("div",{className:"codex-prompt-detail","data-testid":"codex-task-prompt-detail"},B("div",{className:"codex-prompt-meta"},B(y_,{status:f?.status},f?.status||"unknown"),B("span",null,`model=${f?.model||"--"}`),B("span",null,`cwd=${f?.cwd||"--"}`),B("span",null,`created=${Py(f?.createdAt)}`),B("span",null,J?`task ${F} lines / total ${Number.isFinite(A)&&A>0?A:"--"} lines`:`${F} lines / ${l.length} chars`)),B("div",{className:"codex-lazy-detail-callout","data-testid":"codex-task-summary-callout"},B("div",null,B("strong",null,"渐进式 Trace"),B("span",null,"首屏使用后端 Summary;展开 prompt / 步骤时只按需拉取对应片段,不一次性拉取完整 transcript。"))),J?B("details",{className:"codex-reference-injection codex-final-prompt-injection","data-testid":"codex-final-prompt-full",onToggle:(W)=>{if(W.currentTarget?.open&&!j)_?.("full")}},B("summary",null,B("span",null,"最终传入 Codex 的真实完整 prompt"),B("code",null,j?`${A||q1(j)} lines / ${j.length} chars`:`${Number.isFinite(z)&&z>0?z:"--"} chars`)),B("pre",{className:"codex-prompt-full codex-prompt-final-full","data-testid":"codex-task-final-prompt-full"},j||(u?"正在按需拉取完整 prompt...":"展开后将只请求完整 prompt。"))):null,J?B("details",{className:"codex-reference-injection","data-testid":"codex-reference-injection",onToggle:(W)=>{if(W.currentTarget?.open&&!$.reference?.text)_?.("reference")}},B("summary",null,B("span",null,"引用注入已折叠"),B("code",null,$.reference?.text?`${q1(String($.reference.text||""))} lines / ${String($.reference.text||"").length} chars`:`${U||"--"} lines`)),B("pre",{className:"codex-prompt-full codex-prompt-reference-full","data-testid":"codex-task-reference-full"},String($.reference?.text||"")||(u?"正在按需拉取引用注入...":"展开后将只请求引用注入片段。"))):null,B("pre",{className:"codex-prompt-full","data-testid":"codex-task-prompt-full"},l||"空 prompt"))}function $N({task:f}){let u=TX(f);if(!f||u.length===0)return B(ry,{title:"暂无原始消息",text:"原始 Codex app-server 消息会保留在任务 JSON 中。"});return B("details",{className:"codex-raw-output"},B("summary",null,`原始 messages (${u.length})`),B("div",null,u.map((_)=>B("article",{key:`${_.seq}-${_.channel}`,className:`codex-output-line ${_.channel||"system"}`},B("div",{className:"codex-output-meta"},B("span",{className:"codex-output-channel"},IX(String(_.channel||"system"))),B("span",null,Py(_.at)),_.method?B("code",null,_.method):null),B("pre",null,String(_.text||""))))))}function lN({task:f}){let u=pz(f).slice().reverse();if(u.length===0)return B(ry,{title:"尚无 attempt",text:"任务开始运行后,这里会记录 Codex 终态、传输中断和 stderr tail。"});return B("div",{className:"table-wrap codex-attempt-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,u.map((_)=>B("tr",{key:`${_.index}-${_.startedAt}`},B("td",null,_.index),B("td",null,_.mode),B("td",null,B(y_,{status:_.terminalStatus||"unknown"},_.terminalStatus||"unknown")),B("td",null,_.transportClosedBeforeTerminal?B(y_,{status:"failed"},"closed-before-terminal"):B(y_,{status:"succeeded"},"normal")),B("td",null,`code=${_.appServerExitCode??"--"} signal=${_.appServerSignal??"--"}`),B("td",null,Py(_.finishedAt)))))))}function ez({microservices:f,onRaw:u,apiBaseUrl:_="/api",initialTasksData:y=null,standalone:$=!1}){let l=f.find((k)=>k.id==="codex-queue")||null,j=tX(y),J=String(j?.id||""),F=new Map;if(j!==null&&J.length>0)F.set(J,{task:j,maxSeq:Y4(Array.isArray(j.transcript)?j.transcript:[]),complete:Boolean(j._transcriptComplete),completeUpdatedAt:j._transcriptComplete?String(j.updatedAt||""):""});let A=typeof performance>"u"?0:performance.now(),U=Zu(J),z=Zu(0),W=Zu(0),K=Zu(!1),q=Zu(!1),E=Zu(null),O=Zu(new Map),G=Zu(new Map),H=Zu(new Map),Z=Zu(new Map),V=Zu(new Set),L=Zu(!1),M=Zu(Boolean(y)),N=Zu(F),D=Zu(y),[x,c]=df(null),[v,C]=df(y),[P,w]=df(J),[r,S]=df(j),[T,Y]=df(!1),[R,m]=df(""),[p,n]=df(""),[_f,t]=df("default"),[ff,Gf]=df(v_),[zf,jf]=df("gpt-5.5"),[Wf,Vf]=df("/root/unidesk"),[Zf,h]=df(99),[g,I]=df(1),[$f,lf]=df(!1),[Af,Yf]=df(!1),[xf,sf]=df(""),[j0,u0]=df(!0),[D0,Fu]=df(()=>typeof window>"u"?!0:window.matchMedia(qX).matches),[O0,x0]=df(!1),[ku,X0]=df(""),[Qu,uf]=df(""),[vf,a0]=df(""),[Bf,v0]=df(""),[i0,d0]=df(!1),[b0,m1]=df(cX),[ef,iu]=df(y?{phase:"complete",taskId:J,queueMs:0,detailMs:0,totalMs:A,chunks:j?1:0,transcriptRows:Array.isArray(j?.transcript)?j.transcript.length:0,partial:Boolean(y?.selected?.hasMore||P6(j)),completedAt:new Date}:null),[f3,u3]=df(y?new Date:null),[s,Of]=df(!1),qf=Z1(v).map((k)=>Qj(k,b0)),Cf=qf.filter(c3),_0=qf.filter((k)=>!P1(k)),G0=qf.filter((k)=>P1(k)&&!c3(k)),If=v?.queue||x?.body?.queue||x?.queue||{},h0=r6(v),Au=rz(If,_f),xl=T4(Au,ff),L1=Number((vu(ff)?If?.total:xl?.total)??h0.total??qf.length),vl=h0.hasMore===!0&&String(h0.nextBeforeId||"").length>0,_3=w4(If),y3=vu(ff)?_3:[String(T4(Au,ff)?.activeTaskId||"")].filter(Boolean),ly=Pz(If,Au,ff,qf),W_=vu(ff)?Fj(If):Fj(xl||{}),bl=Fj(If),Z2=mX(bl),hl=Math.max(kX(bl),_3.length),k1=x6(If?.unreadTerminal??Cf.length),jy=vu(ff)?"All queues":ff,Il=l?zX(l):{},q2=l?KX(l):{},V$=l?GX(l):{},O$=Dz(()=>MX(R),[R]),j1=Dz(()=>{let k=Cz(g);return O$.flatMap((a)=>Array.from({length:k},()=>SX(a,p)))},[O$,g,p]),Jy=j1.length,X$=Jy>1&&!$f,H2=Af||O0||Jy===0||X$,cl=sX(If,zf),N$=r?.id&&r?.activeTurnId&&String(r?.status)==="running",E2=r?.id&&!["succeeded","failed","canceled"].includes(String(r?.status||"")),V2=r?.id&&["succeeded","failed","canceled"].includes(String(r?.status||""));function i1(k){let a=typeof k==="function"?k(D.current):k;return D.current=a,C(a),a}function pl(k,a,Qf=null,Kf=null){let Df=new Set(k.map((Xf)=>String(Xf||"")).filter(Boolean));if(Df.size===0&&Kf===null&&Qf===null)return;i1((Xf)=>{if(!Xf)return Xf;let Sf=Z1(Xf).map((Rf)=>{let cf=String(Rf?.id||"");if(!Df.has(cf))return Rf;let nf=Kf&&String(Kf?.id||"")===cf?Kf:{};return{...Rf,...nf,readAt:a,terminalUnread:!1}});return{...Xf,queue:Qf||Xf.queue,tasks:Df.size>0?N4([Sf],ly):Sf}});for(let Xf of Df){let Sf=N.current.get(Xf);if(Sf?.task){let Rf=Kf&&String(Kf?.id||"")===Xf?Kf:{},cf={...Sf.task,...Rf,readAt:a,terminalUnread:!1};if(N.current.set(Xf,{...Sf,task:cf}),U.current===Xf)S(cf)}}}function L$(k,a){let Qf=k.map((Kf)=>String(Kf||"")).filter(Boolean);if(Qf.length===0)return;m1((Kf)=>{let Df={...Kf||{}};for(let Xf of Qf)Df[Xf]=a;return pX(Df)})}C6(()=>{lf(!1)},[R,g,p]);function Y1(k,a,Qf){let Kf=N.current.get(k)||{},Df=Kf.task||{},Xf=Array.isArray(Df.transcript)?Df.transcript:[],Sf=nX(Df,a),Rf=Object.prototype.hasOwnProperty.call(a,"transcript")?Aj(Xf,Array.isArray(a.transcript)?a.transcript:[]):Xf,cf={...Df,...Sf,transcript:Rf,output:Array.isArray(Sf.output)?Ej(Df,Sf,"output"):Array.isArray(Df.output)?Df.output:[],events:Array.isArray(Sf.events)?Ej(Df,Sf,"events"):Array.isArray(Df.events)?Df.events:[]},nf=String(cf?.updatedAt||""),of=Boolean(a._transcriptComplete)&&P1(cf),J0=Boolean(Kf.complete)&&P1(cf)&&String(Kf.completeUpdatedAt||"")===nf,e0=of||J0,J1={...Kf,task:cf,maxSeq:Y4(Rf),complete:e0,completeUpdatedAt:e0?nf:""};if(N.current.set(k,J1),Qf===W.current&&U.current===k)S(cf);return J1}async function Y$(k,a=!1,Qf,Kf){if(!l||!k)return;let Xf=N.current.get(k)?.task,Sf=String(Xf?._traceSummaryUpdatedAt||""),Rf=String(Xf?.updatedAt||"");if(!a&&Xf?._traceSummaryLoaded===!0&&Sf===Rf)return;let cf=k,nf=O.current.get(cf);if(nf)return nf;let of=W.current,J0=performance.now();if(U.current===k)Y(!0);let e0=(async()=>{try{let J1=await NX(_,k);if(of!==W.current||U.current!==k)return;let N0=J1?.summary||{};Y1(k,{id:k,status:N0.status,updatedAt:N0.updatedAt,startedAt:N0.startedAt,finishedAt:N0.finishedAt,currentAttempt:N0.currentAttempt,maxAttempts:N0.maxAttempts,finalResponse:N0.finalResponse,lastJudge:N0.lastJudge,lastError:N0.lastError,attempts:Array.isArray(N0.attempts)?N0.attempts:[],timing:N0.timing,_traceSummary:N0,_traceSummaryLoaded:!0,_traceSummaryUpdatedAt:String(N0.updatedAt||""),_detailLoaded:!0},of),iu({phase:"complete",taskId:k,queueMs:Kf??0,detailMs:performance.now()-J0,totalMs:Qf===void 0?performance.now()-J0:performance.now()-Qf,chunks:1,transcriptRows:Number(N0?.execution?.stepCount||0),partial:!1,completedAt:new Date})}finally{if(O.current.delete(cf),of===W.current&&U.current===k)Y(!1)}})();O.current.set(cf,e0),await e0}async function ml(k,a=null){let Qf=U.current;if(!l||!Qf||!k)return;let Kf=N.current.get(Qf)?.task,Df=R6(Kf),Xf=k==="feedback"||k==="judge-feedback"?gz(a):k;if(Df[Xf]?.text)return;let Sf=`${Qf}:${Xf}`,Rf=G.current.get(Sf);if(Rf)return Rf;let cf=W.current;if(U.current===Qf)Y(!0);let nf=(async()=>{try{let of=await LX(_,Qf,k,a);if(cf!==W.current||U.current!==Qf)return;let J0=N.current.get(Qf)?.task,e0=R6(J0);Y1(Qf,{...k==="full"?{prompt:String(of?.text||""),promptChars:Number(of?.chars||0)}:{},_promptDetails:{...e0,[Xf]:of}},cf)}finally{if(G.current.delete(Sf),cf===W.current&&U.current===Qf)Y(!1)}})();G.current.set(Sf,nf),await nf}async function O2(k=null){let a=U.current;if(!l||!a)return;let Qf=N.current.get(a)?.task,Kf=k===null||k===void 0||String(k).length===0?"":String(k);if(tz(Qf,Kf||null))return;let Df=`${a}:${Kf||"all"}`,Xf=H.current.get(Df);if(Xf)return Xf;let Sf=W.current;if(U.current===a)Y(!0);let Rf=(async()=>{try{let cf=await YX(_,a,0,500,Kf||null);if(Sf!==W.current||U.current!==a)return;let nf=Array.isArray(cf?.steps)?cf.steps:[];if(Kf){let of=N.current.get(a)?.task,J0=b_(of?._traceStepsByAttempt)||{},e0=b_(of?._traceStepsLoadedByAttempt)||{};Y1(a,{_traceStepsByAttempt:{...J0,[Kf]:nf},_traceStepsLoadedByAttempt:{...e0,[Kf]:!0}},Sf)}else Y1(a,{_traceSteps:nf,_traceStepsLoaded:!0,_traceStepsHasMore:Boolean(cf?.hasMore),_traceStepsNextAfterSeq:cf?.nextAfterSeq},Sf)}finally{if(H.current.delete(Df),Sf===W.current&&U.current===a)Y(!1)}})();H.current.set(Df,Rf),await Rf}async function X2(k){let a=U.current,Qf=String(k??"");if(!l||!a||Qf.length===0)return;let Kf=N.current.get(a)?.task;if(Hj(Kf)[Qf]?.line)return;let Xf=`${a}:${Qf}`,Sf=Z.current.get(Xf);if(Sf)return Sf;let Rf=W.current;if(U.current===a)Y(!0);let cf=(async()=>{try{let nf=await BX(_,a,k);if(Rf!==W.current||U.current!==a)return;let of=N.current.get(a)?.task,J0=Hj(of);Y1(a,{_traceStepDetails:{...J0,[Qf]:nf}},Rf)}finally{if(Z.current.delete(Xf),Rf===W.current&&U.current===a)Y(!1)}})();Z.current.set(Xf,cf),await cf}async function ZQ(k,a,Qf){if(!l||!k)return;let Kf=performance.now(),Df=W.current,Xf=N.current.get(k);if(Xf?.task){if(S(Xf.task),Y(P6(Xf.task)||!Xf.complete),!P6(Xf.task)&&Xf.complete&&P1(Xf.task)&&String(Xf.completeUpdatedAt||"")===String(Xf.task?.updatedAt||"")){iu({phase:"complete",taskId:k,queueMs:Qf??0,detailMs:0,totalMs:a===void 0?0:performance.now()-a,chunks:0,transcriptRows:Array.isArray(Xf.task.transcript)?Xf.task.transcript.length:0,completedAt:new Date});return}}else Y(!0);let Sf=E.current;if(Sf?.taskId===k&&Sf.token===Df)return Sf.promise;let Rf=(async()=>{try{let cf=await M0(S0(_,`/api/tasks/${encodeURIComponent(k)}?meta=1`));if(Df!==W.current||U.current!==k)return;let nf=N.current.get(k),of=Array.isArray(nf?.task?.transcript)?nf.task.transcript:[],J0=cf?.task||{},e0=Boolean(nf?.complete)&&String(nf?.completeUpdatedAt||"")===String(J0?.updatedAt||"");Y1(k,{...J0,summaryOnly:!1,_metaLoaded:!0,transcript:of,_detailLoaded:of.length>0,_transcriptComplete:e0},Df);let J1=P6(nf?.task)||Boolean(nf?.task?._transcriptPreview),N0=J1?0:of.length>0?vz(of):0,z_=!J1&&nf?.complete&&P1(J0)&&String(nf?.completeUpdatedAt||"")===String(J0?.updatedAt||"")?Y4(of):N0,l3=!0,nl=0,tl=of.length;while(l3){let nu=await M0(S0(_,`/api/tasks/${encodeURIComponent(k)}/transcript?afterSeq=${encodeURIComponent(String(z_))}&limit=${FX}&fullText=1`));if(Df!==W.current||U.current!==k)return;let B1=N.current.get(k),Fy=Array.isArray(B1?.task?.transcript)?B1.task.transcript:[],Qy=Aj(Fy,Array.isArray(nu?.transcript)?nu.transcript:[]);nl+=1,tl=Qy.length;let g0=Boolean(!nu?.hasMore);if(Y1(k,{status:nu?.status||J0.status,updatedAt:nu?.updatedAt||J0.updatedAt,transcript:Qy,_detailLoaded:g0||Qy.length>0,_transcriptComplete:g0,_transcriptPreview:J1&&!g0},Df),l3=Boolean(nu?.hasMore),z_=Number(nu?.nextAfterSeq??Y4(Qy)),!l3)break;await new Promise((XQ)=>window.setTimeout(XQ,0))}iu({phase:"complete",taskId:k,queueMs:Qf??0,detailMs:performance.now()-Kf,totalMs:a===void 0?performance.now()-Kf:performance.now()-a,chunks:nl,transcriptRows:tl,completedAt:new Date})}finally{if(E.current?.taskId===k&&E.current?.token===Df)E.current=null;if(Df===W.current&&U.current===k)Y(!1)}})();E.current={taskId:k,token:Df,promise:Rf},await Rf}async function gu(k=U.current,a=!0,Qf=ff){if(!l)return;if(!a&&L.current)return;let Kf=performance.now();if(a)L.current=!0;if(a)iu({phase:"loading",taskId:String(k||U.current||""),startedAt:new Date});let Df=z.current+1;z.current=Df;let Xf=String(k||U.current||""),Sf=Xf?N.current.get(Xf):null,Rf=Array.isArray(Sf?.task?.transcript)?Sf.task.transcript:[],cf=vz(Rf),nf=x||{},of=null;try{of=await OX(_,Xf,cf,Qf)}catch{of=await VX(_,nf,Qf)}if(Df!==z.current){if(a)L.current=!1;return}let J0=performance.now()-Kf;c(nf);let e0=of?.queue||{},J1=String(e0?.activeTaskId||w4(e0)[0]||""),N0=of;i1((Uu)=>{let T$=Z1(of),Ay=Z1(Uu),j3=Ay.length>0?N4([Ay,T$],J1):N4([T$],J1),sH=r6(of),ol=r6(Uu),oH=Ay.length>T$.length&&(ol.hasMore===!1||String(ol.nextBeforeId||"").length>0),aH={...sH,...oH?{hasMore:ol.hasMore,nextBeforeId:ol.nextBeforeId}:{},returned:j3.length};return N0={...of,tasks:j3,pagination:aH},N0});let z_=Z1(N0),l3=rz(e0,_f),nl=Pz(e0,l3,Qf,z_),tl=EX(l3,Qf,z_),nu=Xf||U.current,B1=N0?.selected||null,Fy=B1?.task||null,Qy=Array.isArray(B1?.transcript)?B1.transcript:null,g0=nu&&(z_.some((Uu)=>Uu.id===nu)||String(Fy?.id||"")===nu)?nu:nl||tl||z_[0]?.id||"";if(U.current!==g0)W.current+=1;U.current=g0,w(g0);let sl=z_.find((Uu)=>Uu.id===g0);if(sl){let Uu=N.current.get(g0);if(Uu?.task)N.current.set(g0,{...Uu,task:{...sl,...Uu.task,status:sl.status,updatedAt:sl.updatedAt}})}if(Fy?.id===g0&&Qy!==null){let Uu=N.current.get(g0),T$=Array.isArray(Uu?.task?.transcript)?Uu.task.transcript:[],Ay=Aj(T$,Qy),j3=Boolean(B1?.preview);if(Y1(g0,{...Fy,_summaryLoaded:!0,transcript:Ay,_detailLoaded:!B1?.hasMore||Ay.length>0,_transcriptComplete:!j3&&!B1?.hasMore&&P1(Fy),_transcriptPreview:j3},W.current),Y(!1),a)iu({phase:"complete",taskId:g0,queueMs:J0,detailMs:Math.max(0,performance.now()-Kf-J0),totalMs:performance.now()-Kf,chunks:1,transcriptRows:Ay.length,partial:Boolean(j3||B1?.hasMore||P6(Fy)),completedAt:new Date});if(u3(new Date),a)L.current=!1;return}if(a)iu({phase:"session",taskId:g0,queueMs:J0,totalMs:J0,startedAt:new Date(Date.now()-J0)});if(g0)Y$(g0,!0,a?Kf:void 0,a?J0:void 0).catch((Uu)=>X0(Ty(Uu,"加载 Codex Trace Summary 失败")));else if(W.current+=1,S(null),Y(!1),a)iu({phase:"complete",taskId:"",queueMs:J0,detailMs:0,totalMs:performance.now()-Kf,chunks:0,transcriptRows:0,completedAt:new Date});if(u3(new Date),a)L.current=!1}async function kl(){if(!l||s||q.current)return;let k=String(r6(v).nextBeforeId||"");if(!k)return;q.current=!0,Of(!0),X0("");try{let a=await XX(_,ff,k),Qf=Z1(a),Kf=a?.queue||If||{},Df=String(Kf?.activeTaskId||w4(Kf)[0]||ly||"");i1((Xf)=>{let Sf=N4([Z1(Xf),Qf],Df),Rf=r6(a);return{...Xf||{},queue:Kf,tasks:Sf,pagination:{...Rf,returned:Sf.length}}})}catch(a){X0(Ty(a,"加载更早 Codex tasks 失败"))}finally{q.current=!1,Of(!1)}}function il(k){let a=k.currentTarget;if(!a||s||!vl)return;if(a.scrollHeight-a.scrollTop-a.clientHeight<120)kl()}async function Tu(k,a){x0(!0),X0("");try{await k()}catch(Qf){X0(Ty(Qf,a))}finally{x0(!1)}}async function $3(k){if(!k)return;try{let a=!1;try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(k),a=!0}catch{a=!1}if(!a){let Qf=document.createElement("textarea");Qf.value=k,Qf.style.position="fixed",Qf.style.opacity="0",document.body.appendChild(Qf),Qf.select(),a=document.execCommand("copy"),document.body.removeChild(Qf)}if(!a)throw Error("browser clipboard rejected the copy request");a0(k),uf(`已复制任务 ID:${k}`),window.setTimeout(()=>a0((Qf)=>Qf===k?"":Qf),1600)}catch(a){X0(`复制任务 ID 失败:${Ty(a)}`)}}function B$(k){if(!k)return;n(k),uf(`已引用任务 ID:${k};提交时后端会读取并注入该任务上下文`)}async function w$(k){if(!l||!k)return;v0(k),await Tu(async()=>{let a=null,Qf=!1;try{a=await wX(_,k)}catch{Qf=!0}let Kf=a?.task||{id:k,readAt:new Date().toISOString(),terminalUnread:!1},Df=String(Kf?.readAt||new Date().toISOString());L$([k],Df),pl([k],Df,a?.queue||null,Kf),uf(Qf?`已在本浏览器将任务 ${k} 标为已读;后端升级后会同步持久化`:`已将任务 ${k} 标为已读`)},"标记 Codex task 已读失败"),v0((a)=>a===k?"":a)}async function D$(){if(!l||i0)return;d0(!0),await Tu(async()=>{let k=null,a=!1;try{k=await DX(_)}catch{a=!0}let Qf=String(k?.readAt||new Date().toISOString()),Kf=Z1(D.current).map((Rf)=>Qj(Rf,b0)).filter(c3).map((Rf)=>String(Rf?.id||"")).filter(Boolean),Df=Array.from(N.current.entries()).filter(([,Rf])=>c3(Qj(Rf?.task,b0))).map(([Rf])=>Rf),Xf=Array.from(new Set([...Kf,...Df]));L$(Xf,Qf),pl(Xf,Qf,k?.queue||null);let Sf=a?Xf.length:Number(k?.count||Xf.length);uf(a?`已在本浏览器将 ${Sf} 个已结束未读任务标为已读;后端升级后会同步持久化`:`已将 ${Sf} 个已结束未读任务标为已读`)},"全部标为已读失败"),d0(!1)}function N2(k){let a=k||v_;if(Gf(a),!vu(a))t(a);if(i1(null),!(vu(a)?U.current:""))U.current="",W.current+=1,w(""),S(null),Y(!0)}async function L2(){let k=typeof window>"u"?"":window.prompt("输入新的 Codex queue ID(字母/数字/._-,最长 64)","new-lane"),a=String(k||"").trim();if(!a)return;await Tu(async()=>{let Qf=await M0(S0(_,"/api/queues"),{method:"POST",body:{queueId:a}}),Kf=String(Qf?.queue?.id||a);t(Kf),Gf(Kf),i1(null),U.current="",W.current+=1,w(""),S(null),uf(`已创建并切换到 queue:${Kf}`),await gu("",!0,Kf)},"创建 Codex queue 失败")}async function gl(k){if(k.preventDefault(),K.current){uf("任务正在提交中,请等待当前请求完成,已阻止重复提交。");return}if(j1.length>1&&!$f){X0(`检测到将创建 ${j1.length} 个任务;请先勾选“确认批量入队”,避免误传多个任务。`);return}K.current=!0,Yf(!0),uf("正在提交 Codex Queue 任务,请等待后端确认,输入已临时锁定。"),await Tu(async()=>{if(j1.length===0)throw Error("prompt 不能为空");let a=D4(p),Qf=_f.trim()||"default",Kf=[...j1],Df=(nf)=>({prompt:nf,queueId:Qf,model:zf,cwd:Wf,maxAttempts:Number(Zf),...a.length>0?{referenceTaskIds:a}:{}}),Xf=Kf.length===1?Df(Kf[0]):{tasks:Kf.map(Df)},Sf=await M0(S0(_,Kf.length===1?"/api/tasks":"/api/tasks/batch"),{method:"POST",body:Xf}),Rf=Sf?.tasks?.[0]?.id||"",cf=Array.isArray(Sf?.tasks)?Sf.tasks.map((nf)=>String(nf?.id||"")).filter(Boolean):[];if(uf(`已创建 ${cf.length||Kf.length} 个任务${cf.length>0?`:${cf.join(" / ")}`:""}`),m(""),n(""),lf(!1),U.current=Rf,ff!==Qf)i1(null);Gf(Qf),t(Qf),await gu(Rf,!0,Qf)},"Codex 任务入队失败"),K.current=!1,Yf(!1)}async function hH(k){if(k.preventDefault(),!r?.id)return;await Tu(async()=>{await M0(S0(_,`/api/tasks/${encodeURIComponent(r.id)}/steer`),{method:"POST",body:{prompt:xf}}),sf(""),await gu(r.id)},"追加 prompt 失败")}async function IH(){if(!r?.id)return;await Tu(async()=>{await M0(S0(_,`/api/tasks/${encodeURIComponent(r.id)}/interrupt`),{method:"POST",body:{}}),await gu(r.id)},"打断 Codex session 失败")}async function cH(){if(!r?.id)return;await Tu(async()=>{await M0(S0(_,`/api/tasks/${encodeURIComponent(r.id)}/retry`),{method:"POST",body:{}}),await gu(r.id)},"重新入队失败")}async function pH(k){let a=String(r?.id||""),Qf=String(k||"").trim();if(!a||!Qf)return;let Kf=M4(r);if(Qf===Kf){uf(`任务 ${a} 已在 queue=${Qf}`);return}await Tu(async()=>{let Xf=(await M0(S0(_,`/api/tasks/${encodeURIComponent(a)}/move`),{method:"POST",body:{queueId:Qf}}))?.task||{...r,queueId:Qf};if(N.current.set(a,{...N.current.get(a)||{},task:Xf}),U.current=a,S(Xf),w(a),t(Qf),!vu(ff))i1(null),Gf(Qf);uf(`已将任务 ${a} 从 ${Kf} 移动到 ${Qf}`),await gu(a,!0,vu(ff)?v_:Qf)},"移动任务 queue 失败")}async function mH(){let k=U.current;if(!k)return;let a=performance.now();await Tu(async()=>{iu({phase:"session",taskId:k,queueMs:0,totalMs:0,partial:!0,startedAt:new Date}),await Y$(k,!0,a,0)},"刷新 Trace Summary 失败")}function kH(k){U.current=k,W.current+=1,w(k);let a=N.current.get(k);if(a?.task)S(a.task),Y(!1);else{Y(!0);let Qf=qf.find((Kf)=>Kf.id===k);if(Qf)S(Qf);else S(null)}gu(k).catch((Qf)=>X0(Ty(Qf,"切换 Codex session 失败")))}function Y2(k){if(kH(k),HX())Fu(!1)}C6(()=>{if(M.current){M.current=!1;return}Tu(()=>gu(U.current),"Codex Queue 加载失败")},[l?.id,ff]),C6(()=>{if(!l)return;let k=()=>{if(!Tz())return;gu(U.current,!1).catch((Kf)=>X0(Ty(Kf,"Codex Queue 轮询失败")))},a=window.setInterval(()=>{k()},1500),Qf=()=>{if(Tz())k()};return document.addEventListener("visibilitychange",Qf),()=>{window.clearInterval(a),document.removeEventListener("visibilitychange",Qf)}},[l?.id,ff]),C6(()=>{if(!l||!r||T)return;let k=String(r.id||"");if(!k)return;let a=String(r.updatedAt||""),Qf=String(r._traceSummaryUpdatedAt||"");if(r._traceSummaryLoaded===!0&&Qf===a)return;let Kf=`${k}:${a||"unknown"}`;if(V.current.has(Kf))return;V.current.add(Kf),Y$(k,!0).catch((Df)=>X0(Ty(Df,"自动加载 Trace Summary 失败")))},[l?.id,r?.id,r?.updatedAt,r?._traceSummaryUpdatedAt,r?._traceSummaryLoaded,T]);let iH=qf.length===0?B(ry,{title:"队列为空",text:"提交一个任务后,Codex 会串行执行并保存输出。"}):[Cf.length>0?B(Wj,{key:"unread",title:"已结束未读",tasks:Cf,selectedId:P,emptyText:"暂无已结束未读任务。",onSelect:Y2,onCopy:$3,onReference:B$,onMarkRead:w$,copiedTaskId:vf,markingReadTaskId:Bf}):null,B(Wj,{key:"active",title:"运行 / 排队",tasks:_0,selectedId:P,emptyText:"当前没有运行或排队任务。",onSelect:Y2,onCopy:$3,onReference:B$,onMarkRead:w$,copiedTaskId:vf,markingReadTaskId:Bf}),B(Wj,{key:"history",title:"历史 session",tasks:G0,selectedId:P,emptyText:"最近没有完成、失败或取消的 session。",onSelect:Y2,onCopy:$3,onReference:B$,onMarkRead:w$,copiedTaskId:vf,markingReadTaskId:Bf}),B("div",{key:"pagination",className:"codex-task-pagination","data-testid":"codex-task-pagination"},B("span",null,`已加载 ${qf.length} / ${Number.isFinite(L1)?L1:qf.length}`),vl?B("button",{type:"button",className:"ghost-btn",disabled:s,onClick:()=>void kl(),"data-testid":"codex-load-more-tasks-button"},s?"加载中":"加载更早任务"):B("code",null,"已到队列末尾"))],qQ=(k,a=!1)=>B("label",{className:`codex-queue-switcher ${a?"compact":""}`},B("span",null,a?"Queue":"查看 queue"),B("select",{value:ff,onChange:(Qf)=>N2(String(Qf.target.value||v_)),"data-testid":k},B("option",{value:v_},`All queues · ${Number.isFinite(L1)?L1:qf.length} tasks · ${_3.length} running`),Au.map((Qf)=>B("option",{key:String(Qf?.id||""),value:String(Qf?.id||"")},Gj(Qf))))),gH=B("div",{className:"codex-trace-status","data-testid":"codex-trace-status-summary"},B("span",{className:"codex-trace-status-chip queued"},B("b",null,"排队"),String(Z2)),B("span",{className:"codex-trace-status-chip running"},B("b",null,"运行"),String(hl)),B("span",{className:`codex-trace-status-chip unread ${k1>0?"warn":""}`},B("b",null,"结束未读"),String(k1))),nH=B(Sy,{title:r?`Trace ${String(r.id).slice(0,22)}`:"Trace 输出",eyebrow:r?`${r.status} / view=${jy} / task queue=${M4(r)} / ${r.model} / agent loop trace`:`Agent loop trace / view=${jy}`,summary:gH,actions:B("div",{className:"panel-actions"},qQ("codex-queue-filter-select"),B("button",{type:"button",className:"ghost-btn codex-mark-all-read-btn",disabled:k1===0||O0||i0,onClick:()=>void D$(),"data-testid":"codex-mark-all-read-button"},i0?"标记中":`全部标已读${k1>0?` (${k1})`:""}`),r?B("button",{type:"button",className:"ghost-btn",disabled:T||O0,onClick:()=>void mH(),"data-testid":"codex-load-full-trace-button"},T?"加载中":Cy(r)?"刷新 Summary":"加载 Summary"):null,B("button",{type:"button",className:"codex-session-title-toggle",onClick:()=>Fu((k)=>!k),"data-testid":"codex-queue-sidebar-toggle"},D0?"收起队列":"展开队列"),B("label",{className:"inline-check"},B("input",{type:"checkbox",checked:j0,onChange:(k)=>u0(Boolean(k.target.checked))}),"自动滚动"),B("button",{type:"button",className:"ghost-btn",disabled:!E2||O0,onClick:()=>void IH(),"data-testid":"codex-interrupt-button"},"打断"),B("button",{type:"button",className:"ghost-btn",disabled:!V2||O0,onClick:()=>void cH()},"重试"),r?B(Mz,{title:"Codex Task",data:r,onOpen:u,testId:"raw-codex-task"}):null),className:"codex-output-panel"},B("div",{className:`codex-session-shell ${D0?"":"queue-collapsed"}`},D0?B("aside",{className:"codex-session-sidebar","data-testid":"codex-session-sidebar"},B("div",{className:"codex-session-sidebar-head"},B("div",null,B("span",null,vu(ff)?"All queues":"Queue lane"),B("strong",null,`${jy} · ${qf.length}/${Number.isFinite(L1)?L1:qf.length} sessions · 未读 ${k1}`)),B("button",{type:"button",className:"ghost-btn",onClick:()=>Fu(!1)},"收起")),qQ("codex-queue-filter-sidebar",!0),B("div",{className:"codex-task-list codex-task-list-session",onScroll:il,"data-testid":"codex-task-list-scroll"},iH)):null,B("div",{className:"codex-session-main"},B("div",{className:"codex-output-stack"},B(_N,{task:r,loading:T,onLoadPromptPart:ml,onLoadSteps:O2,onLoadStep:X2}),B($N,{task:r})))));if(!l)return B(ry,{title:"Codex Queue 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=codex-queue"});let HQ=Number(ef?.totalMs),EQ=Number(ef?.queueMs),VQ=Number(ef?.detailMs),OQ=Number(ef?.transcriptRows),tH=ef?.phase==="complete"?"complete":String(ef?.phase||"idle");return B("div",{className:`codex-queue-page ${$?"codex-standalone-page":""}`,"data-testid":"codex-queue-page","data-load-state":tH,"data-load-total-ms":Number.isFinite(HQ)?String(Math.round(HQ*10)/10):"","data-load-queue-ms":Number.isFinite(EQ)?String(Math.round(EQ*10)/10):"","data-load-detail-ms":Number.isFinite(VQ)?String(Math.round(VQ*10)/10):"","data-load-transcript-rows":Number.isFinite(OQ)?String(OQ):"","data-load-task-id":String(ef?.taskId||P||""),"data-load-partial":ef?.partial?"true":"false"},B(H0,{error:ku,wide:!0}),Qu?B("div",{className:"form-success wide","data-testid":"codex-create-success"},Qu):null,B("div",{className:"codex-session-stage codex-session-stage-top"},nH),B("div",{className:"codex-queue-layout"},B("div",{className:"codex-left-rail"},B(Sy,{title:"提交任务",eyebrow:Af?"Submitting...":j1.length>1?`${j1.length} tasks`:"Single or Batch",className:"codex-compose-panel"},B("form",{className:`codex-task-form ${Af?"is-submitting":""}`,onSubmit:gl,"data-testid":"codex-queue-task-form","aria-busy":Af?"true":"false"},B("label",null,"Prompt / 多任务用单独一行 --- 分隔",B("textarea",{value:R,rows:8,disabled:Af,onChange:(k)=>m(k.target.value),placeholder:"写入 Codex 任务;多个任务之间用 --- 分隔。"})),B("label",{className:"codex-reference-field"},"引用任务 ID(可选)",B("input",{value:p,disabled:Af,onChange:(k)=>n(k.target.value),placeholder:"codex_...;支持空格/逗号分隔多个 ID","data-testid":"codex-reference-task-id"}),D4(p).length>0?B("code",null,`后端将解析并注入:${D4(p).join(" / ")}`):null),B("div",{className:"codex-form-grid"},B("label",{className:"codex-submit-queue-field"},"Queue",B("div",{className:"codex-submit-queue-row"},B("select",{value:_f,disabled:Af,onChange:(k)=>t(String(k.target.value||"default")),"data-testid":"codex-queue-id-select"},Au.map((k)=>B("option",{key:String(k?.id||""),value:String(k?.id||"")},Gj(k)))),B("button",{type:"button",className:"ghost-btn codex-create-queue-btn",onClick:()=>void L2(),disabled:O0||Af,"data-testid":"codex-create-queue-button"},"创建 queue"))),B("label",null,"模型",B("select",{value:zf,disabled:Af,onChange:(k)=>jf(k.target.value),"data-testid":"codex-model-select"},cl.map((k)=>B("option",{key:k,value:k},k)))),B("label",null,"工作目录",B("input",{value:Wf,disabled:Af,onChange:(k)=>Vf(k.target.value),placeholder:If?.defaultWorkdir||"/root/unidesk"})),B("label",null,"最大尝试",B("input",{type:"number",min:1,max:99,value:Zf,disabled:Af,onChange:(k)=>h(Number(k.target.value)),"data-testid":"codex-max-attempts-input"})),B("label",null,"入队份数",B("input",{type:"number",min:1,max:50,value:g,disabled:Af,onChange:(k)=>I(Number(k.target.value)),"data-testid":"codex-repeat-count-input"}))),Jy>1?B("label",{className:`codex-batch-confirm ${$f?"confirmed":""}`,"data-testid":"codex-batch-confirm-row"},B("input",{type:"checkbox",checked:$f,disabled:Af,onChange:(k)=>lf(Boolean(k.target.checked)),"data-testid":"codex-batch-confirm-checkbox"}),B("span",null,`确认批量入队 ${Jy} 个任务(prompt 分段 ${O$.length} × 入队份数 ${Cz(g)})`)):null,Af?B("div",{className:"codex-submit-wait","data-testid":"codex-submit-wait"},"正在提交到后端,已锁定输入以防重复提交..."):null,B("div",{className:"codex-form-actions"},B("button",{type:"button",className:"ghost-btn",disabled:O0||Af||R.length===0&&p.length===0,onClick:()=>{m(""),n(""),lf(!1),uf("已清空任务输入栏")},"data-testid":"codex-clear-input-button"},"清空输入"),B("button",{type:"submit",className:"primary-btn",disabled:H2,"data-testid":"codex-enqueue-button"},Af?"提交中,请等待...":X$?`请确认批量入队 ${Jy} 个任务`:j1.length>1?`批量入队 ${j1.length} 个任务`:"入队并运行"))))),B("div",{className:"codex-main-stage"},B("div",{className:"codex-detail-grid"},B(Sy,{title:"Prompt 全量",eyebrow:r?String(r.id):"selected task",className:"codex-prompt-panel"},B(yN,{task:r,loading:T,onLoadPromptPart:ml})),B(Sy,{title:"运行控制",eyebrow:N$?"Active turn steer":"Steer when running"},B("div",{className:"codex-run-control-stack"},B(aX,{task:r,queueRows:Au,busy:O0,onMove:pH}),B("form",{className:"codex-steer-form",onSubmit:hH},B("label",null,"追加 prompt",B("textarea",{value:xf,rows:4,onChange:(k)=>sf(k.target.value),placeholder:"给正在运行的 Codex session 推入新的指令或纠偏。",disabled:!N$})),B("button",{type:"submit",className:"primary-btn",disabled:!N$||O0||xf.trim().length===0,"data-testid":"codex-steer-button"},"推入运行中 session")))),B(Sy,{title:"完成判定",eyebrow:r?.lastJudge?r.lastJudge.source:"judge"},r?.lastJudge?B("div",{className:"codex-judge-card","data-testid":"codex-task-judge-card"},B(y_,{status:r.lastJudge.decision},r.lastJudge.decision),B("strong",null,`${Math.round(Number(r.lastJudge.confidence||0)*100)}% confidence`),B("p",{"data-testid":"codex-task-judge-reason"},r.lastJudge.reason||"--"),r.lastJudge.continuePrompt?B("code",{"data-testid":"codex-task-judge-continue-prompt"},hz(r.lastJudge.continuePrompt,220)):null):B(ry,{title:"尚未判定",text:"Codex turn 结束后会由 MiniMax M2.7 或 fallback judge 判定 complete/retry/fail;retry 会在已有 thread 追加继续执行 prompt。"}))),B(Sy,{title:"Attempts",eyebrow:"terminal vs interruption"},B(lN,{task:r})))),B(Sy,{title:"运行概要",eyebrow:"用户服务",actions:B("div",{className:"panel-actions"},B("button",{type:"button",className:"ghost-btn",onClick:()=>void Tu(()=>gu(P),"刷新失败"),disabled:O0,"data-testid":"codex-refresh-button"},O0?"同步中":"刷新"),B(Mz,{title:"Codex Queue 用户服务",data:l,onOpen:u,testId:"raw-codex-queue-service"}))},B("div",{className:"codex-queue-hero"},B("div",null,B("div",{className:"node-version-line"},B(y_,{status:Il.providerStatus==="online"?"online":"warn"},Il.providerStatus||"unknown"),B("span",null,l.providerId),B("span",null,V$.public?"公网暴露":"仅 UniDesk frontend 代理访问"),B("span",null,If?.judgeConfigured?`MiniMax ${If?.minimaxModel||"M2.7"}`:"Fallback judge")),B("p",{className:"muted paragraph"},l.description)),B("div",{className:"microservice-ref-card"},B("span",null,"Queue view"),B("strong",null,jy),B("code",null,`${qf.length}/${Number.isFinite(L1)?L1:qf.length} loaded / ${_3.length} active lanes`),B("code",null,`models: ${cl.join(" / ")}`)),B("div",{className:"microservice-ref-card"},B("span",null,"Backend"),B("strong",null,`${V$.nodeBindHost||"--"}:${V$.nodePort||"--"}`),B("code",null,q2.containerName||"codex-queue-backend")))),B("div",{className:"codex-queue-metrics"},B(My,{label:"Queues",value:String(If?.queueCount??Au.length??1),hint:`${Number(y3.length||0)} active lanes`,tone:y3.length>1?"warn":""}),B(My,{label:"排队",value:Uj(W_,"queued"),hint:"waiting turns"}),B(My,{label:"运行",value:Uj(W_,"running"),hint:y3.length>1?`${y3.length} parallel`:ly?`active ${String(ly).slice(0,16)}`:"idle",tone:ly?"warn":"ok"}),B(My,{label:"成功",value:Uj(W_,"succeeded"),hint:"completed tasks",tone:"ok"}),B(My,{label:"异常/取消",value:String(Number(W_.failed||0)+Number(W_.canceled||0)),hint:"terminal non-success",tone:Number(W_.failed||0)>0?"fail":""}),B(My,{label:"加载耗时",value:Jj(ef?.totalMs),hint:ef?.phase==="complete"?`queue ${Jj(ef?.queueMs)} / session ${Jj(ef?.detailMs)} / ${ef?.chunks??0} chunks${ef?.partial?" / preview":""}`:`${ef?.phase||"idle"}...`,tone:Number(ef?.totalMs||0)>1000?"warn":"ok"}),B(My,{label:"最近刷新",value:f3?WX(f3):"--",hint:"1.5s polling"})))}var x4=rf(I0(),1);var Jf=x4.default.createElement,{useEffect:jN}=x4.default,JN=x4.default.useState;function FN(f){if(!f)return"--";let u=new Date(f);if(Number.isNaN(u.getTime()))return"--";return u.toLocaleString("zh-CN",{hour12:!1})}function QN(f){return f.toLocaleTimeString("zh-CN",{hour12:!1})}function P4({status:f,children:u}){let _=String(f||"unknown").toLowerCase();return Jf("span",{className:`status-badge ${_}`},u||f||"unknown")}function h_({label:f,value:u,hint:_,tone:y}){return Jf("article",{className:`metric-card ${y||""}`},Jf("div",{className:"metric-label"},f),Jf("div",{className:"metric-value"},u),Jf("div",{className:"metric-hint"},_))}function C4({title:f,eyebrow:u,actions:_,children:y,className:$}){return Jf("section",{className:`panel ${$||""}`},Jf("div",{className:"panel-head"},Jf("div",null,u?Jf("p",{className:"panel-eyebrow"},u):null,Jf("h2",null,f)),_?Jf("div",{className:"panel-actions"},_):null),Jf("div",{className:"panel-body"},y))}function R4({title:f,data:u,onOpen:_,testId:y}){return Jf("button",{type:"button",className:"ghost-btn","data-testid":y,onClick:()=>_(f,u)},"查看原始JSON")}function Oj({title:f,text:u}){return Jf("div",{className:"empty-state"},Jf("strong",null,f),Jf("span",null,u))}function AN(f){return f?.runtime&&typeof f.runtime==="object"&&!Array.isArray(f.runtime)?f.runtime:{}}function UN(f){return f?.backend&&typeof f.backend==="object"&&!Array.isArray(f.backend)?f.backend:{}}function WN(f){return f?.repository&&typeof f.repository==="object"&&!Array.isArray(f.repository)?f.repository:{}}function Ry(f,u){let _=f&&typeof f==="object"?f[u]:void 0;return Number.isFinite(Number(_))?String(_):"--"}function zN(f){return(Array.isArray(f?.jobs)?f.jobs:[]).slice(0,40)}function GN(f){return(Array.isArray(f?.drafts)?f.drafts:[]).slice(0,12)}function fG({microservices:f,onRaw:u,apiBaseUrl:_="/api"}){let y=f.find((q)=>q.id==="findjob")||null,[$,l]=JN({loading:!1,error:"",health:null,summary:null,jobs:null,drafts:null,refreshedAt:null});async function j(){if(!y)return;l((q)=>({...q,loading:!0,error:""}));try{let[q,E,O,G]=await Promise.all([wf(`${_}/microservices/findjob/health`),wf(`${_}/microservices/findjob/proxy/api/summary`),wf(`${_}/microservices/findjob/proxy/api/jobs?__unideskArrayLimit=jobs:40`),wf(`${_}/microservices/findjob/proxy/api/drafts`)]);l({loading:!1,error:"",health:q,summary:E,jobs:O,drafts:G,refreshedAt:new Date})}catch(q){l((E)=>({...E,loading:!1,error:Mf(q,"FindJob 加载失败")}))}}if(jN(()=>{j()},[y?.id,y?.runtime?.providerStatus]),!y)return Jf(Oj,{title:"FindJob 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=findjob"});let J=AN(y),F=WN(y),A=UN(y),U=$.summary||{},z=zN($.jobs),W=GN($.drafts),K=$.jobs?._unidesk?.arrayLimits?.jobs;return Jf("div",{className:"findjob-page","data-testid":"findjob-page"},Jf(C4,{title:"FindJob 工作台",eyebrow:"D601 用户服务",actions:Jf("div",{className:"panel-actions"},Jf("button",{type:"button",className:"ghost-btn",onClick:j,disabled:$.loading,"data-testid":"findjob-refresh-button"},$.loading?"刷新中":"刷新"),Jf(R4,{title:"FindJob 用户服务",data:y,onOpen:u,testId:"raw-findjob-service"}))},Jf("div",{className:"findjob-hero"},Jf("div",null,Jf("div",{className:"node-version-line"},Jf(P4,{status:J.providerStatus==="online"?"online":"warn"},J.providerStatus||"unknown"),Jf("span",null,y.providerId),Jf("span",null,A.public?"公网暴露":"仅 UniDesk frontend 代理访问")),Jf("p",{className:"muted paragraph"},y.description)),Jf("div",{className:"microservice-ref-card"},Jf("span",null,"Repo"),Jf("strong",null,F.url||"--"),Jf("code",null,F.commitId||"--")),Jf("div",{className:"microservice-ref-card"},Jf("span",null,"D601 Docker"),Jf("strong",null,`${A.nodeBindHost||"--"}:${A.nodePort||"--"}`),Jf("code",null,`${F.composeFile||"--"} / ${F.composeService||"--"}`))),Jf(H0,{error:$.error,wide:!0})),Jf("div",{className:"findjob-grid"},Jf(C4,{title:"岗位指标",eyebrow:$.refreshedAt?`Updated ${QN($.refreshedAt)}`:"Summary"},Jf("div",{className:"metric-grid"},Jf(h_,{label:"岗位总量",value:Ry(U,"totalJobs"),hint:"tracked jobs",tone:"ok"}),Jf(h_,{label:"原始岗位",value:Ry(U,"rawJobs"),hint:"raw queue"}),Jf(h_,{label:"已验证",value:Ry(U,"verifiedJobs"),hint:"verified set"}),Jf(h_,{label:"优先处理",value:Ry(U,"prioritizedJobs"),hint:"prioritized"}),Jf(h_,{label:"过期",value:Ry(U,"staleJobs"),hint:"stale jobs",tone:"warn"}),Jf(h_,{label:"无效",value:Ry(U,"invalidJobs"),hint:"invalid jobs",tone:"warn"}),Jf(h_,{label:"上海",value:Ry(U,"shanghaiJobs"),hint:"city filter"}),Jf(h_,{label:"Health",value:$.health?.ok?"OK":"--",hint:"D601 /api/health"})),Jf("div",{className:"panel-actions inline-actions"},Jf(R4,{title:"FindJob Summary",data:U,onOpen:u,testId:"raw-findjob-summary"}))),Jf(C4,{title:"近期岗位",eyebrow:K?`${K.returnedLength}/${K.originalLength} Preview`:`${z.length} Preview`},z.length===0?Jf(Oj,{title:"暂无岗位预览",text:"等待 D601 findjob backend 返回 /api/jobs"}):Jf("div",{className:"table-wrap findjob-job-table"},Jf("table",null,Jf("thead",null,Jf("tr",null,Jf("th",null,"优先级"),Jf("th",null,"状态"),Jf("th",null,"单位"),Jf("th",null,"职位"),Jf("th",null,"城市"),Jf("th",null,"阶段"),Jf("th",null,"截止"),Jf("th",null,"证据"))),Jf("tbody",null,z.map((q)=>Jf("tr",{key:q.id},Jf("td",null,Jf(P4,{status:String(q.priority||"").toLowerCase()||"unknown"},q.priority||"--")),Jf("td",null,Jf(P4,{status:String(q.status||"").toLowerCase()||"unknown"},q.status||"--")),Jf("td",null,q.organization_name||"--",Jf("code",null,q.id||"--")),Jf("td",null,q.display_title||q.title||"--"),Jf("td",null,q.display_city||q.city||"--"),Jf("td",null,q.workflow_stage||"--"),Jf("td",null,q.deadline||"--"),Jf("td",null,q.evidence_url?Jf("a",{href:q.evidence_url,target:"_blank",rel:"noreferrer"},"打开"):Jf("span",{className:"muted"},"无"))))))),Jf("div",{className:"panel-actions inline-actions"},Jf(R4,{title:"FindJob Jobs Preview",data:$.jobs,onOpen:u,testId:"raw-findjob-jobs"}))),Jf(C4,{title:"草稿与报告",eyebrow:`${W.length} Drafts`},W.length===0?Jf(Oj,{title:"暂无草稿",text:"D601 findjob backend 未返回 drafts"}):Jf("div",{className:"draft-list"},W.map((q)=>Jf("article",{key:q.id,className:"draft-card"},Jf("div",{className:"node-card-head"},Jf("strong",null,q.id),Jf(P4,{status:q.status},q.status||"--")),Jf("div",{className:"docker-meta compact"},Jf("span",null,q.workflow_stage||"--"),Jf("span",null,`jobs ${q.counts?.jobs??0}`),Jf("span",null,`reports ${q.counts?.reports??0}`)),Jf("span",null,q.latestReportPath||"暂无报告"),Jf("code",null,FN(q.updated_at||q.updatedAt))))),Jf("div",{className:"panel-actions inline-actions"},Jf(R4,{title:"FindJob Drafts",data:$.drafts,onOpen:u,testId:"raw-findjob-drafts"})))))}var I6=rf(I0(),1);var b=I6.default.createElement,{useEffect:KN}=I6.default,Xj=I6.default.useState;function ZN(f){if(!f)return"--";let u=new Date(f);if(Number.isNaN(u.getTime()))return"--";return u.toLocaleString("zh-CN",{hour12:!1})}function qN(f){return f.toLocaleTimeString("zh-CN",{hour12:!1})}function v6(f){let u=Number(f);return Number.isFinite(u)?`${Math.max(0,Math.min(100,u)).toFixed(1)}%`:"--"}function Lj(f){if(f===null||f===void 0||f==="")return"--";let u=Number(f);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 Yj(f,u=2){let _=Number(f);if(!Number.isFinite(_))return f===!1?"false":f===!0?"true":"--";let y=Math.abs(_);if(Number.isInteger(_)||y>=1000)return _.toLocaleString("zh-CN",{maximumFractionDigits:0});if(y>=1)return _.toLocaleString("zh-CN",{maximumFractionDigits:u});return _.toLocaleString("zh-CN",{maximumFractionDigits:Math.max(u,6)})}function h6(f){if(f===null||f===void 0||f==="")return"--";if(typeof f==="boolean")return f?"true":"false";if(typeof f==="number")return Yj(f,4);if(Array.isArray(f))return f.map((u)=>h6(u)).join(" x ");if(typeof f==="object")return"已上报";return String(f)}function v4(f){let u=Number(f);if(!Number.isFinite(u)||u<=0)return"--";let _=u>=100?0:u>=10?1:2;return`${u.toLocaleString("zh-CN",{maximumFractionDigits:_})} epoch/h`}function b4(f){return f.replace(/[^a-zA-Z0-9_-]/g,"-")}function Lu(f){return f&&typeof f==="object"&&!Array.isArray(f)?f:{}}function b6({status:f,children:u}){let _=String(f||"unknown").toLowerCase();return b("span",{className:`status-badge ${_}`},u||f||"unknown")}function I_({label:f,value:u,hint:_,tone:y}){return b("article",{className:`metric-card ${y||""}`},b("div",{className:"metric-label"},f),b("div",{className:"metric-value"},u),b("div",{className:"metric-hint"},_))}function Nj({title:f,eyebrow:u,actions:_,children:y,className:$}){return b("section",{className:`panel ${$||""}`},b("div",{className:"panel-head"},b("div",null,u?b("p",{className:"panel-eyebrow"},u):null,b("h2",null,f)),_?b("div",{className:"panel-actions"},_):null),b("div",{className:"panel-body"},y))}function p3({title:f,data:u,onOpen:_,testId:y}){return b("button",{type:"button",className:"ghost-btn","data-testid":y,onClick:($)=>{$?.stopPropagation?.(),_(f,u)}},"查看原始JSON")}function $_({title:f,text:u}){return b("div",{className:"empty-state"},b("strong",null,f),b("span",null,u))}function HN(f){return f?.runtime&&typeof f.runtime==="object"&&!Array.isArray(f.runtime)?f.runtime:{}}function EN(f){return f?.backend&&typeof f.backend==="object"&&!Array.isArray(f.backend)?f.backend:{}}function VN(f){return f?.repository&&typeof f.repository==="object"&&!Array.isArray(f.repository)?f.repository:{}}function ON(f){return f?.counts&&typeof f.counts==="object"&&!Array.isArray(f.counts)?f.counts:{}}function XN(f){return Array.isArray(f?.jobs)?f.jobs.slice(0,240):[]}function NN(f){return Array.isArray(f?.projects)?f.projects.slice(0,1000):[]}function h4(f){return Array.isArray(f?.projects)?f.projects:[]}function LN(f,u){if(Array.isArray(u?.gpu))return u.gpu;if(Array.isArray(f?.gpu))return f.gpu;return[]}function bu(f,u){return`${f}/microservices/met-nonlinear/proxy${u}`}function uG(f){return f.startedAt&&f.finishedAt?Lj((Date.parse(f.finishedAt)-Date.parse(f.startedAt))/1000):"--"}function YN(f){let u=f.progress||{};if(u.etaSeconds!==null&&u.etaSeconds!==void 0&&u.etaSeconds!==""){let j=Number(u.etaSeconds);if(Number.isFinite(j))return Math.max(0,j)}let _=Number(u.currentEpoch),y=Number(u.epochTarget??f.epochTarget),$=Date.parse(f.startedAt||"");if(!Number.isFinite(_)||_<=0||!Number.isFinite(y)||y<=_||!Number.isFinite($))return null;let l=Math.max(0,(Date.now()-$)/1000);if(l<=0)return null;return Math.max(0,l/_*(y-_))}function _G(f){let u=f.progress||{},_=Number(u.epochPerHour);if(Number.isFinite(_)&&_>0)return _;let y=Date.parse(f.startedAt||""),$=["succeeded","failed","canceled"].includes(f.status)?Date.parse(f.finishedAt||""):Date.now();if(!Number.isFinite(y)||!Number.isFinite($)||$<=y)return null;let l=Number(u.currentEpoch??f.epochTarget);if(!Number.isFinite(l)||l<=0)return null;return l/(($-y)/3600000)}function yG(f){if(f==="staged")return"待启动";if(f==="queued")return"排队中";if(f==="running")return"训练中";if(f==="succeeded")return"已完成";if(f==="failed")return"失败";if(f==="canceled")return"已取消";return f||"unknown"}function $G(f,u,_){return{name:f,path:u,depth:_,count:0,children:[],project:null}}function BN(f){let u=$G("","",-1);for(let y of f){let l=String(y?.projectPath||"").replace(/\\/g,"/").split("/").filter(Boolean);if(l.length===0)continue;let j=u,J=[];for(let[F,A]of l.entries()){J.push(A);let U=J.join("/"),z=j.children.find((W)=>W.path===U);if(!z)z=$G(A,U,F),j.children.push(z);if(F===l.length-1)z.project=y;j=z}}let _=(y)=>{let $=y.children.reduce((l,j)=>l+_(j),0);return y.count=(y.project?1:0)+$,y.children.sort((l,j)=>{if(Boolean(l.project)!==Boolean(j.project))return l.project?1:-1;return l.name.localeCompare(j.name,"zh-CN",{numeric:!0,sensitivity:"base"})}),y.count};return _(u),u}function wN(f){let u=Lu(f.data);return Lu(u.project).projectPath?Lu(u.project):u}function DN(f){return Lu(Lu(f.data).job)}function lG({microservices:f,onRaw:u,apiBaseUrl:_="/api"}){let y=f.find((h)=>h.id==="met-nonlinear")||null,[$,l]=Xj({loading:!1,actionBusy:!1,error:"",health:null,summary:null,queue:null,projects:null,history:null,images:null,refreshedAt:null}),[j,J]=Xj({loading:!1,error:"",kind:"",key:"",title:"",data:null}),[F,A]=Xj(()=>({activeTab:"projects",selectedProjects:{},expandedProjectDirs:{},sourceProject:"",forkCount:1,forkEpochs:200,forkPrefix:`ui_fork_${Date.now()}`,maxConcurrency:3,targetGpuName:"2080 Ti",actionMessage:""}));function U(h){A((g)=>({...g,...h}))}async function z(h=F.activeTab){if(!y)return;l((g)=>({...g,loading:!0,error:""}));try{let g=[["health",wf(`${_}/microservices/met-nonlinear/health`)],["summary",wf(bu(_,"/api/summary"))]];if(h==="projects")g.push(["projectsRoot",wf(bu(_,"/api/projects?root=projects&limit=500"))]),g.push(["exProjectsRoot",wf(bu(_,"/api/projects?root=ex_projects&limit=500"))]);if(h==="current"||h==="completed"||h==="failed")g.push(["queue",wf(bu(_,"/api/queue"))]);if(h==="completed"||h==="failed")g.push(["history",wf(bu(_,"/api/history"))]);if(h==="gpu")g.push(["images",wf(bu(_,"/api/images"))]);let I=Object.fromEntries(await Promise.all(g.map(async([lf,Af])=>[lf,await Af]))),$f={loading:!1,actionBusy:!1,error:"",health:I.health,summary:I.summary,refreshedAt:new Date};if(I.projectsRoot||I.exProjectsRoot){let{projectsRoot:lf,exProjectsRoot:Af}=I;$f.projects={ok:lf?.ok!==!1&&Af?.ok!==!1,roots:[{root:"projects",count:h4(lf).length},{root:"ex_projects",count:h4(Af).length}],projects:[...h4(lf),...h4(Af)]}}if(I.queue)$f.queue=I.queue;if(I.history)$f.history=I.history;if(I.images)$f.images=I.images;l((lf)=>({...lf,...$f}))}catch(g){l((I)=>({...I,loading:!1,actionBusy:!1,error:Mf(g,"MET Nonlinear 加载失败")}))}}async function W(h,g){l((I)=>({...I,actionBusy:!0,error:""})),U({actionMessage:`${h}...`});try{let I=await g();U({actionMessage:I||`${h}完成`}),await z()}catch(I){l(($f)=>({...$f,actionBusy:!1,error:Mf(I,`${h}失败`)}))}}async function K(){await W("保存并发设置",async()=>{await wf(bu(_,"/api/queue/settings"),{method:"PUT",body:JSON.stringify({maxConcurrency:Number(F.maxConcurrency),targetGpuName:F.targetGpuName})})})}function q(){return Object.entries(F.selectedProjects).filter(([,h])=>h).map(([h])=>h)}async function E(){let h=q();if(h.length===0)throw Error("请先选择至少一个 project");await W("加入待启动队列",async()=>{await wf(bu(_,"/api/queue"),{method:"POST",body:JSON.stringify({projectPaths:h,maxConcurrency:Number(F.maxConcurrency),targetGpuName:F.targetGpuName,start:!1})}),U({activeTab:"current",selectedProjects:{}})})}async function O(){let h=F.sourceProject||P[0]?.projectPath;if(!h)throw Error("请先选择源 project");await W("Fork Project",async()=>{let g=await wf(bu(_,"/api/projects/fork"),{method:"POST",body:JSON.stringify({sourceProject:h,count:Number(F.forkCount),epochs:Number(F.forkEpochs),prefix:F.forkPrefix})}),I=Array.isArray(g.projectPaths)?g.projectPaths:[],$f=I.reduce((lf,Af)=>{return lf[Af]=!0,lf},{...F.selectedProjects});return U({selectedProjects:$f}),`已 fork ${I.length} 个 project,并已自动勾选;请确认后点击加入待启动队列。`})}async function G(){await W("启动队列",async()=>{await wf(bu(_,"/api/queue/start"),{method:"POST",body:JSON.stringify({maxConcurrency:Number(F.maxConcurrency),targetGpuName:F.targetGpuName})}),U({activeTab:"current"})})}async function H(h){await W("取消任务",async()=>{await wf(bu(_,`/api/jobs/${encodeURIComponent(h.id)}/cancel`),{method:"POST",body:JSON.stringify({})})})}async function Z(h){let g=String(h?.projectPath||"");if(!g)return;J({loading:!0,error:"",kind:"project",key:g,title:g,data:null});try{let I=await wf(bu(_,`/api/projects/config?path=${encodeURIComponent(g)}`));J({loading:!1,error:"",kind:"project",key:g,title:g,data:I})}catch(I){J({loading:!1,error:Mf(I,"Project 详情加载失败"),kind:"project",key:g,title:g,data:null})}}async function V(h){let g=String(h?.id||"");if(!g)return;J({loading:!0,error:"",kind:"job",key:g,title:h.projectPath||g,data:null});try{let I=await wf(bu(_,`/api/jobs/${encodeURIComponent(g)}`));J({loading:!1,error:"",kind:"job",key:g,title:I?.job?.projectPath||h.projectPath||g,data:I})}catch(I){J({loading:!1,error:Mf(I,"Job 详情加载失败"),kind:"job",key:g,title:h.projectPath||g,data:null})}}if(KN(()=>{z(F.activeTab)},[y?.id,y?.runtime?.providerStatus,F.activeTab]),!y)return b($_,{title:"MET Nonlinear 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=met-nonlinear"});let L=HN(y),M=VN(y),N=EN(y),D=ON($.queue?.queue||$.summary?.queue),x=LN($.health,$.queue),c=$.health?.targetGpu||$.summary?.targetGpu||x.find((h)=>String(h.name||"").includes("2080")),v=$.images?.mlImage||$.health?.image||{},C=XN($.queue),P=NN($.projects),w=BN(P),r=F.sourceProject||P[0]?.projectPath||"",S=C.filter((h)=>["staged","queued","running"].includes(h.status)),T=C.filter((h)=>h.status==="succeeded"),Y=C.filter((h)=>["failed","canceled"].includes(h.status)),R=Array.isArray($.history?.jobs)?$.history.jobs.slice(0,120):[],m=[{id:"projects",label:"项目库",count:P.length},{id:"current",label:"当前队列",count:S.length||Number(D.staged||0)+Number(D.queued||0)+Number(D.running||0)},{id:"completed",label:"已完成",count:T.length||Number(D.succeeded||0)},{id:"failed",label:"失败诊断",count:Y.length||Number(D.failed||0)+Number(D.canceled||0)},{id:"gpu",label:"GPU/镜像",count:x.length}];function p(h,g){if(h.length===0)return b($_,{title:g==="current"?"当前队列为空":"暂无记录",text:g==="current"?"从项目库选择或 fork project 后先加入待启动队列,再启动队列。":"终态任务会显示耗时、exit code 和失败诊断。"});return b("div",{className:"table-wrap met-job-table"},b("table",null,b("thead",null,b("tr",null,b("th",null,"状态"),b("th",null,"Project"),b("th",null,"Epoch"),b("th",null,"速度"),b("th",null,"ETA/耗时"),b("th",null,"GPU"),b("th",null,"Exit"),b("th",null,"更新时间"),b("th",null,"操作"))),b("tbody",null,h.map((I)=>{let $f=I.progress||{},lf=["staged","queued","running"].includes(I.status),Af=j.kind==="job"&&j.key===I.id;return b("tr",{key:I.id,className:`met-click-row ${Af?"active":""}`,onClick:()=>V(I),"data-testid":`met-job-row-${b4(I.id)}`},b("td",null,b(b6,{status:I.status},yG(I.status))),b("td",null,b("button",{type:"button",className:"met-inline-link",onClick:(Yf)=>{Yf.stopPropagation(),V(I)}},I.projectPath),b("code",null,I.id)),b("td",null,b("span",null,`${$f.currentEpoch??"--"} / ${$f.epochTarget??I.epochTarget??"--"}`),b("div",{className:"met-progress"},b("span",{style:{width:v6($f.progressPercent)}}))),b("td",null,b("strong",null,v4(_G(I)))),b("td",null,I.status==="succeeded"||I.status==="failed"||I.status==="canceled"?uG(I):I.status==="running"?`ETA ${Lj(YN(I))}`:"--"),b("td",null,I.gpuName||"--"),b("td",null,I.exitCode??"--"),b("td",null,ZN(I.updatedAt)),b("td",null,lf?b("button",{type:"button",className:"ghost-btn mini",onClick:(Yf)=>{Yf.stopPropagation(),H(I)},disabled:$.actionBusy},"取消"):null,b(p3,{title:`MET Job ${I.id}`,data:I,onOpen:u,testId:`raw-met-job-${I.id}`})))}))))}function n(){return b("div",{className:"met-queue-summary","data-testid":"met-current-summary"},b(b6,{status:"staged"},`待启动 ${D.staged??0}`),b(b6,{status:"queued"},`排队中 ${D.queued??0}`),b(b6,{status:"running"},`训练中 ${D.running??0}`),b("span",null,`最大并发 ${$.summary?.queue?.maxConcurrency??$.queue?.queue?.maxConcurrency??F.maxConcurrency}`),b("span",null,`目标 GPU ${$.summary?.queue?.targetGpuName??$.queue?.queue?.targetGpuName??F.targetGpuName}`))}function _f(h,g){let I=F.expandedProjectDirs[h];return I===void 0?g<2:Boolean(I)}function t(h,g){let I=_f(h,g);U({expandedProjectDirs:{...F.expandedProjectDirs,[h]:!I}})}function ff(h){let g=8+Math.max(0,h.depth)*16;if(Boolean(h.project)){let lf=h.project,Af=Boolean(F.selectedProjects[lf.projectPath]),Yf=j.kind==="project"&&j.key===lf.projectPath;return b("div",{key:h.path,className:`met-tree-row project ${Af?"selected":""} ${Yf?"active":""}`,style:{paddingLeft:g},onClick:()=>Z(lf),"data-testid":`met-project-node-${b4(lf.projectPath)}`},b("div",{className:"met-tree-name"},b("input",{type:"checkbox",checked:Af,onClick:(xf)=>xf.stopPropagation(),onChange:(xf)=>U({selectedProjects:{...F.selectedProjects,[lf.projectPath]:xf.target.checked}}),"data-testid":`met-project-checkbox-${b4(lf.projectPath)}`}),b("button",{type:"button",className:"met-inline-link project-path",onClick:(xf)=>{xf.stopPropagation(),Z(lf)}},h.name)),b("span",null,lf.useModel||"--"),b("span",null,lf.epochTrain??"--"),b("span",null,v6(lf.progress?.progressPercent)),b("span",null,v4(lf.progress?.epochPerHour)))}let $f=_f(h.path,h.depth);return b(I6.default.Fragment,{key:h.path},b("div",{className:"met-tree-row folder",style:{paddingLeft:g},"data-testid":`met-project-folder-${b4(h.path)}`},b("button",{type:"button",className:"met-tree-toggle",onClick:()=>t(h.path,h.depth),"aria-label":$f?`折叠 ${h.path}`:`展开 ${h.path}`},$f?"-":"+"),b("strong",null,h.name),b("span",{className:"met-tree-count"},`${h.count} projects`)),$f?h.children.map((lf)=>ff(lf)):null)}function Gf(h){return b("div",{className:"met-detail-kv"},h.map((g)=>b("div",{key:g.label,className:"met-detail-kv-item"},b("span",null,g.label),b("strong",null,h6(g.value)),g.hint?b("small",null,g.hint):null)))}function zf(h,g){return b("div",{className:"met-detail-section"},b("h3",null,h),Gf(g))}function jf(h){if(!Array.isArray(h)||h.length===0)return b($_,{title:"模型层未上报",text:"等待 data/model_info.json 或 compute_analysis.json 生成。"});return b("div",{className:"table-wrap met-layer-table"},b("table",null,b("thead",null,b("tr",null,b("th",null,"Layer"),b("th",null,"Type"),b("th",null,"Params"),b("th",null,"Trainable"),b("th",null,"Compute"))),b("tbody",null,h.slice(0,18).map((g,I)=>b("tr",{key:`${g.name||"layer"}-${I}`},b("td",null,g.name||`#${I+1}`),b("td",null,g.type||"--"),b("td",null,Yj(g.num_params)),b("td",null,g.trainable===void 0?"--":String(Boolean(g.trainable))),b("td",null,Yj(g.compute?.total??g.estimated_cost?.weighted_units?.total)))))))}function Wf(h){let g=Array.isArray(h)?h:[];if(g.length===0)return b($_,{title:"data/ 暂无文件",text:"训练或评估完成后会生成 training_state、metrics、model_info 等文件。"});return b("div",{className:"met-file-chip-grid"},g.slice(0,48).map((I)=>b("span",{key:I},I)),g.length>48?b("span",null,`+${g.length-48}`):null)}function Vf(h){let g=String(h||"").replace(/\x1b\[[0-9;]*[A-Za-z]/g,"").split(/\r?\n/).map((I)=>I.trim()).filter(Boolean).slice(-12);if(g.length===0)return b($_,{title:"暂无日志尾部",text:"该任务未上报 logTail 或日志已轮转。"});return b("div",{className:"met-log-lines"},g.map((I,$f)=>b("div",{key:`${$f}-${I.slice(0,16)}`},I)))}function Zf(){if(j.loading)return b("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},b($_,{title:"详情加载中",text:j.title||"正在读取 D601 data/ 和 config.json"}));if(j.error)return b("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},b(H0,{error:j.error,wide:!0}));if(!j.data)return b("section",{className:"met-detail-panel muted","data-testid":"met-detail-panel"},b($_,{title:"选择一个项目或任务查看详情",text:"项目库、当前队列、已完成和失败诊断中的行都可以点击;默认只展示结构化字段,原始 JSON 需显式点击按钮。"}));let h=wN(j),g=DN(j),I=Lu(h.config),$f=Lu(h.progress||g.progress),lf=Lu(h.data),Af=Lu(h.metrics||lf.metrics||$f.trainingInfo?.evaluation_metrics),Yf=Lu(lf.trainingInfo||$f.trainingInfo),xf=Lu(lf.trainingState),sf=Lu(h.model||lf.model),j0=Array.isArray(sf.modelSummary)&&sf.modelSummary.length>0?sf.modelSummary:sf.computeLayers,u0=Lu(Yf.evaluation_metrics),D0=j.kind==="job"?"训练任务详情":"Project 详情";return b("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},b("div",{className:"panel-head compact"},b("div",null,b("p",{className:"panel-eyebrow"},j.kind==="job"?"Job + Project Detail":"Project Library Detail"),b("h2",null,D0),b("code",null,h.projectPath||g.projectPath||j.title)),b("div",{className:"panel-actions"},b(p3,{title:`MET ${D0}`,data:j.data,onOpen:u,testId:"raw-met-detail"}))),j.kind==="job"?zf("任务状态",[{label:"Job ID",value:g.id},{label:"状态",value:yG(g.status)},{label:"GPU",value:g.gpuName},{label:"Exit Code",value:g.exitCode},{label:"耗时",value:uG(g)},{label:"训练速度",value:v4(_G({...g,progress:$f}))}]):null,zf("config.json",[{label:"use_model",value:I.use_model},{label:"epoch_train",value:I.epoch_train},{label:"step_per_epoch",value:I.step_per_epoch},{label:"learning_rate",value:I.learning_rate},{label:"using_gpu",value:I.using_gpu},{label:"use_points",value:I.use_points},{label:"sample_rate",value:I.sample_rate},{label:"time_clipped_s",value:I.time_clipped_s},{label:"H_UNITS",value:I.H_UNITS},{label:"INNER_KAN_UNITS",value:I.INNER_KAN_UNITS},{label:"INNER_KAN_LAYERS",value:I.INNER_KAN_LAYERS},{label:"GRID_SIZE",value:I.GRID_SIZE},{label:"SPLINE_ORDER",value:I.SPLINE_ORDER},{label:"USE_FAST_MODEL",value:I.USE_FAST_MODEL},{label:"IIR_TRAINABLE",value:I.IIR_TRAINABLE}]),zf("data/ 训练状态",[{label:"Epoch",value:`${$f.currentEpoch??xf.current_epoch??xf.completed_epoch??"--"} / ${$f.epochTarget??I.epoch_train??"--"}`},{label:"Progress",value:v6($f.progressPercent)},{label:"Last Loss",value:$f.lastLoss??xf.loss},{label:"Last Val Loss",value:$f.lastValLoss??xf.val_loss},{label:"Min Loss",value:Yf.min_loss??xf.min_loss},{label:"Min Val Loss",value:Yf.min_val_loss??xf.min_val_loss},{label:"Log Lines",value:$f.logLineCount},{label:"ETA",value:Lj($f.etaSeconds??xf.remaining_time)},{label:"训练速度",value:v4($f.epochPerHour??xf.smoothed_speed)},{label:"Training Alive",value:xf.training_alive}]),zf("模型参数",[{label:"Model Type",value:sf.modelType??I.use_model},{label:"Total Params",value:sf.totalParams,hint:sf.totalParams===null||sf.totalParams===void 0?"未上报":"data/model_info.json"},{label:"Trainable",value:sf.trainableParams},{label:"Non-trainable",value:sf.nonTrainableParams},{label:"Compute Cost",value:sf.computeCost},{label:"Estimate Status",value:sf.estimateStatus},{label:"Unsupported Layers",value:sf.unsupportedLayerCount}]),zf("指标",[{label:"train_loss",value:Af.train_loss??u0.train_loss},{label:"val_loss",value:Af.val_loss??u0.val_loss},{label:"train_mae",value:Af.train_mae??u0.train_mae},{label:"val_mae",value:Af.val_mae??u0.val_mae},{label:"train_afmae",value:Af.train_afmae??u0.train_afmae},{label:"val_afmae",value:Af.val_afmae??u0.val_afmae},{label:"freq_drift_hz",value:Af.freq_drift_hz},{label:"sens_drift_percent",value:Af.sens_drift_percent},{label:"linearity_percent",value:Af.linearity_percent},{label:"weights_source",value:Af.weights_source??u0.weights_source},{label:"lr min/mean/max",value:`${h6(Yf.learning_rate_min)} / ${h6(Yf.learning_rate_mean)} / ${h6(Yf.learning_rate_max)}`}]),b("div",{className:"met-detail-section"},b("h3",null,"模型层"),jf(j0)),b("div",{className:"met-detail-section"},b("h3",null,"data/ 文件"),Wf(lf.files)),j.kind==="job"?b("div",{className:"met-detail-section"},b("h3",null,"日志尾部"),Vf(Lu(j.data).logTail)):null)}return b("div",{className:"met-page","data-testid":"met-nonlinear-page"},b(Nj,{title:"MET Nonlinear 训练编排",eyebrow:"D601 GPU 用户服务",actions:b("div",{className:"panel-actions"},b("button",{type:"button",className:"ghost-btn",onClick:z,disabled:$.loading,"data-testid":"met-refresh-button"},$.loading?"刷新中":"刷新"),b(p3,{title:"MET Nonlinear 用户服务",data:y,onOpen:u,testId:"raw-met-service"}))},b("div",{className:"findjob-hero"},b("div",null,b("div",{className:"node-version-line"},b(b6,{status:L.providerStatus==="online"?"online":"warn"},L.providerStatus||"unknown"),b("span",null,y.providerId),b("span",null,N.public?"公网暴露":"仅 UniDesk frontend 代理访问")),b("p",{className:"muted paragraph"},y.description)),b("div",{className:"microservice-ref-card"},b("span",null,"Repo"),b("strong",null,M.url||"--"),b("code",null,M.commitId||"--")),b("div",{className:"microservice-ref-card"},b("span",null,"D601 Docker"),b("strong",null,`${N.nodeBindHost||"--"}:${N.nodePort||"--"}`),b("code",null,`${M.composeFile||"--"} / ${M.containerName||"--"}`))),b(H0,{error:$.error,wide:!0}),F.actionMessage?b("div",{className:"met-action-log","data-testid":"met-action-message"},F.actionMessage):null),b("div",{className:"met-grid"},b(Nj,{title:"核心状态",eyebrow:$.refreshedAt?`Updated ${qN($.refreshedAt)}`:"Queue + GPU"},b("div",{className:"metric-grid"},b(I_,{label:"Staged",value:D.staged??0,hint:"加入队列未开始",tone:Number(D.staged||0)>0?"warn":""}),b(I_,{label:"Queued",value:D.queued??0,hint:"排队等待调度",tone:Number(D.queued||0)>0?"warn":""}),b(I_,{label:"Running",value:D.running??0,hint:`max ${$.summary?.queue?.maxConcurrency??$.queue?.queue?.maxConcurrency??"--"}`,tone:Number(D.running||0)>0?"ok":""}),b(I_,{label:"Succeeded",value:D.succeeded??0,hint:"已完成"}),b(I_,{label:"Failed",value:D.failed??0,hint:"需要诊断",tone:Number(D.failed||0)>0?"warn":""}),b(I_,{label:"2080Ti Free",value:c?v6(Number(c.freeRatio)*100):"--",hint:c?`${c.memoryFreeMiB}/${c.memoryTotalMiB} MiB`:"等待 GPU 上报"}),b(I_,{label:"ML Image",value:v.present?"READY":"MISSING",hint:v.image||"met-nonlinear-ml:tf26",tone:v.present?"ok":"warn"}),b(I_,{label:"Health",value:$.health?.ok?"OK":"--",hint:"D601 /health"}))),b(Nj,{title:"队列控制",eyebrow:"Downloader-like staging"},b("div",{className:"met-control-strip"},b("label",null,"最大并发",b("input",{type:"number",min:1,max:16,value:F.maxConcurrency,"data-testid":"met-max-concurrency-input",onChange:(h)=>U({maxConcurrency:h.target.value})})),b("label",null,"目标 GPU",b("input",{value:F.targetGpuName,"data-testid":"met-target-gpu-input",onChange:(h)=>U({targetGpuName:h.target.value})})),b("button",{type:"button",className:"ghost-btn",onClick:K,disabled:$.actionBusy,"data-testid":"met-save-settings-button"},"保存设置"),b("button",{type:"button",className:"primary-btn",onClick:G,disabled:$.actionBusy||Number(D.staged||0)===0,"data-testid":"met-start-queue-button"},"启动队列")),b("p",{className:"muted paragraph"},"Project 先进入待启动队列,不会立即训练;点击启动队列后才切换为排队中,并由 D601 scheduler 按最大并发和 2080Ti 显存策略调度。")),b("section",{className:"panel met-workspace"},b("div",{className:"met-tabs",role:"tablist"},m.map((h)=>b("button",{key:h.id,type:"button",className:F.activeTab===h.id?"active":"",onClick:()=>U({activeTab:h.id}),"data-testid":`met-tab-${h.id}`},`${h.label} ${h.count}`))),b("div",{className:"panel-body"},F.activeTab==="projects"?b("div",{className:"met-form-grid","data-testid":"met-projects-pane"},b("div",{className:"met-fork-card"},b("h3",null,"Fork Project"),b("label",null,"源 Project",b("select",{value:r,"data-testid":"met-source-project-select",onChange:(h)=>U({sourceProject:h.target.value})},P.map((h)=>b("option",{key:h.projectPath,value:h.projectPath},`${h.projectPath} · ${h.useModel||"model?"}`)))),b("label",null,"Fork 数量",b("input",{type:"number",min:1,max:100,value:F.forkCount,"data-testid":"met-fork-count-input",onChange:(h)=>U({forkCount:h.target.value})})),b("label",null,"训练轮数",b("input",{type:"number",min:1,max:1e5,value:F.forkEpochs,"data-testid":"met-fork-epochs-input",onChange:(h)=>U({forkEpochs:h.target.value})})),b("label",null,"目标前缀",b("input",{value:F.forkPrefix,"data-testid":"met-fork-prefix-input",onChange:(h)=>U({forkPrefix:h.target.value})})),b("button",{type:"button",className:"primary-btn",onClick:O,disabled:$.actionBusy||!r,"data-testid":"met-fork-button"},"Fork Project"),b("p",{className:"muted paragraph"},"Fork 只创建新 Project 并自动勾选,不会直接训练;需要在右侧确认后加入待启动队列。")),b("div",{className:"met-project-list"},b("div",{className:"panel-head compact"},b("div",null,b("p",{className:"panel-eyebrow"},`Existing Projects · ${($.projects?.roots||[]).map((h)=>`${h.root} ${h.count}`).join(" / ")}`),b("h2",null,"选择已有 Project")),b("button",{type:"button",className:"ghost-btn",onClick:E,disabled:$.actionBusy||q().length===0,"data-testid":"met-stage-selected-button"},`加入待启动队列 (${q().length})`)),P.length===0?b($_,{title:"暂无 project",text:"等待 D601 返回 /api/projects"}):b("div",{className:"met-project-table","data-testid":"met-project-tree"},b("div",{className:"met-tree-header"},b("span",null,"文件树 Project"),b("span",null,"Model"),b("span",null,"Epochs"),b("span",null,"Progress"),b("span",null,"速度")),w.children.map((h)=>ff(h)))),Zf()):null,F.activeTab==="current"?b("div",{"data-testid":"met-current-pane"},n(),p(S,"current"),Zf(),b("div",{className:"panel-actions inline-actions"},b(p3,{title:"MET Queue",data:$.queue,onOpen:u,testId:"raw-met-queue"}))):null,F.activeTab==="completed"?b("div",{"data-testid":"met-completed-pane"},p(T.length>0?T:R.filter((h)=>h.status==="succeeded"),"completed"),Zf()):null,F.activeTab==="failed"?b("div",{"data-testid":"met-failed-pane"},p(Y.length>0?Y:R.filter((h)=>["failed","canceled"].includes(h.status)),"failed"),Zf(),b("div",{className:"panel-actions inline-actions"},b(p3,{title:"MET History",data:$.history,onOpen:u,testId:"raw-met-history"}))):null,F.activeTab==="gpu"?b("div",{className:"met-gpu-pane","data-testid":"met-gpu-pane"},x.length===0?b($_,{title:"暂无 GPU 上报",text:"等待 D601 met-nonlinear-ts 或 ML image 提供 nvidia-smi 数据"}):b("div",{className:"table-wrap"},b("table",null,b("thead",null,b("tr",null,b("th",null,"Index"),b("th",null,"Name"),b("th",null,"Free"),b("th",null,"Policy"))),b("tbody",null,x.map((h)=>b("tr",{key:h.index},b("td",null,h.index),b("td",null,h.name),b("td",null,`${h.memoryFreeMiB} / ${h.memoryTotalMiB} MiB`,b("div",{className:"met-progress"},b("span",{style:{width:v6(Number(h.freeRatio)*100)}}))),b("td",null,String(h.name||"").includes("2080")?"target 2080Ti, <20% 限制并发":"non-target")))))),b("div",{className:"panel-actions inline-actions"},b(p3,{title:"MET Images",data:$.images,onOpen:u,testId:"raw-met-images"}))):null))))}var c4=[{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:"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:"codex-queue",label:"Codex Queue"},{id:"project-manager",label:"Project Manager"}]},{id:"config",label:"系统配置",code:"CFG",tabs:[{id:"topology",label:"连接拓扑"},{id:"auth",label:"认证策略"},{id:"security",label:"安全边界"}]}],m3=Object.fromEntries(c4.map((f)=>[f.id,f.tabs[0]?.id??""]));function TN(f){let u=String(f||"").trim();if(!u)return"";try{return decodeURIComponent(u)}catch{return u}}function I4(f){let u=String(f||"/"),[_]=u.split(/[?#]/u,1);if(_==="/")return"/";let $=`/${_.split("/").map(TN).filter(Boolean).join("/")}`;return $.endsWith("/")?$:`${$}/`}function MN(f){let u=2166136261;for(let _ of f)u^=_.charCodeAt(0),u=Math.imul(u,16777619);return Math.abs(u>>>0).toString(36)}function Bj(f){return String(f||"").normalize("NFKD").replace(/[\u0300-\u036f]/gu,"").toLowerCase().replace(/[^a-z0-9]+/gu,"-").replace(/^-+|-+$/gu,"")}function jG(f){return String(f||"").trim().toLowerCase().replace(/[\s/\\?#%]+/gu,"-").replace(/-+/gu,"-").replace(/^-+|-+$/gu,"")}function JG(f){let u=Bj(f.routeSegment||"")||jG(f.routeSegment||"");if(u)return u;let _=Bj(f.id||"");if(_)return _;let y=Bj(f.label||"")||jG(f.label||"");if(y)return y;return`route-${MN(JSON.stringify(f))}`}function wj(f,u){return`${f}:${u}`}function FG(f){let u=f.map((F)=>{let A=JG(F);return{...F,routeSegment:A,tabs:F.tabs.map((U)=>({...U,routeSegment:JG(U)}))}}),_={},y={},$={},l=u.map((F)=>{let A=F.tabs[0]?.id??"";$[F.id]=A;let U=F.tabs.map((K)=>{let q=`/${F.routeSegment}/${K.routeSegment}/`,E=[q],O={moduleId:F.id,tabId:K.id};for(let G of E)_[I4(G)]=O;return y[wj(F.id,K.id)]=q,{...K,canonicalPath:q,aliases:E}}),z=`/${F.routeSegment}/`,W={moduleId:F.id,tabId:A};return _[I4(z)]=W,{...F,routeSegment:F.routeSegment,canonicalPath:z,tabs:U}}),j=l[0],J={moduleId:j?.id||"",tabId:j?.tabs[0]?.id||""};return _["/"]=J,{modules:l,moduleById:Object.fromEntries(l.map((F)=>[F.id,F])),defaultActiveTabs:$,routeMap:_,canonicalPathByTarget:y,fallbackTarget:J}}function Dj(f,u){return f.routeMap[I4(u)]||f.fallbackTarget}function c6(f,u,_){return f.canonicalPathByTarget[wj(u,_)]||f.canonicalPathByTarget[wj(f.fallbackTarget.moduleId,f.fallbackTarget.tabId)]||"/"}function QG(f,u){let _=f.routeMap[I4(u)];if(!_)return null;return c6(f,_.moduleId,_.tabId)}var fy=rf(I0(),1);var o=rf(zG(),1),d=rf(I0(),1);function Y0(f){if(typeof f==="string"||typeof f==="number")return""+f;let u="";if(Array.isArray(f)){for(let _=0,y;_{}};function KG(){for(var f=0,u=arguments.length,_={},y;f=0)y=_.slice($+1),_=_.slice(0,$);if(_&&!u.hasOwnProperty(_))throw Error("unknown type: "+_);return{type:_,name:y}})}m4.prototype=KG.prototype={constructor:m4,on:function(f,u){var _=this._,y=bN(f+"",_),$,l=-1,j=y.length;if(arguments.length<2){while(++l0)for(var _=Array($),y=0,$,l;y<$;++y)_[y]=arguments[y+2];if(!this._.hasOwnProperty(f))throw Error("unknown type: "+f);for(l=this._[f],y=0,$=l.length;y<$;++y)l[y].value.apply(u,_)},apply:function(f,u,_){if(!this._.hasOwnProperty(f))throw Error("unknown type: "+f);for(var y=this._[f],$=0,l=y.length;$=0&&(u=f.slice(0,_))!=="xmlns")f=f.slice(_+1);return Tj.hasOwnProperty(u)?{space:Tj[u],local:f}:f}function Mj(f){let u;while(u=f.sourceEvent)f=u;return f}function lu(f,u){if(f=Mj(f),u===void 0)u=f.currentTarget;if(u){var _=u.ownerSVGElement||u;if(_.createSVGPoint){var y=_.createSVGPoint();return y.x=f.clientX,y.y=f.clientY,y=y.matrixTransform(u.getScreenCTM().inverse()),[y.x,y.y]}if(u.getBoundingClientRect){var $=u.getBoundingClientRect();return[f.clientX-$.left-u.clientLeft,f.clientY-$.top-u.clientTop]}}return[f.pageX,f.pageY]}function IN(){}function c_(f){return f==null?IN:function(){return this.querySelector(f)}}function Sj(f){if(typeof f!=="function")f=c_(f);for(var u=this._groups,_=u.length,y=Array(_),$=0;$<_;++$)for(var l=u[$],j=l.length,J=y[$]=Array(j),F,A,U=0;U=Z)Z=H+1;while(!(L=O[Z])&&++Z=0;)if(j=y[$]){if(l&&j.compareDocumentPosition(l)^4)l.parentNode.insertBefore(j,l);l=j}return this}function kj(f){if(!f)f=eN;function u(z,W){return z&&W?f(z.__data__,W.__data__):!z-!W}for(var _=this._groups,y=_.length,$=Array(y),l=0;lu?1:f>=u?0:NaN}function ij(){var f=arguments[0];return arguments[0]=this,f.apply(null,arguments),this}function gj(){return Array.from(this)}function nj(){for(var f=this._groups,u=0,_=f.length;u<_;++u)for(var y=f[u],$=0,l=y.length;$1?this.each((u==null?jL:typeof u==="function"?FL:JL)(f,u,_==null?"":_)):p_(this.node(),f)}function p_(f,u){return f.style.getPropertyValue(u)||k6(f).getComputedStyle(f,null).getPropertyValue(u)}function QL(f){return function(){delete this[f]}}function AL(f,u){return function(){this[f]=u}}function UL(f,u){return function(){var _=u.apply(this,arguments);if(_==null)delete this[f];else this[f]=_}}function ej(f,u){return arguments.length>1?this.each((u==null?QL:typeof u==="function"?UL:AL)(f,u)):this.node()[f]}function ZG(f){return f.trim().split(/^|\s+/)}function fJ(f){return f.classList||new qG(f)}function qG(f){this._node=f,this._names=ZG(f.getAttribute("class")||"")}qG.prototype={add:function(f){var u=this._names.indexOf(f);if(u<0)this._names.push(f),this._node.setAttribute("class",this._names.join(" "))},remove:function(f){var u=this._names.indexOf(f);if(u>=0)this._names.splice(u,1),this._node.setAttribute("class",this._names.join(" "))},contains:function(f){return this._names.indexOf(f)>=0}};function HG(f,u){var _=fJ(f),y=-1,$=u.length;while(++y<$)_.add(u[y])}function EG(f,u){var _=fJ(f),y=-1,$=u.length;while(++y<$)_.remove(u[y])}function WL(f){return function(){HG(this,f)}}function zL(f){return function(){EG(this,f)}}function GL(f,u){return function(){(u.apply(this,arguments)?HG:EG)(this,f)}}function uJ(f,u){var _=ZG(f+"");if(arguments.length<2){var y=fJ(this.node()),$=-1,l=_.length;while(++$=0)_=u.slice(y+1),u=u.slice(0,y);return{type:u,name:_}})}function SL(f){return function(){var u=this.__on;if(!u)return;for(var _=0,y=-1,$=u.length,l;_<$;++_)if(l=u[_],(!f.type||l.type===f.type)&&l.name===f.name)this.removeEventListener(l.type,l.listener,l.options);else u[++y]=l;if(++y)u.length=y;else delete this.__on}}function rL(f,u,_){return function(){var y=this.__on,$,l=TL(u);if(y){for(var j=0,J=y.length;j()=>f;function t6(f,{sourceEvent:u,subject:_,target:y,identifier:$,active:l,x:j,y:J,dx:F,dy:A,dispatch:U}){Object.defineProperties(this,{type:{value:f,enumerable:!0,configurable:!0},sourceEvent:{value:u,enumerable:!0,configurable:!0},subject:{value:_,enumerable:!0,configurable:!0},target:{value:y,enumerable:!0,configurable:!0},identifier:{value:$,enumerable:!0,configurable:!0},active:{value:l,enumerable:!0,configurable:!0},x:{value:j,enumerable:!0,configurable:!0},y:{value:J,enumerable:!0,configurable:!0},dx:{value:F,enumerable:!0,configurable:!0},dy:{value:A,enumerable:!0,configurable:!0},_:{value:U}})}t6.prototype.on=function(){var f=this._.on.apply(this._,arguments);return f===this._?this:f};function mL(f){return!f.ctrlKey&&!f.button}function kL(){return this.parentNode}function iL(f,u){return u==null?{x:f.x,y:f.y}:u}function gL(){return navigator.maxTouchPoints||"ontouchstart"in this}function s6(){var f=mL,u=kL,_=iL,y=gL,$={},l=xy("start","drag","end"),j=0,J,F,A,U,z=0;function W(V){V.on("mousedown.drag",K).filter(y).on("touchstart.drag",O).on("touchmove.drag",G,XG).on("touchend.drag touchcancel.drag",H).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function K(V,L){if(U||!f.call(this,V,L))return;var M=Z(this,u.call(this,V,L),V,L,"mouse");if(!M)return;C0(V.view).on("mousemove.drag",q,vy).on("mouseup.drag",E,vy),g3(V.view),g4(V),A=!1,J=V.clientX,F=V.clientY,M("start",V)}function q(V){if(j_(V),!A){var L=V.clientX-J,M=V.clientY-F;A=L*L+M*M>z}$.mouse("drag",V)}function E(V){C0(V.view).on("mousemove.drag mouseup.drag",null),g6(V.view,A),j_(V),$.mouse("end",V)}function O(V,L){if(!f.call(this,V,L))return;var M=V.changedTouches,N=u.call(this,V,L),D=M.length,x,c;for(x=0;x>8&15|u>>4&240,u>>4&15|u&240,(u&15)<<4|u&15,1):_===8?n4(u>>24&255,u>>16&255,u>>8&255,(u&255)/255):_===4?n4(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=tL.exec(f))?new Yu(u[1],u[2],u[3],1):(u=sL.exec(f))?new Yu(u[1]*255/100,u[2]*255/100,u[3]*255/100,1):(u=oL.exec(f))?n4(u[1],u[2],u[3],u[4]):(u=aL.exec(f))?n4(u[1]*255/100,u[2]*255/100,u[3]*255/100,u[4]):(u=dL.exec(f))?TG(u[1],u[2]/100,u[3]/100,1):(u=eL.exec(f))?TG(u[1],u[2]/100,u[3]/100,u[4]):NG.hasOwnProperty(f)?BG(NG[f]):f==="transparent"?new Yu(NaN,NaN,NaN,0):null}function BG(f){return new Yu(f>>16&255,f>>8&255,f&255,1)}function n4(f,u,_,y){if(y<=0)f=u=_=NaN;return new Yu(f,u,_,y)}function _Y(f){if(!(f instanceof e6))f=E1(f);if(!f)return new Yu;return f=f.rgb(),new Yu(f.r,f.g,f.b,f.opacity)}function t3(f,u,_,y){return arguments.length===1?_Y(f):new Yu(f,u,_,y==null?1:y)}function Yu(f,u,_,y){this.r=+f,this.g=+u,this.b=+_,this.opacity=+y}o6(Yu,t3,KJ(e6,{brighter(f){return f=f==null?s4:Math.pow(s4,f),new Yu(this.r*f,this.g*f,this.b*f,this.opacity)},darker(f){return f=f==null?a6:Math.pow(a6,f),new Yu(this.r*f,this.g*f,this.b*f,this.opacity)},rgb(){return this},clamp(){return new Yu(hy(this.r),hy(this.g),hy(this.b),o4(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:wG,formatHex:wG,formatHex8:yY,formatRgb:DG,toString:DG}));function wG(){return`#${by(this.r)}${by(this.g)}${by(this.b)}`}function yY(){return`#${by(this.r)}${by(this.g)}${by(this.b)}${by((isNaN(this.opacity)?1:this.opacity)*255)}`}function DG(){let f=o4(this.opacity);return`${f===1?"rgb(":"rgba("}${hy(this.r)}, ${hy(this.g)}, ${hy(this.b)}${f===1?")":`, ${f})`}`}function o4(f){return isNaN(f)?1:Math.max(0,Math.min(1,f))}function hy(f){return Math.max(0,Math.min(255,Math.round(f)||0))}function by(f){return f=hy(f),(f<16?"0":"")+f.toString(16)}function TG(f,u,_,y){if(y<=0)f=u=_=NaN;else if(_<=0||_>=1)f=u=NaN;else if(u<=0)f=NaN;return new H1(f,u,_,y)}function SG(f){if(f instanceof H1)return new H1(f.h,f.s,f.l,f.opacity);if(!(f instanceof e6))f=E1(f);if(!f)return new H1;if(f instanceof H1)return f;f=f.rgb();var u=f.r/255,_=f.g/255,y=f.b/255,$=Math.min(u,_,y),l=Math.max(u,_,y),j=NaN,J=l-$,F=(l+$)/2;if(J){if(u===l)j=(_-y)/J+(_0&&F<1?0:j;return new H1(j,J,F,f.opacity)}function rG(f,u,_,y){return arguments.length===1?SG(f):new H1(f,u,_,y==null?1:y)}function H1(f,u,_,y){this.h=+f,this.s=+u,this.l=+_,this.opacity=+y}o6(H1,rG,KJ(e6,{brighter(f){return f=f==null?s4:Math.pow(s4,f),new H1(this.h,this.s,this.l*f,this.opacity)},darker(f){return f=f==null?a6:Math.pow(a6,f),new H1(this.h,this.s,this.l*f,this.opacity)},rgb(){var f=this.h%360+(this.h<0)*360,u=isNaN(f)||isNaN(this.s)?0:this.s,_=this.l,y=_+(_<0.5?_:1-_)*u,$=2*_-y;return new Yu(ZJ(f>=240?f-240:f+120,$,y),ZJ(f,$,y),ZJ(f<120?f+240:f-120,$,y),this.opacity)},clamp(){return new H1(MG(this.h),t4(this.s),t4(this.l),o4(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 f=o4(this.opacity);return`${f===1?"hsl(":"hsla("}${MG(this.h)}, ${t4(this.s)*100}%, ${t4(this.l)*100}%${f===1?")":`, ${f})`}`}}));function MG(f){return f=(f||0)%360,f<0?f+360:f}function t4(f){return Math.max(0,Math.min(1,f||0))}function ZJ(f,u,_){return(f<60?u+(_-u)*f/60:f<180?_:f<240?u+(_-u)*(240-f)/60:u)*255}function qJ(f,u,_,y,$){var l=f*f,j=l*f;return((1-3*f+3*l-j)*u+(4-6*l+3*j)*_+(1+3*f+3*l-3*j)*y+j*$)/6}function HJ(f){var u=f.length-1;return function(_){var y=_<=0?_=0:_>=1?(_=1,u-1):Math.floor(_*u),$=f[y],l=f[y+1],j=y>0?f[y-1]:2*$-l,J=y()=>f;function lY(f,u){return function(_){return f+_*u}}function jY(f,u,_){return f=Math.pow(f,_),u=Math.pow(u,_)-f,_=1/_,function(y){return Math.pow(f+y*u,_)}}function PG(f){return(f=+f)===1?d4:function(u,_){return _-u?jY(u,_,f):fl(isNaN(u)?_:u)}}function d4(f,u){var _=u-f;return _?lY(f,_):fl(isNaN(f)?u:f)}var Iy=function f(u){var _=PG(u);function y($,l){var j=_(($=t3($)).r,(l=t3(l)).r),J=_($.g,l.g),F=_($.b,l.b),A=d4($.opacity,l.opacity);return function(U){return $.r=j(U),$.g=J(U),$.b=F(U),$.opacity=A(U),$+""}}return y.gamma=f,y}(1);function CG(f){return function(u){var _=u.length,y=Array(_),$=Array(_),l=Array(_),j,J;for(j=0;j<_;++j)J=t3(u[j]),y[j]=J.r||0,$[j]=J.g||0,l[j]=J.b||0;return y=f(y),$=f($),l=f(l),J.opacity=1,function(F){return J.r=y(F),J.g=$(F),J.b=l(F),J+""}}}var JY=CG(HJ),FY=CG(EJ);function VJ(f,u){if(!u)u=[];var _=f?Math.min(u.length,f.length):0,y=u.slice(),$;return function(l){for($=0;$<_;++$)y[$]=f[$]*(1-l)+u[$]*l;return y}}function RG(f){return ArrayBuffer.isView(f)&&!(f instanceof DataView)}function xG(f,u){var _=u?u.length:0,y=f?Math.min(_,f.length):0,$=Array(y),l=Array(_),j;for(j=0;j_)if(l=u.slice(_,l),J[j])J[j]+=l;else J[++j]=l;if((y=y[0])===($=$[0]))if(J[j])J[j]+=$;else J[++j]=$;else J[++j]=null,F.push({i:j,x:ju(y,$)});_=NJ.lastIndex}if(_180)U+=360;else if(U-A>180)A+=360;W.push({i:z.push($(z)+"rotate(",null,y)-2,x:ju(A,U)})}else if(U)z.push($(z)+"rotate("+U+y)}function J(A,U,z,W){if(A!==U)W.push({i:z.push($(z)+"skewX(",null,y)-2,x:ju(A,U)});else if(U)z.push($(z)+"skewX("+U+y)}function F(A,U,z,W,K,q){if(A!==z||U!==W){var E=K.push($(K)+"scale(",null,",",null,")");q.push({i:E-4,x:ju(A,z)},{i:E-2,x:ju(U,W)})}else if(z!==1||W!==1)K.push($(K)+"scale("+z+","+W+")")}return function(A,U){var z=[],W=[];return A=f(A),U=f(U),l(A.translateX,A.translateY,U.translateX,U.translateY,z,W),j(A.rotate,U.rotate,z,W),J(A.skewX,U.skewX,z,W),F(A.scaleX,A.scaleY,U.scaleX,U.scaleY,z,W),A=U=null,function(K){var q=-1,E=W.length,O;while(++q=0)f._call.call(void 0,u);f=f._next}--o3}function iG(){py=(y5=$l.now())+$5,o3=_l=0;try{tG()}finally{o3=0,DY(),py=0}}function wY(){var f=$l.now(),u=f-y5;if(u>gG)$5-=u,y5=f}function DY(){var f,u=_5,_,y=1/0;while(u)if(u._call){if(y>u._time)y=u._time;f=u,u=u._next}else _=u._next,u._next=null,u=f?f._next=_:_5=_;yl=f,wJ(y)}function wJ(f){if(o3)return;if(_l)_l=clearTimeout(_l);var u=f-py;if(u>24){if(f<1/0)_l=setTimeout(iG,f-$l.now()-$5);if(ul)ul=clearInterval(ul)}else{if(!ul)y5=$l.now(),ul=setInterval(wY,gG);o3=1,nG(iG)}}function Jl(f,u,_){var y=new ll;return u=u==null?0:+u,y.restart(($)=>{y.stop(),f($+u)},u,_),y}var MY=xy("start","end","cancel","interrupt"),SY=[],aG=0,sG=1,J5=2,j5=3,oG=4,F5=5,Fl=6;function J_(f,u,_,y,$,l){var j=f.__transition;if(!j)f.__transition={};else if(_ in j)return;rY(f,_,{name:u,index:y,group:$,on:MY,tween:SY,time:l.time,delay:l.delay,duration:l.duration,ease:l.ease,timer:null,state:aG})}function Ql(f,u){var _=R0(f,u);if(_.state>aG)throw Error("too late; already scheduled");return _}function o0(f,u){var _=R0(f,u);if(_.state>j5)throw Error("too late; already running");return _}function R0(f,u){var _=f.__transition;if(!_||!(_=_[u]))throw Error("transition not found");return _}function rY(f,u,_){var y=f.__transition,$;y[u]=_,_.timer=l5(l,0,_.time);function l(A){if(_.state=sG,_.timer.restart(j,_.delay,_.time),_.delay<=A)j(A-_.delay)}function j(A){var U,z,W,K;if(_.state!==sG)return F();for(U in y){if(K=y[U],K.name!==_.name)continue;if(K.state===j5)return Jl(j);if(K.state===oG)K.state=Fl,K.timer.stop(),K.on.call("interrupt",f,f.__data__,K.index,K.group),delete y[U];else if(+UJ5&&y.state=0)u=u.slice(0,_);return!u||u==="start"})}function dY(f,u,_){var y,$,l=aY(u)?Ql:o0;return function(){var j=l(this,f),J=j.on;if(J!==y)($=(y=J).copy()).on(u,_);j.on=$}}function bJ(f,u){var _=this._id;return arguments.length<2?R0(this.node(),_).on.on(f):this.each(dY(_,f,u))}function eY(f){return function(){var u=this.parentNode;for(var _ in this.__transition)if(+_!==f)return;if(u)u.removeChild(this)}}function hJ(){return this.on("end.remove",eY(this._id))}function IJ(f){var u=this._name,_=this._id;if(typeof f!=="function")f=c_(f);for(var y=this._groups,$=y.length,l=Array($),j=0;j<$;++j)for(var J=y[j],F=J.length,A=l[j]=Array(F),U,z,W=0;W()=>f;function oJ(f,{sourceEvent:u,target:_,transform:y,dispatch:$}){Object.defineProperties(this,{type:{value:f,enumerable:!0,configurable:!0},sourceEvent:{value:u,enumerable:!0,configurable:!0},target:{value:_,enumerable:!0,configurable:!0},transform:{value:y,enumerable:!0,configurable:!0},_:{value:$}})}function V1(f,u,_){this.k=f,this.x=u,this.y=_}V1.prototype={constructor:V1,scale:function(f){return f===1?this:new V1(this.k*f,this.x,this.y)},translate:function(f,u){return f===0&u===0?this:new V1(this.k,this.x+this.k*f,this.y+this.k*u)},apply:function(f){return[f[0]*this.k+this.x,f[1]*this.k+this.y]},applyX:function(f){return f*this.k+this.x},applyY:function(f){return f*this.k+this.y},invert:function(f){return[(f[0]-this.x)/this.k,(f[1]-this.y)/this.k]},invertX:function(f){return(f-this.x)/this.k},invertY:function(f){return(f-this.y)/this.k},rescaleX:function(f){return f.copy().domain(f.range().map(this.invertX,this).map(f.invert,f))},rescaleY:function(f){return f.copy().domain(f.range().map(this.invertY,this).map(f.invert,f))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var my=new V1(1,0,0);Wl.prototype=V1.prototype;function Wl(f){while(!f.__zoom)if(!(f=f.parentNode))return my;return f.__zoom}function E5(f){f.stopImmediatePropagation()}function ky(f){f.preventDefault(),f.stopImmediatePropagation()}function KB(f){return(!f.ctrlKey||f.type==="wheel")&&!f.button}function ZB(){var f=this;if(f instanceof SVGElement){if(f=f.ownerSVGElement||f,f.hasAttribute("viewBox"))return f=f.viewBox.baseVal,[[f.x,f.y],[f.x+f.width,f.y+f.height]];return[[0,0],[f.width.baseVal.value,f.height.baseVal.value]]}return[[0,0],[f.clientWidth,f.clientHeight]]}function fK(){return this.__zoom||my}function qB(f){return-f.deltaY*(f.deltaMode===1?0.05:f.deltaMode?1:0.002)*(f.ctrlKey?10:1)}function HB(){return navigator.maxTouchPoints||"ontouchstart"in this}function EB(f,u,_){var y=f.invertX(u[0][0])-_[0][0],$=f.invertX(u[1][0])-_[1][0],l=f.invertY(u[0][1])-_[0][1],j=f.invertY(u[1][1])-_[1][1];return f.translate($>y?(y+$)/2:Math.min(0,y)||Math.max(0,$),j>l?(l+j)/2:Math.min(0,l)||Math.max(0,j))}function zl(){var f=KB,u=ZB,_=EB,y=qB,$=HB,l=[0,1/0],j=[[-1/0,-1/0],[1/0,1/0]],J=250,F=cy,A=xy("start","zoom","end"),U,z,W,K=500,q=150,E=0,O=10;function G(w){w.property("__zoom",fK).on("wheel.zoom",D,{passive:!1}).on("mousedown.zoom",x).on("dblclick.zoom",c).filter($).on("touchstart.zoom",v).on("touchmove.zoom",C).on("touchend.zoom touchcancel.zoom",P).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}G.transform=function(w,r,S,T){var Y=w.selection?w.selection():w;if(Y.property("__zoom",fK),w!==Y)L(w,r,S,T);else Y.interrupt().each(function(){M(this,arguments).event(T).start().zoom(null,typeof r==="function"?r.apply(this,arguments):r).end()})},G.scaleBy=function(w,r,S,T){G.scaleTo(w,function(){var Y=this.__zoom.k,R=typeof r==="function"?r.apply(this,arguments):r;return Y*R},S,T)},G.scaleTo=function(w,r,S,T){G.transform(w,function(){var Y=u.apply(this,arguments),R=this.__zoom,m=S==null?V(Y):typeof S==="function"?S.apply(this,arguments):S,p=R.invert(m),n=typeof r==="function"?r.apply(this,arguments):r;return _(Z(H(R,n),m,p),Y,j)},S,T)},G.translateBy=function(w,r,S,T){G.transform(w,function(){return _(this.__zoom.translate(typeof r==="function"?r.apply(this,arguments):r,typeof S==="function"?S.apply(this,arguments):S),u.apply(this,arguments),j)},null,T)},G.translateTo=function(w,r,S,T,Y){G.transform(w,function(){var R=u.apply(this,arguments),m=this.__zoom,p=T==null?V(R):typeof T==="function"?T.apply(this,arguments):T;return _(my.translate(p[0],p[1]).scale(m.k).translate(typeof r==="function"?-r.apply(this,arguments):-r,typeof S==="function"?-S.apply(this,arguments):-S),R,j)},T,Y)};function H(w,r){return r=Math.max(l[0],Math.min(l[1],r)),r===w.k?w:new V1(r,w.x,w.y)}function Z(w,r,S){var T=r[0]-S[0]*w.k,Y=r[1]-S[1]*w.k;return T===w.x&&Y===w.y?w:new V1(w.k,T,Y)}function V(w){return[(+w[0][0]+ +w[1][0])/2,(+w[0][1]+ +w[1][1])/2]}function L(w,r,S,T){w.on("start.zoom",function(){M(this,arguments).event(T).start()}).on("interrupt.zoom end.zoom",function(){M(this,arguments).event(T).end()}).tween("zoom",function(){var Y=this,R=arguments,m=M(Y,R).event(T),p=u.apply(Y,R),n=S==null?V(p):typeof S==="function"?S.apply(Y,R):S,_f=Math.max(p[1][0]-p[0][0],p[1][1]-p[0][1]),t=Y.__zoom,ff=typeof r==="function"?r.apply(Y,R):r,Gf=F(t.invert(n).concat(_f/t.k),ff.invert(n).concat(_f/ff.k));return function(zf){if(zf===1)zf=ff;else{var jf=Gf(zf),Wf=_f/jf[2];zf=new V1(Wf,n[0]-jf[0]*Wf,n[1]-jf[1]*Wf)}m.zoom(null,zf)}})}function M(w,r,S){return!S&&w.__zooming||new N(w,r)}function N(w,r){this.that=w,this.args=r,this.active=0,this.sourceEvent=null,this.extent=u.apply(w,r),this.taps=0}N.prototype={event:function(w){if(w)this.sourceEvent=w;return this},start:function(){if(++this.active===1)this.that.__zooming=this,this.emit("start");return this},zoom:function(w,r){if(this.mouse&&w!=="mouse")this.mouse[1]=r.invert(this.mouse[0]);if(this.touch0&&w!=="touch")this.touch0[1]=r.invert(this.touch0[0]);if(this.touch1&&w!=="touch")this.touch1[1]=r.invert(this.touch1[0]);return this.that.__zoom=r,this.emit("zoom"),this},end:function(){if(--this.active===0)delete this.that.__zooming,this.emit("end");return this},emit:function(w){var r=C0(this.that).datum();A.call(w,this.that,new oJ(w,{sourceEvent:this.sourceEvent,target:G,type:w,transform:this.that.__zoom,dispatch:A}),r)}};function D(w,...r){if(!f.apply(this,arguments))return;var S=M(this,r).event(w),T=this.__zoom,Y=Math.max(l[0],Math.min(l[1],T.k*Math.pow(2,y.apply(this,arguments)))),R=lu(w);if(S.wheel){if(S.mouse[0][0]!==R[0]||S.mouse[0][1]!==R[1])S.mouse[1]=T.invert(S.mouse[0]=R);clearTimeout(S.wheel)}else if(T.k===Y)return;else S.mouse=[R,T.invert(R)],m_(this),S.start();ky(w),S.wheel=setTimeout(m,q),S.zoom("mouse",_(Z(H(T,Y),S.mouse[0],S.mouse[1]),S.extent,j));function m(){S.wheel=null,S.end()}}function x(w,...r){if(W||!f.apply(this,arguments))return;var S=w.currentTarget,T=M(this,r,!0).event(w),Y=C0(w.view).on("mousemove.zoom",n,!0).on("mouseup.zoom",_f,!0),R=lu(w,S),m=w.clientX,p=w.clientY;g3(w.view),E5(w),T.mouse=[R,this.__zoom.invert(R)],m_(this),T.start();function n(t){if(ky(t),!T.moved){var ff=t.clientX-m,Gf=t.clientY-p;T.moved=ff*ff+Gf*Gf>E}T.event(t).zoom("mouse",_(Z(T.that.__zoom,T.mouse[0]=lu(t,S),T.mouse[1]),T.extent,j))}function _f(t){Y.on("mousemove.zoom mouseup.zoom",null),g6(t.view,T.moved),ky(t),T.event(t).end()}}function c(w,...r){if(!f.apply(this,arguments))return;var S=this.__zoom,T=lu(w.changedTouches?w.changedTouches[0]:w,this),Y=S.invert(T),R=S.k*(w.shiftKey?0.5:2),m=_(Z(H(S,R),T,Y),u.apply(this,r),j);if(ky(w),J>0)C0(this).transition().duration(J).call(L,m,T,w);else C0(this).call(G.transform,m,T,w)}function v(w,...r){if(!f.apply(this,arguments))return;var S=w.touches,T=S.length,Y=M(this,r,w.changedTouches.length===T).event(w),R,m,p,n;E5(w);for(m=0;m"[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:(f)=>`Node type "${f}" 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:(f)=>`The old edge with id=${f} does not exist.`,error009:(f)=>`Marker type "${f}" doesn't exist.`,error008:(f,{id:u,sourceHandle:_,targetHandle:y})=>`Couldn't create edge for ${f} handle id: "${f==="source"?_:y}", edge id: ${u}.`,error010:()=>"Handle: No node id found. Make sure to only use a Handle inside a custom Node.",error011:(f)=>`Edge type "${f}" not found. Using fallback type "default".`,error012:(f)=>`Node with id "${f}" does not exist, it may have been removed. This can happen when a node is deleted before the "onNodeClick" handler is called.`,error013:(f="react")=>`It seems that you haven't loaded the styles. Please import '@xyflow/${f}/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."},_$=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],uF=["Enter"," ","Escape"],_F={"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:f,x:u,y:_})=>`Moved selected node ${f}. New position, x: ${u}, y: ${_}`,"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"},g_;(function(f){f.Strict="strict",f.Loose="loose"})(g_||(g_={}));var Q_;(function(f){f.Free="free",f.Vertical="vertical",f.Horizontal="horizontal"})(Q_||(Q_={}));var iy;(function(f){f.Partial="partial",f.Full="full"})(iy||(iy={}));var yF={inProgress:!1,isValid:null,from:null,fromHandle:null,fromPosition:null,fromNode:null,to:null,toHandle:null,toPosition:null,toNode:null,pointer:null},v1;(function(f){f.Bezier="default",f.Straight="straight",f.Step="step",f.SmoothStep="smoothstep",f.SimpleBezier="simplebezier"})(v1||(v1={}));var n_;(function(f){f.Arrow="arrow",f.ArrowClosed="arrowclosed"})(n_||(n_={}));var Uf;(function(f){f.Left="left",f.Top="top",f.Right="right",f.Bottom="bottom"})(Uf||(Uf={}));var uK={[Uf.Left]:Uf.Right,[Uf.Right]:Uf.Left,[Uf.Top]:Uf.Bottom,[Uf.Bottom]:Uf.Top};function $F(f){return f===null?null:f?"valid":"invalid"}var lF=(f)=>("id"in f)&&("source"in f)&&("target"in f),GK=(f)=>("id"in f)&&("position"in f)&&!("source"in f)&&!("target"in f),jF=(f)=>("id"in f)&&("internals"in f)&&!("source"in f)&&!("target"in f);var Zl=(f,u=[0,0])=>{let{width:_,height:y}=b1(f),$=f.origin??u,l=_*$[0],j=y*$[1];return{x:f.position.x-l,y:f.position.y-j}},JF=(f,u={nodeOrigin:[0,0]})=>{if(f.length===0)return{x:0,y:0,width:0,height:0};let _=f.reduce((y,$)=>{let l=typeof $==="string",j=!u.nodeLookup&&!l?$:void 0;if(u.nodeLookup)j=l?u.nodeLookup.get($):!jF($)?u.nodeLookup.get($.id):$;let J=j?X5(j,u.nodeOrigin):{x:0,y:0,x2:0,y2:0};return L5(y,J)},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return Y5(_)},y$=(f,u={})=>{let _={x:1/0,y:1/0,x2:-1/0,y2:-1/0},y=!1;return f.forEach(($)=>{if(u.filter===void 0||u.filter($))_=L5(_,X5($)),y=!0}),y?Y5(_):{x:0,y:0,width:0,height:0}},N5=(f,u,[_,y,$]=[0,0,1],l=!1,j=!1)=>{let J={...j$(u,[_,y,$]),width:u.width/$,height:u.height/$},F=[];for(let A of f.values()){let{measured:U,selectable:z=!0,hidden:W=!1}=A;if(j&&!z||W)continue;let K=U.width??A.width??A.initialWidth??null,q=U.height??A.height??A.initialHeight??null,E=$$(J,ny(A)),O=(K??0)*(q??0),G=l&&E>0;if(!A.internals.handleBounds||G||E>=O||A.dragging)F.push(A)}return F},KK=(f,u)=>{let _=new Set;return f.forEach((y)=>{_.add(y.id)}),u.filter((y)=>_.has(y.source)||_.has(y.target))};function VB(f,u){let _=new Map,y=u?.nodes?new Set(u.nodes.map(($)=>$.id)):null;return f.forEach(($)=>{if($.measured.width&&$.measured.height&&(u?.includeHiddenNodes||!$.hidden)&&(!y||y.has($.id)))_.set($.id,$)}),_}async function ZK({nodes:f,width:u,height:_,panZoom:y,minZoom:$,maxZoom:l},j){if(f.size===0)return Promise.resolve(!0);let J=VB(f,j),F=y$(J),A=ql(F,u,_,j?.minZoom??$,j?.maxZoom??l,j?.padding??0.1);return await y.setViewport(A,{duration:j?.duration,ease:j?.ease,interpolate:j?.interpolate}),Promise.resolve(!0)}function FF({nodeId:f,nextPosition:u,nodeLookup:_,nodeOrigin:y=[0,0],nodeExtent:$,onError:l}){let j=_.get(f),J=j.parentId?_.get(j.parentId):void 0,{x:F,y:A}=J?J.internals.positionAbsolute:{x:0,y:0},U=j.origin??y,z=j.extent||$;if(j.extent==="parent"&&!j.expandParent)if(!J)l?.("005",hu.error005());else{let K=J.measured.width,q=J.measured.height;if(K&&q)z=[[F,A],[F+K,A+q]]}else if(J&&u$(j.extent))z=[[j.extent[0][0]+F,j.extent[0][1]+A],[j.extent[1][0]+F,j.extent[1][1]+A]];let W=u$(z)?gy(u,z,j.measured):u;if(j.measured.width===void 0||j.measured.height===void 0)l?.("015",hu.error015());return{position:{x:W.x-F+(j.measured.width??0)*U[0],y:W.y-A+(j.measured.height??0)*U[1]},positionAbsolute:W}}async function qK({nodesToRemove:f=[],edgesToRemove:u=[],nodes:_,edges:y,onBeforeDelete:$}){let l=new Set(f.map((W)=>W.id)),j=[];for(let W of _){if(W.deletable===!1)continue;let K=l.has(W.id),q=!K&&W.parentId&&j.find((E)=>E.id===W.parentId);if(K||q)j.push(W)}let J=new Set(u.map((W)=>W.id)),F=y.filter((W)=>W.deletable!==!1),U=KK(j,F);for(let W of F)if(J.has(W.id)&&!U.find((q)=>q.id===W.id))U.push(W);if(!$)return{edges:U,nodes:j};let z=await $({nodes:j,edges:U});if(typeof z==="boolean")return z?{edges:U,nodes:j}:{edges:[],nodes:[]};return z}var f$=(f,u=0,_=1)=>Math.min(Math.max(f,u),_),gy=(f={x:0,y:0},u,_)=>({x:f$(f.x,u[0][0],u[1][0]-(_?.width??0)),y:f$(f.y,u[0][1],u[1][1]-(_?.height??0))});function HK(f,u,_){let{width:y,height:$}=b1(_),{x:l,y:j}=_.internals.positionAbsolute;return gy(f,[[l,j],[l+y,j+$]],u)}var _K=(f,u,_)=>{if(f_)return-f$(Math.abs(f-_),1,u)/u;return 0},EK=(f,u,_=15,y=40)=>{let $=_K(f.x,y,u.width-y)*_,l=_K(f.y,y,u.height-y)*_;return[$,l]},L5=(f,u)=>({x:Math.min(f.x,u.x),y:Math.min(f.y,u.y),x2:Math.max(f.x2,u.x2),y2:Math.max(f.y2,u.y2)}),fF=({x:f,y:u,width:_,height:y})=>({x:f,y:u,x2:f+_,y2:u+y}),Y5=({x:f,y:u,x2:_,y2:y})=>({x:f,y:u,width:_-f,height:y-u}),ny=(f,u=[0,0])=>{let{x:_,y}=jF(f)?f.internals.positionAbsolute:Zl(f,u);return{x:_,y,width:f.measured?.width??f.width??f.initialWidth??0,height:f.measured?.height??f.height??f.initialHeight??0}},X5=(f,u=[0,0])=>{let{x:_,y}=jF(f)?f.internals.positionAbsolute:Zl(f,u);return{x:_,y,x2:_+(f.measured?.width??f.width??f.initialWidth??0),y2:y+(f.measured?.height??f.height??f.initialHeight??0)}},QF=(f,u)=>Y5(L5(fF(f),fF(u))),$$=(f,u)=>{let _=Math.max(0,Math.min(f.x+f.width,u.x+u.width)-Math.max(f.x,u.x)),y=Math.max(0,Math.min(f.y+f.height,u.y+u.height)-Math.max(f.y,u.y));return Math.ceil(_*y)},AF=(f)=>u1(f.width)&&u1(f.height)&&u1(f.x)&&u1(f.y),u1=(f)=>!isNaN(f)&&isFinite(f),UF=(f,u)=>{},l$=(f,u=[1,1])=>{return{x:u[0]*Math.round(f.x/u[0]),y:u[1]*Math.round(f.y/u[1])}},j$=({x:f,y:u},[_,y,$],l=!1,j=[1,1])=>{let J={x:(f-_)/$,y:(u-y)/$};return l?l$(J,j):J},Kl=({x:f,y:u},[_,y,$])=>{return{x:f*$+_,y:u*$+y}};function d3(f,u){if(typeof f==="number")return Math.floor((u-u/(1+f))*0.5);if(typeof f==="string"&&f.endsWith("px")){let _=parseFloat(f);if(!Number.isNaN(_))return Math.floor(_)}if(typeof f==="string"&&f.endsWith("%")){let _=parseFloat(f);if(!Number.isNaN(_))return Math.floor(u*_*0.01)}return console.error(`[React Flow] The padding value "${f}" is invalid. Please provide a number or a string with a valid unit (px or %).`),0}function OB(f,u,_){if(typeof f==="string"||typeof f==="number"){let y=d3(f,_),$=d3(f,u);return{top:y,right:$,bottom:y,left:$,x:$*2,y:y*2}}if(typeof f==="object"){let y=d3(f.top??f.y??0,_),$=d3(f.bottom??f.y??0,_),l=d3(f.left??f.x??0,u),j=d3(f.right??f.x??0,u);return{top:y,right:j,bottom:$,left:l,x:l+j,y:y+$}}return{top:0,right:0,bottom:0,left:0,x:0,y:0}}function XB(f,u,_,y,$,l){let{x:j,y:J}=Kl(f,[u,_,y]),{x:F,y:A}=Kl({x:f.x+f.width,y:f.y+f.height},[u,_,y]),U=$-F,z=l-A;return{left:Math.floor(j),top:Math.floor(J),right:Math.floor(U),bottom:Math.floor(z)}}var ql=(f,u,_,y,$,l)=>{let j=OB(l,u,_),J=(u-j.x)/f.width,F=(_-j.y)/f.height,A=Math.min(J,F),U=f$(A,y,$),z=f.x+f.width/2,W=f.y+f.height/2,K=u/2-z*U,q=_/2-W*U,E=XB(f,K,q,U,u,_),O={left:Math.min(E.left-j.left,0),top:Math.min(E.top-j.top,0),right:Math.min(E.right-j.right,0),bottom:Math.min(E.bottom-j.bottom,0)};return{x:K-O.left+O.right,y:q-O.top+O.bottom,zoom:U}},J$=()=>typeof navigator<"u"&&navigator?.userAgent?.indexOf("Mac")>=0;function u$(f){return f!==void 0&&f!==null&&f!=="parent"}function b1(f){return{width:f.measured?.width??f.width??f.initialWidth??0,height:f.measured?.height??f.height??f.initialHeight??0}}function WF(f){return(f.measured?.width??f.width??f.initialWidth)!==void 0&&(f.measured?.height??f.height??f.initialHeight)!==void 0}function zF(f,u={width:0,height:0},_,y,$){let l={...f},j=y.get(_);if(j){let J=j.origin||$;l.x+=j.internals.positionAbsolute.x-(u.width??0)*J[0],l.y+=j.internals.positionAbsolute.y-(u.height??0)*J[1]}return l}function GF(f,u){if(f.size!==u.size)return!1;for(let _ of f)if(!u.has(_))return!1;return!0}function VK(){let f,u;return{promise:new Promise((y,$)=>{f=y,u=$}),resolve:f,reject:u}}function OK(f){return{..._F,...f||{}}}function Gl(f,{snapGrid:u=[0,0],snapToGrid:_=!1,transform:y,containerBounds:$}){let{x:l,y:j}=_1(f),J=j$({x:l-($?.left??0),y:j-($?.top??0)},y),{x:F,y:A}=_?l$(J,u):J;return{xSnapped:F,ySnapped:A,...J}}var B5=(f)=>({width:f.offsetWidth,height:f.offsetHeight}),KF=(f)=>f?.getRootNode?.()||window?.document,NB=["INPUT","SELECT","TEXTAREA"];function ZF(f){let u=f.composedPath?.()?.[0]||f.target;if(u?.nodeType!==1)return!1;return NB.includes(u.nodeName)||u.hasAttribute("contenteditable")||!!u.closest(".nokey")}var qF=(f)=>("clientX"in f),_1=(f,u)=>{let _=qF(f),y=_?f.clientX:f.touches?.[0].clientX,$=_?f.clientY:f.touches?.[0].clientY;return{x:y-(u?.left??0),y:$-(u?.top??0)}},yK=(f,u,_,y,$)=>{let l=u.querySelectorAll(`.${f}`);if(!l||!l.length)return null;return Array.from(l).map((j)=>{let J=j.getBoundingClientRect();return{id:j.getAttribute("data-handleid"),type:f,nodeId:$,position:j.getAttribute("data-handlepos"),x:(J.left-_.left)/y,y:(J.top-_.top)/y,...B5(j)}})};function w5({sourceX:f,sourceY:u,targetX:_,targetY:y,sourceControlX:$,sourceControlY:l,targetControlX:j,targetControlY:J}){let F=f*0.125+$*0.375+j*0.375+_*0.125,A=u*0.125+l*0.375+J*0.375+y*0.125,U=Math.abs(F-f),z=Math.abs(A-u);return[F,A,U,z]}function V5(f,u){if(f>=0)return 0.5*f;return u*25*Math.sqrt(-f)}function $K({pos:f,x1:u,y1:_,x2:y,y2:$,c:l}){switch(f){case Uf.Left:return[u-V5(u-y,l),_];case Uf.Right:return[u+V5(y-u,l),_];case Uf.Top:return[u,_-V5(_-$,l)];case Uf.Bottom:return[u,_+V5($-_,l)]}}function D5({sourceX:f,sourceY:u,sourcePosition:_=Uf.Bottom,targetX:y,targetY:$,targetPosition:l=Uf.Top,curvature:j=0.25}){let[J,F]=$K({pos:_,x1:f,y1:u,x2:y,y2:$,c:j}),[A,U]=$K({pos:l,x1:y,y1:$,x2:f,y2:u,c:j}),[z,W,K,q]=w5({sourceX:f,sourceY:u,targetX:y,targetY:$,sourceControlX:J,sourceControlY:F,targetControlX:A,targetControlY:U});return[`M${f},${u} C${J},${F} ${A},${U} ${y},${$}`,z,W,K,q]}function HF({sourceX:f,sourceY:u,targetX:_,targetY:y}){let $=Math.abs(_-f)/2,l=_0}var LB=({source:f,sourceHandle:u,target:_,targetHandle:y})=>`xy-edge__${f}${u||""}-${_}${y||""}`,YB=(f,u)=>{return u.some((_)=>_.source===f.source&&_.target===f.target&&(_.sourceHandle===f.sourceHandle||!_.sourceHandle&&!f.sourceHandle)&&(_.targetHandle===f.targetHandle||!_.targetHandle&&!f.targetHandle))},EF=(f,u,_={})=>{if(!f.source||!f.target)return UF("006",hu.error006()),u;let y=_.getEdgeId||LB,$;if(lF(f))$={...f};else $={...f,id:y(f)};if(YB($,u))return u;if($.sourceHandle===null)delete $.sourceHandle;if($.targetHandle===null)delete $.targetHandle;return u.concat($)};function T5({sourceX:f,sourceY:u,targetX:_,targetY:y}){let[$,l,j,J]=HF({sourceX:f,sourceY:u,targetX:_,targetY:y});return[`M ${f},${u}L ${_},${y}`,$,l,j,J]}var lK={[Uf.Left]:{x:-1,y:0},[Uf.Right]:{x:1,y:0},[Uf.Top]:{x:0,y:-1},[Uf.Bottom]:{x:0,y:1}},BB=({source:f,sourcePosition:u=Uf.Bottom,target:_})=>{if(u===Uf.Left||u===Uf.Right)return f.x<_.x?{x:1,y:0}:{x:-1,y:0};return f.y<_.y?{x:0,y:1}:{x:0,y:-1}},jK=(f,u)=>Math.sqrt(Math.pow(u.x-f.x,2)+Math.pow(u.y-f.y,2));function wB({source:f,sourcePosition:u=Uf.Bottom,target:_,targetPosition:y=Uf.Top,center:$,offset:l,stepPosition:j}){let J=lK[u],F=lK[y],A={x:f.x+J.x*l,y:f.y+J.y*l},U={x:_.x+F.x*l,y:_.y+F.y*l},z=BB({source:A,sourcePosition:u,target:U}),W=z.x!==0?"x":"y",K=z[W],q=[],E,O,G={x:0,y:0},H={x:0,y:0},[,,Z,V]=HF({sourceX:f.x,sourceY:f.y,targetX:_.x,targetY:_.y});if(J[W]*F[W]===-1){if(W==="x")E=$.x??A.x+(U.x-A.x)*j,O=$.y??(A.y+U.y)/2;else E=$.x??(A.x+U.x)/2,O=$.y??A.y+(U.y-A.y)*j;let D=[{x:E,y:A.y},{x:E,y:U.y}],x=[{x:A.x,y:O},{x:U.x,y:O}];if(J[W]===K)q=W==="x"?D:x;else q=W==="x"?x:D}else{let D=[{x:A.x,y:U.y}],x=[{x:U.x,y:A.y}];if(W==="x")q=J.x===K?x:D;else q=J.y===K?D:x;if(u===y){let w=Math.abs(f[W]-_[W]);if(w<=l){let r=Math.min(l-1,l-w);if(J[W]===K)G[W]=(A[W]>f[W]?-1:1)*r;else H[W]=(U[W]>_[W]?-1:1)*r}}if(u!==y){let w=W==="x"?"y":"x",r=J[W]===F[w],S=A[w]>U[w],T=A[w]=P)E=(c.x+v.x)/2,O=q[0].y;else E=q[0].x,O=(c.y+v.y)/2}let L={x:A.x+G.x,y:A.y+G.y},M={x:U.x+H.x,y:U.y+H.y};return[[f,...L.x!==q[0].x||L.y!==q[0].y?[L]:[],...q,...M.x!==q[q.length-1].x||M.y!==q[q.length-1].y?[M]:[],_],E,O,Z,V]}function DB(f,u,_,y){let $=Math.min(jK(f,u)/2,jK(u,_)/2,y),{x:l,y:j}=u;if(f.x===l&&l===_.x||f.y===j&&j===_.y)return`L${l} ${j}`;if(f.y===j){let A=f.x<_.x?-1:1,U=f.y<_.y?1:-1;return`L ${l+$*A},${j}Q ${l},${j} ${l},${j+$*U}`}let J=f.x<_.x?1:-1,F=f.y<_.y?-1:1;return`L ${l},${j+$*F}Q ${l},${j} ${l+$*J},${j}`}function Hl({sourceX:f,sourceY:u,sourcePosition:_=Uf.Bottom,targetX:y,targetY:$,targetPosition:l=Uf.Top,borderRadius:j=5,centerX:J,centerY:F,offset:A=20,stepPosition:U=0.5}){let[z,W,K,q,E]=wB({source:{x:f,y:u},sourcePosition:_,target:{x:y,y:$},targetPosition:l,center:{x:J,y:F},offset:A,stepPosition:U}),O=`M${z[0].x} ${z[0].y}`;for(let G=1;G_.id===u))||null}function M5(f,u){if(!f)return"";if(typeof f==="string")return f;return`${u?`${u}__`:""}${Object.keys(f).sort().map((y)=>`${y}=${f[y]}`).join("&")}`}function YK(f,{id:u,defaultColor:_,defaultMarkerStart:y,defaultMarkerEnd:$}){let l=new Set;return f.reduce((j,J)=>{return[J.markerStart||y,J.markerEnd||$].forEach((F)=>{if(F&&typeof F==="object"){let A=M5(F,u);if(!l.has(A))j.push({id:A,color:F.color||_,...F}),l.add(A)}}),j},[]).sort((j,J)=>j.id.localeCompare(J.id))}var BK=1000,TB=10,VF={nodeOrigin:[0,0],nodeExtent:_$,elevateNodesOnSelect:!0,zIndexMode:"basic",defaults:{}},MB={...VF,checkEquality:!0};function OF(f,u){let _={...f};for(let y in u)if(u[y]!==void 0)_[y]=u[y];return _}function wK(f,u,_){let y=OF(VF,_);for(let $ of f.values())if($.parentId)NF($,f,u,y);else{let l=Zl($,y.nodeOrigin),j=u$($.extent)?$.extent:y.nodeExtent,J=gy(l,j,b1($));$.internals.positionAbsolute=J}}function SB(f,u){if(!f.handles)return!f.measured?void 0:u?.internals.handleBounds;let _=[],y=[];for(let $ of f.handles){let l={id:$.id,width:$.width??1,height:$.height??1,nodeId:f.id,x:$.x,y:$.y,position:$.position,type:$.type};if($.type==="source")_.push(l);else if($.type==="target")y.push(l)}return{source:_,target:y}}function XF(f){return f==="manual"}function S5(f,u,_,y={}){let $=OF(MB,y),l={i:0},j=new Map(u),J=$?.elevateNodesOnSelect&&!XF($.zIndexMode)?BK:0,F=f.length>0,A=!1;u.clear(),_.clear();for(let U of f){let z=j.get(U.id);if($.checkEquality&&U===z?.internals.userNode)u.set(U.id,z);else{let W=Zl(U,$.nodeOrigin),K=u$(U.extent)?U.extent:$.nodeExtent,q=gy(W,K,b1(U));z={...$.defaults,...U,measured:{width:U.measured?.width,height:U.measured?.height},internals:{positionAbsolute:q,handleBounds:SB(U,z),z:DK(U,J,$.zIndexMode),userNode:U}},u.set(U.id,z)}if((z.measured===void 0||z.measured.width===void 0||z.measured.height===void 0)&&!z.hidden)F=!1;if(U.parentId)NF(z,u,_,y,l);A||=U.selected??!1}return{nodesInitialized:F,hasSelectedNodes:A}}function rB(f,u){if(!f.parentId)return;let _=u.get(f.parentId);if(_)_.set(f.id,f);else u.set(f.parentId,new Map([[f.id,f]]))}function NF(f,u,_,y,$){let{elevateNodesOnSelect:l,nodeOrigin:j,nodeExtent:J,zIndexMode:F}=OF(VF,y),A=f.parentId,U=u.get(A);if(!U){console.warn(`Parent node ${A} not found. Please make sure that parent nodes are in front of their child nodes in the nodes array.`);return}if(rB(f,_),$&&!U.parentId&&U.internals.rootParentIndex===void 0&&F==="auto")U.internals.rootParentIndex=++$.i,U.internals.z=U.internals.z+$.i*TB;if($&&U.internals.rootParentIndex!==void 0)$.i=U.internals.rootParentIndex;let z=l&&!XF(F)?BK:0,{x:W,y:K,z:q}=PB(f,U,j,J,z,F),{positionAbsolute:E}=f.internals,O=W!==E.x||K!==E.y;if(O||q!==f.internals.z)u.set(f.id,{...f,internals:{...f.internals,positionAbsolute:O?{x:W,y:K}:E,z:q}})}function DK(f,u,_){let y=u1(f.zIndex)?f.zIndex:0;if(XF(_))return y;return y+(f.selected?u:0)}function PB(f,u,_,y,$,l){let{x:j,y:J}=u.internals.positionAbsolute,F=b1(f),A=Zl(f,_),U=u$(f.extent)?gy(A,f.extent,F):A,z=gy({x:j+U.x,y:J+U.y},y,F);if(f.extent==="parent")z=HK(z,F,u);let W=DK(f,$,l),K=u.internals.z??0;return{x:z.x,y:z.y,z:K>=W?K+1:W}}function r5(f,u,_,y=[0,0]){let $=[],l=new Map;for(let j of f){let J=u.get(j.parentId);if(!J)continue;let F=l.get(j.parentId)?.expandedRect??ny(J),A=QF(F,j.rect);l.set(j.parentId,{expandedRect:A,parent:J})}if(l.size>0)l.forEach(({expandedRect:j,parent:J},F)=>{let A=J.internals.positionAbsolute,U=b1(J),z=J.origin??y,W=j.x0||K>0||O||G)$.push({id:F,type:"position",position:{x:J.position.x-W+O,y:J.position.y-K+G}}),_.get(F)?.forEach((H)=>{if(!f.some((Z)=>Z.id===H.id))$.push({id:H.id,type:"position",position:{x:H.position.x+W,y:H.position.y+K}})});if(U.width0){let K=r5(W,u,_,$);A.push(...K)}return{changes:A,updatedInternals:F}}async function MK({delta:f,panZoom:u,transform:_,translateExtent:y,width:$,height:l}){if(!u||!f.x&&!f.y)return Promise.resolve(!1);let j=await u.setViewportConstrained({x:_[0]+f.x,y:_[1]+f.y,zoom:_[2]},[[0,0],[$,l]],y),J=!!j&&(j.x!==_[0]||j.y!==_[1]||j.k!==_[2]);return Promise.resolve(J)}function AK(f,u,_,y,$,l){let j=$,J=y.get(j)||new Map;y.set(j,J.set(_,u)),j=`${$}-${f}`;let F=y.get(j)||new Map;if(y.set(j,F.set(_,u)),l){j=`${$}-${f}-${l}`;let A=y.get(j)||new Map;y.set(j,A.set(_,u))}}function LF(f,u,_){f.clear(),u.clear();for(let y of _){let{source:$,target:l,sourceHandle:j=null,targetHandle:J=null}=y,F={edgeId:y.id,source:$,target:l,sourceHandle:j,targetHandle:J},A=`${$}-${j}--${l}-${J}`,U=`${l}-${J}--${$}-${j}`;AK("source",F,U,f,$,j),AK("target",F,A,f,l,J),u.set(y.id,y)}}function SK(f,u){if(!f.parentId)return!1;let _=u.get(f.parentId);if(!_)return!1;if(_.selected)return!0;return SK(_,u)}function UK(f,u,_){let y=f;do{if(y?.matches?.(u))return!0;if(y===_)return!1;y=y?.parentElement}while(y);return!1}function CB(f,u,_,y){let $=new Map;for(let[l,j]of f)if((j.selected||j.id===y)&&(!j.parentId||!SK(j,f))&&(j.draggable||u&&typeof j.draggable>"u")){let J=f.get(l);if(J)$.set(l,{id:l,position:J.position||{x:0,y:0},distance:{x:_.x-J.internals.positionAbsolute.x,y:_.y-J.internals.positionAbsolute.y},extent:J.extent,parentId:J.parentId,origin:J.origin,expandParent:J.expandParent,internals:{positionAbsolute:J.internals.positionAbsolute||{x:0,y:0}},measured:{width:J.measured.width??0,height:J.measured.height??0}})}return $}function aJ({nodeId:f,dragItems:u,nodeLookup:_,dragging:y=!0}){let $=[];for(let[j,J]of u){let F=_.get(j)?.internals.userNode;if(F)$.push({...F,position:J.position,dragging:y})}if(!f)return[$[0],$];let l=_.get(f)?.internals.userNode;return[!l?$[0]:{...l,position:u.get(f)?.position||l.position,dragging:y},$]}function RB({dragItems:f,snapGrid:u,x:_,y}){let $=f.values().next().value;if(!$)return null;let l={x:_-$.distance.x,y:y-$.distance.y},j=l$(l,u);return{x:j.x-l.x,y:j.y-l.y}}function rK({onNodeMouseDown:f,getStoreItems:u,onDragStart:_,onDrag:y,onDragStop:$}){let l={x:null,y:null},j=0,J=new Map,F=!1,A={x:0,y:0},U=null,z=!1,W=null,K=!1,q=!1,E=null;function O({noDragClassName:H,handleSelector:Z,domNode:V,isSelectable:L,nodeId:M,nodeClickDistance:N=0}){W=C0(V);function D({x:C,y:P}){let{nodeLookup:w,nodeExtent:r,snapGrid:S,snapToGrid:T,nodeOrigin:Y,onNodeDrag:R,onSelectionDrag:m,onError:p,updateNodePositions:n}=u();l={x:C,y:P};let _f=!1,t=J.size>1,ff=t&&r?fF(y$(J)):null,Gf=t&&T?RB({dragItems:J,snapGrid:S,x:C,y:P}):null;for(let[zf,jf]of J){if(!w.has(zf))continue;let Wf={x:C-jf.distance.x,y:P-jf.distance.y};if(T)Wf=Gf?{x:Math.round(Wf.x+Gf.x),y:Math.round(Wf.y+Gf.y)}:l$(Wf,S);let Vf=null;if(t&&r&&!jf.extent&&ff){let{positionAbsolute:g}=jf.internals,I=g.x-ff.x+r[0][0],$f=g.x+jf.measured.width-ff.x2+r[1][0],lf=g.y-ff.y+r[0][1],Af=g.y+jf.measured.height-ff.y2+r[1][1];Vf=[[I,lf],[$f,Af]]}let{position:Zf,positionAbsolute:h}=FF({nodeId:zf,nextPosition:Wf,nodeLookup:w,nodeExtent:Vf?Vf:r,nodeOrigin:Y,onError:p});_f=_f||jf.position.x!==Zf.x||jf.position.y!==Zf.y,jf.position=Zf,jf.internals.positionAbsolute=h}if(q=q||_f,!_f)return;if(n(J,!0),E&&(y||R||!M&&m)){let[zf,jf]=aJ({nodeId:M,dragItems:J,nodeLookup:w});if(y?.(E,J,zf,jf),R?.(E,zf,jf),!M)m?.(E,jf)}}async function x(){if(!U)return;let{transform:C,panBy:P,autoPanSpeed:w,autoPanOnNodeDrag:r}=u();if(!r){F=!1,cancelAnimationFrame(j);return}let[S,T]=EK(A,U,w);if(S!==0||T!==0){if(l.x=(l.x??0)-S/C[2],l.y=(l.y??0)-T/C[2],await P({x:S,y:T}))D(l)}j=requestAnimationFrame(x)}function c(C){let{nodeLookup:P,multiSelectionActive:w,nodesDraggable:r,transform:S,snapGrid:T,snapToGrid:Y,selectNodesOnDrag:R,onNodeDragStart:m,onSelectionDragStart:p,unselectNodesAndEdges:n}=u();if(z=!0,(!R||!L)&&!w&&M){if(!P.get(M)?.selected)n()}if(L&&R&&M)f?.(M);let _f=Gl(C.sourceEvent,{transform:S,snapGrid:T,snapToGrid:Y,containerBounds:U});if(l=_f,J=CB(P,r,_f,M),J.size>0&&(_||m||!M&&p)){let[t,ff]=aJ({nodeId:M,dragItems:J,nodeLookup:P});if(_?.(C.sourceEvent,J,t,ff),m?.(C.sourceEvent,t,ff),!M)p?.(C.sourceEvent,ff)}}let v=s6().clickDistance(N).on("start",(C)=>{let{domNode:P,nodeDragThreshold:w,transform:r,snapGrid:S,snapToGrid:T}=u();if(U=P?.getBoundingClientRect()||null,K=!1,q=!1,E=C.sourceEvent,w===0)c(C);l=Gl(C.sourceEvent,{transform:r,snapGrid:S,snapToGrid:T,containerBounds:U}),A=_1(C.sourceEvent,U)}).on("drag",(C)=>{let{autoPanOnNodeDrag:P,transform:w,snapGrid:r,snapToGrid:S,nodeDragThreshold:T,nodeLookup:Y}=u(),R=Gl(C.sourceEvent,{transform:w,snapGrid:r,snapToGrid:S,containerBounds:U});if(E=C.sourceEvent,C.sourceEvent.type==="touchmove"&&C.sourceEvent.touches.length>1||M&&!Y.has(M))K=!0;if(K)return;if(!F&&P&&z)F=!0,x();if(!z){let m=_1(C.sourceEvent,U),p=m.x-A.x,n=m.y-A.y;if(Math.sqrt(p*p+n*n)>T)c(C)}if((l.x!==R.xSnapped||l.y!==R.ySnapped)&&J&&z)A=_1(C.sourceEvent,U),D(R)}).on("end",(C)=>{if(!z||K)return;if(F=!1,z=!1,cancelAnimationFrame(j),J.size>0){let{nodeLookup:P,updateNodePositions:w,onNodeDragStop:r,onSelectionDragStop:S}=u();if(q)w(J,!1),q=!1;if($||r||!M&&S){let[T,Y]=aJ({nodeId:M,dragItems:J,nodeLookup:P,dragging:!1});if($?.(C.sourceEvent,J,T,Y),r?.(C.sourceEvent,T,Y),!M)S?.(C.sourceEvent,Y)}}}).filter((C)=>{let P=C.target;return!C.button&&(!H||!UK(P,`.${H}`,V))&&(!Z||UK(P,Z,V))});W.call(v)}function G(){W?.on(".drag",null)}return{update:O,destroy:G}}function xB(f,u,_){let y=[],$={x:f.x-_,y:f.y-_,width:_*2,height:_*2};for(let l of u.values())if($$($,ny(l))>0)y.push(l);return y}var vB=250;function bB(f,u,_,y){let $=[],l=1/0,j=xB(f,_,u+vB);for(let J of j){let F=[...J.internals.handleBounds?.source??[],...J.internals.handleBounds?.target??[]];for(let A of F){if(y.nodeId===A.nodeId&&y.type===A.type&&y.id===A.id)continue;let{x:U,y:z}=t_(J,A,A.position,!0),W=Math.sqrt(Math.pow(U-f.x,2)+Math.pow(z-f.y,2));if(W>u)continue;if(W1){let J=y.type==="source"?"target":"source";return $.find((F)=>F.type===J)??$[0]}return $[0]}function PK(f,u,_,y,$,l=!1){let j=y.get(f);if(!j)return null;let J=$==="strict"?j.internals.handleBounds?.[u]:[...j.internals.handleBounds?.source??[],...j.internals.handleBounds?.target??[]],F=(_?J?.find((A)=>A.id===_):J?.[0])??null;return F&&l?{...F,...t_(j,F,F.position,!0)}:F}function CK(f,u){if(f)return f;else if(u?.classList.contains("target"))return"target";else if(u?.classList.contains("source"))return"source";return null}function hB(f,u){let _=null;if(u)_=!0;else if(f&&!u)_=!1;return _}var RK=()=>!0;function IB(f,{connectionMode:u,connectionRadius:_,handleId:y,nodeId:$,edgeUpdaterType:l,isTarget:j,domNode:J,nodeLookup:F,lib:A,autoPanOnConnect:U,flowId:z,panBy:W,cancelConnection:K,onConnectStart:q,onConnect:E,onConnectEnd:O,isValidConnection:G=RK,onReconnectEnd:H,updateConnection:Z,getTransform:V,getFromHandle:L,autoPanSpeed:M,dragThreshold:N=1,handleDomNode:D}){let x=KF(f.target),c=0,v,{x:C,y:P}=_1(f),w=CK(l,D),r=J?.getBoundingClientRect(),S=!1;if(!r||!w)return;let T=PK($,w,y,F,u);if(!T)return;let Y=_1(f,r),R=!1,m=null,p=!1,n=null;function _f(){if(!U||!r)return;let[Zf,h]=EK(Y,r,M);W({x:Zf,y:h}),c=requestAnimationFrame(_f)}let t={...T,nodeId:$,type:w,position:T.position},ff=F.get($),zf={inProgress:!0,isValid:null,from:t_(ff,t,Uf.Left,!0),fromHandle:t,fromPosition:t.position,fromNode:ff,to:Y,toHandle:null,toPosition:uK[t.position],toNode:null,pointer:Y};function jf(){S=!0,Z(zf),q?.(f,{nodeId:$,handleId:y,handleType:w})}if(N===0)jf();function Wf(Zf){if(!S){let{x:Af,y:Yf}=_1(Zf),xf=Af-C,sf=Yf-P;if(!(xf*xf+sf*sf>N*N))return;jf()}if(!L()||!t){Vf(Zf);return}let h=V();if(Y=_1(Zf,r),v=bB(j$(Y,h,!1,[1,1]),_,F,t),!R)_f(),R=!0;let g=xK(Zf,{handle:v,connectionMode:u,fromNodeId:$,fromHandleId:y,fromType:j?"target":"source",isValidConnection:G,doc:x,lib:A,flowId:z,nodeLookup:F});n=g.handleDomNode,m=g.connection,p=hB(!!v,g.isValid);let I=F.get($),$f=I?t_(I,t,Uf.Left,!0):zf.from,lf={...zf,from:$f,isValid:p,to:g.toHandle&&p?Kl({x:g.toHandle.x,y:g.toHandle.y},h):Y,toHandle:g.toHandle,toPosition:p&&g.toHandle?g.toHandle.position:uK[t.position],toNode:g.toHandle?F.get(g.toHandle.nodeId):null,pointer:Y};Z(lf),zf=lf}function Vf(Zf){if("touches"in Zf&&Zf.touches.length>0)return;if(S){if((v||n)&&m&&p)E?.(m);let{inProgress:h,...g}=zf,I={...g,toPosition:zf.toHandle?zf.toPosition:null};if(O?.(Zf,I),l)H?.(Zf,I)}K(),cancelAnimationFrame(c),R=!1,p=!1,m=null,n=null,x.removeEventListener("mousemove",Wf),x.removeEventListener("mouseup",Vf),x.removeEventListener("touchmove",Wf),x.removeEventListener("touchend",Vf)}x.addEventListener("mousemove",Wf),x.addEventListener("mouseup",Vf),x.addEventListener("touchmove",Wf),x.addEventListener("touchend",Vf)}function xK(f,{handle:u,connectionMode:_,fromNodeId:y,fromHandleId:$,fromType:l,doc:j,lib:J,flowId:F,isValidConnection:A=RK,nodeLookup:U}){let z=l==="target",W=u?j.querySelector(`.${J}-flow__handle[data-id="${F}-${u?.nodeId}-${u?.id}-${u?.type}"]`):null,{x:K,y:q}=_1(f),E=j.elementFromPoint(K,q),O=E?.classList.contains(`${J}-flow__handle`)?E:W,G={handleDomNode:O,isValid:!1,connection:null,toHandle:null};if(O){let H=CK(void 0,O),Z=O.getAttribute("data-nodeid"),V=O.getAttribute("data-handleid"),L=O.classList.contains("connectable"),M=O.classList.contains("connectableend");if(!Z||!H)return G;let N={source:z?Z:y,sourceHandle:z?V:$,target:z?y:Z,targetHandle:z?$:V};G.connection=N;let x=L&&M&&(_===g_.Strict?z&&H==="source"||!z&&H==="target":Z!==y||V!==$);G.isValid=x&&A(N),G.toHandle=PK(Z,H,V,U,_,!0)}return G}var P5={onPointerDown:IB,isValid:xK};function vK({domNode:f,panZoom:u,getTransform:_,getViewScale:y}){let $=C0(f);function l({translateExtent:J,width:F,height:A,zoomStep:U=1,pannable:z=!0,zoomable:W=!0,inversePan:K=!1}){let q=(Z)=>{if(Z.sourceEvent.type!=="wheel"||!u)return;let V=_(),L=Z.sourceEvent.ctrlKey&&J$()?10:1,M=-Z.sourceEvent.deltaY*(Z.sourceEvent.deltaMode===1?0.05:Z.sourceEvent.deltaMode?1:0.002)*U,N=V[2]*Math.pow(2,M*L);u.scaleTo(N)},E=[0,0],O=(Z)=>{if(Z.sourceEvent.type==="mousedown"||Z.sourceEvent.type==="touchstart")E=[Z.sourceEvent.clientX??Z.sourceEvent.touches[0].clientX,Z.sourceEvent.clientY??Z.sourceEvent.touches[0].clientY]},G=(Z)=>{let V=_();if(Z.sourceEvent.type!=="mousemove"&&Z.sourceEvent.type!=="touchmove"||!u)return;let L=[Z.sourceEvent.clientX??Z.sourceEvent.touches[0].clientX,Z.sourceEvent.clientY??Z.sourceEvent.touches[0].clientY],M=[L[0]-E[0],L[1]-E[1]];E=L;let N=y()*Math.max(V[2],Math.log(V[2]))*(K?-1:1),D={x:V[0]-M[0]*N,y:V[1]-M[1]*N},x=[[0,0],[F,A]];u.setViewportConstrained({x:D.x,y:D.y,zoom:V[2]},x,J)},H=zl().on("start",O).on("zoom",z?G:null).on("zoom.wheel",W?q:null);$.call(H,{})}function j(){$.on("zoom",null)}return{update:l,destroy:j,pointer:lu}}var C5=(f)=>({x:f.x,y:f.y,zoom:f.k}),dJ=({x:f,y:u,zoom:_})=>my.translate(f,u).scale(_),e3=(f,u)=>f.target.closest(`.${u}`),bK=(f,u)=>u===2&&Array.isArray(f)&&f.includes(2),cB=(f)=>((f*=2)<=1?f*f*f:(f-=2)*f*f+2)/2,eJ=(f,u=0,_=cB,y=()=>{})=>{let $=typeof u==="number"&&u>0;if(!$)y();return $?f.transition().duration(u).ease(_).on("end",y):f},hK=(f)=>{let u=f.ctrlKey&&J$()?10:1;return-f.deltaY*(f.deltaMode===1?0.05:f.deltaMode?1:0.002)*u};function pB({zoomPanValues:f,noWheelClassName:u,d3Selection:_,d3Zoom:y,panOnScrollMode:$,panOnScrollSpeed:l,zoomOnPinch:j,onPanZoomStart:J,onPanZoom:F,onPanZoomEnd:A}){return(U)=>{if(e3(U,u)){if(U.ctrlKey)U.preventDefault();return!1}U.preventDefault(),U.stopImmediatePropagation();let z=_.property("__zoom").k||1;if(U.ctrlKey&&j){let O=lu(U),G=hK(U),H=z*Math.pow(2,G);y.scaleTo(_,H,O,U);return}let W=U.deltaMode===1?20:1,K=$===Q_.Vertical?0:U.deltaX*W,q=$===Q_.Horizontal?0:U.deltaY*W;if(!J$()&&U.shiftKey&&$!==Q_.Vertical)K=U.deltaY*W,q=0;y.translateBy(_,-(K/z)*l,-(q/z)*l,{internal:!0});let E=C5(_.property("__zoom"));if(clearTimeout(f.panScrollTimeout),!f.isPanScrolling)f.isPanScrolling=!0,J?.(U,E);else F?.(U,E),f.panScrollTimeout=setTimeout(()=>{A?.(U,E),f.isPanScrolling=!1},150)}}function mB({noWheelClassName:f,preventScrolling:u,d3ZoomHandler:_}){return function(y,$){let l=y.type==="wheel",j=!u&&l&&!y.ctrlKey,J=e3(y,f);if(y.ctrlKey&&l&&J)y.preventDefault();if(j||J)return null;y.preventDefault(),_.call(this,y,$)}}function kB({zoomPanValues:f,onDraggingChange:u,onPanZoomStart:_}){return(y)=>{if(y.sourceEvent?.internal)return;let $=C5(y.transform);if(f.mouseButton=y.sourceEvent?.button||0,f.isZoomingOrPanning=!0,f.prevViewport=$,y.sourceEvent?.type==="mousedown")u(!0);if(_)_?.(y.sourceEvent,$)}}function iB({zoomPanValues:f,panOnDrag:u,onPaneContextMenu:_,onTransformChange:y,onPanZoom:$}){return(l)=>{if(f.usedRightMouseButton=!!(_&&bK(u,f.mouseButton??0)),!l.sourceEvent?.sync)y([l.transform.x,l.transform.y,l.transform.k]);if($&&!l.sourceEvent?.internal)$?.(l.sourceEvent,C5(l.transform))}}function gB({zoomPanValues:f,panOnDrag:u,panOnScroll:_,onDraggingChange:y,onPanZoomEnd:$,onPaneContextMenu:l}){return(j)=>{if(j.sourceEvent?.internal)return;if(f.isZoomingOrPanning=!1,l&&bK(u,f.mouseButton??0)&&!f.usedRightMouseButton&&j.sourceEvent)l(j.sourceEvent);if(f.usedRightMouseButton=!1,y(!1),$){let J=C5(j.transform);f.prevViewport=J,clearTimeout(f.timerId),f.timerId=setTimeout(()=>{$?.(j.sourceEvent,J)},_?150:0)}}}function nB({zoomActivationKeyPressed:f,zoomOnScroll:u,zoomOnPinch:_,panOnDrag:y,panOnScroll:$,zoomOnDoubleClick:l,userSelectionActive:j,noWheelClassName:J,noPanClassName:F,lib:A,connectionInProgress:U}){return(z)=>{let W=f||u,K=_&&z.ctrlKey,q=z.type==="wheel";if(z.button===1&&z.type==="mousedown"&&(e3(z,`${A}-flow__node`)||e3(z,`${A}-flow__edge`)))return!0;if(!y&&!W&&!$&&!l&&!_)return!1;if(j)return!1;if(U&&!q)return!1;if(e3(z,J)&&q)return!1;if(e3(z,F)&&(!q||$&&q&&!f))return!1;if(!_&&z.ctrlKey&&q)return!1;if(!_&&z.type==="touchstart"&&z.touches?.length>1)return z.preventDefault(),!1;if(!W&&!$&&!K&&q)return!1;if(!y&&(z.type==="mousedown"||z.type==="touchstart"))return!1;if(Array.isArray(y)&&!y.includes(z.button)&&z.type==="mousedown")return!1;let E=Array.isArray(y)&&y.includes(z.button)||!z.button||z.button<=1;return(!z.ctrlKey||q)&&E}}function IK({domNode:f,minZoom:u,maxZoom:_,translateExtent:y,viewport:$,onPanZoom:l,onPanZoomStart:j,onPanZoomEnd:J,onDraggingChange:F}){let A={isZoomingOrPanning:!1,usedRightMouseButton:!1,prevViewport:{x:0,y:0,zoom:0},mouseButton:0,timerId:void 0,panScrollTimeout:void 0,isPanScrolling:!1},U=f.getBoundingClientRect(),z=zl().scaleExtent([u,_]).translateExtent(y),W=C0(f).call(z);H({x:$.x,y:$.y,zoom:f$($.zoom,u,_)},[[0,0],[U.width,U.height]],y);let K=W.on("wheel.zoom"),q=W.on("dblclick.zoom");z.wheelDelta(hK);function E(v,C){if(W)return new Promise((P)=>{z?.interpolate(C?.interpolate==="linear"?x1:cy).transform(eJ(W,C?.duration,C?.ease,()=>P(!0)),v)});return Promise.resolve(!1)}function O({noWheelClassName:v,noPanClassName:C,onPaneContextMenu:P,userSelectionActive:w,panOnScroll:r,panOnDrag:S,panOnScrollMode:T,panOnScrollSpeed:Y,preventScrolling:R,zoomOnPinch:m,zoomOnScroll:p,zoomOnDoubleClick:n,zoomActivationKeyPressed:_f,lib:t,onTransformChange:ff,connectionInProgress:Gf,paneClickDistance:zf,selectionOnDrag:jf}){if(w&&!A.isZoomingOrPanning)G();let Wf=r&&!_f&&!w;z.clickDistance(jf?1/0:!u1(zf)||zf<0?0:zf);let Vf=Wf?pB({zoomPanValues:A,noWheelClassName:v,d3Selection:W,d3Zoom:z,panOnScrollMode:T,panOnScrollSpeed:Y,zoomOnPinch:m,onPanZoomStart:j,onPanZoom:l,onPanZoomEnd:J}):mB({noWheelClassName:v,preventScrolling:R,d3ZoomHandler:K});if(W.on("wheel.zoom",Vf,{passive:!1}),!w){let h=kB({zoomPanValues:A,onDraggingChange:F,onPanZoomStart:j});z.on("start",h);let g=iB({zoomPanValues:A,panOnDrag:S,onPaneContextMenu:!!P,onPanZoom:l,onTransformChange:ff});z.on("zoom",g);let I=gB({zoomPanValues:A,panOnDrag:S,panOnScroll:r,onPaneContextMenu:P,onPanZoomEnd:J,onDraggingChange:F});z.on("end",I)}let Zf=nB({zoomActivationKeyPressed:_f,panOnDrag:S,zoomOnScroll:p,panOnScroll:r,zoomOnDoubleClick:n,zoomOnPinch:m,userSelectionActive:w,noPanClassName:C,noWheelClassName:v,lib:t,connectionInProgress:Gf});if(z.filter(Zf),n)W.on("dblclick.zoom",q);else W.on("dblclick.zoom",null)}function G(){z.on("zoom",null)}async function H(v,C,P){let w=dJ(v),r=z?.constrain()(w,C,P);if(r)await E(r);return new Promise((S)=>S(r))}async function Z(v,C){let P=dJ(v);return await E(P,C),new Promise((w)=>w(P))}function V(v){if(W){let C=dJ(v),P=W.property("__zoom");if(P.k!==v.zoom||P.x!==v.x||P.y!==v.y)z?.transform(W,C,null,{sync:!0})}}function L(){let v=W?Wl(W.node()):{x:0,y:0,k:1};return{x:v.x,y:v.y,zoom:v.k}}function M(v,C){if(W)return new Promise((P)=>{z?.interpolate(C?.interpolate==="linear"?x1:cy).scaleTo(eJ(W,C?.duration,C?.ease,()=>P(!0)),v)});return Promise.resolve(!1)}function N(v,C){if(W)return new Promise((P)=>{z?.interpolate(C?.interpolate==="linear"?x1:cy).scaleBy(eJ(W,C?.duration,C?.ease,()=>P(!0)),v)});return Promise.resolve(!1)}function D(v){z?.scaleExtent(v)}function x(v){z?.translateExtent(v)}function c(v){let C=!u1(v)||v<0?0:v;z?.clickDistance(C)}return{update:O,destroy:G,setViewport:Z,setViewportConstrained:H,getViewport:L,scaleTo:M,scaleBy:N,setScaleExtent:D,setTranslateExtent:x,syncViewport:V,setClickDistance:c}}var s_;(function(f){f.Line="line",f.Handle="handle"})(s_||(s_={}));function tB({width:f,prevWidth:u,height:_,prevHeight:y,affectsX:$,affectsY:l}){let j=f-u,J=_-y,F=[j>0?1:j<0?-1:0,J>0?1:J<0?-1:0];if(j&&$)F[0]=F[0]*-1;if(J&&l)F[1]=F[1]*-1;return F}function WK(f){let u=f.includes("right")||f.includes("left"),_=f.includes("bottom")||f.includes("top"),y=f.includes("left"),$=f.includes("top");return{isHorizontal:u,isVertical:_,affectsX:y,affectsY:$}}function k_(f,u){return Math.max(0,u-f)}function i_(f,u){return Math.max(0,f-u)}function O5(f,u,_){return Math.max(0,u-f,f-_)}function zK(f,u){return f?!u:u}function sB(f,u,_,y,$,l,j,J){let{affectsX:F,affectsY:A}=u,{isHorizontal:U,isVertical:z}=u,W=U&&z,{xSnapped:K,ySnapped:q}=_,{minWidth:E,maxWidth:O,minHeight:G,maxHeight:H}=y,{x:Z,y:V,width:L,height:M,aspectRatio:N}=f,D=Math.floor(U?K-f.pointerX:0),x=Math.floor(z?q-f.pointerY:0),c=L+(F?-D:D),v=M+(A?-x:x),C=-l[0]*L,P=-l[1]*M,w=O5(c,E,O),r=O5(v,G,H);if(j){let Y=0,R=0;if(F&&D<0)Y=k_(Z+D+C,j[0][0]);else if(!F&&D>0)Y=i_(Z+c+C,j[1][0]);if(A&&x<0)R=k_(V+x+P,j[0][1]);else if(!A&&x>0)R=i_(V+v+P,j[1][1]);w=Math.max(w,Y),r=Math.max(r,R)}if(J){let Y=0,R=0;if(F&&D>0)Y=i_(Z+D,J[0][0]);else if(!F&&D<0)Y=k_(Z+c,J[1][0]);if(A&&x>0)R=i_(V+x,J[0][1]);else if(!A&&x<0)R=k_(V+v,J[1][1]);w=Math.max(w,Y),r=Math.max(r,R)}if($){if(U){let Y=O5(c/N,G,H)*N;if(w=Math.max(w,Y),j){let R=0;if(!F&&!A||F&&!A&&W)R=i_(V+P+c/N,j[1][1])*N;else R=k_(V+P+(F?D:-D)/N,j[0][1])*N;w=Math.max(w,R)}if(J){let R=0;if(!F&&!A||F&&!A&&W)R=k_(V+c/N,J[1][1])*N;else R=i_(V+(F?D:-D)/N,J[0][1])*N;w=Math.max(w,R)}}if(z){let Y=O5(v*N,E,O)/N;if(r=Math.max(r,Y),j){let R=0;if(!F&&!A||A&&!F&&W)R=i_(Z+v*N+C,j[1][0])/N;else R=k_(Z+(A?x:-x)*N+C,j[0][0])/N;r=Math.max(r,R)}if(J){let R=0;if(!F&&!A||A&&!F&&W)R=k_(Z+v*N,J[1][0])/N;else R=i_(Z+(A?x:-x)*N,J[0][0])/N;r=Math.max(r,R)}}}if(x=x+(x<0?r:-r),D=D+(D<0?w:-w),$)if(W)if(c>v*N)x=(zK(F,A)?-D:D)/N;else D=(zK(F,A)?-x:x)*N;else if(U)x=D/N,A=F;else D=x*N,F=A;let S=F?Z+D:Z,T=A?V+x:V;return{width:L+(F?-D:D),height:M+(A?-x:x),x:l[0]*D*(!F?1:-1)+S,y:l[1]*x*(!A?1:-1)+T}}var cK={width:0,height:0,x:0,y:0},oB={...cK,pointerX:0,pointerY:0,aspectRatio:1};function aB(f){return[[0,0],[f.measured.width,f.measured.height]]}function dB(f,u,_){let y=u.position.x+f.position.x,$=u.position.y+f.position.y,l=f.measured.width??0,j=f.measured.height??0,J=_[0]*l,F=_[1]*j;return[[y-J,$-F],[y+l-J,$+j-F]]}function pK({domNode:f,nodeId:u,getStoreItems:_,onChange:y,onEnd:$}){let l=C0(f),j={controlDirection:WK("bottom-right"),boundaries:{minWidth:0,minHeight:0,maxWidth:Number.MAX_VALUE,maxHeight:Number.MAX_VALUE},resizeDirection:void 0,keepAspectRatio:!1};function J({controlPosition:A,boundaries:U,keepAspectRatio:z,resizeDirection:W,onResizeStart:K,onResize:q,onResizeEnd:E,shouldResize:O}){let G={...cK},H={...oB};j={boundaries:U,resizeDirection:W,keepAspectRatio:z,controlDirection:WK(A)};let Z=void 0,V=null,L=[],M=void 0,N=void 0,D=void 0,x=!1,c=s6().on("start",(v)=>{let{nodeLookup:C,transform:P,snapGrid:w,snapToGrid:r,nodeOrigin:S,paneDomNode:T}=_();if(Z=C.get(u),!Z)return;V=T?.getBoundingClientRect()??null;let{xSnapped:Y,ySnapped:R}=Gl(v.sourceEvent,{transform:P,snapGrid:w,snapToGrid:r,containerBounds:V});if(G={width:Z.measured.width??0,height:Z.measured.height??0,x:Z.position.x??0,y:Z.position.y??0},H={...G,pointerX:Y,pointerY:R,aspectRatio:G.width/G.height},M=void 0,Z.parentId&&(Z.extent==="parent"||Z.expandParent))M=C.get(Z.parentId),N=M&&Z.extent==="parent"?aB(M):void 0;L=[],D=void 0;for(let[m,p]of C)if(p.parentId===u){if(L.push({id:m,position:{...p.position},extent:p.extent}),p.extent==="parent"||p.expandParent){let n=dB(p,Z,p.origin??S);if(D)D=[[Math.min(n[0][0],D[0][0]),Math.min(n[0][1],D[0][1])],[Math.max(n[1][0],D[1][0]),Math.max(n[1][1],D[1][1])]];else D=n}}K?.(v,{...G})}).on("drag",(v)=>{let{transform:C,snapGrid:P,snapToGrid:w,nodeOrigin:r}=_(),S=Gl(v.sourceEvent,{transform:C,snapGrid:P,snapToGrid:w,containerBounds:V}),T=[];if(!Z)return;let{x:Y,y:R,width:m,height:p}=G,n={},_f=Z.origin??r,{width:t,height:ff,x:Gf,y:zf}=sB(H,j.controlDirection,S,j.boundaries,j.keepAspectRatio,_f,N,D),jf=t!==m,Wf=ff!==p,Vf=Gf!==Y&&jf,Zf=zf!==R&&Wf;if(!Vf&&!Zf&&!jf&&!Wf)return;if(Vf||Zf||_f[0]===1||_f[1]===1){if(n.x=Vf?Gf:G.x,n.y=Zf?zf:G.y,G.x=n.x,G.y=n.y,L.length>0){let $f=Gf-Y,lf=zf-R;for(let Af of L)Af.position={x:Af.position.x-$f+_f[0]*(t-m),y:Af.position.y-lf+_f[1]*(ff-p)},T.push(Af)}}if(jf||Wf)n.width=jf&&(!j.resizeDirection||j.resizeDirection==="horizontal")?t:G.width,n.height=Wf&&(!j.resizeDirection||j.resizeDirection==="vertical")?ff:G.height,G.width=n.width,G.height=n.height;if(M&&Z.expandParent){let $f=_f[0]*(n.width??0);if(n.x&&n.x<$f)G.x=$f,H.x=H.x-(n.x-$f);let lf=_f[1]*(n.height??0);if(n.y&&n.y{if(!x)return;E?.(v,{...G}),$?.({...G}),x=!1});l.call(c)}function F(){l.on(".drag",null)}return{update:J,destroy:F}}var fZ=rf(I0(),1),uZ=rf(oK(),1);var aK=(f)=>{let u,_=new Set,y=(U,z)=>{let W=typeof U==="function"?U(u):U;if(!Object.is(W,u)){let K=u;u=(z!=null?z:typeof W!=="object"||W===null)?W:Object.assign({},u,W),_.forEach((q)=>q(u,K))}},$=()=>u,F={setState:y,getState:$,getInitialState:()=>A,subscribe:(U)=>{return _.add(U),()=>_.delete(U)},destroy:()=>{_.clear()}},A=u=f(y,$,F);return F},dK=(f)=>f?aK(f):aK;var{useDebugValue:Zw}=fZ.default,{useSyncExternalStoreWithSelector:qw}=uZ.default,Hw=(f)=>f;function BF(f,u=Hw,_){let y=qw(f.subscribe,f.getState,f.getServerState||f.getInitialState,u,_);return Zw(y),y}var eK=(f,u)=>{let _=dK(f),y=($,l=u)=>BF(_,$,l);return Object.assign(y,_),y},_Z=(f,u)=>f?eK(f,u):eK;function A0(f,u){if(Object.is(f,u))return!0;if(typeof f!=="object"||f===null||typeof u!=="object"||u===null)return!1;if(f instanceof Map&&u instanceof Map){if(f.size!==u.size)return!1;for(let[y,$]of f)if(!Object.is($,u.get(y)))return!1;return!0}if(f instanceof Set&&u instanceof Set){if(f.size!==u.size)return!1;for(let y of f)if(!u.has(y))return!1;return!0}let _=Object.keys(f);if(_.length!==Object.keys(u).length)return!1;for(let y of _)if(!Object.prototype.hasOwnProperty.call(u,y)||!Object.is(f[y],u[y]))return!1;return!0}var Ew=rf(g7(),1),h5=d.createContext(null),Vw=h5.Provider,BZ=hu.error001();function mf(f,u){let _=d.useContext(h5);if(_===null)throw Error(BZ);return BF(_,f,u)}function W0(){let f=d.useContext(h5);if(f===null)throw Error(BZ);return d.useMemo(()=>({getState:f.getState,setState:f.setState,subscribe:f.subscribe}),[f])}var yZ={display:"none"},Ow={position:"absolute",width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0px, 0px, 0px, 0px)",clipPath:"inset(100%)"},wZ="react-flow__node-desc",DZ="react-flow__edge-desc",Xw="react-flow__aria-live",Nw=(f)=>f.ariaLiveMessage,Lw=(f)=>f.ariaLabelConfig;function Yw({rfId:f}){let u=mf(Nw);return o.jsx("div",{id:`${Xw}-${f}`,"aria-live":"assertive","aria-atomic":"true",style:Ow,children:u})}function Bw({rfId:f,disableKeyboardA11y:u}){let _=mf(Lw);return o.jsxs(o.Fragment,{children:[o.jsx("div",{id:`${wZ}-${f}`,style:yZ,children:u?_["node.a11yDescription.default"]:_["node.a11yDescription.keyboardDisabled"]}),o.jsx("div",{id:`${DZ}-${f}`,style:yZ,children:_["edge.a11yDescription.default"]}),!u&&o.jsx(Yw,{rfId:f})]})}var I5=d.forwardRef(({position:f="top-left",children:u,className:_,style:y,...$},l)=>{let j=`${f}`.split("-");return o.jsx("div",{className:Y0(["react-flow__panel",_,...j]),style:y,ref:l,...$,children:u})});I5.displayName="Panel";function ww({proOptions:f,position:u="bottom-right"}){if(f?.hideAttribution)return null;return o.jsx(I5,{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:o.jsx("a",{href:"https://reactflow.dev",target:"_blank",rel:"noopener noreferrer","aria-label":"React Flow attribution",children:"React Flow"})})}var Dw=(f)=>{let u=[],_=[];for(let[,y]of f.nodeLookup)if(y.selected)u.push(y.internals.userNode);for(let[,y]of f.edgeLookup)if(y.selected)_.push(y);return{selectedNodes:u,selectedEdges:_}},x5=(f)=>f.id;function Tw(f,u){return A0(f.selectedNodes.map(x5),u.selectedNodes.map(x5))&&A0(f.selectedEdges.map(x5),u.selectedEdges.map(x5))}function Mw({onSelectionChange:f}){let u=W0(),{selectedNodes:_,selectedEdges:y}=mf(Dw,Tw);return d.useEffect(()=>{let $={nodes:_,edges:y};f?.($),u.getState().onSelectionChangeHandlers.forEach((l)=>l($))},[_,y,f]),null}var Sw=(f)=>!!f.onSelectionChangeHandlers;function rw({onSelectionChange:f}){let u=mf(Sw);if(f||u)return o.jsx(Mw,{onSelectionChange:f});return null}var TF=typeof window<"u"?d.useLayoutEffect:d.useEffect,TZ=[0,0],Pw={x:0,y:0,zoom:1},Cw=["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"],$Z=[...Cw,"rfId"],Rw=(f)=>({setNodes:f.setNodes,setEdges:f.setEdges,setMinZoom:f.setMinZoom,setMaxZoom:f.setMaxZoom,setTranslateExtent:f.setTranslateExtent,setNodeExtent:f.setNodeExtent,reset:f.reset,setDefaultNodesAndEdges:f.setDefaultNodesAndEdges}),lZ={translateExtent:_$,nodeOrigin:TZ,minZoom:0.5,maxZoom:2,elementsSelectable:!0,noPanClassName:"nopan",rfId:"1"};function xw(f){let{setNodes:u,setEdges:_,setMinZoom:y,setMaxZoom:$,setTranslateExtent:l,setNodeExtent:j,reset:J,setDefaultNodesAndEdges:F}=mf(Rw,A0),A=W0();TF(()=>{return F(f.defaultNodes,f.defaultEdges),()=>{U.current=lZ,J()}},[]);let U=d.useRef(lZ);return TF(()=>{for(let z of $Z){let W=f[z],K=U.current[z];if(W===K)continue;if(typeof f[z]>"u")continue;if(z==="nodes")u(W);else if(z==="edges")_(W);else if(z==="minZoom")y(W);else if(z==="maxZoom")$(W);else if(z==="translateExtent")l(W);else if(z==="nodeExtent")j(W);else if(z==="ariaLabelConfig")A.setState({ariaLabelConfig:OK(W)});else if(z==="fitView")A.setState({fitViewQueued:W});else if(z==="fitViewOptions")A.setState({fitViewOptions:W});else A.setState({[z]:W})}U.current=f},$Z.map((z)=>f[z])),null}function jZ(){if(typeof window>"u"||!window.matchMedia)return null;return window.matchMedia("(prefers-color-scheme: dark)")}function vw(f){let[u,_]=d.useState(f==="system"?null:f);return d.useEffect(()=>{if(f!=="system"){_(f);return}let y=jZ(),$=()=>_(y?.matches?"dark":"light");return $(),y?.addEventListener("change",$),()=>{y?.removeEventListener("change",$)}},[f]),u!==null?u:jZ()?.matches?"dark":"light"}var JZ=typeof document<"u"?document:null;function El(f=null,u={target:JZ,actInsideInputWithModifier:!0}){let[_,y]=d.useState(!1),$=d.useRef(!1),l=d.useRef(new Set([])),[j,J]=d.useMemo(()=>{if(f!==null){let A=(Array.isArray(f)?f:[f]).filter((z)=>typeof z==="string").map((z)=>z.replace("+",` `).replace(` `,` +`).split(` -`)),U=Q.reduce((z,W)=>z.concat(...W),[]);return[Q,U]}return[[],[]]},[f]);return d.useEffect(()=>{let F=u?.target??_Z,Q=u?.actInsideInputWithModifier??!0;if(f!==null){let U=(K)=>{if(l.current=K.ctrlKey||K.metaKey||K.shiftKey||K.altKey,(!l.current||l.current&&!Q)&&zF(K))return!1;let V=lZ(K.code,J);if($.current.add(K[V]),yZ(j,$.current,!1)){let O=K.composedPath?.()?.[0]||K.target,G=O?.nodeName==="BUTTON"||O?.nodeName==="A";if(u.preventDefault!==!1&&(l.current||!G))K.preventDefault();y(!0)}},z=(K)=>{let q=lZ(K.code,J);if(yZ(j,$.current,!0))y(!1),$.current.clear();else $.current.delete(K[q]);if(K.key==="Meta")$.current.clear();l.current=!1},W=()=>{$.current.clear(),y(!1)};return F?.addEventListener("keydown",U),F?.addEventListener("keyup",z),window.addEventListener("blur",W),window.addEventListener("contextmenu",W),()=>{F?.removeEventListener("keydown",U),F?.removeEventListener("keyup",z),window.removeEventListener("blur",W),window.removeEventListener("contextmenu",W)}}},[f,y]),_}function yZ(f,u,_){return f.filter((y)=>_||y.length===u.size).some((y)=>y.every((l)=>u.has(l)))}function lZ(f,u){return u.includes(f)?"code":"key"}var Mw=()=>{let f=W0();return d.useMemo(()=>{return{zoomIn:(u)=>{let{panZoom:_}=f.getState();return _?_.scaleBy(1.2,u):Promise.resolve(!1)},zoomOut:(u)=>{let{panZoom:_}=f.getState();return _?_.scaleBy(0.8333333333333334,u):Promise.resolve(!1)},zoomTo:(u,_)=>{let{panZoom:y}=f.getState();return y?y.scaleTo(u,_):Promise.resolve(!1)},getZoom:()=>f.getState().transform[2],setViewport:async(u,_)=>{let{transform:[y,l,$],panZoom:j}=f.getState();if(!j)return Promise.resolve(!1);return await j.setViewport({x:u.x??y,y:u.y??l,zoom:u.zoom??$},_),Promise.resolve(!0)},getViewport:()=>{let[u,_,y]=f.getState().transform;return{x:u,y:_,zoom:y}},setCenter:async(u,_,y)=>{return f.getState().setCenter(u,_,y)},fitBounds:async(u,_)=>{let{width:y,height:l,minZoom:$,maxZoom:j,panZoom:J}=f.getState(),F=Z6(u,y,l,$,j,_?.padding??0.1);if(!J)return Promise.resolve(!1);return await J.setViewport(F,{duration:_?.duration,ease:_?.ease,interpolate:_?.interpolate}),Promise.resolve(!0)},screenToFlowPosition:(u,_={})=>{let{transform:y,snapGrid:l,snapToGrid:$,domNode:j}=f.getState();if(!j)return u;let{x:J,y:F}=j.getBoundingClientRect(),Q={x:u.x-J,y:u.y-F},U=_.snapGrid??l,z=_.snapToGrid??$;return $l(Q,y,z,U)},flowToScreenPosition:(u)=>{let{transform:_,domNode:y}=f.getState();if(!y)return u;let{x:l,y:$}=y.getBoundingClientRect(),j=G6(u,_);return{x:j.x+l,y:j.y+$}}}},[])};function YZ(f,u){let _=[],y=new Map,l=[];for(let $ of f)if($.type==="add"){l.push($);continue}else if($.type==="remove"||$.type==="replace")y.set($.id,[$]);else{let j=y.get($.id);if(j)j.push($);else y.set($.id,[$])}for(let $ of u){let j=y.get($.id);if(!j){_.push($);continue}if(j[0].type==="remove")continue;if(j[0].type==="replace"){_.push({...j[0].item});continue}let J={...$};for(let F of j)rw(F,J);_.push(J)}if(l.length)l.forEach(($)=>{if($.index!==void 0)_.splice($.index,0,{...$.item});else _.push({...$.item})});return _}function rw(f,u){switch(f.type){case"select":{u.selected=f.selected;break}case"position":{if(typeof f.position<"u")u.position=f.position;if(typeof f.dragging<"u")u.dragging=f.dragging;break}case"dimensions":{if(typeof f.dimensions<"u"){if(u.measured={...f.dimensions},f.setAttributes){if(f.setAttributes===!0||f.setAttributes==="width")u.width=f.dimensions.width;if(f.setAttributes===!0||f.setAttributes==="height")u.height=f.dimensions.height}}if(typeof f.resizing==="boolean")u.resizing=f.resizing;break}}}function Sw(f,u){return YZ(f,u)}function Pw(f,u){return YZ(f,u)}function ny(f,u){return{id:f,type:"select",selected:u}}function Fl(f,u=new Set,_=!1){let y=[];for(let[l,$]of f){let j=u.has(l);if(!($.selected===void 0&&!j)&&$.selected!==j){if(_)$.selected=j;y.push(ny($.id,j))}}return y}function $Z({items:f=[],lookup:u}){let _=[],y=new Map(f.map((l)=>[l.id,l]));for(let[l,$]of f.entries()){let j=u.get($.id),J=j?.internals?.userNode??j;if(J!==void 0&&J!==$)_.push({id:$.id,item:$,type:"replace"});if(J===void 0)_.push({item:$,type:"add",index:l})}for(let[l]of u)if(y.get(l)===void 0)_.push({id:l,type:"remove"});return _}function jZ(f){return{id:f.id,type:"remove"}}var JZ=(f)=>AK(f),Cw=(f)=>_F(f);function BZ(f){return d.forwardRef(f)}function FZ(f){let[u,_]=d.useState(BigInt(0)),[y]=d.useState(()=>Rw(()=>_((l)=>l+BigInt(1))));return BF(()=>{let l=y.get();if(l.length)f(l),y.reset()},[u]),y}function Rw(f){let u=[];return{get:()=>u,reset:()=>{u=[]},push:(_)=>{u.push(_),f()}}}var wZ=d.createContext(null);function xw({children:f}){let u=W0(),_=d.useCallback((J)=>{let{nodes:F=[],setNodes:Q,hasDefaultNodes:U,onNodesChange:z,nodeLookup:W,fitViewQueued:K,onNodesChangeMiddlewareMap:q}=u.getState(),V=F;for(let G of J)V=typeof G==="function"?G(V):G;let O=$Z({items:V,lookup:W});for(let G of q.values())O=G(O);if(U)Q(V);if(O.length>0)z?.(O);else if(K)window.requestAnimationFrame(()=>{let{fitViewQueued:G,nodes:H,setNodes:Z}=u.getState();if(G)Z(H)})},[]),y=FZ(_),l=d.useCallback((J)=>{let{edges:F=[],setEdges:Q,hasDefaultEdges:U,onEdgesChange:z,edgeLookup:W}=u.getState(),K=F;for(let q of J)K=typeof q==="function"?q(K):q;if(U)Q(K);else if(z)z($Z({items:K,lookup:W}))},[]),$=FZ(l),j=d.useMemo(()=>({nodeQueue:y,edgeQueue:$}),[]);return t.jsx(wZ.Provider,{value:j,children:f})}function vw(){let f=d.useContext(wZ);if(!f)throw Error("useBatchContext must be used within a BatchProvider");return f}var bw=(f)=>!!f.panZoom;function DF(){let f=Mw(),u=W0(),_=vw(),y=mf(bw),l=d.useMemo(()=>{let $=(z)=>u.getState().nodeLookup.get(z),j=(z)=>{_.nodeQueue.push(z)},J=(z)=>{_.edgeQueue.push(z)},F=(z)=>{let{nodeLookup:W,nodeOrigin:K}=u.getState(),q=JZ(z)?z:W.get(z.id),V=q.parentId?QF(q.position,q.measured,q.parentId,W,K):q.position,O={...q,position:V,width:q.measured?.width??q.width,height:q.measured?.height??q.height};return gy(O)},Q=(z,W,K={replace:!1})=>{j((q)=>q.map((V)=>{if(V.id===z){let O=typeof W==="function"?W(V):W;return K.replace&&JZ(O)?O:{...V,...O}}return V}))},U=(z,W,K={replace:!1})=>{J((q)=>q.map((V)=>{if(V.id===z){let O=typeof W==="function"?W(V):W;return K.replace&&Cw(O)?O:{...V,...O}}return V}))};return{getNodes:()=>u.getState().nodes.map((z)=>({...z})),getNode:(z)=>$(z)?.internals.userNode,getInternalNode:$,getEdges:()=>{let{edges:z=[]}=u.getState();return z.map((W)=>({...W}))},getEdge:(z)=>u.getState().edgeLookup.get(z),setNodes:j,setEdges:J,addNodes:(z)=>{let W=Array.isArray(z)?z:[z];_.nodeQueue.push((K)=>[...K,...W])},addEdges:(z)=>{let W=Array.isArray(z)?z:[z];_.edgeQueue.push((K)=>[...K,...W])},toObject:()=>{let{nodes:z=[],edges:W=[],transform:K}=u.getState(),[q,V,O]=K;return{nodes:z.map((G)=>({...G})),edges:W.map((G)=>({...G})),viewport:{x:q,y:V,zoom:O}}},deleteElements:async({nodes:z=[],edges:W=[]})=>{let{nodes:K,edges:q,onNodesDelete:V,onEdgesDelete:O,triggerNodeChanges:G,triggerEdgeChanges:H,onDelete:Z,onBeforeDelete:E}=u.getState(),{nodes:L,edges:M}=await WK({nodesToRemove:z,edgesToRemove:W,nodes:K,edges:q,onBeforeDelete:E}),N=M.length>0,w=L.length>0;if(N){let R=M.map(jZ);O?.(M),H(R)}if(w){let R=L.map(jZ);V?.(L),G(R)}if(w||N)Z?.({nodes:L,edges:M});return{deletedNodes:L,deletedEdges:M}},getIntersectingNodes:(z,W=!0,K)=>{let q=JF(z),V=q?z:F(z),O=K!==void 0;if(!V)return[];return(K||u.getState().nodes).filter((G)=>{let H=u.getState().nodeLookup.get(G.id);if(H&&!q&&(G.id===z.id||!H.internals.positionAbsolute))return!1;let Z=gy(O?G:H),E=yl(Z,V);return W&&E>0||E>=Z.width*Z.height||E>=V.width*V.height})},isNodeIntersecting:(z,W,K=!0)=>{let V=JF(z)?z:F(z);if(!V)return!1;let O=yl(V,W);return K&&O>0||O>=W.width*W.height||O>=V.width*V.height},updateNode:Q,updateNodeData:(z,W,K={replace:!1})=>{Q(z,(q)=>{let V=typeof W==="function"?W(q):W;return K.replace?{...q,data:V}:{...q,data:{...q.data,...V}}},K)},updateEdge:U,updateEdgeData:(z,W,K={replace:!1})=>{U(z,(q)=>{let V=typeof W==="function"?W(q):W;return K.replace?{...q,data:V}:{...q,data:{...q.data,...V}}},K)},getNodesBounds:(z)=>{let{nodeLookup:W,nodeOrigin:K}=u.getState();return lF(z,{nodeLookup:W,nodeOrigin:K})},getHandleConnections:({type:z,id:W,nodeId:K})=>Array.from(u.getState().connectionLookup.get(`${K}-${z}${W?`-${W}`:""}`)?.values()??[]),getNodeConnections:({type:z,handleId:W,nodeId:K})=>Array.from(u.getState().connectionLookup.get(`${K}${z?W?`-${z}-${W}`:`-${z}`:""}`)?.values()??[]),fitView:async(z)=>{let W=u.getState().fitViewResolver??KK();return u.setState({fitViewQueued:!0,fitViewOptions:z,fitViewResolver:W}),_.nodeQueue.push((K)=>[...K]),W.promise}}},[]);return d.useMemo(()=>{return{...l,...f,viewportInitialized:y}},[y])}var AZ=(f)=>f.selected,hw=typeof window<"u"?window:void 0;function Iw({deleteKeyCode:f,multiSelectionKeyCode:u}){let _=W0(),{deleteElements:y}=DF(),l=H6(f,{actInsideInputWithModifier:!1}),$=H6(u,{target:hw});d.useEffect(()=>{if(l){let{edges:j,nodes:J}=_.getState();y({nodes:J.filter(AZ),edges:j.filter(AZ)}),_.setState({nodesSelectionActive:!1})}},[l]),d.useEffect(()=>{_.setState({multiSelectionActive:$})},[$])}function cw(f){let u=W0();d.useEffect(()=>{let _=()=>{if(!f.current||!(f.current.checkVisibility?.()??!0))return!1;let y=N5(f.current);if(y.height===0||y.width===0)u.getState().onError?.("004",hu.error004());u.setState({width:y.width||500,height:y.height||500})};if(f.current){_(),window.addEventListener("resize",_);let y=new ResizeObserver(()=>_());return y.observe(f.current),()=>{if(window.removeEventListener("resize",_),y&&f.current)y.unobserve(f.current)}}},[])}var b5={position:"absolute",width:"100%",height:"100%",top:0,left:0},pw=(f)=>({userSelectionActive:f.userSelectionActive,lib:f.lib,connectionInProgress:f.connection.inProgress});function mw({onPaneContextMenu:f,zoomOnScroll:u=!0,zoomOnPinch:_=!0,panOnScroll:y=!1,panOnScrollSpeed:l=0.5,panOnScrollMode:$=A_.Free,zoomOnDoubleClick:j=!0,panOnDrag:J=!0,defaultViewport:F,translateExtent:Q,minZoom:U,maxZoom:z,zoomActivationKeyCode:W,preventScrolling:K=!0,children:q,noWheelClassName:V,noPanClassName:O,onViewportChange:G,isControlledViewport:H,paneClickDistance:Z,selectionOnDrag:E}){let L=W0(),M=d.useRef(null),{userSelectionActive:N,lib:w,connectionInProgress:R}=mf(pw,Q0),p=H6(W),x=d.useRef();cw(M);let C=d.useCallback((P)=>{if(G?.({x:P[0],y:P[1],zoom:P[2]}),!H)L.setState({transform:P})},[G,H]);return d.useEffect(()=>{if(M.current){x.current=RK({domNode:M.current,minZoom:U,maxZoom:z,translateExtent:Q,viewport:F,onDraggingChange:(S)=>L.setState((r)=>r.paneDragging===S?r:{paneDragging:S}),onPanZoomStart:(S,r)=>{let{onViewportChangeStart:Y,onMoveStart:v}=L.getState();v?.(S,r),Y?.(r)},onPanZoom:(S,r)=>{let{onViewportChange:Y,onMove:v}=L.getState();v?.(S,r),Y?.(r)},onPanZoomEnd:(S,r)=>{let{onViewportChangeEnd:Y,onMoveEnd:v}=L.getState();v?.(S,r),Y?.(r)}});let{x:P,y:D,zoom:T}=x.current.getViewport();return L.setState({panZoom:x.current,transform:[P,D,T],domNode:M.current.closest(".react-flow")}),()=>{x.current?.destroy()}}},[]),d.useEffect(()=>{x.current?.update({onPaneContextMenu:f,zoomOnScroll:u,zoomOnPinch:_,panOnScroll:y,panOnScrollSpeed:l,panOnScrollMode:$,zoomOnDoubleClick:j,panOnDrag:J,zoomActivationKeyPressed:p,preventScrolling:K,noPanClassName:O,userSelectionActive:N,noWheelClassName:V,lib:w,onTransformChange:C,connectionInProgress:R,selectionOnDrag:E,paneClickDistance:Z})},[f,u,_,y,l,$,j,J,p,K,O,N,V,w,C,R,E,Z]),t.jsx("div",{className:"react-flow__renderer",ref:M,style:b5,children:q})}var kw=(f)=>({userSelectionActive:f.userSelectionActive,userSelectionRect:f.userSelectionRect});function iw(){let{userSelectionActive:f,userSelectionRect:u}=mf(kw,Q0);if(!(f&&u))return null;return t.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 LF=(f,u)=>{return(_)=>{if(_.target!==u.current)return;f?.(_)}},gw=(f)=>({userSelectionActive:f.userSelectionActive,elementsSelectable:f.elementsSelectable,connectionInProgress:f.connection.inProgress,dragging:f.paneDragging});function nw({isSelecting:f,selectionKeyPressed:u,selectionMode:_=ky.Full,panOnDrag:y,paneClickDistance:l,selectionOnDrag:$,onSelectionStart:j,onSelectionEnd:J,onPaneClick:F,onPaneContextMenu:Q,onPaneScroll:U,onPaneMouseEnter:z,onPaneMouseMove:W,onPaneMouseLeave:K,children:q}){let V=W0(),{userSelectionActive:O,elementsSelectable:G,dragging:H,connectionInProgress:Z}=mf(gw,Q0),E=G&&(f||O),L=d.useRef(null),M=d.useRef(),N=d.useRef(new Set),w=d.useRef(new Set),R=d.useRef(!1),p=(Y)=>{if(R.current||Z){R.current=!1;return}F?.(Y),V.getState().resetSelectedElements(),V.setState({nodesSelectionActive:!1})},x=(Y)=>{if(Array.isArray(y)&&y?.includes(2)){Y.preventDefault();return}Q?.(Y)},C=U?(Y)=>U(Y):void 0,P=(Y)=>{if(R.current)Y.stopPropagation(),R.current=!1},D=(Y)=>{let{domNode:v}=V.getState();if(M.current=v?.getBoundingClientRect(),!M.current)return;let m=Y.target===L.current;if(!m&&!!Y.target.closest(".nokey")||!f||!($&&m||u)||Y.button!==0||!Y.isPrimary)return;Y.target?.setPointerCapture?.(Y.pointerId),R.current=!1;let{x:ff,y:n}=_1(Y.nativeEvent,M.current);if(V.setState({userSelectionRect:{width:0,height:0,startX:ff,startY:n,x:ff,y:n}}),!m)Y.stopPropagation(),Y.preventDefault()},T=(Y)=>{let{userSelectionRect:v,transform:m,nodeLookup:c,edgeLookup:o,connectionLookup:ff,triggerNodeChanges:n,triggerEdgeChanges:lf,defaultEdgeOptions:Gf,resetSelectedElements:zf}=V.getState();if(!M.current||!v)return;let{x:jf,y:Wf}=_1(Y.nativeEvent,M.current),{startX:Vf,startY:Kf}=v;if(!R.current){let $f=u?0:l;if(Math.hypot(jf-Vf,Wf-Kf)<=$f)return;zf(),j?.(Y)}R.current=!0;let h={startX:Vf,startY:Kf,x:jf$f.id)),w.current=new Set;let yf=Gf?.selectable??!0;for(let $f of N.current){let Qf=ff.get($f);if(!Qf)continue;for(let{edgeId:Yf}of Qf.values()){let xf=o.get(Yf);if(xf&&(xf.selectable??yf))w.current.add(Yf)}}if(!UF(g,N.current)){let $f=Fl(c,N.current,!0);n($f)}if(!UF(I,w.current)){let $f=Fl(o,w.current);lf($f)}V.setState({userSelectionRect:h,userSelectionActive:!0,nodesSelectionActive:!1})},S=(Y)=>{if(Y.button!==0)return;if(Y.target?.releasePointerCapture?.(Y.pointerId),!O&&Y.target===L.current&&V.getState().userSelectionRect)p?.(Y);if(V.setState({userSelectionActive:!1,userSelectionRect:null}),R.current)J?.(Y),V.setState({nodesSelectionActive:N.current.size>0})},r=y===!0||Array.isArray(y)&&y.includes(0);return t.jsxs("div",{className:Y0(["react-flow__pane",{draggable:r,dragging:H,selection:f}]),onClick:E?void 0:LF(p,L),onContextMenu:LF(x,L),onWheel:LF(C,L),onPointerEnter:E?void 0:z,onPointerMove:E?T:W,onPointerUp:E?S:void 0,onPointerDownCapture:E?D:void 0,onClickCapture:E?P:void 0,onPointerLeave:K,ref:L,style:b5,children:[q,t.jsx(iw,{})]})}function wF({id:f,store:u,unselect:_=!1,nodeRef:y}){let{addSelectedNodes:l,unselectNodesAndEdges:$,multiSelectionActive:j,nodeLookup:J,onError:F}=u.getState(),Q=J.get(f);if(!Q){F?.("012",hu.error012(f));return}if(u.setState({nodesSelectionActive:!1}),!Q.selected)l([f]);else if(_||Q.selected&&j)$({nodes:[Q],edges:[]}),requestAnimationFrame(()=>y?.current?.blur())}function DZ({nodeRef:f,disabled:u=!1,noDragClassName:_,handleSelector:y,nodeId:l,isSelectable:$,nodeClickDistance:j}){let J=W0(),[F,Q]=d.useState(!1),U=d.useRef();return d.useEffect(()=>{U.current=wK({getStoreItems:()=>J.getState(),onNodeMouseDown:(z)=>{wF({id:z,store:J,nodeRef:f})},onDragStart:()=>{Q(!0)},onDragStop:()=>{Q(!1)}})},[]),d.useEffect(()=>{if(u||!f.current||!U.current)return;return U.current.update({noDragClassName:_,handleSelector:y,domNode:f.current,isSelectable:$,nodeId:l,nodeClickDistance:j}),()=>{U.current?.destroy()}},[_,y,u,$,f,l,j]),F}var tw=(f)=>(u)=>u.selected&&(u.draggable||f&&typeof u.draggable>"u");function TZ(){let f=W0();return d.useCallback((_)=>{let{nodeExtent:y,snapToGrid:l,snapGrid:$,nodesDraggable:j,onError:J,updateNodePositions:F,nodeLookup:Q,nodeOrigin:U}=f.getState(),z=new Map,W=tw(j),K=l?$[0]:5,q=l?$[1]:5,V=_.direction.x*K*_.factor,O=_.direction.y*q*_.factor;for(let[,G]of Q){if(!W(G))continue;let H={x:G.internals.positionAbsolute.x+V,y:G.internals.positionAbsolute.y+O};if(l)H=ll(H,$);let{position:Z,positionAbsolute:E}=$F({nodeId:G.id,nextPosition:H,nodeLookup:Q,nodeExtent:y,nodeOrigin:U,onError:J});G.position=Z,G.internals.positionAbsolute=E,z.set(G.id,G)}F(z)},[])}var TF=d.createContext(null),sw=TF.Provider;TF.Consumer;var MZ=()=>{return d.useContext(TF)},ow=(f)=>({connectOnClick:f.connectOnClick,noPanClassName:f.noPanClassName,rfId:f.rfId}),aw=(f,u,_)=>(y)=>{let{connectionClickStartHandle:l,connectionMode:$,connection:j}=y,{fromHandle:J,toHandle:F,isValid:Q}=j,U=F?.nodeId===f&&F?.id===u&&F?.type===_;return{connectingFrom:J?.nodeId===f&&J?.id===u&&J?.type===_,connectingTo:U,clickConnecting:l?.nodeId===f&&l?.id===u&&l?.type===_,isPossibleEndHandle:$===g_.Strict?J?.type!==_:f!==J?.nodeId||u!==J?.id,connectionInProcess:!!J,clickConnectionInProcess:!!l,valid:U&&Q}};function dw({type:f="source",position:u=Uf.Top,isValidConnection:_,isConnectable:y=!0,isConnectableStart:l=!0,isConnectableEnd:$=!0,id:j,onConnect:J,children:F,className:Q,onMouseDown:U,onTouchStart:z,...W},K){let q=j||null,V=f==="target",O=W0(),G=MZ(),{connectOnClick:H,noPanClassName:Z,rfId:E}=mf(ow,Q0),{connectingFrom:L,connectingTo:M,clickConnecting:N,isPossibleEndHandle:w,connectionInProcess:R,clickConnectionInProcess:p,valid:x}=mf(aw(G,q,f),Q0);if(!G)O.getState().onError?.("010",hu.error010());let C=(T)=>{let{defaultEdgeOptions:S,onConnect:r,hasDefaultEdges:Y}=O.getState(),v={...S,...T};if(Y){let{edges:m,setEdges:c}=O.getState();c(ZF(v,m))}r?.(v),J?.(v)},P=(T)=>{if(!G)return;let S=GF(T.nativeEvent);if(l&&(S&&T.button===0||!S)){let r=O.getState();M5.onPointerDown(T.nativeEvent,{handleDomNode:T.currentTarget,autoPanOnConnect:r.autoPanOnConnect,connectionMode:r.connectionMode,connectionRadius:r.connectionRadius,domNode:r.domNode,nodeLookup:r.nodeLookup,lib:r.lib,isTarget:V,handleId:q,nodeId:G,flowId:r.rfId,panBy:r.panBy,cancelConnection:r.cancelConnection,onConnectStart:r.onConnectStart,onConnectEnd:(...Y)=>O.getState().onConnectEnd?.(...Y),updateConnection:r.updateConnection,onConnect:C,isValidConnection:_||((...Y)=>O.getState().isValidConnection?.(...Y)??!0),getTransform:()=>O.getState().transform,getFromHandle:()=>O.getState().connection.fromHandle,autoPanSpeed:r.autoPanSpeed,dragThreshold:r.connectionDragThreshold})}if(S)U?.(T);else z?.(T)},D=(T)=>{let{onClickConnectStart:S,onClickConnectEnd:r,connectionClickStartHandle:Y,connectionMode:v,isValidConnection:m,lib:c,rfId:o,nodeLookup:ff,connection:n}=O.getState();if(!G||!Y&&!l)return;if(!Y){S?.(T.nativeEvent,{nodeId:G,handleId:q,handleType:f}),O.setState({connectionClickStartHandle:{nodeId:G,type:f,id:q}});return}let lf=WF(T.target),Gf=_||m,{connection:zf,isValid:jf}=M5.isValid(T.nativeEvent,{handle:{nodeId:G,id:q,type:f},connectionMode:v,fromNodeId:Y.nodeId,fromHandleId:Y.id||null,fromType:Y.type,isValidConnection:Gf,flowId:o,doc:lf,lib:c,nodeLookup:ff});if(jf&&zf)C(zf);let Wf=structuredClone(n);delete Wf.inProgress,Wf.toPosition=Wf.toHandle?Wf.toHandle.position:null,r?.(T,Wf),O.setState({connectionClickStartHandle:null})};return t.jsx("div",{"data-handleid":q,"data-nodeid":G,"data-handlepos":u,"data-id":`${E}-${G}-${q}-${f}`,className:Y0(["react-flow__handle",`react-flow__handle-${u}`,"nodrag",Z,Q,{source:!V,target:V,connectable:y,connectablestart:l,connectableend:$,clickconnecting:N,connectingfrom:L,connectingto:M,valid:x,connectionindicator:y&&(!R||w)&&(R||p?$:l)}]),onMouseDown:P,onTouchStart:P,onClick:H?D:void 0,ref:K,...W,children:F})}var ty=d.memo(BZ(dw));function ew({data:f,isConnectable:u,sourcePosition:_=Uf.Bottom}){return t.jsxs(t.Fragment,{children:[f?.label,t.jsx(ty,{type:"source",position:_,isConnectable:u})]})}function fD({data:f,isConnectable:u,targetPosition:_=Uf.Top,sourcePosition:y=Uf.Bottom}){return t.jsxs(t.Fragment,{children:[t.jsx(ty,{type:"target",position:_,isConnectable:u}),f?.label,t.jsx(ty,{type:"source",position:y,isConnectable:u})]})}function uD(){return null}function _D({data:f,isConnectable:u,targetPosition:_=Uf.Top}){return t.jsxs(t.Fragment,{children:[t.jsx(ty,{type:"target",position:_,isConnectable:u}),f?.label]})}var R5={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}},QZ={input:ew,default:fD,output:_D,group:uD};function yD(f){if(f.internals.handleBounds===void 0)return{width:f.width??f.initialWidth??f.style?.width,height:f.height??f.initialHeight??f.style?.height};return{width:f.width??f.style?.width,height:f.height??f.style?.height}}var lD=(f)=>{let{width:u,height:_,x:y,y:l}=_l(f.nodeLookup,{filter:($)=>!!$.selected});return{width:u1(u)?u:null,height:u1(_)?_:null,userSelectionActive:f.userSelectionActive,transformString:`translate(${f.transform[0]}px,${f.transform[1]}px) scale(${f.transform[2]}) translate(${y}px,${l}px)`}};function $D({onSelectionContextMenu:f,noPanClassName:u,disableKeyboardA11y:_}){let y=W0(),{width:l,height:$,transformString:j,userSelectionActive:J}=mf(lD,Q0),F=TZ(),Q=d.useRef(null);d.useEffect(()=>{if(!_)Q.current?.focus({preventScroll:!0})},[_]);let U=!J&&l!==null&&$!==null;if(DZ({nodeRef:Q,disabled:!U}),!U)return null;let z=f?(K)=>{let q=y.getState().nodes.filter((V)=>V.selected);f(K,q)}:void 0,W=(K)=>{if(Object.prototype.hasOwnProperty.call(R5,K.key))K.preventDefault(),F({direction:R5[K.key],factor:K.shiftKey?4:1})};return t.jsx("div",{className:Y0(["react-flow__nodesselection","react-flow__container",u]),style:{transform:j},children:t.jsx("div",{ref:Q,className:"react-flow__nodesselection-rect",onContextMenu:z,tabIndex:_?void 0:-1,onKeyDown:_?void 0:W,style:{width:l,height:$}})})}var UZ=typeof window<"u"?window:void 0,jD=(f)=>{return{nodesSelectionActive:f.nodesSelectionActive,userSelectionActive:f.userSelectionActive}};function rZ({children:f,onPaneClick:u,onPaneMouseEnter:_,onPaneMouseMove:y,onPaneMouseLeave:l,onPaneContextMenu:$,onPaneScroll:j,paneClickDistance:J,deleteKeyCode:F,selectionKeyCode:Q,selectionOnDrag:U,selectionMode:z,onSelectionStart:W,onSelectionEnd:K,multiSelectionKeyCode:q,panActivationKeyCode:V,zoomActivationKeyCode:O,elementsSelectable:G,zoomOnScroll:H,zoomOnPinch:Z,panOnScroll:E,panOnScrollSpeed:L,panOnScrollMode:M,zoomOnDoubleClick:N,panOnDrag:w,defaultViewport:R,translateExtent:p,minZoom:x,maxZoom:C,preventScrolling:P,onSelectionContextMenu:D,noWheelClassName:T,noPanClassName:S,disableKeyboardA11y:r,onViewportChange:Y,isControlledViewport:v}){let{nodesSelectionActive:m,userSelectionActive:c}=mf(jD,Q0),o=H6(Q,{target:UZ}),ff=H6(V,{target:UZ}),n=ff||w,lf=ff||E,Gf=U&&n!==!0,zf=o||c||Gf;return Iw({deleteKeyCode:F,multiSelectionKeyCode:q}),t.jsx(mw,{onPaneContextMenu:$,elementsSelectable:G,zoomOnScroll:H,zoomOnPinch:Z,panOnScroll:lf,panOnScrollSpeed:L,panOnScrollMode:M,zoomOnDoubleClick:N,panOnDrag:!o&&n,defaultViewport:R,translateExtent:p,minZoom:x,maxZoom:C,zoomActivationKeyCode:O,preventScrolling:P,noWheelClassName:T,noPanClassName:S,onViewportChange:Y,isControlledViewport:v,paneClickDistance:J,selectionOnDrag:Gf,children:t.jsxs(nw,{onSelectionStart:W,onSelectionEnd:K,onPaneClick:u,onPaneMouseEnter:_,onPaneMouseMove:y,onPaneMouseLeave:l,onPaneContextMenu:$,onPaneScroll:j,panOnDrag:n,isSelecting:!!zf,selectionMode:z,selectionKeyPressed:o,paneClickDistance:J,selectionOnDrag:Gf,children:[f,m&&t.jsx($D,{onSelectionContextMenu:D,noPanClassName:S,disableKeyboardA11y:r})]})})}rZ.displayName="FlowRenderer";var JD=d.memo(rZ),FD=(f)=>(u)=>{return f?E5(u.nodeLookup,{x:0,y:0,width:u.width,height:u.height},u.transform,!0).map((_)=>_.id):Array.from(u.nodeLookup.keys())};function AD(f){return mf(d.useCallback(FD(f),[f]),Q0)}var QD=(f)=>f.updateNodeInternals;function UD(){let f=mf(QD),[u]=d.useState(()=>{if(typeof ResizeObserver>"u")return null;return new ResizeObserver((_)=>{let y=new Map;_.forEach((l)=>{let $=l.target.getAttribute("data-id");y.set($,{id:$,nodeElement:l.target,force:!0})}),f(y)})});return d.useEffect(()=>{return()=>{u?.disconnect()}},[u]),u}function WD({node:f,nodeType:u,hasDimensions:_,resizeObserver:y}){let l=W0(),$=d.useRef(null),j=d.useRef(null),J=d.useRef(f.sourcePosition),F=d.useRef(f.targetPosition),Q=d.useRef(u),U=_&&!!f.internals.handleBounds;return d.useEffect(()=>{if($.current&&!f.hidden&&(!U||j.current!==$.current)){if(j.current)y?.unobserve(j.current);y?.observe($.current),j.current=$.current}},[U,f.hidden]),d.useEffect(()=>{return()=>{if(j.current)y?.unobserve(j.current),j.current=null}},[]),d.useEffect(()=>{if($.current){let z=Q.current!==u,W=J.current!==f.sourcePosition,K=F.current!==f.targetPosition;if(z||W||K)Q.current=u,J.current=f.sourcePosition,F.current=f.targetPosition,l.getState().updateNodeInternals(new Map([[f.id,{id:f.id,nodeElement:$.current,force:!0}]]))}},[f.id,u,f.sourcePosition,f.targetPosition]),$}function zD({id:f,onClick:u,onMouseEnter:_,onMouseMove:y,onMouseLeave:l,onContextMenu:$,onDoubleClick:j,nodesDraggable:J,elementsSelectable:F,nodesConnectable:Q,nodesFocusable:U,resizeObserver:z,noDragClassName:W,noPanClassName:K,disableKeyboardA11y:q,rfId:V,nodeTypes:O,nodeClickDistance:G,onError:H}){let{node:Z,internals:E,isParent:L}=mf((jf)=>{let Wf=jf.nodeLookup.get(f),Vf=jf.parentLookup.has(f);return{node:Wf,internals:Wf.internals,isParent:Vf}},Q0),M=Z.type||"default",N=O?.[M]||QZ[M];if(N===void 0)H?.("003",hu.error003(M)),M="default",N=O?.default||QZ.default;let w=!!(Z.draggable||J&&typeof Z.draggable>"u"),R=!!(Z.selectable||F&&typeof Z.selectable>"u"),p=!!(Z.connectable||Q&&typeof Z.connectable>"u"),x=!!(Z.focusable||U&&typeof Z.focusable>"u"),C=W0(),P=AF(Z),D=WD({node:Z,nodeType:M,hasDimensions:P,resizeObserver:z}),T=DZ({nodeRef:D,disabled:Z.hidden||!w,noDragClassName:W,handleSelector:Z.dragHandle,nodeId:f,isSelectable:R,nodeClickDistance:G}),S=TZ();if(Z.hidden)return null;let r=b1(Z),Y=yD(Z),v=R||w||u||_||y||l,m=_?(jf)=>_(jf,{...E.userNode}):void 0,c=y?(jf)=>y(jf,{...E.userNode}):void 0,o=l?(jf)=>l(jf,{...E.userNode}):void 0,ff=$?(jf)=>$(jf,{...E.userNode}):void 0,n=j?(jf)=>j(jf,{...E.userNode}):void 0,lf=(jf)=>{let{selectNodesOnDrag:Wf,nodeDragThreshold:Vf}=C.getState();if(R&&(!Wf||!w||Vf>0))wF({id:f,store:C,nodeRef:D});if(u)u(jf,{...E.userNode})},Gf=(jf)=>{if(zF(jf.nativeEvent)||q)return;if(dJ.includes(jf.key)&&R){let Wf=jf.key==="Escape";wF({id:f,store:C,unselect:Wf,nodeRef:D})}else if(w&&Z.selected&&Object.prototype.hasOwnProperty.call(R5,jf.key)){jf.preventDefault();let{ariaLabelConfig:Wf}=C.getState();C.setState({ariaLiveMessage:Wf["node.a11yDescription.ariaLiveMessage"]({direction:jf.key.replace("Arrow","").toLowerCase(),x:~~E.positionAbsolute.x,y:~~E.positionAbsolute.y})}),S({direction:R5[jf.key],factor:jf.shiftKey?4:1})}},zf=()=>{if(q||!D.current?.matches(":focus-visible"))return;let{transform:jf,width:Wf,height:Vf,autoPanOnNodeFocus:Kf,setCenter:h}=C.getState();if(!Kf)return;if(!(E5(new Map([[f,Z]]),{x:0,y:0,width:Wf,height:Vf},jf,!0).length>0))h(Z.position.x+r.width/2,Z.position.y+r.height/2,{zoom:jf[2]})};return t.jsx("div",{className:Y0(["react-flow__node",`react-flow__node-${M}`,{[K]:w},Z.className,{selected:Z.selected,selectable:R,parent:L,draggable:w,dragging:T}]),ref:D,style:{zIndex:E.z,transform:`translate(${E.positionAbsolute.x}px,${E.positionAbsolute.y}px)`,pointerEvents:v?"all":"none",visibility:P?"visible":"hidden",...Z.style,...Y},"data-id":f,"data-testid":`rf__node-${f}`,onMouseEnter:m,onMouseMove:c,onMouseLeave:o,onContextMenu:ff,onClick:lf,onDoubleClick:n,onKeyDown:x?Gf:void 0,tabIndex:x?0:void 0,onFocus:x?zf:void 0,role:Z.ariaRole??(x?"group":void 0),"aria-roledescription":"node","aria-describedby":q?void 0:`${XZ}-${V}`,"aria-label":Z.ariaLabel,...Z.domAttributes,children:t.jsx(sw,{value:f,children:t.jsx(N,{id:f,data:Z.data,type:M,positionAbsoluteX:E.positionAbsolute.x,positionAbsoluteY:E.positionAbsolute.y,selected:Z.selected??!1,selectable:R,draggable:w,deletable:Z.deletable??!0,isConnectable:p,sourcePosition:Z.sourcePosition,targetPosition:Z.targetPosition,dragging:T,dragHandle:Z.dragHandle,zIndex:E.z,parentId:Z.parentId,...r})})})}var GD=d.memo(zD),KD=(f)=>({nodesDraggable:f.nodesDraggable,nodesConnectable:f.nodesConnectable,nodesFocusable:f.nodesFocusable,elementsSelectable:f.elementsSelectable,onError:f.onError});function SZ(f){let{nodesDraggable:u,nodesConnectable:_,nodesFocusable:y,elementsSelectable:l,onError:$}=mf(KD,Q0),j=AD(f.onlyRenderVisibleElements),J=UD();return t.jsx("div",{className:"react-flow__nodes",style:b5,children:j.map((F)=>{return t.jsx(GD,{id:F,nodeTypes:f.nodeTypes,nodeExtent:f.nodeExtent,onClick:f.onNodeClick,onMouseEnter:f.onNodeMouseEnter,onMouseMove:f.onNodeMouseMove,onMouseLeave:f.onNodeMouseLeave,onContextMenu:f.onNodeContextMenu,onDoubleClick:f.onNodeDoubleClick,noDragClassName:f.noDragClassName,noPanClassName:f.noPanClassName,rfId:f.rfId,disableKeyboardA11y:f.disableKeyboardA11y,resizeObserver:J,nodesDraggable:u,nodesConnectable:_,nodesFocusable:y,elementsSelectable:l,nodeClickDistance:f.nodeClickDistance,onError:$},F)})})}SZ.displayName="NodeRenderer";var ZD=d.memo(SZ);function qD(f){return mf(d.useCallback((_)=>{if(!f)return _.edges.map((l)=>l.id);let y=[];if(_.width&&_.height)for(let l of _.edges){let $=_.nodeLookup.get(l.source),j=_.nodeLookup.get(l.target);if($&&j&&HK({sourceNode:$,targetNode:j,width:_.width,height:_.height,transform:_.transform}))y.push(l.id)}return y},[f]),Q0)}var HD=({color:f="none",strokeWidth:u=1})=>{let _={strokeWidth:u,...f&&{stroke:f}};return t.jsx("polyline",{className:"arrow",style:_,strokeLinecap:"round",fill:"none",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4"})},VD=({color:f="none",strokeWidth:u=1})=>{let _={strokeWidth:u,...f&&{stroke:f,fill:f}};return t.jsx("polyline",{className:"arrowclosed",style:_,strokeLinecap:"round",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4 -5,-4"})},WZ={[n_.Arrow]:HD,[n_.ArrowClosed]:VD};function ED(f){let u=W0();return d.useMemo(()=>{if(!Object.prototype.hasOwnProperty.call(WZ,f))return u.getState().onError?.("009",hu.error009(f)),null;return WZ[f]},[f])}var OD=({id:f,type:u,color:_,width:y=12.5,height:l=12.5,markerUnits:$="strokeWidth",strokeWidth:j,orient:J="auto-start-reverse"})=>{let F=ED(u);if(!F)return null;return t.jsx("marker",{className:"react-flow__arrowhead",id:f,markerWidth:`${y}`,markerHeight:`${l}`,viewBox:"-10 -10 20 20",markerUnits:$,orient:J,refX:"0",refY:"0",children:t.jsx(F,{color:_,strokeWidth:j})})},PZ=({defaultColor:f,rfId:u})=>{let _=mf(($)=>$.edges),y=mf(($)=>$.defaultEdgeOptions),l=d.useMemo(()=>{return EK(_,{id:u,defaultColor:f,defaultMarkerStart:y?.markerStart,defaultMarkerEnd:y?.markerEnd})},[_,y,u,f]);if(!l.length)return null;return t.jsx("svg",{className:"react-flow__marker","aria-hidden":"true",children:t.jsx("defs",{children:l.map(($)=>t.jsx(OD,{id:$.id,type:$.type,color:$.color,width:$.width,height:$.height,markerUnits:$.markerUnits,strokeWidth:$.strokeWidth,orient:$.orient},$.id))})})};PZ.displayName="MarkerDefinitions";var XD=d.memo(PZ);function CZ({x:f,y:u,label:_,labelStyle:y,labelShowBg:l=!0,labelBgStyle:$,labelBgPadding:j=[2,4],labelBgBorderRadius:J=2,children:F,className:Q,...U}){let[z,W]=d.useState({x:1,y:0,width:0,height:0}),K=Y0(["react-flow__edge-textwrapper",Q]),q=d.useRef(null);if(d.useEffect(()=>{if(q.current){let V=q.current.getBBox();W({x:V.x,y:V.y,width:V.width,height:V.height})}},[_]),!_)return null;return t.jsxs("g",{transform:`translate(${f-z.width/2} ${u-z.height/2})`,className:K,visibility:z.width?"visible":"hidden",...U,children:[l&&t.jsx("rect",{width:z.width+2*j[0],x:-j[0],y:-j[1],height:z.height+2*j[1],className:"react-flow__edge-textbg",style:$,rx:J,ry:J}),t.jsx("text",{className:"react-flow__edge-text",y:z.height/2,dy:"0.3em",ref:q,style:y,children:_}),F]})}CZ.displayName="EdgeText";var ND=d.memo(CZ);function Al({path:f,labelX:u,labelY:_,label:y,labelStyle:l,labelShowBg:$,labelBgStyle:j,labelBgPadding:J,labelBgBorderRadius:F,interactionWidth:Q=20,...U}){return t.jsxs(t.Fragment,{children:[t.jsx("path",{...U,d:f,fill:"none",className:Y0(["react-flow__edge-path",U.className])}),Q?t.jsx("path",{d:f,fill:"none",strokeOpacity:0,strokeWidth:Q,className:"react-flow__edge-interaction"}):null,y&&u1(u)&&u1(_)?t.jsx(ND,{x:u,y:_,label:y,labelStyle:l,labelShowBg:$,labelBgStyle:j,labelBgPadding:J,labelBgBorderRadius:F}):null]})}function zZ({pos:f,x1:u,y1:_,x2:y,y2:l}){if(f===Uf.Left||f===Uf.Right)return[0.5*(u+y),_];return[u,0.5*(_+l)]}function RZ({sourceX:f,sourceY:u,sourcePosition:_=Uf.Bottom,targetX:y,targetY:l,targetPosition:$=Uf.Top}){let[j,J]=zZ({pos:_,x1:f,y1:u,x2:y,y2:l}),[F,Q]=zZ({pos:$,x1:y,y1:l,x2:f,y2:u}),[U,z,W,K]=L5({sourceX:f,sourceY:u,targetX:y,targetY:l,sourceControlX:j,sourceControlY:J,targetControlX:F,targetControlY:Q});return[`M${f},${u} C${j},${J} ${F},${Q} ${y},${l}`,U,z,W,K]}function xZ(f){return d.memo(({id:u,sourceX:_,sourceY:y,targetX:l,targetY:$,sourcePosition:j,targetPosition:J,label:F,labelStyle:Q,labelShowBg:U,labelBgStyle:z,labelBgPadding:W,labelBgBorderRadius:K,style:q,markerEnd:V,markerStart:O,interactionWidth:G})=>{let[H,Z,E]=RZ({sourceX:_,sourceY:y,sourcePosition:j,targetX:l,targetY:$,targetPosition:J}),L=f.isInternal?void 0:u;return t.jsx(Al,{id:L,path:H,labelX:Z,labelY:E,label:F,labelStyle:Q,labelShowBg:U,labelBgStyle:z,labelBgPadding:W,labelBgBorderRadius:K,style:q,markerEnd:V,markerStart:O,interactionWidth:G})})}var LD=xZ({isInternal:!1}),vZ=xZ({isInternal:!0});LD.displayName="SimpleBezierEdge";vZ.displayName="SimpleBezierEdgeInternal";function bZ(f){return d.memo(({id:u,sourceX:_,sourceY:y,targetX:l,targetY:$,label:j,labelStyle:J,labelShowBg:F,labelBgStyle:Q,labelBgPadding:U,labelBgBorderRadius:z,style:W,sourcePosition:K=Uf.Bottom,targetPosition:q=Uf.Top,markerEnd:V,markerStart:O,pathOptions:G,interactionWidth:H})=>{let[Z,E,L]=q6({sourceX:_,sourceY:y,sourcePosition:K,targetX:l,targetY:$,targetPosition:q,borderRadius:G?.borderRadius,offset:G?.offset,stepPosition:G?.stepPosition}),M=f.isInternal?void 0:u;return t.jsx(Al,{id:M,path:Z,labelX:E,labelY:L,label:j,labelStyle:J,labelShowBg:F,labelBgStyle:Q,labelBgPadding:U,labelBgBorderRadius:z,style:W,markerEnd:V,markerStart:O,interactionWidth:H})})}var hZ=bZ({isInternal:!1}),IZ=bZ({isInternal:!0});hZ.displayName="SmoothStepEdge";IZ.displayName="SmoothStepEdgeInternal";function cZ(f){return d.memo(({id:u,..._})=>{let y=f.isInternal?void 0:u;return t.jsx(hZ,{..._,id:y,pathOptions:d.useMemo(()=>({borderRadius:0,offset:_.pathOptions?.offset}),[_.pathOptions?.offset])})})}var YD=cZ({isInternal:!1}),pZ=cZ({isInternal:!0});YD.displayName="StepEdge";pZ.displayName="StepEdgeInternal";function mZ(f){return d.memo(({id:u,sourceX:_,sourceY:y,targetX:l,targetY:$,label:j,labelStyle:J,labelShowBg:F,labelBgStyle:Q,labelBgPadding:U,labelBgBorderRadius:z,style:W,markerEnd:K,markerStart:q,interactionWidth:V})=>{let[O,G,H]=B5({sourceX:_,sourceY:y,targetX:l,targetY:$}),Z=f.isInternal?void 0:u;return t.jsx(Al,{id:Z,path:O,labelX:G,labelY:H,label:j,labelStyle:J,labelShowBg:F,labelBgStyle:Q,labelBgPadding:U,labelBgBorderRadius:z,style:W,markerEnd:K,markerStart:q,interactionWidth:V})})}var BD=mZ({isInternal:!1}),kZ=mZ({isInternal:!0});BD.displayName="StraightEdge";kZ.displayName="StraightEdgeInternal";function iZ(f){return d.memo(({id:u,sourceX:_,sourceY:y,targetX:l,targetY:$,sourcePosition:j=Uf.Bottom,targetPosition:J=Uf.Top,label:F,labelStyle:Q,labelShowBg:U,labelBgStyle:z,labelBgPadding:W,labelBgBorderRadius:K,style:q,markerEnd:V,markerStart:O,pathOptions:G,interactionWidth:H})=>{let[Z,E,L]=Y5({sourceX:_,sourceY:y,sourcePosition:j,targetX:l,targetY:$,targetPosition:J,curvature:G?.curvature}),M=f.isInternal?void 0:u;return t.jsx(Al,{id:M,path:Z,labelX:E,labelY:L,label:F,labelStyle:Q,labelShowBg:U,labelBgStyle:z,labelBgPadding:W,labelBgBorderRadius:K,style:q,markerEnd:V,markerStart:O,interactionWidth:H})})}var wD=iZ({isInternal:!1}),gZ=iZ({isInternal:!0});wD.displayName="BezierEdge";gZ.displayName="BezierEdgeInternal";var GZ={default:gZ,straight:kZ,step:pZ,smoothstep:IZ,simplebezier:vZ},KZ={sourceX:null,sourceY:null,targetX:null,targetY:null,sourcePosition:null,targetPosition:null},DD=(f,u,_)=>{if(_===Uf.Left)return f-u;if(_===Uf.Right)return f+u;return f},TD=(f,u,_)=>{if(_===Uf.Top)return f-u;if(_===Uf.Bottom)return f+u;return f},ZZ="react-flow__edgeupdater";function qZ({position:f,centerX:u,centerY:_,radius:y=10,onMouseDown:l,onMouseEnter:$,onMouseOut:j,type:J}){return t.jsx("circle",{onMouseDown:l,onMouseEnter:$,onMouseOut:j,className:Y0([ZZ,`${ZZ}-${J}`]),cx:DD(u,y,f),cy:TD(_,y,f),r:y,stroke:"transparent",fill:"transparent"})}function MD({isReconnectable:f,reconnectRadius:u,edge:_,sourceX:y,sourceY:l,targetX:$,targetY:j,sourcePosition:J,targetPosition:F,onReconnect:Q,onReconnectStart:U,onReconnectEnd:z,setReconnecting:W,setUpdateHover:K}){let q=W0(),V=(E,L)=>{if(E.button!==0)return;let{autoPanOnConnect:M,domNode:N,connectionMode:w,connectionRadius:R,lib:p,onConnectStart:x,cancelConnection:C,nodeLookup:P,rfId:D,panBy:T,updateConnection:S}=q.getState(),r=L.type==="target",Y=(c,o)=>{W(!1),z?.(c,_,L.type,o)},v=(c)=>Q?.(_,c),m=(c,o)=>{W(!0),U?.(E,_,L.type),x?.(c,o)};M5.onPointerDown(E.nativeEvent,{autoPanOnConnect:M,connectionMode:w,connectionRadius:R,domNode:N,handleId:L.id,nodeId:L.nodeId,nodeLookup:P,isTarget:r,edgeUpdaterType:L.type,lib:p,flowId:D,cancelConnection:C,panBy:T,isValidConnection:(...c)=>q.getState().isValidConnection?.(...c)??!0,onConnect:v,onConnectStart:m,onConnectEnd:(...c)=>q.getState().onConnectEnd?.(...c),onReconnectEnd:Y,updateConnection:S,getTransform:()=>q.getState().transform,getFromHandle:()=>q.getState().connection.fromHandle,dragThreshold:q.getState().connectionDragThreshold,handleDomNode:E.currentTarget})},O=(E)=>V(E,{nodeId:_.target,id:_.targetHandle??null,type:"target"}),G=(E)=>V(E,{nodeId:_.source,id:_.sourceHandle??null,type:"source"}),H=()=>K(!0),Z=()=>K(!1);return t.jsxs(t.Fragment,{children:[(f===!0||f==="source")&&t.jsx(qZ,{position:J,centerX:y,centerY:l,radius:u,onMouseDown:O,onMouseEnter:H,onMouseOut:Z,type:"source"}),(f===!0||f==="target")&&t.jsx(qZ,{position:F,centerX:$,centerY:j,radius:u,onMouseDown:G,onMouseEnter:H,onMouseOut:Z,type:"target"})]})}function rD({id:f,edgesFocusable:u,edgesReconnectable:_,elementsSelectable:y,onClick:l,onDoubleClick:$,onContextMenu:j,onMouseEnter:J,onMouseMove:F,onMouseLeave:Q,reconnectRadius:U,onReconnect:z,onReconnectStart:W,onReconnectEnd:K,rfId:q,edgeTypes:V,noPanClassName:O,onError:G,disableKeyboardA11y:H}){let Z=mf((h)=>h.edgeLookup.get(f)),E=mf((h)=>h.defaultEdgeOptions);Z=E?{...E,...Z}:Z;let L=Z.type||"default",M=V?.[L]||GZ[L];if(M===void 0)G?.("011",hu.error011(L)),L="default",M=V?.default||GZ.default;let N=!!(Z.focusable||u&&typeof Z.focusable>"u"),w=typeof z<"u"&&(Z.reconnectable||_&&typeof Z.reconnectable>"u"),R=!!(Z.selectable||y&&typeof Z.selectable>"u"),p=d.useRef(null),[x,C]=d.useState(!1),[P,D]=d.useState(!1),T=W0(),{zIndex:S,sourceX:r,sourceY:Y,targetX:v,targetY:m,sourcePosition:c,targetPosition:o}=mf(d.useCallback((h)=>{let g=h.nodeLookup.get(Z.source),I=h.nodeLookup.get(Z.target);if(!g||!I)return{zIndex:Z.zIndex,...KZ};let yf=VK({id:f,sourceNode:g,targetNode:I,sourceHandle:Z.sourceHandle||null,targetHandle:Z.targetHandle||null,connectionMode:h.connectionMode,onError:G});return{zIndex:qK({selected:Z.selected,zIndex:Z.zIndex,sourceNode:g,targetNode:I,elevateOnSelect:h.elevateEdgesOnSelect,zIndexMode:h.zIndexMode}),...yf||KZ}},[Z.source,Z.target,Z.sourceHandle,Z.targetHandle,Z.selected,Z.zIndex]),Q0),ff=d.useMemo(()=>Z.markerStart?`url('#${w5(Z.markerStart,q)}')`:void 0,[Z.markerStart,q]),n=d.useMemo(()=>Z.markerEnd?`url('#${w5(Z.markerEnd,q)}')`:void 0,[Z.markerEnd,q]);if(Z.hidden||r===null||Y===null||v===null||m===null)return null;let lf=(h)=>{let{addSelectedEdges:g,unselectNodesAndEdges:I,multiSelectionActive:yf}=T.getState();if(R)if(T.setState({nodesSelectionActive:!1}),Z.selected&&yf)I({nodes:[],edges:[Z]}),p.current?.blur();else g([f]);if(l)l(h,Z)},Gf=$?(h)=>{$(h,{...Z})}:void 0,zf=j?(h)=>{j(h,{...Z})}:void 0,jf=J?(h)=>{J(h,{...Z})}:void 0,Wf=F?(h)=>{F(h,{...Z})}:void 0,Vf=Q?(h)=>{Q(h,{...Z})}:void 0,Kf=(h)=>{if(!H&&dJ.includes(h.key)&&R){let{unselectNodesAndEdges:g,addSelectedEdges:I}=T.getState();if(h.key==="Escape")p.current?.blur(),g({edges:[Z]});else I([f])}};return t.jsx("svg",{style:{zIndex:S},children:t.jsxs("g",{className:Y0(["react-flow__edge",`react-flow__edge-${L}`,Z.className,O,{selected:Z.selected,animated:Z.animated,inactive:!R&&!l,updating:x,selectable:R}]),onClick:lf,onDoubleClick:Gf,onContextMenu:zf,onMouseEnter:jf,onMouseMove:Wf,onMouseLeave:Vf,onKeyDown:N?Kf:void 0,tabIndex:N?0:void 0,role:Z.ariaRole??(N?"group":"img"),"aria-roledescription":"edge","data-id":f,"data-testid":`rf__edge-${f}`,"aria-label":Z.ariaLabel===null?void 0:Z.ariaLabel||`Edge from ${Z.source} to ${Z.target}`,"aria-describedby":N?`${NZ}-${q}`:void 0,ref:p,...Z.domAttributes,children:[!P&&t.jsx(M,{id:f,source:Z.source,target:Z.target,type:Z.type,selected:Z.selected,animated:Z.animated,selectable:R,deletable:Z.deletable??!0,label:Z.label,labelStyle:Z.labelStyle,labelShowBg:Z.labelShowBg,labelBgStyle:Z.labelBgStyle,labelBgPadding:Z.labelBgPadding,labelBgBorderRadius:Z.labelBgBorderRadius,sourceX:r,sourceY:Y,targetX:v,targetY:m,sourcePosition:c,targetPosition:o,data:Z.data,style:Z.style,sourceHandleId:Z.sourceHandle,targetHandleId:Z.targetHandle,markerStart:ff,markerEnd:n,pathOptions:"pathOptions"in Z?Z.pathOptions:void 0,interactionWidth:Z.interactionWidth}),w&&t.jsx(MD,{edge:Z,isReconnectable:w,reconnectRadius:U,onReconnect:z,onReconnectStart:W,onReconnectEnd:K,sourceX:r,sourceY:Y,targetX:v,targetY:m,sourcePosition:c,targetPosition:o,setUpdateHover:C,setReconnecting:D})]})})}var SD=d.memo(rD),PD=(f)=>({edgesFocusable:f.edgesFocusable,edgesReconnectable:f.edgesReconnectable,elementsSelectable:f.elementsSelectable,connectionMode:f.connectionMode,onError:f.onError});function nZ({defaultMarkerColor:f,onlyRenderVisibleElements:u,rfId:_,edgeTypes:y,noPanClassName:l,onReconnect:$,onEdgeContextMenu:j,onEdgeMouseEnter:J,onEdgeMouseMove:F,onEdgeMouseLeave:Q,onEdgeClick:U,reconnectRadius:z,onEdgeDoubleClick:W,onReconnectStart:K,onReconnectEnd:q,disableKeyboardA11y:V}){let{edgesFocusable:O,edgesReconnectable:G,elementsSelectable:H,onError:Z}=mf(PD,Q0),E=qD(u);return t.jsxs("div",{className:"react-flow__edges",children:[t.jsx(XD,{defaultColor:f,rfId:_}),E.map((L)=>{return t.jsx(SD,{id:L,edgesFocusable:O,edgesReconnectable:G,elementsSelectable:H,noPanClassName:l,onReconnect:$,onContextMenu:j,onMouseEnter:J,onMouseMove:F,onMouseLeave:Q,onClick:U,reconnectRadius:z,onDoubleClick:W,onReconnectStart:K,onReconnectEnd:q,rfId:_,onError:Z,edgeTypes:y,disableKeyboardA11y:V},L)})]})}nZ.displayName="EdgeRenderer";var CD=d.memo(nZ),RD=(f)=>`translate(${f.transform[0]}px,${f.transform[1]}px) scale(${f.transform[2]})`;function xD({children:f}){let u=mf(RD);return t.jsx("div",{className:"react-flow__viewport xyflow__viewport react-flow__container",style:{transform:u},children:f})}function vD(f){let u=DF(),_=d.useRef(!1);d.useEffect(()=>{if(!_.current&&u.viewportInitialized&&f)setTimeout(()=>f(u),1),_.current=!0},[f,u.viewportInitialized])}var bD=(f)=>f.panZoom?.syncViewport;function hD(f){let u=mf(bD),_=W0();return d.useEffect(()=>{if(f)u?.(f),_.setState({transform:[f.x,f.y,f.zoom]})},[f,u]),null}function HZ(f){return f.connection.inProgress?{...f.connection,to:$l(f.connection.to,f.transform)}:{...f.connection}}function ID(f){if(f)return(_)=>{let y=HZ(_);return f(y)};return HZ}function cD(f){let u=ID(f);return mf(u,Q0)}var pD=(f)=>({nodesConnectable:f.nodesConnectable,isValid:f.connection.isValid,inProgress:f.connection.inProgress,width:f.width,height:f.height});function mD({containerStyle:f,style:u,type:_,component:y}){let{nodesConnectable:l,width:$,height:j,isValid:J,inProgress:F}=mf(pD,Q0);if(!($&&l&&F))return null;return t.jsx("svg",{style:f,width:$,height:j,className:"react-flow__connectionline react-flow__container",children:t.jsx("g",{className:Y0(["react-flow__connection",uF(J)]),children:t.jsx(tZ,{style:u,type:_,CustomComponent:y,isValid:J})})})}var tZ=({style:f,type:u=v1.Bezier,CustomComponent:_,isValid:y})=>{let{inProgress:l,from:$,fromNode:j,fromHandle:J,fromPosition:F,to:Q,toNode:U,toHandle:z,toPosition:W,pointer:K}=cD();if(!l)return;if(_)return t.jsx(_,{connectionLineType:u,connectionLineStyle:f,fromNode:j,fromHandle:J,fromX:$.x,fromY:$.y,toX:Q.x,toY:Q.y,fromPosition:F,toPosition:W,connectionStatus:uF(y),toNode:U,toHandle:z,pointer:K});let q="",V={sourceX:$.x,sourceY:$.y,sourcePosition:F,targetX:Q.x,targetY:Q.y,targetPosition:W};switch(u){case v1.Bezier:[q]=Y5(V);break;case v1.SimpleBezier:[q]=RZ(V);break;case v1.Step:[q]=q6({...V,borderRadius:0});break;case v1.SmoothStep:[q]=q6(V);break;default:[q]=B5(V)}return t.jsx("path",{d:q,fill:"none",className:"react-flow__connection-path",style:f})};tZ.displayName="ConnectionLine";var kD={};function VZ(f=kD){let u=d.useRef(f),_=W0();d.useEffect(()=>{},[f])}function iD(){let f=W0(),u=d.useRef(!1);d.useEffect(()=>{},[])}function sZ({nodeTypes:f,edgeTypes:u,onInit:_,onNodeClick:y,onEdgeClick:l,onNodeDoubleClick:$,onEdgeDoubleClick:j,onNodeMouseEnter:J,onNodeMouseMove:F,onNodeMouseLeave:Q,onNodeContextMenu:U,onSelectionContextMenu:z,onSelectionStart:W,onSelectionEnd:K,connectionLineType:q,connectionLineStyle:V,connectionLineComponent:O,connectionLineContainerStyle:G,selectionKeyCode:H,selectionOnDrag:Z,selectionMode:E,multiSelectionKeyCode:L,panActivationKeyCode:M,zoomActivationKeyCode:N,deleteKeyCode:w,onlyRenderVisibleElements:R,elementsSelectable:p,defaultViewport:x,translateExtent:C,minZoom:P,maxZoom:D,preventScrolling:T,defaultMarkerColor:S,zoomOnScroll:r,zoomOnPinch:Y,panOnScroll:v,panOnScrollSpeed:m,panOnScrollMode:c,zoomOnDoubleClick:o,panOnDrag:ff,onPaneClick:n,onPaneMouseEnter:lf,onPaneMouseMove:Gf,onPaneMouseLeave:zf,onPaneScroll:jf,onPaneContextMenu:Wf,paneClickDistance:Vf,nodeClickDistance:Kf,onEdgeContextMenu:h,onEdgeMouseEnter:g,onEdgeMouseMove:I,onEdgeMouseLeave:yf,reconnectRadius:$f,onReconnect:Qf,onReconnectStart:Yf,onReconnectEnd:xf,noDragClassName:tf,noWheelClassName:j0,noPanClassName:u0,disableKeyboardA11y:D0,nodeExtent:Fu,rfId:O0,viewport:x0,onViewportChange:ku}){return VZ(f),VZ(u),iD(),vD(_),hD(x0),t.jsx(JD,{onPaneClick:n,onPaneMouseEnter:lf,onPaneMouseMove:Gf,onPaneMouseLeave:zf,onPaneContextMenu:Wf,onPaneScroll:jf,paneClickDistance:Vf,deleteKeyCode:w,selectionKeyCode:H,selectionOnDrag:Z,selectionMode:E,onSelectionStart:W,onSelectionEnd:K,multiSelectionKeyCode:L,panActivationKeyCode:M,zoomActivationKeyCode:N,elementsSelectable:p,zoomOnScroll:r,zoomOnPinch:Y,zoomOnDoubleClick:o,panOnScroll:v,panOnScrollSpeed:m,panOnScrollMode:c,panOnDrag:ff,defaultViewport:x,translateExtent:C,minZoom:P,maxZoom:D,onSelectionContextMenu:z,preventScrolling:T,noDragClassName:tf,noWheelClassName:j0,noPanClassName:u0,disableKeyboardA11y:D0,onViewportChange:ku,isControlledViewport:!!x0,children:t.jsxs(xD,{children:[t.jsx(CD,{edgeTypes:u,onEdgeClick:l,onEdgeDoubleClick:j,onReconnect:Qf,onReconnectStart:Yf,onReconnectEnd:xf,onlyRenderVisibleElements:R,onEdgeContextMenu:h,onEdgeMouseEnter:g,onEdgeMouseMove:I,onEdgeMouseLeave:yf,reconnectRadius:$f,defaultMarkerColor:S,noPanClassName:u0,disableKeyboardA11y:D0,rfId:O0}),t.jsx(mD,{style:V,type:q,component:O,containerStyle:G}),t.jsx("div",{className:"react-flow__edgelabel-renderer"}),t.jsx(ZD,{nodeTypes:f,onNodeClick:y,onNodeDoubleClick:$,onNodeMouseEnter:J,onNodeMouseMove:F,onNodeMouseLeave:Q,onNodeContextMenu:U,nodeClickDistance:Kf,onlyRenderVisibleElements:R,noPanClassName:u0,noDragClassName:tf,disableKeyboardA11y:D0,nodeExtent:Fu,rfId:O0}),t.jsx("div",{className:"react-flow__viewport-portal"})]})})}sZ.displayName="GraphView";var gD=d.memo(sZ),EZ=({nodes:f,edges:u,defaultNodes:_,defaultEdges:y,width:l,height:$,fitView:j,fitViewOptions:J,minZoom:F=0.5,maxZoom:Q=2,nodeOrigin:U,nodeExtent:z,zIndexMode:W="basic"}={})=>{let K=new Map,q=new Map,V=new Map,O=new Map,G=y??u??[],H=_??f??[],Z=U??[0,0],E=z??ul;OF(V,O,G);let{nodesInitialized:L}=D5(H,K,q,{nodeOrigin:Z,nodeExtent:E,zIndexMode:W}),M=[0,0,1];if(j&&l&&$){let N=_l(K,{filter:(x)=>!!((x.width||x.initialWidth)&&(x.height||x.initialHeight))}),{x:w,y:R,zoom:p}=Z6(N,l,$,F,Q,J?.padding??0.1);M=[w,R,p]}return{rfId:"1",width:l??0,height:$??0,transform:M,nodes:H,nodesInitialized:L,nodeLookup:K,parentLookup:q,edges:G,edgeLookup:O,connectionLookup:V,onNodesChange:null,onEdgesChange:null,hasDefaultNodes:_!==void 0,hasDefaultEdges:y!==void 0,panZoom:null,minZoom:F,maxZoom:Q,translateExtent:ul,nodeExtent:E,nodesSelectionActive:!1,userSelectionActive:!1,userSelectionRect:null,connectionMode:g_.Strict,domNode:null,paneDragging:!1,noPanClassName:"nopan",nodeOrigin:Z,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:j??!1,fitViewOptions:J,fitViewResolver:null,connection:{...fF},connectionClickStartHandle:null,connectOnClick:!0,ariaLiveMessage:"",autoPanOnConnect:!0,autoPanOnNodeDrag:!0,autoPanOnNodeFocus:!0,autoPanSpeed:15,connectionRadius:20,onError:FF,isValidConnection:void 0,onSelectionChangeHandlers:[],lib:"react",debug:!1,ariaLabelConfig:eJ,zIndexMode:W,onNodesChangeMiddlewareMap:new Map,onEdgesChangeMiddlewareMap:new Map}},nD=({nodes:f,edges:u,defaultNodes:_,defaultEdges:y,width:l,height:$,fitView:j,fitViewOptions:J,minZoom:F,maxZoom:Q,nodeOrigin:U,nodeExtent:z,zIndexMode:W})=>aK((K,q)=>{async function V(){let{nodeLookup:O,panZoom:G,fitViewOptions:H,fitViewResolver:Z,width:E,height:L,minZoom:M,maxZoom:N}=q();if(!G)return;await UK({nodes:O,width:E,height:L,panZoom:G,minZoom:M,maxZoom:N},H),Z?.resolve(!0),K({fitViewResolver:null})}return{...EZ({nodes:f,edges:u,width:l,height:$,fitView:j,fitViewOptions:J,minZoom:F,maxZoom:Q,nodeOrigin:U,nodeExtent:z,defaultNodes:_,defaultEdges:y,zIndexMode:W}),setNodes:(O)=>{let{nodeLookup:G,parentLookup:H,nodeOrigin:Z,elevateNodesOnSelect:E,fitViewQueued:L,zIndexMode:M,nodesSelectionActive:N}=q(),{nodesInitialized:w,hasSelectedNodes:R}=D5(O,G,H,{nodeOrigin:Z,nodeExtent:z,elevateNodesOnSelect:E,checkEquality:!0,zIndexMode:M}),p=N&&R;if(L&&w)V(),K({nodes:O,nodesInitialized:w,fitViewQueued:!1,fitViewOptions:void 0,nodesSelectionActive:p});else K({nodes:O,nodesInitialized:w,nodesSelectionActive:p})},setEdges:(O)=>{let{connectionLookup:G,edgeLookup:H}=q();OF(G,H,O),K({edges:O})},setDefaultNodesAndEdges:(O,G)=>{if(O){let{setNodes:H}=q();H(O),K({hasDefaultNodes:!0})}if(G){let{setEdges:H}=q();H(G),K({hasDefaultEdges:!0})}},updateNodeInternals:(O)=>{let{triggerNodeChanges:G,nodeLookup:H,parentLookup:Z,domNode:E,nodeOrigin:L,nodeExtent:M,debug:N,fitViewQueued:w,zIndexMode:R}=q(),{changes:p,updatedInternals:x}=LK(O,H,Z,E,L,M,R);if(!x)return;if(XK(H,Z,{nodeOrigin:L,nodeExtent:M,zIndexMode:R}),w)V(),K({fitViewQueued:!1,fitViewOptions:void 0});else K({});if(p?.length>0){if(N)console.log("React Flow: trigger node changes",p);G?.(p)}},updateNodePositions:(O,G=!1)=>{let H=[],Z=[],{nodeLookup:E,triggerNodeChanges:L,connection:M,updateConnection:N,onNodesChangeMiddlewareMap:w}=q();for(let[R,p]of O){let x=E.get(R),C=!!(x?.expandParent&&x?.parentId&&p?.position),P={id:R,type:"position",position:C?{x:Math.max(0,p.position.x),y:Math.max(0,p.position.y)}:p.position,dragging:G};if(x&&M.inProgress&&M.fromNode.id===x.id){let D=t_(x,M.fromHandle,Uf.Left,!0);N({...M,from:D})}if(C&&x.parentId)H.push({id:R,parentId:x.parentId,rect:{...p.internals.positionAbsolute,width:p.measured.width??0,height:p.measured.height??0}});Z.push(P)}if(H.length>0){let{parentLookup:R,nodeOrigin:p}=q(),x=T5(H,E,R,p);Z.push(...x)}for(let R of w.values())Z=R(Z);L(Z)},triggerNodeChanges:(O)=>{let{onNodesChange:G,setNodes:H,nodes:Z,hasDefaultNodes:E,debug:L}=q();if(O?.length){if(E){let M=Sw(O,Z);H(M)}if(L)console.log("React Flow: trigger node changes",O);G?.(O)}},triggerEdgeChanges:(O)=>{let{onEdgesChange:G,setEdges:H,edges:Z,hasDefaultEdges:E,debug:L}=q();if(O?.length){if(E){let M=Pw(O,Z);H(M)}if(L)console.log("React Flow: trigger edge changes",O);G?.(O)}},addSelectedNodes:(O)=>{let{multiSelectionActive:G,edgeLookup:H,nodeLookup:Z,triggerNodeChanges:E,triggerEdgeChanges:L}=q();if(G){let M=O.map((N)=>ny(N,!0));E(M);return}E(Fl(Z,new Set([...O]),!0)),L(Fl(H))},addSelectedEdges:(O)=>{let{multiSelectionActive:G,edgeLookup:H,nodeLookup:Z,triggerNodeChanges:E,triggerEdgeChanges:L}=q();if(G){let M=O.map((N)=>ny(N,!0));L(M);return}L(Fl(H,new Set([...O]))),E(Fl(Z,new Set,!0))},unselectNodesAndEdges:({nodes:O,edges:G}={})=>{let{edges:H,nodes:Z,nodeLookup:E,triggerNodeChanges:L,triggerEdgeChanges:M}=q(),N=O?O:Z,w=G?G:H,R=[];for(let x of N){if(!x.selected)continue;let C=E.get(x.id);if(C)C.selected=!1;R.push(ny(x.id,!1))}let p=[];for(let x of w){if(!x.selected)continue;p.push(ny(x.id,!1))}L(R),M(p)},setMinZoom:(O)=>{let{panZoom:G,maxZoom:H}=q();G?.setScaleExtent([O,H]),K({minZoom:O})},setMaxZoom:(O)=>{let{panZoom:G,minZoom:H}=q();G?.setScaleExtent([H,O]),K({maxZoom:O})},setTranslateExtent:(O)=>{q().panZoom?.setTranslateExtent(O),K({translateExtent:O})},resetSelectedElements:()=>{let{edges:O,nodes:G,triggerNodeChanges:H,triggerEdgeChanges:Z,elementsSelectable:E}=q();if(!E)return;let L=G.reduce((N,w)=>w.selected?[...N,ny(w.id,!1)]:N,[]),M=O.reduce((N,w)=>w.selected?[...N,ny(w.id,!1)]:N,[]);H(L),Z(M)},setNodeExtent:(O)=>{let{nodes:G,nodeLookup:H,parentLookup:Z,nodeOrigin:E,elevateNodesOnSelect:L,nodeExtent:M,zIndexMode:N}=q();if(O[0][0]===M[0][0]&&O[0][1]===M[0][1]&&O[1][0]===M[1][0]&&O[1][1]===M[1][1])return;D5(G,H,Z,{nodeOrigin:E,nodeExtent:O,elevateNodesOnSelect:L,checkEquality:!1,zIndexMode:N}),K({nodeExtent:O})},panBy:(O)=>{let{transform:G,width:H,height:Z,panZoom:E,translateExtent:L}=q();return YK({delta:O,panZoom:E,transform:G,translateExtent:L,width:H,height:Z})},setCenter:async(O,G,H)=>{let{width:Z,height:E,maxZoom:L,panZoom:M}=q();if(!M)return Promise.resolve(!1);let N=typeof H?.zoom<"u"?H.zoom:L;return await M.setViewport({x:Z/2-O*N,y:E/2-G*N,zoom:N},{duration:H?.duration,ease:H?.ease,interpolate:H?.interpolate}),Promise.resolve(!0)},cancelConnection:()=>{K({connection:{...fF}})},updateConnection:(O)=>{K({connection:O})},reset:()=>K({...EZ()})}},Object.is);function tD({initialNodes:f,initialEdges:u,defaultNodes:_,defaultEdges:y,initialWidth:l,initialHeight:$,initialMinZoom:j,initialMaxZoom:J,initialFitViewOptions:F,fitView:Q,nodeOrigin:U,nodeExtent:z,zIndexMode:W,children:K}){let[q]=d.useState(()=>nD({nodes:f,edges:u,defaultNodes:_,defaultEdges:y,width:l,height:$,fitView:Q,minZoom:j,maxZoom:J,fitViewOptions:F,nodeOrigin:U,nodeExtent:z,zIndexMode:W}));return t.jsx(Ww,{value:q,children:t.jsx(xw,{children:K})})}function sD({children:f,nodes:u,edges:_,defaultNodes:y,defaultEdges:l,width:$,height:j,fitView:J,fitViewOptions:F,minZoom:Q,maxZoom:U,nodeOrigin:z,nodeExtent:W,zIndexMode:K}){if(d.useContext(x5))return t.jsx(t.Fragment,{children:f});return t.jsx(tD,{initialNodes:u,initialEdges:_,defaultNodes:y,defaultEdges:l,initialWidth:$,initialHeight:j,fitView:J,initialFitViewOptions:F,initialMinZoom:Q,initialMaxZoom:U,nodeOrigin:z,nodeExtent:W,zIndexMode:K,children:f})}var oD={width:"100%",height:"100%",overflow:"hidden",position:"relative",zIndex:0};function aD({nodes:f,edges:u,defaultNodes:_,defaultEdges:y,className:l,nodeTypes:$,edgeTypes:j,onNodeClick:J,onEdgeClick:F,onInit:Q,onMove:U,onMoveStart:z,onMoveEnd:W,onConnect:K,onConnectStart:q,onConnectEnd:V,onClickConnectStart:O,onClickConnectEnd:G,onNodeMouseEnter:H,onNodeMouseMove:Z,onNodeMouseLeave:E,onNodeContextMenu:L,onNodeDoubleClick:M,onNodeDragStart:N,onNodeDrag:w,onNodeDragStop:R,onNodesDelete:p,onEdgesDelete:x,onDelete:C,onSelectionChange:P,onSelectionDragStart:D,onSelectionDrag:T,onSelectionDragStop:S,onSelectionContextMenu:r,onSelectionStart:Y,onSelectionEnd:v,onBeforeDelete:m,connectionMode:c,connectionLineType:o=v1.Bezier,connectionLineStyle:ff,connectionLineComponent:n,connectionLineContainerStyle:lf,deleteKeyCode:Gf="Backspace",selectionKeyCode:zf="Shift",selectionOnDrag:jf=!1,selectionMode:Wf=ky.Full,panActivationKeyCode:Vf="Space",multiSelectionKeyCode:Kf=jl()?"Meta":"Control",zoomActivationKeyCode:h=jl()?"Meta":"Control",snapToGrid:g,snapGrid:I,onlyRenderVisibleElements:yf=!1,selectNodesOnDrag:$f,nodesDraggable:Qf,autoPanOnNodeFocus:Yf,nodesConnectable:xf,nodesFocusable:tf,nodeOrigin:j0=LZ,edgesFocusable:u0,edgesReconnectable:D0,elementsSelectable:Fu=!0,defaultViewport:O0=Yw,minZoom:x0=0.5,maxZoom:ku=2,translateExtent:X0=ul,preventScrolling:Au=!0,nodeExtent:uf,defaultMarkerColor:vf="#b1b1b7",zoomOnScroll:a0=!0,zoomOnPinch:Bf=!0,panOnScroll:v0=!1,panOnScrollSpeed:i0=0.5,panOnScrollMode:d0=A_.Free,zoomOnDoubleClick:b0=!0,panOnDrag:m1=!0,onPaneClick:ef,onPaneMouseEnter:iu,onPaneMouseMove:ey,onPaneMouseLeave:f3,onPaneScroll:s,onPaneContextMenu:Nf,paneClickDistance:Of=1,nodeClickDistance:Cf=0,children:_0,onReconnect:G0,onReconnectStart:hf,onReconnectEnd:h0,onEdgeContextMenu:Qu,onEdgeDoubleClick:P6,onEdgeMouseEnter:L1,onEdgeMouseMove:C6,onEdgeMouseLeave:u3,reconnectRadius:_3=10,onNodesChange:$y,onEdgesChange:W_,noDragClassName:R6="nodrag",noWheelClassName:z2="nowheel",noPanClassName:x6="nopan",fitView:k1,fitViewOptions:jy,connectOnClick:v6,attributionPosition:G2,proOptions:Vl,defaultEdgeOptions:El,elevateNodesOnSelect:j1=!0,elevateEdgesOnSelect:Jy=!1,disableKeyboardA11y:Ol=!1,autoPanOnConnect:K2,autoPanOnNodeDrag:b6,autoPanSpeed:Xl,connectionRadius:Z2,isValidConnection:q2,onError:i1,style:h6,id:Nl,nodeDragThreshold:Y1,connectionDragThreshold:Ll,viewport:I6,onViewportChange:H2,width:V2,height:zA,colorMode:gu="light",debug:c6,onScroll:p6,ariaLabelConfig:Tu,zIndexMode:y3="basic",...Yl},Bl){let wl=Nl||"1",E2=Tw(gu),O2=d.useCallback((m6)=>{m6.currentTarget.scrollTo({top:0,left:0,behavior:"instant"}),p6?.(m6)},[p6]);return t.jsx("div",{"data-testid":"rf__wrapper",...Yl,onScroll:O2,style:{...h6,...oD},ref:Bl,className:Y0(["react-flow",l,E2]),id:Nl,role:"application",children:t.jsxs(sD,{nodes:f,edges:u,width:V2,height:zA,fitView:k1,fitViewOptions:jy,minZoom:x0,maxZoom:ku,nodeOrigin:j0,nodeExtent:uf,zIndexMode:y3,children:[t.jsx(Dw,{nodes:f,edges:u,defaultNodes:_,defaultEdges:y,onConnect:K,onConnectStart:q,onConnectEnd:V,onClickConnectStart:O,onClickConnectEnd:G,nodesDraggable:Qf,autoPanOnNodeFocus:Yf,nodesConnectable:xf,nodesFocusable:tf,edgesFocusable:u0,edgesReconnectable:D0,elementsSelectable:Fu,elevateNodesOnSelect:j1,elevateEdgesOnSelect:Jy,minZoom:x0,maxZoom:ku,nodeExtent:uf,onNodesChange:$y,onEdgesChange:W_,snapToGrid:g,snapGrid:I,connectionMode:c,translateExtent:X0,connectOnClick:v6,defaultEdgeOptions:El,fitView:k1,fitViewOptions:jy,onNodesDelete:p,onEdgesDelete:x,onDelete:C,onNodeDragStart:N,onNodeDrag:w,onNodeDragStop:R,onSelectionDrag:T,onSelectionDragStart:D,onSelectionDragStop:S,onMove:U,onMoveStart:z,onMoveEnd:W,noPanClassName:x6,nodeOrigin:j0,rfId:wl,autoPanOnConnect:K2,autoPanOnNodeDrag:b6,autoPanSpeed:Xl,onError:i1,connectionRadius:Z2,isValidConnection:q2,selectNodesOnDrag:$f,nodeDragThreshold:Y1,connectionDragThreshold:Ll,onBeforeDelete:m,debug:c6,ariaLabelConfig:Tu,zIndexMode:y3}),t.jsx(gD,{onInit:Q,onNodeClick:J,onEdgeClick:F,onNodeMouseEnter:H,onNodeMouseMove:Z,onNodeMouseLeave:E,onNodeContextMenu:L,onNodeDoubleClick:M,nodeTypes:$,edgeTypes:j,connectionLineType:o,connectionLineStyle:ff,connectionLineComponent:n,connectionLineContainerStyle:lf,selectionKeyCode:zf,selectionOnDrag:jf,selectionMode:Wf,deleteKeyCode:Gf,multiSelectionKeyCode:Kf,panActivationKeyCode:Vf,zoomActivationKeyCode:h,onlyRenderVisibleElements:yf,defaultViewport:O0,translateExtent:X0,minZoom:x0,maxZoom:ku,preventScrolling:Au,zoomOnScroll:a0,zoomOnPinch:Bf,zoomOnDoubleClick:b0,panOnScroll:v0,panOnScrollSpeed:i0,panOnScrollMode:d0,panOnDrag:m1,onPaneClick:ef,onPaneMouseEnter:iu,onPaneMouseMove:ey,onPaneMouseLeave:f3,onPaneScroll:s,onPaneContextMenu:Nf,paneClickDistance:Of,nodeClickDistance:Cf,onSelectionContextMenu:r,onSelectionStart:Y,onSelectionEnd:v,onReconnect:G0,onReconnectStart:hf,onReconnectEnd:h0,onEdgeContextMenu:Qu,onEdgeDoubleClick:P6,onEdgeMouseEnter:L1,onEdgeMouseMove:C6,onEdgeMouseLeave:u3,reconnectRadius:_3,defaultMarkerColor:vf,noDragClassName:R6,noWheelClassName:z2,noPanClassName:x6,rfId:wl,disableKeyboardA11y:Ol,nodeExtent:uf,viewport:I6,onViewportChange:H2}),t.jsx(Lw,{onSelectionChange:P}),_0,t.jsx(Vw,{proOptions:Vl,position:G2}),t.jsx(Hw,{rfId:wl,disableKeyboardA11y:Ol})]})})}var oZ=BZ(aD);var pb=hu.error014();function dD({dimensions:f,lineWidth:u,variant:_,className:y}){return t.jsx("path",{strokeWidth:u,d:`M${f[0]/2} 0 V${f[1]} M0 ${f[1]/2} H${f[0]}`,className:Y0(["react-flow__background-pattern",_,y])})}function eD({radius:f,className:u}){return t.jsx("circle",{cx:f,cy:f,r:f,className:Y0(["react-flow__background-pattern","dots",u])})}var o_;(function(f){f.Lines="lines",f.Dots="dots",f.Cross="cross"})(o_||(o_={}));var fT={[o_.Dots]:1,[o_.Lines]:1,[o_.Cross]:6},uT=(f)=>({transform:f.transform,patternId:`pattern-${f.rfId}`});function aZ({id:f,variant:u=o_.Dots,gap:_=20,size:y,lineWidth:l=1,offset:$=0,color:j,bgColor:J,style:F,className:Q,patternClassName:U}){let z=d.useRef(null),{transform:W,patternId:K}=mf(uT,Q0),q=y||fT[u],V=u===o_.Dots,O=u===o_.Cross,G=Array.isArray(_)?_:[_,_],H=[G[0]*W[2]||1,G[1]*W[2]||1],Z=q*W[2],E=Array.isArray($)?$:[$,$],L=O?[Z,Z]:H,M=[E[0]*W[2]||1+L[0]/2,E[1]*W[2]||1+L[1]/2],N=`${K}${f?f:""}`;return t.jsxs("svg",{className:Y0(["react-flow__background",Q]),style:{...F,...b5,"--xy-background-color-props":J,"--xy-background-pattern-color-props":j},ref:z,"data-testid":"rf__background",children:[t.jsx("pattern",{id:N,x:W[0]%H[0],y:W[1]%H[1],width:H[0],height:H[1],patternUnits:"userSpaceOnUse",patternTransform:`translate(-${M[0]},-${M[1]})`,children:V?t.jsx(eD,{radius:Z/2,className:U}):t.jsx(dD,{dimensions:L,lineWidth:l,variant:u,className:U})}),t.jsx("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:`url(#${N})`})]})}aZ.displayName="Background";var dZ=d.memo(aZ);function _T(){return t.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",children:t.jsx("path",{d:"M32 18.133H18.133V32h-4.266V18.133H0v-4.266h13.867V0h4.266v13.867H32z"})})}function yT(){return t.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 5",children:t.jsx("path",{d:"M0 0h32v4.2H0z"})})}function lT(){return t.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 30",children:t.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 $T(){return t.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:t.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 jT(){return t.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:t.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 C5({children:f,className:u,..._}){return t.jsx("button",{type:"button",className:Y0(["react-flow__controls-button",u]),..._,children:f})}var JT=(f)=>({isInteractive:f.nodesDraggable||f.nodesConnectable||f.elementsSelectable,minZoomReached:f.transform[2]<=f.minZoom,maxZoomReached:f.transform[2]>=f.maxZoom,ariaLabelConfig:f.ariaLabelConfig});function eZ({style:f,showZoom:u=!0,showFitView:_=!0,showInteractive:y=!0,fitViewOptions:l,onZoomIn:$,onZoomOut:j,onFitView:J,onInteractiveChange:F,className:Q,children:U,position:z="bottom-left",orientation:W="vertical","aria-label":K}){let q=W0(),{isInteractive:V,minZoomReached:O,maxZoomReached:G,ariaLabelConfig:H}=mf(JT,Q0),{zoomIn:Z,zoomOut:E,fitView:L}=DF(),M=()=>{Z(),$?.()},N=()=>{E(),j?.()},w=()=>{L(l),J?.()},R=()=>{q.setState({nodesDraggable:!V,nodesConnectable:!V,elementsSelectable:!V}),F?.(!V)};return t.jsxs(v5,{className:Y0(["react-flow__controls",W==="horizontal"?"horizontal":"vertical",Q]),position:z,style:f,"data-testid":"rf__controls","aria-label":K??H["controls.ariaLabel"],children:[u&&t.jsxs(t.Fragment,{children:[t.jsx(C5,{onClick:M,className:"react-flow__controls-zoomin",title:H["controls.zoomIn.ariaLabel"],"aria-label":H["controls.zoomIn.ariaLabel"],disabled:G,children:t.jsx(_T,{})}),t.jsx(C5,{onClick:N,className:"react-flow__controls-zoomout",title:H["controls.zoomOut.ariaLabel"],"aria-label":H["controls.zoomOut.ariaLabel"],disabled:O,children:t.jsx(yT,{})})]}),_&&t.jsx(C5,{className:"react-flow__controls-fitview",onClick:w,title:H["controls.fitView.ariaLabel"],"aria-label":H["controls.fitView.ariaLabel"],children:t.jsx(lT,{})}),y&&t.jsx(C5,{className:"react-flow__controls-interactive",onClick:R,title:H["controls.interactive.ariaLabel"],"aria-label":H["controls.interactive.ariaLabel"],children:V?t.jsx(jT,{}):t.jsx($T,{})}),U]})}eZ.displayName="Controls";var fq=d.memo(eZ);function FT({id:f,x:u,y:_,width:y,height:l,style:$,color:j,strokeColor:J,strokeWidth:F,className:Q,borderRadius:U,shapeRendering:z,selected:W,onClick:K}){let{background:q,backgroundColor:V}=$||{},O=j||q||V;return t.jsx("rect",{className:Y0(["react-flow__minimap-node",{selected:W},Q]),x:u,y:_,rx:U,ry:U,width:y,height:l,style:{fill:O,stroke:J,strokeWidth:F},shapeRendering:z,onClick:K?(G)=>K(G,f):void 0})}var AT=d.memo(FT),QT=(f)=>f.nodes.map((u)=>u.id),YF=(f)=>f instanceof Function?f:()=>f;function UT({nodeStrokeColor:f,nodeColor:u,nodeClassName:_="",nodeBorderRadius:y=5,nodeStrokeWidth:l,nodeComponent:$=AT,onClick:j}){let J=mf(QT,Q0),F=YF(u),Q=YF(f),U=YF(_),z=typeof window>"u"||!!window.chrome?"crispEdges":"geometricPrecision";return t.jsx(t.Fragment,{children:J.map((W)=>t.jsx(zT,{id:W,nodeColorFunc:F,nodeStrokeColorFunc:Q,nodeClassNameFunc:U,nodeBorderRadius:y,nodeStrokeWidth:l,NodeComponent:$,onClick:j,shapeRendering:z},W))})}function WT({id:f,nodeColorFunc:u,nodeStrokeColorFunc:_,nodeClassNameFunc:y,nodeBorderRadius:l,nodeStrokeWidth:$,shapeRendering:j,NodeComponent:J,onClick:F}){let{node:Q,x:U,y:z,width:W,height:K}=mf((q)=>{let V=q.nodeLookup.get(f);if(!V)return{node:void 0,x:0,y:0,width:0,height:0};let O=V.internals.userNode,{x:G,y:H}=V.internals.positionAbsolute,{width:Z,height:E}=b1(O);return{node:O,x:G,y:H,width:Z,height:E}},Q0);if(!Q||Q.hidden||!AF(Q))return null;return t.jsx(J,{x:U,y:z,width:W,height:K,style:Q.style,selected:!!Q.selected,className:y(Q),color:u(Q),borderRadius:l,strokeColor:_(Q),strokeWidth:$,shapeRendering:j,onClick:F,id:Q.id})}var zT=d.memo(WT),GT=d.memo(UT),KT=200,ZT=150,qT=(f)=>!f.hidden,HT=(f)=>{let u={x:-f.transform[0]/f.transform[2],y:-f.transform[1]/f.transform[2],width:f.width/f.transform[2],height:f.height/f.transform[2]};return{viewBB:u,boundingRect:f.nodeLookup.size>0?jF(_l(f.nodeLookup,{filter:qT}),u):u,rfId:f.rfId,panZoom:f.panZoom,translateExtent:f.translateExtent,flowWidth:f.width,flowHeight:f.height,ariaLabelConfig:f.ariaLabelConfig}},VT="react-flow__minimap-desc";function uq({style:f,className:u,nodeStrokeColor:_,nodeColor:y,nodeClassName:l="",nodeBorderRadius:$=5,nodeStrokeWidth:j,nodeComponent:J,bgColor:F,maskColor:Q,maskStrokeColor:U,maskStrokeWidth:z,position:W="bottom-right",onClick:K,onNodeClick:q,pannable:V=!1,zoomable:O=!1,ariaLabel:G,inversePan:H,zoomStep:Z=1,offsetScale:E=5}){let L=W0(),M=d.useRef(null),{boundingRect:N,viewBB:w,rfId:R,panZoom:p,translateExtent:x,flowWidth:C,flowHeight:P,ariaLabelConfig:D}=mf(HT,Q0),T=f?.width??KT,S=f?.height??ZT,r=N.width/T,Y=N.height/S,v=Math.max(r,Y),m=v*T,c=v*S,o=E*v,ff=N.x-(m-N.width)/2-o,n=N.y-(c-N.height)/2-o,lf=m+o*2,Gf=c+o*2,zf=`${VT}-${R}`,jf=d.useRef(0),Wf=d.useRef();jf.current=v,d.useEffect(()=>{if(M.current&&p)return Wf.current=SK({domNode:M.current,panZoom:p,getTransform:()=>L.getState().transform,getViewScale:()=>jf.current}),()=>{Wf.current?.destroy()}},[p]),d.useEffect(()=>{Wf.current?.update({translateExtent:x,width:C,height:P,inversePan:H,pannable:V,zoomStep:Z,zoomable:O})},[V,O,H,Z,x,C,P]);let Vf=K?(g)=>{let[I,yf]=Wf.current?.pointer(g)||[0,0];K(g,{x:I,y:yf})}:void 0,Kf=q?d.useCallback((g,I)=>{let yf=L.getState().nodeLookup.get(I).internals.userNode;q(g,yf)},[]):void 0,h=G??D["minimap.ariaLabel"];return t.jsx(v5,{position:W,style:{...f,"--xy-minimap-background-color-props":typeof F==="string"?F:void 0,"--xy-minimap-mask-background-color-props":typeof Q==="string"?Q:void 0,"--xy-minimap-mask-stroke-color-props":typeof U==="string"?U:void 0,"--xy-minimap-mask-stroke-width-props":typeof z==="number"?z*v:void 0,"--xy-minimap-node-background-color-props":typeof y==="string"?y:void 0,"--xy-minimap-node-stroke-color-props":typeof _==="string"?_:void 0,"--xy-minimap-node-stroke-width-props":typeof j==="number"?j:void 0},className:Y0(["react-flow__minimap",u]),"data-testid":"rf__minimap",children:t.jsxs("svg",{width:T,height:S,viewBox:`${ff} ${n} ${lf} ${Gf}`,className:"react-flow__minimap-svg",role:"img","aria-labelledby":zf,ref:M,onClick:Vf,children:[h&&t.jsx("title",{id:zf,children:h}),t.jsx(GT,{onClick:Kf,nodeColor:y,nodeStrokeColor:_,nodeBorderRadius:$,nodeClassName:l,nodeStrokeWidth:j,nodeComponent:J}),t.jsx("path",{className:"react-flow__minimap-mask",d:`M${ff-o},${n-o}h${lf+o*2}v${Gf+o*2}h${-lf-o*2}z - M${w.x},${w.y}h${w.width}v${w.height}h${-w.width}z`,fillRule:"evenodd",pointerEvents:"none"})]})})}uq.displayName="MiniMap";var mb=d.memo(uq),ET=(f)=>(u)=>f?`${Math.max(1/u.transform[2],1)}`:void 0,OT={[s_.Line]:"right",[s_.Handle]:"bottom-right"};function XT({nodeId:f,position:u,variant:_=s_.Handle,className:y,style:l=void 0,children:$,color:j,minWidth:J=10,minHeight:F=10,maxWidth:Q=Number.MAX_VALUE,maxHeight:U=Number.MAX_VALUE,keepAspectRatio:z=!1,resizeDirection:W,autoScale:K=!0,shouldResize:q,onResizeStart:V,onResize:O,onResizeEnd:G}){let H=MZ(),Z=typeof f==="string"?f:H,E=W0(),L=d.useRef(null),M=_===s_.Handle,N=mf(d.useCallback(ET(M&&K),[M,K]),Q0),w=d.useRef(null),R=u??OT[_];d.useEffect(()=>{if(!L.current||!Z)return;if(!w.current)w.current=vK({domNode:L.current,nodeId:Z,getStoreItems:()=>{let{nodeLookup:x,transform:C,snapGrid:P,snapToGrid:D,nodeOrigin:T,domNode:S}=E.getState();return{nodeLookup:x,transform:C,snapGrid:P,snapToGrid:D,nodeOrigin:T,paneDomNode:S}},onChange:(x,C)=>{let{triggerNodeChanges:P,nodeLookup:D,parentLookup:T,nodeOrigin:S}=E.getState(),r=[],Y={x:x.x,y:x.y},v=D.get(Z);if(v&&v.expandParent&&v.parentId){let m=v.origin??S,c=x.width??v.measured.width??0,o=x.height??v.measured.height??0,ff={id:v.id,parentId:v.parentId,rect:{width:c,height:o,...QF({x:x.x??v.position.x,y:x.y??v.position.y},{width:c,height:o},v.parentId,D,m)}},n=T5([ff],D,T,S);r.push(...n),Y.x=x.x?Math.max(m[0]*c,x.x):void 0,Y.y=x.y?Math.max(m[1]*o,x.y):void 0}if(Y.x!==void 0&&Y.y!==void 0){let m={id:Z,type:"position",position:{...Y}};r.push(m)}if(x.width!==void 0&&x.height!==void 0){let c={id:Z,type:"dimensions",resizing:!0,setAttributes:!W?!0:W==="horizontal"?"width":"height",dimensions:{width:x.width,height:x.height}};r.push(c)}for(let m of C){let c={...m,type:"position"};r.push(c)}P(r)},onEnd:({width:x,height:C})=>{let P={id:Z,type:"dimensions",resizing:!1,dimensions:{width:x,height:C}};E.getState().triggerNodeChanges([P])}});return w.current.update({controlPosition:R,boundaries:{minWidth:J,minHeight:F,maxWidth:Q,maxHeight:U},keepAspectRatio:z,resizeDirection:W,onResizeStart:V,onResize:O,onResizeEnd:G,shouldResize:q}),()=>{w.current?.destroy()}},[R,J,F,Q,U,z,V,O,G,q]);let p=R.split("-");return t.jsx("div",{className:Y0(["react-flow__resize-control","nodrag",...p,_,y]),ref:L,style:{...l,scale:N,...j&&{[M?"backgroundColor":"borderColor"]:j}},children:$})}var kb=d.memo(XT);var X=fy.default.createElement,{useEffect:c1}=fy.default,Bu=fy.default.useState,e_=fy.default.useRef,Y6=[{id:"in-left",side:"left",position:Uf.Left,style:{top:"50%"}},{id:"in-top-left",side:"top",slot:"left",slotIndex:-1,position:Uf.Top,style:{left:"28%"}},{id:"in-top-mid",side:"top",slot:"mid",slotIndex:0,position:Uf.Top,style:{left:"50%"}},{id:"in-top-right",side:"top",slot:"right",slotIndex:1,position:Uf.Top,style:{left:"72%"}},{id:"in-bottom-left",side:"bottom",slot:"left",slotIndex:-1,position:Uf.Bottom,style:{left:"28%"}},{id:"in-bottom-mid",side:"bottom",slot:"mid",slotIndex:0,position:Uf.Bottom,style:{left:"50%"}},{id:"in-bottom-right",side:"bottom",slot:"right",slotIndex:1,position:Uf.Bottom,style:{left:"72%"}}],O6=[{id:"out-right",position:Uf.Right,style:{top:"50%"}}],_q=["#4eb7a8","#d7a13a","#69aee8","#e0835f","#b7d86b","#d98bd2","#5fc6bf"],Ql=236,Ul=88,yq=15000,NT=10,MF=96,h1=72,rF=64,lq=12;function $q(f,u){let _=Number.parseFloat(String(f||""));return Number.isFinite(_)?_/100:u}function LT(f,u,_){let y=String(f.side||"");if(y!=="top"&&y!=="bottom")return 0;let l=Number(f.slotIndex||0),$=y==="top"?"in-top-mid":"in-bottom-mid",j=u.get(f.id)||0,J=u.get($)||0;if(l===0)return J===0?-26:28+j*74;let F=_===0?Math.abs(l)*2:Math.sign(_)===Math.sign(l)?-3:3;if(J>0&&j===0)return-14+F;return 8+j*74+F}function h5(f){let u=f.filter(($,j)=>{let J=f[j-1];return!J||Math.abs(J.x-$.x)>0.5||Math.abs(J.y-$.y)>0.5});if(u.length<2)return"";let _=`M ${u[0].x},${u[0].y}`,y=u[0];for(let $=1;$0.5||Math.abs(W.y-y.y)>0.5)_+=` L ${W.x},${W.y}`;_+=` Q ${J.x},${J.y} ${K.x},${K.y}`,y=K}let l=u[u.length-1];return`${_} L ${l.x},${l.y}`}function Bq(f,u,_,y,l,$,j=""){let J=_>=f,F=Math.max(1,Math.abs(_-f)),Q=Math.abs(y-u),U=Math.max(34,Math.min(118,F*0.26)),z=Math.min(280,Math.abs($));if(J&&l===Uf.Left&&z<4&&Q<28&&F<420)return`M ${f},${u} C ${f+U},${u} ${_-U},${y} ${_},${y}`;if(J&&l===Uf.Left&&(j==="direct-forward-left"||F<=260&&Q<=210)){let G=Math.max(42,Math.min(140,F*0.48)),H=Math.max(-28,Math.min(28,$*0.18));return`M ${f},${u} C ${f+G},${u+H} ${_-G},${y} ${_},${y}`}if(J){let G=f+U;if(l===Uf.Top||l===Uf.Bottom){let E=l===Uf.Top?-1:1,L=y+E*(54+z*0.42);return h5([{x:f,y:u},{x:G,y:u},{x:G+Math.min(120,F*0.18),y:L},{x:_,y:L},{x:_,y:y+E*34},{x:_,y}])}let H=_-U,Z=(u+y)/2+$;return h5([{x:f,y:u},{x:G,y:u},{x:G+Math.min(110,F*0.16),y:Z},{x:H-Math.min(90,F*0.12),y:Z},{x:H,y},{x:_,y}])}let q=l===Uf.Bottom?1:l===Uf.Top?-1:$>=0?1:-1,V=Math.max(f,_)+92+Math.min(180,z*0.52),O=q<0?Math.min(u,y)-84-z*0.62:Math.max(u,y)+84+z*0.62;if(l===Uf.Top||l===Uf.Bottom)return h5([{x:f,y:u},{x:f+U,y:u},{x:V,y:O},{x:_,y:O},{x:_,y:y+q*38},{x:_,y}]);return h5([{x:f,y:u},{x:f+U,y:u},{x:V,y:O},{x:_-U,y:O},{x:_-U,y},{x:_,y}])}function YT({data:f}){return X("div",{className:"pipeline-flow-node-body"},Y6.map((u)=>X(ty,{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})),O6.map((u)=>X(ty,{key:u.id,id:u.id,type:"source",position:u.position,isConnectable:!1,className:"pipeline-flow-handle output right",style:u.style})),f?.label)}function BT({id:f,sourceX:u,sourceY:_,targetX:y,targetY:l,targetPosition:$,markerEnd:j,markerStart:J,style:F,data:Q}){let U=Number(Q?.laneOffset||0),z=Bq(u,_,y,l,$,U,String(Q?.routeMode||""));return X(Al,{id:f,path:z,markerEnd:j,markerStart:J,style:F,interactionWidth:28})}var wT={pipelineCurve:BT},DT={pipelineNode:YT};function z0(f){if(!f)return"--";let u=new Date(f);if(Number.isNaN(u.getTime()))return"--";return u.toLocaleString("zh-CN",{hour12:!1})}function a5(f){return f.toLocaleTimeString("zh-CN",{hour12:!1})}function m5(f){if(!f)return"--";let u=new Date(f);if(Number.isNaN(u.getTime()))return"--";return a5(u)}function l1(f){let u=Number(f);if(!Number.isFinite(u)||u<0)return"--";let _=Math.round(u/1000);if(_<60)return`${_}s`;if(_<3600)return`${Math.floor(_/60)}m ${_%60}s`;return`${Math.floor(_/3600)}h ${Math.floor(_%3600/60)}m`}function SF(f){let u=Number(f);if(!Number.isFinite(u))return"--";return u.toLocaleString("zh-CN")}function jq(f){let u=Number(f);if(!Number.isFinite(u))return"--";return`${Math.round(Math.max(0,Math.min(1,u))*100)}%`}function Xf(f){return typeof f==="object"&&f!==null&&!Array.isArray(f)}function Hf(f){return Array.isArray(f)?f:[]}function Pf(f){if(!f)return null;let u=new Date(f);return Number.isNaN(u.getTime())?null:u.getTime()}function B6(f){return Number.isFinite(Number(f))?new Date(Number(f)).toISOString():""}function T6(...f){for(let u of f){let _=Pf(u);if(_!==null)return new Date(_).toISOString()}return""}function gF(...f){let u=f.map(Pf).filter((_)=>_!==null);return u.length>0?new Date(Math.max(...u)).toISOString():""}function nF(f){return["succeeded","failed","skipped","cancelled","canceled","completed"].includes(String(f||"").toLowerCase())}function wq(f){let u=Mq(f).toLowerCase();return["running","active","in-progress","in_progress"].includes(u)}function Jq(f,u="status"){return f.reduce((_,y)=>{let l=String(y?.[u]||"unknown").toLowerCase();return _[l]=(_[l]||0)+1,_},{})}function Dq(f){if(!f||typeof f!=="string")return null;try{let u=JSON.parse(f);return Xf(u)?u:null}catch{return null}}function PF(f){let u=f.map(Dq).filter(($)=>Boolean($)),_=u.flatMap(($)=>[$.timestamp,$.createdAt,$.updatedAt]).filter(Boolean),y=gF(..._),l=Array.from(new Set(u.map(($)=>String($.event||$.action||$.type||"")).filter(Boolean))).slice(0,3);return{total:f.length,parsed:u.length,lastAt:y,eventKinds:l}}function k5(f){if(f===null||f===void 0)return"--";if(typeof f==="boolean")return f?"是":"否";if(typeof f==="number")return String(f);if(typeof f==="string")return f.length>80?`${f.slice(0,77)}...`:f;if(Array.isArray(f))return`${f.length} 项`;if(typeof f==="object")return`${Object.keys(f).length} 字段`;return String(f)}function Tq(f,u=280){if(f===null||f===void 0)return"";let y=(typeof f==="string"?f:String(f)).replace(/\r\n/gu,` -`).trim();return y.length>u?`${y.slice(0,Math.max(0,u-1))}...`:y}function Mq(f){if(typeof f==="string")return f;if(Xf(f))return String(f.status||f.state||f.phase||"unknown");return"unknown"}function TT(f){return f.filter((u)=>u&&u.value!==void 0&&u.value!==null&&String(u.value)!=="")}function hF({items:f}){let u=TT(Hf(f));return X("div",{className:"pipeline-kv-grid"},u.map((_)=>X("span",{key:_.label},X("b",null,_.label),X("span",null,_.value))))}function tF({items:f}){let u=Hf(f).map((_)=>String(_||"")).filter(Boolean);if(u.length===0)return null;return X("div",{className:"pipeline-chip-row"},u.map((_,y)=>X("span",{key:`${y}-${_}`},_)))}function IF(f,u){let _=String(u?.procedureRunId||""),y=Hf(f?.procedureRuns);return y.find((l)=>String($1(l))===_)||y.at(-1)||null}function MT(f,u){let _=String(u||"");if(!_)return null;return Hf(f?.procedureRuns).find((y)=>$1(y)===_)||null}function CF(f){return Hf(f?.attempts).length}function Fq(f){return Hf(f?.attempts).reduce((u,_)=>u+d5(_).length,0)}function d5(f){return Hf(f?.opencodeMessages?.steps).filter(Xf)}function rq(f){let u=String(f?.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 rT(f,u){let _=cF(f.map(($)=>$?.agent)).slice(0,3),y=cF(f.map(($)=>$?.model)).slice(0,3),l=u.length<=2?u.map(($)=>`session ${$}`):[`sessions ${u.length}`,...u.slice(0,2).map(($)=>`session ${$}`)];return[..._.map(($)=>`agent ${$}`),...y.map(($)=>`model ${$}`),...l]}function X6(f,u=0){return String(f?.messageId||f?.index||"")||`step-${u}`}function ST({steps:f,sessionIds:u,sessionFacts:_,matchedStepKey:y}){let l=Hf(f),$=l.findIndex((O,G)=>X6(O,G)===y),j=$>=0?l[$]:null,J=l.flatMap((O)=>[Pf(O?.createdAt),Pf(O?.completedAt)]).filter((O)=>O!==null),F=J.length>0?Math.min(...J):null,Q=J.length>0?Math.max(...J):null,U=F!==null&&Q!==null?Math.max(0,Q-F):null,z=l.reduce((O,G)=>O+Hf(G?.parts).filter((H)=>String(H?.type||"").toLowerCase()==="tool").length,0),W=l.reduce((O,G)=>O+Hf(G?.parts).filter((H)=>["text","reasoning"].includes(String(H?.type||"").toLowerCase())).length,0),K=l.reduce((O,G)=>O+Hf(G?.parts).filter((H)=>String(H?.type||"").toLowerCase()==="tool"&&rq(H)==="failed").length,0),q=[`${l.length} steps`,`${u.length} sessions`,`${W} messages`,`${z} tools`,U!==null?`duration ${l1(U)}`:"",K>0?`${K} failed tools`:""].filter(Boolean),V=j?[`Step ${j?.index??$+1}`,String(j?.role||"role --"),j?.model?`model ${j.model}`:"",j?.finish?`finish ${j.finish}`:"",j?.durationMs!==void 0&&j?.durationMs!==null?`duration ${l1(j.durationMs)}`:""].filter(Boolean):[];return X("section",{className:"pipeline-trace-timeline","data-testid":"pipeline-step-timeline"},X("div",{className:"pipeline-trace-head"},X("div",null,X("b",null,"OpenCode Trace"),X("span",null,"Trace 使用 Codex Queue 统一样式展示完整 agent loop;Pipeline 旧 step/message/tool 卡片样式已废弃。")),X("div",{className:"pipeline-trace-session-head","data-testid":"pipeline-step-timeline-session"},X("span",null,q.join(" / ")||"Trace"),_.length>0?X(tF,{items:_}):null)),j?X("div",{className:"pipeline-trace-focus","data-testid":"pipeline-trace-matched-step"},X("span",{className:"codex-output-channel"},"Matched"),X("strong",null,`Gantt selection -> ${V.join(" / ")}`),X("time",null,`${m5(j?.createdAt)} -> ${m5(j?.completedAt)}`)):null,X(V4,{port:Nz,input:l,className:"codex-transcript pipeline-trace",testId:"pipeline-opencode-step-trace",emptyText:"暂无 OpenCode Trace 输出",keepRecentToolCalls:3}))}function N6(f){return Hf(f).flatMap((u)=>{if(Xf(u))return[u];let _=Dq(u);return _?[_]:[]})}function O1(f){return String(f?.event||f?.action||f?.requestedAction||f?.type||"").toLowerCase()}function sy(f){return T6(f?.timestamp,f?.createdAt,f?.updatedAt,f?.startedAt,f?.finishedAt)}function PT(f){return Pf(sy(f))}function e5(f){return String(f?.attempt||f?.id||"")}function cF(f){let u=new Set,_=[];for(let y of f){let l=String(y||"");if(!l||u.has(l))continue;u.add(l),_.push(l)}return _}function Aq(f){switch(String(f||"").toLowerCase()){case"monitor":return"monitor";case"webui":return"webui";case"cli":return"cli";case"system":return"runner";default:return String(f||"--")}}function oy(f){return String(f?.requestedAction||f?.action||"").toLowerCase()}function L6(f){switch(oy(f)){case"guide":return"引导";case"modify":return"修改";case"approve":return"审核通过";case"restart":return"重启";case"redo":return"重做";default:return String(f?.requestedAction||f?.action||"控制")}}function Qq(f){switch(O1(f)){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`${L6(f)} 已发起`;case"control-command-applied":return`${L6(f)} 已生效`;case"control-command-ignored":return`${L6(f)} 已忽略`;default:return String(f?.event||f?.action||f?.requestedAction||"event")}}function Uq(f){return Tq(f?.promptPreview||f?.reasonPreview||f?.prompt||f?.reason||"",240)}function CT(f){let u=String(f?.prompt||""),_=String(f?.reason||f?.restartReason||""),y=u?"":String(f?.promptPreview||""),l=_?"":String(f?.reasonPreview||"");return[u||y?{label:u?"prompt":"prompt preview",value:u||y}:null,_||l?{label:_?"reason":"reason preview",value:_||l}:null,Hf(f?.resetNodeIds).length>0?{label:"reset nodes",value:Hf(f.resetNodeIds).join(", ")}:null,Hf(f?.runningResetNodeIds).length>0?{label:"interrupted running nodes",value:Hf(f.runningResetNodeIds).join(", ")}:null,Hf(f?.interruptedProcedureRunIds).length>0?{label:"interrupted procedures",value:Hf(f.interruptedProcedureRunIds).join(", ")}:null,f?.interruptedProcedureRunId?{label:"interrupted procedure",value:String(f.interruptedProcedureRunId)}:null].filter(Boolean)}function RF(f){let u=d5(f),_=u.map((F)=>Pf(F?.createdAt)).filter((F)=>F!==null),y=u.map((F)=>Pf(F?.completedAt)??Pf(F?.createdAt)).filter((F)=>F!==null),l=N6(f?.controlEventRecords).map((F)=>PT(F)).filter((F)=>F!==null),$=Hf(f?.assistantOutputs).map((F)=>Pf(F?.updatedAt)).filter((F)=>F!==null),j=_[0]??l[0]??$[0]??null,J=y.at(-1)??l.at(-1)??$.at(-1)??j;return{startMs:j,endMs:J}}function RT(f,u,_,y,l=""){let $=Hf(f?.procedureRuns).filter((J)=>f2(J,u)===_);if($.length===0)return null;if(l){let J=$.find((F)=>$1(F)===l);if(J)return J}if(y===null)return $.at(-1)||null;let j=$.find((J)=>{let F=Pf(I5(J,f)),Q=Pf(c5(J,f))??F;return F!==null&&Q!==null&&y>=F-1000&&y<=Q+1000});if(j)return j;return $.slice().sort((J,F)=>{let Q=Pf(I5(J,f))??y,U=Pf(c5(J,f))??Q,z=Pf(I5(F,f))??y,W=Pf(c5(F,f))??z,K=Math.min(Math.abs(Q-y),Math.abs(U-y)),q=Math.min(Math.abs(z-y),Math.abs(W-y));return K-q})[0]||null}function Sq(f,u){let _=Hf(f?.attempts).filter(Xf);if(_.length===0)return null;let y=String(u?.attempt||"");if(y){let j=_.find((J)=>e5(J)===y);if(j)return j}let l=Number.isFinite(Number(u?.ms))?Number(u.ms):null;if(l===null)return _.at(-1)||null;let $=_.find((j)=>{let J=RF(j);return Number.isFinite(J.startMs)&&Number.isFinite(J.endMs)&&l>=Number(J.startMs)-1000&&l<=Number(J.endMs)+1000});if($)return $;return _.slice().sort((j,J)=>{let F=RF(j),Q=RF(J),U=Math.min(Math.abs(Number(F.startMs??l)-l),Math.abs(Number(F.endMs??l)-l)),z=Math.min(Math.abs(Number(Q.startMs??l)-l),Math.abs(Number(Q.endMs??l)-l));return U-z})[0]||_.at(-1)||null}function Pq(f,u){let _=d5(f);if(_.length===0)return{step:null,stepIndex:-1,stepKey:""};if(u===null){let $=_[0];return{step:$,stepIndex:0,stepKey:X6($,0)}}for(let $=0;$<_.length;$+=1){let j=_[$],J=Pf(j?.createdAt)??Pf(j?.completedAt),F=Pf(j?.completedAt)??J;if(J!==null&&F!==null&&u>=J-1000&&u<=F+1000)return{step:j,stepIndex:$,stepKey:X6(j,$)}}let y=_.findIndex(($)=>{let j=Pf($?.createdAt)??Pf($?.completedAt);return j!==null&&j>=u});if(y>=0){let $=_[y];return{step:$,stepIndex:y,stepKey:X6($,y)}}let l=Math.max(0,_.length-1);return{step:_[l],stepIndex:l,stepKey:X6(_[l],l)}}function xT(f,u){let _=String(u?.runId||f?.runId||"");if(String(u?.mode||"")==="interval"){let Q=u?.interval||{},U=IF(f,Q)||Q.raw||{};return{mode:"interval",runId:_,interval:Q,marker:null,nodeId:String(Q?.nodeId||f2(U,_)||""),procedure:U,attempt:null,matchedStep:null,matchedStepIndex:-1,matchedStepKey:""}}let y=Xf(u?.marker)?u.marker:{},l=Number.isFinite(Number(y?.ms))?Number(y.ms):null,$=String(y?.nodeId||""),j=$?RT(f,_,$,l,String(y?.procedureRunId||"")):null,J=j?Sq(j,y):null,F=J?Pq(J,l):{step:null,stepIndex:-1,stepKey:""};return{mode:"event",runId:_,interval:null,marker:y,nodeId:$,procedure:j,attempt:J,matchedStep:F.step,matchedStepIndex:F.stepIndex,matchedStepKey:F.stepKey}}function vT({procedure:f,matchedStepKey:u="",matchedAttemptId:_=""}){let y=Hf(f?.attempts);if(y.length===0)return X(cu,{title:"暂无 attempt 详情",text:"当前 procedure 还没有可展示的 attempt / OpenCode Trace;若刚点击甘特线,请等待 node 详情抓取完成。"});return y.map((l,$)=>{let j=l?.opencodeMessages||{},J=d5(l),F=Hf(j.sessionIds).map((W)=>String(W)).filter(Boolean),Q=rT(J,F),U=e5(l)||`attempt-${$+1}`,z=J.reduce((W,K)=>W+Hf(K?.parts).filter((q)=>String(q?.type||"").toLowerCase()==="tool"&&rq(q)==="failed").length,0);return X("article",{key:U,className:`pipeline-attempt-card ${_===U?"matched":""}`},X("div",{className:"pipeline-attempt-head"},X("div",null,X("strong",null,U),X("span",null,j.source||"opencode")),X("div",{className:"pipeline-attempt-badges"},X("span",null,`${J.length} steps`),X("span",null,`${j.toolCallCount??"--"} tools`),z>0?X("span",{className:"danger"},`${z} failed`):null)),X(hF,{items:[{label:"messages",value:j.messageCount??"--"},{label:"steps",value:j.stepCount??J.length},{label:"tools",value:j.toolCallCount??"--"},{label:"updated",value:z0(j.updatedAt)},{label:"sessions",value:F.join(", ")||"--"}]}),J.length===0?X("p",{className:"muted paragraph"},"当前 attempt 尚未返回 OpenCode Trace;请确认 D601 pipeline-control 已重建并重新抓取。"):X(ST,{steps:J,sessionIds:F,sessionFacts:Q,matchedStepKey:u}))})}function xF(f,u){return`${f}::${u}`}function i5(f,u,_){if(!Xf(f))return null;return String(f.runId||"")===u&&String(f.nodeId||"")===_?f:null}function bT(f,u){let _=Xf(f)?f:{};if(!Xf(u))return _;let y=Hf(u.attempts),l=Hf(_.attempts);return{..._,...u,attempts:y.length>0?y:l}}function hT(f,u,_,y){if(!i5(u,_,y))return f;let l=Hf(u.procedureRuns),$=Xf(f)?f:{};return{...$,...u,controlCommands:Hf(u.controlCommands).length>0?u.controlCommands:$.controlCommands,controlEvents:Hf(u.controlEvents).length>0?u.controlEvents:$.controlEvents,procedureRuns:l.length>0?l:$.procedureRuns}}function IT({selection:f,runDetails:u,nodeDetails:_,nodeDetailsState:y,onRaw:l,onCollapse:$}){if(!f?.mode)return X("aside",{className:"pipeline-gantt-detail-panel empty","data-testid":"pipeline-gantt-detail-panel"},X("div",{className:"pipeline-gantt-detail-head"},X("div",null,X("span",{className:"panel-eyebrow"},"Gantt Detail"),X("h3",null,"未选择元素")),X("button",{type:"button",className:"ghost-btn mini",onClick:$,"data-testid":"pipeline-gantt-sidebar-collapse"},"收起")),X(cu,{title:"选择一条执行线或一个控制点",text:"点击甘特图中的 node 执行线、prompt 点或控制点,在这里查看结构化过程和 OpenCode step。"}));let j=String(f?.runId||""),J=String(f?.interval?.nodeId||f?.marker?.nodeId||""),F=u?.runId===j?u.details:null,Q=i5(_,j,J),U=String(y?.runId||"")===j&&String(y?.nodeId||"")===J,z=hT(F,Q,j,J),W=(String(u?.runId||"")!==j||Boolean(u?.loading))&&!z,K=String(u?.runId||"")===j?String(u?.error||""):"",q=U?String(y?.error||""):"",V=z?xT(z,f):null,O=V?.interval||f?.interval||null,G=V?.marker||f?.marker||null,H=String(O?.procedureRunId||G?.procedureRunId||""),Z=Q?MT(Q,H)||IF(Q,O||{procedureRunId:H}):null,E=V?.procedure||(z?IF(z,O||{procedureRunId:H}):null)||O?.raw||{};if(Z&&(CF(E)===0||Fq(Z)>=Fq(E)))E=bT(E,Z);let L=V?.attempt||null,M=String(V?.matchedStepKey||"");if(!L&&G&&CF(E)>0)L=Sq(E,G),M=String(Pq(L,Number.isFinite(Number(G?.ms))?Number(G.ms):null).stepKey||"");let N=e5(L),w=CF(E)>0,R=U&&Boolean(y?.loading)&&!w,p=Boolean(W||R),x=[w?"":K,q].filter(Boolean).join(" / "),C=U&&y?.fetchedAt?y.fetchedAt:u?.fetchedAt,P=Mq(E?.status||O?.status||G?.status||G?.event),D=f?.mode==="event"?G?.label||Qq(G?.raw||G)||"event":V?.nodeId||O?.nodeId||"node",T=G?CT(G?.raw||G):[],S=G?[O1(G?.raw||G)?`event ${O1(G?.raw||G)}`:"",G?.promptEvent?`prompt ${G.promptEvent}`:"",G?.action?`action ${G.action}`:"",G?.sourceKind?`source ${Aq(G.sourceKind)}`:"",G?.sourceNodeId?`from ${G.sourceNodeId}`:"",G?.targetNodeId?`to ${G.targetNodeId}`:"",G?.snapReason?`draw ${G.snapReason}`:""].filter(Boolean):[];return X("aside",{className:"pipeline-gantt-detail-panel","data-testid":"pipeline-gantt-detail-panel"},X("div",{className:"pipeline-gantt-detail-head"},X("div",null,X("span",{className:"panel-eyebrow"},f?.mode==="event"?"Gantt Event Detail":"Gantt Line Detail"),X("h3",null,D)),X("div",{className:"pipeline-gantt-detail-head-actions"},X(uy,{status:P},P),X("button",{type:"button",className:"ghost-btn mini",onClick:$,"data-testid":"pipeline-gantt-sidebar-collapse"},"收起"))),G?X("article",{className:"pipeline-event-card"},X("div",{className:"pipeline-event-card-head"},X("strong",null,G?.label||Qq(G?.raw||G)),X(tF,{items:S})),X(hF,{items:[{label:"event time",value:z0(G?.timestampIso||G?.timestamp||"--")},G?.snapped?{label:"drawn time",value:z0(G?.renderedTimestampIso||G?.ms)}:null,{label:"node",value:G?.nodeId||"--"},{label:"procedure",value:G?.procedureRunId||$1(E)||"--"},{label:"attempt",value:G?.attempt||N||"--"},{label:"source kind",value:G?.sourceKind?Aq(G.sourceKind):"--"},{label:"source node",value:G?.sourceNodeId||"--"},{label:"target node",value:G?.targetNodeId||"--"},{label:"command",value:G?.commandId||G?.eventId||"--"},G?.snapReason?{label:"placement",value:G.snapReason}:null]}),T.length>0?X("div",{className:"pipeline-event-blocks"},T.map((r,Y)=>X("section",{key:`${r.label}-${Y}`,className:"pipeline-event-text-block"},X("b",null,r.label),X("p",null,r.value)))):null,Uq(G?.raw||G)?X("p",{className:"pipeline-text-preview"},Uq(G?.raw||G)):null):null,X(hF,{items:[{label:"epoch",value:j||O?.runId||"--"},{label:"node",value:V?.nodeId||O?.nodeId||G?.nodeId||"--"},{label:"procedure",value:O?.procedureRunId||G?.procedureRunId||$1(E)||"--"},{label:"started",value:z0(O?.startedAt||E?.startedAt)},{label:"finished",value:z0(O?.finishedAt||E?.finishedAt)},{label:"duration",value:l1(O?.durationMs||E?.durationMs)},{label:"fetched",value:C?a5(C):"--"},V?.matchedStep?{label:"matched step",value:`Step ${V.matchedStep.index??V.matchedStepIndex+1}`}:null]}),p?X("div",{className:"form-success"},R?"正在抓取该 node 的 attempt / Trace...":"正在抓取 epoch 执行过程..."):null,X(H0,{error:x}),X("div",{className:"pipeline-gantt-detail-actions"},X(X1,{title:`Procedure ${O?.procedureRunId||G?.procedureRunId||V?.nodeId||"node"}`,data:E,onOpen:l,testId:"raw-pipeline-gantt-procedure"}),G?X(X1,{title:`Pipeline event ${G?.id||G?.commandId||G?.eventId||V?.nodeId||"event"}`,data:G?.raw||G,onOpen:l,testId:"raw-pipeline-gantt-event"}):null,z?X(X1,{title:`Pipeline run ${j||"--"}`,data:z,onOpen:l,testId:"raw-pipeline-gantt-node-details"}):null),!p&&!$1(E)&&!G?X(cu,{title:"暂无过程详情",text:"当前选择还没有可匹配的 procedure 运行记录。"}):null,!p&&$1(E)?X(vT,{procedure:E,matchedStepKey:M,matchedAttemptId:N}):null)}function cT({value:f}){let _=String(f||"--").split(/([_-])/u);return X(fy.default.Fragment,null,_.map((y,l)=>y==="-"||y==="_"?X(fy.default.Fragment,{key:l},y,X("wbr",null)):X(fy.default.Fragment,{key:l},y)))}async function a_(f,u={}){return Df(f,{invalidJsonPrefix:"Pipeline 返回了无效 JSON",...u})}function uy({status:f,children:u}){let _=String(f||"unknown").toLowerCase();return X("span",{className:`status-badge ${_}`},u||f||"unknown")}function Hu({label:f,value:u,hint:_,tone:y}){return X("article",{className:`metric-card ${y||""}`},X("div",{className:"metric-label"},f),X("div",{className:"metric-value"},u),X("div",{className:"metric-hint"},_))}function I1({title:f,eyebrow:u,actions:_,children:y,className:l}){return X("section",{className:`panel ${l||""}`},X("div",{className:"panel-head"},X("div",null,u?X("p",{className:"panel-eyebrow"},u):null,X("h2",null,f)),_?X("div",{className:"panel-actions"},_):null),X("div",{className:"panel-body"},y))}function X1({title:f,data:u,onOpen:_,testId:y}){return X("button",{type:"button",className:"ghost-btn","data-testid":y,onClick:()=>_(f,u)},"查看原始JSON")}function y1({title:f,subtitle:u,facts:_,data:y,onRaw:l,testId:$}){let j=Hf(_).map((J)=>String(J||"")).filter(Boolean);return X("article",{className:"pipeline-evidence-row"},X("div",{className:"pipeline-evidence-main"},X("strong",null,f),u?X("span",null,u):null),X("div",{className:"pipeline-evidence-facts"},j.map((J,F)=>X("span",{key:`${F}-${J.slice(0,16)}`},J))),y!==void 0?X(X1,{title:f,data:y,onOpen:l,testId:$}):null)}function cu({title:f,text:u}){return X("div",{className:"empty-state"},X("strong",null,f),X("span",null,u))}function pT(f){return f?.runtime&&typeof f.runtime==="object"&&!Array.isArray(f.runtime)?f.runtime:{}}function mT(f){return f?.backend&&typeof f.backend==="object"&&!Array.isArray(f.backend)?f.backend:{}}function kT(f){return f?.repository&&typeof f.repository==="object"&&!Array.isArray(f.repository)?f.repository:{}}function iT(f){return{components:Array.isArray(f?.registry?.components)?f.registry.components:[],pipelines:Array.isArray(f?.pipelines)?f.pipelines:[],runs:Array.isArray(f?.runs)?f.runs:[]}}function Wq(f,u,_){let y=f?._unidesk?.arrayLimits?.[u],l=Number(y?.originalLength);return Number.isFinite(l)?l:_}function Cq(f){if(!f||typeof f!=="object"||Array.isArray(f))return"--";return`${f.componentClass||"--"}/${f.id||"--"}`}function g5(f){if(!f||typeof f!=="object"||Array.isArray(f))return"";let u=String(f.componentClass||"").trim(),_=String(f.id||"").trim();return u&&_?`${u}/${_}`:""}function sF(f){return f?.config&&typeof f.config==="object"&&!Array.isArray(f.config)?f.config:{}}function Rq(f){let u=sF(f),_=Array.isArray(u.nodes)?u.nodes:Array.isArray(f?.nodes)?f.nodes:[],y=new Map;for(let j of _){let J=String(j?.id||j?.nodeId||"");if(J)y.set(J,{...j,id:J})}let l=oF(f),$=(j)=>{if(j&&!y.has(j))y.set(j,{id:j})};for(let j of aF(f))w6(j).forEach($);for(let j of l)$(String(j?.from||j?.source||"")),$(String(j?.to||j?.target||""));return Array.from(y.values())}function oF(f){let u=sF(f);return Array.isArray(u.edges)?u.edges:Array.isArray(f?.edges)?f.edges:[]}function aF(f){let u=sF(f);return Array.isArray(u.topologicalBatches)?u.topologicalBatches:Array.isArray(f?.topologicalBatches)?f.topologicalBatches:[]}function gT(f){let u=new Map;for(let _ of f){let y=g5(_);if(y)u.set(y,_);let l=Array.isArray(_?.refs)?_.refs:[];for(let $ of l){let j=g5($);if(j)u.set(j,_)}}return u}function zq(f,u){let _=u.get(g5(f?.componentRef));if(_)return _;let y=g5({componentClass:f?.kind,id:f?.id});return y?u.get(y)||null:null}function Gq(f,u){let _=xq(f,u);return String(_?.status||"pending")}function xq(f,u){return(Array.isArray(f?.nodes)?f.nodes:[]).find((y)=>y?.nodeId===u||y?.id===u)||null}function nT(f){return f.reduce((u,_)=>{let y=String(_?.status||"unknown").toLowerCase();return u[y]=(u[y]||0)+1,u},{})}function tT(f){if(Array.isArray(f?.scorers))return f.scorers.filter(Xf);if(Array.isArray(f?.summary?.scorers))return f.summary.scorers.filter(Xf);if(Array.isArray(f?.artifact?.summary?.scorers))return f.artifact.summary.scorers.filter(Xf);return[]}function sT(f){if(Xf(f?.run))return f.run;if(Xf(f?.runSummary))return f.runSummary;return null}function oT(f,u){if(!Xf(f)&&!Xf(u))return null;if(!Xf(f))return u;if(!Xf(u))return f;return{...f,...u,request:Xf(f.request)||Xf(u.request)?{...Xf(f.request)?f.request:{},...Xf(u.request)?u.request:{}}:u.request??f.request,artifact:Xf(f.artifact)||Xf(u.artifact)?{...Xf(f.artifact)?f.artifact:{},...Xf(u.artifact)?u.artifact:{}}:u.artifact??f.artifact,summary:Xf(f.summary)||Xf(u.summary)?{...Xf(f.summary)?f.summary:{},...Xf(u.summary)?u.summary:{}}:u.summary??f.summary}}function n5(f){let u=tT(f),_=u.find((U)=>Xf(U?.score))||u[0]||null,y=Xf(_?.score)?_.score:{},l=Number(y.passed),$=Number(y.total),j=Number(y.ratio),J=Number.isFinite(j)?j:Number.isFinite(l)&&Number.isFinite($)&&$>0?l/$:null,F=J===null?null:Math.round(Math.max(0,Math.min(100,J<=1?J*100:J))),Q=String(y.text||(Number.isFinite(l)&&Number.isFinite($)?`${l}/${$}`:""));return{scorer:_,scorers:u,score:y,passed:Number.isFinite(l)?l:null,total:Number.isFinite($)?$:null,percent:F,text:Q}}function pF(f){let u=n5(f);return u.text||(u.scorers.length>0?String(u.scorer?.status||"pending"):"--")}function dF(f){let u=n5(f);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 aT(f){return Array.isArray(f?.items)?f.items.filter(Xf):[]}function dT({run:f}){let u=pF(f);return X("span",{className:`pipeline-score-badge ${dF(f)}`},`score ${u}`)}function eT({run:f,onRaw:u}){let y=n5(f).scorers;if(!f)return X(cu,{title:"暂无评分",text:"选择一个 epoch 后会显示 scorer 结果。"});if(y.length===0)return X("div",{className:"pipeline-score-empty"},X("strong",null,"评分器等待中"),X("span",null,"DAG 完成后,Pipeline control backend 会把 scorer summary 追加到 run artifact,并通过 UniDesk 显示。"));return X("div",{className:"pipeline-score-board","data-testid":"pipeline-score-board"},y.map((l,$)=>{let j=n5({scorers:[l]}),J=aT(l),F=j.percent??0;return X("article",{key:`${l.scorerId||l.component||$}`,className:`pipeline-score-card ${dF({scorers:[l]})}`},X("div",{className:"pipeline-score-head"},X("div",null,X("span",null,l.scorerId||l.component||"scorer"),X("strong",null,j.text||l.status||"--")),X(uy,{status:l.status||"unknown"},l.status||"unknown")),X("div",{className:"pipeline-score-meter","aria-label":`score ${F}%`},X("span",{style:{width:`${F}%`}})),X("div",{className:"pipeline-score-facts"},X("span",null,`${F}%`),X("span",null,l.component||"--"),X("span",null,l.applicationCheckoutRef||"--")),J.length>0?X("div",{className:"pipeline-score-items"},J.map((Q)=>X("span",{key:`${Q.id||Q.filter}`,className:`pipeline-score-item ${String(Q.status||"").toLowerCase()}`,title:`${Q.filter||"--"} / ran=${Q.ran??"?"}`},X("b",null,Q.id||"--"),X("small",null,Q.status||"--")))):X("p",{className:"muted paragraph"},"当前 scorer 尚未返回 item 级结果。"),l.error?X("p",{className:"pipeline-score-error"},Tq(l.error,360)):null,X("div",{className:"panel-actions inline-actions"},X(X1,{title:`Scorer ${l.scorerId||$}`,data:l,onOpen:u,testId:"raw-pipeline-score"})))}))}function fM(f){let u=f.reduce((_,y)=>{let l=String(y?.componentClass||"unknown");return _[l]=(_[l]||0)+1,_},{});return Object.entries(u).map(([_,y])=>({name:_,count:Number(y)})).sort((_,y)=>y.count-_.count||_.name.localeCompare(y.name))}function w6(f){if(Array.isArray(f))return f.map((u)=>typeof u==="string"?u:String(u?.id||u?.nodeId||"")).filter(Boolean);if(Array.isArray(f?.nodes))return w6(f.nodes);if(Array.isArray(f?.nodeIds))return w6(f.nodeIds);return[]}function uM(f){return Xf(f?.instanceInputs?.monitor)?f.instanceInputs.monitor:{}}function vq(f,u){if(String(f?.kind||"").toLowerCase()!=="procedure")return!1;let _=uM(f);if(f?.instanceInputs?.monitorMode===!0||_.enabled===!0)return!0;let y=Cq(f?.componentRef);return String(u?.id||u?.config?.id||y||"").toLowerCase().includes("monitor")}function _M(f){return f.filter((u)=>vq(u)).map((u)=>String(u?.id||"")).filter(Boolean)}function yM(f,u){if(u.length===0)return f;let _=new Set(u),y=u.filter((l)=>f.includes(l));if(y.length===0)return f;return[...y,...f.filter((l)=>!_.has(l))]}function lM(f,u){if(u.length===0)return f;let _=new Set(u),y=u.filter(($)=>f.some((j)=>j.includes($)));if(y.length===0)return f;let l=f.map(($)=>$.filter((j)=>!_.has(j))).filter(($)=>$.length>0);return[y,...l]}function $M(f,u,_){let l=aF(f).map(w6).filter((W)=>W.length>0);if(l.length>0)return l;let $=u.map((W)=>String(W?.id||"")).filter(Boolean),j=new Set($),J=new Map($.map((W)=>[W,0])),F=new Map($.map((W)=>[W,[]]));for(let W of _){let K=String(W?.from||W?.source||""),q=String(W?.to||W?.target||"");if(!j.has(K)||!j.has(q))continue;F.get(K)?.push(q),J.set(q,(J.get(q)||0)+1)}let Q=new Map,U=$.filter((W)=>(J.get(W)||0)===0);for(let W of U)Q.set(W,0);while(U.length>0){let W=U.shift(),K=(Q.get(W)||0)+1;for(let q of F.get(W)||[])if(J.set(q,Math.max(0,(J.get(q)||0)-1)),Q.set(q,Math.max(Q.get(q)||0,K)),(J.get(q)||0)===0)U.push(q)}$.forEach((W)=>{if(!Q.has(W))Q.set(W,0)});let z=Math.max(0,...Array.from(Q.values()));return Array.from({length:z+1},(W,K)=>$.filter((q)=>Q.get(q)===K)).filter((W)=>W.length>0)}function jM(f,u,_){let l=aF(f).map(w6).filter((J)=>J.length>0),$=l.length>0?l.flatMap((J)=>J):(()=>{let J=u.map((V)=>String(V?.id||"")).filter(Boolean),F=new Set(J),Q=_.filter((V)=>String(V?.edgeType||"").toLowerCase()!=="rework"),U=new Map(J.map((V)=>[V,0])),z=new Map(J.map((V)=>[V,[]]));for(let V of Q){let O=String(V?.from||V?.source||""),G=String(V?.to||V?.target||"");if(!F.has(O)||!F.has(G))continue;z.get(O)?.push(G),U.set(G,(U.get(G)||0)+1)}let W=new Map,K=J.filter((V)=>(U.get(V)||0)===0);for(let V of K)W.set(V,0);while(K.length>0){let V=K.shift(),O=(W.get(V)||0)+1;for(let G of z.get(V)||[])if(U.set(G,Math.max(0,(U.get(G)||0)-1)),W.set(G,Math.max(W.get(G)||0,O)),(U.get(G)||0)===0)K.push(G)}J.forEach((V)=>{if(!W.has(V))W.set(V,0)});let q=Math.max(0,...Array.from(W.values()));return Array.from({length:q+1},(V,O)=>J.filter((G)=>W.get(G)===O)).flatMap((V)=>V)})(),j=new Set($);for(let J of u){let F=String(J?.id||"");if(!F||j.has(F))continue;$.push(F),j.add(F)}return yM($,_M(u))}function V6(f){return`${f.source}->${f.target}-${f.index}`}function Kq(f,u,_){let y=Rq(f),l=oF(f),$=gT(_),j=new Map(y.map((P)=>[String(P?.id||""),P])),J=y.filter((P)=>vq(P,zq(P,$))).map((P)=>String(P?.id||"")).filter(Boolean),F=lM($M(f,y,l),J),Q=[],U=new Map,z=330,W=122;F.forEach((P,D)=>{let T=P.length*122;P.forEach((S,r)=>{let Y=j.get(S)||{id:S},v=zq(Y,$),m=Gq(u,S).toLowerCase(),c=String(Y.kind||v?.componentClass||"node").toLowerCase(),o=Cq(Y.componentRef||v),ff=String(v?.config?.version||v?.version||""),n=String(v?.config?.description||v?.description||""),lf=r*122-Math.floor(T/2);U.set(S,{column:D,row:r,y:lf}),Q.push({id:S,type:"pipelineNode",position:{x:D*330,y:lf},data:{exportLabel:{id:S,kind:c,componentRef:o,componentVersion:ff,componentDescription:n,status:m},label:X("div",{className:"flow-node-label"},X("strong",null,S),X("span",null,c),X("code",{title:n||o},ff?`${o}@${ff}`:o),X(uy,{status:m},m))},className:`pipeline-flow-node ${c} ${m}`})})});let K=l.flatMap((P,D)=>{let T=String(P?.from||P?.source||""),S=String(P?.to||P?.target||"");if(!j.has(T)||!j.has(S))return[];return[{source:T,target:S,index:D,condition:P?.condition,edgeType:P?.edgeType}]}),q=K.reduce((P,D)=>P.set(D.source,(P.get(D.source)||0)+1),new Map),V=K.reduce((P,D)=>P.set(D.target,(P.get(D.target)||0)+1),new Map),O=K.reduce((P,D)=>{let T=`${D.source}->${D.target}`;return P.set(T,(P.get(T)||0)+1)},new Map),G=new Map,H=new Map,Z=new Map,E=new Map,L=new Map,M=new Map,N=K.reduce((P,D)=>{let T=U.get(D.source),S=U.get(D.target),r=(S?.column||0)-(T?.column||0);if(r<=0||String(D.edgeType||"").toLowerCase()==="rework"||r!==1)return P;let v=`${D.source}->column:${S?.column??""}`,m=P.get(v)||[];return m.push(D),P.set(v,m),P},new Map);for(let P of N.values()){if(P.length<2)continue;P.slice().sort((D,T)=>{let S=U.get(D.target),r=U.get(T.target);return(S?.y||0)-(r?.y||0)||D.index-T.index}).forEach((D,T,S)=>{M.set(V6(D),{slot:T-(S.length-1)/2,count:S.length})})}[...K].sort((P,D)=>{let T=U.get(P.source),S=U.get(P.target),r=U.get(D.source),Y=U.get(D.target),v=Math.abs((S?.column||0)-(T?.column||0))*330+Math.abs((S?.y||0)-(T?.y||0)),m=Math.abs((Y?.column||0)-(r?.column||0))*330+Math.abs((Y?.y||0)-(r?.y||0));return v-m||P.index-D.index}).forEach((P)=>{let D=U.get(P.source)||{column:0,row:0,y:0},T=U.get(P.target)||{column:0,row:0,y:0},S=T.column-D.column,r=Math.max(0,S),Y=S<=0||String(P.edgeType||"").toLowerCase()==="rework",v=D.y-T.y,m=V.get(P.target)||1,c=M.has(V6(P)),o=!Y&&r<=1&&(c||m===1),ff=L.get(P.target)||new Map;L.set(P.target,ff);let n=Y6.slice().sort((lf,Gf)=>{let zf=(Kf)=>{let h=String(Kf.side),g=0;if(Y){if(h==="left")g+=86;if(h==="top")g+=T.y<=0?-22:12;if(h==="bottom")g+=T.y>=0?-22:12;if(Math.abs(T.y)<12&&h!=="left")g+=P.index%2===0?h==="top"?-6:6:h==="bottom"?-6:6;return g}if(o){if(h==="left")g-=c?72:44;if(h!=="left")g+=c?72:44;return g+Math.abs(v)*0.02}if(h==="left")g+=r<=1?0:24;if(h==="top")g+=v<-36?-18:42;if(h==="bottom")g+=v>36?-18:42;if(r<=1&&Math.abs(v)<=82&&h!=="left")g+=38;if(r>1&&h!=="left")g-=10;return g},jf=D.y-T.y,Wf=jf!==0?jf:P.index%2===0?-1:1,Vf=(Kf)=>{let h=ff.get(Kf.id)||0;return zf(Kf)+h*64+LT(Kf,ff,Wf)};return Vf(lf)-Vf(Gf)||String(lf.id).localeCompare(String(Gf.id))})[0];ff.set(n.id,(ff.get(n.id)||0)+1),E.set(V6(P),n)});let R=K.map((P)=>{let D=Gq(u,P.target).toLowerCase(),T=`${P.source}->${P.target}`,S=G.get(P.source)||0,r=H.get(P.target)||0,Y=Z.get(T)||0;G.set(P.source,S+1),H.set(P.target,r+1),Z.set(T,Y+1);let v=S-((q.get(P.source)||1)-1)/2,m=r-((V.get(P.target)||1)-1)/2,c=Y-((O.get(T)||1)-1)/2,o=U.get(P.source),ff=U.get(P.target),n=(ff?.column||0)-(o?.column||0),lf=Math.max(1,Math.abs(n)),Gf=n<=0||String(P.edgeType||"").toLowerCase()==="rework",zf=Math.abs((ff?.y||0)-(o?.y||0)),jf=M.get(V6(P)),Wf=!Gf&&n===1&&(V.get(P.target)||0)>1,Vf=jf?jf.slot:c*2+v+m*0.45,Kf=Vf===0?P.index%2===0?-1:1:Math.sign(Vf),h=E.get(V6(P))||Y6[1],g=h.side==="top"?-1:h.side==="bottom"?1:Kf,I=Gf||lf>1||zf>96||Math.abs(Vf)>0.2||h.side!=="left",yf=Gf?118+lf*18:22+lf*16,$f=h.side==="left"?0:28,Qf=I?Math.max(-280,Math.min(280,g*Math.min(180,yf+$f+zf*0.22)+Vf*28)):0,Yf=Math.max(0,Math.min(O6.length-1,Math.round(v+(O6.length-1)/2))),xf=O6[Yf]||O6[1],tf=D==="succeeded"?"var(--accent-2)":D==="running"?"var(--accent)":D==="failed"?"var(--danger)":"rgba(129, 147, 159, 0.78)",j0=o?.column||0,u0=ff?.column||0,D0=Qf===0?0:Math.sign(Qf),Fu=Gf?`feedback:${j0}->${u0}:${D0}`:jf?`fanout:${j0}->${u0}:${P.source}`:Wf?`fanin:${j0}->${u0}:${P.target}`:h.side!=="left"||lf>1?`corridor:${j0}->${u0}:${h.side}:${D0}:${Math.round(Math.abs(Qf)/56)}`:"";return{id:`${P.source}->${P.target}-${P.index}`,source:P.source,target:P.target,sourceHandle:xf.id,targetHandle:h.id,type:"pipelineCurve",zIndex:12,animated:D==="running",data:{baseEdgeColor:tf,laneOffset:Qf,routeMode:jf&&h.side==="left"?"direct-forward-left":"",targetSide:h.side,isFeedback:Gf,overlapGroup:Fu},targetStatus:D}}),p=R.reduce((P,D)=>{let T=String(D.data?.overlapGroup||"");return T?P.set(T,(P.get(T)||0)+1):P},new Map),x=new Map,C=R.map((P)=>{let D=String(P.targetStatus||"pending"),T={...P};delete T.targetStatus;let S=String(P.data?.overlapGroup||""),r=S?p.get(S)||0:0,Y=r>1?x.get(S)||0:-1;if(r>1)x.set(S,Y+1);let v=Y>=0?_q[Y%_q.length]:String(P.data.baseEdgeColor),m={stroke:v};if(P.data.isFeedback)m.strokeDasharray="9 7";return{...T,data:{...P.data,edgeColor:v,overlapSlot:Y,overlapCount:r},style:m,markerEnd:{type:n_.ArrowClosed,color:v},className:`pipeline-flow-edge ${D} ${P.data.isFeedback?"feedback":""} ${Y>=0?"overlap-colored":""}`}});return{nodes:Q,edges:C}}function wu(f){return String(f??"").replace(/&/g,"&").replace(//g,">").replace(/"/g,""")}function Zq(f){let u=String(f||"");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 t5(f){return`arrow-${f.replace(/[^a-zA-Z0-9_-]+/g,"")}`}function bq(f,u="pipeline"){return String(f||u).replace(/[^a-zA-Z0-9_-]+/g,"-").replace(/^-|-$/g,"")||u}function qq(f,u){let _=f.position.x,y=f.position.y,l=Y6.find(($)=>$.id===u);if(l?.side==="top")return{x:_+Ql*$q(l.style?.left,0.5),y,position:Uf.Top};if(l?.side==="bottom")return{x:_+Ql*$q(l.style?.left,0.5),y:y+Ul,position:Uf.Bottom};return{x:_,y:y+Ul/2,position:Uf.Left}}function JM(f){return{x:f.position.x+Ql,y:f.position.y+Ul/2}}function FM(f,u){let _=Math.min(...f.nodes.map((V)=>V.position.x),0)-220,y=Math.min(...f.nodes.map((V)=>V.position.y),0)-220,l=Math.max(...f.nodes.map((V)=>V.position.x+Ql),1)+220,$=Math.max(...f.nodes.map((V)=>V.position.y+Ul),1)+220,j=Math.ceil(l-_),J=Math.ceil($-y),F=new Map(f.nodes.map((V)=>[V.id,V])),Q=f.edges.map((V)=>Zq(V.data?.edgeColor||V.style?.stroke)),z=Array.from(new Set(["#4eb7a8","#d7a13a","#cf6a54","#81939f",...Q])).map((V)=>``).join(""),W=f.edges.flatMap((V)=>{let O=F.get(V.source),G=F.get(V.target);if(!O||!G)return[];let H=JM(O),Z=qq(G,String(V.targetHandle||"in-left")),E=Bq(H.x,H.y,Z.x,Z.y,Z.position,Number(V.data?.laneOffset||0),String(V.data?.routeMode||"")),L=Zq(V.data?.edgeColor||V.style?.stroke),M=V.data?.isFeedback?' stroke-dasharray="9 7"':"";return``}).join(` -`),K=f.nodes.map((V)=>{let O=V.data?.exportLabel||{},G=String(O.status||"pending").toLowerCase(),H=G==="succeeded"?"#4eb7a8":G==="running"?"#d7a13a":G==="failed"?"#cf6a54":"#81939f",Z=V.position.x,E=V.position.y,L=Y6.map((M)=>{let N=qq(V,M.id);if(M.side==="top"||M.side==="bottom")return``;return``}).join(` +`)),U=A.reduce((z,W)=>z.concat(...W),[]);return[A,U]}return[[],[]]},[f]);return d.useEffect(()=>{let F=u?.target??JZ,A=u?.actInsideInputWithModifier??!0;if(f!==null){let U=(K)=>{if($.current=K.ctrlKey||K.metaKey||K.shiftKey||K.altKey,(!$.current||$.current&&!A)&&ZF(K))return!1;let E=QZ(K.code,J);if(l.current.add(K[E]),FZ(j,l.current,!1)){let O=K.composedPath?.()?.[0]||K.target,G=O?.nodeName==="BUTTON"||O?.nodeName==="A";if(u.preventDefault!==!1&&($.current||!G))K.preventDefault();y(!0)}},z=(K)=>{let q=QZ(K.code,J);if(FZ(j,l.current,!0))y(!1),l.current.clear();else l.current.delete(K[q]);if(K.key==="Meta")l.current.clear();$.current=!1},W=()=>{l.current.clear(),y(!1)};return F?.addEventListener("keydown",U),F?.addEventListener("keyup",z),window.addEventListener("blur",W),window.addEventListener("contextmenu",W),()=>{F?.removeEventListener("keydown",U),F?.removeEventListener("keyup",z),window.removeEventListener("blur",W),window.removeEventListener("contextmenu",W)}}},[f,y]),_}function FZ(f,u,_){return f.filter((y)=>_||y.length===u.size).some((y)=>y.every(($)=>u.has($)))}function QZ(f,u){return u.includes(f)?"code":"key"}var bw=()=>{let f=W0();return d.useMemo(()=>{return{zoomIn:(u)=>{let{panZoom:_}=f.getState();return _?_.scaleBy(1.2,u):Promise.resolve(!1)},zoomOut:(u)=>{let{panZoom:_}=f.getState();return _?_.scaleBy(0.8333333333333334,u):Promise.resolve(!1)},zoomTo:(u,_)=>{let{panZoom:y}=f.getState();return y?y.scaleTo(u,_):Promise.resolve(!1)},getZoom:()=>f.getState().transform[2],setViewport:async(u,_)=>{let{transform:[y,$,l],panZoom:j}=f.getState();if(!j)return Promise.resolve(!1);return await j.setViewport({x:u.x??y,y:u.y??$,zoom:u.zoom??l},_),Promise.resolve(!0)},getViewport:()=>{let[u,_,y]=f.getState().transform;return{x:u,y:_,zoom:y}},setCenter:async(u,_,y)=>{return f.getState().setCenter(u,_,y)},fitBounds:async(u,_)=>{let{width:y,height:$,minZoom:l,maxZoom:j,panZoom:J}=f.getState(),F=ql(u,y,$,l,j,_?.padding??0.1);if(!J)return Promise.resolve(!1);return await J.setViewport(F,{duration:_?.duration,ease:_?.ease,interpolate:_?.interpolate}),Promise.resolve(!0)},screenToFlowPosition:(u,_={})=>{let{transform:y,snapGrid:$,snapToGrid:l,domNode:j}=f.getState();if(!j)return u;let{x:J,y:F}=j.getBoundingClientRect(),A={x:u.x-J,y:u.y-F},U=_.snapGrid??$,z=_.snapToGrid??l;return j$(A,y,z,U)},flowToScreenPosition:(u)=>{let{transform:_,domNode:y}=f.getState();if(!y)return u;let{x:$,y:l}=y.getBoundingClientRect(),j=Kl(u,_);return{x:j.x+$,y:j.y+l}}}},[])};function MZ(f,u){let _=[],y=new Map,$=[];for(let l of f)if(l.type==="add"){$.push(l);continue}else if(l.type==="remove"||l.type==="replace")y.set(l.id,[l]);else{let j=y.get(l.id);if(j)j.push(l);else y.set(l.id,[l])}for(let l of u){let j=y.get(l.id);if(!j){_.push(l);continue}if(j[0].type==="remove")continue;if(j[0].type==="replace"){_.push({...j[0].item});continue}let J={...l};for(let F of j)hw(F,J);_.push(J)}if($.length)$.forEach((l)=>{if(l.index!==void 0)_.splice(l.index,0,{...l.item});else _.push({...l.item})});return _}function hw(f,u){switch(f.type){case"select":{u.selected=f.selected;break}case"position":{if(typeof f.position<"u")u.position=f.position;if(typeof f.dragging<"u")u.dragging=f.dragging;break}case"dimensions":{if(typeof f.dimensions<"u"){if(u.measured={...f.dimensions},f.setAttributes){if(f.setAttributes===!0||f.setAttributes==="width")u.width=f.dimensions.width;if(f.setAttributes===!0||f.setAttributes==="height")u.height=f.dimensions.height}}if(typeof f.resizing==="boolean")u.resizing=f.resizing;break}}}function Iw(f,u){return MZ(f,u)}function cw(f,u){return MZ(f,u)}function ty(f,u){return{id:f,type:"select",selected:u}}function Q$(f,u=new Set,_=!1){let y=[];for(let[$,l]of f){let j=u.has($);if(!(l.selected===void 0&&!j)&&l.selected!==j){if(_)l.selected=j;y.push(ty(l.id,j))}}return y}function AZ({items:f=[],lookup:u}){let _=[],y=new Map(f.map(($)=>[$.id,$]));for(let[$,l]of f.entries()){let j=u.get(l.id),J=j?.internals?.userNode??j;if(J!==void 0&&J!==l)_.push({id:l.id,item:l,type:"replace"});if(J===void 0)_.push({item:l,type:"add",index:$})}for(let[$]of u)if(y.get($)===void 0)_.push({id:$,type:"remove"});return _}function UZ(f){return{id:f.id,type:"remove"}}var WZ=(f)=>GK(f),pw=(f)=>lF(f);function SZ(f){return d.forwardRef(f)}function zZ(f){let[u,_]=d.useState(BigInt(0)),[y]=d.useState(()=>mw(()=>_(($)=>$+BigInt(1))));return TF(()=>{let $=y.get();if($.length)f($),y.reset()},[u]),y}function mw(f){let u=[];return{get:()=>u,reset:()=>{u=[]},push:(_)=>{u.push(_),f()}}}var rZ=d.createContext(null);function kw({children:f}){let u=W0(),_=d.useCallback((J)=>{let{nodes:F=[],setNodes:A,hasDefaultNodes:U,onNodesChange:z,nodeLookup:W,fitViewQueued:K,onNodesChangeMiddlewareMap:q}=u.getState(),E=F;for(let G of J)E=typeof G==="function"?G(E):G;let O=AZ({items:E,lookup:W});for(let G of q.values())O=G(O);if(U)A(E);if(O.length>0)z?.(O);else if(K)window.requestAnimationFrame(()=>{let{fitViewQueued:G,nodes:H,setNodes:Z}=u.getState();if(G)Z(H)})},[]),y=zZ(_),$=d.useCallback((J)=>{let{edges:F=[],setEdges:A,hasDefaultEdges:U,onEdgesChange:z,edgeLookup:W}=u.getState(),K=F;for(let q of J)K=typeof q==="function"?q(K):q;if(U)A(K);else if(z)z(AZ({items:K,lookup:W}))},[]),l=zZ($),j=d.useMemo(()=>({nodeQueue:y,edgeQueue:l}),[]);return o.jsx(rZ.Provider,{value:j,children:f})}function iw(){let f=d.useContext(rZ);if(!f)throw Error("useBatchContext must be used within a BatchProvider");return f}var gw=(f)=>!!f.panZoom;function SF(){let f=bw(),u=W0(),_=iw(),y=mf(gw),$=d.useMemo(()=>{let l=(z)=>u.getState().nodeLookup.get(z),j=(z)=>{_.nodeQueue.push(z)},J=(z)=>{_.edgeQueue.push(z)},F=(z)=>{let{nodeLookup:W,nodeOrigin:K}=u.getState(),q=WZ(z)?z:W.get(z.id),E=q.parentId?zF(q.position,q.measured,q.parentId,W,K):q.position,O={...q,position:E,width:q.measured?.width??q.width,height:q.measured?.height??q.height};return ny(O)},A=(z,W,K={replace:!1})=>{j((q)=>q.map((E)=>{if(E.id===z){let O=typeof W==="function"?W(E):W;return K.replace&&WZ(O)?O:{...E,...O}}return E}))},U=(z,W,K={replace:!1})=>{J((q)=>q.map((E)=>{if(E.id===z){let O=typeof W==="function"?W(E):W;return K.replace&&pw(O)?O:{...E,...O}}return E}))};return{getNodes:()=>u.getState().nodes.map((z)=>({...z})),getNode:(z)=>l(z)?.internals.userNode,getInternalNode:l,getEdges:()=>{let{edges:z=[]}=u.getState();return z.map((W)=>({...W}))},getEdge:(z)=>u.getState().edgeLookup.get(z),setNodes:j,setEdges:J,addNodes:(z)=>{let W=Array.isArray(z)?z:[z];_.nodeQueue.push((K)=>[...K,...W])},addEdges:(z)=>{let W=Array.isArray(z)?z:[z];_.edgeQueue.push((K)=>[...K,...W])},toObject:()=>{let{nodes:z=[],edges:W=[],transform:K}=u.getState(),[q,E,O]=K;return{nodes:z.map((G)=>({...G})),edges:W.map((G)=>({...G})),viewport:{x:q,y:E,zoom:O}}},deleteElements:async({nodes:z=[],edges:W=[]})=>{let{nodes:K,edges:q,onNodesDelete:E,onEdgesDelete:O,triggerNodeChanges:G,triggerEdgeChanges:H,onDelete:Z,onBeforeDelete:V}=u.getState(),{nodes:L,edges:M}=await qK({nodesToRemove:z,edgesToRemove:W,nodes:K,edges:q,onBeforeDelete:V}),N=M.length>0,D=L.length>0;if(N){let x=M.map(UZ);O?.(M),H(x)}if(D){let x=L.map(UZ);E?.(L),G(x)}if(D||N)Z?.({nodes:L,edges:M});return{deletedNodes:L,deletedEdges:M}},getIntersectingNodes:(z,W=!0,K)=>{let q=AF(z),E=q?z:F(z),O=K!==void 0;if(!E)return[];return(K||u.getState().nodes).filter((G)=>{let H=u.getState().nodeLookup.get(G.id);if(H&&!q&&(G.id===z.id||!H.internals.positionAbsolute))return!1;let Z=ny(O?G:H),V=$$(Z,E);return W&&V>0||V>=Z.width*Z.height||V>=E.width*E.height})},isNodeIntersecting:(z,W,K=!0)=>{let E=AF(z)?z:F(z);if(!E)return!1;let O=$$(E,W);return K&&O>0||O>=W.width*W.height||O>=E.width*E.height},updateNode:A,updateNodeData:(z,W,K={replace:!1})=>{A(z,(q)=>{let E=typeof W==="function"?W(q):W;return K.replace?{...q,data:E}:{...q,data:{...q.data,...E}}},K)},updateEdge:U,updateEdgeData:(z,W,K={replace:!1})=>{U(z,(q)=>{let E=typeof W==="function"?W(q):W;return K.replace?{...q,data:E}:{...q,data:{...q.data,...E}}},K)},getNodesBounds:(z)=>{let{nodeLookup:W,nodeOrigin:K}=u.getState();return JF(z,{nodeLookup:W,nodeOrigin:K})},getHandleConnections:({type:z,id:W,nodeId:K})=>Array.from(u.getState().connectionLookup.get(`${K}-${z}${W?`-${W}`:""}`)?.values()??[]),getNodeConnections:({type:z,handleId:W,nodeId:K})=>Array.from(u.getState().connectionLookup.get(`${K}${z?W?`-${z}-${W}`:`-${z}`:""}`)?.values()??[]),fitView:async(z)=>{let W=u.getState().fitViewResolver??VK();return u.setState({fitViewQueued:!0,fitViewOptions:z,fitViewResolver:W}),_.nodeQueue.push((K)=>[...K]),W.promise}}},[]);return d.useMemo(()=>{return{...$,...f,viewportInitialized:y}},[y])}var GZ=(f)=>f.selected,nw=typeof window<"u"?window:void 0;function tw({deleteKeyCode:f,multiSelectionKeyCode:u}){let _=W0(),{deleteElements:y}=SF(),$=El(f,{actInsideInputWithModifier:!1}),l=El(u,{target:nw});d.useEffect(()=>{if($){let{edges:j,nodes:J}=_.getState();y({nodes:J.filter(GZ),edges:j.filter(GZ)}),_.setState({nodesSelectionActive:!1})}},[$]),d.useEffect(()=>{_.setState({multiSelectionActive:l})},[l])}function sw(f){let u=W0();d.useEffect(()=>{let _=()=>{if(!f.current||!(f.current.checkVisibility?.()??!0))return!1;let y=B5(f.current);if(y.height===0||y.width===0)u.getState().onError?.("004",hu.error004());u.setState({width:y.width||500,height:y.height||500})};if(f.current){_(),window.addEventListener("resize",_);let y=new ResizeObserver(()=>_());return y.observe(f.current),()=>{if(window.removeEventListener("resize",_),y&&f.current)y.unobserve(f.current)}}},[])}var c5={position:"absolute",width:"100%",height:"100%",top:0,left:0},ow=(f)=>({userSelectionActive:f.userSelectionActive,lib:f.lib,connectionInProgress:f.connection.inProgress});function aw({onPaneContextMenu:f,zoomOnScroll:u=!0,zoomOnPinch:_=!0,panOnScroll:y=!1,panOnScrollSpeed:$=0.5,panOnScrollMode:l=Q_.Free,zoomOnDoubleClick:j=!0,panOnDrag:J=!0,defaultViewport:F,translateExtent:A,minZoom:U,maxZoom:z,zoomActivationKeyCode:W,preventScrolling:K=!0,children:q,noWheelClassName:E,noPanClassName:O,onViewportChange:G,isControlledViewport:H,paneClickDistance:Z,selectionOnDrag:V}){let L=W0(),M=d.useRef(null),{userSelectionActive:N,lib:D,connectionInProgress:x}=mf(ow,A0),c=El(W),v=d.useRef();sw(M);let C=d.useCallback((P)=>{if(G?.({x:P[0],y:P[1],zoom:P[2]}),!H)L.setState({transform:P})},[G,H]);return d.useEffect(()=>{if(M.current){v.current=IK({domNode:M.current,minZoom:U,maxZoom:z,translateExtent:A,viewport:F,onDraggingChange:(S)=>L.setState((T)=>T.paneDragging===S?T:{paneDragging:S}),onPanZoomStart:(S,T)=>{let{onViewportChangeStart:Y,onMoveStart:R}=L.getState();R?.(S,T),Y?.(T)},onPanZoom:(S,T)=>{let{onViewportChange:Y,onMove:R}=L.getState();R?.(S,T),Y?.(T)},onPanZoomEnd:(S,T)=>{let{onViewportChangeEnd:Y,onMoveEnd:R}=L.getState();R?.(S,T),Y?.(T)}});let{x:P,y:w,zoom:r}=v.current.getViewport();return L.setState({panZoom:v.current,transform:[P,w,r],domNode:M.current.closest(".react-flow")}),()=>{v.current?.destroy()}}},[]),d.useEffect(()=>{v.current?.update({onPaneContextMenu:f,zoomOnScroll:u,zoomOnPinch:_,panOnScroll:y,panOnScrollSpeed:$,panOnScrollMode:l,zoomOnDoubleClick:j,panOnDrag:J,zoomActivationKeyPressed:c,preventScrolling:K,noPanClassName:O,userSelectionActive:N,noWheelClassName:E,lib:D,onTransformChange:C,connectionInProgress:x,selectionOnDrag:V,paneClickDistance:Z})},[f,u,_,y,$,l,j,J,c,K,O,N,E,D,C,x,V,Z]),o.jsx("div",{className:"react-flow__renderer",ref:M,style:c5,children:q})}var dw=(f)=>({userSelectionActive:f.userSelectionActive,userSelectionRect:f.userSelectionRect});function ew(){let{userSelectionActive:f,userSelectionRect:u}=mf(dw,A0);if(!(f&&u))return null;return o.jsx("div",{className:"react-flow__selection react-flow__container",style:{width:u.width,height:u.height,transform:`translate(${u.x}px, ${u.y}px)`}})}var wF=(f,u)=>{return(_)=>{if(_.target!==u.current)return;f?.(_)}},fD=(f)=>({userSelectionActive:f.userSelectionActive,elementsSelectable:f.elementsSelectable,connectionInProgress:f.connection.inProgress,dragging:f.paneDragging});function uD({isSelecting:f,selectionKeyPressed:u,selectionMode:_=iy.Full,panOnDrag:y,paneClickDistance:$,selectionOnDrag:l,onSelectionStart:j,onSelectionEnd:J,onPaneClick:F,onPaneContextMenu:A,onPaneScroll:U,onPaneMouseEnter:z,onPaneMouseMove:W,onPaneMouseLeave:K,children:q}){let E=W0(),{userSelectionActive:O,elementsSelectable:G,dragging:H,connectionInProgress:Z}=mf(fD,A0),V=G&&(f||O),L=d.useRef(null),M=d.useRef(),N=d.useRef(new Set),D=d.useRef(new Set),x=d.useRef(!1),c=(Y)=>{if(x.current||Z){x.current=!1;return}F?.(Y),E.getState().resetSelectedElements(),E.setState({nodesSelectionActive:!1})},v=(Y)=>{if(Array.isArray(y)&&y?.includes(2)){Y.preventDefault();return}A?.(Y)},C=U?(Y)=>U(Y):void 0,P=(Y)=>{if(x.current)Y.stopPropagation(),x.current=!1},w=(Y)=>{let{domNode:R}=E.getState();if(M.current=R?.getBoundingClientRect(),!M.current)return;let m=Y.target===L.current;if(!m&&!!Y.target.closest(".nokey")||!f||!(l&&m||u)||Y.button!==0||!Y.isPrimary)return;Y.target?.setPointerCapture?.(Y.pointerId),x.current=!1;let{x:_f,y:t}=_1(Y.nativeEvent,M.current);if(E.setState({userSelectionRect:{width:0,height:0,startX:_f,startY:t,x:_f,y:t}}),!m)Y.stopPropagation(),Y.preventDefault()},r=(Y)=>{let{userSelectionRect:R,transform:m,nodeLookup:p,edgeLookup:n,connectionLookup:_f,triggerNodeChanges:t,triggerEdgeChanges:ff,defaultEdgeOptions:Gf,resetSelectedElements:zf}=E.getState();if(!M.current||!R)return;let{x:jf,y:Wf}=_1(Y.nativeEvent,M.current),{startX:Vf,startY:Zf}=R;if(!x.current){let lf=u?0:$;if(Math.hypot(jf-Vf,Wf-Zf)<=lf)return;zf(),j?.(Y)}x.current=!0;let h={startX:Vf,startY:Zf,x:jflf.id)),D.current=new Set;let $f=Gf?.selectable??!0;for(let lf of N.current){let Af=_f.get(lf);if(!Af)continue;for(let{edgeId:Yf}of Af.values()){let xf=n.get(Yf);if(xf&&(xf.selectable??$f))D.current.add(Yf)}}if(!GF(g,N.current)){let lf=Q$(p,N.current,!0);t(lf)}if(!GF(I,D.current)){let lf=Q$(n,D.current);ff(lf)}E.setState({userSelectionRect:h,userSelectionActive:!0,nodesSelectionActive:!1})},S=(Y)=>{if(Y.button!==0)return;if(Y.target?.releasePointerCapture?.(Y.pointerId),!O&&Y.target===L.current&&E.getState().userSelectionRect)c?.(Y);if(E.setState({userSelectionActive:!1,userSelectionRect:null}),x.current)J?.(Y),E.setState({nodesSelectionActive:N.current.size>0})},T=y===!0||Array.isArray(y)&&y.includes(0);return o.jsxs("div",{className:Y0(["react-flow__pane",{draggable:T,dragging:H,selection:f}]),onClick:V?void 0:wF(c,L),onContextMenu:wF(v,L),onWheel:wF(C,L),onPointerEnter:V?void 0:z,onPointerMove:V?r:W,onPointerUp:V?S:void 0,onPointerDownCapture:V?w:void 0,onClickCapture:V?P:void 0,onPointerLeave:K,ref:L,style:c5,children:[q,o.jsx(ew,{})]})}function MF({id:f,store:u,unselect:_=!1,nodeRef:y}){let{addSelectedNodes:$,unselectNodesAndEdges:l,multiSelectionActive:j,nodeLookup:J,onError:F}=u.getState(),A=J.get(f);if(!A){F?.("012",hu.error012(f));return}if(u.setState({nodesSelectionActive:!1}),!A.selected)$([f]);else if(_||A.selected&&j)l({nodes:[A],edges:[]}),requestAnimationFrame(()=>y?.current?.blur())}function PZ({nodeRef:f,disabled:u=!1,noDragClassName:_,handleSelector:y,nodeId:$,isSelectable:l,nodeClickDistance:j}){let J=W0(),[F,A]=d.useState(!1),U=d.useRef();return d.useEffect(()=>{U.current=rK({getStoreItems:()=>J.getState(),onNodeMouseDown:(z)=>{MF({id:z,store:J,nodeRef:f})},onDragStart:()=>{A(!0)},onDragStop:()=>{A(!1)}})},[]),d.useEffect(()=>{if(u||!f.current||!U.current)return;return U.current.update({noDragClassName:_,handleSelector:y,domNode:f.current,isSelectable:l,nodeId:$,nodeClickDistance:j}),()=>{U.current?.destroy()}},[_,y,u,l,f,$,j]),F}var _D=(f)=>(u)=>u.selected&&(u.draggable||f&&typeof u.draggable>"u");function CZ(){let f=W0();return d.useCallback((_)=>{let{nodeExtent:y,snapToGrid:$,snapGrid:l,nodesDraggable:j,onError:J,updateNodePositions:F,nodeLookup:A,nodeOrigin:U}=f.getState(),z=new Map,W=_D(j),K=$?l[0]:5,q=$?l[1]:5,E=_.direction.x*K*_.factor,O=_.direction.y*q*_.factor;for(let[,G]of A){if(!W(G))continue;let H={x:G.internals.positionAbsolute.x+E,y:G.internals.positionAbsolute.y+O};if($)H=l$(H,l);let{position:Z,positionAbsolute:V}=FF({nodeId:G.id,nextPosition:H,nodeLookup:A,nodeExtent:y,nodeOrigin:U,onError:J});G.position=Z,G.internals.positionAbsolute=V,z.set(G.id,G)}F(z)},[])}var rF=d.createContext(null),yD=rF.Provider;rF.Consumer;var RZ=()=>{return d.useContext(rF)},$D=(f)=>({connectOnClick:f.connectOnClick,noPanClassName:f.noPanClassName,rfId:f.rfId}),lD=(f,u,_)=>(y)=>{let{connectionClickStartHandle:$,connectionMode:l,connection:j}=y,{fromHandle:J,toHandle:F,isValid:A}=j,U=F?.nodeId===f&&F?.id===u&&F?.type===_;return{connectingFrom:J?.nodeId===f&&J?.id===u&&J?.type===_,connectingTo:U,clickConnecting:$?.nodeId===f&&$?.id===u&&$?.type===_,isPossibleEndHandle:l===g_.Strict?J?.type!==_:f!==J?.nodeId||u!==J?.id,connectionInProcess:!!J,clickConnectionInProcess:!!$,valid:U&&A}};function jD({type:f="source",position:u=Uf.Top,isValidConnection:_,isConnectable:y=!0,isConnectableStart:$=!0,isConnectableEnd:l=!0,id:j,onConnect:J,children:F,className:A,onMouseDown:U,onTouchStart:z,...W},K){let q=j||null,E=f==="target",O=W0(),G=RZ(),{connectOnClick:H,noPanClassName:Z,rfId:V}=mf($D,A0),{connectingFrom:L,connectingTo:M,clickConnecting:N,isPossibleEndHandle:D,connectionInProcess:x,clickConnectionInProcess:c,valid:v}=mf(lD(G,q,f),A0);if(!G)O.getState().onError?.("010",hu.error010());let C=(r)=>{let{defaultEdgeOptions:S,onConnect:T,hasDefaultEdges:Y}=O.getState(),R={...S,...r};if(Y){let{edges:m,setEdges:p}=O.getState();p(EF(R,m))}T?.(R),J?.(R)},P=(r)=>{if(!G)return;let S=qF(r.nativeEvent);if($&&(S&&r.button===0||!S)){let T=O.getState();P5.onPointerDown(r.nativeEvent,{handleDomNode:r.currentTarget,autoPanOnConnect:T.autoPanOnConnect,connectionMode:T.connectionMode,connectionRadius:T.connectionRadius,domNode:T.domNode,nodeLookup:T.nodeLookup,lib:T.lib,isTarget:E,handleId:q,nodeId:G,flowId:T.rfId,panBy:T.panBy,cancelConnection:T.cancelConnection,onConnectStart:T.onConnectStart,onConnectEnd:(...Y)=>O.getState().onConnectEnd?.(...Y),updateConnection:T.updateConnection,onConnect:C,isValidConnection:_||((...Y)=>O.getState().isValidConnection?.(...Y)??!0),getTransform:()=>O.getState().transform,getFromHandle:()=>O.getState().connection.fromHandle,autoPanSpeed:T.autoPanSpeed,dragThreshold:T.connectionDragThreshold})}if(S)U?.(r);else z?.(r)},w=(r)=>{let{onClickConnectStart:S,onClickConnectEnd:T,connectionClickStartHandle:Y,connectionMode:R,isValidConnection:m,lib:p,rfId:n,nodeLookup:_f,connection:t}=O.getState();if(!G||!Y&&!$)return;if(!Y){S?.(r.nativeEvent,{nodeId:G,handleId:q,handleType:f}),O.setState({connectionClickStartHandle:{nodeId:G,type:f,id:q}});return}let ff=KF(r.target),Gf=_||m,{connection:zf,isValid:jf}=P5.isValid(r.nativeEvent,{handle:{nodeId:G,id:q,type:f},connectionMode:R,fromNodeId:Y.nodeId,fromHandleId:Y.id||null,fromType:Y.type,isValidConnection:Gf,flowId:n,doc:ff,lib:p,nodeLookup:_f});if(jf&&zf)C(zf);let Wf=structuredClone(t);delete Wf.inProgress,Wf.toPosition=Wf.toHandle?Wf.toHandle.position:null,T?.(r,Wf),O.setState({connectionClickStartHandle:null})};return o.jsx("div",{"data-handleid":q,"data-nodeid":G,"data-handlepos":u,"data-id":`${V}-${G}-${q}-${f}`,className:Y0(["react-flow__handle",`react-flow__handle-${u}`,"nodrag",Z,A,{source:!E,target:E,connectable:y,connectablestart:$,connectableend:l,clickconnecting:N,connectingfrom:L,connectingto:M,valid:v,connectionindicator:y&&(!x||D)&&(x||c?l:$)}]),onMouseDown:P,onTouchStart:P,onClick:H?w:void 0,ref:K,...W,children:F})}var sy=d.memo(SZ(jD));function JD({data:f,isConnectable:u,sourcePosition:_=Uf.Bottom}){return o.jsxs(o.Fragment,{children:[f?.label,o.jsx(sy,{type:"source",position:_,isConnectable:u})]})}function FD({data:f,isConnectable:u,targetPosition:_=Uf.Top,sourcePosition:y=Uf.Bottom}){return o.jsxs(o.Fragment,{children:[o.jsx(sy,{type:"target",position:_,isConnectable:u}),f?.label,o.jsx(sy,{type:"source",position:y,isConnectable:u})]})}function QD(){return null}function AD({data:f,isConnectable:u,targetPosition:_=Uf.Top}){return o.jsxs(o.Fragment,{children:[o.jsx(sy,{type:"target",position:_,isConnectable:u}),f?.label]})}var b5={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}},KZ={input:JD,default:FD,output:AD,group:QD};function UD(f){if(f.internals.handleBounds===void 0)return{width:f.width??f.initialWidth??f.style?.width,height:f.height??f.initialHeight??f.style?.height};return{width:f.width??f.style?.width,height:f.height??f.style?.height}}var WD=(f)=>{let{width:u,height:_,x:y,y:$}=y$(f.nodeLookup,{filter:(l)=>!!l.selected});return{width:u1(u)?u:null,height:u1(_)?_:null,userSelectionActive:f.userSelectionActive,transformString:`translate(${f.transform[0]}px,${f.transform[1]}px) scale(${f.transform[2]}) translate(${y}px,${$}px)`}};function zD({onSelectionContextMenu:f,noPanClassName:u,disableKeyboardA11y:_}){let y=W0(),{width:$,height:l,transformString:j,userSelectionActive:J}=mf(WD,A0),F=CZ(),A=d.useRef(null);d.useEffect(()=>{if(!_)A.current?.focus({preventScroll:!0})},[_]);let U=!J&&$!==null&&l!==null;if(PZ({nodeRef:A,disabled:!U}),!U)return null;let z=f?(K)=>{let q=y.getState().nodes.filter((E)=>E.selected);f(K,q)}:void 0,W=(K)=>{if(Object.prototype.hasOwnProperty.call(b5,K.key))K.preventDefault(),F({direction:b5[K.key],factor:K.shiftKey?4:1})};return o.jsx("div",{className:Y0(["react-flow__nodesselection","react-flow__container",u]),style:{transform:j},children:o.jsx("div",{ref:A,className:"react-flow__nodesselection-rect",onContextMenu:z,tabIndex:_?void 0:-1,onKeyDown:_?void 0:W,style:{width:$,height:l}})})}var ZZ=typeof window<"u"?window:void 0,GD=(f)=>{return{nodesSelectionActive:f.nodesSelectionActive,userSelectionActive:f.userSelectionActive}};function xZ({children:f,onPaneClick:u,onPaneMouseEnter:_,onPaneMouseMove:y,onPaneMouseLeave:$,onPaneContextMenu:l,onPaneScroll:j,paneClickDistance:J,deleteKeyCode:F,selectionKeyCode:A,selectionOnDrag:U,selectionMode:z,onSelectionStart:W,onSelectionEnd:K,multiSelectionKeyCode:q,panActivationKeyCode:E,zoomActivationKeyCode:O,elementsSelectable:G,zoomOnScroll:H,zoomOnPinch:Z,panOnScroll:V,panOnScrollSpeed:L,panOnScrollMode:M,zoomOnDoubleClick:N,panOnDrag:D,defaultViewport:x,translateExtent:c,minZoom:v,maxZoom:C,preventScrolling:P,onSelectionContextMenu:w,noWheelClassName:r,noPanClassName:S,disableKeyboardA11y:T,onViewportChange:Y,isControlledViewport:R}){let{nodesSelectionActive:m,userSelectionActive:p}=mf(GD,A0),n=El(A,{target:ZZ}),_f=El(E,{target:ZZ}),t=_f||D,ff=_f||V,Gf=U&&t!==!0,zf=n||p||Gf;return tw({deleteKeyCode:F,multiSelectionKeyCode:q}),o.jsx(aw,{onPaneContextMenu:l,elementsSelectable:G,zoomOnScroll:H,zoomOnPinch:Z,panOnScroll:ff,panOnScrollSpeed:L,panOnScrollMode:M,zoomOnDoubleClick:N,panOnDrag:!n&&t,defaultViewport:x,translateExtent:c,minZoom:v,maxZoom:C,zoomActivationKeyCode:O,preventScrolling:P,noWheelClassName:r,noPanClassName:S,onViewportChange:Y,isControlledViewport:R,paneClickDistance:J,selectionOnDrag:Gf,children:o.jsxs(uD,{onSelectionStart:W,onSelectionEnd:K,onPaneClick:u,onPaneMouseEnter:_,onPaneMouseMove:y,onPaneMouseLeave:$,onPaneContextMenu:l,onPaneScroll:j,panOnDrag:t,isSelecting:!!zf,selectionMode:z,selectionKeyPressed:n,paneClickDistance:J,selectionOnDrag:Gf,children:[f,m&&o.jsx(zD,{onSelectionContextMenu:w,noPanClassName:S,disableKeyboardA11y:T})]})})}xZ.displayName="FlowRenderer";var KD=d.memo(xZ),ZD=(f)=>(u)=>{return f?N5(u.nodeLookup,{x:0,y:0,width:u.width,height:u.height},u.transform,!0).map((_)=>_.id):Array.from(u.nodeLookup.keys())};function qD(f){return mf(d.useCallback(ZD(f),[f]),A0)}var HD=(f)=>f.updateNodeInternals;function ED(){let f=mf(HD),[u]=d.useState(()=>{if(typeof ResizeObserver>"u")return null;return new ResizeObserver((_)=>{let y=new Map;_.forEach(($)=>{let l=$.target.getAttribute("data-id");y.set(l,{id:l,nodeElement:$.target,force:!0})}),f(y)})});return d.useEffect(()=>{return()=>{u?.disconnect()}},[u]),u}function VD({node:f,nodeType:u,hasDimensions:_,resizeObserver:y}){let $=W0(),l=d.useRef(null),j=d.useRef(null),J=d.useRef(f.sourcePosition),F=d.useRef(f.targetPosition),A=d.useRef(u),U=_&&!!f.internals.handleBounds;return d.useEffect(()=>{if(l.current&&!f.hidden&&(!U||j.current!==l.current)){if(j.current)y?.unobserve(j.current);y?.observe(l.current),j.current=l.current}},[U,f.hidden]),d.useEffect(()=>{return()=>{if(j.current)y?.unobserve(j.current),j.current=null}},[]),d.useEffect(()=>{if(l.current){let z=A.current!==u,W=J.current!==f.sourcePosition,K=F.current!==f.targetPosition;if(z||W||K)A.current=u,J.current=f.sourcePosition,F.current=f.targetPosition,$.getState().updateNodeInternals(new Map([[f.id,{id:f.id,nodeElement:l.current,force:!0}]]))}},[f.id,u,f.sourcePosition,f.targetPosition]),l}function OD({id:f,onClick:u,onMouseEnter:_,onMouseMove:y,onMouseLeave:$,onContextMenu:l,onDoubleClick:j,nodesDraggable:J,elementsSelectable:F,nodesConnectable:A,nodesFocusable:U,resizeObserver:z,noDragClassName:W,noPanClassName:K,disableKeyboardA11y:q,rfId:E,nodeTypes:O,nodeClickDistance:G,onError:H}){let{node:Z,internals:V,isParent:L}=mf((jf)=>{let Wf=jf.nodeLookup.get(f),Vf=jf.parentLookup.has(f);return{node:Wf,internals:Wf.internals,isParent:Vf}},A0),M=Z.type||"default",N=O?.[M]||KZ[M];if(N===void 0)H?.("003",hu.error003(M)),M="default",N=O?.default||KZ.default;let D=!!(Z.draggable||J&&typeof Z.draggable>"u"),x=!!(Z.selectable||F&&typeof Z.selectable>"u"),c=!!(Z.connectable||A&&typeof Z.connectable>"u"),v=!!(Z.focusable||U&&typeof Z.focusable>"u"),C=W0(),P=WF(Z),w=VD({node:Z,nodeType:M,hasDimensions:P,resizeObserver:z}),r=PZ({nodeRef:w,disabled:Z.hidden||!D,noDragClassName:W,handleSelector:Z.dragHandle,nodeId:f,isSelectable:x,nodeClickDistance:G}),S=CZ();if(Z.hidden)return null;let T=b1(Z),Y=UD(Z),R=x||D||u||_||y||$,m=_?(jf)=>_(jf,{...V.userNode}):void 0,p=y?(jf)=>y(jf,{...V.userNode}):void 0,n=$?(jf)=>$(jf,{...V.userNode}):void 0,_f=l?(jf)=>l(jf,{...V.userNode}):void 0,t=j?(jf)=>j(jf,{...V.userNode}):void 0,ff=(jf)=>{let{selectNodesOnDrag:Wf,nodeDragThreshold:Vf}=C.getState();if(x&&(!Wf||!D||Vf>0))MF({id:f,store:C,nodeRef:w});if(u)u(jf,{...V.userNode})},Gf=(jf)=>{if(ZF(jf.nativeEvent)||q)return;if(uF.includes(jf.key)&&x){let Wf=jf.key==="Escape";MF({id:f,store:C,unselect:Wf,nodeRef:w})}else if(D&&Z.selected&&Object.prototype.hasOwnProperty.call(b5,jf.key)){jf.preventDefault();let{ariaLabelConfig:Wf}=C.getState();C.setState({ariaLiveMessage:Wf["node.a11yDescription.ariaLiveMessage"]({direction:jf.key.replace("Arrow","").toLowerCase(),x:~~V.positionAbsolute.x,y:~~V.positionAbsolute.y})}),S({direction:b5[jf.key],factor:jf.shiftKey?4:1})}},zf=()=>{if(q||!w.current?.matches(":focus-visible"))return;let{transform:jf,width:Wf,height:Vf,autoPanOnNodeFocus:Zf,setCenter:h}=C.getState();if(!Zf)return;if(!(N5(new Map([[f,Z]]),{x:0,y:0,width:Wf,height:Vf},jf,!0).length>0))h(Z.position.x+T.width/2,Z.position.y+T.height/2,{zoom:jf[2]})};return o.jsx("div",{className:Y0(["react-flow__node",`react-flow__node-${M}`,{[K]:D},Z.className,{selected:Z.selected,selectable:x,parent:L,draggable:D,dragging:r}]),ref:w,style:{zIndex:V.z,transform:`translate(${V.positionAbsolute.x}px,${V.positionAbsolute.y}px)`,pointerEvents:R?"all":"none",visibility:P?"visible":"hidden",...Z.style,...Y},"data-id":f,"data-testid":`rf__node-${f}`,onMouseEnter:m,onMouseMove:p,onMouseLeave:n,onContextMenu:_f,onClick:ff,onDoubleClick:t,onKeyDown:v?Gf:void 0,tabIndex:v?0:void 0,onFocus:v?zf:void 0,role:Z.ariaRole??(v?"group":void 0),"aria-roledescription":"node","aria-describedby":q?void 0:`${wZ}-${E}`,"aria-label":Z.ariaLabel,...Z.domAttributes,children:o.jsx(yD,{value:f,children:o.jsx(N,{id:f,data:Z.data,type:M,positionAbsoluteX:V.positionAbsolute.x,positionAbsoluteY:V.positionAbsolute.y,selected:Z.selected??!1,selectable:x,draggable:D,deletable:Z.deletable??!0,isConnectable:c,sourcePosition:Z.sourcePosition,targetPosition:Z.targetPosition,dragging:r,dragHandle:Z.dragHandle,zIndex:V.z,parentId:Z.parentId,...T})})})}var XD=d.memo(OD),ND=(f)=>({nodesDraggable:f.nodesDraggable,nodesConnectable:f.nodesConnectable,nodesFocusable:f.nodesFocusable,elementsSelectable:f.elementsSelectable,onError:f.onError});function vZ(f){let{nodesDraggable:u,nodesConnectable:_,nodesFocusable:y,elementsSelectable:$,onError:l}=mf(ND,A0),j=qD(f.onlyRenderVisibleElements),J=ED();return o.jsx("div",{className:"react-flow__nodes",style:c5,children:j.map((F)=>{return o.jsx(XD,{id:F,nodeTypes:f.nodeTypes,nodeExtent:f.nodeExtent,onClick:f.onNodeClick,onMouseEnter:f.onNodeMouseEnter,onMouseMove:f.onNodeMouseMove,onMouseLeave:f.onNodeMouseLeave,onContextMenu:f.onNodeContextMenu,onDoubleClick:f.onNodeDoubleClick,noDragClassName:f.noDragClassName,noPanClassName:f.noPanClassName,rfId:f.rfId,disableKeyboardA11y:f.disableKeyboardA11y,resizeObserver:J,nodesDraggable:u,nodesConnectable:_,nodesFocusable:y,elementsSelectable:$,nodeClickDistance:f.nodeClickDistance,onError:l},F)})})}vZ.displayName="NodeRenderer";var LD=d.memo(vZ);function YD(f){return mf(d.useCallback((_)=>{if(!f)return _.edges.map(($)=>$.id);let y=[];if(_.width&&_.height)for(let $ of _.edges){let l=_.nodeLookup.get($.source),j=_.nodeLookup.get($.target);if(l&&j&&NK({sourceNode:l,targetNode:j,width:_.width,height:_.height,transform:_.transform}))y.push($.id)}return y},[f]),A0)}var BD=({color:f="none",strokeWidth:u=1})=>{let _={strokeWidth:u,...f&&{stroke:f}};return o.jsx("polyline",{className:"arrow",style:_,strokeLinecap:"round",fill:"none",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4"})},wD=({color:f="none",strokeWidth:u=1})=>{let _={strokeWidth:u,...f&&{stroke:f,fill:f}};return o.jsx("polyline",{className:"arrowclosed",style:_,strokeLinecap:"round",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4 -5,-4"})},qZ={[n_.Arrow]:BD,[n_.ArrowClosed]:wD};function DD(f){let u=W0();return d.useMemo(()=>{if(!Object.prototype.hasOwnProperty.call(qZ,f))return u.getState().onError?.("009",hu.error009(f)),null;return qZ[f]},[f])}var TD=({id:f,type:u,color:_,width:y=12.5,height:$=12.5,markerUnits:l="strokeWidth",strokeWidth:j,orient:J="auto-start-reverse"})=>{let F=DD(u);if(!F)return null;return o.jsx("marker",{className:"react-flow__arrowhead",id:f,markerWidth:`${y}`,markerHeight:`${$}`,viewBox:"-10 -10 20 20",markerUnits:l,orient:J,refX:"0",refY:"0",children:o.jsx(F,{color:_,strokeWidth:j})})},bZ=({defaultColor:f,rfId:u})=>{let _=mf((l)=>l.edges),y=mf((l)=>l.defaultEdgeOptions),$=d.useMemo(()=>{return YK(_,{id:u,defaultColor:f,defaultMarkerStart:y?.markerStart,defaultMarkerEnd:y?.markerEnd})},[_,y,u,f]);if(!$.length)return null;return o.jsx("svg",{className:"react-flow__marker","aria-hidden":"true",children:o.jsx("defs",{children:$.map((l)=>o.jsx(TD,{id:l.id,type:l.type,color:l.color,width:l.width,height:l.height,markerUnits:l.markerUnits,strokeWidth:l.strokeWidth,orient:l.orient},l.id))})})};bZ.displayName="MarkerDefinitions";var MD=d.memo(bZ);function hZ({x:f,y:u,label:_,labelStyle:y,labelShowBg:$=!0,labelBgStyle:l,labelBgPadding:j=[2,4],labelBgBorderRadius:J=2,children:F,className:A,...U}){let[z,W]=d.useState({x:1,y:0,width:0,height:0}),K=Y0(["react-flow__edge-textwrapper",A]),q=d.useRef(null);if(d.useEffect(()=>{if(q.current){let E=q.current.getBBox();W({x:E.x,y:E.y,width:E.width,height:E.height})}},[_]),!_)return null;return o.jsxs("g",{transform:`translate(${f-z.width/2} ${u-z.height/2})`,className:K,visibility:z.width?"visible":"hidden",...U,children:[$&&o.jsx("rect",{width:z.width+2*j[0],x:-j[0],y:-j[1],height:z.height+2*j[1],className:"react-flow__edge-textbg",style:l,rx:J,ry:J}),o.jsx("text",{className:"react-flow__edge-text",y:z.height/2,dy:"0.3em",ref:q,style:y,children:_}),F]})}hZ.displayName="EdgeText";var SD=d.memo(hZ);function A$({path:f,labelX:u,labelY:_,label:y,labelStyle:$,labelShowBg:l,labelBgStyle:j,labelBgPadding:J,labelBgBorderRadius:F,interactionWidth:A=20,...U}){return o.jsxs(o.Fragment,{children:[o.jsx("path",{...U,d:f,fill:"none",className:Y0(["react-flow__edge-path",U.className])}),A?o.jsx("path",{d:f,fill:"none",strokeOpacity:0,strokeWidth:A,className:"react-flow__edge-interaction"}):null,y&&u1(u)&&u1(_)?o.jsx(SD,{x:u,y:_,label:y,labelStyle:$,labelShowBg:l,labelBgStyle:j,labelBgPadding:J,labelBgBorderRadius:F}):null]})}function HZ({pos:f,x1:u,y1:_,x2:y,y2:$}){if(f===Uf.Left||f===Uf.Right)return[0.5*(u+y),_];return[u,0.5*(_+$)]}function IZ({sourceX:f,sourceY:u,sourcePosition:_=Uf.Bottom,targetX:y,targetY:$,targetPosition:l=Uf.Top}){let[j,J]=HZ({pos:_,x1:f,y1:u,x2:y,y2:$}),[F,A]=HZ({pos:l,x1:y,y1:$,x2:f,y2:u}),[U,z,W,K]=w5({sourceX:f,sourceY:u,targetX:y,targetY:$,sourceControlX:j,sourceControlY:J,targetControlX:F,targetControlY:A});return[`M${f},${u} C${j},${J} ${F},${A} ${y},${$}`,U,z,W,K]}function cZ(f){return d.memo(({id:u,sourceX:_,sourceY:y,targetX:$,targetY:l,sourcePosition:j,targetPosition:J,label:F,labelStyle:A,labelShowBg:U,labelBgStyle:z,labelBgPadding:W,labelBgBorderRadius:K,style:q,markerEnd:E,markerStart:O,interactionWidth:G})=>{let[H,Z,V]=IZ({sourceX:_,sourceY:y,sourcePosition:j,targetX:$,targetY:l,targetPosition:J}),L=f.isInternal?void 0:u;return o.jsx(A$,{id:L,path:H,labelX:Z,labelY:V,label:F,labelStyle:A,labelShowBg:U,labelBgStyle:z,labelBgPadding:W,labelBgBorderRadius:K,style:q,markerEnd:E,markerStart:O,interactionWidth:G})})}var rD=cZ({isInternal:!1}),pZ=cZ({isInternal:!0});rD.displayName="SimpleBezierEdge";pZ.displayName="SimpleBezierEdgeInternal";function mZ(f){return d.memo(({id:u,sourceX:_,sourceY:y,targetX:$,targetY:l,label:j,labelStyle:J,labelShowBg:F,labelBgStyle:A,labelBgPadding:U,labelBgBorderRadius:z,style:W,sourcePosition:K=Uf.Bottom,targetPosition:q=Uf.Top,markerEnd:E,markerStart:O,pathOptions:G,interactionWidth:H})=>{let[Z,V,L]=Hl({sourceX:_,sourceY:y,sourcePosition:K,targetX:$,targetY:l,targetPosition:q,borderRadius:G?.borderRadius,offset:G?.offset,stepPosition:G?.stepPosition}),M=f.isInternal?void 0:u;return o.jsx(A$,{id:M,path:Z,labelX:V,labelY:L,label:j,labelStyle:J,labelShowBg:F,labelBgStyle:A,labelBgPadding:U,labelBgBorderRadius:z,style:W,markerEnd:E,markerStart:O,interactionWidth:H})})}var kZ=mZ({isInternal:!1}),iZ=mZ({isInternal:!0});kZ.displayName="SmoothStepEdge";iZ.displayName="SmoothStepEdgeInternal";function gZ(f){return d.memo(({id:u,..._})=>{let y=f.isInternal?void 0:u;return o.jsx(kZ,{..._,id:y,pathOptions:d.useMemo(()=>({borderRadius:0,offset:_.pathOptions?.offset}),[_.pathOptions?.offset])})})}var PD=gZ({isInternal:!1}),nZ=gZ({isInternal:!0});PD.displayName="StepEdge";nZ.displayName="StepEdgeInternal";function tZ(f){return d.memo(({id:u,sourceX:_,sourceY:y,targetX:$,targetY:l,label:j,labelStyle:J,labelShowBg:F,labelBgStyle:A,labelBgPadding:U,labelBgBorderRadius:z,style:W,markerEnd:K,markerStart:q,interactionWidth:E})=>{let[O,G,H]=T5({sourceX:_,sourceY:y,targetX:$,targetY:l}),Z=f.isInternal?void 0:u;return o.jsx(A$,{id:Z,path:O,labelX:G,labelY:H,label:j,labelStyle:J,labelShowBg:F,labelBgStyle:A,labelBgPadding:U,labelBgBorderRadius:z,style:W,markerEnd:K,markerStart:q,interactionWidth:E})})}var CD=tZ({isInternal:!1}),sZ=tZ({isInternal:!0});CD.displayName="StraightEdge";sZ.displayName="StraightEdgeInternal";function oZ(f){return d.memo(({id:u,sourceX:_,sourceY:y,targetX:$,targetY:l,sourcePosition:j=Uf.Bottom,targetPosition:J=Uf.Top,label:F,labelStyle:A,labelShowBg:U,labelBgStyle:z,labelBgPadding:W,labelBgBorderRadius:K,style:q,markerEnd:E,markerStart:O,pathOptions:G,interactionWidth:H})=>{let[Z,V,L]=D5({sourceX:_,sourceY:y,sourcePosition:j,targetX:$,targetY:l,targetPosition:J,curvature:G?.curvature}),M=f.isInternal?void 0:u;return o.jsx(A$,{id:M,path:Z,labelX:V,labelY:L,label:F,labelStyle:A,labelShowBg:U,labelBgStyle:z,labelBgPadding:W,labelBgBorderRadius:K,style:q,markerEnd:E,markerStart:O,interactionWidth:H})})}var RD=oZ({isInternal:!1}),aZ=oZ({isInternal:!0});RD.displayName="BezierEdge";aZ.displayName="BezierEdgeInternal";var EZ={default:aZ,straight:sZ,step:nZ,smoothstep:iZ,simplebezier:pZ},VZ={sourceX:null,sourceY:null,targetX:null,targetY:null,sourcePosition:null,targetPosition:null},xD=(f,u,_)=>{if(_===Uf.Left)return f-u;if(_===Uf.Right)return f+u;return f},vD=(f,u,_)=>{if(_===Uf.Top)return f-u;if(_===Uf.Bottom)return f+u;return f},OZ="react-flow__edgeupdater";function XZ({position:f,centerX:u,centerY:_,radius:y=10,onMouseDown:$,onMouseEnter:l,onMouseOut:j,type:J}){return o.jsx("circle",{onMouseDown:$,onMouseEnter:l,onMouseOut:j,className:Y0([OZ,`${OZ}-${J}`]),cx:xD(u,y,f),cy:vD(_,y,f),r:y,stroke:"transparent",fill:"transparent"})}function bD({isReconnectable:f,reconnectRadius:u,edge:_,sourceX:y,sourceY:$,targetX:l,targetY:j,sourcePosition:J,targetPosition:F,onReconnect:A,onReconnectStart:U,onReconnectEnd:z,setReconnecting:W,setUpdateHover:K}){let q=W0(),E=(V,L)=>{if(V.button!==0)return;let{autoPanOnConnect:M,domNode:N,connectionMode:D,connectionRadius:x,lib:c,onConnectStart:v,cancelConnection:C,nodeLookup:P,rfId:w,panBy:r,updateConnection:S}=q.getState(),T=L.type==="target",Y=(p,n)=>{W(!1),z?.(p,_,L.type,n)},R=(p)=>A?.(_,p),m=(p,n)=>{W(!0),U?.(V,_,L.type),v?.(p,n)};P5.onPointerDown(V.nativeEvent,{autoPanOnConnect:M,connectionMode:D,connectionRadius:x,domNode:N,handleId:L.id,nodeId:L.nodeId,nodeLookup:P,isTarget:T,edgeUpdaterType:L.type,lib:c,flowId:w,cancelConnection:C,panBy:r,isValidConnection:(...p)=>q.getState().isValidConnection?.(...p)??!0,onConnect:R,onConnectStart:m,onConnectEnd:(...p)=>q.getState().onConnectEnd?.(...p),onReconnectEnd:Y,updateConnection:S,getTransform:()=>q.getState().transform,getFromHandle:()=>q.getState().connection.fromHandle,dragThreshold:q.getState().connectionDragThreshold,handleDomNode:V.currentTarget})},O=(V)=>E(V,{nodeId:_.target,id:_.targetHandle??null,type:"target"}),G=(V)=>E(V,{nodeId:_.source,id:_.sourceHandle??null,type:"source"}),H=()=>K(!0),Z=()=>K(!1);return o.jsxs(o.Fragment,{children:[(f===!0||f==="source")&&o.jsx(XZ,{position:J,centerX:y,centerY:$,radius:u,onMouseDown:O,onMouseEnter:H,onMouseOut:Z,type:"source"}),(f===!0||f==="target")&&o.jsx(XZ,{position:F,centerX:l,centerY:j,radius:u,onMouseDown:G,onMouseEnter:H,onMouseOut:Z,type:"target"})]})}function hD({id:f,edgesFocusable:u,edgesReconnectable:_,elementsSelectable:y,onClick:$,onDoubleClick:l,onContextMenu:j,onMouseEnter:J,onMouseMove:F,onMouseLeave:A,reconnectRadius:U,onReconnect:z,onReconnectStart:W,onReconnectEnd:K,rfId:q,edgeTypes:E,noPanClassName:O,onError:G,disableKeyboardA11y:H}){let Z=mf((h)=>h.edgeLookup.get(f)),V=mf((h)=>h.defaultEdgeOptions);Z=V?{...V,...Z}:Z;let L=Z.type||"default",M=E?.[L]||EZ[L];if(M===void 0)G?.("011",hu.error011(L)),L="default",M=E?.default||EZ.default;let N=!!(Z.focusable||u&&typeof Z.focusable>"u"),D=typeof z<"u"&&(Z.reconnectable||_&&typeof Z.reconnectable>"u"),x=!!(Z.selectable||y&&typeof Z.selectable>"u"),c=d.useRef(null),[v,C]=d.useState(!1),[P,w]=d.useState(!1),r=W0(),{zIndex:S,sourceX:T,sourceY:Y,targetX:R,targetY:m,sourcePosition:p,targetPosition:n}=mf(d.useCallback((h)=>{let g=h.nodeLookup.get(Z.source),I=h.nodeLookup.get(Z.target);if(!g||!I)return{zIndex:Z.zIndex,...VZ};let $f=LK({id:f,sourceNode:g,targetNode:I,sourceHandle:Z.sourceHandle||null,targetHandle:Z.targetHandle||null,connectionMode:h.connectionMode,onError:G});return{zIndex:XK({selected:Z.selected,zIndex:Z.zIndex,sourceNode:g,targetNode:I,elevateOnSelect:h.elevateEdgesOnSelect,zIndexMode:h.zIndexMode}),...$f||VZ}},[Z.source,Z.target,Z.sourceHandle,Z.targetHandle,Z.selected,Z.zIndex]),A0),_f=d.useMemo(()=>Z.markerStart?`url('#${M5(Z.markerStart,q)}')`:void 0,[Z.markerStart,q]),t=d.useMemo(()=>Z.markerEnd?`url('#${M5(Z.markerEnd,q)}')`:void 0,[Z.markerEnd,q]);if(Z.hidden||T===null||Y===null||R===null||m===null)return null;let ff=(h)=>{let{addSelectedEdges:g,unselectNodesAndEdges:I,multiSelectionActive:$f}=r.getState();if(x)if(r.setState({nodesSelectionActive:!1}),Z.selected&&$f)I({nodes:[],edges:[Z]}),c.current?.blur();else g([f]);if($)$(h,Z)},Gf=l?(h)=>{l(h,{...Z})}:void 0,zf=j?(h)=>{j(h,{...Z})}:void 0,jf=J?(h)=>{J(h,{...Z})}:void 0,Wf=F?(h)=>{F(h,{...Z})}:void 0,Vf=A?(h)=>{A(h,{...Z})}:void 0,Zf=(h)=>{if(!H&&uF.includes(h.key)&&x){let{unselectNodesAndEdges:g,addSelectedEdges:I}=r.getState();if(h.key==="Escape")c.current?.blur(),g({edges:[Z]});else I([f])}};return o.jsx("svg",{style:{zIndex:S},children:o.jsxs("g",{className:Y0(["react-flow__edge",`react-flow__edge-${L}`,Z.className,O,{selected:Z.selected,animated:Z.animated,inactive:!x&&!$,updating:v,selectable:x}]),onClick:ff,onDoubleClick:Gf,onContextMenu:zf,onMouseEnter:jf,onMouseMove:Wf,onMouseLeave:Vf,onKeyDown:N?Zf:void 0,tabIndex:N?0:void 0,role:Z.ariaRole??(N?"group":"img"),"aria-roledescription":"edge","data-id":f,"data-testid":`rf__edge-${f}`,"aria-label":Z.ariaLabel===null?void 0:Z.ariaLabel||`Edge from ${Z.source} to ${Z.target}`,"aria-describedby":N?`${DZ}-${q}`:void 0,ref:c,...Z.domAttributes,children:[!P&&o.jsx(M,{id:f,source:Z.source,target:Z.target,type:Z.type,selected:Z.selected,animated:Z.animated,selectable:x,deletable:Z.deletable??!0,label:Z.label,labelStyle:Z.labelStyle,labelShowBg:Z.labelShowBg,labelBgStyle:Z.labelBgStyle,labelBgPadding:Z.labelBgPadding,labelBgBorderRadius:Z.labelBgBorderRadius,sourceX:T,sourceY:Y,targetX:R,targetY:m,sourcePosition:p,targetPosition:n,data:Z.data,style:Z.style,sourceHandleId:Z.sourceHandle,targetHandleId:Z.targetHandle,markerStart:_f,markerEnd:t,pathOptions:"pathOptions"in Z?Z.pathOptions:void 0,interactionWidth:Z.interactionWidth}),D&&o.jsx(bD,{edge:Z,isReconnectable:D,reconnectRadius:U,onReconnect:z,onReconnectStart:W,onReconnectEnd:K,sourceX:T,sourceY:Y,targetX:R,targetY:m,sourcePosition:p,targetPosition:n,setUpdateHover:C,setReconnecting:w})]})})}var ID=d.memo(hD),cD=(f)=>({edgesFocusable:f.edgesFocusable,edgesReconnectable:f.edgesReconnectable,elementsSelectable:f.elementsSelectable,connectionMode:f.connectionMode,onError:f.onError});function dZ({defaultMarkerColor:f,onlyRenderVisibleElements:u,rfId:_,edgeTypes:y,noPanClassName:$,onReconnect:l,onEdgeContextMenu:j,onEdgeMouseEnter:J,onEdgeMouseMove:F,onEdgeMouseLeave:A,onEdgeClick:U,reconnectRadius:z,onEdgeDoubleClick:W,onReconnectStart:K,onReconnectEnd:q,disableKeyboardA11y:E}){let{edgesFocusable:O,edgesReconnectable:G,elementsSelectable:H,onError:Z}=mf(cD,A0),V=YD(u);return o.jsxs("div",{className:"react-flow__edges",children:[o.jsx(MD,{defaultColor:f,rfId:_}),V.map((L)=>{return o.jsx(ID,{id:L,edgesFocusable:O,edgesReconnectable:G,elementsSelectable:H,noPanClassName:$,onReconnect:l,onContextMenu:j,onMouseEnter:J,onMouseMove:F,onMouseLeave:A,onClick:U,reconnectRadius:z,onDoubleClick:W,onReconnectStart:K,onReconnectEnd:q,rfId:_,onError:Z,edgeTypes:y,disableKeyboardA11y:E},L)})]})}dZ.displayName="EdgeRenderer";var pD=d.memo(dZ),mD=(f)=>`translate(${f.transform[0]}px,${f.transform[1]}px) scale(${f.transform[2]})`;function kD({children:f}){let u=mf(mD);return o.jsx("div",{className:"react-flow__viewport xyflow__viewport react-flow__container",style:{transform:u},children:f})}function iD(f){let u=SF(),_=d.useRef(!1);d.useEffect(()=>{if(!_.current&&u.viewportInitialized&&f)setTimeout(()=>f(u),1),_.current=!0},[f,u.viewportInitialized])}var gD=(f)=>f.panZoom?.syncViewport;function nD(f){let u=mf(gD),_=W0();return d.useEffect(()=>{if(f)u?.(f),_.setState({transform:[f.x,f.y,f.zoom]})},[f,u]),null}function NZ(f){return f.connection.inProgress?{...f.connection,to:j$(f.connection.to,f.transform)}:{...f.connection}}function tD(f){if(f)return(_)=>{let y=NZ(_);return f(y)};return NZ}function sD(f){let u=tD(f);return mf(u,A0)}var oD=(f)=>({nodesConnectable:f.nodesConnectable,isValid:f.connection.isValid,inProgress:f.connection.inProgress,width:f.width,height:f.height});function aD({containerStyle:f,style:u,type:_,component:y}){let{nodesConnectable:$,width:l,height:j,isValid:J,inProgress:F}=mf(oD,A0);if(!(l&&$&&F))return null;return o.jsx("svg",{style:f,width:l,height:j,className:"react-flow__connectionline react-flow__container",children:o.jsx("g",{className:Y0(["react-flow__connection",$F(J)]),children:o.jsx(eZ,{style:u,type:_,CustomComponent:y,isValid:J})})})}var eZ=({style:f,type:u=v1.Bezier,CustomComponent:_,isValid:y})=>{let{inProgress:$,from:l,fromNode:j,fromHandle:J,fromPosition:F,to:A,toNode:U,toHandle:z,toPosition:W,pointer:K}=sD();if(!$)return;if(_)return o.jsx(_,{connectionLineType:u,connectionLineStyle:f,fromNode:j,fromHandle:J,fromX:l.x,fromY:l.y,toX:A.x,toY:A.y,fromPosition:F,toPosition:W,connectionStatus:$F(y),toNode:U,toHandle:z,pointer:K});let q="",E={sourceX:l.x,sourceY:l.y,sourcePosition:F,targetX:A.x,targetY:A.y,targetPosition:W};switch(u){case v1.Bezier:[q]=D5(E);break;case v1.SimpleBezier:[q]=IZ(E);break;case v1.Step:[q]=Hl({...E,borderRadius:0});break;case v1.SmoothStep:[q]=Hl(E);break;default:[q]=T5(E)}return o.jsx("path",{d:q,fill:"none",className:"react-flow__connection-path",style:f})};eZ.displayName="ConnectionLine";var dD={};function LZ(f=dD){let u=d.useRef(f),_=W0();d.useEffect(()=>{},[f])}function eD(){let f=W0(),u=d.useRef(!1);d.useEffect(()=>{},[])}function fq({nodeTypes:f,edgeTypes:u,onInit:_,onNodeClick:y,onEdgeClick:$,onNodeDoubleClick:l,onEdgeDoubleClick:j,onNodeMouseEnter:J,onNodeMouseMove:F,onNodeMouseLeave:A,onNodeContextMenu:U,onSelectionContextMenu:z,onSelectionStart:W,onSelectionEnd:K,connectionLineType:q,connectionLineStyle:E,connectionLineComponent:O,connectionLineContainerStyle:G,selectionKeyCode:H,selectionOnDrag:Z,selectionMode:V,multiSelectionKeyCode:L,panActivationKeyCode:M,zoomActivationKeyCode:N,deleteKeyCode:D,onlyRenderVisibleElements:x,elementsSelectable:c,defaultViewport:v,translateExtent:C,minZoom:P,maxZoom:w,preventScrolling:r,defaultMarkerColor:S,zoomOnScroll:T,zoomOnPinch:Y,panOnScroll:R,panOnScrollSpeed:m,panOnScrollMode:p,zoomOnDoubleClick:n,panOnDrag:_f,onPaneClick:t,onPaneMouseEnter:ff,onPaneMouseMove:Gf,onPaneMouseLeave:zf,onPaneScroll:jf,onPaneContextMenu:Wf,paneClickDistance:Vf,nodeClickDistance:Zf,onEdgeContextMenu:h,onEdgeMouseEnter:g,onEdgeMouseMove:I,onEdgeMouseLeave:$f,reconnectRadius:lf,onReconnect:Af,onReconnectStart:Yf,onReconnectEnd:xf,noDragClassName:sf,noWheelClassName:j0,noPanClassName:u0,disableKeyboardA11y:D0,nodeExtent:Fu,rfId:O0,viewport:x0,onViewportChange:ku}){return LZ(f),LZ(u),eD(),iD(_),nD(x0),o.jsx(KD,{onPaneClick:t,onPaneMouseEnter:ff,onPaneMouseMove:Gf,onPaneMouseLeave:zf,onPaneContextMenu:Wf,onPaneScroll:jf,paneClickDistance:Vf,deleteKeyCode:D,selectionKeyCode:H,selectionOnDrag:Z,selectionMode:V,onSelectionStart:W,onSelectionEnd:K,multiSelectionKeyCode:L,panActivationKeyCode:M,zoomActivationKeyCode:N,elementsSelectable:c,zoomOnScroll:T,zoomOnPinch:Y,zoomOnDoubleClick:n,panOnScroll:R,panOnScrollSpeed:m,panOnScrollMode:p,panOnDrag:_f,defaultViewport:v,translateExtent:C,minZoom:P,maxZoom:w,onSelectionContextMenu:z,preventScrolling:r,noDragClassName:sf,noWheelClassName:j0,noPanClassName:u0,disableKeyboardA11y:D0,onViewportChange:ku,isControlledViewport:!!x0,children:o.jsxs(kD,{children:[o.jsx(pD,{edgeTypes:u,onEdgeClick:$,onEdgeDoubleClick:j,onReconnect:Af,onReconnectStart:Yf,onReconnectEnd:xf,onlyRenderVisibleElements:x,onEdgeContextMenu:h,onEdgeMouseEnter:g,onEdgeMouseMove:I,onEdgeMouseLeave:$f,reconnectRadius:lf,defaultMarkerColor:S,noPanClassName:u0,disableKeyboardA11y:D0,rfId:O0}),o.jsx(aD,{style:E,type:q,component:O,containerStyle:G}),o.jsx("div",{className:"react-flow__edgelabel-renderer"}),o.jsx(LD,{nodeTypes:f,onNodeClick:y,onNodeDoubleClick:l,onNodeMouseEnter:J,onNodeMouseMove:F,onNodeMouseLeave:A,onNodeContextMenu:U,nodeClickDistance:Zf,onlyRenderVisibleElements:x,noPanClassName:u0,noDragClassName:sf,disableKeyboardA11y:D0,nodeExtent:Fu,rfId:O0}),o.jsx("div",{className:"react-flow__viewport-portal"})]})})}fq.displayName="GraphView";var fT=d.memo(fq),YZ=({nodes:f,edges:u,defaultNodes:_,defaultEdges:y,width:$,height:l,fitView:j,fitViewOptions:J,minZoom:F=0.5,maxZoom:A=2,nodeOrigin:U,nodeExtent:z,zIndexMode:W="basic"}={})=>{let K=new Map,q=new Map,E=new Map,O=new Map,G=y??u??[],H=_??f??[],Z=U??[0,0],V=z??_$;LF(E,O,G);let{nodesInitialized:L}=S5(H,K,q,{nodeOrigin:Z,nodeExtent:V,zIndexMode:W}),M=[0,0,1];if(j&&$&&l){let N=y$(K,{filter:(v)=>!!((v.width||v.initialWidth)&&(v.height||v.initialHeight))}),{x:D,y:x,zoom:c}=ql(N,$,l,F,A,J?.padding??0.1);M=[D,x,c]}return{rfId:"1",width:$??0,height:l??0,transform:M,nodes:H,nodesInitialized:L,nodeLookup:K,parentLookup:q,edges:G,edgeLookup:O,connectionLookup:E,onNodesChange:null,onEdgesChange:null,hasDefaultNodes:_!==void 0,hasDefaultEdges:y!==void 0,panZoom:null,minZoom:F,maxZoom:A,translateExtent:_$,nodeExtent:V,nodesSelectionActive:!1,userSelectionActive:!1,userSelectionRect:null,connectionMode:g_.Strict,domNode:null,paneDragging:!1,noPanClassName:"nopan",nodeOrigin:Z,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:j??!1,fitViewOptions:J,fitViewResolver:null,connection:{...yF},connectionClickStartHandle:null,connectOnClick:!0,ariaLiveMessage:"",autoPanOnConnect:!0,autoPanOnNodeDrag:!0,autoPanOnNodeFocus:!0,autoPanSpeed:15,connectionRadius:20,onError:UF,isValidConnection:void 0,onSelectionChangeHandlers:[],lib:"react",debug:!1,ariaLabelConfig:_F,zIndexMode:W,onNodesChangeMiddlewareMap:new Map,onEdgesChangeMiddlewareMap:new Map}},uT=({nodes:f,edges:u,defaultNodes:_,defaultEdges:y,width:$,height:l,fitView:j,fitViewOptions:J,minZoom:F,maxZoom:A,nodeOrigin:U,nodeExtent:z,zIndexMode:W})=>_Z((K,q)=>{async function E(){let{nodeLookup:O,panZoom:G,fitViewOptions:H,fitViewResolver:Z,width:V,height:L,minZoom:M,maxZoom:N}=q();if(!G)return;await ZK({nodes:O,width:V,height:L,panZoom:G,minZoom:M,maxZoom:N},H),Z?.resolve(!0),K({fitViewResolver:null})}return{...YZ({nodes:f,edges:u,width:$,height:l,fitView:j,fitViewOptions:J,minZoom:F,maxZoom:A,nodeOrigin:U,nodeExtent:z,defaultNodes:_,defaultEdges:y,zIndexMode:W}),setNodes:(O)=>{let{nodeLookup:G,parentLookup:H,nodeOrigin:Z,elevateNodesOnSelect:V,fitViewQueued:L,zIndexMode:M,nodesSelectionActive:N}=q(),{nodesInitialized:D,hasSelectedNodes:x}=S5(O,G,H,{nodeOrigin:Z,nodeExtent:z,elevateNodesOnSelect:V,checkEquality:!0,zIndexMode:M}),c=N&&x;if(L&&D)E(),K({nodes:O,nodesInitialized:D,fitViewQueued:!1,fitViewOptions:void 0,nodesSelectionActive:c});else K({nodes:O,nodesInitialized:D,nodesSelectionActive:c})},setEdges:(O)=>{let{connectionLookup:G,edgeLookup:H}=q();LF(G,H,O),K({edges:O})},setDefaultNodesAndEdges:(O,G)=>{if(O){let{setNodes:H}=q();H(O),K({hasDefaultNodes:!0})}if(G){let{setEdges:H}=q();H(G),K({hasDefaultEdges:!0})}},updateNodeInternals:(O)=>{let{triggerNodeChanges:G,nodeLookup:H,parentLookup:Z,domNode:V,nodeOrigin:L,nodeExtent:M,debug:N,fitViewQueued:D,zIndexMode:x}=q(),{changes:c,updatedInternals:v}=TK(O,H,Z,V,L,M,x);if(!v)return;if(wK(H,Z,{nodeOrigin:L,nodeExtent:M,zIndexMode:x}),D)E(),K({fitViewQueued:!1,fitViewOptions:void 0});else K({});if(c?.length>0){if(N)console.log("React Flow: trigger node changes",c);G?.(c)}},updateNodePositions:(O,G=!1)=>{let H=[],Z=[],{nodeLookup:V,triggerNodeChanges:L,connection:M,updateConnection:N,onNodesChangeMiddlewareMap:D}=q();for(let[x,c]of O){let v=V.get(x),C=!!(v?.expandParent&&v?.parentId&&c?.position),P={id:x,type:"position",position:C?{x:Math.max(0,c.position.x),y:Math.max(0,c.position.y)}:c.position,dragging:G};if(v&&M.inProgress&&M.fromNode.id===v.id){let w=t_(v,M.fromHandle,Uf.Left,!0);N({...M,from:w})}if(C&&v.parentId)H.push({id:x,parentId:v.parentId,rect:{...c.internals.positionAbsolute,width:c.measured.width??0,height:c.measured.height??0}});Z.push(P)}if(H.length>0){let{parentLookup:x,nodeOrigin:c}=q(),v=r5(H,V,x,c);Z.push(...v)}for(let x of D.values())Z=x(Z);L(Z)},triggerNodeChanges:(O)=>{let{onNodesChange:G,setNodes:H,nodes:Z,hasDefaultNodes:V,debug:L}=q();if(O?.length){if(V){let M=Iw(O,Z);H(M)}if(L)console.log("React Flow: trigger node changes",O);G?.(O)}},triggerEdgeChanges:(O)=>{let{onEdgesChange:G,setEdges:H,edges:Z,hasDefaultEdges:V,debug:L}=q();if(O?.length){if(V){let M=cw(O,Z);H(M)}if(L)console.log("React Flow: trigger edge changes",O);G?.(O)}},addSelectedNodes:(O)=>{let{multiSelectionActive:G,edgeLookup:H,nodeLookup:Z,triggerNodeChanges:V,triggerEdgeChanges:L}=q();if(G){let M=O.map((N)=>ty(N,!0));V(M);return}V(Q$(Z,new Set([...O]),!0)),L(Q$(H))},addSelectedEdges:(O)=>{let{multiSelectionActive:G,edgeLookup:H,nodeLookup:Z,triggerNodeChanges:V,triggerEdgeChanges:L}=q();if(G){let M=O.map((N)=>ty(N,!0));L(M);return}L(Q$(H,new Set([...O]))),V(Q$(Z,new Set,!0))},unselectNodesAndEdges:({nodes:O,edges:G}={})=>{let{edges:H,nodes:Z,nodeLookup:V,triggerNodeChanges:L,triggerEdgeChanges:M}=q(),N=O?O:Z,D=G?G:H,x=[];for(let v of N){if(!v.selected)continue;let C=V.get(v.id);if(C)C.selected=!1;x.push(ty(v.id,!1))}let c=[];for(let v of D){if(!v.selected)continue;c.push(ty(v.id,!1))}L(x),M(c)},setMinZoom:(O)=>{let{panZoom:G,maxZoom:H}=q();G?.setScaleExtent([O,H]),K({minZoom:O})},setMaxZoom:(O)=>{let{panZoom:G,minZoom:H}=q();G?.setScaleExtent([H,O]),K({maxZoom:O})},setTranslateExtent:(O)=>{q().panZoom?.setTranslateExtent(O),K({translateExtent:O})},resetSelectedElements:()=>{let{edges:O,nodes:G,triggerNodeChanges:H,triggerEdgeChanges:Z,elementsSelectable:V}=q();if(!V)return;let L=G.reduce((N,D)=>D.selected?[...N,ty(D.id,!1)]:N,[]),M=O.reduce((N,D)=>D.selected?[...N,ty(D.id,!1)]:N,[]);H(L),Z(M)},setNodeExtent:(O)=>{let{nodes:G,nodeLookup:H,parentLookup:Z,nodeOrigin:V,elevateNodesOnSelect:L,nodeExtent:M,zIndexMode:N}=q();if(O[0][0]===M[0][0]&&O[0][1]===M[0][1]&&O[1][0]===M[1][0]&&O[1][1]===M[1][1])return;S5(G,H,Z,{nodeOrigin:V,nodeExtent:O,elevateNodesOnSelect:L,checkEquality:!1,zIndexMode:N}),K({nodeExtent:O})},panBy:(O)=>{let{transform:G,width:H,height:Z,panZoom:V,translateExtent:L}=q();return MK({delta:O,panZoom:V,transform:G,translateExtent:L,width:H,height:Z})},setCenter:async(O,G,H)=>{let{width:Z,height:V,maxZoom:L,panZoom:M}=q();if(!M)return Promise.resolve(!1);let N=typeof H?.zoom<"u"?H.zoom:L;return await M.setViewport({x:Z/2-O*N,y:V/2-G*N,zoom:N},{duration:H?.duration,ease:H?.ease,interpolate:H?.interpolate}),Promise.resolve(!0)},cancelConnection:()=>{K({connection:{...yF}})},updateConnection:(O)=>{K({connection:O})},reset:()=>K({...YZ()})}},Object.is);function _T({initialNodes:f,initialEdges:u,defaultNodes:_,defaultEdges:y,initialWidth:$,initialHeight:l,initialMinZoom:j,initialMaxZoom:J,initialFitViewOptions:F,fitView:A,nodeOrigin:U,nodeExtent:z,zIndexMode:W,children:K}){let[q]=d.useState(()=>uT({nodes:f,edges:u,defaultNodes:_,defaultEdges:y,width:$,height:l,fitView:A,minZoom:j,maxZoom:J,fitViewOptions:F,nodeOrigin:U,nodeExtent:z,zIndexMode:W}));return o.jsx(Vw,{value:q,children:o.jsx(kw,{children:K})})}function yT({children:f,nodes:u,edges:_,defaultNodes:y,defaultEdges:$,width:l,height:j,fitView:J,fitViewOptions:F,minZoom:A,maxZoom:U,nodeOrigin:z,nodeExtent:W,zIndexMode:K}){if(d.useContext(h5))return o.jsx(o.Fragment,{children:f});return o.jsx(_T,{initialNodes:u,initialEdges:_,defaultNodes:y,defaultEdges:$,initialWidth:l,initialHeight:j,fitView:J,initialFitViewOptions:F,initialMinZoom:A,initialMaxZoom:U,nodeOrigin:z,nodeExtent:W,zIndexMode:K,children:f})}var $T={width:"100%",height:"100%",overflow:"hidden",position:"relative",zIndex:0};function lT({nodes:f,edges:u,defaultNodes:_,defaultEdges:y,className:$,nodeTypes:l,edgeTypes:j,onNodeClick:J,onEdgeClick:F,onInit:A,onMove:U,onMoveStart:z,onMoveEnd:W,onConnect:K,onConnectStart:q,onConnectEnd:E,onClickConnectStart:O,onClickConnectEnd:G,onNodeMouseEnter:H,onNodeMouseMove:Z,onNodeMouseLeave:V,onNodeContextMenu:L,onNodeDoubleClick:M,onNodeDragStart:N,onNodeDrag:D,onNodeDragStop:x,onNodesDelete:c,onEdgesDelete:v,onDelete:C,onSelectionChange:P,onSelectionDragStart:w,onSelectionDrag:r,onSelectionDragStop:S,onSelectionContextMenu:T,onSelectionStart:Y,onSelectionEnd:R,onBeforeDelete:m,connectionMode:p,connectionLineType:n=v1.Bezier,connectionLineStyle:_f,connectionLineComponent:t,connectionLineContainerStyle:ff,deleteKeyCode:Gf="Backspace",selectionKeyCode:zf="Shift",selectionOnDrag:jf=!1,selectionMode:Wf=iy.Full,panActivationKeyCode:Vf="Space",multiSelectionKeyCode:Zf=J$()?"Meta":"Control",zoomActivationKeyCode:h=J$()?"Meta":"Control",snapToGrid:g,snapGrid:I,onlyRenderVisibleElements:$f=!1,selectNodesOnDrag:lf,nodesDraggable:Af,autoPanOnNodeFocus:Yf,nodesConnectable:xf,nodesFocusable:sf,nodeOrigin:j0=TZ,edgesFocusable:u0,edgesReconnectable:D0,elementsSelectable:Fu=!0,defaultViewport:O0=Pw,minZoom:x0=0.5,maxZoom:ku=2,translateExtent:X0=_$,preventScrolling:Qu=!0,nodeExtent:uf,defaultMarkerColor:vf="#b1b1b7",zoomOnScroll:a0=!0,zoomOnPinch:Bf=!0,panOnScroll:v0=!1,panOnScrollSpeed:i0=0.5,panOnScrollMode:d0=Q_.Free,zoomOnDoubleClick:b0=!0,panOnDrag:m1=!0,onPaneClick:ef,onPaneMouseEnter:iu,onPaneMouseMove:f3,onPaneMouseLeave:u3,onPaneScroll:s,onPaneContextMenu:Of,paneClickDistance:qf=1,nodeClickDistance:Cf=0,children:_0,onReconnect:G0,onReconnectStart:If,onReconnectEnd:h0,onEdgeContextMenu:Au,onEdgeDoubleClick:xl,onEdgeMouseEnter:L1,onEdgeMouseMove:vl,onEdgeMouseLeave:_3,reconnectRadius:y3=10,onNodesChange:ly,onEdgesChange:W_,noDragClassName:bl="nodrag",noWheelClassName:Z2="nowheel",noPanClassName:hl="nopan",fitView:k1,fitViewOptions:jy,connectOnClick:Il,attributionPosition:q2,proOptions:V$,defaultEdgeOptions:O$,elevateNodesOnSelect:j1=!0,elevateEdgesOnSelect:Jy=!1,disableKeyboardA11y:X$=!1,autoPanOnConnect:H2,autoPanOnNodeDrag:cl,autoPanSpeed:N$,connectionRadius:E2,isValidConnection:V2,onError:i1,style:pl,id:L$,nodeDragThreshold:Y1,connectionDragThreshold:Y$,viewport:ml,onViewportChange:O2,width:X2,height:ZQ,colorMode:gu="light",debug:kl,onScroll:il,ariaLabelConfig:Tu,zIndexMode:$3="basic",...B$},w$){let D$=L$||"1",N2=vw(gu),L2=d.useCallback((gl)=>{gl.currentTarget.scrollTo({top:0,left:0,behavior:"instant"}),il?.(gl)},[il]);return o.jsx("div",{"data-testid":"rf__wrapper",...B$,onScroll:L2,style:{...pl,...$T},ref:w$,className:Y0(["react-flow",$,N2]),id:L$,role:"application",children:o.jsxs(yT,{nodes:f,edges:u,width:X2,height:ZQ,fitView:k1,fitViewOptions:jy,minZoom:x0,maxZoom:ku,nodeOrigin:j0,nodeExtent:uf,zIndexMode:$3,children:[o.jsx(xw,{nodes:f,edges:u,defaultNodes:_,defaultEdges:y,onConnect:K,onConnectStart:q,onConnectEnd:E,onClickConnectStart:O,onClickConnectEnd:G,nodesDraggable:Af,autoPanOnNodeFocus:Yf,nodesConnectable:xf,nodesFocusable:sf,edgesFocusable:u0,edgesReconnectable:D0,elementsSelectable:Fu,elevateNodesOnSelect:j1,elevateEdgesOnSelect:Jy,minZoom:x0,maxZoom:ku,nodeExtent:uf,onNodesChange:ly,onEdgesChange:W_,snapToGrid:g,snapGrid:I,connectionMode:p,translateExtent:X0,connectOnClick:Il,defaultEdgeOptions:O$,fitView:k1,fitViewOptions:jy,onNodesDelete:c,onEdgesDelete:v,onDelete:C,onNodeDragStart:N,onNodeDrag:D,onNodeDragStop:x,onSelectionDrag:r,onSelectionDragStart:w,onSelectionDragStop:S,onMove:U,onMoveStart:z,onMoveEnd:W,noPanClassName:hl,nodeOrigin:j0,rfId:D$,autoPanOnConnect:H2,autoPanOnNodeDrag:cl,autoPanSpeed:N$,onError:i1,connectionRadius:E2,isValidConnection:V2,selectNodesOnDrag:lf,nodeDragThreshold:Y1,connectionDragThreshold:Y$,onBeforeDelete:m,debug:kl,ariaLabelConfig:Tu,zIndexMode:$3}),o.jsx(fT,{onInit:A,onNodeClick:J,onEdgeClick:F,onNodeMouseEnter:H,onNodeMouseMove:Z,onNodeMouseLeave:V,onNodeContextMenu:L,onNodeDoubleClick:M,nodeTypes:l,edgeTypes:j,connectionLineType:n,connectionLineStyle:_f,connectionLineComponent:t,connectionLineContainerStyle:ff,selectionKeyCode:zf,selectionOnDrag:jf,selectionMode:Wf,deleteKeyCode:Gf,multiSelectionKeyCode:Zf,panActivationKeyCode:Vf,zoomActivationKeyCode:h,onlyRenderVisibleElements:$f,defaultViewport:O0,translateExtent:X0,minZoom:x0,maxZoom:ku,preventScrolling:Qu,zoomOnScroll:a0,zoomOnPinch:Bf,zoomOnDoubleClick:b0,panOnScroll:v0,panOnScrollSpeed:i0,panOnScrollMode:d0,panOnDrag:m1,onPaneClick:ef,onPaneMouseEnter:iu,onPaneMouseMove:f3,onPaneMouseLeave:u3,onPaneScroll:s,onPaneContextMenu:Of,paneClickDistance:qf,nodeClickDistance:Cf,onSelectionContextMenu:T,onSelectionStart:Y,onSelectionEnd:R,onReconnect:G0,onReconnectStart:If,onReconnectEnd:h0,onEdgeContextMenu:Au,onEdgeDoubleClick:xl,onEdgeMouseEnter:L1,onEdgeMouseMove:vl,onEdgeMouseLeave:_3,reconnectRadius:y3,defaultMarkerColor:vf,noDragClassName:bl,noWheelClassName:Z2,noPanClassName:hl,rfId:D$,disableKeyboardA11y:X$,nodeExtent:uf,viewport:ml,onViewportChange:O2}),o.jsx(rw,{onSelectionChange:P}),_0,o.jsx(ww,{proOptions:V$,position:q2}),o.jsx(Bw,{rfId:D$,disableKeyboardA11y:X$})]})})}var uq=SZ(lT);var db=hu.error014();function jT({dimensions:f,lineWidth:u,variant:_,className:y}){return o.jsx("path",{strokeWidth:u,d:`M${f[0]/2} 0 V${f[1]} M0 ${f[1]/2} H${f[0]}`,className:Y0(["react-flow__background-pattern",_,y])})}function JT({radius:f,className:u}){return o.jsx("circle",{cx:f,cy:f,r:f,className:Y0(["react-flow__background-pattern","dots",u])})}var o_;(function(f){f.Lines="lines",f.Dots="dots",f.Cross="cross"})(o_||(o_={}));var FT={[o_.Dots]:1,[o_.Lines]:1,[o_.Cross]:6},QT=(f)=>({transform:f.transform,patternId:`pattern-${f.rfId}`});function _q({id:f,variant:u=o_.Dots,gap:_=20,size:y,lineWidth:$=1,offset:l=0,color:j,bgColor:J,style:F,className:A,patternClassName:U}){let z=d.useRef(null),{transform:W,patternId:K}=mf(QT,A0),q=y||FT[u],E=u===o_.Dots,O=u===o_.Cross,G=Array.isArray(_)?_:[_,_],H=[G[0]*W[2]||1,G[1]*W[2]||1],Z=q*W[2],V=Array.isArray(l)?l:[l,l],L=O?[Z,Z]:H,M=[V[0]*W[2]||1+L[0]/2,V[1]*W[2]||1+L[1]/2],N=`${K}${f?f:""}`;return o.jsxs("svg",{className:Y0(["react-flow__background",A]),style:{...F,...c5,"--xy-background-color-props":J,"--xy-background-pattern-color-props":j},ref:z,"data-testid":"rf__background",children:[o.jsx("pattern",{id:N,x:W[0]%H[0],y:W[1]%H[1],width:H[0],height:H[1],patternUnits:"userSpaceOnUse",patternTransform:`translate(-${M[0]},-${M[1]})`,children:E?o.jsx(JT,{radius:Z/2,className:U}):o.jsx(jT,{dimensions:L,lineWidth:$,variant:u,className:U})}),o.jsx("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:`url(#${N})`})]})}_q.displayName="Background";var yq=d.memo(_q);function AT(){return o.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",children:o.jsx("path",{d:"M32 18.133H18.133V32h-4.266V18.133H0v-4.266h13.867V0h4.266v13.867H32z"})})}function UT(){return o.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 5",children:o.jsx("path",{d:"M0 0h32v4.2H0z"})})}function WT(){return o.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 30",children:o.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 zT(){return o.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:o.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 GT(){return o.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:o.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 v5({children:f,className:u,..._}){return o.jsx("button",{type:"button",className:Y0(["react-flow__controls-button",u]),..._,children:f})}var KT=(f)=>({isInteractive:f.nodesDraggable||f.nodesConnectable||f.elementsSelectable,minZoomReached:f.transform[2]<=f.minZoom,maxZoomReached:f.transform[2]>=f.maxZoom,ariaLabelConfig:f.ariaLabelConfig});function $q({style:f,showZoom:u=!0,showFitView:_=!0,showInteractive:y=!0,fitViewOptions:$,onZoomIn:l,onZoomOut:j,onFitView:J,onInteractiveChange:F,className:A,children:U,position:z="bottom-left",orientation:W="vertical","aria-label":K}){let q=W0(),{isInteractive:E,minZoomReached:O,maxZoomReached:G,ariaLabelConfig:H}=mf(KT,A0),{zoomIn:Z,zoomOut:V,fitView:L}=SF(),M=()=>{Z(),l?.()},N=()=>{V(),j?.()},D=()=>{L($),J?.()},x=()=>{q.setState({nodesDraggable:!E,nodesConnectable:!E,elementsSelectable:!E}),F?.(!E)};return o.jsxs(I5,{className:Y0(["react-flow__controls",W==="horizontal"?"horizontal":"vertical",A]),position:z,style:f,"data-testid":"rf__controls","aria-label":K??H["controls.ariaLabel"],children:[u&&o.jsxs(o.Fragment,{children:[o.jsx(v5,{onClick:M,className:"react-flow__controls-zoomin",title:H["controls.zoomIn.ariaLabel"],"aria-label":H["controls.zoomIn.ariaLabel"],disabled:G,children:o.jsx(AT,{})}),o.jsx(v5,{onClick:N,className:"react-flow__controls-zoomout",title:H["controls.zoomOut.ariaLabel"],"aria-label":H["controls.zoomOut.ariaLabel"],disabled:O,children:o.jsx(UT,{})})]}),_&&o.jsx(v5,{className:"react-flow__controls-fitview",onClick:D,title:H["controls.fitView.ariaLabel"],"aria-label":H["controls.fitView.ariaLabel"],children:o.jsx(WT,{})}),y&&o.jsx(v5,{className:"react-flow__controls-interactive",onClick:x,title:H["controls.interactive.ariaLabel"],"aria-label":H["controls.interactive.ariaLabel"],children:E?o.jsx(GT,{}):o.jsx(zT,{})}),U]})}$q.displayName="Controls";var lq=d.memo($q);function ZT({id:f,x:u,y:_,width:y,height:$,style:l,color:j,strokeColor:J,strokeWidth:F,className:A,borderRadius:U,shapeRendering:z,selected:W,onClick:K}){let{background:q,backgroundColor:E}=l||{},O=j||q||E;return o.jsx("rect",{className:Y0(["react-flow__minimap-node",{selected:W},A]),x:u,y:_,rx:U,ry:U,width:y,height:$,style:{fill:O,stroke:J,strokeWidth:F},shapeRendering:z,onClick:K?(G)=>K(G,f):void 0})}var qT=d.memo(ZT),HT=(f)=>f.nodes.map((u)=>u.id),DF=(f)=>f instanceof Function?f:()=>f;function ET({nodeStrokeColor:f,nodeColor:u,nodeClassName:_="",nodeBorderRadius:y=5,nodeStrokeWidth:$,nodeComponent:l=qT,onClick:j}){let J=mf(HT,A0),F=DF(u),A=DF(f),U=DF(_),z=typeof window>"u"||!!window.chrome?"crispEdges":"geometricPrecision";return o.jsx(o.Fragment,{children:J.map((W)=>o.jsx(OT,{id:W,nodeColorFunc:F,nodeStrokeColorFunc:A,nodeClassNameFunc:U,nodeBorderRadius:y,nodeStrokeWidth:$,NodeComponent:l,onClick:j,shapeRendering:z},W))})}function VT({id:f,nodeColorFunc:u,nodeStrokeColorFunc:_,nodeClassNameFunc:y,nodeBorderRadius:$,nodeStrokeWidth:l,shapeRendering:j,NodeComponent:J,onClick:F}){let{node:A,x:U,y:z,width:W,height:K}=mf((q)=>{let E=q.nodeLookup.get(f);if(!E)return{node:void 0,x:0,y:0,width:0,height:0};let O=E.internals.userNode,{x:G,y:H}=E.internals.positionAbsolute,{width:Z,height:V}=b1(O);return{node:O,x:G,y:H,width:Z,height:V}},A0);if(!A||A.hidden||!WF(A))return null;return o.jsx(J,{x:U,y:z,width:W,height:K,style:A.style,selected:!!A.selected,className:y(A),color:u(A),borderRadius:$,strokeColor:_(A),strokeWidth:l,shapeRendering:j,onClick:F,id:A.id})}var OT=d.memo(VT),XT=d.memo(ET),NT=200,LT=150,YT=(f)=>!f.hidden,BT=(f)=>{let u={x:-f.transform[0]/f.transform[2],y:-f.transform[1]/f.transform[2],width:f.width/f.transform[2],height:f.height/f.transform[2]};return{viewBB:u,boundingRect:f.nodeLookup.size>0?QF(y$(f.nodeLookup,{filter:YT}),u):u,rfId:f.rfId,panZoom:f.panZoom,translateExtent:f.translateExtent,flowWidth:f.width,flowHeight:f.height,ariaLabelConfig:f.ariaLabelConfig}},wT="react-flow__minimap-desc";function jq({style:f,className:u,nodeStrokeColor:_,nodeColor:y,nodeClassName:$="",nodeBorderRadius:l=5,nodeStrokeWidth:j,nodeComponent:J,bgColor:F,maskColor:A,maskStrokeColor:U,maskStrokeWidth:z,position:W="bottom-right",onClick:K,onNodeClick:q,pannable:E=!1,zoomable:O=!1,ariaLabel:G,inversePan:H,zoomStep:Z=1,offsetScale:V=5}){let L=W0(),M=d.useRef(null),{boundingRect:N,viewBB:D,rfId:x,panZoom:c,translateExtent:v,flowWidth:C,flowHeight:P,ariaLabelConfig:w}=mf(BT,A0),r=f?.width??NT,S=f?.height??LT,T=N.width/r,Y=N.height/S,R=Math.max(T,Y),m=R*r,p=R*S,n=V*R,_f=N.x-(m-N.width)/2-n,t=N.y-(p-N.height)/2-n,ff=m+n*2,Gf=p+n*2,zf=`${wT}-${x}`,jf=d.useRef(0),Wf=d.useRef();jf.current=R,d.useEffect(()=>{if(M.current&&c)return Wf.current=vK({domNode:M.current,panZoom:c,getTransform:()=>L.getState().transform,getViewScale:()=>jf.current}),()=>{Wf.current?.destroy()}},[c]),d.useEffect(()=>{Wf.current?.update({translateExtent:v,width:C,height:P,inversePan:H,pannable:E,zoomStep:Z,zoomable:O})},[E,O,H,Z,v,C,P]);let Vf=K?(g)=>{let[I,$f]=Wf.current?.pointer(g)||[0,0];K(g,{x:I,y:$f})}:void 0,Zf=q?d.useCallback((g,I)=>{let $f=L.getState().nodeLookup.get(I).internals.userNode;q(g,$f)},[]):void 0,h=G??w["minimap.ariaLabel"];return o.jsx(I5,{position:W,style:{...f,"--xy-minimap-background-color-props":typeof F==="string"?F:void 0,"--xy-minimap-mask-background-color-props":typeof A==="string"?A:void 0,"--xy-minimap-mask-stroke-color-props":typeof U==="string"?U:void 0,"--xy-minimap-mask-stroke-width-props":typeof z==="number"?z*R:void 0,"--xy-minimap-node-background-color-props":typeof y==="string"?y:void 0,"--xy-minimap-node-stroke-color-props":typeof _==="string"?_:void 0,"--xy-minimap-node-stroke-width-props":typeof j==="number"?j:void 0},className:Y0(["react-flow__minimap",u]),"data-testid":"rf__minimap",children:o.jsxs("svg",{width:r,height:S,viewBox:`${_f} ${t} ${ff} ${Gf}`,className:"react-flow__minimap-svg",role:"img","aria-labelledby":zf,ref:M,onClick:Vf,children:[h&&o.jsx("title",{id:zf,children:h}),o.jsx(XT,{onClick:Zf,nodeColor:y,nodeStrokeColor:_,nodeBorderRadius:l,nodeClassName:$,nodeStrokeWidth:j,nodeComponent:J}),o.jsx("path",{className:"react-flow__minimap-mask",d:`M${_f-n},${t-n}h${ff+n*2}v${Gf+n*2}h${-ff-n*2}z + M${D.x},${D.y}h${D.width}v${D.height}h${-D.width}z`,fillRule:"evenodd",pointerEvents:"none"})]})})}jq.displayName="MiniMap";var eb=d.memo(jq),DT=(f)=>(u)=>f?`${Math.max(1/u.transform[2],1)}`:void 0,TT={[s_.Line]:"right",[s_.Handle]:"bottom-right"};function MT({nodeId:f,position:u,variant:_=s_.Handle,className:y,style:$=void 0,children:l,color:j,minWidth:J=10,minHeight:F=10,maxWidth:A=Number.MAX_VALUE,maxHeight:U=Number.MAX_VALUE,keepAspectRatio:z=!1,resizeDirection:W,autoScale:K=!0,shouldResize:q,onResizeStart:E,onResize:O,onResizeEnd:G}){let H=RZ(),Z=typeof f==="string"?f:H,V=W0(),L=d.useRef(null),M=_===s_.Handle,N=mf(d.useCallback(DT(M&&K),[M,K]),A0),D=d.useRef(null),x=u??TT[_];d.useEffect(()=>{if(!L.current||!Z)return;if(!D.current)D.current=pK({domNode:L.current,nodeId:Z,getStoreItems:()=>{let{nodeLookup:v,transform:C,snapGrid:P,snapToGrid:w,nodeOrigin:r,domNode:S}=V.getState();return{nodeLookup:v,transform:C,snapGrid:P,snapToGrid:w,nodeOrigin:r,paneDomNode:S}},onChange:(v,C)=>{let{triggerNodeChanges:P,nodeLookup:w,parentLookup:r,nodeOrigin:S}=V.getState(),T=[],Y={x:v.x,y:v.y},R=w.get(Z);if(R&&R.expandParent&&R.parentId){let m=R.origin??S,p=v.width??R.measured.width??0,n=v.height??R.measured.height??0,_f={id:R.id,parentId:R.parentId,rect:{width:p,height:n,...zF({x:v.x??R.position.x,y:v.y??R.position.y},{width:p,height:n},R.parentId,w,m)}},t=r5([_f],w,r,S);T.push(...t),Y.x=v.x?Math.max(m[0]*p,v.x):void 0,Y.y=v.y?Math.max(m[1]*n,v.y):void 0}if(Y.x!==void 0&&Y.y!==void 0){let m={id:Z,type:"position",position:{...Y}};T.push(m)}if(v.width!==void 0&&v.height!==void 0){let p={id:Z,type:"dimensions",resizing:!0,setAttributes:!W?!0:W==="horizontal"?"width":"height",dimensions:{width:v.width,height:v.height}};T.push(p)}for(let m of C){let p={...m,type:"position"};T.push(p)}P(T)},onEnd:({width:v,height:C})=>{let P={id:Z,type:"dimensions",resizing:!1,dimensions:{width:v,height:C}};V.getState().triggerNodeChanges([P])}});return D.current.update({controlPosition:x,boundaries:{minWidth:J,minHeight:F,maxWidth:A,maxHeight:U},keepAspectRatio:z,resizeDirection:W,onResizeStart:E,onResize:O,onResizeEnd:G,shouldResize:q}),()=>{D.current?.destroy()}},[x,J,F,A,U,z,E,O,G,q]);let c=x.split("-");return o.jsx("div",{className:Y0(["react-flow__resize-control","nodrag",...c,_,y]),ref:L,style:{...$,scale:N,...j&&{[M?"backgroundColor":"borderColor"]:j}},children:l})}var fh=d.memo(MT);var X=fy.default.createElement,{useEffect:c1}=fy.default,Bu=fy.default.useState,e_=fy.default.useRef,Bl=[{id:"in-left",side:"left",position:Uf.Left,style:{top:"50%"}},{id:"in-top-left",side:"top",slot:"left",slotIndex:-1,position:Uf.Top,style:{left:"28%"}},{id:"in-top-mid",side:"top",slot:"mid",slotIndex:0,position:Uf.Top,style:{left:"50%"}},{id:"in-top-right",side:"top",slot:"right",slotIndex:1,position:Uf.Top,style:{left:"72%"}},{id:"in-bottom-left",side:"bottom",slot:"left",slotIndex:-1,position:Uf.Bottom,style:{left:"28%"}},{id:"in-bottom-mid",side:"bottom",slot:"mid",slotIndex:0,position:Uf.Bottom,style:{left:"50%"}},{id:"in-bottom-right",side:"bottom",slot:"right",slotIndex:1,position:Uf.Bottom,style:{left:"72%"}}],Xl=[{id:"out-right",position:Uf.Right,style:{top:"50%"}}],Jq=["#4eb7a8","#d7a13a","#69aee8","#e0835f","#b7d86b","#d98bd2","#5fc6bf"],U$=236,W$=88,Fq=15000,ST=10,PF=96,h1=72,CF=64,Qq=12;function p5(){return typeof document>"u"||document.visibilityState!=="hidden"}function Aq(f,u){let _=Number.parseFloat(String(f||""));return Number.isFinite(_)?_/100:u}function rT(f,u,_){let y=String(f.side||"");if(y!=="top"&&y!=="bottom")return 0;let $=Number(f.slotIndex||0),l=y==="top"?"in-top-mid":"in-bottom-mid",j=u.get(f.id)||0,J=u.get(l)||0;if($===0)return J===0?-26:28+j*74;let F=_===0?Math.abs($)*2:Math.sign(_)===Math.sign($)?-3:3;if(J>0&&j===0)return-14+F;return 8+j*74+F}function m5(f){let u=f.filter((l,j)=>{let J=f[j-1];return!J||Math.abs(J.x-l.x)>0.5||Math.abs(J.y-l.y)>0.5});if(u.length<2)return"";let _=`M ${u[0].x},${u[0].y}`,y=u[0];for(let l=1;l0.5||Math.abs(W.y-y.y)>0.5)_+=` L ${W.x},${W.y}`;_+=` Q ${J.x},${J.y} ${K.x},${K.y}`,y=K}let $=u[u.length-1];return`${_} L ${$.x},${$.y}`}function Sq(f,u,_,y,$,l,j=""){let J=_>=f,F=Math.max(1,Math.abs(_-f)),A=Math.abs(y-u),U=Math.max(34,Math.min(118,F*0.26)),z=Math.min(280,Math.abs(l));if(J&&$===Uf.Left&&z<4&&A<28&&F<420)return`M ${f},${u} C ${f+U},${u} ${_-U},${y} ${_},${y}`;if(J&&$===Uf.Left&&(j==="direct-forward-left"||F<=260&&A<=210)){let G=Math.max(42,Math.min(140,F*0.48)),H=Math.max(-28,Math.min(28,l*0.18));return`M ${f},${u} C ${f+G},${u+H} ${_-G},${y} ${_},${y}`}if(J){let G=f+U;if($===Uf.Top||$===Uf.Bottom){let V=$===Uf.Top?-1:1,L=y+V*(54+z*0.42);return m5([{x:f,y:u},{x:G,y:u},{x:G+Math.min(120,F*0.18),y:L},{x:_,y:L},{x:_,y:y+V*34},{x:_,y}])}let H=_-U,Z=(u+y)/2+l;return m5([{x:f,y:u},{x:G,y:u},{x:G+Math.min(110,F*0.16),y:Z},{x:H-Math.min(90,F*0.12),y:Z},{x:H,y},{x:_,y}])}let q=$===Uf.Bottom?1:$===Uf.Top?-1:l>=0?1:-1,E=Math.max(f,_)+92+Math.min(180,z*0.52),O=q<0?Math.min(u,y)-84-z*0.62:Math.max(u,y)+84+z*0.62;if($===Uf.Top||$===Uf.Bottom)return m5([{x:f,y:u},{x:f+U,y:u},{x:E,y:O},{x:_,y:O},{x:_,y:y+q*38},{x:_,y}]);return m5([{x:f,y:u},{x:f+U,y:u},{x:E,y:O},{x:_-U,y:O},{x:_-U,y},{x:_,y}])}function PT({data:f}){return X("div",{className:"pipeline-flow-node-body"},Bl.map((u)=>X(sy,{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})),Xl.map((u)=>X(sy,{key:u.id,id:u.id,type:"source",position:u.position,isConnectable:!1,className:"pipeline-flow-handle output right",style:u.style})),f?.label)}function CT({id:f,sourceX:u,sourceY:_,targetX:y,targetY:$,targetPosition:l,markerEnd:j,markerStart:J,style:F,data:A}){let U=Number(A?.laneOffset||0),z=Sq(u,_,y,$,l,U,String(A?.routeMode||""));return X(A$,{id:f,path:z,markerEnd:j,markerStart:J,style:F,interactionWidth:28})}var RT={pipelineCurve:CT},xT={pipelineNode:PT};function z0(f){if(!f)return"--";let u=new Date(f);if(Number.isNaN(u.getTime()))return"--";return u.toLocaleString("zh-CN",{hour12:!1})}function u2(f){return f.toLocaleTimeString("zh-CN",{hour12:!1})}function n5(f){if(!f)return"--";let u=new Date(f);if(Number.isNaN(u.getTime()))return"--";return u2(u)}function $1(f){let u=Number(f);if(!Number.isFinite(u)||u<0)return"--";let _=Math.round(u/1000);if(_<60)return`${_}s`;if(_<3600)return`${Math.floor(_/60)}m ${_%60}s`;return`${Math.floor(_/3600)}h ${Math.floor(_%3600/60)}m`}function RF(f){let u=Number(f);if(!Number.isFinite(u))return"--";return u.toLocaleString("zh-CN")}function Uq(f){let u=Number(f);if(!Number.isFinite(u))return"--";return`${Math.round(Math.max(0,Math.min(1,u))*100)}%`}function Nf(f){return typeof f==="object"&&f!==null&&!Array.isArray(f)}function Ef(f){return Array.isArray(f)?f:[]}function Pf(f){if(!f)return null;let u=new Date(f);return Number.isNaN(u.getTime())?null:u.getTime()}function wl(f){return Number.isFinite(Number(f))?new Date(Number(f)).toISOString():""}function Ml(...f){for(let u of f){let _=Pf(u);if(_!==null)return new Date(_).toISOString()}return""}function sF(...f){let u=f.map(Pf).filter((_)=>_!==null);return u.length>0?new Date(Math.max(...u)).toISOString():""}function oF(f){return["succeeded","failed","skipped","cancelled","canceled","completed"].includes(String(f||"").toLowerCase())}function rq(f){let u=Rq(f).toLowerCase();return["running","active","in-progress","in_progress"].includes(u)}function Wq(f,u="status"){return f.reduce((_,y)=>{let $=String(y?.[u]||"unknown").toLowerCase();return _[$]=(_[$]||0)+1,_},{})}function Pq(f){if(!f||typeof f!=="string")return null;try{let u=JSON.parse(f);return Nf(u)?u:null}catch{return null}}function xF(f){let u=f.map(Pq).filter((l)=>Boolean(l)),_=u.flatMap((l)=>[l.timestamp,l.createdAt,l.updatedAt]).filter(Boolean),y=sF(..._),$=Array.from(new Set(u.map((l)=>String(l.event||l.action||l.type||"")).filter(Boolean))).slice(0,3);return{total:f.length,parsed:u.length,lastAt:y,eventKinds:$}}function t5(f){if(f===null||f===void 0)return"--";if(typeof f==="boolean")return f?"是":"否";if(typeof f==="number")return String(f);if(typeof f==="string")return f.length>80?`${f.slice(0,77)}...`:f;if(Array.isArray(f))return`${f.length} 项`;if(typeof f==="object")return`${Object.keys(f).length} 字段`;return String(f)}function Cq(f,u=280){if(f===null||f===void 0)return"";let y=(typeof f==="string"?f:String(f)).replace(/\r\n/gu,` +`).trim();return y.length>u?`${y.slice(0,Math.max(0,u-1))}...`:y}function Rq(f){if(typeof f==="string")return f;if(Nf(f))return String(f.status||f.state||f.phase||"unknown");return"unknown"}function vT(f){return f.filter((u)=>u&&u.value!==void 0&&u.value!==null&&String(u.value)!=="")}function pF({items:f}){let u=vT(Ef(f));return X("div",{className:"pipeline-kv-grid"},u.map((_)=>X("span",{key:_.label},X("b",null,_.label),X("span",null,_.value))))}function aF({items:f}){let u=Ef(f).map((_)=>String(_||"")).filter(Boolean);if(u.length===0)return null;return X("div",{className:"pipeline-chip-row"},u.map((_,y)=>X("span",{key:`${y}-${_}`},_)))}function mF(f,u){let _=String(u?.procedureRunId||""),y=Ef(f?.procedureRuns);return y.find(($)=>String(l1($))===_)||y.at(-1)||null}function bT(f,u){let _=String(u||"");if(!_)return null;return Ef(f?.procedureRuns).find((y)=>l1(y)===_)||null}function vF(f){return Ef(f?.attempts).length}function zq(f){return Ef(f?.attempts).reduce((u,_)=>u+_2(_).length,0)}function _2(f){return Ef(f?.opencodeMessages?.steps).filter(Nf)}function xq(f){let u=String(f?.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 hT(f,u){let _=kF(f.map((l)=>l?.agent)).slice(0,3),y=kF(f.map((l)=>l?.model)).slice(0,3),$=u.length<=2?u.map((l)=>`session ${l}`):[`sessions ${u.length}`,...u.slice(0,2).map((l)=>`session ${l}`)];return[..._.map((l)=>`agent ${l}`),...y.map((l)=>`model ${l}`),...$]}function Nl(f,u=0){return String(f?.messageId||f?.index||"")||`step-${u}`}function IT({steps:f,sessionIds:u,sessionFacts:_,matchedStepKey:y}){let $=Ef(f),l=$.findIndex((O,G)=>Nl(O,G)===y),j=l>=0?$[l]:null,J=$.flatMap((O)=>[Pf(O?.createdAt),Pf(O?.completedAt)]).filter((O)=>O!==null),F=J.length>0?Math.min(...J):null,A=J.length>0?Math.max(...J):null,U=F!==null&&A!==null?Math.max(0,A-F):null,z=$.reduce((O,G)=>O+Ef(G?.parts).filter((H)=>String(H?.type||"").toLowerCase()==="tool").length,0),W=$.reduce((O,G)=>O+Ef(G?.parts).filter((H)=>["text","reasoning"].includes(String(H?.type||"").toLowerCase())).length,0),K=$.reduce((O,G)=>O+Ef(G?.parts).filter((H)=>String(H?.type||"").toLowerCase()==="tool"&&xq(H)==="failed").length,0),q=[`${$.length} steps`,`${u.length} sessions`,`${W} messages`,`${z} tools`,U!==null?`duration ${$1(U)}`:"",K>0?`${K} failed tools`:""].filter(Boolean),E=j?[`Step ${j?.index??l+1}`,String(j?.role||"role --"),j?.model?`model ${j.model}`:"",j?.finish?`finish ${j.finish}`:"",j?.durationMs!==void 0&&j?.durationMs!==null?`duration ${$1(j.durationMs)}`:""].filter(Boolean):[];return X("section",{className:"pipeline-trace-timeline","data-testid":"pipeline-step-timeline"},X("div",{className:"pipeline-trace-head"},X("div",null,X("b",null,"OpenCode Trace"),X("span",null,"Trace 使用 Codex Queue 统一样式展示完整 agent loop;Pipeline 旧 step/message/tool 卡片样式已废弃。")),X("div",{className:"pipeline-trace-session-head","data-testid":"pipeline-step-timeline-session"},X("span",null,q.join(" / ")||"Trace"),_.length>0?X(aF,{items:_}):null)),j?X("div",{className:"pipeline-trace-focus","data-testid":"pipeline-trace-matched-step"},X("span",{className:"codex-output-channel"},"Matched"),X("strong",null,`Gantt selection -> ${E.join(" / ")}`),X("time",null,`${n5(j?.createdAt)} -> ${n5(j?.completedAt)}`)):null,X(X4,{port:Bz,input:$,className:"codex-transcript pipeline-trace",testId:"pipeline-opencode-step-trace",emptyText:"暂无 OpenCode Trace 输出",keepRecentToolCalls:3}))}function Ll(f){return Ef(f).flatMap((u)=>{if(Nf(u))return[u];let _=Pq(u);return _?[_]:[]})}function O1(f){return String(f?.event||f?.action||f?.requestedAction||f?.type||"").toLowerCase()}function oy(f){return Ml(f?.timestamp,f?.createdAt,f?.updatedAt,f?.startedAt,f?.finishedAt)}function cT(f){return Pf(oy(f))}function y2(f){return String(f?.attempt||f?.id||"")}function kF(f){let u=new Set,_=[];for(let y of f){let $=String(y||"");if(!$||u.has($))continue;u.add($),_.push($)}return _}function Gq(f){switch(String(f||"").toLowerCase()){case"monitor":return"monitor";case"webui":return"webui";case"cli":return"cli";case"system":return"runner";default:return String(f||"--")}}function ay(f){return String(f?.requestedAction||f?.action||"").toLowerCase()}function Yl(f){switch(ay(f)){case"guide":return"引导";case"modify":return"修改";case"approve":return"审核通过";case"restart":return"重启";case"redo":return"重做";default:return String(f?.requestedAction||f?.action||"控制")}}function Kq(f){switch(O1(f)){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`${Yl(f)} 已发起`;case"control-command-applied":return`${Yl(f)} 已生效`;case"control-command-ignored":return`${Yl(f)} 已忽略`;default:return String(f?.event||f?.action||f?.requestedAction||"event")}}function Zq(f){return Cq(f?.promptPreview||f?.reasonPreview||f?.prompt||f?.reason||"",240)}function pT(f){let u=String(f?.prompt||""),_=String(f?.reason||f?.restartReason||""),y=u?"":String(f?.promptPreview||""),$=_?"":String(f?.reasonPreview||"");return[u||y?{label:u?"prompt":"prompt preview",value:u||y}:null,_||$?{label:_?"reason":"reason preview",value:_||$}:null,Ef(f?.resetNodeIds).length>0?{label:"reset nodes",value:Ef(f.resetNodeIds).join(", ")}:null,Ef(f?.runningResetNodeIds).length>0?{label:"interrupted running nodes",value:Ef(f.runningResetNodeIds).join(", ")}:null,Ef(f?.interruptedProcedureRunIds).length>0?{label:"interrupted procedures",value:Ef(f.interruptedProcedureRunIds).join(", ")}:null,f?.interruptedProcedureRunId?{label:"interrupted procedure",value:String(f.interruptedProcedureRunId)}:null].filter(Boolean)}function bF(f){let u=_2(f),_=u.map((F)=>Pf(F?.createdAt)).filter((F)=>F!==null),y=u.map((F)=>Pf(F?.completedAt)??Pf(F?.createdAt)).filter((F)=>F!==null),$=Ll(f?.controlEventRecords).map((F)=>cT(F)).filter((F)=>F!==null),l=Ef(f?.assistantOutputs).map((F)=>Pf(F?.updatedAt)).filter((F)=>F!==null),j=_[0]??$[0]??l[0]??null,J=y.at(-1)??$.at(-1)??l.at(-1)??j;return{startMs:j,endMs:J}}function mT(f,u,_,y,$=""){let l=Ef(f?.procedureRuns).filter((J)=>$2(J,u)===_);if(l.length===0)return null;if($){let J=l.find((F)=>l1(F)===$);if(J)return J}if(y===null)return l.at(-1)||null;let j=l.find((J)=>{let F=Pf(k5(J,f)),A=Pf(i5(J,f))??F;return F!==null&&A!==null&&y>=F-1000&&y<=A+1000});if(j)return j;return l.slice().sort((J,F)=>{let A=Pf(k5(J,f))??y,U=Pf(i5(J,f))??A,z=Pf(k5(F,f))??y,W=Pf(i5(F,f))??z,K=Math.min(Math.abs(A-y),Math.abs(U-y)),q=Math.min(Math.abs(z-y),Math.abs(W-y));return K-q})[0]||null}function vq(f,u){let _=Ef(f?.attempts).filter(Nf);if(_.length===0)return null;let y=String(u?.attempt||"");if(y){let j=_.find((J)=>y2(J)===y);if(j)return j}let $=Number.isFinite(Number(u?.ms))?Number(u.ms):null;if($===null)return _.at(-1)||null;let l=_.find((j)=>{let J=bF(j);return Number.isFinite(J.startMs)&&Number.isFinite(J.endMs)&&$>=Number(J.startMs)-1000&&$<=Number(J.endMs)+1000});if(l)return l;return _.slice().sort((j,J)=>{let F=bF(j),A=bF(J),U=Math.min(Math.abs(Number(F.startMs??$)-$),Math.abs(Number(F.endMs??$)-$)),z=Math.min(Math.abs(Number(A.startMs??$)-$),Math.abs(Number(A.endMs??$)-$));return U-z})[0]||_.at(-1)||null}function bq(f,u){let _=_2(f);if(_.length===0)return{step:null,stepIndex:-1,stepKey:""};if(u===null){let l=_[0];return{step:l,stepIndex:0,stepKey:Nl(l,0)}}for(let l=0;l<_.length;l+=1){let j=_[l],J=Pf(j?.createdAt)??Pf(j?.completedAt),F=Pf(j?.completedAt)??J;if(J!==null&&F!==null&&u>=J-1000&&u<=F+1000)return{step:j,stepIndex:l,stepKey:Nl(j,l)}}let y=_.findIndex((l)=>{let j=Pf(l?.createdAt)??Pf(l?.completedAt);return j!==null&&j>=u});if(y>=0){let l=_[y];return{step:l,stepIndex:y,stepKey:Nl(l,y)}}let $=Math.max(0,_.length-1);return{step:_[$],stepIndex:$,stepKey:Nl(_[$],$)}}function kT(f,u){let _=String(u?.runId||f?.runId||"");if(String(u?.mode||"")==="interval"){let A=u?.interval||{},U=mF(f,A)||A.raw||{};return{mode:"interval",runId:_,interval:A,marker:null,nodeId:String(A?.nodeId||$2(U,_)||""),procedure:U,attempt:null,matchedStep:null,matchedStepIndex:-1,matchedStepKey:""}}let y=Nf(u?.marker)?u.marker:{},$=Number.isFinite(Number(y?.ms))?Number(y.ms):null,l=String(y?.nodeId||""),j=l?mT(f,_,l,$,String(y?.procedureRunId||"")):null,J=j?vq(j,y):null,F=J?bq(J,$):{step:null,stepIndex:-1,stepKey:""};return{mode:"event",runId:_,interval:null,marker:y,nodeId:l,procedure:j,attempt:J,matchedStep:F.step,matchedStepIndex:F.stepIndex,matchedStepKey:F.stepKey}}function iT({procedure:f,matchedStepKey:u="",matchedAttemptId:_=""}){let y=Ef(f?.attempts);if(y.length===0)return X(cu,{title:"暂无 attempt 详情",text:"当前 procedure 还没有可展示的 attempt / OpenCode Trace;若刚点击甘特线,请等待 node 详情抓取完成。"});return y.map(($,l)=>{let j=$?.opencodeMessages||{},J=_2($),F=Ef(j.sessionIds).map((W)=>String(W)).filter(Boolean),A=hT(J,F),U=y2($)||`attempt-${l+1}`,z=J.reduce((W,K)=>W+Ef(K?.parts).filter((q)=>String(q?.type||"").toLowerCase()==="tool"&&xq(q)==="failed").length,0);return X("article",{key:U,className:`pipeline-attempt-card ${_===U?"matched":""}`},X("div",{className:"pipeline-attempt-head"},X("div",null,X("strong",null,U),X("span",null,j.source||"opencode")),X("div",{className:"pipeline-attempt-badges"},X("span",null,`${J.length} steps`),X("span",null,`${j.toolCallCount??"--"} tools`),z>0?X("span",{className:"danger"},`${z} failed`):null)),X(pF,{items:[{label:"messages",value:j.messageCount??"--"},{label:"steps",value:j.stepCount??J.length},{label:"tools",value:j.toolCallCount??"--"},{label:"updated",value:z0(j.updatedAt)},{label:"sessions",value:F.join(", ")||"--"}]}),J.length===0?X("p",{className:"muted paragraph"},"当前 attempt 尚未返回 OpenCode Trace;请确认 D601 pipeline-control 已重建并重新抓取。"):X(IT,{steps:J,sessionIds:F,sessionFacts:A,matchedStepKey:u}))})}function hF(f,u){return`${f}::${u}`}function s5(f,u,_){if(!Nf(f))return null;return String(f.runId||"")===u&&String(f.nodeId||"")===_?f:null}function gT(f,u){let _=Nf(f)?f:{};if(!Nf(u))return _;let y=Ef(u.attempts),$=Ef(_.attempts);return{..._,...u,attempts:y.length>0?y:$}}function nT(f,u,_,y){if(!s5(u,_,y))return f;let $=Ef(u.procedureRuns),l=Nf(f)?f:{};return{...l,...u,controlCommands:Ef(u.controlCommands).length>0?u.controlCommands:l.controlCommands,controlEvents:Ef(u.controlEvents).length>0?u.controlEvents:l.controlEvents,procedureRuns:$.length>0?$:l.procedureRuns}}function tT({selection:f,runDetails:u,nodeDetails:_,nodeDetailsState:y,onRaw:$,onCollapse:l}){if(!f?.mode)return X("aside",{className:"pipeline-gantt-detail-panel empty","data-testid":"pipeline-gantt-detail-panel"},X("div",{className:"pipeline-gantt-detail-head"},X("div",null,X("span",{className:"panel-eyebrow"},"Gantt Detail"),X("h3",null,"未选择元素")),X("button",{type:"button",className:"ghost-btn mini",onClick:l,"data-testid":"pipeline-gantt-sidebar-collapse"},"收起")),X(cu,{title:"选择一条执行线或一个控制点",text:"点击甘特图中的 node 执行线、prompt 点或控制点,在这里查看结构化过程和 OpenCode step。"}));let j=String(f?.runId||""),J=String(f?.interval?.nodeId||f?.marker?.nodeId||""),F=u?.runId===j?u.details:null,A=s5(_,j,J),U=String(y?.runId||"")===j&&String(y?.nodeId||"")===J,z=nT(F,A,j,J),W=(String(u?.runId||"")!==j||Boolean(u?.loading))&&!z,K=String(u?.runId||"")===j?String(u?.error||""):"",q=U?String(y?.error||""):"",E=z?kT(z,f):null,O=E?.interval||f?.interval||null,G=E?.marker||f?.marker||null,H=String(O?.procedureRunId||G?.procedureRunId||""),Z=A?bT(A,H)||mF(A,O||{procedureRunId:H}):null,V=E?.procedure||(z?mF(z,O||{procedureRunId:H}):null)||O?.raw||{};if(Z&&(vF(V)===0||zq(Z)>=zq(V)))V=gT(V,Z);let L=E?.attempt||null,M=String(E?.matchedStepKey||"");if(!L&&G&&vF(V)>0)L=vq(V,G),M=String(bq(L,Number.isFinite(Number(G?.ms))?Number(G.ms):null).stepKey||"");let N=y2(L),D=vF(V)>0,x=U&&Boolean(y?.loading)&&!D,c=Boolean(W||x),v=[D?"":K,q].filter(Boolean).join(" / "),C=U&&y?.fetchedAt?y.fetchedAt:u?.fetchedAt,P=Rq(V?.status||O?.status||G?.status||G?.event),w=f?.mode==="event"?G?.label||Kq(G?.raw||G)||"event":E?.nodeId||O?.nodeId||"node",r=G?pT(G?.raw||G):[],S=G?[O1(G?.raw||G)?`event ${O1(G?.raw||G)}`:"",G?.promptEvent?`prompt ${G.promptEvent}`:"",G?.action?`action ${G.action}`:"",G?.sourceKind?`source ${Gq(G.sourceKind)}`:"",G?.sourceNodeId?`from ${G.sourceNodeId}`:"",G?.targetNodeId?`to ${G.targetNodeId}`:"",G?.snapReason?`draw ${G.snapReason}`:""].filter(Boolean):[];return X("aside",{className:"pipeline-gantt-detail-panel","data-testid":"pipeline-gantt-detail-panel"},X("div",{className:"pipeline-gantt-detail-head"},X("div",null,X("span",{className:"panel-eyebrow"},f?.mode==="event"?"Gantt Event Detail":"Gantt Line Detail"),X("h3",null,w)),X("div",{className:"pipeline-gantt-detail-head-actions"},X(uy,{status:P},P),X("button",{type:"button",className:"ghost-btn mini",onClick:l,"data-testid":"pipeline-gantt-sidebar-collapse"},"收起"))),G?X("article",{className:"pipeline-event-card"},X("div",{className:"pipeline-event-card-head"},X("strong",null,G?.label||Kq(G?.raw||G)),X(aF,{items:S})),X(pF,{items:[{label:"event time",value:z0(G?.timestampIso||G?.timestamp||"--")},G?.snapped?{label:"drawn time",value:z0(G?.renderedTimestampIso||G?.ms)}:null,{label:"node",value:G?.nodeId||"--"},{label:"procedure",value:G?.procedureRunId||l1(V)||"--"},{label:"attempt",value:G?.attempt||N||"--"},{label:"source kind",value:G?.sourceKind?Gq(G.sourceKind):"--"},{label:"source node",value:G?.sourceNodeId||"--"},{label:"target node",value:G?.targetNodeId||"--"},{label:"command",value:G?.commandId||G?.eventId||"--"},G?.snapReason?{label:"placement",value:G.snapReason}:null]}),r.length>0?X("div",{className:"pipeline-event-blocks"},r.map((T,Y)=>X("section",{key:`${T.label}-${Y}`,className:"pipeline-event-text-block"},X("b",null,T.label),X("p",null,T.value)))):null,Zq(G?.raw||G)?X("p",{className:"pipeline-text-preview"},Zq(G?.raw||G)):null):null,X(pF,{items:[{label:"epoch",value:j||O?.runId||"--"},{label:"node",value:E?.nodeId||O?.nodeId||G?.nodeId||"--"},{label:"procedure",value:O?.procedureRunId||G?.procedureRunId||l1(V)||"--"},{label:"started",value:z0(O?.startedAt||V?.startedAt)},{label:"finished",value:z0(O?.finishedAt||V?.finishedAt)},{label:"duration",value:$1(O?.durationMs||V?.durationMs)},{label:"fetched",value:C?u2(C):"--"},E?.matchedStep?{label:"matched step",value:`Step ${E.matchedStep.index??E.matchedStepIndex+1}`}:null]}),c?X("div",{className:"form-success"},x?"正在抓取该 node 的 attempt / Trace...":"正在抓取 epoch 执行过程..."):null,X(H0,{error:v}),X("div",{className:"pipeline-gantt-detail-actions"},X(X1,{title:`Procedure ${O?.procedureRunId||G?.procedureRunId||E?.nodeId||"node"}`,data:V,onOpen:$,testId:"raw-pipeline-gantt-procedure"}),G?X(X1,{title:`Pipeline event ${G?.id||G?.commandId||G?.eventId||E?.nodeId||"event"}`,data:G?.raw||G,onOpen:$,testId:"raw-pipeline-gantt-event"}):null,z?X(X1,{title:`Pipeline run ${j||"--"}`,data:z,onOpen:$,testId:"raw-pipeline-gantt-node-details"}):null),!c&&!l1(V)&&!G?X(cu,{title:"暂无过程详情",text:"当前选择还没有可匹配的 procedure 运行记录。"}):null,!c&&l1(V)?X(iT,{procedure:V,matchedStepKey:M,matchedAttemptId:N}):null)}function sT({value:f}){let _=String(f||"--").split(/([_-])/u);return X(fy.default.Fragment,null,_.map((y,$)=>y==="-"||y==="_"?X(fy.default.Fragment,{key:$},y,X("wbr",null)):X(fy.default.Fragment,{key:$},y)))}async function a_(f,u={}){return wf(f,{invalidJsonPrefix:"Pipeline 返回了无效 JSON",...u})}function uy({status:f,children:u}){let _=String(f||"unknown").toLowerCase();return X("span",{className:`status-badge ${_}`},u||f||"unknown")}function Hu({label:f,value:u,hint:_,tone:y}){return X("article",{className:`metric-card ${y||""}`},X("div",{className:"metric-label"},f),X("div",{className:"metric-value"},u),X("div",{className:"metric-hint"},_))}function I1({title:f,eyebrow:u,actions:_,children:y,className:$}){return X("section",{className:`panel ${$||""}`},X("div",{className:"panel-head"},X("div",null,u?X("p",{className:"panel-eyebrow"},u):null,X("h2",null,f)),_?X("div",{className:"panel-actions"},_):null),X("div",{className:"panel-body"},y))}function X1({title:f,data:u,onOpen:_,testId:y}){return X("button",{type:"button",className:"ghost-btn","data-testid":y,onClick:()=>_(f,u)},"查看原始JSON")}function y1({title:f,subtitle:u,facts:_,data:y,onRaw:$,testId:l}){let j=Ef(_).map((J)=>String(J||"")).filter(Boolean);return X("article",{className:"pipeline-evidence-row"},X("div",{className:"pipeline-evidence-main"},X("strong",null,f),u?X("span",null,u):null),X("div",{className:"pipeline-evidence-facts"},j.map((J,F)=>X("span",{key:`${F}-${J.slice(0,16)}`},J))),y!==void 0?X(X1,{title:f,data:y,onOpen:$,testId:l}):null)}function cu({title:f,text:u}){return X("div",{className:"empty-state"},X("strong",null,f),X("span",null,u))}function oT(f){return f?.runtime&&typeof f.runtime==="object"&&!Array.isArray(f.runtime)?f.runtime:{}}function aT(f){return f?.backend&&typeof f.backend==="object"&&!Array.isArray(f.backend)?f.backend:{}}function dT(f){return f?.repository&&typeof f.repository==="object"&&!Array.isArray(f.repository)?f.repository:{}}function eT(f){return{components:Array.isArray(f?.registry?.components)?f.registry.components:[],pipelines:Array.isArray(f?.pipelines)?f.pipelines:[],runs:Array.isArray(f?.runs)?f.runs:[]}}function qq(f,u,_){let y=f?._unidesk?.arrayLimits?.[u],$=Number(y?.originalLength);return Number.isFinite($)?$:_}function hq(f){if(!f||typeof f!=="object"||Array.isArray(f))return"--";return`${f.componentClass||"--"}/${f.id||"--"}`}function o5(f){if(!f||typeof f!=="object"||Array.isArray(f))return"";let u=String(f.componentClass||"").trim(),_=String(f.id||"").trim();return u&&_?`${u}/${_}`:""}function dF(f){return f?.config&&typeof f.config==="object"&&!Array.isArray(f.config)?f.config:{}}function Iq(f){let u=dF(f),_=Array.isArray(u.nodes)?u.nodes:Array.isArray(f?.nodes)?f.nodes:[],y=new Map;for(let j of _){let J=String(j?.id||j?.nodeId||"");if(J)y.set(J,{...j,id:J})}let $=eF(f),l=(j)=>{if(j&&!y.has(j))y.set(j,{id:j})};for(let j of fQ(f))Dl(j).forEach(l);for(let j of $)l(String(j?.from||j?.source||"")),l(String(j?.to||j?.target||""));return Array.from(y.values())}function eF(f){let u=dF(f);return Array.isArray(u.edges)?u.edges:Array.isArray(f?.edges)?f.edges:[]}function fQ(f){let u=dF(f);return Array.isArray(u.topologicalBatches)?u.topologicalBatches:Array.isArray(f?.topologicalBatches)?f.topologicalBatches:[]}function fM(f){let u=new Map;for(let _ of f){let y=o5(_);if(y)u.set(y,_);let $=Array.isArray(_?.refs)?_.refs:[];for(let l of $){let j=o5(l);if(j)u.set(j,_)}}return u}function Hq(f,u){let _=u.get(o5(f?.componentRef));if(_)return _;let y=o5({componentClass:f?.kind,id:f?.id});return y?u.get(y)||null:null}function Eq(f,u){let _=cq(f,u);return String(_?.status||"pending")}function cq(f,u){return(Array.isArray(f?.nodes)?f.nodes:[]).find((y)=>y?.nodeId===u||y?.id===u)||null}function uM(f){return f.reduce((u,_)=>{let y=String(_?.status||"unknown").toLowerCase();return u[y]=(u[y]||0)+1,u},{})}function _M(f){if(Array.isArray(f?.scorers))return f.scorers.filter(Nf);if(Array.isArray(f?.summary?.scorers))return f.summary.scorers.filter(Nf);if(Array.isArray(f?.artifact?.summary?.scorers))return f.artifact.summary.scorers.filter(Nf);return[]}function yM(f){if(Nf(f?.run))return f.run;if(Nf(f?.runSummary))return f.runSummary;return null}function $M(f,u){if(!Nf(f)&&!Nf(u))return null;if(!Nf(f))return u;if(!Nf(u))return f;return{...f,...u,request:Nf(f.request)||Nf(u.request)?{...Nf(f.request)?f.request:{},...Nf(u.request)?u.request:{}}:u.request??f.request,artifact:Nf(f.artifact)||Nf(u.artifact)?{...Nf(f.artifact)?f.artifact:{},...Nf(u.artifact)?u.artifact:{}}:u.artifact??f.artifact,summary:Nf(f.summary)||Nf(u.summary)?{...Nf(f.summary)?f.summary:{},...Nf(u.summary)?u.summary:{}}:u.summary??f.summary}}function a5(f){let u=_M(f),_=u.find((U)=>Nf(U?.score))||u[0]||null,y=Nf(_?.score)?_.score:{},$=Number(y.passed),l=Number(y.total),j=Number(y.ratio),J=Number.isFinite(j)?j:Number.isFinite($)&&Number.isFinite(l)&&l>0?$/l:null,F=J===null?null:Math.round(Math.max(0,Math.min(100,J<=1?J*100:J))),A=String(y.text||(Number.isFinite($)&&Number.isFinite(l)?`${$}/${l}`:""));return{scorer:_,scorers:u,score:y,passed:Number.isFinite($)?$:null,total:Number.isFinite(l)?l:null,percent:F,text:A}}function iF(f){let u=a5(f);return u.text||(u.scorers.length>0?String(u.scorer?.status||"pending"):"--")}function uQ(f){let u=a5(f);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 lM(f){return Array.isArray(f?.items)?f.items.filter(Nf):[]}function jM({run:f}){let u=iF(f);return X("span",{className:`pipeline-score-badge ${uQ(f)}`},`score ${u}`)}function JM({run:f,onRaw:u}){let y=a5(f).scorers;if(!f)return X(cu,{title:"暂无评分",text:"选择一个 epoch 后会显示 scorer 结果。"});if(y.length===0)return X("div",{className:"pipeline-score-empty"},X("strong",null,"评分器等待中"),X("span",null,"DAG 完成后,Pipeline control backend 会把 scorer summary 追加到 run artifact,并通过 UniDesk 显示。"));return X("div",{className:"pipeline-score-board","data-testid":"pipeline-score-board"},y.map(($,l)=>{let j=a5({scorers:[$]}),J=lM($),F=j.percent??0;return X("article",{key:`${$.scorerId||$.component||l}`,className:`pipeline-score-card ${uQ({scorers:[$]})}`},X("div",{className:"pipeline-score-head"},X("div",null,X("span",null,$.scorerId||$.component||"scorer"),X("strong",null,j.text||$.status||"--")),X(uy,{status:$.status||"unknown"},$.status||"unknown")),X("div",{className:"pipeline-score-meter","aria-label":`score ${F}%`},X("span",{style:{width:`${F}%`}})),X("div",{className:"pipeline-score-facts"},X("span",null,`${F}%`),X("span",null,$.component||"--"),X("span",null,$.applicationCheckoutRef||"--")),J.length>0?X("div",{className:"pipeline-score-items"},J.map((A)=>X("span",{key:`${A.id||A.filter}`,className:`pipeline-score-item ${String(A.status||"").toLowerCase()}`,title:`${A.filter||"--"} / ran=${A.ran??"?"}`},X("b",null,A.id||"--"),X("small",null,A.status||"--")))):X("p",{className:"muted paragraph"},"当前 scorer 尚未返回 item 级结果。"),$.error?X("p",{className:"pipeline-score-error"},Cq($.error,360)):null,X("div",{className:"panel-actions inline-actions"},X(X1,{title:`Scorer ${$.scorerId||l}`,data:$,onOpen:u,testId:"raw-pipeline-score"})))}))}function FM(f){let u=f.reduce((_,y)=>{let $=String(y?.componentClass||"unknown");return _[$]=(_[$]||0)+1,_},{});return Object.entries(u).map(([_,y])=>({name:_,count:Number(y)})).sort((_,y)=>y.count-_.count||_.name.localeCompare(y.name))}function Dl(f){if(Array.isArray(f))return f.map((u)=>typeof u==="string"?u:String(u?.id||u?.nodeId||"")).filter(Boolean);if(Array.isArray(f?.nodes))return Dl(f.nodes);if(Array.isArray(f?.nodeIds))return Dl(f.nodeIds);return[]}function QM(f){return Nf(f?.instanceInputs?.monitor)?f.instanceInputs.monitor:{}}function pq(f,u){if(String(f?.kind||"").toLowerCase()!=="procedure")return!1;let _=QM(f);if(f?.instanceInputs?.monitorMode===!0||_.enabled===!0)return!0;let y=hq(f?.componentRef);return String(u?.id||u?.config?.id||y||"").toLowerCase().includes("monitor")}function AM(f){return f.filter((u)=>pq(u)).map((u)=>String(u?.id||"")).filter(Boolean)}function UM(f,u){if(u.length===0)return f;let _=new Set(u),y=u.filter(($)=>f.includes($));if(y.length===0)return f;return[...y,...f.filter(($)=>!_.has($))]}function WM(f,u){if(u.length===0)return f;let _=new Set(u),y=u.filter((l)=>f.some((j)=>j.includes(l)));if(y.length===0)return f;let $=f.map((l)=>l.filter((j)=>!_.has(j))).filter((l)=>l.length>0);return[y,...$]}function zM(f,u,_){let $=fQ(f).map(Dl).filter((W)=>W.length>0);if($.length>0)return $;let l=u.map((W)=>String(W?.id||"")).filter(Boolean),j=new Set(l),J=new Map(l.map((W)=>[W,0])),F=new Map(l.map((W)=>[W,[]]));for(let W of _){let K=String(W?.from||W?.source||""),q=String(W?.to||W?.target||"");if(!j.has(K)||!j.has(q))continue;F.get(K)?.push(q),J.set(q,(J.get(q)||0)+1)}let A=new Map,U=l.filter((W)=>(J.get(W)||0)===0);for(let W of U)A.set(W,0);while(U.length>0){let W=U.shift(),K=(A.get(W)||0)+1;for(let q of F.get(W)||[])if(J.set(q,Math.max(0,(J.get(q)||0)-1)),A.set(q,Math.max(A.get(q)||0,K)),(J.get(q)||0)===0)U.push(q)}l.forEach((W)=>{if(!A.has(W))A.set(W,0)});let z=Math.max(0,...Array.from(A.values()));return Array.from({length:z+1},(W,K)=>l.filter((q)=>A.get(q)===K)).filter((W)=>W.length>0)}function GM(f,u,_){let $=fQ(f).map(Dl).filter((J)=>J.length>0),l=$.length>0?$.flatMap((J)=>J):(()=>{let J=u.map((E)=>String(E?.id||"")).filter(Boolean),F=new Set(J),A=_.filter((E)=>String(E?.edgeType||"").toLowerCase()!=="rework"),U=new Map(J.map((E)=>[E,0])),z=new Map(J.map((E)=>[E,[]]));for(let E of A){let O=String(E?.from||E?.source||""),G=String(E?.to||E?.target||"");if(!F.has(O)||!F.has(G))continue;z.get(O)?.push(G),U.set(G,(U.get(G)||0)+1)}let W=new Map,K=J.filter((E)=>(U.get(E)||0)===0);for(let E of K)W.set(E,0);while(K.length>0){let E=K.shift(),O=(W.get(E)||0)+1;for(let G of z.get(E)||[])if(U.set(G,Math.max(0,(U.get(G)||0)-1)),W.set(G,Math.max(W.get(G)||0,O)),(U.get(G)||0)===0)K.push(G)}J.forEach((E)=>{if(!W.has(E))W.set(E,0)});let q=Math.max(0,...Array.from(W.values()));return Array.from({length:q+1},(E,O)=>J.filter((G)=>W.get(G)===O)).flatMap((E)=>E)})(),j=new Set(l);for(let J of u){let F=String(J?.id||"");if(!F||j.has(F))continue;l.push(F),j.add(F)}return UM(l,AM(u))}function Vl(f){return`${f.source}->${f.target}-${f.index}`}function Vq(f,u,_){let y=Iq(f),$=eF(f),l=fM(_),j=new Map(y.map((P)=>[String(P?.id||""),P])),J=y.filter((P)=>pq(P,Hq(P,l))).map((P)=>String(P?.id||"")).filter(Boolean),F=WM(zM(f,y,$),J),A=[],U=new Map,z=330,W=122;F.forEach((P,w)=>{let r=P.length*122;P.forEach((S,T)=>{let Y=j.get(S)||{id:S},R=Hq(Y,l),m=Eq(u,S).toLowerCase(),p=String(Y.kind||R?.componentClass||"node").toLowerCase(),n=hq(Y.componentRef||R),_f=String(R?.config?.version||R?.version||""),t=String(R?.config?.description||R?.description||""),ff=T*122-Math.floor(r/2);U.set(S,{column:w,row:T,y:ff}),A.push({id:S,type:"pipelineNode",position:{x:w*330,y:ff},data:{exportLabel:{id:S,kind:p,componentRef:n,componentVersion:_f,componentDescription:t,status:m},label:X("div",{className:"flow-node-label"},X("strong",null,S),X("span",null,p),X("code",{title:t||n},_f?`${n}@${_f}`:n),X(uy,{status:m},m))},className:`pipeline-flow-node ${p} ${m}`})})});let K=$.flatMap((P,w)=>{let r=String(P?.from||P?.source||""),S=String(P?.to||P?.target||"");if(!j.has(r)||!j.has(S))return[];return[{source:r,target:S,index:w,condition:P?.condition,edgeType:P?.edgeType}]}),q=K.reduce((P,w)=>P.set(w.source,(P.get(w.source)||0)+1),new Map),E=K.reduce((P,w)=>P.set(w.target,(P.get(w.target)||0)+1),new Map),O=K.reduce((P,w)=>{let r=`${w.source}->${w.target}`;return P.set(r,(P.get(r)||0)+1)},new Map),G=new Map,H=new Map,Z=new Map,V=new Map,L=new Map,M=new Map,N=K.reduce((P,w)=>{let r=U.get(w.source),S=U.get(w.target),T=(S?.column||0)-(r?.column||0);if(T<=0||String(w.edgeType||"").toLowerCase()==="rework"||T!==1)return P;let R=`${w.source}->column:${S?.column??""}`,m=P.get(R)||[];return m.push(w),P.set(R,m),P},new Map);for(let P of N.values()){if(P.length<2)continue;P.slice().sort((w,r)=>{let S=U.get(w.target),T=U.get(r.target);return(S?.y||0)-(T?.y||0)||w.index-r.index}).forEach((w,r,S)=>{M.set(Vl(w),{slot:r-(S.length-1)/2,count:S.length})})}[...K].sort((P,w)=>{let r=U.get(P.source),S=U.get(P.target),T=U.get(w.source),Y=U.get(w.target),R=Math.abs((S?.column||0)-(r?.column||0))*330+Math.abs((S?.y||0)-(r?.y||0)),m=Math.abs((Y?.column||0)-(T?.column||0))*330+Math.abs((Y?.y||0)-(T?.y||0));return R-m||P.index-w.index}).forEach((P)=>{let w=U.get(P.source)||{column:0,row:0,y:0},r=U.get(P.target)||{column:0,row:0,y:0},S=r.column-w.column,T=Math.max(0,S),Y=S<=0||String(P.edgeType||"").toLowerCase()==="rework",R=w.y-r.y,m=E.get(P.target)||1,p=M.has(Vl(P)),n=!Y&&T<=1&&(p||m===1),_f=L.get(P.target)||new Map;L.set(P.target,_f);let t=Bl.slice().sort((ff,Gf)=>{let zf=(Zf)=>{let h=String(Zf.side),g=0;if(Y){if(h==="left")g+=86;if(h==="top")g+=r.y<=0?-22:12;if(h==="bottom")g+=r.y>=0?-22:12;if(Math.abs(r.y)<12&&h!=="left")g+=P.index%2===0?h==="top"?-6:6:h==="bottom"?-6:6;return g}if(n){if(h==="left")g-=p?72:44;if(h!=="left")g+=p?72:44;return g+Math.abs(R)*0.02}if(h==="left")g+=T<=1?0:24;if(h==="top")g+=R<-36?-18:42;if(h==="bottom")g+=R>36?-18:42;if(T<=1&&Math.abs(R)<=82&&h!=="left")g+=38;if(T>1&&h!=="left")g-=10;return g},jf=w.y-r.y,Wf=jf!==0?jf:P.index%2===0?-1:1,Vf=(Zf)=>{let h=_f.get(Zf.id)||0;return zf(Zf)+h*64+rT(Zf,_f,Wf)};return Vf(ff)-Vf(Gf)||String(ff.id).localeCompare(String(Gf.id))})[0];_f.set(t.id,(_f.get(t.id)||0)+1),V.set(Vl(P),t)});let x=K.map((P)=>{let w=Eq(u,P.target).toLowerCase(),r=`${P.source}->${P.target}`,S=G.get(P.source)||0,T=H.get(P.target)||0,Y=Z.get(r)||0;G.set(P.source,S+1),H.set(P.target,T+1),Z.set(r,Y+1);let R=S-((q.get(P.source)||1)-1)/2,m=T-((E.get(P.target)||1)-1)/2,p=Y-((O.get(r)||1)-1)/2,n=U.get(P.source),_f=U.get(P.target),t=(_f?.column||0)-(n?.column||0),ff=Math.max(1,Math.abs(t)),Gf=t<=0||String(P.edgeType||"").toLowerCase()==="rework",zf=Math.abs((_f?.y||0)-(n?.y||0)),jf=M.get(Vl(P)),Wf=!Gf&&t===1&&(E.get(P.target)||0)>1,Vf=jf?jf.slot:p*2+R+m*0.45,Zf=Vf===0?P.index%2===0?-1:1:Math.sign(Vf),h=V.get(Vl(P))||Bl[1],g=h.side==="top"?-1:h.side==="bottom"?1:Zf,I=Gf||ff>1||zf>96||Math.abs(Vf)>0.2||h.side!=="left",$f=Gf?118+ff*18:22+ff*16,lf=h.side==="left"?0:28,Af=I?Math.max(-280,Math.min(280,g*Math.min(180,$f+lf+zf*0.22)+Vf*28)):0,Yf=Math.max(0,Math.min(Xl.length-1,Math.round(R+(Xl.length-1)/2))),xf=Xl[Yf]||Xl[1],sf=w==="succeeded"?"var(--accent-2)":w==="running"?"var(--accent)":w==="failed"?"var(--danger)":"rgba(129, 147, 159, 0.78)",j0=n?.column||0,u0=_f?.column||0,D0=Af===0?0:Math.sign(Af),Fu=Gf?`feedback:${j0}->${u0}:${D0}`:jf?`fanout:${j0}->${u0}:${P.source}`:Wf?`fanin:${j0}->${u0}:${P.target}`:h.side!=="left"||ff>1?`corridor:${j0}->${u0}:${h.side}:${D0}:${Math.round(Math.abs(Af)/56)}`:"";return{id:`${P.source}->${P.target}-${P.index}`,source:P.source,target:P.target,sourceHandle:xf.id,targetHandle:h.id,type:"pipelineCurve",zIndex:12,animated:w==="running",data:{baseEdgeColor:sf,laneOffset:Af,routeMode:jf&&h.side==="left"?"direct-forward-left":"",targetSide:h.side,isFeedback:Gf,overlapGroup:Fu},targetStatus:w}}),c=x.reduce((P,w)=>{let r=String(w.data?.overlapGroup||"");return r?P.set(r,(P.get(r)||0)+1):P},new Map),v=new Map,C=x.map((P)=>{let w=String(P.targetStatus||"pending"),r={...P};delete r.targetStatus;let S=String(P.data?.overlapGroup||""),T=S?c.get(S)||0:0,Y=T>1?v.get(S)||0:-1;if(T>1)v.set(S,Y+1);let R=Y>=0?Jq[Y%Jq.length]:String(P.data.baseEdgeColor),m={stroke:R};if(P.data.isFeedback)m.strokeDasharray="9 7";return{...r,data:{...P.data,edgeColor:R,overlapSlot:Y,overlapCount:T},style:m,markerEnd:{type:n_.ArrowClosed,color:R},className:`pipeline-flow-edge ${w} ${P.data.isFeedback?"feedback":""} ${Y>=0?"overlap-colored":""}`}});return{nodes:A,edges:C}}function wu(f){return String(f??"").replace(/&/g,"&").replace(//g,">").replace(/"/g,""")}function Oq(f){let u=String(f||"");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 d5(f){return`arrow-${f.replace(/[^a-zA-Z0-9_-]+/g,"")}`}function mq(f,u="pipeline"){return String(f||u).replace(/[^a-zA-Z0-9_-]+/g,"-").replace(/^-|-$/g,"")||u}function Xq(f,u){let _=f.position.x,y=f.position.y,$=Bl.find((l)=>l.id===u);if($?.side==="top")return{x:_+U$*Aq($.style?.left,0.5),y,position:Uf.Top};if($?.side==="bottom")return{x:_+U$*Aq($.style?.left,0.5),y:y+W$,position:Uf.Bottom};return{x:_,y:y+W$/2,position:Uf.Left}}function KM(f){return{x:f.position.x+U$,y:f.position.y+W$/2}}function ZM(f,u){let _=Math.min(...f.nodes.map((E)=>E.position.x),0)-220,y=Math.min(...f.nodes.map((E)=>E.position.y),0)-220,$=Math.max(...f.nodes.map((E)=>E.position.x+U$),1)+220,l=Math.max(...f.nodes.map((E)=>E.position.y+W$),1)+220,j=Math.ceil($-_),J=Math.ceil(l-y),F=new Map(f.nodes.map((E)=>[E.id,E])),A=f.edges.map((E)=>Oq(E.data?.edgeColor||E.style?.stroke)),z=Array.from(new Set(["#4eb7a8","#d7a13a","#cf6a54","#81939f",...A])).map((E)=>``).join(""),W=f.edges.flatMap((E)=>{let O=F.get(E.source),G=F.get(E.target);if(!O||!G)return[];let H=KM(O),Z=Xq(G,String(E.targetHandle||"in-left")),V=Sq(H.x,H.y,Z.x,Z.y,Z.position,Number(E.data?.laneOffset||0),String(E.data?.routeMode||"")),L=Oq(E.data?.edgeColor||E.style?.stroke),M=E.data?.isFeedback?' stroke-dasharray="9 7"':"";return``}).join(` +`),K=f.nodes.map((E)=>{let O=E.data?.exportLabel||{},G=String(O.status||"pending").toLowerCase(),H=G==="succeeded"?"#4eb7a8":G==="running"?"#d7a13a":G==="failed"?"#cf6a54":"#81939f",Z=E.position.x,V=E.position.y,L=Bl.map((M)=>{let N=Xq(E,M.id);if(M.side==="top"||M.side==="bottom")return``;return``}).join(` `);return` - + ${L} - - ${wu(O.id||V.id)} - ${wu(O.kind||"node")} - ${wu(O.componentRef||"--")} - ${wu(G)} + + ${wu(O.id||E.id)} + ${wu(O.kind||"node")} + ${wu(O.componentRef||"--")} + ${wu(G)} `}).join(` `);return{svg:` ${z} @@ -46,39 +46,39 @@ ${$} (查看原始JSON获取完整记录)`:""):null,U?Lf("details",{className:"c ${wu(u)} ${K}${W} - `,width:j,height:J}}function AM(f){let u=String(f||"").toLowerCase();if(u==="succeeded"||u==="completed")return"#4eb7a8";if(u==="failed")return"#cf6a54";if(wq(u))return"#69aee8";return"#d7a13a"}function QM(f){let u=String(f?.kind||""),_=String(f?.tone||f?.status||"").toLowerCase();if(u==="prompt"&&_==="initial")return"#d7a13a";if(u==="prompt"&&_==="monitor")return"#69aee8";if(u==="prompt")return"#4eb7a8";if(_==="modify")return"#e0b95a";if(_==="approve"||_==="guide"||_==="monitor")return"#4eb7a8";if(_==="restart"||_==="redo")return"#d7a13a";if(_==="ignored")return"#81939f";if(_==="webui")return"#69aee8";if(_==="cli")return"#d7a13a";return"#a7bac5"}function Hq(f){let u=String(f?.sourceKind||"").toLowerCase(),_=String(f?.action||"").toLowerCase(),y=String(f?.status||"").toLowerCase();if(_==="observe"||y==="observation"||u==="monitor")return"#4eb7a8";if(u==="webui")return"#69aee8";if(u==="cli")return"#d7a13a";if(y.includes("ignored"))return"#81939f";return"#8aa0ad"}function UM(f,u,_){let y=QM(f),l=String(f?.kind||"");if(l==="control-source")return``;if(l==="control-target"){let j=String(f?.tone||"").toLowerCase()==="approve"?"rgba(78,183,168,0.22)":"#081118";return``}return``}function WM(f){let u=Hf(f.visibleNodeIds).map((Y)=>String(Y||"")).filter(Boolean),_=Hf(f.intervals).filter(Xf),y=Hf(f.markers).filter(Xf),l=Hf(f.arrows).filter(Xf),$=Hf(f.ticks).filter(Xf),j=Xf(f.bounds)?f.bounds:{},J=Xf(f.backendLayout)?f.backendLayout:null,F=Math.max(240,Math.round(Number(f.chartHeight||360))),Q=Math.max(h1,108),U=128,z=24,W=58,K=56,q=128+Math.max(1,u.length)*Q,V=Math.max(760,q+48),O=114+F+24,G=24,H=58,Z=114,E=(Y)=>152+Y*Q,L=(Y)=>E(Y)+Q/2,M=Hf(f.meta).map((Y)=>String(Y||"")).filter(Boolean).slice(0,4).join(" · "),N=new Map(y.map((Y)=>[String(Y.id||""),Y])),R=Array.from(new Set(["#4eb7a8","#69aee8","#d7a13a","#cf6a54","#8aa0ad",...l.map(Hq)])).map((Y)=>``).join(""),p=$.map((Y)=>{let v=114+gq(Y,j,F,J);return` - - ${wu(z0(Y.ms))} - +${wu(l1(Number(Y.offsetMs??Number(Y.ms)-Number(j.startMs))))} + `,width:j,height:J}}function qM(f){let u=String(f||"").toLowerCase();if(u==="succeeded"||u==="completed")return"#4eb7a8";if(u==="failed")return"#cf6a54";if(rq(u))return"#69aee8";return"#d7a13a"}function HM(f){let u=String(f?.kind||""),_=String(f?.tone||f?.status||"").toLowerCase();if(u==="prompt"&&_==="initial")return"#d7a13a";if(u==="prompt"&&_==="monitor")return"#69aee8";if(u==="prompt")return"#4eb7a8";if(_==="modify")return"#e0b95a";if(_==="approve"||_==="guide"||_==="monitor")return"#4eb7a8";if(_==="restart"||_==="redo")return"#d7a13a";if(_==="ignored")return"#81939f";if(_==="webui")return"#69aee8";if(_==="cli")return"#d7a13a";return"#a7bac5"}function Nq(f){let u=String(f?.sourceKind||"").toLowerCase(),_=String(f?.action||"").toLowerCase(),y=String(f?.status||"").toLowerCase();if(_==="observe"||y==="observation"||u==="monitor")return"#4eb7a8";if(u==="webui")return"#69aee8";if(u==="cli")return"#d7a13a";if(y.includes("ignored"))return"#81939f";return"#8aa0ad"}function EM(f,u,_){let y=HM(f),$=String(f?.kind||"");if($==="control-source")return``;if($==="control-target"){let j=String(f?.tone||"").toLowerCase()==="approve"?"rgba(78,183,168,0.22)":"#081118";return``}return``}function VM(f){let u=Ef(f.visibleNodeIds).map((Y)=>String(Y||"")).filter(Boolean),_=Ef(f.intervals).filter(Nf),y=Ef(f.markers).filter(Nf),$=Ef(f.arrows).filter(Nf),l=Ef(f.ticks).filter(Nf),j=Nf(f.bounds)?f.bounds:{},J=Nf(f.backendLayout)?f.backendLayout:null,F=Math.max(240,Math.round(Number(f.chartHeight||360))),A=Math.max(h1,108),U=128,z=24,W=58,K=56,q=128+Math.max(1,u.length)*A,E=Math.max(760,q+48),O=114+F+24,G=24,H=58,Z=114,V=(Y)=>152+Y*A,L=(Y)=>V(Y)+A/2,M=Ef(f.meta).map((Y)=>String(Y||"")).filter(Boolean).slice(0,4).join(" · "),N=new Map(y.map((Y)=>[String(Y.id||""),Y])),x=Array.from(new Set(["#4eb7a8","#69aee8","#d7a13a","#cf6a54","#8aa0ad",...$.map(Nq)])).map((Y)=>``).join(""),c=l.map((Y)=>{let R=114+aq(Y,j,F,J);return` + + ${wu(z0(Y.ms))} + +${wu($1(Number(Y.offsetMs??Number(Y.ms)-Number(j.startMs))))} `}).join(` -`),x=['','TIME',...u.map((Y,v)=>{let m=E(v),c=Y.length>18?`${Y.slice(0,16)}…`:Y;return` - - ${wu(c)} - node ${v+1} +`),v=['','TIME',...u.map((Y,R)=>{let m=V(R),p=Y.length>18?`${Y.slice(0,16)}…`:Y;return` + + ${wu(p)} + node ${R+1} `})].join(` -`),C=u.map((Y,v)=>{return``}).join(` -`),P=_.map((Y)=>{let v=u.indexOf(String(Y.nodeId||""));if(v<0)return"";let m=114+o5(Y,j,F,J),c=Math.max(2,iq(Y,j,F,J)),o=AM(Y.status),ff=L(v)-3.5,n=Y.live?``:"",lf=c>=28?`${wu(String(Y.status||"working"))} - ${wu(l1(Y.durationMs))}`:"";return` - - ${n} - ${lf} +`),C=u.map((Y,R)=>{return``}).join(` +`),P=_.map((Y)=>{let R=u.indexOf(String(Y.nodeId||""));if(R<0)return"";let m=114+f2(Y,j,F,J),p=Math.max(2,oq(Y,j,F,J)),n=qM(Y.status),_f=L(R)-3.5,t=Y.live?``:"",ff=p>=28?`${wu(String(Y.status||"working"))} + ${wu($1(Y.durationMs))}`:"";return` + + ${t} + ${ff} `}).join(` -`),D=y.map((Y)=>{let v=u.indexOf(String(Y.nodeId||""));if(v<0)return"";let m=114+Iu(Y,j,F,J);return UM(Y,L(v),m)}).join(` -`),T=l.map((Y)=>{let v=N.get(String(Y.targetMarkerId||""));if(!v)return"";let m=N.get(String(Y.sourceMarkerId||"")),c=String(m?.nodeId||Y.sourceNodeId||""),o=String(v.nodeId||Y.targetNodeId||""),ff=u.indexOf(c),n=u.indexOf(o);if(ff<0||n<0)return"";let lf=L(ff)-24-128,Gf=L(n)-24-128,zf=Wl(J)?V0(Y.sourceY??Y.y1)??(m?Iu(m,j,F,J):Iu(v,j,F,J)):m?Iu(m,j,F,J):Iu(v,j,F,J),jf=Wl(J)?V0(Y.targetY??Y.y2)??Iu(v,j,F,J):Iu(v,j,F,J),Wf=Hq(Y),Vf=String(Y.action||"").toLowerCase()==="observe"?"3 4":"6 5",Kf=wu(nq(lf,zf,Gf,jf));return` - `}).join(` -`),S=u.length===0?'No visible Gantt nodes':"";return{svg:` - ${R} +`),w=y.map((Y)=>{let R=u.indexOf(String(Y.nodeId||""));if(R<0)return"";let m=114+Iu(Y,j,F,J);return EM(Y,L(R),m)}).join(` +`),r=$.map((Y)=>{let R=N.get(String(Y.targetMarkerId||""));if(!R)return"";let m=N.get(String(Y.sourceMarkerId||"")),p=String(m?.nodeId||Y.sourceNodeId||""),n=String(R.nodeId||Y.targetNodeId||""),_f=u.indexOf(p),t=u.indexOf(n);if(_f<0||t<0)return"";let ff=L(_f)-24-128,Gf=L(t)-24-128,zf=z$(J)?E0(Y.sourceY??Y.y1)??(m?Iu(m,j,F,J):Iu(R,j,F,J)):m?Iu(m,j,F,J):Iu(R,j,F,J),jf=z$(J)?E0(Y.targetY??Y.y2)??Iu(R,j,F,J):Iu(R,j,F,J),Wf=Nq(Y),Vf=String(Y.action||"").toLowerCase()==="observe"?"3 4":"6 5",Zf=wu(dq(ff,zf,Gf,jf));return` + `}).join(` +`),S=u.length===0?'No visible Gantt nodes':"";return{svg:` + ${x} ${wu(f.title||"Pipeline Epoch Gantt")} ${wu(M)} - ${x} + ${v} ${C} - ${p} + ${c} ${P} - ${T} - ${D} + ${r} + ${w} ${S} - `,width:V,height:O}}function s5(f,u){let _=URL.createObjectURL(f),y=document.createElement("a");y.href=_,y.download=u,y.click(),setTimeout(()=>URL.revokeObjectURL(_),1000)}async function hq(f,u){let _=bq(u,"pipeline"),{svg:y,width:l,height:$}=FM(f,u),j=new Blob([y],{type:"image/svg+xml;charset=utf-8"}),J=URL.createObjectURL(j);try{let F=new Image;await new Promise((W,K)=>{F.onload=()=>W(),F.onerror=()=>K(Error("svg image load failed")),F.src=J});let Q=document.createElement("canvas");Q.width=l,Q.height=$;let U=Q.getContext("2d");if(!U)throw Error("canvas unavailable");U.drawImage(F,0,0);let z=await new Promise((W)=>Q.toBlob(W,"image/png"));if(!z)throw Error("png export failed");s5(z,`${_}.png`)}catch{s5(j,`${_}.svg`)}finally{URL.revokeObjectURL(J)}}async function zM(f){let u=bq(String(f?.title||"pipeline-gantt"),"pipeline-gantt"),{svg:_,width:y,height:l}=WM(f),$=new Blob([_],{type:"image/svg+xml;charset=utf-8"}),j=URL.createObjectURL($);try{let J=new Image;await new Promise((z,W)=>{J.onload=()=>z(),J.onerror=()=>W(Error("gantt svg image load failed")),J.src=j});let F=document.createElement("canvas");F.width=y,F.height=l;let Q=F.getContext("2d");if(!Q)throw Error("canvas unavailable");Q.drawImage(J,0,0);let U=await new Promise((z)=>F.toBlob(z,"image/png"));if(!U)throw Error("gantt png export failed");s5(U,`${u}.png`)}catch{s5($,`${u}.svg`)}finally{URL.revokeObjectURL(j)}}async function GM(f){for(let u of f){if(u.flow.nodes.length===0)continue;await hq(u.flow,u.title),await new Promise((_)=>setTimeout(_,750))}}function Vq(f,u){return f.find((_)=>String(_?.pipelineId||"")===u)||null}function Eq(f){return Pf(f?.startedAt)??Pf(f?.artifact?.startedAt)??Pf(f?.request?.createdAt)??Pf(f?.updatedAt)??0}function KM(f,u){return f.filter((_)=>String(_?.pipelineId||"")===u).slice().sort((_,y)=>Eq(_)-Eq(y)||String(_?.runId||"").localeCompare(String(y?.runId||"")))}function mF(f,u){let _=String(u?.runId||""),y=f.findIndex((j)=>String(j?.runId||"")===_),l=y>=0?y+1:f.length,$=String(u?.status||"--");return`Epoch ${l} / ${_||"--"} / ${$}`}function $1(f){return String(f?.procedureRunId||f?.runId||"")}function f2(f,u){let _=String(f?.nodeId||f?.request?.nodeId||"");if(_)return _;let y=$1(f),l=`${u}__`;if(y.startsWith(l))return y.slice(l.length).replace(/__\d+$/u,"");return""}function I5(f,u){let _=Xf(f?.artifact)?f.artifact:{},y=Xf(f?.request)?f.request:{};return T6(f?.startedAt,_.startedAt,y.createdAt,y.startedAt,f?.createdAt,f?.updatedAt,u?.startedAt,u?.request?.createdAt)}function c5(f,u){let _=String(f?.status?.status||f?.artifact?.status||f?.status||"").toLowerCase(),y=Xf(f?.artifact)?f.artifact:{},l=nF(_);return T6(f?.finishedAt,y.finishedAt,f?.completedAt,l?f?.updatedAt:void 0,l?y.updatedAt:void 0,l?u?.updatedAt:void 0)}function Iq(f,u,_=Date.now()){let y=String(f?.runId||""),l=new Set(u.map(($)=>String($?.id||"")).filter(Boolean));return Hf(f?.procedureRuns).flatMap(($)=>{let j=f2($,y);if(!j)return[];let J=String($?.status?.status||$?.artifact?.status||$?.status||"unknown").toLowerCase(),F=I5($,f),Q=Pf(F);if(Q===null)return[];let U=c5($,f),z=Pf(U)??(nF(J)?Pf($?.updatedAt)??Q+1000:_),W=Math.max(Q+1000,z);return[{nodeId:j,knownNode:l.has(j),procedureRunId:$1($),status:J,startMs:Q,endMs:W,startedAt:B6(Q),finishedAt:B6(W),durationMs:W-Q,runId:y,raw:$}]}).sort(($,j)=>$.startMs-j.startMs||$.endMs-j.endMs||$.nodeId.localeCompare(j.nodeId))}function ZM(f,u,_=[]){let y=u.map((U)=>Number(U.startMs)).filter(Number.isFinite),l=u.map((U)=>Number(U.endMs)).filter(Number.isFinite);for(let U of _){let z=V0(U?.eventMs??U?.ms);if(z!==null)y.push(z),l.push(z)}let $=Pf(f?.startedAt)??Pf(f?.artifact?.startedAt)??Pf(f?.request?.createdAt),j=Pf(f?.finishedAt)??Pf(f?.artifact?.finishedAt)??Pf(f?.updatedAt);if($!==null)y.push($);if(j!==null)l.push(j);let J=Date.now(),F=y.length>0?Math.min(...y):J-60000,Q=Math.max(F+60000,l.length>0?Math.max(...l):J);return{startMs:F,endMs:Q,durationMs:Q-F}}var p5=12,cq=20,kF=100,qM=!1;function _y(f){let u=Number(f);if(!Number.isFinite(u))return 0;return Math.max(0,Math.min(100,Math.round(u*100)/100))}function HM(f){let u=Math.max(p5,Number(f||p5)),_=Math.log(u/p5)/Math.log(cq);return _y(_*100)}var D6=HM(kF);function eF(f){let u=_y(f)/100,_=p5*Math.pow(cq,u),y=u<0.24?"全局":u<0.64?"均衡":"细节";return{value:_y(u*100),pxPerMinute:_,label:y}}function vF(f){let u=Math.round(Number(f));return Math.abs(u-kF)<=1?kF:u}function VM(f,u=D6){let _=Math.max(1,Number(f.durationMs||0)/60000),y=eF(u);return Math.round(Math.max(360,Math.min(7200,_*Number(y.pxPerMinute||48))))}function EM(f,u=7){let _=Math.max(1,Number(f.endMs||0)-Number(f.startMs||0));return Array.from({length:u},(y,l)=>{let $=u===1?0:l/(u-1);return{ms:Number(f.startMs)+_*$,percent:$*100}})}function OM(f,u){let _=Math.max(1,Number(u.endMs)-Number(u.startMs));return Math.max(0,Math.min(100,(f-Number(u.startMs))/_*100))}function V0(f){let u=Number(f);return Number.isFinite(u)?u:null}function fA(f){return wq(f?.status)&&!nF(f?.status)}function pq(f,u,_,y){let l=Math.max(1,_-u),$=Math.max(0,Math.min(1,(f-u)/l));return Number(($*y).toFixed(3))}function Oq(f,u){if(!u)return null;let _=V0(u?.startMs),y=V0(u?.endMs),l=V0(u?.chartHeight);if(_===null||y===null||l===null)return null;return pq(f,_,y,l)}function mq(f,u){let _=V0(f?.rawStartMs??f?.startMs)??V0(f?.startMs)??u,y=V0(f?.endMs)??_+1000;if(!fA(f))return Math.max(_+1000,y);return Math.max(_+1000,y,u)}function XM(f,u,_,y){let l=V0(f?.startMs)??y-60000,$=V0(f?.endMs)??y,j=_.reduce((q,V)=>Math.max(q,mq(V,y)),$),J=Math.max(l+60000,$,j),F=Math.max(1,J-l),Q={startMs:l,endMs:J,durationMs:F},U=VM(Q,u),z=eF(u),W=Math.max(5,Math.min(18,Math.round(U/150))),K=EM(Q,W).map((q)=>{let V=Number(q.ms),O=pq(V,l,J,U);return{...q,y:O,timestamp:B6(V),offsetMs:V-l}});return{source:"frontend-y",startMs:l,endMs:J,durationMs:F,chartHeight:U,scale:_y(u),normalizedScale:Number((_y(u)/100).toFixed(3)),pxPerMinute:Number(Number(z.pxPerMinute||0).toFixed(3)),ticks:K}}function NM(f,u,_){if(!fA(f))return f;let y=V0(f?.rawStartMs??f?.startMs)??V0(f?.startMs)??_,l=mq(f,_),$=Oq(y,u),j=Oq(l,u),J=V0($??f?.y1??f?.startY)??0,F=V0(j??f?.y2??f?.endY)??J+10,Q=Math.max(24,F-J);return{...f,live:!0,startMs:y,endMs:l,durationMs:Math.max(1000,l-y),finishedAt:B6(l),y1:J,y2:F,startY:J,endY:F,height:Q}}function uA(f,u,_){return OM(f,u)/100*_}function Wl(f){return Boolean(f&&String(f?.source||"")!=="frontend-y")}function kq(f,u,_,y,l){if(Wl(y))for(let j of l){let J=V0(f?.[j]);if(J!==null)return J}let $=V0(f?.ms??f?.eventMs??f?.startMs);return uA($??Number(u.startMs),u,_)}function o5(f,u,_,y){return kq(f,u,_,y,["y1","startY"])}function iF(f,u,_,y){if(Wl(y)){let $=V0(f?.y2??f?.endY);if($!==null)return $}let l=V0(f?.endMs)??Number(u.endMs);return uA(l,u,_)}function iq(f,u,_,y){if(Wl(y)){let $=V0(f?.height);if($!==null)return Math.max(1,$)}let l=f?.live?24:10;return Math.max(l,iF(f,u,_,y)-o5(f,u,_,y))}function Iu(f,u,_,y){return kq(f,u,_,y,["y","timeAxisY"])}function gq(f,u,_,y){if(Wl(y)||String(y?.source||"")==="frontend-y"){let j=V0(f?.y);if(j!==null)return j}let l=V0(f?.percent);if(l!==null)return l/100*_;let $=V0(f?.ms)??Number(u.startMs);return uA($,u,_)}function LM(f){let u=String(f?.promptEvent||f?.raw?.promptEvent||f?.event||"").toLowerCase();if(!["node-long-running-observation","node-finished"].includes(u))return"";let _=String(f?.sourceNodeId||f?.raw?.sourceNodeId||f?.raw?.detail?.nodeId||""),y=String(f?.nodeId||f?.targetNodeId||"");return _&&_!==y?_:""}function YM(f,u){let _=new Set(u.map((l)=>[String(l.sourceNodeId||""),String(l.targetNodeId||""),String(l.targetMarkerId||""),String(l.action||"")].join(":"))),y=[...u];for(let l of f){let $=LM(l),j=String(l?.nodeId||""),J=String(l?.id||"");if(!$||!j||!J)continue;let F=[$,j,J,"observe"].join(":");if(_.has(F))continue;_.add(F),y.push({id:`observation-arrow:${J}:${$}:${j}`,commandId:String(l?.commandId||l?.eventId||J),sourceNodeId:$,targetNodeId:j,sourceMarkerId:"",targetMarkerId:J,sourceKind:"monitor",action:"observe",status:"observation"})}return{markers:f,arrows:y}}function Xq(f,u=""){let _=O1(f)||u,y=String(f?.promptEvent||"");if(_==="initial-prompt-delivered")return"initial";if(y==="node-finished"||y==="node-long-running-observation"||y.startsWith("monitor-"))return"monitor";if(_==="monitor-prompt-delivered"||String(f?.sourceKind||"").toLowerCase()==="monitor"||u==="monitor-prompt-queued")return"monitor";return"append"}function BM(f){return Hf(f?.tags||f?.raw?.tags).map((u)=>String(u||"")).filter(Boolean)}function Nq(f,u=""){let _=O1(f)||u,y=String(f?.promptEvent||"");if(_==="initial-prompt-delivered")return"初始 prompt";if(y==="node-long-running-observation")return"长任务观察";if(y==="node-finished")return BM(f).includes("monitor.audit")?"节点完成 / OA 审核":"节点完成";if(y==="monitor-interval")return"旧版轮询";if(y==="monitor-start")return"Monitor start";if(y==="monitor-stop")return"Monitor stop";if(_==="monitor-prompt-delivered"||u==="monitor-prompt-queued")return"Monitor prompt";if(_==="append-prompt-queued")return"追加 prompt 已排队";return"追加 prompt"}function Lq(f){let u=O1(f);if(u==="control-command-applied")return 3;if(u==="control-command-ignored")return 2;if(u==="control-command-queued")return 1;return 0}function Yq(f,u){let _=String(f?.commandId||"");if(_)return`command:${_}`;return["fallback",sy(f)||T6(f?.createdAt,f?.timestamp)||`index-${u}`,String(f?.sourceKind||""),String(f?.sourceNodeId||""),String(f?.targetNodeId||""),oy(f)].join(":")}function wM(f){return cF([f?.targetNodeId,...Hf(f?.resetNodeIds)])}function DM(f,u){let _=L6(f),y=O1(f),l=String(f?.targetNodeId||""),$=Boolean(l)&&u!==l;if(y==="control-command-applied")return $?`${_} 波及`:`${_} 生效`;if(y==="control-command-ignored")return`${_} 忽略`;if(y==="control-command-queued")return`${_} 已发起`;return $?`${_} 波及`:_}function TM(f){if(O1(f)==="control-command-ignored")return"ignored";let _=oy(f);if(_==="restart"||_==="redo")return"restart";if(_==="modify")return"modify";if(_==="approve")return"approve";if(_==="guide")return"guide";return"pending"}function MM(f){let u=String(f?.sourceKind||"").toLowerCase();if(u==="monitor")return"monitor";if(u==="webui")return"webui";if(u==="cli")return"cli";return"system"}function rM(f,u,_,y){let l=f.filter((Q)=>String(Q.nodeId||"")===u).sort((Q,U)=>Number(Q.startMs)-Number(U.startMs)),$=l.find((Q)=>_>=Number(Q.startMs)-1000&&_<=Number(Q.endMs)+1000);if($)return{ms:_,onInterval:!0,snapReason:"inside-interval",procedureRunId:String($.procedureRunId||"")};let j=oy(y),J=l.slice().reverse().find((Q)=>Number(Q.endMs)<=_+1000);if(J&&j==="approve")return{ms:Number(J.endMs),onInterval:!0,snapReason:"previous-interval-end",procedureRunId:String(J.procedureRunId||"")};let F=l.find((Q)=>Number(Q.startMs)>=_-1000);if(F&&["guide","modify","restart","redo"].includes(j))return{ms:Number(F.startMs),onInterval:!0,snapReason:"next-interval-start",procedureRunId:String(F.procedureRunId||"")};return{ms:_,onInterval:!1,snapReason:"event-time",procedureRunId:String(y?.procedureRunId||"")}}function nq(f,u,_,y){let l=Math.hypot(_-f,y-u),$=l>lq?lq:0,j=$>0?_-(_-f)/l*$:_,J=$>0?y-(y-u)/l*$:y,F=j-f,Q=Math.max(16,Math.min(42,Math.abs(F)*0.45+12)),U=F===0?1:Math.sign(F);return`M ${f},${u} C ${f+U*Q},${u} ${j-U*Q},${J} ${j},${J}`}function SM(f,u){let _=String(f?.runId||u?.runId||""),y=Iq({...Xf(u)?u:{},...Xf(f)?f:{},runId:_,procedureRuns:Hf(f?.procedureRuns).length>0?f.procedureRuns:u?.procedureRuns},[]),l=[],$=[],j=[],J=new Set,F=new Map,Q=(W,K)=>{if(!W.nodeId||!Number.isFinite(Number(W.ms)))return;if(J.has(W.id))return;J.add(W.id),K.push(W)};for(let W of Hf(f?.procedureRuns)){let K=f2(W,_),q=$1(W);if(!K)continue;for(let V of Hf(W?.attempts)){let O=e5(V),G=new Set,H=new Set;for(let E of N6(V?.controlEventRecords)){let L=O1(E);if(!["initial-prompt-delivered","append-prompt-delivered","monitor-prompt-delivered"].includes(L))continue;let M=sy(E),N=Pf(M);if(N===null)continue;let w=String(E?.eventId||"");if(w)G.add(w);H.add(`${L}:${M}:${String(E?.sourceKind||"")}:${String(E?.promptPreview||"")}`),Q({id:`prompt:${w||`${q}:${O}:${L}:${N}`}`,runId:_,nodeId:K,procedureRunId:q,attempt:O,kind:"prompt",tone:Xq(E,L),status:"delivered",label:Nq(E,L),ms:N,timestampIso:M,sourceKind:String(E?.sourceKind||""),sourceNodeId:String(E?.sourceNodeId||""),targetNodeId:K,action:"",eventId:w,commandId:String(E?.commandId||""),raw:E},l)}let Z=[{records:N6(V?.controlPromptRecords),fallbackKind:"append-prompt-queued"},{records:N6(V?.monitorPromptRecords),fallbackKind:"monitor-prompt-queued"}];for(let E of Z)for(let L of E.records){let M=sy(L),N=Pf(M);if(N===null)continue;let w=String(L?.eventId||"");if(w&&G.has(w))continue;let p=`${E.fallbackKind==="monitor-prompt-queued"?"monitor-prompt-delivered":"append-prompt-delivered"}:${M}:${String(L?.sourceKind||"")}:${String(L?.promptPreview||"")}`;if(H.has(p))continue;Q({id:`prompt-fallback:${w||`${q}:${O}:${E.fallbackKind}:${N}`}`,runId:_,nodeId:K,procedureRunId:q,attempt:O,kind:"prompt",tone:Xq(L,E.fallbackKind),status:"queued",label:Nq(L,E.fallbackKind),ms:N,timestampIso:M,sourceKind:String(L?.sourceKind||""),sourceNodeId:String(L?.sourceNodeId||""),targetNodeId:K,action:"",eventId:w,commandId:String(L?.commandId||""),raw:L},l)}}}let U=new Map;N6(f?.controlEvents).forEach((W,K)=>{let q=Yq(W,K),V=U.get(q)||{key:q,events:[],commands:[]};V.events.push(W),U.set(q,V)}),Hf(f?.controlCommands).filter(Xf).forEach((W,K)=>{let q=Yq(W,K),V=U.get(q)||{key:q,events:[],commands:[]};V.commands.push(W),U.set(q,V)});for(let W of U.values()){let K=Hf(W.events).slice().sort((C,P)=>Lq(P)-Lq(C)),q=Hf(W.commands),V=Hf(W.events).find((C)=>O1(C)==="control-command-queued")||q[0]||null,O=K[0]||q[0]||V;if(!V&&!O)continue;let G=String(V?.sourceNodeId||O?.sourceNodeId||""),H=String(V?.sourceKind||O?.sourceKind||""),Z=sy(V)||sy(O)||T6(V?.createdAt,O?.createdAt),E=Pf(Z),L=String(O?.commandId||V?.commandId||W.key),M=(O1(O)||"control-command-queued").replace(/^control-command-/u,""),N="";if(G&&E!==null)N=`control-source:${L}:${G}`,F.set(L,N),Q({id:N,runId:_,nodeId:G,procedureRunId:String(V?.procedureRunId||O?.procedureRunId||""),attempt:"",kind:"control-source",tone:MM(V||O),status:M,label:`${L6(V||O)} 发起`,ms:E,timestampIso:Z,action:oy(V||O),sourceKind:H,sourceNodeId:G,targetNodeId:String(O?.targetNodeId||V?.targetNodeId||""),commandId:L,raw:V||O},$);let w=O||V,R=sy(w)||Z,p=Pf(R);if(p===null)continue;let x=wM(w);for(let C of x){let P=rM(y,C,p,w),D=`control-target:${L}:${C}`;if(Q({id:D,runId:_,nodeId:C,procedureRunId:P.procedureRunId,attempt:"",kind:"control-target",tone:TM(w),status:M,label:DM(w,C),ms:P.ms,eventMs:p,onInterval:P.onInterval,snapReason:P.snapReason,snapped:Number(P.ms)!==p,timestampIso:R,renderedTimestampIso:B6(Number(P.ms)),action:oy(w),sourceKind:H,sourceNodeId:G,targetNodeId:C,commandId:L,raw:w},$),N&&G&&G!==C)j.push({id:`control-arrow:${L}:${G}:${C}`,commandId:L,sourceNodeId:G,targetNodeId:C,sourceMarkerId:N,targetMarkerId:D,sourceKind:H,action:oy(w),status:M})}}let z=[...l,...$].sort((W,K)=>Number(W.ms)-Number(K.ms)||String(W.nodeId).localeCompare(String(K.nodeId))||String(W.id).localeCompare(String(K.id)));return{...YM(z,j),sourceMarkerByCommand:F}}function PM({details:f,selectedNodeId:u,selectedNodeRuntime:_,control:y,onRaw:l}){if(!f)return X("span",{className:"muted"},"点击“抓取过程”读取 node 运行材料;主界面只显示结构化摘要,完整内容需点开原始 JSON。");let $=Hf(f.procedureRuns),j=$.at(-1)||{},J=Hf(j.attempts),F=J.at(-1)||{},Q=Hf(j.workerLogTail),U=Hf(F.controlEventsTail),z=Hf(F.controlPromptsTail),W=Hf(F.monitorPromptsTail),K=PF(U),q=PF(z),V=PF(W),O=F.opencodeMessages||{};return X("div",{className:"pipeline-evidence-list compact"},X(y1,{title:"Node runtime",subtitle:u||"--",facts:[`status ${_?.status||"pending"}`,`attempts ${_?.attempts??J.length}`,`procedure ${_?.currentProcedureRunId||$1(j)||"--"}`,y.fetchedAt?`fetched ${a5(y.fetchedAt)}`:"not fetched"],data:f.node||f,onRaw:l,testId:"raw-pipeline-node-runtime"}),X(y1,{title:"Procedure runs",subtitle:`${$.length} groups`,facts:[`latest ${j.status?.status||j.status||"--"}`,`steps ${Hf(j.recentSteps).length}`,`duration ${l1(Pf(j.finishedAt)&&Pf(j.startedAt)?Number(Pf(j.finishedAt))-Number(Pf(j.startedAt)):j.durationMs)}`],data:$,onRaw:l,testId:"raw-pipeline-node-procedures"}),X(y1,{title:"OpenCode messages",subtitle:String(O.exists?"available":"not indexed"),facts:[`messages ${k5(O.messageCount)}`,`size ${k5(O.size)}`,`updated ${z0(O.updatedAt)}`],data:O,onRaw:l,testId:"raw-pipeline-node-messages"}),X(y1,{title:"Control prompts",subtitle:"manual / monitor append queues",facts:[`manual tail ${q.total}`,`monitor tail ${V.total}`,`last ${z0(gF(q.lastAt,V.lastAt))}`],data:{controlPromptsTail:z,monitorPromptsTail:W},onRaw:l,testId:"raw-pipeline-node-prompts"}),X(y1,{title:"Control events",subtitle:K.eventKinds.length>0?K.eventKinds.join(", "):"event tail",facts:[`tail ${K.total}`,`parsed ${K.parsed}`,`last ${z0(K.lastAt)}`],data:U,onRaw:l,testId:"raw-pipeline-node-events"}),X(y1,{title:"Worker log",subtitle:"tail is hidden on main canvas",facts:[`tail ${Q.length} lines`,"raw only via button",`procedure ${$1(j)||"--"}`],data:Q,onRaw:l,testId:"raw-pipeline-node-worker-log"}))}function CM({activeRun:f,onRaw:u}){if(!f)return X(cu,{title:"暂无运行材料",text:"没有 Pipeline epoch 时不会展示运行材料索引。"});let _=Hf(f.nodes),y=Hf(f.procedureRuns),l=Hf(f.submissions),$=Hf(f.workerLogTail),j=Jq(_),J=Jq(y),F=y.filter((U)=>String(U?.status||"").toLowerCase()==="failed"),Q=gF(...y.flatMap((U)=>[U.updatedAt,U.finishedAt,U.startedAt]));return X("div",{className:"pipeline-evidence-list"},X(y1,{title:"Epoch overview",subtitle:f.runId||"--",facts:[`pipeline ${f.pipelineId||"--"}`,`status ${f.status||"--"}`,`started ${z0(f.startedAt)}`,`updated ${z0(f.updatedAt)}`],data:f,onRaw:u,testId:"raw-pipeline-run"}),X(y1,{title:"Node states",subtitle:`${_.length} nodes`,facts:[`running ${j.running||0}`,`succeeded ${j.succeeded||0}`,`failed ${j.failed||0}`,`pending ${j.pending||0}`],data:_,onRaw:u,testId:"raw-pipeline-run-nodes"}),X(y1,{title:"Procedure run index",subtitle:`${y.length} procedure records`,facts:[`succeeded ${J.succeeded||0}`,`failed ${J.failed||0}`,`latest ${z0(Q)}`,`errors ${F.length}`],data:y,onRaw:u,testId:"raw-pipeline-run-procedures"}),X(y1,{title:"OA submissions",subtitle:`${l.length} submission files`,facts:[`records ${l.length}`,`task ${k5(f.task)}`,"raw grouped by run"],data:l,onRaw:u,testId:"raw-pipeline-run-submissions"}),X(y1,{title:"Worker log tail",subtitle:"hidden from main interface",facts:[`tail ${$.length} lines`,"display raw only after click",`updated ${z0(f.updatedAt)}`],data:$,onRaw:u,testId:"raw-pipeline-run-worker-log"}))}function RM({diagnostics:f,onRaw:u}){let _=Hf(f?.runs).filter(Xf),y=Hf(f?.forbiddenResiduals),l=Xf(f?.guarantees)?f.guarantees:{},$=f?.hasNeutralNodeFinishedEvidence===!0&&f?.hasNoAuditPolicyEvidence===!0&&f?.hasAuditPolicyEvidence===!0,j=f?.ok===!0&&$&&y.length===0,J=_[0]||null,F=[{label:"中性完成事实",ok:l.neutralNodeFinished===!0,hint:"node-finished 不携带流程策略"},{label:"Config 策略判定",ok:l.auditPolicyFromConfig===!0,hint:"OA backend 读取当前 epoch 配置"},{label:"控制命令来自 OA",ok:l.runnerConsumesControlCommandsFromOaEvents===!0,hint:"runner 只消费 OA control.command"},{label:"无独立审核事件",ok:l.noIndependentAuditRequestEvent===!0,hint:"审核由 node-finished + policy 派生"},{label:"无批次门禁",ok:l.noBatchFinishedControlGate===!0,hint:"下游启动由每个 node 完成驱动"}];return X("div",{className:"pipeline-oa-panel","data-testid":"pipeline-oa-event-flow-panel"},X("div",{className:"metric-grid compact"},X(Hu,{label:"OA Flow",value:j?"100%":"--",hint:String(f?.mode||"waiting diagnostics"),tone:j?"ok":"warn"}),X(Hu,{label:"禁止残留",value:y.length,hint:y.length===0?"source scan clean":"needs cleanup",tone:y.length===0?"ok":"warn"}),X(Hu,{label:"No-audit",value:f?.hasNoAuditPolicyEvidence?"OK":"--",hint:"OA 下游策略证据",tone:f?.hasNoAuditPolicyEvidence?"ok":"warn"}),X(Hu,{label:"Monitor 审核",value:f?.hasAuditPolicyEvidence?"OK":"--",hint:"OA 控制事件闭环",tone:f?.hasAuditPolicyEvidence?"ok":"warn"})),X("div",{className:"pipeline-oa-guarantees"},F.map((Q)=>X("article",{key:Q.label,className:`pipeline-oa-guarantee ${Q.ok?"ok":"warn"}`},X(uy,{status:Q.ok?"online":"warn"},Q.ok?"OK":"MISS"),X("div",null,X("strong",null,Q.label),X("span",null,Q.hint))))),X("div",{className:"pipeline-evidence-list compact"},_.slice(0,6).map((Q)=>X(y1,{key:Q.runId,title:String(Q.runId||"--"),subtitle:[Number(Q.monitorAuditNodeFinishedCount||0)>0?"monitor audit":"",Number(Q.noAuditPolicyCount||0)>0?"no-audit policy":""].filter(Boolean).join(" / ")||"event evidence",facts:[`events ${Q.eventCount||0}`,`node-finished ${Q.nodeFinishedCount||0}`,`policy-in-detail ${Q.nodeFinishedWithPolicyCount||0}`,`queued ${Q.controlQueuedCount||0}`,`applied ${Q.controlAppliedCount||0}`],data:Q,onRaw:u,testId:`raw-pipeline-oa-run-${String(Q.runId||"run").replace(/[^a-zA-Z0-9_.-]+/g,"-")}`}))),J?X("p",{className:"muted paragraph"},`最新证据 ${J.runId}: ${J.nodeFinishedCount||0} 个 node-finished,${J.controlAppliedCount||0} 个控制结果。`):X(cu,{title:"暂无 OA 事件流证据",text:"等待 Pipeline backend 暴露 diagnostics。"}),f?X("div",{className:"panel-actions inline-actions"},X(X1,{title:"Pipeline OA Event Flow Diagnostics",data:f,onOpen:u,testId:"raw-pipeline-oa-event-flow"})):null)}function xM({quota:f,onRaw:u}){let _=Xf(f?.summary)?f.summary:{},y=Xf(f?.target)?f.target:{},l=Xf(f?.cache)?f.cache:{},$=f?.ok===!0,j=String(f?.modelId||_.modelName||y.modelName||"MiniMax-M2.7"),J=_.totalCount??y.currentIntervalTotalCount,F=_.usageCount??y.currentIntervalUsageCount,Q=_.remainingCount??y.currentIntervalRemainingCount,U=_.remainingRatio??(Number.isFinite(Number(J))&&Number(J)>0&&Number.isFinite(Number(Q))?Number(Q)/Number(J):void 0),z=_.usageRatio??(Number.isFinite(Number(J))&&Number(J)>0&&Number.isFinite(Number(F))?Number(F)/Number(J):void 0),W=_.resetAt||y.endAt,K=_.remainsMs??y.remainsMs,q=Number(Q),V=!$||Number.isFinite(q)&&q<=0?"warn":"ok",O=[$?`endpoint ${f?.endpoint||"--"}`:"quota unavailable",`fetched ${m5(f?.fetchedAt)}`,l.hit?`cache ${l1(l.ageMs)}`:"live quota"];return X("div",{className:"pipeline-minimax-quota-panel","data-testid":"pipeline-minimax-quota-panel"},X("div",{className:"metric-grid compact"},X(Hu,{label:"MiniMax",value:$?j:"--",hint:f?.modelComponent||f?.error||"model/minimax-m27",tone:V}),X(Hu,{label:"当前窗口",value:`${SF(F)}/${SF(J)}`,hint:`已用 ${jq(z)}`,tone:V}),X(Hu,{label:"剩余额度",value:SF(Q),hint:`剩余 ${jq(U)}`,tone:V}),X(Hu,{label:"重置时间",value:m5(W),hint:K!==void 0?`约 ${l1(K)}`:z0(W),tone:V})),X(tF,{items:O}),$?X("p",{className:"muted paragraph"},`MiniMax 限额来自 D601 Pipeline 后端实时查询;当前模型匹配 ${_.modelName||y.modelName||j}。`):X(H0,{error:f?.error||"MiniMax 限额查询失败"}),f?X("div",{className:"panel-actions inline-actions"},X(X1,{title:"Pipeline MiniMax Quota",data:f,onOpen:u,testId:"raw-pipeline-minimax-quota"})):null)}function vM({epochs:f,activeRun:u,activePipeline:_,pipelineNodes:y,pipelineEdges:l,runDetails:$,nodeDetails:j,nodeDetailsState:J,ganttScale:F=D6,onGanttScaleChange:Q,onRunChange:U,onIntervalSelect:z,onMarkerSelect:W,selection:K,detailOpen:q,onDetailOpenChange:V,onRaw:O}){let[G,H]=Bu(qM),[Z,E]=Bu({startY:0,endY:0,startMs:0,endMs:0}),[L,M]=Bu(Date.now()),N=e_(null),w=String(u?.runId||""),R=Boolean(q),p=(uf)=>{if(typeof V==="function")V(uf)},x=_y(F??D6),C=String($?.runId||"")===w?$?.details:null,P=C?{...Xf(u)?u:{},...Xf(C)?C:{},runId:w,procedureRuns:Hf(C?.procedureRuns).length>0?C.procedureRuns:u?.procedureRuns}:u,D=Iq(P,y,L),T=C?SM(C,P):{markers:[],arrows:[]},S=Hf(T.markers),r=ZM(P,D,S),Y=XM(r,x,D,L),v=String(Y.source||"frontend-y"),m=D.map((uf)=>NM(uf,Y,L)),c={startMs:Number(Y.startMs),endMs:Number(Y.endMs),durationMs:Math.max(1,Number(Y.durationMs??Number(Y.endMs)-Number(Y.startMs)))},o=eF(x),ff={...o,pxPerMinute:Number(Y.pxPerMinute??o.pxPerMinute)},n=Math.round(Number(Y.chartHeight||360)),lf=D.some(fA);c1(()=>{if(!w||!lf)return;let uf=window.setInterval(()=>M(Date.now()),1000);return()=>window.clearInterval(uf)},[w,lf]);let Gf=jM(_,y,Array.isArray(l)?l:[]),zf=y.map((uf)=>String(uf?.id||"")).filter(Boolean),jf=m.map((uf)=>String(uf.nodeId||"")).filter(Boolean),Wf=S.map((uf)=>String(uf.nodeId||"")).filter(Boolean),Vf=Array.from(new Set([...Gf,...zf,...jf,...Wf])),Kf={startY:0,endY:n,startMs:Number(c.startMs),endMs:Number(c.endMs)},h=Number(Z?.endY||0)>0?Z:Kf,g=(uf)=>{return o5(uf,c,n,Y)<=Number(h.endY)&&iF(uf,c,n,Y)>=Number(h.startY)},I=(uf)=>{let vf=Iu(uf,c,n,Y);return vf>=Number(h.startY)&&vf<=Number(h.endY)},yf=new Set(Vf.filter((uf)=>m.some((vf)=>vf.nodeId===uf&&g(vf))||S.some((vf)=>vf.nodeId===uf&&I(vf)))),$f=G?Vf.filter((uf)=>yf.has(uf)):Vf,Qf=`${MF}px ${$f.length>0?$f.map(()=>`${h1}px`).join(" "):"minmax(160px, 1fr)"}`,Yf=Hf(Y.ticks).filter(Xf),xf=String(K?.mode==="interval"?K?.interval?.procedureRunId||"":""),tf=String(K?.mode==="event"?K?.marker?.id||"":""),j0=()=>{let uf=N.current;if(!uf){E(Kf);return}let vf=Math.max(0,uf.scrollTop-rF),a0=Math.max(120,uf.clientHeight-rF),Bf=Math.min(n,vf+a0),v0={startY:vf,endY:Bf,startMs:Number(c.startMs),endMs:Number(c.endMs)},i0=Math.max(0,Math.min(1,vf/n)),d0=Math.max(i0,Math.min(1,Bf/n)),b0=Math.max(1,Number(c.endMs)-Number(c.startMs));v0.startMs=Number(c.startMs)+b0*i0,v0.endMs=Number(c.startMs)+b0*d0,E(v0)};c1(()=>{let uf=N.current,vf=window.setTimeout(j0,0);return uf?.addEventListener("scroll",j0),window.addEventListener("resize",j0),()=>{window.clearTimeout(vf),uf?.removeEventListener("scroll",j0),window.removeEventListener("resize",j0)}},[w,c.startMs,c.endMs,n]);let u0=Math.max(0,Vf.length-$f.length),D0=new Set(S.filter((uf)=>$f.includes(String(uf.nodeId||""))&&I(uf)).map((uf)=>String(uf.id))),Fu=new Map(S.map((uf)=>[String(uf.id),uf])),O0=Hf(T.arrows).filter((uf)=>{if(!D0.has(String(uf.targetMarkerId||"")))return!1;if(String(uf.action||"")==="observe")return $f.includes(String(uf.sourceNodeId||""));return D0.has(String(uf.sourceMarkerId||""))}),x0=MF+Math.max(1,$f.length)*h1,ku=(uf)=>{let vf=_y(uf.target.value);if(typeof Q==="function")Q(vf);window.setTimeout(j0,0)},X0=()=>zM({title:`${_?.id||"pipeline"}-${w||"epoch"}-gantt`,meta:[`run ${w||"--"}`,`${z0(c.startMs)} -> ${z0(c.endMs)}`,`duration ${l1(c.durationMs)}`,`${ff.label} / ${vF(ff.pxPerMinute)} px/min`,`${$f.length}/${Vf.length} nodes`,`${S.length} markers`],visibleNodeIds:$f,intervals:m,markers:S.filter((uf)=>$f.includes(String(uf.nodeId||""))),arrows:O0,ticks:Yf,bounds:c,chartHeight:n,backendLayout:Y}),Au=Xf(C?.gantt?.diagnostics)?C.gantt.diagnostics:null;return X(I1,{title:"Epoch 甘特图",eyebrow:`${_?.id||"pipeline"} / ${f.length} epochs`,className:"pipeline-wide-panel",actions:X("div",{className:"pipeline-gantt-actions"},X("select",{value:w,disabled:f.length===0,onChange:(uf)=>U(uf.target.value),"data-testid":"pipeline-epoch-select"},f.map((uf)=>X("option",{key:uf.runId,value:uf.runId},mF(f,uf)))),X("label",{className:"pipeline-gantt-toggle"},X("input",{type:"checkbox","data-testid":"pipeline-gantt-auto-hide-idle",checked:G,onChange:(uf)=>{H(Boolean(uf.target.checked)),window.setTimeout(j0,0)}}),X("span",null,"自动隐藏空闲列")),X("label",{className:"pipeline-gantt-scale"},X("span",null,X("b",null,"时间尺度"),X("em",{"data-testid":"pipeline-gantt-scale-label"},`${ff.label} · ${vF(ff.pxPerMinute)} px/min`)),X("input",{type:"range",min:0,max:100,step:0.01,value:x,onChange:ku,"aria-label":"调整甘特图时间尺度","data-testid":"pipeline-gantt-time-scale"}),X("small",null,X("span",null,"全局"),X("span",null,"细节"))),u?X("button",{type:"button",className:"ghost-btn",onClick:X0,disabled:$f.length===0,"data-testid":"pipeline-export-gantt"},"导出甘特图"):null,u?X(X1,{title:`Pipeline Epoch ${u.runId}`,data:u,onOpen:O,testId:"raw-pipeline-epoch-gantt"}):null)},!u?X(cu,{title:"暂无 Epoch",text:"当前 pipeline 还没有完整运行记录。"}):m.length===0?X(cu,{title:"暂无时间区间",text:"等待 D601 Pipeline backend 在 procedure summary 中返回 startedAt / finishedAt。"}):X("div",{className:"pipeline-gantt-wrap"},X("div",{className:`pipeline-gantt-detail-layout ${R?"detail-open":"detail-collapsed"}`,"data-testid":"pipeline-gantt-detail-layout","data-sidebar-open":R?"true":"false"},X("div",{className:"pipeline-gantt-main"},X("div",{className:"pipeline-gantt-main-head"},X("div",{className:"pipeline-gantt-meta"},X("span",null,`time ${z0(c.startMs)} -> ${z0(c.endMs)}`),X("span",null,`duration ${l1(c.durationMs)}`),X("span",null,`scale ${ff.label} / ${vF(ff.pxPerMinute)} px/min`),X("span",null,`layout ${v}`),Au?X("span",null,`align ${Au.timeAxisAlignmentOk===!1?"check":"ok"}`):null,X("span",null,`visible ${$f.length}/${Vf.length} nodes`),C?X("span",null,`markers ${S.length}`):null,G&&u0>0?X("span",null,`hidden idle ${u0}`):null),!R?X("button",{type:"button",className:"pipeline-sidecar-tab right",disabled:!K?.mode,onClick:()=>p(!0),"data-testid":"pipeline-gantt-sidebar-toggle"},K?.mode?"展开详情":"点击甘特图元素展开详情"):null),X("div",{className:"pipeline-gantt-viewport",ref:N,"data-testid":"pipeline-epoch-gantt","data-pipeline-id":_?.id||"","data-run-id":w,"data-layout-source":v,"data-start-ms":String(c.startMs),"data-end-ms":String(c.endMs),"data-chart-height":String(n)},X("div",{className:"pipeline-gantt-board",style:{gridTemplateColumns:Qf,minWidth:`${x0}px`}},X("div",{className:"pipeline-gantt-head time"},"Time"),$f.length===0?X("div",{className:"pipeline-gantt-head empty"},"当前时间窗无工作节点"):$f.map((uf)=>X("div",{key:`head-${uf}`,className:"pipeline-gantt-head node",title:uf,"data-testid":"pipeline-gantt-head-node","data-node-id":uf},X(cT,{value:uf}))),X("div",{className:"pipeline-gantt-time-axis",style:{height:`${n}px`}},Yf.map((uf)=>{let vf=gq(uf,c,n,Y);return X("div",{key:`tick-${uf.ms}-${vf}`,className:"pipeline-gantt-tick",style:{top:`${vf}px`},"data-testid":"pipeline-gantt-tick","data-ms":String(uf.ms),"data-y":String(vf)},X("b",null,z0(uf.ms)),X("span",null,`+${l1(Number(uf.offsetMs??Number(uf.ms)-Number(c.startMs)))}`))})),$f.length>0?X("svg",{className:"pipeline-gantt-arrow-layer",width:$f.length*h1,height:n,viewBox:`0 0 ${$f.length*h1} ${n}`,style:{left:`${MF}px`,top:`${rF}px`,width:`${$f.length*h1}px`,height:`${n}px`},"aria-hidden":"true"},X("defs",null,X("marker",{id:"pipeline-gantt-arrowhead",viewBox:"0 0 10 10",refX:9,refY:5,markerWidth:6,markerHeight:6,orient:"auto-start-reverse"},X("path",{d:"M 0 0 L 10 5 L 0 10 z",fill:"context-stroke"}))),O0.map((uf)=>{let vf=Fu.get(String(uf.targetMarkerId||""));if(!vf)return null;let a0=Fu.get(String(uf.sourceMarkerId||"")),Bf=String(a0?.nodeId||uf.sourceNodeId||""),v0=$f.indexOf(Bf),i0=$f.indexOf(String(vf.nodeId||""));if(v0<0||i0<0)return null;let d0=v0*h1+h1/2,b0=i0*h1+h1/2,m1=a0?Iu(a0,c,n,Y):Iu(vf,c,n,Y),ef=Iu(vf,c,n,Y);return X("path",{key:uf.id,className:`pipeline-gantt-arrow ${String(uf.sourceKind||"").toLowerCase()} ${String(uf.status||"").toLowerCase()} ${String(uf.action||"").toLowerCase()}`,d:nq(d0,m1,b0,ef),markerEnd:"url(#pipeline-gantt-arrowhead)","data-testid":String(uf.action||"")==="observe"?"pipeline-gantt-observation-arrow":"pipeline-gantt-arrow","data-source-node-id":String(uf.sourceNodeId||""),"data-target-node-id":String(uf.targetNodeId||""),"data-target-marker-id":String(uf.targetMarkerId||""),"data-action":String(uf.action||""),"data-source-y":String(m1),"data-target-y":String(ef)})})):null,$f.length===0?X("div",{className:"pipeline-gantt-empty-col",style:{height:`${n}px`}},"滚动到有活动的时间段后,相关 node 列会自动出现。"):$f.map((uf)=>{let vf=m.filter((Bf)=>Bf.nodeId===uf),a0=S.filter((Bf)=>String(Bf.nodeId||"")===uf);return X("div",{key:`col-${uf}`,className:"pipeline-gantt-node-col",style:{height:`${n}px`}},vf.map((Bf)=>{let v0=o5(Bf,c,n,Y),i0=iF(Bf,c,n,Y),d0=iq(Bf,c,n,Y),b0=String(Bf.procedureRunId||`${uf}-${Bf.startMs}`);return X("button",{key:b0,type:"button",className:`pipeline-gantt-bar ${Bf.status} ${Bf.live?"live":""} ${xf===b0?"selected":""}`,style:{top:`${v0}px`,height:`${d0}px`},title:`${uf} ${Bf.status} ${z0(Bf.startedAt||Bf.startMs)} -> ${z0(Bf.finishedAt||Bf.endMs)}`,onClick:()=>z(Bf),"data-testid":"pipeline-gantt-line","data-node-id":uf,"data-procedure-run-id":String(Bf.procedureRunId||""),"data-status":String(Bf.status||""),"data-live":Bf.live?"true":"false","data-start-ms":String(Bf.startMs||""),"data-end-ms":String(Bf.endMs||""),"data-y1":String(v0),"data-y2":String(i0),"data-natural-height":String(Math.max(0,i0-v0))},X("strong",null,Bf.status||"working"),X("span",null,l1(Bf.durationMs)))}),a0.map((Bf)=>X("button",{key:Bf.id,type:"button",className:`pipeline-gantt-marker ${Bf.kind} ${Bf.tone||""} ${Bf.status||""} ${tf===String(Bf.id)?"selected":""}`,style:{top:`${Iu(Bf,c,n,Y)}px`},title:`${Bf.label||"event"} / ${z0(Bf.timestampIso||Bf.timestamp||Bf.ms)}`,onClick:()=>W(Bf),"data-testid":Bf.kind==="prompt"?"pipeline-gantt-prompt-marker":"pipeline-gantt-control-marker","data-marker-id":String(Bf.id||""),"data-ms":String(Bf.ms??Bf.eventMs??""),"data-y":String(Iu(Bf,c,n,Y))})))})))),R?X(IT,{selection:K,runDetails:$,nodeDetails:j,nodeDetailsState:J,onRaw:O,onCollapse:()=>p(!1)}):null)))}function Q_(){return{loading:!1,actionLoading:"",error:"",message:"",details:null,fetchedAt:null,appendPrompt:"",guidePrompt:"",modifyPrompt:"",approveReason:"",redoReason:""}}function d_(){return{mode:"",runId:"",interval:null,marker:null}}function bF(){return{runId:"",loading:!1,error:"",details:null,fetchedAt:null}}function E6(f,u){return`${f}/microservices/pipeline/proxy${u}`}function bM({activeRun:f,pipelineRuns:u,selectedRunId:_,onRunChange:y,selectedNodeId:l,selectedNodeConfig:$,selectedNodeRuntime:j,control:J,onControlChange:F,onFetch:Q,onAction:U,onRaw:z,onCollapse:W}){let K=String(f?.runId||""),q=String(j?.status||"pending"),V=!K||!l||J.loading||Boolean(J.actionLoading),O=(H)=>(Z)=>F({[H]:Z.target.value,error:"",message:""}),G=u.length>0?u:f?[f]:[];return X("aside",{className:"pipeline-node-control","data-testid":"pipeline-node-control"},X("div",{className:"pipeline-node-control-head"},X("div",null,X("p",{className:"panel-eyebrow"},"Manual Node Control"),X("h3",null,l||"点击控制图中的 node")),X("div",{className:"pipeline-node-control-head-actions"},l?X(uy,{status:q},q):X(uy,{status:"pending"},"idle"),X("button",{type:"button",className:"ghost-btn mini",onClick:W,"data-testid":"pipeline-node-sidebar-collapse"},"收起"))),X("div",{className:"pipeline-control-runbar"},X("label",null,X("span",null,"目标 run"),X("select",{value:K||_,disabled:G.length===0,onChange:(H)=>y(H.target.value),"data-testid":"pipeline-node-run-select"},G.map((H)=>X("option",{key:H.runId,value:H.runId},`${H.runId||"--"} / ${H.status||"--"}`)))),X("button",{type:"button",className:"ghost-btn",disabled:V,onClick:Q,"data-testid":"pipeline-node-fetch"},J.loading?"抓取中":"抓取过程"),J.details?X(X1,{title:`Pipeline Node ${l}`,data:J.details,onOpen:z,testId:"raw-pipeline-node-control"}):null),X("div",{className:"pipeline-control-meta"},X("span",null,X("b",null,"kind"),String($?.kind||"--")),X("span",null,X("b",null,"procedure"),String(j?.currentProcedureRunId||"--")),X("span",null,X("b",null,"attempts"),String(j?.attempts??"--")),X("span",null,X("b",null,"updated"),z0(f?.updatedAt))),!l?X(cu,{title:"未选择 node",text:"点击 React Flow 控制图中的任意 node 后,可抓取执行过程、追加 prompt、下发引导、增量修改、审核通过或重做。"}):null,X(H0,{error:J.error,wide:!0}),J.message?X("div",{className:"form-success wide"},J.message):null,X("div",{className:"pipeline-control-actions"},X("label",null,X("span",null,"实时追加 prompt(仅 running node)"),X("textarea",{value:J.appendPrompt,onChange:O("appendPrompt"),placeholder:"让当前执行中的 agent 继续、补充检查或调整当前步骤...",rows:4,disabled:!l,"data-testid":"pipeline-node-append-input"}),X("button",{type:"button",className:"primary-btn compact",disabled:V||!String(J.appendPrompt||"").trim(),onClick:()=>U("append"),"data-testid":"pipeline-node-append-button"},J.actionLoading==="append"?"追加中":"追加到运行中 node")),X("label",null,X("span",null,"下次尝试引导 prompt"),X("textarea",{value:J.guidePrompt,onChange:O("guidePrompt"),placeholder:"给该 node 下一次 attempt 的执行提示;不会立即打断当前 session。",rows:4,disabled:!l,"data-testid":"pipeline-node-guide-input"}),X("button",{type:"button",className:"ghost-btn compact",disabled:V||!String(J.guidePrompt||"").trim(),onClick:()=>U("guide"),"data-testid":"pipeline-node-guide-button"},J.actionLoading==="guide"?"下发中":"下发 guide")),X("label",null,X("span",null,"完成后增量修改 prompt"),X("textarea",{value:J.modifyPrompt,onChange:O("modifyPrompt"),placeholder:"在该 node 已完成结果基础上追加修改要求;runner 会重跑目标 node,并保留同 node 既有 OA 输出作为上下文。",rows:4,disabled:!l,"data-testid":"pipeline-node-modify-input"}),X("button",{type:"button",className:"ghost-btn compact",disabled:V||!String(J.modifyPrompt||"").trim(),onClick:()=>U("modify"),"data-testid":"pipeline-node-modify-button"},J.actionLoading==="modify"?"排队中":"增量修改 node")),X("label",null,X("span",null,"Monitor 审核通过原因"),X("textarea",{value:J.approveReason,onChange:O("approveReason"),placeholder:"当流程配置开启 monitor 审核时,记录审核通过原因并释放后续 node。",rows:3,disabled:!l,"data-testid":"pipeline-node-approve-input"}),X("button",{type:"button",className:"primary-btn compact",disabled:V||!String(J.approveReason||"").trim(),onClick:()=>U("approve"),"data-testid":"pipeline-node-approve-button"},J.actionLoading==="approve"?"提交中":"审核通过")),X("label",null,X("span",null,"重做 / restart 原因"),X("textarea",{value:J.redoReason,onChange:O("redoReason"),placeholder:"说明为什么需要重做;runner 会重置目标 node 以及非 rework 下游 node。",rows:4,disabled:!l,"data-testid":"pipeline-node-redo-input"}),X("button",{type:"button",className:"danger-btn compact",disabled:V||!String(J.redoReason||"").trim(),onClick:()=>U("redo"),"data-testid":"pipeline-node-redo-button"},J.actionLoading==="redo"?"排队中":"重做 node"))),X("div",{className:"pipeline-control-evidence"},X("strong",null,"Node 过程索引"),X(PM,{details:J.details,selectedNodeId:l,selectedNodeRuntime:j,control:J,onRaw:z})))}function tq({microservices:f,onRaw:u,apiBaseUrl:_="/api"}){let y=f.find((s)=>s.id==="pipeline")||null,[l,$]=Bu({loading:!1,error:"",health:null,snapshot:null,oaDiagnostics:null,minimaxQuota:null,refreshedAt:null}),[j,J]=Bu(""),[F,Q]=Bu(""),[U,z]=Bu(""),[W,K]=Bu(Q_()),[q,V]=Bu({}),[O,G]=Bu(d_()),[H,Z]=Bu(bF()),[E,L]=Bu(D6),[M,N]=Bu(!1),[w,R]=Bu(!1),p=e_(0),x=e_(!1),C=e_(0),P=e_(""),D=e_({}),T=e_(""),S=e_("");async function r(s={}){let Nf=s.silent===!0;if(!y)return;if(x.current)return;x.current=!0;let Of=p.current+1;if(p.current=Of,!Nf)$((Cf)=>({...Cf,loading:!0,error:""}));try{let Cf=`__unideskArrayLimit=registry.components:80,runs:${NT}&_=${Date.now()}`,[_0,G0,hf]=await Promise.all([a_(`${_}/microservices/pipeline/proxy/api/snapshot?${Cf}`,{cache:"no-store"}),a_(`${_}/microservices/pipeline/proxy/api/oa-event-flow/diagnostics?_=${Date.now()}`,{cache:"no-store"}).catch((Qu)=>({ok:!1,error:Tf(Qu,"OA event flow diagnostics failed")})),a_(`${_}/microservices/pipeline/proxy/api/model-quota/minimax?_=${Date.now()}`,{cache:"no-store"}).catch((Qu)=>({ok:!1,error:Tf(Qu,"MiniMax quota failed")}))]);if(Of!==p.current)return;let h0={ok:_0?.ok!==!1,service:"pipeline-v2-control snapshot"};$({loading:!1,error:"",health:h0,snapshot:_0,oaDiagnostics:G0,minimaxQuota:hf,refreshedAt:new Date})}catch(Cf){if(Of!==p.current)return;$((_0)=>({..._0,loading:!1,error:Tf(Cf,"Pipeline 加载失败")}))}finally{x.current=!1}}c1(()=>{if(r(),!y)return;let s=window.setInterval(()=>{r({silent:!0})},yq);return()=>window.clearInterval(s)},[y?.id,y?.runtime?.providerStatus,_]);let Y=pT(y),v=kT(y),m=mT(y),c=l.snapshot||{},o=l.oaDiagnostics||null,ff=l.minimaxQuota||null,{components:n,pipelines:lf,runs:Gf}=iT(c),zf=String(Gf[0]?.pipelineId||""),jf=(zf?lf.find((s)=>String(s.id||"")===zf):null)||lf[0]||{},Wf=lf.find((s)=>String(s.id||"")===j)||jf,Vf=String(Wf.id||""),Kf=Rq(Wf),h=oF(Wf),g=Vq(Gf,Vf),I=KM(Gf,Vf),yf=I.find((s)=>String(s?.runId||"")===F)||g,$f=String(H.runId||"")===String(yf?.runId||"")?sT(H.details):null,Qf=oT(yf,$f),Yf=String(Qf?.runId||""),xf=Kf.find((s)=>String(s?.id||"")===U)||null,tf=U?xq(Qf,U):null,j0=nT(Gf),u0=fM(n),D0=Number(l.health?.components)||Wq(c,"registry.components",n.length),Fu=Wq(c,"runs",Gf.length),O0=Kq(Wf,Qf,n),x0={nodes:O0.nodes.map((s)=>s.id===U?{...s,selected:!0,className:`${s.className||""} selected-control-node`}:s),edges:O0.edges},ku=lf.map((s)=>{let Nf=String(s.id||"pipeline"),Of=Vq(Gf,Nf);return{title:`${Nf}-${Of?.runId||"snapshot"}`,flow:Kq(s,Of,n)}}),X0=String(O?.runId||Yf||""),Au=String(O?.interval?.nodeId||O?.marker?.nodeId||""),uf=X0&&Au?q[xF(X0,Au)]||null:null,vf=i5(W.details,X0,Au),a0=i5(uf?.details,X0,Au)||vf,Bf=X0&&Au?{...Xf(uf)?uf:{},runId:X0,nodeId:Au,details:a0,loading:Boolean(uf?.loading)||!a0&&Boolean(W.loading)&&U===Au,error:String(uf?.error||""),fetchedAt:uf?.fetchedAt||(vf?W.fetchedAt:null)}:null,v0=I.map((s)=>String(s?.runId||"")).filter(Boolean).join("|"),i0=Kf.map((s)=>String(s?.id||"")).filter(Boolean).join("|");c1(()=>{T.current=U},[U]),c1(()=>{S.current=Yf},[Yf]),c1(()=>{if(!F||v0.split("|").includes(F))return;Q("")},[F,v0]),c1(()=>{if(!U||i0.split("|").includes(U))return;z(""),K(Q_()),G(d_()),N(!1),R(!1)},[U,i0]),c1(()=>{if(!U)N(!1)},[U]),c1(()=>{if(!O.mode)R(!1)},[O.mode]);async function d0(s=Yf,Nf={}){if(!s){Z(bF());return}let Of=_y(Nf.scale??E??D6),Cf=`${s}:timeline`;if(P.current===Cf)return;P.current=Cf;let _0=Nf.silent===!0,G0=C.current+1;C.current=G0,Z((hf)=>({runId:s,scale:Of,loading:!_0||String(hf.runId||"")!==s||!hf.details,error:"",details:_0&&hf.runId===s?hf.details:hf.runId===s?hf.details:null,fetchedAt:hf.runId===s?hf.fetchedAt:null}));try{let[hf,h0]=await Promise.all([a_(`${E6(_,`/api/node-control/runs/${encodeURIComponent(s)}?tail=160&view=timeline`)}&_=${Date.now()}`,{cache:"no-store",strictJson:!0}),a_(`${E6(_,`/api/runs/${encodeURIComponent(s)}`)}?_=${Date.now()}`,{cache:"no-store"}).catch((Qu)=>({ok:!1,runSummaryError:Tf(Qu,"抓取评分失败")}))]);if(G0!==C.current)return;Z({runId:s,scale:Of,loading:!1,error:"",details:{...hf,run:Xf(h0?.run)?h0.run:void 0,runSummaryError:h0?.runSummaryError},fetchedAt:new Date})}catch(hf){if(G0!==C.current)return;Z((h0)=>({runId:s,scale:Of,loading:!1,error:Tf(hf,"抓取 epoch 执行过程失败"),details:h0.runId===s?h0.details:null,fetchedAt:h0.runId===s?h0.fetchedAt:null}))}finally{if(P.current===Cf)P.current=""}}function b0(s,Nf,Of){let Cf=xF(s,Nf);V((_0)=>{let G0={..._0,[Cf]:{...Xf(_0?.[Cf])?_0[Cf]:{},runId:s,nodeId:Nf,...Of}},hf=Object.keys(G0);if(hf.length>32)for(let h0 of hf.slice(0,hf.length-32))delete G0[h0];return G0})}async function m1(s,Nf){if(!s||!Nf)return;let Of=xF(s,Nf),Cf=Number(D.current?.[Of]||0)+1;D.current={...D.current,[Of]:Cf},b0(s,Nf,{loading:!0,error:""});try{let _0=await a_(E6(_,`/api/node-control/runs/${encodeURIComponent(s)}/nodes/${encodeURIComponent(Nf)}?tail=160`),{cache:"no-store",strictJson:!0});if(Number(D.current?.[Of]||0)!==Cf)return;let G0=new Date;if(b0(s,Nf,{loading:!1,details:_0,fetchedAt:G0,error:""}),T.current===Nf&&S.current===s)K((hf)=>({...hf,loading:!1,details:_0,fetchedAt:G0,error:""}))}catch(_0){if(Number(D.current?.[Of]||0)!==Cf)return;b0(s,Nf,{loading:!1,error:Tf(_0,"抓取 Gantt node 详情失败")})}}c1(()=>{if(!Yf){Z(bF());return}d0(Yf);let s=window.setInterval(()=>{d0(Yf,{silent:!0})},yq);return()=>window.clearInterval(s)},[Yf,_]);async function ef(s=Yf,Nf=U){if(!s||!Nf){K((Of)=>({...Of,error:"请先选择 run 和 node",message:""}));return}K((Of)=>({...Of,loading:!0,error:"",message:""}));try{let Of=await a_(E6(_,`/api/node-control/runs/${encodeURIComponent(s)}/nodes/${encodeURIComponent(Nf)}?tail=160`),{cache:"no-store",strictJson:!0}),Cf=new Date;K((_0)=>({..._0,loading:!1,details:Of,fetchedAt:Cf,error:""})),b0(s,Nf,{loading:!1,details:Of,fetchedAt:Cf,error:""})}catch(Of){K((Cf)=>({...Cf,loading:!1,error:Tf(Of,"抓取 node 执行过程失败")}))}}async function iu(s){let Nf=String(s?.runId||Yf||""),Of=String(s?.nodeId||"");if(G({mode:"interval",runId:Nf,interval:s,marker:null}),R(!0),!Nf||!Of)return;if(Nf!==Yf)Q(Nf);z(Of),K(Q_()),d0(Nf,{silent:!0}),m1(Nf,Of)}async function ey(s){let Nf=String(s?.runId||Yf||""),Of=String(s?.nodeId||"");if(G({mode:"event",runId:Nf,interval:null,marker:s}),R(!0),!Nf)return;if(Nf!==Yf)Q(Nf);if(d0(Nf,{silent:!0}),!Of)return;z(Of),K(Q_()),m1(Nf,Of)}async function f3(s){if(!Yf||!U){K((Cf)=>({...Cf,error:"请先选择 run 和 node",message:""}));return}let Nf=s==="append"?"prompts":s,Of=s==="append"?W.appendPrompt:s==="guide"?W.guidePrompt:s==="modify"?W.modifyPrompt:s==="approve"?W.approveReason:W.redoReason;if(!String(Of||"").trim()){K((Cf)=>({...Cf,error:"操作内容不能为空",message:""}));return}K((Cf)=>({...Cf,actionLoading:s,error:"",message:""}));try{let Cf=s==="redo"||s==="approve"?{reason:Of,source:"unidesk-frontend",sourceKind:"webui"}:{prompt:Of,source:"unidesk-frontend",sourceKind:"webui"},_0=await a_(E6(_,`/api/node-control/runs/${encodeURIComponent(Yf)}/nodes/${encodeURIComponent(U)}/${Nf}`),{method:"POST",body:JSON.stringify(Cf)});if(K((G0)=>({...G0,actionLoading:"",details:_0,fetchedAt:new Date,appendPrompt:s==="append"?"":G0.appendPrompt,guidePrompt:s==="guide"?"":G0.guidePrompt,modifyPrompt:s==="modify"?"":G0.modifyPrompt,approveReason:s==="approve"?"":G0.approveReason,redoReason:s==="redo"?"":G0.redoReason,message:s==="append"?"已追加到运行中 node":s==="guide"?"已下发 guide,等待 runner 处理":s==="modify"?"已排队增量修改命令":s==="approve"?"已提交审核通过决策":"已排队重做命令"})),await ef(Yf,U),await d0(Yf,{silent:!0}),s!=="append")await r()}catch(Cf){K((_0)=>({..._0,actionLoading:"",error:Tf(Cf,"node 控制操作失败")}))}}if(!y)return X(cu,{title:"Pipeline 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=pipeline"});return X("div",{className:"pipeline-page","data-testid":"pipeline-page"},X(I1,{title:"Pipeline v2 工作台",eyebrow:"D601 Snapshot 用户服务",actions:X("div",{className:"panel-actions"},X("button",{type:"button",className:"ghost-btn",onClick:r,disabled:l.loading,"data-testid":"pipeline-refresh-button"},l.loading?"刷新中":"刷新"),X(X1,{title:"Pipeline 用户服务",data:y,onOpen:u,testId:"raw-pipeline-service"}))},X("div",{className:"pipeline-hero"},X("div",null,X("div",{className:"node-version-line"},X(uy,{status:Y.providerStatus==="online"?"online":"warn"},Y.providerStatus||"unknown"),X("span",null,y.providerId),X("span",null,m.public?"公网暴露":"仅 UniDesk frontend 代理访问")),X("p",{className:"muted paragraph"},y.description)),X("div",{className:"microservice-ref-card"},X("span",null,"Repo"),X("strong",null,v.url||"--"),X("code",null,v.commitId||"--")),X("div",{className:"microservice-ref-card"},X("span",null,"D601 Docker"),X("strong",null,`${m.nodeBindHost||"--"}:${m.nodePort||"--"}`),X("code",null,`${v.composeFile||"--"} / ${v.composeService||"--"}`))),X(H0,{error:l.error,wide:!0})),X("div",{className:"pipeline-grid"},X(I1,{title:"控制图",eyebrow:`${Wf.id||"pipeline"} / run ${Qf?.status||"--"}`,className:"pipeline-wide-panel",actions:X("div",{className:"pipeline-toolbar"},X("select",{value:Vf,disabled:lf.length===0,onChange:(s)=>{J(s.target.value),Q(""),z(""),K(Q_()),G(d_()),N(!1),R(!1)},"data-testid":"pipeline-select"},lf.map((s)=>X("option",{key:s.id,value:s.id},s.id||s.key))),X("select",{value:Yf,disabled:I.length===0,onChange:(s)=>{if(Q(s.target.value),K(Q_()),G(d_()),N(!1),R(!1),U)ef(s.target.value,U)},"data-testid":"pipeline-run-select"},I.map((s)=>X("option",{key:s.runId,value:s.runId},mF(I,s)))),X("button",{type:"button",className:"ghost-btn",disabled:x0.nodes.length===0,onClick:()=>hq(x0,`${Wf.id||"pipeline"}-${Qf?.runId||"snapshot"}`),"data-testid":"pipeline-export-graph"},"导出渲染图"),X("button",{type:"button",className:"ghost-btn",disabled:ku.every((s)=>s.flow.nodes.length===0),onClick:()=>GM(ku),"data-testid":"pipeline-export-all-graphs"},"批量导出"))},Kf.length===0?X(cu,{title:"暂无控制图",text:"等待 D601 pipeline backend 返回 config.nodes / config.edges"}):X("div",{className:`pipeline-control-shell ${M?"detail-open":"detail-collapsed"}`,"data-testid":"pipeline-control-shell","data-sidebar-open":M?"true":"false"},X("div",{className:"pipeline-flow-frame","data-testid":"pipeline-react-flow"},X(oZ,{nodes:x0.nodes,edges:x0.edges,nodeTypes:DT,edgeTypes:wT,fitView:!0,fitViewOptions:{padding:0.18},nodesDraggable:!1,nodesConnectable:!1,elementsSelectable:!0,minZoom:0.25,maxZoom:1.4,proOptions:{hideAttribution:!0},onNodeClick:(s,Nf)=>{let Of=String(Nf.id);if(z(Of),K(Q_()),N(!0),Yf)ef(Yf,Of)}},X(dZ,{gap:22,size:1,color:"rgba(215, 161, 58, 0.24)"}),X(fq,{showInteractive:!1})),!M?X("button",{type:"button",className:"pipeline-sidecar-tab right",disabled:!U,onClick:()=>N(!0),"data-testid":"pipeline-node-sidebar-toggle"},U?"展开 node 控制":"点击 node 展开控制"):null),M?X(bM,{activeRun:Qf,pipelineRuns:I,selectedRunId:F,onRunChange:(s)=>{if(Q(s),K(Q_()),G(d_()),U)ef(s,U)},selectedNodeId:U,selectedNodeConfig:xf,selectedNodeRuntime:tf,control:W,onControlChange:(s)=>K((Nf)=>({...Nf,...s})),onFetch:()=>ef(),onAction:f3,onRaw:u,onCollapse:()=>N(!1)}):null),X("div",{className:"pipeline-flow-summary"},X("span",null,`${x0.nodes.length} nodes`),X("span",null,`${x0.edges.length} edges`),X("span",null,`${lf.length} pipelines`),X("span",null,`source config+components(${n.length})`),X("span",null,`run ${Qf?.runId||"--"}`),X("span",null,`score ${pF(Qf)}`),X("span",null,U?`selected ${U}`:"click node to control"))),X(vM,{epochs:I,activeRun:Qf,activePipeline:Wf,pipelineNodes:Kf,pipelineEdges:h,selection:O,detailOpen:w,onDetailOpenChange:R,runDetails:H,nodeDetails:a0,nodeDetailsState:Bf,ganttScale:E,onGanttScaleChange:L,onIntervalSelect:iu,onMarkerSelect:ey,onRunChange:(s)=>{if(Q(s),K(Q_()),G(d_()),R(!1),U)ef(s,U)},onRaw:u}),X(I1,{title:"观测指标",eyebrow:l.refreshedAt?`Updated ${a5(l.refreshedAt)}`:"Snapshot"},X("div",{className:"metric-grid"},X(Hu,{label:"Health",value:l.health?.ok?"OK":"--",hint:l.health?.service||"D601 /health",tone:l.health?.ok?"ok":"warn"}),X(Hu,{label:"组件",value:D0,hint:"components registry",tone:c?.registry?.ok===!1?"warn":"ok"}),X(Hu,{label:"Pipeline",value:lf.length,hint:`${Kf.length} nodes / ${h.length} edges`}),X(Hu,{label:"运行记录",value:Fu,hint:`${j0.succeeded||0} succeeded / ${j0.running||0} running`}),X(Hu,{label:"OA 记录",value:Array.isArray(g?.submissions)?g.submissions.length:0,hint:g?.runId||"latest run"}),X(Hu,{label:"Procedure",value:Array.isArray(g?.procedureRuns)?g.procedureRuns.length:0,hint:g?.status||"no run"}),X(Hu,{label:"Score",value:pF(Qf),hint:Qf?.runId||"selected epoch",tone:dF(Qf)})),X("div",{className:"panel-actions inline-actions"},X(X1,{title:"Pipeline Snapshot",data:c,onOpen:u,testId:"raw-pipeline-snapshot"}))),X(I1,{title:"评分器",eyebrow:Qf?.runId||"selected epoch"},X(eT,{run:Qf,onRaw:u})),X(I1,{title:"MiniMax 限额",eyebrow:"model/minimax-m27 quota"},X(xM,{quota:ff,onRaw:u})),X(I1,{title:"OA 事件流",eyebrow:"100% event-driven diagnostics",className:"pipeline-wide-panel"},X(RM,{diagnostics:o,onRaw:u})),X(I1,{title:"组件矩阵",eyebrow:`${u0.length} classes`},u0.length===0?X(cu,{title:"暂无组件",text:"等待 D601 pipeline backend 返回 registry.components"}):X("div",{className:"component-strata"},u0.map((s)=>X("article",{key:s.name,className:"component-stratum"},X("span",null,s.name),X("strong",null,s.count)))),X("div",{className:"pipeline-component-list"},n.slice(0,12).map((s)=>X("span",{key:s.key,className:"data-chip"},X("b",null,s.componentClass||"--"),X("span",null,s.id||s.key||"--"))))),X(I1,{title:"Epoch 列表",eyebrow:`${I.length}/${Fu} preview`},I.length===0?X(cu,{title:"暂无运行记录",text:"当前 pipeline 在 .state/pipeline-runs 中还没有 epoch。"}):X("div",{className:"pipeline-run-list"},I.map((s)=>{let Nf=String(s?.runId||"")===Yf?Qf:s;return X("article",{key:s.runId,className:`pipeline-run-card ${String(s.runId||"")===Yf?"active":""}`,role:"button",tabIndex:0,onClick:()=>{Q(String(s.runId||"")),G(d_())},onKeyDown:(Of)=>{if(Of.key==="Enter"||Of.key===" ")Q(String(s.runId||"")),G(d_())}},X("div",{className:"node-card-head"},X("strong",null,mF(I,s)),X(uy,{status:s.status},s.status||"--")),X("div",{className:"docker-meta compact"},X("span",null,Nf?.pipelineId||"--"),X("span",null,`nodes ${Array.isArray(Nf?.nodes)?Nf.nodes.length:0}`),X("span",null,`oa ${Array.isArray(Nf?.submissions)?Nf.submissions.length:0}`),X("span",null,`procedures ${Array.isArray(Nf?.procedureRuns)?Nf.procedureRuns.length:0}`),X(dT,{run:Nf})),X("p",{className:"muted paragraph"},k5(Nf?.task)),X("span",{className:"pipeline-run-time"},z0(Nf?.updatedAt)))}))),X(I1,{title:"运行材料索引",eyebrow:Qf?.runId||"selected epoch",className:"pipeline-wide-panel"},X(CM,{activeRun:Qf,onRaw:u}))))}var y2=Sf(I0(),1);var e=y2.default.createElement,{useEffect:hM}=y2.default,u2=y2.default.useState,_A={id:"",sequenceNo:"",contractNo:"",name:"",currentStatus:"",pending:"",paymentStatus:"",notes:""};function IM(f){return f.toLocaleTimeString("zh-CN",{hour12:!1})}function cM({status:f,children:u}){let _=String(f||"unknown").toLowerCase();return e("span",{className:`status-badge ${_}`},u||f||"unknown")}function _2({label:f,value:u,hint:_,tone:y}){return e("article",{className:`metric-card ${y||""}`},e("div",{className:"metric-label"},f),e("div",{className:"metric-value"},u),e("div",{className:"metric-hint"},_))}function yA({title:f,eyebrow:u,actions:_,children:y,className:l}){return e("section",{className:`panel ${l||""}`},e("div",{className:"panel-head"},e("div",null,u?e("p",{className:"panel-eyebrow"},u):null,e("h2",null,f)),_?e("div",{className:"panel-actions"},_):null),e("div",{className:"panel-body"},y))}function sq({title:f,data:u,onOpen:_,testId:y}){return e("button",{type:"button",className:"ghost-btn","data-testid":y,onClick:()=>_(f,u)},"查看原始JSON")}function oq({title:f,text:u}){return e("div",{className:"empty-state"},e("strong",null,f),e("span",null,u))}function pM(f){return f?.runtime&&typeof f.runtime==="object"&&!Array.isArray(f.runtime)?f.runtime:{}}function mM(f){return f?.backend&&typeof f.backend==="object"&&!Array.isArray(f.backend)?f.backend:{}}function kM(f){return f?.repository&&typeof f.repository==="object"&&!Array.isArray(f.repository)?f.repository:{}}function zl(f,u){return`${f}/microservices/project-manager/proxy${u}`}function iM(f){return{id:String(f.id||""),sequenceNo:f.sequenceNo===null||f.sequenceNo===void 0?"":String(f.sequenceNo),contractNo:String(f.contractNo||""),name:String(f.name||""),currentStatus:String(f.currentStatus||""),pending:String(f.pending||""),paymentStatus:String(f.paymentStatus||""),notes:String(f.notes||"")}}function gM(f){return{sequenceNo:f.sequenceNo===""?null:Number(f.sequenceNo),contractNo:String(f.contractNo||"").trim(),name:String(f.name||"").trim(),currentStatus:String(f.currentStatus||"").trim(),pending:String(f.pending||"").trim(),paymentStatus:String(f.paymentStatus||"").trim(),paymentRatio:String(f.paymentStatus||"").trim(),notes:String(f.notes||"").trim()}}function lA(f){return String(f||"item").replace(/[^A-Za-z0-9_-]+/g,"-")}function nM(f){let u=new Uint8Array(f),_="",y=32768;for(let l=0;le("tr",{key:l.id,className:u===l.id?"active-row":"","data-testid":`project-manager-row-${lA(l.id)}`},e("td",null,l.sequenceNo??"--"),e("td",null,e("strong",null,l.contractNo||"--"),e("code",null,l.id||"--")),e("td",null,e("strong",null,l.name||"--"),e("span",{className:"muted block"},l.sourceFile||"--")),e("td",null,l.currentStatus||"--"),e("td",null,e("span",{className:"preline"},l.pending||"--")),e("td",null,e(cM,{status:Number(l.paymentRatio||0)>=1?"online":"warn"},l.paymentStatus||"--")),e("td",null,l.notes||"--"),e("td",null,e("div",{className:"inline-actions"},e("button",{type:"button",className:"ghost-btn",onClick:()=>_(l),"data-testid":`project-manager-edit-${lA(l.id)}`},"编辑"),e(sq,{title:`Project ${l.contractNo||l.id}`,data:l,onOpen:y,testId:`raw-project-${lA(l.id)}`}))))))))}function aq({microservices:f,onRaw:u,apiBaseUrl:_="/api"}){let y=f.find((N)=>N.id==="project-manager")||null,[l,$]=u2({loading:!1,saving:!1,importing:!1,exporting:!1,error:"",notice:"",health:null,list:null,refreshedAt:null}),[j,J]=u2({..._A}),[F,Q]=u2(""),[U,z]=u2("all");async function W(N=F,w=U){if(!y)return;$((R)=>({...R,loading:!0,error:""}));try{let R=new URLSearchParams({pageSize:"200",status:w});if(N.trim())R.set("q",N.trim());let[p,x]=await Promise.all([Df(`${_}/microservices/project-manager/health`),Df(zl(_,`/api/projects?${R.toString()}`))]);$((C)=>({...C,loading:!1,health:p,list:x,refreshedAt:new Date,error:""}))}catch(R){$((p)=>({...p,loading:!1,error:Tf(R,"Project Manager 加载失败")}))}}hM(()=>{W()},[y?.id,y?.runtime?.providerStatus]);async function K(N){N.preventDefault(),$((w)=>({...w,saving:!0,error:"",notice:""}));try{let w=gM(j);if(j.id)await Df(zl(_,`/api/projects/${encodeURIComponent(j.id)}`),{method:"PUT",body:JSON.stringify(w)});else await Df(zl(_,"/api/projects"),{method:"POST",body:JSON.stringify(w)});$((R)=>({...R,saving:!1,notice:j.id?"项目已更新":"项目已创建"})),await W()}catch(w){$((R)=>({...R,saving:!1,error:Tf(w,"保存项目失败")}))}}async function q(){if(!j.id)return;if(!window.confirm(`删除项目 ${j.contractNo||j.name||j.id} ?`))return;$((N)=>({...N,saving:!0,error:"",notice:""}));try{await Df(zl(_,`/api/projects/${encodeURIComponent(j.id)}`),{method:"DELETE"}),J({..._A}),$((N)=>({...N,saving:!1,notice:"项目已删除"})),await W()}catch(N){$((w)=>({...w,saving:!1,error:Tf(N,"删除项目失败")}))}}async function V(N){let w=N.target.files?.[0];if(!w)return;$((R)=>({...R,importing:!0,error:"",notice:""}));try{let R=nM(await w.arrayBuffer()),p=await Df(zl(_,"/api/import/excel"),{method:"POST",body:JSON.stringify({fileName:w.name,contentBase64:R,replace:!1})});$((x)=>({...x,importing:!1,notice:`Excel 已导入 ${p.imported||0} 条项目`})),N.target.value="",await W()}catch(R){$((p)=>({...p,importing:!1,error:Tf(R,"Excel 导入失败")}))}}async function O(){$((N)=>({...N,exporting:!0,error:""}));try{let N=await eW(zl(_,"/api/projects/export.xlsx")),w=URL.createObjectURL(N),R=document.createElement("a");R.href=w,R.download=`project-manager-${new Date().toISOString().slice(0,10)}.xlsx`,document.body.appendChild(R),R.click(),R.remove(),URL.revokeObjectURL(w),$((p)=>({...p,exporting:!1,notice:"Excel 已导出"}))}catch(N){$((w)=>({...w,exporting:!1,error:Tf(N,"Excel 导出失败")}))}}if(!y)return e(oq,{title:"Project Manager 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=project-manager"});let G=pM(y),H=kM(y),Z=mM(y),E=Array.isArray(l.list?.projects)?l.list.projects:[],L=l.list?.summary||{},M=l.health||{};return e("div",{className:"project-manager-page","data-testid":"project-manager-page"},e(yA,{title:"项目管理工作台",eyebrow:"Main Server PostgreSQL 用户服务",actions:e("div",{className:"panel-actions"},e("button",{type:"button",className:"ghost-btn",disabled:l.loading,onClick:()=>W(),"data-testid":"project-manager-refresh-button"},l.loading?"刷新中":"刷新"),e("button",{type:"button",className:"ghost-btn",disabled:l.exporting,onClick:O,"data-testid":"project-manager-export-button"},l.exporting?"导出中":"导出 Excel"),e(sq,{title:"Project Manager 用户服务",data:y,onOpen:u,testId:"raw-project-manager-service"}))},e("div",{className:"project-manager-hero"},e(_2,{label:"项目总数",value:L.total??E.length,hint:`PG 表 ${M.storage?.table||"project_manager_projects"}`,tone:"ok"}),e(_2,{label:"进行中",value:L.active??"--",hint:"当前状态未完全完成"}),e(_2,{label:"已完成",value:L.completed??"--",hint:"按 完成 关键字统计",tone:"ok"}),e(_2,{label:"未全款",value:L.unpaid??"--",hint:"付款比例 < 1",tone:Number(L.unpaid||0)>0?"warn":"ok"})),e(H0,{error:l.error}),l.notice?e("div",{className:"form-success"},l.notice):null),e("div",{className:"project-manager-hero"},e("div",{className:"microservice-ref-card"},e("span",null,"Repo"),e("strong",null,H.url||"--"),e("code",null,H.commitId||"--")),e("div",{className:"microservice-ref-card"},e("span",null,"Main Server Docker"),e("strong",null,`${Z.nodeBindHost||"--"}:${Z.nodePort||"--"}`),e("code",null,`${H.composeService||"--"} / ${H.containerName||"--"}`)),e("div",{className:"microservice-ref-card"},e("span",null,"Runtime"),e("strong",null,G.providerName||y.providerId),e("code",null,`Health ${M.ok?"OK":"--"} / ${l.refreshedAt?IM(l.refreshedAt):"--"}`)),e("div",{className:"microservice-ref-card"},e("span",null,"Import Source"),e("strong",null,"D601 WeChat Excel"),e("code",null,"合作项目列表_I_20260309.xlsx"))),e("div",{className:"project-manager-layout"},e(yA,{title:"项目清单",eyebrow:"CRUD + Excel Export",actions:e("div",{className:"inline-actions project-manager-filters"},e("input",{value:F,onChange:(N)=>Q(N.target.value),placeholder:"搜索合同号 / 项目名称 / 状态","data-testid":"project-manager-search"}),e("select",{value:U,onChange:(N)=>{z(N.target.value),W(F,N.target.value)},"data-testid":"project-manager-status-filter"},e("option",{value:"all"},"全部"),e("option",{value:"active"},"进行中"),e("option",{value:"completed"},"已完成"),e("option",{value:"unpaid"},"未全款")),e("button",{type:"button",className:"ghost-btn",onClick:()=>W(F,U)},"筛选"))},e(tM,{projects:E,activeId:j.id,onSelect:(N)=>J(iM(N)),onRaw:u})),e(yA,{title:j.id?"编辑项目":"新建项目",eyebrow:"PostgreSQL Write Path"},e("form",{className:"stack-form project-manager-form",onSubmit:K,"data-testid":"project-manager-form"},j.id?e("label",null,"项目 ID",e("input",{value:j.id,disabled:!0})):null,e("label",null,"序号",e("input",{type:"number",value:j.sequenceNo,onChange:(N)=>J((w)=>({...w,sequenceNo:N.target.value}))})),e("label",null,"合同号",e("input",{value:j.contractNo,onChange:(N)=>J((w)=>({...w,contractNo:N.target.value})),required:!0})),e("label",null,"项目名称",e("input",{value:j.name,onChange:(N)=>J((w)=>({...w,name:N.target.value})),required:!0})),e("label",null,"当前状况",e("textarea",{value:j.currentStatus,onChange:(N)=>J((w)=>({...w,currentStatus:N.target.value}))})),e("label",null,"待完成",e("textarea",{value:j.pending,onChange:(N)=>J((w)=>({...w,pending:N.target.value}))})),e("label",null,"付款情况",e("input",{value:j.paymentStatus,onChange:(N)=>J((w)=>({...w,paymentStatus:N.target.value})),placeholder:"例如 1 / 0.5 / 50%"})),e("label",null,"其它",e("input",{value:j.notes,onChange:(N)=>J((w)=>({...w,notes:N.target.value}))})),e("div",{className:"inline-actions"},e("button",{type:"submit",className:"primary-btn",disabled:l.saving,"data-testid":"project-manager-save-button"},l.saving?"保存中":j.id?"保存修改":"创建项目"),e("button",{type:"button",className:"ghost-btn",onClick:()=>J({..._A})},"清空"),j.id?e("button",{type:"button",className:"danger-btn",disabled:l.saving,onClick:q,"data-testid":"project-manager-delete-button"},"删除"):null)),e("div",{className:"project-manager-import"},e("p",{className:"muted paragraph"},"浏览器只访问 UniDesk frontend;后端通过同源用户服务代理写入主 PostgreSQL,不暴露 4233 公网端口。"),e("label",{className:"file-import"},l.importing?"导入中...":"导入 Excel",e("input",{type:"file",accept:".xlsx",onChange:V,disabled:l.importing,"data-testid":"project-manager-import-input"}))))))}var J2=Sf(I0(),1);var _f=J2.default.createElement,{useEffect:sM}=J2.default,Du=J2.default.useState;function dq(f){if(!f)return"--";let u=new Date(f);if(Number.isNaN(u.getTime()))return"--";return u.toLocaleString("zh-CN",{hour12:!1})}function oM(f){return f.toLocaleTimeString("zh-CN",{hour12:!1})}function aM({status:f,children:u}){let _=String(f||"unknown").toLowerCase();return _f("span",{className:`status-badge ${_}`},u||f||"unknown")}function l2({label:f,value:u,hint:_,tone:y}){return _f("article",{className:`metric-card ${y||""}`},_f("div",{className:"metric-label"},f),_f("div",{className:"metric-value"},u),_f("div",{className:"metric-hint"},_))}function $A({title:f,eyebrow:u,actions:_,children:y,className:l}){return _f("section",{className:`panel ${l||""}`},_f("div",{className:"panel-head"},_f("div",null,u?_f("p",{className:"panel-eyebrow"},u):null,_f("h2",null,f)),_?_f("div",{className:"panel-actions"},_):null),_f("div",{className:"panel-body"},y))}function eq({title:f,data:u,onOpen:_,testId:y}){return _f("button",{type:"button",className:"ghost-btn","data-testid":y,onClick:()=>_(f,u)},"查看原始JSON")}function $2({title:f,text:u}){return _f("div",{className:"empty-state"},_f("strong",null,f),_f("span",null,u))}function dM(f){return f?.runtime&&typeof f.runtime==="object"&&!Array.isArray(f.runtime)?f.runtime:{}}function eM(f){return f?.backend&&typeof f.backend==="object"&&!Array.isArray(f.backend)?f.backend:{}}function fr(f){return f?.repository&&typeof f.repository==="object"&&!Array.isArray(f.repository)?f.repository:{}}function uH(f){return String(f).replace(/[^a-zA-Z0-9_-]/g,"_")}function ur(f){if(!Number.isFinite(f))return"--";return`${f.toFixed(1)}%`}function Gl(f,u){return`${f}/microservices/todo-note/proxy${u}`}function _H(f){return f.reduce((u,_)=>{let y=_H(Array.isArray(_.children)?_.children:[]),l=Boolean(_.completed);return{total:u.total+1+y.total,completed:u.completed+(l?1:0)+y.completed,active:u.active+(l?0:1)+y.active}},{total:0,completed:0,active:0})}function j2(f,u){let _=u==="all"||(u==="completed"?Boolean(f.completed):!f.completed),y=Array.isArray(f.children)?f.children:[];return _||y.some((l)=>j2(l,u))}function _r(f){if(!f)return"";let u=new Date(f);if(Number.isNaN(u.getTime()))return"";return new Date(u.getTime()-u.getTimezoneOffset()*60000).toISOString().slice(0,16)}function yr(f){if(!f)return null;let u=new Date(f);return Number.isNaN(u.getTime())?null:u.toISOString()}function fH(f){return Array.isArray(f?.instances)?f.instances:[]}function yH({microservices:f,onRaw:u,apiBaseUrl:_="/api"}){let y=f.find((I)=>I.id==="todo-note")||null,[l,$]=Du(null),[j,J]=Du(null),[F,Q]=Du(""),[U,z]=Du(null),[W,K]=Du("all"),[q,V]=Du(13),[O,G]=Du(""),[H,Z]=Du(""),[E,L]=Du(""),[M,N]=Du(""),[w,R]=Du(""),[p,x]=Du(!1),[C,P]=Du(""),[D,T]=Du(null),S=fH(j),r=_H(Array.isArray(U?.todos)?U.todos:[]),Y=y?dM(y):{},v=y?fr(y):{},m=y?eM(y):{};async function c(I=F){let[yf,$f]=await Promise.all([Df(`${_}/microservices/todo-note/health`),Df(Gl(_,"/api/instances"))]);$(yf),J($f);let Qf=fH($f),Yf=Qf.some((xf)=>xf.id===I)?I:Qf[0]?.id||"";return Q(Yf),Yf}async function o(I=F){if(!I){z(null);return}let yf=await Df(Gl(_,`/api/instances/${encodeURIComponent(I)}`));z(yf)}async function ff(I=F){if(!y)return;x(!0),P("");try{let yf=await c(I);await o(yf),T(new Date)}catch(yf){P(Tf(yf,"Todo Note 加载失败"))}finally{x(!1)}}async function n(I){if(!F)return;P("");try{let yf=await Df(Gl(_,`/api/instances/${encodeURIComponent(F)}/actions`),{method:"POST",body:JSON.stringify({action:I})});z(yf),await c(F)}catch(yf){P(Tf(yf,"Todo 操作失败"))}}async function lf(I){I.preventDefault();let yf=O.trim();if(!yf)return;x(!0),P("");try{let $f=await Df(Gl(_,"/api/instances"),{method:"POST",body:JSON.stringify({name:yf})});G(""),await ff($f.id)}catch($f){P(Tf($f,"创建清单失败"))}finally{x(!1)}}async function Gf(I){if(!window.confirm("确认删除这个 Todo Note 清单?"))return;x(!0),P("");try{await Df(Gl(_,`/api/instances/${encodeURIComponent(I)}`),{method:"DELETE"}),await ff(F===I?"":F)}catch(yf){P(Tf(yf,"删除清单失败"))}finally{x(!1)}}async function zf(I){I.preventDefault();let yf=H.trim();if(!yf)return;Z(""),await n({type:"addTodo",title:yf})}async function jf(I){if(!F)return;P("");try{let yf=await Df(Gl(_,`/api/instances/${encodeURIComponent(F)}/${I}`),{method:"POST",body:JSON.stringify({})});z(yf),await c(F)}catch(yf){P(Tf(yf,`${I} 失败`))}}function Wf(I){L(I.id),N(String(I.title||""))}async function Vf(I){let yf=M.trim();if(L(""),N(""),yf)await n({type:"updateTodoTitle",todoId:I,title:yf})}async function Kf(I){let yf=window.prompt("新增子任务标题");if(yf&&yf.trim())await n({type:"addTodo",title:yf.trim(),parentId:I})}async function h(I,yf){if(!w)return;let $f={type:"moveTodo",todoId:w,targetIndex:yf};if(I)$f.targetParentId=I;R(""),await n($f)}if(sM(()=>{ff()},[y?.id,y?.runtime?.providerStatus]),!y)return _f($2,{title:"Todo Note 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=todo-note"});let g=S.find((I)=>I.id===F)||null;return _f("div",{className:"todo-note-page","data-testid":"todo-note-page"},_f($A,{title:"Todo Note 工作台",eyebrow:"Main Server 用户服务",actions:_f("div",{className:"panel-actions"},_f("button",{type:"button",className:"ghost-btn",disabled:p,onClick:()=>ff(F),"data-testid":"todo-note-refresh-button"},p?"刷新中":"刷新"),_f(eq,{title:"Todo Note 用户服务",data:y,onOpen:u,testId:"raw-todo-note-service"}))},_f("div",{className:"todo-note-hero"},_f("div",null,_f("div",{className:"node-version-line"},_f(aM,{status:Y.providerStatus==="online"?"online":"warn"},Y.providerStatus||"unknown"),_f("span",null,y.providerId),_f("span",null,m.public?"公网暴露":"仅 UniDesk frontend 代理访问"),_f("span",null,l?.ok?"Health OK":"Health --")),_f("p",{className:"muted paragraph"},y.description)),_f("div",{className:"microservice-ref-card"},_f("span",null,"Repo"),_f("strong",null,v.url||"--"),_f("code",null,v.commitId||"--")),_f("div",{className:"microservice-ref-card"},_f("span",null,"Main Server Docker"),_f("strong",null,`${m.nodeBindHost||"--"}:${m.nodePort||"--"}`),_f("code",null,`${v.composeService||"--"} / ${v.containerName||"--"}`))),_f(H0,{error:C,wide:!0})),_f("div",{className:"todo-note-layout"},_f($A,{title:"清单",eyebrow:`${S.length} Instances`,className:"todo-list-panel"},_f("form",{className:"todo-create-list",onSubmit:lf},_f("input",{placeholder:"新清单名称",value:O,onChange:(I)=>G(I.target.value),"aria-label":"新清单名称"}),_f("button",{type:"submit",className:"ghost-btn",disabled:p||!O.trim()},"创建")),S.length===0?_f($2,{title:"暂无清单",text:"迁移或创建清单后会出现在这里"}):_f("div",{className:"todo-instance-list"},S.map((I)=>_f("button",{key:I.id,type:"button",className:`todo-instance-row ${F===I.id?"active":""}`,onClick:()=>{Q(I.id),o(I.id)},"data-testid":`todo-instance-${uH(I.id)}`},_f("strong",null,I.name),_f("span",null,`${I.completedCount??0}/${I.todoCount??0} 完成`),_f("code",null,I.id))))),_f("div",{className:"todo-main-stack"},_f($A,{title:g?.name||"待选择清单",eyebrow:D?`Updated ${oM(D)}`:"Todo Tree",actions:U?_f("div",{className:"panel-actions"},_f("button",{type:"button",className:"ghost-btn",onClick:()=>n({type:"renameInstance",name:window.prompt("清单新名称",U.name)||U.name})},"重命名"),_f("button",{type:"button",className:"ghost-btn danger",onClick:()=>Gf(F)},"删除清单"),_f(eq,{title:`Todo Instance ${F}`,data:U,onOpen:u,testId:"raw-todo-instance"})):null},!U?_f($2,{title:"未选择清单",text:"左侧选择一个 Todo Note 清单"}):_f("div",{className:"todo-workbench",style:{"--todo-font-size":`${q}px`}},_f("div",{className:"todo-toolbar"},_f("form",{className:"todo-add-form",onSubmit:zf},_f("input",{placeholder:"新增根任务",value:H,onChange:(I)=>Z(I.target.value),"aria-label":"新增根任务"}),_f("button",{type:"submit",className:"ghost-btn",disabled:!H.trim()},"新增")),_f("div",{className:"todo-filter-strip"},["all","active","completed"].map((I)=>_f("button",{key:I,type:"button",className:`todo-filter ${W===I?"active":""}`,onClick:()=>K(I)},I==="all"?"全部":I==="active"?"未完成":"已完成"))),_f("div",{className:"todo-toolbar-actions"},_f("button",{type:"button",className:"ghost-btn",onClick:()=>n({type:"setAllTodosExpanded",expanded:!0})},"全部展开"),_f("button",{type:"button",className:"ghost-btn",onClick:()=>n({type:"setAllTodosExpanded",expanded:!1})},"全部收起"),_f("button",{type:"button",className:"ghost-btn",onClick:()=>jf("undo")},"撤销"),_f("button",{type:"button",className:"ghost-btn",onClick:()=>jf("redo")},"重做"),_f("label",{className:"todo-font-control"},"字号",_f("input",{type:"range",min:11,max:18,value:q,onChange:(I)=>V(Number(I.target.value))})))),_f("div",{className:"todo-stats-grid"},_f(l2,{label:"总任务",value:r.total,hint:`${S.length} lists`}),_f(l2,{label:"已完成",value:r.completed,hint:`${ur(r.total?r.completed/r.total*100:0)}`,tone:"ok"}),_f(l2,{label:"未完成",value:r.active,hint:W==="active"?"当前筛选":"active tasks",tone:r.active>0?"warn":"ok"}),_f(l2,{label:"历史指针",value:U.historyPointer??0,hint:"undo / redo"})),_f("div",{className:"todo-root-drop",onDragOver:(I)=>I.preventDefault(),onDrop:(I)=>{I.preventDefault(),h(null,(U.todos||[]).length)}},"拖到这里可移为根任务末尾"),_f("div",{className:"todo-tree","data-testid":"todo-note-tree"},(U.todos||[]).filter((I)=>j2(I,W)).length===0?_f($2,{title:"没有匹配任务",text:"调整筛选或新增任务"}):(U.todos||[]).filter((I)=>j2(I,W)).map((I,yf)=>_f(lH,{key:I.id,todo:I,depth:0,parentId:null,index:yf,siblingCount:U.todos.length,filter:W,editingId:E,editingTitle:M,setEditingTitle:N,beginEdit:Wf,saveEdit:Vf,applyTodoAction:n,addChild:Kf,dragTodoId:w,setDragTodoId:R,dropTodo:h}))))))))}function lH(f){let{todo:u,depth:_,parentId:y,index:l,siblingCount:$,filter:j,editingId:J,editingTitle:F,setEditingTitle:Q,beginEdit:U,saveEdit:z,applyTodoAction:W,addChild:K,dragTodoId:q,setDragTodoId:V,dropTodo:O}=f,G=Array.isArray(u.children)?u.children:[],H=G.filter((L)=>j2(L,j)),Z=J===u.id,E=y||null;return _f("div",{className:"todo-row-wrap"},_f("article",{className:`todo-row ${u.completed?"completed":""} ${q===u.id?"dragging":""}`,style:{"--todo-depth":_},draggable:!0,onDragStart:(L)=>{V(u.id),L.dataTransfer.effectAllowed="move"},onDragOver:(L)=>L.preventDefault(),onDrop:(L)=>{L.preventDefault(),O(u.id,G.length)},"data-testid":`todo-row-${uH(u.id)}`},_f("button",{type:"button",className:"todo-expand",disabled:G.length===0,onClick:()=>W({type:"toggleTodoExpanded",todoId:u.id})},G.length===0?"·":u.expanded?"▾":"▸"),_f("input",{type:"checkbox",checked:Boolean(u.completed),onChange:()=>W({type:"toggleTodoCompleted",todoId:u.id}),"aria-label":`完成 ${u.title}`}),_f("div",{className:"todo-title-cell",onDoubleClick:()=>U(u)},Z?_f("div",{className:"todo-edit-inline"},_f("input",{value:F,autoFocus:!0,onChange:(L)=>Q(L.target.value),onKeyDown:(L)=>{if(L.key==="Enter")z(u.id);if(L.key==="Escape")U({id:"",title:""})}}),_f("button",{type:"button",className:"ghost-btn",onClick:()=>z(u.id)},"保存")):_f("strong",null,u.title||"Untitled"),_f("div",{className:"todo-meta-line"},_f("span",null,`子项 ${G.length}`),_f("span",null,`更新 ${dq(u.updatedAt)}`),u.reminderAt?_f("span",{className:"todo-reminder"},`提醒 ${dq(u.reminderAt)}`):_f("span",null,"无提醒"))),_f("input",{className:"todo-reminder-input",type:"datetime-local",value:_r(u.reminderAt),onChange:(L)=>W({type:"setTodoReminder",todoId:u.id,reminderAt:yr(L.target.value)})}),_f("div",{className:"todo-row-actions"},_f("button",{type:"button",className:"ghost-btn",onClick:()=>U(u)},"编辑"),_f("button",{type:"button",className:"ghost-btn",onClick:()=>K(u.id)},"子项"),_f("button",{type:"button",className:"ghost-btn",disabled:l<=0,onClick:()=>W({type:"moveTodo",todoId:u.id,...E?{targetParentId:E}:{},targetIndex:l-1})},"上移"),_f("button",{type:"button",className:"ghost-btn",disabled:l>=$-1,onClick:()=>W({type:"moveTodo",todoId:u.id,...E?{targetParentId:E}:{},targetIndex:l+1})},"下移"),_f("button",{type:"button",className:"ghost-btn",disabled:!y,onClick:()=>W({type:"moveTodo",todoId:u.id,targetIndex:9999})},"提升"),_f("button",{type:"button",className:"ghost-btn danger",onClick:()=>W({type:"deleteTodo",todoId:u.id})},"删除"))),u.expanded&&H.length>0?_f("div",{className:"todo-children"},H.map((L,M)=>_f(lH,{key:L.id,todo:L,depth:_+1,parentId:u.id,index:M,siblingCount:G.length,filter:j,editingId:J,editingTitle:F,setEditingTitle:Q,beginEdit:U,saveEdit:z,applyTodoAction:W,addChild:K,dragTodoId:q,setDragTodoId:V,dropTodo:O}))):null)}var $H=Sf(I0(),1),yy=$H.default.createElement;function jH({title:f,items:u,actions:_,className:y,testId:l}){let $=Array.isArray(u)?u:[];return yy("section",{className:`top-status-bar ${y||""}`,"data-testid":l},yy("div",{className:"top-status-main"},f?yy("strong",{className:"top-status-title"},f):null,yy("div",{className:"top-status-chips"},$.map((j,J)=>yy("span",{key:j?.key||`${j?.label||"status"}-${J}`,className:`top-status-chip ${j?.tone||""}`,"data-testid":j?.testId},j?.label?yy("b",null,j.label):null,yy("span",null,j?.value??"--"))))),_?yy("div",{className:"top-status-actions"},_):null)}function ZH(f,u){let _=document.getElementById("root")?.getAttribute(f);if(!_)return u;try{let y=JSON.parse(_);return typeof y==="object"&&y!==null&&!Array.isArray(y)?y:u}catch{return u}}var sf=ZH("data-config",{apiBaseUrl:"/api",authUsername:"admin"}),lr=ZH("data-codex-overview",null),A=Q2.default.createElement,{useEffect:p1,useMemo:S6}=Q2.default,If=Q2.default.useState,mu=yG(b4),$r={id:"codex-queue",name:"Codex Queue",providerId:"main-server",description:"Codex Queue",repository:{containerName:"codex-queue-backend"},backend:{nodeBaseUrl:"http://codex-queue:4222",nodeBindHost:"codex-queue",nodePort:4222,public:!1},runtime:{providerStatus:"loading",providerName:"main-server"}};function m0(f){if(!f)return"--";let u=new Date(f);if(Number.isNaN(u.getTime()))return"--";return u.toLocaleString("zh-CN",{hour12:!1})}function F2(f){return f.toLocaleTimeString("zh-CN",{hour12:!1})}function ql(f){if(!Number.isFinite(f))return"--";let u=Math.max(0,f);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 _=Math.floor(u);if(_<3600)return`${Math.floor(_/60)}m ${_%60}s`;return`${Math.floor(_/3600)}h ${Math.floor(_%3600/60)}m`}function pu(f){let u=Number(f);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 ql(u/1000)}function Ju(f){let u=Number(f);if(!Number.isFinite(u)||u<=0)return"--";let _=["B","KB","MB","GB","TB"],y=u,l=0;while(y>=1024&&l<_.length-1)y/=1024,l+=1;return`${y.toFixed(l===0?0:1)} ${_[l]}`}function ly(f){let u=Number(f);return Number.isFinite(u)?`${Math.max(0,Math.min(100,u)).toFixed(1)}%`:"--"}function jr(f){let u=Number(f);return Number.isFinite(u)?`${Math.max(0,u).toFixed(1)}%`:"--"}function jA(f){let u=Number(f);if(!Number.isFinite(u)||u<=0)return"0 B/s";return`${Ju(u)}/s`}function Mf(f,u=0){let _=Number(f);return Number.isFinite(_)?_:u}function Hl(f){return["queued","dispatched","running"].includes(String(f?.status||"").toLowerCase())}function AA(f){if(!f)return"--";let u=new Date(f);if(Number.isNaN(u.getTime()))return"--";return ql(Math.max(0,Math.floor((Date.now()-u.getTime())/1000)))}function Kl(f){if(!f)return null;let u=new Date(f);return Number.isNaN(u.getTime())?null:u.getTime()}function qH(f){let u=Kl(f?.createdAt);if(u===null)return null;let y=["succeeded","failed"].includes(String(f?.status||"").toLowerCase())?Kl(f?.updatedAt):Date.now();if(y===null)return null;return Math.max(0,(y-u)/1000)}function HH(f){if(String(f?.status||"").toLowerCase()!=="failed")return"";let u=f?.result;if(typeof u==="string")return u;if(u&&typeof u==="object"&&!Array.isArray(u)){let _=u;for(let y of["error","reason","message","stderr","detail"])if(typeof _[y]==="string"&&_[y].length>0)return _[y]}return"任务失败但 provider 未返回明确原因"}function ay(f){if(f===null||f===void 0)return"--";if(typeof f==="boolean")return f?"是":"否";if(typeof f==="number")return String(f);if(typeof f==="string")return f.length>80?`${f.slice(0,77)}...`:f;if(Array.isArray(f))return`${f.length} 项`;if(typeof f==="object")return`${Object.keys(f).length} 字段`;return String(f)}function Jr(f,u){if(f==="bodyText"&&typeof u==="string")return`${/^\s*[{[]/.test(u)?"JSON":"HTTP"} body ${u.length} chars`;return ay(u)}function VH(f){if(!f||typeof f!=="object"||Array.isArray(f))return[];return Object.entries(f)}function N1(f){return String(f).replace(/[^a-zA-Z0-9_-]/g,"_")}function QA(f,u){return f&&typeof f==="object"&&!Array.isArray(f)?f[u]:void 0}function U2(f,u,_="未知"){let y=QA(f?.labels,u);return typeof y==="string"&&y.length>0?y:_}function EH(f){return U2(f,"providerGatewayVersion")}function r6(f){return U2(f,"providerGatewayUpgradePolicy")}function JH(f){return U2(f,"providerGatewayStartedAt","")}function OH(f){let u=QA(f?.labels,"unideskCapabilities");if(typeof u==="string")return u.split(",").map((_)=>_.trim()).filter(Boolean);return Array.isArray(u)?u.filter((_)=>typeof _==="string"):[]}function XH(f,u){return OH(f).includes(u)}function FH(f,u){let _=QA(f?.labels,u);return _===!0||_==="true"||_==="1"}function Fr(f){if(!XH(f,"host.ssh"))return{tone:"fail",label:"不可用",detail:"未声明 host.ssh"};if(!FH(f,"hostSshConfigured"))return{tone:"warn",label:"未配置",detail:"缺少 SSH 环境变量"};if(!FH(f,"hostSshKeyPresent"))return{tone:"warn",label:"缺 key",detail:"私钥未挂载"};return{tone:"ok",label:"可用",detail:U2(f,"hostSshTarget","host.ssh ready")}}function Ar(f){if(!XH(f,"provider.upgrade"))return{tone:"fail",label:"不可用",detail:"未声明 provider.upgrade"};let u=r6(f);if(u!=="always-enabled")return{tone:"warn",label:"待确认",detail:`策略 ${u}`};return{tone:"ok",label:"可用",detail:"always-enabled"}}function UA(f){let u=typeof f==="string"&&f.length>0?f:"未知";if(u==="未知")return"版本未知";return u.startsWith("v")?u:`v${u}`}function NH(f){return f?.payload&&typeof f.payload==="object"&&!Array.isArray(f.payload)?f.payload:{}}function W2(f){return f?.result&&typeof f.result==="object"&&!Array.isArray(f.result)?f.result:{}}function A2(f){let u=NH(f),_=W2(f);return(u.mode??_.mode)==="schedule"?"schedule":"plan"}function Qr(f){let u=NH(f).source;return typeof u==="string"&&u.length>0?u:"unknown"}function Ur(f){let u=W2(f),y=(u.plan&&typeof u.plan==="object"&&!Array.isArray(u.plan)?u.plan:{}).policy;return typeof y==="string"&&y.length>0?y:"--"}function LH(f){let u=W2(f),_=u.plan&&typeof u.plan==="object"&&!Array.isArray(u.plan)?u.plan:{},y=u.targetProviderGatewayVersion??u.providerGatewayVersion??_.targetProviderGatewayVersion??_.providerGatewayVersion;return typeof y==="string"&&y.length>0?UA(y):"版本未知"}function YH(f){if(String(f?.status||"").toLowerCase()==="failed")return HH(f);if(Hl(f))return"等待 provider 回传升级终态";let _=W2(f);if(typeof _.updaterContainerId==="string"&&_.updaterContainerId.length>0)return`updater ${_.updaterContainerId.slice(0,18)}`;if(typeof _.message==="string"&&_.message.length>0)return _.message;if(_.plan)return"升级计划已生成";return"无升级结果摘要"}function BH(f,u){return f.filter((_)=>_?.providerId===u&&_?.command==="provider.upgrade").sort((_,y)=>(Kl(y.updatedAt)??0)-(Kl(_.updatedAt)??0))}function Wr(f){return f.find((u)=>A2(u)==="schedule")||f[0]||null}function wH(f){return f?.runtime&&typeof f.runtime==="object"&&!Array.isArray(f.runtime)?f.runtime:{}}function AH(f){return f?.backend&&typeof f.backend==="object"&&!Array.isArray(f.backend)?f.backend:{}}function zr(f){return f?.repository&&typeof f.repository==="object"&&!Array.isArray(f.repository)?f.repository:{}}function E0({status:f,children:u}){let _=String(f||"unknown").toLowerCase();return A("span",{className:`status-badge ${_}`},u||f||"unknown")}function f0({label:f,value:u,hint:_,tone:y,onClick:l,testId:$}){let j=typeof l==="function";return A("article",{className:`metric-card ${y||""} ${j?"clickable":""}`,role:j?"button":void 0,tabIndex:j?0:void 0,"data-testid":$,onClick:l,onKeyDown:j?(J)=>{if(J.key==="Enter"||J.key===" ")J.preventDefault(),l()}:void 0},A("div",{className:"metric-label"},f),A("div",{className:"metric-value"},u),A("div",{className:"metric-hint"},_))}function kf({title:f,eyebrow:u,actions:_,children:y,className:l}){return A("section",{className:`panel ${l||""}`},A("div",{className:"panel-head"},A("div",null,u?A("p",{className:"panel-eyebrow"},u):null,A("h2",null,f)),_?A("div",{className:"panel-actions"},_):null),A("div",{className:"panel-body"},y))}function k0({title:f,data:u,onOpen:_,testId:y}){return A("button",{type:"button",className:"ghost-btn","data-testid":y,onClick:()=>_(f,u)},"查看原始JSON")}function Gr({raw:f,onClose:u}){if(!f)return null;return A("div",{className:"modal-backdrop",role:"presentation"},A("section",{className:"raw-dialog",role:"dialog","aria-modal":"true","aria-label":f.title},A("div",{className:"raw-dialog-head"},A("h2",null,f.title),A("button",{type:"button",className:"ghost-btn",onClick:u},"关闭")),A("pre",{className:"raw-json","data-testid":"raw-json"},JSON.stringify(f.data,null,2))))}function DH({labels:f,limit:u=8}){let _=VH(f).slice(0,u);if(_.length===0)return A("span",{className:"muted"},"无标签");return A("div",{className:"chip-row"},_.map(([y,l])=>A("span",{key:y,className:"data-chip"},A("b",null,y),A("span",null,ay(l)))))}function Zl({node:f}){let u=EH(f);return A("span",{className:`version-chip ${u==="未知"?"unknown":""}`,"data-testid":`gateway-version-${N1(f?.providerId||"unknown")}`},UA(u))}function QH({title:f,state:u,testId:_}){return A("span",{className:`capability-badge ${u.tone}`,title:u.detail,"data-testid":_},A("b",null,f),A("strong",null,u.label),A("small",null,u.detail))}function WA({node:f}){let u=N1(f?.providerId||"unknown");return A("div",{className:"node-availability-strip"},A(QH,{title:"SSH 透传",state:Fr(f),testId:`ssh-availability-${u}`}),A(QH,{title:"远程更新",state:Ar(f),testId:`upgrade-availability-${u}`}))}function dy({data:f,empty:u="无数据"}){if(f===null||f===void 0)return A("span",{className:"muted"},u);if(typeof f!=="object")return A("span",{className:"summary-value"},ay(f));if(Array.isArray(f))return A("span",{className:"summary-value"},`${f.length} 项列表`);let _=Object.entries(f).slice(0,5);if(_.length===0)return A("span",{className:"muted"},u);return A("div",{className:"summary-grid"},_.map(([y,l])=>A("span",{key:y,className:"summary-item"},A("b",null,y),A("span",null,Jr(y,l)))))}function $0({title:f,text:u}){return A("div",{className:"empty-state"},A("strong",null,f),A("span",null,u))}function Kr({onLogin:f}){let[u,_]=If(sf.authUsername||"admin"),[y,l]=If(""),[$,j]=If(""),[J,F]=If(!1);async function Q(U){U.preventDefault(),F(!0),j("");try{let z=await Df("/login",{method:"POST",body:JSON.stringify({username:u,password:y})});f(z)}catch(z){j(Tf(z,"登录失败"))}finally{F(!1)}}return A("main",{className:"login-screen","data-testid":"login-screen"},A("section",{className:"login-card"},A("div",{className:"login-brand"},A("span",{className:"brand-mark"},"UD"),A("div",null,A("h1",null,"UniDesk"),A("p",null,"Control Plane Login"))),A("form",{className:"login-form",onSubmit:Q},A("label",null,"账号",A("input",{name:"username",autoComplete:"username",value:u,onChange:(U)=>_(U.target.value)})),A("label",null,"密码",A("input",{name:"password",type:"password",autoComplete:"current-password",value:y,onChange:(U)=>l(U.target.value)})),A(H0,{error:$}),A("button",{type:"submit",disabled:J},J?"登录中":"登录")),A("div",{className:"login-note"},"默认账号由 config.json 注入;公网入口只暴露前端登录面。")))}function Zr({connection:f,lastRefresh:u,onRefresh:_,onLogout:y,session:l,clock:$,activeStatusItems:j=[]}){let J=[{key:"core",label:"核心",value:f.text,tone:f.ok?"ok":"fail",testId:"conn-text"},...Array.isArray(j)?j:[],{key:"refresh",label:"刷新",value:u?F2(u):"未刷新"},{key:"clock",label:"时间",value:F2($)},{key:"user",label:"用户",value:l?.user?.username||"--",tone:"user"}];return A("header",{className:"topbar"},A("div",null,A("p",{className:"eyebrow"},"Distributed Work Platform"),A("h1",null,"UniDesk 控制平面")),A(jH,{className:"global-top-status",title:"状态",items:J,actions:[A("button",{key:"refresh",type:"button",className:"ghost-btn",onClick:_},"刷新"),A("button",{key:"logout",type:"button",className:"ghost-btn danger",onClick:y},"退出")]}))}function qr({activeModule:f,activeTabs:u,onNavigate:_,collapsed:y,onToggle:l}){return A("aside",{className:`rail ${y?"collapsed":""}`,"aria-label":"主模块"},A("div",{className:"brand"},A("span",{className:"brand-mark"},"UD"),A("span",{className:"brand-text"},"UniDesk"),A("button",{type:"button",className:"rail-toggle",onClick:l,"aria-label":y?"展开左侧边栏":"收起左侧边栏","data-testid":"rail-toggle"},y?"»":"«")),b4.map(($)=>A("button",{key:$.id,type:"button",className:`module ${f===$.id?"active":""}`,onClick:()=>_($.id,u[$.id]||p3[$.id]||$.tabs[0]?.id||""),title:$.label,"data-route":I$(mu,$.id,u[$.id]||p3[$.id]||$.tabs[0]?.id||"")},A("span",{className:"module-code"},$.code),A("span",null,$.label))))}function Hr({module:f,activeTab:u,onNavigate:_}){return A("nav",{className:"tabs","aria-label":`${f.label} 子功能`},f.tabs.map((y)=>A("button",{key:y.id,type:"button",className:`tab ${u===y.id?"active":""}`,onClick:()=>_(f.id,y.id),"data-route":I$(mu,f.id,y.id)},y.label)))}function Vr({data:f,onRaw:u,onNavigate:_}){let y=f.overview||{},l=f.nodes.filter((Q)=>Q.status==="online"),$=f.pendingTasks||f.tasks.filter(Hl),j=y.pendingTaskCount??$.length,J=f.tasks.slice(0,5),F=y.pgdata||{};return A("div",{className:"page-grid overview-grid","data-testid":"overview-page"},A(kf,{title:"核心指标",eyebrow:"Control"},A("div",{className:"metric-grid"},A(f0,{label:"数据库",value:y.dbReady?"READY":"WAIT",hint:"PostgreSQL internal network",tone:y.dbReady?"ok":"warn"}),A(f0,{label:"PGDATA",value:Ju(F.databaseBytes),hint:`${F.volumeName||"unidesk_pgdata_10gb"} / ${F.databasePretty||"--"}`,tone:"ok",testId:"pgdata-usage-card"}),A(f0,{label:"在线节点",value:y.onlineNodeCount??0,hint:`${y.nodeCount??0} registered`,tone:"ok"}),A(f0,{label:"WebSocket",value:y.activeSocketCount??0,hint:"Provider ingress sockets"}),A(f0,{label:"待处理任务",value:j,hint:j>0?"点击查看具体任务":`timeout ${ql(Math.floor((y.taskPendingTimeoutMs??0)/1000))}`,tone:j>0?"warn":"ok",onClick:()=>_("tasks","pending"),testId:"pending-task-card"}))),A(kf,{title:"本机 Provider",eyebrow:"Self Connected"},l.length===0?A($0,{title:"暂无在线节点",text:"provider-gateway 未完成自接入"}):A("div",{className:"node-card-list"},l.slice(0,4).map((Q)=>A(Er,{key:Q.providerId,node:Q,onRaw:u})))),A(kf,{title:"待处理任务明细",eyebrow:`${j} Pending`,actions:A("button",{type:"button",className:"ghost-btn",onClick:()=>_("tasks","pending"),"data-testid":"pending-task-detail-link"},"进入任务调度")},$.length===0?A($0,{title:"当前无待处理",text:"queued / dispatched / running 超时后会自动转为 failed,避免总览长期卡住"}):A("div",{className:"compact-list"},$.slice(0,5).map((Q)=>A(GH,{key:Q.id,task:Q,onRaw:u})))),A(kf,{title:"最近任务",eyebrow:"Dispatch"},J.length===0?A($0,{title:"暂无任务",text:"可以在任务调度模块发起 docker.ps 或 echo"}):A("div",{className:"compact-list"},J.map((Q)=>A(GH,{key:Q.id,task:Q,onRaw:u})))))}function Er({node:f,onRaw:u}){return A("article",{className:"node-card"},A("div",{className:"node-card-head"},A("div",null,A("strong",null,f.name),A("code",null,f.providerId)),A(E0,{status:f.status})),A("div",{className:"node-version-line"},A(Zl,{node:f}),A("span",null,`升级策略 ${r6(f)}`)),A(WA,{node:f}),A(DH,{labels:f.labels,limit:6}),A("div",{className:"node-card-foot"},A("span",null,`心跳 ${m0(f.lastHeartbeat)}`),A(k0,{title:`Provider ${f.providerId}`,data:f,onOpen:u,testId:`raw-node-${N1(f.providerId)}`})))}function Or({events:f,onRaw:u}){return A(kf,{title:"事件摘要",eyebrow:"Latest 100"},f.length===0?A($0,{title:"暂无事件",text:"Provider 注册、心跳超时和任务状态会写入事件流"}):A("div",{className:"table-wrap"},A("table",null,A("thead",null,A("tr",null,A("th",null,"ID"),A("th",null,"类型"),A("th",null,"来源"),A("th",null,"摘要"),A("th",null,"时间"),A("th",null,"操作"))),A("tbody",null,f.map((_)=>A("tr",{key:_.id},A("td",null,A("code",null,_.id)),A("td",null,A(E0,{status:_.type},_.type)),A("td",null,A("code",null,_.source)),A("td",null,A(dy,{data:_.payload})),A("td",null,m0(_.createdAt)),A("td",null,A(k0,{title:`Event ${_.id}`,data:_,onOpen:u}))))))))}function Xr({logs:f,onRaw:u}){return A(kf,{title:"服务日志",eyebrow:"Core Recent"},f.length===0?A($0,{title:"暂无日志",text:"backend-core 内存日志会在请求和 provider 事件后出现"}):A("div",{className:"log-list"},f.slice(-80).reverse().map((_,y)=>A("article",{key:y,className:`log-row ${_.level||"info"}`},A("span",null,m0(_.ts)),A("b",null,_.level||"info"),A("strong",null,_.message||"log"),A(dy,{data:_.data,empty:"无附加字段"}),A(k0,{title:`Log ${_.message||y}`,data:_,onOpen:u})))))}function Nr({nodes:f,onRaw:u}){return A(kf,{title:"节点清单",eyebrow:`${f.length} Providers`},f.length===0?A($0,{title:"暂无 Provider 节点",text:"确认 provider-gateway 已连接 provider ingress"}):A("div",{className:"table-wrap"},A("table",{className:"node-list-table"},A("thead",null,A("tr",null,A("th",null,"状态"),A("th",null,"Provider"),A("th",null,"网关版本"),A("th",null,"运维可用性"),A("th",null,"资源标签"),A("th",null,"连接时间"),A("th",null,"最后心跳"),A("th",null,"操作"))),A("tbody",null,f.map((_)=>A("tr",{key:_.providerId},A("td",null,A(E0,{status:_.status})),A("td",null,A("strong",null,_.name),A("code",null,_.providerId)),A("td",null,A("div",{className:"gateway-cell"},A(Zl,{node:_}),A("span",null,r6(_)))),A("td",null,A(WA,{node:_})),A("td",null,A(DH,{labels:_.labels,limit:5})),A("td",null,m0(_.connectedAt)),A("td",null,m0(_.lastHeartbeat)),A("td",null,A(k0,{title:`Provider ${_.providerId}`,data:_,onOpen:u,testId:`raw-node-table-${N1(_.providerId)}`}))))))))}function Lr({nodes:f}){let u=S6(()=>{let _=[];for(let y of f)for(let[l,$]of VH(y.labels))_.push({providerId:y.providerId,name:y.name,key:l,value:$});return _},[f]);return A(kf,{title:"资源标签",eyebrow:"Structured Labels"},u.length===0?A($0,{title:"暂无标签",text:"provider-gateway 注册消息会同步资源标签"}):A("div",{className:"label-matrix"},u.map((_)=>A("article",{key:`${_.providerId}-${_.key}`,className:"label-card"},A("span",null,_.key),A("strong",null,ay(_.value)),A("code",null,_.providerId)))))}function Yr({nodes:f}){return A(kf,{title:"心跳状态",eyebrow:"Provider Liveness"},f.length===0?A($0,{title:"无心跳",text:"等待 provider 注册和 heartbeat"}):A("div",{className:"heartbeat-list"},f.map((u)=>A("article",{key:u.providerId,className:"heartbeat-row"},A("span",{className:`pulse ${u.status}`}),A("div",null,A("strong",null,u.name),A("code",null,u.providerId)),A("div",null,A("span",null,"connected"),A("b",null,m0(u.connectedAt))),A("div",null,A("span",null,"last heartbeat"),A("b",null,m0(u.lastHeartbeat)))))))}function Br({nodes:f,systemStatuses:u,tasks:_,onRaw:y,refresh:l}){let[$,j]=If(""),J=S6(()=>f.map((V)=>{let O=u.find((G)=>G.providerId===V.providerId);return{...V,systemCurrent:O?.current||null,systemHistory:O?.history||[],systemUpdatedAt:O?.updatedAt||null}}),[f,u]),F=J.find((V)=>V.providerId===$)||J[0]||null;if(p1(()=>{if(!$&&J[0])j(J[0].providerId)},[J.length,$]),!F)return A($0,{title:"暂无资源监控",text:"等待 provider 上报 CPU、内存和硬盘指标"});let Q=F.systemCurrent,U=F.systemHistory||[],z=Q?.cpu||{},W=Q?.memory||{},K=Q?.disk||{},q=U.length>0?U:Q?[{at:Q.collectedAt,cpuPercent:Mf(z.percent),memoryPercent:Mf(W.percent),diskPercent:Mf(K.percent)}]:[];return A("div",{className:"monitor-page","data-testid":"node-monitor-page"},A("div",{className:"docker-node-strip"},J.map((V)=>A("button",{key:V.providerId,type:"button",className:`docker-node-tile ${F.providerId===V.providerId?"active":""}`,onClick:()=>j(V.providerId)},A("span",{className:`pulse ${V.status}`}),A("strong",null,V.name),A("code",null,V.providerId),A("span",null,V.systemCurrent?`CPU ${ly(V.systemCurrent.cpu?.percent)} / MEM ${ly(V.systemCurrent.memory?.percent)}`:"等待指标")))),A("div",{className:"monitor-layout"},A(kf,{title:"任务管理器视图",eyebrow:F.name,className:"monitor-main-panel",actions:Q?A(k0,{title:`System ${F.providerId}`,data:{current:Q,history:U},onOpen:y}):null},!Q?A($0,{title:"系统指标未上报",text:"provider-gateway 会周期性采集 /proc 与 df,并保存历史曲线"}):A("div",null,A("div",{className:"monitor-hero"},A("div",null,A("p",{className:"panel-eyebrow"},"Node Performance"),A("h3",null,F.name),A("div",{className:"docker-meta"},A("span",null,`${z.cores||0} CPU cores`),A("span",null,`load ${Mf(z.load1).toFixed(2)} / ${Mf(z.load5).toFixed(2)} / ${Mf(z.load15).toFixed(2)}`),A("span",null,`memory actual ${Ju(W.usedBytes)} / ${Ju(W.totalBytes)}`),A("span",null,`disk ${Ju(K.usedBytes)} / ${Ju(K.totalBytes)}`))),A(E0,{status:Q.ok?"online":"warn"},Q.ok?"METRICS READY":"METRICS DEGRADED")),A("div",{className:"monitor-chart-grid"},A(JA,{title:"CPU",metricKey:"cpuPercent",current:z.percent,points:q,detail:`${z.cores||0} cores / load ${Mf(z.load1).toFixed(2)}`,tone:"cpu",testId:"metric-chart-cpu"}),A(JA,{title:"Memory",metricKey:"memoryPercent",current:W.percent,points:q,detail:`${Ju(W.usedBytes)} actual / ${Ju(W.cacheBytes)} cache excluded`,tone:"memory",testId:"metric-chart-memory"}),A(JA,{title:"Disk",metricKey:"diskPercent",current:K.percent,points:q,detail:`${K.path||"/"} mounted ${K.mount||"--"}`,tone:"disk",testId:"metric-chart-disk"})),A("div",{className:"monitor-summary-grid"},A(f0,{label:"CPU 当前",value:ly(z.percent),hint:`history ${q.length} samples`,tone:"ok"}),A(f0,{label:"实际内存",value:Ju(W.usedBytes),hint:`${ly(W.percent)} 不含缓存`}),A(f0,{label:"硬盘已用",value:Ju(K.usedBytes),hint:ly(K.percent)}),A(f0,{label:"更新时间",value:m0(F.systemUpdatedAt||Q.collectedAt),hint:F.providerId})),A(wr,{current:Q,onRaw:y}))),A("div",{className:"monitor-side-stack"},A(Rr,{provider:F,refresh:l,onRaw:y}),A(xr,{provider:F,tasks:_,onRaw:y,limit:5}),A(kf,{title:"采样说明",eyebrow:"Retention"},A("div",{className:"monitor-note-list"},A("article",null,A("b",null,"CPU"),A("span",null,"从 /proc/stat 计算相邻采样差值,首个采样用 load/cores 近似")),A("article",null,A("b",null,"Memory"),A("span",null,"实际内存 = MemTotal - MemFree - Buffers - Cached - SReclaimable + Shmem,不把 page cache / buffer 计入占用")),A("article",null,A("b",null,"Disk"),A("span",null,"使用 df -PB1 对配置路径采样,默认监控根文件系统")),A("article",null,A("b",null,"Process"),A("span",null,"从 /proc/[pid] 采集进程 CPU、实际内存 RSS、线程数和磁盘 I/O 速率;表格默认按内存占用降序")))))))}function UH(f,u){if(u==="memory")return Mf(f.rssBytes);if(u==="cpu")return Mf(f.cpuPercent);if(u==="disk")return Mf(f.readBytesPerSecond)+Mf(f.writeBytesPerSecond);if(u==="pid")return Mf(f.pid);if(u==="threads")return Mf(f.threads);if(u==="runtime")return Mf(f.elapsedSeconds);if(u==="user")return String(f.user||"");return String(f.name||f.command||"")}function WH({value:f,label:u,tone:_}){let y=Math.max(1,Math.min(100,Mf(f)));return A("div",{className:`process-meter ${_||""}`},A("span",{style:{width:`${y}%`}}),A("b",null,u))}function wr({current:f,onRaw:u}){let[_,y]=If({key:"memory",direction:"desc"}),l=f?.processSummary&&typeof f.processSummary==="object"?f.processSummary:{},$=Array.isArray(f?.processes)?f.processes:[],j=S6(()=>{let F=_.direction==="asc"?1:-1;return[...$].sort((Q,U)=>{let z=UH(Q,_.key),W=UH(U,_.key);if(typeof z==="string"||typeof W==="string")return String(z).localeCompare(String(W),"zh-CN")*F;return(z-W)*F||Mf(Q.pid)-Mf(U.pid)})},[$,_.key,_.direction]),J=(F,Q)=>{let U=_.key===Q,z=U?_.direction==="asc"?"ascending":"descending":"none";return A("th",{"aria-sort":z},A("button",{type:"button",className:`process-sort-button ${U?"active":""}`,"data-testid":`process-sort-${Q}`,onClick:()=>y((W)=>({key:Q,direction:W.key===Q&&W.direction==="desc"?"asc":"desc"}))},F,A("span",null,U?_.direction==="desc"?"↓":"↑":"↕")))};return A("section",{className:"process-resource-panel","data-testid":"process-resource-panel"},A("div",{className:"process-resource-head"},A("div",null,A("p",{className:"panel-eyebrow"},"Windows Resource Monitor Style"),A("h3",null,"进程资源占用")),A("div",{className:"process-resource-actions"},A("span",{className:"data-chip"},"默认按内存排序"),A("span",{className:"data-chip"},`${Mf(l.visible,j.length)} / ${Mf(l.total,j.length)} 进程`),A(k0,{title:"Process Resource Snapshot",data:{processSummary:l,processes:$},onOpen:u,testId:"raw-process-resources"}))),j.length===0?A($0,{title:"暂无进程资源数据",text:"等待 provider-gateway 上报 /proc/[pid] 采样;旧版 provider 需要先升级到支持进程资源表的版本"}):A("div",{className:"process-table-wrap"},A("table",{className:"process-resource-table","data-testid":"process-resource-table"},A("thead",null,A("tr",null,J("进程","name"),J("PID","pid"),J("用户","user"),A("th",null,"状态"),J("CPU","cpu"),J("内存","memory"),A("th",null,"RSS"),J("磁盘 I/O","disk"),J("线程","threads"),J("运行时长","runtime"))),A("tbody",null,j.map((F)=>{let Q=Mf(F.readBytesPerSecond)+Mf(F.writeBytesPerSecond);return A("tr",{key:`${F.pid}-${F.startedAt}`,"data-testid":`process-row-${N1(F.pid)}`,"data-memory-bytes":String(Mf(F.rssBytes)),"data-cpu-percent":String(Mf(F.cpuPercent)),"data-disk-bps":String(Q),"data-pid":String(Mf(F.pid))},A("td",null,A("div",{className:"process-name-cell"},A("strong",null,F.name||"--"),A("span",{className:"process-command"},F.command||"--"))),A("td",null,A("code",null,F.pid||"--")),A("td",null,F.user||`uid:${F.uid??"--"}`),A("td",null,A("span",{className:`process-state state-${N1(F.state||"unknown")}`},F.state||"?")),A("td",null,A(WH,{value:F.cpuPercent,label:jr(F.cpuPercent),tone:"cpu"})),A("td",null,A(WH,{value:F.memoryPercent,label:ly(F.memoryPercent),tone:"memory"})),A("td",null,Ju(F.rssBytes)),A("td",null,A("div",{className:"process-io-cell"},A("strong",null,jA(Q)),A("span",null,`R ${jA(F.readBytesPerSecond)} / W ${jA(F.writeBytesPerSecond)}`))),A("td",null,F.threads||0),A("td",null,ql(Mf(F.elapsedSeconds))))})))))}function JA({title:f,metricKey:u,current:_,points:y,detail:l,tone:$,testId:j}){let J=y.map((W)=>Math.max(0,Math.min(100,Mf(W[u])))),F=J.length>1?J:[J[0]||0,J[0]||0],Q=F.length<=1?100:100/(F.length-1),U=F.map((W,K)=>`${(K*Q).toFixed(2)},${(46-W*0.42).toFixed(2)}`).join(" "),z=`0,48 ${U} 100,48`;return A("article",{className:`metric-chart ${$}`,"data-testid":j},A("div",{className:"metric-chart-head"},A("div",null,A("span",null,f),A("strong",null,ly(_))),A("code",null,`${y.length} pts`)),A("svg",{viewBox:"0 0 100 48",preserveAspectRatio:"none",role:"img","aria-label":`${f} usage curve`},A("polygon",{points:z}),A("polyline",{points:U}),A("line",{x1:"0",x2:"100",y1:"24",y2:"24"})),A("div",{className:"metric-chart-foot"},A("span",null,"0%"),A("span",null,l),A("span",null,"100%")))}function U_(f){return Array.isArray(f)?f:[]}function Dr(f){let u=U_(f?.core?.requests?.componentSummary);return[...U_(f?.frontend?.requests?.componentSummary),...u].sort((y,l)=>Mf(l.requestCount)-Mf(y.requestCount))}function Tr(f){let u=U_(f?.core?.operations?.summary);return[...U_(f?.frontend?.operations?.summary),...u].sort((y,l)=>Mf(l.count)-Mf(y.count))}function Mr(f){let u=U_(f?.core?.requests?.recentFailures).map((y)=>({source:"backend",...y}));return[...U_(f?.frontend?.requests?.recentFailures).map((y)=>({source:"frontend",...y})),...u].sort((y,l)=>(Kl(l.at)??0)-(Kl(y.at)??0)).slice(0,20)}function rr(f){let u=U_(f?.core?.operations?.recentSlowOperations);return[...U_(f?.frontend?.operations?.recentSlowOperations),...u].sort((y,l)=>Mf(l.durationMs)-Mf(y.durationMs)).slice(0,20)}function Sr(f){let u=performance.memory,_=Number(u?.usedJSHeapSize);if(Number.isFinite(_)&&_>0)return _;let y=Number(f?.appBundleBytes);if(Number.isFinite(y)&&y>0)return y;return Mf(f?.process?.heapUsedBytes)}function Pr({points:f}){let u=U_(f),_=u.map((W)=>Mf(W.mb)),y=Math.max(1,..._),l=Math.max(0,Math.min(..._,0)),$=Math.max(1,y-l),j=u.length>1?u:[...u,...u],J=j.length<=1?100:100/(j.length-1),F=j.map((W,K)=>{let q=Mf(W.mb);return`${(K*J).toFixed(2)},${(48-(q-l)/$*42).toFixed(2)}`}).join(" "),Q=`0,50 ${F} 100,50`,U=u.at(-1),z=u[0];return A("article",{className:"performance-memory-card","data-testid":"performance-memory-chart"},A("div",{className:"performance-memory-head"},A("strong",null,`Bwebui: ${U?`${Mf(U.mb).toFixed(1)}MB`:"--"}`),A("span",null,u.length>0?`${u.length} samples`:"等待采样")),A("svg",{viewBox:"0 0 100 50",preserveAspectRatio:"none",role:"img","aria-label":"Bwebui memory trend"},A("polygon",{points:Q}),A("polyline",{points:F}),A("line",{x1:"0",x2:"100",y1:"25",y2:"25"})),A("div",{className:"performance-axis-row"},A("span",null,z?F2(new Date(z.at)):"--"),A("span",null,"时间"),A("span",null,U?F2(new Date(U.at)):"--")),A("div",{className:"performance-axis-row"},A("span",null,`${l.toFixed(1)}`),A("span",null,"(MB)"),A("span",null,`${y.toFixed(1)}`)))}function Cr({onRaw:f}){let[u,_]=If({core:null,frontend:null}),[y,l]=If([]),[$,j]=If(""),[J,F]=If(!1),[Q,U]=If(null),[z,W]=If(!1);async function K(){F(!0),j("");try{let[C,P]=await Promise.all([Df(`${sf.apiBaseUrl}/performance`,{cache:"no-store"}),Df(`${sf.apiBaseUrl}/frontend-performance`,{cache:"no-store"})]);_({core:C,frontend:P});let D=Sr(P);l((T)=>[...T,{at:new Date().toISOString(),mb:D/1048576}].slice(-80))}catch(C){j(Tf(C,"性能指标加载失败"))}finally{F(!1)}}p1(()=>{K();let C=setInterval(()=>void K(),5000);return()=>clearInterval(C)},[]);async function q(){W(!0),j(""),U(null);try{let C=await Df(`${sf.apiBaseUrl}/codex-queue-load-test`,{method:"POST",body:JSON.stringify({targetMs:1000,timeoutMs:90000,url:sf.frontendPublicUrl||window.location.origin})});U(C),K()}catch(C){j(Tf(C,"Codex Queue Playwright 测量失败"))}finally{W(!1)}}let V=Dr(u),O=Mr(u),G=Tr(u),H=rr(u),Z=u.core?.process||{},E=u.frontend?.process||{},L=u.core?.database?.codexQueueStorage||{},M=Mf(L.total),N=Q?.result||{},w=Mf(N.wallMs,NaN),R=Mf(N.networkIdleMs,NaN),p=N.withinTarget===!0,x=z?"running":Q===null?"idle":Q.measurementOk===!0?p?"passed":"slow":"failed";return A("div",{className:"performance-page","data-testid":"performance-page"},A("div",{className:"performance-hero"},A("div",null,A("p",{className:"panel-eyebrow"},"Unified Performance"),A("h2",null,"性能面板"),A("p",null,"按组件统计 HTTP 请求、失败率、P95 延迟,并汇总 backend/frontend 内部操作耗时。")),A("div",{className:"inline-actions"},A("button",{type:"button",className:"ghost-btn",onClick:()=>void q(),disabled:z,"data-testid":"codex-queue-load-test-button"},z?"测试中...":"测试 Codex Queue 加载"),A("button",{type:"button",className:"ghost-btn",onClick:()=>void K(),disabled:J,"data-testid":"performance-refresh-button"},J?"刷新中":"刷新"),A(k0,{title:"Performance Snapshot",data:u,onOpen:f,testId:"raw-performance"}))),A(H0,{error:$}),A("div",{className:"performance-top-grid"},A(Pr,{points:y}),A("div",{className:"performance-metric-stack"},A(f0,{label:"backend RSS",value:Ju(Z.rssBytes),hint:`heap ${Ju(Z.heapUsedBytes)}`}),A(f0,{label:"frontend RSS",value:Ju(E.rssBytes),hint:`bundle ${Ju(u.frontend?.appBundleBytes)}`}),A(f0,{label:"Codex PG 任务",value:M||"--",hint:L.ok?"unidesk_codex_queue_tasks":"等待表初始化",tone:L.ok?"ok":"warn"}),A(f0,{label:"请求样本",value:Mf(u.core?.requests?.sampleCount)+Mf(u.frontend?.requests?.sampleCount),hint:"rolling window 3000"}))),A(kf,{title:"Codex Queue 加载基准",eyebrow:"Playwright / target <1s",className:"codex-load-test-panel",actions:A("div",{className:"panel-actions"},A("button",{type:"button",className:"primary-btn",onClick:()=>void q(),disabled:z,"data-testid":"codex-queue-load-test-panel-button"},z?"正在运行 Playwright...":"手动触发测试"),Q?A(k0,{title:"Codex Queue Load Test",data:Q,onOpen:f,testId:"raw-codex-queue-load-test"}):null)},A("div",{className:"codex-load-test-grid","data-testid":"codex-queue-load-test-result"},A(f0,{label:"总耗时",value:z?"运行中":Number.isFinite(w)?pu(w):"--",hint:Q===null?"点击按钮启动远端 Playwright":`目标 ${pu(N.targetMs||1000)} / ${N.url||"Codex Queue"}`,tone:x==="passed"?"ok":x==="failed"||x==="slow"?"warn":""}),A(f0,{label:"判定",value:z?"RUNNING":x==="passed"?"PASS <1s":x==="slow"?"SLOW":x==="failed"?"FAILED":"--",hint:Q?.measurementOk===!1?String(Q.error||N.error||"measurement failed").slice(0,120):"导航开始 -> DOMContentLoaded -> data-load-state=complete",tone:x==="passed"?"ok":x==="idle"||x==="running"?"":"fail"}),A(f0,{label:"Network idle",value:Number.isFinite(R)?pu(R):"--",hint:`DOMContentLoaded ${pu(N.domContentLoadedMs)} / ${N.networkIdleReached===!1?"未在 5s 内空闲":"已空闲"}`,tone:Number.isFinite(R)&&R<=1000?"ok":"warn"}),A(f0,{label:"组件耗时",value:Number.isFinite(Mf(N.componentLoadMs,NaN))?pu(N.componentLoadMs):"--",hint:`queue ${pu(N.queueMs)} / detail ${pu(N.detailMs)}`,tone:Mf(N.componentLoadMs)>1000?"warn":"ok"}),A(f0,{label:"Trace 规模",value:Number.isFinite(Mf(N.transcriptRows,NaN))?String(N.transcriptRows):"--",hint:`${N.visibleTaskCount??0} visible tasks / ${N.partial?"preview":"complete"}`})),z?A("div",{className:"performance-empty-line"},"正在通过 main-server Host SSH 启动 Playwright,完成后会显示 wall time、组件耗时和最慢 API。"):null,Q&&Array.isArray(N.slowestApi)&&N.slowestApi.length>0?A("div",{className:"table-wrap performance-table-wrap compact codex-load-api-table"},A("table",{className:"performance-table"},A("thead",null,A("tr",null,["API","状态","耗时"].map((C)=>A("th",{key:C},C)))),A("tbody",null,N.slowestApi.slice(0,5).map((C,P)=>A("tr",{key:`${C.url}-${P}`},A("td",null,A("code",null,C.url)),A("td",null,C.status),A("td",null,pu(C.durationMs))))))):null),A("div",{className:"performance-grid"},A(kf,{title:"组件汇总",eyebrow:"Requests"},V.length===0?A($0,{title:"暂无请求样本",text:"刷新几次或打开页面后会自动形成组件统计"}):A("div",{className:"table-wrap performance-table-wrap"},A("table",{className:"performance-table"},A("thead",null,A("tr",null,["组件","请求数","失败数","失败率","平均延迟","P95"].map((C)=>A("th",{key:C},C)))),A("tbody",null,V.map((C)=>A("tr",{key:C.component},A("td",null,A("code",null,C.component)),A("td",null,C.requestCount),A("td",null,C.failureCount),A("td",null,ly(Mf(C.failureRate)*100)),A("td",null,pu(C.averageLatencyMs)),A("td",null,pu(C.p95LatencyMs)))))))),A(kf,{title:"最近失败请求",eyebrow:"Failures"},O.length===0?A("div",{className:"performance-empty-line"},"最近没有失败请求"):A("div",{className:"table-wrap performance-table-wrap compact"},A("table",{className:"performance-table"},A("thead",null,A("tr",null,["时间","来源","组件","状态","路径"].map((C)=>A("th",{key:C},C)))),A("tbody",null,O.map((C,P)=>A("tr",{key:`${C.at}-${P}`},A("td",null,m0(C.at)),A("td",null,C.source),A("td",null,A("code",null,C.component)),A("td",null,A(E0,{status:"failed"},C.status)),A("td",null,A("code",null,C.path)))))))),A(kf,{title:"内部操作汇总",eyebrow:"Operations"},G.length===0?A($0,{title:"暂无内部操作样本",text:"API 查询和代理请求会自动记录内部操作耗时"}):A("div",{className:"table-wrap performance-table-wrap"},A("table",{className:"performance-table"},A("thead",null,A("tr",null,["服务","操作","次数","平均延迟","P95"].map((C)=>A("th",{key:C},C)))),A("tbody",null,G.map((C)=>A("tr",{key:`${C.service}-${C.operation}`},A("td",null,C.service),A("td",null,A("code",null,C.operation)),A("td",null,C.count),A("td",null,pu(C.averageLatencyMs)),A("td",null,pu(C.p95LatencyMs)))))))),A(kf,{title:"最近慢操作",eyebrow:"Slowest"},H.length===0?A($0,{title:"暂无慢操作",text:"后端会记录最近窗口内耗时最高的内部操作"}):A("div",{className:"table-wrap performance-table-wrap"},A("table",{className:"performance-table"},A("thead",null,A("tr",null,["时间","操作","耗时","结果","细节"].map((C)=>A("th",{key:C},C)))),A("tbody",null,H.map((C,P)=>A("tr",{key:`${C.at}-${C.operation}-${P}`},A("td",null,m0(C.at)),A("td",null,A("code",null,C.operation)),A("td",null,pu(C.durationMs)),A("td",null,C.ok?"成功":"失败"),A("td",null,C.detail||"-")))))))))}function Rr({provider:f,refresh:u,onRaw:_}){let[y,l]=If(""),[$,j]=If(null),[J,F]=If("");async function Q(U){l(U),F("");try{let z=await Df(`${sf.apiBaseUrl}/dispatch`,{method:"POST",body:JSON.stringify({providerId:f.providerId,command:"provider.upgrade",payload:{mode:U,source:"frontend-resource-monitor",requestedAt:new Date().toISOString()}})});j({mode:U,...z}),await u()}catch(z){F(Tf(z,"升级命令下发失败"))}finally{l("")}}return A(kf,{title:"Provider Gateway 升级",eyebrow:"Remote Control"},A("div",{className:"upgrade-control","data-testid":"provider-upgrade-control"},A("p",null,"通过 UniDesk WebSocket 向当前计算节点下发 provider.upgrade;预检只生成升级计划,执行升级会调度节点本地 updater 容器。"),A("div",{className:"upgrade-target-line"},A("span",null,"指定 Provider"),A("code",null,f.providerId),A(Zl,{node:f})),A("div",{className:"upgrade-actions"},A("button",{type:"button",className:"ghost-btn",disabled:Boolean(y),onClick:()=>Q("plan"),"data-testid":"upgrade-plan-button"},y==="plan"?"预检中":"预检升级"),A("button",{type:"button",className:"ghost-btn danger",disabled:Boolean(y),onClick:()=>Q("schedule"),"data-testid":"upgrade-schedule-button"},y==="schedule"?"调度中":"执行升级")),A(H0,{error:J}),$?A("div",{className:"upgrade-result"},A(E0,{status:$.status||"queued"},$.status||"queued"),A("span",null,`${$.mode==="schedule"?"执行升级":"预检升级"} 已下发`),A("span",null,`指定版本 ${UA(EH(f))}`),A("code",null,$.taskId||"--"),A(k0,{title:"Provider Upgrade Dispatch",data:$,onOpen:_})):A("span",{className:"muted"},"升级任务结果会进入任务历史;执行升级可能导致 provider 短暂重连。")))}function TH({records:f,onRaw:u,compact:_=!1}){if(f.length===0)return A($0,{title:"暂无远程更新记录",text:"该节点还没有 provider.upgrade 任务;执行预检或升级后会在这里形成结构化记录"});return A("div",{className:`upgrade-record-table-wrap table-wrap ${_?"compact":""}`},A("table",{className:"upgrade-record-table"},A("thead",null,A("tr",null,A("th",null,"状态"),A("th",null,"模式"),A("th",null,"任务"),A("th",null,"来源"),A("th",null,"耗时"),A("th",null,"策略"),A("th",null,"Gateway 版本"),A("th",null,"结果记录"),A("th",null,"更新时间"),A("th",null,"操作"))),A("tbody",null,f.map((y)=>A("tr",{key:y.id,"data-testid":`gateway-upgrade-record-${N1(y.id)}`},A("td",null,A(E0,{status:y.status})),A("td",null,A("span",{className:`mode-chip ${A2(y)}`},A2(y)==="schedule"?"执行升级":"预检")),A("td",null,A("strong",null,"provider.upgrade"),A("code",null,y.id)),A("td",null,Qr(y)),A("td",null,A(rH,{task:y})),A("td",null,Ur(y)),A("td",null,A("span",{className:"version-chip"},LH(y))),A("td",null,A("span",{className:`upgrade-outcome ${String(y.status||"").toLowerCase()}`},YH(y))),A("td",null,m0(y.updatedAt)),A("td",null,A(k0,{title:`Provider Upgrade Task ${y.id}`,data:y,onOpen:u})))))))}function xr({provider:f,tasks:u,onRaw:_,limit:y=5}){let l=BH(u,f.providerId).slice(0,y);return A(kf,{title:"远程更新记录",eyebrow:f.providerId,actions:A(Zl,{node:f}),className:"provider-upgrade-records-panel"},A("div",{"data-testid":`provider-upgrade-records-${N1(f.providerId)}`},A(TH,{records:l,onRaw:_,compact:!0})))}function vr({nodes:f,tasks:u,onRaw:_}){let y=S6(()=>f.map(($)=>{let j=BH(u,$.providerId);return{node:$,records:j,latest:Wr(j),capabilities:OH($)}}),[f,u]),l=y.reduce(($,j)=>$+j.records.length,0);return A("div",{className:"gateway-page","data-testid":"gateway-version-page"},A(kf,{title:"Provider Gateway 版本",eyebrow:`${f.length} Providers / ${l} 更新记录`},f.length===0?A($0,{title:"暂无 Provider 节点",text:"等待 provider-gateway 注册后显示版本号和升级记录"}):A("div",{className:"table-wrap gateway-version-table-wrap"},A("table",{className:"gateway-version-table"},A("thead",null,A("tr",null,A("th",null,"状态"),A("th",null,"Provider"),A("th",null,"Gateway 版本"),A("th",null,"升级策略"),A("th",null,"运维可用性"),A("th",null,"运行时间"),A("th",null,"能力"),A("th",null,"最近远程更新"),A("th",null,"操作"))),A("tbody",null,y.map(($)=>A("tr",{key:$.node.providerId},A("td",null,A(E0,{status:$.node.status})),A("td",null,A("strong",null,$.node.name),A("code",null,$.node.providerId)),A("td",null,A(Zl,{node:$.node})),A("td",null,r6($.node)),A("td",null,A(WA,{node:$.node})),A("td",null,JH($.node)?m0(JH($.node)):"待新版上报"),A("td",null,A("div",{className:"capability-row"},$.capabilities.length===0?A("span",{className:"muted"},"未声明"):$.capabilities.slice(0,5).map((j)=>A("span",{key:j,className:"data-chip"},j)))),A("td",null,$.latest?A("div",{className:"latest-upgrade-cell"},A(E0,{status:$.latest.status}),A("span",null,`${A2($.latest)==="schedule"?"执行升级":"预检"} / ${m0($.latest.updatedAt)}`),A("small",null,`Gateway ${LH($.latest)}`),A("small",null,YH($.latest))):A("span",{className:"muted"},"暂无记录")),A("td",null,A(k0,{title:`Provider ${$.node.providerId}`,data:$.node,onOpen:_})))))))),A(kf,{title:"远程更新记录",eyebrow:"Structured provider.upgrade records"},f.length===0?A($0,{title:"暂无记录",text:"没有 provider 节点时不会生成远程更新记录"}):A("div",{className:"gateway-record-grid"},y.map(($)=>A("article",{key:$.node.providerId,className:"gateway-record-card","data-testid":`gateway-records-${N1($.node.providerId)}`},A("div",{className:"gateway-record-head"},A("div",null,A("strong",null,$.node.name),A("code",null,$.node.providerId)),A(Zl,{node:$.node})),A("div",{className:"gateway-record-meta"},A("span",null,`心跳 ${m0($.node.lastHeartbeat)}`),A("span",null,`策略 ${r6($.node)}`),A("span",null,`${$.records.length} 条记录`)),A(TH,{records:$.records.slice(0,8),onRaw:_,compact:!0}))))))}function br(f){if(f==="running")return"online";if(f==="paused"||f==="restarting")return"warn";if(f==="exited"||f==="dead")return"offline";return"internal"}function MH(f){return/^[a-f0-9]{48,64}$/i.test(f)}function M6(f){let u=String(f?.name||""),_=String(f?.labels||"");return u==="unidesk_pgdata_10gb"||_.includes("com.docker.compose.volume=unidesk_pgdata_10gb")||u.toLowerCase().includes("pgdata")}function zH(f){let u=String(f?.name||""),_=String(f?.labels||"");if(M6(f))return 0;if(_.includes("com.docker.compose.project=unidesk"))return 1;if(!MH(u))return 2;return 3}function hr(f){return[...f].sort((u,_)=>{let y=zH(u)-zH(_);if(y!==0)return y;return String(u.name||"").localeCompare(String(_.name||""))})}function Ir({nodes:f,dockerStatuses:u,onRaw:_}){let[y,l]=If(""),$=S6(()=>f.map((H)=>{let Z=u.find((E)=>E.providerId===H.providerId);return{...H,dockerStatus:Z?.dockerStatus||null,dockerUpdatedAt:Z?.updatedAt||null}}),[f,u]),j=$.find((H)=>H.providerId===y)||$[0]||null;if(p1(()=>{if(!y&&$[0])l($[0].providerId)},[$.length,y]),!j)return A($0,{title:"暂无 Docker 节点",text:"等待 provider 上报 Docker daemon 状态"});let J=j.dockerStatus,F=j.providerId==="main-server",Q=J?.counts||{},U=J?.daemon||{},z=J?.containers||[],W=J?.images||[],K=hr(J?.volumes||[]),q=F?K.find(M6):null,V=J?.networks||[],O=z.filter((H)=>H.state==="running"),G=z.filter((H)=>H.state!=="running");return A("div",{className:"docker-page","data-testid":"docker-status-page"},A("div",{className:"docker-node-strip"},$.map((H)=>A("button",{key:H.providerId,type:"button",className:`docker-node-tile ${j.providerId===H.providerId?"active":""}`,onClick:()=>l(H.providerId)},A("span",{className:`pulse ${H.status}`}),A("strong",null,H.name),A("code",null,H.providerId),A("span",null,H.dockerStatus?`Docker ${H.dockerStatus.ok?"ready":"degraded"}`:"等待上报")))),A("div",{className:"docker-layout"},A(kf,{title:"Docker Desktop 视图",eyebrow:j.name,className:"docker-main-panel",actions:J?A(k0,{title:`Docker ${j.providerId}`,data:J,onOpen:_}):null},!J?A($0,{title:"Docker 状态未上报",text:"provider-gateway 会在连接后周期性采集 docker info / ps / images / volume / network"}):A("div",null,A("div",{className:"docker-hero"},A("div",null,A("p",{className:"panel-eyebrow"},"Daemon"),A("h3",null,U.name||j.providerId),A("div",{className:"docker-meta"},A("span",null,U.serverVersion?`Engine ${U.serverVersion}`:"Engine --"),A("span",null,U.operatingSystem||"OS --"),A("span",null,U.architecture||"arch --"),A("span",null,`${U.cpus||0} CPU / ${Ju(U.memoryBytes)}`))),A(E0,{status:J.ok?"online":"warn"},J.ok?"Docker Ready":"Docker Degraded")),A("div",{className:"docker-metrics"},A(f0,{label:"Containers",value:Q.containers??z.length,hint:`${Q.running??O.length} running / ${Q.stopped??G.length} stopped`,tone:"ok"}),A(f0,{label:"Images",value:Q.images??W.length,hint:`${Q.daemonImages??Q.images??W.length} daemon images`}),A(f0,{label:"Volumes",value:Q.volumes??K.length,hint:F?q?"database volume visible":"database volume missing":"node local volumes",tone:q?"ok":""}),A(f0,{label:"Networks",value:Q.networks??V.length,hint:U.driver?`driver ${U.driver}`:"docker networks"})),F?A(cr,{volume:q,volumeCount:K.length}):null,A("div",{className:"docker-section-head"},A("h3",null,"Containers"),A("span",null,`updated ${m0(j.dockerUpdatedAt||J.collectedAt)}`)),A("div",{className:"docker-container-table table-wrap","data-testid":"docker-container-table"},A("table",null,A("thead",null,A("tr",null,A("th",null,"状态"),A("th",null,"容器"),A("th",null,"镜像"),A("th",null,"端口"),A("th",null,"运行时间"),A("th",null,"大小"))),A("tbody",null,z.length===0?A("tr",null,A("td",{colSpan:6},"暂无容器")):z.map((H)=>A("tr",{key:`${H.id}-${H.name}`},A("td",null,A(E0,{status:br(H.state)},H.state||"unknown")),A("td",null,A("strong",null,H.name||"--"),A("code",null,H.id||"--")),A("td",null,H.image||"--"),A("td",null,H.ports||A("span",{className:"muted"},"未发布")),A("td",null,H.runningFor||H.status||"--"),A("td",null,H.size||"--")))))))),A("div",{className:"docker-side-stack"},A(FA,{title:"Images",items:W,render:(H)=>A("article",{key:`${H.id}-${H.repository}`,className:"docker-side-row"},A("strong",null,`${H.repository}:${H.tag}`),A("span",null,H.size||"--"),A("code",null,H.id||"--"))}),A(FA,{title:"Volumes",items:K,limit:K.length,render:(H)=>A("article",{key:H.name,className:`docker-side-row volume-row ${F&&M6(H)?"database-volume":""}`,"data-testid":F&&M6(H)?"database-volume-row":void 0},A("strong",null,H.name),A("span",null,F&&M6(H)?"PostgreSQL":MH(String(H.name||""))?"anonymous":"named"),A("code",null,H.mountpoint||H.driver||H.scope||"--"))}),A(FA,{title:"Networks",items:V,render:(H)=>A("article",{key:H.id||H.name,className:"docker-side-row"},A("strong",null,H.name),A("span",null,H.driver||"--"),A("code",null,H.id||"--"))}))))}function cr({volume:f,volumeCount:u}){return A("section",{className:`docker-volume-focus ${f?"ready":"missing"}`,"data-testid":"database-volume-card"},A("div",{className:"volume-focus-head"},A("span",{className:"panel-eyebrow"},"Database Named Volume"),A(E0,{status:f?"online":"warn"},f?"FOUND":"MISSING")),f?A("div",{className:"volume-focus-body"},A("strong",null,f.name),A("span",null,"PostgreSQL data volume for unidesk-database"),A("div",{className:"volume-route"},A("code",null,f.mountpoint||"/var/lib/docker/volumes/unidesk_pgdata_10gb/_data"),A("span",null,"->"),A("code",null,"unidesk-database:/var/lib/postgresql/data")),A("div",{className:"docker-meta compact"},A("span",null,`driver ${f.driver||"--"}`),A("span",null,`scope ${f.scope||"--"}`),A("span",null,`${u} volumes reported`))):A("div",{className:"volume-focus-body"},A("strong",null,"unidesk_pgdata_10gb"),A("span",null,"当前 Docker 快照没有发现数据库命名卷;请检查 provider-gateway 的 Docker volume 上报。")))}function FA({title:f,items:u,render:_,limit:y}){let l=u.slice(0,y??12),$=Math.max(0,u.length-l.length);return A(kf,{title:f,eyebrow:`${u.length} items`,className:"docker-side-panel"},u.length===0?A($0,{title:`暂无 ${f}`,text:"等待 Docker 状态采集"}):A("div",{className:"docker-side-list"},l.map(_),$>0?A("div",{className:"docker-side-more"},`+ ${$} more`):null))}function pr({microservices:f,onRaw:u,onNavigate:_}){let y=f.filter((l)=>AH(l).public===!1);return A("div",{className:"microservice-page","data-testid":"microservice-catalog-page"},A(kf,{title:"用户服务目录",eyebrow:"Provider Mounted User Services"},A("div",{className:"metric-grid"},A(f0,{label:"服务总数",value:f.length,hint:"config.json 用户服务登记"}),A(f0,{label:"私有后端",value:y.length,hint:"不直接暴露公网",tone:"ok"}),A(f0,{label:"D601 服务",value:f.filter((l)=>l.providerId==="D601").length,hint:"compute-node docker"}),A(f0,{label:"集成前端",value:f.filter((l)=>l.frontend?.integrated).length,hint:"UniDesk React 页面"}))),A(kf,{title:"服务映射",eyebrow:"Repo Reference + Runtime"},f.length===0?A($0,{title:"暂无用户服务",text:"在 config.json 的 microservices 中登记用户服务的 provider、仓库引用和后端映射"}):A("div",{className:"table-wrap"},A("table",{className:"microservice-table"},A("thead",null,A("tr",null,A("th",null,"服务"),A("th",null,"Provider"),A("th",null,"代码引用"),A("th",null,"Docker 引用"),A("th",null,"后端映射"),A("th",null,"开发入口"),A("th",null,"运行态"),A("th",null,"操作"))),A("tbody",null,f.map((l)=>{let $=wH(l),j=zr(l),J=AH(l);return A("tr",{key:l.id,"data-testid":`microservice-row-${N1(l.id)}`},A("td",null,A("strong",null,l.name),A("code",null,l.id)),A("td",null,A("strong",null,$.providerName||l.providerId),A("code",null,l.providerId)),A("td",null,A("span",null,j.url||"--"),A("code",null,j.commitId||"--")),A("td",null,A("span",null,j.composeFile||"--"),A("code",null,`${j.composeService||"--"} / ${j.containerName||"--"}`)),A("td",null,A(E0,{status:J.public?"warn":"online"},J.public?"public":"private"),A("code",null,`${J.nodeBindHost||"--"}:${J.nodePort||"--"} -> ${J.proxyMode||"--"}`)),A("td",null,A("span",null,l.development?.sshPassthrough?"SSH 透传":"未配置"),A("code",null,l.development?.worktreePath||"--")),A("td",null,A(E0,{status:$.providerStatus==="online"?"online":"warn"},$.providerStatus||"unknown"),A(dy,{data:$.container,empty:"容器快照未上报"})),A("td",null,A("div",{className:"microservice-actions"},l.id==="findjob"?A("button",{type:"button",className:"ghost-btn",onClick:()=>_("apps","findjob"),"data-testid":"open-findjob-button"},"打开"):null,l.id==="pipeline"?A("button",{type:"button",className:"ghost-btn",onClick:()=>_("apps","pipeline"),"data-testid":"open-pipeline-button"},"打开"):null,l.id==="todo-note"?A("button",{type:"button",className:"ghost-btn",onClick:()=>_("apps","todo-note"),"data-testid":"open-todo-note-button"},"打开"):null,l.id==="met-nonlinear"?A("button",{type:"button",className:"ghost-btn",onClick:()=>_("apps","met-nonlinear"),"data-testid":"open-met-nonlinear-button"},"打开"):null,l.id==="claudeqq"?A("button",{type:"button",className:"ghost-btn",onClick:()=>_("apps","claudeqq"),"data-testid":"open-claudeqq-button"},"打开"):null,l.id==="codex-queue"?A("button",{type:"button",className:"ghost-btn",onClick:()=>_("apps","codex-queue"),"data-testid":"open-codex-queue-button"},"打开"):null,l.id==="project-manager"?A("button",{type:"button",className:"ghost-btn",onClick:()=>_("apps","project-manager"),"data-testid":"open-project-manager-button"},"打开"):null,A(k0,{title:`用户服务 ${l.id}`,data:l,onOpen:u}))))}))))))}function mr({nodes:f,onDispatched:u,onRaw:_}){let y=f.filter((x)=>x.status==="online"),[l,$]=If(y[0]?.providerId||f[0]?.providerId||""),[j,J]=If("docker.ps"),[F,Q]=If("frontend"),[U,z]=If("operator-check"),[W,K]=If("normal"),[q,V]=If(!1),[O,G]=If(""),[H,Z]=If(!1),[E,L]=If(null),[M,N]=If("");p1(()=>{if(!l&&(y[0]?.providerId||f[0]?.providerId))$(y[0]?.providerId||f[0].providerId)},[f.length,y.length,l]);function w(){return{source:F,note:U,priority:W}}function R(){G(JSON.stringify(w(),null,2)),V(!0)}async function p(x){x.preventDefault(),Z(!0),N("");try{let C=q?JSON.parse(O||"{}"):w(),P=await Df(`${sf.apiBaseUrl}/dispatch`,{method:"POST",body:JSON.stringify({providerId:l,command:j,payload:C})});L(P),await u()}catch(C){N(Tf(C,"下发失败"))}finally{Z(!1)}}return A("div",{className:"page-grid dispatch-grid"},A(kf,{title:"下发任务",eyebrow:"Real WebSocket Dispatch"},A("form",{className:"dispatch-form",onSubmit:p},A("label",null,"Provider",A("select",{value:l,onChange:(x)=>$(x.target.value)},f.map((x)=>A("option",{key:x.providerId,value:x.providerId},`${x.name} / ${x.providerId}`)))),A("label",null,"Command",A("select",{value:j,onChange:(x)=>J(x.target.value)},A("option",{value:"docker.ps"},"docker.ps"),A("option",{value:"host.ssh"},"host.ssh"),A("option",{value:"microservice.http"},"microservice.http"),A("option",{value:"echo"},"echo"))),A("label",null,"来源",A("input",{value:F,onChange:(x)=>Q(x.target.value)})),A("label",null,"备注",A("input",{value:U,onChange:(x)=>z(x.target.value)})),A("label",null,"优先级",A("select",{value:W,onChange:(x)=>K(x.target.value)},A("option",{value:"normal"},"normal"),A("option",{value:"low"},"low"),A("option",{value:"urgent"},"urgent"))),A("div",{className:"dispatch-actions"},A("button",{type:"button",className:"ghost-btn",onClick:R},"查看原始JSON"),A("button",{type:"submit",disabled:H||!l},H?"下发中":"下发任务")),q?A("label",{className:"raw-editor-label"},"高级 Payload",A("textarea",{className:"raw-editor",value:O,onChange:(x)=>G(x.target.value)})):null,A(H0,{error:M,wide:!0}))),A(kf,{title:"下发结果",eyebrow:"Response"},E?A("div",{className:"result-card"},A(E0,{status:E.status||"queued"},E.status||"queued"),A("dl",null,A("dt",null,"Task ID"),A("dd",null,A("code",null,E.taskId||"--")),A("dt",null,"Provider 在线"),A("dd",null,ay(E.providerOnline))),A(k0,{title:"Dispatch Response",data:E,onOpen:_})):A($0,{title:"等待操作",text:"任务响应会以结构化结果卡展示"})))}function GH({task:f,onRaw:u}){return A("article",{className:"compact-row"},A(E0,{status:f.status}),A("div",null,A("strong",null,f.command),A("code",null,f.id)),A("span",null,Hl(f)?`已等待 ${AA(f.updatedAt)}`:`耗时 ${ql(qH(f)??0)}`),A(k0,{title:`Task ${f.id}`,data:f,onOpen:u}))}function rH({task:f}){let u=qH(f),_=Hl(f);return A("div",{className:"task-duration"},A("strong",null,u===null?"--":ql(u)),A("span",null,_?`已运行 / 创建 ${m0(f.createdAt)}`:`创建 ${m0(f.createdAt)}`))}function kr({task:f}){let u=String(f?.status||"").toLowerCase(),_=f?.result,y=_&&typeof _==="object"&&!Array.isArray(_)?_:{},$=["exitCode","code","signal","timeoutMs","previousStatus","mode"].filter((j)=>y[j]!==void 0&&y[j]!==null);if(u==="failed"){let j=HH(f);return A("div",{className:"task-diagnostic failed"},A("b",null,"失败原因"),A("span",{className:"diagnostic-reason"},ay(j)),$.length>0?A("div",{className:"diagnostic-meta"},$.map((J)=>A("span",{key:J,className:"data-chip"},A("b",null,J),A("span",null,ay(y[J]))))):null)}if(Hl(f))return A("div",{className:"task-diagnostic warn"},A("b",null,"等待终态"),A("span",null,`最后更新 ${AA(f.updatedAt)} 前`));return A("div",{className:"task-diagnostic ok"},A("b",null,"完成摘要"),A(dy,{data:_,empty:"无执行输出"}))}function ir({tasks:f,onRaw:u}){let _=f.filter(Hl);return A("div",{"data-testid":"pending-task-page"},A(kf,{title:"待处理任务",eyebrow:`${_.length} Pending`},_.length===0?A($0,{title:"当前无待处理任务",text:"queued / dispatched / running 会在超时后自动转为 failed;历史记录仍可在任务历史中查看"}):A("div",{className:"table-wrap","data-testid":"pending-task-table"},A("table",null,A("thead",null,A("tr",null,A("th",null,"状态"),A("th",null,"任务"),A("th",null,"Provider"),A("th",null,"已等待"),A("th",null,"载荷摘要"),A("th",null,"操作"))),A("tbody",null,_.map((y)=>A("tr",{key:y.id},A("td",null,A(E0,{status:y.status})),A("td",null,A("strong",null,y.command),A("code",null,y.id)),A("td",null,A("code",null,y.providerId)),A("td",null,AA(y.updatedAt)),A("td",null,A(dy,{data:y.payload})),A("td",null,A(k0,{title:`Pending Task ${y.id}`,data:y,onOpen:u})))))))))}function gr({tasks:f,onRaw:u}){return A("div",{"data-testid":"task-history-page"},A(kf,{title:"任务历史",eyebrow:`${f.length} Tasks`},f.length===0?A($0,{title:"暂无任务",text:"下发任务后会在这里看到生命周期"}):A("div",{className:"table-wrap"},A("table",{className:"task-history-table"},A("thead",null,A("tr",null,A("th",null,"状态"),A("th",null,"任务"),A("th",null,"Provider"),A("th",null,"任务耗时"),A("th",null,"载荷摘要"),A("th",null,"诊断信息"),A("th",null,"更新时间"),A("th",null,"操作"))),A("tbody",null,f.map((_)=>A("tr",{key:_.id,"data-testid":`task-row-${N1(_.id)}`},A("td",null,A(E0,{status:_.status})),A("td",null,A("strong",null,_.command),A("code",null,_.id)),A("td",null,A("code",null,_.providerId)),A("td",null,A(rH,{task:_})),A("td",null,A(dy,{data:_.payload})),A("td",null,A(kr,{task:_})),A("td",null,m0(_.updatedAt)),A("td",null,A(k0,{title:`Task ${_.id}`,data:_,onOpen:u})))))))))}function nr({tasks:f,onRaw:u}){let _=f.filter((y)=>["succeeded","failed"].includes(y.status));return A(kf,{title:"执行结果",eyebrow:"Finished Tasks"},_.length===0?A($0,{title:"暂无结果",text:"任务完成后展示 provider 返回的结构化摘要"}):A("div",{className:"result-grid"},_.map((y)=>A("article",{key:y.id,className:"result-card"},A("div",{className:"node-card-head"},A("strong",null,y.command),A(E0,{status:y.status})),A("code",null,y.id),A(dy,{data:y.result,empty:"无执行输出"}),A(k0,{title:`Task Result ${y.id}`,data:y,onOpen:u})))))}function tr({data:f}){let u=f.overview||{};return A("div",{className:"page-grid topology-grid"},A(kf,{title:"公开入口",eyebrow:"Public"},A("div",{className:"endpoint-list"},A("article",null,A("b",null,"Frontend"),A("span",null,sf.frontendPublicUrl||window.location.origin),A(E0,{status:"online"},"public")),A("article",null,A("b",null,"Provider Ingress"),A("span",null,sf.providerIngressPublicUrl||"ws://public/ws/provider"),A(E0,{status:"online"},"public")))),A(kf,{title:"内部服务",eyebrow:"Docker Network Only"},A("div",{className:"endpoint-list"},A("article",null,A("b",null,"backend-core API"),A("span",null,"http://backend-core:8080"),A(E0,{status:"internal"},"internal")),A("article",null,A("b",null,"database"),A("span",null,"postgres://database:5432/unidesk"),A(E0,{status:"internal"},"internal")))),A(kf,{title:"运行态",eyebrow:"Runtime"},A("div",{className:"metric-grid"},A(f0,{label:"DB Ready",value:u.dbReady?"YES":"NO",hint:"internal health"}),A(f0,{label:"Online Nodes",value:u.onlineNodeCount??0,hint:"provider-gateway self-link"}))))}function sr({session:f}){return A(kf,{title:"认证策略",eyebrow:"Frontend Login"},A("div",{className:"policy-grid"},A("article",null,A("span",null,"默认账号"),A("strong",null,sf.authUsername||"admin")),A("article",null,A("span",null,"当前会话"),A("strong",null,f?.user?.username||"--")),A("article",null,A("span",null,"Session TTL"),A("strong",null,`${sf.sessionTtlSeconds||0}s`)),A("article",null,A("span",null,"API 访问"),A("strong",null,"同源 Cookie 保护"))),A("p",{className:"muted paragraph"},"浏览器只访问 frontend 同源接口;frontend 容器使用 Docker 内网代理 backend-core API。"))}function or(){return A(kf,{title:"安全边界",eyebrow:"Exposure Rule"},A("div",{className:"security-board"},A("article",{className:"allow"},A("b",null,"允许公网"),A("span",null,"frontend 登录入口"),A("span",null,"provider ingress WebSocket/health")),A("article",{className:"deny"},A("b",null,"禁止公网"),A("span",null,"backend-core REST API"),A("span",null,"PostgreSQL database")),A("article",null,A("b",null,"数据库卷"),A("span",null,"named volume unidesk_pgdata_10gb"),A("span",null,"CLI stop/start 不删除数据卷"))))}function ar({activeModule:f,activeTab:u,data:_,session:y,refresh:l,onRaw:$,onNavigate:j}){if(f==="ops"&&u==="status")return A(Vr,{data:_,onRaw:$,onNavigate:j});if(f==="ops"&&u==="performance")return A(Cr,{onRaw:$});if(f==="ops"&&u==="events")return A(Or,{events:_.events,onRaw:$});if(f==="ops"&&u==="logs")return A(Xr,{logs:_.logs,onRaw:$});if(f==="nodes"&&u==="list")return A(Nr,{nodes:_.nodes,onRaw:$});if(f==="nodes"&&u==="monitor")return A(Br,{nodes:_.nodes,systemStatuses:_.systemStatuses,tasks:_.tasks,onRaw:$,refresh:l});if(f==="nodes"&&u==="docker")return A(Ir,{nodes:_.nodes,dockerStatuses:_.dockerStatuses,onRaw:$});if(f==="nodes"&&u==="gateway")return A(vr,{nodes:_.nodes,tasks:_.tasks,onRaw:$});if(f==="nodes"&&u==="labels")return A(Lr,{nodes:_.nodes});if(f==="nodes"&&u==="heartbeats")return A(Yr,{nodes:_.nodes});if(f==="tasks"&&u==="dispatch")return A(mr,{nodes:_.nodes,onDispatched:l,onRaw:$});if(f==="tasks"&&u==="pending")return A(ir,{tasks:_.pendingTasks,onRaw:$});if(f==="tasks"&&u==="history")return A(gr,{tasks:_.tasks,onRaw:$});if(f==="tasks"&&u==="results")return A(nr,{tasks:_.tasks,onRaw:$});if(f==="apps"&&u==="catalog")return A(pr,{microservices:_.microservices,onRaw:$,onNavigate:j});if(f==="apps"&&u==="todo-note")return A(yH,{microservices:_.microservices,onRaw:$,apiBaseUrl:sf.apiBaseUrl});if(f==="apps"&&u==="findjob")return A(sz,{microservices:_.microservices,onRaw:$,apiBaseUrl:sf.apiBaseUrl});if(f==="apps"&&u==="pipeline")return A(tq,{microservices:_.microservices,onRaw:$,apiBaseUrl:sf.apiBaseUrl});if(f==="apps"&&u==="met-nonlinear")return A(fG,{microservices:_.microservices,onRaw:$,apiBaseUrl:sf.apiBaseUrl});if(f==="apps"&&u==="claudeqq")return A(lz,{microservices:_.microservices,onRaw:$,apiBaseUrl:sf.apiBaseUrl});if(f==="apps"&&u==="codex-queue")return A(tz,{microservices:_.microservices,onRaw:$,apiBaseUrl:sf.apiBaseUrl,initialTasksData:lr});if(f==="apps"&&u==="project-manager")return A(aq,{microservices:_.microservices,onRaw:$,apiBaseUrl:sf.apiBaseUrl});if(f==="config"&&u==="topology")return A(tr,{data:_});if(f==="config"&&u==="auth")return A(sr,{session:y});if(f==="config"&&u==="security")return A(or);return A($0,{title:"未找到页面",text:"请选择左侧主模块和顶部子功能标签"})}function dr({session:f,onLogout:u}){let _=Yj(mu,window.location.pathname),[y,l]=If(_.moduleId),[$,j]=If({...p3,[_.moduleId]:_.tabId}),[J,F]=If({overview:null,nodes:[],systemStatuses:[],dockerStatuses:[],microservices:[],events:[],tasks:[],pendingTasks:[],logs:[]}),[Q,U]=If({ok:!1,text:"连接中"}),[z,W]=If(null),[K,q]=If(new Date),[V,O]=If(null),[G,H]=If(!1),Z=mu.moduleById[y]||mu.modules[0],E=$[y]||p3[y]||Z.tabs[0].id,L=Array.isArray(J.microservices)?J.microservices:[],M=L.length===0&&y==="apps"&&E==="codex-queue"?[$r]:L,N=M===L?J:{...J,microservices:M},w=y==="apps"?M.find((T)=>String(T?.id||"")===E):null,R=w?wH(w):{},p=Z.tabs.find((T)=>T.id===E)?.label||E,x=w?[{key:"microservice",label:"用户服务",value:`${p} ${R.providerStatus==="online"?"在线":R.providerStatus||"未知"}`,tone:R.providerStatus==="online"?"ok":"warn",testId:"active-microservice-status"}]:[];async function C(){try{let T=[],S=(c,o)=>{T.push([c,Df(o)])},r=y==="ops"&&E==="status",Y=y!=="apps",v=r||y==="nodes"||y==="tasks"&&E==="dispatch",m=y==="apps"&&E!=="codex-queue";if(Y)S("overview",`${sf.apiBaseUrl}/overview`);if(v)S("nodes",`${sf.apiBaseUrl}/nodes`);if(y==="nodes"&&E==="monitor")S("systemStatuses",`${sf.apiBaseUrl}/nodes/system-status?limit=60`),S("tasks",`${sf.apiBaseUrl}/tasks?limit=120`);else if(y==="nodes"&&E==="docker")S("dockerStatuses",`${sf.apiBaseUrl}/nodes/docker-status`);else if(y==="nodes"&&E==="gateway")S("tasks",`${sf.apiBaseUrl}/tasks?limit=300`);else if(y==="tasks"&&E==="pending")S("pendingTasks",`${sf.apiBaseUrl}/tasks?status=pending&limit=100`);else if(y==="tasks"&&(E==="history"||E==="results"))S("tasks",`${sf.apiBaseUrl}/tasks?limit=300`);else if(r)S("tasks",`${sf.apiBaseUrl}/tasks?limit=8&lite=1`),S("pendingTasks",`${sf.apiBaseUrl}/tasks?status=pending&limit=20&lite=1`);if(m)S("microservices",`${sf.apiBaseUrl}/microservices`);if(y==="ops"&&E==="events")S("events",`${sf.apiBaseUrl}/events?limit=100`);if(y==="ops"&&E==="logs")S("logs","/logs?limit=100");await Promise.all(T.map(async([c,o])=>{let ff=await o,n={};if(c==="overview")n.overview=ff;if(c==="nodes")n.nodes=ff.nodes||[];if(c==="systemStatuses")n.systemStatuses=ff.systemStatuses||[];if(c==="dockerStatuses")n.dockerStatuses=ff.dockerStatuses||[];if(c==="microservices")n.microservices=ff.microservices||[];if(c==="events")n.events=ff.events||[];if(c==="tasks")n.tasks=ff.tasks||[];if(c==="pendingTasks")n.pendingTasks=ff.tasks||[];if(c==="logs")n.logs=ff.logs||[];F((lf)=>({...lf,...n}))})),U({ok:!0,text:"核心在线"}),W(new Date)}catch(T){if(U({ok:!1,text:Tf(T,"连接失败")}),T.status===401)u(!1)}}p1(()=>{C();let T=setInterval(C,5000);return()=>clearInterval(T)},[y,E]),p1(()=>{let T=setInterval(()=>q(new Date),1000);return()=>clearInterval(T)},[]),p1(()=>{let T=lG(mu,window.location.pathname);if(T&&window.location.pathname!==T)window.history.replaceState(null,"",T)},[]),p1(()=>{let T=()=>{let S=Yj(mu,window.location.pathname);l(S.moduleId),j((r)=>({...r,[S.moduleId]:S.tabId})),O(null)};return window.addEventListener("popstate",T),()=>window.removeEventListener("popstate",T)},[]),p1(()=>{window.scrollTo({top:0,left:0,behavior:"auto"})},[y,E]);function P(T,S,r="push"){let Y=mu.moduleById[T]?T:mu.fallbackTarget.moduleId,v=mu.moduleById[Y]?.tabs.some((c)=>c.id===S)?S:p3[Y]||mu.moduleById[Y]?.tabs[0]?.id||mu.fallbackTarget.tabId;l(Y),j((c)=>({...c,[Y]:v}));let m=I$(mu,Y,v);if(window.location.pathname!==m){let c=r==="replace"?"replaceState":"pushState";window.history[c](null,"",m)}}function D(T,S){O({title:T,data:S})}return A("div",{className:`shell ${G?"rail-collapsed":""}`,"data-testid":"app-shell"},A(qr,{activeModule:y,activeTabs:$,onNavigate:P,collapsed:G,onToggle:()=>H((T)=>!T)}),A("main",{className:"workspace"},A(Zr,{connection:Q,lastRefresh:z,onRefresh:C,onLogout:()=>u(!0),session:f,clock:K,activeStatusItems:x}),A(Hr,{module:Z,activeTab:E,onNavigate:P}),A(ar,{activeModule:y,activeTab:E,data:N,session:f,refresh:C,onRaw:D,onNavigate:P})),A(Gr,{raw:V,onClose:()=>O(null)}))}function er(){let[f,u]=If(!0),[_,y]=If(null);async function l(){u(!0);try{let j=await Df("/api/session");y(j.authenticated?j:null)}catch{y(null)}finally{u(!1)}}async function $(j){if(j)try{await Df("/logout",{method:"POST"})}catch{}y(null)}if(p1(()=>{l()},[]),f)return A("main",{className:"loading-screen"},A("div",{className:"brand-mark"},"UD"),A("span",null,"加载会话"));if(!_)return A(Kr,{onLogin:y});return A(dr,{session:_,onLogout:$})}var SH=document.getElementById("root");if(SH===null)throw Error("root element not found");KH.createRoot(SH).render(A(er));})(); + `,width:E,height:O}}function e5(f,u){let _=URL.createObjectURL(f),y=document.createElement("a");y.href=_,y.download=u,y.click(),setTimeout(()=>URL.revokeObjectURL(_),1000)}async function kq(f,u){let _=mq(u,"pipeline"),{svg:y,width:$,height:l}=ZM(f,u),j=new Blob([y],{type:"image/svg+xml;charset=utf-8"}),J=URL.createObjectURL(j);try{let F=new Image;await new Promise((W,K)=>{F.onload=()=>W(),F.onerror=()=>K(Error("svg image load failed")),F.src=J});let A=document.createElement("canvas");A.width=$,A.height=l;let U=A.getContext("2d");if(!U)throw Error("canvas unavailable");U.drawImage(F,0,0);let z=await new Promise((W)=>A.toBlob(W,"image/png"));if(!z)throw Error("png export failed");e5(z,`${_}.png`)}catch{e5(j,`${_}.svg`)}finally{URL.revokeObjectURL(J)}}async function OM(f){let u=mq(String(f?.title||"pipeline-gantt"),"pipeline-gantt"),{svg:_,width:y,height:$}=VM(f),l=new Blob([_],{type:"image/svg+xml;charset=utf-8"}),j=URL.createObjectURL(l);try{let J=new Image;await new Promise((z,W)=>{J.onload=()=>z(),J.onerror=()=>W(Error("gantt svg image load failed")),J.src=j});let F=document.createElement("canvas");F.width=y,F.height=$;let A=F.getContext("2d");if(!A)throw Error("canvas unavailable");A.drawImage(J,0,0);let U=await new Promise((z)=>F.toBlob(z,"image/png"));if(!U)throw Error("gantt png export failed");e5(U,`${u}.png`)}catch{e5(l,`${u}.svg`)}finally{URL.revokeObjectURL(j)}}async function XM(f){for(let u of f){if(u.flow.nodes.length===0)continue;await kq(u.flow,u.title),await new Promise((_)=>setTimeout(_,750))}}function Lq(f,u){return f.find((_)=>String(_?.pipelineId||"")===u)||null}function Yq(f){return Pf(f?.startedAt)??Pf(f?.artifact?.startedAt)??Pf(f?.request?.createdAt)??Pf(f?.updatedAt)??0}function NM(f,u){return f.filter((_)=>String(_?.pipelineId||"")===u).slice().sort((_,y)=>Yq(_)-Yq(y)||String(_?.runId||"").localeCompare(String(y?.runId||"")))}function gF(f,u){let _=String(u?.runId||""),y=f.findIndex((j)=>String(j?.runId||"")===_),$=y>=0?y+1:f.length,l=String(u?.status||"--");return`Epoch ${$} / ${_||"--"} / ${l}`}function l1(f){return String(f?.procedureRunId||f?.runId||"")}function $2(f,u){let _=String(f?.nodeId||f?.request?.nodeId||"");if(_)return _;let y=l1(f),$=`${u}__`;if(y.startsWith($))return y.slice($.length).replace(/__\d+$/u,"");return""}function k5(f,u){let _=Nf(f?.artifact)?f.artifact:{},y=Nf(f?.request)?f.request:{};return Ml(f?.startedAt,_.startedAt,y.createdAt,y.startedAt,f?.createdAt,f?.updatedAt,u?.startedAt,u?.request?.createdAt)}function i5(f,u){let _=String(f?.status?.status||f?.artifact?.status||f?.status||"").toLowerCase(),y=Nf(f?.artifact)?f.artifact:{},$=oF(_);return Ml(f?.finishedAt,y.finishedAt,f?.completedAt,$?f?.updatedAt:void 0,$?y.updatedAt:void 0,$?u?.updatedAt:void 0)}function iq(f,u,_=Date.now()){let y=String(f?.runId||""),$=new Set(u.map((l)=>String(l?.id||"")).filter(Boolean));return Ef(f?.procedureRuns).flatMap((l)=>{let j=$2(l,y);if(!j)return[];let J=String(l?.status?.status||l?.artifact?.status||l?.status||"unknown").toLowerCase(),F=k5(l,f),A=Pf(F);if(A===null)return[];let U=i5(l,f),z=Pf(U)??(oF(J)?Pf(l?.updatedAt)??A+1000:_),W=Math.max(A+1000,z);return[{nodeId:j,knownNode:$.has(j),procedureRunId:l1(l),status:J,startMs:A,endMs:W,startedAt:wl(A),finishedAt:wl(W),durationMs:W-A,runId:y,raw:l}]}).sort((l,j)=>l.startMs-j.startMs||l.endMs-j.endMs||l.nodeId.localeCompare(j.nodeId))}function LM(f,u,_=[]){let y=u.map((U)=>Number(U.startMs)).filter(Number.isFinite),$=u.map((U)=>Number(U.endMs)).filter(Number.isFinite);for(let U of _){let z=E0(U?.eventMs??U?.ms);if(z!==null)y.push(z),$.push(z)}let l=Pf(f?.startedAt)??Pf(f?.artifact?.startedAt)??Pf(f?.request?.createdAt),j=Pf(f?.finishedAt)??Pf(f?.artifact?.finishedAt)??Pf(f?.updatedAt);if(l!==null)y.push(l);if(j!==null)$.push(j);let J=Date.now(),F=y.length>0?Math.min(...y):J-60000,A=Math.max(F+60000,$.length>0?Math.max(...$):J);return{startMs:F,endMs:A,durationMs:A-F}}var g5=12,gq=20,nF=100,YM=!1;function _y(f){let u=Number(f);if(!Number.isFinite(u))return 0;return Math.max(0,Math.min(100,Math.round(u*100)/100))}function BM(f){let u=Math.max(g5,Number(f||g5)),_=Math.log(u/g5)/Math.log(gq);return _y(_*100)}var Tl=BM(nF);function _Q(f){let u=_y(f)/100,_=g5*Math.pow(gq,u),y=u<0.24?"全局":u<0.64?"均衡":"细节";return{value:_y(u*100),pxPerMinute:_,label:y}}function IF(f){let u=Math.round(Number(f));return Math.abs(u-nF)<=1?nF:u}function wM(f,u=Tl){let _=Math.max(1,Number(f.durationMs||0)/60000),y=_Q(u);return Math.round(Math.max(360,Math.min(7200,_*Number(y.pxPerMinute||48))))}function DM(f,u=7){let _=Math.max(1,Number(f.endMs||0)-Number(f.startMs||0));return Array.from({length:u},(y,$)=>{let l=u===1?0:$/(u-1);return{ms:Number(f.startMs)+_*l,percent:l*100}})}function TM(f,u){let _=Math.max(1,Number(u.endMs)-Number(u.startMs));return Math.max(0,Math.min(100,(f-Number(u.startMs))/_*100))}function E0(f){let u=Number(f);return Number.isFinite(u)?u:null}function yQ(f){return rq(f?.status)&&!oF(f?.status)}function nq(f,u,_,y){let $=Math.max(1,_-u),l=Math.max(0,Math.min(1,(f-u)/$));return Number((l*y).toFixed(3))}function Bq(f,u){if(!u)return null;let _=E0(u?.startMs),y=E0(u?.endMs),$=E0(u?.chartHeight);if(_===null||y===null||$===null)return null;return nq(f,_,y,$)}function tq(f,u){let _=E0(f?.rawStartMs??f?.startMs)??E0(f?.startMs)??u,y=E0(f?.endMs)??_+1000;if(!yQ(f))return Math.max(_+1000,y);return Math.max(_+1000,y,u)}function MM(f,u,_,y){let $=E0(f?.startMs)??y-60000,l=E0(f?.endMs)??y,j=_.reduce((q,E)=>Math.max(q,tq(E,y)),l),J=Math.max($+60000,l,j),F=Math.max(1,J-$),A={startMs:$,endMs:J,durationMs:F},U=wM(A,u),z=_Q(u),W=Math.max(5,Math.min(18,Math.round(U/150))),K=DM(A,W).map((q)=>{let E=Number(q.ms),O=nq(E,$,J,U);return{...q,y:O,timestamp:wl(E),offsetMs:E-$}});return{source:"frontend-y",startMs:$,endMs:J,durationMs:F,chartHeight:U,scale:_y(u),normalizedScale:Number((_y(u)/100).toFixed(3)),pxPerMinute:Number(Number(z.pxPerMinute||0).toFixed(3)),ticks:K}}function SM(f,u,_){if(!yQ(f))return f;let y=E0(f?.rawStartMs??f?.startMs)??E0(f?.startMs)??_,$=tq(f,_),l=Bq(y,u),j=Bq($,u),J=E0(l??f?.y1??f?.startY)??0,F=E0(j??f?.y2??f?.endY)??J+10,A=Math.max(24,F-J);return{...f,live:!0,startMs:y,endMs:$,durationMs:Math.max(1000,$-y),finishedAt:wl($),y1:J,y2:F,startY:J,endY:F,height:A}}function $Q(f,u,_){return TM(f,u)/100*_}function z$(f){return Boolean(f&&String(f?.source||"")!=="frontend-y")}function sq(f,u,_,y,$){if(z$(y))for(let j of $){let J=E0(f?.[j]);if(J!==null)return J}let l=E0(f?.ms??f?.eventMs??f?.startMs);return $Q(l??Number(u.startMs),u,_)}function f2(f,u,_,y){return sq(f,u,_,y,["y1","startY"])}function tF(f,u,_,y){if(z$(y)){let l=E0(f?.y2??f?.endY);if(l!==null)return l}let $=E0(f?.endMs)??Number(u.endMs);return $Q($,u,_)}function oq(f,u,_,y){if(z$(y)){let l=E0(f?.height);if(l!==null)return Math.max(1,l)}let $=f?.live?24:10;return Math.max($,tF(f,u,_,y)-f2(f,u,_,y))}function Iu(f,u,_,y){return sq(f,u,_,y,["y","timeAxisY"])}function aq(f,u,_,y){if(z$(y)||String(y?.source||"")==="frontend-y"){let j=E0(f?.y);if(j!==null)return j}let $=E0(f?.percent);if($!==null)return $/100*_;let l=E0(f?.ms)??Number(u.startMs);return $Q(l,u,_)}function rM(f){let u=String(f?.promptEvent||f?.raw?.promptEvent||f?.event||"").toLowerCase();if(!["node-long-running-observation","node-finished"].includes(u))return"";let _=String(f?.sourceNodeId||f?.raw?.sourceNodeId||f?.raw?.detail?.nodeId||""),y=String(f?.nodeId||f?.targetNodeId||"");return _&&_!==y?_:""}function PM(f,u){let _=new Set(u.map(($)=>[String($.sourceNodeId||""),String($.targetNodeId||""),String($.targetMarkerId||""),String($.action||"")].join(":"))),y=[...u];for(let $ of f){let l=rM($),j=String($?.nodeId||""),J=String($?.id||"");if(!l||!j||!J)continue;let F=[l,j,J,"observe"].join(":");if(_.has(F))continue;_.add(F),y.push({id:`observation-arrow:${J}:${l}:${j}`,commandId:String($?.commandId||$?.eventId||J),sourceNodeId:l,targetNodeId:j,sourceMarkerId:"",targetMarkerId:J,sourceKind:"monitor",action:"observe",status:"observation"})}return{markers:f,arrows:y}}function wq(f,u=""){let _=O1(f)||u,y=String(f?.promptEvent||"");if(_==="initial-prompt-delivered")return"initial";if(y==="node-finished"||y==="node-long-running-observation"||y.startsWith("monitor-"))return"monitor";if(_==="monitor-prompt-delivered"||String(f?.sourceKind||"").toLowerCase()==="monitor"||u==="monitor-prompt-queued")return"monitor";return"append"}function CM(f){return Ef(f?.tags||f?.raw?.tags).map((u)=>String(u||"")).filter(Boolean)}function Dq(f,u=""){let _=O1(f)||u,y=String(f?.promptEvent||"");if(_==="initial-prompt-delivered")return"初始 prompt";if(y==="node-long-running-observation")return"长任务观察";if(y==="node-finished")return CM(f).includes("monitor.audit")?"节点完成 / OA 审核":"节点完成";if(y==="monitor-interval")return"旧版轮询";if(y==="monitor-start")return"Monitor start";if(y==="monitor-stop")return"Monitor stop";if(_==="monitor-prompt-delivered"||u==="monitor-prompt-queued")return"Monitor prompt";if(_==="append-prompt-queued")return"追加 prompt 已排队";return"追加 prompt"}function Tq(f){let u=O1(f);if(u==="control-command-applied")return 3;if(u==="control-command-ignored")return 2;if(u==="control-command-queued")return 1;return 0}function Mq(f,u){let _=String(f?.commandId||"");if(_)return`command:${_}`;return["fallback",oy(f)||Ml(f?.createdAt,f?.timestamp)||`index-${u}`,String(f?.sourceKind||""),String(f?.sourceNodeId||""),String(f?.targetNodeId||""),ay(f)].join(":")}function RM(f){return kF([f?.targetNodeId,...Ef(f?.resetNodeIds)])}function xM(f,u){let _=Yl(f),y=O1(f),$=String(f?.targetNodeId||""),l=Boolean($)&&u!==$;if(y==="control-command-applied")return l?`${_} 波及`:`${_} 生效`;if(y==="control-command-ignored")return`${_} 忽略`;if(y==="control-command-queued")return`${_} 已发起`;return l?`${_} 波及`:_}function vM(f){if(O1(f)==="control-command-ignored")return"ignored";let _=ay(f);if(_==="restart"||_==="redo")return"restart";if(_==="modify")return"modify";if(_==="approve")return"approve";if(_==="guide")return"guide";return"pending"}function bM(f){let u=String(f?.sourceKind||"").toLowerCase();if(u==="monitor")return"monitor";if(u==="webui")return"webui";if(u==="cli")return"cli";return"system"}function hM(f,u,_,y){let $=f.filter((A)=>String(A.nodeId||"")===u).sort((A,U)=>Number(A.startMs)-Number(U.startMs)),l=$.find((A)=>_>=Number(A.startMs)-1000&&_<=Number(A.endMs)+1000);if(l)return{ms:_,onInterval:!0,snapReason:"inside-interval",procedureRunId:String(l.procedureRunId||"")};let j=ay(y),J=$.slice().reverse().find((A)=>Number(A.endMs)<=_+1000);if(J&&j==="approve")return{ms:Number(J.endMs),onInterval:!0,snapReason:"previous-interval-end",procedureRunId:String(J.procedureRunId||"")};let F=$.find((A)=>Number(A.startMs)>=_-1000);if(F&&["guide","modify","restart","redo"].includes(j))return{ms:Number(F.startMs),onInterval:!0,snapReason:"next-interval-start",procedureRunId:String(F.procedureRunId||"")};return{ms:_,onInterval:!1,snapReason:"event-time",procedureRunId:String(y?.procedureRunId||"")}}function dq(f,u,_,y){let $=Math.hypot(_-f,y-u),l=$>Qq?Qq:0,j=l>0?_-(_-f)/$*l:_,J=l>0?y-(y-u)/$*l:y,F=j-f,A=Math.max(16,Math.min(42,Math.abs(F)*0.45+12)),U=F===0?1:Math.sign(F);return`M ${f},${u} C ${f+U*A},${u} ${j-U*A},${J} ${j},${J}`}function IM(f,u){let _=String(f?.runId||u?.runId||""),y=iq({...Nf(u)?u:{},...Nf(f)?f:{},runId:_,procedureRuns:Ef(f?.procedureRuns).length>0?f.procedureRuns:u?.procedureRuns},[]),$=[],l=[],j=[],J=new Set,F=new Map,A=(W,K)=>{if(!W.nodeId||!Number.isFinite(Number(W.ms)))return;if(J.has(W.id))return;J.add(W.id),K.push(W)};for(let W of Ef(f?.procedureRuns)){let K=$2(W,_),q=l1(W);if(!K)continue;for(let E of Ef(W?.attempts)){let O=y2(E),G=new Set,H=new Set;for(let V of Ll(E?.controlEventRecords)){let L=O1(V);if(!["initial-prompt-delivered","append-prompt-delivered","monitor-prompt-delivered"].includes(L))continue;let M=oy(V),N=Pf(M);if(N===null)continue;let D=String(V?.eventId||"");if(D)G.add(D);H.add(`${L}:${M}:${String(V?.sourceKind||"")}:${String(V?.promptPreview||"")}`),A({id:`prompt:${D||`${q}:${O}:${L}:${N}`}`,runId:_,nodeId:K,procedureRunId:q,attempt:O,kind:"prompt",tone:wq(V,L),status:"delivered",label:Dq(V,L),ms:N,timestampIso:M,sourceKind:String(V?.sourceKind||""),sourceNodeId:String(V?.sourceNodeId||""),targetNodeId:K,action:"",eventId:D,commandId:String(V?.commandId||""),raw:V},$)}let Z=[{records:Ll(E?.controlPromptRecords),fallbackKind:"append-prompt-queued"},{records:Ll(E?.monitorPromptRecords),fallbackKind:"monitor-prompt-queued"}];for(let V of Z)for(let L of V.records){let M=oy(L),N=Pf(M);if(N===null)continue;let D=String(L?.eventId||"");if(D&&G.has(D))continue;let c=`${V.fallbackKind==="monitor-prompt-queued"?"monitor-prompt-delivered":"append-prompt-delivered"}:${M}:${String(L?.sourceKind||"")}:${String(L?.promptPreview||"")}`;if(H.has(c))continue;A({id:`prompt-fallback:${D||`${q}:${O}:${V.fallbackKind}:${N}`}`,runId:_,nodeId:K,procedureRunId:q,attempt:O,kind:"prompt",tone:wq(L,V.fallbackKind),status:"queued",label:Dq(L,V.fallbackKind),ms:N,timestampIso:M,sourceKind:String(L?.sourceKind||""),sourceNodeId:String(L?.sourceNodeId||""),targetNodeId:K,action:"",eventId:D,commandId:String(L?.commandId||""),raw:L},$)}}}let U=new Map;Ll(f?.controlEvents).forEach((W,K)=>{let q=Mq(W,K),E=U.get(q)||{key:q,events:[],commands:[]};E.events.push(W),U.set(q,E)}),Ef(f?.controlCommands).filter(Nf).forEach((W,K)=>{let q=Mq(W,K),E=U.get(q)||{key:q,events:[],commands:[]};E.commands.push(W),U.set(q,E)});for(let W of U.values()){let K=Ef(W.events).slice().sort((C,P)=>Tq(P)-Tq(C)),q=Ef(W.commands),E=Ef(W.events).find((C)=>O1(C)==="control-command-queued")||q[0]||null,O=K[0]||q[0]||E;if(!E&&!O)continue;let G=String(E?.sourceNodeId||O?.sourceNodeId||""),H=String(E?.sourceKind||O?.sourceKind||""),Z=oy(E)||oy(O)||Ml(E?.createdAt,O?.createdAt),V=Pf(Z),L=String(O?.commandId||E?.commandId||W.key),M=(O1(O)||"control-command-queued").replace(/^control-command-/u,""),N="";if(G&&V!==null)N=`control-source:${L}:${G}`,F.set(L,N),A({id:N,runId:_,nodeId:G,procedureRunId:String(E?.procedureRunId||O?.procedureRunId||""),attempt:"",kind:"control-source",tone:bM(E||O),status:M,label:`${Yl(E||O)} 发起`,ms:V,timestampIso:Z,action:ay(E||O),sourceKind:H,sourceNodeId:G,targetNodeId:String(O?.targetNodeId||E?.targetNodeId||""),commandId:L,raw:E||O},l);let D=O||E,x=oy(D)||Z,c=Pf(x);if(c===null)continue;let v=RM(D);for(let C of v){let P=hM(y,C,c,D),w=`control-target:${L}:${C}`;if(A({id:w,runId:_,nodeId:C,procedureRunId:P.procedureRunId,attempt:"",kind:"control-target",tone:vM(D),status:M,label:xM(D,C),ms:P.ms,eventMs:c,onInterval:P.onInterval,snapReason:P.snapReason,snapped:Number(P.ms)!==c,timestampIso:x,renderedTimestampIso:wl(Number(P.ms)),action:ay(D),sourceKind:H,sourceNodeId:G,targetNodeId:C,commandId:L,raw:D},l),N&&G&&G!==C)j.push({id:`control-arrow:${L}:${G}:${C}`,commandId:L,sourceNodeId:G,targetNodeId:C,sourceMarkerId:N,targetMarkerId:w,sourceKind:H,action:ay(D),status:M})}}let z=[...$,...l].sort((W,K)=>Number(W.ms)-Number(K.ms)||String(W.nodeId).localeCompare(String(K.nodeId))||String(W.id).localeCompare(String(K.id)));return{...PM(z,j),sourceMarkerByCommand:F}}function cM({details:f,selectedNodeId:u,selectedNodeRuntime:_,control:y,onRaw:$}){if(!f)return X("span",{className:"muted"},"点击“抓取过程”读取 node 运行材料;主界面只显示结构化摘要,完整内容需点开原始 JSON。");let l=Ef(f.procedureRuns),j=l.at(-1)||{},J=Ef(j.attempts),F=J.at(-1)||{},A=Ef(j.workerLogTail),U=Ef(F.controlEventsTail),z=Ef(F.controlPromptsTail),W=Ef(F.monitorPromptsTail),K=xF(U),q=xF(z),E=xF(W),O=F.opencodeMessages||{};return X("div",{className:"pipeline-evidence-list compact"},X(y1,{title:"Node runtime",subtitle:u||"--",facts:[`status ${_?.status||"pending"}`,`attempts ${_?.attempts??J.length}`,`procedure ${_?.currentProcedureRunId||l1(j)||"--"}`,y.fetchedAt?`fetched ${u2(y.fetchedAt)}`:"not fetched"],data:f.node||f,onRaw:$,testId:"raw-pipeline-node-runtime"}),X(y1,{title:"Procedure runs",subtitle:`${l.length} groups`,facts:[`latest ${j.status?.status||j.status||"--"}`,`steps ${Ef(j.recentSteps).length}`,`duration ${$1(Pf(j.finishedAt)&&Pf(j.startedAt)?Number(Pf(j.finishedAt))-Number(Pf(j.startedAt)):j.durationMs)}`],data:l,onRaw:$,testId:"raw-pipeline-node-procedures"}),X(y1,{title:"OpenCode messages",subtitle:String(O.exists?"available":"not indexed"),facts:[`messages ${t5(O.messageCount)}`,`size ${t5(O.size)}`,`updated ${z0(O.updatedAt)}`],data:O,onRaw:$,testId:"raw-pipeline-node-messages"}),X(y1,{title:"Control prompts",subtitle:"manual / monitor append queues",facts:[`manual tail ${q.total}`,`monitor tail ${E.total}`,`last ${z0(sF(q.lastAt,E.lastAt))}`],data:{controlPromptsTail:z,monitorPromptsTail:W},onRaw:$,testId:"raw-pipeline-node-prompts"}),X(y1,{title:"Control events",subtitle:K.eventKinds.length>0?K.eventKinds.join(", "):"event tail",facts:[`tail ${K.total}`,`parsed ${K.parsed}`,`last ${z0(K.lastAt)}`],data:U,onRaw:$,testId:"raw-pipeline-node-events"}),X(y1,{title:"Worker log",subtitle:"tail is hidden on main canvas",facts:[`tail ${A.length} lines`,"raw only via button",`procedure ${l1(j)||"--"}`],data:A,onRaw:$,testId:"raw-pipeline-node-worker-log"}))}function pM({activeRun:f,onRaw:u}){if(!f)return X(cu,{title:"暂无运行材料",text:"没有 Pipeline epoch 时不会展示运行材料索引。"});let _=Ef(f.nodes),y=Ef(f.procedureRuns),$=Ef(f.submissions),l=Ef(f.workerLogTail),j=Wq(_),J=Wq(y),F=y.filter((U)=>String(U?.status||"").toLowerCase()==="failed"),A=sF(...y.flatMap((U)=>[U.updatedAt,U.finishedAt,U.startedAt]));return X("div",{className:"pipeline-evidence-list"},X(y1,{title:"Epoch overview",subtitle:f.runId||"--",facts:[`pipeline ${f.pipelineId||"--"}`,`status ${f.status||"--"}`,`started ${z0(f.startedAt)}`,`updated ${z0(f.updatedAt)}`],data:f,onRaw:u,testId:"raw-pipeline-run"}),X(y1,{title:"Node states",subtitle:`${_.length} nodes`,facts:[`running ${j.running||0}`,`succeeded ${j.succeeded||0}`,`failed ${j.failed||0}`,`pending ${j.pending||0}`],data:_,onRaw:u,testId:"raw-pipeline-run-nodes"}),X(y1,{title:"Procedure run index",subtitle:`${y.length} procedure records`,facts:[`succeeded ${J.succeeded||0}`,`failed ${J.failed||0}`,`latest ${z0(A)}`,`errors ${F.length}`],data:y,onRaw:u,testId:"raw-pipeline-run-procedures"}),X(y1,{title:"OA submissions",subtitle:`${$.length} submission files`,facts:[`records ${$.length}`,`task ${t5(f.task)}`,"raw grouped by run"],data:$,onRaw:u,testId:"raw-pipeline-run-submissions"}),X(y1,{title:"Worker log tail",subtitle:"hidden from main interface",facts:[`tail ${l.length} lines`,"display raw only after click",`updated ${z0(f.updatedAt)}`],data:l,onRaw:u,testId:"raw-pipeline-run-worker-log"}))}function mM({diagnostics:f,onRaw:u}){let _=Ef(f?.runs).filter(Nf),y=Ef(f?.forbiddenResiduals),$=Nf(f?.guarantees)?f.guarantees:{},l=f?.hasNeutralNodeFinishedEvidence===!0&&f?.hasNoAuditPolicyEvidence===!0&&f?.hasAuditPolicyEvidence===!0,j=f?.ok===!0&&l&&y.length===0,J=_[0]||null,F=[{label:"中性完成事实",ok:$.neutralNodeFinished===!0,hint:"node-finished 不携带流程策略"},{label:"Config 策略判定",ok:$.auditPolicyFromConfig===!0,hint:"OA backend 读取当前 epoch 配置"},{label:"控制命令来自 OA",ok:$.runnerConsumesControlCommandsFromOaEvents===!0,hint:"runner 只消费 OA control.command"},{label:"无独立审核事件",ok:$.noIndependentAuditRequestEvent===!0,hint:"审核由 node-finished + policy 派生"},{label:"无批次门禁",ok:$.noBatchFinishedControlGate===!0,hint:"下游启动由每个 node 完成驱动"}];return X("div",{className:"pipeline-oa-panel","data-testid":"pipeline-oa-event-flow-panel"},X("div",{className:"metric-grid compact"},X(Hu,{label:"OA Flow",value:j?"100%":"--",hint:String(f?.mode||"waiting diagnostics"),tone:j?"ok":"warn"}),X(Hu,{label:"禁止残留",value:y.length,hint:y.length===0?"source scan clean":"needs cleanup",tone:y.length===0?"ok":"warn"}),X(Hu,{label:"No-audit",value:f?.hasNoAuditPolicyEvidence?"OK":"--",hint:"OA 下游策略证据",tone:f?.hasNoAuditPolicyEvidence?"ok":"warn"}),X(Hu,{label:"Monitor 审核",value:f?.hasAuditPolicyEvidence?"OK":"--",hint:"OA 控制事件闭环",tone:f?.hasAuditPolicyEvidence?"ok":"warn"})),X("div",{className:"pipeline-oa-guarantees"},F.map((A)=>X("article",{key:A.label,className:`pipeline-oa-guarantee ${A.ok?"ok":"warn"}`},X(uy,{status:A.ok?"online":"warn"},A.ok?"OK":"MISS"),X("div",null,X("strong",null,A.label),X("span",null,A.hint))))),X("div",{className:"pipeline-evidence-list compact"},_.slice(0,6).map((A)=>X(y1,{key:A.runId,title:String(A.runId||"--"),subtitle:[Number(A.monitorAuditNodeFinishedCount||0)>0?"monitor audit":"",Number(A.noAuditPolicyCount||0)>0?"no-audit policy":""].filter(Boolean).join(" / ")||"event evidence",facts:[`events ${A.eventCount||0}`,`node-finished ${A.nodeFinishedCount||0}`,`policy-in-detail ${A.nodeFinishedWithPolicyCount||0}`,`queued ${A.controlQueuedCount||0}`,`applied ${A.controlAppliedCount||0}`],data:A,onRaw:u,testId:`raw-pipeline-oa-run-${String(A.runId||"run").replace(/[^a-zA-Z0-9_.-]+/g,"-")}`}))),J?X("p",{className:"muted paragraph"},`最新证据 ${J.runId}: ${J.nodeFinishedCount||0} 个 node-finished,${J.controlAppliedCount||0} 个控制结果。`):X(cu,{title:"暂无 OA 事件流证据",text:"等待 Pipeline backend 暴露 diagnostics。"}),f?X("div",{className:"panel-actions inline-actions"},X(X1,{title:"Pipeline OA Event Flow Diagnostics",data:f,onOpen:u,testId:"raw-pipeline-oa-event-flow"})):null)}function kM({quota:f,onRaw:u}){let _=Nf(f?.summary)?f.summary:{},y=Nf(f?.target)?f.target:{},$=Nf(f?.cache)?f.cache:{},l=f?.ok===!0,j=String(f?.modelId||_.modelName||y.modelName||"MiniMax-M2.7"),J=_.totalCount??y.currentIntervalTotalCount,F=_.usageCount??y.currentIntervalUsageCount,A=_.remainingCount??y.currentIntervalRemainingCount,U=_.remainingRatio??(Number.isFinite(Number(J))&&Number(J)>0&&Number.isFinite(Number(A))?Number(A)/Number(J):void 0),z=_.usageRatio??(Number.isFinite(Number(J))&&Number(J)>0&&Number.isFinite(Number(F))?Number(F)/Number(J):void 0),W=_.resetAt||y.endAt,K=_.remainsMs??y.remainsMs,q=Number(A),E=!l||Number.isFinite(q)&&q<=0?"warn":"ok",O=[l?`endpoint ${f?.endpoint||"--"}`:"quota unavailable",`fetched ${n5(f?.fetchedAt)}`,$.hit?`cache ${$1($.ageMs)}`:"live quota"];return X("div",{className:"pipeline-minimax-quota-panel","data-testid":"pipeline-minimax-quota-panel"},X("div",{className:"metric-grid compact"},X(Hu,{label:"MiniMax",value:l?j:"--",hint:f?.modelComponent||f?.error||"model/minimax-m27",tone:E}),X(Hu,{label:"当前窗口",value:`${RF(F)}/${RF(J)}`,hint:`已用 ${Uq(z)}`,tone:E}),X(Hu,{label:"剩余额度",value:RF(A),hint:`剩余 ${Uq(U)}`,tone:E}),X(Hu,{label:"重置时间",value:n5(W),hint:K!==void 0?`约 ${$1(K)}`:z0(W),tone:E})),X(aF,{items:O}),l?X("p",{className:"muted paragraph"},`MiniMax 限额来自 D601 Pipeline 后端实时查询;当前模型匹配 ${_.modelName||y.modelName||j}。`):X(H0,{error:f?.error||"MiniMax 限额查询失败"}),f?X("div",{className:"panel-actions inline-actions"},X(X1,{title:"Pipeline MiniMax Quota",data:f,onOpen:u,testId:"raw-pipeline-minimax-quota"})):null)}function iM({epochs:f,activeRun:u,activePipeline:_,pipelineNodes:y,pipelineEdges:$,runDetails:l,nodeDetails:j,nodeDetailsState:J,ganttScale:F=Tl,onGanttScaleChange:A,onRunChange:U,onIntervalSelect:z,onMarkerSelect:W,selection:K,detailOpen:q,onDetailOpenChange:E,onRaw:O}){let[G,H]=Bu(YM),[Z,V]=Bu({startY:0,endY:0,startMs:0,endMs:0}),[L,M]=Bu(Date.now()),N=e_(null),D=String(u?.runId||""),x=Boolean(q),c=(uf)=>{if(typeof E==="function")E(uf)},v=_y(F??Tl),C=String(l?.runId||"")===D?l?.details:null,P=C?{...Nf(u)?u:{},...Nf(C)?C:{},runId:D,procedureRuns:Ef(C?.procedureRuns).length>0?C.procedureRuns:u?.procedureRuns}:u,w=iq(P,y,L),r=C?IM(C,P):{markers:[],arrows:[]},S=Ef(r.markers),T=LM(P,w,S),Y=MM(T,v,w,L),R=String(Y.source||"frontend-y"),m=w.map((uf)=>SM(uf,Y,L)),p={startMs:Number(Y.startMs),endMs:Number(Y.endMs),durationMs:Math.max(1,Number(Y.durationMs??Number(Y.endMs)-Number(Y.startMs)))},n=_Q(v),_f={...n,pxPerMinute:Number(Y.pxPerMinute??n.pxPerMinute)},t=Math.round(Number(Y.chartHeight||360)),ff=w.some(yQ);c1(()=>{if(!D||!ff)return;let uf=window.setInterval(()=>M(Date.now()),1000);return()=>window.clearInterval(uf)},[D,ff]);let Gf=GM(_,y,Array.isArray($)?$:[]),zf=y.map((uf)=>String(uf?.id||"")).filter(Boolean),jf=m.map((uf)=>String(uf.nodeId||"")).filter(Boolean),Wf=S.map((uf)=>String(uf.nodeId||"")).filter(Boolean),Vf=Array.from(new Set([...Gf,...zf,...jf,...Wf])),Zf={startY:0,endY:t,startMs:Number(p.startMs),endMs:Number(p.endMs)},h=Number(Z?.endY||0)>0?Z:Zf,g=(uf)=>{return f2(uf,p,t,Y)<=Number(h.endY)&&tF(uf,p,t,Y)>=Number(h.startY)},I=(uf)=>{let vf=Iu(uf,p,t,Y);return vf>=Number(h.startY)&&vf<=Number(h.endY)},$f=new Set(Vf.filter((uf)=>m.some((vf)=>vf.nodeId===uf&&g(vf))||S.some((vf)=>vf.nodeId===uf&&I(vf)))),lf=G?Vf.filter((uf)=>$f.has(uf)):Vf,Af=`${PF}px ${lf.length>0?lf.map(()=>`${h1}px`).join(" "):"minmax(160px, 1fr)"}`,Yf=Ef(Y.ticks).filter(Nf),xf=String(K?.mode==="interval"?K?.interval?.procedureRunId||"":""),sf=String(K?.mode==="event"?K?.marker?.id||"":""),j0=()=>{let uf=N.current;if(!uf){V(Zf);return}let vf=Math.max(0,uf.scrollTop-CF),a0=Math.max(120,uf.clientHeight-CF),Bf=Math.min(t,vf+a0),v0={startY:vf,endY:Bf,startMs:Number(p.startMs),endMs:Number(p.endMs)},i0=Math.max(0,Math.min(1,vf/t)),d0=Math.max(i0,Math.min(1,Bf/t)),b0=Math.max(1,Number(p.endMs)-Number(p.startMs));v0.startMs=Number(p.startMs)+b0*i0,v0.endMs=Number(p.startMs)+b0*d0,V(v0)};c1(()=>{let uf=N.current,vf=window.setTimeout(j0,0);return uf?.addEventListener("scroll",j0),window.addEventListener("resize",j0),()=>{window.clearTimeout(vf),uf?.removeEventListener("scroll",j0),window.removeEventListener("resize",j0)}},[D,p.startMs,p.endMs,t]);let u0=Math.max(0,Vf.length-lf.length),D0=new Set(S.filter((uf)=>lf.includes(String(uf.nodeId||""))&&I(uf)).map((uf)=>String(uf.id))),Fu=new Map(S.map((uf)=>[String(uf.id),uf])),O0=Ef(r.arrows).filter((uf)=>{if(!D0.has(String(uf.targetMarkerId||"")))return!1;if(String(uf.action||"")==="observe")return lf.includes(String(uf.sourceNodeId||""));return D0.has(String(uf.sourceMarkerId||""))}),x0=PF+Math.max(1,lf.length)*h1,ku=(uf)=>{let vf=_y(uf.target.value);if(typeof A==="function")A(vf);window.setTimeout(j0,0)},X0=()=>OM({title:`${_?.id||"pipeline"}-${D||"epoch"}-gantt`,meta:[`run ${D||"--"}`,`${z0(p.startMs)} -> ${z0(p.endMs)}`,`duration ${$1(p.durationMs)}`,`${_f.label} / ${IF(_f.pxPerMinute)} px/min`,`${lf.length}/${Vf.length} nodes`,`${S.length} markers`],visibleNodeIds:lf,intervals:m,markers:S.filter((uf)=>lf.includes(String(uf.nodeId||""))),arrows:O0,ticks:Yf,bounds:p,chartHeight:t,backendLayout:Y}),Qu=Nf(C?.gantt?.diagnostics)?C.gantt.diagnostics:null;return X(I1,{title:"Epoch 甘特图",eyebrow:`${_?.id||"pipeline"} / ${f.length} epochs`,className:"pipeline-wide-panel",actions:X("div",{className:"pipeline-gantt-actions"},X("select",{value:D,disabled:f.length===0,onChange:(uf)=>U(uf.target.value),"data-testid":"pipeline-epoch-select"},f.map((uf)=>X("option",{key:uf.runId,value:uf.runId},gF(f,uf)))),X("label",{className:"pipeline-gantt-toggle"},X("input",{type:"checkbox","data-testid":"pipeline-gantt-auto-hide-idle",checked:G,onChange:(uf)=>{H(Boolean(uf.target.checked)),window.setTimeout(j0,0)}}),X("span",null,"自动隐藏空闲列")),X("label",{className:"pipeline-gantt-scale"},X("span",null,X("b",null,"时间尺度"),X("em",{"data-testid":"pipeline-gantt-scale-label"},`${_f.label} · ${IF(_f.pxPerMinute)} px/min`)),X("input",{type:"range",min:0,max:100,step:0.01,value:v,onChange:ku,"aria-label":"调整甘特图时间尺度","data-testid":"pipeline-gantt-time-scale"}),X("small",null,X("span",null,"全局"),X("span",null,"细节"))),u?X("button",{type:"button",className:"ghost-btn",onClick:X0,disabled:lf.length===0,"data-testid":"pipeline-export-gantt"},"导出甘特图"):null,u?X(X1,{title:`Pipeline Epoch ${u.runId}`,data:u,onOpen:O,testId:"raw-pipeline-epoch-gantt"}):null)},!u?X(cu,{title:"暂无 Epoch",text:"当前 pipeline 还没有完整运行记录。"}):m.length===0?X(cu,{title:"暂无时间区间",text:"等待 D601 Pipeline backend 在 procedure summary 中返回 startedAt / finishedAt。"}):X("div",{className:"pipeline-gantt-wrap"},X("div",{className:`pipeline-gantt-detail-layout ${x?"detail-open":"detail-collapsed"}`,"data-testid":"pipeline-gantt-detail-layout","data-sidebar-open":x?"true":"false"},X("div",{className:"pipeline-gantt-main"},X("div",{className:"pipeline-gantt-main-head"},X("div",{className:"pipeline-gantt-meta"},X("span",null,`time ${z0(p.startMs)} -> ${z0(p.endMs)}`),X("span",null,`duration ${$1(p.durationMs)}`),X("span",null,`scale ${_f.label} / ${IF(_f.pxPerMinute)} px/min`),X("span",null,`layout ${R}`),Qu?X("span",null,`align ${Qu.timeAxisAlignmentOk===!1?"check":"ok"}`):null,X("span",null,`visible ${lf.length}/${Vf.length} nodes`),C?X("span",null,`markers ${S.length}`):null,G&&u0>0?X("span",null,`hidden idle ${u0}`):null),!x?X("button",{type:"button",className:"pipeline-sidecar-tab right",disabled:!K?.mode,onClick:()=>c(!0),"data-testid":"pipeline-gantt-sidebar-toggle"},K?.mode?"展开详情":"点击甘特图元素展开详情"):null),X("div",{className:"pipeline-gantt-viewport",ref:N,"data-testid":"pipeline-epoch-gantt","data-pipeline-id":_?.id||"","data-run-id":D,"data-layout-source":R,"data-start-ms":String(p.startMs),"data-end-ms":String(p.endMs),"data-chart-height":String(t)},X("div",{className:"pipeline-gantt-board",style:{gridTemplateColumns:Af,minWidth:`${x0}px`}},X("div",{className:"pipeline-gantt-head time"},"Time"),lf.length===0?X("div",{className:"pipeline-gantt-head empty"},"当前时间窗无工作节点"):lf.map((uf)=>X("div",{key:`head-${uf}`,className:"pipeline-gantt-head node",title:uf,"data-testid":"pipeline-gantt-head-node","data-node-id":uf},X(sT,{value:uf}))),X("div",{className:"pipeline-gantt-time-axis",style:{height:`${t}px`}},Yf.map((uf)=>{let vf=aq(uf,p,t,Y);return X("div",{key:`tick-${uf.ms}-${vf}`,className:"pipeline-gantt-tick",style:{top:`${vf}px`},"data-testid":"pipeline-gantt-tick","data-ms":String(uf.ms),"data-y":String(vf)},X("b",null,z0(uf.ms)),X("span",null,`+${$1(Number(uf.offsetMs??Number(uf.ms)-Number(p.startMs)))}`))})),lf.length>0?X("svg",{className:"pipeline-gantt-arrow-layer",width:lf.length*h1,height:t,viewBox:`0 0 ${lf.length*h1} ${t}`,style:{left:`${PF}px`,top:`${CF}px`,width:`${lf.length*h1}px`,height:`${t}px`},"aria-hidden":"true"},X("defs",null,X("marker",{id:"pipeline-gantt-arrowhead",viewBox:"0 0 10 10",refX:9,refY:5,markerWidth:6,markerHeight:6,orient:"auto-start-reverse"},X("path",{d:"M 0 0 L 10 5 L 0 10 z",fill:"context-stroke"}))),O0.map((uf)=>{let vf=Fu.get(String(uf.targetMarkerId||""));if(!vf)return null;let a0=Fu.get(String(uf.sourceMarkerId||"")),Bf=String(a0?.nodeId||uf.sourceNodeId||""),v0=lf.indexOf(Bf),i0=lf.indexOf(String(vf.nodeId||""));if(v0<0||i0<0)return null;let d0=v0*h1+h1/2,b0=i0*h1+h1/2,m1=a0?Iu(a0,p,t,Y):Iu(vf,p,t,Y),ef=Iu(vf,p,t,Y);return X("path",{key:uf.id,className:`pipeline-gantt-arrow ${String(uf.sourceKind||"").toLowerCase()} ${String(uf.status||"").toLowerCase()} ${String(uf.action||"").toLowerCase()}`,d:dq(d0,m1,b0,ef),markerEnd:"url(#pipeline-gantt-arrowhead)","data-testid":String(uf.action||"")==="observe"?"pipeline-gantt-observation-arrow":"pipeline-gantt-arrow","data-source-node-id":String(uf.sourceNodeId||""),"data-target-node-id":String(uf.targetNodeId||""),"data-target-marker-id":String(uf.targetMarkerId||""),"data-action":String(uf.action||""),"data-source-y":String(m1),"data-target-y":String(ef)})})):null,lf.length===0?X("div",{className:"pipeline-gantt-empty-col",style:{height:`${t}px`}},"滚动到有活动的时间段后,相关 node 列会自动出现。"):lf.map((uf)=>{let vf=m.filter((Bf)=>Bf.nodeId===uf),a0=S.filter((Bf)=>String(Bf.nodeId||"")===uf);return X("div",{key:`col-${uf}`,className:"pipeline-gantt-node-col",style:{height:`${t}px`}},vf.map((Bf)=>{let v0=f2(Bf,p,t,Y),i0=tF(Bf,p,t,Y),d0=oq(Bf,p,t,Y),b0=String(Bf.procedureRunId||`${uf}-${Bf.startMs}`);return X("button",{key:b0,type:"button",className:`pipeline-gantt-bar ${Bf.status} ${Bf.live?"live":""} ${xf===b0?"selected":""}`,style:{top:`${v0}px`,height:`${d0}px`},title:`${uf} ${Bf.status} ${z0(Bf.startedAt||Bf.startMs)} -> ${z0(Bf.finishedAt||Bf.endMs)}`,onClick:()=>z(Bf),"data-testid":"pipeline-gantt-line","data-node-id":uf,"data-procedure-run-id":String(Bf.procedureRunId||""),"data-status":String(Bf.status||""),"data-live":Bf.live?"true":"false","data-start-ms":String(Bf.startMs||""),"data-end-ms":String(Bf.endMs||""),"data-y1":String(v0),"data-y2":String(i0),"data-natural-height":String(Math.max(0,i0-v0))},X("strong",null,Bf.status||"working"),X("span",null,$1(Bf.durationMs)))}),a0.map((Bf)=>X("button",{key:Bf.id,type:"button",className:`pipeline-gantt-marker ${Bf.kind} ${Bf.tone||""} ${Bf.status||""} ${sf===String(Bf.id)?"selected":""}`,style:{top:`${Iu(Bf,p,t,Y)}px`},title:`${Bf.label||"event"} / ${z0(Bf.timestampIso||Bf.timestamp||Bf.ms)}`,onClick:()=>W(Bf),"data-testid":Bf.kind==="prompt"?"pipeline-gantt-prompt-marker":"pipeline-gantt-control-marker","data-marker-id":String(Bf.id||""),"data-ms":String(Bf.ms??Bf.eventMs??""),"data-y":String(Iu(Bf,p,t,Y))})))})))),x?X(tT,{selection:K,runDetails:l,nodeDetails:j,nodeDetailsState:J,onRaw:O,onCollapse:()=>c(!1)}):null)))}function A_(){return{loading:!1,actionLoading:"",error:"",message:"",details:null,fetchedAt:null,appendPrompt:"",guidePrompt:"",modifyPrompt:"",approveReason:"",redoReason:""}}function d_(){return{mode:"",runId:"",interval:null,marker:null}}function cF(){return{runId:"",loading:!1,error:"",details:null,fetchedAt:null}}function Ol(f,u){return`${f}/microservices/pipeline/proxy${u}`}function gM({activeRun:f,pipelineRuns:u,selectedRunId:_,onRunChange:y,selectedNodeId:$,selectedNodeConfig:l,selectedNodeRuntime:j,control:J,onControlChange:F,onFetch:A,onAction:U,onRaw:z,onCollapse:W}){let K=String(f?.runId||""),q=String(j?.status||"pending"),E=!K||!$||J.loading||Boolean(J.actionLoading),O=(H)=>(Z)=>F({[H]:Z.target.value,error:"",message:""}),G=u.length>0?u:f?[f]:[];return X("aside",{className:"pipeline-node-control","data-testid":"pipeline-node-control"},X("div",{className:"pipeline-node-control-head"},X("div",null,X("p",{className:"panel-eyebrow"},"Manual Node Control"),X("h3",null,$||"点击控制图中的 node")),X("div",{className:"pipeline-node-control-head-actions"},$?X(uy,{status:q},q):X(uy,{status:"pending"},"idle"),X("button",{type:"button",className:"ghost-btn mini",onClick:W,"data-testid":"pipeline-node-sidebar-collapse"},"收起"))),X("div",{className:"pipeline-control-runbar"},X("label",null,X("span",null,"目标 run"),X("select",{value:K||_,disabled:G.length===0,onChange:(H)=>y(H.target.value),"data-testid":"pipeline-node-run-select"},G.map((H)=>X("option",{key:H.runId,value:H.runId},`${H.runId||"--"} / ${H.status||"--"}`)))),X("button",{type:"button",className:"ghost-btn",disabled:E,onClick:A,"data-testid":"pipeline-node-fetch"},J.loading?"抓取中":"抓取过程"),J.details?X(X1,{title:`Pipeline Node ${$}`,data:J.details,onOpen:z,testId:"raw-pipeline-node-control"}):null),X("div",{className:"pipeline-control-meta"},X("span",null,X("b",null,"kind"),String(l?.kind||"--")),X("span",null,X("b",null,"procedure"),String(j?.currentProcedureRunId||"--")),X("span",null,X("b",null,"attempts"),String(j?.attempts??"--")),X("span",null,X("b",null,"updated"),z0(f?.updatedAt))),!$?X(cu,{title:"未选择 node",text:"点击 React Flow 控制图中的任意 node 后,可抓取执行过程、追加 prompt、下发引导、增量修改、审核通过或重做。"}):null,X(H0,{error:J.error,wide:!0}),J.message?X("div",{className:"form-success wide"},J.message):null,X("div",{className:"pipeline-control-actions"},X("label",null,X("span",null,"实时追加 prompt(仅 running node)"),X("textarea",{value:J.appendPrompt,onChange:O("appendPrompt"),placeholder:"让当前执行中的 agent 继续、补充检查或调整当前步骤...",rows:4,disabled:!$,"data-testid":"pipeline-node-append-input"}),X("button",{type:"button",className:"primary-btn compact",disabled:E||!String(J.appendPrompt||"").trim(),onClick:()=>U("append"),"data-testid":"pipeline-node-append-button"},J.actionLoading==="append"?"追加中":"追加到运行中 node")),X("label",null,X("span",null,"下次尝试引导 prompt"),X("textarea",{value:J.guidePrompt,onChange:O("guidePrompt"),placeholder:"给该 node 下一次 attempt 的执行提示;不会立即打断当前 session。",rows:4,disabled:!$,"data-testid":"pipeline-node-guide-input"}),X("button",{type:"button",className:"ghost-btn compact",disabled:E||!String(J.guidePrompt||"").trim(),onClick:()=>U("guide"),"data-testid":"pipeline-node-guide-button"},J.actionLoading==="guide"?"下发中":"下发 guide")),X("label",null,X("span",null,"完成后增量修改 prompt"),X("textarea",{value:J.modifyPrompt,onChange:O("modifyPrompt"),placeholder:"在该 node 已完成结果基础上追加修改要求;runner 会重跑目标 node,并保留同 node 既有 OA 输出作为上下文。",rows:4,disabled:!$,"data-testid":"pipeline-node-modify-input"}),X("button",{type:"button",className:"ghost-btn compact",disabled:E||!String(J.modifyPrompt||"").trim(),onClick:()=>U("modify"),"data-testid":"pipeline-node-modify-button"},J.actionLoading==="modify"?"排队中":"增量修改 node")),X("label",null,X("span",null,"Monitor 审核通过原因"),X("textarea",{value:J.approveReason,onChange:O("approveReason"),placeholder:"当流程配置开启 monitor 审核时,记录审核通过原因并释放后续 node。",rows:3,disabled:!$,"data-testid":"pipeline-node-approve-input"}),X("button",{type:"button",className:"primary-btn compact",disabled:E||!String(J.approveReason||"").trim(),onClick:()=>U("approve"),"data-testid":"pipeline-node-approve-button"},J.actionLoading==="approve"?"提交中":"审核通过")),X("label",null,X("span",null,"重做 / restart 原因"),X("textarea",{value:J.redoReason,onChange:O("redoReason"),placeholder:"说明为什么需要重做;runner 会重置目标 node 以及非 rework 下游 node。",rows:4,disabled:!$,"data-testid":"pipeline-node-redo-input"}),X("button",{type:"button",className:"danger-btn compact",disabled:E||!String(J.redoReason||"").trim(),onClick:()=>U("redo"),"data-testid":"pipeline-node-redo-button"},J.actionLoading==="redo"?"排队中":"重做 node"))),X("div",{className:"pipeline-control-evidence"},X("strong",null,"Node 过程索引"),X(cM,{details:J.details,selectedNodeId:$,selectedNodeRuntime:j,control:J,onRaw:z})))}function eq({microservices:f,onRaw:u,apiBaseUrl:_="/api"}){let y=f.find((s)=>s.id==="pipeline")||null,[$,l]=Bu({loading:!1,error:"",health:null,snapshot:null,oaDiagnostics:null,minimaxQuota:null,refreshedAt:null}),[j,J]=Bu(""),[F,A]=Bu(""),[U,z]=Bu(""),[W,K]=Bu(A_()),[q,E]=Bu({}),[O,G]=Bu(d_()),[H,Z]=Bu(cF()),[V,L]=Bu(Tl),[M,N]=Bu(!1),[D,x]=Bu(!1),c=e_(0),v=e_(!1),C=e_(0),P=e_(""),w=e_({}),r=e_(""),S=e_("");async function T(s={}){let Of=s.silent===!0;if(!y)return;if(v.current)return;v.current=!0;let qf=c.current+1;if(c.current=qf,!Of)l((Cf)=>({...Cf,loading:!0,error:""}));try{let Cf=`__unideskArrayLimit=registry.components:80,runs:${ST}`,[_0,G0,If]=await Promise.all([a_(`${_}/microservices/pipeline/proxy/api/snapshot?${Cf}`,{cache:"no-store"}),a_(`${_}/microservices/pipeline/proxy/api/oa-event-flow/diagnostics`,{cache:"no-store"}).catch((Au)=>({ok:!1,error:Mf(Au,"OA event flow diagnostics failed")})),a_(`${_}/microservices/pipeline/proxy/api/model-quota/minimax`,{cache:"no-store"}).catch((Au)=>({ok:!1,error:Mf(Au,"MiniMax quota failed")}))]);if(qf!==c.current)return;let h0={ok:_0?.ok!==!1,service:"pipeline-v2-control snapshot"};l({loading:!1,error:"",health:h0,snapshot:_0,oaDiagnostics:G0,minimaxQuota:If,refreshedAt:new Date})}catch(Cf){if(qf!==c.current)return;l((_0)=>({..._0,loading:!1,error:Mf(Cf,"Pipeline 加载失败")}))}finally{v.current=!1}}c1(()=>{if(T(),!y)return;let s=()=>{if(p5())T({silent:!0})},Of=window.setInterval(()=>{s()},Fq),qf=()=>{if(p5())s()};return document.addEventListener("visibilitychange",qf),()=>{window.clearInterval(Of),document.removeEventListener("visibilitychange",qf)}},[y?.id,y?.runtime?.providerStatus,_]);let Y=oT(y),R=dT(y),m=aT(y),p=$.snapshot||{},n=$.oaDiagnostics||null,_f=$.minimaxQuota||null,{components:t,pipelines:ff,runs:Gf}=eT(p),zf=String(Gf[0]?.pipelineId||""),jf=(zf?ff.find((s)=>String(s.id||"")===zf):null)||ff[0]||{},Wf=ff.find((s)=>String(s.id||"")===j)||jf,Vf=String(Wf.id||""),Zf=Iq(Wf),h=eF(Wf),g=Lq(Gf,Vf),I=NM(Gf,Vf),$f=I.find((s)=>String(s?.runId||"")===F)||g,lf=String(H.runId||"")===String($f?.runId||"")?yM(H.details):null,Af=$M($f,lf),Yf=String(Af?.runId||""),xf=Zf.find((s)=>String(s?.id||"")===U)||null,sf=U?cq(Af,U):null,j0=uM(Gf),u0=FM(t),D0=Number($.health?.components)||qq(p,"registry.components",t.length),Fu=qq(p,"runs",Gf.length),O0=Vq(Wf,Af,t),x0={nodes:O0.nodes.map((s)=>s.id===U?{...s,selected:!0,className:`${s.className||""} selected-control-node`}:s),edges:O0.edges},ku=ff.map((s)=>{let Of=String(s.id||"pipeline"),qf=Lq(Gf,Of);return{title:`${Of}-${qf?.runId||"snapshot"}`,flow:Vq(s,qf,t)}}),X0=String(O?.runId||Yf||""),Qu=String(O?.interval?.nodeId||O?.marker?.nodeId||""),uf=X0&&Qu?q[hF(X0,Qu)]||null:null,vf=s5(W.details,X0,Qu),a0=s5(uf?.details,X0,Qu)||vf,Bf=X0&&Qu?{...Nf(uf)?uf:{},runId:X0,nodeId:Qu,details:a0,loading:Boolean(uf?.loading)||!a0&&Boolean(W.loading)&&U===Qu,error:String(uf?.error||""),fetchedAt:uf?.fetchedAt||(vf?W.fetchedAt:null)}:null,v0=I.map((s)=>String(s?.runId||"")).filter(Boolean).join("|"),i0=Zf.map((s)=>String(s?.id||"")).filter(Boolean).join("|");c1(()=>{r.current=U},[U]),c1(()=>{S.current=Yf},[Yf]),c1(()=>{if(!F||v0.split("|").includes(F))return;A("")},[F,v0]),c1(()=>{if(!U||i0.split("|").includes(U))return;z(""),K(A_()),G(d_()),N(!1),x(!1)},[U,i0]),c1(()=>{if(!U)N(!1)},[U]),c1(()=>{if(!O.mode)x(!1)},[O.mode]);async function d0(s=Yf,Of={}){if(!s){Z(cF());return}let qf=_y(Of.scale??V??Tl),Cf=`${s}:timeline`;if(P.current===Cf)return;P.current=Cf;let _0=Of.silent===!0,G0=C.current+1;C.current=G0,Z((If)=>({runId:s,scale:qf,loading:!_0||String(If.runId||"")!==s||!If.details,error:"",details:_0&&If.runId===s?If.details:If.runId===s?If.details:null,fetchedAt:If.runId===s?If.fetchedAt:null}));try{let[If,h0]=await Promise.all([a_(Ol(_,`/api/node-control/runs/${encodeURIComponent(s)}?tail=160&view=timeline`),{cache:"no-store",strictJson:!0}),a_(Ol(_,`/api/runs/${encodeURIComponent(s)}`),{cache:"no-store"}).catch((Au)=>({ok:!1,runSummaryError:Mf(Au,"抓取评分失败")}))]);if(G0!==C.current)return;Z({runId:s,scale:qf,loading:!1,error:"",details:{...If,run:Nf(h0?.run)?h0.run:void 0,runSummaryError:h0?.runSummaryError},fetchedAt:new Date})}catch(If){if(G0!==C.current)return;Z((h0)=>({runId:s,scale:qf,loading:!1,error:Mf(If,"抓取 epoch 执行过程失败"),details:h0.runId===s?h0.details:null,fetchedAt:h0.runId===s?h0.fetchedAt:null}))}finally{if(P.current===Cf)P.current=""}}function b0(s,Of,qf){let Cf=hF(s,Of);E((_0)=>{let G0={..._0,[Cf]:{...Nf(_0?.[Cf])?_0[Cf]:{},runId:s,nodeId:Of,...qf}},If=Object.keys(G0);if(If.length>32)for(let h0 of If.slice(0,If.length-32))delete G0[h0];return G0})}async function m1(s,Of){if(!s||!Of)return;let qf=hF(s,Of),Cf=Number(w.current?.[qf]||0)+1;w.current={...w.current,[qf]:Cf},b0(s,Of,{loading:!0,error:""});try{let _0=await a_(Ol(_,`/api/node-control/runs/${encodeURIComponent(s)}/nodes/${encodeURIComponent(Of)}?tail=160`),{cache:"no-store",strictJson:!0});if(Number(w.current?.[qf]||0)!==Cf)return;let G0=new Date;if(b0(s,Of,{loading:!1,details:_0,fetchedAt:G0,error:""}),r.current===Of&&S.current===s)K((If)=>({...If,loading:!1,details:_0,fetchedAt:G0,error:""}))}catch(_0){if(Number(w.current?.[qf]||0)!==Cf)return;b0(s,Of,{loading:!1,error:Mf(_0,"抓取 Gantt node 详情失败")})}}c1(()=>{if(!Yf){Z(cF());return}d0(Yf);let s=()=>{if(p5())d0(Yf,{silent:!0})},Of=window.setInterval(()=>{s()},Fq),qf=()=>{if(p5())s()};return document.addEventListener("visibilitychange",qf),()=>{window.clearInterval(Of),document.removeEventListener("visibilitychange",qf)}},[Yf,_]);async function ef(s=Yf,Of=U){if(!s||!Of){K((qf)=>({...qf,error:"请先选择 run 和 node",message:""}));return}K((qf)=>({...qf,loading:!0,error:"",message:""}));try{let qf=await a_(Ol(_,`/api/node-control/runs/${encodeURIComponent(s)}/nodes/${encodeURIComponent(Of)}?tail=160`),{cache:"no-store",strictJson:!0}),Cf=new Date;K((_0)=>({..._0,loading:!1,details:qf,fetchedAt:Cf,error:""})),b0(s,Of,{loading:!1,details:qf,fetchedAt:Cf,error:""})}catch(qf){K((Cf)=>({...Cf,loading:!1,error:Mf(qf,"抓取 node 执行过程失败")}))}}async function iu(s){let Of=String(s?.runId||Yf||""),qf=String(s?.nodeId||"");if(G({mode:"interval",runId:Of,interval:s,marker:null}),x(!0),!Of||!qf)return;if(Of!==Yf)A(Of);z(qf),K(A_()),d0(Of,{silent:!0}),m1(Of,qf)}async function f3(s){let Of=String(s?.runId||Yf||""),qf=String(s?.nodeId||"");if(G({mode:"event",runId:Of,interval:null,marker:s}),x(!0),!Of)return;if(Of!==Yf)A(Of);if(d0(Of,{silent:!0}),!qf)return;z(qf),K(A_()),m1(Of,qf)}async function u3(s){if(!Yf||!U){K((Cf)=>({...Cf,error:"请先选择 run 和 node",message:""}));return}let Of=s==="append"?"prompts":s,qf=s==="append"?W.appendPrompt:s==="guide"?W.guidePrompt:s==="modify"?W.modifyPrompt:s==="approve"?W.approveReason:W.redoReason;if(!String(qf||"").trim()){K((Cf)=>({...Cf,error:"操作内容不能为空",message:""}));return}K((Cf)=>({...Cf,actionLoading:s,error:"",message:""}));try{let Cf=s==="redo"||s==="approve"?{reason:qf,source:"unidesk-frontend",sourceKind:"webui"}:{prompt:qf,source:"unidesk-frontend",sourceKind:"webui"},_0=await a_(Ol(_,`/api/node-control/runs/${encodeURIComponent(Yf)}/nodes/${encodeURIComponent(U)}/${Of}`),{method:"POST",body:JSON.stringify(Cf)});if(K((G0)=>({...G0,actionLoading:"",details:_0,fetchedAt:new Date,appendPrompt:s==="append"?"":G0.appendPrompt,guidePrompt:s==="guide"?"":G0.guidePrompt,modifyPrompt:s==="modify"?"":G0.modifyPrompt,approveReason:s==="approve"?"":G0.approveReason,redoReason:s==="redo"?"":G0.redoReason,message:s==="append"?"已追加到运行中 node":s==="guide"?"已下发 guide,等待 runner 处理":s==="modify"?"已排队增量修改命令":s==="approve"?"已提交审核通过决策":"已排队重做命令"})),await ef(Yf,U),await d0(Yf,{silent:!0}),s!=="append")await T()}catch(Cf){K((_0)=>({..._0,actionLoading:"",error:Mf(Cf,"node 控制操作失败")}))}}if(!y)return X(cu,{title:"Pipeline 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=pipeline"});return X("div",{className:"pipeline-page","data-testid":"pipeline-page"},X(I1,{title:"Pipeline v2 工作台",eyebrow:"D601 Snapshot 用户服务",actions:X("div",{className:"panel-actions"},X("button",{type:"button",className:"ghost-btn",onClick:T,disabled:$.loading,"data-testid":"pipeline-refresh-button"},$.loading?"刷新中":"刷新"),X(X1,{title:"Pipeline 用户服务",data:y,onOpen:u,testId:"raw-pipeline-service"}))},X("div",{className:"pipeline-hero"},X("div",null,X("div",{className:"node-version-line"},X(uy,{status:Y.providerStatus==="online"?"online":"warn"},Y.providerStatus||"unknown"),X("span",null,y.providerId),X("span",null,m.public?"公网暴露":"仅 UniDesk frontend 代理访问")),X("p",{className:"muted paragraph"},y.description)),X("div",{className:"microservice-ref-card"},X("span",null,"Repo"),X("strong",null,R.url||"--"),X("code",null,R.commitId||"--")),X("div",{className:"microservice-ref-card"},X("span",null,"D601 Docker"),X("strong",null,`${m.nodeBindHost||"--"}:${m.nodePort||"--"}`),X("code",null,`${R.composeFile||"--"} / ${R.composeService||"--"}`))),X(H0,{error:$.error,wide:!0})),X("div",{className:"pipeline-grid"},X(I1,{title:"控制图",eyebrow:`${Wf.id||"pipeline"} / run ${Af?.status||"--"}`,className:"pipeline-wide-panel",actions:X("div",{className:"pipeline-toolbar"},X("select",{value:Vf,disabled:ff.length===0,onChange:(s)=>{J(s.target.value),A(""),z(""),K(A_()),G(d_()),N(!1),x(!1)},"data-testid":"pipeline-select"},ff.map((s)=>X("option",{key:s.id,value:s.id},s.id||s.key))),X("select",{value:Yf,disabled:I.length===0,onChange:(s)=>{if(A(s.target.value),K(A_()),G(d_()),N(!1),x(!1),U)ef(s.target.value,U)},"data-testid":"pipeline-run-select"},I.map((s)=>X("option",{key:s.runId,value:s.runId},gF(I,s)))),X("button",{type:"button",className:"ghost-btn",disabled:x0.nodes.length===0,onClick:()=>kq(x0,`${Wf.id||"pipeline"}-${Af?.runId||"snapshot"}`),"data-testid":"pipeline-export-graph"},"导出渲染图"),X("button",{type:"button",className:"ghost-btn",disabled:ku.every((s)=>s.flow.nodes.length===0),onClick:()=>XM(ku),"data-testid":"pipeline-export-all-graphs"},"批量导出"))},Zf.length===0?X(cu,{title:"暂无控制图",text:"等待 D601 pipeline backend 返回 config.nodes / config.edges"}):X("div",{className:`pipeline-control-shell ${M?"detail-open":"detail-collapsed"}`,"data-testid":"pipeline-control-shell","data-sidebar-open":M?"true":"false"},X("div",{className:"pipeline-flow-frame","data-testid":"pipeline-react-flow"},X(uq,{nodes:x0.nodes,edges:x0.edges,nodeTypes:xT,edgeTypes:RT,fitView:!0,fitViewOptions:{padding:0.18},nodesDraggable:!1,nodesConnectable:!1,elementsSelectable:!0,minZoom:0.25,maxZoom:1.4,proOptions:{hideAttribution:!0},onNodeClick:(s,Of)=>{let qf=String(Of.id);if(z(qf),K(A_()),N(!0),Yf)ef(Yf,qf)}},X(yq,{gap:22,size:1,color:"rgba(215, 161, 58, 0.24)"}),X(lq,{showInteractive:!1})),!M?X("button",{type:"button",className:"pipeline-sidecar-tab right",disabled:!U,onClick:()=>N(!0),"data-testid":"pipeline-node-sidebar-toggle"},U?"展开 node 控制":"点击 node 展开控制"):null),M?X(gM,{activeRun:Af,pipelineRuns:I,selectedRunId:F,onRunChange:(s)=>{if(A(s),K(A_()),G(d_()),U)ef(s,U)},selectedNodeId:U,selectedNodeConfig:xf,selectedNodeRuntime:sf,control:W,onControlChange:(s)=>K((Of)=>({...Of,...s})),onFetch:()=>ef(),onAction:u3,onRaw:u,onCollapse:()=>N(!1)}):null),X("div",{className:"pipeline-flow-summary"},X("span",null,`${x0.nodes.length} nodes`),X("span",null,`${x0.edges.length} edges`),X("span",null,`${ff.length} pipelines`),X("span",null,`source config+components(${t.length})`),X("span",null,`run ${Af?.runId||"--"}`),X("span",null,`score ${iF(Af)}`),X("span",null,U?`selected ${U}`:"click node to control"))),X(iM,{epochs:I,activeRun:Af,activePipeline:Wf,pipelineNodes:Zf,pipelineEdges:h,selection:O,detailOpen:D,onDetailOpenChange:x,runDetails:H,nodeDetails:a0,nodeDetailsState:Bf,ganttScale:V,onGanttScaleChange:L,onIntervalSelect:iu,onMarkerSelect:f3,onRunChange:(s)=>{if(A(s),K(A_()),G(d_()),x(!1),U)ef(s,U)},onRaw:u}),X(I1,{title:"观测指标",eyebrow:$.refreshedAt?`Updated ${u2($.refreshedAt)}`:"Snapshot"},X("div",{className:"metric-grid"},X(Hu,{label:"Health",value:$.health?.ok?"OK":"--",hint:$.health?.service||"D601 /health",tone:$.health?.ok?"ok":"warn"}),X(Hu,{label:"组件",value:D0,hint:"components registry",tone:p?.registry?.ok===!1?"warn":"ok"}),X(Hu,{label:"Pipeline",value:ff.length,hint:`${Zf.length} nodes / ${h.length} edges`}),X(Hu,{label:"运行记录",value:Fu,hint:`${j0.succeeded||0} succeeded / ${j0.running||0} running`}),X(Hu,{label:"OA 记录",value:Array.isArray(g?.submissions)?g.submissions.length:0,hint:g?.runId||"latest run"}),X(Hu,{label:"Procedure",value:Array.isArray(g?.procedureRuns)?g.procedureRuns.length:0,hint:g?.status||"no run"}),X(Hu,{label:"Score",value:iF(Af),hint:Af?.runId||"selected epoch",tone:uQ(Af)})),X("div",{className:"panel-actions inline-actions"},X(X1,{title:"Pipeline Snapshot",data:p,onOpen:u,testId:"raw-pipeline-snapshot"}))),X(I1,{title:"评分器",eyebrow:Af?.runId||"selected epoch"},X(JM,{run:Af,onRaw:u})),X(I1,{title:"MiniMax 限额",eyebrow:"model/minimax-m27 quota"},X(kM,{quota:_f,onRaw:u})),X(I1,{title:"OA 事件流",eyebrow:"100% event-driven diagnostics",className:"pipeline-wide-panel"},X(mM,{diagnostics:n,onRaw:u})),X(I1,{title:"组件矩阵",eyebrow:`${u0.length} classes`},u0.length===0?X(cu,{title:"暂无组件",text:"等待 D601 pipeline backend 返回 registry.components"}):X("div",{className:"component-strata"},u0.map((s)=>X("article",{key:s.name,className:"component-stratum"},X("span",null,s.name),X("strong",null,s.count)))),X("div",{className:"pipeline-component-list"},t.slice(0,12).map((s)=>X("span",{key:s.key,className:"data-chip"},X("b",null,s.componentClass||"--"),X("span",null,s.id||s.key||"--"))))),X(I1,{title:"Epoch 列表",eyebrow:`${I.length}/${Fu} preview`},I.length===0?X(cu,{title:"暂无运行记录",text:"当前 pipeline 在 .state/pipeline-runs 中还没有 epoch。"}):X("div",{className:"pipeline-run-list"},I.map((s)=>{let Of=String(s?.runId||"")===Yf?Af:s;return X("article",{key:s.runId,className:`pipeline-run-card ${String(s.runId||"")===Yf?"active":""}`,role:"button",tabIndex:0,onClick:()=>{A(String(s.runId||"")),G(d_())},onKeyDown:(qf)=>{if(qf.key==="Enter"||qf.key===" ")A(String(s.runId||"")),G(d_())}},X("div",{className:"node-card-head"},X("strong",null,gF(I,s)),X(uy,{status:s.status},s.status||"--")),X("div",{className:"docker-meta compact"},X("span",null,Of?.pipelineId||"--"),X("span",null,`nodes ${Array.isArray(Of?.nodes)?Of.nodes.length:0}`),X("span",null,`oa ${Array.isArray(Of?.submissions)?Of.submissions.length:0}`),X("span",null,`procedures ${Array.isArray(Of?.procedureRuns)?Of.procedureRuns.length:0}`),X(jM,{run:Of})),X("p",{className:"muted paragraph"},t5(Of?.task)),X("span",{className:"pipeline-run-time"},z0(Of?.updatedAt)))}))),X(I1,{title:"运行材料索引",eyebrow:Af?.runId||"selected epoch",className:"pipeline-wide-panel"},X(pM,{activeRun:Af,onRaw:u}))))}var J2=rf(I0(),1);var e=J2.default.createElement,{useEffect:nM}=J2.default,l2=J2.default.useState,lQ={id:"",sequenceNo:"",contractNo:"",name:"",currentStatus:"",pending:"",paymentStatus:"",notes:""};function tM(f){return f.toLocaleTimeString("zh-CN",{hour12:!1})}function sM({status:f,children:u}){let _=String(f||"unknown").toLowerCase();return e("span",{className:`status-badge ${_}`},u||f||"unknown")}function j2({label:f,value:u,hint:_,tone:y}){return e("article",{className:`metric-card ${y||""}`},e("div",{className:"metric-label"},f),e("div",{className:"metric-value"},u),e("div",{className:"metric-hint"},_))}function jQ({title:f,eyebrow:u,actions:_,children:y,className:$}){return e("section",{className:`panel ${$||""}`},e("div",{className:"panel-head"},e("div",null,u?e("p",{className:"panel-eyebrow"},u):null,e("h2",null,f)),_?e("div",{className:"panel-actions"},_):null),e("div",{className:"panel-body"},y))}function fH({title:f,data:u,onOpen:_,testId:y}){return e("button",{type:"button",className:"ghost-btn","data-testid":y,onClick:()=>_(f,u)},"查看原始JSON")}function uH({title:f,text:u}){return e("div",{className:"empty-state"},e("strong",null,f),e("span",null,u))}function oM(f){return f?.runtime&&typeof f.runtime==="object"&&!Array.isArray(f.runtime)?f.runtime:{}}function aM(f){return f?.backend&&typeof f.backend==="object"&&!Array.isArray(f.backend)?f.backend:{}}function dM(f){return f?.repository&&typeof f.repository==="object"&&!Array.isArray(f.repository)?f.repository:{}}function G$(f,u){return`${f}/microservices/project-manager/proxy${u}`}function eM(f){return{id:String(f.id||""),sequenceNo:f.sequenceNo===null||f.sequenceNo===void 0?"":String(f.sequenceNo),contractNo:String(f.contractNo||""),name:String(f.name||""),currentStatus:String(f.currentStatus||""),pending:String(f.pending||""),paymentStatus:String(f.paymentStatus||""),notes:String(f.notes||"")}}function fS(f){return{sequenceNo:f.sequenceNo===""?null:Number(f.sequenceNo),contractNo:String(f.contractNo||"").trim(),name:String(f.name||"").trim(),currentStatus:String(f.currentStatus||"").trim(),pending:String(f.pending||"").trim(),paymentStatus:String(f.paymentStatus||"").trim(),paymentRatio:String(f.paymentStatus||"").trim(),notes:String(f.notes||"").trim()}}function JQ(f){return String(f||"item").replace(/[^A-Za-z0-9_-]+/g,"-")}function uS(f){let u=new Uint8Array(f),_="",y=32768;for(let $=0;$e("tr",{key:$.id,className:u===$.id?"active-row":"","data-testid":`project-manager-row-${JQ($.id)}`},e("td",null,$.sequenceNo??"--"),e("td",null,e("strong",null,$.contractNo||"--"),e("code",null,$.id||"--")),e("td",null,e("strong",null,$.name||"--"),e("span",{className:"muted block"},$.sourceFile||"--")),e("td",null,$.currentStatus||"--"),e("td",null,e("span",{className:"preline"},$.pending||"--")),e("td",null,e(sM,{status:Number($.paymentRatio||0)>=1?"online":"warn"},$.paymentStatus||"--")),e("td",null,$.notes||"--"),e("td",null,e("div",{className:"inline-actions"},e("button",{type:"button",className:"ghost-btn",onClick:()=>_($),"data-testid":`project-manager-edit-${JQ($.id)}`},"编辑"),e(fH,{title:`Project ${$.contractNo||$.id}`,data:$,onOpen:y,testId:`raw-project-${JQ($.id)}`}))))))))}function _H({microservices:f,onRaw:u,apiBaseUrl:_="/api"}){let y=f.find((N)=>N.id==="project-manager")||null,[$,l]=l2({loading:!1,saving:!1,importing:!1,exporting:!1,error:"",notice:"",health:null,list:null,refreshedAt:null}),[j,J]=l2({...lQ}),[F,A]=l2(""),[U,z]=l2("all");async function W(N=F,D=U){if(!y)return;l((x)=>({...x,loading:!0,error:""}));try{let x=new URLSearchParams({pageSize:"200",status:D});if(N.trim())x.set("q",N.trim());let[c,v]=await Promise.all([wf(`${_}/microservices/project-manager/health`),wf(G$(_,`/api/projects?${x.toString()}`))]);l((C)=>({...C,loading:!1,health:c,list:v,refreshedAt:new Date,error:""}))}catch(x){l((c)=>({...c,loading:!1,error:Mf(x,"Project Manager 加载失败")}))}}nM(()=>{W()},[y?.id,y?.runtime?.providerStatus]);async function K(N){N.preventDefault(),l((D)=>({...D,saving:!0,error:"",notice:""}));try{let D=fS(j);if(j.id)await wf(G$(_,`/api/projects/${encodeURIComponent(j.id)}`),{method:"PUT",body:JSON.stringify(D)});else await wf(G$(_,"/api/projects"),{method:"POST",body:JSON.stringify(D)});l((x)=>({...x,saving:!1,notice:j.id?"项目已更新":"项目已创建"})),await W()}catch(D){l((x)=>({...x,saving:!1,error:Mf(D,"保存项目失败")}))}}async function q(){if(!j.id)return;if(!window.confirm(`删除项目 ${j.contractNo||j.name||j.id} ?`))return;l((N)=>({...N,saving:!0,error:"",notice:""}));try{await wf(G$(_,`/api/projects/${encodeURIComponent(j.id)}`),{method:"DELETE"}),J({...lQ}),l((N)=>({...N,saving:!1,notice:"项目已删除"})),await W()}catch(N){l((D)=>({...D,saving:!1,error:Mf(N,"删除项目失败")}))}}async function E(N){let D=N.target.files?.[0];if(!D)return;l((x)=>({...x,importing:!0,error:"",notice:""}));try{let x=uS(await D.arrayBuffer()),c=await wf(G$(_,"/api/import/excel"),{method:"POST",body:JSON.stringify({fileName:D.name,contentBase64:x,replace:!1})});l((v)=>({...v,importing:!1,notice:`Excel 已导入 ${c.imported||0} 条项目`})),N.target.value="",await W()}catch(x){l((c)=>({...c,importing:!1,error:Mf(x,"Excel 导入失败")}))}}async function O(){l((N)=>({...N,exporting:!0,error:""}));try{let N=await _z(G$(_,"/api/projects/export.xlsx")),D=URL.createObjectURL(N),x=document.createElement("a");x.href=D,x.download=`project-manager-${new Date().toISOString().slice(0,10)}.xlsx`,document.body.appendChild(x),x.click(),x.remove(),URL.revokeObjectURL(D),l((c)=>({...c,exporting:!1,notice:"Excel 已导出"}))}catch(N){l((D)=>({...D,exporting:!1,error:Mf(N,"Excel 导出失败")}))}}if(!y)return e(uH,{title:"Project Manager 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=project-manager"});let G=oM(y),H=dM(y),Z=aM(y),V=Array.isArray($.list?.projects)?$.list.projects:[],L=$.list?.summary||{},M=$.health||{};return e("div",{className:"project-manager-page","data-testid":"project-manager-page"},e(jQ,{title:"项目管理工作台",eyebrow:"Main Server PostgreSQL 用户服务",actions:e("div",{className:"panel-actions"},e("button",{type:"button",className:"ghost-btn",disabled:$.loading,onClick:()=>W(),"data-testid":"project-manager-refresh-button"},$.loading?"刷新中":"刷新"),e("button",{type:"button",className:"ghost-btn",disabled:$.exporting,onClick:O,"data-testid":"project-manager-export-button"},$.exporting?"导出中":"导出 Excel"),e(fH,{title:"Project Manager 用户服务",data:y,onOpen:u,testId:"raw-project-manager-service"}))},e("div",{className:"project-manager-hero"},e(j2,{label:"项目总数",value:L.total??V.length,hint:`PG 表 ${M.storage?.table||"project_manager_projects"}`,tone:"ok"}),e(j2,{label:"进行中",value:L.active??"--",hint:"当前状态未完全完成"}),e(j2,{label:"已完成",value:L.completed??"--",hint:"按 完成 关键字统计",tone:"ok"}),e(j2,{label:"未全款",value:L.unpaid??"--",hint:"付款比例 < 1",tone:Number(L.unpaid||0)>0?"warn":"ok"})),e(H0,{error:$.error}),$.notice?e("div",{className:"form-success"},$.notice):null),e("div",{className:"project-manager-hero"},e("div",{className:"microservice-ref-card"},e("span",null,"Repo"),e("strong",null,H.url||"--"),e("code",null,H.commitId||"--")),e("div",{className:"microservice-ref-card"},e("span",null,"Main Server Docker"),e("strong",null,`${Z.nodeBindHost||"--"}:${Z.nodePort||"--"}`),e("code",null,`${H.composeService||"--"} / ${H.containerName||"--"}`)),e("div",{className:"microservice-ref-card"},e("span",null,"Runtime"),e("strong",null,G.providerName||y.providerId),e("code",null,`Health ${M.ok?"OK":"--"} / ${$.refreshedAt?tM($.refreshedAt):"--"}`)),e("div",{className:"microservice-ref-card"},e("span",null,"Import Source"),e("strong",null,"D601 WeChat Excel"),e("code",null,"合作项目列表_I_20260309.xlsx"))),e("div",{className:"project-manager-layout"},e(jQ,{title:"项目清单",eyebrow:"CRUD + Excel Export",actions:e("div",{className:"inline-actions project-manager-filters"},e("input",{value:F,onChange:(N)=>A(N.target.value),placeholder:"搜索合同号 / 项目名称 / 状态","data-testid":"project-manager-search"}),e("select",{value:U,onChange:(N)=>{z(N.target.value),W(F,N.target.value)},"data-testid":"project-manager-status-filter"},e("option",{value:"all"},"全部"),e("option",{value:"active"},"进行中"),e("option",{value:"completed"},"已完成"),e("option",{value:"unpaid"},"未全款")),e("button",{type:"button",className:"ghost-btn",onClick:()=>W(F,U)},"筛选"))},e(_S,{projects:V,activeId:j.id,onSelect:(N)=>J(eM(N)),onRaw:u})),e(jQ,{title:j.id?"编辑项目":"新建项目",eyebrow:"PostgreSQL Write Path"},e("form",{className:"stack-form project-manager-form",onSubmit:K,"data-testid":"project-manager-form"},j.id?e("label",null,"项目 ID",e("input",{value:j.id,disabled:!0})):null,e("label",null,"序号",e("input",{type:"number",value:j.sequenceNo,onChange:(N)=>J((D)=>({...D,sequenceNo:N.target.value}))})),e("label",null,"合同号",e("input",{value:j.contractNo,onChange:(N)=>J((D)=>({...D,contractNo:N.target.value})),required:!0})),e("label",null,"项目名称",e("input",{value:j.name,onChange:(N)=>J((D)=>({...D,name:N.target.value})),required:!0})),e("label",null,"当前状况",e("textarea",{value:j.currentStatus,onChange:(N)=>J((D)=>({...D,currentStatus:N.target.value}))})),e("label",null,"待完成",e("textarea",{value:j.pending,onChange:(N)=>J((D)=>({...D,pending:N.target.value}))})),e("label",null,"付款情况",e("input",{value:j.paymentStatus,onChange:(N)=>J((D)=>({...D,paymentStatus:N.target.value})),placeholder:"例如 1 / 0.5 / 50%"})),e("label",null,"其它",e("input",{value:j.notes,onChange:(N)=>J((D)=>({...D,notes:N.target.value}))})),e("div",{className:"inline-actions"},e("button",{type:"submit",className:"primary-btn",disabled:$.saving,"data-testid":"project-manager-save-button"},$.saving?"保存中":j.id?"保存修改":"创建项目"),e("button",{type:"button",className:"ghost-btn",onClick:()=>J({...lQ})},"清空"),j.id?e("button",{type:"button",className:"danger-btn",disabled:$.saving,onClick:q,"data-testid":"project-manager-delete-button"},"删除"):null)),e("div",{className:"project-manager-import"},e("p",{className:"muted paragraph"},"浏览器只访问 UniDesk frontend;后端通过同源用户服务代理写入主 PostgreSQL,不暴露 4233 公网端口。"),e("label",{className:"file-import"},$.importing?"导入中...":"导入 Excel",e("input",{type:"file",accept:".xlsx",onChange:E,disabled:$.importing,"data-testid":"project-manager-import-input"}))))))}var U2=rf(I0(),1);var yf=U2.default.createElement,{useEffect:yS}=U2.default,Du=U2.default.useState;function yH(f){if(!f)return"--";let u=new Date(f);if(Number.isNaN(u.getTime()))return"--";return u.toLocaleString("zh-CN",{hour12:!1})}function $S(f){return f.toLocaleTimeString("zh-CN",{hour12:!1})}function lS({status:f,children:u}){let _=String(f||"unknown").toLowerCase();return yf("span",{className:`status-badge ${_}`},u||f||"unknown")}function F2({label:f,value:u,hint:_,tone:y}){return yf("article",{className:`metric-card ${y||""}`},yf("div",{className:"metric-label"},f),yf("div",{className:"metric-value"},u),yf("div",{className:"metric-hint"},_))}function FQ({title:f,eyebrow:u,actions:_,children:y,className:$}){return yf("section",{className:`panel ${$||""}`},yf("div",{className:"panel-head"},yf("div",null,u?yf("p",{className:"panel-eyebrow"},u):null,yf("h2",null,f)),_?yf("div",{className:"panel-actions"},_):null),yf("div",{className:"panel-body"},y))}function $H({title:f,data:u,onOpen:_,testId:y}){return yf("button",{type:"button",className:"ghost-btn","data-testid":y,onClick:()=>_(f,u)},"查看原始JSON")}function Q2({title:f,text:u}){return yf("div",{className:"empty-state"},yf("strong",null,f),yf("span",null,u))}function jS(f){return f?.runtime&&typeof f.runtime==="object"&&!Array.isArray(f.runtime)?f.runtime:{}}function JS(f){return f?.backend&&typeof f.backend==="object"&&!Array.isArray(f.backend)?f.backend:{}}function FS(f){return f?.repository&&typeof f.repository==="object"&&!Array.isArray(f.repository)?f.repository:{}}function jH(f){return String(f).replace(/[^a-zA-Z0-9_-]/g,"_")}function QS(f){if(!Number.isFinite(f))return"--";return`${f.toFixed(1)}%`}function K$(f,u){return`${f}/microservices/todo-note/proxy${u}`}function JH(f){return f.reduce((u,_)=>{let y=JH(Array.isArray(_.children)?_.children:[]),$=Boolean(_.completed);return{total:u.total+1+y.total,completed:u.completed+($?1:0)+y.completed,active:u.active+($?0:1)+y.active}},{total:0,completed:0,active:0})}function A2(f,u){let _=u==="all"||(u==="completed"?Boolean(f.completed):!f.completed),y=Array.isArray(f.children)?f.children:[];return _||y.some(($)=>A2($,u))}function AS(f){if(!f)return"";let u=new Date(f);if(Number.isNaN(u.getTime()))return"";return new Date(u.getTime()-u.getTimezoneOffset()*60000).toISOString().slice(0,16)}function US(f){if(!f)return null;let u=new Date(f);return Number.isNaN(u.getTime())?null:u.toISOString()}function lH(f){return Array.isArray(f?.instances)?f.instances:[]}function FH({microservices:f,onRaw:u,apiBaseUrl:_="/api"}){let y=f.find((I)=>I.id==="todo-note")||null,[$,l]=Du(null),[j,J]=Du(null),[F,A]=Du(""),[U,z]=Du(null),[W,K]=Du("all"),[q,E]=Du(13),[O,G]=Du(""),[H,Z]=Du(""),[V,L]=Du(""),[M,N]=Du(""),[D,x]=Du(""),[c,v]=Du(!1),[C,P]=Du(""),[w,r]=Du(null),S=lH(j),T=JH(Array.isArray(U?.todos)?U.todos:[]),Y=y?jS(y):{},R=y?FS(y):{},m=y?JS(y):{};async function p(I=F){let[$f,lf]=await Promise.all([wf(`${_}/microservices/todo-note/health`),wf(K$(_,"/api/instances"))]);l($f),J(lf);let Af=lH(lf),Yf=Af.some((xf)=>xf.id===I)?I:Af[0]?.id||"";return A(Yf),Yf}async function n(I=F){if(!I){z(null);return}let $f=await wf(K$(_,`/api/instances/${encodeURIComponent(I)}`));z($f)}async function _f(I=F){if(!y)return;v(!0),P("");try{let $f=await p(I);await n($f),r(new Date)}catch($f){P(Mf($f,"Todo Note 加载失败"))}finally{v(!1)}}async function t(I){if(!F)return;P("");try{let $f=await wf(K$(_,`/api/instances/${encodeURIComponent(F)}/actions`),{method:"POST",body:JSON.stringify({action:I})});z($f),await p(F)}catch($f){P(Mf($f,"Todo 操作失败"))}}async function ff(I){I.preventDefault();let $f=O.trim();if(!$f)return;v(!0),P("");try{let lf=await wf(K$(_,"/api/instances"),{method:"POST",body:JSON.stringify({name:$f})});G(""),await _f(lf.id)}catch(lf){P(Mf(lf,"创建清单失败"))}finally{v(!1)}}async function Gf(I){if(!window.confirm("确认删除这个 Todo Note 清单?"))return;v(!0),P("");try{await wf(K$(_,`/api/instances/${encodeURIComponent(I)}`),{method:"DELETE"}),await _f(F===I?"":F)}catch($f){P(Mf($f,"删除清单失败"))}finally{v(!1)}}async function zf(I){I.preventDefault();let $f=H.trim();if(!$f)return;Z(""),await t({type:"addTodo",title:$f})}async function jf(I){if(!F)return;P("");try{let $f=await wf(K$(_,`/api/instances/${encodeURIComponent(F)}/${I}`),{method:"POST",body:JSON.stringify({})});z($f),await p(F)}catch($f){P(Mf($f,`${I} 失败`))}}function Wf(I){L(I.id),N(String(I.title||""))}async function Vf(I){let $f=M.trim();if(L(""),N(""),$f)await t({type:"updateTodoTitle",todoId:I,title:$f})}async function Zf(I){let $f=window.prompt("新增子任务标题");if($f&&$f.trim())await t({type:"addTodo",title:$f.trim(),parentId:I})}async function h(I,$f){if(!D)return;let lf={type:"moveTodo",todoId:D,targetIndex:$f};if(I)lf.targetParentId=I;x(""),await t(lf)}if(yS(()=>{_f()},[y?.id,y?.runtime?.providerStatus]),!y)return yf(Q2,{title:"Todo Note 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=todo-note"});let g=S.find((I)=>I.id===F)||null;return yf("div",{className:"todo-note-page","data-testid":"todo-note-page"},yf(FQ,{title:"Todo Note 工作台",eyebrow:"Main Server 用户服务",actions:yf("div",{className:"panel-actions"},yf("button",{type:"button",className:"ghost-btn",disabled:c,onClick:()=>_f(F),"data-testid":"todo-note-refresh-button"},c?"刷新中":"刷新"),yf($H,{title:"Todo Note 用户服务",data:y,onOpen:u,testId:"raw-todo-note-service"}))},yf("div",{className:"todo-note-hero"},yf("div",null,yf("div",{className:"node-version-line"},yf(lS,{status:Y.providerStatus==="online"?"online":"warn"},Y.providerStatus||"unknown"),yf("span",null,y.providerId),yf("span",null,m.public?"公网暴露":"仅 UniDesk frontend 代理访问"),yf("span",null,$?.ok?"Health OK":"Health --")),yf("p",{className:"muted paragraph"},y.description)),yf("div",{className:"microservice-ref-card"},yf("span",null,"Repo"),yf("strong",null,R.url||"--"),yf("code",null,R.commitId||"--")),yf("div",{className:"microservice-ref-card"},yf("span",null,"Main Server Docker"),yf("strong",null,`${m.nodeBindHost||"--"}:${m.nodePort||"--"}`),yf("code",null,`${R.composeService||"--"} / ${R.containerName||"--"}`))),yf(H0,{error:C,wide:!0})),yf("div",{className:"todo-note-layout"},yf(FQ,{title:"清单",eyebrow:`${S.length} Instances`,className:"todo-list-panel"},yf("form",{className:"todo-create-list",onSubmit:ff},yf("input",{placeholder:"新清单名称",value:O,onChange:(I)=>G(I.target.value),"aria-label":"新清单名称"}),yf("button",{type:"submit",className:"ghost-btn",disabled:c||!O.trim()},"创建")),S.length===0?yf(Q2,{title:"暂无清单",text:"迁移或创建清单后会出现在这里"}):yf("div",{className:"todo-instance-list"},S.map((I)=>yf("button",{key:I.id,type:"button",className:`todo-instance-row ${F===I.id?"active":""}`,onClick:()=>{A(I.id),n(I.id)},"data-testid":`todo-instance-${jH(I.id)}`},yf("strong",null,I.name),yf("span",null,`${I.completedCount??0}/${I.todoCount??0} 完成`),yf("code",null,I.id))))),yf("div",{className:"todo-main-stack"},yf(FQ,{title:g?.name||"待选择清单",eyebrow:w?`Updated ${$S(w)}`:"Todo Tree",actions:U?yf("div",{className:"panel-actions"},yf("button",{type:"button",className:"ghost-btn",onClick:()=>t({type:"renameInstance",name:window.prompt("清单新名称",U.name)||U.name})},"重命名"),yf("button",{type:"button",className:"ghost-btn danger",onClick:()=>Gf(F)},"删除清单"),yf($H,{title:`Todo Instance ${F}`,data:U,onOpen:u,testId:"raw-todo-instance"})):null},!U?yf(Q2,{title:"未选择清单",text:"左侧选择一个 Todo Note 清单"}):yf("div",{className:"todo-workbench",style:{"--todo-font-size":`${q}px`}},yf("div",{className:"todo-toolbar"},yf("form",{className:"todo-add-form",onSubmit:zf},yf("input",{placeholder:"新增根任务",value:H,onChange:(I)=>Z(I.target.value),"aria-label":"新增根任务"}),yf("button",{type:"submit",className:"ghost-btn",disabled:!H.trim()},"新增")),yf("div",{className:"todo-filter-strip"},["all","active","completed"].map((I)=>yf("button",{key:I,type:"button",className:`todo-filter ${W===I?"active":""}`,onClick:()=>K(I)},I==="all"?"全部":I==="active"?"未完成":"已完成"))),yf("div",{className:"todo-toolbar-actions"},yf("button",{type:"button",className:"ghost-btn",onClick:()=>t({type:"setAllTodosExpanded",expanded:!0})},"全部展开"),yf("button",{type:"button",className:"ghost-btn",onClick:()=>t({type:"setAllTodosExpanded",expanded:!1})},"全部收起"),yf("button",{type:"button",className:"ghost-btn",onClick:()=>jf("undo")},"撤销"),yf("button",{type:"button",className:"ghost-btn",onClick:()=>jf("redo")},"重做"),yf("label",{className:"todo-font-control"},"字号",yf("input",{type:"range",min:11,max:18,value:q,onChange:(I)=>E(Number(I.target.value))})))),yf("div",{className:"todo-stats-grid"},yf(F2,{label:"总任务",value:T.total,hint:`${S.length} lists`}),yf(F2,{label:"已完成",value:T.completed,hint:`${QS(T.total?T.completed/T.total*100:0)}`,tone:"ok"}),yf(F2,{label:"未完成",value:T.active,hint:W==="active"?"当前筛选":"active tasks",tone:T.active>0?"warn":"ok"}),yf(F2,{label:"历史指针",value:U.historyPointer??0,hint:"undo / redo"})),yf("div",{className:"todo-root-drop",onDragOver:(I)=>I.preventDefault(),onDrop:(I)=>{I.preventDefault(),h(null,(U.todos||[]).length)}},"拖到这里可移为根任务末尾"),yf("div",{className:"todo-tree","data-testid":"todo-note-tree"},(U.todos||[]).filter((I)=>A2(I,W)).length===0?yf(Q2,{title:"没有匹配任务",text:"调整筛选或新增任务"}):(U.todos||[]).filter((I)=>A2(I,W)).map((I,$f)=>yf(QH,{key:I.id,todo:I,depth:0,parentId:null,index:$f,siblingCount:U.todos.length,filter:W,editingId:V,editingTitle:M,setEditingTitle:N,beginEdit:Wf,saveEdit:Vf,applyTodoAction:t,addChild:Zf,dragTodoId:D,setDragTodoId:x,dropTodo:h}))))))))}function QH(f){let{todo:u,depth:_,parentId:y,index:$,siblingCount:l,filter:j,editingId:J,editingTitle:F,setEditingTitle:A,beginEdit:U,saveEdit:z,applyTodoAction:W,addChild:K,dragTodoId:q,setDragTodoId:E,dropTodo:O}=f,G=Array.isArray(u.children)?u.children:[],H=G.filter((L)=>A2(L,j)),Z=J===u.id,V=y||null;return yf("div",{className:"todo-row-wrap"},yf("article",{className:`todo-row ${u.completed?"completed":""} ${q===u.id?"dragging":""}`,style:{"--todo-depth":_},draggable:!0,onDragStart:(L)=>{E(u.id),L.dataTransfer.effectAllowed="move"},onDragOver:(L)=>L.preventDefault(),onDrop:(L)=>{L.preventDefault(),O(u.id,G.length)},"data-testid":`todo-row-${jH(u.id)}`},yf("button",{type:"button",className:"todo-expand",disabled:G.length===0,onClick:()=>W({type:"toggleTodoExpanded",todoId:u.id})},G.length===0?"·":u.expanded?"▾":"▸"),yf("input",{type:"checkbox",checked:Boolean(u.completed),onChange:()=>W({type:"toggleTodoCompleted",todoId:u.id}),"aria-label":`完成 ${u.title}`}),yf("div",{className:"todo-title-cell",onDoubleClick:()=>U(u)},Z?yf("div",{className:"todo-edit-inline"},yf("input",{value:F,autoFocus:!0,onChange:(L)=>A(L.target.value),onKeyDown:(L)=>{if(L.key==="Enter")z(u.id);if(L.key==="Escape")U({id:"",title:""})}}),yf("button",{type:"button",className:"ghost-btn",onClick:()=>z(u.id)},"保存")):yf("strong",null,u.title||"Untitled"),yf("div",{className:"todo-meta-line"},yf("span",null,`子项 ${G.length}`),yf("span",null,`更新 ${yH(u.updatedAt)}`),u.reminderAt?yf("span",{className:"todo-reminder"},`提醒 ${yH(u.reminderAt)}`):yf("span",null,"无提醒"))),yf("input",{className:"todo-reminder-input",type:"datetime-local",value:AS(u.reminderAt),onChange:(L)=>W({type:"setTodoReminder",todoId:u.id,reminderAt:US(L.target.value)})}),yf("div",{className:"todo-row-actions"},yf("button",{type:"button",className:"ghost-btn",onClick:()=>U(u)},"编辑"),yf("button",{type:"button",className:"ghost-btn",onClick:()=>K(u.id)},"子项"),yf("button",{type:"button",className:"ghost-btn",disabled:$<=0,onClick:()=>W({type:"moveTodo",todoId:u.id,...V?{targetParentId:V}:{},targetIndex:$-1})},"上移"),yf("button",{type:"button",className:"ghost-btn",disabled:$>=l-1,onClick:()=>W({type:"moveTodo",todoId:u.id,...V?{targetParentId:V}:{},targetIndex:$+1})},"下移"),yf("button",{type:"button",className:"ghost-btn",disabled:!y,onClick:()=>W({type:"moveTodo",todoId:u.id,targetIndex:9999})},"提升"),yf("button",{type:"button",className:"ghost-btn danger",onClick:()=>W({type:"deleteTodo",todoId:u.id})},"删除"))),u.expanded&&H.length>0?yf("div",{className:"todo-children"},H.map((L,M)=>yf(QH,{key:L.id,todo:L,depth:_+1,parentId:u.id,index:M,siblingCount:G.length,filter:j,editingId:J,editingTitle:F,setEditingTitle:A,beginEdit:U,saveEdit:z,applyTodoAction:W,addChild:K,dragTodoId:q,setDragTodoId:E,dropTodo:O}))):null)}var AH=rf(I0(),1),yy=AH.default.createElement;function UH({title:f,items:u,actions:_,className:y,testId:$}){let l=Array.isArray(u)?u:[];return yy("section",{className:`top-status-bar ${y||""}`,"data-testid":$},yy("div",{className:"top-status-main"},f?yy("strong",{className:"top-status-title"},f):null,yy("div",{className:"top-status-chips"},l.map((j,J)=>yy("span",{key:j?.key||`${j?.label||"status"}-${J}`,className:`top-status-chip ${j?.tone||""}`,"data-testid":j?.testId},j?.label?yy("b",null,j.label):null,yy("span",null,j?.value??"--"))))),_?yy("div",{className:"top-status-actions"},_):null)}function XH(f,u){let _=document.getElementById("root")?.getAttribute(f);if(!_)return u;try{let y=JSON.parse(_);return typeof y==="object"&&y!==null&&!Array.isArray(y)?y:u}catch{return u}}var tf=XH("data-config",{apiBaseUrl:"/api",authUsername:"admin"}),WS=XH("data-codex-overview",null),Q=Pl.default.createElement,{useEffect:p1,useMemo:Cl}=Pl.default,hf=Pl.default.useState,mu=FG(c4),zS={id:"codex-queue",name:"Codex Queue",providerId:"main-server",description:"Codex Queue",repository:{containerName:"codex-queue-backend"},backend:{nodeBaseUrl:"http://codex-queue:4222",nodeBindHost:"codex-queue",nodePort:4222,public:!1},runtime:{providerStatus:"loading",providerName:"main-server"}};function WH(){return typeof document>"u"||document.visibilityState!=="hidden"}function GS(f,u){if(f==="ops"&&u==="status")return 5000;if(f==="nodes"&&u==="monitor")return 5000;if(f==="tasks"&&(u==="dispatch"||u==="pending"))return 5000;if(f==="nodes"||f==="ops")return 1e4;if(f==="apps")return 15000;if(f==="tasks")return 15000;return 30000}async function KS(f){if(!f?._summaryOnly||!f?.id)return f;return(await wf(`${tf.apiBaseUrl}/tasks/${encodeURIComponent(String(f.id))}`))?.task||f}function Rl(f){return f?._summaryOnly?{...f,_loadRaw:()=>KS(f)}:f}function m0(f){if(!f)return"--";let u=new Date(f);if(Number.isNaN(u.getTime()))return"--";return u.toLocaleString("zh-CN",{hour12:!1})}function W2(f){return f.toLocaleTimeString("zh-CN",{hour12:!1})}function H$(f){if(!Number.isFinite(f))return"--";let u=Math.max(0,f);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 _=Math.floor(u);if(_<3600)return`${Math.floor(_/60)}m ${_%60}s`;return`${Math.floor(_/3600)}h ${Math.floor(_%3600/60)}m`}function pu(f){let u=Number(f);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 H$(u/1000)}function Ju(f){let u=Number(f);if(!Number.isFinite(u)||u<=0)return"--";let _=["B","KB","MB","GB","TB"],y=u,$=0;while(y>=1024&&$<_.length-1)y/=1024,$+=1;return`${y.toFixed($===0?0:1)} ${_[$]}`}function $y(f){let u=Number(f);return Number.isFinite(u)?`${Math.max(0,Math.min(100,u)).toFixed(1)}%`:"--"}function ZS(f){let u=Number(f);return Number.isFinite(u)?`${Math.max(0,u).toFixed(1)}%`:"--"}function QQ(f){let u=Number(f);if(!Number.isFinite(u)||u<=0)return"0 B/s";return`${Ju(u)}/s`}function Tf(f,u=0){let _=Number(f);return Number.isFinite(_)?_:u}function E$(f){return["queued","dispatched","running"].includes(String(f?.status||"").toLowerCase())}function WQ(f){if(!f)return"--";let u=new Date(f);if(Number.isNaN(u.getTime()))return"--";return H$(Math.max(0,Math.floor((Date.now()-u.getTime())/1000)))}function Z$(f){if(!f)return null;let u=new Date(f);return Number.isNaN(u.getTime())?null:u.getTime()}function NH(f){let u=Z$(f?.createdAt);if(u===null)return null;let y=["succeeded","failed"].includes(String(f?.status||"").toLowerCase())?Z$(f?.updatedAt):Date.now();if(y===null)return null;return Math.max(0,(y-u)/1000)}function LH(f){if(String(f?.status||"").toLowerCase()!=="failed")return"";let u=f?.result;if(typeof u==="string")return u;if(u&&typeof u==="object"&&!Array.isArray(u)){let _=u;for(let y of["error","reason","message","stderr","detail"])if(typeof _[y]==="string"&&_[y].length>0)return _[y]}return"任务失败但 provider 未返回明确原因"}function dy(f){if(f===null||f===void 0)return"--";if(typeof f==="boolean")return f?"是":"否";if(typeof f==="number")return String(f);if(typeof f==="string")return f.length>80?`${f.slice(0,77)}...`:f;if(Array.isArray(f))return`${f.length} 项`;if(typeof f==="object")return`${Object.keys(f).length} 字段`;return String(f)}function qS(f,u){if(f==="bodyText"&&typeof u==="string")return`${/^\s*[{[]/.test(u)?"JSON":"HTTP"} body ${u.length} chars`;return dy(u)}function YH(f){if(!f||typeof f!=="object"||Array.isArray(f))return[];return Object.entries(f)}function N1(f){return String(f).replace(/[^a-zA-Z0-9_-]/g,"_")}function zQ(f,u){return f&&typeof f==="object"&&!Array.isArray(f)?f[u]:void 0}function G2(f,u,_="未知"){let y=zQ(f?.labels,u);return typeof y==="string"&&y.length>0?y:_}function BH(f){return G2(f,"providerGatewayVersion")}function rl(f){return G2(f,"providerGatewayUpgradePolicy")}function zH(f){return G2(f,"providerGatewayStartedAt","")}function wH(f){let u=zQ(f?.labels,"unideskCapabilities");if(typeof u==="string")return u.split(",").map((_)=>_.trim()).filter(Boolean);return Array.isArray(u)?u.filter((_)=>typeof _==="string"):[]}function DH(f,u){return wH(f).includes(u)}function GH(f,u){let _=zQ(f?.labels,u);return _===!0||_==="true"||_==="1"}function HS(f){if(!DH(f,"host.ssh"))return{tone:"fail",label:"不可用",detail:"未声明 host.ssh"};if(!GH(f,"hostSshConfigured"))return{tone:"warn",label:"未配置",detail:"缺少 SSH 环境变量"};if(!GH(f,"hostSshKeyPresent"))return{tone:"warn",label:"缺 key",detail:"私钥未挂载"};return{tone:"ok",label:"可用",detail:G2(f,"hostSshTarget","host.ssh ready")}}function ES(f){if(!DH(f,"provider.upgrade"))return{tone:"fail",label:"不可用",detail:"未声明 provider.upgrade"};let u=rl(f);if(u!=="always-enabled")return{tone:"warn",label:"待确认",detail:`策略 ${u}`};return{tone:"ok",label:"可用",detail:"always-enabled"}}function GQ(f){let u=typeof f==="string"&&f.length>0?f:"未知";if(u==="未知")return"版本未知";return u.startsWith("v")?u:`v${u}`}function TH(f){return f?.payload&&typeof f.payload==="object"&&!Array.isArray(f.payload)?f.payload:{}}function K2(f){return f?.result&&typeof f.result==="object"&&!Array.isArray(f.result)?f.result:{}}function z2(f){let u=TH(f),_=K2(f);return(u.mode??_.mode)==="schedule"?"schedule":"plan"}function VS(f){let u=TH(f).source;return typeof u==="string"&&u.length>0?u:"unknown"}function OS(f){let u=K2(f),_=u.plan&&typeof u.plan==="object"&&!Array.isArray(u.plan)?u.plan:{},y=u.policy??_.policy;return typeof y==="string"&&y.length>0?y:"--"}function MH(f){let u=K2(f),_=u.plan&&typeof u.plan==="object"&&!Array.isArray(u.plan)?u.plan:{},y=u.targetProviderGatewayVersion??u.providerGatewayVersion??_.targetProviderGatewayVersion??_.providerGatewayVersion;return typeof y==="string"&&y.length>0?GQ(y):"版本未知"}function SH(f){if(String(f?.status||"").toLowerCase()==="failed")return LH(f);if(E$(f))return"等待 provider 回传升级终态";let _=K2(f);if(typeof _.updaterContainerId==="string"&&_.updaterContainerId.length>0)return`updater ${_.updaterContainerId.slice(0,18)}`;if(typeof _.message==="string"&&_.message.length>0)return _.message;if(_.plan)return"升级计划已生成";return"无升级结果摘要"}function rH(f,u){return f.filter((_)=>_?.providerId===u&&_?.command==="provider.upgrade").sort((_,y)=>(Z$(y.updatedAt)??0)-(Z$(_.updatedAt)??0))}function XS(f){return f.find((u)=>z2(u)==="schedule")||f[0]||null}function PH(f){return f?.runtime&&typeof f.runtime==="object"&&!Array.isArray(f.runtime)?f.runtime:{}}function KH(f){return f?.backend&&typeof f.backend==="object"&&!Array.isArray(f.backend)?f.backend:{}}function NS(f){return f?.repository&&typeof f.repository==="object"&&!Array.isArray(f.repository)?f.repository:{}}function V0({status:f,children:u}){let _=String(f||"unknown").toLowerCase();return Q("span",{className:`status-badge ${_}`},u||f||"unknown")}function f0({label:f,value:u,hint:_,tone:y,onClick:$,testId:l}){let j=typeof $==="function";return Q("article",{className:`metric-card ${y||""} ${j?"clickable":""}`,role:j?"button":void 0,tabIndex:j?0:void 0,"data-testid":l,onClick:$,onKeyDown:j?(J)=>{if(J.key==="Enter"||J.key===" ")J.preventDefault(),$()}:void 0},Q("div",{className:"metric-label"},f),Q("div",{className:"metric-value"},u),Q("div",{className:"metric-hint"},_))}function kf({title:f,eyebrow:u,actions:_,children:y,className:$}){return Q("section",{className:`panel ${$||""}`},Q("div",{className:"panel-head"},Q("div",null,u?Q("p",{className:"panel-eyebrow"},u):null,Q("h2",null,f)),_?Q("div",{className:"panel-actions"},_):null),Q("div",{className:"panel-body"},y))}function k0({title:f,data:u,onOpen:_,testId:y}){let[$,l]=hf(!1),j=u&&typeof u==="object"&&typeof u._loadRaw==="function"?u._loadRaw:null;async function J(){if(!j){_(f,u);return}l(!0);try{_(f,await j())}catch(F){_(f,{ok:!1,error:Mf(F,"读取原始 JSON 失败"),fallback:u})}finally{l(!1)}}return Q("button",{type:"button",className:"ghost-btn","data-testid":y,disabled:$,onClick:()=>void J()},$?"读取中":"查看原始JSON")}function LS({raw:f,onClose:u}){if(!f)return null;return Q("div",{className:"modal-backdrop",role:"presentation"},Q("section",{className:"raw-dialog",role:"dialog","aria-modal":"true","aria-label":f.title},Q("div",{className:"raw-dialog-head"},Q("h2",null,f.title),Q("button",{type:"button",className:"ghost-btn",onClick:u},"关闭")),Q("pre",{className:"raw-json","data-testid":"raw-json"},JSON.stringify(f.data,null,2))))}function CH({labels:f,limit:u=8}){let _=YH(f).slice(0,u);if(_.length===0)return Q("span",{className:"muted"},"无标签");return Q("div",{className:"chip-row"},_.map(([y,$])=>Q("span",{key:y,className:"data-chip"},Q("b",null,y),Q("span",null,dy($)))))}function q$({node:f}){let u=BH(f);return Q("span",{className:`version-chip ${u==="未知"?"unknown":""}`,"data-testid":`gateway-version-${N1(f?.providerId||"unknown")}`},GQ(u))}function ZH({title:f,state:u,testId:_}){return Q("span",{className:`capability-badge ${u.tone}`,title:u.detail,"data-testid":_},Q("b",null,f),Q("strong",null,u.label),Q("small",null,u.detail))}function KQ({node:f}){let u=N1(f?.providerId||"unknown");return Q("div",{className:"node-availability-strip"},Q(ZH,{title:"SSH 透传",state:HS(f),testId:`ssh-availability-${u}`}),Q(ZH,{title:"远程更新",state:ES(f),testId:`upgrade-availability-${u}`}))}function ey({data:f,empty:u="无数据"}){if(f===null||f===void 0)return Q("span",{className:"muted"},u);if(typeof f!=="object")return Q("span",{className:"summary-value"},dy(f));if(Array.isArray(f))return Q("span",{className:"summary-value"},`${f.length} 项列表`);let _=Object.entries(f).slice(0,5);if(_.length===0)return Q("span",{className:"muted"},u);return Q("div",{className:"summary-grid"},_.map(([y,$])=>Q("span",{key:y,className:"summary-item"},Q("b",null,y),Q("span",null,qS(y,$)))))}function l0({title:f,text:u}){return Q("div",{className:"empty-state"},Q("strong",null,f),Q("span",null,u))}function YS({onLogin:f}){let[u,_]=hf(tf.authUsername||"admin"),[y,$]=hf(""),[l,j]=hf(""),[J,F]=hf(!1);async function A(U){U.preventDefault(),F(!0),j("");try{let z=await wf("/login",{method:"POST",body:JSON.stringify({username:u,password:y})});f(z)}catch(z){j(Mf(z,"登录失败"))}finally{F(!1)}}return Q("main",{className:"login-screen","data-testid":"login-screen"},Q("section",{className:"login-card"},Q("div",{className:"login-brand"},Q("span",{className:"brand-mark"},"UD"),Q("div",null,Q("h1",null,"UniDesk"),Q("p",null,"Control Plane Login"))),Q("form",{className:"login-form",onSubmit:A},Q("label",null,"账号",Q("input",{name:"username",autoComplete:"username",value:u,onChange:(U)=>_(U.target.value)})),Q("label",null,"密码",Q("input",{name:"password",type:"password",autoComplete:"current-password",value:y,onChange:(U)=>$(U.target.value)})),Q(H0,{error:l}),Q("button",{type:"submit",disabled:J},J?"登录中":"登录")),Q("div",{className:"login-note"},"默认账号由 config.json 注入;公网入口只暴露前端登录面。")))}function BS({connection:f,lastRefresh:u,onRefresh:_,onLogout:y,session:$,clock:l,activeStatusItems:j=[]}){let J=[{key:"core",label:"核心",value:f.text,tone:f.ok?"ok":"fail",testId:"conn-text"},...Array.isArray(j)?j:[],{key:"refresh",label:"刷新",value:u?W2(u):"未刷新"},{key:"clock",label:"时间",value:W2(l)},{key:"user",label:"用户",value:$?.user?.username||"--",tone:"user"}];return Q("header",{className:"topbar"},Q("div",null,Q("p",{className:"eyebrow"},"Distributed Work Platform"),Q("h1",null,"UniDesk 控制平面")),Q(UH,{className:"global-top-status",title:"状态",items:J,actions:[Q("button",{key:"refresh",type:"button",className:"ghost-btn",onClick:_},"刷新"),Q("button",{key:"logout",type:"button",className:"ghost-btn danger",onClick:y},"退出")]}))}function wS({activeModule:f,activeTabs:u,onNavigate:_,collapsed:y,onToggle:$}){return Q("aside",{className:`rail ${y?"collapsed":""}`,"aria-label":"主模块"},Q("div",{className:"brand"},Q("span",{className:"brand-mark"},"UD"),Q("span",{className:"brand-text"},"UniDesk"),Q("button",{type:"button",className:"rail-toggle",onClick:$,"aria-label":y?"展开左侧边栏":"收起左侧边栏","data-testid":"rail-toggle"},y?"»":"«")),c4.map((l)=>Q("button",{key:l.id,type:"button",className:`module ${f===l.id?"active":""}`,onClick:()=>_(l.id,u[l.id]||m3[l.id]||l.tabs[0]?.id||""),title:l.label,"data-route":c6(mu,l.id,u[l.id]||m3[l.id]||l.tabs[0]?.id||"")},Q("span",{className:"module-code"},l.code),Q("span",null,l.label))))}function DS({module:f,activeTab:u,onNavigate:_}){return Q("nav",{className:"tabs","aria-label":`${f.label} 子功能`},f.tabs.map((y)=>Q("button",{key:y.id,type:"button",className:`tab ${u===y.id?"active":""}`,onClick:()=>_(f.id,y.id),"data-route":c6(mu,f.id,y.id)},y.label)))}function TS({data:f,onRaw:u,onNavigate:_}){let y=f.overview||{},$=f.nodes.filter((A)=>A.status==="online"),l=f.pendingTasks||f.tasks.filter(E$),j=y.pendingTaskCount??l.length,J=f.tasks.slice(0,5),F=y.pgdata||{};return Q("div",{className:"page-grid overview-grid","data-testid":"overview-page"},Q(kf,{title:"核心指标",eyebrow:"Control"},Q("div",{className:"metric-grid"},Q(f0,{label:"数据库",value:y.dbReady?"READY":"WAIT",hint:"PostgreSQL internal network",tone:y.dbReady?"ok":"warn"}),Q(f0,{label:"PGDATA",value:Ju(F.databaseBytes),hint:`${F.volumeName||"unidesk_pgdata_10gb"} / ${F.databasePretty||"--"}`,tone:"ok",testId:"pgdata-usage-card"}),Q(f0,{label:"在线节点",value:y.onlineNodeCount??0,hint:`${y.nodeCount??0} registered`,tone:"ok"}),Q(f0,{label:"WebSocket",value:y.activeSocketCount??0,hint:"Provider ingress sockets"}),Q(f0,{label:"待处理任务",value:j,hint:j>0?"点击查看具体任务":`timeout ${H$(Math.floor((y.taskPendingTimeoutMs??0)/1000))}`,tone:j>0?"warn":"ok",onClick:()=>_("tasks","pending"),testId:"pending-task-card"}))),Q(kf,{title:"本机 Provider",eyebrow:"Self Connected"},$.length===0?Q(l0,{title:"暂无在线节点",text:"provider-gateway 未完成自接入"}):Q("div",{className:"node-card-list"},$.slice(0,4).map((A)=>Q(MS,{key:A.providerId,node:A,onRaw:u})))),Q(kf,{title:"待处理任务明细",eyebrow:`${j} Pending`,actions:Q("button",{type:"button",className:"ghost-btn",onClick:()=>_("tasks","pending"),"data-testid":"pending-task-detail-link"},"进入任务调度")},l.length===0?Q(l0,{title:"当前无待处理",text:"queued / dispatched / running 超时后会自动转为 failed,避免总览长期卡住"}):Q("div",{className:"compact-list"},l.slice(0,5).map((A)=>Q(VH,{key:A.id,task:A,onRaw:u})))),Q(kf,{title:"最近任务",eyebrow:"Dispatch"},J.length===0?Q(l0,{title:"暂无任务",text:"可以在任务调度模块发起 docker.ps 或 echo"}):Q("div",{className:"compact-list"},J.map((A)=>Q(VH,{key:A.id,task:A,onRaw:u})))))}function MS({node:f,onRaw:u}){return Q("article",{className:"node-card"},Q("div",{className:"node-card-head"},Q("div",null,Q("strong",null,f.name),Q("code",null,f.providerId)),Q(V0,{status:f.status})),Q("div",{className:"node-version-line"},Q(q$,{node:f}),Q("span",null,`升级策略 ${rl(f)}`)),Q(KQ,{node:f}),Q(CH,{labels:f.labels,limit:6}),Q("div",{className:"node-card-foot"},Q("span",null,`心跳 ${m0(f.lastHeartbeat)}`),Q(k0,{title:`Provider ${f.providerId}`,data:f,onOpen:u,testId:`raw-node-${N1(f.providerId)}`})))}function SS({events:f,onRaw:u}){return Q(kf,{title:"事件摘要",eyebrow:"Latest 100"},f.length===0?Q(l0,{title:"暂无事件",text:"Provider 注册、心跳超时和任务状态会写入事件流"}):Q("div",{className:"table-wrap"},Q("table",null,Q("thead",null,Q("tr",null,Q("th",null,"ID"),Q("th",null,"类型"),Q("th",null,"来源"),Q("th",null,"摘要"),Q("th",null,"时间"),Q("th",null,"操作"))),Q("tbody",null,f.map((_)=>Q("tr",{key:_.id},Q("td",null,Q("code",null,_.id)),Q("td",null,Q(V0,{status:_.type},_.type)),Q("td",null,Q("code",null,_.source)),Q("td",null,Q(ey,{data:_.payload})),Q("td",null,m0(_.createdAt)),Q("td",null,Q(k0,{title:`Event ${_.id}`,data:_,onOpen:u}))))))))}function rS({logs:f,onRaw:u}){return Q(kf,{title:"服务日志",eyebrow:"Core Recent"},f.length===0?Q(l0,{title:"暂无日志",text:"backend-core 内存日志会在请求和 provider 事件后出现"}):Q("div",{className:"log-list"},f.slice(-80).reverse().map((_,y)=>Q("article",{key:y,className:`log-row ${_.level||"info"}`},Q("span",null,m0(_.ts)),Q("b",null,_.level||"info"),Q("strong",null,_.message||"log"),Q(ey,{data:_.data,empty:"无附加字段"}),Q(k0,{title:`Log ${_.message||y}`,data:_,onOpen:u})))))}function PS({nodes:f,onRaw:u}){return Q(kf,{title:"节点清单",eyebrow:`${f.length} Providers`},f.length===0?Q(l0,{title:"暂无 Provider 节点",text:"确认 provider-gateway 已连接 provider ingress"}):Q("div",{className:"table-wrap"},Q("table",{className:"node-list-table"},Q("thead",null,Q("tr",null,Q("th",null,"状态"),Q("th",null,"Provider"),Q("th",null,"网关版本"),Q("th",null,"运维可用性"),Q("th",null,"资源标签"),Q("th",null,"连接时间"),Q("th",null,"最后心跳"),Q("th",null,"操作"))),Q("tbody",null,f.map((_)=>Q("tr",{key:_.providerId},Q("td",null,Q(V0,{status:_.status})),Q("td",null,Q("strong",null,_.name),Q("code",null,_.providerId)),Q("td",null,Q("div",{className:"gateway-cell"},Q(q$,{node:_}),Q("span",null,rl(_)))),Q("td",null,Q(KQ,{node:_})),Q("td",null,Q(CH,{labels:_.labels,limit:5})),Q("td",null,m0(_.connectedAt)),Q("td",null,m0(_.lastHeartbeat)),Q("td",null,Q(k0,{title:`Provider ${_.providerId}`,data:_,onOpen:u,testId:`raw-node-table-${N1(_.providerId)}`}))))))))}function CS({nodes:f}){let u=Cl(()=>{let _=[];for(let y of f)for(let[$,l]of YH(y.labels))_.push({providerId:y.providerId,name:y.name,key:$,value:l});return _},[f]);return Q(kf,{title:"资源标签",eyebrow:"Structured Labels"},u.length===0?Q(l0,{title:"暂无标签",text:"provider-gateway 注册消息会同步资源标签"}):Q("div",{className:"label-matrix"},u.map((_)=>Q("article",{key:`${_.providerId}-${_.key}`,className:"label-card"},Q("span",null,_.key),Q("strong",null,dy(_.value)),Q("code",null,_.providerId)))))}function RS({nodes:f}){return Q(kf,{title:"心跳状态",eyebrow:"Provider Liveness"},f.length===0?Q(l0,{title:"无心跳",text:"等待 provider 注册和 heartbeat"}):Q("div",{className:"heartbeat-list"},f.map((u)=>Q("article",{key:u.providerId,className:"heartbeat-row"},Q("span",{className:`pulse ${u.status}`}),Q("div",null,Q("strong",null,u.name),Q("code",null,u.providerId)),Q("div",null,Q("span",null,"connected"),Q("b",null,m0(u.connectedAt))),Q("div",null,Q("span",null,"last heartbeat"),Q("b",null,m0(u.lastHeartbeat)))))))}function xS({nodes:f,systemStatuses:u,tasks:_,onRaw:y,refresh:$}){let[l,j]=hf(""),J=Cl(()=>f.map((E)=>{let O=u.find((G)=>G.providerId===E.providerId);return{...E,systemCurrent:O?.current||null,systemHistory:O?.history||[],systemUpdatedAt:O?.updatedAt||null}}),[f,u]),F=J.find((E)=>E.providerId===l)||J[0]||null;if(p1(()=>{if(!l&&J[0])j(J[0].providerId)},[J.length,l]),!F)return Q(l0,{title:"暂无资源监控",text:"等待 provider 上报 CPU、内存和硬盘指标"});let A=F.systemCurrent,U=F.systemHistory||[],z=A?.cpu||{},W=A?.memory||{},K=A?.disk||{},q=U.length>0?U:A?[{at:A.collectedAt,cpuPercent:Tf(z.percent),memoryPercent:Tf(W.percent),diskPercent:Tf(K.percent)}]:[];return Q("div",{className:"monitor-page","data-testid":"node-monitor-page"},Q("div",{className:"docker-node-strip"},J.map((E)=>Q("button",{key:E.providerId,type:"button",className:`docker-node-tile ${F.providerId===E.providerId?"active":""}`,onClick:()=>j(E.providerId)},Q("span",{className:`pulse ${E.status}`}),Q("strong",null,E.name),Q("code",null,E.providerId),Q("span",null,E.systemCurrent?`CPU ${$y(E.systemCurrent.cpu?.percent)} / MEM ${$y(E.systemCurrent.memory?.percent)}`:"等待指标")))),Q("div",{className:"monitor-layout"},Q(kf,{title:"任务管理器视图",eyebrow:F.name,className:"monitor-main-panel",actions:A?Q(k0,{title:`System ${F.providerId}`,data:{current:A,history:U},onOpen:y}):null},!A?Q(l0,{title:"系统指标未上报",text:"provider-gateway 会周期性采集 /proc 与 df,并保存历史曲线"}):Q("div",null,Q("div",{className:"monitor-hero"},Q("div",null,Q("p",{className:"panel-eyebrow"},"Node Performance"),Q("h3",null,F.name),Q("div",{className:"docker-meta"},Q("span",null,`${z.cores||0} CPU cores`),Q("span",null,`load ${Tf(z.load1).toFixed(2)} / ${Tf(z.load5).toFixed(2)} / ${Tf(z.load15).toFixed(2)}`),Q("span",null,`memory actual ${Ju(W.usedBytes)} / ${Ju(W.totalBytes)}`),Q("span",null,`disk ${Ju(K.usedBytes)} / ${Ju(K.totalBytes)}`))),Q(V0,{status:A.ok?"online":"warn"},A.ok?"METRICS READY":"METRICS DEGRADED")),Q("div",{className:"monitor-chart-grid"},Q(AQ,{title:"CPU",metricKey:"cpuPercent",current:z.percent,points:q,detail:`${z.cores||0} cores / load ${Tf(z.load1).toFixed(2)}`,tone:"cpu",testId:"metric-chart-cpu"}),Q(AQ,{title:"Memory",metricKey:"memoryPercent",current:W.percent,points:q,detail:`${Ju(W.usedBytes)} actual / ${Ju(W.cacheBytes)} cache excluded`,tone:"memory",testId:"metric-chart-memory"}),Q(AQ,{title:"Disk",metricKey:"diskPercent",current:K.percent,points:q,detail:`${K.path||"/"} mounted ${K.mount||"--"}`,tone:"disk",testId:"metric-chart-disk"})),Q("div",{className:"monitor-summary-grid"},Q(f0,{label:"CPU 当前",value:$y(z.percent),hint:`history ${q.length} samples`,tone:"ok"}),Q(f0,{label:"实际内存",value:Ju(W.usedBytes),hint:`${$y(W.percent)} 不含缓存`}),Q(f0,{label:"硬盘已用",value:Ju(K.usedBytes),hint:$y(K.percent)}),Q(f0,{label:"更新时间",value:m0(F.systemUpdatedAt||A.collectedAt),hint:F.providerId})),Q(vS,{current:A,onRaw:y}))),Q("div",{className:"monitor-side-stack"},Q(iS,{provider:F,refresh:$,onRaw:y}),Q(gS,{provider:F,tasks:_,onRaw:y,limit:5}),Q(kf,{title:"采样说明",eyebrow:"Retention"},Q("div",{className:"monitor-note-list"},Q("article",null,Q("b",null,"CPU"),Q("span",null,"从 /proc/stat 计算相邻采样差值,首个采样用 load/cores 近似")),Q("article",null,Q("b",null,"Memory"),Q("span",null,"实际内存 = MemTotal - MemFree - Buffers - Cached - SReclaimable + Shmem,不把 page cache / buffer 计入占用")),Q("article",null,Q("b",null,"Disk"),Q("span",null,"使用 df -PB1 对配置路径采样,默认监控根文件系统")),Q("article",null,Q("b",null,"Process"),Q("span",null,"从 /proc/[pid] 采集进程 CPU、实际内存 RSS、线程数和磁盘 I/O 速率;表格默认按内存占用降序")))))))}function qH(f,u){if(u==="memory")return Tf(f.rssBytes);if(u==="cpu")return Tf(f.cpuPercent);if(u==="disk")return Tf(f.readBytesPerSecond)+Tf(f.writeBytesPerSecond);if(u==="pid")return Tf(f.pid);if(u==="threads")return Tf(f.threads);if(u==="runtime")return Tf(f.elapsedSeconds);if(u==="user")return String(f.user||"");return String(f.name||f.command||"")}function HH({value:f,label:u,tone:_}){let y=Math.max(1,Math.min(100,Tf(f)));return Q("div",{className:`process-meter ${_||""}`},Q("span",{style:{width:`${y}%`}}),Q("b",null,u))}function vS({current:f,onRaw:u}){let[_,y]=hf({key:"memory",direction:"desc"}),$=f?.processSummary&&typeof f.processSummary==="object"?f.processSummary:{},l=Array.isArray(f?.processes)?f.processes:[],j=Cl(()=>{let F=_.direction==="asc"?1:-1;return[...l].sort((A,U)=>{let z=qH(A,_.key),W=qH(U,_.key);if(typeof z==="string"||typeof W==="string")return String(z).localeCompare(String(W),"zh-CN")*F;return(z-W)*F||Tf(A.pid)-Tf(U.pid)})},[l,_.key,_.direction]),J=(F,A)=>{let U=_.key===A,z=U?_.direction==="asc"?"ascending":"descending":"none";return Q("th",{"aria-sort":z},Q("button",{type:"button",className:`process-sort-button ${U?"active":""}`,"data-testid":`process-sort-${A}`,onClick:()=>y((W)=>({key:A,direction:W.key===A&&W.direction==="desc"?"asc":"desc"}))},F,Q("span",null,U?_.direction==="desc"?"↓":"↑":"↕")))};return Q("section",{className:"process-resource-panel","data-testid":"process-resource-panel"},Q("div",{className:"process-resource-head"},Q("div",null,Q("p",{className:"panel-eyebrow"},"Windows Resource Monitor Style"),Q("h3",null,"进程资源占用")),Q("div",{className:"process-resource-actions"},Q("span",{className:"data-chip"},"默认按内存排序"),Q("span",{className:"data-chip"},`${Tf($.visible,j.length)} / ${Tf($.total,j.length)} 进程`),Q(k0,{title:"Process Resource Snapshot",data:{processSummary:$,processes:l},onOpen:u,testId:"raw-process-resources"}))),j.length===0?Q(l0,{title:"暂无进程资源数据",text:"等待 provider-gateway 上报 /proc/[pid] 采样;旧版 provider 需要先升级到支持进程资源表的版本"}):Q("div",{className:"process-table-wrap"},Q("table",{className:"process-resource-table","data-testid":"process-resource-table"},Q("thead",null,Q("tr",null,J("进程","name"),J("PID","pid"),J("用户","user"),Q("th",null,"状态"),J("CPU","cpu"),J("内存","memory"),Q("th",null,"RSS"),J("磁盘 I/O","disk"),J("线程","threads"),J("运行时长","runtime"))),Q("tbody",null,j.map((F)=>{let A=Tf(F.readBytesPerSecond)+Tf(F.writeBytesPerSecond);return Q("tr",{key:`${F.pid}-${F.startedAt}`,"data-testid":`process-row-${N1(F.pid)}`,"data-memory-bytes":String(Tf(F.rssBytes)),"data-cpu-percent":String(Tf(F.cpuPercent)),"data-disk-bps":String(A),"data-pid":String(Tf(F.pid))},Q("td",null,Q("div",{className:"process-name-cell"},Q("strong",null,F.name||"--"),Q("span",{className:"process-command"},F.command||"--"))),Q("td",null,Q("code",null,F.pid||"--")),Q("td",null,F.user||`uid:${F.uid??"--"}`),Q("td",null,Q("span",{className:`process-state state-${N1(F.state||"unknown")}`},F.state||"?")),Q("td",null,Q(HH,{value:F.cpuPercent,label:ZS(F.cpuPercent),tone:"cpu"})),Q("td",null,Q(HH,{value:F.memoryPercent,label:$y(F.memoryPercent),tone:"memory"})),Q("td",null,Ju(F.rssBytes)),Q("td",null,Q("div",{className:"process-io-cell"},Q("strong",null,QQ(A)),Q("span",null,`R ${QQ(F.readBytesPerSecond)} / W ${QQ(F.writeBytesPerSecond)}`))),Q("td",null,F.threads||0),Q("td",null,H$(Tf(F.elapsedSeconds))))})))))}function AQ({title:f,metricKey:u,current:_,points:y,detail:$,tone:l,testId:j}){let J=y.map((W)=>Math.max(0,Math.min(100,Tf(W[u])))),F=J.length>1?J:[J[0]||0,J[0]||0],A=F.length<=1?100:100/(F.length-1),U=F.map((W,K)=>`${(K*A).toFixed(2)},${(46-W*0.42).toFixed(2)}`).join(" "),z=`0,48 ${U} 100,48`;return Q("article",{className:`metric-chart ${l}`,"data-testid":j},Q("div",{className:"metric-chart-head"},Q("div",null,Q("span",null,f),Q("strong",null,$y(_))),Q("code",null,`${y.length} pts`)),Q("svg",{viewBox:"0 0 100 48",preserveAspectRatio:"none",role:"img","aria-label":`${f} usage curve`},Q("polygon",{points:z}),Q("polyline",{points:U}),Q("line",{x1:"0",x2:"100",y1:"24",y2:"24"})),Q("div",{className:"metric-chart-foot"},Q("span",null,"0%"),Q("span",null,$),Q("span",null,"100%")))}function U_(f){return Array.isArray(f)?f:[]}function bS(f){let u=U_(f?.core?.requests?.componentSummary);return[...U_(f?.frontend?.requests?.componentSummary),...u].sort((y,$)=>Tf($.requestCount)-Tf(y.requestCount))}function hS(f){let u=U_(f?.core?.operations?.summary);return[...U_(f?.frontend?.operations?.summary),...u].sort((y,$)=>Tf($.count)-Tf(y.count))}function IS(f){let u=U_(f?.core?.requests?.recentFailures).map((y)=>({source:"backend",...y}));return[...U_(f?.frontend?.requests?.recentFailures).map((y)=>({source:"frontend",...y})),...u].sort((y,$)=>(Z$($.at)??0)-(Z$(y.at)??0)).slice(0,20)}function cS(f){let u=U_(f?.core?.operations?.recentSlowOperations);return[...U_(f?.frontend?.operations?.recentSlowOperations),...u].sort((y,$)=>Tf($.durationMs)-Tf(y.durationMs)).slice(0,20)}function pS(f){let u=performance.memory,_=Number(u?.usedJSHeapSize);if(Number.isFinite(_)&&_>0)return _;let y=Number(f?.appBundleBytes);if(Number.isFinite(y)&&y>0)return y;return Tf(f?.process?.heapUsedBytes)}function mS({points:f}){let u=U_(f),_=u.map((W)=>Tf(W.mb)),y=Math.max(1,..._),$=Math.max(0,Math.min(..._,0)),l=Math.max(1,y-$),j=u.length>1?u:[...u,...u],J=j.length<=1?100:100/(j.length-1),F=j.map((W,K)=>{let q=Tf(W.mb);return`${(K*J).toFixed(2)},${(48-(q-$)/l*42).toFixed(2)}`}).join(" "),A=`0,50 ${F} 100,50`,U=u.at(-1),z=u[0];return Q("article",{className:"performance-memory-card","data-testid":"performance-memory-chart"},Q("div",{className:"performance-memory-head"},Q("strong",null,`Bwebui: ${U?`${Tf(U.mb).toFixed(1)}MB`:"--"}`),Q("span",null,u.length>0?`${u.length} samples`:"等待采样")),Q("svg",{viewBox:"0 0 100 50",preserveAspectRatio:"none",role:"img","aria-label":"Bwebui memory trend"},Q("polygon",{points:A}),Q("polyline",{points:F}),Q("line",{x1:"0",x2:"100",y1:"25",y2:"25"})),Q("div",{className:"performance-axis-row"},Q("span",null,z?W2(new Date(z.at)):"--"),Q("span",null,"时间"),Q("span",null,U?W2(new Date(U.at)):"--")),Q("div",{className:"performance-axis-row"},Q("span",null,`${$.toFixed(1)}`),Q("span",null,"(MB)"),Q("span",null,`${y.toFixed(1)}`)))}function kS({onRaw:f}){let[u,_]=hf({core:null,frontend:null}),[y,$]=hf([]),[l,j]=hf(""),[J,F]=hf(!1),[A,U]=hf(null),[z,W]=hf(!1);async function K(){F(!0),j("");try{let[C,P]=await Promise.all([wf(`${tf.apiBaseUrl}/performance`,{cache:"no-store"}),wf(`${tf.apiBaseUrl}/frontend-performance`,{cache:"no-store"})]);_({core:C,frontend:P});let w=pS(P);$((r)=>[...r,{at:new Date().toISOString(),mb:w/1048576}].slice(-80))}catch(C){j(Mf(C,"性能指标加载失败"))}finally{F(!1)}}p1(()=>{K();let C=setInterval(()=>void K(),5000);return()=>clearInterval(C)},[]);async function q(){W(!0),j(""),U(null);try{let C=await wf(`${tf.apiBaseUrl}/codex-queue-load-test`,{method:"POST",body:JSON.stringify({targetMs:1000,timeoutMs:90000,url:tf.frontendPublicUrl||window.location.origin})});U(C),K()}catch(C){j(Mf(C,"Codex Queue Playwright 测量失败"))}finally{W(!1)}}let E=bS(u),O=IS(u),G=hS(u),H=cS(u),Z=u.core?.process||{},V=u.frontend?.process||{},L=u.core?.database?.codexQueueStorage||{},M=Tf(L.total),N=A?.result||{},D=Tf(N.wallMs,NaN),x=Tf(N.networkIdleMs,NaN),c=N.withinTarget===!0,v=z?"running":A===null?"idle":A.measurementOk===!0?c?"passed":"slow":"failed";return Q("div",{className:"performance-page","data-testid":"performance-page"},Q("div",{className:"performance-hero"},Q("div",null,Q("p",{className:"panel-eyebrow"},"Unified Performance"),Q("h2",null,"性能面板"),Q("p",null,"按组件统计 HTTP 请求、失败率、P95 延迟,并汇总 backend/frontend 内部操作耗时。")),Q("div",{className:"inline-actions"},Q("button",{type:"button",className:"ghost-btn",onClick:()=>void q(),disabled:z,"data-testid":"codex-queue-load-test-button"},z?"测试中...":"测试 Codex Queue 加载"),Q("button",{type:"button",className:"ghost-btn",onClick:()=>void K(),disabled:J,"data-testid":"performance-refresh-button"},J?"刷新中":"刷新"),Q(k0,{title:"Performance Snapshot",data:u,onOpen:f,testId:"raw-performance"}))),Q(H0,{error:l}),Q("div",{className:"performance-top-grid"},Q(mS,{points:y}),Q("div",{className:"performance-metric-stack"},Q(f0,{label:"backend RSS",value:Ju(Z.rssBytes),hint:`heap ${Ju(Z.heapUsedBytes)}`}),Q(f0,{label:"frontend RSS",value:Ju(V.rssBytes),hint:`bundle ${Ju(u.frontend?.appBundleBytes)}`}),Q(f0,{label:"Codex PG 任务",value:M||"--",hint:L.ok?"unidesk_codex_queue_tasks":"等待表初始化",tone:L.ok?"ok":"warn"}),Q(f0,{label:"请求样本",value:Tf(u.core?.requests?.sampleCount)+Tf(u.frontend?.requests?.sampleCount),hint:"rolling window 3000"}))),Q(kf,{title:"Codex Queue 加载基准",eyebrow:"Playwright / target <1s",className:"codex-load-test-panel",actions:Q("div",{className:"panel-actions"},Q("button",{type:"button",className:"primary-btn",onClick:()=>void q(),disabled:z,"data-testid":"codex-queue-load-test-panel-button"},z?"正在运行 Playwright...":"手动触发测试"),A?Q(k0,{title:"Codex Queue Load Test",data:A,onOpen:f,testId:"raw-codex-queue-load-test"}):null)},Q("div",{className:"codex-load-test-grid","data-testid":"codex-queue-load-test-result"},Q(f0,{label:"总耗时",value:z?"运行中":Number.isFinite(D)?pu(D):"--",hint:A===null?"点击按钮启动远端 Playwright":`目标 ${pu(N.targetMs||1000)} / ${N.url||"Codex Queue"}`,tone:v==="passed"?"ok":v==="failed"||v==="slow"?"warn":""}),Q(f0,{label:"判定",value:z?"RUNNING":v==="passed"?"PASS <1s":v==="slow"?"SLOW":v==="failed"?"FAILED":"--",hint:A?.measurementOk===!1?String(A.error||N.error||"measurement failed").slice(0,120):"导航开始 -> DOMContentLoaded -> data-load-state=complete",tone:v==="passed"?"ok":v==="idle"||v==="running"?"":"fail"}),Q(f0,{label:"Network idle",value:Number.isFinite(x)?pu(x):"--",hint:`DOMContentLoaded ${pu(N.domContentLoadedMs)} / ${N.networkIdleReached===!1?"未在 5s 内空闲":"已空闲"}`,tone:Number.isFinite(x)&&x<=1000?"ok":"warn"}),Q(f0,{label:"组件耗时",value:Number.isFinite(Tf(N.componentLoadMs,NaN))?pu(N.componentLoadMs):"--",hint:`queue ${pu(N.queueMs)} / detail ${pu(N.detailMs)}`,tone:Tf(N.componentLoadMs)>1000?"warn":"ok"}),Q(f0,{label:"Trace 规模",value:Number.isFinite(Tf(N.transcriptRows,NaN))?String(N.transcriptRows):"--",hint:`${N.visibleTaskCount??0} visible tasks / ${N.partial?"preview":"complete"}`})),z?Q("div",{className:"performance-empty-line"},"正在通过 main-server Host SSH 启动 Playwright,完成后会显示 wall time、组件耗时和最慢 API。"):null,A&&Array.isArray(N.slowestApi)&&N.slowestApi.length>0?Q("div",{className:"table-wrap performance-table-wrap compact codex-load-api-table"},Q("table",{className:"performance-table"},Q("thead",null,Q("tr",null,["API","状态","耗时"].map((C)=>Q("th",{key:C},C)))),Q("tbody",null,N.slowestApi.slice(0,5).map((C,P)=>Q("tr",{key:`${C.url}-${P}`},Q("td",null,Q("code",null,C.url)),Q("td",null,C.status),Q("td",null,pu(C.durationMs))))))):null),Q("div",{className:"performance-grid"},Q(kf,{title:"组件汇总",eyebrow:"Requests"},E.length===0?Q(l0,{title:"暂无请求样本",text:"刷新几次或打开页面后会自动形成组件统计"}):Q("div",{className:"table-wrap performance-table-wrap"},Q("table",{className:"performance-table"},Q("thead",null,Q("tr",null,["组件","请求数","失败数","失败率","平均延迟","P95"].map((C)=>Q("th",{key:C},C)))),Q("tbody",null,E.map((C)=>Q("tr",{key:C.component},Q("td",null,Q("code",null,C.component)),Q("td",null,C.requestCount),Q("td",null,C.failureCount),Q("td",null,$y(Tf(C.failureRate)*100)),Q("td",null,pu(C.averageLatencyMs)),Q("td",null,pu(C.p95LatencyMs)))))))),Q(kf,{title:"最近失败请求",eyebrow:"Failures"},O.length===0?Q("div",{className:"performance-empty-line"},"最近没有失败请求"):Q("div",{className:"table-wrap performance-table-wrap compact"},Q("table",{className:"performance-table"},Q("thead",null,Q("tr",null,["时间","来源","组件","状态","路径"].map((C)=>Q("th",{key:C},C)))),Q("tbody",null,O.map((C,P)=>Q("tr",{key:`${C.at}-${P}`},Q("td",null,m0(C.at)),Q("td",null,C.source),Q("td",null,Q("code",null,C.component)),Q("td",null,Q(V0,{status:"failed"},C.status)),Q("td",null,Q("code",null,C.path)))))))),Q(kf,{title:"内部操作汇总",eyebrow:"Operations"},G.length===0?Q(l0,{title:"暂无内部操作样本",text:"API 查询和代理请求会自动记录内部操作耗时"}):Q("div",{className:"table-wrap performance-table-wrap"},Q("table",{className:"performance-table"},Q("thead",null,Q("tr",null,["服务","操作","次数","平均延迟","P95"].map((C)=>Q("th",{key:C},C)))),Q("tbody",null,G.map((C)=>Q("tr",{key:`${C.service}-${C.operation}`},Q("td",null,C.service),Q("td",null,Q("code",null,C.operation)),Q("td",null,C.count),Q("td",null,pu(C.averageLatencyMs)),Q("td",null,pu(C.p95LatencyMs)))))))),Q(kf,{title:"最近慢操作",eyebrow:"Slowest"},H.length===0?Q(l0,{title:"暂无慢操作",text:"后端会记录最近窗口内耗时最高的内部操作"}):Q("div",{className:"table-wrap performance-table-wrap"},Q("table",{className:"performance-table"},Q("thead",null,Q("tr",null,["时间","操作","耗时","结果","细节"].map((C)=>Q("th",{key:C},C)))),Q("tbody",null,H.map((C,P)=>Q("tr",{key:`${C.at}-${C.operation}-${P}`},Q("td",null,m0(C.at)),Q("td",null,Q("code",null,C.operation)),Q("td",null,pu(C.durationMs)),Q("td",null,C.ok?"成功":"失败"),Q("td",null,C.detail||"-")))))))))}function iS({provider:f,refresh:u,onRaw:_}){let[y,$]=hf(""),[l,j]=hf(null),[J,F]=hf("");async function A(U){$(U),F("");try{let z=await wf(`${tf.apiBaseUrl}/dispatch`,{method:"POST",body:JSON.stringify({providerId:f.providerId,command:"provider.upgrade",payload:{mode:U,source:"frontend-resource-monitor",requestedAt:new Date().toISOString()}})});j({mode:U,...z}),await u()}catch(z){F(Mf(z,"升级命令下发失败"))}finally{$("")}}return Q(kf,{title:"Provider Gateway 升级",eyebrow:"Remote Control"},Q("div",{className:"upgrade-control","data-testid":"provider-upgrade-control"},Q("p",null,"通过 UniDesk WebSocket 向当前计算节点下发 provider.upgrade;预检只生成升级计划,执行升级会调度节点本地 updater 容器。"),Q("div",{className:"upgrade-target-line"},Q("span",null,"指定 Provider"),Q("code",null,f.providerId),Q(q$,{node:f})),Q("div",{className:"upgrade-actions"},Q("button",{type:"button",className:"ghost-btn",disabled:Boolean(y),onClick:()=>A("plan"),"data-testid":"upgrade-plan-button"},y==="plan"?"预检中":"预检升级"),Q("button",{type:"button",className:"ghost-btn danger",disabled:Boolean(y),onClick:()=>A("schedule"),"data-testid":"upgrade-schedule-button"},y==="schedule"?"调度中":"执行升级")),Q(H0,{error:J}),l?Q("div",{className:"upgrade-result"},Q(V0,{status:l.status||"queued"},l.status||"queued"),Q("span",null,`${l.mode==="schedule"?"执行升级":"预检升级"} 已下发`),Q("span",null,`指定版本 ${GQ(BH(f))}`),Q("code",null,l.taskId||"--"),Q(k0,{title:"Provider Upgrade Dispatch",data:l,onOpen:_})):Q("span",{className:"muted"},"升级任务结果会进入任务历史;执行升级可能导致 provider 短暂重连。")))}function RH({records:f,onRaw:u,compact:_=!1}){if(f.length===0)return Q(l0,{title:"暂无远程更新记录",text:"该节点还没有 provider.upgrade 任务;执行预检或升级后会在这里形成结构化记录"});return Q("div",{className:`upgrade-record-table-wrap table-wrap ${_?"compact":""}`},Q("table",{className:"upgrade-record-table"},Q("thead",null,Q("tr",null,Q("th",null,"状态"),Q("th",null,"模式"),Q("th",null,"任务"),Q("th",null,"来源"),Q("th",null,"耗时"),Q("th",null,"策略"),Q("th",null,"Gateway 版本"),Q("th",null,"结果记录"),Q("th",null,"更新时间"),Q("th",null,"操作"))),Q("tbody",null,f.map((y)=>Q("tr",{key:y.id,"data-testid":`gateway-upgrade-record-${N1(y.id)}`},Q("td",null,Q(V0,{status:y.status})),Q("td",null,Q("span",{className:`mode-chip ${z2(y)}`},z2(y)==="schedule"?"执行升级":"预检")),Q("td",null,Q("strong",null,"provider.upgrade"),Q("code",null,y.id)),Q("td",null,VS(y)),Q("td",null,Q(vH,{task:y})),Q("td",null,OS(y)),Q("td",null,Q("span",{className:"version-chip"},MH(y))),Q("td",null,Q("span",{className:`upgrade-outcome ${String(y.status||"").toLowerCase()}`},SH(y))),Q("td",null,m0(y.updatedAt)),Q("td",null,Q(k0,{title:`Provider Upgrade Task ${y.id}`,data:Rl(y),onOpen:u})))))))}function gS({provider:f,tasks:u,onRaw:_,limit:y=5}){let $=rH(u,f.providerId).slice(0,y);return Q(kf,{title:"远程更新记录",eyebrow:f.providerId,actions:Q(q$,{node:f}),className:"provider-upgrade-records-panel"},Q("div",{"data-testid":`provider-upgrade-records-${N1(f.providerId)}`},Q(RH,{records:$,onRaw:_,compact:!0})))}function nS({nodes:f,tasks:u,onRaw:_}){let y=Cl(()=>f.map((l)=>{let j=rH(u,l.providerId);return{node:l,records:j,latest:XS(j),capabilities:wH(l)}}),[f,u]),$=y.reduce((l,j)=>l+j.records.length,0);return Q("div",{className:"gateway-page","data-testid":"gateway-version-page"},Q(kf,{title:"Provider Gateway 版本",eyebrow:`${f.length} Providers / ${$} 更新记录`},f.length===0?Q(l0,{title:"暂无 Provider 节点",text:"等待 provider-gateway 注册后显示版本号和升级记录"}):Q("div",{className:"table-wrap gateway-version-table-wrap"},Q("table",{className:"gateway-version-table"},Q("thead",null,Q("tr",null,Q("th",null,"状态"),Q("th",null,"Provider"),Q("th",null,"Gateway 版本"),Q("th",null,"升级策略"),Q("th",null,"运维可用性"),Q("th",null,"运行时间"),Q("th",null,"能力"),Q("th",null,"最近远程更新"),Q("th",null,"操作"))),Q("tbody",null,y.map((l)=>Q("tr",{key:l.node.providerId},Q("td",null,Q(V0,{status:l.node.status})),Q("td",null,Q("strong",null,l.node.name),Q("code",null,l.node.providerId)),Q("td",null,Q(q$,{node:l.node})),Q("td",null,rl(l.node)),Q("td",null,Q(KQ,{node:l.node})),Q("td",null,zH(l.node)?m0(zH(l.node)):"待新版上报"),Q("td",null,Q("div",{className:"capability-row"},l.capabilities.length===0?Q("span",{className:"muted"},"未声明"):l.capabilities.slice(0,5).map((j)=>Q("span",{key:j,className:"data-chip"},j)))),Q("td",null,l.latest?Q("div",{className:"latest-upgrade-cell"},Q(V0,{status:l.latest.status}),Q("span",null,`${z2(l.latest)==="schedule"?"执行升级":"预检"} / ${m0(l.latest.updatedAt)}`),Q("small",null,`Gateway ${MH(l.latest)}`),Q("small",null,SH(l.latest))):Q("span",{className:"muted"},"暂无记录")),Q("td",null,Q(k0,{title:`Provider ${l.node.providerId}`,data:l.node,onOpen:_})))))))),Q(kf,{title:"远程更新记录",eyebrow:"Structured provider.upgrade records"},f.length===0?Q(l0,{title:"暂无记录",text:"没有 provider 节点时不会生成远程更新记录"}):Q("div",{className:"gateway-record-grid"},y.map((l)=>Q("article",{key:l.node.providerId,className:"gateway-record-card","data-testid":`gateway-records-${N1(l.node.providerId)}`},Q("div",{className:"gateway-record-head"},Q("div",null,Q("strong",null,l.node.name),Q("code",null,l.node.providerId)),Q(q$,{node:l.node})),Q("div",{className:"gateway-record-meta"},Q("span",null,`心跳 ${m0(l.node.lastHeartbeat)}`),Q("span",null,`策略 ${rl(l.node)}`),Q("span",null,`${l.records.length} 条记录`)),Q(RH,{records:l.records.slice(0,8),onRaw:_,compact:!0}))))))}function tS(f){if(f==="running")return"online";if(f==="paused"||f==="restarting")return"warn";if(f==="exited"||f==="dead")return"offline";return"internal"}function xH(f){return/^[a-f0-9]{48,64}$/i.test(f)}function Sl(f){let u=String(f?.name||""),_=String(f?.labels||"");return u==="unidesk_pgdata_10gb"||_.includes("com.docker.compose.volume=unidesk_pgdata_10gb")||u.toLowerCase().includes("pgdata")}function EH(f){let u=String(f?.name||""),_=String(f?.labels||"");if(Sl(f))return 0;if(_.includes("com.docker.compose.project=unidesk"))return 1;if(!xH(u))return 2;return 3}function sS(f){return[...f].sort((u,_)=>{let y=EH(u)-EH(_);if(y!==0)return y;return String(u.name||"").localeCompare(String(_.name||""))})}function oS({nodes:f,dockerStatuses:u,onRaw:_}){let[y,$]=hf(""),l=Cl(()=>f.map((H)=>{let Z=u.find((V)=>V.providerId===H.providerId);return{...H,dockerStatus:Z?.dockerStatus||null,dockerUpdatedAt:Z?.updatedAt||null}}),[f,u]),j=l.find((H)=>H.providerId===y)||l[0]||null;if(p1(()=>{if(!y&&l[0])$(l[0].providerId)},[l.length,y]),!j)return Q(l0,{title:"暂无 Docker 节点",text:"等待 provider 上报 Docker daemon 状态"});let J=j.dockerStatus,F=j.providerId==="main-server",A=J?.counts||{},U=J?.daemon||{},z=J?.containers||[],W=J?.images||[],K=sS(J?.volumes||[]),q=F?K.find(Sl):null,E=J?.networks||[],O=z.filter((H)=>H.state==="running"),G=z.filter((H)=>H.state!=="running");return Q("div",{className:"docker-page","data-testid":"docker-status-page"},Q("div",{className:"docker-node-strip"},l.map((H)=>Q("button",{key:H.providerId,type:"button",className:`docker-node-tile ${j.providerId===H.providerId?"active":""}`,onClick:()=>$(H.providerId)},Q("span",{className:`pulse ${H.status}`}),Q("strong",null,H.name),Q("code",null,H.providerId),Q("span",null,H.dockerStatus?`Docker ${H.dockerStatus.ok?"ready":"degraded"}`:"等待上报")))),Q("div",{className:"docker-layout"},Q(kf,{title:"Docker Desktop 视图",eyebrow:j.name,className:"docker-main-panel",actions:J?Q(k0,{title:`Docker ${j.providerId}`,data:J,onOpen:_}):null},!J?Q(l0,{title:"Docker 状态未上报",text:"provider-gateway 会在连接后周期性采集 docker info / ps / images / volume / network"}):Q("div",null,Q("div",{className:"docker-hero"},Q("div",null,Q("p",{className:"panel-eyebrow"},"Daemon"),Q("h3",null,U.name||j.providerId),Q("div",{className:"docker-meta"},Q("span",null,U.serverVersion?`Engine ${U.serverVersion}`:"Engine --"),Q("span",null,U.operatingSystem||"OS --"),Q("span",null,U.architecture||"arch --"),Q("span",null,`${U.cpus||0} CPU / ${Ju(U.memoryBytes)}`))),Q(V0,{status:J.ok?"online":"warn"},J.ok?"Docker Ready":"Docker Degraded")),Q("div",{className:"docker-metrics"},Q(f0,{label:"Containers",value:A.containers??z.length,hint:`${A.running??O.length} running / ${A.stopped??G.length} stopped`,tone:"ok"}),Q(f0,{label:"Images",value:A.images??W.length,hint:`${A.daemonImages??A.images??W.length} daemon images`}),Q(f0,{label:"Volumes",value:A.volumes??K.length,hint:F?q?"database volume visible":"database volume missing":"node local volumes",tone:q?"ok":""}),Q(f0,{label:"Networks",value:A.networks??E.length,hint:U.driver?`driver ${U.driver}`:"docker networks"})),F?Q(aS,{volume:q,volumeCount:K.length}):null,Q("div",{className:"docker-section-head"},Q("h3",null,"Containers"),Q("span",null,`updated ${m0(j.dockerUpdatedAt||J.collectedAt)}`)),Q("div",{className:"docker-container-table table-wrap","data-testid":"docker-container-table"},Q("table",null,Q("thead",null,Q("tr",null,Q("th",null,"状态"),Q("th",null,"容器"),Q("th",null,"镜像"),Q("th",null,"端口"),Q("th",null,"运行时间"),Q("th",null,"大小"))),Q("tbody",null,z.length===0?Q("tr",null,Q("td",{colSpan:6},"暂无容器")):z.map((H)=>Q("tr",{key:`${H.id}-${H.name}`},Q("td",null,Q(V0,{status:tS(H.state)},H.state||"unknown")),Q("td",null,Q("strong",null,H.name||"--"),Q("code",null,H.id||"--")),Q("td",null,H.image||"--"),Q("td",null,H.ports||Q("span",{className:"muted"},"未发布")),Q("td",null,H.runningFor||H.status||"--"),Q("td",null,H.size||"--")))))))),Q("div",{className:"docker-side-stack"},Q(UQ,{title:"Images",items:W,render:(H)=>Q("article",{key:`${H.id}-${H.repository}`,className:"docker-side-row"},Q("strong",null,`${H.repository}:${H.tag}`),Q("span",null,H.size||"--"),Q("code",null,H.id||"--"))}),Q(UQ,{title:"Volumes",items:K,limit:K.length,render:(H)=>Q("article",{key:H.name,className:`docker-side-row volume-row ${F&&Sl(H)?"database-volume":""}`,"data-testid":F&&Sl(H)?"database-volume-row":void 0},Q("strong",null,H.name),Q("span",null,F&&Sl(H)?"PostgreSQL":xH(String(H.name||""))?"anonymous":"named"),Q("code",null,H.mountpoint||H.driver||H.scope||"--"))}),Q(UQ,{title:"Networks",items:E,render:(H)=>Q("article",{key:H.id||H.name,className:"docker-side-row"},Q("strong",null,H.name),Q("span",null,H.driver||"--"),Q("code",null,H.id||"--"))}))))}function aS({volume:f,volumeCount:u}){return Q("section",{className:`docker-volume-focus ${f?"ready":"missing"}`,"data-testid":"database-volume-card"},Q("div",{className:"volume-focus-head"},Q("span",{className:"panel-eyebrow"},"Database Named Volume"),Q(V0,{status:f?"online":"warn"},f?"FOUND":"MISSING")),f?Q("div",{className:"volume-focus-body"},Q("strong",null,f.name),Q("span",null,"PostgreSQL data volume for unidesk-database"),Q("div",{className:"volume-route"},Q("code",null,f.mountpoint||"/var/lib/docker/volumes/unidesk_pgdata_10gb/_data"),Q("span",null,"->"),Q("code",null,"unidesk-database:/var/lib/postgresql/data")),Q("div",{className:"docker-meta compact"},Q("span",null,`driver ${f.driver||"--"}`),Q("span",null,`scope ${f.scope||"--"}`),Q("span",null,`${u} volumes reported`))):Q("div",{className:"volume-focus-body"},Q("strong",null,"unidesk_pgdata_10gb"),Q("span",null,"当前 Docker 快照没有发现数据库命名卷;请检查 provider-gateway 的 Docker volume 上报。")))}function UQ({title:f,items:u,render:_,limit:y}){let $=u.slice(0,y??12),l=Math.max(0,u.length-$.length);return Q(kf,{title:f,eyebrow:`${u.length} items`,className:"docker-side-panel"},u.length===0?Q(l0,{title:`暂无 ${f}`,text:"等待 Docker 状态采集"}):Q("div",{className:"docker-side-list"},$.map(_),l>0?Q("div",{className:"docker-side-more"},`+ ${l} more`):null))}function dS({microservices:f,onRaw:u,onNavigate:_}){let y=f.filter(($)=>KH($).public===!1);return Q("div",{className:"microservice-page","data-testid":"microservice-catalog-page"},Q(kf,{title:"用户服务目录",eyebrow:"Provider Mounted User Services"},Q("div",{className:"metric-grid"},Q(f0,{label:"服务总数",value:f.length,hint:"config.json 用户服务登记"}),Q(f0,{label:"私有后端",value:y.length,hint:"不直接暴露公网",tone:"ok"}),Q(f0,{label:"D601 服务",value:f.filter(($)=>$.providerId==="D601").length,hint:"compute-node docker"}),Q(f0,{label:"集成前端",value:f.filter(($)=>$.frontend?.integrated).length,hint:"UniDesk React 页面"}))),Q(kf,{title:"服务映射",eyebrow:"Repo Reference + Runtime"},f.length===0?Q(l0,{title:"暂无用户服务",text:"在 config.json 的 microservices 中登记用户服务的 provider、仓库引用和后端映射"}):Q("div",{className:"table-wrap"},Q("table",{className:"microservice-table"},Q("thead",null,Q("tr",null,Q("th",null,"服务"),Q("th",null,"Provider"),Q("th",null,"代码引用"),Q("th",null,"Docker 引用"),Q("th",null,"后端映射"),Q("th",null,"开发入口"),Q("th",null,"运行态"),Q("th",null,"操作"))),Q("tbody",null,f.map(($)=>{let l=PH($),j=NS($),J=KH($);return Q("tr",{key:$.id,"data-testid":`microservice-row-${N1($.id)}`},Q("td",null,Q("strong",null,$.name),Q("code",null,$.id)),Q("td",null,Q("strong",null,l.providerName||$.providerId),Q("code",null,$.providerId)),Q("td",null,Q("span",null,j.url||"--"),Q("code",null,j.commitId||"--")),Q("td",null,Q("span",null,j.composeFile||"--"),Q("code",null,`${j.composeService||"--"} / ${j.containerName||"--"}`)),Q("td",null,Q(V0,{status:J.public?"warn":"online"},J.public?"public":"private"),Q("code",null,`${J.nodeBindHost||"--"}:${J.nodePort||"--"} -> ${J.proxyMode||"--"}`)),Q("td",null,Q("span",null,$.development?.sshPassthrough?"SSH 透传":"未配置"),Q("code",null,$.development?.worktreePath||"--")),Q("td",null,Q(V0,{status:l.providerStatus==="online"?"online":"warn"},l.providerStatus||"unknown"),Q(ey,{data:l.container,empty:"容器快照未上报"})),Q("td",null,Q("div",{className:"microservice-actions"},$.id==="findjob"?Q("button",{type:"button",className:"ghost-btn",onClick:()=>_("apps","findjob"),"data-testid":"open-findjob-button"},"打开"):null,$.id==="pipeline"?Q("button",{type:"button",className:"ghost-btn",onClick:()=>_("apps","pipeline"),"data-testid":"open-pipeline-button"},"打开"):null,$.id==="todo-note"?Q("button",{type:"button",className:"ghost-btn",onClick:()=>_("apps","todo-note"),"data-testid":"open-todo-note-button"},"打开"):null,$.id==="met-nonlinear"?Q("button",{type:"button",className:"ghost-btn",onClick:()=>_("apps","met-nonlinear"),"data-testid":"open-met-nonlinear-button"},"打开"):null,$.id==="claudeqq"?Q("button",{type:"button",className:"ghost-btn",onClick:()=>_("apps","claudeqq"),"data-testid":"open-claudeqq-button"},"打开"):null,$.id==="codex-queue"?Q("button",{type:"button",className:"ghost-btn",onClick:()=>_("apps","codex-queue"),"data-testid":"open-codex-queue-button"},"打开"):null,$.id==="project-manager"?Q("button",{type:"button",className:"ghost-btn",onClick:()=>_("apps","project-manager"),"data-testid":"open-project-manager-button"},"打开"):null,Q(k0,{title:`用户服务 ${$.id}`,data:$,onOpen:u}))))}))))))}function eS({nodes:f,onDispatched:u,onRaw:_}){let y=f.filter((v)=>v.status==="online"),[$,l]=hf(y[0]?.providerId||f[0]?.providerId||""),[j,J]=hf("docker.ps"),[F,A]=hf("frontend"),[U,z]=hf("operator-check"),[W,K]=hf("normal"),[q,E]=hf(!1),[O,G]=hf(""),[H,Z]=hf(!1),[V,L]=hf(null),[M,N]=hf("");p1(()=>{if(!$&&(y[0]?.providerId||f[0]?.providerId))l(y[0]?.providerId||f[0].providerId)},[f.length,y.length,$]);function D(){return{source:F,note:U,priority:W}}function x(){G(JSON.stringify(D(),null,2)),E(!0)}async function c(v){v.preventDefault(),Z(!0),N("");try{let C=q?JSON.parse(O||"{}"):D(),P=await wf(`${tf.apiBaseUrl}/dispatch`,{method:"POST",body:JSON.stringify({providerId:$,command:j,payload:C})});L(P),await u()}catch(C){N(Mf(C,"下发失败"))}finally{Z(!1)}}return Q("div",{className:"page-grid dispatch-grid"},Q(kf,{title:"下发任务",eyebrow:"Real WebSocket Dispatch"},Q("form",{className:"dispatch-form",onSubmit:c},Q("label",null,"Provider",Q("select",{value:$,onChange:(v)=>l(v.target.value)},f.map((v)=>Q("option",{key:v.providerId,value:v.providerId},`${v.name} / ${v.providerId}`)))),Q("label",null,"Command",Q("select",{value:j,onChange:(v)=>J(v.target.value)},Q("option",{value:"docker.ps"},"docker.ps"),Q("option",{value:"host.ssh"},"host.ssh"),Q("option",{value:"microservice.http"},"microservice.http"),Q("option",{value:"echo"},"echo"))),Q("label",null,"来源",Q("input",{value:F,onChange:(v)=>A(v.target.value)})),Q("label",null,"备注",Q("input",{value:U,onChange:(v)=>z(v.target.value)})),Q("label",null,"优先级",Q("select",{value:W,onChange:(v)=>K(v.target.value)},Q("option",{value:"normal"},"normal"),Q("option",{value:"low"},"low"),Q("option",{value:"urgent"},"urgent"))),Q("div",{className:"dispatch-actions"},Q("button",{type:"button",className:"ghost-btn",onClick:x},"查看原始JSON"),Q("button",{type:"submit",disabled:H||!$},H?"下发中":"下发任务")),q?Q("label",{className:"raw-editor-label"},"高级 Payload",Q("textarea",{className:"raw-editor",value:O,onChange:(v)=>G(v.target.value)})):null,Q(H0,{error:M,wide:!0}))),Q(kf,{title:"下发结果",eyebrow:"Response"},V?Q("div",{className:"result-card"},Q(V0,{status:V.status||"queued"},V.status||"queued"),Q("dl",null,Q("dt",null,"Task ID"),Q("dd",null,Q("code",null,V.taskId||"--")),Q("dt",null,"Provider 在线"),Q("dd",null,dy(V.providerOnline))),Q(k0,{title:"Dispatch Response",data:V,onOpen:_})):Q(l0,{title:"等待操作",text:"任务响应会以结构化结果卡展示"})))}function VH({task:f,onRaw:u}){return Q("article",{className:"compact-row"},Q(V0,{status:f.status}),Q("div",null,Q("strong",null,f.command),Q("code",null,f.id)),Q("span",null,E$(f)?`已等待 ${WQ(f.updatedAt)}`:`耗时 ${H$(NH(f)??0)}`),Q(k0,{title:`Task ${f.id}`,data:Rl(f),onOpen:u}))}function vH({task:f}){let u=NH(f),_=E$(f);return Q("div",{className:"task-duration"},Q("strong",null,u===null?"--":H$(u)),Q("span",null,_?`已运行 / 创建 ${m0(f.createdAt)}`:`创建 ${m0(f.createdAt)}`))}function fr({task:f}){let u=String(f?.status||"").toLowerCase(),_=f?.result,y=_&&typeof _==="object"&&!Array.isArray(_)?_:{},l=["exitCode","code","signal","timeoutMs","previousStatus","mode"].filter((j)=>y[j]!==void 0&&y[j]!==null);if(u==="failed"){let j=LH(f);return Q("div",{className:"task-diagnostic failed"},Q("b",null,"失败原因"),Q("span",{className:"diagnostic-reason"},dy(j)),l.length>0?Q("div",{className:"diagnostic-meta"},l.map((J)=>Q("span",{key:J,className:"data-chip"},Q("b",null,J),Q("span",null,dy(y[J]))))):null)}if(E$(f))return Q("div",{className:"task-diagnostic warn"},Q("b",null,"等待终态"),Q("span",null,`最后更新 ${WQ(f.updatedAt)} 前`));return Q("div",{className:"task-diagnostic ok"},Q("b",null,"完成摘要"),Q(ey,{data:_,empty:"无执行输出"}))}function ur({tasks:f,onRaw:u}){let _=f.filter(E$);return Q("div",{"data-testid":"pending-task-page"},Q(kf,{title:"待处理任务",eyebrow:`${_.length} Pending`},_.length===0?Q(l0,{title:"当前无待处理任务",text:"queued / dispatched / running 会在超时后自动转为 failed;历史记录仍可在任务历史中查看"}):Q("div",{className:"table-wrap","data-testid":"pending-task-table"},Q("table",null,Q("thead",null,Q("tr",null,Q("th",null,"状态"),Q("th",null,"任务"),Q("th",null,"Provider"),Q("th",null,"已等待"),Q("th",null,"载荷摘要"),Q("th",null,"操作"))),Q("tbody",null,_.map((y)=>Q("tr",{key:y.id},Q("td",null,Q(V0,{status:y.status})),Q("td",null,Q("strong",null,y.command),Q("code",null,y.id)),Q("td",null,Q("code",null,y.providerId)),Q("td",null,WQ(y.updatedAt)),Q("td",null,Q(ey,{data:y.payload})),Q("td",null,Q(k0,{title:`Pending Task ${y.id}`,data:Rl(y),onOpen:u})))))))))}function _r({tasks:f,onRaw:u}){return Q("div",{"data-testid":"task-history-page"},Q(kf,{title:"任务历史",eyebrow:`${f.length} Tasks`},f.length===0?Q(l0,{title:"暂无任务",text:"下发任务后会在这里看到生命周期"}):Q("div",{className:"table-wrap"},Q("table",{className:"task-history-table"},Q("thead",null,Q("tr",null,Q("th",null,"状态"),Q("th",null,"任务"),Q("th",null,"Provider"),Q("th",null,"任务耗时"),Q("th",null,"载荷摘要"),Q("th",null,"诊断信息"),Q("th",null,"更新时间"),Q("th",null,"操作"))),Q("tbody",null,f.map((_)=>Q("tr",{key:_.id,"data-testid":`task-row-${N1(_.id)}`},Q("td",null,Q(V0,{status:_.status})),Q("td",null,Q("strong",null,_.command),Q("code",null,_.id)),Q("td",null,Q("code",null,_.providerId)),Q("td",null,Q(vH,{task:_})),Q("td",null,Q(ey,{data:_.payload})),Q("td",null,Q(fr,{task:_})),Q("td",null,m0(_.updatedAt)),Q("td",null,Q(k0,{title:`Task ${_.id}`,data:Rl(_),onOpen:u})))))))))}function yr({tasks:f,onRaw:u}){let _=f.filter((y)=>["succeeded","failed"].includes(y.status));return Q(kf,{title:"执行结果",eyebrow:"Finished Tasks"},_.length===0?Q(l0,{title:"暂无结果",text:"任务完成后展示 provider 返回的结构化摘要"}):Q("div",{className:"result-grid"},_.map((y)=>Q("article",{key:y.id,className:"result-card"},Q("div",{className:"node-card-head"},Q("strong",null,y.command),Q(V0,{status:y.status})),Q("code",null,y.id),Q(ey,{data:y.result,empty:"无执行输出"}),Q(k0,{title:`Task Result ${y.id}`,data:Rl(y),onOpen:u})))))}function $r({data:f}){let u=f.overview||{};return Q("div",{className:"page-grid topology-grid"},Q(kf,{title:"公开入口",eyebrow:"Public"},Q("div",{className:"endpoint-list"},Q("article",null,Q("b",null,"Frontend"),Q("span",null,tf.frontendPublicUrl||window.location.origin),Q(V0,{status:"online"},"public")),Q("article",null,Q("b",null,"Provider Ingress"),Q("span",null,tf.providerIngressPublicUrl||"ws://public/ws/provider"),Q(V0,{status:"online"},"public")))),Q(kf,{title:"内部服务",eyebrow:"Docker Network Only"},Q("div",{className:"endpoint-list"},Q("article",null,Q("b",null,"backend-core API"),Q("span",null,"http://backend-core:8080"),Q(V0,{status:"internal"},"internal")),Q("article",null,Q("b",null,"database"),Q("span",null,"postgres://database:5432/unidesk"),Q(V0,{status:"internal"},"internal")))),Q(kf,{title:"运行态",eyebrow:"Runtime"},Q("div",{className:"metric-grid"},Q(f0,{label:"DB Ready",value:u.dbReady?"YES":"NO",hint:"internal health"}),Q(f0,{label:"Online Nodes",value:u.onlineNodeCount??0,hint:"provider-gateway self-link"}))))}function lr({session:f}){return Q(kf,{title:"认证策略",eyebrow:"Frontend Login"},Q("div",{className:"policy-grid"},Q("article",null,Q("span",null,"默认账号"),Q("strong",null,tf.authUsername||"admin")),Q("article",null,Q("span",null,"当前会话"),Q("strong",null,f?.user?.username||"--")),Q("article",null,Q("span",null,"Session TTL"),Q("strong",null,`${tf.sessionTtlSeconds||0}s`)),Q("article",null,Q("span",null,"API 访问"),Q("strong",null,"同源 Cookie 保护"))),Q("p",{className:"muted paragraph"},"浏览器只访问 frontend 同源接口;frontend 容器使用 Docker 内网代理 backend-core API。"))}function jr(){return Q(kf,{title:"安全边界",eyebrow:"Exposure Rule"},Q("div",{className:"security-board"},Q("article",{className:"allow"},Q("b",null,"允许公网"),Q("span",null,"frontend 登录入口"),Q("span",null,"provider ingress WebSocket/health")),Q("article",{className:"deny"},Q("b",null,"禁止公网"),Q("span",null,"backend-core REST API"),Q("span",null,"PostgreSQL database")),Q("article",null,Q("b",null,"数据库卷"),Q("span",null,"named volume unidesk_pgdata_10gb"),Q("span",null,"CLI stop/start 不删除数据卷"))))}function Jr({activeModule:f,activeTab:u,data:_,session:y,refresh:$,onRaw:l,onNavigate:j}){if(f==="ops"&&u==="status")return Q(TS,{data:_,onRaw:l,onNavigate:j});if(f==="ops"&&u==="performance")return Q(kS,{onRaw:l});if(f==="ops"&&u==="events")return Q(SS,{events:_.events,onRaw:l});if(f==="ops"&&u==="logs")return Q(rS,{logs:_.logs,onRaw:l});if(f==="nodes"&&u==="list")return Q(PS,{nodes:_.nodes,onRaw:l});if(f==="nodes"&&u==="monitor")return Q(xS,{nodes:_.nodes,systemStatuses:_.systemStatuses,tasks:_.tasks,onRaw:l,refresh:$});if(f==="nodes"&&u==="docker")return Q(oS,{nodes:_.nodes,dockerStatuses:_.dockerStatuses,onRaw:l});if(f==="nodes"&&u==="gateway")return Q(nS,{nodes:_.nodes,tasks:_.tasks,onRaw:l});if(f==="nodes"&&u==="labels")return Q(CS,{nodes:_.nodes});if(f==="nodes"&&u==="heartbeats")return Q(RS,{nodes:_.nodes});if(f==="tasks"&&u==="dispatch")return Q(eS,{nodes:_.nodes,onDispatched:$,onRaw:l});if(f==="tasks"&&u==="pending")return Q(ur,{tasks:_.pendingTasks,onRaw:l});if(f==="tasks"&&u==="history")return Q(_r,{tasks:_.tasks,onRaw:l});if(f==="tasks"&&u==="results")return Q(yr,{tasks:_.tasks,onRaw:l});if(f==="apps"&&u==="catalog")return Q(dS,{microservices:_.microservices,onRaw:l,onNavigate:j});if(f==="apps"&&u==="todo-note")return Q(FH,{microservices:_.microservices,onRaw:l,apiBaseUrl:tf.apiBaseUrl});if(f==="apps"&&u==="findjob")return Q(fG,{microservices:_.microservices,onRaw:l,apiBaseUrl:tf.apiBaseUrl});if(f==="apps"&&u==="pipeline")return Q(eq,{microservices:_.microservices,onRaw:l,apiBaseUrl:tf.apiBaseUrl});if(f==="apps"&&u==="met-nonlinear")return Q(lG,{microservices:_.microservices,onRaw:l,apiBaseUrl:tf.apiBaseUrl});if(f==="apps"&&u==="claudeqq")return Q(Jz,{microservices:_.microservices,onRaw:l,apiBaseUrl:tf.apiBaseUrl});if(f==="apps"&&u==="codex-queue")return Q(ez,{microservices:_.microservices,onRaw:l,apiBaseUrl:tf.apiBaseUrl,initialTasksData:WS});if(f==="apps"&&u==="project-manager")return Q(_H,{microservices:_.microservices,onRaw:l,apiBaseUrl:tf.apiBaseUrl});if(f==="config"&&u==="topology")return Q($r,{data:_});if(f==="config"&&u==="auth")return Q(lr,{session:y});if(f==="config"&&u==="security")return Q(jr);return Q(l0,{title:"未找到页面",text:"请选择左侧主模块和顶部子功能标签"})}function Fr({session:f,onLogout:u}){let _=Dj(mu,window.location.pathname),[y,$]=hf(_.moduleId),[l,j]=hf({...m3,[_.moduleId]:_.tabId}),[J,F]=hf({overview:null,nodes:[],systemStatuses:[],dockerStatuses:[],microservices:[],events:[],tasks:[],pendingTasks:[],logs:[]}),[A,U]=hf({ok:!1,text:"连接中"}),[z,W]=hf(null),[K,q]=hf(new Date),[E,O]=hf(null),[G,H]=hf(!1),Z=Pl.default.useRef(!1),V=mu.moduleById[y]||mu.modules[0],L=l[y]||m3[y]||V.tabs[0].id,M=Array.isArray(J.microservices)?J.microservices:[],N=M.length===0&&y==="apps"&&L==="codex-queue"?[zS]:M,D=N===M?J:{...J,microservices:N},x=y==="apps"?N.find((S)=>String(S?.id||"")===L):null,c=x?PH(x):{},v=V.tabs.find((S)=>S.id===L)?.label||L,C=x?[{key:"microservice",label:"用户服务",value:`${v} ${c.providerStatus==="online"?"在线":c.providerStatus||"未知"}`,tone:c.providerStatus==="online"?"ok":"warn",testId:"active-microservice-status"}]:[];async function P(){if(Z.current)return;Z.current=!0;try{let S=[],T=(n,_f)=>{S.push([n,wf(_f)])},Y=y==="ops"&&L==="status",R=Y||y==="config"&&L==="topology",m=Y||y==="nodes"||y==="tasks"&&L==="dispatch",p=y==="apps"&&L!=="codex-queue";if(R)T("overview",`${tf.apiBaseUrl}/overview`);if(m)T("nodes",`${tf.apiBaseUrl}/nodes`);if(y==="nodes"&&L==="monitor")T("systemStatuses",`${tf.apiBaseUrl}/nodes/system-status?limit=60`),T("tasks",`${tf.apiBaseUrl}/tasks?limit=120&summary=1`);else if(y==="nodes"&&L==="docker")T("dockerStatuses",`${tf.apiBaseUrl}/nodes/docker-status`);else if(y==="nodes"&&L==="gateway")T("tasks",`${tf.apiBaseUrl}/tasks?limit=300&summary=1`);else if(y==="tasks"&&L==="pending")T("pendingTasks",`${tf.apiBaseUrl}/tasks?status=pending&limit=100&summary=1`);else if(y==="tasks"&&(L==="history"||L==="results"))T("tasks",`${tf.apiBaseUrl}/tasks?limit=300&summary=1`);else if(Y)T("tasks",`${tf.apiBaseUrl}/tasks?limit=8&lite=1`),T("pendingTasks",`${tf.apiBaseUrl}/tasks?status=pending&limit=20&lite=1`);if(p)T("microservices",`${tf.apiBaseUrl}/microservices`);if(y==="ops"&&L==="events")T("events",`${tf.apiBaseUrl}/events?limit=100`);if(y==="ops"&&L==="logs")T("logs","/logs?limit=100");await Promise.all(S.map(async([n,_f])=>{let t=await _f,ff={};if(n==="overview")ff.overview=t;if(n==="nodes")ff.nodes=t.nodes||[];if(n==="systemStatuses")ff.systemStatuses=t.systemStatuses||[];if(n==="dockerStatuses")ff.dockerStatuses=t.dockerStatuses||[];if(n==="microservices")ff.microservices=t.microservices||[];if(n==="events")ff.events=t.events||[];if(n==="tasks")ff.tasks=t.tasks||[];if(n==="pendingTasks")ff.pendingTasks=t.tasks||[];if(n==="logs")ff.logs=t.logs||[];F((Gf)=>({...Gf,...ff}))})),U({ok:!0,text:"核心在线"}),W(new Date)}catch(S){if(U({ok:!1,text:Mf(S,"连接失败")}),S.status===401)u(!1)}finally{Z.current=!1}}p1(()=>{let S=()=>{if(!WH())return;P()};S();let T=setInterval(S,GS(y,L)),Y=()=>{if(WH())S()};return document.addEventListener("visibilitychange",Y),()=>{clearInterval(T),document.removeEventListener("visibilitychange",Y)}},[y,L]),p1(()=>{let S=setInterval(()=>q(new Date),1000);return()=>clearInterval(S)},[]),p1(()=>{let S=QG(mu,window.location.pathname);if(S&&window.location.pathname!==S)window.history.replaceState(null,"",S)},[]),p1(()=>{let S=()=>{let T=Dj(mu,window.location.pathname);$(T.moduleId),j((Y)=>({...Y,[T.moduleId]:T.tabId})),O(null)};return window.addEventListener("popstate",S),()=>window.removeEventListener("popstate",S)},[]),p1(()=>{window.scrollTo({top:0,left:0,behavior:"auto"})},[y,L]);function w(S,T,Y="push"){let R=mu.moduleById[S]?S:mu.fallbackTarget.moduleId,m=mu.moduleById[R]?.tabs.some((n)=>n.id===T)?T:m3[R]||mu.moduleById[R]?.tabs[0]?.id||mu.fallbackTarget.tabId;$(R),j((n)=>({...n,[R]:m}));let p=c6(mu,R,m);if(window.location.pathname!==p){let n=Y==="replace"?"replaceState":"pushState";window.history[n](null,"",p)}}function r(S,T){O({title:S,data:T})}return Q("div",{className:`shell ${G?"rail-collapsed":""}`,"data-testid":"app-shell"},Q(wS,{activeModule:y,activeTabs:l,onNavigate:w,collapsed:G,onToggle:()=>H((S)=>!S)}),Q("main",{className:"workspace"},Q(BS,{connection:A,lastRefresh:z,onRefresh:P,onLogout:()=>u(!0),session:f,clock:K,activeStatusItems:C}),Q(DS,{module:V,activeTab:L,onNavigate:w}),Q(Jr,{activeModule:y,activeTab:L,data:D,session:f,refresh:P,onRaw:r,onNavigate:w})),Q(LS,{raw:E,onClose:()=>O(null)}))}function Qr(){let[f,u]=hf(!0),[_,y]=hf(null);async function $(){u(!0);try{let j=await wf("/api/session");y(j.authenticated?j:null)}catch{y(null)}finally{u(!1)}}async function l(j){if(j)try{await wf("/logout",{method:"POST"})}catch{}y(null)}if(p1(()=>{$()},[]),f)return Q("main",{className:"loading-screen"},Q("div",{className:"brand-mark"},"UD"),Q("span",null,"加载会话"));if(!_)return Q(YS,{onLogin:y});return Q(Fr,{session:_,onLogout:l})}var bH=document.getElementById("root");if(bH===null)throw Error("root element not found");OH.createRoot(bH).render(Q(Qr));})(); diff --git a/src/components/frontend/src/app.tsx b/src/components/frontend/src/app.tsx index 9c1f5369..18c8cd09 100644 --- a/src/components/frontend/src/app.tsx +++ b/src/components/frontend/src/app.tsx @@ -49,6 +49,30 @@ const fastCodexQueueService = { }, }; +function isDocumentVisible(): boolean { + return typeof document === "undefined" || document.visibilityState !== "hidden"; +} + +function shellRefreshIntervalMs(moduleId: string, tabId: string): number { + if (moduleId === "ops" && tabId === "status") return 5_000; + if (moduleId === "nodes" && tabId === "monitor") return 5_000; + if (moduleId === "tasks" && (tabId === "dispatch" || tabId === "pending")) return 5_000; + if (moduleId === "nodes" || moduleId === "ops") return 10_000; + if (moduleId === "apps") return 15_000; + if (moduleId === "tasks") return 15_000; + return 30_000; +} + +async function loadTaskRawData(task: any): Promise { + if (!task?._summaryOnly || !task?.id) return task; + const result = await requestJson(`${cfg.apiBaseUrl}/tasks/${encodeURIComponent(String(task.id))}`); + return result?.task || task; +} + +function taskRawButtonData(task: any): any { + return task?._summaryOnly ? { ...task, _loadRaw: () => loadTaskRawData(task) } : task; +} + function fmtDate(value: any): string { if (!value) return "--"; const date = new Date(value); @@ -262,7 +286,7 @@ function taskUpgradeSource(task: any): string { function taskUpgradePolicy(task: any): string { const result = taskResult(task); const plan = result.plan && typeof result.plan === "object" && !Array.isArray(result.plan) ? result.plan as AnyRecord : {}; - const policy = plan.policy; + const policy = result.policy ?? plan.policy; return typeof policy === "string" && policy.length > 0 ? policy : "--"; } @@ -349,12 +373,29 @@ function Panel({ title, eyebrow, actions, children, className }: AnyRecord) { } function RawButton({ title, data, onOpen, testId }: AnyRecord) { + const [loading, setLoading] = useState(false); + const loadData = data && typeof data === "object" && typeof data._loadRaw === "function" ? data._loadRaw : null; + async function open(): Promise { + if (!loadData) { + onOpen(title, data); + return; + } + setLoading(true); + try { + onOpen(title, await loadData()); + } catch (err) { + onOpen(title, { ok: false, error: errorMessage(err, "读取原始 JSON 失败"), fallback: data }); + } finally { + setLoading(false); + } + } return h("button", { type: "button", className: "ghost-btn", "data-testid": testId, - onClick: () => onOpen(title, data), - }, "查看原始JSON"); + disabled: loading, + onClick: () => void open(), + }, loading ? "读取中" : "查看原始JSON"); } function RawDialog({ raw, onClose }: AnyRecord) { @@ -1227,7 +1268,7 @@ function UpgradeRecordsTable({ records, onRaw, compact = false }: AnyRecord) { h("td", null, h("span", { className: "version-chip" }, taskUpgradeVersion(task))), h("td", null, h("span", { className: `upgrade-outcome ${String(task.status || "").toLowerCase()}` }, taskUpgradeOutcome(task))), h("td", null, fmtDate(task.updatedAt)), - h("td", null, h(RawButton, { title: `Provider Upgrade Task ${task.id}`, data: task, onOpen: onRaw })), + h("td", null, h(RawButton, { title: `Provider Upgrade Task ${task.id}`, data: taskRawButtonData(task), onOpen: onRaw })), ))), )); } @@ -1622,7 +1663,7 @@ function TaskCompactRow({ task, onRaw }: AnyRecord) { h(StatusBadge, { status: task.status }), h("div", null, h("strong", null, task.command), h("code", null, task.id)), h("span", null, isPendingTask(task) ? `已等待 ${fmtRelativeAge(task.updatedAt)}` : `耗时 ${fmtDuration(taskElapsedSeconds(task) ?? 0)}`), - h(RawButton, { title: `Task ${task.id}`, data: task, onOpen: onRaw }), + h(RawButton, { title: `Task ${task.id}`, data: taskRawButtonData(task), onOpen: onRaw }), ); } @@ -1676,7 +1717,7 @@ function TaskPendingPage({ tasks, onRaw }: AnyRecord) { h("td", null, h("code", null, task.providerId)), h("td", null, fmtRelativeAge(task.updatedAt)), h("td", null, h(DataSummary, { data: task.payload })), - h("td", null, h(RawButton, { title: `Pending Task ${task.id}`, data: task, onOpen: onRaw })), + h("td", null, h(RawButton, { title: `Pending Task ${task.id}`, data: taskRawButtonData(task), onOpen: onRaw })), ))), )), ), @@ -1697,7 +1738,7 @@ function TaskHistoryPage({ tasks, onRaw }: AnyRecord) { h("td", null, h(DataSummary, { data: task.payload })), h("td", null, h(TaskDiagnosticCell, { task })), h("td", null, fmtDate(task.updatedAt)), - h("td", null, h(RawButton, { title: `Task ${task.id}`, data: task, onOpen: onRaw })), + h("td", null, h(RawButton, { title: `Task ${task.id}`, data: taskRawButtonData(task), onOpen: onRaw })), ))), )), ), @@ -1712,7 +1753,7 @@ function TaskResultsPage({ tasks, onRaw }: AnyRecord) { h("div", { className: "node-card-head" }, h("strong", null, task.command), h(StatusBadge, { status: task.status })), h("code", null, task.id), h(DataSummary, { data: task.result, empty: "无执行输出" }), - h(RawButton, { title: `Task Result ${task.id}`, data: task, onOpen: onRaw }), + h(RawButton, { title: `Task Result ${task.id}`, data: taskRawButtonData(task), onOpen: onRaw }), ))), ); } @@ -1802,6 +1843,7 @@ function Shell({ session, onLogout }: AnyRecord) { const [clock, setClock] = useState(new Date()); const [raw, setRaw] = useState(null); const [railCollapsed, setRailCollapsed] = useState(false); + const refreshInFlightRef = React.useRef(false); const module = ROUTE_REGISTRY.moduleById[activeModule] || ROUTE_REGISTRY.modules[0]; const activeTab = activeTabs[activeModule] || DEFAULT_ACTIVE_TABS[activeModule] || module.tabs[0].id; @@ -1824,28 +1866,30 @@ function Shell({ session, onLogout }: AnyRecord) { }] : []; async function refresh(): Promise { + if (refreshInFlightRef.current) return; + refreshInFlightRef.current = true; try { const requests: Array<[string, Promise]> = []; const add = (key: string, path: string): void => { requests.push([key, requestJson(path)]); }; const isOverview = activeModule === "ops" && activeTab === "status"; - const needsOverviewSummary = activeModule !== "apps"; + const needsOverviewSummary = isOverview || (activeModule === "config" && activeTab === "topology"); const needsNodes = isOverview || activeModule === "nodes" || (activeModule === "tasks" && activeTab === "dispatch"); const needsMicroservices = activeModule === "apps" && activeTab !== "codex-queue"; if (needsOverviewSummary) add("overview", `${cfg.apiBaseUrl}/overview`); if (needsNodes) add("nodes", `${cfg.apiBaseUrl}/nodes`); if (activeModule === "nodes" && activeTab === "monitor") { add("systemStatuses", `${cfg.apiBaseUrl}/nodes/system-status?limit=60`); - add("tasks", `${cfg.apiBaseUrl}/tasks?limit=120`); + add("tasks", `${cfg.apiBaseUrl}/tasks?limit=120&summary=1`); } else if (activeModule === "nodes" && activeTab === "docker") { add("dockerStatuses", `${cfg.apiBaseUrl}/nodes/docker-status`); } else if (activeModule === "nodes" && activeTab === "gateway") { - add("tasks", `${cfg.apiBaseUrl}/tasks?limit=300`); + add("tasks", `${cfg.apiBaseUrl}/tasks?limit=300&summary=1`); } else if (activeModule === "tasks" && activeTab === "pending") { - add("pendingTasks", `${cfg.apiBaseUrl}/tasks?status=pending&limit=100`); + add("pendingTasks", `${cfg.apiBaseUrl}/tasks?status=pending&limit=100&summary=1`); } else if (activeModule === "tasks" && (activeTab === "history" || activeTab === "results")) { - add("tasks", `${cfg.apiBaseUrl}/tasks?limit=300`); + add("tasks", `${cfg.apiBaseUrl}/tasks?limit=300&summary=1`); } else if (isOverview) { add("tasks", `${cfg.apiBaseUrl}/tasks?limit=8&lite=1`); add("pendingTasks", `${cfg.apiBaseUrl}/tasks?status=pending&limit=20&lite=1`); @@ -1873,13 +1917,26 @@ function Shell({ session, onLogout }: AnyRecord) { } catch (err) { setConnection({ ok: false, text: errorMessage(err, "连接失败") }); if ((err as { status?: number }).status === 401) onLogout(false); + } finally { + refreshInFlightRef.current = false; } } useEffect(() => { - refresh(); - const timer = setInterval(refresh, 5000); - return () => clearInterval(timer); + const tick = (): void => { + if (!isDocumentVisible()) return; + void refresh(); + }; + tick(); + const timer = setInterval(tick, shellRefreshIntervalMs(activeModule, activeTab)); + const onVisible = (): void => { + if (isDocumentVisible()) tick(); + }; + document.addEventListener("visibilitychange", onVisible); + return () => { + clearInterval(timer); + document.removeEventListener("visibilitychange", onVisible); + }; }, [activeModule, activeTab]); useEffect(() => { diff --git a/src/components/frontend/src/codex-queue.tsx b/src/components/frontend/src/codex-queue.tsx index 2d94ecbd..60871a74 100644 --- a/src/components/frontend/src/codex-queue.tsx +++ b/src/components/frontend/src/codex-queue.tsx @@ -11,6 +11,16 @@ const useState: any = React.useState; const codexTranscriptChunkLimit = 120; const codexInitialTaskLimit = 24; const codexMoreTaskLimit = 48; +const codexLocalReadRetention = 300; +const queueErrorPreviewLength = 1200; + +function isDocumentVisible(): boolean { + return typeof document === "undefined" || document.visibilityState !== "hidden"; +} + +function errorText(error: unknown, fallback = "操作失败"): string { + return errorMessage(error, fallback); +} function fmtDate(value: any): string { if (!value) return "--"; @@ -53,6 +63,7 @@ async function requestJson(path: string, options: AnyRecord = {}): Promise retryInvalidJson: 1, invalidJsonPrefix: "Codex Queue 返回了无效 JSON", invalidJsonPreview: true, + responsePreviewLength: queueErrorPreviewLength, ...options, }); } @@ -678,19 +689,33 @@ function loadLocalReadAt(): AnyRecord { if (typeof window === "undefined") return {}; try { const parsed = JSON.parse(window.localStorage.getItem(codexReadAtStorageKey) || "{}"); - return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {}; + return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? trimLocalReadAt(parsed) : {}; } catch { return {}; } } -function saveLocalReadAt(readAtByTask: AnyRecord): void { - if (typeof window === "undefined") return; +function trimLocalReadAt(readAtByTask: AnyRecord): AnyRecord { + const entries = Object.entries(readAtByTask || {}) + .filter(([, value]) => typeof value === "string" && value.length > 0) + .sort((left, right) => { + const leftTime = Date.parse(String(left[1] || "")); + const rightTime = Date.parse(String(right[1] || "")); + return (Number.isFinite(rightTime) ? rightTime : 0) - (Number.isFinite(leftTime) ? leftTime : 0); + }) + .slice(0, codexLocalReadRetention); + return Object.fromEntries(entries); +} + +function saveLocalReadAt(readAtByTask: AnyRecord): AnyRecord { + const retained = trimLocalReadAt(readAtByTask); + if (typeof window === "undefined") return retained; try { - window.localStorage.setItem(codexReadAtStorageKey, JSON.stringify(readAtByTask)); + window.localStorage.setItem(codexReadAtStorageKey, JSON.stringify(retained)); } catch { // Best-effort fallback only; backend readAt remains authoritative when deployed. } + return retained; } function applyLocalReadState(task: any, readAtByTask: AnyRecord): any { @@ -1459,8 +1484,7 @@ export function CodexQueuePage({ microservices, onRaw, apiBaseUrl = "/api", init setLocalReadAt((previous: AnyRecord) => { const next = { ...(previous || {}) }; for (const id of ids) next[id] = readAt; - saveLocalReadAt(next); - return next; + return saveLocalReadAt(next); }); } @@ -1854,7 +1878,7 @@ export function CodexQueuePage({ microservices, onRaw, apiBaseUrl = "/api", init startedAt: new Date(Date.now() - queueMs), }); } - if (nextId) void ensureTraceSummary(nextId, true, trackLoad ? startedAt : undefined, trackLoad ? queueMs : undefined).catch((err) => setError(errorMessage(err, "加载 Codex Trace Summary 失败"))); + if (nextId) void ensureTraceSummary(nextId, true, trackLoad ? startedAt : undefined, trackLoad ? queueMs : undefined).catch((err) => setError(errorText(err, "加载 Codex Trace Summary 失败"))); else { detailLoadTokenRef.current += 1; setSelectedTask(null); @@ -1902,7 +1926,7 @@ export function CodexQueuePage({ microservices, onRaw, apiBaseUrl = "/api", init }; }); } catch (err) { - setError(errorMessage(err, "加载更早 Codex tasks 失败")); + setError(errorText(err, "加载更早 Codex tasks 失败")); } finally { loadMoreInFlightRef.current = false; setLoadingMoreTasks(false); @@ -1922,7 +1946,7 @@ export function CodexQueuePage({ microservices, onRaw, apiBaseUrl = "/api", init try { await action(); } catch (err) { - setError(errorMessage(err, message)); + setError(errorText(err, message)); } finally { setBusy(false); } @@ -1955,7 +1979,7 @@ export function CodexQueuePage({ microservices, onRaw, apiBaseUrl = "/api", init setNotice(`已复制任务 ID:${taskId}`); window.setTimeout(() => setCopiedTaskId((value: string) => value === taskId ? "" : value), 1600); } catch (err) { - setError(`复制任务 ID 失败:${errorMessage(err)}`); + setError(`复制任务 ID 失败:${errorText(err)}`); } } @@ -2177,7 +2201,7 @@ export function CodexQueuePage({ microservices, onRaw, apiBaseUrl = "/api", init if (row) setSelectedTask(row); else setSelectedTask(null); } - void load(taskId).catch((err) => setError(errorMessage(err, "切换 Codex session 失败"))); + void load(taskId).catch((err) => setError(errorText(err, "切换 Codex session 失败"))); } function selectTaskFromSidebar(taskId: string): void { @@ -2195,10 +2219,21 @@ export function CodexQueuePage({ microservices, onRaw, apiBaseUrl = "/api", init useEffect(() => { if (!service) return undefined; + const tick = (): void => { + if (!isDocumentVisible()) return; + void load(selectedIdRef.current, false).catch((err) => setError(errorText(err, "Codex Queue 轮询失败"))); + }; const timer = window.setInterval(() => { - void load(selectedIdRef.current, false).catch((err) => setError(errorMessage(err, "Codex Queue 轮询失败"))); + tick(); }, 1500); - return () => window.clearInterval(timer); + const onVisible = (): void => { + if (isDocumentVisible()) tick(); + }; + document.addEventListener("visibilitychange", onVisible); + return () => { + window.clearInterval(timer); + document.removeEventListener("visibilitychange", onVisible); + }; }, [service?.id, selectedQueueId]); useEffect(() => { @@ -2211,7 +2246,7 @@ export function CodexQueuePage({ microservices, onRaw, apiBaseUrl = "/api", init const key = `${taskId}:${updatedAt || "unknown"}`; if (autoTraceLoadKeysRef.current.has(key)) return; autoTraceLoadKeysRef.current.add(key); - void ensureTraceSummary(taskId, true).catch((err) => setError(errorMessage(err, "自动加载 Trace Summary 失败"))); + void ensureTraceSummary(taskId, true).catch((err) => setError(errorText(err, "自动加载 Trace Summary 失败"))); }, [service?.id, selectedTask?.id, selectedTask?.updatedAt, selectedTask?._traceSummaryUpdatedAt, selectedTask?._traceSummaryLoaded, selectedDetailLoading]); const taskListContent = tasks.length === 0 ? h(EmptyState, { title: "队列为空", text: "提交一个任务后,Codex 会串行执行并保存输出。" }) : [ diff --git a/src/components/frontend/src/index.ts b/src/components/frontend/src/index.ts index eeeecf22..5c882e9c 100644 --- a/src/components/frontend/src/index.ts +++ b/src/components/frontend/src/index.ts @@ -57,6 +57,7 @@ const clientConfig = JSON.stringify({ const indexHtmlTemplate = readFileSync(join(publicDir, "index.html"), "utf8"); const indexHtmlRootMarker = '
'; const codexQueueOverviewCache = new Map(); +const codexQueueOverviewRefreshes = new Map>(); const codexQueueOverviewCacheTtlMs = 10_000; const defaultCodexQueueOverviewPath = "/api/tasks/overview?limit=24&transcriptLimit=3&compact=1&afterSeq=0&preferId="; @@ -71,6 +72,17 @@ function cachedCodexQueueOverview(pathWithQuery: string, maxAgeMs = codexQueueOv } async function refreshCodexQueueOverview(pathWithQuery: string, timeoutMs = 800): Promise { + const existing = codexQueueOverviewRefreshes.get(pathWithQuery); + if (existing !== undefined) return existing; + const refresh = refreshCodexQueueOverviewUncached(pathWithQuery, timeoutMs) + .finally(() => { + codexQueueOverviewRefreshes.delete(pathWithQuery); + }); + codexQueueOverviewRefreshes.set(pathWithQuery, refresh); + return refresh; +} + +async function refreshCodexQueueOverviewUncached(pathWithQuery: string, timeoutMs = 800): Promise { const started = performance.now(); try { const response = await fetch(`http://codex-queue:4222${pathWithQuery}`, { @@ -123,9 +135,6 @@ async function spaShellHtml(req: Request, pathname: string): Promise { } refreshCodexQueueOverview(defaultCodexQueueOverviewPath, 2_000).catch(() => undefined); -setInterval(() => { - refreshCodexQueueOverview(defaultCodexQueueOverviewPath, 2_000).catch(() => undefined); -}, 5_000); const requestPerformanceSamples: RequestPerformanceSample[] = []; const operationPerformanceSamples: OperationPerformanceSample[] = []; const maxPerformanceSamples = 3000; diff --git a/src/components/frontend/src/pipeline.tsx b/src/components/frontend/src/pipeline.tsx index 3094b8fe..da08f16f 100644 --- a/src/components/frontend/src/pipeline.tsx +++ b/src/components/frontend/src/pipeline.tsx @@ -35,6 +35,10 @@ const pipelineGanttNodeColumnWidth = 72; const pipelineGanttHeaderHeight = 64; const pipelineGanttArrowTipInsetPx = 12; +function isDocumentVisible(): boolean { + return typeof document === "undefined" || document.visibilityState !== "hidden"; +} + function pipelinePercent(value: any, fallback: number): number { const number = Number.parseFloat(String(value || "")); return Number.isFinite(number) ? number / 100 : fallback; @@ -3448,12 +3452,12 @@ export function PipelinePage({ microservices, onRaw, apiBaseUrl = "/api" }: AnyR loadRequestRef.current = requestId; if (!silent) setState((prev: any) => ({ ...prev, loading: true, error: "" })); try { - const snapshotQuery = `__unideskArrayLimit=registry.components:80,runs:${pipelineSnapshotRunLimit}&_=${Date.now()}`; + const snapshotQuery = `__unideskArrayLimit=registry.components:80,runs:${pipelineSnapshotRunLimit}`; const [snapshot, oaDiagnostics, minimaxQuota] = await Promise.all([ requestJson(`${apiBaseUrl}/microservices/pipeline/proxy/api/snapshot?${snapshotQuery}`, { cache: "no-store" }), - requestJson(`${apiBaseUrl}/microservices/pipeline/proxy/api/oa-event-flow/diagnostics?_=${Date.now()}`, { cache: "no-store" }) + requestJson(`${apiBaseUrl}/microservices/pipeline/proxy/api/oa-event-flow/diagnostics`, { cache: "no-store" }) .catch((error: unknown) => ({ ok: false, error: errorMessage(error, "OA event flow diagnostics failed") })), - requestJson(`${apiBaseUrl}/microservices/pipeline/proxy/api/model-quota/minimax?_=${Date.now()}`, { cache: "no-store" }) + requestJson(`${apiBaseUrl}/microservices/pipeline/proxy/api/model-quota/minimax`, { cache: "no-store" }) .catch((error: unknown) => ({ ok: false, error: errorMessage(error, "MiniMax quota failed") })), ]); if (requestId !== loadRequestRef.current) return; @@ -3470,10 +3474,20 @@ export function PipelinePage({ microservices, onRaw, apiBaseUrl = "/api" }: AnyR useEffect(() => { load(); if (!service) return undefined; + const tick = (): void => { + if (isDocumentVisible()) load({ silent: true }); + }; const timer = window.setInterval(() => { - load({ silent: true }); + tick(); }, pipelineAutoRefreshMs); - return () => window.clearInterval(timer); + const onVisible = (): void => { + if (isDocumentVisible()) tick(); + }; + document.addEventListener("visibilitychange", onVisible); + return () => { + window.clearInterval(timer); + document.removeEventListener("visibilitychange", onVisible); + }; }, [service?.id, service?.runtime?.providerStatus, apiBaseUrl]); const runtime = microserviceRuntime(service); @@ -3587,8 +3601,8 @@ export function PipelinePage({ microservices, onRaw, apiBaseUrl = "/api" }: AnyR })); try { const [details, runSummary] = await Promise.all([ - requestJson(`${pipelineProxyPath(apiBaseUrl, `/api/node-control/runs/${encodeURIComponent(runId)}?tail=160&view=timeline`)}&_=${Date.now()}`, { cache: "no-store", strictJson: true }), - requestJson(`${pipelineProxyPath(apiBaseUrl, `/api/runs/${encodeURIComponent(runId)}`)}?_=${Date.now()}`, { cache: "no-store" }).catch((error: unknown) => ({ ok: false, runSummaryError: errorMessage(error, "抓取评分失败") })), + requestJson(pipelineProxyPath(apiBaseUrl, `/api/node-control/runs/${encodeURIComponent(runId)}?tail=160&view=timeline`), { cache: "no-store", strictJson: true }), + requestJson(pipelineProxyPath(apiBaseUrl, `/api/runs/${encodeURIComponent(runId)}`), { cache: "no-store" }).catch((error: unknown) => ({ ok: false, runSummaryError: errorMessage(error, "抓取评分失败") })), ]); if (requestId !== runDetailsRequestRef.current) return; setRunDetails({ runId, scale, loading: false, error: "", details: { ...details, run: isRecord(runSummary?.run) ? runSummary.run : undefined, runSummaryError: runSummary?.runSummaryError }, fetchedAt: new Date() }); @@ -3653,10 +3667,20 @@ export function PipelinePage({ microservices, onRaw, apiBaseUrl = "/api" }: AnyR return undefined; } void fetchRunDetails(activeRunId); + const tick = (): void => { + if (isDocumentVisible()) void fetchRunDetails(activeRunId, { silent: true }); + }; const timer = window.setInterval(() => { - void fetchRunDetails(activeRunId, { silent: true }); + tick(); }, pipelineAutoRefreshMs); - return () => window.clearInterval(timer); + const onVisible = (): void => { + if (isDocumentVisible()) tick(); + }; + document.addEventListener("visibilitychange", onVisible); + return () => { + window.clearInterval(timer); + document.removeEventListener("visibilitychange", onVisible); + }; }, [activeRunId, apiBaseUrl]); async function fetchNodeDetails(runId = activeRunId, nodeId = selectedNodeId): Promise {