From b41847853ab232630fb0d811967331aaf13a0496 Mon Sep 17 00:00:00 2001 From: Codex Date: Fri, 12 Jun 2026 14:18:55 +0000 Subject: [PATCH] fix: restore node resource status sync --- .agents/skills/unidesk-ops/SKILL.md | 4 +- scripts/cli.ts | 12 +- scripts/src/docker.ts | 78 +++++++++ scripts/src/help.ts | 5 +- scripts/src/provider-triage.ts | 8 +- src/components/backend-core/src/db.rs | 70 +++++++- src/components/backend-core/src/db.ts | 25 ++- .../backend-core/src/provider_registry.rs | 41 ++++- src/components/frontend/public/app.js | 150 +++++++++--------- src/components/frontend/src/app.tsx | 59 +++++-- src/components/shared/src/index.ts | 4 + 11 files changed, 347 insertions(+), 109 deletions(-) diff --git a/.agents/skills/unidesk-ops/SKILL.md b/.agents/skills/unidesk-ops/SKILL.md index 106a7bba..8c4f9fb6 100644 --- a/.agents/skills/unidesk-ops/SKILL.md +++ b/.agents/skills/unidesk-ops/SKILL.md @@ -1,6 +1,6 @@ --- name: unidesk-ops -description: UniDesk 手动运维 CLI — `server`、`gc` 和 PK01 `platform-db postgres` 子命令,覆盖主 server 启停、健康检查、swap、日志、Docker 镜像清理、磁盘 GC、服务重建和 PK01 host PostgreSQL 运维。用户提到 server start、server status、server swap、server rebuild、gc、磁盘清理、platform-db、PK01 PostgreSQL、运维时使用。 +description: UniDesk 手动运维 CLI — `server`、`gc` 和 PK01 `platform-db postgres` 子命令,覆盖主 server 启停、健康检查、swap、日志、Docker 镜像清理、磁盘 GC、服务重建/重启和 PK01 host PostgreSQL 运维。用户提到 server start、server status、server swap、server rebuild、server restart、gc、磁盘清理、platform-db、PK01 PostgreSQL、运维时使用。 --- # UniDesk 手动运维 CLI @@ -16,9 +16,11 @@ description: UniDesk 手动运维 CLI — `server`、`gc` 和 PK01 `platform-db ```bash bun scripts/cli.ts server start bun scripts/cli.ts server stop +bun scripts/cli.ts server restart ``` 异步 job 模式,返回 `job.id`、日志路径。`start` 执行 Docker 构建+启动,`stop` 停止 Compose project 全部服务。 +`restart` 是无构建单服务维护重启,使用现有镜像执行 `--no-build --no-deps --force-recreate` 并等待容器 `healthy/running`,适合刷新 provider-gateway 这类运行态异常,不能替代镜像发布或源码构建。 --- diff --git a/scripts/cli.ts b/scripts/cli.ts index c6c34ae8..128fec6c 100644 --- a/scripts/cli.ts +++ b/scripts/cli.ts @@ -1,6 +1,6 @@ import { readConfig } from "./src/config"; import { debugDispatch, debugHealth, debugTask, isDebugDispatchCommand, type DebugDispatchCommand } from "./src/debug"; -import { isRebuildableService, rebuildService, stackLogs, stackStatus, startStack, stopStack, unsupportedRebuildService } from "./src/docker"; +import { isRebuildableService, rebuildService, restartService, stackLogs, stackStatus, startStack, stopStack, unsupportedRebuildService, unsupportedRestartService } from "./src/docker"; import { emitError, emitJson, emitText, isRenderedCliResult } from "./src/output"; import { cancelJob, jobWithTail, listJobs, listJobsSummary, readJob, runJob } from "./src/jobs"; import { checkHelp, parseCheckOptions, runChecks, runRecoveryGuardrailsCheck } from "./src/check"; @@ -439,6 +439,16 @@ async function main(): Promise { emitJson(commandName, rebuildService(config, third)); return; } + if (sub === "restart") { + if (!isRebuildableService(third)) { + const result = unsupportedRestartService(third); + emitJson(commandName, result, false); + process.exitCode = 1; + return; + } + emitJson(commandName, restartService(config, third)); + return; + } } if (top === "gc") { diff --git a/scripts/src/docker.ts b/scripts/src/docker.ts index b19cda6b..3879c601 100644 --- a/scripts/src/docker.ts +++ b/scripts/src/docker.ts @@ -100,6 +100,17 @@ export function unsupportedRebuildService(value: string | undefined): Record { + const base = unsupportedRebuildService(value); + return { + ...base, + error: "unsupported-server-restart", + reason: typeof base.reason === "string" ? base.reason.replace(/server rebuild/g, "server restart") : base.reason, + replacement: typeof base.replacement === "string" ? base.replacement.replace(/server rebuild/g, "server restart") : base.replacement, + policy: "server restart is a no-build maintenance entrypoint and must not silently mutate upstream images, D601 services, database, or unknown objects", + }; +} + export function resolveComposeCommand(config: UniDeskConfig, envFile: string): string[] { const composeFile = rootPath(config.docker.composeFile); if (commandOk(["docker", "compose", "version"], repoRoot)) { @@ -431,6 +442,73 @@ export function rebuildService(config: UniDeskConfig, service: RebuildableServic }; } +export function restartService(config: UniDeskConfig, service: RebuildableService): unknown { + const runtimeEnv = writeComposeEnv(config, false); + const compose = resolveComposeCommand(config, runtimeEnv.envFile); + const listServiceContainersCommand = [ + "docker", + "ps", + "-q", + "--filter", + `label=com.docker.compose.project=${config.docker.projectName}`, + "--filter", + `label=com.docker.compose.service=${service}`, + "--filter", + "label=com.docker.compose.oneoff=False", + ]; + const upCommand = [...compose, "up", "-d", "--no-build", "--no-deps", "--force-recreate", service]; + const listAllServiceContainersCommand = [...listServiceContainersCommand]; + listAllServiceContainersCommand[2] = "-a"; + const validateScript = [ + "ready=0", + "for attempt in $(seq 1 60); do", + `cid=$(${shellJoin(listServiceContainersCommand)} || true)`, + "if [ -n \"$cid\" ]; then", + "health=$(docker inspect -f '{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}' $cid 2>/dev/null | head -1 || true)", + `echo "service_container_probe service=${service} attempt=$attempt cid=$cid health=$health"`, + "if [ \"$health\" = \"healthy\" ] || [ \"$health\" = \"running\" ]; then ready=1; break; fi", + "else", + `echo "service_container_probe service=${service} attempt=$attempt cid=missing"`, + "fi", + "sleep 1", + "done", + "if [ \"$ready\" != \"1\" ]; then", + `echo "service_container_not_ready service=${service}" >&2`, + `${shellJoin(listAllServiceContainersCommand)} --format '{{.ID}} {{.Names}} {{.Status}}' >&2 || true`, + "exit 1", + "fi", + ].join("\n"); + const script = [ + "set -euo pipefail", + `echo ${shellJoin(["restart_service", service, "no_build_force_recreate_with_validation"])}`, + restrictedHostAccessScript(config), + shellJoin(upCommand), + validateScript, + ].join("\n"); + const command = ["bash", "-lc", composeLockedScript(script)]; + const job = startJob("server_restart", command, `Restart and validate UniDesk ${service} without building images`); + return { + job, + runtimeEnv, + service, + command, + strategy: { + buildBeforeReplace: false, + noBuild: true, + replaceScope: { + projectLabel: config.docker.projectName, + serviceLabel: service, + }, + noDeps: true, + forceRecreate: true, + composeMutationLock: rootPath(".state", "locks", "server-compose.lock"), + jobRunner: "local", + postUpValidation: true, + namedVolumesPreserved: true, + }, + }; +} + function fixedPorts(config: UniDeskConfig): Array<{ name: string; port: number; listening: boolean }> { return [ { name: "frontend", port: config.network.frontend.port, listening: isPortListening(config.network.frontend.port) }, diff --git a/scripts/src/help.ts b/scripts/src/help.ts index 355b6a0f..ae416693 100644 --- a/scripts/src/help.ts +++ b/scripts/src/help.ts @@ -19,6 +19,7 @@ export function rootHelp(): unknown { { command: "server cleanup plan [--min-age-hours N] [--limit N]", description: "Dry-run Docker image cleanup plan only: list active/protected images, stale candidates older than the default 24h threshold, risk, estimated reclaim, and manual review commands without deleting anything." }, { command: "gc plan|run|db-trace|policy|remote [--confirm] [--logs-keep-days N] [--include-browser-cache]", description: "One-time main-server or remote provider disk relief and low-risk anti-bloat policy for logs, journald, allowlisted /tmp artifacts, scoped core dumps and explicit trace telemetry retention; plan is read-only and run requires --confirm." }, { command: "server rebuild ", description: "Maintenance-only local Compose rebuild for reviewed main-server services; frontend standard release must use CI artifact plus deploy apply dev/prod artifact consumers." }, + { command: "server restart ", description: "No-build single-service Compose restart for reviewed main-server maintenance recovery; returns an async job and validates the recreated container." }, { command: "provider attach [--master-server URL] [--up] [--force] | provider triage [--observed-error text] [--observed-scope scope] [--microservice id ...] [--full|--raw]", description: "Generate the minimal external provider-gateway env/compose bundle or run the low-noise read-only provider health triage contract." }, { command: "trans [operation args...] (alias of ssh ...)", description: "Open a Host SSH / WSL SSH maintenance session; provider WebSocket carries control and host.ssh.tcp-pool carries stdin/stdout/stderr data." }, { command: "trans gh:/owner/repo[/pr|/issue][/number[/1]] ls|cat|rg|patch-apply", description: "Treat GitHub PRs/issues as virtual text directories; `ls --full` shows state/floors/body length, and `patch-apply` updates first-floor `body.md` through UniDesk gh plus apply-patch v2." }, @@ -101,7 +102,7 @@ export function isHelpToken(value: string | undefined): boolean { export function serverHelp(action: string | undefined = undefined): unknown { return { - command: action === undefined || isHelpToken(action) ? "server start|stop|status|swap|logs|cleanup|rebuild" : `server ${action}`, + command: action === undefined || isHelpToken(action) ? "server start|stop|status|swap|logs|cleanup|rebuild|restart" : `server ${action}`, output: "json", description: "Manage the fixed main-server Docker Compose stack without exposing backend-core REST publicly.", usage: { @@ -112,6 +113,7 @@ export function serverHelp(action: string | undefined = undefined): unknown { logs: "bun scripts/cli.ts server logs [--tail-bytes N]", cleanup: "bun scripts/cli.ts server cleanup plan [--min-age-hours N] [--limit N]", rebuild: "bun scripts/cli.ts server rebuild ", + restart: "bun scripts/cli.ts server restart ", }, cleanupPlan: { dryRunOnly: true, @@ -138,6 +140,7 @@ export function serverHelp(action: string | undefined = undefined): unknown { maintenanceOnly: { frontend: "server rebuild frontend is not standard release evidence; publish 127.0.0.1:5000/unidesk/frontend: with CI, then consume it with deploy apply --env dev/prod --service frontend --commit ", userServices: "server rebuild for main-server user services is reserved for local maintenance, bootstrap or recovery and must not replace commit-pinned artifact CD", + restart: "server restart is for no-build single-service recovery when the existing image is already present and the goal is to refresh runtime state", }, nonRebuildableBoundary: { upstreamImages: ["filebrowser", "filebrowser-d601"], diff --git a/scripts/src/provider-triage.ts b/scripts/src/provider-triage.ts index 9a1d4da5..d0dfbe4d 100644 --- a/scripts/src/provider-triage.ts +++ b/scripts/src/provider-triage.ts @@ -164,11 +164,15 @@ function systemStatusSignal(debug: unknown, providerId: string): ProviderTriageS if (item === null) return signal("backend-core-system-status", "provider-gateway", "unknown", `no system status sample for ${providerId}`); const current = asRecord(item.current); const currentOk = current === null ? null : current.ok; - const status: ProviderSignalStatus = current === null ? "unknown" : currentOk === false ? "degraded" : "ok"; - return signal("backend-core-system-status", "provider-gateway", status, `system status current.ok=${String(currentOk)} updatedAt=${item.updatedAt ?? "null"}`, { + const stale = item.stale === true; + const status: ProviderSignalStatus = current === null ? stale ? "degraded" : "unknown" : currentOk === false ? "degraded" : "ok"; + return signal("backend-core-system-status", "provider-gateway", status, `system status current.ok=${String(currentOk)} stale=${String(stale)} updatedAt=${item.updatedAt ?? "null"}`, { providerId: item.providerId, nodeStatus: item.nodeStatus, updatedAt: item.updatedAt, + currentCollectedAt: item.currentCollectedAt ?? null, + stale, + staleSeconds: item.staleSeconds ?? null, current: current === null ? null : { ok: current.ok, collectedAt: current.collectedAt, diff --git a/src/components/backend-core/src/db.rs b/src/components/backend-core/src/db.rs index c7c05e74..0c671725 100644 --- a/src/components/backend-core/src/db.rs +++ b/src/components/backend-core/src/db.rs @@ -1,7 +1,7 @@ use std::sync::Arc; use anyhow::Context; -use chrono::{DateTime, Utc}; +use chrono::{DateTime, Duration, Utc}; use serde_json::{json, Value}; use tokio_postgres::Row; @@ -192,18 +192,43 @@ pub async fn update_provider_heartbeat( Ok(()) } +fn provider_collected_at( + state: &Arc, + provider_id: &str, + source: &str, + value: &str, +) -> DateTime { + match DateTime::parse_from_rfc3339(value) { + Ok(parsed) => parsed.with_timezone(&Utc), + Err(error) => { + state.log( + "warn", + "provider_status_collected_at_invalid", + Some(json!({ + "providerId": provider_id, + "source": source, + "value": value, + "error": error.to_string() + })), + ); + Utc::now() + } + } +} + pub async fn upsert_docker_status( state: &Arc, provider_id: &str, status: &JsonValue, collected_at: &str, ) -> anyhow::Result<()> { + let collected_at = provider_collected_at(state, provider_id, "docker_status", collected_at); let client = state.pool.get().await?; client .execute( r#" INSERT INTO unidesk_node_docker_status (provider_id, status, collected_at, updated_at) - VALUES ($1, $2, $3::timestamptz, now()) + VALUES ($1, $2, $3, now()) ON CONFLICT (provider_id) DO UPDATE SET status = EXCLUDED.status, collected_at = EXCLUDED.collected_at, @@ -224,12 +249,13 @@ pub async fn upsert_system_status( let cpu_percent = nested_number(status, "cpu", "percent"); let memory_percent = nested_number(status, "memory", "percent"); let disk_percent = nested_number(status, "disk", "percent"); + let collected_at = provider_collected_at(state, provider_id, "system_status", collected_at); let mut client = state.pool.get().await?; let tx = client.transaction().await?; tx.execute( r#" INSERT INTO unidesk_node_system_status (provider_id, status, collected_at, updated_at) - VALUES ($1, $2, $3::timestamptz, now()) + VALUES ($1, $2, $3, now()) ON CONFLICT (provider_id) DO UPDATE SET status = EXCLUDED.status, collected_at = EXCLUDED.collected_at, @@ -241,10 +267,18 @@ pub async fn upsert_system_status( tx.execute( r#" INSERT INTO unidesk_node_metric_samples (provider_id, collected_at, cpu_percent, memory_percent, disk_percent, sample) - VALUES ($1, $2::timestamptz, $3, $4, $5, $6) + VALUES ($1, $2, $3, $4, $5, $6) "#, - &[&provider_id, &collected_at, &cpu_percent, &memory_percent, &disk_percent, status], - ).await?; + &[ + &provider_id, + &collected_at, + &cpu_percent, + &memory_percent, + &disk_percent, + status, + ], + ) + .await?; tx.execute( r#" DELETE FROM unidesk_node_metric_samples @@ -321,6 +355,18 @@ fn metric_point_from_sample(sample: &JsonValue, collected_at: &str) -> JsonValue }) } +const SYSTEM_STATUS_STALE_AFTER_SECONDS: i64 = 300; + +fn system_status_is_stale(collected_at: Option>, now: DateTime) -> bool { + collected_at + .map(|value| now.signed_duration_since(value) > Duration::seconds(SYSTEM_STATUS_STALE_AFTER_SECONDS)) + .unwrap_or(false) +} + +fn system_status_age_seconds(collected_at: Option>, now: DateTime) -> Option { + collected_at.map(|value| now.signed_duration_since(value).num_seconds().max(0)) +} + pub async fn get_node_system_statuses( state: &Arc, limit: i64, @@ -328,7 +374,7 @@ pub async fn get_node_system_statuses( let client = state.pool.get().await?; let current_rows = client.query( r#" - SELECT n.provider_id, n.name, n.status AS node_status, s.status AS system_status, s.updated_at + SELECT n.provider_id, n.name, n.status AS node_status, s.status AS system_status, s.collected_at AS system_collected_at, s.updated_at FROM unidesk_nodes n LEFT JOIN unidesk_node_system_status s ON s.provider_id = n.provider_id ORDER BY n.status DESC, n.provider_id ASC @@ -366,15 +412,23 @@ pub async fn get_node_system_statuses( &collected_at.to_rfc3339_opts(chrono::SecondsFormat::Millis, true), )); } + let now = Utc::now(); Ok(current_rows.into_iter().map(|row| { let provider_id: String = row.get("provider_id"); let updated_at: Option> = row.get("updated_at"); + let system_collected_at: Option> = row.get("system_collected_at"); let system_status: Option = row.get("system_status"); + let stale = system_status_is_stale(system_collected_at, now); + let current = if stale { None } else { system_status.clone() }; json!({ "providerId": provider_id, "name": row.get::<_, String>("name"), "nodeStatus": if row.get::<_, String>("node_status") == "online" { "online" } else { "offline" }, - "current": system_status, + "current": current, + "lastKnown": system_status, + "currentCollectedAt": system_collected_at.map(|value| value.to_rfc3339_opts(chrono::SecondsFormat::Millis, true)), + "stale": stale, + "staleSeconds": system_status_age_seconds(system_collected_at, now), "history": history_by_provider.remove(&provider_id).unwrap_or_default(), "updatedAt": updated_at.map(|value| value.to_rfc3339_opts(chrono::SecondsFormat::Millis, true)), }) diff --git a/src/components/backend-core/src/db.ts b/src/components/backend-core/src/db.ts index c4ce2270..41651d18 100644 --- a/src/components/backend-core/src/db.ts +++ b/src/components/backend-core/src/db.ts @@ -237,9 +237,22 @@ function metricPointFromSample(sample: unknown, collectedAt: string): JsonValue }; } +const SYSTEM_STATUS_STALE_AFTER_SECONDS = 300; + +function systemStatusAgeSeconds(collectedAt: unknown, now: Date): number | null { + const date = collectedAt instanceof Date ? collectedAt : typeof collectedAt === "string" ? new Date(collectedAt) : null; + if (date === null || Number.isNaN(date.getTime())) return null; + return Math.max(0, Math.floor((now.getTime() - date.getTime()) / 1000)); +} + +function systemStatusIsStale(collectedAt: unknown, now: Date): boolean { + const ageSeconds = systemStatusAgeSeconds(collectedAt, now); + return ageSeconds !== null && ageSeconds > SYSTEM_STATUS_STALE_AFTER_SECONDS; +} + export async function getNodeSystemStatuses(limit: number): Promise { const currentRows = await sql()>>` - SELECT n.provider_id, n.name, n.status AS node_status, s.status AS system_status, s.updated_at + SELECT n.provider_id, n.name, n.status AS node_status, s.status AS system_status, s.collected_at AS system_collected_at, s.updated_at FROM unidesk_nodes n LEFT JOIN unidesk_node_system_status s ON s.provider_id = n.provider_id ORDER BY n.status DESC, n.provider_id ASC @@ -265,13 +278,21 @@ export async function getNodeSystemStatuses(limit: number): Promise { const providerId = String(row.provider_id); + const lastKnown = row.system_status === null || row.system_status === undefined ? null : (row.system_status as JsonValue); + const currentCollectedAt = row.system_collected_at instanceof Date ? row.system_collected_at.toISOString() : row.system_collected_at === null || row.system_collected_at === undefined ? null : String(row.system_collected_at); + const stale = systemStatusIsStale(row.system_collected_at, now); return { providerId, name: String(row.name), nodeStatus: row.node_status === "online" ? "online" : "offline", - current: row.system_status === null || row.system_status === undefined ? null : (row.system_status as JsonValue), + current: stale ? null : lastKnown, + lastKnown, + currentCollectedAt, + stale, + staleSeconds: systemStatusAgeSeconds(row.system_collected_at, now), history: historyByProvider.get(providerId) ?? [], updatedAt: row.updated_at instanceof Date ? row.updated_at.toISOString() : row.updated_at === null || row.updated_at === undefined ? null : String(row.updated_at), }; diff --git a/src/components/backend-core/src/provider_registry.rs b/src/components/backend-core/src/provider_registry.rs index 79724275..7268e655 100644 --- a/src/components/backend-core/src/provider_registry.rs +++ b/src/components/backend-core/src/provider_registry.rs @@ -571,22 +571,22 @@ async fn provider_socket_task(state: Arc, socket: WebSocket) { while let Some(message) = receiver_ws.next().await { match message { Ok(Message::Text(text)) => { - if let Err(error) = handle_provider_text(&state, &connection, text).await { + if let Err(error) = handle_provider_text(&state, &connection, &text).await { state.log( "error", "provider_message_failed", - Some(json!({ "error": error.to_string() })), + Some(provider_message_error_context(&text, &error)), ); let _ = tx.send(Message::Text(json!({ "type": "ack", "requestId": "message", "ok": false, "message": error.to_string() }).to_string())); } } Ok(Message::Binary(bytes)) => { if let Ok(text) = String::from_utf8(bytes.to_vec()) { - if let Err(error) = handle_provider_text(&state, &connection, text).await { + if let Err(error) = handle_provider_text(&state, &connection, &text).await { state.log( "error", "provider_message_failed", - Some(json!({ "error": error.to_string() })), + Some(provider_message_error_context(&text, &error)), ); } } @@ -629,12 +629,36 @@ async fn provider_socket_task(state: Arc, socket: WebSocket) { send_task.abort(); } +fn provider_message_error_context(text: &str, error: &anyhow::Error) -> Value { + let parsed = serde_json::from_str::(text).ok(); + json!({ + "error": error.to_string(), + "messageType": parsed + .as_ref() + .and_then(|value| value.get("type")) + .and_then(Value::as_str) + .unwrap_or("unknown"), + "providerId": parsed + .as_ref() + .and_then(|value| value.get("providerId")) + .and_then(Value::as_str) + .unwrap_or("unknown"), + "requestId": parsed + .as_ref() + .and_then(|value| value.get("requestId")) + .and_then(Value::as_str) + .unwrap_or("unknown"), + "textBytes": text.len(), + "textPreview": text.chars().take(300).collect::(), + }) +} + async fn handle_provider_text( state: &Arc, connection: &Arc, - text: String, + text: &str, ) -> anyhow::Result<()> { - let message: Value = serde_json::from_str(&text)?; + let message: Value = serde_json::from_str(text)?; let provider_id = message .get("providerId") .and_then(Value::as_str) @@ -845,6 +869,7 @@ pub async fn mark_stale_providers_offline(state: &Arc) -> anyhow::Resu return Ok(()); } let timeout_ms = state.config.heartbeat_timeout_ms as i64; + let cutoff = Utc::now() - Duration::milliseconds(timeout_ms); let client = state.pool.get().await?; let rows = client .query( @@ -853,10 +878,10 @@ pub async fn mark_stale_providers_offline(state: &Arc) -> anyhow::Resu SET status = 'offline', updated_at = now() WHERE status = 'online' AND last_heartbeat IS NOT NULL - AND last_heartbeat < now() - ($1 * interval '1 millisecond') + AND last_heartbeat < $1 RETURNING provider_id "#, - &[&timeout_ms], + &[&cutoff], ) .await?; for row in rows { diff --git a/src/components/frontend/public/app.js b/src/components/frontend/public/app.js index a1e0d68b..16dfe943 100644 --- a/src/components/frontend/public/app.js +++ b/src/components/frontend/public/app.js @@ -1,71 +1,71 @@ -(()=>{var ME=Object.create;var{getPrototypeOf:CE,defineProperty:UU,getOwnPropertyNames:pE}=Object;var mE=Object.prototype.hasOwnProperty;function xE(u){return this[u]}var RE,bE,bu=(u,l,f)=>{var n=u!=null&&typeof u==="object";if(n){var i=l?RE??=new WeakMap:bE??=new WeakMap,y=i.get(u);if(y)return y}f=u!=null?ME(CE(u)):{};let _=l||!u||!u.__esModule?UU(f,"default",{value:u,enumerable:!0}):f;for(let $ of pE(u))if(!mE.call(_,$))UU(_,$,{get:xE.bind(u,$),enumerable:!0});if(n)i.set(u,_);return _};var F0=(u,l)=>()=>(l||u((l={exports:{}}).exports,l),l.exports);var Jl=((u)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(u,{get:(l,f)=>(typeof require<"u"?require:l)[f]}):u)(function(u){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+u+'" is not supported')});var HU=F0((_l)=>{var W$=Symbol.for("react.element"),kE=Symbol.for("react.portal"),hE=Symbol.for("react.fragment"),IE=Symbol.for("react.strict_mode"),vE=Symbol.for("react.profiler"),gE=Symbol.for("react.provider"),sE=Symbol.for("react.context"),aE=Symbol.for("react.forward_ref"),oE=Symbol.for("react.suspense"),dE=Symbol.for("react.memo"),eE=Symbol.for("react.lazy"),NU=Symbol.iterator;function uH(u){if(u===null||typeof u!=="object")return null;return u=NU&&u[NU]||u["@@iterator"],typeof u==="function"?u:null}var qU={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},LU=Object.assign,KU={};function Sy(u,l,f){this.props=u,this.context=l,this.refs=KU,this.updater=f||qU}Sy.prototype.isReactComponent={};Sy.prototype.setState=function(u,l){if(typeof u!=="object"&&typeof u!=="function"&&u!=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,u,l,"setState")};Sy.prototype.forceUpdate=function(u){this.updater.enqueueForceUpdate(this,u,"forceUpdate")};function zU(){}zU.prototype=Sy.prototype;function Q2(u,l,f){this.props=u,this.context=l,this.refs=KU,this.updater=f||qU}var U2=Q2.prototype=new zU;U2.constructor=Q2;LU(U2,Sy.prototype);U2.isPureReactComponent=!0;var FU=Array.isArray,GU=Object.prototype.hasOwnProperty,N2={current:null},wU={key:!0,ref:!0,__self:!0,__source:!0};function ZU(u,l,f){var n,i={},y=null,_=null;if(l!=null)for(n in l.ref!==void 0&&(_=l.ref),l.key!==void 0&&(y=""+l.key),l)GU.call(l,n)&&!wU.hasOwnProperty(n)&&(i[n]=l[n]);var $=arguments.length-2;if($===1)i.children=f;else if(1<$){for(var r=Array($),j=0;j<$;j++)r[j]=arguments[j+2];i.children=r}if(u&&u.defaultProps)for(n in $=u.defaultProps,$)i[n]===void 0&&(i[n]=$[n]);return{$$typeof:W$,type:u,key:y,ref:_,props:i,_owner:N2.current}}function lH(u,l){return{$$typeof:W$,type:u.type,key:l,ref:u.ref,props:u.props,_owner:u._owner}}function F2(u){return typeof u==="object"&&u!==null&&u.$$typeof===W$}function fH(u){var l={"=":"=0",":":"=2"};return"$"+u.replace(/[=:]/g,function(f){return l[f]})}var WU=/\/+/g;function J2(u,l){return typeof u==="object"&&u!==null&&u.key!=null?fH(""+u.key):l.toString(36)}function n6(u,l,f,n,i){var y=typeof u;if(y==="undefined"||y==="boolean")u=null;var _=!1;if(u===null)_=!0;else switch(y){case"string":case"number":_=!0;break;case"object":switch(u.$$typeof){case W$:case kE:_=!0}}if(_)return _=u,i=i(_),u=n===""?"."+J2(_,0):n,FU(i)?(f="",u!=null&&(f=u.replace(WU,"$&/")+"/"),n6(i,l,f,"",function(j){return j})):i!=null&&(F2(i)&&(i=lH(i,f+(!i.key||_&&_.key===i.key?"":(""+i.key).replace(WU,"$&/")+"/")+u)),l.push(i)),1;if(_=0,n=n===""?".":n+":",FU(u))for(var $=0;${OU.exports=HU()});var PU=F0((wl)=>{function K2(u,l){var f=u.length;u.push(l);u:for(;0>>1,i=u[n];if(0<_6(i,l))u[n]=l,u[f]=i,f=n;else break u}}function a0(u){return u.length===0?null:u[0]}function j6(u){if(u.length===0)return null;var l=u[0],f=u.pop();if(f!==l){u[0]=f;u:for(var n=0,i=u.length,y=i>>>1;n_6($,f))r_6(j,$)?(u[n]=j,u[r]=f,n=r):(u[n]=$,u[_]=f,n=_);else if(r_6(j,f))u[n]=j,u[r]=f,n=r;else break u}}return l}function _6(u,l){var f=u.sortIndex-l.sortIndex;return f!==0?f:u.id-l.id}if(typeof performance==="object"&&typeof performance.now==="function")z2=performance,wl.unstable_now=function(){return z2.now()};else $6=Date,G2=$6.now(),wl.unstable_now=function(){return $6.now()-G2};var z2,$6,G2,Kn=[],B1=[],rH=1,X0=null,Zf=3,J6=!1,ci=!1,L$=!1,XU=typeof setTimeout==="function"?setTimeout:null,YU=typeof clearTimeout==="function"?clearTimeout:null,cU=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function w2(u){for(var l=a0(B1);l!==null;){if(l.callback===null)j6(B1);else if(l.startTime<=u)j6(B1),l.sortIndex=l.expirationTime,K2(Kn,l);else break;l=a0(B1)}}function E2(u){if(L$=!1,w2(u),!ci)if(a0(Kn)!==null)ci=!0,O2(H2);else{var l=a0(B1);l!==null&&T2(E2,l.startTime-u)}}function H2(u,l){ci=!1,L$&&(L$=!1,YU(K$),K$=-1),J6=!0;var f=Zf;try{w2(l);for(X0=a0(Kn);X0!==null&&(!(X0.expirationTime>l)||u&&!SU());){var n=X0.callback;if(typeof n==="function"){X0.callback=null,Zf=X0.priorityLevel;var i=n(X0.expirationTime<=l);l=wl.unstable_now(),typeof i==="function"?X0.callback=i:X0===a0(Kn)&&j6(Kn),w2(l)}else j6(Kn);X0=a0(Kn)}if(X0!==null)var y=!0;else{var _=a0(B1);_!==null&&T2(E2,_.startTime-l),y=!1}return y}finally{X0=null,Zf=f,J6=!1}}var Q6=!1,r6=null,K$=-1,tU=5,DU=-1;function SU(){return wl.unstable_now()-DUu||125n?(u.sortIndex=f,K2(B1,u),a0(Kn)===null&&u===a0(B1)&&(L$?(YU(K$),K$=-1):L$=!0,T2(E2,f-n))):(u.sortIndex=i,K2(Kn,u),ci||J6||(ci=!0,O2(H2))),u};wl.unstable_shouldYield=SU;wl.unstable_wrapCallback=function(u){var l=Zf;return function(){var f=Zf;Zf=l;try{return u.apply(this,arguments)}finally{Zf=f}}}});var CU=F0((Ym,MU)=>{MU.exports=PU()});var mW=F0((G0)=>{var AH=Wl(),K0=CU();function Ku(u){for(var l="https://reactjs.org/docs/error-decoder.html?invariant="+u,f=1;f"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),s2=Object.prototype.hasOwnProperty,jH=/^[: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]*$/,pU={},mU={};function JH(u){if(s2.call(mU,u))return!0;if(s2.call(pU,u))return!1;if(jH.test(u))return mU[u]=!0;return pU[u]=!0,!1}function QH(u,l,f,n){if(f!==null&&f.type===0)return!1;switch(typeof l){case"function":case"symbol":return!0;case"boolean":if(n)return!1;if(f!==null)return!f.acceptsBooleans;return u=u.toLowerCase().slice(0,5),u!=="data-"&&u!=="aria-";default:return!1}}function UH(u,l,f,n){if(l===null||typeof l>"u"||QH(u,l,f,n))return!0;if(n)return!1;if(f!==null)switch(f.type){case 3:return!l;case 4:return l===!1;case 5:return isNaN(l);case 6:return isNaN(l)||1>l}return!1}function Rf(u,l,f,n,i,y,_){this.acceptsBooleans=l===2||l===3||l===4,this.attributeName=n,this.attributeNamespace=i,this.mustUseProperty=f,this.propertyName=u,this.type=l,this.sanitizeURL=y,this.removeEmptyString=_}var Wf={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(u){Wf[u]=new Rf(u,0,!1,u,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(u){var l=u[0];Wf[l]=new Rf(l,1,!1,u[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(u){Wf[u]=new Rf(u,2,!1,u.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(u){Wf[u]=new Rf(u,2,!1,u,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(u){Wf[u]=new Rf(u,3,!1,u.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(u){Wf[u]=new Rf(u,3,!0,u,null,!1,!1)});["capture","download"].forEach(function(u){Wf[u]=new Rf(u,4,!1,u,null,!1,!1)});["cols","rows","size","span"].forEach(function(u){Wf[u]=new Rf(u,6,!1,u,null,!1,!1)});["rowSpan","start"].forEach(function(u){Wf[u]=new Rf(u,5,!1,u.toLowerCase(),null,!1,!1)});var b5=/[\-:]([a-z])/g;function k5(u){return u[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(u){var l=u.replace(b5,k5);Wf[l]=new Rf(l,1,!1,u,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(u){var l=u.replace(b5,k5);Wf[l]=new Rf(l,1,!1,u,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(u){var l=u.replace(b5,k5);Wf[l]=new Rf(l,1,!1,u,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(u){Wf[u]=new Rf(u,1,!1,u.toLowerCase(),null,!1,!1)});Wf.xlinkHref=new Rf("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(u){Wf[u]=new Rf(u,1,!1,u.toLowerCase(),null,!0,!0)});function h5(u,l,f,n){var i=Wf.hasOwnProperty(l)?Wf[l]:null;if(i!==null?i.type!==0:n||!(2$||i[_]!==y[$]){var r=` -`+i[_].replace(" at new "," at ");return u.displayName&&r.includes("")&&(r=r.replace("",u.displayName)),r}while(1<=_&&0<=$);break}}}finally{B2=!1,Error.prepareStackTrace=f}return(u=u?u.displayName||u.name:"")?T$(u):""}function NH(u){switch(u.tag){case 5:return T$(u.type);case 16:return T$("Lazy");case 13:return T$("Suspense");case 19:return T$("SuspenseList");case 0:case 2:case 15:return u=c2(u.type,!1),u;case 11:return u=c2(u.type.render,!1),u;case 1:return u=c2(u.type,!0),u;default:return""}}function e2(u){if(u==null)return null;if(typeof u==="function")return u.displayName||u.name||null;if(typeof u==="string")return u;switch(u){case py:return"Fragment";case Cy:return"Portal";case a2:return"Profiler";case I5:return"StrictMode";case o2:return"Suspense";case d2:return"SuspenseList"}if(typeof u==="object")switch(u.$$typeof){case hN:return(u.displayName||"Context")+".Consumer";case kN:return(u._context.displayName||"Context")+".Provider";case v5:var l=u.render;return u=u.displayName,u||(u=l.displayName||l.name||"",u=u!==""?"ForwardRef("+u+")":"ForwardRef"),u;case g5:return l=u.displayName||null,l!==null?l:e2(u.type)||"Memo";case X1:l=u._payload,u=u._init;try{return e2(u(l))}catch(f){}}return null}function FH(u){var l=u.type;switch(u.tag){case 24:return"Cache";case 9:return(l.displayName||"Context")+".Consumer";case 10:return(l._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return u=l.render,u=u.displayName||u.name||"",l.displayName||(u!==""?"ForwardRef("+u+")":"ForwardRef");case 7:return"Fragment";case 5:return l;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return e2(l);case 8:return l===I5?"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 l==="function")return l.displayName||l.name||null;if(typeof l==="string")return l}return null}function h1(u){switch(typeof u){case"boolean":case"number":case"string":case"undefined":return u;case"object":return u;default:return""}}function vN(u){var l=u.type;return(u=u.nodeName)&&u.toLowerCase()==="input"&&(l==="checkbox"||l==="radio")}function WH(u){var l=vN(u)?"checked":"value",f=Object.getOwnPropertyDescriptor(u.constructor.prototype,l),n=""+u[l];if(!u.hasOwnProperty(l)&&typeof f<"u"&&typeof f.get==="function"&&typeof f.set==="function"){var{get:i,set:y}=f;return Object.defineProperty(u,l,{configurable:!0,get:function(){return i.call(this)},set:function(_){n=""+_,y.call(this,_)}}),Object.defineProperty(u,l,{enumerable:f.enumerable}),{getValue:function(){return n},setValue:function(_){n=""+_},stopTracking:function(){u._valueTracker=null,delete u[l]}}}}function N6(u){u._valueTracker||(u._valueTracker=WH(u))}function gN(u){if(!u)return!1;var l=u._valueTracker;if(!l)return!0;var f=l.getValue(),n="";return u&&(n=vN(u)?u.checked?"true":"false":u.value),u=n,u!==f?(l.setValue(u),!0):!1}function p6(u){if(u=u||(typeof document<"u"?document:void 0),typeof u>"u")return null;try{return u.activeElement||u.body}catch(l){return u.body}}function u5(u,l){var f=l.checked;return pl({},l,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:f!=null?f:u._wrapperState.initialChecked})}function RU(u,l){var f=l.defaultValue==null?"":l.defaultValue,n=l.checked!=null?l.checked:l.defaultChecked;f=h1(l.value!=null?l.value:f),u._wrapperState={initialChecked:n,initialValue:f,controlled:l.type==="checkbox"||l.type==="radio"?l.checked!=null:l.value!=null}}function sN(u,l){l=l.checked,l!=null&&h5(u,"checked",l,!1)}function l5(u,l){sN(u,l);var f=h1(l.value),n=l.type;if(f!=null)if(n==="number"){if(f===0&&u.value===""||u.value!=f)u.value=""+f}else u.value!==""+f&&(u.value=""+f);else if(n==="submit"||n==="reset"){u.removeAttribute("value");return}l.hasOwnProperty("value")?f5(u,l.type,f):l.hasOwnProperty("defaultValue")&&f5(u,l.type,h1(l.defaultValue)),l.checked==null&&l.defaultChecked!=null&&(u.defaultChecked=!!l.defaultChecked)}function bU(u,l,f){if(l.hasOwnProperty("value")||l.hasOwnProperty("defaultValue")){var n=l.type;if(!(n!=="submit"&&n!=="reset"||l.value!==void 0&&l.value!==null))return;l=""+u._wrapperState.initialValue,f||l===u.value||(u.value=l),u.defaultValue=l}f=u.name,f!==""&&(u.name=""),u.defaultChecked=!!u._wrapperState.initialChecked,f!==""&&(u.name=f)}function f5(u,l,f){if(l!=="number"||p6(u.ownerDocument)!==u)f==null?u.defaultValue=""+u._wrapperState.initialValue:u.defaultValue!==""+f&&(u.defaultValue=""+f)}var V$=Array.isArray;function ay(u,l,f,n){if(u=u.options,l){l={};for(var i=0;i"+l.valueOf().toString()+"";for(l=F6.firstChild;u.firstChild;)u.removeChild(u.firstChild);for(;l.firstChild;)u.appendChild(l.firstChild)}});function h$(u,l){if(l){var f=u.firstChild;if(f&&f===u.lastChild&&f.nodeType===3){f.nodeValue=l;return}}u.textContent=l}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},qH=["Webkit","ms","Moz","O"];Object.keys(S$).forEach(function(u){qH.forEach(function(l){l=l+u.charAt(0).toUpperCase()+u.substring(1),S$[l]=S$[u]})});function eN(u,l,f){return l==null||typeof l==="boolean"||l===""?"":f||typeof l!=="number"||l===0||S$.hasOwnProperty(u)&&S$[u]?(""+l).trim():l+"px"}function uF(u,l){u=u.style;for(var f in l)if(l.hasOwnProperty(f)){var n=f.indexOf("--")===0,i=eN(f,l[f],n);f==="float"&&(f="cssFloat"),n?u.setProperty(f,i):u[f]=i}}var LH=pl({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 y5(u,l){if(l){if(LH[u]&&(l.children!=null||l.dangerouslySetInnerHTML!=null))throw Error(Ku(137,u));if(l.dangerouslySetInnerHTML!=null){if(l.children!=null)throw Error(Ku(60));if(typeof l.dangerouslySetInnerHTML!=="object"||!("__html"in l.dangerouslySetInnerHTML))throw Error(Ku(61))}if(l.style!=null&&typeof l.style!=="object")throw Error(Ku(62))}}function _5(u,l){if(u.indexOf("-")===-1)return typeof l.is==="string";switch(u){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 $5=null;function s5(u){return u=u.target||u.srcElement||window,u.correspondingUseElement&&(u=u.correspondingUseElement),u.nodeType===3?u.parentNode:u}var r5=null,oy=null,dy=null;function IU(u){if(u=A3(u)){if(typeof r5!=="function")throw Error(Ku(280));var l=u.stateNode;l&&(l=U8(l),r5(u.stateNode,u.type,l))}}function lF(u){oy?dy?dy.push(u):dy=[u]:oy=u}function fF(){if(oy){var u=oy,l=dy;if(dy=oy=null,IU(u),l)for(u=0;u>>=0,u===0?32:31-(BH(u)/cH|0)|0}var W6=64,q6=4194304;function B$(u){switch(u&-u){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 u&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return u&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return u}}function b6(u,l){var f=u.pendingLanes;if(f===0)return 0;var n=0,i=u.suspendedLanes,y=u.pingedLanes,_=f&268435455;if(_!==0){var $=_&~i;$!==0?n=B$($):(y&=_,y!==0&&(n=B$(y)))}else _=f&~i,_!==0?n=B$(_):y!==0&&(n=B$(y));if(n===0)return 0;if(l!==0&&l!==n&&(l&i)===0&&(i=n&-n,y=l&-l,i>=y||i===16&&(y&4194240)!==0))return l;if((n&4)!==0&&(n|=f&16),l=u.entangledLanes,l!==0)for(u=u.entanglements,l&=n;0f;f++)l.push(u);return l}function $3(u,l,f){u.pendingLanes|=l,l!==536870912&&(u.suspendedLanes=0,u.pingedLanes=0),u=u.eventTimes,l=31-ln(l),u[l]=f}function DH(u,l){var f=u.pendingLanes&~l;u.pendingLanes=l,u.suspendedLanes=0,u.pingedLanes=0,u.expiredLanes&=l,u.mutableReadLanes&=l,u.entangledLanes&=l,l=u.entanglements;var n=u.eventTimes;for(u=u.expirationTimes;0=M$),lN=String.fromCharCode(32),fN=!1;function wF(u,l){switch(u){case"keyup":return rO.indexOf(l.keyCode)!==-1;case"keydown":return l.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function ZF(u){return u=u.detail,typeof u==="object"&&"data"in u?u.data:null}var my=!1;function jO(u,l){switch(u){case"compositionend":return ZF(l);case"keypress":if(l.which!==32)return null;return fN=!0,lN;case"textInput":return u=l.data,u===lN&&fN?null:u;default:return null}}function JO(u,l){if(my)return u==="compositionend"||!n9&&wF(u,l)?(u=zF(),B6=u9=S1=null,my=!1,u):null;switch(u){case"paste":return null;case"keypress":if(!(l.ctrlKey||l.altKey||l.metaKey)||l.ctrlKey&&l.altKey){if(l.char&&1=l)return{node:f,offset:l-u};u=n}u:{for(;f;){if(f.nextSibling){f=f.nextSibling;break u}f=f.parentNode}f=void 0}f=yN(f)}}function TF(u,l){return u&&l?u===l?!0:u&&u.nodeType===3?!1:l&&l.nodeType===3?TF(u,l.parentNode):("contains"in u)?u.contains(l):u.compareDocumentPosition?!!(u.compareDocumentPosition(l)&16):!1:!1}function VF(){for(var u=window,l=p6();l instanceof u.HTMLIFrameElement;){try{var f=typeof l.contentWindow.location.href==="string"}catch(n){f=!1}if(f)u=l.contentWindow;else break;l=p6(u.document)}return l}function i9(u){var l=u&&u.nodeName&&u.nodeName.toLowerCase();return l&&(l==="input"&&(u.type==="text"||u.type==="search"||u.type==="tel"||u.type==="url"||u.type==="password")||l==="textarea"||u.contentEditable==="true")}function zO(u){var l=VF(),f=u.focusedElem,n=u.selectionRange;if(l!==f&&f&&f.ownerDocument&&TF(f.ownerDocument.documentElement,f)){if(n!==null&&i9(f)){if(l=n.start,u=n.end,u===void 0&&(u=l),"selectionStart"in f)f.selectionStart=l,f.selectionEnd=Math.min(u,f.value.length);else if(u=(l=f.ownerDocument||document)&&l.defaultView||window,u.getSelection){u=u.getSelection();var i=f.textContent.length,y=Math.min(n.start,i);n=n.end===void 0?y:Math.min(n.end,i),!u.extend&&y>n&&(i=n,n=y,y=i),i=_N(f,y);var _=_N(f,n);i&&_&&(u.rangeCount!==1||u.anchorNode!==i.node||u.anchorOffset!==i.offset||u.focusNode!==_.node||u.focusOffset!==_.offset)&&(l=l.createRange(),l.setStart(i.node,i.offset),u.removeAllRanges(),y>n?(u.addRange(l),u.extend(_.node,_.offset)):(l.setEnd(_.node,_.offset),u.addRange(l)))}}l=[];for(u=f;u=u.parentNode;)u.nodeType===1&&l.push({element:u,left:u.scrollLeft,top:u.scrollTop});typeof f.focus==="function"&&f.focus();for(f=0;f=document.documentMode,xy=null,N5=null,p$=null,F5=!1;function $N(u,l,f){var n=f.window===f?f.document:f.nodeType===9?f:f.ownerDocument;F5||xy==null||xy!==p6(n)||(n=xy,("selectionStart"in n)&&i9(n)?n={start:n.selectionStart,end:n.selectionEnd}:(n=(n.ownerDocument&&n.ownerDocument.defaultView||window).getSelection(),n={anchorNode:n.anchorNode,anchorOffset:n.anchorOffset,focusNode:n.focusNode,focusOffset:n.focusOffset}),p$&&o$(p$,n)||(p$=n,n=I6(N5,"onSelect"),0ky||(u.current=Z5[ky],Z5[ky]=null,ky--)}function Zl(u,l){ky++,Z5[ky]=u.current,u.current=l}var I1={},Tf=g1(I1),ef=g1(!1),pi=I1;function n_(u,l){var f=u.type.contextTypes;if(!f)return I1;var n=u.stateNode;if(n&&n.__reactInternalMemoizedUnmaskedChildContext===l)return n.__reactInternalMemoizedMaskedChildContext;var i={},y;for(y in f)i[y]=l[y];return n&&(u=u.stateNode,u.__reactInternalMemoizedUnmaskedChildContext=l,u.__reactInternalMemoizedMaskedChildContext=i),i}function u0(u){return u=u.childContextTypes,u!==null&&u!==void 0}function g6(){Tl(ef),Tl(Tf)}function NN(u,l,f){if(Tf.current!==I1)throw Error(Ku(168));Zl(Tf,l),Zl(ef,f)}function MF(u,l,f){var n=u.stateNode;if(l=l.childContextTypes,typeof n.getChildContext!=="function")return f;n=n.getChildContext();for(var i in n)if(!(i in l))throw Error(Ku(108,FH(u)||"Unknown",i));return pl({},f,n)}function s6(u){return u=(u=u.stateNode)&&u.__reactInternalMemoizedMergedChildContext||I1,pi=Tf.current,Zl(Tf,u),Zl(ef,ef.current),!0}function FN(u,l,f){var n=u.stateNode;if(!n)throw Error(Ku(169));f?(u=MF(u,l,pi),n.__reactInternalMemoizedMergedChildContext=u,Tl(ef),Tl(Tf),Zl(Tf,u)):Tl(ef),Zl(ef,f)}var vn=null,N8=!1,m2=!1;function CF(u){vn===null?vn=[u]:vn.push(u)}function cO(u){N8=!0,CF(u)}function s1(){if(!m2&&vn!==null){m2=!0;var u=0,l=ql;try{var f=vn;for(ql=1;u>=_,i-=_,gn=1<<32-ln(l)+i|f<X?(S=c,c=null):S=c.sibling;var p=U(W,c,q[X],z);if(p===null){c===null&&(c=S);break}u&&c&&p.alternate===null&&l(W,c),K=y(p,K,X),T===null?Z=p:T.sibling=p,T=p,c=S}if(X===q.length)return f(W,c),Xl&&Yi(W,X),Z;if(c===null){for(;XX?(S=c,c=null):S=c.sibling;var Y=U(W,c,p.value,z);if(Y===null){c===null&&(c=S);break}u&&c&&Y.alternate===null&&l(W,c),K=y(Y,K,X),T===null?Z=Y:T.sibling=Y,T=Y,c=S}if(p.done)return f(W,c),Xl&&Yi(W,X),Z;if(c===null){for(;!p.done;X++,p=q.next())p=Q(W,p.value,z),p!==null&&(K=y(p,K,X),T===null?Z=p:T.sibling=p,T=p);return Xl&&Yi(W,X),Z}for(c=n(W,c);!p.done;X++,p=q.next())p=F(c,W,X,p.value,z),p!==null&&(u&&p.alternate!==null&&c.delete(p.key===null?X:p.key),K=y(p,K,X),T===null?Z=p:T.sibling=p,T=p);return u&&c.forEach(function(t){return l(W,t)}),Xl&&Yi(W,X),Z}function w(W,K,q,z){if(typeof q==="object"&&q!==null&&q.type===py&&q.key===null&&(q=q.props.children),typeof q==="object"&&q!==null){switch(q.$$typeof){case U6:u:{for(var Z=q.key,T=K;T!==null;){if(T.key===Z){if(Z=q.type,Z===py){if(T.tag===7){f(W,T.sibling),K=i(T,q.props.children),K.return=W,W=K;break u}}else if(T.elementType===Z||typeof Z==="object"&&Z!==null&&Z.$$typeof===X1&&LN(Z)===T.type){f(W,T.sibling),K=i(T,q.props),K.ref=E$(W,T,q),K.return=W,W=K;break u}f(W,T);break}else l(W,T);T=T.sibling}q.type===py?(K=Ci(q.props.children,W.mode,z,q.key),K.return=W,W=K):(z=C6(q.type,q.key,q.props,null,W.mode,z),z.ref=E$(W,K,q),z.return=W,W=z)}return _(W);case Cy:u:{for(T=q.key;K!==null;){if(K.key===T)if(K.tag===4&&K.stateNode.containerInfo===q.containerInfo&&K.stateNode.implementation===q.implementation){f(W,K.sibling),K=i(K,q.children||[]),K.return=W,W=K;break u}else{f(W,K);break}else l(W,K);K=K.sibling}K=g2(q,W.mode,z),K.return=W,W=K}return _(W);case X1:return T=q._init,w(W,K,T(q._payload),z)}if(V$(q))return N(W,K,q,z);if(z$(q))return L(W,K,q,z);E6(W,q)}return typeof q==="string"&&q!==""||typeof q==="number"?(q=""+q,K!==null&&K.tag===6?(f(W,K.sibling),K=i(K,q),K.return=W,W=K):(f(W,K),K=v2(q,W.mode,z),K.return=W,W=K),_(W)):f(W,K)}return w}var y_=RF(!0),bF=RF(!1),d6=g1(null),e6=null,vy=null,r9=null;function A9(){r9=vy=e6=null}function j9(u){var l=d6.current;Tl(d6),u._currentValue=l}function O5(u,l,f){for(;u!==null;){var n=u.alternate;if((u.childLanes&l)!==l?(u.childLanes|=l,n!==null&&(n.childLanes|=l)):n!==null&&(n.childLanes&l)!==l&&(n.childLanes|=l),u===f)break;u=u.return}}function u_(u,l){e6=u,r9=vy=null,u=u.dependencies,u!==null&&u.firstContext!==null&&((u.lanes&l)!==0&&(df=!0),u.firstContext=null)}function P0(u){var l=u._currentValue;if(r9!==u)if(u={context:u,memoizedValue:l,next:null},vy===null){if(e6===null)throw Error(Ku(308));vy=u,e6.dependencies={lanes:0,firstContext:u}}else vy=vy.next=u;return l}var Si=null;function J9(u){Si===null?Si=[u]:Si.push(u)}function kF(u,l,f,n){var i=l.interleaved;return i===null?(f.next=f,J9(l)):(f.next=i.next,i.next=f),l.interleaved=f,en(u,n)}function en(u,l){u.lanes|=l;var f=u.alternate;f!==null&&(f.lanes|=l),f=u;for(u=u.return;u!==null;)u.childLanes|=l,f=u.alternate,f!==null&&(f.childLanes|=l),f=u,u=u.return;return f.tag===3?f.stateNode:null}var Y1=!1;function Q9(u){u.updateQueue={baseState:u.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function hF(u,l){u=u.updateQueue,l.updateQueue===u&&(l.updateQueue={baseState:u.baseState,firstBaseUpdate:u.firstBaseUpdate,lastBaseUpdate:u.lastBaseUpdate,shared:u.shared,effects:u.effects})}function an(u,l){return{eventTime:u,lane:l,tag:0,payload:null,callback:null,next:null}}function x1(u,l,f){var n=u.updateQueue;if(n===null)return null;if(n=n.shared,(Nl&2)!==0){var i=n.pending;return i===null?l.next=l:(l.next=i.next,i.next=l),n.pending=l,en(u,f)}return i=n.interleaved,i===null?(l.next=l,J9(n)):(l.next=i.next,i.next=l),n.interleaved=l,en(u,f)}function Y6(u,l,f){if(l=l.updateQueue,l!==null&&(l=l.shared,(f&4194240)!==0)){var n=l.lanes;n&=u.pendingLanes,f|=n,l.lanes=f,o5(u,f)}}function KN(u,l){var{updateQueue:f,alternate:n}=u;if(n!==null&&(n=n.updateQueue,f===n)){var i=null,y=null;if(f=f.firstBaseUpdate,f!==null){do{var _={eventTime:f.eventTime,lane:f.lane,tag:f.tag,payload:f.payload,callback:f.callback,next:null};y===null?i=y=_:y=y.next=_,f=f.next}while(f!==null);y===null?i=y=l:y=y.next=l}else i=y=l;f={baseState:n.baseState,firstBaseUpdate:i,lastBaseUpdate:y,shared:n.shared,effects:n.effects},u.updateQueue=f;return}u=f.lastBaseUpdate,u===null?f.firstBaseUpdate=l:u.next=l,f.lastBaseUpdate=l}function u8(u,l,f,n){var i=u.updateQueue;Y1=!1;var{firstBaseUpdate:y,lastBaseUpdate:_}=i,$=i.shared.pending;if($!==null){i.shared.pending=null;var r=$,j=r.next;r.next=null,_===null?y=j:_.next=j,_=r;var J=u.alternate;J!==null&&(J=J.updateQueue,$=J.lastBaseUpdate,$!==_&&($===null?J.firstBaseUpdate=j:$.next=j,J.lastBaseUpdate=r))}if(y!==null){var Q=i.baseState;_=0,J=j=r=null,$=y;do{var{lane:U,eventTime:F}=$;if((n&U)===U){J!==null&&(J=J.next={eventTime:F,lane:0,tag:$.tag,payload:$.payload,callback:$.callback,next:null});u:{var N=u,L=$;switch(U=l,F=f,L.tag){case 1:if(N=L.payload,typeof N==="function"){Q=N.call(F,Q,U);break u}Q=N;break u;case 3:N.flags=N.flags&-65537|128;case 0:if(N=L.payload,U=typeof N==="function"?N.call(F,Q,U):N,U===null||U===void 0)break u;Q=pl({},Q,U);break u;case 2:Y1=!0}}$.callback!==null&&$.lane!==0&&(u.flags|=64,U=i.effects,U===null?i.effects=[$]:U.push($))}else F={eventTime:F,lane:U,tag:$.tag,payload:$.payload,callback:$.callback,next:null},J===null?(j=J=F,r=Q):J=J.next=F,_|=U;if($=$.next,$===null)if($=i.shared.pending,$===null)break;else U=$,$=U.next,U.next=null,i.lastBaseUpdate=U,i.shared.pending=null}while(1);if(J===null&&(r=Q),i.baseState=r,i.firstBaseUpdate=j,i.lastBaseUpdate=J,l=i.shared.interleaved,l!==null){i=l;do _|=i.lane,i=i.next;while(i!==l)}else y===null&&(i.shared.lanes=0);Ri|=_,u.lanes=_,u.memoizedState=Q}}function zN(u,l,f){if(u=l.effects,l.effects=null,u!==null)for(l=0;lf?f:4,u(!0);var n=R2.transition;R2.transition={};try{u(!1),l()}finally{ql=f,R2.transition=n}}function rW(){return M0().memoizedState}function DO(u,l,f){var n=b1(u);if(f={lane:n,action:f,hasEagerState:!1,eagerState:null,next:null},AW(u))jW(l,f);else if(f=kF(u,l,f,n),f!==null){var i=xf();fn(f,u,n,i),JW(f,l,n)}}function SO(u,l,f){var n=b1(u),i={lane:n,action:f,hasEagerState:!1,eagerState:null,next:null};if(AW(u))jW(l,i);else{var y=u.alternate;if(u.lanes===0&&(y===null||y.lanes===0)&&(y=l.lastRenderedReducer,y!==null))try{var _=l.lastRenderedState,$=y(_,f);if(i.hasEagerState=!0,i.eagerState=$,nn($,_)){var r=l.interleaved;r===null?(i.next=i,J9(l)):(i.next=r.next,r.next=i),l.interleaved=i;return}}catch(j){}finally{}f=kF(u,l,i,n),f!==null&&(i=xf(),fn(f,u,n,i),JW(f,l,n))}}function AW(u){var l=u.alternate;return u===Cl||l!==null&&l===Cl}function jW(u,l){m$=f8=!0;var f=u.pending;f===null?l.next=l:(l.next=f.next,f.next=l),u.pending=l}function JW(u,l,f){if((f&4194240)!==0){var n=l.lanes;n&=u.pendingLanes,f|=n,l.lanes=f,o5(u,f)}}var n8={readContext:P0,useCallback:Ef,useContext:Ef,useEffect:Ef,useImperativeHandle:Ef,useInsertionEffect:Ef,useLayoutEffect:Ef,useMemo:Ef,useReducer:Ef,useRef:Ef,useState:Ef,useDebugValue:Ef,useDeferredValue:Ef,useTransition:Ef,useMutableSource:Ef,useSyncExternalStore:Ef,useId:Ef,unstable_isNewReconciler:!1},PO={readContext:P0,useCallback:function(u,l){return Gn().memoizedState=[u,l===void 0?null:l],u},useContext:P0,useEffect:wN,useImperativeHandle:function(u,l,f){return f=f!==null&&f!==void 0?f.concat([u]):null,D6(4194308,4,nW.bind(null,l,u),f)},useLayoutEffect:function(u,l){return D6(4194308,4,u,l)},useInsertionEffect:function(u,l){return D6(4,2,u,l)},useMemo:function(u,l){var f=Gn();return l=l===void 0?null:l,u=u(),f.memoizedState=[u,l],u},useReducer:function(u,l,f){var n=Gn();return l=f!==void 0?f(l):l,n.memoizedState=n.baseState=l,u={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:u,lastRenderedState:l},n.queue=u,u=u.dispatch=DO.bind(null,Cl,u),[n.memoizedState,u]},useRef:function(u){var l=Gn();return u={current:u},l.memoizedState=u},useState:GN,useDebugValue:z9,useDeferredValue:function(u){return Gn().memoizedState=u},useTransition:function(){var u=GN(!1),l=u[0];return u=tO.bind(null,u[1]),Gn().memoizedState=u,[l,u]},useMutableSource:function(){},useSyncExternalStore:function(u,l,f){var n=Cl,i=Gn();if(Xl){if(f===void 0)throw Error(Ku(407));f=f()}else{if(f=l(),Uf===null)throw Error(Ku(349));(xi&30)!==0||sF(n,l,f)}i.memoizedState=f;var y={value:f,getSnapshot:l};return i.queue=y,wN(oF.bind(null,n,y,u),[u]),n.flags|=2048,y3(9,aF.bind(null,n,y,f,l),void 0,null),f},useId:function(){var u=Gn(),l=Uf.identifierPrefix;if(Xl){var f=sn,n=gn;f=(n&~(1<<32-ln(n)-1)).toString(32)+f,l=":"+l+"R"+f,f=n3++,0",u=u.removeChild(u.firstChild)):typeof n.is==="string"?u=_.createElement(f,{is:n.is}):(u=_.createElement(f),f==="select"&&(_=u,n.multiple?_.multiple=!0:n.size&&(_.size=n.size))):u=_.createElementNS(u,f),u[wn]=l,u[u3]=n,GW(u,l,!1,!1),l.stateNode=u;u:{switch(_=_5(f,n),f){case"dialog":Ol("cancel",u),Ol("close",u),i=n;break;case"iframe":case"object":case"embed":Ol("load",u),i=n;break;case"video":case"audio":for(i=0;ir_&&(l.flags|=128,n=!0,H$(y,!1),l.lanes=4194304)}else{if(!n)if(u=l8(_),u!==null){if(l.flags|=128,n=!0,f=u.updateQueue,f!==null&&(l.updateQueue=f,l.flags|=4),H$(y,!0),y.tail===null&&y.tailMode==="hidden"&&!_.alternate&&!Xl)return Hf(l),null}else 2*al()-y.renderingStartTime>r_&&f!==1073741824&&(l.flags|=128,n=!0,H$(y,!1),l.lanes=4194304);y.isBackwards?(_.sibling=l.child,l.child=_):(f=y.last,f!==null?f.sibling=_:l.child=_,y.last=_)}if(y.tail!==null)return l=y.tail,y.rendering=l,y.tail=l.sibling,y.renderingStartTime=al(),l.sibling=null,f=Ml.current,Zl(Ml,n?f&1|2:f&1),l;return Hf(l),null;case 22:case 23:return O9(),n=l.memoizedState!==null,u!==null&&u.memoizedState!==null!==n&&(l.flags|=8192),n&&(l.mode&1)!==0?(W0&1073741824)!==0&&(Hf(l),l.subtreeFlags&6&&(l.flags|=8192)):Hf(l),null;case 24:return null;case 25:return null}throw Error(Ku(156,l.tag))}function kO(u,l){switch(_9(l),l.tag){case 1:return u0(l.type)&&g6(),u=l.flags,u&65536?(l.flags=u&-65537|128,l):null;case 3:return __(),Tl(ef),Tl(Tf),F9(),u=l.flags,(u&65536)!==0&&(u&128)===0?(l.flags=u&-65537|128,l):null;case 5:return N9(l),null;case 13:if(Tl(Ml),u=l.memoizedState,u!==null&&u.dehydrated!==null){if(l.alternate===null)throw Error(Ku(340));i_()}return u=l.flags,u&65536?(l.flags=u&-65537|128,l):null;case 19:return Tl(Ml),null;case 4:return __(),null;case 10:return j9(l.type._context),null;case 22:case 23:return O9(),null;case 24:return null;default:return null}}var O6=!1,Of=!1,hO=typeof WeakSet==="function"?WeakSet:Set,tu=null;function gy(u,l){var f=u.ref;if(f!==null)if(typeof f==="function")try{f(null)}catch(n){kl(u,l,n)}else f.current=null}function S5(u,l,f){try{f()}catch(n){kl(u,l,n)}}var tN=!1;function IO(u,l){if(L5=k6,u=VF(),i9(u)){if("selectionStart"in u)var f={start:u.selectionStart,end:u.selectionEnd};else u:{f=(f=u.ownerDocument)&&f.defaultView||window;var n=f.getSelection&&f.getSelection();if(n&&n.rangeCount!==0){f=n.anchorNode;var{anchorOffset:i,focusNode:y}=n;n=n.focusOffset;try{f.nodeType,y.nodeType}catch(z){f=null;break u}var _=0,$=-1,r=-1,j=0,J=0,Q=u,U=null;l:for(;;){for(var F;;){if(Q!==f||i!==0&&Q.nodeType!==3||($=_+i),Q!==y||n!==0&&Q.nodeType!==3||(r=_+n),Q.nodeType===3&&(_+=Q.nodeValue.length),(F=Q.firstChild)===null)break;U=Q,Q=F}for(;;){if(Q===u)break l;if(U===f&&++j===i&&($=_),U===y&&++J===n&&(r=_),(F=Q.nextSibling)!==null)break;Q=U,U=Q.parentNode}Q=F}f=$===-1||r===-1?null:{start:$,end:r}}else f=null}f=f||{start:0,end:0}}else f=null;K5={focusedElem:u,selectionRange:f},k6=!1;for(tu=l;tu!==null;)if(l=tu,u=l.child,(l.subtreeFlags&1028)!==0&&u!==null)u.return=l,tu=u;else for(;tu!==null;){l=tu;try{var N=l.alternate;if((l.flags&1024)!==0)switch(l.tag){case 0:case 11:case 15:break;case 1:if(N!==null){var{memoizedProps:L,memoizedState:w}=N,W=l.stateNode,K=W.getSnapshotBeforeUpdate(l.elementType===l.type?L:d0(l.type,L),w);W.__reactInternalSnapshotBeforeUpdate=K}break;case 3:var q=l.stateNode.containerInfo;q.nodeType===1?q.textContent="":q.nodeType===9&&q.documentElement&&q.removeChild(q.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(Ku(163))}}catch(z){kl(l,l.return,z)}if(u=l.sibling,u!==null){u.return=l.return,tu=u;break}tu=l.return}return N=tN,tN=!1,N}function x$(u,l,f){var n=l.updateQueue;if(n=n!==null?n.lastEffect:null,n!==null){var i=n=n.next;do{if((i.tag&u)===u){var y=i.destroy;i.destroy=void 0,y!==void 0&&S5(l,f,y)}i=i.next}while(i!==n)}}function q8(u,l){if(l=l.updateQueue,l=l!==null?l.lastEffect:null,l!==null){var f=l=l.next;do{if((f.tag&u)===u){var n=f.create;f.destroy=n()}f=f.next}while(f!==l)}}function P5(u){var l=u.ref;if(l!==null){var f=u.stateNode;switch(u.tag){case 5:u=f;break;default:u=f}typeof l==="function"?l(u):l.current=u}}function EW(u){var l=u.alternate;l!==null&&(u.alternate=null,EW(l)),u.child=null,u.deletions=null,u.sibling=null,u.tag===5&&(l=u.stateNode,l!==null&&(delete l[wn],delete l[u3],delete l[w5],delete l[VO],delete l[BO])),u.stateNode=null,u.return=null,u.dependencies=null,u.memoizedProps=null,u.memoizedState=null,u.pendingProps=null,u.stateNode=null,u.updateQueue=null}function HW(u){return u.tag===5||u.tag===3||u.tag===4}function DN(u){u:for(;;){for(;u.sibling===null;){if(u.return===null||HW(u.return))return null;u=u.return}u.sibling.return=u.return;for(u=u.sibling;u.tag!==5&&u.tag!==6&&u.tag!==18;){if(u.flags&2)continue u;if(u.child===null||u.tag===4)continue u;else u.child.return=u,u=u.child}if(!(u.flags&2))return u.stateNode}}function M5(u,l,f){var n=u.tag;if(n===5||n===6)u=u.stateNode,l?f.nodeType===8?f.parentNode.insertBefore(u,l):f.insertBefore(u,l):(f.nodeType===8?(l=f.parentNode,l.insertBefore(u,f)):(l=f,l.appendChild(u)),f=f._reactRootContainer,f!==null&&f!==void 0||l.onclick!==null||(l.onclick=v6));else if(n!==4&&(u=u.child,u!==null))for(M5(u,l,f),u=u.sibling;u!==null;)M5(u,l,f),u=u.sibling}function C5(u,l,f){var n=u.tag;if(n===5||n===6)u=u.stateNode,l?f.insertBefore(u,l):f.appendChild(u);else if(n!==4&&(u=u.child,u!==null))for(C5(u,l,f),u=u.sibling;u!==null;)C5(u,l,f),u=u.sibling}var Nf=null,e0=!1;function c1(u,l,f){for(f=f.child;f!==null;)OW(u,l,f),f=f.sibling}function OW(u,l,f){if(Zn&&typeof Zn.onCommitFiberUnmount==="function")try{Zn.onCommitFiberUnmount(A8,f)}catch($){}switch(f.tag){case 5:Of||gy(f,l);case 6:var n=Nf,i=e0;Nf=null,c1(u,l,f),Nf=n,e0=i,Nf!==null&&(e0?(u=Nf,f=f.stateNode,u.nodeType===8?u.parentNode.removeChild(f):u.removeChild(f)):Nf.removeChild(f.stateNode));break;case 18:Nf!==null&&(e0?(u=Nf,f=f.stateNode,u.nodeType===8?p2(u.parentNode,f):u.nodeType===1&&p2(u,f),s$(u)):p2(Nf,f.stateNode));break;case 4:n=Nf,i=e0,Nf=f.stateNode.containerInfo,e0=!0,c1(u,l,f),Nf=n,e0=i;break;case 0:case 11:case 14:case 15:if(!Of&&(n=f.updateQueue,n!==null&&(n=n.lastEffect,n!==null))){i=n=n.next;do{var y=i,_=y.destroy;y=y.tag,_!==void 0&&((y&2)!==0?S5(f,l,_):(y&4)!==0&&S5(f,l,_)),i=i.next}while(i!==n)}c1(u,l,f);break;case 1:if(!Of&&(gy(f,l),n=f.stateNode,typeof n.componentWillUnmount==="function"))try{n.props=f.memoizedProps,n.state=f.memoizedState,n.componentWillUnmount()}catch($){kl(f,l,$)}c1(u,l,f);break;case 21:c1(u,l,f);break;case 22:f.mode&1?(Of=(n=Of)||f.memoizedState!==null,c1(u,l,f),Of=n):c1(u,l,f);break;default:c1(u,l,f)}}function SN(u){var l=u.updateQueue;if(l!==null){u.updateQueue=null;var f=u.stateNode;f===null&&(f=u.stateNode=new hO),l.forEach(function(n){var i=lT.bind(null,u,n);f.has(n)||(f.add(n),n.then(i,i))})}}function o0(u,l){var f=l.deletions;if(f!==null)for(var n=0;ni&&(i=_),n&=~y}if(n=i,n=al()-n,n=(120>n?120:480>n?480:1080>n?1080:1920>n?1920:3000>n?3000:4320>n?4320:1960*gO(n/1960))-n,10u?16:u,P1===null)var n=!1;else{if(u=P1,P1=null,_8=0,(Nl&6)!==0)throw Error(Ku(331));var i=Nl;Nl|=4;for(tu=u.current;tu!==null;){var y=tu,_=y.child;if((tu.flags&16)!==0){var $=y.deletions;if($!==null){for(var r=0;r<$.length;r++){var j=$[r];for(tu=j;tu!==null;){var J=tu;switch(J.tag){case 0:case 11:case 15:x$(8,J,y)}var Q=J.child;if(Q!==null)Q.return=J,tu=Q;else for(;tu!==null;){J=tu;var{sibling:U,return:F}=J;if(EW(J),J===j){tu=null;break}if(U!==null){U.return=F,tu=U;break}tu=F}}}var N=y.alternate;if(N!==null){var L=N.child;if(L!==null){N.child=null;do{var w=L.sibling;L.sibling=null,L=w}while(L!==null)}}tu=y}}if((y.subtreeFlags&2064)!==0&&_!==null)_.return=y,tu=_;else u:for(;tu!==null;){if(y=tu,(y.flags&2048)!==0)switch(y.tag){case 0:case 11:case 15:x$(9,y,y.return)}var W=y.sibling;if(W!==null){W.return=y.return,tu=W;break u}tu=y.return}}var K=u.current;for(tu=K;tu!==null;){_=tu;var q=_.child;if((_.subtreeFlags&2064)!==0&&q!==null)q.return=_,tu=q;else u:for(_=K;tu!==null;){if($=tu,($.flags&2048)!==0)try{switch($.tag){case 0:case 11:case 15:q8(9,$)}}catch(Z){kl($,$.return,Z)}if($===_){tu=null;break u}var z=$.sibling;if(z!==null){z.return=$.return,tu=z;break u}tu=$.return}}if(Nl=i,s1(),Zn&&typeof Zn.onPostCommitFiberRoot==="function")try{Zn.onPostCommitFiberRoot(A8,u)}catch(Z){}n=!0}return n}finally{ql=f,S0.transition=l}}return!1}function mN(u,l,f){l=$_(f,l),l=UW(u,l,1),u=x1(u,l,1),l=xf(),u!==null&&($3(u,1,l),l0(u,l))}function kl(u,l,f){if(u.tag===3)mN(u,u,f);else for(;l!==null;){if(l.tag===3){mN(l,u,f);break}else if(l.tag===1){var n=l.stateNode;if(typeof l.type.getDerivedStateFromError==="function"||typeof n.componentDidCatch==="function"&&(R1===null||!R1.has(n))){u=$_(f,u),u=NW(l,u,1),l=x1(l,u,1),u=xf(),l!==null&&($3(l,1,u),l0(l,u));break}}l=l.return}}function eO(u,l,f){var n=u.pingCache;n!==null&&n.delete(l),l=xf(),u.pingedLanes|=u.suspendedLanes&f,Uf===u&&(Ff&f)===f&&(_f===4||_f===3&&(Ff&130023424)===Ff&&500>al()-E9?Mi(u,0):Z9|=f),l0(u,l)}function DW(u,l){l===0&&((u.mode&1)===0?l=1:(l=q6,q6<<=1,(q6&130023424)===0&&(q6=4194304)));var f=xf();u=en(u,l),u!==null&&($3(u,l,f),l0(u,f))}function uT(u){var l=u.memoizedState,f=0;l!==null&&(f=l.retryLane),DW(u,f)}function lT(u,l){var f=0;switch(u.tag){case 13:var{stateNode:n,memoizedState:i}=u;i!==null&&(f=i.retryLane);break;case 19:n=u.stateNode;break;default:throw Error(Ku(314))}n!==null&&n.delete(l),DW(u,f)}var SW;SW=function(u,l,f){if(u!==null)if(u.memoizedProps!==l.pendingProps||ef.current)df=!0;else{if((u.lanes&f)===0&&(l.flags&128)===0)return df=!1,RO(u,l,f);df=(u.flags&131072)!==0?!0:!1}else df=!1,Xl&&(l.flags&1048576)!==0&&pF(l,o6,l.index);switch(l.lanes=0,l.tag){case 2:var n=l.type;S6(u,l),u=l.pendingProps;var i=n_(l,Tf.current);u_(l,f),i=q9(null,l,n,u,i,f);var y=L9();return l.flags|=1,typeof i==="object"&&i!==null&&typeof i.render==="function"&&i.$$typeof===void 0?(l.tag=1,l.memoizedState=null,l.updateQueue=null,u0(n)?(y=!0,s6(l)):y=!1,l.memoizedState=i.state!==null&&i.state!==void 0?i.state:null,Q9(l),i.updater=W8,l.stateNode=i,i._reactInternals=l,V5(l,n,u,f),l=X5(null,l,n,!0,y,f)):(l.tag=0,Xl&&y&&y9(l),mf(null,l,i,f),l=l.child),l;case 16:n=l.elementType;u:{switch(S6(u,l),u=l.pendingProps,i=n._init,n=i(n._payload),l.type=n,i=l.tag=nT(n),u=d0(n,u),i){case 0:l=c5(null,l,n,u,f);break u;case 1:l=cN(null,l,n,u,f);break u;case 11:l=VN(null,l,n,u,f);break u;case 14:l=BN(null,l,n,d0(n.type,u),f);break u}throw Error(Ku(306,n,""))}return l;case 0:return n=l.type,i=l.pendingProps,i=l.elementType===n?i:d0(n,i),c5(u,l,n,i,f);case 1:return n=l.type,i=l.pendingProps,i=l.elementType===n?i:d0(n,i),cN(u,l,n,i,f);case 3:u:{if(LW(l),u===null)throw Error(Ku(387));n=l.pendingProps,y=l.memoizedState,i=y.element,hF(u,l),u8(l,n,null,f);var _=l.memoizedState;if(n=_.element,y.isDehydrated)if(y={element:n,isDehydrated:!1,cache:_.cache,pendingSuspenseBoundaries:_.pendingSuspenseBoundaries,transitions:_.transitions},l.updateQueue.baseState=y,l.memoizedState=y,l.flags&256){i=$_(Error(Ku(423)),l),l=XN(u,l,n,f,i);break u}else if(n!==i){i=$_(Error(Ku(424)),l),l=XN(u,l,n,f,i);break u}else for(q0=m1(l.stateNode.containerInfo.firstChild),L0=l,Xl=!0,un=null,f=bF(l,null,n,f),l.child=f;f;)f.flags=f.flags&-3|4096,f=f.sibling;else{if(i_(),n===i){l=u1(u,l,f);break u}mf(u,l,n,f)}l=l.child}return l;case 5:return IF(l),u===null&&H5(l),n=l.type,i=l.pendingProps,y=u!==null?u.memoizedProps:null,_=i.children,z5(n,i)?_=null:y!==null&&z5(n,y)&&(l.flags|=32),qW(u,l),mf(u,l,_,f),l.child;case 6:return u===null&&H5(l),null;case 13:return KW(u,l,f);case 4:return U9(l,l.stateNode.containerInfo),n=l.pendingProps,u===null?l.child=y_(l,null,n,f):mf(u,l,n,f),l.child;case 11:return n=l.type,i=l.pendingProps,i=l.elementType===n?i:d0(n,i),VN(u,l,n,i,f);case 7:return mf(u,l,l.pendingProps,f),l.child;case 8:return mf(u,l,l.pendingProps.children,f),l.child;case 12:return mf(u,l,l.pendingProps.children,f),l.child;case 10:u:{if(n=l.type._context,i=l.pendingProps,y=l.memoizedProps,_=i.value,Zl(d6,n._currentValue),n._currentValue=_,y!==null)if(nn(y.value,_)){if(y.children===i.children&&!ef.current){l=u1(u,l,f);break u}}else for(y=l.child,y!==null&&(y.return=l);y!==null;){var $=y.dependencies;if($!==null){_=y.child;for(var r=$.firstContext;r!==null;){if(r.context===n){if(y.tag===1){r=an(-1,f&-f),r.tag=2;var j=y.updateQueue;if(j!==null){j=j.shared;var J=j.pending;J===null?r.next=r:(r.next=J.next,J.next=r),j.pending=r}}y.lanes|=f,r=y.alternate,r!==null&&(r.lanes|=f),O5(y.return,f,l),$.lanes|=f;break}r=r.next}}else if(y.tag===10)_=y.type===l.type?null:y.child;else if(y.tag===18){if(_=y.return,_===null)throw Error(Ku(341));_.lanes|=f,$=_.alternate,$!==null&&($.lanes|=f),O5(_,f,l),_=y.sibling}else _=y.child;if(_!==null)_.return=y;else for(_=y;_!==null;){if(_===l){_=null;break}if(y=_.sibling,y!==null){y.return=_.return,_=y;break}_=_.return}y=_}mf(u,l,i.children,f),l=l.child}return l;case 9:return i=l.type,n=l.pendingProps.children,u_(l,f),i=P0(i),n=n(i),l.flags|=1,mf(u,l,n,f),l.child;case 14:return n=l.type,i=d0(n,l.pendingProps),i=d0(n.type,i),BN(u,l,n,i,f);case 15:return FW(u,l,l.type,l.pendingProps,f);case 17:return n=l.type,i=l.pendingProps,i=l.elementType===n?i:d0(n,i),S6(u,l),l.tag=1,u0(n)?(u=!0,s6(l)):u=!1,u_(l,f),QW(l,n,i),V5(l,n,i,f),X5(null,l,n,!0,u,f);case 19:return zW(u,l,f);case 22:return WW(u,l,f)}throw Error(Ku(156,l.tag))};function PW(u,l){return AF(u,l)}function fT(u,l,f,n){this.tag=u,this.key=f,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=l,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=n,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function D0(u,l,f,n){return new fT(u,l,f,n)}function V9(u){return u=u.prototype,!(!u||!u.isReactComponent)}function nT(u){if(typeof u==="function")return V9(u)?1:0;if(u!==void 0&&u!==null){if(u=u.$$typeof,u===v5)return 11;if(u===g5)return 14}return 2}function k1(u,l){var f=u.alternate;return f===null?(f=D0(u.tag,l,u.key,u.mode),f.elementType=u.elementType,f.type=u.type,f.stateNode=u.stateNode,f.alternate=u,u.alternate=f):(f.pendingProps=l,f.type=u.type,f.flags=0,f.subtreeFlags=0,f.deletions=null),f.flags=u.flags&14680064,f.childLanes=u.childLanes,f.lanes=u.lanes,f.child=u.child,f.memoizedProps=u.memoizedProps,f.memoizedState=u.memoizedState,f.updateQueue=u.updateQueue,l=u.dependencies,f.dependencies=l===null?null:{lanes:l.lanes,firstContext:l.firstContext},f.sibling=u.sibling,f.index=u.index,f.ref=u.ref,f}function C6(u,l,f,n,i,y){var _=2;if(n=u,typeof u==="function")V9(u)&&(_=1);else if(typeof u==="string")_=5;else u:switch(u){case py:return Ci(f.children,i,y,l);case I5:_=8,i|=8;break;case a2:return u=D0(12,f,l,i|2),u.elementType=a2,u.lanes=y,u;case o2:return u=D0(13,f,l,i),u.elementType=o2,u.lanes=y,u;case d2:return u=D0(19,f,l,i),u.elementType=d2,u.lanes=y,u;case IN:return K8(f,i,y,l);default:if(typeof u==="object"&&u!==null)switch(u.$$typeof){case kN:_=10;break u;case hN:_=9;break u;case v5:_=11;break u;case g5:_=14;break u;case X1:_=16,n=null;break u}throw Error(Ku(130,u==null?u:typeof u,""))}return l=D0(_,f,l,i),l.elementType=u,l.type=n,l.lanes=y,l}function Ci(u,l,f,n){return u=D0(7,u,n,l),u.lanes=f,u}function K8(u,l,f,n){return u=D0(22,u,n,l),u.elementType=IN,u.lanes=f,u.stateNode={isHidden:!1},u}function v2(u,l,f){return u=D0(6,u,null,l),u.lanes=f,u}function g2(u,l,f){return l=D0(4,u.children!==null?u.children:[],u.key,l),l.lanes=f,l.stateNode={containerInfo:u.containerInfo,pendingChildren:null,implementation:u.implementation},l}function iT(u,l,f,n,i){this.tag=l,this.containerInfo=u,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Y2(0),this.expirationTimes=Y2(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Y2(0),this.identifierPrefix=n,this.onRecoverableError=i,this.mutableSourceEagerHydrationData=null}function B9(u,l,f,n,i,y,_,$,r){return u=new iT(u,l,f,$,r),l===1?(l=1,y===!0&&(l|=8)):l=0,y=D0(3,null,null,l),u.current=y,y.stateNode=u,y.memoizedState={element:n,isDehydrated:f,cache:null,transitions:null,pendingSuspenseBoundaries:null},Q9(y),u}function yT(u,l,f){var n=3{function xW(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=="function")return;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(xW)}catch(u){console.error(u)}}xW(),RW.exports=mW()});var kW=F0((D9)=>{var bW=t9();D9.createRoot=bW.createRoot,D9.hydrateRoot=bW.hydrateRoot;var jT});var AK=F0((G4)=>{var VX=Wl(),BX=Symbol.for("react.element"),cX=Symbol.for("react.fragment"),XX=Object.prototype.hasOwnProperty,YX=VX.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,tX={key:!0,ref:!0,__self:!0,__source:!0};function rK(u,l,f){var n,i={},y=null,_=null;f!==void 0&&(y=""+f),l.key!==void 0&&(y=""+l.key),l.ref!==void 0&&(_=l.ref);for(n in l)XX.call(l,n)&&!tX.hasOwnProperty(n)&&(i[n]=l[n]);if(u&&u.defaultProps)for(n in l=u.defaultProps,l)i[n]===void 0&&(i[n]=l[n]);return{$$typeof:BX,type:u,key:y,ref:_,props:i,_owner:YX.current}}G4.Fragment=cX;G4.jsx=rK;G4.jsxs=rK});var JK=F0((sx,jK)=>{jK.exports=AK()});var Rz=F0((xz)=>{var s_=Wl();function aD(u,l){return u===l&&(u!==0||1/u===1/l)||u!==u&&l!==l}var oD=typeof Object.is==="function"?Object.is:aD,dD=s_.useState,eD=s_.useEffect,uS=s_.useLayoutEffect,lS=s_.useDebugValue;function fS(u,l){var f=l(),n=dD({inst:{value:f,getSnapshot:l}}),i=n[0].inst,y=n[1];return uS(function(){i.value=f,i.getSnapshot=l,IJ(i)&&y({inst:i})},[u,f,l]),eD(function(){return IJ(i)&&y({inst:i}),u(function(){IJ(i)&&y({inst:i})})},[u]),lS(f),f}function IJ(u){var l=u.getSnapshot;u=u.value;try{var f=l();return!oD(u,f)}catch(n){return!0}}function nS(u,l){return l()}var iS=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?nS:fS;xz.useSyncExternalStore=s_.useSyncExternalStore!==void 0?s_.useSyncExternalStore:iS});var kz=F0((Rv,bz)=>{bz.exports=Rz()});var Iz=F0((hz)=>{var NA=Wl(),yS=kz();function _S(u,l){return u===l&&(u!==0||1/u===1/l)||u!==u&&l!==l}var $S=typeof Object.is==="function"?Object.is:_S,rS=yS.useSyncExternalStore,AS=NA.useRef,jS=NA.useEffect,JS=NA.useMemo,QS=NA.useDebugValue;hz.useSyncExternalStoreWithSelector=function(u,l,f,n,i){var y=AS(null);if(y.current===null){var _={hasValue:!1,value:null};y.current=_}else _=y.current;y=JS(function(){function r(F){if(!j){if(j=!0,J=F,F=n(F),i!==void 0&&_.hasValue){var N=_.value;if(i(N,F))return Q=N}return Q=F}if(N=Q,$S(J,F))return N;var L=n(F);if(i!==void 0&&i(N,L))return J=F,N;return J=F,Q=L}var j=!1,J,Q,U=f===void 0?null:f;return[function(){return r(l())},U===null?void 0:function(){return r(U())}]},[l,f,n,i]);var $=rS(u,y[0],y[1]);return jS(function(){_.hasValue=!0,_.value=$},[$]),QS($),$}});var gz=F0((kv,vz)=>{vz.exports=Iz()});var Hi=bu(Wl(),1);var y6="北京时间";var yH={timeZone:"Asia/Shanghai",hour12:!1},_H={timeZone:"Asia/Shanghai",hour12:!1},$H=new Intl.DateTimeFormat("en-CA",{timeZone:"Asia/Shanghai",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",hourCycle:"h23"});function W2(u){if(u===null||u===void 0||u==="")return null;let l=u instanceof Date?u:new Date(u);return Number.isNaN(l.getTime())?null:l}function TU(u){let l=W2(u);if(!l)return null;return $H.formatToParts(l).reduce((f,n)=>{if(n.type!=="literal")f[n.type]=n.value;return f},{})}function Hu(u){let l=W2(u);return l?l.toLocaleString("zh-CN",yH):"--"}function Al(u){let l=W2(u);return l?l.toLocaleTimeString("zh-CN",_H):"--"}function q2(u){let l=TU(u);if(!l)return"";let f=l.hour==="24"?"00":l.hour;return`${l.year}-${l.month}-${l.day}T${f}:${l.minute}`}function VU(u=new Date){let l=TU(u);if(!l)return"";return`${l.year}-${l.month}-${l.day}`}function BU(u){if(!u)return null;let l=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(?::(\d{2}))?$/.exec(u);if(!l)return null;let[,f,n,i,y,_,$="00"]=l,r=Date.UTC(Number(f),Number(n)-1,Number(i),Number(y)-8,Number(_),Number($)),j=new Date(r),J=q2(j);return Number.isNaN(j.getTime())||J!==`${f}-${n}-${i}T${y}:${_}`?null:j.toISOString()}var wZ=bu(kW(),1);var T8=bu(Wl(),1);var hW=bu(Wl(),1),J3=hW.default.createElement;function JT({active:u=!0,label:l="正在加载"}){if(!u)return null;return J3("span",{className:"loading-spinner-indicator",role:"status","aria-label":l,title:l,"data-testid":"loading-title-indicator"},J3("span",{className:"loading-spinner-ring","aria-hidden":!0}))}function nl({title:u,children:l,loading:f,level:n=2,className:i="",label:y="正在加载"}){return J3(n===3?"h3":"h2",{className:`loading-title ${f?"is-loading":""} ${i}`.trim()},J3("span",{className:"loading-title-text"},l??u),J3(JT,{active:Boolean(f),label:y}))}class J_ extends Error{unideskRequestError=!0;meta;constructor(u,l){super(u);this.name="UniDeskRequestError",this.meta=l}}function QT(u){return new Promise((l)=>setTimeout(l,u))}function N3(u,l="操作失败"){return u instanceof Error?u.message:String(u||l)}function E8(u,l=500){if(u===null||u===void 0)return"";let f=typeof u==="string"?u:JSON.stringify(u),n=String(f||"").replace(/\s+/gu," ").trim();return n.length>l?`${n.slice(0,l)}...`:n}function UT(u){try{let l=typeof location<"u"&&location.origin?location.origin:"http://localhost";return new URL(u,l).toString()}catch{return u}}function IW(u){return String(u.method||"GET").toUpperCase()}function NT(u){if(u===null||u===void 0)return!1;if(typeof u!=="object")return!1;if(typeof Blob<"u"&&u instanceof Blob)return!1;if(typeof FormData<"u"&&u instanceof FormData)return!1;if(typeof URLSearchParams<"u"&&u instanceof URLSearchParams)return!1;if(typeof ArrayBuffer<"u"&&u instanceof ArrayBuffer)return!1;return!0}function vW(u){let l=new Headers(u.headers||{}),f=NT(u.body)?JSON.stringify(u.body):u.body;if(f&&!l.has("content-type")&&typeof f==="string")l.set("content-type","application/json");return{...u,credentials:u.credentials||"same-origin",body:f,headers:l}}function gW(u){if(u?.error&&typeof u.error==="object"&&typeof u.error.message==="string")return u.error.message;if(typeof u?.error==="string")return u.error;if(typeof u?.message==="string")return u.message;if(typeof u?.detail==="string")return u.detail;return""}function FT(u,l){if(!u||typeof u!=="object"||Array.isArray(u))return!1;return l.some((f)=>f!==!1&&u[f]===!1)}function Q3(u,l,f,n,i={}){return{kind:u,method:f,url:UT(l),occurredAt:n.toISOString(),...i}}function U3(u,l){if(!u)return"请求失败";return`HTTP ${u}${l?` ${l}`:""}`}function sW(u){try{return{body:u?JSON.parse(u):null,parseError:""}}catch(l){return{body:{text:u},parseError:N3(l,"parse failed")}}}async function Zu(u,l={},f=0){let{failureFields:n=["ok"],strictJson:i=!1,retryInvalidJson:y=0,retryDelayMs:_=120,invalidJsonPrefix:$="服务返回了无效 JSON",invalidJsonPreview:r=!1,responsePreviewLength:j=500,...J}=l,Q=IW(J),U=new Date,F;try{F=await fetch(u,vW(J))}catch(w){let W=N3(w,"网络请求失败");throw new J_(W,Q3("network",u,Q,U,{upstreamMessage:W}))}let N=await F.text(),L=sW(N);if(L.parseError){if(i&&Q==="GET"&&f=300)?U3(u.meta.status,u.meta.statusText):"应用请求失败",y=u.meta.status?U3(u.meta.status):"",_=(r)=>!r||r===i||r===y,$=!_(u.message)?u.message:_(u.meta.upstreamMessage)?"":u.meta.upstreamMessage||"";return{title:i,message:$,status:u.meta.status,statusText:u.meta.statusText,method:u.meta.method,url:u.meta.url,occurredAt:WT(u.meta.occurredAt),responsePreview:u.meta.responsePreview,parseError:u.meta.parseError,structured:!0}}let n=N3(u,l).split(/\r?\n/u);return{title:n[0]||l,message:n.slice(1).join(` -`),structured:n.length>1}}function qT(u,l="操作失败"){let f=S9(u,l),n=[f.title];if(f.message)n.push(`原因: ${f.message}`);if(f.method||f.url)n.push(`请求: ${[f.method,f.url].filter(Boolean).join(" ")}`);if(f.status)n.push(`状态: ${U3(f.status,f.statusText)}`);if(f.occurredAt)n.push(`时间: ${f.occurredAt}`);if(f.parseError)n.push(`解析错误: ${f.parseError}`);if(f.responsePreview&&f.responsePreview!==f.message)n.push(`响应预览: ${f.responsePreview}`);return n.filter(Boolean).join(` -`)}function cu(u,l="操作失败"){return H8(u)?qT(u,l):N3(u,l)}var oW=bu(Wl(),1);var a1=oW.default.createElement;function F3(u,l){return l?[a1("dt",{key:`${u}-label`},u),a1("dd",{key:u},l)]:null}function ul({error:u,wide:l=!1,fallback:f="操作失败",className:n=""}){if(!u)return null;let i=S9(u,f),y=[F3("请求",[i.method,i.url].filter(Boolean).join(" ")),F3("状态",i.status?`HTTP ${i.status}${i.statusText?` ${i.statusText}`:""}`:""),F3("时间",i.occurredAt),F3("解析错误",i.parseError),F3("响应预览",i.responsePreview)].filter(Boolean);return a1("div",{className:`form-error unidesk-error${l?" wide":""}${n?` ${n}`:""}`,role:"alert","data-testid":"unidesk-error"},a1("div",{className:"unidesk-error-title"},a1("strong",null,i.title),i.status?a1("span",{className:"unidesk-error-code"},`HTTP ${i.status}`):null),i.message?a1("pre",{className:"unidesk-error-message"},i.message):null,y.length>0?a1("dl",{className:"unidesk-error-details"},y):null)}var Hn=bu(Wl(),1),dW=Hn.default.createContext(null);function eW({children:u}){let[l,f]=Hn.default.useState([]),[n,i]=Hn.default.useState(Date.now()),y=Hn.default.useCallback((Q,U)=>{let N={id:`notif_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,type:Q,message:U,timestamp:Date.now()};f((L)=>{let w=[...L,N];if(w.length>50)return w.slice(-50);return w})},[]),_=Hn.default.useCallback((Q)=>{f((U)=>U.filter((F)=>F.id!==Q))},[]),$=Hn.default.useCallback(()=>{f([]),i(Date.now())},[]),r=Hn.default.useMemo(()=>{return l.filter((Q)=>Q.timestamp>n).length},[l,n]),j=r>0,J={notifications:l,addNotification:y,removeNotification:_,clearNotifications:$,unreadCount:r,hasUnread:j};return LT(dW.Provider,{value:J},u)}var LT=Hn.default.createElement;function bf(){let u=Hn.default.useContext(dW);if(!u)throw Error("useNotification must be used within NotificationProvider");return u}var h=T8.default.createElement,{useEffect:O8}=T8.default,Q_=T8.default.useState;function Vf(u,l={}){return Zu(u,{failureFields:["ok","success"],...l})}function kf(u,l){return`${u}/microservices/baidu-netdisk/proxy${l}`}function KT(u){let l=Number(u);return Number.isFinite(l)?l.toLocaleString("zh-CN"):"--"}function o1(u){let l=Number(u);if(!Number.isFinite(l)||l<=0)return"--";let f=["B","KB","MB","GB","TB"],n=l,i=0;while(n>=1024&&i{i?.stopPropagation?.(),f(u,l)}},"查看原始JSON")}function N_({title:u,text:l}){return h("div",{className:"empty-state"},h("strong",null,u),h("span",null,l))}function F_({title:u,text:l,href:f,badge:n,testId:i}){return h("a",{className:"doc-link-card",href:f,target:"_blank",rel:"noreferrer","data-testid":i},h("span",null,n||"DOC"),h("strong",null,u),h("p",null,l),h("code",null,f))}function zT(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function GT(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function wT(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function ZT(u){return Array.isArray(u?.files)?u.files:[]}function ET(u){return Array.isArray(u?.jobs)?u.jobs:[]}function HT(u,l){if(!u||u===l)return l;let f=u.replace(/\/+$/u,""),n=f.slice(0,f.lastIndexOf("/"))||l;return n.lengthx.id==="baidu-netdisk")||null,[i,y]=Q_({loading:!1,actionLoading:!1,error:"",message:"",health:null,account:null,files:null,transfers:null,logs:null,selfTest:null,refreshedAt:null}),[_,$]=Q_("/"),[r,j]=Q_(null),[J,Q]=Q_(""),[U,F]=Q_({localPath:"sample.txt",remotePath:"/sample.txt"}),[N,L]=Q_({fsId:"",localPath:"downloads/"}),{addNotification:w}=bf(),W=i.health?.baidu?.appRoot||i.account?.rootPath||"/";O8(()=>{F((x)=>{let fu=new Set(["/sample.txt","/apps/UniDeskBaiduNetdisk/sample.txt"]);if(x.remotePath&&!fu.has(x.remotePath))return x;let yu=P9(W,"sample.txt");return x.remotePath===yu?x:{...x,remotePath:yu}})},[W]);async function K(x=_){let yu=await Vf(kf(f,`/api/files?dir=${encodeURIComponent(x||W)}&limit=100`));y((Ju)=>({...Ju,files:yu}))}async function q(){let x=await Vf(kf(f,"/api/transfers?limit=80"));y((fu)=>({...fu,transfers:x}))}async function z(){if(!n)return;y((x)=>({...x,loading:!0,error:"",message:""}));try{let x=await Vf(`${f}/microservices/baidu-netdisk/health`),fu=x?.baidu?.appRoot||W,yu=null,Ju=null;if(x?.auth?.loggedIn){yu=await Vf(kf(f,"/api/account?refresh=1"));let Bu=_&&_.startsWith(fu)?_:fu;$(Bu),Ju=await Vf(kf(f,`/api/files?dir=${encodeURIComponent(Bu)}&limit=100`))}else $(fu);let Vu=await Vf(kf(f,"/api/transfers?limit=80")),Lu=await Vf(kf(f,"/logs?limit=60"));y((Bu)=>({...Bu,loading:!1,health:x,account:yu?.account||null,files:Ju,transfers:Vu,logs:Lu,refreshedAt:new Date}))}catch(x){y((fu)=>({...fu,loading:!1,error:cu(x,"百度网盘服务加载失败")}))}}async function Z(){y((x)=>({...x,actionLoading:!0,error:"",message:""}));try{let x=await Vf(kf(f,"/api/auth/device/start"),{method:"POST",body:{}});j(x.session||null),y((fu)=>({...fu,actionLoading:!1,message:"设备码已生成,请扫码授权"}))}catch(x){y((fu)=>({...fu,actionLoading:!1,error:cu(x,"创建设备码失败")}))}}async function T(x=!1){if(!r?.id)return;if(x)y((fu)=>({...fu,actionLoading:!0,error:""}));try{let fu=await Vf(kf(f,`/api/auth/device/status?sessionId=${encodeURIComponent(r.id)}`));if(j(fu.session||null),fu.session?.status==="succeeded")y((yu)=>({...yu,actionLoading:!1,message:"授权成功,正在刷新账号与文件列表"})),await z();else if(x)y((yu)=>({...yu,actionLoading:!1}))}catch(fu){y((yu)=>({...yu,actionLoading:!1,error:cu(fu,"轮询登录状态失败")}))}}async function c(){y((x)=>({...x,actionLoading:!0,error:"",message:""}));try{await Vf(kf(f,"/api/auth/logout"),{method:"POST",body:{}}),j(null),y((x)=>({...x,actionLoading:!1,account:null,files:null,message:"本地 token 已清除"})),await z()}catch(x){y((fu)=>({...fu,actionLoading:!1,error:cu(x,"退出登录失败")}))}}async function X(x){x.preventDefault();let fu=J.trim();if(!fu)return;y((yu)=>({...yu,actionLoading:!0,error:"",message:""}));try{await Vf(kf(f,"/api/folders"),{method:"POST",body:{path:P9(_,fu)}}),Q(""),y((yu)=>({...yu,actionLoading:!1,message:"文件夹已创建"})),await K(_)}catch(yu){y((Ju)=>({...Ju,actionLoading:!1,error:cu(yu,"创建文件夹失败")}))}}async function S(x){if(!x)return;y((fu)=>({...fu,actionLoading:!0,error:"",message:""}));try{await Vf(kf(f,"/api/files/manage"),{method:"POST",body:{opera:"delete",filelist:[{path:x}],async:1}}),y((fu)=>({...fu,actionLoading:!1,message:"删除任务已提交"})),await K(_)}catch(fu){y((yu)=>({...yu,actionLoading:!1,error:cu(fu,"删除失败")}))}}async function p(x){x.preventDefault(),y((fu)=>({...fu,actionLoading:!0,error:"",message:""}));try{await Vf(kf(f,"/api/transfers/upload-from-path"),{method:"POST",body:U}),y((fu)=>({...fu,actionLoading:!1,message:"上传任务已入队"})),await q()}catch(fu){y((yu)=>({...yu,actionLoading:!1,error:cu(fu,"上传任务创建失败")}))}}async function Y(x){x.preventDefault(),y((fu)=>({...fu,actionLoading:!0,error:"",message:""}));try{await Vf(kf(f,"/api/transfers/download-to-path"),{method:"POST",body:N}),y((fu)=>({...fu,actionLoading:!1,message:"下载任务已入队"})),await q()}catch(fu){y((yu)=>({...yu,actionLoading:!1,error:cu(fu,"下载任务创建失败")}))}}async function t(x,fu){y((yu)=>({...yu,actionLoading:!0,error:"",message:""}));try{await Vf(kf(f,`/api/transfers/${encodeURIComponent(x)}/${fu}`),{method:"POST",body:{}}),y((yu)=>({...yu,actionLoading:!1,message:fu==="cancel"?"已请求取消任务":"任务已重新入队"})),await q()}catch(yu){y((Ju)=>({...Ju,actionLoading:!1,error:cu(yu,"任务操作失败")}))}}async function m(){y((x)=>({...x,actionLoading:!0,error:"",message:"正在运行上传/下载自测..."}));try{let x=await Vf(kf(f,"/api/self-test"),{method:"POST",body:{}});y((fu)=>({...fu,actionLoading:!1,selfTest:x,message:`上传/下载自测通过:${x.remotePath||""}`})),await K(_),await q()}catch(x){y((fu)=>({...fu,actionLoading:!1,error:cu(x,"上传/下载自测失败")}))}}if(O8(()=>{if(!n)return;z();return},[n?.id,n?.runtime?.providerStatus]),O8(()=>{if(!r?.id||r.status!=="pending")return;let x=window.setInterval(()=>void T(!1),Math.max(5000,Number(r.pollIntervalSeconds||5)*1000));return()=>window.clearInterval(x)},[r?.id,r?.status,r?.pollIntervalSeconds]),O8(()=>{if(!n)return;let x=window.setInterval(()=>void q(),5000);return()=>window.clearInterval(x)},[n?.id]),!n)return h(N_,{title:"Baidu Netdisk 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=baidu-netdisk"});let V=zT(n),D=wT(n),M=GT(n),I=i.health||{},O=i.account||I.auth?.account||null,C=I.auth||{},g=ZT(i.files),a=ET(i.transfers),iu=O?.quota||{},Au=Boolean(C.loggedIn||O),R=Boolean(C.configured);return h("div",{className:"baidu-netdisk-page","data-testid":"baidu-netdisk-page"},h(vi,{title:"Baidu Netdisk 工作台",eyebrow:"Containerized Storage Gateway",loading:i.loading,actions:h("div",{className:"panel-actions"},h("a",{className:"ghost-btn",href:"/docs/issue/baidu-netdisk-env-setup.md",target:"_blank",rel:"noreferrer","data-testid":"baidu-netdisk-config-doc-link"},"配置文档"),h("button",{type:"button",className:"ghost-btn",onClick:z,disabled:i.loading,"data-testid":"baidu-netdisk-refresh"},i.loading?"刷新中":"刷新"),h(f1,{title:"Baidu Netdisk 用户服务",data:n,onOpen:l,testId:"raw-baidu-netdisk-service"}))},h("div",{className:"baidu-netdisk-hero"},h("div",null,h("div",{className:"node-version-line"},h(Ii,{status:V.providerStatus==="online"?"online":"warn"},V.providerStatus||"unknown"),h("span",null,n.providerId),h(Ii,{status:M.public?"warn":"private"},M.public?"公网暴露":"仅 UniDesk frontend 代理访问")),h("p",{className:"muted paragraph"},n.description)),h("div",{className:"microservice-ref-card"},h("span",null,"Repo"),h("strong",null,D.url||"--"),h("code",null,D.commitId||"--")),h("div",{className:"microservice-ref-card"},h("span",null,"Private Backend"),h("strong",null,`${M.nodeBindHost||"--"}:${M.nodePort||"--"}`),h("code",null,`${D.composeFile||"--"} / ${D.composeService||"--"}`))),h(ul,{error:i.error,wide:!0})),h("div",{className:"metric-grid"},h(U_,{label:"Health",value:I.ok?"OK":"--",hint:I.storage?.postgres||"postgres",tone:I.ok?"ok":"warn"}),h(U_,{label:"OAuth",value:R?"已配置":"待配置",hint:R?"client + secret + token key":"需要设置 UNIDESK_BAIDU_NETDISK_*",tone:R?"ok":"warn"}),h(U_,{label:"Login",value:Au?"已登录":"未登录",hint:O?.username||"Device Code QR",tone:Au?"ok":"warn"}),h(U_,{label:"Work Root",value:OT(W),hint:W}),h(U_,{label:"Quota",value:o1(iu.used),hint:iu.total?`${iu.usedPercent||0}% / ${o1(iu.total)}`:"授权后刷新"}),h(U_,{label:"Transfers",value:KT(a.length),hint:`running ${i.transfers?.counts?.running||0} / failed ${i.transfers?.counts?.failed||0}`})),h(vi,{title:"文件浏览器",eyebrow:_,className:"baidu-files-panel",loading:i.loading,actions:h("div",{className:"panel-actions inline-actions"},h("button",{type:"button",className:"ghost-btn",onClick:()=>{let x=HT(_,W);$(x),K(x)},disabled:!Au||_===W},"上级"),h("button",{type:"button",className:"ghost-btn",onClick:()=>K(_),disabled:!Au},"刷新文件"),h(f1,{title:"Baidu Files",data:i.files,onOpen:l,testId:"raw-baidu-files"}))},h("form",{className:"baidu-pathbar",onSubmit:(x)=>{x.preventDefault(),K(_)}},h("input",{value:_,onChange:(x)=>$(x.target.value),disabled:!Au}),h("button",{type:"submit",className:"ghost-btn",disabled:!Au},"打开路径")),h("form",{className:"baidu-pathbar",onSubmit:X},h("input",{value:J,onChange:(x)=>Q(x.target.value),placeholder:"新文件夹名称",disabled:!Au}),h("button",{type:"submit",className:"primary-btn",disabled:!Au||!J.trim()},"新建文件夹")),!Au?h(N_,{title:"等待授权",text:"登录后通过 /api/files 读取工作目录文件列表"}):g.length===0?h(N_,{title:"目录为空",text:"可以从 staging 目录上传文件或新建文件夹"}):h("div",{className:"table-wrap","data-testid":"baidu-netdisk-file-table"},h("table",null,h("thead",null,h("tr",null,h("th",null,"名称"),h("th",null,"类型"),h("th",null,"大小"),h("th",null,"修改时间"),h("th",null,"fs_id"),h("th",null,"操作"))),h("tbody",null,g.map((x)=>h("tr",{key:x.fsId||x.path},h("td",null,h("strong",null,x.serverFilename||x.path),h("code",null,x.path||"--")),h("td",null,h(Ii,{status:x.isDir?"queued":"private"},x.isDir?"DIR":"FILE")),h("td",null,x.isDir?"--":o1(x.size)),h("td",null,x.serverMtime?Hu(x.serverMtime*1000):"--"),h("td",null,h("code",null,x.fsId||"--")),h("td",null,h("div",{className:"inline-actions"},x.isDir?h("button",{type:"button",className:"ghost-btn",onClick:()=>{$(x.path),K(x.path)}},"打开"):h("button",{type:"button",className:"ghost-btn",onClick:()=>L((fu)=>({...fu,fsId:x.fsId}))},"填入下载"),h("button",{type:"button",className:"ghost-btn",onClick:()=>S(x.path),disabled:i.actionLoading},"删除"))))))))),h("div",{className:"baidu-netdisk-grid"},h(vi,{title:"配置与文档",eyebrow:"Deployment References",className:"baidu-docs-panel",actions:h("div",{className:"panel-actions inline-actions"},h("a",{className:"ghost-btn",href:"/docs/issue/baidu-netdisk-env-setup.md",target:"_blank",rel:"noreferrer"},"打开环境配置"),h("a",{className:"ghost-btn",href:"/docs/issue/baidu-netdisk-user-service.md",target:"_blank",rel:"noreferrer"},"打开服务方案"))},h("p",{className:"muted paragraph"},R?"OAuth 运行时变量已配置;如需轮换密钥、迁移部署或排查代理边界,可直接打开下面的项目内文档。":"首次使用请先按环境变量配置文档填入百度应用 client id / secret,然后重建 baidu-netdisk 服务并刷新本页。"),h("div",{className:"baidu-doc-grid","data-testid":"baidu-netdisk-doc-links"},h(F_,{title:"环境变量配置",text:"填写 UNIDESK_BAIDU_NETDISK_CLIENT_ID、CLIENT_SECRET、TOKEN_KEY,并执行重建与健康检查。",href:"/docs/issue/baidu-netdisk-env-setup.md",badge:"SETUP",testId:"baidu-netdisk-env-doc-card"}),h(F_,{title:"服务方案与 API",text:"说明 OAuth Device Code、根目录工作区、staging 上传下载任务和后端 API 设计。",href:"/docs/issue/baidu-netdisk-user-service.md",badge:"DESIGN"}),h(F_,{title:"用户服务安全边界",text:"查看 UniDesk microservice 私有代理、允许路径、frontendOnly 和密钥边界规则。",href:"/docs/reference/microservices.md",badge:"REF"}),h(F_,{title:"部署与重建流程",text:"查看 server rebuild、Compose 编排、健康检查和交付验证的长期规则。",href:"/docs/reference/deployment.md",badge:"DEPLOY"}),h(F_,{title:"CLI 验证命令",text:"查看 microservice health/proxy、server rebuild、job status 等命令入口。",href:"/docs/reference/cli.md",badge:"CLI"}),h(F_,{title:"百度设备码模式",text:"打开百度官方 OAuth Device Code 文档,对照扫码登录和轮询参数。",href:"https://pan.baidu.com/union/doc/fl1x114ti",badge:"OFFICIAL"}))),h(vi,{title:"设备码登录",eyebrow:"OAuth Device Code",className:"baidu-login-panel",loading:i.actionLoading,actions:h("div",{className:"panel-actions inline-actions"},h("button",{type:"button",className:"primary-btn",onClick:Z,disabled:i.actionLoading||!R,"data-testid":"baidu-netdisk-start-login"},"生成二维码"),r?.id?h("button",{type:"button",className:"ghost-btn",onClick:()=>T(!0),disabled:i.actionLoading},"检查状态"):null,Au?h("button",{type:"button",className:"ghost-btn",onClick:c,disabled:i.actionLoading},"清除本地登录"):null,h(f1,{title:"Baidu Device Session",data:r||C.latestSession,onOpen:l,testId:"raw-baidu-device-session"}))},h("div",{className:"baidu-login-card","data-testid":"baidu-netdisk-login-card"},h("div",{className:"baidu-qr-frame"},r?.qrcodeUrl?h("img",{src:r.qrcodeUrl,alt:"百度网盘设备码授权二维码","data-testid":"baidu-netdisk-qrcode"}):h(N_,{title:R?"等待二维码":"OAuth 未配置",text:R?"点击生成二维码后使用百度网盘或百度 App 扫码":"设置 client id、secret 和 token key 后重建服务"})),h("div",{className:"claudeqq-login-copy"},h("div",{className:"node-version-line"},h(Ii,{status:Au?"online":r?.status==="pending"?"warn":"unknown"},Au?"已登录":r?.status||"未开始"),h("span",null,r?.secondsRemaining!==void 0?`${r.secondsRemaining}s`:"--"),h("span",null,"scope basic,netdisk")),h("p",{className:"muted paragraph"},Au?"access token / refresh token 已加密保存到 PostgreSQL;前端只看到脱敏登录态。":"后端使用百度 OAuth Device Code 轮询换取 token;二维码过期后重新生成即可。"),h("div",{className:"microservice-ref-card"},h("span",null,"User Code"),h("strong",null,r?.userCode||"--"),h("code",null,r?.verificationUrl||"https://openapi.baidu.com/device")),h("div",{className:"microservice-ref-card"},h("span",null,"Expires"),h("strong",null,r?.expiresAt?Hu(r.expiresAt):"--"),h("code",null,r?.error||"no token exposed"))))),h(vi,{title:"账号与容量",eyebrow:i.refreshedAt?`Updated ${Al(i.refreshedAt)}`:"Account",loading:i.loading,actions:h("div",{className:"panel-actions inline-actions"},h(f1,{title:"Baidu Account",data:O,onOpen:l,testId:"raw-baidu-account"}))},O?h("div",{className:"baidu-account-card"},h("div",{className:"node-version-line"},h(Ii,{status:"online"},"connected"),h("span",null,O.baiduUid||"--"),h("span",null,`VIP ${O.vipType??"--"}`)),h("h3",null,O.username||"Baidu Netdisk"),h("p",{className:"muted paragraph"},`工作目录固定在 ${O.rootPath||W};v1 上传/下载只读写容器 staging 目录,不把大文件字节流穿过 UniDesk proxy。`),h("div",{className:"quota-bar"},h("span",{style:{width:`${Math.max(0,Math.min(100,Number(iu.usedPercent||0)))}%`}})),h("div",{className:"microservice-ref-card"},h("span",null,"Quota"),h("strong",null,`${o1(iu.used)} / ${o1(iu.total)}`),h("code",null,`${iu.usedPercent||0}% used`))):h(N_,{title:"尚未登录",text:"扫码授权后这里会显示账号、UID、会员状态和容量"})),h(vi,{title:"传输任务",eyebrow:"staging path jobs",className:"baidu-transfers-panel",loading:i.actionLoading,actions:h("div",{className:"panel-actions inline-actions"},h("button",{type:"button",className:"primary-btn",onClick:m,disabled:!Au||i.actionLoading,"data-testid":"baidu-netdisk-self-test"},"运行自测"),h("button",{type:"button",className:"ghost-btn",onClick:q},"刷新任务"),h(f1,{title:"Baidu Transfers",data:i.transfers,onOpen:l,testId:"raw-baidu-transfers"}))},h("div",{className:"baidu-transfer-forms"},h("form",{className:"stack-form",onSubmit:p,"data-testid":"baidu-upload-form"},h("label",null,"容器 staging 文件",h("input",{value:U.localPath,onChange:(x)=>F((fu)=>({...fu,localPath:x.target.value})),placeholder:"sample.txt"})),h("label",null,"百度网盘目标路径",h("input",{value:U.remotePath,onChange:(x)=>F((fu)=>({...fu,remotePath:x.target.value})),placeholder:P9(W,"sample.txt")})),h("button",{type:"submit",className:"primary-btn",disabled:!Au||i.actionLoading},"上传 staging 文件")),h("form",{className:"stack-form",onSubmit:Y,"data-testid":"baidu-download-form"},h("label",null,"文件 fs_id",h("input",{value:N.fsId,onChange:(x)=>L((fu)=>({...fu,fsId:x.target.value})),placeholder:"从文件表填入"})),h("label",null,"保存到 staging 路径",h("input",{value:N.localPath,onChange:(x)=>L((fu)=>({...fu,localPath:x.target.value})),placeholder:"downloads/"})),h("button",{type:"submit",className:"primary-btn",disabled:!Au||!N.fsId||i.actionLoading},"下载到 staging"))),i.selfTest?h("div",{className:"baidu-account-card","data-testid":"baidu-netdisk-self-test-result"},h("div",{className:"node-version-line"},h(Ii,{status:i.selfTest.ok?"online":"warn"},i.selfTest.ok?"self-test ok":"self-test"),h("span",null,o1(i.selfTest.sizeBytes))),h("h3",null,i.selfTest.remotePath||"Baidu self-test"),h("div",{className:"microservice-ref-card"},h("span",null,"fs_id"),h("strong",null,i.selfTest.fsId||"--"),h("code",null,i.selfTest.downloadedPath||"--")),h("div",{className:"microservice-ref-card"},h("span",null,"MD5"),h("strong",null,i.selfTest.downloadedMd5||"--"),h("code",null,i.selfTest.expectedMd5||"--")),h(f1,{title:"Baidu Self Test",data:i.selfTest,onOpen:l,testId:"raw-baidu-self-test"})):null,a.length===0?h(N_,{title:"暂无传输任务",text:"上传/下载任务会在后端容器内执行,避免大文件穿过 UniDesk proxy"}):h("div",{className:"table-wrap","data-testid":"baidu-transfer-table"},h("table",null,h("thead",null,h("tr",null,h("th",null,"状态"),h("th",null,"方向"),h("th",null,"路径"),h("th",null,"进度"),h("th",null,"时间"),h("th",null,"操作"))),h("tbody",null,a.map((x)=>h("tr",{key:x.id},h("td",null,h(Ii,{status:x.status},x.status)),h("td",null,x.direction),h("td",null,h("strong",null,x.remotePath||x.fsId||"--"),h("code",null,x.localPath||"--"),x.error?h("span",{className:"form-error"},x.error):null),h("td",null,h(TT,{percent:x.progressPercent}),h("span",{className:"muted"},`${o1(x.bytesDone)} / ${o1(x.sizeBytes)}`)),h("td",null,Hu(x.updatedAt)),h("td",null,h("div",{className:"inline-actions"},["queued","running"].includes(x.status)?h("button",{type:"button",className:"ghost-btn",onClick:()=>t(x.id,"cancel")},"取消"):null,["failed","canceled"].includes(x.status)?h("button",{type:"button",className:"ghost-btn",onClick:()=>t(x.id,"retry")},"重试"):null,h(f1,{title:`Transfer ${x.id}`,data:x,onOpen:l}))))))))),h(vi,{title:"安全与日志",eyebrow:"redacted diagnostics",className:"baidu-wide-panel",loading:i.loading,actions:h("div",{className:"panel-actions inline-actions"},h(f1,{title:"Baidu Health",data:I,onOpen:l,testId:"raw-baidu-health"}),h(f1,{title:"Baidu Logs",data:i.logs,onOpen:l,testId:"raw-baidu-logs"}))},h("div",{className:"policy-grid"},h("article",null,h("b",null,"私有后端"),h("span",null,"4244 只在 Compose 网络 expose,浏览器经 UniDesk 同源代理访问")),h("article",null,h("b",null,"Token 加密"),h("span",null,"access/refresh token 使用 BAIDU_NETDISK_TOKEN_KEY 加密后写入 PostgreSQL")),h("article",null,h("b",null,"无浏览器大文件流"),h("span",null,"上传/下载以容器 staging 目录为边界,避免 proxy 文本通道传输大字节流"))))))}var c8=bu(Wl(),1);var uu=c8.default.createElement,{useEffect:VT}=c8.default,V8=c8.default.useState,gi={label:"主用户私聊账号",userId:645275593};function M9(u){let l=Number(u);return Number.isFinite(l)?l.toLocaleString("zh-CN"):"--"}async function d1(u,l={}){return Zu(u,{failureFields:["ok","success"],...l})}async function BT(u){let l=await fetch(u,{credentials:"same-origin"}),f=await l.text();try{return f?JSON.parse(f):{ok:l.ok,status:l.status}}catch{return{ok:l.ok,status:l.status,text:f}}}function B8({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return uu("span",{className:`status-badge ${f}`},l||u||"unknown")}function W_({label:u,value:l,hint:f,tone:n}){return uu("article",{className:`metric-card ${n||""}`},uu("div",{className:"metric-label"},u),uu("div",{className:"metric-value"},l),uu("div",{className:"metric-hint"},f))}function q_({title:u,eyebrow:l,actions:f,children:n,className:i,loading:y}){return uu("section",{className:`panel ${i||""}`},uu("div",{className:"panel-head"},uu("div",null,l?uu("p",{className:"panel-eyebrow"},l):null,uu(nl,{title:u,loading:y})),f?uu("div",{className:"panel-actions"},f):null),uu("div",{className:"panel-body"},n))}function W3({title:u,data:l,onOpen:f,testId:n}){return uu("button",{type:"button",className:"ghost-btn","data-testid":n,onClick:(i)=>{i?.stopPropagation?.(),f(u,l)}},"查看原始JSON")}function q3({title:u,text:l}){return uu("div",{className:"empty-state"},uu("strong",null,u),uu("span",null,l))}function cT(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function XT(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function YT(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function e1(u,l){return`${u}/microservices/claudeqq/proxy${l}`}function tT(u){return Array.isArray(u?.events)?u.events.slice(0,80):[]}function DT(u){return Array.isArray(u?.subscriptions)?u.subscriptions.slice(0,50):[]}function ST(u){return Array.isArray(u?.messages)?u.messages.slice(0,30):[]}function lq(u){let l=u?.text??u?.message??u?.raw?.raw_message;if(typeof l!=="string")return"--";return l.length>180?`${l.slice(0,177)}...`:l}function fq(u){let l=u?.groupId??u?.group_id??(u?.message_type==="group"?u?.target_id:void 0),f=u?.userId??u?.user_id??(u?.message_type==="private"?u?.target_id:void 0);if(l)return`群 ${l}`;if(f)return`私聊 ${f}`;return"--"}function nq({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let n=u.find((O)=>O.id==="claudeqq")||null,[i,y]=V8({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}),[_,$]=V8({targetType:"private",targetId:String(gi.userId),message:""}),[r,j]=V8({name:"unidesk-callback",targetUrl:"",eventTypes:"message",secret:""}),[J,Q]=V8(""),{addNotification:U}=bf();async function F(){if(!n)return;y((O)=>({...O,loading:!0,error:""}));try{let[O,C,g,a,iu]=await Promise.all([BT(`${f}/microservices/claudeqq/health`),d1(e1(f,"/api/server/status")),d1(e1(f,"/api/events/recent?limit=60")),d1(e1(f,"/api/events/subscriptions")),d1(e1(f,"/api/messages/sent?limit=20"))]);if(y((Au)=>({...Au,loading:!1,error:"",health:O,status:C,events:g,subscriptions:a,sent:iu,refreshedAt:new Date})),!i.qrcodeFetched)N(!1)}catch(O){y((C)=>({...C,loading:!1,error:cu(O,"ClaudeQQ 加载失败")}))}}async function N(O=!0){if(!n)return;y((C)=>({...C,qrLoading:!0,error:O?"":C.error}));try{let C=await d1(e1(f,"/api/napcat/login")),g=C?.napcat?.qrcode||C?.qrcode||null;y((a)=>({...a,qrLoading:!1,error:"",napcatLogin:C,napcatQrcode:g,qrcodeFetched:!0,qrcodeRefreshedAt:new Date}))}catch(C){y((g)=>({...g,qrLoading:!1,error:O||!g.napcatQrcode?cu(C,"NapCat 二维码加载失败"):g.error}))}}async function L(O){O.preventDefault(),Q("");let C=Number(_.targetId);if(!Number.isFinite(C)||C<=0||_.message.trim().length===0){y((g)=>({...g,error:"请填写 QQ 目标和消息内容"}));return}try{await d1(e1(f,"/api/push/text"),{method:"POST",body:JSON.stringify({userId:_.targetType==="private"?C:void 0,groupId:_.targetType==="group"?C:void 0,message:_.message})});let g="消息推送请求已提交";$((a)=>({...a,targetType:"private",targetId:String(gi.userId),message:""})),Q(g),U("success",g),await F()}catch(g){y((a)=>({...a,error:cu(g,"发送失败")}))}}async function w(O){if(O.preventDefault(),Q(""),r.targetUrl.trim().length===0){y((C)=>({...C,error:"请填写订阅回调 URL"}));return}try{await d1(e1(f,"/api/events/subscriptions"),{method:"POST",body:JSON.stringify({name:r.name,targetUrl:r.targetUrl,eventTypes:r.eventTypes.split(",").map((g)=>g.trim()).filter(Boolean),secret:r.secret||void 0,enabled:!0})});let C="事件订阅已创建";Q(C),U("success",C),await F()}catch(C){y((g)=>({...g,error:cu(C,"订阅失败")}))}}async function W(O){if(!O)return;Q("");try{await d1(e1(f,`/api/events/subscriptions/${encodeURIComponent(O)}`),{method:"DELETE"});let C="事件订阅已删除";Q(C),U("success",C),await F()}catch(C){y((g)=>({...g,error:cu(C,"删除订阅失败")}))}}if(VT(()=>{if(!n)return;F();return},[n?.id,n?.runtime?.providerStatus]),!n)return uu(q3,{title:"ClaudeQQ 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=claudeqq"});let K=cT(n),q=YT(n),z=XT(n),Z=i.health||{},T=i.status||{},c=i.napcatLogin||{},X=Z.napcat||T.napcat||{},S={...c.napcat||{},...X,qrcode:i.napcatQrcode||{},webui:X.webui||c.napcat?.webui},p=c.login||{},Y=i.napcatQrcode||{},t=tT(i.events),m=DT(i.subscriptions),V=ST(i.sent),D=Boolean(S.httpConnected||p.ready),M=String(S.loginState||p.state||(D?"logged_in":"unknown")),I=Boolean(Y.available&&Y.dataUrl);return uu("div",{className:"claudeqq-page","data-testid":"claudeqq-page"},uu(q_,{title:"ClaudeQQ 工作台",eyebrow:"D601 QQ Event Gateway",loading:i.loading,actions:uu("div",{className:"panel-actions"},uu("button",{type:"button",className:"ghost-btn",onClick:F,disabled:i.loading,"data-testid":"claudeqq-refresh-button"},i.loading?"刷新中":"刷新"),uu(W3,{title:"ClaudeQQ 用户服务",data:n,onOpen:l,testId:"raw-claudeqq-service"}))},uu("div",{className:"findjob-hero"},uu("div",null,uu("div",{className:"node-version-line"},uu(B8,{status:K.providerStatus==="online"?"online":"warn"},K.providerStatus||"unknown"),uu("span",null,n.providerId),uu("span",null,z.public?"公网暴露":"仅 UniDesk frontend 代理访问")),uu("p",{className:"muted paragraph"},n.description)),uu("div",{className:"microservice-ref-card"},uu("span",null,"Repo"),uu("strong",null,q.url||"--"),uu("code",null,q.commitId||"--")),uu("div",{className:"microservice-ref-card"},uu("span",null,"D601 k3s Service"),uu("strong",null,`${z.nodeBindHost||"--"}:${z.nodePort||"--"}`),uu("code",null,`${z.proxyMode||"--"} / ${q.composeFile||"--"}`))),uu(ul,{error:i.error,wide:!0})),uu("div",{className:"metric-grid"},uu(W_,{label:"Health",value:Z.ok||Z.status==="ok"?"OK":"--",hint:"D601 /health",tone:Z.ok||Z.status==="ok"?"ok":"warn"}),uu(W_,{label:"NapCat HTTP",value:S.httpConnected||S.http?.connected?"OK":"离线",hint:`${S.httpHost||Z.napcat?.httpHost||"--"}:${S.httpPort||Z.napcat?.httpPort||"--"}`}),uu(W_,{label:"NapCat WS",value:S.wsConnected||S.ws?.connected?"OK":"离线",hint:`${S.wsHost||Z.napcat?.wsHost||"--"}:${S.wsPort||Z.napcat?.wsPort||"--"}`}),uu(W_,{label:"事件缓存",value:M9(i.events?.count??t.length),hint:"recent QQ events"}),uu(W_,{label:"订阅",value:M9(i.subscriptions?.count??m.length),hint:"webhook subscribers"}),uu(W_,{label:"已发送",value:M9(i.sent?.count??V.length),hint:"sent message log"})),uu("div",{className:"findjob-grid"},uu(q_,{title:"NapCat 容器登录",eyebrow:"QR Login",className:"claudeqq-login-panel",loading:i.qrLoading,actions:uu("div",{className:"panel-actions inline-actions"},uu("button",{type:"button",className:"ghost-btn",onClick:()=>N(!0),disabled:i.qrLoading,"data-testid":"claudeqq-napcat-refresh"},i.qrLoading?"刷新中":"手动刷新二维码"),uu(W3,{title:"NapCat Login",data:i.napcatLogin,onOpen:l,testId:"raw-claudeqq-napcat-login"}))},uu("div",{className:"claudeqq-login-card","data-testid":"claudeqq-napcat-login"},uu("div",{className:"claudeqq-qr-frame"},I?uu("img",{src:Y.dataUrl,alt:"NapCat QQ 登录二维码","data-testid":"claudeqq-napcat-qrcode"}):uu(q3,{title:"等待二维码",text:"NapCat 容器启动后会把登录二维码写入 cache/qrcode.png"})),uu("div",{className:"claudeqq-login-copy"},uu("div",{className:"node-version-line"},uu(B8,{status:D?"online":I?"warn":"unknown"},D?"已登录":I?"待扫码":"等待二维码"),uu("span",null,M),uu("span",null,"D601 containerized")),uu("p",{className:"muted paragraph"},D?"NapCat 已登录,ClaudeQQ 可通过容器内 HTTP/WS 链路收发 QQ 消息。":"用手机 QQ 扫描二维码授权登录。二维码只在首次加载或手动刷新时更新,D601 的 NapCat 端口仍只绑定 127.0.0.1。"),uu("div",{className:"microservice-ref-card"},uu("span",null,"NapCat WebUI"),uu("strong",null,S.webui?.url||"http://napcat:6099/webui"),uu("code",null,"local-only / proxied QR login")),uu("div",{className:"microservice-ref-card"},uu("span",null,"QR Source"),uu("strong",null,Y.modifiedAt?Hu(Y.modifiedAt):i.qrcodeRefreshedAt?Hu(i.qrcodeRefreshedAt):"--"),uu("code",null,Y.file||"/napcat/cache/qrcode.png"))))),uu(q_,{title:"消息推送",eyebrow:"Push API"},uu("div",{className:"microservice-ref-card"},uu("span",null,gi.label),uu("strong",null,String(gi.userId)),uu("code",null,"private userId / 默认推送测试目标")),uu("form",{className:"stack-form",onSubmit:L,"data-testid":"claudeqq-push-form"},uu("label",null,"目标类型",uu("select",{value:_.targetType,onChange:(O)=>$((C)=>({...C,targetType:O.target.value}))},uu("option",{value:"private"},"私聊 userId"),uu("option",{value:"group"},"群 groupId"))),uu("label",null,"QQ ID",uu("input",{value:_.targetId,onChange:(O)=>$((C)=>({...C,targetId:O.target.value})),placeholder:String(gi.userId)})),uu("label",null,"消息内容",uu("textarea",{value:_.message,onChange:(O)=>$((C)=>({...C,message:O.target.value})),rows:4,placeholder:"通过 ClaudeQQ 推送一条 QQ 消息"})),uu("button",{type:"submit",className:"primary-btn"},"发送 QQ 消息")),uu("p",{className:"muted paragraph"},`主 server 和其他用户服务可通过 UniDesk 同源代理调用 /api/push/text;当前人工推送测试默认使用 ${gi.label} ${gi.userId},不需要暴露 D601 后端端口。`)),uu(q_,{title:"QQ 事件订阅",eyebrow:"Webhook Subscription",loading:i.loading},uu("form",{className:"stack-form",onSubmit:w,"data-testid":"claudeqq-subscription-form"},uu("label",null,"订阅名称",uu("input",{value:r.name,onChange:(O)=>j((C)=>({...C,name:O.target.value}))})),uu("label",null,"回调 URL",uu("input",{value:r.targetUrl,onChange:(O)=>j((C)=>({...C,targetUrl:O.target.value})),placeholder:"http://host.docker.internal:18080/..."})),uu("label",null,"事件类型",uu("input",{value:r.eventTypes,onChange:(O)=>j((C)=>({...C,eventTypes:O.target.value})),placeholder:"message,notice"})),uu("label",null,"签名密钥",uu("input",{value:r.secret,onChange:(O)=>j((C)=>({...C,secret:O.target.value})),placeholder:"可选,生成 x-claudeqq-signature"})),uu("button",{type:"submit",className:"primary-btn"},"创建订阅")),m.length===0?uu(q3,{title:"暂无订阅",text:"可以为 main server 或其他用户服务注册 HTTP webhook"}):uu("div",{className:"table-wrap","data-testid":"claudeqq-subscription-table"},uu("table",null,uu("thead",null,uu("tr",null,uu("th",null,"名称"),uu("th",null,"状态"),uu("th",null,"事件"),uu("th",null,"回调"),uu("th",null,"最近投递"),uu("th",null,"操作"))),uu("tbody",null,m.map((O)=>uu("tr",{key:O.id},uu("td",null,uu("strong",null,O.name||O.id),uu("code",null,O.id||"--")),uu("td",null,uu(B8,{status:O.enabled?"online":"warn"},O.enabled?"enabled":"disabled")),uu("td",null,Array.isArray(O.eventTypes)?O.eventTypes.join(", "):"message"),uu("td",null,O.targetUrl||"--"),uu("td",null,O.lastDelivery?`${O.lastDelivery.ok?"OK":"FAIL"} ${Hu(O.lastDelivery.at)}`:"--"),uu("td",null,uu("button",{type:"button",className:"ghost-btn",onClick:()=>W(O.id)},"删除"))))))),uu("div",{className:"panel-actions inline-actions"},uu(W3,{title:"ClaudeQQ Subscriptions",data:i.subscriptions,onOpen:l,testId:"raw-claudeqq-subscriptions"}))),uu(q_,{title:"最近 QQ 事件",eyebrow:i.refreshedAt?`Updated ${Al(i.refreshedAt)}`:"Event Stream",loading:i.loading},t.length===0?uu(q3,{title:"暂无事件",text:"等待 NapCat WebSocket 上报 QQ 消息事件,或通过订阅 API 消费后续事件"}):uu("div",{className:"table-wrap","data-testid":"claudeqq-event-list"},uu("table",null,uu("thead",null,uu("tr",null,uu("th",null,"时间"),uu("th",null,"类型"),uu("th",null,"会话"),uu("th",null,"消息"),uu("th",null,"ID"))),uu("tbody",null,t.map((O)=>uu("tr",{key:O.id},uu("td",null,Hu(O.receivedAt||O.timestamp)),uu("td",null,uu(B8,{status:O.postType||O.eventType},O.postType||O.eventType||"--")),uu("td",null,fq(O)),uu("td",null,lq(O)),uu("td",null,uu("code",null,O.messageId||O.id||"--"))))))),uu("div",{className:"panel-actions inline-actions"},uu(W3,{title:"ClaudeQQ Events",data:i.events,onOpen:l,testId:"raw-claudeqq-events"}))),uu(q_,{title:"已发送消息",eyebrow:`${V.length} Sent`,loading:i.loading},V.length===0?uu(q3,{title:"暂无发送记录",text:"发送日志来自 ClaudeQQ bot_workspace/messages/sent_messages.jsonl"}):uu("div",{className:"table-wrap"},uu("table",null,uu("thead",null,uu("tr",null,uu("th",null,"时间"),uu("th",null,"目标"),uu("th",null,"消息"),uu("th",null,"结果"))),uu("tbody",null,V.map((O,C)=>uu("tr",{key:O.id||C},uu("td",null,Hu(O.timestamp||O.sentAt||O.createdAt)),uu("td",null,fq(O)),uu("td",null,lq(O)),uu("td",null,O.status||O.messageId||O.message_id||"--")))))),uu("div",{className:"panel-actions inline-actions"},uu(W3,{title:"ClaudeQQ Sent Messages",data:i.sent,onOpen:l,testId:"raw-claudeqq-sent"})))))}var B3=bu(Wl(),1);var _q=bu(Wl(),1),Gl=_q.default.createElement;function L_({markdown:u,className:l,testId:f}){let n=String(u??"").trimEnd(),i=["markdown-body",l].filter(Boolean).join(" ");return Gl("div",{className:i,"data-testid":f},$q(n,"md"))}function $q(u,l){let f=PT(u).split(` -`),n=[],i=0;while(i\s?/u.test(y)){let Q=[];while(i\s?(.*)$/u);if(F!==null){Q.push(F[1]),i+=1;continue}if(U.trim().length===0){Q.push(""),i+=1;continue}break}n.push(Gl("blockquote",{key:`${l}-quote-${i}`},$q(Q.join(` -`),`${l}-quote-${i}`)));continue}if(Aq(f,i)){let Q=i,U=L3(f[i]??""),F=L3(f[i+1]??"");i+=2;let N=[];while(i0)N.push(L3(f[i]??"")),i+=1;n.push(xT(U,F,N,`${l}-table-${Q}`));continue}let r=Y8(y);if(r!==null){let Q=i,U=r.ordered,F=r.start,N=[];while(ipT(w,`${l}-list-${Q}-${W}`))));continue}let j=i,J=[];while(i0&&!CT(f,i))J.push(f[i].trim()),i+=1;if(J.length===0)J.push(y.trim()),i+=1;n.push(Gl("p",{key:`${l}-p-${j}`},On(J.join(` -`),`${l}-p-${j}`)))}return n}function PT(u){return String(u||"").replace(/\r\n/gu,` +(()=>{var CE=Object.create;var{getPrototypeOf:pE,defineProperty:NU,getOwnPropertyNames:xE}=Object;var mE=Object.prototype.hasOwnProperty;function RE(u){return this[u]}var bE,kE,ku=(u,l,f)=>{var n=u!=null&&typeof u==="object";if(n){var y=l?bE??=new WeakMap:kE??=new WeakMap,i=y.get(u);if(i)return i}f=u!=null?CE(pE(u)):{};let _=l||!u||!u.__esModule?NU(f,"default",{value:u,enumerable:!0}):f;for(let $ of xE(u))if(!mE.call(_,$))NU(_,$,{get:RE.bind(u,$),enumerable:!0});if(n)y.set(u,_);return _};var q0=(u,l)=>()=>(l||u((l={exports:{}}).exports,l),l.exports);var Jl=((u)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(u,{get:(l,f)=>(typeof require<"u"?require:l)[f]}):u)(function(u){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+u+'" is not supported')});var OU=q0((_l)=>{var q$=Symbol.for("react.element"),hE=Symbol.for("react.portal"),IE=Symbol.for("react.fragment"),vE=Symbol.for("react.strict_mode"),gE=Symbol.for("react.profiler"),sE=Symbol.for("react.provider"),aE=Symbol.for("react.context"),oE=Symbol.for("react.forward_ref"),dE=Symbol.for("react.suspense"),eE=Symbol.for("react.memo"),uH=Symbol.for("react.lazy"),FU=Symbol.iterator;function lH(u){if(u===null||typeof u!=="object")return null;return u=FU&&u[FU]||u["@@iterator"],typeof u==="function"?u:null}var LU={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},KU=Object.assign,zU={};function Pi(u,l,f){this.props=u,this.context=l,this.refs=zU,this.updater=f||LU}Pi.prototype.isReactComponent={};Pi.prototype.setState=function(u,l){if(typeof u!=="object"&&typeof u!=="function"&&u!=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,u,l,"setState")};Pi.prototype.forceUpdate=function(u){this.updater.enqueueForceUpdate(this,u,"forceUpdate")};function GU(){}GU.prototype=Pi.prototype;function U2(u,l,f){this.props=u,this.context=l,this.refs=zU,this.updater=f||LU}var N2=U2.prototype=new GU;N2.constructor=U2;KU(N2,Pi.prototype);N2.isPureReactComponent=!0;var WU=Array.isArray,wU=Object.prototype.hasOwnProperty,F2={current:null},ZU={key:!0,ref:!0,__self:!0,__source:!0};function EU(u,l,f){var n,y={},i=null,_=null;if(l!=null)for(n in l.ref!==void 0&&(_=l.ref),l.key!==void 0&&(i=""+l.key),l)wU.call(l,n)&&!ZU.hasOwnProperty(n)&&(y[n]=l[n]);var $=arguments.length-2;if($===1)y.children=f;else if(1<$){for(var A=Array($),j=0;j<$;j++)A[j]=arguments[j+2];y.children=A}if(u&&u.defaultProps)for(n in $=u.defaultProps,$)y[n]===void 0&&(y[n]=$[n]);return{$$typeof:q$,type:u,key:i,ref:_,props:y,_owner:F2.current}}function fH(u,l){return{$$typeof:q$,type:u.type,key:l,ref:u.ref,props:u.props,_owner:u._owner}}function W2(u){return typeof u==="object"&&u!==null&&u.$$typeof===q$}function nH(u){var l={"=":"=0",":":"=2"};return"$"+u.replace(/[=:]/g,function(f){return l[f]})}var qU=/\/+/g;function Q2(u,l){return typeof u==="object"&&u!==null&&u.key!=null?nH(""+u.key):l.toString(36)}function y8(u,l,f,n,y){var i=typeof u;if(i==="undefined"||i==="boolean")u=null;var _=!1;if(u===null)_=!0;else switch(i){case"string":case"number":_=!0;break;case"object":switch(u.$$typeof){case q$:case hE:_=!0}}if(_)return _=u,y=y(_),u=n===""?"."+Q2(_,0):n,WU(y)?(f="",u!=null&&(f=u.replace(qU,"$&/")+"/"),y8(y,l,f,"",function(j){return j})):y!=null&&(W2(y)&&(y=fH(y,f+(!y.key||_&&_.key===y.key?"":(""+y.key).replace(qU,"$&/")+"/")+u)),l.push(y)),1;if(_=0,n=n===""?".":n+":",WU(u))for(var $=0;${TU.exports=OU()});var MU=q0((Zl)=>{function z2(u,l){var f=u.length;u.push(l);u:for(;0>>1,y=u[n];if(0<$8(y,l))u[n]=l,u[f]=y,f=n;else break u}}function d0(u){return u.length===0?null:u[0]}function J8(u){if(u.length===0)return null;var l=u[0],f=u.pop();if(f!==l){u[0]=f;u:for(var n=0,y=u.length,i=y>>>1;n$8($,f))A$8(j,$)?(u[n]=j,u[A]=f,n=A):(u[n]=$,u[_]=f,n=_);else if(A$8(j,f))u[n]=j,u[A]=f,n=A;else break u}}return l}function $8(u,l){var f=u.sortIndex-l.sortIndex;return f!==0?f:u.id-l.id}if(typeof performance==="object"&&typeof performance.now==="function")G2=performance,Zl.unstable_now=function(){return G2.now()};else A8=Date,w2=A8.now(),Zl.unstable_now=function(){return A8.now()-w2};var G2,A8,w2,Gn=[],B1=[],rH=1,D0=null,Ef=3,Q8=!1,cy=!1,K$=!1,YU=typeof setTimeout==="function"?setTimeout:null,DU=typeof clearTimeout==="function"?clearTimeout:null,cU=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function Z2(u){for(var l=d0(B1);l!==null;){if(l.callback===null)J8(B1);else if(l.startTime<=u)J8(B1),l.sortIndex=l.expirationTime,z2(Gn,l);else break;l=d0(B1)}}function H2(u){if(K$=!1,Z2(u),!cy)if(d0(Gn)!==null)cy=!0,T2(O2);else{var l=d0(B1);l!==null&&V2(H2,l.startTime-u)}}function O2(u,l){cy=!1,K$&&(K$=!1,DU(z$),z$=-1),Q8=!0;var f=Ef;try{Z2(l);for(D0=d0(Gn);D0!==null&&(!(D0.expirationTime>l)||u&&!PU());){var n=D0.callback;if(typeof n==="function"){D0.callback=null,Ef=D0.priorityLevel;var y=n(D0.expirationTime<=l);l=Zl.unstable_now(),typeof y==="function"?D0.callback=y:D0===d0(Gn)&&J8(Gn),Z2(l)}else J8(Gn);D0=d0(Gn)}if(D0!==null)var i=!0;else{var _=d0(B1);_!==null&&V2(H2,_.startTime-l),i=!1}return i}finally{D0=null,Ef=f,Q8=!1}}var U8=!1,r8=null,z$=-1,tU=5,SU=-1;function PU(){return Zl.unstable_now()-SUu||125n?(u.sortIndex=f,z2(B1,u),d0(Gn)===null&&u===d0(B1)&&(K$?(DU(z$),z$=-1):K$=!0,V2(H2,f-n))):(u.sortIndex=y,z2(Gn,u),cy||Q8||(cy=!0,T2(O2))),u};Zl.unstable_shouldYield=PU;Zl.unstable_wrapCallback=function(u){var l=Ef;return function(){var f=Ef;Ef=l;try{return u.apply(this,arguments)}finally{Ef=f}}}});var pU=q0((Sx,CU)=>{CU.exports=MU()});var mW=q0((Z0)=>{var jH=ql(),G0=pU();function Ku(u){for(var l="https://reactjs.org/docs/error-decoder.html?invariant="+u,f=1;f"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),a2=Object.prototype.hasOwnProperty,JH=/^[: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]*$/,xU={},mU={};function QH(u){if(a2.call(mU,u))return!0;if(a2.call(xU,u))return!1;if(JH.test(u))return mU[u]=!0;return xU[u]=!0,!1}function UH(u,l,f,n){if(f!==null&&f.type===0)return!1;switch(typeof l){case"function":case"symbol":return!0;case"boolean":if(n)return!1;if(f!==null)return!f.acceptsBooleans;return u=u.toLowerCase().slice(0,5),u!=="data-"&&u!=="aria-";default:return!1}}function NH(u,l,f,n){if(l===null||typeof l>"u"||UH(u,l,f,n))return!0;if(n)return!1;if(f!==null)switch(f.type){case 3:return!l;case 4:return l===!1;case 5:return isNaN(l);case 6:return isNaN(l)||1>l}return!1}function bf(u,l,f,n,y,i,_){this.acceptsBooleans=l===2||l===3||l===4,this.attributeName=n,this.attributeNamespace=y,this.mustUseProperty=f,this.propertyName=u,this.type=l,this.sanitizeURL=i,this.removeEmptyString=_}var qf={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(u){qf[u]=new bf(u,0,!1,u,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(u){var l=u[0];qf[l]=new bf(l,1,!1,u[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(u){qf[u]=new bf(u,2,!1,u.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(u){qf[u]=new bf(u,2,!1,u,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(u){qf[u]=new bf(u,3,!1,u.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(u){qf[u]=new bf(u,3,!0,u,null,!1,!1)});["capture","download"].forEach(function(u){qf[u]=new bf(u,4,!1,u,null,!1,!1)});["cols","rows","size","span"].forEach(function(u){qf[u]=new bf(u,6,!1,u,null,!1,!1)});["rowSpan","start"].forEach(function(u){qf[u]=new bf(u,5,!1,u.toLowerCase(),null,!1,!1)});var k5=/[\-:]([a-z])/g;function h5(u){return u[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(u){var l=u.replace(k5,h5);qf[l]=new bf(l,1,!1,u,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(u){var l=u.replace(k5,h5);qf[l]=new bf(l,1,!1,u,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(u){var l=u.replace(k5,h5);qf[l]=new bf(l,1,!1,u,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(u){qf[u]=new bf(u,1,!1,u.toLowerCase(),null,!1,!1)});qf.xlinkHref=new bf("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(u){qf[u]=new bf(u,1,!1,u.toLowerCase(),null,!0,!0)});function I5(u,l,f,n){var y=qf.hasOwnProperty(l)?qf[l]:null;if(y!==null?y.type!==0:n||!(2$||y[_]!==i[$]){var A=` +`+y[_].replace(" at new "," at ");return u.displayName&&A.includes("")&&(A=A.replace("",u.displayName)),A}while(1<=_&&0<=$);break}}}finally{X2=!1,Error.prepareStackTrace=f}return(u=u?u.displayName||u.name:"")?V$(u):""}function FH(u){switch(u.tag){case 5:return V$(u.type);case 16:return V$("Lazy");case 13:return V$("Suspense");case 19:return V$("SuspenseList");case 0:case 2:case 15:return u=c2(u.type,!1),u;case 11:return u=c2(u.type.render,!1),u;case 1:return u=c2(u.type,!0),u;default:return""}}function u5(u){if(u==null)return null;if(typeof u==="function")return u.displayName||u.name||null;if(typeof u==="string")return u;switch(u){case xi:return"Fragment";case pi:return"Portal";case o2:return"Profiler";case v5:return"StrictMode";case d2:return"Suspense";case e2:return"SuspenseList"}if(typeof u==="object")switch(u.$$typeof){case IN:return(u.displayName||"Context")+".Consumer";case hN:return(u._context.displayName||"Context")+".Provider";case g5:var l=u.render;return u=u.displayName,u||(u=l.displayName||l.name||"",u=u!==""?"ForwardRef("+u+")":"ForwardRef"),u;case s5:return l=u.displayName||null,l!==null?l:u5(u.type)||"Memo";case c1:l=u._payload,u=u._init;try{return u5(u(l))}catch(f){}}return null}function WH(u){var l=u.type;switch(u.tag){case 24:return"Cache";case 9:return(l.displayName||"Context")+".Consumer";case 10:return(l._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return u=l.render,u=u.displayName||u.name||"",l.displayName||(u!==""?"ForwardRef("+u+")":"ForwardRef");case 7:return"Fragment";case 5:return l;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return u5(l);case 8:return l===v5?"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 l==="function")return l.displayName||l.name||null;if(typeof l==="string")return l}return null}function h1(u){switch(typeof u){case"boolean":case"number":case"string":case"undefined":return u;case"object":return u;default:return""}}function gN(u){var l=u.type;return(u=u.nodeName)&&u.toLowerCase()==="input"&&(l==="checkbox"||l==="radio")}function qH(u){var l=gN(u)?"checked":"value",f=Object.getOwnPropertyDescriptor(u.constructor.prototype,l),n=""+u[l];if(!u.hasOwnProperty(l)&&typeof f<"u"&&typeof f.get==="function"&&typeof f.set==="function"){var{get:y,set:i}=f;return Object.defineProperty(u,l,{configurable:!0,get:function(){return y.call(this)},set:function(_){n=""+_,i.call(this,_)}}),Object.defineProperty(u,l,{enumerable:f.enumerable}),{getValue:function(){return n},setValue:function(_){n=""+_},stopTracking:function(){u._valueTracker=null,delete u[l]}}}}function F8(u){u._valueTracker||(u._valueTracker=qH(u))}function sN(u){if(!u)return!1;var l=u._valueTracker;if(!l)return!0;var f=l.getValue(),n="";return u&&(n=gN(u)?u.checked?"true":"false":u.value),u=n,u!==f?(l.setValue(u),!0):!1}function x8(u){if(u=u||(typeof document<"u"?document:void 0),typeof u>"u")return null;try{return u.activeElement||u.body}catch(l){return u.body}}function l5(u,l){var f=l.checked;return xl({},l,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:f!=null?f:u._wrapperState.initialChecked})}function bU(u,l){var f=l.defaultValue==null?"":l.defaultValue,n=l.checked!=null?l.checked:l.defaultChecked;f=h1(l.value!=null?l.value:f),u._wrapperState={initialChecked:n,initialValue:f,controlled:l.type==="checkbox"||l.type==="radio"?l.checked!=null:l.value!=null}}function aN(u,l){l=l.checked,l!=null&&I5(u,"checked",l,!1)}function f5(u,l){aN(u,l);var f=h1(l.value),n=l.type;if(f!=null)if(n==="number"){if(f===0&&u.value===""||u.value!=f)u.value=""+f}else u.value!==""+f&&(u.value=""+f);else if(n==="submit"||n==="reset"){u.removeAttribute("value");return}l.hasOwnProperty("value")?n5(u,l.type,f):l.hasOwnProperty("defaultValue")&&n5(u,l.type,h1(l.defaultValue)),l.checked==null&&l.defaultChecked!=null&&(u.defaultChecked=!!l.defaultChecked)}function kU(u,l,f){if(l.hasOwnProperty("value")||l.hasOwnProperty("defaultValue")){var n=l.type;if(!(n!=="submit"&&n!=="reset"||l.value!==void 0&&l.value!==null))return;l=""+u._wrapperState.initialValue,f||l===u.value||(u.value=l),u.defaultValue=l}f=u.name,f!==""&&(u.name=""),u.defaultChecked=!!u._wrapperState.initialChecked,f!==""&&(u.name=f)}function n5(u,l,f){if(l!=="number"||x8(u.ownerDocument)!==u)f==null?u.defaultValue=""+u._wrapperState.initialValue:u.defaultValue!==""+f&&(u.defaultValue=""+f)}var B$=Array.isArray;function oi(u,l,f,n){if(u=u.options,l){l={};for(var y=0;y"+l.valueOf().toString()+"";for(l=W8.firstChild;u.firstChild;)u.removeChild(u.firstChild);for(;l.firstChild;)u.appendChild(l.firstChild)}});function I$(u,l){if(l){var f=u.firstChild;if(f&&f===u.lastChild&&f.nodeType===3){f.nodeValue=l;return}}u.textContent=l}var P$={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},LH=["Webkit","ms","Moz","O"];Object.keys(P$).forEach(function(u){LH.forEach(function(l){l=l+u.charAt(0).toUpperCase()+u.substring(1),P$[l]=P$[u]})});function uF(u,l,f){return l==null||typeof l==="boolean"||l===""?"":f||typeof l!=="number"||l===0||P$.hasOwnProperty(u)&&P$[u]?(""+l).trim():l+"px"}function lF(u,l){u=u.style;for(var f in l)if(l.hasOwnProperty(f)){var n=f.indexOf("--")===0,y=uF(f,l[f],n);f==="float"&&(f="cssFloat"),n?u.setProperty(f,y):u[f]=y}}var KH=xl({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 _5(u,l){if(l){if(KH[u]&&(l.children!=null||l.dangerouslySetInnerHTML!=null))throw Error(Ku(137,u));if(l.dangerouslySetInnerHTML!=null){if(l.children!=null)throw Error(Ku(60));if(typeof l.dangerouslySetInnerHTML!=="object"||!("__html"in l.dangerouslySetInnerHTML))throw Error(Ku(61))}if(l.style!=null&&typeof l.style!=="object")throw Error(Ku(62))}}function $5(u,l){if(u.indexOf("-")===-1)return typeof l.is==="string";switch(u){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 A5=null;function a5(u){return u=u.target||u.srcElement||window,u.correspondingUseElement&&(u=u.correspondingUseElement),u.nodeType===3?u.parentNode:u}var r5=null,di=null,ei=null;function vU(u){if(u=j3(u)){if(typeof r5!=="function")throw Error(Ku(280));var l=u.stateNode;l&&(l=N4(l),r5(u.stateNode,u.type,l))}}function fF(u){di?ei?ei.push(u):ei=[u]:di=u}function nF(){if(di){var u=di,l=ei;if(ei=di=null,vU(u),l)for(u=0;u>>=0,u===0?32:31-(XH(u)/cH|0)|0}var q8=64,L8=4194304;function X$(u){switch(u&-u){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 u&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return u&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return u}}function k8(u,l){var f=u.pendingLanes;if(f===0)return 0;var n=0,y=u.suspendedLanes,i=u.pingedLanes,_=f&268435455;if(_!==0){var $=_&~y;$!==0?n=X$($):(i&=_,i!==0&&(n=X$(i)))}else _=f&~y,_!==0?n=X$(_):i!==0&&(n=X$(i));if(n===0)return 0;if(l!==0&&l!==n&&(l&y)===0&&(y=n&-n,i=l&-l,y>=i||y===16&&(i&4194240)!==0))return l;if((n&4)!==0&&(n|=f&16),l=u.entangledLanes,l!==0)for(u=u.entanglements,l&=n;0f;f++)l.push(u);return l}function A3(u,l,f){u.pendingLanes|=l,l!==536870912&&(u.suspendedLanes=0,u.pingedLanes=0),u=u.eventTimes,l=31-nn(l),u[l]=f}function SH(u,l){var f=u.pendingLanes&~l;u.pendingLanes=l,u.suspendedLanes=0,u.pingedLanes=0,u.expiredLanes&=l,u.mutableReadLanes&=l,u.entangledLanes&=l,l=u.entanglements;var n=u.eventTimes;for(u=u.expirationTimes;0=C$),fN=String.fromCharCode(32),nN=!1;function ZF(u,l){switch(u){case"keyup":return rO.indexOf(l.keyCode)!==-1;case"keydown":return l.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function EF(u){return u=u.detail,typeof u==="object"&&"data"in u?u.data:null}var mi=!1;function JO(u,l){switch(u){case"compositionend":return EF(l);case"keypress":if(l.which!==32)return null;return nN=!0,fN;case"textInput":return u=l.data,u===fN&&nN?null:u;default:return null}}function QO(u,l){if(mi)return u==="compositionend"||!y9&&ZF(u,l)?(u=GF(),X8=l9=S1=null,mi=!1,u):null;switch(u){case"paste":return null;case"keypress":if(!(l.ctrlKey||l.altKey||l.metaKey)||l.ctrlKey&&l.altKey){if(l.char&&1=l)return{node:f,offset:l-u};u=n}u:{for(;f;){if(f.nextSibling){f=f.nextSibling;break u}f=f.parentNode}f=void 0}f=_N(f)}}function VF(u,l){return u&&l?u===l?!0:u&&u.nodeType===3?!1:l&&l.nodeType===3?VF(u,l.parentNode):("contains"in u)?u.contains(l):u.compareDocumentPosition?!!(u.compareDocumentPosition(l)&16):!1:!1}function BF(){for(var u=window,l=x8();l instanceof u.HTMLIFrameElement;){try{var f=typeof l.contentWindow.location.href==="string"}catch(n){f=!1}if(f)u=l.contentWindow;else break;l=x8(u.document)}return l}function i9(u){var l=u&&u.nodeName&&u.nodeName.toLowerCase();return l&&(l==="input"&&(u.type==="text"||u.type==="search"||u.type==="tel"||u.type==="url"||u.type==="password")||l==="textarea"||u.contentEditable==="true")}function GO(u){var l=BF(),f=u.focusedElem,n=u.selectionRange;if(l!==f&&f&&f.ownerDocument&&VF(f.ownerDocument.documentElement,f)){if(n!==null&&i9(f)){if(l=n.start,u=n.end,u===void 0&&(u=l),"selectionStart"in f)f.selectionStart=l,f.selectionEnd=Math.min(u,f.value.length);else if(u=(l=f.ownerDocument||document)&&l.defaultView||window,u.getSelection){u=u.getSelection();var y=f.textContent.length,i=Math.min(n.start,y);n=n.end===void 0?i:Math.min(n.end,y),!u.extend&&i>n&&(y=n,n=i,i=y),y=$N(f,i);var _=$N(f,n);y&&_&&(u.rangeCount!==1||u.anchorNode!==y.node||u.anchorOffset!==y.offset||u.focusNode!==_.node||u.focusOffset!==_.offset)&&(l=l.createRange(),l.setStart(y.node,y.offset),u.removeAllRanges(),i>n?(u.addRange(l),u.extend(_.node,_.offset)):(l.setEnd(_.node,_.offset),u.addRange(l)))}}l=[];for(u=f;u=u.parentNode;)u.nodeType===1&&l.push({element:u,left:u.scrollLeft,top:u.scrollTop});typeof f.focus==="function"&&f.focus();for(f=0;f=document.documentMode,Ri=null,F5=null,x$=null,W5=!1;function AN(u,l,f){var n=f.window===f?f.document:f.nodeType===9?f:f.ownerDocument;W5||Ri==null||Ri!==x8(n)||(n=Ri,("selectionStart"in n)&&i9(n)?n={start:n.selectionStart,end:n.selectionEnd}:(n=(n.ownerDocument&&n.ownerDocument.defaultView||window).getSelection(),n={anchorNode:n.anchorNode,anchorOffset:n.anchorOffset,focusNode:n.focusNode,focusOffset:n.focusOffset}),x$&&d$(x$,n)||(x$=n,n=v8(F5,"onSelect"),0hi||(u.current=E5[hi],E5[hi]=null,hi--)}function El(u,l){hi++,E5[hi]=u.current,u.current=l}var I1={},Vf=g1(I1),u0=g1(!1),xy=I1;function y_(u,l){var f=u.type.contextTypes;if(!f)return I1;var n=u.stateNode;if(n&&n.__reactInternalMemoizedUnmaskedChildContext===l)return n.__reactInternalMemoizedMaskedChildContext;var y={},i;for(i in f)y[i]=l[i];return n&&(u=u.stateNode,u.__reactInternalMemoizedUnmaskedChildContext=l,u.__reactInternalMemoizedMaskedChildContext=y),y}function l0(u){return u=u.childContextTypes,u!==null&&u!==void 0}function s8(){Vl(u0),Vl(Vf)}function FN(u,l,f){if(Vf.current!==I1)throw Error(Ku(168));El(Vf,l),El(u0,f)}function CF(u,l,f){var n=u.stateNode;if(l=l.childContextTypes,typeof n.getChildContext!=="function")return f;n=n.getChildContext();for(var y in n)if(!(y in l))throw Error(Ku(108,WH(u)||"Unknown",y));return xl({},f,n)}function a8(u){return u=(u=u.stateNode)&&u.__reactInternalMemoizedMergedChildContext||I1,xy=Vf.current,El(Vf,u),El(u0,u0.current),!0}function WN(u,l,f){var n=u.stateNode;if(!n)throw Error(Ku(169));f?(u=CF(u,l,xy),n.__reactInternalMemoizedMergedChildContext=u,Vl(u0),Vl(Vf),El(Vf,u)):Vl(u0),El(u0,f)}var gn=null,F4=!1,m2=!1;function pF(u){gn===null?gn=[u]:gn.push(u)}function cO(u){F4=!0,pF(u)}function s1(){if(!m2&&gn!==null){m2=!0;var u=0,l=Ll;try{var f=gn;for(Ll=1;u>=_,y-=_,sn=1<<32-nn(l)+y|f<c?(S=X,X=null):S=X.sibling;var p=U(W,X,q[c],z);if(p===null){X===null&&(X=S);break}u&&X&&p.alternate===null&&l(W,X),L=i(p,L,c),T===null?Z=p:T.sibling=p,T=p,X=S}if(c===q.length)return f(W,X),Yl&&Dy(W,c),Z;if(X===null){for(;cc?(S=X,X=null):S=X.sibling;var Y=U(W,X,p.value,z);if(Y===null){X===null&&(X=S);break}u&&X&&Y.alternate===null&&l(W,X),L=i(Y,L,c),T===null?Z=Y:T.sibling=Y,T=Y,X=S}if(p.done)return f(W,X),Yl&&Dy(W,c),Z;if(X===null){for(;!p.done;c++,p=q.next())p=Q(W,p.value,z),p!==null&&(L=i(p,L,c),T===null?Z=p:T.sibling=p,T=p);return Yl&&Dy(W,c),Z}for(X=n(W,X);!p.done;c++,p=q.next())p=F(X,W,c,p.value,z),p!==null&&(u&&p.alternate!==null&&X.delete(p.key===null?c:p.key),L=i(p,L,c),T===null?Z=p:T.sibling=p,T=p);return u&&X.forEach(function(D){return l(W,D)}),Yl&&Dy(W,c),Z}function G(W,L,q,z){if(typeof q==="object"&&q!==null&&q.type===xi&&q.key===null&&(q=q.props.children),typeof q==="object"&&q!==null){switch(q.$$typeof){case N8:u:{for(var Z=q.key,T=L;T!==null;){if(T.key===Z){if(Z=q.type,Z===xi){if(T.tag===7){f(W,T.sibling),L=y(T,q.props.children),L.return=W,W=L;break u}}else if(T.elementType===Z||typeof Z==="object"&&Z!==null&&Z.$$typeof===c1&&KN(Z)===T.type){f(W,T.sibling),L=y(T,q.props),L.ref=H$(W,T,q),L.return=W,W=L;break u}f(W,T);break}else l(W,T);T=T.sibling}q.type===xi?(L=py(q.props.children,W.mode,z,q.key),L.return=W,W=L):(z=p8(q.type,q.key,q.props,null,W.mode,z),z.ref=H$(W,L,q),z.return=W,W=z)}return _(W);case pi:u:{for(T=q.key;L!==null;){if(L.key===T)if(L.tag===4&&L.stateNode.containerInfo===q.containerInfo&&L.stateNode.implementation===q.implementation){f(W,L.sibling),L=y(L,q.children||[]),L.return=W,W=L;break u}else{f(W,L);break}else l(W,L);L=L.sibling}L=s2(q,W.mode,z),L.return=W,W=L}return _(W);case c1:return T=q._init,G(W,L,T(q._payload),z)}if(B$(q))return N(W,L,q,z);if(G$(q))return K(W,L,q,z);H8(W,q)}return typeof q==="string"&&q!==""||typeof q==="number"?(q=""+q,L!==null&&L.tag===6?(f(W,L.sibling),L=y(L,q),L.return=W,W=L):(f(W,L),L=g2(q,W.mode,z),L.return=W,W=L),_(W)):f(W,L)}return G}var __=bF(!0),kF=bF(!1),e8=g1(null),u4=null,gi=null,r9=null;function j9(){r9=gi=u4=null}function J9(u){var l=e8.current;Vl(e8),u._currentValue=l}function T5(u,l,f){for(;u!==null;){var n=u.alternate;if((u.childLanes&l)!==l?(u.childLanes|=l,n!==null&&(n.childLanes|=l)):n!==null&&(n.childLanes&l)!==l&&(n.childLanes|=l),u===f)break;u=u.return}}function l_(u,l){u4=u,r9=gi=null,u=u.dependencies,u!==null&&u.firstContext!==null&&((u.lanes&l)!==0&&(ef=!0),u.firstContext=null)}function C0(u){var l=u._currentValue;if(r9!==u)if(u={context:u,memoizedValue:l,next:null},gi===null){if(u4===null)throw Error(Ku(308));gi=u,u4.dependencies={lanes:0,firstContext:u}}else gi=gi.next=u;return l}var Py=null;function Q9(u){Py===null?Py=[u]:Py.push(u)}function hF(u,l,f,n){var y=l.interleaved;return y===null?(f.next=f,Q9(l)):(f.next=y.next,y.next=f),l.interleaved=f,u1(u,n)}function u1(u,l){u.lanes|=l;var f=u.alternate;f!==null&&(f.lanes|=l),f=u;for(u=u.return;u!==null;)u.childLanes|=l,f=u.alternate,f!==null&&(f.childLanes|=l),f=u,u=u.return;return f.tag===3?f.stateNode:null}var Y1=!1;function U9(u){u.updateQueue={baseState:u.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function IF(u,l){u=u.updateQueue,l.updateQueue===u&&(l.updateQueue={baseState:u.baseState,firstBaseUpdate:u.firstBaseUpdate,lastBaseUpdate:u.lastBaseUpdate,shared:u.shared,effects:u.effects})}function on(u,l){return{eventTime:u,lane:l,tag:0,payload:null,callback:null,next:null}}function m1(u,l,f){var n=u.updateQueue;if(n===null)return null;if(n=n.shared,(Fl&2)!==0){var y=n.pending;return y===null?l.next=l:(l.next=y.next,y.next=l),n.pending=l,u1(u,f)}return y=n.interleaved,y===null?(l.next=l,Q9(n)):(l.next=y.next,y.next=l),n.interleaved=l,u1(u,f)}function D8(u,l,f){if(l=l.updateQueue,l!==null&&(l=l.shared,(f&4194240)!==0)){var n=l.lanes;n&=u.pendingLanes,f|=n,l.lanes=f,d5(u,f)}}function zN(u,l){var{updateQueue:f,alternate:n}=u;if(n!==null&&(n=n.updateQueue,f===n)){var y=null,i=null;if(f=f.firstBaseUpdate,f!==null){do{var _={eventTime:f.eventTime,lane:f.lane,tag:f.tag,payload:f.payload,callback:f.callback,next:null};i===null?y=i=_:i=i.next=_,f=f.next}while(f!==null);i===null?y=i=l:i=i.next=l}else y=i=l;f={baseState:n.baseState,firstBaseUpdate:y,lastBaseUpdate:i,shared:n.shared,effects:n.effects},u.updateQueue=f;return}u=f.lastBaseUpdate,u===null?f.firstBaseUpdate=l:u.next=l,f.lastBaseUpdate=l}function l4(u,l,f,n){var y=u.updateQueue;Y1=!1;var{firstBaseUpdate:i,lastBaseUpdate:_}=y,$=y.shared.pending;if($!==null){y.shared.pending=null;var A=$,j=A.next;A.next=null,_===null?i=j:_.next=j,_=A;var J=u.alternate;J!==null&&(J=J.updateQueue,$=J.lastBaseUpdate,$!==_&&($===null?J.firstBaseUpdate=j:$.next=j,J.lastBaseUpdate=A))}if(i!==null){var Q=y.baseState;_=0,J=j=A=null,$=i;do{var{lane:U,eventTime:F}=$;if((n&U)===U){J!==null&&(J=J.next={eventTime:F,lane:0,tag:$.tag,payload:$.payload,callback:$.callback,next:null});u:{var N=u,K=$;switch(U=l,F=f,K.tag){case 1:if(N=K.payload,typeof N==="function"){Q=N.call(F,Q,U);break u}Q=N;break u;case 3:N.flags=N.flags&-65537|128;case 0:if(N=K.payload,U=typeof N==="function"?N.call(F,Q,U):N,U===null||U===void 0)break u;Q=xl({},Q,U);break u;case 2:Y1=!0}}$.callback!==null&&$.lane!==0&&(u.flags|=64,U=y.effects,U===null?y.effects=[$]:U.push($))}else F={eventTime:F,lane:U,tag:$.tag,payload:$.payload,callback:$.callback,next:null},J===null?(j=J=F,A=Q):J=J.next=F,_|=U;if($=$.next,$===null)if($=y.shared.pending,$===null)break;else U=$,$=U.next,U.next=null,y.lastBaseUpdate=U,y.shared.pending=null}while(1);if(J===null&&(A=Q),y.baseState=A,y.firstBaseUpdate=j,y.lastBaseUpdate=J,l=y.shared.interleaved,l!==null){y=l;do _|=y.lane,y=y.next;while(y!==l)}else i===null&&(y.shared.lanes=0);by|=_,u.lanes=_,u.memoizedState=Q}}function GN(u,l,f){if(u=l.effects,l.effects=null,u!==null)for(l=0;lf?f:4,u(!0);var n=b2.transition;b2.transition={};try{u(!1),l()}finally{Ll=f,b2.transition=n}}function rW(){return p0().memoizedState}function SO(u,l,f){var n=b1(u);if(f={lane:n,action:f,hasEagerState:!1,eagerState:null,next:null},jW(u))JW(l,f);else if(f=hF(u,l,f,n),f!==null){var y=Rf();yn(f,u,n,y),QW(f,l,n)}}function PO(u,l,f){var n=b1(u),y={lane:n,action:f,hasEagerState:!1,eagerState:null,next:null};if(jW(u))JW(l,y);else{var i=u.alternate;if(u.lanes===0&&(i===null||i.lanes===0)&&(i=l.lastRenderedReducer,i!==null))try{var _=l.lastRenderedState,$=i(_,f);if(y.hasEagerState=!0,y.eagerState=$,_n($,_)){var A=l.interleaved;A===null?(y.next=y,Q9(l)):(y.next=A.next,A.next=y),l.interleaved=y;return}}catch(j){}finally{}f=hF(u,l,y,n),f!==null&&(y=Rf(),yn(f,u,n,y),QW(f,l,n))}}function jW(u){var l=u.alternate;return u===pl||l!==null&&l===pl}function JW(u,l){m$=n4=!0;var f=u.pending;f===null?l.next=l:(l.next=f.next,f.next=l),u.pending=l}function QW(u,l,f){if((f&4194240)!==0){var n=l.lanes;n&=u.pendingLanes,f|=n,l.lanes=f,d5(u,f)}}var y4={readContext:C0,useCallback:Hf,useContext:Hf,useEffect:Hf,useImperativeHandle:Hf,useInsertionEffect:Hf,useLayoutEffect:Hf,useMemo:Hf,useReducer:Hf,useRef:Hf,useState:Hf,useDebugValue:Hf,useDeferredValue:Hf,useTransition:Hf,useMutableSource:Hf,useSyncExternalStore:Hf,useId:Hf,unstable_isNewReconciler:!1},MO={readContext:C0,useCallback:function(u,l){return Zn().memoizedState=[u,l===void 0?null:l],u},useContext:C0,useEffect:ZN,useImperativeHandle:function(u,l,f){return f=f!==null&&f!==void 0?f.concat([u]):null,S8(4194308,4,yW.bind(null,l,u),f)},useLayoutEffect:function(u,l){return S8(4194308,4,u,l)},useInsertionEffect:function(u,l){return S8(4,2,u,l)},useMemo:function(u,l){var f=Zn();return l=l===void 0?null:l,u=u(),f.memoizedState=[u,l],u},useReducer:function(u,l,f){var n=Zn();return l=f!==void 0?f(l):l,n.memoizedState=n.baseState=l,u={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:u,lastRenderedState:l},n.queue=u,u=u.dispatch=SO.bind(null,pl,u),[n.memoizedState,u]},useRef:function(u){var l=Zn();return u={current:u},l.memoizedState=u},useState:wN,useDebugValue:G9,useDeferredValue:function(u){return Zn().memoizedState=u},useTransition:function(){var u=wN(!1),l=u[0];return u=tO.bind(null,u[1]),Zn().memoizedState=u,[l,u]},useMutableSource:function(){},useSyncExternalStore:function(u,l,f){var n=pl,y=Zn();if(Yl){if(f===void 0)throw Error(Ku(407));f=f()}else{if(f=l(),Nf===null)throw Error(Ku(349));(Ry&30)!==0||aF(n,l,f)}y.memoizedState=f;var i={value:f,getSnapshot:l};return y.queue=i,ZN(dF.bind(null,n,i,u),[u]),n.flags|=2048,_3(9,oF.bind(null,n,i,f,l),void 0,null),f},useId:function(){var u=Zn(),l=Nf.identifierPrefix;if(Yl){var f=an,n=sn;f=(n&~(1<<32-nn(n)-1)).toString(32)+f,l=":"+l+"R"+f,f=y3++,0",u=u.removeChild(u.firstChild)):typeof n.is==="string"?u=_.createElement(f,{is:n.is}):(u=_.createElement(f),f==="select"&&(_=u,n.multiple?_.multiple=!0:n.size&&(_.size=n.size))):u=_.createElementNS(u,f),u[En]=l,u[l3]=n,wW(u,l,!1,!1),l.stateNode=u;u:{switch(_=$5(f,n),f){case"dialog":Tl("cancel",u),Tl("close",u),y=n;break;case"iframe":case"object":case"embed":Tl("load",u),y=n;break;case"video":case"audio":for(y=0;yr_&&(l.flags|=128,n=!0,O$(i,!1),l.lanes=4194304)}else{if(!n)if(u=f4(_),u!==null){if(l.flags|=128,n=!0,f=u.updateQueue,f!==null&&(l.updateQueue=f,l.flags|=4),O$(i,!0),i.tail===null&&i.tailMode==="hidden"&&!_.alternate&&!Yl)return Of(l),null}else 2*ol()-i.renderingStartTime>r_&&f!==1073741824&&(l.flags|=128,n=!0,O$(i,!1),l.lanes=4194304);i.isBackwards?(_.sibling=l.child,l.child=_):(f=i.last,f!==null?f.sibling=_:l.child=_,i.last=_)}if(i.tail!==null)return l=i.tail,i.rendering=l,i.tail=l.sibling,i.renderingStartTime=ol(),l.sibling=null,f=Cl.current,El(Cl,n?f&1|2:f&1),l;return Of(l),null;case 22:case 23:return T9(),n=l.memoizedState!==null,u!==null&&u.memoizedState!==null!==n&&(l.flags|=8192),n&&(l.mode&1)!==0?(L0&1073741824)!==0&&(Of(l),l.subtreeFlags&6&&(l.flags|=8192)):Of(l),null;case 24:return null;case 25:return null}throw Error(Ku(156,l.tag))}function hO(u,l){switch($9(l),l.tag){case 1:return l0(l.type)&&s8(),u=l.flags,u&65536?(l.flags=u&-65537|128,l):null;case 3:return $_(),Vl(u0),Vl(Vf),W9(),u=l.flags,(u&65536)!==0&&(u&128)===0?(l.flags=u&-65537|128,l):null;case 5:return F9(l),null;case 13:if(Vl(Cl),u=l.memoizedState,u!==null&&u.dehydrated!==null){if(l.alternate===null)throw Error(Ku(340));i_()}return u=l.flags,u&65536?(l.flags=u&-65537|128,l):null;case 19:return Vl(Cl),null;case 4:return $_(),null;case 10:return J9(l.type._context),null;case 22:case 23:return T9(),null;case 24:return null;default:return null}}var T8=!1,Tf=!1,IO=typeof WeakSet==="function"?WeakSet:Set,Du=null;function si(u,l){var f=u.ref;if(f!==null)if(typeof f==="function")try{f(null)}catch(n){hl(u,l,n)}else f.current=null}function P5(u,l,f){try{f()}catch(n){hl(u,l,n)}}var tN=!1;function vO(u,l){if(K5=h8,u=BF(),i9(u)){if("selectionStart"in u)var f={start:u.selectionStart,end:u.selectionEnd};else u:{f=(f=u.ownerDocument)&&f.defaultView||window;var n=f.getSelection&&f.getSelection();if(n&&n.rangeCount!==0){f=n.anchorNode;var{anchorOffset:y,focusNode:i}=n;n=n.focusOffset;try{f.nodeType,i.nodeType}catch(z){f=null;break u}var _=0,$=-1,A=-1,j=0,J=0,Q=u,U=null;l:for(;;){for(var F;;){if(Q!==f||y!==0&&Q.nodeType!==3||($=_+y),Q!==i||n!==0&&Q.nodeType!==3||(A=_+n),Q.nodeType===3&&(_+=Q.nodeValue.length),(F=Q.firstChild)===null)break;U=Q,Q=F}for(;;){if(Q===u)break l;if(U===f&&++j===y&&($=_),U===i&&++J===n&&(A=_),(F=Q.nextSibling)!==null)break;Q=U,U=Q.parentNode}Q=F}f=$===-1||A===-1?null:{start:$,end:A}}else f=null}f=f||{start:0,end:0}}else f=null;z5={focusedElem:u,selectionRange:f},h8=!1;for(Du=l;Du!==null;)if(l=Du,u=l.child,(l.subtreeFlags&1028)!==0&&u!==null)u.return=l,Du=u;else for(;Du!==null;){l=Du;try{var N=l.alternate;if((l.flags&1024)!==0)switch(l.tag){case 0:case 11:case 15:break;case 1:if(N!==null){var{memoizedProps:K,memoizedState:G}=N,W=l.stateNode,L=W.getSnapshotBeforeUpdate(l.elementType===l.type?K:un(l.type,K),G);W.__reactInternalSnapshotBeforeUpdate=L}break;case 3:var q=l.stateNode.containerInfo;q.nodeType===1?q.textContent="":q.nodeType===9&&q.documentElement&&q.removeChild(q.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(Ku(163))}}catch(z){hl(l,l.return,z)}if(u=l.sibling,u!==null){u.return=l.return,Du=u;break}Du=l.return}return N=tN,tN=!1,N}function R$(u,l,f){var n=l.updateQueue;if(n=n!==null?n.lastEffect:null,n!==null){var y=n=n.next;do{if((y.tag&u)===u){var i=y.destroy;y.destroy=void 0,i!==void 0&&P5(l,f,i)}y=y.next}while(y!==n)}}function L4(u,l){if(l=l.updateQueue,l=l!==null?l.lastEffect:null,l!==null){var f=l=l.next;do{if((f.tag&u)===u){var n=f.create;f.destroy=n()}f=f.next}while(f!==l)}}function M5(u){var l=u.ref;if(l!==null){var f=u.stateNode;switch(u.tag){case 5:u=f;break;default:u=f}typeof l==="function"?l(u):l.current=u}}function HW(u){var l=u.alternate;l!==null&&(u.alternate=null,HW(l)),u.child=null,u.deletions=null,u.sibling=null,u.tag===5&&(l=u.stateNode,l!==null&&(delete l[En],delete l[l3],delete l[Z5],delete l[BO],delete l[XO])),u.stateNode=null,u.return=null,u.dependencies=null,u.memoizedProps=null,u.memoizedState=null,u.pendingProps=null,u.stateNode=null,u.updateQueue=null}function OW(u){return u.tag===5||u.tag===3||u.tag===4}function SN(u){u:for(;;){for(;u.sibling===null;){if(u.return===null||OW(u.return))return null;u=u.return}u.sibling.return=u.return;for(u=u.sibling;u.tag!==5&&u.tag!==6&&u.tag!==18;){if(u.flags&2)continue u;if(u.child===null||u.tag===4)continue u;else u.child.return=u,u=u.child}if(!(u.flags&2))return u.stateNode}}function C5(u,l,f){var n=u.tag;if(n===5||n===6)u=u.stateNode,l?f.nodeType===8?f.parentNode.insertBefore(u,l):f.insertBefore(u,l):(f.nodeType===8?(l=f.parentNode,l.insertBefore(u,f)):(l=f,l.appendChild(u)),f=f._reactRootContainer,f!==null&&f!==void 0||l.onclick!==null||(l.onclick=g8));else if(n!==4&&(u=u.child,u!==null))for(C5(u,l,f),u=u.sibling;u!==null;)C5(u,l,f),u=u.sibling}function p5(u,l,f){var n=u.tag;if(n===5||n===6)u=u.stateNode,l?f.insertBefore(u,l):f.appendChild(u);else if(n!==4&&(u=u.child,u!==null))for(p5(u,l,f),u=u.sibling;u!==null;)p5(u,l,f),u=u.sibling}var Ff=null,ln=!1;function X1(u,l,f){for(f=f.child;f!==null;)TW(u,l,f),f=f.sibling}function TW(u,l,f){if(Hn&&typeof Hn.onCommitFiberUnmount==="function")try{Hn.onCommitFiberUnmount(j4,f)}catch($){}switch(f.tag){case 5:Tf||si(f,l);case 6:var n=Ff,y=ln;Ff=null,X1(u,l,f),Ff=n,ln=y,Ff!==null&&(ln?(u=Ff,f=f.stateNode,u.nodeType===8?u.parentNode.removeChild(f):u.removeChild(f)):Ff.removeChild(f.stateNode));break;case 18:Ff!==null&&(ln?(u=Ff,f=f.stateNode,u.nodeType===8?x2(u.parentNode,f):u.nodeType===1&&x2(u,f),a$(u)):x2(Ff,f.stateNode));break;case 4:n=Ff,y=ln,Ff=f.stateNode.containerInfo,ln=!0,X1(u,l,f),Ff=n,ln=y;break;case 0:case 11:case 14:case 15:if(!Tf&&(n=f.updateQueue,n!==null&&(n=n.lastEffect,n!==null))){y=n=n.next;do{var i=y,_=i.destroy;i=i.tag,_!==void 0&&((i&2)!==0?P5(f,l,_):(i&4)!==0&&P5(f,l,_)),y=y.next}while(y!==n)}X1(u,l,f);break;case 1:if(!Tf&&(si(f,l),n=f.stateNode,typeof n.componentWillUnmount==="function"))try{n.props=f.memoizedProps,n.state=f.memoizedState,n.componentWillUnmount()}catch($){hl(f,l,$)}X1(u,l,f);break;case 21:X1(u,l,f);break;case 22:f.mode&1?(Tf=(n=Tf)||f.memoizedState!==null,X1(u,l,f),Tf=n):X1(u,l,f);break;default:X1(u,l,f)}}function PN(u){var l=u.updateQueue;if(l!==null){u.updateQueue=null;var f=u.stateNode;f===null&&(f=u.stateNode=new IO),l.forEach(function(n){var y=fT.bind(null,u,n);f.has(n)||(f.add(n),n.then(y,y))})}}function e0(u,l){var f=l.deletions;if(f!==null)for(var n=0;ny&&(y=_),n&=~i}if(n=y,n=ol()-n,n=(120>n?120:480>n?480:1080>n?1080:1920>n?1920:3000>n?3000:4320>n?4320:1960*sO(n/1960))-n,10u?16:u,P1===null)var n=!1;else{if(u=P1,P1=null,$4=0,(Fl&6)!==0)throw Error(Ku(331));var y=Fl;Fl|=4;for(Du=u.current;Du!==null;){var i=Du,_=i.child;if((Du.flags&16)!==0){var $=i.deletions;if($!==null){for(var A=0;A<$.length;A++){var j=$[A];for(Du=j;Du!==null;){var J=Du;switch(J.tag){case 0:case 11:case 15:R$(8,J,i)}var Q=J.child;if(Q!==null)Q.return=J,Du=Q;else for(;Du!==null;){J=Du;var{sibling:U,return:F}=J;if(HW(J),J===j){Du=null;break}if(U!==null){U.return=F,Du=U;break}Du=F}}}var N=i.alternate;if(N!==null){var K=N.child;if(K!==null){N.child=null;do{var G=K.sibling;K.sibling=null,K=G}while(K!==null)}}Du=i}}if((i.subtreeFlags&2064)!==0&&_!==null)_.return=i,Du=_;else u:for(;Du!==null;){if(i=Du,(i.flags&2048)!==0)switch(i.tag){case 0:case 11:case 15:R$(9,i,i.return)}var W=i.sibling;if(W!==null){W.return=i.return,Du=W;break u}Du=i.return}}var L=u.current;for(Du=L;Du!==null;){_=Du;var q=_.child;if((_.subtreeFlags&2064)!==0&&q!==null)q.return=_,Du=q;else u:for(_=L;Du!==null;){if($=Du,($.flags&2048)!==0)try{switch($.tag){case 0:case 11:case 15:L4(9,$)}}catch(Z){hl($,$.return,Z)}if($===_){Du=null;break u}var z=$.sibling;if(z!==null){z.return=$.return,Du=z;break u}Du=$.return}}if(Fl=y,s1(),Hn&&typeof Hn.onPostCommitFiberRoot==="function")try{Hn.onPostCommitFiberRoot(j4,u)}catch(Z){}n=!0}return n}finally{Ll=f,M0.transition=l}}return!1}function mN(u,l,f){l=A_(f,l),l=NW(u,l,1),u=m1(u,l,1),l=Rf(),u!==null&&(A3(u,1,l),f0(u,l))}function hl(u,l,f){if(u.tag===3)mN(u,u,f);else for(;l!==null;){if(l.tag===3){mN(l,u,f);break}else if(l.tag===1){var n=l.stateNode;if(typeof l.type.getDerivedStateFromError==="function"||typeof n.componentDidCatch==="function"&&(R1===null||!R1.has(n))){u=A_(f,u),u=FW(l,u,1),l=m1(l,u,1),u=Rf(),l!==null&&(A3(l,1,u),f0(l,u));break}}l=l.return}}function uT(u,l,f){var n=u.pingCache;n!==null&&n.delete(l),l=Rf(),u.pingedLanes|=u.suspendedLanes&f,Nf===u&&(Wf&f)===f&&($f===4||$f===3&&(Wf&130023424)===Wf&&500>ol()-H9?Cy(u,0):E9|=f),f0(u,l)}function SW(u,l){l===0&&((u.mode&1)===0?l=1:(l=L8,L8<<=1,(L8&130023424)===0&&(L8=4194304)));var f=Rf();u=u1(u,l),u!==null&&(A3(u,l,f),f0(u,f))}function lT(u){var l=u.memoizedState,f=0;l!==null&&(f=l.retryLane),SW(u,f)}function fT(u,l){var f=0;switch(u.tag){case 13:var{stateNode:n,memoizedState:y}=u;y!==null&&(f=y.retryLane);break;case 19:n=u.stateNode;break;default:throw Error(Ku(314))}n!==null&&n.delete(l),SW(u,f)}var PW;PW=function(u,l,f){if(u!==null)if(u.memoizedProps!==l.pendingProps||u0.current)ef=!0;else{if((u.lanes&f)===0&&(l.flags&128)===0)return ef=!1,bO(u,l,f);ef=(u.flags&131072)!==0?!0:!1}else ef=!1,Yl&&(l.flags&1048576)!==0&&xF(l,d8,l.index);switch(l.lanes=0,l.tag){case 2:var n=l.type;P8(u,l),u=l.pendingProps;var y=y_(l,Vf.current);l_(l,f),y=L9(null,l,n,u,y,f);var i=K9();return l.flags|=1,typeof y==="object"&&y!==null&&typeof y.render==="function"&&y.$$typeof===void 0?(l.tag=1,l.memoizedState=null,l.updateQueue=null,l0(n)?(i=!0,a8(l)):i=!1,l.memoizedState=y.state!==null&&y.state!==void 0?y.state:null,U9(l),y.updater=q4,l.stateNode=y,y._reactInternals=l,B5(l,n,u,f),l=Y5(null,l,n,!0,i,f)):(l.tag=0,Yl&&i&&_9(l),mf(null,l,y,f),l=l.child),l;case 16:n=l.elementType;u:{switch(P8(u,l),u=l.pendingProps,y=n._init,n=y(n._payload),l.type=n,y=l.tag=yT(n),u=un(n,u),y){case 0:l=c5(null,l,n,u,f);break u;case 1:l=cN(null,l,n,u,f);break u;case 11:l=BN(null,l,n,u,f);break u;case 14:l=XN(null,l,n,un(n.type,u),f);break u}throw Error(Ku(306,n,""))}return l;case 0:return n=l.type,y=l.pendingProps,y=l.elementType===n?y:un(n,y),c5(u,l,n,y,f);case 1:return n=l.type,y=l.pendingProps,y=l.elementType===n?y:un(n,y),cN(u,l,n,y,f);case 3:u:{if(KW(l),u===null)throw Error(Ku(387));n=l.pendingProps,i=l.memoizedState,y=i.element,IF(u,l),l4(l,n,null,f);var _=l.memoizedState;if(n=_.element,i.isDehydrated)if(i={element:n,isDehydrated:!1,cache:_.cache,pendingSuspenseBoundaries:_.pendingSuspenseBoundaries,transitions:_.transitions},l.updateQueue.baseState=i,l.memoizedState=i,l.flags&256){y=A_(Error(Ku(423)),l),l=YN(u,l,n,f,y);break u}else if(n!==y){y=A_(Error(Ku(424)),l),l=YN(u,l,n,f,y);break u}else for(K0=x1(l.stateNode.containerInfo.firstChild),z0=l,Yl=!0,fn=null,f=kF(l,null,n,f),l.child=f;f;)f.flags=f.flags&-3|4096,f=f.sibling;else{if(i_(),n===y){l=l1(u,l,f);break u}mf(u,l,n,f)}l=l.child}return l;case 5:return vF(l),u===null&&O5(l),n=l.type,y=l.pendingProps,i=u!==null?u.memoizedProps:null,_=y.children,G5(n,y)?_=null:i!==null&&G5(n,i)&&(l.flags|=32),LW(u,l),mf(u,l,_,f),l.child;case 6:return u===null&&O5(l),null;case 13:return zW(u,l,f);case 4:return N9(l,l.stateNode.containerInfo),n=l.pendingProps,u===null?l.child=__(l,null,n,f):mf(u,l,n,f),l.child;case 11:return n=l.type,y=l.pendingProps,y=l.elementType===n?y:un(n,y),BN(u,l,n,y,f);case 7:return mf(u,l,l.pendingProps,f),l.child;case 8:return mf(u,l,l.pendingProps.children,f),l.child;case 12:return mf(u,l,l.pendingProps.children,f),l.child;case 10:u:{if(n=l.type._context,y=l.pendingProps,i=l.memoizedProps,_=y.value,El(e8,n._currentValue),n._currentValue=_,i!==null)if(_n(i.value,_)){if(i.children===y.children&&!u0.current){l=l1(u,l,f);break u}}else for(i=l.child,i!==null&&(i.return=l);i!==null;){var $=i.dependencies;if($!==null){_=i.child;for(var A=$.firstContext;A!==null;){if(A.context===n){if(i.tag===1){A=on(-1,f&-f),A.tag=2;var j=i.updateQueue;if(j!==null){j=j.shared;var J=j.pending;J===null?A.next=A:(A.next=J.next,J.next=A),j.pending=A}}i.lanes|=f,A=i.alternate,A!==null&&(A.lanes|=f),T5(i.return,f,l),$.lanes|=f;break}A=A.next}}else if(i.tag===10)_=i.type===l.type?null:i.child;else if(i.tag===18){if(_=i.return,_===null)throw Error(Ku(341));_.lanes|=f,$=_.alternate,$!==null&&($.lanes|=f),T5(_,f,l),_=i.sibling}else _=i.child;if(_!==null)_.return=i;else for(_=i;_!==null;){if(_===l){_=null;break}if(i=_.sibling,i!==null){i.return=_.return,_=i;break}_=_.return}i=_}mf(u,l,y.children,f),l=l.child}return l;case 9:return y=l.type,n=l.pendingProps.children,l_(l,f),y=C0(y),n=n(y),l.flags|=1,mf(u,l,n,f),l.child;case 14:return n=l.type,y=un(n,l.pendingProps),y=un(n.type,y),XN(u,l,n,y,f);case 15:return WW(u,l,l.type,l.pendingProps,f);case 17:return n=l.type,y=l.pendingProps,y=l.elementType===n?y:un(n,y),P8(u,l),l.tag=1,l0(n)?(u=!0,a8(l)):u=!1,l_(l,f),UW(l,n,y),B5(l,n,y,f),Y5(null,l,n,!0,u,f);case 19:return GW(u,l,f);case 22:return qW(u,l,f)}throw Error(Ku(156,l.tag))};function MW(u,l){return jF(u,l)}function nT(u,l,f,n){this.tag=u,this.key=f,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=l,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=n,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function P0(u,l,f,n){return new nT(u,l,f,n)}function B9(u){return u=u.prototype,!(!u||!u.isReactComponent)}function yT(u){if(typeof u==="function")return B9(u)?1:0;if(u!==void 0&&u!==null){if(u=u.$$typeof,u===g5)return 11;if(u===s5)return 14}return 2}function k1(u,l){var f=u.alternate;return f===null?(f=P0(u.tag,l,u.key,u.mode),f.elementType=u.elementType,f.type=u.type,f.stateNode=u.stateNode,f.alternate=u,u.alternate=f):(f.pendingProps=l,f.type=u.type,f.flags=0,f.subtreeFlags=0,f.deletions=null),f.flags=u.flags&14680064,f.childLanes=u.childLanes,f.lanes=u.lanes,f.child=u.child,f.memoizedProps=u.memoizedProps,f.memoizedState=u.memoizedState,f.updateQueue=u.updateQueue,l=u.dependencies,f.dependencies=l===null?null:{lanes:l.lanes,firstContext:l.firstContext},f.sibling=u.sibling,f.index=u.index,f.ref=u.ref,f}function p8(u,l,f,n,y,i){var _=2;if(n=u,typeof u==="function")B9(u)&&(_=1);else if(typeof u==="string")_=5;else u:switch(u){case xi:return py(f.children,y,i,l);case v5:_=8,y|=8;break;case o2:return u=P0(12,f,l,y|2),u.elementType=o2,u.lanes=i,u;case d2:return u=P0(13,f,l,y),u.elementType=d2,u.lanes=i,u;case e2:return u=P0(19,f,l,y),u.elementType=e2,u.lanes=i,u;case vN:return z4(f,y,i,l);default:if(typeof u==="object"&&u!==null)switch(u.$$typeof){case hN:_=10;break u;case IN:_=9;break u;case g5:_=11;break u;case s5:_=14;break u;case c1:_=16,n=null;break u}throw Error(Ku(130,u==null?u:typeof u,""))}return l=P0(_,f,l,y),l.elementType=u,l.type=n,l.lanes=i,l}function py(u,l,f,n){return u=P0(7,u,n,l),u.lanes=f,u}function z4(u,l,f,n){return u=P0(22,u,n,l),u.elementType=vN,u.lanes=f,u.stateNode={isHidden:!1},u}function g2(u,l,f){return u=P0(6,u,null,l),u.lanes=f,u}function s2(u,l,f){return l=P0(4,u.children!==null?u.children:[],u.key,l),l.lanes=f,l.stateNode={containerInfo:u.containerInfo,pendingChildren:null,implementation:u.implementation},l}function iT(u,l,f,n,y){this.tag=l,this.containerInfo=u,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=D2(0),this.expirationTimes=D2(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=D2(0),this.identifierPrefix=n,this.onRecoverableError=y,this.mutableSourceEagerHydrationData=null}function X9(u,l,f,n,y,i,_,$,A){return u=new iT(u,l,f,$,A),l===1?(l=1,i===!0&&(l|=8)):l=0,i=P0(3,null,null,l),u.current=i,i.stateNode=u,i.memoizedState={element:n,isDehydrated:f,cache:null,transitions:null,pendingSuspenseBoundaries:null},U9(i),u}function _T(u,l,f){var n=3{function RW(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=="function")return;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(RW)}catch(u){console.error(u)}}RW(),bW.exports=mW()});var hW=q0((S9)=>{var kW=t9();S9.createRoot=kW.createRoot,S9.hydrateRoot=kW.hydrateRoot;var JT});var jK=q0((wA)=>{var Bc=ql(),Xc=Symbol.for("react.element"),cc=Symbol.for("react.fragment"),Yc=Object.prototype.hasOwnProperty,Dc=Bc.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,tc={key:!0,ref:!0,__self:!0,__source:!0};function rK(u,l,f){var n,y={},i=null,_=null;f!==void 0&&(i=""+f),l.key!==void 0&&(i=""+l.key),l.ref!==void 0&&(_=l.ref);for(n in l)Yc.call(l,n)&&!tc.hasOwnProperty(n)&&(y[n]=l[n]);if(u&&u.defaultProps)for(n in l=u.defaultProps,l)y[n]===void 0&&(y[n]=l[n]);return{$$typeof:Xc,type:u,key:i,ref:_,props:y,_owner:Dc.current}}wA.Fragment=cc;wA.jsx=rK;wA.jsxs=rK});var QK=q0((dm,JK)=>{JK.exports=jK()});var bz=q0((Rz)=>{var a_=ql();function ot(u,l){return u===l&&(u!==0||1/u===1/l)||u!==u&&l!==l}var dt=typeof Object.is==="function"?Object.is:ot,et=a_.useState,uS=a_.useEffect,lS=a_.useLayoutEffect,fS=a_.useDebugValue;function nS(u,l){var f=l(),n=et({inst:{value:f,getSnapshot:l}}),y=n[0].inst,i=n[1];return lS(function(){y.value=f,y.getSnapshot=l,vJ(y)&&i({inst:y})},[u,f,l]),uS(function(){return vJ(y)&&i({inst:y}),u(function(){vJ(y)&&i({inst:y})})},[u]),fS(f),f}function vJ(u){var l=u.getSnapshot;u=u.value;try{var f=l();return!dt(u,f)}catch(n){return!0}}function yS(u,l){return l()}var iS=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?yS:nS;Rz.useSyncExternalStore=a_.useSyncExternalStore!==void 0?a_.useSyncExternalStore:iS});var hz=q0((hv,kz)=>{kz.exports=bz()});var vz=q0((Iz)=>{var Fr=ql(),_S=hz();function $S(u,l){return u===l&&(u!==0||1/u===1/l)||u!==u&&l!==l}var AS=typeof Object.is==="function"?Object.is:$S,rS=_S.useSyncExternalStore,jS=Fr.useRef,JS=Fr.useEffect,QS=Fr.useMemo,US=Fr.useDebugValue;Iz.useSyncExternalStoreWithSelector=function(u,l,f,n,y){var i=jS(null);if(i.current===null){var _={hasValue:!1,value:null};i.current=_}else _=i.current;i=QS(function(){function A(F){if(!j){if(j=!0,J=F,F=n(F),y!==void 0&&_.hasValue){var N=_.value;if(y(N,F))return Q=N}return Q=F}if(N=Q,AS(J,F))return N;var K=n(F);if(y!==void 0&&y(N,K))return J=F,N;return J=F,Q=K}var j=!1,J,Q,U=f===void 0?null:f;return[function(){return A(l())},U===null?void 0:function(){return A(U())}]},[l,f,n,y]);var $=rS(u,i[0],i[1]);return JS(function(){_.hasValue=!0,_.value=$},[$]),US($),$}});var sz=q0((vv,gz)=>{gz.exports=vz()});var Hy=ku(ql(),1);var _8="北京时间";var _H={timeZone:"Asia/Shanghai",hour12:!1},$H={timeZone:"Asia/Shanghai",hour12:!1},AH=new Intl.DateTimeFormat("en-CA",{timeZone:"Asia/Shanghai",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",hourCycle:"h23"});function q2(u){if(u===null||u===void 0||u==="")return null;let l=u instanceof Date?u:new Date(u);return Number.isNaN(l.getTime())?null:l}function VU(u){let l=q2(u);if(!l)return null;return AH.formatToParts(l).reduce((f,n)=>{if(n.type!=="literal")f[n.type]=n.value;return f},{})}function Zu(u){let l=q2(u);return l?l.toLocaleString("zh-CN",_H):"--"}function rl(u){let l=q2(u);return l?l.toLocaleTimeString("zh-CN",$H):"--"}function L2(u){let l=VU(u);if(!l)return"";let f=l.hour==="24"?"00":l.hour;return`${l.year}-${l.month}-${l.day}T${f}:${l.minute}`}function BU(u=new Date){let l=VU(u);if(!l)return"";return`${l.year}-${l.month}-${l.day}`}function XU(u){if(!u)return null;let l=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(?::(\d{2}))?$/.exec(u);if(!l)return null;let[,f,n,y,i,_,$="00"]=l,A=Date.UTC(Number(f),Number(n)-1,Number(y),Number(i)-8,Number(_),Number($)),j=new Date(A),J=L2(j);return Number.isNaN(j.getTime())||J!==`${f}-${n}-${y}T${i}:${_}`?null:j.toISOString()}var ZZ=ku(hW(),1);var V4=ku(ql(),1);var IW=ku(ql(),1),Q3=IW.default.createElement;function QT({active:u=!0,label:l="正在加载"}){if(!u)return null;return Q3("span",{className:"loading-spinner-indicator",role:"status","aria-label":l,title:l,"data-testid":"loading-title-indicator"},Q3("span",{className:"loading-spinner-ring","aria-hidden":!0}))}function nl({title:u,children:l,loading:f,level:n=2,className:y="",label:i="正在加载"}){return Q3(n===3?"h3":"h2",{className:`loading-title ${f?"is-loading":""} ${y}`.trim()},Q3("span",{className:"loading-title-text"},l??u),Q3(QT,{active:Boolean(f),label:i}))}class Q_ extends Error{unideskRequestError=!0;meta;constructor(u,l){super(u);this.name="UniDeskRequestError",this.meta=l}}function UT(u){return new Promise((l)=>setTimeout(l,u))}function F3(u,l="操作失败"){return u instanceof Error?u.message:String(u||l)}function H4(u,l=500){if(u===null||u===void 0)return"";let f=typeof u==="string"?u:JSON.stringify(u),n=String(f||"").replace(/\s+/gu," ").trim();return n.length>l?`${n.slice(0,l)}...`:n}function NT(u){try{let l=typeof location<"u"&&location.origin?location.origin:"http://localhost";return new URL(u,l).toString()}catch{return u}}function vW(u){return String(u.method||"GET").toUpperCase()}function FT(u){if(u===null||u===void 0)return!1;if(typeof u!=="object")return!1;if(typeof Blob<"u"&&u instanceof Blob)return!1;if(typeof FormData<"u"&&u instanceof FormData)return!1;if(typeof URLSearchParams<"u"&&u instanceof URLSearchParams)return!1;if(typeof ArrayBuffer<"u"&&u instanceof ArrayBuffer)return!1;return!0}function gW(u){let l=new Headers(u.headers||{}),f=FT(u.body)?JSON.stringify(u.body):u.body;if(f&&!l.has("content-type")&&typeof f==="string")l.set("content-type","application/json");return{...u,credentials:u.credentials||"same-origin",body:f,headers:l}}function sW(u){if(u?.error&&typeof u.error==="object"&&typeof u.error.message==="string")return u.error.message;if(typeof u?.error==="string")return u.error;if(typeof u?.message==="string")return u.message;if(typeof u?.detail==="string")return u.detail;return""}function WT(u,l){if(!u||typeof u!=="object"||Array.isArray(u))return!1;return l.some((f)=>f!==!1&&u[f]===!1)}function U3(u,l,f,n,y={}){return{kind:u,method:f,url:NT(l),occurredAt:n.toISOString(),...y}}function N3(u,l){if(!u)return"请求失败";return`HTTP ${u}${l?` ${l}`:""}`}function aW(u){try{return{body:u?JSON.parse(u):null,parseError:""}}catch(l){return{body:{text:u},parseError:F3(l,"parse failed")}}}async function Eu(u,l={},f=0){let{failureFields:n=["ok"],strictJson:y=!1,retryInvalidJson:i=0,retryDelayMs:_=120,invalidJsonPrefix:$="服务返回了无效 JSON",invalidJsonPreview:A=!1,responsePreviewLength:j=500,...J}=l,Q=vW(J),U=new Date,F;try{F=await fetch(u,gW(J))}catch(G){let W=F3(G,"网络请求失败");throw new Q_(W,U3("network",u,Q,U,{upstreamMessage:W}))}let N=await F.text(),K=aW(N);if(K.parseError){if(y&&Q==="GET"&&f=300)?N3(u.meta.status,u.meta.statusText):"应用请求失败",i=u.meta.status?N3(u.meta.status):"",_=(A)=>!A||A===y||A===i,$=!_(u.message)?u.message:_(u.meta.upstreamMessage)?"":u.meta.upstreamMessage||"";return{title:y,message:$,status:u.meta.status,statusText:u.meta.statusText,method:u.meta.method,url:u.meta.url,occurredAt:qT(u.meta.occurredAt),responsePreview:u.meta.responsePreview,parseError:u.meta.parseError,structured:!0}}let n=F3(u,l).split(/\r?\n/u);return{title:n[0]||l,message:n.slice(1).join(` +`),structured:n.length>1}}function LT(u,l="操作失败"){let f=P9(u,l),n=[f.title];if(f.message)n.push(`原因: ${f.message}`);if(f.method||f.url)n.push(`请求: ${[f.method,f.url].filter(Boolean).join(" ")}`);if(f.status)n.push(`状态: ${N3(f.status,f.statusText)}`);if(f.occurredAt)n.push(`时间: ${f.occurredAt}`);if(f.parseError)n.push(`解析错误: ${f.parseError}`);if(f.responsePreview&&f.responsePreview!==f.message)n.push(`响应预览: ${f.responsePreview}`);return n.filter(Boolean).join(` +`)}function Xu(u,l="操作失败"){return O4(u)?LT(u,l):F3(u,l)}var dW=ku(ql(),1);var a1=dW.default.createElement;function W3(u,l){return l?[a1("dt",{key:`${u}-label`},u),a1("dd",{key:u},l)]:null}function ul({error:u,wide:l=!1,fallback:f="操作失败",className:n=""}){if(!u)return null;let y=P9(u,f),i=[W3("请求",[y.method,y.url].filter(Boolean).join(" ")),W3("状态",y.status?`HTTP ${y.status}${y.statusText?` ${y.statusText}`:""}`:""),W3("时间",y.occurredAt),W3("解析错误",y.parseError),W3("响应预览",y.responsePreview)].filter(Boolean);return a1("div",{className:`form-error unidesk-error${l?" wide":""}${n?` ${n}`:""}`,role:"alert","data-testid":"unidesk-error"},a1("div",{className:"unidesk-error-title"},a1("strong",null,y.title),y.status?a1("span",{className:"unidesk-error-code"},`HTTP ${y.status}`):null),y.message?a1("pre",{className:"unidesk-error-message"},y.message):null,i.length>0?a1("dl",{className:"unidesk-error-details"},i):null)}var Tn=ku(ql(),1),eW=Tn.default.createContext(null);function uq({children:u}){let[l,f]=Tn.default.useState([]),[n,y]=Tn.default.useState(Date.now()),i=Tn.default.useCallback((Q,U)=>{let N={id:`notif_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,type:Q,message:U,timestamp:Date.now()};f((K)=>{let G=[...K,N];if(G.length>50)return G.slice(-50);return G})},[]),_=Tn.default.useCallback((Q)=>{f((U)=>U.filter((F)=>F.id!==Q))},[]),$=Tn.default.useCallback(()=>{f([]),y(Date.now())},[]),A=Tn.default.useMemo(()=>{return l.filter((Q)=>Q.timestamp>n).length},[l,n]),j=A>0,J={notifications:l,addNotification:i,removeNotification:_,clearNotifications:$,unreadCount:A,hasUnread:j};return KT(eW.Provider,{value:J},u)}var KT=Tn.default.createElement;function kf(){let u=Tn.default.useContext(eW);if(!u)throw Error("useNotification must be used within NotificationProvider");return u}var h=V4.default.createElement,{useEffect:T4}=V4.default,U_=V4.default.useState;function Bf(u,l={}){return Eu(u,{failureFields:["ok","success"],...l})}function hf(u,l){return`${u}/microservices/baidu-netdisk/proxy${l}`}function zT(u){let l=Number(u);return Number.isFinite(l)?l.toLocaleString("zh-CN"):"--"}function o1(u){let l=Number(u);if(!Number.isFinite(l)||l<=0)return"--";let f=["B","KB","MB","GB","TB"],n=l,y=0;while(n>=1024&&y{y?.stopPropagation?.(),f(u,l)}},"查看原始JSON")}function F_({title:u,text:l}){return h("div",{className:"empty-state"},h("strong",null,u),h("span",null,l))}function W_({title:u,text:l,href:f,badge:n,testId:y}){return h("a",{className:"doc-link-card",href:f,target:"_blank",rel:"noreferrer","data-testid":y},h("span",null,n||"DOC"),h("strong",null,u),h("p",null,l),h("code",null,f))}function GT(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function wT(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function ZT(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function ET(u){return Array.isArray(u?.files)?u.files:[]}function HT(u){return Array.isArray(u?.jobs)?u.jobs:[]}function OT(u,l){if(!u||u===l)return l;let f=u.replace(/\/+$/u,""),n=f.slice(0,f.lastIndexOf("/"))||l;return n.lengthm.id==="baidu-netdisk")||null,[y,i]=U_({loading:!1,actionLoading:!1,error:"",message:"",health:null,account:null,files:null,transfers:null,logs:null,selfTest:null,refreshedAt:null}),[_,$]=U_("/"),[A,j]=U_(null),[J,Q]=U_(""),[U,F]=U_({localPath:"sample.txt",remotePath:"/sample.txt"}),[N,K]=U_({fsId:"",localPath:"downloads/"}),{addNotification:G}=kf(),W=y.health?.baidu?.appRoot||y.account?.rootPath||"/";T4(()=>{F((m)=>{let fu=new Set(["/sample.txt","/apps/UniDeskBaiduNetdisk/sample.txt"]);if(m.remotePath&&!fu.has(m.remotePath))return m;let iu=M9(W,"sample.txt");return m.remotePath===iu?m:{...m,remotePath:iu}})},[W]);async function L(m=_){let iu=await Bf(hf(f,`/api/files?dir=${encodeURIComponent(m||W)}&limit=100`));i((Ju)=>({...Ju,files:iu}))}async function q(){let m=await Bf(hf(f,"/api/transfers?limit=80"));i((fu)=>({...fu,transfers:m}))}async function z(){if(!n)return;i((m)=>({...m,loading:!0,error:"",message:""}));try{let m=await Bf(`${f}/microservices/baidu-netdisk/health`),fu=m?.baidu?.appRoot||W,iu=null,Ju=null;if(m?.auth?.loggedIn){iu=await Bf(hf(f,"/api/account?refresh=1"));let Bu=_&&_.startsWith(fu)?_:fu;$(Bu),Ju=await Bf(hf(f,`/api/files?dir=${encodeURIComponent(Bu)}&limit=100`))}else $(fu);let Vu=await Bf(hf(f,"/api/transfers?limit=80")),Lu=await Bf(hf(f,"/logs?limit=60"));i((Bu)=>({...Bu,loading:!1,health:m,account:iu?.account||null,files:Ju,transfers:Vu,logs:Lu,refreshedAt:new Date}))}catch(m){i((fu)=>({...fu,loading:!1,error:Xu(m,"百度网盘服务加载失败")}))}}async function Z(){i((m)=>({...m,actionLoading:!0,error:"",message:""}));try{let m=await Bf(hf(f,"/api/auth/device/start"),{method:"POST",body:{}});j(m.session||null),i((fu)=>({...fu,actionLoading:!1,message:"设备码已生成,请扫码授权"}))}catch(m){i((fu)=>({...fu,actionLoading:!1,error:Xu(m,"创建设备码失败")}))}}async function T(m=!1){if(!A?.id)return;if(m)i((fu)=>({...fu,actionLoading:!0,error:""}));try{let fu=await Bf(hf(f,`/api/auth/device/status?sessionId=${encodeURIComponent(A.id)}`));if(j(fu.session||null),fu.session?.status==="succeeded")i((iu)=>({...iu,actionLoading:!1,message:"授权成功,正在刷新账号与文件列表"})),await z();else if(m)i((iu)=>({...iu,actionLoading:!1}))}catch(fu){i((iu)=>({...iu,actionLoading:!1,error:Xu(fu,"轮询登录状态失败")}))}}async function X(){i((m)=>({...m,actionLoading:!0,error:"",message:""}));try{await Bf(hf(f,"/api/auth/logout"),{method:"POST",body:{}}),j(null),i((m)=>({...m,actionLoading:!1,account:null,files:null,message:"本地 token 已清除"})),await z()}catch(m){i((fu)=>({...fu,actionLoading:!1,error:Xu(m,"退出登录失败")}))}}async function c(m){m.preventDefault();let fu=J.trim();if(!fu)return;i((iu)=>({...iu,actionLoading:!0,error:"",message:""}));try{await Bf(hf(f,"/api/folders"),{method:"POST",body:{path:M9(_,fu)}}),Q(""),i((iu)=>({...iu,actionLoading:!1,message:"文件夹已创建"})),await L(_)}catch(iu){i((Ju)=>({...Ju,actionLoading:!1,error:Xu(iu,"创建文件夹失败")}))}}async function S(m){if(!m)return;i((fu)=>({...fu,actionLoading:!0,error:"",message:""}));try{await Bf(hf(f,"/api/files/manage"),{method:"POST",body:{opera:"delete",filelist:[{path:m}],async:1}}),i((fu)=>({...fu,actionLoading:!1,message:"删除任务已提交"})),await L(_)}catch(fu){i((iu)=>({...iu,actionLoading:!1,error:Xu(fu,"删除失败")}))}}async function p(m){m.preventDefault(),i((fu)=>({...fu,actionLoading:!0,error:"",message:""}));try{await Bf(hf(f,"/api/transfers/upload-from-path"),{method:"POST",body:U}),i((fu)=>({...fu,actionLoading:!1,message:"上传任务已入队"})),await q()}catch(fu){i((iu)=>({...iu,actionLoading:!1,error:Xu(fu,"上传任务创建失败")}))}}async function Y(m){m.preventDefault(),i((fu)=>({...fu,actionLoading:!0,error:"",message:""}));try{await Bf(hf(f,"/api/transfers/download-to-path"),{method:"POST",body:N}),i((fu)=>({...fu,actionLoading:!1,message:"下载任务已入队"})),await q()}catch(fu){i((iu)=>({...iu,actionLoading:!1,error:Xu(fu,"下载任务创建失败")}))}}async function D(m,fu){i((iu)=>({...iu,actionLoading:!0,error:"",message:""}));try{await Bf(hf(f,`/api/transfers/${encodeURIComponent(m)}/${fu}`),{method:"POST",body:{}}),i((iu)=>({...iu,actionLoading:!1,message:fu==="cancel"?"已请求取消任务":"任务已重新入队"})),await q()}catch(iu){i((Ju)=>({...Ju,actionLoading:!1,error:Xu(iu,"任务操作失败")}))}}async function x(){i((m)=>({...m,actionLoading:!0,error:"",message:"正在运行上传/下载自测..."}));try{let m=await Bf(hf(f,"/api/self-test"),{method:"POST",body:{}});i((fu)=>({...fu,actionLoading:!1,selfTest:m,message:`上传/下载自测通过:${m.remotePath||""}`})),await L(_),await q()}catch(m){i((fu)=>({...fu,actionLoading:!1,error:Xu(m,"上传/下载自测失败")}))}}if(T4(()=>{if(!n)return;z();return},[n?.id,n?.runtime?.providerStatus]),T4(()=>{if(!A?.id||A.status!=="pending")return;let m=window.setInterval(()=>void T(!1),Math.max(5000,Number(A.pollIntervalSeconds||5)*1000));return()=>window.clearInterval(m)},[A?.id,A?.status,A?.pollIntervalSeconds]),T4(()=>{if(!n)return;let m=window.setInterval(()=>void q(),5000);return()=>window.clearInterval(m)},[n?.id]),!n)return h(F_,{title:"Baidu Netdisk 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=baidu-netdisk"});let V=GT(n),t=ZT(n),M=wT(n),I=y.health||{},O=y.account||I.auth?.account||null,C=I.auth||{},g=ET(y.files),a=HT(y.transfers),yu=O?.quota||{},ru=Boolean(C.loggedIn||O),R=Boolean(C.configured);return h("div",{className:"baidu-netdisk-page","data-testid":"baidu-netdisk-page"},h(gy,{title:"Baidu Netdisk 工作台",eyebrow:"Containerized Storage Gateway",loading:y.loading,actions:h("div",{className:"panel-actions"},h("a",{className:"ghost-btn",href:"/docs/issue/baidu-netdisk-env-setup.md",target:"_blank",rel:"noreferrer","data-testid":"baidu-netdisk-config-doc-link"},"配置文档"),h("button",{type:"button",className:"ghost-btn",onClick:z,disabled:y.loading,"data-testid":"baidu-netdisk-refresh"},y.loading?"刷新中":"刷新"),h(n1,{title:"Baidu Netdisk 用户服务",data:n,onOpen:l,testId:"raw-baidu-netdisk-service"}))},h("div",{className:"baidu-netdisk-hero"},h("div",null,h("div",{className:"node-version-line"},h(vy,{status:V.providerStatus==="online"?"online":"warn"},V.providerStatus||"unknown"),h("span",null,n.providerId),h(vy,{status:M.public?"warn":"private"},M.public?"公网暴露":"仅 UniDesk frontend 代理访问")),h("p",{className:"muted paragraph"},n.description)),h("div",{className:"microservice-ref-card"},h("span",null,"Repo"),h("strong",null,t.url||"--"),h("code",null,t.commitId||"--")),h("div",{className:"microservice-ref-card"},h("span",null,"Private Backend"),h("strong",null,`${M.nodeBindHost||"--"}:${M.nodePort||"--"}`),h("code",null,`${t.composeFile||"--"} / ${t.composeService||"--"}`))),h(ul,{error:y.error,wide:!0})),h("div",{className:"metric-grid"},h(N_,{label:"Health",value:I.ok?"OK":"--",hint:I.storage?.postgres||"postgres",tone:I.ok?"ok":"warn"}),h(N_,{label:"OAuth",value:R?"已配置":"待配置",hint:R?"client + secret + token key":"需要设置 UNIDESK_BAIDU_NETDISK_*",tone:R?"ok":"warn"}),h(N_,{label:"Login",value:ru?"已登录":"未登录",hint:O?.username||"Device Code QR",tone:ru?"ok":"warn"}),h(N_,{label:"Work Root",value:TT(W),hint:W}),h(N_,{label:"Quota",value:o1(yu.used),hint:yu.total?`${yu.usedPercent||0}% / ${o1(yu.total)}`:"授权后刷新"}),h(N_,{label:"Transfers",value:zT(a.length),hint:`running ${y.transfers?.counts?.running||0} / failed ${y.transfers?.counts?.failed||0}`})),h(gy,{title:"文件浏览器",eyebrow:_,className:"baidu-files-panel",loading:y.loading,actions:h("div",{className:"panel-actions inline-actions"},h("button",{type:"button",className:"ghost-btn",onClick:()=>{let m=OT(_,W);$(m),L(m)},disabled:!ru||_===W},"上级"),h("button",{type:"button",className:"ghost-btn",onClick:()=>L(_),disabled:!ru},"刷新文件"),h(n1,{title:"Baidu Files",data:y.files,onOpen:l,testId:"raw-baidu-files"}))},h("form",{className:"baidu-pathbar",onSubmit:(m)=>{m.preventDefault(),L(_)}},h("input",{value:_,onChange:(m)=>$(m.target.value),disabled:!ru}),h("button",{type:"submit",className:"ghost-btn",disabled:!ru},"打开路径")),h("form",{className:"baidu-pathbar",onSubmit:c},h("input",{value:J,onChange:(m)=>Q(m.target.value),placeholder:"新文件夹名称",disabled:!ru}),h("button",{type:"submit",className:"primary-btn",disabled:!ru||!J.trim()},"新建文件夹")),!ru?h(F_,{title:"等待授权",text:"登录后通过 /api/files 读取工作目录文件列表"}):g.length===0?h(F_,{title:"目录为空",text:"可以从 staging 目录上传文件或新建文件夹"}):h("div",{className:"table-wrap","data-testid":"baidu-netdisk-file-table"},h("table",null,h("thead",null,h("tr",null,h("th",null,"名称"),h("th",null,"类型"),h("th",null,"大小"),h("th",null,"修改时间"),h("th",null,"fs_id"),h("th",null,"操作"))),h("tbody",null,g.map((m)=>h("tr",{key:m.fsId||m.path},h("td",null,h("strong",null,m.serverFilename||m.path),h("code",null,m.path||"--")),h("td",null,h(vy,{status:m.isDir?"queued":"private"},m.isDir?"DIR":"FILE")),h("td",null,m.isDir?"--":o1(m.size)),h("td",null,m.serverMtime?Zu(m.serverMtime*1000):"--"),h("td",null,h("code",null,m.fsId||"--")),h("td",null,h("div",{className:"inline-actions"},m.isDir?h("button",{type:"button",className:"ghost-btn",onClick:()=>{$(m.path),L(m.path)}},"打开"):h("button",{type:"button",className:"ghost-btn",onClick:()=>K((fu)=>({...fu,fsId:m.fsId}))},"填入下载"),h("button",{type:"button",className:"ghost-btn",onClick:()=>S(m.path),disabled:y.actionLoading},"删除"))))))))),h("div",{className:"baidu-netdisk-grid"},h(gy,{title:"配置与文档",eyebrow:"Deployment References",className:"baidu-docs-panel",actions:h("div",{className:"panel-actions inline-actions"},h("a",{className:"ghost-btn",href:"/docs/issue/baidu-netdisk-env-setup.md",target:"_blank",rel:"noreferrer"},"打开环境配置"),h("a",{className:"ghost-btn",href:"/docs/issue/baidu-netdisk-user-service.md",target:"_blank",rel:"noreferrer"},"打开服务方案"))},h("p",{className:"muted paragraph"},R?"OAuth 运行时变量已配置;如需轮换密钥、迁移部署或排查代理边界,可直接打开下面的项目内文档。":"首次使用请先按环境变量配置文档填入百度应用 client id / secret,然后重建 baidu-netdisk 服务并刷新本页。"),h("div",{className:"baidu-doc-grid","data-testid":"baidu-netdisk-doc-links"},h(W_,{title:"环境变量配置",text:"填写 UNIDESK_BAIDU_NETDISK_CLIENT_ID、CLIENT_SECRET、TOKEN_KEY,并执行重建与健康检查。",href:"/docs/issue/baidu-netdisk-env-setup.md",badge:"SETUP",testId:"baidu-netdisk-env-doc-card"}),h(W_,{title:"服务方案与 API",text:"说明 OAuth Device Code、根目录工作区、staging 上传下载任务和后端 API 设计。",href:"/docs/issue/baidu-netdisk-user-service.md",badge:"DESIGN"}),h(W_,{title:"用户服务安全边界",text:"查看 UniDesk microservice 私有代理、允许路径、frontendOnly 和密钥边界规则。",href:"/docs/reference/microservices.md",badge:"REF"}),h(W_,{title:"部署与重建流程",text:"查看 server rebuild、Compose 编排、健康检查和交付验证的长期规则。",href:"/docs/reference/deployment.md",badge:"DEPLOY"}),h(W_,{title:"CLI 验证命令",text:"查看 microservice health/proxy、server rebuild、job status 等命令入口。",href:"/docs/reference/cli.md",badge:"CLI"}),h(W_,{title:"百度设备码模式",text:"打开百度官方 OAuth Device Code 文档,对照扫码登录和轮询参数。",href:"https://pan.baidu.com/union/doc/fl1x114ti",badge:"OFFICIAL"}))),h(gy,{title:"设备码登录",eyebrow:"OAuth Device Code",className:"baidu-login-panel",loading:y.actionLoading,actions:h("div",{className:"panel-actions inline-actions"},h("button",{type:"button",className:"primary-btn",onClick:Z,disabled:y.actionLoading||!R,"data-testid":"baidu-netdisk-start-login"},"生成二维码"),A?.id?h("button",{type:"button",className:"ghost-btn",onClick:()=>T(!0),disabled:y.actionLoading},"检查状态"):null,ru?h("button",{type:"button",className:"ghost-btn",onClick:X,disabled:y.actionLoading},"清除本地登录"):null,h(n1,{title:"Baidu Device Session",data:A||C.latestSession,onOpen:l,testId:"raw-baidu-device-session"}))},h("div",{className:"baidu-login-card","data-testid":"baidu-netdisk-login-card"},h("div",{className:"baidu-qr-frame"},A?.qrcodeUrl?h("img",{src:A.qrcodeUrl,alt:"百度网盘设备码授权二维码","data-testid":"baidu-netdisk-qrcode"}):h(F_,{title:R?"等待二维码":"OAuth 未配置",text:R?"点击生成二维码后使用百度网盘或百度 App 扫码":"设置 client id、secret 和 token key 后重建服务"})),h("div",{className:"claudeqq-login-copy"},h("div",{className:"node-version-line"},h(vy,{status:ru?"online":A?.status==="pending"?"warn":"unknown"},ru?"已登录":A?.status||"未开始"),h("span",null,A?.secondsRemaining!==void 0?`${A.secondsRemaining}s`:"--"),h("span",null,"scope basic,netdisk")),h("p",{className:"muted paragraph"},ru?"access token / refresh token 已加密保存到 PostgreSQL;前端只看到脱敏登录态。":"后端使用百度 OAuth Device Code 轮询换取 token;二维码过期后重新生成即可。"),h("div",{className:"microservice-ref-card"},h("span",null,"User Code"),h("strong",null,A?.userCode||"--"),h("code",null,A?.verificationUrl||"https://openapi.baidu.com/device")),h("div",{className:"microservice-ref-card"},h("span",null,"Expires"),h("strong",null,A?.expiresAt?Zu(A.expiresAt):"--"),h("code",null,A?.error||"no token exposed"))))),h(gy,{title:"账号与容量",eyebrow:y.refreshedAt?`Updated ${rl(y.refreshedAt)}`:"Account",loading:y.loading,actions:h("div",{className:"panel-actions inline-actions"},h(n1,{title:"Baidu Account",data:O,onOpen:l,testId:"raw-baidu-account"}))},O?h("div",{className:"baidu-account-card"},h("div",{className:"node-version-line"},h(vy,{status:"online"},"connected"),h("span",null,O.baiduUid||"--"),h("span",null,`VIP ${O.vipType??"--"}`)),h("h3",null,O.username||"Baidu Netdisk"),h("p",{className:"muted paragraph"},`工作目录固定在 ${O.rootPath||W};v1 上传/下载只读写容器 staging 目录,不把大文件字节流穿过 UniDesk proxy。`),h("div",{className:"quota-bar"},h("span",{style:{width:`${Math.max(0,Math.min(100,Number(yu.usedPercent||0)))}%`}})),h("div",{className:"microservice-ref-card"},h("span",null,"Quota"),h("strong",null,`${o1(yu.used)} / ${o1(yu.total)}`),h("code",null,`${yu.usedPercent||0}% used`))):h(F_,{title:"尚未登录",text:"扫码授权后这里会显示账号、UID、会员状态和容量"})),h(gy,{title:"传输任务",eyebrow:"staging path jobs",className:"baidu-transfers-panel",loading:y.actionLoading,actions:h("div",{className:"panel-actions inline-actions"},h("button",{type:"button",className:"primary-btn",onClick:x,disabled:!ru||y.actionLoading,"data-testid":"baidu-netdisk-self-test"},"运行自测"),h("button",{type:"button",className:"ghost-btn",onClick:q},"刷新任务"),h(n1,{title:"Baidu Transfers",data:y.transfers,onOpen:l,testId:"raw-baidu-transfers"}))},h("div",{className:"baidu-transfer-forms"},h("form",{className:"stack-form",onSubmit:p,"data-testid":"baidu-upload-form"},h("label",null,"容器 staging 文件",h("input",{value:U.localPath,onChange:(m)=>F((fu)=>({...fu,localPath:m.target.value})),placeholder:"sample.txt"})),h("label",null,"百度网盘目标路径",h("input",{value:U.remotePath,onChange:(m)=>F((fu)=>({...fu,remotePath:m.target.value})),placeholder:M9(W,"sample.txt")})),h("button",{type:"submit",className:"primary-btn",disabled:!ru||y.actionLoading},"上传 staging 文件")),h("form",{className:"stack-form",onSubmit:Y,"data-testid":"baidu-download-form"},h("label",null,"文件 fs_id",h("input",{value:N.fsId,onChange:(m)=>K((fu)=>({...fu,fsId:m.target.value})),placeholder:"从文件表填入"})),h("label",null,"保存到 staging 路径",h("input",{value:N.localPath,onChange:(m)=>K((fu)=>({...fu,localPath:m.target.value})),placeholder:"downloads/"})),h("button",{type:"submit",className:"primary-btn",disabled:!ru||!N.fsId||y.actionLoading},"下载到 staging"))),y.selfTest?h("div",{className:"baidu-account-card","data-testid":"baidu-netdisk-self-test-result"},h("div",{className:"node-version-line"},h(vy,{status:y.selfTest.ok?"online":"warn"},y.selfTest.ok?"self-test ok":"self-test"),h("span",null,o1(y.selfTest.sizeBytes))),h("h3",null,y.selfTest.remotePath||"Baidu self-test"),h("div",{className:"microservice-ref-card"},h("span",null,"fs_id"),h("strong",null,y.selfTest.fsId||"--"),h("code",null,y.selfTest.downloadedPath||"--")),h("div",{className:"microservice-ref-card"},h("span",null,"MD5"),h("strong",null,y.selfTest.downloadedMd5||"--"),h("code",null,y.selfTest.expectedMd5||"--")),h(n1,{title:"Baidu Self Test",data:y.selfTest,onOpen:l,testId:"raw-baidu-self-test"})):null,a.length===0?h(F_,{title:"暂无传输任务",text:"上传/下载任务会在后端容器内执行,避免大文件穿过 UniDesk proxy"}):h("div",{className:"table-wrap","data-testid":"baidu-transfer-table"},h("table",null,h("thead",null,h("tr",null,h("th",null,"状态"),h("th",null,"方向"),h("th",null,"路径"),h("th",null,"进度"),h("th",null,"时间"),h("th",null,"操作"))),h("tbody",null,a.map((m)=>h("tr",{key:m.id},h("td",null,h(vy,{status:m.status},m.status)),h("td",null,m.direction),h("td",null,h("strong",null,m.remotePath||m.fsId||"--"),h("code",null,m.localPath||"--"),m.error?h("span",{className:"form-error"},m.error):null),h("td",null,h(VT,{percent:m.progressPercent}),h("span",{className:"muted"},`${o1(m.bytesDone)} / ${o1(m.sizeBytes)}`)),h("td",null,Zu(m.updatedAt)),h("td",null,h("div",{className:"inline-actions"},["queued","running"].includes(m.status)?h("button",{type:"button",className:"ghost-btn",onClick:()=>D(m.id,"cancel")},"取消"):null,["failed","canceled"].includes(m.status)?h("button",{type:"button",className:"ghost-btn",onClick:()=>D(m.id,"retry")},"重试"):null,h(n1,{title:`Transfer ${m.id}`,data:m,onOpen:l}))))))))),h(gy,{title:"安全与日志",eyebrow:"redacted diagnostics",className:"baidu-wide-panel",loading:y.loading,actions:h("div",{className:"panel-actions inline-actions"},h(n1,{title:"Baidu Health",data:I,onOpen:l,testId:"raw-baidu-health"}),h(n1,{title:"Baidu Logs",data:y.logs,onOpen:l,testId:"raw-baidu-logs"}))},h("div",{className:"policy-grid"},h("article",null,h("b",null,"私有后端"),h("span",null,"4244 只在 Compose 网络 expose,浏览器经 UniDesk 同源代理访问")),h("article",null,h("b",null,"Token 加密"),h("span",null,"access/refresh token 使用 BAIDU_NETDISK_TOKEN_KEY 加密后写入 PostgreSQL")),h("article",null,h("b",null,"无浏览器大文件流"),h("span",null,"上传/下载以容器 staging 目录为边界,避免 proxy 文本通道传输大字节流"))))))}var c4=ku(ql(),1);var uu=c4.default.createElement,{useEffect:BT}=c4.default,B4=c4.default.useState,sy={label:"主用户私聊账号",userId:645275593};function C9(u){let l=Number(u);return Number.isFinite(l)?l.toLocaleString("zh-CN"):"--"}async function d1(u,l={}){return Eu(u,{failureFields:["ok","success"],...l})}async function XT(u){let l=await fetch(u,{credentials:"same-origin"}),f=await l.text();try{return f?JSON.parse(f):{ok:l.ok,status:l.status}}catch{return{ok:l.ok,status:l.status,text:f}}}function X4({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return uu("span",{className:`status-badge ${f}`},l||u||"unknown")}function q_({label:u,value:l,hint:f,tone:n}){return uu("article",{className:`metric-card ${n||""}`},uu("div",{className:"metric-label"},u),uu("div",{className:"metric-value"},l),uu("div",{className:"metric-hint"},f))}function L_({title:u,eyebrow:l,actions:f,children:n,className:y,loading:i}){return uu("section",{className:`panel ${y||""}`},uu("div",{className:"panel-head"},uu("div",null,l?uu("p",{className:"panel-eyebrow"},l):null,uu(nl,{title:u,loading:i})),f?uu("div",{className:"panel-actions"},f):null),uu("div",{className:"panel-body"},n))}function q3({title:u,data:l,onOpen:f,testId:n}){return uu("button",{type:"button",className:"ghost-btn","data-testid":n,onClick:(y)=>{y?.stopPropagation?.(),f(u,l)}},"查看原始JSON")}function L3({title:u,text:l}){return uu("div",{className:"empty-state"},uu("strong",null,u),uu("span",null,l))}function cT(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function YT(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function DT(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function e1(u,l){return`${u}/microservices/claudeqq/proxy${l}`}function tT(u){return Array.isArray(u?.events)?u.events.slice(0,80):[]}function ST(u){return Array.isArray(u?.subscriptions)?u.subscriptions.slice(0,50):[]}function PT(u){return Array.isArray(u?.messages)?u.messages.slice(0,30):[]}function fq(u){let l=u?.text??u?.message??u?.raw?.raw_message;if(typeof l!=="string")return"--";return l.length>180?`${l.slice(0,177)}...`:l}function nq(u){let l=u?.groupId??u?.group_id??(u?.message_type==="group"?u?.target_id:void 0),f=u?.userId??u?.user_id??(u?.message_type==="private"?u?.target_id:void 0);if(l)return`群 ${l}`;if(f)return`私聊 ${f}`;return"--"}function yq({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let n=u.find((O)=>O.id==="claudeqq")||null,[y,i]=B4({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}),[_,$]=B4({targetType:"private",targetId:String(sy.userId),message:""}),[A,j]=B4({name:"unidesk-callback",targetUrl:"",eventTypes:"message",secret:""}),[J,Q]=B4(""),{addNotification:U}=kf();async function F(){if(!n)return;i((O)=>({...O,loading:!0,error:""}));try{let[O,C,g,a,yu]=await Promise.all([XT(`${f}/microservices/claudeqq/health`),d1(e1(f,"/api/server/status")),d1(e1(f,"/api/events/recent?limit=60")),d1(e1(f,"/api/events/subscriptions")),d1(e1(f,"/api/messages/sent?limit=20"))]);if(i((ru)=>({...ru,loading:!1,error:"",health:O,status:C,events:g,subscriptions:a,sent:yu,refreshedAt:new Date})),!y.qrcodeFetched)N(!1)}catch(O){i((C)=>({...C,loading:!1,error:Xu(O,"ClaudeQQ 加载失败")}))}}async function N(O=!0){if(!n)return;i((C)=>({...C,qrLoading:!0,error:O?"":C.error}));try{let C=await d1(e1(f,"/api/napcat/login")),g=C?.napcat?.qrcode||C?.qrcode||null;i((a)=>({...a,qrLoading:!1,error:"",napcatLogin:C,napcatQrcode:g,qrcodeFetched:!0,qrcodeRefreshedAt:new Date}))}catch(C){i((g)=>({...g,qrLoading:!1,error:O||!g.napcatQrcode?Xu(C,"NapCat 二维码加载失败"):g.error}))}}async function K(O){O.preventDefault(),Q("");let C=Number(_.targetId);if(!Number.isFinite(C)||C<=0||_.message.trim().length===0){i((g)=>({...g,error:"请填写 QQ 目标和消息内容"}));return}try{await d1(e1(f,"/api/push/text"),{method:"POST",body:JSON.stringify({userId:_.targetType==="private"?C:void 0,groupId:_.targetType==="group"?C:void 0,message:_.message})});let g="消息推送请求已提交";$((a)=>({...a,targetType:"private",targetId:String(sy.userId),message:""})),Q(g),U("success",g),await F()}catch(g){i((a)=>({...a,error:Xu(g,"发送失败")}))}}async function G(O){if(O.preventDefault(),Q(""),A.targetUrl.trim().length===0){i((C)=>({...C,error:"请填写订阅回调 URL"}));return}try{await d1(e1(f,"/api/events/subscriptions"),{method:"POST",body:JSON.stringify({name:A.name,targetUrl:A.targetUrl,eventTypes:A.eventTypes.split(",").map((g)=>g.trim()).filter(Boolean),secret:A.secret||void 0,enabled:!0})});let C="事件订阅已创建";Q(C),U("success",C),await F()}catch(C){i((g)=>({...g,error:Xu(C,"订阅失败")}))}}async function W(O){if(!O)return;Q("");try{await d1(e1(f,`/api/events/subscriptions/${encodeURIComponent(O)}`),{method:"DELETE"});let C="事件订阅已删除";Q(C),U("success",C),await F()}catch(C){i((g)=>({...g,error:Xu(C,"删除订阅失败")}))}}if(BT(()=>{if(!n)return;F();return},[n?.id,n?.runtime?.providerStatus]),!n)return uu(L3,{title:"ClaudeQQ 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=claudeqq"});let L=cT(n),q=DT(n),z=YT(n),Z=y.health||{},T=y.status||{},X=y.napcatLogin||{},c=Z.napcat||T.napcat||{},S={...X.napcat||{},...c,qrcode:y.napcatQrcode||{},webui:c.webui||X.napcat?.webui},p=X.login||{},Y=y.napcatQrcode||{},D=tT(y.events),x=ST(y.subscriptions),V=PT(y.sent),t=Boolean(S.httpConnected||p.ready),M=String(S.loginState||p.state||(t?"logged_in":"unknown")),I=Boolean(Y.available&&Y.dataUrl);return uu("div",{className:"claudeqq-page","data-testid":"claudeqq-page"},uu(L_,{title:"ClaudeQQ 工作台",eyebrow:"D601 QQ Event Gateway",loading:y.loading,actions:uu("div",{className:"panel-actions"},uu("button",{type:"button",className:"ghost-btn",onClick:F,disabled:y.loading,"data-testid":"claudeqq-refresh-button"},y.loading?"刷新中":"刷新"),uu(q3,{title:"ClaudeQQ 用户服务",data:n,onOpen:l,testId:"raw-claudeqq-service"}))},uu("div",{className:"findjob-hero"},uu("div",null,uu("div",{className:"node-version-line"},uu(X4,{status:L.providerStatus==="online"?"online":"warn"},L.providerStatus||"unknown"),uu("span",null,n.providerId),uu("span",null,z.public?"公网暴露":"仅 UniDesk frontend 代理访问")),uu("p",{className:"muted paragraph"},n.description)),uu("div",{className:"microservice-ref-card"},uu("span",null,"Repo"),uu("strong",null,q.url||"--"),uu("code",null,q.commitId||"--")),uu("div",{className:"microservice-ref-card"},uu("span",null,"D601 k3s Service"),uu("strong",null,`${z.nodeBindHost||"--"}:${z.nodePort||"--"}`),uu("code",null,`${z.proxyMode||"--"} / ${q.composeFile||"--"}`))),uu(ul,{error:y.error,wide:!0})),uu("div",{className:"metric-grid"},uu(q_,{label:"Health",value:Z.ok||Z.status==="ok"?"OK":"--",hint:"D601 /health",tone:Z.ok||Z.status==="ok"?"ok":"warn"}),uu(q_,{label:"NapCat HTTP",value:S.httpConnected||S.http?.connected?"OK":"离线",hint:`${S.httpHost||Z.napcat?.httpHost||"--"}:${S.httpPort||Z.napcat?.httpPort||"--"}`}),uu(q_,{label:"NapCat WS",value:S.wsConnected||S.ws?.connected?"OK":"离线",hint:`${S.wsHost||Z.napcat?.wsHost||"--"}:${S.wsPort||Z.napcat?.wsPort||"--"}`}),uu(q_,{label:"事件缓存",value:C9(y.events?.count??D.length),hint:"recent QQ events"}),uu(q_,{label:"订阅",value:C9(y.subscriptions?.count??x.length),hint:"webhook subscribers"}),uu(q_,{label:"已发送",value:C9(y.sent?.count??V.length),hint:"sent message log"})),uu("div",{className:"findjob-grid"},uu(L_,{title:"NapCat 容器登录",eyebrow:"QR Login",className:"claudeqq-login-panel",loading:y.qrLoading,actions:uu("div",{className:"panel-actions inline-actions"},uu("button",{type:"button",className:"ghost-btn",onClick:()=>N(!0),disabled:y.qrLoading,"data-testid":"claudeqq-napcat-refresh"},y.qrLoading?"刷新中":"手动刷新二维码"),uu(q3,{title:"NapCat Login",data:y.napcatLogin,onOpen:l,testId:"raw-claudeqq-napcat-login"}))},uu("div",{className:"claudeqq-login-card","data-testid":"claudeqq-napcat-login"},uu("div",{className:"claudeqq-qr-frame"},I?uu("img",{src:Y.dataUrl,alt:"NapCat QQ 登录二维码","data-testid":"claudeqq-napcat-qrcode"}):uu(L3,{title:"等待二维码",text:"NapCat 容器启动后会把登录二维码写入 cache/qrcode.png"})),uu("div",{className:"claudeqq-login-copy"},uu("div",{className:"node-version-line"},uu(X4,{status:t?"online":I?"warn":"unknown"},t?"已登录":I?"待扫码":"等待二维码"),uu("span",null,M),uu("span",null,"D601 containerized")),uu("p",{className:"muted paragraph"},t?"NapCat 已登录,ClaudeQQ 可通过容器内 HTTP/WS 链路收发 QQ 消息。":"用手机 QQ 扫描二维码授权登录。二维码只在首次加载或手动刷新时更新,D601 的 NapCat 端口仍只绑定 127.0.0.1。"),uu("div",{className:"microservice-ref-card"},uu("span",null,"NapCat WebUI"),uu("strong",null,S.webui?.url||"http://napcat:6099/webui"),uu("code",null,"local-only / proxied QR login")),uu("div",{className:"microservice-ref-card"},uu("span",null,"QR Source"),uu("strong",null,Y.modifiedAt?Zu(Y.modifiedAt):y.qrcodeRefreshedAt?Zu(y.qrcodeRefreshedAt):"--"),uu("code",null,Y.file||"/napcat/cache/qrcode.png"))))),uu(L_,{title:"消息推送",eyebrow:"Push API"},uu("div",{className:"microservice-ref-card"},uu("span",null,sy.label),uu("strong",null,String(sy.userId)),uu("code",null,"private userId / 默认推送测试目标")),uu("form",{className:"stack-form",onSubmit:K,"data-testid":"claudeqq-push-form"},uu("label",null,"目标类型",uu("select",{value:_.targetType,onChange:(O)=>$((C)=>({...C,targetType:O.target.value}))},uu("option",{value:"private"},"私聊 userId"),uu("option",{value:"group"},"群 groupId"))),uu("label",null,"QQ ID",uu("input",{value:_.targetId,onChange:(O)=>$((C)=>({...C,targetId:O.target.value})),placeholder:String(sy.userId)})),uu("label",null,"消息内容",uu("textarea",{value:_.message,onChange:(O)=>$((C)=>({...C,message:O.target.value})),rows:4,placeholder:"通过 ClaudeQQ 推送一条 QQ 消息"})),uu("button",{type:"submit",className:"primary-btn"},"发送 QQ 消息")),uu("p",{className:"muted paragraph"},`主 server 和其他用户服务可通过 UniDesk 同源代理调用 /api/push/text;当前人工推送测试默认使用 ${sy.label} ${sy.userId},不需要暴露 D601 后端端口。`)),uu(L_,{title:"QQ 事件订阅",eyebrow:"Webhook Subscription",loading:y.loading},uu("form",{className:"stack-form",onSubmit:G,"data-testid":"claudeqq-subscription-form"},uu("label",null,"订阅名称",uu("input",{value:A.name,onChange:(O)=>j((C)=>({...C,name:O.target.value}))})),uu("label",null,"回调 URL",uu("input",{value:A.targetUrl,onChange:(O)=>j((C)=>({...C,targetUrl:O.target.value})),placeholder:"http://host.docker.internal:18080/..."})),uu("label",null,"事件类型",uu("input",{value:A.eventTypes,onChange:(O)=>j((C)=>({...C,eventTypes:O.target.value})),placeholder:"message,notice"})),uu("label",null,"签名密钥",uu("input",{value:A.secret,onChange:(O)=>j((C)=>({...C,secret:O.target.value})),placeholder:"可选,生成 x-claudeqq-signature"})),uu("button",{type:"submit",className:"primary-btn"},"创建订阅")),x.length===0?uu(L3,{title:"暂无订阅",text:"可以为 main server 或其他用户服务注册 HTTP webhook"}):uu("div",{className:"table-wrap","data-testid":"claudeqq-subscription-table"},uu("table",null,uu("thead",null,uu("tr",null,uu("th",null,"名称"),uu("th",null,"状态"),uu("th",null,"事件"),uu("th",null,"回调"),uu("th",null,"最近投递"),uu("th",null,"操作"))),uu("tbody",null,x.map((O)=>uu("tr",{key:O.id},uu("td",null,uu("strong",null,O.name||O.id),uu("code",null,O.id||"--")),uu("td",null,uu(X4,{status:O.enabled?"online":"warn"},O.enabled?"enabled":"disabled")),uu("td",null,Array.isArray(O.eventTypes)?O.eventTypes.join(", "):"message"),uu("td",null,O.targetUrl||"--"),uu("td",null,O.lastDelivery?`${O.lastDelivery.ok?"OK":"FAIL"} ${Zu(O.lastDelivery.at)}`:"--"),uu("td",null,uu("button",{type:"button",className:"ghost-btn",onClick:()=>W(O.id)},"删除"))))))),uu("div",{className:"panel-actions inline-actions"},uu(q3,{title:"ClaudeQQ Subscriptions",data:y.subscriptions,onOpen:l,testId:"raw-claudeqq-subscriptions"}))),uu(L_,{title:"最近 QQ 事件",eyebrow:y.refreshedAt?`Updated ${rl(y.refreshedAt)}`:"Event Stream",loading:y.loading},D.length===0?uu(L3,{title:"暂无事件",text:"等待 NapCat WebSocket 上报 QQ 消息事件,或通过订阅 API 消费后续事件"}):uu("div",{className:"table-wrap","data-testid":"claudeqq-event-list"},uu("table",null,uu("thead",null,uu("tr",null,uu("th",null,"时间"),uu("th",null,"类型"),uu("th",null,"会话"),uu("th",null,"消息"),uu("th",null,"ID"))),uu("tbody",null,D.map((O)=>uu("tr",{key:O.id},uu("td",null,Zu(O.receivedAt||O.timestamp)),uu("td",null,uu(X4,{status:O.postType||O.eventType},O.postType||O.eventType||"--")),uu("td",null,nq(O)),uu("td",null,fq(O)),uu("td",null,uu("code",null,O.messageId||O.id||"--"))))))),uu("div",{className:"panel-actions inline-actions"},uu(q3,{title:"ClaudeQQ Events",data:y.events,onOpen:l,testId:"raw-claudeqq-events"}))),uu(L_,{title:"已发送消息",eyebrow:`${V.length} Sent`,loading:y.loading},V.length===0?uu(L3,{title:"暂无发送记录",text:"发送日志来自 ClaudeQQ bot_workspace/messages/sent_messages.jsonl"}):uu("div",{className:"table-wrap"},uu("table",null,uu("thead",null,uu("tr",null,uu("th",null,"时间"),uu("th",null,"目标"),uu("th",null,"消息"),uu("th",null,"结果"))),uu("tbody",null,V.map((O,C)=>uu("tr",{key:O.id||C},uu("td",null,Zu(O.timestamp||O.sentAt||O.createdAt)),uu("td",null,nq(O)),uu("td",null,fq(O)),uu("td",null,O.status||O.messageId||O.message_id||"--")))))),uu("div",{className:"panel-actions inline-actions"},uu(q3,{title:"ClaudeQQ Sent Messages",data:y.sent,onOpen:l,testId:"raw-claudeqq-sent"})))))}var X3=ku(ql(),1);var $q=ku(ql(),1),wl=$q.default.createElement;function K_({markdown:u,className:l,testId:f}){let n=String(u??"").trimEnd(),y=["markdown-body",l].filter(Boolean).join(" ");return wl("div",{className:y,"data-testid":f},Aq(n,"md"))}function Aq(u,l){let f=MT(u).split(` +`),n=[],y=0;while(y\s?/u.test(i)){let Q=[];while(y\s?(.*)$/u);if(F!==null){Q.push(F[1]),y+=1;continue}if(U.trim().length===0){Q.push(""),y+=1;continue}break}n.push(wl("blockquote",{key:`${l}-quote-${y}`},Aq(Q.join(` +`),`${l}-quote-${y}`)));continue}if(jq(f,y)){let Q=y,U=K3(f[y]??""),F=K3(f[y+1]??"");y+=2;let N=[];while(y0)N.push(K3(f[y]??"")),y+=1;n.push(RT(U,F,N,`${l}-table-${Q}`));continue}let A=D4(i);if(A!==null){let Q=y,U=A.ordered,F=A.start,N=[];while(yxT(G,`${l}-list-${Q}-${W}`))));continue}let j=y,J=[];while(y0&&!pT(f,y))J.push(f[y].trim()),y+=1;if(J.length===0)J.push(i.trim()),y+=1;n.push(wl("p",{key:`${l}-p-${j}`},Vn(J.join(` +`),`${l}-p-${j}`)))}return n}function MT(u){return String(u||"").replace(/\r\n/gu,` `).replace(/\r/gu,` -`).trimEnd()}function rq(u){let l=u.match(/^\s*(```+|~~~+)\s*([A-Za-z0-9_-]+)?\s*$/u);if(l===null)return null;let f=l[1];return{marker:f.startsWith("`")?"`":"~",length:f.length,language:l[2]||""}}function MT(u,l){let f=u.trim();return f.length>=l.length&&f.split("").every((n)=>n===l.marker)}function C9(u){return/^(?: {4}|\t)/u.test(u)}function iq(u,l,f){let n=l.trim().length>0?`language-${bT(l)}`:void 0;return Gl("pre",{key:f,className:"markdown-code-block"},Gl("code",{className:n},u))}function CT(u,l){let f=u[l]??"";if(f.trim().length===0)return!0;return rq(f)!==null||C9(f)||/^(#{1,6})\s+.+$/u.test(f)||/^\s*(?:---+|\*\*\*+|___+)\s*$/u.test(f)||/^\s*>\s?/u.test(f)||Aq(u,l)||Y8(f)!==null}function Y8(u){let l=u.match(/^\s{0,3}[-*+]\s+(.+)$/u);if(l!==null)return{ordered:!1,text:l[1]};let f=u.match(/^\s{0,3}(\d+)[.)]\s+(.+)$/u);if(f!==null)return{ordered:!0,start:Number(f[1]),text:f[2]};return null}function pT(u,l){let f=u.match(/^\[([ xX])\]\s+(.+)$/u);if(f!==null){let n=f[1].toLowerCase()==="x";return Gl("li",{key:l,className:"task-list-item"},Gl("input",{type:"checkbox",checked:n,readOnly:!0,tabIndex:-1}),Gl("span",null,On(f[2],`${l}-task`)))}return Gl("li",{key:l},On(u,l))}function Aq(u,l){let f=u[l]??"",n=u[l+1]??"";if(!f.includes("|")||!n.includes("|"))return!1;let i=L3(f),y=L3(n);return i.length>1&&y.length===i.length&&y.every((_)=>/^:?-{3,}:?$/u.test(_.trim()))}function L3(u){let l=u.trim();if(l.startsWith("|"))l=l.slice(1);if(l.endsWith("|"))l=l.slice(0,-1);return l.split("|").map((f)=>f.trim())}function mT(u){let l=u.trim();if(l.startsWith(":")&&l.endsWith(":"))return"center";if(l.endsWith(":"))return"right";if(l.startsWith(":"))return"left";return}function xT(u,l,f,n){let i=l.map(mT);return Gl("div",{key:n,className:"markdown-table-wrap"},Gl("table",null,Gl("thead",null,Gl("tr",null,u.map((y,_)=>Gl("th",{key:`${n}-h-${_}`,style:i[_]?{textAlign:i[_]}:void 0},On(y,`${n}-h-${_}`))))),Gl("tbody",null,f.map((y,_)=>Gl("tr",{key:`${n}-r-${_}`},u.map(($,r)=>Gl("td",{key:`${n}-r-${_}-${r}`,style:i[r]?{textAlign:i[r]}:void 0},On(y[r]||"",`${n}-r-${_}-${r}`))))))))}function On(u,l,f={}){let n=[],i=/`([^`\n]+)`|\[([^\]\n]+)\]\(([^)\s]+)(?:\s+"[^"]*")?\)|(https?:\/\/[^\s<>)]+)|\*\*([^*\n]+)\*\*|__([^_\n]+)__|~~([^~\n]+)~~|\*([^*\n]+)\*|_([^_\n]+)_/gu,y=f.linkify!==!1,_=0,$=0;for(let r of u.matchAll(i)){let j=r[0],J=r.index??0;X8(n,u.slice(_,J),`${l}-text-${$}`),_=J+j.length;let Q=`${l}-inline-${$}`;if($+=1,r[1]!==void 0){n.push(Gl("code",{key:Q},r[1]));continue}if(r[2]!==void 0&&r[3]!==void 0){if(!y){X8(n,j,`${Q}-literal`);continue}n.push(yq(r[2],r[3],Q));continue}if(r[4]!==void 0){if(!y){X8(n,j,`${Q}-literal`);continue}n.push(yq(r[4],r[4],Q));continue}let U=r[5]??r[6];if(U!==void 0){n.push(Gl("strong",{key:Q},On(U,`${Q}-strong`)));continue}if(r[7]!==void 0){n.push(Gl("del",{key:Q},On(r[7],`${Q}-del`)));continue}let F=r[8]??r[9];if(F!==void 0)n.push(Gl("em",{key:Q},On(F,`${Q}-em`)))}return X8(n,u.slice(_),`${l}-text-tail`),n}function X8(u,l,f){if(l.length===0)return;l.split(` -`).forEach((i,y)=>{if(y>0)u.push(Gl("br",{key:`${f}-br-${y}`}));if(i.length>0)u.push(i)})}function yq(u,l,f){let n=RT(l);if(n===null)return Gl("span",{key:f},u);let i=/^(?:https?:|mailto:)/iu.test(n);return Gl("a",{key:f,href:n,target:i?"_blank":void 0,rel:i?"noreferrer":void 0},On(u,`${f}-label`,{linkify:!1}))}function RT(u){let l=String(u||"").trim();if(/^(?:https?:|mailto:)/iu.test(l))return l;if(l.startsWith("/")&&!l.startsWith("//"))return l;if(l.startsWith("#"))return l;return null}function bT(u){return String(u||"").toLowerCase().replace(/[^a-z0-9_-]+/gu,"-").replace(/^-+|-+$/gu,"")||"text"}var k9=bu(Wl(),1);var mu=k9.default.createElement,{useEffect:kT,useRef:jq}=k9.default;function hT(u,l){return Oq(u.toTrace(l))}function IT(u){let l=Number(u);if(!Number.isFinite(l)||l<0)return"--";let f=Math.floor(l/1000),n=Math.floor(f/3600),i=Math.floor(f%3600/60),y=f%60;if(n>0)return`${n}h ${String(i).padStart(2,"0")}m`;if(i>0)return`${i}m ${String(y).padStart(2,"0")}s`;return`${y}s`}function yn(u){let l=Number(u);return Number.isFinite(l)&&l>=0?l:null}function z_(u,l=180){let f=String(u||"").replace(/\s+/gu," ").trim();return f.length>l?`${f.slice(0,l-1)}…`:f}function vT(u){if(!u)return 0;return u.split(/\r?\n/u).length}function x9(u){return{ran:"Ran",explored:"Explored",edited:"Edited",toolGroup:"Tool calls",plan:"Plan",message:"Message",system:"System",error:"Error"}[u]||"Message"}function R9(u){let l=Number(u||0);return Number.isFinite(l)&&l>0?`… +${Math.floor(l)} lines`:""}function gT(u){return(Array.isArray(u)?u:[]).reduce((l,f)=>Math.max(l,Number(f?.seq??0)),0)}function Jq(u){return["explored","edited","ran"].includes(String(u?.kind||""))}function Kq(u){let l={read:0,edit:0,run:0};for(let f of u){let n=String(f?.kind||"");if(n==="explored")l.read+=1;else if(n==="edited")l.edit+=1;else if(n==="ran")l.run+=1}return l}function zq(u){let l=Kq(u);return`${l.read} read, ${l.edit} edit, ${l.run} run`}function Gq(u){return u.replace(/^['"`([{<]+/u,"").replace(/['"`)\]}>.,;:]+$/u,"").replace(/:\d+(?::\d+)?$/u,"").trim()}function Qq(u){let f=String(u||"").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)||[],n=[];for(let i of f){let y=Gq(i);if(y.length<2||y.includes("..."))continue;if(/^(http|https|status|method)$/iu.test(y))continue;if(!n.includes(y))n.push(y)}return n}function p9(u,l=4){if(u.length===0)return"--";let f=u.slice(0,l).join(", ");return u.length>l?`${f} +${u.length-l}`:f}function Uq(u){let l="";for(let f of u){if(f.length===0)continue;if(l.length>0&&!l.endsWith(` +`).trimEnd()}function rq(u){let l=u.match(/^\s*(```+|~~~+)\s*([A-Za-z0-9_-]+)?\s*$/u);if(l===null)return null;let f=l[1];return{marker:f.startsWith("`")?"`":"~",length:f.length,language:l[2]||""}}function CT(u,l){let f=u.trim();return f.length>=l.length&&f.split("").every((n)=>n===l.marker)}function p9(u){return/^(?: {4}|\t)/u.test(u)}function iq(u,l,f){let n=l.trim().length>0?`language-${kT(l)}`:void 0;return wl("pre",{key:f,className:"markdown-code-block"},wl("code",{className:n},u))}function pT(u,l){let f=u[l]??"";if(f.trim().length===0)return!0;return rq(f)!==null||p9(f)||/^(#{1,6})\s+.+$/u.test(f)||/^\s*(?:---+|\*\*\*+|___+)\s*$/u.test(f)||/^\s*>\s?/u.test(f)||jq(u,l)||D4(f)!==null}function D4(u){let l=u.match(/^\s{0,3}[-*+]\s+(.+)$/u);if(l!==null)return{ordered:!1,text:l[1]};let f=u.match(/^\s{0,3}(\d+)[.)]\s+(.+)$/u);if(f!==null)return{ordered:!0,start:Number(f[1]),text:f[2]};return null}function xT(u,l){let f=u.match(/^\[([ xX])\]\s+(.+)$/u);if(f!==null){let n=f[1].toLowerCase()==="x";return wl("li",{key:l,className:"task-list-item"},wl("input",{type:"checkbox",checked:n,readOnly:!0,tabIndex:-1}),wl("span",null,Vn(f[2],`${l}-task`)))}return wl("li",{key:l},Vn(u,l))}function jq(u,l){let f=u[l]??"",n=u[l+1]??"";if(!f.includes("|")||!n.includes("|"))return!1;let y=K3(f),i=K3(n);return y.length>1&&i.length===y.length&&i.every((_)=>/^:?-{3,}:?$/u.test(_.trim()))}function K3(u){let l=u.trim();if(l.startsWith("|"))l=l.slice(1);if(l.endsWith("|"))l=l.slice(0,-1);return l.split("|").map((f)=>f.trim())}function mT(u){let l=u.trim();if(l.startsWith(":")&&l.endsWith(":"))return"center";if(l.endsWith(":"))return"right";if(l.startsWith(":"))return"left";return}function RT(u,l,f,n){let y=l.map(mT);return wl("div",{key:n,className:"markdown-table-wrap"},wl("table",null,wl("thead",null,wl("tr",null,u.map((i,_)=>wl("th",{key:`${n}-h-${_}`,style:y[_]?{textAlign:y[_]}:void 0},Vn(i,`${n}-h-${_}`))))),wl("tbody",null,f.map((i,_)=>wl("tr",{key:`${n}-r-${_}`},u.map(($,A)=>wl("td",{key:`${n}-r-${_}-${A}`,style:y[A]?{textAlign:y[A]}:void 0},Vn(i[A]||"",`${n}-r-${_}-${A}`))))))))}function Vn(u,l,f={}){let n=[],y=/`([^`\n]+)`|\[([^\]\n]+)\]\(([^)\s]+)(?:\s+"[^"]*")?\)|(https?:\/\/[^\s<>)]+)|\*\*([^*\n]+)\*\*|__([^_\n]+)__|~~([^~\n]+)~~|\*([^*\n]+)\*|_([^_\n]+)_/gu,i=f.linkify!==!1,_=0,$=0;for(let A of u.matchAll(y)){let j=A[0],J=A.index??0;Y4(n,u.slice(_,J),`${l}-text-${$}`),_=J+j.length;let Q=`${l}-inline-${$}`;if($+=1,A[1]!==void 0){n.push(wl("code",{key:Q},A[1]));continue}if(A[2]!==void 0&&A[3]!==void 0){if(!i){Y4(n,j,`${Q}-literal`);continue}n.push(_q(A[2],A[3],Q));continue}if(A[4]!==void 0){if(!i){Y4(n,j,`${Q}-literal`);continue}n.push(_q(A[4],A[4],Q));continue}let U=A[5]??A[6];if(U!==void 0){n.push(wl("strong",{key:Q},Vn(U,`${Q}-strong`)));continue}if(A[7]!==void 0){n.push(wl("del",{key:Q},Vn(A[7],`${Q}-del`)));continue}let F=A[8]??A[9];if(F!==void 0)n.push(wl("em",{key:Q},Vn(F,`${Q}-em`)))}return Y4(n,u.slice(_),`${l}-text-tail`),n}function Y4(u,l,f){if(l.length===0)return;l.split(` +`).forEach((y,i)=>{if(i>0)u.push(wl("br",{key:`${f}-br-${i}`}));if(y.length>0)u.push(y)})}function _q(u,l,f){let n=bT(l);if(n===null)return wl("span",{key:f},u);let y=/^(?:https?:|mailto:)/iu.test(n);return wl("a",{key:f,href:n,target:y?"_blank":void 0,rel:y?"noreferrer":void 0},Vn(u,`${f}-label`,{linkify:!1}))}function bT(u){let l=String(u||"").trim();if(/^(?:https?:|mailto:)/iu.test(l))return l;if(l.startsWith("/")&&!l.startsWith("//"))return l;if(l.startsWith("#"))return l;return null}function kT(u){return String(u||"").toLowerCase().replace(/[^a-z0-9_-]+/gu,"-").replace(/^-+|-+$/gu,"")||"text"}var h9=ku(ql(),1);var xu=h9.default.createElement,{useEffect:hT,useRef:Jq}=h9.default;function IT(u,l){return Tq(u.toTrace(l))}function vT(u){let l=Number(u);if(!Number.isFinite(l)||l<0)return"--";let f=Math.floor(l/1000),n=Math.floor(f/3600),y=Math.floor(f%3600/60),i=f%60;if(n>0)return`${n}h ${String(y).padStart(2,"0")}m`;if(y>0)return`${y}m ${String(i).padStart(2,"0")}s`;return`${i}s`}function $n(u){let l=Number(u);return Number.isFinite(l)&&l>=0?l:null}function G_(u,l=180){let f=String(u||"").replace(/\s+/gu," ").trim();return f.length>l?`${f.slice(0,l-1)}…`:f}function gT(u){if(!u)return 0;return u.split(/\r?\n/u).length}function R9(u){return{ran:"Ran",explored:"Explored",edited:"Edited",toolGroup:"Tool calls",plan:"Plan",message:"Message",system:"System",error:"Error"}[u]||"Message"}function b9(u){let l=Number(u||0);return Number.isFinite(l)&&l>0?`… +${Math.floor(l)} lines`:""}function sT(u){return(Array.isArray(u)?u:[]).reduce((l,f)=>Math.max(l,Number(f?.seq??0)),0)}function Qq(u){return["explored","edited","ran"].includes(String(u?.kind||""))}function zq(u){let l={read:0,edit:0,run:0};for(let f of u){let n=String(f?.kind||"");if(n==="explored")l.read+=1;else if(n==="edited")l.edit+=1;else if(n==="ran")l.run+=1}return l}function Gq(u){let l=zq(u);return`${l.read} read, ${l.edit} edit, ${l.run} run`}function wq(u){return u.replace(/^['"`([{<]+/u,"").replace(/['"`)\]}>.,;:]+$/u,"").replace(/:\d+(?::\d+)?$/u,"").trim()}function Uq(u){let f=String(u||"").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)||[],n=[];for(let y of f){let i=wq(y);if(i.length<2||i.includes("..."))continue;if(/^(http|https|status|method)$/iu.test(i))continue;if(!n.includes(i))n.push(i)}return n}function x9(u,l=4){if(u.length===0)return"--";let f=u.slice(0,l).join(", ");return u.length>l?`${f} +${u.length-l}`:f}function Nq(u){let l="";for(let f of u){if(f.length===0)continue;if(l.length>0&&!l.endsWith(` `)&&!f.startsWith(` `))l+=` -`;l+=f}return l}function wq(u){let l=String(u||"").replace(/\r\n/gu,` +`;l+=f}return l}function Zq(u){let l=String(u||"").replace(/\r\n/gu,` `).replace(/\r/gu,` `).trimEnd();return l.length>0?l.split(` -`):[]}function b9(u){let l=String(u.status||"").trim();if(l.length>0)return l;let f=String(u.bodyPreview||"");return/^(item\/[A-Za-z]+(?:\/[A-Za-z]+)?):/u.exec(f)?.[1]||"item/fileChange"}function sT(u){let l=String(u.bodyPreview||"");return/file changes status=([A-Za-z0-9_-]+)/u.exec(l)?.[1]}function aT(u){return/^item\/(?:started|completed): file changes status=/u.test(String(u||"").trim())}function Zq(u){if(String(u.kind||"")!=="edited")return!1;let l=String(u.status||""),f=String(u.title||""),n=String(u.bodyPreview||""),i=String(u.commandPreview||"");if(f==="Edited files")return!0;if(/^item\/fileChange\//u.test(l))return!0;if((l==="item/started"||l==="item/completed")&&/file changes status=/u.test(n))return!0;if(/^Success\. Updated the following files:/mu.test(n))return!0;if(/^diff --git /mu.test(n))return!0;return/^([AMDRCU?]{1,2})\s+\S+/mu.test(n)||i.length>0&&D8(n).length>0}function K_(u){return Gq(String(u||"").replace(/^[ab]\//u,"").trim())}function h9(u){let l=/^([AMDRCU?]{1,2})\s+(.+)$/u.exec(u);if(!l)return null;let f=K_(l[2]||"");return f.length>0?{status:l[1]||"M",path:f}:null}function I9(u){let l=/^\*\*\*\s+(Add|Update|Delete)\s+File:\s+(.+)$/u.exec(u);if(l){let n=l[1]==="Add"?"A":l[1]==="Delete"?"D":"M",i=K_(l[2]||"");return i.length>0?{status:n,path:i}:null}let f=/^\*\*\*\s+Move to:\s+(.+)$/u.exec(u);if(f){let n=K_(f[1]||"");return n.length>0?{status:"R",path:n}:null}return null}function D8(u){let l=[],f=(i,y)=>{let _=K_(y);if(_.length===0||_==="/dev/null")return;let $=l.find((r)=>r.path===_);if($){if($.status==="M"&&i!=="M")$.status=i;return}l.push({status:i,path:_})},n="";for(let i of wq(u)){let y=h9(i)||I9(i);if(y!==null){f(y.status,y.path),n=y.path;continue}let _=/^diff --git a\/(.+?) b\/(.+)$/u.exec(i);if(_){let Q=_[2]||_[1]||"";f("M",Q),n=K_(Q);continue}let $=/^\+\+\+ b\/(.+)$/u.exec(i);if($&&$[1]!=="/dev/null"){f("M",$[1]||""),n=K_($[1]||"");continue}if(/^new file mode /u.exec(i)&&n)f("A",n);if(/^deleted file mode /u.exec(i)&&n)f("D",n);let J=/^rename to (.+)$/u.exec(i);if(J)f("R",J[1]||"")}return l}function oT(u){if(h9(u)!==null||I9(u)!==null)return"file";if(/^(diff --git |index |--- |\+\+\+ |\*\*\* Begin Patch|\*\*\* End Patch)/u.test(u))return"meta";if(/^@@ /u.test(u))return"hunk";if(/^\+/u.test(u))return"add";if(/^-/u.test(u))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(u))return"note";return"context"}function v9(u){return wq(u).map((l)=>{let f=h9(l)||I9(l);if(f!==null)return{text:l,kind:"file",path:f.path,status:f.status};return{text:l,kind:oT(l)}})}function dT(u){return u.reduce((l,f)=>{if(f.kind==="add")l.added+=1;else if(f.kind==="del")l.removed+=1;return l},{added:0,removed:0})}function Nq(u,l){return`${l} ${u} line${u===1?"":"s"}`}function eT(u,l){let f=[];if(u>0)f.push(Nq(u,"Added"));if(l>0)f.push(Nq(l,"removed"));return f.join(", ")}function uV(u){for(let f=u.length-1;f>=0;f-=1){let n=String(u[f]?.status||"").trim();if(n.length>0)return n}let l=String(u[u.length-1]?.method||"").trim();if(l==="item/fileChange/outputDelta")return"updated";if(l==="item/started")return"started";if(l==="item/completed")return"completed";return l.replace(/^item\//u,"")||"changed"}function lV(u){return`${u} file${u===1?"":"s"}`}function Eq(u){let l=u.length>0?u:[],f=Uq(l.map((U)=>String(U.bodyPreview||""))),i=Uq(l.map((U)=>String(U.bodyPreview||"")).filter((U)=>U.trim().length>0&&!aT(U)))||f,y=D8(i||f),_=l.map((U)=>({method:b9(U),status:sT(U),at:U.at})),$=v9(i||f),r=dT($),j=eT(r.added,r.removed),J=y.length>0?lV(y.length):"",Q=j.length>0?`${j}${J?` in ${J}`:""}`:y.length>0?J:z_(i||f||"File changes",72);return{status:uV(_),summary:Q,files:y,stages:_,lines:$,addedLines:r.added,removedLines:r.removed,rawText:f}}function fV(u){let l=u[0],f=u[u.length-1]||l,n=Eq(u);return{...l,seq:Number.isFinite(Number(f?.seq))?Number(f?.seq):Number(l?.seq??0),at:f?.at||l?.at,title:n.files.length>0?`Edited ${n.summary}`:"Edited files",status:n.status,commandPreview:"",commandOmittedLines:void 0,bodyPreview:n.rawText,bodyOmittedLines:u.reduce((i,y)=>i+Number(y.bodyOmittedLines||0),0)||void 0,rawSeqs:u.flatMap((i)=>Array.isArray(i?.rawSeqs)?i.rawSeqs:[i?.seq]).filter((i)=>i!==void 0),editObservation:n}}function nV(u){let l=Array.isArray(u)?u:[],f=[],n=[],i=()=>{if(n.length===0)return;f.push(fV(n)),n=[]};for(let y of l){if(Zq(y)){if(b9(y)==="item/started"&&n.length>0)i();if(n.push(y),b9(y)==="item/completed")i();continue}i(),f.push(y)}return i(),f}function Hq(u){let l=[],f=[],n=[],i=(j,J)=>{for(let Q of J)if(!j.includes(Q))j.push(Q)};for(let j of u){let J=String(j?.kind||""),Q=[j?.commandPreview,j?.bodyPreview,j?.title].map((U)=>String(U||"")).join(` -`);if(J==="explored")i(l,Qq(Q));else if(J==="edited")i(f,Qq(Q));else if(J==="ran"){let U=String(j?.commandPreview||j?.title||"").trim();if(U.length>0&&!n.includes(U))n.push(z_(U,90))}}let y=u.map((j)=>Date.parse(String(j?.at||""))).filter((j)=>Number.isFinite(j)),_=y.length>=2?Math.max(0,Math.max(...y)-Math.min(...y)):0,$=u.reduce((j,J)=>j+(yn(J?.durationMs)??yn(J?.elapsedMs)??0),0),r=_>0?_:$;return{readFiles:l,editedFiles:f,runCommands:n,durationLabel:IT(r)}}function iV(u,l=3){let f=Array.isArray(u)?u:[],n=[],i=[],y=Math.max(0,l),_=new Set;for(let r=f.length-1;r>=0&&y>0;r-=1){let j=f[r];if(!Jq(j))continue;_.add(j),y-=1}let $=()=>{if(i.length>=2){let r=Kq(i);n.push({seq:Number(i[0]?.seq??0),at:i[0]?.at||i.at(-1)?.at,kind:"toolGroup",title:zq(i),status:`${i.length} calls`,items:i,counts:r,digest:Hq(i),rawSeqs:i.flatMap((j)=>Array.isArray(j?.rawSeqs)?j.rawSeqs:[j?.seq]).filter((j)=>j!==void 0)})}else n.push(...i);i=[]};for(let r of f){if(Jq(r)&&!_.has(r)){i.push(r);continue}$(),n.push(r)}return $(),n}function Oq(u){return(Array.isArray(u)?u:[]).map((l,f)=>({...l,seq:Number.isFinite(Number(l?.seq))?Number(l.seq):f+1,kind:String(l?.kind||"message"),at:l?.at===void 0?void 0:String(l.at),durationMs:yn(l?.durationMs)??void 0,title:l?.title===void 0?void 0:String(l.title),status:l?.status===void 0?void 0:String(l.status)}))}function K3(u){let l=yn(u?.state?.time?.start)??yn(u?.time?.start),f=yn(u?.state?.time?.end)??yn(u?.time?.end);return yn(u?.durationMs)??yn(u?.elapsedMs)??yn(u?.timing?.durationMs)??yn(u?.metadata?.durationMs)??(l!==null&&f!==null&&f>=l?f-l:null)??void 0}function z3(u,l){return u?.createdAt||u?.updatedAt||u?.completedAt||l||void 0}function m9(u,l){return u?.id||u?.messageId||l}function yV(u,l=1200){if(typeof u==="string")return u;if(u===void 0||u===null)return"";try{return z_(JSON.stringify(u),l)}catch{return z_(String(u),l)}}function Tq(u,l,f){if(typeof u?.metadata?.diff==="string"&&u.metadata.diff.length>0)return u.metadata.diff;if(typeof u?.metadata?.filediff?.patch==="string"&&u.metadata.filediff.patch.length>0)return u.metadata.filediff.patch;if(typeof u?.output==="string"&&u.output.length>0)return u.output;if(typeof u?.result==="string"&&u.result.length>0)return u.result;if(typeof l?.output==="string"&&l.output.length>0)return l.output;if(typeof f?.output==="string"&&f.output.length>0)return f.output;if(typeof u?.metadata?.output==="string"&&u.metadata.output.length>0)return u.metadata.output;return""}function t8(u,l){if(!u||typeof u!=="object"||Array.isArray(u))return"";for(let f of l){let n=u[f];if(typeof n==="string"&&n.length>0)return n;if(n!==void 0&&n!==null&&typeof n!=="object")return String(n)}return""}function Fq(u,l){if(!u||typeof u!=="object"||Array.isArray(u))return null;for(let f of l){let n=Number(u[f]);if(Number.isFinite(n))return n}return null}function Vq(u,l){let f=l?.input&&typeof l.input==="object"&&!Array.isArray(l.input)?l.input:u?.input&&typeof u.input==="object"&&!Array.isArray(u.input)?u.input:{},n=t8(f,["command","cmd","script"]);if(n.length>0)return n;if(typeof u?.command==="string"&&u.command.length>0)return u.command;if(typeof l?.command==="string"&&l.command.length>0)return l.command;let i=String(u?.tool||u?.title||"tool"),y=t8(f,["filePath","filepath","path"])||t8(u,["filePath","filepath","path"]),_=t8(f,["pattern","query"]),$=Fq(f,["offset"]),r=Fq(f,["limit"]),j=[i];if(_.length>0)j.push(_);if(y.length>0)j.push(y);if($!==null)j.push(`offset=${$}`);if(r!==null)j.push(`limit=${r}`);return j.length>1?j.join(" "):i}function _V(u,l){let f=u?.part&&typeof u.part==="object"&&!Array.isArray(u.part)?u.part:{},n=String(u?.type||u?.event||u?.name||f?.type||"").toLowerCase(),i=String(f?.type||"").toLowerCase(),y=u?.at||u?.timestamp||f?.updatedAt||f?.createdAt,_=Number.isFinite(Number(u?.seq))?Number(u.seq):l;if(n==="step_start"||n==="step-start"||i==="step-start")return null;if(n==="step_finish"||n==="step-finish"||i==="step-finish")return null;if(i==="tool"||/tool|bash|command/iu.test(`${n} ${i}`)){let r=f?.state&&typeof f.state==="object"&&!Array.isArray(f.state)?f.state:{},j=Vq(f,r),J=Tq(r,f,u),Q=Bq(j,String(f?.tool||f?.title||"")),U=Q==="edited"?{status:String(r?.status||f?.status||u?.status||""),summary:z_(J||j,72),files:D8(J),stages:[],lines:v9(J),addedLines:0,removedLines:0,rawText:J}:void 0;return{seq:_,at:z3(f,y),kind:Q,title:String(r?.title||f?.title||r?.metadata?.description||f?.tool||"OpenCode tool"),status:String(r?.status||f?.status||u?.status||""),commandPreview:j,bodyPreview:J,durationMs:K3(f),rawSeqs:[f?.id||f?.callID||u?.sessionID||_],editObservation:U}}let $=yV(f?.text??f?.content??f?.delta??u?.text??u?.content??u?.delta,3000).trim();if($.length>0)return{seq:_,at:z3(f,y),kind:i==="reasoning"?"message":/error|failed/iu.test(`${n} ${i}`)?"error":"message",title:i==="reasoning"?"Reasoning":/error|failed/iu.test(`${n} ${i}`)?"OpenCode error":"Assistant message",status:`opencode/${n||i||"event"}`,bodyPreview:$,durationMs:K3(f),rawSeqs:[f?.id||u?.sessionID||_]};return null}function Bq(u,l){let f=`${l} ${u}`.toLowerCase();if(/\b(read|grep|glob|list|ls|find|search|view|cat|sed|rg|head|tail|wc|file)\b/iu.test(f))return"explored";if(/\b(edit|write|patch|apply|update|create|delete|apply_patch|git apply|cat >|tee .*<<|sed -i|python3? .*write_text|mkdir|rm |touch )\b/iu.test(f))return"edited";return"ran"}function $V(u){let l=[],f=1;for(let n of Array.isArray(u)?u:[]){if(n?.kind&&n?.title){let $=String(n?.status||"");if($==="opencode/step-start"||$==="opencode/step-finish")continue;l.push({...n,seq:Number.isFinite(Number(n?.seq))?Number(n.seq):f++});continue}let i=n?.createdAt||n?.updatedAt||n?.completedAt,y=String(n?.role||"assistant").toLowerCase(),_=Array.isArray(n?.parts)?n.parts:[];if(_.length===0){if(n?.part&&(n?.sessionID||String(n?.type||"").startsWith("step_")||String(n?.type||"").includes("tool"))){let $=_V(n,f);if($!==null)l.push($),f=Math.max(f+1,Number($.seq)+1)}else if(n?.textPreview)l.push({seq:f++,at:i,kind:"message",title:`${y||"assistant"} message`,status:y,bodyPreview:String(n.textPreview),rawSeqs:[n?.messageId||f]});continue}for(let $ of _){let r=String($?.type||"").toLowerCase();if(r==="step-start"||r==="step-finish")continue;if(r==="text"||r==="reasoning"){let J=String($?.textPreview||n?.textPreview||"").trim();if(J.length===0)continue;l.push({seq:f++,at:z3($,i),kind:"message",title:r==="reasoning"?"Reasoning":y==="user"?"User message":y==="system"?"System message":"Assistant message",status:r==="reasoning"?"reasoning":y,bodyPreview:J,durationMs:K3($),rawSeqs:[m9($,f)]});continue}if(r==="tool"){let J=$?.state&&typeof $.state==="object"&&!Array.isArray($.state)?$.state:{},Q=Vq($,J),U=Tq(J,$,{}),F=Bq(Q,String($?.tool||$?.title||"")),N=F==="edited"?{status:String(J?.status||$?.status||""),summary:z_(U||Q,72),files:D8(U),stages:[],lines:v9(U),addedLines:0,removedLines:0,rawText:U}:void 0;l.push({seq:f++,at:z3($,i),kind:F,title:String($?.title||$?.tool||"tool"),status:String($?.status||""),commandPreview:Q,bodyPreview:U,durationMs:K3($),rawSeqs:[m9($,f)],editObservation:N});continue}let j=String($?.textPreview||$?.title||r||"").trim();if(j)l.push({seq:f++,at:z3($,i),kind:"system",title:r||"part",bodyPreview:j,status:String($?.status||""),durationMs:K3($),rawSeqs:[m9($,f)]})}}return l}var cq={source:"opencode",toTrace:$V};function rV(u){return String(u||"unknown").toLowerCase().replace(/[^a-z0-9_-]+/gu,"-")||"unknown"}function Wq(u){let l=String(u||"M").toUpperCase();if(l.startsWith("A")||l==="??")return"added";if(l.startsWith("D"))return"deleted";if(l.startsWith("R"))return"renamed";return"modified"}function AV(u){if(u==="item/fileChange/outputDelta")return"delta";return u.replace(/^item\//u,"")}function jV(u,l){if(u.kind==="file"){let i=String(u.status||"M");return mu("div",{key:`${l}-${u.text}`,className:`codex-edit-diff-line file ${Wq(i)}`},mu("span",{className:`codex-edit-file-status ${Wq(i)}`},i),mu("code",null,u.path||u.text.replace(/^([AMDRCU?]{1,2})\s+/u,"")))}let f=u.kind==="add"||u.kind==="del"?u.text.slice(0,1):u.kind==="hunk"?"@@":u.kind==="note"?"ok":"",n=u.kind==="add"||u.kind==="del"?u.text.slice(1):u.text;return mu("div",{key:`${l}-${u.text}`,className:`codex-edit-diff-line ${u.kind}`},mu("span",{className:"codex-edit-diff-sign"},f),mu("code",null,n||" "))}function JV(u,l){let f=u.lines.length>0?u.lines:u.files.map((i)=>({text:`${i.status} ${i.path}`,kind:"file",path:i.path,status:i.status})),n=Number(u.addedLines||0)+Number(u.removedLines||0)>0;return mu("div",{className:"codex-edit-observation","data-testid":"codex-edit-observation"},mu("div",{className:"codex-edit-observation-head"},mu("span",{className:"codex-edit-window-controls","aria-hidden":"true"},mu("i",null),mu("i",null),mu("i",null)),mu("strong",null,n?"git diff":"git diff --stat"),mu("code",null,u.summary||"File changes")),u.stages.length>0?mu("div",{className:"codex-edit-stage-strip"},u.stages.map((i,y)=>mu("span",{key:`${i.method}-${y}`,className:`codex-edit-stage ${rV(i.status||i.method)}`},mu("b",null,AV(i.method)),i.status?mu("em",null,i.status):null))):null,f.length>0?mu("div",{className:"codex-edit-diff",role:"list"},f.map(jV)):null,l?mu("div",{className:"codex-edit-omitted"},`${l} (查看原始JSON获取完整记录)`):null)}function qq(u,l,f){let n=R9(f);return mu("div",{className:`codex-transcript-stream ${u}`,"data-testid":`codex-trace-${u}`},mu("span",{className:"codex-transcript-stream-label"},u),mu("pre",{className:"codex-transcript-body"},l,n?` -${n} (查看原始JSON获取完整记录)`:""))}function Xq(u,l=!1){let f=String(u.kind||"message"),n=["ran","explored","edited"].includes(f),i=R9(u.commandOmittedLines),y=R9(u.bodyOmittedLines),_=String(u.commandPreview||(n?u.title||"":"")),$=String(u.stdoutPreview||""),r=String(u.stderrPreview||""),j=$.length>0||r.length>0,J=Boolean(u.foldedReferencePrompt)&&String(u.fullPrompt||"").length>0,Q=f==="edited"&&(u.editObservation!==void 0||Zq(u))?u.editObservation||Eq([u]):null;return mu("article",{key:`${u.seq}-${f}`,className:`codex-transcript-item ${f} ${l?"nested":""}`},mu("div",{className:"codex-transcript-main"},mu("div",{className:"codex-transcript-title"},mu("span",{className:"codex-output-channel"},x9(f)),n&&Q===null?null:mu("strong",null,Q!==null?"File changes":String(u.title||x9(f))),u.status?mu("code",null,String(Q?.status||u.status)):null,mu("time",null,Hu(u.at))),_&&Q===null?mu("pre",{className:"codex-transcript-command"},_,i?` -${i}`:""):null,Q!==null?JV(Q,y):j?mu("div",{className:"codex-transcript-streams"},$.length>0?qq("stdout",$,u.stdoutOmittedLines):null,r.length>0?qq("stderr",r,u.stderrOmittedLines):null):u.bodyPreview?mu("pre",{className:"codex-transcript-body"},String(u.bodyPreview),y?` -${y} (查看原始JSON获取完整记录)`:""):null,J?mu("details",{className:"codex-initial-prompt-full","data-testid":"codex-initial-prompt-full"},mu("summary",null,mu("span",null,"引用注入已折叠,点击查看最终传入 Codex 的完整 prompt"),mu("code",null,`${u.fullPromptLines||vT(String(u.fullPrompt||""))} lines / ${u.fullPromptChars||String(u.fullPrompt||"").length} chars`)),mu("pre",{className:"codex-transcript-body codex-transcript-full-prompt","data-testid":"codex-initial-prompt-full-text"},String(u.fullPrompt||""))):null))}function QV(u){let l=Array.isArray(u.items)?u.items:[],f=u.digest&&typeof u.digest==="object"?u.digest:Hq(l);return mu("article",{key:`${u.seq}-toolGroup`,className:"codex-transcript-item toolGroup"},mu("div",{className:"codex-transcript-main"},mu("details",{className:"codex-tool-group","data-testid":"codex-tool-group"},mu("summary",null,mu("div",{className:"codex-tool-group-head"},mu("span",{className:"codex-output-channel"},x9("toolGroup")),mu("strong",null,String(u.title||zq(l))),mu("code",null,String(u.status||`${l.length} calls`)),mu("time",null,Hu(u.at)))),mu("div",{className:"codex-tool-group-digest"},mu("span",null,`read: ${p9(Array.isArray(f.readFiles)?f.readFiles:[])}`),mu("span",null,`edit: ${p9(Array.isArray(f.editedFiles)?f.editedFiles:[])}`),mu("span",null,`run: ${p9(Array.isArray(f.runCommands)?f.runCommands:[],2)}`),mu("span",null,`duration: ${f.durationLabel||"--"}`)),mu("div",{className:"codex-tool-group-items"},l.map((n)=>Xq(n,!0))))))}function UV(u){let l=[u.title,u.status,u.bodyPreview,u.commandPreview,u.stderrPreview,u.stdoutPreview].map((f)=>String(f||"")).join(` -`);return/\b(error|failed|failure|interrupt|interrupted|cancell?ed|watchdog|timeout|closed|refused|aborted|exception)\b/iu.test(l)}function Yq(u,l){if(l)return u;return u.flatMap((f)=>{if(String(f.kind||"")==="system"&&!UV(f))return[];if(String(f.kind||"")!=="toolGroup"||!Array.isArray(f.items))return[f];let n=Yq(f.items,l);return[{...f,items:n}]})}var NV=16;function Lq(u){return u.scrollHeight-u.scrollTop-u.clientHeight<=NV}function S8({items:u,input:l,port:f,autoScroll:n=!1,loading:i=!1,hasDetail:y=!0,emptyText:_="等待 Trace 输出...",loadingText:$="正在加载完整 Trace...",testId:r="trace-output",className:j="codex-transcript",keepRecentToolCalls:J=3,collapseTools:Q=!0,showSystemEvents:U=!1}){let F=jq(null),N=jq(!0),L=Yq(nV(f?hT(f,l):Oq(u)),Boolean(U)),w=Q?iV(L,J):L,W=gT(L);kT(()=>{let z=F.current;if(!n||!z)return;if(!N.current&&!Lq(z))return;z.scrollTop=z.scrollHeight,N.current=!0},[n,L.length,W]);let q={className:j,ref:F,onScroll:(z)=>{let Z=z.currentTarget;N.current=Lq(Z)},"data-testid":r};if(i&&!y)return mu("div",q,mu("div",{className:"codex-output-empty"},$));return mu("div",q,w.length===0?mu("div",{className:"codex-output-empty"},_):w.map((z)=>String(z.kind||"")==="toolGroup"?QV(z):Xq(z)))}var tq=bu(Wl(),1),si=tq.default.createElement;function P8(...u){return u.filter(Boolean).join(" ")}function Dq({title:u,children:l,actions:f,onClose:n,className:i,backdropClassName:y,bodyClassName:_,actionsClassName:$,titleId:r,testId:j,closeTestId:J,closeLabel:Q="关闭",disableClose:U=!1,closeOnBackdrop:F=!0}){let N={className:P8("raw-dialog","unidesk-dialog",i),role:"dialog","aria-modal":"true"};if(r)N["aria-labelledby"]=r;else if(typeof u==="string")N["aria-label"]=u;if(j)N["data-testid"]=j;return si("div",{className:P8("modal-backdrop","unidesk-dialog-backdrop",y),role:"presentation",onClick:(L)=>{if(F&&!U&&L.target===L.currentTarget)n()}},si("section",N,si("div",{className:"raw-dialog-head unidesk-dialog-head"},si("strong",r?{id:r}:null,u),si("button",{type:"button",className:"ghost-btn",onClick:n,disabled:U,"data-testid":J},Q)),si("div",{className:P8("unidesk-dialog-body",_)},l),f?si("div",{className:P8("unidesk-dialog-actions",$)},f):null))}var G=B3.default.createElement,{useEffect:_n,useMemo:Sq,useRef:hl}=B3.default,au=B3.default.useState,FV=120,eq=12,uL=48,WV=1200;function g9(){return typeof document>"u"||document.visibilityState!=="hidden"}function Yl(u,l="操作失败"){return cu(u,l)}function rn(u){let l=Number(u);if(!Number.isFinite(l)||l<0)return"--";let f=Math.floor(l/1000),n=Math.floor(f/3600),i=Math.floor(f%3600/60),y=f%60;if(n>0)return`${n}h ${String(i).padStart(2,"0")}m`;if(i>0)return`${i}m ${String(y).padStart(2,"0")}s`;return`${y}s`}function _1(u){if(u===null||u===void 0||u==="")return null;let l=u instanceof Date?u.getTime():new Date(u).getTime();return Number.isFinite(l)?l:null}function H3(u,l=Date.now()){let f=_1(u);if(f===null)return"--";let n=Math.max(0,Math.floor((l-f)/1000));if(n<1)return"刚刚";let i=Math.floor(n/86400),y=Math.floor(n%86400/3600),_=Math.floor(n%3600/60),$=n%60;if(i>0)return`${i}天${y>0?`${y}小时`:""}前`;if(y>0)return`${y}小时${_>0?`${_}分钟`:""}前`;if(_>0)return`${_}分钟${$}秒前`;return`${$}秒前`}function r7(...u){let l="",f=-1/0;for(let n of u){let i=String(n||"");if(i.length===0)continue;let y=_1(n);if(y!==null&&y>=f)l=i,f=y;else if(l.length===0)l=i}return l}function qV(u){let l=Number(u);if(!Number.isFinite(l)||l<0)return"--";if(l<1000)return`${Math.round(l)}ms`;return`${(l/1000).toFixed(l<1e4?2:1)}s`}function T3(u,l=180){let f=String(u||"").replace(/\s+/gu," ").trim();return f.length>l?`${f.slice(0,l-1)}…`:f}async function tl(u,l={}){return Zu(u,{strictJson:!0,retryInvalidJson:1,invalidJsonPrefix:"Code Queue 返回了无效 JSON",invalidJsonPreview:!0,responsePreviewLength:WV,...l})}function uy({status:u,children:l,title:f}){let n=String(u||"unknown").toLowerCase();return G("span",{className:`status-badge ${n}`,title:f},l||u||"unknown")}function oi({title:u,eyebrow:l,summary:f,actions:n,children:i,className:y,loading:_}){return G("section",{className:`panel ${y||""}`},G("div",{className:"panel-head"},G("div",null,l?G("p",{className:"panel-eyebrow"},l):null,G(nl,{title:u,loading:_}),f?G("div",{className:"panel-summary"},f):null),n?G("div",{className:"panel-actions"},n):null),G("div",{className:"panel-body"},i))}function A7({title:u,data:l,onOpen:f,testId:n}){return G("button",{type:"button",className:"ghost-btn","data-testid":n,onClick:()=>f(u,l)},"查看原始JSON")}function T_({title:u,text:l}){return G("div",{className:"empty-state"},G("strong",null,u),G("span",null,l))}function LV(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function KV(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function Dl(u,l){return`${u}/microservices/code-queue/proxy${l}`}function zV(u){return`${u}/microservices/oa-event-flow/proxy/api/events/stream?tags=${encodeURIComponent("service:code-queue")}`}function I8(){return{headers:{"cache-control":"no-cache","x-unidesk-no-cache":"1"}}}function ml(u){return Array.isArray(u?.tasks)?u.tasks:[]}function Tn(u){return u?.pagination&&typeof u.pagination==="object"&&!Array.isArray(u.pagination)?u.pagination:{}}function Pq(u){let l=Date.parse(String(u?.updatedAt||u?.createdAt||""));return Number.isFinite(l)?l:0}function Mq(u){return _1(u?.queueEnteredAt)??_1(u?.createdAt)??_1(u?.updatedAt)??0}function GV(u,l){let f=Mq(u)-Mq(l);if(f!==0)return f;let n=(_1(u?.createdAt)??0)-(_1(l?.createdAt)??0);if(n!==0)return n;return String(u?.id||"").localeCompare(String(l?.id||""))}function wV(u,l=""){let f=new Map;for(let n of u)for(let i of n){let y=String(i?.id||"");if(y.length>0&&!f.has(y))f.set(y,i)}return Array.from(f.values()).sort((n,i)=>{let y=gq(n)-gq(i);if(y!==0)return y;let _=String(n?.id||"")===l?0:1,$=String(i?.id||"")===l?0:1;if(_!==$)return _-$;return Pq(i)-Pq(n)})}function Vn(u,l=""){let f=new Map;for(let n of u)for(let i of n){let y=String(i?.id||"");if(y.length===0)continue;f.set(y,{...f.get(y)||{},...i})}return wV([Array.from(f.values())],l)}function w_(u){return Array.isArray(u?.activeTaskIds)?u.activeTaskIds.map((l)=>String(l||"")).filter(Boolean):[String(u?.activeTaskId||"")].filter(Boolean)}function f0(u){return Array.isArray(u)?u.map((l)=>String(l||"")).filter(Boolean):[]}function G_(u,l=3){let f=f0(u);if(f.length===0)return"--";let n=f.slice(0,l).join(" / ");return f.length>l?`${n} +${f.length-l}`:n}function ZV(u,l){return ll(u?.executionDiagnostics)||ll(l?.body?.queue?.executionDiagnostics)||ll(l?.queue?.executionDiagnostics)||ll(l?.body?.executionDiagnostics)||ll(l?.executionDiagnostics)||{}}function v8(u){return Array.from(new Set([...f0(u?.heartbeatRiskTaskIds),...f0(u?.heartbeatExpiredTaskIds),...f0(u?.heartbeatMissingTaskIds),...f0(u?.staleRecoveryCandidateTaskIds)])).sort()}function j7(u){if(v8(u).length>0)return!1;if(typeof u?.splitBrainLive==="boolean")return u.splitBrainLive;let l=String(u?.state||u?.health||"").toLowerCase(),f=String(u?.effectiveLiveness||"").toLowerCase();return l==="split-brain"&&(f==="live"||f0(u?.heartbeatFreshTaskIds).length>0)}function lL(u){let l=String(u?.effectiveLiveness||"").toLowerCase();if(l)return l;if(v8(u).length>0)return"at-risk";if(j7(u))return"live";let f=String(u?.state||u?.health||"unknown").toLowerCase();return f==="healthy"?"healthy":f==="unknown"?"unknown":"degraded"}function EV(u){let l=lL(u),f=v8(u),n=String(u?.state||u?.health||"unknown").toLowerCase();if(f.length>0||l==="at-risk"||n==="stale-active")return"failed";if(j7(u))return"degraded-live";if(l==="live"||l==="degraded")return"warn";if(["dead","failed","stale","unhealthy"].includes(l))return"failed";let i=String(u?.state||u?.health||"unknown").toLowerCase();if(i==="healthy")return"ok";if(i==="split-brain")return"warn";if(i==="degraded")return"warn";return"unknown"}var y1="__all__",HV="(max-width: 760px)",OV="(min-width: 761px)";function hf(u){return!u||u===y1}function TV(){return typeof window<"u"&&window.matchMedia(HV).matches}function fL(u){return hf(u)?"":`&queueId=${encodeURIComponent(u)}`}function n7(u){return String(u||"").trim().replace(/\s+/gu," ").slice(0,200)}function VV(u){let l=n7(u);return l.length===0?"":`&search=${encodeURIComponent(l)}`}function J7(u,l=""){return`${fL(u)}${VV(l)}`}function M8(u,l){return Number(u?.counts?.[l]||0)}function Cq(u,l=""){let f=new Map;for(let i of Array.isArray(u?.queues)?u.queues:[]){let y=String(i?.id||"").trim();if(y.length>0)f.set(y,{...i,name:String(i?.name||y).trim()||y})}for(let i of[String(u?.defaultQueueId||"default"),l].map((y)=>y.trim()).filter(Boolean))if(!f.has(i))f.set(i,{id:i,name:i,total:0,counts:{},activeTaskId:null,runnableTaskId:null,processing:!1});return Array.from(f.values()).sort((i,y)=>{let _=String(i?.id||"")===String(u?.defaultQueueId||"default")?0:1,$=String(y?.id||"")===String(u?.defaultQueueId||"default")?0:1;if(_!==$)return _-$;return String(i?.id||"").localeCompare(String(y?.id||""))})}function nL(u){let l=String(u?.id||"default"),f=String(u?.name||"").trim();return f.length>0?f:l}function i7(u){let l=String(u?.id||"default"),f=nL(u);return f===l?l:`${f} (${l})`}function Z3(u){let l=M8(u,"running")+M8(u,"judging"),f=M8(u,"queued")+M8(u,"retry_wait"),n=Number(u?.total||0),i=[i7(u),`${n} tasks`];if(l>0)i.push(`${l} running`);if(f>0)i.push(`${f} queued`);return i.join(" · ")}function E_(u,l){if(hf(l))return null;return u.find((f)=>String(f?.id||"")===l)||null}function pq(u,l,f,n){if(hf(f)){let y=w_(u);return String(u?.activeTaskId||y[0]||n.find((_)=>fi(_))?.id||"")}let i=E_(l,f);return String(i?.activeTaskId||n.find((y)=>fi(y))?.id||"")}function BV(u,l,f){if(!hf(l)){let n=E_(u,l);return String(n?.runnableTaskId||f.find((i)=>String(i?.status||"")==="queued"||String(i?.status||"")==="retry_wait")?.id||"")}return String(f.find((n)=>String(n?.status||"")==="queued"||String(n?.status||"")==="retry_wait")?.id||"")}async function mq(u,l=y1,f=""){return tl(Dl(u,`/api/tasks/overview?limit=${eq}&transcriptLimit=1&compact=1&selected=0&includeActive=0&stats=0&skipTrace=1${J7(l,f)}`),I8())}async function s9(u,l,f=0,n=y1,i="",y=!1,_={}){let $=_.selected===!1?"&selected=0":"",r=_.includeActive===!1?"&includeActive=0":"",j=_.stats===!1?"&stats=0":"",J=Number.isInteger(_.limit)&&_.limit>0?Math.min(500,_.limit):eq;return tl(Dl(u,`/api/tasks/overview?limit=${encodeURIComponent(String(J))}&transcriptLimit=3&compact=1&afterSeq=${encodeURIComponent(String(Math.max(0,f)))}&preferId=${encodeURIComponent(l)}${$}${r}${j}${y?"&skipTrace=1":""}${J7(n,i)}`),I8())}async function cV(u,l=y1){return tl(Dl(u,`/api/tasks/stats?days=14${fL(l)}`),I8())}async function xq(u,l,f,n=uL,i=""){return tl(Dl(u,`/api/tasks/overview?limit=${encodeURIComponent(String(n))}&transcriptLimit=1&compact=1&selected=0&includeActive=0&stats=0&beforeId=${encodeURIComponent(f)}${J7(l,i)}`),I8())}async function XV(u,l){return tl(Dl(u,`/api/tasks/${encodeURIComponent(l)}/trace-summary`))}async function YV(u,l,f,n=null){let i=n===null||n===void 0||String(n).length===0?"":`&attempt=${encodeURIComponent(String(n))}`;return tl(Dl(u,`/api/tasks/${encodeURIComponent(l)}/prompt?part=${encodeURIComponent(f)}${i}`))}async function tV(u,l,f=0,n=500,i=null){let y=i===null||i===void 0||String(i).length===0?"":`&attempt=${encodeURIComponent(String(i))}`;return tl(Dl(u,`/api/tasks/${encodeURIComponent(l)}/trace-steps?afterSeq=${encodeURIComponent(String(f))}&limit=${encodeURIComponent(String(n))}${y}`))}async function DV(u,l,f){return tl(Dl(u,`/api/tasks/${encodeURIComponent(l)}/trace-step?seq=${encodeURIComponent(String(f))}`))}async function SV(u,l){return tl(Dl(u,`/api/tasks/${encodeURIComponent(l)}/read`),{method:"POST",body:{}})}async function PV(u){return tl(Dl(u,"/api/tasks/read-all"),{method:"POST",body:{}})}function MV(u){return Array.isArray(u?.output)?u.output:[]}function CV(u){return Array.isArray(u?.attempts)?u.attempts:[]}function a9(u){return u?.counts&&typeof u.counts==="object"&&!Array.isArray(u.counts)?u.counts:{}}function pV(u){return u.split(/^\s*---+\s*$/gmu).map((l)=>l.trim()).filter(Boolean)}function Rq(u){let l=Number(u);return Number.isFinite(l)?Math.max(1,Math.min(50,Math.floor(l))):1}function ai(u){let l=[];for(let f of u.split(/[\s,,;;]+/u)){let n=f.trim();if(/^codex_\d+_[A-Za-z0-9_-]+$/u.test(n)&&!l.includes(n))l.push(n)}return l}function mV(u,l){let f=ai(l);if(f.length===0)return u;return[`引用 Code Queue 任务 ${f.join(" ")}。后端会在入队时只注入这些任务的 initial prompt 和 final response 全文;中间执行过程不注入,如需补充核查可运行:${f.map((n)=>`bun scripts/cli.ts codex task ${n}`).join(";")}`,"","本次任务:",u].join(` -`)}function xV(u){let n=u.trimStart();if(!n.startsWith("# Code Queue 已解析引用上下文"))return{hasInjection:!1,reference:"",userPrompt:u};let i=u.length-n.length,y=u.lastIndexOf(` +`):[]}function k9(u){let l=String(u.status||"").trim();if(l.length>0)return l;let f=String(u.bodyPreview||"");return/^(item\/[A-Za-z]+(?:\/[A-Za-z]+)?):/u.exec(f)?.[1]||"item/fileChange"}function aT(u){let l=String(u.bodyPreview||"");return/file changes status=([A-Za-z0-9_-]+)/u.exec(l)?.[1]}function oT(u){return/^item\/(?:started|completed): file changes status=/u.test(String(u||"").trim())}function Eq(u){if(String(u.kind||"")!=="edited")return!1;let l=String(u.status||""),f=String(u.title||""),n=String(u.bodyPreview||""),y=String(u.commandPreview||"");if(f==="Edited files")return!0;if(/^item\/fileChange\//u.test(l))return!0;if((l==="item/started"||l==="item/completed")&&/file changes status=/u.test(n))return!0;if(/^Success\. Updated the following files:/mu.test(n))return!0;if(/^diff --git /mu.test(n))return!0;return/^([AMDRCU?]{1,2})\s+\S+/mu.test(n)||y.length>0&&S4(n).length>0}function z_(u){return wq(String(u||"").replace(/^[ab]\//u,"").trim())}function I9(u){let l=/^([AMDRCU?]{1,2})\s+(.+)$/u.exec(u);if(!l)return null;let f=z_(l[2]||"");return f.length>0?{status:l[1]||"M",path:f}:null}function v9(u){let l=/^\*\*\*\s+(Add|Update|Delete)\s+File:\s+(.+)$/u.exec(u);if(l){let n=l[1]==="Add"?"A":l[1]==="Delete"?"D":"M",y=z_(l[2]||"");return y.length>0?{status:n,path:y}:null}let f=/^\*\*\*\s+Move to:\s+(.+)$/u.exec(u);if(f){let n=z_(f[1]||"");return n.length>0?{status:"R",path:n}:null}return null}function S4(u){let l=[],f=(y,i)=>{let _=z_(i);if(_.length===0||_==="/dev/null")return;let $=l.find((A)=>A.path===_);if($){if($.status==="M"&&y!=="M")$.status=y;return}l.push({status:y,path:_})},n="";for(let y of Zq(u)){let i=I9(y)||v9(y);if(i!==null){f(i.status,i.path),n=i.path;continue}let _=/^diff --git a\/(.+?) b\/(.+)$/u.exec(y);if(_){let Q=_[2]||_[1]||"";f("M",Q),n=z_(Q);continue}let $=/^\+\+\+ b\/(.+)$/u.exec(y);if($&&$[1]!=="/dev/null"){f("M",$[1]||""),n=z_($[1]||"");continue}if(/^new file mode /u.exec(y)&&n)f("A",n);if(/^deleted file mode /u.exec(y)&&n)f("D",n);let J=/^rename to (.+)$/u.exec(y);if(J)f("R",J[1]||"")}return l}function dT(u){if(I9(u)!==null||v9(u)!==null)return"file";if(/^(diff --git |index |--- |\+\+\+ |\*\*\* Begin Patch|\*\*\* End Patch)/u.test(u))return"meta";if(/^@@ /u.test(u))return"hunk";if(/^\+/u.test(u))return"add";if(/^-/u.test(u))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(u))return"note";return"context"}function g9(u){return Zq(u).map((l)=>{let f=I9(l)||v9(l);if(f!==null)return{text:l,kind:"file",path:f.path,status:f.status};return{text:l,kind:dT(l)}})}function eT(u){return u.reduce((l,f)=>{if(f.kind==="add")l.added+=1;else if(f.kind==="del")l.removed+=1;return l},{added:0,removed:0})}function Fq(u,l){return`${l} ${u} line${u===1?"":"s"}`}function uV(u,l){let f=[];if(u>0)f.push(Fq(u,"Added"));if(l>0)f.push(Fq(l,"removed"));return f.join(", ")}function lV(u){for(let f=u.length-1;f>=0;f-=1){let n=String(u[f]?.status||"").trim();if(n.length>0)return n}let l=String(u[u.length-1]?.method||"").trim();if(l==="item/fileChange/outputDelta")return"updated";if(l==="item/started")return"started";if(l==="item/completed")return"completed";return l.replace(/^item\//u,"")||"changed"}function fV(u){return`${u} file${u===1?"":"s"}`}function Hq(u){let l=u.length>0?u:[],f=Nq(l.map((U)=>String(U.bodyPreview||""))),y=Nq(l.map((U)=>String(U.bodyPreview||"")).filter((U)=>U.trim().length>0&&!oT(U)))||f,i=S4(y||f),_=l.map((U)=>({method:k9(U),status:aT(U),at:U.at})),$=g9(y||f),A=eT($),j=uV(A.added,A.removed),J=i.length>0?fV(i.length):"",Q=j.length>0?`${j}${J?` in ${J}`:""}`:i.length>0?J:G_(y||f||"File changes",72);return{status:lV(_),summary:Q,files:i,stages:_,lines:$,addedLines:A.added,removedLines:A.removed,rawText:f}}function nV(u){let l=u[0],f=u[u.length-1]||l,n=Hq(u);return{...l,seq:Number.isFinite(Number(f?.seq))?Number(f?.seq):Number(l?.seq??0),at:f?.at||l?.at,title:n.files.length>0?`Edited ${n.summary}`:"Edited files",status:n.status,commandPreview:"",commandOmittedLines:void 0,bodyPreview:n.rawText,bodyOmittedLines:u.reduce((y,i)=>y+Number(i.bodyOmittedLines||0),0)||void 0,rawSeqs:u.flatMap((y)=>Array.isArray(y?.rawSeqs)?y.rawSeqs:[y?.seq]).filter((y)=>y!==void 0),editObservation:n}}function yV(u){let l=Array.isArray(u)?u:[],f=[],n=[],y=()=>{if(n.length===0)return;f.push(nV(n)),n=[]};for(let i of l){if(Eq(i)){if(k9(i)==="item/started"&&n.length>0)y();if(n.push(i),k9(i)==="item/completed")y();continue}y(),f.push(i)}return y(),f}function Oq(u){let l=[],f=[],n=[],y=(j,J)=>{for(let Q of J)if(!j.includes(Q))j.push(Q)};for(let j of u){let J=String(j?.kind||""),Q=[j?.commandPreview,j?.bodyPreview,j?.title].map((U)=>String(U||"")).join(` +`);if(J==="explored")y(l,Uq(Q));else if(J==="edited")y(f,Uq(Q));else if(J==="ran"){let U=String(j?.commandPreview||j?.title||"").trim();if(U.length>0&&!n.includes(U))n.push(G_(U,90))}}let i=u.map((j)=>Date.parse(String(j?.at||""))).filter((j)=>Number.isFinite(j)),_=i.length>=2?Math.max(0,Math.max(...i)-Math.min(...i)):0,$=u.reduce((j,J)=>j+($n(J?.durationMs)??$n(J?.elapsedMs)??0),0),A=_>0?_:$;return{readFiles:l,editedFiles:f,runCommands:n,durationLabel:vT(A)}}function iV(u,l=3){let f=Array.isArray(u)?u:[],n=[],y=[],i=Math.max(0,l),_=new Set;for(let A=f.length-1;A>=0&&i>0;A-=1){let j=f[A];if(!Qq(j))continue;_.add(j),i-=1}let $=()=>{if(y.length>=2){let A=zq(y);n.push({seq:Number(y[0]?.seq??0),at:y[0]?.at||y.at(-1)?.at,kind:"toolGroup",title:Gq(y),status:`${y.length} calls`,items:y,counts:A,digest:Oq(y),rawSeqs:y.flatMap((j)=>Array.isArray(j?.rawSeqs)?j.rawSeqs:[j?.seq]).filter((j)=>j!==void 0)})}else n.push(...y);y=[]};for(let A of f){if(Qq(A)&&!_.has(A)){y.push(A);continue}$(),n.push(A)}return $(),n}function Tq(u){return(Array.isArray(u)?u:[]).map((l,f)=>({...l,seq:Number.isFinite(Number(l?.seq))?Number(l.seq):f+1,kind:String(l?.kind||"message"),at:l?.at===void 0?void 0:String(l.at),durationMs:$n(l?.durationMs)??void 0,title:l?.title===void 0?void 0:String(l.title),status:l?.status===void 0?void 0:String(l.status)}))}function z3(u){let l=$n(u?.state?.time?.start)??$n(u?.time?.start),f=$n(u?.state?.time?.end)??$n(u?.time?.end);return $n(u?.durationMs)??$n(u?.elapsedMs)??$n(u?.timing?.durationMs)??$n(u?.metadata?.durationMs)??(l!==null&&f!==null&&f>=l?f-l:null)??void 0}function G3(u,l){return u?.createdAt||u?.updatedAt||u?.completedAt||l||void 0}function m9(u,l){return u?.id||u?.messageId||l}function _V(u,l=1200){if(typeof u==="string")return u;if(u===void 0||u===null)return"";try{return G_(JSON.stringify(u),l)}catch{return G_(String(u),l)}}function Vq(u,l,f){if(typeof u?.metadata?.diff==="string"&&u.metadata.diff.length>0)return u.metadata.diff;if(typeof u?.metadata?.filediff?.patch==="string"&&u.metadata.filediff.patch.length>0)return u.metadata.filediff.patch;if(typeof u?.output==="string"&&u.output.length>0)return u.output;if(typeof u?.result==="string"&&u.result.length>0)return u.result;if(typeof l?.output==="string"&&l.output.length>0)return l.output;if(typeof f?.output==="string"&&f.output.length>0)return f.output;if(typeof u?.metadata?.output==="string"&&u.metadata.output.length>0)return u.metadata.output;return""}function t4(u,l){if(!u||typeof u!=="object"||Array.isArray(u))return"";for(let f of l){let n=u[f];if(typeof n==="string"&&n.length>0)return n;if(n!==void 0&&n!==null&&typeof n!=="object")return String(n)}return""}function Wq(u,l){if(!u||typeof u!=="object"||Array.isArray(u))return null;for(let f of l){let n=Number(u[f]);if(Number.isFinite(n))return n}return null}function Bq(u,l){let f=l?.input&&typeof l.input==="object"&&!Array.isArray(l.input)?l.input:u?.input&&typeof u.input==="object"&&!Array.isArray(u.input)?u.input:{},n=t4(f,["command","cmd","script"]);if(n.length>0)return n;if(typeof u?.command==="string"&&u.command.length>0)return u.command;if(typeof l?.command==="string"&&l.command.length>0)return l.command;let y=String(u?.tool||u?.title||"tool"),i=t4(f,["filePath","filepath","path"])||t4(u,["filePath","filepath","path"]),_=t4(f,["pattern","query"]),$=Wq(f,["offset"]),A=Wq(f,["limit"]),j=[y];if(_.length>0)j.push(_);if(i.length>0)j.push(i);if($!==null)j.push(`offset=${$}`);if(A!==null)j.push(`limit=${A}`);return j.length>1?j.join(" "):y}function $V(u,l){let f=u?.part&&typeof u.part==="object"&&!Array.isArray(u.part)?u.part:{},n=String(u?.type||u?.event||u?.name||f?.type||"").toLowerCase(),y=String(f?.type||"").toLowerCase(),i=u?.at||u?.timestamp||f?.updatedAt||f?.createdAt,_=Number.isFinite(Number(u?.seq))?Number(u.seq):l;if(n==="step_start"||n==="step-start"||y==="step-start")return null;if(n==="step_finish"||n==="step-finish"||y==="step-finish")return null;if(y==="tool"||/tool|bash|command/iu.test(`${n} ${y}`)){let A=f?.state&&typeof f.state==="object"&&!Array.isArray(f.state)?f.state:{},j=Bq(f,A),J=Vq(A,f,u),Q=Xq(j,String(f?.tool||f?.title||"")),U=Q==="edited"?{status:String(A?.status||f?.status||u?.status||""),summary:G_(J||j,72),files:S4(J),stages:[],lines:g9(J),addedLines:0,removedLines:0,rawText:J}:void 0;return{seq:_,at:G3(f,i),kind:Q,title:String(A?.title||f?.title||A?.metadata?.description||f?.tool||"OpenCode tool"),status:String(A?.status||f?.status||u?.status||""),commandPreview:j,bodyPreview:J,durationMs:z3(f),rawSeqs:[f?.id||f?.callID||u?.sessionID||_],editObservation:U}}let $=_V(f?.text??f?.content??f?.delta??u?.text??u?.content??u?.delta,3000).trim();if($.length>0)return{seq:_,at:G3(f,i),kind:y==="reasoning"?"message":/error|failed/iu.test(`${n} ${y}`)?"error":"message",title:y==="reasoning"?"Reasoning":/error|failed/iu.test(`${n} ${y}`)?"OpenCode error":"Assistant message",status:`opencode/${n||y||"event"}`,bodyPreview:$,durationMs:z3(f),rawSeqs:[f?.id||u?.sessionID||_]};return null}function Xq(u,l){let f=`${l} ${u}`.toLowerCase();if(/\b(read|grep|glob|list|ls|find|search|view|cat|sed|rg|head|tail|wc|file)\b/iu.test(f))return"explored";if(/\b(edit|write|patch|apply|update|create|delete|apply_patch|git apply|cat >|tee .*<<|sed -i|python3? .*write_text|mkdir|rm |touch )\b/iu.test(f))return"edited";return"ran"}function AV(u){let l=[],f=1;for(let n of Array.isArray(u)?u:[]){if(n?.kind&&n?.title){let $=String(n?.status||"");if($==="opencode/step-start"||$==="opencode/step-finish")continue;l.push({...n,seq:Number.isFinite(Number(n?.seq))?Number(n.seq):f++});continue}let y=n?.createdAt||n?.updatedAt||n?.completedAt,i=String(n?.role||"assistant").toLowerCase(),_=Array.isArray(n?.parts)?n.parts:[];if(_.length===0){if(n?.part&&(n?.sessionID||String(n?.type||"").startsWith("step_")||String(n?.type||"").includes("tool"))){let $=$V(n,f);if($!==null)l.push($),f=Math.max(f+1,Number($.seq)+1)}else if(n?.textPreview)l.push({seq:f++,at:y,kind:"message",title:`${i||"assistant"} message`,status:i,bodyPreview:String(n.textPreview),rawSeqs:[n?.messageId||f]});continue}for(let $ of _){let A=String($?.type||"").toLowerCase();if(A==="step-start"||A==="step-finish")continue;if(A==="text"||A==="reasoning"){let J=String($?.textPreview||n?.textPreview||"").trim();if(J.length===0)continue;l.push({seq:f++,at:G3($,y),kind:"message",title:A==="reasoning"?"Reasoning":i==="user"?"User message":i==="system"?"System message":"Assistant message",status:A==="reasoning"?"reasoning":i,bodyPreview:J,durationMs:z3($),rawSeqs:[m9($,f)]});continue}if(A==="tool"){let J=$?.state&&typeof $.state==="object"&&!Array.isArray($.state)?$.state:{},Q=Bq($,J),U=Vq(J,$,{}),F=Xq(Q,String($?.tool||$?.title||"")),N=F==="edited"?{status:String(J?.status||$?.status||""),summary:G_(U||Q,72),files:S4(U),stages:[],lines:g9(U),addedLines:0,removedLines:0,rawText:U}:void 0;l.push({seq:f++,at:G3($,y),kind:F,title:String($?.title||$?.tool||"tool"),status:String($?.status||""),commandPreview:Q,bodyPreview:U,durationMs:z3($),rawSeqs:[m9($,f)],editObservation:N});continue}let j=String($?.textPreview||$?.title||A||"").trim();if(j)l.push({seq:f++,at:G3($,y),kind:"system",title:A||"part",bodyPreview:j,status:String($?.status||""),durationMs:z3($),rawSeqs:[m9($,f)]})}}return l}var cq={source:"opencode",toTrace:AV};function rV(u){return String(u||"unknown").toLowerCase().replace(/[^a-z0-9_-]+/gu,"-")||"unknown"}function qq(u){let l=String(u||"M").toUpperCase();if(l.startsWith("A")||l==="??")return"added";if(l.startsWith("D"))return"deleted";if(l.startsWith("R"))return"renamed";return"modified"}function jV(u){if(u==="item/fileChange/outputDelta")return"delta";return u.replace(/^item\//u,"")}function JV(u,l){if(u.kind==="file"){let y=String(u.status||"M");return xu("div",{key:`${l}-${u.text}`,className:`codex-edit-diff-line file ${qq(y)}`},xu("span",{className:`codex-edit-file-status ${qq(y)}`},y),xu("code",null,u.path||u.text.replace(/^([AMDRCU?]{1,2})\s+/u,"")))}let f=u.kind==="add"||u.kind==="del"?u.text.slice(0,1):u.kind==="hunk"?"@@":u.kind==="note"?"ok":"",n=u.kind==="add"||u.kind==="del"?u.text.slice(1):u.text;return xu("div",{key:`${l}-${u.text}`,className:`codex-edit-diff-line ${u.kind}`},xu("span",{className:"codex-edit-diff-sign"},f),xu("code",null,n||" "))}function QV(u,l){let f=u.lines.length>0?u.lines:u.files.map((y)=>({text:`${y.status} ${y.path}`,kind:"file",path:y.path,status:y.status})),n=Number(u.addedLines||0)+Number(u.removedLines||0)>0;return xu("div",{className:"codex-edit-observation","data-testid":"codex-edit-observation"},xu("div",{className:"codex-edit-observation-head"},xu("span",{className:"codex-edit-window-controls","aria-hidden":"true"},xu("i",null),xu("i",null),xu("i",null)),xu("strong",null,n?"git diff":"git diff --stat"),xu("code",null,u.summary||"File changes")),u.stages.length>0?xu("div",{className:"codex-edit-stage-strip"},u.stages.map((y,i)=>xu("span",{key:`${y.method}-${i}`,className:`codex-edit-stage ${rV(y.status||y.method)}`},xu("b",null,jV(y.method)),y.status?xu("em",null,y.status):null))):null,f.length>0?xu("div",{className:"codex-edit-diff",role:"list"},f.map(JV)):null,l?xu("div",{className:"codex-edit-omitted"},`${l} (查看原始JSON获取完整记录)`):null)}function Lq(u,l,f){let n=b9(f);return xu("div",{className:`codex-transcript-stream ${u}`,"data-testid":`codex-trace-${u}`},xu("span",{className:"codex-transcript-stream-label"},u),xu("pre",{className:"codex-transcript-body"},l,n?` +${n} (查看原始JSON获取完整记录)`:""))}function Yq(u,l=!1){let f=String(u.kind||"message"),n=["ran","explored","edited"].includes(f),y=b9(u.commandOmittedLines),i=b9(u.bodyOmittedLines),_=String(u.commandPreview||(n?u.title||"":"")),$=String(u.stdoutPreview||""),A=String(u.stderrPreview||""),j=$.length>0||A.length>0,J=Boolean(u.foldedReferencePrompt)&&String(u.fullPrompt||"").length>0,Q=f==="edited"&&(u.editObservation!==void 0||Eq(u))?u.editObservation||Hq([u]):null;return xu("article",{key:`${u.seq}-${f}`,className:`codex-transcript-item ${f} ${l?"nested":""}`},xu("div",{className:"codex-transcript-main"},xu("div",{className:"codex-transcript-title"},xu("span",{className:"codex-output-channel"},R9(f)),n&&Q===null?null:xu("strong",null,Q!==null?"File changes":String(u.title||R9(f))),u.status?xu("code",null,String(Q?.status||u.status)):null,xu("time",null,Zu(u.at))),_&&Q===null?xu("pre",{className:"codex-transcript-command"},_,y?` +${y}`:""):null,Q!==null?QV(Q,i):j?xu("div",{className:"codex-transcript-streams"},$.length>0?Lq("stdout",$,u.stdoutOmittedLines):null,A.length>0?Lq("stderr",A,u.stderrOmittedLines):null):u.bodyPreview?xu("pre",{className:"codex-transcript-body"},String(u.bodyPreview),i?` +${i} (查看原始JSON获取完整记录)`:""):null,J?xu("details",{className:"codex-initial-prompt-full","data-testid":"codex-initial-prompt-full"},xu("summary",null,xu("span",null,"引用注入已折叠,点击查看最终传入 Codex 的完整 prompt"),xu("code",null,`${u.fullPromptLines||gT(String(u.fullPrompt||""))} lines / ${u.fullPromptChars||String(u.fullPrompt||"").length} chars`)),xu("pre",{className:"codex-transcript-body codex-transcript-full-prompt","data-testid":"codex-initial-prompt-full-text"},String(u.fullPrompt||""))):null))}function UV(u){let l=Array.isArray(u.items)?u.items:[],f=u.digest&&typeof u.digest==="object"?u.digest:Oq(l);return xu("article",{key:`${u.seq}-toolGroup`,className:"codex-transcript-item toolGroup"},xu("div",{className:"codex-transcript-main"},xu("details",{className:"codex-tool-group","data-testid":"codex-tool-group"},xu("summary",null,xu("div",{className:"codex-tool-group-head"},xu("span",{className:"codex-output-channel"},R9("toolGroup")),xu("strong",null,String(u.title||Gq(l))),xu("code",null,String(u.status||`${l.length} calls`)),xu("time",null,Zu(u.at)))),xu("div",{className:"codex-tool-group-digest"},xu("span",null,`read: ${x9(Array.isArray(f.readFiles)?f.readFiles:[])}`),xu("span",null,`edit: ${x9(Array.isArray(f.editedFiles)?f.editedFiles:[])}`),xu("span",null,`run: ${x9(Array.isArray(f.runCommands)?f.runCommands:[],2)}`),xu("span",null,`duration: ${f.durationLabel||"--"}`)),xu("div",{className:"codex-tool-group-items"},l.map((n)=>Yq(n,!0))))))}function NV(u){let l=[u.title,u.status,u.bodyPreview,u.commandPreview,u.stderrPreview,u.stdoutPreview].map((f)=>String(f||"")).join(` +`);return/\b(error|failed|failure|interrupt|interrupted|cancell?ed|watchdog|timeout|closed|refused|aborted|exception)\b/iu.test(l)}function Dq(u,l){if(l)return u;return u.flatMap((f)=>{if(String(f.kind||"")==="system"&&!NV(f))return[];if(String(f.kind||"")!=="toolGroup"||!Array.isArray(f.items))return[f];let n=Dq(f.items,l);return[{...f,items:n}]})}var FV=16;function Kq(u){return u.scrollHeight-u.scrollTop-u.clientHeight<=FV}function P4({items:u,input:l,port:f,autoScroll:n=!1,loading:y=!1,hasDetail:i=!0,emptyText:_="等待 Trace 输出...",loadingText:$="正在加载完整 Trace...",testId:A="trace-output",className:j="codex-transcript",keepRecentToolCalls:J=3,collapseTools:Q=!0,showSystemEvents:U=!1}){let F=Jq(null),N=Jq(!0),K=Dq(yV(f?IT(f,l):Tq(u)),Boolean(U)),G=Q?iV(K,J):K,W=sT(K);hT(()=>{let z=F.current;if(!n||!z)return;if(!N.current&&!Kq(z))return;z.scrollTop=z.scrollHeight,N.current=!0},[n,K.length,W]);let q={className:j,ref:F,onScroll:(z)=>{let Z=z.currentTarget;N.current=Kq(Z)},"data-testid":A};if(y&&!i)return xu("div",q,xu("div",{className:"codex-output-empty"},$));return xu("div",q,G.length===0?xu("div",{className:"codex-output-empty"},_):G.map((z)=>String(z.kind||"")==="toolGroup"?UV(z):Yq(z)))}var tq=ku(ql(),1),ay=tq.default.createElement;function M4(...u){return u.filter(Boolean).join(" ")}function Sq({title:u,children:l,actions:f,onClose:n,className:y,backdropClassName:i,bodyClassName:_,actionsClassName:$,titleId:A,testId:j,closeTestId:J,closeLabel:Q="关闭",disableClose:U=!1,closeOnBackdrop:F=!0}){let N={className:M4("raw-dialog","unidesk-dialog",y),role:"dialog","aria-modal":"true"};if(A)N["aria-labelledby"]=A;else if(typeof u==="string")N["aria-label"]=u;if(j)N["data-testid"]=j;return ay("div",{className:M4("modal-backdrop","unidesk-dialog-backdrop",i),role:"presentation",onClick:(K)=>{if(F&&!U&&K.target===K.currentTarget)n()}},ay("section",N,ay("div",{className:"raw-dialog-head unidesk-dialog-head"},ay("strong",A?{id:A}:null,u),ay("button",{type:"button",className:"ghost-btn",onClick:n,disabled:U,"data-testid":J},Q)),ay("div",{className:M4("unidesk-dialog-body",_)},l),f?ay("div",{className:M4("unidesk-dialog-actions",$)},f):null))}var w=X3.default.createElement,{useEffect:An,useMemo:Pq,useRef:Il}=X3.default,au=X3.default.useState,WV=120,uL=12,lL=48,qV=1200;function s9(){return typeof document>"u"||document.visibilityState!=="hidden"}function Dl(u,l="操作失败"){return Xu(u,l)}function jn(u){let l=Number(u);if(!Number.isFinite(l)||l<0)return"--";let f=Math.floor(l/1000),n=Math.floor(f/3600),y=Math.floor(f%3600/60),i=f%60;if(n>0)return`${n}h ${String(y).padStart(2,"0")}m`;if(y>0)return`${y}m ${String(i).padStart(2,"0")}s`;return`${i}s`}function $1(u){if(u===null||u===void 0||u==="")return null;let l=u instanceof Date?u.getTime():new Date(u).getTime();return Number.isFinite(l)?l:null}function O3(u,l=Date.now()){let f=$1(u);if(f===null)return"--";let n=Math.max(0,Math.floor((l-f)/1000));if(n<1)return"刚刚";let y=Math.floor(n/86400),i=Math.floor(n%86400/3600),_=Math.floor(n%3600/60),$=n%60;if(y>0)return`${y}天${i>0?`${i}小时`:""}前`;if(i>0)return`${i}小时${_>0?`${_}分钟`:""}前`;if(_>0)return`${_}分钟${$}秒前`;return`${$}秒前`}function r7(...u){let l="",f=-1/0;for(let n of u){let y=String(n||"");if(y.length===0)continue;let i=$1(n);if(i!==null&&i>=f)l=y,f=i;else if(l.length===0)l=y}return l}function LV(u){let l=Number(u);if(!Number.isFinite(l)||l<0)return"--";if(l<1000)return`${Math.round(l)}ms`;return`${(l/1000).toFixed(l<1e4?2:1)}s`}function V3(u,l=180){let f=String(u||"").replace(/\s+/gu," ").trim();return f.length>l?`${f.slice(0,l-1)}…`:f}async function tl(u,l={}){return Eu(u,{strictJson:!0,retryInvalidJson:1,invalidJsonPrefix:"Code Queue 返回了无效 JSON",invalidJsonPreview:!0,responsePreviewLength:qV,...l})}function li({status:u,children:l,title:f}){let n=String(u||"unknown").toLowerCase();return w("span",{className:`status-badge ${n}`,title:f},l||u||"unknown")}function dy({title:u,eyebrow:l,summary:f,actions:n,children:y,className:i,loading:_}){return w("section",{className:`panel ${i||""}`},w("div",{className:"panel-head"},w("div",null,l?w("p",{className:"panel-eyebrow"},l):null,w(nl,{title:u,loading:_}),f?w("div",{className:"panel-summary"},f):null),n?w("div",{className:"panel-actions"},n):null),w("div",{className:"panel-body"},y))}function j7({title:u,data:l,onOpen:f,testId:n}){return w("button",{type:"button",className:"ghost-btn","data-testid":n,onClick:()=>f(u,l)},"查看原始JSON")}function V_({title:u,text:l}){return w("div",{className:"empty-state"},w("strong",null,u),w("span",null,l))}function KV(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function zV(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function Sl(u,l){return`${u}/microservices/code-queue/proxy${l}`}function GV(u){return`${u}/microservices/oa-event-flow/proxy/api/events/stream?tags=${encodeURIComponent("service:code-queue")}`}function v4(){return{headers:{"cache-control":"no-cache","x-unidesk-no-cache":"1"}}}function ml(u){return Array.isArray(u?.tasks)?u.tasks:[]}function Bn(u){return u?.pagination&&typeof u.pagination==="object"&&!Array.isArray(u.pagination)?u.pagination:{}}function Mq(u){let l=Date.parse(String(u?.updatedAt||u?.createdAt||""));return Number.isFinite(l)?l:0}function Cq(u){return $1(u?.queueEnteredAt)??$1(u?.createdAt)??$1(u?.updatedAt)??0}function wV(u,l){let f=Cq(u)-Cq(l);if(f!==0)return f;let n=($1(u?.createdAt)??0)-($1(l?.createdAt)??0);if(n!==0)return n;return String(u?.id||"").localeCompare(String(l?.id||""))}function ZV(u,l=""){let f=new Map;for(let n of u)for(let y of n){let i=String(y?.id||"");if(i.length>0&&!f.has(i))f.set(i,y)}return Array.from(f.values()).sort((n,y)=>{let i=sq(n)-sq(y);if(i!==0)return i;let _=String(n?.id||"")===l?0:1,$=String(y?.id||"")===l?0:1;if(_!==$)return _-$;return Mq(y)-Mq(n)})}function Xn(u,l=""){let f=new Map;for(let n of u)for(let y of n){let i=String(y?.id||"");if(i.length===0)continue;f.set(i,{...f.get(i)||{},...y})}return ZV([Array.from(f.values())],l)}function Z_(u){return Array.isArray(u?.activeTaskIds)?u.activeTaskIds.map((l)=>String(l||"")).filter(Boolean):[String(u?.activeTaskId||"")].filter(Boolean)}function n0(u){return Array.isArray(u)?u.map((l)=>String(l||"")).filter(Boolean):[]}function w_(u,l=3){let f=n0(u);if(f.length===0)return"--";let n=f.slice(0,l).join(" / ");return f.length>l?`${n} +${f.length-l}`:n}function EV(u,l){return ll(u?.executionDiagnostics)||ll(l?.body?.queue?.executionDiagnostics)||ll(l?.queue?.executionDiagnostics)||ll(l?.body?.executionDiagnostics)||ll(l?.executionDiagnostics)||{}}function g4(u){return Array.from(new Set([...n0(u?.heartbeatRiskTaskIds),...n0(u?.heartbeatExpiredTaskIds),...n0(u?.heartbeatMissingTaskIds),...n0(u?.staleRecoveryCandidateTaskIds)])).sort()}function J7(u){if(g4(u).length>0)return!1;if(typeof u?.splitBrainLive==="boolean")return u.splitBrainLive;let l=String(u?.state||u?.health||"").toLowerCase(),f=String(u?.effectiveLiveness||"").toLowerCase();return l==="split-brain"&&(f==="live"||n0(u?.heartbeatFreshTaskIds).length>0)}function fL(u){let l=String(u?.effectiveLiveness||"").toLowerCase();if(l)return l;if(g4(u).length>0)return"at-risk";if(J7(u))return"live";let f=String(u?.state||u?.health||"unknown").toLowerCase();return f==="healthy"?"healthy":f==="unknown"?"unknown":"degraded"}function HV(u){let l=fL(u),f=g4(u),n=String(u?.state||u?.health||"unknown").toLowerCase();if(f.length>0||l==="at-risk"||n==="stale-active")return"failed";if(J7(u))return"degraded-live";if(l==="live"||l==="degraded")return"warn";if(["dead","failed","stale","unhealthy"].includes(l))return"failed";let y=String(u?.state||u?.health||"unknown").toLowerCase();if(y==="healthy")return"ok";if(y==="split-brain")return"warn";if(y==="degraded")return"warn";return"unknown"}var _1="__all__",OV="(max-width: 760px)",TV="(min-width: 761px)";function If(u){return!u||u===_1}function VV(){return typeof window<"u"&&window.matchMedia(OV).matches}function nL(u){return If(u)?"":`&queueId=${encodeURIComponent(u)}`}function y7(u){return String(u||"").trim().replace(/\s+/gu," ").slice(0,200)}function BV(u){let l=y7(u);return l.length===0?"":`&search=${encodeURIComponent(l)}`}function Q7(u,l=""){return`${nL(u)}${BV(l)}`}function C4(u,l){return Number(u?.counts?.[l]||0)}function pq(u,l=""){let f=new Map;for(let y of Array.isArray(u?.queues)?u.queues:[]){let i=String(y?.id||"").trim();if(i.length>0)f.set(i,{...y,name:String(y?.name||i).trim()||i})}for(let y of[String(u?.defaultQueueId||"default"),l].map((i)=>i.trim()).filter(Boolean))if(!f.has(y))f.set(y,{id:y,name:y,total:0,counts:{},activeTaskId:null,runnableTaskId:null,processing:!1});return Array.from(f.values()).sort((y,i)=>{let _=String(y?.id||"")===String(u?.defaultQueueId||"default")?0:1,$=String(i?.id||"")===String(u?.defaultQueueId||"default")?0:1;if(_!==$)return _-$;return String(y?.id||"").localeCompare(String(i?.id||""))})}function yL(u){let l=String(u?.id||"default"),f=String(u?.name||"").trim();return f.length>0?f:l}function i7(u){let l=String(u?.id||"default"),f=yL(u);return f===l?l:`${f} (${l})`}function E3(u){let l=C4(u,"running")+C4(u,"judging"),f=C4(u,"queued")+C4(u,"retry_wait"),n=Number(u?.total||0),y=[i7(u),`${n} tasks`];if(l>0)y.push(`${l} running`);if(f>0)y.push(`${f} queued`);return y.join(" · ")}function H_(u,l){if(If(l))return null;return u.find((f)=>String(f?.id||"")===l)||null}function xq(u,l,f,n){if(If(f)){let i=Z_(u);return String(u?.activeTaskId||i[0]||n.find((_)=>fy(_))?.id||"")}let y=H_(l,f);return String(y?.activeTaskId||n.find((i)=>fy(i))?.id||"")}function XV(u,l,f){if(!If(l)){let n=H_(u,l);return String(n?.runnableTaskId||f.find((y)=>String(y?.status||"")==="queued"||String(y?.status||"")==="retry_wait")?.id||"")}return String(f.find((n)=>String(n?.status||"")==="queued"||String(n?.status||"")==="retry_wait")?.id||"")}async function mq(u,l=_1,f=""){return tl(Sl(u,`/api/tasks/overview?limit=${uL}&transcriptLimit=1&compact=1&selected=0&includeActive=0&stats=0&skipTrace=1${Q7(l,f)}`),v4())}async function a9(u,l,f=0,n=_1,y="",i=!1,_={}){let $=_.selected===!1?"&selected=0":"",A=_.includeActive===!1?"&includeActive=0":"",j=_.stats===!1?"&stats=0":"",J=Number.isInteger(_.limit)&&_.limit>0?Math.min(500,_.limit):uL;return tl(Sl(u,`/api/tasks/overview?limit=${encodeURIComponent(String(J))}&transcriptLimit=3&compact=1&afterSeq=${encodeURIComponent(String(Math.max(0,f)))}&preferId=${encodeURIComponent(l)}${$}${A}${j}${i?"&skipTrace=1":""}${Q7(n,y)}`),v4())}async function cV(u,l=_1){return tl(Sl(u,`/api/tasks/stats?days=14${nL(l)}`),v4())}async function Rq(u,l,f,n=lL,y=""){return tl(Sl(u,`/api/tasks/overview?limit=${encodeURIComponent(String(n))}&transcriptLimit=1&compact=1&selected=0&includeActive=0&stats=0&beforeId=${encodeURIComponent(f)}${Q7(l,y)}`),v4())}async function YV(u,l){return tl(Sl(u,`/api/tasks/${encodeURIComponent(l)}/trace-summary`))}async function DV(u,l,f,n=null){let y=n===null||n===void 0||String(n).length===0?"":`&attempt=${encodeURIComponent(String(n))}`;return tl(Sl(u,`/api/tasks/${encodeURIComponent(l)}/prompt?part=${encodeURIComponent(f)}${y}`))}async function tV(u,l,f=0,n=500,y=null){let i=y===null||y===void 0||String(y).length===0?"":`&attempt=${encodeURIComponent(String(y))}`;return tl(Sl(u,`/api/tasks/${encodeURIComponent(l)}/trace-steps?afterSeq=${encodeURIComponent(String(f))}&limit=${encodeURIComponent(String(n))}${i}`))}async function SV(u,l,f){return tl(Sl(u,`/api/tasks/${encodeURIComponent(l)}/trace-step?seq=${encodeURIComponent(String(f))}`))}async function PV(u,l){return tl(Sl(u,`/api/tasks/${encodeURIComponent(l)}/read`),{method:"POST",body:{}})}async function MV(u){return tl(Sl(u,"/api/tasks/read-all"),{method:"POST",body:{}})}function CV(u){return Array.isArray(u?.output)?u.output:[]}function pV(u){return Array.isArray(u?.attempts)?u.attempts:[]}function o9(u){return u?.counts&&typeof u.counts==="object"&&!Array.isArray(u.counts)?u.counts:{}}function xV(u){return u.split(/^\s*---+\s*$/gmu).map((l)=>l.trim()).filter(Boolean)}function bq(u){let l=Number(u);return Number.isFinite(l)?Math.max(1,Math.min(50,Math.floor(l))):1}function oy(u){let l=[];for(let f of u.split(/[\s,,;;]+/u)){let n=f.trim();if(/^codex_\d+_[A-Za-z0-9_-]+$/u.test(n)&&!l.includes(n))l.push(n)}return l}function mV(u,l){let f=oy(l);if(f.length===0)return u;return[`引用 Code Queue 任务 ${f.join(" ")}。后端会在入队时只注入这些任务的 initial prompt 和 final response 全文;中间执行过程不注入,如需补充核查可运行:${f.map((n)=>`bun scripts/cli.ts codex task ${n}`).join(";")}`,"","本次任务:",u].join(` +`)}function RV(u){let n=u.trimStart();if(!n.startsWith("# Code Queue 已解析引用上下文"))return{hasInjection:!1,reference:"",userPrompt:u};let y=u.length-n.length,i=u.lastIndexOf(` # 本次任务 -`);if(y0?u.split(/\r\n|\r|\n/u).length:0}function m8(u){if(typeof u==="string")return u;if(u&&typeof u==="object"&&!Array.isArray(u)&&typeof u.text==="string")return u.text;return""}function iL(u,l={}){if(l.preview===!0){let i=m8(u?.displayPromptPreview||u?.basePromptPreview||u?.promptPreview);if(i.length>0)return i}let f=String(u?.displayPrompt||"");if(f.length>0)return f;let n=String(u?.prompt||"");return RV(xV(n).userPrompt)}function qf(u){return u?._traceSummary&&typeof u._traceSummary==="object"&&!Array.isArray(u._traceSummary)?u._traceSummary:null}function b8(u){return u?._promptDetails&&typeof u._promptDetails==="object"&&!Array.isArray(u._promptDetails)?u._promptDetails:{}}function Q7(u){let l=qf(u)?.prompt;return l&&typeof l==="object"&&!Array.isArray(l)?l:{}}function yL(u){let l=qf(u)?.execution;return l&&typeof l==="object"&&!Array.isArray(l)?l:{}}function bq(u){let l=Number(u);return Number.isFinite(l)&&l>=0?Math.floor(l):0}function An(u){let l=Number(u);return Number.isFinite(l)&&l>=0?Math.floor(l):null}function U7(u){let l=ll(u?.traceStats);if(l&&(u?.statsSource==="oa-event-flow"||l.source==="oa-event-flow"))return l;let f=qf(u),n=ll(f?.traceStats);if(n&&(f?.statsSource==="oa-event-flow"||n.source==="oa-event-flow"))return n;return null}function bV(u,l){let f=ll(l?.traceStats)||ll(l?.execution?.traceStats),n=String(l?.statsSource||l?.execution?.statsSource||"");if(f&&(n==="oa-event-flow"||f.source==="oa-event-flow"))return f;return null}function kV(u,l){return An(U7(u)?.[l])}function hV(u){let l=kV(u,"stepCount");if(l!==null)return l;let f=qf(u);if(f!==null)return gV(f);return null}function _L(...u){for(let l of u){let f=An(l);if(f!==null)return f}return null}function IV(u){if(u.state==="ready"||u.state==="fallback")return`STEP ${u.count}${u.state==="fallback"?" raw":""}`;if(u.state==="syncing")return"STEP sync";if(u.state==="failed")return"STEP failed";return"STEP N/A"}function vV(u){let l=U7(u),f=An(l?.stepCount??l?.llmStepCount);if(f!==null)return{state:"ready",count:f,label:`STEP ${f}`,title:"STEP 来自 OA Event Flow 统计中心",source:"oa-event-flow"};let n=qf(u),i=fi(u)&&u?._traceSummaryLoaded!==!0&&An(u?.outputCount??u?.retainedOutputCount)===0,y=_L(n?.retainedStepCount,n?.execution?.traceLineCount,n?.execution?.stepCount,u?.outputCount,u?.retainedOutputCount,i?null:u?.stepCount,i?null:u?.llmStepCount);if(y!==null)return{state:"fallback",count:y,label:`STEP ${y} raw`,title:"OA STEP 统计不可用,当前显示 raw trace fallback 行数",source:"raw-trace"};if(n?.traceStatsError||u?.traceStatsError)return{state:"failed",count:null,label:"STEP failed",title:"STEP 统计读取失败;请查看 trace summary 原始 JSON",source:"stats-error"};if(fi(u)||u?._traceSummaryLoaded!==!0)return{state:"syncing",count:null,label:"STEP sync",title:"STEP 统计同步中;Trace Summary 或 OA 统计尚未返回",source:"syncing"};return{state:"unavailable",count:null,label:"STEP N/A",title:"当前任务没有可用 STEP 统计或 raw trace fallback",source:"unavailable"}}function gV(u){let l=ll(u?.traceStats);if(!l||u?.statsSource!=="oa-event-flow"&&l.source!=="oa-event-flow")return null;return An(l.stepCount)}function C8(u){if(!u||u?._traceSummaryLoaded!==!0)return!1;let l=qf(u),f=String(u?._traceSummaryUpdatedAt||l?.updatedAt||""),n=String(u?.updatedAt||"");if(n.length>0){let i=_1(f),y=_1(n);if(i!==null&&y!==null){if(i+10)return f;let n=String(u?.basePrompt||"");return n.length>0?n:iL(u)}function $L(u){let l=qf(u);return String(l?.finalResponse||u?.finalResponse||"").trimEnd()}function rL(u){let f=qf(u)?.lastJudge||u?.lastJudge;return f&&typeof f==="object"&&!Array.isArray(f)?f:null}function ll(u){return u&&typeof u==="object"&&!Array.isArray(u)?u:null}function sV(u){let l=ll(u?.raw),f=ll(u?.failureDetails)||ll(l?.minimaxFailure);if(f===null)return"";let n=f.repairAttempt===void 0?"":`${f.repairAttempt}/${f.maxRepairAttempts??"?"}`;return[["provider",f.provider||"minimax"],["stage",f.stage],["model",f.model],["timedOut",f.timedOut],["durationMs",f.durationMs],["timeoutMs",f.timeoutMs],["promptChars",f.promptChars],["promptLines",f.promptLines],["payloadBytes",f.payloadBytes],["responseStatus",f.responseStatus],["repairAttempt",n],["errorName",f.errorName],["error",f.errorMessage],["responseContentPreview",f.responseContentPreview],["responseTextPreview",f.responseTextPreview]].filter(([,y])=>y!==void 0&&y!==null&&String(y).length>0).map(([y,_])=>`${y}: ${String(_)}`).join(` -`)}function AL({judge:u,testId:l="codex-judge-failure-details"}){let f=sV(u);if(f.length===0)return null;return G("details",{className:"codex-judge-failure-details","data-testid":l},G("summary",null,"MiniMax failure details"),G("pre",null,f))}function aV(u){let l=qf(u)?.attempts;if(Array.isArray(l)&&l.length>0)return d9(u,o9(u,l));let f=yL(u),n=$L(u),i=rL(u);if(Object.keys(f).length===0&&n.length===0&&i===null)return d9(u,o9(u,[]));return d9(u,o9(u,[{index:Number(u?.currentAttempt||1),mode:u?.currentMode||"initial",startedAt:u?.startedAt,finishedAt:u?.finishedAt,terminalStatus:u?.status,execution:f,finalResponse:n,finalResponseChars:n.length,judge:i}]))}function k8(u,l){let f=qf(u),n=Number(f?.currentAttempt||u?.currentAttempt||0),i=Number(l);return Number.isFinite(n)&&n>0&&Number.isFinite(i)&&i===n}function N7(u,l){return fi(u)&&k8(u,l)}function o9(u,l){let f=Array.isArray(l)?l.filter(Boolean):[],n=qf(u),i=Number(n?.currentAttempt||u?.currentAttempt||0);if(!fi(u)||!Number.isFinite(i)||i<=0)return f;if(f.some((_)=>Number(_?.index)===i))return f;let y=r7(u?.startedAt,n?.startedAt,u?.updatedAt,n?.updatedAt);return[...f,{index:i,mode:u?.currentMode||n?.currentMode||(i<=1?"initial":"retry"),startedAt:y||u?.startedAt||n?.startedAt,finishedAt:null,terminalStatus:null,execution:{},finalResponse:"",finalResponsePreview:"",finalResponseChars:0,judge:null,currentPlaceholder:!0}]}function d9(u,l){let f=[...Array.isArray(l)?l:[]];if(!fi(u))return f;return f.sort((n,i)=>{let y=Number(n?.index),_=Number(i?.index),$=k8(u,y)?0:1,r=k8(u,_)?0:1;if($!==r)return $-r;return y-_})}function oV(u,l){return ll(l?.execution)||yL(u)}function dV(u,l,f,n){let i=qf(u),y=Number(i?.currentAttempt||u?.currentAttempt||0),_=Number(f),$=Number.isFinite(_)&&_>0&&_===y,r=r7(u?.updatedAt,i?.updatedAt);if($&&!l?.finishedAt&&r.length>0)return r;return String(l?.updatedAt||l?.finishedAt||n.effectiveEndAt||($?r:"")||r||u?.finishedAt||u?.startedAt||"")}function eV(u,l){let f=String(l?.finalResponse||l?.finalResponsePreview||"");if(N7(u,l?.index))return"";if(Object.prototype.hasOwnProperty.call(l||{},"finalResponse")||Object.prototype.hasOwnProperty.call(l||{},"finalResponsePreview"))return f.trimEnd();return f.length>0?f.trimEnd():$L(u)}function jL(u,l,f=l?.index){if(N7(u,f))return null;if(Object.prototype.hasOwnProperty.call(l||{},"judge"))return ll(l?.judge);return rL(u)}function uB(u,l,f){if(!FL(u))return!1;if(F7(l,f))return!1;if(l?.finishedAt)return!1;if(["succeeded","failed","canceled"].includes(String(l?.terminalStatus||"")))return!1;if(k8(u,f))return!0;let n=Number(qf(u)?.currentAttempt||u?.currentAttempt||0);if(Number.isFinite(n)&&n>0)return!1;return!0}function JL(u){return`feedback:${String(u||"latest")}`}function lB(u,l,f){let n=String(l?.feedbackPrompt||"").trimEnd(),i=String(l?.feedbackPromptPreview||n||"").trimEnd(),y=Number(l?.feedbackPromptChars||n.length||i.length||0),_=Number(l?.feedbackPromptLines||ei(n||i));if(n.length>0||i.length>0||y>0)return{text:n,preview:i,chars:y,lines:_,source:l?.feedbackPromptSource||"judge-feedback",forAttempt:l?.feedbackPromptForAttempt||Number(f||0)+1,truncated:Boolean(l?.feedbackPromptTruncated)};let $=jL(u,l,f),r=String($?.continuePrompt||"").trimEnd();if($?.decision==="retry"&&r.length>0)return{text:"",preview:r,chars:r.length,lines:ei(r),source:"judge-continue-prompt",forAttempt:Number(f||0)+1,truncated:!1};return null}function fB(u){let l=Q7(u);return Boolean(l.hasReferenceInjection||Number(l.referencePromptChars||0)>0||u?.referenceInjection||u?.referenceInjectionSummary)}function QL(u,l=null){if(l!==null&&l!==void 0){let n=(ll(u?._traceStepsByAttempt)||{})[String(l)];return Array.isArray(n)?n:[]}return Array.isArray(u?._traceSteps)?u._traceSteps:[]}function V3(u){let f=[u?.seq,...Array.isArray(u?.rawSeqs)?u.rawSeqs:[]].map((n)=>Number(n)).filter((n)=>Number.isFinite(n));return f.length>0?Math.max(...f):0}function nB(u){return(Array.isArray(u)?u:[]).reduce((l,f)=>Math.max(l,V3(f)),0)}function iB(u,l){let f=new Map;for(let n of[...Array.isArray(u)?u:[],...Array.isArray(l)?l:[]]){let i=String(n?.seq??`${n?.title||"step"}:${n?.at||""}`);f.set(i,{...f.get(i)||{},...n})}return Array.from(f.values()).sort((n,i)=>V3(n)-V3(i))}function ly(u){return(Array.isArray(u?.summaryLines)?u.summaryLines:[]).map((l)=>String(l||""))}function yB(u){let l=String(u?.kind||"").trim().toLowerCase(),f=String(u?.status||"").trim().toLowerCase();return l==="error"||f==="error"}function h8(u){let l=String(u?.status||"").trim();if(l.length>0)return l;let f=ly(u).join(` -`);return/^(item\/[A-Za-z]+(?:\/[A-Za-z]+)?):/u.exec(f)?.[1]||""}function kq(u){return/^item\/(?:started|completed): file changes status=/u.test(String(u||"").trim())}function _B(u){let l=ly(u);for(let n=l.length-1;n>=0;n-=1){let i=/file changes status=([A-Za-z0-9_-]+)/u.exec(l[n]||"")?.[1];if(i)return i}let f=h8(u);if(f==="item/fileChange/outputDelta")return"updated";if(f==="item/started")return"started";if(f==="item/completed")return"completed";return f.replace(/^item\//u,"")||String(u?.status||"changed")}function $B(u){if(String(u?.kind||"")!=="edited")return!1;let l=String(u?.title||""),f=String(u?.status||""),n=ly(u).join(` -`);if(l==="Edited files")return!0;if(/^item\/fileChange\//u.test(f))return!0;if((f==="item/started"||f==="item/completed")&&/file changes status=/u.test(n))return!0;if(/^Success\. Updated the following files:/mu.test(n))return!0;if(/^diff --git /mu.test(n))return!0;return/^([AMDRCU?]{1,2})\s+\S+/mu.test(n)}function rB(u){if(u.length<=1)return u[0];let l=u.find((y)=>h8(y)==="item/fileChange/outputDelta")||u.find((y)=>ly(y).some((_)=>!kq(_)))||u.at(-1)||u[0],f=u.flatMap((y)=>Array.isArray(y?.rawSeqs)?y.rawSeqs:[y?.seq]).filter((y)=>y!==void 0),n=u.flatMap(ly).filter((y)=>y.trim().length>0&&!kq(y)),i=u[u.length-1]||l;return{...l,at:l?.at||i?.at,title:String(l?.title||"Edited files"),status:_B(i),summaryLines:n.length>0?n:ly(l),rawSeqs:f}}function AB(u){let l=Array.isArray(u)?u:[],f=[],n=[],i=()=>{if(n.length>0)f.push(rB(n));n=[]};for(let y of l){if($B(y)){if(h8(y)==="item/started"&&n.length>0)i();if(n.push(y),h8(y)==="item/completed")i();continue}i(),f.push(y)}return i(),f}function jB(u){if(String(u?.kind||"")!=="message")return"";let l=String(u?.title||"").trim().toLowerCase();if(l!=="assistant message"&&l!=="reasoning")return"";return`${l}:${String(u?.status||"")}`}function JB(u){if(u.length<=1)return u[0];let l=u[0],f=u.at(-1)||l,n=u.flatMap((_)=>Array.isArray(_?.rawSeqs)?_.rawSeqs:[_?.seq]).filter((_)=>_!==void 0),i=[];for(let _ of n)if(!i.includes(_))i.push(_);let y=u.flatMap(ly).filter((_)=>_.trim().length>0);return{...l,seq:V3(f)||V3(l),at:f?.at||l?.at,summaryLines:y.length>0?[y.at(-1)||y[0]]:[],rawSeqs:i}}function QB(u){let l=Array.isArray(u)?u:[],f=[],n=[],i="",y=()=>{if(n.length>0)f.push(JB(n));n=[],i=""};for(let _ of l){let $=jB(_);if($.length>0&&$===i){n.push(_);continue}if(y(),$.length>0)n=[_],i=$;else f.push(_)}return y(),f}function UB(u){return QB(AB(u))}function NB(u){return{...u}}function R8(u,l=null){if(l!==null&&l!==void 0){let f=ll(u?._traceStepsLoadedByAttempt)||{};return Boolean(f[String(l)])}return Boolean(u?._traceStepsLoaded)}function y7(u){return u?._traceStepDetails&&typeof u._traceStepDetails==="object"&&!Array.isArray(u._traceStepDetails)?u._traceStepDetails:{}}function FB(u,l){let f=Number(u?.index);return Number.isFinite(f)?f:l+1}function F7(u,l){return Boolean(u?.synthetic)||Number(l)<=0}function g8(u){let l=Number(u);return Number.isFinite(l)?String(l):void 0}function WB(u){let l=u?.timing&&typeof u.timing==="object"?u.timing:{},f=String(u?.status||"");if(["queued"].includes(f))return`等待 ${rn(l.queueWaitMs??l.totalElapsedMs)}`;if(["running","judging","retry_wait"].includes(f))return`耗时 ${rn(l.durationMs??l.totalElapsedMs)}`;return`耗时 ${rn(l.durationMs??l.totalElapsedMs)}`}function H_(u){return String(u?.queueId||"default")}function UL(u){return ll(u?.queuedReason)}function NL(u){let l=String(u?.queuedReasonLabel||"").trim();if(l.length>0)return l.toUpperCase();let f=UL(u),n=String(f?.label||"").trim();return n.length>0?n.toUpperCase():""}function qB(u){let l=String(u?.status||"unknown");if(l!=="queued")return l;let f=NL(u);return f.length>0?`QUEUED(${f})`:"QUEUED"}function LB(u){if(String(u?.status||"")!=="queued")return;let l=UL(u),f=String(l?.message||"").trim(),n=NL(u);if(f.length>0&&n.length>0)return`${n}: ${f}`;if(f.length>0)return f;return n.length>0?n:void 0}function KB(u){return{system:"SYS",user:"YOU",assistant:"GPT",reasoning:"THINK",command:"CMD",diff:"DIFF",tool:"TOOL",error:"ERR"}[u]||u.toUpperCase()}function fi(u){return["running","judging","retry_wait"].includes(String(u?.status||""))}function FL(u){return String(u?.status||"")==="running"}function $n(u){return["succeeded","failed","canceled"].includes(String(u?.status||""))}function WL(u){if(u?.promptEditable===!0)return!0;if(u?.promptEditable===!1)return!1;return String(u?.status||"")==="queued"&&!u?.startedAt&&Number(u?.currentAttempt||0)===0&&!u?.codexThreadId&&!u?.nextMode}function i1(u){if(!$n(u))return!1;if(u?.terminalUnread===!0)return!0;if(u?.terminalUnread===!1)return!1;return!u?.readAt}function Vl(u){let l=Number(u||0);return Number.isFinite(l)?l:0}function zB(u){return Vl(u.queued)+Vl(u.retry_wait)}function GB(u){return Vl(u.running)+Vl(u.judging)}function wB(u,l){return ll(u?.statistics)||ll(l?.statistics)||{}}function qL(...u){return u.find((l)=>l!==void 0&&l!==null)}function LL(u){let l=Number(u);return Number.isFinite(l)&&l>=0?l:null}function Bf(...u){for(let l of u){let f=LL(l);if(f!==null)return Math.floor(f)}return 0}function W7(...u){for(let l of u){let f=LL(l);if(f!==null)return Math.round(f)}return null}function ZB(u){for(let l of[u?.daily,u?.dailyBuckets,u?.daily_buckets,u?.buckets,u?.rows,u?.series])if(Array.isArray(l))return l;return[]}function KL(u){return ZB(u).map((l,f)=>{let n=ll(l)||{},i=String(qL(n.date,n.day,n.bucketDate,n.bucket,`day-${f}`)||"");return{...n,date:i,executedTasks:Bf(n.executedTasks,n.tasks,n.taskCount,n.startedTasks,n.started,n.executed,n.count),completedTasks:Bf(n.completedTasks,n.terminalTasks,n.terminalCount,n.finishedTasks,n.finished,n.completed),retryAttempts:Bf(n.retryAttempts,n.retries,n.retryCount,n.retryTasks),succeededTasks:Bf(n.succeededTasks,n.succeeded,n.success),failedTasks:Bf(n.failedTasks,n.failed,n.failures),canceledTasks:Bf(n.canceledTasks,n.cancelledTasks,n.canceled,n.cancelled),totalDurationMs:Bf(n.totalDurationMs,n.durationTotalMs,n.totalCompletionDurationMs),durationSamples:Bf(n.durationSamples,n.avgDurationSamples,n.samples,n.sampleCount),avgDurationMs:W7(n.avgDurationMs,n.averageDurationMs,n.avgCompletedDurationMs,n.averageCompletionMs,n.averageDuration,n.durationMs)}}).filter((l)=>l.date.length>0)}function ui(u,l){return u.reduce((f,n)=>f+Vl(n?.[l]),0)}function EB(u){let l=0,f=0;for(let n of u){let i=Vl(n?.durationSamples),y=W7(n?.avgDurationMs);if(i>0&&y!==null)l+=y*i,f+=i}return f>0?Math.round(l/f):null}function HB(u,l=KL(u)){let f=ll(u?.totals)||ll(u?.summary)||{},n=Bf(f.durationSamples,f.avgDurationSamples,f.samples,u?.durationSamples,u?.samples,ui(l,"durationSamples")),i=Bf(f.totalDurationMs,f.durationTotalMs,u?.totalDurationMs,ui(l,"totalDurationMs")),y=W7(f.avgDurationMs,f.averageDurationMs,f.avgCompletedDurationMs,u?.avgDurationMs,u?.averageDurationMs,n>0&&i>0?i/n:null,EB(l));return{...f,executedTasks:Bf(f.executedTasks,f.tasks,f.taskCount,u?.executedTasks,u?.tasks,u?.taskCount,ui(l,"executedTasks")),completedTasks:Bf(f.completedTasks,f.terminalTasks,f.terminalCount,f.finishedTasks,u?.completedTasks,u?.terminalTasks,u?.terminalCount,ui(l,"completedTasks")),retryAttempts:Bf(f.retryAttempts,f.retries,f.retryCount,u?.retryAttempts,u?.retries,u?.retryCount,ui(l,"retryAttempts")),succeededTasks:Bf(f.succeededTasks,u?.succeededTasks,ui(l,"succeededTasks")),failedTasks:Bf(f.failedTasks,u?.failedTasks,ui(l,"failedTasks")),canceledTasks:Bf(f.canceledTasks,f.cancelledTasks,u?.canceledTasks,u?.cancelledTasks,ui(l,"canceledTasks")),durationSamples:n,totalDurationMs:i,avgDurationMs:y}}function hq(u){let l=qL(u?.reason,u?.degradedReason,u?.statsReason,u?.error,u?.message,u?.detail);if(typeof l==="string"&&l.trim().length>0)return T3(l,180);if(u?.skipped===!0)return"统计 API 返回 skipped,当前后端未提供 daily buckets。";if(u?.unavailable===!0)return"统计 API 当前不可用。";return"统计 API 未返回可用的 daily buckets。"}function OB(u,l,f){let n=ll(u)!==null,i=u?.unavailable===!0||u?._unavailable===!0||u?.available===!1,y=u?.skipped===!0,_=u?.degraded===!0||u?.isDegraded===!0||i||y,$=Vl(f.executedTasks)+Vl(f.retryAttempts)+Vl(f.completedTasks);if(!n)return{state:"loading",label:"统计同步中",reason:"正在读取 Code Queue stats API。"};if(i||y||_&&l.length===0)return{state:"unavailable",label:"统计不可用",reason:hq(u),degraded:!0};if(_)return{state:"degraded",label:"统计降级",reason:hq(u),degraded:!0};if(l.length===0&&$===0)return{state:"empty",label:"暂无统计",reason:"任务开始执行后会生成按天汇总的曲线。"};return{state:"ready",label:"统计就绪",reason:""}}function Iq(u){return{source:"frontend-stats-fetch",unavailable:!0,degraded:!0,reason:Yl(u,"统计 API 不可用"),daily:[],totals:null}}function q7(u,l){let f=Number(u?.[l]??0);return Number.isFinite(f)&&f>0?f:0}function e9(u,l){return u.reduce((f,n)=>Math.max(f,q7(n,l)),0)}var di=700,vq=220,li=30,Z_=24,O3=184,_7=O3-Z_;function zL(u,l){if(l<=1)return di/2;return li+u*(di-li*2)/(l-1)}function GL(u,l){let f=l>0?l:1;return O3-Math.min(1,u/f)*_7}function u7(u,l,f){let n=u.length>0?u:[{[l]:0}],i=n.length>1?n:[n[0],n[0]];return i.map((y,_)=>`${zL(_,i.length).toFixed(2)},${GL(q7(y,l),f).toFixed(2)}`).join(" ")}function n1(u){let l=String(u||"");return/^\d{4}-\d{2}-\d{2}$/u.test(l)?l.slice(5):l||"--"}function p8(u){if(!u)return"";return`${String(u.seriesKey||"")}:${String(u.row?.date||u.index||"")}`}function TB(u,l,f,n){let i=q7(u,n.key);return{...n,row:u,index:l,value:i,valueLabel:n.format(i),x:zL(l,f),y:GL(i,n.max),seriesKey:n.key}}function gq(u){if(i1(u))return 0;return{running:1,judging:2,retry_wait:3,queued:4,succeeded:8,failed:8,canceled:8}[String(u?.status||"")]??9}function G3(u){if(!u)return!1;if(u?._traceSummaryLoaded===!0)return!1;return u?.summaryOnly===!0||u?._metaLoaded!==!0}function VB(u){return Boolean(u?._metaLoaded)||u?.summaryOnly===!1}function BB(u,l,f){let n=String(u?.[f]||""),i=String(l?.[f]||"");return n.length>i.length?n:i}function $7(u,l,f){let n=Array.isArray(u?.[f])?u[f]:[],i=Array.isArray(l?.[f])?l[f]:[];if(i.length===0&&n.length>0)return n;return n.length>i.length?n:i}function sq(u,l){let f=l?.summaryOnly===!0&&VB(u),n={...u,...l};if(!f)return n;for(let i of["prompt","basePrompt","displayPrompt","finalResponse"])n[i]=BB(u,l,i);for(let i of["promptHistory","attempts","output","events"])n[i]=$7(u,l,i);if(u?.referenceInjection?.items&&!l?.referenceInjection?.items)n.referenceInjection=u.referenceInjection;if(u?.referenceInjectionSummary&&!l?.referenceInjectionSummary)n.referenceInjectionSummary=u.referenceInjectionSummary;n.summaryOnly=u?.summaryOnly===!1?!1:l.summaryOnly,n._metaLoaded=u?._metaLoaded,n._detailLoaded=u?._detailLoaded,n._transcriptComplete=u?._transcriptComplete,n._transcriptPreview=Object.prototype.hasOwnProperty.call(l,"_transcriptPreview")?l._transcriptPreview:u?._transcriptPreview;for(let i of["_traceSummary","_traceSummaryLoaded","_traceSteps","_traceStepsLoaded","_traceStepsByAttempt","_traceStepsLoadedByAttempt","_traceStepsNextAfterSeqByAttempt","_traceStepDetails","_promptDetails"])if(!Object.prototype.hasOwnProperty.call(l,i)&&Object.prototype.hasOwnProperty.call(u||{},i))n[i]=u[i];return n}function aq(u){let l=u?.selected,f=l?.task&&typeof l.task==="object"?l.task:null;if(f!==null){let i=Boolean(l?.preview);return{...f,transcript:Array.isArray(l?.transcript)?l.transcript:[],_detailLoaded:Array.isArray(l?.transcript)&&l.transcript.length>0,_transcriptComplete:Boolean(!i&&!l?.hasMore&&$n(f)),_transcriptPreview:i,_summaryLoaded:!0}}let n=ml(u)[0];return n?{...n,_summaryLoaded:!0}:null}function l7(u,l){let f=new Map;for(let n of[...Array.isArray(u)?u:[],...Array.isArray(l)?l:[]]){let i=`${Number(n?.seq??0)}:${String(n?.kind||"message")}`,y=f.get(i);if(!y){f.set(i,n);continue}let _={...y,...n};for(let[$,r]of[["bodyPreview","bodyOmittedLines"],["commandPreview","commandOmittedLines"]]){let j=String(y?.[$]||""),J=String(n?.[$]||"");if(j.length>J.length)_[$]=y[$],_[r]=y[r]}f.set(i,_)}return Array.from(f.values()).sort((n,i)=>Number(n?.seq??0)-Number(i?.seq??0))}function w3(u){return(Array.isArray(u)?u:[]).reduce((l,f)=>Math.max(l,Number(f?.seq??0)),0)}function oq(u,l=8){let f=Array.from(new Set((Array.isArray(u)?u:[]).map((i)=>Number(i?.seq??0)).filter((i)=>Number.isFinite(i)&&i>0))).sort((i,y)=>i-y);if(f.length===0)return 0;let n=f[Math.max(0,f.length-l)]??0;return Math.max(0,n-0.001)}function cB(u,l){let f=Array.isArray(u?.codeModels)?u.codeModels:Array.isArray(u?.codexModels)?u.codexModels:[],n=["gpt-5.5","gpt-5.4-mini","gpt-5.4","deepseek-chat","minimax-m2.7"];return Array.from(new Set([...f,...n,l].map((i)=>String(i||"").trim()).filter(Boolean)))}function XB(u,l){let n=(Array.isArray(u?.executionProviders)?u.executionProviders:[]).map((_)=>({id:String(_?.id||"").trim(),label:String(_?.label||_?.id||"").trim(),defaultWorkdir:String(_?.defaultWorkdir||"").trim(),supportsWindowsNativeCodex:_?.supportsWindowsNativeCodex===!0,windowsNativeDefaultWorkdir:String(_?.windowsNativeDefaultWorkdir||"").trim(),kind:String(_?.kind||"").trim()})).filter((_)=>_.id.length>0),i=String(u?.mainProviderId||u?.defaultProviderId||"D601").trim()||"D601",y=new Map;for(let _ of[...n,{id:i,label:`${i} (local)`,defaultWorkdir:String(u?.defaultWorkdir||"/workspace"),supportsWindowsNativeCodex:!1,windowsNativeDefaultWorkdir:"",kind:"local"},l?{id:l,label:l,defaultWorkdir:L7(u,l),supportsWindowsNativeCodex:l!==i,windowsNativeDefaultWorkdir:String(u?.windowsNativeCodexDefaultWorkdir||"/mnt/f/Work/ConStart"),kind:""}:null].filter(Boolean))if(!y.has(_.id))y.set(_.id,_);return Array.from(y.values())}function YB(u,l){let n=(Array.isArray(u?.executionModes)?u.executionModes:[]).map((_)=>({id:String(_?.id||_?.kind||"").trim(),label:String(_?.label||_?.id||_?.kind||"").trim(),description:String(_?.description||"").trim(),defaultWorkdir:String(_?.defaultWorkdir||"").trim(),requiresProvider:_?.requiresProvider===!0,requiresWindowsCwd:_?.requiresWindowsCwd===!0})).filter((_)=>_.id.length>0),i=[{id:"default",label:"默认容器/本机",description:"Code Queue 所在节点用本机 Codex;远程 Provider 用执行容器 Codex。",defaultWorkdir:"",requiresProvider:!1,requiresWindowsCwd:!1},{id:"windows-native",label:"Windows 原生 Codex",description:"启动执行容器,但容器只做 stdio relay,Codex 运行在 Provider 的 Windows 宿主。",defaultWorkdir:String(u?.windowsNativeCodexDefaultWorkdir||"/mnt/f/Work/ConStart"),requiresProvider:!0,requiresWindowsCwd:!0}],y=new Map;for(let _ of[...n,...i,l?{id:l,label:l,description:"",defaultWorkdir:"",requiresProvider:l==="windows-native",requiresWindowsCwd:l==="windows-native"}:null].filter(Boolean))if(!y.has(_.id))y.set(_.id,_);return Array.from(y.values())}function E3(u,l,f){if(l!=="windows-native")return L7(u,f);let n=Array.isArray(u?.executionModes)?u.executionModes.find((y)=>String(y?.id||y?.kind||"")==="windows-native"):null,i=Array.isArray(u?.executionProviders)?u.executionProviders.find((y)=>String(y?.id||"")===f):null;return String(i?.windowsNativeDefaultWorkdir||n?.defaultWorkdir||u?.windowsNativeCodexDefaultWorkdir||"/mnt/f/Work/ConStart")}function L7(u,l){let f=String(l||"").trim(),n=u?.defaultWorkdirByProvider&&typeof u.defaultWorkdirByProvider==="object"?u.defaultWorkdirByProvider:{};if(typeof n[f]==="string"&&String(n[f]).trim().length>0)return String(n[f]).trim();let i=Array.isArray(u?.executionProviders)?u.executionProviders.find((_)=>String(_?.id||"")===f):null;if(typeof i?.defaultWorkdir==="string"&&i.defaultWorkdir.trim().length>0)return i.defaultWorkdir.trim();let y=String(u?.mainProviderId||u?.defaultProviderId||"D601");return f===y?String(u?.defaultWorkdir||"/workspace"):String(u?.remoteDefaultWorkdir||"/home/ubuntu")}function O_(u){return String(u||"").trim().replace(/\/+$/u,"")||"/"}function tB(u,l,f){return String(u?.providerId||"")===String(l||"")&&String(u?.executionMode||"default")===String(f||"default")&&String(u?.path||"").trim().length>0}function DB(u,l,f,n,i){let y=new Map,_=O_(i),$=(r,j,J={})=>{let Q=O_(r);if(Q.length===0||y.has(Q))return;y.set(Q,{providerId:f,executionMode:n,path:Q,source:j,createdAt:J?.createdAt||"",updatedAt:J?.updatedAt||""})};$(E3(u,n,f),"default");for(let r of Array.isArray(l)?l:[])if(tB(r,f,n))$(r.path,"saved",r);return $(i,"current"),Array.from(y.values()).sort((r,j)=>{if(r.path===_)return-1;if(j.path===_)return 1;if(r.source==="default"&&j.source!=="default")return-1;if(j.source==="default"&&r.source!=="default")return 1;return r.path.localeCompare(j.path)})}function SB({task:u,selected:l,onSelect:f,onCopy:n,onReference:i,onMarkRead:y,copied:_,markingRead:$}){let r=u?.lastJudge||{},j=String(u?.id||""),J=i1(u),Q=r7(u?.updatedAt,qf(u)?.updatedAt),U=`最近更新: ${H3(Q)}`,F=vV(u),N=F.title;return G("article",{role:"button",tabIndex:0,className:`codex-task-card ${l?"selected":""} ${J?"unread-terminal":""}`,onClick:f,onKeyDown:(L)=>{if(L.key==="Enter"||L.key===" ")L.preventDefault(),f()},"data-unread-terminal":J?"true":"false","data-testid":`codex-task-${u?.id||"unknown"}`},J?G("span",{className:"codex-unread-badge",title:"待读","aria-label":"待读","data-testid":`codex-unread-task-${j||"unknown"}`}):null,G("div",{className:"codex-task-card-head"},G("div",{className:"codex-task-status-line"},G(uy,{status:u?.status,title:LB(u)},qB(u))),G("span",{className:"mono-text"},`${u?.currentAttempt||0}/${u?.maxAttempts||0}`)),G("div",{className:"codex-task-id-row"},G("code",{title:j},j||"unknown"),G("div",{className:"codex-task-id-actions"},G("button",{type:"button",className:"codex-copy-id-btn",onClick:(L)=>{L.stopPropagation(),i(j)},"data-testid":`codex-reference-task-${j||"unknown"}`},"引用"),G("button",{type:"button",className:"codex-copy-id-btn",onClick:(L)=>{L.stopPropagation(),n(j)},"data-testid":`codex-copy-task-id-${j||"unknown"}`},_?"已复制":"复制ID"),J?G("button",{type:"button",className:"codex-copy-id-btn codex-mark-read-btn",disabled:Boolean($),onClick:(L)=>{L.stopPropagation(),y(j)},"data-testid":`codex-mark-task-read-${j||"unknown"}`},$?"标记中":"标为已读"):null)),G("strong",null,T3(iL(u,{preview:!0}),120)||"空任务"),G("div",{className:"codex-task-meta"},G("span",null,`queue=${H_(u)}`),G("span",null,`provider=${u?.providerId||"D601"}`),G("span",null,`mode=${u?.executionMode||"default"}`),G("span",null,u?.model||"--"),G("span",null,WB(u))),G("div",{className:"codex-task-meta codex-task-update-meta"},G("span",{className:`codex-task-recent-update codex-task-step-count ${F.state}`,title:N,"data-testid":`codex-task-step-count-${j||"unknown"}`,"data-step-state":F.state,"data-step-source":F.source},IV(F)),G("span",{className:"codex-task-recent-update",title:Q?`更新时间: ${Hu(Q)}`:U,"data-testid":`codex-task-recent-update-${j||"unknown"}`},U),G("span",null,Hu(Q||u?.updatedAt))),WL(u)?G("div",{className:"codex-judge-line","data-testid":`codex-task-prompt-editable-${j||"unknown"}`},"queued prompt 可编辑"):null,r?.decision?G("div",{className:"codex-judge-line"},`judge=${r.decision} ${Math.round(Number(r.confidence||0)*100)}%`):null)}function f7({title:u,tasks:l,selectedId:f,onSelect:n,onCopy:i,onReference:y,onMarkRead:_,copiedTaskId:$,markingReadTaskId:r,emptyText:j}){let J=Array.isArray(l)?l:[];return G("section",{className:"codex-task-section"},G("div",{className:"codex-task-section-head"},G("span",null,u),G("code",null,String(J.length))),J.length===0?G("p",{className:"codex-task-section-empty"},j):G("div",{className:"codex-task-section-list"},J.map((Q)=>G(SB,{key:Q.id,task:Q,selected:f===Q.id,onSelect:()=>n(Q.id),onCopy:i,onReference:y,onMarkRead:_,copied:$===Q.id,markingRead:r===Q.id}))))}function PB(){return G("span",{className:"codex-stats-icon","aria-hidden":"true"},G("svg",{viewBox:"0 0 36 24",focusable:"false"},G("path",{className:"grid",d:"M3 20.5H33M3 12.5H33M3 4.5H33"}),G("polyline",{className:"line tasks",points:"3,18 9,14 15,15 21,8 27,10 33,4"}),G("polyline",{className:"line retry",points:"3,20 9,17 15,18 21,13 27,14 33,9"})))}function C0({label:u,value:l,hint:f,tone:n}){return G("div",{className:`codex-liveness-metric ${n||""}`},G("span",null,u),G("strong",null,l??"--"),f?G("code",null,f):null)}function MB({diagnostics:u,queue:l,onRaw:f}){let n=String(u?.state||u?.health||"unknown"),i=ll(u?.oaPublisher),y=f0(u?.reasons).slice(0,3),_=v8(u),$=j7(u),r=lL(u),j=String(u?.recommendedAction||(_.length>0?"investigate-heartbeat-risk":$?"continue-supervision":r==="degraded"?"observe-degraded":"none")),J=String($?"控制面/执行面观测分裂,但 heartbeat/trace 新鲜,继续监督。":_.length>0?"存在 expired/missing/stale heartbeat 风险,请先确认执行面状态。":u?.livenessSummary||(r==="degraded"?"Diagnostics are degraded; inspect heartbeat, trace, and OA progress together.":"Execution diagnostics are healthy.")),Q=EV(u),U=$?"split-brain live":n;return G(oi,{title:"执行活性",eyebrow:`${String(u?.executionStateSource||l?.executionStateSource||"unknown")} / ${String(u?.controlPlane||"code-queue")}`,summary:G("div",{className:"codex-trace-status"},G("span",{className:`codex-trace-status-chip liveness ${Q}`},G("b",null,"状态"),U),G("span",{className:`codex-trace-status-chip liveness ${Q}`},G("b",null,"liveness"),r),G("span",{className:"codex-trace-status-chip"},G("b",null,"DB active"),String(u?.databaseActiveTaskCount??l?.databaseActiveTaskCount??0)),G("span",{className:"codex-trace-status-chip"},G("b",null,"scheduler slots"),String(u?.schedulerActiveRunSlotCount??l?.activeRunSlotCount??0)),G("span",{className:"codex-trace-status-chip"},G("b",null,"heartbeat"),`${f0(u?.heartbeatFreshTaskIds).length} fresh / ${f0(u?.heartbeatExpiredTaskIds).length} expired`),i?G("span",{className:"codex-trace-status-chip"},G("b",null,"OA"),`${Number(i.pending||0)} pending${i.lastError?" / error":""}`):null),actions:G(A7,{title:"Code Queue Execution Diagnostics",data:u,onOpen:f,testId:"raw-code-queue-execution-diagnostics"}),className:"codex-liveness-panel"},G("div",{className:"codex-liveness-grid","data-testid":"codex-liveness-diagnostics"},G(C0,{tone:Q,label:"健康状态",value:U,hint:j}),G(C0,{tone:Q,label:"Effective liveness",value:r,hint:J}),G(C0,{label:"PostgreSQL active",value:String(u?.databaseActiveTaskCount??l?.databaseActiveTaskCount??0),hint:G_(u?.databaseActiveTaskIds??l?.databaseActiveTaskIds)}),G(C0,{label:"Scheduler active",value:String(u?.schedulerActiveRunSlotCount??l?.activeRunSlotCount??0),hint:G_(u?.schedulerActiveTaskIds??l?.activeTaskIds)}),G(C0,{label:"Fresh heartbeat",value:String(f0(u?.heartbeatFreshTaskIds).length),hint:G_(u?.heartbeatFreshTaskIds)}),G(C0,{tone:_.length>0?"failed":$?"degraded-live":"",label:"Heartbeat risk",value:String(_.length),hint:_.length>0?G_(_):$?"fresh heartbeat/trace: keep supervising":"--"}),G(C0,{tone:f0(u?.traceGapNotStaleTaskIds).length>0?"warn":"",label:"Trace gap",value:String(f0(u?.traceGapTaskIds).length),hint:G_(u?.traceGapNotStaleTaskIds)}),G(C0,{tone:f0(u?.staleRecoveryCandidateTaskIds).length>0?"failed":"",label:"Stale candidates",value:String(f0(u?.staleRecoveryCandidateTaskIds).length),hint:G_(u?.staleRecoveryCandidateTaskIds)}),G(C0,{label:"Last scheduler heartbeat",value:H3(u?.lastSchedulerHeartbeatAt),hint:String(u?.lastSchedulerHeartbeatAt||"--")}),G(C0,{label:"Last agent event",value:H3(u?.lastObservedAgentEventAt),hint:String(u?.lastObservedAgentEventAt||"--")}),G(C0,{label:"Last trace persist",value:H3(u?.lastPersistedTraceAt),hint:String(u?.lastPersistedTraceAt||"--")}),G(C0,{tone:i?.lastError?"warn":"",label:"OA publisher",value:`${Number(i?.pending||0)} pending`,hint:i?.lastError?T3(i.lastError,90):"ok"})),G("div",{className:`codex-liveness-advisory ${Q}`},G("b",null,$?"Observing split":_.length>0?"Heartbeat risk":"Liveness note"),G("span",null,J),G("code",null,j)),y.length>0?G("div",{className:"codex-liveness-reasons"},y.map((F)=>G("span",{key:F},F))):null)}function CB({stats:u,queueName:l,onRaw:f}){let n=KL(u),i=HB(u,n),y=n.at(-1)||{},_=e9(n,"executedTasks"),$=e9(n,"retryAttempts"),r=e9(n,"avgDurationMs"),j=n.length>0,J=ll(u?.range)||{},Q=OB(u,n,i),U=String(Q.label||""),F=String(Q.reason||""),N=Q.state==="ready"||Q.state==="degraded"?"将鼠标悬停到曲线数据点查看明细,点击数据点可固定。":F||"等待统计数据。",[L,w]=au(null),[W,K]=au(null),q=[];if(_>0)q.push(`tasks ${_}`);if($>0)q.push(`retry ${$}`);if(r>0)q.push(`avg ${rn(r)}`);let z=[{key:"executedTasks",className:"tasks",label:"执行任务",max:_,format:(t)=>`${Vl(t)} tasks`},{key:"retryAttempts",className:"retry",label:"重试次数",max:$,format:(t)=>`${Vl(t)} retries`},{key:"avgDurationMs",className:"duration",label:"平均耗时",max:r,format:(t)=>rn(t)}],Z=L||W,T=p8(Z),c=String(Z?.row?.date||""),X=Z?{left:`${Math.max(8,Math.min(92,Number(Z.x)/di*100))}%`,top:`${Math.max(14,Math.min(86,Number(Z.y)/vq*100))}%`}:void 0;_n(()=>{w(null),K(null)},[l,J.startDate,J.endDate,n.length]);let S=(t)=>{w(t)},p=(t)=>{let m=p8(t);K((V)=>p8(V)===m?null:t),w(t)},Y=z.flatMap((t)=>n.map((m,V)=>{let D=TB(m,V,n.length,t),M=p8(D),I=T===M,O=String(m?.date||`day-${V}`),C=`${n1(O)} ${t.label}: ${D.valueLabel}`;return G("g",{key:`${t.key}-${O}`,className:`stat-point-group ${t.className} ${I?"active":""}`,role:"button",tabIndex:0,"aria-label":C,"data-testid":`codex-stats-point-${t.className}-${O}`,onMouseEnter:()=>S(D),onFocus:()=>S(D),onClick:()=>p(D),onKeyDown:(g)=>{if(g.key==="Enter"||g.key===" ")g.preventDefault(),p(D)}},G("circle",{className:"stat-hit-point",cx:D.x,cy:D.y,r:13}),G("circle",{className:`stat-point ${t.className} ${I?"active":""}`,cx:D.x,cy:D.y,r:I?5.6:4.2}))}));return G(oi,{title:"统计曲线",eyebrow:`Daily task stats / ${l}`,className:`codex-stats-panel ${Q.state}`,summary:G("span",null,`${n1(J.startDate)} -> ${n1(J.endDate)} · ${u?.timezone||"Asia/Shanghai"} · ${U}`),actions:ll(u)?G(A7,{title:"Code Queue Stats",data:u,onOpen:f,testId:"raw-codex-stats"}):null},G("div",{className:"codex-stats-hero","data-testid":"codex-stats-panel","data-stats-state":Q.state,"data-stats-degraded":Q.degraded===!0?"true":"false"},G(PB),G("div",null,G("strong",null,`${Vl(i.executedTasks)} tasks / ${Vl(i.retryAttempts)} retries`),G("span",null,`平均完成耗时 ${rn(i.avgDurationMs??void 0)} · 终态 ${Vl(i.completedTasks)} 个`))),Q.degraded===!0?G("div",{className:`codex-stats-diagnostic ${Q.state}`,"data-testid":"codex-stats-diagnostic"},G("b",null,U),G("span",null,F),u?.source?G("code",null,`source=${String(u.source)}`):null):null,G("div",{className:`codex-stats-chart ${j?"has-data":"no-data"}`,"data-testid":"codex-stats-chart","data-empty":j?"false":"true",onMouseLeave:()=>w(null)},G("svg",{viewBox:`0 0 ${di} ${vq}`,preserveAspectRatio:"none",role:"img","aria-label":"Code Queue daily task statistics"},G("line",{className:"axis",x1:li,x2:di-li,y1:O3,y2:O3}),G("line",{className:"grid",x1:li,x2:di-li,y1:Z_+_7/2,y2:Z_+_7/2}),G("line",{className:"grid",x1:li,x2:di-li,y1:Z_,y2:Z_}),G("polyline",{className:"stat-line tasks",points:u7(n,"executedTasks",_)}),G("polyline",{className:"stat-line retry",points:u7(n,"retryAttempts",$)}),G("polyline",{className:"stat-line duration",points:u7(n,"avgDurationMs",r)}),Z?G("g",{className:"stat-cursor-layer","data-testid":"codex-stats-active-point"},G("line",{className:"stat-cursor",x1:Z.x,x2:Z.x,y1:Z_,y2:O3}),G("circle",{className:`stat-point-active ${Z.className}`,cx:Z.x,cy:Z.y,r:8})):null,G("g",{className:"stat-point-layer"},Y)),Z?G("div",{className:"codex-stats-tooltip active",style:X,"data-testid":"codex-stats-tooltip"},G("b",null,n1(Z.row?.date)),G("span",null,`${Z.label} · ${Z.valueLabel}`),G("code",null,`${Vl(Z.row?.executedTasks)} exec / ${Vl(Z.row?.retryAttempts)} retry / ${rn(Z.row?.avgDurationMs??void 0)}`)):null,!j?G("div",{className:"codex-stats-chart-empty","data-testid":"codex-stats-empty"},G("strong",null,U),G("span",null,N)):null,G("div",{className:"codex-stats-legend"},G("span",{className:"tasks"},"执行任务"),G("span",{className:"retry"},"重试次数"),G("span",{className:"duration"},"平均耗时")),G("div",{className:"codex-stats-scale"},G("span",null,n1(n[0]?.date)),G("span",null,q.join(" · ")||"暂无峰值"),G("span",null,n1(n.at(-1)?.date))),G("div",{className:`codex-stats-focus ${Z?"active":""}`,"data-testid":"codex-stats-focus"},Z?G(B3.default.Fragment,null,G("div",null,G("strong",null,n1(Z.row?.date)),G("span",null,`${Z.label} · ${Z.valueLabel}`)),G("div",{className:"codex-stats-focus-metrics"},G("code",null,`${Vl(Z.row?.executedTasks)} exec`),G("code",null,`${Vl(Z.row?.retryAttempts)} retry`),G("code",null,rn(Z.row?.avgDurationMs??void 0)))):G("span",null,N))),G("div",{className:"codex-stats-summary-grid"},G("article",null,G("span",null,"今日执行"),G("strong",null,String(Vl(y.executedTasks))),G("code",null,n1(y.date))),G("article",null,G("span",null,"今日重试"),G("strong",null,String(Vl(y.retryAttempts))),G("code",null,`累计 ${Vl(i.retryAttempts)}`)),G("article",null,G("span",null,"平均耗时"),G("strong",null,rn(i.avgDurationMs??void 0)),G("code",null,`${Vl(i.durationSamples)} samples`))),G("div",{className:"codex-stats-daily-list","data-testid":"codex-stats-daily-list"},n.length===0?G("div",{className:`codex-stats-daily-row empty ${Q.state}`,"data-testid":"codex-stats-day-empty"},G("span",null,U),G("b",null,F),G("b",null,"--"),G("code",null,Q.state==="empty"?"true empty":"diagnostic")):n.slice(-7).map((t)=>G("div",{key:String(t?.date||""),className:`codex-stats-daily-row ${c===String(t?.date||"")?"active":""}`,"data-testid":`codex-stats-day-${String(t?.date||"unknown")}`},G("span",null,n1(t?.date)),G("b",null,`${Vl(t?.executedTasks)} exec`),G("b",null,`${Vl(t?.retryAttempts)} retry`),G("code",null,rn(t?.avgDurationMs??void 0))))))}function pB({task:u,queueRows:l,busy:f,onMove:n}){let i=String(u?.id||""),y=H_(u),[_,$]=au(y);_n(()=>{$(y)},[i,y]);let r=!i||f||["running","judging","retry_wait"].includes(String(u?.status||""));return G("div",{className:"codex-task-move-control","data-testid":"codex-task-queue-move-control"},G("label",null,"任务 queue",G("select",{value:_,disabled:!i||f,onChange:(j)=>$(String(j.target.value||y)),"data-testid":"codex-task-queue-move-select"},l.map((j)=>G("option",{key:String(j?.id||""),value:String(j?.id||"")},Z3(j))))),G("button",{type:"button",className:"ghost-btn",disabled:r||_===y,onClick:()=>n(_),title:r?"运行中 / judging / retry_wait 的任务不能移动;请先打断或等当前 turn 结束":"移动已创建任务到另一个 queue","data-testid":"codex-task-queue-move-button"},"移动"))}function dq(u,l=4){let f=(Array.isArray(u)?u:[]).map((i)=>String(i||"").trim()).filter(Boolean);if(f.length===0)return"--";let n=f.slice(0,l).join(" / ");return f.length>l?`${n} +${f.length-l}`:n}function mB({task:u,loading:l,onLoadPromptPart:f,testId:n="codex-initial-prompt-full",textTestId:i="codex-initial-prompt-full-text",baseTextTestId:y="codex-initial-prompt-base"}){let _=Q7(u),$=b8(u),r=x8(u).trimEnd(),j=String($.full?.text||""),J=fB(u),Q=Number(_.promptChars||u?.promptChars||j.length),U=Number(_.basePromptLines||ei(r)),F=Number(_.promptLines||ei(j));return G("section",{className:"codex-progressive-card codex-progressive-prompt","data-testid":"codex-progressive-prompt"},G("div",{className:"codex-progressive-card-head"},G("span",{className:"codex-output-channel"},"Prompt"),G("strong",null,"Submitted prompt / 原始用户 prompt"),G("code",null,`${U||ei(r)} lines / ${r.length} chars`)),G("pre",{className:"codex-prompt-full","data-testid":y},r||"空 prompt"),J?G("details",{className:"codex-reference-injection codex-progressive-full-prompt","data-testid":n,onToggle:(N)=>{if(N.currentTarget?.open&&!j)f?.("full")}},G("summary",null,G("span",null,"引用注入已折叠,点击按需拉取最终进入 Code agent 的完整 prompt"),G("code",null,j?`${F||ei(j)} lines / ${j.length} chars`:`${Number.isFinite(Q)&&Q>0?Q:"--"} chars`)),G("pre",{className:"codex-prompt-full codex-prompt-final-full","data-testid":i},j||(l?"正在按需拉取完整 prompt...":"展开后将只请求 full prompt,不拉取完整 transcript。"))):null)}function wL({task:u,attempt:l,attemptIndex:f,loading:n,onLoadSteps:i,onLoadStep:y,testId:_="codex-execution-summary"}){let $=UB(QL(u,f)),r=NB(oV(u,l)),j=l?bV(u,l):U7(u),J=y7(u),Q=R8(u,f),U=An(j?.errorCount),F=_L($.length>0?$.length:null,l?.stepCount,l?.execution?.stepCount,r.traceLineCount,r.stepCount,l?.outputCount),N=An(j?.stepCount??j?.llmStepCount),L=N??F,w=An(j?.readCount),W=An(j?.editCount),K=An(j?.runCount),q=N??F,z=N!==null?"oa-event-flow":F!==null?"raw-trace":fi(u)?"syncing":"unavailable",Z=L===null?z==="syncing"?"sync":"N/A":String(L),T=q===null?z==="syncing"?"sync":"N/A":`${q}${z==="raw-trace"?" raw":""}`,c=z==="oa-event-flow"?"STEP 来自 OA Event Flow 统计中心":z==="raw-trace"?"OA STEP 统计不可用,当前显示 raw trace fallback 行数":z==="syncing"?"STEP 统计同步中;展开后会按需读取当前 attempt trace":"当前 attempt 没有可用 STEP 统计",X=Array.isArray(r.editedFiles)?r.editedFiles:[],S=Array.isArray(r.commands)?r.commands:[],Y=F7(l,f)?` · ${String(l?.label||"recovered thread execution")}`:f?` #${f}`:"",t=dV(u,l,f,r),m=`最近更新: ${H3(t)}`,V=uB(u,l,f);return G("details",{className:`codex-progressive-card codex-execution-summary ${V?"running":""}`,"data-testid":_,"data-attempt-index":g8(f),"data-running":V?"true":"false",onToggle:(D)=>{if(D.currentTarget?.open&&!Q)i?.(f)}},G("summary",null,G("div",{className:"codex-progressive-card-head"},G("span",{className:"codex-output-channel"},"Summary"),G("strong",null,`执行过程摘要${Y}`),V?G("span",{className:"codex-summary-running-pill","data-testid":`${_}-running`},"执行中"):null,G("code",{title:`${t?`最近更新: ${Hu(t)}`:m};${c}`},`${rn(r.durationMs??r.totalElapsedMs)} / ${Z} tools / ${m}`)),G("div",{className:"codex-execution-digest"},G("span",{title:"来自 OA Event Flow 统计中心"},`read ${w===null?"--":w}`),G("span",{title:"来自 OA Event Flow 统计中心"},`edit ${W===null?"--":W}`),G("span",{title:"来自 OA Event Flow 统计中心"},`run ${K===null?"--":K}`),G("span",{title:c,"data-testid":`${_}-step-count`,"data-step-state":z},`STEP ${T}`),U!==null&&U>0?G("span",{className:"codex-execution-error-pill","data-testid":`${_}-error-count`},`Error ${U}`):null)),G("div",{className:"codex-execution-digest expanded"},G("span",null,`修改文件:${dq(X,6)}`),G("span",null,`执行命令:${dq(S,4)}`)),$.length===0?G("div",{className:"codex-output-empty"},n?"正在按需拉取步骤 summary...":"展开后将只请求执行步骤 summary,不拉取单步骤全量。"):G("div",{className:"codex-trace-step-list"},$.map((D)=>{let M=String(D?.seq??""),I=J[M],O=Array.isArray(D?.summaryLines)?D.summaryLines.slice(0,4):[],C=O.find((g)=>String(g||"").trim().length>0);return G("details",{key:M||`${D?.title}-${D?.at}`,className:`codex-trace-step ${String(D?.kind||"message")} ${yB(D)?"error":""}`,"data-testid":`codex-trace-step-${M||"unknown"}`,onToggle:(g)=>{if(g.currentTarget?.open&&!I)y?.(D?.seq)}},G("summary",null,G("span",{className:"codex-output-channel"},xB(D?.kind)),G("strong",null,String(D?.title||"Trace step")),D?.status?G("code",null,String(D.status)):null,C?G("span",{className:"codex-trace-step-inline-summary",title:String(C)},String(C)):null,G("time",null,Hu(D?.at))),G("div",{className:"codex-trace-step-summary"},O.length>0?O.map((g,a)=>G("pre",{key:`${M}-${a}`},String(g||""))):G("span",null,"无 summary")),I?.line?G(S8,{items:[I.line],autoScroll:!1,loading:!1,hasDetail:!0,emptyText:"无步骤详情",testId:`codex-trace-step-detail-${M||"unknown"}`,className:"codex-transcript codex-step-detail-transcript",collapseTools:!1}):G("div",{className:"codex-output-empty"},n?"正在按需拉取这个步骤的全量数据...":"展开后将只请求这个单步骤的全量数据。"))})))}function xB(u){let l=String(u||"");if(l==="ran")return"Ran";if(l==="explored")return"Explored";if(l==="edited")return"Edited";if(l==="error")return"Error";if(l==="system")return"System";return"Message"}function ZL({task:u,attempt:l,attemptIndex:f,testId:n="codex-final-response"}){let i=eV(u,l);if(i.length===0)return null;let y=Number(l?.finalResponseChars||i.length),_=f?` #${f}`:"";return G("section",{className:"codex-progressive-card codex-final-response","data-testid":n,"data-attempt-index":g8(f)},G("div",{className:"codex-progressive-card-head"},G("span",{className:"codex-output-channel"},"Final"),G("strong",null,`最终 response${_}`),G("code",null,`${Number.isFinite(y)?y:i.length} chars`)),G(L_,{markdown:i,className:"codex-transcript-body codex-markdown",testId:`${n}-markdown`}))}function EL({task:u,attempt:l,attemptIndex:f,testId:n="codex-progressive-judge"}){let i=jL(u,l,f);if(!i?.decision)return null;let y=f?` #${f}`:"";return G("section",{className:"codex-progressive-card codex-progressive-judge","data-testid":n,"data-attempt-index":g8(f)},G("div",{className:"codex-progressive-card-head"},G("span",{className:"codex-output-channel"},"Judge"),G("strong",null,`完成判定${y}`),G("code",null,`${i.decision} ${Math.round(Number(i.confidence||0)*100)}%`)),G("div",{className:"codex-judge-card","data-testid":`${n}-card`},G(uy,{status:i.decision},i.decision),G("strong",null,`${Math.round(Number(i.confidence||0)*100)}% confidence`),G("p",{"data-testid":`${n}-reason`},i.reason||"--"),G(AL,{judge:i,testId:`${n}-failure-details`}),i.continuePrompt?G("pre",{"data-testid":`${n}-continue-prompt`},String(i.continuePrompt||"")):null))}function RB({task:u,attempt:l,attemptIndex:f,loading:n,onLoadPromptPart:i,testId:y="codex-judge-feedback-prompt"}){let _=lB(u,l,f);if(_===null)return null;let $=JL(f),j=b8(u)[$],J=String(j?.text||"").trimEnd(),Q=String(_.preview||_.text||"").trimEnd(),U=J||String(_.text||"").trimEnd(),F=Number(j?.chars||_.chars||U.length||Q.length),N=Number(j?.lines||_.lines||ei(U||Q)),L=j?.forAttempt||_.forAttempt||Number(f||0)+1;return G("details",{className:"codex-progressive-card codex-judge-feedback-prompt","data-testid":y,"data-attempt-index":g8(f),onToggle:(w)=>{if(w.currentTarget?.open&&!J)i?.("feedback",f)}},G("summary",null,G("div",{className:"codex-progressive-card-head"},G("span",{className:"codex-output-channel"},"Prompt"),G("strong",null,`judge feedback prompt #${f} -> #${L}`),G("code",null,`${N||"--"} lines / ${Number.isFinite(F)?F:Q.length} chars`)),G("p",{className:"codex-feedback-preview","data-testid":`${y}-preview`},Q||"展开后按需拉取 judge feedback prompt。")),G("pre",{className:"codex-prompt-full codex-feedback-full","data-testid":`${y}-text`},U||(n?"正在按需拉取 judge feedback prompt...":"展开后将只请求这一次 judge feedback prompt。")))}function bB({task:u,attempt:l,position:f,loading:n,onLoadPromptPart:i,onLoadSteps:y,onLoadStep:_}){let $=FB(l,f),r=N7(u,$),j=f===0&&!r,J=F7(l,$),Q=J?String(l?.label||"Recovered thread execution"):`Attempt ${$}`;return G("section",{className:"codex-attempt-cycle","data-testid":`codex-attempt-cycle-${$}`},G("div",{className:"codex-attempt-cycle-head"},G("span",{className:"codex-output-channel"},Q),G("strong",null,String(l?.mode||($<=1?"initial":"retry"))),l?.terminalStatus?G(uy,{status:l.terminalStatus},l.terminalStatus):null,G("code",null,`${Hu(l?.startedAt)} -> ${Hu(l?.finishedAt)}`)),G(wL,{task:u,attempt:l,attemptIndex:$,loading:n,onLoadSteps:y,onLoadStep:_,testId:r?"codex-execution-summary-current":j?"codex-execution-summary":`codex-execution-summary-attempt-${$}`}),J?null:G(ZL,{task:u,attempt:l,attemptIndex:$,testId:r?"codex-final-response-current":j?"codex-final-response":`codex-final-response-attempt-${$}`}),J?null:G(EL,{task:u,attempt:l,attemptIndex:$,testId:r?"codex-progressive-judge-current":j?"codex-progressive-judge":`codex-progressive-judge-attempt-${$}`}),J?null:G(RB,{task:u,attempt:l,attemptIndex:$,loading:n,onLoadPromptPart:i,testId:r?"codex-judge-feedback-prompt-current":j?"codex-judge-feedback-prompt":`codex-judge-feedback-prompt-attempt-${$}`}))}function kB({task:u,loading:l,onLoadPromptPart:f,onLoadSteps:n,onLoadStep:i}){if(!u)return G(T_,{title:"未选择任务",text:"从左侧队列选择任务,或提交新 Codex 任务。"});let y=aV(u);return G("div",{className:"codex-transcript codex-progressive-trace","data-testid":"codex-output"},l&&!qf(u)?G("div",{className:"codex-output-empty"},"正在加载 Trace Summary..."):null,G(mB,{task:u,loading:l,onLoadPromptPart:f}),y.length>0?y.map((_,$)=>G(bB,{key:`${_?.index||$+1}-${_?.startedAt||$}`,task:u,attempt:_,position:$,loading:l,onLoadPromptPart:f,onLoadSteps:n,onLoadStep:i})):[G(wL,{key:"execution",task:u,loading:l,onLoadSteps:n,onLoadStep:i}),G(ZL,{key:"final",task:u}),G(EL,{key:"judge",task:u})])}function hB({task:u}){let l=MV(u);if(!u||l.length===0)return G(T_,{title:"暂无原始消息",text:"原始 Codex app-server 消息会保留在任务 JSON 中。"});return G("details",{className:"codex-raw-output"},G("summary",null,`原始 messages (${l.length})`),G("div",null,l.map((f)=>G("article",{key:`${f.seq}-${f.channel}`,className:`codex-output-line ${f.channel||"system"}`},G("div",{className:"codex-output-meta"},G("span",{className:"codex-output-channel"},KB(String(f.channel||"system"))),G("span",null,Hu(f.at)),f.method?G("code",null,f.method):null),G("pre",null,String(f.text||""))))))}function IB({task:u}){let l=CV(u).slice().reverse();if(l.length===0)return G(T_,{title:"尚无 attempt",text:"任务开始运行后,这里会记录 Codex 终态、传输中断和 stderr tail。"});return G("div",{className:"table-wrap codex-attempt-table"},G("table",null,G("thead",null,G("tr",null,G("th",null,"#"),G("th",null,"模式"),G("th",null,"终态"),G("th",null,"传输"),G("th",null,"退出"),G("th",null,"完成时间"))),G("tbody",null,l.map((f)=>G("tr",{key:`${f.index}-${f.startedAt}`},G("td",null,f.index),G("td",null,f.mode),G("td",null,G(uy,{status:f.terminalStatus||"unknown"},f.terminalStatus||"unknown")),G("td",null,f.transportClosedBeforeTerminal?G(uy,{status:"failed"},"closed-before-terminal"):G(uy,{status:"succeeded"},"normal")),G("td",null,`code=${f.appServerExitCode??"--"} signal=${f.appServerSignal??"--"}`),G("td",null,Hu(f.finishedAt)))))))}function HL({microservices:u,onRaw:l,apiBaseUrl:f="/api",initialTasksData:n=null,standalone:i=!1}){let y=u.find((B)=>B.id==="code-queue")||null,_=aq(n),$=String(_?.id||""),r=new Map;if(_!==null&&$.length>0)r.set($,{task:_,maxSeq:w3(Array.isArray(_.transcript)?_.transcript:[]),complete:Boolean(_._transcriptComplete),completeUpdatedAt:_._transcriptComplete?String(_.updatedAt||""):""});let j=typeof performance>"u"?0:performance.now(),J=hl($),Q=hl(0),U=hl(0),F=hl(0),N=hl(!1),L=hl(!1),w=hl(!1),W=hl(null),K=hl(new Map),q=hl(new Map),z=hl(new Map),Z=hl(new Map),T=hl(new Set),c=hl(null),X=hl(null),S=hl(!1),p=hl(!1),Y=hl(Boolean(n)),t=hl(new Map),m=hl(new Set),V=hl(r),D=hl(n),[M,I]=au(null),[O,C]=au(n),[g,a]=au(ll(n?.statistics)),[iu,Au]=au($),[R,x]=au(_),[fu,yu]=au(!1),[Ju,Vu]=au(""),[Lu,Bu]=au(null),[b,o]=au(!1),[nu,wu]=au(!1),e=n?.queue||{},zu=String(e?.mainProviderId||e?.defaultProviderId||"D601").trim()||"D601",[v,$u]=au(""),[Wu,Du]=au(""),[ku,$l]=au("default"),[gu,Df]=au(y1),[j0,lf]=au(!1),[J0,Sf]=au(""),[Nu,eu]=au(zu),[gl,Ru]=au("default"),[Af,Pf]=au("gpt-5.5"),[jf,sl]=au(E3(e,"default",zu)||"/workspace"),[T0,xn]=au(99),[sf,$$]=au(1),[z1,G1]=au(!1),[d,Su]=au(!1),[xu,yl]=au(""),[Kl,ol]=au(""),[jl,ff]=au(""),[Rn,vA]=au(!0),[r$,A$]=au(()=>typeof window>"u"?!0:window.matchMedia(OV).matches),[Hl,mr]=au(!1),[gA,Fl]=au(""),[kQ,Pl]=au(""),{addNotification:wf}=bf(),[Zy,xr]=au(""),[j$,Rr]=au(""),[J$,br]=au(!1),[kr,w1]=au(null),[Ey,Hy]=au(!1),[af,V0]=au(n?{phase:"complete",taskId:$,queueMs:0,detailMs:0,totalMs:j,chunks:_?1:0,transcriptRows:Array.isArray(_?.transcript)?_.transcript.length:0,partial:Boolean(n?.selected?.hasMore||G3(_)),completedAt:new Date}:null),[hr,Oy]=au(n?new Date:null),[Q$,U$]=au(!1),Fn=qn(ml(O)),Ir=Fn.filter(i1),cl=O?.queue||M?.body?.queue||M?.queue||{},sA=ZV(cl,M),aA=g||wB(O,cl),vr=Tn(O),v0=Cq(cl,ku),Ti=String(ku||"default").trim()||"default",Z1=v0.filter((B)=>String(B?.id||"")!==Ti),Ty=E_(v0,gu),E1=Number((hf(gu)?cl?.total:Ty?.total)??vr.total??Fn.length),N$=w_(cl),hQ=hf(gu)?N$:[String(E_(v0,gu)?.activeTaskId||"")].filter(Boolean),bn=pq(cl,v0,gu,Fn),IQ=hf(gu)?a9(cl):a9(Ty||{}),gr=a9(cl),sr=zB(gr),bZ=Math.max(GB(gr),N$.length),kZ=Vl((hf(gu)?cl?.unreadTerminal:Ty?.unreadTerminal)??Ir.length),Vy=O?Ir.length:kZ,ar=hf(gu)?"All queues":i7(Ty||{id:gu,name:gu}),By=n7(Ju),Q0=By.length>0,vQ=Q0?qn(ml(Lu)):[],oA=Tn(Lu),Wn=Q0?vQ:Fn,gQ=Wn.filter(i1),hZ=Wn.filter((B)=>!$n(B)).sort(GV),IZ=Wn.filter((B)=>$n(B)&&!i1(B)),sQ=Q0?oA:vr,cy=Q0?Number(oA.total??vQ.length):E1,aQ=sQ.hasMore===!0&&String(sQ.nextBeforeId||"").length>0,dA=Q0?nu:Q$,vZ=y?LV(y):{},gZ=y?KV(y):{},eA=Sq(()=>pV(v),[v]),kn=Sq(()=>{let B=Rq(sf);return eA.flatMap((P)=>Array.from({length:B},()=>mV(P,Wu)))},[eA,sf,Wu]),F$=kn.length,oQ=F$>1&&!z1,sZ=d||Hl||F$===0||oQ,dQ=cB(cl,Af),or=XB(cl,Nu),eQ=YB(cl,gl),uU=E3(cl,gl,Nu),aZ=Array.isArray(kr?.workdirs)?kr.workdirs:[],lU=DB(cl,aZ,Nu,gl,jf),u2=lU.some((B)=>B.source==="saved"&&O_(B.path)===O_(jf)),l2=R?.id&&R?.activeTurnId&&String(R?.status)==="running",oZ=R?.id&&!["succeeded","failed","canceled"].includes(String(R?.status||"")),dZ=R?.id&&["succeeded","failed","canceled"].includes(String(R?.status||"")),Xy=R?.id&&WL(R);function Mf(B){let P=typeof B==="function"?B(D.current):B;D.current=P;let s=ll(P?.statistics);if(s)a(s);return C(P),P}async function fU(B=gu){if(!y)return;try{let P=await cV(f,B),s=ll(P?.statistics)||ll(P?.stats)||ll(P);if(s)a(s);if(P?.queue)Mf((lu)=>lu?{...lu,queue:P.queue}:{ok:!0,queue:P.queue,tasks:[],pagination:{returned:0,total:0,hasMore:!1}})}catch(P){a(Iq(P))}}function eZ(B,P,s=!0){let lu=Array.from(new Set(B.map((Uu)=>String(Uu||"")).filter(Boolean)));for(let Uu of lu)if(t.current.set(Uu,P),s)m.current.add(Uu);return lu}function nU(B){for(let P of B.map((s)=>String(s||"")).filter(Boolean))t.current.delete(P),m.current.delete(P)}function dr(B){let P=String(B?.id||""),s=P?t.current.get(P):void 0;if(!s)return B;if(String(B?.status||"").length>0&&!$n(B))return t.current.delete(P),m.current.delete(P),B;return{...B,readAt:B?.readAt||s,terminalUnread:!1}}function f2(B){let P=String(B?.id||"");return P.length>0&&m.current.has(P)&&$n(B)}function qn(B,P=!0){let s=[];for(let lu of Array.isArray(B)?B:[]){let Uu=dr(lu);if(P&&f2(Uu))continue;s.push(Uu)}return s}function uE(B,P=!0){if(!B||!Array.isArray(B?.tasks))return B;let s=qn(ml(B),P),lu=Tn(B);return{...B,tasks:s,pagination:B.pagination?{...lu,returned:s.length}:B.pagination}}function n2(B,P){return hf(P)||H_(B)===P}function i2(B){let P=By.toLowerCase();if(P.length===0)return!0;return[B?.id,B?.status,B?.queueId,B?.providerId,B?.model,B?.cwd,B?.displayPrompt,B?.basePrompt,B?.prompt,m8(B?.displayPromptPreview),m8(B?.basePromptPreview),m8(B?.promptPreview),B?.finalResponse,B?.lastError?.message].map((lu)=>String(lu||"").toLowerCase()).join(` -`).includes(P)}function lE(B,P){let s=B.filter((Yu)=>String(Yu?.id||"").length>0);if(s.length===0&&!P)return;let lu=s[0]||null,Uu=String(lu?.id||""),Tu=s.filter((Yu)=>n2(Yu,gu)),Ou=Tu.filter(i2),hu=String(P?.activeTaskId||w_(P)[0]||Uu||bn||"");for(let Yu of s){let Cu=String(Yu?.id||"");if(!Cu)continue;let Iu=Array.isArray(Yu?.transcript)?Yu.transcript:[];V.current.set(Cu,{...V.current.get(Cu)||{},task:{...Yu,_summaryLoaded:!0,_detailLoaded:Iu.length>0,_transcriptComplete:!1,_transcriptPreview:!1},maxSeq:w3(Iu),complete:!1,completeUpdatedAt:""})}if(Mf((Yu)=>{if(!Yu&&(Tu.length===0||!P))return Yu;let Cu=ml(Yu),Iu=qn(Vn([Cu,Tu],hu));return{...Yu||{},queue:P||Yu?.queue,tasks:Iu,pagination:Yu?.pagination?{...Tn(Yu),returned:Iu.length}:Yu?.pagination}}),Q0)Bu((Yu)=>{if(!Yu||Ou.length===0)return Yu;let Cu=qn(Vn([ml(Yu),Ou],hu));return{...Yu,queue:P||Yu.queue,tasks:Cu,pagination:Yu.pagination?{...Tn(Yu),returned:Cu.length}:Yu.pagination}});if(lu&&n2(lu,gu)&&i2(lu))F.current+=1,J.current=Uu,Au(Uu),x(V.current.get(Uu)?.task||lu),yu(!1),V0({phase:"complete",taskId:Uu,queueMs:0,detailMs:0,totalMs:0,chunks:1,transcriptRows:Array.isArray(lu?.transcript)?lu.transcript.length:0,partial:!0,completedAt:new Date});Oy(new Date)}function fE(B){let P=String(B||cl?.mainProviderId||"D601").trim()||"D601";eu(P),sl(E3(cl,gl,P)),w1(null),r2().catch((s)=>Fl(Yl(s,"加载工作目录失败")))}function nE(B){let P=String(B||"default").trim()||"default",s=Nu;if(P==="windows-native"){if(!or.find((Uu)=>Uu.id===Nu)?.supportsWindowsNativeCodex)s=String(or.find((Uu)=>Uu.supportsWindowsNativeCodex)?.id||Nu||"D601"),eu(s)}Ru(P),sl(E3(cl,P,s)),w1(null),r2().catch((lu)=>Fl(Yl(lu,"加载工作目录失败")))}function er(B,P,s=null,lu=null){let Uu=new Set(eZ(B,P));if(Uu.size===0&&lu===null&&s===null)return;Mf((Tu)=>{if(!Tu)return Tu;let Ou=ml(Tu).flatMap((hu)=>{let Yu=String(hu?.id||"");if(!Uu.has(Yu)){let Ul=dr(hu);return f2(Ul)?[]:[Ul]}let Cu=lu&&String(lu?.id||"")===Yu?lu:{},Iu={...hu,...Cu,readAt:P,terminalUnread:!1};return f2(Iu)?[]:[Iu]});return{...Tu,queue:s||Tu.queue,tasks:Uu.size>0?Vn([Ou],bn):Ou}});for(let Tu of Uu){let Ou=V.current.get(Tu);if(Ou?.task){let hu=lu&&String(lu?.id||"")===Tu?lu:{},Yu={...Ou.task,...hu,readAt:P,terminalUnread:!1};if(V.current.set(Tu,{...Ou,task:Yu}),J.current===Tu)x(Yu)}}}_n(()=>{G1(!1)},[v,sf,Wu]),_n(()=>{let B=n7(Ju);U.current+=1;let P=U.current;if(!y||B.length===0){Bu(null),o(!1),wu(!1),w.current=!1;return}o(!0),Bu(null);let s=window.setTimeout(()=>{(async()=>{try{let lu=await mq(f,gu,B);if(P!==U.current)return;Bu(uE(lu))}catch(lu){if(P===U.current)Bu(null),Fl(Yl(lu,"搜索 Codex tasks 失败"))}finally{if(P===U.current)o(!1)}})()},240);return()=>window.clearTimeout(s)},[y?.id,f,gu,Ju]),_n(()=>{ol(R?x8(R):""),ff(Array.isArray(R?.referenceTaskIds)?R.referenceTaskIds.join(" "):"")},[iu]);function g0(B,P,s){let lu=V.current.get(B)||{},Uu=lu.task||{},Tu=Array.isArray(Uu.transcript)?Uu.transcript:[],Ou=sq(Uu,P),hu=Object.prototype.hasOwnProperty.call(P,"transcript")?l7(Tu,Array.isArray(P.transcript)?P.transcript:[]):Tu,Yu={...Uu,...Ou,transcript:hu,output:Array.isArray(Ou.output)?$7(Uu,Ou,"output"):Array.isArray(Uu.output)?Uu.output:[],events:Array.isArray(Ou.events)?$7(Uu,Ou,"events"):Array.isArray(Uu.events)?Uu.events:[]},Cu=dr(Yu),Iu=String(Cu?.updatedAt||""),Ul=Boolean(P._transcriptComplete)&&$n(Cu),nf=Boolean(lu.complete)&&$n(Cu)&&String(lu.completeUpdatedAt||"")===Iu,rl=Ul||nf,Jf={...lu,task:Cu,maxSeq:w3(hu),complete:rl,completeUpdatedAt:rl?Iu:""};if(V.current.set(B,Jf),s===F.current&&J.current===B)x(Cu);return Jf}async function H1(B,P=!1,s,lu){if(!y||!B)return;let Tu=V.current.get(B)?.task;if(!P&&C8(Tu))return;let Ou=B,hu=K.current.get(Ou);if(hu){if(P||!C8(Tu))hu.refreshAfter=!0;return hu.promise}let Yu=F.current,Cu=performance.now();if(J.current===B)yu(!0);let Iu={promise:Promise.resolve(),refreshAfter:!1},Ul=(async()=>{try{let nf=await XV(f,B);if(Yu!==F.current||J.current!==B)return;let rl=nf?.summary||{},Jf=String(rl.updatedAt||"");g0(B,{id:B,status:rl.status,updatedAt:Jf,startedAt:rl.startedAt,finishedAt:rl.finishedAt,currentAttempt:rl.currentAttempt,maxAttempts:rl.maxAttempts,finalResponse:rl.finalResponse,lastJudge:rl.lastJudge,lastError:rl.lastError,attempts:Array.isArray(rl.attempts)?rl.attempts:[],stepCount:rl.stepCount,llmStepCount:rl.llmStepCount,traceStats:rl.traceStats,statsSource:rl.statsSource,timing:rl.timing,_traceSummary:rl,_traceSummaryLoaded:!0,_traceSummaryUpdatedAt:Jf,_detailLoaded:!0},Yu),V0({phase:"complete",taskId:B,queueMs:lu??0,detailMs:performance.now()-Cu,totalMs:s===void 0?performance.now()-Cu:performance.now()-s,chunks:1,transcriptRows:Number(rl?.execution?.traceLineCount||rl?.execution?.stepCount||0),partial:!1,completedAt:new Date})}finally{let nf=Boolean(Iu.refreshAfter&&J.current===B&&!C8(V.current.get(B)?.task));if(K.current.delete(Ou),Yu===F.current&&J.current===B)yu(!1);if(nf)window.setTimeout(()=>{H1(B,!0).catch((rl)=>Fl(Yl(rl,"自动刷新 Trace Summary 失败")))},0)}})();Iu.promise=Ul,K.current.set(Ou,Iu),await Ul}async function iE(B,P=null){let s=J.current;if(!y||!s||!B)return;let lu=V.current.get(s)?.task,Uu=b8(lu),Tu=B==="feedback"||B==="judge-feedback"?JL(P):B;if(Uu[Tu]?.text)return;let Ou=`${s}:${Tu}`,hu=q.current.get(Ou);if(hu)return hu;let Yu=F.current;if(J.current===s)yu(!0);let Cu=(async()=>{try{let Iu=await YV(f,s,B,P);if(Yu!==F.current||J.current!==s)return;let Ul=V.current.get(s)?.task,nf=b8(Ul);g0(s,{...B==="full"?{prompt:String(Iu?.text||""),promptChars:Number(Iu?.chars||0)}:{},_promptDetails:{...nf,[Tu]:Iu}},Yu)}finally{if(q.current.delete(Ou),Yu===F.current&&J.current===s)yu(!1)}})();q.current.set(Ou,Cu),await Cu}async function u6(B=null,P={}){let s=J.current;if(!y||!s)return;let lu=V.current.get(s)?.task,Uu=B===null||B===void 0||String(B).length===0?"":String(B),Tu=R8(lu,Uu||null),Ou=Boolean(P.force),hu=Boolean(P.incremental);if(Tu&&!Ou)return;let Yu=QL(lu,Uu||null),Cu=hu&&Yu.length>0?nB(Yu):0,Iu=`${s}:${Uu||"all"}:${Cu}`,Ul=z.current.get(Iu);if(Ul)return Ul;let nf=F.current;if(J.current===s)yu(!0);let rl=(async()=>{try{let Jf=await tV(f,s,Cu,500,Uu||null);if(nf!==F.current||J.current!==s)return;let Ln=Array.isArray(Jf?.steps)?Jf.steps:[],hn=Cu>0?iB(Yu,Ln):Ln;if(Uu){let O1=V.current.get(s)?.task,Yy=ll(O1?._traceStepsByAttempt)||{},s0=ll(O1?._traceStepsLoadedByAttempt)||{},B0=ll(O1?._traceStepsNextAfterSeqByAttempt)||{};g0(s,{_traceStepsByAttempt:{...Yy,[Uu]:hn},_traceStepsLoadedByAttempt:{...s0,[Uu]:!0},_traceStepsNextAfterSeqByAttempt:{...B0,[Uu]:Jf?.nextAfterSeq}},nf)}else g0(s,{_traceSteps:hn,_traceStepsLoaded:!0,_traceStepsHasMore:Boolean(Jf?.hasMore),_traceStepsNextAfterSeq:Jf?.nextAfterSeq},nf)}finally{if(z.current.delete(Iu),nf===F.current&&J.current===s)yu(!1)}})();z.current.set(Iu,rl),await rl}async function yE(B){let P=J.current,s=String(B??"");if(!y||!P||s.length===0)return;let lu=V.current.get(P)?.task;if(y7(lu)[s]?.line)return;let Tu=`${P}:${s}`,Ou=Z.current.get(Tu);if(Ou)return Ou;let hu=F.current;if(J.current===P)yu(!0);let Yu=(async()=>{try{let Cu=await DV(f,P,B);if(hu!==F.current||J.current!==P)return;let Iu=V.current.get(P)?.task,Ul=y7(Iu);g0(P,{_traceStepDetails:{...Ul,[s]:Cu}},hu)}finally{if(Z.current.delete(Tu),hu===F.current&&J.current===P)yu(!1)}})();Z.current.set(Tu,Yu),await Yu}function _E(B){if(J.current!==B)return;let P=V.current.get(B)?.task;if(!P)return;if(R8(P,null))u6(null,{force:!0,incremental:!0}).catch((lu)=>Fl(Yl(lu,"增量刷新 Trace Steps 失败")));let s=ll(P?._traceStepsLoadedByAttempt)||{};for(let lu of Object.keys(s).filter((Uu)=>s[Uu]))u6(lu,{force:!0,incremental:!0}).catch((Uu)=>Fl(Yl(Uu,"增量刷新 Attempt Trace Steps 失败")))}async function Om(B,P,s){if(!y||!B)return;let lu=performance.now(),Uu=F.current,Tu=V.current.get(B);if(Tu?.task){if(x(Tu.task),yu(G3(Tu.task)||!Tu.complete),!G3(Tu.task)&&Tu.complete&&$n(Tu.task)&&String(Tu.completeUpdatedAt||"")===String(Tu.task?.updatedAt||"")){V0({phase:"complete",taskId:B,queueMs:s??0,detailMs:0,totalMs:P===void 0?0:performance.now()-P,chunks:0,transcriptRows:Array.isArray(Tu.task.transcript)?Tu.task.transcript.length:0,completedAt:new Date});return}}else yu(!0);let Ou=W.current;if(Ou?.taskId===B&&Ou.token===Uu)return Ou.promise;let hu=(async()=>{try{let Yu=await tl(Dl(f,`/api/tasks/${encodeURIComponent(B)}?meta=1`));if(Uu!==F.current||J.current!==B)return;let Cu=V.current.get(B),Iu=Array.isArray(Cu?.task?.transcript)?Cu.task.transcript:[],Ul=Yu?.task||{},nf=Boolean(Cu?.complete)&&String(Cu?.completeUpdatedAt||"")===String(Ul?.updatedAt||"");g0(B,{...Ul,summaryOnly:!1,_metaLoaded:!0,transcript:Iu,_detailLoaded:Iu.length>0,_transcriptComplete:nf},Uu);let rl=G3(Cu?.task)||Boolean(Cu?.task?._transcriptPreview),Jf=rl?0:Iu.length>0?oq(Iu):0,Ln=!rl&&Cu?.complete&&$n(Ul)&&String(Cu?.completeUpdatedAt||"")===String(Ul?.updatedAt||"")?w3(Iu):Jf,hn=!0,O1=0,Yy=Iu.length;while(hn){let s0=await tl(Dl(f,`/api/tasks/${encodeURIComponent(B)}/transcript?afterSeq=${encodeURIComponent(String(Ln))}&limit=${FV}&fullText=1`));if(Uu!==F.current||J.current!==B)return;let B0=V.current.get(B),ty=Array.isArray(B0?.task?.transcript)?B0.task.transcript:[],Vi=l7(ty,Array.isArray(s0?.transcript)?s0.transcript:[]);O1+=1,Yy=Vi.length;let Rl=Boolean(!s0?.hasMore);if(g0(B,{status:s0?.status||Ul.status,updatedAt:s0?.updatedAt||Ul.updatedAt,transcript:Vi,_detailLoaded:Rl||Vi.length>0,_transcriptComplete:Rl,_transcriptPreview:rl&&!Rl},Uu),hn=Boolean(s0?.hasMore),Ln=Number(s0?.nextAfterSeq??w3(Vi)),!hn)break;await new Promise((QU)=>window.setTimeout(QU,0))}V0({phase:"complete",taskId:B,queueMs:s??0,detailMs:performance.now()-lu,totalMs:P===void 0?performance.now()-lu:performance.now()-P,chunks:O1,transcriptRows:Yy,completedAt:new Date})}finally{if(W.current?.taskId===B&&W.current?.token===Uu)W.current=null;if(Uu===F.current&&J.current===B)yu(!1)}})();W.current={taskId:B,token:Uu,promise:hu},await hu}async function U0(B=J.current,P=!0,s=gu){if(!y)return;if(!P&&p.current)return;let lu=performance.now();if(P)p.current=!0;if(P)V0({phase:"loading",taskId:String(B||J.current||""),startedAt:new Date});let Uu=Q.current+1;Q.current=Uu;let Tu=String(B||J.current||""),Ou=Tu?V.current.get(Tu):null,hu=Array.isArray(Ou?.task?.transcript)?Ou.task.transcript:[],Yu=oq(hu),Cu=null,Iu=P&&Tu.length===0;if(Cu=Iu?await mq(f,s,""):await s9(f,Tu,Yu,s,"",!0,{stats:!1}),Uu!==Q.current){if(P)p.current=!1;return}let Ul=performance.now()-lu;I(M||{});let nf=Cu?.queue||{},rl=String(nf?.activeTaskId||w_(nf)[0]||""),Jf=Cu;Mf((bl)=>{let T1=ml(Cu),N0=ml(bl),c0=N0.length>0?Vn([N0,T1],rl):Vn([T1],rl),V1=qn(c0),l6=Tn(Cu),Bi=Tn(bl),j2=N0.length>T1.length&&(Bi.hasMore===!1||String(Bi.nextBeforeId||"").length>0),PE={...l6,...j2?{hasMore:Bi.hasMore,nextBeforeId:Bi.nextBeforeId}:{},returned:V1.length};return Jf={...Cu,tasks:V1,pagination:PE},Jf});let Ln=ml(Jf),hn=Cq(nf,ku),O1=pq(nf,hn,s,Ln),Yy=BV(hn,s,Ln),s0=Tu||J.current,B0=Jf?.selected||null,ty=B0?.task||null,Vi=Array.isArray(B0?.transcript)?B0.transcript:null,Rl=s0||O1||Yy||Ln[0]?.id||"";if(J.current!==Rl)F.current+=1;J.current=Rl,Au(Rl);let Dy=Ln.find((bl)=>bl.id===Rl);if(Dy){let bl=V.current.get(Rl);if(bl?.task)V.current.set(Rl,{...bl,task:{...Dy,...bl.task,status:Dy.status,updatedAt:Dy.updatedAt}})}if(Iu&&Dy){if(g0(Rl,{...Dy,_summaryLoaded:!1,transcript:[],_detailLoaded:!1,_transcriptComplete:!1,_transcriptPreview:!0},F.current),yu(!0),V0({phase:"complete",taskId:Rl,queueMs:Ul,detailMs:0,totalMs:performance.now()-lu,chunks:0,transcriptRows:0,partial:!0,completedAt:new Date}),Oy(new Date),P)p.current=!1;H1(Rl,!0).catch((bl)=>Fl(Yl(bl,"加载 Codex Trace Summary 失败"))),s9(f,Rl,0,s,"",!1).then((bl)=>{if(Uu!==Q.current)return;let T1=ml(bl),N0=aq(bl);if(T1.length>0)Mf((c0)=>{let V1=Vn([ml(c0),T1],rl);return{...c0,statistics:bl?.statistics||c0?.statistics,tasks:qn(V1)}});if(N0?.id===J.current){let c0=Array.isArray(N0.transcript)?N0.transcript:[];g0(N0.id,{...N0,transcript:c0,_summaryLoaded:!0,_detailLoaded:c0.length>0,_transcriptPreview:Boolean(bl?.selected?.preview)},F.current)}}).catch(()=>{});return}if(ty?.id===Rl&&Vi!==null){let bl=V.current.get(Rl),T1=Array.isArray(bl?.task?.transcript)?bl.task.transcript:[],N0=l7(T1,Vi),c0=Boolean(B0?.preview);if(g0(Rl,{...ty,_summaryLoaded:!0,transcript:N0,_detailLoaded:!B0?.hasMore||N0.length>0,_transcriptComplete:!c0&&!B0?.hasMore&&$n(ty),_transcriptPreview:c0},F.current),yu(!1),P)V0({phase:"complete",taskId:Rl,queueMs:Ul,detailMs:Math.max(0,performance.now()-lu-Ul),totalMs:performance.now()-lu,chunks:1,transcriptRows:N0.length,partial:Boolean(c0||B0?.hasMore||G3(ty)),completedAt:new Date});if(Oy(new Date),P)p.current=!1;H1(Rl,!1,P?lu:void 0,P?Ul:void 0).catch((V1)=>Fl(Yl(V1,"加载 Codex Trace Summary 失败"))),s9(f,Tu,Yu,s,"",!1).then((V1)=>{if(Uu!==Q.current)return;let l6=ml(V1);if(l6.length>0)Mf((Bi)=>{let j2=Vn([ml(Bi),l6],rl);return{...Bi,tasks:qn(j2)}})}).catch(()=>{});return}if(P)V0({phase:"session",taskId:Rl,queueMs:Ul,totalMs:Ul,startedAt:new Date(Date.now()-Ul)});if(Rl)H1(Rl,!0,P?lu:void 0,P?Ul:void 0).catch((bl)=>Fl(Yl(bl,"加载 Codex Trace Summary 失败")));else if(F.current+=1,x(null),yu(!1),P)V0({phase:"complete",taskId:"",queueMs:Ul,detailMs:0,totalMs:performance.now()-lu,chunks:0,transcriptRows:0,completedAt:new Date});if(Oy(new Date),P)p.current=!1;fU(s).catch((bl)=>a(Iq(bl)))}async function iU(){if(Q0){if(!y||nu||w.current)return;let P=String(oA.nextBeforeId||"");if(!P)return;w.current=!0,wu(!0),Fl("");try{let s=await xq(f,gu,P,uL,By),lu=ml(s),Uu=s?.queue||cl||{},Tu=String(Uu?.activeTaskId||w_(Uu)[0]||bn||"");Bu((Ou)=>{let hu=qn(Vn([ml(Ou),lu],Tu)),Yu=Tn(s);return{...Ou||{},queue:Uu,tasks:hu,pagination:{...Yu,returned:hu.length}}})}catch(s){Fl(Yl(s,"加载更多搜索结果失败"))}finally{w.current=!1,wu(!1)}return}if(!y||Q$||L.current)return;let B=String(Tn(O).nextBeforeId||"");if(!B)return;L.current=!0,U$(!0),Fl("");try{let P=await xq(f,gu,B),s=ml(P),lu=P?.queue||cl||{},Uu=String(lu?.activeTaskId||w_(lu)[0]||bn||"");Mf((Tu)=>{let Ou=qn(Vn([ml(Tu),s],Uu)),hu=Tn(P);return{...Tu||{},queue:lu,statistics:P?.statistics||Tu?.statistics,tasks:Ou,pagination:{...hu,returned:Ou.length}}})}catch(P){Fl(Yl(P,"加载更早 Codex tasks 失败"))}finally{L.current=!1,U$(!1)}}function $E(B){let P=B.currentTarget;if(!P||dA||!aQ)return;if(P.scrollHeight-P.scrollTop-P.clientHeight<120)iU()}async function Cf(B,P){mr(!0),Fl("");try{await B()}catch(s){Fl(Yl(s,P))}finally{mr(!1)}}async function y2(B){if(!B)return;try{let P=!1;try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(B),P=!0}catch{P=!1}if(!P){let lu=document.createElement("textarea");lu.value=B,lu.style.position="fixed",lu.style.opacity="0",document.body.appendChild(lu),lu.select(),P=document.execCommand("copy"),document.body.removeChild(lu)}if(!P)throw Error("browser clipboard rejected the copy request");xr(B);let s=`已复制任务 ID:${B}`;Pl(s),wf("success",s),window.setTimeout(()=>xr((lu)=>lu===B?"":lu),1600)}catch(P){Fl(`复制任务 ID 失败:${Yl(P)}`)}}function _2(B){if(!B)return;Du(B);let P=`已引用任务 ID:${B};提交时后端会读取并注入该任务上下文`;Pl(P),wf("success",P)}async function $2(B){if(!y||!B)return;let P=new Date().toISOString();Q.current+=1,er([B],P,null,{id:B,readAt:P,terminalUnread:!1}),Rr(B);let s=!1;if(await Cf(async()=>{let lu=await SV(f,B),Uu=lu?.task||{id:B,readAt:new Date().toISOString(),terminalUnread:!1},Tu=String(Uu?.readAt||new Date().toISOString());er([B],Tu,lu?.queue||null,Uu),s=!0;let Ou=`已将任务 ${B} 标为已读`;Pl(Ou),wf("success",Ou)},"标记 Codex task 已读失败"),!s)nU([B]),U0(J.current,!1).catch((lu)=>Fl(Yl(lu,"刷新 Codex tasks 失败")));Rr((lu)=>lu===B?"":lu)}async function rE(){if(!y||J$)return;br(!0);let B=new Date().toISOString(),P=Array.from(new Set([...ml(D.current).filter(i1).map((lu)=>String(lu?.id||"")).filter(Boolean),...Array.from(V.current.entries()).filter(([,lu])=>i1(lu?.task)).map(([lu])=>lu)]));if(Q.current+=1,P.length>0)er(P,B);let s=!1;if(await Cf(async()=>{let lu=await PV(f),Uu=String(lu?.readAt||new Date().toISOString()),Tu=ml(D.current).filter(i1).map((Iu)=>String(Iu?.id||"")).filter(Boolean),Ou=Array.from(V.current.entries()).filter(([,Iu])=>i1(Iu?.task)).map(([Iu])=>Iu),hu=Array.from(new Set([...P,...Tu,...Ou]));er(hu,Uu,lu?.queue||null);let Yu=Number(lu?.count||hu.length);s=!0;let Cu=`已将 ${Yu} 个已结束未读任务标为已读`;Pl(Cu),wf("success",Cu)},"全部标为已读失败"),!s&&P.length>0)nU(P),U0(J.current,!1).catch((lu)=>Fl(Yl(lu,"刷新 Codex tasks 失败")));br(!1)}function AE(B){let P=B||y1;if(Df(P),!hf(P))$l(P);if(Mf(null),!(hf(P)?J.current:""))J.current="",F.current+=1,Au(""),x(null),yu(!0)}async function r2(){if(!y)return;let B=await tl(Dl(f,"/api/workdirs"));w1(B)}async function jE(){let B=jf.trim()||uU||"/workspace",P=typeof window>"u"?B:window.prompt("输入新的工作目录绝对路径",B),s=String(P||"").trim();if(!s)return;Hy(!0),await Cf(async()=>{let lu=await tl(Dl(f,"/api/workdirs"),{method:"POST",body:{providerId:Nu,executionMode:gl,path:s,ensure:!0}});w1((Tu)=>({...Tu||{},...lu})),sl(String(lu?.workdir?.path||s));let Uu=`已保存工作目录:${String(lu?.workdir?.path||s)}`;Pl(Uu),wf("success",Uu)},"创建工作目录失败"),Hy(!1)}async function JE(){let B=O_(jf);if(!u2){Pl("当前工作目录还没有保存到下拉菜单。");return}if(!(typeof window>"u"?!0:window.confirm(`从下拉菜单删除工作目录选项? +本次任务:`,n=l.indexOf(f);if(n===-1)return u;return l.slice(n+f.length).trimStart()}function ui(u){return u.length>0?u.split(/\r\n|\r|\n/u).length:0}function m4(u){if(typeof u==="string")return u;if(u&&typeof u==="object"&&!Array.isArray(u)&&typeof u.text==="string")return u.text;return""}function iL(u,l={}){if(l.preview===!0){let y=m4(u?.displayPromptPreview||u?.basePromptPreview||u?.promptPreview);if(y.length>0)return y}let f=String(u?.displayPrompt||"");if(f.length>0)return f;let n=String(u?.prompt||"");return bV(RV(n).userPrompt)}function Lf(u){return u?._traceSummary&&typeof u._traceSummary==="object"&&!Array.isArray(u._traceSummary)?u._traceSummary:null}function k4(u){return u?._promptDetails&&typeof u._promptDetails==="object"&&!Array.isArray(u._promptDetails)?u._promptDetails:{}}function U7(u){let l=Lf(u)?.prompt;return l&&typeof l==="object"&&!Array.isArray(l)?l:{}}function _L(u){let l=Lf(u)?.execution;return l&&typeof l==="object"&&!Array.isArray(l)?l:{}}function kq(u){let l=Number(u);return Number.isFinite(l)&&l>=0?Math.floor(l):0}function Jn(u){let l=Number(u);return Number.isFinite(l)&&l>=0?Math.floor(l):null}function N7(u){let l=ll(u?.traceStats);if(l&&(u?.statsSource==="oa-event-flow"||l.source==="oa-event-flow"))return l;let f=Lf(u),n=ll(f?.traceStats);if(n&&(f?.statsSource==="oa-event-flow"||n.source==="oa-event-flow"))return n;return null}function kV(u,l){let f=ll(l?.traceStats)||ll(l?.execution?.traceStats),n=String(l?.statsSource||l?.execution?.statsSource||"");if(f&&(n==="oa-event-flow"||f.source==="oa-event-flow"))return f;return null}function hV(u,l){return Jn(N7(u)?.[l])}function IV(u){let l=hV(u,"stepCount");if(l!==null)return l;let f=Lf(u);if(f!==null)return sV(f);return null}function $L(...u){for(let l of u){let f=Jn(l);if(f!==null)return f}return null}function vV(u){if(u.state==="ready"||u.state==="fallback")return`STEP ${u.count}${u.state==="fallback"?" raw":""}`;if(u.state==="syncing")return"STEP sync";if(u.state==="failed")return"STEP failed";return"STEP N/A"}function gV(u){let l=N7(u),f=Jn(l?.stepCount??l?.llmStepCount);if(f!==null)return{state:"ready",count:f,label:`STEP ${f}`,title:"STEP 来自 OA Event Flow 统计中心",source:"oa-event-flow"};let n=Lf(u),y=fy(u)&&u?._traceSummaryLoaded!==!0&&Jn(u?.outputCount??u?.retainedOutputCount)===0,i=$L(n?.retainedStepCount,n?.execution?.traceLineCount,n?.execution?.stepCount,u?.outputCount,u?.retainedOutputCount,y?null:u?.stepCount,y?null:u?.llmStepCount);if(i!==null)return{state:"fallback",count:i,label:`STEP ${i} raw`,title:"OA STEP 统计不可用,当前显示 raw trace fallback 行数",source:"raw-trace"};if(n?.traceStatsError||u?.traceStatsError)return{state:"failed",count:null,label:"STEP failed",title:"STEP 统计读取失败;请查看 trace summary 原始 JSON",source:"stats-error"};if(fy(u)||u?._traceSummaryLoaded!==!0)return{state:"syncing",count:null,label:"STEP sync",title:"STEP 统计同步中;Trace Summary 或 OA 统计尚未返回",source:"syncing"};return{state:"unavailable",count:null,label:"STEP N/A",title:"当前任务没有可用 STEP 统计或 raw trace fallback",source:"unavailable"}}function sV(u){let l=ll(u?.traceStats);if(!l||u?.statsSource!=="oa-event-flow"&&l.source!=="oa-event-flow")return null;return Jn(l.stepCount)}function p4(u){if(!u||u?._traceSummaryLoaded!==!0)return!1;let l=Lf(u),f=String(u?._traceSummaryUpdatedAt||l?.updatedAt||""),n=String(u?.updatedAt||"");if(n.length>0){let y=$1(f),i=$1(n);if(y!==null&&i!==null){if(y+10)return f;let n=String(u?.basePrompt||"");return n.length>0?n:iL(u)}function AL(u){let l=Lf(u);return String(l?.finalResponse||u?.finalResponse||"").trimEnd()}function rL(u){let f=Lf(u)?.lastJudge||u?.lastJudge;return f&&typeof f==="object"&&!Array.isArray(f)?f:null}function ll(u){return u&&typeof u==="object"&&!Array.isArray(u)?u:null}function aV(u){let l=ll(u?.raw),f=ll(u?.failureDetails)||ll(l?.minimaxFailure);if(f===null)return"";let n=f.repairAttempt===void 0?"":`${f.repairAttempt}/${f.maxRepairAttempts??"?"}`;return[["provider",f.provider||"minimax"],["stage",f.stage],["model",f.model],["timedOut",f.timedOut],["durationMs",f.durationMs],["timeoutMs",f.timeoutMs],["promptChars",f.promptChars],["promptLines",f.promptLines],["payloadBytes",f.payloadBytes],["responseStatus",f.responseStatus],["repairAttempt",n],["errorName",f.errorName],["error",f.errorMessage],["responseContentPreview",f.responseContentPreview],["responseTextPreview",f.responseTextPreview]].filter(([,i])=>i!==void 0&&i!==null&&String(i).length>0).map(([i,_])=>`${i}: ${String(_)}`).join(` +`)}function jL({judge:u,testId:l="codex-judge-failure-details"}){let f=aV(u);if(f.length===0)return null;return w("details",{className:"codex-judge-failure-details","data-testid":l},w("summary",null,"MiniMax failure details"),w("pre",null,f))}function oV(u){let l=Lf(u)?.attempts;if(Array.isArray(l)&&l.length>0)return e9(u,d9(u,l));let f=_L(u),n=AL(u),y=rL(u);if(Object.keys(f).length===0&&n.length===0&&y===null)return e9(u,d9(u,[]));return e9(u,d9(u,[{index:Number(u?.currentAttempt||1),mode:u?.currentMode||"initial",startedAt:u?.startedAt,finishedAt:u?.finishedAt,terminalStatus:u?.status,execution:f,finalResponse:n,finalResponseChars:n.length,judge:y}]))}function h4(u,l){let f=Lf(u),n=Number(f?.currentAttempt||u?.currentAttempt||0),y=Number(l);return Number.isFinite(n)&&n>0&&Number.isFinite(y)&&y===n}function F7(u,l){return fy(u)&&h4(u,l)}function d9(u,l){let f=Array.isArray(l)?l.filter(Boolean):[],n=Lf(u),y=Number(n?.currentAttempt||u?.currentAttempt||0);if(!fy(u)||!Number.isFinite(y)||y<=0)return f;if(f.some((_)=>Number(_?.index)===y))return f;let i=r7(u?.startedAt,n?.startedAt,u?.updatedAt,n?.updatedAt);return[...f,{index:y,mode:u?.currentMode||n?.currentMode||(y<=1?"initial":"retry"),startedAt:i||u?.startedAt||n?.startedAt,finishedAt:null,terminalStatus:null,execution:{},finalResponse:"",finalResponsePreview:"",finalResponseChars:0,judge:null,currentPlaceholder:!0}]}function e9(u,l){let f=[...Array.isArray(l)?l:[]];if(!fy(u))return f;return f.sort((n,y)=>{let i=Number(n?.index),_=Number(y?.index),$=h4(u,i)?0:1,A=h4(u,_)?0:1;if($!==A)return $-A;return i-_})}function dV(u,l){return ll(l?.execution)||_L(u)}function eV(u,l,f,n){let y=Lf(u),i=Number(y?.currentAttempt||u?.currentAttempt||0),_=Number(f),$=Number.isFinite(_)&&_>0&&_===i,A=r7(u?.updatedAt,y?.updatedAt);if($&&!l?.finishedAt&&A.length>0)return A;return String(l?.updatedAt||l?.finishedAt||n.effectiveEndAt||($?A:"")||A||u?.finishedAt||u?.startedAt||"")}function uB(u,l){let f=String(l?.finalResponse||l?.finalResponsePreview||"");if(F7(u,l?.index))return"";if(Object.prototype.hasOwnProperty.call(l||{},"finalResponse")||Object.prototype.hasOwnProperty.call(l||{},"finalResponsePreview"))return f.trimEnd();return f.length>0?f.trimEnd():AL(u)}function JL(u,l,f=l?.index){if(F7(u,f))return null;if(Object.prototype.hasOwnProperty.call(l||{},"judge"))return ll(l?.judge);return rL(u)}function lB(u,l,f){if(!WL(u))return!1;if(W7(l,f))return!1;if(l?.finishedAt)return!1;if(["succeeded","failed","canceled"].includes(String(l?.terminalStatus||"")))return!1;if(h4(u,f))return!0;let n=Number(Lf(u)?.currentAttempt||u?.currentAttempt||0);if(Number.isFinite(n)&&n>0)return!1;return!0}function QL(u){return`feedback:${String(u||"latest")}`}function fB(u,l,f){let n=String(l?.feedbackPrompt||"").trimEnd(),y=String(l?.feedbackPromptPreview||n||"").trimEnd(),i=Number(l?.feedbackPromptChars||n.length||y.length||0),_=Number(l?.feedbackPromptLines||ui(n||y));if(n.length>0||y.length>0||i>0)return{text:n,preview:y,chars:i,lines:_,source:l?.feedbackPromptSource||"judge-feedback",forAttempt:l?.feedbackPromptForAttempt||Number(f||0)+1,truncated:Boolean(l?.feedbackPromptTruncated)};let $=JL(u,l,f),A=String($?.continuePrompt||"").trimEnd();if($?.decision==="retry"&&A.length>0)return{text:"",preview:A,chars:A.length,lines:ui(A),source:"judge-continue-prompt",forAttempt:Number(f||0)+1,truncated:!1};return null}function nB(u){let l=U7(u);return Boolean(l.hasReferenceInjection||Number(l.referencePromptChars||0)>0||u?.referenceInjection||u?.referenceInjectionSummary)}function UL(u,l=null){if(l!==null&&l!==void 0){let n=(ll(u?._traceStepsByAttempt)||{})[String(l)];return Array.isArray(n)?n:[]}return Array.isArray(u?._traceSteps)?u._traceSteps:[]}function B3(u){let f=[u?.seq,...Array.isArray(u?.rawSeqs)?u.rawSeqs:[]].map((n)=>Number(n)).filter((n)=>Number.isFinite(n));return f.length>0?Math.max(...f):0}function yB(u){return(Array.isArray(u)?u:[]).reduce((l,f)=>Math.max(l,B3(f)),0)}function iB(u,l){let f=new Map;for(let n of[...Array.isArray(u)?u:[],...Array.isArray(l)?l:[]]){let y=String(n?.seq??`${n?.title||"step"}:${n?.at||""}`);f.set(y,{...f.get(y)||{},...n})}return Array.from(f.values()).sort((n,y)=>B3(n)-B3(y))}function fi(u){return(Array.isArray(u?.summaryLines)?u.summaryLines:[]).map((l)=>String(l||""))}function _B(u){let l=String(u?.kind||"").trim().toLowerCase(),f=String(u?.status||"").trim().toLowerCase();return l==="error"||f==="error"}function I4(u){let l=String(u?.status||"").trim();if(l.length>0)return l;let f=fi(u).join(` +`);return/^(item\/[A-Za-z]+(?:\/[A-Za-z]+)?):/u.exec(f)?.[1]||""}function hq(u){return/^item\/(?:started|completed): file changes status=/u.test(String(u||"").trim())}function $B(u){let l=fi(u);for(let n=l.length-1;n>=0;n-=1){let y=/file changes status=([A-Za-z0-9_-]+)/u.exec(l[n]||"")?.[1];if(y)return y}let f=I4(u);if(f==="item/fileChange/outputDelta")return"updated";if(f==="item/started")return"started";if(f==="item/completed")return"completed";return f.replace(/^item\//u,"")||String(u?.status||"changed")}function AB(u){if(String(u?.kind||"")!=="edited")return!1;let l=String(u?.title||""),f=String(u?.status||""),n=fi(u).join(` +`);if(l==="Edited files")return!0;if(/^item\/fileChange\//u.test(f))return!0;if((f==="item/started"||f==="item/completed")&&/file changes status=/u.test(n))return!0;if(/^Success\. Updated the following files:/mu.test(n))return!0;if(/^diff --git /mu.test(n))return!0;return/^([AMDRCU?]{1,2})\s+\S+/mu.test(n)}function rB(u){if(u.length<=1)return u[0];let l=u.find((i)=>I4(i)==="item/fileChange/outputDelta")||u.find((i)=>fi(i).some((_)=>!hq(_)))||u.at(-1)||u[0],f=u.flatMap((i)=>Array.isArray(i?.rawSeqs)?i.rawSeqs:[i?.seq]).filter((i)=>i!==void 0),n=u.flatMap(fi).filter((i)=>i.trim().length>0&&!hq(i)),y=u[u.length-1]||l;return{...l,at:l?.at||y?.at,title:String(l?.title||"Edited files"),status:$B(y),summaryLines:n.length>0?n:fi(l),rawSeqs:f}}function jB(u){let l=Array.isArray(u)?u:[],f=[],n=[],y=()=>{if(n.length>0)f.push(rB(n));n=[]};for(let i of l){if(AB(i)){if(I4(i)==="item/started"&&n.length>0)y();if(n.push(i),I4(i)==="item/completed")y();continue}y(),f.push(i)}return y(),f}function JB(u){if(String(u?.kind||"")!=="message")return"";let l=String(u?.title||"").trim().toLowerCase();if(l!=="assistant message"&&l!=="reasoning")return"";return`${l}:${String(u?.status||"")}`}function QB(u){if(u.length<=1)return u[0];let l=u[0],f=u.at(-1)||l,n=u.flatMap((_)=>Array.isArray(_?.rawSeqs)?_.rawSeqs:[_?.seq]).filter((_)=>_!==void 0),y=[];for(let _ of n)if(!y.includes(_))y.push(_);let i=u.flatMap(fi).filter((_)=>_.trim().length>0);return{...l,seq:B3(f)||B3(l),at:f?.at||l?.at,summaryLines:i.length>0?[i.at(-1)||i[0]]:[],rawSeqs:y}}function UB(u){let l=Array.isArray(u)?u:[],f=[],n=[],y="",i=()=>{if(n.length>0)f.push(QB(n));n=[],y=""};for(let _ of l){let $=JB(_);if($.length>0&&$===y){n.push(_);continue}if(i(),$.length>0)n=[_],y=$;else f.push(_)}return i(),f}function NB(u){return UB(jB(u))}function FB(u){return{...u}}function b4(u,l=null){if(l!==null&&l!==void 0){let f=ll(u?._traceStepsLoadedByAttempt)||{};return Boolean(f[String(l)])}return Boolean(u?._traceStepsLoaded)}function _7(u){return u?._traceStepDetails&&typeof u._traceStepDetails==="object"&&!Array.isArray(u._traceStepDetails)?u._traceStepDetails:{}}function WB(u,l){let f=Number(u?.index);return Number.isFinite(f)?f:l+1}function W7(u,l){return Boolean(u?.synthetic)||Number(l)<=0}function s4(u){let l=Number(u);return Number.isFinite(l)?String(l):void 0}function qB(u){let l=u?.timing&&typeof u.timing==="object"?u.timing:{},f=String(u?.status||"");if(["queued"].includes(f))return`等待 ${jn(l.queueWaitMs??l.totalElapsedMs)}`;if(["running","judging","retry_wait"].includes(f))return`耗时 ${jn(l.durationMs??l.totalElapsedMs)}`;return`耗时 ${jn(l.durationMs??l.totalElapsedMs)}`}function O_(u){return String(u?.queueId||"default")}function NL(u){return ll(u?.queuedReason)}function FL(u){let l=String(u?.queuedReasonLabel||"").trim();if(l.length>0)return l.toUpperCase();let f=NL(u),n=String(f?.label||"").trim();return n.length>0?n.toUpperCase():""}function LB(u){let l=String(u?.status||"unknown");if(l!=="queued")return l;let f=FL(u);return f.length>0?`QUEUED(${f})`:"QUEUED"}function KB(u){if(String(u?.status||"")!=="queued")return;let l=NL(u),f=String(l?.message||"").trim(),n=FL(u);if(f.length>0&&n.length>0)return`${n}: ${f}`;if(f.length>0)return f;return n.length>0?n:void 0}function zB(u){return{system:"SYS",user:"YOU",assistant:"GPT",reasoning:"THINK",command:"CMD",diff:"DIFF",tool:"TOOL",error:"ERR"}[u]||u.toUpperCase()}function fy(u){return["running","judging","retry_wait"].includes(String(u?.status||""))}function WL(u){return String(u?.status||"")==="running"}function rn(u){return["succeeded","failed","canceled"].includes(String(u?.status||""))}function qL(u){if(u?.promptEditable===!0)return!0;if(u?.promptEditable===!1)return!1;return String(u?.status||"")==="queued"&&!u?.startedAt&&Number(u?.currentAttempt||0)===0&&!u?.codexThreadId&&!u?.nextMode}function i1(u){if(!rn(u))return!1;if(u?.terminalUnread===!0)return!0;if(u?.terminalUnread===!1)return!1;return!u?.readAt}function Bl(u){let l=Number(u||0);return Number.isFinite(l)?l:0}function GB(u){return Bl(u.queued)+Bl(u.retry_wait)}function wB(u){return Bl(u.running)+Bl(u.judging)}function ZB(u,l){return ll(u?.statistics)||ll(l?.statistics)||{}}function LL(...u){return u.find((l)=>l!==void 0&&l!==null)}function KL(u){let l=Number(u);return Number.isFinite(l)&&l>=0?l:null}function Xf(...u){for(let l of u){let f=KL(l);if(f!==null)return Math.floor(f)}return 0}function q7(...u){for(let l of u){let f=KL(l);if(f!==null)return Math.round(f)}return null}function EB(u){for(let l of[u?.daily,u?.dailyBuckets,u?.daily_buckets,u?.buckets,u?.rows,u?.series])if(Array.isArray(l))return l;return[]}function zL(u){return EB(u).map((l,f)=>{let n=ll(l)||{},y=String(LL(n.date,n.day,n.bucketDate,n.bucket,`day-${f}`)||"");return{...n,date:y,executedTasks:Xf(n.executedTasks,n.tasks,n.taskCount,n.startedTasks,n.started,n.executed,n.count),completedTasks:Xf(n.completedTasks,n.terminalTasks,n.terminalCount,n.finishedTasks,n.finished,n.completed),retryAttempts:Xf(n.retryAttempts,n.retries,n.retryCount,n.retryTasks),succeededTasks:Xf(n.succeededTasks,n.succeeded,n.success),failedTasks:Xf(n.failedTasks,n.failed,n.failures),canceledTasks:Xf(n.canceledTasks,n.cancelledTasks,n.canceled,n.cancelled),totalDurationMs:Xf(n.totalDurationMs,n.durationTotalMs,n.totalCompletionDurationMs),durationSamples:Xf(n.durationSamples,n.avgDurationSamples,n.samples,n.sampleCount),avgDurationMs:q7(n.avgDurationMs,n.averageDurationMs,n.avgCompletedDurationMs,n.averageCompletionMs,n.averageDuration,n.durationMs)}}).filter((l)=>l.date.length>0)}function uy(u,l){return u.reduce((f,n)=>f+Bl(n?.[l]),0)}function HB(u){let l=0,f=0;for(let n of u){let y=Bl(n?.durationSamples),i=q7(n?.avgDurationMs);if(y>0&&i!==null)l+=i*y,f+=y}return f>0?Math.round(l/f):null}function OB(u,l=zL(u)){let f=ll(u?.totals)||ll(u?.summary)||{},n=Xf(f.durationSamples,f.avgDurationSamples,f.samples,u?.durationSamples,u?.samples,uy(l,"durationSamples")),y=Xf(f.totalDurationMs,f.durationTotalMs,u?.totalDurationMs,uy(l,"totalDurationMs")),i=q7(f.avgDurationMs,f.averageDurationMs,f.avgCompletedDurationMs,u?.avgDurationMs,u?.averageDurationMs,n>0&&y>0?y/n:null,HB(l));return{...f,executedTasks:Xf(f.executedTasks,f.tasks,f.taskCount,u?.executedTasks,u?.tasks,u?.taskCount,uy(l,"executedTasks")),completedTasks:Xf(f.completedTasks,f.terminalTasks,f.terminalCount,f.finishedTasks,u?.completedTasks,u?.terminalTasks,u?.terminalCount,uy(l,"completedTasks")),retryAttempts:Xf(f.retryAttempts,f.retries,f.retryCount,u?.retryAttempts,u?.retries,u?.retryCount,uy(l,"retryAttempts")),succeededTasks:Xf(f.succeededTasks,u?.succeededTasks,uy(l,"succeededTasks")),failedTasks:Xf(f.failedTasks,u?.failedTasks,uy(l,"failedTasks")),canceledTasks:Xf(f.canceledTasks,f.cancelledTasks,u?.canceledTasks,u?.cancelledTasks,uy(l,"canceledTasks")),durationSamples:n,totalDurationMs:y,avgDurationMs:i}}function Iq(u){let l=LL(u?.reason,u?.degradedReason,u?.statsReason,u?.error,u?.message,u?.detail);if(typeof l==="string"&&l.trim().length>0)return V3(l,180);if(u?.skipped===!0)return"统计 API 返回 skipped,当前后端未提供 daily buckets。";if(u?.unavailable===!0)return"统计 API 当前不可用。";return"统计 API 未返回可用的 daily buckets。"}function TB(u,l,f){let n=ll(u)!==null,y=u?.unavailable===!0||u?._unavailable===!0||u?.available===!1,i=u?.skipped===!0,_=u?.degraded===!0||u?.isDegraded===!0||y||i,$=Bl(f.executedTasks)+Bl(f.retryAttempts)+Bl(f.completedTasks);if(!n)return{state:"loading",label:"统计同步中",reason:"正在读取 Code Queue stats API。"};if(y||i||_&&l.length===0)return{state:"unavailable",label:"统计不可用",reason:Iq(u),degraded:!0};if(_)return{state:"degraded",label:"统计降级",reason:Iq(u),degraded:!0};if(l.length===0&&$===0)return{state:"empty",label:"暂无统计",reason:"任务开始执行后会生成按天汇总的曲线。"};return{state:"ready",label:"统计就绪",reason:""}}function vq(u){return{source:"frontend-stats-fetch",unavailable:!0,degraded:!0,reason:Dl(u,"统计 API 不可用"),daily:[],totals:null}}function L7(u,l){let f=Number(u?.[l]??0);return Number.isFinite(f)&&f>0?f:0}function u7(u,l){return u.reduce((f,n)=>Math.max(f,L7(n,l)),0)}var ey=700,gq=220,ly=30,E_=24,T3=184,$7=T3-E_;function GL(u,l){if(l<=1)return ey/2;return ly+u*(ey-ly*2)/(l-1)}function wL(u,l){let f=l>0?l:1;return T3-Math.min(1,u/f)*$7}function l7(u,l,f){let n=u.length>0?u:[{[l]:0}],y=n.length>1?n:[n[0],n[0]];return y.map((i,_)=>`${GL(_,y.length).toFixed(2)},${wL(L7(i,l),f).toFixed(2)}`).join(" ")}function y1(u){let l=String(u||"");return/^\d{4}-\d{2}-\d{2}$/u.test(l)?l.slice(5):l||"--"}function x4(u){if(!u)return"";return`${String(u.seriesKey||"")}:${String(u.row?.date||u.index||"")}`}function VB(u,l,f,n){let y=L7(u,n.key);return{...n,row:u,index:l,value:y,valueLabel:n.format(y),x:GL(l,f),y:wL(y,n.max),seriesKey:n.key}}function sq(u){if(i1(u))return 0;return{running:1,judging:2,retry_wait:3,queued:4,succeeded:8,failed:8,canceled:8}[String(u?.status||"")]??9}function w3(u){if(!u)return!1;if(u?._traceSummaryLoaded===!0)return!1;return u?.summaryOnly===!0||u?._metaLoaded!==!0}function BB(u){return Boolean(u?._metaLoaded)||u?.summaryOnly===!1}function XB(u,l,f){let n=String(u?.[f]||""),y=String(l?.[f]||"");return n.length>y.length?n:y}function A7(u,l,f){let n=Array.isArray(u?.[f])?u[f]:[],y=Array.isArray(l?.[f])?l[f]:[];if(y.length===0&&n.length>0)return n;return n.length>y.length?n:y}function aq(u,l){let f=l?.summaryOnly===!0&&BB(u),n={...u,...l};if(!f)return n;for(let y of["prompt","basePrompt","displayPrompt","finalResponse"])n[y]=XB(u,l,y);for(let y of["promptHistory","attempts","output","events"])n[y]=A7(u,l,y);if(u?.referenceInjection?.items&&!l?.referenceInjection?.items)n.referenceInjection=u.referenceInjection;if(u?.referenceInjectionSummary&&!l?.referenceInjectionSummary)n.referenceInjectionSummary=u.referenceInjectionSummary;n.summaryOnly=u?.summaryOnly===!1?!1:l.summaryOnly,n._metaLoaded=u?._metaLoaded,n._detailLoaded=u?._detailLoaded,n._transcriptComplete=u?._transcriptComplete,n._transcriptPreview=Object.prototype.hasOwnProperty.call(l,"_transcriptPreview")?l._transcriptPreview:u?._transcriptPreview;for(let y of["_traceSummary","_traceSummaryLoaded","_traceSteps","_traceStepsLoaded","_traceStepsByAttempt","_traceStepsLoadedByAttempt","_traceStepsNextAfterSeqByAttempt","_traceStepDetails","_promptDetails"])if(!Object.prototype.hasOwnProperty.call(l,y)&&Object.prototype.hasOwnProperty.call(u||{},y))n[y]=u[y];return n}function oq(u){let l=u?.selected,f=l?.task&&typeof l.task==="object"?l.task:null;if(f!==null){let y=Boolean(l?.preview);return{...f,transcript:Array.isArray(l?.transcript)?l.transcript:[],_detailLoaded:Array.isArray(l?.transcript)&&l.transcript.length>0,_transcriptComplete:Boolean(!y&&!l?.hasMore&&rn(f)),_transcriptPreview:y,_summaryLoaded:!0}}let n=ml(u)[0];return n?{...n,_summaryLoaded:!0}:null}function f7(u,l){let f=new Map;for(let n of[...Array.isArray(u)?u:[],...Array.isArray(l)?l:[]]){let y=`${Number(n?.seq??0)}:${String(n?.kind||"message")}`,i=f.get(y);if(!i){f.set(y,n);continue}let _={...i,...n};for(let[$,A]of[["bodyPreview","bodyOmittedLines"],["commandPreview","commandOmittedLines"]]){let j=String(i?.[$]||""),J=String(n?.[$]||"");if(j.length>J.length)_[$]=i[$],_[A]=i[A]}f.set(y,_)}return Array.from(f.values()).sort((n,y)=>Number(n?.seq??0)-Number(y?.seq??0))}function Z3(u){return(Array.isArray(u)?u:[]).reduce((l,f)=>Math.max(l,Number(f?.seq??0)),0)}function dq(u,l=8){let f=Array.from(new Set((Array.isArray(u)?u:[]).map((y)=>Number(y?.seq??0)).filter((y)=>Number.isFinite(y)&&y>0))).sort((y,i)=>y-i);if(f.length===0)return 0;let n=f[Math.max(0,f.length-l)]??0;return Math.max(0,n-0.001)}function cB(u,l){let f=Array.isArray(u?.codeModels)?u.codeModels:Array.isArray(u?.codexModels)?u.codexModels:[],n=["gpt-5.5","gpt-5.4-mini","gpt-5.4","deepseek-chat","minimax-m2.7"];return Array.from(new Set([...f,...n,l].map((y)=>String(y||"").trim()).filter(Boolean)))}function YB(u,l){let n=(Array.isArray(u?.executionProviders)?u.executionProviders:[]).map((_)=>({id:String(_?.id||"").trim(),label:String(_?.label||_?.id||"").trim(),defaultWorkdir:String(_?.defaultWorkdir||"").trim(),supportsWindowsNativeCodex:_?.supportsWindowsNativeCodex===!0,windowsNativeDefaultWorkdir:String(_?.windowsNativeDefaultWorkdir||"").trim(),kind:String(_?.kind||"").trim()})).filter((_)=>_.id.length>0),y=String(u?.mainProviderId||u?.defaultProviderId||"D601").trim()||"D601",i=new Map;for(let _ of[...n,{id:y,label:`${y} (local)`,defaultWorkdir:String(u?.defaultWorkdir||"/workspace"),supportsWindowsNativeCodex:!1,windowsNativeDefaultWorkdir:"",kind:"local"},l?{id:l,label:l,defaultWorkdir:K7(u,l),supportsWindowsNativeCodex:l!==y,windowsNativeDefaultWorkdir:String(u?.windowsNativeCodexDefaultWorkdir||"/mnt/f/Work/ConStart"),kind:""}:null].filter(Boolean))if(!i.has(_.id))i.set(_.id,_);return Array.from(i.values())}function DB(u,l){let n=(Array.isArray(u?.executionModes)?u.executionModes:[]).map((_)=>({id:String(_?.id||_?.kind||"").trim(),label:String(_?.label||_?.id||_?.kind||"").trim(),description:String(_?.description||"").trim(),defaultWorkdir:String(_?.defaultWorkdir||"").trim(),requiresProvider:_?.requiresProvider===!0,requiresWindowsCwd:_?.requiresWindowsCwd===!0})).filter((_)=>_.id.length>0),y=[{id:"default",label:"默认容器/本机",description:"Code Queue 所在节点用本机 Codex;远程 Provider 用执行容器 Codex。",defaultWorkdir:"",requiresProvider:!1,requiresWindowsCwd:!1},{id:"windows-native",label:"Windows 原生 Codex",description:"启动执行容器,但容器只做 stdio relay,Codex 运行在 Provider 的 Windows 宿主。",defaultWorkdir:String(u?.windowsNativeCodexDefaultWorkdir||"/mnt/f/Work/ConStart"),requiresProvider:!0,requiresWindowsCwd:!0}],i=new Map;for(let _ of[...n,...y,l?{id:l,label:l,description:"",defaultWorkdir:"",requiresProvider:l==="windows-native",requiresWindowsCwd:l==="windows-native"}:null].filter(Boolean))if(!i.has(_.id))i.set(_.id,_);return Array.from(i.values())}function H3(u,l,f){if(l!=="windows-native")return K7(u,f);let n=Array.isArray(u?.executionModes)?u.executionModes.find((i)=>String(i?.id||i?.kind||"")==="windows-native"):null,y=Array.isArray(u?.executionProviders)?u.executionProviders.find((i)=>String(i?.id||"")===f):null;return String(y?.windowsNativeDefaultWorkdir||n?.defaultWorkdir||u?.windowsNativeCodexDefaultWorkdir||"/mnt/f/Work/ConStart")}function K7(u,l){let f=String(l||"").trim(),n=u?.defaultWorkdirByProvider&&typeof u.defaultWorkdirByProvider==="object"?u.defaultWorkdirByProvider:{};if(typeof n[f]==="string"&&String(n[f]).trim().length>0)return String(n[f]).trim();let y=Array.isArray(u?.executionProviders)?u.executionProviders.find((_)=>String(_?.id||"")===f):null;if(typeof y?.defaultWorkdir==="string"&&y.defaultWorkdir.trim().length>0)return y.defaultWorkdir.trim();let i=String(u?.mainProviderId||u?.defaultProviderId||"D601");return f===i?String(u?.defaultWorkdir||"/workspace"):String(u?.remoteDefaultWorkdir||"/home/ubuntu")}function T_(u){return String(u||"").trim().replace(/\/+$/u,"")||"/"}function tB(u,l,f){return String(u?.providerId||"")===String(l||"")&&String(u?.executionMode||"default")===String(f||"default")&&String(u?.path||"").trim().length>0}function SB(u,l,f,n,y){let i=new Map,_=T_(y),$=(A,j,J={})=>{let Q=T_(A);if(Q.length===0||i.has(Q))return;i.set(Q,{providerId:f,executionMode:n,path:Q,source:j,createdAt:J?.createdAt||"",updatedAt:J?.updatedAt||""})};$(H3(u,n,f),"default");for(let A of Array.isArray(l)?l:[])if(tB(A,f,n))$(A.path,"saved",A);return $(y,"current"),Array.from(i.values()).sort((A,j)=>{if(A.path===_)return-1;if(j.path===_)return 1;if(A.source==="default"&&j.source!=="default")return-1;if(j.source==="default"&&A.source!=="default")return 1;return A.path.localeCompare(j.path)})}function PB({task:u,selected:l,onSelect:f,onCopy:n,onReference:y,onMarkRead:i,copied:_,markingRead:$}){let A=u?.lastJudge||{},j=String(u?.id||""),J=i1(u),Q=r7(u?.updatedAt,Lf(u)?.updatedAt),U=`最近更新: ${O3(Q)}`,F=gV(u),N=F.title;return w("article",{role:"button",tabIndex:0,className:`codex-task-card ${l?"selected":""} ${J?"unread-terminal":""}`,onClick:f,onKeyDown:(K)=>{if(K.key==="Enter"||K.key===" ")K.preventDefault(),f()},"data-unread-terminal":J?"true":"false","data-testid":`codex-task-${u?.id||"unknown"}`},J?w("span",{className:"codex-unread-badge",title:"待读","aria-label":"待读","data-testid":`codex-unread-task-${j||"unknown"}`}):null,w("div",{className:"codex-task-card-head"},w("div",{className:"codex-task-status-line"},w(li,{status:u?.status,title:KB(u)},LB(u))),w("span",{className:"mono-text"},`${u?.currentAttempt||0}/${u?.maxAttempts||0}`)),w("div",{className:"codex-task-id-row"},w("code",{title:j},j||"unknown"),w("div",{className:"codex-task-id-actions"},w("button",{type:"button",className:"codex-copy-id-btn",onClick:(K)=>{K.stopPropagation(),y(j)},"data-testid":`codex-reference-task-${j||"unknown"}`},"引用"),w("button",{type:"button",className:"codex-copy-id-btn",onClick:(K)=>{K.stopPropagation(),n(j)},"data-testid":`codex-copy-task-id-${j||"unknown"}`},_?"已复制":"复制ID"),J?w("button",{type:"button",className:"codex-copy-id-btn codex-mark-read-btn",disabled:Boolean($),onClick:(K)=>{K.stopPropagation(),i(j)},"data-testid":`codex-mark-task-read-${j||"unknown"}`},$?"标记中":"标为已读"):null)),w("strong",null,V3(iL(u,{preview:!0}),120)||"空任务"),w("div",{className:"codex-task-meta"},w("span",null,`queue=${O_(u)}`),w("span",null,`provider=${u?.providerId||"D601"}`),w("span",null,`mode=${u?.executionMode||"default"}`),w("span",null,u?.model||"--"),w("span",null,qB(u))),w("div",{className:"codex-task-meta codex-task-update-meta"},w("span",{className:`codex-task-recent-update codex-task-step-count ${F.state}`,title:N,"data-testid":`codex-task-step-count-${j||"unknown"}`,"data-step-state":F.state,"data-step-source":F.source},vV(F)),w("span",{className:"codex-task-recent-update",title:Q?`更新时间: ${Zu(Q)}`:U,"data-testid":`codex-task-recent-update-${j||"unknown"}`},U),w("span",null,Zu(Q||u?.updatedAt))),qL(u)?w("div",{className:"codex-judge-line","data-testid":`codex-task-prompt-editable-${j||"unknown"}`},"queued prompt 可编辑"):null,A?.decision?w("div",{className:"codex-judge-line"},`judge=${A.decision} ${Math.round(Number(A.confidence||0)*100)}%`):null)}function n7({title:u,tasks:l,selectedId:f,onSelect:n,onCopy:y,onReference:i,onMarkRead:_,copiedTaskId:$,markingReadTaskId:A,emptyText:j}){let J=Array.isArray(l)?l:[];return w("section",{className:"codex-task-section"},w("div",{className:"codex-task-section-head"},w("span",null,u),w("code",null,String(J.length))),J.length===0?w("p",{className:"codex-task-section-empty"},j):w("div",{className:"codex-task-section-list"},J.map((Q)=>w(PB,{key:Q.id,task:Q,selected:f===Q.id,onSelect:()=>n(Q.id),onCopy:y,onReference:i,onMarkRead:_,copied:$===Q.id,markingRead:A===Q.id}))))}function MB(){return w("span",{className:"codex-stats-icon","aria-hidden":"true"},w("svg",{viewBox:"0 0 36 24",focusable:"false"},w("path",{className:"grid",d:"M3 20.5H33M3 12.5H33M3 4.5H33"}),w("polyline",{className:"line tasks",points:"3,18 9,14 15,15 21,8 27,10 33,4"}),w("polyline",{className:"line retry",points:"3,20 9,17 15,18 21,13 27,14 33,9"})))}function x0({label:u,value:l,hint:f,tone:n}){return w("div",{className:`codex-liveness-metric ${n||""}`},w("span",null,u),w("strong",null,l??"--"),f?w("code",null,f):null)}function CB({diagnostics:u,queue:l,onRaw:f}){let n=String(u?.state||u?.health||"unknown"),y=ll(u?.oaPublisher),i=n0(u?.reasons).slice(0,3),_=g4(u),$=J7(u),A=fL(u),j=String(u?.recommendedAction||(_.length>0?"investigate-heartbeat-risk":$?"continue-supervision":A==="degraded"?"observe-degraded":"none")),J=String($?"控制面/执行面观测分裂,但 heartbeat/trace 新鲜,继续监督。":_.length>0?"存在 expired/missing/stale heartbeat 风险,请先确认执行面状态。":u?.livenessSummary||(A==="degraded"?"Diagnostics are degraded; inspect heartbeat, trace, and OA progress together.":"Execution diagnostics are healthy.")),Q=HV(u),U=$?"split-brain live":n;return w(dy,{title:"执行活性",eyebrow:`${String(u?.executionStateSource||l?.executionStateSource||"unknown")} / ${String(u?.controlPlane||"code-queue")}`,summary:w("div",{className:"codex-trace-status"},w("span",{className:`codex-trace-status-chip liveness ${Q}`},w("b",null,"状态"),U),w("span",{className:`codex-trace-status-chip liveness ${Q}`},w("b",null,"liveness"),A),w("span",{className:"codex-trace-status-chip"},w("b",null,"DB active"),String(u?.databaseActiveTaskCount??l?.databaseActiveTaskCount??0)),w("span",{className:"codex-trace-status-chip"},w("b",null,"scheduler slots"),String(u?.schedulerActiveRunSlotCount??l?.activeRunSlotCount??0)),w("span",{className:"codex-trace-status-chip"},w("b",null,"heartbeat"),`${n0(u?.heartbeatFreshTaskIds).length} fresh / ${n0(u?.heartbeatExpiredTaskIds).length} expired`),y?w("span",{className:"codex-trace-status-chip"},w("b",null,"OA"),`${Number(y.pending||0)} pending${y.lastError?" / error":""}`):null),actions:w(j7,{title:"Code Queue Execution Diagnostics",data:u,onOpen:f,testId:"raw-code-queue-execution-diagnostics"}),className:"codex-liveness-panel"},w("div",{className:"codex-liveness-grid","data-testid":"codex-liveness-diagnostics"},w(x0,{tone:Q,label:"健康状态",value:U,hint:j}),w(x0,{tone:Q,label:"Effective liveness",value:A,hint:J}),w(x0,{label:"PostgreSQL active",value:String(u?.databaseActiveTaskCount??l?.databaseActiveTaskCount??0),hint:w_(u?.databaseActiveTaskIds??l?.databaseActiveTaskIds)}),w(x0,{label:"Scheduler active",value:String(u?.schedulerActiveRunSlotCount??l?.activeRunSlotCount??0),hint:w_(u?.schedulerActiveTaskIds??l?.activeTaskIds)}),w(x0,{label:"Fresh heartbeat",value:String(n0(u?.heartbeatFreshTaskIds).length),hint:w_(u?.heartbeatFreshTaskIds)}),w(x0,{tone:_.length>0?"failed":$?"degraded-live":"",label:"Heartbeat risk",value:String(_.length),hint:_.length>0?w_(_):$?"fresh heartbeat/trace: keep supervising":"--"}),w(x0,{tone:n0(u?.traceGapNotStaleTaskIds).length>0?"warn":"",label:"Trace gap",value:String(n0(u?.traceGapTaskIds).length),hint:w_(u?.traceGapNotStaleTaskIds)}),w(x0,{tone:n0(u?.staleRecoveryCandidateTaskIds).length>0?"failed":"",label:"Stale candidates",value:String(n0(u?.staleRecoveryCandidateTaskIds).length),hint:w_(u?.staleRecoveryCandidateTaskIds)}),w(x0,{label:"Last scheduler heartbeat",value:O3(u?.lastSchedulerHeartbeatAt),hint:String(u?.lastSchedulerHeartbeatAt||"--")}),w(x0,{label:"Last agent event",value:O3(u?.lastObservedAgentEventAt),hint:String(u?.lastObservedAgentEventAt||"--")}),w(x0,{label:"Last trace persist",value:O3(u?.lastPersistedTraceAt),hint:String(u?.lastPersistedTraceAt||"--")}),w(x0,{tone:y?.lastError?"warn":"",label:"OA publisher",value:`${Number(y?.pending||0)} pending`,hint:y?.lastError?V3(y.lastError,90):"ok"})),w("div",{className:`codex-liveness-advisory ${Q}`},w("b",null,$?"Observing split":_.length>0?"Heartbeat risk":"Liveness note"),w("span",null,J),w("code",null,j)),i.length>0?w("div",{className:"codex-liveness-reasons"},i.map((F)=>w("span",{key:F},F))):null)}function pB({stats:u,queueName:l,onRaw:f}){let n=zL(u),y=OB(u,n),i=n.at(-1)||{},_=u7(n,"executedTasks"),$=u7(n,"retryAttempts"),A=u7(n,"avgDurationMs"),j=n.length>0,J=ll(u?.range)||{},Q=TB(u,n,y),U=String(Q.label||""),F=String(Q.reason||""),N=Q.state==="ready"||Q.state==="degraded"?"将鼠标悬停到曲线数据点查看明细,点击数据点可固定。":F||"等待统计数据。",[K,G]=au(null),[W,L]=au(null),q=[];if(_>0)q.push(`tasks ${_}`);if($>0)q.push(`retry ${$}`);if(A>0)q.push(`avg ${jn(A)}`);let z=[{key:"executedTasks",className:"tasks",label:"执行任务",max:_,format:(D)=>`${Bl(D)} tasks`},{key:"retryAttempts",className:"retry",label:"重试次数",max:$,format:(D)=>`${Bl(D)} retries`},{key:"avgDurationMs",className:"duration",label:"平均耗时",max:A,format:(D)=>jn(D)}],Z=K||W,T=x4(Z),X=String(Z?.row?.date||""),c=Z?{left:`${Math.max(8,Math.min(92,Number(Z.x)/ey*100))}%`,top:`${Math.max(14,Math.min(86,Number(Z.y)/gq*100))}%`}:void 0;An(()=>{G(null),L(null)},[l,J.startDate,J.endDate,n.length]);let S=(D)=>{G(D)},p=(D)=>{let x=x4(D);L((V)=>x4(V)===x?null:D),G(D)},Y=z.flatMap((D)=>n.map((x,V)=>{let t=VB(x,V,n.length,D),M=x4(t),I=T===M,O=String(x?.date||`day-${V}`),C=`${y1(O)} ${D.label}: ${t.valueLabel}`;return w("g",{key:`${D.key}-${O}`,className:`stat-point-group ${D.className} ${I?"active":""}`,role:"button",tabIndex:0,"aria-label":C,"data-testid":`codex-stats-point-${D.className}-${O}`,onMouseEnter:()=>S(t),onFocus:()=>S(t),onClick:()=>p(t),onKeyDown:(g)=>{if(g.key==="Enter"||g.key===" ")g.preventDefault(),p(t)}},w("circle",{className:"stat-hit-point",cx:t.x,cy:t.y,r:13}),w("circle",{className:`stat-point ${D.className} ${I?"active":""}`,cx:t.x,cy:t.y,r:I?5.6:4.2}))}));return w(dy,{title:"统计曲线",eyebrow:`Daily task stats / ${l}`,className:`codex-stats-panel ${Q.state}`,summary:w("span",null,`${y1(J.startDate)} -> ${y1(J.endDate)} · ${u?.timezone||"Asia/Shanghai"} · ${U}`),actions:ll(u)?w(j7,{title:"Code Queue Stats",data:u,onOpen:f,testId:"raw-codex-stats"}):null},w("div",{className:"codex-stats-hero","data-testid":"codex-stats-panel","data-stats-state":Q.state,"data-stats-degraded":Q.degraded===!0?"true":"false"},w(MB),w("div",null,w("strong",null,`${Bl(y.executedTasks)} tasks / ${Bl(y.retryAttempts)} retries`),w("span",null,`平均完成耗时 ${jn(y.avgDurationMs??void 0)} · 终态 ${Bl(y.completedTasks)} 个`))),Q.degraded===!0?w("div",{className:`codex-stats-diagnostic ${Q.state}`,"data-testid":"codex-stats-diagnostic"},w("b",null,U),w("span",null,F),u?.source?w("code",null,`source=${String(u.source)}`):null):null,w("div",{className:`codex-stats-chart ${j?"has-data":"no-data"}`,"data-testid":"codex-stats-chart","data-empty":j?"false":"true",onMouseLeave:()=>G(null)},w("svg",{viewBox:`0 0 ${ey} ${gq}`,preserveAspectRatio:"none",role:"img","aria-label":"Code Queue daily task statistics"},w("line",{className:"axis",x1:ly,x2:ey-ly,y1:T3,y2:T3}),w("line",{className:"grid",x1:ly,x2:ey-ly,y1:E_+$7/2,y2:E_+$7/2}),w("line",{className:"grid",x1:ly,x2:ey-ly,y1:E_,y2:E_}),w("polyline",{className:"stat-line tasks",points:l7(n,"executedTasks",_)}),w("polyline",{className:"stat-line retry",points:l7(n,"retryAttempts",$)}),w("polyline",{className:"stat-line duration",points:l7(n,"avgDurationMs",A)}),Z?w("g",{className:"stat-cursor-layer","data-testid":"codex-stats-active-point"},w("line",{className:"stat-cursor",x1:Z.x,x2:Z.x,y1:E_,y2:T3}),w("circle",{className:`stat-point-active ${Z.className}`,cx:Z.x,cy:Z.y,r:8})):null,w("g",{className:"stat-point-layer"},Y)),Z?w("div",{className:"codex-stats-tooltip active",style:c,"data-testid":"codex-stats-tooltip"},w("b",null,y1(Z.row?.date)),w("span",null,`${Z.label} · ${Z.valueLabel}`),w("code",null,`${Bl(Z.row?.executedTasks)} exec / ${Bl(Z.row?.retryAttempts)} retry / ${jn(Z.row?.avgDurationMs??void 0)}`)):null,!j?w("div",{className:"codex-stats-chart-empty","data-testid":"codex-stats-empty"},w("strong",null,U),w("span",null,N)):null,w("div",{className:"codex-stats-legend"},w("span",{className:"tasks"},"执行任务"),w("span",{className:"retry"},"重试次数"),w("span",{className:"duration"},"平均耗时")),w("div",{className:"codex-stats-scale"},w("span",null,y1(n[0]?.date)),w("span",null,q.join(" · ")||"暂无峰值"),w("span",null,y1(n.at(-1)?.date))),w("div",{className:`codex-stats-focus ${Z?"active":""}`,"data-testid":"codex-stats-focus"},Z?w(X3.default.Fragment,null,w("div",null,w("strong",null,y1(Z.row?.date)),w("span",null,`${Z.label} · ${Z.valueLabel}`)),w("div",{className:"codex-stats-focus-metrics"},w("code",null,`${Bl(Z.row?.executedTasks)} exec`),w("code",null,`${Bl(Z.row?.retryAttempts)} retry`),w("code",null,jn(Z.row?.avgDurationMs??void 0)))):w("span",null,N))),w("div",{className:"codex-stats-summary-grid"},w("article",null,w("span",null,"今日执行"),w("strong",null,String(Bl(i.executedTasks))),w("code",null,y1(i.date))),w("article",null,w("span",null,"今日重试"),w("strong",null,String(Bl(i.retryAttempts))),w("code",null,`累计 ${Bl(y.retryAttempts)}`)),w("article",null,w("span",null,"平均耗时"),w("strong",null,jn(y.avgDurationMs??void 0)),w("code",null,`${Bl(y.durationSamples)} samples`))),w("div",{className:"codex-stats-daily-list","data-testid":"codex-stats-daily-list"},n.length===0?w("div",{className:`codex-stats-daily-row empty ${Q.state}`,"data-testid":"codex-stats-day-empty"},w("span",null,U),w("b",null,F),w("b",null,"--"),w("code",null,Q.state==="empty"?"true empty":"diagnostic")):n.slice(-7).map((D)=>w("div",{key:String(D?.date||""),className:`codex-stats-daily-row ${X===String(D?.date||"")?"active":""}`,"data-testid":`codex-stats-day-${String(D?.date||"unknown")}`},w("span",null,y1(D?.date)),w("b",null,`${Bl(D?.executedTasks)} exec`),w("b",null,`${Bl(D?.retryAttempts)} retry`),w("code",null,jn(D?.avgDurationMs??void 0))))))}function xB({task:u,queueRows:l,busy:f,frozen:n,onMove:y}){let i=String(u?.id||""),_=O_(u),[$,A]=au(_);An(()=>{A(_)},[i,_]);let j=n||!i||f||["running","judging","retry_wait"].includes(String(u?.status||""));return w("div",{className:"codex-task-move-control","data-testid":"codex-task-queue-move-control"},w("label",null,"任务 queue",w("select",{value:$,disabled:n||!i||f,onChange:(J)=>A(String(J.target.value||_)),"data-testid":"codex-task-queue-move-select"},l.map((J)=>w("option",{key:String(J?.id||""),value:String(J?.id||"")},E3(J))))),w("button",{type:"button",className:"ghost-btn",disabled:j||$===_,onClick:()=>y($),title:n?"旧 Code Queue 任务移动已冻结":j?"运行中 / judging / retry_wait 的任务不能移动;请先打断或等当前 turn 结束":"移动已创建任务到另一个 queue","data-testid":"codex-task-queue-move-button"},"移动"))}function eq(u,l=4){let f=(Array.isArray(u)?u:[]).map((y)=>String(y||"").trim()).filter(Boolean);if(f.length===0)return"--";let n=f.slice(0,l).join(" / ");return f.length>l?`${n} +${f.length-l}`:n}function mB({task:u,loading:l,onLoadPromptPart:f,testId:n="codex-initial-prompt-full",textTestId:y="codex-initial-prompt-full-text",baseTextTestId:i="codex-initial-prompt-base"}){let _=U7(u),$=k4(u),A=R4(u).trimEnd(),j=String($.full?.text||""),J=nB(u),Q=Number(_.promptChars||u?.promptChars||j.length),U=Number(_.basePromptLines||ui(A)),F=Number(_.promptLines||ui(j));return w("section",{className:"codex-progressive-card codex-progressive-prompt","data-testid":"codex-progressive-prompt"},w("div",{className:"codex-progressive-card-head"},w("span",{className:"codex-output-channel"},"Prompt"),w("strong",null,"Submitted prompt / 原始用户 prompt"),w("code",null,`${U||ui(A)} lines / ${A.length} chars`)),w("pre",{className:"codex-prompt-full","data-testid":i},A||"空 prompt"),J?w("details",{className:"codex-reference-injection codex-progressive-full-prompt","data-testid":n,onToggle:(N)=>{if(N.currentTarget?.open&&!j)f?.("full")}},w("summary",null,w("span",null,"引用注入已折叠,点击按需拉取最终进入 Code agent 的完整 prompt"),w("code",null,j?`${F||ui(j)} lines / ${j.length} chars`:`${Number.isFinite(Q)&&Q>0?Q:"--"} chars`)),w("pre",{className:"codex-prompt-full codex-prompt-final-full","data-testid":y},j||(l?"正在按需拉取完整 prompt...":"展开后将只请求 full prompt,不拉取完整 transcript。"))):null)}function ZL({task:u,attempt:l,attemptIndex:f,loading:n,onLoadSteps:y,onLoadStep:i,testId:_="codex-execution-summary"}){let $=NB(UL(u,f)),A=FB(dV(u,l)),j=l?kV(u,l):N7(u),J=_7(u),Q=b4(u,f),U=Jn(j?.errorCount),F=$L($.length>0?$.length:null,l?.stepCount,l?.execution?.stepCount,A.traceLineCount,A.stepCount,l?.outputCount),N=Jn(j?.stepCount??j?.llmStepCount),K=N??F,G=Jn(j?.readCount),W=Jn(j?.editCount),L=Jn(j?.runCount),q=N??F,z=N!==null?"oa-event-flow":F!==null?"raw-trace":fy(u)?"syncing":"unavailable",Z=K===null?z==="syncing"?"sync":"N/A":String(K),T=q===null?z==="syncing"?"sync":"N/A":`${q}${z==="raw-trace"?" raw":""}`,X=z==="oa-event-flow"?"STEP 来自 OA Event Flow 统计中心":z==="raw-trace"?"OA STEP 统计不可用,当前显示 raw trace fallback 行数":z==="syncing"?"STEP 统计同步中;展开后会按需读取当前 attempt trace":"当前 attempt 没有可用 STEP 统计",c=Array.isArray(A.editedFiles)?A.editedFiles:[],S=Array.isArray(A.commands)?A.commands:[],Y=W7(l,f)?` · ${String(l?.label||"recovered thread execution")}`:f?` #${f}`:"",D=eV(u,l,f,A),x=`最近更新: ${O3(D)}`,V=lB(u,l,f);return w("details",{className:`codex-progressive-card codex-execution-summary ${V?"running":""}`,"data-testid":_,"data-attempt-index":s4(f),"data-running":V?"true":"false",onToggle:(t)=>{if(t.currentTarget?.open&&!Q)y?.(f)}},w("summary",null,w("div",{className:"codex-progressive-card-head"},w("span",{className:"codex-output-channel"},"Summary"),w("strong",null,`执行过程摘要${Y}`),V?w("span",{className:"codex-summary-running-pill","data-testid":`${_}-running`},"执行中"):null,w("code",{title:`${D?`最近更新: ${Zu(D)}`:x};${X}`},`${jn(A.durationMs??A.totalElapsedMs)} / ${Z} tools / ${x}`)),w("div",{className:"codex-execution-digest"},w("span",{title:"来自 OA Event Flow 统计中心"},`read ${G===null?"--":G}`),w("span",{title:"来自 OA Event Flow 统计中心"},`edit ${W===null?"--":W}`),w("span",{title:"来自 OA Event Flow 统计中心"},`run ${L===null?"--":L}`),w("span",{title:X,"data-testid":`${_}-step-count`,"data-step-state":z},`STEP ${T}`),U!==null&&U>0?w("span",{className:"codex-execution-error-pill","data-testid":`${_}-error-count`},`Error ${U}`):null)),w("div",{className:"codex-execution-digest expanded"},w("span",null,`修改文件:${eq(c,6)}`),w("span",null,`执行命令:${eq(S,4)}`)),$.length===0?w("div",{className:"codex-output-empty"},n?"正在按需拉取步骤 summary...":"展开后将只请求执行步骤 summary,不拉取单步骤全量。"):w("div",{className:"codex-trace-step-list"},$.map((t)=>{let M=String(t?.seq??""),I=J[M],O=Array.isArray(t?.summaryLines)?t.summaryLines.slice(0,4):[],C=O.find((g)=>String(g||"").trim().length>0);return w("details",{key:M||`${t?.title}-${t?.at}`,className:`codex-trace-step ${String(t?.kind||"message")} ${_B(t)?"error":""}`,"data-testid":`codex-trace-step-${M||"unknown"}`,onToggle:(g)=>{if(g.currentTarget?.open&&!I)i?.(t?.seq)}},w("summary",null,w("span",{className:"codex-output-channel"},RB(t?.kind)),w("strong",null,String(t?.title||"Trace step")),t?.status?w("code",null,String(t.status)):null,C?w("span",{className:"codex-trace-step-inline-summary",title:String(C)},String(C)):null,w("time",null,Zu(t?.at))),w("div",{className:"codex-trace-step-summary"},O.length>0?O.map((g,a)=>w("pre",{key:`${M}-${a}`},String(g||""))):w("span",null,"无 summary")),I?.line?w(P4,{items:[I.line],autoScroll:!1,loading:!1,hasDetail:!0,emptyText:"无步骤详情",testId:`codex-trace-step-detail-${M||"unknown"}`,className:"codex-transcript codex-step-detail-transcript",collapseTools:!1}):w("div",{className:"codex-output-empty"},n?"正在按需拉取这个步骤的全量数据...":"展开后将只请求这个单步骤的全量数据。"))})))}function RB(u){let l=String(u||"");if(l==="ran")return"Ran";if(l==="explored")return"Explored";if(l==="edited")return"Edited";if(l==="error")return"Error";if(l==="system")return"System";return"Message"}function EL({task:u,attempt:l,attemptIndex:f,testId:n="codex-final-response"}){let y=uB(u,l);if(y.length===0)return null;let i=Number(l?.finalResponseChars||y.length),_=f?` #${f}`:"";return w("section",{className:"codex-progressive-card codex-final-response","data-testid":n,"data-attempt-index":s4(f)},w("div",{className:"codex-progressive-card-head"},w("span",{className:"codex-output-channel"},"Final"),w("strong",null,`最终 response${_}`),w("code",null,`${Number.isFinite(i)?i:y.length} chars`)),w(K_,{markdown:y,className:"codex-transcript-body codex-markdown",testId:`${n}-markdown`}))}function HL({task:u,attempt:l,attemptIndex:f,testId:n="codex-progressive-judge"}){let y=JL(u,l,f);if(!y?.decision)return null;let i=f?` #${f}`:"";return w("section",{className:"codex-progressive-card codex-progressive-judge","data-testid":n,"data-attempt-index":s4(f)},w("div",{className:"codex-progressive-card-head"},w("span",{className:"codex-output-channel"},"Judge"),w("strong",null,`完成判定${i}`),w("code",null,`${y.decision} ${Math.round(Number(y.confidence||0)*100)}%`)),w("div",{className:"codex-judge-card","data-testid":`${n}-card`},w(li,{status:y.decision},y.decision),w("strong",null,`${Math.round(Number(y.confidence||0)*100)}% confidence`),w("p",{"data-testid":`${n}-reason`},y.reason||"--"),w(jL,{judge:y,testId:`${n}-failure-details`}),y.continuePrompt?w("pre",{"data-testid":`${n}-continue-prompt`},String(y.continuePrompt||"")):null))}function bB({task:u,attempt:l,attemptIndex:f,loading:n,onLoadPromptPart:y,testId:i="codex-judge-feedback-prompt"}){let _=fB(u,l,f);if(_===null)return null;let $=QL(f),j=k4(u)[$],J=String(j?.text||"").trimEnd(),Q=String(_.preview||_.text||"").trimEnd(),U=J||String(_.text||"").trimEnd(),F=Number(j?.chars||_.chars||U.length||Q.length),N=Number(j?.lines||_.lines||ui(U||Q)),K=j?.forAttempt||_.forAttempt||Number(f||0)+1;return w("details",{className:"codex-progressive-card codex-judge-feedback-prompt","data-testid":i,"data-attempt-index":s4(f),onToggle:(G)=>{if(G.currentTarget?.open&&!J)y?.("feedback",f)}},w("summary",null,w("div",{className:"codex-progressive-card-head"},w("span",{className:"codex-output-channel"},"Prompt"),w("strong",null,`judge feedback prompt #${f} -> #${K}`),w("code",null,`${N||"--"} lines / ${Number.isFinite(F)?F:Q.length} chars`)),w("p",{className:"codex-feedback-preview","data-testid":`${i}-preview`},Q||"展开后按需拉取 judge feedback prompt。")),w("pre",{className:"codex-prompt-full codex-feedback-full","data-testid":`${i}-text`},U||(n?"正在按需拉取 judge feedback prompt...":"展开后将只请求这一次 judge feedback prompt。")))}function kB({task:u,attempt:l,position:f,loading:n,onLoadPromptPart:y,onLoadSteps:i,onLoadStep:_}){let $=WB(l,f),A=F7(u,$),j=f===0&&!A,J=W7(l,$),Q=J?String(l?.label||"Recovered thread execution"):`Attempt ${$}`;return w("section",{className:"codex-attempt-cycle","data-testid":`codex-attempt-cycle-${$}`},w("div",{className:"codex-attempt-cycle-head"},w("span",{className:"codex-output-channel"},Q),w("strong",null,String(l?.mode||($<=1?"initial":"retry"))),l?.terminalStatus?w(li,{status:l.terminalStatus},l.terminalStatus):null,w("code",null,`${Zu(l?.startedAt)} -> ${Zu(l?.finishedAt)}`)),w(ZL,{task:u,attempt:l,attemptIndex:$,loading:n,onLoadSteps:i,onLoadStep:_,testId:A?"codex-execution-summary-current":j?"codex-execution-summary":`codex-execution-summary-attempt-${$}`}),J?null:w(EL,{task:u,attempt:l,attemptIndex:$,testId:A?"codex-final-response-current":j?"codex-final-response":`codex-final-response-attempt-${$}`}),J?null:w(HL,{task:u,attempt:l,attemptIndex:$,testId:A?"codex-progressive-judge-current":j?"codex-progressive-judge":`codex-progressive-judge-attempt-${$}`}),J?null:w(bB,{task:u,attempt:l,attemptIndex:$,loading:n,onLoadPromptPart:y,testId:A?"codex-judge-feedback-prompt-current":j?"codex-judge-feedback-prompt":`codex-judge-feedback-prompt-attempt-${$}`}))}function hB({task:u,loading:l,onLoadPromptPart:f,onLoadSteps:n,onLoadStep:y}){if(!u)return w(V_,{title:"未选择任务",text:"从左侧队列选择任务,或提交新 Codex 任务。"});let i=oV(u);return w("div",{className:"codex-transcript codex-progressive-trace","data-testid":"codex-output"},l&&!Lf(u)?w("div",{className:"codex-output-empty"},"正在加载 Trace Summary..."):null,w(mB,{task:u,loading:l,onLoadPromptPart:f}),i.length>0?i.map((_,$)=>w(kB,{key:`${_?.index||$+1}-${_?.startedAt||$}`,task:u,attempt:_,position:$,loading:l,onLoadPromptPart:f,onLoadSteps:n,onLoadStep:y})):[w(ZL,{key:"execution",task:u,loading:l,onLoadSteps:n,onLoadStep:y}),w(EL,{key:"final",task:u}),w(HL,{key:"judge",task:u})])}function IB({task:u}){let l=CV(u);if(!u||l.length===0)return w(V_,{title:"暂无原始消息",text:"原始 Codex app-server 消息会保留在任务 JSON 中。"});return w("details",{className:"codex-raw-output"},w("summary",null,`原始 messages (${l.length})`),w("div",null,l.map((f)=>w("article",{key:`${f.seq}-${f.channel}`,className:`codex-output-line ${f.channel||"system"}`},w("div",{className:"codex-output-meta"},w("span",{className:"codex-output-channel"},zB(String(f.channel||"system"))),w("span",null,Zu(f.at)),f.method?w("code",null,f.method):null),w("pre",null,String(f.text||""))))))}function vB({task:u}){let l=pV(u).slice().reverse();if(l.length===0)return w(V_,{title:"尚无 attempt",text:"任务开始运行后,这里会记录 Codex 终态、传输中断和 stderr tail。"});return w("div",{className:"table-wrap codex-attempt-table"},w("table",null,w("thead",null,w("tr",null,w("th",null,"#"),w("th",null,"模式"),w("th",null,"终态"),w("th",null,"传输"),w("th",null,"退出"),w("th",null,"完成时间"))),w("tbody",null,l.map((f)=>w("tr",{key:`${f.index}-${f.startedAt}`},w("td",null,f.index),w("td",null,f.mode),w("td",null,w(li,{status:f.terminalStatus||"unknown"},f.terminalStatus||"unknown")),w("td",null,f.transportClosedBeforeTerminal?w(li,{status:"failed"},"closed-before-terminal"):w(li,{status:"succeeded"},"normal")),w("td",null,`code=${f.appServerExitCode??"--"} signal=${f.appServerSignal??"--"}`),w("td",null,Zu(f.finishedAt)))))))}function OL({microservices:u,onRaw:l,apiBaseUrl:f="/api",initialTasksData:n=null,standalone:y=!1}){let i=u.find((B)=>B.id==="code-queue")||null,_=oq(n),$=String(_?.id||""),A=new Map;if(_!==null&&$.length>0)A.set($,{task:_,maxSeq:Z3(Array.isArray(_.transcript)?_.transcript:[]),complete:Boolean(_._transcriptComplete),completeUpdatedAt:_._transcriptComplete?String(_.updatedAt||""):""});let j=typeof performance>"u"?0:performance.now(),J=Il($),Q=Il(0),U=Il(0),F=Il(0),N=Il(!1),K=Il(!1),G=Il(!1),W=Il(null),L=Il(new Map),q=Il(new Map),z=Il(new Map),Z=Il(new Map),T=Il(new Set),X=Il(null),c=Il(null),S=Il(!1),p=Il(!1),Y=Il(Boolean(n)),D=Il(new Map),x=Il(new Set),V=Il(A),t=Il(n),[M,I]=au(null),[O,C]=au(n),[g,a]=au(ll(n?.statistics)),[yu,ru]=au($),[R,m]=au(_),[fu,iu]=au(!1),[Ju,Vu]=au(""),[Lu,Bu]=au(null),[b,o]=au(!1),[nu,wu]=au(!1),d=n?.queue||{},zu=String(d?.mainProviderId||d?.defaultProviderId||"D601").trim()||"D601",[v,$u]=au(""),[Wu,tu]=au(""),[hu,$l]=au("default"),[gu,Sf]=au(_1),[Q0,ff]=au(!1),[U0,Pf]=au(""),[Nu,eu]=au(zu),[sl,bu]=au("default"),[jf,Mf]=au("gpt-5.5"),[Jf,al]=au(H3(d,"default",zu)||"/workspace"),[B0,bn]=au(99),[af,A$]=au(1),[z1,G1]=au(!1),[e,Su]=au(!1),[mu,il]=au(""),[zl,dl]=au(""),[jl,nf]=au(""),[kn,gr]=au(!0),[r$,j$]=au(()=>typeof window>"u"?!0:window.matchMedia(TV).matches),[Ol,m6]=au(!1),[sr,Wl]=au(""),[hQ,Ml]=au(""),{addNotification:Zf}=kf(),[Ei,R6]=au(""),[J$,b6]=au(""),[Q$,k6]=au(!1),[h6,w1]=au(null),[Hi,Oi]=au(!1),[of,X0]=au(n?{phase:"complete",taskId:$,queueMs:0,detailMs:0,totalMs:j,chunks:_?1:0,transcriptRows:Array.isArray(_?.transcript)?_.transcript.length:0,partial:Boolean(n?.selected?.hasMore||w3(_)),completedAt:new Date}:null),[I6,Ti]=au(n?new Date:null),[U$,N$]=au(!1),qn=Kn(ml(O)),v6=qn.filter(i1),cl=O?.queue||M?.body?.queue||M?.queue||{},ar=EV(cl,M),or=g||ZB(O,cl),g6=Bn(O),s0=pq(cl,hu),Ty=String(hu||"default").trim()||"default",Z1=s0.filter((B)=>String(B?.id||"")!==Ty),Vi=H_(s0,gu),E1=Number((If(gu)?cl?.total:Vi?.total)??g6.total??qn.length),F$=Z_(cl),IQ=If(gu)?F$:[String(H_(s0,gu)?.activeTaskId||"")].filter(Boolean),hn=xq(cl,s0,gu,qn),vQ=If(gu)?o9(cl):o9(Vi||{}),s6=o9(cl),a6=GB(s6),kZ=Math.max(wB(s6),F$.length),hZ=Bl((If(gu)?cl?.unreadTerminal:Vi?.unreadTerminal)??v6.length),Bi=O?v6.length:hZ,o6=If(gu)?"All queues":i7(Vi||{id:gu,name:gu}),Xi=y7(Ju),N0=Xi.length>0,gQ=N0?Kn(ml(Lu)):[],dr=Bn(Lu),Ln=N0?gQ:qn,sQ=Ln.filter(i1),IZ=Ln.filter((B)=>!rn(B)).sort(wV),vZ=Ln.filter((B)=>rn(B)&&!i1(B)),aQ=N0?dr:g6,ci=N0?Number(dr.total??gQ.length):E1,oQ=aQ.hasMore===!0&&String(aQ.nextBeforeId||"").length>0,er=N0?nu:U$,gZ=i?KV(i):{},sZ=i?zV(i):{},u2=Pq(()=>xV(v),[v]),Vy=Pq(()=>{let B=bq(af);return u2.flatMap((P)=>Array.from({length:B},()=>mV(P,Wu)))},[u2,af,Wu]),W$=Vy.length,dQ=W$>1&&!z1,Ul=!0,aZ=Ul||e||Ol||W$===0||dQ,eQ=cB(cl,jf),d6=YB(cl,Nu),uU=DB(cl,sl),lU=H3(cl,sl,Nu),oZ=Array.isArray(h6?.workdirs)?h6.workdirs:[],fU=SB(cl,oZ,Nu,sl,Jf),l2=fU.some((B)=>B.source==="saved"&&T_(B.path)===T_(Jf)),f2=!Ul&&R?.id&&R?.activeTurnId&&String(R?.status)==="running",dZ=R?.id&&!["succeeded","failed","canceled"].includes(String(R?.status||"")),eZ=!Ul&&R?.id&&["succeeded","failed","canceled"].includes(String(R?.status||"")),Yi=!Ul&&R?.id&&qL(R);function Cf(B){let P=typeof B==="function"?B(t.current):B;t.current=P;let s=ll(P?.statistics);if(s)a(s);return C(P),P}async function nU(B=gu){if(!i)return;try{let P=await cV(f,B),s=ll(P?.statistics)||ll(P?.stats)||ll(P);if(s)a(s);if(P?.queue)Cf((lu)=>lu?{...lu,queue:P.queue}:{ok:!0,queue:P.queue,tasks:[],pagination:{returned:0,total:0,hasMore:!1}})}catch(P){a(vq(P))}}function uE(B,P,s=!0){let lu=Array.from(new Set(B.map((Uu)=>String(Uu||"")).filter(Boolean)));for(let Uu of lu)if(D.current.set(Uu,P),s)x.current.add(Uu);return lu}function yU(B){for(let P of B.map((s)=>String(s||"")).filter(Boolean))D.current.delete(P),x.current.delete(P)}function e6(B){let P=String(B?.id||""),s=P?D.current.get(P):void 0;if(!s)return B;if(String(B?.status||"").length>0&&!rn(B))return D.current.delete(P),x.current.delete(P),B;return{...B,readAt:B?.readAt||s,terminalUnread:!1}}function n2(B){let P=String(B?.id||"");return P.length>0&&x.current.has(P)&&rn(B)}function Kn(B,P=!0){let s=[];for(let lu of Array.isArray(B)?B:[]){let Uu=e6(lu);if(P&&n2(Uu))continue;s.push(Uu)}return s}function lE(B,P=!0){if(!B||!Array.isArray(B?.tasks))return B;let s=Kn(ml(B),P),lu=Bn(B);return{...B,tasks:s,pagination:B.pagination?{...lu,returned:s.length}:B.pagination}}function y2(B,P){return If(P)||O_(B)===P}function i2(B){let P=Xi.toLowerCase();if(P.length===0)return!0;return[B?.id,B?.status,B?.queueId,B?.providerId,B?.model,B?.cwd,B?.displayPrompt,B?.basePrompt,B?.prompt,m4(B?.displayPromptPreview),m4(B?.basePromptPreview),m4(B?.promptPreview),B?.finalResponse,B?.lastError?.message].map((lu)=>String(lu||"").toLowerCase()).join(` +`).includes(P)}function fE(B,P){let s=B.filter((Yu)=>String(Yu?.id||"").length>0);if(s.length===0&&!P)return;let lu=s[0]||null,Uu=String(lu?.id||""),Tu=s.filter((Yu)=>y2(Yu,gu)),Ou=Tu.filter(i2),Iu=String(P?.activeTaskId||Z_(P)[0]||Uu||hn||"");for(let Yu of s){let Cu=String(Yu?.id||"");if(!Cu)continue;let vu=Array.isArray(Yu?.transcript)?Yu.transcript:[];V.current.set(Cu,{...V.current.get(Cu)||{},task:{...Yu,_summaryLoaded:!0,_detailLoaded:vu.length>0,_transcriptComplete:!1,_transcriptPreview:!1},maxSeq:Z3(vu),complete:!1,completeUpdatedAt:""})}if(Cf((Yu)=>{if(!Yu&&(Tu.length===0||!P))return Yu;let Cu=ml(Yu),vu=Kn(Xn([Cu,Tu],Iu));return{...Yu||{},queue:P||Yu?.queue,tasks:vu,pagination:Yu?.pagination?{...Bn(Yu),returned:vu.length}:Yu?.pagination}}),N0)Bu((Yu)=>{if(!Yu||Ou.length===0)return Yu;let Cu=Kn(Xn([ml(Yu),Ou],Iu));return{...Yu,queue:P||Yu.queue,tasks:Cu,pagination:Yu.pagination?{...Bn(Yu),returned:Cu.length}:Yu.pagination}});if(lu&&y2(lu,gu)&&i2(lu))F.current+=1,J.current=Uu,ru(Uu),m(V.current.get(Uu)?.task||lu),iu(!1),X0({phase:"complete",taskId:Uu,queueMs:0,detailMs:0,totalMs:0,chunks:1,transcriptRows:Array.isArray(lu?.transcript)?lu.transcript.length:0,partial:!0,completedAt:new Date});Ti(new Date)}function nE(B){let P=String(B||cl?.mainProviderId||"D601").trim()||"D601";eu(P),al(H3(cl,sl,P)),w1(null),r2().catch((s)=>Wl(Dl(s,"加载工作目录失败")))}function yE(B){let P=String(B||"default").trim()||"default",s=Nu;if(P==="windows-native"){if(!d6.find((Uu)=>Uu.id===Nu)?.supportsWindowsNativeCodex)s=String(d6.find((Uu)=>Uu.supportsWindowsNativeCodex)?.id||Nu||"D601"),eu(s)}bu(P),al(H3(cl,P,s)),w1(null),r2().catch((lu)=>Wl(Dl(lu,"加载工作目录失败")))}function u8(B,P,s=null,lu=null){let Uu=new Set(uE(B,P));if(Uu.size===0&&lu===null&&s===null)return;Cf((Tu)=>{if(!Tu)return Tu;let Ou=ml(Tu).flatMap((Iu)=>{let Yu=String(Iu?.id||"");if(!Uu.has(Yu)){let Nl=e6(Iu);return n2(Nl)?[]:[Nl]}let Cu=lu&&String(lu?.id||"")===Yu?lu:{},vu={...Iu,...Cu,readAt:P,terminalUnread:!1};return n2(vu)?[]:[vu]});return{...Tu,queue:s||Tu.queue,tasks:Uu.size>0?Xn([Ou],hn):Ou}});for(let Tu of Uu){let Ou=V.current.get(Tu);if(Ou?.task){let Iu=lu&&String(lu?.id||"")===Tu?lu:{},Yu={...Ou.task,...Iu,readAt:P,terminalUnread:!1};if(V.current.set(Tu,{...Ou,task:Yu}),J.current===Tu)m(Yu)}}}An(()=>{G1(!1)},[v,af,Wu]),An(()=>{let B=y7(Ju);U.current+=1;let P=U.current;if(!i||B.length===0){Bu(null),o(!1),wu(!1),G.current=!1;return}o(!0),Bu(null);let s=window.setTimeout(()=>{(async()=>{try{let lu=await mq(f,gu,B);if(P!==U.current)return;Bu(lE(lu))}catch(lu){if(P===U.current)Bu(null),Wl(Dl(lu,"搜索 Codex tasks 失败"))}finally{if(P===U.current)o(!1)}})()},240);return()=>window.clearTimeout(s)},[i?.id,f,gu,Ju]),An(()=>{dl(R?R4(R):""),nf(Array.isArray(R?.referenceTaskIds)?R.referenceTaskIds.join(" "):"")},[yu]);function a0(B,P,s){let lu=V.current.get(B)||{},Uu=lu.task||{},Tu=Array.isArray(Uu.transcript)?Uu.transcript:[],Ou=aq(Uu,P),Iu=Object.prototype.hasOwnProperty.call(P,"transcript")?f7(Tu,Array.isArray(P.transcript)?P.transcript:[]):Tu,Yu={...Uu,...Ou,transcript:Iu,output:Array.isArray(Ou.output)?A7(Uu,Ou,"output"):Array.isArray(Uu.output)?Uu.output:[],events:Array.isArray(Ou.events)?A7(Uu,Ou,"events"):Array.isArray(Uu.events)?Uu.events:[]},Cu=e6(Yu),vu=String(Cu?.updatedAt||""),Nl=Boolean(P._transcriptComplete)&&rn(Cu),yf=Boolean(lu.complete)&&rn(Cu)&&String(lu.completeUpdatedAt||"")===vu,Al=Nl||yf,Qf={...lu,task:Cu,maxSeq:Z3(Iu),complete:Al,completeUpdatedAt:Al?vu:""};if(V.current.set(B,Qf),s===F.current&&J.current===B)m(Cu);return Qf}async function H1(B,P=!1,s,lu){if(!i||!B)return;let Tu=V.current.get(B)?.task;if(!P&&p4(Tu))return;let Ou=B,Iu=L.current.get(Ou);if(Iu){if(P||!p4(Tu))Iu.refreshAfter=!0;return Iu.promise}let Yu=F.current,Cu=performance.now();if(J.current===B)iu(!0);let vu={promise:Promise.resolve(),refreshAfter:!1},Nl=(async()=>{try{let yf=await YV(f,B);if(Yu!==F.current||J.current!==B)return;let Al=yf?.summary||{},Qf=String(Al.updatedAt||"");a0(B,{id:B,status:Al.status,updatedAt:Qf,startedAt:Al.startedAt,finishedAt:Al.finishedAt,currentAttempt:Al.currentAttempt,maxAttempts:Al.maxAttempts,finalResponse:Al.finalResponse,lastJudge:Al.lastJudge,lastError:Al.lastError,attempts:Array.isArray(Al.attempts)?Al.attempts:[],stepCount:Al.stepCount,llmStepCount:Al.llmStepCount,traceStats:Al.traceStats,statsSource:Al.statsSource,timing:Al.timing,_traceSummary:Al,_traceSummaryLoaded:!0,_traceSummaryUpdatedAt:Qf,_detailLoaded:!0},Yu),X0({phase:"complete",taskId:B,queueMs:lu??0,detailMs:performance.now()-Cu,totalMs:s===void 0?performance.now()-Cu:performance.now()-s,chunks:1,transcriptRows:Number(Al?.execution?.traceLineCount||Al?.execution?.stepCount||0),partial:!1,completedAt:new Date})}finally{let yf=Boolean(vu.refreshAfter&&J.current===B&&!p4(V.current.get(B)?.task));if(L.current.delete(Ou),Yu===F.current&&J.current===B)iu(!1);if(yf)window.setTimeout(()=>{H1(B,!0).catch((Al)=>Wl(Dl(Al,"自动刷新 Trace Summary 失败")))},0)}})();vu.promise=Nl,L.current.set(Ou,vu),await Nl}async function iE(B,P=null){let s=J.current;if(!i||!s||!B)return;let lu=V.current.get(s)?.task,Uu=k4(lu),Tu=B==="feedback"||B==="judge-feedback"?QL(P):B;if(Uu[Tu]?.text)return;let Ou=`${s}:${Tu}`,Iu=q.current.get(Ou);if(Iu)return Iu;let Yu=F.current;if(J.current===s)iu(!0);let Cu=(async()=>{try{let vu=await DV(f,s,B,P);if(Yu!==F.current||J.current!==s)return;let Nl=V.current.get(s)?.task,yf=k4(Nl);a0(s,{...B==="full"?{prompt:String(vu?.text||""),promptChars:Number(vu?.chars||0)}:{},_promptDetails:{...yf,[Tu]:vu}},Yu)}finally{if(q.current.delete(Ou),Yu===F.current&&J.current===s)iu(!1)}})();q.current.set(Ou,Cu),await Cu}async function l8(B=null,P={}){let s=J.current;if(!i||!s)return;let lu=V.current.get(s)?.task,Uu=B===null||B===void 0||String(B).length===0?"":String(B),Tu=b4(lu,Uu||null),Ou=Boolean(P.force),Iu=Boolean(P.incremental);if(Tu&&!Ou)return;let Yu=UL(lu,Uu||null),Cu=Iu&&Yu.length>0?yB(Yu):0,vu=`${s}:${Uu||"all"}:${Cu}`,Nl=z.current.get(vu);if(Nl)return Nl;let yf=F.current;if(J.current===s)iu(!0);let Al=(async()=>{try{let Qf=await tV(f,s,Cu,500,Uu||null);if(yf!==F.current||J.current!==s)return;let zn=Array.isArray(Qf?.steps)?Qf.steps:[],In=Cu>0?iB(Yu,zn):zn;if(Uu){let O1=V.current.get(s)?.task,Di=ll(O1?._traceStepsByAttempt)||{},o0=ll(O1?._traceStepsLoadedByAttempt)||{},c0=ll(O1?._traceStepsNextAfterSeqByAttempt)||{};a0(s,{_traceStepsByAttempt:{...Di,[Uu]:In},_traceStepsLoadedByAttempt:{...o0,[Uu]:!0},_traceStepsNextAfterSeqByAttempt:{...c0,[Uu]:Qf?.nextAfterSeq}},yf)}else a0(s,{_traceSteps:In,_traceStepsLoaded:!0,_traceStepsHasMore:Boolean(Qf?.hasMore),_traceStepsNextAfterSeq:Qf?.nextAfterSeq},yf)}finally{if(z.current.delete(vu),yf===F.current&&J.current===s)iu(!1)}})();z.current.set(vu,Al),await Al}async function _E(B){let P=J.current,s=String(B??"");if(!i||!P||s.length===0)return;let lu=V.current.get(P)?.task;if(_7(lu)[s]?.line)return;let Tu=`${P}:${s}`,Ou=Z.current.get(Tu);if(Ou)return Ou;let Iu=F.current;if(J.current===P)iu(!0);let Yu=(async()=>{try{let Cu=await SV(f,P,B);if(Iu!==F.current||J.current!==P)return;let vu=V.current.get(P)?.task,Nl=_7(vu);a0(P,{_traceStepDetails:{...Nl,[s]:Cu}},Iu)}finally{if(Z.current.delete(Tu),Iu===F.current&&J.current===P)iu(!1)}})();Z.current.set(Tu,Yu),await Yu}function $E(B){if(J.current!==B)return;let P=V.current.get(B)?.task;if(!P)return;if(b4(P,null))l8(null,{force:!0,incremental:!0}).catch((lu)=>Wl(Dl(lu,"增量刷新 Trace Steps 失败")));let s=ll(P?._traceStepsLoadedByAttempt)||{};for(let lu of Object.keys(s).filter((Uu)=>s[Uu]))l8(lu,{force:!0,incremental:!0}).catch((Uu)=>Wl(Dl(Uu,"增量刷新 Attempt Trace Steps 失败")))}async function Bx(B,P,s){if(!i||!B)return;let lu=performance.now(),Uu=F.current,Tu=V.current.get(B);if(Tu?.task){if(m(Tu.task),iu(w3(Tu.task)||!Tu.complete),!w3(Tu.task)&&Tu.complete&&rn(Tu.task)&&String(Tu.completeUpdatedAt||"")===String(Tu.task?.updatedAt||"")){X0({phase:"complete",taskId:B,queueMs:s??0,detailMs:0,totalMs:P===void 0?0:performance.now()-P,chunks:0,transcriptRows:Array.isArray(Tu.task.transcript)?Tu.task.transcript.length:0,completedAt:new Date});return}}else iu(!0);let Ou=W.current;if(Ou?.taskId===B&&Ou.token===Uu)return Ou.promise;let Iu=(async()=>{try{let Yu=await tl(Sl(f,`/api/tasks/${encodeURIComponent(B)}?meta=1`));if(Uu!==F.current||J.current!==B)return;let Cu=V.current.get(B),vu=Array.isArray(Cu?.task?.transcript)?Cu.task.transcript:[],Nl=Yu?.task||{},yf=Boolean(Cu?.complete)&&String(Cu?.completeUpdatedAt||"")===String(Nl?.updatedAt||"");a0(B,{...Nl,summaryOnly:!1,_metaLoaded:!0,transcript:vu,_detailLoaded:vu.length>0,_transcriptComplete:yf},Uu);let Al=w3(Cu?.task)||Boolean(Cu?.task?._transcriptPreview),Qf=Al?0:vu.length>0?dq(vu):0,zn=!Al&&Cu?.complete&&rn(Nl)&&String(Cu?.completeUpdatedAt||"")===String(Nl?.updatedAt||"")?Z3(vu):Qf,In=!0,O1=0,Di=vu.length;while(In){let o0=await tl(Sl(f,`/api/tasks/${encodeURIComponent(B)}/transcript?afterSeq=${encodeURIComponent(String(zn))}&limit=${WV}&fullText=1`));if(Uu!==F.current||J.current!==B)return;let c0=V.current.get(B),ti=Array.isArray(c0?.task?.transcript)?c0.task.transcript:[],By=f7(ti,Array.isArray(o0?.transcript)?o0.transcript:[]);O1+=1,Di=By.length;let bl=Boolean(!o0?.hasMore);if(a0(B,{status:o0?.status||Nl.status,updatedAt:o0?.updatedAt||Nl.updatedAt,transcript:By,_detailLoaded:bl||By.length>0,_transcriptComplete:bl,_transcriptPreview:Al&&!bl},Uu),In=Boolean(o0?.hasMore),zn=Number(o0?.nextAfterSeq??Z3(By)),!In)break;await new Promise((UU)=>window.setTimeout(UU,0))}X0({phase:"complete",taskId:B,queueMs:s??0,detailMs:performance.now()-lu,totalMs:P===void 0?performance.now()-lu:performance.now()-P,chunks:O1,transcriptRows:Di,completedAt:new Date})}finally{if(W.current?.taskId===B&&W.current?.token===Uu)W.current=null;if(Uu===F.current&&J.current===B)iu(!1)}})();W.current={taskId:B,token:Uu,promise:Iu},await Iu}async function F0(B=J.current,P=!0,s=gu){if(!i)return;if(!P&&p.current)return;let lu=performance.now();if(P)p.current=!0;if(P)X0({phase:"loading",taskId:String(B||J.current||""),startedAt:new Date});let Uu=Q.current+1;Q.current=Uu;let Tu=String(B||J.current||""),Ou=Tu?V.current.get(Tu):null,Iu=Array.isArray(Ou?.task?.transcript)?Ou.task.transcript:[],Yu=dq(Iu),Cu=null,vu=P&&Tu.length===0;if(Cu=vu?await mq(f,s,""):await a9(f,Tu,Yu,s,"",!0,{stats:!1}),Uu!==Q.current){if(P)p.current=!1;return}let Nl=performance.now()-lu;I(M||{});let yf=Cu?.queue||{},Al=String(yf?.activeTaskId||Z_(yf)[0]||""),Qf=Cu;Cf((kl)=>{let T1=ml(Cu),W0=ml(kl),Y0=W0.length>0?Xn([W0,T1],Al):Xn([T1],Al),V1=Kn(Y0),f8=Bn(Cu),Xy=Bn(kl),J2=W0.length>T1.length&&(Xy.hasMore===!1||String(Xy.nextBeforeId||"").length>0),ME={...f8,...J2?{hasMore:Xy.hasMore,nextBeforeId:Xy.nextBeforeId}:{},returned:V1.length};return Qf={...Cu,tasks:V1,pagination:ME},Qf});let zn=ml(Qf),In=pq(yf,hu),O1=xq(yf,In,s,zn),Di=XV(In,s,zn),o0=Tu||J.current,c0=Qf?.selected||null,ti=c0?.task||null,By=Array.isArray(c0?.transcript)?c0.transcript:null,bl=o0||O1||Di||zn[0]?.id||"";if(J.current!==bl)F.current+=1;J.current=bl,ru(bl);let Si=zn.find((kl)=>kl.id===bl);if(Si){let kl=V.current.get(bl);if(kl?.task)V.current.set(bl,{...kl,task:{...Si,...kl.task,status:Si.status,updatedAt:Si.updatedAt}})}if(vu&&Si){if(a0(bl,{...Si,_summaryLoaded:!1,transcript:[],_detailLoaded:!1,_transcriptComplete:!1,_transcriptPreview:!0},F.current),iu(!0),X0({phase:"complete",taskId:bl,queueMs:Nl,detailMs:0,totalMs:performance.now()-lu,chunks:0,transcriptRows:0,partial:!0,completedAt:new Date}),Ti(new Date),P)p.current=!1;H1(bl,!0).catch((kl)=>Wl(Dl(kl,"加载 Codex Trace Summary 失败"))),a9(f,bl,0,s,"",!1).then((kl)=>{if(Uu!==Q.current)return;let T1=ml(kl),W0=oq(kl);if(T1.length>0)Cf((Y0)=>{let V1=Xn([ml(Y0),T1],Al);return{...Y0,statistics:kl?.statistics||Y0?.statistics,tasks:Kn(V1)}});if(W0?.id===J.current){let Y0=Array.isArray(W0.transcript)?W0.transcript:[];a0(W0.id,{...W0,transcript:Y0,_summaryLoaded:!0,_detailLoaded:Y0.length>0,_transcriptPreview:Boolean(kl?.selected?.preview)},F.current)}}).catch(()=>{});return}if(ti?.id===bl&&By!==null){let kl=V.current.get(bl),T1=Array.isArray(kl?.task?.transcript)?kl.task.transcript:[],W0=f7(T1,By),Y0=Boolean(c0?.preview);if(a0(bl,{...ti,_summaryLoaded:!0,transcript:W0,_detailLoaded:!c0?.hasMore||W0.length>0,_transcriptComplete:!Y0&&!c0?.hasMore&&rn(ti),_transcriptPreview:Y0},F.current),iu(!1),P)X0({phase:"complete",taskId:bl,queueMs:Nl,detailMs:Math.max(0,performance.now()-lu-Nl),totalMs:performance.now()-lu,chunks:1,transcriptRows:W0.length,partial:Boolean(Y0||c0?.hasMore||w3(ti)),completedAt:new Date});if(Ti(new Date),P)p.current=!1;H1(bl,!1,P?lu:void 0,P?Nl:void 0).catch((V1)=>Wl(Dl(V1,"加载 Codex Trace Summary 失败"))),a9(f,Tu,Yu,s,"",!1).then((V1)=>{if(Uu!==Q.current)return;let f8=ml(V1);if(f8.length>0)Cf((Xy)=>{let J2=Xn([ml(Xy),f8],Al);return{...Xy,tasks:Kn(J2)}})}).catch(()=>{});return}if(P)X0({phase:"session",taskId:bl,queueMs:Nl,totalMs:Nl,startedAt:new Date(Date.now()-Nl)});if(bl)H1(bl,!0,P?lu:void 0,P?Nl:void 0).catch((kl)=>Wl(Dl(kl,"加载 Codex Trace Summary 失败")));else if(F.current+=1,m(null),iu(!1),P)X0({phase:"complete",taskId:"",queueMs:Nl,detailMs:0,totalMs:performance.now()-lu,chunks:0,transcriptRows:0,completedAt:new Date});if(Ti(new Date),P)p.current=!1;nU(s).catch((kl)=>a(vq(kl)))}async function iU(){if(N0){if(!i||nu||G.current)return;let P=String(dr.nextBeforeId||"");if(!P)return;G.current=!0,wu(!0),Wl("");try{let s=await Rq(f,gu,P,lL,Xi),lu=ml(s),Uu=s?.queue||cl||{},Tu=String(Uu?.activeTaskId||Z_(Uu)[0]||hn||"");Bu((Ou)=>{let Iu=Kn(Xn([ml(Ou),lu],Tu)),Yu=Bn(s);return{...Ou||{},queue:Uu,tasks:Iu,pagination:{...Yu,returned:Iu.length}}})}catch(s){Wl(Dl(s,"加载更多搜索结果失败"))}finally{G.current=!1,wu(!1)}return}if(!i||U$||K.current)return;let B=String(Bn(O).nextBeforeId||"");if(!B)return;K.current=!0,N$(!0),Wl("");try{let P=await Rq(f,gu,B),s=ml(P),lu=P?.queue||cl||{},Uu=String(lu?.activeTaskId||Z_(lu)[0]||hn||"");Cf((Tu)=>{let Ou=Kn(Xn([ml(Tu),s],Uu)),Iu=Bn(P);return{...Tu||{},queue:lu,statistics:P?.statistics||Tu?.statistics,tasks:Ou,pagination:{...Iu,returned:Ou.length}}})}catch(P){Wl(Dl(P,"加载更早 Codex tasks 失败"))}finally{K.current=!1,N$(!1)}}function AE(B){let P=B.currentTarget;if(!P||er||!oQ)return;if(P.scrollHeight-P.scrollTop-P.clientHeight<120)iU()}async function pf(B,P){m6(!0),Wl("");try{await B()}catch(s){Wl(Dl(s,P))}finally{m6(!1)}}async function _2(B){if(!B)return;try{let P=!1;try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(B),P=!0}catch{P=!1}if(!P){let lu=document.createElement("textarea");lu.value=B,lu.style.position="fixed",lu.style.opacity="0",document.body.appendChild(lu),lu.select(),P=document.execCommand("copy"),document.body.removeChild(lu)}if(!P)throw Error("browser clipboard rejected the copy request");R6(B);let s=`已复制任务 ID:${B}`;Ml(s),Zf("success",s),window.setTimeout(()=>R6((lu)=>lu===B?"":lu),1600)}catch(P){Wl(`复制任务 ID 失败:${Dl(P)}`)}}function $2(B){if(!B)return;tu(B);let P=`已引用任务 ID:${B};提交时后端会读取并注入该任务上下文`;Ml(P),Zf("success",P)}async function A2(B){if(!i||!B)return;let P=new Date().toISOString();Q.current+=1,u8([B],P,null,{id:B,readAt:P,terminalUnread:!1}),b6(B);let s=!1;if(await pf(async()=>{let lu=await PV(f,B),Uu=lu?.task||{id:B,readAt:new Date().toISOString(),terminalUnread:!1},Tu=String(Uu?.readAt||new Date().toISOString());u8([B],Tu,lu?.queue||null,Uu),s=!0;let Ou=`已将任务 ${B} 标为已读`;Ml(Ou),Zf("success",Ou)},"标记 Codex task 已读失败"),!s)yU([B]),F0(J.current,!1).catch((lu)=>Wl(Dl(lu,"刷新 Codex tasks 失败")));b6((lu)=>lu===B?"":lu)}async function rE(){if(!i||Q$)return;k6(!0);let B=new Date().toISOString(),P=Array.from(new Set([...ml(t.current).filter(i1).map((lu)=>String(lu?.id||"")).filter(Boolean),...Array.from(V.current.entries()).filter(([,lu])=>i1(lu?.task)).map(([lu])=>lu)]));if(Q.current+=1,P.length>0)u8(P,B);let s=!1;if(await pf(async()=>{let lu=await MV(f),Uu=String(lu?.readAt||new Date().toISOString()),Tu=ml(t.current).filter(i1).map((vu)=>String(vu?.id||"")).filter(Boolean),Ou=Array.from(V.current.entries()).filter(([,vu])=>i1(vu?.task)).map(([vu])=>vu),Iu=Array.from(new Set([...P,...Tu,...Ou]));u8(Iu,Uu,lu?.queue||null);let Yu=Number(lu?.count||Iu.length);s=!0;let Cu=`已将 ${Yu} 个已结束未读任务标为已读`;Ml(Cu),Zf("success",Cu)},"全部标为已读失败"),!s&&P.length>0)yU(P),F0(J.current,!1).catch((lu)=>Wl(Dl(lu,"刷新 Codex tasks 失败")));k6(!1)}function jE(B){let P=B||_1;if(Sf(P),!If(P))$l(P);if(Cf(null),!(If(P)?J.current:""))J.current="",F.current+=1,ru(""),m(null),iu(!0)}async function r2(){if(!i)return;let B=await tl(Sl(f,"/api/workdirs"));w1(B)}async function JE(){let B=Jf.trim()||lU||"/workspace",P=typeof window>"u"?B:window.prompt("输入新的工作目录绝对路径",B),s=String(P||"").trim();if(!s)return;Oi(!0),await pf(async()=>{let lu=await tl(Sl(f,"/api/workdirs"),{method:"POST",body:{providerId:Nu,executionMode:sl,path:s,ensure:!0}});w1((Tu)=>({...Tu||{},...lu})),al(String(lu?.workdir?.path||s));let Uu=`已保存工作目录:${String(lu?.workdir?.path||s)}`;Ml(Uu),Zf("success",Uu)},"创建工作目录失败"),Oi(!1)}async function QE(){let B=T_(Jf);if(!l2){Ml("当前工作目录还没有保存到下拉菜单。");return}if(!(typeof window>"u"?!0:window.confirm(`从下拉菜单删除工作目录选项? ${B} -不会删除磁盘上的实际目录。`)))return;Hy(!0),await Cf(async()=>{let s=await tl(Dl(f,`/api/workdirs/${encodeURIComponent(Nu)}/${encodeURIComponent(gl)}/${encodeURIComponent(B)}`),{method:"DELETE"});w1((Uu)=>({...Uu||{},...s}));let lu=`已从下拉菜单删除工作目录:${B}`;Pl(lu),wf("success",lu)},"删除工作目录失败"),Hy(!1)}async function QE(){let B=typeof window>"u"?"":window.prompt("输入新的 Codex queue ID(字母/数字/._-,最长 64)","new-lane"),P=String(B||"").trim();if(!P)return;await Cf(async()=>{let s=await tl(Dl(f,"/api/queues"),{method:"POST",body:{queueId:P}}),lu=String(s?.queue?.id||P);$l(lu),Df(lu),Mf(null),J.current="",F.current+=1,Au(""),x(null);let Uu=`已创建并切换到 queue:${lu}`;Pl(Uu),wf("success",Uu),await U0("",!0,lu)},"创建 Codex queue 失败")}async function UE(){let B=String(ku||"default").trim()||"default",P=E_(v0,B)||{id:B,name:B},s=typeof window>"u"?null:window.prompt(`输入 queue 显示名称(ID 不变:${B};留空恢复为 ID)`,nL(P));if(s===null)return;await Cf(async()=>{let lu=await tl(Dl(f,`/api/queues/${encodeURIComponent(B)}`),{method:"PATCH",body:{name:String(s)}}),Uu=lu?.queue||{id:B,name:String(s||B)};if(lu?.summary)Mf((Ou)=>Ou?{...Ou,queue:lu.summary}:Ou);let Tu=`已更新 queue 名称:${i7(Uu)}`;Pl(Tu),wf("success",Tu),await U0(J.current,!0,gu)},"修改 Codex queue 名称失败")}function NE(){if(Z1.length===0){Pl("没有可合并的其他 queue;请先创建或选择另一个 queue。");return}let B=Z1.some((P)=>String(P?.id||"")===J0)?J0:"";Sf(B),lf(!0)}async function FE(){let B=Ti;if(Z1.length===0){Pl("没有可合并的其他 queue;请先创建或选择另一个 queue。");return}let s=String(J0||""||"").trim();if(!s){Pl("请先选择要合并的源 queue。");return}if(s===B){Fl("源 queue 和目标 queue 不能相同。");return}await Cf(async()=>{let lu=await tl(Dl(f,`/api/queues/${encodeURIComponent(B)}/merge`),{method:"POST",body:{sourceQueueId:s}});if(lu?.summary)Mf((Ou)=>Ou?{...Ou,queue:lu.summary}:Ou);$l(B),Df(B),Mf(null);let Uu=Number(lu?.mergedTaskCount||0),Tu=`已将 queue=${s} 合并到 ${B},移动 ${Uu} 个任务;源 queue 已自动删除。`;Pl(Tu),wf("success",Tu),lf(!1),Sf(""),await U0(J.current,!0,B)},"合并 Codex queue 失败")}async function WE(B){if(B.preventDefault(),N.current){Pl("任务正在提交中,请等待当前请求完成,已阻止重复提交。");return}if(kn.length>1&&!z1){Fl(`检测到将创建 ${kn.length} 个任务;请先勾选“确认批量入队”,避免误传多个任务。`);return}N.current=!0,Su(!0),Pl("正在提交 Code Queue 任务,请等待后端确认,输入已临时锁定。"),await Cf(async()=>{if(kn.length===0)throw Error("prompt 不能为空");let P=ai(Wu),s=ku.trim()||"default",lu=[...kn],Uu=(Iu)=>({prompt:Iu,queueId:s,providerId:Nu,executionMode:gl,model:Af,cwd:jf,maxAttempts:Number(T0),...P.length>0?{referenceTaskIds:P}:{}}),Tu=lu.length===1?Uu(lu[0]):{tasks:lu.map(Uu)},Ou=await tl(Dl(f,lu.length===1?"/api/tasks":"/api/tasks/batch"),{method:"POST",body:Tu}),hu=Ou?.tasks?.[0]?.id||"",Yu=Array.isArray(Ou?.tasks)?Ou.tasks.map((Iu)=>String(Iu?.id||"")).filter(Boolean):[],Cu=`已创建 ${Yu.length||lu.length} 个任务${Yu.length>0?`:${Yu.join(" / ")}`:""}`;if(lE(Array.isArray(Ou?.tasks)?Ou.tasks:[],Ou?.queue||null),Pl(Cu),wf("success",Cu),$u(""),Du(""),G1(!1),$l(s),hu&&n2(Ou?.tasks?.[0],gu)&&i2(Ou?.tasks?.[0]))H1(String(hu),!1).catch((Iu)=>Fl(Yl(Iu,"加载 Codex Trace Summary 失败")))},"Codex 任务入队失败"),N.current=!1,Su(!1)}async function qE(B){if(B.preventDefault(),!R?.id)return;await Cf(async()=>{await tl(Dl(f,`/api/tasks/${encodeURIComponent(R.id)}/steer`),{method:"POST",body:{prompt:xu}}),yl(""),await U0(R.id)},"追加 prompt 失败")}async function LE(B){B.preventDefault();let P=String(R?.id||"");if(!P||!Xy)return;await Cf(async()=>{let s=ai(jl),lu=await tl(Dl(f,`/api/tasks/${encodeURIComponent(P)}/edit`),{method:"POST",body:{prompt:Kl,referenceTaskIds:s}}),Uu={...lu?.task||R||{},_traceSummary:null,_traceSummaryLoaded:!1,_traceSummaryUpdatedAt:"",_promptDetails:{},_traceSteps:[],_traceStepsLoaded:!1,_traceStepsByAttempt:{},_traceStepsLoadedByAttempt:{},_traceStepsNextAfterSeqByAttempt:{},_traceStepDetails:{}};V.current.set(P,{...V.current.get(P)||{},task:Uu,complete:!1,completeUpdatedAt:""}),J.current=P,x(Uu),Au(P),ol(x8(Uu)),ff(Array.isArray(Uu?.referenceTaskIds)?Uu.referenceTaskIds.join(" "):""),Mf((Ou)=>{if(!Ou)return Ou;let hu=ml(Ou).map((Yu)=>String(Yu?.id||"")===P?{...Yu,...Uu}:Yu);return{...Ou,queue:lu?.queue||Ou.queue,tasks:Vn([hu],bn)}});let Tu=lu?.changed===!1?`任务 ${P} 的 prompt 未变化`:`已更新 queued 任务 ${P} 的用户 prompt`;Pl(Tu),wf("success",Tu),await U0(P,!0,gu)},"编辑 queued 任务 prompt 失败")}async function KE(){if(!R?.id)return;await Cf(async()=>{await tl(Dl(f,`/api/tasks/${encodeURIComponent(R.id)}/interrupt`),{method:"POST",body:{}}),await U0(R.id)},"打断 Codex session 失败")}async function zE(){if(!R?.id)return;await Cf(async()=>{await tl(Dl(f,`/api/tasks/${encodeURIComponent(R.id)}/retry`),{method:"POST",body:{}}),await U0(R.id)},"重新入队失败")}async function GE(B){let P=String(R?.id||""),s=String(B||"").trim();if(!P||!s)return;let lu=H_(R);if(s===lu){Pl(`任务 ${P} 已在 queue=${s}`);return}await Cf(async()=>{let Tu=(await tl(Dl(f,`/api/tasks/${encodeURIComponent(P)}/move`),{method:"POST",body:{queueId:s}}))?.task||{...R,queueId:s};if(V.current.set(P,{...V.current.get(P)||{},task:Tu}),J.current=P,x(Tu),Au(P),$l(s),!hf(gu))Mf(null),Df(s);let Ou=`已将任务 ${P} 从 ${lu} 移动到 ${s}`;Pl(Ou),wf("success",Ou),await U0(P,!0,hf(gu)?y1:s)},"移动任务 queue 失败")}async function wE(){let B=J.current;if(!B)return;let P=performance.now();await Cf(async()=>{V0({phase:"session",taskId:B,queueMs:0,totalMs:0,partial:!0,startedAt:new Date}),await H1(B,!0,P,0)},"刷新 Trace Summary 失败")}function ZE(B){J.current=B,F.current+=1,Au(B);let P=V.current.get(B);if(P?.task)x(P.task),yu(!1);else{yu(!0);let s=Fn.find((lu)=>lu.id===B);if(s)x(s);else x(null)}U0(B).catch((s)=>Fl(Yl(s,"切换 Codex session 失败")))}function A2(B){if(ZE(B),TV())A$(!1)}function yU(B,P,s){if(!B||!Array.isArray(B?.tasks)||P.length===0||Object.keys(s).length===0)return B;let lu=!1,Uu=ml(B).map((Tu)=>{if(String(Tu?.id||"")!==P)return Tu;return lu=!0,dr(sq(Tu,s))});return lu?{...B,tasks:Uu}:B}function EE(B,P){Mf((s)=>yU(s,B,P)),Bu((s)=>yU(s,B,P))}function HE(B,P,s){let lu=String(B?.type||"");if(lu==="queue-updated")return!0;if(lu==="trace-stats-updated"||lu==="trace-step-created")return!1;if(P.length===0)return!0;if(!s)return!0;if(B?.queueId&&String(B.queueId)!==H_(s))return!0;if(B?.status&&String(B.status)!==String(s?.status||""))return!0;return String(B?.reason||"")!=="output"}function _U(){if(!y||!g9())return;if(c.current!==null)window.clearTimeout(c.current);c.current=window.setTimeout(()=>{c.current=null,U0(J.current,!1).catch((B)=>Fl(Yl(B,"Code Queue 事件刷新失败")))},120)}function OE(B,P){if(!y||!g9()||J.current!==B)return;if(S.current=S.current||P,X.current!==null)return;X.current=window.setTimeout(()=>{X.current=null;let s=S.current;if(S.current=!1,H1(B,!0).catch((lu)=>Fl(Yl(lu,"事件刷新 Trace Summary 失败"))),s)_E(B)},250)}function TE(B){let P=ll(B?.payload)||B,s=ll(P?.stats),lu=String(B?.type||P?.type||""),Uu=String(P?.subjectKind||s?.subjectKind||""),Tu=String(P?.scopeId||s?.scopeId||""),Ou=String(P?.taskId||(Uu==="task"?P?.subjectId:"")||s?.taskId||B?.taskId||""),hu=P?.attemptIndex??s?.attemptIndex,Yu=hu===null||hu===void 0||hu===""?null:An(hu),Cu=s||ll(P?.traceStats),Iu=Cu?.stepCount??Cu?.llmStepCount,Ul=Cu?.outputMaxSeq;return{...P,type:lu,eventId:B?.eventId||P?.eventId,sequence:B?.sequence??P?.sequence,taskId:Ou,subjectKind:Uu,scopeId:Tu,attemptIndex:Yu,stepCount:Iu,outputMaxSeq:Ul,updatedAt:Cu?.updatedAt||P?.updatedAt||B?.createdAt,traceStats:Cu,statsSource:Cu?"oa-event-flow":P?.statsSource}}function VE(B){let P=TE(B),s=String(P?.taskId||""),lu=String(P?.scopeId||P?.traceStats?.scopeId||""),Uu=String(P?.subjectKind||P?.traceStats?.subjectKind||"")==="task-attempt"||Number(P?.attemptIndex)>0||/:attempt:\d+$/u.test(lu),Tu=bq(P?.stepCount),Ou={},hu=s.length>0?ml(D.current).find((Yu)=>String(Yu?.id||"")===s):null;if(s.length>0){if(P?.status)Ou.status=String(P.status);if(P?.updatedAt)Ou.updatedAt=String(P.updatedAt);if(P?.queueId)Ou.queueId=String(P.queueId);if(!Uu&&Number.isFinite(Number(P?.stepCount)))Ou.stepCount=Tu,Ou.llmStepCount=Tu;if(!Uu&&Number.isFinite(Number(P?.outputMaxSeq)))Ou.outputMaxSeq=bq(P.outputMaxSeq);if(!Uu&&ll(P?.traceStats))Ou.traceStats=P.traceStats,Ou.statsSource="oa-event-flow";if(Object.keys(Ou).length>0&&(V.current.has(s)||J.current===s))g0(s,Ou,F.current);if(Object.keys(Ou).length>0)EE(s,Ou);if(J.current===s&&(P?.type==="trace-step-created"||P?.type==="task-updated"||P?.type==="trace-stats-updated")){let Yu=hV(hu),Cu=P?.type==="trace-step-created"||P?.type==="trace-stats-updated"&&Number.isFinite(Number(P?.stepCount))&&(Uu||Yu===null||Tu>Yu);OE(s,Cu)}}if(HE(P,s,hu))_U()}_n(()=>{if(Y.current){Y.current=!1;return}Cf(()=>U0(J.current),"Code Queue 加载失败")},[y?.id,gu]),_n(()=>{if(!y||typeof EventSource>"u")return;let B=new EventSource(zV(f),{withCredentials:!0}),P=(lu)=>{try{VE(JSON.parse(String(lu.data||"{}")))}catch(Uu){Fl(Yl(Uu,"解析 Code Queue 事件失败"))}},s=()=>{if(g9())_U()};return B.addEventListener("trace-step-created",P),B.addEventListener("task-updated",P),B.addEventListener("queue-updated",P),B.addEventListener("trace-stats-updated",P),document.addEventListener("visibilitychange",s),()=>{if(B.close(),document.removeEventListener("visibilitychange",s),c.current!==null)window.clearTimeout(c.current),c.current=null;if(X.current!==null)window.clearTimeout(X.current),X.current=null}},[y?.id,f,gu]),_n(()=>{if(!y||!R||fu)return;let B=String(R.id||"");if(!B)return;let P=String(R.updatedAt||"");if(C8(R))return;let s=`${B}:${P||"unknown"}:${String(R?._traceSummaryUpdatedAt||"")}`;if(T.current.has(s))return;T.current.add(s),H1(B,!0).catch((lu)=>Fl(Yl(lu,"自动加载 Trace Summary 失败")))},[y?.id,R?.id,R?.updatedAt,R?.traceStats?.statsRevision,R?._traceSummaryUpdatedAt,R?._traceSummaryLoaded,fu]),_n(()=>{if(!y||!R||fu)return;let B=String(R.id||""),P=Number(qf(R)?.currentAttempt||R?.currentAttempt||0);if(!B||!FL(R)||!Number.isFinite(P)||P<=0)return;if(R8(R,P))return;let s=`${B}:current-attempt:${P}:${String(R?.updatedAt||"")}`;if(T.current.has(s))return;T.current.add(s),u6(P).catch((lu)=>Fl(Yl(lu,"自动加载当前 Attempt Trace Steps 失败")))},[y?.id,R?.id,R?.status,R?.currentAttempt,R?.updatedAt,R?._traceSummaryUpdatedAt,fu]),_n(()=>{if(!y)return;r2().catch((B)=>Fl(Yl(B,"加载工作目录失败")));return},[y?.id]),_n(()=>{if(!y)return;fU(gu);return},[y?.id,f,gu]);let BE=Wn.length===0?G(T_,{title:Q0?b?"搜索中":"没有匹配任务":"队列为空",text:Q0?b?`正在搜索包含“${By}”的 task...`:`未找到包含“${By}”的 task;可换个关键词或切换 queue。`:"提交一个任务后,Codex 会串行执行并保存输出。"}):[gQ.length>0?G(f7,{key:"unread",title:"已结束未读",tasks:gQ,selectedId:iu,emptyText:"暂无已结束未读任务。",onSelect:A2,onCopy:y2,onReference:_2,onMarkRead:$2,copiedTaskId:Zy,markingReadTaskId:j$}):null,G(f7,{key:"active",title:"运行 / 排队",tasks:hZ,selectedId:iu,emptyText:"当前没有运行或排队任务。",onSelect:A2,onCopy:y2,onReference:_2,onMarkRead:$2,copiedTaskId:Zy,markingReadTaskId:j$}),G(f7,{key:"history",title:"历史 session",tasks:IZ,selectedId:iu,emptyText:"最近没有完成、失败或取消的 session。",onSelect:A2,onCopy:y2,onReference:_2,onMarkRead:$2,copiedTaskId:Zy,markingReadTaskId:j$}),G("div",{key:"pagination",className:"codex-task-pagination","data-testid":"codex-task-pagination"},G("span",null,Q0?`搜索“${By}” · 已显示 ${Wn.length} / ${Number.isFinite(cy)?cy:Wn.length}`:`已加载 ${Wn.length} / ${Number.isFinite(cy)?cy:Wn.length}`),aQ?G("button",{type:"button",className:"ghost-btn",disabled:dA,onClick:()=>void iU(),"data-testid":"codex-load-more-tasks-button"},dA?"加载中":Q0?"加载更多结果":"加载更早任务"):G("code",null,Q0?"已到结果末尾":"已到队列末尾"))],$U=(B,P=!1)=>G("label",{className:`code-queue-switcher ${P?"compact":""}`},G("span",null,P?"Queue":"查看 queue"),G("select",{value:gu,onChange:(s)=>AE(String(s.target.value||y1)),"data-testid":B},G("option",{value:y1},`All queues · ${Number.isFinite(E1)?E1:Fn.length} tasks · ${N$.length} running`),v0.map((s)=>G("option",{key:String(s?.id||""),value:String(s?.id||"")},Z3(s))))),cE=G("div",{className:"codex-task-search","data-testid":"codex-task-search"},G("label",{htmlFor:"codex-task-search-input"},"搜索 task"),G("div",{className:"codex-task-search-row"},G("input",{id:"codex-task-search-input",type:"search",value:Ju,placeholder:"关键词 / task ID / prompt",autoComplete:"off",onChange:(B)=>Vu(String(B.target.value||"")),"data-testid":"codex-task-search-input"}),Ju?G("button",{type:"button",className:"ghost-btn",onClick:()=>Vu(""),"data-testid":"codex-task-search-clear"},"清除"):null),G("small",{"data-testid":"codex-task-search-summary"},Q0?b?"搜索中...":`匹配 ${Wn.length}/${Number.isFinite(cy)?cy:Wn.length}`:"支持 task ID、prompt、状态、provider、模型和最近输出关键词")),XE=G("div",{className:"codex-trace-status","data-testid":"codex-trace-status-summary"},G("span",{className:"codex-trace-status-chip queued"},G("b",null,"排队"),String(sr)),G("span",{className:"codex-trace-status-chip running"},G("b",null,"运行"),String(bZ)),G("span",{className:`codex-trace-status-chip unread ${Vy>0?"warn":""}`},G("b",null,"结束未读"),String(Vy)),G("span",{className:"codex-trace-status-chip service"},G("b",null,"服务"),`${vZ.providerStatus||"unknown"} · ${y?.providerId||"D601"} · ${gZ.public?"公网暴露":"仅 UniDesk frontend 代理访问"}`),G("span",{className:"codex-trace-status-chip"},G("b",null,"执行节点"),or.map((B)=>B.id).join(" / ")),G("span",{className:"codex-trace-status-chip"},G("b",null,"执行模式"),eQ.map((B)=>B.id).join(" / ")),G("span",{className:"codex-trace-status-chip"},G("b",null,"模型"),dQ.join(" / ")),G("span",{className:"codex-trace-status-chip"},G("b",null,"加载"),af?.phase==="complete"?qV(af?.totalMs):String(af?.phase||"idle")),G("span",{className:"codex-trace-status-chip"},G("b",null,"刷新"),hr?Al(hr):"--")),YE=G(oi,{title:R?`Trace ${String(R.id).slice(0,22)}`:"Trace 输出",eyebrow:R?`${R.status} / view=${ar} / task queue=${H_(R)} / provider=${R.providerId||"D601"} / mode=${R.executionMode||"default"} / ${R.model} / agent loop trace`:`Agent loop trace / view=${ar}`,summary:XE,loading:fu||Q$||b||nu||af?.phase==="loading",actions:G("div",{className:"panel-actions"},$U("code-queue-filter-select"),G("button",{type:"button",className:"ghost-btn codex-mark-all-read-btn",disabled:Vy===0||Hl||J$,onClick:()=>void rE(),"data-testid":"codex-mark-all-read-button"},J$?"标记中":`全部标已读${Vy>0?` (${Vy})`:""}`),R?G("button",{type:"button",className:"ghost-btn",disabled:fu||Hl,onClick:()=>void wE(),"data-testid":"codex-load-full-trace-button"},fu?"加载中":qf(R)?"刷新 Summary":"加载 Summary"):null,G("button",{type:"button",className:"codex-session-title-toggle",onClick:()=>A$((B)=>!B),"data-testid":"code-queue-sidebar-toggle"},r$?"收起队列":"展开队列"),G("label",{className:"inline-check"},G("input",{type:"checkbox",checked:Rn,onChange:(B)=>vA(Boolean(B.target.checked))}),"自动滚动"),G("button",{type:"button",className:"ghost-btn",disabled:!oZ||Hl,onClick:()=>void KE(),"data-testid":"codex-interrupt-button"},"打断"),G("button",{type:"button",className:"ghost-btn",disabled:!dZ||Hl,onClick:()=>void zE()},"重试"),R?G(A7,{title:"Codex Task",data:R,onOpen:l,testId:"raw-codex-task"}):null),className:"codex-output-panel"},G("div",{className:`codex-session-shell ${r$?"":"queue-collapsed"}`},r$?G("aside",{className:"codex-session-sidebar","data-testid":"codex-session-sidebar"},G("div",{className:"codex-session-sidebar-head"},G("div",null,G("span",null,hf(gu)?"All queues":"Queue lane"),G("strong",null,`${ar} · ${Fn.length}/${Number.isFinite(E1)?E1:Fn.length} sessions · 未读 ${Vy}`)),G("button",{type:"button",className:"ghost-btn",onClick:()=>A$(!1)},"收起")),$U("code-queue-filter-sidebar",!0),cE,G("div",{className:"codex-task-list codex-task-list-session",onScroll:$E,"data-testid":"codex-task-list-scroll"},BE)):null,G("div",{className:"codex-session-main"},G("div",{className:"codex-output-stack"},G(kB,{task:R,loading:fu,onLoadPromptPart:iE,onLoadSteps:u6,onLoadStep:yE}),G(hB,{task:R})))));if(!y)return G(T_,{title:"Code Queue 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=code-queue"});let rU=Number(af?.totalMs),AU=Number(af?.queueMs),jU=Number(af?.detailMs),JU=Number(af?.transcriptRows),tE=af?.phase==="complete"?"complete":String(af?.phase||"idle"),DE=E_(v0,Ti)||{id:Ti,name:Ti},SE=j0?G(Dq,{title:"合并 queue",titleId:"codex-merge-dialog-title",className:"codex-merge-dialog",backdropClassName:"codex-merge-dialog-backdrop",bodyClassName:"codex-merge-dialog-body",actionsClassName:"codex-merge-dialog-actions",testId:"codex-merge-queue-dialog",closeTestId:"codex-merge-queue-close",disableClose:Hl,onClose:()=>lf(!1),actions:[G("button",{key:"cancel",type:"button",className:"ghost-btn",onClick:()=>lf(!1),disabled:Hl,"data-testid":"codex-merge-queue-cancel"},"取消"),G("button",{key:"confirm",type:"button",className:"primary-btn",onClick:()=>void FE(),disabled:Hl||d||!J0,"data-testid":"codex-merge-queue-confirm"},Hl?"合并中...":"确认合并")]},G("p",{className:"codex-merge-dialog-target"},"目标 queue:",G("code",null,Z3(DE))),G("label",null,"源 queue",G("select",{value:J0,disabled:Hl||d,onChange:(B)=>Sf(String(B.target.value||"")),"data-testid":"codex-merge-source-queue-select"},G("option",{value:""},"选择要合并进来的源 queue"),Z1.map((B)=>G("option",{key:String(B?.id||""),value:String(B?.id||"")},Z3(B))))),G("p",{className:"codex-merge-dialog-note"},"会把源 queue 的任务归属合并到目标 queue,并自动删除源 queue;目标 queue 会按原 queueEnteredAt/createdAt 时间顺序运行。")):null;return G("div",{className:`code-queue-page ${i?"codex-standalone-page":""}`,"data-testid":"code-queue-page","data-load-state":tE,"data-load-total-ms":Number.isFinite(rU)?String(Math.round(rU*10)/10):"","data-load-queue-ms":Number.isFinite(AU)?String(Math.round(AU*10)/10):"","data-load-detail-ms":Number.isFinite(jU)?String(Math.round(jU*10)/10):"","data-load-transcript-rows":Number.isFinite(JU)?String(JU):"","data-load-task-id":String(af?.taskId||iu||""),"data-load-partial":af?.partial?"true":"false"},G(ul,{error:gA,wide:!0}),SE,G("div",{className:"codex-session-stage codex-session-stage-top"},G(MB,{diagnostics:sA,queue:cl,onRaw:l}),YE),G("div",{className:"code-queue-layout"},G("div",{className:"codex-left-rail"},G(oi,{title:"提交任务",eyebrow:d?"Submitting...":kn.length>1?`${kn.length} tasks`:"Single or Batch",className:"codex-compose-panel",loading:d},G("form",{className:`codex-task-form ${d?"is-submitting":""}`,onSubmit:WE,"data-testid":"code-queue-task-form","aria-busy":d?"true":"false"},G("label",null,"Prompt / 多任务用单独一行 --- 分隔",G("textarea",{value:v,rows:8,disabled:d,onChange:(B)=>$u(B.target.value),placeholder:"写入 Codex 任务;多个任务之间用 --- 分隔。"})),G("label",{className:"codex-reference-field"},"引用任务 ID(可选)",G("input",{value:Wu,disabled:d,onChange:(B)=>Du(B.target.value),placeholder:"codex_...;支持空格/逗号分隔多个 ID","data-testid":"codex-reference-task-id"}),ai(Wu).length>0?G("code",null,`后端将解析并注入:${ai(Wu).join(" / ")}`):null),G("div",{className:"codex-form-grid"},G("label",{className:"codex-submit-queue-field"},"Queue",G("div",{className:"codex-submit-queue-row"},G("select",{className:"codex-submit-queue-select",value:ku,disabled:d,onChange:(B)=>$l(String(B.target.value||"default")),"data-testid":"code-queue-id-select"},v0.map((B)=>G("option",{key:String(B?.id||""),value:String(B?.id||"")},Z3(B)))),G("button",{type:"button",className:"ghost-btn codex-rename-queue-btn",onClick:()=>void UE(),disabled:Hl||d||!ku,title:"修改当前 queue 的显示名称,ID 不变","data-testid":"codex-rename-queue-button"},"改名"),G("button",{type:"button",className:"ghost-btn codex-merge-queue-btn",onClick:()=>NE(),disabled:Hl||d||Z1.length===0,title:"打开独立窗口选择源 queue 并合并到当前 queue;合并后自动删除源 queue","data-testid":"codex-merge-queue-button"},"合并 queue"),G("button",{type:"button",className:"ghost-btn codex-create-queue-btn",onClick:()=>void QE(),disabled:Hl||d,"data-testid":"codex-create-queue-button"},"创建 queue"))),G("label",null,"模型",G("select",{value:Af,disabled:d,onChange:(B)=>Pf(B.target.value),"data-testid":"codex-model-select"},dQ.map((B)=>G("option",{key:B,value:B},B)))),G("label",null,"执行 Provider",G("select",{value:Nu,disabled:d,onChange:(B)=>fE(String(B.target.value||"D601")),"data-testid":"codex-provider-select"},or.map((B)=>G("option",{key:B.id,value:B.id},`${B.label||B.id} · ${B.defaultWorkdir||L7(cl,B.id)}${B.supportsWindowsNativeCodex?" · Windows native":""}`)))),G("label",null,"执行模式",G("select",{value:gl,disabled:d,onChange:(B)=>nE(String(B.target.value||"default")),"data-testid":"codex-execution-mode-select"},eQ.map((B)=>G("option",{key:B.id,value:B.id},`${B.label||B.id}${B.id==="windows-native"?" · 宿主 Codex":""}`)))),G("label",{className:"codex-workdir-field"},"工作目录",G("div",{className:"codex-workdir-row"},G("input",{value:jf,disabled:d,onChange:(B)=>sl(B.target.value),placeholder:uU||cl?.defaultWorkdir||"/workspace","data-testid":"codex-cwd-input"}),G("select",{value:O_(jf),disabled:d||Ey,onChange:(B)=>sl(String(B.target.value||"")),"data-testid":"codex-cwd-select"},lU.map((B)=>G("option",{key:`${B.providerId}:${B.executionMode}:${B.path}`,value:B.path},`${B.path}${B.source==="default"?" · 默认":""}`))),G("button",{type:"button",className:"ghost-btn codex-workdir-create-btn",disabled:d||Hl||Ey,onClick:()=>void jE(),"data-testid":"codex-cwd-create-button"},Ey?"处理中":"新建"),G("button",{type:"button",className:"ghost-btn codex-workdir-delete-btn",disabled:d||Hl||Ey||!u2,onClick:()=>void JE(),title:u2?"从工作目录下拉菜单删除这个选项,不删除磁盘目录":"当前工作目录尚未保存到下拉菜单","data-testid":"codex-cwd-delete-button"},"删除"))),G("label",null,"最大尝试",G("input",{type:"number",min:1,max:99,value:T0,disabled:d,onChange:(B)=>xn(Number(B.target.value)),"data-testid":"codex-max-attempts-input"})),G("label",null,"入队份数",G("input",{type:"number",min:1,max:50,value:sf,disabled:d,onChange:(B)=>$$(Number(B.target.value)),"data-testid":"codex-repeat-count-input"}))),F$>1?G("label",{className:`codex-batch-confirm ${z1?"confirmed":""}`,"data-testid":"codex-batch-confirm-row"},G("input",{type:"checkbox",checked:z1,disabled:d,onChange:(B)=>G1(Boolean(B.target.checked)),"data-testid":"codex-batch-confirm-checkbox"}),G("span",null,`确认批量入队 ${F$} 个任务(prompt 分段 ${eA.length} × 入队份数 ${Rq(sf)})`)):null,d?G("div",{className:"codex-submit-wait","data-testid":"codex-submit-wait"},"正在提交到后端,已锁定输入以防重复提交..."):null,G("div",{className:"codex-form-actions"},G("button",{type:"button",className:"ghost-btn",disabled:Hl||d||v.length===0&&Wu.length===0,onClick:()=>{$u(""),Du(""),G1(!1);let B="已清空任务输入栏";Pl(B),wf("success",B)},"data-testid":"codex-clear-input-button"},"清空输入"),G("button",{type:"submit",className:"primary-btn",disabled:sZ,"data-testid":"codex-enqueue-button"},d?"提交中,请等待...":oQ?`请确认批量入队 ${F$} 个任务`:kn.length>1?`批量入队 ${kn.length} 个任务`:"入队并运行"))))),G("div",{className:"codex-main-stage"},G("div",{className:"codex-detail-grid"},G(oi,{title:"运行控制",eyebrow:Xy?"Queued prompt editable":l2?"Active turn steer":"Steer when running",loading:Hl},G("div",{className:"codex-run-control-stack"},G(pB,{task:R,queueRows:v0,busy:Hl,onMove:GE}),R?.id?G("form",{className:"codex-steer-form codex-edit-prompt-form",onSubmit:LE,"data-testid":"codex-edit-prompt-form"},G("label",null,"编辑 queued 用户 prompt",G("textarea",{value:Kl,rows:5,onChange:(B)=>ol(B.target.value),placeholder:"仅 QUEUED 且尚未开始运行的任务可在这里修改原始用户 prompt。",disabled:!Xy||Hl,"data-testid":"codex-edit-prompt-textarea"})),G("label",{className:"codex-reference-field"},"引用任务 ID(可选,留空会清除引用)",G("input",{value:jl,disabled:!Xy||Hl,onChange:(B)=>ff(B.target.value),placeholder:"codex_...;支持空格/逗号分隔多个 ID","data-testid":"codex-edit-reference-task-id"}),ai(jl).length>0?G("code",null,`将保留/注入:${ai(jl).join(" / ")}`):null),G("div",{className:"codex-form-actions"},G("button",{type:"button",className:"ghost-btn",disabled:!R?.id||Hl,onClick:()=>{ol(R?x8(R):""),ff(Array.isArray(R?.referenceTaskIds)?R.referenceTaskIds.join(" "):"")},"data-testid":"codex-edit-prompt-reset"},"恢复当前值"),G("button",{type:"submit",className:"primary-btn",disabled:!Xy||Hl||Kl.trim().length===0,title:Xy?"保存后会重写尚未运行任务的用户 prompt":"只有 QUEUED 且尚未开始的任务可编辑 prompt","data-testid":"codex-edit-prompt-submit"},"保存 queued prompt"))):null,G("form",{className:"codex-steer-form",onSubmit:qE},G("label",null,"追加 prompt",G("textarea",{value:xu,rows:4,onChange:(B)=>yl(B.target.value),placeholder:"给正在运行的 Codex session 推入新的指令或纠偏。",disabled:!l2})),G("button",{type:"submit",className:"primary-btn",disabled:!l2||Hl||xu.trim().length===0,"data-testid":"codex-steer-button"},"推入运行中 session")))),G(oi,{title:"完成判定",eyebrow:R?.lastJudge?R.lastJudge.source:"judge",loading:fu},R?.lastJudge?G("div",{className:"codex-judge-card","data-testid":"codex-task-judge-card"},G(uy,{status:R.lastJudge.decision},R.lastJudge.decision),G("strong",null,`${Math.round(Number(R.lastJudge.confidence||0)*100)}% confidence`),G("p",{"data-testid":"codex-task-judge-reason"},T3(R.lastJudge.reason||"--",180)),G(AL,{judge:R.lastJudge,testId:"codex-task-judge-failure-details"}),R.lastJudge.continuePrompt?G("code",{"data-testid":"codex-task-judge-continue-prompt"},T3(R.lastJudge.continuePrompt,160)):null):G(T_,{title:"尚未判定",text:"Codex turn 结束后会由 MiniMax M2.7 或 fallback judge 判定 complete/retry/fail;retry 会在已有 thread 追加继续执行 prompt。"}))),G(CB,{stats:aA,queueName:ar,onRaw:l}),G(oi,{title:"Attempts",eyebrow:"terminal vs interruption",loading:fu},G(IB,{task:R})))))}var $1=bu(Wl(),1);var E=$1.default.createElement,{useEffect:a8}=$1.default,Lf=$1.default.useState,V7=["all","meeting","decision","goal","blocker","debt","experiment"],B7=["all","G0","G1","G2","G3","P0","P1","P2","P3","none"],c7=["all","active","blocked","parked","done"],vB=["一","二","三","四","五","六","日"],gB=["DCSN","GOAL","PLAN","RPRT","ACTN","ISSU","RETR","RQST","RESP","MINS"],VL={DCSN:"决策/决议",GOAL:"目标",PLAN:"计划",RPRT:"报告",ACTN:"行动",ISSU:"问题",RETR:"复盘",RQST:"请示",RESP:"批复/答复",MINS:"会议纪要"},OL=["DCSN","GOAL","PLAN","RPRT","ACTN","ISSU","RETR","RQST","RESP","MINS"],sB={DECISION:"DCSN",DECISIONS:"DCSN",GOALS:"GOAL",PLANS:"PLAN",REPORT:"RPRT",REPORTS:"RPRT",ACTION:"ACTN",ACTIONS:"ACTN",ISSUE:"ISSU",ISSUES:"ISSU",RETROSPECTIVE:"RETR",RETROSPECTIVES:"RETR",RETRO:"RETR",REQUEST:"RQST",REQUESTS:"RQST",RESPONSE:"RESP",RESPONSES:"RESP",REPLY:"RESP",MINUTES:"MINS",MEETINGMINUTES:"MINS"},BL="DC[-−–—]([A-Z]{2,5})[-−–—]([A-Z][0-9])[-−–—](\\d{4})[-−–—](\\d{1,6})",aB=new RegExp(`\\b${BL}\\b`,"iu"),oB=new RegExp(`^\\s*(?:#+\\s*)?${BL}(?=\\s|[::,,.;;/\\\\]|$)`,"iu"),dB=[{id:"all",label:"全部需求"},{id:"external-goal",label:"外部目标"},{id:"internal-goal",label:"内部目标"},{id:"blocker",label:"阻塞"},{id:"parked",label:"停放事项"},{id:"authority",label:"决议/实验/债务"}],w7=[{id:"external-goal",label:"外部目标",type:"goal",level:"G0",status:"active",tags:["external-goal","requirement"]},{id:"internal-goal",label:"内部目标",type:"goal",level:"G1",status:"active",tags:["internal-goal","requirement"]},{id:"blocker",label:"阻塞",type:"blocker",level:"P0",status:"blocked",tags:["blocker","requirement"]},{id:"parked",label:"停放事项",type:"goal",level:"G3",status:"parked",tags:["parked","requirement"]},{id:"decision",label:"决议",type:"decision",level:"none",status:"active",tags:["decision"]},{id:"experiment",label:"实验",type:"experiment",level:"G2",status:"active",tags:["experiment"]},{id:"debt",label:"债务",type:"debt",level:"P2",status:"active",tags:["debt"]}],ni="frontend-work-diary.md";function m0({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return E("span",{className:`status-badge ${f}`},l||u||"unknown")}function s8({label:u,value:l,hint:f,tone:n}){return E("article",{className:`metric-card ${n||""}`},E("div",{className:"metric-label"},u),E("div",{className:"metric-value"},l),E("div",{className:"metric-hint"},f))}function cf({title:u,eyebrow:l,actions:f,children:n,className:i,loading:y}){return E("section",{className:`panel ${i||""}`},E("div",{className:"panel-head"},E("div",null,l?E("p",{className:"panel-eyebrow"},l):null,E(nl,{title:u,loading:y})),f?E("div",{className:"panel-actions"},f):null),E("div",{className:"panel-body"},n))}function ii({title:u,data:l,onOpen:f,testId:n}){return E("button",{type:"button",className:"ghost-btn","data-testid":n,onClick:()=>f(u,l)},"查看原始JSON")}function Xf({title:u,text:l}){return E("div",{className:"empty-state"},E("strong",null,u),E("span",null,l))}function eB(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function uc(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function lc(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function p0(u,l){return`${u}/microservices/decision-center/proxy${l}`}function V_(u){if(u==="G0"||u==="G1")return"online";if(u==="P0"||u==="P1")return"failed";if(u==="none")return"unknown";return"warn"}function S3(u){if(u==="done")return"online";if(u==="blocked")return"failed";if(u==="parked")return"warn";return"unknown"}function Bn(u=new Date){let l=u.getFullYear(),f=String(u.getMonth()+1).padStart(2,"0"),n=String(u.getDate()).padStart(2,"0");return`${l}-${f}-${n}`}function c3(u){return/^\d{4}-\d{2}-\d{2}$/u.test(u)?u.slice(0,7):Bn().slice(0,7)}function fc(u){if(!/^\d{4}-\d{2}$/u.test(u))return null;let[l,f]=u.split("-").map(Number),n=new Date(l||0,(f||1)-1,1);return Number.isNaN(n.getTime())?null:n}function nc(u){let l=fc(u);if(l===null)return[];let f=new Date(l.getFullYear(),l.getMonth()+1,0).getDate(),n=(l.getDay()+6)%7,i=[];for(let y=0;yString(i||"").trim()).filter(Boolean);if(typeof n==="string"&&n.trim())return ny(n)}return[]}function If(u,l){for(let f of l){let n=u?.[f];if(n!==null&&n!==void 0&&String(n).trim())return String(n).trim()}return""}function XL(u){return Array.isArray(u?.tags)?u.tags.map((l)=>String(l||"").trim()).filter(Boolean):ny(u?.tags)}function d8(u,l){let f=`${l}:`;return XL(u).filter((n)=>n.toLowerCase().startsWith(f.toLowerCase())).map((n)=>n.slice(f.length).trim()).filter(Boolean)}function cn(u,l){return d8(u,l)[0]||""}function X7(u){return If(u,["source","sourceLabel","sourceFile"])||cn(u,"source")||If(u,["sourceSession"])||"--"}function Y7(u){let l=If(u,["issueId","issue","githubIssue","githubIssueId","externalIssue"])||cn(u,"issue"),f=If(u,["taskId","task"]);if(l&&f)return`issue:${l} / task:${f}`;if(l)return`issue:${l}`;if(f)return`task:${f}`;return""}function e8(u){return Hu(u)||"--"}function A1(u,l=220){let f=String(u||"").replace(/\s+/gu," ").trim();return f.length>l?`${f.slice(0,l-1)}...`:f}function Kf(u){return String(u||"").replace(/[^A-Za-z0-9_-]+/g,"-")||"item"}function ny(u){return String(u||"").split(",").map((l)=>l.trim()).filter(Boolean).slice(0,50)}function D3(u){return Array.isArray(u)?u.join(", "):String(u||"")}function YL(u){return String(u||"").trim().toUpperCase()}function Z7(u){let l=YL(u).replace(/[^A-Z0-9]+/gu,"");if(gB.includes(l))return l;return sB[l]||""}function E7(u){return YL(u).match(/\b([PG][0-3])\b/u)?.[1]||""}function H7(u){return String(u||"").match(/\b(20\d{2}|19\d{2})\b/u)?.[1]||""}function O7(u){let l=String(u||"").trim().match(/^\D*(\d{1,6})\D*$/u);if(!l)return"";return l[1].padStart(3,"0")}function t3(u){let l=String(u||"").match(aB);if(!l)return null;let f=Z7(l[1]),n=E7(l[2]),i=H7(l[3]),y=O7(l[4]);if(!f||!n||!i||!y)return null;return{docNo:`DC-${f}-${n}-${i}-${y}`,docType:f,priority:n,year:i,sequence:y}}function ic(u){let l=String(u||"").match(oB);return l?t3(l[0]):null}function yc(u){let l=If(u,["body","content","markdown","summary"]);if(!l)return"";let f=l.split(/\r?\n/u).slice(0,8).join(` +不会删除磁盘上的实际目录。`)))return;Oi(!0),await pf(async()=>{let s=await tl(Sl(f,`/api/workdirs/${encodeURIComponent(Nu)}/${encodeURIComponent(sl)}/${encodeURIComponent(B)}`),{method:"DELETE"});w1((Uu)=>({...Uu||{},...s}));let lu=`已从下拉菜单删除工作目录:${B}`;Ml(lu),Zf("success",lu)},"删除工作目录失败"),Oi(!1)}async function UE(){let B=typeof window>"u"?"":window.prompt("输入新的 Codex queue ID(字母/数字/._-,最长 64)","new-lane"),P=String(B||"").trim();if(!P)return;await pf(async()=>{let s=await tl(Sl(f,"/api/queues"),{method:"POST",body:{queueId:P}}),lu=String(s?.queue?.id||P);$l(lu),Sf(lu),Cf(null),J.current="",F.current+=1,ru(""),m(null);let Uu=`已创建并切换到 queue:${lu}`;Ml(Uu),Zf("success",Uu),await F0("",!0,lu)},"创建 Codex queue 失败")}async function NE(){let B=String(hu||"default").trim()||"default",P=H_(s0,B)||{id:B,name:B},s=typeof window>"u"?null:window.prompt(`输入 queue 显示名称(ID 不变:${B};留空恢复为 ID)`,yL(P));if(s===null)return;await pf(async()=>{let lu=await tl(Sl(f,`/api/queues/${encodeURIComponent(B)}`),{method:"PATCH",body:{name:String(s)}}),Uu=lu?.queue||{id:B,name:String(s||B)};if(lu?.summary)Cf((Ou)=>Ou?{...Ou,queue:lu.summary}:Ou);let Tu=`已更新 queue 名称:${i7(Uu)}`;Ml(Tu),Zf("success",Tu),await F0(J.current,!0,gu)},"修改 Codex queue 名称失败")}function FE(){if(Z1.length===0){Ml("没有可合并的其他 queue;请先创建或选择另一个 queue。");return}let B=Z1.some((P)=>String(P?.id||"")===U0)?U0:"";Pf(B),ff(!0)}async function WE(){let B=Ty;if(Z1.length===0){Ml("没有可合并的其他 queue;请先创建或选择另一个 queue。");return}let s=String(U0||""||"").trim();if(!s){Ml("请先选择要合并的源 queue。");return}if(s===B){Wl("源 queue 和目标 queue 不能相同。");return}await pf(async()=>{let lu=await tl(Sl(f,`/api/queues/${encodeURIComponent(B)}/merge`),{method:"POST",body:{sourceQueueId:s}});if(lu?.summary)Cf((Ou)=>Ou?{...Ou,queue:lu.summary}:Ou);$l(B),Sf(B),Cf(null);let Uu=Number(lu?.mergedTaskCount||0),Tu=`已将 queue=${s} 合并到 ${B},移动 ${Uu} 个任务;源 queue 已自动删除。`;Ml(Tu),Zf("success",Tu),ff(!1),Pf(""),await F0(J.current,!0,B)},"合并 Codex queue 失败")}async function qE(B){if(B.preventDefault(),N.current){Ml("任务正在提交中,请等待当前请求完成,已阻止重复提交。");return}if(Vy.length>1&&!z1){Wl(`检测到将创建 ${Vy.length} 个任务;请先勾选“确认批量入队”,避免误传多个任务。`);return}N.current=!0,Su(!0),Ml("正在提交 Code Queue 任务,请等待后端确认,输入已临时锁定。"),await pf(async()=>{if(Vy.length===0)throw Error("prompt 不能为空");let P=oy(Wu),s=hu.trim()||"default",lu=[...Vy],Uu=(vu)=>({prompt:vu,queueId:s,providerId:Nu,executionMode:sl,model:jf,cwd:Jf,maxAttempts:Number(B0),...P.length>0?{referenceTaskIds:P}:{}}),Tu=lu.length===1?Uu(lu[0]):{tasks:lu.map(Uu)},Ou=await tl(Sl(f,lu.length===1?"/api/tasks":"/api/tasks/batch"),{method:"POST",body:Tu}),Iu=Ou?.tasks?.[0]?.id||"",Yu=Array.isArray(Ou?.tasks)?Ou.tasks.map((vu)=>String(vu?.id||"")).filter(Boolean):[],Cu=`已创建 ${Yu.length||lu.length} 个任务${Yu.length>0?`:${Yu.join(" / ")}`:""}`;if(fE(Array.isArray(Ou?.tasks)?Ou.tasks:[],Ou?.queue||null),Ml(Cu),Zf("success",Cu),$u(""),tu(""),G1(!1),$l(s),Iu&&y2(Ou?.tasks?.[0],gu)&&i2(Ou?.tasks?.[0]))H1(String(Iu),!1).catch((vu)=>Wl(Dl(vu,"加载 Codex Trace Summary 失败")))},"Codex 任务入队失败"),N.current=!1,Su(!1)}async function LE(B){if(B.preventDefault(),!R?.id)return;await pf(async()=>{await tl(Sl(f,`/api/tasks/${encodeURIComponent(R.id)}/steer`),{method:"POST",body:{prompt:mu}}),il(""),await F0(R.id)},"追加 prompt 失败")}async function KE(B){B.preventDefault();let P=String(R?.id||"");if(!P||!Yi)return;await pf(async()=>{let s=oy(jl),lu=await tl(Sl(f,`/api/tasks/${encodeURIComponent(P)}/edit`),{method:"POST",body:{prompt:zl,referenceTaskIds:s}}),Uu={...lu?.task||R||{},_traceSummary:null,_traceSummaryLoaded:!1,_traceSummaryUpdatedAt:"",_promptDetails:{},_traceSteps:[],_traceStepsLoaded:!1,_traceStepsByAttempt:{},_traceStepsLoadedByAttempt:{},_traceStepsNextAfterSeqByAttempt:{},_traceStepDetails:{}};V.current.set(P,{...V.current.get(P)||{},task:Uu,complete:!1,completeUpdatedAt:""}),J.current=P,m(Uu),ru(P),dl(R4(Uu)),nf(Array.isArray(Uu?.referenceTaskIds)?Uu.referenceTaskIds.join(" "):""),Cf((Ou)=>{if(!Ou)return Ou;let Iu=ml(Ou).map((Yu)=>String(Yu?.id||"")===P?{...Yu,...Uu}:Yu);return{...Ou,queue:lu?.queue||Ou.queue,tasks:Xn([Iu],hn)}});let Tu=lu?.changed===!1?`任务 ${P} 的 prompt 未变化`:`已更新 queued 任务 ${P} 的用户 prompt`;Ml(Tu),Zf("success",Tu),await F0(P,!0,gu)},"编辑 queued 任务 prompt 失败")}async function zE(){if(!R?.id)return;await pf(async()=>{await tl(Sl(f,`/api/tasks/${encodeURIComponent(R.id)}/interrupt`),{method:"POST",body:{}}),await F0(R.id)},"打断 Codex session 失败")}async function GE(){if(!R?.id)return;await pf(async()=>{await tl(Sl(f,`/api/tasks/${encodeURIComponent(R.id)}/retry`),{method:"POST",body:{}}),await F0(R.id)},"重新入队失败")}async function wE(B){let P=String(R?.id||""),s=String(B||"").trim();if(!P||!s)return;let lu=O_(R);if(s===lu){Ml(`任务 ${P} 已在 queue=${s}`);return}await pf(async()=>{let Tu=(await tl(Sl(f,`/api/tasks/${encodeURIComponent(P)}/move`),{method:"POST",body:{queueId:s}}))?.task||{...R,queueId:s};if(V.current.set(P,{...V.current.get(P)||{},task:Tu}),J.current=P,m(Tu),ru(P),$l(s),!If(gu))Cf(null),Sf(s);let Ou=`已将任务 ${P} 从 ${lu} 移动到 ${s}`;Ml(Ou),Zf("success",Ou),await F0(P,!0,If(gu)?_1:s)},"移动任务 queue 失败")}async function ZE(){let B=J.current;if(!B)return;let P=performance.now();await pf(async()=>{X0({phase:"session",taskId:B,queueMs:0,totalMs:0,partial:!0,startedAt:new Date}),await H1(B,!0,P,0)},"刷新 Trace Summary 失败")}function EE(B){J.current=B,F.current+=1,ru(B);let P=V.current.get(B);if(P?.task)m(P.task),iu(!1);else{iu(!0);let s=qn.find((lu)=>lu.id===B);if(s)m(s);else m(null)}F0(B).catch((s)=>Wl(Dl(s,"切换 Codex session 失败")))}function j2(B){if(EE(B),VV())j$(!1)}function _U(B,P,s){if(!B||!Array.isArray(B?.tasks)||P.length===0||Object.keys(s).length===0)return B;let lu=!1,Uu=ml(B).map((Tu)=>{if(String(Tu?.id||"")!==P)return Tu;return lu=!0,e6(aq(Tu,s))});return lu?{...B,tasks:Uu}:B}function HE(B,P){Cf((s)=>_U(s,B,P)),Bu((s)=>_U(s,B,P))}function OE(B,P,s){let lu=String(B?.type||"");if(lu==="queue-updated")return!0;if(lu==="trace-stats-updated"||lu==="trace-step-created")return!1;if(P.length===0)return!0;if(!s)return!0;if(B?.queueId&&String(B.queueId)!==O_(s))return!0;if(B?.status&&String(B.status)!==String(s?.status||""))return!0;return String(B?.reason||"")!=="output"}function $U(){if(!i||!s9())return;if(X.current!==null)window.clearTimeout(X.current);X.current=window.setTimeout(()=>{X.current=null,F0(J.current,!1).catch((B)=>Wl(Dl(B,"Code Queue 事件刷新失败")))},120)}function TE(B,P){if(!i||!s9()||J.current!==B)return;if(S.current=S.current||P,c.current!==null)return;c.current=window.setTimeout(()=>{c.current=null;let s=S.current;if(S.current=!1,H1(B,!0).catch((lu)=>Wl(Dl(lu,"事件刷新 Trace Summary 失败"))),s)$E(B)},250)}function VE(B){let P=ll(B?.payload)||B,s=ll(P?.stats),lu=String(B?.type||P?.type||""),Uu=String(P?.subjectKind||s?.subjectKind||""),Tu=String(P?.scopeId||s?.scopeId||""),Ou=String(P?.taskId||(Uu==="task"?P?.subjectId:"")||s?.taskId||B?.taskId||""),Iu=P?.attemptIndex??s?.attemptIndex,Yu=Iu===null||Iu===void 0||Iu===""?null:Jn(Iu),Cu=s||ll(P?.traceStats),vu=Cu?.stepCount??Cu?.llmStepCount,Nl=Cu?.outputMaxSeq;return{...P,type:lu,eventId:B?.eventId||P?.eventId,sequence:B?.sequence??P?.sequence,taskId:Ou,subjectKind:Uu,scopeId:Tu,attemptIndex:Yu,stepCount:vu,outputMaxSeq:Nl,updatedAt:Cu?.updatedAt||P?.updatedAt||B?.createdAt,traceStats:Cu,statsSource:Cu?"oa-event-flow":P?.statsSource}}function BE(B){let P=VE(B),s=String(P?.taskId||""),lu=String(P?.scopeId||P?.traceStats?.scopeId||""),Uu=String(P?.subjectKind||P?.traceStats?.subjectKind||"")==="task-attempt"||Number(P?.attemptIndex)>0||/:attempt:\d+$/u.test(lu),Tu=kq(P?.stepCount),Ou={},Iu=s.length>0?ml(t.current).find((Yu)=>String(Yu?.id||"")===s):null;if(s.length>0){if(P?.status)Ou.status=String(P.status);if(P?.updatedAt)Ou.updatedAt=String(P.updatedAt);if(P?.queueId)Ou.queueId=String(P.queueId);if(!Uu&&Number.isFinite(Number(P?.stepCount)))Ou.stepCount=Tu,Ou.llmStepCount=Tu;if(!Uu&&Number.isFinite(Number(P?.outputMaxSeq)))Ou.outputMaxSeq=kq(P.outputMaxSeq);if(!Uu&&ll(P?.traceStats))Ou.traceStats=P.traceStats,Ou.statsSource="oa-event-flow";if(Object.keys(Ou).length>0&&(V.current.has(s)||J.current===s))a0(s,Ou,F.current);if(Object.keys(Ou).length>0)HE(s,Ou);if(J.current===s&&(P?.type==="trace-step-created"||P?.type==="task-updated"||P?.type==="trace-stats-updated")){let Yu=IV(Iu),Cu=P?.type==="trace-step-created"||P?.type==="trace-stats-updated"&&Number.isFinite(Number(P?.stepCount))&&(Uu||Yu===null||Tu>Yu);TE(s,Cu)}}if(OE(P,s,Iu))$U()}An(()=>{if(Y.current){Y.current=!1;return}pf(()=>F0(J.current),"Code Queue 加载失败")},[i?.id,gu]),An(()=>{if(!i||typeof EventSource>"u")return;let B=new EventSource(GV(f),{withCredentials:!0}),P=(lu)=>{try{BE(JSON.parse(String(lu.data||"{}")))}catch(Uu){Wl(Dl(Uu,"解析 Code Queue 事件失败"))}},s=()=>{if(s9())$U()};return B.addEventListener("trace-step-created",P),B.addEventListener("task-updated",P),B.addEventListener("queue-updated",P),B.addEventListener("trace-stats-updated",P),document.addEventListener("visibilitychange",s),()=>{if(B.close(),document.removeEventListener("visibilitychange",s),X.current!==null)window.clearTimeout(X.current),X.current=null;if(c.current!==null)window.clearTimeout(c.current),c.current=null}},[i?.id,f,gu]),An(()=>{if(!i||!R||fu)return;let B=String(R.id||"");if(!B)return;let P=String(R.updatedAt||"");if(p4(R))return;let s=`${B}:${P||"unknown"}:${String(R?._traceSummaryUpdatedAt||"")}`;if(T.current.has(s))return;T.current.add(s),H1(B,!0).catch((lu)=>Wl(Dl(lu,"自动加载 Trace Summary 失败")))},[i?.id,R?.id,R?.updatedAt,R?.traceStats?.statsRevision,R?._traceSummaryUpdatedAt,R?._traceSummaryLoaded,fu]),An(()=>{if(!i||!R||fu)return;let B=String(R.id||""),P=Number(Lf(R)?.currentAttempt||R?.currentAttempt||0);if(!B||!WL(R)||!Number.isFinite(P)||P<=0)return;if(b4(R,P))return;let s=`${B}:current-attempt:${P}:${String(R?.updatedAt||"")}`;if(T.current.has(s))return;T.current.add(s),l8(P).catch((lu)=>Wl(Dl(lu,"自动加载当前 Attempt Trace Steps 失败")))},[i?.id,R?.id,R?.status,R?.currentAttempt,R?.updatedAt,R?._traceSummaryUpdatedAt,fu]),An(()=>{if(!i)return;r2().catch((B)=>Wl(Dl(B,"加载工作目录失败")));return},[i?.id]),An(()=>{if(!i)return;nU(gu);return},[i?.id,f,gu]);let XE=Ln.length===0?w(V_,{title:N0?b?"搜索中":"没有匹配任务":"队列为空",text:N0?b?`正在搜索包含“${Xi}”的 task...`:`未找到包含“${Xi}”的 task;可换个关键词或切换 queue。`:"提交一个任务后,Codex 会串行执行并保存输出。"}):[sQ.length>0?w(n7,{key:"unread",title:"已结束未读",tasks:sQ,selectedId:yu,emptyText:"暂无已结束未读任务。",onSelect:j2,onCopy:_2,onReference:$2,onMarkRead:A2,copiedTaskId:Ei,markingReadTaskId:J$}):null,w(n7,{key:"active",title:"运行 / 排队",tasks:IZ,selectedId:yu,emptyText:"当前没有运行或排队任务。",onSelect:j2,onCopy:_2,onReference:$2,onMarkRead:A2,copiedTaskId:Ei,markingReadTaskId:J$}),w(n7,{key:"history",title:"历史 session",tasks:vZ,selectedId:yu,emptyText:"最近没有完成、失败或取消的 session。",onSelect:j2,onCopy:_2,onReference:$2,onMarkRead:A2,copiedTaskId:Ei,markingReadTaskId:J$}),w("div",{key:"pagination",className:"codex-task-pagination","data-testid":"codex-task-pagination"},w("span",null,N0?`搜索“${Xi}” · 已显示 ${Ln.length} / ${Number.isFinite(ci)?ci:Ln.length}`:`已加载 ${Ln.length} / ${Number.isFinite(ci)?ci:Ln.length}`),oQ?w("button",{type:"button",className:"ghost-btn",disabled:er,onClick:()=>void iU(),"data-testid":"codex-load-more-tasks-button"},er?"加载中":N0?"加载更多结果":"加载更早任务"):w("code",null,N0?"已到结果末尾":"已到队列末尾"))],AU=(B,P=!1)=>w("label",{className:`code-queue-switcher ${P?"compact":""}`},w("span",null,P?"Queue":"查看 queue"),w("select",{value:gu,onChange:(s)=>jE(String(s.target.value||_1)),"data-testid":B},w("option",{value:_1},`All queues · ${Number.isFinite(E1)?E1:qn.length} tasks · ${F$.length} running`),s0.map((s)=>w("option",{key:String(s?.id||""),value:String(s?.id||"")},E3(s))))),cE=w("div",{className:"codex-task-search","data-testid":"codex-task-search"},w("label",{htmlFor:"codex-task-search-input"},"搜索 task"),w("div",{className:"codex-task-search-row"},w("input",{id:"codex-task-search-input",type:"search",value:Ju,placeholder:"关键词 / task ID / prompt",autoComplete:"off",onChange:(B)=>Vu(String(B.target.value||"")),"data-testid":"codex-task-search-input"}),Ju?w("button",{type:"button",className:"ghost-btn",onClick:()=>Vu(""),"data-testid":"codex-task-search-clear"},"清除"):null),w("small",{"data-testid":"codex-task-search-summary"},N0?b?"搜索中...":`匹配 ${Ln.length}/${Number.isFinite(ci)?ci:Ln.length}`:"支持 task ID、prompt、状态、provider、模型和最近输出关键词")),YE=w("div",{className:"codex-trace-status","data-testid":"codex-trace-status-summary"},w("span",{className:"codex-trace-status-chip queued"},w("b",null,"排队"),String(a6)),w("span",{className:"codex-trace-status-chip running"},w("b",null,"运行"),String(kZ)),w("span",{className:`codex-trace-status-chip unread ${Bi>0?"warn":""}`},w("b",null,"结束未读"),String(Bi)),w("span",{className:"codex-trace-status-chip service"},w("b",null,"服务"),`${gZ.providerStatus||"unknown"} · ${i?.providerId||"D601"} · ${sZ.public?"公网暴露":"仅 UniDesk frontend 代理访问"}`),w("span",{className:"codex-trace-status-chip"},w("b",null,"执行节点"),d6.map((B)=>B.id).join(" / ")),w("span",{className:"codex-trace-status-chip"},w("b",null,"执行模式"),uU.map((B)=>B.id).join(" / ")),w("span",{className:"codex-trace-status-chip"},w("b",null,"模型"),eQ.join(" / ")),w("span",{className:"codex-trace-status-chip"},w("b",null,"加载"),of?.phase==="complete"?LV(of?.totalMs):String(of?.phase||"idle")),w("span",{className:"codex-trace-status-chip"},w("b",null,"刷新"),I6?rl(I6):"--")),DE=w(dy,{title:R?`Trace ${String(R.id).slice(0,22)}`:"Trace 输出",eyebrow:R?`${R.status} / view=${o6} / task queue=${O_(R)} / provider=${R.providerId||"D601"} / mode=${R.executionMode||"default"} / ${R.model} / agent loop trace`:`Agent loop trace / view=${o6}`,summary:YE,loading:fu||U$||b||nu||of?.phase==="loading",actions:w("div",{className:"panel-actions"},AU("code-queue-filter-select"),w("button",{type:"button",className:"ghost-btn codex-mark-all-read-btn",disabled:Bi===0||Ol||Q$,onClick:()=>void rE(),"data-testid":"codex-mark-all-read-button"},Q$?"标记中":`全部标已读${Bi>0?` (${Bi})`:""}`),R?w("button",{type:"button",className:"ghost-btn",disabled:fu||Ol,onClick:()=>void ZE(),"data-testid":"codex-load-full-trace-button"},fu?"加载中":Lf(R)?"刷新 Summary":"加载 Summary"):null,w("button",{type:"button",className:"codex-session-title-toggle",onClick:()=>j$((B)=>!B),"data-testid":"code-queue-sidebar-toggle"},r$?"收起队列":"展开队列"),w("label",{className:"inline-check"},w("input",{type:"checkbox",checked:kn,onChange:(B)=>gr(Boolean(B.target.checked))}),"自动滚动"),w("button",{type:"button",className:"ghost-btn",disabled:!dZ||Ol,onClick:()=>void zE(),"data-testid":"codex-interrupt-button"},"打断"),w("button",{type:"button",className:"ghost-btn",disabled:!eZ||Ol,onClick:()=>void GE()},"重试"),R?w(j7,{title:"Codex Task",data:R,onOpen:l,testId:"raw-codex-task"}):null),className:"codex-output-panel"},w("div",{className:`codex-session-shell ${r$?"":"queue-collapsed"}`},r$?w("aside",{className:"codex-session-sidebar","data-testid":"codex-session-sidebar"},w("div",{className:"codex-session-sidebar-head"},w("div",null,w("span",null,If(gu)?"All queues":"Queue lane"),w("strong",null,`${o6} · ${qn.length}/${Number.isFinite(E1)?E1:qn.length} sessions · 未读 ${Bi}`)),w("button",{type:"button",className:"ghost-btn",onClick:()=>j$(!1)},"收起")),AU("code-queue-filter-sidebar",!0),cE,w("div",{className:"codex-task-list codex-task-list-session",onScroll:AE,"data-testid":"codex-task-list-scroll"},XE)):null,w("div",{className:"codex-session-main"},w("div",{className:"codex-output-stack"},w(hB,{task:R,loading:fu,onLoadPromptPart:iE,onLoadSteps:l8,onLoadStep:_E}),w(IB,{task:R})))));if(!i)return w(V_,{title:"Code Queue 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=code-queue"});let rU=Number(of?.totalMs),jU=Number(of?.queueMs),JU=Number(of?.detailMs),QU=Number(of?.transcriptRows),tE=of?.phase==="complete"?"complete":String(of?.phase||"idle"),SE=H_(s0,Ty)||{id:Ty,name:Ty},PE=Q0?w(Sq,{title:"合并 queue",titleId:"codex-merge-dialog-title",className:"codex-merge-dialog",backdropClassName:"codex-merge-dialog-backdrop",bodyClassName:"codex-merge-dialog-body",actionsClassName:"codex-merge-dialog-actions",testId:"codex-merge-queue-dialog",closeTestId:"codex-merge-queue-close",disableClose:Ol,onClose:()=>ff(!1),actions:[w("button",{key:"cancel",type:"button",className:"ghost-btn",onClick:()=>ff(!1),disabled:Ol,"data-testid":"codex-merge-queue-cancel"},"取消"),w("button",{key:"confirm",type:"button",className:"primary-btn",onClick:()=>void WE(),disabled:Ul||Ol||e||!U0,"data-testid":"codex-merge-queue-confirm"},Ul?"旧入口已冻结":Ol?"合并中...":"确认合并")]},w("p",{className:"codex-merge-dialog-target"},"目标 queue:",w("code",null,E3(SE))),w("label",null,"源 queue",w("select",{value:U0,disabled:Ul||Ol||e,onChange:(B)=>Pf(String(B.target.value||"")),"data-testid":"codex-merge-source-queue-select"},w("option",{value:""},"选择要合并进来的源 queue"),Z1.map((B)=>w("option",{key:String(B?.id||""),value:String(B?.id||"")},E3(B))))),w("p",{className:"codex-merge-dialog-note"},"会把源 queue 的任务归属合并到目标 queue,并自动删除源 queue;目标 queue 会按原 queueEnteredAt/createdAt 时间顺序运行。")):null;return w("div",{className:`code-queue-page ${y?"codex-standalone-page":""}`,"data-testid":"code-queue-page","data-load-state":tE,"data-load-total-ms":Number.isFinite(rU)?String(Math.round(rU*10)/10):"","data-load-queue-ms":Number.isFinite(jU)?String(Math.round(jU*10)/10):"","data-load-detail-ms":Number.isFinite(JU)?String(Math.round(JU*10)/10):"","data-load-transcript-rows":Number.isFinite(QU)?String(QU):"","data-load-task-id":String(of?.taskId||yu||""),"data-load-partial":of?.partial?"true":"false"},w(ul,{error:sr,wide:!0}),PE,w("div",{className:"codex-session-stage codex-session-stage-top"},w(CB,{diagnostics:ar,queue:cl,onRaw:l}),DE),w("div",{className:"code-queue-layout"},w("div",{className:"codex-left-rail"},w(dy,{title:"旧 Code Queue 入口",eyebrow:"Frozen / Archive",className:"codex-compose-panel",loading:e},w("form",{className:`codex-task-form ${e?"is-submitting":""} ${Ul?"is-frozen":""}`,onSubmit:qE,"data-testid":"code-queue-task-form","aria-busy":e?"true":"false","aria-disabled":Ul?"true":"false"},w("div",{className:"codex-freeze-notice","data-testid":"code-queue-freeze-notice"},w("strong",null,"旧 Code Queue 新任务入口已冻结"),w("p",null,"新任务请使用 AgentRun Queue;本页保留历史任务、Trace 和排障查看。"),w("div",{className:"codex-freeze-command-grid"},w("code",null,"bun scripts/cli.ts agentrun v01 queue commander --reader-id cli"),w("code",null,"bun scripts/cli.ts agentrun v01 queue submit --json-stdin <<'JSON'"),w("code",null,"bun scripts/cli.ts agentrun v01 sessions trace --after-seq 0 --limit 100"))),w("label",null,"Prompt / 多任务用单独一行 --- 分隔",w("textarea",{value:v,rows:8,disabled:Ul||e,onChange:(B)=>$u(B.target.value),placeholder:"旧入口已冻结;新任务使用 AgentRun Queue。"})),w("label",{className:"codex-reference-field"},"引用任务 ID(可选)",w("input",{value:Wu,disabled:Ul||e,onChange:(B)=>tu(B.target.value),placeholder:"codex_...;支持空格/逗号分隔多个 ID","data-testid":"codex-reference-task-id"}),oy(Wu).length>0?w("code",null,`后端将解析并注入:${oy(Wu).join(" / ")}`):null),w("div",{className:"codex-form-grid"},w("label",{className:"codex-submit-queue-field"},"Queue",w("div",{className:"codex-submit-queue-row"},w("select",{className:"codex-submit-queue-select",value:hu,disabled:Ul||e,onChange:(B)=>$l(String(B.target.value||"default")),"data-testid":"code-queue-id-select"},s0.map((B)=>w("option",{key:String(B?.id||""),value:String(B?.id||"")},E3(B)))),w("button",{type:"button",className:"ghost-btn codex-rename-queue-btn",onClick:()=>void NE(),disabled:Ul||Ol||e||!hu,title:Ul?"旧 Code Queue queue 管理已冻结":"修改当前 queue 的显示名称,ID 不变","data-testid":"codex-rename-queue-button"},"改名"),w("button",{type:"button",className:"ghost-btn codex-merge-queue-btn",onClick:()=>FE(),disabled:Ul||Ol||e||Z1.length===0,title:Ul?"旧 Code Queue queue 管理已冻结":"打开独立窗口选择源 queue 并合并到当前 queue;合并后自动删除源 queue","data-testid":"codex-merge-queue-button"},"合并 queue"),w("button",{type:"button",className:"ghost-btn codex-create-queue-btn",onClick:()=>void UE(),disabled:Ul||Ol||e,"data-testid":"codex-create-queue-button"},"创建 queue"))),w("label",null,"模型",w("select",{value:jf,disabled:Ul||e,onChange:(B)=>Mf(B.target.value),"data-testid":"codex-model-select"},eQ.map((B)=>w("option",{key:B,value:B},B)))),w("label",null,"执行 Provider",w("select",{value:Nu,disabled:Ul||e,onChange:(B)=>nE(String(B.target.value||"D601")),"data-testid":"codex-provider-select"},d6.map((B)=>w("option",{key:B.id,value:B.id},`${B.label||B.id} · ${B.defaultWorkdir||K7(cl,B.id)}${B.supportsWindowsNativeCodex?" · Windows native":""}`)))),w("label",null,"执行模式",w("select",{value:sl,disabled:Ul||e,onChange:(B)=>yE(String(B.target.value||"default")),"data-testid":"codex-execution-mode-select"},uU.map((B)=>w("option",{key:B.id,value:B.id},`${B.label||B.id}${B.id==="windows-native"?" · 宿主 Codex":""}`)))),w("label",{className:"codex-workdir-field"},"工作目录",w("div",{className:"codex-workdir-row"},w("input",{value:Jf,disabled:Ul||e,onChange:(B)=>al(B.target.value),placeholder:lU||cl?.defaultWorkdir||"/workspace","data-testid":"codex-cwd-input"}),w("select",{value:T_(Jf),disabled:Ul||e||Hi,onChange:(B)=>al(String(B.target.value||"")),"data-testid":"codex-cwd-select"},fU.map((B)=>w("option",{key:`${B.providerId}:${B.executionMode}:${B.path}`,value:B.path},`${B.path}${B.source==="default"?" · 默认":""}`))),w("button",{type:"button",className:"ghost-btn codex-workdir-create-btn",disabled:Ul||e||Ol||Hi,onClick:()=>void JE(),"data-testid":"codex-cwd-create-button"},Hi?"处理中":"新建"),w("button",{type:"button",className:"ghost-btn codex-workdir-delete-btn",disabled:Ul||e||Ol||Hi||!l2,onClick:()=>void QE(),title:Ul?"旧 Code Queue 工作目录管理已冻结":l2?"从工作目录下拉菜单删除这个选项,不删除磁盘目录":"当前工作目录尚未保存到下拉菜单","data-testid":"codex-cwd-delete-button"},"删除"))),w("label",null,"最大尝试",w("input",{type:"number",min:1,max:99,value:B0,disabled:Ul||e,onChange:(B)=>bn(Number(B.target.value)),"data-testid":"codex-max-attempts-input"})),w("label",null,"入队份数",w("input",{type:"number",min:1,max:50,value:af,disabled:Ul||e,onChange:(B)=>A$(Number(B.target.value)),"data-testid":"codex-repeat-count-input"}))),W$>1?w("label",{className:`codex-batch-confirm ${z1?"confirmed":""}`,"data-testid":"codex-batch-confirm-row"},w("input",{type:"checkbox",checked:z1,disabled:Ul||e,onChange:(B)=>G1(Boolean(B.target.checked)),"data-testid":"codex-batch-confirm-checkbox"}),w("span",null,`确认批量入队 ${W$} 个任务(prompt 分段 ${u2.length} × 入队份数 ${bq(af)})`)):null,Ul||e?w("div",{className:"codex-submit-wait","data-testid":"codex-submit-wait"},Ul?"旧入口冻结:提交、重试、steer、queue 管理不会再写入旧 Code Queue。":"正在提交到后端,已锁定输入以防重复提交..."):null,w("div",{className:"codex-form-actions"},w("button",{type:"button",className:"ghost-btn",disabled:Ol||e||v.length===0&&Wu.length===0,onClick:()=>{$u(""),tu(""),G1(!1);let B="已清空任务输入栏";Ml(B),Zf("success",B)},"data-testid":"codex-clear-input-button"},"清空输入"),w("button",{type:"submit",className:"primary-btn",disabled:aZ,"data-testid":"codex-enqueue-button"},Ul?"已冻结,使用 AgentRun Queue":e?"提交中,请等待...":dQ?`请确认批量入队 ${W$} 个任务`:Vy.length>1?`批量入队 ${Vy.length} 个任务`:"入队并运行"))))),w("div",{className:"codex-main-stage"},w("div",{className:"codex-detail-grid"},w(dy,{title:"运行控制",eyebrow:Ul?"Legacy write controls frozen":Yi?"Queued prompt editable":f2?"Active turn steer":"Steer when running",loading:Ol},w("div",{className:"codex-run-control-stack"},w(xB,{task:R,queueRows:s0,busy:Ol,frozen:Ul,onMove:wE}),R?.id?w("form",{className:"codex-steer-form codex-edit-prompt-form",onSubmit:KE,"data-testid":"codex-edit-prompt-form"},w("label",null,"编辑 queued 用户 prompt",w("textarea",{value:zl,rows:5,onChange:(B)=>dl(B.target.value),placeholder:"仅 QUEUED 且尚未开始运行的任务可在这里修改原始用户 prompt。",disabled:!Yi||Ol,"data-testid":"codex-edit-prompt-textarea"})),w("label",{className:"codex-reference-field"},"引用任务 ID(可选,留空会清除引用)",w("input",{value:jl,disabled:!Yi||Ol,onChange:(B)=>nf(B.target.value),placeholder:"codex_...;支持空格/逗号分隔多个 ID","data-testid":"codex-edit-reference-task-id"}),oy(jl).length>0?w("code",null,`将保留/注入:${oy(jl).join(" / ")}`):null),w("div",{className:"codex-form-actions"},w("button",{type:"button",className:"ghost-btn",disabled:!R?.id||Ol,onClick:()=>{dl(R?R4(R):""),nf(Array.isArray(R?.referenceTaskIds)?R.referenceTaskIds.join(" "):"")},"data-testid":"codex-edit-prompt-reset"},"恢复当前值"),w("button",{type:"submit",className:"primary-btn",disabled:!Yi||Ol||zl.trim().length===0,title:Yi?"保存后会重写尚未运行任务的用户 prompt":"只有 QUEUED 且尚未开始的任务可编辑 prompt","data-testid":"codex-edit-prompt-submit"},"保存 queued prompt"))):null,w("form",{className:"codex-steer-form",onSubmit:LE},w("label",null,"追加 prompt",w("textarea",{value:mu,rows:4,onChange:(B)=>il(B.target.value),placeholder:"给正在运行的 Codex session 推入新的指令或纠偏。",disabled:!f2})),w("button",{type:"submit",className:"primary-btn",disabled:!f2||Ol||mu.trim().length===0,"data-testid":"codex-steer-button"},"推入运行中 session")))),w(dy,{title:"完成判定",eyebrow:R?.lastJudge?R.lastJudge.source:"judge",loading:fu},R?.lastJudge?w("div",{className:"codex-judge-card","data-testid":"codex-task-judge-card"},w(li,{status:R.lastJudge.decision},R.lastJudge.decision),w("strong",null,`${Math.round(Number(R.lastJudge.confidence||0)*100)}% confidence`),w("p",{"data-testid":"codex-task-judge-reason"},V3(R.lastJudge.reason||"--",180)),w(jL,{judge:R.lastJudge,testId:"codex-task-judge-failure-details"}),R.lastJudge.continuePrompt?w("code",{"data-testid":"codex-task-judge-continue-prompt"},V3(R.lastJudge.continuePrompt,160)):null):w(V_,{title:"尚未判定",text:"Codex turn 结束后会由 MiniMax M2.7 或 fallback judge 判定 complete/retry/fail;retry 会在已有 thread 追加继续执行 prompt。"}))),w(pB,{stats:or,queueName:o6,onRaw:l}),w(dy,{title:"Attempts",eyebrow:"terminal vs interruption",loading:fu},w(vB,{task:R})))))}var A1=ku(ql(),1);var E=A1.default.createElement,{useEffect:o4}=A1.default,Kf=A1.default.useState,B7=["all","meeting","decision","goal","blocker","debt","experiment"],X7=["all","G0","G1","G2","G3","P0","P1","P2","P3","none"],c7=["all","active","blocked","parked","done"],gB=["一","二","三","四","五","六","日"],sB=["DCSN","GOAL","PLAN","RPRT","ACTN","ISSU","RETR","RQST","RESP","MINS"],BL={DCSN:"决策/决议",GOAL:"目标",PLAN:"计划",RPRT:"报告",ACTN:"行动",ISSU:"问题",RETR:"复盘",RQST:"请示",RESP:"批复/答复",MINS:"会议纪要"},TL=["DCSN","GOAL","PLAN","RPRT","ACTN","ISSU","RETR","RQST","RESP","MINS"],aB={DECISION:"DCSN",DECISIONS:"DCSN",GOALS:"GOAL",PLANS:"PLAN",REPORT:"RPRT",REPORTS:"RPRT",ACTION:"ACTN",ACTIONS:"ACTN",ISSUE:"ISSU",ISSUES:"ISSU",RETROSPECTIVE:"RETR",RETROSPECTIVES:"RETR",RETRO:"RETR",REQUEST:"RQST",REQUESTS:"RQST",RESPONSE:"RESP",RESPONSES:"RESP",REPLY:"RESP",MINUTES:"MINS",MEETINGMINUTES:"MINS"},XL="DC[-−–—]([A-Z]{2,5})[-−–—]([A-Z][0-9])[-−–—](\\d{4})[-−–—](\\d{1,6})",oB=new RegExp(`\\b${XL}\\b`,"iu"),dB=new RegExp(`^\\s*(?:#+\\s*)?${XL}(?=\\s|[::,,.;;/\\\\]|$)`,"iu"),eB=[{id:"all",label:"全部需求"},{id:"external-goal",label:"外部目标"},{id:"internal-goal",label:"内部目标"},{id:"blocker",label:"阻塞"},{id:"parked",label:"停放事项"},{id:"authority",label:"决议/实验/债务"}],Z7=[{id:"external-goal",label:"外部目标",type:"goal",level:"G0",status:"active",tags:["external-goal","requirement"]},{id:"internal-goal",label:"内部目标",type:"goal",level:"G1",status:"active",tags:["internal-goal","requirement"]},{id:"blocker",label:"阻塞",type:"blocker",level:"P0",status:"blocked",tags:["blocker","requirement"]},{id:"parked",label:"停放事项",type:"goal",level:"G3",status:"parked",tags:["parked","requirement"]},{id:"decision",label:"决议",type:"decision",level:"none",status:"active",tags:["decision"]},{id:"experiment",label:"实验",type:"experiment",level:"G2",status:"active",tags:["experiment"]},{id:"debt",label:"债务",type:"debt",level:"P2",status:"active",tags:["debt"]}],ny="frontend-work-diary.md";function R0({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return E("span",{className:`status-badge ${f}`},l||u||"unknown")}function a4({label:u,value:l,hint:f,tone:n}){return E("article",{className:`metric-card ${n||""}`},E("div",{className:"metric-label"},u),E("div",{className:"metric-value"},l),E("div",{className:"metric-hint"},f))}function cf({title:u,eyebrow:l,actions:f,children:n,className:y,loading:i}){return E("section",{className:`panel ${y||""}`},E("div",{className:"panel-head"},E("div",null,l?E("p",{className:"panel-eyebrow"},l):null,E(nl,{title:u,loading:i})),f?E("div",{className:"panel-actions"},f):null),E("div",{className:"panel-body"},n))}function yy({title:u,data:l,onOpen:f,testId:n}){return E("button",{type:"button",className:"ghost-btn","data-testid":n,onClick:()=>f(u,l)},"查看原始JSON")}function Yf({title:u,text:l}){return E("div",{className:"empty-state"},E("strong",null,u),E("span",null,l))}function uX(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function lX(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function fX(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function m0(u,l){return`${u}/microservices/decision-center/proxy${l}`}function B_(u){if(u==="G0"||u==="G1")return"online";if(u==="P0"||u==="P1")return"failed";if(u==="none")return"unknown";return"warn"}function P3(u){if(u==="done")return"online";if(u==="blocked")return"failed";if(u==="parked")return"warn";return"unknown"}function cn(u=new Date){let l=u.getFullYear(),f=String(u.getMonth()+1).padStart(2,"0"),n=String(u.getDate()).padStart(2,"0");return`${l}-${f}-${n}`}function c3(u){return/^\d{4}-\d{2}-\d{2}$/u.test(u)?u.slice(0,7):cn().slice(0,7)}function nX(u){if(!/^\d{4}-\d{2}$/u.test(u))return null;let[l,f]=u.split("-").map(Number),n=new Date(l||0,(f||1)-1,1);return Number.isNaN(n.getTime())?null:n}function yX(u){let l=nX(u);if(l===null)return[];let f=new Date(l.getFullYear(),l.getMonth()+1,0).getDate(),n=(l.getDay()+6)%7,y=[];for(let i=0;iString(y||"").trim()).filter(Boolean);if(typeof n==="string"&&n.trim())return yi(n)}return[]}function vf(u,l){for(let f of l){let n=u?.[f];if(n!==null&&n!==void 0&&String(n).trim())return String(n).trim()}return""}function YL(u){return Array.isArray(u?.tags)?u.tags.map((l)=>String(l||"").trim()).filter(Boolean):yi(u?.tags)}function e4(u,l){let f=`${l}:`;return YL(u).filter((n)=>n.toLowerCase().startsWith(f.toLowerCase())).map((n)=>n.slice(f.length).trim()).filter(Boolean)}function Yn(u,l){return e4(u,l)[0]||""}function Y7(u){return vf(u,["source","sourceLabel","sourceFile"])||Yn(u,"source")||vf(u,["sourceSession"])||"--"}function D7(u){let l=vf(u,["issueId","issue","githubIssue","githubIssueId","externalIssue"])||Yn(u,"issue"),f=vf(u,["taskId","task"]);if(l&&f)return`issue:${l} / task:${f}`;if(l)return`issue:${l}`;if(f)return`task:${f}`;return""}function uA(u){return Zu(u)||"--"}function j1(u,l=220){let f=String(u||"").replace(/\s+/gu," ").trim();return f.length>l?`${f.slice(0,l-1)}...`:f}function zf(u){return String(u||"").replace(/[^A-Za-z0-9_-]+/g,"-")||"item"}function yi(u){return String(u||"").split(",").map((l)=>l.trim()).filter(Boolean).slice(0,50)}function S3(u){return Array.isArray(u)?u.join(", "):String(u||"")}function DL(u){return String(u||"").trim().toUpperCase()}function E7(u){let l=DL(u).replace(/[^A-Z0-9]+/gu,"");if(sB.includes(l))return l;return aB[l]||""}function H7(u){return DL(u).match(/\b([PG][0-3])\b/u)?.[1]||""}function O7(u){return String(u||"").match(/\b(20\d{2}|19\d{2})\b/u)?.[1]||""}function T7(u){let l=String(u||"").trim().match(/^\D*(\d{1,6})\D*$/u);if(!l)return"";return l[1].padStart(3,"0")}function t3(u){let l=String(u||"").match(oB);if(!l)return null;let f=E7(l[1]),n=H7(l[2]),y=O7(l[3]),i=T7(l[4]);if(!f||!n||!y||!i)return null;return{docNo:`DC-${f}-${n}-${y}-${i}`,docType:f,priority:n,year:y,sequence:i}}function iX(u){let l=String(u||"").match(dB);return l?t3(l[0]):null}function _X(u){let l=vf(u,["body","content","markdown","summary"]);if(!l)return"";let f=l.split(/\r?\n/u).slice(0,8).join(` `),n=l.split(/\r?\n\s*\r?\n/u).slice(0,2).join(` `);return`${f} -${n}`.slice(0,1600)}function X3(u,l){if(!l)return;if(!u.docNo)u.docNo=l.docNo;if(!u.docType)u.docType=l.docType;if(!u.priority)u.priority=l.priority;if(!u.year)u.year=l.year;if(!u.sequence)u.sequence=l.sequence}function K7(u){return u.docType&&u.priority&&u.year&&u.sequence?`DC-${u.docType}-${u.priority}-${u.year}-${u.sequence}`:""}function u4(u){let l={docNo:"",docType:"",docTypeLabel:"",priority:"",year:"",sequence:""};X3(l,t3(If(u,["docNo","documentNo","documentNumber","documentId"])));let f=Z7(If(u,["docType","documentType","documentKind"])),n=E7(If(u,["priority","docPriority","documentPriority"])),i=H7(If(u,["year","docYear","documentYear"])),y=O7(If(u,["sequence","seq","docSequence","documentSequence"]));if(f)l.docType=f;if(n)l.priority=n;if(i)l.year=i;if(y)l.sequence=y;let _=K7(l);if(!l.docNo&&_)l.docNo=_;X3(l,ic(u?.title)),X3(l,t3(If(u,["title","name"])));for(let j of d8(u,"doc-no"))X3(l,t3(j));if(!l.docType)l.docType=Z7(cn(u,"doc-type"));if(!l.priority)l.priority=E7(cn(u,"doc-priority"));if(!l.year)l.year=H7(cn(u,"doc-year"));if(!l.sequence)l.sequence=O7(cn(u,"doc-sequence"));let $=K7(l);if(!l.docNo&&$)l.docNo=$;X3(l,t3(yc(u)));let r=K7(l);if(!l.docNo&&r)l.docNo=r;return l.docTypeLabel=l.docType?VL[l.docType]:"",l}function _c(u){let l=new Map;for(let f of OL)l.set(f,[]);for(let f of u){let n=u4(f).docType||"DCSN";l.get(n).push(f)}return OL.map((f)=>({type:f,label:VL[f],nodes:l.get(f)||[]})).filter((f)=>f.nodes.length>0)}function $c(u){let l=new Map,f=["thesis","external-demand","D518"];for(let n of u){let y=(Array.isArray(n?.tags)?n.tags:[]).filter((_)=>{let $=String(_||"").toLowerCase();return f.some((r)=>$.includes(r))||/^doc-type:/.test($)});if(y.length===0)y.push("未分类");for(let _ of y){let $=l.get(String(_))||[];$.push(n),l.set(String(_),$)}}return[...l.entries()].map(([n,i])=>({tag:n,nodes:i})).sort((n,i)=>{let y=f.findIndex(($)=>n.tag.toLowerCase().includes($)),_=f.findIndex(($)=>i.tag.toLowerCase().includes($));if(y!==_)return(y===-1?99:y)-(_===-1?99:_);return n.tag.localeCompare(i.tag)})}function tL({record:u,depth:l,onSelect:f,selectedId:n}){let i=u4(u),y=i.docNo?`${i.docNo} ${u.title||""}`:u.title||u.id||"--";return E("div",{className:`doc-tree-node depth-${Math.min(l,3)}`},E("button",{type:"button",className:`doc-tree-item ${n===u.id?"selected":""}`,onClick:()=>f(u),"data-testid":`doc-tree-item-${Kf(u.id)}`},E("span",{className:"doc-tree-meta"},i.docType||u.type||"--"),E("span",{className:"doc-tree-label"},A1(y,80))))}function rc({group:u,onSelect:l,selectedId:f,defaultOpen:n}){let[i,y]=Lf(n!==!1);return E("div",{className:"doc-tree-group","data-testid":`doc-tree-group-${u.type}`},E("button",{type:"button",className:`doc-tree-group-head ${i?"open":""}`,onClick:()=>y((_)=>!_),"data-testid":`doc-tree-group-toggle-${u.type}`},E("span",{className:"doc-tree-group-label"},u.label),E("span",{className:"doc-tree-group-count"},u.nodes.length),E("span",{className:"doc-tree-caret"},i?"▾":"▸")),i?E("div",{className:"doc-tree-group-body"},u.nodes.map((_)=>E(tL,{key:_.id,record:_,depth:0,onSelect:l,selectedId:f}))):null)}function Ac({group:u,onSelect:l,selectedId:f,defaultOpen:n}){let[i,y]=Lf(n!==!1);return E("div",{className:"doc-tree-group","data-testid":`tag-tree-group-${Kf(u.tag)}`},E("button",{type:"button",className:`doc-tree-group-head ${i?"open":""}`,onClick:()=>y((_)=>!_),"data-testid":`tag-tree-group-toggle-${Kf(u.tag)}`},E("span",{className:"doc-tree-group-label"},u.tag),E("span",{className:"doc-tree-group-count"},u.nodes.length),E("span",{className:"doc-tree-caret"},i?"▾":"▸")),i?E("div",{className:"doc-tree-group-body"},u.nodes.map((_)=>E(tL,{key:_.id,record:_,depth:0,onSelect:l,selectedId:f}))):null)}function jc({records:u,onSelect:l,selectedId:f,activeGrouping:n}){if(!u.length)return E(Xf,{title:"暂无文书",text:"通过 CLI 上传文书后会显示在目录树中。"});let i=n==="type"?_c(u):$c(u);if(i.length===0)return E(Xf,{title:"暂无文书",text:"通过 CLI 上传文书后会显示在目录树中。"});return E("div",{className:"doc-type-tree","data-testid":"doc-type-tree"},n==="type"?i.map((y)=>E(rc,{key:y.type,group:y,onSelect:l,selectedId:f})):i.map((y)=>E(Ac,{key:y.tag,group:y,onSelect:l,selectedId:f})))}function Jc({record:u,onBack:l}){let f=u4(u);return E("div",{className:"doc-detail-header"},l?E("button",{type:"button",className:"ghost-btn compact",onClick:l,"data-testid":"doc-detail-back"},"← 返回"):null,f.docNo?E("span",{className:"doc-detail-docno","data-testid":"doc-detail-docno"},f.docNo):null,E("h2",{className:"doc-detail-title"},u.title||"--"),E("div",{className:"doc-detail-meta"},E("span",null,f.docType?`${f.docType} ${f.docTypeLabel}`:u.type||"--"),E(m0,{status:V_(f.priority||u.level)},f.priority||u.level||"none"),E(m0,{status:S3(u.status)},u.status||"--"),E("span",{className:"muted"},`更新 ${e8(u.updatedAt)}`)),u.source?E("a",{href:u.source,target:"_blank",rel:"noreferrer",className:"doc-detail-source"},`来源: ${u.source}`):null,Array.isArray(u.evidenceLinks)&&u.evidenceLinks.length>0?E("div",{className:"doc-detail-evidence"},u.evidenceLinks.slice(0,3).map((n)=>E("a",{key:n,href:n,target:"_blank",rel:"noreferrer"},A1(n,60)))):null)}function Qc({record:u}){return E("div",{className:"doc-viewer","data-testid":"doc-viewer"},E(L_,{markdown:u.body||u.summary||"",className:"doc-full-markdown"}))}function Uc({form:u,saving:l,onChange:f,onSubmit:n}){return E("form",{className:"doc-editor-form",onSubmit:n,"data-testid":"doc-editor"},E("label",null,"标题",E("input",{value:u.title||"",onChange:(i)=>f("title",i.target.value),placeholder:"文书标题","data-testid":"doc-title-input"})),E("label",null,"类型",E("select",{value:u.type||"decision",onChange:(i)=>f("type",i.target.value),"data-testid":"doc-type-input"},r1(V7.filter((i)=>i!=="all")))),E("label",null,"优先级",E("select",{value:u.level||"none",onChange:(i)=>f("level",i.target.value),"data-testid":"doc-level-input"},r1(B7.filter((i)=>i!=="all")))),E("label",null,"状态",E("select",{value:u.status||"active",onChange:(i)=>f("status",i.target.value),"data-testid":"doc-status-input"},r1(c7.filter((i)=>i!=="all")))),E("label",null,"Tags",E("input",{value:u.tags||"",onChange:(i)=>f("tags",i.target.value),placeholder:"逗号分隔","data-testid":"doc-tags-input"})),E("label",{className:"wide"},"正文",E("textarea",{value:u.body||"",onChange:(i)=>f("body",i.target.value),placeholder:"Markdown 正文","data-testid":"doc-body-editor"})),E("div",{className:"dispatch-actions"},E("button",{type:"submit",disabled:l||!String(u.title||"").trim(),"data-testid":"doc-save-button"},l?"保存中…":"保存")))}function Nc({record:u,onSelect:l,onSave:f,saving:n,error:i,saveMsg:y,onRaw:_}){let[$,r]=Lf("view"),[j,J]=Lf({});function Q(N){J(o8(N))}a8(()=>{if(u)Q(u)},[u?.id]);function U(N,L){J((w)=>({...w,[N]:L}))}async function F(N){N.preventDefault(),await f(j)}if(!u)return E("div",{className:"doc-sidebar empty","data-testid":"doc-sidebar-empty"},E(Xf,{title:"未选择文书",text:"从左侧目录树或列表选择文书查看全文。"}));return E("div",{className:"doc-sidebar","data-testid":"doc-sidebar"},E("div",{className:"doc-sidebar-head"},E("div",{className:"doc-sidebar-mode-tabs",role:"tablist"},E("button",{type:"button",className:$==="view"?"active":"",onClick:()=>{if(r("view"),u)Q(u)},"data-testid":"doc-mode-view"},"阅读"),E("button",{type:"button",className:$==="edit"?"active":"",onClick:()=>r("edit"),"data-testid":"doc-mode-edit"},"编辑")),E("div",{className:"inline-actions"},E(ii,{title:`Doc ${u.id}`,data:u,onOpen:_,testId:"doc-sidebar-raw"}))),$==="view"?E($1.default.Fragment,null,E(Jc,{record:u,onBack:l?()=>l(null):void 0}),E(Qc,{record:u})):E($1.default.Fragment,null,E(ul,{error:i,title:"保存失败"}),y?E("p",{className:"muted paragraph","data-testid":"doc-save-msg"},y):null,E(Uc,{form:j,saving:n,onChange:U,onSubmit:F})))}function Fc({records:u,selectedRecord:l,onSelect:f,onSave:n,saving:i,saveError:y,saveMsg:_,onRaw:$}){let[r,j]=Lf(!0),[J,Q]=Lf(!0),[U,F]=Lf("type");return E("div",{className:"doc-workspace","data-testid":"doc-workspace"},E("div",{className:`doc-workspace-left ${r?"open":"collapsed"}`},E("div",{className:"doc-workspace-left-head"},E("span",{className:"panel-eyebrow"},"目录树"),E("div",{className:"inline-actions"},E("button",{type:"button",className:`ghost-btn compact ${U==="type"?"active":""}`,onClick:()=>F("type"),"data-testid":"group-by-type"},"按文类"),E("button",{type:"button",className:`ghost-btn compact ${U==="tag"?"active":""}`,onClick:()=>F("tag"),"data-testid":"group-by-tag"},"按标签"),E("button",{type:"button",className:"ghost-btn compact",onClick:()=>j((N)=>!N),"data-testid":"toggle-left-panel"},r?"←":"→"))),r?E(jc,{records:u,onSelect:f,selectedId:l?.id,activeGrouping:U}):null),E("div",{className:"doc-workspace-center"},E("div",{className:"doc-record-list","data-testid":"doc-record-list"},u.length===0?E(Xf,{title:"暂无记录",text:"通过 CLI 上传文书后会显示在这里。"}):u.map((N)=>{let L=u4(N);return E("button",{key:N.id,type:"button",className:`doc-list-item ${l?.id===N.id?"selected":""}`,onClick:()=>f(N),"data-testid":`doc-list-item-${Kf(N.id)}`},E("span",{className:"doc-list-meta"},E("span",null,L.docType||N.type||"--"),E(m0,{status:V_(L.priority||N.level)},L.priority||N.level||"none")),E("span",{className:"doc-list-title"},A1(L.docNo?`${L.docNo} ${N.title||""}`:N.title||"--",60)),E("span",{className:"doc-list-summary"},A1(N.summary||N.body,100)))}))),E("div",{className:`doc-workspace-right ${J?"open":"collapsed"}`},E("div",{className:"doc-workspace-right-head"},E("button",{type:"button",className:"ghost-btn compact",onClick:()=>Q((N)=>!N),"data-testid":"toggle-right-panel"},J?"→":"←")),J?E(Nc,{record:l,onSelect:f,onSave:n,saving:i,error:y,saveMsg:_,onRaw:$}):null))}function z7(u){let l=w7.find((f)=>f.id===u)||w7[0];return{id:"",category:l?.id||"external-goal",type:l?.type||"goal",level:l?.level||"G0",status:l?.status||"active",title:"",body:"",linkedGoalId:"",source:"",issueId:"",parentGoalId:"",childGoalIds:"",tags:D3(l?.tags||[]),evidenceLinks:"",sourceSession:"frontend",taskId:"",commitId:""}}function o8(u){return{id:u?.id||"",category:"custom",type:u?.type||"meeting",level:u?.level||"none",status:u?.status||"active",title:u?.title||"",body:u?.body||u?.summary||"",linkedGoalId:u?.linkedGoalId||"",source:If(u,["source","sourceLabel","sourceFile"])||cn(u,"source"),issueId:If(u,["issueId","issue","githubIssue","githubIssueId","externalIssue"])||cn(u,"issue"),parentGoalId:If(u,["parentGoalId","parentId","parent"])||cn(u,"parent"),childGoalIds:D3([...cL(u,["childGoalIds","children","childIds"]),...d8(u,"child")]),tags:D3(u?.tags),evidenceLinks:D3(u?.evidenceLinks),sourceSession:u?.sourceSession||"frontend",taskId:u?.taskId||"",commitId:u?.commitId||""}}function TL(u){let l=ny(u.tags),f=[u.source?`source:${String(u.source).trim()}`:"",u.issueId?`issue:${String(u.issueId).trim()}`:"",u.parentGoalId?`parent:${String(u.parentGoalId).trim()}`:"",...ny(u.childGoalIds).map((n)=>`child:${n}`)].filter(Boolean);return{type:u.type,level:u.level,status:u.status,title:String(u.title||"").trim(),body:String(u.body||"").trim(),linkedGoalId:String(u.linkedGoalId||"").trim(),tags:[...new Set([...l,...f])],evidenceLinks:ny(u.evidenceLinks),sourceSession:String(u.source||u.sourceSession||"frontend").trim(),taskId:String(u.taskId||"").trim(),commitId:String(u.commitId||"").trim()}}function P3(u){let l=Array.isArray(u.tags)?u.tags.map((f)=>f.toLowerCase()):[];return u.type==="goal"&&u.status!=="blocked"&&u.status!=="parked"&&(u.level==="G0"||l.includes("external-goal"))}function l4(u){let l=Array.isArray(u.tags)?u.tags.map((f)=>f.toLowerCase()):[];return u.type==="goal"&&u.status!=="blocked"&&u.status!=="parked"&&!P3(u)&&(["G1","G2","G3"].includes(u.level)||l.includes("internal-goal"))}function DL(u){return If(u,["parentGoalId","parentId","parent"])||cn(u,"parent")||u?.linkedGoalId||""}function T7(u){return[...new Set([...cL(u,["childGoalIds","children","childIds"]),...d8(u,"child")])]}function SL(u,l){if(l==="external-goal")return P3(u);if(l==="internal-goal")return l4(u);if(l==="blocker")return u.type==="blocker"||u.status==="blocked";if(l==="parked")return u.status==="parked";if(l==="authority")return["decision","experiment","debt"].includes(u.type);return!0}function Y3(u){let l=u?.date||Bn();return{date:l,title:u?.title||`${l} 工作日记`,body:u?.body||"",sourceFile:u?.sourceFile||ni,tags:D3(u?.tags||["frontend"])}}function Wc(u){let l=String(u.date||Bn()).trim(),f=String(u.title||`${l} 工作日记`).trim(),n=String(u.body||"").trim(),i=n.split(` -`)[0]?.trim()||"";if(i===`# ${l}`||i.startsWith(`# ${l} `)||i===`# ${f}`)return n;return`# ${l} +${n}`.slice(0,1600)}function Y3(u,l){if(!l)return;if(!u.docNo)u.docNo=l.docNo;if(!u.docType)u.docType=l.docType;if(!u.priority)u.priority=l.priority;if(!u.year)u.year=l.year;if(!u.sequence)u.sequence=l.sequence}function z7(u){return u.docType&&u.priority&&u.year&&u.sequence?`DC-${u.docType}-${u.priority}-${u.year}-${u.sequence}`:""}function lA(u){let l={docNo:"",docType:"",docTypeLabel:"",priority:"",year:"",sequence:""};Y3(l,t3(vf(u,["docNo","documentNo","documentNumber","documentId"])));let f=E7(vf(u,["docType","documentType","documentKind"])),n=H7(vf(u,["priority","docPriority","documentPriority"])),y=O7(vf(u,["year","docYear","documentYear"])),i=T7(vf(u,["sequence","seq","docSequence","documentSequence"]));if(f)l.docType=f;if(n)l.priority=n;if(y)l.year=y;if(i)l.sequence=i;let _=z7(l);if(!l.docNo&&_)l.docNo=_;Y3(l,iX(u?.title)),Y3(l,t3(vf(u,["title","name"])));for(let j of e4(u,"doc-no"))Y3(l,t3(j));if(!l.docType)l.docType=E7(Yn(u,"doc-type"));if(!l.priority)l.priority=H7(Yn(u,"doc-priority"));if(!l.year)l.year=O7(Yn(u,"doc-year"));if(!l.sequence)l.sequence=T7(Yn(u,"doc-sequence"));let $=z7(l);if(!l.docNo&&$)l.docNo=$;Y3(l,t3(_X(u)));let A=z7(l);if(!l.docNo&&A)l.docNo=A;return l.docTypeLabel=l.docType?BL[l.docType]:"",l}function $X(u){let l=new Map;for(let f of TL)l.set(f,[]);for(let f of u){let n=lA(f).docType||"DCSN";l.get(n).push(f)}return TL.map((f)=>({type:f,label:BL[f],nodes:l.get(f)||[]})).filter((f)=>f.nodes.length>0)}function AX(u){let l=new Map,f=["thesis","external-demand","D518"];for(let n of u){let i=(Array.isArray(n?.tags)?n.tags:[]).filter((_)=>{let $=String(_||"").toLowerCase();return f.some((A)=>$.includes(A))||/^doc-type:/.test($)});if(i.length===0)i.push("未分类");for(let _ of i){let $=l.get(String(_))||[];$.push(n),l.set(String(_),$)}}return[...l.entries()].map(([n,y])=>({tag:n,nodes:y})).sort((n,y)=>{let i=f.findIndex(($)=>n.tag.toLowerCase().includes($)),_=f.findIndex(($)=>y.tag.toLowerCase().includes($));if(i!==_)return(i===-1?99:i)-(_===-1?99:_);return n.tag.localeCompare(y.tag)})}function tL({record:u,depth:l,onSelect:f,selectedId:n}){let y=lA(u),i=y.docNo?`${y.docNo} ${u.title||""}`:u.title||u.id||"--";return E("div",{className:`doc-tree-node depth-${Math.min(l,3)}`},E("button",{type:"button",className:`doc-tree-item ${n===u.id?"selected":""}`,onClick:()=>f(u),"data-testid":`doc-tree-item-${zf(u.id)}`},E("span",{className:"doc-tree-meta"},y.docType||u.type||"--"),E("span",{className:"doc-tree-label"},j1(i,80))))}function rX({group:u,onSelect:l,selectedId:f,defaultOpen:n}){let[y,i]=Kf(n!==!1);return E("div",{className:"doc-tree-group","data-testid":`doc-tree-group-${u.type}`},E("button",{type:"button",className:`doc-tree-group-head ${y?"open":""}`,onClick:()=>i((_)=>!_),"data-testid":`doc-tree-group-toggle-${u.type}`},E("span",{className:"doc-tree-group-label"},u.label),E("span",{className:"doc-tree-group-count"},u.nodes.length),E("span",{className:"doc-tree-caret"},y?"▾":"▸")),y?E("div",{className:"doc-tree-group-body"},u.nodes.map((_)=>E(tL,{key:_.id,record:_,depth:0,onSelect:l,selectedId:f}))):null)}function jX({group:u,onSelect:l,selectedId:f,defaultOpen:n}){let[y,i]=Kf(n!==!1);return E("div",{className:"doc-tree-group","data-testid":`tag-tree-group-${zf(u.tag)}`},E("button",{type:"button",className:`doc-tree-group-head ${y?"open":""}`,onClick:()=>i((_)=>!_),"data-testid":`tag-tree-group-toggle-${zf(u.tag)}`},E("span",{className:"doc-tree-group-label"},u.tag),E("span",{className:"doc-tree-group-count"},u.nodes.length),E("span",{className:"doc-tree-caret"},y?"▾":"▸")),y?E("div",{className:"doc-tree-group-body"},u.nodes.map((_)=>E(tL,{key:_.id,record:_,depth:0,onSelect:l,selectedId:f}))):null)}function JX({records:u,onSelect:l,selectedId:f,activeGrouping:n}){if(!u.length)return E(Yf,{title:"暂无文书",text:"通过 CLI 上传文书后会显示在目录树中。"});let y=n==="type"?$X(u):AX(u);if(y.length===0)return E(Yf,{title:"暂无文书",text:"通过 CLI 上传文书后会显示在目录树中。"});return E("div",{className:"doc-type-tree","data-testid":"doc-type-tree"},n==="type"?y.map((i)=>E(rX,{key:i.type,group:i,onSelect:l,selectedId:f})):y.map((i)=>E(jX,{key:i.tag,group:i,onSelect:l,selectedId:f})))}function QX({record:u,onBack:l}){let f=lA(u);return E("div",{className:"doc-detail-header"},l?E("button",{type:"button",className:"ghost-btn compact",onClick:l,"data-testid":"doc-detail-back"},"← 返回"):null,f.docNo?E("span",{className:"doc-detail-docno","data-testid":"doc-detail-docno"},f.docNo):null,E("h2",{className:"doc-detail-title"},u.title||"--"),E("div",{className:"doc-detail-meta"},E("span",null,f.docType?`${f.docType} ${f.docTypeLabel}`:u.type||"--"),E(R0,{status:B_(f.priority||u.level)},f.priority||u.level||"none"),E(R0,{status:P3(u.status)},u.status||"--"),E("span",{className:"muted"},`更新 ${uA(u.updatedAt)}`)),u.source?E("a",{href:u.source,target:"_blank",rel:"noreferrer",className:"doc-detail-source"},`来源: ${u.source}`):null,Array.isArray(u.evidenceLinks)&&u.evidenceLinks.length>0?E("div",{className:"doc-detail-evidence"},u.evidenceLinks.slice(0,3).map((n)=>E("a",{key:n,href:n,target:"_blank",rel:"noreferrer"},j1(n,60)))):null)}function UX({record:u}){return E("div",{className:"doc-viewer","data-testid":"doc-viewer"},E(K_,{markdown:u.body||u.summary||"",className:"doc-full-markdown"}))}function NX({form:u,saving:l,onChange:f,onSubmit:n}){return E("form",{className:"doc-editor-form",onSubmit:n,"data-testid":"doc-editor"},E("label",null,"标题",E("input",{value:u.title||"",onChange:(y)=>f("title",y.target.value),placeholder:"文书标题","data-testid":"doc-title-input"})),E("label",null,"类型",E("select",{value:u.type||"decision",onChange:(y)=>f("type",y.target.value),"data-testid":"doc-type-input"},r1(B7.filter((y)=>y!=="all")))),E("label",null,"优先级",E("select",{value:u.level||"none",onChange:(y)=>f("level",y.target.value),"data-testid":"doc-level-input"},r1(X7.filter((y)=>y!=="all")))),E("label",null,"状态",E("select",{value:u.status||"active",onChange:(y)=>f("status",y.target.value),"data-testid":"doc-status-input"},r1(c7.filter((y)=>y!=="all")))),E("label",null,"Tags",E("input",{value:u.tags||"",onChange:(y)=>f("tags",y.target.value),placeholder:"逗号分隔","data-testid":"doc-tags-input"})),E("label",{className:"wide"},"正文",E("textarea",{value:u.body||"",onChange:(y)=>f("body",y.target.value),placeholder:"Markdown 正文","data-testid":"doc-body-editor"})),E("div",{className:"dispatch-actions"},E("button",{type:"submit",disabled:l||!String(u.title||"").trim(),"data-testid":"doc-save-button"},l?"保存中…":"保存")))}function FX({record:u,onSelect:l,onSave:f,saving:n,error:y,saveMsg:i,onRaw:_}){let[$,A]=Kf("view"),[j,J]=Kf({});function Q(N){J(d4(N))}o4(()=>{if(u)Q(u)},[u?.id]);function U(N,K){J((G)=>({...G,[N]:K}))}async function F(N){N.preventDefault(),await f(j)}if(!u)return E("div",{className:"doc-sidebar empty","data-testid":"doc-sidebar-empty"},E(Yf,{title:"未选择文书",text:"从左侧目录树或列表选择文书查看全文。"}));return E("div",{className:"doc-sidebar","data-testid":"doc-sidebar"},E("div",{className:"doc-sidebar-head"},E("div",{className:"doc-sidebar-mode-tabs",role:"tablist"},E("button",{type:"button",className:$==="view"?"active":"",onClick:()=>{if(A("view"),u)Q(u)},"data-testid":"doc-mode-view"},"阅读"),E("button",{type:"button",className:$==="edit"?"active":"",onClick:()=>A("edit"),"data-testid":"doc-mode-edit"},"编辑")),E("div",{className:"inline-actions"},E(yy,{title:`Doc ${u.id}`,data:u,onOpen:_,testId:"doc-sidebar-raw"}))),$==="view"?E(A1.default.Fragment,null,E(QX,{record:u,onBack:l?()=>l(null):void 0}),E(UX,{record:u})):E(A1.default.Fragment,null,E(ul,{error:y,title:"保存失败"}),i?E("p",{className:"muted paragraph","data-testid":"doc-save-msg"},i):null,E(NX,{form:j,saving:n,onChange:U,onSubmit:F})))}function WX({records:u,selectedRecord:l,onSelect:f,onSave:n,saving:y,saveError:i,saveMsg:_,onRaw:$}){let[A,j]=Kf(!0),[J,Q]=Kf(!0),[U,F]=Kf("type");return E("div",{className:"doc-workspace","data-testid":"doc-workspace"},E("div",{className:`doc-workspace-left ${A?"open":"collapsed"}`},E("div",{className:"doc-workspace-left-head"},E("span",{className:"panel-eyebrow"},"目录树"),E("div",{className:"inline-actions"},E("button",{type:"button",className:`ghost-btn compact ${U==="type"?"active":""}`,onClick:()=>F("type"),"data-testid":"group-by-type"},"按文类"),E("button",{type:"button",className:`ghost-btn compact ${U==="tag"?"active":""}`,onClick:()=>F("tag"),"data-testid":"group-by-tag"},"按标签"),E("button",{type:"button",className:"ghost-btn compact",onClick:()=>j((N)=>!N),"data-testid":"toggle-left-panel"},A?"←":"→"))),A?E(JX,{records:u,onSelect:f,selectedId:l?.id,activeGrouping:U}):null),E("div",{className:"doc-workspace-center"},E("div",{className:"doc-record-list","data-testid":"doc-record-list"},u.length===0?E(Yf,{title:"暂无记录",text:"通过 CLI 上传文书后会显示在这里。"}):u.map((N)=>{let K=lA(N);return E("button",{key:N.id,type:"button",className:`doc-list-item ${l?.id===N.id?"selected":""}`,onClick:()=>f(N),"data-testid":`doc-record-item-${zf(N.id)}`},E("span",{className:"doc-list-meta"},E("span",null,K.docType||N.type||"--"),E(R0,{status:B_(K.priority||N.level)},K.priority||N.level||"none")),E("span",{className:"doc-list-title"},j1(K.docNo?`${K.docNo} ${N.title||""}`:N.title||"--",60)),E("span",{className:"doc-list-summary"},j1(N.summary||N.body,100)))}))),E("div",{className:`doc-workspace-right ${J?"open":"collapsed"}`},E("div",{className:"doc-workspace-right-head"},E("button",{type:"button",className:"ghost-btn compact",onClick:()=>Q((N)=>!N),"data-testid":"toggle-right-panel"},J?"→":"←")),J?E(FX,{record:l,onSelect:f,onSave:n,saving:y,error:i,saveMsg:_,onRaw:$}):null))}function G7(u){let l=Z7.find((f)=>f.id===u)||Z7[0];return{id:"",category:l?.id||"external-goal",type:l?.type||"goal",level:l?.level||"G0",status:l?.status||"active",title:"",body:"",linkedGoalId:"",source:"",issueId:"",parentGoalId:"",childGoalIds:"",tags:S3(l?.tags||[]),evidenceLinks:"",sourceSession:"frontend",taskId:"",commitId:""}}function d4(u){return{id:u?.id||"",category:"custom",type:u?.type||"meeting",level:u?.level||"none",status:u?.status||"active",title:u?.title||"",body:u?.body||u?.summary||"",linkedGoalId:u?.linkedGoalId||"",source:vf(u,["source","sourceLabel","sourceFile"])||Yn(u,"source"),issueId:vf(u,["issueId","issue","githubIssue","githubIssueId","externalIssue"])||Yn(u,"issue"),parentGoalId:vf(u,["parentGoalId","parentId","parent"])||Yn(u,"parent"),childGoalIds:S3([...cL(u,["childGoalIds","children","childIds"]),...e4(u,"child")]),tags:S3(u?.tags),evidenceLinks:S3(u?.evidenceLinks),sourceSession:u?.sourceSession||"frontend",taskId:u?.taskId||"",commitId:u?.commitId||""}}function VL(u){let l=yi(u.tags),f=[u.source?`source:${String(u.source).trim()}`:"",u.issueId?`issue:${String(u.issueId).trim()}`:"",u.parentGoalId?`parent:${String(u.parentGoalId).trim()}`:"",...yi(u.childGoalIds).map((n)=>`child:${n}`)].filter(Boolean);return{type:u.type,level:u.level,status:u.status,title:String(u.title||"").trim(),body:String(u.body||"").trim(),linkedGoalId:String(u.linkedGoalId||"").trim(),tags:[...new Set([...l,...f])],evidenceLinks:yi(u.evidenceLinks),sourceSession:String(u.source||u.sourceSession||"frontend").trim(),taskId:String(u.taskId||"").trim(),commitId:String(u.commitId||"").trim()}}function M3(u){let l=Array.isArray(u.tags)?u.tags.map((f)=>f.toLowerCase()):[];return u.type==="goal"&&u.status!=="blocked"&&u.status!=="parked"&&(u.level==="G0"||l.includes("external-goal"))}function fA(u){let l=Array.isArray(u.tags)?u.tags.map((f)=>f.toLowerCase()):[];return u.type==="goal"&&u.status!=="blocked"&&u.status!=="parked"&&!M3(u)&&(["G1","G2","G3"].includes(u.level)||l.includes("internal-goal"))}function SL(u){return vf(u,["parentGoalId","parentId","parent"])||Yn(u,"parent")||u?.linkedGoalId||""}function V7(u){return[...new Set([...cL(u,["childGoalIds","children","childIds"]),...e4(u,"child")])]}function PL(u,l){if(l==="external-goal")return M3(u);if(l==="internal-goal")return fA(u);if(l==="blocker")return u.type==="blocker"||u.status==="blocked";if(l==="parked")return u.status==="parked";if(l==="authority")return["decision","experiment","debt"].includes(u.type);return!0}function D3(u){let l=u?.date||cn();return{date:l,title:u?.title||`${l} 工作日记`,body:u?.body||"",sourceFile:u?.sourceFile||ny,tags:S3(u?.tags||["frontend"])}}function qX(u){let l=String(u.date||cn()).trim(),f=String(u.title||`${l} 工作日记`).trim(),n=String(u.body||"").trim(),y=n.split(` +`)[0]?.trim()||"";if(y===`# ${l}`||y.startsWith(`# ${l} `)||y===`# ${f}`)return n;return`# ${l} ${n||`## ${f} -`}`.trim()}function qc(u){let l=String(u.date||Bn()).trim(),f=String(u.body||"").trim()||`# ${l} +`}`.trim()}function LX(u){let l=String(u.date||cn()).trim(),f=String(u.body||"").trim()||`# ${l} -`;return{title:String(u.title||`${l} 工作日记`).trim(),body:f,sourceFile:String(u.sourceFile||ni).trim()||ni,tags:ny(u.tags)}}function G7(u,l){if(H8(u)){let f=u.meta.status?`HTTP ${u.meta.status}`:u.meta.kind;return`${l}(${f}):${u.message||"后端接口暂不可用"}`}return cu(u,l)}function fy({record:u,onRaw:l,compact:f,onEdit:n}){let i=XL(u),y=Array.isArray(u.evidenceLinks)?u.evidenceLinks:[],_=Y7(u),$=X7(u),r=DL(u),j=T7(u);return E("article",{className:`decision-record-card ${f?"compact":""}`,"data-testid":`decision-record-${Kf(u.id)}`},E("div",{className:"decision-record-head"},E("div",null,E("div",{className:"decision-record-meta"},E("span",null,u.type||"--"),E(m0,{status:V_(u.level)},u.level||"none"),E(m0,{status:S3(u.status)},u.status||"--")),E("strong",null,u.title||"--")),E("div",{className:"inline-actions"},n?E("button",{type:"button",className:"ghost-btn",onClick:()=>n(u),"data-testid":`edit-record-${Kf(u.id)}`},"编辑"):null,E(ii,{title:`Decision ${u.id}`,data:u,onOpen:l,testId:`raw-record-${Kf(u.id)}`}))),E("div",{className:"decision-record-links","data-testid":`decision-record-links-${Kf(u.id)}`},E("span",null,`source:${$}`),_?E("span",null,_):null,r?E("span",null,`parent:${r}`):null,j.length>0?E("span",null,`children:${j.slice(0,4).join(",")}`):null),f?E("p",{className:"decision-summary"},A1(u.summary||u.body)):E(L_,{markdown:u.body||u.summary||"",className:"decision-markdown"}),E("div",{className:"decision-record-foot"},u.linkedGoalId?E("code",null,`goal:${u.linkedGoalId}`):null,u.taskId?E("code",null,`task:${u.taskId}`):null,u.commitId?E("code",null,u.commitId.slice(0,12)):null,E("span",null,e8(u.updatedAt))),i.length>0?E("div",{className:"decision-tags"},i.slice(0,8).map((J)=>E("span",{key:J},J))):null,y.length>0?E("div",{className:"decision-evidence"},y.slice(0,4).map((J)=>E("a",{key:J,href:J,target:"_blank",rel:"noreferrer"},A1(J,58)))):null)}function Lc({records:u,onRaw:l,onEdit:f}){if(!u.length)return E(Xf,{title:"暂无记录",text:"通过 CLI 上传会议记录或决议后会显示在这里。"});return E("div",{className:"table-wrap"},E("table",{className:"decision-table","data-testid":"decision-center-record-table"},E("thead",null,E("tr",null,E("th",null,"等级"),E("th",null,"状态"),E("th",null,"类型"),E("th",null,"标题"),E("th",null,"摘要"),E("th",null,"证据"),E("th",null,"更新"),E("th",null,"操作"))),E("tbody",null,u.map((n)=>E("tr",{key:n.id},E("td",null,E(m0,{status:V_(n.level)},n.level||"none")),E("td",null,E(m0,{status:S3(n.status)},n.status||"--")),E("td",null,n.type||"--"),E("td",null,E("strong",null,n.title||"--"),n.linkedGoalId?E("code",null,n.linkedGoalId):null,E("span",{className:"muted block"},Y7(n)||X7(n))),E("td",null,A1(n.summary||n.body,180)),E("td",null,Array.isArray(n.evidenceLinks)?n.evidenceLinks.length:0),E("td",null,e8(n.updatedAt)),E("td",null,E("div",{className:"inline-actions"},f?E("button",{type:"button",className:"ghost-btn",onClick:()=>f(n),"data-testid":`table-edit-record-${Kf(n.id)}`},"编辑"):null,E(ii,{title:`Decision ${n.id}`,data:n,onOpen:l,testId:`table-raw-record-${Kf(n.id)}`}))))))))}function r1(u){return u.map((l)=>E("option",{key:l,value:l},l))}function Kc(u){let l=new URLSearchParams;if(u.type!=="all")l.set("type",u.type);if(u.status!=="all")l.set("status",u.status);if(u.level!=="all")l.set("level",u.level);if(u.linkedGoalId.trim())l.set("linkedGoalId",u.linkedGoalId.trim());return l.set("limit","240"),l.toString()}function zc(u){let l=new URLSearchParams;if(u.month!=="all")l.set("month",u.month);if(u.from.trim())l.set("from",u.from.trim());if(u.to.trim())l.set("to",u.to.trim());return l.set("limit","180"),l.toString()}function Gc(u){let l=u?.id||u?.date,f=new URLSearchParams;if(u?.sourceFile)f.set("sourceFile",String(u.sourceFile));let n=f.toString();return`/api/diary/entries/${encodeURIComponent(l)}${n?`?${n}`:""}`}function wc({entry:u,selected:l,onSelect:f,onRaw:n}){return E("article",{className:`diary-entry-card ${l?"selected":""}`,"data-testid":`diary-entry-${Kf(u.date||u.id)}`},E("button",{type:"button",className:"diary-entry-main",onClick:()=>f(u)},E("span",{className:"diary-date"},u.date||"--"),E("strong",null,u.title||u.markdownPath||"--"),E("span",null,A1(u.summary||u.body,180))),E("div",{className:"decision-record-foot"},E("code",null,u.markdownPath||"--"),E("span",null,e8(u.updatedAt||u.importedAt)),E(ii,{title:`Diary ${u.date||u.id}`,data:u,onOpen:n,testId:`raw-diary-entry-${Kf(u.date||u.id)}`})))}function Zc({records:u,onEdit:l,onRaw:f}){let n=u.filter(($)=>$.type==="goal"),i=n.filter(l4),y=new Map;for(let $ of i){let r=DL($);if(!r)continue;let j=y.get(r)||[];j.push($),y.set(r,j)}let _=n.filter(P3);if(_.length===0)return E(Xf,{title:"暂无拆解关系",text:"创建 G0 外部目标后,可用 Linked Goal 或 parent 标签把内部目标关联上去。"});return E("div",{className:"goal-breakdown","data-testid":"goal-breakdown"},_.slice(0,12).map(($)=>{let r=T7($),j=[...y.get($.id)||[],...i.filter((Q)=>r.includes(Q.id))].filter((Q,U,F)=>F.findIndex((N)=>N.id===Q.id)===U),J=u.filter((Q)=>(Q.type==="blocker"||Q.status==="blocked")&&(Q.linkedGoalId===$.id||T7(Q).includes($.id)));return E("article",{key:$.id,className:"goal-breakdown-item","data-testid":`goal-breakdown-${Kf($.id)}`},E("div",{className:"goal-breakdown-head"},E("div",null,E("div",{className:"decision-record-meta"},E("span",null,"external"),E(m0,{status:V_($.level)},$.level||"G0"),E(m0,{status:S3($.status)},$.status||"--")),E("strong",null,$.title||$.id),E("span",{className:"muted block"},Y7($)||X7($))),E("div",{className:"inline-actions"},E("button",{type:"button",className:"ghost-btn",onClick:()=>l($),"data-testid":`goal-breakdown-edit-${Kf($.id)}`},"编辑"),E(ii,{title:`Goal ${$.id}`,data:$,onOpen:f,testId:`goal-breakdown-raw-${Kf($.id)}`}))),E("div",{className:"goal-breakdown-body"},E("div",{className:"goal-child-list"},E("span",{className:"panel-eyebrow"},`内部目标 ${j.length}`),j.length===0?E("span",{className:"muted"},"尚未拆解"):j.slice(0,6).map((Q)=>E("button",{key:Q.id,type:"button",onClick:()=>l(Q),"data-testid":`goal-child-${Kf(Q.id)}`},E(m0,{status:V_(Q.level)},Q.level),E("span",null,Q.title||Q.id)))),E("div",{className:"goal-child-list"},E("span",{className:"panel-eyebrow"},`阻塞 ${J.length}`),J.length===0?E("span",{className:"muted"},"无阻塞"):J.slice(0,4).map((Q)=>E("button",{key:Q.id,type:"button",onClick:()=>l(Q),"data-testid":`goal-blocker-${Kf(Q.id)}`},E(m0,{status:S3(Q.status)},Q.status),E("span",null,Q.title||Q.id))))))}))}function Ec({month:u,entries:l,selectedDate:f,today:n,onPickDate:i,onOpenToday:y}){let _=new Map(l.map(($)=>[$.date,$]));return E("div",{className:"diary-calendar","data-testid":"diary-calendar"},E("div",{className:"diary-calendar-head"},E("strong",null,u||"--"),E("button",{type:"button",className:"ghost-btn compact",onClick:y,"data-testid":"diary-calendar-today"},"今天")),E("div",{className:"diary-calendar-week"},vB.map(($)=>E("span",{key:$},$))),E("div",{className:"diary-calendar-grid"},nc(u).map(($,r)=>{if(!$)return E("span",{key:`empty-${r}`,className:"diary-day empty"});let j=_.get($),J=["diary-day",j?"has-entry":"",f===$?"selected":"",n===$?"today":""].filter(Boolean).join(" ");return E("button",{key:$,type:"button",className:J,onClick:()=>i($,j),"data-testid":`diary-calendar-day-${$}`},E("span",null,$.slice(8)),j?E("i",null,A1(j.title||j.summary,24)):null)})))}function Hc({records:u,activeView:l,onView:f,onEdit:n,onRaw:i}){let y=[{id:"external-goal",title:"外部目标",eyebrow:"G0 / user-facing",records:u.filter(P3)},{id:"internal-goal",title:"内部目标",eyebrow:"G1-G3 / delivery",records:u.filter(l4)},{id:"blocker",title:"阻塞",eyebrow:"P0-P1 / blocked",records:u.filter((_)=>_.type==="blocker"||_.status==="blocked")},{id:"parked",title:"停放事项",eyebrow:"Parked",records:u.filter((_)=>_.status==="parked")},{id:"authority",title:"决议/实验/债务",eyebrow:"Decision / Experiment / Debt",records:u.filter((_)=>["decision","experiment","debt"].includes(_.type))}];return E("div",{className:"requirement-workspace","data-testid":"requirement-workspace"},E("div",{className:"requirement-switcher",role:"tablist","aria-label":"需求视图"},dB.map((_)=>E("button",{key:_.id,type:"button",className:l===_.id?"active":"",onClick:()=>f(_.id),"data-testid":`requirement-filter-${_.id}`},_.label))),E("div",{className:"requirement-lanes"},y.map((_)=>{let $=_.records.filter((r)=>SL(r,l)).slice(0,10);return E("section",{key:_.id,className:"requirement-lane","data-testid":`requirement-lane-${_.id}`},E("div",{className:"requirement-lane-head"},E("div",null,E("p",{className:"panel-eyebrow"},_.eyebrow),E("strong",null,_.title)),E(m0,{status:_.records.length>0?"unknown":"warn"},_.records.length)),$.length===0?E(Xf,{title:"暂无条目",text:"用右侧录入台补齐该类需求或筛选条件。"}):E("div",{className:"decision-card-list"},$.map((r)=>E(fy,{key:r.id,record:r,onRaw:i,onEdit:n,compact:!0}))))})))}function Oc({form:u,saving:l,message:f,error:n,onChange:i,onCategory:y,onSubmit:_,onReset:$}){return E("form",{className:"record-editor-form",onSubmit:_,"data-testid":"record-editor"},E("div",{className:"editor-mode-grid"},w7.map((r)=>E("button",{key:r.id,type:"button",className:u.category===r.id?"active":"",onClick:()=>y(r.id),"data-testid":`record-template-${r.id}`},r.label))),E("div",{className:"decision-form-grid"},E("label",null,"标题",E("input",{value:u.title,onChange:(r)=>i("title",r.target.value),placeholder:"需求、阻塞、决议或实验标题","data-testid":"record-title-input"})),E("label",null,"类型",E("select",{value:u.type,onChange:(r)=>i("type",r.target.value),"data-testid":"record-type-select"},r1(V7.filter((r)=>r!=="all")))),E("label",null,"等级",E("select",{value:u.level,onChange:(r)=>i("level",r.target.value),"data-testid":"record-level-select"},r1(B7.filter((r)=>r!=="all")))),E("label",null,"状态",E("select",{value:u.status,onChange:(r)=>i("status",r.target.value),"data-testid":"record-status-select"},r1(c7.filter((r)=>r!=="all")))),E("label",null,"Linked Goal",E("input",{value:u.linkedGoalId,onChange:(r)=>i("linkedGoalId",r.target.value),placeholder:"关联目标 id"})),E("label",null,"Tags",E("input",{value:u.tags,onChange:(r)=>i("tags",r.target.value),placeholder:"external-goal, requirement"})),E("label",null,"来源",E("input",{value:u.source,onChange:(r)=>i("source",r.target.value),placeholder:"issue / customer / commander","data-testid":"record-source-input"})),E("label",null,"Issue",E("input",{value:u.issueId,onChange:(r)=>i("issueId",r.target.value),placeholder:"#22 或 URL","data-testid":"record-issue-input"})),E("label",null,"父目标",E("input",{value:u.parentGoalId,onChange:(r)=>i("parentGoalId",r.target.value),placeholder:"外部目标 id","data-testid":"record-parent-goal-input"})),E("label",null,"子目标",E("input",{value:u.childGoalIds,onChange:(r)=>i("childGoalIds",r.target.value),placeholder:"逗号分隔 id","data-testid":"record-child-goals-input"})),E("label",{className:"wide"},"正文 Markdown",E("textarea",{value:u.body,onChange:(r)=>i("body",r.target.value),placeholder:`- 背景 +`;return{title:String(u.title||`${l} 工作日记`).trim(),body:f,sourceFile:String(u.sourceFile||ny).trim()||ny,tags:yi(u.tags)}}function w7(u,l){if(O4(u)){let f=u.meta.status?`HTTP ${u.meta.status}`:u.meta.kind;return`${l}(${f}):${u.message||"后端接口暂不可用"}`}return Xu(u,l)}function ni({record:u,onRaw:l,compact:f,onEdit:n}){let y=YL(u),i=Array.isArray(u.evidenceLinks)?u.evidenceLinks:[],_=D7(u),$=Y7(u),A=SL(u),j=V7(u);return E("article",{className:`decision-record-card ${f?"compact":""}`,"data-testid":`decision-record-${zf(u.id)}`},E("div",{className:"decision-record-head"},E("div",null,E("div",{className:"decision-record-meta"},E("span",null,u.type||"--"),E(R0,{status:B_(u.level)},u.level||"none"),E(R0,{status:P3(u.status)},u.status||"--")),E("strong",null,u.title||"--")),E("div",{className:"inline-actions"},n?E("button",{type:"button",className:"ghost-btn",onClick:()=>n(u),"data-testid":`edit-record-${zf(u.id)}`},"编辑"):null,E(yy,{title:`Decision ${u.id}`,data:u,onOpen:l,testId:`raw-record-${zf(u.id)}`}))),E("div",{className:"decision-record-links","data-testid":`decision-record-links-${zf(u.id)}`},E("span",null,`source:${$}`),_?E("span",null,_):null,A?E("span",null,`parent:${A}`):null,j.length>0?E("span",null,`children:${j.slice(0,4).join(",")}`):null),f?E("p",{className:"decision-summary"},j1(u.summary||u.body)):E(K_,{markdown:u.body||u.summary||"",className:"decision-markdown"}),E("div",{className:"decision-record-foot"},u.linkedGoalId?E("code",null,`goal:${u.linkedGoalId}`):null,u.taskId?E("code",null,`task:${u.taskId}`):null,u.commitId?E("code",null,u.commitId.slice(0,12)):null,E("span",null,uA(u.updatedAt))),y.length>0?E("div",{className:"decision-tags"},y.slice(0,8).map((J)=>E("span",{key:J},J))):null,i.length>0?E("div",{className:"decision-evidence"},i.slice(0,4).map((J)=>E("a",{key:J,href:J,target:"_blank",rel:"noreferrer"},j1(J,58)))):null)}function KX({records:u,onRaw:l,onEdit:f}){if(!u.length)return E(Yf,{title:"暂无记录",text:"通过 CLI 上传会议记录或决议后会显示在这里。","data-testid":"decision-record-table-empty"});return E("div",{className:"table-wrap"},E("table",{className:"decision-table","data-testid":"decision-center-record-table"},E("thead",null,E("tr",null,E("th",null,"等级"),E("th",null,"状态"),E("th",null,"类型"),E("th",null,"标题"),E("th",null,"摘要"),E("th",null,"证据"),E("th",null,"更新"),E("th",null,"操作"))),E("tbody",null,u.map((n)=>E("tr",{key:n.id},E("td",null,E(R0,{status:B_(n.level)},n.level||"none")),E("td",null,E(R0,{status:P3(n.status)},n.status||"--")),E("td",null,n.type||"--"),E("td",null,E("strong",null,n.title||"--"),n.linkedGoalId?E("code",null,n.linkedGoalId):null,E("span",{className:"muted block"},D7(n)||Y7(n))),E("td",null,j1(n.summary||n.body,180)),E("td",null,Array.isArray(n.evidenceLinks)?n.evidenceLinks.length:0),E("td",null,uA(n.updatedAt)),E("td",null,E("div",{className:"inline-actions"},f?E("button",{type:"button",className:"ghost-btn",onClick:()=>f(n),"data-testid":`table-edit-record-${zf(n.id)}`},"编辑"):null,E(yy,{title:`Decision ${n.id}`,data:n,onOpen:l,testId:`table-raw-record-${zf(n.id)}`}))))))))}function r1(u){return u.map((l)=>E("option",{key:l,value:l},l))}function zX(u){let l=new URLSearchParams;if(u.type!=="all")l.set("type",u.type);if(u.status!=="all")l.set("status",u.status);if(u.level!=="all")l.set("level",u.level);if(u.linkedGoalId.trim())l.set("linkedGoalId",u.linkedGoalId.trim());return l.set("limit","240"),l.toString()}function GX(u){let l=new URLSearchParams;if(u.month!=="all")l.set("month",u.month);if(u.from.trim())l.set("from",u.from.trim());if(u.to.trim())l.set("to",u.to.trim());return l.set("limit","180"),l.toString()}function wX(u){let l=u?.id||u?.date,f=new URLSearchParams;if(u?.sourceFile)f.set("sourceFile",String(u.sourceFile));let n=f.toString();return`/api/diary/entries/${encodeURIComponent(l)}${n?`?${n}`:""}`}function ZX({entry:u,selected:l,onSelect:f,onRaw:n}){return E("article",{className:`diary-entry-card ${l?"selected":""}`,"data-testid":`diary-entry-${zf(u.date||u.id)}`},E("button",{type:"button",className:"diary-entry-main",onClick:()=>f(u)},E("span",{className:"diary-date"},u.date||"--"),E("strong",null,u.title||u.markdownPath||"--"),E("span",null,j1(u.summary||u.body,180))),E("div",{className:"decision-record-foot"},E("code",null,u.markdownPath||"--"),E("span",null,uA(u.updatedAt||u.importedAt)),E(yy,{title:`Diary ${u.date||u.id}`,data:u,onOpen:n,testId:`raw-diary-entry-${zf(u.date||u.id)}`})))}function EX({records:u,onEdit:l,onRaw:f}){let n=u.filter(($)=>$.type==="goal"),y=n.filter(fA),i=new Map;for(let $ of y){let A=SL($);if(!A)continue;let j=i.get(A)||[];j.push($),i.set(A,j)}let _=n.filter(M3);if(_.length===0)return E(Yf,{title:"暂无拆解关系",text:"创建 G0 外部目标后,可用 Linked Goal 或 parent 标签把内部目标关联上去。","data-testid":"goal-breakdown-empty"});return E("div",{className:"goal-breakdown","data-testid":"goal-breakdown"},_.slice(0,12).map(($)=>{let A=V7($),j=[...i.get($.id)||[],...y.filter((Q)=>A.includes(Q.id))].filter((Q,U,F)=>F.findIndex((N)=>N.id===Q.id)===U),J=u.filter((Q)=>(Q.type==="blocker"||Q.status==="blocked")&&(Q.linkedGoalId===$.id||V7(Q).includes($.id)));return E("article",{key:$.id,className:"goal-breakdown-item","data-testid":`goal-breakdown-${zf($.id)}`},E("div",{className:"goal-breakdown-head"},E("div",null,E("div",{className:"decision-record-meta"},E("span",null,"external"),E(R0,{status:B_($.level)},$.level||"G0"),E(R0,{status:P3($.status)},$.status||"--")),E("strong",null,$.title||$.id),E("span",{className:"muted block"},D7($)||Y7($))),E("div",{className:"inline-actions"},E("button",{type:"button",className:"ghost-btn",onClick:()=>l($),"data-testid":`goal-breakdown-edit-${zf($.id)}`},"编辑"),E(yy,{title:`Goal ${$.id}`,data:$,onOpen:f,testId:`goal-breakdown-raw-${zf($.id)}`}))),E("div",{className:"goal-breakdown-body"},E("div",{className:"goal-child-list"},E("span",{className:"panel-eyebrow"},`内部目标 ${j.length}`),j.length===0?E("span",{className:"muted"},"尚未拆解"):j.slice(0,6).map((Q)=>E("button",{key:Q.id,type:"button",onClick:()=>l(Q),"data-testid":`goal-child-${zf(Q.id)}`},E(R0,{status:B_(Q.level)},Q.level),E("span",null,Q.title||Q.id)))),E("div",{className:"goal-child-list"},E("span",{className:"panel-eyebrow"},`阻塞 ${J.length}`),J.length===0?E("span",{className:"muted"},"无阻塞"):J.slice(0,4).map((Q)=>E("button",{key:Q.id,type:"button",onClick:()=>l(Q),"data-testid":`goal-blocker-${zf(Q.id)}`},E(R0,{status:P3(Q.status)},Q.status),E("span",null,Q.title||Q.id))))))}))}function HX({month:u,entries:l,selectedDate:f,today:n,onPickDate:y,onOpenToday:i}){let _=new Map(l.map(($)=>[$.date,$]));return E("div",{className:"diary-calendar","data-testid":"diary-calendar"},E("div",{className:"diary-calendar-head"},E("strong",null,u||"--"),E("button",{type:"button",className:"ghost-btn compact",onClick:i,"data-testid":"diary-calendar-today"},"今天")),E("div",{className:"diary-calendar-week"},gB.map(($)=>E("span",{key:$},$))),E("div",{className:"diary-calendar-grid"},yX(u).map(($,A)=>{if(!$)return E("span",{key:`empty-${A}`,className:"diary-day empty"});let j=_.get($),J=["diary-day",j?"has-entry":"",f===$?"selected":"",n===$?"today":""].filter(Boolean).join(" ");return E("button",{key:$,type:"button",className:J,onClick:()=>y($,j),"data-testid":`diary-calendar-day-${$}`},E("span",null,$.slice(8)),j?E("i",null,j1(j.title||j.summary,24)):null)})))}function OX({records:u,activeView:l,onView:f,onEdit:n,onRaw:y}){let i=[{id:"external-goal",title:"外部目标",eyebrow:"G0 / user-facing",records:u.filter(M3)},{id:"internal-goal",title:"内部目标",eyebrow:"G1-G3 / delivery",records:u.filter(fA)},{id:"blocker",title:"阻塞",eyebrow:"P0-P1 / blocked",records:u.filter((_)=>_.type==="blocker"||_.status==="blocked")},{id:"parked",title:"停放事项",eyebrow:"Parked",records:u.filter((_)=>_.status==="parked")},{id:"authority",title:"决议/实验/债务",eyebrow:"Decision / Experiment / Debt",records:u.filter((_)=>["decision","experiment","debt"].includes(_.type))}];return E("div",{className:"requirement-workspace","data-testid":"requirement-workspace"},E("div",{className:"requirement-switcher",role:"tablist","aria-label":"需求视图"},eB.map((_)=>E("button",{key:_.id,type:"button",className:l===_.id?"active":"",onClick:()=>f(_.id),"data-testid":`requirement-filter-${_.id}`},_.label))),E("div",{className:"requirement-lanes"},i.map((_)=>{let $=_.records.filter((A)=>PL(A,l)).slice(0,10);return E("section",{key:_.id,className:"requirement-lane","data-testid":`requirement-lane-${_.id}`},E("div",{className:"requirement-lane-head"},E("div",null,E("p",{className:"panel-eyebrow"},_.eyebrow),E("strong",null,_.title)),E(R0,{status:_.records.length>0?"unknown":"warn"},_.records.length)),$.length===0?E(Yf,{title:"暂无条目",text:"用右侧录入台补齐该类需求或筛选条件。"}):E("div",{className:"decision-card-list"},$.map((A)=>E(ni,{key:A.id,record:A,onRaw:y,onEdit:n,compact:!0}))))})))}function TX({form:u,saving:l,message:f,error:n,onChange:y,onCategory:i,onSubmit:_,onReset:$}){return E("form",{className:"record-editor-form",onSubmit:_,"data-testid":"record-editor"},E("div",{className:"editor-mode-grid"},Z7.map((A)=>E("button",{key:A.id,type:"button",className:u.category===A.id?"active":"",onClick:()=>i(A.id),"data-testid":`record-template-${A.id}`},A.label))),E("div",{className:"decision-form-grid"},E("label",null,"标题",E("input",{value:u.title,onChange:(A)=>y("title",A.target.value),placeholder:"需求、阻塞、决议或实验标题","data-testid":"record-title-input"})),E("label",null,"类型",E("select",{value:u.type,onChange:(A)=>y("type",A.target.value),"data-testid":"record-type-select"},r1(B7.filter((A)=>A!=="all")))),E("label",null,"等级",E("select",{value:u.level,onChange:(A)=>y("level",A.target.value),"data-testid":"record-level-select"},r1(X7.filter((A)=>A!=="all")))),E("label",null,"状态",E("select",{value:u.status,onChange:(A)=>y("status",A.target.value),"data-testid":"record-status-select"},r1(c7.filter((A)=>A!=="all")))),E("label",null,"Linked Goal",E("input",{value:u.linkedGoalId,onChange:(A)=>y("linkedGoalId",A.target.value),placeholder:"关联目标 id"})),E("label",null,"Tags",E("input",{value:u.tags,onChange:(A)=>y("tags",A.target.value),placeholder:"external-goal, requirement"})),E("label",null,"来源",E("input",{value:u.source,onChange:(A)=>y("source",A.target.value),placeholder:"issue / customer / commander","data-testid":"record-source-input"})),E("label",null,"Issue",E("input",{value:u.issueId,onChange:(A)=>y("issueId",A.target.value),placeholder:"#22 或 URL","data-testid":"record-issue-input"})),E("label",null,"父目标",E("input",{value:u.parentGoalId,onChange:(A)=>y("parentGoalId",A.target.value),placeholder:"外部目标 id","data-testid":"record-parent-goal-input"})),E("label",null,"子目标",E("input",{value:u.childGoalIds,onChange:(A)=>y("childGoalIds",A.target.value),placeholder:"逗号分隔 id","data-testid":"record-child-goals-input"})),E("label",{className:"wide"},"正文 Markdown",E("textarea",{value:u.body,onChange:(A)=>y("body",A.target.value),placeholder:`- 背景 - 验收标准 -- 下一步`,"data-testid":"record-body-editor"})),E("label",null,"证据链接",E("input",{value:u.evidenceLinks,onChange:(r)=>i("evidenceLinks",r.target.value),placeholder:"逗号分隔 URL"})),E("label",null,"Task ID",E("input",{value:u.taskId,onChange:(r)=>i("taskId",r.target.value),placeholder:"可选"})),E("label",null,"Commit ID",E("input",{value:u.commitId,onChange:(r)=>i("commitId",r.target.value),placeholder:"可选"}))),E("div",{className:"dispatch-actions"},E("button",{type:"submit",disabled:l||!String(u.title||"").trim(),"data-testid":"save-record-button"},l?"保存中":u.id?"保存记录":"创建记录"),E("button",{type:"button",className:"ghost-btn",disabled:l,onClick:$,"data-testid":"new-record-button"},"新建"),u.id?E("code",null,u.id):null),f?E("p",{className:"muted paragraph","data-testid":"record-editor-message"},f):null,E(ul,{error:n,title:"记录保存失败",wide:!0}))}function Tc({form:u,saving:l,message:f,error:n,onChange:i,onToday:y,onSubmit:_}){return E("form",{className:"diary-editor-form",onSubmit:_,"data-testid":"diary-editor"},E("div",{className:"decision-form-grid diary-editor-grid"},E("label",null,"日期",E("input",{type:"date",value:u.date,onChange:($)=>i("date",$.target.value),"data-testid":"diary-date-input"})),E("label",null,"标题",E("input",{value:u.title,onChange:($)=>i("title",$.target.value),placeholder:"工作日记标题","data-testid":"diary-title-input"})),E("label",null,"Source File",E("input",{value:u.sourceFile,onChange:($)=>i("sourceFile",$.target.value),placeholder:ni,"data-testid":"diary-source-input"})),E("label",null,"Tags",E("input",{value:u.tags,onChange:($)=>i("tags",$.target.value),placeholder:"frontend, daily","data-testid":"diary-tags-input"})),E("label",{className:"wide"},"Markdown",E("textarea",{value:u.body,onChange:($)=>i("body",$.target.value),placeholder:`## 今日进展 +- 下一步`,"data-testid":"record-body-editor"})),E("label",null,"证据链接",E("input",{value:u.evidenceLinks,onChange:(A)=>y("evidenceLinks",A.target.value),placeholder:"逗号分隔 URL"})),E("label",null,"Task ID",E("input",{value:u.taskId,onChange:(A)=>y("taskId",A.target.value),placeholder:"可选"})),E("label",null,"Commit ID",E("input",{value:u.commitId,onChange:(A)=>y("commitId",A.target.value),placeholder:"可选"}))),E("div",{className:"dispatch-actions"},E("button",{type:"submit",disabled:l||!String(u.title||"").trim(),"data-testid":"save-record-button"},l?"保存中":u.id?"保存记录":"创建记录"),E("button",{type:"button",className:"ghost-btn",disabled:l,onClick:$,"data-testid":"new-record-button"},"新建"),u.id?E("code",null,u.id):null),f?E("p",{className:"muted paragraph","data-testid":"record-editor-message"},f):null,E(ul,{error:n,title:"记录保存失败",wide:!0}))}function VX({form:u,saving:l,message:f,error:n,onChange:y,onToday:i,onSubmit:_}){return E("form",{className:"diary-editor-form",onSubmit:_,"data-testid":"diary-editor"},E("div",{className:"decision-form-grid diary-editor-grid"},E("label",null,"日期",E("input",{type:"date",value:u.date,onChange:($)=>y("date",$.target.value),"data-testid":"diary-date-input"})),E("label",null,"标题",E("input",{value:u.title,onChange:($)=>y("title",$.target.value),placeholder:"工作日记标题","data-testid":"diary-title-input"})),E("label",null,"Source File",E("input",{value:u.sourceFile,onChange:($)=>y("sourceFile",$.target.value),placeholder:ny,"data-testid":"diary-source-input"})),E("label",null,"Tags",E("input",{value:u.tags,onChange:($)=>y("tags",$.target.value),placeholder:"frontend, daily","data-testid":"diary-tags-input"})),E("label",{className:"wide"},"Markdown",E("textarea",{value:u.body,onChange:($)=>y("body",$.target.value),placeholder:`## 今日进展 ## 阻塞 -## 下一步`,"data-testid":"diary-body-editor"}))),E("div",{className:"dispatch-actions"},E("button",{type:"button",className:"ghost-btn",onClick:y,disabled:l,"data-testid":"today-diary-button"},"今天"),E("button",{type:"submit",disabled:l||!String(u.date||"").trim(),"data-testid":"save-diary-button"},l?"保存中":"保存日记"),E("code",null,`${String(u.date||Bn()).slice(0,7)}/${u.date||Bn()}.md`)),f?E("p",{className:"muted paragraph","data-testid":"diary-editor-message"},f):null,E(ul,{error:n,title:"日记保存失败",wide:!0}))}function PL({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let n=u.find((v)=>v.id==="decision-center")||null,[i,y]=Lf({loading:!1,error:"",health:null,records:[],refreshedAt:null,selectedDoc:null}),[_,$]=Lf({type:"all",status:"all",level:"all",linkedGoalId:""}),[r,j]=Lf("records"),[J,Q]=Lf("all"),[U,F]=Lf(z7("external-goal")),[N,L]=Lf({saving:!1,error:"",message:""}),[w,W]=Lf({loading:!1,error:"",entries:[],months:[],selected:null,refreshedAt:null}),K=Bn(),[q,z]=Lf({month:c3(K),from:"",to:""}),[Z,T]=Lf(Y3({date:K,title:`${K} 工作日记`,tags:["frontend"]})),[c,X]=Lf({saving:!1,error:"",message:""});async function S(){if(!n)return;y((v)=>({...v,loading:!0,error:""}));try{let v=Kc(_),$u=await Zu(p0(f,`/api/records?${v}`)),Wu=await Zu(p0(f,"/api/diary/months")),Du=i.health,ku="";try{Du=await Zu(`${f}/microservices/decision-center/health`)}catch($l){ku=cu($l,"Decision Center health 检查失败")}y({loading:!1,error:ku,health:Du,records:Array.isArray($u.records)?$u.records:[],refreshedAt:new Date}),W(($l)=>({...$l,months:Array.isArray(Wu.months)?Wu.months:[]}))}catch(v){y(($u)=>({...$u,loading:!1,error:G7(v,"Decision Center API 暂不可用")}))}}async function p(){if(!n)return;W((v)=>({...v,loading:!0,error:""}));try{let v=await Zu(p0(f,`/api/diary/entries?${zc(q)}`)),$u=await Zu(p0(f,"/api/diary/months")),Wu=Array.isArray(v.entries)?v.entries:[],Du=a(Wu,w.selected);if(W((ku)=>({loading:!1,error:"",entries:Wu,months:Array.isArray($u.months)?$u.months:ku.months,selected:Du,refreshedAt:new Date})),Du&&!Du.body)Y(Du)}catch(v){W(($u)=>({...$u,loading:!1,error:G7(v,"日记 API 暂不可用")}))}}async function Y(v){W(($u)=>({...$u,selected:v}));try{let Wu=(await Zu(p0(f,Gc(v)))).entry||v;W((Du)=>({...Du,selected:Wu})),T(Y3(Wu))}catch($u){W((Wu)=>({...Wu,error:cu($u,"日记正文加载失败")}))}}function t(v="external-goal"){F(z7(v)),L({saving:!1,error:"",message:""})}function m(v,$u){F((Wu)=>({...Wu,[v]:$u,category:v==="type"||v==="level"||v==="status"?"custom":Wu.category}))}function V(v){let $u=z7(v);F((Wu)=>({...Wu,...$u,id:Wu.id||"",title:Wu.title||"",body:Wu.body||"",linkedGoalId:Wu.linkedGoalId||"",source:Wu.source||"",issueId:Wu.issueId||"",parentGoalId:Wu.parentGoalId||"",childGoalIds:Wu.childGoalIds||"",evidenceLinks:Wu.evidenceLinks||"",sourceSession:Wu.sourceSession||"frontend",taskId:Wu.taskId||"",commitId:Wu.commitId||""}))}async function D(v){if(F(o8(v)),L({saving:!1,error:"",message:`正在编辑 ${v?.id||""}`}),j("records"),!v?.id||v?.body)return;try{let Wu=(await Zu(p0(f,`/api/records/${encodeURIComponent(v.id)}`))).record||v;F(o8(Wu))}catch($u){L({saving:!1,error:cu($u,"记录正文加载失败"),message:""})}}async function M(v){v.preventDefault();let $u=TL(U);if(!$u.title){L({saving:!1,error:"标题不能为空",message:""});return}L({saving:!0,error:"",message:""});try{let Wu=String(U.id||"").trim(),ku=(await Zu(p0(f,Wu?`/api/records/${encodeURIComponent(Wu)}`:"/api/records"),{method:Wu?"PUT":"POST",body:$u})).record;F(o8(ku||{...$u,id:Wu})),L({saving:!1,error:"",message:`${Wu?"已保存":"已创建"} ${ku?.id||Wu||""}`}),await S()}catch(Wu){L({saving:!1,error:cu(Wu,"记录保存失败"),message:""})}}function I(v,$u){if(T((Wu)=>({...Wu,[v]:$u})),v==="date"&&/^\d{4}-\d{2}-\d{2}$/u.test(String($u||"")))z((Wu)=>({...Wu,month:c3(String($u))}))}async function O(){let v=Bn();j("diary"),z(($u)=>({...$u,month:c3(v)})),X({saving:!1,error:"",message:""});try{let Wu=(await Zu(p0(f,`/api/diary/entries/${encodeURIComponent(v)}`))).entry;W((Du)=>({...Du,selected:Wu||Du.selected})),T(Y3(Wu||{date:v,title:`${v} 工作日记`,tags:["frontend"]})),X({saving:!1,error:"",message:Wu?`已打开今天 ${v}`:`已准备今天 ${v}`})}catch{T(Y3({date:v,title:`${v} 工作日记`,body:`## 今日进展 +## 下一步`,"data-testid":"diary-body-editor"}))),E("div",{className:"dispatch-actions"},E("button",{type:"button",className:"ghost-btn",onClick:i,disabled:l,"data-testid":"today-diary-button"},"今天"),E("button",{type:"submit",disabled:l||!String(u.date||"").trim(),"data-testid":"save-diary-button"},l?"保存中":"保存日记"),E("code",null,`${String(u.date||cn()).slice(0,7)}/${u.date||cn()}.md`)),f?E("p",{className:"muted paragraph","data-testid":"diary-editor-message"},f):null,E(ul,{error:n,title:"日记保存失败",wide:!0}))}function ML({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let n=u.find((v)=>v.id==="decision-center")||null,[y,i]=Kf({loading:!1,error:"",health:null,records:[],refreshedAt:null,selectedDoc:null}),[_,$]=Kf({type:"all",status:"all",level:"all",linkedGoalId:""}),[A,j]=Kf("records"),[J,Q]=Kf("all"),[U,F]=Kf(G7("external-goal")),[N,K]=Kf({saving:!1,error:"",message:""}),[G,W]=Kf({loading:!1,error:"",entries:[],months:[],selected:null,refreshedAt:null}),L=cn(),[q,z]=Kf({month:c3(L),from:"",to:""}),[Z,T]=Kf(D3({date:L,title:`${L} 工作日记`,tags:["frontend"]})),[X,c]=Kf({saving:!1,error:"",message:""});async function S(){if(!n)return;i((v)=>({...v,loading:!0,error:""}));try{let v=zX(_),$u=await Eu(m0(f,`/api/records?${v}`)),Wu=await Eu(m0(f,"/api/diary/months")),tu=y.health,hu="";try{tu=await Eu(`${f}/microservices/decision-center/health`)}catch($l){hu=Xu($l,"Decision Center health 检查失败")}i({loading:!1,error:hu,health:tu,records:Array.isArray($u.records)?$u.records:[],refreshedAt:new Date}),W(($l)=>({...$l,months:Array.isArray(Wu.months)?Wu.months:[]}))}catch(v){i(($u)=>({...$u,loading:!1,error:w7(v,"Decision Center API 暂不可用")}))}}async function p(){if(!n)return;W((v)=>({...v,loading:!0,error:""}));try{let v=await Eu(m0(f,`/api/diary/entries?${GX(q)}`)),$u=await Eu(m0(f,"/api/diary/months")),Wu=Array.isArray(v.entries)?v.entries:[],tu=a(Wu,G.selected);if(W((hu)=>({loading:!1,error:"",entries:Wu,months:Array.isArray($u.months)?$u.months:hu.months,selected:tu,refreshedAt:new Date})),tu&&!tu.body)Y(tu)}catch(v){W(($u)=>({...$u,loading:!1,error:w7(v,"日记 API 暂不可用")}))}}async function Y(v){W(($u)=>({...$u,selected:v}));try{let Wu=(await Eu(m0(f,wX(v)))).entry||v;W((tu)=>({...tu,selected:Wu})),T(D3(Wu))}catch($u){W((Wu)=>({...Wu,error:Xu($u,"日记正文加载失败")}))}}function D(v="external-goal"){F(G7(v)),K({saving:!1,error:"",message:""})}function x(v,$u){F((Wu)=>({...Wu,[v]:$u,category:v==="type"||v==="level"||v==="status"?"custom":Wu.category}))}function V(v){let $u=G7(v);F((Wu)=>({...Wu,...$u,id:Wu.id||"",title:Wu.title||"",body:Wu.body||"",linkedGoalId:Wu.linkedGoalId||"",source:Wu.source||"",issueId:Wu.issueId||"",parentGoalId:Wu.parentGoalId||"",childGoalIds:Wu.childGoalIds||"",evidenceLinks:Wu.evidenceLinks||"",sourceSession:Wu.sourceSession||"frontend",taskId:Wu.taskId||"",commitId:Wu.commitId||""}))}async function t(v){if(F(d4(v)),K({saving:!1,error:"",message:`正在编辑 ${v?.id||""}`}),j("records"),!v?.id||v?.body)return;try{let Wu=(await Eu(m0(f,`/api/records/${encodeURIComponent(v.id)}`))).record||v;F(d4(Wu))}catch($u){K({saving:!1,error:Xu($u,"记录正文加载失败"),message:""})}}async function M(v){v.preventDefault();let $u=VL(U);if(!$u.title){K({saving:!1,error:"标题不能为空",message:""});return}K({saving:!0,error:"",message:""});try{let Wu=String(U.id||"").trim(),hu=(await Eu(m0(f,Wu?`/api/records/${encodeURIComponent(Wu)}`:"/api/records"),{method:Wu?"PUT":"POST",body:$u})).record;F(d4(hu||{...$u,id:Wu})),K({saving:!1,error:"",message:`${Wu?"已保存":"已创建"} ${hu?.id||Wu||""}`}),await S()}catch(Wu){K({saving:!1,error:Xu(Wu,"记录保存失败"),message:""})}}function I(v,$u){if(T((Wu)=>({...Wu,[v]:$u})),v==="date"&&/^\d{4}-\d{2}-\d{2}$/u.test(String($u||"")))z((Wu)=>({...Wu,month:c3(String($u))}))}async function O(){let v=cn();j("diary"),z(($u)=>({...$u,month:c3(v)})),c({saving:!1,error:"",message:""});try{let Wu=(await Eu(m0(f,`/api/diary/entries/${encodeURIComponent(v)}`))).entry;W((tu)=>({...tu,selected:Wu||tu.selected})),T(D3(Wu||{date:v,title:`${v} 工作日记`,tags:["frontend"]})),c({saving:!1,error:"",message:Wu?`已打开今天 ${v}`:`已准备今天 ${v}`})}catch{T(D3({date:v,title:`${v} 工作日记`,body:`## 今日进展 ## 阻塞 ## 下一步 -`,sourceFile:ni,tags:["frontend"]})),X({saving:!1,error:"",message:`今天 ${v} 尚未存在,保存后自动创建`})}}async function C(v,$u){if(j("diary"),z((Du)=>({...Du,month:c3(v)})),X({saving:!1,error:"",message:""}),$u){await Y($u);return}let Wu=Y3({date:v,title:`${v} 工作日记`,body:`## 今日进展 +`,sourceFile:ny,tags:["frontend"]})),c({saving:!1,error:"",message:`今天 ${v} 尚未存在,保存后自动创建`})}}async function C(v,$u){if(j("diary"),z((tu)=>({...tu,month:c3(v)})),c({saving:!1,error:"",message:""}),$u){await Y($u);return}let Wu=D3({date:v,title:`${v} 工作日记`,body:`## 今日进展 ## 阻塞 ## 下一步 -`,sourceFile:ni,tags:["frontend"]});W((Du)=>({...Du,selected:null})),T(Wu),X({saving:!1,error:"",message:`${v} 尚未存在,保存后自动创建`})}async function g(v){v.preventDefault();let $u=String(Z.date||"").trim();if(!$u){X({saving:!1,error:"日期不能为空",message:""});return}X({saving:!0,error:"",message:""});try{let Du=(await Zu(p0(f,`/api/diary/entries/${encodeURIComponent($u)}`),{method:"PUT",body:qc(Z)})).entry;if(X({saving:!1,error:"",message:`已保存 ${$u} / ${Du?.markdownPath||"YYYY-MM/YYYY-MM-DD.md"}`}),await p(),Du)await Y(Du)}catch(Wu){try{let Du=Wc(Z),ku=await Zu(p0(f,"/api/diary/import"),{method:"POST",body:{markdown:Du,sourceFile:String(Z.sourceFile||ni).trim()||ni,tags:ny(Z.tags)}}),$l=Array.isArray(ku.entries)?ku.entries.find((gu)=>gu.date===$u)||ku.entries[0]:null;if(X({saving:!1,error:"",message:`已保存 ${$u} / ${ku.pathPattern||"YYYY-MM/YYYY-MM-DD.md"}`}),await p(),$l)await Y($l)}catch(Du){X({saving:!1,error:G7(Du,"日记保存失败"),message:""})}}}function a(v,$u){if($u&&v.some((Wu)=>Wu.id===$u.id))return $u;return v[0]||null}if(a8(()=>{S()},[n?.id,n?.runtime?.providerStatus]),a8(()=>{let v=setTimeout(()=>void S(),120);return()=>clearTimeout(v)},[_.type,_.status,_.level,_.linkedGoalId]),a8(()=>{if(r!=="diary")return;let v=setTimeout(()=>void p(),120);return()=>clearTimeout(v)},[r,q.month,q.from,q.to,n?.id,n?.runtime?.providerStatus]),!n)return E(Xf,{title:"Decision Center 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=decision-center"});let iu=eB(n),Au=lc(n),R=uc(n),x=Array.isArray(i.records)?i.records:[],fu=x.filter((v)=>P3(v)&&v.status!=="done"),yu=x.filter((v)=>l4(v)&&v.status!=="done"),Ju=x.filter((v)=>(v.type==="blocker"||v.status==="blocked")&&v.status!=="done").slice(0,8),Vu=x.filter((v)=>v.status==="parked").slice(0,8),Lu=x.filter((v)=>["decision","experiment","debt"].includes(v.type)).slice(0,12),Bu=x.filter((v)=>v.type==="meeting"||v.type==="decision").slice(0,12),b=x.filter((v)=>SL(v,J)),o=Array.isArray(w.entries)?w.entries:[],nu=Array.isArray(w.months)?w.months:[],wu=w.selected,e=Number(i.health?.diaryEntryCount??0),zu=q.month==="all"?c3(String(Z.date||Bn())):q.month;return E("div",{className:"decision-center-page","data-testid":"decision-center-page"},E(cf,{title:"Decision Center",eyebrow:"Authority Records",loading:i.loading,actions:E("div",{className:"inline-actions"},E("button",{type:"button",className:"ghost-btn",onClick:()=>void S(),disabled:i.loading,"data-testid":"decision-refresh-button"},i.loading?"刷新中":"刷新"),E(ii,{title:"Decision Center Health",data:i.health,onOpen:l,testId:"raw-decision-center-health"}))},E("div",{className:"decision-hero"},E("div",{className:"metric-grid"},E(s8,{label:"记录数",value:x.length,hint:`PostgreSQL / ${i.health?.storage||"postgres"}`,tone:"ok"}),E(s8,{label:"日记",value:e,hint:"按月 Markdown",tone:e>0?"ok":"warn"}),E(s8,{label:"外部/内部目标",value:`${fu.length}/${yu.length}`,hint:"G0-facing / G1-G3 delivery",tone:"ok"}),E(s8,{label:"P0/P1 Blocker",value:Ju.length,hint:"requires decision",tone:Ju.length>0?"warn":"ok"})),E("div",{className:"microservice-ref-card"},E("span",null,"Runtime"),E("strong",null,iu.orchestrator||n.deployment?.mode||"k3sctl"),E("code",null,`${n.providerId} / ${R.nodeBindHost||"--"}:${R.nodePort||"--"}`),E("code",null,Au.commitId||"--"))),E(ul,{error:i.error,title:"Decision Center 请求失败"})),E("div",{className:"decision-tabs",role:"tablist"},E("button",{type:"button",className:r==="records"?"active":"",onClick:()=>j("records"),"data-testid":"decision-tab-requirements"},"需求管理"),E("button",{type:"button",className:r==="diary"?"active":"",onClick:()=>j("diary"),"data-testid":"decision-tab-diary"},"工作日记"),E("button",{type:"button",className:r==="workspace"?"active":"",onClick:()=>j("workspace"),"data-testid":"decision-tab-workspace"},"文书工作台")),r==="workspace"?E($1.default.Fragment,null,E(Fc,{records:x,selectedRecord:i.selectedDoc,onSelect:async(v)=>{if(y(($u)=>({...$u,selectedDoc:v})),!v?.body&&v?.id)try{let $u=await Zu(p0(f,`/api/records/${encodeURIComponent(v.id)}`));y((Wu)=>({...Wu,selectedDoc:$u.record||v}))}catch{}},onSave:async(v)=>{L({saving:!0,error:"",message:""});try{let $u=String(v.id||"").trim(),Du=(await Zu(p0(f,$u?`/api/records/${encodeURIComponent($u)}`:"/api/records"),{method:$u?"PUT":"POST",body:TL(v)})).record;if(L({saving:!1,error:"",message:`已保存 ${Du?.id||$u}`}),await S(),Du)y((ku)=>({...ku,selectedDoc:Du}))}catch($u){L({saving:!1,error:cu($u,"保存失败"),message:""})}},saving:N.saving,saveError:N.error,saveMsg:N.message,onRaw:l})):r==="diary"?E($1.default.Fragment,null,E(cf,{title:"工作日记编辑台",eyebrow:"Daily Markdown",loading:c.saving,actions:E("div",{className:"inline-actions"},E("button",{type:"button",className:"ghost-btn",onClick:()=>void O(),disabled:c.saving,"data-testid":"today-diary"},"今天"))},E(Tc,{form:Z,saving:c.saving,message:c.message,error:c.error,onChange:I,onToday:()=>void O(),onSubmit:(v)=>void g(v)})),E(cf,{title:"日记筛选",eyebrow:"Markdown by Month",loading:w.loading,actions:E("div",{className:"inline-actions"},E("button",{type:"button",className:"ghost-btn",onClick:()=>void p(),disabled:w.loading,"data-testid":"diary-refresh-button"},w.loading?"刷新中":"刷新"),E(ii,{title:"Diary Months",data:nu,onOpen:l,testId:"raw-decision-center-diary-months"}))},E("div",{className:"decision-filter-bar","data-testid":"diary-filter-bar"},E("label",null,"月份",E("select",{value:q.month,onChange:(v)=>z(($u)=>({...$u,month:v.target.value})),"data-testid":"diary-month-select"},E("option",{value:"all"},"all"),nu.some((v)=>v.month===zu)?null:E("option",{value:zu},`${zu} (0)`),nu.map((v)=>E("option",{key:v.month,value:v.month},`${v.month} (${v.count})`)))),E("label",null,"开始日期",E("input",{type:"date",value:q.from,onChange:(v)=>z(($u)=>({...$u,from:v.target.value})),"data-testid":"diary-from-input"})),E("label",null,"结束日期",E("input",{type:"date",value:q.to,onChange:(v)=>z(($u)=>({...$u,to:v.target.value})),"data-testid":"diary-to-input"})),E("label",null,"存储",E("input",{value:"PostgreSQL / YYYY-MM/YYYY-MM-DD.md",readOnly:!0}))),E(Ec,{month:zu,entries:o,selectedDate:String(Z.date||wu?.date||""),today:Bn(),onPickDate:(v,$u)=>void C(v,$u),onOpenToday:()=>void O()}),E(ul,{error:w.error,title:"日记请求失败"})),E("div",{className:"diary-layout"},E(cf,{title:"按天条目",eyebrow:`${o.length} Entries`,loading:w.loading},o.length===0?E(Xf,{title:"暂无日记",text:"点击“今天”后可自动创建当天 Markdown 日记。"}):E("div",{className:"diary-entry-list"},o.map((v)=>E(wc,{key:v.id,entry:v,selected:wu?.id===v.id,onSelect:Y,onRaw:l})))),E(cf,{title:wu?.title||"日记正文",eyebrow:wu?.markdownPath||"Daily Markdown",actions:wu?E(ii,{title:`Diary ${wu.date}`,data:wu,onOpen:l,testId:"raw-decision-center-diary-selected"}):null},wu?E(L_,{markdown:wu.body||wu.summary||"",className:"decision-markdown diary-markdown"}):E(Xf,{title:"未选择日记",text:"从左侧选择一天查看 Markdown 正文。"})))):E($1.default.Fragment,null,E(cf,{title:"需求管理工作区",eyebrow:`${b.length} Filtered`,loading:i.loading},E(Hc,{records:x,activeView:J,onView:Q,onEdit:D,onRaw:l})),E(cf,{title:"目标拆解",eyebrow:"External to Internal Goals"},E(Zc,{records:x,onEdit:D,onRaw:l})),E(cf,{title:U.id?"编辑需求记录":"录入需求记录",eyebrow:"Record Editor",loading:N.saving},E(Oc,{form:U,saving:N.saving,message:N.message,error:N.error,onChange:m,onCategory:V,onSubmit:(v)=>void M(v),onReset:()=>t()})),E(cf,{title:"筛选",eyebrow:"Type / Status / Level"},E("div",{className:"decision-filter-bar","data-testid":"decision-center-filters"},E("label",null,"类型",E("select",{value:_.type,onChange:(v)=>$(($u)=>({...$u,type:v.target.value}))},r1(V7))),E("label",null,"状态",E("select",{value:_.status,onChange:(v)=>$(($u)=>({...$u,status:v.target.value}))},r1(c7))),E("label",null,"等级",E("select",{value:_.level,onChange:(v)=>$(($u)=>({...$u,level:v.target.value}))},r1(B7))),E("label",null,"Linked Goal",E("input",{value:_.linkedGoalId,onChange:(v)=>$(($u)=>({...$u,linkedGoalId:v.target.value})),placeholder:"goal id"})))),E("div",{className:"decision-default-grid"},E(cf,{title:"外部目标",eyebrow:`${fu.length} External Goals`},fu.length===0?E(Xf,{title:"暂无外部目标",text:"外部目标使用 G0 或 external-goal tag。"}):E("div",{className:"decision-card-list"},fu.slice(0,8).map((v)=>E(fy,{key:v.id,record:v,onRaw:l,onEdit:D,compact:!0})))),E(cf,{title:"内部目标",eyebrow:`${yu.length} Internal Goals`},yu.length===0?E(Xf,{title:"暂无内部目标",text:"内部目标使用 G1/G2/G3 或 internal-goal tag。"}):E("div",{className:"decision-card-list"},yu.slice(0,8).map((v)=>E(fy,{key:v.id,record:v,onRaw:l,onEdit:D,compact:!0})))),E(cf,{title:"P0/P1 Blocker",eyebrow:`${Ju.length} Blockers`},Ju.length===0?E(Xf,{title:"暂无高优先级阻塞",text:"阻塞记录使用 type=blocker 且 level=P0/P1。"}):E("div",{className:"decision-card-list"},Ju.map((v)=>E(fy,{key:v.id,record:v,onRaw:l,onEdit:D,compact:!0})))),E(cf,{title:"停放事项",eyebrow:`${Vu.length} Parked`},Vu.length===0?E(Xf,{title:"暂无停放事项",text:"status=parked 的记录会集中展示。"}):E("div",{className:"decision-card-list"},Vu.map((v)=>E(fy,{key:v.id,record:v,onRaw:l,onEdit:D,compact:!0})))),E(cf,{title:"决议/实验/债务",eyebrow:`${Lu.length} Authority`},Lu.length===0?E(Xf,{title:"暂无权威事项",text:"决议、实验和债务会集中展示。"}):E("div",{className:"decision-card-list"},Lu.map((v)=>E(fy,{key:v.id,record:v,onRaw:l,onEdit:D,compact:!0})))),E(cf,{title:"最近会议/决议",eyebrow:`${Bu.length} Recent`},Bu.length===0?E(Xf,{title:"暂无会议或决议",text:"使用 CLI 上传 Markdown 会议记录后会显示。"}):E("div",{className:"decision-card-list"},Bu.map((v)=>E(fy,{key:v.id,record:v,onRaw:l,onEdit:D,compact:!0}))))),E(cf,{title:"全部记录",eyebrow:`${x.length} Records`,actions:i.refreshedAt?E("span",{className:"muted"},`刷新 ${Al(i.refreshedAt)}`):null},E(Lc,{records:x,onRaw:l,onEdit:D}))))}var M3=bu(Wl(),1);var Pu=M3.default.createElement,{useEffect:t7}=M3.default,D7=M3.default.useState,Vc=M3.default.useRef,P7=` +`,sourceFile:ny,tags:["frontend"]});W((tu)=>({...tu,selected:null})),T(Wu),c({saving:!1,error:"",message:`${v} 尚未存在,保存后自动创建`})}async function g(v){v.preventDefault();let $u=String(Z.date||"").trim();if(!$u){c({saving:!1,error:"日期不能为空",message:""});return}c({saving:!0,error:"",message:""});try{let tu=(await Eu(m0(f,`/api/diary/entries/${encodeURIComponent($u)}`),{method:"PUT",body:LX(Z)})).entry;if(c({saving:!1,error:"",message:`已保存 ${$u} / ${tu?.markdownPath||"YYYY-MM/YYYY-MM-DD.md"}`}),await p(),tu)await Y(tu)}catch(Wu){try{let tu=qX(Z),hu=await Eu(m0(f,"/api/diary/import"),{method:"POST",body:{markdown:tu,sourceFile:String(Z.sourceFile||ny).trim()||ny,tags:yi(Z.tags)}}),$l=Array.isArray(hu.entries)?hu.entries.find((gu)=>gu.date===$u)||hu.entries[0]:null;if(c({saving:!1,error:"",message:`已保存 ${$u} / ${hu.pathPattern||"YYYY-MM/YYYY-MM-DD.md"}`}),await p(),$l)await Y($l)}catch(tu){c({saving:!1,error:w7(tu,"日记保存失败"),message:""})}}}function a(v,$u){if($u&&v.some((Wu)=>Wu.id===$u.id))return $u;return v[0]||null}if(o4(()=>{S()},[n?.id,n?.runtime?.providerStatus]),o4(()=>{let v=setTimeout(()=>void S(),120);return()=>clearTimeout(v)},[_.type,_.status,_.level,_.linkedGoalId]),o4(()=>{if(A!=="diary")return;let v=setTimeout(()=>void p(),120);return()=>clearTimeout(v)},[A,q.month,q.from,q.to,n?.id,n?.runtime?.providerStatus]),!n)return E(Yf,{title:"Decision Center 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=decision-center"});let yu=uX(n),ru=fX(n),R=lX(n),m=Array.isArray(y.records)?y.records:[],fu=m.filter((v)=>M3(v)&&v.status!=="done"),iu=m.filter((v)=>fA(v)&&v.status!=="done"),Ju=m.filter((v)=>(v.type==="blocker"||v.status==="blocked")&&v.status!=="done").slice(0,8),Vu=m.filter((v)=>v.status==="parked").slice(0,8),Lu=m.filter((v)=>["decision","experiment","debt"].includes(v.type)).slice(0,12),Bu=m.filter((v)=>v.type==="meeting"||v.type==="decision").slice(0,12),b=m.filter((v)=>PL(v,J)),o=Array.isArray(G.entries)?G.entries:[],nu=Array.isArray(G.months)?G.months:[],wu=G.selected,d=Number(y.health?.diaryEntryCount??0),zu=q.month==="all"?c3(String(Z.date||cn())):q.month;return E("div",{className:"decision-center-page","data-testid":"decision-center-page"},E(cf,{title:"Decision Center",eyebrow:"Authority Records",loading:y.loading,actions:E("div",{className:"inline-actions"},E("button",{type:"button",className:"ghost-btn",onClick:()=>void S(),disabled:y.loading,"data-testid":"decision-refresh-button"},y.loading?"刷新中":"刷新"),E(yy,{title:"Decision Center Health",data:y.health,onOpen:l,testId:"raw-decision-center-health"}))},E("div",{className:"decision-hero"},E("div",{className:"metric-grid"},E(a4,{label:"记录数",value:m.length,hint:`PostgreSQL / ${y.health?.storage||"postgres"}`,tone:"ok"}),E(a4,{label:"日记",value:d,hint:"按月 Markdown",tone:d>0?"ok":"warn"}),E(a4,{label:"外部/内部目标",value:`${fu.length}/${iu.length}`,hint:"G0-facing / G1-G3 delivery",tone:"ok"}),E(a4,{label:"P0/P1 Blocker",value:Ju.length,hint:"requires decision",tone:Ju.length>0?"warn":"ok"})),E("div",{className:"microservice-ref-card"},E("span",null,"Runtime"),E("strong",null,yu.orchestrator||n.deployment?.mode||"k3sctl"),E("code",null,`${n.providerId} / ${R.nodeBindHost||"--"}:${R.nodePort||"--"}`),E("code",null,ru.commitId||"--"))),E(ul,{error:y.error,title:"Decision Center 请求失败"})),E("div",{className:"decision-tabs",role:"tablist"},E("button",{type:"button",className:A==="records"?"active":"",onClick:()=>j("records"),"data-testid":"decision-tab-requirements"},"需求管理"),E("button",{type:"button",className:A==="diary"?"active":"",onClick:()=>j("diary"),"data-testid":"decision-tab-diary"},"工作日记"),E("button",{type:"button",className:A==="workspace"?"active":"",onClick:()=>j("workspace"),"data-testid":"decision-tab-workspace"},"文书工作台")),A==="workspace"?E(A1.default.Fragment,null,E(WX,{records:m,selectedRecord:y.selectedDoc,onSelect:async(v)=>{if(i(($u)=>({...$u,selectedDoc:v})),!v?.body&&v?.id)try{let $u=await Eu(m0(f,`/api/records/${encodeURIComponent(v.id)}`));i((Wu)=>({...Wu,selectedDoc:$u.record||v}))}catch{}},onSave:async(v)=>{K({saving:!0,error:"",message:""});try{let $u=String(v.id||"").trim(),tu=(await Eu(m0(f,$u?`/api/records/${encodeURIComponent($u)}`:"/api/records"),{method:$u?"PUT":"POST",body:VL(v)})).record;if(K({saving:!1,error:"",message:`已保存 ${tu?.id||$u}`}),await S(),tu)i((hu)=>({...hu,selectedDoc:tu}))}catch($u){K({saving:!1,error:Xu($u,"保存失败"),message:""})}},saving:N.saving,saveError:N.error,saveMsg:N.message,onRaw:l})):A==="diary"?E(A1.default.Fragment,null,E(cf,{title:"工作日记编辑台",eyebrow:"Daily Markdown",loading:X.saving,actions:E("div",{className:"inline-actions"},E("button",{type:"button",className:"ghost-btn",onClick:()=>void O(),disabled:X.saving,"data-testid":"today-diary"},"今天"))},E(VX,{form:Z,saving:X.saving,message:X.message,error:X.error,onChange:I,onToday:()=>void O(),onSubmit:(v)=>void g(v)})),E(cf,{title:"日记筛选",eyebrow:"Markdown by Month",loading:G.loading,actions:E("div",{className:"inline-actions"},E("button",{type:"button",className:"ghost-btn",onClick:()=>void p(),disabled:G.loading,"data-testid":"diary-refresh-button"},G.loading?"刷新中":"刷新"),E(yy,{title:"Diary Months",data:nu,onOpen:l,testId:"raw-decision-center-diary-months"}))},E("div",{className:"decision-filter-bar","data-testid":"diary-filter-bar"},E("label",null,"月份",E("select",{value:q.month,onChange:(v)=>z(($u)=>({...$u,month:v.target.value})),"data-testid":"diary-month-select"},E("option",{value:"all"},"all"),nu.some((v)=>v.month===zu)?null:E("option",{value:zu},`${zu} (0)`),nu.map((v)=>E("option",{key:v.month,value:v.month},`${v.month} (${v.count})`)))),E("label",null,"开始日期",E("input",{type:"date",value:q.from,onChange:(v)=>z(($u)=>({...$u,from:v.target.value})),"data-testid":"diary-from-input"})),E("label",null,"结束日期",E("input",{type:"date",value:q.to,onChange:(v)=>z(($u)=>({...$u,to:v.target.value})),"data-testid":"diary-to-input"})),E("label",null,"存储",E("input",{value:"PostgreSQL / YYYY-MM/YYYY-MM-DD.md",readOnly:!0}))),E(HX,{month:zu,entries:o,selectedDate:String(Z.date||wu?.date||""),today:cn(),onPickDate:(v,$u)=>void C(v,$u),onOpenToday:()=>void O()}),E(ul,{error:G.error,title:"日记请求失败"})),E("div",{className:"diary-layout"},E(cf,{title:"按天条目",eyebrow:`${o.length} Entries`,loading:G.loading},o.length===0?E(Yf,{title:"暂无日记",text:"点击“今天”后可自动创建当天 Markdown 日记。","data-testid":"diary-entry-list-empty"}):E("div",{className:"diary-entry-list"},o.map((v)=>E(ZX,{key:v.id,entry:v,selected:wu?.id===v.id,onSelect:Y,onRaw:l})))),E(cf,{title:wu?.title||"日记正文",eyebrow:wu?.markdownPath||"Daily Markdown",actions:wu?E(yy,{title:`Diary ${wu.date}`,data:wu,onOpen:l,testId:"raw-decision-center-diary-selected"}):null},wu?E(K_,{markdown:wu.body||wu.summary||"",className:"decision-markdown diary-markdown"}):E(Yf,{title:"未选择日记",text:"从左侧选择一天查看 Markdown 正文。"})))):E(A1.default.Fragment,null,E(cf,{title:"需求管理工作区",eyebrow:`${b.length} Filtered`,loading:y.loading},E(OX,{records:m,activeView:J,onView:Q,onEdit:t,onRaw:l})),E(cf,{title:"目标拆解",eyebrow:"External to Internal Goals"},E(EX,{records:m,onEdit:t,onRaw:l})),E(cf,{title:U.id?"编辑需求记录":"录入需求记录",eyebrow:"Record Editor",loading:N.saving},E(TX,{form:U,saving:N.saving,message:N.message,error:N.error,onChange:x,onCategory:V,onSubmit:(v)=>void M(v),onReset:()=>D()})),E(cf,{title:"筛选",eyebrow:"Type / Status / Level"},E("div",{className:"decision-filter-bar","data-testid":"decision-center-filters"},E("label",null,"类型",E("select",{value:_.type,onChange:(v)=>$(($u)=>({...$u,type:v.target.value}))},r1(B7))),E("label",null,"状态",E("select",{value:_.status,onChange:(v)=>$(($u)=>({...$u,status:v.target.value}))},r1(c7))),E("label",null,"等级",E("select",{value:_.level,onChange:(v)=>$(($u)=>({...$u,level:v.target.value}))},r1(X7))),E("label",null,"Linked Goal",E("input",{value:_.linkedGoalId,onChange:(v)=>$(($u)=>({...$u,linkedGoalId:v.target.value})),placeholder:"goal id"})))),E("div",{className:"decision-default-grid"},E(cf,{title:"外部目标",eyebrow:`${fu.length} External Goals`},fu.length===0?E(Yf,{title:"暂无外部目标",text:"外部目标使用 G0 或 external-goal tag。"}):E("div",{className:"decision-card-list"},fu.slice(0,8).map((v)=>E(ni,{key:v.id,record:v,onRaw:l,onEdit:t,compact:!0})))),E(cf,{title:"内部目标",eyebrow:`${iu.length} Internal Goals`},iu.length===0?E(Yf,{title:"暂无内部目标",text:"内部目标使用 G1/G2/G3 或 internal-goal tag。"}):E("div",{className:"decision-card-list"},iu.slice(0,8).map((v)=>E(ni,{key:v.id,record:v,onRaw:l,onEdit:t,compact:!0})))),E(cf,{title:"P0/P1 Blocker",eyebrow:`${Ju.length} Blockers`},Ju.length===0?E(Yf,{title:"暂无高优先级阻塞",text:"阻塞记录使用 type=blocker 且 level=P0/P1。"}):E("div",{className:"decision-card-list"},Ju.map((v)=>E(ni,{key:v.id,record:v,onRaw:l,onEdit:t,compact:!0})))),E(cf,{title:"停放事项",eyebrow:`${Vu.length} Parked`},Vu.length===0?E(Yf,{title:"暂无停放事项",text:"status=parked 的记录会集中展示。"}):E("div",{className:"decision-card-list"},Vu.map((v)=>E(ni,{key:v.id,record:v,onRaw:l,onEdit:t,compact:!0})))),E(cf,{title:"决议/实验/债务",eyebrow:`${Lu.length} Authority`},Lu.length===0?E(Yf,{title:"暂无权威事项",text:"决议、实验和债务会集中展示。"}):E("div",{className:"decision-card-list"},Lu.map((v)=>E(ni,{key:v.id,record:v,onRaw:l,onEdit:t,compact:!0})))),E(cf,{title:"最近会议/决议",eyebrow:`${Bu.length} Recent`},Bu.length===0?E(Yf,{title:"暂无会议或决议",text:"使用 CLI 上传 Markdown 会议记录后会显示。"}):E("div",{className:"decision-card-list"},Bu.map((v)=>E(ni,{key:v.id,record:v,onRaw:l,onEdit:t,compact:!0}))))),E(cf,{title:"全部记录",eyebrow:`${m.length} Records`,actions:y.refreshedAt?E("span",{className:"muted"},`刷新 ${rl(y.refreshedAt)}`):null},E(KX,{records:m,onRaw:l,onEdit:t}))))}var C3=ku(ql(),1);var Pu=C3.default.createElement,{useEffect:t7}=C3.default,S7=C3.default.useState,BX=C3.default.useRef,M7=` :root { --surfacePrimary: #ffffff; --surfaceSecondary: #f8fafc; @@ -256,64 +256,64 @@ nav .material-icons::before { display: none !important; } } -`;function S7({title:u,eyebrow:l,actions:f,children:n,className:i,loading:y}){return Pu("section",{className:`panel ${i||""}`},Pu("div",{className:"panel-head"},Pu("div",null,l?Pu("p",{className:"panel-eyebrow"},l):null,Pu(nl,{title:u,loading:y})),f?Pu("div",{className:"panel-actions"},f):null),Pu("div",{className:"panel-body"},n))}function Bc({title:u,data:l,onOpen:f,testId:n}){return Pu("button",{type:"button",className:"ghost-btn","data-testid":n,onClick:()=>f(u,l)},"查看原始JSON")}function cc({title:u,text:l}){return Pu("div",{className:"empty-state"},Pu("strong",null,u),Pu("span",null,l))}function ML(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function CL(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function pL(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function Xc(u){return u.filter((f)=>f?.id==="filebrowser"||String(f?.id||"").startsWith("filebrowser-")).sort((f,n)=>{let i=(y)=>y.providerId==="D518"?0:y.providerId==="D601"?1:y.id==="filebrowser"?2:3;return i(f)-i(n)||String(f.id).localeCompare(String(n.id))})}function Yc(u){if(u?.providerId==="D518")return"D518";return u?.providerId||u?.name||u?.id||"Unknown"}function tc(u,l,f="/"){let n=f.startsWith("/")?f:`/${f}`;return`${u}/microservices/${encodeURIComponent(l)}/proxy${n}`}function Dc(u,l){return`${u}/microservices/${encodeURIComponent(l)}/health`}async function Sc(u,l=16000){let f=new AbortController,n=setTimeout(()=>f.abort(),l);try{return await Zu(u,{signal:f.signal,failureFields:[!1]})}finally{clearTimeout(n)}}function mL(u){if(u?.providerId==="main-server")return"host / -> /srv";if(u?.providerId==="D601"||u?.providerId==="D518")return"WSL / + /mnt/c -> /srv";return"provider / -> /srv"}function f4(u){return u?.status==="OK"||u?.ok===!0}function Pc({service:u,active:l,health:f,onSelect:n,onRaw:i}){let y=ML(u),_=CL(u),$=pL(u),r=y.container||{},j=f4(f?.body);return Pu("button",{type:"button",className:`filebrowser-target-card ${l?"active":""}`,"data-testid":`filebrowser-target-card-${u.id}`,onClick:n},Pu("span",{className:`status-badge ${j?"ok":y.providerStatus==="online"?"running":"warn"}`},j?"Health OK":y.providerStatus||"unknown"),Pu("strong",null,u.name||u.id),Pu("span",null,mL(u)),Pu("code",null,`${_.nodeBindHost||"--"}:${_.nodePort||"--"}`),Pu("small",null,r.name?`${r.name} / ${r.state||"--"}`:`${$.composeService||"--"}`),Pu("span",{className:"filebrowser-card-raw",onClick:(J)=>{J.stopPropagation(),i(`${u.name} service`,u)}},"JSON"))}function xL(u){try{return u?.contentDocument||u?.contentWindow?.document||null}catch{return null}}function M7(u){let l=xL(u);if(l===null||l.head===null)return!1;let f=l.getElementById("unidesk-filebrowser-compact-style");if(f===null)f=l.createElement("style"),f.id="unidesk-filebrowser-compact-style",l.head.appendChild(f);if(f.textContent!==P7)f.textContent=P7;return!0}function Mc(u,l){let f=URL.createObjectURL(u),n=document.createElement("a");n.href=f,n.download=l,document.body.appendChild(n),n.click(),n.remove(),setTimeout(()=>URL.revokeObjectURL(f),2000)}function Cc(u,l){let f=xL(u);if(f===null||f.documentElement===null)throw Error("无法访问 File Browser iframe 文档");M7(u);let n=Math.max(640,Math.ceil(u.clientWidth||f.documentElement.clientWidth||1280)),i=Math.max(480,Math.ceil(u.clientHeight||f.documentElement.clientHeight||720)),y=f.documentElement.cloneNode(!0);y.querySelectorAll("script, style, link[rel='stylesheet'], link[rel='preload'], link[rel='icon']").forEach((J)=>J.remove()),y.querySelectorAll("img").forEach((J)=>{J.removeAttribute("src"),J.removeAttribute("srcset")});let _=y.querySelector("head");if(_===null)_=f.createElement("head"),y.insertBefore(_,y.firstChild);let $=f.createElement("style");$.textContent=`${P7} -html,body{width:${n}px!important;min-height:${i}px!important;overflow:hidden!important;}`,_.appendChild($);let r=new XMLSerializer().serializeToString(y),j=`${r}`;Mc(new Blob([j],{type:"image/svg+xml;charset=utf-8"}),l.replace(/\.png$/i,".svg"))}function RL({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let n=Xc(Array.isArray(u)?u:[]),i=new URLSearchParams(window.location.search).get("target")||"",y=i==="filebrowser-d518"?"filebrowser":i,_=n.some((T)=>T.id===y)?y:n[0]?.id||"",[$,r]=D7(_),[j,J]=D7({loading:!1,refreshedAt:null,health:{},error:""}),[Q,U]=D7({exporting:!1,message:"",error:""}),F=Vc(null),N=n.find((T)=>T.id===$)||n[0]||null,L=ML(N),w=CL(N),W=pL(N),K=N?j.health[N.id]:null,q=N?tc(f,N.id,"/"):"about:blank";t7(()=>{if(n.length===0)return;if(!$||!n.some((T)=>T.id===$))r(n[0].id)},[n.map((T)=>T.id).join(",")]),t7(()=>{let T=0,c=setInterval(()=>{if(T+=1,M7(F.current)||T>=24)clearInterval(c)},500);return()=>clearInterval(c)},[q]),t7(()=>{if(n.length===0)return;let T=!1;async function c(){J((p)=>({...p,loading:!0,error:""}));let S=await Promise.all(n.map(async(p)=>{try{let Y=await Sc(Dc(f,p.id));return[p.id,{ok:!0,body:Y}]}catch(Y){return[p.id,{ok:!1,error:cu(Y,"File Browser health failed")}]}}));if(T)return;J({loading:!1,refreshedAt:new Date().toISOString(),health:Object.fromEntries(S),error:""})}c();let X=setInterval(c,30000);return()=>{T=!0,clearInterval(X)}},[n.map((T)=>`${T.id}:${T.runtime?.providerStatus||""}`).join(","),f]);function z(T){r(T);let c=new URL(window.location.href);c.searchParams.set("target",T),window.history.replaceState({},"",`${c.pathname}${c.search}`)}async function Z(){if(Q.exporting)return;U({exporting:!0,message:"",error:""});try{let T=new Date().toISOString().replace(/[-:.TZ]/g,"").slice(0,14);await Cc(F.current,`unidesk-filebrowser-${N?.id||"target"}-${T}.png`),U({exporting:!1,message:"截图已导出",error:""})}catch(T){U({exporting:!1,message:"",error:cu(T,"截图导出失败")})}}if(n.length===0)return Pu(cc,{title:"File Browser 未登记",text:"请在 config.json 的 microservices 中登记 id=filebrowser 或 filebrowser-* 用户服务"});return Pu("div",{className:"filebrowser-page","data-testid":"filebrowser-page"},j.error?Pu(ul,{error:j.error,wide:!0}):null,Pu(S7,{title:"文件管理器",eyebrow:"File Browser / Host Files",loading:j.loading,actions:Pu("div",{className:"panel-actions"},N?Pu("button",{type:"button",className:"ghost-btn",onClick:Z,disabled:Q.exporting,"data-testid":"filebrowser-export-screenshot"},Q.exporting?"导出中...":"导出截图"):null,N?Pu("a",{className:"ghost-btn",href:q,target:"_blank",rel:"noreferrer"},"新窗口打开"):null,N?Pu(Bc,{title:"File Browser 当前目标",data:{service:N,health:K},onOpen:l,testId:"raw-filebrowser-active"}):null)},Pu("div",{className:"filebrowser-hero"},Pu("div",null,Pu("span",{className:`status-badge ${f4(K?.body)?"ok":"warn"}`},f4(K?.body)?"Health OK":"Health Pending"),Pu("h3",null,N?.name||"File Browser"),Pu("p",{className:"muted paragraph"},N?.description||"通过 UniDesk 登录态代理访问,不开放 File Browser 公网端口。"),Q.error?Pu("p",{className:"filebrowser-shot-error"},Q.error):null,Q.message?Pu("p",{className:"filebrowser-shot-ok"},Q.message):null),Pu("div",{className:"microservice-ref-card"},Pu("span",null,"Provider"),Pu("strong",null,N?.providerId||"--"),Pu("code",null,L.providerName||N?.providerId||"--")),Pu("div",{className:"microservice-ref-card"},Pu("span",null,"Private Backend"),Pu("strong",null,`${w.nodeBindHost||"--"}:${w.nodePort||"--"}`),Pu("code",null,w.nodeBaseUrl||"--")),Pu("div",{className:"microservice-ref-card"},Pu("span",null,"Image"),Pu("strong",null,W.dockerfile||"filebrowser/filebrowser:v2.63.3"),Pu("code",null,W.commitId||"--")),Pu("div",{className:"microservice-ref-card"},Pu("span",null,"Mount"),Pu("strong",null,mL(N)),Pu("code",null,N?.providerId==="main-server"?"/root, /var, /home":"/home, /mnt/c, /mnt/d")))),Pu(S7,{title:"浏览目标",eyebrow:`${n.length} host targets`,loading:j.loading},Pu("div",{className:"filebrowser-target-grid"},n.map((T)=>Pu(Pc,{key:T.id,service:T,active:T.id===N?.id,health:j.health[T.id],onSelect:()=>z(T.id),onRaw:l})))),Pu(S7,{title:`${Yc(N)} 文件视图`,eyebrow:K?.body?`Health ${f4(K.body)?"OK":"UNKNOWN"} / ${j.refreshedAt?Al(j.refreshedAt):"--"}`:"Embedded WebUI",className:"filebrowser-frame-panel"},Pu("div",{className:"filebrowser-frame-shell"},Pu("div",{className:"filebrowser-frame-toolbar"},Pu("span",null,"BaseURL"),Pu("code",null,`/api/microservices/${N?.id||"filebrowser"}/proxy`),Pu("span",null,"Root"),Pu("code",null,"/srv"),Pu("span",{className:"filebrowser-compact-note"},"Compact layout injected")),Pu("iframe",{ref:F,key:q,title:`${N?.name||"File Browser"} WebUI`,src:q,className:"filebrowser-frame","data-testid":"filebrowser-frame",onLoad:(T)=>M7(T.currentTarget),sandbox:"allow-downloads allow-forms allow-modals allow-same-origin allow-scripts"}))))}var _4=bu(Wl(),1);var qu=_4.default.createElement,{useEffect:pc}=_4.default,mc=_4.default.useState;function n4({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return qu("span",{className:`status-badge ${f}`},l||u||"unknown")}function yi({label:u,value:l,hint:f,tone:n}){return qu("article",{className:`metric-card ${n||""}`},qu("div",{className:"metric-label"},u),qu("div",{className:"metric-value"},l),qu("div",{className:"metric-hint"},f))}function i4({title:u,eyebrow:l,actions:f,children:n,className:i,loading:y}){return qu("section",{className:`panel ${i||""}`},qu("div",{className:"panel-head"},qu("div",null,l?qu("p",{className:"panel-eyebrow"},l):null,qu(nl,{title:u,loading:y})),f?qu("div",{className:"panel-actions"},f):null),qu("div",{className:"panel-body"},n))}function y4({title:u,data:l,onOpen:f,testId:n}){return qu("button",{type:"button",className:"ghost-btn","data-testid":n,onClick:()=>f(u,l)},"查看原始JSON")}function C7({title:u,text:l}){return qu("div",{className:"empty-state"},qu("strong",null,u),qu("span",null,l))}function xc(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function Rc(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function bc(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function iy(u,l){let f=u&&typeof u==="object"?u[l]:void 0;return Number.isFinite(Number(f))?String(f):"--"}function kc(u){return(Array.isArray(u?.jobs)?u.jobs:[]).slice(0,40)}function hc(u){return(Array.isArray(u?.drafts)?u.drafts:[]).slice(0,12)}function bL({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let n=u.find((N)=>N.id==="findjob")||null,[i,y]=mc({loading:!1,error:"",health:null,summary:null,jobs:null,drafts:null,refreshedAt:null});async function _(){if(!n)return;y((N)=>({...N,loading:!0,error:""}));try{let[N,L,w,W]=await Promise.all([Zu(`${f}/microservices/findjob/health`),Zu(`${f}/microservices/findjob/proxy/api/summary`),Zu(`${f}/microservices/findjob/proxy/api/jobs?__unideskArrayLimit=jobs:40`),Zu(`${f}/microservices/findjob/proxy/api/drafts`)]);y({loading:!1,error:"",health:N,summary:L,jobs:w,drafts:W,refreshedAt:new Date})}catch(N){y((L)=>({...L,loading:!1,error:cu(N,"FindJob 加载失败")}))}}if(pc(()=>{_()},[n?.id,n?.runtime?.providerStatus]),!n)return qu(C7,{title:"FindJob 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=findjob"});let $=xc(n),r=bc(n),j=Rc(n),J=i.summary||{},Q=kc(i.jobs),U=hc(i.drafts),F=i.jobs?._unidesk?.arrayLimits?.jobs;return qu("div",{className:"findjob-page","data-testid":"findjob-page"},qu(i4,{title:"FindJob 工作台",eyebrow:"D601 用户服务",loading:i.loading,actions:qu("div",{className:"panel-actions"},qu("button",{type:"button",className:"ghost-btn",onClick:_,disabled:i.loading,"data-testid":"findjob-refresh-button"},i.loading?"刷新中":"刷新"),qu(y4,{title:"FindJob 用户服务",data:n,onOpen:l,testId:"raw-findjob-service"}))},qu("div",{className:"findjob-hero"},qu("div",null,qu("div",{className:"node-version-line"},qu(n4,{status:$.providerStatus==="online"?"online":"warn"},$.providerStatus||"unknown"),qu("span",null,n.providerId),qu("span",null,j.public?"公网暴露":"仅 UniDesk frontend 代理访问")),qu("p",{className:"muted paragraph"},n.description)),qu("div",{className:"microservice-ref-card"},qu("span",null,"Repo"),qu("strong",null,r.url||"--"),qu("code",null,r.commitId||"--")),qu("div",{className:"microservice-ref-card"},qu("span",null,"D601 Docker"),qu("strong",null,`${j.nodeBindHost||"--"}:${j.nodePort||"--"}`),qu("code",null,`${r.composeFile||"--"} / ${r.composeService||"--"}`))),qu(ul,{error:i.error,wide:!0})),qu("div",{className:"findjob-grid"},qu(i4,{title:"岗位指标",eyebrow:i.refreshedAt?`Updated ${Al(i.refreshedAt)}`:"Summary",loading:i.loading},qu("div",{className:"metric-grid"},qu(yi,{label:"岗位总量",value:iy(J,"totalJobs"),hint:"tracked jobs",tone:"ok"}),qu(yi,{label:"原始岗位",value:iy(J,"rawJobs"),hint:"raw queue"}),qu(yi,{label:"已验证",value:iy(J,"verifiedJobs"),hint:"verified set"}),qu(yi,{label:"优先处理",value:iy(J,"prioritizedJobs"),hint:"prioritized"}),qu(yi,{label:"过期",value:iy(J,"staleJobs"),hint:"stale jobs",tone:"warn"}),qu(yi,{label:"无效",value:iy(J,"invalidJobs"),hint:"invalid jobs",tone:"warn"}),qu(yi,{label:"上海",value:iy(J,"shanghaiJobs"),hint:"city filter"}),qu(yi,{label:"Health",value:i.health?.ok?"OK":"--",hint:"D601 /api/health"})),qu("div",{className:"panel-actions inline-actions"},qu(y4,{title:"FindJob Summary",data:J,onOpen:l,testId:"raw-findjob-summary"}))),qu(i4,{title:"近期岗位",eyebrow:F?`${F.returnedLength}/${F.originalLength} Preview`:`${Q.length} Preview`,loading:i.loading},Q.length===0?qu(C7,{title:"暂无岗位预览",text:"等待 D601 findjob backend 返回 /api/jobs"}):qu("div",{className:"table-wrap findjob-job-table"},qu("table",null,qu("thead",null,qu("tr",null,qu("th",null,"优先级"),qu("th",null,"状态"),qu("th",null,"单位"),qu("th",null,"职位"),qu("th",null,"城市"),qu("th",null,"阶段"),qu("th",null,"截止"),qu("th",null,"证据"))),qu("tbody",null,Q.map((N)=>qu("tr",{key:N.id},qu("td",null,qu(n4,{status:String(N.priority||"").toLowerCase()||"unknown"},N.priority||"--")),qu("td",null,qu(n4,{status:String(N.status||"").toLowerCase()||"unknown"},N.status||"--")),qu("td",null,N.organization_name||"--",qu("code",null,N.id||"--")),qu("td",null,N.display_title||N.title||"--"),qu("td",null,N.display_city||N.city||"--"),qu("td",null,N.workflow_stage||"--"),qu("td",null,N.deadline||"--"),qu("td",null,N.evidence_url?qu("a",{href:N.evidence_url,target:"_blank",rel:"noreferrer"},"打开"):qu("span",{className:"muted"},"无"))))))),qu("div",{className:"panel-actions inline-actions"},qu(y4,{title:"FindJob Jobs Preview",data:i.jobs,onOpen:l,testId:"raw-findjob-jobs"}))),qu(i4,{title:"草稿与报告",eyebrow:`${U.length} Drafts`,loading:i.loading},U.length===0?qu(C7,{title:"暂无草稿",text:"D601 findjob backend 未返回 drafts"}):qu("div",{className:"draft-list"},U.map((N)=>qu("article",{key:N.id,className:"draft-card"},qu("div",{className:"node-card-head"},qu("strong",null,N.id),qu(n4,{status:N.status},N.status||"--")),qu("div",{className:"docker-meta compact"},qu("span",null,N.workflow_stage||"--"),qu("span",null,`jobs ${N.counts?.jobs??0}`),qu("span",null,`reports ${N.counts?.reports??0}`)),qu("span",null,N.latestReportPath||"暂无报告"),qu("code",null,Hu(N.updated_at||N.updatedAt))))),qu("div",{className:"panel-actions inline-actions"},qu(y4,{title:"FindJob Drafts",data:i.drafts,onOpen:l,testId:"raw-findjob-drafts"})))))}var kL=bu(Wl(),1);var ou=kL.default.createElement,yy="http://74.48.78.17:6666";function Ic({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return ou("span",{className:`status-badge ${f}`},l||u||"unknown")}function vc({title:u,eyebrow:l,actions:f,children:n,className:i}){return ou("section",{className:`panel ${i||""}`},ou("div",{className:"panel-head"},ou("div",null,l?ou("p",{className:"panel-eyebrow"},l):null,ou(nl,{title:u,loading:!1})),f?ou("div",{className:"panel-actions"},f):null),ou("div",{className:"panel-body"},n))}function gc({title:u,text:l}){return ou("div",{className:"empty-state"},ou("strong",null,u),ou("span",null,l))}function sc({href:u,children:l,testId:f,primary:n=!1}){return ou("a",{className:n?"primary-btn compact":"ghost-btn compact",href:u,target:"_blank",rel:"noreferrer","data-testid":f},l)}function ac({onClick:u,children:l,testId:f,primary:n=!1}){return ou("button",{type:"button",className:n?"primary-btn compact":"ghost-btn compact",onClick:u,"data-testid":f},l)}function hL(){return ou("div",{className:"microservice-page hwlab-page","data-testid":"hwlab-page"},ou(vc,{title:"HWLAB",eyebrow:"External Static Entry",actions:ou("span",{className:"panel-link-badge"},ou(Ic,{status:"external"},"external"))},ou("div",{className:"hwlab-hero"},ou("div",{className:"hwlab-hero-copy"},ou("p",{className:"panel-eyebrow"},"Static Link"),ou("h2",null,"HWLAB"),ou("p",{className:"muted paragraph"},"这是一个外部静态入口,不经过 UniDesk 后端代理,不纳入 microservice health。")),ou("div",{className:"hwlab-actions"},ou(ac,{primary:!0,testId:"hwlab-open-current",onClick:()=>window.location.assign(yy)},"当前窗口打开"),ou(sc,{href:yy,testId:"hwlab-open-new"},"新窗口打开"))),ou("div",{className:"metric-grid hwlab-metrics"},ou("article",{className:"metric-card"},ou("div",{className:"metric-label"},"入口类型"),ou("div",{className:"metric-value"},"external"),ou("div",{className:"metric-hint"},"static link only")),ou("article",{className:"metric-card"},ou("div",{className:"metric-label"},"目标 URL"),ou("div",{className:"metric-value hwlab-url"},yy),ou("div",{className:"metric-hint"},"fixed destination")),ou("article",{className:"metric-card"},ou("div",{className:"metric-label"},"后端依赖"),ou("div",{className:"metric-value"},"none"),ou("div",{className:"metric-hint"},"no proxy / no health")),ou("article",{className:"metric-card"},ou("div",{className:"metric-label"},"打开方式"),ou("div",{className:"metric-value"},"current or new tab"),ou("div",{className:"metric-hint"},"same style as catalog"))),ou(gc,{title:"外部入口说明",text:"HWLAB 只作为静态跳转目标展示在前端,不会登记到用户服务 health、proxy 或运行态数据中。"})))}var x3=bu(Wl(),1);var k=x3.default.createElement,{useEffect:oc}=x3.default,p7=x3.default.useState;function C3(u){let l=Number(u);return Number.isFinite(l)?`${Math.max(0,Math.min(100,l)).toFixed(1)}%`:"--"}function x7(u){if(u===null||u===void 0||u==="")return"--";let l=Number(u);if(!Number.isFinite(l))return"--";if(l<60)return`${Math.max(0,Math.round(l))}s`;if(l<3600)return`${Math.floor(l/60)}m ${Math.round(l%60)}s`;return`${Math.floor(l/3600)}h ${Math.floor(l%3600/60)}m`}function R7(u,l=2){let f=Number(u);if(!Number.isFinite(f))return u===!1?"false":u===!0?"true":"--";let n=Math.abs(f);if(Number.isInteger(f)||n>=1000)return f.toLocaleString("zh-CN",{maximumFractionDigits:0});if(n>=1)return f.toLocaleString("zh-CN",{maximumFractionDigits:l});return f.toLocaleString("zh-CN",{maximumFractionDigits:Math.max(l,6)})}function m3(u){if(u===null||u===void 0||u==="")return"--";if(typeof u==="boolean")return u?"true":"false";if(typeof u==="number")return R7(u,4);if(Array.isArray(u))return u.map((l)=>m3(l)).join(" x ");if(typeof u==="object")return"已上报";return String(u)}function $4(u){let l=Number(u);if(!Number.isFinite(l)||l<=0)return"--";let f=l>=100?0:l>=10?1:2;return`${l.toLocaleString("zh-CN",{maximumFractionDigits:f})} epoch/h`}function r4(u){return u.replace(/[^a-zA-Z0-9_-]/g,"-")}function n0(u){return u&&typeof u==="object"&&!Array.isArray(u)?u:{}}function p3({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return k("span",{className:`status-badge ${f}`},l||u||"unknown")}function _i({label:u,value:l,hint:f,tone:n}){return k("article",{className:`metric-card ${n||""}`},k("div",{className:"metric-label"},u),k("div",{className:"metric-value"},l),k("div",{className:"metric-hint"},f))}function m7({title:u,eyebrow:l,actions:f,children:n,className:i,loading:y}){return k("section",{className:`panel ${i||""}`},k("div",{className:"panel-head"},k("div",null,l?k("p",{className:"panel-eyebrow"},l):null,k(nl,{title:u,loading:y})),f?k("div",{className:"panel-actions"},f):null),k("div",{className:"panel-body"},n))}function B_({title:u,data:l,onOpen:f,testId:n}){return k("button",{type:"button",className:"ghost-btn","data-testid":n,onClick:(i)=>{i?.stopPropagation?.(),f(u,l)}},"查看原始JSON")}function j1({title:u,text:l}){return k("div",{className:"empty-state"},k("strong",null,u),k("span",null,l))}function dc(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function ec(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function uX(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function lX(u){return u?.counts&&typeof u.counts==="object"&&!Array.isArray(u.counts)?u.counts:{}}function fX(u){return Array.isArray(u?.jobs)?u.jobs.slice(0,240):[]}function nX(u){return Array.isArray(u?.projects)?u.projects.slice(0,1000):[]}function A4(u){return Array.isArray(u?.projects)?u.projects:[]}function iX(u,l){if(Array.isArray(l?.gpu))return l.gpu;if(Array.isArray(u?.gpu))return u.gpu;return[]}function w0(u,l){return`${u}/microservices/met-nonlinear/proxy${l}`}function IL(u){return u.startedAt&&u.finishedAt?x7((Date.parse(u.finishedAt)-Date.parse(u.startedAt))/1000):"--"}function yX(u){let l=u.progress||{};if(l.etaSeconds!==null&&l.etaSeconds!==void 0&&l.etaSeconds!==""){let _=Number(l.etaSeconds);if(Number.isFinite(_))return Math.max(0,_)}let f=Number(l.currentEpoch),n=Number(l.epochTarget??u.epochTarget),i=Date.parse(u.startedAt||"");if(!Number.isFinite(f)||f<=0||!Number.isFinite(n)||n<=f||!Number.isFinite(i))return null;let y=Math.max(0,(Date.now()-i)/1000);if(y<=0)return null;return Math.max(0,y/f*(n-f))}function vL(u){let l=u.progress||{},f=Number(l.epochPerHour);if(Number.isFinite(f)&&f>0)return f;let n=Date.parse(u.startedAt||""),i=["succeeded","failed","canceled"].includes(u.status)?Date.parse(u.finishedAt||""):Date.now();if(!Number.isFinite(n)||!Number.isFinite(i)||i<=n)return null;let y=Number(l.currentEpoch??u.epochTarget);if(!Number.isFinite(y)||y<=0)return null;return y/((i-n)/3600000)}function gL(u){if(u==="staged")return"待启动";if(u==="queued")return"排队中";if(u==="running")return"训练中";if(u==="succeeded")return"已完成";if(u==="failed")return"失败";if(u==="canceled")return"已取消";return u||"unknown"}function sL(u,l,f){return{name:u,path:l,depth:f,count:0,children:[],project:null}}function _X(u){let l=sL("","",-1);for(let n of u){let y=String(n?.projectPath||"").replace(/\\/g,"/").split("/").filter(Boolean);if(y.length===0)continue;let _=l,$=[];for(let[r,j]of y.entries()){$.push(j);let J=$.join("/"),Q=_.children.find((U)=>U.path===J);if(!Q)Q=sL(j,J,r),_.children.push(Q);if(r===y.length-1)Q.project=n;_=Q}}let f=(n)=>{let i=n.children.reduce((y,_)=>y+f(_),0);return n.count=(n.project?1:0)+i,n.children.sort((y,_)=>{if(Boolean(y.project)!==Boolean(_.project))return y.project?1:-1;return y.name.localeCompare(_.name,"zh-CN",{numeric:!0,sensitivity:"base"})}),n.count};return f(l),l}function $X(u){let l=n0(u.data);return n0(l.project).projectPath?n0(l.project):l}function rX(u){return n0(n0(u.data).job)}function aL({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let n=u.find((b)=>b.id==="met-nonlinear")||null,[i,y]=p7({loading:!1,actionBusy:!1,error:"",health:null,summary:null,queue:null,projects:null,history:null,images:null,refreshedAt:null}),[_,$]=p7({loading:!1,error:"",kind:"",key:"",title:"",data:null}),[r,j]=p7(()=>({activeTab:"projects",selectedProjects:{},expandedProjectDirs:{},sourceProject:"",forkCount:1,forkEpochs:200,forkPrefix:`ui_fork_${Date.now()}`,maxConcurrency:3,targetGpuName:"2080 Ti",actionMessage:""}));function J(b){j((o)=>({...o,...b}))}async function Q(b=r.activeTab){if(!n)return;y((o)=>({...o,loading:!0,error:""}));try{let o=[["health",Zu(`${f}/microservices/met-nonlinear/health`)],["summary",Zu(w0(f,"/api/summary"))]];if(b==="projects")o.push(["projectsRoot",Zu(w0(f,"/api/projects?root=projects&limit=500"))]),o.push(["exProjectsRoot",Zu(w0(f,"/api/projects?root=ex_projects&limit=500"))]);if(b==="current"||b==="completed"||b==="failed")o.push(["queue",Zu(w0(f,"/api/queue"))]);if(b==="completed"||b==="failed")o.push(["history",Zu(w0(f,"/api/history"))]);if(b==="gpu")o.push(["images",Zu(w0(f,"/api/images"))]);let nu=Object.fromEntries(await Promise.all(o.map(async([e,zu])=>[e,await zu]))),wu={loading:!1,actionBusy:!1,error:"",health:nu.health,summary:nu.summary,refreshedAt:new Date};if(nu.projectsRoot||nu.exProjectsRoot){let{projectsRoot:e,exProjectsRoot:zu}=nu;wu.projects={ok:e?.ok!==!1&&zu?.ok!==!1,roots:[{root:"projects",count:A4(e).length},{root:"ex_projects",count:A4(zu).length}],projects:[...A4(e),...A4(zu)]}}if(nu.queue)wu.queue=nu.queue;if(nu.history)wu.history=nu.history;if(nu.images)wu.images=nu.images;y((e)=>({...e,...wu}))}catch(o){y((nu)=>({...nu,loading:!1,actionBusy:!1,error:cu(o,"MET Nonlinear 加载失败")}))}}async function U(b,o){y((nu)=>({...nu,actionBusy:!0,error:""})),J({actionMessage:`${b}...`});try{let nu=await o();J({actionMessage:nu||`${b}完成`}),await Q()}catch(nu){y((wu)=>({...wu,actionBusy:!1,error:cu(nu,`${b}失败`)}))}}async function F(){await U("保存并发设置",async()=>{await Zu(w0(f,"/api/queue/settings"),{method:"PUT",body:JSON.stringify({maxConcurrency:Number(r.maxConcurrency),targetGpuName:r.targetGpuName})})})}function N(){return Object.entries(r.selectedProjects).filter(([,b])=>b).map(([b])=>b)}async function L(){let b=N();if(b.length===0)throw Error("请先选择至少一个 project");await U("加入待启动队列",async()=>{await Zu(w0(f,"/api/queue"),{method:"POST",body:JSON.stringify({projectPaths:b,maxConcurrency:Number(r.maxConcurrency),targetGpuName:r.targetGpuName,start:!1})}),J({activeTab:"current",selectedProjects:{}})})}async function w(){let b=r.sourceProject||m[0]?.projectPath;if(!b)throw Error("请先选择源 project");await U("Fork Project",async()=>{let o=await Zu(w0(f,"/api/projects/fork"),{method:"POST",body:JSON.stringify({sourceProject:b,count:Number(r.forkCount),epochs:Number(r.forkEpochs),prefix:r.forkPrefix})}),nu=Array.isArray(o.projectPaths)?o.projectPaths:[],wu=nu.reduce((e,zu)=>{return e[zu]=!0,e},{...r.selectedProjects});return J({selectedProjects:wu}),`已 fork ${nu.length} 个 project,并已自动勾选;请确认后点击加入待启动队列。`})}async function W(){await U("启动队列",async()=>{await Zu(w0(f,"/api/queue/start"),{method:"POST",body:JSON.stringify({maxConcurrency:Number(r.maxConcurrency),targetGpuName:r.targetGpuName})}),J({activeTab:"current"})})}async function K(b){await U("取消任务",async()=>{await Zu(w0(f,`/api/jobs/${encodeURIComponent(b.id)}/cancel`),{method:"POST",body:JSON.stringify({})})})}async function q(b){let o=String(b?.projectPath||"");if(!o)return;$({loading:!0,error:"",kind:"project",key:o,title:o,data:null});try{let nu=await Zu(w0(f,`/api/projects/config?path=${encodeURIComponent(o)}`));$({loading:!1,error:"",kind:"project",key:o,title:o,data:nu})}catch(nu){$({loading:!1,error:cu(nu,"Project 详情加载失败"),kind:"project",key:o,title:o,data:null})}}async function z(b){let o=String(b?.id||"");if(!o)return;$({loading:!0,error:"",kind:"job",key:o,title:b.projectPath||o,data:null});try{let nu=await Zu(w0(f,`/api/jobs/${encodeURIComponent(o)}`));$({loading:!1,error:"",kind:"job",key:o,title:nu?.job?.projectPath||b.projectPath||o,data:nu})}catch(nu){$({loading:!1,error:cu(nu,"Job 详情加载失败"),kind:"job",key:o,title:b.projectPath||o,data:null})}}if(oc(()=>{Q(r.activeTab)},[n?.id,n?.runtime?.providerStatus,r.activeTab]),!n)return k(j1,{title:"MET Nonlinear 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=met-nonlinear"});let Z=dc(n),T=uX(n),c=ec(n),X=lX(i.queue?.queue||i.summary?.queue),S=iX(i.health,i.queue),p=i.health?.targetGpu||i.summary?.targetGpu||S.find((b)=>String(b.name||"").includes("2080")),Y=i.images?.mlImage||i.health?.image||{},t=fX(i.queue),m=nX(i.projects),V=_X(m),D=r.sourceProject||m[0]?.projectPath||"",M=t.filter((b)=>["staged","queued","running"].includes(b.status)),I=t.filter((b)=>b.status==="succeeded"),O=t.filter((b)=>["failed","canceled"].includes(b.status)),C=Array.isArray(i.history?.jobs)?i.history.jobs.slice(0,120):[],g=[{id:"projects",label:"项目库",count:m.length},{id:"current",label:"当前队列",count:M.length||Number(X.staged||0)+Number(X.queued||0)+Number(X.running||0)},{id:"completed",label:"已完成",count:I.length||Number(X.succeeded||0)},{id:"failed",label:"失败诊断",count:O.length||Number(X.failed||0)+Number(X.canceled||0)},{id:"gpu",label:"GPU/镜像",count:S.length}];function a(b,o){if(b.length===0)return k(j1,{title:o==="current"?"当前队列为空":"暂无记录",text:o==="current"?"从项目库选择或 fork project 后先加入待启动队列,再启动队列。":"终态任务会显示耗时、exit code 和失败诊断。"});return k("div",{className:"table-wrap met-job-table"},k("table",null,k("thead",null,k("tr",null,k("th",null,"状态"),k("th",null,"Project"),k("th",null,"Epoch"),k("th",null,"速度"),k("th",null,"ETA/耗时"),k("th",null,"GPU"),k("th",null,"Exit"),k("th",null,"更新时间"),k("th",null,"操作"))),k("tbody",null,b.map((nu)=>{let wu=nu.progress||{},e=["staged","queued","running"].includes(nu.status),zu=_.kind==="job"&&_.key===nu.id;return k("tr",{key:nu.id,className:`met-click-row ${zu?"active":""}`,onClick:()=>z(nu),"data-testid":`met-job-row-${r4(nu.id)}`},k("td",null,k(p3,{status:nu.status},gL(nu.status))),k("td",null,k("button",{type:"button",className:"met-inline-link",onClick:(v)=>{v.stopPropagation(),z(nu)}},nu.projectPath),k("code",null,nu.id)),k("td",null,k("span",null,`${wu.currentEpoch??"--"} / ${wu.epochTarget??nu.epochTarget??"--"}`),k("div",{className:"met-progress"},k("span",{style:{width:C3(wu.progressPercent)}}))),k("td",null,k("strong",null,$4(vL(nu)))),k("td",null,nu.status==="succeeded"||nu.status==="failed"||nu.status==="canceled"?IL(nu):nu.status==="running"?`ETA ${x7(yX(nu))}`:"--"),k("td",null,nu.gpuName||"--"),k("td",null,nu.exitCode??"--"),k("td",null,Hu(nu.updatedAt)),k("td",null,e?k("button",{type:"button",className:"ghost-btn mini",onClick:(v)=>{v.stopPropagation(),K(nu)},disabled:i.actionBusy},"取消"):null,k(B_,{title:`MET Job ${nu.id}`,data:nu,onOpen:l,testId:`raw-met-job-${nu.id}`})))}))))}function iu(){return k("div",{className:"met-queue-summary","data-testid":"met-current-summary"},k(p3,{status:"staged"},`待启动 ${X.staged??0}`),k(p3,{status:"queued"},`排队中 ${X.queued??0}`),k(p3,{status:"running"},`训练中 ${X.running??0}`),k("span",null,`最大并发 ${i.summary?.queue?.maxConcurrency??i.queue?.queue?.maxConcurrency??r.maxConcurrency}`),k("span",null,`目标 GPU ${i.summary?.queue?.targetGpuName??i.queue?.queue?.targetGpuName??r.targetGpuName}`))}function Au(b,o){let nu=r.expandedProjectDirs[b];return nu===void 0?o<2:Boolean(nu)}function R(b,o){let nu=Au(b,o);J({expandedProjectDirs:{...r.expandedProjectDirs,[b]:!nu}})}function x(b){let o=8+Math.max(0,b.depth)*16;if(Boolean(b.project)){let e=b.project,zu=Boolean(r.selectedProjects[e.projectPath]),v=_.kind==="project"&&_.key===e.projectPath;return k("div",{key:b.path,className:`met-tree-row project ${zu?"selected":""} ${v?"active":""}`,style:{paddingLeft:o},onClick:()=>q(e),"data-testid":`met-project-node-${r4(e.projectPath)}`},k("div",{className:"met-tree-name"},k("input",{type:"checkbox",checked:zu,onClick:($u)=>$u.stopPropagation(),onChange:($u)=>J({selectedProjects:{...r.selectedProjects,[e.projectPath]:$u.target.checked}}),"data-testid":`met-project-checkbox-${r4(e.projectPath)}`}),k("button",{type:"button",className:"met-inline-link project-path",onClick:($u)=>{$u.stopPropagation(),q(e)}},b.name)),k("span",null,e.useModel||"--"),k("span",null,e.epochTrain??"--"),k("span",null,C3(e.progress?.progressPercent)),k("span",null,$4(e.progress?.epochPerHour)))}let wu=Au(b.path,b.depth);return k(x3.default.Fragment,{key:b.path},k("div",{className:"met-tree-row folder",style:{paddingLeft:o},"data-testid":`met-project-folder-${r4(b.path)}`},k("button",{type:"button",className:"met-tree-toggle",onClick:()=>R(b.path,b.depth),"aria-label":wu?`折叠 ${b.path}`:`展开 ${b.path}`},wu?"-":"+"),k("strong",null,b.name),k("span",{className:"met-tree-count"},`${b.count} projects`)),wu?b.children.map((e)=>x(e)):null)}function fu(b){return k("div",{className:"met-detail-kv"},b.map((o)=>k("div",{key:o.label,className:"met-detail-kv-item"},k("span",null,o.label),k("strong",null,m3(o.value)),o.hint?k("small",null,o.hint):null)))}function yu(b,o){return k("div",{className:"met-detail-section"},k("h3",null,b),fu(o))}function Ju(b){if(!Array.isArray(b)||b.length===0)return k(j1,{title:"模型层未上报",text:"等待 data/model_info.json 或 compute_analysis.json 生成。"});return k("div",{className:"table-wrap met-layer-table"},k("table",null,k("thead",null,k("tr",null,k("th",null,"Layer"),k("th",null,"Type"),k("th",null,"Params"),k("th",null,"Trainable"),k("th",null,"Compute"))),k("tbody",null,b.slice(0,18).map((o,nu)=>k("tr",{key:`${o.name||"layer"}-${nu}`},k("td",null,o.name||`#${nu+1}`),k("td",null,o.type||"--"),k("td",null,R7(o.num_params)),k("td",null,o.trainable===void 0?"--":String(Boolean(o.trainable))),k("td",null,R7(o.compute?.total??o.estimated_cost?.weighted_units?.total)))))))}function Vu(b){let o=Array.isArray(b)?b:[];if(o.length===0)return k(j1,{title:"data/ 暂无文件",text:"训练或评估完成后会生成 training_state、metrics、model_info 等文件。"});return k("div",{className:"met-file-chip-grid"},o.slice(0,48).map((nu)=>k("span",{key:nu},nu)),o.length>48?k("span",null,`+${o.length-48}`):null)}function Lu(b){let o=String(b||"").replace(/\x1b\[[0-9;]*[A-Za-z]/g,"").split(/\r?\n/).map((nu)=>nu.trim()).filter(Boolean).slice(-12);if(o.length===0)return k(j1,{title:"暂无日志尾部",text:"该任务未上报 logTail 或日志已轮转。"});return k("div",{className:"met-log-lines"},o.map((nu,wu)=>k("div",{key:`${wu}-${nu.slice(0,16)}`},nu)))}function Bu(){if(_.loading)return k("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},k("div",{className:"panel-head compact"},k("div",null,k("p",{className:"panel-eyebrow"},"Detail Loading"),k(nl,{title:"详情加载中",loading:!0}))),k(j1,{title:"详情加载中",text:_.title||"正在读取 D601 data/ 和 config.json"}));if(_.error)return k("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},k(ul,{error:_.error,wide:!0}));if(!_.data)return k("section",{className:"met-detail-panel muted","data-testid":"met-detail-panel"},k(j1,{title:"选择一个项目或任务查看详情",text:"项目库、当前队列、已完成和失败诊断中的行都可以点击;默认只展示结构化字段,原始 JSON 需显式点击按钮。"}));let b=$X(_),o=rX(_),nu=n0(b.config),wu=n0(b.progress||o.progress),e=n0(b.data),zu=n0(b.metrics||e.metrics||wu.trainingInfo?.evaluation_metrics),v=n0(e.trainingInfo||wu.trainingInfo),$u=n0(e.trainingState),Wu=n0(b.model||e.model),Du=Array.isArray(Wu.modelSummary)&&Wu.modelSummary.length>0?Wu.modelSummary:Wu.computeLayers,ku=n0(v.evaluation_metrics),$l=_.kind==="job"?"训练任务详情":"Project 详情";return k("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},k("div",{className:"panel-head compact"},k("div",null,k("p",{className:"panel-eyebrow"},_.kind==="job"?"Job + Project Detail":"Project Library Detail"),k(nl,{title:$l}),k("code",null,b.projectPath||o.projectPath||_.title)),k("div",{className:"panel-actions"},k(B_,{title:`MET ${$l}`,data:_.data,onOpen:l,testId:"raw-met-detail"}))),_.kind==="job"?yu("任务状态",[{label:"Job ID",value:o.id},{label:"状态",value:gL(o.status)},{label:"GPU",value:o.gpuName},{label:"Exit Code",value:o.exitCode},{label:"耗时",value:IL(o)},{label:"训练速度",value:$4(vL({...o,progress:wu}))}]):null,yu("config.json",[{label:"use_model",value:nu.use_model},{label:"epoch_train",value:nu.epoch_train},{label:"step_per_epoch",value:nu.step_per_epoch},{label:"learning_rate",value:nu.learning_rate},{label:"using_gpu",value:nu.using_gpu},{label:"use_points",value:nu.use_points},{label:"sample_rate",value:nu.sample_rate},{label:"time_clipped_s",value:nu.time_clipped_s},{label:"H_UNITS",value:nu.H_UNITS},{label:"INNER_KAN_UNITS",value:nu.INNER_KAN_UNITS},{label:"INNER_KAN_LAYERS",value:nu.INNER_KAN_LAYERS},{label:"GRID_SIZE",value:nu.GRID_SIZE},{label:"SPLINE_ORDER",value:nu.SPLINE_ORDER},{label:"USE_FAST_MODEL",value:nu.USE_FAST_MODEL},{label:"IIR_TRAINABLE",value:nu.IIR_TRAINABLE}]),yu("data/ 训练状态",[{label:"Epoch",value:`${wu.currentEpoch??$u.current_epoch??$u.completed_epoch??"--"} / ${wu.epochTarget??nu.epoch_train??"--"}`},{label:"Progress",value:C3(wu.progressPercent)},{label:"Last Loss",value:wu.lastLoss??$u.loss},{label:"Last Val Loss",value:wu.lastValLoss??$u.val_loss},{label:"Min Loss",value:v.min_loss??$u.min_loss},{label:"Min Val Loss",value:v.min_val_loss??$u.min_val_loss},{label:"Log Lines",value:wu.logLineCount},{label:"ETA",value:x7(wu.etaSeconds??$u.remaining_time)},{label:"训练速度",value:$4(wu.epochPerHour??$u.smoothed_speed)},{label:"Training Alive",value:$u.training_alive}]),yu("模型参数",[{label:"Model Type",value:Wu.modelType??nu.use_model},{label:"Total Params",value:Wu.totalParams,hint:Wu.totalParams===null||Wu.totalParams===void 0?"未上报":"data/model_info.json"},{label:"Trainable",value:Wu.trainableParams},{label:"Non-trainable",value:Wu.nonTrainableParams},{label:"Compute Cost",value:Wu.computeCost},{label:"Estimate Status",value:Wu.estimateStatus},{label:"Unsupported Layers",value:Wu.unsupportedLayerCount}]),yu("指标",[{label:"train_loss",value:zu.train_loss??ku.train_loss},{label:"val_loss",value:zu.val_loss??ku.val_loss},{label:"train_mae",value:zu.train_mae??ku.train_mae},{label:"val_mae",value:zu.val_mae??ku.val_mae},{label:"train_afmae",value:zu.train_afmae??ku.train_afmae},{label:"val_afmae",value:zu.val_afmae??ku.val_afmae},{label:"freq_drift_hz",value:zu.freq_drift_hz},{label:"sens_drift_percent",value:zu.sens_drift_percent},{label:"linearity_percent",value:zu.linearity_percent},{label:"weights_source",value:zu.weights_source??ku.weights_source},{label:"lr min/mean/max",value:`${m3(v.learning_rate_min)} / ${m3(v.learning_rate_mean)} / ${m3(v.learning_rate_max)}`}]),k("div",{className:"met-detail-section"},k("h3",null,"模型层"),Ju(Du)),k("div",{className:"met-detail-section"},k("h3",null,"data/ 文件"),Vu(e.files)),_.kind==="job"?k("div",{className:"met-detail-section"},k("h3",null,"日志尾部"),Lu(n0(_.data).logTail)):null)}return k("div",{className:"met-page","data-testid":"met-nonlinear-page"},k(m7,{title:"MET Nonlinear 训练编排",eyebrow:"D601 GPU 用户服务",loading:i.loading||i.actionBusy,actions:k("div",{className:"panel-actions"},k("button",{type:"button",className:"ghost-btn",onClick:Q,disabled:i.loading,"data-testid":"met-refresh-button"},i.loading?"刷新中":"刷新"),k(B_,{title:"MET Nonlinear 用户服务",data:n,onOpen:l,testId:"raw-met-service"}))},k("div",{className:"findjob-hero"},k("div",null,k("div",{className:"node-version-line"},k(p3,{status:Z.providerStatus==="online"?"online":"warn"},Z.providerStatus||"unknown"),k("span",null,n.providerId),k("span",null,c.public?"公网暴露":"仅 UniDesk frontend 代理访问")),k("p",{className:"muted paragraph"},n.description)),k("div",{className:"microservice-ref-card"},k("span",null,"Repo"),k("strong",null,T.url||"--"),k("code",null,T.commitId||"--")),k("div",{className:"microservice-ref-card"},k("span",null,"D601 Docker"),k("strong",null,`${c.nodeBindHost||"--"}:${c.nodePort||"--"}`),k("code",null,`${T.composeFile||"--"} / ${T.containerName||"--"}`))),k(ul,{error:i.error,wide:!0}),r.actionMessage?k("div",{className:"met-action-log","data-testid":"met-action-message"},r.actionMessage):null),k("div",{className:"met-grid"},k(m7,{title:"核心状态",eyebrow:i.refreshedAt?`Updated ${Al(i.refreshedAt)}`:"Queue + GPU",loading:i.loading},k("div",{className:"metric-grid"},k(_i,{label:"Staged",value:X.staged??0,hint:"加入队列未开始",tone:Number(X.staged||0)>0?"warn":""}),k(_i,{label:"Queued",value:X.queued??0,hint:"排队等待调度",tone:Number(X.queued||0)>0?"warn":""}),k(_i,{label:"Running",value:X.running??0,hint:`max ${i.summary?.queue?.maxConcurrency??i.queue?.queue?.maxConcurrency??"--"}`,tone:Number(X.running||0)>0?"ok":""}),k(_i,{label:"Succeeded",value:X.succeeded??0,hint:"已完成"}),k(_i,{label:"Failed",value:X.failed??0,hint:"需要诊断",tone:Number(X.failed||0)>0?"warn":""}),k(_i,{label:"2080Ti Free",value:p?C3(Number(p.freeRatio)*100):"--",hint:p?`${p.memoryFreeMiB}/${p.memoryTotalMiB} MiB`:"等待 GPU 上报"}),k(_i,{label:"ML Image",value:Y.present?"READY":"MISSING",hint:Y.image||"met-nonlinear-ml:tf26",tone:Y.present?"ok":"warn"}),k(_i,{label:"Health",value:i.health?.ok?"OK":"--",hint:"D601 /health"}))),k(m7,{title:"队列控制",eyebrow:"Downloader-like staging",loading:i.actionBusy},k("div",{className:"met-control-strip"},k("label",null,"最大并发",k("input",{type:"number",min:1,max:16,value:r.maxConcurrency,"data-testid":"met-max-concurrency-input",onChange:(b)=>J({maxConcurrency:b.target.value})})),k("label",null,"目标 GPU",k("input",{value:r.targetGpuName,"data-testid":"met-target-gpu-input",onChange:(b)=>J({targetGpuName:b.target.value})})),k("button",{type:"button",className:"ghost-btn",onClick:F,disabled:i.actionBusy,"data-testid":"met-save-settings-button"},"保存设置"),k("button",{type:"button",className:"primary-btn",onClick:W,disabled:i.actionBusy||Number(X.staged||0)===0,"data-testid":"met-start-queue-button"},"启动队列")),k("p",{className:"muted paragraph"},"Project 先进入待启动队列,不会立即训练;点击启动队列后才切换为排队中,并由 D601 scheduler 按最大并发和 2080Ti 显存策略调度。")),k("section",{className:"panel met-workspace"},k("div",{className:"met-tabs",role:"tablist"},g.map((b)=>k("button",{key:b.id,type:"button",className:r.activeTab===b.id?"active":"",onClick:()=>J({activeTab:b.id}),"data-testid":`met-tab-${b.id}`},`${b.label} ${b.count}`))),k("div",{className:"panel-body"},r.activeTab==="projects"?k("div",{className:"met-form-grid","data-testid":"met-projects-pane"},k("div",{className:"met-fork-card"},k("h3",null,"Fork Project"),k("label",null,"源 Project",k("select",{value:D,"data-testid":"met-source-project-select",onChange:(b)=>J({sourceProject:b.target.value})},m.map((b)=>k("option",{key:b.projectPath,value:b.projectPath},`${b.projectPath} · ${b.useModel||"model?"}`)))),k("label",null,"Fork 数量",k("input",{type:"number",min:1,max:100,value:r.forkCount,"data-testid":"met-fork-count-input",onChange:(b)=>J({forkCount:b.target.value})})),k("label",null,"训练轮数",k("input",{type:"number",min:1,max:1e5,value:r.forkEpochs,"data-testid":"met-fork-epochs-input",onChange:(b)=>J({forkEpochs:b.target.value})})),k("label",null,"目标前缀",k("input",{value:r.forkPrefix,"data-testid":"met-fork-prefix-input",onChange:(b)=>J({forkPrefix:b.target.value})})),k("button",{type:"button",className:"primary-btn",onClick:w,disabled:i.actionBusy||!D,"data-testid":"met-fork-button"},"Fork Project"),k("p",{className:"muted paragraph"},"Fork 只创建新 Project 并自动勾选,不会直接训练;需要在右侧确认后加入待启动队列。")),k("div",{className:"met-project-list"},k("div",{className:"panel-head compact"},k("div",null,k("p",{className:"panel-eyebrow"},`Existing Projects · ${(i.projects?.roots||[]).map((b)=>`${b.root} ${b.count}`).join(" / ")}`),k(nl,{title:"选择已有 Project",loading:i.loading||i.actionBusy})),k("button",{type:"button",className:"ghost-btn",onClick:L,disabled:i.actionBusy||N().length===0,"data-testid":"met-stage-selected-button"},`加入待启动队列 (${N().length})`)),m.length===0?k(j1,{title:"暂无 project",text:"等待 D601 返回 /api/projects"}):k("div",{className:"met-project-table","data-testid":"met-project-tree"},k("div",{className:"met-tree-header"},k("span",null,"文件树 Project"),k("span",null,"Model"),k("span",null,"Epochs"),k("span",null,"Progress"),k("span",null,"速度")),V.children.map((b)=>x(b)))),Bu()):null,r.activeTab==="current"?k("div",{"data-testid":"met-current-pane"},iu(),a(M,"current"),Bu(),k("div",{className:"panel-actions inline-actions"},k(B_,{title:"MET Queue",data:i.queue,onOpen:l,testId:"raw-met-queue"}))):null,r.activeTab==="completed"?k("div",{"data-testid":"met-completed-pane"},a(I.length>0?I:C.filter((b)=>b.status==="succeeded"),"completed"),Bu()):null,r.activeTab==="failed"?k("div",{"data-testid":"met-failed-pane"},a(O.length>0?O:C.filter((b)=>["failed","canceled"].includes(b.status)),"failed"),Bu(),k("div",{className:"panel-actions inline-actions"},k(B_,{title:"MET History",data:i.history,onOpen:l,testId:"raw-met-history"}))):null,r.activeTab==="gpu"?k("div",{className:"met-gpu-pane","data-testid":"met-gpu-pane"},S.length===0?k(j1,{title:"暂无 GPU 上报",text:"等待 D601 met-nonlinear-ts 或 ML image 提供 nvidia-smi 数据"}):k("div",{className:"table-wrap"},k("table",null,k("thead",null,k("tr",null,k("th",null,"Index"),k("th",null,"Name"),k("th",null,"Free"),k("th",null,"Policy"))),k("tbody",null,S.map((b)=>k("tr",{key:b.index},k("td",null,b.index),k("td",null,b.name),k("td",null,`${b.memoryFreeMiB} / ${b.memoryTotalMiB} MiB`,k("div",{className:"met-progress"},k("span",{style:{width:C3(Number(b.freeRatio)*100)}}))),k("td",null,String(b.name||"").includes("2080")?"target 2080Ti, <20% 限制并发":"non-target")))))),k("div",{className:"panel-actions inline-actions"},k(B_,{title:"MET Images",data:i.images,onOpen:l,testId:"raw-met-images"}))):null))))}var U4=bu(Wl(),1);var Gu=U4.default.createElement,{useEffect:oL,useMemo:AX}=U4.default,j4=U4.default.useState;function dL({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return Gu("span",{className:`status-badge ${f}`},l||u||"unknown")}function R3({label:u,value:l,hint:f,tone:n}){return Gu("article",{className:`metric-card ${n||""}`},Gu("div",{className:"metric-label"},u),Gu("div",{className:"metric-value"},l),Gu("div",{className:"metric-hint"},f))}function J4({title:u,eyebrow:l,actions:f,children:n,className:i,loading:y}){return Gu("section",{className:`panel ${i||""}`},Gu("div",{className:"panel-head"},Gu("div",null,l?Gu("p",{className:"panel-eyebrow"},l):null,Gu(nl,{title:u,loading:y})),f?Gu("div",{className:"panel-actions"},f):null),Gu("div",{className:"panel-body"},n))}function b7({title:u,data:l,onOpen:f,testId:n}){return Gu("button",{type:"button",className:"ghost-btn","data-testid":n,onClick:()=>f(u,l)},"查看原始JSON")}function Q4({title:u,text:l}){return Gu("div",{className:"empty-state"},Gu("strong",null,u),Gu("span",null,l))}function jX(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function JX(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function QX(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function c_(u,l){return`${u}/microservices/mdtodo/proxy${l}`}function eL(u){if(u==="completed")return"已完成";if(u==="in_progress")return"进行中";return"待处理"}function UX(u){if(u==="completed")return"online";if(u==="in_progress")return"warn";return"unknown"}function k7(u){let l=[],f=(n)=>{for(let i of n)if(l.push(i),Array.isArray(i.children))f(i.children)};return f(Array.isArray(u)?u:[]),l}function NX({tasks:u,selectedId:l,onSelect:f}){if(!u.length)return Gu(Q4,{title:"暂无任务",text:"当前文件没有 R 编号任务。"});let n=(i)=>Gu("li",{key:i.id},Gu("button",{type:"button",className:`mdtodo-task-row ${l===i.id?"active":""}`,style:{"--task-depth":Math.min(Number(i.depth||0),6)},onClick:()=>f(i.id),"data-testid":`mdtodo-task-${String(i.id).replace(/[^A-Za-z0-9_-]+/g,"-")}`},Gu(dL,{status:UX(i.status)},eL(i.status)),Gu("code",null,i.id),Gu("span",{className:"mdtodo-task-title"},i.title||"--"),Gu("span",{className:"mdtodo-link-count"},`${i.linkExists??0}/${i.linkCount??0}`)),Array.isArray(i.children)&&i.children.length>0?Gu("ol",null,i.children.map(n)):null);return Gu("ol",{className:"mdtodo-tree"},u.map(n))}function uK({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let n=u.find((p)=>p.id==="mdtodo")||null,[i,y]=j4({loading:!1,saving:!1,error:"",notice:"",health:null,files:[],todo:null,selectedFile:"",selectedTaskId:"",refreshedAt:null,command:null}),[_,$]=j4(""),[r,j]=j4(""),[J,Q]=j4(""),U=Array.isArray(i.todo?.tasks)?i.todo.tasks:[],F=AX(()=>k7(U),[i.todo]),N=F.find((p)=>p.id===i.selectedTaskId)||F[0]||null,L=i.todo?.stats||{};async function w(p=i.selectedFile){if(!n)return;y((Y)=>({...Y,loading:!0,error:"",notice:""}));try{let[Y,t]=await Promise.all([Zu(`${f}/microservices/mdtodo/health`),Zu(c_(f,"/api/files"))]),m=Array.isArray(t.files)?t.files:[],V=p||m[0]?.path||"",D=V?await Zu(c_(f,`/api/tasks?file=${encodeURIComponent(V)}`)):null,M=Array.isArray(D?.tasks)?k7(D.tasks):[],I=M.some((O)=>O.id===i.selectedTaskId)?i.selectedTaskId:M[0]?.id||"";y({loading:!1,saving:!1,error:"",notice:"",health:Y,files:m,todo:D,selectedFile:V,selectedTaskId:I,refreshedAt:new Date,command:i.command})}catch(Y){y((t)=>({...t,loading:!1,error:cu(Y,"MDTODO 加载失败")}))}}if(oL(()=>{w()},[n?.id,n?.runtime?.providerStatus]),oL(()=>{$(N?.title||""),j(N?.rawContent||"")},[N?.id,i.selectedFile]),!n)return Gu(Q4,{title:"MDTODO 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=mdtodo"});let W=jX(n),K=QX(n),q=JX(n);async function z(p){y((Y)=>({...Y,selectedFile:p,selectedTaskId:"",command:null})),await w(p)}async function Z(p){if(!N||!i.selectedFile)return;y((Y)=>({...Y,saving:!0,error:"",notice:""}));try{let Y=await Zu(c_(f,`/api/tasks/${encodeURIComponent(N.id)}`),{method:"PATCH",body:{file:i.selectedFile,...p}});y((t)=>({...t,saving:!1,todo:Y.file,notice:Y.result?.message||"任务已更新"}))}catch(Y){y((t)=>({...t,saving:!1,error:cu(Y,"任务更新失败")}))}}async function T(){await Z({title:_,rawContent:r})}async function c(p){if(!i.selectedFile)return;y((Y)=>({...Y,saving:!0,error:"",notice:""}));try{let Y=await Zu(c_(f,"/api/tasks"),{method:"POST",body:{file:i.selectedFile,parentId:p,title:J||"新任务"}});Q(""),y((t)=>({...t,saving:!1,todo:Y.file,selectedTaskId:Y.result?.taskId||t.selectedTaskId,notice:Y.result?.message||"任务已创建"})),await w(i.selectedFile)}catch(Y){y((t)=>({...t,saving:!1,error:cu(Y,"创建任务失败")}))}}async function X(){if(!N||!i.selectedFile)return;if(!window.confirm(`删除 ${N.id} 及其子任务?`))return;y((p)=>({...p,saving:!0,error:"",notice:""}));try{let p=await Zu(c_(f,`/api/tasks/${encodeURIComponent(N.id)}?file=${encodeURIComponent(i.selectedFile)}`),{method:"DELETE"}),Y=k7(p.file?.tasks||[]);y((t)=>({...t,saving:!1,todo:p.file,selectedTaskId:Y[0]?.id||"",notice:p.result?.message||"任务已删除"}))}catch(p){y((Y)=>({...Y,saving:!1,error:cu(p,"删除任务失败")}))}}async function S(){if(!N||!i.selectedFile)return;y((p)=>({...p,saving:!0,error:"",command:null}));try{let p=await Zu(c_(f,"/api/execute-command"),{method:"POST",body:{file:i.selectedFile,taskId:N.id,mode:"codex"}});y((Y)=>({...Y,saving:!1,command:p,notice:"执行命令已生成"}))}catch(p){y((Y)=>({...Y,saving:!1,error:cu(p,"执行命令生成失败")}))}}return Gu("div",{className:"mdtodo-page","data-testid":"mdtodo-page"},Gu(J4,{title:"MDTODO 工作台",eyebrow:"D601 k3s managed service",loading:i.loading,actions:Gu("div",{className:"panel-actions"},Gu("button",{type:"button",className:"ghost-btn",onClick:()=>void w(),disabled:i.loading,"data-testid":"mdtodo-refresh-button"},i.loading?"刷新中":"刷新"),Gu(b7,{title:"MDTODO 用户服务",data:n,onOpen:l,testId:"raw-mdtodo-service"}))},Gu("div",{className:"findjob-hero"},Gu("div",null,Gu("div",{className:"node-version-line"},Gu(dL,{status:W.providerStatus==="online"?"online":"warn"},W.providerStatus||"unknown"),Gu("span",null,n.providerId),Gu("span",null,q.proxyMode||"--")),Gu("p",{className:"muted paragraph"},n.description)),Gu("div",{className:"microservice-ref-card"},Gu("span",null,"Repo"),Gu("strong",null,K.url||"--"),Gu("code",null,K.composeFile||"--")),Gu("div",{className:"microservice-ref-card"},Gu("span",null,"Workspace"),Gu("strong",null,i.health?.rootDir||"/workspace"),Gu("code",null,`${q.nodeBindHost||"--"}:${q.nodePort||"--"}`))),Gu(ul,{error:i.error,wide:!0}),i.notice?Gu("div",{className:"notice-line"},i.notice):null),Gu("div",{className:"metric-grid"},Gu(R3,{label:"TODO 文件",value:i.files.length,hint:i.health?.rootExists?"hostPath ready":"hostPath missing",tone:i.health?.ok?"ok":"warn"}),Gu(R3,{label:"任务总数",value:L.total??"--",hint:i.selectedFile||"--"}),Gu(R3,{label:"已完成",value:L.completed??"--",hint:"completed",tone:"ok"}),Gu(R3,{label:"进行中",value:L.inProgress??"--",hint:"in progress",tone:"warn"}),Gu(R3,{label:"待处理",value:L.pending??"--",hint:i.refreshedAt?Al(i.refreshedAt):"pending"})),Gu("div",{className:"mdtodo-layout"},Gu(J4,{title:"文件",eyebrow:`${i.files.length} Markdown`,loading:i.loading,className:"mdtodo-file-panel"},i.files.length===0?Gu(Q4,{title:"暂无 TODO 文件",text:"等待后端扫描 MDTODO 工作区。"}):Gu("div",{className:"mdtodo-file-list"},i.files.map((p)=>Gu("button",{key:p.path,type:"button",className:`mdtodo-file-item ${i.selectedFile===p.path?"active":""}`,onClick:()=>void z(p.path)},Gu("strong",null,p.name),Gu("span",null,p.directory||"."),Gu("code",null,`${p.stats?.total??"--"} tasks / ${Hu(p.mtime)}`))))),Gu(J4,{title:"任务树",eyebrow:i.selectedFile||"Tasks",loading:i.loading,actions:Gu("div",{className:"panel-actions"},Gu("input",{value:J,onChange:(p)=>Q(p.target.value),placeholder:"新任务标题","data-testid":"mdtodo-new-title"}),Gu("button",{type:"button",className:"ghost-btn",onClick:()=>void c(),disabled:i.saving||!i.selectedFile},"新增"),N?Gu("button",{type:"button",className:"ghost-btn",onClick:()=>void c(N.id),disabled:i.saving},"新增子任务"):null,i.todo?Gu(b7,{title:"MDTODO 当前文件",data:i.todo,onOpen:l,testId:"raw-mdtodo-file"}):null)},Gu(NX,{tasks:U,selectedId:N?.id||"",onSelect:(p)=>y((Y)=>({...Y,selectedTaskId:p,command:null}))})),Gu(J4,{title:N?`${N.id} 详情`:"任务详情",eyebrow:N?eL(N.status):"Detail",loading:i.saving,className:"mdtodo-detail-panel",actions:N?Gu("div",{className:"panel-actions"},Gu("button",{type:"button",className:"ghost-btn",onClick:()=>void Z({status:"pending"}),disabled:i.saving},"待处理"),Gu("button",{type:"button",className:"ghost-btn",onClick:()=>void Z({status:"in_progress"}),disabled:i.saving},"进行中"),Gu("button",{type:"button",className:"primary-btn",onClick:()=>void Z({status:"completed"}),disabled:i.saving},"完成")):null},!N?Gu(Q4,{title:"未选中任务",text:"请选择一个任务。"}):Gu("div",{className:"mdtodo-editor"},Gu("label",null,"标题",Gu("input",{value:_,onChange:(p)=>$(p.target.value),"data-testid":"mdtodo-title-input"})),Gu("label",null,"正文",Gu("textarea",{value:r,onChange:(p)=>j(p.target.value),rows:12,"data-testid":"mdtodo-raw-input"})),Gu("div",{className:"docker-meta compact"},Gu("span",null,`line ${Number(N.lineNumber??0)+1}`),Gu("span",null,`depth ${N.depth??0}`),Gu("span",null,`links ${N.linkExists??0}/${N.linkCount??0}`)),Gu("div",{className:"inline-actions"},Gu("button",{type:"button",className:"primary-btn",onClick:T,disabled:i.saving},i.saving?"保存中":"保存"),Gu("button",{type:"button",className:"ghost-btn",onClick:S,disabled:i.saving},"生成执行命令"),Gu("button",{type:"button",className:"danger-btn",onClick:X,disabled:i.saving},"删除"),Gu(b7,{title:`MDTODO ${N.id}`,data:N,onOpen:l,testId:"raw-mdtodo-task"})),i.command?Gu("div",{className:"mdtodo-command"},Gu("span",null,i.command.prompt||"--"),Gu("code",null,i.command.command||"--")):null))))}var F4=[{id:"ops",label:"运行总览",code:"OPS",tabs:[{id:"status",label:"态势总览"},{id:"performance",label:"性能面板"},{id:"events",label:"事件摘要"},{id:"logs",label:"服务日志"}]},{id:"nodes",label:"资源节点",code:"NODE",tabs:[{id:"list",label:"节点清单"},{id:"monitor",label:"资源监控"},{id:"docker",label:"Docker 状态"},{id:"gateway",label:"网关版本"},{id:"labels",label:"资源标签"},{id:"heartbeats",label:"心跳状态"}]},{id:"tasks",label:"任务调度",code:"TASK",tabs:[{id:"dispatch",label:"下发任务"},{id:"scheduled",label:"定时任务"},{id:"pending",label:"待处理任务"},{id:"history",label:"任务历史"},{id:"results",label:"执行结果"}]},{id:"apps",label:"用户服务",code:"APP",routeSegment:"app",tabs:[{id:"catalog",label:"服务目录"},{id:"hwlab",label:"HWLAB"},{id:"todo-note",label:"Todo Note"},{id:"findjob",label:"FindJob"},{id:"pipeline",label:"Pipeline"},{id:"met-nonlinear",label:"MET Nonlinear"},{id:"claudeqq",label:"ClaudeQQ"},{id:"baidu-netdisk",label:"Baidu Netdisk"},{id:"filebrowser",label:"File Browser"},{id:"oa-event-flow",label:"OA Event Flow"},{id:"k3sctl",label:"k3s Control"},{id:"code-queue",label:"Code Queue"},{id:"mdtodo",label:"MDTODO"},{id:"decision-center",label:"Decision Center"},{id:"project-manager",label:"Project Manager"}]},{id:"config",label:"系统配置",code:"CFG",tabs:[{id:"topology",label:"连接拓扑"},{id:"auth",label:"认证策略"},{id:"security",label:"安全边界"}]}],b3=Object.fromEntries(F4.map((u)=>[u.id,u.tabs[0]?.id??""]));function FX(u){let l=String(u||"").trim();if(!l)return"";try{return decodeURIComponent(l)}catch{return l}}function N4(u){let l=String(u||"/"),[f]=l.split(/[?#]/u,1);if(f==="/")return"/";let i=`/${f.split("/").map(FX).filter(Boolean).join("/")}`;return i.endsWith("/")?i:`${i}/`}function WX(u){let l=2166136261;for(let f of u)l^=f.charCodeAt(0),l=Math.imul(l,16777619);return Math.abs(l>>>0).toString(36)}function h7(u){return String(u||"").normalize("NFKD").replace(/[\u0300-\u036f]/gu,"").toLowerCase().replace(/[^a-z0-9]+/gu,"-").replace(/^-+|-+$/gu,"")}function lK(u){return String(u||"").trim().toLowerCase().replace(/[\s/\\?#%]+/gu,"-").replace(/-+/gu,"-").replace(/^-+|-+$/gu,"")}function fK(u){let l=h7(u.routeSegment||"")||lK(u.routeSegment||"");if(l)return l;let f=h7(u.id||"");if(f)return f;let n=h7(u.label||"")||lK(u.label||"");if(n)return n;return`route-${WX(JSON.stringify(u))}`}function I7(u,l){return`${u}:${l}`}function nK(u){let l=u.map((r)=>{let j=fK(r);return{...r,routeSegment:j,tabs:r.tabs.map((J)=>({...J,routeSegment:fK(J)}))}}),f={},n={},i={},y=l.map((r)=>{let j=r.tabs[0]?.id??"";i[r.id]=j;let J=r.tabs.map((F)=>{let N=`/${r.routeSegment}/${F.routeSegment}/`,L=[N],w={moduleId:r.id,tabId:F.id};for(let W of L)f[N4(W)]=w;return n[I7(r.id,F.id)]=N,{...F,canonicalPath:N,aliases:L}}),Q=`/${r.routeSegment}/`,U={moduleId:r.id,tabId:j};return f[N4(Q)]=U,{...r,routeSegment:r.routeSegment,canonicalPath:Q,tabs:J}}),_=y[0],$={moduleId:_?.id||"",tabId:_?.tabs[0]?.id||""};return f["/"]=$,{modules:y,moduleById:Object.fromEntries(y.map((r)=>[r.id,r])),defaultActiveTabs:i,routeMap:f,canonicalPathByTarget:n,fallbackTarget:$}}function v7(u,l){return u.routeMap[N4(l)]||u.fallbackTarget}function W4(u,l,f){return u.canonicalPathByTarget[I7(l,f)]||u.canonicalPathByTarget[I7(u.fallbackTarget.moduleId,u.fallbackTarget.tabId)]||"/"}function iK(u,l){let f=u.routeMap[N4(l)];if(!f)return null;return W4(u,f.moduleId,f.tabId)}var z4=bu(Wl(),1);var ru=z4.default.createElement,{useEffect:yK,useMemo:qX}=z4.default,g7=z4.default.useState;function K4({status:u,children:l,title:f}){let n=String(u||"unknown").toLowerCase();return ru("span",{className:`status-badge ${n}`,title:f},l||u||"unknown")}function k3({label:u,value:l,hint:f,tone:n}){return ru("article",{className:`metric-card ${n||""}`},ru("div",{className:"metric-label"},u),ru("div",{className:"metric-value"},l),ru("div",{className:"metric-hint"},f))}function q4({title:u,eyebrow:l,actions:f,children:n,className:i,loading:y}){return ru("section",{className:`panel ${i||""}`},ru("div",{className:"panel-head"},ru("div",null,l?ru("p",{className:"panel-eyebrow"},l):null,ru(nl,{title:u,loading:y})),f?ru("div",{className:"panel-actions"},f):null),ru("div",{className:"panel-body"},n))}function h3({title:u,data:l,onOpen:f,testId:n}){return ru("button",{type:"button",className:"ghost-btn","data-testid":n,onClick:()=>f?.(u,l)},"查看原始JSON")}function s7({title:u,text:l}){return ru("div",{className:"empty-state"},ru("strong",null,u),ru("span",null,l))}function LX(u){return u&&typeof u==="object"&&!Array.isArray(u)?u:null}function J1(u){return Array.isArray(u)?u:[]}function i0(u){let l=Number(u);return Number.isFinite(l)?l.toLocaleString("zh-CN"):"--"}function _K(u,l=140){if(u===null||u===void 0)return"--";let f=typeof u==="string"?u:JSON.stringify(u),n=String(f||"").replace(/\s+/gu," ").trim();return n.length>l?`${n.slice(0,l-1)}...`:n||"--"}function KX(u){return J1(u?.tags).map((l)=>String(l||"").trim()).filter(Boolean)}function _y(u){let l=Number(u);return Number.isFinite(l)&&l>=0?Math.floor(l):0}function zX(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function GX(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function wX(u){return String(u||"").split(/[\s,]+/u).map((l)=>l.trim()).filter(Boolean).join(",")}function L4(u,l){return`${u}/microservices/oa-event-flow/proxy${l}`}function ZX(u){if(u.includes("error")||u.includes("failed"))return"failed";if(u.includes("stats"))return"ok";if(u.includes("step")||u.includes("updated"))return"running";return"queued"}function EX(u){let l=String(u?.subjectKind||"trace"),f=String(u?.subjectId||u?.scopeId||"");return f?`${l}:${f}`:String(u?.scopeId||"--")}function HX({tags:u}){let l=KX({tags:u}).slice(0,6);return ru("div",{className:"oa-tag-rail"},l.length===0?ru("span",{className:"muted"},"--"):l.map((f)=>ru("code",{key:f},f)))}function OX({events:u,onRaw:l}){let f=[...J1(u)].reverse();return f.length===0?ru(s7,{title:"事件表暂无记录",text:"等待 Code Queue 或 Pipeline 按 tag 发布 OA 事件"}):ru("div",{className:"table-wrap oa-event-table-wrap"},ru("table",{className:"oa-event-table","data-testid":"oa-event-flow-event-table"},ru("thead",null,ru("tr",null,ru("th",null,"Seq"),ru("th",null,"Type"),ru("th",null,"Source"),ru("th",null,"Aggregate"),ru("th",null,"Tags"),ru("th",null,"Payload"),ru("th",null,"Created"),ru("th",null,"Raw"))),ru("tbody",null,f.map((n)=>{let i=String(n?.type||"event"),y=`${String(n?.aggregateType||"--")}:${String(n?.aggregateId||"--")}`;return ru("tr",{key:n?.eventId||n?.sequence},ru("td",null,ru("code",null,i0(n?.sequence))),ru("td",null,ru(K4,{status:ZX(i)},i)),ru("td",null,ru("strong",null,n?.sourceId||"--"),ru("code",null,n?.sourceKind||"--")),ru("td",null,ru("code",null,y)),ru("td",null,ru(HX,{tags:n?.tags})),ru("td",null,ru("span",{className:"oa-payload-preview"},_K(n?.payload,180))),ru("td",null,Hu(n?.createdAt)),ru("td",null,ru(h3,{title:`OA Event ${n?.sequence||""}`,data:n,onOpen:l,testId:`raw-oa-event-${n?.sequence||"unknown"}`})))}))))}function TX({stats:u,onRaw:l}){let f=J1(u);return f.length===0?ru(s7,{title:"统计中心暂无投影",text:"trace-stats-snapshot / trace-step-created 进入事件流后会更新这里"}):ru("div",{className:"table-wrap oa-stats-table-wrap"},ru("table",{className:"oa-stats-table","data-testid":"oa-event-flow-stats"},ru("thead",null,ru("tr",null,ru("th",null,"Scope"),ru("th",null,"Service"),ru("th",null,"STEP"),ru("th",null,"Read"),ru("th",null,"Edit"),ru("th",null,"Run"),ru("th",null,"Error"),ru("th",null,"Output Seq"),ru("th",null,"Revision"),ru("th",null,"Updated"),ru("th",null,"Raw"))),ru("tbody",null,f.map((n)=>ru("tr",{key:n?.scopeId||`${n?.serviceId}-${n?.subjectId}`},ru("td",null,ru("strong",null,EX(n)),ru("code",null,n?.scopeId||"--")),ru("td",null,ru(K4,{status:String(n?.serviceId||"unknown")==="code-queue"?"running":"queued"},n?.serviceId||"--")),ru("td",null,ru("strong",null,i0(_y(n?.stepCount??n?.llmStepCount)))),ru("td",null,i0(_y(n?.readCount))),ru("td",null,i0(_y(n?.editCount))),ru("td",null,i0(_y(n?.runCount))),ru("td",null,i0(_y(n?.errorCount))),ru("td",null,ru("code",null,i0(_y(n?.outputMaxSeq)))),ru("td",null,i0(_y(n?.statsRevision))),ru("td",null,Hu(n?.updatedAt)),ru("td",null,ru(h3,{title:`OA Trace Stats ${n?.scopeId||""}`,data:n,onOpen:l,testId:`raw-oa-stats-${String(n?.scopeId||"unknown").replace(/[^a-zA-Z0-9_-]/gu,"_")}`})))))))}function $K({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let n=u.find((Z)=>Z.id==="oa-event-flow")||null,[i,y]=g7("service:code-queue"),[_,$]=g7({loading:!1,error:"",health:null,diagnostics:null,events:[],stats:[],refreshedAt:null}),[r,j]=g7({status:"idle",message:"未连接",lastEventAt:""}),J=qX(()=>wX(i),[i]);async function Q(){if(!n)return;$((Z)=>({...Z,loading:!0,error:""}));try{let Z=J?`tags=${encodeURIComponent(J)}&`:"",[T,c,X,S]=await Promise.all([Zu(`${f}/microservices/oa-event-flow/health`,{failureFields:[]}),Zu(L4(f,"/api/diagnostics")),Zu(L4(f,`/api/events?${Z}limit=100`)),Zu(L4(f,`/api/stats/trace?${Z}limit=100`))]);$({loading:!1,error:"",health:T,diagnostics:c,events:J1(X?.events),stats:J1(S?.stats),refreshedAt:new Date})}catch(Z){$((T)=>({...T,loading:!1,error:cu(Z,"OA Event Flow 加载失败")}))}}if(yK(()=>{Q()},[n?.id,n?.runtime?.providerStatus,J]),yK(()=>{if(!n||typeof EventSource>"u")return;let Z=J?`?tags=${encodeURIComponent(J)}`:"",T=new EventSource(`${L4(f,"/api/events/stream")}${Z}`,{withCredentials:!0});j({status:"running",message:"SSE connecting",lastEventAt:""});let c=(p)=>{j({status:"online",message:_K(p.data,120),lastEventAt:new Date().toISOString()})},X=(p)=>{try{let Y=JSON.parse(String(p.data||"{}"));j({status:"online",message:String(Y?.type||p.type||"event"),lastEventAt:new Date().toISOString()}),$((t)=>{let m=[...J1(t.events).filter((D)=>String(D?.eventId||"")!==String(Y?.eventId||"")),Y].sort((D,M)=>Number(D?.sequence||0)-Number(M?.sequence||0)).slice(-100),V=Y?.type==="trace-stats-updated"&&LX(Y?.payload?.stats)?[Y.payload.stats,...J1(t.stats).filter((D)=>String(D?.scopeId||"")!==String(Y.payload.stats.scopeId||""))].slice(0,100):t.stats;return{...t,events:m,stats:V}})}catch(Y){j({status:"warn",message:cu(Y,"SSE 事件解析失败"),lastEventAt:new Date().toISOString()})}},S=()=>{j((p)=>({...p,status:"warn",message:"SSE reconnecting"}))};return T.addEventListener("hello",c),T.addEventListener("task-updated",X),T.addEventListener("queue-updated",X),T.addEventListener("trace-step-created",X),T.addEventListener("trace-stats-snapshot",X),T.addEventListener("trace-stats-updated",X),T.addEventListener("trace-error",X),T.onerror=S,()=>T.close()},[n?.id,f,J]),!n)return ru(s7,{title:"OA Event Flow 未登记",text:"请在 config.json 的 microservices 中登记 id=oa-event-flow"});let U=zX(n),F=GX(n),N=_.diagnostics||{},L=_.health||{},w=N.eventCount??L.eventCount,W=N.traceStatsCount??L.traceStatsCount,K=N.latestSequence??L.latestSequence,q=N.pipelineBridge||L.pipelineBridge||{},z=J1(N.eventTypes).slice(0,8);return ru("div",{className:"oa-event-flow-page","data-testid":"oa-event-flow-page"},ru(q4,{title:"OA Event Flow 控制台",eyebrow:"Unified OA Event Bus + Stats Projection",loading:_.loading,actions:ru("div",{className:"panel-actions"},ru("button",{type:"button",className:"ghost-btn",onClick:Q,disabled:_.loading,"data-testid":"oa-event-flow-refresh"},_.loading?"刷新中":"刷新"),ru(h3,{title:"OA Event Flow Service",data:n,onOpen:l,testId:"raw-oa-event-flow-service"}))},ru("div",{className:"oa-flow-hero"},ru("div",null,ru("div",{className:"node-version-line"},ru(K4,{status:L?.ok||U.providerStatus==="online"?"online":"warn"},L?.ok?"HEALTH OK":U.providerStatus||"unknown"),ru(K4,{status:r.status},r.status.toUpperCase()),ru("span",null,F.public?"公网暴露":"仅 UniDesk frontend 代理访问")),ru("p",{className:"muted paragraph"},"独立事件流微服务统一承载 Code Queue 与 Pipeline 的事件发布、tag 订阅、事件表审计和 Trace/STEP 统计投影。")),ru("div",{className:"oa-flow-signal"},ru("span",null,"stream"),ru("strong",null,r.message||"--"),ru("code",null,r.lastEventAt?Al(new Date(r.lastEventAt)):"waiting"))),ru(ul,{error:_.error,wide:!0})),ru("div",{className:"oa-flow-metrics"},ru(k3,{label:"事件总量",value:i0(w),hint:`latest seq ${i0(K)}`,tone:"ok"}),ru(k3,{label:"Trace Stats",value:i0(W),hint:"oa_trace_stats 投影"}),ru(k3,{label:"SSE Clients",value:i0(L?.sseClientCount??J1(N.sseClients).length),hint:r.message||"tag subscription"}),ru(k3,{label:"Pipeline Bridge",value:q?.enabled?i0(q?.insertedCount):"OFF",hint:q?.lastError||q?.lastFinishedAt||`${q?.mode||"snapshot"} service:pipeline`}),ru(k3,{label:"DB",value:L?.databaseReady||N.databaseReady?"READY":"WAIT",hint:L?.databaseLastError||N.databaseLastError||"PostgreSQL persisted"})),ru(q4,{title:"标签订阅",eyebrow:_.refreshedAt?`Updated ${Al(_.refreshedAt)}`:"Tag Pub/Sub"},ru("div",{className:"oa-filter-bar"},ru("label",null,ru("span",null,"tags"),ru("input",{value:i,onChange:(Z)=>y(Z.target.value),placeholder:"service:code-queue, trace","data-testid":"oa-event-flow-tag-filter"})),ru("div",{className:"oa-filter-presets"},ru("button",{type:"button",className:"ghost-btn",onClick:()=>y("service:code-queue")},"Code Queue"),ru("button",{type:"button",className:"ghost-btn",onClick:()=>y("service:pipeline")},"Pipeline"),ru("button",{type:"button",className:"ghost-btn",onClick:()=>y("trace")},"Trace"),ru("button",{type:"button",className:"ghost-btn",onClick:()=>y("")},"All")),ru("code",null,J||"all events")),ru("div",{className:"oa-type-strip"},z.length===0?ru("span",{className:"muted"},"等待事件类型统计"):z.map((Z)=>ru("span",{key:Z.type,className:"data-chip"},`${Z.type} ${i0(Z.count)}`)))),ru("div",{className:"oa-flow-grid"},ru(q4,{title:"事件表",eyebrow:"oa_events persisted log",className:"oa-flow-wide",loading:_.loading,actions:ru(h3,{title:"OA Event Query",data:{events:_.events,diagnostics:N},onOpen:l,testId:"raw-oa-events"})},ru(OX,{events:_.events,onRaw:l})),ru(q4,{title:"统计中心",eyebrow:"oa_trace_stats read model",className:"oa-flow-wide",loading:_.loading,actions:ru(h3,{title:"OA Trace Stats",data:_.stats,onOpen:l,testId:"raw-oa-trace-stats"})},ru(TX,{stats:_.stats,onRaw:l}))))}var zi=bu(Wl(),1);var _u=bu(JK(),1),ju=bu(Wl(),1);function Il(u){if(typeof u==="string"||typeof u==="number")return""+u;let l="";if(Array.isArray(u)){for(let f=0,n;f{}};function UK(){for(var u=0,l=arguments.length,f={},n;u=0)n=f.slice(i+1),f=f.slice(0,i);if(f&&!l.hasOwnProperty(f))throw Error("unknown type: "+f);return{type:f,name:n}})}w4.prototype=UK.prototype={constructor:w4,on:function(u,l){var f=this._,n=SX(u+"",f),i,y=-1,_=n.length;if(arguments.length<2){while(++y<_)if((i=(u=n[y]).type)&&(i=PX(f[i],u.name)))return i;return}if(l!=null&&typeof l!=="function")throw Error("invalid callback: "+l);while(++y<_)if(i=(u=n[y]).type)f[i]=QK(f[i],u.name,l);else if(l==null)for(i in f)f[i]=QK(f[i],u.name,null);return this},copy:function(){var u={},l=this._;for(var f in l)u[f]=l[f].slice();return new w4(u)},call:function(u,l){if((i=arguments.length-2)>0)for(var f=Array(i),n=0,i,y;n=0&&(l=u.slice(0,f))!=="xmlns")u=u.slice(f+1);return a7.hasOwnProperty(l)?{space:a7[l],local:u}:u}function o7(u){let l;while(l=u.sourceEvent)u=l;return u}function Yf(u,l){if(u=o7(u),l===void 0)l=u.currentTarget;if(l){var f=l.ownerSVGElement||l;if(f.createSVGPoint){var n=f.createSVGPoint();return n.x=u.clientX,n.y=u.clientY,n=n.matrixTransform(l.getScreenCTM().inverse()),[n.x,n.y]}if(l.getBoundingClientRect){var i=l.getBoundingClientRect();return[u.clientX-i.left-l.clientLeft,u.clientY-i.top-l.clientTop]}}return[u.pageX,u.pageY]}function MX(){}function $i(u){return u==null?MX:function(){return this.querySelector(u)}}function d7(u){if(typeof u!=="function")u=$i(u);for(var l=this._groups,f=l.length,n=Array(f),i=0;i=q)q=K+1;while(!(Z=w[q])&&++q=0;)if(_=n[i]){if(y&&_.compareDocumentPosition(y)^4)y.parentNode.insertBefore(_,y);y=_}return this}function Jj(u){if(!u)u=aX;function l(Q,U){return Q&&U?u(Q.__data__,U.__data__):!Q-!U}for(var f=this._groups,n=f.length,i=Array(n),y=0;yl?1:u>=l?0:NaN}function Qj(){var u=arguments[0];return arguments[0]=this,u.apply(null,arguments),this}function Uj(){return Array.from(this)}function Nj(){for(var u=this._groups,l=0,f=u.length;l1?this.each((l==null?nY:typeof l==="function"?yY:iY)(u,l,f==null?"":f)):ri(this.node(),u)}function ri(u,l){return u.style.getPropertyValue(l)||g3(u).getComputedStyle(u,null).getPropertyValue(l)}function _Y(u){return function(){delete this[u]}}function $Y(u,l){return function(){this[u]=l}}function rY(u,l){return function(){var f=l.apply(this,arguments);if(f==null)delete this[u];else this[u]=f}}function zj(u,l){return arguments.length>1?this.each((l==null?_Y:typeof l==="function"?rY:$Y)(u,l)):this.node()[u]}function NK(u){return u.trim().split(/^|\s+/)}function Gj(u){return u.classList||new FK(u)}function FK(u){this._node=u,this._names=NK(u.getAttribute("class")||"")}FK.prototype={add:function(u){var l=this._names.indexOf(u);if(l<0)this._names.push(u),this._node.setAttribute("class",this._names.join(" "))},remove:function(u){var l=this._names.indexOf(u);if(l>=0)this._names.splice(l,1),this._node.setAttribute("class",this._names.join(" "))},contains:function(u){return this._names.indexOf(u)>=0}};function WK(u,l){var f=Gj(u),n=-1,i=l.length;while(++n=0)f=l.slice(n+1),l=l.slice(0,n);return{type:l,name:f}})}function VY(u){return function(){var l=this.__on;if(!l)return;for(var f=0,n=-1,i=l.length,y;f()=>u;function d3(u,{sourceEvent:l,subject:f,target:n,identifier:i,active:y,x:_,y:$,dx:r,dy:j,dispatch:J}){Object.defineProperties(this,{type:{value:u,enumerable:!0,configurable:!0},sourceEvent:{value:l,enumerable:!0,configurable:!0},subject:{value:f,enumerable:!0,configurable:!0},target:{value:n,enumerable:!0,configurable:!0},identifier:{value:i,enumerable:!0,configurable:!0},active:{value:y,enumerable:!0,configurable:!0},x:{value:_,enumerable:!0,configurable:!0},y:{value:$,enumerable:!0,configurable:!0},dx:{value:r,enumerable:!0,configurable:!0},dy:{value:j,enumerable:!0,configurable:!0},_:{value:J}})}d3.prototype.on=function(){var u=this._.on.apply(this._,arguments);return u===this._?this:u};function mY(u){return!u.ctrlKey&&!u.button}function xY(){return this.parentNode}function RY(u,l){return l==null?{x:u.x,y:u.y}:l}function bY(){return navigator.maxTouchPoints||"ontouchstart"in this}function e3(){var u=mY,l=xY,f=RY,n=bY,i={},y=$y("start","drag","end"),_=0,$,r,j,J,Q=0;function U(z){z.on("mousedown.drag",F).filter(n).on("touchstart.drag",w).on("touchmove.drag",W,zK).on("touchend.drag touchcancel.drag",K).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function F(z,Z){if(J||!u.call(this,z,Z))return;var T=q(this,l.call(this,z,Z),z,Z,"mouse");if(!T)return;$f(z.view).on("mousemove.drag",N,ry).on("mouseup.drag",L,ry),t_(z.view),H4(z),j=!1,$=z.clientX,r=z.clientY,T("start",z)}function N(z){if(U1(z),!j){var Z=z.clientX-$,T=z.clientY-r;j=Z*Z+T*T>Q}i.mouse("drag",z)}function L(z){$f(z.view).on("mousemove.drag mouseup.drag",null),a3(z.view,j),U1(z),i.mouse("end",z)}function w(z,Z){if(!u.call(this,z,Z))return;var T=z.changedTouches,c=l.call(this,z,Z),X=T.length,S,p;for(S=0;S>8&15|l>>4&240,l>>4&15|l&240,(l&15)<<4|l&15,1):f===8?O4(l>>24&255,l>>16&255,l>>8&255,(l&255)/255):f===4?O4(l>>12&15|l>>8&240,l>>8&15|l>>4&240,l>>4&15|l&240,((l&15)<<4|l&15)/255):null):(l=hY.exec(u))?new y0(l[1],l[2],l[3],1):(l=IY.exec(u))?new y0(l[1]*255/100,l[2]*255/100,l[3]*255/100,1):(l=vY.exec(u))?O4(l[1],l[2],l[3],l[4]):(l=gY.exec(u))?O4(l[1]*255/100,l[2]*255/100,l[3]*255/100,l[4]):(l=sY.exec(u))?TK(l[1],l[2]/100,l[3]/100,1):(l=aY.exec(u))?TK(l[1],l[2]/100,l[3]/100,l[4]):GK.hasOwnProperty(u)?EK(GK[u]):u==="transparent"?new y0(NaN,NaN,NaN,0):null}function EK(u){return new y0(u>>16&255,u>>8&255,u&255,1)}function O4(u,l,f,n){if(n<=0)u=l=f=NaN;return new y0(u,l,f,n)}function eY(u){if(!(u instanceof nr))u=Jn(u);if(!u)return new y0;return u=u.rgb(),new y0(u.r,u.g,u.b,u.opacity)}function S_(u,l,f,n){return arguments.length===1?eY(u):new y0(u,l,f,n==null?1:n)}function y0(u,l,f,n){this.r=+u,this.g=+l,this.b=+f,this.opacity=+n}ur(y0,S_,Pj(nr,{brighter(u){return u=u==null?V4:Math.pow(V4,u),new y0(this.r*u,this.g*u,this.b*u,this.opacity)},darker(u){return u=u==null?lr:Math.pow(lr,u),new y0(this.r*u,this.g*u,this.b*u,this.opacity)},rgb(){return this},clamp(){return new y0(jy(this.r),jy(this.g),jy(this.b),B4(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:HK,formatHex:HK,formatHex8:ut,formatRgb:OK,toString:OK}));function HK(){return`#${Ay(this.r)}${Ay(this.g)}${Ay(this.b)}`}function ut(){return`#${Ay(this.r)}${Ay(this.g)}${Ay(this.b)}${Ay((isNaN(this.opacity)?1:this.opacity)*255)}`}function OK(){let u=B4(this.opacity);return`${u===1?"rgb(":"rgba("}${jy(this.r)}, ${jy(this.g)}, ${jy(this.b)}${u===1?")":`, ${u})`}`}function B4(u){return isNaN(u)?1:Math.max(0,Math.min(1,u))}function jy(u){return Math.max(0,Math.min(255,Math.round(u)||0))}function Ay(u){return u=jy(u),(u<16?"0":"")+u.toString(16)}function TK(u,l,f,n){if(n<=0)u=l=f=NaN;else if(f<=0||f>=1)u=l=NaN;else if(l<=0)u=NaN;return new jn(u,l,f,n)}function BK(u){if(u instanceof jn)return new jn(u.h,u.s,u.l,u.opacity);if(!(u instanceof nr))u=Jn(u);if(!u)return new jn;if(u instanceof jn)return u;u=u.rgb();var l=u.r/255,f=u.g/255,n=u.b/255,i=Math.min(l,f,n),y=Math.max(l,f,n),_=NaN,$=y-i,r=(y+i)/2;if($){if(l===y)_=(f-n)/$+(f0&&r<1?0:_;return new jn(_,$,r,u.opacity)}function cK(u,l,f,n){return arguments.length===1?BK(u):new jn(u,l,f,n==null?1:n)}function jn(u,l,f,n){this.h=+u,this.s=+l,this.l=+f,this.opacity=+n}ur(jn,cK,Pj(nr,{brighter(u){return u=u==null?V4:Math.pow(V4,u),new jn(this.h,this.s,this.l*u,this.opacity)},darker(u){return u=u==null?lr:Math.pow(lr,u),new jn(this.h,this.s,this.l*u,this.opacity)},rgb(){var u=this.h%360+(this.h<0)*360,l=isNaN(u)||isNaN(this.s)?0:this.s,f=this.l,n=f+(f<0.5?f:1-f)*l,i=2*f-n;return new y0(Mj(u>=240?u-240:u+120,i,n),Mj(u,i,n),Mj(u<120?u+240:u-120,i,n),this.opacity)},clamp(){return new jn(VK(this.h),T4(this.s),T4(this.l),B4(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 u=B4(this.opacity);return`${u===1?"hsl(":"hsla("}${VK(this.h)}, ${T4(this.s)*100}%, ${T4(this.l)*100}%${u===1?")":`, ${u})`}`}}));function VK(u){return u=(u||0)%360,u<0?u+360:u}function T4(u){return Math.max(0,Math.min(1,u||0))}function Mj(u,l,f){return(u<60?l+(f-l)*u/60:u<180?f:u<240?l+(f-l)*(240-u)/60:l)*255}function Cj(u,l,f,n,i){var y=u*u,_=y*u;return((1-3*u+3*y-_)*l+(4-6*y+3*_)*f+(1+3*u+3*y-3*_)*n+_*i)/6}function pj(u){var l=u.length-1;return function(f){var n=f<=0?f=0:f>=1?(f=1,l-1):Math.floor(f*l),i=u[n],y=u[n+1],_=n>0?u[n-1]:2*i-y,$=n()=>u;function ft(u,l){return function(f){return u+f*l}}function nt(u,l,f){return u=Math.pow(u,f),l=Math.pow(l,f)-u,f=1/f,function(n){return Math.pow(u+n*l,f)}}function XK(u){return(u=+u)===1?X4:function(l,f){return f-l?nt(l,f,u):ir(isNaN(l)?f:l)}}function X4(u,l){var f=l-u;return f?ft(u,f):ir(isNaN(u)?l:u)}var Jy=function u(l){var f=XK(l);function n(i,y){var _=f((i=S_(i)).r,(y=S_(y)).r),$=f(i.g,y.g),r=f(i.b,y.b),j=X4(i.opacity,y.opacity);return function(J){return i.r=_(J),i.g=$(J),i.b=r(J),i.opacity=j(J),i+""}}return n.gamma=u,n}(1);function YK(u){return function(l){var f=l.length,n=Array(f),i=Array(f),y=Array(f),_,$;for(_=0;_f)if(y=l.slice(f,y),$[_])$[_]+=y;else $[++_]=y;if((n=n[0])===(i=i[0]))if($[_])$[_]+=i;else $[++_]=i;else $[++_]=null,r.push({i:_,x:tf(n,i)});f=kj.lastIndex}if(f180)J+=360;else if(J-j>180)j+=360;U.push({i:Q.push(i(Q)+"rotate(",null,n)-2,x:tf(j,J)})}else if(J)Q.push(i(Q)+"rotate("+J+n)}function $(j,J,Q,U){if(j!==J)U.push({i:Q.push(i(Q)+"skewX(",null,n)-2,x:tf(j,J)});else if(J)Q.push(i(Q)+"skewX("+J+n)}function r(j,J,Q,U,F,N){if(j!==Q||J!==U){var L=F.push(i(F)+"scale(",null,",",null,")");N.push({i:L-4,x:tf(j,Q)},{i:L-2,x:tf(J,U)})}else if(Q!==1||U!==1)F.push(i(F)+"scale("+Q+","+U+")")}return function(j,J){var Q=[],U=[];return j=u(j),J=u(J),y(j.translateX,j.translateY,J.translateX,J.translateY,Q,U),_(j.rotate,J.rotate,Q,U),$(j.skewX,J.skewX,Q,U),r(j.scaleX,j.scaleY,J.scaleX,J.scaleY,Q,U),j=J=null,function(F){var N=-1,L=U.length,w;while(++N=0)u._call.call(void 0,l);u=u._next}--M_}function bK(){Uy=(P4=rr.now())+M4,M_=_r=0;try{IK()}finally{M_=0,Ht(),Uy=0}}function Et(){var u=rr.now(),l=u-P4;if(l>kK)M4-=l,P4=u}function Ht(){var u,l=S4,f,n=1/0;while(l)if(l._call){if(n>l._time)n=l._time;u=l,l=l._next}else f=l._next,l._next=null,l=u?u._next=f:S4=f;$r=u,gj(n)}function gj(u){if(M_)return;if(_r)_r=clearTimeout(_r);var l=u-Uy;if(l>24){if(u<1/0)_r=setTimeout(bK,u-rr.now()-M4);if(yr)yr=clearInterval(yr)}else{if(!yr)P4=rr.now(),yr=setInterval(Et,kK);M_=1,hK(bK)}}function Jr(u,l,f){var n=new Ar;return l=l==null?0:+l,n.restart((i)=>{n.stop(),u(i+l)},l,f),n}var Tt=$y("start","end","cancel","interrupt"),Vt=[],sK=0,vK=1,m4=2,p4=3,gK=4,x4=5,Qr=6;function N1(u,l,f,n,i,y){var _=u.__transition;if(!_)u.__transition={};else if(f in _)return;Bt(u,f,{name:l,index:n,group:i,on:Tt,tween:Vt,time:y.time,delay:y.delay,duration:y.duration,ease:y.ease,timer:null,state:sK})}function Ur(u,l){var f=rf(u,l);if(f.state>sK)throw Error("too late; already scheduled");return f}function zf(u,l){var f=rf(u,l);if(f.state>p4)throw Error("too late; already running");return f}function rf(u,l){var f=u.__transition;if(!f||!(f=f[l]))throw Error("transition not found");return f}function Bt(u,l,f){var n=u.__transition,i;n[l]=f,f.timer=C4(y,0,f.time);function y(j){if(f.state=vK,f.timer.restart(_,f.delay,f.time),f.delay<=j)_(j-f.delay)}function _(j){var J,Q,U,F;if(f.state!==vK)return r();for(J in n){if(F=n[J],F.name!==f.name)continue;if(F.state===p4)return Jr(_);if(F.state===gK)F.state=Qr,F.timer.stop(),F.on.call("interrupt",u,u.__data__,F.index,F.group),delete n[J];else if(+Jm4&&n.state=0)l=l.slice(0,f);return!l||l==="start"})}function st(u,l,f){var n,i,y=gt(l)?Ur:zf;return function(){var _=y(this,u),$=_.on;if($!==n)(i=(n=$).copy()).on(l,f);_.on=i}}function yJ(u,l){var f=this._id;return arguments.length<2?rf(this.node(),f).on.on(u):this.each(st(f,u,l))}function at(u){return function(){var l=this.parentNode;for(var f in this.__transition)if(+f!==u)return;if(l)l.removeChild(this)}}function _J(){return this.on("end.remove",at(this._id))}function $J(u){var l=this._name,f=this._id;if(typeof u!=="function")u=$i(u);for(var n=this._groups,i=n.length,y=Array(i),_=0;_()=>u;function qJ(u,{sourceEvent:l,target:f,transform:n,dispatch:i}){Object.defineProperties(this,{type:{value:u,enumerable:!0,configurable:!0},sourceEvent:{value:l,enumerable:!0,configurable:!0},target:{value:f,enumerable:!0,configurable:!0},transform:{value:n,enumerable:!0,configurable:!0},_:{value:i}})}function Qn(u,l,f){this.k=u,this.x=l,this.y=f}Qn.prototype={constructor:Qn,scale:function(u){return u===1?this:new Qn(this.k*u,this.x,this.y)},translate:function(u,l){return u===0&l===0?this:new Qn(this.k,this.x+this.k*u,this.y+this.k*l)},apply:function(u){return[u[0]*this.k+this.x,u[1]*this.k+this.y]},applyX:function(u){return u*this.k+this.x},applyY:function(u){return u*this.k+this.y},invert:function(u){return[(u[0]-this.x)/this.k,(u[1]-this.y)/this.k]},invertX:function(u){return(u-this.x)/this.k},invertY:function(u){return(u-this.y)/this.k},rescaleX:function(u){return u.copy().domain(u.range().map(this.invertX,this).map(u.invert,u))},rescaleY:function(u){return u.copy().domain(u.range().map(this.invertY,this).map(u.invert,u))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var Ny=new Qn(1,0,0);Wr.prototype=Qn.prototype;function Wr(u){while(!u.__zoom)if(!(u=u.parentNode))return Ny;return u.__zoom}function d4(u){u.stopImmediatePropagation()}function Fy(u){u.preventDefault(),u.stopImmediatePropagation()}function QD(u){return(!u.ctrlKey||u.type==="wheel")&&!u.button}function UD(){var u=this;if(u instanceof SVGElement){if(u=u.ownerSVGElement||u,u.hasAttribute("viewBox"))return u=u.viewBox.baseVal,[[u.x,u.y],[u.x+u.width,u.y+u.height]];return[[0,0],[u.width.baseVal.value,u.height.baseVal.value]]}return[[0,0],[u.clientWidth,u.clientHeight]]}function dK(){return this.__zoom||Ny}function ND(u){return-u.deltaY*(u.deltaMode===1?0.05:u.deltaMode?1:0.002)*(u.ctrlKey?10:1)}function FD(){return navigator.maxTouchPoints||"ontouchstart"in this}function WD(u,l,f){var n=u.invertX(l[0][0])-f[0][0],i=u.invertX(l[1][0])-f[1][0],y=u.invertY(l[0][1])-f[0][1],_=u.invertY(l[1][1])-f[1][1];return u.translate(i>n?(n+i)/2:Math.min(0,n)||Math.max(0,i),_>y?(y+_)/2:Math.min(0,y)||Math.max(0,_))}function qr(){var u=QD,l=UD,f=WD,n=ND,i=FD,y=[0,1/0],_=[[-1/0,-1/0],[1/0,1/0]],$=250,r=Qy,j=$y("start","zoom","end"),J,Q,U,F=500,N=150,L=0,w=10;function W(V){V.property("__zoom",dK).on("wheel.zoom",X,{passive:!1}).on("mousedown.zoom",S).on("dblclick.zoom",p).filter(i).on("touchstart.zoom",Y).on("touchmove.zoom",t).on("touchend.zoom touchcancel.zoom",m).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}W.transform=function(V,D,M,I){var O=V.selection?V.selection():V;if(O.property("__zoom",dK),V!==O)Z(V,D,M,I);else O.interrupt().each(function(){T(this,arguments).event(I).start().zoom(null,typeof D==="function"?D.apply(this,arguments):D).end()})},W.scaleBy=function(V,D,M,I){W.scaleTo(V,function(){var O=this.__zoom.k,C=typeof D==="function"?D.apply(this,arguments):D;return O*C},M,I)},W.scaleTo=function(V,D,M,I){W.transform(V,function(){var O=l.apply(this,arguments),C=this.__zoom,g=M==null?z(O):typeof M==="function"?M.apply(this,arguments):M,a=C.invert(g),iu=typeof D==="function"?D.apply(this,arguments):D;return f(q(K(C,iu),g,a),O,_)},M,I)},W.translateBy=function(V,D,M,I){W.transform(V,function(){return f(this.__zoom.translate(typeof D==="function"?D.apply(this,arguments):D,typeof M==="function"?M.apply(this,arguments):M),l.apply(this,arguments),_)},null,I)},W.translateTo=function(V,D,M,I,O){W.transform(V,function(){var C=l.apply(this,arguments),g=this.__zoom,a=I==null?z(C):typeof I==="function"?I.apply(this,arguments):I;return f(Ny.translate(a[0],a[1]).scale(g.k).translate(typeof D==="function"?-D.apply(this,arguments):-D,typeof M==="function"?-M.apply(this,arguments):-M),C,_)},I,O)};function K(V,D){return D=Math.max(y[0],Math.min(y[1],D)),D===V.k?V:new Qn(D,V.x,V.y)}function q(V,D,M){var I=D[0]-M[0]*V.k,O=D[1]-M[1]*V.k;return I===V.x&&O===V.y?V:new Qn(V.k,I,O)}function z(V){return[(+V[0][0]+ +V[1][0])/2,(+V[0][1]+ +V[1][1])/2]}function Z(V,D,M,I){V.on("start.zoom",function(){T(this,arguments).event(I).start()}).on("interrupt.zoom end.zoom",function(){T(this,arguments).event(I).end()}).tween("zoom",function(){var O=this,C=arguments,g=T(O,C).event(I),a=l.apply(O,C),iu=M==null?z(a):typeof M==="function"?M.apply(O,C):M,Au=Math.max(a[1][0]-a[0][0],a[1][1]-a[0][1]),R=O.__zoom,x=typeof D==="function"?D.apply(O,C):D,fu=r(R.invert(iu).concat(Au/R.k),x.invert(iu).concat(Au/x.k));return function(yu){if(yu===1)yu=x;else{var Ju=fu(yu),Vu=Au/Ju[2];yu=new Qn(Vu,iu[0]-Ju[0]*Vu,iu[1]-Ju[1]*Vu)}g.zoom(null,yu)}})}function T(V,D,M){return!M&&V.__zooming||new c(V,D)}function c(V,D){this.that=V,this.args=D,this.active=0,this.sourceEvent=null,this.extent=l.apply(V,D),this.taps=0}c.prototype={event:function(V){if(V)this.sourceEvent=V;return this},start:function(){if(++this.active===1)this.that.__zooming=this,this.emit("start");return this},zoom:function(V,D){if(this.mouse&&V!=="mouse")this.mouse[1]=D.invert(this.mouse[0]);if(this.touch0&&V!=="touch")this.touch0[1]=D.invert(this.touch0[0]);if(this.touch1&&V!=="touch")this.touch1[1]=D.invert(this.touch1[0]);return this.that.__zoom=D,this.emit("zoom"),this},end:function(){if(--this.active===0)delete this.that.__zooming,this.emit("end");return this},emit:function(V){var D=$f(this.that).datum();j.call(V,this.that,new qJ(V,{sourceEvent:this.sourceEvent,target:W,type:V,transform:this.that.__zoom,dispatch:j}),D)}};function X(V,...D){if(!u.apply(this,arguments))return;var M=T(this,D).event(V),I=this.__zoom,O=Math.max(y[0],Math.min(y[1],I.k*Math.pow(2,n.apply(this,arguments)))),C=Yf(V);if(M.wheel){if(M.mouse[0][0]!==C[0]||M.mouse[0][1]!==C[1])M.mouse[1]=I.invert(M.mouse[0]=C);clearTimeout(M.wheel)}else if(I.k===O)return;else M.mouse=[C,I.invert(C)],Ai(this),M.start();Fy(V),M.wheel=setTimeout(g,N),M.zoom("mouse",f(q(K(I,O),M.mouse[0],M.mouse[1]),M.extent,_));function g(){M.wheel=null,M.end()}}function S(V,...D){if(U||!u.apply(this,arguments))return;var M=V.currentTarget,I=T(this,D,!0).event(V),O=$f(V.view).on("mousemove.zoom",iu,!0).on("mouseup.zoom",Au,!0),C=Yf(V,M),g=V.clientX,a=V.clientY;t_(V.view),d4(V),I.mouse=[C,this.__zoom.invert(C)],Ai(this),I.start();function iu(R){if(Fy(R),!I.moved){var x=R.clientX-g,fu=R.clientY-a;I.moved=x*x+fu*fu>L}I.event(R).zoom("mouse",f(q(I.that.__zoom,I.mouse[0]=Yf(R,M),I.mouse[1]),I.extent,_))}function Au(R){O.on("mousemove.zoom mouseup.zoom",null),a3(R.view,I.moved),Fy(R),I.event(R).end()}}function p(V,...D){if(!u.apply(this,arguments))return;var M=this.__zoom,I=Yf(V.changedTouches?V.changedTouches[0]:V,this),O=M.invert(I),C=M.k*(V.shiftKey?0.5:2),g=f(q(K(M,C),I,O),l.apply(this,D),_);if(Fy(V),$>0)$f(this).transition().duration($).call(Z,g,I,V);else $f(this).call(W.transform,g,I,V)}function Y(V,...D){if(!u.apply(this,arguments))return;var M=V.touches,I=M.length,O=T(this,D,V.changedTouches.length===I).event(V),C,g,a,iu;d4(V);for(g=0;g"[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:(u)=>`Node type "${u}" 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:(u)=>`The old edge with id=${u} does not exist.`,error009:(u)=>`Marker type "${u}" doesn't exist.`,error008:(u,{id:l,sourceHandle:f,targetHandle:n})=>`Couldn't create edge for ${u} handle id: "${u==="source"?f:n}", edge id: ${l}.`,error010:()=>"Handle: No node id found. Make sure to only use a Handle inside a custom Node.",error011:(u)=>`Edge type "${u}" not found. Using fallback type "default".`,error012:(u)=>`Node with id "${u}" does not exist, it may have been removed. This can happen when a node is deleted before the "onNodeClick" handler is called.`,error013:(u="react")=>`It seems that you haven't loaded the styles. Please import '@xyflow/${u}/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."},b_=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],wJ=["Enter"," ","Escape"],ZJ={"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:u,x:l,y:f})=>`Moved selected node ${u}. New position, x: ${l}, y: ${f}`,"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"},Qi;(function(u){u.Strict="strict",u.Loose="loose"})(Qi||(Qi={}));var W1;(function(u){u.Free="free",u.Vertical="vertical",u.Horizontal="horizontal"})(W1||(W1={}));var Wy;(function(u){u.Partial="partial",u.Full="full"})(Wy||(Wy={}));var EJ={inProgress:!1,isValid:null,from:null,fromHandle:null,fromPosition:null,fromNode:null,to:null,toHandle:null,toPosition:null,toNode:null,pointer:null},Dn;(function(u){u.Bezier="default",u.Straight="straight",u.Step="step",u.SmoothStep="smoothstep",u.SimpleBezier="simplebezier"})(Dn||(Dn={}));var Ui;(function(u){u.Arrow="arrow",u.ArrowClosed="arrowclosed"})(Ui||(Ui={}));var Xu;(function(u){u.Left="left",u.Top="top",u.Right="right",u.Bottom="bottom"})(Xu||(Xu={}));var eK={[Xu.Left]:Xu.Right,[Xu.Right]:Xu.Left,[Xu.Top]:Xu.Bottom,[Xu.Bottom]:Xu.Top};function HJ(u){return u===null?null:u?"valid":"invalid"}var OJ=(u)=>("id"in u)&&("source"in u)&&("target"in u),Qz=(u)=>("id"in u)&&("position"in u)&&!("source"in u)&&!("target"in u),TJ=(u)=>("id"in u)&&("internals"in u)&&!("source"in u)&&!("target"in u);var zr=(u,l=[0,0])=>{let{width:f,height:n}=Sn(u),i=u.origin??l,y=f*i[0],_=n*i[1];return{x:u.position.x-y,y:u.position.y-_}},VJ=(u,l={nodeOrigin:[0,0]})=>{if(u.length===0)return{x:0,y:0,width:0,height:0};let f=u.reduce((n,i)=>{let y=typeof i==="string",_=!l.nodeLookup&&!y?i:void 0;if(l.nodeLookup)_=y?l.nodeLookup.get(i):!TJ(i)?l.nodeLookup.get(i.id):i;let $=_?lA(_,l.nodeOrigin):{x:0,y:0,x2:0,y2:0};return nA(n,$)},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return iA(f)},k_=(u,l={})=>{let f={x:1/0,y:1/0,x2:-1/0,y2:-1/0},n=!1;return u.forEach((i)=>{if(l.filter===void 0||l.filter(i))f=nA(f,lA(i)),n=!0}),n?iA(f):{x:0,y:0,width:0,height:0}},fA=(u,l,[f,n,i]=[0,0,1],y=!1,_=!1)=>{let $={...v_(l,[f,n,i]),width:l.width/i,height:l.height/i},r=[];for(let j of u.values()){let{measured:J,selectable:Q=!0,hidden:U=!1}=j;if(_&&!Q||U)continue;let F=J.width??j.width??j.initialWidth??null,N=J.height??j.height??j.initialHeight??null,L=h_($,Ly(j)),w=(F??0)*(N??0),W=y&&L>0;if(!j.internals.handleBounds||W||L>=w||j.dragging)r.push(j)}return r},Uz=(u,l)=>{let f=new Set;return u.forEach((n)=>{f.add(n.id)}),l.filter((n)=>f.has(n.source)||f.has(n.target))};function qD(u,l){let f=new Map,n=l?.nodes?new Set(l.nodes.map((i)=>i.id)):null;return u.forEach((i)=>{if(i.measured.width&&i.measured.height&&(l?.includeHiddenNodes||!i.hidden)&&(!n||n.has(i.id)))f.set(i.id,i)}),f}async function Nz({nodes:u,width:l,height:f,panZoom:n,minZoom:i,maxZoom:y},_){if(u.size===0)return Promise.resolve(!0);let $=qD(u,_),r=k_($),j=Gr(r,l,f,_?.minZoom??i,_?.maxZoom??y,_?.padding??0.1);return await n.setViewport(j,{duration:_?.duration,ease:_?.ease,interpolate:_?.interpolate}),Promise.resolve(!0)}function BJ({nodeId:u,nextPosition:l,nodeLookup:f,nodeOrigin:n=[0,0],nodeExtent:i,onError:y}){let _=f.get(u),$=_.parentId?f.get(_.parentId):void 0,{x:r,y:j}=$?$.internals.positionAbsolute:{x:0,y:0},J=_.origin??n,Q=_.extent||i;if(_.extent==="parent"&&!_.expandParent)if(!$)y?.("005",Z0.error005());else{let F=$.measured.width,N=$.measured.height;if(F&&N)Q=[[r,j],[r+F,j+N]]}else if($&&R_(_.extent))Q=[[_.extent[0][0]+r,_.extent[0][1]+j],[_.extent[1][0]+r,_.extent[1][1]+j]];let U=R_(Q)?qy(l,Q,_.measured):l;if(_.measured.width===void 0||_.measured.height===void 0)y?.("015",Z0.error015());return{position:{x:U.x-r+(_.measured.width??0)*J[0],y:U.y-j+(_.measured.height??0)*J[1]},positionAbsolute:U}}async function Fz({nodesToRemove:u=[],edgesToRemove:l=[],nodes:f,edges:n,onBeforeDelete:i}){let y=new Set(u.map((U)=>U.id)),_=[];for(let U of f){if(U.deletable===!1)continue;let F=y.has(U.id),N=!F&&U.parentId&&_.find((L)=>L.id===U.parentId);if(F||N)_.push(U)}let $=new Set(l.map((U)=>U.id)),r=n.filter((U)=>U.deletable!==!1),J=Uz(_,r);for(let U of r)if($.has(U.id)&&!J.find((N)=>N.id===U.id))J.push(U);if(!i)return{edges:J,nodes:_};let Q=await i({nodes:_,edges:J});if(typeof Q==="boolean")return Q?{edges:J,nodes:_}:{edges:[],nodes:[]};return Q}var x_=(u,l=0,f=1)=>Math.min(Math.max(u,l),f),qy=(u={x:0,y:0},l,f)=>({x:x_(u.x,l[0][0],l[1][0]-(f?.width??0)),y:x_(u.y,l[0][1],l[1][1]-(f?.height??0))});function Wz(u,l,f){let{width:n,height:i}=Sn(f),{x:y,y:_}=f.internals.positionAbsolute;return qy(u,[[y,_],[y+n,_+i]],l)}var uz=(u,l,f)=>{if(uf)return-x_(Math.abs(u-f),1,l)/l;return 0},qz=(u,l,f=15,n=40)=>{let i=uz(u.x,n,l.width-n)*f,y=uz(u.y,n,l.height-n)*f;return[i,y]},nA=(u,l)=>({x:Math.min(u.x,l.x),y:Math.min(u.y,l.y),x2:Math.max(u.x2,l.x2),y2:Math.max(u.y2,l.y2)}),GJ=({x:u,y:l,width:f,height:n})=>({x:u,y:l,x2:u+f,y2:l+n}),iA=({x:u,y:l,x2:f,y2:n})=>({x:u,y:l,width:f-u,height:n-l}),Ly=(u,l=[0,0])=>{let{x:f,y:n}=TJ(u)?u.internals.positionAbsolute:zr(u,l);return{x:f,y:n,width:u.measured?.width??u.width??u.initialWidth??0,height:u.measured?.height??u.height??u.initialHeight??0}},lA=(u,l=[0,0])=>{let{x:f,y:n}=TJ(u)?u.internals.positionAbsolute:zr(u,l);return{x:f,y:n,x2:f+(u.measured?.width??u.width??u.initialWidth??0),y2:n+(u.measured?.height??u.height??u.initialHeight??0)}},cJ=(u,l)=>iA(nA(GJ(u),GJ(l))),h_=(u,l)=>{let f=Math.max(0,Math.min(u.x+u.width,l.x+l.width)-Math.max(u.x,l.x)),n=Math.max(0,Math.min(u.y+u.height,l.y+l.height)-Math.max(u.y,l.y));return Math.ceil(f*n)},XJ=(u)=>x0(u.width)&&x0(u.height)&&x0(u.x)&&x0(u.y),x0=(u)=>!isNaN(u)&&isFinite(u),YJ=(u,l)=>{},I_=(u,l=[1,1])=>{return{x:l[0]*Math.round(u.x/l[0]),y:l[1]*Math.round(u.y/l[1])}},v_=({x:u,y:l},[f,n,i],y=!1,_=[1,1])=>{let $={x:(u-f)/i,y:(l-n)/i};return y?I_($,_):$},Kr=({x:u,y:l},[f,n,i])=>{return{x:u*i+f,y:l*i+n}};function p_(u,l){if(typeof u==="number")return Math.floor((l-l/(1+u))*0.5);if(typeof u==="string"&&u.endsWith("px")){let f=parseFloat(u);if(!Number.isNaN(f))return Math.floor(f)}if(typeof u==="string"&&u.endsWith("%")){let f=parseFloat(u);if(!Number.isNaN(f))return Math.floor(l*f*0.01)}return console.error(`[React Flow] The padding value "${u}" is invalid. Please provide a number or a string with a valid unit (px or %).`),0}function LD(u,l,f){if(typeof u==="string"||typeof u==="number"){let n=p_(u,f),i=p_(u,l);return{top:n,right:i,bottom:n,left:i,x:i*2,y:n*2}}if(typeof u==="object"){let n=p_(u.top??u.y??0,f),i=p_(u.bottom??u.y??0,f),y=p_(u.left??u.x??0,l),_=p_(u.right??u.x??0,l);return{top:n,right:_,bottom:i,left:y,x:y+_,y:n+i}}return{top:0,right:0,bottom:0,left:0,x:0,y:0}}function KD(u,l,f,n,i,y){let{x:_,y:$}=Kr(u,[l,f,n]),{x:r,y:j}=Kr({x:u.x+u.width,y:u.y+u.height},[l,f,n]),J=i-r,Q=y-j;return{left:Math.floor(_),top:Math.floor($),right:Math.floor(J),bottom:Math.floor(Q)}}var Gr=(u,l,f,n,i,y)=>{let _=LD(y,l,f),$=(l-_.x)/u.width,r=(f-_.y)/u.height,j=Math.min($,r),J=x_(j,n,i),Q=u.x+u.width/2,U=u.y+u.height/2,F=l/2-Q*J,N=f/2-U*J,L=KD(u,F,N,J,l,f),w={left:Math.min(L.left-_.left,0),top:Math.min(L.top-_.top,0),right:Math.min(L.right-_.right,0),bottom:Math.min(L.bottom-_.bottom,0)};return{x:F-w.left+w.right,y:N-w.top+w.bottom,zoom:J}},g_=()=>typeof navigator<"u"&&navigator?.userAgent?.indexOf("Mac")>=0;function R_(u){return u!==void 0&&u!==null&&u!=="parent"}function Sn(u){return{width:u.measured?.width??u.width??u.initialWidth??0,height:u.measured?.height??u.height??u.initialHeight??0}}function tJ(u){return(u.measured?.width??u.width??u.initialWidth)!==void 0&&(u.measured?.height??u.height??u.initialHeight)!==void 0}function DJ(u,l={width:0,height:0},f,n,i){let y={...u},_=n.get(f);if(_){let $=_.origin||i;y.x+=_.internals.positionAbsolute.x-(l.width??0)*$[0],y.y+=_.internals.positionAbsolute.y-(l.height??0)*$[1]}return y}function SJ(u,l){if(u.size!==l.size)return!1;for(let f of u)if(!l.has(f))return!1;return!0}function Lz(){let u,l;return{promise:new Promise((n,i)=>{u=n,l=i}),resolve:u,reject:l}}function Kz(u){return{...ZJ,...u||{}}}function Lr(u,{snapGrid:l=[0,0],snapToGrid:f=!1,transform:n,containerBounds:i}){let{x:y,y:_}=R0(u),$=v_({x:y-(i?.left??0),y:_-(i?.top??0)},n),{x:r,y:j}=f?I_($,l):$;return{xSnapped:r,ySnapped:j,...$}}var yA=(u)=>({width:u.offsetWidth,height:u.offsetHeight}),PJ=(u)=>u?.getRootNode?.()||window?.document,zD=["INPUT","SELECT","TEXTAREA"];function MJ(u){let l=u.composedPath?.()?.[0]||u.target;if(l?.nodeType!==1)return!1;return zD.includes(l.nodeName)||l.hasAttribute("contenteditable")||!!l.closest(".nokey")}var CJ=(u)=>("clientX"in u),R0=(u,l)=>{let f=CJ(u),n=f?u.clientX:u.touches?.[0].clientX,i=f?u.clientY:u.touches?.[0].clientY;return{x:n-(l?.left??0),y:i-(l?.top??0)}},lz=(u,l,f,n,i)=>{let y=l.querySelectorAll(`.${u}`);if(!y||!y.length)return null;return Array.from(y).map((_)=>{let $=_.getBoundingClientRect();return{id:_.getAttribute("data-handleid"),type:u,nodeId:i,position:_.getAttribute("data-handlepos"),x:($.left-f.left)/n,y:($.top-f.top)/n,...yA(_)}})};function _A({sourceX:u,sourceY:l,targetX:f,targetY:n,sourceControlX:i,sourceControlY:y,targetControlX:_,targetControlY:$}){let r=u*0.125+i*0.375+_*0.375+f*0.125,j=l*0.125+y*0.375+$*0.375+n*0.125,J=Math.abs(r-u),Q=Math.abs(j-l);return[r,j,J,Q]}function e4(u,l){if(u>=0)return 0.5*u;return l*25*Math.sqrt(-u)}function fz({pos:u,x1:l,y1:f,x2:n,y2:i,c:y}){switch(u){case Xu.Left:return[l-e4(l-n,y),f];case Xu.Right:return[l+e4(n-l,y),f];case Xu.Top:return[l,f-e4(f-i,y)];case Xu.Bottom:return[l,f+e4(i-f,y)]}}function $A({sourceX:u,sourceY:l,sourcePosition:f=Xu.Bottom,targetX:n,targetY:i,targetPosition:y=Xu.Top,curvature:_=0.25}){let[$,r]=fz({pos:f,x1:u,y1:l,x2:n,y2:i,c:_}),[j,J]=fz({pos:y,x1:n,y1:i,x2:u,y2:l,c:_}),[Q,U,F,N]=_A({sourceX:u,sourceY:l,targetX:n,targetY:i,sourceControlX:$,sourceControlY:r,targetControlX:j,targetControlY:J});return[`M${u},${l} C${$},${r} ${j},${J} ${n},${i}`,Q,U,F,N]}function pJ({sourceX:u,sourceY:l,targetX:f,targetY:n}){let i=Math.abs(f-u)/2,y=f0}var GD=({source:u,sourceHandle:l,target:f,targetHandle:n})=>`xy-edge__${u}${l||""}-${f}${n||""}`,wD=(u,l)=>{return l.some((f)=>f.source===u.source&&f.target===u.target&&(f.sourceHandle===u.sourceHandle||!f.sourceHandle&&!u.sourceHandle)&&(f.targetHandle===u.targetHandle||!f.targetHandle&&!u.targetHandle))},mJ=(u,l,f={})=>{if(!u.source||!u.target)return YJ("006",Z0.error006()),l;let n=f.getEdgeId||GD,i;if(OJ(u))i={...u};else i={...u,id:n(u)};if(wD(i,l))return l;if(i.sourceHandle===null)delete i.sourceHandle;if(i.targetHandle===null)delete i.targetHandle;return l.concat(i)};function rA({sourceX:u,sourceY:l,targetX:f,targetY:n}){let[i,y,_,$]=pJ({sourceX:u,sourceY:l,targetX:f,targetY:n});return[`M ${u},${l}L ${f},${n}`,i,y,_,$]}var nz={[Xu.Left]:{x:-1,y:0},[Xu.Right]:{x:1,y:0},[Xu.Top]:{x:0,y:-1},[Xu.Bottom]:{x:0,y:1}},ZD=({source:u,sourcePosition:l=Xu.Bottom,target:f})=>{if(l===Xu.Left||l===Xu.Right)return u.xMath.sqrt(Math.pow(l.x-u.x,2)+Math.pow(l.y-u.y,2));function ED({source:u,sourcePosition:l=Xu.Bottom,target:f,targetPosition:n=Xu.Top,center:i,offset:y,stepPosition:_}){let $=nz[l],r=nz[n],j={x:u.x+$.x*y,y:u.y+$.y*y},J={x:f.x+r.x*y,y:f.y+r.y*y},Q=ZD({source:j,sourcePosition:l,target:J}),U=Q.x!==0?"x":"y",F=Q[U],N=[],L,w,W={x:0,y:0},K={x:0,y:0},[,,q,z]=pJ({sourceX:u.x,sourceY:u.y,targetX:f.x,targetY:f.y});if($[U]*r[U]===-1){if(U==="x")L=i.x??j.x+(J.x-j.x)*_,w=i.y??(j.y+J.y)/2;else L=i.x??(j.x+J.x)/2,w=i.y??j.y+(J.y-j.y)*_;let X=[{x:L,y:j.y},{x:L,y:J.y}],S=[{x:j.x,y:w},{x:J.x,y:w}];if($[U]===F)N=U==="x"?X:S;else N=U==="x"?S:X}else{let X=[{x:j.x,y:J.y}],S=[{x:J.x,y:j.y}];if(U==="x")N=$.x===F?S:X;else N=$.y===F?X:S;if(l===n){let V=Math.abs(u[U]-f[U]);if(V<=y){let D=Math.min(y-1,y-V);if($[U]===F)W[U]=(j[U]>u[U]?-1:1)*D;else K[U]=(J[U]>f[U]?-1:1)*D}}if(l!==n){let V=U==="x"?"y":"x",D=$[U]===r[V],M=j[V]>J[V],I=j[V]=m)L=(p.x+Y.x)/2,w=N[0].y;else L=N[0].x,w=(p.y+Y.y)/2}let Z={x:j.x+W.x,y:j.y+W.y},T={x:J.x+K.x,y:J.y+K.y};return[[u,...Z.x!==N[0].x||Z.y!==N[0].y?[Z]:[],...N,...T.x!==N[N.length-1].x||T.y!==N[N.length-1].y?[T]:[],f],L,w,q,z]}function HD(u,l,f,n){let i=Math.min(iz(u,l)/2,iz(l,f)/2,n),{x:y,y:_}=l;if(u.x===y&&y===f.x||u.y===_&&_===f.y)return`L${y} ${_}`;if(u.y===_){let j=u.xf.id===l))||null}function AA(u,l){if(!u)return"";if(typeof u==="string")return u;return`${l?`${l}__`:""}${Object.keys(u).sort().map((n)=>`${n}=${u[n]}`).join("&")}`}function Zz(u,{id:l,defaultColor:f,defaultMarkerStart:n,defaultMarkerEnd:i}){let y=new Set;return u.reduce((_,$)=>{return[$.markerStart||n,$.markerEnd||i].forEach((r)=>{if(r&&typeof r==="object"){let j=AA(r,l);if(!y.has(j))_.push({id:j,color:r.color||f,...r}),y.add(j)}}),_},[]).sort((_,$)=>_.id.localeCompare($.id))}var Ez=1000,OD=10,xJ={nodeOrigin:[0,0],nodeExtent:b_,elevateNodesOnSelect:!0,zIndexMode:"basic",defaults:{}},TD={...xJ,checkEquality:!0};function RJ(u,l){let f={...u};for(let n in l)if(l[n]!==void 0)f[n]=l[n];return f}function Hz(u,l,f){let n=RJ(xJ,f);for(let i of u.values())if(i.parentId)kJ(i,u,l,n);else{let y=zr(i,n.nodeOrigin),_=R_(i.extent)?i.extent:n.nodeExtent,$=qy(y,_,Sn(i));i.internals.positionAbsolute=$}}function VD(u,l){if(!u.handles)return!u.measured?void 0:l?.internals.handleBounds;let f=[],n=[];for(let i of u.handles){let y={id:i.id,width:i.width??1,height:i.height??1,nodeId:u.id,x:i.x,y:i.y,position:i.position,type:i.type};if(i.type==="source")f.push(y);else if(i.type==="target")n.push(y)}return{source:f,target:n}}function bJ(u){return u==="manual"}function jA(u,l,f,n={}){let i=RJ(TD,n),y={i:0},_=new Map(l),$=i?.elevateNodesOnSelect&&!bJ(i.zIndexMode)?Ez:0,r=u.length>0,j=!1;l.clear(),f.clear();for(let J of u){let Q=_.get(J.id);if(i.checkEquality&&J===Q?.internals.userNode)l.set(J.id,Q);else{let U=zr(J,i.nodeOrigin),F=R_(J.extent)?J.extent:i.nodeExtent,N=qy(U,F,Sn(J));Q={...i.defaults,...J,measured:{width:J.measured?.width,height:J.measured?.height},internals:{positionAbsolute:N,handleBounds:VD(J,Q),z:Oz(J,$,i.zIndexMode),userNode:J}},l.set(J.id,Q)}if((Q.measured===void 0||Q.measured.width===void 0||Q.measured.height===void 0)&&!Q.hidden)r=!1;if(J.parentId)kJ(Q,l,f,n,y);j||=J.selected??!1}return{nodesInitialized:r,hasSelectedNodes:j}}function BD(u,l){if(!u.parentId)return;let f=l.get(u.parentId);if(f)f.set(u.id,u);else l.set(u.parentId,new Map([[u.id,u]]))}function kJ(u,l,f,n,i){let{elevateNodesOnSelect:y,nodeOrigin:_,nodeExtent:$,zIndexMode:r}=RJ(xJ,n),j=u.parentId,J=l.get(j);if(!J){console.warn(`Parent node ${j} not found. Please make sure that parent nodes are in front of their child nodes in the nodes array.`);return}if(BD(u,f),i&&!J.parentId&&J.internals.rootParentIndex===void 0&&r==="auto")J.internals.rootParentIndex=++i.i,J.internals.z=J.internals.z+i.i*OD;if(i&&J.internals.rootParentIndex!==void 0)i.i=J.internals.rootParentIndex;let Q=y&&!bJ(r)?Ez:0,{x:U,y:F,z:N}=cD(u,J,_,$,Q,r),{positionAbsolute:L}=u.internals,w=U!==L.x||F!==L.y;if(w||N!==u.internals.z)l.set(u.id,{...u,internals:{...u.internals,positionAbsolute:w?{x:U,y:F}:L,z:N}})}function Oz(u,l,f){let n=x0(u.zIndex)?u.zIndex:0;if(bJ(f))return n;return n+(u.selected?l:0)}function cD(u,l,f,n,i,y){let{x:_,y:$}=l.internals.positionAbsolute,r=Sn(u),j=zr(u,f),J=R_(u.extent)?qy(j,u.extent,r):j,Q=qy({x:_+J.x,y:$+J.y},n,r);if(u.extent==="parent")Q=Wz(Q,r,l);let U=Oz(u,i,y),F=l.internals.z??0;return{x:Q.x,y:Q.y,z:F>=U?F+1:U}}function JA(u,l,f,n=[0,0]){let i=[],y=new Map;for(let _ of u){let $=l.get(_.parentId);if(!$)continue;let r=y.get(_.parentId)?.expandedRect??Ly($),j=cJ(r,_.rect);y.set(_.parentId,{expandedRect:j,parent:$})}if(y.size>0)y.forEach(({expandedRect:_,parent:$},r)=>{let j=$.internals.positionAbsolute,J=Sn($),Q=$.origin??n,U=_.x0||F>0||w||W)i.push({id:r,type:"position",position:{x:$.position.x-U+w,y:$.position.y-F+W}}),f.get(r)?.forEach((K)=>{if(!u.some((q)=>q.id===K.id))i.push({id:K.id,type:"position",position:{x:K.position.x+U,y:K.position.y+F}})});if(J.width<_.width||J.height<_.height||U||F)i.push({id:r,type:"dimensions",setAttributes:!0,dimensions:{width:N+(U?Q[0]*U-w:0),height:L+(F?Q[1]*F-W:0)}})});return i}function Tz(u,l,f,n,i,y,_){let $=n?.querySelector(".xyflow__viewport"),r=!1;if(!$)return{changes:[],updatedInternals:r};let j=[],J=window.getComputedStyle($),{m22:Q}=new window.DOMMatrixReadOnly(J.transform),U=[];for(let F of u.values()){let N=l.get(F.id);if(!N)continue;if(N.hidden){l.set(N.id,{...N,internals:{...N.internals,handleBounds:void 0}}),r=!0;continue}let L=yA(F.nodeElement),w=N.measured.width!==L.width||N.measured.height!==L.height;if(!!(L.width&&L.height&&(w||!N.internals.handleBounds||F.force))){let K=F.nodeElement.getBoundingClientRect(),q=R_(N.extent)?N.extent:y,{positionAbsolute:z}=N.internals;if(N.parentId&&N.extent==="parent")z=Wz(z,L,l.get(N.parentId));else if(q)z=qy(z,q,L);let Z={...N,measured:L,internals:{...N.internals,positionAbsolute:z,handleBounds:{source:lz("source",F.nodeElement,K,Q,N.id),target:lz("target",F.nodeElement,K,Q,N.id)}}};if(l.set(N.id,Z),N.parentId)kJ(Z,l,f,{nodeOrigin:i,zIndexMode:_});if(r=!0,w){if(j.push({id:N.id,type:"dimensions",dimensions:L}),N.expandParent&&N.parentId)U.push({id:N.id,parentId:N.parentId,rect:Ly(Z,i)})}}}if(U.length>0){let F=JA(U,l,f,i);j.push(...F)}return{changes:j,updatedInternals:r}}async function Vz({delta:u,panZoom:l,transform:f,translateExtent:n,width:i,height:y}){if(!l||!u.x&&!u.y)return Promise.resolve(!1);let _=await l.setViewportConstrained({x:f[0]+u.x,y:f[1]+u.y,zoom:f[2]},[[0,0],[i,y]],n),$=!!_&&(_.x!==f[0]||_.y!==f[1]||_.k!==f[2]);return Promise.resolve($)}function rz(u,l,f,n,i,y){let _=i,$=n.get(_)||new Map;n.set(_,$.set(f,l)),_=`${i}-${u}`;let r=n.get(_)||new Map;if(n.set(_,r.set(f,l)),y){_=`${i}-${u}-${y}`;let j=n.get(_)||new Map;n.set(_,j.set(f,l))}}function hJ(u,l,f){u.clear(),l.clear();for(let n of f){let{source:i,target:y,sourceHandle:_=null,targetHandle:$=null}=n,r={edgeId:n.id,source:i,target:y,sourceHandle:_,targetHandle:$},j=`${i}-${_}--${y}-${$}`,J=`${y}-${$}--${i}-${_}`;rz("source",r,J,u,i,_),rz("target",r,j,u,y,$),l.set(n.id,n)}}function Bz(u,l){if(!u.parentId)return!1;let f=l.get(u.parentId);if(!f)return!1;if(f.selected)return!0;return Bz(f,l)}function Az(u,l,f){let n=u;do{if(n?.matches?.(l))return!0;if(n===f)return!1;n=n?.parentElement}while(n);return!1}function XD(u,l,f,n){let i=new Map;for(let[y,_]of u)if((_.selected||_.id===n)&&(!_.parentId||!Bz(_,u))&&(_.draggable||l&&typeof _.draggable>"u")){let $=u.get(y);if($)i.set(y,{id:y,position:$.position||{x:0,y:0},distance:{x:f.x-$.internals.positionAbsolute.x,y:f.y-$.internals.positionAbsolute.y},extent:$.extent,parentId:$.parentId,origin:$.origin,expandParent:$.expandParent,internals:{positionAbsolute:$.internals.positionAbsolute||{x:0,y:0}},measured:{width:$.measured.width??0,height:$.measured.height??0}})}return i}function LJ({nodeId:u,dragItems:l,nodeLookup:f,dragging:n=!0}){let i=[];for(let[_,$]of l){let r=f.get(_)?.internals.userNode;if(r)i.push({...r,position:$.position,dragging:n})}if(!u)return[i[0],i];let y=f.get(u)?.internals.userNode;return[!y?i[0]:{...y,position:l.get(u)?.position||y.position,dragging:n},i]}function YD({dragItems:u,snapGrid:l,x:f,y:n}){let i=u.values().next().value;if(!i)return null;let y={x:f-i.distance.x,y:n-i.distance.y},_=I_(y,l);return{x:_.x-y.x,y:_.y-y.y}}function cz({onNodeMouseDown:u,getStoreItems:l,onDragStart:f,onDrag:n,onDragStop:i}){let y={x:null,y:null},_=0,$=new Map,r=!1,j={x:0,y:0},J=null,Q=!1,U=null,F=!1,N=!1,L=null;function w({noDragClassName:K,handleSelector:q,domNode:z,isSelectable:Z,nodeId:T,nodeClickDistance:c=0}){U=$f(z);function X({x:t,y:m}){let{nodeLookup:V,nodeExtent:D,snapGrid:M,snapToGrid:I,nodeOrigin:O,onNodeDrag:C,onSelectionDrag:g,onError:a,updateNodePositions:iu}=l();y={x:t,y:m};let Au=!1,R=$.size>1,x=R&&D?GJ(k_($)):null,fu=R&&I?YD({dragItems:$,snapGrid:M,x:t,y:m}):null;for(let[yu,Ju]of $){if(!V.has(yu))continue;let Vu={x:t-Ju.distance.x,y:m-Ju.distance.y};if(I)Vu=fu?{x:Math.round(Vu.x+fu.x),y:Math.round(Vu.y+fu.y)}:I_(Vu,M);let Lu=null;if(R&&D&&!Ju.extent&&x){let{positionAbsolute:o}=Ju.internals,nu=o.x-x.x+D[0][0],wu=o.x+Ju.measured.width-x.x2+D[1][0],e=o.y-x.y+D[0][1],zu=o.y+Ju.measured.height-x.y2+D[1][1];Lu=[[nu,e],[wu,zu]]}let{position:Bu,positionAbsolute:b}=BJ({nodeId:yu,nextPosition:Vu,nodeLookup:V,nodeExtent:Lu?Lu:D,nodeOrigin:O,onError:a});Au=Au||Ju.position.x!==Bu.x||Ju.position.y!==Bu.y,Ju.position=Bu,Ju.internals.positionAbsolute=b}if(N=N||Au,!Au)return;if(iu($,!0),L&&(n||C||!T&&g)){let[yu,Ju]=LJ({nodeId:T,dragItems:$,nodeLookup:V});if(n?.(L,$,yu,Ju),C?.(L,yu,Ju),!T)g?.(L,Ju)}}async function S(){if(!J)return;let{transform:t,panBy:m,autoPanSpeed:V,autoPanOnNodeDrag:D}=l();if(!D){r=!1,cancelAnimationFrame(_);return}let[M,I]=qz(j,J,V);if(M!==0||I!==0){if(y.x=(y.x??0)-M/t[2],y.y=(y.y??0)-I/t[2],await m({x:M,y:I}))X(y)}_=requestAnimationFrame(S)}function p(t){let{nodeLookup:m,multiSelectionActive:V,nodesDraggable:D,transform:M,snapGrid:I,snapToGrid:O,selectNodesOnDrag:C,onNodeDragStart:g,onSelectionDragStart:a,unselectNodesAndEdges:iu}=l();if(Q=!0,(!C||!Z)&&!V&&T){if(!m.get(T)?.selected)iu()}if(Z&&C&&T)u?.(T);let Au=Lr(t.sourceEvent,{transform:M,snapGrid:I,snapToGrid:O,containerBounds:J});if(y=Au,$=XD(m,D,Au,T),$.size>0&&(f||g||!T&&a)){let[R,x]=LJ({nodeId:T,dragItems:$,nodeLookup:m});if(f?.(t.sourceEvent,$,R,x),g?.(t.sourceEvent,R,x),!T)a?.(t.sourceEvent,x)}}let Y=e3().clickDistance(c).on("start",(t)=>{let{domNode:m,nodeDragThreshold:V,transform:D,snapGrid:M,snapToGrid:I}=l();if(J=m?.getBoundingClientRect()||null,F=!1,N=!1,L=t.sourceEvent,V===0)p(t);y=Lr(t.sourceEvent,{transform:D,snapGrid:M,snapToGrid:I,containerBounds:J}),j=R0(t.sourceEvent,J)}).on("drag",(t)=>{let{autoPanOnNodeDrag:m,transform:V,snapGrid:D,snapToGrid:M,nodeDragThreshold:I,nodeLookup:O}=l(),C=Lr(t.sourceEvent,{transform:V,snapGrid:D,snapToGrid:M,containerBounds:J});if(L=t.sourceEvent,t.sourceEvent.type==="touchmove"&&t.sourceEvent.touches.length>1||T&&!O.has(T))F=!0;if(F)return;if(!r&&m&&Q)r=!0,S();if(!Q){let g=R0(t.sourceEvent,J),a=g.x-j.x,iu=g.y-j.y;if(Math.sqrt(a*a+iu*iu)>I)p(t)}if((y.x!==C.xSnapped||y.y!==C.ySnapped)&&$&&Q)j=R0(t.sourceEvent,J),X(C)}).on("end",(t)=>{if(!Q||F)return;if(r=!1,Q=!1,cancelAnimationFrame(_),$.size>0){let{nodeLookup:m,updateNodePositions:V,onNodeDragStop:D,onSelectionDragStop:M}=l();if(N)V($,!1),N=!1;if(i||D||!T&&M){let[I,O]=LJ({nodeId:T,dragItems:$,nodeLookup:m,dragging:!1});if(i?.(t.sourceEvent,$,I,O),D?.(t.sourceEvent,I,O),!T)M?.(t.sourceEvent,O)}}}).filter((t)=>{let m=t.target;return!t.button&&(!K||!Az(m,`.${K}`,z))&&(!q||Az(m,q,z))});U.call(Y)}function W(){U?.on(".drag",null)}return{update:w,destroy:W}}function tD(u,l,f){let n=[],i={x:u.x-f,y:u.y-f,width:f*2,height:f*2};for(let y of l.values())if(h_(i,Ly(y))>0)n.push(y);return n}var DD=250;function SD(u,l,f,n){let i=[],y=1/0,_=tD(u,f,l+DD);for(let $ of _){let r=[...$.internals.handleBounds?.source??[],...$.internals.handleBounds?.target??[]];for(let j of r){if(n.nodeId===j.nodeId&&n.type===j.type&&n.id===j.id)continue;let{x:J,y:Q}=Ni($,j,j.position,!0),U=Math.sqrt(Math.pow(J-u.x,2)+Math.pow(Q-u.y,2));if(U>l)continue;if(U1){let $=n.type==="source"?"target":"source";return i.find((r)=>r.type===$)??i[0]}return i[0]}function Xz(u,l,f,n,i,y=!1){let _=n.get(u);if(!_)return null;let $=i==="strict"?_.internals.handleBounds?.[l]:[..._.internals.handleBounds?.source??[],..._.internals.handleBounds?.target??[]],r=(f?$?.find((j)=>j.id===f):$?.[0])??null;return r&&y?{...r,...Ni(_,r,r.position,!0)}:r}function Yz(u,l){if(u)return u;else if(l?.classList.contains("target"))return"target";else if(l?.classList.contains("source"))return"source";return null}function PD(u,l){let f=null;if(l)f=!0;else if(u&&!l)f=!1;return f}var tz=()=>!0;function MD(u,{connectionMode:l,connectionRadius:f,handleId:n,nodeId:i,edgeUpdaterType:y,isTarget:_,domNode:$,nodeLookup:r,lib:j,autoPanOnConnect:J,flowId:Q,panBy:U,cancelConnection:F,onConnectStart:N,onConnect:L,onConnectEnd:w,isValidConnection:W=tz,onReconnectEnd:K,updateConnection:q,getTransform:z,getFromHandle:Z,autoPanSpeed:T,dragThreshold:c=1,handleDomNode:X}){let S=PJ(u.target),p=0,Y,{x:t,y:m}=R0(u),V=Yz(y,X),D=$?.getBoundingClientRect(),M=!1;if(!D||!V)return;let I=Xz(i,V,n,r,l);if(!I)return;let O=R0(u,D),C=!1,g=null,a=!1,iu=null;function Au(){if(!J||!D)return;let[Bu,b]=qz(O,D,T);U({x:Bu,y:b}),p=requestAnimationFrame(Au)}let R={...I,nodeId:i,type:V,position:I.position},x=r.get(i),yu={inProgress:!0,isValid:null,from:Ni(x,R,Xu.Left,!0),fromHandle:R,fromPosition:R.position,fromNode:x,to:O,toHandle:null,toPosition:eK[R.position],toNode:null,pointer:O};function Ju(){M=!0,q(yu),N?.(u,{nodeId:i,handleId:n,handleType:V})}if(c===0)Ju();function Vu(Bu){if(!M){let{x:zu,y:v}=R0(Bu),$u=zu-t,Wu=v-m;if(!($u*$u+Wu*Wu>c*c))return;Ju()}if(!Z()||!R){Lu(Bu);return}let b=z();if(O=R0(Bu,D),Y=SD(v_(O,b,!1,[1,1]),f,r,R),!C)Au(),C=!0;let o=Dz(Bu,{handle:Y,connectionMode:l,fromNodeId:i,fromHandleId:n,fromType:_?"target":"source",isValidConnection:W,doc:S,lib:j,flowId:Q,nodeLookup:r});iu=o.handleDomNode,g=o.connection,a=PD(!!Y,o.isValid);let nu=r.get(i),wu=nu?Ni(nu,R,Xu.Left,!0):yu.from,e={...yu,from:wu,isValid:a,to:o.toHandle&&a?Kr({x:o.toHandle.x,y:o.toHandle.y},b):O,toHandle:o.toHandle,toPosition:a&&o.toHandle?o.toHandle.position:eK[R.position],toNode:o.toHandle?r.get(o.toHandle.nodeId):null,pointer:O};q(e),yu=e}function Lu(Bu){if("touches"in Bu&&Bu.touches.length>0)return;if(M){if((Y||iu)&&g&&a)L?.(g);let{inProgress:b,...o}=yu,nu={...o,toPosition:yu.toHandle?yu.toPosition:null};if(w?.(Bu,nu),y)K?.(Bu,nu)}F(),cancelAnimationFrame(p),C=!1,a=!1,g=null,iu=null,S.removeEventListener("mousemove",Vu),S.removeEventListener("mouseup",Lu),S.removeEventListener("touchmove",Vu),S.removeEventListener("touchend",Lu)}S.addEventListener("mousemove",Vu),S.addEventListener("mouseup",Lu),S.addEventListener("touchmove",Vu),S.addEventListener("touchend",Lu)}function Dz(u,{handle:l,connectionMode:f,fromNodeId:n,fromHandleId:i,fromType:y,doc:_,lib:$,flowId:r,isValidConnection:j=tz,nodeLookup:J}){let Q=y==="target",U=l?_.querySelector(`.${$}-flow__handle[data-id="${r}-${l?.nodeId}-${l?.id}-${l?.type}"]`):null,{x:F,y:N}=R0(u),L=_.elementFromPoint(F,N),w=L?.classList.contains(`${$}-flow__handle`)?L:U,W={handleDomNode:w,isValid:!1,connection:null,toHandle:null};if(w){let K=Yz(void 0,w),q=w.getAttribute("data-nodeid"),z=w.getAttribute("data-handleid"),Z=w.classList.contains("connectable"),T=w.classList.contains("connectableend");if(!q||!K)return W;let c={source:Q?q:n,sourceHandle:Q?z:i,target:Q?n:q,targetHandle:Q?i:z};W.connection=c;let S=Z&&T&&(f===Qi.Strict?Q&&K==="source"||!Q&&K==="target":q!==n||z!==i);W.isValid=S&&j(c),W.toHandle=Xz(q,K,z,J,f,!0)}return W}var QA={onPointerDown:MD,isValid:Dz};function Sz({domNode:u,panZoom:l,getTransform:f,getViewScale:n}){let i=$f(u);function y({translateExtent:$,width:r,height:j,zoomStep:J=1,pannable:Q=!0,zoomable:U=!0,inversePan:F=!1}){let N=(q)=>{if(q.sourceEvent.type!=="wheel"||!l)return;let z=f(),Z=q.sourceEvent.ctrlKey&&g_()?10:1,T=-q.sourceEvent.deltaY*(q.sourceEvent.deltaMode===1?0.05:q.sourceEvent.deltaMode?1:0.002)*J,c=z[2]*Math.pow(2,T*Z);l.scaleTo(c)},L=[0,0],w=(q)=>{if(q.sourceEvent.type==="mousedown"||q.sourceEvent.type==="touchstart")L=[q.sourceEvent.clientX??q.sourceEvent.touches[0].clientX,q.sourceEvent.clientY??q.sourceEvent.touches[0].clientY]},W=(q)=>{let z=f();if(q.sourceEvent.type!=="mousemove"&&q.sourceEvent.type!=="touchmove"||!l)return;let Z=[q.sourceEvent.clientX??q.sourceEvent.touches[0].clientX,q.sourceEvent.clientY??q.sourceEvent.touches[0].clientY],T=[Z[0]-L[0],Z[1]-L[1]];L=Z;let c=n()*Math.max(z[2],Math.log(z[2]))*(F?-1:1),X={x:z[0]-T[0]*c,y:z[1]-T[1]*c},S=[[0,0],[r,j]];l.setViewportConstrained({x:X.x,y:X.y,zoom:z[2]},S,$)},K=qr().on("start",w).on("zoom",Q?W:null).on("zoom.wheel",U?N:null);i.call(K,{})}function _(){i.on("zoom",null)}return{update:y,destroy:_,pointer:Yf}}var UA=(u)=>({x:u.x,y:u.y,zoom:u.k}),KJ=({x:u,y:l,zoom:f})=>Ny.translate(u,l).scale(f),m_=(u,l)=>u.target.closest(`.${l}`),Pz=(u,l)=>l===2&&Array.isArray(u)&&u.includes(2),CD=(u)=>((u*=2)<=1?u*u*u:(u-=2)*u*u+2)/2,zJ=(u,l=0,f=CD,n=()=>{})=>{let i=typeof l==="number"&&l>0;if(!i)n();return i?u.transition().duration(l).ease(f).on("end",n):u},Mz=(u)=>{let l=u.ctrlKey&&g_()?10:1;return-u.deltaY*(u.deltaMode===1?0.05:u.deltaMode?1:0.002)*l};function pD({zoomPanValues:u,noWheelClassName:l,d3Selection:f,d3Zoom:n,panOnScrollMode:i,panOnScrollSpeed:y,zoomOnPinch:_,onPanZoomStart:$,onPanZoom:r,onPanZoomEnd:j}){return(J)=>{if(m_(J,l)){if(J.ctrlKey)J.preventDefault();return!1}J.preventDefault(),J.stopImmediatePropagation();let Q=f.property("__zoom").k||1;if(J.ctrlKey&&_){let w=Yf(J),W=Mz(J),K=Q*Math.pow(2,W);n.scaleTo(f,K,w,J);return}let U=J.deltaMode===1?20:1,F=i===W1.Vertical?0:J.deltaX*U,N=i===W1.Horizontal?0:J.deltaY*U;if(!g_()&&J.shiftKey&&i!==W1.Vertical)F=J.deltaY*U,N=0;n.translateBy(f,-(F/Q)*y,-(N/Q)*y,{internal:!0});let L=UA(f.property("__zoom"));if(clearTimeout(u.panScrollTimeout),!u.isPanScrolling)u.isPanScrolling=!0,$?.(J,L);else r?.(J,L),u.panScrollTimeout=setTimeout(()=>{j?.(J,L),u.isPanScrolling=!1},150)}}function mD({noWheelClassName:u,preventScrolling:l,d3ZoomHandler:f}){return function(n,i){let y=n.type==="wheel",_=!l&&y&&!n.ctrlKey,$=m_(n,u);if(n.ctrlKey&&y&&$)n.preventDefault();if(_||$)return null;n.preventDefault(),f.call(this,n,i)}}function xD({zoomPanValues:u,onDraggingChange:l,onPanZoomStart:f}){return(n)=>{if(n.sourceEvent?.internal)return;let i=UA(n.transform);if(u.mouseButton=n.sourceEvent?.button||0,u.isZoomingOrPanning=!0,u.prevViewport=i,n.sourceEvent?.type==="mousedown")l(!0);if(f)f?.(n.sourceEvent,i)}}function RD({zoomPanValues:u,panOnDrag:l,onPaneContextMenu:f,onTransformChange:n,onPanZoom:i}){return(y)=>{if(u.usedRightMouseButton=!!(f&&Pz(l,u.mouseButton??0)),!y.sourceEvent?.sync)n([y.transform.x,y.transform.y,y.transform.k]);if(i&&!y.sourceEvent?.internal)i?.(y.sourceEvent,UA(y.transform))}}function bD({zoomPanValues:u,panOnDrag:l,panOnScroll:f,onDraggingChange:n,onPanZoomEnd:i,onPaneContextMenu:y}){return(_)=>{if(_.sourceEvent?.internal)return;if(u.isZoomingOrPanning=!1,y&&Pz(l,u.mouseButton??0)&&!u.usedRightMouseButton&&_.sourceEvent)y(_.sourceEvent);if(u.usedRightMouseButton=!1,n(!1),i){let $=UA(_.transform);u.prevViewport=$,clearTimeout(u.timerId),u.timerId=setTimeout(()=>{i?.(_.sourceEvent,$)},f?150:0)}}}function kD({zoomActivationKeyPressed:u,zoomOnScroll:l,zoomOnPinch:f,panOnDrag:n,panOnScroll:i,zoomOnDoubleClick:y,userSelectionActive:_,noWheelClassName:$,noPanClassName:r,lib:j,connectionInProgress:J}){return(Q)=>{let U=u||l,F=f&&Q.ctrlKey,N=Q.type==="wheel";if(Q.button===1&&Q.type==="mousedown"&&(m_(Q,`${j}-flow__node`)||m_(Q,`${j}-flow__edge`)))return!0;if(!n&&!U&&!i&&!y&&!f)return!1;if(_)return!1;if(J&&!N)return!1;if(m_(Q,$)&&N)return!1;if(m_(Q,r)&&(!N||i&&N&&!u))return!1;if(!f&&Q.ctrlKey&&N)return!1;if(!f&&Q.type==="touchstart"&&Q.touches?.length>1)return Q.preventDefault(),!1;if(!U&&!i&&!F&&N)return!1;if(!n&&(Q.type==="mousedown"||Q.type==="touchstart"))return!1;if(Array.isArray(n)&&!n.includes(Q.button)&&Q.type==="mousedown")return!1;let L=Array.isArray(n)&&n.includes(Q.button)||!Q.button||Q.button<=1;return(!Q.ctrlKey||N)&&L}}function Cz({domNode:u,minZoom:l,maxZoom:f,translateExtent:n,viewport:i,onPanZoom:y,onPanZoomStart:_,onPanZoomEnd:$,onDraggingChange:r}){let j={isZoomingOrPanning:!1,usedRightMouseButton:!1,prevViewport:{x:0,y:0,zoom:0},mouseButton:0,timerId:void 0,panScrollTimeout:void 0,isPanScrolling:!1},J=u.getBoundingClientRect(),Q=qr().scaleExtent([l,f]).translateExtent(n),U=$f(u).call(Q);K({x:i.x,y:i.y,zoom:x_(i.zoom,l,f)},[[0,0],[J.width,J.height]],n);let F=U.on("wheel.zoom"),N=U.on("dblclick.zoom");Q.wheelDelta(Mz);function L(Y,t){if(U)return new Promise((m)=>{Q?.interpolate(t?.interpolate==="linear"?tn:Qy).transform(zJ(U,t?.duration,t?.ease,()=>m(!0)),Y)});return Promise.resolve(!1)}function w({noWheelClassName:Y,noPanClassName:t,onPaneContextMenu:m,userSelectionActive:V,panOnScroll:D,panOnDrag:M,panOnScrollMode:I,panOnScrollSpeed:O,preventScrolling:C,zoomOnPinch:g,zoomOnScroll:a,zoomOnDoubleClick:iu,zoomActivationKeyPressed:Au,lib:R,onTransformChange:x,connectionInProgress:fu,paneClickDistance:yu,selectionOnDrag:Ju}){if(V&&!j.isZoomingOrPanning)W();let Vu=D&&!Au&&!V;Q.clickDistance(Ju?1/0:!x0(yu)||yu<0?0:yu);let Lu=Vu?pD({zoomPanValues:j,noWheelClassName:Y,d3Selection:U,d3Zoom:Q,panOnScrollMode:I,panOnScrollSpeed:O,zoomOnPinch:g,onPanZoomStart:_,onPanZoom:y,onPanZoomEnd:$}):mD({noWheelClassName:Y,preventScrolling:C,d3ZoomHandler:F});if(U.on("wheel.zoom",Lu,{passive:!1}),!V){let b=xD({zoomPanValues:j,onDraggingChange:r,onPanZoomStart:_});Q.on("start",b);let o=RD({zoomPanValues:j,panOnDrag:M,onPaneContextMenu:!!m,onPanZoom:y,onTransformChange:x});Q.on("zoom",o);let nu=bD({zoomPanValues:j,panOnDrag:M,panOnScroll:D,onPaneContextMenu:m,onPanZoomEnd:$,onDraggingChange:r});Q.on("end",nu)}let Bu=kD({zoomActivationKeyPressed:Au,panOnDrag:M,zoomOnScroll:a,panOnScroll:D,zoomOnDoubleClick:iu,zoomOnPinch:g,userSelectionActive:V,noPanClassName:t,noWheelClassName:Y,lib:R,connectionInProgress:fu});if(Q.filter(Bu),iu)U.on("dblclick.zoom",N);else U.on("dblclick.zoom",null)}function W(){Q.on("zoom",null)}async function K(Y,t,m){let V=KJ(Y),D=Q?.constrain()(V,t,m);if(D)await L(D);return new Promise((M)=>M(D))}async function q(Y,t){let m=KJ(Y);return await L(m,t),new Promise((V)=>V(m))}function z(Y){if(U){let t=KJ(Y),m=U.property("__zoom");if(m.k!==Y.zoom||m.x!==Y.x||m.y!==Y.y)Q?.transform(U,t,null,{sync:!0})}}function Z(){let Y=U?Wr(U.node()):{x:0,y:0,k:1};return{x:Y.x,y:Y.y,zoom:Y.k}}function T(Y,t){if(U)return new Promise((m)=>{Q?.interpolate(t?.interpolate==="linear"?tn:Qy).scaleTo(zJ(U,t?.duration,t?.ease,()=>m(!0)),Y)});return Promise.resolve(!1)}function c(Y,t){if(U)return new Promise((m)=>{Q?.interpolate(t?.interpolate==="linear"?tn:Qy).scaleBy(zJ(U,t?.duration,t?.ease,()=>m(!0)),Y)});return Promise.resolve(!1)}function X(Y){Q?.scaleExtent(Y)}function S(Y){Q?.translateExtent(Y)}function p(Y){let t=!x0(Y)||Y<0?0:Y;Q?.clickDistance(t)}return{update:w,destroy:W,setViewport:q,setViewportConstrained:K,getViewport:Z,scaleTo:T,scaleBy:c,setScaleExtent:X,setTranslateExtent:S,syncViewport:z,setClickDistance:p}}var Fi;(function(u){u.Line="line",u.Handle="handle"})(Fi||(Fi={}));function hD({width:u,prevWidth:l,height:f,prevHeight:n,affectsX:i,affectsY:y}){let _=u-l,$=f-n,r=[_>0?1:_<0?-1:0,$>0?1:$<0?-1:0];if(_&&i)r[0]=r[0]*-1;if($&&y)r[1]=r[1]*-1;return r}function jz(u){let l=u.includes("right")||u.includes("left"),f=u.includes("bottom")||u.includes("top"),n=u.includes("left"),i=u.includes("top");return{isHorizontal:l,isVertical:f,affectsX:n,affectsY:i}}function ji(u,l){return Math.max(0,l-u)}function Ji(u,l){return Math.max(0,u-l)}function uA(u,l,f){return Math.max(0,l-u,u-f)}function Jz(u,l){return u?!l:l}function ID(u,l,f,n,i,y,_,$){let{affectsX:r,affectsY:j}=l,{isHorizontal:J,isVertical:Q}=l,U=J&&Q,{xSnapped:F,ySnapped:N}=f,{minWidth:L,maxWidth:w,minHeight:W,maxHeight:K}=n,{x:q,y:z,width:Z,height:T,aspectRatio:c}=u,X=Math.floor(J?F-u.pointerX:0),S=Math.floor(Q?N-u.pointerY:0),p=Z+(r?-X:X),Y=T+(j?-S:S),t=-y[0]*Z,m=-y[1]*T,V=uA(p,L,w),D=uA(Y,W,K);if(_){let O=0,C=0;if(r&&X<0)O=ji(q+X+t,_[0][0]);else if(!r&&X>0)O=Ji(q+p+t,_[1][0]);if(j&&S<0)C=ji(z+S+m,_[0][1]);else if(!j&&S>0)C=Ji(z+Y+m,_[1][1]);V=Math.max(V,O),D=Math.max(D,C)}if($){let O=0,C=0;if(r&&X>0)O=Ji(q+X,$[0][0]);else if(!r&&X<0)O=ji(q+p,$[1][0]);if(j&&S>0)C=Ji(z+S,$[0][1]);else if(!j&&S<0)C=ji(z+Y,$[1][1]);V=Math.max(V,O),D=Math.max(D,C)}if(i){if(J){let O=uA(p/c,W,K)*c;if(V=Math.max(V,O),_){let C=0;if(!r&&!j||r&&!j&&U)C=Ji(z+m+p/c,_[1][1])*c;else C=ji(z+m+(r?X:-X)/c,_[0][1])*c;V=Math.max(V,C)}if($){let C=0;if(!r&&!j||r&&!j&&U)C=ji(z+p/c,$[1][1])*c;else C=Ji(z+(r?X:-X)/c,$[0][1])*c;V=Math.max(V,C)}}if(Q){let O=uA(Y*c,L,w)/c;if(D=Math.max(D,O),_){let C=0;if(!r&&!j||j&&!r&&U)C=Ji(q+Y*c+t,_[1][0])/c;else C=ji(q+(j?S:-S)*c+t,_[0][0])/c;D=Math.max(D,C)}if($){let C=0;if(!r&&!j||j&&!r&&U)C=ji(q+Y*c,$[1][0])/c;else C=Ji(q+(j?S:-S)*c,$[0][0])/c;D=Math.max(D,C)}}}if(S=S+(S<0?D:-D),X=X+(X<0?V:-V),i)if(U)if(p>Y*c)S=(Jz(r,j)?-X:X)/c;else X=(Jz(r,j)?-S:S)*c;else if(J)S=X/c,j=r;else X=S*c,r=j;let M=r?q+X:q,I=j?z+S:z;return{width:Z+(r?-X:X),height:T+(j?-S:S),x:y[0]*X*(!r?1:-1)+M,y:y[1]*S*(!j?1:-1)+I}}var pz={width:0,height:0,x:0,y:0},vD={...pz,pointerX:0,pointerY:0,aspectRatio:1};function gD(u){return[[0,0],[u.measured.width,u.measured.height]]}function sD(u,l,f){let n=l.position.x+u.position.x,i=l.position.y+u.position.y,y=u.measured.width??0,_=u.measured.height??0,$=f[0]*y,r=f[1]*_;return[[n-$,i-r],[n+y-$,i+_-r]]}function mz({domNode:u,nodeId:l,getStoreItems:f,onChange:n,onEnd:i}){let y=$f(u),_={controlDirection:jz("bottom-right"),boundaries:{minWidth:0,minHeight:0,maxWidth:Number.MAX_VALUE,maxHeight:Number.MAX_VALUE},resizeDirection:void 0,keepAspectRatio:!1};function $({controlPosition:j,boundaries:J,keepAspectRatio:Q,resizeDirection:U,onResizeStart:F,onResize:N,onResizeEnd:L,shouldResize:w}){let W={...pz},K={...vD};_={boundaries:J,resizeDirection:U,keepAspectRatio:Q,controlDirection:jz(j)};let q=void 0,z=null,Z=[],T=void 0,c=void 0,X=void 0,S=!1,p=e3().on("start",(Y)=>{let{nodeLookup:t,transform:m,snapGrid:V,snapToGrid:D,nodeOrigin:M,paneDomNode:I}=f();if(q=t.get(l),!q)return;z=I?.getBoundingClientRect()??null;let{xSnapped:O,ySnapped:C}=Lr(Y.sourceEvent,{transform:m,snapGrid:V,snapToGrid:D,containerBounds:z});if(W={width:q.measured.width??0,height:q.measured.height??0,x:q.position.x??0,y:q.position.y??0},K={...W,pointerX:O,pointerY:C,aspectRatio:W.width/W.height},T=void 0,q.parentId&&(q.extent==="parent"||q.expandParent))T=t.get(q.parentId),c=T&&q.extent==="parent"?gD(T):void 0;Z=[],X=void 0;for(let[g,a]of t)if(a.parentId===l){if(Z.push({id:g,position:{...a.position},extent:a.extent}),a.extent==="parent"||a.expandParent){let iu=sD(a,q,a.origin??M);if(X)X=[[Math.min(iu[0][0],X[0][0]),Math.min(iu[0][1],X[0][1])],[Math.max(iu[1][0],X[1][0]),Math.max(iu[1][1],X[1][1])]];else X=iu}}F?.(Y,{...W})}).on("drag",(Y)=>{let{transform:t,snapGrid:m,snapToGrid:V,nodeOrigin:D}=f(),M=Lr(Y.sourceEvent,{transform:t,snapGrid:m,snapToGrid:V,containerBounds:z}),I=[];if(!q)return;let{x:O,y:C,width:g,height:a}=W,iu={},Au=q.origin??D,{width:R,height:x,x:fu,y:yu}=ID(K,_.controlDirection,M,_.boundaries,_.keepAspectRatio,Au,c,X),Ju=R!==g,Vu=x!==a,Lu=fu!==O&&Ju,Bu=yu!==C&&Vu;if(!Lu&&!Bu&&!Ju&&!Vu)return;if(Lu||Bu||Au[0]===1||Au[1]===1){if(iu.x=Lu?fu:W.x,iu.y=Bu?yu:W.y,W.x=iu.x,W.y=iu.y,Z.length>0){let wu=fu-O,e=yu-C;for(let zu of Z)zu.position={x:zu.position.x-wu+Au[0]*(R-g),y:zu.position.y-e+Au[1]*(x-a)},I.push(zu)}}if(Ju||Vu)iu.width=Ju&&(!_.resizeDirection||_.resizeDirection==="horizontal")?R:W.width,iu.height=Vu&&(!_.resizeDirection||_.resizeDirection==="vertical")?x:W.height,W.width=iu.width,W.height=iu.height;if(T&&q.expandParent){let wu=Au[0]*(iu.width??0);if(iu.x&&iu.x{if(!S)return;L?.(Y,{...W}),i?.({...W}),S=!1});y.call(p)}function r(){y.on(".drag",null)}return{update:$,destroy:r}}var dz=bu(Wl(),1),ez=bu(gz(),1);var sz=(u)=>{let l,f=new Set,n=(J,Q)=>{let U=typeof J==="function"?J(l):J;if(!Object.is(U,l)){let F=l;l=(Q!=null?Q:typeof U!=="object"||U===null)?U:Object.assign({},l,U),f.forEach((N)=>N(l,F))}},i=()=>l,r={setState:n,getState:i,getInitialState:()=>j,subscribe:(J)=>{return f.add(J),()=>f.delete(J)},destroy:()=>{f.clear()}},j=l=u(n,i,r);return r},az=(u)=>u?sz(u):sz;var{useDebugValue:US}=dz.default,{useSyncExternalStoreWithSelector:NS}=ez.default,FS=(u)=>u;function vJ(u,l=FS,f){let n=NS(u.subscribe,u.getState,u.getServerState||u.getInitialState,l,f);return US(n),n}var oz=(u,l)=>{let f=az(u),n=(i,y=l)=>vJ(f,i,y);return Object.assign(n,f),n},uG=(u,l)=>u?oz(u,l):oz;function Bl(u,l){if(Object.is(u,l))return!0;if(typeof u!=="object"||u===null||typeof l!=="object"||l===null)return!1;if(u instanceof Map&&l instanceof Map){if(u.size!==l.size)return!1;for(let[n,i]of u)if(!Object.is(i,l.get(n)))return!1;return!0}if(u instanceof Set&&l instanceof Set){if(u.size!==l.size)return!1;for(let n of u)if(!l.has(n))return!1;return!0}let f=Object.keys(u);if(f.length!==Object.keys(l).length)return!1;for(let n of f)if(!Object.prototype.hasOwnProperty.call(l,n)||!Object.is(u[n],l[n]))return!1;return!0}var WS=bu(t9(),1),LA=ju.createContext(null),qS=LA.Provider,EG=Z0.error001();function Ql(u,l){let f=ju.useContext(LA);if(f===null)throw Error(EG);return vJ(f,u,l)}function Sl(){let u=ju.useContext(LA);if(u===null)throw Error(EG);return ju.useMemo(()=>({getState:u.getState,setState:u.setState,subscribe:u.subscribe}),[u])}var lG={display:"none"},LS={position:"absolute",width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0px, 0px, 0px, 0px)",clipPath:"inset(100%)"},HG="react-flow__node-desc",OG="react-flow__edge-desc",KS="react-flow__aria-live",zS=(u)=>u.ariaLiveMessage,GS=(u)=>u.ariaLabelConfig;function wS({rfId:u}){let l=Ql(zS);return _u.jsx("div",{id:`${KS}-${u}`,"aria-live":"assertive","aria-atomic":"true",style:LS,children:l})}function ZS({rfId:u,disableKeyboardA11y:l}){let f=Ql(GS);return _u.jsxs(_u.Fragment,{children:[_u.jsx("div",{id:`${HG}-${u}`,style:lG,children:l?f["node.a11yDescription.default"]:f["node.a11yDescription.keyboardDisabled"]}),_u.jsx("div",{id:`${OG}-${u}`,style:lG,children:f["edge.a11yDescription.default"]}),!l&&_u.jsx(wS,{rfId:u})]})}var KA=ju.forwardRef(({position:u="top-left",children:l,className:f,style:n,...i},y)=>{let _=`${u}`.split("-");return _u.jsx("div",{className:Il(["react-flow__panel",f,..._]),style:n,ref:y,...i,children:l})});KA.displayName="Panel";function ES({proOptions:u,position:l="bottom-right"}){if(u?.hideAttribution)return null;return _u.jsx(KA,{position:l,className:"react-flow__attribution","data-message":"Please only hide this attribution when you are subscribed to React Flow Pro: https://pro.reactflow.dev",children:_u.jsx("a",{href:"https://reactflow.dev",target:"_blank",rel:"noopener noreferrer","aria-label":"React Flow attribution",children:"React Flow"})})}var HS=(u)=>{let l=[],f=[];for(let[,n]of u.nodeLookup)if(n.selected)l.push(n.internals.userNode);for(let[,n]of u.edgeLookup)if(n.selected)f.push(n);return{selectedNodes:l,selectedEdges:f}},FA=(u)=>u.id;function OS(u,l){return Bl(u.selectedNodes.map(FA),l.selectedNodes.map(FA))&&Bl(u.selectedEdges.map(FA),l.selectedEdges.map(FA))}function TS({onSelectionChange:u}){let l=Sl(),{selectedNodes:f,selectedEdges:n}=Ql(HS,OS);return ju.useEffect(()=>{let i={nodes:f,edges:n};u?.(i),l.getState().onSelectionChangeHandlers.forEach((y)=>y(i))},[f,n,u]),null}var VS=(u)=>!!u.onSelectionChangeHandlers;function BS({onSelectionChange:u}){let l=Ql(VS);if(u||l)return _u.jsx(TS,{onSelectionChange:u});return null}var aJ=typeof window<"u"?ju.useLayoutEffect:ju.useEffect,TG=[0,0],cS={x:0,y:0,zoom:1},XS=["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"],fG=[...XS,"rfId"],YS=(u)=>({setNodes:u.setNodes,setEdges:u.setEdges,setMinZoom:u.setMinZoom,setMaxZoom:u.setMaxZoom,setTranslateExtent:u.setTranslateExtent,setNodeExtent:u.setNodeExtent,reset:u.reset,setDefaultNodesAndEdges:u.setDefaultNodesAndEdges}),nG={translateExtent:b_,nodeOrigin:TG,minZoom:0.5,maxZoom:2,elementsSelectable:!0,noPanClassName:"nopan",rfId:"1"};function tS(u){let{setNodes:l,setEdges:f,setMinZoom:n,setMaxZoom:i,setTranslateExtent:y,setNodeExtent:_,reset:$,setDefaultNodesAndEdges:r}=Ql(YS,Bl),j=Sl();aJ(()=>{return r(u.defaultNodes,u.defaultEdges),()=>{J.current=nG,$()}},[]);let J=ju.useRef(nG);return aJ(()=>{for(let Q of fG){let U=u[Q],F=J.current[Q];if(U===F)continue;if(typeof u[Q]>"u")continue;if(Q==="nodes")l(U);else if(Q==="edges")f(U);else if(Q==="minZoom")n(U);else if(Q==="maxZoom")i(U);else if(Q==="translateExtent")y(U);else if(Q==="nodeExtent")_(U);else if(Q==="ariaLabelConfig")j.setState({ariaLabelConfig:Kz(U)});else if(Q==="fitView")j.setState({fitViewQueued:U});else if(Q==="fitViewOptions")j.setState({fitViewOptions:U});else j.setState({[Q]:U})}J.current=u},fG.map((Q)=>u[Q])),null}function iG(){if(typeof window>"u"||!window.matchMedia)return null;return window.matchMedia("(prefers-color-scheme: dark)")}function DS(u){let[l,f]=ju.useState(u==="system"?null:u);return ju.useEffect(()=>{if(u!=="system"){f(u);return}let n=iG(),i=()=>f(n?.matches?"dark":"light");return i(),n?.addEventListener("change",i),()=>{n?.removeEventListener("change",i)}},[u]),l!==null?l:iG()?.matches?"dark":"light"}var yG=typeof document<"u"?document:null;function Zr(u=null,l={target:yG,actInsideInputWithModifier:!0}){let[f,n]=ju.useState(!1),i=ju.useRef(!1),y=ju.useRef(new Set([])),[_,$]=ju.useMemo(()=>{if(u!==null){let j=(Array.isArray(u)?u:[u]).filter((Q)=>typeof Q==="string").map((Q)=>Q.replace("+",` +`;function P7({title:u,eyebrow:l,actions:f,children:n,className:y,loading:i}){return Pu("section",{className:`panel ${y||""}`},Pu("div",{className:"panel-head"},Pu("div",null,l?Pu("p",{className:"panel-eyebrow"},l):null,Pu(nl,{title:u,loading:i})),f?Pu("div",{className:"panel-actions"},f):null),Pu("div",{className:"panel-body"},n))}function XX({title:u,data:l,onOpen:f,testId:n}){return Pu("button",{type:"button",className:"ghost-btn","data-testid":n,onClick:()=>f(u,l)},"查看原始JSON")}function cX({title:u,text:l}){return Pu("div",{className:"empty-state"},Pu("strong",null,u),Pu("span",null,l))}function CL(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function pL(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function xL(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function YX(u){return u.filter((f)=>f?.id==="filebrowser"||String(f?.id||"").startsWith("filebrowser-")).sort((f,n)=>{let y=(i)=>i.providerId==="D518"?0:i.providerId==="D601"?1:i.id==="filebrowser"?2:3;return y(f)-y(n)||String(f.id).localeCompare(String(n.id))})}function DX(u){if(u?.providerId==="D518")return"D518";return u?.providerId||u?.name||u?.id||"Unknown"}function tX(u,l,f="/"){let n=f.startsWith("/")?f:`/${f}`;return`${u}/microservices/${encodeURIComponent(l)}/proxy${n}`}function SX(u,l){return`${u}/microservices/${encodeURIComponent(l)}/health`}async function PX(u,l=16000){let f=new AbortController,n=setTimeout(()=>f.abort(),l);try{return await Eu(u,{signal:f.signal,failureFields:[!1]})}finally{clearTimeout(n)}}function mL(u){if(u?.providerId==="main-server")return"host / -> /srv";if(u?.providerId==="D601"||u?.providerId==="D518")return"WSL / + /mnt/c -> /srv";return"provider / -> /srv"}function nA(u){return u?.status==="OK"||u?.ok===!0}function MX({service:u,active:l,health:f,onSelect:n,onRaw:y}){let i=CL(u),_=pL(u),$=xL(u),A=i.container||{},j=nA(f?.body);return Pu("button",{type:"button",className:`filebrowser-target-card ${l?"active":""}`,"data-testid":`filebrowser-target-card-${u.id}`,onClick:n},Pu("span",{className:`status-badge ${j?"ok":i.providerStatus==="online"?"running":"warn"}`},j?"Health OK":i.providerStatus||"unknown"),Pu("strong",null,u.name||u.id),Pu("span",null,mL(u)),Pu("code",null,`${_.nodeBindHost||"--"}:${_.nodePort||"--"}`),Pu("small",null,A.name?`${A.name} / ${A.state||"--"}`:`${$.composeService||"--"}`),Pu("span",{className:"filebrowser-card-raw",onClick:(J)=>{J.stopPropagation(),y(`${u.name} service`,u)}},"JSON"))}function RL(u){try{return u?.contentDocument||u?.contentWindow?.document||null}catch{return null}}function C7(u){let l=RL(u);if(l===null||l.head===null)return!1;let f=l.getElementById("unidesk-filebrowser-compact-style");if(f===null)f=l.createElement("style"),f.id="unidesk-filebrowser-compact-style",l.head.appendChild(f);if(f.textContent!==M7)f.textContent=M7;return!0}function CX(u,l){let f=URL.createObjectURL(u),n=document.createElement("a");n.href=f,n.download=l,document.body.appendChild(n),n.click(),n.remove(),setTimeout(()=>URL.revokeObjectURL(f),2000)}function pX(u,l){let f=RL(u);if(f===null||f.documentElement===null)throw Error("无法访问 File Browser iframe 文档");C7(u);let n=Math.max(640,Math.ceil(u.clientWidth||f.documentElement.clientWidth||1280)),y=Math.max(480,Math.ceil(u.clientHeight||f.documentElement.clientHeight||720)),i=f.documentElement.cloneNode(!0);i.querySelectorAll("script, style, link[rel='stylesheet'], link[rel='preload'], link[rel='icon']").forEach((J)=>J.remove()),i.querySelectorAll("img").forEach((J)=>{J.removeAttribute("src"),J.removeAttribute("srcset")});let _=i.querySelector("head");if(_===null)_=f.createElement("head"),i.insertBefore(_,i.firstChild);let $=f.createElement("style");$.textContent=`${M7} +html,body{width:${n}px!important;min-height:${y}px!important;overflow:hidden!important;}`,_.appendChild($);let A=new XMLSerializer().serializeToString(i),j=`${A}`;CX(new Blob([j],{type:"image/svg+xml;charset=utf-8"}),l.replace(/\.png$/i,".svg"))}function bL({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let n=YX(Array.isArray(u)?u:[]),y=new URLSearchParams(window.location.search).get("target")||"",i=y==="filebrowser-d518"?"filebrowser":y,_=n.some((T)=>T.id===i)?i:n[0]?.id||"",[$,A]=S7(_),[j,J]=S7({loading:!1,refreshedAt:null,health:{},error:""}),[Q,U]=S7({exporting:!1,message:"",error:""}),F=BX(null),N=n.find((T)=>T.id===$)||n[0]||null,K=CL(N),G=pL(N),W=xL(N),L=N?j.health[N.id]:null,q=N?tX(f,N.id,"/"):"about:blank";t7(()=>{if(n.length===0)return;if(!$||!n.some((T)=>T.id===$))A(n[0].id)},[n.map((T)=>T.id).join(",")]),t7(()=>{let T=0,X=setInterval(()=>{if(T+=1,C7(F.current)||T>=24)clearInterval(X)},500);return()=>clearInterval(X)},[q]),t7(()=>{if(n.length===0)return;let T=!1;async function X(){J((p)=>({...p,loading:!0,error:""}));let S=await Promise.all(n.map(async(p)=>{try{let Y=await PX(SX(f,p.id));return[p.id,{ok:!0,body:Y}]}catch(Y){return[p.id,{ok:!1,error:Xu(Y,"File Browser health failed")}]}}));if(T)return;J({loading:!1,refreshedAt:new Date().toISOString(),health:Object.fromEntries(S),error:""})}X();let c=setInterval(X,30000);return()=>{T=!0,clearInterval(c)}},[n.map((T)=>`${T.id}:${T.runtime?.providerStatus||""}`).join(","),f]);function z(T){A(T);let X=new URL(window.location.href);X.searchParams.set("target",T),window.history.replaceState({},"",`${X.pathname}${X.search}`)}async function Z(){if(Q.exporting)return;U({exporting:!0,message:"",error:""});try{let T=new Date().toISOString().replace(/[-:.TZ]/g,"").slice(0,14);await pX(F.current,`unidesk-filebrowser-${N?.id||"target"}-${T}.png`),U({exporting:!1,message:"截图已导出",error:""})}catch(T){U({exporting:!1,message:"",error:Xu(T,"截图导出失败")})}}if(n.length===0)return Pu(cX,{title:"File Browser 未登记",text:"请在 config.json 的 microservices 中登记 id=filebrowser 或 filebrowser-* 用户服务"});return Pu("div",{className:"filebrowser-page","data-testid":"filebrowser-page"},j.error?Pu(ul,{error:j.error,wide:!0}):null,Pu(P7,{title:"文件管理器",eyebrow:"File Browser / Host Files",loading:j.loading,actions:Pu("div",{className:"panel-actions"},N?Pu("button",{type:"button",className:"ghost-btn",onClick:Z,disabled:Q.exporting,"data-testid":"filebrowser-export-screenshot"},Q.exporting?"导出中...":"导出截图"):null,N?Pu("a",{className:"ghost-btn",href:q,target:"_blank",rel:"noreferrer"},"新窗口打开"):null,N?Pu(XX,{title:"File Browser 当前目标",data:{service:N,health:L},onOpen:l,testId:"raw-filebrowser-active"}):null)},Pu("div",{className:"filebrowser-hero"},Pu("div",null,Pu("span",{className:`status-badge ${nA(L?.body)?"ok":"warn"}`},nA(L?.body)?"Health OK":"Health Pending"),Pu("h3",null,N?.name||"File Browser"),Pu("p",{className:"muted paragraph"},N?.description||"通过 UniDesk 登录态代理访问,不开放 File Browser 公网端口。"),Q.error?Pu("p",{className:"filebrowser-shot-error"},Q.error):null,Q.message?Pu("p",{className:"filebrowser-shot-ok"},Q.message):null),Pu("div",{className:"microservice-ref-card"},Pu("span",null,"Provider"),Pu("strong",null,N?.providerId||"--"),Pu("code",null,K.providerName||N?.providerId||"--")),Pu("div",{className:"microservice-ref-card"},Pu("span",null,"Private Backend"),Pu("strong",null,`${G.nodeBindHost||"--"}:${G.nodePort||"--"}`),Pu("code",null,G.nodeBaseUrl||"--")),Pu("div",{className:"microservice-ref-card"},Pu("span",null,"Image"),Pu("strong",null,W.dockerfile||"filebrowser/filebrowser:v2.63.3"),Pu("code",null,W.commitId||"--")),Pu("div",{className:"microservice-ref-card"},Pu("span",null,"Mount"),Pu("strong",null,mL(N)),Pu("code",null,N?.providerId==="main-server"?"/root, /var, /home":"/home, /mnt/c, /mnt/d")))),Pu(P7,{title:"浏览目标",eyebrow:`${n.length} host targets`,loading:j.loading},Pu("div",{className:"filebrowser-target-grid"},n.map((T)=>Pu(MX,{key:T.id,service:T,active:T.id===N?.id,health:j.health[T.id],onSelect:()=>z(T.id),onRaw:l})))),Pu(P7,{title:`${DX(N)} 文件视图`,eyebrow:L?.body?`Health ${nA(L.body)?"OK":"UNKNOWN"} / ${j.refreshedAt?rl(j.refreshedAt):"--"}`:"Embedded WebUI",className:"filebrowser-frame-panel"},Pu("div",{className:"filebrowser-frame-shell"},Pu("div",{className:"filebrowser-frame-toolbar"},Pu("span",null,"BaseURL"),Pu("code",null,`/api/microservices/${N?.id||"filebrowser"}/proxy`),Pu("span",null,"Root"),Pu("code",null,"/srv"),Pu("span",{className:"filebrowser-compact-note"},"Compact layout injected")),Pu("iframe",{ref:F,key:q,title:`${N?.name||"File Browser"} WebUI`,src:q,className:"filebrowser-frame","data-testid":"filebrowser-frame",onLoad:(T)=>C7(T.currentTarget),sandbox:"allow-downloads allow-forms allow-modals allow-same-origin allow-scripts"}))))}var $A=ku(ql(),1);var qu=$A.default.createElement,{useEffect:xX}=$A.default,mX=$A.default.useState;function yA({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return qu("span",{className:`status-badge ${f}`},l||u||"unknown")}function iy({label:u,value:l,hint:f,tone:n}){return qu("article",{className:`metric-card ${n||""}`},qu("div",{className:"metric-label"},u),qu("div",{className:"metric-value"},l),qu("div",{className:"metric-hint"},f))}function iA({title:u,eyebrow:l,actions:f,children:n,className:y,loading:i}){return qu("section",{className:`panel ${y||""}`},qu("div",{className:"panel-head"},qu("div",null,l?qu("p",{className:"panel-eyebrow"},l):null,qu(nl,{title:u,loading:i})),f?qu("div",{className:"panel-actions"},f):null),qu("div",{className:"panel-body"},n))}function _A({title:u,data:l,onOpen:f,testId:n}){return qu("button",{type:"button",className:"ghost-btn","data-testid":n,onClick:()=>f(u,l)},"查看原始JSON")}function p7({title:u,text:l}){return qu("div",{className:"empty-state"},qu("strong",null,u),qu("span",null,l))}function RX(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function bX(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function kX(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function ii(u,l){let f=u&&typeof u==="object"?u[l]:void 0;return Number.isFinite(Number(f))?String(f):"--"}function hX(u){return(Array.isArray(u?.jobs)?u.jobs:[]).slice(0,40)}function IX(u){return(Array.isArray(u?.drafts)?u.drafts:[]).slice(0,12)}function kL({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let n=u.find((N)=>N.id==="findjob")||null,[y,i]=mX({loading:!1,error:"",health:null,summary:null,jobs:null,drafts:null,refreshedAt:null});async function _(){if(!n)return;i((N)=>({...N,loading:!0,error:""}));try{let[N,K,G,W]=await Promise.all([Eu(`${f}/microservices/findjob/health`),Eu(`${f}/microservices/findjob/proxy/api/summary`),Eu(`${f}/microservices/findjob/proxy/api/jobs?__unideskArrayLimit=jobs:40`),Eu(`${f}/microservices/findjob/proxy/api/drafts`)]);i({loading:!1,error:"",health:N,summary:K,jobs:G,drafts:W,refreshedAt:new Date})}catch(N){i((K)=>({...K,loading:!1,error:Xu(N,"FindJob 加载失败")}))}}if(xX(()=>{_()},[n?.id,n?.runtime?.providerStatus]),!n)return qu(p7,{title:"FindJob 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=findjob"});let $=RX(n),A=kX(n),j=bX(n),J=y.summary||{},Q=hX(y.jobs),U=IX(y.drafts),F=y.jobs?._unidesk?.arrayLimits?.jobs;return qu("div",{className:"findjob-page","data-testid":"findjob-page"},qu(iA,{title:"FindJob 工作台",eyebrow:"D601 用户服务",loading:y.loading,actions:qu("div",{className:"panel-actions"},qu("button",{type:"button",className:"ghost-btn",onClick:_,disabled:y.loading,"data-testid":"findjob-refresh-button"},y.loading?"刷新中":"刷新"),qu(_A,{title:"FindJob 用户服务",data:n,onOpen:l,testId:"raw-findjob-service"}))},qu("div",{className:"findjob-hero"},qu("div",null,qu("div",{className:"node-version-line"},qu(yA,{status:$.providerStatus==="online"?"online":"warn"},$.providerStatus||"unknown"),qu("span",null,n.providerId),qu("span",null,j.public?"公网暴露":"仅 UniDesk frontend 代理访问")),qu("p",{className:"muted paragraph"},n.description)),qu("div",{className:"microservice-ref-card"},qu("span",null,"Repo"),qu("strong",null,A.url||"--"),qu("code",null,A.commitId||"--")),qu("div",{className:"microservice-ref-card"},qu("span",null,"D601 Docker"),qu("strong",null,`${j.nodeBindHost||"--"}:${j.nodePort||"--"}`),qu("code",null,`${A.composeFile||"--"} / ${A.composeService||"--"}`))),qu(ul,{error:y.error,wide:!0})),qu("div",{className:"findjob-grid"},qu(iA,{title:"岗位指标",eyebrow:y.refreshedAt?`Updated ${rl(y.refreshedAt)}`:"Summary",loading:y.loading},qu("div",{className:"metric-grid"},qu(iy,{label:"岗位总量",value:ii(J,"totalJobs"),hint:"tracked jobs",tone:"ok"}),qu(iy,{label:"原始岗位",value:ii(J,"rawJobs"),hint:"raw queue"}),qu(iy,{label:"已验证",value:ii(J,"verifiedJobs"),hint:"verified set"}),qu(iy,{label:"优先处理",value:ii(J,"prioritizedJobs"),hint:"prioritized"}),qu(iy,{label:"过期",value:ii(J,"staleJobs"),hint:"stale jobs",tone:"warn"}),qu(iy,{label:"无效",value:ii(J,"invalidJobs"),hint:"invalid jobs",tone:"warn"}),qu(iy,{label:"上海",value:ii(J,"shanghaiJobs"),hint:"city filter"}),qu(iy,{label:"Health",value:y.health?.ok?"OK":"--",hint:"D601 /api/health"})),qu("div",{className:"panel-actions inline-actions"},qu(_A,{title:"FindJob Summary",data:J,onOpen:l,testId:"raw-findjob-summary"}))),qu(iA,{title:"近期岗位",eyebrow:F?`${F.returnedLength}/${F.originalLength} Preview`:`${Q.length} Preview`,loading:y.loading},Q.length===0?qu(p7,{title:"暂无岗位预览",text:"等待 D601 findjob backend 返回 /api/jobs"}):qu("div",{className:"table-wrap findjob-job-table"},qu("table",null,qu("thead",null,qu("tr",null,qu("th",null,"优先级"),qu("th",null,"状态"),qu("th",null,"单位"),qu("th",null,"职位"),qu("th",null,"城市"),qu("th",null,"阶段"),qu("th",null,"截止"),qu("th",null,"证据"))),qu("tbody",null,Q.map((N)=>qu("tr",{key:N.id},qu("td",null,qu(yA,{status:String(N.priority||"").toLowerCase()||"unknown"},N.priority||"--")),qu("td",null,qu(yA,{status:String(N.status||"").toLowerCase()||"unknown"},N.status||"--")),qu("td",null,N.organization_name||"--",qu("code",null,N.id||"--")),qu("td",null,N.display_title||N.title||"--"),qu("td",null,N.display_city||N.city||"--"),qu("td",null,N.workflow_stage||"--"),qu("td",null,N.deadline||"--"),qu("td",null,N.evidence_url?qu("a",{href:N.evidence_url,target:"_blank",rel:"noreferrer"},"打开"):qu("span",{className:"muted"},"无"))))))),qu("div",{className:"panel-actions inline-actions"},qu(_A,{title:"FindJob Jobs Preview",data:y.jobs,onOpen:l,testId:"raw-findjob-jobs"}))),qu(iA,{title:"草稿与报告",eyebrow:`${U.length} Drafts`,loading:y.loading},U.length===0?qu(p7,{title:"暂无草稿",text:"D601 findjob backend 未返回 drafts"}):qu("div",{className:"draft-list"},U.map((N)=>qu("article",{key:N.id,className:"draft-card"},qu("div",{className:"node-card-head"},qu("strong",null,N.id),qu(yA,{status:N.status},N.status||"--")),qu("div",{className:"docker-meta compact"},qu("span",null,N.workflow_stage||"--"),qu("span",null,`jobs ${N.counts?.jobs??0}`),qu("span",null,`reports ${N.counts?.reports??0}`)),qu("span",null,N.latestReportPath||"暂无报告"),qu("code",null,Zu(N.updated_at||N.updatedAt))))),qu("div",{className:"panel-actions inline-actions"},qu(_A,{title:"FindJob Drafts",data:y.drafts,onOpen:l,testId:"raw-findjob-drafts"})))))}var hL=ku(ql(),1);var ou=hL.default.createElement,_i="http://74.48.78.17:6666";function vX({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return ou("span",{className:`status-badge ${f}`},l||u||"unknown")}function gX({title:u,eyebrow:l,actions:f,children:n,className:y}){return ou("section",{className:`panel ${y||""}`},ou("div",{className:"panel-head"},ou("div",null,l?ou("p",{className:"panel-eyebrow"},l):null,ou(nl,{title:u,loading:!1})),f?ou("div",{className:"panel-actions"},f):null),ou("div",{className:"panel-body"},n))}function sX({title:u,text:l}){return ou("div",{className:"empty-state"},ou("strong",null,u),ou("span",null,l))}function aX({href:u,children:l,testId:f,primary:n=!1}){return ou("a",{className:n?"primary-btn compact":"ghost-btn compact",href:u,target:"_blank",rel:"noreferrer","data-testid":f},l)}function oX({onClick:u,children:l,testId:f,primary:n=!1}){return ou("button",{type:"button",className:n?"primary-btn compact":"ghost-btn compact",onClick:u,"data-testid":f},l)}function IL(){return ou("div",{className:"microservice-page hwlab-page","data-testid":"hwlab-page"},ou(gX,{title:"HWLAB",eyebrow:"External Static Entry",actions:ou("span",{className:"panel-link-badge"},ou(vX,{status:"external"},"external"))},ou("div",{className:"hwlab-hero"},ou("div",{className:"hwlab-hero-copy"},ou("p",{className:"panel-eyebrow"},"Static Link"),ou("h2",null,"HWLAB"),ou("p",{className:"muted paragraph"},"这是一个外部静态入口,不经过 UniDesk 后端代理,不纳入 microservice health。")),ou("div",{className:"hwlab-actions"},ou(oX,{primary:!0,testId:"hwlab-open-current",onClick:()=>window.location.assign(_i)},"当前窗口打开"),ou(aX,{href:_i,testId:"hwlab-open-new"},"新窗口打开"))),ou("div",{className:"metric-grid hwlab-metrics"},ou("article",{className:"metric-card"},ou("div",{className:"metric-label"},"入口类型"),ou("div",{className:"metric-value"},"external"),ou("div",{className:"metric-hint"},"static link only")),ou("article",{className:"metric-card"},ou("div",{className:"metric-label"},"目标 URL"),ou("div",{className:"metric-value hwlab-url"},_i),ou("div",{className:"metric-hint"},"fixed destination")),ou("article",{className:"metric-card"},ou("div",{className:"metric-label"},"后端依赖"),ou("div",{className:"metric-value"},"none"),ou("div",{className:"metric-hint"},"no proxy / no health")),ou("article",{className:"metric-card"},ou("div",{className:"metric-label"},"打开方式"),ou("div",{className:"metric-value"},"current or new tab"),ou("div",{className:"metric-hint"},"same style as catalog"))),ou(sX,{title:"外部入口说明",text:"HWLAB 只作为静态跳转目标展示在前端,不会登记到用户服务 health、proxy 或运行态数据中。"})))}var R3=ku(ql(),1);var k=R3.default.createElement,{useEffect:dX}=R3.default,x7=R3.default.useState;function p3(u){let l=Number(u);return Number.isFinite(l)?`${Math.max(0,Math.min(100,l)).toFixed(1)}%`:"--"}function R7(u){if(u===null||u===void 0||u==="")return"--";let l=Number(u);if(!Number.isFinite(l))return"--";if(l<60)return`${Math.max(0,Math.round(l))}s`;if(l<3600)return`${Math.floor(l/60)}m ${Math.round(l%60)}s`;return`${Math.floor(l/3600)}h ${Math.floor(l%3600/60)}m`}function b7(u,l=2){let f=Number(u);if(!Number.isFinite(f))return u===!1?"false":u===!0?"true":"--";let n=Math.abs(f);if(Number.isInteger(f)||n>=1000)return f.toLocaleString("zh-CN",{maximumFractionDigits:0});if(n>=1)return f.toLocaleString("zh-CN",{maximumFractionDigits:l});return f.toLocaleString("zh-CN",{maximumFractionDigits:Math.max(l,6)})}function m3(u){if(u===null||u===void 0||u==="")return"--";if(typeof u==="boolean")return u?"true":"false";if(typeof u==="number")return b7(u,4);if(Array.isArray(u))return u.map((l)=>m3(l)).join(" x ");if(typeof u==="object")return"已上报";return String(u)}function AA(u){let l=Number(u);if(!Number.isFinite(l)||l<=0)return"--";let f=l>=100?0:l>=10?1:2;return`${l.toLocaleString("zh-CN",{maximumFractionDigits:f})} epoch/h`}function rA(u){return u.replace(/[^a-zA-Z0-9_-]/g,"-")}function y0(u){return u&&typeof u==="object"&&!Array.isArray(u)?u:{}}function x3({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return k("span",{className:`status-badge ${f}`},l||u||"unknown")}function _y({label:u,value:l,hint:f,tone:n}){return k("article",{className:`metric-card ${n||""}`},k("div",{className:"metric-label"},u),k("div",{className:"metric-value"},l),k("div",{className:"metric-hint"},f))}function m7({title:u,eyebrow:l,actions:f,children:n,className:y,loading:i}){return k("section",{className:`panel ${y||""}`},k("div",{className:"panel-head"},k("div",null,l?k("p",{className:"panel-eyebrow"},l):null,k(nl,{title:u,loading:i})),f?k("div",{className:"panel-actions"},f):null),k("div",{className:"panel-body"},n))}function X_({title:u,data:l,onOpen:f,testId:n}){return k("button",{type:"button",className:"ghost-btn","data-testid":n,onClick:(y)=>{y?.stopPropagation?.(),f(u,l)}},"查看原始JSON")}function J1({title:u,text:l}){return k("div",{className:"empty-state"},k("strong",null,u),k("span",null,l))}function eX(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function uc(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function lc(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function fc(u){return u?.counts&&typeof u.counts==="object"&&!Array.isArray(u.counts)?u.counts:{}}function nc(u){return Array.isArray(u?.jobs)?u.jobs.slice(0,240):[]}function yc(u){return Array.isArray(u?.projects)?u.projects.slice(0,1000):[]}function jA(u){return Array.isArray(u?.projects)?u.projects:[]}function ic(u,l){if(Array.isArray(l?.gpu))return l.gpu;if(Array.isArray(u?.gpu))return u.gpu;return[]}function E0(u,l){return`${u}/microservices/met-nonlinear/proxy${l}`}function vL(u){return u.startedAt&&u.finishedAt?R7((Date.parse(u.finishedAt)-Date.parse(u.startedAt))/1000):"--"}function _c(u){let l=u.progress||{};if(l.etaSeconds!==null&&l.etaSeconds!==void 0&&l.etaSeconds!==""){let _=Number(l.etaSeconds);if(Number.isFinite(_))return Math.max(0,_)}let f=Number(l.currentEpoch),n=Number(l.epochTarget??u.epochTarget),y=Date.parse(u.startedAt||"");if(!Number.isFinite(f)||f<=0||!Number.isFinite(n)||n<=f||!Number.isFinite(y))return null;let i=Math.max(0,(Date.now()-y)/1000);if(i<=0)return null;return Math.max(0,i/f*(n-f))}function gL(u){let l=u.progress||{},f=Number(l.epochPerHour);if(Number.isFinite(f)&&f>0)return f;let n=Date.parse(u.startedAt||""),y=["succeeded","failed","canceled"].includes(u.status)?Date.parse(u.finishedAt||""):Date.now();if(!Number.isFinite(n)||!Number.isFinite(y)||y<=n)return null;let i=Number(l.currentEpoch??u.epochTarget);if(!Number.isFinite(i)||i<=0)return null;return i/((y-n)/3600000)}function sL(u){if(u==="staged")return"待启动";if(u==="queued")return"排队中";if(u==="running")return"训练中";if(u==="succeeded")return"已完成";if(u==="failed")return"失败";if(u==="canceled")return"已取消";return u||"unknown"}function aL(u,l,f){return{name:u,path:l,depth:f,count:0,children:[],project:null}}function $c(u){let l=aL("","",-1);for(let n of u){let i=String(n?.projectPath||"").replace(/\\/g,"/").split("/").filter(Boolean);if(i.length===0)continue;let _=l,$=[];for(let[A,j]of i.entries()){$.push(j);let J=$.join("/"),Q=_.children.find((U)=>U.path===J);if(!Q)Q=aL(j,J,A),_.children.push(Q);if(A===i.length-1)Q.project=n;_=Q}}let f=(n)=>{let y=n.children.reduce((i,_)=>i+f(_),0);return n.count=(n.project?1:0)+y,n.children.sort((i,_)=>{if(Boolean(i.project)!==Boolean(_.project))return i.project?1:-1;return i.name.localeCompare(_.name,"zh-CN",{numeric:!0,sensitivity:"base"})}),n.count};return f(l),l}function Ac(u){let l=y0(u.data);return y0(l.project).projectPath?y0(l.project):l}function rc(u){return y0(y0(u.data).job)}function oL({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let n=u.find((b)=>b.id==="met-nonlinear")||null,[y,i]=x7({loading:!1,actionBusy:!1,error:"",health:null,summary:null,queue:null,projects:null,history:null,images:null,refreshedAt:null}),[_,$]=x7({loading:!1,error:"",kind:"",key:"",title:"",data:null}),[A,j]=x7(()=>({activeTab:"projects",selectedProjects:{},expandedProjectDirs:{},sourceProject:"",forkCount:1,forkEpochs:200,forkPrefix:`ui_fork_${Date.now()}`,maxConcurrency:3,targetGpuName:"2080 Ti",actionMessage:""}));function J(b){j((o)=>({...o,...b}))}async function Q(b=A.activeTab){if(!n)return;i((o)=>({...o,loading:!0,error:""}));try{let o=[["health",Eu(`${f}/microservices/met-nonlinear/health`)],["summary",Eu(E0(f,"/api/summary"))]];if(b==="projects")o.push(["projectsRoot",Eu(E0(f,"/api/projects?root=projects&limit=500"))]),o.push(["exProjectsRoot",Eu(E0(f,"/api/projects?root=ex_projects&limit=500"))]);if(b==="current"||b==="completed"||b==="failed")o.push(["queue",Eu(E0(f,"/api/queue"))]);if(b==="completed"||b==="failed")o.push(["history",Eu(E0(f,"/api/history"))]);if(b==="gpu")o.push(["images",Eu(E0(f,"/api/images"))]);let nu=Object.fromEntries(await Promise.all(o.map(async([d,zu])=>[d,await zu]))),wu={loading:!1,actionBusy:!1,error:"",health:nu.health,summary:nu.summary,refreshedAt:new Date};if(nu.projectsRoot||nu.exProjectsRoot){let{projectsRoot:d,exProjectsRoot:zu}=nu;wu.projects={ok:d?.ok!==!1&&zu?.ok!==!1,roots:[{root:"projects",count:jA(d).length},{root:"ex_projects",count:jA(zu).length}],projects:[...jA(d),...jA(zu)]}}if(nu.queue)wu.queue=nu.queue;if(nu.history)wu.history=nu.history;if(nu.images)wu.images=nu.images;i((d)=>({...d,...wu}))}catch(o){i((nu)=>({...nu,loading:!1,actionBusy:!1,error:Xu(o,"MET Nonlinear 加载失败")}))}}async function U(b,o){i((nu)=>({...nu,actionBusy:!0,error:""})),J({actionMessage:`${b}...`});try{let nu=await o();J({actionMessage:nu||`${b}完成`}),await Q()}catch(nu){i((wu)=>({...wu,actionBusy:!1,error:Xu(nu,`${b}失败`)}))}}async function F(){await U("保存并发设置",async()=>{await Eu(E0(f,"/api/queue/settings"),{method:"PUT",body:JSON.stringify({maxConcurrency:Number(A.maxConcurrency),targetGpuName:A.targetGpuName})})})}function N(){return Object.entries(A.selectedProjects).filter(([,b])=>b).map(([b])=>b)}async function K(){let b=N();if(b.length===0)throw Error("请先选择至少一个 project");await U("加入待启动队列",async()=>{await Eu(E0(f,"/api/queue"),{method:"POST",body:JSON.stringify({projectPaths:b,maxConcurrency:Number(A.maxConcurrency),targetGpuName:A.targetGpuName,start:!1})}),J({activeTab:"current",selectedProjects:{}})})}async function G(){let b=A.sourceProject||x[0]?.projectPath;if(!b)throw Error("请先选择源 project");await U("Fork Project",async()=>{let o=await Eu(E0(f,"/api/projects/fork"),{method:"POST",body:JSON.stringify({sourceProject:b,count:Number(A.forkCount),epochs:Number(A.forkEpochs),prefix:A.forkPrefix})}),nu=Array.isArray(o.projectPaths)?o.projectPaths:[],wu=nu.reduce((d,zu)=>{return d[zu]=!0,d},{...A.selectedProjects});return J({selectedProjects:wu}),`已 fork ${nu.length} 个 project,并已自动勾选;请确认后点击加入待启动队列。`})}async function W(){await U("启动队列",async()=>{await Eu(E0(f,"/api/queue/start"),{method:"POST",body:JSON.stringify({maxConcurrency:Number(A.maxConcurrency),targetGpuName:A.targetGpuName})}),J({activeTab:"current"})})}async function L(b){await U("取消任务",async()=>{await Eu(E0(f,`/api/jobs/${encodeURIComponent(b.id)}/cancel`),{method:"POST",body:JSON.stringify({})})})}async function q(b){let o=String(b?.projectPath||"");if(!o)return;$({loading:!0,error:"",kind:"project",key:o,title:o,data:null});try{let nu=await Eu(E0(f,`/api/projects/config?path=${encodeURIComponent(o)}`));$({loading:!1,error:"",kind:"project",key:o,title:o,data:nu})}catch(nu){$({loading:!1,error:Xu(nu,"Project 详情加载失败"),kind:"project",key:o,title:o,data:null})}}async function z(b){let o=String(b?.id||"");if(!o)return;$({loading:!0,error:"",kind:"job",key:o,title:b.projectPath||o,data:null});try{let nu=await Eu(E0(f,`/api/jobs/${encodeURIComponent(o)}`));$({loading:!1,error:"",kind:"job",key:o,title:nu?.job?.projectPath||b.projectPath||o,data:nu})}catch(nu){$({loading:!1,error:Xu(nu,"Job 详情加载失败"),kind:"job",key:o,title:b.projectPath||o,data:null})}}if(dX(()=>{Q(A.activeTab)},[n?.id,n?.runtime?.providerStatus,A.activeTab]),!n)return k(J1,{title:"MET Nonlinear 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=met-nonlinear"});let Z=eX(n),T=lc(n),X=uc(n),c=fc(y.queue?.queue||y.summary?.queue),S=ic(y.health,y.queue),p=y.health?.targetGpu||y.summary?.targetGpu||S.find((b)=>String(b.name||"").includes("2080")),Y=y.images?.mlImage||y.health?.image||{},D=nc(y.queue),x=yc(y.projects),V=$c(x),t=A.sourceProject||x[0]?.projectPath||"",M=D.filter((b)=>["staged","queued","running"].includes(b.status)),I=D.filter((b)=>b.status==="succeeded"),O=D.filter((b)=>["failed","canceled"].includes(b.status)),C=Array.isArray(y.history?.jobs)?y.history.jobs.slice(0,120):[],g=[{id:"projects",label:"项目库",count:x.length},{id:"current",label:"当前队列",count:M.length||Number(c.staged||0)+Number(c.queued||0)+Number(c.running||0)},{id:"completed",label:"已完成",count:I.length||Number(c.succeeded||0)},{id:"failed",label:"失败诊断",count:O.length||Number(c.failed||0)+Number(c.canceled||0)},{id:"gpu",label:"GPU/镜像",count:S.length}];function a(b,o){if(b.length===0)return k(J1,{title:o==="current"?"当前队列为空":"暂无记录",text:o==="current"?"从项目库选择或 fork project 后先加入待启动队列,再启动队列。":"终态任务会显示耗时、exit code 和失败诊断。"});return k("div",{className:"table-wrap met-job-table"},k("table",null,k("thead",null,k("tr",null,k("th",null,"状态"),k("th",null,"Project"),k("th",null,"Epoch"),k("th",null,"速度"),k("th",null,"ETA/耗时"),k("th",null,"GPU"),k("th",null,"Exit"),k("th",null,"更新时间"),k("th",null,"操作"))),k("tbody",null,b.map((nu)=>{let wu=nu.progress||{},d=["staged","queued","running"].includes(nu.status),zu=_.kind==="job"&&_.key===nu.id;return k("tr",{key:nu.id,className:`met-click-row ${zu?"active":""}`,onClick:()=>z(nu),"data-testid":`met-job-row-${rA(nu.id)}`},k("td",null,k(x3,{status:nu.status},sL(nu.status))),k("td",null,k("button",{type:"button",className:"met-inline-link",onClick:(v)=>{v.stopPropagation(),z(nu)}},nu.projectPath),k("code",null,nu.id)),k("td",null,k("span",null,`${wu.currentEpoch??"--"} / ${wu.epochTarget??nu.epochTarget??"--"}`),k("div",{className:"met-progress"},k("span",{style:{width:p3(wu.progressPercent)}}))),k("td",null,k("strong",null,AA(gL(nu)))),k("td",null,nu.status==="succeeded"||nu.status==="failed"||nu.status==="canceled"?vL(nu):nu.status==="running"?`ETA ${R7(_c(nu))}`:"--"),k("td",null,nu.gpuName||"--"),k("td",null,nu.exitCode??"--"),k("td",null,Zu(nu.updatedAt)),k("td",null,d?k("button",{type:"button",className:"ghost-btn mini",onClick:(v)=>{v.stopPropagation(),L(nu)},disabled:y.actionBusy},"取消"):null,k(X_,{title:`MET Job ${nu.id}`,data:nu,onOpen:l,testId:`raw-met-job-${nu.id}`})))}))))}function yu(){return k("div",{className:"met-queue-summary","data-testid":"met-current-summary"},k(x3,{status:"staged"},`待启动 ${c.staged??0}`),k(x3,{status:"queued"},`排队中 ${c.queued??0}`),k(x3,{status:"running"},`训练中 ${c.running??0}`),k("span",null,`最大并发 ${y.summary?.queue?.maxConcurrency??y.queue?.queue?.maxConcurrency??A.maxConcurrency}`),k("span",null,`目标 GPU ${y.summary?.queue?.targetGpuName??y.queue?.queue?.targetGpuName??A.targetGpuName}`))}function ru(b,o){let nu=A.expandedProjectDirs[b];return nu===void 0?o<2:Boolean(nu)}function R(b,o){let nu=ru(b,o);J({expandedProjectDirs:{...A.expandedProjectDirs,[b]:!nu}})}function m(b){let o=8+Math.max(0,b.depth)*16;if(Boolean(b.project)){let d=b.project,zu=Boolean(A.selectedProjects[d.projectPath]),v=_.kind==="project"&&_.key===d.projectPath;return k("div",{key:b.path,className:`met-tree-row project ${zu?"selected":""} ${v?"active":""}`,style:{paddingLeft:o},onClick:()=>q(d),"data-testid":`met-project-node-${rA(d.projectPath)}`},k("div",{className:"met-tree-name"},k("input",{type:"checkbox",checked:zu,onClick:($u)=>$u.stopPropagation(),onChange:($u)=>J({selectedProjects:{...A.selectedProjects,[d.projectPath]:$u.target.checked}}),"data-testid":`met-project-checkbox-${rA(d.projectPath)}`}),k("button",{type:"button",className:"met-inline-link project-path",onClick:($u)=>{$u.stopPropagation(),q(d)}},b.name)),k("span",null,d.useModel||"--"),k("span",null,d.epochTrain??"--"),k("span",null,p3(d.progress?.progressPercent)),k("span",null,AA(d.progress?.epochPerHour)))}let wu=ru(b.path,b.depth);return k(R3.default.Fragment,{key:b.path},k("div",{className:"met-tree-row folder",style:{paddingLeft:o},"data-testid":`met-project-folder-${rA(b.path)}`},k("button",{type:"button",className:"met-tree-toggle",onClick:()=>R(b.path,b.depth),"aria-label":wu?`折叠 ${b.path}`:`展开 ${b.path}`},wu?"-":"+"),k("strong",null,b.name),k("span",{className:"met-tree-count"},`${b.count} projects`)),wu?b.children.map((d)=>m(d)):null)}function fu(b){return k("div",{className:"met-detail-kv"},b.map((o)=>k("div",{key:o.label,className:"met-detail-kv-item"},k("span",null,o.label),k("strong",null,m3(o.value)),o.hint?k("small",null,o.hint):null)))}function iu(b,o){return k("div",{className:"met-detail-section"},k("h3",null,b),fu(o))}function Ju(b){if(!Array.isArray(b)||b.length===0)return k(J1,{title:"模型层未上报",text:"等待 data/model_info.json 或 compute_analysis.json 生成。"});return k("div",{className:"table-wrap met-layer-table"},k("table",null,k("thead",null,k("tr",null,k("th",null,"Layer"),k("th",null,"Type"),k("th",null,"Params"),k("th",null,"Trainable"),k("th",null,"Compute"))),k("tbody",null,b.slice(0,18).map((o,nu)=>k("tr",{key:`${o.name||"layer"}-${nu}`},k("td",null,o.name||`#${nu+1}`),k("td",null,o.type||"--"),k("td",null,b7(o.num_params)),k("td",null,o.trainable===void 0?"--":String(Boolean(o.trainable))),k("td",null,b7(o.compute?.total??o.estimated_cost?.weighted_units?.total)))))))}function Vu(b){let o=Array.isArray(b)?b:[];if(o.length===0)return k(J1,{title:"data/ 暂无文件",text:"训练或评估完成后会生成 training_state、metrics、model_info 等文件。"});return k("div",{className:"met-file-chip-grid"},o.slice(0,48).map((nu)=>k("span",{key:nu},nu)),o.length>48?k("span",null,`+${o.length-48}`):null)}function Lu(b){let o=String(b||"").replace(/\x1b\[[0-9;]*[A-Za-z]/g,"").split(/\r?\n/).map((nu)=>nu.trim()).filter(Boolean).slice(-12);if(o.length===0)return k(J1,{title:"暂无日志尾部",text:"该任务未上报 logTail 或日志已轮转。"});return k("div",{className:"met-log-lines"},o.map((nu,wu)=>k("div",{key:`${wu}-${nu.slice(0,16)}`},nu)))}function Bu(){if(_.loading)return k("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},k("div",{className:"panel-head compact"},k("div",null,k("p",{className:"panel-eyebrow"},"Detail Loading"),k(nl,{title:"详情加载中",loading:!0}))),k(J1,{title:"详情加载中",text:_.title||"正在读取 D601 data/ 和 config.json"}));if(_.error)return k("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},k(ul,{error:_.error,wide:!0}));if(!_.data)return k("section",{className:"met-detail-panel muted","data-testid":"met-detail-panel"},k(J1,{title:"选择一个项目或任务查看详情",text:"项目库、当前队列、已完成和失败诊断中的行都可以点击;默认只展示结构化字段,原始 JSON 需显式点击按钮。"}));let b=Ac(_),o=rc(_),nu=y0(b.config),wu=y0(b.progress||o.progress),d=y0(b.data),zu=y0(b.metrics||d.metrics||wu.trainingInfo?.evaluation_metrics),v=y0(d.trainingInfo||wu.trainingInfo),$u=y0(d.trainingState),Wu=y0(b.model||d.model),tu=Array.isArray(Wu.modelSummary)&&Wu.modelSummary.length>0?Wu.modelSummary:Wu.computeLayers,hu=y0(v.evaluation_metrics),$l=_.kind==="job"?"训练任务详情":"Project 详情";return k("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},k("div",{className:"panel-head compact"},k("div",null,k("p",{className:"panel-eyebrow"},_.kind==="job"?"Job + Project Detail":"Project Library Detail"),k(nl,{title:$l}),k("code",null,b.projectPath||o.projectPath||_.title)),k("div",{className:"panel-actions"},k(X_,{title:`MET ${$l}`,data:_.data,onOpen:l,testId:"raw-met-detail"}))),_.kind==="job"?iu("任务状态",[{label:"Job ID",value:o.id},{label:"状态",value:sL(o.status)},{label:"GPU",value:o.gpuName},{label:"Exit Code",value:o.exitCode},{label:"耗时",value:vL(o)},{label:"训练速度",value:AA(gL({...o,progress:wu}))}]):null,iu("config.json",[{label:"use_model",value:nu.use_model},{label:"epoch_train",value:nu.epoch_train},{label:"step_per_epoch",value:nu.step_per_epoch},{label:"learning_rate",value:nu.learning_rate},{label:"using_gpu",value:nu.using_gpu},{label:"use_points",value:nu.use_points},{label:"sample_rate",value:nu.sample_rate},{label:"time_clipped_s",value:nu.time_clipped_s},{label:"H_UNITS",value:nu.H_UNITS},{label:"INNER_KAN_UNITS",value:nu.INNER_KAN_UNITS},{label:"INNER_KAN_LAYERS",value:nu.INNER_KAN_LAYERS},{label:"GRID_SIZE",value:nu.GRID_SIZE},{label:"SPLINE_ORDER",value:nu.SPLINE_ORDER},{label:"USE_FAST_MODEL",value:nu.USE_FAST_MODEL},{label:"IIR_TRAINABLE",value:nu.IIR_TRAINABLE}]),iu("data/ 训练状态",[{label:"Epoch",value:`${wu.currentEpoch??$u.current_epoch??$u.completed_epoch??"--"} / ${wu.epochTarget??nu.epoch_train??"--"}`},{label:"Progress",value:p3(wu.progressPercent)},{label:"Last Loss",value:wu.lastLoss??$u.loss},{label:"Last Val Loss",value:wu.lastValLoss??$u.val_loss},{label:"Min Loss",value:v.min_loss??$u.min_loss},{label:"Min Val Loss",value:v.min_val_loss??$u.min_val_loss},{label:"Log Lines",value:wu.logLineCount},{label:"ETA",value:R7(wu.etaSeconds??$u.remaining_time)},{label:"训练速度",value:AA(wu.epochPerHour??$u.smoothed_speed)},{label:"Training Alive",value:$u.training_alive}]),iu("模型参数",[{label:"Model Type",value:Wu.modelType??nu.use_model},{label:"Total Params",value:Wu.totalParams,hint:Wu.totalParams===null||Wu.totalParams===void 0?"未上报":"data/model_info.json"},{label:"Trainable",value:Wu.trainableParams},{label:"Non-trainable",value:Wu.nonTrainableParams},{label:"Compute Cost",value:Wu.computeCost},{label:"Estimate Status",value:Wu.estimateStatus},{label:"Unsupported Layers",value:Wu.unsupportedLayerCount}]),iu("指标",[{label:"train_loss",value:zu.train_loss??hu.train_loss},{label:"val_loss",value:zu.val_loss??hu.val_loss},{label:"train_mae",value:zu.train_mae??hu.train_mae},{label:"val_mae",value:zu.val_mae??hu.val_mae},{label:"train_afmae",value:zu.train_afmae??hu.train_afmae},{label:"val_afmae",value:zu.val_afmae??hu.val_afmae},{label:"freq_drift_hz",value:zu.freq_drift_hz},{label:"sens_drift_percent",value:zu.sens_drift_percent},{label:"linearity_percent",value:zu.linearity_percent},{label:"weights_source",value:zu.weights_source??hu.weights_source},{label:"lr min/mean/max",value:`${m3(v.learning_rate_min)} / ${m3(v.learning_rate_mean)} / ${m3(v.learning_rate_max)}`}]),k("div",{className:"met-detail-section"},k("h3",null,"模型层"),Ju(tu)),k("div",{className:"met-detail-section"},k("h3",null,"data/ 文件"),Vu(d.files)),_.kind==="job"?k("div",{className:"met-detail-section"},k("h3",null,"日志尾部"),Lu(y0(_.data).logTail)):null)}return k("div",{className:"met-page","data-testid":"met-nonlinear-page"},k(m7,{title:"MET Nonlinear 训练编排",eyebrow:"D601 GPU 用户服务",loading:y.loading||y.actionBusy,actions:k("div",{className:"panel-actions"},k("button",{type:"button",className:"ghost-btn",onClick:Q,disabled:y.loading,"data-testid":"met-refresh-button"},y.loading?"刷新中":"刷新"),k(X_,{title:"MET Nonlinear 用户服务",data:n,onOpen:l,testId:"raw-met-service"}))},k("div",{className:"findjob-hero"},k("div",null,k("div",{className:"node-version-line"},k(x3,{status:Z.providerStatus==="online"?"online":"warn"},Z.providerStatus||"unknown"),k("span",null,n.providerId),k("span",null,X.public?"公网暴露":"仅 UniDesk frontend 代理访问")),k("p",{className:"muted paragraph"},n.description)),k("div",{className:"microservice-ref-card"},k("span",null,"Repo"),k("strong",null,T.url||"--"),k("code",null,T.commitId||"--")),k("div",{className:"microservice-ref-card"},k("span",null,"D601 Docker"),k("strong",null,`${X.nodeBindHost||"--"}:${X.nodePort||"--"}`),k("code",null,`${T.composeFile||"--"} / ${T.containerName||"--"}`))),k(ul,{error:y.error,wide:!0}),A.actionMessage?k("div",{className:"met-action-log","data-testid":"met-action-message"},A.actionMessage):null),k("div",{className:"met-grid"},k(m7,{title:"核心状态",eyebrow:y.refreshedAt?`Updated ${rl(y.refreshedAt)}`:"Queue + GPU",loading:y.loading},k("div",{className:"metric-grid"},k(_y,{label:"Staged",value:c.staged??0,hint:"加入队列未开始",tone:Number(c.staged||0)>0?"warn":""}),k(_y,{label:"Queued",value:c.queued??0,hint:"排队等待调度",tone:Number(c.queued||0)>0?"warn":""}),k(_y,{label:"Running",value:c.running??0,hint:`max ${y.summary?.queue?.maxConcurrency??y.queue?.queue?.maxConcurrency??"--"}`,tone:Number(c.running||0)>0?"ok":""}),k(_y,{label:"Succeeded",value:c.succeeded??0,hint:"已完成"}),k(_y,{label:"Failed",value:c.failed??0,hint:"需要诊断",tone:Number(c.failed||0)>0?"warn":""}),k(_y,{label:"2080Ti Free",value:p?p3(Number(p.freeRatio)*100):"--",hint:p?`${p.memoryFreeMiB}/${p.memoryTotalMiB} MiB`:"等待 GPU 上报"}),k(_y,{label:"ML Image",value:Y.present?"READY":"MISSING",hint:Y.image||"met-nonlinear-ml:tf26",tone:Y.present?"ok":"warn"}),k(_y,{label:"Health",value:y.health?.ok?"OK":"--",hint:"D601 /health"}))),k(m7,{title:"队列控制",eyebrow:"Downloader-like staging",loading:y.actionBusy},k("div",{className:"met-control-strip"},k("label",null,"最大并发",k("input",{type:"number",min:1,max:16,value:A.maxConcurrency,"data-testid":"met-max-concurrency-input",onChange:(b)=>J({maxConcurrency:b.target.value})})),k("label",null,"目标 GPU",k("input",{value:A.targetGpuName,"data-testid":"met-target-gpu-input",onChange:(b)=>J({targetGpuName:b.target.value})})),k("button",{type:"button",className:"ghost-btn",onClick:F,disabled:y.actionBusy,"data-testid":"met-save-settings-button"},"保存设置"),k("button",{type:"button",className:"primary-btn",onClick:W,disabled:y.actionBusy||Number(c.staged||0)===0,"data-testid":"met-start-queue-button"},"启动队列")),k("p",{className:"muted paragraph"},"Project 先进入待启动队列,不会立即训练;点击启动队列后才切换为排队中,并由 D601 scheduler 按最大并发和 2080Ti 显存策略调度。")),k("section",{className:"panel met-workspace"},k("div",{className:"met-tabs",role:"tablist"},g.map((b)=>k("button",{key:b.id,type:"button",className:A.activeTab===b.id?"active":"",onClick:()=>J({activeTab:b.id}),"data-testid":`met-tab-${b.id}`},`${b.label} ${b.count}`))),k("div",{className:"panel-body"},A.activeTab==="projects"?k("div",{className:"met-form-grid","data-testid":"met-projects-pane"},k("div",{className:"met-fork-card"},k("h3",null,"Fork Project"),k("label",null,"源 Project",k("select",{value:t,"data-testid":"met-source-project-select",onChange:(b)=>J({sourceProject:b.target.value})},x.map((b)=>k("option",{key:b.projectPath,value:b.projectPath},`${b.projectPath} · ${b.useModel||"model?"}`)))),k("label",null,"Fork 数量",k("input",{type:"number",min:1,max:100,value:A.forkCount,"data-testid":"met-fork-count-input",onChange:(b)=>J({forkCount:b.target.value})})),k("label",null,"训练轮数",k("input",{type:"number",min:1,max:1e5,value:A.forkEpochs,"data-testid":"met-fork-epochs-input",onChange:(b)=>J({forkEpochs:b.target.value})})),k("label",null,"目标前缀",k("input",{value:A.forkPrefix,"data-testid":"met-fork-prefix-input",onChange:(b)=>J({forkPrefix:b.target.value})})),k("button",{type:"button",className:"primary-btn",onClick:G,disabled:y.actionBusy||!t,"data-testid":"met-fork-button"},"Fork Project"),k("p",{className:"muted paragraph"},"Fork 只创建新 Project 并自动勾选,不会直接训练;需要在右侧确认后加入待启动队列。")),k("div",{className:"met-project-list"},k("div",{className:"panel-head compact"},k("div",null,k("p",{className:"panel-eyebrow"},`Existing Projects · ${(y.projects?.roots||[]).map((b)=>`${b.root} ${b.count}`).join(" / ")}`),k(nl,{title:"选择已有 Project",loading:y.loading||y.actionBusy})),k("button",{type:"button",className:"ghost-btn",onClick:K,disabled:y.actionBusy||N().length===0,"data-testid":"met-stage-selected-button"},`加入待启动队列 (${N().length})`)),x.length===0?k(J1,{title:"暂无 project",text:"等待 D601 返回 /api/projects"}):k("div",{className:"met-project-table","data-testid":"met-project-tree"},k("div",{className:"met-tree-header"},k("span",null,"文件树 Project"),k("span",null,"Model"),k("span",null,"Epochs"),k("span",null,"Progress"),k("span",null,"速度")),V.children.map((b)=>m(b)))),Bu()):null,A.activeTab==="current"?k("div",{"data-testid":"met-current-pane"},yu(),a(M,"current"),Bu(),k("div",{className:"panel-actions inline-actions"},k(X_,{title:"MET Queue",data:y.queue,onOpen:l,testId:"raw-met-queue"}))):null,A.activeTab==="completed"?k("div",{"data-testid":"met-completed-pane"},a(I.length>0?I:C.filter((b)=>b.status==="succeeded"),"completed"),Bu()):null,A.activeTab==="failed"?k("div",{"data-testid":"met-failed-pane"},a(O.length>0?O:C.filter((b)=>["failed","canceled"].includes(b.status)),"failed"),Bu(),k("div",{className:"panel-actions inline-actions"},k(X_,{title:"MET History",data:y.history,onOpen:l,testId:"raw-met-history"}))):null,A.activeTab==="gpu"?k("div",{className:"met-gpu-pane","data-testid":"met-gpu-pane"},S.length===0?k(J1,{title:"暂无 GPU 上报",text:"等待 D601 met-nonlinear-ts 或 ML image 提供 nvidia-smi 数据"}):k("div",{className:"table-wrap"},k("table",null,k("thead",null,k("tr",null,k("th",null,"Index"),k("th",null,"Name"),k("th",null,"Free"),k("th",null,"Policy"))),k("tbody",null,S.map((b)=>k("tr",{key:b.index},k("td",null,b.index),k("td",null,b.name),k("td",null,`${b.memoryFreeMiB} / ${b.memoryTotalMiB} MiB`,k("div",{className:"met-progress"},k("span",{style:{width:p3(Number(b.freeRatio)*100)}}))),k("td",null,String(b.name||"").includes("2080")?"target 2080Ti, <20% 限制并发":"non-target")))))),k("div",{className:"panel-actions inline-actions"},k(X_,{title:"MET Images",data:y.images,onOpen:l,testId:"raw-met-images"}))):null))))}var NA=ku(ql(),1);var Gu=NA.default.createElement,{useEffect:dL,useMemo:jc}=NA.default,JA=NA.default.useState;function eL({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return Gu("span",{className:`status-badge ${f}`},l||u||"unknown")}function b3({label:u,value:l,hint:f,tone:n}){return Gu("article",{className:`metric-card ${n||""}`},Gu("div",{className:"metric-label"},u),Gu("div",{className:"metric-value"},l),Gu("div",{className:"metric-hint"},f))}function QA({title:u,eyebrow:l,actions:f,children:n,className:y,loading:i}){return Gu("section",{className:`panel ${y||""}`},Gu("div",{className:"panel-head"},Gu("div",null,l?Gu("p",{className:"panel-eyebrow"},l):null,Gu(nl,{title:u,loading:i})),f?Gu("div",{className:"panel-actions"},f):null),Gu("div",{className:"panel-body"},n))}function k7({title:u,data:l,onOpen:f,testId:n}){return Gu("button",{type:"button",className:"ghost-btn","data-testid":n,onClick:()=>f(u,l)},"查看原始JSON")}function UA({title:u,text:l}){return Gu("div",{className:"empty-state"},Gu("strong",null,u),Gu("span",null,l))}function Jc(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function Qc(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function Uc(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function c_(u,l){return`${u}/microservices/mdtodo/proxy${l}`}function uK(u){if(u==="completed")return"已完成";if(u==="in_progress")return"进行中";return"待处理"}function Nc(u){if(u==="completed")return"online";if(u==="in_progress")return"warn";return"unknown"}function h7(u){let l=[],f=(n)=>{for(let y of n)if(l.push(y),Array.isArray(y.children))f(y.children)};return f(Array.isArray(u)?u:[]),l}function Fc({tasks:u,selectedId:l,onSelect:f}){if(!u.length)return Gu(UA,{title:"暂无任务",text:"当前文件没有 R 编号任务。"});let n=(y)=>Gu("li",{key:y.id},Gu("button",{type:"button",className:`mdtodo-task-row ${l===y.id?"active":""}`,style:{"--task-depth":Math.min(Number(y.depth||0),6)},onClick:()=>f(y.id),"data-testid":`mdtodo-task-${String(y.id).replace(/[^A-Za-z0-9_-]+/g,"-")}`},Gu(eL,{status:Nc(y.status)},uK(y.status)),Gu("code",null,y.id),Gu("span",{className:"mdtodo-task-title"},y.title||"--"),Gu("span",{className:"mdtodo-link-count"},`${y.linkExists??0}/${y.linkCount??0}`)),Array.isArray(y.children)&&y.children.length>0?Gu("ol",null,y.children.map(n)):null);return Gu("ol",{className:"mdtodo-tree"},u.map(n))}function lK({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let n=u.find((p)=>p.id==="mdtodo")||null,[y,i]=JA({loading:!1,saving:!1,error:"",notice:"",health:null,files:[],todo:null,selectedFile:"",selectedTaskId:"",refreshedAt:null,command:null}),[_,$]=JA(""),[A,j]=JA(""),[J,Q]=JA(""),U=Array.isArray(y.todo?.tasks)?y.todo.tasks:[],F=jc(()=>h7(U),[y.todo]),N=F.find((p)=>p.id===y.selectedTaskId)||F[0]||null,K=y.todo?.stats||{};async function G(p=y.selectedFile){if(!n)return;i((Y)=>({...Y,loading:!0,error:"",notice:""}));try{let[Y,D]=await Promise.all([Eu(`${f}/microservices/mdtodo/health`),Eu(c_(f,"/api/files"))]),x=Array.isArray(D.files)?D.files:[],V=p||x[0]?.path||"",t=V?await Eu(c_(f,`/api/tasks?file=${encodeURIComponent(V)}`)):null,M=Array.isArray(t?.tasks)?h7(t.tasks):[],I=M.some((O)=>O.id===y.selectedTaskId)?y.selectedTaskId:M[0]?.id||"";i({loading:!1,saving:!1,error:"",notice:"",health:Y,files:x,todo:t,selectedFile:V,selectedTaskId:I,refreshedAt:new Date,command:y.command})}catch(Y){i((D)=>({...D,loading:!1,error:Xu(Y,"MDTODO 加载失败")}))}}if(dL(()=>{G()},[n?.id,n?.runtime?.providerStatus]),dL(()=>{$(N?.title||""),j(N?.rawContent||"")},[N?.id,y.selectedFile]),!n)return Gu(UA,{title:"MDTODO 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=mdtodo"});let W=Jc(n),L=Uc(n),q=Qc(n);async function z(p){i((Y)=>({...Y,selectedFile:p,selectedTaskId:"",command:null})),await G(p)}async function Z(p){if(!N||!y.selectedFile)return;i((Y)=>({...Y,saving:!0,error:"",notice:""}));try{let Y=await Eu(c_(f,`/api/tasks/${encodeURIComponent(N.id)}`),{method:"PATCH",body:{file:y.selectedFile,...p}});i((D)=>({...D,saving:!1,todo:Y.file,notice:Y.result?.message||"任务已更新"}))}catch(Y){i((D)=>({...D,saving:!1,error:Xu(Y,"任务更新失败")}))}}async function T(){await Z({title:_,rawContent:A})}async function X(p){if(!y.selectedFile)return;i((Y)=>({...Y,saving:!0,error:"",notice:""}));try{let Y=await Eu(c_(f,"/api/tasks"),{method:"POST",body:{file:y.selectedFile,parentId:p,title:J||"新任务"}});Q(""),i((D)=>({...D,saving:!1,todo:Y.file,selectedTaskId:Y.result?.taskId||D.selectedTaskId,notice:Y.result?.message||"任务已创建"})),await G(y.selectedFile)}catch(Y){i((D)=>({...D,saving:!1,error:Xu(Y,"创建任务失败")}))}}async function c(){if(!N||!y.selectedFile)return;if(!window.confirm(`删除 ${N.id} 及其子任务?`))return;i((p)=>({...p,saving:!0,error:"",notice:""}));try{let p=await Eu(c_(f,`/api/tasks/${encodeURIComponent(N.id)}?file=${encodeURIComponent(y.selectedFile)}`),{method:"DELETE"}),Y=h7(p.file?.tasks||[]);i((D)=>({...D,saving:!1,todo:p.file,selectedTaskId:Y[0]?.id||"",notice:p.result?.message||"任务已删除"}))}catch(p){i((Y)=>({...Y,saving:!1,error:Xu(p,"删除任务失败")}))}}async function S(){if(!N||!y.selectedFile)return;i((p)=>({...p,saving:!0,error:"",command:null}));try{let p=await Eu(c_(f,"/api/execute-command"),{method:"POST",body:{file:y.selectedFile,taskId:N.id,mode:"codex"}});i((Y)=>({...Y,saving:!1,command:p,notice:"执行命令已生成"}))}catch(p){i((Y)=>({...Y,saving:!1,error:Xu(p,"执行命令生成失败")}))}}return Gu("div",{className:"mdtodo-page","data-testid":"mdtodo-page"},Gu(QA,{title:"MDTODO 工作台",eyebrow:"D601 k3s managed service",loading:y.loading,actions:Gu("div",{className:"panel-actions"},Gu("button",{type:"button",className:"ghost-btn",onClick:()=>void G(),disabled:y.loading,"data-testid":"mdtodo-refresh-button"},y.loading?"刷新中":"刷新"),Gu(k7,{title:"MDTODO 用户服务",data:n,onOpen:l,testId:"raw-mdtodo-service"}))},Gu("div",{className:"findjob-hero"},Gu("div",null,Gu("div",{className:"node-version-line"},Gu(eL,{status:W.providerStatus==="online"?"online":"warn"},W.providerStatus||"unknown"),Gu("span",null,n.providerId),Gu("span",null,q.proxyMode||"--")),Gu("p",{className:"muted paragraph"},n.description)),Gu("div",{className:"microservice-ref-card"},Gu("span",null,"Repo"),Gu("strong",null,L.url||"--"),Gu("code",null,L.composeFile||"--")),Gu("div",{className:"microservice-ref-card"},Gu("span",null,"Workspace"),Gu("strong",null,y.health?.rootDir||"/workspace"),Gu("code",null,`${q.nodeBindHost||"--"}:${q.nodePort||"--"}`))),Gu(ul,{error:y.error,wide:!0}),y.notice?Gu("div",{className:"notice-line"},y.notice):null),Gu("div",{className:"metric-grid"},Gu(b3,{label:"TODO 文件",value:y.files.length,hint:y.health?.rootExists?"hostPath ready":"hostPath missing",tone:y.health?.ok?"ok":"warn"}),Gu(b3,{label:"任务总数",value:K.total??"--",hint:y.selectedFile||"--"}),Gu(b3,{label:"已完成",value:K.completed??"--",hint:"completed",tone:"ok"}),Gu(b3,{label:"进行中",value:K.inProgress??"--",hint:"in progress",tone:"warn"}),Gu(b3,{label:"待处理",value:K.pending??"--",hint:y.refreshedAt?rl(y.refreshedAt):"pending"})),Gu("div",{className:"mdtodo-layout"},Gu(QA,{title:"文件",eyebrow:`${y.files.length} Markdown`,loading:y.loading,className:"mdtodo-file-panel"},y.files.length===0?Gu(UA,{title:"暂无 TODO 文件",text:"等待后端扫描 MDTODO 工作区。"}):Gu("div",{className:"mdtodo-file-list"},y.files.map((p)=>Gu("button",{key:p.path,type:"button",className:`mdtodo-file-item ${y.selectedFile===p.path?"active":""}`,onClick:()=>void z(p.path)},Gu("strong",null,p.name),Gu("span",null,p.directory||"."),Gu("code",null,`${p.stats?.total??"--"} tasks / ${Zu(p.mtime)}`))))),Gu(QA,{title:"任务树",eyebrow:y.selectedFile||"Tasks",loading:y.loading,actions:Gu("div",{className:"panel-actions"},Gu("input",{value:J,onChange:(p)=>Q(p.target.value),placeholder:"新任务标题","data-testid":"mdtodo-new-title"}),Gu("button",{type:"button",className:"ghost-btn",onClick:()=>void X(),disabled:y.saving||!y.selectedFile},"新增"),N?Gu("button",{type:"button",className:"ghost-btn",onClick:()=>void X(N.id),disabled:y.saving},"新增子任务"):null,y.todo?Gu(k7,{title:"MDTODO 当前文件",data:y.todo,onOpen:l,testId:"raw-mdtodo-file"}):null)},Gu(Fc,{tasks:U,selectedId:N?.id||"",onSelect:(p)=>i((Y)=>({...Y,selectedTaskId:p,command:null}))})),Gu(QA,{title:N?`${N.id} 详情`:"任务详情",eyebrow:N?uK(N.status):"Detail",loading:y.saving,className:"mdtodo-detail-panel",actions:N?Gu("div",{className:"panel-actions"},Gu("button",{type:"button",className:"ghost-btn",onClick:()=>void Z({status:"pending"}),disabled:y.saving},"待处理"),Gu("button",{type:"button",className:"ghost-btn",onClick:()=>void Z({status:"in_progress"}),disabled:y.saving},"进行中"),Gu("button",{type:"button",className:"primary-btn",onClick:()=>void Z({status:"completed"}),disabled:y.saving},"完成")):null},!N?Gu(UA,{title:"未选中任务",text:"请选择一个任务。"}):Gu("div",{className:"mdtodo-editor"},Gu("label",null,"标题",Gu("input",{value:_,onChange:(p)=>$(p.target.value),"data-testid":"mdtodo-title-input"})),Gu("label",null,"正文",Gu("textarea",{value:A,onChange:(p)=>j(p.target.value),rows:12,"data-testid":"mdtodo-raw-input"})),Gu("div",{className:"docker-meta compact"},Gu("span",null,`line ${Number(N.lineNumber??0)+1}`),Gu("span",null,`depth ${N.depth??0}`),Gu("span",null,`links ${N.linkExists??0}/${N.linkCount??0}`)),Gu("div",{className:"inline-actions"},Gu("button",{type:"button",className:"primary-btn",onClick:T,disabled:y.saving},y.saving?"保存中":"保存"),Gu("button",{type:"button",className:"ghost-btn",onClick:S,disabled:y.saving},"生成执行命令"),Gu("button",{type:"button",className:"danger-btn",onClick:c,disabled:y.saving},"删除"),Gu(k7,{title:`MDTODO ${N.id}`,data:N,onOpen:l,testId:"raw-mdtodo-task"})),y.command?Gu("div",{className:"mdtodo-command"},Gu("span",null,y.command.prompt||"--"),Gu("code",null,y.command.command||"--")):null))))}var WA=[{id:"ops",label:"运行总览",code:"OPS",tabs:[{id:"status",label:"态势总览"},{id:"performance",label:"性能面板"},{id:"events",label:"事件摘要"},{id:"logs",label:"服务日志"}]},{id:"nodes",label:"资源节点",code:"NODE",tabs:[{id:"list",label:"节点清单"},{id:"monitor",label:"资源监控"},{id:"docker",label:"Docker 状态"},{id:"gateway",label:"网关版本"},{id:"labels",label:"资源标签"},{id:"heartbeats",label:"心跳状态"}]},{id:"tasks",label:"任务调度",code:"TASK",tabs:[{id:"dispatch",label:"下发任务"},{id:"scheduled",label:"定时任务"},{id:"pending",label:"待处理任务"},{id:"history",label:"任务历史"},{id:"results",label:"执行结果"}]},{id:"apps",label:"用户服务",code:"APP",routeSegment:"app",tabs:[{id:"catalog",label:"服务目录"},{id:"hwlab",label:"HWLAB"},{id:"todo-note",label:"Todo Note"},{id:"findjob",label:"FindJob"},{id:"pipeline",label:"Pipeline"},{id:"met-nonlinear",label:"MET Nonlinear"},{id:"claudeqq",label:"ClaudeQQ"},{id:"baidu-netdisk",label:"Baidu Netdisk"},{id:"filebrowser",label:"File Browser"},{id:"oa-event-flow",label:"OA Event Flow"},{id:"k3sctl",label:"k3s Control"},{id:"code-queue",label:"Code Queue"},{id:"mdtodo",label:"MDTODO"},{id:"decision-center",label:"Decision Center"},{id:"project-manager",label:"Project Manager"}]},{id:"config",label:"系统配置",code:"CFG",tabs:[{id:"topology",label:"连接拓扑"},{id:"auth",label:"认证策略"},{id:"security",label:"安全边界"}]}],k3=Object.fromEntries(WA.map((u)=>[u.id,u.tabs[0]?.id??""]));function Wc(u){let l=String(u||"").trim();if(!l)return"";try{return decodeURIComponent(l)}catch{return l}}function FA(u){let l=String(u||"/"),[f]=l.split(/[?#]/u,1);if(f==="/")return"/";let y=`/${f.split("/").map(Wc).filter(Boolean).join("/")}`;return y.endsWith("/")?y:`${y}/`}function qc(u){let l=2166136261;for(let f of u)l^=f.charCodeAt(0),l=Math.imul(l,16777619);return Math.abs(l>>>0).toString(36)}function I7(u){return String(u||"").normalize("NFKD").replace(/[\u0300-\u036f]/gu,"").toLowerCase().replace(/[^a-z0-9]+/gu,"-").replace(/^-+|-+$/gu,"")}function fK(u){return String(u||"").trim().toLowerCase().replace(/[\s/\\?#%]+/gu,"-").replace(/-+/gu,"-").replace(/^-+|-+$/gu,"")}function nK(u){let l=I7(u.routeSegment||"")||fK(u.routeSegment||"");if(l)return l;let f=I7(u.id||"");if(f)return f;let n=I7(u.label||"")||fK(u.label||"");if(n)return n;return`route-${qc(JSON.stringify(u))}`}function v7(u,l){return`${u}:${l}`}function yK(u){let l=u.map((A)=>{let j=nK(A);return{...A,routeSegment:j,tabs:A.tabs.map((J)=>({...J,routeSegment:nK(J)}))}}),f={},n={},y={},i=l.map((A)=>{let j=A.tabs[0]?.id??"";y[A.id]=j;let J=A.tabs.map((F)=>{let N=`/${A.routeSegment}/${F.routeSegment}/`,K=[N],G={moduleId:A.id,tabId:F.id};for(let W of K)f[FA(W)]=G;return n[v7(A.id,F.id)]=N,{...F,canonicalPath:N,aliases:K}}),Q=`/${A.routeSegment}/`,U={moduleId:A.id,tabId:j};return f[FA(Q)]=U,{...A,routeSegment:A.routeSegment,canonicalPath:Q,tabs:J}}),_=i[0],$={moduleId:_?.id||"",tabId:_?.tabs[0]?.id||""};return f["/"]=$,{modules:i,moduleById:Object.fromEntries(i.map((A)=>[A.id,A])),defaultActiveTabs:y,routeMap:f,canonicalPathByTarget:n,fallbackTarget:$}}function g7(u,l){return u.routeMap[FA(l)]||u.fallbackTarget}function qA(u,l,f){return u.canonicalPathByTarget[v7(l,f)]||u.canonicalPathByTarget[v7(u.fallbackTarget.moduleId,u.fallbackTarget.tabId)]||"/"}function iK(u,l){let f=u.routeMap[FA(l)];if(!f)return null;return qA(u,f.moduleId,f.tabId)}var GA=ku(ql(),1);var Au=GA.default.createElement,{useEffect:_K,useMemo:Lc}=GA.default,s7=GA.default.useState;function zA({status:u,children:l,title:f}){let n=String(u||"unknown").toLowerCase();return Au("span",{className:`status-badge ${n}`,title:f},l||u||"unknown")}function h3({label:u,value:l,hint:f,tone:n}){return Au("article",{className:`metric-card ${n||""}`},Au("div",{className:"metric-label"},u),Au("div",{className:"metric-value"},l),Au("div",{className:"metric-hint"},f))}function LA({title:u,eyebrow:l,actions:f,children:n,className:y,loading:i}){return Au("section",{className:`panel ${y||""}`},Au("div",{className:"panel-head"},Au("div",null,l?Au("p",{className:"panel-eyebrow"},l):null,Au(nl,{title:u,loading:i})),f?Au("div",{className:"panel-actions"},f):null),Au("div",{className:"panel-body"},n))}function I3({title:u,data:l,onOpen:f,testId:n}){return Au("button",{type:"button",className:"ghost-btn","data-testid":n,onClick:()=>f?.(u,l)},"查看原始JSON")}function a7({title:u,text:l}){return Au("div",{className:"empty-state"},Au("strong",null,u),Au("span",null,l))}function Kc(u){return u&&typeof u==="object"&&!Array.isArray(u)?u:null}function Q1(u){return Array.isArray(u)?u:[]}function i0(u){let l=Number(u);return Number.isFinite(l)?l.toLocaleString("zh-CN"):"--"}function $K(u,l=140){if(u===null||u===void 0)return"--";let f=typeof u==="string"?u:JSON.stringify(u),n=String(f||"").replace(/\s+/gu," ").trim();return n.length>l?`${n.slice(0,l-1)}...`:n||"--"}function zc(u){return Q1(u?.tags).map((l)=>String(l||"").trim()).filter(Boolean)}function $i(u){let l=Number(u);return Number.isFinite(l)&&l>=0?Math.floor(l):0}function Gc(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function wc(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function Zc(u){return String(u||"").split(/[\s,]+/u).map((l)=>l.trim()).filter(Boolean).join(",")}function KA(u,l){return`${u}/microservices/oa-event-flow/proxy${l}`}function Ec(u){if(u.includes("error")||u.includes("failed"))return"failed";if(u.includes("stats"))return"ok";if(u.includes("step")||u.includes("updated"))return"running";return"queued"}function Hc(u){let l=String(u?.subjectKind||"trace"),f=String(u?.subjectId||u?.scopeId||"");return f?`${l}:${f}`:String(u?.scopeId||"--")}function Oc({tags:u}){let l=zc({tags:u}).slice(0,6);return Au("div",{className:"oa-tag-rail"},l.length===0?Au("span",{className:"muted"},"--"):l.map((f)=>Au("code",{key:f},f)))}function Tc({events:u,onRaw:l}){let f=[...Q1(u)].reverse();return f.length===0?Au(a7,{title:"事件表暂无记录",text:"等待 Code Queue 或 Pipeline 按 tag 发布 OA 事件"}):Au("div",{className:"table-wrap oa-event-table-wrap"},Au("table",{className:"oa-event-table","data-testid":"oa-event-flow-event-table"},Au("thead",null,Au("tr",null,Au("th",null,"Seq"),Au("th",null,"Type"),Au("th",null,"Source"),Au("th",null,"Aggregate"),Au("th",null,"Tags"),Au("th",null,"Payload"),Au("th",null,"Created"),Au("th",null,"Raw"))),Au("tbody",null,f.map((n)=>{let y=String(n?.type||"event"),i=`${String(n?.aggregateType||"--")}:${String(n?.aggregateId||"--")}`;return Au("tr",{key:n?.eventId||n?.sequence},Au("td",null,Au("code",null,i0(n?.sequence))),Au("td",null,Au(zA,{status:Ec(y)},y)),Au("td",null,Au("strong",null,n?.sourceId||"--"),Au("code",null,n?.sourceKind||"--")),Au("td",null,Au("code",null,i)),Au("td",null,Au(Oc,{tags:n?.tags})),Au("td",null,Au("span",{className:"oa-payload-preview"},$K(n?.payload,180))),Au("td",null,Zu(n?.createdAt)),Au("td",null,Au(I3,{title:`OA Event ${n?.sequence||""}`,data:n,onOpen:l,testId:`raw-oa-event-${n?.sequence||"unknown"}`})))}))))}function Vc({stats:u,onRaw:l}){let f=Q1(u);return f.length===0?Au(a7,{title:"统计中心暂无投影",text:"trace-stats-snapshot / trace-step-created 进入事件流后会更新这里"}):Au("div",{className:"table-wrap oa-stats-table-wrap"},Au("table",{className:"oa-stats-table","data-testid":"oa-event-flow-stats"},Au("thead",null,Au("tr",null,Au("th",null,"Scope"),Au("th",null,"Service"),Au("th",null,"STEP"),Au("th",null,"Read"),Au("th",null,"Edit"),Au("th",null,"Run"),Au("th",null,"Error"),Au("th",null,"Output Seq"),Au("th",null,"Revision"),Au("th",null,"Updated"),Au("th",null,"Raw"))),Au("tbody",null,f.map((n)=>Au("tr",{key:n?.scopeId||`${n?.serviceId}-${n?.subjectId}`},Au("td",null,Au("strong",null,Hc(n)),Au("code",null,n?.scopeId||"--")),Au("td",null,Au(zA,{status:String(n?.serviceId||"unknown")==="code-queue"?"running":"queued"},n?.serviceId||"--")),Au("td",null,Au("strong",null,i0($i(n?.stepCount??n?.llmStepCount)))),Au("td",null,i0($i(n?.readCount))),Au("td",null,i0($i(n?.editCount))),Au("td",null,i0($i(n?.runCount))),Au("td",null,i0($i(n?.errorCount))),Au("td",null,Au("code",null,i0($i(n?.outputMaxSeq)))),Au("td",null,i0($i(n?.statsRevision))),Au("td",null,Zu(n?.updatedAt)),Au("td",null,Au(I3,{title:`OA Trace Stats ${n?.scopeId||""}`,data:n,onOpen:l,testId:`raw-oa-stats-${String(n?.scopeId||"unknown").replace(/[^a-zA-Z0-9_-]/gu,"_")}`})))))))}function AK({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let n=u.find((Z)=>Z.id==="oa-event-flow")||null,[y,i]=s7("service:code-queue"),[_,$]=s7({loading:!1,error:"",health:null,diagnostics:null,events:[],stats:[],refreshedAt:null}),[A,j]=s7({status:"idle",message:"未连接",lastEventAt:""}),J=Lc(()=>Zc(y),[y]);async function Q(){if(!n)return;$((Z)=>({...Z,loading:!0,error:""}));try{let Z=J?`tags=${encodeURIComponent(J)}&`:"",[T,X,c,S]=await Promise.all([Eu(`${f}/microservices/oa-event-flow/health`,{failureFields:[]}),Eu(KA(f,"/api/diagnostics")),Eu(KA(f,`/api/events?${Z}limit=100`)),Eu(KA(f,`/api/stats/trace?${Z}limit=100`))]);$({loading:!1,error:"",health:T,diagnostics:X,events:Q1(c?.events),stats:Q1(S?.stats),refreshedAt:new Date})}catch(Z){$((T)=>({...T,loading:!1,error:Xu(Z,"OA Event Flow 加载失败")}))}}if(_K(()=>{Q()},[n?.id,n?.runtime?.providerStatus,J]),_K(()=>{if(!n||typeof EventSource>"u")return;let Z=J?`?tags=${encodeURIComponent(J)}`:"",T=new EventSource(`${KA(f,"/api/events/stream")}${Z}`,{withCredentials:!0});j({status:"running",message:"SSE connecting",lastEventAt:""});let X=(p)=>{j({status:"online",message:$K(p.data,120),lastEventAt:new Date().toISOString()})},c=(p)=>{try{let Y=JSON.parse(String(p.data||"{}"));j({status:"online",message:String(Y?.type||p.type||"event"),lastEventAt:new Date().toISOString()}),$((D)=>{let x=[...Q1(D.events).filter((t)=>String(t?.eventId||"")!==String(Y?.eventId||"")),Y].sort((t,M)=>Number(t?.sequence||0)-Number(M?.sequence||0)).slice(-100),V=Y?.type==="trace-stats-updated"&&Kc(Y?.payload?.stats)?[Y.payload.stats,...Q1(D.stats).filter((t)=>String(t?.scopeId||"")!==String(Y.payload.stats.scopeId||""))].slice(0,100):D.stats;return{...D,events:x,stats:V}})}catch(Y){j({status:"warn",message:Xu(Y,"SSE 事件解析失败"),lastEventAt:new Date().toISOString()})}},S=()=>{j((p)=>({...p,status:"warn",message:"SSE reconnecting"}))};return T.addEventListener("hello",X),T.addEventListener("task-updated",c),T.addEventListener("queue-updated",c),T.addEventListener("trace-step-created",c),T.addEventListener("trace-stats-snapshot",c),T.addEventListener("trace-stats-updated",c),T.addEventListener("trace-error",c),T.onerror=S,()=>T.close()},[n?.id,f,J]),!n)return Au(a7,{title:"OA Event Flow 未登记",text:"请在 config.json 的 microservices 中登记 id=oa-event-flow"});let U=Gc(n),F=wc(n),N=_.diagnostics||{},K=_.health||{},G=N.eventCount??K.eventCount,W=N.traceStatsCount??K.traceStatsCount,L=N.latestSequence??K.latestSequence,q=N.pipelineBridge||K.pipelineBridge||{},z=Q1(N.eventTypes).slice(0,8);return Au("div",{className:"oa-event-flow-page","data-testid":"oa-event-flow-page"},Au(LA,{title:"OA Event Flow 控制台",eyebrow:"Unified OA Event Bus + Stats Projection",loading:_.loading,actions:Au("div",{className:"panel-actions"},Au("button",{type:"button",className:"ghost-btn",onClick:Q,disabled:_.loading,"data-testid":"oa-event-flow-refresh"},_.loading?"刷新中":"刷新"),Au(I3,{title:"OA Event Flow Service",data:n,onOpen:l,testId:"raw-oa-event-flow-service"}))},Au("div",{className:"oa-flow-hero"},Au("div",null,Au("div",{className:"node-version-line"},Au(zA,{status:K?.ok||U.providerStatus==="online"?"online":"warn"},K?.ok?"HEALTH OK":U.providerStatus||"unknown"),Au(zA,{status:A.status},A.status.toUpperCase()),Au("span",null,F.public?"公网暴露":"仅 UniDesk frontend 代理访问")),Au("p",{className:"muted paragraph"},"独立事件流微服务统一承载 Code Queue 与 Pipeline 的事件发布、tag 订阅、事件表审计和 Trace/STEP 统计投影。")),Au("div",{className:"oa-flow-signal"},Au("span",null,"stream"),Au("strong",null,A.message||"--"),Au("code",null,A.lastEventAt?rl(new Date(A.lastEventAt)):"waiting"))),Au(ul,{error:_.error,wide:!0})),Au("div",{className:"oa-flow-metrics"},Au(h3,{label:"事件总量",value:i0(G),hint:`latest seq ${i0(L)}`,tone:"ok"}),Au(h3,{label:"Trace Stats",value:i0(W),hint:"oa_trace_stats 投影"}),Au(h3,{label:"SSE Clients",value:i0(K?.sseClientCount??Q1(N.sseClients).length),hint:A.message||"tag subscription"}),Au(h3,{label:"Pipeline Bridge",value:q?.enabled?i0(q?.insertedCount):"OFF",hint:q?.lastError||q?.lastFinishedAt||`${q?.mode||"snapshot"} service:pipeline`}),Au(h3,{label:"DB",value:K?.databaseReady||N.databaseReady?"READY":"WAIT",hint:K?.databaseLastError||N.databaseLastError||"PostgreSQL persisted"})),Au(LA,{title:"标签订阅",eyebrow:_.refreshedAt?`Updated ${rl(_.refreshedAt)}`:"Tag Pub/Sub"},Au("div",{className:"oa-filter-bar"},Au("label",null,Au("span",null,"tags"),Au("input",{value:y,onChange:(Z)=>i(Z.target.value),placeholder:"service:code-queue, trace","data-testid":"oa-event-flow-tag-filter"})),Au("div",{className:"oa-filter-presets"},Au("button",{type:"button",className:"ghost-btn",onClick:()=>i("service:code-queue")},"Code Queue"),Au("button",{type:"button",className:"ghost-btn",onClick:()=>i("service:pipeline")},"Pipeline"),Au("button",{type:"button",className:"ghost-btn",onClick:()=>i("trace")},"Trace"),Au("button",{type:"button",className:"ghost-btn",onClick:()=>i("")},"All")),Au("code",null,J||"all events")),Au("div",{className:"oa-type-strip"},z.length===0?Au("span",{className:"muted"},"等待事件类型统计"):z.map((Z)=>Au("span",{key:Z.type,className:"data-chip"},`${Z.type} ${i0(Z.count)}`)))),Au("div",{className:"oa-flow-grid"},Au(LA,{title:"事件表",eyebrow:"oa_events persisted log",className:"oa-flow-wide",loading:_.loading,actions:Au(I3,{title:"OA Event Query",data:{events:_.events,diagnostics:N},onOpen:l,testId:"raw-oa-events"})},Au(Tc,{events:_.events,onRaw:l})),Au(LA,{title:"统计中心",eyebrow:"oa_trace_stats read model",className:"oa-flow-wide",loading:_.loading,actions:Au(I3,{title:"OA Trace Stats",data:_.stats,onOpen:l,testId:"raw-oa-trace-stats"})},Au(Vc,{stats:_.stats,onRaw:l}))))}var zy=ku(ql(),1);var _u=ku(QK(),1),ju=ku(ql(),1);function vl(u){if(typeof u==="string"||typeof u==="number")return""+u;let l="";if(Array.isArray(u)){for(let f=0,n;f{}};function NK(){for(var u=0,l=arguments.length,f={},n;u=0)n=f.slice(y+1),f=f.slice(0,y);if(f&&!l.hasOwnProperty(f))throw Error("unknown type: "+f);return{type:f,name:n}})}ZA.prototype=NK.prototype={constructor:ZA,on:function(u,l){var f=this._,n=Pc(u+"",f),y,i=-1,_=n.length;if(arguments.length<2){while(++i<_)if((y=(u=n[i]).type)&&(y=Mc(f[y],u.name)))return y;return}if(l!=null&&typeof l!=="function")throw Error("invalid callback: "+l);while(++i<_)if(y=(u=n[i]).type)f[y]=UK(f[y],u.name,l);else if(l==null)for(y in f)f[y]=UK(f[y],u.name,null);return this},copy:function(){var u={},l=this._;for(var f in l)u[f]=l[f].slice();return new ZA(u)},call:function(u,l){if((y=arguments.length-2)>0)for(var f=Array(y),n=0,y,i;n=0&&(l=u.slice(0,f))!=="xmlns")u=u.slice(f+1);return o7.hasOwnProperty(l)?{space:o7[l],local:u}:u}function d7(u){let l;while(l=u.sourceEvent)u=l;return u}function Df(u,l){if(u=d7(u),l===void 0)l=u.currentTarget;if(l){var f=l.ownerSVGElement||l;if(f.createSVGPoint){var n=f.createSVGPoint();return n.x=u.clientX,n.y=u.clientY,n=n.matrixTransform(l.getScreenCTM().inverse()),[n.x,n.y]}if(l.getBoundingClientRect){var y=l.getBoundingClientRect();return[u.clientX-y.left-l.clientLeft,u.clientY-y.top-l.clientTop]}}return[u.pageX,u.pageY]}function Cc(){}function $y(u){return u==null?Cc:function(){return this.querySelector(u)}}function e7(u){if(typeof u!=="function")u=$y(u);for(var l=this._groups,f=l.length,n=Array(f),y=0;y=q)q=L+1;while(!(Z=G[q])&&++q=0;)if(_=n[y]){if(i&&_.compareDocumentPosition(i)^4)i.parentNode.insertBefore(_,i);i=_}return this}function Qj(u){if(!u)u=oc;function l(Q,U){return Q&&U?u(Q.__data__,U.__data__):!Q-!U}for(var f=this._groups,n=f.length,y=Array(n),i=0;il?1:u>=l?0:NaN}function Uj(){var u=arguments[0];return arguments[0]=this,u.apply(null,arguments),this}function Nj(){return Array.from(this)}function Fj(){for(var u=this._groups,l=0,f=u.length;l1?this.each((l==null?yY:typeof l==="function"?_Y:iY)(u,l,f==null?"":f)):Ay(this.node(),u)}function Ay(u,l){return u.style.getPropertyValue(l)||s3(u).getComputedStyle(u,null).getPropertyValue(l)}function $Y(u){return function(){delete this[u]}}function AY(u,l){return function(){this[u]=l}}function rY(u,l){return function(){var f=l.apply(this,arguments);if(f==null)delete this[u];else this[u]=f}}function Gj(u,l){return arguments.length>1?this.each((l==null?$Y:typeof l==="function"?rY:AY)(u,l)):this.node()[u]}function FK(u){return u.trim().split(/^|\s+/)}function wj(u){return u.classList||new WK(u)}function WK(u){this._node=u,this._names=FK(u.getAttribute("class")||"")}WK.prototype={add:function(u){var l=this._names.indexOf(u);if(l<0)this._names.push(u),this._node.setAttribute("class",this._names.join(" "))},remove:function(u){var l=this._names.indexOf(u);if(l>=0)this._names.splice(l,1),this._node.setAttribute("class",this._names.join(" "))},contains:function(u){return this._names.indexOf(u)>=0}};function qK(u,l){var f=wj(u),n=-1,y=l.length;while(++n=0)f=l.slice(n+1),l=l.slice(0,n);return{type:l,name:f}})}function BY(u){return function(){var l=this.__on;if(!l)return;for(var f=0,n=-1,y=l.length,i;f()=>u;function e3(u,{sourceEvent:l,subject:f,target:n,identifier:y,active:i,x:_,y:$,dx:A,dy:j,dispatch:J}){Object.defineProperties(this,{type:{value:u,enumerable:!0,configurable:!0},sourceEvent:{value:l,enumerable:!0,configurable:!0},subject:{value:f,enumerable:!0,configurable:!0},target:{value:n,enumerable:!0,configurable:!0},identifier:{value:y,enumerable:!0,configurable:!0},active:{value:i,enumerable:!0,configurable:!0},x:{value:_,enumerable:!0,configurable:!0},y:{value:$,enumerable:!0,configurable:!0},dx:{value:A,enumerable:!0,configurable:!0},dy:{value:j,enumerable:!0,configurable:!0},_:{value:J}})}e3.prototype.on=function(){var u=this._.on.apply(this._,arguments);return u===this._?this:u};function mY(u){return!u.ctrlKey&&!u.button}function RY(){return this.parentNode}function bY(u,l){return l==null?{x:u.x,y:u.y}:l}function kY(){return navigator.maxTouchPoints||"ontouchstart"in this}function u6(){var u=mY,l=RY,f=bY,n=kY,y={},i=Ai("start","drag","end"),_=0,$,A,j,J,Q=0;function U(z){z.on("mousedown.drag",F).filter(n).on("touchstart.drag",G).on("touchmove.drag",W,GK).on("touchend.drag touchcancel.drag",L).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function F(z,Z){if(J||!u.call(this,z,Z))return;var T=q(this,l.call(this,z,Z),z,Z,"mouse");if(!T)return;Af(z.view).on("mousemove.drag",N,ri).on("mouseup.drag",K,ri),t_(z.view),OA(z),j=!1,$=z.clientX,A=z.clientY,T("start",z)}function N(z){if(N1(z),!j){var Z=z.clientX-$,T=z.clientY-A;j=Z*Z+T*T>Q}y.mouse("drag",z)}function K(z){Af(z.view).on("mousemove.drag mouseup.drag",null),o3(z.view,j),N1(z),y.mouse("end",z)}function G(z,Z){if(!u.call(this,z,Z))return;var T=z.changedTouches,X=l.call(this,z,Z),c=T.length,S,p;for(S=0;S>8&15|l>>4&240,l>>4&15|l&240,(l&15)<<4|l&15,1):f===8?TA(l>>24&255,l>>16&255,l>>8&255,(l&255)/255):f===4?TA(l>>12&15|l>>8&240,l>>8&15|l>>4&240,l>>4&15|l&240,((l&15)<<4|l&15)/255):null):(l=IY.exec(u))?new _0(l[1],l[2],l[3],1):(l=vY.exec(u))?new _0(l[1]*255/100,l[2]*255/100,l[3]*255/100,1):(l=gY.exec(u))?TA(l[1],l[2],l[3],l[4]):(l=sY.exec(u))?TA(l[1]*255/100,l[2]*255/100,l[3]*255/100,l[4]):(l=aY.exec(u))?VK(l[1],l[2]/100,l[3]/100,1):(l=oY.exec(u))?VK(l[1],l[2]/100,l[3]/100,l[4]):wK.hasOwnProperty(u)?HK(wK[u]):u==="transparent"?new _0(NaN,NaN,NaN,0):null}function HK(u){return new _0(u>>16&255,u>>8&255,u&255,1)}function TA(u,l,f,n){if(n<=0)u=l=f=NaN;return new _0(u,l,f,n)}function uD(u){if(!(u instanceof y6))u=Un(u);if(!u)return new _0;return u=u.rgb(),new _0(u.r,u.g,u.b,u.opacity)}function P_(u,l,f,n){return arguments.length===1?uD(u):new _0(u,l,f,n==null?1:n)}function _0(u,l,f,n){this.r=+u,this.g=+l,this.b=+f,this.opacity=+n}l6(_0,P_,Mj(y6,{brighter(u){return u=u==null?BA:Math.pow(BA,u),new _0(this.r*u,this.g*u,this.b*u,this.opacity)},darker(u){return u=u==null?f6:Math.pow(f6,u),new _0(this.r*u,this.g*u,this.b*u,this.opacity)},rgb(){return this},clamp(){return new _0(Ji(this.r),Ji(this.g),Ji(this.b),XA(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:OK,formatHex:OK,formatHex8:lD,formatRgb:TK,toString:TK}));function OK(){return`#${ji(this.r)}${ji(this.g)}${ji(this.b)}`}function lD(){return`#${ji(this.r)}${ji(this.g)}${ji(this.b)}${ji((isNaN(this.opacity)?1:this.opacity)*255)}`}function TK(){let u=XA(this.opacity);return`${u===1?"rgb(":"rgba("}${Ji(this.r)}, ${Ji(this.g)}, ${Ji(this.b)}${u===1?")":`, ${u})`}`}function XA(u){return isNaN(u)?1:Math.max(0,Math.min(1,u))}function Ji(u){return Math.max(0,Math.min(255,Math.round(u)||0))}function ji(u){return u=Ji(u),(u<16?"0":"")+u.toString(16)}function VK(u,l,f,n){if(n<=0)u=l=f=NaN;else if(f<=0||f>=1)u=l=NaN;else if(l<=0)u=NaN;return new Qn(u,l,f,n)}function XK(u){if(u instanceof Qn)return new Qn(u.h,u.s,u.l,u.opacity);if(!(u instanceof y6))u=Un(u);if(!u)return new Qn;if(u instanceof Qn)return u;u=u.rgb();var l=u.r/255,f=u.g/255,n=u.b/255,y=Math.min(l,f,n),i=Math.max(l,f,n),_=NaN,$=i-y,A=(i+y)/2;if($){if(l===i)_=(f-n)/$+(f0&&A<1?0:_;return new Qn(_,$,A,u.opacity)}function cK(u,l,f,n){return arguments.length===1?XK(u):new Qn(u,l,f,n==null?1:n)}function Qn(u,l,f,n){this.h=+u,this.s=+l,this.l=+f,this.opacity=+n}l6(Qn,cK,Mj(y6,{brighter(u){return u=u==null?BA:Math.pow(BA,u),new Qn(this.h,this.s,this.l*u,this.opacity)},darker(u){return u=u==null?f6:Math.pow(f6,u),new Qn(this.h,this.s,this.l*u,this.opacity)},rgb(){var u=this.h%360+(this.h<0)*360,l=isNaN(u)||isNaN(this.s)?0:this.s,f=this.l,n=f+(f<0.5?f:1-f)*l,y=2*f-n;return new _0(Cj(u>=240?u-240:u+120,y,n),Cj(u,y,n),Cj(u<120?u+240:u-120,y,n),this.opacity)},clamp(){return new Qn(BK(this.h),VA(this.s),VA(this.l),XA(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 u=XA(this.opacity);return`${u===1?"hsl(":"hsla("}${BK(this.h)}, ${VA(this.s)*100}%, ${VA(this.l)*100}%${u===1?")":`, ${u})`}`}}));function BK(u){return u=(u||0)%360,u<0?u+360:u}function VA(u){return Math.max(0,Math.min(1,u||0))}function Cj(u,l,f){return(u<60?l+(f-l)*u/60:u<180?f:u<240?l+(f-l)*(240-u)/60:l)*255}function pj(u,l,f,n,y){var i=u*u,_=i*u;return((1-3*u+3*i-_)*l+(4-6*i+3*_)*f+(1+3*u+3*i-3*_)*n+_*y)/6}function xj(u){var l=u.length-1;return function(f){var n=f<=0?f=0:f>=1?(f=1,l-1):Math.floor(f*l),y=u[n],i=u[n+1],_=n>0?u[n-1]:2*y-i,$=n()=>u;function nD(u,l){return function(f){return u+f*l}}function yD(u,l,f){return u=Math.pow(u,f),l=Math.pow(l,f)-u,f=1/f,function(n){return Math.pow(u+n*l,f)}}function YK(u){return(u=+u)===1?YA:function(l,f){return f-l?yD(l,f,u):i6(isNaN(l)?f:l)}}function YA(u,l){var f=l-u;return f?nD(u,f):i6(isNaN(u)?l:u)}var Qi=function u(l){var f=YK(l);function n(y,i){var _=f((y=P_(y)).r,(i=P_(i)).r),$=f(y.g,i.g),A=f(y.b,i.b),j=YA(y.opacity,i.opacity);return function(J){return y.r=_(J),y.g=$(J),y.b=A(J),y.opacity=j(J),y+""}}return n.gamma=u,n}(1);function DK(u){return function(l){var f=l.length,n=Array(f),y=Array(f),i=Array(f),_,$;for(_=0;_f)if(i=l.slice(f,i),$[_])$[_]+=i;else $[++_]=i;if((n=n[0])===(y=y[0]))if($[_])$[_]+=y;else $[++_]=y;else $[++_]=null,A.push({i:_,x:tf(n,y)});f=hj.lastIndex}if(f180)J+=360;else if(J-j>180)j+=360;U.push({i:Q.push(y(Q)+"rotate(",null,n)-2,x:tf(j,J)})}else if(J)Q.push(y(Q)+"rotate("+J+n)}function $(j,J,Q,U){if(j!==J)U.push({i:Q.push(y(Q)+"skewX(",null,n)-2,x:tf(j,J)});else if(J)Q.push(y(Q)+"skewX("+J+n)}function A(j,J,Q,U,F,N){if(j!==Q||J!==U){var K=F.push(y(F)+"scale(",null,",",null,")");N.push({i:K-4,x:tf(j,Q)},{i:K-2,x:tf(J,U)})}else if(Q!==1||U!==1)F.push(y(F)+"scale("+Q+","+U+")")}return function(j,J){var Q=[],U=[];return j=u(j),J=u(J),i(j.translateX,j.translateY,J.translateX,J.translateY,Q,U),_(j.rotate,J.rotate,Q,U),$(j.skewX,J.skewX,Q,U),A(j.scaleX,j.scaleY,J.scaleX,J.scaleY,Q,U),j=J=null,function(F){var N=-1,K=U.length,G;while(++N=0)u._call.call(void 0,l);u=u._next}--C_}function kK(){Ni=(MA=r6.now())+CA,C_=$6=0;try{vK()}finally{C_=0,OD(),Ni=0}}function HD(){var u=r6.now(),l=u-MA;if(l>hK)CA-=l,MA=u}function OD(){var u,l=PA,f,n=1/0;while(l)if(l._call){if(n>l._time)n=l._time;u=l,l=l._next}else f=l._next,l._next=null,l=u?u._next=f:PA=f;A6=u,sj(n)}function sj(u){if(C_)return;if($6)$6=clearTimeout($6);var l=u-Ni;if(l>24){if(u<1/0)$6=setTimeout(kK,u-r6.now()-CA);if(_6)_6=clearInterval(_6)}else{if(!_6)MA=r6.now(),_6=setInterval(HD,hK);C_=1,IK(kK)}}function Q6(u,l,f){var n=new j6;return l=l==null?0:+l,n.restart((y)=>{n.stop(),u(y+l)},l,f),n}var VD=Ai("start","end","cancel","interrupt"),BD=[],aK=0,gK=1,mA=2,xA=3,sK=4,RA=5,U6=6;function F1(u,l,f,n,y,i){var _=u.__transition;if(!_)u.__transition={};else if(f in _)return;XD(u,f,{name:l,index:n,group:y,on:VD,tween:BD,time:i.time,delay:i.delay,duration:i.duration,ease:i.ease,timer:null,state:aK})}function N6(u,l){var f=rf(u,l);if(f.state>aK)throw Error("too late; already scheduled");return f}function Gf(u,l){var f=rf(u,l);if(f.state>xA)throw Error("too late; already running");return f}function rf(u,l){var f=u.__transition;if(!f||!(f=f[l]))throw Error("transition not found");return f}function XD(u,l,f){var n=u.__transition,y;n[l]=f,f.timer=pA(i,0,f.time);function i(j){if(f.state=gK,f.timer.restart(_,f.delay,f.time),f.delay<=j)_(j-f.delay)}function _(j){var J,Q,U,F;if(f.state!==gK)return A();for(J in n){if(F=n[J],F.name!==f.name)continue;if(F.state===xA)return Q6(_);if(F.state===sK)F.state=U6,F.timer.stop(),F.on.call("interrupt",u,u.__data__,F.index,F.group),delete n[J];else if(+JmA&&n.state=0)l=l.slice(0,f);return!l||l==="start"})}function aD(u,l,f){var n,y,i=sD(l)?N6:Gf;return function(){var _=i(this,u),$=_.on;if($!==n)(y=(n=$).copy()).on(l,f);_.on=y}}function _J(u,l){var f=this._id;return arguments.length<2?rf(this.node(),f).on.on(u):this.each(aD(f,u,l))}function oD(u){return function(){var l=this.parentNode;for(var f in this.__transition)if(+f!==u)return;if(l)l.removeChild(this)}}function $J(){return this.on("end.remove",oD(this._id))}function AJ(u){var l=this._name,f=this._id;if(typeof u!=="function")u=$y(u);for(var n=this._groups,y=n.length,i=Array(y),_=0;_()=>u;function LJ(u,{sourceEvent:l,target:f,transform:n,dispatch:y}){Object.defineProperties(this,{type:{value:u,enumerable:!0,configurable:!0},sourceEvent:{value:l,enumerable:!0,configurable:!0},target:{value:f,enumerable:!0,configurable:!0},transform:{value:n,enumerable:!0,configurable:!0},_:{value:y}})}function Nn(u,l,f){this.k=u,this.x=l,this.y=f}Nn.prototype={constructor:Nn,scale:function(u){return u===1?this:new Nn(this.k*u,this.x,this.y)},translate:function(u,l){return u===0&l===0?this:new Nn(this.k,this.x+this.k*u,this.y+this.k*l)},apply:function(u){return[u[0]*this.k+this.x,u[1]*this.k+this.y]},applyX:function(u){return u*this.k+this.x},applyY:function(u){return u*this.k+this.y},invert:function(u){return[(u[0]-this.x)/this.k,(u[1]-this.y)/this.k]},invertX:function(u){return(u-this.x)/this.k},invertY:function(u){return(u-this.y)/this.k},rescaleX:function(u){return u.copy().domain(u.range().map(this.invertX,this).map(u.invert,u))},rescaleY:function(u){return u.copy().domain(u.range().map(this.invertY,this).map(u.invert,u))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var Fi=new Nn(1,0,0);q6.prototype=Nn.prototype;function q6(u){while(!u.__zoom)if(!(u=u.parentNode))return Fi;return u.__zoom}function eA(u){u.stopImmediatePropagation()}function Wi(u){u.preventDefault(),u.stopImmediatePropagation()}function Ut(u){return(!u.ctrlKey||u.type==="wheel")&&!u.button}function Nt(){var u=this;if(u instanceof SVGElement){if(u=u.ownerSVGElement||u,u.hasAttribute("viewBox"))return u=u.viewBox.baseVal,[[u.x,u.y],[u.x+u.width,u.y+u.height]];return[[0,0],[u.width.baseVal.value,u.height.baseVal.value]]}return[[0,0],[u.clientWidth,u.clientHeight]]}function eK(){return this.__zoom||Fi}function Ft(u){return-u.deltaY*(u.deltaMode===1?0.05:u.deltaMode?1:0.002)*(u.ctrlKey?10:1)}function Wt(){return navigator.maxTouchPoints||"ontouchstart"in this}function qt(u,l,f){var n=u.invertX(l[0][0])-f[0][0],y=u.invertX(l[1][0])-f[1][0],i=u.invertY(l[0][1])-f[0][1],_=u.invertY(l[1][1])-f[1][1];return u.translate(y>n?(n+y)/2:Math.min(0,n)||Math.max(0,y),_>i?(i+_)/2:Math.min(0,i)||Math.max(0,_))}function L6(){var u=Ut,l=Nt,f=qt,n=Ft,y=Wt,i=[0,1/0],_=[[-1/0,-1/0],[1/0,1/0]],$=250,A=Ui,j=Ai("start","zoom","end"),J,Q,U,F=500,N=150,K=0,G=10;function W(V){V.property("__zoom",eK).on("wheel.zoom",c,{passive:!1}).on("mousedown.zoom",S).on("dblclick.zoom",p).filter(y).on("touchstart.zoom",Y).on("touchmove.zoom",D).on("touchend.zoom touchcancel.zoom",x).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}W.transform=function(V,t,M,I){var O=V.selection?V.selection():V;if(O.property("__zoom",eK),V!==O)Z(V,t,M,I);else O.interrupt().each(function(){T(this,arguments).event(I).start().zoom(null,typeof t==="function"?t.apply(this,arguments):t).end()})},W.scaleBy=function(V,t,M,I){W.scaleTo(V,function(){var O=this.__zoom.k,C=typeof t==="function"?t.apply(this,arguments):t;return O*C},M,I)},W.scaleTo=function(V,t,M,I){W.transform(V,function(){var O=l.apply(this,arguments),C=this.__zoom,g=M==null?z(O):typeof M==="function"?M.apply(this,arguments):M,a=C.invert(g),yu=typeof t==="function"?t.apply(this,arguments):t;return f(q(L(C,yu),g,a),O,_)},M,I)},W.translateBy=function(V,t,M,I){W.transform(V,function(){return f(this.__zoom.translate(typeof t==="function"?t.apply(this,arguments):t,typeof M==="function"?M.apply(this,arguments):M),l.apply(this,arguments),_)},null,I)},W.translateTo=function(V,t,M,I,O){W.transform(V,function(){var C=l.apply(this,arguments),g=this.__zoom,a=I==null?z(C):typeof I==="function"?I.apply(this,arguments):I;return f(Fi.translate(a[0],a[1]).scale(g.k).translate(typeof t==="function"?-t.apply(this,arguments):-t,typeof M==="function"?-M.apply(this,arguments):-M),C,_)},I,O)};function L(V,t){return t=Math.max(i[0],Math.min(i[1],t)),t===V.k?V:new Nn(t,V.x,V.y)}function q(V,t,M){var I=t[0]-M[0]*V.k,O=t[1]-M[1]*V.k;return I===V.x&&O===V.y?V:new Nn(V.k,I,O)}function z(V){return[(+V[0][0]+ +V[1][0])/2,(+V[0][1]+ +V[1][1])/2]}function Z(V,t,M,I){V.on("start.zoom",function(){T(this,arguments).event(I).start()}).on("interrupt.zoom end.zoom",function(){T(this,arguments).event(I).end()}).tween("zoom",function(){var O=this,C=arguments,g=T(O,C).event(I),a=l.apply(O,C),yu=M==null?z(a):typeof M==="function"?M.apply(O,C):M,ru=Math.max(a[1][0]-a[0][0],a[1][1]-a[0][1]),R=O.__zoom,m=typeof t==="function"?t.apply(O,C):t,fu=A(R.invert(yu).concat(ru/R.k),m.invert(yu).concat(ru/m.k));return function(iu){if(iu===1)iu=m;else{var Ju=fu(iu),Vu=ru/Ju[2];iu=new Nn(Vu,yu[0]-Ju[0]*Vu,yu[1]-Ju[1]*Vu)}g.zoom(null,iu)}})}function T(V,t,M){return!M&&V.__zooming||new X(V,t)}function X(V,t){this.that=V,this.args=t,this.active=0,this.sourceEvent=null,this.extent=l.apply(V,t),this.taps=0}X.prototype={event:function(V){if(V)this.sourceEvent=V;return this},start:function(){if(++this.active===1)this.that.__zooming=this,this.emit("start");return this},zoom:function(V,t){if(this.mouse&&V!=="mouse")this.mouse[1]=t.invert(this.mouse[0]);if(this.touch0&&V!=="touch")this.touch0[1]=t.invert(this.touch0[0]);if(this.touch1&&V!=="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(V){var t=Af(this.that).datum();j.call(V,this.that,new LJ(V,{sourceEvent:this.sourceEvent,target:W,type:V,transform:this.that.__zoom,dispatch:j}),t)}};function c(V,...t){if(!u.apply(this,arguments))return;var M=T(this,t).event(V),I=this.__zoom,O=Math.max(i[0],Math.min(i[1],I.k*Math.pow(2,n.apply(this,arguments)))),C=Df(V);if(M.wheel){if(M.mouse[0][0]!==C[0]||M.mouse[0][1]!==C[1])M.mouse[1]=I.invert(M.mouse[0]=C);clearTimeout(M.wheel)}else if(I.k===O)return;else M.mouse=[C,I.invert(C)],ry(this),M.start();Wi(V),M.wheel=setTimeout(g,N),M.zoom("mouse",f(q(L(I,O),M.mouse[0],M.mouse[1]),M.extent,_));function g(){M.wheel=null,M.end()}}function S(V,...t){if(U||!u.apply(this,arguments))return;var M=V.currentTarget,I=T(this,t,!0).event(V),O=Af(V.view).on("mousemove.zoom",yu,!0).on("mouseup.zoom",ru,!0),C=Df(V,M),g=V.clientX,a=V.clientY;t_(V.view),eA(V),I.mouse=[C,this.__zoom.invert(C)],ry(this),I.start();function yu(R){if(Wi(R),!I.moved){var m=R.clientX-g,fu=R.clientY-a;I.moved=m*m+fu*fu>K}I.event(R).zoom("mouse",f(q(I.that.__zoom,I.mouse[0]=Df(R,M),I.mouse[1]),I.extent,_))}function ru(R){O.on("mousemove.zoom mouseup.zoom",null),o3(R.view,I.moved),Wi(R),I.event(R).end()}}function p(V,...t){if(!u.apply(this,arguments))return;var M=this.__zoom,I=Df(V.changedTouches?V.changedTouches[0]:V,this),O=M.invert(I),C=M.k*(V.shiftKey?0.5:2),g=f(q(L(M,C),I,O),l.apply(this,t),_);if(Wi(V),$>0)Af(this).transition().duration($).call(Z,g,I,V);else Af(this).call(W.transform,g,I,V)}function Y(V,...t){if(!u.apply(this,arguments))return;var M=V.touches,I=M.length,O=T(this,t,V.changedTouches.length===I).event(V),C,g,a,yu;eA(V);for(g=0;g"[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:(u)=>`Node type "${u}" 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:(u)=>`The old edge with id=${u} does not exist.`,error009:(u)=>`Marker type "${u}" doesn't exist.`,error008:(u,{id:l,sourceHandle:f,targetHandle:n})=>`Couldn't create edge for ${u} handle id: "${u==="source"?f:n}", edge id: ${l}.`,error010:()=>"Handle: No node id found. Make sure to only use a Handle inside a custom Node.",error011:(u)=>`Edge type "${u}" not found. Using fallback type "default".`,error012:(u)=>`Node with id "${u}" does not exist, it may have been removed. This can happen when a node is deleted before the "onNodeClick" handler is called.`,error013:(u="react")=>`It seems that you haven't loaded the styles. Please import '@xyflow/${u}/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."},k_=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],ZJ=["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:u,x:l,y:f})=>`Moved selected node ${u}. New position, x: ${l}, y: ${f}`,"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"},Qy;(function(u){u.Strict="strict",u.Loose="loose"})(Qy||(Qy={}));var q1;(function(u){u.Free="free",u.Vertical="vertical",u.Horizontal="horizontal"})(q1||(q1={}));var qi;(function(u){u.Partial="partial",u.Full="full"})(qi||(qi={}));var HJ={inProgress:!1,isValid:null,from:null,fromHandle:null,fromPosition:null,fromNode:null,to:null,toHandle:null,toPosition:null,toNode:null,pointer:null},Pn;(function(u){u.Bezier="default",u.Straight="straight",u.Step="step",u.SmoothStep="smoothstep",u.SimpleBezier="simplebezier"})(Pn||(Pn={}));var Uy;(function(u){u.Arrow="arrow",u.ArrowClosed="arrowclosed"})(Uy||(Uy={}));var cu;(function(u){u.Left="left",u.Top="top",u.Right="right",u.Bottom="bottom"})(cu||(cu={}));var uz={[cu.Left]:cu.Right,[cu.Right]:cu.Left,[cu.Top]:cu.Bottom,[cu.Bottom]:cu.Top};function OJ(u){return u===null?null:u?"valid":"invalid"}var TJ=(u)=>("id"in u)&&("source"in u)&&("target"in u),Uz=(u)=>("id"in u)&&("position"in u)&&!("source"in u)&&!("target"in u),VJ=(u)=>("id"in u)&&("internals"in u)&&!("source"in u)&&!("target"in u);var G6=(u,l=[0,0])=>{let{width:f,height:n}=Mn(u),y=u.origin??l,i=f*y[0],_=n*y[1];return{x:u.position.x-i,y:u.position.y-_}},BJ=(u,l={nodeOrigin:[0,0]})=>{if(u.length===0)return{x:0,y:0,width:0,height:0};let f=u.reduce((n,y)=>{let i=typeof y==="string",_=!l.nodeLookup&&!i?y:void 0;if(l.nodeLookup)_=i?l.nodeLookup.get(y):!VJ(y)?l.nodeLookup.get(y.id):y;let $=_?fr(_,l.nodeOrigin):{x:0,y:0,x2:0,y2:0};return yr(n,$)},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return ir(f)},h_=(u,l={})=>{let f={x:1/0,y:1/0,x2:-1/0,y2:-1/0},n=!1;return u.forEach((y)=>{if(l.filter===void 0||l.filter(y))f=yr(f,fr(y)),n=!0}),n?ir(f):{x:0,y:0,width:0,height:0}},nr=(u,l,[f,n,y]=[0,0,1],i=!1,_=!1)=>{let $={...g_(l,[f,n,y]),width:l.width/y,height:l.height/y},A=[];for(let j of u.values()){let{measured:J,selectable:Q=!0,hidden:U=!1}=j;if(_&&!Q||U)continue;let F=J.width??j.width??j.initialWidth??null,N=J.height??j.height??j.initialHeight??null,K=I_($,Ki(j)),G=(F??0)*(N??0),W=i&&K>0;if(!j.internals.handleBounds||W||K>=G||j.dragging)A.push(j)}return A},Nz=(u,l)=>{let f=new Set;return u.forEach((n)=>{f.add(n.id)}),l.filter((n)=>f.has(n.source)||f.has(n.target))};function Lt(u,l){let f=new Map,n=l?.nodes?new Set(l.nodes.map((y)=>y.id)):null;return u.forEach((y)=>{if(y.measured.width&&y.measured.height&&(l?.includeHiddenNodes||!y.hidden)&&(!n||n.has(y.id)))f.set(y.id,y)}),f}async function Fz({nodes:u,width:l,height:f,panZoom:n,minZoom:y,maxZoom:i},_){if(u.size===0)return Promise.resolve(!0);let $=Lt(u,_),A=h_($),j=w6(A,l,f,_?.minZoom??y,_?.maxZoom??i,_?.padding??0.1);return await n.setViewport(j,{duration:_?.duration,ease:_?.ease,interpolate:_?.interpolate}),Promise.resolve(!0)}function XJ({nodeId:u,nextPosition:l,nodeLookup:f,nodeOrigin:n=[0,0],nodeExtent:y,onError:i}){let _=f.get(u),$=_.parentId?f.get(_.parentId):void 0,{x:A,y:j}=$?$.internals.positionAbsolute:{x:0,y:0},J=_.origin??n,Q=_.extent||y;if(_.extent==="parent"&&!_.expandParent)if(!$)i?.("005",H0.error005());else{let F=$.measured.width,N=$.measured.height;if(F&&N)Q=[[A,j],[A+F,j+N]]}else if($&&b_(_.extent))Q=[[_.extent[0][0]+A,_.extent[0][1]+j],[_.extent[1][0]+A,_.extent[1][1]+j]];let U=b_(Q)?Li(l,Q,_.measured):l;if(_.measured.width===void 0||_.measured.height===void 0)i?.("015",H0.error015());return{position:{x:U.x-A+(_.measured.width??0)*J[0],y:U.y-j+(_.measured.height??0)*J[1]},positionAbsolute:U}}async function Wz({nodesToRemove:u=[],edgesToRemove:l=[],nodes:f,edges:n,onBeforeDelete:y}){let i=new Set(u.map((U)=>U.id)),_=[];for(let U of f){if(U.deletable===!1)continue;let F=i.has(U.id),N=!F&&U.parentId&&_.find((K)=>K.id===U.parentId);if(F||N)_.push(U)}let $=new Set(l.map((U)=>U.id)),A=n.filter((U)=>U.deletable!==!1),J=Nz(_,A);for(let U of A)if($.has(U.id)&&!J.find((N)=>N.id===U.id))J.push(U);if(!y)return{edges:J,nodes:_};let Q=await y({nodes:_,edges:J});if(typeof Q==="boolean")return Q?{edges:J,nodes:_}:{edges:[],nodes:[]};return Q}var R_=(u,l=0,f=1)=>Math.min(Math.max(u,l),f),Li=(u={x:0,y:0},l,f)=>({x:R_(u.x,l[0][0],l[1][0]-(f?.width??0)),y:R_(u.y,l[0][1],l[1][1]-(f?.height??0))});function qz(u,l,f){let{width:n,height:y}=Mn(f),{x:i,y:_}=f.internals.positionAbsolute;return Li(u,[[i,_],[i+n,_+y]],l)}var lz=(u,l,f)=>{if(uf)return-R_(Math.abs(u-f),1,l)/l;return 0},Lz=(u,l,f=15,n=40)=>{let y=lz(u.x,n,l.width-n)*f,i=lz(u.y,n,l.height-n)*f;return[y,i]},yr=(u,l)=>({x:Math.min(u.x,l.x),y:Math.min(u.y,l.y),x2:Math.max(u.x2,l.x2),y2:Math.max(u.y2,l.y2)}),wJ=({x:u,y:l,width:f,height:n})=>({x:u,y:l,x2:u+f,y2:l+n}),ir=({x:u,y:l,x2:f,y2:n})=>({x:u,y:l,width:f-u,height:n-l}),Ki=(u,l=[0,0])=>{let{x:f,y:n}=VJ(u)?u.internals.positionAbsolute:G6(u,l);return{x:f,y:n,width:u.measured?.width??u.width??u.initialWidth??0,height:u.measured?.height??u.height??u.initialHeight??0}},fr=(u,l=[0,0])=>{let{x:f,y:n}=VJ(u)?u.internals.positionAbsolute:G6(u,l);return{x:f,y:n,x2:f+(u.measured?.width??u.width??u.initialWidth??0),y2:n+(u.measured?.height??u.height??u.initialHeight??0)}},cJ=(u,l)=>ir(yr(wJ(u),wJ(l))),I_=(u,l)=>{let f=Math.max(0,Math.min(u.x+u.width,l.x+l.width)-Math.max(u.x,l.x)),n=Math.max(0,Math.min(u.y+u.height,l.y+l.height)-Math.max(u.y,l.y));return Math.ceil(f*n)},YJ=(u)=>b0(u.width)&&b0(u.height)&&b0(u.x)&&b0(u.y),b0=(u)=>!isNaN(u)&&isFinite(u),DJ=(u,l)=>{},v_=(u,l=[1,1])=>{return{x:l[0]*Math.round(u.x/l[0]),y:l[1]*Math.round(u.y/l[1])}},g_=({x:u,y:l},[f,n,y],i=!1,_=[1,1])=>{let $={x:(u-f)/y,y:(l-n)/y};return i?v_($,_):$},z6=({x:u,y:l},[f,n,y])=>{return{x:u*y+f,y:l*y+n}};function x_(u,l){if(typeof u==="number")return Math.floor((l-l/(1+u))*0.5);if(typeof u==="string"&&u.endsWith("px")){let f=parseFloat(u);if(!Number.isNaN(f))return Math.floor(f)}if(typeof u==="string"&&u.endsWith("%")){let f=parseFloat(u);if(!Number.isNaN(f))return Math.floor(l*f*0.01)}return console.error(`[React Flow] The padding value "${u}" is invalid. Please provide a number or a string with a valid unit (px or %).`),0}function Kt(u,l,f){if(typeof u==="string"||typeof u==="number"){let n=x_(u,f),y=x_(u,l);return{top:n,right:y,bottom:n,left:y,x:y*2,y:n*2}}if(typeof u==="object"){let n=x_(u.top??u.y??0,f),y=x_(u.bottom??u.y??0,f),i=x_(u.left??u.x??0,l),_=x_(u.right??u.x??0,l);return{top:n,right:_,bottom:y,left:i,x:i+_,y:n+y}}return{top:0,right:0,bottom:0,left:0,x:0,y:0}}function zt(u,l,f,n,y,i){let{x:_,y:$}=z6(u,[l,f,n]),{x:A,y:j}=z6({x:u.x+u.width,y:u.y+u.height},[l,f,n]),J=y-A,Q=i-j;return{left:Math.floor(_),top:Math.floor($),right:Math.floor(J),bottom:Math.floor(Q)}}var w6=(u,l,f,n,y,i)=>{let _=Kt(i,l,f),$=(l-_.x)/u.width,A=(f-_.y)/u.height,j=Math.min($,A),J=R_(j,n,y),Q=u.x+u.width/2,U=u.y+u.height/2,F=l/2-Q*J,N=f/2-U*J,K=zt(u,F,N,J,l,f),G={left:Math.min(K.left-_.left,0),top:Math.min(K.top-_.top,0),right:Math.min(K.right-_.right,0),bottom:Math.min(K.bottom-_.bottom,0)};return{x:F-G.left+G.right,y:N-G.top+G.bottom,zoom:J}},s_=()=>typeof navigator<"u"&&navigator?.userAgent?.indexOf("Mac")>=0;function b_(u){return u!==void 0&&u!==null&&u!=="parent"}function Mn(u){return{width:u.measured?.width??u.width??u.initialWidth??0,height:u.measured?.height??u.height??u.initialHeight??0}}function tJ(u){return(u.measured?.width??u.width??u.initialWidth)!==void 0&&(u.measured?.height??u.height??u.initialHeight)!==void 0}function SJ(u,l={width:0,height:0},f,n,y){let i={...u},_=n.get(f);if(_){let $=_.origin||y;i.x+=_.internals.positionAbsolute.x-(l.width??0)*$[0],i.y+=_.internals.positionAbsolute.y-(l.height??0)*$[1]}return i}function PJ(u,l){if(u.size!==l.size)return!1;for(let f of u)if(!l.has(f))return!1;return!0}function Kz(){let u,l;return{promise:new Promise((n,y)=>{u=n,l=y}),resolve:u,reject:l}}function zz(u){return{...EJ,...u||{}}}function K6(u,{snapGrid:l=[0,0],snapToGrid:f=!1,transform:n,containerBounds:y}){let{x:i,y:_}=k0(u),$=g_({x:i-(y?.left??0),y:_-(y?.top??0)},n),{x:A,y:j}=f?v_($,l):$;return{xSnapped:A,ySnapped:j,...$}}var _r=(u)=>({width:u.offsetWidth,height:u.offsetHeight}),MJ=(u)=>u?.getRootNode?.()||window?.document,Gt=["INPUT","SELECT","TEXTAREA"];function CJ(u){let l=u.composedPath?.()?.[0]||u.target;if(l?.nodeType!==1)return!1;return Gt.includes(l.nodeName)||l.hasAttribute("contenteditable")||!!l.closest(".nokey")}var pJ=(u)=>("clientX"in u),k0=(u,l)=>{let f=pJ(u),n=f?u.clientX:u.touches?.[0].clientX,y=f?u.clientY:u.touches?.[0].clientY;return{x:n-(l?.left??0),y:y-(l?.top??0)}},fz=(u,l,f,n,y)=>{let i=l.querySelectorAll(`.${u}`);if(!i||!i.length)return null;return Array.from(i).map((_)=>{let $=_.getBoundingClientRect();return{id:_.getAttribute("data-handleid"),type:u,nodeId:y,position:_.getAttribute("data-handlepos"),x:($.left-f.left)/n,y:($.top-f.top)/n,..._r(_)}})};function $r({sourceX:u,sourceY:l,targetX:f,targetY:n,sourceControlX:y,sourceControlY:i,targetControlX:_,targetControlY:$}){let A=u*0.125+y*0.375+_*0.375+f*0.125,j=l*0.125+i*0.375+$*0.375+n*0.125,J=Math.abs(A-u),Q=Math.abs(j-l);return[A,j,J,Q]}function ur(u,l){if(u>=0)return 0.5*u;return l*25*Math.sqrt(-u)}function nz({pos:u,x1:l,y1:f,x2:n,y2:y,c:i}){switch(u){case cu.Left:return[l-ur(l-n,i),f];case cu.Right:return[l+ur(n-l,i),f];case cu.Top:return[l,f-ur(f-y,i)];case cu.Bottom:return[l,f+ur(y-f,i)]}}function Ar({sourceX:u,sourceY:l,sourcePosition:f=cu.Bottom,targetX:n,targetY:y,targetPosition:i=cu.Top,curvature:_=0.25}){let[$,A]=nz({pos:f,x1:u,y1:l,x2:n,y2:y,c:_}),[j,J]=nz({pos:i,x1:n,y1:y,x2:u,y2:l,c:_}),[Q,U,F,N]=$r({sourceX:u,sourceY:l,targetX:n,targetY:y,sourceControlX:$,sourceControlY:A,targetControlX:j,targetControlY:J});return[`M${u},${l} C${$},${A} ${j},${J} ${n},${y}`,Q,U,F,N]}function xJ({sourceX:u,sourceY:l,targetX:f,targetY:n}){let y=Math.abs(f-u)/2,i=f0}var wt=({source:u,sourceHandle:l,target:f,targetHandle:n})=>`xy-edge__${u}${l||""}-${f}${n||""}`,Zt=(u,l)=>{return l.some((f)=>f.source===u.source&&f.target===u.target&&(f.sourceHandle===u.sourceHandle||!f.sourceHandle&&!u.sourceHandle)&&(f.targetHandle===u.targetHandle||!f.targetHandle&&!u.targetHandle))},mJ=(u,l,f={})=>{if(!u.source||!u.target)return DJ("006",H0.error006()),l;let n=f.getEdgeId||wt,y;if(TJ(u))y={...u};else y={...u,id:n(u)};if(Zt(y,l))return l;if(y.sourceHandle===null)delete y.sourceHandle;if(y.targetHandle===null)delete y.targetHandle;return l.concat(y)};function rr({sourceX:u,sourceY:l,targetX:f,targetY:n}){let[y,i,_,$]=xJ({sourceX:u,sourceY:l,targetX:f,targetY:n});return[`M ${u},${l}L ${f},${n}`,y,i,_,$]}var yz={[cu.Left]:{x:-1,y:0},[cu.Right]:{x:1,y:0},[cu.Top]:{x:0,y:-1},[cu.Bottom]:{x:0,y:1}},Et=({source:u,sourcePosition:l=cu.Bottom,target:f})=>{if(l===cu.Left||l===cu.Right)return u.xMath.sqrt(Math.pow(l.x-u.x,2)+Math.pow(l.y-u.y,2));function Ht({source:u,sourcePosition:l=cu.Bottom,target:f,targetPosition:n=cu.Top,center:y,offset:i,stepPosition:_}){let $=yz[l],A=yz[n],j={x:u.x+$.x*i,y:u.y+$.y*i},J={x:f.x+A.x*i,y:f.y+A.y*i},Q=Et({source:j,sourcePosition:l,target:J}),U=Q.x!==0?"x":"y",F=Q[U],N=[],K,G,W={x:0,y:0},L={x:0,y:0},[,,q,z]=xJ({sourceX:u.x,sourceY:u.y,targetX:f.x,targetY:f.y});if($[U]*A[U]===-1){if(U==="x")K=y.x??j.x+(J.x-j.x)*_,G=y.y??(j.y+J.y)/2;else K=y.x??(j.x+J.x)/2,G=y.y??j.y+(J.y-j.y)*_;let c=[{x:K,y:j.y},{x:K,y:J.y}],S=[{x:j.x,y:G},{x:J.x,y:G}];if($[U]===F)N=U==="x"?c:S;else N=U==="x"?S:c}else{let c=[{x:j.x,y:J.y}],S=[{x:J.x,y:j.y}];if(U==="x")N=$.x===F?S:c;else N=$.y===F?c:S;if(l===n){let V=Math.abs(u[U]-f[U]);if(V<=i){let t=Math.min(i-1,i-V);if($[U]===F)W[U]=(j[U]>u[U]?-1:1)*t;else L[U]=(J[U]>f[U]?-1:1)*t}}if(l!==n){let V=U==="x"?"y":"x",t=$[U]===A[V],M=j[V]>J[V],I=j[V]=x)K=(p.x+Y.x)/2,G=N[0].y;else K=N[0].x,G=(p.y+Y.y)/2}let Z={x:j.x+W.x,y:j.y+W.y},T={x:J.x+L.x,y:J.y+L.y};return[[u,...Z.x!==N[0].x||Z.y!==N[0].y?[Z]:[],...N,...T.x!==N[N.length-1].x||T.y!==N[N.length-1].y?[T]:[],f],K,G,q,z]}function Ot(u,l,f,n){let y=Math.min(iz(u,l)/2,iz(l,f)/2,n),{x:i,y:_}=l;if(u.x===i&&i===f.x||u.y===_&&_===f.y)return`L${i} ${_}`;if(u.y===_){let j=u.xf.id===l))||null}function jr(u,l){if(!u)return"";if(typeof u==="string")return u;return`${l?`${l}__`:""}${Object.keys(u).sort().map((n)=>`${n}=${u[n]}`).join("&")}`}function Ez(u,{id:l,defaultColor:f,defaultMarkerStart:n,defaultMarkerEnd:y}){let i=new Set;return u.reduce((_,$)=>{return[$.markerStart||n,$.markerEnd||y].forEach((A)=>{if(A&&typeof A==="object"){let j=jr(A,l);if(!i.has(j))_.push({id:j,color:A.color||f,...A}),i.add(j)}}),_},[]).sort((_,$)=>_.id.localeCompare($.id))}var Hz=1000,Tt=10,RJ={nodeOrigin:[0,0],nodeExtent:k_,elevateNodesOnSelect:!0,zIndexMode:"basic",defaults:{}},Vt={...RJ,checkEquality:!0};function bJ(u,l){let f={...u};for(let n in l)if(l[n]!==void 0)f[n]=l[n];return f}function Oz(u,l,f){let n=bJ(RJ,f);for(let y of u.values())if(y.parentId)hJ(y,u,l,n);else{let i=G6(y,n.nodeOrigin),_=b_(y.extent)?y.extent:n.nodeExtent,$=Li(i,_,Mn(y));y.internals.positionAbsolute=$}}function Bt(u,l){if(!u.handles)return!u.measured?void 0:l?.internals.handleBounds;let f=[],n=[];for(let y of u.handles){let i={id:y.id,width:y.width??1,height:y.height??1,nodeId:u.id,x:y.x,y:y.y,position:y.position,type:y.type};if(y.type==="source")f.push(i);else if(y.type==="target")n.push(i)}return{source:f,target:n}}function kJ(u){return u==="manual"}function Jr(u,l,f,n={}){let y=bJ(Vt,n),i={i:0},_=new Map(l),$=y?.elevateNodesOnSelect&&!kJ(y.zIndexMode)?Hz:0,A=u.length>0,j=!1;l.clear(),f.clear();for(let J of u){let Q=_.get(J.id);if(y.checkEquality&&J===Q?.internals.userNode)l.set(J.id,Q);else{let U=G6(J,y.nodeOrigin),F=b_(J.extent)?J.extent:y.nodeExtent,N=Li(U,F,Mn(J));Q={...y.defaults,...J,measured:{width:J.measured?.width,height:J.measured?.height},internals:{positionAbsolute:N,handleBounds:Bt(J,Q),z:Tz(J,$,y.zIndexMode),userNode:J}},l.set(J.id,Q)}if((Q.measured===void 0||Q.measured.width===void 0||Q.measured.height===void 0)&&!Q.hidden)A=!1;if(J.parentId)hJ(Q,l,f,n,i);j||=J.selected??!1}return{nodesInitialized:A,hasSelectedNodes:j}}function Xt(u,l){if(!u.parentId)return;let f=l.get(u.parentId);if(f)f.set(u.id,u);else l.set(u.parentId,new Map([[u.id,u]]))}function hJ(u,l,f,n,y){let{elevateNodesOnSelect:i,nodeOrigin:_,nodeExtent:$,zIndexMode:A}=bJ(RJ,n),j=u.parentId,J=l.get(j);if(!J){console.warn(`Parent node ${j} not found. Please make sure that parent nodes are in front of their child nodes in the nodes array.`);return}if(Xt(u,f),y&&!J.parentId&&J.internals.rootParentIndex===void 0&&A==="auto")J.internals.rootParentIndex=++y.i,J.internals.z=J.internals.z+y.i*Tt;if(y&&J.internals.rootParentIndex!==void 0)y.i=J.internals.rootParentIndex;let Q=i&&!kJ(A)?Hz:0,{x:U,y:F,z:N}=ct(u,J,_,$,Q,A),{positionAbsolute:K}=u.internals,G=U!==K.x||F!==K.y;if(G||N!==u.internals.z)l.set(u.id,{...u,internals:{...u.internals,positionAbsolute:G?{x:U,y:F}:K,z:N}})}function Tz(u,l,f){let n=b0(u.zIndex)?u.zIndex:0;if(kJ(f))return n;return n+(u.selected?l:0)}function ct(u,l,f,n,y,i){let{x:_,y:$}=l.internals.positionAbsolute,A=Mn(u),j=G6(u,f),J=b_(u.extent)?Li(j,u.extent,A):j,Q=Li({x:_+J.x,y:$+J.y},n,A);if(u.extent==="parent")Q=qz(Q,A,l);let U=Tz(u,y,i),F=l.internals.z??0;return{x:Q.x,y:Q.y,z:F>=U?F+1:U}}function Qr(u,l,f,n=[0,0]){let y=[],i=new Map;for(let _ of u){let $=l.get(_.parentId);if(!$)continue;let A=i.get(_.parentId)?.expandedRect??Ki($),j=cJ(A,_.rect);i.set(_.parentId,{expandedRect:j,parent:$})}if(i.size>0)i.forEach(({expandedRect:_,parent:$},A)=>{let j=$.internals.positionAbsolute,J=Mn($),Q=$.origin??n,U=_.x0||F>0||G||W)y.push({id:A,type:"position",position:{x:$.position.x-U+G,y:$.position.y-F+W}}),f.get(A)?.forEach((L)=>{if(!u.some((q)=>q.id===L.id))y.push({id:L.id,type:"position",position:{x:L.position.x+U,y:L.position.y+F}})});if(J.width<_.width||J.height<_.height||U||F)y.push({id:A,type:"dimensions",setAttributes:!0,dimensions:{width:N+(U?Q[0]*U-G:0),height:K+(F?Q[1]*F-W:0)}})});return y}function Vz(u,l,f,n,y,i,_){let $=n?.querySelector(".xyflow__viewport"),A=!1;if(!$)return{changes:[],updatedInternals:A};let j=[],J=window.getComputedStyle($),{m22:Q}=new window.DOMMatrixReadOnly(J.transform),U=[];for(let F of u.values()){let N=l.get(F.id);if(!N)continue;if(N.hidden){l.set(N.id,{...N,internals:{...N.internals,handleBounds:void 0}}),A=!0;continue}let K=_r(F.nodeElement),G=N.measured.width!==K.width||N.measured.height!==K.height;if(!!(K.width&&K.height&&(G||!N.internals.handleBounds||F.force))){let L=F.nodeElement.getBoundingClientRect(),q=b_(N.extent)?N.extent:i,{positionAbsolute:z}=N.internals;if(N.parentId&&N.extent==="parent")z=qz(z,K,l.get(N.parentId));else if(q)z=Li(z,q,K);let Z={...N,measured:K,internals:{...N.internals,positionAbsolute:z,handleBounds:{source:fz("source",F.nodeElement,L,Q,N.id),target:fz("target",F.nodeElement,L,Q,N.id)}}};if(l.set(N.id,Z),N.parentId)hJ(Z,l,f,{nodeOrigin:y,zIndexMode:_});if(A=!0,G){if(j.push({id:N.id,type:"dimensions",dimensions:K}),N.expandParent&&N.parentId)U.push({id:N.id,parentId:N.parentId,rect:Ki(Z,y)})}}}if(U.length>0){let F=Qr(U,l,f,y);j.push(...F)}return{changes:j,updatedInternals:A}}async function Bz({delta:u,panZoom:l,transform:f,translateExtent:n,width:y,height:i}){if(!l||!u.x&&!u.y)return Promise.resolve(!1);let _=await l.setViewportConstrained({x:f[0]+u.x,y:f[1]+u.y,zoom:f[2]},[[0,0],[y,i]],n),$=!!_&&(_.x!==f[0]||_.y!==f[1]||_.k!==f[2]);return Promise.resolve($)}function rz(u,l,f,n,y,i){let _=y,$=n.get(_)||new Map;n.set(_,$.set(f,l)),_=`${y}-${u}`;let A=n.get(_)||new Map;if(n.set(_,A.set(f,l)),i){_=`${y}-${u}-${i}`;let j=n.get(_)||new Map;n.set(_,j.set(f,l))}}function IJ(u,l,f){u.clear(),l.clear();for(let n of f){let{source:y,target:i,sourceHandle:_=null,targetHandle:$=null}=n,A={edgeId:n.id,source:y,target:i,sourceHandle:_,targetHandle:$},j=`${y}-${_}--${i}-${$}`,J=`${i}-${$}--${y}-${_}`;rz("source",A,J,u,y,_),rz("target",A,j,u,i,$),l.set(n.id,n)}}function Xz(u,l){if(!u.parentId)return!1;let f=l.get(u.parentId);if(!f)return!1;if(f.selected)return!0;return Xz(f,l)}function jz(u,l,f){let n=u;do{if(n?.matches?.(l))return!0;if(n===f)return!1;n=n?.parentElement}while(n);return!1}function Yt(u,l,f,n){let y=new Map;for(let[i,_]of u)if((_.selected||_.id===n)&&(!_.parentId||!Xz(_,u))&&(_.draggable||l&&typeof _.draggable>"u")){let $=u.get(i);if($)y.set(i,{id:i,position:$.position||{x:0,y:0},distance:{x:f.x-$.internals.positionAbsolute.x,y:f.y-$.internals.positionAbsolute.y},extent:$.extent,parentId:$.parentId,origin:$.origin,expandParent:$.expandParent,internals:{positionAbsolute:$.internals.positionAbsolute||{x:0,y:0}},measured:{width:$.measured.width??0,height:$.measured.height??0}})}return y}function KJ({nodeId:u,dragItems:l,nodeLookup:f,dragging:n=!0}){let y=[];for(let[_,$]of l){let A=f.get(_)?.internals.userNode;if(A)y.push({...A,position:$.position,dragging:n})}if(!u)return[y[0],y];let i=f.get(u)?.internals.userNode;return[!i?y[0]:{...i,position:l.get(u)?.position||i.position,dragging:n},y]}function Dt({dragItems:u,snapGrid:l,x:f,y:n}){let y=u.values().next().value;if(!y)return null;let i={x:f-y.distance.x,y:n-y.distance.y},_=v_(i,l);return{x:_.x-i.x,y:_.y-i.y}}function cz({onNodeMouseDown:u,getStoreItems:l,onDragStart:f,onDrag:n,onDragStop:y}){let i={x:null,y:null},_=0,$=new Map,A=!1,j={x:0,y:0},J=null,Q=!1,U=null,F=!1,N=!1,K=null;function G({noDragClassName:L,handleSelector:q,domNode:z,isSelectable:Z,nodeId:T,nodeClickDistance:X=0}){U=Af(z);function c({x:D,y:x}){let{nodeLookup:V,nodeExtent:t,snapGrid:M,snapToGrid:I,nodeOrigin:O,onNodeDrag:C,onSelectionDrag:g,onError:a,updateNodePositions:yu}=l();i={x:D,y:x};let ru=!1,R=$.size>1,m=R&&t?wJ(h_($)):null,fu=R&&I?Dt({dragItems:$,snapGrid:M,x:D,y:x}):null;for(let[iu,Ju]of $){if(!V.has(iu))continue;let Vu={x:D-Ju.distance.x,y:x-Ju.distance.y};if(I)Vu=fu?{x:Math.round(Vu.x+fu.x),y:Math.round(Vu.y+fu.y)}:v_(Vu,M);let Lu=null;if(R&&t&&!Ju.extent&&m){let{positionAbsolute:o}=Ju.internals,nu=o.x-m.x+t[0][0],wu=o.x+Ju.measured.width-m.x2+t[1][0],d=o.y-m.y+t[0][1],zu=o.y+Ju.measured.height-m.y2+t[1][1];Lu=[[nu,d],[wu,zu]]}let{position:Bu,positionAbsolute:b}=XJ({nodeId:iu,nextPosition:Vu,nodeLookup:V,nodeExtent:Lu?Lu:t,nodeOrigin:O,onError:a});ru=ru||Ju.position.x!==Bu.x||Ju.position.y!==Bu.y,Ju.position=Bu,Ju.internals.positionAbsolute=b}if(N=N||ru,!ru)return;if(yu($,!0),K&&(n||C||!T&&g)){let[iu,Ju]=KJ({nodeId:T,dragItems:$,nodeLookup:V});if(n?.(K,$,iu,Ju),C?.(K,iu,Ju),!T)g?.(K,Ju)}}async function S(){if(!J)return;let{transform:D,panBy:x,autoPanSpeed:V,autoPanOnNodeDrag:t}=l();if(!t){A=!1,cancelAnimationFrame(_);return}let[M,I]=Lz(j,J,V);if(M!==0||I!==0){if(i.x=(i.x??0)-M/D[2],i.y=(i.y??0)-I/D[2],await x({x:M,y:I}))c(i)}_=requestAnimationFrame(S)}function p(D){let{nodeLookup:x,multiSelectionActive:V,nodesDraggable:t,transform:M,snapGrid:I,snapToGrid:O,selectNodesOnDrag:C,onNodeDragStart:g,onSelectionDragStart:a,unselectNodesAndEdges:yu}=l();if(Q=!0,(!C||!Z)&&!V&&T){if(!x.get(T)?.selected)yu()}if(Z&&C&&T)u?.(T);let ru=K6(D.sourceEvent,{transform:M,snapGrid:I,snapToGrid:O,containerBounds:J});if(i=ru,$=Yt(x,t,ru,T),$.size>0&&(f||g||!T&&a)){let[R,m]=KJ({nodeId:T,dragItems:$,nodeLookup:x});if(f?.(D.sourceEvent,$,R,m),g?.(D.sourceEvent,R,m),!T)a?.(D.sourceEvent,m)}}let Y=u6().clickDistance(X).on("start",(D)=>{let{domNode:x,nodeDragThreshold:V,transform:t,snapGrid:M,snapToGrid:I}=l();if(J=x?.getBoundingClientRect()||null,F=!1,N=!1,K=D.sourceEvent,V===0)p(D);i=K6(D.sourceEvent,{transform:t,snapGrid:M,snapToGrid:I,containerBounds:J}),j=k0(D.sourceEvent,J)}).on("drag",(D)=>{let{autoPanOnNodeDrag:x,transform:V,snapGrid:t,snapToGrid:M,nodeDragThreshold:I,nodeLookup:O}=l(),C=K6(D.sourceEvent,{transform:V,snapGrid:t,snapToGrid:M,containerBounds:J});if(K=D.sourceEvent,D.sourceEvent.type==="touchmove"&&D.sourceEvent.touches.length>1||T&&!O.has(T))F=!0;if(F)return;if(!A&&x&&Q)A=!0,S();if(!Q){let g=k0(D.sourceEvent,J),a=g.x-j.x,yu=g.y-j.y;if(Math.sqrt(a*a+yu*yu)>I)p(D)}if((i.x!==C.xSnapped||i.y!==C.ySnapped)&&$&&Q)j=k0(D.sourceEvent,J),c(C)}).on("end",(D)=>{if(!Q||F)return;if(A=!1,Q=!1,cancelAnimationFrame(_),$.size>0){let{nodeLookup:x,updateNodePositions:V,onNodeDragStop:t,onSelectionDragStop:M}=l();if(N)V($,!1),N=!1;if(y||t||!T&&M){let[I,O]=KJ({nodeId:T,dragItems:$,nodeLookup:x,dragging:!1});if(y?.(D.sourceEvent,$,I,O),t?.(D.sourceEvent,I,O),!T)M?.(D.sourceEvent,O)}}}).filter((D)=>{let x=D.target;return!D.button&&(!L||!jz(x,`.${L}`,z))&&(!q||jz(x,q,z))});U.call(Y)}function W(){U?.on(".drag",null)}return{update:G,destroy:W}}function tt(u,l,f){let n=[],y={x:u.x-f,y:u.y-f,width:f*2,height:f*2};for(let i of l.values())if(I_(y,Ki(i))>0)n.push(i);return n}var St=250;function Pt(u,l,f,n){let y=[],i=1/0,_=tt(u,f,l+St);for(let $ of _){let A=[...$.internals.handleBounds?.source??[],...$.internals.handleBounds?.target??[]];for(let j of A){if(n.nodeId===j.nodeId&&n.type===j.type&&n.id===j.id)continue;let{x:J,y:Q}=Ny($,j,j.position,!0),U=Math.sqrt(Math.pow(J-u.x,2)+Math.pow(Q-u.y,2));if(U>l)continue;if(U1){let $=n.type==="source"?"target":"source";return y.find((A)=>A.type===$)??y[0]}return y[0]}function Yz(u,l,f,n,y,i=!1){let _=n.get(u);if(!_)return null;let $=y==="strict"?_.internals.handleBounds?.[l]:[..._.internals.handleBounds?.source??[],..._.internals.handleBounds?.target??[]],A=(f?$?.find((j)=>j.id===f):$?.[0])??null;return A&&i?{...A,...Ny(_,A,A.position,!0)}:A}function Dz(u,l){if(u)return u;else if(l?.classList.contains("target"))return"target";else if(l?.classList.contains("source"))return"source";return null}function Mt(u,l){let f=null;if(l)f=!0;else if(u&&!l)f=!1;return f}var tz=()=>!0;function Ct(u,{connectionMode:l,connectionRadius:f,handleId:n,nodeId:y,edgeUpdaterType:i,isTarget:_,domNode:$,nodeLookup:A,lib:j,autoPanOnConnect:J,flowId:Q,panBy:U,cancelConnection:F,onConnectStart:N,onConnect:K,onConnectEnd:G,isValidConnection:W=tz,onReconnectEnd:L,updateConnection:q,getTransform:z,getFromHandle:Z,autoPanSpeed:T,dragThreshold:X=1,handleDomNode:c}){let S=MJ(u.target),p=0,Y,{x:D,y:x}=k0(u),V=Dz(i,c),t=$?.getBoundingClientRect(),M=!1;if(!t||!V)return;let I=Yz(y,V,n,A,l);if(!I)return;let O=k0(u,t),C=!1,g=null,a=!1,yu=null;function ru(){if(!J||!t)return;let[Bu,b]=Lz(O,t,T);U({x:Bu,y:b}),p=requestAnimationFrame(ru)}let R={...I,nodeId:y,type:V,position:I.position},m=A.get(y),iu={inProgress:!0,isValid:null,from:Ny(m,R,cu.Left,!0),fromHandle:R,fromPosition:R.position,fromNode:m,to:O,toHandle:null,toPosition:uz[R.position],toNode:null,pointer:O};function Ju(){M=!0,q(iu),N?.(u,{nodeId:y,handleId:n,handleType:V})}if(X===0)Ju();function Vu(Bu){if(!M){let{x:zu,y:v}=k0(Bu),$u=zu-D,Wu=v-x;if(!($u*$u+Wu*Wu>X*X))return;Ju()}if(!Z()||!R){Lu(Bu);return}let b=z();if(O=k0(Bu,t),Y=Pt(g_(O,b,!1,[1,1]),f,A,R),!C)ru(),C=!0;let o=Sz(Bu,{handle:Y,connectionMode:l,fromNodeId:y,fromHandleId:n,fromType:_?"target":"source",isValidConnection:W,doc:S,lib:j,flowId:Q,nodeLookup:A});yu=o.handleDomNode,g=o.connection,a=Mt(!!Y,o.isValid);let nu=A.get(y),wu=nu?Ny(nu,R,cu.Left,!0):iu.from,d={...iu,from:wu,isValid:a,to:o.toHandle&&a?z6({x:o.toHandle.x,y:o.toHandle.y},b):O,toHandle:o.toHandle,toPosition:a&&o.toHandle?o.toHandle.position:uz[R.position],toNode:o.toHandle?A.get(o.toHandle.nodeId):null,pointer:O};q(d),iu=d}function Lu(Bu){if("touches"in Bu&&Bu.touches.length>0)return;if(M){if((Y||yu)&&g&&a)K?.(g);let{inProgress:b,...o}=iu,nu={...o,toPosition:iu.toHandle?iu.toPosition:null};if(G?.(Bu,nu),i)L?.(Bu,nu)}F(),cancelAnimationFrame(p),C=!1,a=!1,g=null,yu=null,S.removeEventListener("mousemove",Vu),S.removeEventListener("mouseup",Lu),S.removeEventListener("touchmove",Vu),S.removeEventListener("touchend",Lu)}S.addEventListener("mousemove",Vu),S.addEventListener("mouseup",Lu),S.addEventListener("touchmove",Vu),S.addEventListener("touchend",Lu)}function Sz(u,{handle:l,connectionMode:f,fromNodeId:n,fromHandleId:y,fromType:i,doc:_,lib:$,flowId:A,isValidConnection:j=tz,nodeLookup:J}){let Q=i==="target",U=l?_.querySelector(`.${$}-flow__handle[data-id="${A}-${l?.nodeId}-${l?.id}-${l?.type}"]`):null,{x:F,y:N}=k0(u),K=_.elementFromPoint(F,N),G=K?.classList.contains(`${$}-flow__handle`)?K:U,W={handleDomNode:G,isValid:!1,connection:null,toHandle:null};if(G){let L=Dz(void 0,G),q=G.getAttribute("data-nodeid"),z=G.getAttribute("data-handleid"),Z=G.classList.contains("connectable"),T=G.classList.contains("connectableend");if(!q||!L)return W;let X={source:Q?q:n,sourceHandle:Q?z:y,target:Q?n:q,targetHandle:Q?y:z};W.connection=X;let S=Z&&T&&(f===Qy.Strict?Q&&L==="source"||!Q&&L==="target":q!==n||z!==y);W.isValid=S&&j(X),W.toHandle=Yz(q,L,z,J,f,!0)}return W}var Ur={onPointerDown:Ct,isValid:Sz};function Pz({domNode:u,panZoom:l,getTransform:f,getViewScale:n}){let y=Af(u);function i({translateExtent:$,width:A,height:j,zoomStep:J=1,pannable:Q=!0,zoomable:U=!0,inversePan:F=!1}){let N=(q)=>{if(q.sourceEvent.type!=="wheel"||!l)return;let z=f(),Z=q.sourceEvent.ctrlKey&&s_()?10:1,T=-q.sourceEvent.deltaY*(q.sourceEvent.deltaMode===1?0.05:q.sourceEvent.deltaMode?1:0.002)*J,X=z[2]*Math.pow(2,T*Z);l.scaleTo(X)},K=[0,0],G=(q)=>{if(q.sourceEvent.type==="mousedown"||q.sourceEvent.type==="touchstart")K=[q.sourceEvent.clientX??q.sourceEvent.touches[0].clientX,q.sourceEvent.clientY??q.sourceEvent.touches[0].clientY]},W=(q)=>{let z=f();if(q.sourceEvent.type!=="mousemove"&&q.sourceEvent.type!=="touchmove"||!l)return;let Z=[q.sourceEvent.clientX??q.sourceEvent.touches[0].clientX,q.sourceEvent.clientY??q.sourceEvent.touches[0].clientY],T=[Z[0]-K[0],Z[1]-K[1]];K=Z;let X=n()*Math.max(z[2],Math.log(z[2]))*(F?-1:1),c={x:z[0]-T[0]*X,y:z[1]-T[1]*X},S=[[0,0],[A,j]];l.setViewportConstrained({x:c.x,y:c.y,zoom:z[2]},S,$)},L=L6().on("start",G).on("zoom",Q?W:null).on("zoom.wheel",U?N:null);y.call(L,{})}function _(){y.on("zoom",null)}return{update:i,destroy:_,pointer:Df}}var Nr=(u)=>({x:u.x,y:u.y,zoom:u.k}),zJ=({x:u,y:l,zoom:f})=>Fi.translate(u,l).scale(f),m_=(u,l)=>u.target.closest(`.${l}`),Mz=(u,l)=>l===2&&Array.isArray(u)&&u.includes(2),pt=(u)=>((u*=2)<=1?u*u*u:(u-=2)*u*u+2)/2,GJ=(u,l=0,f=pt,n=()=>{})=>{let y=typeof l==="number"&&l>0;if(!y)n();return y?u.transition().duration(l).ease(f).on("end",n):u},Cz=(u)=>{let l=u.ctrlKey&&s_()?10:1;return-u.deltaY*(u.deltaMode===1?0.05:u.deltaMode?1:0.002)*l};function xt({zoomPanValues:u,noWheelClassName:l,d3Selection:f,d3Zoom:n,panOnScrollMode:y,panOnScrollSpeed:i,zoomOnPinch:_,onPanZoomStart:$,onPanZoom:A,onPanZoomEnd:j}){return(J)=>{if(m_(J,l)){if(J.ctrlKey)J.preventDefault();return!1}J.preventDefault(),J.stopImmediatePropagation();let Q=f.property("__zoom").k||1;if(J.ctrlKey&&_){let G=Df(J),W=Cz(J),L=Q*Math.pow(2,W);n.scaleTo(f,L,G,J);return}let U=J.deltaMode===1?20:1,F=y===q1.Vertical?0:J.deltaX*U,N=y===q1.Horizontal?0:J.deltaY*U;if(!s_()&&J.shiftKey&&y!==q1.Vertical)F=J.deltaY*U,N=0;n.translateBy(f,-(F/Q)*i,-(N/Q)*i,{internal:!0});let K=Nr(f.property("__zoom"));if(clearTimeout(u.panScrollTimeout),!u.isPanScrolling)u.isPanScrolling=!0,$?.(J,K);else A?.(J,K),u.panScrollTimeout=setTimeout(()=>{j?.(J,K),u.isPanScrolling=!1},150)}}function mt({noWheelClassName:u,preventScrolling:l,d3ZoomHandler:f}){return function(n,y){let i=n.type==="wheel",_=!l&&i&&!n.ctrlKey,$=m_(n,u);if(n.ctrlKey&&i&&$)n.preventDefault();if(_||$)return null;n.preventDefault(),f.call(this,n,y)}}function Rt({zoomPanValues:u,onDraggingChange:l,onPanZoomStart:f}){return(n)=>{if(n.sourceEvent?.internal)return;let y=Nr(n.transform);if(u.mouseButton=n.sourceEvent?.button||0,u.isZoomingOrPanning=!0,u.prevViewport=y,n.sourceEvent?.type==="mousedown")l(!0);if(f)f?.(n.sourceEvent,y)}}function bt({zoomPanValues:u,panOnDrag:l,onPaneContextMenu:f,onTransformChange:n,onPanZoom:y}){return(i)=>{if(u.usedRightMouseButton=!!(f&&Mz(l,u.mouseButton??0)),!i.sourceEvent?.sync)n([i.transform.x,i.transform.y,i.transform.k]);if(y&&!i.sourceEvent?.internal)y?.(i.sourceEvent,Nr(i.transform))}}function kt({zoomPanValues:u,panOnDrag:l,panOnScroll:f,onDraggingChange:n,onPanZoomEnd:y,onPaneContextMenu:i}){return(_)=>{if(_.sourceEvent?.internal)return;if(u.isZoomingOrPanning=!1,i&&Mz(l,u.mouseButton??0)&&!u.usedRightMouseButton&&_.sourceEvent)i(_.sourceEvent);if(u.usedRightMouseButton=!1,n(!1),y){let $=Nr(_.transform);u.prevViewport=$,clearTimeout(u.timerId),u.timerId=setTimeout(()=>{y?.(_.sourceEvent,$)},f?150:0)}}}function ht({zoomActivationKeyPressed:u,zoomOnScroll:l,zoomOnPinch:f,panOnDrag:n,panOnScroll:y,zoomOnDoubleClick:i,userSelectionActive:_,noWheelClassName:$,noPanClassName:A,lib:j,connectionInProgress:J}){return(Q)=>{let U=u||l,F=f&&Q.ctrlKey,N=Q.type==="wheel";if(Q.button===1&&Q.type==="mousedown"&&(m_(Q,`${j}-flow__node`)||m_(Q,`${j}-flow__edge`)))return!0;if(!n&&!U&&!y&&!i&&!f)return!1;if(_)return!1;if(J&&!N)return!1;if(m_(Q,$)&&N)return!1;if(m_(Q,A)&&(!N||y&&N&&!u))return!1;if(!f&&Q.ctrlKey&&N)return!1;if(!f&&Q.type==="touchstart"&&Q.touches?.length>1)return Q.preventDefault(),!1;if(!U&&!y&&!F&&N)return!1;if(!n&&(Q.type==="mousedown"||Q.type==="touchstart"))return!1;if(Array.isArray(n)&&!n.includes(Q.button)&&Q.type==="mousedown")return!1;let K=Array.isArray(n)&&n.includes(Q.button)||!Q.button||Q.button<=1;return(!Q.ctrlKey||N)&&K}}function pz({domNode:u,minZoom:l,maxZoom:f,translateExtent:n,viewport:y,onPanZoom:i,onPanZoomStart:_,onPanZoomEnd:$,onDraggingChange:A}){let j={isZoomingOrPanning:!1,usedRightMouseButton:!1,prevViewport:{x:0,y:0,zoom:0},mouseButton:0,timerId:void 0,panScrollTimeout:void 0,isPanScrolling:!1},J=u.getBoundingClientRect(),Q=L6().scaleExtent([l,f]).translateExtent(n),U=Af(u).call(Q);L({x:y.x,y:y.y,zoom:R_(y.zoom,l,f)},[[0,0],[J.width,J.height]],n);let F=U.on("wheel.zoom"),N=U.on("dblclick.zoom");Q.wheelDelta(Cz);function K(Y,D){if(U)return new Promise((x)=>{Q?.interpolate(D?.interpolate==="linear"?Sn:Ui).transform(GJ(U,D?.duration,D?.ease,()=>x(!0)),Y)});return Promise.resolve(!1)}function G({noWheelClassName:Y,noPanClassName:D,onPaneContextMenu:x,userSelectionActive:V,panOnScroll:t,panOnDrag:M,panOnScrollMode:I,panOnScrollSpeed:O,preventScrolling:C,zoomOnPinch:g,zoomOnScroll:a,zoomOnDoubleClick:yu,zoomActivationKeyPressed:ru,lib:R,onTransformChange:m,connectionInProgress:fu,paneClickDistance:iu,selectionOnDrag:Ju}){if(V&&!j.isZoomingOrPanning)W();let Vu=t&&!ru&&!V;Q.clickDistance(Ju?1/0:!b0(iu)||iu<0?0:iu);let Lu=Vu?xt({zoomPanValues:j,noWheelClassName:Y,d3Selection:U,d3Zoom:Q,panOnScrollMode:I,panOnScrollSpeed:O,zoomOnPinch:g,onPanZoomStart:_,onPanZoom:i,onPanZoomEnd:$}):mt({noWheelClassName:Y,preventScrolling:C,d3ZoomHandler:F});if(U.on("wheel.zoom",Lu,{passive:!1}),!V){let b=Rt({zoomPanValues:j,onDraggingChange:A,onPanZoomStart:_});Q.on("start",b);let o=bt({zoomPanValues:j,panOnDrag:M,onPaneContextMenu:!!x,onPanZoom:i,onTransformChange:m});Q.on("zoom",o);let nu=kt({zoomPanValues:j,panOnDrag:M,panOnScroll:t,onPaneContextMenu:x,onPanZoomEnd:$,onDraggingChange:A});Q.on("end",nu)}let Bu=ht({zoomActivationKeyPressed:ru,panOnDrag:M,zoomOnScroll:a,panOnScroll:t,zoomOnDoubleClick:yu,zoomOnPinch:g,userSelectionActive:V,noPanClassName:D,noWheelClassName:Y,lib:R,connectionInProgress:fu});if(Q.filter(Bu),yu)U.on("dblclick.zoom",N);else U.on("dblclick.zoom",null)}function W(){Q.on("zoom",null)}async function L(Y,D,x){let V=zJ(Y),t=Q?.constrain()(V,D,x);if(t)await K(t);return new Promise((M)=>M(t))}async function q(Y,D){let x=zJ(Y);return await K(x,D),new Promise((V)=>V(x))}function z(Y){if(U){let D=zJ(Y),x=U.property("__zoom");if(x.k!==Y.zoom||x.x!==Y.x||x.y!==Y.y)Q?.transform(U,D,null,{sync:!0})}}function Z(){let Y=U?q6(U.node()):{x:0,y:0,k:1};return{x:Y.x,y:Y.y,zoom:Y.k}}function T(Y,D){if(U)return new Promise((x)=>{Q?.interpolate(D?.interpolate==="linear"?Sn:Ui).scaleTo(GJ(U,D?.duration,D?.ease,()=>x(!0)),Y)});return Promise.resolve(!1)}function X(Y,D){if(U)return new Promise((x)=>{Q?.interpolate(D?.interpolate==="linear"?Sn:Ui).scaleBy(GJ(U,D?.duration,D?.ease,()=>x(!0)),Y)});return Promise.resolve(!1)}function c(Y){Q?.scaleExtent(Y)}function S(Y){Q?.translateExtent(Y)}function p(Y){let D=!b0(Y)||Y<0?0:Y;Q?.clickDistance(D)}return{update:G,destroy:W,setViewport:q,setViewportConstrained:L,getViewport:Z,scaleTo:T,scaleBy:X,setScaleExtent:c,setTranslateExtent:S,syncViewport:z,setClickDistance:p}}var Fy;(function(u){u.Line="line",u.Handle="handle"})(Fy||(Fy={}));function It({width:u,prevWidth:l,height:f,prevHeight:n,affectsX:y,affectsY:i}){let _=u-l,$=f-n,A=[_>0?1:_<0?-1:0,$>0?1:$<0?-1:0];if(_&&y)A[0]=A[0]*-1;if($&&i)A[1]=A[1]*-1;return A}function Jz(u){let l=u.includes("right")||u.includes("left"),f=u.includes("bottom")||u.includes("top"),n=u.includes("left"),y=u.includes("top");return{isHorizontal:l,isVertical:f,affectsX:n,affectsY:y}}function jy(u,l){return Math.max(0,l-u)}function Jy(u,l){return Math.max(0,u-l)}function lr(u,l,f){return Math.max(0,l-u,u-f)}function Qz(u,l){return u?!l:l}function vt(u,l,f,n,y,i,_,$){let{affectsX:A,affectsY:j}=l,{isHorizontal:J,isVertical:Q}=l,U=J&&Q,{xSnapped:F,ySnapped:N}=f,{minWidth:K,maxWidth:G,minHeight:W,maxHeight:L}=n,{x:q,y:z,width:Z,height:T,aspectRatio:X}=u,c=Math.floor(J?F-u.pointerX:0),S=Math.floor(Q?N-u.pointerY:0),p=Z+(A?-c:c),Y=T+(j?-S:S),D=-i[0]*Z,x=-i[1]*T,V=lr(p,K,G),t=lr(Y,W,L);if(_){let O=0,C=0;if(A&&c<0)O=jy(q+c+D,_[0][0]);else if(!A&&c>0)O=Jy(q+p+D,_[1][0]);if(j&&S<0)C=jy(z+S+x,_[0][1]);else if(!j&&S>0)C=Jy(z+Y+x,_[1][1]);V=Math.max(V,O),t=Math.max(t,C)}if($){let O=0,C=0;if(A&&c>0)O=Jy(q+c,$[0][0]);else if(!A&&c<0)O=jy(q+p,$[1][0]);if(j&&S>0)C=Jy(z+S,$[0][1]);else if(!j&&S<0)C=jy(z+Y,$[1][1]);V=Math.max(V,O),t=Math.max(t,C)}if(y){if(J){let O=lr(p/X,W,L)*X;if(V=Math.max(V,O),_){let C=0;if(!A&&!j||A&&!j&&U)C=Jy(z+x+p/X,_[1][1])*X;else C=jy(z+x+(A?c:-c)/X,_[0][1])*X;V=Math.max(V,C)}if($){let C=0;if(!A&&!j||A&&!j&&U)C=jy(z+p/X,$[1][1])*X;else C=Jy(z+(A?c:-c)/X,$[0][1])*X;V=Math.max(V,C)}}if(Q){let O=lr(Y*X,K,G)/X;if(t=Math.max(t,O),_){let C=0;if(!A&&!j||j&&!A&&U)C=Jy(q+Y*X+D,_[1][0])/X;else C=jy(q+(j?S:-S)*X+D,_[0][0])/X;t=Math.max(t,C)}if($){let C=0;if(!A&&!j||j&&!A&&U)C=jy(q+Y*X,$[1][0])/X;else C=Jy(q+(j?S:-S)*X,$[0][0])/X;t=Math.max(t,C)}}}if(S=S+(S<0?t:-t),c=c+(c<0?V:-V),y)if(U)if(p>Y*X)S=(Qz(A,j)?-c:c)/X;else c=(Qz(A,j)?-S:S)*X;else if(J)S=c/X,j=A;else c=S*X,A=j;let M=A?q+c:q,I=j?z+S:z;return{width:Z+(A?-c:c),height:T+(j?-S:S),x:i[0]*c*(!A?1:-1)+M,y:i[1]*S*(!j?1:-1)+I}}var xz={width:0,height:0,x:0,y:0},gt={...xz,pointerX:0,pointerY:0,aspectRatio:1};function st(u){return[[0,0],[u.measured.width,u.measured.height]]}function at(u,l,f){let n=l.position.x+u.position.x,y=l.position.y+u.position.y,i=u.measured.width??0,_=u.measured.height??0,$=f[0]*i,A=f[1]*_;return[[n-$,y-A],[n+i-$,y+_-A]]}function mz({domNode:u,nodeId:l,getStoreItems:f,onChange:n,onEnd:y}){let i=Af(u),_={controlDirection:Jz("bottom-right"),boundaries:{minWidth:0,minHeight:0,maxWidth:Number.MAX_VALUE,maxHeight:Number.MAX_VALUE},resizeDirection:void 0,keepAspectRatio:!1};function $({controlPosition:j,boundaries:J,keepAspectRatio:Q,resizeDirection:U,onResizeStart:F,onResize:N,onResizeEnd:K,shouldResize:G}){let W={...xz},L={...gt};_={boundaries:J,resizeDirection:U,keepAspectRatio:Q,controlDirection:Jz(j)};let q=void 0,z=null,Z=[],T=void 0,X=void 0,c=void 0,S=!1,p=u6().on("start",(Y)=>{let{nodeLookup:D,transform:x,snapGrid:V,snapToGrid:t,nodeOrigin:M,paneDomNode:I}=f();if(q=D.get(l),!q)return;z=I?.getBoundingClientRect()??null;let{xSnapped:O,ySnapped:C}=K6(Y.sourceEvent,{transform:x,snapGrid:V,snapToGrid:t,containerBounds:z});if(W={width:q.measured.width??0,height:q.measured.height??0,x:q.position.x??0,y:q.position.y??0},L={...W,pointerX:O,pointerY:C,aspectRatio:W.width/W.height},T=void 0,q.parentId&&(q.extent==="parent"||q.expandParent))T=D.get(q.parentId),X=T&&q.extent==="parent"?st(T):void 0;Z=[],c=void 0;for(let[g,a]of D)if(a.parentId===l){if(Z.push({id:g,position:{...a.position},extent:a.extent}),a.extent==="parent"||a.expandParent){let yu=at(a,q,a.origin??M);if(c)c=[[Math.min(yu[0][0],c[0][0]),Math.min(yu[0][1],c[0][1])],[Math.max(yu[1][0],c[1][0]),Math.max(yu[1][1],c[1][1])]];else c=yu}}F?.(Y,{...W})}).on("drag",(Y)=>{let{transform:D,snapGrid:x,snapToGrid:V,nodeOrigin:t}=f(),M=K6(Y.sourceEvent,{transform:D,snapGrid:x,snapToGrid:V,containerBounds:z}),I=[];if(!q)return;let{x:O,y:C,width:g,height:a}=W,yu={},ru=q.origin??t,{width:R,height:m,x:fu,y:iu}=vt(L,_.controlDirection,M,_.boundaries,_.keepAspectRatio,ru,X,c),Ju=R!==g,Vu=m!==a,Lu=fu!==O&&Ju,Bu=iu!==C&&Vu;if(!Lu&&!Bu&&!Ju&&!Vu)return;if(Lu||Bu||ru[0]===1||ru[1]===1){if(yu.x=Lu?fu:W.x,yu.y=Bu?iu:W.y,W.x=yu.x,W.y=yu.y,Z.length>0){let wu=fu-O,d=iu-C;for(let zu of Z)zu.position={x:zu.position.x-wu+ru[0]*(R-g),y:zu.position.y-d+ru[1]*(m-a)},I.push(zu)}}if(Ju||Vu)yu.width=Ju&&(!_.resizeDirection||_.resizeDirection==="horizontal")?R:W.width,yu.height=Vu&&(!_.resizeDirection||_.resizeDirection==="vertical")?m:W.height,W.width=yu.width,W.height=yu.height;if(T&&q.expandParent){let wu=ru[0]*(yu.width??0);if(yu.x&&yu.x{if(!S)return;K?.(Y,{...W}),y?.({...W}),S=!1});i.call(p)}function A(){i.on(".drag",null)}return{update:$,destroy:A}}var ez=ku(ql(),1),uG=ku(sz(),1);var az=(u)=>{let l,f=new Set,n=(J,Q)=>{let U=typeof J==="function"?J(l):J;if(!Object.is(U,l)){let F=l;l=(Q!=null?Q:typeof U!=="object"||U===null)?U:Object.assign({},l,U),f.forEach((N)=>N(l,F))}},y=()=>l,A={setState:n,getState:y,getInitialState:()=>j,subscribe:(J)=>{return f.add(J),()=>f.delete(J)},destroy:()=>{f.clear()}},j=l=u(n,y,A);return A},oz=(u)=>u?az(u):az;var{useDebugValue:NS}=ez.default,{useSyncExternalStoreWithSelector:FS}=uG.default,WS=(u)=>u;function gJ(u,l=WS,f){let n=FS(u.subscribe,u.getState,u.getServerState||u.getInitialState,l,f);return NS(n),n}var dz=(u,l)=>{let f=oz(u),n=(y,i=l)=>gJ(f,y,i);return Object.assign(n,f),n},lG=(u,l)=>u?dz(u,l):dz;function Xl(u,l){if(Object.is(u,l))return!0;if(typeof u!=="object"||u===null||typeof l!=="object"||l===null)return!1;if(u instanceof Map&&l instanceof Map){if(u.size!==l.size)return!1;for(let[n,y]of u)if(!Object.is(y,l.get(n)))return!1;return!0}if(u instanceof Set&&l instanceof Set){if(u.size!==l.size)return!1;for(let n of u)if(!l.has(n))return!1;return!0}let f=Object.keys(u);if(f.length!==Object.keys(l).length)return!1;for(let n of f)if(!Object.prototype.hasOwnProperty.call(l,n)||!Object.is(u[n],l[n]))return!1;return!0}var qS=ku(t9(),1),Kr=ju.createContext(null),LS=Kr.Provider,HG=H0.error001();function Ql(u,l){let f=ju.useContext(Kr);if(f===null)throw Error(HG);return gJ(f,u,l)}function Pl(){let u=ju.useContext(Kr);if(u===null)throw Error(HG);return ju.useMemo(()=>({getState:u.getState,setState:u.setState,subscribe:u.subscribe}),[u])}var fG={display:"none"},KS={position:"absolute",width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0px, 0px, 0px, 0px)",clipPath:"inset(100%)"},OG="react-flow__node-desc",TG="react-flow__edge-desc",zS="react-flow__aria-live",GS=(u)=>u.ariaLiveMessage,wS=(u)=>u.ariaLabelConfig;function ZS({rfId:u}){let l=Ql(GS);return _u.jsx("div",{id:`${zS}-${u}`,"aria-live":"assertive","aria-atomic":"true",style:KS,children:l})}function ES({rfId:u,disableKeyboardA11y:l}){let f=Ql(wS);return _u.jsxs(_u.Fragment,{children:[_u.jsx("div",{id:`${OG}-${u}`,style:fG,children:l?f["node.a11yDescription.default"]:f["node.a11yDescription.keyboardDisabled"]}),_u.jsx("div",{id:`${TG}-${u}`,style:fG,children:f["edge.a11yDescription.default"]}),!l&&_u.jsx(ZS,{rfId:u})]})}var zr=ju.forwardRef(({position:u="top-left",children:l,className:f,style:n,...y},i)=>{let _=`${u}`.split("-");return _u.jsx("div",{className:vl(["react-flow__panel",f,..._]),style:n,ref:i,...y,children:l})});zr.displayName="Panel";function HS({proOptions:u,position:l="bottom-right"}){if(u?.hideAttribution)return null;return _u.jsx(zr,{position:l,className:"react-flow__attribution","data-message":"Please only hide this attribution when you are subscribed to React Flow Pro: https://pro.reactflow.dev",children:_u.jsx("a",{href:"https://reactflow.dev",target:"_blank",rel:"noopener noreferrer","aria-label":"React Flow attribution",children:"React Flow"})})}var OS=(u)=>{let l=[],f=[];for(let[,n]of u.nodeLookup)if(n.selected)l.push(n.internals.userNode);for(let[,n]of u.edgeLookup)if(n.selected)f.push(n);return{selectedNodes:l,selectedEdges:f}},Wr=(u)=>u.id;function TS(u,l){return Xl(u.selectedNodes.map(Wr),l.selectedNodes.map(Wr))&&Xl(u.selectedEdges.map(Wr),l.selectedEdges.map(Wr))}function VS({onSelectionChange:u}){let l=Pl(),{selectedNodes:f,selectedEdges:n}=Ql(OS,TS);return ju.useEffect(()=>{let y={nodes:f,edges:n};u?.(y),l.getState().onSelectionChangeHandlers.forEach((i)=>i(y))},[f,n,u]),null}var BS=(u)=>!!u.onSelectionChangeHandlers;function XS({onSelectionChange:u}){let l=Ql(BS);if(u||l)return _u.jsx(VS,{onSelectionChange:u});return null}var oJ=typeof window<"u"?ju.useLayoutEffect:ju.useEffect,VG=[0,0],cS={x:0,y:0,zoom:1},YS=["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"],nG=[...YS,"rfId"],DS=(u)=>({setNodes:u.setNodes,setEdges:u.setEdges,setMinZoom:u.setMinZoom,setMaxZoom:u.setMaxZoom,setTranslateExtent:u.setTranslateExtent,setNodeExtent:u.setNodeExtent,reset:u.reset,setDefaultNodesAndEdges:u.setDefaultNodesAndEdges}),yG={translateExtent:k_,nodeOrigin:VG,minZoom:0.5,maxZoom:2,elementsSelectable:!0,noPanClassName:"nopan",rfId:"1"};function tS(u){let{setNodes:l,setEdges:f,setMinZoom:n,setMaxZoom:y,setTranslateExtent:i,setNodeExtent:_,reset:$,setDefaultNodesAndEdges:A}=Ql(DS,Xl),j=Pl();oJ(()=>{return A(u.defaultNodes,u.defaultEdges),()=>{J.current=yG,$()}},[]);let J=ju.useRef(yG);return oJ(()=>{for(let Q of nG){let U=u[Q],F=J.current[Q];if(U===F)continue;if(typeof u[Q]>"u")continue;if(Q==="nodes")l(U);else if(Q==="edges")f(U);else if(Q==="minZoom")n(U);else if(Q==="maxZoom")y(U);else if(Q==="translateExtent")i(U);else if(Q==="nodeExtent")_(U);else if(Q==="ariaLabelConfig")j.setState({ariaLabelConfig:zz(U)});else if(Q==="fitView")j.setState({fitViewQueued:U});else if(Q==="fitViewOptions")j.setState({fitViewOptions:U});else j.setState({[Q]:U})}J.current=u},nG.map((Q)=>u[Q])),null}function iG(){if(typeof window>"u"||!window.matchMedia)return null;return window.matchMedia("(prefers-color-scheme: dark)")}function SS(u){let[l,f]=ju.useState(u==="system"?null:u);return ju.useEffect(()=>{if(u!=="system"){f(u);return}let n=iG(),y=()=>f(n?.matches?"dark":"light");return y(),n?.addEventListener("change",y),()=>{n?.removeEventListener("change",y)}},[u]),l!==null?l:iG()?.matches?"dark":"light"}var _G=typeof document<"u"?document:null;function E6(u=null,l={target:_G,actInsideInputWithModifier:!0}){let[f,n]=ju.useState(!1),y=ju.useRef(!1),i=ju.useRef(new Set([])),[_,$]=ju.useMemo(()=>{if(u!==null){let j=(Array.isArray(u)?u:[u]).filter((Q)=>typeof Q==="string").map((Q)=>Q.replace("+",` `).replace(` `,` +`).split(` -`)),J=j.reduce((Q,U)=>Q.concat(...U),[]);return[j,J]}return[[],[]]},[u]);return ju.useEffect(()=>{let r=l?.target??yG,j=l?.actInsideInputWithModifier??!0;if(u!==null){let J=(F)=>{if(i.current=F.ctrlKey||F.metaKey||F.shiftKey||F.altKey,(!i.current||i.current&&!j)&&MJ(F))return!1;let L=$G(F.code,$);if(y.current.add(F[L]),_G(_,y.current,!1)){let w=F.composedPath?.()?.[0]||F.target,W=w?.nodeName==="BUTTON"||w?.nodeName==="A";if(l.preventDefault!==!1&&(i.current||!W))F.preventDefault();n(!0)}},Q=(F)=>{let N=$G(F.code,$);if(_G(_,y.current,!0))n(!1),y.current.clear();else y.current.delete(F[N]);if(F.key==="Meta")y.current.clear();i.current=!1},U=()=>{y.current.clear(),n(!1)};return r?.addEventListener("keydown",J),r?.addEventListener("keyup",Q),window.addEventListener("blur",U),window.addEventListener("contextmenu",U),()=>{r?.removeEventListener("keydown",J),r?.removeEventListener("keyup",Q),window.removeEventListener("blur",U),window.removeEventListener("contextmenu",U)}}},[u,n]),f}function _G(u,l,f){return u.filter((n)=>f||n.length===l.size).some((n)=>n.every((i)=>l.has(i)))}function $G(u,l){return l.includes(u)?"code":"key"}var SS=()=>{let u=Sl();return ju.useMemo(()=>{return{zoomIn:(l)=>{let{panZoom:f}=u.getState();return f?f.scaleBy(1.2,l):Promise.resolve(!1)},zoomOut:(l)=>{let{panZoom:f}=u.getState();return f?f.scaleBy(0.8333333333333334,l):Promise.resolve(!1)},zoomTo:(l,f)=>{let{panZoom:n}=u.getState();return n?n.scaleTo(l,f):Promise.resolve(!1)},getZoom:()=>u.getState().transform[2],setViewport:async(l,f)=>{let{transform:[n,i,y],panZoom:_}=u.getState();if(!_)return Promise.resolve(!1);return await _.setViewport({x:l.x??n,y:l.y??i,zoom:l.zoom??y},f),Promise.resolve(!0)},getViewport:()=>{let[l,f,n]=u.getState().transform;return{x:l,y:f,zoom:n}},setCenter:async(l,f,n)=>{return u.getState().setCenter(l,f,n)},fitBounds:async(l,f)=>{let{width:n,height:i,minZoom:y,maxZoom:_,panZoom:$}=u.getState(),r=Gr(l,n,i,y,_,f?.padding??0.1);if(!$)return Promise.resolve(!1);return await $.setViewport(r,{duration:f?.duration,ease:f?.ease,interpolate:f?.interpolate}),Promise.resolve(!0)},screenToFlowPosition:(l,f={})=>{let{transform:n,snapGrid:i,snapToGrid:y,domNode:_}=u.getState();if(!_)return l;let{x:$,y:r}=_.getBoundingClientRect(),j={x:l.x-$,y:l.y-r},J=f.snapGrid??i,Q=f.snapToGrid??y;return v_(j,n,Q,J)},flowToScreenPosition:(l)=>{let{transform:f,domNode:n}=u.getState();if(!n)return l;let{x:i,y}=n.getBoundingClientRect(),_=Kr(l,f);return{x:_.x+i,y:_.y+y}}}},[])};function VG(u,l){let f=[],n=new Map,i=[];for(let y of u)if(y.type==="add"){i.push(y);continue}else if(y.type==="remove"||y.type==="replace")n.set(y.id,[y]);else{let _=n.get(y.id);if(_)_.push(y);else n.set(y.id,[y])}for(let y of l){let _=n.get(y.id);if(!_){f.push(y);continue}if(_[0].type==="remove")continue;if(_[0].type==="replace"){f.push({..._[0].item});continue}let $={...y};for(let r of _)PS(r,$);f.push($)}if(i.length)i.forEach((y)=>{if(y.index!==void 0)f.splice(y.index,0,{...y.item});else f.push({...y.item})});return f}function PS(u,l){switch(u.type){case"select":{l.selected=u.selected;break}case"position":{if(typeof u.position<"u")l.position=u.position;if(typeof u.dragging<"u")l.dragging=u.dragging;break}case"dimensions":{if(typeof u.dimensions<"u"){if(l.measured={...u.dimensions},u.setAttributes){if(u.setAttributes===!0||u.setAttributes==="width")l.width=u.dimensions.width;if(u.setAttributes===!0||u.setAttributes==="height")l.height=u.dimensions.height}}if(typeof u.resizing==="boolean")l.resizing=u.resizing;break}}}function MS(u,l){return VG(u,l)}function CS(u,l){return VG(u,l)}function Ky(u,l){return{id:u,type:"select",selected:l}}function a_(u,l=new Set,f=!1){let n=[];for(let[i,y]of u){let _=l.has(i);if(!(y.selected===void 0&&!_)&&y.selected!==_){if(f)y.selected=_;n.push(Ky(y.id,_))}}return n}function rG({items:u=[],lookup:l}){let f=[],n=new Map(u.map((i)=>[i.id,i]));for(let[i,y]of u.entries()){let _=l.get(y.id),$=_?.internals?.userNode??_;if($!==void 0&&$!==y)f.push({id:y.id,item:y,type:"replace"});if($===void 0)f.push({item:y,type:"add",index:i})}for(let[i]of l)if(n.get(i)===void 0)f.push({id:i,type:"remove"});return f}function AG(u){return{id:u.id,type:"remove"}}var jG=(u)=>Qz(u),pS=(u)=>OJ(u);function BG(u){return ju.forwardRef(u)}function JG(u){let[l,f]=ju.useState(BigInt(0)),[n]=ju.useState(()=>mS(()=>f((i)=>i+BigInt(1))));return aJ(()=>{let i=n.get();if(i.length)u(i),n.reset()},[l]),n}function mS(u){let l=[];return{get:()=>l,reset:()=>{l=[]},push:(f)=>{l.push(f),u()}}}var cG=ju.createContext(null);function xS({children:u}){let l=Sl(),f=ju.useCallback(($)=>{let{nodes:r=[],setNodes:j,hasDefaultNodes:J,onNodesChange:Q,nodeLookup:U,fitViewQueued:F,onNodesChangeMiddlewareMap:N}=l.getState(),L=r;for(let W of $)L=typeof W==="function"?W(L):W;let w=rG({items:L,lookup:U});for(let W of N.values())w=W(w);if(J)j(L);if(w.length>0)Q?.(w);else if(F)window.requestAnimationFrame(()=>{let{fitViewQueued:W,nodes:K,setNodes:q}=l.getState();if(W)q(K)})},[]),n=JG(f),i=ju.useCallback(($)=>{let{edges:r=[],setEdges:j,hasDefaultEdges:J,onEdgesChange:Q,edgeLookup:U}=l.getState(),F=r;for(let N of $)F=typeof N==="function"?N(F):N;if(J)j(F);else if(Q)Q(rG({items:F,lookup:U}))},[]),y=JG(i),_=ju.useMemo(()=>({nodeQueue:n,edgeQueue:y}),[]);return _u.jsx(cG.Provider,{value:_,children:u})}function RS(){let u=ju.useContext(cG);if(!u)throw Error("useBatchContext must be used within a BatchProvider");return u}var bS=(u)=>!!u.panZoom;function dJ(){let u=SS(),l=Sl(),f=RS(),n=Ql(bS),i=ju.useMemo(()=>{let y=(Q)=>l.getState().nodeLookup.get(Q),_=(Q)=>{f.nodeQueue.push(Q)},$=(Q)=>{f.edgeQueue.push(Q)},r=(Q)=>{let{nodeLookup:U,nodeOrigin:F}=l.getState(),N=jG(Q)?Q:U.get(Q.id),L=N.parentId?DJ(N.position,N.measured,N.parentId,U,F):N.position,w={...N,position:L,width:N.measured?.width??N.width,height:N.measured?.height??N.height};return Ly(w)},j=(Q,U,F={replace:!1})=>{_((N)=>N.map((L)=>{if(L.id===Q){let w=typeof U==="function"?U(L):U;return F.replace&&jG(w)?w:{...L,...w}}return L}))},J=(Q,U,F={replace:!1})=>{$((N)=>N.map((L)=>{if(L.id===Q){let w=typeof U==="function"?U(L):U;return F.replace&&pS(w)?w:{...L,...w}}return L}))};return{getNodes:()=>l.getState().nodes.map((Q)=>({...Q})),getNode:(Q)=>y(Q)?.internals.userNode,getInternalNode:y,getEdges:()=>{let{edges:Q=[]}=l.getState();return Q.map((U)=>({...U}))},getEdge:(Q)=>l.getState().edgeLookup.get(Q),setNodes:_,setEdges:$,addNodes:(Q)=>{let U=Array.isArray(Q)?Q:[Q];f.nodeQueue.push((F)=>[...F,...U])},addEdges:(Q)=>{let U=Array.isArray(Q)?Q:[Q];f.edgeQueue.push((F)=>[...F,...U])},toObject:()=>{let{nodes:Q=[],edges:U=[],transform:F}=l.getState(),[N,L,w]=F;return{nodes:Q.map((W)=>({...W})),edges:U.map((W)=>({...W})),viewport:{x:N,y:L,zoom:w}}},deleteElements:async({nodes:Q=[],edges:U=[]})=>{let{nodes:F,edges:N,onNodesDelete:L,onEdgesDelete:w,triggerNodeChanges:W,triggerEdgeChanges:K,onDelete:q,onBeforeDelete:z}=l.getState(),{nodes:Z,edges:T}=await Fz({nodesToRemove:Q,edgesToRemove:U,nodes:F,edges:N,onBeforeDelete:z}),c=T.length>0,X=Z.length>0;if(c){let S=T.map(AG);w?.(T),K(S)}if(X){let S=Z.map(AG);L?.(Z),W(S)}if(X||c)q?.({nodes:Z,edges:T});return{deletedNodes:Z,deletedEdges:T}},getIntersectingNodes:(Q,U=!0,F)=>{let N=XJ(Q),L=N?Q:r(Q),w=F!==void 0;if(!L)return[];return(F||l.getState().nodes).filter((W)=>{let K=l.getState().nodeLookup.get(W.id);if(K&&!N&&(W.id===Q.id||!K.internals.positionAbsolute))return!1;let q=Ly(w?W:K),z=h_(q,L);return U&&z>0||z>=q.width*q.height||z>=L.width*L.height})},isNodeIntersecting:(Q,U,F=!0)=>{let L=XJ(Q)?Q:r(Q);if(!L)return!1;let w=h_(L,U);return F&&w>0||w>=U.width*U.height||w>=L.width*L.height},updateNode:j,updateNodeData:(Q,U,F={replace:!1})=>{j(Q,(N)=>{let L=typeof U==="function"?U(N):U;return F.replace?{...N,data:L}:{...N,data:{...N.data,...L}}},F)},updateEdge:J,updateEdgeData:(Q,U,F={replace:!1})=>{J(Q,(N)=>{let L=typeof U==="function"?U(N):U;return F.replace?{...N,data:L}:{...N,data:{...N.data,...L}}},F)},getNodesBounds:(Q)=>{let{nodeLookup:U,nodeOrigin:F}=l.getState();return VJ(Q,{nodeLookup:U,nodeOrigin:F})},getHandleConnections:({type:Q,id:U,nodeId:F})=>Array.from(l.getState().connectionLookup.get(`${F}-${Q}${U?`-${U}`:""}`)?.values()??[]),getNodeConnections:({type:Q,handleId:U,nodeId:F})=>Array.from(l.getState().connectionLookup.get(`${F}${Q?U?`-${Q}-${U}`:`-${Q}`:""}`)?.values()??[]),fitView:async(Q)=>{let U=l.getState().fitViewResolver??Lz();return l.setState({fitViewQueued:!0,fitViewOptions:Q,fitViewResolver:U}),f.nodeQueue.push((F)=>[...F]),U.promise}}},[]);return ju.useMemo(()=>{return{...i,...u,viewportInitialized:n}},[n])}var QG=(u)=>u.selected,kS=typeof window<"u"?window:void 0;function hS({deleteKeyCode:u,multiSelectionKeyCode:l}){let f=Sl(),{deleteElements:n}=dJ(),i=Zr(u,{actInsideInputWithModifier:!1}),y=Zr(l,{target:kS});ju.useEffect(()=>{if(i){let{edges:_,nodes:$}=f.getState();n({nodes:$.filter(QG),edges:_.filter(QG)}),f.setState({nodesSelectionActive:!1})}},[i]),ju.useEffect(()=>{f.setState({multiSelectionActive:y})},[y])}function IS(u){let l=Sl();ju.useEffect(()=>{let f=()=>{if(!u.current||!(u.current.checkVisibility?.()??!0))return!1;let n=yA(u.current);if(n.height===0||n.width===0)l.getState().onError?.("004",Z0.error004());l.setState({width:n.width||500,height:n.height||500})};if(u.current){f(),window.addEventListener("resize",f);let n=new ResizeObserver(()=>f());return n.observe(u.current),()=>{if(window.removeEventListener("resize",f),n&&u.current)n.unobserve(u.current)}}},[])}var zA={position:"absolute",width:"100%",height:"100%",top:0,left:0},vS=(u)=>({userSelectionActive:u.userSelectionActive,lib:u.lib,connectionInProgress:u.connection.inProgress});function gS({onPaneContextMenu:u,zoomOnScroll:l=!0,zoomOnPinch:f=!0,panOnScroll:n=!1,panOnScrollSpeed:i=0.5,panOnScrollMode:y=W1.Free,zoomOnDoubleClick:_=!0,panOnDrag:$=!0,defaultViewport:r,translateExtent:j,minZoom:J,maxZoom:Q,zoomActivationKeyCode:U,preventScrolling:F=!0,children:N,noWheelClassName:L,noPanClassName:w,onViewportChange:W,isControlledViewport:K,paneClickDistance:q,selectionOnDrag:z}){let Z=Sl(),T=ju.useRef(null),{userSelectionActive:c,lib:X,connectionInProgress:S}=Ql(vS,Bl),p=Zr(U),Y=ju.useRef();IS(T);let t=ju.useCallback((m)=>{if(W?.({x:m[0],y:m[1],zoom:m[2]}),!K)Z.setState({transform:m})},[W,K]);return ju.useEffect(()=>{if(T.current){Y.current=Cz({domNode:T.current,minZoom:J,maxZoom:Q,translateExtent:j,viewport:r,onDraggingChange:(M)=>Z.setState((I)=>I.paneDragging===M?I:{paneDragging:M}),onPanZoomStart:(M,I)=>{let{onViewportChangeStart:O,onMoveStart:C}=Z.getState();C?.(M,I),O?.(I)},onPanZoom:(M,I)=>{let{onViewportChange:O,onMove:C}=Z.getState();C?.(M,I),O?.(I)},onPanZoomEnd:(M,I)=>{let{onViewportChangeEnd:O,onMoveEnd:C}=Z.getState();C?.(M,I),O?.(I)}});let{x:m,y:V,zoom:D}=Y.current.getViewport();return Z.setState({panZoom:Y.current,transform:[m,V,D],domNode:T.current.closest(".react-flow")}),()=>{Y.current?.destroy()}}},[]),ju.useEffect(()=>{Y.current?.update({onPaneContextMenu:u,zoomOnScroll:l,zoomOnPinch:f,panOnScroll:n,panOnScrollSpeed:i,panOnScrollMode:y,zoomOnDoubleClick:_,panOnDrag:$,zoomActivationKeyPressed:p,preventScrolling:F,noPanClassName:w,userSelectionActive:c,noWheelClassName:L,lib:X,onTransformChange:t,connectionInProgress:S,selectionOnDrag:z,paneClickDistance:q})},[u,l,f,n,i,y,_,$,p,F,w,c,L,X,t,S,z,q]),_u.jsx("div",{className:"react-flow__renderer",ref:T,style:zA,children:N})}var sS=(u)=>({userSelectionActive:u.userSelectionActive,userSelectionRect:u.userSelectionRect});function aS(){let{userSelectionActive:u,userSelectionRect:l}=Ql(sS,Bl);if(!(u&&l))return null;return _u.jsx("div",{className:"react-flow__selection react-flow__container",style:{width:l.width,height:l.height,transform:`translate(${l.x}px, ${l.y}px)`}})}var gJ=(u,l)=>{return(f)=>{if(f.target!==l.current)return;u?.(f)}},oS=(u)=>({userSelectionActive:u.userSelectionActive,elementsSelectable:u.elementsSelectable,connectionInProgress:u.connection.inProgress,dragging:u.paneDragging});function dS({isSelecting:u,selectionKeyPressed:l,selectionMode:f=Wy.Full,panOnDrag:n,paneClickDistance:i,selectionOnDrag:y,onSelectionStart:_,onSelectionEnd:$,onPaneClick:r,onPaneContextMenu:j,onPaneScroll:J,onPaneMouseEnter:Q,onPaneMouseMove:U,onPaneMouseLeave:F,children:N}){let L=Sl(),{userSelectionActive:w,elementsSelectable:W,dragging:K,connectionInProgress:q}=Ql(oS,Bl),z=W&&(u||w),Z=ju.useRef(null),T=ju.useRef(),c=ju.useRef(new Set),X=ju.useRef(new Set),S=ju.useRef(!1),p=(O)=>{if(S.current||q){S.current=!1;return}r?.(O),L.getState().resetSelectedElements(),L.setState({nodesSelectionActive:!1})},Y=(O)=>{if(Array.isArray(n)&&n?.includes(2)){O.preventDefault();return}j?.(O)},t=J?(O)=>J(O):void 0,m=(O)=>{if(S.current)O.stopPropagation(),S.current=!1},V=(O)=>{let{domNode:C}=L.getState();if(T.current=C?.getBoundingClientRect(),!T.current)return;let g=O.target===Z.current;if(!g&&!!O.target.closest(".nokey")||!u||!(y&&g||l)||O.button!==0||!O.isPrimary)return;O.target?.setPointerCapture?.(O.pointerId),S.current=!1;let{x:Au,y:R}=R0(O.nativeEvent,T.current);if(L.setState({userSelectionRect:{width:0,height:0,startX:Au,startY:R,x:Au,y:R}}),!g)O.stopPropagation(),O.preventDefault()},D=(O)=>{let{userSelectionRect:C,transform:g,nodeLookup:a,edgeLookup:iu,connectionLookup:Au,triggerNodeChanges:R,triggerEdgeChanges:x,defaultEdgeOptions:fu,resetSelectedElements:yu}=L.getState();if(!T.current||!C)return;let{x:Ju,y:Vu}=R0(O.nativeEvent,T.current),{startX:Lu,startY:Bu}=C;if(!S.current){let e=l?0:i;if(Math.hypot(Ju-Lu,Vu-Bu)<=e)return;yu(),_?.(O)}S.current=!0;let b={startX:Lu,startY:Bu,x:Jue.id)),X.current=new Set;let wu=fu?.selectable??!0;for(let e of c.current){let zu=Au.get(e);if(!zu)continue;for(let{edgeId:v}of zu.values()){let $u=iu.get(v);if($u&&($u.selectable??wu))X.current.add(v)}}if(!SJ(o,c.current)){let e=a_(a,c.current,!0);R(e)}if(!SJ(nu,X.current)){let e=a_(iu,X.current);x(e)}L.setState({userSelectionRect:b,userSelectionActive:!0,nodesSelectionActive:!1})},M=(O)=>{if(O.button!==0)return;if(O.target?.releasePointerCapture?.(O.pointerId),!w&&O.target===Z.current&&L.getState().userSelectionRect)p?.(O);if(L.setState({userSelectionActive:!1,userSelectionRect:null}),S.current)$?.(O),L.setState({nodesSelectionActive:c.current.size>0})},I=n===!0||Array.isArray(n)&&n.includes(0);return _u.jsxs("div",{className:Il(["react-flow__pane",{draggable:I,dragging:K,selection:u}]),onClick:z?void 0:gJ(p,Z),onContextMenu:gJ(Y,Z),onWheel:gJ(t,Z),onPointerEnter:z?void 0:Q,onPointerMove:z?D:U,onPointerUp:z?M:void 0,onPointerDownCapture:z?V:void 0,onClickCapture:z?m:void 0,onPointerLeave:F,ref:Z,style:zA,children:[N,_u.jsx(aS,{})]})}function oJ({id:u,store:l,unselect:f=!1,nodeRef:n}){let{addSelectedNodes:i,unselectNodesAndEdges:y,multiSelectionActive:_,nodeLookup:$,onError:r}=l.getState(),j=$.get(u);if(!j){r?.("012",Z0.error012(u));return}if(l.setState({nodesSelectionActive:!1}),!j.selected)i([u]);else if(f||j.selected&&_)y({nodes:[j],edges:[]}),requestAnimationFrame(()=>n?.current?.blur())}function XG({nodeRef:u,disabled:l=!1,noDragClassName:f,handleSelector:n,nodeId:i,isSelectable:y,nodeClickDistance:_}){let $=Sl(),[r,j]=ju.useState(!1),J=ju.useRef();return ju.useEffect(()=>{J.current=cz({getStoreItems:()=>$.getState(),onNodeMouseDown:(Q)=>{oJ({id:Q,store:$,nodeRef:u})},onDragStart:()=>{j(!0)},onDragStop:()=>{j(!1)}})},[]),ju.useEffect(()=>{if(l||!u.current||!J.current)return;return J.current.update({noDragClassName:f,handleSelector:n,domNode:u.current,isSelectable:y,nodeId:i,nodeClickDistance:_}),()=>{J.current?.destroy()}},[f,n,l,y,u,i,_]),r}var eS=(u)=>(l)=>l.selected&&(l.draggable||u&&typeof l.draggable>"u");function YG(){let u=Sl();return ju.useCallback((f)=>{let{nodeExtent:n,snapToGrid:i,snapGrid:y,nodesDraggable:_,onError:$,updateNodePositions:r,nodeLookup:j,nodeOrigin:J}=u.getState(),Q=new Map,U=eS(_),F=i?y[0]:5,N=i?y[1]:5,L=f.direction.x*F*f.factor,w=f.direction.y*N*f.factor;for(let[,W]of j){if(!U(W))continue;let K={x:W.internals.positionAbsolute.x+L,y:W.internals.positionAbsolute.y+w};if(i)K=I_(K,y);let{position:q,positionAbsolute:z}=BJ({nodeId:W.id,nextPosition:K,nodeLookup:j,nodeExtent:n,nodeOrigin:J,onError:$});W.position=q,W.internals.positionAbsolute=z,Q.set(W.id,W)}r(Q)},[])}var eJ=ju.createContext(null),uP=eJ.Provider;eJ.Consumer;var tG=()=>{return ju.useContext(eJ)},lP=(u)=>({connectOnClick:u.connectOnClick,noPanClassName:u.noPanClassName,rfId:u.rfId}),fP=(u,l,f)=>(n)=>{let{connectionClickStartHandle:i,connectionMode:y,connection:_}=n,{fromHandle:$,toHandle:r,isValid:j}=_,J=r?.nodeId===u&&r?.id===l&&r?.type===f;return{connectingFrom:$?.nodeId===u&&$?.id===l&&$?.type===f,connectingTo:J,clickConnecting:i?.nodeId===u&&i?.id===l&&i?.type===f,isPossibleEndHandle:y===Qi.Strict?$?.type!==f:u!==$?.nodeId||l!==$?.id,connectionInProcess:!!$,clickConnectionInProcess:!!i,valid:J&&j}};function nP({type:u="source",position:l=Xu.Top,isValidConnection:f,isConnectable:n=!0,isConnectableStart:i=!0,isConnectableEnd:y=!0,id:_,onConnect:$,children:r,className:j,onMouseDown:J,onTouchStart:Q,...U},F){let N=_||null,L=u==="target",w=Sl(),W=tG(),{connectOnClick:K,noPanClassName:q,rfId:z}=Ql(lP,Bl),{connectingFrom:Z,connectingTo:T,clickConnecting:c,isPossibleEndHandle:X,connectionInProcess:S,clickConnectionInProcess:p,valid:Y}=Ql(fP(W,N,u),Bl);if(!W)w.getState().onError?.("010",Z0.error010());let t=(D)=>{let{defaultEdgeOptions:M,onConnect:I,hasDefaultEdges:O}=w.getState(),C={...M,...D};if(O){let{edges:g,setEdges:a}=w.getState();a(mJ(C,g))}I?.(C),$?.(C)},m=(D)=>{if(!W)return;let M=CJ(D.nativeEvent);if(i&&(M&&D.button===0||!M)){let I=w.getState();QA.onPointerDown(D.nativeEvent,{handleDomNode:D.currentTarget,autoPanOnConnect:I.autoPanOnConnect,connectionMode:I.connectionMode,connectionRadius:I.connectionRadius,domNode:I.domNode,nodeLookup:I.nodeLookup,lib:I.lib,isTarget:L,handleId:N,nodeId:W,flowId:I.rfId,panBy:I.panBy,cancelConnection:I.cancelConnection,onConnectStart:I.onConnectStart,onConnectEnd:(...O)=>w.getState().onConnectEnd?.(...O),updateConnection:I.updateConnection,onConnect:t,isValidConnection:f||((...O)=>w.getState().isValidConnection?.(...O)??!0),getTransform:()=>w.getState().transform,getFromHandle:()=>w.getState().connection.fromHandle,autoPanSpeed:I.autoPanSpeed,dragThreshold:I.connectionDragThreshold})}if(M)J?.(D);else Q?.(D)},V=(D)=>{let{onClickConnectStart:M,onClickConnectEnd:I,connectionClickStartHandle:O,connectionMode:C,isValidConnection:g,lib:a,rfId:iu,nodeLookup:Au,connection:R}=w.getState();if(!W||!O&&!i)return;if(!O){M?.(D.nativeEvent,{nodeId:W,handleId:N,handleType:u}),w.setState({connectionClickStartHandle:{nodeId:W,type:u,id:N}});return}let x=PJ(D.target),fu=f||g,{connection:yu,isValid:Ju}=QA.isValid(D.nativeEvent,{handle:{nodeId:W,id:N,type:u},connectionMode:C,fromNodeId:O.nodeId,fromHandleId:O.id||null,fromType:O.type,isValidConnection:fu,flowId:iu,doc:x,lib:a,nodeLookup:Au});if(Ju&&yu)t(yu);let Vu=structuredClone(R);delete Vu.inProgress,Vu.toPosition=Vu.toHandle?Vu.toHandle.position:null,I?.(D,Vu),w.setState({connectionClickStartHandle:null})};return _u.jsx("div",{"data-handleid":N,"data-nodeid":W,"data-handlepos":l,"data-id":`${z}-${W}-${N}-${u}`,className:Il(["react-flow__handle",`react-flow__handle-${l}`,"nodrag",q,j,{source:!L,target:L,connectable:n,connectablestart:i,connectableend:y,clickconnecting:c,connectingfrom:Z,connectingto:T,valid:Y,connectionindicator:n&&(!S||X)&&(S||p?y:i)}]),onMouseDown:m,onTouchStart:m,onClick:K?V:void 0,ref:F,...U,children:r})}var zy=ju.memo(BG(nP));function iP({data:u,isConnectable:l,sourcePosition:f=Xu.Bottom}){return _u.jsxs(_u.Fragment,{children:[u?.label,_u.jsx(zy,{type:"source",position:f,isConnectable:l})]})}function yP({data:u,isConnectable:l,targetPosition:f=Xu.Top,sourcePosition:n=Xu.Bottom}){return _u.jsxs(_u.Fragment,{children:[_u.jsx(zy,{type:"target",position:f,isConnectable:l}),u?.label,_u.jsx(zy,{type:"source",position:n,isConnectable:l})]})}function _P(){return null}function $P({data:u,isConnectable:l,targetPosition:f=Xu.Top}){return _u.jsxs(_u.Fragment,{children:[_u.jsx(zy,{type:"target",position:f,isConnectable:l}),u?.label]})}var qA={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}},UG={input:iP,default:yP,output:$P,group:_P};function rP(u){if(u.internals.handleBounds===void 0)return{width:u.width??u.initialWidth??u.style?.width,height:u.height??u.initialHeight??u.style?.height};return{width:u.width??u.style?.width,height:u.height??u.style?.height}}var AP=(u)=>{let{width:l,height:f,x:n,y:i}=k_(u.nodeLookup,{filter:(y)=>!!y.selected});return{width:x0(l)?l:null,height:x0(f)?f:null,userSelectionActive:u.userSelectionActive,transformString:`translate(${u.transform[0]}px,${u.transform[1]}px) scale(${u.transform[2]}) translate(${n}px,${i}px)`}};function jP({onSelectionContextMenu:u,noPanClassName:l,disableKeyboardA11y:f}){let n=Sl(),{width:i,height:y,transformString:_,userSelectionActive:$}=Ql(AP,Bl),r=YG(),j=ju.useRef(null);ju.useEffect(()=>{if(!f)j.current?.focus({preventScroll:!0})},[f]);let J=!$&&i!==null&&y!==null;if(XG({nodeRef:j,disabled:!J}),!J)return null;let Q=u?(F)=>{let N=n.getState().nodes.filter((L)=>L.selected);u(F,N)}:void 0,U=(F)=>{if(Object.prototype.hasOwnProperty.call(qA,F.key))F.preventDefault(),r({direction:qA[F.key],factor:F.shiftKey?4:1})};return _u.jsx("div",{className:Il(["react-flow__nodesselection","react-flow__container",l]),style:{transform:_},children:_u.jsx("div",{ref:j,className:"react-flow__nodesselection-rect",onContextMenu:Q,tabIndex:f?void 0:-1,onKeyDown:f?void 0:U,style:{width:i,height:y}})})}var NG=typeof window<"u"?window:void 0,JP=(u)=>{return{nodesSelectionActive:u.nodesSelectionActive,userSelectionActive:u.userSelectionActive}};function DG({children:u,onPaneClick:l,onPaneMouseEnter:f,onPaneMouseMove:n,onPaneMouseLeave:i,onPaneContextMenu:y,onPaneScroll:_,paneClickDistance:$,deleteKeyCode:r,selectionKeyCode:j,selectionOnDrag:J,selectionMode:Q,onSelectionStart:U,onSelectionEnd:F,multiSelectionKeyCode:N,panActivationKeyCode:L,zoomActivationKeyCode:w,elementsSelectable:W,zoomOnScroll:K,zoomOnPinch:q,panOnScroll:z,panOnScrollSpeed:Z,panOnScrollMode:T,zoomOnDoubleClick:c,panOnDrag:X,defaultViewport:S,translateExtent:p,minZoom:Y,maxZoom:t,preventScrolling:m,onSelectionContextMenu:V,noWheelClassName:D,noPanClassName:M,disableKeyboardA11y:I,onViewportChange:O,isControlledViewport:C}){let{nodesSelectionActive:g,userSelectionActive:a}=Ql(JP,Bl),iu=Zr(j,{target:NG}),Au=Zr(L,{target:NG}),R=Au||X,x=Au||z,fu=J&&R!==!0,yu=iu||a||fu;return hS({deleteKeyCode:r,multiSelectionKeyCode:N}),_u.jsx(gS,{onPaneContextMenu:y,elementsSelectable:W,zoomOnScroll:K,zoomOnPinch:q,panOnScroll:x,panOnScrollSpeed:Z,panOnScrollMode:T,zoomOnDoubleClick:c,panOnDrag:!iu&&R,defaultViewport:S,translateExtent:p,minZoom:Y,maxZoom:t,zoomActivationKeyCode:w,preventScrolling:m,noWheelClassName:D,noPanClassName:M,onViewportChange:O,isControlledViewport:C,paneClickDistance:$,selectionOnDrag:fu,children:_u.jsxs(dS,{onSelectionStart:U,onSelectionEnd:F,onPaneClick:l,onPaneMouseEnter:f,onPaneMouseMove:n,onPaneMouseLeave:i,onPaneContextMenu:y,onPaneScroll:_,panOnDrag:R,isSelecting:!!yu,selectionMode:Q,selectionKeyPressed:iu,paneClickDistance:$,selectionOnDrag:fu,children:[u,g&&_u.jsx(jP,{onSelectionContextMenu:V,noPanClassName:M,disableKeyboardA11y:I})]})})}DG.displayName="FlowRenderer";var QP=ju.memo(DG),UP=(u)=>(l)=>{return u?fA(l.nodeLookup,{x:0,y:0,width:l.width,height:l.height},l.transform,!0).map((f)=>f.id):Array.from(l.nodeLookup.keys())};function NP(u){return Ql(ju.useCallback(UP(u),[u]),Bl)}var FP=(u)=>u.updateNodeInternals;function WP(){let u=Ql(FP),[l]=ju.useState(()=>{if(typeof ResizeObserver>"u")return null;return new ResizeObserver((f)=>{let n=new Map;f.forEach((i)=>{let y=i.target.getAttribute("data-id");n.set(y,{id:y,nodeElement:i.target,force:!0})}),u(n)})});return ju.useEffect(()=>{return()=>{l?.disconnect()}},[l]),l}function qP({node:u,nodeType:l,hasDimensions:f,resizeObserver:n}){let i=Sl(),y=ju.useRef(null),_=ju.useRef(null),$=ju.useRef(u.sourcePosition),r=ju.useRef(u.targetPosition),j=ju.useRef(l),J=f&&!!u.internals.handleBounds;return ju.useEffect(()=>{if(y.current&&!u.hidden&&(!J||_.current!==y.current)){if(_.current)n?.unobserve(_.current);n?.observe(y.current),_.current=y.current}},[J,u.hidden]),ju.useEffect(()=>{return()=>{if(_.current)n?.unobserve(_.current),_.current=null}},[]),ju.useEffect(()=>{if(y.current){let Q=j.current!==l,U=$.current!==u.sourcePosition,F=r.current!==u.targetPosition;if(Q||U||F)j.current=l,$.current=u.sourcePosition,r.current=u.targetPosition,i.getState().updateNodeInternals(new Map([[u.id,{id:u.id,nodeElement:y.current,force:!0}]]))}},[u.id,l,u.sourcePosition,u.targetPosition]),y}function LP({id:u,onClick:l,onMouseEnter:f,onMouseMove:n,onMouseLeave:i,onContextMenu:y,onDoubleClick:_,nodesDraggable:$,elementsSelectable:r,nodesConnectable:j,nodesFocusable:J,resizeObserver:Q,noDragClassName:U,noPanClassName:F,disableKeyboardA11y:N,rfId:L,nodeTypes:w,nodeClickDistance:W,onError:K}){let{node:q,internals:z,isParent:Z}=Ql((Ju)=>{let Vu=Ju.nodeLookup.get(u),Lu=Ju.parentLookup.has(u);return{node:Vu,internals:Vu.internals,isParent:Lu}},Bl),T=q.type||"default",c=w?.[T]||UG[T];if(c===void 0)K?.("003",Z0.error003(T)),T="default",c=w?.default||UG.default;let X=!!(q.draggable||$&&typeof q.draggable>"u"),S=!!(q.selectable||r&&typeof q.selectable>"u"),p=!!(q.connectable||j&&typeof q.connectable>"u"),Y=!!(q.focusable||J&&typeof q.focusable>"u"),t=Sl(),m=tJ(q),V=qP({node:q,nodeType:T,hasDimensions:m,resizeObserver:Q}),D=XG({nodeRef:V,disabled:q.hidden||!X,noDragClassName:U,handleSelector:q.dragHandle,nodeId:u,isSelectable:S,nodeClickDistance:W}),M=YG();if(q.hidden)return null;let I=Sn(q),O=rP(q),C=S||X||l||f||n||i,g=f?(Ju)=>f(Ju,{...z.userNode}):void 0,a=n?(Ju)=>n(Ju,{...z.userNode}):void 0,iu=i?(Ju)=>i(Ju,{...z.userNode}):void 0,Au=y?(Ju)=>y(Ju,{...z.userNode}):void 0,R=_?(Ju)=>_(Ju,{...z.userNode}):void 0,x=(Ju)=>{let{selectNodesOnDrag:Vu,nodeDragThreshold:Lu}=t.getState();if(S&&(!Vu||!X||Lu>0))oJ({id:u,store:t,nodeRef:V});if(l)l(Ju,{...z.userNode})},fu=(Ju)=>{if(MJ(Ju.nativeEvent)||N)return;if(wJ.includes(Ju.key)&&S){let Vu=Ju.key==="Escape";oJ({id:u,store:t,unselect:Vu,nodeRef:V})}else if(X&&q.selected&&Object.prototype.hasOwnProperty.call(qA,Ju.key)){Ju.preventDefault();let{ariaLabelConfig:Vu}=t.getState();t.setState({ariaLiveMessage:Vu["node.a11yDescription.ariaLiveMessage"]({direction:Ju.key.replace("Arrow","").toLowerCase(),x:~~z.positionAbsolute.x,y:~~z.positionAbsolute.y})}),M({direction:qA[Ju.key],factor:Ju.shiftKey?4:1})}},yu=()=>{if(N||!V.current?.matches(":focus-visible"))return;let{transform:Ju,width:Vu,height:Lu,autoPanOnNodeFocus:Bu,setCenter:b}=t.getState();if(!Bu)return;if(!(fA(new Map([[u,q]]),{x:0,y:0,width:Vu,height:Lu},Ju,!0).length>0))b(q.position.x+I.width/2,q.position.y+I.height/2,{zoom:Ju[2]})};return _u.jsx("div",{className:Il(["react-flow__node",`react-flow__node-${T}`,{[F]:X},q.className,{selected:q.selected,selectable:S,parent:Z,draggable:X,dragging:D}]),ref:V,style:{zIndex:z.z,transform:`translate(${z.positionAbsolute.x}px,${z.positionAbsolute.y}px)`,pointerEvents:C?"all":"none",visibility:m?"visible":"hidden",...q.style,...O},"data-id":u,"data-testid":`rf__node-${u}`,onMouseEnter:g,onMouseMove:a,onMouseLeave:iu,onContextMenu:Au,onClick:x,onDoubleClick:R,onKeyDown:Y?fu:void 0,tabIndex:Y?0:void 0,onFocus:Y?yu:void 0,role:q.ariaRole??(Y?"group":void 0),"aria-roledescription":"node","aria-describedby":N?void 0:`${HG}-${L}`,"aria-label":q.ariaLabel,...q.domAttributes,children:_u.jsx(uP,{value:u,children:_u.jsx(c,{id:u,data:q.data,type:T,positionAbsoluteX:z.positionAbsolute.x,positionAbsoluteY:z.positionAbsolute.y,selected:q.selected??!1,selectable:S,draggable:X,deletable:q.deletable??!0,isConnectable:p,sourcePosition:q.sourcePosition,targetPosition:q.targetPosition,dragging:D,dragHandle:q.dragHandle,zIndex:z.z,parentId:q.parentId,...I})})})}var KP=ju.memo(LP),zP=(u)=>({nodesDraggable:u.nodesDraggable,nodesConnectable:u.nodesConnectable,nodesFocusable:u.nodesFocusable,elementsSelectable:u.elementsSelectable,onError:u.onError});function SG(u){let{nodesDraggable:l,nodesConnectable:f,nodesFocusable:n,elementsSelectable:i,onError:y}=Ql(zP,Bl),_=NP(u.onlyRenderVisibleElements),$=WP();return _u.jsx("div",{className:"react-flow__nodes",style:zA,children:_.map((r)=>{return _u.jsx(KP,{id:r,nodeTypes:u.nodeTypes,nodeExtent:u.nodeExtent,onClick:u.onNodeClick,onMouseEnter:u.onNodeMouseEnter,onMouseMove:u.onNodeMouseMove,onMouseLeave:u.onNodeMouseLeave,onContextMenu:u.onNodeContextMenu,onDoubleClick:u.onNodeDoubleClick,noDragClassName:u.noDragClassName,noPanClassName:u.noPanClassName,rfId:u.rfId,disableKeyboardA11y:u.disableKeyboardA11y,resizeObserver:$,nodesDraggable:l,nodesConnectable:f,nodesFocusable:n,elementsSelectable:i,nodeClickDistance:u.nodeClickDistance,onError:y},r)})})}SG.displayName="NodeRenderer";var GP=ju.memo(SG);function wP(u){return Ql(ju.useCallback((f)=>{if(!u)return f.edges.map((i)=>i.id);let n=[];if(f.width&&f.height)for(let i of f.edges){let y=f.nodeLookup.get(i.source),_=f.nodeLookup.get(i.target);if(y&&_&&Gz({sourceNode:y,targetNode:_,width:f.width,height:f.height,transform:f.transform}))n.push(i.id)}return n},[u]),Bl)}var ZP=({color:u="none",strokeWidth:l=1})=>{let f={strokeWidth:l,...u&&{stroke:u}};return _u.jsx("polyline",{className:"arrow",style:f,strokeLinecap:"round",fill:"none",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4"})},EP=({color:u="none",strokeWidth:l=1})=>{let f={strokeWidth:l,...u&&{stroke:u,fill:u}};return _u.jsx("polyline",{className:"arrowclosed",style:f,strokeLinecap:"round",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4 -5,-4"})},FG={[Ui.Arrow]:ZP,[Ui.ArrowClosed]:EP};function HP(u){let l=Sl();return ju.useMemo(()=>{if(!Object.prototype.hasOwnProperty.call(FG,u))return l.getState().onError?.("009",Z0.error009(u)),null;return FG[u]},[u])}var OP=({id:u,type:l,color:f,width:n=12.5,height:i=12.5,markerUnits:y="strokeWidth",strokeWidth:_,orient:$="auto-start-reverse"})=>{let r=HP(l);if(!r)return null;return _u.jsx("marker",{className:"react-flow__arrowhead",id:u,markerWidth:`${n}`,markerHeight:`${i}`,viewBox:"-10 -10 20 20",markerUnits:y,orient:$,refX:"0",refY:"0",children:_u.jsx(r,{color:f,strokeWidth:_})})},PG=({defaultColor:u,rfId:l})=>{let f=Ql((y)=>y.edges),n=Ql((y)=>y.defaultEdgeOptions),i=ju.useMemo(()=>{return Zz(f,{id:l,defaultColor:u,defaultMarkerStart:n?.markerStart,defaultMarkerEnd:n?.markerEnd})},[f,n,l,u]);if(!i.length)return null;return _u.jsx("svg",{className:"react-flow__marker","aria-hidden":"true",children:_u.jsx("defs",{children:i.map((y)=>_u.jsx(OP,{id:y.id,type:y.type,color:y.color,width:y.width,height:y.height,markerUnits:y.markerUnits,strokeWidth:y.strokeWidth,orient:y.orient},y.id))})})};PG.displayName="MarkerDefinitions";var TP=ju.memo(PG);function MG({x:u,y:l,label:f,labelStyle:n,labelShowBg:i=!0,labelBgStyle:y,labelBgPadding:_=[2,4],labelBgBorderRadius:$=2,children:r,className:j,...J}){let[Q,U]=ju.useState({x:1,y:0,width:0,height:0}),F=Il(["react-flow__edge-textwrapper",j]),N=ju.useRef(null);if(ju.useEffect(()=>{if(N.current){let L=N.current.getBBox();U({x:L.x,y:L.y,width:L.width,height:L.height})}},[f]),!f)return null;return _u.jsxs("g",{transform:`translate(${u-Q.width/2} ${l-Q.height/2})`,className:F,visibility:Q.width?"visible":"hidden",...J,children:[i&&_u.jsx("rect",{width:Q.width+2*_[0],x:-_[0],y:-_[1],height:Q.height+2*_[1],className:"react-flow__edge-textbg",style:y,rx:$,ry:$}),_u.jsx("text",{className:"react-flow__edge-text",y:Q.height/2,dy:"0.3em",ref:N,style:n,children:f}),r]})}MG.displayName="EdgeText";var VP=ju.memo(MG);function o_({path:u,labelX:l,labelY:f,label:n,labelStyle:i,labelShowBg:y,labelBgStyle:_,labelBgPadding:$,labelBgBorderRadius:r,interactionWidth:j=20,...J}){return _u.jsxs(_u.Fragment,{children:[_u.jsx("path",{...J,d:u,fill:"none",className:Il(["react-flow__edge-path",J.className])}),j?_u.jsx("path",{d:u,fill:"none",strokeOpacity:0,strokeWidth:j,className:"react-flow__edge-interaction"}):null,n&&x0(l)&&x0(f)?_u.jsx(VP,{x:l,y:f,label:n,labelStyle:i,labelShowBg:y,labelBgStyle:_,labelBgPadding:$,labelBgBorderRadius:r}):null]})}function WG({pos:u,x1:l,y1:f,x2:n,y2:i}){if(u===Xu.Left||u===Xu.Right)return[0.5*(l+n),f];return[l,0.5*(f+i)]}function CG({sourceX:u,sourceY:l,sourcePosition:f=Xu.Bottom,targetX:n,targetY:i,targetPosition:y=Xu.Top}){let[_,$]=WG({pos:f,x1:u,y1:l,x2:n,y2:i}),[r,j]=WG({pos:y,x1:n,y1:i,x2:u,y2:l}),[J,Q,U,F]=_A({sourceX:u,sourceY:l,targetX:n,targetY:i,sourceControlX:_,sourceControlY:$,targetControlX:r,targetControlY:j});return[`M${u},${l} C${_},${$} ${r},${j} ${n},${i}`,J,Q,U,F]}function pG(u){return ju.memo(({id:l,sourceX:f,sourceY:n,targetX:i,targetY:y,sourcePosition:_,targetPosition:$,label:r,labelStyle:j,labelShowBg:J,labelBgStyle:Q,labelBgPadding:U,labelBgBorderRadius:F,style:N,markerEnd:L,markerStart:w,interactionWidth:W})=>{let[K,q,z]=CG({sourceX:f,sourceY:n,sourcePosition:_,targetX:i,targetY:y,targetPosition:$}),Z=u.isInternal?void 0:l;return _u.jsx(o_,{id:Z,path:K,labelX:q,labelY:z,label:r,labelStyle:j,labelShowBg:J,labelBgStyle:Q,labelBgPadding:U,labelBgBorderRadius:F,style:N,markerEnd:L,markerStart:w,interactionWidth:W})})}var BP=pG({isInternal:!1}),mG=pG({isInternal:!0});BP.displayName="SimpleBezierEdge";mG.displayName="SimpleBezierEdgeInternal";function xG(u){return ju.memo(({id:l,sourceX:f,sourceY:n,targetX:i,targetY:y,label:_,labelStyle:$,labelShowBg:r,labelBgStyle:j,labelBgPadding:J,labelBgBorderRadius:Q,style:U,sourcePosition:F=Xu.Bottom,targetPosition:N=Xu.Top,markerEnd:L,markerStart:w,pathOptions:W,interactionWidth:K})=>{let[q,z,Z]=wr({sourceX:f,sourceY:n,sourcePosition:F,targetX:i,targetY:y,targetPosition:N,borderRadius:W?.borderRadius,offset:W?.offset,stepPosition:W?.stepPosition}),T=u.isInternal?void 0:l;return _u.jsx(o_,{id:T,path:q,labelX:z,labelY:Z,label:_,labelStyle:$,labelShowBg:r,labelBgStyle:j,labelBgPadding:J,labelBgBorderRadius:Q,style:U,markerEnd:L,markerStart:w,interactionWidth:K})})}var RG=xG({isInternal:!1}),bG=xG({isInternal:!0});RG.displayName="SmoothStepEdge";bG.displayName="SmoothStepEdgeInternal";function kG(u){return ju.memo(({id:l,...f})=>{let n=u.isInternal?void 0:l;return _u.jsx(RG,{...f,id:n,pathOptions:ju.useMemo(()=>({borderRadius:0,offset:f.pathOptions?.offset}),[f.pathOptions?.offset])})})}var cP=kG({isInternal:!1}),hG=kG({isInternal:!0});cP.displayName="StepEdge";hG.displayName="StepEdgeInternal";function IG(u){return ju.memo(({id:l,sourceX:f,sourceY:n,targetX:i,targetY:y,label:_,labelStyle:$,labelShowBg:r,labelBgStyle:j,labelBgPadding:J,labelBgBorderRadius:Q,style:U,markerEnd:F,markerStart:N,interactionWidth:L})=>{let[w,W,K]=rA({sourceX:f,sourceY:n,targetX:i,targetY:y}),q=u.isInternal?void 0:l;return _u.jsx(o_,{id:q,path:w,labelX:W,labelY:K,label:_,labelStyle:$,labelShowBg:r,labelBgStyle:j,labelBgPadding:J,labelBgBorderRadius:Q,style:U,markerEnd:F,markerStart:N,interactionWidth:L})})}var XP=IG({isInternal:!1}),vG=IG({isInternal:!0});XP.displayName="StraightEdge";vG.displayName="StraightEdgeInternal";function gG(u){return ju.memo(({id:l,sourceX:f,sourceY:n,targetX:i,targetY:y,sourcePosition:_=Xu.Bottom,targetPosition:$=Xu.Top,label:r,labelStyle:j,labelShowBg:J,labelBgStyle:Q,labelBgPadding:U,labelBgBorderRadius:F,style:N,markerEnd:L,markerStart:w,pathOptions:W,interactionWidth:K})=>{let[q,z,Z]=$A({sourceX:f,sourceY:n,sourcePosition:_,targetX:i,targetY:y,targetPosition:$,curvature:W?.curvature}),T=u.isInternal?void 0:l;return _u.jsx(o_,{id:T,path:q,labelX:z,labelY:Z,label:r,labelStyle:j,labelShowBg:J,labelBgStyle:Q,labelBgPadding:U,labelBgBorderRadius:F,style:N,markerEnd:L,markerStart:w,interactionWidth:K})})}var YP=gG({isInternal:!1}),sG=gG({isInternal:!0});YP.displayName="BezierEdge";sG.displayName="BezierEdgeInternal";var qG={default:sG,straight:vG,step:hG,smoothstep:bG,simplebezier:mG},LG={sourceX:null,sourceY:null,targetX:null,targetY:null,sourcePosition:null,targetPosition:null},tP=(u,l,f)=>{if(f===Xu.Left)return u-l;if(f===Xu.Right)return u+l;return u},DP=(u,l,f)=>{if(f===Xu.Top)return u-l;if(f===Xu.Bottom)return u+l;return u},KG="react-flow__edgeupdater";function zG({position:u,centerX:l,centerY:f,radius:n=10,onMouseDown:i,onMouseEnter:y,onMouseOut:_,type:$}){return _u.jsx("circle",{onMouseDown:i,onMouseEnter:y,onMouseOut:_,className:Il([KG,`${KG}-${$}`]),cx:tP(l,n,u),cy:DP(f,n,u),r:n,stroke:"transparent",fill:"transparent"})}function SP({isReconnectable:u,reconnectRadius:l,edge:f,sourceX:n,sourceY:i,targetX:y,targetY:_,sourcePosition:$,targetPosition:r,onReconnect:j,onReconnectStart:J,onReconnectEnd:Q,setReconnecting:U,setUpdateHover:F}){let N=Sl(),L=(z,Z)=>{if(z.button!==0)return;let{autoPanOnConnect:T,domNode:c,connectionMode:X,connectionRadius:S,lib:p,onConnectStart:Y,cancelConnection:t,nodeLookup:m,rfId:V,panBy:D,updateConnection:M}=N.getState(),I=Z.type==="target",O=(a,iu)=>{U(!1),Q?.(a,f,Z.type,iu)},C=(a)=>j?.(f,a),g=(a,iu)=>{U(!0),J?.(z,f,Z.type),Y?.(a,iu)};QA.onPointerDown(z.nativeEvent,{autoPanOnConnect:T,connectionMode:X,connectionRadius:S,domNode:c,handleId:Z.id,nodeId:Z.nodeId,nodeLookup:m,isTarget:I,edgeUpdaterType:Z.type,lib:p,flowId:V,cancelConnection:t,panBy:D,isValidConnection:(...a)=>N.getState().isValidConnection?.(...a)??!0,onConnect:C,onConnectStart:g,onConnectEnd:(...a)=>N.getState().onConnectEnd?.(...a),onReconnectEnd:O,updateConnection:M,getTransform:()=>N.getState().transform,getFromHandle:()=>N.getState().connection.fromHandle,dragThreshold:N.getState().connectionDragThreshold,handleDomNode:z.currentTarget})},w=(z)=>L(z,{nodeId:f.target,id:f.targetHandle??null,type:"target"}),W=(z)=>L(z,{nodeId:f.source,id:f.sourceHandle??null,type:"source"}),K=()=>F(!0),q=()=>F(!1);return _u.jsxs(_u.Fragment,{children:[(u===!0||u==="source")&&_u.jsx(zG,{position:$,centerX:n,centerY:i,radius:l,onMouseDown:w,onMouseEnter:K,onMouseOut:q,type:"source"}),(u===!0||u==="target")&&_u.jsx(zG,{position:r,centerX:y,centerY:_,radius:l,onMouseDown:W,onMouseEnter:K,onMouseOut:q,type:"target"})]})}function PP({id:u,edgesFocusable:l,edgesReconnectable:f,elementsSelectable:n,onClick:i,onDoubleClick:y,onContextMenu:_,onMouseEnter:$,onMouseMove:r,onMouseLeave:j,reconnectRadius:J,onReconnect:Q,onReconnectStart:U,onReconnectEnd:F,rfId:N,edgeTypes:L,noPanClassName:w,onError:W,disableKeyboardA11y:K}){let q=Ql((b)=>b.edgeLookup.get(u)),z=Ql((b)=>b.defaultEdgeOptions);q=z?{...z,...q}:q;let Z=q.type||"default",T=L?.[Z]||qG[Z];if(T===void 0)W?.("011",Z0.error011(Z)),Z="default",T=L?.default||qG.default;let c=!!(q.focusable||l&&typeof q.focusable>"u"),X=typeof Q<"u"&&(q.reconnectable||f&&typeof q.reconnectable>"u"),S=!!(q.selectable||n&&typeof q.selectable>"u"),p=ju.useRef(null),[Y,t]=ju.useState(!1),[m,V]=ju.useState(!1),D=Sl(),{zIndex:M,sourceX:I,sourceY:O,targetX:C,targetY:g,sourcePosition:a,targetPosition:iu}=Ql(ju.useCallback((b)=>{let o=b.nodeLookup.get(q.source),nu=b.nodeLookup.get(q.target);if(!o||!nu)return{zIndex:q.zIndex,...LG};let wu=wz({id:u,sourceNode:o,targetNode:nu,sourceHandle:q.sourceHandle||null,targetHandle:q.targetHandle||null,connectionMode:b.connectionMode,onError:W});return{zIndex:zz({selected:q.selected,zIndex:q.zIndex,sourceNode:o,targetNode:nu,elevateOnSelect:b.elevateEdgesOnSelect,zIndexMode:b.zIndexMode}),...wu||LG}},[q.source,q.target,q.sourceHandle,q.targetHandle,q.selected,q.zIndex]),Bl),Au=ju.useMemo(()=>q.markerStart?`url('#${AA(q.markerStart,N)}')`:void 0,[q.markerStart,N]),R=ju.useMemo(()=>q.markerEnd?`url('#${AA(q.markerEnd,N)}')`:void 0,[q.markerEnd,N]);if(q.hidden||I===null||O===null||C===null||g===null)return null;let x=(b)=>{let{addSelectedEdges:o,unselectNodesAndEdges:nu,multiSelectionActive:wu}=D.getState();if(S)if(D.setState({nodesSelectionActive:!1}),q.selected&&wu)nu({nodes:[],edges:[q]}),p.current?.blur();else o([u]);if(i)i(b,q)},fu=y?(b)=>{y(b,{...q})}:void 0,yu=_?(b)=>{_(b,{...q})}:void 0,Ju=$?(b)=>{$(b,{...q})}:void 0,Vu=r?(b)=>{r(b,{...q})}:void 0,Lu=j?(b)=>{j(b,{...q})}:void 0,Bu=(b)=>{if(!K&&wJ.includes(b.key)&&S){let{unselectNodesAndEdges:o,addSelectedEdges:nu}=D.getState();if(b.key==="Escape")p.current?.blur(),o({edges:[q]});else nu([u])}};return _u.jsx("svg",{style:{zIndex:M},children:_u.jsxs("g",{className:Il(["react-flow__edge",`react-flow__edge-${Z}`,q.className,w,{selected:q.selected,animated:q.animated,inactive:!S&&!i,updating:Y,selectable:S}]),onClick:x,onDoubleClick:fu,onContextMenu:yu,onMouseEnter:Ju,onMouseMove:Vu,onMouseLeave:Lu,onKeyDown:c?Bu:void 0,tabIndex:c?0:void 0,role:q.ariaRole??(c?"group":"img"),"aria-roledescription":"edge","data-id":u,"data-testid":`rf__edge-${u}`,"aria-label":q.ariaLabel===null?void 0:q.ariaLabel||`Edge from ${q.source} to ${q.target}`,"aria-describedby":c?`${OG}-${N}`:void 0,ref:p,...q.domAttributes,children:[!m&&_u.jsx(T,{id:u,source:q.source,target:q.target,type:q.type,selected:q.selected,animated:q.animated,selectable:S,deletable:q.deletable??!0,label:q.label,labelStyle:q.labelStyle,labelShowBg:q.labelShowBg,labelBgStyle:q.labelBgStyle,labelBgPadding:q.labelBgPadding,labelBgBorderRadius:q.labelBgBorderRadius,sourceX:I,sourceY:O,targetX:C,targetY:g,sourcePosition:a,targetPosition:iu,data:q.data,style:q.style,sourceHandleId:q.sourceHandle,targetHandleId:q.targetHandle,markerStart:Au,markerEnd:R,pathOptions:"pathOptions"in q?q.pathOptions:void 0,interactionWidth:q.interactionWidth}),X&&_u.jsx(SP,{edge:q,isReconnectable:X,reconnectRadius:J,onReconnect:Q,onReconnectStart:U,onReconnectEnd:F,sourceX:I,sourceY:O,targetX:C,targetY:g,sourcePosition:a,targetPosition:iu,setUpdateHover:t,setReconnecting:V})]})})}var MP=ju.memo(PP),CP=(u)=>({edgesFocusable:u.edgesFocusable,edgesReconnectable:u.edgesReconnectable,elementsSelectable:u.elementsSelectable,connectionMode:u.connectionMode,onError:u.onError});function aG({defaultMarkerColor:u,onlyRenderVisibleElements:l,rfId:f,edgeTypes:n,noPanClassName:i,onReconnect:y,onEdgeContextMenu:_,onEdgeMouseEnter:$,onEdgeMouseMove:r,onEdgeMouseLeave:j,onEdgeClick:J,reconnectRadius:Q,onEdgeDoubleClick:U,onReconnectStart:F,onReconnectEnd:N,disableKeyboardA11y:L}){let{edgesFocusable:w,edgesReconnectable:W,elementsSelectable:K,onError:q}=Ql(CP,Bl),z=wP(l);return _u.jsxs("div",{className:"react-flow__edges",children:[_u.jsx(TP,{defaultColor:u,rfId:f}),z.map((Z)=>{return _u.jsx(MP,{id:Z,edgesFocusable:w,edgesReconnectable:W,elementsSelectable:K,noPanClassName:i,onReconnect:y,onContextMenu:_,onMouseEnter:$,onMouseMove:r,onMouseLeave:j,onClick:J,reconnectRadius:Q,onDoubleClick:U,onReconnectStart:F,onReconnectEnd:N,rfId:f,onError:q,edgeTypes:n,disableKeyboardA11y:L},Z)})]})}aG.displayName="EdgeRenderer";var pP=ju.memo(aG),mP=(u)=>`translate(${u.transform[0]}px,${u.transform[1]}px) scale(${u.transform[2]})`;function xP({children:u}){let l=Ql(mP);return _u.jsx("div",{className:"react-flow__viewport xyflow__viewport react-flow__container",style:{transform:l},children:u})}function RP(u){let l=dJ(),f=ju.useRef(!1);ju.useEffect(()=>{if(!f.current&&l.viewportInitialized&&u)setTimeout(()=>u(l),1),f.current=!0},[u,l.viewportInitialized])}var bP=(u)=>u.panZoom?.syncViewport;function kP(u){let l=Ql(bP),f=Sl();return ju.useEffect(()=>{if(u)l?.(u),f.setState({transform:[u.x,u.y,u.zoom]})},[u,l]),null}function GG(u){return u.connection.inProgress?{...u.connection,to:v_(u.connection.to,u.transform)}:{...u.connection}}function hP(u){if(u)return(f)=>{let n=GG(f);return u(n)};return GG}function IP(u){let l=hP(u);return Ql(l,Bl)}var vP=(u)=>({nodesConnectable:u.nodesConnectable,isValid:u.connection.isValid,inProgress:u.connection.inProgress,width:u.width,height:u.height});function gP({containerStyle:u,style:l,type:f,component:n}){let{nodesConnectable:i,width:y,height:_,isValid:$,inProgress:r}=Ql(vP,Bl);if(!(y&&i&&r))return null;return _u.jsx("svg",{style:u,width:y,height:_,className:"react-flow__connectionline react-flow__container",children:_u.jsx("g",{className:Il(["react-flow__connection",HJ($)]),children:_u.jsx(oG,{style:l,type:f,CustomComponent:n,isValid:$})})})}var oG=({style:u,type:l=Dn.Bezier,CustomComponent:f,isValid:n})=>{let{inProgress:i,from:y,fromNode:_,fromHandle:$,fromPosition:r,to:j,toNode:J,toHandle:Q,toPosition:U,pointer:F}=IP();if(!i)return;if(f)return _u.jsx(f,{connectionLineType:l,connectionLineStyle:u,fromNode:_,fromHandle:$,fromX:y.x,fromY:y.y,toX:j.x,toY:j.y,fromPosition:r,toPosition:U,connectionStatus:HJ(n),toNode:J,toHandle:Q,pointer:F});let N="",L={sourceX:y.x,sourceY:y.y,sourcePosition:r,targetX:j.x,targetY:j.y,targetPosition:U};switch(l){case Dn.Bezier:[N]=$A(L);break;case Dn.SimpleBezier:[N]=CG(L);break;case Dn.Step:[N]=wr({...L,borderRadius:0});break;case Dn.SmoothStep:[N]=wr(L);break;default:[N]=rA(L)}return _u.jsx("path",{d:N,fill:"none",className:"react-flow__connection-path",style:u})};oG.displayName="ConnectionLine";var sP={};function wG(u=sP){let l=ju.useRef(u),f=Sl();ju.useEffect(()=>{},[u])}function aP(){let u=Sl(),l=ju.useRef(!1);ju.useEffect(()=>{},[])}function dG({nodeTypes:u,edgeTypes:l,onInit:f,onNodeClick:n,onEdgeClick:i,onNodeDoubleClick:y,onEdgeDoubleClick:_,onNodeMouseEnter:$,onNodeMouseMove:r,onNodeMouseLeave:j,onNodeContextMenu:J,onSelectionContextMenu:Q,onSelectionStart:U,onSelectionEnd:F,connectionLineType:N,connectionLineStyle:L,connectionLineComponent:w,connectionLineContainerStyle:W,selectionKeyCode:K,selectionOnDrag:q,selectionMode:z,multiSelectionKeyCode:Z,panActivationKeyCode:T,zoomActivationKeyCode:c,deleteKeyCode:X,onlyRenderVisibleElements:S,elementsSelectable:p,defaultViewport:Y,translateExtent:t,minZoom:m,maxZoom:V,preventScrolling:D,defaultMarkerColor:M,zoomOnScroll:I,zoomOnPinch:O,panOnScroll:C,panOnScrollSpeed:g,panOnScrollMode:a,zoomOnDoubleClick:iu,panOnDrag:Au,onPaneClick:R,onPaneMouseEnter:x,onPaneMouseMove:fu,onPaneMouseLeave:yu,onPaneScroll:Ju,onPaneContextMenu:Vu,paneClickDistance:Lu,nodeClickDistance:Bu,onEdgeContextMenu:b,onEdgeMouseEnter:o,onEdgeMouseMove:nu,onEdgeMouseLeave:wu,reconnectRadius:e,onReconnect:zu,onReconnectStart:v,onReconnectEnd:$u,noDragClassName:Wu,noWheelClassName:Du,noPanClassName:ku,disableKeyboardA11y:$l,nodeExtent:gu,rfId:Df,viewport:j0,onViewportChange:lf}){return wG(u),wG(l),aP(),RP(f),kP(j0),_u.jsx(QP,{onPaneClick:R,onPaneMouseEnter:x,onPaneMouseMove:fu,onPaneMouseLeave:yu,onPaneContextMenu:Vu,onPaneScroll:Ju,paneClickDistance:Lu,deleteKeyCode:X,selectionKeyCode:K,selectionOnDrag:q,selectionMode:z,onSelectionStart:U,onSelectionEnd:F,multiSelectionKeyCode:Z,panActivationKeyCode:T,zoomActivationKeyCode:c,elementsSelectable:p,zoomOnScroll:I,zoomOnPinch:O,zoomOnDoubleClick:iu,panOnScroll:C,panOnScrollSpeed:g,panOnScrollMode:a,panOnDrag:Au,defaultViewport:Y,translateExtent:t,minZoom:m,maxZoom:V,onSelectionContextMenu:Q,preventScrolling:D,noDragClassName:Wu,noWheelClassName:Du,noPanClassName:ku,disableKeyboardA11y:$l,onViewportChange:lf,isControlledViewport:!!j0,children:_u.jsxs(xP,{children:[_u.jsx(pP,{edgeTypes:l,onEdgeClick:i,onEdgeDoubleClick:_,onReconnect:zu,onReconnectStart:v,onReconnectEnd:$u,onlyRenderVisibleElements:S,onEdgeContextMenu:b,onEdgeMouseEnter:o,onEdgeMouseMove:nu,onEdgeMouseLeave:wu,reconnectRadius:e,defaultMarkerColor:M,noPanClassName:ku,disableKeyboardA11y:$l,rfId:Df}),_u.jsx(gP,{style:L,type:N,component:w,containerStyle:W}),_u.jsx("div",{className:"react-flow__edgelabel-renderer"}),_u.jsx(GP,{nodeTypes:u,onNodeClick:n,onNodeDoubleClick:y,onNodeMouseEnter:$,onNodeMouseMove:r,onNodeMouseLeave:j,onNodeContextMenu:J,nodeClickDistance:Bu,onlyRenderVisibleElements:S,noPanClassName:ku,noDragClassName:Wu,disableKeyboardA11y:$l,nodeExtent:gu,rfId:Df}),_u.jsx("div",{className:"react-flow__viewport-portal"})]})})}dG.displayName="GraphView";var oP=ju.memo(dG),ZG=({nodes:u,edges:l,defaultNodes:f,defaultEdges:n,width:i,height:y,fitView:_,fitViewOptions:$,minZoom:r=0.5,maxZoom:j=2,nodeOrigin:J,nodeExtent:Q,zIndexMode:U="basic"}={})=>{let F=new Map,N=new Map,L=new Map,w=new Map,W=n??l??[],K=f??u??[],q=J??[0,0],z=Q??b_;hJ(L,w,W);let{nodesInitialized:Z}=jA(K,F,N,{nodeOrigin:q,nodeExtent:z,zIndexMode:U}),T=[0,0,1];if(_&&i&&y){let c=k_(F,{filter:(Y)=>!!((Y.width||Y.initialWidth)&&(Y.height||Y.initialHeight))}),{x:X,y:S,zoom:p}=Gr(c,i,y,r,j,$?.padding??0.1);T=[X,S,p]}return{rfId:"1",width:i??0,height:y??0,transform:T,nodes:K,nodesInitialized:Z,nodeLookup:F,parentLookup:N,edges:W,edgeLookup:w,connectionLookup:L,onNodesChange:null,onEdgesChange:null,hasDefaultNodes:f!==void 0,hasDefaultEdges:n!==void 0,panZoom:null,minZoom:r,maxZoom:j,translateExtent:b_,nodeExtent:z,nodesSelectionActive:!1,userSelectionActive:!1,userSelectionRect:null,connectionMode:Qi.Strict,domNode:null,paneDragging:!1,noPanClassName:"nopan",nodeOrigin:q,nodeDragThreshold:1,connectionDragThreshold:1,snapGrid:[15,15],snapToGrid:!1,nodesDraggable:!0,nodesConnectable:!0,nodesFocusable:!0,edgesFocusable:!0,edgesReconnectable:!0,elementsSelectable:!0,elevateNodesOnSelect:!0,elevateEdgesOnSelect:!0,selectNodesOnDrag:!0,multiSelectionActive:!1,fitViewQueued:_??!1,fitViewOptions:$,fitViewResolver:null,connection:{...EJ},connectionClickStartHandle:null,connectOnClick:!0,ariaLiveMessage:"",autoPanOnConnect:!0,autoPanOnNodeDrag:!0,autoPanOnNodeFocus:!0,autoPanSpeed:15,connectionRadius:20,onError:YJ,isValidConnection:void 0,onSelectionChangeHandlers:[],lib:"react",debug:!1,ariaLabelConfig:ZJ,zIndexMode:U,onNodesChangeMiddlewareMap:new Map,onEdgesChangeMiddlewareMap:new Map}},dP=({nodes:u,edges:l,defaultNodes:f,defaultEdges:n,width:i,height:y,fitView:_,fitViewOptions:$,minZoom:r,maxZoom:j,nodeOrigin:J,nodeExtent:Q,zIndexMode:U})=>uG((F,N)=>{async function L(){let{nodeLookup:w,panZoom:W,fitViewOptions:K,fitViewResolver:q,width:z,height:Z,minZoom:T,maxZoom:c}=N();if(!W)return;await Nz({nodes:w,width:z,height:Z,panZoom:W,minZoom:T,maxZoom:c},K),q?.resolve(!0),F({fitViewResolver:null})}return{...ZG({nodes:u,edges:l,width:i,height:y,fitView:_,fitViewOptions:$,minZoom:r,maxZoom:j,nodeOrigin:J,nodeExtent:Q,defaultNodes:f,defaultEdges:n,zIndexMode:U}),setNodes:(w)=>{let{nodeLookup:W,parentLookup:K,nodeOrigin:q,elevateNodesOnSelect:z,fitViewQueued:Z,zIndexMode:T,nodesSelectionActive:c}=N(),{nodesInitialized:X,hasSelectedNodes:S}=jA(w,W,K,{nodeOrigin:q,nodeExtent:Q,elevateNodesOnSelect:z,checkEquality:!0,zIndexMode:T}),p=c&&S;if(Z&&X)L(),F({nodes:w,nodesInitialized:X,fitViewQueued:!1,fitViewOptions:void 0,nodesSelectionActive:p});else F({nodes:w,nodesInitialized:X,nodesSelectionActive:p})},setEdges:(w)=>{let{connectionLookup:W,edgeLookup:K}=N();hJ(W,K,w),F({edges:w})},setDefaultNodesAndEdges:(w,W)=>{if(w){let{setNodes:K}=N();K(w),F({hasDefaultNodes:!0})}if(W){let{setEdges:K}=N();K(W),F({hasDefaultEdges:!0})}},updateNodeInternals:(w)=>{let{triggerNodeChanges:W,nodeLookup:K,parentLookup:q,domNode:z,nodeOrigin:Z,nodeExtent:T,debug:c,fitViewQueued:X,zIndexMode:S}=N(),{changes:p,updatedInternals:Y}=Tz(w,K,q,z,Z,T,S);if(!Y)return;if(Hz(K,q,{nodeOrigin:Z,nodeExtent:T,zIndexMode:S}),X)L(),F({fitViewQueued:!1,fitViewOptions:void 0});else F({});if(p?.length>0){if(c)console.log("React Flow: trigger node changes",p);W?.(p)}},updateNodePositions:(w,W=!1)=>{let K=[],q=[],{nodeLookup:z,triggerNodeChanges:Z,connection:T,updateConnection:c,onNodesChangeMiddlewareMap:X}=N();for(let[S,p]of w){let Y=z.get(S),t=!!(Y?.expandParent&&Y?.parentId&&p?.position),m={id:S,type:"position",position:t?{x:Math.max(0,p.position.x),y:Math.max(0,p.position.y)}:p.position,dragging:W};if(Y&&T.inProgress&&T.fromNode.id===Y.id){let V=Ni(Y,T.fromHandle,Xu.Left,!0);c({...T,from:V})}if(t&&Y.parentId)K.push({id:S,parentId:Y.parentId,rect:{...p.internals.positionAbsolute,width:p.measured.width??0,height:p.measured.height??0}});q.push(m)}if(K.length>0){let{parentLookup:S,nodeOrigin:p}=N(),Y=JA(K,z,S,p);q.push(...Y)}for(let S of X.values())q=S(q);Z(q)},triggerNodeChanges:(w)=>{let{onNodesChange:W,setNodes:K,nodes:q,hasDefaultNodes:z,debug:Z}=N();if(w?.length){if(z){let T=MS(w,q);K(T)}if(Z)console.log("React Flow: trigger node changes",w);W?.(w)}},triggerEdgeChanges:(w)=>{let{onEdgesChange:W,setEdges:K,edges:q,hasDefaultEdges:z,debug:Z}=N();if(w?.length){if(z){let T=CS(w,q);K(T)}if(Z)console.log("React Flow: trigger edge changes",w);W?.(w)}},addSelectedNodes:(w)=>{let{multiSelectionActive:W,edgeLookup:K,nodeLookup:q,triggerNodeChanges:z,triggerEdgeChanges:Z}=N();if(W){let T=w.map((c)=>Ky(c,!0));z(T);return}z(a_(q,new Set([...w]),!0)),Z(a_(K))},addSelectedEdges:(w)=>{let{multiSelectionActive:W,edgeLookup:K,nodeLookup:q,triggerNodeChanges:z,triggerEdgeChanges:Z}=N();if(W){let T=w.map((c)=>Ky(c,!0));Z(T);return}Z(a_(K,new Set([...w]))),z(a_(q,new Set,!0))},unselectNodesAndEdges:({nodes:w,edges:W}={})=>{let{edges:K,nodes:q,nodeLookup:z,triggerNodeChanges:Z,triggerEdgeChanges:T}=N(),c=w?w:q,X=W?W:K,S=[];for(let Y of c){if(!Y.selected)continue;let t=z.get(Y.id);if(t)t.selected=!1;S.push(Ky(Y.id,!1))}let p=[];for(let Y of X){if(!Y.selected)continue;p.push(Ky(Y.id,!1))}Z(S),T(p)},setMinZoom:(w)=>{let{panZoom:W,maxZoom:K}=N();W?.setScaleExtent([w,K]),F({minZoom:w})},setMaxZoom:(w)=>{let{panZoom:W,minZoom:K}=N();W?.setScaleExtent([K,w]),F({maxZoom:w})},setTranslateExtent:(w)=>{N().panZoom?.setTranslateExtent(w),F({translateExtent:w})},resetSelectedElements:()=>{let{edges:w,nodes:W,triggerNodeChanges:K,triggerEdgeChanges:q,elementsSelectable:z}=N();if(!z)return;let Z=W.reduce((c,X)=>X.selected?[...c,Ky(X.id,!1)]:c,[]),T=w.reduce((c,X)=>X.selected?[...c,Ky(X.id,!1)]:c,[]);K(Z),q(T)},setNodeExtent:(w)=>{let{nodes:W,nodeLookup:K,parentLookup:q,nodeOrigin:z,elevateNodesOnSelect:Z,nodeExtent:T,zIndexMode:c}=N();if(w[0][0]===T[0][0]&&w[0][1]===T[0][1]&&w[1][0]===T[1][0]&&w[1][1]===T[1][1])return;jA(W,K,q,{nodeOrigin:z,nodeExtent:w,elevateNodesOnSelect:Z,checkEquality:!1,zIndexMode:c}),F({nodeExtent:w})},panBy:(w)=>{let{transform:W,width:K,height:q,panZoom:z,translateExtent:Z}=N();return Vz({delta:w,panZoom:z,transform:W,translateExtent:Z,width:K,height:q})},setCenter:async(w,W,K)=>{let{width:q,height:z,maxZoom:Z,panZoom:T}=N();if(!T)return Promise.resolve(!1);let c=typeof K?.zoom<"u"?K.zoom:Z;return await T.setViewport({x:q/2-w*c,y:z/2-W*c,zoom:c},{duration:K?.duration,ease:K?.ease,interpolate:K?.interpolate}),Promise.resolve(!0)},cancelConnection:()=>{F({connection:{...EJ}})},updateConnection:(w)=>{F({connection:w})},reset:()=>F({...ZG()})}},Object.is);function eP({initialNodes:u,initialEdges:l,defaultNodes:f,defaultEdges:n,initialWidth:i,initialHeight:y,initialMinZoom:_,initialMaxZoom:$,initialFitViewOptions:r,fitView:j,nodeOrigin:J,nodeExtent:Q,zIndexMode:U,children:F}){let[N]=ju.useState(()=>dP({nodes:u,edges:l,defaultNodes:f,defaultEdges:n,width:i,height:y,fitView:j,minZoom:_,maxZoom:$,fitViewOptions:r,nodeOrigin:J,nodeExtent:Q,zIndexMode:U}));return _u.jsx(qS,{value:N,children:_u.jsx(xS,{children:F})})}function uM({children:u,nodes:l,edges:f,defaultNodes:n,defaultEdges:i,width:y,height:_,fitView:$,fitViewOptions:r,minZoom:j,maxZoom:J,nodeOrigin:Q,nodeExtent:U,zIndexMode:F}){if(ju.useContext(LA))return _u.jsx(_u.Fragment,{children:u});return _u.jsx(eP,{initialNodes:l,initialEdges:f,defaultNodes:n,defaultEdges:i,initialWidth:y,initialHeight:_,fitView:$,initialFitViewOptions:r,initialMinZoom:j,initialMaxZoom:J,nodeOrigin:Q,nodeExtent:U,zIndexMode:F,children:u})}var lM={width:"100%",height:"100%",overflow:"hidden",position:"relative",zIndex:0};function fM({nodes:u,edges:l,defaultNodes:f,defaultEdges:n,className:i,nodeTypes:y,edgeTypes:_,onNodeClick:$,onEdgeClick:r,onInit:j,onMove:J,onMoveStart:Q,onMoveEnd:U,onConnect:F,onConnectStart:N,onConnectEnd:L,onClickConnectStart:w,onClickConnectEnd:W,onNodeMouseEnter:K,onNodeMouseMove:q,onNodeMouseLeave:z,onNodeContextMenu:Z,onNodeDoubleClick:T,onNodeDragStart:c,onNodeDrag:X,onNodeDragStop:S,onNodesDelete:p,onEdgesDelete:Y,onDelete:t,onSelectionChange:m,onSelectionDragStart:V,onSelectionDrag:D,onSelectionDragStop:M,onSelectionContextMenu:I,onSelectionStart:O,onSelectionEnd:C,onBeforeDelete:g,connectionMode:a,connectionLineType:iu=Dn.Bezier,connectionLineStyle:Au,connectionLineComponent:R,connectionLineContainerStyle:x,deleteKeyCode:fu="Backspace",selectionKeyCode:yu="Shift",selectionOnDrag:Ju=!1,selectionMode:Vu=Wy.Full,panActivationKeyCode:Lu="Space",multiSelectionKeyCode:Bu=g_()?"Meta":"Control",zoomActivationKeyCode:b=g_()?"Meta":"Control",snapToGrid:o,snapGrid:nu,onlyRenderVisibleElements:wu=!1,selectNodesOnDrag:e,nodesDraggable:zu,autoPanOnNodeFocus:v,nodesConnectable:$u,nodesFocusable:Wu,nodeOrigin:Du=TG,edgesFocusable:ku,edgesReconnectable:$l,elementsSelectable:gu=!0,defaultViewport:Df=cS,minZoom:j0=0.5,maxZoom:lf=2,translateExtent:J0=b_,preventScrolling:Sf=!0,nodeExtent:Nu,defaultMarkerColor:eu="#b1b1b7",zoomOnScroll:gl=!0,zoomOnPinch:Ru=!0,panOnScroll:Af=!1,panOnScrollSpeed:Pf=0.5,panOnScrollMode:jf=W1.Free,zoomOnDoubleClick:sl=!0,panOnDrag:T0=!0,onPaneClick:xn,onPaneMouseEnter:sf,onPaneMouseMove:$$,onPaneMouseLeave:z1,onPaneScroll:G1,onPaneContextMenu:d,paneClickDistance:Su=1,nodeClickDistance:xu=0,children:yl,onReconnect:Kl,onReconnectStart:ol,onReconnectEnd:jl,onEdgeContextMenu:ff,onEdgeDoubleClick:Rn,onEdgeMouseEnter:vA,onEdgeMouseMove:r$,onEdgeMouseLeave:A$,reconnectRadius:Hl=10,onNodesChange:mr,onEdgesChange:gA,noDragClassName:Fl="nodrag",noWheelClassName:kQ="nowheel",noPanClassName:Pl="nopan",fitView:wf,fitViewOptions:Zy,connectOnClick:xr,attributionPosition:j$,proOptions:Rr,defaultEdgeOptions:J$,elevateNodesOnSelect:br=!0,elevateEdgesOnSelect:kr=!1,disableKeyboardA11y:w1=!1,autoPanOnConnect:Ey,autoPanOnNodeDrag:Hy,autoPanSpeed:af,connectionRadius:V0,isValidConnection:hr,onError:Oy,style:Q$,id:U$,nodeDragThreshold:Fn,connectionDragThreshold:Ir,viewport:cl,onViewportChange:sA,width:aA,height:vr,colorMode:v0="light",debug:Ti,onScroll:Z1,ariaLabelConfig:Ty,zIndexMode:E1="basic",...N$},hQ){let bn=U$||"1",IQ=DS(v0),gr=ju.useCallback((sr)=>{sr.currentTarget.scrollTo({top:0,left:0,behavior:"instant"}),Z1?.(sr)},[Z1]);return _u.jsx("div",{"data-testid":"rf__wrapper",...N$,onScroll:gr,style:{...Q$,...lM},ref:hQ,className:Il(["react-flow",i,IQ]),id:U$,role:"application",children:_u.jsxs(uM,{nodes:u,edges:l,width:aA,height:vr,fitView:wf,fitViewOptions:Zy,minZoom:j0,maxZoom:lf,nodeOrigin:Du,nodeExtent:Nu,zIndexMode:E1,children:[_u.jsx(tS,{nodes:u,edges:l,defaultNodes:f,defaultEdges:n,onConnect:F,onConnectStart:N,onConnectEnd:L,onClickConnectStart:w,onClickConnectEnd:W,nodesDraggable:zu,autoPanOnNodeFocus:v,nodesConnectable:$u,nodesFocusable:Wu,edgesFocusable:ku,edgesReconnectable:$l,elementsSelectable:gu,elevateNodesOnSelect:br,elevateEdgesOnSelect:kr,minZoom:j0,maxZoom:lf,nodeExtent:Nu,onNodesChange:mr,onEdgesChange:gA,snapToGrid:o,snapGrid:nu,connectionMode:a,translateExtent:J0,connectOnClick:xr,defaultEdgeOptions:J$,fitView:wf,fitViewOptions:Zy,onNodesDelete:p,onEdgesDelete:Y,onDelete:t,onNodeDragStart:c,onNodeDrag:X,onNodeDragStop:S,onSelectionDrag:D,onSelectionDragStart:V,onSelectionDragStop:M,onMove:J,onMoveStart:Q,onMoveEnd:U,noPanClassName:Pl,nodeOrigin:Du,rfId:bn,autoPanOnConnect:Ey,autoPanOnNodeDrag:Hy,autoPanSpeed:af,onError:Oy,connectionRadius:V0,isValidConnection:hr,selectNodesOnDrag:e,nodeDragThreshold:Fn,connectionDragThreshold:Ir,onBeforeDelete:g,debug:Ti,ariaLabelConfig:Ty,zIndexMode:E1}),_u.jsx(oP,{onInit:j,onNodeClick:$,onEdgeClick:r,onNodeMouseEnter:K,onNodeMouseMove:q,onNodeMouseLeave:z,onNodeContextMenu:Z,onNodeDoubleClick:T,nodeTypes:y,edgeTypes:_,connectionLineType:iu,connectionLineStyle:Au,connectionLineComponent:R,connectionLineContainerStyle:x,selectionKeyCode:yu,selectionOnDrag:Ju,selectionMode:Vu,deleteKeyCode:fu,multiSelectionKeyCode:Bu,panActivationKeyCode:Lu,zoomActivationKeyCode:b,onlyRenderVisibleElements:wu,defaultViewport:Df,translateExtent:J0,minZoom:j0,maxZoom:lf,preventScrolling:Sf,zoomOnScroll:gl,zoomOnPinch:Ru,zoomOnDoubleClick:sl,panOnScroll:Af,panOnScrollSpeed:Pf,panOnScrollMode:jf,panOnDrag:T0,onPaneClick:xn,onPaneMouseEnter:sf,onPaneMouseMove:$$,onPaneMouseLeave:z1,onPaneScroll:G1,onPaneContextMenu:d,paneClickDistance:Su,nodeClickDistance:xu,onSelectionContextMenu:I,onSelectionStart:O,onSelectionEnd:C,onReconnect:Kl,onReconnectStart:ol,onReconnectEnd:jl,onEdgeContextMenu:ff,onEdgeDoubleClick:Rn,onEdgeMouseEnter:vA,onEdgeMouseMove:r$,onEdgeMouseLeave:A$,reconnectRadius:Hl,defaultMarkerColor:eu,noDragClassName:Fl,noWheelClassName:kQ,noPanClassName:Pl,rfId:bn,disableKeyboardA11y:w1,nodeExtent:Nu,viewport:cl,onViewportChange:sA}),_u.jsx(BS,{onSelectionChange:m}),yl,_u.jsx(ES,{proOptions:Rr,position:j$}),_u.jsx(ZS,{rfId:bn,disableKeyboardA11y:w1})]})})}var eG=BG(fM);var Ag=Z0.error014();function nM({dimensions:u,lineWidth:l,variant:f,className:n}){return _u.jsx("path",{strokeWidth:l,d:`M${u[0]/2} 0 V${u[1]} M0 ${u[1]/2} H${u[0]}`,className:Il(["react-flow__background-pattern",f,n])})}function iM({radius:u,className:l}){return _u.jsx("circle",{cx:u,cy:u,r:u,className:Il(["react-flow__background-pattern","dots",l])})}var Wi;(function(u){u.Lines="lines",u.Dots="dots",u.Cross="cross"})(Wi||(Wi={}));var yM={[Wi.Dots]:1,[Wi.Lines]:1,[Wi.Cross]:6},_M=(u)=>({transform:u.transform,patternId:`pattern-${u.rfId}`});function uw({id:u,variant:l=Wi.Dots,gap:f=20,size:n,lineWidth:i=1,offset:y=0,color:_,bgColor:$,style:r,className:j,patternClassName:J}){let Q=ju.useRef(null),{transform:U,patternId:F}=Ql(_M,Bl),N=n||yM[l],L=l===Wi.Dots,w=l===Wi.Cross,W=Array.isArray(f)?f:[f,f],K=[W[0]*U[2]||1,W[1]*U[2]||1],q=N*U[2],z=Array.isArray(y)?y:[y,y],Z=w?[q,q]:K,T=[z[0]*U[2]||1+Z[0]/2,z[1]*U[2]||1+Z[1]/2],c=`${F}${u?u:""}`;return _u.jsxs("svg",{className:Il(["react-flow__background",j]),style:{...r,...zA,"--xy-background-color-props":$,"--xy-background-pattern-color-props":_},ref:Q,"data-testid":"rf__background",children:[_u.jsx("pattern",{id:c,x:U[0]%K[0],y:U[1]%K[1],width:K[0],height:K[1],patternUnits:"userSpaceOnUse",patternTransform:`translate(-${T[0]},-${T[1]})`,children:L?_u.jsx(iM,{radius:q/2,className:J}):_u.jsx(nM,{dimensions:Z,lineWidth:i,variant:l,className:J})}),_u.jsx("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:`url(#${c})`})]})}uw.displayName="Background";var lw=ju.memo(uw);function $M(){return _u.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",children:_u.jsx("path",{d:"M32 18.133H18.133V32h-4.266V18.133H0v-4.266h13.867V0h4.266v13.867H32z"})})}function rM(){return _u.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 5",children:_u.jsx("path",{d:"M0 0h32v4.2H0z"})})}function AM(){return _u.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 30",children:_u.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 jM(){return _u.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:_u.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 JM(){return _u.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:_u.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 WA({children:u,className:l,...f}){return _u.jsx("button",{type:"button",className:Il(["react-flow__controls-button",l]),...f,children:u})}var QM=(u)=>({isInteractive:u.nodesDraggable||u.nodesConnectable||u.elementsSelectable,minZoomReached:u.transform[2]<=u.minZoom,maxZoomReached:u.transform[2]>=u.maxZoom,ariaLabelConfig:u.ariaLabelConfig});function fw({style:u,showZoom:l=!0,showFitView:f=!0,showInteractive:n=!0,fitViewOptions:i,onZoomIn:y,onZoomOut:_,onFitView:$,onInteractiveChange:r,className:j,children:J,position:Q="bottom-left",orientation:U="vertical","aria-label":F}){let N=Sl(),{isInteractive:L,minZoomReached:w,maxZoomReached:W,ariaLabelConfig:K}=Ql(QM,Bl),{zoomIn:q,zoomOut:z,fitView:Z}=dJ(),T=()=>{q(),y?.()},c=()=>{z(),_?.()},X=()=>{Z(i),$?.()},S=()=>{N.setState({nodesDraggable:!L,nodesConnectable:!L,elementsSelectable:!L}),r?.(!L)};return _u.jsxs(KA,{className:Il(["react-flow__controls",U==="horizontal"?"horizontal":"vertical",j]),position:Q,style:u,"data-testid":"rf__controls","aria-label":F??K["controls.ariaLabel"],children:[l&&_u.jsxs(_u.Fragment,{children:[_u.jsx(WA,{onClick:T,className:"react-flow__controls-zoomin",title:K["controls.zoomIn.ariaLabel"],"aria-label":K["controls.zoomIn.ariaLabel"],disabled:W,children:_u.jsx($M,{})}),_u.jsx(WA,{onClick:c,className:"react-flow__controls-zoomout",title:K["controls.zoomOut.ariaLabel"],"aria-label":K["controls.zoomOut.ariaLabel"],disabled:w,children:_u.jsx(rM,{})})]}),f&&_u.jsx(WA,{className:"react-flow__controls-fitview",onClick:X,title:K["controls.fitView.ariaLabel"],"aria-label":K["controls.fitView.ariaLabel"],children:_u.jsx(AM,{})}),n&&_u.jsx(WA,{className:"react-flow__controls-interactive",onClick:S,title:K["controls.interactive.ariaLabel"],"aria-label":K["controls.interactive.ariaLabel"],children:L?_u.jsx(JM,{}):_u.jsx(jM,{})}),J]})}fw.displayName="Controls";var nw=ju.memo(fw);function UM({id:u,x:l,y:f,width:n,height:i,style:y,color:_,strokeColor:$,strokeWidth:r,className:j,borderRadius:J,shapeRendering:Q,selected:U,onClick:F}){let{background:N,backgroundColor:L}=y||{},w=_||N||L;return _u.jsx("rect",{className:Il(["react-flow__minimap-node",{selected:U},j]),x:l,y:f,rx:J,ry:J,width:n,height:i,style:{fill:w,stroke:$,strokeWidth:r},shapeRendering:Q,onClick:F?(W)=>F(W,u):void 0})}var NM=ju.memo(UM),FM=(u)=>u.nodes.map((l)=>l.id),sJ=(u)=>u instanceof Function?u:()=>u;function WM({nodeStrokeColor:u,nodeColor:l,nodeClassName:f="",nodeBorderRadius:n=5,nodeStrokeWidth:i,nodeComponent:y=NM,onClick:_}){let $=Ql(FM,Bl),r=sJ(l),j=sJ(u),J=sJ(f),Q=typeof window>"u"||!!window.chrome?"crispEdges":"geometricPrecision";return _u.jsx(_u.Fragment,{children:$.map((U)=>_u.jsx(LM,{id:U,nodeColorFunc:r,nodeStrokeColorFunc:j,nodeClassNameFunc:J,nodeBorderRadius:n,nodeStrokeWidth:i,NodeComponent:y,onClick:_,shapeRendering:Q},U))})}function qM({id:u,nodeColorFunc:l,nodeStrokeColorFunc:f,nodeClassNameFunc:n,nodeBorderRadius:i,nodeStrokeWidth:y,shapeRendering:_,NodeComponent:$,onClick:r}){let{node:j,x:J,y:Q,width:U,height:F}=Ql((N)=>{let L=N.nodeLookup.get(u);if(!L)return{node:void 0,x:0,y:0,width:0,height:0};let w=L.internals.userNode,{x:W,y:K}=L.internals.positionAbsolute,{width:q,height:z}=Sn(w);return{node:w,x:W,y:K,width:q,height:z}},Bl);if(!j||j.hidden||!tJ(j))return null;return _u.jsx($,{x:J,y:Q,width:U,height:F,style:j.style,selected:!!j.selected,className:n(j),color:l(j),borderRadius:i,strokeColor:f(j),strokeWidth:y,shapeRendering:_,onClick:r,id:j.id})}var LM=ju.memo(qM),KM=ju.memo(WM),zM=200,GM=150,wM=(u)=>!u.hidden,ZM=(u)=>{let l={x:-u.transform[0]/u.transform[2],y:-u.transform[1]/u.transform[2],width:u.width/u.transform[2],height:u.height/u.transform[2]};return{viewBB:l,boundingRect:u.nodeLookup.size>0?cJ(k_(u.nodeLookup,{filter:wM}),l):l,rfId:u.rfId,panZoom:u.panZoom,translateExtent:u.translateExtent,flowWidth:u.width,flowHeight:u.height,ariaLabelConfig:u.ariaLabelConfig}},EM="react-flow__minimap-desc";function iw({style:u,className:l,nodeStrokeColor:f,nodeColor:n,nodeClassName:i="",nodeBorderRadius:y=5,nodeStrokeWidth:_,nodeComponent:$,bgColor:r,maskColor:j,maskStrokeColor:J,maskStrokeWidth:Q,position:U="bottom-right",onClick:F,onNodeClick:N,pannable:L=!1,zoomable:w=!1,ariaLabel:W,inversePan:K,zoomStep:q=1,offsetScale:z=5}){let Z=Sl(),T=ju.useRef(null),{boundingRect:c,viewBB:X,rfId:S,panZoom:p,translateExtent:Y,flowWidth:t,flowHeight:m,ariaLabelConfig:V}=Ql(ZM,Bl),D=u?.width??zM,M=u?.height??GM,I=c.width/D,O=c.height/M,C=Math.max(I,O),g=C*D,a=C*M,iu=z*C,Au=c.x-(g-c.width)/2-iu,R=c.y-(a-c.height)/2-iu,x=g+iu*2,fu=a+iu*2,yu=`${EM}-${S}`,Ju=ju.useRef(0),Vu=ju.useRef();Ju.current=C,ju.useEffect(()=>{if(T.current&&p)return Vu.current=Sz({domNode:T.current,panZoom:p,getTransform:()=>Z.getState().transform,getViewScale:()=>Ju.current}),()=>{Vu.current?.destroy()}},[p]),ju.useEffect(()=>{Vu.current?.update({translateExtent:Y,width:t,height:m,inversePan:K,pannable:L,zoomStep:q,zoomable:w})},[L,w,K,q,Y,t,m]);let Lu=F?(o)=>{let[nu,wu]=Vu.current?.pointer(o)||[0,0];F(o,{x:nu,y:wu})}:void 0,Bu=N?ju.useCallback((o,nu)=>{let wu=Z.getState().nodeLookup.get(nu).internals.userNode;N(o,wu)},[]):void 0,b=W??V["minimap.ariaLabel"];return _u.jsx(KA,{position:U,style:{...u,"--xy-minimap-background-color-props":typeof r==="string"?r:void 0,"--xy-minimap-mask-background-color-props":typeof j==="string"?j:void 0,"--xy-minimap-mask-stroke-color-props":typeof J==="string"?J:void 0,"--xy-minimap-mask-stroke-width-props":typeof Q==="number"?Q*C:void 0,"--xy-minimap-node-background-color-props":typeof n==="string"?n:void 0,"--xy-minimap-node-stroke-color-props":typeof f==="string"?f:void 0,"--xy-minimap-node-stroke-width-props":typeof _==="number"?_:void 0},className:Il(["react-flow__minimap",l]),"data-testid":"rf__minimap",children:_u.jsxs("svg",{width:D,height:M,viewBox:`${Au} ${R} ${x} ${fu}`,className:"react-flow__minimap-svg",role:"img","aria-labelledby":yu,ref:T,onClick:Lu,children:[b&&_u.jsx("title",{id:yu,children:b}),_u.jsx(KM,{onClick:Bu,nodeColor:n,nodeStrokeColor:f,nodeBorderRadius:y,nodeClassName:i,nodeStrokeWidth:_,nodeComponent:$}),_u.jsx("path",{className:"react-flow__minimap-mask",d:`M${Au-iu},${R-iu}h${x+iu*2}v${fu+iu*2}h${-x-iu*2}z - M${X.x},${X.y}h${X.width}v${X.height}h${-X.width}z`,fillRule:"evenodd",pointerEvents:"none"})]})})}iw.displayName="MiniMap";var jg=ju.memo(iw),HM=(u)=>(l)=>u?`${Math.max(1/l.transform[2],1)}`:void 0,OM={[Fi.Line]:"right",[Fi.Handle]:"bottom-right"};function TM({nodeId:u,position:l,variant:f=Fi.Handle,className:n,style:i=void 0,children:y,color:_,minWidth:$=10,minHeight:r=10,maxWidth:j=Number.MAX_VALUE,maxHeight:J=Number.MAX_VALUE,keepAspectRatio:Q=!1,resizeDirection:U,autoScale:F=!0,shouldResize:N,onResizeStart:L,onResize:w,onResizeEnd:W}){let K=tG(),q=typeof u==="string"?u:K,z=Sl(),Z=ju.useRef(null),T=f===Fi.Handle,c=Ql(ju.useCallback(HM(T&&F),[T,F]),Bl),X=ju.useRef(null),S=l??OM[f];ju.useEffect(()=>{if(!Z.current||!q)return;if(!X.current)X.current=mz({domNode:Z.current,nodeId:q,getStoreItems:()=>{let{nodeLookup:Y,transform:t,snapGrid:m,snapToGrid:V,nodeOrigin:D,domNode:M}=z.getState();return{nodeLookup:Y,transform:t,snapGrid:m,snapToGrid:V,nodeOrigin:D,paneDomNode:M}},onChange:(Y,t)=>{let{triggerNodeChanges:m,nodeLookup:V,parentLookup:D,nodeOrigin:M}=z.getState(),I=[],O={x:Y.x,y:Y.y},C=V.get(q);if(C&&C.expandParent&&C.parentId){let g=C.origin??M,a=Y.width??C.measured.width??0,iu=Y.height??C.measured.height??0,Au={id:C.id,parentId:C.parentId,rect:{width:a,height:iu,...DJ({x:Y.x??C.position.x,y:Y.y??C.position.y},{width:a,height:iu},C.parentId,V,g)}},R=JA([Au],V,D,M);I.push(...R),O.x=Y.x?Math.max(g[0]*a,Y.x):void 0,O.y=Y.y?Math.max(g[1]*iu,Y.y):void 0}if(O.x!==void 0&&O.y!==void 0){let g={id:q,type:"position",position:{...O}};I.push(g)}if(Y.width!==void 0&&Y.height!==void 0){let a={id:q,type:"dimensions",resizing:!0,setAttributes:!U?!0:U==="horizontal"?"width":"height",dimensions:{width:Y.width,height:Y.height}};I.push(a)}for(let g of t){let a={...g,type:"position"};I.push(a)}m(I)},onEnd:({width:Y,height:t})=>{let m={id:q,type:"dimensions",resizing:!1,dimensions:{width:Y,height:t}};z.getState().triggerNodeChanges([m])}});return X.current.update({controlPosition:S,boundaries:{minWidth:$,minHeight:r,maxWidth:j,maxHeight:J},keepAspectRatio:Q,resizeDirection:U,onResizeStart:L,onResize:w,onResizeEnd:W,shouldResize:N}),()=>{X.current?.destroy()}},[S,$,r,j,J,Q,L,w,W,N]);let p=S.split("-");return _u.jsx("div",{className:Il(["react-flow__resize-control","nodrag",...p,f,n]),ref:Z,style:{...i,scale:c,..._&&{[T?"backgroundColor":"borderColor"]:_}},children:y})}var Jg=ju.memo(TM);var H=zi.default.createElement,{useEffect:Cn}=zi.default,_0=zi.default.useState,Ki=zi.default.useRef,Br=[{id:"in-left",side:"left",position:Xu.Left,style:{top:"50%"}},{id:"in-top-left",side:"top",slot:"left",slotIndex:-1,position:Xu.Top,style:{left:"28%"}},{id:"in-top-mid",side:"top",slot:"mid",slotIndex:0,position:Xu.Top,style:{left:"50%"}},{id:"in-top-right",side:"top",slot:"right",slotIndex:1,position:Xu.Top,style:{left:"72%"}},{id:"in-bottom-left",side:"bottom",slot:"left",slotIndex:-1,position:Xu.Bottom,style:{left:"28%"}},{id:"in-bottom-mid",side:"bottom",slot:"mid",slotIndex:0,position:Xu.Bottom,style:{left:"50%"}},{id:"in-bottom-right",side:"bottom",slot:"right",slotIndex:1,position:Xu.Bottom,style:{left:"72%"}}],Or=[{id:"out-right",position:Xu.Right,style:{top:"50%"}}],yw=["#4eb7a8","#d7a13a","#69aee8","#e0835f","#b7d86b","#d98bd2","#5fc6bf"],e_=236,u$=88,_w=15000,VM=10,uQ=96,Pn=72,lQ=64,$w=12;function GA(){return typeof document>"u"||document.visibilityState!=="hidden"}function rw(u,l){let f=Number.parseFloat(String(u||""));return Number.isFinite(f)?f/100:l}function BM(u,l,f){let n=String(u.side||"");if(n!=="top"&&n!=="bottom")return 0;let i=Number(u.slotIndex||0),y=n==="top"?"in-top-mid":"in-bottom-mid",_=l.get(u.id)||0,$=l.get(y)||0;if(i===0)return $===0?-26:28+_*74;let r=f===0?Math.abs(i)*2:Math.sign(f)===Math.sign(i)?-3:3;if($>0&&_===0)return-14+r;return 8+_*74+r}function wA(u){let l=u.filter((y,_)=>{let $=u[_-1];return!$||Math.abs($.x-y.x)>0.5||Math.abs($.y-y.y)>0.5});if(l.length<2)return"";let f=`M ${l[0].x},${l[0].y}`,n=l[0];for(let y=1;y0.5||Math.abs(U.y-n.y)>0.5)f+=` L ${U.x},${U.y}`;f+=` Q ${$.x},${$.y} ${F.x},${F.y}`,n=F}let i=l[l.length-1];return`${f} L ${i.x},${i.y}`}function Ow(u,l,f,n,i,y,_=""){let $=f>=u,r=Math.max(1,Math.abs(f-u)),j=Math.abs(n-l),J=Math.max(34,Math.min(118,r*0.26)),Q=Math.min(280,Math.abs(y));if($&&i===Xu.Left&&Q<4&&j<28&&r<420)return`M ${u},${l} C ${u+J},${l} ${f-J},${n} ${f},${n}`;if($&&i===Xu.Left&&(_==="direct-forward-left"||r<=260&&j<=210)){let W=Math.max(42,Math.min(140,r*0.48)),K=Math.max(-28,Math.min(28,y*0.18));return`M ${u},${l} C ${u+W},${l+K} ${f-W},${n} ${f},${n}`}if($){let W=u+J;if(i===Xu.Top||i===Xu.Bottom){let z=i===Xu.Top?-1:1,Z=n+z*(54+Q*0.42);return wA([{x:u,y:l},{x:W,y:l},{x:W+Math.min(120,r*0.18),y:Z},{x:f,y:Z},{x:f,y:n+z*34},{x:f,y:n}])}let K=f-J,q=(l+n)/2+y;return wA([{x:u,y:l},{x:W,y:l},{x:W+Math.min(110,r*0.16),y:q},{x:K-Math.min(90,r*0.12),y:q},{x:K,y:n},{x:f,y:n}])}let N=i===Xu.Bottom?1:i===Xu.Top?-1:y>=0?1:-1,L=Math.max(u,f)+92+Math.min(180,Q*0.52),w=N<0?Math.min(l,n)-84-Q*0.62:Math.max(l,n)+84+Q*0.62;if(i===Xu.Top||i===Xu.Bottom)return wA([{x:u,y:l},{x:u+J,y:l},{x:L,y:w},{x:f,y:w},{x:f,y:n+N*38},{x:f,y:n}]);return wA([{x:u,y:l},{x:u+J,y:l},{x:L,y:w},{x:f-J,y:w},{x:f-J,y:n},{x:f,y:n}])}function cM({data:u}){return H("div",{className:"pipeline-flow-node-body"},Br.map((l)=>H(zy,{key:l.id,id:l.id,type:"target",position:l.position,isConnectable:!1,className:`pipeline-flow-handle input ${l.side} slot-${l.slot||"mid"}`,style:l.style})),Or.map((l)=>H(zy,{key:l.id,id:l.id,type:"source",position:l.position,isConnectable:!1,className:"pipeline-flow-handle output right",style:l.style})),u?.label)}function XM({id:u,sourceX:l,sourceY:f,targetX:n,targetY:i,targetPosition:y,markerEnd:_,markerStart:$,style:r,data:j}){let J=Number(j?.laneOffset||0),Q=Ow(l,f,n,i,y,J,String(j?.routeMode||""));return H(o_,{id:u,path:Q,markerEnd:_,markerStart:$,style:r,interactionWidth:28})}var YM={pipelineCurve:XM},tM={pipelineNode:cM};function OA(u){if(!u)return"--";let l=new Date(u);if(Number.isNaN(l.getTime()))return"--";return Al(l)}function k0(u){let l=Number(u);if(!Number.isFinite(l)||l<0)return"--";let f=Math.round(l/1000);if(f<60)return`${f}s`;if(f<3600)return`${Math.floor(f/60)}m ${f%60}s`;return`${Math.floor(f/3600)}h ${Math.floor(f%3600/60)}m`}function fQ(u){let l=Number(u);if(!Number.isFinite(l))return"--";return l.toLocaleString("zh-CN")}function Aw(u){let l=Number(u);if(!Number.isFinite(l))return"--";return`${Math.round(Math.max(0,Math.min(1,l))*100)}%`}function pu(u){return typeof u==="object"&&u!==null&&!Array.isArray(u)}function Mu(u){return Array.isArray(u)?u:[]}function fl(u){if(!u)return null;let l=new Date(u);return Number.isNaN(l.getTime())?null:l.getTime()}function cr(u){return Number.isFinite(Number(u))?new Date(Number(u)).toISOString():""}function tr(...u){for(let l of u){let f=fl(l);if(f!==null)return new Date(f).toISOString()}return""}function qQ(...u){let l=u.map(fl).filter((f)=>f!==null);return l.length>0?new Date(Math.max(...l)).toISOString():""}function LQ(u){return["succeeded","failed","skipped","cancelled","canceled","completed"].includes(String(u||"").toLowerCase())}function Tw(u){let l=cw(u).toLowerCase();return["running","active","in-progress","in_progress"].includes(l)}function jw(u,l="status"){return u.reduce((f,n)=>{let i=String(n?.[l]||"unknown").toLowerCase();return f[i]=(f[i]||0)+1,f},{})}function Vw(u){if(!u||typeof u!=="string")return null;try{let l=JSON.parse(u);return pu(l)?l:null}catch{return null}}function nQ(u){let l=u.map(Vw).filter((y)=>Boolean(y)),f=l.flatMap((y)=>[y.timestamp,y.createdAt,y.updatedAt]).filter(Boolean),n=qQ(...f),i=Array.from(new Set(l.map((y)=>String(y.event||y.action||y.type||"")).filter(Boolean))).slice(0,3);return{total:u.length,parsed:l.length,lastAt:n,eventKinds:i}}function TA(u){if(u===null||u===void 0)return"--";if(typeof u==="boolean")return u?"是":"否";if(typeof u==="number")return String(u);if(typeof u==="string")return u.length>80?`${u.slice(0,77)}...`:u;if(Array.isArray(u))return`${u.length} 项`;if(typeof u==="object")return`${Object.keys(u).length} 字段`;return String(u)}function Bw(u,l=280){if(u===null||u===void 0)return"";let n=(typeof u==="string"?u:String(u)).replace(/\r\n/gu,` -`).trim();return n.length>l?`${n.slice(0,Math.max(0,l-1))}...`:n}function cw(u){if(typeof u==="string")return u;if(pu(u))return String(u.status||u.state||u.phase||"unknown");return"unknown"}function DM(u){return u.filter((l)=>l&&l.value!==void 0&&l.value!==null&&String(l.value)!=="")}function AQ({items:u}){let l=DM(Mu(u));return H("div",{className:"pipeline-kv-grid"},l.map((f)=>H("span",{key:f.label},H("b",null,f.label),H("span",null,f.value))))}function KQ({items:u}){let l=Mu(u).map((f)=>String(f||"")).filter(Boolean);if(l.length===0)return null;return H("div",{className:"pipeline-chip-row"},l.map((f,n)=>H("span",{key:`${n}-${f}`},f)))}function jQ(u,l){let f=String(l?.procedureRunId||""),n=Mu(u?.procedureRuns);return n.find((i)=>String(h0(i))===f)||n.at(-1)||null}function SM(u,l){let f=String(l||"");if(!f)return null;return Mu(u?.procedureRuns).find((n)=>h0(n)===f)||null}function iQ(u){return Mu(u?.attempts).length}function Jw(u){return Mu(u?.attempts).reduce((l,f)=>l+DA(f).length,0)}function DA(u){return Mu(u?.opencodeMessages?.steps).filter(pu)}function Xw(u){let l=String(u?.status||"").toLowerCase();if(["error","failed","failure"].includes(l))return"failed";if(["completed","succeeded","success"].includes(l))return"succeeded";if(["running","started","in_progress"].includes(l))return"running";return"unknown"}function PM(u,l){let f=QQ(u.map((y)=>y?.agent)).slice(0,3),n=QQ(u.map((y)=>y?.model)).slice(0,3),i=l.length<=2?l.map((y)=>`session ${y}`):[`sessions ${l.length}`,...l.slice(0,2).map((y)=>`session ${y}`)];return[...f.map((y)=>`agent ${y}`),...n.map((y)=>`model ${y}`),...i]}function Tr(u,l=0){return String(u?.messageId||u?.index||"")||`step-${l}`}function MM({steps:u,sessionIds:l,sessionFacts:f,matchedStepKey:n}){let i=Mu(u),y=i.findIndex((w,W)=>Tr(w,W)===n),_=y>=0?i[y]:null,$=i.flatMap((w)=>[fl(w?.createdAt),fl(w?.completedAt)]).filter((w)=>w!==null),r=$.length>0?Math.min(...$):null,j=$.length>0?Math.max(...$):null,J=r!==null&&j!==null?Math.max(0,j-r):null,Q=i.reduce((w,W)=>w+Mu(W?.parts).filter((K)=>String(K?.type||"").toLowerCase()==="tool").length,0),U=i.reduce((w,W)=>w+Mu(W?.parts).filter((K)=>["text","reasoning"].includes(String(K?.type||"").toLowerCase())).length,0),F=i.reduce((w,W)=>w+Mu(W?.parts).filter((K)=>String(K?.type||"").toLowerCase()==="tool"&&Xw(K)==="failed").length,0),N=[`${i.length} steps`,`${l.length} sessions`,`${U} messages`,`${Q} tools`,J!==null?`duration ${k0(J)}`:"",F>0?`${F} failed tools`:""].filter(Boolean),L=_?[`Step ${_?.index??y+1}`,String(_?.role||"role --"),_?.model?`model ${_.model}`:"",_?.finish?`finish ${_.finish}`:"",_?.durationMs!==void 0&&_?.durationMs!==null?`duration ${k0(_.durationMs)}`:""].filter(Boolean):[];return H("section",{className:"pipeline-trace-timeline","data-testid":"pipeline-step-timeline"},H("div",{className:"pipeline-trace-head"},H("div",null,H("b",null,"OpenCode Trace"),H("span",null,"Trace 使用 Code Queue 统一样式展示完整 agent loop;Pipeline 旧 step/message/tool 卡片样式已废弃。")),H("div",{className:"pipeline-trace-session-head","data-testid":"pipeline-step-timeline-session"},H("span",null,N.join(" / ")||"Trace"),f.length>0?H(KQ,{items:f}):null)),_?H("div",{className:"pipeline-trace-focus","data-testid":"pipeline-trace-matched-step"},H("span",{className:"codex-output-channel"},"Matched"),H("strong",null,`Gantt selection -> ${L.join(" / ")}`),H("time",null,`${OA(_?.createdAt)} -> ${OA(_?.completedAt)}`)):null,H(S8,{port:cq,input:i,className:"codex-transcript pipeline-trace",testId:"pipeline-opencode-step-trace",emptyText:"暂无 OpenCode Trace 输出",keepRecentToolCalls:3}))}function JQ(u){return Mu(u).flatMap((l)=>{if(pu(l))return[l];let f=Vw(l);return f?[f]:[]})}function Un(u){return String(u?.event||u?.action||u?.requestedAction||u?.type||"").toLowerCase()}function d_(u){return tr(u?.timestamp,u?.createdAt,u?.updatedAt,u?.startedAt,u?.finishedAt)}function CM(u){return fl(d_(u))}function SA(u){return String(u?.attempt||u?.id||"")}function QQ(u){let l=new Set,f=[];for(let n of u){let i=String(n||"");if(!i||l.has(i))continue;l.add(i),f.push(i)}return f}function Qw(u){switch(String(u||"").toLowerCase()){case"monitor":return"monitor";case"webui":return"webui";case"cli":return"cli";case"system":return"runner";default:return String(u||"--")}}function Gy(u){return String(u?.requestedAction||u?.action||"").toLowerCase()}function Vr(u){switch(Gy(u)){case"guide":return"引导";case"modify":return"修改";case"approve":return"审核通过";case"restart":return"重启";case"redo":return"重做";default:return String(u?.requestedAction||u?.action||"控制")}}function Uw(u){switch(Un(u)){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`${Vr(u)} 已发起`;case"control-command-applied":return`${Vr(u)} 已生效`;case"control-command-ignored":return`${Vr(u)} 已忽略`;default:return String(u?.event||u?.action||u?.requestedAction||"event")}}function Nw(u){return Bw(u?.promptPreview||u?.reasonPreview||u?.prompt||u?.reason||"",240)}function pM(u){let l=String(u?.prompt||""),f=String(u?.reason||u?.restartReason||""),n=l?"":String(u?.promptPreview||""),i=f?"":String(u?.reasonPreview||"");return[l||n?{label:l?"prompt":"prompt preview",value:l||n}:null,f||i?{label:f?"reason":"reason preview",value:f||i}:null,Mu(u?.resetNodeIds).length>0?{label:"reset nodes",value:Mu(u.resetNodeIds).join(", ")}:null,Mu(u?.runningResetNodeIds).length>0?{label:"interrupted running nodes",value:Mu(u.runningResetNodeIds).join(", ")}:null,Mu(u?.interruptedProcedureRunIds).length>0?{label:"interrupted procedures",value:Mu(u.interruptedProcedureRunIds).join(", ")}:null,u?.interruptedProcedureRunId?{label:"interrupted procedure",value:String(u.interruptedProcedureRunId)}:null].filter(Boolean)}function yQ(u){let l=DA(u),f=l.map((r)=>fl(r?.createdAt)).filter((r)=>r!==null),n=l.map((r)=>fl(r?.completedAt)??fl(r?.createdAt)).filter((r)=>r!==null),i=JQ(u?.controlEventRecords).map((r)=>CM(r)).filter((r)=>r!==null),y=Mu(u?.assistantOutputs).map((r)=>fl(r?.updatedAt)).filter((r)=>r!==null),_=f[0]??i[0]??y[0]??null,$=n.at(-1)??i.at(-1)??y.at(-1)??_;return{startMs:_,endMs:$}}function mM(u,l,f,n,i=""){let y=Mu(u?.procedureRuns).filter(($)=>PA($,l)===f);if(y.length===0)return null;if(i){let $=y.find((r)=>h0(r)===i);if($)return $}if(n===null)return y.at(-1)||null;let _=y.find(($)=>{let r=fl(ZA($,u)),j=fl(EA($,u))??r;return r!==null&&j!==null&&n>=r-1000&&n<=j+1000});if(_)return _;return y.slice().sort(($,r)=>{let j=fl(ZA($,u))??n,J=fl(EA($,u))??j,Q=fl(ZA(r,u))??n,U=fl(EA(r,u))??Q,F=Math.min(Math.abs(j-n),Math.abs(J-n)),N=Math.min(Math.abs(Q-n),Math.abs(U-n));return F-N})[0]||null}function Yw(u,l){let f=Mu(u?.attempts).filter(pu);if(f.length===0)return null;let n=String(l?.attempt||"");if(n){let _=f.find(($)=>SA($)===n);if(_)return _}let i=Number.isFinite(Number(l?.ms))?Number(l.ms):null;if(i===null)return f.at(-1)||null;let y=f.find((_)=>{let $=yQ(_);return Number.isFinite($.startMs)&&Number.isFinite($.endMs)&&i>=Number($.startMs)-1000&&i<=Number($.endMs)+1000});if(y)return y;return f.slice().sort((_,$)=>{let r=yQ(_),j=yQ($),J=Math.min(Math.abs(Number(r.startMs??i)-i),Math.abs(Number(r.endMs??i)-i)),Q=Math.min(Math.abs(Number(j.startMs??i)-i),Math.abs(Number(j.endMs??i)-i));return J-Q})[0]||f.at(-1)||null}function tw(u,l){let f=DA(u);if(f.length===0)return{step:null,stepIndex:-1,stepKey:""};if(l===null){let y=f[0];return{step:y,stepIndex:0,stepKey:Tr(y,0)}}for(let y=0;y=$-1000&&l<=r+1000)return{step:_,stepIndex:y,stepKey:Tr(_,y)}}let n=f.findIndex((y)=>{let _=fl(y?.createdAt)??fl(y?.completedAt);return _!==null&&_>=l});if(n>=0){let y=f[n];return{step:y,stepIndex:n,stepKey:Tr(y,n)}}let i=Math.max(0,f.length-1);return{step:f[i],stepIndex:i,stepKey:Tr(f[i],i)}}function xM(u,l){let f=String(l?.runId||u?.runId||"");if(String(l?.mode||"")==="interval"){let j=l?.interval||{},J=jQ(u,j)||j.raw||{};return{mode:"interval",runId:f,interval:j,marker:null,nodeId:String(j?.nodeId||PA(J,f)||""),procedure:J,attempt:null,matchedStep:null,matchedStepIndex:-1,matchedStepKey:""}}let n=pu(l?.marker)?l.marker:{},i=Number.isFinite(Number(n?.ms))?Number(n.ms):null,y=String(n?.nodeId||""),_=y?mM(u,f,y,i,String(n?.procedureRunId||"")):null,$=_?Yw(_,n):null,r=$?tw($,i):{step:null,stepIndex:-1,stepKey:""};return{mode:"event",runId:f,interval:null,marker:n,nodeId:y,procedure:_,attempt:$,matchedStep:r.step,matchedStepIndex:r.stepIndex,matchedStepKey:r.stepKey}}function RM({procedure:u,matchedStepKey:l="",matchedAttemptId:f=""}){let n=Mu(u?.attempts);if(n.length===0)return H(H0,{title:"暂无 attempt 详情",text:"当前 procedure 还没有可展示的 attempt / OpenCode Trace;若刚点击甘特线,请等待 node 详情抓取完成。"});return n.map((i,y)=>{let _=i?.opencodeMessages||{},$=DA(i),r=Mu(_.sessionIds).map((U)=>String(U)).filter(Boolean),j=PM($,r),J=SA(i)||`attempt-${y+1}`,Q=$.reduce((U,F)=>U+Mu(F?.parts).filter((N)=>String(N?.type||"").toLowerCase()==="tool"&&Xw(N)==="failed").length,0);return H("article",{key:J,className:`pipeline-attempt-card ${f===J?"matched":""}`},H("div",{className:"pipeline-attempt-head"},H("div",null,H("strong",null,J),H("span",null,_.source||"opencode")),H("div",{className:"pipeline-attempt-badges"},H("span",null,`${$.length} steps`),H("span",null,`${_.toolCallCount??"--"} tools`),Q>0?H("span",{className:"danger"},`${Q} failed`):null)),H(AQ,{items:[{label:"messages",value:_.messageCount??"--"},{label:"steps",value:_.stepCount??"--"},{label:"tools",value:_.toolCallCount??"--"},{label:"updated",value:Hu(_.updatedAt)},{label:"sessions",value:r.join(", ")||"--"}]}),$.length===0?H("p",{className:"muted paragraph"},"当前 attempt 尚未返回 OpenCode Trace;请确认 D601 pipeline-control 已重建并重新抓取。"):H(MM,{steps:$,sessionIds:r,sessionFacts:j,matchedStepKey:l}))})}function _Q(u,l){return`${u}::${l}`}function VA(u,l,f){if(!pu(u))return null;return String(u.runId||"")===l&&String(u.nodeId||"")===f?u:null}function bM(u,l){let f=pu(u)?u:{};if(!pu(l))return f;let n=Mu(l.attempts),i=Mu(f.attempts);return{...f,...l,attempts:n.length>0?n:i}}function kM(u,l,f,n){if(!VA(l,f,n))return u;let i=Mu(l.procedureRuns),y=pu(u)?u:{};return{...y,...l,controlEvents:Mu(l.controlEvents).length>0?l.controlEvents:y.controlEvents,procedureRuns:i.length>0?i:y.procedureRuns}}function hM({selection:u,runDetails:l,nodeDetails:f,nodeDetailsState:n,onRaw:i,onCollapse:y}){if(!u?.mode)return H("aside",{className:"pipeline-gantt-detail-panel empty","data-testid":"pipeline-gantt-detail-panel"},H("div",{className:"pipeline-gantt-detail-head"},H("div",null,H("span",{className:"panel-eyebrow"},"Gantt Detail"),H(nl,{title:"未选择元素",level:3})),H("button",{type:"button",className:"ghost-btn mini",onClick:y,"data-testid":"pipeline-gantt-sidebar-collapse"},"收起")),H(H0,{title:"选择一条执行线或一个控制点",text:"点击甘特图中的 node 执行线、prompt 点或控制点,在这里查看结构化过程和 OpenCode step。"}));let _=String(u?.runId||""),$=String(u?.interval?.nodeId||u?.marker?.nodeId||""),r=l?.runId===_?l.details:null,j=VA(f,_,$),J=String(n?.runId||"")===_&&String(n?.nodeId||"")===$,Q=kM(r,j,_,$),U=(String(l?.runId||"")!==_||Boolean(l?.loading))&&!Q,F=String(l?.runId||"")===_?String(l?.error||""):"",N=J?String(n?.error||""):"",L=Q?xM(Q,u):null,w=L?.interval||u?.interval||null,W=L?.marker||u?.marker||null,K=String(w?.procedureRunId||W?.procedureRunId||""),q=j?SM(j,K)||jQ(j,w||{procedureRunId:K}):null,z=L?.procedure||(Q?jQ(Q,w||{procedureRunId:K}):null)||w?.raw||{};if(q&&(iQ(z)===0||Jw(q)>=Jw(z)))z=bM(z,q);let Z=L?.attempt||null,T=String(L?.matchedStepKey||"");if(!Z&&W&&iQ(z)>0)Z=Yw(z,W),T=String(tw(Z,Number.isFinite(Number(W?.ms))?Number(W.ms):null).stepKey||"");let c=SA(Z),X=iQ(z)>0,S=J&&Boolean(n?.loading)&&!X,p=Boolean(U||S),Y=[X?"":F,N].filter(Boolean).join(" / "),t=J&&n?.fetchedAt?n.fetchedAt:l?.fetchedAt,m=cw(z?.status||w?.status||W?.status||W?.event),V=u?.mode==="event"?W?.label||Uw(W?.raw||W)||"event":L?.nodeId||w?.nodeId||"node",D=W?pM(W?.raw||W):[],M=W?[Un(W?.raw||W)?`event ${Un(W?.raw||W)}`:"",W?.promptEvent?`prompt ${W.promptEvent}`:"",W?.action?`action ${W.action}`:"",W?.sourceKind?`source ${Qw(W.sourceKind)}`:"",W?.sourceNodeId?`from ${W.sourceNodeId}`:"",W?.targetNodeId?`to ${W.targetNodeId}`:"",W?.snapReason?`draw ${W.snapReason}`:""].filter(Boolean):[];return H("aside",{className:"pipeline-gantt-detail-panel","data-testid":"pipeline-gantt-detail-panel"},H("div",{className:"pipeline-gantt-detail-head"},H("div",null,H("span",{className:"panel-eyebrow"},u?.mode==="event"?"Gantt Event Detail":"Gantt Line Detail"),H(nl,{title:V,level:3,loading:p})),H("div",{className:"pipeline-gantt-detail-head-actions"},H(Gi,{status:m},m),H("button",{type:"button",className:"ghost-btn mini",onClick:y,"data-testid":"pipeline-gantt-sidebar-collapse"},"收起"))),W?H("article",{className:"pipeline-event-card"},H("div",{className:"pipeline-event-card-head"},H("strong",null,W?.label||Uw(W?.raw||W)),H(KQ,{items:M})),H(AQ,{items:[{label:"event time",value:Hu(W?.timestampIso||W?.timestamp||"--")},W?.snapped?{label:"drawn time",value:Hu(W?.renderedTimestampIso||W?.ms)}:null,{label:"node",value:W?.nodeId||"--"},{label:"procedure",value:W?.procedureRunId||h0(z)||"--"},{label:"attempt",value:W?.attempt||c||"--"},{label:"source kind",value:W?.sourceKind?Qw(W.sourceKind):"--"},{label:"source node",value:W?.sourceNodeId||"--"},{label:"target node",value:W?.targetNodeId||"--"},{label:"command",value:W?.commandId||W?.eventId||"--"},W?.snapReason?{label:"placement",value:W.snapReason}:null]}),D.length>0?H("div",{className:"pipeline-event-blocks"},D.map((I,O)=>H("section",{key:`${I.label}-${O}`,className:"pipeline-event-text-block"},H("b",null,I.label),H("p",null,I.value)))):null,Nw(W?.raw||W)?H("p",{className:"pipeline-text-preview"},Nw(W?.raw||W)):null):null,H(AQ,{items:[{label:"epoch",value:_||w?.runId||"--"},{label:"node",value:L?.nodeId||w?.nodeId||W?.nodeId||"--"},{label:"procedure",value:w?.procedureRunId||W?.procedureRunId||h0(z)||"--"},{label:"started",value:Hu(w?.startedAt||z?.startedAt)},{label:"finished",value:Hu(w?.finishedAt||z?.finishedAt)},{label:"duration",value:k0(w?.durationMs||z?.durationMs)},{label:"fetched",value:t?Al(t):"--"},L?.matchedStep?{label:"matched step",value:`Step ${L.matchedStep.index??L.matchedStepIndex+1}`}:null]}),H(ul,{error:Y}),H("div",{className:"pipeline-gantt-detail-actions"},H(Nn,{title:`Procedure ${w?.procedureRunId||W?.procedureRunId||L?.nodeId||"node"}`,data:z,onOpen:i,testId:"raw-pipeline-gantt-procedure"}),W?H(Nn,{title:`Pipeline event ${W?.id||W?.commandId||W?.eventId||L?.nodeId||"event"}`,data:W?.raw||W,onOpen:i,testId:"raw-pipeline-gantt-event"}):null,Q?H(Nn,{title:`Pipeline run ${_||"--"}`,data:Q,onOpen:i,testId:"raw-pipeline-gantt-node-details"}):null),!p&&!h0(z)&&!W?H(H0,{title:"暂无过程详情",text:"当前选择还没有可匹配的 procedure 运行记录。"}):null,!p&&h0(z)?H(RM,{procedure:z,matchedStepKey:T,matchedAttemptId:c}):null)}function IM({value:u}){let f=String(u||"--").split(/([_-])/u);return H(zi.default.Fragment,null,f.map((n,i)=>n==="-"||n==="_"?H(zi.default.Fragment,{key:i},n,H("wbr",null)):H(zi.default.Fragment,{key:i},n)))}async function qi(u,l={}){return Zu(u,{invalidJsonPrefix:"Pipeline 返回了无效 JSON",...l})}function Gi({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return H("span",{className:`status-badge ${f}`},l||u||"unknown")}function gf({label:u,value:l,hint:f,tone:n}){return H("article",{className:`metric-card ${n||""}`},H("div",{className:"metric-label"},u),H("div",{className:"metric-value"},l),H("div",{className:"metric-hint"},f))}function Mn({title:u,eyebrow:l,actions:f,children:n,className:i,loading:y}){return H("section",{className:`panel ${i||""}`},H("div",{className:"panel-head"},H("div",null,l?H("p",{className:"panel-eyebrow"},l):null,H(nl,{title:u,loading:y})),f?H("div",{className:"panel-actions"},f):null),H("div",{className:"panel-body"},n))}function Nn({title:u,data:l,onOpen:f,testId:n}){return H("button",{type:"button",className:"ghost-btn","data-testid":n,onClick:()=>f(u,l)},"查看原始JSON")}function b0({title:u,subtitle:l,facts:f,data:n,onRaw:i,testId:y}){let _=Mu(f).map(($)=>String($||"")).filter(Boolean);return H("article",{className:"pipeline-evidence-row"},H("div",{className:"pipeline-evidence-main"},H("strong",null,u),l?H("span",null,l):null),H("div",{className:"pipeline-evidence-facts"},_.map(($,r)=>H("span",{key:`${r}-${$.slice(0,16)}`},$))),n!==void 0?H(Nn,{title:u,data:n,onOpen:i,testId:y}):null)}function H0({title:u,text:l}){return H("div",{className:"empty-state"},H("strong",null,u),H("span",null,l))}function vM(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function gM(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function sM(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function aM(u){return{components:Array.isArray(u?.registry?.components)?u.registry.components:[],pipelines:Array.isArray(u?.pipelines)?u.pipelines:[],runs:Array.isArray(u?.runs)?u.runs:[]}}function Fw(u,l,f){let n=u?._unidesk?.arrayLimits?.[l],i=Number(n?.originalLength);return Number.isFinite(i)?i:f}function Dw(u){if(!u||typeof u!=="object"||Array.isArray(u))return"--";return`${u.componentClass||"--"}/${u.id||"--"}`}function BA(u){if(!u||typeof u!=="object"||Array.isArray(u))return"";let l=String(u.componentClass||"").trim(),f=String(u.id||"").trim();return l&&f?`${l}/${f}`:""}function zQ(u){return u?.config&&typeof u.config==="object"&&!Array.isArray(u.config)?u.config:{}}function Sw(u){let l=zQ(u),f=Array.isArray(l.nodes)?l.nodes:Array.isArray(u?.nodes)?u.nodes:[],n=new Map;for(let _ of f){let $=String(_?.id||_?.nodeId||"");if($)n.set($,{..._,id:$})}let i=GQ(u),y=(_)=>{if(_&&!n.has(_))n.set(_,{id:_})};for(let _ of wQ(u))Xr(_).forEach(y);for(let _ of i)y(String(_?.from||_?.source||"")),y(String(_?.to||_?.target||""));return Array.from(n.values())}function GQ(u){let l=zQ(u);return Array.isArray(l.edges)?l.edges:Array.isArray(u?.edges)?u.edges:[]}function wQ(u){let l=zQ(u);return Array.isArray(l.topologicalBatches)?l.topologicalBatches:Array.isArray(u?.topologicalBatches)?u.topologicalBatches:[]}function oM(u){let l=new Map;for(let f of u){let n=BA(f);if(n)l.set(n,f);let i=Array.isArray(f?.refs)?f.refs:[];for(let y of i){let _=BA(y);if(_)l.set(_,f)}}return l}function Ww(u,l){let f=l.get(BA(u?.componentRef));if(f)return f;let n=BA({componentClass:u?.kind,id:u?.id});return n?l.get(n)||null:null}function qw(u,l){let f=Pw(u,l);return String(f?.status||"pending")}function Pw(u,l){return(Array.isArray(u?.nodes)?u.nodes:[]).find((n)=>n?.nodeId===l||n?.id===l)||null}function dM(u){return u.reduce((l,f)=>{let n=String(f?.status||"unknown").toLowerCase();return l[n]=(l[n]||0)+1,l},{})}function eM(u){if(Array.isArray(u?.scorers))return u.scorers.filter(pu);if(Array.isArray(u?.summary?.scorers))return u.summary.scorers.filter(pu);if(Array.isArray(u?.artifact?.summary?.scorers))return u.artifact.summary.scorers.filter(pu);return[]}function uC(u){if(pu(u?.run))return u.run;if(pu(u?.runSummary))return u.runSummary;return null}function lC(u,l){if(!pu(u)&&!pu(l))return null;if(!pu(u))return l;if(!pu(l))return u;return{...u,...l,request:pu(u.request)||pu(l.request)?{...pu(u.request)?u.request:{},...pu(l.request)?l.request:{}}:l.request??u.request,artifact:pu(u.artifact)||pu(l.artifact)?{...pu(u.artifact)?u.artifact:{},...pu(l.artifact)?l.artifact:{}}:l.artifact??u.artifact,summary:pu(u.summary)||pu(l.summary)?{...pu(u.summary)?u.summary:{},...pu(l.summary)?l.summary:{}}:l.summary??u.summary}}function cA(u){let l=eM(u),f=l.find((J)=>pu(J?.score))||l[0]||null,n=pu(f?.score)?f.score:{},i=Number(n.passed),y=Number(n.total),_=Number(n.ratio),$=Number.isFinite(_)?_:Number.isFinite(i)&&Number.isFinite(y)&&y>0?i/y:null,r=$===null?null:Math.round(Math.max(0,Math.min(100,$<=1?$*100:$))),j=String(n.text||(Number.isFinite(i)&&Number.isFinite(y)?`${i}/${y}`:""));return{scorer:f,scorers:l,score:n,passed:Number.isFinite(i)?i:null,total:Number.isFinite(y)?y:null,percent:r,text:j}}function UQ(u){let l=cA(u);return l.text||(l.scorers.length>0?String(l.scorer?.status||"pending"):"--")}function ZQ(u){let l=cA(u);if(l.total>0&&l.passed===l.total)return"succeeded";if(l.total>0&&l.passed>0)return"running";if(l.scorers.length>0)return"failed";return"pending"}function fC(u){return Array.isArray(u?.items)?u.items.filter(pu):[]}function nC({run:u}){let l=UQ(u);return H("span",{className:`pipeline-score-badge ${ZQ(u)}`},`score ${l}`)}function iC({run:u,onRaw:l}){let n=cA(u).scorers;if(!u)return H(H0,{title:"暂无评分",text:"选择一个 epoch 后会显示 scorer 结果。"});if(n.length===0)return H("div",{className:"pipeline-score-empty"},H("strong",null,"评分器等待中"),H("span",null,"DAG 完成后,Pipeline control backend 会把 scorer summary 追加到 run artifact,并通过 UniDesk 显示。"));return H("div",{className:"pipeline-score-board","data-testid":"pipeline-score-board"},n.map((i,y)=>{let _=cA({scorers:[i]}),$=fC(i),r=_.percent??0;return H("article",{key:`${i.scorerId||i.component||y}`,className:`pipeline-score-card ${ZQ({scorers:[i]})}`},H("div",{className:"pipeline-score-head"},H("div",null,H("span",null,i.scorerId||i.component||"scorer"),H("strong",null,_.text||i.status||"--")),H(Gi,{status:i.status||"unknown"},i.status||"unknown")),H("div",{className:"pipeline-score-meter","aria-label":`score ${r}%`},H("span",{style:{width:`${r}%`}})),H("div",{className:"pipeline-score-facts"},H("span",null,`${r}%`),H("span",null,i.component||"--"),H("span",null,i.applicationCheckoutRef||"--")),$.length>0?H("div",{className:"pipeline-score-items"},$.map((j)=>H("span",{key:`${j.id||j.filter}`,className:`pipeline-score-item ${String(j.status||"").toLowerCase()}`,title:`${j.filter||"--"} / ran=${j.ran??"?"}`},H("b",null,j.id||"--"),H("small",null,j.status||"--")))):H("p",{className:"muted paragraph"},"当前 scorer 尚未返回 item 级结果。"),i.error?H("p",{className:"pipeline-score-error"},Bw(i.error,360)):null,H("div",{className:"panel-actions inline-actions"},H(Nn,{title:`Scorer ${i.scorerId||y}`,data:i,onOpen:l,testId:"raw-pipeline-score"})))}))}function yC(u){let l=u.reduce((f,n)=>{let i=String(n?.componentClass||"unknown");return f[i]=(f[i]||0)+1,f},{});return Object.entries(l).map(([f,n])=>({name:f,count:Number(n)})).sort((f,n)=>n.count-f.count||f.name.localeCompare(n.name))}function Xr(u){if(Array.isArray(u))return u.map((l)=>typeof l==="string"?l:String(l?.id||l?.nodeId||"")).filter(Boolean);if(Array.isArray(u?.nodes))return Xr(u.nodes);if(Array.isArray(u?.nodeIds))return Xr(u.nodeIds);return[]}function _C(u){return pu(u?.instanceInputs?.monitor)?u.instanceInputs.monitor:{}}function Mw(u,l){if(String(u?.kind||"").toLowerCase()!=="procedure")return!1;let f=_C(u);if(u?.instanceInputs?.monitorMode===!0||f.enabled===!0)return!0;let n=Dw(u?.componentRef);return String(l?.id||l?.config?.id||n||"").toLowerCase().includes("monitor")}function $C(u){return u.filter((l)=>Mw(l)).map((l)=>String(l?.id||"")).filter(Boolean)}function rC(u,l){if(l.length===0)return u;let f=new Set(l),n=l.filter((i)=>u.includes(i));if(n.length===0)return u;return[...n,...u.filter((i)=>!f.has(i))]}function AC(u,l){if(l.length===0)return u;let f=new Set(l),n=l.filter((y)=>u.some((_)=>_.includes(y)));if(n.length===0)return u;let i=u.map((y)=>y.filter((_)=>!f.has(_))).filter((y)=>y.length>0);return[n,...i]}function jC(u,l,f){let i=wQ(u).map(Xr).filter((U)=>U.length>0);if(i.length>0)return i;let y=l.map((U)=>String(U?.id||"")).filter(Boolean),_=new Set(y),$=new Map(y.map((U)=>[U,0])),r=new Map(y.map((U)=>[U,[]]));for(let U of f){let F=String(U?.from||U?.source||""),N=String(U?.to||U?.target||"");if(!_.has(F)||!_.has(N))continue;r.get(F)?.push(N),$.set(N,($.get(N)||0)+1)}let j=new Map,J=y.filter((U)=>($.get(U)||0)===0);for(let U of J)j.set(U,0);while(J.length>0){let U=J.shift(),F=(j.get(U)||0)+1;for(let N of r.get(U)||[])if($.set(N,Math.max(0,($.get(N)||0)-1)),j.set(N,Math.max(j.get(N)||0,F)),($.get(N)||0)===0)J.push(N)}y.forEach((U)=>{if(!j.has(U))j.set(U,0)});let Q=Math.max(0,...Array.from(j.values()));return Array.from({length:Q+1},(U,F)=>y.filter((N)=>j.get(N)===F)).filter((U)=>U.length>0)}function JC(u,l,f){let i=wQ(u).map(Xr).filter(($)=>$.length>0),y=i.length>0?i.flatMap(($)=>$):(()=>{let $=l.map((L)=>String(L?.id||"")).filter(Boolean),r=new Set($),j=f.filter((L)=>String(L?.edgeType||"").toLowerCase()!=="rework"),J=new Map($.map((L)=>[L,0])),Q=new Map($.map((L)=>[L,[]]));for(let L of j){let w=String(L?.from||L?.source||""),W=String(L?.to||L?.target||"");if(!r.has(w)||!r.has(W))continue;Q.get(w)?.push(W),J.set(W,(J.get(W)||0)+1)}let U=new Map,F=$.filter((L)=>(J.get(L)||0)===0);for(let L of F)U.set(L,0);while(F.length>0){let L=F.shift(),w=(U.get(L)||0)+1;for(let W of Q.get(L)||[])if(J.set(W,Math.max(0,(J.get(W)||0)-1)),U.set(W,Math.max(U.get(W)||0,w)),(J.get(W)||0)===0)F.push(W)}$.forEach((L)=>{if(!U.has(L))U.set(L,0)});let N=Math.max(0,...Array.from(U.values()));return Array.from({length:N+1},(L,w)=>$.filter((W)=>U.get(W)===w)).flatMap((L)=>L)})(),_=new Set(y);for(let $ of l){let r=String($?.id||"");if(!r||_.has(r))continue;y.push(r),_.add(r)}return rC(y,$C(l))}function Er(u){return`${u.source}->${u.target}-${u.index}`}function Lw(u,l,f){let n=Sw(u),i=GQ(u),y=oM(f),_=new Map(n.map((m)=>[String(m?.id||""),m])),$=n.filter((m)=>Mw(m,Ww(m,y))).map((m)=>String(m?.id||"")).filter(Boolean),r=AC(jC(u,n,i),$),j=[],J=new Map,Q=330,U=122;r.forEach((m,V)=>{let D=m.length*122;m.forEach((M,I)=>{let O=_.get(M)||{id:M},C=Ww(O,y),g=qw(l,M).toLowerCase(),a=String(O.kind||C?.componentClass||"node").toLowerCase(),iu=Dw(O.componentRef||C),Au=String(C?.config?.version||C?.version||""),R=String(C?.config?.description||C?.description||""),x=I*122-Math.floor(D/2);J.set(M,{column:V,row:I,y:x}),j.push({id:M,type:"pipelineNode",position:{x:V*330,y:x},data:{exportLabel:{id:M,kind:a,componentRef:iu,componentVersion:Au,componentDescription:R,status:g},label:H("div",{className:"flow-node-label"},H("strong",null,M),H("span",null,a),H("code",{title:R||iu},Au?`${iu}@${Au}`:iu),H(Gi,{status:g},g))},className:`pipeline-flow-node ${a} ${g}`})})});let F=i.flatMap((m,V)=>{let D=String(m?.from||m?.source||""),M=String(m?.to||m?.target||"");if(!_.has(D)||!_.has(M))return[];return[{source:D,target:M,index:V,condition:m?.condition,edgeType:m?.edgeType}]}),N=F.reduce((m,V)=>m.set(V.source,(m.get(V.source)||0)+1),new Map),L=F.reduce((m,V)=>m.set(V.target,(m.get(V.target)||0)+1),new Map),w=F.reduce((m,V)=>{let D=`${V.source}->${V.target}`;return m.set(D,(m.get(D)||0)+1)},new Map),W=new Map,K=new Map,q=new Map,z=new Map,Z=new Map,T=new Map,c=F.reduce((m,V)=>{let D=J.get(V.source),M=J.get(V.target),I=(M?.column||0)-(D?.column||0);if(I<=0||String(V.edgeType||"").toLowerCase()==="rework"||I!==1)return m;let C=`${V.source}->column:${M?.column??""}`,g=m.get(C)||[];return g.push(V),m.set(C,g),m},new Map);for(let m of c.values()){if(m.length<2)continue;m.slice().sort((V,D)=>{let M=J.get(V.target),I=J.get(D.target);return(M?.y||0)-(I?.y||0)||V.index-D.index}).forEach((V,D,M)=>{T.set(Er(V),{slot:D-(M.length-1)/2,count:M.length})})}[...F].sort((m,V)=>{let D=J.get(m.source),M=J.get(m.target),I=J.get(V.source),O=J.get(V.target),C=Math.abs((M?.column||0)-(D?.column||0))*330+Math.abs((M?.y||0)-(D?.y||0)),g=Math.abs((O?.column||0)-(I?.column||0))*330+Math.abs((O?.y||0)-(I?.y||0));return C-g||m.index-V.index}).forEach((m)=>{let V=J.get(m.source)||{column:0,row:0,y:0},D=J.get(m.target)||{column:0,row:0,y:0},M=D.column-V.column,I=Math.max(0,M),O=M<=0||String(m.edgeType||"").toLowerCase()==="rework",C=V.y-D.y,g=L.get(m.target)||1,a=T.has(Er(m)),iu=!O&&I<=1&&(a||g===1),Au=Z.get(m.target)||new Map;Z.set(m.target,Au);let R=Br.slice().sort((x,fu)=>{let yu=(Bu)=>{let b=String(Bu.side),o=0;if(O){if(b==="left")o+=86;if(b==="top")o+=D.y<=0?-22:12;if(b==="bottom")o+=D.y>=0?-22:12;if(Math.abs(D.y)<12&&b!=="left")o+=m.index%2===0?b==="top"?-6:6:b==="bottom"?-6:6;return o}if(iu){if(b==="left")o-=a?72:44;if(b!=="left")o+=a?72:44;return o+Math.abs(C)*0.02}if(b==="left")o+=I<=1?0:24;if(b==="top")o+=C<-36?-18:42;if(b==="bottom")o+=C>36?-18:42;if(I<=1&&Math.abs(C)<=82&&b!=="left")o+=38;if(I>1&&b!=="left")o-=10;return o},Ju=V.y-D.y,Vu=Ju!==0?Ju:m.index%2===0?-1:1,Lu=(Bu)=>{let b=Au.get(Bu.id)||0;return yu(Bu)+b*64+BM(Bu,Au,Vu)};return Lu(x)-Lu(fu)||String(x.id).localeCompare(String(fu.id))})[0];Au.set(R.id,(Au.get(R.id)||0)+1),z.set(Er(m),R)});let S=F.map((m)=>{let V=qw(l,m.target).toLowerCase(),D=`${m.source}->${m.target}`,M=W.get(m.source)||0,I=K.get(m.target)||0,O=q.get(D)||0;W.set(m.source,M+1),K.set(m.target,I+1),q.set(D,O+1);let C=M-((N.get(m.source)||1)-1)/2,g=I-((L.get(m.target)||1)-1)/2,a=O-((w.get(D)||1)-1)/2,iu=J.get(m.source),Au=J.get(m.target),R=(Au?.column||0)-(iu?.column||0),x=Math.max(1,Math.abs(R)),fu=R<=0||String(m.edgeType||"").toLowerCase()==="rework",yu=Math.abs((Au?.y||0)-(iu?.y||0)),Ju=T.get(Er(m)),Vu=!fu&&R===1&&(L.get(m.target)||0)>1,Lu=Ju?Ju.slot:a*2+C+g*0.45,Bu=Lu===0?m.index%2===0?-1:1:Math.sign(Lu),b=z.get(Er(m))||Br[1],o=b.side==="top"?-1:b.side==="bottom"?1:Bu,nu=fu||x>1||yu>96||Math.abs(Lu)>0.2||b.side!=="left",wu=fu?118+x*18:22+x*16,e=b.side==="left"?0:28,zu=nu?Math.max(-280,Math.min(280,o*Math.min(180,wu+e+yu*0.22)+Lu*28)):0,v=Math.max(0,Math.min(Or.length-1,Math.round(C+(Or.length-1)/2))),$u=Or[v]||Or[1],Wu=V==="succeeded"?"var(--accent-2)":V==="running"?"var(--accent)":V==="failed"?"var(--danger)":"rgba(129, 147, 159, 0.78)",Du=iu?.column||0,ku=Au?.column||0,$l=zu===0?0:Math.sign(zu),gu=fu?`feedback:${Du}->${ku}:${$l}`:Ju?`fanout:${Du}->${ku}:${m.source}`:Vu?`fanin:${Du}->${ku}:${m.target}`:b.side!=="left"||x>1?`corridor:${Du}->${ku}:${b.side}:${$l}:${Math.round(Math.abs(zu)/56)}`:"";return{id:`${m.source}->${m.target}-${m.index}`,source:m.source,target:m.target,sourceHandle:$u.id,targetHandle:b.id,type:"pipelineCurve",zIndex:12,animated:V==="running",data:{baseEdgeColor:Wu,laneOffset:zu,routeMode:Ju&&b.side==="left"?"direct-forward-left":"",targetSide:b.side,isFeedback:fu,overlapGroup:gu},targetStatus:V}}),p=S.reduce((m,V)=>{let D=String(V.data?.overlapGroup||"");return D?m.set(D,(m.get(D)||0)+1):m},new Map),Y=new Map,t=S.map((m)=>{let V=String(m.targetStatus||"pending"),D={...m};delete D.targetStatus;let M=String(m.data?.overlapGroup||""),I=M?p.get(M)||0:0,O=I>1?Y.get(M)||0:-1;if(I>1)Y.set(M,O+1);let C=O>=0?yw[O%yw.length]:String(m.data.baseEdgeColor),g={stroke:C};if(m.data.isFeedback)g.strokeDasharray="9 7";return{...D,data:{...m.data,edgeColor:C,overlapSlot:O,overlapCount:I},style:g,markerEnd:{type:Ui.ArrowClosed,color:C},className:`pipeline-flow-edge ${V} ${m.data.isFeedback?"feedback":""} ${O>=0?"overlap-colored":""}`}});return{nodes:j,edges:t}}function $0(u){return String(u??"").replace(/&/g,"&").replace(//g,">").replace(/"/g,""")}function Kw(u){let l=String(u||"");if(l.includes("--accent-2"))return"#4eb7a8";if(l.includes("--accent"))return"#d7a13a";if(l.includes("--danger"))return"#cf6a54";return l.startsWith("#")?l:"#81939f"}function XA(u){return`arrow-${u.replace(/[^a-zA-Z0-9_-]+/g,"")}`}function Cw(u,l="pipeline"){return String(u||l).replace(/[^a-zA-Z0-9_-]+/g,"-").replace(/^-|-$/g,"")||l}function zw(u,l){let f=u.position.x,n=u.position.y,i=Br.find((y)=>y.id===l);if(i?.side==="top")return{x:f+e_*rw(i.style?.left,0.5),y:n,position:Xu.Top};if(i?.side==="bottom")return{x:f+e_*rw(i.style?.left,0.5),y:n+u$,position:Xu.Bottom};return{x:f,y:n+u$/2,position:Xu.Left}}function QC(u){return{x:u.position.x+e_,y:u.position.y+u$/2}}function UC(u,l){let f=Math.min(...u.nodes.map((L)=>L.position.x),0)-220,n=Math.min(...u.nodes.map((L)=>L.position.y),0)-220,i=Math.max(...u.nodes.map((L)=>L.position.x+e_),1)+220,y=Math.max(...u.nodes.map((L)=>L.position.y+u$),1)+220,_=Math.ceil(i-f),$=Math.ceil(y-n),r=new Map(u.nodes.map((L)=>[L.id,L])),j=u.edges.map((L)=>Kw(L.data?.edgeColor||L.style?.stroke)),Q=Array.from(new Set(["#4eb7a8","#d7a13a","#cf6a54","#81939f",...j])).map((L)=>``).join(""),U=u.edges.flatMap((L)=>{let w=r.get(L.source),W=r.get(L.target);if(!w||!W)return[];let K=QC(w),q=zw(W,String(L.targetHandle||"in-left")),z=Ow(K.x,K.y,q.x,q.y,q.position,Number(L.data?.laneOffset||0),String(L.data?.routeMode||"")),Z=Kw(L.data?.edgeColor||L.style?.stroke),T=L.data?.isFeedback?' stroke-dasharray="9 7"':"";return``}).join(` -`),F=u.nodes.map((L)=>{let w=L.data?.exportLabel||{},W=String(w.status||"pending").toLowerCase(),K=W==="succeeded"?"#4eb7a8":W==="running"?"#d7a13a":W==="failed"?"#cf6a54":"#81939f",q=L.position.x,z=L.position.y,Z=Br.map((T)=>{let c=zw(L,T.id);if(T.side==="top"||T.side==="bottom")return``;return``}).join(` +`)),J=j.reduce((Q,U)=>Q.concat(...U),[]);return[j,J]}return[[],[]]},[u]);return ju.useEffect(()=>{let A=l?.target??_G,j=l?.actInsideInputWithModifier??!0;if(u!==null){let J=(F)=>{if(y.current=F.ctrlKey||F.metaKey||F.shiftKey||F.altKey,(!y.current||y.current&&!j)&&CJ(F))return!1;let K=AG(F.code,$);if(i.current.add(F[K]),$G(_,i.current,!1)){let G=F.composedPath?.()?.[0]||F.target,W=G?.nodeName==="BUTTON"||G?.nodeName==="A";if(l.preventDefault!==!1&&(y.current||!W))F.preventDefault();n(!0)}},Q=(F)=>{let N=AG(F.code,$);if($G(_,i.current,!0))n(!1),i.current.clear();else i.current.delete(F[N]);if(F.key==="Meta")i.current.clear();y.current=!1},U=()=>{i.current.clear(),n(!1)};return A?.addEventListener("keydown",J),A?.addEventListener("keyup",Q),window.addEventListener("blur",U),window.addEventListener("contextmenu",U),()=>{A?.removeEventListener("keydown",J),A?.removeEventListener("keyup",Q),window.removeEventListener("blur",U),window.removeEventListener("contextmenu",U)}}},[u,n]),f}function $G(u,l,f){return u.filter((n)=>f||n.length===l.size).some((n)=>n.every((y)=>l.has(y)))}function AG(u,l){return l.includes(u)?"code":"key"}var PS=()=>{let u=Pl();return ju.useMemo(()=>{return{zoomIn:(l)=>{let{panZoom:f}=u.getState();return f?f.scaleBy(1.2,l):Promise.resolve(!1)},zoomOut:(l)=>{let{panZoom:f}=u.getState();return f?f.scaleBy(0.8333333333333334,l):Promise.resolve(!1)},zoomTo:(l,f)=>{let{panZoom:n}=u.getState();return n?n.scaleTo(l,f):Promise.resolve(!1)},getZoom:()=>u.getState().transform[2],setViewport:async(l,f)=>{let{transform:[n,y,i],panZoom:_}=u.getState();if(!_)return Promise.resolve(!1);return await _.setViewport({x:l.x??n,y:l.y??y,zoom:l.zoom??i},f),Promise.resolve(!0)},getViewport:()=>{let[l,f,n]=u.getState().transform;return{x:l,y:f,zoom:n}},setCenter:async(l,f,n)=>{return u.getState().setCenter(l,f,n)},fitBounds:async(l,f)=>{let{width:n,height:y,minZoom:i,maxZoom:_,panZoom:$}=u.getState(),A=w6(l,n,y,i,_,f?.padding??0.1);if(!$)return Promise.resolve(!1);return await $.setViewport(A,{duration:f?.duration,ease:f?.ease,interpolate:f?.interpolate}),Promise.resolve(!0)},screenToFlowPosition:(l,f={})=>{let{transform:n,snapGrid:y,snapToGrid:i,domNode:_}=u.getState();if(!_)return l;let{x:$,y:A}=_.getBoundingClientRect(),j={x:l.x-$,y:l.y-A},J=f.snapGrid??y,Q=f.snapToGrid??i;return g_(j,n,Q,J)},flowToScreenPosition:(l)=>{let{transform:f,domNode:n}=u.getState();if(!n)return l;let{x:y,y:i}=n.getBoundingClientRect(),_=z6(l,f);return{x:_.x+y,y:_.y+i}}}},[])};function BG(u,l){let f=[],n=new Map,y=[];for(let i of u)if(i.type==="add"){y.push(i);continue}else if(i.type==="remove"||i.type==="replace")n.set(i.id,[i]);else{let _=n.get(i.id);if(_)_.push(i);else n.set(i.id,[i])}for(let i of l){let _=n.get(i.id);if(!_){f.push(i);continue}if(_[0].type==="remove")continue;if(_[0].type==="replace"){f.push({..._[0].item});continue}let $={...i};for(let A of _)MS(A,$);f.push($)}if(y.length)y.forEach((i)=>{if(i.index!==void 0)f.splice(i.index,0,{...i.item});else f.push({...i.item})});return f}function MS(u,l){switch(u.type){case"select":{l.selected=u.selected;break}case"position":{if(typeof u.position<"u")l.position=u.position;if(typeof u.dragging<"u")l.dragging=u.dragging;break}case"dimensions":{if(typeof u.dimensions<"u"){if(l.measured={...u.dimensions},u.setAttributes){if(u.setAttributes===!0||u.setAttributes==="width")l.width=u.dimensions.width;if(u.setAttributes===!0||u.setAttributes==="height")l.height=u.dimensions.height}}if(typeof u.resizing==="boolean")l.resizing=u.resizing;break}}}function CS(u,l){return BG(u,l)}function pS(u,l){return BG(u,l)}function zi(u,l){return{id:u,type:"select",selected:l}}function o_(u,l=new Set,f=!1){let n=[];for(let[y,i]of u){let _=l.has(y);if(!(i.selected===void 0&&!_)&&i.selected!==_){if(f)i.selected=_;n.push(zi(i.id,_))}}return n}function rG({items:u=[],lookup:l}){let f=[],n=new Map(u.map((y)=>[y.id,y]));for(let[y,i]of u.entries()){let _=l.get(i.id),$=_?.internals?.userNode??_;if($!==void 0&&$!==i)f.push({id:i.id,item:i,type:"replace"});if($===void 0)f.push({item:i,type:"add",index:y})}for(let[y]of l)if(n.get(y)===void 0)f.push({id:y,type:"remove"});return f}function jG(u){return{id:u.id,type:"remove"}}var JG=(u)=>Uz(u),xS=(u)=>TJ(u);function XG(u){return ju.forwardRef(u)}function QG(u){let[l,f]=ju.useState(BigInt(0)),[n]=ju.useState(()=>mS(()=>f((y)=>y+BigInt(1))));return oJ(()=>{let y=n.get();if(y.length)u(y),n.reset()},[l]),n}function mS(u){let l=[];return{get:()=>l,reset:()=>{l=[]},push:(f)=>{l.push(f),u()}}}var cG=ju.createContext(null);function RS({children:u}){let l=Pl(),f=ju.useCallback(($)=>{let{nodes:A=[],setNodes:j,hasDefaultNodes:J,onNodesChange:Q,nodeLookup:U,fitViewQueued:F,onNodesChangeMiddlewareMap:N}=l.getState(),K=A;for(let W of $)K=typeof W==="function"?W(K):W;let G=rG({items:K,lookup:U});for(let W of N.values())G=W(G);if(J)j(K);if(G.length>0)Q?.(G);else if(F)window.requestAnimationFrame(()=>{let{fitViewQueued:W,nodes:L,setNodes:q}=l.getState();if(W)q(L)})},[]),n=QG(f),y=ju.useCallback(($)=>{let{edges:A=[],setEdges:j,hasDefaultEdges:J,onEdgesChange:Q,edgeLookup:U}=l.getState(),F=A;for(let N of $)F=typeof N==="function"?N(F):N;if(J)j(F);else if(Q)Q(rG({items:F,lookup:U}))},[]),i=QG(y),_=ju.useMemo(()=>({nodeQueue:n,edgeQueue:i}),[]);return _u.jsx(cG.Provider,{value:_,children:u})}function bS(){let u=ju.useContext(cG);if(!u)throw Error("useBatchContext must be used within a BatchProvider");return u}var kS=(u)=>!!u.panZoom;function eJ(){let u=PS(),l=Pl(),f=bS(),n=Ql(kS),y=ju.useMemo(()=>{let i=(Q)=>l.getState().nodeLookup.get(Q),_=(Q)=>{f.nodeQueue.push(Q)},$=(Q)=>{f.edgeQueue.push(Q)},A=(Q)=>{let{nodeLookup:U,nodeOrigin:F}=l.getState(),N=JG(Q)?Q:U.get(Q.id),K=N.parentId?SJ(N.position,N.measured,N.parentId,U,F):N.position,G={...N,position:K,width:N.measured?.width??N.width,height:N.measured?.height??N.height};return Ki(G)},j=(Q,U,F={replace:!1})=>{_((N)=>N.map((K)=>{if(K.id===Q){let G=typeof U==="function"?U(K):U;return F.replace&&JG(G)?G:{...K,...G}}return K}))},J=(Q,U,F={replace:!1})=>{$((N)=>N.map((K)=>{if(K.id===Q){let G=typeof U==="function"?U(K):U;return F.replace&&xS(G)?G:{...K,...G}}return K}))};return{getNodes:()=>l.getState().nodes.map((Q)=>({...Q})),getNode:(Q)=>i(Q)?.internals.userNode,getInternalNode:i,getEdges:()=>{let{edges:Q=[]}=l.getState();return Q.map((U)=>({...U}))},getEdge:(Q)=>l.getState().edgeLookup.get(Q),setNodes:_,setEdges:$,addNodes:(Q)=>{let U=Array.isArray(Q)?Q:[Q];f.nodeQueue.push((F)=>[...F,...U])},addEdges:(Q)=>{let U=Array.isArray(Q)?Q:[Q];f.edgeQueue.push((F)=>[...F,...U])},toObject:()=>{let{nodes:Q=[],edges:U=[],transform:F}=l.getState(),[N,K,G]=F;return{nodes:Q.map((W)=>({...W})),edges:U.map((W)=>({...W})),viewport:{x:N,y:K,zoom:G}}},deleteElements:async({nodes:Q=[],edges:U=[]})=>{let{nodes:F,edges:N,onNodesDelete:K,onEdgesDelete:G,triggerNodeChanges:W,triggerEdgeChanges:L,onDelete:q,onBeforeDelete:z}=l.getState(),{nodes:Z,edges:T}=await Wz({nodesToRemove:Q,edgesToRemove:U,nodes:F,edges:N,onBeforeDelete:z}),X=T.length>0,c=Z.length>0;if(X){let S=T.map(jG);G?.(T),L(S)}if(c){let S=Z.map(jG);K?.(Z),W(S)}if(c||X)q?.({nodes:Z,edges:T});return{deletedNodes:Z,deletedEdges:T}},getIntersectingNodes:(Q,U=!0,F)=>{let N=YJ(Q),K=N?Q:A(Q),G=F!==void 0;if(!K)return[];return(F||l.getState().nodes).filter((W)=>{let L=l.getState().nodeLookup.get(W.id);if(L&&!N&&(W.id===Q.id||!L.internals.positionAbsolute))return!1;let q=Ki(G?W:L),z=I_(q,K);return U&&z>0||z>=q.width*q.height||z>=K.width*K.height})},isNodeIntersecting:(Q,U,F=!0)=>{let K=YJ(Q)?Q:A(Q);if(!K)return!1;let G=I_(K,U);return F&&G>0||G>=U.width*U.height||G>=K.width*K.height},updateNode:j,updateNodeData:(Q,U,F={replace:!1})=>{j(Q,(N)=>{let K=typeof U==="function"?U(N):U;return F.replace?{...N,data:K}:{...N,data:{...N.data,...K}}},F)},updateEdge:J,updateEdgeData:(Q,U,F={replace:!1})=>{J(Q,(N)=>{let K=typeof U==="function"?U(N):U;return F.replace?{...N,data:K}:{...N,data:{...N.data,...K}}},F)},getNodesBounds:(Q)=>{let{nodeLookup:U,nodeOrigin:F}=l.getState();return BJ(Q,{nodeLookup:U,nodeOrigin:F})},getHandleConnections:({type:Q,id:U,nodeId:F})=>Array.from(l.getState().connectionLookup.get(`${F}-${Q}${U?`-${U}`:""}`)?.values()??[]),getNodeConnections:({type:Q,handleId:U,nodeId:F})=>Array.from(l.getState().connectionLookup.get(`${F}${Q?U?`-${Q}-${U}`:`-${Q}`:""}`)?.values()??[]),fitView:async(Q)=>{let U=l.getState().fitViewResolver??Kz();return l.setState({fitViewQueued:!0,fitViewOptions:Q,fitViewResolver:U}),f.nodeQueue.push((F)=>[...F]),U.promise}}},[]);return ju.useMemo(()=>{return{...y,...u,viewportInitialized:n}},[n])}var UG=(u)=>u.selected,hS=typeof window<"u"?window:void 0;function IS({deleteKeyCode:u,multiSelectionKeyCode:l}){let f=Pl(),{deleteElements:n}=eJ(),y=E6(u,{actInsideInputWithModifier:!1}),i=E6(l,{target:hS});ju.useEffect(()=>{if(y){let{edges:_,nodes:$}=f.getState();n({nodes:$.filter(UG),edges:_.filter(UG)}),f.setState({nodesSelectionActive:!1})}},[y]),ju.useEffect(()=>{f.setState({multiSelectionActive:i})},[i])}function vS(u){let l=Pl();ju.useEffect(()=>{let f=()=>{if(!u.current||!(u.current.checkVisibility?.()??!0))return!1;let n=_r(u.current);if(n.height===0||n.width===0)l.getState().onError?.("004",H0.error004());l.setState({width:n.width||500,height:n.height||500})};if(u.current){f(),window.addEventListener("resize",f);let n=new ResizeObserver(()=>f());return n.observe(u.current),()=>{if(window.removeEventListener("resize",f),n&&u.current)n.unobserve(u.current)}}},[])}var Gr={position:"absolute",width:"100%",height:"100%",top:0,left:0},gS=(u)=>({userSelectionActive:u.userSelectionActive,lib:u.lib,connectionInProgress:u.connection.inProgress});function sS({onPaneContextMenu:u,zoomOnScroll:l=!0,zoomOnPinch:f=!0,panOnScroll:n=!1,panOnScrollSpeed:y=0.5,panOnScrollMode:i=q1.Free,zoomOnDoubleClick:_=!0,panOnDrag:$=!0,defaultViewport:A,translateExtent:j,minZoom:J,maxZoom:Q,zoomActivationKeyCode:U,preventScrolling:F=!0,children:N,noWheelClassName:K,noPanClassName:G,onViewportChange:W,isControlledViewport:L,paneClickDistance:q,selectionOnDrag:z}){let Z=Pl(),T=ju.useRef(null),{userSelectionActive:X,lib:c,connectionInProgress:S}=Ql(gS,Xl),p=E6(U),Y=ju.useRef();vS(T);let D=ju.useCallback((x)=>{if(W?.({x:x[0],y:x[1],zoom:x[2]}),!L)Z.setState({transform:x})},[W,L]);return ju.useEffect(()=>{if(T.current){Y.current=pz({domNode:T.current,minZoom:J,maxZoom:Q,translateExtent:j,viewport:A,onDraggingChange:(M)=>Z.setState((I)=>I.paneDragging===M?I:{paneDragging:M}),onPanZoomStart:(M,I)=>{let{onViewportChangeStart:O,onMoveStart:C}=Z.getState();C?.(M,I),O?.(I)},onPanZoom:(M,I)=>{let{onViewportChange:O,onMove:C}=Z.getState();C?.(M,I),O?.(I)},onPanZoomEnd:(M,I)=>{let{onViewportChangeEnd:O,onMoveEnd:C}=Z.getState();C?.(M,I),O?.(I)}});let{x,y:V,zoom:t}=Y.current.getViewport();return Z.setState({panZoom:Y.current,transform:[x,V,t],domNode:T.current.closest(".react-flow")}),()=>{Y.current?.destroy()}}},[]),ju.useEffect(()=>{Y.current?.update({onPaneContextMenu:u,zoomOnScroll:l,zoomOnPinch:f,panOnScroll:n,panOnScrollSpeed:y,panOnScrollMode:i,zoomOnDoubleClick:_,panOnDrag:$,zoomActivationKeyPressed:p,preventScrolling:F,noPanClassName:G,userSelectionActive:X,noWheelClassName:K,lib:c,onTransformChange:D,connectionInProgress:S,selectionOnDrag:z,paneClickDistance:q})},[u,l,f,n,y,i,_,$,p,F,G,X,K,c,D,S,z,q]),_u.jsx("div",{className:"react-flow__renderer",ref:T,style:Gr,children:N})}var aS=(u)=>({userSelectionActive:u.userSelectionActive,userSelectionRect:u.userSelectionRect});function oS(){let{userSelectionActive:u,userSelectionRect:l}=Ql(aS,Xl);if(!(u&&l))return null;return _u.jsx("div",{className:"react-flow__selection react-flow__container",style:{width:l.width,height:l.height,transform:`translate(${l.x}px, ${l.y}px)`}})}var sJ=(u,l)=>{return(f)=>{if(f.target!==l.current)return;u?.(f)}},dS=(u)=>({userSelectionActive:u.userSelectionActive,elementsSelectable:u.elementsSelectable,connectionInProgress:u.connection.inProgress,dragging:u.paneDragging});function eS({isSelecting:u,selectionKeyPressed:l,selectionMode:f=qi.Full,panOnDrag:n,paneClickDistance:y,selectionOnDrag:i,onSelectionStart:_,onSelectionEnd:$,onPaneClick:A,onPaneContextMenu:j,onPaneScroll:J,onPaneMouseEnter:Q,onPaneMouseMove:U,onPaneMouseLeave:F,children:N}){let K=Pl(),{userSelectionActive:G,elementsSelectable:W,dragging:L,connectionInProgress:q}=Ql(dS,Xl),z=W&&(u||G),Z=ju.useRef(null),T=ju.useRef(),X=ju.useRef(new Set),c=ju.useRef(new Set),S=ju.useRef(!1),p=(O)=>{if(S.current||q){S.current=!1;return}A?.(O),K.getState().resetSelectedElements(),K.setState({nodesSelectionActive:!1})},Y=(O)=>{if(Array.isArray(n)&&n?.includes(2)){O.preventDefault();return}j?.(O)},D=J?(O)=>J(O):void 0,x=(O)=>{if(S.current)O.stopPropagation(),S.current=!1},V=(O)=>{let{domNode:C}=K.getState();if(T.current=C?.getBoundingClientRect(),!T.current)return;let g=O.target===Z.current;if(!g&&!!O.target.closest(".nokey")||!u||!(i&&g||l)||O.button!==0||!O.isPrimary)return;O.target?.setPointerCapture?.(O.pointerId),S.current=!1;let{x:ru,y:R}=k0(O.nativeEvent,T.current);if(K.setState({userSelectionRect:{width:0,height:0,startX:ru,startY:R,x:ru,y:R}}),!g)O.stopPropagation(),O.preventDefault()},t=(O)=>{let{userSelectionRect:C,transform:g,nodeLookup:a,edgeLookup:yu,connectionLookup:ru,triggerNodeChanges:R,triggerEdgeChanges:m,defaultEdgeOptions:fu,resetSelectedElements:iu}=K.getState();if(!T.current||!C)return;let{x:Ju,y:Vu}=k0(O.nativeEvent,T.current),{startX:Lu,startY:Bu}=C;if(!S.current){let d=l?0:y;if(Math.hypot(Ju-Lu,Vu-Bu)<=d)return;iu(),_?.(O)}S.current=!0;let b={startX:Lu,startY:Bu,x:Jud.id)),c.current=new Set;let wu=fu?.selectable??!0;for(let d of X.current){let zu=ru.get(d);if(!zu)continue;for(let{edgeId:v}of zu.values()){let $u=yu.get(v);if($u&&($u.selectable??wu))c.current.add(v)}}if(!PJ(o,X.current)){let d=o_(a,X.current,!0);R(d)}if(!PJ(nu,c.current)){let d=o_(yu,c.current);m(d)}K.setState({userSelectionRect:b,userSelectionActive:!0,nodesSelectionActive:!1})},M=(O)=>{if(O.button!==0)return;if(O.target?.releasePointerCapture?.(O.pointerId),!G&&O.target===Z.current&&K.getState().userSelectionRect)p?.(O);if(K.setState({userSelectionActive:!1,userSelectionRect:null}),S.current)$?.(O),K.setState({nodesSelectionActive:X.current.size>0})},I=n===!0||Array.isArray(n)&&n.includes(0);return _u.jsxs("div",{className:vl(["react-flow__pane",{draggable:I,dragging:L,selection:u}]),onClick:z?void 0:sJ(p,Z),onContextMenu:sJ(Y,Z),onWheel:sJ(D,Z),onPointerEnter:z?void 0:Q,onPointerMove:z?t:U,onPointerUp:z?M:void 0,onPointerDownCapture:z?V:void 0,onClickCapture:z?x:void 0,onPointerLeave:F,ref:Z,style:Gr,children:[N,_u.jsx(oS,{})]})}function dJ({id:u,store:l,unselect:f=!1,nodeRef:n}){let{addSelectedNodes:y,unselectNodesAndEdges:i,multiSelectionActive:_,nodeLookup:$,onError:A}=l.getState(),j=$.get(u);if(!j){A?.("012",H0.error012(u));return}if(l.setState({nodesSelectionActive:!1}),!j.selected)y([u]);else if(f||j.selected&&_)i({nodes:[j],edges:[]}),requestAnimationFrame(()=>n?.current?.blur())}function YG({nodeRef:u,disabled:l=!1,noDragClassName:f,handleSelector:n,nodeId:y,isSelectable:i,nodeClickDistance:_}){let $=Pl(),[A,j]=ju.useState(!1),J=ju.useRef();return ju.useEffect(()=>{J.current=cz({getStoreItems:()=>$.getState(),onNodeMouseDown:(Q)=>{dJ({id:Q,store:$,nodeRef:u})},onDragStart:()=>{j(!0)},onDragStop:()=>{j(!1)}})},[]),ju.useEffect(()=>{if(l||!u.current||!J.current)return;return J.current.update({noDragClassName:f,handleSelector:n,domNode:u.current,isSelectable:i,nodeId:y,nodeClickDistance:_}),()=>{J.current?.destroy()}},[f,n,l,i,u,y,_]),A}var uP=(u)=>(l)=>l.selected&&(l.draggable||u&&typeof l.draggable>"u");function DG(){let u=Pl();return ju.useCallback((f)=>{let{nodeExtent:n,snapToGrid:y,snapGrid:i,nodesDraggable:_,onError:$,updateNodePositions:A,nodeLookup:j,nodeOrigin:J}=u.getState(),Q=new Map,U=uP(_),F=y?i[0]:5,N=y?i[1]:5,K=f.direction.x*F*f.factor,G=f.direction.y*N*f.factor;for(let[,W]of j){if(!U(W))continue;let L={x:W.internals.positionAbsolute.x+K,y:W.internals.positionAbsolute.y+G};if(y)L=v_(L,i);let{position:q,positionAbsolute:z}=XJ({nodeId:W.id,nextPosition:L,nodeLookup:j,nodeExtent:n,nodeOrigin:J,onError:$});W.position=q,W.internals.positionAbsolute=z,Q.set(W.id,W)}A(Q)},[])}var uQ=ju.createContext(null),lP=uQ.Provider;uQ.Consumer;var tG=()=>{return ju.useContext(uQ)},fP=(u)=>({connectOnClick:u.connectOnClick,noPanClassName:u.noPanClassName,rfId:u.rfId}),nP=(u,l,f)=>(n)=>{let{connectionClickStartHandle:y,connectionMode:i,connection:_}=n,{fromHandle:$,toHandle:A,isValid:j}=_,J=A?.nodeId===u&&A?.id===l&&A?.type===f;return{connectingFrom:$?.nodeId===u&&$?.id===l&&$?.type===f,connectingTo:J,clickConnecting:y?.nodeId===u&&y?.id===l&&y?.type===f,isPossibleEndHandle:i===Qy.Strict?$?.type!==f:u!==$?.nodeId||l!==$?.id,connectionInProcess:!!$,clickConnectionInProcess:!!y,valid:J&&j}};function yP({type:u="source",position:l=cu.Top,isValidConnection:f,isConnectable:n=!0,isConnectableStart:y=!0,isConnectableEnd:i=!0,id:_,onConnect:$,children:A,className:j,onMouseDown:J,onTouchStart:Q,...U},F){let N=_||null,K=u==="target",G=Pl(),W=tG(),{connectOnClick:L,noPanClassName:q,rfId:z}=Ql(fP,Xl),{connectingFrom:Z,connectingTo:T,clickConnecting:X,isPossibleEndHandle:c,connectionInProcess:S,clickConnectionInProcess:p,valid:Y}=Ql(nP(W,N,u),Xl);if(!W)G.getState().onError?.("010",H0.error010());let D=(t)=>{let{defaultEdgeOptions:M,onConnect:I,hasDefaultEdges:O}=G.getState(),C={...M,...t};if(O){let{edges:g,setEdges:a}=G.getState();a(mJ(C,g))}I?.(C),$?.(C)},x=(t)=>{if(!W)return;let M=pJ(t.nativeEvent);if(y&&(M&&t.button===0||!M)){let I=G.getState();Ur.onPointerDown(t.nativeEvent,{handleDomNode:t.currentTarget,autoPanOnConnect:I.autoPanOnConnect,connectionMode:I.connectionMode,connectionRadius:I.connectionRadius,domNode:I.domNode,nodeLookup:I.nodeLookup,lib:I.lib,isTarget:K,handleId:N,nodeId:W,flowId:I.rfId,panBy:I.panBy,cancelConnection:I.cancelConnection,onConnectStart:I.onConnectStart,onConnectEnd:(...O)=>G.getState().onConnectEnd?.(...O),updateConnection:I.updateConnection,onConnect:D,isValidConnection:f||((...O)=>G.getState().isValidConnection?.(...O)??!0),getTransform:()=>G.getState().transform,getFromHandle:()=>G.getState().connection.fromHandle,autoPanSpeed:I.autoPanSpeed,dragThreshold:I.connectionDragThreshold})}if(M)J?.(t);else Q?.(t)},V=(t)=>{let{onClickConnectStart:M,onClickConnectEnd:I,connectionClickStartHandle:O,connectionMode:C,isValidConnection:g,lib:a,rfId:yu,nodeLookup:ru,connection:R}=G.getState();if(!W||!O&&!y)return;if(!O){M?.(t.nativeEvent,{nodeId:W,handleId:N,handleType:u}),G.setState({connectionClickStartHandle:{nodeId:W,type:u,id:N}});return}let m=MJ(t.target),fu=f||g,{connection:iu,isValid:Ju}=Ur.isValid(t.nativeEvent,{handle:{nodeId:W,id:N,type:u},connectionMode:C,fromNodeId:O.nodeId,fromHandleId:O.id||null,fromType:O.type,isValidConnection:fu,flowId:yu,doc:m,lib:a,nodeLookup:ru});if(Ju&&iu)D(iu);let Vu=structuredClone(R);delete Vu.inProgress,Vu.toPosition=Vu.toHandle?Vu.toHandle.position:null,I?.(t,Vu),G.setState({connectionClickStartHandle:null})};return _u.jsx("div",{"data-handleid":N,"data-nodeid":W,"data-handlepos":l,"data-id":`${z}-${W}-${N}-${u}`,className:vl(["react-flow__handle",`react-flow__handle-${l}`,"nodrag",q,j,{source:!K,target:K,connectable:n,connectablestart:y,connectableend:i,clickconnecting:X,connectingfrom:Z,connectingto:T,valid:Y,connectionindicator:n&&(!S||c)&&(S||p?i:y)}]),onMouseDown:x,onTouchStart:x,onClick:L?V:void 0,ref:F,...U,children:A})}var Gi=ju.memo(XG(yP));function iP({data:u,isConnectable:l,sourcePosition:f=cu.Bottom}){return _u.jsxs(_u.Fragment,{children:[u?.label,_u.jsx(Gi,{type:"source",position:f,isConnectable:l})]})}function _P({data:u,isConnectable:l,targetPosition:f=cu.Top,sourcePosition:n=cu.Bottom}){return _u.jsxs(_u.Fragment,{children:[_u.jsx(Gi,{type:"target",position:f,isConnectable:l}),u?.label,_u.jsx(Gi,{type:"source",position:n,isConnectable:l})]})}function $P(){return null}function AP({data:u,isConnectable:l,targetPosition:f=cu.Top}){return _u.jsxs(_u.Fragment,{children:[_u.jsx(Gi,{type:"target",position:f,isConnectable:l}),u?.label]})}var Lr={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}},NG={input:iP,default:_P,output:AP,group:$P};function rP(u){if(u.internals.handleBounds===void 0)return{width:u.width??u.initialWidth??u.style?.width,height:u.height??u.initialHeight??u.style?.height};return{width:u.width??u.style?.width,height:u.height??u.style?.height}}var jP=(u)=>{let{width:l,height:f,x:n,y}=h_(u.nodeLookup,{filter:(i)=>!!i.selected});return{width:b0(l)?l:null,height:b0(f)?f:null,userSelectionActive:u.userSelectionActive,transformString:`translate(${u.transform[0]}px,${u.transform[1]}px) scale(${u.transform[2]}) translate(${n}px,${y}px)`}};function JP({onSelectionContextMenu:u,noPanClassName:l,disableKeyboardA11y:f}){let n=Pl(),{width:y,height:i,transformString:_,userSelectionActive:$}=Ql(jP,Xl),A=DG(),j=ju.useRef(null);ju.useEffect(()=>{if(!f)j.current?.focus({preventScroll:!0})},[f]);let J=!$&&y!==null&&i!==null;if(YG({nodeRef:j,disabled:!J}),!J)return null;let Q=u?(F)=>{let N=n.getState().nodes.filter((K)=>K.selected);u(F,N)}:void 0,U=(F)=>{if(Object.prototype.hasOwnProperty.call(Lr,F.key))F.preventDefault(),A({direction:Lr[F.key],factor:F.shiftKey?4:1})};return _u.jsx("div",{className:vl(["react-flow__nodesselection","react-flow__container",l]),style:{transform:_},children:_u.jsx("div",{ref:j,className:"react-flow__nodesselection-rect",onContextMenu:Q,tabIndex:f?void 0:-1,onKeyDown:f?void 0:U,style:{width:y,height:i}})})}var FG=typeof window<"u"?window:void 0,QP=(u)=>{return{nodesSelectionActive:u.nodesSelectionActive,userSelectionActive:u.userSelectionActive}};function SG({children:u,onPaneClick:l,onPaneMouseEnter:f,onPaneMouseMove:n,onPaneMouseLeave:y,onPaneContextMenu:i,onPaneScroll:_,paneClickDistance:$,deleteKeyCode:A,selectionKeyCode:j,selectionOnDrag:J,selectionMode:Q,onSelectionStart:U,onSelectionEnd:F,multiSelectionKeyCode:N,panActivationKeyCode:K,zoomActivationKeyCode:G,elementsSelectable:W,zoomOnScroll:L,zoomOnPinch:q,panOnScroll:z,panOnScrollSpeed:Z,panOnScrollMode:T,zoomOnDoubleClick:X,panOnDrag:c,defaultViewport:S,translateExtent:p,minZoom:Y,maxZoom:D,preventScrolling:x,onSelectionContextMenu:V,noWheelClassName:t,noPanClassName:M,disableKeyboardA11y:I,onViewportChange:O,isControlledViewport:C}){let{nodesSelectionActive:g,userSelectionActive:a}=Ql(QP,Xl),yu=E6(j,{target:FG}),ru=E6(K,{target:FG}),R=ru||c,m=ru||z,fu=J&&R!==!0,iu=yu||a||fu;return IS({deleteKeyCode:A,multiSelectionKeyCode:N}),_u.jsx(sS,{onPaneContextMenu:i,elementsSelectable:W,zoomOnScroll:L,zoomOnPinch:q,panOnScroll:m,panOnScrollSpeed:Z,panOnScrollMode:T,zoomOnDoubleClick:X,panOnDrag:!yu&&R,defaultViewport:S,translateExtent:p,minZoom:Y,maxZoom:D,zoomActivationKeyCode:G,preventScrolling:x,noWheelClassName:t,noPanClassName:M,onViewportChange:O,isControlledViewport:C,paneClickDistance:$,selectionOnDrag:fu,children:_u.jsxs(eS,{onSelectionStart:U,onSelectionEnd:F,onPaneClick:l,onPaneMouseEnter:f,onPaneMouseMove:n,onPaneMouseLeave:y,onPaneContextMenu:i,onPaneScroll:_,panOnDrag:R,isSelecting:!!iu,selectionMode:Q,selectionKeyPressed:yu,paneClickDistance:$,selectionOnDrag:fu,children:[u,g&&_u.jsx(JP,{onSelectionContextMenu:V,noPanClassName:M,disableKeyboardA11y:I})]})})}SG.displayName="FlowRenderer";var UP=ju.memo(SG),NP=(u)=>(l)=>{return u?nr(l.nodeLookup,{x:0,y:0,width:l.width,height:l.height},l.transform,!0).map((f)=>f.id):Array.from(l.nodeLookup.keys())};function FP(u){return Ql(ju.useCallback(NP(u),[u]),Xl)}var WP=(u)=>u.updateNodeInternals;function qP(){let u=Ql(WP),[l]=ju.useState(()=>{if(typeof ResizeObserver>"u")return null;return new ResizeObserver((f)=>{let n=new Map;f.forEach((y)=>{let i=y.target.getAttribute("data-id");n.set(i,{id:i,nodeElement:y.target,force:!0})}),u(n)})});return ju.useEffect(()=>{return()=>{l?.disconnect()}},[l]),l}function LP({node:u,nodeType:l,hasDimensions:f,resizeObserver:n}){let y=Pl(),i=ju.useRef(null),_=ju.useRef(null),$=ju.useRef(u.sourcePosition),A=ju.useRef(u.targetPosition),j=ju.useRef(l),J=f&&!!u.internals.handleBounds;return ju.useEffect(()=>{if(i.current&&!u.hidden&&(!J||_.current!==i.current)){if(_.current)n?.unobserve(_.current);n?.observe(i.current),_.current=i.current}},[J,u.hidden]),ju.useEffect(()=>{return()=>{if(_.current)n?.unobserve(_.current),_.current=null}},[]),ju.useEffect(()=>{if(i.current){let Q=j.current!==l,U=$.current!==u.sourcePosition,F=A.current!==u.targetPosition;if(Q||U||F)j.current=l,$.current=u.sourcePosition,A.current=u.targetPosition,y.getState().updateNodeInternals(new Map([[u.id,{id:u.id,nodeElement:i.current,force:!0}]]))}},[u.id,l,u.sourcePosition,u.targetPosition]),i}function KP({id:u,onClick:l,onMouseEnter:f,onMouseMove:n,onMouseLeave:y,onContextMenu:i,onDoubleClick:_,nodesDraggable:$,elementsSelectable:A,nodesConnectable:j,nodesFocusable:J,resizeObserver:Q,noDragClassName:U,noPanClassName:F,disableKeyboardA11y:N,rfId:K,nodeTypes:G,nodeClickDistance:W,onError:L}){let{node:q,internals:z,isParent:Z}=Ql((Ju)=>{let Vu=Ju.nodeLookup.get(u),Lu=Ju.parentLookup.has(u);return{node:Vu,internals:Vu.internals,isParent:Lu}},Xl),T=q.type||"default",X=G?.[T]||NG[T];if(X===void 0)L?.("003",H0.error003(T)),T="default",X=G?.default||NG.default;let c=!!(q.draggable||$&&typeof q.draggable>"u"),S=!!(q.selectable||A&&typeof q.selectable>"u"),p=!!(q.connectable||j&&typeof q.connectable>"u"),Y=!!(q.focusable||J&&typeof q.focusable>"u"),D=Pl(),x=tJ(q),V=LP({node:q,nodeType:T,hasDimensions:x,resizeObserver:Q}),t=YG({nodeRef:V,disabled:q.hidden||!c,noDragClassName:U,handleSelector:q.dragHandle,nodeId:u,isSelectable:S,nodeClickDistance:W}),M=DG();if(q.hidden)return null;let I=Mn(q),O=rP(q),C=S||c||l||f||n||y,g=f?(Ju)=>f(Ju,{...z.userNode}):void 0,a=n?(Ju)=>n(Ju,{...z.userNode}):void 0,yu=y?(Ju)=>y(Ju,{...z.userNode}):void 0,ru=i?(Ju)=>i(Ju,{...z.userNode}):void 0,R=_?(Ju)=>_(Ju,{...z.userNode}):void 0,m=(Ju)=>{let{selectNodesOnDrag:Vu,nodeDragThreshold:Lu}=D.getState();if(S&&(!Vu||!c||Lu>0))dJ({id:u,store:D,nodeRef:V});if(l)l(Ju,{...z.userNode})},fu=(Ju)=>{if(CJ(Ju.nativeEvent)||N)return;if(ZJ.includes(Ju.key)&&S){let Vu=Ju.key==="Escape";dJ({id:u,store:D,unselect:Vu,nodeRef:V})}else if(c&&q.selected&&Object.prototype.hasOwnProperty.call(Lr,Ju.key)){Ju.preventDefault();let{ariaLabelConfig:Vu}=D.getState();D.setState({ariaLiveMessage:Vu["node.a11yDescription.ariaLiveMessage"]({direction:Ju.key.replace("Arrow","").toLowerCase(),x:~~z.positionAbsolute.x,y:~~z.positionAbsolute.y})}),M({direction:Lr[Ju.key],factor:Ju.shiftKey?4:1})}},iu=()=>{if(N||!V.current?.matches(":focus-visible"))return;let{transform:Ju,width:Vu,height:Lu,autoPanOnNodeFocus:Bu,setCenter:b}=D.getState();if(!Bu)return;if(!(nr(new Map([[u,q]]),{x:0,y:0,width:Vu,height:Lu},Ju,!0).length>0))b(q.position.x+I.width/2,q.position.y+I.height/2,{zoom:Ju[2]})};return _u.jsx("div",{className:vl(["react-flow__node",`react-flow__node-${T}`,{[F]:c},q.className,{selected:q.selected,selectable:S,parent:Z,draggable:c,dragging:t}]),ref:V,style:{zIndex:z.z,transform:`translate(${z.positionAbsolute.x}px,${z.positionAbsolute.y}px)`,pointerEvents:C?"all":"none",visibility:x?"visible":"hidden",...q.style,...O},"data-id":u,"data-testid":`rf__node-${u}`,onMouseEnter:g,onMouseMove:a,onMouseLeave:yu,onContextMenu:ru,onClick:m,onDoubleClick:R,onKeyDown:Y?fu:void 0,tabIndex:Y?0:void 0,onFocus:Y?iu:void 0,role:q.ariaRole??(Y?"group":void 0),"aria-roledescription":"node","aria-describedby":N?void 0:`${OG}-${K}`,"aria-label":q.ariaLabel,...q.domAttributes,children:_u.jsx(lP,{value:u,children:_u.jsx(X,{id:u,data:q.data,type:T,positionAbsoluteX:z.positionAbsolute.x,positionAbsoluteY:z.positionAbsolute.y,selected:q.selected??!1,selectable:S,draggable:c,deletable:q.deletable??!0,isConnectable:p,sourcePosition:q.sourcePosition,targetPosition:q.targetPosition,dragging:t,dragHandle:q.dragHandle,zIndex:z.z,parentId:q.parentId,...I})})})}var zP=ju.memo(KP),GP=(u)=>({nodesDraggable:u.nodesDraggable,nodesConnectable:u.nodesConnectable,nodesFocusable:u.nodesFocusable,elementsSelectable:u.elementsSelectable,onError:u.onError});function PG(u){let{nodesDraggable:l,nodesConnectable:f,nodesFocusable:n,elementsSelectable:y,onError:i}=Ql(GP,Xl),_=FP(u.onlyRenderVisibleElements),$=qP();return _u.jsx("div",{className:"react-flow__nodes",style:Gr,children:_.map((A)=>{return _u.jsx(zP,{id:A,nodeTypes:u.nodeTypes,nodeExtent:u.nodeExtent,onClick:u.onNodeClick,onMouseEnter:u.onNodeMouseEnter,onMouseMove:u.onNodeMouseMove,onMouseLeave:u.onNodeMouseLeave,onContextMenu:u.onNodeContextMenu,onDoubleClick:u.onNodeDoubleClick,noDragClassName:u.noDragClassName,noPanClassName:u.noPanClassName,rfId:u.rfId,disableKeyboardA11y:u.disableKeyboardA11y,resizeObserver:$,nodesDraggable:l,nodesConnectable:f,nodesFocusable:n,elementsSelectable:y,nodeClickDistance:u.nodeClickDistance,onError:i},A)})})}PG.displayName="NodeRenderer";var wP=ju.memo(PG);function ZP(u){return Ql(ju.useCallback((f)=>{if(!u)return f.edges.map((y)=>y.id);let n=[];if(f.width&&f.height)for(let y of f.edges){let i=f.nodeLookup.get(y.source),_=f.nodeLookup.get(y.target);if(i&&_&&wz({sourceNode:i,targetNode:_,width:f.width,height:f.height,transform:f.transform}))n.push(y.id)}return n},[u]),Xl)}var EP=({color:u="none",strokeWidth:l=1})=>{let f={strokeWidth:l,...u&&{stroke:u}};return _u.jsx("polyline",{className:"arrow",style:f,strokeLinecap:"round",fill:"none",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4"})},HP=({color:u="none",strokeWidth:l=1})=>{let f={strokeWidth:l,...u&&{stroke:u,fill:u}};return _u.jsx("polyline",{className:"arrowclosed",style:f,strokeLinecap:"round",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4 -5,-4"})},WG={[Uy.Arrow]:EP,[Uy.ArrowClosed]:HP};function OP(u){let l=Pl();return ju.useMemo(()=>{if(!Object.prototype.hasOwnProperty.call(WG,u))return l.getState().onError?.("009",H0.error009(u)),null;return WG[u]},[u])}var TP=({id:u,type:l,color:f,width:n=12.5,height:y=12.5,markerUnits:i="strokeWidth",strokeWidth:_,orient:$="auto-start-reverse"})=>{let A=OP(l);if(!A)return null;return _u.jsx("marker",{className:"react-flow__arrowhead",id:u,markerWidth:`${n}`,markerHeight:`${y}`,viewBox:"-10 -10 20 20",markerUnits:i,orient:$,refX:"0",refY:"0",children:_u.jsx(A,{color:f,strokeWidth:_})})},MG=({defaultColor:u,rfId:l})=>{let f=Ql((i)=>i.edges),n=Ql((i)=>i.defaultEdgeOptions),y=ju.useMemo(()=>{return Ez(f,{id:l,defaultColor:u,defaultMarkerStart:n?.markerStart,defaultMarkerEnd:n?.markerEnd})},[f,n,l,u]);if(!y.length)return null;return _u.jsx("svg",{className:"react-flow__marker","aria-hidden":"true",children:_u.jsx("defs",{children:y.map((i)=>_u.jsx(TP,{id:i.id,type:i.type,color:i.color,width:i.width,height:i.height,markerUnits:i.markerUnits,strokeWidth:i.strokeWidth,orient:i.orient},i.id))})})};MG.displayName="MarkerDefinitions";var VP=ju.memo(MG);function CG({x:u,y:l,label:f,labelStyle:n,labelShowBg:y=!0,labelBgStyle:i,labelBgPadding:_=[2,4],labelBgBorderRadius:$=2,children:A,className:j,...J}){let[Q,U]=ju.useState({x:1,y:0,width:0,height:0}),F=vl(["react-flow__edge-textwrapper",j]),N=ju.useRef(null);if(ju.useEffect(()=>{if(N.current){let K=N.current.getBBox();U({x:K.x,y:K.y,width:K.width,height:K.height})}},[f]),!f)return null;return _u.jsxs("g",{transform:`translate(${u-Q.width/2} ${l-Q.height/2})`,className:F,visibility:Q.width?"visible":"hidden",...J,children:[y&&_u.jsx("rect",{width:Q.width+2*_[0],x:-_[0],y:-_[1],height:Q.height+2*_[1],className:"react-flow__edge-textbg",style:i,rx:$,ry:$}),_u.jsx("text",{className:"react-flow__edge-text",y:Q.height/2,dy:"0.3em",ref:N,style:n,children:f}),A]})}CG.displayName="EdgeText";var BP=ju.memo(CG);function d_({path:u,labelX:l,labelY:f,label:n,labelStyle:y,labelShowBg:i,labelBgStyle:_,labelBgPadding:$,labelBgBorderRadius:A,interactionWidth:j=20,...J}){return _u.jsxs(_u.Fragment,{children:[_u.jsx("path",{...J,d:u,fill:"none",className:vl(["react-flow__edge-path",J.className])}),j?_u.jsx("path",{d:u,fill:"none",strokeOpacity:0,strokeWidth:j,className:"react-flow__edge-interaction"}):null,n&&b0(l)&&b0(f)?_u.jsx(BP,{x:l,y:f,label:n,labelStyle:y,labelShowBg:i,labelBgStyle:_,labelBgPadding:$,labelBgBorderRadius:A}):null]})}function qG({pos:u,x1:l,y1:f,x2:n,y2:y}){if(u===cu.Left||u===cu.Right)return[0.5*(l+n),f];return[l,0.5*(f+y)]}function pG({sourceX:u,sourceY:l,sourcePosition:f=cu.Bottom,targetX:n,targetY:y,targetPosition:i=cu.Top}){let[_,$]=qG({pos:f,x1:u,y1:l,x2:n,y2:y}),[A,j]=qG({pos:i,x1:n,y1:y,x2:u,y2:l}),[J,Q,U,F]=$r({sourceX:u,sourceY:l,targetX:n,targetY:y,sourceControlX:_,sourceControlY:$,targetControlX:A,targetControlY:j});return[`M${u},${l} C${_},${$} ${A},${j} ${n},${y}`,J,Q,U,F]}function xG(u){return ju.memo(({id:l,sourceX:f,sourceY:n,targetX:y,targetY:i,sourcePosition:_,targetPosition:$,label:A,labelStyle:j,labelShowBg:J,labelBgStyle:Q,labelBgPadding:U,labelBgBorderRadius:F,style:N,markerEnd:K,markerStart:G,interactionWidth:W})=>{let[L,q,z]=pG({sourceX:f,sourceY:n,sourcePosition:_,targetX:y,targetY:i,targetPosition:$}),Z=u.isInternal?void 0:l;return _u.jsx(d_,{id:Z,path:L,labelX:q,labelY:z,label:A,labelStyle:j,labelShowBg:J,labelBgStyle:Q,labelBgPadding:U,labelBgBorderRadius:F,style:N,markerEnd:K,markerStart:G,interactionWidth:W})})}var XP=xG({isInternal:!1}),mG=xG({isInternal:!0});XP.displayName="SimpleBezierEdge";mG.displayName="SimpleBezierEdgeInternal";function RG(u){return ju.memo(({id:l,sourceX:f,sourceY:n,targetX:y,targetY:i,label:_,labelStyle:$,labelShowBg:A,labelBgStyle:j,labelBgPadding:J,labelBgBorderRadius:Q,style:U,sourcePosition:F=cu.Bottom,targetPosition:N=cu.Top,markerEnd:K,markerStart:G,pathOptions:W,interactionWidth:L})=>{let[q,z,Z]=Z6({sourceX:f,sourceY:n,sourcePosition:F,targetX:y,targetY:i,targetPosition:N,borderRadius:W?.borderRadius,offset:W?.offset,stepPosition:W?.stepPosition}),T=u.isInternal?void 0:l;return _u.jsx(d_,{id:T,path:q,labelX:z,labelY:Z,label:_,labelStyle:$,labelShowBg:A,labelBgStyle:j,labelBgPadding:J,labelBgBorderRadius:Q,style:U,markerEnd:K,markerStart:G,interactionWidth:L})})}var bG=RG({isInternal:!1}),kG=RG({isInternal:!0});bG.displayName="SmoothStepEdge";kG.displayName="SmoothStepEdgeInternal";function hG(u){return ju.memo(({id:l,...f})=>{let n=u.isInternal?void 0:l;return _u.jsx(bG,{...f,id:n,pathOptions:ju.useMemo(()=>({borderRadius:0,offset:f.pathOptions?.offset}),[f.pathOptions?.offset])})})}var cP=hG({isInternal:!1}),IG=hG({isInternal:!0});cP.displayName="StepEdge";IG.displayName="StepEdgeInternal";function vG(u){return ju.memo(({id:l,sourceX:f,sourceY:n,targetX:y,targetY:i,label:_,labelStyle:$,labelShowBg:A,labelBgStyle:j,labelBgPadding:J,labelBgBorderRadius:Q,style:U,markerEnd:F,markerStart:N,interactionWidth:K})=>{let[G,W,L]=rr({sourceX:f,sourceY:n,targetX:y,targetY:i}),q=u.isInternal?void 0:l;return _u.jsx(d_,{id:q,path:G,labelX:W,labelY:L,label:_,labelStyle:$,labelShowBg:A,labelBgStyle:j,labelBgPadding:J,labelBgBorderRadius:Q,style:U,markerEnd:F,markerStart:N,interactionWidth:K})})}var YP=vG({isInternal:!1}),gG=vG({isInternal:!0});YP.displayName="StraightEdge";gG.displayName="StraightEdgeInternal";function sG(u){return ju.memo(({id:l,sourceX:f,sourceY:n,targetX:y,targetY:i,sourcePosition:_=cu.Bottom,targetPosition:$=cu.Top,label:A,labelStyle:j,labelShowBg:J,labelBgStyle:Q,labelBgPadding:U,labelBgBorderRadius:F,style:N,markerEnd:K,markerStart:G,pathOptions:W,interactionWidth:L})=>{let[q,z,Z]=Ar({sourceX:f,sourceY:n,sourcePosition:_,targetX:y,targetY:i,targetPosition:$,curvature:W?.curvature}),T=u.isInternal?void 0:l;return _u.jsx(d_,{id:T,path:q,labelX:z,labelY:Z,label:A,labelStyle:j,labelShowBg:J,labelBgStyle:Q,labelBgPadding:U,labelBgBorderRadius:F,style:N,markerEnd:K,markerStart:G,interactionWidth:L})})}var DP=sG({isInternal:!1}),aG=sG({isInternal:!0});DP.displayName="BezierEdge";aG.displayName="BezierEdgeInternal";var LG={default:aG,straight:gG,step:IG,smoothstep:kG,simplebezier:mG},KG={sourceX:null,sourceY:null,targetX:null,targetY:null,sourcePosition:null,targetPosition:null},tP=(u,l,f)=>{if(f===cu.Left)return u-l;if(f===cu.Right)return u+l;return u},SP=(u,l,f)=>{if(f===cu.Top)return u-l;if(f===cu.Bottom)return u+l;return u},zG="react-flow__edgeupdater";function GG({position:u,centerX:l,centerY:f,radius:n=10,onMouseDown:y,onMouseEnter:i,onMouseOut:_,type:$}){return _u.jsx("circle",{onMouseDown:y,onMouseEnter:i,onMouseOut:_,className:vl([zG,`${zG}-${$}`]),cx:tP(l,n,u),cy:SP(f,n,u),r:n,stroke:"transparent",fill:"transparent"})}function PP({isReconnectable:u,reconnectRadius:l,edge:f,sourceX:n,sourceY:y,targetX:i,targetY:_,sourcePosition:$,targetPosition:A,onReconnect:j,onReconnectStart:J,onReconnectEnd:Q,setReconnecting:U,setUpdateHover:F}){let N=Pl(),K=(z,Z)=>{if(z.button!==0)return;let{autoPanOnConnect:T,domNode:X,connectionMode:c,connectionRadius:S,lib:p,onConnectStart:Y,cancelConnection:D,nodeLookup:x,rfId:V,panBy:t,updateConnection:M}=N.getState(),I=Z.type==="target",O=(a,yu)=>{U(!1),Q?.(a,f,Z.type,yu)},C=(a)=>j?.(f,a),g=(a,yu)=>{U(!0),J?.(z,f,Z.type),Y?.(a,yu)};Ur.onPointerDown(z.nativeEvent,{autoPanOnConnect:T,connectionMode:c,connectionRadius:S,domNode:X,handleId:Z.id,nodeId:Z.nodeId,nodeLookup:x,isTarget:I,edgeUpdaterType:Z.type,lib:p,flowId:V,cancelConnection:D,panBy:t,isValidConnection:(...a)=>N.getState().isValidConnection?.(...a)??!0,onConnect:C,onConnectStart:g,onConnectEnd:(...a)=>N.getState().onConnectEnd?.(...a),onReconnectEnd:O,updateConnection:M,getTransform:()=>N.getState().transform,getFromHandle:()=>N.getState().connection.fromHandle,dragThreshold:N.getState().connectionDragThreshold,handleDomNode:z.currentTarget})},G=(z)=>K(z,{nodeId:f.target,id:f.targetHandle??null,type:"target"}),W=(z)=>K(z,{nodeId:f.source,id:f.sourceHandle??null,type:"source"}),L=()=>F(!0),q=()=>F(!1);return _u.jsxs(_u.Fragment,{children:[(u===!0||u==="source")&&_u.jsx(GG,{position:$,centerX:n,centerY:y,radius:l,onMouseDown:G,onMouseEnter:L,onMouseOut:q,type:"source"}),(u===!0||u==="target")&&_u.jsx(GG,{position:A,centerX:i,centerY:_,radius:l,onMouseDown:W,onMouseEnter:L,onMouseOut:q,type:"target"})]})}function MP({id:u,edgesFocusable:l,edgesReconnectable:f,elementsSelectable:n,onClick:y,onDoubleClick:i,onContextMenu:_,onMouseEnter:$,onMouseMove:A,onMouseLeave:j,reconnectRadius:J,onReconnect:Q,onReconnectStart:U,onReconnectEnd:F,rfId:N,edgeTypes:K,noPanClassName:G,onError:W,disableKeyboardA11y:L}){let q=Ql((b)=>b.edgeLookup.get(u)),z=Ql((b)=>b.defaultEdgeOptions);q=z?{...z,...q}:q;let Z=q.type||"default",T=K?.[Z]||LG[Z];if(T===void 0)W?.("011",H0.error011(Z)),Z="default",T=K?.default||LG.default;let X=!!(q.focusable||l&&typeof q.focusable>"u"),c=typeof Q<"u"&&(q.reconnectable||f&&typeof q.reconnectable>"u"),S=!!(q.selectable||n&&typeof q.selectable>"u"),p=ju.useRef(null),[Y,D]=ju.useState(!1),[x,V]=ju.useState(!1),t=Pl(),{zIndex:M,sourceX:I,sourceY:O,targetX:C,targetY:g,sourcePosition:a,targetPosition:yu}=Ql(ju.useCallback((b)=>{let o=b.nodeLookup.get(q.source),nu=b.nodeLookup.get(q.target);if(!o||!nu)return{zIndex:q.zIndex,...KG};let wu=Zz({id:u,sourceNode:o,targetNode:nu,sourceHandle:q.sourceHandle||null,targetHandle:q.targetHandle||null,connectionMode:b.connectionMode,onError:W});return{zIndex:Gz({selected:q.selected,zIndex:q.zIndex,sourceNode:o,targetNode:nu,elevateOnSelect:b.elevateEdgesOnSelect,zIndexMode:b.zIndexMode}),...wu||KG}},[q.source,q.target,q.sourceHandle,q.targetHandle,q.selected,q.zIndex]),Xl),ru=ju.useMemo(()=>q.markerStart?`url('#${jr(q.markerStart,N)}')`:void 0,[q.markerStart,N]),R=ju.useMemo(()=>q.markerEnd?`url('#${jr(q.markerEnd,N)}')`:void 0,[q.markerEnd,N]);if(q.hidden||I===null||O===null||C===null||g===null)return null;let m=(b)=>{let{addSelectedEdges:o,unselectNodesAndEdges:nu,multiSelectionActive:wu}=t.getState();if(S)if(t.setState({nodesSelectionActive:!1}),q.selected&&wu)nu({nodes:[],edges:[q]}),p.current?.blur();else o([u]);if(y)y(b,q)},fu=i?(b)=>{i(b,{...q})}:void 0,iu=_?(b)=>{_(b,{...q})}:void 0,Ju=$?(b)=>{$(b,{...q})}:void 0,Vu=A?(b)=>{A(b,{...q})}:void 0,Lu=j?(b)=>{j(b,{...q})}:void 0,Bu=(b)=>{if(!L&&ZJ.includes(b.key)&&S){let{unselectNodesAndEdges:o,addSelectedEdges:nu}=t.getState();if(b.key==="Escape")p.current?.blur(),o({edges:[q]});else nu([u])}};return _u.jsx("svg",{style:{zIndex:M},children:_u.jsxs("g",{className:vl(["react-flow__edge",`react-flow__edge-${Z}`,q.className,G,{selected:q.selected,animated:q.animated,inactive:!S&&!y,updating:Y,selectable:S}]),onClick:m,onDoubleClick:fu,onContextMenu:iu,onMouseEnter:Ju,onMouseMove:Vu,onMouseLeave:Lu,onKeyDown:X?Bu:void 0,tabIndex:X?0:void 0,role:q.ariaRole??(X?"group":"img"),"aria-roledescription":"edge","data-id":u,"data-testid":`rf__edge-${u}`,"aria-label":q.ariaLabel===null?void 0:q.ariaLabel||`Edge from ${q.source} to ${q.target}`,"aria-describedby":X?`${TG}-${N}`:void 0,ref:p,...q.domAttributes,children:[!x&&_u.jsx(T,{id:u,source:q.source,target:q.target,type:q.type,selected:q.selected,animated:q.animated,selectable:S,deletable:q.deletable??!0,label:q.label,labelStyle:q.labelStyle,labelShowBg:q.labelShowBg,labelBgStyle:q.labelBgStyle,labelBgPadding:q.labelBgPadding,labelBgBorderRadius:q.labelBgBorderRadius,sourceX:I,sourceY:O,targetX:C,targetY:g,sourcePosition:a,targetPosition:yu,data:q.data,style:q.style,sourceHandleId:q.sourceHandle,targetHandleId:q.targetHandle,markerStart:ru,markerEnd:R,pathOptions:"pathOptions"in q?q.pathOptions:void 0,interactionWidth:q.interactionWidth}),c&&_u.jsx(PP,{edge:q,isReconnectable:c,reconnectRadius:J,onReconnect:Q,onReconnectStart:U,onReconnectEnd:F,sourceX:I,sourceY:O,targetX:C,targetY:g,sourcePosition:a,targetPosition:yu,setUpdateHover:D,setReconnecting:V})]})})}var CP=ju.memo(MP),pP=(u)=>({edgesFocusable:u.edgesFocusable,edgesReconnectable:u.edgesReconnectable,elementsSelectable:u.elementsSelectable,connectionMode:u.connectionMode,onError:u.onError});function oG({defaultMarkerColor:u,onlyRenderVisibleElements:l,rfId:f,edgeTypes:n,noPanClassName:y,onReconnect:i,onEdgeContextMenu:_,onEdgeMouseEnter:$,onEdgeMouseMove:A,onEdgeMouseLeave:j,onEdgeClick:J,reconnectRadius:Q,onEdgeDoubleClick:U,onReconnectStart:F,onReconnectEnd:N,disableKeyboardA11y:K}){let{edgesFocusable:G,edgesReconnectable:W,elementsSelectable:L,onError:q}=Ql(pP,Xl),z=ZP(l);return _u.jsxs("div",{className:"react-flow__edges",children:[_u.jsx(VP,{defaultColor:u,rfId:f}),z.map((Z)=>{return _u.jsx(CP,{id:Z,edgesFocusable:G,edgesReconnectable:W,elementsSelectable:L,noPanClassName:y,onReconnect:i,onContextMenu:_,onMouseEnter:$,onMouseMove:A,onMouseLeave:j,onClick:J,reconnectRadius:Q,onDoubleClick:U,onReconnectStart:F,onReconnectEnd:N,rfId:f,onError:q,edgeTypes:n,disableKeyboardA11y:K},Z)})]})}oG.displayName="EdgeRenderer";var xP=ju.memo(oG),mP=(u)=>`translate(${u.transform[0]}px,${u.transform[1]}px) scale(${u.transform[2]})`;function RP({children:u}){let l=Ql(mP);return _u.jsx("div",{className:"react-flow__viewport xyflow__viewport react-flow__container",style:{transform:l},children:u})}function bP(u){let l=eJ(),f=ju.useRef(!1);ju.useEffect(()=>{if(!f.current&&l.viewportInitialized&&u)setTimeout(()=>u(l),1),f.current=!0},[u,l.viewportInitialized])}var kP=(u)=>u.panZoom?.syncViewport;function hP(u){let l=Ql(kP),f=Pl();return ju.useEffect(()=>{if(u)l?.(u),f.setState({transform:[u.x,u.y,u.zoom]})},[u,l]),null}function wG(u){return u.connection.inProgress?{...u.connection,to:g_(u.connection.to,u.transform)}:{...u.connection}}function IP(u){if(u)return(f)=>{let n=wG(f);return u(n)};return wG}function vP(u){let l=IP(u);return Ql(l,Xl)}var gP=(u)=>({nodesConnectable:u.nodesConnectable,isValid:u.connection.isValid,inProgress:u.connection.inProgress,width:u.width,height:u.height});function sP({containerStyle:u,style:l,type:f,component:n}){let{nodesConnectable:y,width:i,height:_,isValid:$,inProgress:A}=Ql(gP,Xl);if(!(i&&y&&A))return null;return _u.jsx("svg",{style:u,width:i,height:_,className:"react-flow__connectionline react-flow__container",children:_u.jsx("g",{className:vl(["react-flow__connection",OJ($)]),children:_u.jsx(dG,{style:l,type:f,CustomComponent:n,isValid:$})})})}var dG=({style:u,type:l=Pn.Bezier,CustomComponent:f,isValid:n})=>{let{inProgress:y,from:i,fromNode:_,fromHandle:$,fromPosition:A,to:j,toNode:J,toHandle:Q,toPosition:U,pointer:F}=vP();if(!y)return;if(f)return _u.jsx(f,{connectionLineType:l,connectionLineStyle:u,fromNode:_,fromHandle:$,fromX:i.x,fromY:i.y,toX:j.x,toY:j.y,fromPosition:A,toPosition:U,connectionStatus:OJ(n),toNode:J,toHandle:Q,pointer:F});let N="",K={sourceX:i.x,sourceY:i.y,sourcePosition:A,targetX:j.x,targetY:j.y,targetPosition:U};switch(l){case Pn.Bezier:[N]=Ar(K);break;case Pn.SimpleBezier:[N]=pG(K);break;case Pn.Step:[N]=Z6({...K,borderRadius:0});break;case Pn.SmoothStep:[N]=Z6(K);break;default:[N]=rr(K)}return _u.jsx("path",{d:N,fill:"none",className:"react-flow__connection-path",style:u})};dG.displayName="ConnectionLine";var aP={};function ZG(u=aP){let l=ju.useRef(u),f=Pl();ju.useEffect(()=>{},[u])}function oP(){let u=Pl(),l=ju.useRef(!1);ju.useEffect(()=>{},[])}function eG({nodeTypes:u,edgeTypes:l,onInit:f,onNodeClick:n,onEdgeClick:y,onNodeDoubleClick:i,onEdgeDoubleClick:_,onNodeMouseEnter:$,onNodeMouseMove:A,onNodeMouseLeave:j,onNodeContextMenu:J,onSelectionContextMenu:Q,onSelectionStart:U,onSelectionEnd:F,connectionLineType:N,connectionLineStyle:K,connectionLineComponent:G,connectionLineContainerStyle:W,selectionKeyCode:L,selectionOnDrag:q,selectionMode:z,multiSelectionKeyCode:Z,panActivationKeyCode:T,zoomActivationKeyCode:X,deleteKeyCode:c,onlyRenderVisibleElements:S,elementsSelectable:p,defaultViewport:Y,translateExtent:D,minZoom:x,maxZoom:V,preventScrolling:t,defaultMarkerColor:M,zoomOnScroll:I,zoomOnPinch:O,panOnScroll:C,panOnScrollSpeed:g,panOnScrollMode:a,zoomOnDoubleClick:yu,panOnDrag:ru,onPaneClick:R,onPaneMouseEnter:m,onPaneMouseMove:fu,onPaneMouseLeave:iu,onPaneScroll:Ju,onPaneContextMenu:Vu,paneClickDistance:Lu,nodeClickDistance:Bu,onEdgeContextMenu:b,onEdgeMouseEnter:o,onEdgeMouseMove:nu,onEdgeMouseLeave:wu,reconnectRadius:d,onReconnect:zu,onReconnectStart:v,onReconnectEnd:$u,noDragClassName:Wu,noWheelClassName:tu,noPanClassName:hu,disableKeyboardA11y:$l,nodeExtent:gu,rfId:Sf,viewport:Q0,onViewportChange:ff}){return ZG(u),ZG(l),oP(),bP(f),hP(Q0),_u.jsx(UP,{onPaneClick:R,onPaneMouseEnter:m,onPaneMouseMove:fu,onPaneMouseLeave:iu,onPaneContextMenu:Vu,onPaneScroll:Ju,paneClickDistance:Lu,deleteKeyCode:c,selectionKeyCode:L,selectionOnDrag:q,selectionMode:z,onSelectionStart:U,onSelectionEnd:F,multiSelectionKeyCode:Z,panActivationKeyCode:T,zoomActivationKeyCode:X,elementsSelectable:p,zoomOnScroll:I,zoomOnPinch:O,zoomOnDoubleClick:yu,panOnScroll:C,panOnScrollSpeed:g,panOnScrollMode:a,panOnDrag:ru,defaultViewport:Y,translateExtent:D,minZoom:x,maxZoom:V,onSelectionContextMenu:Q,preventScrolling:t,noDragClassName:Wu,noWheelClassName:tu,noPanClassName:hu,disableKeyboardA11y:$l,onViewportChange:ff,isControlledViewport:!!Q0,children:_u.jsxs(RP,{children:[_u.jsx(xP,{edgeTypes:l,onEdgeClick:y,onEdgeDoubleClick:_,onReconnect:zu,onReconnectStart:v,onReconnectEnd:$u,onlyRenderVisibleElements:S,onEdgeContextMenu:b,onEdgeMouseEnter:o,onEdgeMouseMove:nu,onEdgeMouseLeave:wu,reconnectRadius:d,defaultMarkerColor:M,noPanClassName:hu,disableKeyboardA11y:$l,rfId:Sf}),_u.jsx(sP,{style:K,type:N,component:G,containerStyle:W}),_u.jsx("div",{className:"react-flow__edgelabel-renderer"}),_u.jsx(wP,{nodeTypes:u,onNodeClick:n,onNodeDoubleClick:i,onNodeMouseEnter:$,onNodeMouseMove:A,onNodeMouseLeave:j,onNodeContextMenu:J,nodeClickDistance:Bu,onlyRenderVisibleElements:S,noPanClassName:hu,noDragClassName:Wu,disableKeyboardA11y:$l,nodeExtent:gu,rfId:Sf}),_u.jsx("div",{className:"react-flow__viewport-portal"})]})})}eG.displayName="GraphView";var dP=ju.memo(eG),EG=({nodes:u,edges:l,defaultNodes:f,defaultEdges:n,width:y,height:i,fitView:_,fitViewOptions:$,minZoom:A=0.5,maxZoom:j=2,nodeOrigin:J,nodeExtent:Q,zIndexMode:U="basic"}={})=>{let F=new Map,N=new Map,K=new Map,G=new Map,W=n??l??[],L=f??u??[],q=J??[0,0],z=Q??k_;IJ(K,G,W);let{nodesInitialized:Z}=Jr(L,F,N,{nodeOrigin:q,nodeExtent:z,zIndexMode:U}),T=[0,0,1];if(_&&y&&i){let X=h_(F,{filter:(Y)=>!!((Y.width||Y.initialWidth)&&(Y.height||Y.initialHeight))}),{x:c,y:S,zoom:p}=w6(X,y,i,A,j,$?.padding??0.1);T=[c,S,p]}return{rfId:"1",width:y??0,height:i??0,transform:T,nodes:L,nodesInitialized:Z,nodeLookup:F,parentLookup:N,edges:W,edgeLookup:G,connectionLookup:K,onNodesChange:null,onEdgesChange:null,hasDefaultNodes:f!==void 0,hasDefaultEdges:n!==void 0,panZoom:null,minZoom:A,maxZoom:j,translateExtent:k_,nodeExtent:z,nodesSelectionActive:!1,userSelectionActive:!1,userSelectionRect:null,connectionMode:Qy.Strict,domNode:null,paneDragging:!1,noPanClassName:"nopan",nodeOrigin:q,nodeDragThreshold:1,connectionDragThreshold:1,snapGrid:[15,15],snapToGrid:!1,nodesDraggable:!0,nodesConnectable:!0,nodesFocusable:!0,edgesFocusable:!0,edgesReconnectable:!0,elementsSelectable:!0,elevateNodesOnSelect:!0,elevateEdgesOnSelect:!0,selectNodesOnDrag:!0,multiSelectionActive:!1,fitViewQueued:_??!1,fitViewOptions:$,fitViewResolver:null,connection:{...HJ},connectionClickStartHandle:null,connectOnClick:!0,ariaLiveMessage:"",autoPanOnConnect:!0,autoPanOnNodeDrag:!0,autoPanOnNodeFocus:!0,autoPanSpeed:15,connectionRadius:20,onError:DJ,isValidConnection:void 0,onSelectionChangeHandlers:[],lib:"react",debug:!1,ariaLabelConfig:EJ,zIndexMode:U,onNodesChangeMiddlewareMap:new Map,onEdgesChangeMiddlewareMap:new Map}},eP=({nodes:u,edges:l,defaultNodes:f,defaultEdges:n,width:y,height:i,fitView:_,fitViewOptions:$,minZoom:A,maxZoom:j,nodeOrigin:J,nodeExtent:Q,zIndexMode:U})=>lG((F,N)=>{async function K(){let{nodeLookup:G,panZoom:W,fitViewOptions:L,fitViewResolver:q,width:z,height:Z,minZoom:T,maxZoom:X}=N();if(!W)return;await Fz({nodes:G,width:z,height:Z,panZoom:W,minZoom:T,maxZoom:X},L),q?.resolve(!0),F({fitViewResolver:null})}return{...EG({nodes:u,edges:l,width:y,height:i,fitView:_,fitViewOptions:$,minZoom:A,maxZoom:j,nodeOrigin:J,nodeExtent:Q,defaultNodes:f,defaultEdges:n,zIndexMode:U}),setNodes:(G)=>{let{nodeLookup:W,parentLookup:L,nodeOrigin:q,elevateNodesOnSelect:z,fitViewQueued:Z,zIndexMode:T,nodesSelectionActive:X}=N(),{nodesInitialized:c,hasSelectedNodes:S}=Jr(G,W,L,{nodeOrigin:q,nodeExtent:Q,elevateNodesOnSelect:z,checkEquality:!0,zIndexMode:T}),p=X&&S;if(Z&&c)K(),F({nodes:G,nodesInitialized:c,fitViewQueued:!1,fitViewOptions:void 0,nodesSelectionActive:p});else F({nodes:G,nodesInitialized:c,nodesSelectionActive:p})},setEdges:(G)=>{let{connectionLookup:W,edgeLookup:L}=N();IJ(W,L,G),F({edges:G})},setDefaultNodesAndEdges:(G,W)=>{if(G){let{setNodes:L}=N();L(G),F({hasDefaultNodes:!0})}if(W){let{setEdges:L}=N();L(W),F({hasDefaultEdges:!0})}},updateNodeInternals:(G)=>{let{triggerNodeChanges:W,nodeLookup:L,parentLookup:q,domNode:z,nodeOrigin:Z,nodeExtent:T,debug:X,fitViewQueued:c,zIndexMode:S}=N(),{changes:p,updatedInternals:Y}=Vz(G,L,q,z,Z,T,S);if(!Y)return;if(Oz(L,q,{nodeOrigin:Z,nodeExtent:T,zIndexMode:S}),c)K(),F({fitViewQueued:!1,fitViewOptions:void 0});else F({});if(p?.length>0){if(X)console.log("React Flow: trigger node changes",p);W?.(p)}},updateNodePositions:(G,W=!1)=>{let L=[],q=[],{nodeLookup:z,triggerNodeChanges:Z,connection:T,updateConnection:X,onNodesChangeMiddlewareMap:c}=N();for(let[S,p]of G){let Y=z.get(S),D=!!(Y?.expandParent&&Y?.parentId&&p?.position),x={id:S,type:"position",position:D?{x:Math.max(0,p.position.x),y:Math.max(0,p.position.y)}:p.position,dragging:W};if(Y&&T.inProgress&&T.fromNode.id===Y.id){let V=Ny(Y,T.fromHandle,cu.Left,!0);X({...T,from:V})}if(D&&Y.parentId)L.push({id:S,parentId:Y.parentId,rect:{...p.internals.positionAbsolute,width:p.measured.width??0,height:p.measured.height??0}});q.push(x)}if(L.length>0){let{parentLookup:S,nodeOrigin:p}=N(),Y=Qr(L,z,S,p);q.push(...Y)}for(let S of c.values())q=S(q);Z(q)},triggerNodeChanges:(G)=>{let{onNodesChange:W,setNodes:L,nodes:q,hasDefaultNodes:z,debug:Z}=N();if(G?.length){if(z){let T=CS(G,q);L(T)}if(Z)console.log("React Flow: trigger node changes",G);W?.(G)}},triggerEdgeChanges:(G)=>{let{onEdgesChange:W,setEdges:L,edges:q,hasDefaultEdges:z,debug:Z}=N();if(G?.length){if(z){let T=pS(G,q);L(T)}if(Z)console.log("React Flow: trigger edge changes",G);W?.(G)}},addSelectedNodes:(G)=>{let{multiSelectionActive:W,edgeLookup:L,nodeLookup:q,triggerNodeChanges:z,triggerEdgeChanges:Z}=N();if(W){let T=G.map((X)=>zi(X,!0));z(T);return}z(o_(q,new Set([...G]),!0)),Z(o_(L))},addSelectedEdges:(G)=>{let{multiSelectionActive:W,edgeLookup:L,nodeLookup:q,triggerNodeChanges:z,triggerEdgeChanges:Z}=N();if(W){let T=G.map((X)=>zi(X,!0));Z(T);return}Z(o_(L,new Set([...G]))),z(o_(q,new Set,!0))},unselectNodesAndEdges:({nodes:G,edges:W}={})=>{let{edges:L,nodes:q,nodeLookup:z,triggerNodeChanges:Z,triggerEdgeChanges:T}=N(),X=G?G:q,c=W?W:L,S=[];for(let Y of X){if(!Y.selected)continue;let D=z.get(Y.id);if(D)D.selected=!1;S.push(zi(Y.id,!1))}let p=[];for(let Y of c){if(!Y.selected)continue;p.push(zi(Y.id,!1))}Z(S),T(p)},setMinZoom:(G)=>{let{panZoom:W,maxZoom:L}=N();W?.setScaleExtent([G,L]),F({minZoom:G})},setMaxZoom:(G)=>{let{panZoom:W,minZoom:L}=N();W?.setScaleExtent([L,G]),F({maxZoom:G})},setTranslateExtent:(G)=>{N().panZoom?.setTranslateExtent(G),F({translateExtent:G})},resetSelectedElements:()=>{let{edges:G,nodes:W,triggerNodeChanges:L,triggerEdgeChanges:q,elementsSelectable:z}=N();if(!z)return;let Z=W.reduce((X,c)=>c.selected?[...X,zi(c.id,!1)]:X,[]),T=G.reduce((X,c)=>c.selected?[...X,zi(c.id,!1)]:X,[]);L(Z),q(T)},setNodeExtent:(G)=>{let{nodes:W,nodeLookup:L,parentLookup:q,nodeOrigin:z,elevateNodesOnSelect:Z,nodeExtent:T,zIndexMode:X}=N();if(G[0][0]===T[0][0]&&G[0][1]===T[0][1]&&G[1][0]===T[1][0]&&G[1][1]===T[1][1])return;Jr(W,L,q,{nodeOrigin:z,nodeExtent:G,elevateNodesOnSelect:Z,checkEquality:!1,zIndexMode:X}),F({nodeExtent:G})},panBy:(G)=>{let{transform:W,width:L,height:q,panZoom:z,translateExtent:Z}=N();return Bz({delta:G,panZoom:z,transform:W,translateExtent:Z,width:L,height:q})},setCenter:async(G,W,L)=>{let{width:q,height:z,maxZoom:Z,panZoom:T}=N();if(!T)return Promise.resolve(!1);let X=typeof L?.zoom<"u"?L.zoom:Z;return await T.setViewport({x:q/2-G*X,y:z/2-W*X,zoom:X},{duration:L?.duration,ease:L?.ease,interpolate:L?.interpolate}),Promise.resolve(!0)},cancelConnection:()=>{F({connection:{...HJ}})},updateConnection:(G)=>{F({connection:G})},reset:()=>F({...EG()})}},Object.is);function uM({initialNodes:u,initialEdges:l,defaultNodes:f,defaultEdges:n,initialWidth:y,initialHeight:i,initialMinZoom:_,initialMaxZoom:$,initialFitViewOptions:A,fitView:j,nodeOrigin:J,nodeExtent:Q,zIndexMode:U,children:F}){let[N]=ju.useState(()=>eP({nodes:u,edges:l,defaultNodes:f,defaultEdges:n,width:y,height:i,fitView:j,minZoom:_,maxZoom:$,fitViewOptions:A,nodeOrigin:J,nodeExtent:Q,zIndexMode:U}));return _u.jsx(LS,{value:N,children:_u.jsx(RS,{children:F})})}function lM({children:u,nodes:l,edges:f,defaultNodes:n,defaultEdges:y,width:i,height:_,fitView:$,fitViewOptions:A,minZoom:j,maxZoom:J,nodeOrigin:Q,nodeExtent:U,zIndexMode:F}){if(ju.useContext(Kr))return _u.jsx(_u.Fragment,{children:u});return _u.jsx(uM,{initialNodes:l,initialEdges:f,defaultNodes:n,defaultEdges:y,initialWidth:i,initialHeight:_,fitView:$,initialFitViewOptions:A,initialMinZoom:j,initialMaxZoom:J,nodeOrigin:Q,nodeExtent:U,zIndexMode:F,children:u})}var fM={width:"100%",height:"100%",overflow:"hidden",position:"relative",zIndex:0};function nM({nodes:u,edges:l,defaultNodes:f,defaultEdges:n,className:y,nodeTypes:i,edgeTypes:_,onNodeClick:$,onEdgeClick:A,onInit:j,onMove:J,onMoveStart:Q,onMoveEnd:U,onConnect:F,onConnectStart:N,onConnectEnd:K,onClickConnectStart:G,onClickConnectEnd:W,onNodeMouseEnter:L,onNodeMouseMove:q,onNodeMouseLeave:z,onNodeContextMenu:Z,onNodeDoubleClick:T,onNodeDragStart:X,onNodeDrag:c,onNodeDragStop:S,onNodesDelete:p,onEdgesDelete:Y,onDelete:D,onSelectionChange:x,onSelectionDragStart:V,onSelectionDrag:t,onSelectionDragStop:M,onSelectionContextMenu:I,onSelectionStart:O,onSelectionEnd:C,onBeforeDelete:g,connectionMode:a,connectionLineType:yu=Pn.Bezier,connectionLineStyle:ru,connectionLineComponent:R,connectionLineContainerStyle:m,deleteKeyCode:fu="Backspace",selectionKeyCode:iu="Shift",selectionOnDrag:Ju=!1,selectionMode:Vu=qi.Full,panActivationKeyCode:Lu="Space",multiSelectionKeyCode:Bu=s_()?"Meta":"Control",zoomActivationKeyCode:b=s_()?"Meta":"Control",snapToGrid:o,snapGrid:nu,onlyRenderVisibleElements:wu=!1,selectNodesOnDrag:d,nodesDraggable:zu,autoPanOnNodeFocus:v,nodesConnectable:$u,nodesFocusable:Wu,nodeOrigin:tu=VG,edgesFocusable:hu,edgesReconnectable:$l,elementsSelectable:gu=!0,defaultViewport:Sf=cS,minZoom:Q0=0.5,maxZoom:ff=2,translateExtent:U0=k_,preventScrolling:Pf=!0,nodeExtent:Nu,defaultMarkerColor:eu="#b1b1b7",zoomOnScroll:sl=!0,zoomOnPinch:bu=!0,panOnScroll:jf=!1,panOnScrollSpeed:Mf=0.5,panOnScrollMode:Jf=q1.Free,zoomOnDoubleClick:al=!0,panOnDrag:B0=!0,onPaneClick:bn,onPaneMouseEnter:af,onPaneMouseMove:A$,onPaneMouseLeave:z1,onPaneScroll:G1,onPaneContextMenu:e,paneClickDistance:Su=1,nodeClickDistance:mu=0,children:il,onReconnect:zl,onReconnectStart:dl,onReconnectEnd:jl,onEdgeContextMenu:nf,onEdgeDoubleClick:kn,onEdgeMouseEnter:gr,onEdgeMouseMove:r$,onEdgeMouseLeave:j$,reconnectRadius:Ol=10,onNodesChange:m6,onEdgesChange:sr,noDragClassName:Wl="nodrag",noWheelClassName:hQ="nowheel",noPanClassName:Ml="nopan",fitView:Zf,fitViewOptions:Ei,connectOnClick:R6,attributionPosition:J$,proOptions:b6,defaultEdgeOptions:Q$,elevateNodesOnSelect:k6=!0,elevateEdgesOnSelect:h6=!1,disableKeyboardA11y:w1=!1,autoPanOnConnect:Hi,autoPanOnNodeDrag:Oi,autoPanSpeed:of,connectionRadius:X0,isValidConnection:I6,onError:Ti,style:U$,id:N$,nodeDragThreshold:qn,connectionDragThreshold:v6,viewport:cl,onViewportChange:ar,width:or,height:g6,colorMode:s0="light",debug:Ty,onScroll:Z1,ariaLabelConfig:Vi,zIndexMode:E1="basic",...F$},IQ){let hn=N$||"1",vQ=SS(s0),s6=ju.useCallback((a6)=>{a6.currentTarget.scrollTo({top:0,left:0,behavior:"instant"}),Z1?.(a6)},[Z1]);return _u.jsx("div",{"data-testid":"rf__wrapper",...F$,onScroll:s6,style:{...U$,...fM},ref:IQ,className:vl(["react-flow",y,vQ]),id:N$,role:"application",children:_u.jsxs(lM,{nodes:u,edges:l,width:or,height:g6,fitView:Zf,fitViewOptions:Ei,minZoom:Q0,maxZoom:ff,nodeOrigin:tu,nodeExtent:Nu,zIndexMode:E1,children:[_u.jsx(tS,{nodes:u,edges:l,defaultNodes:f,defaultEdges:n,onConnect:F,onConnectStart:N,onConnectEnd:K,onClickConnectStart:G,onClickConnectEnd:W,nodesDraggable:zu,autoPanOnNodeFocus:v,nodesConnectable:$u,nodesFocusable:Wu,edgesFocusable:hu,edgesReconnectable:$l,elementsSelectable:gu,elevateNodesOnSelect:k6,elevateEdgesOnSelect:h6,minZoom:Q0,maxZoom:ff,nodeExtent:Nu,onNodesChange:m6,onEdgesChange:sr,snapToGrid:o,snapGrid:nu,connectionMode:a,translateExtent:U0,connectOnClick:R6,defaultEdgeOptions:Q$,fitView:Zf,fitViewOptions:Ei,onNodesDelete:p,onEdgesDelete:Y,onDelete:D,onNodeDragStart:X,onNodeDrag:c,onNodeDragStop:S,onSelectionDrag:t,onSelectionDragStart:V,onSelectionDragStop:M,onMove:J,onMoveStart:Q,onMoveEnd:U,noPanClassName:Ml,nodeOrigin:tu,rfId:hn,autoPanOnConnect:Hi,autoPanOnNodeDrag:Oi,autoPanSpeed:of,onError:Ti,connectionRadius:X0,isValidConnection:I6,selectNodesOnDrag:d,nodeDragThreshold:qn,connectionDragThreshold:v6,onBeforeDelete:g,debug:Ty,ariaLabelConfig:Vi,zIndexMode:E1}),_u.jsx(dP,{onInit:j,onNodeClick:$,onEdgeClick:A,onNodeMouseEnter:L,onNodeMouseMove:q,onNodeMouseLeave:z,onNodeContextMenu:Z,onNodeDoubleClick:T,nodeTypes:i,edgeTypes:_,connectionLineType:yu,connectionLineStyle:ru,connectionLineComponent:R,connectionLineContainerStyle:m,selectionKeyCode:iu,selectionOnDrag:Ju,selectionMode:Vu,deleteKeyCode:fu,multiSelectionKeyCode:Bu,panActivationKeyCode:Lu,zoomActivationKeyCode:b,onlyRenderVisibleElements:wu,defaultViewport:Sf,translateExtent:U0,minZoom:Q0,maxZoom:ff,preventScrolling:Pf,zoomOnScroll:sl,zoomOnPinch:bu,zoomOnDoubleClick:al,panOnScroll:jf,panOnScrollSpeed:Mf,panOnScrollMode:Jf,panOnDrag:B0,onPaneClick:bn,onPaneMouseEnter:af,onPaneMouseMove:A$,onPaneMouseLeave:z1,onPaneScroll:G1,onPaneContextMenu:e,paneClickDistance:Su,nodeClickDistance:mu,onSelectionContextMenu:I,onSelectionStart:O,onSelectionEnd:C,onReconnect:zl,onReconnectStart:dl,onReconnectEnd:jl,onEdgeContextMenu:nf,onEdgeDoubleClick:kn,onEdgeMouseEnter:gr,onEdgeMouseMove:r$,onEdgeMouseLeave:j$,reconnectRadius:Ol,defaultMarkerColor:eu,noDragClassName:Wl,noWheelClassName:hQ,noPanClassName:Ml,rfId:hn,disableKeyboardA11y:w1,nodeExtent:Nu,viewport:cl,onViewportChange:ar}),_u.jsx(XS,{onSelectionChange:x}),il,_u.jsx(HS,{proOptions:b6,position:J$}),_u.jsx(ES,{rfId:hn,disableKeyboardA11y:w1})]})})}var uw=XG(nM);var Qg=H0.error014();function yM({dimensions:u,lineWidth:l,variant:f,className:n}){return _u.jsx("path",{strokeWidth:l,d:`M${u[0]/2} 0 V${u[1]} M0 ${u[1]/2} H${u[0]}`,className:vl(["react-flow__background-pattern",f,n])})}function iM({radius:u,className:l}){return _u.jsx("circle",{cx:u,cy:u,r:u,className:vl(["react-flow__background-pattern","dots",l])})}var Wy;(function(u){u.Lines="lines",u.Dots="dots",u.Cross="cross"})(Wy||(Wy={}));var _M={[Wy.Dots]:1,[Wy.Lines]:1,[Wy.Cross]:6},$M=(u)=>({transform:u.transform,patternId:`pattern-${u.rfId}`});function lw({id:u,variant:l=Wy.Dots,gap:f=20,size:n,lineWidth:y=1,offset:i=0,color:_,bgColor:$,style:A,className:j,patternClassName:J}){let Q=ju.useRef(null),{transform:U,patternId:F}=Ql($M,Xl),N=n||_M[l],K=l===Wy.Dots,G=l===Wy.Cross,W=Array.isArray(f)?f:[f,f],L=[W[0]*U[2]||1,W[1]*U[2]||1],q=N*U[2],z=Array.isArray(i)?i:[i,i],Z=G?[q,q]:L,T=[z[0]*U[2]||1+Z[0]/2,z[1]*U[2]||1+Z[1]/2],X=`${F}${u?u:""}`;return _u.jsxs("svg",{className:vl(["react-flow__background",j]),style:{...A,...Gr,"--xy-background-color-props":$,"--xy-background-pattern-color-props":_},ref:Q,"data-testid":"rf__background",children:[_u.jsx("pattern",{id:X,x:U[0]%L[0],y:U[1]%L[1],width:L[0],height:L[1],patternUnits:"userSpaceOnUse",patternTransform:`translate(-${T[0]},-${T[1]})`,children:K?_u.jsx(iM,{radius:q/2,className:J}):_u.jsx(yM,{dimensions:Z,lineWidth:y,variant:l,className:J})}),_u.jsx("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:`url(#${X})`})]})}lw.displayName="Background";var fw=ju.memo(lw);function AM(){return _u.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",children:_u.jsx("path",{d:"M32 18.133H18.133V32h-4.266V18.133H0v-4.266h13.867V0h4.266v13.867H32z"})})}function rM(){return _u.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 5",children:_u.jsx("path",{d:"M0 0h32v4.2H0z"})})}function jM(){return _u.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 30",children:_u.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 JM(){return _u.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:_u.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 QM(){return _u.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:_u.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 qr({children:u,className:l,...f}){return _u.jsx("button",{type:"button",className:vl(["react-flow__controls-button",l]),...f,children:u})}var UM=(u)=>({isInteractive:u.nodesDraggable||u.nodesConnectable||u.elementsSelectable,minZoomReached:u.transform[2]<=u.minZoom,maxZoomReached:u.transform[2]>=u.maxZoom,ariaLabelConfig:u.ariaLabelConfig});function nw({style:u,showZoom:l=!0,showFitView:f=!0,showInteractive:n=!0,fitViewOptions:y,onZoomIn:i,onZoomOut:_,onFitView:$,onInteractiveChange:A,className:j,children:J,position:Q="bottom-left",orientation:U="vertical","aria-label":F}){let N=Pl(),{isInteractive:K,minZoomReached:G,maxZoomReached:W,ariaLabelConfig:L}=Ql(UM,Xl),{zoomIn:q,zoomOut:z,fitView:Z}=eJ(),T=()=>{q(),i?.()},X=()=>{z(),_?.()},c=()=>{Z(y),$?.()},S=()=>{N.setState({nodesDraggable:!K,nodesConnectable:!K,elementsSelectable:!K}),A?.(!K)};return _u.jsxs(zr,{className:vl(["react-flow__controls",U==="horizontal"?"horizontal":"vertical",j]),position:Q,style:u,"data-testid":"rf__controls","aria-label":F??L["controls.ariaLabel"],children:[l&&_u.jsxs(_u.Fragment,{children:[_u.jsx(qr,{onClick:T,className:"react-flow__controls-zoomin",title:L["controls.zoomIn.ariaLabel"],"aria-label":L["controls.zoomIn.ariaLabel"],disabled:W,children:_u.jsx(AM,{})}),_u.jsx(qr,{onClick:X,className:"react-flow__controls-zoomout",title:L["controls.zoomOut.ariaLabel"],"aria-label":L["controls.zoomOut.ariaLabel"],disabled:G,children:_u.jsx(rM,{})})]}),f&&_u.jsx(qr,{className:"react-flow__controls-fitview",onClick:c,title:L["controls.fitView.ariaLabel"],"aria-label":L["controls.fitView.ariaLabel"],children:_u.jsx(jM,{})}),n&&_u.jsx(qr,{className:"react-flow__controls-interactive",onClick:S,title:L["controls.interactive.ariaLabel"],"aria-label":L["controls.interactive.ariaLabel"],children:K?_u.jsx(QM,{}):_u.jsx(JM,{})}),J]})}nw.displayName="Controls";var yw=ju.memo(nw);function NM({id:u,x:l,y:f,width:n,height:y,style:i,color:_,strokeColor:$,strokeWidth:A,className:j,borderRadius:J,shapeRendering:Q,selected:U,onClick:F}){let{background:N,backgroundColor:K}=i||{},G=_||N||K;return _u.jsx("rect",{className:vl(["react-flow__minimap-node",{selected:U},j]),x:l,y:f,rx:J,ry:J,width:n,height:y,style:{fill:G,stroke:$,strokeWidth:A},shapeRendering:Q,onClick:F?(W)=>F(W,u):void 0})}var FM=ju.memo(NM),WM=(u)=>u.nodes.map((l)=>l.id),aJ=(u)=>u instanceof Function?u:()=>u;function qM({nodeStrokeColor:u,nodeColor:l,nodeClassName:f="",nodeBorderRadius:n=5,nodeStrokeWidth:y,nodeComponent:i=FM,onClick:_}){let $=Ql(WM,Xl),A=aJ(l),j=aJ(u),J=aJ(f),Q=typeof window>"u"||!!window.chrome?"crispEdges":"geometricPrecision";return _u.jsx(_u.Fragment,{children:$.map((U)=>_u.jsx(KM,{id:U,nodeColorFunc:A,nodeStrokeColorFunc:j,nodeClassNameFunc:J,nodeBorderRadius:n,nodeStrokeWidth:y,NodeComponent:i,onClick:_,shapeRendering:Q},U))})}function LM({id:u,nodeColorFunc:l,nodeStrokeColorFunc:f,nodeClassNameFunc:n,nodeBorderRadius:y,nodeStrokeWidth:i,shapeRendering:_,NodeComponent:$,onClick:A}){let{node:j,x:J,y:Q,width:U,height:F}=Ql((N)=>{let K=N.nodeLookup.get(u);if(!K)return{node:void 0,x:0,y:0,width:0,height:0};let G=K.internals.userNode,{x:W,y:L}=K.internals.positionAbsolute,{width:q,height:z}=Mn(G);return{node:G,x:W,y:L,width:q,height:z}},Xl);if(!j||j.hidden||!tJ(j))return null;return _u.jsx($,{x:J,y:Q,width:U,height:F,style:j.style,selected:!!j.selected,className:n(j),color:l(j),borderRadius:y,strokeColor:f(j),strokeWidth:i,shapeRendering:_,onClick:A,id:j.id})}var KM=ju.memo(LM),zM=ju.memo(qM),GM=200,wM=150,ZM=(u)=>!u.hidden,EM=(u)=>{let l={x:-u.transform[0]/u.transform[2],y:-u.transform[1]/u.transform[2],width:u.width/u.transform[2],height:u.height/u.transform[2]};return{viewBB:l,boundingRect:u.nodeLookup.size>0?cJ(h_(u.nodeLookup,{filter:ZM}),l):l,rfId:u.rfId,panZoom:u.panZoom,translateExtent:u.translateExtent,flowWidth:u.width,flowHeight:u.height,ariaLabelConfig:u.ariaLabelConfig}},HM="react-flow__minimap-desc";function iw({style:u,className:l,nodeStrokeColor:f,nodeColor:n,nodeClassName:y="",nodeBorderRadius:i=5,nodeStrokeWidth:_,nodeComponent:$,bgColor:A,maskColor:j,maskStrokeColor:J,maskStrokeWidth:Q,position:U="bottom-right",onClick:F,onNodeClick:N,pannable:K=!1,zoomable:G=!1,ariaLabel:W,inversePan:L,zoomStep:q=1,offsetScale:z=5}){let Z=Pl(),T=ju.useRef(null),{boundingRect:X,viewBB:c,rfId:S,panZoom:p,translateExtent:Y,flowWidth:D,flowHeight:x,ariaLabelConfig:V}=Ql(EM,Xl),t=u?.width??GM,M=u?.height??wM,I=X.width/t,O=X.height/M,C=Math.max(I,O),g=C*t,a=C*M,yu=z*C,ru=X.x-(g-X.width)/2-yu,R=X.y-(a-X.height)/2-yu,m=g+yu*2,fu=a+yu*2,iu=`${HM}-${S}`,Ju=ju.useRef(0),Vu=ju.useRef();Ju.current=C,ju.useEffect(()=>{if(T.current&&p)return Vu.current=Pz({domNode:T.current,panZoom:p,getTransform:()=>Z.getState().transform,getViewScale:()=>Ju.current}),()=>{Vu.current?.destroy()}},[p]),ju.useEffect(()=>{Vu.current?.update({translateExtent:Y,width:D,height:x,inversePan:L,pannable:K,zoomStep:q,zoomable:G})},[K,G,L,q,Y,D,x]);let Lu=F?(o)=>{let[nu,wu]=Vu.current?.pointer(o)||[0,0];F(o,{x:nu,y:wu})}:void 0,Bu=N?ju.useCallback((o,nu)=>{let wu=Z.getState().nodeLookup.get(nu).internals.userNode;N(o,wu)},[]):void 0,b=W??V["minimap.ariaLabel"];return _u.jsx(zr,{position:U,style:{...u,"--xy-minimap-background-color-props":typeof A==="string"?A:void 0,"--xy-minimap-mask-background-color-props":typeof j==="string"?j:void 0,"--xy-minimap-mask-stroke-color-props":typeof J==="string"?J:void 0,"--xy-minimap-mask-stroke-width-props":typeof Q==="number"?Q*C:void 0,"--xy-minimap-node-background-color-props":typeof n==="string"?n:void 0,"--xy-minimap-node-stroke-color-props":typeof f==="string"?f:void 0,"--xy-minimap-node-stroke-width-props":typeof _==="number"?_:void 0},className:vl(["react-flow__minimap",l]),"data-testid":"rf__minimap",children:_u.jsxs("svg",{width:t,height:M,viewBox:`${ru} ${R} ${m} ${fu}`,className:"react-flow__minimap-svg",role:"img","aria-labelledby":iu,ref:T,onClick:Lu,children:[b&&_u.jsx("title",{id:iu,children:b}),_u.jsx(zM,{onClick:Bu,nodeColor:n,nodeStrokeColor:f,nodeBorderRadius:i,nodeClassName:y,nodeStrokeWidth:_,nodeComponent:$}),_u.jsx("path",{className:"react-flow__minimap-mask",d:`M${ru-yu},${R-yu}h${m+yu*2}v${fu+yu*2}h${-m-yu*2}z + M${c.x},${c.y}h${c.width}v${c.height}h${-c.width}z`,fillRule:"evenodd",pointerEvents:"none"})]})})}iw.displayName="MiniMap";var Ug=ju.memo(iw),OM=(u)=>(l)=>u?`${Math.max(1/l.transform[2],1)}`:void 0,TM={[Fy.Line]:"right",[Fy.Handle]:"bottom-right"};function VM({nodeId:u,position:l,variant:f=Fy.Handle,className:n,style:y=void 0,children:i,color:_,minWidth:$=10,minHeight:A=10,maxWidth:j=Number.MAX_VALUE,maxHeight:J=Number.MAX_VALUE,keepAspectRatio:Q=!1,resizeDirection:U,autoScale:F=!0,shouldResize:N,onResizeStart:K,onResize:G,onResizeEnd:W}){let L=tG(),q=typeof u==="string"?u:L,z=Pl(),Z=ju.useRef(null),T=f===Fy.Handle,X=Ql(ju.useCallback(OM(T&&F),[T,F]),Xl),c=ju.useRef(null),S=l??TM[f];ju.useEffect(()=>{if(!Z.current||!q)return;if(!c.current)c.current=mz({domNode:Z.current,nodeId:q,getStoreItems:()=>{let{nodeLookup:Y,transform:D,snapGrid:x,snapToGrid:V,nodeOrigin:t,domNode:M}=z.getState();return{nodeLookup:Y,transform:D,snapGrid:x,snapToGrid:V,nodeOrigin:t,paneDomNode:M}},onChange:(Y,D)=>{let{triggerNodeChanges:x,nodeLookup:V,parentLookup:t,nodeOrigin:M}=z.getState(),I=[],O={x:Y.x,y:Y.y},C=V.get(q);if(C&&C.expandParent&&C.parentId){let g=C.origin??M,a=Y.width??C.measured.width??0,yu=Y.height??C.measured.height??0,ru={id:C.id,parentId:C.parentId,rect:{width:a,height:yu,...SJ({x:Y.x??C.position.x,y:Y.y??C.position.y},{width:a,height:yu},C.parentId,V,g)}},R=Qr([ru],V,t,M);I.push(...R),O.x=Y.x?Math.max(g[0]*a,Y.x):void 0,O.y=Y.y?Math.max(g[1]*yu,Y.y):void 0}if(O.x!==void 0&&O.y!==void 0){let g={id:q,type:"position",position:{...O}};I.push(g)}if(Y.width!==void 0&&Y.height!==void 0){let a={id:q,type:"dimensions",resizing:!0,setAttributes:!U?!0:U==="horizontal"?"width":"height",dimensions:{width:Y.width,height:Y.height}};I.push(a)}for(let g of D){let a={...g,type:"position"};I.push(a)}x(I)},onEnd:({width:Y,height:D})=>{let x={id:q,type:"dimensions",resizing:!1,dimensions:{width:Y,height:D}};z.getState().triggerNodeChanges([x])}});return c.current.update({controlPosition:S,boundaries:{minWidth:$,minHeight:A,maxWidth:j,maxHeight:J},keepAspectRatio:Q,resizeDirection:U,onResizeStart:K,onResize:G,onResizeEnd:W,shouldResize:N}),()=>{c.current?.destroy()}},[S,$,A,j,J,Q,K,G,W,N]);let p=S.split("-");return _u.jsx("div",{className:vl(["react-flow__resize-control","nodrag",...p,f,n]),ref:Z,style:{...y,scale:X,..._&&{[T?"backgroundColor":"borderColor"]:_}},children:i})}var Ng=ju.memo(VM);var H=zy.default.createElement,{useEffect:xn}=zy.default,$0=zy.default.useState,Ky=zy.default.useRef,X6=[{id:"in-left",side:"left",position:cu.Left,style:{top:"50%"}},{id:"in-top-left",side:"top",slot:"left",slotIndex:-1,position:cu.Top,style:{left:"28%"}},{id:"in-top-mid",side:"top",slot:"mid",slotIndex:0,position:cu.Top,style:{left:"50%"}},{id:"in-top-right",side:"top",slot:"right",slotIndex:1,position:cu.Top,style:{left:"72%"}},{id:"in-bottom-left",side:"bottom",slot:"left",slotIndex:-1,position:cu.Bottom,style:{left:"28%"}},{id:"in-bottom-mid",side:"bottom",slot:"mid",slotIndex:0,position:cu.Bottom,style:{left:"50%"}},{id:"in-bottom-right",side:"bottom",slot:"right",slotIndex:1,position:cu.Bottom,style:{left:"72%"}}],T6=[{id:"out-right",position:cu.Right,style:{top:"50%"}}],_w=["#4eb7a8","#d7a13a","#69aee8","#e0835f","#b7d86b","#d98bd2","#5fc6bf"],u$=236,l$=88,$w=15000,BM=10,lQ=96,Cn=72,fQ=64,Aw=12;function wr(){return typeof document>"u"||document.visibilityState!=="hidden"}function rw(u,l){let f=Number.parseFloat(String(u||""));return Number.isFinite(f)?f/100:l}function XM(u,l,f){let n=String(u.side||"");if(n!=="top"&&n!=="bottom")return 0;let y=Number(u.slotIndex||0),i=n==="top"?"in-top-mid":"in-bottom-mid",_=l.get(u.id)||0,$=l.get(i)||0;if(y===0)return $===0?-26:28+_*74;let A=f===0?Math.abs(y)*2:Math.sign(f)===Math.sign(y)?-3:3;if($>0&&_===0)return-14+A;return 8+_*74+A}function Zr(u){let l=u.filter((i,_)=>{let $=u[_-1];return!$||Math.abs($.x-i.x)>0.5||Math.abs($.y-i.y)>0.5});if(l.length<2)return"";let f=`M ${l[0].x},${l[0].y}`,n=l[0];for(let i=1;i0.5||Math.abs(U.y-n.y)>0.5)f+=` L ${U.x},${U.y}`;f+=` Q ${$.x},${$.y} ${F.x},${F.y}`,n=F}let y=l[l.length-1];return`${f} L ${y.x},${y.y}`}function Tw(u,l,f,n,y,i,_=""){let $=f>=u,A=Math.max(1,Math.abs(f-u)),j=Math.abs(n-l),J=Math.max(34,Math.min(118,A*0.26)),Q=Math.min(280,Math.abs(i));if($&&y===cu.Left&&Q<4&&j<28&&A<420)return`M ${u},${l} C ${u+J},${l} ${f-J},${n} ${f},${n}`;if($&&y===cu.Left&&(_==="direct-forward-left"||A<=260&&j<=210)){let W=Math.max(42,Math.min(140,A*0.48)),L=Math.max(-28,Math.min(28,i*0.18));return`M ${u},${l} C ${u+W},${l+L} ${f-W},${n} ${f},${n}`}if($){let W=u+J;if(y===cu.Top||y===cu.Bottom){let z=y===cu.Top?-1:1,Z=n+z*(54+Q*0.42);return Zr([{x:u,y:l},{x:W,y:l},{x:W+Math.min(120,A*0.18),y:Z},{x:f,y:Z},{x:f,y:n+z*34},{x:f,y:n}])}let L=f-J,q=(l+n)/2+i;return Zr([{x:u,y:l},{x:W,y:l},{x:W+Math.min(110,A*0.16),y:q},{x:L-Math.min(90,A*0.12),y:q},{x:L,y:n},{x:f,y:n}])}let N=y===cu.Bottom?1:y===cu.Top?-1:i>=0?1:-1,K=Math.max(u,f)+92+Math.min(180,Q*0.52),G=N<0?Math.min(l,n)-84-Q*0.62:Math.max(l,n)+84+Q*0.62;if(y===cu.Top||y===cu.Bottom)return Zr([{x:u,y:l},{x:u+J,y:l},{x:K,y:G},{x:f,y:G},{x:f,y:n+N*38},{x:f,y:n}]);return Zr([{x:u,y:l},{x:u+J,y:l},{x:K,y:G},{x:f-J,y:G},{x:f-J,y:n},{x:f,y:n}])}function cM({data:u}){return H("div",{className:"pipeline-flow-node-body"},X6.map((l)=>H(Gi,{key:l.id,id:l.id,type:"target",position:l.position,isConnectable:!1,className:`pipeline-flow-handle input ${l.side} slot-${l.slot||"mid"}`,style:l.style})),T6.map((l)=>H(Gi,{key:l.id,id:l.id,type:"source",position:l.position,isConnectable:!1,className:"pipeline-flow-handle output right",style:l.style})),u?.label)}function YM({id:u,sourceX:l,sourceY:f,targetX:n,targetY:y,targetPosition:i,markerEnd:_,markerStart:$,style:A,data:j}){let J=Number(j?.laneOffset||0),Q=Tw(l,f,n,y,i,J,String(j?.routeMode||""));return H(d_,{id:u,path:Q,markerEnd:_,markerStart:$,style:A,interactionWidth:28})}var DM={pipelineCurve:YM},tM={pipelineNode:cM};function Tr(u){if(!u)return"--";let l=new Date(u);if(Number.isNaN(l.getTime()))return"--";return rl(l)}function I0(u){let l=Number(u);if(!Number.isFinite(l)||l<0)return"--";let f=Math.round(l/1000);if(f<60)return`${f}s`;if(f<3600)return`${Math.floor(f/60)}m ${f%60}s`;return`${Math.floor(f/3600)}h ${Math.floor(f%3600/60)}m`}function nQ(u){let l=Number(u);if(!Number.isFinite(l))return"--";return l.toLocaleString("zh-CN")}function jw(u){let l=Number(u);if(!Number.isFinite(l))return"--";return`${Math.round(Math.max(0,Math.min(1,l))*100)}%`}function pu(u){return typeof u==="object"&&u!==null&&!Array.isArray(u)}function Mu(u){return Array.isArray(u)?u:[]}function fl(u){if(!u)return null;let l=new Date(u);return Number.isNaN(l.getTime())?null:l.getTime()}function c6(u){return Number.isFinite(Number(u))?new Date(Number(u)).toISOString():""}function t6(...u){for(let l of u){let f=fl(l);if(f!==null)return new Date(f).toISOString()}return""}function LQ(...u){let l=u.map(fl).filter((f)=>f!==null);return l.length>0?new Date(Math.max(...l)).toISOString():""}function KQ(u){return["succeeded","failed","skipped","cancelled","canceled","completed"].includes(String(u||"").toLowerCase())}function Vw(u){let l=cw(u).toLowerCase();return["running","active","in-progress","in_progress"].includes(l)}function Jw(u,l="status"){return u.reduce((f,n)=>{let y=String(n?.[l]||"unknown").toLowerCase();return f[y]=(f[y]||0)+1,f},{})}function Bw(u){if(!u||typeof u!=="string")return null;try{let l=JSON.parse(u);return pu(l)?l:null}catch{return null}}function yQ(u){let l=u.map(Bw).filter((i)=>Boolean(i)),f=l.flatMap((i)=>[i.timestamp,i.createdAt,i.updatedAt]).filter(Boolean),n=LQ(...f),y=Array.from(new Set(l.map((i)=>String(i.event||i.action||i.type||"")).filter(Boolean))).slice(0,3);return{total:u.length,parsed:l.length,lastAt:n,eventKinds:y}}function Vr(u){if(u===null||u===void 0)return"--";if(typeof u==="boolean")return u?"是":"否";if(typeof u==="number")return String(u);if(typeof u==="string")return u.length>80?`${u.slice(0,77)}...`:u;if(Array.isArray(u))return`${u.length} 项`;if(typeof u==="object")return`${Object.keys(u).length} 字段`;return String(u)}function Xw(u,l=280){if(u===null||u===void 0)return"";let n=(typeof u==="string"?u:String(u)).replace(/\r\n/gu,` +`).trim();return n.length>l?`${n.slice(0,Math.max(0,l-1))}...`:n}function cw(u){if(typeof u==="string")return u;if(pu(u))return String(u.status||u.state||u.phase||"unknown");return"unknown"}function SM(u){return u.filter((l)=>l&&l.value!==void 0&&l.value!==null&&String(l.value)!=="")}function jQ({items:u}){let l=SM(Mu(u));return H("div",{className:"pipeline-kv-grid"},l.map((f)=>H("span",{key:f.label},H("b",null,f.label),H("span",null,f.value))))}function zQ({items:u}){let l=Mu(u).map((f)=>String(f||"")).filter(Boolean);if(l.length===0)return null;return H("div",{className:"pipeline-chip-row"},l.map((f,n)=>H("span",{key:`${n}-${f}`},f)))}function JQ(u,l){let f=String(l?.procedureRunId||""),n=Mu(u?.procedureRuns);return n.find((y)=>String(v0(y))===f)||n.at(-1)||null}function PM(u,l){let f=String(l||"");if(!f)return null;return Mu(u?.procedureRuns).find((n)=>v0(n)===f)||null}function iQ(u){return Mu(u?.attempts).length}function Qw(u){return Mu(u?.attempts).reduce((l,f)=>l+Sr(f).length,0)}function Sr(u){return Mu(u?.opencodeMessages?.steps).filter(pu)}function Yw(u){let l=String(u?.status||"").toLowerCase();if(["error","failed","failure"].includes(l))return"failed";if(["completed","succeeded","success"].includes(l))return"succeeded";if(["running","started","in_progress"].includes(l))return"running";return"unknown"}function MM(u,l){let f=UQ(u.map((i)=>i?.agent)).slice(0,3),n=UQ(u.map((i)=>i?.model)).slice(0,3),y=l.length<=2?l.map((i)=>`session ${i}`):[`sessions ${l.length}`,...l.slice(0,2).map((i)=>`session ${i}`)];return[...f.map((i)=>`agent ${i}`),...n.map((i)=>`model ${i}`),...y]}function V6(u,l=0){return String(u?.messageId||u?.index||"")||`step-${l}`}function CM({steps:u,sessionIds:l,sessionFacts:f,matchedStepKey:n}){let y=Mu(u),i=y.findIndex((G,W)=>V6(G,W)===n),_=i>=0?y[i]:null,$=y.flatMap((G)=>[fl(G?.createdAt),fl(G?.completedAt)]).filter((G)=>G!==null),A=$.length>0?Math.min(...$):null,j=$.length>0?Math.max(...$):null,J=A!==null&&j!==null?Math.max(0,j-A):null,Q=y.reduce((G,W)=>G+Mu(W?.parts).filter((L)=>String(L?.type||"").toLowerCase()==="tool").length,0),U=y.reduce((G,W)=>G+Mu(W?.parts).filter((L)=>["text","reasoning"].includes(String(L?.type||"").toLowerCase())).length,0),F=y.reduce((G,W)=>G+Mu(W?.parts).filter((L)=>String(L?.type||"").toLowerCase()==="tool"&&Yw(L)==="failed").length,0),N=[`${y.length} steps`,`${l.length} sessions`,`${U} messages`,`${Q} tools`,J!==null?`duration ${I0(J)}`:"",F>0?`${F} failed tools`:""].filter(Boolean),K=_?[`Step ${_?.index??i+1}`,String(_?.role||"role --"),_?.model?`model ${_.model}`:"",_?.finish?`finish ${_.finish}`:"",_?.durationMs!==void 0&&_?.durationMs!==null?`duration ${I0(_.durationMs)}`:""].filter(Boolean):[];return H("section",{className:"pipeline-trace-timeline","data-testid":"pipeline-step-timeline"},H("div",{className:"pipeline-trace-head"},H("div",null,H("b",null,"OpenCode Trace"),H("span",null,"Trace 使用 Code Queue 统一样式展示完整 agent loop;Pipeline 旧 step/message/tool 卡片样式已废弃。")),H("div",{className:"pipeline-trace-session-head","data-testid":"pipeline-step-timeline-session"},H("span",null,N.join(" / ")||"Trace"),f.length>0?H(zQ,{items:f}):null)),_?H("div",{className:"pipeline-trace-focus","data-testid":"pipeline-trace-matched-step"},H("span",{className:"codex-output-channel"},"Matched"),H("strong",null,`Gantt selection -> ${K.join(" / ")}`),H("time",null,`${Tr(_?.createdAt)} -> ${Tr(_?.completedAt)}`)):null,H(P4,{port:cq,input:y,className:"codex-transcript pipeline-trace",testId:"pipeline-opencode-step-trace",emptyText:"暂无 OpenCode Trace 输出",keepRecentToolCalls:3}))}function QQ(u){return Mu(u).flatMap((l)=>{if(pu(l))return[l];let f=Bw(l);return f?[f]:[]})}function Fn(u){return String(u?.event||u?.action||u?.requestedAction||u?.type||"").toLowerCase()}function e_(u){return t6(u?.timestamp,u?.createdAt,u?.updatedAt,u?.startedAt,u?.finishedAt)}function pM(u){return fl(e_(u))}function Pr(u){return String(u?.attempt||u?.id||"")}function UQ(u){let l=new Set,f=[];for(let n of u){let y=String(n||"");if(!y||l.has(y))continue;l.add(y),f.push(y)}return f}function Uw(u){switch(String(u||"").toLowerCase()){case"monitor":return"monitor";case"webui":return"webui";case"cli":return"cli";case"system":return"runner";default:return String(u||"--")}}function wi(u){return String(u?.requestedAction||u?.action||"").toLowerCase()}function B6(u){switch(wi(u)){case"guide":return"引导";case"modify":return"修改";case"approve":return"审核通过";case"restart":return"重启";case"redo":return"重做";default:return String(u?.requestedAction||u?.action||"控制")}}function Nw(u){switch(Fn(u)){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`${B6(u)} 已发起`;case"control-command-applied":return`${B6(u)} 已生效`;case"control-command-ignored":return`${B6(u)} 已忽略`;default:return String(u?.event||u?.action||u?.requestedAction||"event")}}function Fw(u){return Xw(u?.promptPreview||u?.reasonPreview||u?.prompt||u?.reason||"",240)}function xM(u){let l=String(u?.prompt||""),f=String(u?.reason||u?.restartReason||""),n=l?"":String(u?.promptPreview||""),y=f?"":String(u?.reasonPreview||"");return[l||n?{label:l?"prompt":"prompt preview",value:l||n}:null,f||y?{label:f?"reason":"reason preview",value:f||y}:null,Mu(u?.resetNodeIds).length>0?{label:"reset nodes",value:Mu(u.resetNodeIds).join(", ")}:null,Mu(u?.runningResetNodeIds).length>0?{label:"interrupted running nodes",value:Mu(u.runningResetNodeIds).join(", ")}:null,Mu(u?.interruptedProcedureRunIds).length>0?{label:"interrupted procedures",value:Mu(u.interruptedProcedureRunIds).join(", ")}:null,u?.interruptedProcedureRunId?{label:"interrupted procedure",value:String(u.interruptedProcedureRunId)}:null].filter(Boolean)}function _Q(u){let l=Sr(u),f=l.map((A)=>fl(A?.createdAt)).filter((A)=>A!==null),n=l.map((A)=>fl(A?.completedAt)??fl(A?.createdAt)).filter((A)=>A!==null),y=QQ(u?.controlEventRecords).map((A)=>pM(A)).filter((A)=>A!==null),i=Mu(u?.assistantOutputs).map((A)=>fl(A?.updatedAt)).filter((A)=>A!==null),_=f[0]??y[0]??i[0]??null,$=n.at(-1)??y.at(-1)??i.at(-1)??_;return{startMs:_,endMs:$}}function mM(u,l,f,n,y=""){let i=Mu(u?.procedureRuns).filter(($)=>Mr($,l)===f);if(i.length===0)return null;if(y){let $=i.find((A)=>v0(A)===y);if($)return $}if(n===null)return i.at(-1)||null;let _=i.find(($)=>{let A=fl(Er($,u)),j=fl(Hr($,u))??A;return A!==null&&j!==null&&n>=A-1000&&n<=j+1000});if(_)return _;return i.slice().sort(($,A)=>{let j=fl(Er($,u))??n,J=fl(Hr($,u))??j,Q=fl(Er(A,u))??n,U=fl(Hr(A,u))??Q,F=Math.min(Math.abs(j-n),Math.abs(J-n)),N=Math.min(Math.abs(Q-n),Math.abs(U-n));return F-N})[0]||null}function Dw(u,l){let f=Mu(u?.attempts).filter(pu);if(f.length===0)return null;let n=String(l?.attempt||"");if(n){let _=f.find(($)=>Pr($)===n);if(_)return _}let y=Number.isFinite(Number(l?.ms))?Number(l.ms):null;if(y===null)return f.at(-1)||null;let i=f.find((_)=>{let $=_Q(_);return Number.isFinite($.startMs)&&Number.isFinite($.endMs)&&y>=Number($.startMs)-1000&&y<=Number($.endMs)+1000});if(i)return i;return f.slice().sort((_,$)=>{let A=_Q(_),j=_Q($),J=Math.min(Math.abs(Number(A.startMs??y)-y),Math.abs(Number(A.endMs??y)-y)),Q=Math.min(Math.abs(Number(j.startMs??y)-y),Math.abs(Number(j.endMs??y)-y));return J-Q})[0]||f.at(-1)||null}function tw(u,l){let f=Sr(u);if(f.length===0)return{step:null,stepIndex:-1,stepKey:""};if(l===null){let i=f[0];return{step:i,stepIndex:0,stepKey:V6(i,0)}}for(let i=0;i=$-1000&&l<=A+1000)return{step:_,stepIndex:i,stepKey:V6(_,i)}}let n=f.findIndex((i)=>{let _=fl(i?.createdAt)??fl(i?.completedAt);return _!==null&&_>=l});if(n>=0){let i=f[n];return{step:i,stepIndex:n,stepKey:V6(i,n)}}let y=Math.max(0,f.length-1);return{step:f[y],stepIndex:y,stepKey:V6(f[y],y)}}function RM(u,l){let f=String(l?.runId||u?.runId||"");if(String(l?.mode||"")==="interval"){let j=l?.interval||{},J=JQ(u,j)||j.raw||{};return{mode:"interval",runId:f,interval:j,marker:null,nodeId:String(j?.nodeId||Mr(J,f)||""),procedure:J,attempt:null,matchedStep:null,matchedStepIndex:-1,matchedStepKey:""}}let n=pu(l?.marker)?l.marker:{},y=Number.isFinite(Number(n?.ms))?Number(n.ms):null,i=String(n?.nodeId||""),_=i?mM(u,f,i,y,String(n?.procedureRunId||"")):null,$=_?Dw(_,n):null,A=$?tw($,y):{step:null,stepIndex:-1,stepKey:""};return{mode:"event",runId:f,interval:null,marker:n,nodeId:i,procedure:_,attempt:$,matchedStep:A.step,matchedStepIndex:A.stepIndex,matchedStepKey:A.stepKey}}function bM({procedure:u,matchedStepKey:l="",matchedAttemptId:f=""}){let n=Mu(u?.attempts);if(n.length===0)return H(T0,{title:"暂无 attempt 详情",text:"当前 procedure 还没有可展示的 attempt / OpenCode Trace;若刚点击甘特线,请等待 node 详情抓取完成。"});return n.map((y,i)=>{let _=y?.opencodeMessages||{},$=Sr(y),A=Mu(_.sessionIds).map((U)=>String(U)).filter(Boolean),j=MM($,A),J=Pr(y)||`attempt-${i+1}`,Q=$.reduce((U,F)=>U+Mu(F?.parts).filter((N)=>String(N?.type||"").toLowerCase()==="tool"&&Yw(N)==="failed").length,0);return H("article",{key:J,className:`pipeline-attempt-card ${f===J?"matched":""}`},H("div",{className:"pipeline-attempt-head"},H("div",null,H("strong",null,J),H("span",null,_.source||"opencode")),H("div",{className:"pipeline-attempt-badges"},H("span",null,`${$.length} steps`),H("span",null,`${_.toolCallCount??"--"} tools`),Q>0?H("span",{className:"danger"},`${Q} failed`):null)),H(jQ,{items:[{label:"messages",value:_.messageCount??"--"},{label:"steps",value:_.stepCount??"--"},{label:"tools",value:_.toolCallCount??"--"},{label:"updated",value:Zu(_.updatedAt)},{label:"sessions",value:A.join(", ")||"--"}]}),$.length===0?H("p",{className:"muted paragraph"},"当前 attempt 尚未返回 OpenCode Trace;请确认 D601 pipeline-control 已重建并重新抓取。"):H(CM,{steps:$,sessionIds:A,sessionFacts:j,matchedStepKey:l}))})}function $Q(u,l){return`${u}::${l}`}function Br(u,l,f){if(!pu(u))return null;return String(u.runId||"")===l&&String(u.nodeId||"")===f?u:null}function kM(u,l){let f=pu(u)?u:{};if(!pu(l))return f;let n=Mu(l.attempts),y=Mu(f.attempts);return{...f,...l,attempts:n.length>0?n:y}}function hM(u,l,f,n){if(!Br(l,f,n))return u;let y=Mu(l.procedureRuns),i=pu(u)?u:{};return{...i,...l,controlEvents:Mu(l.controlEvents).length>0?l.controlEvents:i.controlEvents,procedureRuns:y.length>0?y:i.procedureRuns}}function IM({selection:u,runDetails:l,nodeDetails:f,nodeDetailsState:n,onRaw:y,onCollapse:i}){if(!u?.mode)return H("aside",{className:"pipeline-gantt-detail-panel empty","data-testid":"pipeline-gantt-detail-panel"},H("div",{className:"pipeline-gantt-detail-head"},H("div",null,H("span",{className:"panel-eyebrow"},"Gantt Detail"),H(nl,{title:"未选择元素",level:3})),H("button",{type:"button",className:"ghost-btn mini",onClick:i,"data-testid":"pipeline-gantt-sidebar-collapse"},"收起")),H(T0,{title:"选择一条执行线或一个控制点",text:"点击甘特图中的 node 执行线、prompt 点或控制点,在这里查看结构化过程和 OpenCode step。"}));let _=String(u?.runId||""),$=String(u?.interval?.nodeId||u?.marker?.nodeId||""),A=l?.runId===_?l.details:null,j=Br(f,_,$),J=String(n?.runId||"")===_&&String(n?.nodeId||"")===$,Q=hM(A,j,_,$),U=(String(l?.runId||"")!==_||Boolean(l?.loading))&&!Q,F=String(l?.runId||"")===_?String(l?.error||""):"",N=J?String(n?.error||""):"",K=Q?RM(Q,u):null,G=K?.interval||u?.interval||null,W=K?.marker||u?.marker||null,L=String(G?.procedureRunId||W?.procedureRunId||""),q=j?PM(j,L)||JQ(j,G||{procedureRunId:L}):null,z=K?.procedure||(Q?JQ(Q,G||{procedureRunId:L}):null)||G?.raw||{};if(q&&(iQ(z)===0||Qw(q)>=Qw(z)))z=kM(z,q);let Z=K?.attempt||null,T=String(K?.matchedStepKey||"");if(!Z&&W&&iQ(z)>0)Z=Dw(z,W),T=String(tw(Z,Number.isFinite(Number(W?.ms))?Number(W.ms):null).stepKey||"");let X=Pr(Z),c=iQ(z)>0,S=J&&Boolean(n?.loading)&&!c,p=Boolean(U||S),Y=[c?"":F,N].filter(Boolean).join(" / "),D=J&&n?.fetchedAt?n.fetchedAt:l?.fetchedAt,x=cw(z?.status||G?.status||W?.status||W?.event),V=u?.mode==="event"?W?.label||Nw(W?.raw||W)||"event":K?.nodeId||G?.nodeId||"node",t=W?xM(W?.raw||W):[],M=W?[Fn(W?.raw||W)?`event ${Fn(W?.raw||W)}`:"",W?.promptEvent?`prompt ${W.promptEvent}`:"",W?.action?`action ${W.action}`:"",W?.sourceKind?`source ${Uw(W.sourceKind)}`:"",W?.sourceNodeId?`from ${W.sourceNodeId}`:"",W?.targetNodeId?`to ${W.targetNodeId}`:"",W?.snapReason?`draw ${W.snapReason}`:""].filter(Boolean):[];return H("aside",{className:"pipeline-gantt-detail-panel","data-testid":"pipeline-gantt-detail-panel"},H("div",{className:"pipeline-gantt-detail-head"},H("div",null,H("span",{className:"panel-eyebrow"},u?.mode==="event"?"Gantt Event Detail":"Gantt Line Detail"),H(nl,{title:V,level:3,loading:p})),H("div",{className:"pipeline-gantt-detail-head-actions"},H(Gy,{status:x},x),H("button",{type:"button",className:"ghost-btn mini",onClick:i,"data-testid":"pipeline-gantt-sidebar-collapse"},"收起"))),W?H("article",{className:"pipeline-event-card"},H("div",{className:"pipeline-event-card-head"},H("strong",null,W?.label||Nw(W?.raw||W)),H(zQ,{items:M})),H(jQ,{items:[{label:"event time",value:Zu(W?.timestampIso||W?.timestamp||"--")},W?.snapped?{label:"drawn time",value:Zu(W?.renderedTimestampIso||W?.ms)}:null,{label:"node",value:W?.nodeId||"--"},{label:"procedure",value:W?.procedureRunId||v0(z)||"--"},{label:"attempt",value:W?.attempt||X||"--"},{label:"source kind",value:W?.sourceKind?Uw(W.sourceKind):"--"},{label:"source node",value:W?.sourceNodeId||"--"},{label:"target node",value:W?.targetNodeId||"--"},{label:"command",value:W?.commandId||W?.eventId||"--"},W?.snapReason?{label:"placement",value:W.snapReason}:null]}),t.length>0?H("div",{className:"pipeline-event-blocks"},t.map((I,O)=>H("section",{key:`${I.label}-${O}`,className:"pipeline-event-text-block"},H("b",null,I.label),H("p",null,I.value)))):null,Fw(W?.raw||W)?H("p",{className:"pipeline-text-preview"},Fw(W?.raw||W)):null):null,H(jQ,{items:[{label:"epoch",value:_||G?.runId||"--"},{label:"node",value:K?.nodeId||G?.nodeId||W?.nodeId||"--"},{label:"procedure",value:G?.procedureRunId||W?.procedureRunId||v0(z)||"--"},{label:"started",value:Zu(G?.startedAt||z?.startedAt)},{label:"finished",value:Zu(G?.finishedAt||z?.finishedAt)},{label:"duration",value:I0(G?.durationMs||z?.durationMs)},{label:"fetched",value:D?rl(D):"--"},K?.matchedStep?{label:"matched step",value:`Step ${K.matchedStep.index??K.matchedStepIndex+1}`}:null]}),H(ul,{error:Y}),H("div",{className:"pipeline-gantt-detail-actions"},H(Wn,{title:`Procedure ${G?.procedureRunId||W?.procedureRunId||K?.nodeId||"node"}`,data:z,onOpen:y,testId:"raw-pipeline-gantt-procedure"}),W?H(Wn,{title:`Pipeline event ${W?.id||W?.commandId||W?.eventId||K?.nodeId||"event"}`,data:W?.raw||W,onOpen:y,testId:"raw-pipeline-gantt-event"}):null,Q?H(Wn,{title:`Pipeline run ${_||"--"}`,data:Q,onOpen:y,testId:"raw-pipeline-gantt-node-details"}):null),!p&&!v0(z)&&!W?H(T0,{title:"暂无过程详情",text:"当前选择还没有可匹配的 procedure 运行记录。"}):null,!p&&v0(z)?H(bM,{procedure:z,matchedStepKey:T,matchedAttemptId:X}):null)}function vM({value:u}){let f=String(u||"--").split(/([_-])/u);return H(zy.default.Fragment,null,f.map((n,y)=>n==="-"||n==="_"?H(zy.default.Fragment,{key:y},n,H("wbr",null)):H(zy.default.Fragment,{key:y},n)))}async function qy(u,l={}){return Eu(u,{invalidJsonPrefix:"Pipeline 返回了无效 JSON",...l})}function Gy({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return H("span",{className:`status-badge ${f}`},l||u||"unknown")}function sf({label:u,value:l,hint:f,tone:n}){return H("article",{className:`metric-card ${n||""}`},H("div",{className:"metric-label"},u),H("div",{className:"metric-value"},l),H("div",{className:"metric-hint"},f))}function pn({title:u,eyebrow:l,actions:f,children:n,className:y,loading:i}){return H("section",{className:`panel ${y||""}`},H("div",{className:"panel-head"},H("div",null,l?H("p",{className:"panel-eyebrow"},l):null,H(nl,{title:u,loading:i})),f?H("div",{className:"panel-actions"},f):null),H("div",{className:"panel-body"},n))}function Wn({title:u,data:l,onOpen:f,testId:n}){return H("button",{type:"button",className:"ghost-btn","data-testid":n,onClick:()=>f(u,l)},"查看原始JSON")}function h0({title:u,subtitle:l,facts:f,data:n,onRaw:y,testId:i}){let _=Mu(f).map(($)=>String($||"")).filter(Boolean);return H("article",{className:"pipeline-evidence-row"},H("div",{className:"pipeline-evidence-main"},H("strong",null,u),l?H("span",null,l):null),H("div",{className:"pipeline-evidence-facts"},_.map(($,A)=>H("span",{key:`${A}-${$.slice(0,16)}`},$))),n!==void 0?H(Wn,{title:u,data:n,onOpen:y,testId:i}):null)}function T0({title:u,text:l}){return H("div",{className:"empty-state"},H("strong",null,u),H("span",null,l))}function gM(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function sM(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function aM(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function oM(u){return{components:Array.isArray(u?.registry?.components)?u.registry.components:[],pipelines:Array.isArray(u?.pipelines)?u.pipelines:[],runs:Array.isArray(u?.runs)?u.runs:[]}}function Ww(u,l,f){let n=u?._unidesk?.arrayLimits?.[l],y=Number(n?.originalLength);return Number.isFinite(y)?y:f}function Sw(u){if(!u||typeof u!=="object"||Array.isArray(u))return"--";return`${u.componentClass||"--"}/${u.id||"--"}`}function Xr(u){if(!u||typeof u!=="object"||Array.isArray(u))return"";let l=String(u.componentClass||"").trim(),f=String(u.id||"").trim();return l&&f?`${l}/${f}`:""}function GQ(u){return u?.config&&typeof u.config==="object"&&!Array.isArray(u.config)?u.config:{}}function Pw(u){let l=GQ(u),f=Array.isArray(l.nodes)?l.nodes:Array.isArray(u?.nodes)?u.nodes:[],n=new Map;for(let _ of f){let $=String(_?.id||_?.nodeId||"");if($)n.set($,{..._,id:$})}let y=wQ(u),i=(_)=>{if(_&&!n.has(_))n.set(_,{id:_})};for(let _ of ZQ(u))Y6(_).forEach(i);for(let _ of y)i(String(_?.from||_?.source||"")),i(String(_?.to||_?.target||""));return Array.from(n.values())}function wQ(u){let l=GQ(u);return Array.isArray(l.edges)?l.edges:Array.isArray(u?.edges)?u.edges:[]}function ZQ(u){let l=GQ(u);return Array.isArray(l.topologicalBatches)?l.topologicalBatches:Array.isArray(u?.topologicalBatches)?u.topologicalBatches:[]}function dM(u){let l=new Map;for(let f of u){let n=Xr(f);if(n)l.set(n,f);let y=Array.isArray(f?.refs)?f.refs:[];for(let i of y){let _=Xr(i);if(_)l.set(_,f)}}return l}function qw(u,l){let f=l.get(Xr(u?.componentRef));if(f)return f;let n=Xr({componentClass:u?.kind,id:u?.id});return n?l.get(n)||null:null}function Lw(u,l){let f=Mw(u,l);return String(f?.status||"pending")}function Mw(u,l){return(Array.isArray(u?.nodes)?u.nodes:[]).find((n)=>n?.nodeId===l||n?.id===l)||null}function eM(u){return u.reduce((l,f)=>{let n=String(f?.status||"unknown").toLowerCase();return l[n]=(l[n]||0)+1,l},{})}function uC(u){if(Array.isArray(u?.scorers))return u.scorers.filter(pu);if(Array.isArray(u?.summary?.scorers))return u.summary.scorers.filter(pu);if(Array.isArray(u?.artifact?.summary?.scorers))return u.artifact.summary.scorers.filter(pu);return[]}function lC(u){if(pu(u?.run))return u.run;if(pu(u?.runSummary))return u.runSummary;return null}function fC(u,l){if(!pu(u)&&!pu(l))return null;if(!pu(u))return l;if(!pu(l))return u;return{...u,...l,request:pu(u.request)||pu(l.request)?{...pu(u.request)?u.request:{},...pu(l.request)?l.request:{}}:l.request??u.request,artifact:pu(u.artifact)||pu(l.artifact)?{...pu(u.artifact)?u.artifact:{},...pu(l.artifact)?l.artifact:{}}:l.artifact??u.artifact,summary:pu(u.summary)||pu(l.summary)?{...pu(u.summary)?u.summary:{},...pu(l.summary)?l.summary:{}}:l.summary??u.summary}}function cr(u){let l=uC(u),f=l.find((J)=>pu(J?.score))||l[0]||null,n=pu(f?.score)?f.score:{},y=Number(n.passed),i=Number(n.total),_=Number(n.ratio),$=Number.isFinite(_)?_:Number.isFinite(y)&&Number.isFinite(i)&&i>0?y/i:null,A=$===null?null:Math.round(Math.max(0,Math.min(100,$<=1?$*100:$))),j=String(n.text||(Number.isFinite(y)&&Number.isFinite(i)?`${y}/${i}`:""));return{scorer:f,scorers:l,score:n,passed:Number.isFinite(y)?y:null,total:Number.isFinite(i)?i:null,percent:A,text:j}}function NQ(u){let l=cr(u);return l.text||(l.scorers.length>0?String(l.scorer?.status||"pending"):"--")}function EQ(u){let l=cr(u);if(l.total>0&&l.passed===l.total)return"succeeded";if(l.total>0&&l.passed>0)return"running";if(l.scorers.length>0)return"failed";return"pending"}function nC(u){return Array.isArray(u?.items)?u.items.filter(pu):[]}function yC({run:u}){let l=NQ(u);return H("span",{className:`pipeline-score-badge ${EQ(u)}`},`score ${l}`)}function iC({run:u,onRaw:l}){let n=cr(u).scorers;if(!u)return H(T0,{title:"暂无评分",text:"选择一个 epoch 后会显示 scorer 结果。"});if(n.length===0)return H("div",{className:"pipeline-score-empty"},H("strong",null,"评分器等待中"),H("span",null,"DAG 完成后,Pipeline control backend 会把 scorer summary 追加到 run artifact,并通过 UniDesk 显示。"));return H("div",{className:"pipeline-score-board","data-testid":"pipeline-score-board"},n.map((y,i)=>{let _=cr({scorers:[y]}),$=nC(y),A=_.percent??0;return H("article",{key:`${y.scorerId||y.component||i}`,className:`pipeline-score-card ${EQ({scorers:[y]})}`},H("div",{className:"pipeline-score-head"},H("div",null,H("span",null,y.scorerId||y.component||"scorer"),H("strong",null,_.text||y.status||"--")),H(Gy,{status:y.status||"unknown"},y.status||"unknown")),H("div",{className:"pipeline-score-meter","aria-label":`score ${A}%`},H("span",{style:{width:`${A}%`}})),H("div",{className:"pipeline-score-facts"},H("span",null,`${A}%`),H("span",null,y.component||"--"),H("span",null,y.applicationCheckoutRef||"--")),$.length>0?H("div",{className:"pipeline-score-items"},$.map((j)=>H("span",{key:`${j.id||j.filter}`,className:`pipeline-score-item ${String(j.status||"").toLowerCase()}`,title:`${j.filter||"--"} / ran=${j.ran??"?"}`},H("b",null,j.id||"--"),H("small",null,j.status||"--")))):H("p",{className:"muted paragraph"},"当前 scorer 尚未返回 item 级结果。"),y.error?H("p",{className:"pipeline-score-error"},Xw(y.error,360)):null,H("div",{className:"panel-actions inline-actions"},H(Wn,{title:`Scorer ${y.scorerId||i}`,data:y,onOpen:l,testId:"raw-pipeline-score"})))}))}function _C(u){let l=u.reduce((f,n)=>{let y=String(n?.componentClass||"unknown");return f[y]=(f[y]||0)+1,f},{});return Object.entries(l).map(([f,n])=>({name:f,count:Number(n)})).sort((f,n)=>n.count-f.count||f.name.localeCompare(n.name))}function Y6(u){if(Array.isArray(u))return u.map((l)=>typeof l==="string"?l:String(l?.id||l?.nodeId||"")).filter(Boolean);if(Array.isArray(u?.nodes))return Y6(u.nodes);if(Array.isArray(u?.nodeIds))return Y6(u.nodeIds);return[]}function $C(u){return pu(u?.instanceInputs?.monitor)?u.instanceInputs.monitor:{}}function Cw(u,l){if(String(u?.kind||"").toLowerCase()!=="procedure")return!1;let f=$C(u);if(u?.instanceInputs?.monitorMode===!0||f.enabled===!0)return!0;let n=Sw(u?.componentRef);return String(l?.id||l?.config?.id||n||"").toLowerCase().includes("monitor")}function AC(u){return u.filter((l)=>Cw(l)).map((l)=>String(l?.id||"")).filter(Boolean)}function rC(u,l){if(l.length===0)return u;let f=new Set(l),n=l.filter((y)=>u.includes(y));if(n.length===0)return u;return[...n,...u.filter((y)=>!f.has(y))]}function jC(u,l){if(l.length===0)return u;let f=new Set(l),n=l.filter((i)=>u.some((_)=>_.includes(i)));if(n.length===0)return u;let y=u.map((i)=>i.filter((_)=>!f.has(_))).filter((i)=>i.length>0);return[n,...y]}function JC(u,l,f){let y=ZQ(u).map(Y6).filter((U)=>U.length>0);if(y.length>0)return y;let i=l.map((U)=>String(U?.id||"")).filter(Boolean),_=new Set(i),$=new Map(i.map((U)=>[U,0])),A=new Map(i.map((U)=>[U,[]]));for(let U of f){let F=String(U?.from||U?.source||""),N=String(U?.to||U?.target||"");if(!_.has(F)||!_.has(N))continue;A.get(F)?.push(N),$.set(N,($.get(N)||0)+1)}let j=new Map,J=i.filter((U)=>($.get(U)||0)===0);for(let U of J)j.set(U,0);while(J.length>0){let U=J.shift(),F=(j.get(U)||0)+1;for(let N of A.get(U)||[])if($.set(N,Math.max(0,($.get(N)||0)-1)),j.set(N,Math.max(j.get(N)||0,F)),($.get(N)||0)===0)J.push(N)}i.forEach((U)=>{if(!j.has(U))j.set(U,0)});let Q=Math.max(0,...Array.from(j.values()));return Array.from({length:Q+1},(U,F)=>i.filter((N)=>j.get(N)===F)).filter((U)=>U.length>0)}function QC(u,l,f){let y=ZQ(u).map(Y6).filter(($)=>$.length>0),i=y.length>0?y.flatMap(($)=>$):(()=>{let $=l.map((K)=>String(K?.id||"")).filter(Boolean),A=new Set($),j=f.filter((K)=>String(K?.edgeType||"").toLowerCase()!=="rework"),J=new Map($.map((K)=>[K,0])),Q=new Map($.map((K)=>[K,[]]));for(let K of j){let G=String(K?.from||K?.source||""),W=String(K?.to||K?.target||"");if(!A.has(G)||!A.has(W))continue;Q.get(G)?.push(W),J.set(W,(J.get(W)||0)+1)}let U=new Map,F=$.filter((K)=>(J.get(K)||0)===0);for(let K of F)U.set(K,0);while(F.length>0){let K=F.shift(),G=(U.get(K)||0)+1;for(let W of Q.get(K)||[])if(J.set(W,Math.max(0,(J.get(W)||0)-1)),U.set(W,Math.max(U.get(W)||0,G)),(J.get(W)||0)===0)F.push(W)}$.forEach((K)=>{if(!U.has(K))U.set(K,0)});let N=Math.max(0,...Array.from(U.values()));return Array.from({length:N+1},(K,G)=>$.filter((W)=>U.get(W)===G)).flatMap((K)=>K)})(),_=new Set(i);for(let $ of l){let A=String($?.id||"");if(!A||_.has(A))continue;i.push(A),_.add(A)}return rC(i,AC(l))}function H6(u){return`${u.source}->${u.target}-${u.index}`}function Kw(u,l,f){let n=Pw(u),y=wQ(u),i=dM(f),_=new Map(n.map((x)=>[String(x?.id||""),x])),$=n.filter((x)=>Cw(x,qw(x,i))).map((x)=>String(x?.id||"")).filter(Boolean),A=jC(JC(u,n,y),$),j=[],J=new Map,Q=330,U=122;A.forEach((x,V)=>{let t=x.length*122;x.forEach((M,I)=>{let O=_.get(M)||{id:M},C=qw(O,i),g=Lw(l,M).toLowerCase(),a=String(O.kind||C?.componentClass||"node").toLowerCase(),yu=Sw(O.componentRef||C),ru=String(C?.config?.version||C?.version||""),R=String(C?.config?.description||C?.description||""),m=I*122-Math.floor(t/2);J.set(M,{column:V,row:I,y:m}),j.push({id:M,type:"pipelineNode",position:{x:V*330,y:m},data:{exportLabel:{id:M,kind:a,componentRef:yu,componentVersion:ru,componentDescription:R,status:g},label:H("div",{className:"flow-node-label"},H("strong",null,M),H("span",null,a),H("code",{title:R||yu},ru?`${yu}@${ru}`:yu),H(Gy,{status:g},g))},className:`pipeline-flow-node ${a} ${g}`})})});let F=y.flatMap((x,V)=>{let t=String(x?.from||x?.source||""),M=String(x?.to||x?.target||"");if(!_.has(t)||!_.has(M))return[];return[{source:t,target:M,index:V,condition:x?.condition,edgeType:x?.edgeType}]}),N=F.reduce((x,V)=>x.set(V.source,(x.get(V.source)||0)+1),new Map),K=F.reduce((x,V)=>x.set(V.target,(x.get(V.target)||0)+1),new Map),G=F.reduce((x,V)=>{let t=`${V.source}->${V.target}`;return x.set(t,(x.get(t)||0)+1)},new Map),W=new Map,L=new Map,q=new Map,z=new Map,Z=new Map,T=new Map,X=F.reduce((x,V)=>{let t=J.get(V.source),M=J.get(V.target),I=(M?.column||0)-(t?.column||0);if(I<=0||String(V.edgeType||"").toLowerCase()==="rework"||I!==1)return x;let C=`${V.source}->column:${M?.column??""}`,g=x.get(C)||[];return g.push(V),x.set(C,g),x},new Map);for(let x of X.values()){if(x.length<2)continue;x.slice().sort((V,t)=>{let M=J.get(V.target),I=J.get(t.target);return(M?.y||0)-(I?.y||0)||V.index-t.index}).forEach((V,t,M)=>{T.set(H6(V),{slot:t-(M.length-1)/2,count:M.length})})}[...F].sort((x,V)=>{let t=J.get(x.source),M=J.get(x.target),I=J.get(V.source),O=J.get(V.target),C=Math.abs((M?.column||0)-(t?.column||0))*330+Math.abs((M?.y||0)-(t?.y||0)),g=Math.abs((O?.column||0)-(I?.column||0))*330+Math.abs((O?.y||0)-(I?.y||0));return C-g||x.index-V.index}).forEach((x)=>{let V=J.get(x.source)||{column:0,row:0,y:0},t=J.get(x.target)||{column:0,row:0,y:0},M=t.column-V.column,I=Math.max(0,M),O=M<=0||String(x.edgeType||"").toLowerCase()==="rework",C=V.y-t.y,g=K.get(x.target)||1,a=T.has(H6(x)),yu=!O&&I<=1&&(a||g===1),ru=Z.get(x.target)||new Map;Z.set(x.target,ru);let R=X6.slice().sort((m,fu)=>{let iu=(Bu)=>{let b=String(Bu.side),o=0;if(O){if(b==="left")o+=86;if(b==="top")o+=t.y<=0?-22:12;if(b==="bottom")o+=t.y>=0?-22:12;if(Math.abs(t.y)<12&&b!=="left")o+=x.index%2===0?b==="top"?-6:6:b==="bottom"?-6:6;return o}if(yu){if(b==="left")o-=a?72:44;if(b!=="left")o+=a?72:44;return o+Math.abs(C)*0.02}if(b==="left")o+=I<=1?0:24;if(b==="top")o+=C<-36?-18:42;if(b==="bottom")o+=C>36?-18:42;if(I<=1&&Math.abs(C)<=82&&b!=="left")o+=38;if(I>1&&b!=="left")o-=10;return o},Ju=V.y-t.y,Vu=Ju!==0?Ju:x.index%2===0?-1:1,Lu=(Bu)=>{let b=ru.get(Bu.id)||0;return iu(Bu)+b*64+XM(Bu,ru,Vu)};return Lu(m)-Lu(fu)||String(m.id).localeCompare(String(fu.id))})[0];ru.set(R.id,(ru.get(R.id)||0)+1),z.set(H6(x),R)});let S=F.map((x)=>{let V=Lw(l,x.target).toLowerCase(),t=`${x.source}->${x.target}`,M=W.get(x.source)||0,I=L.get(x.target)||0,O=q.get(t)||0;W.set(x.source,M+1),L.set(x.target,I+1),q.set(t,O+1);let C=M-((N.get(x.source)||1)-1)/2,g=I-((K.get(x.target)||1)-1)/2,a=O-((G.get(t)||1)-1)/2,yu=J.get(x.source),ru=J.get(x.target),R=(ru?.column||0)-(yu?.column||0),m=Math.max(1,Math.abs(R)),fu=R<=0||String(x.edgeType||"").toLowerCase()==="rework",iu=Math.abs((ru?.y||0)-(yu?.y||0)),Ju=T.get(H6(x)),Vu=!fu&&R===1&&(K.get(x.target)||0)>1,Lu=Ju?Ju.slot:a*2+C+g*0.45,Bu=Lu===0?x.index%2===0?-1:1:Math.sign(Lu),b=z.get(H6(x))||X6[1],o=b.side==="top"?-1:b.side==="bottom"?1:Bu,nu=fu||m>1||iu>96||Math.abs(Lu)>0.2||b.side!=="left",wu=fu?118+m*18:22+m*16,d=b.side==="left"?0:28,zu=nu?Math.max(-280,Math.min(280,o*Math.min(180,wu+d+iu*0.22)+Lu*28)):0,v=Math.max(0,Math.min(T6.length-1,Math.round(C+(T6.length-1)/2))),$u=T6[v]||T6[1],Wu=V==="succeeded"?"var(--accent-2)":V==="running"?"var(--accent)":V==="failed"?"var(--danger)":"rgba(129, 147, 159, 0.78)",tu=yu?.column||0,hu=ru?.column||0,$l=zu===0?0:Math.sign(zu),gu=fu?`feedback:${tu}->${hu}:${$l}`:Ju?`fanout:${tu}->${hu}:${x.source}`:Vu?`fanin:${tu}->${hu}:${x.target}`:b.side!=="left"||m>1?`corridor:${tu}->${hu}:${b.side}:${$l}:${Math.round(Math.abs(zu)/56)}`:"";return{id:`${x.source}->${x.target}-${x.index}`,source:x.source,target:x.target,sourceHandle:$u.id,targetHandle:b.id,type:"pipelineCurve",zIndex:12,animated:V==="running",data:{baseEdgeColor:Wu,laneOffset:zu,routeMode:Ju&&b.side==="left"?"direct-forward-left":"",targetSide:b.side,isFeedback:fu,overlapGroup:gu},targetStatus:V}}),p=S.reduce((x,V)=>{let t=String(V.data?.overlapGroup||"");return t?x.set(t,(x.get(t)||0)+1):x},new Map),Y=new Map,D=S.map((x)=>{let V=String(x.targetStatus||"pending"),t={...x};delete t.targetStatus;let M=String(x.data?.overlapGroup||""),I=M?p.get(M)||0:0,O=I>1?Y.get(M)||0:-1;if(I>1)Y.set(M,O+1);let C=O>=0?_w[O%_w.length]:String(x.data.baseEdgeColor),g={stroke:C};if(x.data.isFeedback)g.strokeDasharray="9 7";return{...t,data:{...x.data,edgeColor:C,overlapSlot:O,overlapCount:I},style:g,markerEnd:{type:Uy.ArrowClosed,color:C},className:`pipeline-flow-edge ${V} ${x.data.isFeedback?"feedback":""} ${O>=0?"overlap-colored":""}`}});return{nodes:j,edges:D}}function A0(u){return String(u??"").replace(/&/g,"&").replace(//g,">").replace(/"/g,""")}function zw(u){let l=String(u||"");if(l.includes("--accent-2"))return"#4eb7a8";if(l.includes("--accent"))return"#d7a13a";if(l.includes("--danger"))return"#cf6a54";return l.startsWith("#")?l:"#81939f"}function Yr(u){return`arrow-${u.replace(/[^a-zA-Z0-9_-]+/g,"")}`}function pw(u,l="pipeline"){return String(u||l).replace(/[^a-zA-Z0-9_-]+/g,"-").replace(/^-|-$/g,"")||l}function Gw(u,l){let f=u.position.x,n=u.position.y,y=X6.find((i)=>i.id===l);if(y?.side==="top")return{x:f+u$*rw(y.style?.left,0.5),y:n,position:cu.Top};if(y?.side==="bottom")return{x:f+u$*rw(y.style?.left,0.5),y:n+l$,position:cu.Bottom};return{x:f,y:n+l$/2,position:cu.Left}}function UC(u){return{x:u.position.x+u$,y:u.position.y+l$/2}}function NC(u,l){let f=Math.min(...u.nodes.map((K)=>K.position.x),0)-220,n=Math.min(...u.nodes.map((K)=>K.position.y),0)-220,y=Math.max(...u.nodes.map((K)=>K.position.x+u$),1)+220,i=Math.max(...u.nodes.map((K)=>K.position.y+l$),1)+220,_=Math.ceil(y-f),$=Math.ceil(i-n),A=new Map(u.nodes.map((K)=>[K.id,K])),j=u.edges.map((K)=>zw(K.data?.edgeColor||K.style?.stroke)),Q=Array.from(new Set(["#4eb7a8","#d7a13a","#cf6a54","#81939f",...j])).map((K)=>``).join(""),U=u.edges.flatMap((K)=>{let G=A.get(K.source),W=A.get(K.target);if(!G||!W)return[];let L=UC(G),q=Gw(W,String(K.targetHandle||"in-left")),z=Tw(L.x,L.y,q.x,q.y,q.position,Number(K.data?.laneOffset||0),String(K.data?.routeMode||"")),Z=zw(K.data?.edgeColor||K.style?.stroke),T=K.data?.isFeedback?' stroke-dasharray="9 7"':"";return``}).join(` +`),F=u.nodes.map((K)=>{let G=K.data?.exportLabel||{},W=String(G.status||"pending").toLowerCase(),L=W==="succeeded"?"#4eb7a8":W==="running"?"#d7a13a":W==="failed"?"#cf6a54":"#81939f",q=K.position.x,z=K.position.y,Z=X6.map((T)=>{let X=Gw(K,T.id);if(T.side==="top"||T.side==="bottom")return``;return``}).join(` `);return` - + ${Z} - - ${$0(w.id||L.id)} - ${$0(w.kind||"node")} - ${$0(w.componentRef||"--")} - ${$0(W)} + + ${A0(G.id||K.id)} + ${A0(G.kind||"node")} + ${A0(G.componentRef||"--")} + ${A0(W)} `}).join(` `);return{svg:` ${Q} - ${$0(l)} + ${A0(l)} ${F}${U} - `,width:_,height:$}}function NC(u){let l=String(u||"").toLowerCase();if(l==="succeeded"||l==="completed")return"#4eb7a8";if(l==="failed")return"#cf6a54";if(Tw(l))return"#69aee8";return"#d7a13a"}function FC(u){let l=String(u?.kind||""),f=String(u?.tone||u?.status||"").toLowerCase();if(l==="prompt"&&f==="initial")return"#d7a13a";if(l==="prompt"&&f==="monitor")return"#69aee8";if(l==="prompt")return"#4eb7a8";if(f==="modify")return"#e0b95a";if(f==="approve"||f==="guide"||f==="monitor")return"#4eb7a8";if(f==="restart"||f==="redo")return"#d7a13a";if(f==="ignored")return"#81939f";if(f==="webui")return"#69aee8";if(f==="cli")return"#d7a13a";return"#a7bac5"}function Gw(u){let l=String(u?.sourceKind||"").toLowerCase(),f=String(u?.action||"").toLowerCase(),n=String(u?.status||"").toLowerCase();if(f==="observe"||n==="observation"||l==="monitor")return"#4eb7a8";if(l==="webui")return"#69aee8";if(l==="cli")return"#d7a13a";if(n.includes("ignored"))return"#81939f";return"#8aa0ad"}function WC(u,l,f){let n=FC(u),i=String(u?.kind||"");if(i==="control-source")return``;if(i==="control-target"){let _=String(u?.tone||"").toLowerCase()==="approve"?"rgba(78,183,168,0.22)":"#081118";return``}return``}function qC(u){let l=Mu(u.visibleNodeIds).map((O)=>String(O||"")).filter(Boolean),f=Mu(u.intervals).filter(pu),n=Mu(u.markers).filter(pu),i=Mu(u.arrows).filter(pu),y=Mu(u.ticks).filter(pu),_=pu(u.bounds)?u.bounds:{},$=pu(u.backendLayout)?u.backendLayout:null,r=Math.max(240,Math.round(Number(u.chartHeight||360))),j=Math.max(Pn,108),J=128,Q=24,U=58,F=56,N=128+Math.max(1,l.length)*j,L=Math.max(760,N+48),w=114+r+24,W=24,K=58,q=114,z=(O)=>152+O*j,Z=(O)=>z(O)+j/2,T=Mu(u.meta).map((O)=>String(O||"")).filter(Boolean).slice(0,4).join(" · "),c=new Map(n.map((O)=>[String(O.id||""),O])),S=Array.from(new Set(["#4eb7a8","#69aee8","#d7a13a","#cf6a54","#8aa0ad",...i.map(Gw)])).map((O)=>``).join(""),p=y.map((O)=>{let C=114+Iw(O,_,r,$);return` + `,width:_,height:$}}function FC(u){let l=String(u||"").toLowerCase();if(l==="succeeded"||l==="completed")return"#4eb7a8";if(l==="failed")return"#cf6a54";if(Vw(l))return"#69aee8";return"#d7a13a"}function WC(u){let l=String(u?.kind||""),f=String(u?.tone||u?.status||"").toLowerCase();if(l==="prompt"&&f==="initial")return"#d7a13a";if(l==="prompt"&&f==="monitor")return"#69aee8";if(l==="prompt")return"#4eb7a8";if(f==="modify")return"#e0b95a";if(f==="approve"||f==="guide"||f==="monitor")return"#4eb7a8";if(f==="restart"||f==="redo")return"#d7a13a";if(f==="ignored")return"#81939f";if(f==="webui")return"#69aee8";if(f==="cli")return"#d7a13a";return"#a7bac5"}function ww(u){let l=String(u?.sourceKind||"").toLowerCase(),f=String(u?.action||"").toLowerCase(),n=String(u?.status||"").toLowerCase();if(f==="observe"||n==="observation"||l==="monitor")return"#4eb7a8";if(l==="webui")return"#69aee8";if(l==="cli")return"#d7a13a";if(n.includes("ignored"))return"#81939f";return"#8aa0ad"}function qC(u,l,f){let n=WC(u),y=String(u?.kind||"");if(y==="control-source")return``;if(y==="control-target"){let _=String(u?.tone||"").toLowerCase()==="approve"?"rgba(78,183,168,0.22)":"#081118";return``}return``}function LC(u){let l=Mu(u.visibleNodeIds).map((O)=>String(O||"")).filter(Boolean),f=Mu(u.intervals).filter(pu),n=Mu(u.markers).filter(pu),y=Mu(u.arrows).filter(pu),i=Mu(u.ticks).filter(pu),_=pu(u.bounds)?u.bounds:{},$=pu(u.backendLayout)?u.backendLayout:null,A=Math.max(240,Math.round(Number(u.chartHeight||360))),j=Math.max(Cn,108),J=128,Q=24,U=58,F=56,N=128+Math.max(1,l.length)*j,K=Math.max(760,N+48),G=114+A+24,W=24,L=58,q=114,z=(O)=>152+O*j,Z=(O)=>z(O)+j/2,T=Mu(u.meta).map((O)=>String(O||"")).filter(Boolean).slice(0,4).join(" · "),X=new Map(n.map((O)=>[String(O.id||""),O])),S=Array.from(new Set(["#4eb7a8","#69aee8","#d7a13a","#cf6a54","#8aa0ad",...y.map(ww)])).map((O)=>``).join(""),p=i.map((O)=>{let C=114+vw(O,_,A,$);return` - ${$0(Hu(O.ms))} - +${$0(k0(Number(O.offsetMs??Number(O.ms)-Number(_.startMs))))} + ${A0(Zu(O.ms))} + +${A0(I0(Number(O.offsetMs??Number(O.ms)-Number(_.startMs))))} `}).join(` `),Y=['','TIME',...l.map((O,C)=>{let g=z(C),a=O.length>18?`${O.slice(0,16)}…`:O;return` - ${$0(a)} + ${A0(a)} node ${C+1} `})].join(` -`),t=l.map((O,C)=>{return``}).join(` -`),m=f.map((O)=>{let C=l.indexOf(String(O.nodeId||""));if(C<0)return"";let g=114+tA(O,_,r,$),a=Math.max(2,hw(O,_,r,$)),iu=NC(O.status),Au=Z(C)-3.5,R=O.live?``:"",x=a>=28?`${$0(String(O.status||"working"))} - ${$0(k0(O.durationMs))}`:"";return` - +`),D=l.map((O,C)=>{return``}).join(` +`),x=f.map((O)=>{let C=l.indexOf(String(O.nodeId||""));if(C<0)return"";let g=114+tr(O,_,A,$),a=Math.max(2,Iw(O,_,A,$)),yu=FC(O.status),ru=Z(C)-3.5,R=O.live?``:"",m=a>=28?`${A0(String(O.status||"working"))} + ${A0(I0(O.durationMs))}`:"";return` + ${R} - ${x} + ${m} `}).join(` -`),V=n.map((O)=>{let C=l.indexOf(String(O.nodeId||""));if(C<0)return"";let g=114+E0(O,_,r,$);return WC(O,Z(C),g)}).join(` -`),D=i.map((O)=>{let C=c.get(String(O.targetMarkerId||""));if(!C)return"";let g=c.get(String(O.sourceMarkerId||"")),a=String(g?.nodeId||O.sourceNodeId||""),iu=String(C.nodeId||O.targetNodeId||""),Au=l.indexOf(a),R=l.indexOf(iu);if(Au<0||R<0)return"";let x=Z(Au)-24-128,fu=Z(R)-24-128,yu=l$($)?xl(O.sourceY??O.y1)??(g?E0(g,_,r,$):E0(C,_,r,$)):g?E0(g,_,r,$):E0(C,_,r,$),Ju=l$($)?xl(O.targetY??O.y2)??E0(C,_,r,$):E0(C,_,r,$),Vu=Gw(O),Lu=String(O.action||"").toLowerCase()==="observe"?"3 4":"6 5",Bu=$0(vw(x,yu,fu,Ju));return` - `}).join(` -`),M=l.length===0?'No visible Gantt nodes':"";return{svg:` +`),V=n.map((O)=>{let C=l.indexOf(String(O.nodeId||""));if(C<0)return"";let g=114+O0(O,_,A,$);return qC(O,Z(C),g)}).join(` +`),t=y.map((O)=>{let C=X.get(String(O.targetMarkerId||""));if(!C)return"";let g=X.get(String(O.sourceMarkerId||"")),a=String(g?.nodeId||O.sourceNodeId||""),yu=String(C.nodeId||O.targetNodeId||""),ru=l.indexOf(a),R=l.indexOf(yu);if(ru<0||R<0)return"";let m=Z(ru)-24-128,fu=Z(R)-24-128,iu=f$($)?Rl(O.sourceY??O.y1)??(g?O0(g,_,A,$):O0(C,_,A,$)):g?O0(g,_,A,$):O0(C,_,A,$),Ju=f$($)?Rl(O.targetY??O.y2)??O0(C,_,A,$):O0(C,_,A,$),Vu=ww(O),Lu=String(O.action||"").toLowerCase()==="observe"?"3 4":"6 5",Bu=A0(gw(m,iu,fu,Ju));return` + `}).join(` +`),M=l.length===0?'No visible Gantt nodes':"";return{svg:` ${S} - - ${$0(u.title||"Pipeline Epoch Gantt")} - ${$0(T)} + + ${A0(u.title||"Pipeline Epoch Gantt")} + ${A0(T)} ${Y} - - ${t} + + ${D} ${p} - ${m} - ${D} + ${x} + ${t} ${V} ${M} - `,width:L,height:w}}function YA(u,l){let f=URL.createObjectURL(u),n=document.createElement("a");n.href=f,n.download=l,n.click(),setTimeout(()=>URL.revokeObjectURL(f),1000)}async function pw(u,l){let f=Cw(l,"pipeline"),{svg:n,width:i,height:y}=UC(u,l),_=new Blob([n],{type:"image/svg+xml;charset=utf-8"}),$=URL.createObjectURL(_);try{let r=new Image;await new Promise((U,F)=>{r.onload=()=>U(),r.onerror=()=>F(Error("svg image load failed")),r.src=$});let j=document.createElement("canvas");j.width=i,j.height=y;let J=j.getContext("2d");if(!J)throw Error("canvas unavailable");J.drawImage(r,0,0);let Q=await new Promise((U)=>j.toBlob(U,"image/png"));if(!Q)throw Error("png export failed");YA(Q,`${f}.png`)}catch{YA(_,`${f}.svg`)}finally{URL.revokeObjectURL($)}}async function LC(u){let l=Cw(String(u?.title||"pipeline-gantt"),"pipeline-gantt"),{svg:f,width:n,height:i}=qC(u),y=new Blob([f],{type:"image/svg+xml;charset=utf-8"}),_=URL.createObjectURL(y);try{let $=new Image;await new Promise((Q,U)=>{$.onload=()=>Q(),$.onerror=()=>U(Error("gantt svg image load failed")),$.src=_});let r=document.createElement("canvas");r.width=n,r.height=i;let j=r.getContext("2d");if(!j)throw Error("canvas unavailable");j.drawImage($,0,0);let J=await new Promise((Q)=>r.toBlob(Q,"image/png"));if(!J)throw Error("gantt png export failed");YA(J,`${l}.png`)}catch{YA(y,`${l}.svg`)}finally{URL.revokeObjectURL(_)}}async function KC(u){for(let l of u){if(l.flow.nodes.length===0)continue;await pw(l.flow,l.title),await new Promise((f)=>setTimeout(f,750))}}function ww(u,l){return u.find((f)=>String(f?.pipelineId||"")===l)||null}function Zw(u){return fl(u?.startedAt)??fl(u?.artifact?.startedAt)??fl(u?.request?.createdAt)??fl(u?.updatedAt)??0}function zC(u,l){return u.filter((f)=>String(f?.pipelineId||"")===l).slice().sort((f,n)=>Zw(f)-Zw(n)||String(f?.runId||"").localeCompare(String(n?.runId||"")))}function NQ(u,l){let f=String(l?.runId||""),n=u.findIndex((_)=>String(_?.runId||"")===f),i=n>=0?n+1:u.length,y=String(l?.status||"--");return`Epoch ${i} / ${f||"--"} / ${y}`}function h0(u){return String(u?.procedureRunId||u?.runId||"")}function PA(u,l){let f=String(u?.nodeId||u?.request?.nodeId||"");if(f)return f;let n=h0(u),i=`${l}__`;if(n.startsWith(i))return n.slice(i.length).replace(/__\d+$/u,"");return""}function ZA(u,l){let f=pu(u?.artifact)?u.artifact:{},n=pu(u?.request)?u.request:{};return tr(u?.startedAt,f.startedAt,n.createdAt,n.startedAt,u?.createdAt,u?.updatedAt,l?.startedAt,l?.request?.createdAt)}function EA(u,l){let f=String(u?.status?.status||u?.artifact?.status||u?.status||"").toLowerCase(),n=pu(u?.artifact)?u.artifact:{},i=LQ(f);return tr(u?.finishedAt,n.finishedAt,u?.completedAt,i?u?.updatedAt:void 0,i?n.updatedAt:void 0,i?l?.updatedAt:void 0)}function mw(u,l,f=Date.now()){let n=String(u?.runId||""),i=new Set(l.map((y)=>String(y?.id||"")).filter(Boolean));return Mu(u?.procedureRuns).flatMap((y)=>{let _=PA(y,n);if(!_)return[];let $=String(y?.status?.status||y?.artifact?.status||y?.status||"unknown").toLowerCase(),r=ZA(y,u),j=fl(r);if(j===null)return[];let J=EA(y,u),Q=fl(J)??(LQ($)?fl(y?.updatedAt)??j+1000:f),U=Math.max(j+1000,Q);return[{nodeId:_,knownNode:i.has(_),procedureRunId:h0(y),status:$,startMs:j,endMs:U,startedAt:cr(j),finishedAt:cr(U),durationMs:U-j,runId:n,raw:y}]}).sort((y,_)=>y.startMs-_.startMs||y.endMs-_.endMs||y.nodeId.localeCompare(_.nodeId))}function GC(u,l,f=[]){let n=l.map((J)=>Number(J.startMs)).filter(Number.isFinite),i=l.map((J)=>Number(J.endMs)).filter(Number.isFinite);for(let J of f){let Q=xl(J?.eventMs??J?.ms);if(Q!==null)n.push(Q),i.push(Q)}let y=fl(u?.startedAt)??fl(u?.artifact?.startedAt)??fl(u?.request?.createdAt),_=fl(u?.finishedAt)??fl(u?.artifact?.finishedAt)??fl(u?.updatedAt);if(y!==null)n.push(y);if(_!==null)i.push(_);let $=Date.now(),r=n.length>0?Math.min(...n):$-60000,j=Math.max(r+60000,i.length>0?Math.max(...i):$);return{startMs:r,endMs:j,durationMs:j-r}}var HA=12,xw=20,FQ=100,wC=!1;function wi(u){let l=Number(u);if(!Number.isFinite(l))return 0;return Math.max(0,Math.min(100,Math.round(l*100)/100))}function ZC(u){let l=Math.max(HA,Number(u||HA)),f=Math.log(l/HA)/Math.log(xw);return wi(f*100)}var Yr=ZC(FQ);function EQ(u){let l=wi(u)/100,f=HA*Math.pow(xw,l),n=l<0.24?"全局":l<0.64?"均衡":"细节";return{value:wi(l*100),pxPerMinute:f,label:n}}function $Q(u){let l=Math.round(Number(u));return Math.abs(l-FQ)<=1?FQ:l}function EC(u,l=Yr){let f=Math.max(1,Number(u.durationMs||0)/60000),n=EQ(l);return Math.round(Math.max(360,Math.min(7200,f*Number(n.pxPerMinute||48))))}function HC(u,l=7){let f=Math.max(1,Number(u.endMs||0)-Number(u.startMs||0));return Array.from({length:l},(n,i)=>{let y=l===1?0:i/(l-1);return{ms:Number(u.startMs)+f*y,percent:y*100}})}function OC(u,l){let f=Math.max(1,Number(l.endMs)-Number(l.startMs));return Math.max(0,Math.min(100,(u-Number(l.startMs))/f*100))}function xl(u){let l=Number(u);return Number.isFinite(l)?l:null}function HQ(u){return Tw(u?.status)&&!LQ(u?.status)}function Rw(u,l,f,n){let i=Math.max(1,f-l),y=Math.max(0,Math.min(1,(u-l)/i));return Number((y*n).toFixed(3))}function Ew(u,l){if(!l)return null;let f=xl(l?.startMs),n=xl(l?.endMs),i=xl(l?.chartHeight);if(f===null||n===null||i===null)return null;return Rw(u,f,n,i)}function bw(u,l){let f=xl(u?.rawStartMs??u?.startMs)??xl(u?.startMs)??l,n=xl(u?.endMs)??f+1000;if(!HQ(u))return Math.max(f+1000,n);return Math.max(f+1000,n,l)}function TC(u,l,f,n){let i=xl(u?.startMs)??n-60000,y=xl(u?.endMs)??n,_=f.reduce((N,L)=>Math.max(N,bw(L,n)),y),$=Math.max(i+60000,y,_),r=Math.max(1,$-i),j={startMs:i,endMs:$,durationMs:r},J=EC(j,l),Q=EQ(l),U=Math.max(5,Math.min(18,Math.round(J/150))),F=HC(j,U).map((N)=>{let L=Number(N.ms),w=Rw(L,i,$,J);return{...N,y:w,timestamp:cr(L),offsetMs:L-i}});return{source:"frontend-y",startMs:i,endMs:$,durationMs:r,chartHeight:J,scale:wi(l),normalizedScale:Number((wi(l)/100).toFixed(3)),pxPerMinute:Number(Number(Q.pxPerMinute||0).toFixed(3)),ticks:F}}function VC(u,l,f){if(!HQ(u))return u;let n=xl(u?.rawStartMs??u?.startMs)??xl(u?.startMs)??f,i=bw(u,f),y=Ew(n,l),_=Ew(i,l),$=xl(y??u?.y1??u?.startY)??0,r=xl(_??u?.y2??u?.endY)??$+10,j=Math.max(24,r-$);return{...u,live:!0,startMs:n,endMs:i,durationMs:Math.max(1000,i-n),finishedAt:cr(i),y1:$,y2:r,startY:$,endY:r,height:j}}function OQ(u,l,f){return OC(u,l)/100*f}function l$(u){return Boolean(u&&String(u?.source||"")!=="frontend-y")}function kw(u,l,f,n,i){if(l$(n))for(let _ of i){let $=xl(u?.[_]);if($!==null)return $}let y=xl(u?.ms??u?.eventMs??u?.startMs);return OQ(y??Number(l.startMs),l,f)}function tA(u,l,f,n){return kw(u,l,f,n,["y1","startY"])}function WQ(u,l,f,n){if(l$(n)){let y=xl(u?.y2??u?.endY);if(y!==null)return y}let i=xl(u?.endMs)??Number(l.endMs);return OQ(i,l,f)}function hw(u,l,f,n){if(l$(n)){let y=xl(u?.height);if(y!==null)return Math.max(1,y)}let i=u?.live?24:10;return Math.max(i,WQ(u,l,f,n)-tA(u,l,f,n))}function E0(u,l,f,n){return kw(u,l,f,n,["y","timeAxisY"])}function Iw(u,l,f,n){if(l$(n)||String(n?.source||"")==="frontend-y"){let _=xl(u?.y);if(_!==null)return _}let i=xl(u?.percent);if(i!==null)return i/100*f;let y=xl(u?.ms)??Number(l.startMs);return OQ(y,l,f)}function BC(u){let l=String(u?.promptEvent||u?.raw?.promptEvent||u?.event||"").toLowerCase();if(!["node-long-running-observation","node-finished"].includes(l))return"";let f=String(u?.sourceNodeId||u?.raw?.sourceNodeId||u?.raw?.detail?.nodeId||""),n=String(u?.nodeId||u?.targetNodeId||"");return f&&f!==n?f:""}function cC(u,l){let f=new Set(l.map((i)=>[String(i.sourceNodeId||""),String(i.targetNodeId||""),String(i.targetMarkerId||""),String(i.action||"")].join(":"))),n=[...l];for(let i of u){let y=BC(i),_=String(i?.nodeId||""),$=String(i?.id||"");if(!y||!_||!$)continue;let r=[y,_,$,"observe"].join(":");if(f.has(r))continue;f.add(r),n.push({id:`observation-arrow:${$}:${y}:${_}`,commandId:String(i?.commandId||i?.eventId||$),sourceNodeId:y,targetNodeId:_,sourceMarkerId:"",targetMarkerId:$,sourceKind:"monitor",action:"observe",status:"observation"})}return{markers:u,arrows:n}}function XC(u){let l=Un(u),f=String(u?.promptEvent||"");if(l==="initial-prompt-delivered")return"initial";if(f==="node-finished"||f==="node-long-running-observation"||f.startsWith("monitor-"))return"monitor";if(l==="monitor-prompt-delivered"||String(u?.sourceKind||"").toLowerCase()==="monitor")return"monitor";return"append"}function YC(u){return Mu(u?.tags||u?.raw?.tags).map((l)=>String(l||"")).filter(Boolean)}function tC(u){let l=Un(u),f=String(u?.promptEvent||"");if(l==="initial-prompt-delivered")return"初始 prompt";if(f==="node-long-running-observation")return"长任务观察";if(f==="node-finished")return YC(u).includes("monitor.audit")?"节点完成 / OA 审核":"节点完成";if(f==="monitor-interval")return"Monitor observation";if(f==="monitor-start")return"Monitor start";if(f==="monitor-stop")return"Monitor stop";if(l==="monitor-prompt-delivered")return"Monitor prompt";if(l==="append-prompt-queued")return"追加 prompt 已排队";return"追加 prompt"}function Hw(u){let l=Un(u);if(l==="control-command-applied")return 3;if(l==="control-command-ignored")return 2;if(l==="control-command-queued")return 1;return 0}function DC(u,l){let f=String(u?.commandId||"");if(f)return`command:${f}`;return["control-event",d_(u)||tr(u?.createdAt,u?.timestamp)||`index-${l}`,String(u?.sourceKind||""),String(u?.sourceNodeId||""),String(u?.targetNodeId||""),Gy(u)].join(":")}function SC(u){return QQ([u?.targetNodeId,...Mu(u?.resetNodeIds)])}function PC(u,l){let f=Vr(u),n=Un(u),i=String(u?.targetNodeId||""),y=Boolean(i)&&l!==i;if(n==="control-command-applied")return y?`${f} 波及`:`${f} 生效`;if(n==="control-command-ignored")return`${f} 忽略`;if(n==="control-command-queued")return`${f} 已发起`;return y?`${f} 波及`:f}function MC(u){if(Un(u)==="control-command-ignored")return"ignored";let f=Gy(u);if(f==="restart"||f==="redo")return"restart";if(f==="modify")return"modify";if(f==="approve")return"approve";if(f==="guide")return"guide";return"pending"}function CC(u){let l=String(u?.sourceKind||"").toLowerCase();if(l==="monitor")return"monitor";if(l==="webui")return"webui";if(l==="cli")return"cli";return"system"}function pC(u,l,f,n){let i=u.filter((j)=>String(j.nodeId||"")===l).sort((j,J)=>Number(j.startMs)-Number(J.startMs)),y=i.find((j)=>f>=Number(j.startMs)-1000&&f<=Number(j.endMs)+1000);if(y)return{ms:f,onInterval:!0,snapReason:"inside-interval",procedureRunId:String(y.procedureRunId||"")};let _=Gy(n),$=i.slice().reverse().find((j)=>Number(j.endMs)<=f+1000);if($&&_==="approve")return{ms:Number($.endMs),onInterval:!0,snapReason:"previous-interval-end",procedureRunId:String($.procedureRunId||"")};let r=i.find((j)=>Number(j.startMs)>=f-1000);if(r&&["guide","modify","restart","redo"].includes(_))return{ms:Number(r.startMs),onInterval:!0,snapReason:"next-interval-start",procedureRunId:String(r.procedureRunId||"")};return{ms:f,onInterval:!1,snapReason:"event-time",procedureRunId:String(n?.procedureRunId||"")}}function vw(u,l,f,n){let i=Math.hypot(f-u,n-l),y=i>$w?$w:0,_=y>0?f-(f-u)/i*y:f,$=y>0?n-(n-l)/i*y:n,r=_-u,j=Math.max(16,Math.min(42,Math.abs(r)*0.45+12)),J=r===0?1:Math.sign(r);return`M ${u},${l} C ${u+J*j},${l} ${_-J*j},${$} ${_},${$}`}function mC(u,l){let f=String(u?.runId||l?.runId||""),n=mw({...pu(l)?l:{},...pu(u)?u:{},runId:f,procedureRuns:Mu(u?.procedureRuns).length>0?u.procedureRuns:l?.procedureRuns},[]),i=[],y=[],_=[],$=new Set,r=new Map,j=(U,F)=>{if(!U.nodeId||!Number.isFinite(Number(U.ms)))return;if($.has(U.id))return;$.add(U.id),F.push(U)};for(let U of Mu(u?.procedureRuns)){let F=PA(U,f),N=h0(U);if(!F)continue;for(let L of Mu(U?.attempts)){let w=SA(L);for(let W of JQ(L?.controlEventRecords)){let K=Un(W);if(!["initial-prompt-delivered","append-prompt-delivered","monitor-prompt-delivered"].includes(K))continue;let q=d_(W),z=fl(q);if(z===null)continue;let Z=String(W?.eventId||"");j({id:`prompt:${Z||`${N}:${w}:${K}:${z}`}`,runId:f,nodeId:F,procedureRunId:N,attempt:w,kind:"prompt",tone:XC(W),status:"delivered",label:tC(W),ms:z,timestampIso:q,sourceKind:String(W?.sourceKind||""),sourceNodeId:String(W?.sourceNodeId||""),targetNodeId:F,action:"",eventId:Z,commandId:String(W?.commandId||""),raw:W},i)}}}let J=new Map;JQ(u?.controlEvents).forEach((U,F)=>{let N=DC(U,F),L=J.get(N)||{key:N,events:[]};L.events.push(U),J.set(N,L)});for(let U of J.values()){let F=Mu(U.events).slice().sort((Y,t)=>Hw(t)-Hw(Y)),N=Mu(U.events).find((Y)=>Un(Y)==="control-command-queued")||null,L=F[0]||N;if(!N&&!L)continue;let w=String(N?.sourceNodeId||L?.sourceNodeId||""),W=String(N?.sourceKind||L?.sourceKind||""),K=d_(N)||d_(L)||tr(N?.createdAt,L?.createdAt),q=fl(K),z=String(L?.commandId||N?.commandId||U.key),Z=(Un(L)||"control-command-queued").replace(/^control-command-/u,""),T="";if(w&&q!==null)T=`control-source:${z}:${w}`,r.set(z,T),j({id:T,runId:f,nodeId:w,procedureRunId:String(N?.procedureRunId||L?.procedureRunId||""),attempt:"",kind:"control-source",tone:CC(N||L),status:Z,label:`${Vr(N||L)} 发起`,ms:q,timestampIso:K,action:Gy(N||L),sourceKind:W,sourceNodeId:w,targetNodeId:String(L?.targetNodeId||N?.targetNodeId||""),commandId:z,raw:N||L},y);let c=L||N,X=d_(c)||K,S=fl(X);if(S===null)continue;let p=SC(c);for(let Y of p){let t=pC(n,Y,S,c),m=`control-target:${z}:${Y}`;if(j({id:m,runId:f,nodeId:Y,procedureRunId:t.procedureRunId,attempt:"",kind:"control-target",tone:MC(c),status:Z,label:PC(c,Y),ms:t.ms,eventMs:S,onInterval:t.onInterval,snapReason:t.snapReason,snapped:Number(t.ms)!==S,timestampIso:X,renderedTimestampIso:cr(Number(t.ms)),action:Gy(c),sourceKind:W,sourceNodeId:w,targetNodeId:Y,commandId:z,raw:c},y),T&&w&&w!==Y)_.push({id:`control-arrow:${z}:${w}:${Y}`,commandId:z,sourceNodeId:w,targetNodeId:Y,sourceMarkerId:T,targetMarkerId:m,sourceKind:W,action:Gy(c),status:Z})}}let Q=[...i,...y].sort((U,F)=>Number(U.ms)-Number(F.ms)||String(U.nodeId).localeCompare(String(F.nodeId))||String(U.id).localeCompare(String(F.id)));return{...cC(Q,_),sourceMarkerByCommand:r}}function xC({details:u,selectedNodeId:l,selectedNodeRuntime:f,control:n,onRaw:i}){if(!u)return H("span",{className:"muted"},"点击“抓取过程”读取 node 运行材料;主界面只显示结构化摘要,完整内容需点开原始 JSON。");let y=Mu(u.procedureRuns),_=y.at(-1)||{},$=Mu(_.attempts),r=$.at(-1)||{},j=Mu(_.workerLogTail),J=Mu(r.controlEventsTail),Q=Mu(r.controlPromptsTail),U=Mu(r.monitorPromptsTail),F=nQ(J),N=nQ(Q),L=nQ(U),w=r.opencodeMessages||{};return H("div",{className:"pipeline-evidence-list compact"},H(b0,{title:"Node runtime",subtitle:l||"--",facts:[`status ${f?.status||"pending"}`,`attempts ${f?.attempts??$.length}`,`procedure ${f?.currentProcedureRunId||h0(_)||"--"}`,n.fetchedAt?`fetched ${Al(n.fetchedAt)}`:"not fetched"],data:u.node||u,onRaw:i,testId:"raw-pipeline-node-runtime"}),H(b0,{title:"Procedure runs",subtitle:`${y.length} groups`,facts:[`latest ${_.status?.status||_.status||"--"}`,`steps ${Mu(_.recentSteps).length}`,`duration ${k0(fl(_.finishedAt)&&fl(_.startedAt)?Number(fl(_.finishedAt))-Number(fl(_.startedAt)):_.durationMs)}`],data:y,onRaw:i,testId:"raw-pipeline-node-procedures"}),H(b0,{title:"OpenCode messages",subtitle:String(w.exists?"available":"not indexed"),facts:[`messages ${TA(w.messageCount)}`,`size ${TA(w.size)}`,`updated ${Hu(w.updatedAt)}`],data:w,onRaw:i,testId:"raw-pipeline-node-messages"}),H(b0,{title:"Control prompts",subtitle:"manual / monitor append queues",facts:[`manual tail ${N.total}`,`monitor tail ${L.total}`,`last ${Hu(qQ(N.lastAt,L.lastAt))}`],data:{controlPromptsTail:Q,monitorPromptsTail:U},onRaw:i,testId:"raw-pipeline-node-prompts"}),H(b0,{title:"Control events",subtitle:F.eventKinds.length>0?F.eventKinds.join(", "):"event tail",facts:[`tail ${F.total}`,`parsed ${F.parsed}`,`last ${Hu(F.lastAt)}`],data:J,onRaw:i,testId:"raw-pipeline-node-events"}),H(b0,{title:"Worker log",subtitle:"tail is hidden on main canvas",facts:[`tail ${j.length} lines`,"raw only via button",`procedure ${h0(_)||"--"}`],data:j,onRaw:i,testId:"raw-pipeline-node-worker-log"}))}function RC({activeRun:u,onRaw:l}){if(!u)return H(H0,{title:"暂无运行材料",text:"没有 Pipeline epoch 时不会展示运行材料索引。"});let f=Mu(u.nodes),n=Mu(u.procedureRuns),i=Mu(u.submissions),y=Mu(u.workerLogTail),_=jw(f),$=jw(n),r=n.filter((J)=>String(J?.status||"").toLowerCase()==="failed"),j=qQ(...n.flatMap((J)=>[J.updatedAt,J.finishedAt,J.startedAt]));return H("div",{className:"pipeline-evidence-list"},H(b0,{title:"Epoch overview",subtitle:u.runId||"--",facts:[`pipeline ${u.pipelineId||"--"}`,`status ${u.status||"--"}`,`started ${Hu(u.startedAt)}`,`updated ${Hu(u.updatedAt)}`],data:u,onRaw:l,testId:"raw-pipeline-run"}),H(b0,{title:"Node states",subtitle:`${f.length} nodes`,facts:[`running ${_.running||0}`,`succeeded ${_.succeeded||0}`,`failed ${_.failed||0}`,`pending ${_.pending||0}`],data:f,onRaw:l,testId:"raw-pipeline-run-nodes"}),H(b0,{title:"Procedure run index",subtitle:`${n.length} procedure records`,facts:[`succeeded ${$.succeeded||0}`,`failed ${$.failed||0}`,`latest ${Hu(j)}`,`errors ${r.length}`],data:n,onRaw:l,testId:"raw-pipeline-run-procedures"}),H(b0,{title:"OA submissions",subtitle:`${i.length} submission files`,facts:[`records ${i.length}`,`task ${TA(u.task)}`,"raw grouped by run"],data:i,onRaw:l,testId:"raw-pipeline-run-submissions"}),H(b0,{title:"Worker log tail",subtitle:"hidden from main interface",facts:[`tail ${y.length} lines`,"display raw only after click",`updated ${Hu(u.updatedAt)}`],data:y,onRaw:l,testId:"raw-pipeline-run-worker-log"}))}function bC({diagnostics:u,onRaw:l}){let f=Mu(u?.runs).filter(pu),n=Mu(u?.forbiddenResiduals),i=pu(u?.guarantees)?u.guarantees:{},y=u?.hasNeutralNodeFinishedEvidence===!0&&u?.hasNoAuditPolicyEvidence===!0&&u?.hasAuditPolicyEvidence===!0,_=u?.ok===!0&&y&&n.length===0,$=f[0]||null,r=[{label:"中性完成事实",ok:i.neutralNodeFinished===!0,hint:"node-finished 不携带流程策略"},{label:"Config 策略判定",ok:i.auditPolicyFromConfig===!0,hint:"OA backend 读取当前 epoch 配置"},{label:"控制命令来自 OA",ok:i.runnerConsumesControlCommandsFromOaEvents===!0,hint:"runner 只消费 OA control.command"},{label:"无独立审核事件",ok:i.noIndependentAuditRequestEvent===!0,hint:"审核由 node-finished + policy 派生"},{label:"无批次门禁",ok:i.noBatchFinishedControlGate===!0,hint:"下游启动由每个 node 完成驱动"}];return H("div",{className:"pipeline-oa-panel","data-testid":"pipeline-oa-event-flow-panel"},H("div",{className:"metric-grid compact"},H(gf,{label:"OA Flow",value:_?"100%":"--",hint:String(u?.mode||"waiting diagnostics"),tone:_?"ok":"warn"}),H(gf,{label:"禁止残留",value:n.length,hint:n.length===0?"source scan clean":"needs cleanup",tone:n.length===0?"ok":"warn"}),H(gf,{label:"No-audit",value:u?.hasNoAuditPolicyEvidence?"OK":"--",hint:"OA 下游策略证据",tone:u?.hasNoAuditPolicyEvidence?"ok":"warn"}),H(gf,{label:"Monitor 审核",value:u?.hasAuditPolicyEvidence?"OK":"--",hint:"OA 控制事件闭环",tone:u?.hasAuditPolicyEvidence?"ok":"warn"})),H("div",{className:"pipeline-oa-guarantees"},r.map((j)=>H("article",{key:j.label,className:`pipeline-oa-guarantee ${j.ok?"ok":"warn"}`},H(Gi,{status:j.ok?"online":"warn"},j.ok?"OK":"MISS"),H("div",null,H("strong",null,j.label),H("span",null,j.hint))))),H("div",{className:"pipeline-evidence-list compact"},f.slice(0,6).map((j)=>H(b0,{key:j.runId,title:String(j.runId||"--"),subtitle:[Number(j.monitorAuditNodeFinishedCount||0)>0?"monitor audit":"",Number(j.noAuditPolicyCount||0)>0?"no-audit policy":""].filter(Boolean).join(" / ")||"event evidence",facts:[`events ${j.eventCount||0}`,`node-finished ${j.nodeFinishedCount||0}`,`policy-in-detail ${j.nodeFinishedWithPolicyCount||0}`,`queued ${j.controlQueuedCount||0}`,`applied ${j.controlAppliedCount||0}`],data:j,onRaw:l,testId:`raw-pipeline-oa-run-${String(j.runId||"run").replace(/[^a-zA-Z0-9_.-]+/g,"-")}`}))),$?H("p",{className:"muted paragraph"},`最新证据 ${$.runId}: ${$.nodeFinishedCount||0} 个 node-finished,${$.controlAppliedCount||0} 个控制结果。`):H(H0,{title:"暂无 OA 事件流证据",text:"等待 Pipeline backend 暴露 diagnostics。"}),u?H("div",{className:"panel-actions inline-actions"},H(Nn,{title:"Pipeline OA Event Flow Diagnostics",data:u,onOpen:l,testId:"raw-pipeline-oa-event-flow"})):null)}function kC({quota:u,onRaw:l}){let f=pu(u?.summary)?u.summary:{},n=pu(u?.target)?u.target:{},i=pu(u?.cache)?u.cache:{},y=u?.ok===!0,_=String(u?.modelId||f.modelName||n.modelName||"MiniMax-M2.7"),$=f.totalCount??n.currentIntervalTotalCount,r=f.usageCount??n.currentIntervalUsageCount,j=f.remainingCount??n.currentIntervalRemainingCount,J=f.remainingRatio??(Number.isFinite(Number($))&&Number($)>0&&Number.isFinite(Number(j))?Number(j)/Number($):void 0),Q=f.usageRatio??(Number.isFinite(Number($))&&Number($)>0&&Number.isFinite(Number(r))?Number(r)/Number($):void 0),U=f.resetAt||n.endAt,F=f.remainsMs??n.remainsMs,N=Number(j),L=!y||Number.isFinite(N)&&N<=0?"warn":"ok",w=[y?`endpoint ${u?.endpoint||"--"}`:"quota unavailable",`fetched ${OA(u?.fetchedAt)}`,i.hit?`cache ${k0(i.ageMs)}`:"live quota"];return H("div",{className:"pipeline-minimax-quota-panel","data-testid":"pipeline-minimax-quota-panel"},H("div",{className:"metric-grid compact"},H(gf,{label:"MiniMax",value:y?_:"--",hint:u?.modelComponent||u?.error||"model/minimax-m27",tone:L}),H(gf,{label:"当前窗口",value:`${fQ(r)}/${fQ($)}`,hint:`已用 ${Aw(Q)}`,tone:L}),H(gf,{label:"剩余额度",value:fQ(j),hint:`剩余 ${Aw(J)}`,tone:L}),H(gf,{label:"重置时间",value:OA(U),hint:F!==void 0?`约 ${k0(F)}`:Hu(U),tone:L})),H(KQ,{items:w}),y?H("p",{className:"muted paragraph"},`MiniMax 限额来自 D601 Pipeline 后端实时查询;当前模型匹配 ${f.modelName||n.modelName||_}。`):H(ul,{error:u?.error||"MiniMax 限额查询失败"}),u?H("div",{className:"panel-actions inline-actions"},H(Nn,{title:"Pipeline MiniMax Quota",data:u,onOpen:l,testId:"raw-pipeline-minimax-quota"})):null)}function hC({epochs:u,activeRun:l,activePipeline:f,pipelineNodes:n,pipelineEdges:i,runDetails:y,nodeDetails:_,nodeDetailsState:$,ganttScale:r=Yr,onGanttScaleChange:j,onRunChange:J,onIntervalSelect:Q,onMarkerSelect:U,selection:F,detailOpen:N,onDetailOpenChange:L,onRaw:w}){let[W,K]=_0(wC),[q,z]=_0({startY:0,endY:0,startMs:0,endMs:0}),[Z,T]=_0(Date.now()),c=Ki(null),X=String(l?.runId||""),S=Boolean(N),p=(Nu)=>{if(typeof L==="function")L(Nu)},Y=wi(r??Yr),t=String(y?.runId||"")===X?y?.details:null,m=t?{...pu(l)?l:{},...pu(t)?t:{},runId:X,procedureRuns:Mu(t?.procedureRuns).length>0?t.procedureRuns:l?.procedureRuns}:l,V=mw(m,n,Z),D=t?mC(t,m):{markers:[],arrows:[]},M=Mu(D.markers),I=GC(m,V,M),O=TC(I,Y,V,Z),C=String(O.source||"frontend-y"),g=V.map((Nu)=>VC(Nu,O,Z)),a={startMs:Number(O.startMs),endMs:Number(O.endMs),durationMs:Math.max(1,Number(O.durationMs??Number(O.endMs)-Number(O.startMs)))},iu=EQ(Y),Au={...iu,pxPerMinute:Number(O.pxPerMinute??iu.pxPerMinute)},R=Math.round(Number(O.chartHeight||360)),x=V.some(HQ);Cn(()=>{if(!X||!x)return;let Nu=window.setInterval(()=>T(Date.now()),1000);return()=>window.clearInterval(Nu)},[X,x]);let fu=JC(f,n,Array.isArray(i)?i:[]),yu=n.map((Nu)=>String(Nu?.id||"")).filter(Boolean),Ju=g.map((Nu)=>String(Nu.nodeId||"")).filter(Boolean),Vu=M.map((Nu)=>String(Nu.nodeId||"")).filter(Boolean),Lu=Array.from(new Set([...fu,...yu,...Ju,...Vu])),Bu={startY:0,endY:R,startMs:Number(a.startMs),endMs:Number(a.endMs)},b=Number(q?.endY||0)>0?q:Bu,o=(Nu)=>{return tA(Nu,a,R,O)<=Number(b.endY)&&WQ(Nu,a,R,O)>=Number(b.startY)},nu=(Nu)=>{let eu=E0(Nu,a,R,O);return eu>=Number(b.startY)&&eu<=Number(b.endY)},wu=new Set(Lu.filter((Nu)=>g.some((eu)=>eu.nodeId===Nu&&o(eu))||M.some((eu)=>eu.nodeId===Nu&&nu(eu)))),e=W?Lu.filter((Nu)=>wu.has(Nu)):Lu,zu=`${uQ}px ${e.length>0?e.map(()=>`${Pn}px`).join(" "):"minmax(160px, 1fr)"}`,v=Mu(O.ticks).filter(pu),$u=String(F?.mode==="interval"?F?.interval?.procedureRunId||"":""),Wu=String(F?.mode==="event"?F?.marker?.id||"":""),Du=()=>{let Nu=c.current;if(!Nu){z(Bu);return}let eu=Math.max(0,Nu.scrollTop-lQ),gl=Math.max(120,Nu.clientHeight-lQ),Ru=Math.min(R,eu+gl),Af={startY:eu,endY:Ru,startMs:Number(a.startMs),endMs:Number(a.endMs)},Pf=Math.max(0,Math.min(1,eu/R)),jf=Math.max(Pf,Math.min(1,Ru/R)),sl=Math.max(1,Number(a.endMs)-Number(a.startMs));Af.startMs=Number(a.startMs)+sl*Pf,Af.endMs=Number(a.startMs)+sl*jf,z(Af)};Cn(()=>{let Nu=c.current,eu=window.setTimeout(Du,0);return Nu?.addEventListener("scroll",Du),window.addEventListener("resize",Du),()=>{window.clearTimeout(eu),Nu?.removeEventListener("scroll",Du),window.removeEventListener("resize",Du)}},[X,a.startMs,a.endMs,R]);let ku=Math.max(0,Lu.length-e.length),$l=new Set(M.filter((Nu)=>e.includes(String(Nu.nodeId||""))&&nu(Nu)).map((Nu)=>String(Nu.id))),gu=new Map(M.map((Nu)=>[String(Nu.id),Nu])),Df=Mu(D.arrows).filter((Nu)=>{if(!$l.has(String(Nu.targetMarkerId||"")))return!1;if(String(Nu.action||"")==="observe")return e.includes(String(Nu.sourceNodeId||""));return $l.has(String(Nu.sourceMarkerId||""))}),j0=uQ+Math.max(1,e.length)*Pn,lf=(Nu)=>{let eu=wi(Nu.target.value);if(typeof j==="function")j(eu);window.setTimeout(Du,0)},J0=()=>LC({title:`${f?.id||"pipeline"}-${X||"epoch"}-gantt`,meta:[`run ${X||"--"}`,`${Hu(a.startMs)} -> ${Hu(a.endMs)}`,`duration ${k0(a.durationMs)}`,`${Au.label} / ${$Q(Au.pxPerMinute)} px/min`,`${e.length}/${Lu.length} nodes`,`${M.length} markers`],visibleNodeIds:e,intervals:g,markers:M.filter((Nu)=>e.includes(String(Nu.nodeId||""))),arrows:Df,ticks:v,bounds:a,chartHeight:R,backendLayout:O}),Sf=pu(t?.gantt?.diagnostics)?t.gantt.diagnostics:null;return H(Mn,{title:"Epoch 甘特图",eyebrow:`${f?.id||"pipeline"} / ${u.length} epochs`,className:"pipeline-wide-panel",loading:y?.loading,actions:H("div",{className:"pipeline-gantt-actions"},H("select",{value:X,disabled:u.length===0,onChange:(Nu)=>J(Nu.target.value),"data-testid":"pipeline-epoch-select"},u.map((Nu)=>H("option",{key:Nu.runId,value:Nu.runId},NQ(u,Nu)))),H("label",{className:"pipeline-gantt-toggle"},H("input",{type:"checkbox","data-testid":"pipeline-gantt-auto-hide-idle",checked:W,onChange:(Nu)=>{K(Boolean(Nu.target.checked)),window.setTimeout(Du,0)}}),H("span",null,"自动隐藏空闲列")),H("label",{className:"pipeline-gantt-scale"},H("span",null,H("b",null,"时间尺度"),H("em",{"data-testid":"pipeline-gantt-scale-label"},`${Au.label} · ${$Q(Au.pxPerMinute)} px/min`)),H("input",{type:"range",min:0,max:100,step:0.01,value:Y,onChange:lf,"aria-label":"调整甘特图时间尺度","data-testid":"pipeline-gantt-time-scale"}),H("small",null,H("span",null,"全局"),H("span",null,"细节"))),l?H("button",{type:"button",className:"ghost-btn",onClick:J0,disabled:e.length===0,"data-testid":"pipeline-export-gantt"},"导出甘特图"):null,l?H(Nn,{title:`Pipeline Epoch ${l.runId}`,data:l,onOpen:w,testId:"raw-pipeline-epoch-gantt"}):null)},!l?H(H0,{title:"暂无 Epoch",text:"当前 pipeline 还没有完整运行记录。"}):g.length===0?H(H0,{title:"暂无时间区间",text:"等待 D601 Pipeline backend 在 procedure summary 中返回 startedAt / finishedAt。"}):H("div",{className:"pipeline-gantt-wrap"},H("div",{className:`pipeline-gantt-detail-layout ${S?"detail-open":"detail-collapsed"}`,"data-testid":"pipeline-gantt-detail-layout","data-sidebar-open":S?"true":"false"},H("div",{className:"pipeline-gantt-main"},H("div",{className:"pipeline-gantt-main-head"},H("div",{className:"pipeline-gantt-meta"},H("span",null,`time ${Hu(a.startMs)} -> ${Hu(a.endMs)}`),H("span",null,`duration ${k0(a.durationMs)}`),H("span",null,`scale ${Au.label} / ${$Q(Au.pxPerMinute)} px/min`),H("span",null,`layout ${C}`),Sf?H("span",null,`align ${Sf.timeAxisAlignmentOk===!1?"check":"ok"}`):null,H("span",null,`visible ${e.length}/${Lu.length} nodes`),t?H("span",null,`markers ${M.length}`):null,W&&ku>0?H("span",null,`hidden idle ${ku}`):null),!S?H("button",{type:"button",className:"pipeline-sidecar-tab right",disabled:!F?.mode,onClick:()=>p(!0),"data-testid":"pipeline-gantt-sidebar-toggle"},F?.mode?"展开详情":"点击甘特图元素展开详情"):null),H("div",{className:"pipeline-gantt-viewport",ref:c,"data-testid":"pipeline-epoch-gantt","data-pipeline-id":f?.id||"","data-run-id":X,"data-layout-source":C,"data-start-ms":String(a.startMs),"data-end-ms":String(a.endMs),"data-chart-height":String(R)},H("div",{className:"pipeline-gantt-board",style:{gridTemplateColumns:zu,minWidth:`${j0}px`}},H("div",{className:"pipeline-gantt-head time"},"Time"),e.length===0?H("div",{className:"pipeline-gantt-head empty"},"当前时间窗无工作节点"):e.map((Nu)=>H("div",{key:`head-${Nu}`,className:"pipeline-gantt-head node",title:Nu,"data-testid":"pipeline-gantt-head-node","data-node-id":Nu},H(IM,{value:Nu}))),H("div",{className:"pipeline-gantt-time-axis",style:{height:`${R}px`}},v.map((Nu)=>{let eu=Iw(Nu,a,R,O);return H("div",{key:`tick-${Nu.ms}-${eu}`,className:"pipeline-gantt-tick",style:{top:`${eu}px`},"data-testid":"pipeline-gantt-tick","data-ms":String(Nu.ms),"data-y":String(eu)},H("b",null,Hu(Nu.ms)),H("span",null,`+${k0(Number(Nu.offsetMs??Number(Nu.ms)-Number(a.startMs)))}`))})),e.length>0?H("svg",{className:"pipeline-gantt-arrow-layer",width:e.length*Pn,height:R,viewBox:`0 0 ${e.length*Pn} ${R}`,style:{left:`${uQ}px`,top:`${lQ}px`,width:`${e.length*Pn}px`,height:`${R}px`},"aria-hidden":"true"},H("defs",null,H("marker",{id:"pipeline-gantt-arrowhead",viewBox:"0 0 10 10",refX:9,refY:5,markerWidth:6,markerHeight:6,orient:"auto-start-reverse"},H("path",{d:"M 0 0 L 10 5 L 0 10 z",fill:"context-stroke"}))),Df.map((Nu)=>{let eu=gu.get(String(Nu.targetMarkerId||""));if(!eu)return null;let gl=gu.get(String(Nu.sourceMarkerId||"")),Ru=String(gl?.nodeId||Nu.sourceNodeId||""),Af=e.indexOf(Ru),Pf=e.indexOf(String(eu.nodeId||""));if(Af<0||Pf<0)return null;let jf=Af*Pn+Pn/2,sl=Pf*Pn+Pn/2,T0=gl?E0(gl,a,R,O):E0(eu,a,R,O),xn=E0(eu,a,R,O);return H("path",{key:Nu.id,className:`pipeline-gantt-arrow ${String(Nu.sourceKind||"").toLowerCase()} ${String(Nu.status||"").toLowerCase()} ${String(Nu.action||"").toLowerCase()}`,d:vw(jf,T0,sl,xn),markerEnd:"url(#pipeline-gantt-arrowhead)","data-testid":String(Nu.action||"")==="observe"?"pipeline-gantt-observation-arrow":"pipeline-gantt-arrow","data-source-node-id":String(Nu.sourceNodeId||""),"data-target-node-id":String(Nu.targetNodeId||""),"data-target-marker-id":String(Nu.targetMarkerId||""),"data-action":String(Nu.action||""),"data-source-y":String(T0),"data-target-y":String(xn)})})):null,e.length===0?H("div",{className:"pipeline-gantt-empty-col",style:{height:`${R}px`}},"滚动到有活动的时间段后,相关 node 列会自动出现。"):e.map((Nu)=>{let eu=g.filter((Ru)=>Ru.nodeId===Nu),gl=M.filter((Ru)=>String(Ru.nodeId||"")===Nu);return H("div",{key:`col-${Nu}`,className:"pipeline-gantt-node-col",style:{height:`${R}px`}},eu.map((Ru)=>{let Af=tA(Ru,a,R,O),Pf=WQ(Ru,a,R,O),jf=hw(Ru,a,R,O),sl=String(Ru.procedureRunId||`${Nu}-${Ru.startMs}`);return H("button",{key:sl,type:"button",className:`pipeline-gantt-bar ${Ru.status} ${Ru.live?"live":""} ${$u===sl?"selected":""}`,style:{top:`${Af}px`,height:`${jf}px`},title:`${Nu} ${Ru.status} ${Hu(Ru.startedAt||Ru.startMs)} -> ${Hu(Ru.finishedAt||Ru.endMs)}`,onClick:()=>Q(Ru),"data-testid":"pipeline-gantt-line","data-node-id":Nu,"data-procedure-run-id":String(Ru.procedureRunId||""),"data-status":String(Ru.status||""),"data-live":Ru.live?"true":"false","data-start-ms":String(Ru.startMs||""),"data-end-ms":String(Ru.endMs||""),"data-y1":String(Af),"data-y2":String(Pf),"data-natural-height":String(Math.max(0,Pf-Af))},H("strong",null,Ru.status||"working"),H("span",null,k0(Ru.durationMs)))}),gl.map((Ru)=>H("button",{key:Ru.id,type:"button",className:`pipeline-gantt-marker ${Ru.kind} ${Ru.tone||""} ${Ru.status||""} ${Wu===String(Ru.id)?"selected":""}`,style:{top:`${E0(Ru,a,R,O)}px`},title:`${Ru.label||"event"} / ${Hu(Ru.timestampIso||Ru.timestamp||Ru.ms)}`,onClick:()=>U(Ru),"data-testid":Ru.kind==="prompt"?"pipeline-gantt-prompt-marker":"pipeline-gantt-control-marker","data-marker-id":String(Ru.id||""),"data-ms":String(Ru.ms??Ru.eventMs??""),"data-y":String(E0(Ru,a,R,O))})))})))),S?H(hM,{selection:F,runDetails:y,nodeDetails:_,nodeDetailsState:$,onRaw:w,onCollapse:()=>p(!1)}):null)))}function q1(){return{loading:!1,actionLoading:"",error:"",message:"",details:null,fetchedAt:null,appendPrompt:"",guidePrompt:"",modifyPrompt:"",approveReason:"",redoReason:""}}function Li(){return{mode:"",runId:"",interval:null,marker:null}}function rQ(){return{runId:"",loading:!1,error:"",details:null,fetchedAt:null}}function Hr(u,l){return`${u}/microservices/pipeline/proxy${l}`}function IC({activeRun:u,pipelineRuns:l,selectedRunId:f,onRunChange:n,selectedNodeId:i,selectedNodeConfig:y,selectedNodeRuntime:_,control:$,onControlChange:r,onFetch:j,onAction:J,onRaw:Q,onCollapse:U}){let F=String(u?.runId||""),N=String(_?.status||"pending"),L=!F||!i||$.loading||Boolean($.actionLoading),w=(K)=>(q)=>r({[K]:q.target.value,error:"",message:""}),W=l.length>0?l:u?[u]:[];return H("aside",{className:"pipeline-node-control","data-testid":"pipeline-node-control"},H("div",{className:"pipeline-node-control-head"},H("div",null,H("p",{className:"panel-eyebrow"},"Manual Node Control"),H(nl,{title:i||"点击控制图中的 node",level:3,loading:$.loading||Boolean($.actionLoading)})),H("div",{className:"pipeline-node-control-head-actions"},i?H(Gi,{status:N},N):H(Gi,{status:"pending"},"idle"),H("button",{type:"button",className:"ghost-btn mini",onClick:U,"data-testid":"pipeline-node-sidebar-collapse"},"收起"))),H("div",{className:"pipeline-control-runbar"},H("label",null,H("span",null,"目标 run"),H("select",{value:F||f,disabled:W.length===0,onChange:(K)=>n(K.target.value),"data-testid":"pipeline-node-run-select"},W.map((K)=>H("option",{key:K.runId,value:K.runId},`${K.runId||"--"} / ${K.status||"--"}`)))),H("button",{type:"button",className:"ghost-btn",disabled:L,onClick:j,"data-testid":"pipeline-node-fetch"},$.loading?"抓取中":"抓取过程"),$.details?H(Nn,{title:`Pipeline Node ${i}`,data:$.details,onOpen:Q,testId:"raw-pipeline-node-control"}):null),H("div",{className:"pipeline-control-meta"},H("span",null,H("b",null,"kind"),String(y?.kind||"--")),H("span",null,H("b",null,"procedure"),String(_?.currentProcedureRunId||"--")),H("span",null,H("b",null,"attempts"),String(_?.attempts??"--")),H("span",null,H("b",null,"updated"),Hu(u?.updatedAt))),!i?H(H0,{title:"未选择 node",text:"点击 React Flow 控制图中的任意 node 后,可抓取执行过程、追加 prompt、下发引导、增量修改、审核通过或重做。"}):null,H(ul,{error:$.error,wide:!0}),H("div",{className:"pipeline-control-actions"},H("label",null,H("span",null,"实时追加 prompt(仅 running node)"),H("textarea",{value:$.appendPrompt,onChange:w("appendPrompt"),placeholder:"让当前执行中的 agent 继续、补充检查或调整当前步骤...",rows:4,disabled:!i,"data-testid":"pipeline-node-append-input"}),H("button",{type:"button",className:"primary-btn compact",disabled:L||!String($.appendPrompt||"").trim(),onClick:()=>J("append"),"data-testid":"pipeline-node-append-button"},$.actionLoading==="append"?"追加中":"追加到运行中 node")),H("label",null,H("span",null,"下次尝试引导 prompt"),H("textarea",{value:$.guidePrompt,onChange:w("guidePrompt"),placeholder:"给该 node 下一次 attempt 的执行提示;不会立即打断当前 session。",rows:4,disabled:!i,"data-testid":"pipeline-node-guide-input"}),H("button",{type:"button",className:"ghost-btn compact",disabled:L||!String($.guidePrompt||"").trim(),onClick:()=>J("guide"),"data-testid":"pipeline-node-guide-button"},$.actionLoading==="guide"?"下发中":"下发 guide")),H("label",null,H("span",null,"完成后增量修改 prompt"),H("textarea",{value:$.modifyPrompt,onChange:w("modifyPrompt"),placeholder:"在该 node 已完成结果基础上追加修改要求;runner 会重跑目标 node,并保留同 node 既有 OA 输出作为上下文。",rows:4,disabled:!i,"data-testid":"pipeline-node-modify-input"}),H("button",{type:"button",className:"ghost-btn compact",disabled:L||!String($.modifyPrompt||"").trim(),onClick:()=>J("modify"),"data-testid":"pipeline-node-modify-button"},$.actionLoading==="modify"?"排队中":"增量修改 node")),H("label",null,H("span",null,"Monitor 审核通过原因"),H("textarea",{value:$.approveReason,onChange:w("approveReason"),placeholder:"当流程配置开启 monitor 审核时,记录审核通过原因并释放后续 node。",rows:3,disabled:!i,"data-testid":"pipeline-node-approve-input"}),H("button",{type:"button",className:"primary-btn compact",disabled:L||!String($.approveReason||"").trim(),onClick:()=>J("approve"),"data-testid":"pipeline-node-approve-button"},$.actionLoading==="approve"?"提交中":"审核通过")),H("label",null,H("span",null,"重做 / restart 原因"),H("textarea",{value:$.redoReason,onChange:w("redoReason"),placeholder:"说明为什么需要重做;runner 会重置目标 node 以及非 rework 下游 node。",rows:4,disabled:!i,"data-testid":"pipeline-node-redo-input"}),H("button",{type:"button",className:"danger-btn compact",disabled:L||!String($.redoReason||"").trim(),onClick:()=>J("redo"),"data-testid":"pipeline-node-redo-button"},$.actionLoading==="redo"?"排队中":"重做 node"))),H("div",{className:"pipeline-control-evidence"},H("strong",null,"Node 过程索引"),H(xC,{details:$.details,selectedNodeId:i,selectedNodeRuntime:_,control:$,onRaw:Q})))}function gw({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let n=u.find((d)=>d.id==="pipeline")||null,[i,y]=_0({loading:!1,error:"",health:null,snapshot:null,oaDiagnostics:null,minimaxQuota:null,refreshedAt:null}),[_,$]=_0(""),[r,j]=_0(""),[J,Q]=_0(""),[U,F]=_0(q1()),[N,L]=_0({}),[w,W]=_0(Li()),[K,q]=_0(rQ()),[z,Z]=_0(Yr),[T,c]=_0(!1),[X,S]=_0(!1),p=Ki(0),{addNotification:Y}=bf(),t=Ki(!1),m=Ki(0),V=Ki(""),D=Ki({}),M=Ki(""),I=Ki("");async function O(d={}){let Su=d.silent===!0;if(!n)return;if(t.current)return;t.current=!0;let xu=p.current+1;if(p.current=xu,!Su)y((yl)=>({...yl,loading:!0,error:""}));try{let yl=`__unideskArrayLimit=registry.components:80,runs:${VM}`,[Kl,ol,jl]=await Promise.all([qi(`${f}/microservices/pipeline/proxy/api/snapshot?${yl}`,{cache:"no-store"}),qi(`${f}/microservices/pipeline/proxy/api/oa-event-flow/diagnostics`,{cache:"no-store"}).catch((Rn)=>({ok:!1,error:cu(Rn,"OA event flow diagnostics failed")})),qi(`${f}/microservices/pipeline/proxy/api/model-quota/minimax`,{cache:"no-store"}).catch((Rn)=>({ok:!1,error:cu(Rn,"MiniMax quota failed")}))]);if(xu!==p.current)return;let ff={ok:Kl?.ok!==!1,service:"pipeline-v2-control snapshot"};y({loading:!1,error:"",health:ff,snapshot:Kl,oaDiagnostics:ol,minimaxQuota:jl,refreshedAt:new Date})}catch(yl){if(xu!==p.current)return;y((Kl)=>({...Kl,loading:!1,error:cu(yl,"Pipeline 加载失败")}))}finally{t.current=!1}}Cn(()=>{if(O(),!n)return;let d=()=>{if(GA())O({silent:!0})},Su=window.setInterval(()=>{d()},_w),xu=()=>{if(GA())d()};return document.addEventListener("visibilitychange",xu),()=>{window.clearInterval(Su),document.removeEventListener("visibilitychange",xu)}},[n?.id,n?.runtime?.providerStatus,f]);let C=vM(n),g=sM(n),a=gM(n),iu=i.snapshot||{},Au=i.oaDiagnostics||null,R=i.minimaxQuota||null,{components:x,pipelines:fu,runs:yu}=aM(iu),Ju=String(yu[0]?.pipelineId||""),Vu=(Ju?fu.find((d)=>String(d.id||"")===Ju):null)||fu[0]||{},Lu=fu.find((d)=>String(d.id||"")===_)||Vu,Bu=String(Lu.id||""),b=Sw(Lu),o=GQ(Lu),nu=ww(yu,Bu),wu=zC(yu,Bu),e=wu.find((d)=>String(d?.runId||"")===r)||nu,zu=String(K.runId||"")===String(e?.runId||"")?uC(K.details):null,v=lC(e,zu),$u=String(v?.runId||""),Wu=b.find((d)=>String(d?.id||"")===J)||null,Du=J?Pw(v,J):null,ku=dM(yu),$l=yC(x),gu=Number(i.health?.components)||Fw(iu,"registry.components",x.length),Df=Fw(iu,"runs",yu.length),j0=Lw(Lu,v,x),lf={nodes:j0.nodes.map((d)=>d.id===J?{...d,selected:!0,className:`${d.className||""} selected-control-node`}:d),edges:j0.edges},J0=fu.map((d)=>{let Su=String(d.id||"pipeline"),xu=ww(yu,Su);return{title:`${Su}-${xu?.runId||"snapshot"}`,flow:Lw(d,xu,x)}}),Sf=String(w?.runId||$u||""),Nu=String(w?.interval?.nodeId||w?.marker?.nodeId||""),eu=Sf&&Nu?N[_Q(Sf,Nu)]||null:null,gl=VA(U.details,Sf,Nu),Ru=VA(eu?.details,Sf,Nu)||gl,Af=Sf&&Nu?{...pu(eu)?eu:{},runId:Sf,nodeId:Nu,details:Ru,loading:Boolean(eu?.loading)||!Ru&&Boolean(U.loading)&&J===Nu,error:String(eu?.error||""),fetchedAt:eu?.fetchedAt||(gl?U.fetchedAt:null)}:null,Pf=wu.map((d)=>String(d?.runId||"")).filter(Boolean).join("|"),jf=b.map((d)=>String(d?.id||"")).filter(Boolean).join("|");Cn(()=>{M.current=J},[J]),Cn(()=>{I.current=$u},[$u]),Cn(()=>{if(!r||Pf.split("|").includes(r))return;j("")},[r,Pf]),Cn(()=>{if(!J||jf.split("|").includes(J))return;Q(""),F(q1()),W(Li()),c(!1),S(!1)},[J,jf]),Cn(()=>{if(!J)c(!1)},[J]),Cn(()=>{if(!w.mode)S(!1)},[w.mode]);async function sl(d=$u,Su={}){if(!d){q(rQ());return}let xu=wi(Su.scale??z??Yr),yl=`${d}:timeline`;if(V.current===yl)return;V.current=yl;let Kl=Su.silent===!0,ol=m.current+1;m.current=ol,q((jl)=>({runId:d,scale:xu,loading:!Kl||String(jl.runId||"")!==d||!jl.details,error:"",details:Kl&&jl.runId===d?jl.details:jl.runId===d?jl.details:null,fetchedAt:jl.runId===d?jl.fetchedAt:null}));try{let[jl,ff]=await Promise.all([qi(Hr(f,`/api/node-control/runs/${encodeURIComponent(d)}?tail=160&view=timeline`),{cache:"no-store",strictJson:!0}),qi(Hr(f,`/api/runs/${encodeURIComponent(d)}`),{cache:"no-store"}).catch((Rn)=>({ok:!1,runSummaryError:cu(Rn,"抓取评分失败")}))]);if(ol!==m.current)return;q({runId:d,scale:xu,loading:!1,error:"",details:{...jl,run:pu(ff?.run)?ff.run:void 0,runSummaryError:ff?.runSummaryError},fetchedAt:new Date})}catch(jl){if(ol!==m.current)return;q((ff)=>({runId:d,scale:xu,loading:!1,error:cu(jl,"抓取 epoch 执行过程失败"),details:ff.runId===d?ff.details:null,fetchedAt:ff.runId===d?ff.fetchedAt:null}))}finally{if(V.current===yl)V.current=""}}function T0(d,Su,xu){let yl=_Q(d,Su);L((Kl)=>{let ol={...Kl,[yl]:{...pu(Kl?.[yl])?Kl[yl]:{},runId:d,nodeId:Su,...xu}},jl=Object.keys(ol);if(jl.length>32)for(let ff of jl.slice(0,jl.length-32))delete ol[ff];return ol})}async function xn(d,Su){if(!d||!Su)return;let xu=_Q(d,Su),yl=Number(D.current?.[xu]||0)+1;D.current={...D.current,[xu]:yl},T0(d,Su,{loading:!0,error:""});try{let Kl=await qi(Hr(f,`/api/node-control/runs/${encodeURIComponent(d)}/nodes/${encodeURIComponent(Su)}?tail=160`),{cache:"no-store",strictJson:!0});if(Number(D.current?.[xu]||0)!==yl)return;let ol=new Date;if(T0(d,Su,{loading:!1,details:Kl,fetchedAt:ol,error:""}),M.current===Su&&I.current===d)F((jl)=>({...jl,loading:!1,details:Kl,fetchedAt:ol,error:""}))}catch(Kl){if(Number(D.current?.[xu]||0)!==yl)return;T0(d,Su,{loading:!1,error:cu(Kl,"抓取 Gantt node 详情失败")})}}Cn(()=>{if(!$u){q(rQ());return}sl($u);let d=()=>{if(GA())sl($u,{silent:!0})},Su=window.setInterval(()=>{d()},_w),xu=()=>{if(GA())d()};return document.addEventListener("visibilitychange",xu),()=>{window.clearInterval(Su),document.removeEventListener("visibilitychange",xu)}},[$u,f]);async function sf(d=$u,Su=J){if(!d||!Su){F((xu)=>({...xu,error:"请先选择 run 和 node",message:""}));return}F((xu)=>({...xu,loading:!0,error:"",message:""}));try{let xu=await qi(Hr(f,`/api/node-control/runs/${encodeURIComponent(d)}/nodes/${encodeURIComponent(Su)}?tail=160`),{cache:"no-store",strictJson:!0}),yl=new Date;F((Kl)=>({...Kl,loading:!1,details:xu,fetchedAt:yl,error:""})),T0(d,Su,{loading:!1,details:xu,fetchedAt:yl,error:""})}catch(xu){F((yl)=>({...yl,loading:!1,error:cu(xu,"抓取 node 执行过程失败")}))}}async function $$(d){let Su=String(d?.runId||$u||""),xu=String(d?.nodeId||"");if(W({mode:"interval",runId:Su,interval:d,marker:null}),S(!0),!Su||!xu)return;if(Su!==$u)j(Su);Q(xu),F(q1()),sl(Su,{silent:!0}),xn(Su,xu)}async function z1(d){let Su=String(d?.runId||$u||""),xu=String(d?.nodeId||"");if(W({mode:"event",runId:Su,interval:null,marker:d}),S(!0),!Su)return;if(Su!==$u)j(Su);if(sl(Su,{silent:!0}),!xu)return;Q(xu),F(q1()),xn(Su,xu)}async function G1(d){if(!$u||!J){F((yl)=>({...yl,error:"请先选择 run 和 node",message:""}));return}let Su=d==="append"?"prompts":d,xu=d==="append"?U.appendPrompt:d==="guide"?U.guidePrompt:d==="modify"?U.modifyPrompt:d==="approve"?U.approveReason:U.redoReason;if(!String(xu||"").trim()){F((yl)=>({...yl,error:"操作内容不能为空",message:""}));return}F((yl)=>({...yl,actionLoading:d,error:"",message:""}));try{let yl=d==="redo"||d==="approve"?{reason:xu,source:"unidesk-frontend",sourceKind:"webui"}:{prompt:xu,source:"unidesk-frontend",sourceKind:"webui"},Kl=await qi(Hr(f,`/api/node-control/runs/${encodeURIComponent($u)}/nodes/${encodeURIComponent(J)}/${Su}`),{method:"POST",body:JSON.stringify(yl)});if(F((jl)=>({...jl,actionLoading:"",details:Kl,fetchedAt:new Date,appendPrompt:d==="append"?"":jl.appendPrompt,guidePrompt:d==="guide"?"":jl.guidePrompt,modifyPrompt:d==="modify"?"":jl.modifyPrompt,approveReason:d==="approve"?"":jl.approveReason,redoReason:d==="redo"?"":jl.redoReason,message:d==="append"?"已追加到运行中 node":d==="guide"?"已下发 guide,等待 runner 处理":d==="modify"?"已排队增量修改命令":d==="approve"?"已提交审核通过决策":"已排队重做命令"})),Y("success",d==="append"?"已追加到运行中 node":d==="guide"?"已下发 guide,等待 runner 处理":d==="modify"?"已排队增量修改命令":d==="approve"?"已提交审核通过决策":"已排队重做命令"),await sf($u,J),await sl($u,{silent:!0}),d!=="append")await O()}catch(yl){F((Kl)=>({...Kl,actionLoading:"",error:cu(yl,"node 控制操作失败")}))}}if(!n)return H(H0,{title:"Pipeline 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=pipeline"});return H("div",{className:"pipeline-page","data-testid":"pipeline-page"},H(Mn,{title:"Pipeline v2 工作台",eyebrow:"D601 Snapshot 用户服务",loading:i.loading,actions:H("div",{className:"panel-actions"},H("button",{type:"button",className:"ghost-btn",onClick:O,disabled:i.loading,"data-testid":"pipeline-refresh-button"},i.loading?"刷新中":"刷新"),H(Nn,{title:"Pipeline 用户服务",data:n,onOpen:l,testId:"raw-pipeline-service"}))},H("div",{className:"pipeline-hero"},H("div",null,H("div",{className:"node-version-line"},H(Gi,{status:C.providerStatus==="online"?"online":"warn"},C.providerStatus||"unknown"),H("span",null,n.providerId),H("span",null,a.public?"公网暴露":"仅 UniDesk frontend 代理访问")),H("p",{className:"muted paragraph"},n.description)),H("div",{className:"microservice-ref-card"},H("span",null,"Repo"),H("strong",null,g.url||"--"),H("code",null,g.commitId||"--")),H("div",{className:"microservice-ref-card"},H("span",null,"D601 Docker"),H("strong",null,`${a.nodeBindHost||"--"}:${a.nodePort||"--"}`),H("code",null,`${g.composeFile||"--"} / ${g.composeService||"--"}`))),H(ul,{error:i.error,wide:!0})),H("div",{className:"pipeline-grid"},H(Mn,{title:"控制图",eyebrow:`${Lu.id||"pipeline"} / run ${v?.status||"--"}`,className:"pipeline-wide-panel",loading:i.loading,actions:H("div",{className:"pipeline-toolbar"},H("select",{value:Bu,disabled:fu.length===0,onChange:(d)=>{$(d.target.value),j(""),Q(""),F(q1()),W(Li()),c(!1),S(!1)},"data-testid":"pipeline-select"},fu.map((d)=>H("option",{key:d.id,value:d.id},d.id||d.key))),H("select",{value:$u,disabled:wu.length===0,onChange:(d)=>{if(j(d.target.value),F(q1()),W(Li()),c(!1),S(!1),J)sf(d.target.value,J)},"data-testid":"pipeline-run-select"},wu.map((d)=>H("option",{key:d.runId,value:d.runId},NQ(wu,d)))),H("button",{type:"button",className:"ghost-btn",disabled:lf.nodes.length===0,onClick:()=>pw(lf,`${Lu.id||"pipeline"}-${v?.runId||"snapshot"}`),"data-testid":"pipeline-export-graph"},"导出渲染图"),H("button",{type:"button",className:"ghost-btn",disabled:J0.every((d)=>d.flow.nodes.length===0),onClick:()=>KC(J0),"data-testid":"pipeline-export-all-graphs"},"批量导出"))},b.length===0?H(H0,{title:"暂无控制图",text:"等待 D601 pipeline backend 返回 config.nodes / config.edges"}):H("div",{className:`pipeline-control-shell ${T?"detail-open":"detail-collapsed"}`,"data-testid":"pipeline-control-shell","data-sidebar-open":T?"true":"false"},H("div",{className:"pipeline-flow-frame","data-testid":"pipeline-react-flow"},H(eG,{nodes:lf.nodes,edges:lf.edges,nodeTypes:tM,edgeTypes:YM,fitView:!0,fitViewOptions:{padding:0.18},nodesDraggable:!1,nodesConnectable:!1,elementsSelectable:!0,minZoom:0.25,maxZoom:1.4,proOptions:{hideAttribution:!0},onNodeClick:(d,Su)=>{let xu=String(Su.id);if(Q(xu),F(q1()),c(!0),$u)sf($u,xu)}},H(lw,{gap:22,size:1,color:"rgba(215, 161, 58, 0.24)"}),H(nw,{showInteractive:!1})),!T?H("button",{type:"button",className:"pipeline-sidecar-tab right",disabled:!J,onClick:()=>c(!0),"data-testid":"pipeline-node-sidebar-toggle"},J?"展开 node 控制":"点击 node 展开控制"):null),T?H(IC,{activeRun:v,pipelineRuns:wu,selectedRunId:r,onRunChange:(d)=>{if(j(d),F(q1()),W(Li()),J)sf(d,J)},selectedNodeId:J,selectedNodeConfig:Wu,selectedNodeRuntime:Du,control:U,onControlChange:(d)=>F((Su)=>({...Su,...d})),onFetch:()=>sf(),onAction:G1,onRaw:l,onCollapse:()=>c(!1)}):null),H("div",{className:"pipeline-flow-summary"},H("span",null,`${lf.nodes.length} nodes`),H("span",null,`${lf.edges.length} edges`),H("span",null,`${fu.length} pipelines`),H("span",null,`source config+components(${x.length})`),H("span",null,`run ${v?.runId||"--"}`),H("span",null,`score ${UQ(v)}`),H("span",null,J?`selected ${J}`:"click node to control"))),H(hC,{epochs:wu,activeRun:v,activePipeline:Lu,pipelineNodes:b,pipelineEdges:o,selection:w,detailOpen:X,onDetailOpenChange:S,runDetails:K,nodeDetails:Ru,nodeDetailsState:Af,ganttScale:z,onGanttScaleChange:Z,onIntervalSelect:$$,onMarkerSelect:z1,onRunChange:(d)=>{if(j(d),F(q1()),W(Li()),S(!1),J)sf(d,J)},onRaw:l}),H(Mn,{title:"观测指标",eyebrow:i.refreshedAt?`Updated ${Al(i.refreshedAt)}`:"Snapshot",loading:i.loading},H("div",{className:"metric-grid"},H(gf,{label:"Health",value:i.health?.ok?"OK":"--",hint:i.health?.service||"D601 /health",tone:i.health?.ok?"ok":"warn"}),H(gf,{label:"组件",value:gu,hint:"components registry",tone:iu?.registry?.ok===!1?"warn":"ok"}),H(gf,{label:"Pipeline",value:fu.length,hint:`${b.length} nodes / ${o.length} edges`}),H(gf,{label:"运行记录",value:Df,hint:`${ku.succeeded||0} succeeded / ${ku.running||0} running`}),H(gf,{label:"OA 记录",value:Array.isArray(nu?.submissions)?nu.submissions.length:0,hint:nu?.runId||"latest run"}),H(gf,{label:"Procedure",value:Array.isArray(nu?.procedureRuns)?nu.procedureRuns.length:0,hint:nu?.status||"no run"}),H(gf,{label:"Score",value:UQ(v),hint:v?.runId||"selected epoch",tone:ZQ(v)})),H("div",{className:"panel-actions inline-actions"},H(Nn,{title:"Pipeline Snapshot",data:iu,onOpen:l,testId:"raw-pipeline-snapshot"}))),H(Mn,{title:"评分器",eyebrow:v?.runId||"selected epoch",loading:i.loading},H(iC,{run:v,onRaw:l})),H(Mn,{title:"MiniMax 限额",eyebrow:"model/minimax-m27 quota",loading:i.loading},H(kC,{quota:R,onRaw:l})),H(Mn,{title:"OA 事件流",eyebrow:"100% event-driven diagnostics",className:"pipeline-wide-panel",loading:i.loading},H(bC,{diagnostics:Au,onRaw:l})),H(Mn,{title:"组件矩阵",eyebrow:`${$l.length} classes`,loading:i.loading},$l.length===0?H(H0,{title:"暂无组件",text:"等待 D601 pipeline backend 返回 registry.components"}):H("div",{className:"component-strata"},$l.map((d)=>H("article",{key:d.name,className:"component-stratum"},H("span",null,d.name),H("strong",null,d.count)))),H("div",{className:"pipeline-component-list"},x.slice(0,12).map((d)=>H("span",{key:d.key,className:"data-chip"},H("b",null,d.componentClass||"--"),H("span",null,d.id||d.key||"--"))))),H(Mn,{title:"Epoch 列表",eyebrow:`${wu.length}/${Df} preview`,loading:i.loading},wu.length===0?H(H0,{title:"暂无运行记录",text:"当前 pipeline 在 .state/pipeline-runs 中还没有 epoch。"}):H("div",{className:"pipeline-run-list"},wu.map((d)=>{let Su=String(d?.runId||"")===$u?v:d;return H("article",{key:d.runId,className:`pipeline-run-card ${String(d.runId||"")===$u?"active":""}`,role:"button",tabIndex:0,onClick:()=>{j(String(d.runId||"")),W(Li())},onKeyDown:(xu)=>{if(xu.key==="Enter"||xu.key===" ")j(String(d.runId||"")),W(Li())}},H("div",{className:"node-card-head"},H("strong",null,NQ(wu,d)),H(Gi,{status:d.status},d.status||"--")),H("div",{className:"docker-meta compact"},H("span",null,Su?.pipelineId||"--"),H("span",null,`nodes ${Array.isArray(Su?.nodes)?Su.nodes.length:0}`),H("span",null,`oa ${Array.isArray(Su?.submissions)?Su.submissions.length:0}`),H("span",null,`procedures ${Array.isArray(Su?.procedureRuns)?Su.procedureRuns.length:0}`),H(nC,{run:Su})),H("p",{className:"muted paragraph"},TA(Su?.task)),H("span",{className:"pipeline-run-time"},Hu(Su?.updatedAt)))}))),H(Mn,{title:"运行材料索引",eyebrow:v?.runId||"selected epoch",className:"pipeline-wide-panel",loading:i.loading},H(RC,{activeRun:v,onRaw:l}))))}var pA=bu(Wl(),1);var Qu=pA.default.createElement,{useEffect:vC}=pA.default,MA=pA.default.useState,TQ={id:"",sequenceNo:"",contractNo:"",name:"",currentStatus:"",pending:"",paymentStatus:"",notes:""};function gC({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return Qu("span",{className:`status-badge ${f}`},l||u||"unknown")}function CA({label:u,value:l,hint:f,tone:n}){return Qu("article",{className:`metric-card ${n||""}`},Qu("div",{className:"metric-label"},u),Qu("div",{className:"metric-value"},l),Qu("div",{className:"metric-hint"},f))}function VQ({title:u,eyebrow:l,actions:f,children:n,className:i,loading:y}){return Qu("section",{className:`panel ${i||""}`},Qu("div",{className:"panel-head"},Qu("div",null,l?Qu("p",{className:"panel-eyebrow"},l):null,Qu(nl,{title:u,loading:y})),f?Qu("div",{className:"panel-actions"},f):null),Qu("div",{className:"panel-body"},n))}function sw({title:u,data:l,onOpen:f,testId:n}){return Qu("button",{type:"button",className:"ghost-btn","data-testid":n,onClick:()=>f(u,l)},"查看原始JSON")}function aw({title:u,text:l}){return Qu("div",{className:"empty-state"},Qu("strong",null,u),Qu("span",null,l))}function sC(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function aC(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function oC(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function f$(u,l){return`${u}/microservices/project-manager/proxy${l}`}function dC(u){return{id:String(u.id||""),sequenceNo:u.sequenceNo===null||u.sequenceNo===void 0?"":String(u.sequenceNo),contractNo:String(u.contractNo||""),name:String(u.name||""),currentStatus:String(u.currentStatus||""),pending:String(u.pending||""),paymentStatus:String(u.paymentStatus||""),notes:String(u.notes||"")}}function eC(u){return{sequenceNo:u.sequenceNo===""?null:Number(u.sequenceNo),contractNo:String(u.contractNo||"").trim(),name:String(u.name||"").trim(),currentStatus:String(u.currentStatus||"").trim(),pending:String(u.pending||"").trim(),paymentStatus:String(u.paymentStatus||"").trim(),paymentRatio:String(u.paymentStatus||"").trim(),notes:String(u.notes||"").trim()}}function BQ(u){return String(u||"item").replace(/[^A-Za-z0-9_-]+/g,"-")}function up(u){let l=new Uint8Array(u),f="",n=32768;for(let i=0;iQu("tr",{key:i.id,className:l===i.id?"active-row":"","data-testid":`project-manager-row-${BQ(i.id)}`},Qu("td",null,i.sequenceNo??"--"),Qu("td",null,Qu("strong",null,i.contractNo||"--"),Qu("code",null,i.id||"--")),Qu("td",null,Qu("strong",null,i.name||"--"),Qu("span",{className:"muted block"},i.sourceFile||"--")),Qu("td",null,i.currentStatus||"--"),Qu("td",null,Qu("span",{className:"preline"},i.pending||"--")),Qu("td",null,Qu(gC,{status:Number(i.paymentRatio||0)>=1?"online":"warn"},i.paymentStatus||"--")),Qu("td",null,i.notes||"--"),Qu("td",null,Qu("div",{className:"inline-actions"},Qu("button",{type:"button",className:"ghost-btn",onClick:()=>f(i),"data-testid":`project-manager-edit-${BQ(i.id)}`},"编辑"),Qu(sw,{title:`Project ${i.contractNo||i.id}`,data:i,onOpen:n,testId:`raw-project-${BQ(i.id)}`}))))))))}function ow({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let n=u.find((X)=>X.id==="project-manager")||null,[i,y]=MA({loading:!1,saving:!1,importing:!1,exporting:!1,error:"",notice:"",health:null,list:null,refreshedAt:null}),[_,$]=MA({...TQ}),[r,j]=MA(""),[J,Q]=MA("all"),{addNotification:U}=bf();async function F(X=r,S=J){if(!n)return;y((p)=>({...p,loading:!0,error:""}));try{let p=new URLSearchParams({pageSize:"200",status:S});if(X.trim())p.set("q",X.trim());let[Y,t]=await Promise.all([Zu(`${f}/microservices/project-manager/health`),Zu(f$(f,`/api/projects?${p.toString()}`))]);y((m)=>({...m,loading:!1,health:Y,list:t,refreshedAt:new Date,error:""}))}catch(p){y((Y)=>({...Y,loading:!1,error:cu(p,"Project Manager 加载失败")}))}}vC(()=>{F()},[n?.id,n?.runtime?.providerStatus]);async function N(X){X.preventDefault(),y((S)=>({...S,saving:!0,error:"",notice:""}));try{let S=eC(_);if(_.id)await Zu(f$(f,`/api/projects/${encodeURIComponent(_.id)}`),{method:"PUT",body:JSON.stringify(S)});else await Zu(f$(f,"/api/projects"),{method:"POST",body:JSON.stringify(S)});let p=_.id?"项目已更新":"项目已创建";y((Y)=>({...Y,saving:!1,notice:p})),U("success",p),await F()}catch(S){y((p)=>({...p,saving:!1,error:cu(S,"保存项目失败")}))}}async function L(){if(!_.id)return;if(!window.confirm(`删除项目 ${_.contractNo||_.name||_.id} ?`))return;y((X)=>({...X,saving:!0,error:"",notice:""}));try{await Zu(f$(f,`/api/projects/${encodeURIComponent(_.id)}`),{method:"DELETE"}),$({...TQ});let X="项目已删除";y((S)=>({...S,saving:!1,notice:X})),U("success",X),await F()}catch(X){y((S)=>({...S,saving:!1,error:cu(X,"删除项目失败")}))}}async function w(X){let S=X.target.files?.[0];if(!S)return;y((p)=>({...p,importing:!0,error:"",notice:""}));try{let p=up(await S.arrayBuffer()),t=`Excel 已导入 ${(await Zu(f$(f,"/api/import/excel"),{method:"POST",body:JSON.stringify({fileName:S.name,contentBase64:p,replace:!1})})).imported||0} 条项目`;y((m)=>({...m,importing:!1,notice:t})),U("success",t),X.target.value="",await F()}catch(p){y((Y)=>({...Y,importing:!1,error:cu(p,"Excel 导入失败")}))}}async function W(){y((X)=>({...X,exporting:!0,error:""}));try{let X=await aW(f$(f,"/api/projects/export.xlsx")),S=URL.createObjectURL(X),p=document.createElement("a");p.href=S,p.download=`project-manager-${VU()}.xlsx`,document.body.appendChild(p),p.click(),p.remove(),URL.revokeObjectURL(S),y((Y)=>({...Y,exporting:!1,notice:"Excel 已导出"}))}catch(X){y((S)=>({...S,exporting:!1,error:cu(X,"Excel 导出失败")}))}}if(!n)return Qu(aw,{title:"Project Manager 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=project-manager"});let K=sC(n),q=oC(n),z=aC(n),Z=Array.isArray(i.list?.projects)?i.list.projects:[],T=i.list?.summary||{},c=i.health||{};return Qu("div",{className:"project-manager-page","data-testid":"project-manager-page"},Qu(VQ,{title:"项目管理工作台",eyebrow:"Main Server PostgreSQL 用户服务",loading:i.loading||i.exporting,actions:Qu("div",{className:"panel-actions"},Qu("button",{type:"button",className:"ghost-btn",disabled:i.loading,onClick:()=>F(),"data-testid":"project-manager-refresh-button"},i.loading?"刷新中":"刷新"),Qu("button",{type:"button",className:"ghost-btn",disabled:i.exporting,onClick:W,"data-testid":"project-manager-export-button"},i.exporting?"导出中":"导出 Excel"),Qu(sw,{title:"Project Manager 用户服务",data:n,onOpen:l,testId:"raw-project-manager-service"}))},Qu("div",{className:"project-manager-hero"},Qu(CA,{label:"项目总数",value:T.total??Z.length,hint:`PG 表 ${c.storage?.table||"project_manager_projects"}`,tone:"ok"}),Qu(CA,{label:"进行中",value:T.active??"--",hint:"当前状态未完全完成"}),Qu(CA,{label:"已完成",value:T.completed??"--",hint:"按 完成 关键字统计",tone:"ok"}),Qu(CA,{label:"未全款",value:T.unpaid??"--",hint:"付款比例 < 1",tone:Number(T.unpaid||0)>0?"warn":"ok"})),Qu(ul,{error:i.error}),i.notice?Qu("div",{className:"form-success"},i.notice):null),Qu("div",{className:"project-manager-hero"},Qu("div",{className:"microservice-ref-card"},Qu("span",null,"Repo"),Qu("strong",null,q.url||"--"),Qu("code",null,q.commitId||"--")),Qu("div",{className:"microservice-ref-card"},Qu("span",null,"Main Server Docker"),Qu("strong",null,`${z.nodeBindHost||"--"}:${z.nodePort||"--"}`),Qu("code",null,`${q.composeService||"--"} / ${q.containerName||"--"}`)),Qu("div",{className:"microservice-ref-card"},Qu("span",null,"Runtime"),Qu("strong",null,K.providerName||n.providerId),Qu("code",null,`Health ${c.ok?"OK":"--"} / ${i.refreshedAt?Al(i.refreshedAt):"--"}`)),Qu("div",{className:"microservice-ref-card"},Qu("span",null,"Import Source"),Qu("strong",null,"D601 WeChat Excel"),Qu("code",null,"合作项目列表_I_20260309.xlsx"))),Qu("div",{className:"project-manager-layout"},Qu(VQ,{title:"项目清单",eyebrow:"CRUD + Excel Export",loading:i.loading||i.importing||i.exporting,actions:Qu("div",{className:"inline-actions project-manager-filters"},Qu("input",{value:r,onChange:(X)=>j(X.target.value),placeholder:"搜索合同号 / 项目名称 / 状态","data-testid":"project-manager-search"}),Qu("select",{value:J,onChange:(X)=>{Q(X.target.value),F(r,X.target.value)},"data-testid":"project-manager-status-filter"},Qu("option",{value:"all"},"全部"),Qu("option",{value:"active"},"进行中"),Qu("option",{value:"completed"},"已完成"),Qu("option",{value:"unpaid"},"未全款")),Qu("button",{type:"button",className:"ghost-btn",onClick:()=>F(r,J)},"筛选"))},Qu(lp,{projects:Z,activeId:_.id,onSelect:(X)=>$(dC(X)),onRaw:l})),Qu(VQ,{title:_.id?"编辑项目":"新建项目",eyebrow:"PostgreSQL Write Path",loading:i.saving||i.importing},Qu("form",{className:"stack-form project-manager-form",onSubmit:N,"data-testid":"project-manager-form"},_.id?Qu("label",null,"项目 ID",Qu("input",{value:_.id,disabled:!0})):null,Qu("label",null,"序号",Qu("input",{type:"number",value:_.sequenceNo,onChange:(X)=>$((S)=>({...S,sequenceNo:X.target.value}))})),Qu("label",null,"合同号",Qu("input",{value:_.contractNo,onChange:(X)=>$((S)=>({...S,contractNo:X.target.value})),required:!0})),Qu("label",null,"项目名称",Qu("input",{value:_.name,onChange:(X)=>$((S)=>({...S,name:X.target.value})),required:!0})),Qu("label",null,"当前状况",Qu("textarea",{value:_.currentStatus,onChange:(X)=>$((S)=>({...S,currentStatus:X.target.value}))})),Qu("label",null,"待完成",Qu("textarea",{value:_.pending,onChange:(X)=>$((S)=>({...S,pending:X.target.value}))})),Qu("label",null,"付款情况",Qu("input",{value:_.paymentStatus,onChange:(X)=>$((S)=>({...S,paymentStatus:X.target.value})),placeholder:"例如 1 / 0.5 / 50%"})),Qu("label",null,"其它",Qu("input",{value:_.notes,onChange:(X)=>$((S)=>({...S,notes:X.target.value}))})),Qu("div",{className:"inline-actions"},Qu("button",{type:"submit",className:"primary-btn",disabled:i.saving,"data-testid":"project-manager-save-button"},i.saving?"保存中":_.id?"保存修改":"创建项目"),Qu("button",{type:"button",className:"ghost-btn",onClick:()=>$({...TQ})},"清空"),_.id?Qu("button",{type:"button",className:"danger-btn",disabled:i.saving,onClick:L,"data-testid":"project-manager-delete-button"},"删除"):null)),Qu("div",{className:"project-manager-import"},Qu("p",{className:"muted paragraph"},"浏览器只访问 UniDesk frontend;后端通过同源用户服务代理写入主 PostgreSQL,不暴露 4233 公网端口。"),Qu("label",{className:"file-import"},i.importing?"导入中...":"导入 Excel",Qu("input",{type:"file",accept:".xlsx",onChange:w,disabled:i.importing,"data-testid":"project-manager-import-input"}))))))}var RA=bu(Wl(),1);var Fu=RA.default.createElement,{useEffect:fp}=RA.default,r0=RA.default.useState;function np({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return Fu("span",{className:`status-badge ${f}`},l||u||"unknown")}function mA({label:u,value:l,hint:f,tone:n}){return Fu("article",{className:`metric-card ${n||""}`},Fu("div",{className:"metric-label"},u),Fu("div",{className:"metric-value"},l),Fu("div",{className:"metric-hint"},f))}function cQ({title:u,eyebrow:l,actions:f,children:n,className:i,loading:y}){return Fu("section",{className:`panel ${i||""}`},Fu("div",{className:"panel-head"},Fu("div",null,l?Fu("p",{className:"panel-eyebrow"},l):null,Fu(nl,{title:u,loading:y})),f?Fu("div",{className:"panel-actions"},f):null),Fu("div",{className:"panel-body"},n))}function dw({title:u,data:l,onOpen:f,testId:n}){return Fu("button",{type:"button",className:"ghost-btn","data-testid":n,onClick:()=>f(u,l)},"查看原始JSON")}function xA({title:u,text:l}){return Fu("div",{className:"empty-state"},Fu("strong",null,u),Fu("span",null,l))}function ip(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function yp(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function _p(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function uZ(u){return String(u).replace(/[^a-zA-Z0-9_-]/g,"_")}function $p(u){if(!Number.isFinite(u))return"--";return`${u.toFixed(1)}%`}function n$(u,l){return`${u}/microservices/todo-note/proxy${l}`}function lZ(u){return u.reduce((l,f)=>{let n=lZ(Array.isArray(f.children)?f.children:[]),i=Boolean(f.completed);return{total:l.total+1+n.total,completed:l.completed+(i?1:0)+n.completed,active:l.active+(i?0:1)+n.active}},{total:0,completed:0,active:0})}function YQ(u,l){let f=l==="all"||(l==="completed"?Boolean(u.completed):!u.completed),n=Array.isArray(u.children)?u.children:[];return f||n.some((i)=>YQ(i,l))}function ew(u){return Array.isArray(u?.instances)?u.instances:[]}function XQ(u,l){for(let f of u){if(f?.id===l)return Array.isArray(f.children)?f.children:[];let n=XQ(Array.isArray(f?.children)?f.children:[],l);if(n.length>0)return n}return[]}function fZ({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let n=u.find((e)=>e.id==="todo-note")||null,[i,y]=r0(null),[_,$]=r0(null),[r,j]=r0(""),[J,Q]=r0(null),[U,F]=r0("all"),[N,L]=r0(13),[w,W]=r0(""),[K,q]=r0(""),[z,Z]=r0(""),[T,c]=r0(""),[X,S]=r0(""),[p,Y]=r0(!1),[t,m]=r0(""),[V,D]=r0(null),M=ew(_),I=lZ(Array.isArray(J?.todos)?J.todos:[]),O=n?ip(n):{},C=n?_p(n):{},g=n?yp(n):{};async function a(e=r){let[zu,v]=await Promise.all([Zu(`${f}/microservices/todo-note/health`),Zu(n$(f,"/api/instances"))]);y(zu),$(v);let $u=ew(v),Wu=$u.some((Du)=>Du.id===e)?e:$u[0]?.id||"";return j(Wu),Wu}async function iu(e=r){if(!e){Q(null);return}let zu=await Zu(n$(f,`/api/instances/${encodeURIComponent(e)}`));Q(zu)}async function Au(e=r){if(!n)return;Y(!0),m("");try{let zu=await a(e);await iu(zu),D(new Date)}catch(zu){m(cu(zu,"Todo Note 加载失败"))}finally{Y(!1)}}async function R(e){if(!r)return null;m("");try{let zu=await Zu(n$(f,`/api/instances/${encodeURIComponent(r)}/actions`),{method:"POST",body:JSON.stringify({action:e})});return Q(zu),await a(r),zu}catch(zu){return m(cu(zu,"Todo 操作失败")),null}}async function x(e){e.preventDefault();let zu=w.trim();if(!zu)return;Y(!0),m("");try{let v=await Zu(n$(f,"/api/instances"),{method:"POST",body:JSON.stringify({name:zu})});W(""),await Au(v.id)}catch(v){m(cu(v,"创建清单失败"))}finally{Y(!1)}}async function fu(e){if(!window.confirm("确认删除这个 Todo Note 清单?"))return;Y(!0),m("");try{await Zu(n$(f,`/api/instances/${encodeURIComponent(e)}`),{method:"DELETE"}),await Au(r===e?"":r)}catch(zu){m(cu(zu,"删除清单失败"))}finally{Y(!1)}}async function yu(e){e.preventDefault();let zu=K.trim();if(!zu)return;q(""),await R({type:"addTodo",title:zu})}async function Ju(e){if(!r)return;m("");try{let zu=await Zu(n$(f,`/api/instances/${encodeURIComponent(r)}/${e}`),{method:"POST",body:JSON.stringify({})});Q(zu),await a(r)}catch(zu){m(cu(zu,`${e} 失败`))}}function Vu(e){Z(e.id),c(String(e.title||""))}async function Lu(e){let zu=T.trim();if(Z(""),c(""),zu)await R({type:"updateTodoTitle",todoId:e,title:zu})}async function Bu(e){let v=window.prompt("新增子任务标题")?.trim();if(!v)return;let $u=XQ(Array.isArray(J?.todos)?J.todos:[],e),Wu=new Set($u.map((gu)=>gu.id)),Du=await R({type:"addTodo",title:v,parentId:e,targetIndex:0});if(!Du)return;let ku=XQ(Array.isArray(Du?.todos)?Du.todos:[],e),$l=ku.find((gu)=>!Wu.has(gu.id));if($l&&ku[0]?.id!==$l.id)await R({type:"moveTodo",todoId:$l.id,targetParentId:e,targetIndex:0})}async function b(e,zu){if(!X)return;let v={type:"moveTodo",todoId:X,targetIndex:zu};if(e)v.targetParentId=e;S(""),await R(v)}if(fp(()=>{Au()},[n?.id,n?.runtime?.providerStatus]),!n)return Fu(xA,{title:"Todo Note 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=todo-note"});let o=M.find((e)=>e.id===r)||null,nu=Array.isArray(J?.todos)?J.todos:[],wu=nu.map((e,zu)=>({todo:e,index:zu})).filter((e)=>YQ(e.todo,U));return Fu("div",{className:"todo-note-page","data-testid":"todo-note-page"},Fu(cQ,{title:"Todo Note 工作台",eyebrow:"Main Server 用户服务",loading:p,actions:Fu("div",{className:"panel-actions"},Fu("button",{type:"button",className:"ghost-btn",disabled:p,onClick:()=>Au(r),"data-testid":"todo-note-refresh-button"},p?"刷新中":"刷新"),Fu(dw,{title:"Todo Note 用户服务",data:n,onOpen:l,testId:"raw-todo-note-service"}))},Fu("div",{className:"todo-note-hero"},Fu("div",null,Fu("div",{className:"node-version-line"},Fu(np,{status:O.providerStatus==="online"?"online":"warn"},O.providerStatus||"unknown"),Fu("span",null,n.providerId),Fu("span",null,g.public?"公网暴露":"仅 UniDesk frontend 代理访问"),Fu("span",null,i?.ok?"Health OK":"Health --")),Fu("p",{className:"muted paragraph"},n.description)),Fu("div",{className:"microservice-ref-card"},Fu("span",null,"Repo"),Fu("strong",null,C.url||"--"),Fu("code",null,C.commitId||"--")),Fu("div",{className:"microservice-ref-card"},Fu("span",null,"Main Server Docker"),Fu("strong",null,`${g.nodeBindHost||"--"}:${g.nodePort||"--"}`),Fu("code",null,`${C.composeService||"--"} / ${C.containerName||"--"}`))),Fu(ul,{error:t,wide:!0})),Fu("div",{className:"todo-note-layout"},Fu(cQ,{title:"清单",eyebrow:`${M.length} Instances`,className:"todo-list-panel",loading:p},Fu("form",{className:"todo-create-list",onSubmit:x},Fu("input",{placeholder:"新清单名称",value:w,onChange:(e)=>W(e.target.value),"aria-label":"新清单名称"}),Fu("button",{type:"submit",className:"ghost-btn",disabled:p||!w.trim()},"创建")),M.length===0?Fu(xA,{title:"暂无清单",text:"迁移或创建清单后会出现在这里"}):Fu("div",{className:"todo-instance-list"},M.map((e)=>Fu("button",{key:e.id,type:"button",className:`todo-instance-row ${r===e.id?"active":""}`,onClick:()=>{j(e.id),iu(e.id)},"data-testid":`todo-instance-${uZ(e.id)}`},Fu("strong",null,e.name),Fu("span",null,`${e.completedCount??0}/${e.todoCount??0} 完成`),Fu("code",null,e.id))))),Fu("div",{className:"todo-main-stack"},Fu(cQ,{title:o?.name||"待选择清单",eyebrow:V?`Updated ${Al(V)}`:"Todo Tree",loading:p,actions:J?Fu("div",{className:"panel-actions"},Fu("button",{type:"button",className:"ghost-btn",onClick:()=>R({type:"renameInstance",name:window.prompt("清单新名称",J.name)||J.name})},"重命名"),Fu("button",{type:"button",className:"ghost-btn danger",onClick:()=>fu(r)},"删除清单"),Fu(dw,{title:`Todo Instance ${r}`,data:J,onOpen:l,testId:"raw-todo-instance"})):null},!J?Fu(xA,{title:"未选择清单",text:"左侧选择一个 Todo Note 清单"}):Fu("div",{className:"todo-workbench",style:{"--todo-font-size":`${N}px`}},Fu("div",{className:"todo-toolbar"},Fu("form",{className:"todo-add-form",onSubmit:yu},Fu("input",{placeholder:"新增根任务",value:K,onChange:(e)=>q(e.target.value),"aria-label":"新增根任务"}),Fu("button",{type:"submit",className:"ghost-btn",disabled:!K.trim()},"新增")),Fu("div",{className:"todo-filter-strip"},["all","active","completed"].map((e)=>Fu("button",{key:e,type:"button",className:`todo-filter ${U===e?"active":""}`,onClick:()=>F(e)},e==="all"?"全部":e==="active"?"未完成":"已完成"))),Fu("div",{className:"todo-toolbar-actions"},Fu("button",{type:"button",className:"ghost-btn",onClick:()=>R({type:"setAllTodosExpanded",expanded:!0})},"全部展开"),Fu("button",{type:"button",className:"ghost-btn",onClick:()=>R({type:"setAllTodosExpanded",expanded:!1})},"全部收起"),Fu("button",{type:"button",className:"ghost-btn",onClick:()=>Ju("undo")},"撤销"),Fu("button",{type:"button",className:"ghost-btn",onClick:()=>Ju("redo")},"重做"),Fu("label",{className:"todo-font-control"},"字号",Fu("input",{type:"range",min:11,max:18,value:N,onChange:(e)=>L(Number(e.target.value))})))),Fu("div",{className:"todo-stats-grid"},Fu(mA,{label:"总任务",value:I.total,hint:`${M.length} lists`}),Fu(mA,{label:"已完成",value:I.completed,hint:`${$p(I.total?I.completed/I.total*100:0)}`,tone:"ok"}),Fu(mA,{label:"未完成",value:I.active,hint:U==="active"?"当前筛选":"active tasks",tone:I.active>0?"warn":"ok"}),Fu(mA,{label:"历史指针",value:J.historyPointer??0,hint:"undo / redo"})),Fu("div",{className:"todo-root-drop",onDragOver:(e)=>e.preventDefault(),onDrop:(e)=>{e.preventDefault(),b(null,nu.length)}},"拖到这里可移为根任务末尾"),Fu("div",{className:"todo-tree","data-testid":"todo-note-tree"},wu.length===0?Fu(xA,{title:"没有匹配任务",text:"调整筛选或新增任务"}):wu.map(({todo:e,index:zu})=>Fu(nZ,{key:e.id,todo:e,depth:0,parentId:null,index:zu,siblingCount:nu.length,filter:U,editingId:z,editingTitle:T,setEditingTitle:c,beginEdit:Vu,saveEdit:Lu,applyTodoAction:R,addChild:Bu,dragTodoId:X,setDragTodoId:S,dropTodo:b}))))))))}function nZ(u){let{todo:l,depth:f,parentId:n,index:i,siblingCount:y,filter:_,editingId:$,editingTitle:r,setEditingTitle:j,beginEdit:J,saveEdit:Q,applyTodoAction:U,addChild:F,dragTodoId:N,setDragTodoId:L,dropTodo:w}=u,W=Array.isArray(l.children)?l.children:[],K=W.map((Z,T)=>({child:Z,childIndex:T})).filter((Z)=>YQ(Z.child,_)),q=$===l.id,z=n||null;return Fu("div",{className:"todo-row-wrap"},Fu("article",{className:`todo-row ${l.completed?"completed":""} ${N===l.id?"dragging":""}`,style:{"--todo-depth":f},draggable:!0,onDragStart:(Z)=>{L(l.id),Z.dataTransfer.effectAllowed="move"},onDragOver:(Z)=>Z.preventDefault(),onDrop:(Z)=>{Z.preventDefault(),w(l.id,W.length)},"data-testid":`todo-row-${uZ(l.id)}`},Fu("button",{type:"button",className:"todo-expand",disabled:W.length===0,onClick:()=>U({type:"toggleTodoExpanded",todoId:l.id})},W.length===0?"·":l.expanded?"▾":"▸"),Fu("input",{type:"checkbox",checked:Boolean(l.completed),onChange:()=>U({type:"toggleTodoCompleted",todoId:l.id}),"aria-label":`完成 ${l.title}`}),Fu("div",{className:"todo-title-cell",onDoubleClick:()=>J(l)},q?Fu("div",{className:"todo-edit-inline"},Fu("input",{value:r,autoFocus:!0,onChange:(Z)=>j(Z.target.value),onKeyDown:(Z)=>{if(Z.key==="Enter")Q(l.id);if(Z.key==="Escape")J({id:"",title:""})}}),Fu("button",{type:"button",className:"ghost-btn",onClick:()=>Q(l.id)},"保存")):Fu("strong",null,l.title||"Untitled"),Fu("div",{className:"todo-meta-line"},Fu("span",null,`子项 ${W.length}`),Fu("span",null,`更新 ${Hu(l.updatedAt)}`),l.reminderAt?Fu("span",{className:"todo-reminder"},`提醒 ${Hu(l.reminderAt)}`):Fu("span",null,"无提醒"))),Fu("input",{className:"todo-reminder-input",type:"datetime-local",value:q2(l.reminderAt),onChange:(Z)=>U({type:"setTodoReminder",todoId:l.id,reminderAt:BU(Z.target.value)})}),Fu("div",{className:"todo-row-actions"},Fu("button",{type:"button",className:"ghost-btn",onClick:()=>J(l)},"编辑"),Fu("button",{type:"button",className:"ghost-btn",onClick:()=>F(l.id)},"子项"),Fu("button",{type:"button",className:"ghost-btn",disabled:i<=0,onClick:()=>U({type:"moveTodo",todoId:l.id,...z?{targetParentId:z}:{},targetIndex:i-1})},"上移"),Fu("button",{type:"button",className:"ghost-btn",disabled:i<=0,onClick:()=>U({type:"moveTodo",todoId:l.id,...z?{targetParentId:z}:{},targetIndex:0})},"置顶"),Fu("button",{type:"button",className:"ghost-btn",disabled:i>=y-1,onClick:()=>U({type:"moveTodo",todoId:l.id,...z?{targetParentId:z}:{},targetIndex:i+1})},"下移"),Fu("button",{type:"button",className:"ghost-btn",disabled:!n,onClick:()=>U({type:"moveTodo",todoId:l.id,targetIndex:9999})},"提升"),Fu("button",{type:"button",className:"ghost-btn danger",onClick:()=>U({type:"deleteTodo",todoId:l.id})},"删除"))),l.expanded&&K.length>0?Fu("div",{className:"todo-children"},K.map(({child:Z,childIndex:T})=>Fu(nZ,{key:Z.id,todo:Z,depth:f+1,parentId:l.id,index:T,siblingCount:W.length,filter:_,editingId:$,editingTitle:r,setEditingTitle:j,beginEdit:J,saveEdit:Q,applyTodoAction:U,addChild:F,dragTodoId:N,setDragTodoId:L,dropTodo:w}))):null)}var iZ=bu(Wl(),1),Zi=iZ.default.createElement;function yZ({title:u,items:l,actions:f,className:n,testId:i}){let y=Array.isArray(l)?l:[];return Zi("section",{className:`top-status-bar ${n||""}`,"data-testid":i},Zi("div",{className:"top-status-main"},u?Zi("strong",{className:"top-status-title"},u):null,Zi("div",{className:"top-status-chips"},y.map((_,$)=>Zi("span",{key:_?.key||`${_?.label||"status"}-${$}`,className:`top-status-chip ${_?.tone||""}`,"data-testid":_?.testId},_?.label?Zi("b",null,_.label):null,Zi("span",null,_?.value??"--"))))),f?Zi("div",{className:"top-status-actions"},f):null)}var Dr=bu(Wl(),1);var Eu=Dr.default.createElement,{useEffect:rp,useMemo:Ap}=Dr.default,jp=Dr.default.useState;function _Z({status:u,children:l,title:f}){let n=String(u||"unknown").toLowerCase();return Eu("span",{className:`status-badge ${n}`,title:f},l||u||"unknown")}function bA({label:u,value:l,hint:f,tone:n}){return Eu("article",{className:`metric-card ${n||""}`},Eu("div",{className:"metric-label"},u),Eu("div",{className:"metric-value"},l),Eu("div",{className:"metric-hint"},f))}function tQ({title:u,eyebrow:l,actions:f,children:n,className:i,loading:y}){return Eu("section",{className:`panel ${i||""}`},Eu("div",{className:"panel-head"},Eu("div",null,l?Eu("p",{className:"panel-eyebrow"},l):null,Eu(nl,{title:u,loading:y})),f?Eu("div",{className:"panel-actions"},f):null),Eu("div",{className:"panel-body"},n))}function $Z({title:u,data:l,onOpen:f,testId:n}){return Eu("button",{type:"button",className:"ghost-btn","data-testid":n,onClick:()=>f?.(u,l)},"查看原始JSON")}function DQ({title:u,text:l}){return Eu("div",{className:"empty-state"},Eu("strong",null,u),Eu("span",null,l))}function i$(u){return Array.isArray(u)?u:[]}function SQ(u){return u&&typeof u==="object"&&!Array.isArray(u)?u:{}}function Jp(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function Qp(u,l){return`${u}/microservices/k3sctl-adapter/proxy${l}`}function Up(u){return u.find((l)=>String(l?.id||"")==="k3sctl-adapter")||null}function Np(u){if(u?.healthy===!0)return"online";if(String(u?.role||"")==="standby")return"warn";return"failed"}function Fp(u){return u?.healthy===!0?"online":"failed"}function Wp(u){if(u===!0)return"YES";if(u===!1)return"NO";return"--"}function qp(u){return Array.from(new Set(u.flatMap((l)=>i$(l?.expectedNodeIds).map((f)=>String(f))))).filter(Boolean).sort()}function Lp(u){let l=u.find((f)=>f?.id==="code-queue")||u[0];return String(l?.activeInstanceId||"--")}function Kp(u){return Eu("article",{key:u?.id||u?.nodeId,className:"k3s-instance-card"},Eu("div",{className:"node-card-head"},Eu("strong",null,u?.nodeId||u?.id||"--"),Eu(_Z,{status:Np(u)},u?.healthy?"HEALTHY":"DEGRADED")),Eu("div",{className:"k3s-instance-role"},Eu("span",null,String(u?.role||"worker").toUpperCase()),Eu("code",null,u?.id||"--")),Eu("dl",{className:"k3s-kv"},Eu("dt",null,"Base URL"),Eu("dd",null,Eu("code",null,u?.baseUrl||"--")),Eu("dt",null,"Proxy"),Eu("dd",null,u?.proxyMode||"--"),Eu("dt",null,"Health"),Eu("dd",null,`${u?.upstreamStatus??"--"} / ${u?.status||"unknown"}`),Eu("dt",null,"Checked"),Eu("dd",null,Hu(u?.checkedAt))))}function zp(u,l){let f=i$(u?.instances),n=SQ(u?.active);return Eu(tQ,{key:u?.id||"service",title:u?.id||"managed-service",eyebrow:`${u?.namespace||"unidesk"} / k3s managed service`,className:"k3s-service-panel",actions:Eu($Z,{title:`k3s service ${u?.id||""}`,data:u,onOpen:l,testId:`raw-k3s-service-${u?.id||"unknown"}`})},Eu("div",{className:"k3s-service-summary"},Eu("div",null,Eu("span",null,"状态"),Eu(_Z,{status:Fp(u)},u?.status||"unknown")),Eu("div",null,Eu("span",null,"Active"),Eu("strong",null,u?.activeInstanceId||"--")),Eu("div",null,Eu("span",null,"Single Writer"),Eu("strong",null,Wp(u?.singleWriter))),Eu("div",null,Eu("span",null,"Active Health"),Eu("strong",null,n?.upstreamStatus??"--"))),f.length===0?Eu(DQ,{title:"暂无 k3s 实例",text:"adapter 没有返回该服务的 endpoint 列表"}):Eu("div",{className:"k3s-instance-grid"},f.map(Kp)))}function rZ({microservices:u,onRaw:l,apiBaseUrl:f,onNavigate:n}){let i=Up(Array.isArray(u)?u:[]),y=Jp(i),[_,$]=jp({loading:!1,error:"",data:null,refreshedAt:null});async function r(){$((K)=>({...K,loading:!0,error:""}));try{let K=await Zu(Qp(f,"/api/control-plane"));$({loading:!1,error:"",data:K,refreshedAt:new Date})}catch(K){$((q)=>({...q,loading:!1,error:cu(K,"加载 k3s 控制平面失败")}))}}rp(()=>{r()},[f]);let j=Ap(()=>i$(_.data?.services),[_.data]),J=qp(j),Q=j.filter((K)=>K?.healthy===!0).length,U=j.reduce((K,q)=>K+i$(q?.instances).length,0),F=j.reduce((K,q)=>K+i$(q?.instances).filter((z)=>z?.healthy===!0).length,0),N=Lp(j),L=SQ(_.data?.kubectl),w=SQ(_.data?.kubeApiProxy),W=i$(_.data?.manifestPaths).map((K)=>String(K));if(!i)return Eu(DQ,{title:"k3sctl-adapter 未登记",text:"请在 config.json 的 microservices 中登记 id=k3sctl-adapter,并通过该微服务连接 k3s 控制平面。"});return Eu("div",{className:"k3s-page","data-testid":"k3sctl-page"},Eu(tQ,{title:"k3s Control Plane",eyebrow:"Managed by k3sctl-adapter",className:"k3s-hero-panel",loading:_.loading,actions:Eu(Dr.default.Fragment,null,Eu("button",{type:"button",className:"ghost-btn",onClick:r,disabled:_.loading,"data-testid":"k3s-refresh-button"},_.loading?"刷新中":"刷新"),n?Eu("button",{type:"button",className:"ghost-btn",onClick:()=>n("apps","code-queue"),"data-testid":"k3s-open-code-queue"},"打开 Code Queue"):null,Eu($Z,{title:"k3sctl-adapter microservice",data:i,onOpen:l,testId:"raw-k3s-adapter"}))},Eu("div",{className:"k3s-hero"},Eu("div",{className:"k3s-orb","aria-hidden":"true"},Eu("span",null,"k3s")),Eu("div",{className:"k3s-hero-copy"},Eu("p",{className:"eyebrow"},"D601 native control plane"),Eu("h2",null,"UniDesk 只管理 adapter;业务微服务交给 k3s 标准服务路由"),Eu("p",{className:"muted paragraph"},"Code Queue 的前端/API 请求进入 k3sctl-adapter,再由 adapter 转发到 k3s active service。provider-gateway 只用于维护 adapter 和节点诊断,不再直接管理 Code Queue 容器。"),Eu("div",{className:"k3s-route-strip"},Eu("span",null,"NO FALLBACK"),Eu("code",null,_.data?.runtimePath||"frontend -> backend-core -> k3sctl-adapter")))),Eu("div",{className:"metric-grid"},Eu(bA,{label:"控制面",value:_.data?.clusterId||"D601",hint:`adapter ${y.providerStatus||"unknown"}`,tone:y.providerStatus==="online"?"ok":"warn"}),Eu(bA,{label:"代管服务",value:j.length,hint:`${Q}/${j.length||0} healthy`,tone:Q===j.length&&j.length>0?"ok":"warn"}),Eu(bA,{label:"节点",value:J.join(" / ")||"--",hint:"expected k3s nodes"}),Eu(bA,{label:"实例",value:`${F}/${U}`,hint:`active ${N}`,tone:F===U&&U>0?"ok":"warn"})),Eu("div",{className:"k3s-control-plane-grid"},Eu("article",{className:"k3s-control-plane-card"},Eu("span",null,"service proxy"),Eu("strong",null,w.configured===!0?"K8S API PROXY":"PROXY DEGRADED"),Eu("p",null,w.configured===!0?`${w.mode||"kubernetes-api-service-proxy"} via ${w.connectHost||"--"}`:"adapter 必须通过 k8s API service proxy 访问业务服务,不回退到业务容器直连。")),Eu("article",{className:"k3s-control-plane-card"},Eu("span",null,"manifests"),Eu("strong",null,W.length||"--"),Eu("p",null,W.join(" / ")||"未配置 manifest")),Eu("article",{className:"k3s-control-plane-card"},Eu("span",null,"cluster snapshot"),Eu("strong",null,L.enabled===!0?L.ok===!0?"KUBECTL OK":"KUBECTL DEGRADED":"API ONLY"),Eu("p",null,L.enabled===!0?`nodes ${L.nodeCount??"--"}`:"控制面页面以 adapter 返回的 k8s service proxy 状态为准;kubectl 只作为可选快照。"))),_.error?Eu(ul,{error:_.error}):null,_.refreshedAt?Eu("p",{className:"muted paragraph"},`最近刷新 ${Al(_.refreshedAt)}`):null),j.length===0?Eu(tQ,{title:"代管服务",eyebrow:"k3s services",loading:_.loading},Eu(DQ,{title:"暂无 k3s 服务",text:"等待 k3sctl-adapter 返回 /api/services;Code Queue 应显示 D601 scheduler/read/write 服务实例。"})):j.map((K)=>zp(K,l)))}var Sr=bu(Wl(),1);var el=Sr.default.createElement;function AZ({onClose:u}){let{notifications:l,removeNotification:f,clearNotifications:n}=bf(),i=Sr.default.useRef(null);if(Sr.default.useEffect(()=>{let y=(_)=>{if(i.current&&!i.current.contains(_.target))u()};return document.addEventListener("mousedown",y),()=>document.removeEventListener("mousedown",y)},[u]),l.length===0)return el("div",{className:"notification-popup",ref:i},el("div",{className:"notification-popup-header"},el("span",null,"通知"),el("button",{className:"notification-popup-close",onClick:u},"×")),el("div",{className:"notification-popup-empty"},"暂无通知"));return el("div",{className:"notification-popup",ref:i},el("div",{className:"notification-popup-header"},el("span",null,`通知 (${l.length})`),el("div",{className:"notification-popup-actions"},el("button",{className:"notification-popup-clear",onClick:n},"清空"),el("button",{className:"notification-popup-close",onClick:u},"×"))),el("div",{className:"notification-popup-list"},l.slice().reverse().map((y)=>el("div",{key:y.id,className:`notification-item ${y.type}`},el("span",{className:"notification-item-icon"},y.type==="success"?"✓":"×"),el("span",{className:"notification-item-message"},y.message),el("button",{className:"notification-item-dismiss",onClick:()=>f(y.id)},"×")))))}function jZ({notification:u}){let{removeNotification:l}=bf();return Sr.default.useEffect(()=>{let f=setTimeout(()=>{l(u.id)},3000);return()=>clearTimeout(f)},[u.id,l]),el("div",{className:`notification-banner ${u.type}`,role:"alert"},el("span",{className:"notification-banner-icon"},u.type==="success"?"✓":"×"),el("span",{className:"notification-banner-message"},u.message),el("button",{className:"notification-banner-dismiss",onClick:()=>l(u.id)},"×"))}function ZZ(u,l){let f=document.getElementById("root")?.getAttribute(u);if(!f)return l;try{let n=JSON.parse(f);return typeof n==="object"&&n!==null&&!Array.isArray(n)?n:l}catch{return l}}var su=ZZ("data-config",{apiBaseUrl:"/api",authUsername:"admin"}),JZ=su.environment&&typeof su.environment==="object"?su.environment:{},Gp=ZZ("data-codex-overview",null),A=Hi.default.createElement,{useEffect:pn,useMemo:Cr}=Hi.default,du=Hi.default.useState,pQ=Hi.default.createContext(!1),I0=nK(F4),wp={id:"code-queue",name:"Code Queue",providerId:"D601",description:"Code Queue",repository:{containerName:"k3s:code-queue"},backend:{nodeBaseUrl:"k3s://code-queue",nodeBindHost:"k3s://unidesk/code-queue",nodePort:4222,proxyMode:"k3sctl-adapter-http",public:!1},deployment:{mode:"k3sctl-managed",adapterServiceId:"k3sctl-adapter",k3sServiceId:"code-queue"},runtime:{orchestrator:"k3sctl",providerStatus:"loading",providerName:"D601"}};function QZ(){return typeof document>"u"||document.visibilityState!=="hidden"}function EZ(u){return u?.environment==="dev"||u?.namespace==="unidesk-dev"}function Zp(u){let l=typeof u==="string"?u:"";return l.length>=7?l.slice(0,7):l||"unknown"}function Ep(u,l){if(u==="ops"&&l==="status")return 5000;if(u==="nodes"&&l==="monitor")return 5000;if(u==="tasks"&&(l==="dispatch"||l==="scheduled"||l==="pending"))return 5000;if(u==="nodes"||u==="ops")return 1e4;if(u==="apps")return 15000;if(u==="tasks")return 15000;return 30000}async function Hp(u){if(!u?._summaryOnly||!u?.id)return u;return(await Zu(`${su.apiBaseUrl}/tasks/${encodeURIComponent(String(u.id))}`))?.task||u}function pr(u){return u?._summaryOnly?{...u,_loadRaw:()=>Hp(u)}:u}function L1(u){if(!Number.isFinite(u))return"--";let l=Math.max(0,u);if(l===0)return"0s";if(l<0.01)return"<0.01s";if(l<0.1)return`${l.toFixed(2)}s`;if(l<1)return`${l.toFixed(1)}s`;if(l<10&&!Number.isInteger(l))return`${l.toFixed(1)}s`;if(l<60)return`${Math.round(l)}s`;let f=Math.floor(l);if(f<3600)return`${Math.floor(f/60)}m ${f%60}s`;return`${Math.floor(f/3600)}h ${Math.floor(f%3600/60)}m`}function O0(u){let l=Number(u);if(!Number.isFinite(l))return"--";if(l<1)return`${Math.max(0,l).toFixed(1)}ms`;if(l<10)return`${l.toFixed(1)}ms`;if(l<1000)return`${Math.round(l)}ms`;return L1(l/1000)}function Gf(u){let l=Number(u);if(!Number.isFinite(l)||l<=0)return"--";let f=["B","KB","MB","GB","TB"],n=l,i=0;while(n>=1024&&i0)return f[n]}return"任务失败但 provider 未返回明确原因"}function wy(u){if(u===null||u===void 0)return"--";if(typeof u==="boolean")return u?"是":"否";if(typeof u==="number")return String(u);if(typeof u==="string")return u.length>80?`${u.slice(0,77)}...`:u;if(Array.isArray(u))return`${u.length} 项`;if(typeof u==="object")return`${Object.keys(u).length} 字段`;return String(u)}function Tp(u,l){let f=u.replace(/[-_\s]/g,"").toLowerCase(),n=f==="ts"||f.endsWith("at")||f.endsWith("timestamp")||f.endsWith("heartbeat");if((typeof l==="string"||typeof l==="number")&&n){let i=Hu(l);if(i!=="--")return i}if(u==="bodyText"&&typeof l==="string")return`${/^\s*[{[]/.test(l)?"JSON":"HTTP"} body ${l.length} chars`;return wy(l)}function TZ(u){if(!u||typeof u!=="object"||Array.isArray(u))return[];return Object.entries(u)}function A0(u){return String(u).replace(/[^a-zA-Z0-9_-]/g,"_")}function xQ(u,l){return u&&typeof u==="object"&&!Array.isArray(u)?u[l]:void 0}function hA(u,l,f="未知"){let n=xQ(u?.labels,l);return typeof n==="string"&&n.length>0?n:f}function VZ(u){return hA(u,"providerGatewayVersion")}function Mr(u){return hA(u,"providerGatewayUpgradePolicy")}function UZ(u){return hA(u,"providerGatewayStartedAt","")}function BZ(u){let l=xQ(u?.labels,"unideskCapabilities");if(typeof l==="string")return l.split(",").map((f)=>f.trim()).filter(Boolean);return Array.isArray(l)?l.filter((f)=>typeof f==="string"):[]}function cZ(u,l){return BZ(u).includes(l)}function NZ(u,l){let f=xQ(u?.labels,l);return f===!0||f==="true"||f==="1"}function Vp(u){if(!cZ(u,"host.ssh"))return{tone:"fail",label:"不可用",detail:"未声明 host.ssh"};if(!NZ(u,"hostSshConfigured"))return{tone:"warn",label:"未配置",detail:"缺少 SSH 环境变量"};if(!NZ(u,"hostSshKeyPresent"))return{tone:"warn",label:"缺 key",detail:"私钥未挂载"};return{tone:"ok",label:"可用",detail:hA(u,"hostSshTarget","host.ssh ready")}}function Bp(u){if(!cZ(u,"provider.upgrade"))return{tone:"fail",label:"不可用",detail:"未声明 provider.upgrade"};let l=Mr(u);if(l!=="always-enabled")return{tone:"warn",label:"待确认",detail:`策略 ${l}`};return{tone:"ok",label:"可用",detail:"always-enabled"}}function RQ(u){let l=typeof u==="string"&&u.length>0?u:"未知";if(l==="未知")return"版本未知";return l.startsWith("v")?l:`v${l}`}function XZ(u){return u?.payload&&typeof u.payload==="object"&&!Array.isArray(u.payload)?u.payload:{}}function IA(u){return u?.result&&typeof u.result==="object"&&!Array.isArray(u.result)?u.result:{}}function kA(u){let l=XZ(u),f=IA(u);return(l.mode??f.mode)==="schedule"?"schedule":"plan"}function cp(u){let l=XZ(u).source;return typeof l==="string"&&l.length>0?l:"unknown"}function Xp(u){let l=IA(u),f=l.plan&&typeof l.plan==="object"&&!Array.isArray(l.plan)?l.plan:{},n=l.policy??f.policy;return typeof n==="string"&&n.length>0?n:"--"}function YZ(u){let l=IA(u),f=l.plan&&typeof l.plan==="object"&&!Array.isArray(l.plan)?l.plan:{},n=l.targetProviderGatewayVersion??l.providerGatewayVersion??f.targetProviderGatewayVersion??f.providerGatewayVersion;return typeof n==="string"&&n.length>0?RQ(n):"版本未知"}function tZ(u){if(String(u?.status||"").toLowerCase()==="failed")return OZ(u);if(_$(u))return"等待 provider 回传升级终态";let f=IA(u);if(typeof f.updaterContainerId==="string"&&f.updaterContainerId.length>0)return`updater ${f.updaterContainerId.slice(0,18)}`;if(typeof f.message==="string"&&f.message.length>0)return f.message;if(f.plan)return"升级计划已生成";return"无升级结果摘要"}function DZ(u,l){return u.filter((f)=>f?.providerId===l&&f?.command==="provider.upgrade").sort((f,n)=>(mn(n.updatedAt)??0)-(mn(f.updatedAt)??0))}function Yp(u){return u.find((l)=>kA(l)==="schedule")||u[0]||null}function SZ(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function FZ(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function tp(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function El({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return A("span",{className:`status-badge ${f}`},l||u||"unknown")}function Ll({label:u,value:l,hint:f,tone:n,onClick:i,testId:y}){let _=typeof i==="function";return A("article",{className:`metric-card ${n||""} ${_?"clickable":""}`,role:_?"button":void 0,tabIndex:_?0:void 0,"data-testid":y,onClick:i,onKeyDown:_?($)=>{if($.key==="Enter"||$.key===" ")$.preventDefault(),i()}:void 0},A("div",{className:"metric-label"},u),A("div",{className:"metric-value"},l),A("div",{className:"metric-hint"},f))}function il({title:u,eyebrow:l,actions:f,children:n,className:i,loading:y}){let _=Hi.default.useContext(pQ),$=Boolean(y)||_;return A("section",{className:`panel ${i||""}`},A("div",{className:"panel-head"},A("div",null,l?A("p",{className:"panel-eyebrow"},l):null,A(nl,{title:u,loading:$})),f?A("div",{className:"panel-actions"},f):null),A("div",{className:"panel-body"},n))}function uf({title:u,data:l,onOpen:f,testId:n}){let[i,y]=du(!1),_=l&&typeof l==="object"&&typeof l._loadRaw==="function"?l._loadRaw:null;async function $(){if(!_){f(u,l);return}y(!0);try{f(u,await _())}catch(r){f(u,{ok:!1,error:cu(r,"读取原始 JSON 失败"),fallback:l})}finally{y(!1)}}return A("button",{type:"button",className:"ghost-btn","data-testid":n,disabled:i,onClick:()=>void $()},i?"读取中":"查看原始JSON")}function Dp({raw:u,onClose:l}){if(!u)return null;return A("div",{className:"modal-backdrop",role:"presentation"},A("section",{className:"raw-dialog",role:"dialog","aria-modal":"true","aria-label":u.title},A("div",{className:"raw-dialog-head"},A("h2",null,u.title),A("button",{type:"button",className:"ghost-btn",onClick:l},"关闭")),A("pre",{className:"raw-json","data-testid":"raw-json"},JSON.stringify(u.data,null,2))))}function PZ({labels:u,limit:l=8}){let f=TZ(u).slice(0,l);if(f.length===0)return A("span",{className:"muted"},"无标签");return A("div",{className:"chip-row"},f.map(([n,i])=>A("span",{key:n,className:"data-chip"},A("b",null,n),A("span",null,wy(i)))))}function y$({node:u}){let l=VZ(u);return A("span",{className:`version-chip ${l==="未知"?"unknown":""}`,"data-testid":`gateway-version-${A0(u?.providerId||"unknown")}`},RQ(l))}function WZ({title:u,state:l,testId:f}){return A("span",{className:`capability-badge ${l.tone}`,title:l.detail,"data-testid":f},A("b",null,u),A("strong",null,l.label),A("small",null,l.detail))}function bQ({node:u}){let l=A0(u?.providerId||"unknown");return A("div",{className:"node-availability-strip"},A(WZ,{title:"SSH 透传",state:Vp(u),testId:`ssh-availability-${l}`}),A(WZ,{title:"远程更新",state:Bp(u),testId:`upgrade-availability-${l}`}))}function Oi({data:u,empty:l="无数据"}){if(u===null||u===void 0)return A("span",{className:"muted"},l);if(typeof u!=="object")return A("span",{className:"summary-value"},wy(u));if(Array.isArray(u))return A("span",{className:"summary-value"},`${u.length} 项列表`);let f=Object.entries(u).slice(0,5);if(f.length===0)return A("span",{className:"muted"},l);return A("div",{className:"summary-grid"},f.map(([n,i])=>A("span",{key:n,className:"summary-item"},A("b",null,n),A("span",null,Tp(n,i)))))}function zl({title:u,text:l}){return A("div",{className:"empty-state"},A("strong",null,u),A("span",null,l))}function Sp({onLogin:u}){let[l,f]=du(su.authUsername||"admin"),[n,i]=du(""),[y,_]=du(""),[$,r]=du(!1);async function j(J){J.preventDefault(),r(!0),_("");try{let Q=await Zu("/login",{method:"POST",body:JSON.stringify({username:l,password:n})});u(Q)}catch(Q){_(cu(Q,"登录失败"))}finally{r(!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:j},A("label",null,"账号",A("input",{name:"username",autoComplete:"username",value:l,onChange:(J)=>f(J.target.value)})),A("label",null,"密码",A("input",{name:"password",type:"password",autoComplete:"current-password",value:n,onChange:(J)=>i(J.target.value)})),A(ul,{error:y}),A("button",{type:"submit",disabled:$},$?"登录中":"登录")),A("div",{className:"login-note"},"默认账号由 config.json 注入;公网入口只暴露前端登录面。")))}function Pp({connection:u,lastRefresh:l,onRefresh:f,onLogout:n,session:i,clock:y,activeStatusItems:_=[],onNotificationToggle:$,unreadCount:r=0,environment:j={}}){let J=EZ(j),Q=[...J?[{key:"environment",label:"环境",value:`${j.namespace||"unidesk-dev"}`,tone:"warn"}]:[],{key:"core",label:"核心",value:u.text,tone:u.ok?"ok":"fail",testId:"conn-text"},...Array.isArray(_)?_:[],{key:"refresh",label:"刷新",value:l?Al(l):"未刷新"},{key:"clock",label:y6,value:Al(y)},{key:"user",label:"用户",value:i?.user?.username||"--",tone:"user"}];return A("header",{className:"topbar"},A("div",null,A("p",{className:"eyebrow"},"Distributed Work Platform"),A("h1",null,"UniDesk 控制平面"),J?A("div",{className:"dev-env-ribbon","data-testid":"dev-environment-ribbon"},A("b",null,"DEV"),A("span",null,j.namespace||"unidesk-dev"),A("span",null,j.deployRef||"origin/master:deploy.json#environments.dev"),A("span",null,Zp(j.commit||j.requestedCommit))):null),A(yZ,{className:"global-top-status",title:"状态",items:Q,actions:[A("button",{key:"notification",type:"button",className:`notification-icon-btn ${r>0?"has-unread":""}`,onClick:$,"aria-label":"通知"},"\uD83D\uDD14",r>0?A("span",{key:"badge",className:"notification-badge"},r>99?"99+":r):null),A("button",{key:"refresh",type:"button",className:"ghost-btn",onClick:f},"刷新"),A("button",{key:"logout",type:"button",className:"ghost-btn danger",onClick:n},"退出")]}))}function Mp(u){return!u.defaultPrevented&&u.button===0&&!u.metaKey&&!u.altKey&&!u.ctrlKey&&!u.shiftKey&&u.currentTarget.target!=="_blank"}function MZ({moduleId:u,tabId:l,className:f,active:n=!1,title:i,testId:y,onNavigate:_,children:$}){let r=W4(I0,u,l);return A("a",{href:r,role:"button",className:f,title:i,"aria-current":n?"page":void 0,"data-testid":y,"data-route":r,onClick:(j)=>{if(!Mp(j))return;j.preventDefault(),_(u,l)}},$)}function Cp({activeModule:u,activeTabs:l,onNavigate:f,collapsed:n,onToggle:i}){return A("aside",{className:`rail ${n?"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:i,"aria-label":n?"展开左侧边栏":"收起左侧边栏","data-testid":"rail-toggle"},n?"»":"«")),F4.map((y)=>{let _=l[y.id]||b3[y.id]||y.tabs[0]?.id||"";return A(MZ,{key:y.id,moduleId:y.id,tabId:_,className:`module ${u===y.id?"active":""}`,active:u===y.id,title:y.label,onNavigate:f},A("span",{className:"module-code"},y.code),A("span",null,y.label))}))}function pp({module:u,activeTab:l,onNavigate:f}){return A("nav",{className:"tabs","aria-label":`${u.label} 子功能`},u.tabs.map((n)=>A(MZ,{key:n.id,moduleId:u.id,tabId:n.id,className:`tab ${l===n.id?"active":""}`,active:l===n.id,onNavigate:f},n.label)))}function mp({data:u,onRaw:l,onNavigate:f}){let n=u.overview||{},i=u.nodes.filter((F)=>F.status==="online"),y=u.pendingTasks||u.tasks.filter(_$),_=n.pendingTaskCount??y.length,$=u.tasks.slice(0,5),r=n.pgdata||{},j=n.microserviceAvailability||{},J=vu(j.totalCount),Q=vu(j.healthyCount),U=vu(j.unhealthyCount);return A("div",{className:"page-grid overview-grid","data-testid":"overview-page"},A(il,{title:"核心指标",eyebrow:"Control"},A("div",{className:"metric-grid"},A(Ll,{label:"数据库",value:n.dbReady?"READY":"WAIT",hint:"PostgreSQL internal network",tone:n.dbReady?"ok":"warn"}),A(Ll,{label:"PGDATA",value:Gf(r.databaseBytes),hint:`${r.volumeName||"unidesk_pgdata_10gb"} / ${r.databasePretty||"--"} / budget ${r.volumeSize||"--"}`,tone:"ok",testId:"pgdata-usage-card"}),A(Ll,{label:"在线节点",value:n.onlineNodeCount??0,hint:`${n.nodeCount??0} registered`,tone:"ok"}),A(Ll,{label:"WebSocket",value:n.activeSocketCount??0,hint:"Provider ingress sockets"}),A(Ll,{label:"用户服务可用",value:J>0?`${Q}/${J}`:"--",hint:J>0?`healthyCount ${Q} · unhealthyCount ${U}`:"strict /health probes",tone:J>0&&U===0?"ok":"warn",testId:"microservice-availability-card"}),A(Ll,{label:"待处理任务",value:_,hint:_>0?"点击查看具体任务":`timeout ${L1(Math.floor((n.taskPendingTimeoutMs??0)/1000))}`,tone:_>0?"warn":"ok",onClick:()=>f("tasks","pending"),testId:"pending-task-card"}))),A(il,{title:"本机 Provider",eyebrow:"Self Connected"},i.length===0?A(zl,{title:"暂无在线节点",text:"provider-gateway 未完成自接入"}):A("div",{className:"node-card-list"},i.slice(0,4).map((F)=>A(xp,{key:F.providerId,node:F,onRaw:l})))),A(il,{title:"待处理任务明细",eyebrow:`${_} Pending`,actions:A("button",{type:"button",className:"ghost-btn",onClick:()=>f("tasks","pending"),"data-testid":"pending-task-detail-link"},"进入任务调度")},y.length===0?A(zl,{title:"当前无待处理",text:"queued / dispatched / running 超时后会自动转为 failed,避免总览长期卡住"}):A("div",{className:"compact-list"},y.slice(0,5).map((F)=>A(zZ,{key:F.id,task:F,onRaw:l})))),A(il,{title:"最近任务",eyebrow:"Dispatch"},$.length===0?A(zl,{title:"暂无任务",text:"可以在任务调度模块发起 docker.ps 或 echo"}):A("div",{className:"compact-list"},$.map((F)=>A(zZ,{key:F.id,task:F,onRaw:l})))))}function xp({node:u,onRaw:l}){return A("article",{className:"node-card"},A("div",{className:"node-card-head"},A("div",null,A("strong",null,u.name),A("code",null,u.providerId)),A(El,{status:u.status})),A("div",{className:"node-version-line"},A(y$,{node:u}),A("span",null,`升级策略 ${Mr(u)}`)),A(bQ,{node:u}),A(PZ,{labels:u.labels,limit:6}),A("div",{className:"node-card-foot"},A("span",null,`心跳 ${Hu(u.lastHeartbeat)}`),A(uf,{title:`Provider ${u.providerId}`,data:u,onOpen:l,testId:`raw-node-${A0(u.providerId)}`})))}function Rp({events:u,onRaw:l}){return A(il,{title:"事件摘要",eyebrow:"Latest 100"},u.length===0?A(zl,{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,u.map((f)=>A("tr",{key:f.id},A("td",null,A("code",null,f.id)),A("td",null,A(El,{status:f.type},f.type)),A("td",null,A("code",null,f.source)),A("td",null,A(Oi,{data:f.payload})),A("td",null,Hu(f.createdAt)),A("td",null,A(uf,{title:`Event ${f.id}`,data:f,onOpen:l}))))))))}function bp({logs:u,onRaw:l}){return A(il,{title:"服务日志",eyebrow:"Core Recent"},u.length===0?A(zl,{title:"暂无日志",text:"backend-core 内存日志会在请求和 provider 事件后出现"}):A("div",{className:"log-list"},u.slice(-80).reverse().map((f,n)=>A("article",{key:n,className:`log-row ${f.level||"info"}`},A("span",null,Hu(f.ts)),A("b",null,f.level||"info"),A("strong",null,f.message||"log"),A(Oi,{data:f.data,empty:"无附加字段"}),A(uf,{title:`Log ${f.message||n}`,data:f,onOpen:l})))))}function kp({nodes:u,onRaw:l}){return A(il,{title:"节点清单",eyebrow:`${u.length} Providers`},u.length===0?A(zl,{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,u.map((f)=>A("tr",{key:f.providerId},A("td",null,A(El,{status:f.status})),A("td",null,A("strong",null,f.name),A("code",null,f.providerId)),A("td",null,A("div",{className:"gateway-cell"},A(y$,{node:f}),A("span",null,Mr(f)))),A("td",null,A(bQ,{node:f})),A("td",null,A(PZ,{labels:f.labels,limit:5})),A("td",null,Hu(f.connectedAt)),A("td",null,Hu(f.lastHeartbeat)),A("td",null,A(uf,{title:`Provider ${f.providerId}`,data:f,onOpen:l,testId:`raw-node-table-${A0(f.providerId)}`}))))))))}function hp({nodes:u}){let l=Cr(()=>{let f=[];for(let n of u)for(let[i,y]of TZ(n.labels))f.push({providerId:n.providerId,name:n.name,key:i,value:y});return f},[u]);return A(il,{title:"资源标签",eyebrow:"Structured Labels"},l.length===0?A(zl,{title:"暂无标签",text:"provider-gateway 注册消息会同步资源标签"}):A("div",{className:"label-matrix"},l.map((f)=>A("article",{key:`${f.providerId}-${f.key}`,className:"label-card"},A("span",null,f.key),A("strong",null,wy(f.value)),A("code",null,f.providerId)))))}function Ip({nodes:u}){return A(il,{title:"心跳状态",eyebrow:"Provider Liveness"},u.length===0?A(zl,{title:"无心跳",text:"等待 provider 注册和 heartbeat"}):A("div",{className:"heartbeat-list"},u.map((l)=>A("article",{key:l.providerId,className:"heartbeat-row"},A("span",{className:`pulse ${l.status}`}),A("div",null,A("strong",null,l.name),A("code",null,l.providerId)),A("div",null,A("span",null,"connected"),A("b",null,Hu(l.connectedAt))),A("div",null,A("span",null,"last heartbeat"),A("b",null,Hu(l.lastHeartbeat)))))))}function vp({nodes:u,systemStatuses:l,tasks:f,onRaw:n,refresh:i}){let[y,_]=du(""),$=Cr(()=>u.map((L)=>{let w=l.find((W)=>W.providerId===L.providerId);return{...L,systemCurrent:w?.current||null,systemHistory:w?.history||[],systemUpdatedAt:w?.updatedAt||null}}),[u,l]),r=$.find((L)=>L.providerId===y)||$[0]||null;if(pn(()=>{if(!y&&$[0])_($[0].providerId)},[$.length,y]),!r)return A(zl,{title:"暂无资源监控",text:"等待 provider 上报 CPU、内存和硬盘指标"});let j=r.systemCurrent,J=r.systemHistory||[],Q=j?.cpu||{},U=j?.memory||{},F=j?.disk||{},N=J.length>0?J:j?[{at:j.collectedAt,cpuPercent:vu(Q.percent),memoryPercent:vu(U.percent),diskPercent:vu(F.percent)}]:[];return A("div",{className:"monitor-page","data-testid":"node-monitor-page"},A("div",{className:"docker-node-strip"},$.map((L)=>A("button",{key:L.providerId,type:"button",className:`docker-node-tile ${r.providerId===L.providerId?"active":""}`,onClick:()=>_(L.providerId)},A("span",{className:`pulse ${L.status}`}),A("strong",null,L.name),A("code",null,L.providerId),A("span",null,L.systemCurrent?`CPU ${Ei(L.systemCurrent.cpu?.percent)} / MEM ${Ei(L.systemCurrent.memory?.percent)}`:"等待指标")))),A("div",{className:"monitor-layout"},A(il,{title:"任务管理器视图",eyebrow:r.name,className:"monitor-main-panel",actions:j?A(uf,{title:`System ${r.providerId}`,data:{current:j,history:J},onOpen:n}):null},!j?A(zl,{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,r.name),A("div",{className:"docker-meta"},A("span",null,`${Q.cores||0} CPU cores`),A("span",null,`load ${vu(Q.load1).toFixed(2)} / ${vu(Q.load5).toFixed(2)} / ${vu(Q.load15).toFixed(2)}`),A("span",null,`memory actual ${Gf(U.usedBytes)} / ${Gf(U.totalBytes)}`),A("span",null,`disk ${Gf(F.usedBytes)} / ${Gf(F.totalBytes)}`))),A(El,{status:j.ok?"online":"warn"},j.ok?"METRICS READY":"METRICS DEGRADED")),A("div",{className:"monitor-chart-grid"},A(MQ,{title:"CPU",metricKey:"cpuPercent",current:Q.percent,points:N,detail:`${Q.cores||0} cores / load ${vu(Q.load1).toFixed(2)}`,tone:"cpu",testId:"metric-chart-cpu"}),A(MQ,{title:"Memory",metricKey:"memoryPercent",current:U.percent,points:N,detail:`${Gf(U.usedBytes)} actual / ${Gf(U.cacheBytes)} cache excluded`,tone:"memory",testId:"metric-chart-memory"}),A(MQ,{title:"Disk",metricKey:"diskPercent",current:F.percent,points:N,detail:`${F.path||"/"} mounted ${F.mount||"--"}`,tone:"disk",testId:"metric-chart-disk"})),A("div",{className:"monitor-summary-grid"},A(Ll,{label:"CPU 当前",value:Ei(Q.percent),hint:`history ${N.length} samples`,tone:"ok"}),A(Ll,{label:"实际内存",value:Gf(U.usedBytes),hint:`${Ei(U.percent)} 不含缓存`}),A(Ll,{label:"硬盘已用",value:Gf(F.usedBytes),hint:Ei(F.percent)}),A(Ll,{label:"更新时间",value:Hu(r.systemUpdatedAt||j.collectedAt),hint:r.providerId})),A(gp,{current:j,onRaw:n}))),A("div",{className:"monitor-side-stack"},A(fm,{provider:r,refresh:i,onRaw:n}),A(nm,{provider:r,tasks:f,onRaw:n,limit:5}),A(il,{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、实际内存 PSS、RSS、线程数和磁盘 I/O 速率;PSS 不重复计算共享内存,表格默认按内存占用降序")))))))}function CZ(u){return vu(u.memoryBytes,vu(u.pssBytes,vu(u.rssBytes)))}function qZ(u,l){if(l==="memory")return CZ(u);if(l==="cpu")return vu(u.cpuPercent);if(l==="disk")return vu(u.readBytesPerSecond)+vu(u.writeBytesPerSecond);if(l==="pid")return vu(u.pid);if(l==="threads")return vu(u.threads);if(l==="runtime")return vu(u.elapsedSeconds);if(l==="user")return String(u.user||"");return String(u.name||u.command||"")}function LZ({value:u,label:l,tone:f}){let n=Math.max(1,Math.min(100,vu(u)));return A("div",{className:`process-meter ${f||""}`},A("span",{style:{width:`${n}%`}}),A("b",null,l))}function gp({current:u,onRaw:l}){let[f,n]=du({key:"memory",direction:"desc"}),i=Hi.default.useContext(pQ),y=u?.processSummary&&typeof u.processSummary==="object"?u.processSummary:{},_=Array.isArray(u?.processes)?u.processes:[],$=String(y.memoryMode||""),r=$.includes("pss_smaps_rollup")?"PSS":$==="rss_minus_shared_fallback"?"RSS-shared":"RSS fallback",j=Cr(()=>{let Q=f.direction==="asc"?1:-1;return[..._].sort((U,F)=>{let N=qZ(U,f.key),L=qZ(F,f.key);if(typeof N==="string"||typeof L==="string")return String(N).localeCompare(String(L),"zh-CN")*Q;return(N-L)*Q||vu(U.pid)-vu(F.pid)})},[_,f.key,f.direction]),J=(Q,U)=>{let F=f.key===U,N=F?f.direction==="asc"?"ascending":"descending":"none";return A("th",{"aria-sort":N},A("button",{type:"button",className:`process-sort-button ${F?"active":""}`,"data-testid":`process-sort-${U}`,onClick:()=>n((L)=>({key:U,direction:L.key===U&&L.direction==="desc"?"asc":"desc"}))},Q,A("span",null,F?f.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(nl,{title:"进程资源占用",level:3,loading:i})),A("div",{className:"process-resource-actions"},A("span",{className:"data-chip"},"默认按内存排序"),A("span",{className:"data-chip"},`内存口径 ${r}`),A("span",{className:"data-chip"},`${vu(y.visible,j.length)} / ${vu(y.total,j.length)} 进程`),A(uf,{title:"Process Resource Snapshot",data:{processSummary:y,processes:_},onOpen:l,testId:"raw-process-resources"}))),j.length===0?A(zl,{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,"PSS / RSS"),J("磁盘 I/O","disk"),J("线程","threads"),J("运行时长","runtime"))),A("tbody",null,j.map((Q)=>{let U=vu(Q.readBytesPerSecond)+vu(Q.writeBytesPerSecond),F=CZ(Q);return A("tr",{key:`${Q.pid}-${Q.startedAt}`,"data-testid":`process-row-${A0(Q.pid)}`,"data-memory-bytes":String(F),"data-cpu-percent":String(vu(Q.cpuPercent)),"data-disk-bps":String(U),"data-pid":String(vu(Q.pid))},A("td",null,A("div",{className:"process-name-cell"},A("strong",null,Q.name||"--"),A("span",{className:"process-command"},Q.command||"--"))),A("td",null,A("code",null,Q.pid||"--")),A("td",null,Q.user||`uid:${Q.uid??"--"}`),A("td",null,A("span",{className:`process-state state-${A0(Q.state||"unknown")}`},Q.state||"?")),A("td",null,A(LZ,{value:Q.cpuPercent,label:Op(Q.cpuPercent),tone:"cpu"})),A("td",null,A(LZ,{value:Q.memoryPercent,label:Ei(Q.memoryPercent),tone:"memory"})),A("td",null,A("div",{className:"process-io-cell"},A("strong",null,Gf(F)),A("span",null,`RSS ${Gf(Q.rssBytes)}`))),A("td",null,A("div",{className:"process-io-cell"},A("strong",null,PQ(U)),A("span",null,`R ${PQ(Q.readBytesPerSecond)} / W ${PQ(Q.writeBytesPerSecond)}`))),A("td",null,Q.threads||0),A("td",null,L1(vu(Q.elapsedSeconds))))})))))}function MQ({title:u,metricKey:l,current:f,points:n,detail:i,tone:y,testId:_}){let $=n.map((U)=>Math.max(0,Math.min(100,vu(U[l])))),r=$.length>1?$:[$[0]||0,$[0]||0],j=r.length<=1?100:100/(r.length-1),J=r.map((U,F)=>`${(F*j).toFixed(2)},${(46-U*0.42).toFixed(2)}`).join(" "),Q=`0,48 ${J} 100,48`;return A("article",{className:`metric-chart ${y}`,"data-testid":_},A("div",{className:"metric-chart-head"},A("div",null,A("span",null,u),A("strong",null,Ei(f))),A("code",null,`${n.length} pts`)),A("svg",{viewBox:"0 0 100 48",preserveAspectRatio:"none",role:"img","aria-label":`${u} usage curve`},A("polygon",{points:Q}),A("polyline",{points:J}),A("line",{x1:"0",x2:"100",y1:"24",y2:"24"})),A("div",{className:"metric-chart-foot"},A("span",null,"0%"),A("span",null,i),A("span",null,"100%")))}function K1(u){return Array.isArray(u)?u:[]}function sp(u){let l=K1(u?.core?.requests?.componentSummary);return[...K1(u?.frontend?.requests?.componentSummary),...l].sort((n,i)=>vu(i.requestCount)-vu(n.requestCount))}function ap(u){let l=K1(u?.core?.operations?.summary);return[...K1(u?.frontend?.operations?.summary),...l].sort((n,i)=>vu(i.count)-vu(n.count))}function op(u){let l=K1(u?.core?.requests?.recentFailures).map((n)=>({source:"backend",...n}));return[...K1(u?.frontend?.requests?.recentFailures).map((n)=>({source:"frontend",...n})),...l].sort((n,i)=>(mn(i.at)??0)-(mn(n.at)??0)).slice(0,20)}function dp(u){let l=K1(u?.core?.operations?.recentSlowOperations);return[...K1(u?.frontend?.operations?.recentSlowOperations),...l].sort((n,i)=>vu(i.durationMs)-vu(n.durationMs)).slice(0,20)}function ep(u){let l=performance.memory,f=Number(l?.usedJSHeapSize);if(Number.isFinite(f)&&f>0)return f;let n=Number(u?.appBundleBytes);if(Number.isFinite(n)&&n>0)return n;return vu(u?.process?.heapUsedBytes)}function um({points:u}){let l=K1(u),f=l.map((U)=>vu(U.mb)),n=Math.max(1,...f),i=Math.max(0,Math.min(...f,0)),y=Math.max(1,n-i),_=l.length>1?l:[...l,...l],$=_.length<=1?100:100/(_.length-1),r=_.map((U,F)=>{let N=vu(U.mb);return`${(F*$).toFixed(2)},${(48-(N-i)/y*42).toFixed(2)}`}).join(" "),j=`0,50 ${r} 100,50`,J=l.at(-1),Q=l[0];return A("article",{className:"performance-memory-card","data-testid":"performance-memory-chart"},A("div",{className:"performance-memory-head"},A("strong",null,`Bwebui: ${J?`${vu(J.mb).toFixed(1)}MB`:"--"}`),A("span",null,l.length>0?`${l.length} samples`:"等待采样")),A("svg",{viewBox:"0 0 100 50",preserveAspectRatio:"none",role:"img","aria-label":"Bwebui memory trend"},A("polygon",{points:j}),A("polyline",{points:r}),A("line",{x1:"0",x2:"100",y1:"25",y2:"25"})),A("div",{className:"performance-axis-row"},A("span",null,Q?Al(new Date(Q.at)):"--"),A("span",null,"时间"),A("span",null,J?Al(new Date(J.at)):"--")),A("div",{className:"performance-axis-row"},A("span",null,`${i.toFixed(1)}`),A("span",null,"(MB)"),A("span",null,`${n.toFixed(1)}`)))}function lm({onRaw:u}){let[l,f]=du({core:null,frontend:null}),[n,i]=du([]),[y,_]=du(""),[$,r]=du(!1),[j,J]=du(null),[Q,U]=du(!1);async function F(){r(!0),_("");try{let[t,m]=await Promise.all([Zu(`${su.apiBaseUrl}/performance`,{cache:"no-store"}),Zu(`${su.apiBaseUrl}/frontend-performance`,{cache:"no-store"})]);f({core:t,frontend:m});let V=ep(m);i((D)=>[...D,{at:new Date().toISOString(),mb:V/1048576}].slice(-80))}catch(t){_(cu(t,"性能指标加载失败"))}finally{r(!1)}}pn(()=>{F();let t=setInterval(()=>void F(),5000);return()=>clearInterval(t)},[]);async function N(){U(!0),_(""),J(null);try{let t=await Zu(`${su.apiBaseUrl}/code-queue-load-test`,{method:"POST",body:JSON.stringify({targetMs:1000,timeoutMs:90000,url:su.frontendPublicUrl||window.location.origin})});J(t),F()}catch(t){_(cu(t,"Code Queue Playwright 测量失败"))}finally{U(!1)}}let L=sp(l),w=op(l),W=ap(l),K=dp(l),q=l.core?.process||{},z=l.frontend?.process||{},Z=l.core?.database?.codeQueueStorage||{},T=vu(Z.total),c=j?.result||{},X=vu(c.wallMs,NaN),S=vu(c.networkIdleMs,NaN),p=c.withinTarget===!0,Y=Q?"running":j===null?"idle":j.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(nl,{title:"性能面板",loading:$||Q}),A("p",null,"按组件统计 HTTP 请求、失败率、P95 延迟,并汇总 backend/frontend 内部操作耗时。")),A("div",{className:"inline-actions"},A("button",{type:"button",className:"ghost-btn",onClick:()=>void N(),disabled:Q,"data-testid":"code-queue-load-test-button"},Q?"测试中...":"测试 Code Queue 加载"),A("button",{type:"button",className:"ghost-btn",onClick:()=>void F(),disabled:$,"data-testid":"performance-refresh-button"},$?"刷新中":"刷新"),A(uf,{title:"Performance Snapshot",data:l,onOpen:u,testId:"raw-performance"}))),A(ul,{error:y}),A("div",{className:"performance-top-grid"},A(um,{points:n}),A("div",{className:"performance-metric-stack"},A(Ll,{label:"backend RSS",value:Gf(q.rssBytes),hint:`heap ${Gf(q.heapUsedBytes)}`}),A(Ll,{label:"frontend RSS",value:Gf(z.rssBytes),hint:`bundle ${Gf(l.frontend?.appBundleBytes)}`}),A(Ll,{label:"Codex PG 任务",value:T||"--",hint:Z.ok?"unidesk_code_queue_tasks":"等待表初始化",tone:Z.ok?"ok":"warn"}),A(Ll,{label:"请求样本",value:vu(l.core?.requests?.sampleCount)+vu(l.frontend?.requests?.sampleCount),hint:"rolling window 3000"}))),A(il,{title:"Code Queue 加载基准",eyebrow:"Playwright / target <1s",className:"codex-load-test-panel",loading:Q,actions:A("div",{className:"panel-actions"},A("button",{type:"button",className:"primary-btn",onClick:()=>void N(),disabled:Q,"data-testid":"code-queue-load-test-panel-button"},Q?"正在运行 Playwright...":"手动触发测试"),j?A(uf,{title:"Code Queue Load Test",data:j,onOpen:u,testId:"raw-code-queue-load-test"}):null)},A("div",{className:"codex-load-test-grid","data-testid":"code-queue-load-test-result"},A(Ll,{label:"总耗时",value:Q?"运行中":Number.isFinite(X)?O0(X):"--",hint:j===null?"点击按钮启动远端 Playwright":`目标 ${O0(c.targetMs||1000)} / ${c.url||"Code Queue"}`,tone:Y==="passed"?"ok":Y==="failed"||Y==="slow"?"warn":""}),A(Ll,{label:"判定",value:Q?"RUNNING":Y==="passed"?"PASS <1s":Y==="slow"?"SLOW":Y==="failed"?"FAILED":"--",hint:j?.measurementOk===!1?String(j.error||c.error||"measurement failed").slice(0,120):"导航开始 -> DOMContentLoaded -> data-load-state=complete",tone:Y==="passed"?"ok":Y==="idle"||Y==="running"?"":"fail"}),A(Ll,{label:"Network idle",value:Number.isFinite(S)?O0(S):"--",hint:`DOMContentLoaded ${O0(c.domContentLoadedMs)} / ${c.networkIdleReached===!1?"未在 5s 内空闲":"已空闲"}`,tone:Number.isFinite(S)&&S<=1000?"ok":"warn"}),A(Ll,{label:"组件耗时",value:Number.isFinite(vu(c.componentLoadMs,NaN))?O0(c.componentLoadMs):"--",hint:`queue ${O0(c.queueMs)} / detail ${O0(c.detailMs)}`,tone:vu(c.componentLoadMs)>1000?"warn":"ok"}),A(Ll,{label:"Trace 规模",value:Number.isFinite(vu(c.transcriptRows,NaN))?String(c.transcriptRows):"--",hint:`${c.visibleTaskCount??0} visible tasks / ${c.partial?"preview":"complete"}`})),Q?A("div",{className:"performance-empty-line"},"正在通过 main-server Host SSH 启动 Playwright,完成后会显示 wall time、组件耗时和最慢 API。"):null,j&&Array.isArray(c.slowestApi)&&c.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((t)=>A("th",{key:t},t)))),A("tbody",null,c.slowestApi.slice(0,5).map((t,m)=>A("tr",{key:`${t.url}-${m}`},A("td",null,A("code",null,t.url)),A("td",null,t.status),A("td",null,O0(t.durationMs))))))):null),A("div",{className:"performance-grid"},A(il,{title:"组件汇总",eyebrow:"Requests",loading:$},L.length===0?A(zl,{title:"暂无请求样本",text:"刷新几次或打开页面后会自动形成组件统计"}):A("div",{className:"table-wrap performance-table-wrap"},A("table",{className:"performance-table"},A("thead",null,A("tr",null,["组件","请求数","失败数","失败率","平均延迟","P95"].map((t)=>A("th",{key:t},t)))),A("tbody",null,L.map((t)=>A("tr",{key:t.component},A("td",null,A("code",null,t.component)),A("td",null,t.requestCount),A("td",null,t.failureCount),A("td",null,Ei(vu(t.failureRate)*100)),A("td",null,O0(t.averageLatencyMs)),A("td",null,O0(t.p95LatencyMs)))))))),A(il,{title:"最近失败请求",eyebrow:"Failures",loading:$},w.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((t)=>A("th",{key:t},t)))),A("tbody",null,w.map((t,m)=>A("tr",{key:`${t.at}-${m}`},A("td",null,Hu(t.at)),A("td",null,t.source),A("td",null,A("code",null,t.component)),A("td",null,A(El,{status:"failed"},t.status)),A("td",null,A("code",null,t.path)))))))),A(il,{title:"内部操作汇总",eyebrow:"Operations",loading:$},W.length===0?A(zl,{title:"暂无内部操作样本",text:"API 查询和代理请求会自动记录内部操作耗时"}):A("div",{className:"table-wrap performance-table-wrap"},A("table",{className:"performance-table"},A("thead",null,A("tr",null,["服务","操作","次数","平均延迟","P95"].map((t)=>A("th",{key:t},t)))),A("tbody",null,W.map((t)=>A("tr",{key:`${t.service}-${t.operation}`},A("td",null,t.service),A("td",null,A("code",null,t.operation)),A("td",null,t.count),A("td",null,O0(t.averageLatencyMs)),A("td",null,O0(t.p95LatencyMs)))))))),A(il,{title:"最近慢操作",eyebrow:"Slowest",loading:$},K.length===0?A(zl,{title:"暂无慢操作",text:"后端会记录最近窗口内耗时最高的内部操作"}):A("div",{className:"table-wrap performance-table-wrap"},A("table",{className:"performance-table"},A("thead",null,A("tr",null,["时间","操作","耗时","结果","细节"].map((t)=>A("th",{key:t},t)))),A("tbody",null,K.map((t,m)=>A("tr",{key:`${t.at}-${t.operation}-${m}`},A("td",null,Hu(t.at)),A("td",null,A("code",null,t.operation)),A("td",null,O0(t.durationMs)),A("td",null,t.ok?"成功":"失败"),A("td",null,t.detail||"-")))))))))}function fm({provider:u,refresh:l,onRaw:f}){let[n,i]=du(""),[y,_]=du(null),[$,r]=du("");async function j(J){i(J),r("");try{let Q=await Zu(`${su.apiBaseUrl}/dispatch`,{method:"POST",body:JSON.stringify({providerId:u.providerId,command:"provider.upgrade",payload:{mode:J,source:"frontend-resource-monitor",requestedAt:new Date().toISOString()}})});_({mode:J,...Q}),await l()}catch(Q){r(cu(Q,"升级命令下发失败"))}finally{i("")}}return A(il,{title:"Provider Gateway 升级",eyebrow:"Remote Control",loading:Boolean(n)},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,u.providerId),A(y$,{node:u})),A("div",{className:"upgrade-actions"},A("button",{type:"button",className:"ghost-btn",disabled:Boolean(n),onClick:()=>j("plan"),"data-testid":"upgrade-plan-button"},n==="plan"?"预检中":"预检升级"),A("button",{type:"button",className:"ghost-btn danger",disabled:Boolean(n),onClick:()=>j("schedule"),"data-testid":"upgrade-schedule-button"},n==="schedule"?"调度中":"执行升级")),A(ul,{error:$}),y?A("div",{className:"upgrade-result"},A(El,{status:y.status||"queued"},y.status||"queued"),A("span",null,`${y.mode==="schedule"?"执行升级":"预检升级"} 已下发`),A("span",null,`指定版本 ${RQ(VZ(u))}`),A("code",null,y.taskId||"--"),A(uf,{title:"Provider Upgrade Dispatch",data:y,onOpen:f})):A("span",{className:"muted"},"升级任务结果会进入任务历史;执行升级可能导致 provider 短暂重连。")))}function pZ({records:u,onRaw:l,compact:f=!1}){if(u.length===0)return A(zl,{title:"暂无远程更新记录",text:"该节点还没有 provider.upgrade 任务;执行预检或升级后会在这里形成结构化记录"});return A("div",{className:`upgrade-record-table-wrap table-wrap ${f?"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,u.map((n)=>A("tr",{key:n.id,"data-testid":`gateway-upgrade-record-${A0(n.id)}`},A("td",null,A(El,{status:n.status})),A("td",null,A("span",{className:`mode-chip ${kA(n)}`},kA(n)==="schedule"?"执行升级":"预检")),A("td",null,A("strong",null,"provider.upgrade"),A("code",null,n.id)),A("td",null,cp(n)),A("td",null,A(xZ,{task:n})),A("td",null,Xp(n)),A("td",null,A("span",{className:"version-chip"},YZ(n))),A("td",null,A("span",{className:`upgrade-outcome ${String(n.status||"").toLowerCase()}`},tZ(n))),A("td",null,Hu(n.updatedAt)),A("td",null,A(uf,{title:`Provider Upgrade Task ${n.id}`,data:pr(n),onOpen:l})))))))}function nm({provider:u,tasks:l,onRaw:f,limit:n=5}){let i=DZ(l,u.providerId).slice(0,n);return A(il,{title:"远程更新记录",eyebrow:u.providerId,actions:A(y$,{node:u}),className:"provider-upgrade-records-panel"},A("div",{"data-testid":`provider-upgrade-records-${A0(u.providerId)}`},A(pZ,{records:i,onRaw:f,compact:!0})))}function im({nodes:u,tasks:l,onRaw:f}){let n=Cr(()=>u.map((y)=>{let _=DZ(l,y.providerId);return{node:y,records:_,latest:Yp(_),capabilities:BZ(y)}}),[u,l]),i=n.reduce((y,_)=>y+_.records.length,0);return A("div",{className:"gateway-page","data-testid":"gateway-version-page"},A(il,{title:"Provider Gateway 版本",eyebrow:`${u.length} Providers / ${i} 更新记录`},u.length===0?A(zl,{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,n.map((y)=>A("tr",{key:y.node.providerId},A("td",null,A(El,{status:y.node.status})),A("td",null,A("strong",null,y.node.name),A("code",null,y.node.providerId)),A("td",null,A(y$,{node:y.node})),A("td",null,Mr(y.node)),A("td",null,A(bQ,{node:y.node})),A("td",null,UZ(y.node)?Hu(UZ(y.node)):"待新版上报"),A("td",null,A("div",{className:"capability-row"},y.capabilities.length===0?A("span",{className:"muted"},"未声明"):y.capabilities.slice(0,5).map((_)=>A("span",{key:_,className:"data-chip"},_)))),A("td",null,y.latest?A("div",{className:"latest-upgrade-cell"},A(El,{status:y.latest.status}),A("span",null,`${kA(y.latest)==="schedule"?"执行升级":"预检"} / ${Hu(y.latest.updatedAt)}`),A("small",null,`Gateway ${YZ(y.latest)}`),A("small",null,tZ(y.latest))):A("span",{className:"muted"},"暂无记录")),A("td",null,A(uf,{title:`Provider ${y.node.providerId}`,data:y.node,onOpen:f})))))))),A(il,{title:"远程更新记录",eyebrow:"Structured provider.upgrade records"},u.length===0?A(zl,{title:"暂无记录",text:"没有 provider 节点时不会生成远程更新记录"}):A("div",{className:"gateway-record-grid"},n.map((y)=>A("article",{key:y.node.providerId,className:"gateway-record-card","data-testid":`gateway-records-${A0(y.node.providerId)}`},A("div",{className:"gateway-record-head"},A("div",null,A("strong",null,y.node.name),A("code",null,y.node.providerId)),A(y$,{node:y.node})),A("div",{className:"gateway-record-meta"},A("span",null,`心跳 ${Hu(y.node.lastHeartbeat)}`),A("span",null,`策略 ${Mr(y.node)}`),A("span",null,`${y.records.length} 条记录`)),A(pZ,{records:y.records.slice(0,8),onRaw:f,compact:!0}))))))}function ym(u){if(u==="running")return"online";if(u==="paused"||u==="restarting")return"warn";if(u==="exited"||u==="dead")return"offline";return"internal"}function mZ(u){return/^[a-f0-9]{48,64}$/i.test(u)}function Pr(u){let l=String(u?.name||""),f=String(u?.labels||"");return l==="unidesk_pgdata_10gb"||f.includes("com.docker.compose.volume=unidesk_pgdata_10gb")||l.toLowerCase().includes("pgdata")}function KZ(u){let l=String(u?.name||""),f=String(u?.labels||"");if(Pr(u))return 0;if(f.includes("com.docker.compose.project=unidesk"))return 1;if(!mZ(l))return 2;return 3}function _m(u){return[...u].sort((l,f)=>{let n=KZ(l)-KZ(f);if(n!==0)return n;return String(l.name||"").localeCompare(String(f.name||""))})}function $m({nodes:u,dockerStatuses:l,onRaw:f}){let[n,i]=du(""),y=Cr(()=>u.map((K)=>{let q=l.find((z)=>z.providerId===K.providerId);return{...K,dockerStatus:q?.dockerStatus||null,dockerUpdatedAt:q?.updatedAt||null}}),[u,l]),_=y.find((K)=>K.providerId===n)||y[0]||null;if(pn(()=>{if(!n&&y[0])i(y[0].providerId)},[y.length,n]),!_)return A(zl,{title:"暂无 Docker 节点",text:"等待 provider 上报 Docker daemon 状态"});let $=_.dockerStatus,r=_.providerId==="main-server",j=$?.counts||{},J=$?.daemon||{},Q=$?.containers||[],U=$?.images||[],F=_m($?.volumes||[]),N=r?F.find(Pr):null,L=$?.networks||[],w=Q.filter((K)=>K.state==="running"),W=Q.filter((K)=>K.state!=="running");return A("div",{className:"docker-page","data-testid":"docker-status-page"},A("div",{className:"docker-node-strip"},y.map((K)=>A("button",{key:K.providerId,type:"button",className:`docker-node-tile ${_.providerId===K.providerId?"active":""}`,onClick:()=>i(K.providerId)},A("span",{className:`pulse ${K.status}`}),A("strong",null,K.name),A("code",null,K.providerId),A("span",null,K.dockerStatus?`Docker ${K.dockerStatus.ok?"ready":"degraded"}`:"等待上报")))),A("div",{className:"docker-layout"},A(il,{title:"Docker Desktop 视图",eyebrow:_.name,className:"docker-main-panel",actions:$?A(uf,{title:`Docker ${_.providerId}`,data:$,onOpen:f}):null},!$?A(zl,{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,J.name||_.providerId),A("div",{className:"docker-meta"},A("span",null,J.serverVersion?`Engine ${J.serverVersion}`:"Engine --"),A("span",null,J.operatingSystem||"OS --"),A("span",null,J.architecture||"arch --"),A("span",null,`${J.cpus||0} CPU / ${Gf(J.memoryBytes)}`))),A(El,{status:$.ok?"online":"warn"},$.ok?"Docker Ready":"Docker Degraded")),A("div",{className:"docker-metrics"},A(Ll,{label:"Containers",value:j.containers??Q.length,hint:`${j.running??w.length} running / ${j.stopped??W.length} stopped`,tone:"ok"}),A(Ll,{label:"Images",value:j.images??U.length,hint:`${j.daemonImages??j.images??U.length} daemon images`}),A(Ll,{label:"Volumes",value:j.volumes??F.length,hint:r?N?"database volume visible":"database volume missing":"node local volumes",tone:N?"ok":""}),A(Ll,{label:"Networks",value:j.networks??L.length,hint:J.driver?`driver ${J.driver}`:"docker networks"})),r?A(rm,{volume:N,volumeCount:F.length}):null,A("div",{className:"docker-section-head"},A("h3",null,"Containers"),A("span",null,`updated ${Hu(_.dockerUpdatedAt||$.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("th",null,"PID"),A("th",null,"大小"))),A("tbody",null,Q.length===0?A("tr",null,A("td",{colSpan:8},"暂无容器")):Q.map((K)=>A("tr",{key:`${K.id}-${K.name}`},A("td",null,A(El,{status:ym(K.state)},K.state||"unknown")),A("td",null,A("strong",null,K.name||"--"),A("code",null,K.id||"--")),A("td",null,K.image||"--"),A("td",null,K.ports||A("span",{className:"muted"},"未发布")),A("td",null,K.runningFor||K.status||"--"),A("td",null,K.restartPolicy?A(El,{status:K.restartPolicy==="always"?"online":"warn"},K.restartPolicy):"--"),A("td",null,K.pidMode?A("code",null,K.pidMode):"--"),A("td",null,K.size||"--")))))))),A("div",{className:"docker-side-stack"},A(CQ,{title:"Images",items:U,render:(K)=>A("article",{key:`${K.id}-${K.repository}`,className:"docker-side-row"},A("strong",null,`${K.repository}:${K.tag}`),A("span",null,K.size||"--"),A("code",null,K.id||"--"))}),A(CQ,{title:"Volumes",items:F,limit:F.length,render:(K)=>A("article",{key:K.name,className:`docker-side-row volume-row ${r&&Pr(K)?"database-volume":""}`,"data-testid":r&&Pr(K)?"database-volume-row":void 0},A("strong",null,K.name),A("span",null,r&&Pr(K)?"PostgreSQL":mZ(String(K.name||""))?"anonymous":"named"),A("code",null,K.mountpoint||K.driver||K.scope||"--"))}),A(CQ,{title:"Networks",items:L,render:(K)=>A("article",{key:K.id||K.name,className:"docker-side-row"},A("strong",null,K.name),A("span",null,K.driver||"--"),A("code",null,K.id||"--"))}))))}function rm({volume:u,volumeCount:l}){return A("section",{className:`docker-volume-focus ${u?"ready":"missing"}`,"data-testid":"database-volume-card"},A("div",{className:"volume-focus-head"},A("span",{className:"panel-eyebrow"},"Database Named Volume"),A(El,{status:u?"online":"warn"},u?"FOUND":"MISSING")),u?A("div",{className:"volume-focus-body"},A("strong",null,u.name),A("span",null,"PostgreSQL data volume for unidesk-database"),A("div",{className:"volume-route"},A("code",null,u.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 ${u.driver||"--"}`),A("span",null,`scope ${u.scope||"--"}`),A("span",null,`${l} volumes reported`))):A("div",{className:"volume-focus-body"},A("strong",null,"unidesk_pgdata_10gb"),A("span",null,"当前 Docker 快照没有发现数据库命名卷;请检查 provider-gateway 的 Docker volume 上报。")))}function CQ({title:u,items:l,render:f,limit:n}){let i=l.slice(0,n??12),y=Math.max(0,l.length-i.length);return A(il,{title:u,eyebrow:`${l.length} items`,className:"docker-side-panel"},l.length===0?A(zl,{title:`暂无 ${u}`,text:"等待 Docker 状态采集"}):A("div",{className:"docker-side-list"},i.map(f),y>0?A("div",{className:"docker-side-more"},`+ ${y} more`):null))}function Am({microservices:u,onRaw:l,onNavigate:f}){let n=u.filter((i)=>FZ(i).public===!1);return A("div",{className:"microservice-page","data-testid":"microservice-catalog-page"},A(il,{title:"用户服务目录",eyebrow:"Provider Mounted User Services"},A("div",{className:"metric-grid"},A(Ll,{label:"服务总数",value:u.length,hint:"config.json 用户服务登记"}),A(Ll,{label:"私有后端",value:n.length,hint:"不直接暴露公网",tone:"ok"}),A(Ll,{label:"D601 服务",value:u.filter((i)=>i.providerId==="D601").length,hint:"compute-node docker"}),A(Ll,{label:"集成前端",value:u.filter((i)=>i.frontend?.integrated).length,hint:"UniDesk React 页面"}))),A(il,{title:"外部静态入口",eyebrow:"External Link"},A("div",{className:"endpoint-list hwlab-entry-list"},A("article",{className:"hwlab-entry-card","data-testid":"hwlab-entry-card"},A("b",null,"HWLAB"),A("span",null,yy),A("span",null,"external static link"),A("div",{className:"microservice-actions hwlab-entry-actions"},A("button",{type:"button",className:"ghost-btn","data-testid":"hwlab-open-current-from-catalog",onClick:()=>window.location.assign(yy)},"当前窗口"),A("a",{className:"ghost-btn",href:yy,target:"_blank",rel:"noreferrer","data-testid":"hwlab-open-new-from-catalog"},"新窗口")))),A("p",{className:"muted paragraph"},"该入口仅用于外部静态跳转,不会进入 microservice health、proxy 或运行态探测。")),A(il,{title:"服务映射",eyebrow:"Repo Reference + Runtime"},u.length===0?A(zl,{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,u.map((i)=>{let y=SZ(i),_=tp(i),$=FZ(i),r=y.availability||{},j=r.status||(y.providerStatus==="online"?"unknown":"unhealthy");return A("tr",{key:i.id,"data-testid":`microservice-row-${A0(i.id)}`},A("td",null,A("strong",null,i.name),A("code",null,i.id)),A("td",null,A("strong",null,y.providerName||i.providerId),A("code",null,i.providerId)),A("td",null,A("span",null,_.url||"--"),A("code",null,_.commitId||"--")),A("td",null,A("span",null,_.composeFile||"--"),A("code",null,`${_.composeService||"--"} / ${_.containerName||"--"}`)),A("td",null,A(El,{status:$.public?"warn":"online"},$.public?"public":"private"),A("code",null,`${$.nodeBindHost||"--"}:${$.nodePort||"--"} -> ${$.proxyMode||"--"}`)),A("td",null,A("span",null,i.development?.sshPassthrough?"SSH 透传":"未配置"),A("code",null,i.development?.worktreePath||"--")),A("td",null,A(El,{status:j==="healthy"?"online":j==="unknown"?"warn":"failed"},j),A("span",null,r.reason||y.providerStatus||"unknown"),A(Oi,{data:y.container,empty:"容器快照未上报"})),A("td",null,A("div",{className:"microservice-actions"},i.id==="findjob"?A("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","findjob"),"data-testid":"open-findjob-button"},"打开"):null,i.id==="pipeline"?A("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","pipeline"),"data-testid":"open-pipeline-button"},"打开"):null,i.id==="todo-note"?A("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","todo-note"),"data-testid":"open-todo-note-button"},"打开"):null,i.id==="met-nonlinear"?A("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","met-nonlinear"),"data-testid":"open-met-nonlinear-button"},"打开"):null,i.id==="claudeqq"?A("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","claudeqq"),"data-testid":"open-claudeqq-button"},"打开"):null,i.id==="baidu-netdisk"?A("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","baidu-netdisk"),"data-testid":"open-baidu-netdisk-button"},"打开"):null,i.id==="oa-event-flow"?A("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","oa-event-flow"),"data-testid":"open-oa-event-flow-button"},"打开"):null,i.id==="k3sctl-adapter"?A("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","k3sctl"),"data-testid":"open-k3sctl-button"},"打开"):null,i.id==="code-queue"?A("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","code-queue"),"data-testid":"open-code-queue-button"},"打开"):null,i.id==="mdtodo"?A("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","mdtodo"),"data-testid":"open-mdtodo-button"},"打开"):null,i.id==="decision-center"?A("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","decision-center"),"data-testid":"open-decision-center-button"},"打开"):null,i.id==="project-manager"?A("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","project-manager"),"data-testid":"open-project-manager-button"},"打开"):null,A(uf,{title:`用户服务 ${i.id}`,data:i,onOpen:l}))))}))))))}function jm({nodes:u,onDispatched:l,onRaw:f}){let n=u.filter((Y)=>Y.status==="online"),[i,y]=du(n[0]?.providerId||u[0]?.providerId||""),[_,$]=du("docker.ps"),[r,j]=du("frontend"),[J,Q]=du("operator-check"),[U,F]=du("normal"),[N,L]=du(!1),[w,W]=du(""),[K,q]=du(!1),[z,Z]=du(null),[T,c]=du("");pn(()=>{if(!i&&(n[0]?.providerId||u[0]?.providerId))y(n[0]?.providerId||u[0].providerId)},[u.length,n.length,i]);function X(){return{source:r,note:J,priority:U}}function S(){W(JSON.stringify(X(),null,2)),L(!0)}async function p(Y){Y.preventDefault(),q(!0),c("");try{let t=N?JSON.parse(w||"{}"):X(),m=await Zu(`${su.apiBaseUrl}/dispatch`,{method:"POST",body:JSON.stringify({providerId:i,command:_,payload:t})});Z(m),await l()}catch(t){c(cu(t,"下发失败"))}finally{q(!1)}}return A("div",{className:"page-grid dispatch-grid"},A(il,{title:"下发任务",eyebrow:"Real WebSocket Dispatch"},A("form",{className:"dispatch-form",onSubmit:p},A("label",null,"Provider",A("select",{value:i,onChange:(Y)=>y(Y.target.value)},u.map((Y)=>A("option",{key:Y.providerId,value:Y.providerId},`${Y.name} / ${Y.providerId}`)))),A("label",null,"Command",A("select",{value:_,onChange:(Y)=>$(Y.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:r,onChange:(Y)=>j(Y.target.value)})),A("label",null,"备注",A("input",{value:J,onChange:(Y)=>Q(Y.target.value)})),A("label",null,"优先级",A("select",{value:U,onChange:(Y)=>F(Y.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:S},"查看原始JSON"),A("button",{type:"submit",disabled:K||!i},K?"下发中":"下发任务")),N?A("label",{className:"raw-editor-label"},"高级 Payload",A("textarea",{className:"raw-editor",value:w,onChange:(Y)=>W(Y.target.value)})):null,A(ul,{error:T,wide:!0}))),A(il,{title:"下发结果",eyebrow:"Response"},z?A("div",{className:"result-card"},A(El,{status:z.status||"queued"},z.status||"queued"),A("dl",null,A("dt",null,"Task ID"),A("dd",null,A("code",null,z.taskId||"--")),A("dt",null,"Provider 在线"),A("dd",null,wy(z.providerOnline))),A(uf,{title:"Dispatch Response",data:z,onOpen:f})):A(zl,{title:"等待操作",text:"任务响应会以结构化结果卡展示"})))}function zZ({task:u,onRaw:l}){return A("article",{className:"compact-row"},A(El,{status:u.status}),A("div",null,A("strong",null,u.command),A("code",null,u.id)),A("span",null,_$(u)?`已等待 ${mQ(u.updatedAt)}`:`耗时 ${L1(HZ(u)??0)}`),A(uf,{title:`Task ${u.id}`,data:pr(u),onOpen:l}))}function xZ({task:u}){let l=HZ(u),f=_$(u);return A("div",{className:"task-duration"},A("strong",null,l===null?"--":L1(l)),A("span",null,f?`已运行 / 创建 ${Hu(u.createdAt)}`:`创建 ${Hu(u.createdAt)}`))}function Jm({task:u}){let l=String(u?.status||"").toLowerCase(),f=u?.result,n=f&&typeof f==="object"&&!Array.isArray(f)?f:{},y=["exitCode","code","signal","timeoutMs","previousStatus","mode"].filter((_)=>n[_]!==void 0&&n[_]!==null);if(l==="failed"){let _=OZ(u);return A("div",{className:"task-diagnostic failed"},A("b",null,"失败原因"),A("span",{className:"diagnostic-reason"},wy(_)),y.length>0?A("div",{className:"diagnostic-meta"},y.map(($)=>A("span",{key:$,className:"data-chip"},A("b",null,$),A("span",null,wy(n[$]))))):null)}if(_$(u))return A("div",{className:"task-diagnostic warn"},A("b",null,"等待终态"),A("span",null,`最后更新 ${mQ(u.updatedAt)} 前`));return A("div",{className:"task-diagnostic ok"},A("b",null,"完成摘要"),A(Oi,{data:f,empty:"无执行输出"}))}function Qm({tasks:u,onRaw:l}){let f=u.filter(_$);return A("div",{"data-testid":"pending-task-page"},A(il,{title:"待处理任务",eyebrow:`${f.length} Pending`},f.length===0?A(zl,{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,f.map((n)=>A("tr",{key:n.id},A("td",null,A(El,{status:n.status})),A("td",null,A("strong",null,n.command),A("code",null,n.id)),A("td",null,A("code",null,n.providerId)),A("td",null,mQ(n.updatedAt)),A("td",null,A(Oi,{data:n.payload})),A("td",null,A(uf,{title:`Pending Task ${n.id}`,data:pr(n),onOpen:l})))))))))}function Um({tasks:u,onRaw:l}){return A("div",{"data-testid":"task-history-page"},A(il,{title:"任务历史",eyebrow:`${u.length} Tasks`},u.length===0?A(zl,{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,u.map((f)=>A("tr",{key:f.id,"data-testid":`task-row-${A0(f.id)}`},A("td",null,A(El,{status:f.status})),A("td",null,A("strong",null,f.command),A("code",null,f.id)),A("td",null,A("code",null,f.providerId)),A("td",null,A(xZ,{task:f})),A("td",null,A(Oi,{data:f.payload})),A("td",null,A(Jm,{task:f})),A("td",null,Hu(f.updatedAt)),A("td",null,A(uf,{title:`Task ${f.id}`,data:pr(f),onOpen:l})))))))))}function Nm({tasks:u,onRaw:l}){let f=u.filter((n)=>["succeeded","failed"].includes(n.status));return A(il,{title:"执行结果",eyebrow:"Finished Tasks"},f.length===0?A(zl,{title:"暂无结果",text:"任务完成后展示 provider 返回的结构化摘要"}):A("div",{className:"result-grid"},f.map((n)=>A("article",{key:n.id,className:"result-card"},A("div",{className:"node-card-head"},A("strong",null,n.command),A(El,{status:n.status})),A("code",null,n.id),A(Oi,{data:n.result,empty:"无执行输出"}),A(uf,{title:`Task Result ${n.id}`,data:pr(n),onOpen:l})))))}function Fm(u){if(!u||typeof u!=="object")return"--";if(u.type==="interval")return`每 ${L1(Number(u.everySeconds||0))}`;return`每天 ${u.timeOfDay||"03:00"} UTC`}function Wm(u){if(!u||typeof u!=="object")return"--";if(u.type==="pgdata_backup")return`PGDATA -> ${u.remoteBaseDir||"/SERVER_DATA/UNIDESK_PG_DATA"}`;if(u.type==="dispatch")return`${u.providerId||"--"} / ${u.command||"--"}`;return String(u.type||"--")}function qm(u){let l=String(u||"").toLowerCase();if(l==="succeeded")return"online";if(l==="failed")return"failed";if(l==="running"||l==="queued")return"warn";return l}function Lm(u){let l=Number(u?.durationMs);if(Number.isFinite(l)&&l>=0)return L1(l/1000);let f=mn(u?.startedAt||u?.createdAt);if(f===null)return"--";let i=mn(u?.finishedAt)??Date.now();return L1(Math.max(0,(i-f)/1000))}function GZ(u){return{id:"unidesk-pgdata-baidu-daily",name:"PGDATA daily Baidu Netdisk backup",description:"Daily PostgreSQL physical base backup uploaded to Baidu Netdisk /SERVER_DATA with monthly rotation.",enabled:!0,timeOfDay:"03:30",actionType:"pgdata_backup",providerId:u[0]?.providerId||"main-server",command:"echo",payloadJson:JSON.stringify({source:"scheduled-task",message:"hello from scheduler"},null,2),remoteBaseDir:"/SERVER_DATA/UNIDESK_PG_DATA",stagingSubdir:"server-data/unidesk-pg-data",timeoutMs:"3600000"}}function Km({schedules:u,scheduleRuns:l,nodes:f,refresh:n,onRaw:i}){let[y,_]=du(GZ(f||[])),[$,r]=du(!1),[j,J]=du(""),[Q,U]=du(""),F=[...l||[]].sort((z,Z)=>(mn(Z.updatedAt)??0)-(mn(z.updatedAt)??0));function N(z,Z){_((T)=>({...T,[z]:Z}))}function L(z){let Z=z?.action||{};_({id:z?.id||"",name:z?.name||"",description:z?.description||"",enabled:z?.enabled!==!1,timeOfDay:z?.schedule?.timeOfDay||"03:30",actionType:Z.type||"dispatch",providerId:Z.providerId||f[0]?.providerId||"main-server",command:Z.command||"echo",payloadJson:JSON.stringify(Z.payload||{source:"scheduled-task"},null,2),remoteBaseDir:Z.remoteBaseDir||"/SERVER_DATA/UNIDESK_PG_DATA",stagingSubdir:Z.stagingSubdir||"server-data/unidesk-pg-data",timeoutMs:String(Z.timeoutMs||3600000)}),U(`正在编辑 ${z?.id||""}`)}function w(){let z={id:y.id,name:y.name,description:y.description,enabled:y.enabled,concurrencyPolicy:"skip",schedule:{type:"daily",timeOfDay:y.timeOfDay,timezone:"Etc/UTC"}};if(y.actionType==="pgdata_backup")return{...z,action:{type:"pgdata_backup",volumeName:"unidesk_pgdata_10gb",remoteBaseDir:y.remoteBaseDir,stagingSubdir:y.stagingSubdir,timeoutMs:Number(y.timeoutMs)||3600000,cleanupLocal:!0}};return{...z,action:{type:"dispatch",providerId:y.providerId,command:y.command,payload:JSON.parse(y.payloadJson||"{}"),timeoutMs:Number(y.timeoutMs)||600000}}}async function W(z){z.preventDefault(),r(!0),J(""),U("");try{let Z=w(),T=encodeURIComponent(String(Z.id));await Zu(`${su.apiBaseUrl}/schedules/${T}`,{method:"PUT",body:JSON.stringify(Z)}),U("定时任务已保存"),await n()}catch(Z){J(cu(Z,"保存定时任务失败"))}finally{r(!1)}}async function K(z){if(!z?.id)return;r(!0),J(""),U("");try{await Zu(`${su.apiBaseUrl}/schedules/${encodeURIComponent(z.id)}`,{method:"DELETE"}),U(`已删除 ${z.id}`),await n()}catch(Z){J(cu(Z,"删除定时任务失败"))}finally{r(!1)}}async function q(z){if(!z?.id)return;r(!0),J(""),U("");try{let Z=await Zu(`${su.apiBaseUrl}/schedules/${encodeURIComponent(z.id)}/run`,{method:"POST",body:"{}"});U(`已触发 ${z.id} / ${Z?.run?.id||"run"}`),await n()}catch(Z){J(cu(Z,"触发定时任务失败"))}finally{r(!1)}}return A("div",{className:"page-grid scheduled-task-page","data-testid":"scheduled-task-page"},A(il,{title:"定时任务",eyebrow:`${(u||[]).length} Schedules`},(u||[]).length===0?A(zl,{title:"暂无定时任务",text:"创建 daily / dispatch / PGDATA backup 任务后会在这里展示下一次执行时间和最近结果"}):A("div",{className:"schedule-card-grid"},(u||[]).map((z)=>A("article",{key:z.id,className:"schedule-card","data-testid":`schedule-row-${A0(z.id)}`},A("div",{className:"node-card-head"},A("strong",null,z.name||z.id),A(El,{status:z.enabled?"online":"warn"},z.enabled?"enabled":"disabled")),A("code",null,z.id),A("dl",null,A("dt",null,"计划"),A("dd",null,Fm(z.schedule)),A("dt",null,"动作"),A("dd",null,Wm(z.action)),A("dt",null,"下次执行"),A("dd",null,Hu(z.nextRunAt)),A("dt",null,"最近执行"),A("dd",null,z.lastRunAt?`${Hu(z.lastRunAt)} / ${z.lastRunId||"--"}`:"--")),A("div",{className:"dispatch-actions"},A("button",{type:"button",className:"ghost-btn",disabled:$,onClick:()=>L(z)},"编辑"),A("button",{type:"button",className:"ghost-btn",disabled:$,onClick:()=>q(z),"data-testid":`schedule-run-${A0(z.id)}`},"手动触发"),A("button",{type:"button",className:"ghost-btn danger",disabled:$,onClick:()=>K(z)},"删除"),A(uf,{title:`Schedule ${z.id}`,data:z,onOpen:i})))))),A(il,{title:y.id?"配置定时任务":"新建定时任务",eyebrow:"CRUD"},A("form",{className:"dispatch-form schedule-form",onSubmit:W},A("label",null,"ID",A("input",{value:y.id,onChange:(z)=>N("id",z.target.value)})),A("label",null,"名称",A("input",{value:y.name,onChange:(z)=>N("name",z.target.value)})),A("label",null,"每日执行时间 UTC",A("input",{value:y.timeOfDay,placeholder:"03:30",onChange:(z)=>N("timeOfDay",z.target.value)})),A("label",null,"启用",A("select",{value:y.enabled?"true":"false",onChange:(z)=>N("enabled",z.target.value==="true")},A("option",{value:"true"},"enabled"),A("option",{value:"false"},"disabled"))),A("label",null,"动作类型",A("select",{value:y.actionType,onChange:(z)=>N("actionType",z.target.value)},A("option",{value:"pgdata_backup"},"PGDATA 备份到百度网盘"),A("option",{value:"dispatch"},"Provider Dispatch"))),y.actionType==="pgdata_backup"?[A("label",{key:"remote"},"网盘根目录",A("input",{value:y.remoteBaseDir,onChange:(z)=>N("remoteBaseDir",z.target.value)})),A("label",{key:"staging"},"本地 staging 子目录",A("input",{value:y.stagingSubdir,onChange:(z)=>N("stagingSubdir",z.target.value)}))]:[A("label",{key:"provider"},"Provider",A("select",{value:y.providerId,onChange:(z)=>N("providerId",z.target.value)},(f||[]).map((z)=>A("option",{key:z.providerId,value:z.providerId},`${z.name} / ${z.providerId}`)))),A("label",{key:"command"},"Command",A("select",{value:y.command,onChange:(z)=>N("command",z.target.value)},A("option",{value:"echo"},"echo"),A("option",{value:"docker.ps"},"docker.ps"),A("option",{value:"host.ssh"},"host.ssh"),A("option",{value:"microservice.http"},"microservice.http"))),A("label",{key:"payload",className:"raw-editor-label"},"Payload JSON",A("textarea",{className:"raw-editor",value:y.payloadJson,onChange:(z)=>N("payloadJson",z.target.value)}))],A("label",null,"超时 ms",A("input",{value:y.timeoutMs,onChange:(z)=>N("timeoutMs",z.target.value)})),A("label",{className:"raw-editor-label"},"描述",A("textarea",{className:"raw-editor compact",value:y.description,onChange:(z)=>N("description",z.target.value)})),A("div",{className:"dispatch-actions"},A("button",{type:"button",className:"ghost-btn",disabled:$,onClick:()=>_(GZ(f||[]))},"重置"),A("button",{type:"submit",disabled:$||!y.id},$?"保存中":"保存任务")),Q?A("p",{className:"muted paragraph"},Q):null,A(ul,{error:j,wide:!0}))),A(il,{title:"历史执行记录",eyebrow:`${F.length} Runs`},F.length===0?A(zl,{title:"暂无执行记录",text:"定时触发或手动触发后会生成 run history"}):A("div",{className:"table-wrap"},A("table",{className:"task-history-table schedule-run-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,"操作"))),A("tbody",null,F.map((z)=>A("tr",{key:z.id,"data-testid":`schedule-run-row-${A0(z.id)}`},A("td",null,A(El,{status:qm(z.status)},z.status)),A("td",null,A("strong",null,z.scheduleId),A("code",null,z.id),z.taskId?A("code",null,z.taskId):null),A("td",null,z.trigger||"--"),A("td",null,Lm(z)),A("td",null,A(Oi,{data:z.result||z.error,empty:"无结果"})),A("td",null,Hu(z.updatedAt)),A("td",null,A(uf,{title:`Schedule Run ${z.id}`,data:z,onOpen:i})))))))))}function zm({data:u}){let l=u.overview||{};return A("div",{className:"page-grid topology-grid"},A(il,{title:"公开入口",eyebrow:"Public"},A("div",{className:"endpoint-list"},A("article",null,A("b",null,"Frontend"),A("span",null,su.frontendPublicUrl||window.location.origin),A(El,{status:"online"},"public")),A("article",null,A("b",null,"Provider Ingress"),A("span",null,su.providerIngressPublicUrl||"ws://public/ws/provider"),A(El,{status:"online"},"public")))),A(il,{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(El,{status:"internal"},"internal")),A("article",null,A("b",null,"database"),A("span",null,"postgres://database:5432/unidesk"),A(El,{status:"internal"},"internal")))),A(il,{title:"运行态",eyebrow:"Runtime"},A("div",{className:"metric-grid"},A(Ll,{label:"DB Ready",value:l.dbReady?"YES":"NO",hint:"internal health"}),A(Ll,{label:"Online Nodes",value:l.onlineNodeCount??0,hint:"provider-gateway self-link"}))))}function Gm({session:u}){return A(il,{title:"认证策略",eyebrow:"Frontend Login"},A("div",{className:"policy-grid"},A("article",null,A("span",null,"默认账号"),A("strong",null,su.authUsername||"admin")),A("article",null,A("span",null,"当前会话"),A("strong",null,u?.user?.username||"--")),A("article",null,A("span",null,"Session TTL"),A("strong",null,`${su.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 wm(){return A(il,{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 Zm({activeModule:u,activeTab:l,data:f,session:n,refresh:i,onRaw:y,onNavigate:_}){if(u==="ops"&&l==="status")return A(mp,{data:f,onRaw:y,onNavigate:_});if(u==="ops"&&l==="performance")return A(lm,{onRaw:y});if(u==="ops"&&l==="events")return A(Rp,{events:f.events,onRaw:y});if(u==="ops"&&l==="logs")return A(bp,{logs:f.logs,onRaw:y});if(u==="nodes"&&l==="list")return A(kp,{nodes:f.nodes,onRaw:y});if(u==="nodes"&&l==="monitor")return A(vp,{nodes:f.nodes,systemStatuses:f.systemStatuses,tasks:f.tasks,onRaw:y,refresh:i});if(u==="nodes"&&l==="docker")return A($m,{nodes:f.nodes,dockerStatuses:f.dockerStatuses,onRaw:y});if(u==="nodes"&&l==="gateway")return A(im,{nodes:f.nodes,tasks:f.tasks,onRaw:y});if(u==="nodes"&&l==="labels")return A(hp,{nodes:f.nodes});if(u==="nodes"&&l==="heartbeats")return A(Ip,{nodes:f.nodes});if(u==="tasks"&&l==="dispatch")return A(jm,{nodes:f.nodes,onDispatched:i,onRaw:y});if(u==="tasks"&&l==="scheduled")return A(Km,{schedules:f.schedules,scheduleRuns:f.scheduleRuns,nodes:f.nodes,refresh:i,onRaw:y});if(u==="tasks"&&l==="pending")return A(Qm,{tasks:f.pendingTasks,onRaw:y});if(u==="tasks"&&l==="history")return A(Um,{tasks:f.tasks,onRaw:y});if(u==="tasks"&&l==="results")return A(Nm,{tasks:f.tasks,onRaw:y});if(u==="apps"&&l==="catalog")return A(Am,{microservices:f.microservices,onRaw:y,onNavigate:_});if(u==="apps"&&l==="hwlab")return A(hL,{});if(u==="apps"&&l==="todo-note")return A(fZ,{microservices:f.microservices,onRaw:y,apiBaseUrl:su.apiBaseUrl});if(u==="apps"&&l==="findjob")return A(bL,{microservices:f.microservices,onRaw:y,apiBaseUrl:su.apiBaseUrl});if(u==="apps"&&l==="pipeline")return A(gw,{microservices:f.microservices,onRaw:y,apiBaseUrl:su.apiBaseUrl});if(u==="apps"&&l==="met-nonlinear")return A(aL,{microservices:f.microservices,onRaw:y,apiBaseUrl:su.apiBaseUrl});if(u==="apps"&&l==="claudeqq")return A(nq,{microservices:f.microservices,onRaw:y,apiBaseUrl:su.apiBaseUrl});if(u==="apps"&&l==="baidu-netdisk")return A(uq,{microservices:f.microservices,onRaw:y,apiBaseUrl:su.apiBaseUrl});if(u==="apps"&&l==="filebrowser")return A(RL,{microservices:f.microservices,onRaw:y,apiBaseUrl:su.apiBaseUrl});if(u==="apps"&&l==="oa-event-flow")return A($K,{microservices:f.microservices,onRaw:y,apiBaseUrl:su.apiBaseUrl});if(u==="apps"&&l==="k3sctl")return A(rZ,{microservices:f.microservices,onRaw:y,apiBaseUrl:su.apiBaseUrl,onNavigate:_});if(u==="apps"&&l==="code-queue")return A(HL,{microservices:f.microservices,onRaw:y,apiBaseUrl:su.apiBaseUrl,initialTasksData:Gp});if(u==="apps"&&l==="mdtodo")return A(uK,{microservices:f.microservices,onRaw:y,apiBaseUrl:su.apiBaseUrl});if(u==="apps"&&l==="decision-center")return A(PL,{microservices:f.microservices,onRaw:y,apiBaseUrl:su.apiBaseUrl});if(u==="apps"&&l==="project-manager")return A(ow,{microservices:f.microservices,onRaw:y,apiBaseUrl:su.apiBaseUrl});if(u==="config"&&l==="topology")return A(zm,{data:f});if(u==="config"&&l==="auth")return A(Gm,{session:n});if(u==="config"&&l==="security")return A(wm);return A(zl,{title:"未找到页面",text:"请选择左侧主模块和顶部子功能标签"})}function Em({session:u,onLogout:l}){let f=v7(I0,window.location.pathname),[n,i]=du(f.moduleId),[y,_]=du({...b3,[f.moduleId]:f.tabId}),[$,r]=du({overview:null,nodes:[],systemStatuses:[],dockerStatuses:[],microservices:[],events:[],tasks:[],pendingTasks:[],schedules:[],scheduleRuns:[],logs:[]}),[j,J]=du({ok:!1,text:"连接中"}),[Q,U]=du(null),[F,N]=du(new Date),[L,w]=du(null),[W,K]=du(!1),[q,z]=du(!1),Z=Hi.default.useRef(!1),T=I0.moduleById[n]||I0.modules[0],c=y[n]||b3[n]||T.tabs[0].id,X=Array.isArray($.microservices)?$.microservices:[],S=X.length===0&&n==="apps"&&c==="code-queue"?[wp]:X,p=S===X?$:{...$,microservices:S},Y=n==="apps"?S.find((R)=>String(R?.id||"")===(c==="k3sctl"?"k3sctl-adapter":c)):null,t=Y?SZ(Y):{},m=T.tabs.find((R)=>R.id===c)?.label||c,V=Y?[{key:"microservice",label:"用户服务",value:`${m} ${t.providerStatus==="online"?"在线":t.providerStatus||"未知"}`,tone:t.providerStatus==="online"?"ok":"warn",testId:"active-microservice-status"}]:[];async function D(){if(Z.current)return;Z.current=!0,z(!0);try{let R=[],x=(Lu,Bu)=>{R.push([Lu,Zu(Bu)])},fu=n==="ops"&&c==="status",yu=fu||n==="config"&&c==="topology",Ju=fu||n==="nodes"||n==="tasks"&&(c==="dispatch"||c==="scheduled"),Vu=n==="apps"&&c!=="code-queue";if(yu)x("overview",`${su.apiBaseUrl}/overview`);if(Ju)x("nodes",`${su.apiBaseUrl}/nodes`);if(n==="nodes"&&c==="monitor")x("systemStatuses",`${su.apiBaseUrl}/nodes/system-status?limit=60`),x("tasks",`${su.apiBaseUrl}/tasks?limit=120&summary=1`);else if(n==="nodes"&&c==="docker")x("dockerStatuses",`${su.apiBaseUrl}/nodes/docker-status`);else if(n==="nodes"&&c==="gateway")x("tasks",`${su.apiBaseUrl}/tasks?limit=300&summary=1`);else if(n==="tasks"&&c==="scheduled")x("schedules",`${su.apiBaseUrl}/schedules?limit=100`),x("scheduleRuns",`${su.apiBaseUrl}/schedules/runs?limit=100`);else if(n==="tasks"&&c==="pending")x("pendingTasks",`${su.apiBaseUrl}/tasks?status=pending&limit=100&summary=1`);else if(n==="tasks"&&(c==="history"||c==="results"))x("tasks",`${su.apiBaseUrl}/tasks?limit=300&summary=1`);else if(fu)x("tasks",`${su.apiBaseUrl}/tasks?limit=8&lite=1`),x("pendingTasks",`${su.apiBaseUrl}/tasks?status=pending&limit=20&lite=1`);if(Vu)x("microservices",`${su.apiBaseUrl}/microservices`);if(n==="ops"&&c==="events")x("events",`${su.apiBaseUrl}/events?limit=100`);if(n==="ops"&&c==="logs")x("logs","/logs?limit=100");await Promise.all(R.map(async([Lu,Bu])=>{let b=await Bu,o={};if(Lu==="overview")o.overview=b;if(Lu==="nodes")o.nodes=b.nodes||[];if(Lu==="systemStatuses")o.systemStatuses=b.systemStatuses||[];if(Lu==="dockerStatuses")o.dockerStatuses=b.dockerStatuses||[];if(Lu==="microservices")o.microservices=b.microservices||[];if(Lu==="events")o.events=b.events||[];if(Lu==="tasks")o.tasks=b.tasks||[];if(Lu==="pendingTasks")o.pendingTasks=b.tasks||[];if(Lu==="schedules")o.schedules=b.schedules||[];if(Lu==="scheduleRuns")o.scheduleRuns=b.runs||[];if(Lu==="logs")o.logs=b.logs||[];r((nu)=>({...nu,...o}))})),J({ok:!0,text:"核心在线"}),U(new Date)}catch(R){if(J({ok:!1,text:cu(R,"连接失败")}),R.status===401)l(!1)}finally{Z.current=!1,z(!1)}}pn(()=>{let R=()=>{if(!QZ())return;D()};R();let x=setInterval(R,Ep(n,c)),fu=()=>{if(QZ())R()};return document.addEventListener("visibilitychange",fu),()=>{clearInterval(x),document.removeEventListener("visibilitychange",fu)}},[n,c]),pn(()=>{let R=setInterval(()=>N(new Date),1000);return()=>clearInterval(R)},[]),pn(()=>{let R=iK(I0,window.location.pathname);if(R&&window.location.pathname!==R)window.history.replaceState(null,"",R)},[]),pn(()=>{let R=()=>{let x=v7(I0,window.location.pathname);i(x.moduleId),_((fu)=>({...fu,[x.moduleId]:x.tabId})),w(null)};return window.addEventListener("popstate",R),()=>window.removeEventListener("popstate",R)},[]),pn(()=>{window.scrollTo({top:0,left:0,behavior:"auto"})},[n,c]);function M(R,x,fu="push"){let yu=I0.moduleById[R]?R:I0.fallbackTarget.moduleId,Ju=I0.moduleById[yu]?.tabs.some((Lu)=>Lu.id===x)?x:b3[yu]||I0.moduleById[yu]?.tabs[0]?.id||I0.fallbackTarget.tabId;i(yu),_((Lu)=>({...Lu,[yu]:Ju}));let Vu=W4(I0,yu,Ju);if(window.location.pathname!==Vu){let Lu=fu==="replace"?"replaceState":"pushState";window.history[Lu](null,"",Vu)}}function I(R,x){w({title:R,data:x})}let[O,C]=du(!1),{unreadCount:g,notifications:a}=bf(),iu=a.length>0?a[a.length-1]:null,Au=EZ(JZ);return A("div",{className:`shell ${W?"rail-collapsed":""} ${Au?"dev-shell":""}`,"data-testid":"app-shell"},A(Cp,{activeModule:n,activeTabs:y,onNavigate:M,collapsed:W,onToggle:()=>K((R)=>!R)}),A("main",{className:"workspace"},A(Pp,{connection:j,lastRefresh:Q,onRefresh:D,onLogout:()=>l(!0),session:u,clock:F,activeStatusItems:V,onNotificationToggle:()=>C((R)=>!R),unreadCount:g,environment:JZ}),A(pp,{module:T,activeTab:c,onNavigate:M}),A(pQ.Provider,{value:q},A(Zm,{activeModule:n,activeTab:c,data:p,session:u,refresh:D,onRaw:I,onNavigate:M}))),A(Dp,{raw:L,onClose:()=>w(null)}),iu&&A(jZ,{key:iu.id,notification:iu}),O&&A(AZ,{onClose:()=>C(!1)}))}function Hm(){let[u,l]=du(!0),[f,n]=du(null);async function i(){l(!0);try{let _=await Zu("/api/session");n(_.authenticated?_:null)}catch{n(null)}finally{l(!1)}}async function y(_){if(_)try{await Zu("/logout",{method:"POST"})}catch{}n(null)}if(pn(()=>{i()},[]),u)return A("main",{className:"loading-screen"},A("div",{className:"brand-mark"},"UD"),A("span",null,"加载会话"));if(!f)return A(Sp,{onLogin:n});return A(eW,null,A(Em,{session:f,onLogout:y}))}var RZ=document.getElementById("root");if(RZ===null)throw Error("root element not found");wZ.createRoot(RZ).render(A(Hm));})(); + `,width:K,height:G}}function Dr(u,l){let f=URL.createObjectURL(u),n=document.createElement("a");n.href=f,n.download=l,n.click(),setTimeout(()=>URL.revokeObjectURL(f),1000)}async function xw(u,l){let f=pw(l,"pipeline"),{svg:n,width:y,height:i}=NC(u,l),_=new Blob([n],{type:"image/svg+xml;charset=utf-8"}),$=URL.createObjectURL(_);try{let A=new Image;await new Promise((U,F)=>{A.onload=()=>U(),A.onerror=()=>F(Error("svg image load failed")),A.src=$});let j=document.createElement("canvas");j.width=y,j.height=i;let J=j.getContext("2d");if(!J)throw Error("canvas unavailable");J.drawImage(A,0,0);let Q=await new Promise((U)=>j.toBlob(U,"image/png"));if(!Q)throw Error("png export failed");Dr(Q,`${f}.png`)}catch{Dr(_,`${f}.svg`)}finally{URL.revokeObjectURL($)}}async function KC(u){let l=pw(String(u?.title||"pipeline-gantt"),"pipeline-gantt"),{svg:f,width:n,height:y}=LC(u),i=new Blob([f],{type:"image/svg+xml;charset=utf-8"}),_=URL.createObjectURL(i);try{let $=new Image;await new Promise((Q,U)=>{$.onload=()=>Q(),$.onerror=()=>U(Error("gantt svg image load failed")),$.src=_});let A=document.createElement("canvas");A.width=n,A.height=y;let j=A.getContext("2d");if(!j)throw Error("canvas unavailable");j.drawImage($,0,0);let J=await new Promise((Q)=>A.toBlob(Q,"image/png"));if(!J)throw Error("gantt png export failed");Dr(J,`${l}.png`)}catch{Dr(i,`${l}.svg`)}finally{URL.revokeObjectURL(_)}}async function zC(u){for(let l of u){if(l.flow.nodes.length===0)continue;await xw(l.flow,l.title),await new Promise((f)=>setTimeout(f,750))}}function Zw(u,l){return u.find((f)=>String(f?.pipelineId||"")===l)||null}function Ew(u){return fl(u?.startedAt)??fl(u?.artifact?.startedAt)??fl(u?.request?.createdAt)??fl(u?.updatedAt)??0}function GC(u,l){return u.filter((f)=>String(f?.pipelineId||"")===l).slice().sort((f,n)=>Ew(f)-Ew(n)||String(f?.runId||"").localeCompare(String(n?.runId||"")))}function FQ(u,l){let f=String(l?.runId||""),n=u.findIndex((_)=>String(_?.runId||"")===f),y=n>=0?n+1:u.length,i=String(l?.status||"--");return`Epoch ${y} / ${f||"--"} / ${i}`}function v0(u){return String(u?.procedureRunId||u?.runId||"")}function Mr(u,l){let f=String(u?.nodeId||u?.request?.nodeId||"");if(f)return f;let n=v0(u),y=`${l}__`;if(n.startsWith(y))return n.slice(y.length).replace(/__\d+$/u,"");return""}function Er(u,l){let f=pu(u?.artifact)?u.artifact:{},n=pu(u?.request)?u.request:{};return t6(u?.startedAt,f.startedAt,n.createdAt,n.startedAt,u?.createdAt,u?.updatedAt,l?.startedAt,l?.request?.createdAt)}function Hr(u,l){let f=String(u?.status?.status||u?.artifact?.status||u?.status||"").toLowerCase(),n=pu(u?.artifact)?u.artifact:{},y=KQ(f);return t6(u?.finishedAt,n.finishedAt,u?.completedAt,y?u?.updatedAt:void 0,y?n.updatedAt:void 0,y?l?.updatedAt:void 0)}function mw(u,l,f=Date.now()){let n=String(u?.runId||""),y=new Set(l.map((i)=>String(i?.id||"")).filter(Boolean));return Mu(u?.procedureRuns).flatMap((i)=>{let _=Mr(i,n);if(!_)return[];let $=String(i?.status?.status||i?.artifact?.status||i?.status||"unknown").toLowerCase(),A=Er(i,u),j=fl(A);if(j===null)return[];let J=Hr(i,u),Q=fl(J)??(KQ($)?fl(i?.updatedAt)??j+1000:f),U=Math.max(j+1000,Q);return[{nodeId:_,knownNode:y.has(_),procedureRunId:v0(i),status:$,startMs:j,endMs:U,startedAt:c6(j),finishedAt:c6(U),durationMs:U-j,runId:n,raw:i}]}).sort((i,_)=>i.startMs-_.startMs||i.endMs-_.endMs||i.nodeId.localeCompare(_.nodeId))}function wC(u,l,f=[]){let n=l.map((J)=>Number(J.startMs)).filter(Number.isFinite),y=l.map((J)=>Number(J.endMs)).filter(Number.isFinite);for(let J of f){let Q=Rl(J?.eventMs??J?.ms);if(Q!==null)n.push(Q),y.push(Q)}let i=fl(u?.startedAt)??fl(u?.artifact?.startedAt)??fl(u?.request?.createdAt),_=fl(u?.finishedAt)??fl(u?.artifact?.finishedAt)??fl(u?.updatedAt);if(i!==null)n.push(i);if(_!==null)y.push(_);let $=Date.now(),A=n.length>0?Math.min(...n):$-60000,j=Math.max(A+60000,y.length>0?Math.max(...y):$);return{startMs:A,endMs:j,durationMs:j-A}}var Or=12,Rw=20,WQ=100,ZC=!1;function wy(u){let l=Number(u);if(!Number.isFinite(l))return 0;return Math.max(0,Math.min(100,Math.round(l*100)/100))}function EC(u){let l=Math.max(Or,Number(u||Or)),f=Math.log(l/Or)/Math.log(Rw);return wy(f*100)}var D6=EC(WQ);function HQ(u){let l=wy(u)/100,f=Or*Math.pow(Rw,l),n=l<0.24?"全局":l<0.64?"均衡":"细节";return{value:wy(l*100),pxPerMinute:f,label:n}}function AQ(u){let l=Math.round(Number(u));return Math.abs(l-WQ)<=1?WQ:l}function HC(u,l=D6){let f=Math.max(1,Number(u.durationMs||0)/60000),n=HQ(l);return Math.round(Math.max(360,Math.min(7200,f*Number(n.pxPerMinute||48))))}function OC(u,l=7){let f=Math.max(1,Number(u.endMs||0)-Number(u.startMs||0));return Array.from({length:l},(n,y)=>{let i=l===1?0:y/(l-1);return{ms:Number(u.startMs)+f*i,percent:i*100}})}function TC(u,l){let f=Math.max(1,Number(l.endMs)-Number(l.startMs));return Math.max(0,Math.min(100,(u-Number(l.startMs))/f*100))}function Rl(u){let l=Number(u);return Number.isFinite(l)?l:null}function OQ(u){return Vw(u?.status)&&!KQ(u?.status)}function bw(u,l,f,n){let y=Math.max(1,f-l),i=Math.max(0,Math.min(1,(u-l)/y));return Number((i*n).toFixed(3))}function Hw(u,l){if(!l)return null;let f=Rl(l?.startMs),n=Rl(l?.endMs),y=Rl(l?.chartHeight);if(f===null||n===null||y===null)return null;return bw(u,f,n,y)}function kw(u,l){let f=Rl(u?.rawStartMs??u?.startMs)??Rl(u?.startMs)??l,n=Rl(u?.endMs)??f+1000;if(!OQ(u))return Math.max(f+1000,n);return Math.max(f+1000,n,l)}function VC(u,l,f,n){let y=Rl(u?.startMs)??n-60000,i=Rl(u?.endMs)??n,_=f.reduce((N,K)=>Math.max(N,kw(K,n)),i),$=Math.max(y+60000,i,_),A=Math.max(1,$-y),j={startMs:y,endMs:$,durationMs:A},J=HC(j,l),Q=HQ(l),U=Math.max(5,Math.min(18,Math.round(J/150))),F=OC(j,U).map((N)=>{let K=Number(N.ms),G=bw(K,y,$,J);return{...N,y:G,timestamp:c6(K),offsetMs:K-y}});return{source:"frontend-y",startMs:y,endMs:$,durationMs:A,chartHeight:J,scale:wy(l),normalizedScale:Number((wy(l)/100).toFixed(3)),pxPerMinute:Number(Number(Q.pxPerMinute||0).toFixed(3)),ticks:F}}function BC(u,l,f){if(!OQ(u))return u;let n=Rl(u?.rawStartMs??u?.startMs)??Rl(u?.startMs)??f,y=kw(u,f),i=Hw(n,l),_=Hw(y,l),$=Rl(i??u?.y1??u?.startY)??0,A=Rl(_??u?.y2??u?.endY)??$+10,j=Math.max(24,A-$);return{...u,live:!0,startMs:n,endMs:y,durationMs:Math.max(1000,y-n),finishedAt:c6(y),y1:$,y2:A,startY:$,endY:A,height:j}}function TQ(u,l,f){return TC(u,l)/100*f}function f$(u){return Boolean(u&&String(u?.source||"")!=="frontend-y")}function hw(u,l,f,n,y){if(f$(n))for(let _ of y){let $=Rl(u?.[_]);if($!==null)return $}let i=Rl(u?.ms??u?.eventMs??u?.startMs);return TQ(i??Number(l.startMs),l,f)}function tr(u,l,f,n){return hw(u,l,f,n,["y1","startY"])}function qQ(u,l,f,n){if(f$(n)){let i=Rl(u?.y2??u?.endY);if(i!==null)return i}let y=Rl(u?.endMs)??Number(l.endMs);return TQ(y,l,f)}function Iw(u,l,f,n){if(f$(n)){let i=Rl(u?.height);if(i!==null)return Math.max(1,i)}let y=u?.live?24:10;return Math.max(y,qQ(u,l,f,n)-tr(u,l,f,n))}function O0(u,l,f,n){return hw(u,l,f,n,["y","timeAxisY"])}function vw(u,l,f,n){if(f$(n)||String(n?.source||"")==="frontend-y"){let _=Rl(u?.y);if(_!==null)return _}let y=Rl(u?.percent);if(y!==null)return y/100*f;let i=Rl(u?.ms)??Number(l.startMs);return TQ(i,l,f)}function XC(u){let l=String(u?.promptEvent||u?.raw?.promptEvent||u?.event||"").toLowerCase();if(!["node-long-running-observation","node-finished"].includes(l))return"";let f=String(u?.sourceNodeId||u?.raw?.sourceNodeId||u?.raw?.detail?.nodeId||""),n=String(u?.nodeId||u?.targetNodeId||"");return f&&f!==n?f:""}function cC(u,l){let f=new Set(l.map((y)=>[String(y.sourceNodeId||""),String(y.targetNodeId||""),String(y.targetMarkerId||""),String(y.action||"")].join(":"))),n=[...l];for(let y of u){let i=XC(y),_=String(y?.nodeId||""),$=String(y?.id||"");if(!i||!_||!$)continue;let A=[i,_,$,"observe"].join(":");if(f.has(A))continue;f.add(A),n.push({id:`observation-arrow:${$}:${i}:${_}`,commandId:String(y?.commandId||y?.eventId||$),sourceNodeId:i,targetNodeId:_,sourceMarkerId:"",targetMarkerId:$,sourceKind:"monitor",action:"observe",status:"observation"})}return{markers:u,arrows:n}}function YC(u){let l=Fn(u),f=String(u?.promptEvent||"");if(l==="initial-prompt-delivered")return"initial";if(f==="node-finished"||f==="node-long-running-observation"||f.startsWith("monitor-"))return"monitor";if(l==="monitor-prompt-delivered"||String(u?.sourceKind||"").toLowerCase()==="monitor")return"monitor";return"append"}function DC(u){return Mu(u?.tags||u?.raw?.tags).map((l)=>String(l||"")).filter(Boolean)}function tC(u){let l=Fn(u),f=String(u?.promptEvent||"");if(l==="initial-prompt-delivered")return"初始 prompt";if(f==="node-long-running-observation")return"长任务观察";if(f==="node-finished")return DC(u).includes("monitor.audit")?"节点完成 / OA 审核":"节点完成";if(f==="monitor-interval")return"Monitor observation";if(f==="monitor-start")return"Monitor start";if(f==="monitor-stop")return"Monitor stop";if(l==="monitor-prompt-delivered")return"Monitor prompt";if(l==="append-prompt-queued")return"追加 prompt 已排队";return"追加 prompt"}function Ow(u){let l=Fn(u);if(l==="control-command-applied")return 3;if(l==="control-command-ignored")return 2;if(l==="control-command-queued")return 1;return 0}function SC(u,l){let f=String(u?.commandId||"");if(f)return`command:${f}`;return["control-event",e_(u)||t6(u?.createdAt,u?.timestamp)||`index-${l}`,String(u?.sourceKind||""),String(u?.sourceNodeId||""),String(u?.targetNodeId||""),wi(u)].join(":")}function PC(u){return UQ([u?.targetNodeId,...Mu(u?.resetNodeIds)])}function MC(u,l){let f=B6(u),n=Fn(u),y=String(u?.targetNodeId||""),i=Boolean(y)&&l!==y;if(n==="control-command-applied")return i?`${f} 波及`:`${f} 生效`;if(n==="control-command-ignored")return`${f} 忽略`;if(n==="control-command-queued")return`${f} 已发起`;return i?`${f} 波及`:f}function CC(u){if(Fn(u)==="control-command-ignored")return"ignored";let f=wi(u);if(f==="restart"||f==="redo")return"restart";if(f==="modify")return"modify";if(f==="approve")return"approve";if(f==="guide")return"guide";return"pending"}function pC(u){let l=String(u?.sourceKind||"").toLowerCase();if(l==="monitor")return"monitor";if(l==="webui")return"webui";if(l==="cli")return"cli";return"system"}function xC(u,l,f,n){let y=u.filter((j)=>String(j.nodeId||"")===l).sort((j,J)=>Number(j.startMs)-Number(J.startMs)),i=y.find((j)=>f>=Number(j.startMs)-1000&&f<=Number(j.endMs)+1000);if(i)return{ms:f,onInterval:!0,snapReason:"inside-interval",procedureRunId:String(i.procedureRunId||"")};let _=wi(n),$=y.slice().reverse().find((j)=>Number(j.endMs)<=f+1000);if($&&_==="approve")return{ms:Number($.endMs),onInterval:!0,snapReason:"previous-interval-end",procedureRunId:String($.procedureRunId||"")};let A=y.find((j)=>Number(j.startMs)>=f-1000);if(A&&["guide","modify","restart","redo"].includes(_))return{ms:Number(A.startMs),onInterval:!0,snapReason:"next-interval-start",procedureRunId:String(A.procedureRunId||"")};return{ms:f,onInterval:!1,snapReason:"event-time",procedureRunId:String(n?.procedureRunId||"")}}function gw(u,l,f,n){let y=Math.hypot(f-u,n-l),i=y>Aw?Aw:0,_=i>0?f-(f-u)/y*i:f,$=i>0?n-(n-l)/y*i:n,A=_-u,j=Math.max(16,Math.min(42,Math.abs(A)*0.45+12)),J=A===0?1:Math.sign(A);return`M ${u},${l} C ${u+J*j},${l} ${_-J*j},${$} ${_},${$}`}function mC(u,l){let f=String(u?.runId||l?.runId||""),n=mw({...pu(l)?l:{},...pu(u)?u:{},runId:f,procedureRuns:Mu(u?.procedureRuns).length>0?u.procedureRuns:l?.procedureRuns},[]),y=[],i=[],_=[],$=new Set,A=new Map,j=(U,F)=>{if(!U.nodeId||!Number.isFinite(Number(U.ms)))return;if($.has(U.id))return;$.add(U.id),F.push(U)};for(let U of Mu(u?.procedureRuns)){let F=Mr(U,f),N=v0(U);if(!F)continue;for(let K of Mu(U?.attempts)){let G=Pr(K);for(let W of QQ(K?.controlEventRecords)){let L=Fn(W);if(!["initial-prompt-delivered","append-prompt-delivered","monitor-prompt-delivered"].includes(L))continue;let q=e_(W),z=fl(q);if(z===null)continue;let Z=String(W?.eventId||"");j({id:`prompt:${Z||`${N}:${G}:${L}:${z}`}`,runId:f,nodeId:F,procedureRunId:N,attempt:G,kind:"prompt",tone:YC(W),status:"delivered",label:tC(W),ms:z,timestampIso:q,sourceKind:String(W?.sourceKind||""),sourceNodeId:String(W?.sourceNodeId||""),targetNodeId:F,action:"",eventId:Z,commandId:String(W?.commandId||""),raw:W},y)}}}let J=new Map;QQ(u?.controlEvents).forEach((U,F)=>{let N=SC(U,F),K=J.get(N)||{key:N,events:[]};K.events.push(U),J.set(N,K)});for(let U of J.values()){let F=Mu(U.events).slice().sort((Y,D)=>Ow(D)-Ow(Y)),N=Mu(U.events).find((Y)=>Fn(Y)==="control-command-queued")||null,K=F[0]||N;if(!N&&!K)continue;let G=String(N?.sourceNodeId||K?.sourceNodeId||""),W=String(N?.sourceKind||K?.sourceKind||""),L=e_(N)||e_(K)||t6(N?.createdAt,K?.createdAt),q=fl(L),z=String(K?.commandId||N?.commandId||U.key),Z=(Fn(K)||"control-command-queued").replace(/^control-command-/u,""),T="";if(G&&q!==null)T=`control-source:${z}:${G}`,A.set(z,T),j({id:T,runId:f,nodeId:G,procedureRunId:String(N?.procedureRunId||K?.procedureRunId||""),attempt:"",kind:"control-source",tone:pC(N||K),status:Z,label:`${B6(N||K)} 发起`,ms:q,timestampIso:L,action:wi(N||K),sourceKind:W,sourceNodeId:G,targetNodeId:String(K?.targetNodeId||N?.targetNodeId||""),commandId:z,raw:N||K},i);let X=K||N,c=e_(X)||L,S=fl(c);if(S===null)continue;let p=PC(X);for(let Y of p){let D=xC(n,Y,S,X),x=`control-target:${z}:${Y}`;if(j({id:x,runId:f,nodeId:Y,procedureRunId:D.procedureRunId,attempt:"",kind:"control-target",tone:CC(X),status:Z,label:MC(X,Y),ms:D.ms,eventMs:S,onInterval:D.onInterval,snapReason:D.snapReason,snapped:Number(D.ms)!==S,timestampIso:c,renderedTimestampIso:c6(Number(D.ms)),action:wi(X),sourceKind:W,sourceNodeId:G,targetNodeId:Y,commandId:z,raw:X},i),T&&G&&G!==Y)_.push({id:`control-arrow:${z}:${G}:${Y}`,commandId:z,sourceNodeId:G,targetNodeId:Y,sourceMarkerId:T,targetMarkerId:x,sourceKind:W,action:wi(X),status:Z})}}let Q=[...y,...i].sort((U,F)=>Number(U.ms)-Number(F.ms)||String(U.nodeId).localeCompare(String(F.nodeId))||String(U.id).localeCompare(String(F.id)));return{...cC(Q,_),sourceMarkerByCommand:A}}function RC({details:u,selectedNodeId:l,selectedNodeRuntime:f,control:n,onRaw:y}){if(!u)return H("span",{className:"muted"},"点击“抓取过程”读取 node 运行材料;主界面只显示结构化摘要,完整内容需点开原始 JSON。");let i=Mu(u.procedureRuns),_=i.at(-1)||{},$=Mu(_.attempts),A=$.at(-1)||{},j=Mu(_.workerLogTail),J=Mu(A.controlEventsTail),Q=Mu(A.controlPromptsTail),U=Mu(A.monitorPromptsTail),F=yQ(J),N=yQ(Q),K=yQ(U),G=A.opencodeMessages||{};return H("div",{className:"pipeline-evidence-list compact"},H(h0,{title:"Node runtime",subtitle:l||"--",facts:[`status ${f?.status||"pending"}`,`attempts ${f?.attempts??$.length}`,`procedure ${f?.currentProcedureRunId||v0(_)||"--"}`,n.fetchedAt?`fetched ${rl(n.fetchedAt)}`:"not fetched"],data:u.node||u,onRaw:y,testId:"raw-pipeline-node-runtime"}),H(h0,{title:"Procedure runs",subtitle:`${i.length} groups`,facts:[`latest ${_.status?.status||_.status||"--"}`,`steps ${Mu(_.recentSteps).length}`,`duration ${I0(fl(_.finishedAt)&&fl(_.startedAt)?Number(fl(_.finishedAt))-Number(fl(_.startedAt)):_.durationMs)}`],data:i,onRaw:y,testId:"raw-pipeline-node-procedures"}),H(h0,{title:"OpenCode messages",subtitle:String(G.exists?"available":"not indexed"),facts:[`messages ${Vr(G.messageCount)}`,`size ${Vr(G.size)}`,`updated ${Zu(G.updatedAt)}`],data:G,onRaw:y,testId:"raw-pipeline-node-messages"}),H(h0,{title:"Control prompts",subtitle:"manual / monitor append queues",facts:[`manual tail ${N.total}`,`monitor tail ${K.total}`,`last ${Zu(LQ(N.lastAt,K.lastAt))}`],data:{controlPromptsTail:Q,monitorPromptsTail:U},onRaw:y,testId:"raw-pipeline-node-prompts"}),H(h0,{title:"Control events",subtitle:F.eventKinds.length>0?F.eventKinds.join(", "):"event tail",facts:[`tail ${F.total}`,`parsed ${F.parsed}`,`last ${Zu(F.lastAt)}`],data:J,onRaw:y,testId:"raw-pipeline-node-events"}),H(h0,{title:"Worker log",subtitle:"tail is hidden on main canvas",facts:[`tail ${j.length} lines`,"raw only via button",`procedure ${v0(_)||"--"}`],data:j,onRaw:y,testId:"raw-pipeline-node-worker-log"}))}function bC({activeRun:u,onRaw:l}){if(!u)return H(T0,{title:"暂无运行材料",text:"没有 Pipeline epoch 时不会展示运行材料索引。"});let f=Mu(u.nodes),n=Mu(u.procedureRuns),y=Mu(u.submissions),i=Mu(u.workerLogTail),_=Jw(f),$=Jw(n),A=n.filter((J)=>String(J?.status||"").toLowerCase()==="failed"),j=LQ(...n.flatMap((J)=>[J.updatedAt,J.finishedAt,J.startedAt]));return H("div",{className:"pipeline-evidence-list"},H(h0,{title:"Epoch overview",subtitle:u.runId||"--",facts:[`pipeline ${u.pipelineId||"--"}`,`status ${u.status||"--"}`,`started ${Zu(u.startedAt)}`,`updated ${Zu(u.updatedAt)}`],data:u,onRaw:l,testId:"raw-pipeline-run"}),H(h0,{title:"Node states",subtitle:`${f.length} nodes`,facts:[`running ${_.running||0}`,`succeeded ${_.succeeded||0}`,`failed ${_.failed||0}`,`pending ${_.pending||0}`],data:f,onRaw:l,testId:"raw-pipeline-run-nodes"}),H(h0,{title:"Procedure run index",subtitle:`${n.length} procedure records`,facts:[`succeeded ${$.succeeded||0}`,`failed ${$.failed||0}`,`latest ${Zu(j)}`,`errors ${A.length}`],data:n,onRaw:l,testId:"raw-pipeline-run-procedures"}),H(h0,{title:"OA submissions",subtitle:`${y.length} submission files`,facts:[`records ${y.length}`,`task ${Vr(u.task)}`,"raw grouped by run"],data:y,onRaw:l,testId:"raw-pipeline-run-submissions"}),H(h0,{title:"Worker log tail",subtitle:"hidden from main interface",facts:[`tail ${i.length} lines`,"display raw only after click",`updated ${Zu(u.updatedAt)}`],data:i,onRaw:l,testId:"raw-pipeline-run-worker-log"}))}function kC({diagnostics:u,onRaw:l}){let f=Mu(u?.runs).filter(pu),n=Mu(u?.forbiddenResiduals),y=pu(u?.guarantees)?u.guarantees:{},i=u?.hasNeutralNodeFinishedEvidence===!0&&u?.hasNoAuditPolicyEvidence===!0&&u?.hasAuditPolicyEvidence===!0,_=u?.ok===!0&&i&&n.length===0,$=f[0]||null,A=[{label:"中性完成事实",ok:y.neutralNodeFinished===!0,hint:"node-finished 不携带流程策略"},{label:"Config 策略判定",ok:y.auditPolicyFromConfig===!0,hint:"OA backend 读取当前 epoch 配置"},{label:"控制命令来自 OA",ok:y.runnerConsumesControlCommandsFromOaEvents===!0,hint:"runner 只消费 OA control.command"},{label:"无独立审核事件",ok:y.noIndependentAuditRequestEvent===!0,hint:"审核由 node-finished + policy 派生"},{label:"无批次门禁",ok:y.noBatchFinishedControlGate===!0,hint:"下游启动由每个 node 完成驱动"}];return H("div",{className:"pipeline-oa-panel","data-testid":"pipeline-oa-event-flow-panel"},H("div",{className:"metric-grid compact"},H(sf,{label:"OA Flow",value:_?"100%":"--",hint:String(u?.mode||"waiting diagnostics"),tone:_?"ok":"warn"}),H(sf,{label:"禁止残留",value:n.length,hint:n.length===0?"source scan clean":"needs cleanup",tone:n.length===0?"ok":"warn"}),H(sf,{label:"No-audit",value:u?.hasNoAuditPolicyEvidence?"OK":"--",hint:"OA 下游策略证据",tone:u?.hasNoAuditPolicyEvidence?"ok":"warn"}),H(sf,{label:"Monitor 审核",value:u?.hasAuditPolicyEvidence?"OK":"--",hint:"OA 控制事件闭环",tone:u?.hasAuditPolicyEvidence?"ok":"warn"})),H("div",{className:"pipeline-oa-guarantees"},A.map((j)=>H("article",{key:j.label,className:`pipeline-oa-guarantee ${j.ok?"ok":"warn"}`},H(Gy,{status:j.ok?"online":"warn"},j.ok?"OK":"MISS"),H("div",null,H("strong",null,j.label),H("span",null,j.hint))))),H("div",{className:"pipeline-evidence-list compact"},f.slice(0,6).map((j)=>H(h0,{key:j.runId,title:String(j.runId||"--"),subtitle:[Number(j.monitorAuditNodeFinishedCount||0)>0?"monitor audit":"",Number(j.noAuditPolicyCount||0)>0?"no-audit policy":""].filter(Boolean).join(" / ")||"event evidence",facts:[`events ${j.eventCount||0}`,`node-finished ${j.nodeFinishedCount||0}`,`policy-in-detail ${j.nodeFinishedWithPolicyCount||0}`,`queued ${j.controlQueuedCount||0}`,`applied ${j.controlAppliedCount||0}`],data:j,onRaw:l,testId:`raw-pipeline-oa-run-${String(j.runId||"run").replace(/[^a-zA-Z0-9_.-]+/g,"-")}`}))),$?H("p",{className:"muted paragraph"},`最新证据 ${$.runId}: ${$.nodeFinishedCount||0} 个 node-finished,${$.controlAppliedCount||0} 个控制结果。`):H(T0,{title:"暂无 OA 事件流证据",text:"等待 Pipeline backend 暴露 diagnostics。"}),u?H("div",{className:"panel-actions inline-actions"},H(Wn,{title:"Pipeline OA Event Flow Diagnostics",data:u,onOpen:l,testId:"raw-pipeline-oa-event-flow"})):null)}function hC({quota:u,onRaw:l}){let f=pu(u?.summary)?u.summary:{},n=pu(u?.target)?u.target:{},y=pu(u?.cache)?u.cache:{},i=u?.ok===!0,_=String(u?.modelId||f.modelName||n.modelName||"MiniMax-M2.7"),$=f.totalCount??n.currentIntervalTotalCount,A=f.usageCount??n.currentIntervalUsageCount,j=f.remainingCount??n.currentIntervalRemainingCount,J=f.remainingRatio??(Number.isFinite(Number($))&&Number($)>0&&Number.isFinite(Number(j))?Number(j)/Number($):void 0),Q=f.usageRatio??(Number.isFinite(Number($))&&Number($)>0&&Number.isFinite(Number(A))?Number(A)/Number($):void 0),U=f.resetAt||n.endAt,F=f.remainsMs??n.remainsMs,N=Number(j),K=!i||Number.isFinite(N)&&N<=0?"warn":"ok",G=[i?`endpoint ${u?.endpoint||"--"}`:"quota unavailable",`fetched ${Tr(u?.fetchedAt)}`,y.hit?`cache ${I0(y.ageMs)}`:"live quota"];return H("div",{className:"pipeline-minimax-quota-panel","data-testid":"pipeline-minimax-quota-panel"},H("div",{className:"metric-grid compact"},H(sf,{label:"MiniMax",value:i?_:"--",hint:u?.modelComponent||u?.error||"model/minimax-m27",tone:K}),H(sf,{label:"当前窗口",value:`${nQ(A)}/${nQ($)}`,hint:`已用 ${jw(Q)}`,tone:K}),H(sf,{label:"剩余额度",value:nQ(j),hint:`剩余 ${jw(J)}`,tone:K}),H(sf,{label:"重置时间",value:Tr(U),hint:F!==void 0?`约 ${I0(F)}`:Zu(U),tone:K})),H(zQ,{items:G}),i?H("p",{className:"muted paragraph"},`MiniMax 限额来自 D601 Pipeline 后端实时查询;当前模型匹配 ${f.modelName||n.modelName||_}。`):H(ul,{error:u?.error||"MiniMax 限额查询失败"}),u?H("div",{className:"panel-actions inline-actions"},H(Wn,{title:"Pipeline MiniMax Quota",data:u,onOpen:l,testId:"raw-pipeline-minimax-quota"})):null)}function IC({epochs:u,activeRun:l,activePipeline:f,pipelineNodes:n,pipelineEdges:y,runDetails:i,nodeDetails:_,nodeDetailsState:$,ganttScale:A=D6,onGanttScaleChange:j,onRunChange:J,onIntervalSelect:Q,onMarkerSelect:U,selection:F,detailOpen:N,onDetailOpenChange:K,onRaw:G}){let[W,L]=$0(ZC),[q,z]=$0({startY:0,endY:0,startMs:0,endMs:0}),[Z,T]=$0(Date.now()),X=Ky(null),c=String(l?.runId||""),S=Boolean(N),p=(Nu)=>{if(typeof K==="function")K(Nu)},Y=wy(A??D6),D=String(i?.runId||"")===c?i?.details:null,x=D?{...pu(l)?l:{},...pu(D)?D:{},runId:c,procedureRuns:Mu(D?.procedureRuns).length>0?D.procedureRuns:l?.procedureRuns}:l,V=mw(x,n,Z),t=D?mC(D,x):{markers:[],arrows:[]},M=Mu(t.markers),I=wC(x,V,M),O=VC(I,Y,V,Z),C=String(O.source||"frontend-y"),g=V.map((Nu)=>BC(Nu,O,Z)),a={startMs:Number(O.startMs),endMs:Number(O.endMs),durationMs:Math.max(1,Number(O.durationMs??Number(O.endMs)-Number(O.startMs)))},yu=HQ(Y),ru={...yu,pxPerMinute:Number(O.pxPerMinute??yu.pxPerMinute)},R=Math.round(Number(O.chartHeight||360)),m=V.some(OQ);xn(()=>{if(!c||!m)return;let Nu=window.setInterval(()=>T(Date.now()),1000);return()=>window.clearInterval(Nu)},[c,m]);let fu=QC(f,n,Array.isArray(y)?y:[]),iu=n.map((Nu)=>String(Nu?.id||"")).filter(Boolean),Ju=g.map((Nu)=>String(Nu.nodeId||"")).filter(Boolean),Vu=M.map((Nu)=>String(Nu.nodeId||"")).filter(Boolean),Lu=Array.from(new Set([...fu,...iu,...Ju,...Vu])),Bu={startY:0,endY:R,startMs:Number(a.startMs),endMs:Number(a.endMs)},b=Number(q?.endY||0)>0?q:Bu,o=(Nu)=>{return tr(Nu,a,R,O)<=Number(b.endY)&&qQ(Nu,a,R,O)>=Number(b.startY)},nu=(Nu)=>{let eu=O0(Nu,a,R,O);return eu>=Number(b.startY)&&eu<=Number(b.endY)},wu=new Set(Lu.filter((Nu)=>g.some((eu)=>eu.nodeId===Nu&&o(eu))||M.some((eu)=>eu.nodeId===Nu&&nu(eu)))),d=W?Lu.filter((Nu)=>wu.has(Nu)):Lu,zu=`${lQ}px ${d.length>0?d.map(()=>`${Cn}px`).join(" "):"minmax(160px, 1fr)"}`,v=Mu(O.ticks).filter(pu),$u=String(F?.mode==="interval"?F?.interval?.procedureRunId||"":""),Wu=String(F?.mode==="event"?F?.marker?.id||"":""),tu=()=>{let Nu=X.current;if(!Nu){z(Bu);return}let eu=Math.max(0,Nu.scrollTop-fQ),sl=Math.max(120,Nu.clientHeight-fQ),bu=Math.min(R,eu+sl),jf={startY:eu,endY:bu,startMs:Number(a.startMs),endMs:Number(a.endMs)},Mf=Math.max(0,Math.min(1,eu/R)),Jf=Math.max(Mf,Math.min(1,bu/R)),al=Math.max(1,Number(a.endMs)-Number(a.startMs));jf.startMs=Number(a.startMs)+al*Mf,jf.endMs=Number(a.startMs)+al*Jf,z(jf)};xn(()=>{let Nu=X.current,eu=window.setTimeout(tu,0);return Nu?.addEventListener("scroll",tu),window.addEventListener("resize",tu),()=>{window.clearTimeout(eu),Nu?.removeEventListener("scroll",tu),window.removeEventListener("resize",tu)}},[c,a.startMs,a.endMs,R]);let hu=Math.max(0,Lu.length-d.length),$l=new Set(M.filter((Nu)=>d.includes(String(Nu.nodeId||""))&&nu(Nu)).map((Nu)=>String(Nu.id))),gu=new Map(M.map((Nu)=>[String(Nu.id),Nu])),Sf=Mu(t.arrows).filter((Nu)=>{if(!$l.has(String(Nu.targetMarkerId||"")))return!1;if(String(Nu.action||"")==="observe")return d.includes(String(Nu.sourceNodeId||""));return $l.has(String(Nu.sourceMarkerId||""))}),Q0=lQ+Math.max(1,d.length)*Cn,ff=(Nu)=>{let eu=wy(Nu.target.value);if(typeof j==="function")j(eu);window.setTimeout(tu,0)},U0=()=>KC({title:`${f?.id||"pipeline"}-${c||"epoch"}-gantt`,meta:[`run ${c||"--"}`,`${Zu(a.startMs)} -> ${Zu(a.endMs)}`,`duration ${I0(a.durationMs)}`,`${ru.label} / ${AQ(ru.pxPerMinute)} px/min`,`${d.length}/${Lu.length} nodes`,`${M.length} markers`],visibleNodeIds:d,intervals:g,markers:M.filter((Nu)=>d.includes(String(Nu.nodeId||""))),arrows:Sf,ticks:v,bounds:a,chartHeight:R,backendLayout:O}),Pf=pu(D?.gantt?.diagnostics)?D.gantt.diagnostics:null;return H(pn,{title:"Epoch 甘特图",eyebrow:`${f?.id||"pipeline"} / ${u.length} epochs`,className:"pipeline-wide-panel",loading:i?.loading,actions:H("div",{className:"pipeline-gantt-actions"},H("select",{value:c,disabled:u.length===0,onChange:(Nu)=>J(Nu.target.value),"data-testid":"pipeline-epoch-select"},u.map((Nu)=>H("option",{key:Nu.runId,value:Nu.runId},FQ(u,Nu)))),H("label",{className:"pipeline-gantt-toggle"},H("input",{type:"checkbox","data-testid":"pipeline-gantt-auto-hide-idle",checked:W,onChange:(Nu)=>{L(Boolean(Nu.target.checked)),window.setTimeout(tu,0)}}),H("span",null,"自动隐藏空闲列")),H("label",{className:"pipeline-gantt-scale"},H("span",null,H("b",null,"时间尺度"),H("em",{"data-testid":"pipeline-gantt-scale-label"},`${ru.label} · ${AQ(ru.pxPerMinute)} px/min`)),H("input",{type:"range",min:0,max:100,step:0.01,value:Y,onChange:ff,"aria-label":"调整甘特图时间尺度","data-testid":"pipeline-gantt-time-scale"}),H("small",null,H("span",null,"全局"),H("span",null,"细节"))),l?H("button",{type:"button",className:"ghost-btn",onClick:U0,disabled:d.length===0,"data-testid":"pipeline-export-gantt"},"导出甘特图"):null,l?H(Wn,{title:`Pipeline Epoch ${l.runId}`,data:l,onOpen:G,testId:"raw-pipeline-epoch-gantt"}):null)},!l?H(T0,{title:"暂无 Epoch",text:"当前 pipeline 还没有完整运行记录。"}):g.length===0?H(T0,{title:"暂无时间区间",text:"等待 D601 Pipeline backend 在 procedure summary 中返回 startedAt / finishedAt。"}):H("div",{className:"pipeline-gantt-wrap"},H("div",{className:`pipeline-gantt-detail-layout ${S?"detail-open":"detail-collapsed"}`,"data-testid":"pipeline-gantt-detail-layout","data-sidebar-open":S?"true":"false"},H("div",{className:"pipeline-gantt-main"},H("div",{className:"pipeline-gantt-main-head"},H("div",{className:"pipeline-gantt-meta"},H("span",null,`time ${Zu(a.startMs)} -> ${Zu(a.endMs)}`),H("span",null,`duration ${I0(a.durationMs)}`),H("span",null,`scale ${ru.label} / ${AQ(ru.pxPerMinute)} px/min`),H("span",null,`layout ${C}`),Pf?H("span",null,`align ${Pf.timeAxisAlignmentOk===!1?"check":"ok"}`):null,H("span",null,`visible ${d.length}/${Lu.length} nodes`),D?H("span",null,`markers ${M.length}`):null,W&&hu>0?H("span",null,`hidden idle ${hu}`):null),!S?H("button",{type:"button",className:"pipeline-sidecar-tab right",disabled:!F?.mode,onClick:()=>p(!0),"data-testid":"pipeline-gantt-sidebar-toggle"},F?.mode?"展开详情":"点击甘特图元素展开详情"):null),H("div",{className:"pipeline-gantt-viewport",ref:X,"data-testid":"pipeline-epoch-gantt","data-pipeline-id":f?.id||"","data-run-id":c,"data-layout-source":C,"data-start-ms":String(a.startMs),"data-end-ms":String(a.endMs),"data-chart-height":String(R)},H("div",{className:"pipeline-gantt-board",style:{gridTemplateColumns:zu,minWidth:`${Q0}px`}},H("div",{className:"pipeline-gantt-head time"},"Time"),d.length===0?H("div",{className:"pipeline-gantt-head empty"},"当前时间窗无工作节点"):d.map((Nu)=>H("div",{key:`head-${Nu}`,className:"pipeline-gantt-head node",title:Nu,"data-testid":"pipeline-gantt-head-node","data-node-id":Nu},H(vM,{value:Nu}))),H("div",{className:"pipeline-gantt-time-axis",style:{height:`${R}px`}},v.map((Nu)=>{let eu=vw(Nu,a,R,O);return H("div",{key:`tick-${Nu.ms}-${eu}`,className:"pipeline-gantt-tick",style:{top:`${eu}px`},"data-testid":"pipeline-gantt-tick","data-ms":String(Nu.ms),"data-y":String(eu)},H("b",null,Zu(Nu.ms)),H("span",null,`+${I0(Number(Nu.offsetMs??Number(Nu.ms)-Number(a.startMs)))}`))})),d.length>0?H("svg",{className:"pipeline-gantt-arrow-layer",width:d.length*Cn,height:R,viewBox:`0 0 ${d.length*Cn} ${R}`,style:{left:`${lQ}px`,top:`${fQ}px`,width:`${d.length*Cn}px`,height:`${R}px`},"aria-hidden":"true"},H("defs",null,H("marker",{id:"pipeline-gantt-arrowhead",viewBox:"0 0 10 10",refX:9,refY:5,markerWidth:6,markerHeight:6,orient:"auto-start-reverse"},H("path",{d:"M 0 0 L 10 5 L 0 10 z",fill:"context-stroke"}))),Sf.map((Nu)=>{let eu=gu.get(String(Nu.targetMarkerId||""));if(!eu)return null;let sl=gu.get(String(Nu.sourceMarkerId||"")),bu=String(sl?.nodeId||Nu.sourceNodeId||""),jf=d.indexOf(bu),Mf=d.indexOf(String(eu.nodeId||""));if(jf<0||Mf<0)return null;let Jf=jf*Cn+Cn/2,al=Mf*Cn+Cn/2,B0=sl?O0(sl,a,R,O):O0(eu,a,R,O),bn=O0(eu,a,R,O);return H("path",{key:Nu.id,className:`pipeline-gantt-arrow ${String(Nu.sourceKind||"").toLowerCase()} ${String(Nu.status||"").toLowerCase()} ${String(Nu.action||"").toLowerCase()}`,d:gw(Jf,B0,al,bn),markerEnd:"url(#pipeline-gantt-arrowhead)","data-testid":String(Nu.action||"")==="observe"?"pipeline-gantt-observation-arrow":"pipeline-gantt-arrow","data-source-node-id":String(Nu.sourceNodeId||""),"data-target-node-id":String(Nu.targetNodeId||""),"data-target-marker-id":String(Nu.targetMarkerId||""),"data-action":String(Nu.action||""),"data-source-y":String(B0),"data-target-y":String(bn)})})):null,d.length===0?H("div",{className:"pipeline-gantt-empty-col",style:{height:`${R}px`}},"滚动到有活动的时间段后,相关 node 列会自动出现。"):d.map((Nu)=>{let eu=g.filter((bu)=>bu.nodeId===Nu),sl=M.filter((bu)=>String(bu.nodeId||"")===Nu);return H("div",{key:`col-${Nu}`,className:"pipeline-gantt-node-col",style:{height:`${R}px`}},eu.map((bu)=>{let jf=tr(bu,a,R,O),Mf=qQ(bu,a,R,O),Jf=Iw(bu,a,R,O),al=String(bu.procedureRunId||`${Nu}-${bu.startMs}`);return H("button",{key:al,type:"button",className:`pipeline-gantt-bar ${bu.status} ${bu.live?"live":""} ${$u===al?"selected":""}`,style:{top:`${jf}px`,height:`${Jf}px`},title:`${Nu} ${bu.status} ${Zu(bu.startedAt||bu.startMs)} -> ${Zu(bu.finishedAt||bu.endMs)}`,onClick:()=>Q(bu),"data-testid":"pipeline-gantt-line","data-node-id":Nu,"data-procedure-run-id":String(bu.procedureRunId||""),"data-status":String(bu.status||""),"data-live":bu.live?"true":"false","data-start-ms":String(bu.startMs||""),"data-end-ms":String(bu.endMs||""),"data-y1":String(jf),"data-y2":String(Mf),"data-natural-height":String(Math.max(0,Mf-jf))},H("strong",null,bu.status||"working"),H("span",null,I0(bu.durationMs)))}),sl.map((bu)=>H("button",{key:bu.id,type:"button",className:`pipeline-gantt-marker ${bu.kind} ${bu.tone||""} ${bu.status||""} ${Wu===String(bu.id)?"selected":""}`,style:{top:`${O0(bu,a,R,O)}px`},title:`${bu.label||"event"} / ${Zu(bu.timestampIso||bu.timestamp||bu.ms)}`,onClick:()=>U(bu),"data-testid":bu.kind==="prompt"?"pipeline-gantt-prompt-marker":"pipeline-gantt-control-marker","data-marker-id":String(bu.id||""),"data-ms":String(bu.ms??bu.eventMs??""),"data-y":String(O0(bu,a,R,O))})))})))),S?H(IM,{selection:F,runDetails:i,nodeDetails:_,nodeDetailsState:$,onRaw:G,onCollapse:()=>p(!1)}):null)))}function L1(){return{loading:!1,actionLoading:"",error:"",message:"",details:null,fetchedAt:null,appendPrompt:"",guidePrompt:"",modifyPrompt:"",approveReason:"",redoReason:""}}function Ly(){return{mode:"",runId:"",interval:null,marker:null}}function rQ(){return{runId:"",loading:!1,error:"",details:null,fetchedAt:null}}function O6(u,l){return`${u}/microservices/pipeline/proxy${l}`}function vC({activeRun:u,pipelineRuns:l,selectedRunId:f,onRunChange:n,selectedNodeId:y,selectedNodeConfig:i,selectedNodeRuntime:_,control:$,onControlChange:A,onFetch:j,onAction:J,onRaw:Q,onCollapse:U}){let F=String(u?.runId||""),N=String(_?.status||"pending"),K=!F||!y||$.loading||Boolean($.actionLoading),G=(L)=>(q)=>A({[L]:q.target.value,error:"",message:""}),W=l.length>0?l:u?[u]:[];return H("aside",{className:"pipeline-node-control","data-testid":"pipeline-node-control"},H("div",{className:"pipeline-node-control-head"},H("div",null,H("p",{className:"panel-eyebrow"},"Manual Node Control"),H(nl,{title:y||"点击控制图中的 node",level:3,loading:$.loading||Boolean($.actionLoading)})),H("div",{className:"pipeline-node-control-head-actions"},y?H(Gy,{status:N},N):H(Gy,{status:"pending"},"idle"),H("button",{type:"button",className:"ghost-btn mini",onClick:U,"data-testid":"pipeline-node-sidebar-collapse"},"收起"))),H("div",{className:"pipeline-control-runbar"},H("label",null,H("span",null,"目标 run"),H("select",{value:F||f,disabled:W.length===0,onChange:(L)=>n(L.target.value),"data-testid":"pipeline-node-run-select"},W.map((L)=>H("option",{key:L.runId,value:L.runId},`${L.runId||"--"} / ${L.status||"--"}`)))),H("button",{type:"button",className:"ghost-btn",disabled:K,onClick:j,"data-testid":"pipeline-node-fetch"},$.loading?"抓取中":"抓取过程"),$.details?H(Wn,{title:`Pipeline Node ${y}`,data:$.details,onOpen:Q,testId:"raw-pipeline-node-control"}):null),H("div",{className:"pipeline-control-meta"},H("span",null,H("b",null,"kind"),String(i?.kind||"--")),H("span",null,H("b",null,"procedure"),String(_?.currentProcedureRunId||"--")),H("span",null,H("b",null,"attempts"),String(_?.attempts??"--")),H("span",null,H("b",null,"updated"),Zu(u?.updatedAt))),!y?H(T0,{title:"未选择 node",text:"点击 React Flow 控制图中的任意 node 后,可抓取执行过程、追加 prompt、下发引导、增量修改、审核通过或重做。"}):null,H(ul,{error:$.error,wide:!0}),H("div",{className:"pipeline-control-actions"},H("label",null,H("span",null,"实时追加 prompt(仅 running node)"),H("textarea",{value:$.appendPrompt,onChange:G("appendPrompt"),placeholder:"让当前执行中的 agent 继续、补充检查或调整当前步骤...",rows:4,disabled:!y,"data-testid":"pipeline-node-append-input"}),H("button",{type:"button",className:"primary-btn compact",disabled:K||!String($.appendPrompt||"").trim(),onClick:()=>J("append"),"data-testid":"pipeline-node-append-button"},$.actionLoading==="append"?"追加中":"追加到运行中 node")),H("label",null,H("span",null,"下次尝试引导 prompt"),H("textarea",{value:$.guidePrompt,onChange:G("guidePrompt"),placeholder:"给该 node 下一次 attempt 的执行提示;不会立即打断当前 session。",rows:4,disabled:!y,"data-testid":"pipeline-node-guide-input"}),H("button",{type:"button",className:"ghost-btn compact",disabled:K||!String($.guidePrompt||"").trim(),onClick:()=>J("guide"),"data-testid":"pipeline-node-guide-button"},$.actionLoading==="guide"?"下发中":"下发 guide")),H("label",null,H("span",null,"完成后增量修改 prompt"),H("textarea",{value:$.modifyPrompt,onChange:G("modifyPrompt"),placeholder:"在该 node 已完成结果基础上追加修改要求;runner 会重跑目标 node,并保留同 node 既有 OA 输出作为上下文。",rows:4,disabled:!y,"data-testid":"pipeline-node-modify-input"}),H("button",{type:"button",className:"ghost-btn compact",disabled:K||!String($.modifyPrompt||"").trim(),onClick:()=>J("modify"),"data-testid":"pipeline-node-modify-button"},$.actionLoading==="modify"?"排队中":"增量修改 node")),H("label",null,H("span",null,"Monitor 审核通过原因"),H("textarea",{value:$.approveReason,onChange:G("approveReason"),placeholder:"当流程配置开启 monitor 审核时,记录审核通过原因并释放后续 node。",rows:3,disabled:!y,"data-testid":"pipeline-node-approve-input"}),H("button",{type:"button",className:"primary-btn compact",disabled:K||!String($.approveReason||"").trim(),onClick:()=>J("approve"),"data-testid":"pipeline-node-approve-button"},$.actionLoading==="approve"?"提交中":"审核通过")),H("label",null,H("span",null,"重做 / restart 原因"),H("textarea",{value:$.redoReason,onChange:G("redoReason"),placeholder:"说明为什么需要重做;runner 会重置目标 node 以及非 rework 下游 node。",rows:4,disabled:!y,"data-testid":"pipeline-node-redo-input"}),H("button",{type:"button",className:"danger-btn compact",disabled:K||!String($.redoReason||"").trim(),onClick:()=>J("redo"),"data-testid":"pipeline-node-redo-button"},$.actionLoading==="redo"?"排队中":"重做 node"))),H("div",{className:"pipeline-control-evidence"},H("strong",null,"Node 过程索引"),H(RC,{details:$.details,selectedNodeId:y,selectedNodeRuntime:_,control:$,onRaw:Q})))}function sw({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let n=u.find((e)=>e.id==="pipeline")||null,[y,i]=$0({loading:!1,error:"",health:null,snapshot:null,oaDiagnostics:null,minimaxQuota:null,refreshedAt:null}),[_,$]=$0(""),[A,j]=$0(""),[J,Q]=$0(""),[U,F]=$0(L1()),[N,K]=$0({}),[G,W]=$0(Ly()),[L,q]=$0(rQ()),[z,Z]=$0(D6),[T,X]=$0(!1),[c,S]=$0(!1),p=Ky(0),{addNotification:Y}=kf(),D=Ky(!1),x=Ky(0),V=Ky(""),t=Ky({}),M=Ky(""),I=Ky("");async function O(e={}){let Su=e.silent===!0;if(!n)return;if(D.current)return;D.current=!0;let mu=p.current+1;if(p.current=mu,!Su)i((il)=>({...il,loading:!0,error:""}));try{let il=`__unideskArrayLimit=registry.components:80,runs:${BM}`,[zl,dl,jl]=await Promise.all([qy(`${f}/microservices/pipeline/proxy/api/snapshot?${il}`,{cache:"no-store"}),qy(`${f}/microservices/pipeline/proxy/api/oa-event-flow/diagnostics`,{cache:"no-store"}).catch((kn)=>({ok:!1,error:Xu(kn,"OA event flow diagnostics failed")})),qy(`${f}/microservices/pipeline/proxy/api/model-quota/minimax`,{cache:"no-store"}).catch((kn)=>({ok:!1,error:Xu(kn,"MiniMax quota failed")}))]);if(mu!==p.current)return;let nf={ok:zl?.ok!==!1,service:"pipeline-v2-control snapshot"};i({loading:!1,error:"",health:nf,snapshot:zl,oaDiagnostics:dl,minimaxQuota:jl,refreshedAt:new Date})}catch(il){if(mu!==p.current)return;i((zl)=>({...zl,loading:!1,error:Xu(il,"Pipeline 加载失败")}))}finally{D.current=!1}}xn(()=>{if(O(),!n)return;let e=()=>{if(wr())O({silent:!0})},Su=window.setInterval(()=>{e()},$w),mu=()=>{if(wr())e()};return document.addEventListener("visibilitychange",mu),()=>{window.clearInterval(Su),document.removeEventListener("visibilitychange",mu)}},[n?.id,n?.runtime?.providerStatus,f]);let C=gM(n),g=aM(n),a=sM(n),yu=y.snapshot||{},ru=y.oaDiagnostics||null,R=y.minimaxQuota||null,{components:m,pipelines:fu,runs:iu}=oM(yu),Ju=String(iu[0]?.pipelineId||""),Vu=(Ju?fu.find((e)=>String(e.id||"")===Ju):null)||fu[0]||{},Lu=fu.find((e)=>String(e.id||"")===_)||Vu,Bu=String(Lu.id||""),b=Pw(Lu),o=wQ(Lu),nu=Zw(iu,Bu),wu=GC(iu,Bu),d=wu.find((e)=>String(e?.runId||"")===A)||nu,zu=String(L.runId||"")===String(d?.runId||"")?lC(L.details):null,v=fC(d,zu),$u=String(v?.runId||""),Wu=b.find((e)=>String(e?.id||"")===J)||null,tu=J?Mw(v,J):null,hu=eM(iu),$l=_C(m),gu=Number(y.health?.components)||Ww(yu,"registry.components",m.length),Sf=Ww(yu,"runs",iu.length),Q0=Kw(Lu,v,m),ff={nodes:Q0.nodes.map((e)=>e.id===J?{...e,selected:!0,className:`${e.className||""} selected-control-node`}:e),edges:Q0.edges},U0=fu.map((e)=>{let Su=String(e.id||"pipeline"),mu=Zw(iu,Su);return{title:`${Su}-${mu?.runId||"snapshot"}`,flow:Kw(e,mu,m)}}),Pf=String(G?.runId||$u||""),Nu=String(G?.interval?.nodeId||G?.marker?.nodeId||""),eu=Pf&&Nu?N[$Q(Pf,Nu)]||null:null,sl=Br(U.details,Pf,Nu),bu=Br(eu?.details,Pf,Nu)||sl,jf=Pf&&Nu?{...pu(eu)?eu:{},runId:Pf,nodeId:Nu,details:bu,loading:Boolean(eu?.loading)||!bu&&Boolean(U.loading)&&J===Nu,error:String(eu?.error||""),fetchedAt:eu?.fetchedAt||(sl?U.fetchedAt:null)}:null,Mf=wu.map((e)=>String(e?.runId||"")).filter(Boolean).join("|"),Jf=b.map((e)=>String(e?.id||"")).filter(Boolean).join("|");xn(()=>{M.current=J},[J]),xn(()=>{I.current=$u},[$u]),xn(()=>{if(!A||Mf.split("|").includes(A))return;j("")},[A,Mf]),xn(()=>{if(!J||Jf.split("|").includes(J))return;Q(""),F(L1()),W(Ly()),X(!1),S(!1)},[J,Jf]),xn(()=>{if(!J)X(!1)},[J]),xn(()=>{if(!G.mode)S(!1)},[G.mode]);async function al(e=$u,Su={}){if(!e){q(rQ());return}let mu=wy(Su.scale??z??D6),il=`${e}:timeline`;if(V.current===il)return;V.current=il;let zl=Su.silent===!0,dl=x.current+1;x.current=dl,q((jl)=>({runId:e,scale:mu,loading:!zl||String(jl.runId||"")!==e||!jl.details,error:"",details:zl&&jl.runId===e?jl.details:jl.runId===e?jl.details:null,fetchedAt:jl.runId===e?jl.fetchedAt:null}));try{let[jl,nf]=await Promise.all([qy(O6(f,`/api/node-control/runs/${encodeURIComponent(e)}?tail=160&view=timeline`),{cache:"no-store",strictJson:!0}),qy(O6(f,`/api/runs/${encodeURIComponent(e)}`),{cache:"no-store"}).catch((kn)=>({ok:!1,runSummaryError:Xu(kn,"抓取评分失败")}))]);if(dl!==x.current)return;q({runId:e,scale:mu,loading:!1,error:"",details:{...jl,run:pu(nf?.run)?nf.run:void 0,runSummaryError:nf?.runSummaryError},fetchedAt:new Date})}catch(jl){if(dl!==x.current)return;q((nf)=>({runId:e,scale:mu,loading:!1,error:Xu(jl,"抓取 epoch 执行过程失败"),details:nf.runId===e?nf.details:null,fetchedAt:nf.runId===e?nf.fetchedAt:null}))}finally{if(V.current===il)V.current=""}}function B0(e,Su,mu){let il=$Q(e,Su);K((zl)=>{let dl={...zl,[il]:{...pu(zl?.[il])?zl[il]:{},runId:e,nodeId:Su,...mu}},jl=Object.keys(dl);if(jl.length>32)for(let nf of jl.slice(0,jl.length-32))delete dl[nf];return dl})}async function bn(e,Su){if(!e||!Su)return;let mu=$Q(e,Su),il=Number(t.current?.[mu]||0)+1;t.current={...t.current,[mu]:il},B0(e,Su,{loading:!0,error:""});try{let zl=await qy(O6(f,`/api/node-control/runs/${encodeURIComponent(e)}/nodes/${encodeURIComponent(Su)}?tail=160`),{cache:"no-store",strictJson:!0});if(Number(t.current?.[mu]||0)!==il)return;let dl=new Date;if(B0(e,Su,{loading:!1,details:zl,fetchedAt:dl,error:""}),M.current===Su&&I.current===e)F((jl)=>({...jl,loading:!1,details:zl,fetchedAt:dl,error:""}))}catch(zl){if(Number(t.current?.[mu]||0)!==il)return;B0(e,Su,{loading:!1,error:Xu(zl,"抓取 Gantt node 详情失败")})}}xn(()=>{if(!$u){q(rQ());return}al($u);let e=()=>{if(wr())al($u,{silent:!0})},Su=window.setInterval(()=>{e()},$w),mu=()=>{if(wr())e()};return document.addEventListener("visibilitychange",mu),()=>{window.clearInterval(Su),document.removeEventListener("visibilitychange",mu)}},[$u,f]);async function af(e=$u,Su=J){if(!e||!Su){F((mu)=>({...mu,error:"请先选择 run 和 node",message:""}));return}F((mu)=>({...mu,loading:!0,error:"",message:""}));try{let mu=await qy(O6(f,`/api/node-control/runs/${encodeURIComponent(e)}/nodes/${encodeURIComponent(Su)}?tail=160`),{cache:"no-store",strictJson:!0}),il=new Date;F((zl)=>({...zl,loading:!1,details:mu,fetchedAt:il,error:""})),B0(e,Su,{loading:!1,details:mu,fetchedAt:il,error:""})}catch(mu){F((il)=>({...il,loading:!1,error:Xu(mu,"抓取 node 执行过程失败")}))}}async function A$(e){let Su=String(e?.runId||$u||""),mu=String(e?.nodeId||"");if(W({mode:"interval",runId:Su,interval:e,marker:null}),S(!0),!Su||!mu)return;if(Su!==$u)j(Su);Q(mu),F(L1()),al(Su,{silent:!0}),bn(Su,mu)}async function z1(e){let Su=String(e?.runId||$u||""),mu=String(e?.nodeId||"");if(W({mode:"event",runId:Su,interval:null,marker:e}),S(!0),!Su)return;if(Su!==$u)j(Su);if(al(Su,{silent:!0}),!mu)return;Q(mu),F(L1()),bn(Su,mu)}async function G1(e){if(!$u||!J){F((il)=>({...il,error:"请先选择 run 和 node",message:""}));return}let Su=e==="append"?"prompts":e,mu=e==="append"?U.appendPrompt:e==="guide"?U.guidePrompt:e==="modify"?U.modifyPrompt:e==="approve"?U.approveReason:U.redoReason;if(!String(mu||"").trim()){F((il)=>({...il,error:"操作内容不能为空",message:""}));return}F((il)=>({...il,actionLoading:e,error:"",message:""}));try{let il=e==="redo"||e==="approve"?{reason:mu,source:"unidesk-frontend",sourceKind:"webui"}:{prompt:mu,source:"unidesk-frontend",sourceKind:"webui"},zl=await qy(O6(f,`/api/node-control/runs/${encodeURIComponent($u)}/nodes/${encodeURIComponent(J)}/${Su}`),{method:"POST",body:JSON.stringify(il)});if(F((jl)=>({...jl,actionLoading:"",details:zl,fetchedAt:new Date,appendPrompt:e==="append"?"":jl.appendPrompt,guidePrompt:e==="guide"?"":jl.guidePrompt,modifyPrompt:e==="modify"?"":jl.modifyPrompt,approveReason:e==="approve"?"":jl.approveReason,redoReason:e==="redo"?"":jl.redoReason,message:e==="append"?"已追加到运行中 node":e==="guide"?"已下发 guide,等待 runner 处理":e==="modify"?"已排队增量修改命令":e==="approve"?"已提交审核通过决策":"已排队重做命令"})),Y("success",e==="append"?"已追加到运行中 node":e==="guide"?"已下发 guide,等待 runner 处理":e==="modify"?"已排队增量修改命令":e==="approve"?"已提交审核通过决策":"已排队重做命令"),await af($u,J),await al($u,{silent:!0}),e!=="append")await O()}catch(il){F((zl)=>({...zl,actionLoading:"",error:Xu(il,"node 控制操作失败")}))}}if(!n)return H(T0,{title:"Pipeline 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=pipeline"});return H("div",{className:"pipeline-page","data-testid":"pipeline-page"},H(pn,{title:"Pipeline v2 工作台",eyebrow:"D601 Snapshot 用户服务",loading:y.loading,actions:H("div",{className:"panel-actions"},H("button",{type:"button",className:"ghost-btn",onClick:O,disabled:y.loading,"data-testid":"pipeline-refresh-button"},y.loading?"刷新中":"刷新"),H(Wn,{title:"Pipeline 用户服务",data:n,onOpen:l,testId:"raw-pipeline-service"}))},H("div",{className:"pipeline-hero"},H("div",null,H("div",{className:"node-version-line"},H(Gy,{status:C.providerStatus==="online"?"online":"warn"},C.providerStatus||"unknown"),H("span",null,n.providerId),H("span",null,a.public?"公网暴露":"仅 UniDesk frontend 代理访问")),H("p",{className:"muted paragraph"},n.description)),H("div",{className:"microservice-ref-card"},H("span",null,"Repo"),H("strong",null,g.url||"--"),H("code",null,g.commitId||"--")),H("div",{className:"microservice-ref-card"},H("span",null,"D601 Docker"),H("strong",null,`${a.nodeBindHost||"--"}:${a.nodePort||"--"}`),H("code",null,`${g.composeFile||"--"} / ${g.composeService||"--"}`))),H(ul,{error:y.error,wide:!0})),H("div",{className:"pipeline-grid"},H(pn,{title:"控制图",eyebrow:`${Lu.id||"pipeline"} / run ${v?.status||"--"}`,className:"pipeline-wide-panel",loading:y.loading,actions:H("div",{className:"pipeline-toolbar"},H("select",{value:Bu,disabled:fu.length===0,onChange:(e)=>{$(e.target.value),j(""),Q(""),F(L1()),W(Ly()),X(!1),S(!1)},"data-testid":"pipeline-select"},fu.map((e)=>H("option",{key:e.id,value:e.id},e.id||e.key))),H("select",{value:$u,disabled:wu.length===0,onChange:(e)=>{if(j(e.target.value),F(L1()),W(Ly()),X(!1),S(!1),J)af(e.target.value,J)},"data-testid":"pipeline-run-select"},wu.map((e)=>H("option",{key:e.runId,value:e.runId},FQ(wu,e)))),H("button",{type:"button",className:"ghost-btn",disabled:ff.nodes.length===0,onClick:()=>xw(ff,`${Lu.id||"pipeline"}-${v?.runId||"snapshot"}`),"data-testid":"pipeline-export-graph"},"导出渲染图"),H("button",{type:"button",className:"ghost-btn",disabled:U0.every((e)=>e.flow.nodes.length===0),onClick:()=>zC(U0),"data-testid":"pipeline-export-all-graphs"},"批量导出"))},b.length===0?H(T0,{title:"暂无控制图",text:"等待 D601 pipeline backend 返回 config.nodes / config.edges"}):H("div",{className:`pipeline-control-shell ${T?"detail-open":"detail-collapsed"}`,"data-testid":"pipeline-control-shell","data-sidebar-open":T?"true":"false"},H("div",{className:"pipeline-flow-frame","data-testid":"pipeline-react-flow"},H(uw,{nodes:ff.nodes,edges:ff.edges,nodeTypes:tM,edgeTypes:DM,fitView:!0,fitViewOptions:{padding:0.18},nodesDraggable:!1,nodesConnectable:!1,elementsSelectable:!0,minZoom:0.25,maxZoom:1.4,proOptions:{hideAttribution:!0},onNodeClick:(e,Su)=>{let mu=String(Su.id);if(Q(mu),F(L1()),X(!0),$u)af($u,mu)}},H(fw,{gap:22,size:1,color:"rgba(215, 161, 58, 0.24)"}),H(yw,{showInteractive:!1})),!T?H("button",{type:"button",className:"pipeline-sidecar-tab right",disabled:!J,onClick:()=>X(!0),"data-testid":"pipeline-node-sidebar-toggle"},J?"展开 node 控制":"点击 node 展开控制"):null),T?H(vC,{activeRun:v,pipelineRuns:wu,selectedRunId:A,onRunChange:(e)=>{if(j(e),F(L1()),W(Ly()),J)af(e,J)},selectedNodeId:J,selectedNodeConfig:Wu,selectedNodeRuntime:tu,control:U,onControlChange:(e)=>F((Su)=>({...Su,...e})),onFetch:()=>af(),onAction:G1,onRaw:l,onCollapse:()=>X(!1)}):null),H("div",{className:"pipeline-flow-summary"},H("span",null,`${ff.nodes.length} nodes`),H("span",null,`${ff.edges.length} edges`),H("span",null,`${fu.length} pipelines`),H("span",null,`source config+components(${m.length})`),H("span",null,`run ${v?.runId||"--"}`),H("span",null,`score ${NQ(v)}`),H("span",null,J?`selected ${J}`:"click node to control"))),H(IC,{epochs:wu,activeRun:v,activePipeline:Lu,pipelineNodes:b,pipelineEdges:o,selection:G,detailOpen:c,onDetailOpenChange:S,runDetails:L,nodeDetails:bu,nodeDetailsState:jf,ganttScale:z,onGanttScaleChange:Z,onIntervalSelect:A$,onMarkerSelect:z1,onRunChange:(e)=>{if(j(e),F(L1()),W(Ly()),S(!1),J)af(e,J)},onRaw:l}),H(pn,{title:"观测指标",eyebrow:y.refreshedAt?`Updated ${rl(y.refreshedAt)}`:"Snapshot",loading:y.loading},H("div",{className:"metric-grid"},H(sf,{label:"Health",value:y.health?.ok?"OK":"--",hint:y.health?.service||"D601 /health",tone:y.health?.ok?"ok":"warn"}),H(sf,{label:"组件",value:gu,hint:"components registry",tone:yu?.registry?.ok===!1?"warn":"ok"}),H(sf,{label:"Pipeline",value:fu.length,hint:`${b.length} nodes / ${o.length} edges`}),H(sf,{label:"运行记录",value:Sf,hint:`${hu.succeeded||0} succeeded / ${hu.running||0} running`}),H(sf,{label:"OA 记录",value:Array.isArray(nu?.submissions)?nu.submissions.length:0,hint:nu?.runId||"latest run"}),H(sf,{label:"Procedure",value:Array.isArray(nu?.procedureRuns)?nu.procedureRuns.length:0,hint:nu?.status||"no run"}),H(sf,{label:"Score",value:NQ(v),hint:v?.runId||"selected epoch",tone:EQ(v)})),H("div",{className:"panel-actions inline-actions"},H(Wn,{title:"Pipeline Snapshot",data:yu,onOpen:l,testId:"raw-pipeline-snapshot"}))),H(pn,{title:"评分器",eyebrow:v?.runId||"selected epoch",loading:y.loading},H(iC,{run:v,onRaw:l})),H(pn,{title:"MiniMax 限额",eyebrow:"model/minimax-m27 quota",loading:y.loading},H(hC,{quota:R,onRaw:l})),H(pn,{title:"OA 事件流",eyebrow:"100% event-driven diagnostics",className:"pipeline-wide-panel",loading:y.loading},H(kC,{diagnostics:ru,onRaw:l})),H(pn,{title:"组件矩阵",eyebrow:`${$l.length} classes`,loading:y.loading},$l.length===0?H(T0,{title:"暂无组件",text:"等待 D601 pipeline backend 返回 registry.components"}):H("div",{className:"component-strata"},$l.map((e)=>H("article",{key:e.name,className:"component-stratum"},H("span",null,e.name),H("strong",null,e.count)))),H("div",{className:"pipeline-component-list"},m.slice(0,12).map((e)=>H("span",{key:e.key,className:"data-chip"},H("b",null,e.componentClass||"--"),H("span",null,e.id||e.key||"--"))))),H(pn,{title:"Epoch 列表",eyebrow:`${wu.length}/${Sf} preview`,loading:y.loading},wu.length===0?H(T0,{title:"暂无运行记录",text:"当前 pipeline 在 .state/pipeline-runs 中还没有 epoch。"}):H("div",{className:"pipeline-run-list"},wu.map((e)=>{let Su=String(e?.runId||"")===$u?v:e;return H("article",{key:e.runId,className:`pipeline-run-card ${String(e.runId||"")===$u?"active":""}`,role:"button",tabIndex:0,onClick:()=>{j(String(e.runId||"")),W(Ly())},onKeyDown:(mu)=>{if(mu.key==="Enter"||mu.key===" ")j(String(e.runId||"")),W(Ly())}},H("div",{className:"node-card-head"},H("strong",null,FQ(wu,e)),H(Gy,{status:e.status},e.status||"--")),H("div",{className:"docker-meta compact"},H("span",null,Su?.pipelineId||"--"),H("span",null,`nodes ${Array.isArray(Su?.nodes)?Su.nodes.length:0}`),H("span",null,`oa ${Array.isArray(Su?.submissions)?Su.submissions.length:0}`),H("span",null,`procedures ${Array.isArray(Su?.procedureRuns)?Su.procedureRuns.length:0}`),H(yC,{run:Su})),H("p",{className:"muted paragraph"},Vr(Su?.task)),H("span",{className:"pipeline-run-time"},Zu(Su?.updatedAt)))}))),H(pn,{title:"运行材料索引",eyebrow:v?.runId||"selected epoch",className:"pipeline-wide-panel",loading:y.loading},H(bC,{activeRun:v,onRaw:l}))))}var xr=ku(ql(),1);var Qu=xr.default.createElement,{useEffect:gC}=xr.default,Cr=xr.default.useState,VQ={id:"",sequenceNo:"",contractNo:"",name:"",currentStatus:"",pending:"",paymentStatus:"",notes:""};function sC({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return Qu("span",{className:`status-badge ${f}`},l||u||"unknown")}function pr({label:u,value:l,hint:f,tone:n}){return Qu("article",{className:`metric-card ${n||""}`},Qu("div",{className:"metric-label"},u),Qu("div",{className:"metric-value"},l),Qu("div",{className:"metric-hint"},f))}function BQ({title:u,eyebrow:l,actions:f,children:n,className:y,loading:i}){return Qu("section",{className:`panel ${y||""}`},Qu("div",{className:"panel-head"},Qu("div",null,l?Qu("p",{className:"panel-eyebrow"},l):null,Qu(nl,{title:u,loading:i})),f?Qu("div",{className:"panel-actions"},f):null),Qu("div",{className:"panel-body"},n))}function aw({title:u,data:l,onOpen:f,testId:n}){return Qu("button",{type:"button",className:"ghost-btn","data-testid":n,onClick:()=>f(u,l)},"查看原始JSON")}function ow({title:u,text:l}){return Qu("div",{className:"empty-state"},Qu("strong",null,u),Qu("span",null,l))}function aC(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function oC(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function dC(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function n$(u,l){return`${u}/microservices/project-manager/proxy${l}`}function eC(u){return{id:String(u.id||""),sequenceNo:u.sequenceNo===null||u.sequenceNo===void 0?"":String(u.sequenceNo),contractNo:String(u.contractNo||""),name:String(u.name||""),currentStatus:String(u.currentStatus||""),pending:String(u.pending||""),paymentStatus:String(u.paymentStatus||""),notes:String(u.notes||"")}}function up(u){return{sequenceNo:u.sequenceNo===""?null:Number(u.sequenceNo),contractNo:String(u.contractNo||"").trim(),name:String(u.name||"").trim(),currentStatus:String(u.currentStatus||"").trim(),pending:String(u.pending||"").trim(),paymentStatus:String(u.paymentStatus||"").trim(),paymentRatio:String(u.paymentStatus||"").trim(),notes:String(u.notes||"").trim()}}function XQ(u){return String(u||"item").replace(/[^A-Za-z0-9_-]+/g,"-")}function lp(u){let l=new Uint8Array(u),f="",n=32768;for(let y=0;yQu("tr",{key:y.id,className:l===y.id?"active-row":"","data-testid":`project-manager-row-${XQ(y.id)}`},Qu("td",null,y.sequenceNo??"--"),Qu("td",null,Qu("strong",null,y.contractNo||"--"),Qu("code",null,y.id||"--")),Qu("td",null,Qu("strong",null,y.name||"--"),Qu("span",{className:"muted block"},y.sourceFile||"--")),Qu("td",null,y.currentStatus||"--"),Qu("td",null,Qu("span",{className:"preline"},y.pending||"--")),Qu("td",null,Qu(sC,{status:Number(y.paymentRatio||0)>=1?"online":"warn"},y.paymentStatus||"--")),Qu("td",null,y.notes||"--"),Qu("td",null,Qu("div",{className:"inline-actions"},Qu("button",{type:"button",className:"ghost-btn",onClick:()=>f(y),"data-testid":`project-manager-edit-${XQ(y.id)}`},"编辑"),Qu(aw,{title:`Project ${y.contractNo||y.id}`,data:y,onOpen:n,testId:`raw-project-${XQ(y.id)}`}))))))))}function dw({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let n=u.find((c)=>c.id==="project-manager")||null,[y,i]=Cr({loading:!1,saving:!1,importing:!1,exporting:!1,error:"",notice:"",health:null,list:null,refreshedAt:null}),[_,$]=Cr({...VQ}),[A,j]=Cr(""),[J,Q]=Cr("all"),{addNotification:U}=kf();async function F(c=A,S=J){if(!n)return;i((p)=>({...p,loading:!0,error:""}));try{let p=new URLSearchParams({pageSize:"200",status:S});if(c.trim())p.set("q",c.trim());let[Y,D]=await Promise.all([Eu(`${f}/microservices/project-manager/health`),Eu(n$(f,`/api/projects?${p.toString()}`))]);i((x)=>({...x,loading:!1,health:Y,list:D,refreshedAt:new Date,error:""}))}catch(p){i((Y)=>({...Y,loading:!1,error:Xu(p,"Project Manager 加载失败")}))}}gC(()=>{F()},[n?.id,n?.runtime?.providerStatus]);async function N(c){c.preventDefault(),i((S)=>({...S,saving:!0,error:"",notice:""}));try{let S=up(_);if(_.id)await Eu(n$(f,`/api/projects/${encodeURIComponent(_.id)}`),{method:"PUT",body:JSON.stringify(S)});else await Eu(n$(f,"/api/projects"),{method:"POST",body:JSON.stringify(S)});let p=_.id?"项目已更新":"项目已创建";i((Y)=>({...Y,saving:!1,notice:p})),U("success",p),await F()}catch(S){i((p)=>({...p,saving:!1,error:Xu(S,"保存项目失败")}))}}async function K(){if(!_.id)return;if(!window.confirm(`删除项目 ${_.contractNo||_.name||_.id} ?`))return;i((c)=>({...c,saving:!0,error:"",notice:""}));try{await Eu(n$(f,`/api/projects/${encodeURIComponent(_.id)}`),{method:"DELETE"}),$({...VQ});let c="项目已删除";i((S)=>({...S,saving:!1,notice:c})),U("success",c),await F()}catch(c){i((S)=>({...S,saving:!1,error:Xu(c,"删除项目失败")}))}}async function G(c){let S=c.target.files?.[0];if(!S)return;i((p)=>({...p,importing:!0,error:"",notice:""}));try{let p=lp(await S.arrayBuffer()),D=`Excel 已导入 ${(await Eu(n$(f,"/api/import/excel"),{method:"POST",body:JSON.stringify({fileName:S.name,contentBase64:p,replace:!1})})).imported||0} 条项目`;i((x)=>({...x,importing:!1,notice:D})),U("success",D),c.target.value="",await F()}catch(p){i((Y)=>({...Y,importing:!1,error:Xu(p,"Excel 导入失败")}))}}async function W(){i((c)=>({...c,exporting:!0,error:""}));try{let c=await oW(n$(f,"/api/projects/export.xlsx")),S=URL.createObjectURL(c),p=document.createElement("a");p.href=S,p.download=`project-manager-${BU()}.xlsx`,document.body.appendChild(p),p.click(),p.remove(),URL.revokeObjectURL(S),i((Y)=>({...Y,exporting:!1,notice:"Excel 已导出"}))}catch(c){i((S)=>({...S,exporting:!1,error:Xu(c,"Excel 导出失败")}))}}if(!n)return Qu(ow,{title:"Project Manager 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=project-manager"});let L=aC(n),q=dC(n),z=oC(n),Z=Array.isArray(y.list?.projects)?y.list.projects:[],T=y.list?.summary||{},X=y.health||{};return Qu("div",{className:"project-manager-page","data-testid":"project-manager-page"},Qu(BQ,{title:"项目管理工作台",eyebrow:"Main Server PostgreSQL 用户服务",loading:y.loading||y.exporting,actions:Qu("div",{className:"panel-actions"},Qu("button",{type:"button",className:"ghost-btn",disabled:y.loading,onClick:()=>F(),"data-testid":"project-manager-refresh-button"},y.loading?"刷新中":"刷新"),Qu("button",{type:"button",className:"ghost-btn",disabled:y.exporting,onClick:W,"data-testid":"project-manager-export-button"},y.exporting?"导出中":"导出 Excel"),Qu(aw,{title:"Project Manager 用户服务",data:n,onOpen:l,testId:"raw-project-manager-service"}))},Qu("div",{className:"project-manager-hero"},Qu(pr,{label:"项目总数",value:T.total??Z.length,hint:`PG 表 ${X.storage?.table||"project_manager_projects"}`,tone:"ok"}),Qu(pr,{label:"进行中",value:T.active??"--",hint:"当前状态未完全完成"}),Qu(pr,{label:"已完成",value:T.completed??"--",hint:"按 完成 关键字统计",tone:"ok"}),Qu(pr,{label:"未全款",value:T.unpaid??"--",hint:"付款比例 < 1",tone:Number(T.unpaid||0)>0?"warn":"ok"})),Qu(ul,{error:y.error}),y.notice?Qu("div",{className:"form-success"},y.notice):null),Qu("div",{className:"project-manager-hero"},Qu("div",{className:"microservice-ref-card"},Qu("span",null,"Repo"),Qu("strong",null,q.url||"--"),Qu("code",null,q.commitId||"--")),Qu("div",{className:"microservice-ref-card"},Qu("span",null,"Main Server Docker"),Qu("strong",null,`${z.nodeBindHost||"--"}:${z.nodePort||"--"}`),Qu("code",null,`${q.composeService||"--"} / ${q.containerName||"--"}`)),Qu("div",{className:"microservice-ref-card"},Qu("span",null,"Runtime"),Qu("strong",null,L.providerName||n.providerId),Qu("code",null,`Health ${X.ok?"OK":"--"} / ${y.refreshedAt?rl(y.refreshedAt):"--"}`)),Qu("div",{className:"microservice-ref-card"},Qu("span",null,"Import Source"),Qu("strong",null,"D601 WeChat Excel"),Qu("code",null,"合作项目列表_I_20260309.xlsx"))),Qu("div",{className:"project-manager-layout"},Qu(BQ,{title:"项目清单",eyebrow:"CRUD + Excel Export",loading:y.loading||y.importing||y.exporting,actions:Qu("div",{className:"inline-actions project-manager-filters"},Qu("input",{value:A,onChange:(c)=>j(c.target.value),placeholder:"搜索合同号 / 项目名称 / 状态","data-testid":"project-manager-search"}),Qu("select",{value:J,onChange:(c)=>{Q(c.target.value),F(A,c.target.value)},"data-testid":"project-manager-status-filter"},Qu("option",{value:"all"},"全部"),Qu("option",{value:"active"},"进行中"),Qu("option",{value:"completed"},"已完成"),Qu("option",{value:"unpaid"},"未全款")),Qu("button",{type:"button",className:"ghost-btn",onClick:()=>F(A,J)},"筛选"))},Qu(fp,{projects:Z,activeId:_.id,onSelect:(c)=>$(eC(c)),onRaw:l})),Qu(BQ,{title:_.id?"编辑项目":"新建项目",eyebrow:"PostgreSQL Write Path",loading:y.saving||y.importing},Qu("form",{className:"stack-form project-manager-form",onSubmit:N,"data-testid":"project-manager-form"},_.id?Qu("label",null,"项目 ID",Qu("input",{value:_.id,disabled:!0})):null,Qu("label",null,"序号",Qu("input",{type:"number",value:_.sequenceNo,onChange:(c)=>$((S)=>({...S,sequenceNo:c.target.value}))})),Qu("label",null,"合同号",Qu("input",{value:_.contractNo,onChange:(c)=>$((S)=>({...S,contractNo:c.target.value})),required:!0})),Qu("label",null,"项目名称",Qu("input",{value:_.name,onChange:(c)=>$((S)=>({...S,name:c.target.value})),required:!0})),Qu("label",null,"当前状况",Qu("textarea",{value:_.currentStatus,onChange:(c)=>$((S)=>({...S,currentStatus:c.target.value}))})),Qu("label",null,"待完成",Qu("textarea",{value:_.pending,onChange:(c)=>$((S)=>({...S,pending:c.target.value}))})),Qu("label",null,"付款情况",Qu("input",{value:_.paymentStatus,onChange:(c)=>$((S)=>({...S,paymentStatus:c.target.value})),placeholder:"例如 1 / 0.5 / 50%"})),Qu("label",null,"其它",Qu("input",{value:_.notes,onChange:(c)=>$((S)=>({...S,notes:c.target.value}))})),Qu("div",{className:"inline-actions"},Qu("button",{type:"submit",className:"primary-btn",disabled:y.saving,"data-testid":"project-manager-save-button"},y.saving?"保存中":_.id?"保存修改":"创建项目"),Qu("button",{type:"button",className:"ghost-btn",onClick:()=>$({...VQ})},"清空"),_.id?Qu("button",{type:"button",className:"danger-btn",disabled:y.saving,onClick:K,"data-testid":"project-manager-delete-button"},"删除"):null)),Qu("div",{className:"project-manager-import"},Qu("p",{className:"muted paragraph"},"浏览器只访问 UniDesk frontend;后端通过同源用户服务代理写入主 PostgreSQL,不暴露 4233 公网端口。"),Qu("label",{className:"file-import"},y.importing?"导入中...":"导入 Excel",Qu("input",{type:"file",accept:".xlsx",onChange:G,disabled:y.importing,"data-testid":"project-manager-import-input"}))))))}var br=ku(ql(),1);var Fu=br.default.createElement,{useEffect:np}=br.default,r0=br.default.useState;function yp({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return Fu("span",{className:`status-badge ${f}`},l||u||"unknown")}function mr({label:u,value:l,hint:f,tone:n}){return Fu("article",{className:`metric-card ${n||""}`},Fu("div",{className:"metric-label"},u),Fu("div",{className:"metric-value"},l),Fu("div",{className:"metric-hint"},f))}function cQ({title:u,eyebrow:l,actions:f,children:n,className:y,loading:i}){return Fu("section",{className:`panel ${y||""}`},Fu("div",{className:"panel-head"},Fu("div",null,l?Fu("p",{className:"panel-eyebrow"},l):null,Fu(nl,{title:u,loading:i})),f?Fu("div",{className:"panel-actions"},f):null),Fu("div",{className:"panel-body"},n))}function ew({title:u,data:l,onOpen:f,testId:n}){return Fu("button",{type:"button",className:"ghost-btn","data-testid":n,onClick:()=>f(u,l)},"查看原始JSON")}function Rr({title:u,text:l}){return Fu("div",{className:"empty-state"},Fu("strong",null,u),Fu("span",null,l))}function ip(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function _p(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function $p(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function lZ(u){return String(u).replace(/[^a-zA-Z0-9_-]/g,"_")}function Ap(u){if(!Number.isFinite(u))return"--";return`${u.toFixed(1)}%`}function y$(u,l){return`${u}/microservices/todo-note/proxy${l}`}function fZ(u){return u.reduce((l,f)=>{let n=fZ(Array.isArray(f.children)?f.children:[]),y=Boolean(f.completed);return{total:l.total+1+n.total,completed:l.completed+(y?1:0)+n.completed,active:l.active+(y?0:1)+n.active}},{total:0,completed:0,active:0})}function DQ(u,l){let f=l==="all"||(l==="completed"?Boolean(u.completed):!u.completed),n=Array.isArray(u.children)?u.children:[];return f||n.some((y)=>DQ(y,l))}function uZ(u){return Array.isArray(u?.instances)?u.instances:[]}function YQ(u,l){for(let f of u){if(f?.id===l)return Array.isArray(f.children)?f.children:[];let n=YQ(Array.isArray(f?.children)?f.children:[],l);if(n.length>0)return n}return[]}function nZ({microservices:u,onRaw:l,apiBaseUrl:f="/api"}){let n=u.find((d)=>d.id==="todo-note")||null,[y,i]=r0(null),[_,$]=r0(null),[A,j]=r0(""),[J,Q]=r0(null),[U,F]=r0("all"),[N,K]=r0(13),[G,W]=r0(""),[L,q]=r0(""),[z,Z]=r0(""),[T,X]=r0(""),[c,S]=r0(""),[p,Y]=r0(!1),[D,x]=r0(""),[V,t]=r0(null),M=uZ(_),I=fZ(Array.isArray(J?.todos)?J.todos:[]),O=n?ip(n):{},C=n?$p(n):{},g=n?_p(n):{};async function a(d=A){let[zu,v]=await Promise.all([Eu(`${f}/microservices/todo-note/health`),Eu(y$(f,"/api/instances"))]);i(zu),$(v);let $u=uZ(v),Wu=$u.some((tu)=>tu.id===d)?d:$u[0]?.id||"";return j(Wu),Wu}async function yu(d=A){if(!d){Q(null);return}let zu=await Eu(y$(f,`/api/instances/${encodeURIComponent(d)}`));Q(zu)}async function ru(d=A){if(!n)return;Y(!0),x("");try{let zu=await a(d);await yu(zu),t(new Date)}catch(zu){x(Xu(zu,"Todo Note 加载失败"))}finally{Y(!1)}}async function R(d){if(!A)return null;x("");try{let zu=await Eu(y$(f,`/api/instances/${encodeURIComponent(A)}/actions`),{method:"POST",body:JSON.stringify({action:d})});return Q(zu),await a(A),zu}catch(zu){return x(Xu(zu,"Todo 操作失败")),null}}async function m(d){d.preventDefault();let zu=G.trim();if(!zu)return;Y(!0),x("");try{let v=await Eu(y$(f,"/api/instances"),{method:"POST",body:JSON.stringify({name:zu})});W(""),await ru(v.id)}catch(v){x(Xu(v,"创建清单失败"))}finally{Y(!1)}}async function fu(d){if(!window.confirm("确认删除这个 Todo Note 清单?"))return;Y(!0),x("");try{await Eu(y$(f,`/api/instances/${encodeURIComponent(d)}`),{method:"DELETE"}),await ru(A===d?"":A)}catch(zu){x(Xu(zu,"删除清单失败"))}finally{Y(!1)}}async function iu(d){d.preventDefault();let zu=L.trim();if(!zu)return;q(""),await R({type:"addTodo",title:zu})}async function Ju(d){if(!A)return;x("");try{let zu=await Eu(y$(f,`/api/instances/${encodeURIComponent(A)}/${d}`),{method:"POST",body:JSON.stringify({})});Q(zu),await a(A)}catch(zu){x(Xu(zu,`${d} 失败`))}}function Vu(d){Z(d.id),X(String(d.title||""))}async function Lu(d){let zu=T.trim();if(Z(""),X(""),zu)await R({type:"updateTodoTitle",todoId:d,title:zu})}async function Bu(d){let v=window.prompt("新增子任务标题")?.trim();if(!v)return;let $u=YQ(Array.isArray(J?.todos)?J.todos:[],d),Wu=new Set($u.map((gu)=>gu.id)),tu=await R({type:"addTodo",title:v,parentId:d,targetIndex:0});if(!tu)return;let hu=YQ(Array.isArray(tu?.todos)?tu.todos:[],d),$l=hu.find((gu)=>!Wu.has(gu.id));if($l&&hu[0]?.id!==$l.id)await R({type:"moveTodo",todoId:$l.id,targetParentId:d,targetIndex:0})}async function b(d,zu){if(!c)return;let v={type:"moveTodo",todoId:c,targetIndex:zu};if(d)v.targetParentId=d;S(""),await R(v)}if(np(()=>{ru()},[n?.id,n?.runtime?.providerStatus]),!n)return Fu(Rr,{title:"Todo Note 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=todo-note"});let o=M.find((d)=>d.id===A)||null,nu=Array.isArray(J?.todos)?J.todos:[],wu=nu.map((d,zu)=>({todo:d,index:zu})).filter((d)=>DQ(d.todo,U));return Fu("div",{className:"todo-note-page","data-testid":"todo-note-page"},Fu(cQ,{title:"Todo Note 工作台",eyebrow:"Main Server 用户服务",loading:p,actions:Fu("div",{className:"panel-actions"},Fu("button",{type:"button",className:"ghost-btn",disabled:p,onClick:()=>ru(A),"data-testid":"todo-note-refresh-button"},p?"刷新中":"刷新"),Fu(ew,{title:"Todo Note 用户服务",data:n,onOpen:l,testId:"raw-todo-note-service"}))},Fu("div",{className:"todo-note-hero"},Fu("div",null,Fu("div",{className:"node-version-line"},Fu(yp,{status:O.providerStatus==="online"?"online":"warn"},O.providerStatus||"unknown"),Fu("span",null,n.providerId),Fu("span",null,g.public?"公网暴露":"仅 UniDesk frontend 代理访问"),Fu("span",null,y?.ok?"Health OK":"Health --")),Fu("p",{className:"muted paragraph"},n.description)),Fu("div",{className:"microservice-ref-card"},Fu("span",null,"Repo"),Fu("strong",null,C.url||"--"),Fu("code",null,C.commitId||"--")),Fu("div",{className:"microservice-ref-card"},Fu("span",null,"Main Server Docker"),Fu("strong",null,`${g.nodeBindHost||"--"}:${g.nodePort||"--"}`),Fu("code",null,`${C.composeService||"--"} / ${C.containerName||"--"}`))),Fu(ul,{error:D,wide:!0})),Fu("div",{className:"todo-note-layout"},Fu(cQ,{title:"清单",eyebrow:`${M.length} Instances`,className:"todo-list-panel",loading:p},Fu("form",{className:"todo-create-list",onSubmit:m},Fu("input",{placeholder:"新清单名称",value:G,onChange:(d)=>W(d.target.value),"aria-label":"新清单名称"}),Fu("button",{type:"submit",className:"ghost-btn",disabled:p||!G.trim()},"创建")),M.length===0?Fu(Rr,{title:"暂无清单",text:"迁移或创建清单后会出现在这里"}):Fu("div",{className:"todo-instance-list"},M.map((d)=>Fu("button",{key:d.id,type:"button",className:`todo-instance-row ${A===d.id?"active":""}`,onClick:()=>{j(d.id),yu(d.id)},"data-testid":`todo-instance-${lZ(d.id)}`},Fu("strong",null,d.name),Fu("span",null,`${d.completedCount??0}/${d.todoCount??0} 完成`),Fu("code",null,d.id))))),Fu("div",{className:"todo-main-stack"},Fu(cQ,{title:o?.name||"待选择清单",eyebrow:V?`Updated ${rl(V)}`:"Todo Tree",loading:p,actions:J?Fu("div",{className:"panel-actions"},Fu("button",{type:"button",className:"ghost-btn",onClick:()=>R({type:"renameInstance",name:window.prompt("清单新名称",J.name)||J.name})},"重命名"),Fu("button",{type:"button",className:"ghost-btn danger",onClick:()=>fu(A)},"删除清单"),Fu(ew,{title:`Todo Instance ${A}`,data:J,onOpen:l,testId:"raw-todo-instance"})):null},!J?Fu(Rr,{title:"未选择清单",text:"左侧选择一个 Todo Note 清单"}):Fu("div",{className:"todo-workbench",style:{"--todo-font-size":`${N}px`}},Fu("div",{className:"todo-toolbar"},Fu("form",{className:"todo-add-form",onSubmit:iu},Fu("input",{placeholder:"新增根任务",value:L,onChange:(d)=>q(d.target.value),"aria-label":"新增根任务"}),Fu("button",{type:"submit",className:"ghost-btn",disabled:!L.trim()},"新增")),Fu("div",{className:"todo-filter-strip"},["all","active","completed"].map((d)=>Fu("button",{key:d,type:"button",className:`todo-filter ${U===d?"active":""}`,onClick:()=>F(d)},d==="all"?"全部":d==="active"?"未完成":"已完成"))),Fu("div",{className:"todo-toolbar-actions"},Fu("button",{type:"button",className:"ghost-btn",onClick:()=>R({type:"setAllTodosExpanded",expanded:!0})},"全部展开"),Fu("button",{type:"button",className:"ghost-btn",onClick:()=>R({type:"setAllTodosExpanded",expanded:!1})},"全部收起"),Fu("button",{type:"button",className:"ghost-btn",onClick:()=>Ju("undo")},"撤销"),Fu("button",{type:"button",className:"ghost-btn",onClick:()=>Ju("redo")},"重做"),Fu("label",{className:"todo-font-control"},"字号",Fu("input",{type:"range",min:11,max:18,value:N,onChange:(d)=>K(Number(d.target.value))})))),Fu("div",{className:"todo-stats-grid"},Fu(mr,{label:"总任务",value:I.total,hint:`${M.length} lists`}),Fu(mr,{label:"已完成",value:I.completed,hint:`${Ap(I.total?I.completed/I.total*100:0)}`,tone:"ok"}),Fu(mr,{label:"未完成",value:I.active,hint:U==="active"?"当前筛选":"active tasks",tone:I.active>0?"warn":"ok"}),Fu(mr,{label:"历史指针",value:J.historyPointer??0,hint:"undo / redo"})),Fu("div",{className:"todo-root-drop",onDragOver:(d)=>d.preventDefault(),onDrop:(d)=>{d.preventDefault(),b(null,nu.length)}},"拖到这里可移为根任务末尾"),Fu("div",{className:"todo-tree","data-testid":"todo-note-tree"},wu.length===0?Fu(Rr,{title:"没有匹配任务",text:"调整筛选或新增任务"}):wu.map(({todo:d,index:zu})=>Fu(yZ,{key:d.id,todo:d,depth:0,parentId:null,index:zu,siblingCount:nu.length,filter:U,editingId:z,editingTitle:T,setEditingTitle:X,beginEdit:Vu,saveEdit:Lu,applyTodoAction:R,addChild:Bu,dragTodoId:c,setDragTodoId:S,dropTodo:b}))))))))}function yZ(u){let{todo:l,depth:f,parentId:n,index:y,siblingCount:i,filter:_,editingId:$,editingTitle:A,setEditingTitle:j,beginEdit:J,saveEdit:Q,applyTodoAction:U,addChild:F,dragTodoId:N,setDragTodoId:K,dropTodo:G}=u,W=Array.isArray(l.children)?l.children:[],L=W.map((Z,T)=>({child:Z,childIndex:T})).filter((Z)=>DQ(Z.child,_)),q=$===l.id,z=n||null;return Fu("div",{className:"todo-row-wrap"},Fu("article",{className:`todo-row ${l.completed?"completed":""} ${N===l.id?"dragging":""}`,style:{"--todo-depth":f},draggable:!0,onDragStart:(Z)=>{K(l.id),Z.dataTransfer.effectAllowed="move"},onDragOver:(Z)=>Z.preventDefault(),onDrop:(Z)=>{Z.preventDefault(),G(l.id,W.length)},"data-testid":`todo-row-${lZ(l.id)}`},Fu("button",{type:"button",className:"todo-expand",disabled:W.length===0,onClick:()=>U({type:"toggleTodoExpanded",todoId:l.id})},W.length===0?"·":l.expanded?"▾":"▸"),Fu("input",{type:"checkbox",checked:Boolean(l.completed),onChange:()=>U({type:"toggleTodoCompleted",todoId:l.id}),"aria-label":`完成 ${l.title}`}),Fu("div",{className:"todo-title-cell",onDoubleClick:()=>J(l)},q?Fu("div",{className:"todo-edit-inline"},Fu("input",{value:A,autoFocus:!0,onChange:(Z)=>j(Z.target.value),onKeyDown:(Z)=>{if(Z.key==="Enter")Q(l.id);if(Z.key==="Escape")J({id:"",title:""})}}),Fu("button",{type:"button",className:"ghost-btn",onClick:()=>Q(l.id)},"保存")):Fu("strong",null,l.title||"Untitled"),Fu("div",{className:"todo-meta-line"},Fu("span",null,`子项 ${W.length}`),Fu("span",null,`更新 ${Zu(l.updatedAt)}`),l.reminderAt?Fu("span",{className:"todo-reminder"},`提醒 ${Zu(l.reminderAt)}`):Fu("span",null,"无提醒"))),Fu("input",{className:"todo-reminder-input",type:"datetime-local",value:L2(l.reminderAt),onChange:(Z)=>U({type:"setTodoReminder",todoId:l.id,reminderAt:XU(Z.target.value)})}),Fu("div",{className:"todo-row-actions"},Fu("button",{type:"button",className:"ghost-btn",onClick:()=>J(l)},"编辑"),Fu("button",{type:"button",className:"ghost-btn",onClick:()=>F(l.id)},"子项"),Fu("button",{type:"button",className:"ghost-btn",disabled:y<=0,onClick:()=>U({type:"moveTodo",todoId:l.id,...z?{targetParentId:z}:{},targetIndex:y-1})},"上移"),Fu("button",{type:"button",className:"ghost-btn",disabled:y<=0,onClick:()=>U({type:"moveTodo",todoId:l.id,...z?{targetParentId:z}:{},targetIndex:0})},"置顶"),Fu("button",{type:"button",className:"ghost-btn",disabled:y>=i-1,onClick:()=>U({type:"moveTodo",todoId:l.id,...z?{targetParentId:z}:{},targetIndex:y+1})},"下移"),Fu("button",{type:"button",className:"ghost-btn",disabled:!n,onClick:()=>U({type:"moveTodo",todoId:l.id,targetIndex:9999})},"提升"),Fu("button",{type:"button",className:"ghost-btn danger",onClick:()=>U({type:"deleteTodo",todoId:l.id})},"删除"))),l.expanded&&L.length>0?Fu("div",{className:"todo-children"},L.map(({child:Z,childIndex:T})=>Fu(yZ,{key:Z.id,todo:Z,depth:f+1,parentId:l.id,index:T,siblingCount:W.length,filter:_,editingId:$,editingTitle:A,setEditingTitle:j,beginEdit:J,saveEdit:Q,applyTodoAction:U,addChild:F,dragTodoId:N,setDragTodoId:K,dropTodo:G}))):null)}var iZ=ku(ql(),1),Zy=iZ.default.createElement;function _Z({title:u,items:l,actions:f,className:n,testId:y}){let i=Array.isArray(l)?l:[];return Zy("section",{className:`top-status-bar ${n||""}`,"data-testid":y},Zy("div",{className:"top-status-main"},u?Zy("strong",{className:"top-status-title"},u):null,Zy("div",{className:"top-status-chips"},i.map((_,$)=>Zy("span",{key:_?.key||`${_?.label||"status"}-${$}`,className:`top-status-chip ${_?.tone||""}`,"data-testid":_?.testId},_?.label?Zy("b",null,_.label):null,Zy("span",null,_?.value??"--"))))),f?Zy("div",{className:"top-status-actions"},f):null)}var S6=ku(ql(),1);var Hu=S6.default.createElement,{useEffect:rp,useMemo:jp}=S6.default,Jp=S6.default.useState;function $Z({status:u,children:l,title:f}){let n=String(u||"unknown").toLowerCase();return Hu("span",{className:`status-badge ${n}`,title:f},l||u||"unknown")}function kr({label:u,value:l,hint:f,tone:n}){return Hu("article",{className:`metric-card ${n||""}`},Hu("div",{className:"metric-label"},u),Hu("div",{className:"metric-value"},l),Hu("div",{className:"metric-hint"},f))}function tQ({title:u,eyebrow:l,actions:f,children:n,className:y,loading:i}){return Hu("section",{className:`panel ${y||""}`},Hu("div",{className:"panel-head"},Hu("div",null,l?Hu("p",{className:"panel-eyebrow"},l):null,Hu(nl,{title:u,loading:i})),f?Hu("div",{className:"panel-actions"},f):null),Hu("div",{className:"panel-body"},n))}function AZ({title:u,data:l,onOpen:f,testId:n}){return Hu("button",{type:"button",className:"ghost-btn","data-testid":n,onClick:()=>f?.(u,l)},"查看原始JSON")}function SQ({title:u,text:l}){return Hu("div",{className:"empty-state"},Hu("strong",null,u),Hu("span",null,l))}function i$(u){return Array.isArray(u)?u:[]}function PQ(u){return u&&typeof u==="object"&&!Array.isArray(u)?u:{}}function Qp(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function Up(u,l){return`${u}/microservices/k3sctl-adapter/proxy${l}`}function Np(u){return u.find((l)=>String(l?.id||"")==="k3sctl-adapter")||null}function Fp(u){if(u?.healthy===!0)return"online";if(String(u?.role||"")==="standby")return"warn";return"failed"}function Wp(u){return u?.healthy===!0?"online":"failed"}function qp(u){if(u===!0)return"YES";if(u===!1)return"NO";return"--"}function Lp(u){return Array.from(new Set(u.flatMap((l)=>i$(l?.expectedNodeIds).map((f)=>String(f))))).filter(Boolean).sort()}function Kp(u){let l=u.find((f)=>f?.id==="code-queue")||u[0];return String(l?.activeInstanceId||"--")}function zp(u){return Hu("article",{key:u?.id||u?.nodeId,className:"k3s-instance-card"},Hu("div",{className:"node-card-head"},Hu("strong",null,u?.nodeId||u?.id||"--"),Hu($Z,{status:Fp(u)},u?.healthy?"HEALTHY":"DEGRADED")),Hu("div",{className:"k3s-instance-role"},Hu("span",null,String(u?.role||"worker").toUpperCase()),Hu("code",null,u?.id||"--")),Hu("dl",{className:"k3s-kv"},Hu("dt",null,"Base URL"),Hu("dd",null,Hu("code",null,u?.baseUrl||"--")),Hu("dt",null,"Proxy"),Hu("dd",null,u?.proxyMode||"--"),Hu("dt",null,"Health"),Hu("dd",null,`${u?.upstreamStatus??"--"} / ${u?.status||"unknown"}`),Hu("dt",null,"Checked"),Hu("dd",null,Zu(u?.checkedAt))))}function Gp(u,l){let f=i$(u?.instances),n=PQ(u?.active);return Hu(tQ,{key:u?.id||"service",title:u?.id||"managed-service",eyebrow:`${u?.namespace||"unidesk"} / k3s managed service`,className:"k3s-service-panel",actions:Hu(AZ,{title:`k3s service ${u?.id||""}`,data:u,onOpen:l,testId:`raw-k3s-service-${u?.id||"unknown"}`})},Hu("div",{className:"k3s-service-summary"},Hu("div",null,Hu("span",null,"状态"),Hu($Z,{status:Wp(u)},u?.status||"unknown")),Hu("div",null,Hu("span",null,"Active"),Hu("strong",null,u?.activeInstanceId||"--")),Hu("div",null,Hu("span",null,"Single Writer"),Hu("strong",null,qp(u?.singleWriter))),Hu("div",null,Hu("span",null,"Active Health"),Hu("strong",null,n?.upstreamStatus??"--"))),f.length===0?Hu(SQ,{title:"暂无 k3s 实例",text:"adapter 没有返回该服务的 endpoint 列表"}):Hu("div",{className:"k3s-instance-grid"},f.map(zp)))}function rZ({microservices:u,onRaw:l,apiBaseUrl:f,onNavigate:n}){let y=Np(Array.isArray(u)?u:[]),i=Qp(y),[_,$]=Jp({loading:!1,error:"",data:null,refreshedAt:null});async function A(){$((L)=>({...L,loading:!0,error:""}));try{let L=await Eu(Up(f,"/api/control-plane"));$({loading:!1,error:"",data:L,refreshedAt:new Date})}catch(L){$((q)=>({...q,loading:!1,error:Xu(L,"加载 k3s 控制平面失败")}))}}rp(()=>{A()},[f]);let j=jp(()=>i$(_.data?.services),[_.data]),J=Lp(j),Q=j.filter((L)=>L?.healthy===!0).length,U=j.reduce((L,q)=>L+i$(q?.instances).length,0),F=j.reduce((L,q)=>L+i$(q?.instances).filter((z)=>z?.healthy===!0).length,0),N=Kp(j),K=PQ(_.data?.kubectl),G=PQ(_.data?.kubeApiProxy),W=i$(_.data?.manifestPaths).map((L)=>String(L));if(!y)return Hu(SQ,{title:"k3sctl-adapter 未登记",text:"请在 config.json 的 microservices 中登记 id=k3sctl-adapter,并通过该微服务连接 k3s 控制平面。"});return Hu("div",{className:"k3s-page","data-testid":"k3sctl-page"},Hu(tQ,{title:"k3s Control Plane",eyebrow:"Managed by k3sctl-adapter",className:"k3s-hero-panel",loading:_.loading,actions:Hu(S6.default.Fragment,null,Hu("button",{type:"button",className:"ghost-btn",onClick:A,disabled:_.loading,"data-testid":"k3s-refresh-button"},_.loading?"刷新中":"刷新"),n?Hu("button",{type:"button",className:"ghost-btn",onClick:()=>n("apps","code-queue"),"data-testid":"k3s-open-code-queue"},"打开 Code Queue"):null,Hu(AZ,{title:"k3sctl-adapter microservice",data:y,onOpen:l,testId:"raw-k3s-adapter"}))},Hu("div",{className:"k3s-hero"},Hu("div",{className:"k3s-orb","aria-hidden":"true"},Hu("span",null,"k3s")),Hu("div",{className:"k3s-hero-copy"},Hu("p",{className:"eyebrow"},"D601 native control plane"),Hu("h2",null,"UniDesk 只管理 adapter;业务微服务交给 k3s 标准服务路由"),Hu("p",{className:"muted paragraph"},"Code Queue 的前端/API 请求进入 k3sctl-adapter,再由 adapter 转发到 k3s active service。provider-gateway 只用于维护 adapter 和节点诊断,不再直接管理 Code Queue 容器。"),Hu("div",{className:"k3s-route-strip"},Hu("span",null,"NO FALLBACK"),Hu("code",null,_.data?.runtimePath||"frontend -> backend-core -> k3sctl-adapter")))),Hu("div",{className:"metric-grid"},Hu(kr,{label:"控制面",value:_.data?.clusterId||"D601",hint:`adapter ${i.providerStatus||"unknown"}`,tone:i.providerStatus==="online"?"ok":"warn"}),Hu(kr,{label:"代管服务",value:j.length,hint:`${Q}/${j.length||0} healthy`,tone:Q===j.length&&j.length>0?"ok":"warn"}),Hu(kr,{label:"节点",value:J.join(" / ")||"--",hint:"expected k3s nodes"}),Hu(kr,{label:"实例",value:`${F}/${U}`,hint:`active ${N}`,tone:F===U&&U>0?"ok":"warn"})),Hu("div",{className:"k3s-control-plane-grid"},Hu("article",{className:"k3s-control-plane-card"},Hu("span",null,"service proxy"),Hu("strong",null,G.configured===!0?"K8S API PROXY":"PROXY DEGRADED"),Hu("p",null,G.configured===!0?`${G.mode||"kubernetes-api-service-proxy"} via ${G.connectHost||"--"}`:"adapter 必须通过 k8s API service proxy 访问业务服务,不回退到业务容器直连。")),Hu("article",{className:"k3s-control-plane-card"},Hu("span",null,"manifests"),Hu("strong",null,W.length||"--"),Hu("p",null,W.join(" / ")||"未配置 manifest")),Hu("article",{className:"k3s-control-plane-card"},Hu("span",null,"cluster snapshot"),Hu("strong",null,K.enabled===!0?K.ok===!0?"KUBECTL OK":"KUBECTL DEGRADED":"API ONLY"),Hu("p",null,K.enabled===!0?`nodes ${K.nodeCount??"--"}`:"控制面页面以 adapter 返回的 k8s service proxy 状态为准;kubectl 只作为可选快照。"))),_.error?Hu(ul,{error:_.error}):null,_.refreshedAt?Hu("p",{className:"muted paragraph"},`最近刷新 ${rl(_.refreshedAt)}`):null),j.length===0?Hu(tQ,{title:"代管服务",eyebrow:"k3s services",loading:_.loading},Hu(SQ,{title:"暂无 k3s 服务",text:"等待 k3sctl-adapter 返回 /api/services;Code Queue 应显示 D601 scheduler/read/write 服务实例。"})):j.map((L)=>Gp(L,l)))}var P6=ku(ql(),1);var uf=P6.default.createElement;function jZ({onClose:u}){let{notifications:l,removeNotification:f,clearNotifications:n}=kf(),y=P6.default.useRef(null);if(P6.default.useEffect(()=>{let i=(_)=>{if(y.current&&!y.current.contains(_.target))u()};return document.addEventListener("mousedown",i),()=>document.removeEventListener("mousedown",i)},[u]),l.length===0)return uf("div",{className:"notification-popup",ref:y},uf("div",{className:"notification-popup-header"},uf("span",null,"通知"),uf("button",{className:"notification-popup-close",onClick:u},"×")),uf("div",{className:"notification-popup-empty"},"暂无通知"));return uf("div",{className:"notification-popup",ref:y},uf("div",{className:"notification-popup-header"},uf("span",null,`通知 (${l.length})`),uf("div",{className:"notification-popup-actions"},uf("button",{className:"notification-popup-clear",onClick:n},"清空"),uf("button",{className:"notification-popup-close",onClick:u},"×"))),uf("div",{className:"notification-popup-list"},l.slice().reverse().map((i)=>uf("div",{key:i.id,className:`notification-item ${i.type}`},uf("span",{className:"notification-item-icon"},i.type==="success"?"✓":"×"),uf("span",{className:"notification-item-message"},i.message),uf("button",{className:"notification-item-dismiss",onClick:()=>f(i.id)},"×")))))}function JZ({notification:u}){let{removeNotification:l}=kf();return P6.default.useEffect(()=>{let f=setTimeout(()=>{l(u.id)},3000);return()=>clearTimeout(f)},[u.id,l]),uf("div",{className:`notification-banner ${u.type}`,role:"alert"},uf("span",{className:"notification-banner-icon"},u.type==="success"?"✓":"×"),uf("span",{className:"notification-banner-message"},u.message),uf("button",{className:"notification-banner-dismiss",onClick:()=>l(u.id)},"×"))}function EZ(u,l){let f=document.getElementById("root")?.getAttribute(u);if(!f)return l;try{let n=JSON.parse(f);return typeof n==="object"&&n!==null&&!Array.isArray(n)?n:l}catch{return l}}var su=EZ("data-config",{apiBaseUrl:"/api",authUsername:"admin"}),QZ=su.environment&&typeof su.environment==="object"?su.environment:{},wp=EZ("data-codex-overview",null),r=Hy.default.createElement,{useEffect:mn,useMemo:p6}=Hy.default,du=Hy.default.useState,xQ=Hy.default.createContext(!1),g0=yK(WA),Zp={id:"code-queue",name:"Code Queue",providerId:"D601",description:"Code Queue",repository:{containerName:"k3s:code-queue"},backend:{nodeBaseUrl:"k3s://code-queue",nodeBindHost:"k3s://unidesk/code-queue",nodePort:4222,proxyMode:"k3sctl-adapter-http",public:!1},deployment:{mode:"k3sctl-managed",adapterServiceId:"k3sctl-adapter",k3sServiceId:"code-queue"},runtime:{orchestrator:"k3sctl",providerStatus:"loading",providerName:"D601"}};function UZ(){return typeof document>"u"||document.visibilityState!=="hidden"}function HZ(u){return u?.environment==="dev"||u?.namespace==="unidesk-dev"}function Ep(u){let l=typeof u==="string"?u:"";return l.length>=7?l.slice(0,7):l||"unknown"}function Hp(u,l){if(u==="ops"&&l==="status")return 5000;if(u==="nodes"&&l==="monitor")return 5000;if(u==="tasks"&&(l==="dispatch"||l==="scheduled"||l==="pending"))return 5000;if(u==="nodes"||u==="ops")return 1e4;if(u==="apps")return 15000;if(u==="tasks")return 15000;return 30000}async function Op(u){if(!u?._summaryOnly||!u?.id)return u;return(await Eu(`${su.apiBaseUrl}/tasks/${encodeURIComponent(String(u.id))}`))?.task||u}function x6(u){return u?._summaryOnly?{...u,_loadRaw:()=>Op(u)}:u}function Rn(u){if(!Number.isFinite(u))return"--";let l=Math.max(0,u);if(l===0)return"0s";if(l<0.01)return"<0.01s";if(l<0.1)return`${l.toFixed(2)}s`;if(l<1)return`${l.toFixed(1)}s`;if(l<10&&!Number.isInteger(l))return`${l.toFixed(1)}s`;if(l<60)return`${Math.round(l)}s`;let f=Math.floor(l);if(f<3600)return`${Math.floor(f/60)}m ${f%60}s`;return`${Math.floor(f/3600)}h ${Math.floor(f%3600/60)}m`}function V0(u){let l=Number(u);if(!Number.isFinite(l))return"--";if(l<1)return`${Math.max(0,l).toFixed(1)}ms`;if(l<10)return`${l.toFixed(1)}ms`;if(l<1000)return`${Math.round(l)}ms`;return Rn(l/1000)}function wf(u){let l=Number(u);if(!Number.isFinite(l)||l<=0)return"--";let f=["B","KB","MB","GB","TB"],n=l,y=0;while(n>=1024&&y0)return f[n]}return"任务失败但 provider 未返回明确原因"}function Zi(u){if(u===null||u===void 0)return"--";if(typeof u==="boolean")return u?"是":"否";if(typeof u==="number")return String(u);if(typeof u==="string")return u.length>80?`${u.slice(0,77)}...`:u;if(Array.isArray(u))return`${u.length} 项`;if(typeof u==="object")return`${Object.keys(u).length} 字段`;return String(u)}function Vp(u,l){let f=u.replace(/[-_\s]/g,"").toLowerCase(),n=f==="ts"||f.endsWith("at")||f.endsWith("timestamp")||f.endsWith("heartbeat");if((typeof l==="string"||typeof l==="number")&&n){let y=Zu(l);if(y!=="--")return y}if(u==="bodyText"&&typeof l==="string")return`${/^\s*[{[]/.test(l)?"JSON":"HTTP"} body ${l.length} chars`;return Zi(l)}function VZ(u){if(!u||typeof u!=="object"||Array.isArray(u))return[];return Object.entries(u)}function J0(u){return String(u).replace(/[^a-zA-Z0-9_-]/g,"_")}function RQ(u,l){return u&&typeof u==="object"&&!Array.isArray(u)?u[l]:void 0}function Ir(u,l,f="未知"){let n=RQ(u?.labels,l);return typeof n==="string"&&n.length>0?n:f}function BZ(u){return Ir(u,"providerGatewayVersion")}function C6(u){return Ir(u,"providerGatewayUpgradePolicy")}function NZ(u){return Ir(u,"providerGatewayStartedAt","")}function XZ(u){let l=RQ(u?.labels,"unideskCapabilities");if(typeof l==="string")return l.split(",").map((f)=>f.trim()).filter(Boolean);return Array.isArray(l)?l.filter((f)=>typeof f==="string"):[]}function cZ(u,l){return XZ(u).includes(l)}function FZ(u,l){let f=RQ(u?.labels,l);return f===!0||f==="true"||f==="1"}function Bp(u){if(!cZ(u,"host.ssh"))return{tone:"fail",label:"不可用",detail:"未声明 host.ssh"};if(!FZ(u,"hostSshConfigured"))return{tone:"warn",label:"未配置",detail:"缺少 SSH 环境变量"};if(!FZ(u,"hostSshKeyPresent"))return{tone:"warn",label:"缺 key",detail:"私钥未挂载"};return{tone:"ok",label:"可用",detail:Ir(u,"hostSshTarget","host.ssh ready")}}function Xp(u){if(!cZ(u,"provider.upgrade"))return{tone:"fail",label:"不可用",detail:"未声明 provider.upgrade"};let l=C6(u);if(l!=="always-enabled")return{tone:"warn",label:"待确认",detail:`策略 ${l}`};return{tone:"ok",label:"可用",detail:"always-enabled"}}function bQ(u){let l=typeof u==="string"&&u.length>0?u:"未知";if(l==="未知")return"版本未知";return l.startsWith("v")?l:`v${l}`}function YZ(u){return u?.payload&&typeof u.payload==="object"&&!Array.isArray(u.payload)?u.payload:{}}function vr(u){return u?.result&&typeof u.result==="object"&&!Array.isArray(u.result)?u.result:{}}function hr(u){let l=YZ(u),f=vr(u);return(l.mode??f.mode)==="schedule"?"schedule":"plan"}function cp(u){let l=YZ(u).source;return typeof l==="string"&&l.length>0?l:"unknown"}function Yp(u){let l=vr(u),f=l.plan&&typeof l.plan==="object"&&!Array.isArray(l.plan)?l.plan:{},n=l.policy??f.policy;return typeof n==="string"&&n.length>0?n:"--"}function DZ(u){let l=vr(u),f=l.plan&&typeof l.plan==="object"&&!Array.isArray(l.plan)?l.plan:{},n=l.targetProviderGatewayVersion??l.providerGatewayVersion??f.targetProviderGatewayVersion??f.providerGatewayVersion;return typeof n==="string"&&n.length>0?bQ(n):"版本未知"}function tZ(u){if(String(u?.status||"").toLowerCase()==="failed")return TZ(u);if($$(u))return"等待 provider 回传升级终态";let f=vr(u);if(typeof f.updaterContainerId==="string"&&f.updaterContainerId.length>0)return`updater ${f.updaterContainerId.slice(0,18)}`;if(typeof f.message==="string"&&f.message.length>0)return f.message;if(f.plan)return"升级计划已生成";return"无升级结果摘要"}function SZ(u,l){return u.filter((f)=>f?.providerId===l&&f?.command==="provider.upgrade").sort((f,n)=>(j0(n.updatedAt)??0)-(j0(f.updatedAt)??0))}function Dp(u){return u.find((l)=>hr(l)==="schedule")||u[0]||null}function PZ(u){return u?.runtime&&typeof u.runtime==="object"&&!Array.isArray(u.runtime)?u.runtime:{}}function WZ(u){return u?.backend&&typeof u.backend==="object"&&!Array.isArray(u.backend)?u.backend:{}}function tp(u){return u?.repository&&typeof u.repository==="object"&&!Array.isArray(u.repository)?u.repository:{}}function Hl({status:u,children:l}){let f=String(u||"unknown").toLowerCase();return r("span",{className:`status-badge ${f}`},l||u||"unknown")}function Kl({label:u,value:l,hint:f,tone:n,onClick:y,testId:i}){let _=typeof y==="function";return r("article",{className:`metric-card ${n||""} ${_?"clickable":""}`,role:_?"button":void 0,tabIndex:_?0:void 0,"data-testid":i,onClick:y,onKeyDown:_?($)=>{if($.key==="Enter"||$.key===" ")$.preventDefault(),y()}:void 0},r("div",{className:"metric-label"},u),r("div",{className:"metric-value"},l),r("div",{className:"metric-hint"},f))}function yl({title:u,eyebrow:l,actions:f,children:n,className:y,loading:i}){let _=Hy.default.useContext(xQ),$=Boolean(i)||_;return r("section",{className:`panel ${y||""}`},r("div",{className:"panel-head"},r("div",null,l?r("p",{className:"panel-eyebrow"},l):null,r(nl,{title:u,loading:$})),f?r("div",{className:"panel-actions"},f):null),r("div",{className:"panel-body"},n))}function lf({title:u,data:l,onOpen:f,testId:n}){let[y,i]=du(!1),_=l&&typeof l==="object"&&typeof l._loadRaw==="function"?l._loadRaw:null;async function $(){if(!_){f(u,l);return}i(!0);try{f(u,await _())}catch(A){f(u,{ok:!1,error:Xu(A,"读取原始 JSON 失败"),fallback:l})}finally{i(!1)}}return r("button",{type:"button",className:"ghost-btn","data-testid":n,disabled:y,onClick:()=>void $()},y?"读取中":"查看原始JSON")}function Sp({raw:u,onClose:l}){if(!u)return null;return r("div",{className:"modal-backdrop",role:"presentation"},r("section",{className:"raw-dialog",role:"dialog","aria-modal":"true","aria-label":u.title},r("div",{className:"raw-dialog-head"},r("h2",null,u.title),r("button",{type:"button",className:"ghost-btn",onClick:l},"关闭")),r("pre",{className:"raw-json","data-testid":"raw-json"},JSON.stringify(u.data,null,2))))}function MZ({labels:u,limit:l=8}){let f=VZ(u).slice(0,l);if(f.length===0)return r("span",{className:"muted"},"无标签");return r("div",{className:"chip-row"},f.map(([n,y])=>r("span",{key:n,className:"data-chip"},r("b",null,n),r("span",null,Zi(y)))))}function _$({node:u}){let l=BZ(u);return r("span",{className:`version-chip ${l==="未知"?"unknown":""}`,"data-testid":`gateway-version-${J0(u?.providerId||"unknown")}`},bQ(l))}function qZ({title:u,state:l,testId:f}){return r("span",{className:`capability-badge ${l.tone}`,title:l.detail,"data-testid":f},r("b",null,u),r("strong",null,l.label),r("small",null,l.detail))}function kQ({node:u}){let l=J0(u?.providerId||"unknown");return r("div",{className:"node-availability-strip"},r(qZ,{title:"SSH 透传",state:Bp(u),testId:`ssh-availability-${l}`}),r(qZ,{title:"远程更新",state:Xp(u),testId:`upgrade-availability-${l}`}))}function Oy({data:u,empty:l="无数据"}){if(u===null||u===void 0)return r("span",{className:"muted"},l);if(typeof u!=="object")return r("span",{className:"summary-value"},Zi(u));if(Array.isArray(u))return r("span",{className:"summary-value"},`${u.length} 项列表`);let f=Object.entries(u).slice(0,5);if(f.length===0)return r("span",{className:"muted"},l);return r("div",{className:"summary-grid"},f.map(([n,y])=>r("span",{key:n,className:"summary-item"},r("b",null,n),r("span",null,Vp(n,y)))))}function Gl({title:u,text:l}){return r("div",{className:"empty-state"},r("strong",null,u),r("span",null,l))}function Pp({onLogin:u}){let[l,f]=du(su.authUsername||"admin"),[n,y]=du(""),[i,_]=du(""),[$,A]=du(!1);async function j(J){J.preventDefault(),A(!0),_("");try{let Q=await Eu("/login",{method:"POST",body:JSON.stringify({username:l,password:n})});u(Q)}catch(Q){_(Xu(Q,"登录失败"))}finally{A(!1)}}return r("main",{className:"login-screen","data-testid":"login-screen"},r("section",{className:"login-card"},r("div",{className:"login-brand"},r("span",{className:"brand-mark"},"UD"),r("div",null,r("h1",null,"UniDesk"),r("p",null,"Control Plane Login"))),r("form",{className:"login-form",onSubmit:j},r("label",null,"账号",r("input",{name:"username",autoComplete:"username",value:l,onChange:(J)=>f(J.target.value)})),r("label",null,"密码",r("input",{name:"password",type:"password",autoComplete:"current-password",value:n,onChange:(J)=>y(J.target.value)})),r(ul,{error:i}),r("button",{type:"submit",disabled:$},$?"登录中":"登录")),r("div",{className:"login-note"},"默认账号由 config.json 注入;公网入口只暴露前端登录面。")))}function Mp({connection:u,lastRefresh:l,onRefresh:f,onLogout:n,session:y,clock:i,activeStatusItems:_=[],onNotificationToggle:$,unreadCount:A=0,environment:j={}}){let J=HZ(j),Q=[...J?[{key:"environment",label:"环境",value:`${j.namespace||"unidesk-dev"}`,tone:"warn"}]:[],{key:"core",label:"核心",value:u.text,tone:u.ok?"ok":"fail",testId:"conn-text"},...Array.isArray(_)?_:[],{key:"refresh",label:"刷新",value:l?rl(l):"未刷新"},{key:"clock",label:_8,value:rl(i)},{key:"user",label:"用户",value:y?.user?.username||"--",tone:"user"}];return r("header",{className:"topbar"},r("div",null,r("p",{className:"eyebrow"},"Distributed Work Platform"),r("h1",null,"UniDesk 控制平面"),J?r("div",{className:"dev-env-ribbon","data-testid":"dev-environment-ribbon"},r("b",null,"DEV"),r("span",null,j.namespace||"unidesk-dev"),r("span",null,j.deployRef||"origin/master:deploy.json#environments.dev"),r("span",null,Ep(j.commit||j.requestedCommit))):null),r(_Z,{className:"global-top-status",title:"状态",items:Q,actions:[r("button",{key:"notification",type:"button",className:`notification-icon-btn ${A>0?"has-unread":""}`,onClick:$,"aria-label":"通知"},"\uD83D\uDD14",A>0?r("span",{key:"badge",className:"notification-badge"},A>99?"99+":A):null),r("button",{key:"refresh",type:"button",className:"ghost-btn",onClick:f},"刷新"),r("button",{key:"logout",type:"button",className:"ghost-btn danger",onClick:n},"退出")]}))}function Cp(u){return!u.defaultPrevented&&u.button===0&&!u.metaKey&&!u.altKey&&!u.ctrlKey&&!u.shiftKey&&u.currentTarget.target!=="_blank"}function CZ({moduleId:u,tabId:l,className:f,active:n=!1,title:y,testId:i,onNavigate:_,children:$}){let A=qA(g0,u,l);return r("a",{href:A,role:"button",className:f,title:y,"aria-current":n?"page":void 0,"data-testid":i,"data-route":A,onClick:(j)=>{if(!Cp(j))return;j.preventDefault(),_(u,l)}},$)}function pp({activeModule:u,activeTabs:l,onNavigate:f,collapsed:n,onToggle:y}){return r("aside",{className:`rail ${n?"collapsed":""}`,"aria-label":"主模块"},r("div",{className:"brand"},r("span",{className:"brand-mark"},"UD"),r("span",{className:"brand-text"},"UniDesk"),r("button",{type:"button",className:"rail-toggle",onClick:y,"aria-label":n?"展开左侧边栏":"收起左侧边栏","data-testid":"rail-toggle"},n?"»":"«")),WA.map((i)=>{let _=l[i.id]||k3[i.id]||i.tabs[0]?.id||"";return r(CZ,{key:i.id,moduleId:i.id,tabId:_,className:`module ${u===i.id?"active":""}`,active:u===i.id,title:i.label,onNavigate:f},r("span",{className:"module-code"},i.code),r("span",null,i.label))}))}function xp({module:u,activeTab:l,onNavigate:f}){return r("nav",{className:"tabs","aria-label":`${u.label} 子功能`},u.tabs.map((n)=>r(CZ,{key:n.id,moduleId:u.id,tabId:n.id,className:`tab ${l===n.id?"active":""}`,active:l===n.id,onNavigate:f},n.label)))}function mp({data:u,onRaw:l,onNavigate:f}){let n=u.overview||{},y=u.nodes.filter((F)=>F.status==="online"),i=u.pendingTasks||u.tasks.filter($$),_=n.pendingTaskCount??i.length,$=u.tasks.slice(0,5),A=n.pgdata||{},j=n.microserviceAvailability||{},J=Ru(j.totalCount),Q=Ru(j.healthyCount),U=Ru(j.unhealthyCount);return r("div",{className:"page-grid overview-grid","data-testid":"overview-page"},r(yl,{title:"核心指标",eyebrow:"Control"},r("div",{className:"metric-grid"},r(Kl,{label:"数据库",value:n.dbReady?"READY":"WAIT",hint:"PostgreSQL internal network",tone:n.dbReady?"ok":"warn"}),r(Kl,{label:"PGDATA",value:wf(A.databaseBytes),hint:`${A.volumeName||"unidesk_pgdata_10gb"} / ${A.databasePretty||"--"} / budget ${A.volumeSize||"--"}`,tone:"ok",testId:"pgdata-usage-card"}),r(Kl,{label:"在线节点",value:n.onlineNodeCount??0,hint:`${n.nodeCount??0} registered`,tone:"ok"}),r(Kl,{label:"WebSocket",value:n.activeSocketCount??0,hint:"Provider ingress sockets"}),r(Kl,{label:"用户服务可用",value:J>0?`${Q}/${J}`:"--",hint:J>0?`healthyCount ${Q} · unhealthyCount ${U}`:"strict /health probes",tone:J>0&&U===0?"ok":"warn",testId:"microservice-availability-card"}),r(Kl,{label:"待处理任务",value:_,hint:_>0?"点击查看具体任务":`timeout ${Rn(Math.floor((n.taskPendingTimeoutMs??0)/1000))}`,tone:_>0?"warn":"ok",onClick:()=>f("tasks","pending"),testId:"pending-task-card"}))),r(yl,{title:"本机 Provider",eyebrow:"Self Connected"},y.length===0?r(Gl,{title:"暂无在线节点",text:"provider-gateway 未完成自接入"}):r("div",{className:"node-card-list"},y.slice(0,4).map((F)=>r(Rp,{key:F.providerId,node:F,onRaw:l})))),r(yl,{title:"待处理任务明细",eyebrow:`${_} Pending`,actions:r("button",{type:"button",className:"ghost-btn",onClick:()=>f("tasks","pending"),"data-testid":"pending-task-detail-link"},"进入任务调度")},i.length===0?r(Gl,{title:"当前无待处理",text:"queued / dispatched / running 超时后会自动转为 failed,避免总览长期卡住"}):r("div",{className:"compact-list"},i.slice(0,5).map((F)=>r(GZ,{key:F.id,task:F,onRaw:l})))),r(yl,{title:"最近任务",eyebrow:"Dispatch"},$.length===0?r(Gl,{title:"暂无任务",text:"可以在任务调度模块发起 docker.ps 或 echo"}):r("div",{className:"compact-list"},$.map((F)=>r(GZ,{key:F.id,task:F,onRaw:l})))))}function Rp({node:u,onRaw:l}){return r("article",{className:"node-card"},r("div",{className:"node-card-head"},r("div",null,r("strong",null,u.name),r("code",null,u.providerId)),r(Hl,{status:u.status})),r("div",{className:"node-version-line"},r(_$,{node:u}),r("span",null,`升级策略 ${C6(u)}`)),r(kQ,{node:u}),r(MZ,{labels:u.labels,limit:6}),r("div",{className:"node-card-foot"},r("span",null,`心跳 ${Zu(u.lastHeartbeat)}`),r(lf,{title:`Provider ${u.providerId}`,data:u,onOpen:l,testId:`raw-node-${J0(u.providerId)}`})))}function bp({events:u,onRaw:l}){return r(yl,{title:"事件摘要",eyebrow:"Latest 100"},u.length===0?r(Gl,{title:"暂无事件",text:"Provider 注册、心跳超时和任务状态会写入事件流"}):r("div",{className:"table-wrap"},r("table",null,r("thead",null,r("tr",null,r("th",null,"ID"),r("th",null,"类型"),r("th",null,"来源"),r("th",null,"摘要"),r("th",null,"时间"),r("th",null,"操作"))),r("tbody",null,u.map((f)=>r("tr",{key:f.id},r("td",null,r("code",null,f.id)),r("td",null,r(Hl,{status:f.type},f.type)),r("td",null,r("code",null,f.source)),r("td",null,r(Oy,{data:f.payload})),r("td",null,Zu(f.createdAt)),r("td",null,r(lf,{title:`Event ${f.id}`,data:f,onOpen:l}))))))))}function kp({logs:u,onRaw:l}){return r(yl,{title:"服务日志",eyebrow:"Core Recent"},u.length===0?r(Gl,{title:"暂无日志",text:"backend-core 内存日志会在请求和 provider 事件后出现"}):r("div",{className:"log-list"},u.slice(-80).reverse().map((f,n)=>r("article",{key:n,className:`log-row ${f.level||"info"}`},r("span",null,Zu(f.ts)),r("b",null,f.level||"info"),r("strong",null,f.message||"log"),r(Oy,{data:f.data,empty:"无附加字段"}),r(lf,{title:`Log ${f.message||n}`,data:f,onOpen:l})))))}function hp({nodes:u,onRaw:l}){return r(yl,{title:"节点清单",eyebrow:`${u.length} Providers`},u.length===0?r(Gl,{title:"暂无 Provider 节点",text:"确认 provider-gateway 已连接 provider ingress"}):r("div",{className:"table-wrap"},r("table",{className:"node-list-table"},r("thead",null,r("tr",null,r("th",null,"状态"),r("th",null,"Provider"),r("th",null,"网关版本"),r("th",null,"运维可用性"),r("th",null,"资源标签"),r("th",null,"连接时间"),r("th",null,"最后心跳"),r("th",null,"操作"))),r("tbody",null,u.map((f)=>r("tr",{key:f.providerId},r("td",null,r(Hl,{status:f.status})),r("td",null,r("strong",null,f.name),r("code",null,f.providerId)),r("td",null,r("div",{className:"gateway-cell"},r(_$,{node:f}),r("span",null,C6(f)))),r("td",null,r(kQ,{node:f})),r("td",null,r(MZ,{labels:f.labels,limit:5})),r("td",null,Zu(f.connectedAt)),r("td",null,Zu(f.lastHeartbeat)),r("td",null,r(lf,{title:`Provider ${f.providerId}`,data:f,onOpen:l,testId:`raw-node-table-${J0(f.providerId)}`}))))))))}function Ip({nodes:u}){let l=p6(()=>{let f=[];for(let n of u)for(let[y,i]of VZ(n.labels))f.push({providerId:n.providerId,name:n.name,key:y,value:i});return f},[u]);return r(yl,{title:"资源标签",eyebrow:"Structured Labels"},l.length===0?r(Gl,{title:"暂无标签",text:"provider-gateway 注册消息会同步资源标签"}):r("div",{className:"label-matrix"},l.map((f)=>r("article",{key:`${f.providerId}-${f.key}`,className:"label-card"},r("span",null,f.key),r("strong",null,Zi(f.value)),r("code",null,f.providerId)))))}function vp({nodes:u}){return r(yl,{title:"心跳状态",eyebrow:"Provider Liveness"},u.length===0?r(Gl,{title:"无心跳",text:"等待 provider 注册和 heartbeat"}):r("div",{className:"heartbeat-list"},u.map((l)=>r("article",{key:l.providerId,className:"heartbeat-row"},r("span",{className:`pulse ${l.status}`}),r("div",null,r("strong",null,l.name),r("code",null,l.providerId)),r("div",null,r("span",null,"connected"),r("b",null,Zu(l.connectedAt))),r("div",null,r("span",null,"last heartbeat"),r("b",null,Zu(l.lastHeartbeat)))))))}function gp(u){let l=u?.cpu||{},f=u?.memory||{},n=u?.disk||{};return{at:u?.collectedAt,cpuPercent:Ru(l.percent),memoryPercent:Ru(f.percent),diskPercent:Ru(n.percent),memoryUsedBytes:Ru(f.usedBytes),memoryTotalBytes:Ru(f.totalBytes),diskUsedBytes:Ru(n.usedBytes),diskTotalBytes:Ru(n.totalBytes),load1:Ru(l.load1)}}function sp(u,l){if(!l)return[];let f=gp(l),n=j0(f.at),y=(Array.isArray(u)?u:[]).filter((i)=>i&&typeof i==="object").filter((i)=>n===null||j0(i.at)!==n);return y.push(f),y.sort((i,_)=>(j0(i.at)??0)-(j0(_.at)??0)).slice(-60)}function ap({nodes:u,systemStatuses:l,tasks:f,onRaw:n,refresh:y}){let[i,_]=du(""),$=p6(()=>u.map((G)=>{let W=l.find((L)=>L.providerId===G.providerId);return{...G,systemCurrent:W?.current||null,systemLastKnown:W?.lastKnown||null,systemCurrentCollectedAt:W?.currentCollectedAt||null,systemStale:Boolean(W?.stale),systemStaleSeconds:W?.staleSeconds??null,systemHistory:W?.history||[],systemUpdatedAt:W?.updatedAt||null}}),[u,l]),A=$.find((G)=>G.providerId===i)||$[0]||null;if(mn(()=>{if(!i&&$[0])_($[0].providerId)},[$.length,i]),!A)return r(Gl,{title:"暂无资源监控",text:"等待 provider 上报 CPU、内存和硬盘指标"});let j=A.systemCurrent,J=A.systemHistory||[],Q=j?.cpu||{},U=j?.memory||{},F=j?.disk||{},N=sp(J,j),K=A.systemCurrentCollectedAt?`最后采样 ${Zu(A.systemCurrentCollectedAt)},已过期 ${Rn(Ru(A.systemStaleSeconds))}`:"最后采样时间不可用";return r("div",{className:"monitor-page","data-testid":"node-monitor-page"},r("div",{className:"docker-node-strip"},$.map((G)=>r("button",{key:G.providerId,type:"button",className:`docker-node-tile ${A.providerId===G.providerId?"active":""}`,onClick:()=>_(G.providerId)},r("span",{className:`pulse ${G.status}`}),r("strong",null,G.name),r("code",null,G.providerId),r("span",null,G.systemCurrent?`CPU ${Ey(G.systemCurrent.cpu?.percent)} / MEM ${Ey(G.systemCurrent.memory?.percent)}`:G.systemStale?"指标过期":"等待指标")))),r("div",{className:"monitor-layout"},r(yl,{title:"任务管理器视图",eyebrow:A.name,className:"monitor-main-panel",actions:j||A.systemStale?r(lf,{title:`System ${A.providerId}`,data:{current:j,lastKnown:A.systemLastKnown,currentCollectedAt:A.systemCurrentCollectedAt,stale:A.systemStale,staleSeconds:A.systemStaleSeconds,history:J},onOpen:n}):null},!j?r(Gl,{title:A.systemStale?"系统指标已过期":"系统指标未上报",text:A.systemStale?`${K};等待 provider-gateway 恢复 system.status 上报`:"provider-gateway 会周期性采集 /proc 与 df,并保存历史曲线"}):r("div",null,r("div",{className:"monitor-hero"},r("div",null,r("p",{className:"panel-eyebrow"},"Node Performance"),r("h3",null,A.name),r("div",{className:"docker-meta"},r("span",null,`${Q.cores||0} CPU cores`),r("span",null,`load ${Ru(Q.load1).toFixed(2)} / ${Ru(Q.load5).toFixed(2)} / ${Ru(Q.load15).toFixed(2)}`),r("span",null,`memory actual ${wf(U.usedBytes)} / ${wf(U.totalBytes)}`),r("span",null,`disk ${wf(F.usedBytes)} / ${wf(F.totalBytes)}`))),r(Hl,{status:j.ok?"online":"warn"},j.ok?"METRICS READY":"METRICS DEGRADED")),r("div",{className:"monitor-chart-grid"},r(CQ,{title:"CPU",metricKey:"cpuPercent",current:Q.percent,points:N,detail:`${Q.cores||0} cores / load ${Ru(Q.load1).toFixed(2)}`,tone:"cpu",testId:"metric-chart-cpu"}),r(CQ,{title:"Memory",metricKey:"memoryPercent",current:U.percent,points:N,detail:`${wf(U.usedBytes)} actual / ${wf(U.cacheBytes)} cache excluded`,tone:"memory",testId:"metric-chart-memory"}),r(CQ,{title:"Disk",metricKey:"diskPercent",current:F.percent,points:N,detail:`${F.path||"/"} mounted ${F.mount||"--"}`,tone:"disk",testId:"metric-chart-disk"})),r("div",{className:"monitor-summary-grid"},r(Kl,{label:"CPU 当前",value:Ey(Q.percent),hint:`history ${N.length} samples`,tone:"ok"}),r(Kl,{label:"实际内存",value:wf(U.usedBytes),hint:`${Ey(U.percent)} 不含缓存`}),r(Kl,{label:"硬盘已用",value:wf(F.usedBytes),hint:Ey(F.percent)}),r(Kl,{label:"更新时间",value:Zu(j.collectedAt||A.systemUpdatedAt),hint:A.providerId})),r(op,{current:j,onRaw:n}))),r("div",{className:"monitor-side-stack"},r(ix,{provider:A,refresh:y,onRaw:n}),r(_x,{provider:A,tasks:f,onRaw:n,limit:5}),r(yl,{title:"采样说明",eyebrow:"Retention"},r("div",{className:"monitor-note-list"},r("article",null,r("b",null,"CPU"),r("span",null,"从 /proc/stat 计算相邻采样差值,首个采样用 load/cores 近似")),r("article",null,r("b",null,"Memory"),r("span",null,"实际内存 = MemTotal - MemFree - Buffers - Cached - SReclaimable + Shmem,不把 page cache / buffer 计入占用")),r("article",null,r("b",null,"Disk"),r("span",null,"使用 df -PB1 对配置路径采样,默认监控根文件系统")),r("article",null,r("b",null,"Process"),r("span",null,"从 /proc/[pid] 采集进程 CPU、实际内存 PSS、RSS、线程数和磁盘 I/O 速率;PSS 不重复计算共享内存,表格默认按内存占用降序")))))))}function pZ(u){return Ru(u.memoryBytes,Ru(u.pssBytes,Ru(u.rssBytes)))}function LZ(u,l){if(l==="memory")return pZ(u);if(l==="cpu")return Ru(u.cpuPercent);if(l==="disk")return Ru(u.readBytesPerSecond)+Ru(u.writeBytesPerSecond);if(l==="pid")return Ru(u.pid);if(l==="threads")return Ru(u.threads);if(l==="runtime")return Ru(u.elapsedSeconds);if(l==="user")return String(u.user||"");return String(u.name||u.command||"")}function KZ({value:u,label:l,tone:f}){let n=Math.max(1,Math.min(100,Ru(u)));return r("div",{className:`process-meter ${f||""}`},r("span",{style:{width:`${n}%`}}),r("b",null,l))}function op({current:u,onRaw:l}){let[f,n]=du({key:"memory",direction:"desc"}),y=Hy.default.useContext(xQ),i=u?.processSummary&&typeof u.processSummary==="object"?u.processSummary:{},_=Array.isArray(u?.processes)?u.processes:[],$=String(i.memoryMode||""),A=$.includes("pss_smaps_rollup")?"PSS":$==="rss_minus_shared_fallback"?"RSS-shared":"RSS fallback",j=p6(()=>{let Q=f.direction==="asc"?1:-1;return[..._].sort((U,F)=>{let N=LZ(U,f.key),K=LZ(F,f.key);if(typeof N==="string"||typeof K==="string")return String(N).localeCompare(String(K),"zh-CN")*Q;return(N-K)*Q||Ru(U.pid)-Ru(F.pid)})},[_,f.key,f.direction]),J=(Q,U)=>{let F=f.key===U,N=F?f.direction==="asc"?"ascending":"descending":"none";return r("th",{"aria-sort":N},r("button",{type:"button",className:`process-sort-button ${F?"active":""}`,"data-testid":`process-sort-${U}`,onClick:()=>n((K)=>({key:U,direction:K.key===U&&K.direction==="desc"?"asc":"desc"}))},Q,r("span",null,F?f.direction==="desc"?"↓":"↑":"↕")))};return r("section",{className:"process-resource-panel","data-testid":"process-resource-panel"},r("div",{className:"process-resource-head"},r("div",null,r("p",{className:"panel-eyebrow"},"Windows Resource Monitor Style"),r(nl,{title:"进程资源占用",level:3,loading:y})),r("div",{className:"process-resource-actions"},r("span",{className:"data-chip"},"默认按内存排序"),r("span",{className:"data-chip"},`内存口径 ${A}`),r("span",{className:"data-chip"},`${Ru(i.visible,j.length)} / ${Ru(i.total,j.length)} 进程`),r(lf,{title:"Process Resource Snapshot",data:{processSummary:i,processes:_},onOpen:l,testId:"raw-process-resources"}))),j.length===0?r(Gl,{title:"暂无进程资源数据",text:"等待 provider-gateway 上报 /proc/[pid] 采样;旧版 provider 需要先升级到支持进程资源表的版本"}):r("div",{className:"process-table-wrap"},r("table",{className:"process-resource-table","data-testid":"process-resource-table"},r("thead",null,r("tr",null,J("进程","name"),J("PID","pid"),J("用户","user"),r("th",null,"状态"),J("CPU","cpu"),J("内存","memory"),r("th",null,"PSS / RSS"),J("磁盘 I/O","disk"),J("线程","threads"),J("运行时长","runtime"))),r("tbody",null,j.map((Q)=>{let U=Ru(Q.readBytesPerSecond)+Ru(Q.writeBytesPerSecond),F=pZ(Q);return r("tr",{key:`${Q.pid}-${Q.startedAt}`,"data-testid":`process-row-${J0(Q.pid)}`,"data-memory-bytes":String(F),"data-cpu-percent":String(Ru(Q.cpuPercent)),"data-disk-bps":String(U),"data-pid":String(Ru(Q.pid))},r("td",null,r("div",{className:"process-name-cell"},r("strong",null,Q.name||"--"),r("span",{className:"process-command"},Q.command||"--"))),r("td",null,r("code",null,Q.pid||"--")),r("td",null,Q.user||`uid:${Q.uid??"--"}`),r("td",null,r("span",{className:`process-state state-${J0(Q.state||"unknown")}`},Q.state||"?")),r("td",null,r(KZ,{value:Q.cpuPercent,label:Tp(Q.cpuPercent),tone:"cpu"})),r("td",null,r(KZ,{value:Q.memoryPercent,label:Ey(Q.memoryPercent),tone:"memory"})),r("td",null,r("div",{className:"process-io-cell"},r("strong",null,wf(F)),r("span",null,`RSS ${wf(Q.rssBytes)}`))),r("td",null,r("div",{className:"process-io-cell"},r("strong",null,MQ(U)),r("span",null,`R ${MQ(Q.readBytesPerSecond)} / W ${MQ(Q.writeBytesPerSecond)}`))),r("td",null,Q.threads||0),r("td",null,Rn(Ru(Q.elapsedSeconds))))})))))}function CQ({title:u,metricKey:l,current:f,points:n,detail:y,tone:i,testId:_}){let $=n.map((U)=>Math.max(0,Math.min(100,Ru(U[l])))),A=$.length>1?$:[$[0]||0,$[0]||0],j=A.length<=1?100:100/(A.length-1),J=A.map((U,F)=>`${(F*j).toFixed(2)},${(46-U*0.42).toFixed(2)}`).join(" "),Q=`0,48 ${J} 100,48`;return r("article",{className:`metric-chart ${i}`,"data-testid":_},r("div",{className:"metric-chart-head"},r("div",null,r("span",null,u),r("strong",null,Ey(f))),r("code",null,`${n.length} pts`)),r("svg",{viewBox:"0 0 100 48",preserveAspectRatio:"none",role:"img","aria-label":`${u} usage curve`},r("polygon",{points:Q}),r("polyline",{points:J}),r("line",{x1:"0",x2:"100",y1:"24",y2:"24"})),r("div",{className:"metric-chart-foot"},r("span",null,"0%"),r("span",null,y),r("span",null,"100%")))}function K1(u){return Array.isArray(u)?u:[]}function dp(u){let l=K1(u?.core?.requests?.componentSummary);return[...K1(u?.frontend?.requests?.componentSummary),...l].sort((n,y)=>Ru(y.requestCount)-Ru(n.requestCount))}function ep(u){let l=K1(u?.core?.operations?.summary);return[...K1(u?.frontend?.operations?.summary),...l].sort((n,y)=>Ru(y.count)-Ru(n.count))}function ux(u){let l=K1(u?.core?.requests?.recentFailures).map((n)=>({source:"backend",...n}));return[...K1(u?.frontend?.requests?.recentFailures).map((n)=>({source:"frontend",...n})),...l].sort((n,y)=>(j0(y.at)??0)-(j0(n.at)??0)).slice(0,20)}function lx(u){let l=K1(u?.core?.operations?.recentSlowOperations);return[...K1(u?.frontend?.operations?.recentSlowOperations),...l].sort((n,y)=>Ru(y.durationMs)-Ru(n.durationMs)).slice(0,20)}function fx(u){let l=performance.memory,f=Number(l?.usedJSHeapSize);if(Number.isFinite(f)&&f>0)return f;let n=Number(u?.appBundleBytes);if(Number.isFinite(n)&&n>0)return n;return Ru(u?.process?.heapUsedBytes)}function nx({points:u}){let l=K1(u),f=l.map((U)=>Ru(U.mb)),n=Math.max(1,...f),y=Math.max(0,Math.min(...f,0)),i=Math.max(1,n-y),_=l.length>1?l:[...l,...l],$=_.length<=1?100:100/(_.length-1),A=_.map((U,F)=>{let N=Ru(U.mb);return`${(F*$).toFixed(2)},${(48-(N-y)/i*42).toFixed(2)}`}).join(" "),j=`0,50 ${A} 100,50`,J=l.at(-1),Q=l[0];return r("article",{className:"performance-memory-card","data-testid":"performance-memory-chart"},r("div",{className:"performance-memory-head"},r("strong",null,`Bwebui: ${J?`${Ru(J.mb).toFixed(1)}MB`:"--"}`),r("span",null,l.length>0?`${l.length} samples`:"等待采样")),r("svg",{viewBox:"0 0 100 50",preserveAspectRatio:"none",role:"img","aria-label":"Bwebui memory trend"},r("polygon",{points:j}),r("polyline",{points:A}),r("line",{x1:"0",x2:"100",y1:"25",y2:"25"})),r("div",{className:"performance-axis-row"},r("span",null,Q?rl(new Date(Q.at)):"--"),r("span",null,"时间"),r("span",null,J?rl(new Date(J.at)):"--")),r("div",{className:"performance-axis-row"},r("span",null,`${y.toFixed(1)}`),r("span",null,"(MB)"),r("span",null,`${n.toFixed(1)}`)))}function yx({onRaw:u}){let[l,f]=du({core:null,frontend:null}),[n,y]=du([]),[i,_]=du(""),[$,A]=du(!1),[j,J]=du(null),[Q,U]=du(!1);async function F(){A(!0),_("");try{let[D,x]=await Promise.all([Eu(`${su.apiBaseUrl}/performance`,{cache:"no-store"}),Eu(`${su.apiBaseUrl}/frontend-performance`,{cache:"no-store"})]);f({core:D,frontend:x});let V=fx(x);y((t)=>[...t,{at:new Date().toISOString(),mb:V/1048576}].slice(-80))}catch(D){_(Xu(D,"性能指标加载失败"))}finally{A(!1)}}mn(()=>{F();let D=setInterval(()=>void F(),5000);return()=>clearInterval(D)},[]);async function N(){U(!0),_(""),J(null);try{let D=await Eu(`${su.apiBaseUrl}/code-queue-load-test`,{method:"POST",body:JSON.stringify({targetMs:1000,timeoutMs:90000,url:su.frontendPublicUrl||window.location.origin})});J(D),F()}catch(D){_(Xu(D,"Code Queue Playwright 测量失败"))}finally{U(!1)}}let K=dp(l),G=ux(l),W=ep(l),L=lx(l),q=l.core?.process||{},z=l.frontend?.process||{},Z=l.core?.database?.codeQueueStorage||{},T=Ru(Z.total),X=j?.result||{},c=Ru(X.wallMs,NaN),S=Ru(X.networkIdleMs,NaN),p=X.withinTarget===!0,Y=Q?"running":j===null?"idle":j.measurementOk===!0?p?"passed":"slow":"failed";return r("div",{className:"performance-page","data-testid":"performance-page"},r("div",{className:"performance-hero"},r("div",null,r("p",{className:"panel-eyebrow"},"Unified Performance"),r(nl,{title:"性能面板",loading:$||Q}),r("p",null,"按组件统计 HTTP 请求、失败率、P95 延迟,并汇总 backend/frontend 内部操作耗时。")),r("div",{className:"inline-actions"},r("button",{type:"button",className:"ghost-btn",onClick:()=>void N(),disabled:Q,"data-testid":"code-queue-load-test-button"},Q?"测试中...":"测试 Code Queue 加载"),r("button",{type:"button",className:"ghost-btn",onClick:()=>void F(),disabled:$,"data-testid":"performance-refresh-button"},$?"刷新中":"刷新"),r(lf,{title:"Performance Snapshot",data:l,onOpen:u,testId:"raw-performance"}))),r(ul,{error:i}),r("div",{className:"performance-top-grid"},r(nx,{points:n}),r("div",{className:"performance-metric-stack"},r(Kl,{label:"backend RSS",value:wf(q.rssBytes),hint:`heap ${wf(q.heapUsedBytes)}`}),r(Kl,{label:"frontend RSS",value:wf(z.rssBytes),hint:`bundle ${wf(l.frontend?.appBundleBytes)}`}),r(Kl,{label:"Codex PG 任务",value:T||"--",hint:Z.ok?"unidesk_code_queue_tasks":"等待表初始化",tone:Z.ok?"ok":"warn"}),r(Kl,{label:"请求样本",value:Ru(l.core?.requests?.sampleCount)+Ru(l.frontend?.requests?.sampleCount),hint:"rolling window 3000"}))),r(yl,{title:"Code Queue 加载基准",eyebrow:"Playwright / target <1s",className:"codex-load-test-panel",loading:Q,actions:r("div",{className:"panel-actions"},r("button",{type:"button",className:"primary-btn",onClick:()=>void N(),disabled:Q,"data-testid":"code-queue-load-test-panel-button"},Q?"正在运行 Playwright...":"手动触发测试"),j?r(lf,{title:"Code Queue Load Test",data:j,onOpen:u,testId:"raw-code-queue-load-test"}):null)},r("div",{className:"codex-load-test-grid","data-testid":"code-queue-load-test-result"},r(Kl,{label:"总耗时",value:Q?"运行中":Number.isFinite(c)?V0(c):"--",hint:j===null?"点击按钮启动远端 Playwright":`目标 ${V0(X.targetMs||1000)} / ${X.url||"Code Queue"}`,tone:Y==="passed"?"ok":Y==="failed"||Y==="slow"?"warn":""}),r(Kl,{label:"判定",value:Q?"RUNNING":Y==="passed"?"PASS <1s":Y==="slow"?"SLOW":Y==="failed"?"FAILED":"--",hint:j?.measurementOk===!1?String(j.error||X.error||"measurement failed").slice(0,120):"导航开始 -> DOMContentLoaded -> data-load-state=complete",tone:Y==="passed"?"ok":Y==="idle"||Y==="running"?"":"fail"}),r(Kl,{label:"Network idle",value:Number.isFinite(S)?V0(S):"--",hint:`DOMContentLoaded ${V0(X.domContentLoadedMs)} / ${X.networkIdleReached===!1?"未在 5s 内空闲":"已空闲"}`,tone:Number.isFinite(S)&&S<=1000?"ok":"warn"}),r(Kl,{label:"组件耗时",value:Number.isFinite(Ru(X.componentLoadMs,NaN))?V0(X.componentLoadMs):"--",hint:`queue ${V0(X.queueMs)} / detail ${V0(X.detailMs)}`,tone:Ru(X.componentLoadMs)>1000?"warn":"ok"}),r(Kl,{label:"Trace 规模",value:Number.isFinite(Ru(X.transcriptRows,NaN))?String(X.transcriptRows):"--",hint:`${X.visibleTaskCount??0} visible tasks / ${X.partial?"preview":"complete"}`})),Q?r("div",{className:"performance-empty-line"},"正在通过 main-server Host SSH 启动 Playwright,完成后会显示 wall time、组件耗时和最慢 API。"):null,j&&Array.isArray(X.slowestApi)&&X.slowestApi.length>0?r("div",{className:"table-wrap performance-table-wrap compact codex-load-api-table"},r("table",{className:"performance-table"},r("thead",null,r("tr",null,["API","状态","耗时"].map((D)=>r("th",{key:D},D)))),r("tbody",null,X.slowestApi.slice(0,5).map((D,x)=>r("tr",{key:`${D.url}-${x}`},r("td",null,r("code",null,D.url)),r("td",null,D.status),r("td",null,V0(D.durationMs))))))):null),r("div",{className:"performance-grid"},r(yl,{title:"组件汇总",eyebrow:"Requests",loading:$},K.length===0?r(Gl,{title:"暂无请求样本",text:"刷新几次或打开页面后会自动形成组件统计"}):r("div",{className:"table-wrap performance-table-wrap"},r("table",{className:"performance-table"},r("thead",null,r("tr",null,["组件","请求数","失败数","失败率","平均延迟","P95"].map((D)=>r("th",{key:D},D)))),r("tbody",null,K.map((D)=>r("tr",{key:D.component},r("td",null,r("code",null,D.component)),r("td",null,D.requestCount),r("td",null,D.failureCount),r("td",null,Ey(Ru(D.failureRate)*100)),r("td",null,V0(D.averageLatencyMs)),r("td",null,V0(D.p95LatencyMs)))))))),r(yl,{title:"最近失败请求",eyebrow:"Failures",loading:$},G.length===0?r("div",{className:"performance-empty-line"},"最近没有失败请求"):r("div",{className:"table-wrap performance-table-wrap compact"},r("table",{className:"performance-table"},r("thead",null,r("tr",null,["时间","来源","组件","状态","路径"].map((D)=>r("th",{key:D},D)))),r("tbody",null,G.map((D,x)=>r("tr",{key:`${D.at}-${x}`},r("td",null,Zu(D.at)),r("td",null,D.source),r("td",null,r("code",null,D.component)),r("td",null,r(Hl,{status:"failed"},D.status)),r("td",null,r("code",null,D.path)))))))),r(yl,{title:"内部操作汇总",eyebrow:"Operations",loading:$},W.length===0?r(Gl,{title:"暂无内部操作样本",text:"API 查询和代理请求会自动记录内部操作耗时"}):r("div",{className:"table-wrap performance-table-wrap"},r("table",{className:"performance-table"},r("thead",null,r("tr",null,["服务","操作","次数","平均延迟","P95"].map((D)=>r("th",{key:D},D)))),r("tbody",null,W.map((D)=>r("tr",{key:`${D.service}-${D.operation}`},r("td",null,D.service),r("td",null,r("code",null,D.operation)),r("td",null,D.count),r("td",null,V0(D.averageLatencyMs)),r("td",null,V0(D.p95LatencyMs)))))))),r(yl,{title:"最近慢操作",eyebrow:"Slowest",loading:$},L.length===0?r(Gl,{title:"暂无慢操作",text:"后端会记录最近窗口内耗时最高的内部操作"}):r("div",{className:"table-wrap performance-table-wrap"},r("table",{className:"performance-table"},r("thead",null,r("tr",null,["时间","操作","耗时","结果","细节"].map((D)=>r("th",{key:D},D)))),r("tbody",null,L.map((D,x)=>r("tr",{key:`${D.at}-${D.operation}-${x}`},r("td",null,Zu(D.at)),r("td",null,r("code",null,D.operation)),r("td",null,V0(D.durationMs)),r("td",null,D.ok?"成功":"失败"),r("td",null,D.detail||"-")))))))))}function ix({provider:u,refresh:l,onRaw:f}){let[n,y]=du(""),[i,_]=du(null),[$,A]=du("");async function j(J){y(J),A("");try{let Q=await Eu(`${su.apiBaseUrl}/dispatch`,{method:"POST",body:JSON.stringify({providerId:u.providerId,command:"provider.upgrade",payload:{mode:J,source:"frontend-resource-monitor",requestedAt:new Date().toISOString()}})});_({mode:J,...Q}),await l()}catch(Q){A(Xu(Q,"升级命令下发失败"))}finally{y("")}}return r(yl,{title:"Provider Gateway 升级",eyebrow:"Remote Control",loading:Boolean(n)},r("div",{className:"upgrade-control","data-testid":"provider-upgrade-control"},r("p",null,"通过 UniDesk WebSocket 向当前计算节点下发 provider.upgrade;预检只生成升级计划,执行升级会调度节点本地 updater 容器。"),r("div",{className:"upgrade-target-line"},r("span",null,"指定 Provider"),r("code",null,u.providerId),r(_$,{node:u})),r("div",{className:"upgrade-actions"},r("button",{type:"button",className:"ghost-btn",disabled:Boolean(n),onClick:()=>j("plan"),"data-testid":"upgrade-plan-button"},n==="plan"?"预检中":"预检升级"),r("button",{type:"button",className:"ghost-btn danger",disabled:Boolean(n),onClick:()=>j("schedule"),"data-testid":"upgrade-schedule-button"},n==="schedule"?"调度中":"执行升级")),r(ul,{error:$}),i?r("div",{className:"upgrade-result"},r(Hl,{status:i.status||"queued"},i.status||"queued"),r("span",null,`${i.mode==="schedule"?"执行升级":"预检升级"} 已下发`),r("span",null,`指定版本 ${bQ(BZ(u))}`),r("code",null,i.taskId||"--"),r(lf,{title:"Provider Upgrade Dispatch",data:i,onOpen:f})):r("span",{className:"muted"},"升级任务结果会进入任务历史;执行升级可能导致 provider 短暂重连。")))}function xZ({records:u,onRaw:l,compact:f=!1}){if(u.length===0)return r(Gl,{title:"暂无远程更新记录",text:"该节点还没有 provider.upgrade 任务;执行预检或升级后会在这里形成结构化记录"});return r("div",{className:`upgrade-record-table-wrap table-wrap ${f?"compact":""}`},r("table",{className:"upgrade-record-table"},r("thead",null,r("tr",null,r("th",null,"状态"),r("th",null,"模式"),r("th",null,"任务"),r("th",null,"来源"),r("th",null,"耗时"),r("th",null,"策略"),r("th",null,"Gateway 版本"),r("th",null,"结果记录"),r("th",null,"更新时间"),r("th",null,"操作"))),r("tbody",null,u.map((n)=>r("tr",{key:n.id,"data-testid":`gateway-upgrade-record-${J0(n.id)}`},r("td",null,r(Hl,{status:n.status})),r("td",null,r("span",{className:`mode-chip ${hr(n)}`},hr(n)==="schedule"?"执行升级":"预检")),r("td",null,r("strong",null,"provider.upgrade"),r("code",null,n.id)),r("td",null,cp(n)),r("td",null,r(RZ,{task:n})),r("td",null,Yp(n)),r("td",null,r("span",{className:"version-chip"},DZ(n))),r("td",null,r("span",{className:`upgrade-outcome ${String(n.status||"").toLowerCase()}`},tZ(n))),r("td",null,Zu(n.updatedAt)),r("td",null,r(lf,{title:`Provider Upgrade Task ${n.id}`,data:x6(n),onOpen:l})))))))}function _x({provider:u,tasks:l,onRaw:f,limit:n=5}){let y=SZ(l,u.providerId).slice(0,n);return r(yl,{title:"远程更新记录",eyebrow:u.providerId,actions:r(_$,{node:u}),className:"provider-upgrade-records-panel"},r("div",{"data-testid":`provider-upgrade-records-${J0(u.providerId)}`},r(xZ,{records:y,onRaw:f,compact:!0})))}function $x({nodes:u,tasks:l,onRaw:f}){let n=p6(()=>u.map((i)=>{let _=SZ(l,i.providerId);return{node:i,records:_,latest:Dp(_),capabilities:XZ(i)}}),[u,l]),y=n.reduce((i,_)=>i+_.records.length,0);return r("div",{className:"gateway-page","data-testid":"gateway-version-page"},r(yl,{title:"Provider Gateway 版本",eyebrow:`${u.length} Providers / ${y} 更新记录`},u.length===0?r(Gl,{title:"暂无 Provider 节点",text:"等待 provider-gateway 注册后显示版本号和升级记录"}):r("div",{className:"table-wrap gateway-version-table-wrap"},r("table",{className:"gateway-version-table"},r("thead",null,r("tr",null,r("th",null,"状态"),r("th",null,"Provider"),r("th",null,"Gateway 版本"),r("th",null,"升级策略"),r("th",null,"运维可用性"),r("th",null,"运行时间"),r("th",null,"能力"),r("th",null,"最近远程更新"),r("th",null,"操作"))),r("tbody",null,n.map((i)=>r("tr",{key:i.node.providerId},r("td",null,r(Hl,{status:i.node.status})),r("td",null,r("strong",null,i.node.name),r("code",null,i.node.providerId)),r("td",null,r(_$,{node:i.node})),r("td",null,C6(i.node)),r("td",null,r(kQ,{node:i.node})),r("td",null,NZ(i.node)?Zu(NZ(i.node)):"待新版上报"),r("td",null,r("div",{className:"capability-row"},i.capabilities.length===0?r("span",{className:"muted"},"未声明"):i.capabilities.slice(0,5).map((_)=>r("span",{key:_,className:"data-chip"},_)))),r("td",null,i.latest?r("div",{className:"latest-upgrade-cell"},r(Hl,{status:i.latest.status}),r("span",null,`${hr(i.latest)==="schedule"?"执行升级":"预检"} / ${Zu(i.latest.updatedAt)}`),r("small",null,`Gateway ${DZ(i.latest)}`),r("small",null,tZ(i.latest))):r("span",{className:"muted"},"暂无记录")),r("td",null,r(lf,{title:`Provider ${i.node.providerId}`,data:i.node,onOpen:f})))))))),r(yl,{title:"远程更新记录",eyebrow:"Structured provider.upgrade records"},u.length===0?r(Gl,{title:"暂无记录",text:"没有 provider 节点时不会生成远程更新记录"}):r("div",{className:"gateway-record-grid"},n.map((i)=>r("article",{key:i.node.providerId,className:"gateway-record-card","data-testid":`gateway-records-${J0(i.node.providerId)}`},r("div",{className:"gateway-record-head"},r("div",null,r("strong",null,i.node.name),r("code",null,i.node.providerId)),r(_$,{node:i.node})),r("div",{className:"gateway-record-meta"},r("span",null,`心跳 ${Zu(i.node.lastHeartbeat)}`),r("span",null,`策略 ${C6(i.node)}`),r("span",null,`${i.records.length} 条记录`)),r(xZ,{records:i.records.slice(0,8),onRaw:f,compact:!0}))))))}function Ax(u){if(u==="running")return"online";if(u==="paused"||u==="restarting")return"warn";if(u==="exited"||u==="dead")return"offline";return"internal"}function mZ(u){return/^[a-f0-9]{48,64}$/i.test(u)}function M6(u){let l=String(u?.name||""),f=String(u?.labels||"");return l==="unidesk_pgdata_10gb"||f.includes("com.docker.compose.volume=unidesk_pgdata_10gb")||l.toLowerCase().includes("pgdata")}function zZ(u){let l=String(u?.name||""),f=String(u?.labels||"");if(M6(u))return 0;if(f.includes("com.docker.compose.project=unidesk"))return 1;if(!mZ(l))return 2;return 3}function rx(u){return[...u].sort((l,f)=>{let n=zZ(l)-zZ(f);if(n!==0)return n;return String(l.name||"").localeCompare(String(f.name||""))})}function jx({nodes:u,dockerStatuses:l,onRaw:f}){let[n,y]=du(""),i=p6(()=>u.map((L)=>{let q=l.find((z)=>z.providerId===L.providerId);return{...L,dockerStatus:q?.dockerStatus||null,dockerUpdatedAt:q?.updatedAt||null}}),[u,l]),_=i.find((L)=>L.providerId===n)||i[0]||null;if(mn(()=>{if(!n&&i[0])y(i[0].providerId)},[i.length,n]),!_)return r(Gl,{title:"暂无 Docker 节点",text:"等待 provider 上报 Docker daemon 状态"});let $=_.dockerStatus,A=_.providerId==="main-server",j=$?.counts||{},J=$?.daemon||{},Q=$?.containers||[],U=$?.images||[],F=rx($?.volumes||[]),N=A?F.find(M6):null,K=$?.networks||[],G=Q.filter((L)=>L.state==="running"),W=Q.filter((L)=>L.state!=="running");return r("div",{className:"docker-page","data-testid":"docker-status-page"},r("div",{className:"docker-node-strip"},i.map((L)=>r("button",{key:L.providerId,type:"button",className:`docker-node-tile ${_.providerId===L.providerId?"active":""}`,onClick:()=>y(L.providerId)},r("span",{className:`pulse ${L.status}`}),r("strong",null,L.name),r("code",null,L.providerId),r("span",null,L.dockerStatus?`Docker ${L.dockerStatus.ok?"ready":"degraded"}`:"等待上报")))),r("div",{className:"docker-layout"},r(yl,{title:"Docker Desktop 视图",eyebrow:_.name,className:"docker-main-panel",actions:$?r(lf,{title:`Docker ${_.providerId}`,data:$,onOpen:f}):null},!$?r(Gl,{title:"Docker 状态未上报",text:"provider-gateway 会在连接后周期性采集 docker info / ps / images / volume / network"}):r("div",null,r("div",{className:"docker-hero"},r("div",null,r("p",{className:"panel-eyebrow"},"Daemon"),r("h3",null,J.name||_.providerId),r("div",{className:"docker-meta"},r("span",null,J.serverVersion?`Engine ${J.serverVersion}`:"Engine --"),r("span",null,J.operatingSystem||"OS --"),r("span",null,J.architecture||"arch --"),r("span",null,`${J.cpus||0} CPU / ${wf(J.memoryBytes)}`))),r(Hl,{status:$.ok?"online":"warn"},$.ok?"Docker Ready":"Docker Degraded")),r("div",{className:"docker-metrics"},r(Kl,{label:"Containers",value:j.containers??Q.length,hint:`${j.running??G.length} running / ${j.stopped??W.length} stopped`,tone:"ok"}),r(Kl,{label:"Images",value:j.images??U.length,hint:`${j.daemonImages??j.images??U.length} daemon images`}),r(Kl,{label:"Volumes",value:j.volumes??F.length,hint:A?N?"database volume visible":"database volume missing":"node local volumes",tone:N?"ok":""}),r(Kl,{label:"Networks",value:j.networks??K.length,hint:J.driver?`driver ${J.driver}`:"docker networks"})),A?r(Jx,{volume:N,volumeCount:F.length}):null,r("div",{className:"docker-section-head"},r("h3",null,"Containers"),r("span",null,`updated ${Zu(_.dockerUpdatedAt||$.collectedAt)}`)),r("div",{className:"docker-container-table table-wrap","data-testid":"docker-container-table"},r("table",null,r("thead",null,r("tr",null,r("th",null,"状态"),r("th",null,"容器"),r("th",null,"镜像"),r("th",null,"端口"),r("th",null,"运行时间"),r("th",null,"重启策略"),r("th",null,"PID"),r("th",null,"大小"))),r("tbody",null,Q.length===0?r("tr",null,r("td",{colSpan:8},"暂无容器")):Q.map((L)=>r("tr",{key:`${L.id}-${L.name}`},r("td",null,r(Hl,{status:Ax(L.state)},L.state||"unknown")),r("td",null,r("strong",null,L.name||"--"),r("code",null,L.id||"--")),r("td",null,L.image||"--"),r("td",null,L.ports||r("span",{className:"muted"},"未发布")),r("td",null,L.runningFor||L.status||"--"),r("td",null,L.restartPolicy?r(Hl,{status:L.restartPolicy==="always"?"online":"warn"},L.restartPolicy):"--"),r("td",null,L.pidMode?r("code",null,L.pidMode):"--"),r("td",null,L.size||"--")))))))),r("div",{className:"docker-side-stack"},r(pQ,{title:"Images",items:U,render:(L)=>r("article",{key:`${L.id}-${L.repository}`,className:"docker-side-row"},r("strong",null,`${L.repository}:${L.tag}`),r("span",null,L.size||"--"),r("code",null,L.id||"--"))}),r(pQ,{title:"Volumes",items:F,limit:F.length,render:(L)=>r("article",{key:L.name,className:`docker-side-row volume-row ${A&&M6(L)?"database-volume":""}`,"data-testid":A&&M6(L)?"database-volume-row":void 0},r("strong",null,L.name),r("span",null,A&&M6(L)?"PostgreSQL":mZ(String(L.name||""))?"anonymous":"named"),r("code",null,L.mountpoint||L.driver||L.scope||"--"))}),r(pQ,{title:"Networks",items:K,render:(L)=>r("article",{key:L.id||L.name,className:"docker-side-row"},r("strong",null,L.name),r("span",null,L.driver||"--"),r("code",null,L.id||"--"))}))))}function Jx({volume:u,volumeCount:l}){return r("section",{className:`docker-volume-focus ${u?"ready":"missing"}`,"data-testid":"database-volume-card"},r("div",{className:"volume-focus-head"},r("span",{className:"panel-eyebrow"},"Database Named Volume"),r(Hl,{status:u?"online":"warn"},u?"FOUND":"MISSING")),u?r("div",{className:"volume-focus-body"},r("strong",null,u.name),r("span",null,"PostgreSQL data volume for unidesk-database"),r("div",{className:"volume-route"},r("code",null,u.mountpoint||"/var/lib/docker/volumes/unidesk_pgdata_10gb/_data"),r("span",null,"->"),r("code",null,"unidesk-database:/var/lib/postgresql/data")),r("div",{className:"docker-meta compact"},r("span",null,`driver ${u.driver||"--"}`),r("span",null,`scope ${u.scope||"--"}`),r("span",null,`${l} volumes reported`))):r("div",{className:"volume-focus-body"},r("strong",null,"unidesk_pgdata_10gb"),r("span",null,"当前 Docker 快照没有发现数据库命名卷;请检查 provider-gateway 的 Docker volume 上报。")))}function pQ({title:u,items:l,render:f,limit:n}){let y=l.slice(0,n??12),i=Math.max(0,l.length-y.length);return r(yl,{title:u,eyebrow:`${l.length} items`,className:"docker-side-panel"},l.length===0?r(Gl,{title:`暂无 ${u}`,text:"等待 Docker 状态采集"}):r("div",{className:"docker-side-list"},y.map(f),i>0?r("div",{className:"docker-side-more"},`+ ${i} more`):null))}function Qx({microservices:u,onRaw:l,onNavigate:f}){let n=u.filter((y)=>WZ(y).public===!1);return r("div",{className:"microservice-page","data-testid":"microservice-catalog-page"},r(yl,{title:"用户服务目录",eyebrow:"Provider Mounted User Services"},r("div",{className:"metric-grid"},r(Kl,{label:"服务总数",value:u.length,hint:"config.json 用户服务登记"}),r(Kl,{label:"私有后端",value:n.length,hint:"不直接暴露公网",tone:"ok"}),r(Kl,{label:"D601 服务",value:u.filter((y)=>y.providerId==="D601").length,hint:"compute-node docker"}),r(Kl,{label:"集成前端",value:u.filter((y)=>y.frontend?.integrated).length,hint:"UniDesk React 页面"}))),r(yl,{title:"外部静态入口",eyebrow:"External Link"},r("div",{className:"endpoint-list hwlab-entry-list"},r("article",{className:"hwlab-entry-card","data-testid":"hwlab-entry-card"},r("b",null,"HWLAB"),r("span",null,_i),r("span",null,"external static link"),r("div",{className:"microservice-actions hwlab-entry-actions"},r("button",{type:"button",className:"ghost-btn","data-testid":"hwlab-open-current-from-catalog",onClick:()=>window.location.assign(_i)},"当前窗口"),r("a",{className:"ghost-btn",href:_i,target:"_blank",rel:"noreferrer","data-testid":"hwlab-open-new-from-catalog"},"新窗口")))),r("p",{className:"muted paragraph"},"该入口仅用于外部静态跳转,不会进入 microservice health、proxy 或运行态探测。")),r(yl,{title:"服务映射",eyebrow:"Repo Reference + Runtime"},u.length===0?r(Gl,{title:"暂无用户服务",text:"在 config.json 的 microservices 中登记用户服务的 provider、仓库引用和后端映射"}):r("div",{className:"table-wrap"},r("table",{className:"microservice-table"},r("thead",null,r("tr",null,r("th",null,"服务"),r("th",null,"Provider"),r("th",null,"代码引用"),r("th",null,"Docker 引用"),r("th",null,"后端映射"),r("th",null,"开发入口"),r("th",null,"运行态"),r("th",null,"操作"))),r("tbody",null,u.map((y)=>{let i=PZ(y),_=tp(y),$=WZ(y),A=i.availability||{},j=A.status||(i.providerStatus==="online"?"unknown":"unhealthy");return r("tr",{key:y.id,"data-testid":`microservice-row-${J0(y.id)}`},r("td",null,r("strong",null,y.name),r("code",null,y.id)),r("td",null,r("strong",null,i.providerName||y.providerId),r("code",null,y.providerId)),r("td",null,r("span",null,_.url||"--"),r("code",null,_.commitId||"--")),r("td",null,r("span",null,_.composeFile||"--"),r("code",null,`${_.composeService||"--"} / ${_.containerName||"--"}`)),r("td",null,r(Hl,{status:$.public?"warn":"online"},$.public?"public":"private"),r("code",null,`${$.nodeBindHost||"--"}:${$.nodePort||"--"} -> ${$.proxyMode||"--"}`)),r("td",null,r("span",null,y.development?.sshPassthrough?"SSH 透传":"未配置"),r("code",null,y.development?.worktreePath||"--")),r("td",null,r(Hl,{status:j==="healthy"?"online":j==="unknown"?"warn":"failed"},j),r("span",null,A.reason||i.providerStatus||"unknown"),r(Oy,{data:i.container,empty:"容器快照未上报"})),r("td",null,r("div",{className:"microservice-actions"},y.id==="findjob"?r("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","findjob"),"data-testid":"open-findjob-button"},"打开"):null,y.id==="pipeline"?r("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","pipeline"),"data-testid":"open-pipeline-button"},"打开"):null,y.id==="todo-note"?r("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","todo-note"),"data-testid":"open-todo-note-button"},"打开"):null,y.id==="met-nonlinear"?r("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","met-nonlinear"),"data-testid":"open-met-nonlinear-button"},"打开"):null,y.id==="claudeqq"?r("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","claudeqq"),"data-testid":"open-claudeqq-button"},"打开"):null,y.id==="baidu-netdisk"?r("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","baidu-netdisk"),"data-testid":"open-baidu-netdisk-button"},"打开"):null,y.id==="oa-event-flow"?r("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","oa-event-flow"),"data-testid":"open-oa-event-flow-button"},"打开"):null,y.id==="k3sctl-adapter"?r("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","k3sctl"),"data-testid":"open-k3sctl-button"},"打开"):null,y.id==="code-queue"?r("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","code-queue"),"data-testid":"open-code-queue-button"},"打开"):null,y.id==="mdtodo"?r("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","mdtodo"),"data-testid":"open-mdtodo-button"},"打开"):null,y.id==="decision-center"?r("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","decision-center"),"data-testid":"open-decision-center-button"},"打开"):null,y.id==="project-manager"?r("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","project-manager"),"data-testid":"open-project-manager-button"},"打开"):null,r(lf,{title:`用户服务 ${y.id}`,data:y,onOpen:l}))))}))))))}function Ux({nodes:u,onDispatched:l,onRaw:f}){let n=u.filter((Y)=>Y.status==="online"),[y,i]=du(n[0]?.providerId||u[0]?.providerId||""),[_,$]=du("docker.ps"),[A,j]=du("frontend"),[J,Q]=du("operator-check"),[U,F]=du("normal"),[N,K]=du(!1),[G,W]=du(""),[L,q]=du(!1),[z,Z]=du(null),[T,X]=du("");mn(()=>{if(!y&&(n[0]?.providerId||u[0]?.providerId))i(n[0]?.providerId||u[0].providerId)},[u.length,n.length,y]);function c(){return{source:A,note:J,priority:U}}function S(){W(JSON.stringify(c(),null,2)),K(!0)}async function p(Y){Y.preventDefault(),q(!0),X("");try{let D=N?JSON.parse(G||"{}"):c(),x=await Eu(`${su.apiBaseUrl}/dispatch`,{method:"POST",body:JSON.stringify({providerId:y,command:_,payload:D})});Z(x),await l()}catch(D){X(Xu(D,"下发失败"))}finally{q(!1)}}return r("div",{className:"page-grid dispatch-grid"},r(yl,{title:"下发任务",eyebrow:"Real WebSocket Dispatch"},r("form",{className:"dispatch-form",onSubmit:p},r("label",null,"Provider",r("select",{value:y,onChange:(Y)=>i(Y.target.value)},u.map((Y)=>r("option",{key:Y.providerId,value:Y.providerId},`${Y.name} / ${Y.providerId}`)))),r("label",null,"Command",r("select",{value:_,onChange:(Y)=>$(Y.target.value)},r("option",{value:"docker.ps"},"docker.ps"),r("option",{value:"host.ssh"},"host.ssh"),r("option",{value:"microservice.http"},"microservice.http"),r("option",{value:"echo"},"echo"))),r("label",null,"来源",r("input",{value:A,onChange:(Y)=>j(Y.target.value)})),r("label",null,"备注",r("input",{value:J,onChange:(Y)=>Q(Y.target.value)})),r("label",null,"优先级",r("select",{value:U,onChange:(Y)=>F(Y.target.value)},r("option",{value:"normal"},"normal"),r("option",{value:"low"},"low"),r("option",{value:"urgent"},"urgent"))),r("div",{className:"dispatch-actions"},r("button",{type:"button",className:"ghost-btn",onClick:S},"查看原始JSON"),r("button",{type:"submit",disabled:L||!y},L?"下发中":"下发任务")),N?r("label",{className:"raw-editor-label"},"高级 Payload",r("textarea",{className:"raw-editor",value:G,onChange:(Y)=>W(Y.target.value)})):null,r(ul,{error:T,wide:!0}))),r(yl,{title:"下发结果",eyebrow:"Response"},z?r("div",{className:"result-card"},r(Hl,{status:z.status||"queued"},z.status||"queued"),r("dl",null,r("dt",null,"Task ID"),r("dd",null,r("code",null,z.taskId||"--")),r("dt",null,"Provider 在线"),r("dd",null,Zi(z.providerOnline))),r(lf,{title:"Dispatch Response",data:z,onOpen:f})):r(Gl,{title:"等待操作",text:"任务响应会以结构化结果卡展示"})))}function GZ({task:u,onRaw:l}){return r("article",{className:"compact-row"},r(Hl,{status:u.status}),r("div",null,r("strong",null,u.command),r("code",null,u.id)),r("span",null,$$(u)?`已等待 ${mQ(u.updatedAt)}`:`耗时 ${Rn(OZ(u)??0)}`),r(lf,{title:`Task ${u.id}`,data:x6(u),onOpen:l}))}function RZ({task:u}){let l=OZ(u),f=$$(u);return r("div",{className:"task-duration"},r("strong",null,l===null?"--":Rn(l)),r("span",null,f?`已运行 / 创建 ${Zu(u.createdAt)}`:`创建 ${Zu(u.createdAt)}`))}function Nx({task:u}){let l=String(u?.status||"").toLowerCase(),f=u?.result,n=f&&typeof f==="object"&&!Array.isArray(f)?f:{},i=["exitCode","code","signal","timeoutMs","previousStatus","mode"].filter((_)=>n[_]!==void 0&&n[_]!==null);if(l==="failed"){let _=TZ(u);return r("div",{className:"task-diagnostic failed"},r("b",null,"失败原因"),r("span",{className:"diagnostic-reason"},Zi(_)),i.length>0?r("div",{className:"diagnostic-meta"},i.map(($)=>r("span",{key:$,className:"data-chip"},r("b",null,$),r("span",null,Zi(n[$]))))):null)}if($$(u))return r("div",{className:"task-diagnostic warn"},r("b",null,"等待终态"),r("span",null,`最后更新 ${mQ(u.updatedAt)} 前`));return r("div",{className:"task-diagnostic ok"},r("b",null,"完成摘要"),r(Oy,{data:f,empty:"无执行输出"}))}function Fx({tasks:u,onRaw:l}){let f=u.filter($$);return r("div",{"data-testid":"pending-task-page"},r(yl,{title:"待处理任务",eyebrow:`${f.length} Pending`},f.length===0?r(Gl,{title:"当前无待处理任务",text:"queued / dispatched / running 会在超时后自动转为 failed;历史记录仍可在任务历史中查看"}):r("div",{className:"table-wrap","data-testid":"pending-task-table"},r("table",null,r("thead",null,r("tr",null,r("th",null,"状态"),r("th",null,"任务"),r("th",null,"Provider"),r("th",null,"已等待"),r("th",null,"载荷摘要"),r("th",null,"操作"))),r("tbody",null,f.map((n)=>r("tr",{key:n.id},r("td",null,r(Hl,{status:n.status})),r("td",null,r("strong",null,n.command),r("code",null,n.id)),r("td",null,r("code",null,n.providerId)),r("td",null,mQ(n.updatedAt)),r("td",null,r(Oy,{data:n.payload})),r("td",null,r(lf,{title:`Pending Task ${n.id}`,data:x6(n),onOpen:l})))))))))}function Wx({tasks:u,onRaw:l}){return r("div",{"data-testid":"task-history-page"},r(yl,{title:"任务历史",eyebrow:`${u.length} Tasks`},u.length===0?r(Gl,{title:"暂无任务",text:"下发任务后会在这里看到生命周期"}):r("div",{className:"table-wrap"},r("table",{className:"task-history-table"},r("thead",null,r("tr",null,r("th",null,"状态"),r("th",null,"任务"),r("th",null,"Provider"),r("th",null,"任务耗时"),r("th",null,"载荷摘要"),r("th",null,"诊断信息"),r("th",null,"更新时间"),r("th",null,"操作"))),r("tbody",null,u.map((f)=>r("tr",{key:f.id,"data-testid":`task-row-${J0(f.id)}`},r("td",null,r(Hl,{status:f.status})),r("td",null,r("strong",null,f.command),r("code",null,f.id)),r("td",null,r("code",null,f.providerId)),r("td",null,r(RZ,{task:f})),r("td",null,r(Oy,{data:f.payload})),r("td",null,r(Nx,{task:f})),r("td",null,Zu(f.updatedAt)),r("td",null,r(lf,{title:`Task ${f.id}`,data:x6(f),onOpen:l})))))))))}function qx({tasks:u,onRaw:l}){let f=u.filter((n)=>["succeeded","failed"].includes(n.status));return r(yl,{title:"执行结果",eyebrow:"Finished Tasks"},f.length===0?r(Gl,{title:"暂无结果",text:"任务完成后展示 provider 返回的结构化摘要"}):r("div",{className:"result-grid"},f.map((n)=>r("article",{key:n.id,className:"result-card"},r("div",{className:"node-card-head"},r("strong",null,n.command),r(Hl,{status:n.status})),r("code",null,n.id),r(Oy,{data:n.result,empty:"无执行输出"}),r(lf,{title:`Task Result ${n.id}`,data:x6(n),onOpen:l})))))}function Lx(u){if(!u||typeof u!=="object")return"--";if(u.type==="interval")return`每 ${Rn(Number(u.everySeconds||0))}`;return`每天 ${u.timeOfDay||"03:00"} UTC`}function Kx(u){if(!u||typeof u!=="object")return"--";if(u.type==="pgdata_backup")return`PGDATA -> ${u.remoteBaseDir||"/SERVER_DATA/UNIDESK_PG_DATA"}`;if(u.type==="dispatch")return`${u.providerId||"--"} / ${u.command||"--"}`;return String(u.type||"--")}function zx(u){let l=String(u||"").toLowerCase();if(l==="succeeded")return"online";if(l==="failed")return"failed";if(l==="running"||l==="queued")return"warn";return l}function Gx(u){let l=Number(u?.durationMs);if(Number.isFinite(l)&&l>=0)return Rn(l/1000);let f=j0(u?.startedAt||u?.createdAt);if(f===null)return"--";let y=j0(u?.finishedAt)??Date.now();return Rn(Math.max(0,(y-f)/1000))}function wZ(u){return{id:"unidesk-pgdata-baidu-daily",name:"PGDATA daily Baidu Netdisk backup",description:"Daily PostgreSQL physical base backup uploaded to Baidu Netdisk /SERVER_DATA with monthly rotation.",enabled:!0,timeOfDay:"03:30",actionType:"pgdata_backup",providerId:u[0]?.providerId||"main-server",command:"echo",payloadJson:JSON.stringify({source:"scheduled-task",message:"hello from scheduler"},null,2),remoteBaseDir:"/SERVER_DATA/UNIDESK_PG_DATA",stagingSubdir:"server-data/unidesk-pg-data",timeoutMs:"3600000"}}function wx({schedules:u,scheduleRuns:l,nodes:f,refresh:n,onRaw:y}){let[i,_]=du(wZ(f||[])),[$,A]=du(!1),[j,J]=du(""),[Q,U]=du(""),F=[...l||[]].sort((z,Z)=>(j0(Z.updatedAt)??0)-(j0(z.updatedAt)??0));function N(z,Z){_((T)=>({...T,[z]:Z}))}function K(z){let Z=z?.action||{};_({id:z?.id||"",name:z?.name||"",description:z?.description||"",enabled:z?.enabled!==!1,timeOfDay:z?.schedule?.timeOfDay||"03:30",actionType:Z.type||"dispatch",providerId:Z.providerId||f[0]?.providerId||"main-server",command:Z.command||"echo",payloadJson:JSON.stringify(Z.payload||{source:"scheduled-task"},null,2),remoteBaseDir:Z.remoteBaseDir||"/SERVER_DATA/UNIDESK_PG_DATA",stagingSubdir:Z.stagingSubdir||"server-data/unidesk-pg-data",timeoutMs:String(Z.timeoutMs||3600000)}),U(`正在编辑 ${z?.id||""}`)}function G(){let z={id:i.id,name:i.name,description:i.description,enabled:i.enabled,concurrencyPolicy:"skip",schedule:{type:"daily",timeOfDay:i.timeOfDay,timezone:"Etc/UTC"}};if(i.actionType==="pgdata_backup")return{...z,action:{type:"pgdata_backup",volumeName:"unidesk_pgdata_10gb",remoteBaseDir:i.remoteBaseDir,stagingSubdir:i.stagingSubdir,timeoutMs:Number(i.timeoutMs)||3600000,cleanupLocal:!0}};return{...z,action:{type:"dispatch",providerId:i.providerId,command:i.command,payload:JSON.parse(i.payloadJson||"{}"),timeoutMs:Number(i.timeoutMs)||600000}}}async function W(z){z.preventDefault(),A(!0),J(""),U("");try{let Z=G(),T=encodeURIComponent(String(Z.id));await Eu(`${su.apiBaseUrl}/schedules/${T}`,{method:"PUT",body:JSON.stringify(Z)}),U("定时任务已保存"),await n()}catch(Z){J(Xu(Z,"保存定时任务失败"))}finally{A(!1)}}async function L(z){if(!z?.id)return;A(!0),J(""),U("");try{await Eu(`${su.apiBaseUrl}/schedules/${encodeURIComponent(z.id)}`,{method:"DELETE"}),U(`已删除 ${z.id}`),await n()}catch(Z){J(Xu(Z,"删除定时任务失败"))}finally{A(!1)}}async function q(z){if(!z?.id)return;A(!0),J(""),U("");try{let Z=await Eu(`${su.apiBaseUrl}/schedules/${encodeURIComponent(z.id)}/run`,{method:"POST",body:"{}"});U(`已触发 ${z.id} / ${Z?.run?.id||"run"}`),await n()}catch(Z){J(Xu(Z,"触发定时任务失败"))}finally{A(!1)}}return r("div",{className:"page-grid scheduled-task-page","data-testid":"scheduled-task-page"},r(yl,{title:"定时任务",eyebrow:`${(u||[]).length} Schedules`},(u||[]).length===0?r(Gl,{title:"暂无定时任务",text:"创建 daily / dispatch / PGDATA backup 任务后会在这里展示下一次执行时间和最近结果"}):r("div",{className:"schedule-card-grid"},(u||[]).map((z)=>r("article",{key:z.id,className:"schedule-card","data-testid":`schedule-row-${J0(z.id)}`},r("div",{className:"node-card-head"},r("strong",null,z.name||z.id),r(Hl,{status:z.enabled?"online":"warn"},z.enabled?"enabled":"disabled")),r("code",null,z.id),r("dl",null,r("dt",null,"计划"),r("dd",null,Lx(z.schedule)),r("dt",null,"动作"),r("dd",null,Kx(z.action)),r("dt",null,"下次执行"),r("dd",null,Zu(z.nextRunAt)),r("dt",null,"最近执行"),r("dd",null,z.lastRunAt?`${Zu(z.lastRunAt)} / ${z.lastRunId||"--"}`:"--")),r("div",{className:"dispatch-actions"},r("button",{type:"button",className:"ghost-btn",disabled:$,onClick:()=>K(z)},"编辑"),r("button",{type:"button",className:"ghost-btn",disabled:$,onClick:()=>q(z),"data-testid":`schedule-run-${J0(z.id)}`},"手动触发"),r("button",{type:"button",className:"ghost-btn danger",disabled:$,onClick:()=>L(z)},"删除"),r(lf,{title:`Schedule ${z.id}`,data:z,onOpen:y})))))),r(yl,{title:i.id?"配置定时任务":"新建定时任务",eyebrow:"CRUD"},r("form",{className:"dispatch-form schedule-form",onSubmit:W},r("label",null,"ID",r("input",{value:i.id,onChange:(z)=>N("id",z.target.value)})),r("label",null,"名称",r("input",{value:i.name,onChange:(z)=>N("name",z.target.value)})),r("label",null,"每日执行时间 UTC",r("input",{value:i.timeOfDay,placeholder:"03:30",onChange:(z)=>N("timeOfDay",z.target.value)})),r("label",null,"启用",r("select",{value:i.enabled?"true":"false",onChange:(z)=>N("enabled",z.target.value==="true")},r("option",{value:"true"},"enabled"),r("option",{value:"false"},"disabled"))),r("label",null,"动作类型",r("select",{value:i.actionType,onChange:(z)=>N("actionType",z.target.value)},r("option",{value:"pgdata_backup"},"PGDATA 备份到百度网盘"),r("option",{value:"dispatch"},"Provider Dispatch"))),i.actionType==="pgdata_backup"?[r("label",{key:"remote"},"网盘根目录",r("input",{value:i.remoteBaseDir,onChange:(z)=>N("remoteBaseDir",z.target.value)})),r("label",{key:"staging"},"本地 staging 子目录",r("input",{value:i.stagingSubdir,onChange:(z)=>N("stagingSubdir",z.target.value)}))]:[r("label",{key:"provider"},"Provider",r("select",{value:i.providerId,onChange:(z)=>N("providerId",z.target.value)},(f||[]).map((z)=>r("option",{key:z.providerId,value:z.providerId},`${z.name} / ${z.providerId}`)))),r("label",{key:"command"},"Command",r("select",{value:i.command,onChange:(z)=>N("command",z.target.value)},r("option",{value:"echo"},"echo"),r("option",{value:"docker.ps"},"docker.ps"),r("option",{value:"host.ssh"},"host.ssh"),r("option",{value:"microservice.http"},"microservice.http"))),r("label",{key:"payload",className:"raw-editor-label"},"Payload JSON",r("textarea",{className:"raw-editor",value:i.payloadJson,onChange:(z)=>N("payloadJson",z.target.value)}))],r("label",null,"超时 ms",r("input",{value:i.timeoutMs,onChange:(z)=>N("timeoutMs",z.target.value)})),r("label",{className:"raw-editor-label"},"描述",r("textarea",{className:"raw-editor compact",value:i.description,onChange:(z)=>N("description",z.target.value)})),r("div",{className:"dispatch-actions"},r("button",{type:"button",className:"ghost-btn",disabled:$,onClick:()=>_(wZ(f||[]))},"重置"),r("button",{type:"submit",disabled:$||!i.id},$?"保存中":"保存任务")),Q?r("p",{className:"muted paragraph"},Q):null,r(ul,{error:j,wide:!0}))),r(yl,{title:"历史执行记录",eyebrow:`${F.length} Runs`},F.length===0?r(Gl,{title:"暂无执行记录",text:"定时触发或手动触发后会生成 run history"}):r("div",{className:"table-wrap"},r("table",{className:"task-history-table schedule-run-table"},r("thead",null,r("tr",null,r("th",null,"状态"),r("th",null,"任务"),r("th",null,"触发"),r("th",null,"耗时"),r("th",null,"结果摘要"),r("th",null,"更新时间"),r("th",null,"操作"))),r("tbody",null,F.map((z)=>r("tr",{key:z.id,"data-testid":`schedule-run-row-${J0(z.id)}`},r("td",null,r(Hl,{status:zx(z.status)},z.status)),r("td",null,r("strong",null,z.scheduleId),r("code",null,z.id),z.taskId?r("code",null,z.taskId):null),r("td",null,z.trigger||"--"),r("td",null,Gx(z)),r("td",null,r(Oy,{data:z.result||z.error,empty:"无结果"})),r("td",null,Zu(z.updatedAt)),r("td",null,r(lf,{title:`Schedule Run ${z.id}`,data:z,onOpen:y})))))))))}function Zx({data:u}){let l=u.overview||{};return r("div",{className:"page-grid topology-grid"},r(yl,{title:"公开入口",eyebrow:"Public"},r("div",{className:"endpoint-list"},r("article",null,r("b",null,"Frontend"),r("span",null,su.frontendPublicUrl||window.location.origin),r(Hl,{status:"online"},"public")),r("article",null,r("b",null,"Provider Ingress"),r("span",null,su.providerIngressPublicUrl||"ws://public/ws/provider"),r(Hl,{status:"online"},"public")))),r(yl,{title:"内部服务",eyebrow:"Docker Network Only"},r("div",{className:"endpoint-list"},r("article",null,r("b",null,"backend-core API"),r("span",null,"http://backend-core:8080"),r(Hl,{status:"internal"},"internal")),r("article",null,r("b",null,"database"),r("span",null,"postgres://database:5432/unidesk"),r(Hl,{status:"internal"},"internal")))),r(yl,{title:"运行态",eyebrow:"Runtime"},r("div",{className:"metric-grid"},r(Kl,{label:"DB Ready",value:l.dbReady?"YES":"NO",hint:"internal health"}),r(Kl,{label:"Online Nodes",value:l.onlineNodeCount??0,hint:"provider-gateway self-link"}))))}function Ex({session:u}){return r(yl,{title:"认证策略",eyebrow:"Frontend Login"},r("div",{className:"policy-grid"},r("article",null,r("span",null,"默认账号"),r("strong",null,su.authUsername||"admin")),r("article",null,r("span",null,"当前会话"),r("strong",null,u?.user?.username||"--")),r("article",null,r("span",null,"Session TTL"),r("strong",null,`${su.sessionTtlSeconds||0}s`)),r("article",null,r("span",null,"API 访问"),r("strong",null,"同源 Cookie 保护"))),r("p",{className:"muted paragraph"},"浏览器只访问 frontend 同源接口;frontend 容器使用 Docker 内网代理 backend-core API。"))}function Hx(){return r(yl,{title:"安全边界",eyebrow:"Exposure Rule"},r("div",{className:"security-board"},r("article",{className:"allow"},r("b",null,"允许公网"),r("span",null,"frontend 登录入口"),r("span",null,"provider ingress WebSocket/health")),r("article",{className:"deny"},r("b",null,"禁止公网"),r("span",null,"backend-core REST API"),r("span",null,"PostgreSQL database")),r("article",null,r("b",null,"数据库卷"),r("span",null,"named volume unidesk_pgdata_10gb"),r("span",null,"CLI stop/start 不删除数据卷"))))}function Ox({activeModule:u,activeTab:l,data:f,session:n,refresh:y,onRaw:i,onNavigate:_}){if(u==="ops"&&l==="status")return r(mp,{data:f,onRaw:i,onNavigate:_});if(u==="ops"&&l==="performance")return r(yx,{onRaw:i});if(u==="ops"&&l==="events")return r(bp,{events:f.events,onRaw:i});if(u==="ops"&&l==="logs")return r(kp,{logs:f.logs,onRaw:i});if(u==="nodes"&&l==="list")return r(hp,{nodes:f.nodes,onRaw:i});if(u==="nodes"&&l==="monitor")return r(ap,{nodes:f.nodes,systemStatuses:f.systemStatuses,tasks:f.tasks,onRaw:i,refresh:y});if(u==="nodes"&&l==="docker")return r(jx,{nodes:f.nodes,dockerStatuses:f.dockerStatuses,onRaw:i});if(u==="nodes"&&l==="gateway")return r($x,{nodes:f.nodes,tasks:f.tasks,onRaw:i});if(u==="nodes"&&l==="labels")return r(Ip,{nodes:f.nodes});if(u==="nodes"&&l==="heartbeats")return r(vp,{nodes:f.nodes});if(u==="tasks"&&l==="dispatch")return r(Ux,{nodes:f.nodes,onDispatched:y,onRaw:i});if(u==="tasks"&&l==="scheduled")return r(wx,{schedules:f.schedules,scheduleRuns:f.scheduleRuns,nodes:f.nodes,refresh:y,onRaw:i});if(u==="tasks"&&l==="pending")return r(Fx,{tasks:f.pendingTasks,onRaw:i});if(u==="tasks"&&l==="history")return r(Wx,{tasks:f.tasks,onRaw:i});if(u==="tasks"&&l==="results")return r(qx,{tasks:f.tasks,onRaw:i});if(u==="apps"&&l==="catalog")return r(Qx,{microservices:f.microservices,onRaw:i,onNavigate:_});if(u==="apps"&&l==="hwlab")return r(IL,{});if(u==="apps"&&l==="todo-note")return r(nZ,{microservices:f.microservices,onRaw:i,apiBaseUrl:su.apiBaseUrl});if(u==="apps"&&l==="findjob")return r(kL,{microservices:f.microservices,onRaw:i,apiBaseUrl:su.apiBaseUrl});if(u==="apps"&&l==="pipeline")return r(sw,{microservices:f.microservices,onRaw:i,apiBaseUrl:su.apiBaseUrl});if(u==="apps"&&l==="met-nonlinear")return r(oL,{microservices:f.microservices,onRaw:i,apiBaseUrl:su.apiBaseUrl});if(u==="apps"&&l==="claudeqq")return r(yq,{microservices:f.microservices,onRaw:i,apiBaseUrl:su.apiBaseUrl});if(u==="apps"&&l==="baidu-netdisk")return r(lq,{microservices:f.microservices,onRaw:i,apiBaseUrl:su.apiBaseUrl});if(u==="apps"&&l==="filebrowser")return r(bL,{microservices:f.microservices,onRaw:i,apiBaseUrl:su.apiBaseUrl});if(u==="apps"&&l==="oa-event-flow")return r(AK,{microservices:f.microservices,onRaw:i,apiBaseUrl:su.apiBaseUrl});if(u==="apps"&&l==="k3sctl")return r(rZ,{microservices:f.microservices,onRaw:i,apiBaseUrl:su.apiBaseUrl,onNavigate:_});if(u==="apps"&&l==="code-queue")return r(OL,{microservices:f.microservices,onRaw:i,apiBaseUrl:su.apiBaseUrl,initialTasksData:wp});if(u==="apps"&&l==="mdtodo")return r(lK,{microservices:f.microservices,onRaw:i,apiBaseUrl:su.apiBaseUrl});if(u==="apps"&&l==="decision-center")return r(ML,{microservices:f.microservices,onRaw:i,apiBaseUrl:su.apiBaseUrl});if(u==="apps"&&l==="project-manager")return r(dw,{microservices:f.microservices,onRaw:i,apiBaseUrl:su.apiBaseUrl});if(u==="config"&&l==="topology")return r(Zx,{data:f});if(u==="config"&&l==="auth")return r(Ex,{session:n});if(u==="config"&&l==="security")return r(Hx);return r(Gl,{title:"未找到页面",text:"请选择左侧主模块和顶部子功能标签"})}function Tx({session:u,onLogout:l}){let f=g7(g0,window.location.pathname),[n,y]=du(f.moduleId),[i,_]=du({...k3,[f.moduleId]:f.tabId}),[$,A]=du({overview:null,nodes:[],systemStatuses:[],dockerStatuses:[],microservices:[],events:[],tasks:[],pendingTasks:[],schedules:[],scheduleRuns:[],logs:[]}),[j,J]=du({ok:!1,text:"连接中"}),[Q,U]=du(null),[F,N]=du(new Date),[K,G]=du(null),[W,L]=du(!1),[q,z]=du(!1),Z=Hy.default.useRef(!1),T=g0.moduleById[n]||g0.modules[0],X=i[n]||k3[n]||T.tabs[0].id,c=Array.isArray($.microservices)?$.microservices:[],S=c.length===0&&n==="apps"&&X==="code-queue"?[Zp]:c,p=S===c?$:{...$,microservices:S},Y=n==="apps"?S.find((R)=>String(R?.id||"")===(X==="k3sctl"?"k3sctl-adapter":X)):null,D=Y?PZ(Y):{},x=T.tabs.find((R)=>R.id===X)?.label||X,V=Y?[{key:"microservice",label:"用户服务",value:`${x} ${D.providerStatus==="online"?"在线":D.providerStatus||"未知"}`,tone:D.providerStatus==="online"?"ok":"warn",testId:"active-microservice-status"}]:[];async function t(){if(Z.current)return;Z.current=!0,z(!0);try{let R=[],m=(Lu,Bu)=>{R.push([Lu,Eu(Bu)])},fu=n==="ops"&&X==="status",iu=fu||n==="config"&&X==="topology",Ju=fu||n==="nodes"||n==="tasks"&&(X==="dispatch"||X==="scheduled"),Vu=n==="apps"&&X!=="code-queue";if(iu)m("overview",`${su.apiBaseUrl}/overview`);if(Ju)m("nodes",`${su.apiBaseUrl}/nodes`);if(n==="nodes"&&X==="monitor")m("systemStatuses",`${su.apiBaseUrl}/nodes/system-status?limit=60`),m("tasks",`${su.apiBaseUrl}/tasks?limit=120&summary=1`);else if(n==="nodes"&&X==="docker")m("dockerStatuses",`${su.apiBaseUrl}/nodes/docker-status`);else if(n==="nodes"&&X==="gateway")m("tasks",`${su.apiBaseUrl}/tasks?limit=300&summary=1`);else if(n==="tasks"&&X==="scheduled")m("schedules",`${su.apiBaseUrl}/schedules?limit=100`),m("scheduleRuns",`${su.apiBaseUrl}/schedules/runs?limit=100`);else if(n==="tasks"&&X==="pending")m("pendingTasks",`${su.apiBaseUrl}/tasks?status=pending&limit=100&summary=1`);else if(n==="tasks"&&(X==="history"||X==="results"))m("tasks",`${su.apiBaseUrl}/tasks?limit=300&summary=1`);else if(fu)m("tasks",`${su.apiBaseUrl}/tasks?limit=8&lite=1`),m("pendingTasks",`${su.apiBaseUrl}/tasks?status=pending&limit=20&lite=1`);if(Vu)m("microservices",`${su.apiBaseUrl}/microservices`);if(n==="ops"&&X==="events")m("events",`${su.apiBaseUrl}/events?limit=100`);if(n==="ops"&&X==="logs")m("logs","/logs?limit=100");await Promise.all(R.map(async([Lu,Bu])=>{let b=await Bu,o={};if(Lu==="overview")o.overview=b;if(Lu==="nodes")o.nodes=b.nodes||[];if(Lu==="systemStatuses")o.systemStatuses=b.systemStatuses||[];if(Lu==="dockerStatuses")o.dockerStatuses=b.dockerStatuses||[];if(Lu==="microservices")o.microservices=b.microservices||[];if(Lu==="events")o.events=b.events||[];if(Lu==="tasks")o.tasks=b.tasks||[];if(Lu==="pendingTasks")o.pendingTasks=b.tasks||[];if(Lu==="schedules")o.schedules=b.schedules||[];if(Lu==="scheduleRuns")o.scheduleRuns=b.runs||[];if(Lu==="logs")o.logs=b.logs||[];A((nu)=>({...nu,...o}))})),J({ok:!0,text:"核心在线"}),U(new Date)}catch(R){if(J({ok:!1,text:Xu(R,"连接失败")}),R.status===401)l(!1)}finally{Z.current=!1,z(!1)}}mn(()=>{let R=()=>{if(!UZ())return;t()};R();let m=setInterval(R,Hp(n,X)),fu=()=>{if(UZ())R()};return document.addEventListener("visibilitychange",fu),()=>{clearInterval(m),document.removeEventListener("visibilitychange",fu)}},[n,X]),mn(()=>{let R=setInterval(()=>N(new Date),1000);return()=>clearInterval(R)},[]),mn(()=>{let R=iK(g0,window.location.pathname);if(R&&window.location.pathname!==R)window.history.replaceState(null,"",R)},[]),mn(()=>{let R=()=>{let m=g7(g0,window.location.pathname);y(m.moduleId),_((fu)=>({...fu,[m.moduleId]:m.tabId})),G(null)};return window.addEventListener("popstate",R),()=>window.removeEventListener("popstate",R)},[]),mn(()=>{window.scrollTo({top:0,left:0,behavior:"auto"})},[n,X]);function M(R,m,fu="push"){let iu=g0.moduleById[R]?R:g0.fallbackTarget.moduleId,Ju=g0.moduleById[iu]?.tabs.some((Lu)=>Lu.id===m)?m:k3[iu]||g0.moduleById[iu]?.tabs[0]?.id||g0.fallbackTarget.tabId;y(iu),_((Lu)=>({...Lu,[iu]:Ju}));let Vu=qA(g0,iu,Ju);if(window.location.pathname!==Vu){let Lu=fu==="replace"?"replaceState":"pushState";window.history[Lu](null,"",Vu)}}function I(R,m){G({title:R,data:m})}let[O,C]=du(!1),{unreadCount:g,notifications:a}=kf(),yu=a.length>0?a[a.length-1]:null,ru=HZ(QZ);return r("div",{className:`shell ${W?"rail-collapsed":""} ${ru?"dev-shell":""}`,"data-testid":"app-shell"},r(pp,{activeModule:n,activeTabs:i,onNavigate:M,collapsed:W,onToggle:()=>L((R)=>!R)}),r("main",{className:"workspace"},r(Mp,{connection:j,lastRefresh:Q,onRefresh:t,onLogout:()=>l(!0),session:u,clock:F,activeStatusItems:V,onNotificationToggle:()=>C((R)=>!R),unreadCount:g,environment:QZ}),r(xp,{module:T,activeTab:X,onNavigate:M}),r(xQ.Provider,{value:q},r(Ox,{activeModule:n,activeTab:X,data:p,session:u,refresh:t,onRaw:I,onNavigate:M}))),r(Sp,{raw:K,onClose:()=>G(null)}),yu&&r(JZ,{key:yu.id,notification:yu}),O&&r(jZ,{onClose:()=>C(!1)}))}function Vx(){let[u,l]=du(!0),[f,n]=du(null);async function y(){l(!0);try{let _=await Eu("/api/session");n(_.authenticated?_:null)}catch{n(null)}finally{l(!1)}}async function i(_){if(_)try{await Eu("/logout",{method:"POST"})}catch{}n(null)}if(mn(()=>{y()},[]),u)return r("main",{className:"loading-screen"},r("div",{className:"brand-mark"},"UD"),r("span",null,"加载会话"));if(!f)return r(Pp,{onLogin:n});return r(uq,null,r(Tx,{session:f,onLogout:i}))}var bZ=document.getElementById("root");if(bZ===null)throw Error("root element not found");ZZ.createRoot(bZ).render(r(Vx));})(); diff --git a/src/components/frontend/src/app.tsx b/src/components/frontend/src/app.tsx index 7739ed11..8c2b1d9d 100644 --- a/src/components/frontend/src/app.tsx +++ b/src/components/frontend/src/app.tsx @@ -784,11 +784,50 @@ function HeartbeatPage({ nodes }: AnyRecord) { ); } +function metricPointFromCurrent(current: AnyRecord): AnyRecord { + const cpu = current?.cpu || {}; + const memory = current?.memory || {}; + const disk = current?.disk || {}; + return { + at: current?.collectedAt, + cpuPercent: asNumber(cpu.percent), + memoryPercent: asNumber(memory.percent), + diskPercent: asNumber(disk.percent), + memoryUsedBytes: asNumber(memory.usedBytes), + memoryTotalBytes: asNumber(memory.totalBytes), + diskUsedBytes: asNumber(disk.usedBytes), + diskTotalBytes: asNumber(disk.totalBytes), + load1: asNumber(cpu.load1), + }; +} + +function synchronizedMetricPoints(history: any[], current: AnyRecord | null): AnyRecord[] { + if (!current) return []; + const currentPoint = metricPointFromCurrent(current); + const currentAt = timeMs(currentPoint.at); + const points = (Array.isArray(history) ? history : []) + .filter((point) => point && typeof point === "object") + .filter((point) => currentAt === null || timeMs(point.at) !== currentAt); + points.push(currentPoint); + return points + .sort((left, right) => (timeMs(left.at) ?? 0) - (timeMs(right.at) ?? 0)) + .slice(-60); +} + function NodeMonitorPage({ nodes, systemStatuses, tasks, onRaw, refresh }: AnyRecord) { const [selectedProvider, setSelectedProvider] = useState(""); const merged = useMemo(() => nodes.map((node: any) => { const status = systemStatuses.find((item: any) => item.providerId === node.providerId); - return { ...node, systemCurrent: status?.current || null, systemHistory: status?.history || [], systemUpdatedAt: status?.updatedAt || null }; + return { + ...node, + systemCurrent: status?.current || null, + systemLastKnown: status?.lastKnown || null, + systemCurrentCollectedAt: status?.currentCollectedAt || null, + systemStale: Boolean(status?.stale), + systemStaleSeconds: status?.staleSeconds ?? null, + systemHistory: status?.history || [], + systemUpdatedAt: status?.updatedAt || null, + }; }), [nodes, systemStatuses]); const active = merged.find((node: any) => node.providerId === selectedProvider) || merged[0] || null; useEffect(() => { @@ -802,12 +841,10 @@ function NodeMonitorPage({ nodes, systemStatuses, tasks, onRaw, refresh }: AnyRe const cpu = current?.cpu || {}; const memory = current?.memory || {}; const disk = current?.disk || {}; - const points = history.length > 0 ? history : current ? [{ - at: current.collectedAt, - cpuPercent: asNumber(cpu.percent), - memoryPercent: asNumber(memory.percent), - diskPercent: asNumber(disk.percent), - }] : []; + const points = synchronizedMetricPoints(history, current); + const staleText = active.systemCurrentCollectedAt + ? `最后采样 ${fmtDate(active.systemCurrentCollectedAt)},已过期 ${fmtDuration(asNumber(active.systemStaleSeconds))}` + : "最后采样时间不可用"; return h("div", { className: "monitor-page", "data-testid": "node-monitor-page" }, h("div", { className: "docker-node-strip" }, @@ -820,7 +857,7 @@ function NodeMonitorPage({ nodes, systemStatuses, tasks, onRaw, refresh }: AnyRe h("span", { className: `pulse ${node.status}` }), h("strong", null, node.name), h("code", null, node.providerId), - h("span", null, node.systemCurrent ? `CPU ${fmtPercent(node.systemCurrent.cpu?.percent)} / MEM ${fmtPercent(node.systemCurrent.memory?.percent)}` : "等待指标"), + h("span", null, node.systemCurrent ? `CPU ${fmtPercent(node.systemCurrent.cpu?.percent)} / MEM ${fmtPercent(node.systemCurrent.memory?.percent)}` : node.systemStale ? "指标过期" : "等待指标"), )), ), h("div", { className: "monitor-layout" }, @@ -828,9 +865,9 @@ function NodeMonitorPage({ nodes, systemStatuses, tasks, onRaw, refresh }: AnyRe title: "任务管理器视图", eyebrow: active.name, className: "monitor-main-panel", - actions: current ? h(RawButton, { title: `System ${active.providerId}`, data: { current, history }, onOpen: onRaw }) : null, + actions: current || active.systemStale ? h(RawButton, { title: `System ${active.providerId}`, data: { current, lastKnown: active.systemLastKnown, currentCollectedAt: active.systemCurrentCollectedAt, stale: active.systemStale, staleSeconds: active.systemStaleSeconds, history }, onOpen: onRaw }) : null, }, - !current ? h(EmptyState, { title: "系统指标未上报", text: "provider-gateway 会周期性采集 /proc 与 df,并保存历史曲线" }) : + !current ? h(EmptyState, { title: active.systemStale ? "系统指标已过期" : "系统指标未上报", text: active.systemStale ? `${staleText};等待 provider-gateway 恢复 system.status 上报` : "provider-gateway 会周期性采集 /proc 与 df,并保存历史曲线" }) : h("div", null, h("div", { className: "monitor-hero" }, h("div", null, @@ -854,7 +891,7 @@ function NodeMonitorPage({ nodes, systemStatuses, tasks, onRaw, refresh }: AnyRe h(MetricCard, { label: "CPU 当前", value: fmtPercent(cpu.percent), hint: `history ${points.length} samples`, tone: "ok" }), h(MetricCard, { label: "实际内存", value: fmtBytes(memory.usedBytes), hint: `${fmtPercent(memory.percent)} 不含缓存` }), h(MetricCard, { label: "硬盘已用", value: fmtBytes(disk.usedBytes), hint: fmtPercent(disk.percent) }), - h(MetricCard, { label: "更新时间", value: fmtDate(active.systemUpdatedAt || current.collectedAt), hint: active.providerId }), + h(MetricCard, { label: "更新时间", value: fmtDate(current.collectedAt || active.systemUpdatedAt), hint: active.providerId }), ), h(ProcessResourceTable, { current, onRaw }), ), diff --git a/src/components/shared/src/index.ts b/src/components/shared/src/index.ts index f5e37f12..c033d68a 100644 --- a/src/components/shared/src/index.ts +++ b/src/components/shared/src/index.ts @@ -278,6 +278,10 @@ export interface ApiNodeSystemStatus { name: string; nodeStatus: "online" | "offline"; current: JsonValue | null; + lastKnown?: JsonValue | null; + currentCollectedAt?: string | null; + stale?: boolean; + staleSeconds?: number | null; history: JsonValue[]; updatedAt: string | null; }