From 7b9aa4261c216586954cdf926ce2c914a9db5ae3 Mon Sep 17 00:00:00 2001 From: Codex Date: Thu, 21 May 2026 12:19:38 +0000 Subject: [PATCH] feat(frontend): add HWLAB external entry --- docs/reference/frontend.md | 1 + docs/reference/microservices.md | 3 +- src/components/frontend/public/app.js | 191 ++++++++++++---------- src/components/frontend/public/style.css | 62 +++++++ src/components/frontend/src/app.tsx | 27 +++ src/components/frontend/src/hwlab.tsx | 103 ++++++++++++ src/components/frontend/src/navigation.ts | 1 + 7 files changed, 297 insertions(+), 91 deletions(-) create mode 100644 src/components/frontend/src/hwlab.tsx diff --git a/docs/reference/frontend.md b/docs/reference/frontend.md index 19825a42..dc81b05b 100644 --- a/docs/reference/frontend.md +++ b/docs/reference/frontend.md @@ -91,6 +91,7 @@ frontend shell 必须把左侧主模块与顶部子标签编译为统一的 URL - `用户服务` 主模块用于展示挂载在计算节点或主 server Docker 中的业务后端。 - `服务目录` 必须显示 service id、Provider、仓库 URL、commit id、业务 Dockerfile/docker-compose 引用、节点后端私有映射、SSH 透传开发入口和运行态容器摘要。 + - `HWLAB` 仅作为外部静态入口展示,固定跳转到 `http://74.48.78.17:6666`,可在目录页和独立子标签中打开;它不是 UniDesk 用户服务,不得纳入 microservice health、backend proxy、provider-gateway 透传或运行态容器摘要。 - `Todo Note` 子标签必须把主 server `todo-note-backend` 后端渲染为 UniDesk React 控件,包括迁移清单、树形任务、筛选、提醒、拖放/移动、撤销/重做、字号控制和显式原始 JSON 按钮。 - `FindJob` 子标签必须把 D601 findjob 后端渲染为 UniDesk React 控件,包括岗位指标、岗位预览、草稿报告和显式原始 JSON 按钮。 - `ClaudeQQ` 子标签必须把 D601 ClaudeQQ 后端渲染为 UniDesk React 控件,包括 NapCat 容器登录二维码、NapCat HTTP/WS 状态、事件缓存、QQ 事件订阅表、订阅创建表单、消息推送表单、主用户私聊账号 `645275593` 标记、最近 QQ 事件、已发送记录和显式原始 JSON 按钮。 diff --git a/docs/reference/microservices.md b/docs/reference/microservices.md index 91df5459..707178fb 100644 --- a/docs/reference/microservices.md +++ b/docs/reference/microservices.md @@ -22,6 +22,7 @@ UniDesk 用户服务是挂载到 UniDesk 核心服务上的、面向用户使用 - `deployment.mode`,用于明确部署责任边界;`unidesk-direct` 表示 UniDesk 直接登记和探测目标 provider 上的容器,`internal-sidecar` 表示主 server Compose 内的轻量控制面/基础设施服务,`k3sctl-managed` 表示 UniDesk 只登记逻辑服务并经 `deployment.adapterServiceId` 指向的 `k3sctl-adapter` 访问,代管条目还必须写明 `k3sServiceId`、`namespace`、`expectedNodeIds` 和当前 `activeNodeId`。 - `development.providerId`、`development.sshPassthrough=true` 和 `development.worktreePath`,用于说明开发调试入口必须在计算节点上通过 UniDesk SSH 透传完成。 - `frontend.route` 和 `frontend.integrated=true`,用于说明该业务前端已经整合到 UniDesk React 控制台,而不是继续公开业务自身前端。 +- `HWLAB` 是前端内置的外部静态入口,固定目标为 `http://74.48.78.17:6666`;它不属于 `config.json` 的用户服务登记,不进入 health/proxy/runtime 采集,也不需要 provider-gateway、backend-core 或 microservice HTTP 代理参与。 ## Runtime Configuration And Persistence Contract @@ -225,7 +226,7 @@ D601 上必须显式使用原生 k3s kubeconfig:`KUBECONFIG=/etc/rancher/k3s/k - 队列语义:`POST /api/tasks` 或 `/api/tasks/batch` 入队,服务始终只运行一个 Codex turn;当前任务真正终止后才推进下一个任务。`GET /api/tasks` 与 `GET /api/tasks/{id}` 返回队列、attempt、judge 和输出;`GET /api/tasks/{id}/summary` 返回按任务 ID 查询的结构化摘要,包括初始 prompt、最后 assistant message、工具调用摘要、attempt、judge、错误和耗时;CLI 入口是 `bun scripts/cli.ts codex task `。`GET|POST /api/tasks/{id}/judge?attempt=N` 与 CLI `bun scripts/cli.ts codex judge --attempt N` 用于单步复现指定 attempt 的 judge,必须复用真实队列 worker 的上下文构建、prompt 压缩、MiniMax 调用、JSON 去噪/repair 和 fallback 路径;`dryRun=1`/`--dry-run` 只输出 prompt/payload 和重建诊断,不调用 MiniMax。`POST /api/tasks/{id}/steer` 向运行中 turn 推入 prompt;`POST /api/tasks/{id}/interrupt` 或 `DELETE /api/tasks/{id}` 打断/取消;`POST /api/tasks/{id}/retry` 手动重试。队列 worker 必须隔离单个 task 的异常,不能因为某个 app-server、数据库 claim、judge 异常、judge 超时或 judge 判定 `fail` 让后续 queued 任务停止;`fail` 只把当前任务标为 failed,随后必须继续扫描并推进下一个 queued/retry_wait 任务。数据库 claim 必须有硬超时且失败时释放 active run slot;judge 必须有独立 watchdog,超时后走 fallback judge 并继续推进。当存在 queued/retry_wait 且 worker 空闲时,watchdog 必须自动重新调度。 - 稳定性与重启恢复:Code Queue 的第一目标是长期稳定可用;部署修复或运维排障时不得因为担心容器重启会打断任务而拒绝重启、重建或替换 active Pod。容器重启、服务进程重启和镜像替换后,队列、`promptHistory`、running/judging/retry_wait 任务和 active session 元数据必须从 PostgreSQL 恢复,并在已有 `codexThreadId` 可用时用 `thread/resume` 和 continuation prompt 无缝继续当前任务;如果原 app-server turn 已丢失,也必须把当前任务恢复到可 retry/continue 的状态,不能错误推进下一个任务或永久卡住。D601 侧重建必须走未来受控 target-side CD 路径;禁止先手工 `docker rm`、只手工 `docker compose up` 或用维护通道直连 D601 部署 Code Queue 再依赖后续命令补救,因为中断窗口会让 Pod/容器消失并触发 frontend/core 用户服务代理失败。重启后出现 active task 丢失、手动 steer/interrupt 记录丢失、running 任务卡死、误判完成、跳过当前任务、容器消失或阻塞队列,均属于 Code Queue 的 P0 核心缺陷,必须先修复并补充 restart-recovery 验收,不能把“避免重启”作为交付策略。 - 调度与 active run slot:Code Queue 必须把“queue processor 正在等待/退避/轮询”和“实际占用 Codex/OpenCode 子进程运行槽”分开建模;`CODE_QUEUE_MAX_ACTIVE_QUEUES` 只限制真实 active run slot,不能把 retry backoff、等待内存下降或等待前序任务的 `processingQueues` 计入 active slot,否则设置全局 active slot 上限时,一个空等队列会把其他 runnable queue 永久饿死。多个 queue 同时等待 active slot 时必须显式维护 FIFO waiter 队列,避免某个长 retry/backoff 队列刚释放 slot 就立刻重抢,导致更早进入等待的 `retry_wait` 任务长期饥饿;`/health` 必须同时暴露真实 `activeQueueIds`、`activeRunSlotCount`、等待中的 `processingQueueIds` 和 active slot waiters,排障时以 active run slot 与 waiter 顺序判断是否真的有任务在跑、谁应下一个启动。restart-recovery 后的 `retry_wait` 任务若缺失 `codexThreadId`/OpenCode session id,不得无限拒绝 retry;必须用紧凑 recovery prompt 和原始任务摘要重新开一个 agent thread/session,让任务继续推进并在 Trace 中留下 recovery 证据。任何修改 scheduler、retry backoff、queue move、manual retry、shutdown recovery 或内存等待逻辑时,都必须保留“空等 processor 不占 active run slot”、“等待者 FIFO 不饥饿”和“缺失 thread/session 可恢复”的自测或 live 验证。 -- 内存优化过程与防回归:Code Queue 已迁移到 D601,但内存治理仍必须按“PostgreSQL 权威源优先、进程热状态最小化、容器硬上限兜底”的顺序设计。长期可复用的优化路径是:先确认任务、queue、readAt、promptHistory、active session 和通知 outbox 均可从 PostgreSQL 恢复;再把历史任务列表、详情、统计、Trace/output 和 `/health` 的只读查询改为 PostgreSQL 直读或聚合查询;随后只把 `queued`、`running`、`judging`、`retry_wait` 等调度必需任务载入 Bun 堆,并在 PostgreSQL 查询侧裁剪 hot `output`/`events`;最后用 dirty-only flush、append-only 输出归档、Codex SQLite 小批量导出、`bun --smol`、`mem_limit=600m`、`memswap_limit=1536m`、`NODE_OPTIONS=--max-old-space-size=768` 和 cgroup memory watchdog 作为运行时防线。PostgreSQL 到进程的单次读取足够快,不能为了减少 SQL 查询把全部历史 `task_json`、Trace、output 或统计摘要常驻内存;任何新增缓存都必须有默认较小的环境变量上限、明确淘汰策略、可从 PostgreSQL 或 append-only 归档重建,且不得影响重启恢复。新增或修改 `/api/tasks`、overview、stats、summary、transcript、output、trace、health、flush、scheduler 和通知路径时,禁止在常规请求中调用会物化全量历史任务 JSON 的代码,禁止启动后无条件重写全量历史 task JSON,禁止用未设上限的 `Map`/数组保存历史 output/event/Trace,`CODE_QUEUE_MAX_ACTIVE_QUEUES=0` 表示不按 queue 数量设置全局排队上限;如显式设置为正数,必须同时说明内存预算并补充内存压测验收。memory watchdog 必须以 cgroup working set 为主要判断,且在 swap 仍有余量时不得提前杀掉唯一 active run;否则 TypeScript/Playwright 这类短时高内存验证会被错误中断并让 retry 队列反复震荡。 +- 内存优化过程与防回归:Code Queue 已迁移到 D601,但内存治理仍必须按“PostgreSQL 权威源优先、进程热状态最小化、容器硬上限兜底”的顺序设计。长期可复用的优化路径是:先确认任务、queue、readAt、promptHistory、active session 和通知 outbox 均可从 PostgreSQL 恢复;再把历史任务列表、详情、统计、Trace/output 和 `/health` 的只读查询改为 PostgreSQL 直读或聚合查询;随后只把 `queued`、`running`、`judging`、`retry_wait` 等调度必需任务载入 Bun 堆,并在 PostgreSQL 查询侧裁剪 hot `output`/`events`;最后用 dirty-only flush、append-only 输出归档、Codex SQLite 小批量导出、`bun --smol`、`NODE_OPTIONS=--max-old-space-size=1024`、production scheduler k3s `request/limit memory=15Gi`、legacy Compose `mem_limit=15g`/`memswap_limit=16g` 和 cgroup memory watchdog 作为运行时防线。PostgreSQL 到进程的单次读取足够快,不能为了减少 SQL 查询把全部历史 `task_json`、Trace、output 或统计摘要常驻内存;任何新增缓存都必须有默认较小的环境变量上限、明确淘汰策略、可从 PostgreSQL 或 append-only 归档重建,且不得影响重启恢复。新增或修改 `/api/tasks`、overview、stats、summary、transcript、output、trace、health、flush、scheduler 和通知路径时,禁止在常规请求中调用会物化全量历史任务 JSON 的代码,禁止启动后无条件重写全量历史 task JSON,禁止用未设上限的 `Map`/数组保存历史 output/event/Trace,`CODE_QUEUE_MAX_ACTIVE_QUEUES=0` 表示不按 queue 数量设置全局排队上限,不等价于常规 5 / burst 10;如显式设置为正数,必须同时说明内存预算并补充内存压测验收。memory watchdog 必须以 cgroup working set 为主要判断,且在 swap 仍有余量时不得提前杀掉唯一 active run;否则 TypeScript/Playwright 这类短时高内存验证会被错误中断并让 retry 队列反复震荡。 - 列表/详情延迟优化原则:Code Queue 控制面交互的长期目标是常规历史规模下首屏、`GET /api/tasks/overview`、`POST /api/tasks//read` 和分页加载均在 1s 内完成;性能面板出现十几秒级 `core_proxy` 或 Code Queue 用户服务代理慢操作时,必须优先按后端查询形态和前后端通信策略定位,不能把问题归因于 React 渲染后只改 UI。后端优化顺序是:先为 queue、status、updated/created 时间、readAt/terminal unread 和常用筛选条件补齐 PostgreSQL 索引;再用 SQL `COUNT`、`GROUP BY`、条件聚合和分页 ID 查询生成 queue/status/stats/unread 摘要;随后按 ID 轻量加载当前页、selected、active 和 unread priority task,禁止为了列表或已读操作解析完整 Trace、output archive、Codex transcript 或物化全量历史 `task_json`。`read`/`read-all` 这类 mutation 必须是 SQL-only 更新并返回最小 patch/queue 计数,不能触发 overview 全量重算或重载所有任务;启动 warm 只能预热小体积聚合和索引路径,不得把历史任务作为常驻缓存。允许 frontend/backend 代理使用秒级、严格有界、mutation 自动失效的 overview micro-cache 来吸收重复刷新,但 cache 只能作为抖动保护,不能替代数据库索引、聚合查询和分页披露,也不能让 stale readAt/queue/status 状态跨设备可见。 - Trace/实时输出热路径防回归:Code Queue 的 `appendOutput`、output archive append、`publishTaskEvent`、SSE `/api/events`、任务列表、overview、task meta 和 `/health` 都属于热路径,必须保持 O(1) 或明确小常数上界;这些路径不得同步调用完整 transcript 构建器、`taskFullOutput`、output archive 全量读取、Codex session/log 文件解析、完整 `task_json` 物化或任何会随历史输出长度增长的统计。输出追加时必须增量维护轻量持久化指标,至少包括 `stepCount`、`llmStepCount`、`outputMaxSeq` 或等价字段;列表、overview、meta、SSE 事件和 `/health` 只能读取这些指标或小体积 SQL 聚合。完整 Trace、`trace-summary`、`trace-steps`、`trace-step`、transcript/output 详情允许在显式详情请求中解析归档,但必须分页或有界、使用短 TTL 或容量受限缓存,并在 archive append 后失效。若 frontend 性能面板出现 Code Queue 用户服务代理 502、`/api/tasks/overview`/trace 接口成批超时,或容器内 `/health` 在 active output 持续追加时也卡住,优先按 Bun event-loop starvation/backpressure 排查,而不是先改 React 渲染;修复必须证明热路径不再随 output/archive 历史线性增长。 - Trace STEP 权威来源:`GET /api/tasks//trace-steps` 与 `GET /api/tasks//trace-step` 必须直接从 `oa-event-flow` 读取 `trace-step-created` 事实事件,并在响应中暴露 `source=oa-event-flow`;不得在 OA 事件缺失、读取失败或本地 transcript 数量更多/更少时静默回退到 `task-transcript`、Codex session JSONL、output archive 或内存热状态。OA 事件不可用应显式失败或返回空事实集,避免 STEP 计数和执行过程摘要重新形成双路径分叉。 diff --git a/src/components/frontend/public/app.js b/src/components/frontend/public/app.js index fb7ad6db..a1e0d68b 100644 --- a/src/components/frontend/public/app.js +++ b/src/components/frontend/public/app.js @@ -1,60 +1,71 @@ -(()=>{var cT=Object.create;var{getPrototypeOf:$T,defineProperty:sj,getOwnPropertyNames:_T}=Object;var AT=Object.prototype.hasOwnProperty;function FT(l){return this[l]}var jT,NT,Ml=(l,u,r)=>{var f=l!=null&&typeof l==="object";if(f){var n=u?jT??=new WeakMap:NT??=new WeakMap,t=n.get(l);if(t)return t}r=l!=null?cT($T(l)):{};let i=u||!l||!l.__esModule?sj(r,"default",{value:l,enumerable:!0}):r;for(let y of _T(l))if(!AT.call(i,y))sj(i,y,{get:FT.bind(l,y),enumerable:!0});if(f)n.set(l,i);return i};var _f=(l,u)=>()=>(u||l((u={exports:{}}).exports,u),u.exports);var cu=((l)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(l,{get:(u,r)=>(typeof require<"u"?require:u)[r]}):l)(function(l){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+l+'" is not supported')});var l7=_f((uu)=>{var tc=Symbol.for("react.element"),JT=Symbol.for("react.portal"),UT=Symbol.for("react.fragment"),QT=Symbol.for("react.strict_mode"),mT=Symbol.for("react.profiler"),wT=Symbol.for("react.provider"),qT=Symbol.for("react.context"),LT=Symbol.for("react.forward_ref"),GT=Symbol.for("react.suspense"),WT=Symbol.for("react.memo"),TT=Symbol.for("react.lazy"),Rj=Symbol.iterator;function KT(l){if(l===null||typeof l!=="object")return null;return l=Rj&&l[Rj]||l["@@iterator"],typeof l==="function"?l:null}var vj={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},gj=Object.assign,kj={};function W0(l,u,r){this.props=l,this.context=u,this.refs=kj,this.updater=r||vj}W0.prototype.isReactComponent={};W0.prototype.setState=function(l,u){if(typeof l!=="object"&&typeof l!=="function"&&l!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,l,u,"setState")};W0.prototype.forceUpdate=function(l){this.updater.enqueueForceUpdate(this,l,"forceUpdate")};function Ij(){}Ij.prototype=W0.prototype;function I8(l,u,r){this.props=l,this.context=u,this.refs=kj,this.updater=r||vj}var a8=I8.prototype=new Ij;a8.constructor=I8;gj(a8,W0.prototype);a8.isPureReactComponent=!0;var xj=Array.isArray,aj=Object.prototype.hasOwnProperty,o8={current:null},oj={key:!0,ref:!0,__self:!0,__source:!0};function dj(l,u,r){var f,n={},t=null,i=null;if(u!=null)for(f in u.ref!==void 0&&(i=u.ref),u.key!==void 0&&(t=""+u.key),u)aj.call(u,f)&&!oj.hasOwnProperty(f)&&(n[f]=u[f]);var y=arguments.length-2;if(y===1)n.children=r;else if(1{u7.exports=l7()});var A7=_f((Lu)=>{function r6(l,u){var r=l.length;l.push(u);l:for(;0>>1,n=l[f];if(0>>1;fb$(y,r))cb$(_,y)?(l[f]=_,l[c]=r,f=c):(l[f]=y,l[i]=r,f=i);else if(cb$(_,r))l[f]=_,l[c]=r,f=c;else break l}}return u}function b$(l,u){var r=l.sortIndex-u.sortIndex;return r!==0?r:l.id-u.id}if(typeof performance==="object"&&typeof performance.now==="function")f6=performance,Lu.unstable_now=function(){return f6.now()};else v$=Date,n6=v$.now(),Lu.unstable_now=function(){return v$.now()-n6};var f6,v$,n6,jn=[],wt=[],DT=1,Ef=null,wr=3,a$=!1,wi=!1,yc=!1,i7=typeof setTimeout==="function"?setTimeout:null,y7=typeof clearTimeout==="function"?clearTimeout:null,t7=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function t6(l){for(var u=Rf(wt);u!==null;){if(u.callback===null)I$(wt);else if(u.startTime<=l)I$(wt),u.sortIndex=u.expirationTime,r6(jn,u);else break;u=Rf(wt)}}function y6(l){if(yc=!1,t6(l),!wi)if(Rf(jn)!==null)wi=!0,$6(c6);else{var u=Rf(wt);u!==null&&_6(y6,u.startTime-l)}}function c6(l,u){wi=!1,yc&&(yc=!1,y7(cc),cc=-1),a$=!0;var r=wr;try{t6(u);for(Ef=Rf(jn);Ef!==null&&(!(Ef.expirationTime>u)||l&&!_7());){var f=Ef.callback;if(typeof f==="function"){Ef.callback=null,wr=Ef.priorityLevel;var n=f(Ef.expirationTime<=u);u=Lu.unstable_now(),typeof n==="function"?Ef.callback=n:Ef===Rf(jn)&&I$(jn),t6(u)}else I$(jn);Ef=Rf(jn)}if(Ef!==null)var t=!0;else{var i=Rf(wt);i!==null&&_6(y6,i.startTime-u),t=!1}return t}finally{Ef=null,wr=r,a$=!1}}var o$=!1,g$=null,cc=-1,c7=5,$7=-1;function _7(){return Lu.unstable_now()-$7l||125f?(l.sortIndex=r,r6(wt,l),Rf(jn)===null&&l===Rf(wt)&&(yc?(y7(cc),cc=-1):yc=!0,_6(y6,r-f))):(l.sortIndex=n,r6(jn,l),wi||a$||(wi=!0,$6(c6))),l};Lu.unstable_shouldYield=_7;Lu.unstable_wrapCallback=function(l){var u=wr;return function(){var r=wr;wr=u;try{return l.apply(this,arguments)}finally{wr=r}}}});var j7=_f((ZC,F7)=>{F7.exports=A7()});var JU=_f((Uf)=>{var VT=Ju(),Nf=j7();function Ql(l){for(var u="https://reactjs.org/docs/error-decoder.html?invariant="+l,r=1;r"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),B6=Object.prototype.hasOwnProperty,ST=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,N7={},J7={};function YT(l){if(B6.call(J7,l))return!0;if(B6.call(N7,l))return!1;if(ST.test(l))return J7[l]=!0;return N7[l]=!0,!1}function XT(l,u,r,f){if(r!==null&&r.type===0)return!1;switch(typeof u){case"function":case"symbol":return!0;case"boolean":if(f)return!1;if(r!==null)return!r.acceptsBooleans;return l=l.toLowerCase().slice(0,5),l!=="data-"&&l!=="aria-";default:return!1}}function PT(l,u,r,f){if(u===null||typeof u>"u"||XT(l,u,r,f))return!0;if(f)return!1;if(r!==null)switch(r.type){case 3:return!u;case 4:return u===!1;case 5:return isNaN(u);case 6:return isNaN(u)||1>u}return!1}function Yr(l,u,r,f,n,t,i){this.acceptsBooleans=u===2||u===3||u===4,this.attributeName=f,this.attributeNamespace=n,this.mustUseProperty=r,this.propertyName=l,this.type=u,this.sanitizeURL=t,this.removeEmptyString=i}var Nr={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(l){Nr[l]=new Yr(l,0,!1,l,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(l){var u=l[0];Nr[u]=new Yr(u,1,!1,l[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(l){Nr[l]=new Yr(l,2,!1,l.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(l){Nr[l]=new Yr(l,2,!1,l,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(l){Nr[l]=new Yr(l,3,!1,l.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(l){Nr[l]=new Yr(l,3,!0,l,null,!1,!1)});["capture","download"].forEach(function(l){Nr[l]=new Yr(l,4,!1,l,null,!1,!1)});["cols","rows","size","span"].forEach(function(l){Nr[l]=new Yr(l,6,!1,l,null,!1,!1)});["rowSpan","start"].forEach(function(l){Nr[l]=new Yr(l,5,!1,l.toLowerCase(),null,!1,!1)});var E4=/[\-:]([a-z])/g;function p4(l){return l[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(l){var u=l.replace(E4,p4);Nr[u]=new Yr(u,1,!1,l,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(l){var u=l.replace(E4,p4);Nr[u]=new Yr(u,1,!1,l,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(l){var u=l.replace(E4,p4);Nr[u]=new Yr(u,1,!1,l,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(l){Nr[l]=new Yr(l,1,!1,l.toLowerCase(),null,!1,!1)});Nr.xlinkHref=new Yr("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(l){Nr[l]=new Yr(l,1,!1,l.toLowerCase(),null,!0,!0)});function z4(l,u,r,f){var n=Nr.hasOwnProperty(u)?Nr[u]:null;if(n!==null?n.type!==0:f||!(2y||n[i]!==t[y]){var c=` -`+n[i].replace(" at new "," at ");return l.displayName&&c.includes("")&&(c=c.replace("",l.displayName)),c}while(1<=i&&0<=y);break}}}finally{F6=!1,Error.prepareStackTrace=r}return(l=l?l.displayName||l.name:"")?Uc(l):""}function CT(l){switch(l.tag){case 5:return Uc(l.type);case 16:return Uc("Lazy");case 13:return Uc("Suspense");case 19:return Uc("SuspenseList");case 0:case 2:case 15:return l=j6(l.type,!1),l;case 11:return l=j6(l.type.render,!1),l;case 1:return l=j6(l.type,!0),l;default:return""}}function Y6(l){if(l==null)return null;if(typeof l==="function")return l.displayName||l.name||null;if(typeof l==="string")return l;switch(l){case p0:return"Fragment";case E0:return"Portal";case D6:return"Profiler";case O4:return"StrictMode";case V6:return"Suspense";case S6:return"SuspenseList"}if(typeof l==="object")switch(l.$$typeof){case qN:return(l.displayName||"Context")+".Consumer";case wN:return(l._context.displayName||"Context")+".Provider";case Z4:var u=l.render;return l=l.displayName,l||(l=u.displayName||u.name||"",l=l!==""?"ForwardRef("+l+")":"ForwardRef"),l;case H4:return u=l.displayName||null,u!==null?u:Y6(l.type)||"Memo";case Lt:u=l._payload,l=l._init;try{return Y6(l(u))}catch(r){}}return null}function hT(l){var u=l.type;switch(l.tag){case 24:return"Cache";case 9:return(u.displayName||"Context")+".Consumer";case 10:return(u._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return l=u.render,l=l.displayName||l.name||"",u.displayName||(l!==""?"ForwardRef("+l+")":"ForwardRef");case 7:return"Fragment";case 5:return u;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Y6(u);case 8:return u===O4?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof u==="function")return u.displayName||u.name||null;if(typeof u==="string")return u}return null}function St(l){switch(typeof l){case"boolean":case"number":case"string":case"undefined":return l;case"object":return l;default:return""}}function GN(l){var u=l.type;return(l=l.nodeName)&&l.toLowerCase()==="input"&&(u==="checkbox"||u==="radio")}function MT(l){var u=GN(l)?"checked":"value",r=Object.getOwnPropertyDescriptor(l.constructor.prototype,u),f=""+l[u];if(!l.hasOwnProperty(u)&&typeof r<"u"&&typeof r.get==="function"&&typeof r.set==="function"){var{get:n,set:t}=r;return Object.defineProperty(l,u,{configurable:!0,get:function(){return n.call(this)},set:function(i){f=""+i,t.call(this,i)}}),Object.defineProperty(l,u,{enumerable:r.enumerable}),{getValue:function(){return f},setValue:function(i){f=""+i},stopTracking:function(){l._valueTracker=null,delete l[u]}}}}function e$(l){l._valueTracker||(l._valueTracker=MT(l))}function WN(l){if(!l)return!1;var u=l._valueTracker;if(!u)return!0;var r=u.getValue(),f="";return l&&(f=GN(l)?l.checked?"true":"false":l.value),l=f,l!==r?(u.setValue(l),!0):!1}function T_(l){if(l=l||(typeof document<"u"?document:void 0),typeof l>"u")return null;try{return l.activeElement||l.body}catch(u){return l.body}}function X6(l,u){var r=u.checked;return Pu({},u,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:r!=null?r:l._wrapperState.initialChecked})}function Q7(l,u){var r=u.defaultValue==null?"":u.defaultValue,f=u.checked!=null?u.checked:u.defaultChecked;r=St(u.value!=null?u.value:r),l._wrapperState={initialChecked:f,initialValue:r,controlled:u.type==="checkbox"||u.type==="radio"?u.checked!=null:u.value!=null}}function TN(l,u){u=u.checked,u!=null&&z4(l,"checked",u,!1)}function P6(l,u){TN(l,u);var r=St(u.value),f=u.type;if(r!=null)if(f==="number"){if(r===0&&l.value===""||l.value!=r)l.value=""+r}else l.value!==""+r&&(l.value=""+r);else if(f==="submit"||f==="reset"){l.removeAttribute("value");return}u.hasOwnProperty("value")?C6(l,u.type,r):u.hasOwnProperty("defaultValue")&&C6(l,u.type,St(u.defaultValue)),u.checked==null&&u.defaultChecked!=null&&(l.defaultChecked=!!u.defaultChecked)}function m7(l,u,r){if(u.hasOwnProperty("value")||u.hasOwnProperty("defaultValue")){var f=u.type;if(!(f!=="submit"&&f!=="reset"||u.value!==void 0&&u.value!==null))return;u=""+l._wrapperState.initialValue,r||u===l.value||(l.value=u),l.defaultValue=u}r=l.name,r!==""&&(l.name=""),l.defaultChecked=!!l._wrapperState.initialChecked,r!==""&&(l.name=r)}function C6(l,u,r){if(u!=="number"||T_(l.ownerDocument)!==l)r==null?l.defaultValue=""+l._wrapperState.initialValue:l.defaultValue!==""+r&&(l.defaultValue=""+r)}var Qc=Array.isArray;function P0(l,u,r,f){if(l=l.options,u){u={};for(var n=0;n"+u.valueOf().toString()+"";for(u=l_.firstChild;l.firstChild;)l.removeChild(l.firstChild);for(;u.firstChild;)l.appendChild(u.firstChild)}});function Vc(l,u){if(u){var r=l.firstChild;if(r&&r===l.lastChild&&r.nodeType===3){r.nodeValue=u;return}}l.textContent=u}var Tc={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},sT=["Webkit","ms","Moz","O"];Object.keys(Tc).forEach(function(l){sT.forEach(function(u){u=u+l.charAt(0).toUpperCase()+l.substring(1),Tc[u]=Tc[l]})});function zN(l,u,r){return u==null||typeof u==="boolean"||u===""?"":r||typeof u!=="number"||u===0||Tc.hasOwnProperty(l)&&Tc[l]?(""+u).trim():u+"px"}function ON(l,u){l=l.style;for(var r in u)if(u.hasOwnProperty(r)){var f=r.indexOf("--")===0,n=zN(r,u[r],f);r==="float"&&(r="cssFloat"),f?l.setProperty(r,n):l[r]=n}}var RT=Pu({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function s6(l,u){if(u){if(RT[l]&&(u.children!=null||u.dangerouslySetInnerHTML!=null))throw Error(Ql(137,l));if(u.dangerouslySetInnerHTML!=null){if(u.children!=null)throw Error(Ql(60));if(typeof u.dangerouslySetInnerHTML!=="object"||!("__html"in u.dangerouslySetInnerHTML))throw Error(Ql(61))}if(u.style!=null&&typeof u.style!=="object")throw Error(Ql(62))}}function R6(l,u){if(l.indexOf("-")===-1)return typeof u.is==="string";switch(l){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var x6=null;function B4(l){return l=l.target||l.srcElement||window,l.correspondingUseElement&&(l=l.correspondingUseElement),l.nodeType===3?l.parentNode:l}var b6=null,C0=null,h0=null;function L7(l){if(l=dc(l)){if(typeof b6!=="function")throw Error(Ql(280));var u=l.stateNode;u&&(u=d_(u),b6(l.stateNode,l.type,u))}}function ZN(l){C0?h0?h0.push(l):h0=[l]:C0=l}function HN(){if(C0){var l=C0,u=h0;if(h0=C0=null,L7(l),u)for(l=0;l>>=0,l===0?32:31-(lK(l)/uK|0)|0}var u_=64,r_=4194304;function mc(l){switch(l&-l){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return l&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return l&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return l}}function z_(l,u){var r=l.pendingLanes;if(r===0)return 0;var f=0,n=l.suspendedLanes,t=l.pingedLanes,i=r&268435455;if(i!==0){var y=i&~n;y!==0?f=mc(y):(t&=i,t!==0&&(f=mc(t)))}else i=r&~n,i!==0?f=mc(i):t!==0&&(f=mc(t));if(f===0)return 0;if(u!==0&&u!==f&&(u&n)===0&&(n=f&-f,t=u&-u,n>=t||n===16&&(t&4194240)!==0))return u;if((f&4)!==0&&(f|=r&16),u=l.entangledLanes,u!==0)for(l=l.entanglements,u&=f;0r;r++)u.push(l);return u}function ac(l,u,r){l.pendingLanes|=u,u!==536870912&&(l.suspendedLanes=0,l.pingedLanes=0),l=l.eventTimes,u=31-kf(u),l[u]=r}function tK(l,u){var r=l.pendingLanes&~u;l.pendingLanes=u,l.suspendedLanes=0,l.pingedLanes=0,l.expiredLanes&=u,l.mutableReadLanes&=u,l.entangledLanes&=u,u=l.entanglements;var f=l.eventTimes;for(l=l.expirationTimes;0=Ec),Z7=String.fromCharCode(32),H7=!1;function oN(l,u){switch(l){case"keyup":return DK.indexOf(u.keyCode)!==-1;case"keydown":return u.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function dN(l){return l=l.detail,typeof l==="object"&&"data"in l?l.data:null}var z0=!1;function SK(l,u){switch(l){case"compositionend":return dN(u);case"keypress":if(u.which!==32)return null;return H7=!0,Z7;case"textInput":return l=u.data,l===Z7&&H7?null:l;default:return null}}function YK(l,u){if(z0)return l==="compositionend"||!h4&&oN(l,u)?(l=IN(),N_=X4=Kt=null,z0=!1,l):null;switch(l){case"paste":return null;case"keypress":if(!(u.ctrlKey||u.altKey||u.metaKey)||u.ctrlKey&&u.altKey){if(u.char&&1=u)return{node:r,offset:u-l};l=f}l:{for(;r;){if(r.nextSibling){r=r.nextSibling;break l}r=r.parentNode}r=void 0}r=V7(r)}}function rJ(l,u){return l&&u?l===u?!0:l&&l.nodeType===3?!1:u&&u.nodeType===3?rJ(l,u.parentNode):("contains"in l)?l.contains(u):l.compareDocumentPosition?!!(l.compareDocumentPosition(u)&16):!1:!1}function fJ(){for(var l=window,u=T_();u instanceof l.HTMLIFrameElement;){try{var r=typeof u.contentWindow.location.href==="string"}catch(f){r=!1}if(r)l=u.contentWindow;else break;u=T_(l.document)}return u}function M4(l){var u=l&&l.nodeName&&l.nodeName.toLowerCase();return u&&(u==="input"&&(l.type==="text"||l.type==="search"||l.type==="tel"||l.type==="url"||l.type==="password")||u==="textarea"||l.contentEditable==="true")}function bK(l){var u=fJ(),r=l.focusedElem,f=l.selectionRange;if(u!==r&&r&&r.ownerDocument&&rJ(r.ownerDocument.documentElement,r)){if(f!==null&&M4(r)){if(u=f.start,l=f.end,l===void 0&&(l=u),"selectionStart"in r)r.selectionStart=u,r.selectionEnd=Math.min(l,r.value.length);else if(l=(u=r.ownerDocument||document)&&u.defaultView||window,l.getSelection){l=l.getSelection();var n=r.textContent.length,t=Math.min(f.start,n);f=f.end===void 0?t:Math.min(f.end,n),!l.extend&&t>f&&(n=f,f=t,t=n),n=S7(r,t);var i=S7(r,f);n&&i&&(l.rangeCount!==1||l.anchorNode!==n.node||l.anchorOffset!==n.offset||l.focusNode!==i.node||l.focusOffset!==i.offset)&&(u=u.createRange(),u.setStart(n.node,n.offset),l.removeAllRanges(),t>f?(l.addRange(u),l.extend(i.node,i.offset)):(u.setEnd(i.node,i.offset),l.addRange(u)))}}u=[];for(l=r;l=l.parentNode;)l.nodeType===1&&u.push({element:l,left:l.scrollLeft,top:l.scrollTop});typeof r.focus==="function"&&r.focus();for(r=0;r=document.documentMode,O0=null,o6=null,zc=null,d6=!1;function Y7(l,u,r){var f=r.window===r?r.document:r.nodeType===9?r:r.ownerDocument;d6||O0==null||O0!==T_(f)||(f=O0,("selectionStart"in f)&&M4(f)?f={start:f.selectionStart,end:f.selectionEnd}:(f=(f.ownerDocument&&f.ownerDocument.defaultView||window).getSelection(),f={anchorNode:f.anchorNode,anchorOffset:f.anchorOffset,focusNode:f.focusNode,focusOffset:f.focusOffset}),zc&&hc(zc,f)||(zc=f,f=H_(o6,"onSelect"),0B0||(l.current=i4[B0],i4[B0]=null,B0--)}function Gu(l,u){B0++,i4[B0]=l.current,l.current=u}var Yt={},Wr=Pt(Yt),gr=Pt(!1),zi=Yt;function b0(l,u){var r=l.type.contextTypes;if(!r)return Yt;var f=l.stateNode;if(f&&f.__reactInternalMemoizedUnmaskedChildContext===u)return f.__reactInternalMemoizedMaskedChildContext;var n={},t;for(t in r)n[t]=u[t];return f&&(l=l.stateNode,l.__reactInternalMemoizedUnmaskedChildContext=u,l.__reactInternalMemoizedMaskedChildContext=n),n}function kr(l){return l=l.childContextTypes,l!==null&&l!==void 0}function D_(){Eu(gr),Eu(Wr)}function R7(l,u,r){if(Wr.current!==Yt)throw Error(Ql(168));Gu(Wr,u),Gu(gr,r)}function FJ(l,u,r){var f=l.stateNode;if(u=u.childContextTypes,typeof f.getChildContext!=="function")return r;f=f.getChildContext();for(var n in f)if(!(n in u))throw Error(Ql(108,hT(l)||"Unknown",n));return Pu({},r,f)}function V_(l){return l=(l=l.stateNode)&&l.__reactInternalMemoizedMergedChildContext||Yt,zi=Wr.current,Gu(Wr,l),Gu(gr,gr.current),!0}function x7(l,u,r){var f=l.stateNode;if(!f)throw Error(Ql(169));r?(l=FJ(l,u,zi),f.__reactInternalMemoizedMergedChildContext=l,Eu(gr),Eu(Wr),Gu(Wr,l)):Eu(gr),Gu(gr,r)}var hn=null,e_=!1,W6=!1;function jJ(l){hn===null?hn=[l]:hn.push(l)}function uE(l){e_=!0,jJ(l)}function Ct(){if(!W6&&hn!==null){W6=!0;var l=0,u=Uu;try{var r=hn;for(Uu=1;l>=i,n-=i,Mn=1<<32-kf(u)+n|r<Z?(V=O,O=null):V=O.sibling;var P=j(J,O,m[Z],q);if(P===null){O===null&&(O=V);break}l&&O&&P.alternate===null&&u(J,O),Q=t(P,Q,Z),p===null?W=P:p.sibling=P,p=P,O=V}if(Z===m.length)return r(J,O),Zu&&Li(J,Z),W;if(O===null){for(;ZZ?(V=O,O=null):V=O.sibling;var H=j(J,O,P.value,q);if(H===null){O===null&&(O=V);break}l&&O&&H.alternate===null&&u(J,O),Q=t(H,Q,Z),p===null?W=H:p.sibling=H,p=H,O=V}if(P.done)return r(J,O),Zu&&Li(J,Z),W;if(O===null){for(;!P.done;Z++,P=m.next())P=F(J,P.value,q),P!==null&&(Q=t(P,Q,Z),p===null?W=P:p.sibling=P,p=P);return Zu&&Li(J,Z),W}for(O=f(J,O);!P.done;Z++,P=m.next())P=N(O,J,Z,P.value,q),P!==null&&(l&&P.alternate!==null&&O.delete(P.key===null?Z:P.key),Q=t(P,Q,Z),p===null?W=P:p.sibling=P,p=P);return l&&O.forEach(function(B){return u(J,B)}),Zu&&Li(J,Z),W}function G(J,Q,m,q){if(typeof m==="object"&&m!==null&&m.type===p0&&m.key===null&&(m=m.props.children),typeof m==="object"&&m!==null){switch(m.$$typeof){case d$:l:{for(var W=m.key,p=Q;p!==null;){if(p.key===W){if(W=m.type,W===p0){if(p.tag===7){r(J,p.sibling),Q=n(p,m.props.children),Q.return=J,J=Q;break l}}else if(p.elementType===W||typeof W==="object"&&W!==null&&W.$$typeof===Lt&&g7(W)===p.type){r(J,p.sibling),Q=n(p,m.props),Q.ref=jc(J,p,m),Q.return=J,J=Q;break l}r(J,p);break}else u(J,p);p=p.sibling}m.type===p0?(Q=pi(m.props.children,J.mode,q,m.key),Q.return=J,J=Q):(q=W_(m.type,m.key,m.props,null,J.mode,q),q.ref=jc(J,Q,m),q.return=J,J=q)}return i(J);case E0:l:{for(p=m.key;Q!==null;){if(Q.key===p)if(Q.tag===4&&Q.stateNode.containerInfo===m.containerInfo&&Q.stateNode.implementation===m.implementation){r(J,Q.sibling),Q=n(Q,m.children||[]),Q.return=J,J=Q;break l}else{r(J,Q);break}else u(J,Q);Q=Q.sibling}Q=H6(m,J.mode,q),Q.return=J,J=Q}return i(J);case Lt:return p=m._init,G(J,Q,p(m._payload),q)}if(Qc(m))return U(J,Q,m,q);if($c(m))return w(J,Q,m,q);$_(J,m)}return typeof m==="string"&&m!==""||typeof m==="number"?(m=""+m,Q!==null&&Q.tag===6?(r(J,Q.sibling),Q=n(Q,m),Q.return=J,J=Q):(r(J,Q),Q=Z6(m,J.mode,q),Q.return=J,J=Q),i(J)):r(J,Q)}return G}var g0=QJ(!0),mJ=QJ(!1),X_=Pt(null),P_=null,S0=null,b4=null;function v4(){b4=S0=P_=null}function g4(l){var u=X_.current;Eu(X_),l._currentValue=u}function $4(l,u,r){for(;l!==null;){var f=l.alternate;if((l.childLanes&u)!==u?(l.childLanes|=u,f!==null&&(f.childLanes|=u)):f!==null&&(f.childLanes&u)!==u&&(f.childLanes|=u),l===r)break;l=l.return}}function s0(l,u){P_=l,b4=S0=null,l=l.dependencies,l!==null&&l.firstContext!==null&&((l.lanes&u)!==0&&(vr=!0),l.firstContext=null)}function Hf(l){var u=l._currentValue;if(b4!==l)if(l={context:l,memoizedValue:u,next:null},S0===null){if(P_===null)throw Error(Ql(308));S0=l,P_.dependencies={lanes:0,firstContext:l}}else S0=S0.next=l;return u}var Ti=null;function k4(l){Ti===null?Ti=[l]:Ti.push(l)}function wJ(l,u,r,f){var n=u.interleaved;return n===null?(r.next=r,k4(u)):(r.next=n.next,n.next=r),u.interleaved=r,vn(l,f)}function vn(l,u){l.lanes|=u;var r=l.alternate;r!==null&&(r.lanes|=u),r=l;for(l=l.return;l!==null;)l.childLanes|=u,r=l.alternate,r!==null&&(r.childLanes|=u),r=l,l=l.return;return r.tag===3?r.stateNode:null}var Gt=!1;function I4(l){l.updateQueue={baseState:l.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function qJ(l,u){l=l.updateQueue,u.updateQueue===l&&(u.updateQueue={baseState:l.baseState,firstBaseUpdate:l.firstBaseUpdate,lastBaseUpdate:l.lastBaseUpdate,shared:l.shared,effects:l.effects})}function Rn(l,u){return{eventTime:l,lane:u,tag:0,payload:null,callback:null,next:null}}function Ht(l,u,r){var f=l.updateQueue;if(f===null)return null;if(f=f.shared,(Fu&2)!==0){var n=f.pending;return n===null?u.next=u:(u.next=n.next,n.next=u),f.pending=u,vn(l,r)}return n=f.interleaved,n===null?(u.next=u,k4(f)):(u.next=n.next,n.next=u),f.interleaved=u,vn(l,r)}function Q_(l,u,r){if(u=u.updateQueue,u!==null&&(u=u.shared,(r&4194240)!==0)){var f=u.lanes;f&=l.pendingLanes,r|=f,u.lanes=r,V4(l,r)}}function k7(l,u){var{updateQueue:r,alternate:f}=l;if(f!==null&&(f=f.updateQueue,r===f)){var n=null,t=null;if(r=r.firstBaseUpdate,r!==null){do{var i={eventTime:r.eventTime,lane:r.lane,tag:r.tag,payload:r.payload,callback:r.callback,next:null};t===null?n=t=i:t=t.next=i,r=r.next}while(r!==null);t===null?n=t=u:t=t.next=u}else n=t=u;r={baseState:f.baseState,firstBaseUpdate:n,lastBaseUpdate:t,shared:f.shared,effects:f.effects},l.updateQueue=r;return}l=r.lastBaseUpdate,l===null?r.firstBaseUpdate=u:l.next=u,r.lastBaseUpdate=u}function C_(l,u,r,f){var n=l.updateQueue;Gt=!1;var{firstBaseUpdate:t,lastBaseUpdate:i}=n,y=n.shared.pending;if(y!==null){n.shared.pending=null;var c=y,_=c.next;c.next=null,i===null?t=_:i.next=_,i=c;var A=l.alternate;A!==null&&(A=A.updateQueue,y=A.lastBaseUpdate,y!==i&&(y===null?A.firstBaseUpdate=_:y.next=_,A.lastBaseUpdate=c))}if(t!==null){var F=n.baseState;i=0,A=_=c=null,y=t;do{var{lane:j,eventTime:N}=y;if((f&j)===j){A!==null&&(A=A.next={eventTime:N,lane:0,tag:y.tag,payload:y.payload,callback:y.callback,next:null});l:{var U=l,w=y;switch(j=u,N=r,w.tag){case 1:if(U=w.payload,typeof U==="function"){F=U.call(N,F,j);break l}F=U;break l;case 3:U.flags=U.flags&-65537|128;case 0:if(U=w.payload,j=typeof U==="function"?U.call(N,F,j):U,j===null||j===void 0)break l;F=Pu({},F,j);break l;case 2:Gt=!0}}y.callback!==null&&y.lane!==0&&(l.flags|=64,j=n.effects,j===null?n.effects=[y]:j.push(y))}else N={eventTime:N,lane:j,tag:y.tag,payload:y.payload,callback:y.callback,next:null},A===null?(_=A=N,c=F):A=A.next=N,i|=j;if(y=y.next,y===null)if(y=n.shared.pending,y===null)break;else j=y,y=j.next,j.next=null,n.lastBaseUpdate=j,n.shared.pending=null}while(1);if(A===null&&(c=F),n.baseState=c,n.firstBaseUpdate=_,n.lastBaseUpdate=A,u=n.shared.interleaved,u!==null){n=u;do i|=n.lane,n=n.next;while(n!==u)}else t===null&&(n.shared.lanes=0);Hi|=i,l.lanes=i,l.memoizedState=F}}function I7(l,u,r){if(l=u.effects,u.effects=null,l!==null)for(u=0;ur?r:4,l(!0);var f=K6.transition;K6.transition={};try{l(!1),u()}finally{Uu=r,K6.transition=f}}function XJ(){return Bf().memoizedState}function tE(l,u,r){var f=Dt(l);if(r={lane:f,action:r,hasEagerState:!1,eagerState:null,next:null},PJ(l))CJ(u,r);else if(r=wJ(l,u,r,f),r!==null){var n=Sr();If(r,l,f,n),hJ(r,u,f)}}function iE(l,u,r){var f=Dt(l),n={lane:f,action:r,hasEagerState:!1,eagerState:null,next:null};if(PJ(l))CJ(u,n);else{var t=l.alternate;if(l.lanes===0&&(t===null||t.lanes===0)&&(t=u.lastRenderedReducer,t!==null))try{var i=u.lastRenderedState,y=t(i,r);if(n.hasEagerState=!0,n.eagerState=y,af(y,i)){var c=u.interleaved;c===null?(n.next=n,k4(u)):(n.next=c.next,c.next=n),u.interleaved=n;return}}catch(_){}finally{}r=wJ(l,u,n,f),r!==null&&(n=Sr(),If(r,l,f,n),hJ(r,u,f))}}function PJ(l){var u=l.alternate;return l===Xu||u!==null&&u===Xu}function CJ(l,u){Oc=M_=!0;var r=l.pending;r===null?u.next=u:(u.next=r.next,r.next=u),l.pending=u}function hJ(l,u,r){if((r&4194240)!==0){var f=u.lanes;f&=l.pendingLanes,r|=f,u.lanes=r,V4(l,r)}}var s_={readContext:Hf,useCallback:qr,useContext:qr,useEffect:qr,useImperativeHandle:qr,useInsertionEffect:qr,useLayoutEffect:qr,useMemo:qr,useReducer:qr,useRef:qr,useState:qr,useDebugValue:qr,useDeferredValue:qr,useTransition:qr,useMutableSource:qr,useSyncExternalStore:qr,useId:qr,unstable_isNewReconciler:!1},yE={readContext:Hf,useCallback:function(l,u){return Jn().memoizedState=[l,u===void 0?null:u],l},useContext:Hf,useEffect:o7,useImperativeHandle:function(l,u,r){return r=r!==null&&r!==void 0?r.concat([l]):null,w_(4194308,4,BJ.bind(null,u,l),r)},useLayoutEffect:function(l,u){return w_(4194308,4,l,u)},useInsertionEffect:function(l,u){return w_(4,2,l,u)},useMemo:function(l,u){var r=Jn();return u=u===void 0?null:u,l=l(),r.memoizedState=[l,u],l},useReducer:function(l,u,r){var f=Jn();return u=r!==void 0?r(u):u,f.memoizedState=f.baseState=u,l={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:l,lastRenderedState:u},f.queue=l,l=l.dispatch=tE.bind(null,Xu,l),[f.memoizedState,l]},useRef:function(l){var u=Jn();return l={current:l},u.memoizedState=l},useState:a7,useDebugValue:f2,useDeferredValue:function(l){return Jn().memoizedState=l},useTransition:function(){var l=a7(!1),u=l[0];return l=nE.bind(null,l[1]),Jn().memoizedState=l,[u,l]},useMutableSource:function(){},useSyncExternalStore:function(l,u,r){var f=Xu,n=Jn();if(Zu){if(r===void 0)throw Error(Ql(407));r=r()}else{if(r=u(),Ar===null)throw Error(Ql(349));(Zi&30)!==0||TJ(f,u,r)}n.memoizedState=r;var t={value:r,getSnapshot:u};return n.queue=t,o7(EJ.bind(null,f,t,l),[l]),f.flags|=2048,kc(9,KJ.bind(null,f,t,r,u),void 0,null),r},useId:function(){var l=Jn(),u=Ar.identifierPrefix;if(Zu){var r=sn,f=Mn;r=(f&~(1<<32-kf(f)-1)).toString(32)+r,u=":"+u+"R"+r,r=vc++,0",l=l.removeChild(l.firstChild)):typeof f.is==="string"?l=i.createElement(r,{is:f.is}):(l=i.createElement(r),r==="select"&&(i=l,f.multiple?i.multiple=!0:f.size&&(i.size=f.size))):l=i.createElementNS(l,r),l[Un]=u,l[Rc]=f,aJ(l,u,!1,!1),u.stateNode=l;l:{switch(i=R6(r,f),r){case"dialog":Ku("cancel",l),Ku("close",l),n=f;break;case"iframe":case"object":case"embed":Ku("load",l),n=f;break;case"video":case"audio":for(n=0;na0&&(u.flags|=128,f=!0,Nc(t,!1),u.lanes=4194304)}else{if(!f)if(l=h_(i),l!==null){if(u.flags|=128,f=!0,r=l.updateQueue,r!==null&&(u.updateQueue=r,u.flags|=4),Nc(t,!0),t.tail===null&&t.tailMode==="hidden"&&!i.alternate&&!Zu)return Lr(u),null}else 2*Iu()-t.renderingStartTime>a0&&r!==1073741824&&(u.flags|=128,f=!0,Nc(t,!1),u.lanes=4194304);t.isBackwards?(i.sibling=u.child,u.child=i):(r=t.last,r!==null?r.sibling=i:u.child=i,t.last=i)}if(t.tail!==null)return u=t.tail,t.rendering=u,t.tail=u.sibling,t.renderingStartTime=Iu(),u.sibling=null,r=Yu.current,Gu(Yu,f?r&1|2:r&1),u;return Lr(u),null;case 22:case 23:return $2(),f=u.memoizedState!==null,l!==null&&l.memoizedState!==null!==f&&(u.flags|=8192),f&&(u.mode&1)!==0?(Af&1073741824)!==0&&(Lr(u),u.subtreeFlags&6&&(u.flags|=8192)):Lr(u),null;case 24:return null;case 25:return null}throw Error(Ql(156,u.tag))}function JE(l,u){switch(R4(u),u.tag){case 1:return kr(u.type)&&D_(),l=u.flags,l&65536?(u.flags=l&-65537|128,u):null;case 3:return k0(),Eu(gr),Eu(Wr),d4(),l=u.flags,(l&65536)!==0&&(l&128)===0?(u.flags=l&-65537|128,u):null;case 5:return o4(u),null;case 13:if(Eu(Yu),l=u.memoizedState,l!==null&&l.dehydrated!==null){if(u.alternate===null)throw Error(Ql(340));v0()}return l=u.flags,l&65536?(u.flags=l&-65537|128,u):null;case 19:return Eu(Yu),null;case 4:return k0(),null;case 10:return g4(u.type._context),null;case 22:case 23:return $2(),null;case 24:return null;default:return null}}var A_=!1,Gr=!1,UE=typeof WeakSet==="function"?WeakSet:Set,Bl=null;function Y0(l,u){var r=l.ref;if(r!==null)if(typeof r==="function")try{r(null)}catch(f){Ru(l,u,f)}else r.current=null}function m4(l,u,r){try{r()}catch(f){Ru(l,u,f)}}var cN=!1;function QE(l,u){if(u4=O_,l=fJ(),M4(l)){if("selectionStart"in l)var r={start:l.selectionStart,end:l.selectionEnd};else l:{r=(r=l.ownerDocument)&&r.defaultView||window;var f=r.getSelection&&r.getSelection();if(f&&f.rangeCount!==0){r=f.anchorNode;var{anchorOffset:n,focusNode:t}=f;f=f.focusOffset;try{r.nodeType,t.nodeType}catch(q){r=null;break l}var i=0,y=-1,c=-1,_=0,A=0,F=l,j=null;u:for(;;){for(var N;;){if(F!==r||n!==0&&F.nodeType!==3||(y=i+n),F!==t||f!==0&&F.nodeType!==3||(c=i+f),F.nodeType===3&&(i+=F.nodeValue.length),(N=F.firstChild)===null)break;j=F,F=N}for(;;){if(F===l)break u;if(j===r&&++_===n&&(y=i),j===t&&++A===f&&(c=i),(N=F.nextSibling)!==null)break;F=j,j=F.parentNode}F=N}r=y===-1||c===-1?null:{start:y,end:c}}else r=null}r=r||{start:0,end:0}}else r=null;r4={focusedElem:l,selectionRange:r},O_=!1;for(Bl=u;Bl!==null;)if(u=Bl,l=u.child,(u.subtreeFlags&1028)!==0&&l!==null)l.return=u,Bl=l;else for(;Bl!==null;){u=Bl;try{var U=u.alternate;if((u.flags&1024)!==0)switch(u.tag){case 0:case 11:case 15:break;case 1:if(U!==null){var{memoizedProps:w,memoizedState:G}=U,J=u.stateNode,Q=J.getSnapshotBeforeUpdate(u.elementType===u.type?w:bf(u.type,w),G);J.__reactInternalSnapshotBeforeUpdate=Q}break;case 3:var m=u.stateNode.containerInfo;m.nodeType===1?m.textContent="":m.nodeType===9&&m.documentElement&&m.removeChild(m.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(Ql(163))}}catch(q){Ru(u,u.return,q)}if(l=u.sibling,l!==null){l.return=u.return,Bl=l;break}Bl=u.return}return U=cN,cN=!1,U}function Zc(l,u,r){var f=u.updateQueue;if(f=f!==null?f.lastEffect:null,f!==null){var n=f=f.next;do{if((n.tag&l)===l){var t=n.destroy;n.destroy=void 0,t!==void 0&&m4(u,r,t)}n=n.next}while(n!==f)}}function r3(l,u){if(u=u.updateQueue,u=u!==null?u.lastEffect:null,u!==null){var r=u=u.next;do{if((r.tag&l)===l){var f=r.create;r.destroy=f()}r=r.next}while(r!==u)}}function w4(l){var u=l.ref;if(u!==null){var r=l.stateNode;switch(l.tag){case 5:l=r;break;default:l=r}typeof u==="function"?u(l):u.current=l}}function eJ(l){var u=l.alternate;u!==null&&(l.alternate=null,eJ(u)),l.child=null,l.deletions=null,l.sibling=null,l.tag===5&&(u=l.stateNode,u!==null&&(delete u[Un],delete u[Rc],delete u[t4],delete u[eK],delete u[lE])),l.stateNode=null,l.return=null,l.dependencies=null,l.memoizedProps=null,l.memoizedState=null,l.pendingProps=null,l.stateNode=null,l.updateQueue=null}function lU(l){return l.tag===5||l.tag===3||l.tag===4}function $N(l){l:for(;;){for(;l.sibling===null;){if(l.return===null||lU(l.return))return null;l=l.return}l.sibling.return=l.return;for(l=l.sibling;l.tag!==5&&l.tag!==6&&l.tag!==18;){if(l.flags&2)continue l;if(l.child===null||l.tag===4)continue l;else l.child.return=l,l=l.child}if(!(l.flags&2))return l.stateNode}}function q4(l,u,r){var f=l.tag;if(f===5||f===6)l=l.stateNode,u?r.nodeType===8?r.parentNode.insertBefore(l,u):r.insertBefore(l,u):(r.nodeType===8?(u=r.parentNode,u.insertBefore(l,r)):(u=r,u.appendChild(l)),r=r._reactRootContainer,r!==null&&r!==void 0||u.onclick!==null||(u.onclick=B_));else if(f!==4&&(l=l.child,l!==null))for(q4(l,u,r),l=l.sibling;l!==null;)q4(l,u,r),l=l.sibling}function L4(l,u,r){var f=l.tag;if(f===5||f===6)l=l.stateNode,u?r.insertBefore(l,u):r.appendChild(l);else if(f!==4&&(l=l.child,l!==null))for(L4(l,u,r),l=l.sibling;l!==null;)L4(l,u,r),l=l.sibling}var Fr=null,vf=!1;function qt(l,u,r){for(r=r.child;r!==null;)uU(l,u,r),r=r.sibling}function uU(l,u,r){if(Qn&&typeof Qn.onCommitFiberUnmount==="function")try{Qn.onCommitFiberUnmount(k_,r)}catch(y){}switch(r.tag){case 5:Gr||Y0(r,u);case 6:var f=Fr,n=vf;Fr=null,qt(l,u,r),Fr=f,vf=n,Fr!==null&&(vf?(l=Fr,r=r.stateNode,l.nodeType===8?l.parentNode.removeChild(r):l.removeChild(r)):Fr.removeChild(r.stateNode));break;case 18:Fr!==null&&(vf?(l=Fr,r=r.stateNode,l.nodeType===8?G6(l.parentNode,r):l.nodeType===1&&G6(l,r),Pc(l)):G6(Fr,r.stateNode));break;case 4:f=Fr,n=vf,Fr=r.stateNode.containerInfo,vf=!0,qt(l,u,r),Fr=f,vf=n;break;case 0:case 11:case 14:case 15:if(!Gr&&(f=r.updateQueue,f!==null&&(f=f.lastEffect,f!==null))){n=f=f.next;do{var t=n,i=t.destroy;t=t.tag,i!==void 0&&((t&2)!==0?m4(r,u,i):(t&4)!==0&&m4(r,u,i)),n=n.next}while(n!==f)}qt(l,u,r);break;case 1:if(!Gr&&(Y0(r,u),f=r.stateNode,typeof f.componentWillUnmount==="function"))try{f.props=r.memoizedProps,f.state=r.memoizedState,f.componentWillUnmount()}catch(y){Ru(r,u,y)}qt(l,u,r);break;case 21:qt(l,u,r);break;case 22:r.mode&1?(Gr=(f=Gr)||r.memoizedState!==null,qt(l,u,r),Gr=f):qt(l,u,r);break;default:qt(l,u,r)}}function _N(l){var u=l.updateQueue;if(u!==null){l.updateQueue=null;var r=l.stateNode;r===null&&(r=l.stateNode=new UE),u.forEach(function(f){var n=EE.bind(null,l,f);r.has(f)||(r.add(f),f.then(n,n))})}}function xf(l,u){var r=u.deletions;if(r!==null)for(var f=0;fn&&(n=i),f&=~t}if(f=n,f=Iu()-f,f=(120>f?120:480>f?480:1080>f?1080:1920>f?1920:3000>f?3000:4320>f?4320:1960*wE(f/1960))-f,10l?16:l,Et===null)var f=!1;else{if(l=Et,Et=null,b_=0,(Fu&6)!==0)throw Error(Ql(331));var n=Fu;Fu|=4;for(Bl=l.current;Bl!==null;){var t=Bl,i=t.child;if((Bl.flags&16)!==0){var y=t.deletions;if(y!==null){for(var c=0;cIu()-y2?Ei(l,0):i2|=r),Ir(l,u)}function $U(l,u){u===0&&((l.mode&1)===0?u=1:(u=r_,r_<<=1,(r_&130023424)===0&&(r_=4194304)));var r=Sr();l=vn(l,u),l!==null&&(ac(l,u,r),Ir(l,r))}function KE(l){var u=l.memoizedState,r=0;u!==null&&(r=u.retryLane),$U(l,r)}function EE(l,u){var r=0;switch(l.tag){case 13:var{stateNode:f,memoizedState:n}=l;n!==null&&(r=n.retryLane);break;case 19:f=l.stateNode;break;default:throw Error(Ql(314))}f!==null&&f.delete(u),$U(l,r)}var _U;_U=function(l,u,r){if(l!==null)if(l.memoizedProps!==u.pendingProps||gr.current)vr=!0;else{if((l.lanes&r)===0&&(u.flags&128)===0)return vr=!1,jE(l,u,r);vr=(l.flags&131072)!==0?!0:!1}else vr=!1,Zu&&(u.flags&1048576)!==0&&NJ(u,Y_,u.index);switch(u.lanes=0,u.tag){case 2:var f=u.type;q_(l,u),l=u.pendingProps;var n=b0(u,Wr.current);s0(u,r),n=l2(null,u,f,l,n,r);var t=u2();return u.flags|=1,typeof n==="object"&&n!==null&&typeof n.render==="function"&&n.$$typeof===void 0?(u.tag=1,u.memoizedState=null,u.updateQueue=null,kr(f)?(t=!0,V_(u)):t=!1,u.memoizedState=n.state!==null&&n.state!==void 0?n.state:null,I4(u),n.updater=u3,u.stateNode=n,n._reactInternals=u,A4(u,f,l,r),u=N4(null,u,f,!0,t,r)):(u.tag=0,Zu&&t&&s4(u),Vr(null,u,n,r),u=u.child),u;case 16:f=u.elementType;l:{switch(q_(l,u),l=u.pendingProps,n=f._init,f=n(f._payload),u.type=f,n=u.tag=zE(f),l=bf(f,l),n){case 0:u=j4(null,u,f,l,r);break l;case 1:u=tN(null,u,f,l,r);break l;case 11:u=fN(null,u,f,l,r);break l;case 14:u=nN(null,u,f,bf(f.type,l),r);break l}throw Error(Ql(306,f,""))}return u;case 0:return f=u.type,n=u.pendingProps,n=u.elementType===f?n:bf(f,n),j4(l,u,f,n,r);case 1:return f=u.type,n=u.pendingProps,n=u.elementType===f?n:bf(f,n),tN(l,u,f,n,r);case 3:l:{if(gJ(u),l===null)throw Error(Ql(387));f=u.pendingProps,t=u.memoizedState,n=t.element,qJ(l,u),C_(u,f,null,r);var i=u.memoizedState;if(f=i.element,t.isDehydrated)if(t={element:f,isDehydrated:!1,cache:i.cache,pendingSuspenseBoundaries:i.pendingSuspenseBoundaries,transitions:i.transitions},u.updateQueue.baseState=t,u.memoizedState=t,u.flags&256){n=I0(Error(Ql(423)),u),u=iN(l,u,f,r,n);break l}else if(f!==n){n=I0(Error(Ql(424)),u),u=iN(l,u,f,r,n);break l}else for(Ff=Zt(u.stateNode.containerInfo.firstChild),jf=u,Zu=!0,gf=null,r=mJ(u,null,f,r),u.child=r;r;)r.flags=r.flags&-3|4096,r=r.sibling;else{if(v0(),f===n){u=gn(l,u,r);break l}Vr(l,u,f,r)}u=u.child}return u;case 5:return LJ(u),l===null&&c4(u),f=u.type,n=u.pendingProps,t=l!==null?l.memoizedProps:null,i=n.children,f4(f,n)?i=null:t!==null&&f4(f,t)&&(u.flags|=32),vJ(l,u),Vr(l,u,i,r),u.child;case 6:return l===null&&c4(u),null;case 13:return kJ(l,u,r);case 4:return a4(u,u.stateNode.containerInfo),f=u.pendingProps,l===null?u.child=g0(u,null,f,r):Vr(l,u,f,r),u.child;case 11:return f=u.type,n=u.pendingProps,n=u.elementType===f?n:bf(f,n),fN(l,u,f,n,r);case 7:return Vr(l,u,u.pendingProps,r),u.child;case 8:return Vr(l,u,u.pendingProps.children,r),u.child;case 12:return Vr(l,u,u.pendingProps.children,r),u.child;case 10:l:{if(f=u.type._context,n=u.pendingProps,t=u.memoizedProps,i=n.value,Gu(X_,f._currentValue),f._currentValue=i,t!==null)if(af(t.value,i)){if(t.children===n.children&&!gr.current){u=gn(l,u,r);break l}}else for(t=u.child,t!==null&&(t.return=u);t!==null;){var y=t.dependencies;if(y!==null){i=t.child;for(var c=y.firstContext;c!==null;){if(c.context===f){if(t.tag===1){c=Rn(-1,r&-r),c.tag=2;var _=t.updateQueue;if(_!==null){_=_.shared;var A=_.pending;A===null?c.next=c:(c.next=A.next,A.next=c),_.pending=c}}t.lanes|=r,c=t.alternate,c!==null&&(c.lanes|=r),$4(t.return,r,u),y.lanes|=r;break}c=c.next}}else if(t.tag===10)i=t.type===u.type?null:t.child;else if(t.tag===18){if(i=t.return,i===null)throw Error(Ql(341));i.lanes|=r,y=i.alternate,y!==null&&(y.lanes|=r),$4(i,r,u),i=t.sibling}else i=t.child;if(i!==null)i.return=t;else for(i=t;i!==null;){if(i===u){i=null;break}if(t=i.sibling,t!==null){t.return=i.return,i=t;break}i=i.return}t=i}Vr(l,u,n.children,r),u=u.child}return u;case 9:return n=u.type,f=u.pendingProps.children,s0(u,r),n=Hf(n),f=f(n),u.flags|=1,Vr(l,u,f,r),u.child;case 14:return f=u.type,n=bf(f,u.pendingProps),n=bf(f.type,n),nN(l,u,f,n,r);case 15:return xJ(l,u,u.type,u.pendingProps,r);case 17:return f=u.type,n=u.pendingProps,n=u.elementType===f?n:bf(f,n),q_(l,u),u.tag=1,kr(f)?(l=!0,V_(u)):l=!1,s0(u,r),MJ(u,f,n),A4(u,f,n,r),N4(null,u,f,!0,l,r);case 19:return IJ(l,u,r);case 22:return bJ(l,u,r)}throw Error(Ql(156,u.tag))};function AU(l,u){return PN(l,u)}function pE(l,u,r,f){this.tag=l,this.key=r,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=u,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=f,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Of(l,u,r,f){return new pE(l,u,r,f)}function A2(l){return l=l.prototype,!(!l||!l.isReactComponent)}function zE(l){if(typeof l==="function")return A2(l)?1:0;if(l!==void 0&&l!==null){if(l=l.$$typeof,l===Z4)return 11;if(l===H4)return 14}return 2}function Vt(l,u){var r=l.alternate;return r===null?(r=Of(l.tag,u,l.key,l.mode),r.elementType=l.elementType,r.type=l.type,r.stateNode=l.stateNode,r.alternate=l,l.alternate=r):(r.pendingProps=u,r.type=l.type,r.flags=0,r.subtreeFlags=0,r.deletions=null),r.flags=l.flags&14680064,r.childLanes=l.childLanes,r.lanes=l.lanes,r.child=l.child,r.memoizedProps=l.memoizedProps,r.memoizedState=l.memoizedState,r.updateQueue=l.updateQueue,u=l.dependencies,r.dependencies=u===null?null:{lanes:u.lanes,firstContext:u.firstContext},r.sibling=l.sibling,r.index=l.index,r.ref=l.ref,r}function W_(l,u,r,f,n,t){var i=2;if(f=l,typeof l==="function")A2(l)&&(i=1);else if(typeof l==="string")i=5;else l:switch(l){case p0:return pi(r.children,n,t,u);case O4:i=8,n|=8;break;case D6:return l=Of(12,r,u,n|2),l.elementType=D6,l.lanes=t,l;case V6:return l=Of(13,r,u,n),l.elementType=V6,l.lanes=t,l;case S6:return l=Of(19,r,u,n),l.elementType=S6,l.lanes=t,l;case LN:return n3(r,n,t,u);default:if(typeof l==="object"&&l!==null)switch(l.$$typeof){case wN:i=10;break l;case qN:i=9;break l;case Z4:i=11;break l;case H4:i=14;break l;case Lt:i=16,f=null;break l}throw Error(Ql(130,l==null?l:typeof l,""))}return u=Of(i,r,u,n),u.elementType=l,u.type=f,u.lanes=t,u}function pi(l,u,r,f){return l=Of(7,l,f,u),l.lanes=r,l}function n3(l,u,r,f){return l=Of(22,l,f,u),l.elementType=LN,l.lanes=r,l.stateNode={isHidden:!1},l}function Z6(l,u,r){return l=Of(6,l,null,u),l.lanes=r,l}function H6(l,u,r){return u=Of(4,l.children!==null?l.children:[],l.key,u),u.lanes=r,u.stateNode={containerInfo:l.containerInfo,pendingChildren:null,implementation:l.implementation},u}function OE(l,u,r,f,n){this.tag=u,this.containerInfo=l,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=J6(0),this.expirationTimes=J6(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=J6(0),this.identifierPrefix=f,this.onRecoverableError=n,this.mutableSourceEagerHydrationData=null}function F2(l,u,r,f,n,t,i,y,c){return l=new OE(l,u,r,y,c),u===1?(u=1,t===!0&&(u|=8)):u=0,t=Of(3,null,null,u),l.current=t,t.stateNode=l,t.memoizedState={element:f,isDehydrated:r,cache:null,transitions:null,pendingSuspenseBoundaries:null},I4(t),l}function ZE(l,u,r){var f=3{function UU(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=="function")return;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(UU)}catch(l){console.error(l)}}UU(),QU.exports=JU()});var wU=_f((Q2)=>{var mU=U2();Q2.createRoot=mU.createRoot,Q2.hydrateRoot=mU.hydrateRoot;var SE});var Vm=_f((nA)=>{var EZ=Ju(),pZ=Symbol.for("react.element"),zZ=Symbol.for("react.fragment"),OZ=Object.prototype.hasOwnProperty,ZZ=EZ.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,HZ={key:!0,ref:!0,__self:!0,__source:!0};function Dm(l,u,r){var f,n={},t=null,i=null;r!==void 0&&(t=""+r),u.key!==void 0&&(t=""+u.key),u.ref!==void 0&&(i=u.ref);for(f in u)OZ.call(u,f)&&!HZ.hasOwnProperty(f)&&(n[f]=u[f]);if(l&&l.defaultProps)for(f in u=l.defaultProps,u)n[f]===void 0&&(n[f]=u[f]);return{$$typeof:pZ,type:l,key:t,ref:i,props:n,_owner:ZZ.current}}nA.Fragment=zZ;nA.jsx=Dm;nA.jsxs=Dm});var Ym=_f((bh,Sm)=>{Sm.exports=Vm()});var jq=_f((Fq)=>{var Py=Ju();function kD(l,u){return l===u&&(l!==0||1/l===1/u)||l!==l&&u!==u}var ID=typeof Object.is==="function"?Object.is:kD,aD=Py.useState,oD=Py.useEffect,dD=Py.useLayoutEffect,eD=Py.useDebugValue;function lV(l,u){var r=u(),f=aD({inst:{value:r,getSnapshot:u}}),n=f[0].inst,t=f[1];return dD(function(){n.value=r,n.getSnapshot=u,LF(n)&&t({inst:n})},[l,r,u]),oD(function(){return LF(n)&&t({inst:n}),l(function(){LF(n)&&t({inst:n})})},[l]),eD(r),r}function LF(l){var u=l.getSnapshot;l=l.value;try{var r=u();return!ID(l,r)}catch(f){return!0}}function uV(l,u){return u()}var rV=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?uV:lV;Fq.useSyncExternalStore=Py.useSyncExternalStore!==void 0?Py.useSyncExternalStore:rV});var Jq=_f((Pv,Nq)=>{Nq.exports=jq()});var Qq=_f((Uq)=>{var oA=Ju(),fV=Jq();function nV(l,u){return l===u&&(l!==0||1/l===1/u)||l!==l&&u!==u}var tV=typeof Object.is==="function"?Object.is:nV,iV=fV.useSyncExternalStore,yV=oA.useRef,cV=oA.useEffect,$V=oA.useMemo,_V=oA.useDebugValue;Uq.useSyncExternalStoreWithSelector=function(l,u,r,f,n){var t=yV(null);if(t.current===null){var i={hasValue:!1,value:null};t.current=i}else i=t.current;t=$V(function(){function c(N){if(!_){if(_=!0,A=N,N=f(N),n!==void 0&&i.hasValue){var U=i.value;if(n(U,N))return F=U}return F=N}if(U=F,tV(A,N))return U;var w=f(N);if(n!==void 0&&n(U,w))return A=N,U;return A=N,F=w}var _=!1,A,F,j=r===void 0?null:r;return[function(){return c(u())},j===null?void 0:function(){return c(j())}]},[u,r,f,n]);var y=iV(l,t[0],t[1]);return cV(function(){i.hasValue=!0,i.value=y},[y]),_V(y),y}});var wq=_f((hv,mq)=>{mq.exports=Qq()});var Ni=Ml(Ju(),1);var x$="北京时间";var ZT={timeZone:"Asia/Shanghai",hour12:!1},HT={timeZone:"Asia/Shanghai",hour12:!1},BT=new Intl.DateTimeFormat("en-CA",{timeZone:"Asia/Shanghai",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",hourCycle:"h23"});function e8(l){if(l===null||l===void 0||l==="")return null;let u=l instanceof Date?l:new Date(l);return Number.isNaN(u.getTime())?null:u}function r7(l){let u=e8(l);if(!u)return null;return BT.formatToParts(u).reduce((r,f)=>{if(f.type!=="literal")r[f.type]=f.value;return r},{})}function Ll(l){let u=e8(l);return u?u.toLocaleString("zh-CN",ZT):"--"}function iu(l){let u=e8(l);return u?u.toLocaleTimeString("zh-CN",HT):"--"}function l6(l){let u=r7(l);if(!u)return"";let r=u.hour==="24"?"00":u.hour;return`${u.year}-${u.month}-${u.day}T${r}:${u.minute}`}function f7(l=new Date){let u=r7(l);if(!u)return"";return`${u.year}-${u.month}-${u.day}`}function n7(l){if(!l)return null;let u=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(?::(\d{2}))?$/.exec(l);if(!u)return null;let[,r,f,n,t,i,y="00"]=u,c=Date.UTC(Number(r),Number(f)-1,Number(n),Number(t)-8,Number(i),Number(y)),_=new Date(c),A=l6(_);return Number.isNaN(_.getTime())||A!==`${r}-${f}-${n}T${t}:${i}`?null:_.toISOString()}var gG=Ml(wU(),1);var A3=Ml(Ju(),1);var qU=Ml(Ju(),1),l1=qU.default.createElement;function YE({active:l=!0,label:u="正在加载"}){if(!l)return null;return l1("span",{className:"loading-spinner-indicator",role:"status","aria-label":u,title:u,"data-testid":"loading-title-indicator"},l1("span",{className:"loading-spinner-ring","aria-hidden":!0}))}function nu({title:l,children:u,loading:r,level:f=2,className:n="",label:t="正在加载"}){return l1(f===3?"h3":"h2",{className:`loading-title ${r?"is-loading":""} ${n}`.trim()},l1("span",{className:"loading-title-text"},u??l),l1(YE,{active:Boolean(r),label:t}))}class e0 extends Error{unideskRequestError=!0;meta;constructor(l,u){super(l);this.name="UniDeskRequestError",this.meta=u}}function XE(l){return new Promise((u)=>setTimeout(u,l))}function f1(l,u="操作失败"){return l instanceof Error?l.message:String(l||u)}function $3(l,u=500){if(l===null||l===void 0)return"";let r=typeof l==="string"?l:JSON.stringify(l),f=String(r||"").replace(/\s+/gu," ").trim();return f.length>u?`${f.slice(0,u)}...`:f}function PE(l){try{let u=typeof location<"u"&&location.origin?location.origin:"http://localhost";return new URL(l,u).toString()}catch{return l}}function LU(l){return String(l.method||"GET").toUpperCase()}function CE(l){if(l===null||l===void 0)return!1;if(typeof l!=="object")return!1;if(typeof Blob<"u"&&l instanceof Blob)return!1;if(typeof FormData<"u"&&l instanceof FormData)return!1;if(typeof URLSearchParams<"u"&&l instanceof URLSearchParams)return!1;if(typeof ArrayBuffer<"u"&&l instanceof ArrayBuffer)return!1;return!0}function GU(l){let u=new Headers(l.headers||{}),r=CE(l.body)?JSON.stringify(l.body):l.body;if(r&&!u.has("content-type")&&typeof r==="string")u.set("content-type","application/json");return{...l,credentials:l.credentials||"same-origin",body:r,headers:u}}function WU(l){if(l?.error&&typeof l.error==="object"&&typeof l.error.message==="string")return l.error.message;if(typeof l?.error==="string")return l.error;if(typeof l?.message==="string")return l.message;if(typeof l?.detail==="string")return l.detail;return""}function hE(l,u){if(!l||typeof l!=="object"||Array.isArray(l))return!1;return u.some((r)=>r!==!1&&l[r]===!1)}function u1(l,u,r,f,n={}){return{kind:l,method:r,url:PE(u),occurredAt:f.toISOString(),...n}}function r1(l,u){if(!l)return"请求失败";return`HTTP ${l}${u?` ${u}`:""}`}function TU(l){try{return{body:l?JSON.parse(l):null,parseError:""}}catch(u){return{body:{text:l},parseError:f1(u,"parse failed")}}}async function Tl(l,u={},r=0){let{failureFields:f=["ok"],strictJson:n=!1,retryInvalidJson:t=0,retryDelayMs:i=120,invalidJsonPrefix:y="服务返回了无效 JSON",invalidJsonPreview:c=!1,responsePreviewLength:_=500,...A}=u,F=LU(A),j=new Date,N;try{N=await fetch(l,GU(A))}catch(G){let J=f1(G,"网络请求失败");throw new e0(J,u1("network",l,F,j,{upstreamMessage:J}))}let U=await N.text(),w=TU(U);if(w.parseError){if(n&&F==="GET"&&r=300)?r1(l.meta.status,l.meta.statusText):"应用请求失败",t=l.meta.status?r1(l.meta.status):"",i=(c)=>!c||c===n||c===t,y=!i(l.message)?l.message:i(l.meta.upstreamMessage)?"":l.meta.upstreamMessage||"";return{title:n,message:y,status:l.meta.status,statusText:l.meta.statusText,method:l.meta.method,url:l.meta.url,occurredAt:ME(l.meta.occurredAt),responsePreview:l.meta.responsePreview,parseError:l.meta.parseError,structured:!0}}let f=f1(l,u).split(/\r?\n/u);return{title:f[0]||u,message:f.slice(1).join(` -`),structured:f.length>1}}function sE(l,u="操作失败"){let r=m2(l,u),f=[r.title];if(r.message)f.push(`原因: ${r.message}`);if(r.method||r.url)f.push(`请求: ${[r.method,r.url].filter(Boolean).join(" ")}`);if(r.status)f.push(`状态: ${r1(r.status,r.statusText)}`);if(r.occurredAt)f.push(`时间: ${r.occurredAt}`);if(r.parseError)f.push(`解析错误: ${r.parseError}`);if(r.responsePreview&&r.responsePreview!==r.message)f.push(`响应预览: ${r.responsePreview}`);return f.filter(Boolean).join(` -`)}function zl(l,u="操作失败"){return EU(l)?sE(l,u):f1(l,u)}var pU=Ml(Ju(),1);var ht=pU.default.createElement;function n1(l,u){return u?[ht("dt",{key:`${l}-label`},l),ht("dd",{key:l},u)]:null}function el({error:l,wide:u=!1,fallback:r="操作失败",className:f=""}){if(!l)return null;let n=m2(l,r),t=[n1("请求",[n.method,n.url].filter(Boolean).join(" ")),n1("状态",n.status?`HTTP ${n.status}${n.statusText?` ${n.statusText}`:""}`:""),n1("时间",n.occurredAt),n1("解析错误",n.parseError),n1("响应预览",n.responsePreview)].filter(Boolean);return ht("div",{className:`form-error unidesk-error${u?" wide":""}${f?` ${f}`:""}`,role:"alert","data-testid":"unidesk-error"},ht("div",{className:"unidesk-error-title"},ht("strong",null,n.title),n.status?ht("span",{className:"unidesk-error-code"},`HTTP ${n.status}`):null),n.message?ht("pre",{className:"unidesk-error-message"},n.message):null,t.length>0?ht("dl",{className:"unidesk-error-details"},t):null)}var wn=Ml(Ju(),1),zU=wn.default.createContext(null);function OU({children:l}){let[u,r]=wn.default.useState([]),[f,n]=wn.default.useState(Date.now()),t=wn.default.useCallback((F,j)=>{let U={id:`notif_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,type:F,message:j,timestamp:Date.now()};r((w)=>{let G=[...w,U];if(G.length>50)return G.slice(-50);return G})},[]),i=wn.default.useCallback((F)=>{r((j)=>j.filter((N)=>N.id!==F))},[]),y=wn.default.useCallback(()=>{r([]),n(Date.now())},[]),c=wn.default.useMemo(()=>{return u.filter((F)=>F.timestamp>f).length},[u,f]),_=c>0,A={notifications:u,addNotification:t,removeNotification:i,clearNotifications:y,unreadCount:c,hasUnread:_};return RE(zU.Provider,{value:A},l)}var RE=wn.default.createElement;function Xr(){let l=wn.default.useContext(zU);if(!l)throw Error("useNotification must be used within NotificationProvider");return l}var b=A3.default.createElement,{useEffect:_3}=A3.default,ly=A3.default.useState;function Tr(l,u={}){return Tl(l,{failureFields:["ok","success"],...u})}function Pr(l,u){return`${l}/microservices/baidu-netdisk/proxy${u}`}function xE(l){let u=Number(l);return Number.isFinite(u)?u.toLocaleString("zh-CN"):"--"}function Mt(l){let u=Number(l);if(!Number.isFinite(u)||u<=0)return"--";let r=["B","KB","MB","GB","TB"],f=u,n=0;while(f>=1024&&n{n?.stopPropagation?.(),r(l,u)}},"查看原始JSON")}function ry({title:l,text:u}){return b("div",{className:"empty-state"},b("strong",null,l),b("span",null,u))}function fy({title:l,text:u,href:r,badge:f,testId:n}){return b("a",{className:"doc-link-card",href:r,target:"_blank",rel:"noreferrer","data-testid":n},b("span",null,f||"DOC"),b("strong",null,l),b("p",null,u),b("code",null,r))}function bE(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function vE(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function gE(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function kE(l){return Array.isArray(l?.files)?l.files:[]}function IE(l){return Array.isArray(l?.jobs)?l.jobs:[]}function aE(l,u){if(!l||l===u)return u;let r=l.replace(/\/+$/u,""),f=r.slice(0,r.lastIndexOf("/"))||u;return f.lengths.id==="baidu-netdisk")||null,[n,t]=ly({loading:!1,actionLoading:!1,error:"",message:"",health:null,account:null,files:null,transfers:null,logs:null,selfTest:null,refreshedAt:null}),[i,y]=ly("/"),[c,_]=ly(null),[A,F]=ly(""),[j,N]=ly({localPath:"sample.txt",remotePath:"/sample.txt"}),[U,w]=ly({fsId:"",localPath:"downloads/"}),{addNotification:G}=Xr(),J=n.health?.baidu?.appRoot||n.account?.rootPath||"/";_3(()=>{N((s)=>{let ul=new Set(["/sample.txt","/apps/UniDeskBaiduNetdisk/sample.txt"]);if(s.remotePath&&!ul.has(s.remotePath))return s;let tl=w2(J,"sample.txt");return s.remotePath===tl?s:{...s,remotePath:tl}})},[J]);async function Q(s=i){let tl=await Tr(Pr(r,`/api/files?dir=${encodeURIComponent(s||J)}&limit=100`));t((Al)=>({...Al,files:tl}))}async function m(){let s=await Tr(Pr(r,"/api/transfers?limit=80"));t((ul)=>({...ul,transfers:s}))}async function q(){if(!f)return;t((s)=>({...s,loading:!0,error:"",message:""}));try{let s=await Tr(`${r}/microservices/baidu-netdisk/health`),ul=s?.baidu?.appRoot||J,tl=null,Al=null;if(s?.auth?.loggedIn){tl=await Tr(Pr(r,"/api/account?refresh=1"));let El=i&&i.startsWith(ul)?i:ul;y(El),Al=await Tr(Pr(r,`/api/files?dir=${encodeURIComponent(El)}&limit=100`))}else y(ul);let Kl=await Tr(Pr(r,"/api/transfers?limit=80")),wl=await Tr(Pr(r,"/logs?limit=60"));t((El)=>({...El,loading:!1,health:s,account:tl?.account||null,files:Al,transfers:Kl,logs:wl,refreshedAt:new Date}))}catch(s){t((ul)=>({...ul,loading:!1,error:zl(s,"百度网盘服务加载失败")}))}}async function W(){t((s)=>({...s,actionLoading:!0,error:"",message:""}));try{let s=await Tr(Pr(r,"/api/auth/device/start"),{method:"POST",body:{}});_(s.session||null),t((ul)=>({...ul,actionLoading:!1,message:"设备码已生成,请扫码授权"}))}catch(s){t((ul)=>({...ul,actionLoading:!1,error:zl(s,"创建设备码失败")}))}}async function p(s=!1){if(!c?.id)return;if(s)t((ul)=>({...ul,actionLoading:!0,error:""}));try{let ul=await Tr(Pr(r,`/api/auth/device/status?sessionId=${encodeURIComponent(c.id)}`));if(_(ul.session||null),ul.session?.status==="succeeded")t((tl)=>({...tl,actionLoading:!1,message:"授权成功,正在刷新账号与文件列表"})),await q();else if(s)t((tl)=>({...tl,actionLoading:!1}))}catch(ul){t((tl)=>({...tl,actionLoading:!1,error:zl(ul,"轮询登录状态失败")}))}}async function O(){t((s)=>({...s,actionLoading:!0,error:"",message:""}));try{await Tr(Pr(r,"/api/auth/logout"),{method:"POST",body:{}}),_(null),t((s)=>({...s,actionLoading:!1,account:null,files:null,message:"本地 token 已清除"})),await q()}catch(s){t((ul)=>({...ul,actionLoading:!1,error:zl(s,"退出登录失败")}))}}async function Z(s){s.preventDefault();let ul=A.trim();if(!ul)return;t((tl)=>({...tl,actionLoading:!0,error:"",message:""}));try{await Tr(Pr(r,"/api/folders"),{method:"POST",body:{path:w2(i,ul)}}),F(""),t((tl)=>({...tl,actionLoading:!1,message:"文件夹已创建"})),await Q(i)}catch(tl){t((Al)=>({...Al,actionLoading:!1,error:zl(tl,"创建文件夹失败")}))}}async function V(s){if(!s)return;t((ul)=>({...ul,actionLoading:!0,error:"",message:""}));try{await Tr(Pr(r,"/api/files/manage"),{method:"POST",body:{opera:"delete",filelist:[{path:s}],async:1}}),t((ul)=>({...ul,actionLoading:!1,message:"删除任务已提交"})),await Q(i)}catch(ul){t((tl)=>({...tl,actionLoading:!1,error:zl(ul,"删除失败")}))}}async function P(s){s.preventDefault(),t((ul)=>({...ul,actionLoading:!0,error:"",message:""}));try{await Tr(Pr(r,"/api/transfers/upload-from-path"),{method:"POST",body:j}),t((ul)=>({...ul,actionLoading:!1,message:"上传任务已入队"})),await m()}catch(ul){t((tl)=>({...tl,actionLoading:!1,error:zl(ul,"上传任务创建失败")}))}}async function H(s){s.preventDefault(),t((ul)=>({...ul,actionLoading:!0,error:"",message:""}));try{await Tr(Pr(r,"/api/transfers/download-to-path"),{method:"POST",body:U}),t((ul)=>({...ul,actionLoading:!1,message:"下载任务已入队"})),await m()}catch(ul){t((tl)=>({...tl,actionLoading:!1,error:zl(ul,"下载任务创建失败")}))}}async function B(s,ul){t((tl)=>({...tl,actionLoading:!0,error:"",message:""}));try{await Tr(Pr(r,`/api/transfers/${encodeURIComponent(s)}/${ul}`),{method:"POST",body:{}}),t((tl)=>({...tl,actionLoading:!1,message:ul==="cancel"?"已请求取消任务":"任务已重新入队"})),await m()}catch(tl){t((Al)=>({...Al,actionLoading:!1,error:zl(tl,"任务操作失败")}))}}async function C(){t((s)=>({...s,actionLoading:!0,error:"",message:"正在运行上传/下载自测..."}));try{let s=await Tr(Pr(r,"/api/self-test"),{method:"POST",body:{}});t((ul)=>({...ul,actionLoading:!1,selfTest:s,message:`上传/下载自测通过:${s.remotePath||""}`})),await Q(i),await m()}catch(s){t((ul)=>({...ul,actionLoading:!1,error:zl(s,"上传/下载自测失败")}))}}if(_3(()=>{if(!f)return;q();return},[f?.id,f?.runtime?.providerStatus]),_3(()=>{if(!c?.id||c.status!=="pending")return;let s=window.setInterval(()=>void p(!1),Math.max(5000,Number(c.pollIntervalSeconds||5)*1000));return()=>window.clearInterval(s)},[c?.id,c?.status,c?.pollIntervalSeconds]),_3(()=>{if(!f)return;let s=window.setInterval(()=>void m(),5000);return()=>window.clearInterval(s)},[f?.id]),!f)return b(ry,{title:"Baidu Netdisk 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=baidu-netdisk"});let E=bE(f),D=gE(f),Y=vE(f),v=n.health||{},K=n.account||v.auth?.account||null,X=v.auth||{},I=kE(n.files),o=IE(n.transfers),fl=K?.quota||{},yl=Boolean(X.loggedIn||K),h=Boolean(X.configured);return b("div",{className:"baidu-netdisk-page","data-testid":"baidu-netdisk-page"},b(Yi,{title:"Baidu Netdisk 工作台",eyebrow:"Containerized Storage Gateway",loading:n.loading,actions:b("div",{className:"panel-actions"},b("a",{className:"ghost-btn",href:"/docs/issue/baidu-netdisk-env-setup.md",target:"_blank",rel:"noreferrer","data-testid":"baidu-netdisk-config-doc-link"},"配置文档"),b("button",{type:"button",className:"ghost-btn",onClick:q,disabled:n.loading,"data-testid":"baidu-netdisk-refresh"},n.loading?"刷新中":"刷新"),b(In,{title:"Baidu Netdisk 用户服务",data:f,onOpen:u,testId:"raw-baidu-netdisk-service"}))},b("div",{className:"baidu-netdisk-hero"},b("div",null,b("div",{className:"node-version-line"},b(Si,{status:E.providerStatus==="online"?"online":"warn"},E.providerStatus||"unknown"),b("span",null,f.providerId),b(Si,{status:Y.public?"warn":"private"},Y.public?"公网暴露":"仅 UniDesk frontend 代理访问")),b("p",{className:"muted paragraph"},f.description)),b("div",{className:"microservice-ref-card"},b("span",null,"Repo"),b("strong",null,D.url||"--"),b("code",null,D.commitId||"--")),b("div",{className:"microservice-ref-card"},b("span",null,"Private Backend"),b("strong",null,`${Y.nodeBindHost||"--"}:${Y.nodePort||"--"}`),b("code",null,`${D.composeFile||"--"} / ${D.composeService||"--"}`))),b(el,{error:n.error,wide:!0})),b("div",{className:"metric-grid"},b(uy,{label:"Health",value:v.ok?"OK":"--",hint:v.storage?.postgres||"postgres",tone:v.ok?"ok":"warn"}),b(uy,{label:"OAuth",value:h?"已配置":"待配置",hint:h?"client + secret + token key":"需要设置 UNIDESK_BAIDU_NETDISK_*",tone:h?"ok":"warn"}),b(uy,{label:"Login",value:yl?"已登录":"未登录",hint:K?.username||"Device Code QR",tone:yl?"ok":"warn"}),b(uy,{label:"Work Root",value:oE(J),hint:J}),b(uy,{label:"Quota",value:Mt(fl.used),hint:fl.total?`${fl.usedPercent||0}% / ${Mt(fl.total)}`:"授权后刷新"}),b(uy,{label:"Transfers",value:xE(o.length),hint:`running ${n.transfers?.counts?.running||0} / failed ${n.transfers?.counts?.failed||0}`})),b(Yi,{title:"文件浏览器",eyebrow:i,className:"baidu-files-panel",loading:n.loading,actions:b("div",{className:"panel-actions inline-actions"},b("button",{type:"button",className:"ghost-btn",onClick:()=>{let s=aE(i,J);y(s),Q(s)},disabled:!yl||i===J},"上级"),b("button",{type:"button",className:"ghost-btn",onClick:()=>Q(i),disabled:!yl},"刷新文件"),b(In,{title:"Baidu Files",data:n.files,onOpen:u,testId:"raw-baidu-files"}))},b("form",{className:"baidu-pathbar",onSubmit:(s)=>{s.preventDefault(),Q(i)}},b("input",{value:i,onChange:(s)=>y(s.target.value),disabled:!yl}),b("button",{type:"submit",className:"ghost-btn",disabled:!yl},"打开路径")),b("form",{className:"baidu-pathbar",onSubmit:Z},b("input",{value:A,onChange:(s)=>F(s.target.value),placeholder:"新文件夹名称",disabled:!yl}),b("button",{type:"submit",className:"primary-btn",disabled:!yl||!A.trim()},"新建文件夹")),!yl?b(ry,{title:"等待授权",text:"登录后通过 /api/files 读取工作目录文件列表"}):I.length===0?b(ry,{title:"目录为空",text:"可以从 staging 目录上传文件或新建文件夹"}):b("div",{className:"table-wrap","data-testid":"baidu-netdisk-file-table"},b("table",null,b("thead",null,b("tr",null,b("th",null,"名称"),b("th",null,"类型"),b("th",null,"大小"),b("th",null,"修改时间"),b("th",null,"fs_id"),b("th",null,"操作"))),b("tbody",null,I.map((s)=>b("tr",{key:s.fsId||s.path},b("td",null,b("strong",null,s.serverFilename||s.path),b("code",null,s.path||"--")),b("td",null,b(Si,{status:s.isDir?"queued":"private"},s.isDir?"DIR":"FILE")),b("td",null,s.isDir?"--":Mt(s.size)),b("td",null,s.serverMtime?Ll(s.serverMtime*1000):"--"),b("td",null,b("code",null,s.fsId||"--")),b("td",null,b("div",{className:"inline-actions"},s.isDir?b("button",{type:"button",className:"ghost-btn",onClick:()=>{y(s.path),Q(s.path)}},"打开"):b("button",{type:"button",className:"ghost-btn",onClick:()=>w((ul)=>({...ul,fsId:s.fsId}))},"填入下载"),b("button",{type:"button",className:"ghost-btn",onClick:()=>V(s.path),disabled:n.actionLoading},"删除"))))))))),b("div",{className:"baidu-netdisk-grid"},b(Yi,{title:"配置与文档",eyebrow:"Deployment References",className:"baidu-docs-panel",actions:b("div",{className:"panel-actions inline-actions"},b("a",{className:"ghost-btn",href:"/docs/issue/baidu-netdisk-env-setup.md",target:"_blank",rel:"noreferrer"},"打开环境配置"),b("a",{className:"ghost-btn",href:"/docs/issue/baidu-netdisk-user-service.md",target:"_blank",rel:"noreferrer"},"打开服务方案"))},b("p",{className:"muted paragraph"},h?"OAuth 运行时变量已配置;如需轮换密钥、迁移部署或排查代理边界,可直接打开下面的项目内文档。":"首次使用请先按环境变量配置文档填入百度应用 client id / secret,然后重建 baidu-netdisk 服务并刷新本页。"),b("div",{className:"baidu-doc-grid","data-testid":"baidu-netdisk-doc-links"},b(fy,{title:"环境变量配置",text:"填写 UNIDESK_BAIDU_NETDISK_CLIENT_ID、CLIENT_SECRET、TOKEN_KEY,并执行重建与健康检查。",href:"/docs/issue/baidu-netdisk-env-setup.md",badge:"SETUP",testId:"baidu-netdisk-env-doc-card"}),b(fy,{title:"服务方案与 API",text:"说明 OAuth Device Code、根目录工作区、staging 上传下载任务和后端 API 设计。",href:"/docs/issue/baidu-netdisk-user-service.md",badge:"DESIGN"}),b(fy,{title:"用户服务安全边界",text:"查看 UniDesk microservice 私有代理、允许路径、frontendOnly 和密钥边界规则。",href:"/docs/reference/microservices.md",badge:"REF"}),b(fy,{title:"部署与重建流程",text:"查看 server rebuild、Compose 编排、健康检查和交付验证的长期规则。",href:"/docs/reference/deployment.md",badge:"DEPLOY"}),b(fy,{title:"CLI 验证命令",text:"查看 microservice health/proxy、server rebuild、job status 等命令入口。",href:"/docs/reference/cli.md",badge:"CLI"}),b(fy,{title:"百度设备码模式",text:"打开百度官方 OAuth Device Code 文档,对照扫码登录和轮询参数。",href:"https://pan.baidu.com/union/doc/fl1x114ti",badge:"OFFICIAL"}))),b(Yi,{title:"设备码登录",eyebrow:"OAuth Device Code",className:"baidu-login-panel",loading:n.actionLoading,actions:b("div",{className:"panel-actions inline-actions"},b("button",{type:"button",className:"primary-btn",onClick:W,disabled:n.actionLoading||!h,"data-testid":"baidu-netdisk-start-login"},"生成二维码"),c?.id?b("button",{type:"button",className:"ghost-btn",onClick:()=>p(!0),disabled:n.actionLoading},"检查状态"):null,yl?b("button",{type:"button",className:"ghost-btn",onClick:O,disabled:n.actionLoading},"清除本地登录"):null,b(In,{title:"Baidu Device Session",data:c||X.latestSession,onOpen:u,testId:"raw-baidu-device-session"}))},b("div",{className:"baidu-login-card","data-testid":"baidu-netdisk-login-card"},b("div",{className:"baidu-qr-frame"},c?.qrcodeUrl?b("img",{src:c.qrcodeUrl,alt:"百度网盘设备码授权二维码","data-testid":"baidu-netdisk-qrcode"}):b(ry,{title:h?"等待二维码":"OAuth 未配置",text:h?"点击生成二维码后使用百度网盘或百度 App 扫码":"设置 client id、secret 和 token key 后重建服务"})),b("div",{className:"claudeqq-login-copy"},b("div",{className:"node-version-line"},b(Si,{status:yl?"online":c?.status==="pending"?"warn":"unknown"},yl?"已登录":c?.status||"未开始"),b("span",null,c?.secondsRemaining!==void 0?`${c.secondsRemaining}s`:"--"),b("span",null,"scope basic,netdisk")),b("p",{className:"muted paragraph"},yl?"access token / refresh token 已加密保存到 PostgreSQL;前端只看到脱敏登录态。":"后端使用百度 OAuth Device Code 轮询换取 token;二维码过期后重新生成即可。"),b("div",{className:"microservice-ref-card"},b("span",null,"User Code"),b("strong",null,c?.userCode||"--"),b("code",null,c?.verificationUrl||"https://openapi.baidu.com/device")),b("div",{className:"microservice-ref-card"},b("span",null,"Expires"),b("strong",null,c?.expiresAt?Ll(c.expiresAt):"--"),b("code",null,c?.error||"no token exposed"))))),b(Yi,{title:"账号与容量",eyebrow:n.refreshedAt?`Updated ${iu(n.refreshedAt)}`:"Account",loading:n.loading,actions:b("div",{className:"panel-actions inline-actions"},b(In,{title:"Baidu Account",data:K,onOpen:u,testId:"raw-baidu-account"}))},K?b("div",{className:"baidu-account-card"},b("div",{className:"node-version-line"},b(Si,{status:"online"},"connected"),b("span",null,K.baiduUid||"--"),b("span",null,`VIP ${K.vipType??"--"}`)),b("h3",null,K.username||"Baidu Netdisk"),b("p",{className:"muted paragraph"},`工作目录固定在 ${K.rootPath||J};v1 上传/下载只读写容器 staging 目录,不把大文件字节流穿过 UniDesk proxy。`),b("div",{className:"quota-bar"},b("span",{style:{width:`${Math.max(0,Math.min(100,Number(fl.usedPercent||0)))}%`}})),b("div",{className:"microservice-ref-card"},b("span",null,"Quota"),b("strong",null,`${Mt(fl.used)} / ${Mt(fl.total)}`),b("code",null,`${fl.usedPercent||0}% used`))):b(ry,{title:"尚未登录",text:"扫码授权后这里会显示账号、UID、会员状态和容量"})),b(Yi,{title:"传输任务",eyebrow:"staging path jobs",className:"baidu-transfers-panel",loading:n.actionLoading,actions:b("div",{className:"panel-actions inline-actions"},b("button",{type:"button",className:"primary-btn",onClick:C,disabled:!yl||n.actionLoading,"data-testid":"baidu-netdisk-self-test"},"运行自测"),b("button",{type:"button",className:"ghost-btn",onClick:m},"刷新任务"),b(In,{title:"Baidu Transfers",data:n.transfers,onOpen:u,testId:"raw-baidu-transfers"}))},b("div",{className:"baidu-transfer-forms"},b("form",{className:"stack-form",onSubmit:P,"data-testid":"baidu-upload-form"},b("label",null,"容器 staging 文件",b("input",{value:j.localPath,onChange:(s)=>N((ul)=>({...ul,localPath:s.target.value})),placeholder:"sample.txt"})),b("label",null,"百度网盘目标路径",b("input",{value:j.remotePath,onChange:(s)=>N((ul)=>({...ul,remotePath:s.target.value})),placeholder:w2(J,"sample.txt")})),b("button",{type:"submit",className:"primary-btn",disabled:!yl||n.actionLoading},"上传 staging 文件")),b("form",{className:"stack-form",onSubmit:H,"data-testid":"baidu-download-form"},b("label",null,"文件 fs_id",b("input",{value:U.fsId,onChange:(s)=>w((ul)=>({...ul,fsId:s.target.value})),placeholder:"从文件表填入"})),b("label",null,"保存到 staging 路径",b("input",{value:U.localPath,onChange:(s)=>w((ul)=>({...ul,localPath:s.target.value})),placeholder:"downloads/"})),b("button",{type:"submit",className:"primary-btn",disabled:!yl||!U.fsId||n.actionLoading},"下载到 staging"))),n.selfTest?b("div",{className:"baidu-account-card","data-testid":"baidu-netdisk-self-test-result"},b("div",{className:"node-version-line"},b(Si,{status:n.selfTest.ok?"online":"warn"},n.selfTest.ok?"self-test ok":"self-test"),b("span",null,Mt(n.selfTest.sizeBytes))),b("h3",null,n.selfTest.remotePath||"Baidu self-test"),b("div",{className:"microservice-ref-card"},b("span",null,"fs_id"),b("strong",null,n.selfTest.fsId||"--"),b("code",null,n.selfTest.downloadedPath||"--")),b("div",{className:"microservice-ref-card"},b("span",null,"MD5"),b("strong",null,n.selfTest.downloadedMd5||"--"),b("code",null,n.selfTest.expectedMd5||"--")),b(In,{title:"Baidu Self Test",data:n.selfTest,onOpen:u,testId:"raw-baidu-self-test"})):null,o.length===0?b(ry,{title:"暂无传输任务",text:"上传/下载任务会在后端容器内执行,避免大文件穿过 UniDesk proxy"}):b("div",{className:"table-wrap","data-testid":"baidu-transfer-table"},b("table",null,b("thead",null,b("tr",null,b("th",null,"状态"),b("th",null,"方向"),b("th",null,"路径"),b("th",null,"进度"),b("th",null,"时间"),b("th",null,"操作"))),b("tbody",null,o.map((s)=>b("tr",{key:s.id},b("td",null,b(Si,{status:s.status},s.status)),b("td",null,s.direction),b("td",null,b("strong",null,s.remotePath||s.fsId||"--"),b("code",null,s.localPath||"--"),s.error?b("span",{className:"form-error"},s.error):null),b("td",null,b(dE,{percent:s.progressPercent}),b("span",{className:"muted"},`${Mt(s.bytesDone)} / ${Mt(s.sizeBytes)}`)),b("td",null,Ll(s.updatedAt)),b("td",null,b("div",{className:"inline-actions"},["queued","running"].includes(s.status)?b("button",{type:"button",className:"ghost-btn",onClick:()=>B(s.id,"cancel")},"取消"):null,["failed","canceled"].includes(s.status)?b("button",{type:"button",className:"ghost-btn",onClick:()=>B(s.id,"retry")},"重试"):null,b(In,{title:`Transfer ${s.id}`,data:s,onOpen:u}))))))))),b(Yi,{title:"安全与日志",eyebrow:"redacted diagnostics",className:"baidu-wide-panel",loading:n.loading,actions:b("div",{className:"panel-actions inline-actions"},b(In,{title:"Baidu Health",data:v,onOpen:u,testId:"raw-baidu-health"}),b(In,{title:"Baidu Logs",data:n.logs,onOpen:u,testId:"raw-baidu-logs"}))},b("div",{className:"policy-grid"},b("article",null,b("b",null,"私有后端"),b("span",null,"4244 只在 Compose 网络 expose,浏览器经 UniDesk 同源代理访问")),b("article",null,b("b",null,"Token 加密"),b("span",null,"access/refresh token 使用 BAIDU_NETDISK_TOKEN_KEY 加密后写入 PostgreSQL")),b("article",null,b("b",null,"无浏览器大文件流"),b("span",null,"上传/下载以容器 staging 目录为边界,避免 proxy 文本通道传输大字节流"))))))}var N3=Ml(Ju(),1);var ll=N3.default.createElement,{useEffect:eE}=N3.default,F3=N3.default.useState,Xi={label:"主用户私聊账号",userId:645275593};function q2(l){let u=Number(l);return Number.isFinite(u)?u.toLocaleString("zh-CN"):"--"}async function st(l,u={}){return Tl(l,{failureFields:["ok","success"],...u})}async function lp(l){let u=await fetch(l,{credentials:"same-origin"}),r=await u.text();try{return r?JSON.parse(r):{ok:u.ok,status:u.status}}catch{return{ok:u.ok,status:u.status,text:r}}}function j3({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return ll("span",{className:`status-badge ${r}`},u||l||"unknown")}function ny({label:l,value:u,hint:r,tone:f}){return ll("article",{className:`metric-card ${f||""}`},ll("div",{className:"metric-label"},l),ll("div",{className:"metric-value"},u),ll("div",{className:"metric-hint"},r))}function ty({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return ll("section",{className:`panel ${n||""}`},ll("div",{className:"panel-head"},ll("div",null,u?ll("p",{className:"panel-eyebrow"},u):null,ll(nu,{title:l,loading:t})),r?ll("div",{className:"panel-actions"},r):null),ll("div",{className:"panel-body"},f))}function t1({title:l,data:u,onOpen:r,testId:f}){return ll("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:(n)=>{n?.stopPropagation?.(),r(l,u)}},"查看原始JSON")}function i1({title:l,text:u}){return ll("div",{className:"empty-state"},ll("strong",null,l),ll("span",null,u))}function up(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function rp(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function fp(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function Rt(l,u){return`${l}/microservices/claudeqq/proxy${u}`}function np(l){return Array.isArray(l?.events)?l.events.slice(0,80):[]}function tp(l){return Array.isArray(l?.subscriptions)?l.subscriptions.slice(0,50):[]}function ip(l){return Array.isArray(l?.messages)?l.messages.slice(0,30):[]}function HU(l){let u=l?.text??l?.message??l?.raw?.raw_message;if(typeof u!=="string")return"--";return u.length>180?`${u.slice(0,177)}...`:u}function BU(l){let u=l?.groupId??l?.group_id??(l?.message_type==="group"?l?.target_id:void 0),r=l?.userId??l?.user_id??(l?.message_type==="private"?l?.target_id:void 0);if(u)return`群 ${u}`;if(r)return`私聊 ${r}`;return"--"}function DU({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((K)=>K.id==="claudeqq")||null,[n,t]=F3({loading:!1,qrLoading:!1,error:"",health:null,status:null,napcatLogin:null,napcatQrcode:null,qrcodeFetched:!1,qrcodeRefreshedAt:null,events:null,subscriptions:null,sent:null,refreshedAt:null}),[i,y]=F3({targetType:"private",targetId:String(Xi.userId),message:""}),[c,_]=F3({name:"unidesk-callback",targetUrl:"",eventTypes:"message",secret:""}),[A,F]=F3(""),{addNotification:j}=Xr();async function N(){if(!f)return;t((K)=>({...K,loading:!0,error:""}));try{let[K,X,I,o,fl]=await Promise.all([lp(`${r}/microservices/claudeqq/health`),st(Rt(r,"/api/server/status")),st(Rt(r,"/api/events/recent?limit=60")),st(Rt(r,"/api/events/subscriptions")),st(Rt(r,"/api/messages/sent?limit=20"))]);if(t((yl)=>({...yl,loading:!1,error:"",health:K,status:X,events:I,subscriptions:o,sent:fl,refreshedAt:new Date})),!n.qrcodeFetched)U(!1)}catch(K){t((X)=>({...X,loading:!1,error:zl(K,"ClaudeQQ 加载失败")}))}}async function U(K=!0){if(!f)return;t((X)=>({...X,qrLoading:!0,error:K?"":X.error}));try{let X=await st(Rt(r,"/api/napcat/login")),I=X?.napcat?.qrcode||X?.qrcode||null;t((o)=>({...o,qrLoading:!1,error:"",napcatLogin:X,napcatQrcode:I,qrcodeFetched:!0,qrcodeRefreshedAt:new Date}))}catch(X){t((I)=>({...I,qrLoading:!1,error:K||!I.napcatQrcode?zl(X,"NapCat 二维码加载失败"):I.error}))}}async function w(K){K.preventDefault(),F("");let X=Number(i.targetId);if(!Number.isFinite(X)||X<=0||i.message.trim().length===0){t((I)=>({...I,error:"请填写 QQ 目标和消息内容"}));return}try{await st(Rt(r,"/api/push/text"),{method:"POST",body:JSON.stringify({userId:i.targetType==="private"?X:void 0,groupId:i.targetType==="group"?X:void 0,message:i.message})});let I="消息推送请求已提交";y((o)=>({...o,targetType:"private",targetId:String(Xi.userId),message:""})),F(I),j("success",I),await N()}catch(I){t((o)=>({...o,error:zl(I,"发送失败")}))}}async function G(K){if(K.preventDefault(),F(""),c.targetUrl.trim().length===0){t((X)=>({...X,error:"请填写订阅回调 URL"}));return}try{await st(Rt(r,"/api/events/subscriptions"),{method:"POST",body:JSON.stringify({name:c.name,targetUrl:c.targetUrl,eventTypes:c.eventTypes.split(",").map((I)=>I.trim()).filter(Boolean),secret:c.secret||void 0,enabled:!0})});let X="事件订阅已创建";F(X),j("success",X),await N()}catch(X){t((I)=>({...I,error:zl(X,"订阅失败")}))}}async function J(K){if(!K)return;F("");try{await st(Rt(r,`/api/events/subscriptions/${encodeURIComponent(K)}`),{method:"DELETE"});let X="事件订阅已删除";F(X),j("success",X),await N()}catch(X){t((I)=>({...I,error:zl(X,"删除订阅失败")}))}}if(eE(()=>{if(!f)return;N();return},[f?.id,f?.runtime?.providerStatus]),!f)return ll(i1,{title:"ClaudeQQ 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=claudeqq"});let Q=up(f),m=fp(f),q=rp(f),W=n.health||{},p=n.status||{},O=n.napcatLogin||{},Z=W.napcat||p.napcat||{},V={...O.napcat||{},...Z,qrcode:n.napcatQrcode||{},webui:Z.webui||O.napcat?.webui},P=O.login||{},H=n.napcatQrcode||{},B=np(n.events),C=tp(n.subscriptions),E=ip(n.sent),D=Boolean(V.httpConnected||P.ready),Y=String(V.loginState||P.state||(D?"logged_in":"unknown")),v=Boolean(H.available&&H.dataUrl);return ll("div",{className:"claudeqq-page","data-testid":"claudeqq-page"},ll(ty,{title:"ClaudeQQ 工作台",eyebrow:"D601 QQ Event Gateway",loading:n.loading,actions:ll("div",{className:"panel-actions"},ll("button",{type:"button",className:"ghost-btn",onClick:N,disabled:n.loading,"data-testid":"claudeqq-refresh-button"},n.loading?"刷新中":"刷新"),ll(t1,{title:"ClaudeQQ 用户服务",data:f,onOpen:u,testId:"raw-claudeqq-service"}))},ll("div",{className:"findjob-hero"},ll("div",null,ll("div",{className:"node-version-line"},ll(j3,{status:Q.providerStatus==="online"?"online":"warn"},Q.providerStatus||"unknown"),ll("span",null,f.providerId),ll("span",null,q.public?"公网暴露":"仅 UniDesk frontend 代理访问")),ll("p",{className:"muted paragraph"},f.description)),ll("div",{className:"microservice-ref-card"},ll("span",null,"Repo"),ll("strong",null,m.url||"--"),ll("code",null,m.commitId||"--")),ll("div",{className:"microservice-ref-card"},ll("span",null,"D601 k3s Service"),ll("strong",null,`${q.nodeBindHost||"--"}:${q.nodePort||"--"}`),ll("code",null,`${q.proxyMode||"--"} / ${m.composeFile||"--"}`))),ll(el,{error:n.error,wide:!0})),ll("div",{className:"metric-grid"},ll(ny,{label:"Health",value:W.ok||W.status==="ok"?"OK":"--",hint:"D601 /health",tone:W.ok||W.status==="ok"?"ok":"warn"}),ll(ny,{label:"NapCat HTTP",value:V.httpConnected||V.http?.connected?"OK":"离线",hint:`${V.httpHost||W.napcat?.httpHost||"--"}:${V.httpPort||W.napcat?.httpPort||"--"}`}),ll(ny,{label:"NapCat WS",value:V.wsConnected||V.ws?.connected?"OK":"离线",hint:`${V.wsHost||W.napcat?.wsHost||"--"}:${V.wsPort||W.napcat?.wsPort||"--"}`}),ll(ny,{label:"事件缓存",value:q2(n.events?.count??B.length),hint:"recent QQ events"}),ll(ny,{label:"订阅",value:q2(n.subscriptions?.count??C.length),hint:"webhook subscribers"}),ll(ny,{label:"已发送",value:q2(n.sent?.count??E.length),hint:"sent message log"})),ll("div",{className:"findjob-grid"},ll(ty,{title:"NapCat 容器登录",eyebrow:"QR Login",className:"claudeqq-login-panel",loading:n.qrLoading,actions:ll("div",{className:"panel-actions inline-actions"},ll("button",{type:"button",className:"ghost-btn",onClick:()=>U(!0),disabled:n.qrLoading,"data-testid":"claudeqq-napcat-refresh"},n.qrLoading?"刷新中":"手动刷新二维码"),ll(t1,{title:"NapCat Login",data:n.napcatLogin,onOpen:u,testId:"raw-claudeqq-napcat-login"}))},ll("div",{className:"claudeqq-login-card","data-testid":"claudeqq-napcat-login"},ll("div",{className:"claudeqq-qr-frame"},v?ll("img",{src:H.dataUrl,alt:"NapCat QQ 登录二维码","data-testid":"claudeqq-napcat-qrcode"}):ll(i1,{title:"等待二维码",text:"NapCat 容器启动后会把登录二维码写入 cache/qrcode.png"})),ll("div",{className:"claudeqq-login-copy"},ll("div",{className:"node-version-line"},ll(j3,{status:D?"online":v?"warn":"unknown"},D?"已登录":v?"待扫码":"等待二维码"),ll("span",null,Y),ll("span",null,"D601 containerized")),ll("p",{className:"muted paragraph"},D?"NapCat 已登录,ClaudeQQ 可通过容器内 HTTP/WS 链路收发 QQ 消息。":"用手机 QQ 扫描二维码授权登录。二维码只在首次加载或手动刷新时更新,D601 的 NapCat 端口仍只绑定 127.0.0.1。"),ll("div",{className:"microservice-ref-card"},ll("span",null,"NapCat WebUI"),ll("strong",null,V.webui?.url||"http://napcat:6099/webui"),ll("code",null,"local-only / proxied QR login")),ll("div",{className:"microservice-ref-card"},ll("span",null,"QR Source"),ll("strong",null,H.modifiedAt?Ll(H.modifiedAt):n.qrcodeRefreshedAt?Ll(n.qrcodeRefreshedAt):"--"),ll("code",null,H.file||"/napcat/cache/qrcode.png"))))),ll(ty,{title:"消息推送",eyebrow:"Push API"},ll("div",{className:"microservice-ref-card"},ll("span",null,Xi.label),ll("strong",null,String(Xi.userId)),ll("code",null,"private userId / 默认推送测试目标")),ll("form",{className:"stack-form",onSubmit:w,"data-testid":"claudeqq-push-form"},ll("label",null,"目标类型",ll("select",{value:i.targetType,onChange:(K)=>y((X)=>({...X,targetType:K.target.value}))},ll("option",{value:"private"},"私聊 userId"),ll("option",{value:"group"},"群 groupId"))),ll("label",null,"QQ ID",ll("input",{value:i.targetId,onChange:(K)=>y((X)=>({...X,targetId:K.target.value})),placeholder:String(Xi.userId)})),ll("label",null,"消息内容",ll("textarea",{value:i.message,onChange:(K)=>y((X)=>({...X,message:K.target.value})),rows:4,placeholder:"通过 ClaudeQQ 推送一条 QQ 消息"})),ll("button",{type:"submit",className:"primary-btn"},"发送 QQ 消息")),ll("p",{className:"muted paragraph"},`主 server 和其他用户服务可通过 UniDesk 同源代理调用 /api/push/text;当前人工推送测试默认使用 ${Xi.label} ${Xi.userId},不需要暴露 D601 后端端口。`)),ll(ty,{title:"QQ 事件订阅",eyebrow:"Webhook Subscription",loading:n.loading},ll("form",{className:"stack-form",onSubmit:G,"data-testid":"claudeqq-subscription-form"},ll("label",null,"订阅名称",ll("input",{value:c.name,onChange:(K)=>_((X)=>({...X,name:K.target.value}))})),ll("label",null,"回调 URL",ll("input",{value:c.targetUrl,onChange:(K)=>_((X)=>({...X,targetUrl:K.target.value})),placeholder:"http://host.docker.internal:18080/..."})),ll("label",null,"事件类型",ll("input",{value:c.eventTypes,onChange:(K)=>_((X)=>({...X,eventTypes:K.target.value})),placeholder:"message,notice"})),ll("label",null,"签名密钥",ll("input",{value:c.secret,onChange:(K)=>_((X)=>({...X,secret:K.target.value})),placeholder:"可选,生成 x-claudeqq-signature"})),ll("button",{type:"submit",className:"primary-btn"},"创建订阅")),C.length===0?ll(i1,{title:"暂无订阅",text:"可以为 main server 或其他用户服务注册 HTTP webhook"}):ll("div",{className:"table-wrap","data-testid":"claudeqq-subscription-table"},ll("table",null,ll("thead",null,ll("tr",null,ll("th",null,"名称"),ll("th",null,"状态"),ll("th",null,"事件"),ll("th",null,"回调"),ll("th",null,"最近投递"),ll("th",null,"操作"))),ll("tbody",null,C.map((K)=>ll("tr",{key:K.id},ll("td",null,ll("strong",null,K.name||K.id),ll("code",null,K.id||"--")),ll("td",null,ll(j3,{status:K.enabled?"online":"warn"},K.enabled?"enabled":"disabled")),ll("td",null,Array.isArray(K.eventTypes)?K.eventTypes.join(", "):"message"),ll("td",null,K.targetUrl||"--"),ll("td",null,K.lastDelivery?`${K.lastDelivery.ok?"OK":"FAIL"} ${Ll(K.lastDelivery.at)}`:"--"),ll("td",null,ll("button",{type:"button",className:"ghost-btn",onClick:()=>J(K.id)},"删除"))))))),ll("div",{className:"panel-actions inline-actions"},ll(t1,{title:"ClaudeQQ Subscriptions",data:n.subscriptions,onOpen:u,testId:"raw-claudeqq-subscriptions"}))),ll(ty,{title:"最近 QQ 事件",eyebrow:n.refreshedAt?`Updated ${iu(n.refreshedAt)}`:"Event Stream",loading:n.loading},B.length===0?ll(i1,{title:"暂无事件",text:"等待 NapCat WebSocket 上报 QQ 消息事件,或通过订阅 API 消费后续事件"}):ll("div",{className:"table-wrap","data-testid":"claudeqq-event-list"},ll("table",null,ll("thead",null,ll("tr",null,ll("th",null,"时间"),ll("th",null,"类型"),ll("th",null,"会话"),ll("th",null,"消息"),ll("th",null,"ID"))),ll("tbody",null,B.map((K)=>ll("tr",{key:K.id},ll("td",null,Ll(K.receivedAt||K.timestamp)),ll("td",null,ll(j3,{status:K.postType||K.eventType},K.postType||K.eventType||"--")),ll("td",null,BU(K)),ll("td",null,HU(K)),ll("td",null,ll("code",null,K.messageId||K.id||"--"))))))),ll("div",{className:"panel-actions inline-actions"},ll(t1,{title:"ClaudeQQ Events",data:n.events,onOpen:u,testId:"raw-claudeqq-events"}))),ll(ty,{title:"已发送消息",eyebrow:`${E.length} Sent`,loading:n.loading},E.length===0?ll(i1,{title:"暂无发送记录",text:"发送日志来自 ClaudeQQ bot_workspace/messages/sent_messages.jsonl"}):ll("div",{className:"table-wrap"},ll("table",null,ll("thead",null,ll("tr",null,ll("th",null,"时间"),ll("th",null,"目标"),ll("th",null,"消息"),ll("th",null,"结果"))),ll("tbody",null,E.map((K,X)=>ll("tr",{key:K.id||X},ll("td",null,Ll(K.timestamp||K.sentAt||K.createdAt)),ll("td",null,BU(K)),ll("td",null,HU(K)),ll("td",null,K.status||K.messageId||K.message_id||"--")))))),ll("div",{className:"panel-actions inline-actions"},ll(t1,{title:"ClaudeQQ Sent Messages",data:n.sent,onOpen:u,testId:"raw-claudeqq-sent"})))))}var w1=Ml(Ju(),1);var YU=Ml(Ju(),1),qu=YU.default.createElement;function c1({markdown:l,className:u,testId:r}){let f=String(l??"").trimEnd(),n=["markdown-body",u].filter(Boolean).join(" ");return qu("div",{className:n,"data-testid":r},XU(f,"md"))}function XU(l,u){let r=yp(l).split(` -`),f=[],n=0;while(n\s?/u.test(t)){let F=[];while(n\s?(.*)$/u);if(N!==null){F.push(N[1]),n+=1;continue}if(j.trim().length===0){F.push(""),n+=1;continue}break}f.push(qu("blockquote",{key:`${u}-quote-${n}`},XU(F.join(` -`),`${u}-quote-${n}`)));continue}if(CU(r,n)){let F=n,j=y1(r[n]??""),N=y1(r[n+1]??"");n+=2;let U=[];while(n0)U.push(y1(r[n]??"")),n+=1;f.push(Fp(j,N,U,`${u}-table-${F}`));continue}let c=U3(t);if(c!==null){let F=n,j=c.ordered,N=c.start,U=[];while(n_p(G,`${u}-list-${F}-${J}`))));continue}let _=n,A=[];while(n0&&!$p(r,n))A.push(r[n].trim()),n+=1;if(A.length===0)A.push(t.trim()),n+=1;f.push(qu("p",{key:`${u}-p-${_}`},qn(A.join(` -`),`${u}-p-${_}`)))}return f}function yp(l){return String(l||"").replace(/\r\n/gu,` +(()=>{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,` `).replace(/\r/gu,` -`).trimEnd()}function PU(l){let u=l.match(/^\s*(```+|~~~+)\s*([A-Za-z0-9_-]+)?\s*$/u);if(u===null)return null;let r=u[1];return{marker:r.startsWith("`")?"`":"~",length:r.length,language:u[2]||""}}function cp(l,u){let r=l.trim();return r.length>=u.length&&r.split("").every((f)=>f===u.marker)}function L2(l){return/^(?: {4}|\t)/u.test(l)}function VU(l,u,r){let f=u.trim().length>0?`language-${Np(u)}`:void 0;return qu("pre",{key:r,className:"markdown-code-block"},qu("code",{className:f},l))}function $p(l,u){let r=l[u]??"";if(r.trim().length===0)return!0;return PU(r)!==null||L2(r)||/^(#{1,6})\s+.+$/u.test(r)||/^\s*(?:---+|\*\*\*+|___+)\s*$/u.test(r)||/^\s*>\s?/u.test(r)||CU(l,u)||U3(r)!==null}function U3(l){let u=l.match(/^\s{0,3}[-*+]\s+(.+)$/u);if(u!==null)return{ordered:!1,text:u[1]};let r=l.match(/^\s{0,3}(\d+)[.)]\s+(.+)$/u);if(r!==null)return{ordered:!0,start:Number(r[1]),text:r[2]};return null}function _p(l,u){let r=l.match(/^\[([ xX])\]\s+(.+)$/u);if(r!==null){let f=r[1].toLowerCase()==="x";return qu("li",{key:u,className:"task-list-item"},qu("input",{type:"checkbox",checked:f,readOnly:!0,tabIndex:-1}),qu("span",null,qn(r[2],`${u}-task`)))}return qu("li",{key:u},qn(l,u))}function CU(l,u){let r=l[u]??"",f=l[u+1]??"";if(!r.includes("|")||!f.includes("|"))return!1;let n=y1(r),t=y1(f);return n.length>1&&t.length===n.length&&t.every((i)=>/^:?-{3,}:?$/u.test(i.trim()))}function y1(l){let u=l.trim();if(u.startsWith("|"))u=u.slice(1);if(u.endsWith("|"))u=u.slice(0,-1);return u.split("|").map((r)=>r.trim())}function Ap(l){let u=l.trim();if(u.startsWith(":")&&u.endsWith(":"))return"center";if(u.endsWith(":"))return"right";if(u.startsWith(":"))return"left";return}function Fp(l,u,r,f){let n=u.map(Ap);return qu("div",{key:f,className:"markdown-table-wrap"},qu("table",null,qu("thead",null,qu("tr",null,l.map((t,i)=>qu("th",{key:`${f}-h-${i}`,style:n[i]?{textAlign:n[i]}:void 0},qn(t,`${f}-h-${i}`))))),qu("tbody",null,r.map((t,i)=>qu("tr",{key:`${f}-r-${i}`},l.map((y,c)=>qu("td",{key:`${f}-r-${i}-${c}`,style:n[c]?{textAlign:n[c]}:void 0},qn(t[c]||"",`${f}-r-${i}-${c}`))))))))}function qn(l,u,r={}){let f=[],n=/`([^`\n]+)`|\[([^\]\n]+)\]\(([^)\s]+)(?:\s+"[^"]*")?\)|(https?:\/\/[^\s<>)]+)|\*\*([^*\n]+)\*\*|__([^_\n]+)__|~~([^~\n]+)~~|\*([^*\n]+)\*|_([^_\n]+)_/gu,t=r.linkify!==!1,i=0,y=0;for(let c of l.matchAll(n)){let _=c[0],A=c.index??0;J3(f,l.slice(i,A),`${u}-text-${y}`),i=A+_.length;let F=`${u}-inline-${y}`;if(y+=1,c[1]!==void 0){f.push(qu("code",{key:F},c[1]));continue}if(c[2]!==void 0&&c[3]!==void 0){if(!t){J3(f,_,`${F}-literal`);continue}f.push(SU(c[2],c[3],F));continue}if(c[4]!==void 0){if(!t){J3(f,_,`${F}-literal`);continue}f.push(SU(c[4],c[4],F));continue}let j=c[5]??c[6];if(j!==void 0){f.push(qu("strong",{key:F},qn(j,`${F}-strong`)));continue}if(c[7]!==void 0){f.push(qu("del",{key:F},qn(c[7],`${F}-del`)));continue}let N=c[8]??c[9];if(N!==void 0)f.push(qu("em",{key:F},qn(N,`${F}-em`)))}return J3(f,l.slice(i),`${u}-text-tail`),f}function J3(l,u,r){if(u.length===0)return;u.split(` -`).forEach((n,t)=>{if(t>0)l.push(qu("br",{key:`${r}-br-${t}`}));if(n.length>0)l.push(n)})}function SU(l,u,r){let f=jp(u);if(f===null)return qu("span",{key:r},l);let n=/^(?:https?:|mailto:)/iu.test(f);return qu("a",{key:r,href:f,target:n?"_blank":void 0,rel:n?"noreferrer":void 0},qn(l,`${r}-label`,{linkify:!1}))}function jp(l){let u=String(l||"").trim();if(/^(?:https?:|mailto:)/iu.test(u))return u;if(u.startsWith("/")&&!u.startsWith("//"))return u;if(u.startsWith("#"))return u;return null}function Np(l){return String(l||"").toLowerCase().replace(/[^a-z0-9_-]+/gu,"-").replace(/^-+|-+$/gu,"")||"text"}var p2=Ml(Ju(),1);var Pl=p2.default.createElement,{useEffect:Jp,useRef:hU}=p2.default;function Up(l,u){return rQ(l.toTrace(u))}function Qp(l){let u=Number(l);if(!Number.isFinite(u)||u<0)return"--";let r=Math.floor(u/1000),f=Math.floor(r/3600),n=Math.floor(r%3600/60),t=r%60;if(f>0)return`${f}h ${String(n).padStart(2,"0")}m`;if(n>0)return`${n}m ${String(t).padStart(2,"0")}s`;return`${t}s`}function of(l){let u=Number(l);return Number.isFinite(u)&&u>=0?u:null}function yy(l,u=180){let r=String(l||"").replace(/\s+/gu," ").trim();return r.length>u?`${r.slice(0,u-1)}…`:r}function mp(l){if(!l)return 0;return l.split(/\r?\n/u).length}function T2(l){return{ran:"Ran",explored:"Explored",edited:"Edited",toolGroup:"Tool calls",plan:"Plan",message:"Message",system:"System",error:"Error"}[l]||"Message"}function K2(l){let u=Number(l||0);return Number.isFinite(u)&&u>0?`… +${Math.floor(u)} lines`:""}function wp(l){return(Array.isArray(l)?l:[]).reduce((u,r)=>Math.max(u,Number(r?.seq??0)),0)}function MU(l){return["explored","edited","ran"].includes(String(l?.kind||""))}function IU(l){let u={read:0,edit:0,run:0};for(let r of l){let f=String(r?.kind||"");if(f==="explored")u.read+=1;else if(f==="edited")u.edit+=1;else if(f==="ran")u.run+=1}return u}function aU(l){let u=IU(l);return`${u.read} read, ${u.edit} edit, ${u.run} run`}function oU(l){return l.replace(/^['"`([{<]+/u,"").replace(/['"`)\]}>.,;:]+$/u,"").replace(/:\d+(?::\d+)?$/u,"").trim()}function sU(l){let r=String(l||"").match(/(?:~|\.{1,2}|\/)?(?:[A-Za-z0-9_.@+-]+\/)+[A-Za-z0-9_.@+-]+|[A-Za-z0-9_.@+-]+\.(?:c|cc|cpp|h|hpp|js|jsx|ts|tsx|json|md|py|sh|toml|ya?ml|txt|log|lock)/gu)||[],f=[];for(let n of r){let t=oU(n);if(t.length<2||t.includes("..."))continue;if(/^(http|https|status|method)$/iu.test(t))continue;if(!f.includes(t))f.push(t)}return f}function G2(l,u=4){if(l.length===0)return"--";let r=l.slice(0,u).join(", ");return l.length>u?`${r} +${l.length-u}`:r}function RU(l){let u="";for(let r of l){if(r.length===0)continue;if(u.length>0&&!u.endsWith(` -`)&&!r.startsWith(` -`))u+=` -`;u+=r}return u}function dU(l){let u=String(l||"").replace(/\r\n/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(` +`)&&!f.startsWith(` +`))l+=` +`;l+=f}return l}function wq(u){let l=String(u||"").replace(/\r\n/gu,` `).replace(/\r/gu,` -`).trimEnd();return u.length>0?u.split(` -`):[]}function E2(l){let u=String(l.status||"").trim();if(u.length>0)return u;let r=String(l.bodyPreview||"");return/^(item\/[A-Za-z]+(?:\/[A-Za-z]+)?):/u.exec(r)?.[1]||"item/fileChange"}function qp(l){let u=String(l.bodyPreview||"");return/file changes status=([A-Za-z0-9_-]+)/u.exec(u)?.[1]}function Lp(l){return/^item\/(?:started|completed): file changes status=/u.test(String(l||"").trim())}function eU(l){if(String(l.kind||"")!=="edited")return!1;let u=String(l.status||""),r=String(l.title||""),f=String(l.bodyPreview||""),n=String(l.commandPreview||"");if(r==="Edited files")return!0;if(/^item\/fileChange\//u.test(u))return!0;if((u==="item/started"||u==="item/completed")&&/file changes status=/u.test(f))return!0;if(/^Success\. Updated the following files:/mu.test(f))return!0;if(/^diff --git /mu.test(f))return!0;return/^([AMDRCU?]{1,2})\s+\S+/mu.test(f)||n.length>0&&m3(f).length>0}function iy(l){return oU(String(l||"").replace(/^[ab]\//u,"").trim())}function z2(l){let u=/^([AMDRCU?]{1,2})\s+(.+)$/u.exec(l);if(!u)return null;let r=iy(u[2]||"");return r.length>0?{status:u[1]||"M",path:r}:null}function O2(l){let u=/^\*\*\*\s+(Add|Update|Delete)\s+File:\s+(.+)$/u.exec(l);if(u){let f=u[1]==="Add"?"A":u[1]==="Delete"?"D":"M",n=iy(u[2]||"");return n.length>0?{status:f,path:n}:null}let r=/^\*\*\*\s+Move to:\s+(.+)$/u.exec(l);if(r){let f=iy(r[1]||"");return f.length>0?{status:"R",path:f}:null}return null}function m3(l){let u=[],r=(n,t)=>{let i=iy(t);if(i.length===0||i==="/dev/null")return;let y=u.find((c)=>c.path===i);if(y){if(y.status==="M"&&n!=="M")y.status=n;return}u.push({status:n,path:i})},f="";for(let n of dU(l)){let t=z2(n)||O2(n);if(t!==null){r(t.status,t.path),f=t.path;continue}let i=/^diff --git a\/(.+?) b\/(.+)$/u.exec(n);if(i){let F=i[2]||i[1]||"";r("M",F),f=iy(F);continue}let y=/^\+\+\+ b\/(.+)$/u.exec(n);if(y&&y[1]!=="/dev/null"){r("M",y[1]||""),f=iy(y[1]||"");continue}if(/^new file mode /u.exec(n)&&f)r("A",f);if(/^deleted file mode /u.exec(n)&&f)r("D",f);let A=/^rename to (.+)$/u.exec(n);if(A)r("R",A[1]||"")}return u}function Gp(l){if(z2(l)!==null||O2(l)!==null)return"file";if(/^(diff --git |index |--- |\+\+\+ |\*\*\* Begin Patch|\*\*\* End Patch)/u.test(l))return"meta";if(/^@@ /u.test(l))return"hunk";if(/^\+/u.test(l))return"add";if(/^-/u.test(l))return"del";if(/^(Success\.|No changes|Updated\b|Created\b|Deleted\b|Added\s+\d+\s+lines?|Wrote\s+\d+\s+lines?|Read\s+\d+\s+files?|\.\.\.\[patch content truncated)/iu.test(l))return"note";return"context"}function Z2(l){return dU(l).map((u)=>{let r=z2(u)||O2(u);if(r!==null)return{text:u,kind:"file",path:r.path,status:r.status};return{text:u,kind:Gp(u)}})}function Wp(l){return l.reduce((u,r)=>{if(r.kind==="add")u.added+=1;else if(r.kind==="del")u.removed+=1;return u},{added:0,removed:0})}function xU(l,u){return`${u} ${l} line${l===1?"":"s"}`}function Tp(l,u){let r=[];if(l>0)r.push(xU(l,"Added"));if(u>0)r.push(xU(u,"removed"));return r.join(", ")}function Kp(l){for(let r=l.length-1;r>=0;r-=1){let f=String(l[r]?.status||"").trim();if(f.length>0)return f}let u=String(l[l.length-1]?.method||"").trim();if(u==="item/fileChange/outputDelta")return"updated";if(u==="item/started")return"started";if(u==="item/completed")return"completed";return u.replace(/^item\//u,"")||"changed"}function Ep(l){return`${l} file${l===1?"":"s"}`}function lQ(l){let u=l.length>0?l:[],r=RU(u.map((j)=>String(j.bodyPreview||""))),n=RU(u.map((j)=>String(j.bodyPreview||"")).filter((j)=>j.trim().length>0&&!Lp(j)))||r,t=m3(n||r),i=u.map((j)=>({method:E2(j),status:qp(j),at:j.at})),y=Z2(n||r),c=Wp(y),_=Tp(c.added,c.removed),A=t.length>0?Ep(t.length):"",F=_.length>0?`${_}${A?` in ${A}`:""}`:t.length>0?A:yy(n||r||"File changes",72);return{status:Kp(i),summary:F,files:t,stages:i,lines:y,addedLines:c.added,removedLines:c.removed,rawText:r}}function pp(l){let u=l[0],r=l[l.length-1]||u,f=lQ(l);return{...u,seq:Number.isFinite(Number(r?.seq))?Number(r?.seq):Number(u?.seq??0),at:r?.at||u?.at,title:f.files.length>0?`Edited ${f.summary}`:"Edited files",status:f.status,commandPreview:"",commandOmittedLines:void 0,bodyPreview:f.rawText,bodyOmittedLines:l.reduce((n,t)=>n+Number(t.bodyOmittedLines||0),0)||void 0,rawSeqs:l.flatMap((n)=>Array.isArray(n?.rawSeqs)?n.rawSeqs:[n?.seq]).filter((n)=>n!==void 0),editObservation:f}}function zp(l){let u=Array.isArray(l)?l:[],r=[],f=[],n=()=>{if(f.length===0)return;r.push(pp(f)),f=[]};for(let t of u){if(eU(t)){if(E2(t)==="item/started"&&f.length>0)n();if(f.push(t),E2(t)==="item/completed")n();continue}n(),r.push(t)}return n(),r}function uQ(l){let u=[],r=[],f=[],n=(_,A)=>{for(let F of A)if(!_.includes(F))_.push(F)};for(let _ of l){let A=String(_?.kind||""),F=[_?.commandPreview,_?.bodyPreview,_?.title].map((j)=>String(j||"")).join(` -`);if(A==="explored")n(u,sU(F));else if(A==="edited")n(r,sU(F));else if(A==="ran"){let j=String(_?.commandPreview||_?.title||"").trim();if(j.length>0&&!f.includes(j))f.push(yy(j,90))}}let t=l.map((_)=>Date.parse(String(_?.at||""))).filter((_)=>Number.isFinite(_)),i=t.length>=2?Math.max(0,Math.max(...t)-Math.min(...t)):0,y=l.reduce((_,A)=>_+(of(A?.durationMs)??of(A?.elapsedMs)??0),0),c=i>0?i:y;return{readFiles:u,editedFiles:r,runCommands:f,durationLabel:Qp(c)}}function Op(l,u=3){let r=Array.isArray(l)?l:[],f=[],n=[],t=Math.max(0,u),i=new Set;for(let c=r.length-1;c>=0&&t>0;c-=1){let _=r[c];if(!MU(_))continue;i.add(_),t-=1}let y=()=>{if(n.length>=2){let c=IU(n);f.push({seq:Number(n[0]?.seq??0),at:n[0]?.at||n.at(-1)?.at,kind:"toolGroup",title:aU(n),status:`${n.length} calls`,items:n,counts:c,digest:uQ(n),rawSeqs:n.flatMap((_)=>Array.isArray(_?.rawSeqs)?_.rawSeqs:[_?.seq]).filter((_)=>_!==void 0)})}else f.push(...n);n=[]};for(let c of r){if(MU(c)&&!i.has(c)){n.push(c);continue}y(),f.push(c)}return y(),f}function rQ(l){return(Array.isArray(l)?l:[]).map((u,r)=>({...u,seq:Number.isFinite(Number(u?.seq))?Number(u.seq):r+1,kind:String(u?.kind||"message"),at:u?.at===void 0?void 0:String(u.at),durationMs:of(u?.durationMs)??void 0,title:u?.title===void 0?void 0:String(u.title),status:u?.status===void 0?void 0:String(u.status)}))}function $1(l){let u=of(l?.state?.time?.start)??of(l?.time?.start),r=of(l?.state?.time?.end)??of(l?.time?.end);return of(l?.durationMs)??of(l?.elapsedMs)??of(l?.timing?.durationMs)??of(l?.metadata?.durationMs)??(u!==null&&r!==null&&r>=u?r-u:null)??void 0}function _1(l,u){return l?.createdAt||l?.updatedAt||l?.completedAt||u||void 0}function W2(l,u){return l?.id||l?.messageId||u}function Zp(l,u=1200){if(typeof l==="string")return l;if(l===void 0||l===null)return"";try{return yy(JSON.stringify(l),u)}catch{return yy(String(l),u)}}function fQ(l,u,r){if(typeof l?.metadata?.diff==="string"&&l.metadata.diff.length>0)return l.metadata.diff;if(typeof l?.metadata?.filediff?.patch==="string"&&l.metadata.filediff.patch.length>0)return l.metadata.filediff.patch;if(typeof l?.output==="string"&&l.output.length>0)return l.output;if(typeof l?.result==="string"&&l.result.length>0)return l.result;if(typeof u?.output==="string"&&u.output.length>0)return u.output;if(typeof r?.output==="string"&&r.output.length>0)return r.output;if(typeof l?.metadata?.output==="string"&&l.metadata.output.length>0)return l.metadata.output;return""}function Q3(l,u){if(!l||typeof l!=="object"||Array.isArray(l))return"";for(let r of u){let f=l[r];if(typeof f==="string"&&f.length>0)return f;if(f!==void 0&&f!==null&&typeof f!=="object")return String(f)}return""}function bU(l,u){if(!l||typeof l!=="object"||Array.isArray(l))return null;for(let r of u){let f=Number(l[r]);if(Number.isFinite(f))return f}return null}function nQ(l,u){let r=u?.input&&typeof u.input==="object"&&!Array.isArray(u.input)?u.input:l?.input&&typeof l.input==="object"&&!Array.isArray(l.input)?l.input:{},f=Q3(r,["command","cmd","script"]);if(f.length>0)return f;if(typeof l?.command==="string"&&l.command.length>0)return l.command;if(typeof u?.command==="string"&&u.command.length>0)return u.command;let n=String(l?.tool||l?.title||"tool"),t=Q3(r,["filePath","filepath","path"])||Q3(l,["filePath","filepath","path"]),i=Q3(r,["pattern","query"]),y=bU(r,["offset"]),c=bU(r,["limit"]),_=[n];if(i.length>0)_.push(i);if(t.length>0)_.push(t);if(y!==null)_.push(`offset=${y}`);if(c!==null)_.push(`limit=${c}`);return _.length>1?_.join(" "):n}function Hp(l,u){let r=l?.part&&typeof l.part==="object"&&!Array.isArray(l.part)?l.part:{},f=String(l?.type||l?.event||l?.name||r?.type||"").toLowerCase(),n=String(r?.type||"").toLowerCase(),t=l?.at||l?.timestamp||r?.updatedAt||r?.createdAt,i=Number.isFinite(Number(l?.seq))?Number(l.seq):u;if(f==="step_start"||f==="step-start"||n==="step-start")return null;if(f==="step_finish"||f==="step-finish"||n==="step-finish")return null;if(n==="tool"||/tool|bash|command/iu.test(`${f} ${n}`)){let c=r?.state&&typeof r.state==="object"&&!Array.isArray(r.state)?r.state:{},_=nQ(r,c),A=fQ(c,r,l),F=tQ(_,String(r?.tool||r?.title||"")),j=F==="edited"?{status:String(c?.status||r?.status||l?.status||""),summary:yy(A||_,72),files:m3(A),stages:[],lines:Z2(A),addedLines:0,removedLines:0,rawText:A}:void 0;return{seq:i,at:_1(r,t),kind:F,title:String(c?.title||r?.title||c?.metadata?.description||r?.tool||"OpenCode tool"),status:String(c?.status||r?.status||l?.status||""),commandPreview:_,bodyPreview:A,durationMs:$1(r),rawSeqs:[r?.id||r?.callID||l?.sessionID||i],editObservation:j}}let y=Zp(r?.text??r?.content??r?.delta??l?.text??l?.content??l?.delta,3000).trim();if(y.length>0)return{seq:i,at:_1(r,t),kind:n==="reasoning"?"message":/error|failed/iu.test(`${f} ${n}`)?"error":"message",title:n==="reasoning"?"Reasoning":/error|failed/iu.test(`${f} ${n}`)?"OpenCode error":"Assistant message",status:`opencode/${f||n||"event"}`,bodyPreview:y,durationMs:$1(r),rawSeqs:[r?.id||l?.sessionID||i]};return null}function tQ(l,u){let r=`${u} ${l}`.toLowerCase();if(/\b(read|grep|glob|list|ls|find|search|view|cat|sed|rg|head|tail|wc|file)\b/iu.test(r))return"explored";if(/\b(edit|write|patch|apply|update|create|delete|apply_patch|git apply|cat >|tee .*<<|sed -i|python3? .*write_text|mkdir|rm |touch )\b/iu.test(r))return"edited";return"ran"}function Bp(l){let u=[],r=1;for(let f of Array.isArray(l)?l:[]){if(f?.kind&&f?.title){let y=String(f?.status||"");if(y==="opencode/step-start"||y==="opencode/step-finish")continue;u.push({...f,seq:Number.isFinite(Number(f?.seq))?Number(f.seq):r++});continue}let n=f?.createdAt||f?.updatedAt||f?.completedAt,t=String(f?.role||"assistant").toLowerCase(),i=Array.isArray(f?.parts)?f.parts:[];if(i.length===0){if(f?.part&&(f?.sessionID||String(f?.type||"").startsWith("step_")||String(f?.type||"").includes("tool"))){let y=Hp(f,r);if(y!==null)u.push(y),r=Math.max(r+1,Number(y.seq)+1)}else if(f?.textPreview)u.push({seq:r++,at:n,kind:"message",title:`${t||"assistant"} message`,status:t,bodyPreview:String(f.textPreview),rawSeqs:[f?.messageId||r]});continue}for(let y of i){let c=String(y?.type||"").toLowerCase();if(c==="step-start"||c==="step-finish")continue;if(c==="text"||c==="reasoning"){let A=String(y?.textPreview||f?.textPreview||"").trim();if(A.length===0)continue;u.push({seq:r++,at:_1(y,n),kind:"message",title:c==="reasoning"?"Reasoning":t==="user"?"User message":t==="system"?"System message":"Assistant message",status:c==="reasoning"?"reasoning":t,bodyPreview:A,durationMs:$1(y),rawSeqs:[W2(y,r)]});continue}if(c==="tool"){let A=y?.state&&typeof y.state==="object"&&!Array.isArray(y.state)?y.state:{},F=nQ(y,A),j=fQ(A,y,{}),N=tQ(F,String(y?.tool||y?.title||"")),U=N==="edited"?{status:String(A?.status||y?.status||""),summary:yy(j||F,72),files:m3(j),stages:[],lines:Z2(j),addedLines:0,removedLines:0,rawText:j}:void 0;u.push({seq:r++,at:_1(y,n),kind:N,title:String(y?.title||y?.tool||"tool"),status:String(y?.status||""),commandPreview:F,bodyPreview:j,durationMs:$1(y),rawSeqs:[W2(y,r)],editObservation:U});continue}let _=String(y?.textPreview||y?.title||c||"").trim();if(_)u.push({seq:r++,at:_1(y,n),kind:"system",title:c||"part",bodyPreview:_,status:String(y?.status||""),durationMs:$1(y),rawSeqs:[W2(y,r)]})}}return u}var iQ={source:"opencode",toTrace:Bp};function Dp(l){return String(l||"unknown").toLowerCase().replace(/[^a-z0-9_-]+/gu,"-")||"unknown"}function vU(l){let u=String(l||"M").toUpperCase();if(u.startsWith("A")||u==="??")return"added";if(u.startsWith("D"))return"deleted";if(u.startsWith("R"))return"renamed";return"modified"}function Vp(l){if(l==="item/fileChange/outputDelta")return"delta";return l.replace(/^item\//u,"")}function Sp(l,u){if(l.kind==="file"){let n=String(l.status||"M");return Pl("div",{key:`${u}-${l.text}`,className:`codex-edit-diff-line file ${vU(n)}`},Pl("span",{className:`codex-edit-file-status ${vU(n)}`},n),Pl("code",null,l.path||l.text.replace(/^([AMDRCU?]{1,2})\s+/u,"")))}let r=l.kind==="add"||l.kind==="del"?l.text.slice(0,1):l.kind==="hunk"?"@@":l.kind==="note"?"ok":"",f=l.kind==="add"||l.kind==="del"?l.text.slice(1):l.text;return Pl("div",{key:`${u}-${l.text}`,className:`codex-edit-diff-line ${l.kind}`},Pl("span",{className:"codex-edit-diff-sign"},r),Pl("code",null,f||" "))}function Yp(l,u){let r=l.lines.length>0?l.lines:l.files.map((n)=>({text:`${n.status} ${n.path}`,kind:"file",path:n.path,status:n.status})),f=Number(l.addedLines||0)+Number(l.removedLines||0)>0;return Pl("div",{className:"codex-edit-observation","data-testid":"codex-edit-observation"},Pl("div",{className:"codex-edit-observation-head"},Pl("span",{className:"codex-edit-window-controls","aria-hidden":"true"},Pl("i",null),Pl("i",null),Pl("i",null)),Pl("strong",null,f?"git diff":"git diff --stat"),Pl("code",null,l.summary||"File changes")),l.stages.length>0?Pl("div",{className:"codex-edit-stage-strip"},l.stages.map((n,t)=>Pl("span",{key:`${n.method}-${t}`,className:`codex-edit-stage ${Dp(n.status||n.method)}`},Pl("b",null,Vp(n.method)),n.status?Pl("em",null,n.status):null))):null,r.length>0?Pl("div",{className:"codex-edit-diff",role:"list"},r.map(Sp)):null,u?Pl("div",{className:"codex-edit-omitted"},`${u} (查看原始JSON获取完整记录)`):null)}function gU(l,u,r){let f=K2(r);return Pl("div",{className:`codex-transcript-stream ${l}`,"data-testid":`codex-trace-${l}`},Pl("span",{className:"codex-transcript-stream-label"},l),Pl("pre",{className:"codex-transcript-body"},u,f?` -${f} (查看原始JSON获取完整记录)`:""))}function yQ(l,u=!1){let r=String(l.kind||"message"),f=["ran","explored","edited"].includes(r),n=K2(l.commandOmittedLines),t=K2(l.bodyOmittedLines),i=String(l.commandPreview||(f?l.title||"":"")),y=String(l.stdoutPreview||""),c=String(l.stderrPreview||""),_=y.length>0||c.length>0,A=Boolean(l.foldedReferencePrompt)&&String(l.fullPrompt||"").length>0,F=r==="edited"&&(l.editObservation!==void 0||eU(l))?l.editObservation||lQ([l]):null;return Pl("article",{key:`${l.seq}-${r}`,className:`codex-transcript-item ${r} ${u?"nested":""}`},Pl("div",{className:"codex-transcript-main"},Pl("div",{className:"codex-transcript-title"},Pl("span",{className:"codex-output-channel"},T2(r)),f&&F===null?null:Pl("strong",null,F!==null?"File changes":String(l.title||T2(r))),l.status?Pl("code",null,String(F?.status||l.status)):null,Pl("time",null,Ll(l.at))),i&&F===null?Pl("pre",{className:"codex-transcript-command"},i,n?` -${n}`:""):null,F!==null?Yp(F,t):_?Pl("div",{className:"codex-transcript-streams"},y.length>0?gU("stdout",y,l.stdoutOmittedLines):null,c.length>0?gU("stderr",c,l.stderrOmittedLines):null):l.bodyPreview?Pl("pre",{className:"codex-transcript-body"},String(l.bodyPreview),t?` -${t} (查看原始JSON获取完整记录)`:""):null,A?Pl("details",{className:"codex-initial-prompt-full","data-testid":"codex-initial-prompt-full"},Pl("summary",null,Pl("span",null,"引用注入已折叠,点击查看最终传入 Codex 的完整 prompt"),Pl("code",null,`${l.fullPromptLines||mp(String(l.fullPrompt||""))} lines / ${l.fullPromptChars||String(l.fullPrompt||"").length} chars`)),Pl("pre",{className:"codex-transcript-body codex-transcript-full-prompt","data-testid":"codex-initial-prompt-full-text"},String(l.fullPrompt||""))):null))}function Xp(l){let u=Array.isArray(l.items)?l.items:[],r=l.digest&&typeof l.digest==="object"?l.digest:uQ(u);return Pl("article",{key:`${l.seq}-toolGroup`,className:"codex-transcript-item toolGroup"},Pl("div",{className:"codex-transcript-main"},Pl("details",{className:"codex-tool-group","data-testid":"codex-tool-group"},Pl("summary",null,Pl("div",{className:"codex-tool-group-head"},Pl("span",{className:"codex-output-channel"},T2("toolGroup")),Pl("strong",null,String(l.title||aU(u))),Pl("code",null,String(l.status||`${u.length} calls`)),Pl("time",null,Ll(l.at)))),Pl("div",{className:"codex-tool-group-digest"},Pl("span",null,`read: ${G2(Array.isArray(r.readFiles)?r.readFiles:[])}`),Pl("span",null,`edit: ${G2(Array.isArray(r.editedFiles)?r.editedFiles:[])}`),Pl("span",null,`run: ${G2(Array.isArray(r.runCommands)?r.runCommands:[],2)}`),Pl("span",null,`duration: ${r.durationLabel||"--"}`)),Pl("div",{className:"codex-tool-group-items"},u.map((f)=>yQ(f,!0))))))}function Pp(l){let u=[l.title,l.status,l.bodyPreview,l.commandPreview,l.stderrPreview,l.stdoutPreview].map((r)=>String(r||"")).join(` -`);return/\b(error|failed|failure|interrupt|interrupted|cancell?ed|watchdog|timeout|closed|refused|aborted|exception)\b/iu.test(u)}function cQ(l,u){if(u)return l;return l.flatMap((r)=>{if(String(r.kind||"")==="system"&&!Pp(r))return[];if(String(r.kind||"")!=="toolGroup"||!Array.isArray(r.items))return[r];let f=cQ(r.items,u);return[{...r,items:f}]})}var Cp=16;function kU(l){return l.scrollHeight-l.scrollTop-l.clientHeight<=Cp}function w3({items:l,input:u,port:r,autoScroll:f=!1,loading:n=!1,hasDetail:t=!0,emptyText:i="等待 Trace 输出...",loadingText:y="正在加载完整 Trace...",testId:c="trace-output",className:_="codex-transcript",keepRecentToolCalls:A=3,collapseTools:F=!0,showSystemEvents:j=!1}){let N=hU(null),U=hU(!0),w=cQ(zp(r?Up(r,u):rQ(l)),Boolean(j)),G=F?Op(w,A):w,J=wp(w);Jp(()=>{let q=N.current;if(!f||!q)return;if(!U.current&&!kU(q))return;q.scrollTop=q.scrollHeight,U.current=!0},[f,w.length,J]);let m={className:_,ref:N,onScroll:(q)=>{let W=q.currentTarget;U.current=kU(W)},"data-testid":c};if(n&&!t)return Pl("div",m,Pl("div",{className:"codex-output-empty"},y));return Pl("div",m,G.length===0?Pl("div",{className:"codex-output-empty"},i):G.map((q)=>String(q.kind||"")==="toolGroup"?Xp(q):yQ(q)))}var $Q=Ml(Ju(),1),Pi=$Q.default.createElement;function q3(...l){return l.filter(Boolean).join(" ")}function _Q({title:l,children:u,actions:r,onClose:f,className:n,backdropClassName:t,bodyClassName:i,actionsClassName:y,titleId:c,testId:_,closeTestId:A,closeLabel:F="关闭",disableClose:j=!1,closeOnBackdrop:N=!0}){let U={className:q3("raw-dialog","unidesk-dialog",n),role:"dialog","aria-modal":"true"};if(c)U["aria-labelledby"]=c;else if(typeof l==="string")U["aria-label"]=l;if(_)U["data-testid"]=_;return Pi("div",{className:q3("modal-backdrop","unidesk-dialog-backdrop",t),role:"presentation",onClick:(w)=>{if(N&&!j&&w.target===w.currentTarget)f()}},Pi("section",U,Pi("div",{className:"raw-dialog-head unidesk-dialog-head"},Pi("strong",c?{id:c}:null,l),Pi("button",{type:"button",className:"ghost-btn",onClick:f,disabled:j,"data-testid":A},F)),Pi("div",{className:q3("unidesk-dialog-body",i)},u),r?Pi("div",{className:q3("unidesk-dialog-actions",y)},r):null))}var L=w1.default.createElement,{useEffect:df,useMemo:AQ,useRef:xu}=w1.default,kl=w1.default.useState,hp=120,OQ=12,ZQ=48,Mp=1200;function H2(){return typeof document>"u"||document.visibilityState!=="hidden"}function Hu(l,u="操作失败"){return zl(l,u)}function ln(l){let u=Number(l);if(!Number.isFinite(u)||u<0)return"--";let r=Math.floor(u/1000),f=Math.floor(r/3600),n=Math.floor(r%3600/60),t=r%60;if(f>0)return`${f}h ${String(n).padStart(2,"0")}m`;if(n>0)return`${n}m ${String(t).padStart(2,"0")}s`;return`${t}s`}function en(l){if(l===null||l===void 0||l==="")return null;let u=l instanceof Date?l.getTime():new Date(l).getTime();return Number.isFinite(u)?u:null}function J1(l,u=Date.now()){let r=en(l);if(r===null)return"--";let f=Math.max(0,Math.floor((u-r)/1000));if(f<1)return"刚刚";let n=Math.floor(f/86400),t=Math.floor(f%86400/3600),i=Math.floor(f%3600/60),y=f%60;if(n>0)return`${n}天${t>0?`${t}小时`:""}前`;if(t>0)return`${t}小时${i>0?`${i}分钟`:""}前`;if(i>0)return`${i}分钟${y}秒前`;return`${y}秒前`}function b2(...l){let u="",r=-1/0;for(let f of l){let n=String(f||"");if(n.length===0)continue;let t=en(f);if(t!==null&&t>=r)u=n,r=t;else if(u.length===0)u=n}return u}function sp(l){let u=Number(l);if(!Number.isFinite(u)||u<0)return"--";if(u<1000)return`${Math.round(u)}ms`;return`${(u/1000).toFixed(u<1e4?2:1)}s`}function Q1(l,u=180){let r=String(l||"").replace(/\s+/gu," ").trim();return r.length>u?`${r.slice(0,u-1)}…`:r}async function Bu(l,u={}){return Tl(l,{strictJson:!0,retryInvalidJson:1,invalidJsonPrefix:"Code Queue 返回了无效 JSON",invalidJsonPreview:!0,responsePreviewLength:Mp,...u})}function Ri({status:l,children:u,title:r}){let f=String(l||"unknown").toLowerCase();return L("span",{className:`status-badge ${f}`,title:r},u||l||"unknown")}function hi({title:l,eyebrow:u,summary:r,actions:f,children:n,className:t,loading:i}){return L("section",{className:`panel ${t||""}`},L("div",{className:"panel-head"},L("div",null,u?L("p",{className:"panel-eyebrow"},u):null,L(nu,{title:l,loading:i}),r?L("div",{className:"panel-summary"},r):null),f?L("div",{className:"panel-actions"},f):null),L("div",{className:"panel-body"},n))}function v2({title:l,data:u,onOpen:r,testId:f}){return L("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function Ny({title:l,text:u}){return L("div",{className:"empty-state"},L("strong",null,l),L("span",null,u))}function Rp(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function xp(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function Du(l,u){return`${l}/microservices/code-queue/proxy${u}`}function bp(l){return`${l}/microservices/oa-event-flow/proxy/api/events/stream?tags=${encodeURIComponent("service:code-queue")}`}function Z3(){return{headers:{"cache-control":"no-cache","x-unidesk-no-cache":"1"}}}function Cu(l){return Array.isArray(l?.tasks)?l.tasks:[]}function Ln(l){return l?.pagination&&typeof l.pagination==="object"&&!Array.isArray(l.pagination)?l.pagination:{}}function FQ(l){let u=Date.parse(String(l?.updatedAt||l?.createdAt||""));return Number.isFinite(u)?u:0}function jQ(l){return en(l?.queueEnteredAt)??en(l?.createdAt)??en(l?.updatedAt)??0}function vp(l,u){let r=jQ(l)-jQ(u);if(r!==0)return r;let f=(en(l?.createdAt)??0)-(en(u?.createdAt)??0);if(f!==0)return f;return String(l?.id||"").localeCompare(String(u?.id||""))}function gp(l,u=""){let r=new Map;for(let f of l)for(let n of f){let t=String(n?.id||"");if(t.length>0&&!r.has(t))r.set(t,n)}return Array.from(r.values()).sort((f,n)=>{let t=TQ(f)-TQ(n);if(t!==0)return t;let i=String(f?.id||"")===u?0:1,y=String(n?.id||"")===u?0:1;if(i!==y)return i-y;return FQ(n)-FQ(f)})}function Gn(l,u=""){let r=new Map;for(let f of l)for(let n of f){let t=String(n?.id||"");if(t.length===0)continue;r.set(t,{...r.get(t)||{},...n})}return gp([Array.from(r.values())],u)}function $y(l){return Array.isArray(l?.activeTaskIds)?l.activeTaskIds.map((u)=>String(u||"")).filter(Boolean):[String(l?.activeTaskId||"")].filter(Boolean)}function ar(l){return Array.isArray(l)?l.map((u)=>String(u||"")).filter(Boolean):[]}function cy(l,u=3){let r=ar(l);if(r.length===0)return"--";let f=r.slice(0,u).join(" / ");return r.length>u?`${f} +${r.length-u}`:f}function kp(l,u){return ol(l?.executionDiagnostics)||ol(u?.body?.queue?.executionDiagnostics)||ol(u?.queue?.executionDiagnostics)||ol(u?.body?.executionDiagnostics)||ol(u?.executionDiagnostics)||{}}function H3(l){return Array.from(new Set([...ar(l?.heartbeatRiskTaskIds),...ar(l?.heartbeatExpiredTaskIds),...ar(l?.heartbeatMissingTaskIds),...ar(l?.staleRecoveryCandidateTaskIds)])).sort()}function g2(l){if(H3(l).length>0)return!1;if(typeof l?.splitBrainLive==="boolean")return l.splitBrainLive;let u=String(l?.state||l?.health||"").toLowerCase(),r=String(l?.effectiveLiveness||"").toLowerCase();return u==="split-brain"&&(r==="live"||ar(l?.heartbeatFreshTaskIds).length>0)}function HQ(l){let u=String(l?.effectiveLiveness||"").toLowerCase();if(u)return u;if(H3(l).length>0)return"at-risk";if(g2(l))return"live";let r=String(l?.state||l?.health||"unknown").toLowerCase();return r==="healthy"?"healthy":r==="unknown"?"unknown":"degraded"}function Ip(l){let u=HQ(l),r=H3(l),f=String(l?.state||l?.health||"unknown").toLowerCase();if(r.length>0||u==="at-risk"||f==="stale-active")return"failed";if(g2(l))return"degraded-live";if(u==="live"||u==="degraded")return"warn";if(["dead","failed","stale","unhealthy"].includes(u))return"failed";let n=String(l?.state||l?.health||"unknown").toLowerCase();if(n==="healthy")return"ok";if(n==="split-brain")return"warn";if(n==="degraded")return"warn";return"unknown"}var dn="__all__",ap="(max-width: 760px)",op="(min-width: 761px)";function Cr(l){return!l||l===dn}function dp(){return typeof window<"u"&&window.matchMedia(ap).matches}function BQ(l){return Cr(l)?"":`&queueId=${encodeURIComponent(l)}`}function h2(l){return String(l||"").trim().replace(/\s+/gu," ").slice(0,200)}function ep(l){let u=h2(l);return u.length===0?"":`&search=${encodeURIComponent(u)}`}function k2(l,u=""){return`${BQ(l)}${ep(u)}`}function L3(l,u){return Number(l?.counts?.[u]||0)}function NQ(l,u=""){let r=new Map;for(let n of Array.isArray(l?.queues)?l.queues:[]){let t=String(n?.id||"").trim();if(t.length>0)r.set(t,{...n,name:String(n?.name||t).trim()||t})}for(let n of[String(l?.defaultQueueId||"default"),u].map((t)=>t.trim()).filter(Boolean))if(!r.has(n))r.set(n,{id:n,name:n,total:0,counts:{},activeTaskId:null,runnableTaskId:null,processing:!1});return Array.from(r.values()).sort((n,t)=>{let i=String(n?.id||"")===String(l?.defaultQueueId||"default")?0:1,y=String(t?.id||"")===String(l?.defaultQueueId||"default")?0:1;if(i!==y)return i-y;return String(n?.id||"").localeCompare(String(t?.id||""))})}function DQ(l){let u=String(l?.id||"default"),r=String(l?.name||"").trim();return r.length>0?r:u}function M2(l){let u=String(l?.id||"default"),r=DQ(l);return r===u?u:`${r} (${u})`}function j1(l){let u=L3(l,"running")+L3(l,"judging"),r=L3(l,"queued")+L3(l,"retry_wait"),f=Number(l?.total||0),n=[M2(l),`${f} tasks`];if(u>0)n.push(`${u} running`);if(r>0)n.push(`${r} queued`);return n.join(" · ")}function Ay(l,u){if(Cr(u))return null;return l.find((r)=>String(r?.id||"")===u)||null}function JQ(l,u,r,f){if(Cr(r)){let t=$y(l);return String(l?.activeTaskId||t[0]||f.find((i)=>vt(i))?.id||"")}let n=Ay(u,r);return String(n?.activeTaskId||f.find((t)=>vt(t))?.id||"")}function lz(l,u,r){if(!Cr(u)){let f=Ay(l,u);return String(f?.runnableTaskId||r.find((n)=>String(n?.status||"")==="queued"||String(n?.status||"")==="retry_wait")?.id||"")}return String(r.find((f)=>String(f?.status||"")==="queued"||String(f?.status||"")==="retry_wait")?.id||"")}async function UQ(l,u=dn,r=""){return Bu(Du(l,`/api/tasks/overview?limit=${OQ}&transcriptLimit=1&compact=1&selected=0&includeActive=0&stats=0&skipTrace=1${k2(u,r)}`),Z3())}async function B2(l,u,r=0,f=dn,n="",t=!1,i={}){let y=i.selected===!1?"&selected=0":"",c=i.includeActive===!1?"&includeActive=0":"",_=i.stats===!1?"&stats=0":"",A=Number.isInteger(i.limit)&&i.limit>0?Math.min(500,i.limit):OQ;return Bu(Du(l,`/api/tasks/overview?limit=${encodeURIComponent(String(A))}&transcriptLimit=3&compact=1&afterSeq=${encodeURIComponent(String(Math.max(0,r)))}&preferId=${encodeURIComponent(u)}${y}${c}${_}${t?"&skipTrace=1":""}${k2(f,n)}`),Z3())}async function uz(l,u=dn){return Bu(Du(l,`/api/tasks/stats?days=14${BQ(u)}`),Z3())}async function QQ(l,u,r,f=ZQ,n=""){return Bu(Du(l,`/api/tasks/overview?limit=${encodeURIComponent(String(f))}&transcriptLimit=1&compact=1&selected=0&includeActive=0&stats=0&beforeId=${encodeURIComponent(r)}${k2(u,n)}`),Z3())}async function rz(l,u){return Bu(Du(l,`/api/tasks/${encodeURIComponent(u)}/trace-summary`))}async function fz(l,u,r,f=null){let n=f===null||f===void 0||String(f).length===0?"":`&attempt=${encodeURIComponent(String(f))}`;return Bu(Du(l,`/api/tasks/${encodeURIComponent(u)}/prompt?part=${encodeURIComponent(r)}${n}`))}async function nz(l,u,r=0,f=500,n=null){let t=n===null||n===void 0||String(n).length===0?"":`&attempt=${encodeURIComponent(String(n))}`;return Bu(Du(l,`/api/tasks/${encodeURIComponent(u)}/trace-steps?afterSeq=${encodeURIComponent(String(r))}&limit=${encodeURIComponent(String(f))}${t}`))}async function tz(l,u,r){return Bu(Du(l,`/api/tasks/${encodeURIComponent(u)}/trace-step?seq=${encodeURIComponent(String(r))}`))}async function iz(l,u){return Bu(Du(l,`/api/tasks/${encodeURIComponent(u)}/read`),{method:"POST",body:{}})}async function yz(l){return Bu(Du(l,"/api/tasks/read-all"),{method:"POST",body:{}})}function cz(l){return Array.isArray(l?.output)?l.output:[]}function $z(l){return Array.isArray(l?.attempts)?l.attempts:[]}function D2(l){return l?.counts&&typeof l.counts==="object"&&!Array.isArray(l.counts)?l.counts:{}}function _z(l){return l.split(/^\s*---+\s*$/gmu).map((u)=>u.trim()).filter(Boolean)}function mQ(l){let u=Number(l);return Number.isFinite(u)?Math.max(1,Math.min(50,Math.floor(u))):1}function Ci(l){let u=[];for(let r of l.split(/[\s,,;;]+/u)){let f=r.trim();if(/^codex_\d+_[A-Za-z0-9_-]+$/u.test(f)&&!u.includes(f))u.push(f)}return u}function Az(l,u){let r=Ci(u);if(r.length===0)return l;return[`引用 Code Queue 任务 ${r.join(" ")}。后端会在入队时只注入这些任务的 initial prompt 和 final response 全文;中间执行过程不注入,如需补充核查可运行:${r.map((f)=>`bun scripts/cli.ts codex task ${f}`).join(";")}`,"","本次任务:",l].join(` -`)}function Fz(l){let f=l.trimStart();if(!f.startsWith("# Code Queue 已解析引用上下文"))return{hasInjection:!1,reference:"",userPrompt:l};let n=l.length-f.length,t=l.lastIndexOf(` +`).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(` # 本次任务 -`);if(t0?l.split(/\r\n|\r|\n/u).length:0}function T3(l){if(typeof l==="string")return l;if(l&&typeof l==="object"&&!Array.isArray(l)&&typeof l.text==="string")return l.text;return""}function VQ(l,u={}){if(u.preview===!0){let n=T3(l?.displayPromptPreview||l?.basePromptPreview||l?.promptPreview);if(n.length>0)return n}let r=String(l?.displayPrompt||"");if(r.length>0)return r;let f=String(l?.prompt||"");return jz(Fz(f).userPrompt)}function Jr(l){return l?._traceSummary&&typeof l._traceSummary==="object"&&!Array.isArray(l._traceSummary)?l._traceSummary:null}function p3(l){return l?._promptDetails&&typeof l._promptDetails==="object"&&!Array.isArray(l._promptDetails)?l._promptDetails:{}}function I2(l){let u=Jr(l)?.prompt;return u&&typeof u==="object"&&!Array.isArray(u)?u:{}}function SQ(l){let u=Jr(l)?.execution;return u&&typeof u==="object"&&!Array.isArray(u)?u:{}}function wQ(l){let u=Number(l);return Number.isFinite(u)&&u>=0?Math.floor(u):0}function un(l){let u=Number(l);return Number.isFinite(u)&&u>=0?Math.floor(u):null}function a2(l){let u=ol(l?.traceStats);if(u&&(l?.statsSource==="oa-event-flow"||u.source==="oa-event-flow"))return u;let r=Jr(l),f=ol(r?.traceStats);if(f&&(r?.statsSource==="oa-event-flow"||f.source==="oa-event-flow"))return f;return null}function Nz(l,u){let r=ol(u?.traceStats)||ol(u?.execution?.traceStats),f=String(u?.statsSource||u?.execution?.statsSource||"");if(r&&(f==="oa-event-flow"||r.source==="oa-event-flow"))return r;return null}function Jz(l,u){return un(a2(l)?.[u])}function Uz(l){let u=Jz(l,"stepCount");if(u!==null)return u;let r=Jr(l);if(r!==null)return wz(r);return null}function YQ(...l){for(let u of l){let r=un(u);if(r!==null)return r}return null}function Qz(l){if(l.state==="ready"||l.state==="fallback")return`STEP ${l.count}${l.state==="fallback"?" raw":""}`;if(l.state==="syncing")return"STEP sync";if(l.state==="failed")return"STEP failed";return"STEP N/A"}function mz(l){let u=a2(l),r=un(u?.stepCount??u?.llmStepCount);if(r!==null)return{state:"ready",count:r,label:`STEP ${r}`,title:"STEP 来自 OA Event Flow 统计中心",source:"oa-event-flow"};let f=Jr(l),n=vt(l)&&l?._traceSummaryLoaded!==!0&&un(l?.outputCount??l?.retainedOutputCount)===0,t=YQ(f?.retainedStepCount,f?.execution?.traceLineCount,f?.execution?.stepCount,l?.outputCount,l?.retainedOutputCount,n?null:l?.stepCount,n?null:l?.llmStepCount);if(t!==null)return{state:"fallback",count:t,label:`STEP ${t} raw`,title:"OA STEP 统计不可用,当前显示 raw trace fallback 行数",source:"raw-trace"};if(f?.traceStatsError||l?.traceStatsError)return{state:"failed",count:null,label:"STEP failed",title:"STEP 统计读取失败;请查看 trace summary 原始 JSON",source:"stats-error"};if(vt(l)||l?._traceSummaryLoaded!==!0)return{state:"syncing",count:null,label:"STEP sync",title:"STEP 统计同步中;Trace Summary 或 OA 统计尚未返回",source:"syncing"};return{state:"unavailable",count:null,label:"STEP N/A",title:"当前任务没有可用 STEP 统计或 raw trace fallback",source:"unavailable"}}function wz(l){let u=ol(l?.traceStats);if(!u||l?.statsSource!=="oa-event-flow"&&u.source!=="oa-event-flow")return null;return un(u.stepCount)}function G3(l){if(!l||l?._traceSummaryLoaded!==!0)return!1;let u=Jr(l),r=String(l?._traceSummaryUpdatedAt||u?.updatedAt||""),f=String(l?.updatedAt||"");if(f.length>0){let n=en(r),t=en(f);if(n!==null&&t!==null){if(n+10)return r;let f=String(l?.basePrompt||"");return f.length>0?f:VQ(l)}function XQ(l){let u=Jr(l);return String(u?.finalResponse||l?.finalResponse||"").trimEnd()}function PQ(l){let r=Jr(l)?.lastJudge||l?.lastJudge;return r&&typeof r==="object"&&!Array.isArray(r)?r:null}function ol(l){return l&&typeof l==="object"&&!Array.isArray(l)?l:null}function qz(l){let u=ol(l?.raw),r=ol(l?.failureDetails)||ol(u?.minimaxFailure);if(r===null)return"";let f=r.repairAttempt===void 0?"":`${r.repairAttempt}/${r.maxRepairAttempts??"?"}`;return[["provider",r.provider||"minimax"],["stage",r.stage],["model",r.model],["timedOut",r.timedOut],["durationMs",r.durationMs],["timeoutMs",r.timeoutMs],["promptChars",r.promptChars],["promptLines",r.promptLines],["payloadBytes",r.payloadBytes],["responseStatus",r.responseStatus],["repairAttempt",f],["errorName",r.errorName],["error",r.errorMessage],["responseContentPreview",r.responseContentPreview],["responseTextPreview",r.responseTextPreview]].filter(([,t])=>t!==void 0&&t!==null&&String(t).length>0).map(([t,i])=>`${t}: ${String(i)}`).join(` -`)}function CQ({judge:l,testId:u="codex-judge-failure-details"}){let r=qz(l);if(r.length===0)return null;return L("details",{className:"codex-judge-failure-details","data-testid":u},L("summary",null,"MiniMax failure details"),L("pre",null,r))}function Lz(l){let u=Jr(l)?.attempts;if(Array.isArray(u)&&u.length>0)return S2(l,V2(l,u));let r=SQ(l),f=XQ(l),n=PQ(l);if(Object.keys(r).length===0&&f.length===0&&n===null)return S2(l,V2(l,[]));return S2(l,V2(l,[{index:Number(l?.currentAttempt||1),mode:l?.currentMode||"initial",startedAt:l?.startedAt,finishedAt:l?.finishedAt,terminalStatus:l?.status,execution:r,finalResponse:f,finalResponseChars:f.length,judge:n}]))}function z3(l,u){let r=Jr(l),f=Number(r?.currentAttempt||l?.currentAttempt||0),n=Number(u);return Number.isFinite(f)&&f>0&&Number.isFinite(n)&&n===f}function o2(l,u){return vt(l)&&z3(l,u)}function V2(l,u){let r=Array.isArray(u)?u.filter(Boolean):[],f=Jr(l),n=Number(f?.currentAttempt||l?.currentAttempt||0);if(!vt(l)||!Number.isFinite(n)||n<=0)return r;if(r.some((i)=>Number(i?.index)===n))return r;let t=b2(l?.startedAt,f?.startedAt,l?.updatedAt,f?.updatedAt);return[...r,{index:n,mode:l?.currentMode||f?.currentMode||(n<=1?"initial":"retry"),startedAt:t||l?.startedAt||f?.startedAt,finishedAt:null,terminalStatus:null,execution:{},finalResponse:"",finalResponsePreview:"",finalResponseChars:0,judge:null,currentPlaceholder:!0}]}function S2(l,u){let r=[...Array.isArray(u)?u:[]];if(!vt(l))return r;return r.sort((f,n)=>{let t=Number(f?.index),i=Number(n?.index),y=z3(l,t)?0:1,c=z3(l,i)?0:1;if(y!==c)return y-c;return t-i})}function Gz(l,u){return ol(u?.execution)||SQ(l)}function Wz(l,u,r,f){let n=Jr(l),t=Number(n?.currentAttempt||l?.currentAttempt||0),i=Number(r),y=Number.isFinite(i)&&i>0&&i===t,c=b2(l?.updatedAt,n?.updatedAt);if(y&&!u?.finishedAt&&c.length>0)return c;return String(u?.updatedAt||u?.finishedAt||f.effectiveEndAt||(y?c:"")||c||l?.finishedAt||l?.startedAt||"")}function Tz(l,u){let r=String(u?.finalResponse||u?.finalResponsePreview||"");if(o2(l,u?.index))return"";if(Object.prototype.hasOwnProperty.call(u||{},"finalResponse")||Object.prototype.hasOwnProperty.call(u||{},"finalResponsePreview"))return r.trimEnd();return r.length>0?r.trimEnd():XQ(l)}function hQ(l,u,r=u?.index){if(o2(l,r))return null;if(Object.prototype.hasOwnProperty.call(u||{},"judge"))return ol(u?.judge);return PQ(l)}function Kz(l,u,r){if(!bQ(l))return!1;if(d2(u,r))return!1;if(u?.finishedAt)return!1;if(["succeeded","failed","canceled"].includes(String(u?.terminalStatus||"")))return!1;if(z3(l,r))return!0;let f=Number(Jr(l)?.currentAttempt||l?.currentAttempt||0);if(Number.isFinite(f)&&f>0)return!1;return!0}function MQ(l){return`feedback:${String(l||"latest")}`}function Ez(l,u,r){let f=String(u?.feedbackPrompt||"").trimEnd(),n=String(u?.feedbackPromptPreview||f||"").trimEnd(),t=Number(u?.feedbackPromptChars||f.length||n.length||0),i=Number(u?.feedbackPromptLines||si(f||n));if(f.length>0||n.length>0||t>0)return{text:f,preview:n,chars:t,lines:i,source:u?.feedbackPromptSource||"judge-feedback",forAttempt:u?.feedbackPromptForAttempt||Number(r||0)+1,truncated:Boolean(u?.feedbackPromptTruncated)};let y=hQ(l,u,r),c=String(y?.continuePrompt||"").trimEnd();if(y?.decision==="retry"&&c.length>0)return{text:"",preview:c,chars:c.length,lines:si(c),source:"judge-continue-prompt",forAttempt:Number(r||0)+1,truncated:!1};return null}function pz(l){let u=I2(l);return Boolean(u.hasReferenceInjection||Number(u.referencePromptChars||0)>0||l?.referenceInjection||l?.referenceInjectionSummary)}function sQ(l,u=null){if(u!==null&&u!==void 0){let f=(ol(l?._traceStepsByAttempt)||{})[String(u)];return Array.isArray(f)?f:[]}return Array.isArray(l?._traceSteps)?l._traceSteps:[]}function m1(l){let r=[l?.seq,...Array.isArray(l?.rawSeqs)?l.rawSeqs:[]].map((f)=>Number(f)).filter((f)=>Number.isFinite(f));return r.length>0?Math.max(...r):0}function zz(l){return(Array.isArray(l)?l:[]).reduce((u,r)=>Math.max(u,m1(r)),0)}function Oz(l,u){let r=new Map;for(let f of[...Array.isArray(l)?l:[],...Array.isArray(u)?u:[]]){let n=String(f?.seq??`${f?.title||"step"}:${f?.at||""}`);r.set(n,{...r.get(n)||{},...f})}return Array.from(r.values()).sort((f,n)=>m1(f)-m1(n))}function xi(l){return(Array.isArray(l?.summaryLines)?l.summaryLines:[]).map((u)=>String(u||""))}function Zz(l){let u=String(l?.kind||"").trim().toLowerCase(),r=String(l?.status||"").trim().toLowerCase();return u==="error"||r==="error"}function O3(l){let u=String(l?.status||"").trim();if(u.length>0)return u;let r=xi(l).join(` -`);return/^(item\/[A-Za-z]+(?:\/[A-Za-z]+)?):/u.exec(r)?.[1]||""}function qQ(l){return/^item\/(?:started|completed): file changes status=/u.test(String(l||"").trim())}function Hz(l){let u=xi(l);for(let f=u.length-1;f>=0;f-=1){let n=/file changes status=([A-Za-z0-9_-]+)/u.exec(u[f]||"")?.[1];if(n)return n}let r=O3(l);if(r==="item/fileChange/outputDelta")return"updated";if(r==="item/started")return"started";if(r==="item/completed")return"completed";return r.replace(/^item\//u,"")||String(l?.status||"changed")}function Bz(l){if(String(l?.kind||"")!=="edited")return!1;let u=String(l?.title||""),r=String(l?.status||""),f=xi(l).join(` -`);if(u==="Edited files")return!0;if(/^item\/fileChange\//u.test(r))return!0;if((r==="item/started"||r==="item/completed")&&/file changes status=/u.test(f))return!0;if(/^Success\. Updated the following files:/mu.test(f))return!0;if(/^diff --git /mu.test(f))return!0;return/^([AMDRCU?]{1,2})\s+\S+/mu.test(f)}function Dz(l){if(l.length<=1)return l[0];let u=l.find((t)=>O3(t)==="item/fileChange/outputDelta")||l.find((t)=>xi(t).some((i)=>!qQ(i)))||l.at(-1)||l[0],r=l.flatMap((t)=>Array.isArray(t?.rawSeqs)?t.rawSeqs:[t?.seq]).filter((t)=>t!==void 0),f=l.flatMap(xi).filter((t)=>t.trim().length>0&&!qQ(t)),n=l[l.length-1]||u;return{...u,at:u?.at||n?.at,title:String(u?.title||"Edited files"),status:Hz(n),summaryLines:f.length>0?f:xi(u),rawSeqs:r}}function Vz(l){let u=Array.isArray(l)?l:[],r=[],f=[],n=()=>{if(f.length>0)r.push(Dz(f));f=[]};for(let t of u){if(Bz(t)){if(O3(t)==="item/started"&&f.length>0)n();if(f.push(t),O3(t)==="item/completed")n();continue}n(),r.push(t)}return n(),r}function Sz(l){if(String(l?.kind||"")!=="message")return"";let u=String(l?.title||"").trim().toLowerCase();if(u!=="assistant message"&&u!=="reasoning")return"";return`${u}:${String(l?.status||"")}`}function Yz(l){if(l.length<=1)return l[0];let u=l[0],r=l.at(-1)||u,f=l.flatMap((i)=>Array.isArray(i?.rawSeqs)?i.rawSeqs:[i?.seq]).filter((i)=>i!==void 0),n=[];for(let i of f)if(!n.includes(i))n.push(i);let t=l.flatMap(xi).filter((i)=>i.trim().length>0);return{...u,seq:m1(r)||m1(u),at:r?.at||u?.at,summaryLines:t.length>0?[t.at(-1)||t[0]]:[],rawSeqs:n}}function Xz(l){let u=Array.isArray(l)?l:[],r=[],f=[],n="",t=()=>{if(f.length>0)r.push(Yz(f));f=[],n=""};for(let i of u){let y=Sz(i);if(y.length>0&&y===n){f.push(i);continue}if(t(),y.length>0)f=[i],n=y;else r.push(i)}return t(),r}function Pz(l){return Xz(Vz(l))}function Cz(l){return{...l}}function E3(l,u=null){if(u!==null&&u!==void 0){let r=ol(l?._traceStepsLoadedByAttempt)||{};return Boolean(r[String(u)])}return Boolean(l?._traceStepsLoaded)}function s2(l){return l?._traceStepDetails&&typeof l._traceStepDetails==="object"&&!Array.isArray(l._traceStepDetails)?l._traceStepDetails:{}}function hz(l,u){let r=Number(l?.index);return Number.isFinite(r)?r:u+1}function d2(l,u){return Boolean(l?.synthetic)||Number(u)<=0}function B3(l){let u=Number(l);return Number.isFinite(u)?String(u):void 0}function Mz(l){let u=l?.timing&&typeof l.timing==="object"?l.timing:{},r=String(l?.status||"");if(["queued"].includes(r))return`等待 ${ln(u.queueWaitMs??u.totalElapsedMs)}`;if(["running","judging","retry_wait"].includes(r))return`耗时 ${ln(u.durationMs??u.totalElapsedMs)}`;return`耗时 ${ln(u.durationMs??u.totalElapsedMs)}`}function Fy(l){return String(l?.queueId||"default")}function RQ(l){return ol(l?.queuedReason)}function xQ(l){let u=String(l?.queuedReasonLabel||"").trim();if(u.length>0)return u.toUpperCase();let r=RQ(l),f=String(r?.label||"").trim();return f.length>0?f.toUpperCase():""}function sz(l){let u=String(l?.status||"unknown");if(u!=="queued")return u;let r=xQ(l);return r.length>0?`QUEUED(${r})`:"QUEUED"}function Rz(l){if(String(l?.status||"")!=="queued")return;let u=RQ(l),r=String(u?.message||"").trim(),f=xQ(l);if(r.length>0&&f.length>0)return`${f}: ${r}`;if(r.length>0)return r;return f.length>0?f:void 0}function xz(l){return{system:"SYS",user:"YOU",assistant:"GPT",reasoning:"THINK",command:"CMD",diff:"DIFF",tool:"TOOL",error:"ERR"}[l]||l.toUpperCase()}function vt(l){return["running","judging","retry_wait"].includes(String(l?.status||""))}function bQ(l){return String(l?.status||"")==="running"}function ef(l){return["succeeded","failed","canceled"].includes(String(l?.status||""))}function vQ(l){if(l?.promptEditable===!0)return!0;if(l?.promptEditable===!1)return!1;return String(l?.status||"")==="queued"&&!l?.startedAt&&Number(l?.currentAttempt||0)===0&&!l?.codexThreadId&&!l?.nextMode}function on(l){if(!ef(l))return!1;if(l?.terminalUnread===!0)return!0;if(l?.terminalUnread===!1)return!1;return!l?.readAt}function pu(l){let u=Number(l||0);return Number.isFinite(u)?u:0}function bz(l){return pu(l.queued)+pu(l.retry_wait)}function vz(l){return pu(l.running)+pu(l.judging)}function gz(l,u){return ol(l?.statistics)||ol(u?.statistics)||{}}function gQ(...l){return l.find((u)=>u!==void 0&&u!==null)}function kQ(l){let u=Number(l);return Number.isFinite(u)&&u>=0?u:null}function Kr(...l){for(let u of l){let r=kQ(u);if(r!==null)return Math.floor(r)}return 0}function e2(...l){for(let u of l){let r=kQ(u);if(r!==null)return Math.round(r)}return null}function kz(l){for(let u of[l?.daily,l?.dailyBuckets,l?.daily_buckets,l?.buckets,l?.rows,l?.series])if(Array.isArray(u))return u;return[]}function IQ(l){return kz(l).map((u,r)=>{let f=ol(u)||{},n=String(gQ(f.date,f.day,f.bucketDate,f.bucket,`day-${r}`)||"");return{...f,date:n,executedTasks:Kr(f.executedTasks,f.tasks,f.taskCount,f.startedTasks,f.started,f.executed,f.count),completedTasks:Kr(f.completedTasks,f.terminalTasks,f.terminalCount,f.finishedTasks,f.finished,f.completed),retryAttempts:Kr(f.retryAttempts,f.retries,f.retryCount,f.retryTasks),succeededTasks:Kr(f.succeededTasks,f.succeeded,f.success),failedTasks:Kr(f.failedTasks,f.failed,f.failures),canceledTasks:Kr(f.canceledTasks,f.cancelledTasks,f.canceled,f.cancelled),totalDurationMs:Kr(f.totalDurationMs,f.durationTotalMs,f.totalCompletionDurationMs),durationSamples:Kr(f.durationSamples,f.avgDurationSamples,f.samples,f.sampleCount),avgDurationMs:e2(f.avgDurationMs,f.averageDurationMs,f.avgCompletedDurationMs,f.averageCompletionMs,f.averageDuration,f.durationMs)}}).filter((u)=>u.date.length>0)}function xt(l,u){return l.reduce((r,f)=>r+pu(f?.[u]),0)}function Iz(l){let u=0,r=0;for(let f of l){let n=pu(f?.durationSamples),t=e2(f?.avgDurationMs);if(n>0&&t!==null)u+=t*n,r+=n}return r>0?Math.round(u/r):null}function az(l,u=IQ(l)){let r=ol(l?.totals)||ol(l?.summary)||{},f=Kr(r.durationSamples,r.avgDurationSamples,r.samples,l?.durationSamples,l?.samples,xt(u,"durationSamples")),n=Kr(r.totalDurationMs,r.durationTotalMs,l?.totalDurationMs,xt(u,"totalDurationMs")),t=e2(r.avgDurationMs,r.averageDurationMs,r.avgCompletedDurationMs,l?.avgDurationMs,l?.averageDurationMs,f>0&&n>0?n/f:null,Iz(u));return{...r,executedTasks:Kr(r.executedTasks,r.tasks,r.taskCount,l?.executedTasks,l?.tasks,l?.taskCount,xt(u,"executedTasks")),completedTasks:Kr(r.completedTasks,r.terminalTasks,r.terminalCount,r.finishedTasks,l?.completedTasks,l?.terminalTasks,l?.terminalCount,xt(u,"completedTasks")),retryAttempts:Kr(r.retryAttempts,r.retries,r.retryCount,l?.retryAttempts,l?.retries,l?.retryCount,xt(u,"retryAttempts")),succeededTasks:Kr(r.succeededTasks,l?.succeededTasks,xt(u,"succeededTasks")),failedTasks:Kr(r.failedTasks,l?.failedTasks,xt(u,"failedTasks")),canceledTasks:Kr(r.canceledTasks,r.cancelledTasks,l?.canceledTasks,l?.cancelledTasks,xt(u,"canceledTasks")),durationSamples:f,totalDurationMs:n,avgDurationMs:t}}function LQ(l){let u=gQ(l?.reason,l?.degradedReason,l?.statsReason,l?.error,l?.message,l?.detail);if(typeof u==="string"&&u.trim().length>0)return Q1(u,180);if(l?.skipped===!0)return"统计 API 返回 skipped,当前后端未提供 daily buckets。";if(l?.unavailable===!0)return"统计 API 当前不可用。";return"统计 API 未返回可用的 daily buckets。"}function oz(l,u,r){let f=ol(l)!==null,n=l?.unavailable===!0||l?._unavailable===!0||l?.available===!1,t=l?.skipped===!0,i=l?.degraded===!0||l?.isDegraded===!0||n||t,y=pu(r.executedTasks)+pu(r.retryAttempts)+pu(r.completedTasks);if(!f)return{state:"loading",label:"统计同步中",reason:"正在读取 Code Queue stats API。"};if(n||t||i&&u.length===0)return{state:"unavailable",label:"统计不可用",reason:LQ(l),degraded:!0};if(i)return{state:"degraded",label:"统计降级",reason:LQ(l),degraded:!0};if(u.length===0&&y===0)return{state:"empty",label:"暂无统计",reason:"任务开始执行后会生成按天汇总的曲线。"};return{state:"ready",label:"统计就绪",reason:""}}function GQ(l){return{source:"frontend-stats-fetch",unavailable:!0,degraded:!0,reason:Hu(l,"统计 API 不可用"),daily:[],totals:null}}function l5(l,u){let r=Number(l?.[u]??0);return Number.isFinite(r)&&r>0?r:0}function Y2(l,u){return l.reduce((r,f)=>Math.max(r,l5(f,u)),0)}var Mi=700,WQ=220,bt=30,_y=24,U1=184,R2=U1-_y;function aQ(l,u){if(u<=1)return Mi/2;return bt+l*(Mi-bt*2)/(u-1)}function oQ(l,u){let r=u>0?u:1;return U1-Math.min(1,l/r)*R2}function X2(l,u,r){let f=l.length>0?l:[{[u]:0}],n=f.length>1?f:[f[0],f[0]];return n.map((t,i)=>`${aQ(i,n.length).toFixed(2)},${oQ(l5(t,u),r).toFixed(2)}`).join(" ")}function an(l){let u=String(l||"");return/^\d{4}-\d{2}-\d{2}$/u.test(u)?u.slice(5):u||"--"}function W3(l){if(!l)return"";return`${String(l.seriesKey||"")}:${String(l.row?.date||l.index||"")}`}function dz(l,u,r,f){let n=l5(l,f.key);return{...f,row:l,index:u,value:n,valueLabel:f.format(n),x:aQ(u,r),y:oQ(n,f.max),seriesKey:f.key}}function TQ(l){if(on(l))return 0;return{running:1,judging:2,retry_wait:3,queued:4,succeeded:8,failed:8,canceled:8}[String(l?.status||"")]??9}function A1(l){if(!l)return!1;if(l?._traceSummaryLoaded===!0)return!1;return l?.summaryOnly===!0||l?._metaLoaded!==!0}function ez(l){return Boolean(l?._metaLoaded)||l?.summaryOnly===!1}function lO(l,u,r){let f=String(l?.[r]||""),n=String(u?.[r]||"");return f.length>n.length?f:n}function x2(l,u,r){let f=Array.isArray(l?.[r])?l[r]:[],n=Array.isArray(u?.[r])?u[r]:[];if(n.length===0&&f.length>0)return f;return f.length>n.length?f:n}function KQ(l,u){let r=u?.summaryOnly===!0&&ez(l),f={...l,...u};if(!r)return f;for(let n of["prompt","basePrompt","displayPrompt","finalResponse"])f[n]=lO(l,u,n);for(let n of["promptHistory","attempts","output","events"])f[n]=x2(l,u,n);if(l?.referenceInjection?.items&&!u?.referenceInjection?.items)f.referenceInjection=l.referenceInjection;if(l?.referenceInjectionSummary&&!u?.referenceInjectionSummary)f.referenceInjectionSummary=l.referenceInjectionSummary;f.summaryOnly=l?.summaryOnly===!1?!1:u.summaryOnly,f._metaLoaded=l?._metaLoaded,f._detailLoaded=l?._detailLoaded,f._transcriptComplete=l?._transcriptComplete,f._transcriptPreview=Object.prototype.hasOwnProperty.call(u,"_transcriptPreview")?u._transcriptPreview:l?._transcriptPreview;for(let n of["_traceSummary","_traceSummaryLoaded","_traceSteps","_traceStepsLoaded","_traceStepsByAttempt","_traceStepsLoadedByAttempt","_traceStepsNextAfterSeqByAttempt","_traceStepDetails","_promptDetails"])if(!Object.prototype.hasOwnProperty.call(u,n)&&Object.prototype.hasOwnProperty.call(l||{},n))f[n]=l[n];return f}function EQ(l){let u=l?.selected,r=u?.task&&typeof u.task==="object"?u.task:null;if(r!==null){let n=Boolean(u?.preview);return{...r,transcript:Array.isArray(u?.transcript)?u.transcript:[],_detailLoaded:Array.isArray(u?.transcript)&&u.transcript.length>0,_transcriptComplete:Boolean(!n&&!u?.hasMore&&ef(r)),_transcriptPreview:n,_summaryLoaded:!0}}let f=Cu(l)[0];return f?{...f,_summaryLoaded:!0}:null}function P2(l,u){let r=new Map;for(let f of[...Array.isArray(l)?l:[],...Array.isArray(u)?u:[]]){let n=`${Number(f?.seq??0)}:${String(f?.kind||"message")}`,t=r.get(n);if(!t){r.set(n,f);continue}let i={...t,...f};for(let[y,c]of[["bodyPreview","bodyOmittedLines"],["commandPreview","commandOmittedLines"]]){let _=String(t?.[y]||""),A=String(f?.[y]||"");if(_.length>A.length)i[y]=t[y],i[c]=t[c]}r.set(n,i)}return Array.from(r.values()).sort((f,n)=>Number(f?.seq??0)-Number(n?.seq??0))}function F1(l){return(Array.isArray(l)?l:[]).reduce((u,r)=>Math.max(u,Number(r?.seq??0)),0)}function pQ(l,u=8){let r=Array.from(new Set((Array.isArray(l)?l:[]).map((n)=>Number(n?.seq??0)).filter((n)=>Number.isFinite(n)&&n>0))).sort((n,t)=>n-t);if(r.length===0)return 0;let f=r[Math.max(0,r.length-u)]??0;return Math.max(0,f-0.001)}function uO(l,u){let r=Array.isArray(l?.codeModels)?l.codeModels:Array.isArray(l?.codexModels)?l.codexModels:[],f=["gpt-5.5","gpt-5.4-mini","gpt-5.4","minimax-m2.7"];return Array.from(new Set([...r,...f,u].map((n)=>String(n||"").trim()).filter(Boolean)))}function rO(l,u){let f=(Array.isArray(l?.executionProviders)?l.executionProviders:[]).map((i)=>({id:String(i?.id||"").trim(),label:String(i?.label||i?.id||"").trim(),defaultWorkdir:String(i?.defaultWorkdir||"").trim(),supportsWindowsNativeCodex:i?.supportsWindowsNativeCodex===!0,windowsNativeDefaultWorkdir:String(i?.windowsNativeDefaultWorkdir||"").trim(),kind:String(i?.kind||"").trim()})).filter((i)=>i.id.length>0),n=String(l?.mainProviderId||l?.defaultProviderId||"D601").trim()||"D601",t=new Map;for(let i of[...f,{id:n,label:`${n} (local)`,defaultWorkdir:String(l?.defaultWorkdir||"/workspace"),supportsWindowsNativeCodex:!1,windowsNativeDefaultWorkdir:"",kind:"local"},u?{id:u,label:u,defaultWorkdir:u5(l,u),supportsWindowsNativeCodex:u!==n,windowsNativeDefaultWorkdir:String(l?.windowsNativeCodexDefaultWorkdir||"/mnt/f/Work/ConStart"),kind:""}:null].filter(Boolean))if(!t.has(i.id))t.set(i.id,i);return Array.from(t.values())}function fO(l,u){let f=(Array.isArray(l?.executionModes)?l.executionModes:[]).map((i)=>({id:String(i?.id||i?.kind||"").trim(),label:String(i?.label||i?.id||i?.kind||"").trim(),description:String(i?.description||"").trim(),defaultWorkdir:String(i?.defaultWorkdir||"").trim(),requiresProvider:i?.requiresProvider===!0,requiresWindowsCwd:i?.requiresWindowsCwd===!0})).filter((i)=>i.id.length>0),n=[{id:"default",label:"默认容器/本机",description:"Code Queue 所在节点用本机 Codex;远程 Provider 用执行容器 Codex。",defaultWorkdir:"",requiresProvider:!1,requiresWindowsCwd:!1},{id:"windows-native",label:"Windows 原生 Codex",description:"启动执行容器,但容器只做 stdio relay,Codex 运行在 Provider 的 Windows 宿主。",defaultWorkdir:String(l?.windowsNativeCodexDefaultWorkdir||"/mnt/f/Work/ConStart"),requiresProvider:!0,requiresWindowsCwd:!0}],t=new Map;for(let i of[...f,...n,u?{id:u,label:u,description:"",defaultWorkdir:"",requiresProvider:u==="windows-native",requiresWindowsCwd:u==="windows-native"}:null].filter(Boolean))if(!t.has(i.id))t.set(i.id,i);return Array.from(t.values())}function N1(l,u,r){if(u!=="windows-native")return u5(l,r);let f=Array.isArray(l?.executionModes)?l.executionModes.find((t)=>String(t?.id||t?.kind||"")==="windows-native"):null,n=Array.isArray(l?.executionProviders)?l.executionProviders.find((t)=>String(t?.id||"")===r):null;return String(n?.windowsNativeDefaultWorkdir||f?.defaultWorkdir||l?.windowsNativeCodexDefaultWorkdir||"/mnt/f/Work/ConStart")}function u5(l,u){let r=String(u||"").trim(),f=l?.defaultWorkdirByProvider&&typeof l.defaultWorkdirByProvider==="object"?l.defaultWorkdirByProvider:{};if(typeof f[r]==="string"&&String(f[r]).trim().length>0)return String(f[r]).trim();let n=Array.isArray(l?.executionProviders)?l.executionProviders.find((i)=>String(i?.id||"")===r):null;if(typeof n?.defaultWorkdir==="string"&&n.defaultWorkdir.trim().length>0)return n.defaultWorkdir.trim();let t=String(l?.mainProviderId||l?.defaultProviderId||"D601");return r===t?String(l?.defaultWorkdir||"/workspace"):String(l?.remoteDefaultWorkdir||"/home/ubuntu")}function jy(l){return String(l||"").trim().replace(/\/+$/u,"")||"/"}function nO(l,u,r){return String(l?.providerId||"")===String(u||"")&&String(l?.executionMode||"default")===String(r||"default")&&String(l?.path||"").trim().length>0}function tO(l,u,r,f,n){let t=new Map,i=jy(n),y=(c,_,A={})=>{let F=jy(c);if(F.length===0||t.has(F))return;t.set(F,{providerId:r,executionMode:f,path:F,source:_,createdAt:A?.createdAt||"",updatedAt:A?.updatedAt||""})};y(N1(l,f,r),"default");for(let c of Array.isArray(u)?u:[])if(nO(c,r,f))y(c.path,"saved",c);return y(n,"current"),Array.from(t.values()).sort((c,_)=>{if(c.path===i)return-1;if(_.path===i)return 1;if(c.source==="default"&&_.source!=="default")return-1;if(_.source==="default"&&c.source!=="default")return 1;return c.path.localeCompare(_.path)})}function iO({task:l,selected:u,onSelect:r,onCopy:f,onReference:n,onMarkRead:t,copied:i,markingRead:y}){let c=l?.lastJudge||{},_=String(l?.id||""),A=on(l),F=b2(l?.updatedAt,Jr(l)?.updatedAt),j=`最近更新: ${J1(F)}`,N=mz(l),U=N.title;return L("article",{role:"button",tabIndex:0,className:`codex-task-card ${u?"selected":""} ${A?"unread-terminal":""}`,onClick:r,onKeyDown:(w)=>{if(w.key==="Enter"||w.key===" ")w.preventDefault(),r()},"data-unread-terminal":A?"true":"false","data-testid":`codex-task-${l?.id||"unknown"}`},A?L("span",{className:"codex-unread-badge",title:"待读","aria-label":"待读","data-testid":`codex-unread-task-${_||"unknown"}`}):null,L("div",{className:"codex-task-card-head"},L("div",{className:"codex-task-status-line"},L(Ri,{status:l?.status,title:Rz(l)},sz(l))),L("span",{className:"mono-text"},`${l?.currentAttempt||0}/${l?.maxAttempts||0}`)),L("div",{className:"codex-task-id-row"},L("code",{title:_},_||"unknown"),L("div",{className:"codex-task-id-actions"},L("button",{type:"button",className:"codex-copy-id-btn",onClick:(w)=>{w.stopPropagation(),n(_)},"data-testid":`codex-reference-task-${_||"unknown"}`},"引用"),L("button",{type:"button",className:"codex-copy-id-btn",onClick:(w)=>{w.stopPropagation(),f(_)},"data-testid":`codex-copy-task-id-${_||"unknown"}`},i?"已复制":"复制ID"),A?L("button",{type:"button",className:"codex-copy-id-btn codex-mark-read-btn",disabled:Boolean(y),onClick:(w)=>{w.stopPropagation(),t(_)},"data-testid":`codex-mark-task-read-${_||"unknown"}`},y?"标记中":"标为已读"):null)),L("strong",null,Q1(VQ(l,{preview:!0}),120)||"空任务"),L("div",{className:"codex-task-meta"},L("span",null,`queue=${Fy(l)}`),L("span",null,`provider=${l?.providerId||"D601"}`),L("span",null,`mode=${l?.executionMode||"default"}`),L("span",null,l?.model||"--"),L("span",null,Mz(l))),L("div",{className:"codex-task-meta codex-task-update-meta"},L("span",{className:`codex-task-recent-update codex-task-step-count ${N.state}`,title:U,"data-testid":`codex-task-step-count-${_||"unknown"}`,"data-step-state":N.state,"data-step-source":N.source},Qz(N)),L("span",{className:"codex-task-recent-update",title:F?`更新时间: ${Ll(F)}`:j,"data-testid":`codex-task-recent-update-${_||"unknown"}`},j),L("span",null,Ll(F||l?.updatedAt))),vQ(l)?L("div",{className:"codex-judge-line","data-testid":`codex-task-prompt-editable-${_||"unknown"}`},"queued prompt 可编辑"):null,c?.decision?L("div",{className:"codex-judge-line"},`judge=${c.decision} ${Math.round(Number(c.confidence||0)*100)}%`):null)}function C2({title:l,tasks:u,selectedId:r,onSelect:f,onCopy:n,onReference:t,onMarkRead:i,copiedTaskId:y,markingReadTaskId:c,emptyText:_}){let A=Array.isArray(u)?u:[];return L("section",{className:"codex-task-section"},L("div",{className:"codex-task-section-head"},L("span",null,l),L("code",null,String(A.length))),A.length===0?L("p",{className:"codex-task-section-empty"},_):L("div",{className:"codex-task-section-list"},A.map((F)=>L(iO,{key:F.id,task:F,selected:r===F.id,onSelect:()=>f(F.id),onCopy:n,onReference:t,onMarkRead:i,copied:y===F.id,markingRead:c===F.id}))))}function yO(){return L("span",{className:"codex-stats-icon","aria-hidden":"true"},L("svg",{viewBox:"0 0 36 24",focusable:"false"},L("path",{className:"grid",d:"M3 20.5H33M3 12.5H33M3 4.5H33"}),L("polyline",{className:"line tasks",points:"3,18 9,14 15,15 21,8 27,10 33,4"}),L("polyline",{className:"line retry",points:"3,20 9,17 15,18 21,13 27,14 33,9"})))}function Df({label:l,value:u,hint:r,tone:f}){return L("div",{className:`codex-liveness-metric ${f||""}`},L("span",null,l),L("strong",null,u??"--"),r?L("code",null,r):null)}function cO({diagnostics:l,queue:u,onRaw:r}){let f=String(l?.state||l?.health||"unknown"),n=ol(l?.oaPublisher),t=ar(l?.reasons).slice(0,3),i=H3(l),y=g2(l),c=HQ(l),_=String(l?.recommendedAction||(i.length>0?"investigate-heartbeat-risk":y?"continue-supervision":c==="degraded"?"observe-degraded":"none")),A=String(y?"控制面/执行面观测分裂,但 heartbeat/trace 新鲜,继续监督。":i.length>0?"存在 expired/missing/stale heartbeat 风险,请先确认执行面状态。":l?.livenessSummary||(c==="degraded"?"Diagnostics are degraded; inspect heartbeat, trace, and OA progress together.":"Execution diagnostics are healthy.")),F=Ip(l),j=y?"split-brain live":f;return L(hi,{title:"执行活性",eyebrow:`${String(l?.executionStateSource||u?.executionStateSource||"unknown")} / ${String(l?.controlPlane||"code-queue")}`,summary:L("div",{className:"codex-trace-status"},L("span",{className:`codex-trace-status-chip liveness ${F}`},L("b",null,"状态"),j),L("span",{className:`codex-trace-status-chip liveness ${F}`},L("b",null,"liveness"),c),L("span",{className:"codex-trace-status-chip"},L("b",null,"DB active"),String(l?.databaseActiveTaskCount??u?.databaseActiveTaskCount??0)),L("span",{className:"codex-trace-status-chip"},L("b",null,"scheduler slots"),String(l?.schedulerActiveRunSlotCount??u?.activeRunSlotCount??0)),L("span",{className:"codex-trace-status-chip"},L("b",null,"heartbeat"),`${ar(l?.heartbeatFreshTaskIds).length} fresh / ${ar(l?.heartbeatExpiredTaskIds).length} expired`),n?L("span",{className:"codex-trace-status-chip"},L("b",null,"OA"),`${Number(n.pending||0)} pending${n.lastError?" / error":""}`):null),actions:L(v2,{title:"Code Queue Execution Diagnostics",data:l,onOpen:r,testId:"raw-code-queue-execution-diagnostics"}),className:"codex-liveness-panel"},L("div",{className:"codex-liveness-grid","data-testid":"codex-liveness-diagnostics"},L(Df,{tone:F,label:"健康状态",value:j,hint:_}),L(Df,{tone:F,label:"Effective liveness",value:c,hint:A}),L(Df,{label:"PostgreSQL active",value:String(l?.databaseActiveTaskCount??u?.databaseActiveTaskCount??0),hint:cy(l?.databaseActiveTaskIds??u?.databaseActiveTaskIds)}),L(Df,{label:"Scheduler active",value:String(l?.schedulerActiveRunSlotCount??u?.activeRunSlotCount??0),hint:cy(l?.schedulerActiveTaskIds??u?.activeTaskIds)}),L(Df,{label:"Fresh heartbeat",value:String(ar(l?.heartbeatFreshTaskIds).length),hint:cy(l?.heartbeatFreshTaskIds)}),L(Df,{tone:i.length>0?"failed":y?"degraded-live":"",label:"Heartbeat risk",value:String(i.length),hint:i.length>0?cy(i):y?"fresh heartbeat/trace: keep supervising":"--"}),L(Df,{tone:ar(l?.traceGapNotStaleTaskIds).length>0?"warn":"",label:"Trace gap",value:String(ar(l?.traceGapTaskIds).length),hint:cy(l?.traceGapNotStaleTaskIds)}),L(Df,{tone:ar(l?.staleRecoveryCandidateTaskIds).length>0?"failed":"",label:"Stale candidates",value:String(ar(l?.staleRecoveryCandidateTaskIds).length),hint:cy(l?.staleRecoveryCandidateTaskIds)}),L(Df,{label:"Last scheduler heartbeat",value:J1(l?.lastSchedulerHeartbeatAt),hint:String(l?.lastSchedulerHeartbeatAt||"--")}),L(Df,{label:"Last agent event",value:J1(l?.lastObservedAgentEventAt),hint:String(l?.lastObservedAgentEventAt||"--")}),L(Df,{label:"Last trace persist",value:J1(l?.lastPersistedTraceAt),hint:String(l?.lastPersistedTraceAt||"--")}),L(Df,{tone:n?.lastError?"warn":"",label:"OA publisher",value:`${Number(n?.pending||0)} pending`,hint:n?.lastError?Q1(n.lastError,90):"ok"})),L("div",{className:`codex-liveness-advisory ${F}`},L("b",null,y?"Observing split":i.length>0?"Heartbeat risk":"Liveness note"),L("span",null,A),L("code",null,_)),t.length>0?L("div",{className:"codex-liveness-reasons"},t.map((N)=>L("span",{key:N},N))):null)}function $O({stats:l,queueName:u,onRaw:r}){let f=IQ(l),n=az(l,f),t=f.at(-1)||{},i=Y2(f,"executedTasks"),y=Y2(f,"retryAttempts"),c=Y2(f,"avgDurationMs"),_=f.length>0,A=ol(l?.range)||{},F=oz(l,f,n),j=String(F.label||""),N=String(F.reason||""),U=F.state==="ready"||F.state==="degraded"?"将鼠标悬停到曲线数据点查看明细,点击数据点可固定。":N||"等待统计数据。",[w,G]=kl(null),[J,Q]=kl(null),m=[];if(i>0)m.push(`tasks ${i}`);if(y>0)m.push(`retry ${y}`);if(c>0)m.push(`avg ${ln(c)}`);let q=[{key:"executedTasks",className:"tasks",label:"执行任务",max:i,format:(B)=>`${pu(B)} tasks`},{key:"retryAttempts",className:"retry",label:"重试次数",max:y,format:(B)=>`${pu(B)} retries`},{key:"avgDurationMs",className:"duration",label:"平均耗时",max:c,format:(B)=>ln(B)}],W=w||J,p=W3(W),O=String(W?.row?.date||""),Z=W?{left:`${Math.max(8,Math.min(92,Number(W.x)/Mi*100))}%`,top:`${Math.max(14,Math.min(86,Number(W.y)/WQ*100))}%`}:void 0;df(()=>{G(null),Q(null)},[u,A.startDate,A.endDate,f.length]);let V=(B)=>{G(B)},P=(B)=>{let C=W3(B);Q((E)=>W3(E)===C?null:B),G(B)},H=q.flatMap((B)=>f.map((C,E)=>{let D=dz(C,E,f.length,B),Y=W3(D),v=p===Y,K=String(C?.date||`day-${E}`),X=`${an(K)} ${B.label}: ${D.valueLabel}`;return L("g",{key:`${B.key}-${K}`,className:`stat-point-group ${B.className} ${v?"active":""}`,role:"button",tabIndex:0,"aria-label":X,"data-testid":`codex-stats-point-${B.className}-${K}`,onMouseEnter:()=>V(D),onFocus:()=>V(D),onClick:()=>P(D),onKeyDown:(I)=>{if(I.key==="Enter"||I.key===" ")I.preventDefault(),P(D)}},L("circle",{className:"stat-hit-point",cx:D.x,cy:D.y,r:13}),L("circle",{className:`stat-point ${B.className} ${v?"active":""}`,cx:D.x,cy:D.y,r:v?5.6:4.2}))}));return L(hi,{title:"统计曲线",eyebrow:`Daily task stats / ${u}`,className:`codex-stats-panel ${F.state}`,summary:L("span",null,`${an(A.startDate)} -> ${an(A.endDate)} · ${l?.timezone||"Asia/Shanghai"} · ${j}`),actions:ol(l)?L(v2,{title:"Code Queue Stats",data:l,onOpen:r,testId:"raw-codex-stats"}):null},L("div",{className:"codex-stats-hero","data-testid":"codex-stats-panel","data-stats-state":F.state,"data-stats-degraded":F.degraded===!0?"true":"false"},L(yO),L("div",null,L("strong",null,`${pu(n.executedTasks)} tasks / ${pu(n.retryAttempts)} retries`),L("span",null,`平均完成耗时 ${ln(n.avgDurationMs??void 0)} · 终态 ${pu(n.completedTasks)} 个`))),F.degraded===!0?L("div",{className:`codex-stats-diagnostic ${F.state}`,"data-testid":"codex-stats-diagnostic"},L("b",null,j),L("span",null,N),l?.source?L("code",null,`source=${String(l.source)}`):null):null,L("div",{className:`codex-stats-chart ${_?"has-data":"no-data"}`,"data-testid":"codex-stats-chart","data-empty":_?"false":"true",onMouseLeave:()=>G(null)},L("svg",{viewBox:`0 0 ${Mi} ${WQ}`,preserveAspectRatio:"none",role:"img","aria-label":"Code Queue daily task statistics"},L("line",{className:"axis",x1:bt,x2:Mi-bt,y1:U1,y2:U1}),L("line",{className:"grid",x1:bt,x2:Mi-bt,y1:_y+R2/2,y2:_y+R2/2}),L("line",{className:"grid",x1:bt,x2:Mi-bt,y1:_y,y2:_y}),L("polyline",{className:"stat-line tasks",points:X2(f,"executedTasks",i)}),L("polyline",{className:"stat-line retry",points:X2(f,"retryAttempts",y)}),L("polyline",{className:"stat-line duration",points:X2(f,"avgDurationMs",c)}),W?L("g",{className:"stat-cursor-layer","data-testid":"codex-stats-active-point"},L("line",{className:"stat-cursor",x1:W.x,x2:W.x,y1:_y,y2:U1}),L("circle",{className:`stat-point-active ${W.className}`,cx:W.x,cy:W.y,r:8})):null,L("g",{className:"stat-point-layer"},H)),W?L("div",{className:"codex-stats-tooltip active",style:Z,"data-testid":"codex-stats-tooltip"},L("b",null,an(W.row?.date)),L("span",null,`${W.label} · ${W.valueLabel}`),L("code",null,`${pu(W.row?.executedTasks)} exec / ${pu(W.row?.retryAttempts)} retry / ${ln(W.row?.avgDurationMs??void 0)}`)):null,!_?L("div",{className:"codex-stats-chart-empty","data-testid":"codex-stats-empty"},L("strong",null,j),L("span",null,U)):null,L("div",{className:"codex-stats-legend"},L("span",{className:"tasks"},"执行任务"),L("span",{className:"retry"},"重试次数"),L("span",{className:"duration"},"平均耗时")),L("div",{className:"codex-stats-scale"},L("span",null,an(f[0]?.date)),L("span",null,m.join(" · ")||"暂无峰值"),L("span",null,an(f.at(-1)?.date))),L("div",{className:`codex-stats-focus ${W?"active":""}`,"data-testid":"codex-stats-focus"},W?L(w1.default.Fragment,null,L("div",null,L("strong",null,an(W.row?.date)),L("span",null,`${W.label} · ${W.valueLabel}`)),L("div",{className:"codex-stats-focus-metrics"},L("code",null,`${pu(W.row?.executedTasks)} exec`),L("code",null,`${pu(W.row?.retryAttempts)} retry`),L("code",null,ln(W.row?.avgDurationMs??void 0)))):L("span",null,U))),L("div",{className:"codex-stats-summary-grid"},L("article",null,L("span",null,"今日执行"),L("strong",null,String(pu(t.executedTasks))),L("code",null,an(t.date))),L("article",null,L("span",null,"今日重试"),L("strong",null,String(pu(t.retryAttempts))),L("code",null,`累计 ${pu(n.retryAttempts)}`)),L("article",null,L("span",null,"平均耗时"),L("strong",null,ln(n.avgDurationMs??void 0)),L("code",null,`${pu(n.durationSamples)} samples`))),L("div",{className:"codex-stats-daily-list","data-testid":"codex-stats-daily-list"},f.length===0?L("div",{className:`codex-stats-daily-row empty ${F.state}`,"data-testid":"codex-stats-day-empty"},L("span",null,j),L("b",null,N),L("b",null,"--"),L("code",null,F.state==="empty"?"true empty":"diagnostic")):f.slice(-7).map((B)=>L("div",{key:String(B?.date||""),className:`codex-stats-daily-row ${O===String(B?.date||"")?"active":""}`,"data-testid":`codex-stats-day-${String(B?.date||"unknown")}`},L("span",null,an(B?.date)),L("b",null,`${pu(B?.executedTasks)} exec`),L("b",null,`${pu(B?.retryAttempts)} retry`),L("code",null,ln(B?.avgDurationMs??void 0))))))}function _O({task:l,queueRows:u,busy:r,onMove:f}){let n=String(l?.id||""),t=Fy(l),[i,y]=kl(t);df(()=>{y(t)},[n,t]);let c=!n||r||["running","judging","retry_wait"].includes(String(l?.status||""));return L("div",{className:"codex-task-move-control","data-testid":"codex-task-queue-move-control"},L("label",null,"任务 queue",L("select",{value:i,disabled:!n||r,onChange:(_)=>y(String(_.target.value||t)),"data-testid":"codex-task-queue-move-select"},u.map((_)=>L("option",{key:String(_?.id||""),value:String(_?.id||"")},j1(_))))),L("button",{type:"button",className:"ghost-btn",disabled:c||i===t,onClick:()=>f(i),title:c?"运行中 / judging / retry_wait 的任务不能移动;请先打断或等当前 turn 结束":"移动已创建任务到另一个 queue","data-testid":"codex-task-queue-move-button"},"移动"))}function zQ(l,u=4){let r=(Array.isArray(l)?l:[]).map((n)=>String(n||"").trim()).filter(Boolean);if(r.length===0)return"--";let f=r.slice(0,u).join(" / ");return r.length>u?`${f} +${r.length-u}`:f}function AO({task:l,loading:u,onLoadPromptPart:r,testId:f="codex-initial-prompt-full",textTestId:n="codex-initial-prompt-full-text",baseTextTestId:t="codex-initial-prompt-base"}){let i=I2(l),y=p3(l),c=K3(l).trimEnd(),_=String(y.full?.text||""),A=pz(l),F=Number(i.promptChars||l?.promptChars||_.length),j=Number(i.basePromptLines||si(c)),N=Number(i.promptLines||si(_));return L("section",{className:"codex-progressive-card codex-progressive-prompt","data-testid":"codex-progressive-prompt"},L("div",{className:"codex-progressive-card-head"},L("span",{className:"codex-output-channel"},"Prompt"),L("strong",null,"Submitted prompt / 原始用户 prompt"),L("code",null,`${j||si(c)} lines / ${c.length} chars`)),L("pre",{className:"codex-prompt-full","data-testid":t},c||"空 prompt"),A?L("details",{className:"codex-reference-injection codex-progressive-full-prompt","data-testid":f,onToggle:(U)=>{if(U.currentTarget?.open&&!_)r?.("full")}},L("summary",null,L("span",null,"引用注入已折叠,点击按需拉取最终进入 Code agent 的完整 prompt"),L("code",null,_?`${N||si(_)} lines / ${_.length} chars`:`${Number.isFinite(F)&&F>0?F:"--"} chars`)),L("pre",{className:"codex-prompt-full codex-prompt-final-full","data-testid":n},_||(u?"正在按需拉取完整 prompt...":"展开后将只请求 full prompt,不拉取完整 transcript。"))):null)}function dQ({task:l,attempt:u,attemptIndex:r,loading:f,onLoadSteps:n,onLoadStep:t,testId:i="codex-execution-summary"}){let y=Pz(sQ(l,r)),c=Cz(Gz(l,u)),_=u?Nz(l,u):a2(l),A=s2(l),F=E3(l,r),j=un(_?.errorCount),N=YQ(y.length>0?y.length:null,u?.stepCount,u?.execution?.stepCount,c.traceLineCount,c.stepCount,u?.outputCount),U=un(_?.stepCount??_?.llmStepCount),w=U??N,G=un(_?.readCount),J=un(_?.editCount),Q=un(_?.runCount),m=U??N,q=U!==null?"oa-event-flow":N!==null?"raw-trace":vt(l)?"syncing":"unavailable",W=w===null?q==="syncing"?"sync":"N/A":String(w),p=m===null?q==="syncing"?"sync":"N/A":`${m}${q==="raw-trace"?" raw":""}`,O=q==="oa-event-flow"?"STEP 来自 OA Event Flow 统计中心":q==="raw-trace"?"OA STEP 统计不可用,当前显示 raw trace fallback 行数":q==="syncing"?"STEP 统计同步中;展开后会按需读取当前 attempt trace":"当前 attempt 没有可用 STEP 统计",Z=Array.isArray(c.editedFiles)?c.editedFiles:[],V=Array.isArray(c.commands)?c.commands:[],H=d2(u,r)?` · ${String(u?.label||"recovered thread execution")}`:r?` #${r}`:"",B=Wz(l,u,r,c),C=`最近更新: ${J1(B)}`,E=Kz(l,u,r);return L("details",{className:`codex-progressive-card codex-execution-summary ${E?"running":""}`,"data-testid":i,"data-attempt-index":B3(r),"data-running":E?"true":"false",onToggle:(D)=>{if(D.currentTarget?.open&&!F)n?.(r)}},L("summary",null,L("div",{className:"codex-progressive-card-head"},L("span",{className:"codex-output-channel"},"Summary"),L("strong",null,`执行过程摘要${H}`),E?L("span",{className:"codex-summary-running-pill","data-testid":`${i}-running`},"执行中"):null,L("code",{title:`${B?`最近更新: ${Ll(B)}`:C};${O}`},`${ln(c.durationMs??c.totalElapsedMs)} / ${W} tools / ${C}`)),L("div",{className:"codex-execution-digest"},L("span",{title:"来自 OA Event Flow 统计中心"},`read ${G===null?"--":G}`),L("span",{title:"来自 OA Event Flow 统计中心"},`edit ${J===null?"--":J}`),L("span",{title:"来自 OA Event Flow 统计中心"},`run ${Q===null?"--":Q}`),L("span",{title:O,"data-testid":`${i}-step-count`,"data-step-state":q},`STEP ${p}`),j!==null&&j>0?L("span",{className:"codex-execution-error-pill","data-testid":`${i}-error-count`},`Error ${j}`):null)),L("div",{className:"codex-execution-digest expanded"},L("span",null,`修改文件:${zQ(Z,6)}`),L("span",null,`执行命令:${zQ(V,4)}`)),y.length===0?L("div",{className:"codex-output-empty"},f?"正在按需拉取步骤 summary...":"展开后将只请求执行步骤 summary,不拉取单步骤全量。"):L("div",{className:"codex-trace-step-list"},y.map((D)=>{let Y=String(D?.seq??""),v=A[Y],K=Array.isArray(D?.summaryLines)?D.summaryLines.slice(0,4):[],X=K.find((I)=>String(I||"").trim().length>0);return L("details",{key:Y||`${D?.title}-${D?.at}`,className:`codex-trace-step ${String(D?.kind||"message")} ${Zz(D)?"error":""}`,"data-testid":`codex-trace-step-${Y||"unknown"}`,onToggle:(I)=>{if(I.currentTarget?.open&&!v)t?.(D?.seq)}},L("summary",null,L("span",{className:"codex-output-channel"},FO(D?.kind)),L("strong",null,String(D?.title||"Trace step")),D?.status?L("code",null,String(D.status)):null,X?L("span",{className:"codex-trace-step-inline-summary",title:String(X)},String(X)):null,L("time",null,Ll(D?.at))),L("div",{className:"codex-trace-step-summary"},K.length>0?K.map((I,o)=>L("pre",{key:`${Y}-${o}`},String(I||""))):L("span",null,"无 summary")),v?.line?L(w3,{items:[v.line],autoScroll:!1,loading:!1,hasDetail:!0,emptyText:"无步骤详情",testId:`codex-trace-step-detail-${Y||"unknown"}`,className:"codex-transcript codex-step-detail-transcript",collapseTools:!1}):L("div",{className:"codex-output-empty"},f?"正在按需拉取这个步骤的全量数据...":"展开后将只请求这个单步骤的全量数据。"))})))}function FO(l){let u=String(l||"");if(u==="ran")return"Ran";if(u==="explored")return"Explored";if(u==="edited")return"Edited";if(u==="error")return"Error";if(u==="system")return"System";return"Message"}function eQ({task:l,attempt:u,attemptIndex:r,testId:f="codex-final-response"}){let n=Tz(l,u);if(n.length===0)return null;let t=Number(u?.finalResponseChars||n.length),i=r?` #${r}`:"";return L("section",{className:"codex-progressive-card codex-final-response","data-testid":f,"data-attempt-index":B3(r)},L("div",{className:"codex-progressive-card-head"},L("span",{className:"codex-output-channel"},"Final"),L("strong",null,`最终 response${i}`),L("code",null,`${Number.isFinite(t)?t:n.length} chars`)),L(c1,{markdown:n,className:"codex-transcript-body codex-markdown",testId:`${f}-markdown`}))}function lm({task:l,attempt:u,attemptIndex:r,testId:f="codex-progressive-judge"}){let n=hQ(l,u,r);if(!n?.decision)return null;let t=r?` #${r}`:"";return L("section",{className:"codex-progressive-card codex-progressive-judge","data-testid":f,"data-attempt-index":B3(r)},L("div",{className:"codex-progressive-card-head"},L("span",{className:"codex-output-channel"},"Judge"),L("strong",null,`完成判定${t}`),L("code",null,`${n.decision} ${Math.round(Number(n.confidence||0)*100)}%`)),L("div",{className:"codex-judge-card","data-testid":`${f}-card`},L(Ri,{status:n.decision},n.decision),L("strong",null,`${Math.round(Number(n.confidence||0)*100)}% confidence`),L("p",{"data-testid":`${f}-reason`},n.reason||"--"),L(CQ,{judge:n,testId:`${f}-failure-details`}),n.continuePrompt?L("pre",{"data-testid":`${f}-continue-prompt`},String(n.continuePrompt||"")):null))}function jO({task:l,attempt:u,attemptIndex:r,loading:f,onLoadPromptPart:n,testId:t="codex-judge-feedback-prompt"}){let i=Ez(l,u,r);if(i===null)return null;let y=MQ(r),_=p3(l)[y],A=String(_?.text||"").trimEnd(),F=String(i.preview||i.text||"").trimEnd(),j=A||String(i.text||"").trimEnd(),N=Number(_?.chars||i.chars||j.length||F.length),U=Number(_?.lines||i.lines||si(j||F)),w=_?.forAttempt||i.forAttempt||Number(r||0)+1;return L("details",{className:"codex-progressive-card codex-judge-feedback-prompt","data-testid":t,"data-attempt-index":B3(r),onToggle:(G)=>{if(G.currentTarget?.open&&!A)n?.("feedback",r)}},L("summary",null,L("div",{className:"codex-progressive-card-head"},L("span",{className:"codex-output-channel"},"Prompt"),L("strong",null,`judge feedback prompt #${r} -> #${w}`),L("code",null,`${U||"--"} lines / ${Number.isFinite(N)?N:F.length} chars`)),L("p",{className:"codex-feedback-preview","data-testid":`${t}-preview`},F||"展开后按需拉取 judge feedback prompt。")),L("pre",{className:"codex-prompt-full codex-feedback-full","data-testid":`${t}-text`},j||(f?"正在按需拉取 judge feedback prompt...":"展开后将只请求这一次 judge feedback prompt。")))}function NO({task:l,attempt:u,position:r,loading:f,onLoadPromptPart:n,onLoadSteps:t,onLoadStep:i}){let y=hz(u,r),c=o2(l,y),_=r===0&&!c,A=d2(u,y),F=A?String(u?.label||"Recovered thread execution"):`Attempt ${y}`;return L("section",{className:"codex-attempt-cycle","data-testid":`codex-attempt-cycle-${y}`},L("div",{className:"codex-attempt-cycle-head"},L("span",{className:"codex-output-channel"},F),L("strong",null,String(u?.mode||(y<=1?"initial":"retry"))),u?.terminalStatus?L(Ri,{status:u.terminalStatus},u.terminalStatus):null,L("code",null,`${Ll(u?.startedAt)} -> ${Ll(u?.finishedAt)}`)),L(dQ,{task:l,attempt:u,attemptIndex:y,loading:f,onLoadSteps:t,onLoadStep:i,testId:c?"codex-execution-summary-current":_?"codex-execution-summary":`codex-execution-summary-attempt-${y}`}),A?null:L(eQ,{task:l,attempt:u,attemptIndex:y,testId:c?"codex-final-response-current":_?"codex-final-response":`codex-final-response-attempt-${y}`}),A?null:L(lm,{task:l,attempt:u,attemptIndex:y,testId:c?"codex-progressive-judge-current":_?"codex-progressive-judge":`codex-progressive-judge-attempt-${y}`}),A?null:L(jO,{task:l,attempt:u,attemptIndex:y,loading:f,onLoadPromptPart:n,testId:c?"codex-judge-feedback-prompt-current":_?"codex-judge-feedback-prompt":`codex-judge-feedback-prompt-attempt-${y}`}))}function JO({task:l,loading:u,onLoadPromptPart:r,onLoadSteps:f,onLoadStep:n}){if(!l)return L(Ny,{title:"未选择任务",text:"从左侧队列选择任务,或提交新 Codex 任务。"});let t=Lz(l);return L("div",{className:"codex-transcript codex-progressive-trace","data-testid":"codex-output"},u&&!Jr(l)?L("div",{className:"codex-output-empty"},"正在加载 Trace Summary..."):null,L(AO,{task:l,loading:u,onLoadPromptPart:r}),t.length>0?t.map((i,y)=>L(NO,{key:`${i?.index||y+1}-${i?.startedAt||y}`,task:l,attempt:i,position:y,loading:u,onLoadPromptPart:r,onLoadSteps:f,onLoadStep:n})):[L(dQ,{key:"execution",task:l,loading:u,onLoadSteps:f,onLoadStep:n}),L(eQ,{key:"final",task:l}),L(lm,{key:"judge",task:l})])}function UO({task:l}){let u=cz(l);if(!l||u.length===0)return L(Ny,{title:"暂无原始消息",text:"原始 Codex app-server 消息会保留在任务 JSON 中。"});return L("details",{className:"codex-raw-output"},L("summary",null,`原始 messages (${u.length})`),L("div",null,u.map((r)=>L("article",{key:`${r.seq}-${r.channel}`,className:`codex-output-line ${r.channel||"system"}`},L("div",{className:"codex-output-meta"},L("span",{className:"codex-output-channel"},xz(String(r.channel||"system"))),L("span",null,Ll(r.at)),r.method?L("code",null,r.method):null),L("pre",null,String(r.text||""))))))}function QO({task:l}){let u=$z(l).slice().reverse();if(u.length===0)return L(Ny,{title:"尚无 attempt",text:"任务开始运行后,这里会记录 Codex 终态、传输中断和 stderr tail。"});return L("div",{className:"table-wrap codex-attempt-table"},L("table",null,L("thead",null,L("tr",null,L("th",null,"#"),L("th",null,"模式"),L("th",null,"终态"),L("th",null,"传输"),L("th",null,"退出"),L("th",null,"完成时间"))),L("tbody",null,u.map((r)=>L("tr",{key:`${r.index}-${r.startedAt}`},L("td",null,r.index),L("td",null,r.mode),L("td",null,L(Ri,{status:r.terminalStatus||"unknown"},r.terminalStatus||"unknown")),L("td",null,r.transportClosedBeforeTerminal?L(Ri,{status:"failed"},"closed-before-terminal"):L(Ri,{status:"succeeded"},"normal")),L("td",null,`code=${r.appServerExitCode??"--"} signal=${r.appServerSignal??"--"}`),L("td",null,Ll(r.finishedAt)))))))}function um({microservices:l,onRaw:u,apiBaseUrl:r="/api",initialTasksData:f=null,standalone:n=!1}){let t=l.find((z)=>z.id==="code-queue")||null,i=EQ(f),y=String(i?.id||""),c=new Map;if(i!==null&&y.length>0)c.set(y,{task:i,maxSeq:F1(Array.isArray(i.transcript)?i.transcript:[]),complete:Boolean(i._transcriptComplete),completeUpdatedAt:i._transcriptComplete?String(i.updatedAt||""):""});let _=typeof performance>"u"?0:performance.now(),A=xu(y),F=xu(0),j=xu(0),N=xu(0),U=xu(!1),w=xu(!1),G=xu(!1),J=xu(null),Q=xu(new Map),m=xu(new Map),q=xu(new Map),W=xu(new Map),p=xu(new Set),O=xu(null),Z=xu(null),V=xu(!1),P=xu(!1),H=xu(Boolean(f)),B=xu(new Map),C=xu(new Set),E=xu(c),D=xu(f),[Y,v]=kl(null),[K,X]=kl(f),[I,o]=kl(ol(f?.statistics)),[fl,yl]=kl(y),[h,s]=kl(i),[ul,tl]=kl(!1),[Al,Kl]=kl(""),[wl,El]=kl(null),[M,d]=kl(!1),[nl,k]=kl(!1),g=f?.queue||{},cl=String(g?.mainProviderId||g?.defaultProviderId||"D601").trim()||"D601",[pl,Hl]=kl(""),[bl,_u]=kl(""),[tu,Nu]=kl("default"),[gl,zr]=kl(dn),[nf,lr]=kl(!1),[tf,Or]=kl(""),[Nl,al]=kl(cl),[gu,hl]=kl("default"),[yr,Zr]=kl("gpt-5.5"),[cr,ku]=kl(N1(g,"default",cl)||"/workspace"),[Gf,Vn]=kl(99),[Rr,ay]=kl(1),[_t,At]=kl(!1),[e,Dl]=kl(!1),[Cl,lu]=kl(""),[mu,au]=kl(""),[yu,ur]=kl(""),[Sn,Z8]=kl(!0),[oy,dy]=kl(()=>typeof window>"u"?!0:window.matchMedia(op).matches),[Tu,K$]=kl(!1),[H8,ju]=kl(""),[wj,Su]=kl(""),{addNotification:mr}=Xr(),[A0,E$]=kl(""),[ey,p$]=kl(""),[lc,z$]=kl(!1),[O$,Ft]=kl(null),[F0,j0]=kl(!1),[xr,Wf]=kl(f?{phase:"complete",taskId:y,queueMs:0,detailMs:0,totalMs:_,chunks:i?1:0,transcriptRows:Array.isArray(i?.transcript)?i.transcript.length:0,partial:Boolean(f?.selected?.hasMore||A1(i)),completedAt:new Date}:null),[Z$,N0]=kl(f?new Date:null),[uc,rc]=kl(!1),$n=An(Cu(K)),H$=$n.filter(on),Ou=K?.queue||Y?.body?.queue||Y?.queue||{},B8=kp(Ou,Y),D8=I||gz(K,Ou),B$=Ln(K),hf=NQ(Ou,tu),Ui=String(tu||"default").trim()||"default",jt=hf.filter((z)=>String(z?.id||"")!==Ui),J0=Ay(hf,gl),Nt=Number((Cr(gl)?Ou?.total:J0?.total)??B$.total??$n.length),fc=$y(Ou),qj=Cr(gl)?fc:[String(Ay(hf,gl)?.activeTaskId||"")].filter(Boolean),Yn=JQ(Ou,hf,gl,$n),Lj=Cr(gl)?D2(Ou):D2(J0||{}),D$=D2(Ou),V$=bz(D$),NW=Math.max(vz(D$),fc.length),JW=pu((Cr(gl)?Ou?.unreadTerminal:J0?.unreadTerminal)??H$.length),U0=K?H$.length:JW,S$=Cr(gl)?"All queues":M2(J0||{id:gl,name:gl}),Q0=h2(Al),yf=Q0.length>0,Gj=yf?An(Cu(wl)):[],V8=Ln(wl),_n=yf?Gj:$n,Wj=_n.filter(on),UW=_n.filter((z)=>!ef(z)).sort(vp),QW=_n.filter((z)=>ef(z)&&!on(z)),Tj=yf?V8:B$,m0=yf?Number(V8.total??Gj.length):Nt,Kj=Tj.hasMore===!0&&String(Tj.nextBeforeId||"").length>0,S8=yf?nl:uc,mW=t?Rp(t):{},wW=t?xp(t):{},Y8=AQ(()=>_z(pl),[pl]),Xn=AQ(()=>{let z=mQ(Rr);return Y8.flatMap((S)=>Array.from({length:z},()=>Az(S,bl)))},[Y8,Rr,bl]),nc=Xn.length,Ej=nc>1&&!_t,qW=e||Tu||nc===0||Ej,pj=uO(Ou,yr),Y$=rO(Ou,Nl),zj=fO(Ou,gu),Oj=N1(Ou,gu,Nl),LW=Array.isArray(O$?.workdirs)?O$.workdirs:[],Zj=tO(Ou,LW,Nl,gu,cr),X8=Zj.some((z)=>z.source==="saved"&&jy(z.path)===jy(cr)),P8=h?.id&&h?.activeTurnId&&String(h?.status)==="running",GW=h?.id&&!["succeeded","failed","canceled"].includes(String(h?.status||"")),WW=h?.id&&["succeeded","failed","canceled"].includes(String(h?.status||"")),w0=h?.id&&vQ(h);function Hr(z){let S=typeof z==="function"?z(D.current):z;D.current=S;let a=ol(S?.statistics);if(a)o(a);return X(S),S}async function Hj(z=gl){if(!t)return;try{let S=await uz(r,z),a=ol(S?.statistics)||ol(S?.stats)||ol(S);if(a)o(a);if(S?.queue)Hr((rl)=>rl?{...rl,queue:S.queue}:{ok:!0,queue:S.queue,tasks:[],pagination:{returned:0,total:0,hasMore:!1}})}catch(S){o(GQ(S))}}function TW(z,S,a=!0){let rl=Array.from(new Set(z.map((jl)=>String(jl||"")).filter(Boolean)));for(let jl of rl)if(B.current.set(jl,S),a)C.current.add(jl);return rl}function Bj(z){for(let S of z.map((a)=>String(a||"")).filter(Boolean))B.current.delete(S),C.current.delete(S)}function X$(z){let S=String(z?.id||""),a=S?B.current.get(S):void 0;if(!a)return z;if(String(z?.status||"").length>0&&!ef(z))return B.current.delete(S),C.current.delete(S),z;return{...z,readAt:z?.readAt||a,terminalUnread:!1}}function C8(z){let S=String(z?.id||"");return S.length>0&&C.current.has(S)&&ef(z)}function An(z,S=!0){let a=[];for(let rl of Array.isArray(z)?z:[]){let jl=X$(rl);if(S&&C8(jl))continue;a.push(jl)}return a}function KW(z,S=!0){if(!z||!Array.isArray(z?.tasks))return z;let a=An(Cu(z),S),rl=Ln(z);return{...z,tasks:a,pagination:z.pagination?{...rl,returned:a.length}:z.pagination}}function h8(z,S){return Cr(S)||Fy(z)===S}function M8(z){let S=Q0.toLowerCase();if(S.length===0)return!0;return[z?.id,z?.status,z?.queueId,z?.providerId,z?.model,z?.cwd,z?.displayPrompt,z?.basePrompt,z?.prompt,T3(z?.displayPromptPreview),T3(z?.basePromptPreview),T3(z?.promptPreview),z?.finalResponse,z?.lastError?.message].map((rl)=>String(rl||"").toLowerCase()).join(` -`).includes(S)}function EW(z,S){let a=z.filter((Zl)=>String(Zl?.id||"").length>0);if(a.length===0&&!S)return;let rl=a[0]||null,jl=String(rl?.id||""),Wl=a.filter((Zl)=>h8(Zl,gl)),Gl=Wl.filter(M8),sl=String(S?.activeTaskId||$y(S)[0]||jl||Yn||"");for(let Zl of a){let Yl=String(Zl?.id||"");if(!Yl)continue;let Rl=Array.isArray(Zl?.transcript)?Zl.transcript:[];E.current.set(Yl,{...E.current.get(Yl)||{},task:{...Zl,_summaryLoaded:!0,_detailLoaded:Rl.length>0,_transcriptComplete:!1,_transcriptPreview:!1},maxSeq:F1(Rl),complete:!1,completeUpdatedAt:""})}if(Hr((Zl)=>{if(!Zl&&(Wl.length===0||!S))return Zl;let Yl=Cu(Zl),Rl=An(Gn([Yl,Wl],sl));return{...Zl||{},queue:S||Zl?.queue,tasks:Rl,pagination:Zl?.pagination?{...Ln(Zl),returned:Rl.length}:Zl?.pagination}}),yf)El((Zl)=>{if(!Zl||Gl.length===0)return Zl;let Yl=An(Gn([Cu(Zl),Gl],sl));return{...Zl,queue:S||Zl.queue,tasks:Yl,pagination:Zl.pagination?{...Ln(Zl),returned:Yl.length}:Zl.pagination}});if(rl&&h8(rl,gl)&&M8(rl))N.current+=1,A.current=jl,yl(jl),s(E.current.get(jl)?.task||rl),tl(!1),Wf({phase:"complete",taskId:jl,queueMs:0,detailMs:0,totalMs:0,chunks:1,transcriptRows:Array.isArray(rl?.transcript)?rl.transcript.length:0,partial:!0,completedAt:new Date});N0(new Date)}function pW(z){let S=String(z||Ou?.mainProviderId||"D601").trim()||"D601";al(S),ku(N1(Ou,gu,S)),Ft(null),b8().catch((a)=>ju(Hu(a,"加载工作目录失败")))}function zW(z){let S=String(z||"default").trim()||"default",a=Nl;if(S==="windows-native"){if(!Y$.find((jl)=>jl.id===Nl)?.supportsWindowsNativeCodex)a=String(Y$.find((jl)=>jl.supportsWindowsNativeCodex)?.id||Nl||"D601"),al(a)}hl(S),ku(N1(Ou,S,a)),Ft(null),b8().catch((rl)=>ju(Hu(rl,"加载工作目录失败")))}function P$(z,S,a=null,rl=null){let jl=new Set(TW(z,S));if(jl.size===0&&rl===null&&a===null)return;Hr((Wl)=>{if(!Wl)return Wl;let Gl=Cu(Wl).flatMap((sl)=>{let Zl=String(sl?.id||"");if(!jl.has(Zl)){let Au=X$(sl);return C8(Au)?[]:[Au]}let Yl=rl&&String(rl?.id||"")===Zl?rl:{},Rl={...sl,...Yl,readAt:S,terminalUnread:!1};return C8(Rl)?[]:[Rl]});return{...Wl,queue:a||Wl.queue,tasks:jl.size>0?Gn([Gl],Yn):Gl}});for(let Wl of jl){let Gl=E.current.get(Wl);if(Gl?.task){let sl=rl&&String(rl?.id||"")===Wl?rl:{},Zl={...Gl.task,...sl,readAt:S,terminalUnread:!1};if(E.current.set(Wl,{...Gl,task:Zl}),A.current===Wl)s(Zl)}}}df(()=>{At(!1)},[pl,Rr,bl]),df(()=>{let z=h2(Al);j.current+=1;let S=j.current;if(!t||z.length===0){El(null),d(!1),k(!1),G.current=!1;return}d(!0),El(null);let a=window.setTimeout(()=>{(async()=>{try{let rl=await UQ(r,gl,z);if(S!==j.current)return;El(KW(rl))}catch(rl){if(S===j.current)El(null),ju(Hu(rl,"搜索 Codex tasks 失败"))}finally{if(S===j.current)d(!1)}})()},240);return()=>window.clearTimeout(a)},[t?.id,r,gl,Al]),df(()=>{au(h?K3(h):""),ur(Array.isArray(h?.referenceTaskIds)?h.referenceTaskIds.join(" "):"")},[fl]);function Mf(z,S,a){let rl=E.current.get(z)||{},jl=rl.task||{},Wl=Array.isArray(jl.transcript)?jl.transcript:[],Gl=KQ(jl,S),sl=Object.prototype.hasOwnProperty.call(S,"transcript")?P2(Wl,Array.isArray(S.transcript)?S.transcript:[]):Wl,Zl={...jl,...Gl,transcript:sl,output:Array.isArray(Gl.output)?x2(jl,Gl,"output"):Array.isArray(jl.output)?jl.output:[],events:Array.isArray(Gl.events)?x2(jl,Gl,"events"):Array.isArray(jl.events)?jl.events:[]},Yl=X$(Zl),Rl=String(Yl?.updatedAt||""),Au=Boolean(S._transcriptComplete)&&ef(Yl),rr=Boolean(rl.complete)&&ef(Yl)&&String(rl.completeUpdatedAt||"")===Rl,fu=Au||rr,$r={...rl,task:Yl,maxSeq:F1(sl),complete:fu,completeUpdatedAt:fu?Rl:""};if(E.current.set(z,$r),a===N.current&&A.current===z)s(Yl);return $r}async function Jt(z,S=!1,a,rl){if(!t||!z)return;let Wl=E.current.get(z)?.task;if(!S&&G3(Wl))return;let Gl=z,sl=Q.current.get(Gl);if(sl){if(S||!G3(Wl))sl.refreshAfter=!0;return sl.promise}let Zl=N.current,Yl=performance.now();if(A.current===z)tl(!0);let Rl={promise:Promise.resolve(),refreshAfter:!1},Au=(async()=>{try{let rr=await rz(r,z);if(Zl!==N.current||A.current!==z)return;let fu=rr?.summary||{},$r=String(fu.updatedAt||"");Mf(z,{id:z,status:fu.status,updatedAt:$r,startedAt:fu.startedAt,finishedAt:fu.finishedAt,currentAttempt:fu.currentAttempt,maxAttempts:fu.maxAttempts,finalResponse:fu.finalResponse,lastJudge:fu.lastJudge,lastError:fu.lastError,attempts:Array.isArray(fu.attempts)?fu.attempts:[],stepCount:fu.stepCount,llmStepCount:fu.llmStepCount,traceStats:fu.traceStats,statsSource:fu.statsSource,timing:fu.timing,_traceSummary:fu,_traceSummaryLoaded:!0,_traceSummaryUpdatedAt:$r,_detailLoaded:!0},Zl),Wf({phase:"complete",taskId:z,queueMs:rl??0,detailMs:performance.now()-Yl,totalMs:a===void 0?performance.now()-Yl:performance.now()-a,chunks:1,transcriptRows:Number(fu?.execution?.traceLineCount||fu?.execution?.stepCount||0),partial:!1,completedAt:new Date})}finally{let rr=Boolean(Rl.refreshAfter&&A.current===z&&!G3(E.current.get(z)?.task));if(Q.current.delete(Gl),Zl===N.current&&A.current===z)tl(!1);if(rr)window.setTimeout(()=>{Jt(z,!0).catch((fu)=>ju(Hu(fu,"自动刷新 Trace Summary 失败")))},0)}})();Rl.promise=Au,Q.current.set(Gl,Rl),await Au}async function OW(z,S=null){let a=A.current;if(!t||!a||!z)return;let rl=E.current.get(a)?.task,jl=p3(rl),Wl=z==="feedback"||z==="judge-feedback"?MQ(S):z;if(jl[Wl]?.text)return;let Gl=`${a}:${Wl}`,sl=m.current.get(Gl);if(sl)return sl;let Zl=N.current;if(A.current===a)tl(!0);let Yl=(async()=>{try{let Rl=await fz(r,a,z,S);if(Zl!==N.current||A.current!==a)return;let Au=E.current.get(a)?.task,rr=p3(Au);Mf(a,{...z==="full"?{prompt:String(Rl?.text||""),promptChars:Number(Rl?.chars||0)}:{},_promptDetails:{...rr,[Wl]:Rl}},Zl)}finally{if(m.current.delete(Gl),Zl===N.current&&A.current===a)tl(!1)}})();m.current.set(Gl,Yl),await Yl}async function C$(z=null,S={}){let a=A.current;if(!t||!a)return;let rl=E.current.get(a)?.task,jl=z===null||z===void 0||String(z).length===0?"":String(z),Wl=E3(rl,jl||null),Gl=Boolean(S.force),sl=Boolean(S.incremental);if(Wl&&!Gl)return;let Zl=sQ(rl,jl||null),Yl=sl&&Zl.length>0?zz(Zl):0,Rl=`${a}:${jl||"all"}:${Yl}`,Au=q.current.get(Rl);if(Au)return Au;let rr=N.current;if(A.current===a)tl(!0);let fu=(async()=>{try{let $r=await nz(r,a,Yl,500,jl||null);if(rr!==N.current||A.current!==a)return;let Fn=Array.isArray($r?.steps)?$r.steps:[],Pn=Yl>0?Oz(Zl,Fn):Fn;if(jl){let Ut=E.current.get(a)?.task,q0=ol(Ut?._traceStepsByAttempt)||{},sf=ol(Ut?._traceStepsLoadedByAttempt)||{},Tf=ol(Ut?._traceStepsNextAfterSeqByAttempt)||{};Mf(a,{_traceStepsByAttempt:{...q0,[jl]:Pn},_traceStepsLoadedByAttempt:{...sf,[jl]:!0},_traceStepsNextAfterSeqByAttempt:{...Tf,[jl]:$r?.nextAfterSeq}},rr)}else Mf(a,{_traceSteps:Pn,_traceStepsLoaded:!0,_traceStepsHasMore:Boolean($r?.hasMore),_traceStepsNextAfterSeq:$r?.nextAfterSeq},rr)}finally{if(q.current.delete(Rl),rr===N.current&&A.current===a)tl(!1)}})();q.current.set(Rl,fu),await fu}async function ZW(z){let S=A.current,a=String(z??"");if(!t||!S||a.length===0)return;let rl=E.current.get(S)?.task;if(s2(rl)[a]?.line)return;let Wl=`${S}:${a}`,Gl=W.current.get(Wl);if(Gl)return Gl;let sl=N.current;if(A.current===S)tl(!0);let Zl=(async()=>{try{let Yl=await tz(r,S,z);if(sl!==N.current||A.current!==S)return;let Rl=E.current.get(S)?.task,Au=s2(Rl);Mf(S,{_traceStepDetails:{...Au,[a]:Yl}},sl)}finally{if(W.current.delete(Wl),sl===N.current&&A.current===S)tl(!1)}})();W.current.set(Wl,Zl),await Zl}function HW(z){if(A.current!==z)return;let S=E.current.get(z)?.task;if(!S)return;if(E3(S,null))C$(null,{force:!0,incremental:!0}).catch((rl)=>ju(Hu(rl,"增量刷新 Trace Steps 失败")));let a=ol(S?._traceStepsLoadedByAttempt)||{};for(let rl of Object.keys(a).filter((jl)=>a[jl]))C$(rl,{force:!0,incremental:!0}).catch((jl)=>ju(Hu(jl,"增量刷新 Attempt Trace Steps 失败")))}async function TC(z,S,a){if(!t||!z)return;let rl=performance.now(),jl=N.current,Wl=E.current.get(z);if(Wl?.task){if(s(Wl.task),tl(A1(Wl.task)||!Wl.complete),!A1(Wl.task)&&Wl.complete&&ef(Wl.task)&&String(Wl.completeUpdatedAt||"")===String(Wl.task?.updatedAt||"")){Wf({phase:"complete",taskId:z,queueMs:a??0,detailMs:0,totalMs:S===void 0?0:performance.now()-S,chunks:0,transcriptRows:Array.isArray(Wl.task.transcript)?Wl.task.transcript.length:0,completedAt:new Date});return}}else tl(!0);let Gl=J.current;if(Gl?.taskId===z&&Gl.token===jl)return Gl.promise;let sl=(async()=>{try{let Zl=await Bu(Du(r,`/api/tasks/${encodeURIComponent(z)}?meta=1`));if(jl!==N.current||A.current!==z)return;let Yl=E.current.get(z),Rl=Array.isArray(Yl?.task?.transcript)?Yl.task.transcript:[],Au=Zl?.task||{},rr=Boolean(Yl?.complete)&&String(Yl?.completeUpdatedAt||"")===String(Au?.updatedAt||"");Mf(z,{...Au,summaryOnly:!1,_metaLoaded:!0,transcript:Rl,_detailLoaded:Rl.length>0,_transcriptComplete:rr},jl);let fu=A1(Yl?.task)||Boolean(Yl?.task?._transcriptPreview),$r=fu?0:Rl.length>0?pQ(Rl):0,Fn=!fu&&Yl?.complete&&ef(Au)&&String(Yl?.completeUpdatedAt||"")===String(Au?.updatedAt||"")?F1(Rl):$r,Pn=!0,Ut=0,q0=Rl.length;while(Pn){let sf=await Bu(Du(r,`/api/tasks/${encodeURIComponent(z)}/transcript?afterSeq=${encodeURIComponent(String(Fn))}&limit=${hp}&fullText=1`));if(jl!==N.current||A.current!==z)return;let Tf=E.current.get(z),L0=Array.isArray(Tf?.task?.transcript)?Tf.task.transcript:[],Qi=P2(L0,Array.isArray(sf?.transcript)?sf.transcript:[]);Ut+=1,q0=Qi.length;let Mu=Boolean(!sf?.hasMore);if(Mf(z,{status:sf?.status||Au.status,updatedAt:sf?.updatedAt||Au.updatedAt,transcript:Qi,_detailLoaded:Mu||Qi.length>0,_transcriptComplete:Mu,_transcriptPreview:fu&&!Mu},jl),Pn=Boolean(sf?.hasMore),Fn=Number(sf?.nextAfterSeq??F1(Qi)),!Pn)break;await new Promise((Mj)=>window.setTimeout(Mj,0))}Wf({phase:"complete",taskId:z,queueMs:a??0,detailMs:performance.now()-rl,totalMs:S===void 0?performance.now()-rl:performance.now()-S,chunks:Ut,transcriptRows:q0,completedAt:new Date})}finally{if(J.current?.taskId===z&&J.current?.token===jl)J.current=null;if(jl===N.current&&A.current===z)tl(!1)}})();J.current={taskId:z,token:jl,promise:sl},await sl}async function cf(z=A.current,S=!0,a=gl){if(!t)return;if(!S&&P.current)return;let rl=performance.now();if(S)P.current=!0;if(S)Wf({phase:"loading",taskId:String(z||A.current||""),startedAt:new Date});let jl=F.current+1;F.current=jl;let Wl=String(z||A.current||""),Gl=Wl?E.current.get(Wl):null,sl=Array.isArray(Gl?.task?.transcript)?Gl.task.transcript:[],Zl=pQ(sl),Yl=null,Rl=S&&Wl.length===0;if(Yl=Rl?await UQ(r,a,""):await B2(r,Wl,Zl,a,"",!0,{stats:!1}),jl!==F.current){if(S)P.current=!1;return}let Au=performance.now()-rl;v(Y||{});let rr=Yl?.queue||{},fu=String(rr?.activeTaskId||$y(rr)[0]||""),$r=Yl;Hr((su)=>{let Qt=Cu(Yl),$f=Cu(su),Kf=$f.length>0?Gn([$f,Qt],fu):Gn([Qt],fu),mt=An(Kf),h$=Ln(Yl),mi=Ln(su),g8=$f.length>Qt.length&&(mi.hasMore===!1||String(mi.nextBeforeId||"").length>0),yT={...h$,...g8?{hasMore:mi.hasMore,nextBeforeId:mi.nextBeforeId}:{},returned:mt.length};return $r={...Yl,tasks:mt,pagination:yT},$r});let Fn=Cu($r),Pn=NQ(rr,tu),Ut=JQ(rr,Pn,a,Fn),q0=lz(Pn,a,Fn),sf=Wl||A.current,Tf=$r?.selected||null,L0=Tf?.task||null,Qi=Array.isArray(Tf?.transcript)?Tf.transcript:null,Mu=sf||Ut||q0||Fn[0]?.id||"";if(A.current!==Mu)N.current+=1;A.current=Mu,yl(Mu);let G0=Fn.find((su)=>su.id===Mu);if(G0){let su=E.current.get(Mu);if(su?.task)E.current.set(Mu,{...su,task:{...G0,...su.task,status:G0.status,updatedAt:G0.updatedAt}})}if(Rl&&G0){if(Mf(Mu,{...G0,_summaryLoaded:!1,transcript:[],_detailLoaded:!1,_transcriptComplete:!1,_transcriptPreview:!0},N.current),tl(!0),Wf({phase:"complete",taskId:Mu,queueMs:Au,detailMs:0,totalMs:performance.now()-rl,chunks:0,transcriptRows:0,partial:!0,completedAt:new Date}),N0(new Date),S)P.current=!1;Jt(Mu,!0).catch((su)=>ju(Hu(su,"加载 Codex Trace Summary 失败"))),B2(r,Mu,0,a,"",!1).then((su)=>{if(jl!==F.current)return;let Qt=Cu(su),$f=EQ(su);if(Qt.length>0)Hr((Kf)=>{let mt=Gn([Cu(Kf),Qt],fu);return{...Kf,statistics:su?.statistics||Kf?.statistics,tasks:An(mt)}});if($f?.id===A.current){let Kf=Array.isArray($f.transcript)?$f.transcript:[];Mf($f.id,{...$f,transcript:Kf,_summaryLoaded:!0,_detailLoaded:Kf.length>0,_transcriptPreview:Boolean(su?.selected?.preview)},N.current)}}).catch(()=>{});return}if(L0?.id===Mu&&Qi!==null){let su=E.current.get(Mu),Qt=Array.isArray(su?.task?.transcript)?su.task.transcript:[],$f=P2(Qt,Qi),Kf=Boolean(Tf?.preview);if(Mf(Mu,{...L0,_summaryLoaded:!0,transcript:$f,_detailLoaded:!Tf?.hasMore||$f.length>0,_transcriptComplete:!Kf&&!Tf?.hasMore&&ef(L0),_transcriptPreview:Kf},N.current),tl(!1),S)Wf({phase:"complete",taskId:Mu,queueMs:Au,detailMs:Math.max(0,performance.now()-rl-Au),totalMs:performance.now()-rl,chunks:1,transcriptRows:$f.length,partial:Boolean(Kf||Tf?.hasMore||A1(L0)),completedAt:new Date});if(N0(new Date),S)P.current=!1;Jt(Mu,!1,S?rl:void 0,S?Au:void 0).catch((mt)=>ju(Hu(mt,"加载 Codex Trace Summary 失败"))),B2(r,Wl,Zl,a,"",!1).then((mt)=>{if(jl!==F.current)return;let h$=Cu(mt);if(h$.length>0)Hr((mi)=>{let g8=Gn([Cu(mi),h$],fu);return{...mi,tasks:An(g8)}})}).catch(()=>{});return}if(S)Wf({phase:"session",taskId:Mu,queueMs:Au,totalMs:Au,startedAt:new Date(Date.now()-Au)});if(Mu)Jt(Mu,!0,S?rl:void 0,S?Au:void 0).catch((su)=>ju(Hu(su,"加载 Codex Trace Summary 失败")));else if(N.current+=1,s(null),tl(!1),S)Wf({phase:"complete",taskId:"",queueMs:Au,detailMs:0,totalMs:performance.now()-rl,chunks:0,transcriptRows:0,completedAt:new Date});if(N0(new Date),S)P.current=!1;Hj(a).catch((su)=>o(GQ(su)))}async function Dj(){if(yf){if(!t||nl||G.current)return;let S=String(V8.nextBeforeId||"");if(!S)return;G.current=!0,k(!0),ju("");try{let a=await QQ(r,gl,S,ZQ,Q0),rl=Cu(a),jl=a?.queue||Ou||{},Wl=String(jl?.activeTaskId||$y(jl)[0]||Yn||"");El((Gl)=>{let sl=An(Gn([Cu(Gl),rl],Wl)),Zl=Ln(a);return{...Gl||{},queue:jl,tasks:sl,pagination:{...Zl,returned:sl.length}}})}catch(a){ju(Hu(a,"加载更多搜索结果失败"))}finally{G.current=!1,k(!1)}return}if(!t||uc||w.current)return;let z=String(Ln(K).nextBeforeId||"");if(!z)return;w.current=!0,rc(!0),ju("");try{let S=await QQ(r,gl,z),a=Cu(S),rl=S?.queue||Ou||{},jl=String(rl?.activeTaskId||$y(rl)[0]||Yn||"");Hr((Wl)=>{let Gl=An(Gn([Cu(Wl),a],jl)),sl=Ln(S);return{...Wl||{},queue:rl,statistics:S?.statistics||Wl?.statistics,tasks:Gl,pagination:{...sl,returned:Gl.length}}})}catch(S){ju(Hu(S,"加载更早 Codex tasks 失败"))}finally{w.current=!1,rc(!1)}}function BW(z){let S=z.currentTarget;if(!S||S8||!Kj)return;if(S.scrollHeight-S.scrollTop-S.clientHeight<120)Dj()}async function Br(z,S){K$(!0),ju("");try{await z()}catch(a){ju(Hu(a,S))}finally{K$(!1)}}async function s8(z){if(!z)return;try{let S=!1;try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(z),S=!0}catch{S=!1}if(!S){let rl=document.createElement("textarea");rl.value=z,rl.style.position="fixed",rl.style.opacity="0",document.body.appendChild(rl),rl.select(),S=document.execCommand("copy"),document.body.removeChild(rl)}if(!S)throw Error("browser clipboard rejected the copy request");E$(z);let a=`已复制任务 ID:${z}`;Su(a),mr("success",a),window.setTimeout(()=>E$((rl)=>rl===z?"":rl),1600)}catch(S){ju(`复制任务 ID 失败:${Hu(S)}`)}}function R8(z){if(!z)return;_u(z);let S=`已引用任务 ID:${z};提交时后端会读取并注入该任务上下文`;Su(S),mr("success",S)}async function x8(z){if(!t||!z)return;let S=new Date().toISOString();F.current+=1,P$([z],S,null,{id:z,readAt:S,terminalUnread:!1}),p$(z);let a=!1;if(await Br(async()=>{let rl=await iz(r,z),jl=rl?.task||{id:z,readAt:new Date().toISOString(),terminalUnread:!1},Wl=String(jl?.readAt||new Date().toISOString());P$([z],Wl,rl?.queue||null,jl),a=!0;let Gl=`已将任务 ${z} 标为已读`;Su(Gl),mr("success",Gl)},"标记 Codex task 已读失败"),!a)Bj([z]),cf(A.current,!1).catch((rl)=>ju(Hu(rl,"刷新 Codex tasks 失败")));p$((rl)=>rl===z?"":rl)}async function DW(){if(!t||lc)return;z$(!0);let z=new Date().toISOString(),S=Array.from(new Set([...Cu(D.current).filter(on).map((rl)=>String(rl?.id||"")).filter(Boolean),...Array.from(E.current.entries()).filter(([,rl])=>on(rl?.task)).map(([rl])=>rl)]));if(F.current+=1,S.length>0)P$(S,z);let a=!1;if(await Br(async()=>{let rl=await yz(r),jl=String(rl?.readAt||new Date().toISOString()),Wl=Cu(D.current).filter(on).map((Rl)=>String(Rl?.id||"")).filter(Boolean),Gl=Array.from(E.current.entries()).filter(([,Rl])=>on(Rl?.task)).map(([Rl])=>Rl),sl=Array.from(new Set([...S,...Wl,...Gl]));P$(sl,jl,rl?.queue||null);let Zl=Number(rl?.count||sl.length);a=!0;let Yl=`已将 ${Zl} 个已结束未读任务标为已读`;Su(Yl),mr("success",Yl)},"全部标为已读失败"),!a&&S.length>0)Bj(S),cf(A.current,!1).catch((rl)=>ju(Hu(rl,"刷新 Codex tasks 失败")));z$(!1)}function VW(z){let S=z||dn;if(zr(S),!Cr(S))Nu(S);if(Hr(null),!(Cr(S)?A.current:""))A.current="",N.current+=1,yl(""),s(null),tl(!0)}async function b8(){if(!t)return;let z=await Bu(Du(r,"/api/workdirs"));Ft(z)}async function SW(){let z=cr.trim()||Oj||"/workspace",S=typeof window>"u"?z:window.prompt("输入新的工作目录绝对路径",z),a=String(S||"").trim();if(!a)return;j0(!0),await Br(async()=>{let rl=await Bu(Du(r,"/api/workdirs"),{method:"POST",body:{providerId:Nl,executionMode:gu,path:a,ensure:!0}});Ft((Wl)=>({...Wl||{},...rl})),ku(String(rl?.workdir?.path||a));let jl=`已保存工作目录:${String(rl?.workdir?.path||a)}`;Su(jl),mr("success",jl)},"创建工作目录失败"),j0(!1)}async function YW(){let z=jy(cr);if(!X8){Su("当前工作目录还没有保存到下拉菜单。");return}if(!(typeof window>"u"?!0:window.confirm(`从下拉菜单删除工作目录选项? -${z} +本次任务:`,n=l.indexOf(f);if(n===-1)return u;return l.slice(n+f.length).trimStart()}function ei(u){return u.length>0?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(`从下拉菜单删除工作目录选项? +${B} -不会删除磁盘上的实际目录。`)))return;j0(!0),await Br(async()=>{let a=await Bu(Du(r,`/api/workdirs/${encodeURIComponent(Nl)}/${encodeURIComponent(gu)}/${encodeURIComponent(z)}`),{method:"DELETE"});Ft((jl)=>({...jl||{},...a}));let rl=`已从下拉菜单删除工作目录:${z}`;Su(rl),mr("success",rl)},"删除工作目录失败"),j0(!1)}async function XW(){let z=typeof window>"u"?"":window.prompt("输入新的 Codex queue ID(字母/数字/._-,最长 64)","new-lane"),S=String(z||"").trim();if(!S)return;await Br(async()=>{let a=await Bu(Du(r,"/api/queues"),{method:"POST",body:{queueId:S}}),rl=String(a?.queue?.id||S);Nu(rl),zr(rl),Hr(null),A.current="",N.current+=1,yl(""),s(null);let jl=`已创建并切换到 queue:${rl}`;Su(jl),mr("success",jl),await cf("",!0,rl)},"创建 Codex queue 失败")}async function PW(){let z=String(tu||"default").trim()||"default",S=Ay(hf,z)||{id:z,name:z},a=typeof window>"u"?null:window.prompt(`输入 queue 显示名称(ID 不变:${z};留空恢复为 ID)`,DQ(S));if(a===null)return;await Br(async()=>{let rl=await Bu(Du(r,`/api/queues/${encodeURIComponent(z)}`),{method:"PATCH",body:{name:String(a)}}),jl=rl?.queue||{id:z,name:String(a||z)};if(rl?.summary)Hr((Gl)=>Gl?{...Gl,queue:rl.summary}:Gl);let Wl=`已更新 queue 名称:${M2(jl)}`;Su(Wl),mr("success",Wl),await cf(A.current,!0,gl)},"修改 Codex queue 名称失败")}function CW(){if(jt.length===0){Su("没有可合并的其他 queue;请先创建或选择另一个 queue。");return}let z=jt.some((S)=>String(S?.id||"")===tf)?tf:"";Or(z),lr(!0)}async function hW(){let z=Ui;if(jt.length===0){Su("没有可合并的其他 queue;请先创建或选择另一个 queue。");return}let a=String(tf||""||"").trim();if(!a){Su("请先选择要合并的源 queue。");return}if(a===z){ju("源 queue 和目标 queue 不能相同。");return}await Br(async()=>{let rl=await Bu(Du(r,`/api/queues/${encodeURIComponent(z)}/merge`),{method:"POST",body:{sourceQueueId:a}});if(rl?.summary)Hr((Gl)=>Gl?{...Gl,queue:rl.summary}:Gl);Nu(z),zr(z),Hr(null);let jl=Number(rl?.mergedTaskCount||0),Wl=`已将 queue=${a} 合并到 ${z},移动 ${jl} 个任务;源 queue 已自动删除。`;Su(Wl),mr("success",Wl),lr(!1),Or(""),await cf(A.current,!0,z)},"合并 Codex queue 失败")}async function MW(z){if(z.preventDefault(),U.current){Su("任务正在提交中,请等待当前请求完成,已阻止重复提交。");return}if(Xn.length>1&&!_t){ju(`检测到将创建 ${Xn.length} 个任务;请先勾选“确认批量入队”,避免误传多个任务。`);return}U.current=!0,Dl(!0),Su("正在提交 Code Queue 任务,请等待后端确认,输入已临时锁定。"),await Br(async()=>{if(Xn.length===0)throw Error("prompt 不能为空");let S=Ci(bl),a=tu.trim()||"default",rl=[...Xn],jl=(Rl)=>({prompt:Rl,queueId:a,providerId:Nl,executionMode:gu,model:yr,cwd:cr,maxAttempts:Number(Gf),...S.length>0?{referenceTaskIds:S}:{}}),Wl=rl.length===1?jl(rl[0]):{tasks:rl.map(jl)},Gl=await Bu(Du(r,rl.length===1?"/api/tasks":"/api/tasks/batch"),{method:"POST",body:Wl}),sl=Gl?.tasks?.[0]?.id||"",Zl=Array.isArray(Gl?.tasks)?Gl.tasks.map((Rl)=>String(Rl?.id||"")).filter(Boolean):[],Yl=`已创建 ${Zl.length||rl.length} 个任务${Zl.length>0?`:${Zl.join(" / ")}`:""}`;if(EW(Array.isArray(Gl?.tasks)?Gl.tasks:[],Gl?.queue||null),Su(Yl),mr("success",Yl),Hl(""),_u(""),At(!1),Nu(a),sl&&h8(Gl?.tasks?.[0],gl)&&M8(Gl?.tasks?.[0]))Jt(String(sl),!1).catch((Rl)=>ju(Hu(Rl,"加载 Codex Trace Summary 失败")))},"Codex 任务入队失败"),U.current=!1,Dl(!1)}async function sW(z){if(z.preventDefault(),!h?.id)return;await Br(async()=>{await Bu(Du(r,`/api/tasks/${encodeURIComponent(h.id)}/steer`),{method:"POST",body:{prompt:Cl}}),lu(""),await cf(h.id)},"追加 prompt 失败")}async function RW(z){z.preventDefault();let S=String(h?.id||"");if(!S||!w0)return;await Br(async()=>{let a=Ci(yu),rl=await Bu(Du(r,`/api/tasks/${encodeURIComponent(S)}/edit`),{method:"POST",body:{prompt:mu,referenceTaskIds:a}}),jl={...rl?.task||h||{},_traceSummary:null,_traceSummaryLoaded:!1,_traceSummaryUpdatedAt:"",_promptDetails:{},_traceSteps:[],_traceStepsLoaded:!1,_traceStepsByAttempt:{},_traceStepsLoadedByAttempt:{},_traceStepsNextAfterSeqByAttempt:{},_traceStepDetails:{}};E.current.set(S,{...E.current.get(S)||{},task:jl,complete:!1,completeUpdatedAt:""}),A.current=S,s(jl),yl(S),au(K3(jl)),ur(Array.isArray(jl?.referenceTaskIds)?jl.referenceTaskIds.join(" "):""),Hr((Gl)=>{if(!Gl)return Gl;let sl=Cu(Gl).map((Zl)=>String(Zl?.id||"")===S?{...Zl,...jl}:Zl);return{...Gl,queue:rl?.queue||Gl.queue,tasks:Gn([sl],Yn)}});let Wl=rl?.changed===!1?`任务 ${S} 的 prompt 未变化`:`已更新 queued 任务 ${S} 的用户 prompt`;Su(Wl),mr("success",Wl),await cf(S,!0,gl)},"编辑 queued 任务 prompt 失败")}async function xW(){if(!h?.id)return;await Br(async()=>{await Bu(Du(r,`/api/tasks/${encodeURIComponent(h.id)}/interrupt`),{method:"POST",body:{}}),await cf(h.id)},"打断 Codex session 失败")}async function bW(){if(!h?.id)return;await Br(async()=>{await Bu(Du(r,`/api/tasks/${encodeURIComponent(h.id)}/retry`),{method:"POST",body:{}}),await cf(h.id)},"重新入队失败")}async function vW(z){let S=String(h?.id||""),a=String(z||"").trim();if(!S||!a)return;let rl=Fy(h);if(a===rl){Su(`任务 ${S} 已在 queue=${a}`);return}await Br(async()=>{let Wl=(await Bu(Du(r,`/api/tasks/${encodeURIComponent(S)}/move`),{method:"POST",body:{queueId:a}}))?.task||{...h,queueId:a};if(E.current.set(S,{...E.current.get(S)||{},task:Wl}),A.current=S,s(Wl),yl(S),Nu(a),!Cr(gl))Hr(null),zr(a);let Gl=`已将任务 ${S} 从 ${rl} 移动到 ${a}`;Su(Gl),mr("success",Gl),await cf(S,!0,Cr(gl)?dn:a)},"移动任务 queue 失败")}async function gW(){let z=A.current;if(!z)return;let S=performance.now();await Br(async()=>{Wf({phase:"session",taskId:z,queueMs:0,totalMs:0,partial:!0,startedAt:new Date}),await Jt(z,!0,S,0)},"刷新 Trace Summary 失败")}function kW(z){A.current=z,N.current+=1,yl(z);let S=E.current.get(z);if(S?.task)s(S.task),tl(!1);else{tl(!0);let a=$n.find((rl)=>rl.id===z);if(a)s(a);else s(null)}cf(z).catch((a)=>ju(Hu(a,"切换 Codex session 失败")))}function v8(z){if(kW(z),dp())dy(!1)}function Vj(z,S,a){if(!z||!Array.isArray(z?.tasks)||S.length===0||Object.keys(a).length===0)return z;let rl=!1,jl=Cu(z).map((Wl)=>{if(String(Wl?.id||"")!==S)return Wl;return rl=!0,X$(KQ(Wl,a))});return rl?{...z,tasks:jl}:z}function IW(z,S){Hr((a)=>Vj(a,z,S)),El((a)=>Vj(a,z,S))}function aW(z,S,a){let rl=String(z?.type||"");if(rl==="queue-updated")return!0;if(rl==="trace-stats-updated"||rl==="trace-step-created")return!1;if(S.length===0)return!0;if(!a)return!0;if(z?.queueId&&String(z.queueId)!==Fy(a))return!0;if(z?.status&&String(z.status)!==String(a?.status||""))return!0;return String(z?.reason||"")!=="output"}function Sj(){if(!t||!H2())return;if(O.current!==null)window.clearTimeout(O.current);O.current=window.setTimeout(()=>{O.current=null,cf(A.current,!1).catch((z)=>ju(Hu(z,"Code Queue 事件刷新失败")))},120)}function oW(z,S){if(!t||!H2()||A.current!==z)return;if(V.current=V.current||S,Z.current!==null)return;Z.current=window.setTimeout(()=>{Z.current=null;let a=V.current;if(V.current=!1,Jt(z,!0).catch((rl)=>ju(Hu(rl,"事件刷新 Trace Summary 失败"))),a)HW(z)},250)}function dW(z){let S=ol(z?.payload)||z,a=ol(S?.stats),rl=String(z?.type||S?.type||""),jl=String(S?.subjectKind||a?.subjectKind||""),Wl=String(S?.scopeId||a?.scopeId||""),Gl=String(S?.taskId||(jl==="task"?S?.subjectId:"")||a?.taskId||z?.taskId||""),sl=S?.attemptIndex??a?.attemptIndex,Zl=sl===null||sl===void 0||sl===""?null:un(sl),Yl=a||ol(S?.traceStats),Rl=Yl?.stepCount??Yl?.llmStepCount,Au=Yl?.outputMaxSeq;return{...S,type:rl,eventId:z?.eventId||S?.eventId,sequence:z?.sequence??S?.sequence,taskId:Gl,subjectKind:jl,scopeId:Wl,attemptIndex:Zl,stepCount:Rl,outputMaxSeq:Au,updatedAt:Yl?.updatedAt||S?.updatedAt||z?.createdAt,traceStats:Yl,statsSource:Yl?"oa-event-flow":S?.statsSource}}function eW(z){let S=dW(z),a=String(S?.taskId||""),rl=String(S?.scopeId||S?.traceStats?.scopeId||""),jl=String(S?.subjectKind||S?.traceStats?.subjectKind||"")==="task-attempt"||Number(S?.attemptIndex)>0||/:attempt:\d+$/u.test(rl),Wl=wQ(S?.stepCount),Gl={},sl=a.length>0?Cu(D.current).find((Zl)=>String(Zl?.id||"")===a):null;if(a.length>0){if(S?.status)Gl.status=String(S.status);if(S?.updatedAt)Gl.updatedAt=String(S.updatedAt);if(S?.queueId)Gl.queueId=String(S.queueId);if(!jl&&Number.isFinite(Number(S?.stepCount)))Gl.stepCount=Wl,Gl.llmStepCount=Wl;if(!jl&&Number.isFinite(Number(S?.outputMaxSeq)))Gl.outputMaxSeq=wQ(S.outputMaxSeq);if(!jl&&ol(S?.traceStats))Gl.traceStats=S.traceStats,Gl.statsSource="oa-event-flow";if(Object.keys(Gl).length>0&&(E.current.has(a)||A.current===a))Mf(a,Gl,N.current);if(Object.keys(Gl).length>0)IW(a,Gl);if(A.current===a&&(S?.type==="trace-step-created"||S?.type==="task-updated"||S?.type==="trace-stats-updated")){let Zl=Uz(sl),Yl=S?.type==="trace-step-created"||S?.type==="trace-stats-updated"&&Number.isFinite(Number(S?.stepCount))&&(jl||Zl===null||Wl>Zl);oW(a,Yl)}}if(aW(S,a,sl))Sj()}df(()=>{if(H.current){H.current=!1;return}Br(()=>cf(A.current),"Code Queue 加载失败")},[t?.id,gl]),df(()=>{if(!t||typeof EventSource>"u")return;let z=new EventSource(bp(r),{withCredentials:!0}),S=(rl)=>{try{eW(JSON.parse(String(rl.data||"{}")))}catch(jl){ju(Hu(jl,"解析 Code Queue 事件失败"))}},a=()=>{if(H2())Sj()};return z.addEventListener("trace-step-created",S),z.addEventListener("task-updated",S),z.addEventListener("queue-updated",S),z.addEventListener("trace-stats-updated",S),document.addEventListener("visibilitychange",a),()=>{if(z.close(),document.removeEventListener("visibilitychange",a),O.current!==null)window.clearTimeout(O.current),O.current=null;if(Z.current!==null)window.clearTimeout(Z.current),Z.current=null}},[t?.id,r,gl]),df(()=>{if(!t||!h||ul)return;let z=String(h.id||"");if(!z)return;let S=String(h.updatedAt||"");if(G3(h))return;let a=`${z}:${S||"unknown"}:${String(h?._traceSummaryUpdatedAt||"")}`;if(p.current.has(a))return;p.current.add(a),Jt(z,!0).catch((rl)=>ju(Hu(rl,"自动加载 Trace Summary 失败")))},[t?.id,h?.id,h?.updatedAt,h?.traceStats?.statsRevision,h?._traceSummaryUpdatedAt,h?._traceSummaryLoaded,ul]),df(()=>{if(!t||!h||ul)return;let z=String(h.id||""),S=Number(Jr(h)?.currentAttempt||h?.currentAttempt||0);if(!z||!bQ(h)||!Number.isFinite(S)||S<=0)return;if(E3(h,S))return;let a=`${z}:current-attempt:${S}:${String(h?.updatedAt||"")}`;if(p.current.has(a))return;p.current.add(a),C$(S).catch((rl)=>ju(Hu(rl,"自动加载当前 Attempt Trace Steps 失败")))},[t?.id,h?.id,h?.status,h?.currentAttempt,h?.updatedAt,h?._traceSummaryUpdatedAt,ul]),df(()=>{if(!t)return;b8().catch((z)=>ju(Hu(z,"加载工作目录失败")));return},[t?.id]),df(()=>{if(!t)return;Hj(gl);return},[t?.id,r,gl]);let lT=_n.length===0?L(Ny,{title:yf?M?"搜索中":"没有匹配任务":"队列为空",text:yf?M?`正在搜索包含“${Q0}”的 task...`:`未找到包含“${Q0}”的 task;可换个关键词或切换 queue。`:"提交一个任务后,Codex 会串行执行并保存输出。"}):[Wj.length>0?L(C2,{key:"unread",title:"已结束未读",tasks:Wj,selectedId:fl,emptyText:"暂无已结束未读任务。",onSelect:v8,onCopy:s8,onReference:R8,onMarkRead:x8,copiedTaskId:A0,markingReadTaskId:ey}):null,L(C2,{key:"active",title:"运行 / 排队",tasks:UW,selectedId:fl,emptyText:"当前没有运行或排队任务。",onSelect:v8,onCopy:s8,onReference:R8,onMarkRead:x8,copiedTaskId:A0,markingReadTaskId:ey}),L(C2,{key:"history",title:"历史 session",tasks:QW,selectedId:fl,emptyText:"最近没有完成、失败或取消的 session。",onSelect:v8,onCopy:s8,onReference:R8,onMarkRead:x8,copiedTaskId:A0,markingReadTaskId:ey}),L("div",{key:"pagination",className:"codex-task-pagination","data-testid":"codex-task-pagination"},L("span",null,yf?`搜索“${Q0}” · 已显示 ${_n.length} / ${Number.isFinite(m0)?m0:_n.length}`:`已加载 ${_n.length} / ${Number.isFinite(m0)?m0:_n.length}`),Kj?L("button",{type:"button",className:"ghost-btn",disabled:S8,onClick:()=>void Dj(),"data-testid":"codex-load-more-tasks-button"},S8?"加载中":yf?"加载更多结果":"加载更早任务"):L("code",null,yf?"已到结果末尾":"已到队列末尾"))],Yj=(z,S=!1)=>L("label",{className:`code-queue-switcher ${S?"compact":""}`},L("span",null,S?"Queue":"查看 queue"),L("select",{value:gl,onChange:(a)=>VW(String(a.target.value||dn)),"data-testid":z},L("option",{value:dn},`All queues · ${Number.isFinite(Nt)?Nt:$n.length} tasks · ${fc.length} running`),hf.map((a)=>L("option",{key:String(a?.id||""),value:String(a?.id||"")},j1(a))))),uT=L("div",{className:"codex-task-search","data-testid":"codex-task-search"},L("label",{htmlFor:"codex-task-search-input"},"搜索 task"),L("div",{className:"codex-task-search-row"},L("input",{id:"codex-task-search-input",type:"search",value:Al,placeholder:"关键词 / task ID / prompt",autoComplete:"off",onChange:(z)=>Kl(String(z.target.value||"")),"data-testid":"codex-task-search-input"}),Al?L("button",{type:"button",className:"ghost-btn",onClick:()=>Kl(""),"data-testid":"codex-task-search-clear"},"清除"):null),L("small",{"data-testid":"codex-task-search-summary"},yf?M?"搜索中...":`匹配 ${_n.length}/${Number.isFinite(m0)?m0:_n.length}`:"支持 task ID、prompt、状态、provider、模型和最近输出关键词")),rT=L("div",{className:"codex-trace-status","data-testid":"codex-trace-status-summary"},L("span",{className:"codex-trace-status-chip queued"},L("b",null,"排队"),String(V$)),L("span",{className:"codex-trace-status-chip running"},L("b",null,"运行"),String(NW)),L("span",{className:`codex-trace-status-chip unread ${U0>0?"warn":""}`},L("b",null,"结束未读"),String(U0)),L("span",{className:"codex-trace-status-chip service"},L("b",null,"服务"),`${mW.providerStatus||"unknown"} · ${t?.providerId||"D601"} · ${wW.public?"公网暴露":"仅 UniDesk frontend 代理访问"}`),L("span",{className:"codex-trace-status-chip"},L("b",null,"执行节点"),Y$.map((z)=>z.id).join(" / ")),L("span",{className:"codex-trace-status-chip"},L("b",null,"执行模式"),zj.map((z)=>z.id).join(" / ")),L("span",{className:"codex-trace-status-chip"},L("b",null,"模型"),pj.join(" / ")),L("span",{className:"codex-trace-status-chip"},L("b",null,"加载"),xr?.phase==="complete"?sp(xr?.totalMs):String(xr?.phase||"idle")),L("span",{className:"codex-trace-status-chip"},L("b",null,"刷新"),Z$?iu(Z$):"--")),fT=L(hi,{title:h?`Trace ${String(h.id).slice(0,22)}`:"Trace 输出",eyebrow:h?`${h.status} / view=${S$} / task queue=${Fy(h)} / provider=${h.providerId||"D601"} / mode=${h.executionMode||"default"} / ${h.model} / agent loop trace`:`Agent loop trace / view=${S$}`,summary:rT,loading:ul||uc||M||nl||xr?.phase==="loading",actions:L("div",{className:"panel-actions"},Yj("code-queue-filter-select"),L("button",{type:"button",className:"ghost-btn codex-mark-all-read-btn",disabled:U0===0||Tu||lc,onClick:()=>void DW(),"data-testid":"codex-mark-all-read-button"},lc?"标记中":`全部标已读${U0>0?` (${U0})`:""}`),h?L("button",{type:"button",className:"ghost-btn",disabled:ul||Tu,onClick:()=>void gW(),"data-testid":"codex-load-full-trace-button"},ul?"加载中":Jr(h)?"刷新 Summary":"加载 Summary"):null,L("button",{type:"button",className:"codex-session-title-toggle",onClick:()=>dy((z)=>!z),"data-testid":"code-queue-sidebar-toggle"},oy?"收起队列":"展开队列"),L("label",{className:"inline-check"},L("input",{type:"checkbox",checked:Sn,onChange:(z)=>Z8(Boolean(z.target.checked))}),"自动滚动"),L("button",{type:"button",className:"ghost-btn",disabled:!GW||Tu,onClick:()=>void xW(),"data-testid":"codex-interrupt-button"},"打断"),L("button",{type:"button",className:"ghost-btn",disabled:!WW||Tu,onClick:()=>void bW()},"重试"),h?L(v2,{title:"Codex Task",data:h,onOpen:u,testId:"raw-codex-task"}):null),className:"codex-output-panel"},L("div",{className:`codex-session-shell ${oy?"":"queue-collapsed"}`},oy?L("aside",{className:"codex-session-sidebar","data-testid":"codex-session-sidebar"},L("div",{className:"codex-session-sidebar-head"},L("div",null,L("span",null,Cr(gl)?"All queues":"Queue lane"),L("strong",null,`${S$} · ${$n.length}/${Number.isFinite(Nt)?Nt:$n.length} sessions · 未读 ${U0}`)),L("button",{type:"button",className:"ghost-btn",onClick:()=>dy(!1)},"收起")),Yj("code-queue-filter-sidebar",!0),uT,L("div",{className:"codex-task-list codex-task-list-session",onScroll:BW,"data-testid":"codex-task-list-scroll"},lT)):null,L("div",{className:"codex-session-main"},L("div",{className:"codex-output-stack"},L(JO,{task:h,loading:ul,onLoadPromptPart:OW,onLoadSteps:C$,onLoadStep:ZW}),L(UO,{task:h})))));if(!t)return L(Ny,{title:"Code Queue 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=code-queue"});let Xj=Number(xr?.totalMs),Pj=Number(xr?.queueMs),Cj=Number(xr?.detailMs),hj=Number(xr?.transcriptRows),nT=xr?.phase==="complete"?"complete":String(xr?.phase||"idle"),tT=Ay(hf,Ui)||{id:Ui,name:Ui},iT=nf?L(_Q,{title:"合并 queue",titleId:"codex-merge-dialog-title",className:"codex-merge-dialog",backdropClassName:"codex-merge-dialog-backdrop",bodyClassName:"codex-merge-dialog-body",actionsClassName:"codex-merge-dialog-actions",testId:"codex-merge-queue-dialog",closeTestId:"codex-merge-queue-close",disableClose:Tu,onClose:()=>lr(!1),actions:[L("button",{key:"cancel",type:"button",className:"ghost-btn",onClick:()=>lr(!1),disabled:Tu,"data-testid":"codex-merge-queue-cancel"},"取消"),L("button",{key:"confirm",type:"button",className:"primary-btn",onClick:()=>void hW(),disabled:Tu||e||!tf,"data-testid":"codex-merge-queue-confirm"},Tu?"合并中...":"确认合并")]},L("p",{className:"codex-merge-dialog-target"},"目标 queue:",L("code",null,j1(tT))),L("label",null,"源 queue",L("select",{value:tf,disabled:Tu||e,onChange:(z)=>Or(String(z.target.value||"")),"data-testid":"codex-merge-source-queue-select"},L("option",{value:""},"选择要合并进来的源 queue"),jt.map((z)=>L("option",{key:String(z?.id||""),value:String(z?.id||"")},j1(z))))),L("p",{className:"codex-merge-dialog-note"},"会把源 queue 的任务归属合并到目标 queue,并自动删除源 queue;目标 queue 会按原 queueEnteredAt/createdAt 时间顺序运行。")):null;return L("div",{className:`code-queue-page ${n?"codex-standalone-page":""}`,"data-testid":"code-queue-page","data-load-state":nT,"data-load-total-ms":Number.isFinite(Xj)?String(Math.round(Xj*10)/10):"","data-load-queue-ms":Number.isFinite(Pj)?String(Math.round(Pj*10)/10):"","data-load-detail-ms":Number.isFinite(Cj)?String(Math.round(Cj*10)/10):"","data-load-transcript-rows":Number.isFinite(hj)?String(hj):"","data-load-task-id":String(xr?.taskId||fl||""),"data-load-partial":xr?.partial?"true":"false"},L(el,{error:H8,wide:!0}),iT,L("div",{className:"codex-session-stage codex-session-stage-top"},L(cO,{diagnostics:B8,queue:Ou,onRaw:u}),fT),L("div",{className:"code-queue-layout"},L("div",{className:"codex-left-rail"},L(hi,{title:"提交任务",eyebrow:e?"Submitting...":Xn.length>1?`${Xn.length} tasks`:"Single or Batch",className:"codex-compose-panel",loading:e},L("form",{className:`codex-task-form ${e?"is-submitting":""}`,onSubmit:MW,"data-testid":"code-queue-task-form","aria-busy":e?"true":"false"},L("label",null,"Prompt / 多任务用单独一行 --- 分隔",L("textarea",{value:pl,rows:8,disabled:e,onChange:(z)=>Hl(z.target.value),placeholder:"写入 Codex 任务;多个任务之间用 --- 分隔。"})),L("label",{className:"codex-reference-field"},"引用任务 ID(可选)",L("input",{value:bl,disabled:e,onChange:(z)=>_u(z.target.value),placeholder:"codex_...;支持空格/逗号分隔多个 ID","data-testid":"codex-reference-task-id"}),Ci(bl).length>0?L("code",null,`后端将解析并注入:${Ci(bl).join(" / ")}`):null),L("div",{className:"codex-form-grid"},L("label",{className:"codex-submit-queue-field"},"Queue",L("div",{className:"codex-submit-queue-row"},L("select",{className:"codex-submit-queue-select",value:tu,disabled:e,onChange:(z)=>Nu(String(z.target.value||"default")),"data-testid":"code-queue-id-select"},hf.map((z)=>L("option",{key:String(z?.id||""),value:String(z?.id||"")},j1(z)))),L("button",{type:"button",className:"ghost-btn codex-rename-queue-btn",onClick:()=>void PW(),disabled:Tu||e||!tu,title:"修改当前 queue 的显示名称,ID 不变","data-testid":"codex-rename-queue-button"},"改名"),L("button",{type:"button",className:"ghost-btn codex-merge-queue-btn",onClick:()=>CW(),disabled:Tu||e||jt.length===0,title:"打开独立窗口选择源 queue 并合并到当前 queue;合并后自动删除源 queue","data-testid":"codex-merge-queue-button"},"合并 queue"),L("button",{type:"button",className:"ghost-btn codex-create-queue-btn",onClick:()=>void XW(),disabled:Tu||e,"data-testid":"codex-create-queue-button"},"创建 queue"))),L("label",null,"模型",L("select",{value:yr,disabled:e,onChange:(z)=>Zr(z.target.value),"data-testid":"codex-model-select"},pj.map((z)=>L("option",{key:z,value:z},z)))),L("label",null,"执行 Provider",L("select",{value:Nl,disabled:e,onChange:(z)=>pW(String(z.target.value||"D601")),"data-testid":"codex-provider-select"},Y$.map((z)=>L("option",{key:z.id,value:z.id},`${z.label||z.id} · ${z.defaultWorkdir||u5(Ou,z.id)}${z.supportsWindowsNativeCodex?" · Windows native":""}`)))),L("label",null,"执行模式",L("select",{value:gu,disabled:e,onChange:(z)=>zW(String(z.target.value||"default")),"data-testid":"codex-execution-mode-select"},zj.map((z)=>L("option",{key:z.id,value:z.id},`${z.label||z.id}${z.id==="windows-native"?" · 宿主 Codex":""}`)))),L("label",{className:"codex-workdir-field"},"工作目录",L("div",{className:"codex-workdir-row"},L("input",{value:cr,disabled:e,onChange:(z)=>ku(z.target.value),placeholder:Oj||Ou?.defaultWorkdir||"/workspace","data-testid":"codex-cwd-input"}),L("select",{value:jy(cr),disabled:e||F0,onChange:(z)=>ku(String(z.target.value||"")),"data-testid":"codex-cwd-select"},Zj.map((z)=>L("option",{key:`${z.providerId}:${z.executionMode}:${z.path}`,value:z.path},`${z.path}${z.source==="default"?" · 默认":""}`))),L("button",{type:"button",className:"ghost-btn codex-workdir-create-btn",disabled:e||Tu||F0,onClick:()=>void SW(),"data-testid":"codex-cwd-create-button"},F0?"处理中":"新建"),L("button",{type:"button",className:"ghost-btn codex-workdir-delete-btn",disabled:e||Tu||F0||!X8,onClick:()=>void YW(),title:X8?"从工作目录下拉菜单删除这个选项,不删除磁盘目录":"当前工作目录尚未保存到下拉菜单","data-testid":"codex-cwd-delete-button"},"删除"))),L("label",null,"最大尝试",L("input",{type:"number",min:1,max:99,value:Gf,disabled:e,onChange:(z)=>Vn(Number(z.target.value)),"data-testid":"codex-max-attempts-input"})),L("label",null,"入队份数",L("input",{type:"number",min:1,max:50,value:Rr,disabled:e,onChange:(z)=>ay(Number(z.target.value)),"data-testid":"codex-repeat-count-input"}))),nc>1?L("label",{className:`codex-batch-confirm ${_t?"confirmed":""}`,"data-testid":"codex-batch-confirm-row"},L("input",{type:"checkbox",checked:_t,disabled:e,onChange:(z)=>At(Boolean(z.target.checked)),"data-testid":"codex-batch-confirm-checkbox"}),L("span",null,`确认批量入队 ${nc} 个任务(prompt 分段 ${Y8.length} × 入队份数 ${mQ(Rr)})`)):null,e?L("div",{className:"codex-submit-wait","data-testid":"codex-submit-wait"},"正在提交到后端,已锁定输入以防重复提交..."):null,L("div",{className:"codex-form-actions"},L("button",{type:"button",className:"ghost-btn",disabled:Tu||e||pl.length===0&&bl.length===0,onClick:()=>{Hl(""),_u(""),At(!1);let z="已清空任务输入栏";Su(z),mr("success",z)},"data-testid":"codex-clear-input-button"},"清空输入"),L("button",{type:"submit",className:"primary-btn",disabled:qW,"data-testid":"codex-enqueue-button"},e?"提交中,请等待...":Ej?`请确认批量入队 ${nc} 个任务`:Xn.length>1?`批量入队 ${Xn.length} 个任务`:"入队并运行"))))),L("div",{className:"codex-main-stage"},L("div",{className:"codex-detail-grid"},L(hi,{title:"运行控制",eyebrow:w0?"Queued prompt editable":P8?"Active turn steer":"Steer when running",loading:Tu},L("div",{className:"codex-run-control-stack"},L(_O,{task:h,queueRows:hf,busy:Tu,onMove:vW}),h?.id?L("form",{className:"codex-steer-form codex-edit-prompt-form",onSubmit:RW,"data-testid":"codex-edit-prompt-form"},L("label",null,"编辑 queued 用户 prompt",L("textarea",{value:mu,rows:5,onChange:(z)=>au(z.target.value),placeholder:"仅 QUEUED 且尚未开始运行的任务可在这里修改原始用户 prompt。",disabled:!w0||Tu,"data-testid":"codex-edit-prompt-textarea"})),L("label",{className:"codex-reference-field"},"引用任务 ID(可选,留空会清除引用)",L("input",{value:yu,disabled:!w0||Tu,onChange:(z)=>ur(z.target.value),placeholder:"codex_...;支持空格/逗号分隔多个 ID","data-testid":"codex-edit-reference-task-id"}),Ci(yu).length>0?L("code",null,`将保留/注入:${Ci(yu).join(" / ")}`):null),L("div",{className:"codex-form-actions"},L("button",{type:"button",className:"ghost-btn",disabled:!h?.id||Tu,onClick:()=>{au(h?K3(h):""),ur(Array.isArray(h?.referenceTaskIds)?h.referenceTaskIds.join(" "):"")},"data-testid":"codex-edit-prompt-reset"},"恢复当前值"),L("button",{type:"submit",className:"primary-btn",disabled:!w0||Tu||mu.trim().length===0,title:w0?"保存后会重写尚未运行任务的用户 prompt":"只有 QUEUED 且尚未开始的任务可编辑 prompt","data-testid":"codex-edit-prompt-submit"},"保存 queued prompt"))):null,L("form",{className:"codex-steer-form",onSubmit:sW},L("label",null,"追加 prompt",L("textarea",{value:Cl,rows:4,onChange:(z)=>lu(z.target.value),placeholder:"给正在运行的 Codex session 推入新的指令或纠偏。",disabled:!P8})),L("button",{type:"submit",className:"primary-btn",disabled:!P8||Tu||Cl.trim().length===0,"data-testid":"codex-steer-button"},"推入运行中 session")))),L(hi,{title:"完成判定",eyebrow:h?.lastJudge?h.lastJudge.source:"judge",loading:ul},h?.lastJudge?L("div",{className:"codex-judge-card","data-testid":"codex-task-judge-card"},L(Ri,{status:h.lastJudge.decision},h.lastJudge.decision),L("strong",null,`${Math.round(Number(h.lastJudge.confidence||0)*100)}% confidence`),L("p",{"data-testid":"codex-task-judge-reason"},Q1(h.lastJudge.reason||"--",180)),L(CQ,{judge:h.lastJudge,testId:"codex-task-judge-failure-details"}),h.lastJudge.continuePrompt?L("code",{"data-testid":"codex-task-judge-continue-prompt"},Q1(h.lastJudge.continuePrompt,160)):null):L(Ny,{title:"尚未判定",text:"Codex turn 结束后会由 MiniMax M2.7 或 fallback judge 判定 complete/retry/fail;retry 会在已有 thread 追加继续执行 prompt。"}))),L($O,{stats:D8,queueName:S$,onRaw:u}),L(hi,{title:"Attempts",eyebrow:"terminal vs interruption",loading:ul},L(QO,{task:h})))))}var Qy=Ml(Ju(),1);var R=Qy.default.createElement,{useEffect:r5}=Qy.default,Wn=Qy.default.useState,fm=["all","meeting","decision","goal","blocker","debt","experiment"],nm=["all","G0","G1","G2","G3","P0","P1","P2","P3","none"],tm=["all","active","blocked","parked","done"],mO=[{id:"all",label:"全部需求"},{id:"external-goal",label:"外部目标"},{id:"internal-goal",label:"内部目标"},{id:"blocker",label:"阻塞"},{id:"parked",label:"停放事项"},{id:"authority",label:"决议/实验/债务"}],n5=[{id:"external-goal",label:"外部目标",type:"goal",level:"G0",status:"active",tags:["external-goal","requirement"]},{id:"internal-goal",label:"内部目标",type:"goal",level:"G1",status:"active",tags:["internal-goal","requirement"]},{id:"blocker",label:"阻塞",type:"blocker",level:"P0",status:"blocked",tags:["blocker","requirement"]},{id:"parked",label:"停放事项",type:"goal",level:"G3",status:"parked",tags:["parked","requirement"]},{id:"decision",label:"决议",type:"decision",level:"none",status:"active",tags:["decision"]},{id:"experiment",label:"实验",type:"experiment",level:"G2",status:"active",tags:["experiment"]},{id:"debt",label:"债务",type:"debt",level:"P2",status:"active",tags:["debt"]}],q1="frontend-work-diary.md";function L1({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return R("span",{className:`status-badge ${r}`},u||l||"unknown")}function D3({label:l,value:u,hint:r,tone:f}){return R("article",{className:`metric-card ${f||""}`},R("div",{className:"metric-label"},l),R("div",{className:"metric-value"},u),R("div",{className:"metric-hint"},r))}function hr({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return R("section",{className:`panel ${n||""}`},R("div",{className:"panel-head"},R("div",null,u?R("p",{className:"panel-eyebrow"},u):null,R(nu,{title:l,loading:t})),r?R("div",{className:"panel-actions"},r):null),R("div",{className:"panel-body"},f))}function Jy({title:l,data:u,onOpen:r,testId:f}){return R("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function rn({title:l,text:u}){return R("div",{className:"empty-state"},R("strong",null,l),R("span",null,u))}function wO(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function qO(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function LO(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function gt(l,u){return`${l}/microservices/decision-center/proxy${u}`}function im(l){if(l==="G0"||l==="G1")return"online";if(l==="P0"||l==="P1")return"failed";if(l==="none")return"unknown";return"warn"}function ym(l){if(l==="done")return"online";if(l==="blocked")return"failed";if(l==="parked")return"warn";return"unknown"}function vi(l=new Date){let u=l.getFullYear(),r=String(l.getMonth()+1).padStart(2,"0"),f=String(l.getDate()).padStart(2,"0");return`${u}-${r}-${f}`}function i5(l){return Ll(l)||"--"}function S3(l,u=220){let r=String(l||"").replace(/\s+/gu," ").trim();return r.length>u?`${r.slice(0,u-1)}...`:r}function Y3(l){return String(l||"").replace(/[^A-Za-z0-9_-]+/g,"-")||"item"}function t5(l){return String(l||"").split(",").map((u)=>u.trim()).filter(Boolean).slice(0,50)}function X3(l){return Array.isArray(l)?l.join(", "):String(l||"")}function f5(l){let u=n5.find((r)=>r.id===l)||n5[0];return{id:"",category:u?.id||"external-goal",type:u?.type||"goal",level:u?.level||"G0",status:u?.status||"active",title:"",body:"",linkedGoalId:"",tags:X3(u?.tags||[]),evidenceLinks:"",sourceSession:"frontend",taskId:"",commitId:""}}function rm(l){return{id:l?.id||"",category:"custom",type:l?.type||"meeting",level:l?.level||"none",status:l?.status||"active",title:l?.title||"",body:l?.body||l?.summary||"",linkedGoalId:l?.linkedGoalId||"",tags:X3(l?.tags),evidenceLinks:X3(l?.evidenceLinks),sourceSession:l?.sourceSession||"frontend",taskId:l?.taskId||"",commitId:l?.commitId||""}}function GO(l){return{type:l.type,level:l.level,status:l.status,title:String(l.title||"").trim(),body:String(l.body||"").trim(),linkedGoalId:String(l.linkedGoalId||"").trim(),tags:t5(l.tags),evidenceLinks:t5(l.evidenceLinks),sourceSession:String(l.sourceSession||"").trim(),taskId:String(l.taskId||"").trim(),commitId:String(l.commitId||"").trim()}}function P3(l){let u=Array.isArray(l.tags)?l.tags.map((r)=>r.toLowerCase()):[];return l.type==="goal"&&l.status!=="blocked"&&l.status!=="parked"&&(l.level==="G0"||u.includes("external-goal"))}function y5(l){let u=Array.isArray(l.tags)?l.tags.map((r)=>r.toLowerCase()):[];return l.type==="goal"&&l.status!=="blocked"&&l.status!=="parked"&&!P3(l)&&(["G1","G2","G3"].includes(l.level)||u.includes("internal-goal"))}function cm(l,u){if(u==="external-goal")return P3(l);if(u==="internal-goal")return y5(l);if(u==="blocker")return l.type==="blocker"||l.status==="blocked";if(u==="parked")return l.status==="parked";if(u==="authority")return["decision","experiment","debt"].includes(l.type);return!0}function V3(l){let u=l?.date||vi();return{date:u,title:l?.title||`${u} 工作日记`,body:l?.body||"",sourceFile:l?.sourceFile||q1,tags:X3(l?.tags||["frontend"])}}function WO(l){let u=String(l.date||vi()).trim(),r=String(l.title||`${u} 工作日记`).trim(),f=String(l.body||"").trim(),n=f.split(` -`)[0]?.trim()||"";if(n===`# ${u}`||n.startsWith(`# ${u} `)||n===`# ${r}`)return f;return`# ${u} +不会删除磁盘上的实际目录。`)))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(` +`),n=l.split(/\r?\n\s*\r?\n/u).slice(0,2).join(` -${f||`## ${r} -`}`.trim()}function bi({record:l,onRaw:u,compact:r,onEdit:f}){let n=Array.isArray(l.tags)?l.tags:[],t=Array.isArray(l.evidenceLinks)?l.evidenceLinks:[];return R("article",{className:`decision-record-card ${r?"compact":""}`,"data-testid":`decision-record-${Y3(l.id)}`},R("div",{className:"decision-record-head"},R("div",null,R("div",{className:"decision-record-meta"},R("span",null,l.type||"--"),R(L1,{status:im(l.level)},l.level||"none"),R(L1,{status:ym(l.status)},l.status||"--")),R("strong",null,l.title||"--")),R("div",{className:"inline-actions"},f?R("button",{type:"button",className:"ghost-btn",onClick:()=>f(l),"data-testid":`edit-record-${Y3(l.id)}`},"编辑"):null,R(Jy,{title:`Decision ${l.id}`,data:l,onOpen:u}))),r?R("p",{className:"decision-summary"},S3(l.summary||l.body)):R(c1,{markdown:l.body||l.summary||"",className:"decision-markdown"}),R("div",{className:"decision-record-foot"},l.linkedGoalId?R("code",null,`goal:${l.linkedGoalId}`):null,l.taskId?R("code",null,`task:${l.taskId}`):null,l.commitId?R("code",null,l.commitId.slice(0,12)):null,R("span",null,i5(l.updatedAt))),n.length>0?R("div",{className:"decision-tags"},n.slice(0,8).map((i)=>R("span",{key:i},i))):null,t.length>0?R("div",{className:"decision-evidence"},t.slice(0,4).map((i)=>R("a",{key:i,href:i,target:"_blank",rel:"noreferrer"},S3(i,58)))):null)}function TO({records:l,onRaw:u,onEdit:r}){if(!l.length)return R(rn,{title:"暂无记录",text:"通过 CLI 上传会议记录或决议后会显示在这里。"});return R("div",{className:"table-wrap"},R("table",{className:"decision-table","data-testid":"decision-center-record-table"},R("thead",null,R("tr",null,R("th",null,"等级"),R("th",null,"状态"),R("th",null,"类型"),R("th",null,"标题"),R("th",null,"摘要"),R("th",null,"证据"),R("th",null,"更新"),R("th",null,"操作"))),R("tbody",null,l.map((f)=>R("tr",{key:f.id},R("td",null,R(L1,{status:im(f.level)},f.level||"none")),R("td",null,R(L1,{status:ym(f.status)},f.status||"--")),R("td",null,f.type||"--"),R("td",null,R("strong",null,f.title||"--"),f.linkedGoalId?R("code",null,f.linkedGoalId):null),R("td",null,S3(f.summary||f.body,180)),R("td",null,Array.isArray(f.evidenceLinks)?f.evidenceLinks.length:0),R("td",null,i5(f.updatedAt)),R("td",null,R("div",{className:"inline-actions"},r?R("button",{type:"button",className:"ghost-btn",onClick:()=>r(f),"data-testid":`table-edit-record-${Y3(f.id)}`},"编辑"):null,R(Jy,{title:`Decision ${f.id}`,data:f,onOpen:u}))))))))}function Uy(l){return l.map((u)=>R("option",{key:u,value:u},u))}function KO(l){let u=new URLSearchParams;if(l.type!=="all")u.set("type",l.type);if(l.status!=="all")u.set("status",l.status);if(l.level!=="all")u.set("level",l.level);if(l.linkedGoalId.trim())u.set("linkedGoalId",l.linkedGoalId.trim());return u.set("limit","240"),u.toString()}function EO(l){let u=new URLSearchParams;if(l.month!=="all")u.set("month",l.month);if(l.from.trim())u.set("from",l.from.trim());if(l.to.trim())u.set("to",l.to.trim());return u.set("limit","180"),u.toString()}function pO({entry:l,selected:u,onSelect:r,onRaw:f}){return R("article",{className:`diary-entry-card ${u?"selected":""}`,"data-testid":`diary-entry-${Y3(l.date||l.id)}`},R("button",{type:"button",className:"diary-entry-main",onClick:()=>r(l)},R("span",{className:"diary-date"},l.date||"--"),R("strong",null,l.title||l.markdownPath||"--"),R("span",null,S3(l.summary||l.body,180))),R("div",{className:"decision-record-foot"},R("code",null,l.markdownPath||"--"),R("span",null,i5(l.updatedAt||l.importedAt)),R(Jy,{title:`Diary ${l.date||l.id}`,data:l,onOpen:f})))}function zO({records:l,activeView:u,onView:r,onEdit:f,onRaw:n}){let t=[{id:"external-goal",title:"外部目标",eyebrow:"G0 / user-facing",records:l.filter(P3)},{id:"internal-goal",title:"内部目标",eyebrow:"G1-G3 / delivery",records:l.filter(y5)},{id:"blocker",title:"阻塞",eyebrow:"P0-P1 / blocked",records:l.filter((i)=>i.type==="blocker"||i.status==="blocked")},{id:"parked",title:"停放事项",eyebrow:"Parked",records:l.filter((i)=>i.status==="parked")},{id:"authority",title:"决议/实验/债务",eyebrow:"Decision / Experiment / Debt",records:l.filter((i)=>["decision","experiment","debt"].includes(i.type))}];return R("div",{className:"requirement-workspace","data-testid":"requirement-workspace"},R("div",{className:"requirement-switcher",role:"tablist","aria-label":"需求视图"},mO.map((i)=>R("button",{key:i.id,type:"button",className:u===i.id?"active":"",onClick:()=>r(i.id),"data-testid":`requirement-filter-${i.id}`},i.label))),R("div",{className:"requirement-lanes"},t.map((i)=>{let y=i.records.filter((c)=>cm(c,u)).slice(0,10);return R("section",{key:i.id,className:"requirement-lane","data-testid":`requirement-lane-${i.id}`},R("div",{className:"requirement-lane-head"},R("div",null,R("p",{className:"panel-eyebrow"},i.eyebrow),R("strong",null,i.title)),R(L1,{status:i.records.length>0?"unknown":"warn"},i.records.length)),y.length===0?R(rn,{title:"暂无条目",text:"用右侧录入台补齐该类需求或筛选条件。"}):R("div",{className:"decision-card-list"},y.map((c)=>R(bi,{key:c.id,record:c,onRaw:n,onEdit:f,compact:!0}))))})))}function OO({form:l,saving:u,message:r,error:f,onChange:n,onCategory:t,onSubmit:i,onReset:y}){return R("form",{className:"record-editor-form",onSubmit:i,"data-testid":"record-editor"},R("div",{className:"editor-mode-grid"},n5.map((c)=>R("button",{key:c.id,type:"button",className:l.category===c.id?"active":"",onClick:()=>t(c.id),"data-testid":`record-template-${c.id}`},c.label))),R("div",{className:"decision-form-grid"},R("label",null,"标题",R("input",{value:l.title,onChange:(c)=>n("title",c.target.value),placeholder:"需求、阻塞、决议或实验标题","data-testid":"record-title-input"})),R("label",null,"类型",R("select",{value:l.type,onChange:(c)=>n("type",c.target.value),"data-testid":"record-type-select"},Uy(fm.filter((c)=>c!=="all")))),R("label",null,"等级",R("select",{value:l.level,onChange:(c)=>n("level",c.target.value),"data-testid":"record-level-select"},Uy(nm.filter((c)=>c!=="all")))),R("label",null,"状态",R("select",{value:l.status,onChange:(c)=>n("status",c.target.value),"data-testid":"record-status-select"},Uy(tm.filter((c)=>c!=="all")))),R("label",null,"Linked Goal",R("input",{value:l.linkedGoalId,onChange:(c)=>n("linkedGoalId",c.target.value),placeholder:"关联目标 id"})),R("label",null,"Tags",R("input",{value:l.tags,onChange:(c)=>n("tags",c.target.value),placeholder:"external-goal, requirement"})),R("label",{className:"wide"},"正文 Markdown",R("textarea",{value:l.body,onChange:(c)=>n("body",c.target.value),placeholder:`- 背景 +`);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||`## ${f} +`}`.trim()}function qc(u){let l=String(u.date||Bn()).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:`- 背景 - 验收标准 -- 下一步`,"data-testid":"record-body-editor"})),R("label",null,"证据链接",R("input",{value:l.evidenceLinks,onChange:(c)=>n("evidenceLinks",c.target.value),placeholder:"逗号分隔 URL"})),R("label",null,"Task ID",R("input",{value:l.taskId,onChange:(c)=>n("taskId",c.target.value),placeholder:"可选"})),R("label",null,"Commit ID",R("input",{value:l.commitId,onChange:(c)=>n("commitId",c.target.value),placeholder:"可选"}))),R("div",{className:"dispatch-actions"},R("button",{type:"submit",disabled:u||!String(l.title||"").trim(),"data-testid":"save-record-button"},u?"保存中":l.id?"保存记录":"创建记录"),R("button",{type:"button",className:"ghost-btn",disabled:u,onClick:y},"新建"),l.id?R("code",null,l.id):null),r?R("p",{className:"muted paragraph","data-testid":"record-editor-message"},r):null,R(el,{error:f,title:"记录保存失败",wide:!0}))}function ZO({form:l,saving:u,message:r,error:f,onChange:n,onToday:t,onSubmit:i}){return R("form",{className:"diary-editor-form",onSubmit:i,"data-testid":"diary-editor"},R("div",{className:"decision-form-grid diary-editor-grid"},R("label",null,"日期",R("input",{type:"date",value:l.date,onChange:(y)=>n("date",y.target.value),"data-testid":"diary-date-input"})),R("label",null,"标题",R("input",{value:l.title,onChange:(y)=>n("title",y.target.value),placeholder:"工作日记标题"})),R("label",null,"Source File",R("input",{value:l.sourceFile,onChange:(y)=>n("sourceFile",y.target.value),placeholder:q1})),R("label",null,"Tags",R("input",{value:l.tags,onChange:(y)=>n("tags",y.target.value),placeholder:"frontend, daily"})),R("label",{className:"wide"},"Markdown",R("textarea",{value:l.body,onChange:(y)=>n("body",y.target.value),placeholder:`## 今日进展 +- 下一步`,"data-testid":"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":"diary-body-editor"}))),R("div",{className:"dispatch-actions"},R("button",{type:"button",className:"ghost-btn",onClick:t,disabled:u,"data-testid":"today-diary-button"},"今天"),R("button",{type:"submit",disabled:u||!String(l.date||"").trim(),"data-testid":"save-diary-button"},u?"保存中":"保存日记"),R("code",null,`${String(l.date||vi()).slice(0,7)}/${l.date||vi()}.md`)),r?R("p",{className:"muted paragraph","data-testid":"diary-editor-message"},r):null,R(el,{error:f,title:"日记保存失败",wide:!0}))}function $m({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((k)=>k.id==="decision-center")||null,[n,t]=Wn({loading:!1,error:"",health:null,records:[],refreshedAt:null}),[i,y]=Wn({type:"all",status:"all",level:"all",linkedGoalId:""}),[c,_]=Wn("records"),[A,F]=Wn("all"),[j,N]=Wn(f5("external-goal")),[U,w]=Wn({saving:!1,error:"",message:""}),[G,J]=Wn({loading:!1,error:"",entries:[],months:[],selected:null,refreshedAt:null}),[Q,m]=Wn({month:"all",from:"",to:""}),[q,W]=Wn(V3({date:vi(),title:`${vi()} 工作日记`,tags:["frontend"]})),[p,O]=Wn({saving:!1,error:"",message:""});async function Z(){if(!f)return;t((k)=>({...k,loading:!0,error:""}));try{let k=KO(i),g=await Tl(gt(r,`/api/records?${k}`)),cl=await Tl(gt(r,"/api/diary/months")),pl=n.health,Hl="";try{pl=await Tl(`${r}/microservices/decision-center/health`)}catch(bl){Hl=zl(bl,"Decision Center health 检查失败")}t({loading:!1,error:Hl,health:pl,records:Array.isArray(g.records)?g.records:[],refreshedAt:new Date}),J((bl)=>({...bl,months:Array.isArray(cl.months)?cl.months:[]}))}catch(k){t((g)=>({...g,loading:!1,error:zl(k,"Decision Center 加载失败")}))}}async function V(){if(!f)return;J((k)=>({...k,loading:!0,error:""}));try{let k=await Tl(gt(r,`/api/diary/entries?${EO(Q)}`)),g=await Tl(gt(r,"/api/diary/months")),cl=Array.isArray(k.entries)?k.entries:[],pl=X(cl,G.selected);if(J((Hl)=>({loading:!1,error:"",entries:cl,months:Array.isArray(g.months)?g.months:Hl.months,selected:pl,refreshedAt:new Date})),pl&&!pl.body)P(pl)}catch(k){J((g)=>({...g,loading:!1,error:zl(k,"日记加载失败")}))}}async function P(k){J((g)=>({...g,selected:k}));try{let cl=(await Tl(gt(r,`/api/diary/entries/${encodeURIComponent(k.date||k.id)}`))).entry||k;J((pl)=>({...pl,selected:cl})),W(V3(cl))}catch(g){J((cl)=>({...cl,error:zl(g,"日记正文加载失败")}))}}function H(k="external-goal"){N(f5(k)),w({saving:!1,error:"",message:""})}function B(k,g){N((cl)=>({...cl,[k]:g,category:k==="type"||k==="level"||k==="status"?"custom":cl.category}))}function C(k){let g=f5(k);N((cl)=>({...cl,...g,id:cl.id||"",title:cl.title||"",body:cl.body||"",linkedGoalId:cl.linkedGoalId||"",evidenceLinks:cl.evidenceLinks||"",sourceSession:cl.sourceSession||"frontend",taskId:cl.taskId||"",commitId:cl.commitId||""}))}function E(k){N(rm(k)),w({saving:!1,error:"",message:`正在编辑 ${k?.id||""}`}),_("records")}async function D(k){k.preventDefault();let g=GO(j);if(!g.title){w({saving:!1,error:"标题不能为空",message:""});return}w({saving:!0,error:"",message:""});try{let cl=String(j.id||"").trim(),Hl=(await Tl(gt(r,cl?`/api/records/${encodeURIComponent(cl)}`:"/api/records"),{method:cl?"PUT":"POST",body:g})).record;N(rm(Hl||{...g,id:cl})),w({saving:!1,error:"",message:`${cl?"已保存":"已创建"} ${Hl?.id||cl||""}`}),await Z()}catch(cl){w({saving:!1,error:zl(cl,"记录保存失败"),message:""})}}function Y(k,g){W((cl)=>({...cl,[k]:g}))}async function v(){let k=vi();_("diary"),O({saving:!1,error:"",message:""});try{let cl=(await Tl(gt(r,`/api/diary/entries/${encodeURIComponent(k)}`))).entry;J((pl)=>({...pl,selected:cl||pl.selected})),W(V3(cl||{date:k,title:`${k} 工作日记`,tags:["frontend"]})),O({saving:!1,error:"",message:cl?`已打开今天 ${k}`:`已准备今天 ${k}`})}catch{W(V3({date:k,title:`${k} 工作日记`,body:`## 今日进展 +## 下一步`,"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:`## 今日进展 ## 阻塞 ## 下一步 -`,sourceFile:q1,tags:["frontend"]})),O({saving:!1,error:"",message:`今天 ${k} 尚未存在,保存后自动创建`})}}async function K(k){k.preventDefault();let g=String(q.date||"").trim();if(!g){O({saving:!1,error:"日期不能为空",message:""});return}O({saving:!0,error:"",message:""});try{let cl=WO(q),pl=await Tl(gt(r,"/api/diary/import"),{method:"POST",body:{markdown:cl,sourceFile:String(q.sourceFile||q1).trim()||q1,tags:t5(q.tags)}}),Hl=Array.isArray(pl.entries)?pl.entries.find((bl)=>bl.date===g)||pl.entries[0]:null;if(O({saving:!1,error:"",message:`已保存 ${g} / ${pl.pathPattern||"YYYY-MM/YYYY-MM-DD.md"}`}),await V(),Hl)await P(Hl)}catch(cl){O({saving:!1,error:zl(cl,"日记保存失败"),message:""})}}function X(k,g){if(g&&k.some((cl)=>cl.id===g.id))return g;return k[0]||null}if(r5(()=>{Z()},[f?.id,f?.runtime?.providerStatus]),r5(()=>{let k=setTimeout(()=>void Z(),120);return()=>clearTimeout(k)},[i.type,i.status,i.level,i.linkedGoalId]),r5(()=>{if(c!=="diary")return;let k=setTimeout(()=>void V(),120);return()=>clearTimeout(k)},[c,Q.month,Q.from,Q.to,f?.id,f?.runtime?.providerStatus]),!f)return R(rn,{title:"Decision Center 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=decision-center"});let I=wO(f),o=LO(f),fl=qO(f),yl=Array.isArray(n.records)?n.records:[],h=yl.filter((k)=>P3(k)&&k.status!=="done"),s=yl.filter((k)=>y5(k)&&k.status!=="done"),ul=yl.filter((k)=>(k.type==="blocker"||k.status==="blocked")&&k.status!=="done").slice(0,8),tl=yl.filter((k)=>k.status==="parked").slice(0,8),Al=yl.filter((k)=>["decision","experiment","debt"].includes(k.type)).slice(0,12),Kl=yl.filter((k)=>k.type==="meeting"||k.type==="decision").slice(0,12),wl=yl.filter((k)=>cm(k,A)),El=Array.isArray(G.entries)?G.entries:[],M=Array.isArray(G.months)?G.months:[],d=G.selected,nl=Number(n.health?.diaryEntryCount??0);return R("div",{className:"decision-center-page","data-testid":"decision-center-page"},R(hr,{title:"Decision Center",eyebrow:"Authority Records",loading:n.loading,actions:R("div",{className:"inline-actions"},R("button",{type:"button",className:"ghost-btn",onClick:()=>void Z(),disabled:n.loading},n.loading?"刷新中":"刷新"),R(Jy,{title:"Decision Center Health",data:n.health,onOpen:u,testId:"raw-decision-center-health"}))},R("div",{className:"decision-hero"},R("div",{className:"metric-grid"},R(D3,{label:"记录数",value:yl.length,hint:`PostgreSQL / ${n.health?.storage||"postgres"}`,tone:"ok"}),R(D3,{label:"日记",value:nl,hint:"按月 Markdown",tone:nl>0?"ok":"warn"}),R(D3,{label:"外部/内部目标",value:`${h.length}/${s.length}`,hint:"G0-facing / G1-G3 delivery",tone:"ok"}),R(D3,{label:"P0/P1 Blocker",value:ul.length,hint:"requires decision",tone:ul.length>0?"warn":"ok"})),R("div",{className:"microservice-ref-card"},R("span",null,"Runtime"),R("strong",null,I.orchestrator||f.deployment?.mode||"k3sctl"),R("code",null,`${f.providerId} / ${fl.nodeBindHost||"--"}:${fl.nodePort||"--"}`),R("code",null,o.commitId||"--"))),R(el,{error:n.error,title:"Decision Center 请求失败"})),R("div",{className:"decision-tabs",role:"tablist"},R("button",{type:"button",className:c==="records"?"active":"",onClick:()=>_("records"),"data-testid":"decision-tab-requirements"},"需求管理"),R("button",{type:"button",className:c==="diary"?"active":"",onClick:()=>_("diary"),"data-testid":"decision-tab-diary"},"工作日记")),c==="diary"?R(Qy.default.Fragment,null,R(hr,{title:"工作日记编辑台",eyebrow:"Daily Markdown",loading:p.saving,actions:R("div",{className:"inline-actions"},R("button",{type:"button",className:"ghost-btn",onClick:()=>void v(),disabled:p.saving,"data-testid":"today-diary"},"今天"))},R(ZO,{form:q,saving:p.saving,message:p.message,error:p.error,onChange:Y,onToday:()=>void v(),onSubmit:(k)=>void K(k)})),R(hr,{title:"日记筛选",eyebrow:"Markdown by Month",loading:G.loading,actions:R("div",{className:"inline-actions"},R("button",{type:"button",className:"ghost-btn",onClick:()=>void V(),disabled:G.loading},G.loading?"刷新中":"刷新"),R(Jy,{title:"Diary Months",data:M,onOpen:u,testId:"raw-decision-center-diary-months"}))},R("div",{className:"decision-filter-bar"},R("label",null,"月份",R("select",{value:Q.month,onChange:(k)=>m((g)=>({...g,month:k.target.value}))},R("option",{value:"all"},"all"),M.map((k)=>R("option",{key:k.month,value:k.month},`${k.month} (${k.count})`)))),R("label",null,"开始日期",R("input",{type:"date",value:Q.from,onChange:(k)=>m((g)=>({...g,from:k.target.value}))})),R("label",null,"结束日期",R("input",{type:"date",value:Q.to,onChange:(k)=>m((g)=>({...g,to:k.target.value}))})),R("label",null,"存储",R("input",{value:"PostgreSQL / YYYY-MM/YYYY-MM-DD.md",readOnly:!0}))),R(el,{error:G.error,title:"日记请求失败"})),R("div",{className:"diary-layout"},R(hr,{title:"按天条目",eyebrow:`${El.length} Entries`,loading:G.loading},El.length===0?R(rn,{title:"暂无日记",text:"点击“今天”后可自动创建当天 Markdown 日记。"}):R("div",{className:"diary-entry-list"},El.map((k)=>R(pO,{key:k.id,entry:k,selected:d?.id===k.id,onSelect:P,onRaw:u})))),R(hr,{title:d?.title||"日记正文",eyebrow:d?.markdownPath||"Daily Markdown",actions:d?R(Jy,{title:`Diary ${d.date}`,data:d,onOpen:u,testId:"raw-decision-center-diary-selected"}):null},d?R(c1,{markdown:d.body||d.summary||"",className:"decision-markdown diary-markdown"}):R(rn,{title:"未选择日记",text:"从左侧选择一天查看 Markdown 正文。"})))):R(Qy.default.Fragment,null,R(hr,{title:"需求管理工作区",eyebrow:`${wl.length} Filtered`,loading:n.loading},R(zO,{records:yl,activeView:A,onView:F,onEdit:E,onRaw:u})),R(hr,{title:j.id?"编辑需求记录":"录入需求记录",eyebrow:"Record Editor",loading:U.saving},R(OO,{form:j,saving:U.saving,message:U.message,error:U.error,onChange:B,onCategory:C,onSubmit:(k)=>void D(k),onReset:()=>H()})),R(hr,{title:"筛选",eyebrow:"Type / Status / Level"},R("div",{className:"decision-filter-bar","data-testid":"decision-center-filters"},R("label",null,"类型",R("select",{value:i.type,onChange:(k)=>y((g)=>({...g,type:k.target.value}))},Uy(fm))),R("label",null,"状态",R("select",{value:i.status,onChange:(k)=>y((g)=>({...g,status:k.target.value}))},Uy(tm))),R("label",null,"等级",R("select",{value:i.level,onChange:(k)=>y((g)=>({...g,level:k.target.value}))},Uy(nm))),R("label",null,"Linked Goal",R("input",{value:i.linkedGoalId,onChange:(k)=>y((g)=>({...g,linkedGoalId:k.target.value})),placeholder:"goal id"})))),R("div",{className:"decision-default-grid"},R(hr,{title:"外部目标",eyebrow:`${h.length} External Goals`},h.length===0?R(rn,{title:"暂无外部目标",text:"外部目标使用 G0 或 external-goal tag。"}):R("div",{className:"decision-card-list"},h.slice(0,8).map((k)=>R(bi,{key:k.id,record:k,onRaw:u,onEdit:E,compact:!0})))),R(hr,{title:"内部目标",eyebrow:`${s.length} Internal Goals`},s.length===0?R(rn,{title:"暂无内部目标",text:"内部目标使用 G1/G2/G3 或 internal-goal tag。"}):R("div",{className:"decision-card-list"},s.slice(0,8).map((k)=>R(bi,{key:k.id,record:k,onRaw:u,onEdit:E,compact:!0})))),R(hr,{title:"P0/P1 Blocker",eyebrow:`${ul.length} Blockers`},ul.length===0?R(rn,{title:"暂无高优先级阻塞",text:"阻塞记录使用 type=blocker 且 level=P0/P1。"}):R("div",{className:"decision-card-list"},ul.map((k)=>R(bi,{key:k.id,record:k,onRaw:u,onEdit:E,compact:!0})))),R(hr,{title:"停放事项",eyebrow:`${tl.length} Parked`},tl.length===0?R(rn,{title:"暂无停放事项",text:"status=parked 的记录会集中展示。"}):R("div",{className:"decision-card-list"},tl.map((k)=>R(bi,{key:k.id,record:k,onRaw:u,onEdit:E,compact:!0})))),R(hr,{title:"决议/实验/债务",eyebrow:`${Al.length} Authority`},Al.length===0?R(rn,{title:"暂无权威事项",text:"决议、实验和债务会集中展示。"}):R("div",{className:"decision-card-list"},Al.map((k)=>R(bi,{key:k.id,record:k,onRaw:u,onEdit:E,compact:!0})))),R(hr,{title:"最近会议/决议",eyebrow:`${Kl.length} Recent`},Kl.length===0?R(rn,{title:"暂无会议或决议",text:"使用 CLI 上传 Markdown 会议记录后会显示。"}):R("div",{className:"decision-card-list"},Kl.map((k)=>R(bi,{key:k.id,record:k,onRaw:u,onEdit:E,compact:!0}))))),R(hr,{title:"全部记录",eyebrow:`${yl.length} Records`,actions:n.refreshedAt?R("span",{className:"muted"},`刷新 ${iu(n.refreshedAt)}`):null},R(TO,{records:yl,onRaw:u,onEdit:E}))))}var G1=Ml(Ju(),1);var Vl=G1.default.createElement,{useEffect:c5}=G1.default,$5=G1.default.useState,HO=G1.default.useRef,A5=` +`,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: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=` :root { --surfacePrimary: #ffffff; --surfaceSecondary: #f8fafc; @@ -245,64 +256,64 @@ nav .material-icons::before { display: none !important; } } -`;function _5({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return Vl("section",{className:`panel ${n||""}`},Vl("div",{className:"panel-head"},Vl("div",null,u?Vl("p",{className:"panel-eyebrow"},u):null,Vl(nu,{title:l,loading:t})),r?Vl("div",{className:"panel-actions"},r):null),Vl("div",{className:"panel-body"},f))}function BO({title:l,data:u,onOpen:r,testId:f}){return Vl("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function DO({title:l,text:u}){return Vl("div",{className:"empty-state"},Vl("strong",null,l),Vl("span",null,u))}function _m(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function Am(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function Fm(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function VO(l){return l.filter((r)=>r?.id==="filebrowser"||String(r?.id||"").startsWith("filebrowser-")).sort((r,f)=>{let n=(t)=>t.providerId==="D518"?0:t.providerId==="D601"?1:t.id==="filebrowser"?2:3;return n(r)-n(f)||String(r.id).localeCompare(String(f.id))})}function SO(l){if(l?.providerId==="D518")return"D518";return l?.providerId||l?.name||l?.id||"Unknown"}function YO(l,u,r="/"){let f=r.startsWith("/")?r:`/${r}`;return`${l}/microservices/${encodeURIComponent(u)}/proxy${f}`}function XO(l,u){return`${l}/microservices/${encodeURIComponent(u)}/health`}async function PO(l,u=16000){let r=new AbortController,f=setTimeout(()=>r.abort(),u);try{return await Tl(l,{signal:r.signal,failureFields:[!1]})}finally{clearTimeout(f)}}function jm(l){if(l?.providerId==="main-server")return"host / -> /srv";if(l?.providerId==="D601"||l?.providerId==="D518")return"WSL / + /mnt/c -> /srv";return"provider / -> /srv"}function C3(l){return l?.status==="OK"||l?.ok===!0}function CO({service:l,active:u,health:r,onSelect:f,onRaw:n}){let t=_m(l),i=Am(l),y=Fm(l),c=t.container||{},_=C3(r?.body);return Vl("button",{type:"button",className:`filebrowser-target-card ${u?"active":""}`,"data-testid":`filebrowser-target-card-${l.id}`,onClick:f},Vl("span",{className:`status-badge ${_?"ok":t.providerStatus==="online"?"running":"warn"}`},_?"Health OK":t.providerStatus||"unknown"),Vl("strong",null,l.name||l.id),Vl("span",null,jm(l)),Vl("code",null,`${i.nodeBindHost||"--"}:${i.nodePort||"--"}`),Vl("small",null,c.name?`${c.name} / ${c.state||"--"}`:`${y.composeService||"--"}`),Vl("span",{className:"filebrowser-card-raw",onClick:(A)=>{A.stopPropagation(),n(`${l.name} service`,l)}},"JSON"))}function Nm(l){try{return l?.contentDocument||l?.contentWindow?.document||null}catch{return null}}function F5(l){let u=Nm(l);if(u===null||u.head===null)return!1;let r=u.getElementById("unidesk-filebrowser-compact-style");if(r===null)r=u.createElement("style"),r.id="unidesk-filebrowser-compact-style",u.head.appendChild(r);if(r.textContent!==A5)r.textContent=A5;return!0}function hO(l,u){let r=URL.createObjectURL(l),f=document.createElement("a");f.href=r,f.download=u,document.body.appendChild(f),f.click(),f.remove(),setTimeout(()=>URL.revokeObjectURL(r),2000)}function MO(l,u){let r=Nm(l);if(r===null||r.documentElement===null)throw Error("无法访问 File Browser iframe 文档");F5(l);let f=Math.max(640,Math.ceil(l.clientWidth||r.documentElement.clientWidth||1280)),n=Math.max(480,Math.ceil(l.clientHeight||r.documentElement.clientHeight||720)),t=r.documentElement.cloneNode(!0);t.querySelectorAll("script, style, link[rel='stylesheet'], link[rel='preload'], link[rel='icon']").forEach((A)=>A.remove()),t.querySelectorAll("img").forEach((A)=>{A.removeAttribute("src"),A.removeAttribute("srcset")});let i=t.querySelector("head");if(i===null)i=r.createElement("head"),t.insertBefore(i,t.firstChild);let y=r.createElement("style");y.textContent=`${A5} -html,body{width:${f}px!important;min-height:${n}px!important;overflow:hidden!important;}`,i.appendChild(y);let c=new XMLSerializer().serializeToString(t),_=`${c}`;hO(new Blob([_],{type:"image/svg+xml;charset=utf-8"}),u.replace(/\.png$/i,".svg"))}function Jm({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=VO(Array.isArray(l)?l:[]),n=new URLSearchParams(window.location.search).get("target")||"",t=n==="filebrowser-d518"?"filebrowser":n,i=f.some((p)=>p.id===t)?t:f[0]?.id||"",[y,c]=$5(i),[_,A]=$5({loading:!1,refreshedAt:null,health:{},error:""}),[F,j]=$5({exporting:!1,message:"",error:""}),N=HO(null),U=f.find((p)=>p.id===y)||f[0]||null,w=_m(U),G=Am(U),J=Fm(U),Q=U?_.health[U.id]:null,m=U?YO(r,U.id,"/"):"about:blank";c5(()=>{if(f.length===0)return;if(!y||!f.some((p)=>p.id===y))c(f[0].id)},[f.map((p)=>p.id).join(",")]),c5(()=>{let p=0,O=setInterval(()=>{if(p+=1,F5(N.current)||p>=24)clearInterval(O)},500);return()=>clearInterval(O)},[m]),c5(()=>{if(f.length===0)return;let p=!1;async function O(){A((P)=>({...P,loading:!0,error:""}));let V=await Promise.all(f.map(async(P)=>{try{let H=await PO(XO(r,P.id));return[P.id,{ok:!0,body:H}]}catch(H){return[P.id,{ok:!1,error:zl(H,"File Browser health failed")}]}}));if(p)return;A({loading:!1,refreshedAt:new Date().toISOString(),health:Object.fromEntries(V),error:""})}O();let Z=setInterval(O,30000);return()=>{p=!0,clearInterval(Z)}},[f.map((p)=>`${p.id}:${p.runtime?.providerStatus||""}`).join(","),r]);function q(p){c(p);let O=new URL(window.location.href);O.searchParams.set("target",p),window.history.replaceState({},"",`${O.pathname}${O.search}`)}async function W(){if(F.exporting)return;j({exporting:!0,message:"",error:""});try{let p=new Date().toISOString().replace(/[-:.TZ]/g,"").slice(0,14);await MO(N.current,`unidesk-filebrowser-${U?.id||"target"}-${p}.png`),j({exporting:!1,message:"截图已导出",error:""})}catch(p){j({exporting:!1,message:"",error:zl(p,"截图导出失败")})}}if(f.length===0)return Vl(DO,{title:"File Browser 未登记",text:"请在 config.json 的 microservices 中登记 id=filebrowser 或 filebrowser-* 用户服务"});return Vl("div",{className:"filebrowser-page","data-testid":"filebrowser-page"},_.error?Vl(el,{error:_.error,wide:!0}):null,Vl(_5,{title:"文件管理器",eyebrow:"File Browser / Host Files",loading:_.loading,actions:Vl("div",{className:"panel-actions"},U?Vl("button",{type:"button",className:"ghost-btn",onClick:W,disabled:F.exporting,"data-testid":"filebrowser-export-screenshot"},F.exporting?"导出中...":"导出截图"):null,U?Vl("a",{className:"ghost-btn",href:m,target:"_blank",rel:"noreferrer"},"新窗口打开"):null,U?Vl(BO,{title:"File Browser 当前目标",data:{service:U,health:Q},onOpen:u,testId:"raw-filebrowser-active"}):null)},Vl("div",{className:"filebrowser-hero"},Vl("div",null,Vl("span",{className:`status-badge ${C3(Q?.body)?"ok":"warn"}`},C3(Q?.body)?"Health OK":"Health Pending"),Vl("h3",null,U?.name||"File Browser"),Vl("p",{className:"muted paragraph"},U?.description||"通过 UniDesk 登录态代理访问,不开放 File Browser 公网端口。"),F.error?Vl("p",{className:"filebrowser-shot-error"},F.error):null,F.message?Vl("p",{className:"filebrowser-shot-ok"},F.message):null),Vl("div",{className:"microservice-ref-card"},Vl("span",null,"Provider"),Vl("strong",null,U?.providerId||"--"),Vl("code",null,w.providerName||U?.providerId||"--")),Vl("div",{className:"microservice-ref-card"},Vl("span",null,"Private Backend"),Vl("strong",null,`${G.nodeBindHost||"--"}:${G.nodePort||"--"}`),Vl("code",null,G.nodeBaseUrl||"--")),Vl("div",{className:"microservice-ref-card"},Vl("span",null,"Image"),Vl("strong",null,J.dockerfile||"filebrowser/filebrowser:v2.63.3"),Vl("code",null,J.commitId||"--")),Vl("div",{className:"microservice-ref-card"},Vl("span",null,"Mount"),Vl("strong",null,jm(U)),Vl("code",null,U?.providerId==="main-server"?"/root, /var, /home":"/home, /mnt/c, /mnt/d")))),Vl(_5,{title:"浏览目标",eyebrow:`${f.length} host targets`,loading:_.loading},Vl("div",{className:"filebrowser-target-grid"},f.map((p)=>Vl(CO,{key:p.id,service:p,active:p.id===U?.id,health:_.health[p.id],onSelect:()=>q(p.id),onRaw:u})))),Vl(_5,{title:`${SO(U)} 文件视图`,eyebrow:Q?.body?`Health ${C3(Q.body)?"OK":"UNKNOWN"} / ${_.refreshedAt?iu(_.refreshedAt):"--"}`:"Embedded WebUI",className:"filebrowser-frame-panel"},Vl("div",{className:"filebrowser-frame-shell"},Vl("div",{className:"filebrowser-frame-toolbar"},Vl("span",null,"BaseURL"),Vl("code",null,`/api/microservices/${U?.id||"filebrowser"}/proxy`),Vl("span",null,"Root"),Vl("code",null,"/srv"),Vl("span",{className:"filebrowser-compact-note"},"Compact layout injected")),Vl("iframe",{ref:N,key:m,title:`${U?.name||"File Browser"} WebUI`,src:m,className:"filebrowser-frame","data-testid":"filebrowser-frame",onLoad:(p)=>F5(p.currentTarget),sandbox:"allow-downloads allow-forms allow-modals allow-same-origin allow-scripts"}))))}var R3=Ml(Ju(),1);var Ul=R3.default.createElement,{useEffect:sO}=R3.default,RO=R3.default.useState;function h3({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return Ul("span",{className:`status-badge ${r}`},u||l||"unknown")}function kt({label:l,value:u,hint:r,tone:f}){return Ul("article",{className:`metric-card ${f||""}`},Ul("div",{className:"metric-label"},l),Ul("div",{className:"metric-value"},u),Ul("div",{className:"metric-hint"},r))}function M3({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return Ul("section",{className:`panel ${n||""}`},Ul("div",{className:"panel-head"},Ul("div",null,u?Ul("p",{className:"panel-eyebrow"},u):null,Ul(nu,{title:l,loading:t})),r?Ul("div",{className:"panel-actions"},r):null),Ul("div",{className:"panel-body"},f))}function s3({title:l,data:u,onOpen:r,testId:f}){return Ul("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function j5({title:l,text:u}){return Ul("div",{className:"empty-state"},Ul("strong",null,l),Ul("span",null,u))}function xO(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function bO(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function vO(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function gi(l,u){let r=l&&typeof l==="object"?l[u]:void 0;return Number.isFinite(Number(r))?String(r):"--"}function gO(l){return(Array.isArray(l?.jobs)?l.jobs:[]).slice(0,40)}function kO(l){return(Array.isArray(l?.drafts)?l.drafts:[]).slice(0,12)}function Um({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((U)=>U.id==="findjob")||null,[n,t]=RO({loading:!1,error:"",health:null,summary:null,jobs:null,drafts:null,refreshedAt:null});async function i(){if(!f)return;t((U)=>({...U,loading:!0,error:""}));try{let[U,w,G,J]=await Promise.all([Tl(`${r}/microservices/findjob/health`),Tl(`${r}/microservices/findjob/proxy/api/summary`),Tl(`${r}/microservices/findjob/proxy/api/jobs?__unideskArrayLimit=jobs:40`),Tl(`${r}/microservices/findjob/proxy/api/drafts`)]);t({loading:!1,error:"",health:U,summary:w,jobs:G,drafts:J,refreshedAt:new Date})}catch(U){t((w)=>({...w,loading:!1,error:zl(U,"FindJob 加载失败")}))}}if(sO(()=>{i()},[f?.id,f?.runtime?.providerStatus]),!f)return Ul(j5,{title:"FindJob 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=findjob"});let y=xO(f),c=vO(f),_=bO(f),A=n.summary||{},F=gO(n.jobs),j=kO(n.drafts),N=n.jobs?._unidesk?.arrayLimits?.jobs;return Ul("div",{className:"findjob-page","data-testid":"findjob-page"},Ul(M3,{title:"FindJob 工作台",eyebrow:"D601 用户服务",loading:n.loading,actions:Ul("div",{className:"panel-actions"},Ul("button",{type:"button",className:"ghost-btn",onClick:i,disabled:n.loading,"data-testid":"findjob-refresh-button"},n.loading?"刷新中":"刷新"),Ul(s3,{title:"FindJob 用户服务",data:f,onOpen:u,testId:"raw-findjob-service"}))},Ul("div",{className:"findjob-hero"},Ul("div",null,Ul("div",{className:"node-version-line"},Ul(h3,{status:y.providerStatus==="online"?"online":"warn"},y.providerStatus||"unknown"),Ul("span",null,f.providerId),Ul("span",null,_.public?"公网暴露":"仅 UniDesk frontend 代理访问")),Ul("p",{className:"muted paragraph"},f.description)),Ul("div",{className:"microservice-ref-card"},Ul("span",null,"Repo"),Ul("strong",null,c.url||"--"),Ul("code",null,c.commitId||"--")),Ul("div",{className:"microservice-ref-card"},Ul("span",null,"D601 Docker"),Ul("strong",null,`${_.nodeBindHost||"--"}:${_.nodePort||"--"}`),Ul("code",null,`${c.composeFile||"--"} / ${c.composeService||"--"}`))),Ul(el,{error:n.error,wide:!0})),Ul("div",{className:"findjob-grid"},Ul(M3,{title:"岗位指标",eyebrow:n.refreshedAt?`Updated ${iu(n.refreshedAt)}`:"Summary",loading:n.loading},Ul("div",{className:"metric-grid"},Ul(kt,{label:"岗位总量",value:gi(A,"totalJobs"),hint:"tracked jobs",tone:"ok"}),Ul(kt,{label:"原始岗位",value:gi(A,"rawJobs"),hint:"raw queue"}),Ul(kt,{label:"已验证",value:gi(A,"verifiedJobs"),hint:"verified set"}),Ul(kt,{label:"优先处理",value:gi(A,"prioritizedJobs"),hint:"prioritized"}),Ul(kt,{label:"过期",value:gi(A,"staleJobs"),hint:"stale jobs",tone:"warn"}),Ul(kt,{label:"无效",value:gi(A,"invalidJobs"),hint:"invalid jobs",tone:"warn"}),Ul(kt,{label:"上海",value:gi(A,"shanghaiJobs"),hint:"city filter"}),Ul(kt,{label:"Health",value:n.health?.ok?"OK":"--",hint:"D601 /api/health"})),Ul("div",{className:"panel-actions inline-actions"},Ul(s3,{title:"FindJob Summary",data:A,onOpen:u,testId:"raw-findjob-summary"}))),Ul(M3,{title:"近期岗位",eyebrow:N?`${N.returnedLength}/${N.originalLength} Preview`:`${F.length} Preview`,loading:n.loading},F.length===0?Ul(j5,{title:"暂无岗位预览",text:"等待 D601 findjob backend 返回 /api/jobs"}):Ul("div",{className:"table-wrap findjob-job-table"},Ul("table",null,Ul("thead",null,Ul("tr",null,Ul("th",null,"优先级"),Ul("th",null,"状态"),Ul("th",null,"单位"),Ul("th",null,"职位"),Ul("th",null,"城市"),Ul("th",null,"阶段"),Ul("th",null,"截止"),Ul("th",null,"证据"))),Ul("tbody",null,F.map((U)=>Ul("tr",{key:U.id},Ul("td",null,Ul(h3,{status:String(U.priority||"").toLowerCase()||"unknown"},U.priority||"--")),Ul("td",null,Ul(h3,{status:String(U.status||"").toLowerCase()||"unknown"},U.status||"--")),Ul("td",null,U.organization_name||"--",Ul("code",null,U.id||"--")),Ul("td",null,U.display_title||U.title||"--"),Ul("td",null,U.display_city||U.city||"--"),Ul("td",null,U.workflow_stage||"--"),Ul("td",null,U.deadline||"--"),Ul("td",null,U.evidence_url?Ul("a",{href:U.evidence_url,target:"_blank",rel:"noreferrer"},"打开"):Ul("span",{className:"muted"},"无"))))))),Ul("div",{className:"panel-actions inline-actions"},Ul(s3,{title:"FindJob Jobs Preview",data:n.jobs,onOpen:u,testId:"raw-findjob-jobs"}))),Ul(M3,{title:"草稿与报告",eyebrow:`${j.length} Drafts`,loading:n.loading},j.length===0?Ul(j5,{title:"暂无草稿",text:"D601 findjob backend 未返回 drafts"}):Ul("div",{className:"draft-list"},j.map((U)=>Ul("article",{key:U.id,className:"draft-card"},Ul("div",{className:"node-card-head"},Ul("strong",null,U.id),Ul(h3,{status:U.status},U.status||"--")),Ul("div",{className:"docker-meta compact"},Ul("span",null,U.workflow_stage||"--"),Ul("span",null,`jobs ${U.counts?.jobs??0}`),Ul("span",null,`reports ${U.counts?.reports??0}`)),Ul("span",null,U.latestReportPath||"暂无报告"),Ul("code",null,Ll(U.updated_at||U.updatedAt))))),Ul("div",{className:"panel-actions inline-actions"},Ul(s3,{title:"FindJob Drafts",data:n.drafts,onOpen:u,testId:"raw-findjob-drafts"})))))}var E1=Ml(Ju(),1);var x=E1.default.createElement,{useEffect:IO}=E1.default,N5=E1.default.useState;function W1(l){let u=Number(l);return Number.isFinite(u)?`${Math.max(0,Math.min(100,u)).toFixed(1)}%`:"--"}function U5(l){if(l===null||l===void 0||l==="")return"--";let u=Number(l);if(!Number.isFinite(u))return"--";if(u<60)return`${Math.max(0,Math.round(u))}s`;if(u<3600)return`${Math.floor(u/60)}m ${Math.round(u%60)}s`;return`${Math.floor(u/3600)}h ${Math.floor(u%3600/60)}m`}function Q5(l,u=2){let r=Number(l);if(!Number.isFinite(r))return l===!1?"false":l===!0?"true":"--";let f=Math.abs(r);if(Number.isInteger(r)||f>=1000)return r.toLocaleString("zh-CN",{maximumFractionDigits:0});if(f>=1)return r.toLocaleString("zh-CN",{maximumFractionDigits:u});return r.toLocaleString("zh-CN",{maximumFractionDigits:Math.max(u,6)})}function K1(l){if(l===null||l===void 0||l==="")return"--";if(typeof l==="boolean")return l?"true":"false";if(typeof l==="number")return Q5(l,4);if(Array.isArray(l))return l.map((u)=>K1(u)).join(" x ");if(typeof l==="object")return"已上报";return String(l)}function x3(l){let u=Number(l);if(!Number.isFinite(u)||u<=0)return"--";let r=u>=100?0:u>=10?1:2;return`${u.toLocaleString("zh-CN",{maximumFractionDigits:r})} epoch/h`}function b3(l){return l.replace(/[^a-zA-Z0-9_-]/g,"-")}function or(l){return l&&typeof l==="object"&&!Array.isArray(l)?l:{}}function T1({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return x("span",{className:`status-badge ${r}`},u||l||"unknown")}function It({label:l,value:u,hint:r,tone:f}){return x("article",{className:`metric-card ${f||""}`},x("div",{className:"metric-label"},l),x("div",{className:"metric-value"},u),x("div",{className:"metric-hint"},r))}function J5({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return x("section",{className:`panel ${n||""}`},x("div",{className:"panel-head"},x("div",null,u?x("p",{className:"panel-eyebrow"},u):null,x(nu,{title:l,loading:t})),r?x("div",{className:"panel-actions"},r):null),x("div",{className:"panel-body"},f))}function my({title:l,data:u,onOpen:r,testId:f}){return x("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:(n)=>{n?.stopPropagation?.(),r(l,u)}},"查看原始JSON")}function lt({title:l,text:u}){return x("div",{className:"empty-state"},x("strong",null,l),x("span",null,u))}function aO(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function oO(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function dO(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function eO(l){return l?.counts&&typeof l.counts==="object"&&!Array.isArray(l.counts)?l.counts:{}}function lZ(l){return Array.isArray(l?.jobs)?l.jobs.slice(0,240):[]}function uZ(l){return Array.isArray(l?.projects)?l.projects.slice(0,1000):[]}function v3(l){return Array.isArray(l?.projects)?l.projects:[]}function rZ(l,u){if(Array.isArray(u?.gpu))return u.gpu;if(Array.isArray(l?.gpu))return l.gpu;return[]}function Qf(l,u){return`${l}/microservices/met-nonlinear/proxy${u}`}function Qm(l){return l.startedAt&&l.finishedAt?U5((Date.parse(l.finishedAt)-Date.parse(l.startedAt))/1000):"--"}function fZ(l){let u=l.progress||{};if(u.etaSeconds!==null&&u.etaSeconds!==void 0&&u.etaSeconds!==""){let i=Number(u.etaSeconds);if(Number.isFinite(i))return Math.max(0,i)}let r=Number(u.currentEpoch),f=Number(u.epochTarget??l.epochTarget),n=Date.parse(l.startedAt||"");if(!Number.isFinite(r)||r<=0||!Number.isFinite(f)||f<=r||!Number.isFinite(n))return null;let t=Math.max(0,(Date.now()-n)/1000);if(t<=0)return null;return Math.max(0,t/r*(f-r))}function mm(l){let u=l.progress||{},r=Number(u.epochPerHour);if(Number.isFinite(r)&&r>0)return r;let f=Date.parse(l.startedAt||""),n=["succeeded","failed","canceled"].includes(l.status)?Date.parse(l.finishedAt||""):Date.now();if(!Number.isFinite(f)||!Number.isFinite(n)||n<=f)return null;let t=Number(u.currentEpoch??l.epochTarget);if(!Number.isFinite(t)||t<=0)return null;return t/((n-f)/3600000)}function wm(l){if(l==="staged")return"待启动";if(l==="queued")return"排队中";if(l==="running")return"训练中";if(l==="succeeded")return"已完成";if(l==="failed")return"失败";if(l==="canceled")return"已取消";return l||"unknown"}function qm(l,u,r){return{name:l,path:u,depth:r,count:0,children:[],project:null}}function nZ(l){let u=qm("","",-1);for(let f of l){let t=String(f?.projectPath||"").replace(/\\/g,"/").split("/").filter(Boolean);if(t.length===0)continue;let i=u,y=[];for(let[c,_]of t.entries()){y.push(_);let A=y.join("/"),F=i.children.find((j)=>j.path===A);if(!F)F=qm(_,A,c),i.children.push(F);if(c===t.length-1)F.project=f;i=F}}let r=(f)=>{let n=f.children.reduce((t,i)=>t+r(i),0);return f.count=(f.project?1:0)+n,f.children.sort((t,i)=>{if(Boolean(t.project)!==Boolean(i.project))return t.project?1:-1;return t.name.localeCompare(i.name,"zh-CN",{numeric:!0,sensitivity:"base"})}),f.count};return r(u),u}function tZ(l){let u=or(l.data);return or(u.project).projectPath?or(u.project):u}function iZ(l){return or(or(l.data).job)}function Lm({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((M)=>M.id==="met-nonlinear")||null,[n,t]=N5({loading:!1,actionBusy:!1,error:"",health:null,summary:null,queue:null,projects:null,history:null,images:null,refreshedAt:null}),[i,y]=N5({loading:!1,error:"",kind:"",key:"",title:"",data:null}),[c,_]=N5(()=>({activeTab:"projects",selectedProjects:{},expandedProjectDirs:{},sourceProject:"",forkCount:1,forkEpochs:200,forkPrefix:`ui_fork_${Date.now()}`,maxConcurrency:3,targetGpuName:"2080 Ti",actionMessage:""}));function A(M){_((d)=>({...d,...M}))}async function F(M=c.activeTab){if(!f)return;t((d)=>({...d,loading:!0,error:""}));try{let d=[["health",Tl(`${r}/microservices/met-nonlinear/health`)],["summary",Tl(Qf(r,"/api/summary"))]];if(M==="projects")d.push(["projectsRoot",Tl(Qf(r,"/api/projects?root=projects&limit=500"))]),d.push(["exProjectsRoot",Tl(Qf(r,"/api/projects?root=ex_projects&limit=500"))]);if(M==="current"||M==="completed"||M==="failed")d.push(["queue",Tl(Qf(r,"/api/queue"))]);if(M==="completed"||M==="failed")d.push(["history",Tl(Qf(r,"/api/history"))]);if(M==="gpu")d.push(["images",Tl(Qf(r,"/api/images"))]);let nl=Object.fromEntries(await Promise.all(d.map(async([g,cl])=>[g,await cl]))),k={loading:!1,actionBusy:!1,error:"",health:nl.health,summary:nl.summary,refreshedAt:new Date};if(nl.projectsRoot||nl.exProjectsRoot){let{projectsRoot:g,exProjectsRoot:cl}=nl;k.projects={ok:g?.ok!==!1&&cl?.ok!==!1,roots:[{root:"projects",count:v3(g).length},{root:"ex_projects",count:v3(cl).length}],projects:[...v3(g),...v3(cl)]}}if(nl.queue)k.queue=nl.queue;if(nl.history)k.history=nl.history;if(nl.images)k.images=nl.images;t((g)=>({...g,...k}))}catch(d){t((nl)=>({...nl,loading:!1,actionBusy:!1,error:zl(d,"MET Nonlinear 加载失败")}))}}async function j(M,d){t((nl)=>({...nl,actionBusy:!0,error:""})),A({actionMessage:`${M}...`});try{let nl=await d();A({actionMessage:nl||`${M}完成`}),await F()}catch(nl){t((k)=>({...k,actionBusy:!1,error:zl(nl,`${M}失败`)}))}}async function N(){await j("保存并发设置",async()=>{await Tl(Qf(r,"/api/queue/settings"),{method:"PUT",body:JSON.stringify({maxConcurrency:Number(c.maxConcurrency),targetGpuName:c.targetGpuName})})})}function U(){return Object.entries(c.selectedProjects).filter(([,M])=>M).map(([M])=>M)}async function w(){let M=U();if(M.length===0)throw Error("请先选择至少一个 project");await j("加入待启动队列",async()=>{await Tl(Qf(r,"/api/queue"),{method:"POST",body:JSON.stringify({projectPaths:M,maxConcurrency:Number(c.maxConcurrency),targetGpuName:c.targetGpuName,start:!1})}),A({activeTab:"current",selectedProjects:{}})})}async function G(){let M=c.sourceProject||C[0]?.projectPath;if(!M)throw Error("请先选择源 project");await j("Fork Project",async()=>{let d=await Tl(Qf(r,"/api/projects/fork"),{method:"POST",body:JSON.stringify({sourceProject:M,count:Number(c.forkCount),epochs:Number(c.forkEpochs),prefix:c.forkPrefix})}),nl=Array.isArray(d.projectPaths)?d.projectPaths:[],k=nl.reduce((g,cl)=>{return g[cl]=!0,g},{...c.selectedProjects});return A({selectedProjects:k}),`已 fork ${nl.length} 个 project,并已自动勾选;请确认后点击加入待启动队列。`})}async function J(){await j("启动队列",async()=>{await Tl(Qf(r,"/api/queue/start"),{method:"POST",body:JSON.stringify({maxConcurrency:Number(c.maxConcurrency),targetGpuName:c.targetGpuName})}),A({activeTab:"current"})})}async function Q(M){await j("取消任务",async()=>{await Tl(Qf(r,`/api/jobs/${encodeURIComponent(M.id)}/cancel`),{method:"POST",body:JSON.stringify({})})})}async function m(M){let d=String(M?.projectPath||"");if(!d)return;y({loading:!0,error:"",kind:"project",key:d,title:d,data:null});try{let nl=await Tl(Qf(r,`/api/projects/config?path=${encodeURIComponent(d)}`));y({loading:!1,error:"",kind:"project",key:d,title:d,data:nl})}catch(nl){y({loading:!1,error:zl(nl,"Project 详情加载失败"),kind:"project",key:d,title:d,data:null})}}async function q(M){let d=String(M?.id||"");if(!d)return;y({loading:!0,error:"",kind:"job",key:d,title:M.projectPath||d,data:null});try{let nl=await Tl(Qf(r,`/api/jobs/${encodeURIComponent(d)}`));y({loading:!1,error:"",kind:"job",key:d,title:nl?.job?.projectPath||M.projectPath||d,data:nl})}catch(nl){y({loading:!1,error:zl(nl,"Job 详情加载失败"),kind:"job",key:d,title:M.projectPath||d,data:null})}}if(IO(()=>{F(c.activeTab)},[f?.id,f?.runtime?.providerStatus,c.activeTab]),!f)return x(lt,{title:"MET Nonlinear 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=met-nonlinear"});let W=aO(f),p=dO(f),O=oO(f),Z=eO(n.queue?.queue||n.summary?.queue),V=rZ(n.health,n.queue),P=n.health?.targetGpu||n.summary?.targetGpu||V.find((M)=>String(M.name||"").includes("2080")),H=n.images?.mlImage||n.health?.image||{},B=lZ(n.queue),C=uZ(n.projects),E=nZ(C),D=c.sourceProject||C[0]?.projectPath||"",Y=B.filter((M)=>["staged","queued","running"].includes(M.status)),v=B.filter((M)=>M.status==="succeeded"),K=B.filter((M)=>["failed","canceled"].includes(M.status)),X=Array.isArray(n.history?.jobs)?n.history.jobs.slice(0,120):[],I=[{id:"projects",label:"项目库",count:C.length},{id:"current",label:"当前队列",count:Y.length||Number(Z.staged||0)+Number(Z.queued||0)+Number(Z.running||0)},{id:"completed",label:"已完成",count:v.length||Number(Z.succeeded||0)},{id:"failed",label:"失败诊断",count:K.length||Number(Z.failed||0)+Number(Z.canceled||0)},{id:"gpu",label:"GPU/镜像",count:V.length}];function o(M,d){if(M.length===0)return x(lt,{title:d==="current"?"当前队列为空":"暂无记录",text:d==="current"?"从项目库选择或 fork project 后先加入待启动队列,再启动队列。":"终态任务会显示耗时、exit code 和失败诊断。"});return x("div",{className:"table-wrap met-job-table"},x("table",null,x("thead",null,x("tr",null,x("th",null,"状态"),x("th",null,"Project"),x("th",null,"Epoch"),x("th",null,"速度"),x("th",null,"ETA/耗时"),x("th",null,"GPU"),x("th",null,"Exit"),x("th",null,"更新时间"),x("th",null,"操作"))),x("tbody",null,M.map((nl)=>{let k=nl.progress||{},g=["staged","queued","running"].includes(nl.status),cl=i.kind==="job"&&i.key===nl.id;return x("tr",{key:nl.id,className:`met-click-row ${cl?"active":""}`,onClick:()=>q(nl),"data-testid":`met-job-row-${b3(nl.id)}`},x("td",null,x(T1,{status:nl.status},wm(nl.status))),x("td",null,x("button",{type:"button",className:"met-inline-link",onClick:(pl)=>{pl.stopPropagation(),q(nl)}},nl.projectPath),x("code",null,nl.id)),x("td",null,x("span",null,`${k.currentEpoch??"--"} / ${k.epochTarget??nl.epochTarget??"--"}`),x("div",{className:"met-progress"},x("span",{style:{width:W1(k.progressPercent)}}))),x("td",null,x("strong",null,x3(mm(nl)))),x("td",null,nl.status==="succeeded"||nl.status==="failed"||nl.status==="canceled"?Qm(nl):nl.status==="running"?`ETA ${U5(fZ(nl))}`:"--"),x("td",null,nl.gpuName||"--"),x("td",null,nl.exitCode??"--"),x("td",null,Ll(nl.updatedAt)),x("td",null,g?x("button",{type:"button",className:"ghost-btn mini",onClick:(pl)=>{pl.stopPropagation(),Q(nl)},disabled:n.actionBusy},"取消"):null,x(my,{title:`MET Job ${nl.id}`,data:nl,onOpen:u,testId:`raw-met-job-${nl.id}`})))}))))}function fl(){return x("div",{className:"met-queue-summary","data-testid":"met-current-summary"},x(T1,{status:"staged"},`待启动 ${Z.staged??0}`),x(T1,{status:"queued"},`排队中 ${Z.queued??0}`),x(T1,{status:"running"},`训练中 ${Z.running??0}`),x("span",null,`最大并发 ${n.summary?.queue?.maxConcurrency??n.queue?.queue?.maxConcurrency??c.maxConcurrency}`),x("span",null,`目标 GPU ${n.summary?.queue?.targetGpuName??n.queue?.queue?.targetGpuName??c.targetGpuName}`))}function yl(M,d){let nl=c.expandedProjectDirs[M];return nl===void 0?d<2:Boolean(nl)}function h(M,d){let nl=yl(M,d);A({expandedProjectDirs:{...c.expandedProjectDirs,[M]:!nl}})}function s(M){let d=8+Math.max(0,M.depth)*16;if(Boolean(M.project)){let g=M.project,cl=Boolean(c.selectedProjects[g.projectPath]),pl=i.kind==="project"&&i.key===g.projectPath;return x("div",{key:M.path,className:`met-tree-row project ${cl?"selected":""} ${pl?"active":""}`,style:{paddingLeft:d},onClick:()=>m(g),"data-testid":`met-project-node-${b3(g.projectPath)}`},x("div",{className:"met-tree-name"},x("input",{type:"checkbox",checked:cl,onClick:(Hl)=>Hl.stopPropagation(),onChange:(Hl)=>A({selectedProjects:{...c.selectedProjects,[g.projectPath]:Hl.target.checked}}),"data-testid":`met-project-checkbox-${b3(g.projectPath)}`}),x("button",{type:"button",className:"met-inline-link project-path",onClick:(Hl)=>{Hl.stopPropagation(),m(g)}},M.name)),x("span",null,g.useModel||"--"),x("span",null,g.epochTrain??"--"),x("span",null,W1(g.progress?.progressPercent)),x("span",null,x3(g.progress?.epochPerHour)))}let k=yl(M.path,M.depth);return x(E1.default.Fragment,{key:M.path},x("div",{className:"met-tree-row folder",style:{paddingLeft:d},"data-testid":`met-project-folder-${b3(M.path)}`},x("button",{type:"button",className:"met-tree-toggle",onClick:()=>h(M.path,M.depth),"aria-label":k?`折叠 ${M.path}`:`展开 ${M.path}`},k?"-":"+"),x("strong",null,M.name),x("span",{className:"met-tree-count"},`${M.count} projects`)),k?M.children.map((g)=>s(g)):null)}function ul(M){return x("div",{className:"met-detail-kv"},M.map((d)=>x("div",{key:d.label,className:"met-detail-kv-item"},x("span",null,d.label),x("strong",null,K1(d.value)),d.hint?x("small",null,d.hint):null)))}function tl(M,d){return x("div",{className:"met-detail-section"},x("h3",null,M),ul(d))}function Al(M){if(!Array.isArray(M)||M.length===0)return x(lt,{title:"模型层未上报",text:"等待 data/model_info.json 或 compute_analysis.json 生成。"});return x("div",{className:"table-wrap met-layer-table"},x("table",null,x("thead",null,x("tr",null,x("th",null,"Layer"),x("th",null,"Type"),x("th",null,"Params"),x("th",null,"Trainable"),x("th",null,"Compute"))),x("tbody",null,M.slice(0,18).map((d,nl)=>x("tr",{key:`${d.name||"layer"}-${nl}`},x("td",null,d.name||`#${nl+1}`),x("td",null,d.type||"--"),x("td",null,Q5(d.num_params)),x("td",null,d.trainable===void 0?"--":String(Boolean(d.trainable))),x("td",null,Q5(d.compute?.total??d.estimated_cost?.weighted_units?.total)))))))}function Kl(M){let d=Array.isArray(M)?M:[];if(d.length===0)return x(lt,{title:"data/ 暂无文件",text:"训练或评估完成后会生成 training_state、metrics、model_info 等文件。"});return x("div",{className:"met-file-chip-grid"},d.slice(0,48).map((nl)=>x("span",{key:nl},nl)),d.length>48?x("span",null,`+${d.length-48}`):null)}function wl(M){let d=String(M||"").replace(/\x1b\[[0-9;]*[A-Za-z]/g,"").split(/\r?\n/).map((nl)=>nl.trim()).filter(Boolean).slice(-12);if(d.length===0)return x(lt,{title:"暂无日志尾部",text:"该任务未上报 logTail 或日志已轮转。"});return x("div",{className:"met-log-lines"},d.map((nl,k)=>x("div",{key:`${k}-${nl.slice(0,16)}`},nl)))}function El(){if(i.loading)return x("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},x("div",{className:"panel-head compact"},x("div",null,x("p",{className:"panel-eyebrow"},"Detail Loading"),x(nu,{title:"详情加载中",loading:!0}))),x(lt,{title:"详情加载中",text:i.title||"正在读取 D601 data/ 和 config.json"}));if(i.error)return x("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},x(el,{error:i.error,wide:!0}));if(!i.data)return x("section",{className:"met-detail-panel muted","data-testid":"met-detail-panel"},x(lt,{title:"选择一个项目或任务查看详情",text:"项目库、当前队列、已完成和失败诊断中的行都可以点击;默认只展示结构化字段,原始 JSON 需显式点击按钮。"}));let M=tZ(i),d=iZ(i),nl=or(M.config),k=or(M.progress||d.progress),g=or(M.data),cl=or(M.metrics||g.metrics||k.trainingInfo?.evaluation_metrics),pl=or(g.trainingInfo||k.trainingInfo),Hl=or(g.trainingState),bl=or(M.model||g.model),_u=Array.isArray(bl.modelSummary)&&bl.modelSummary.length>0?bl.modelSummary:bl.computeLayers,tu=or(pl.evaluation_metrics),Nu=i.kind==="job"?"训练任务详情":"Project 详情";return x("section",{className:"met-detail-panel","data-testid":"met-detail-panel"},x("div",{className:"panel-head compact"},x("div",null,x("p",{className:"panel-eyebrow"},i.kind==="job"?"Job + Project Detail":"Project Library Detail"),x(nu,{title:Nu}),x("code",null,M.projectPath||d.projectPath||i.title)),x("div",{className:"panel-actions"},x(my,{title:`MET ${Nu}`,data:i.data,onOpen:u,testId:"raw-met-detail"}))),i.kind==="job"?tl("任务状态",[{label:"Job ID",value:d.id},{label:"状态",value:wm(d.status)},{label:"GPU",value:d.gpuName},{label:"Exit Code",value:d.exitCode},{label:"耗时",value:Qm(d)},{label:"训练速度",value:x3(mm({...d,progress:k}))}]):null,tl("config.json",[{label:"use_model",value:nl.use_model},{label:"epoch_train",value:nl.epoch_train},{label:"step_per_epoch",value:nl.step_per_epoch},{label:"learning_rate",value:nl.learning_rate},{label:"using_gpu",value:nl.using_gpu},{label:"use_points",value:nl.use_points},{label:"sample_rate",value:nl.sample_rate},{label:"time_clipped_s",value:nl.time_clipped_s},{label:"H_UNITS",value:nl.H_UNITS},{label:"INNER_KAN_UNITS",value:nl.INNER_KAN_UNITS},{label:"INNER_KAN_LAYERS",value:nl.INNER_KAN_LAYERS},{label:"GRID_SIZE",value:nl.GRID_SIZE},{label:"SPLINE_ORDER",value:nl.SPLINE_ORDER},{label:"USE_FAST_MODEL",value:nl.USE_FAST_MODEL},{label:"IIR_TRAINABLE",value:nl.IIR_TRAINABLE}]),tl("data/ 训练状态",[{label:"Epoch",value:`${k.currentEpoch??Hl.current_epoch??Hl.completed_epoch??"--"} / ${k.epochTarget??nl.epoch_train??"--"}`},{label:"Progress",value:W1(k.progressPercent)},{label:"Last Loss",value:k.lastLoss??Hl.loss},{label:"Last Val Loss",value:k.lastValLoss??Hl.val_loss},{label:"Min Loss",value:pl.min_loss??Hl.min_loss},{label:"Min Val Loss",value:pl.min_val_loss??Hl.min_val_loss},{label:"Log Lines",value:k.logLineCount},{label:"ETA",value:U5(k.etaSeconds??Hl.remaining_time)},{label:"训练速度",value:x3(k.epochPerHour??Hl.smoothed_speed)},{label:"Training Alive",value:Hl.training_alive}]),tl("模型参数",[{label:"Model Type",value:bl.modelType??nl.use_model},{label:"Total Params",value:bl.totalParams,hint:bl.totalParams===null||bl.totalParams===void 0?"未上报":"data/model_info.json"},{label:"Trainable",value:bl.trainableParams},{label:"Non-trainable",value:bl.nonTrainableParams},{label:"Compute Cost",value:bl.computeCost},{label:"Estimate Status",value:bl.estimateStatus},{label:"Unsupported Layers",value:bl.unsupportedLayerCount}]),tl("指标",[{label:"train_loss",value:cl.train_loss??tu.train_loss},{label:"val_loss",value:cl.val_loss??tu.val_loss},{label:"train_mae",value:cl.train_mae??tu.train_mae},{label:"val_mae",value:cl.val_mae??tu.val_mae},{label:"train_afmae",value:cl.train_afmae??tu.train_afmae},{label:"val_afmae",value:cl.val_afmae??tu.val_afmae},{label:"freq_drift_hz",value:cl.freq_drift_hz},{label:"sens_drift_percent",value:cl.sens_drift_percent},{label:"linearity_percent",value:cl.linearity_percent},{label:"weights_source",value:cl.weights_source??tu.weights_source},{label:"lr min/mean/max",value:`${K1(pl.learning_rate_min)} / ${K1(pl.learning_rate_mean)} / ${K1(pl.learning_rate_max)}`}]),x("div",{className:"met-detail-section"},x("h3",null,"模型层"),Al(_u)),x("div",{className:"met-detail-section"},x("h3",null,"data/ 文件"),Kl(g.files)),i.kind==="job"?x("div",{className:"met-detail-section"},x("h3",null,"日志尾部"),wl(or(i.data).logTail)):null)}return x("div",{className:"met-page","data-testid":"met-nonlinear-page"},x(J5,{title:"MET Nonlinear 训练编排",eyebrow:"D601 GPU 用户服务",loading:n.loading||n.actionBusy,actions:x("div",{className:"panel-actions"},x("button",{type:"button",className:"ghost-btn",onClick:F,disabled:n.loading,"data-testid":"met-refresh-button"},n.loading?"刷新中":"刷新"),x(my,{title:"MET Nonlinear 用户服务",data:f,onOpen:u,testId:"raw-met-service"}))},x("div",{className:"findjob-hero"},x("div",null,x("div",{className:"node-version-line"},x(T1,{status:W.providerStatus==="online"?"online":"warn"},W.providerStatus||"unknown"),x("span",null,f.providerId),x("span",null,O.public?"公网暴露":"仅 UniDesk frontend 代理访问")),x("p",{className:"muted paragraph"},f.description)),x("div",{className:"microservice-ref-card"},x("span",null,"Repo"),x("strong",null,p.url||"--"),x("code",null,p.commitId||"--")),x("div",{className:"microservice-ref-card"},x("span",null,"D601 Docker"),x("strong",null,`${O.nodeBindHost||"--"}:${O.nodePort||"--"}`),x("code",null,`${p.composeFile||"--"} / ${p.containerName||"--"}`))),x(el,{error:n.error,wide:!0}),c.actionMessage?x("div",{className:"met-action-log","data-testid":"met-action-message"},c.actionMessage):null),x("div",{className:"met-grid"},x(J5,{title:"核心状态",eyebrow:n.refreshedAt?`Updated ${iu(n.refreshedAt)}`:"Queue + GPU",loading:n.loading},x("div",{className:"metric-grid"},x(It,{label:"Staged",value:Z.staged??0,hint:"加入队列未开始",tone:Number(Z.staged||0)>0?"warn":""}),x(It,{label:"Queued",value:Z.queued??0,hint:"排队等待调度",tone:Number(Z.queued||0)>0?"warn":""}),x(It,{label:"Running",value:Z.running??0,hint:`max ${n.summary?.queue?.maxConcurrency??n.queue?.queue?.maxConcurrency??"--"}`,tone:Number(Z.running||0)>0?"ok":""}),x(It,{label:"Succeeded",value:Z.succeeded??0,hint:"已完成"}),x(It,{label:"Failed",value:Z.failed??0,hint:"需要诊断",tone:Number(Z.failed||0)>0?"warn":""}),x(It,{label:"2080Ti Free",value:P?W1(Number(P.freeRatio)*100):"--",hint:P?`${P.memoryFreeMiB}/${P.memoryTotalMiB} MiB`:"等待 GPU 上报"}),x(It,{label:"ML Image",value:H.present?"READY":"MISSING",hint:H.image||"met-nonlinear-ml:tf26",tone:H.present?"ok":"warn"}),x(It,{label:"Health",value:n.health?.ok?"OK":"--",hint:"D601 /health"}))),x(J5,{title:"队列控制",eyebrow:"Downloader-like staging",loading:n.actionBusy},x("div",{className:"met-control-strip"},x("label",null,"最大并发",x("input",{type:"number",min:1,max:16,value:c.maxConcurrency,"data-testid":"met-max-concurrency-input",onChange:(M)=>A({maxConcurrency:M.target.value})})),x("label",null,"目标 GPU",x("input",{value:c.targetGpuName,"data-testid":"met-target-gpu-input",onChange:(M)=>A({targetGpuName:M.target.value})})),x("button",{type:"button",className:"ghost-btn",onClick:N,disabled:n.actionBusy,"data-testid":"met-save-settings-button"},"保存设置"),x("button",{type:"button",className:"primary-btn",onClick:J,disabled:n.actionBusy||Number(Z.staged||0)===0,"data-testid":"met-start-queue-button"},"启动队列")),x("p",{className:"muted paragraph"},"Project 先进入待启动队列,不会立即训练;点击启动队列后才切换为排队中,并由 D601 scheduler 按最大并发和 2080Ti 显存策略调度。")),x("section",{className:"panel met-workspace"},x("div",{className:"met-tabs",role:"tablist"},I.map((M)=>x("button",{key:M.id,type:"button",className:c.activeTab===M.id?"active":"",onClick:()=>A({activeTab:M.id}),"data-testid":`met-tab-${M.id}`},`${M.label} ${M.count}`))),x("div",{className:"panel-body"},c.activeTab==="projects"?x("div",{className:"met-form-grid","data-testid":"met-projects-pane"},x("div",{className:"met-fork-card"},x("h3",null,"Fork Project"),x("label",null,"源 Project",x("select",{value:D,"data-testid":"met-source-project-select",onChange:(M)=>A({sourceProject:M.target.value})},C.map((M)=>x("option",{key:M.projectPath,value:M.projectPath},`${M.projectPath} · ${M.useModel||"model?"}`)))),x("label",null,"Fork 数量",x("input",{type:"number",min:1,max:100,value:c.forkCount,"data-testid":"met-fork-count-input",onChange:(M)=>A({forkCount:M.target.value})})),x("label",null,"训练轮数",x("input",{type:"number",min:1,max:1e5,value:c.forkEpochs,"data-testid":"met-fork-epochs-input",onChange:(M)=>A({forkEpochs:M.target.value})})),x("label",null,"目标前缀",x("input",{value:c.forkPrefix,"data-testid":"met-fork-prefix-input",onChange:(M)=>A({forkPrefix:M.target.value})})),x("button",{type:"button",className:"primary-btn",onClick:G,disabled:n.actionBusy||!D,"data-testid":"met-fork-button"},"Fork Project"),x("p",{className:"muted paragraph"},"Fork 只创建新 Project 并自动勾选,不会直接训练;需要在右侧确认后加入待启动队列。")),x("div",{className:"met-project-list"},x("div",{className:"panel-head compact"},x("div",null,x("p",{className:"panel-eyebrow"},`Existing Projects · ${(n.projects?.roots||[]).map((M)=>`${M.root} ${M.count}`).join(" / ")}`),x(nu,{title:"选择已有 Project",loading:n.loading||n.actionBusy})),x("button",{type:"button",className:"ghost-btn",onClick:w,disabled:n.actionBusy||U().length===0,"data-testid":"met-stage-selected-button"},`加入待启动队列 (${U().length})`)),C.length===0?x(lt,{title:"暂无 project",text:"等待 D601 返回 /api/projects"}):x("div",{className:"met-project-table","data-testid":"met-project-tree"},x("div",{className:"met-tree-header"},x("span",null,"文件树 Project"),x("span",null,"Model"),x("span",null,"Epochs"),x("span",null,"Progress"),x("span",null,"速度")),E.children.map((M)=>s(M)))),El()):null,c.activeTab==="current"?x("div",{"data-testid":"met-current-pane"},fl(),o(Y,"current"),El(),x("div",{className:"panel-actions inline-actions"},x(my,{title:"MET Queue",data:n.queue,onOpen:u,testId:"raw-met-queue"}))):null,c.activeTab==="completed"?x("div",{"data-testid":"met-completed-pane"},o(v.length>0?v:X.filter((M)=>M.status==="succeeded"),"completed"),El()):null,c.activeTab==="failed"?x("div",{"data-testid":"met-failed-pane"},o(K.length>0?K:X.filter((M)=>["failed","canceled"].includes(M.status)),"failed"),El(),x("div",{className:"panel-actions inline-actions"},x(my,{title:"MET History",data:n.history,onOpen:u,testId:"raw-met-history"}))):null,c.activeTab==="gpu"?x("div",{className:"met-gpu-pane","data-testid":"met-gpu-pane"},V.length===0?x(lt,{title:"暂无 GPU 上报",text:"等待 D601 met-nonlinear-ts 或 ML image 提供 nvidia-smi 数据"}):x("div",{className:"table-wrap"},x("table",null,x("thead",null,x("tr",null,x("th",null,"Index"),x("th",null,"Name"),x("th",null,"Free"),x("th",null,"Policy"))),x("tbody",null,V.map((M)=>x("tr",{key:M.index},x("td",null,M.index),x("td",null,M.name),x("td",null,`${M.memoryFreeMiB} / ${M.memoryTotalMiB} MiB`,x("div",{className:"met-progress"},x("span",{style:{width:W1(Number(M.freeRatio)*100)}}))),x("td",null,String(M.name||"").includes("2080")?"target 2080Ti, <20% 限制并发":"non-target")))))),x("div",{className:"panel-actions inline-actions"},x(my,{title:"MET Images",data:n.images,onOpen:u,testId:"raw-met-images"}))):null))))}var a3=Ml(Ju(),1);var ml=a3.default.createElement,{useEffect:Gm,useMemo:yZ}=a3.default,g3=a3.default.useState;function Wm({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return ml("span",{className:`status-badge ${r}`},u||l||"unknown")}function p1({label:l,value:u,hint:r,tone:f}){return ml("article",{className:`metric-card ${f||""}`},ml("div",{className:"metric-label"},l),ml("div",{className:"metric-value"},u),ml("div",{className:"metric-hint"},r))}function k3({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return ml("section",{className:`panel ${n||""}`},ml("div",{className:"panel-head"},ml("div",null,u?ml("p",{className:"panel-eyebrow"},u):null,ml(nu,{title:l,loading:t})),r?ml("div",{className:"panel-actions"},r):null),ml("div",{className:"panel-body"},f))}function m5({title:l,data:u,onOpen:r,testId:f}){return ml("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function I3({title:l,text:u}){return ml("div",{className:"empty-state"},ml("strong",null,l),ml("span",null,u))}function cZ(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function $Z(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function _Z(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function wy(l,u){return`${l}/microservices/mdtodo/proxy${u}`}function Tm(l){if(l==="completed")return"已完成";if(l==="in_progress")return"进行中";return"待处理"}function AZ(l){if(l==="completed")return"online";if(l==="in_progress")return"warn";return"unknown"}function w5(l){let u=[],r=(f)=>{for(let n of f)if(u.push(n),Array.isArray(n.children))r(n.children)};return r(Array.isArray(l)?l:[]),u}function FZ({tasks:l,selectedId:u,onSelect:r}){if(!l.length)return ml(I3,{title:"暂无任务",text:"当前文件没有 R 编号任务。"});let f=(n)=>ml("li",{key:n.id},ml("button",{type:"button",className:`mdtodo-task-row ${u===n.id?"active":""}`,style:{"--task-depth":Math.min(Number(n.depth||0),6)},onClick:()=>r(n.id),"data-testid":`mdtodo-task-${String(n.id).replace(/[^A-Za-z0-9_-]+/g,"-")}`},ml(Wm,{status:AZ(n.status)},Tm(n.status)),ml("code",null,n.id),ml("span",{className:"mdtodo-task-title"},n.title||"--"),ml("span",{className:"mdtodo-link-count"},`${n.linkExists??0}/${n.linkCount??0}`)),Array.isArray(n.children)&&n.children.length>0?ml("ol",null,n.children.map(f)):null);return ml("ol",{className:"mdtodo-tree"},l.map(f))}function Km({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((P)=>P.id==="mdtodo")||null,[n,t]=g3({loading:!1,saving:!1,error:"",notice:"",health:null,files:[],todo:null,selectedFile:"",selectedTaskId:"",refreshedAt:null,command:null}),[i,y]=g3(""),[c,_]=g3(""),[A,F]=g3(""),j=Array.isArray(n.todo?.tasks)?n.todo.tasks:[],N=yZ(()=>w5(j),[n.todo]),U=N.find((P)=>P.id===n.selectedTaskId)||N[0]||null,w=n.todo?.stats||{};async function G(P=n.selectedFile){if(!f)return;t((H)=>({...H,loading:!0,error:"",notice:""}));try{let[H,B]=await Promise.all([Tl(`${r}/microservices/mdtodo/health`),Tl(wy(r,"/api/files"))]),C=Array.isArray(B.files)?B.files:[],E=P||C[0]?.path||"",D=E?await Tl(wy(r,`/api/tasks?file=${encodeURIComponent(E)}`)):null,Y=Array.isArray(D?.tasks)?w5(D.tasks):[],v=Y.some((K)=>K.id===n.selectedTaskId)?n.selectedTaskId:Y[0]?.id||"";t({loading:!1,saving:!1,error:"",notice:"",health:H,files:C,todo:D,selectedFile:E,selectedTaskId:v,refreshedAt:new Date,command:n.command})}catch(H){t((B)=>({...B,loading:!1,error:zl(H,"MDTODO 加载失败")}))}}if(Gm(()=>{G()},[f?.id,f?.runtime?.providerStatus]),Gm(()=>{y(U?.title||""),_(U?.rawContent||"")},[U?.id,n.selectedFile]),!f)return ml(I3,{title:"MDTODO 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=mdtodo"});let J=cZ(f),Q=_Z(f),m=$Z(f);async function q(P){t((H)=>({...H,selectedFile:P,selectedTaskId:"",command:null})),await G(P)}async function W(P){if(!U||!n.selectedFile)return;t((H)=>({...H,saving:!0,error:"",notice:""}));try{let H=await Tl(wy(r,`/api/tasks/${encodeURIComponent(U.id)}`),{method:"PATCH",body:{file:n.selectedFile,...P}});t((B)=>({...B,saving:!1,todo:H.file,notice:H.result?.message||"任务已更新"}))}catch(H){t((B)=>({...B,saving:!1,error:zl(H,"任务更新失败")}))}}async function p(){await W({title:i,rawContent:c})}async function O(P){if(!n.selectedFile)return;t((H)=>({...H,saving:!0,error:"",notice:""}));try{let H=await Tl(wy(r,"/api/tasks"),{method:"POST",body:{file:n.selectedFile,parentId:P,title:A||"新任务"}});F(""),t((B)=>({...B,saving:!1,todo:H.file,selectedTaskId:H.result?.taskId||B.selectedTaskId,notice:H.result?.message||"任务已创建"})),await G(n.selectedFile)}catch(H){t((B)=>({...B,saving:!1,error:zl(H,"创建任务失败")}))}}async function Z(){if(!U||!n.selectedFile)return;if(!window.confirm(`删除 ${U.id} 及其子任务?`))return;t((P)=>({...P,saving:!0,error:"",notice:""}));try{let P=await Tl(wy(r,`/api/tasks/${encodeURIComponent(U.id)}?file=${encodeURIComponent(n.selectedFile)}`),{method:"DELETE"}),H=w5(P.file?.tasks||[]);t((B)=>({...B,saving:!1,todo:P.file,selectedTaskId:H[0]?.id||"",notice:P.result?.message||"任务已删除"}))}catch(P){t((H)=>({...H,saving:!1,error:zl(P,"删除任务失败")}))}}async function V(){if(!U||!n.selectedFile)return;t((P)=>({...P,saving:!0,error:"",command:null}));try{let P=await Tl(wy(r,"/api/execute-command"),{method:"POST",body:{file:n.selectedFile,taskId:U.id,mode:"codex"}});t((H)=>({...H,saving:!1,command:P,notice:"执行命令已生成"}))}catch(P){t((H)=>({...H,saving:!1,error:zl(P,"执行命令生成失败")}))}}return ml("div",{className:"mdtodo-page","data-testid":"mdtodo-page"},ml(k3,{title:"MDTODO 工作台",eyebrow:"D601 k3s managed service",loading:n.loading,actions:ml("div",{className:"panel-actions"},ml("button",{type:"button",className:"ghost-btn",onClick:()=>void G(),disabled:n.loading,"data-testid":"mdtodo-refresh-button"},n.loading?"刷新中":"刷新"),ml(m5,{title:"MDTODO 用户服务",data:f,onOpen:u,testId:"raw-mdtodo-service"}))},ml("div",{className:"findjob-hero"},ml("div",null,ml("div",{className:"node-version-line"},ml(Wm,{status:J.providerStatus==="online"?"online":"warn"},J.providerStatus||"unknown"),ml("span",null,f.providerId),ml("span",null,m.proxyMode||"--")),ml("p",{className:"muted paragraph"},f.description)),ml("div",{className:"microservice-ref-card"},ml("span",null,"Repo"),ml("strong",null,Q.url||"--"),ml("code",null,Q.composeFile||"--")),ml("div",{className:"microservice-ref-card"},ml("span",null,"Workspace"),ml("strong",null,n.health?.rootDir||"/workspace"),ml("code",null,`${m.nodeBindHost||"--"}:${m.nodePort||"--"}`))),ml(el,{error:n.error,wide:!0}),n.notice?ml("div",{className:"notice-line"},n.notice):null),ml("div",{className:"metric-grid"},ml(p1,{label:"TODO 文件",value:n.files.length,hint:n.health?.rootExists?"hostPath ready":"hostPath missing",tone:n.health?.ok?"ok":"warn"}),ml(p1,{label:"任务总数",value:w.total??"--",hint:n.selectedFile||"--"}),ml(p1,{label:"已完成",value:w.completed??"--",hint:"completed",tone:"ok"}),ml(p1,{label:"进行中",value:w.inProgress??"--",hint:"in progress",tone:"warn"}),ml(p1,{label:"待处理",value:w.pending??"--",hint:n.refreshedAt?iu(n.refreshedAt):"pending"})),ml("div",{className:"mdtodo-layout"},ml(k3,{title:"文件",eyebrow:`${n.files.length} Markdown`,loading:n.loading,className:"mdtodo-file-panel"},n.files.length===0?ml(I3,{title:"暂无 TODO 文件",text:"等待后端扫描 MDTODO 工作区。"}):ml("div",{className:"mdtodo-file-list"},n.files.map((P)=>ml("button",{key:P.path,type:"button",className:`mdtodo-file-item ${n.selectedFile===P.path?"active":""}`,onClick:()=>void q(P.path)},ml("strong",null,P.name),ml("span",null,P.directory||"."),ml("code",null,`${P.stats?.total??"--"} tasks / ${Ll(P.mtime)}`))))),ml(k3,{title:"任务树",eyebrow:n.selectedFile||"Tasks",loading:n.loading,actions:ml("div",{className:"panel-actions"},ml("input",{value:A,onChange:(P)=>F(P.target.value),placeholder:"新任务标题","data-testid":"mdtodo-new-title"}),ml("button",{type:"button",className:"ghost-btn",onClick:()=>void O(),disabled:n.saving||!n.selectedFile},"新增"),U?ml("button",{type:"button",className:"ghost-btn",onClick:()=>void O(U.id),disabled:n.saving},"新增子任务"):null,n.todo?ml(m5,{title:"MDTODO 当前文件",data:n.todo,onOpen:u,testId:"raw-mdtodo-file"}):null)},ml(FZ,{tasks:j,selectedId:U?.id||"",onSelect:(P)=>t((H)=>({...H,selectedTaskId:P,command:null}))})),ml(k3,{title:U?`${U.id} 详情`:"任务详情",eyebrow:U?Tm(U.status):"Detail",loading:n.saving,className:"mdtodo-detail-panel",actions:U?ml("div",{className:"panel-actions"},ml("button",{type:"button",className:"ghost-btn",onClick:()=>void W({status:"pending"}),disabled:n.saving},"待处理"),ml("button",{type:"button",className:"ghost-btn",onClick:()=>void W({status:"in_progress"}),disabled:n.saving},"进行中"),ml("button",{type:"button",className:"primary-btn",onClick:()=>void W({status:"completed"}),disabled:n.saving},"完成")):null},!U?ml(I3,{title:"未选中任务",text:"请选择一个任务。"}):ml("div",{className:"mdtodo-editor"},ml("label",null,"标题",ml("input",{value:i,onChange:(P)=>y(P.target.value),"data-testid":"mdtodo-title-input"})),ml("label",null,"正文",ml("textarea",{value:c,onChange:(P)=>_(P.target.value),rows:12,"data-testid":"mdtodo-raw-input"})),ml("div",{className:"docker-meta compact"},ml("span",null,`line ${Number(U.lineNumber??0)+1}`),ml("span",null,`depth ${U.depth??0}`),ml("span",null,`links ${U.linkExists??0}/${U.linkCount??0}`)),ml("div",{className:"inline-actions"},ml("button",{type:"button",className:"primary-btn",onClick:p,disabled:n.saving},n.saving?"保存中":"保存"),ml("button",{type:"button",className:"ghost-btn",onClick:V,disabled:n.saving},"生成执行命令"),ml("button",{type:"button",className:"danger-btn",onClick:Z,disabled:n.saving},"删除"),ml(m5,{title:`MDTODO ${U.id}`,data:U,onOpen:u,testId:"raw-mdtodo-task"})),n.command?ml("div",{className:"mdtodo-command"},ml("span",null,n.command.prompt||"--"),ml("code",null,n.command.command||"--")):null))))}var d3=[{id:"ops",label:"运行总览",code:"OPS",tabs:[{id:"status",label:"态势总览"},{id:"performance",label:"性能面板"},{id:"events",label:"事件摘要"},{id:"logs",label:"服务日志"}]},{id:"nodes",label:"资源节点",code:"NODE",tabs:[{id:"list",label:"节点清单"},{id:"monitor",label:"资源监控"},{id:"docker",label:"Docker 状态"},{id:"gateway",label:"网关版本"},{id:"labels",label:"资源标签"},{id:"heartbeats",label:"心跳状态"}]},{id:"tasks",label:"任务调度",code:"TASK",tabs:[{id:"dispatch",label:"下发任务"},{id:"scheduled",label:"定时任务"},{id:"pending",label:"待处理任务"},{id:"history",label:"任务历史"},{id:"results",label:"执行结果"}]},{id:"apps",label:"用户服务",code:"APP",routeSegment:"app",tabs:[{id:"catalog",label:"服务目录"},{id:"todo-note",label:"Todo Note"},{id:"findjob",label:"FindJob"},{id:"pipeline",label:"Pipeline"},{id:"met-nonlinear",label:"MET Nonlinear"},{id:"claudeqq",label:"ClaudeQQ"},{id:"baidu-netdisk",label:"Baidu Netdisk"},{id:"filebrowser",label:"File Browser"},{id:"oa-event-flow",label:"OA Event Flow"},{id:"k3sctl",label:"k3s Control"},{id:"code-queue",label:"Code Queue"},{id:"mdtodo",label:"MDTODO"},{id:"decision-center",label:"Decision Center"},{id:"project-manager",label:"Project Manager"}]},{id:"config",label:"系统配置",code:"CFG",tabs:[{id:"topology",label:"连接拓扑"},{id:"auth",label:"认证策略"},{id:"security",label:"安全边界"}]}],z1=Object.fromEntries(d3.map((l)=>[l.id,l.tabs[0]?.id??""]));function jZ(l){let u=String(l||"").trim();if(!u)return"";try{return decodeURIComponent(u)}catch{return u}}function o3(l){let u=String(l||"/"),[r]=u.split(/[?#]/u,1);if(r==="/")return"/";let n=`/${r.split("/").map(jZ).filter(Boolean).join("/")}`;return n.endsWith("/")?n:`${n}/`}function NZ(l){let u=2166136261;for(let r of l)u^=r.charCodeAt(0),u=Math.imul(u,16777619);return Math.abs(u>>>0).toString(36)}function q5(l){return String(l||"").normalize("NFKD").replace(/[\u0300-\u036f]/gu,"").toLowerCase().replace(/[^a-z0-9]+/gu,"-").replace(/^-+|-+$/gu,"")}function Em(l){return String(l||"").trim().toLowerCase().replace(/[\s/\\?#%]+/gu,"-").replace(/-+/gu,"-").replace(/^-+|-+$/gu,"")}function pm(l){let u=q5(l.routeSegment||"")||Em(l.routeSegment||"");if(u)return u;let r=q5(l.id||"");if(r)return r;let f=q5(l.label||"")||Em(l.label||"");if(f)return f;return`route-${NZ(JSON.stringify(l))}`}function L5(l,u){return`${l}:${u}`}function zm(l){let u=l.map((c)=>{let _=pm(c);return{...c,routeSegment:_,tabs:c.tabs.map((A)=>({...A,routeSegment:pm(A)}))}}),r={},f={},n={},t=u.map((c)=>{let _=c.tabs[0]?.id??"";n[c.id]=_;let A=c.tabs.map((N)=>{let U=`/${c.routeSegment}/${N.routeSegment}/`,w=[U],G={moduleId:c.id,tabId:N.id};for(let J of w)r[o3(J)]=G;return f[L5(c.id,N.id)]=U,{...N,canonicalPath:U,aliases:w}}),F=`/${c.routeSegment}/`,j={moduleId:c.id,tabId:_};return r[o3(F)]=j,{...c,routeSegment:c.routeSegment,canonicalPath:F,tabs:A}}),i=t[0],y={moduleId:i?.id||"",tabId:i?.tabs[0]?.id||""};return r["/"]=y,{modules:t,moduleById:Object.fromEntries(t.map((c)=>[c.id,c])),defaultActiveTabs:n,routeMap:r,canonicalPathByTarget:f,fallbackTarget:y}}function G5(l,u){return l.routeMap[o3(u)]||l.fallbackTarget}function e3(l,u,r){return l.canonicalPathByTarget[L5(u,r)]||l.canonicalPathByTarget[L5(l.fallbackTarget.moduleId,l.fallbackTarget.tabId)]||"/"}function Om(l,u){let r=l.routeMap[o3(u)];if(!r)return null;return e3(l,r.moduleId,r.tabId)}var fA=Ml(Ju(),1);var $l=fA.default.createElement,{useEffect:Zm,useMemo:JZ}=fA.default,W5=fA.default.useState;function rA({status:l,children:u,title:r}){let f=String(l||"unknown").toLowerCase();return $l("span",{className:`status-badge ${f}`,title:r},u||l||"unknown")}function O1({label:l,value:u,hint:r,tone:f}){return $l("article",{className:`metric-card ${f||""}`},$l("div",{className:"metric-label"},l),$l("div",{className:"metric-value"},u),$l("div",{className:"metric-hint"},r))}function lA({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return $l("section",{className:`panel ${n||""}`},$l("div",{className:"panel-head"},$l("div",null,u?$l("p",{className:"panel-eyebrow"},u):null,$l(nu,{title:l,loading:t})),r?$l("div",{className:"panel-actions"},r):null),$l("div",{className:"panel-body"},f))}function Z1({title:l,data:u,onOpen:r,testId:f}){return $l("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r?.(l,u)},"查看原始JSON")}function T5({title:l,text:u}){return $l("div",{className:"empty-state"},$l("strong",null,l),$l("span",null,u))}function UZ(l){return l&&typeof l==="object"&&!Array.isArray(l)?l:null}function ut(l){return Array.isArray(l)?l:[]}function dr(l){let u=Number(l);return Number.isFinite(u)?u.toLocaleString("zh-CN"):"--"}function Hm(l,u=140){if(l===null||l===void 0)return"--";let r=typeof l==="string"?l:JSON.stringify(l),f=String(r||"").replace(/\s+/gu," ").trim();return f.length>u?`${f.slice(0,u-1)}...`:f||"--"}function QZ(l){return ut(l?.tags).map((u)=>String(u||"").trim()).filter(Boolean)}function ki(l){let u=Number(l);return Number.isFinite(u)&&u>=0?Math.floor(u):0}function mZ(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function wZ(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function qZ(l){return String(l||"").split(/[\s,]+/u).map((u)=>u.trim()).filter(Boolean).join(",")}function uA(l,u){return`${l}/microservices/oa-event-flow/proxy${u}`}function LZ(l){if(l.includes("error")||l.includes("failed"))return"failed";if(l.includes("stats"))return"ok";if(l.includes("step")||l.includes("updated"))return"running";return"queued"}function GZ(l){let u=String(l?.subjectKind||"trace"),r=String(l?.subjectId||l?.scopeId||"");return r?`${u}:${r}`:String(l?.scopeId||"--")}function WZ({tags:l}){let u=QZ({tags:l}).slice(0,6);return $l("div",{className:"oa-tag-rail"},u.length===0?$l("span",{className:"muted"},"--"):u.map((r)=>$l("code",{key:r},r)))}function TZ({events:l,onRaw:u}){let r=[...ut(l)].reverse();return r.length===0?$l(T5,{title:"事件表暂无记录",text:"等待 Code Queue 或 Pipeline 按 tag 发布 OA 事件"}):$l("div",{className:"table-wrap oa-event-table-wrap"},$l("table",{className:"oa-event-table","data-testid":"oa-event-flow-event-table"},$l("thead",null,$l("tr",null,$l("th",null,"Seq"),$l("th",null,"Type"),$l("th",null,"Source"),$l("th",null,"Aggregate"),$l("th",null,"Tags"),$l("th",null,"Payload"),$l("th",null,"Created"),$l("th",null,"Raw"))),$l("tbody",null,r.map((f)=>{let n=String(f?.type||"event"),t=`${String(f?.aggregateType||"--")}:${String(f?.aggregateId||"--")}`;return $l("tr",{key:f?.eventId||f?.sequence},$l("td",null,$l("code",null,dr(f?.sequence))),$l("td",null,$l(rA,{status:LZ(n)},n)),$l("td",null,$l("strong",null,f?.sourceId||"--"),$l("code",null,f?.sourceKind||"--")),$l("td",null,$l("code",null,t)),$l("td",null,$l(WZ,{tags:f?.tags})),$l("td",null,$l("span",{className:"oa-payload-preview"},Hm(f?.payload,180))),$l("td",null,Ll(f?.createdAt)),$l("td",null,$l(Z1,{title:`OA Event ${f?.sequence||""}`,data:f,onOpen:u,testId:`raw-oa-event-${f?.sequence||"unknown"}`})))}))))}function KZ({stats:l,onRaw:u}){let r=ut(l);return r.length===0?$l(T5,{title:"统计中心暂无投影",text:"trace-stats-snapshot / trace-step-created 进入事件流后会更新这里"}):$l("div",{className:"table-wrap oa-stats-table-wrap"},$l("table",{className:"oa-stats-table","data-testid":"oa-event-flow-stats"},$l("thead",null,$l("tr",null,$l("th",null,"Scope"),$l("th",null,"Service"),$l("th",null,"STEP"),$l("th",null,"Read"),$l("th",null,"Edit"),$l("th",null,"Run"),$l("th",null,"Error"),$l("th",null,"Output Seq"),$l("th",null,"Revision"),$l("th",null,"Updated"),$l("th",null,"Raw"))),$l("tbody",null,r.map((f)=>$l("tr",{key:f?.scopeId||`${f?.serviceId}-${f?.subjectId}`},$l("td",null,$l("strong",null,GZ(f)),$l("code",null,f?.scopeId||"--")),$l("td",null,$l(rA,{status:String(f?.serviceId||"unknown")==="code-queue"?"running":"queued"},f?.serviceId||"--")),$l("td",null,$l("strong",null,dr(ki(f?.stepCount??f?.llmStepCount)))),$l("td",null,dr(ki(f?.readCount))),$l("td",null,dr(ki(f?.editCount))),$l("td",null,dr(ki(f?.runCount))),$l("td",null,dr(ki(f?.errorCount))),$l("td",null,$l("code",null,dr(ki(f?.outputMaxSeq)))),$l("td",null,dr(ki(f?.statsRevision))),$l("td",null,Ll(f?.updatedAt)),$l("td",null,$l(Z1,{title:`OA Trace Stats ${f?.scopeId||""}`,data:f,onOpen:u,testId:`raw-oa-stats-${String(f?.scopeId||"unknown").replace(/[^a-zA-Z0-9_-]/gu,"_")}`})))))))}function Bm({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((W)=>W.id==="oa-event-flow")||null,[n,t]=W5("service:code-queue"),[i,y]=W5({loading:!1,error:"",health:null,diagnostics:null,events:[],stats:[],refreshedAt:null}),[c,_]=W5({status:"idle",message:"未连接",lastEventAt:""}),A=JZ(()=>qZ(n),[n]);async function F(){if(!f)return;y((W)=>({...W,loading:!0,error:""}));try{let W=A?`tags=${encodeURIComponent(A)}&`:"",[p,O,Z,V]=await Promise.all([Tl(`${r}/microservices/oa-event-flow/health`,{failureFields:[]}),Tl(uA(r,"/api/diagnostics")),Tl(uA(r,`/api/events?${W}limit=100`)),Tl(uA(r,`/api/stats/trace?${W}limit=100`))]);y({loading:!1,error:"",health:p,diagnostics:O,events:ut(Z?.events),stats:ut(V?.stats),refreshedAt:new Date})}catch(W){y((p)=>({...p,loading:!1,error:zl(W,"OA Event Flow 加载失败")}))}}if(Zm(()=>{F()},[f?.id,f?.runtime?.providerStatus,A]),Zm(()=>{if(!f||typeof EventSource>"u")return;let W=A?`?tags=${encodeURIComponent(A)}`:"",p=new EventSource(`${uA(r,"/api/events/stream")}${W}`,{withCredentials:!0});_({status:"running",message:"SSE connecting",lastEventAt:""});let O=(P)=>{_({status:"online",message:Hm(P.data,120),lastEventAt:new Date().toISOString()})},Z=(P)=>{try{let H=JSON.parse(String(P.data||"{}"));_({status:"online",message:String(H?.type||P.type||"event"),lastEventAt:new Date().toISOString()}),y((B)=>{let C=[...ut(B.events).filter((D)=>String(D?.eventId||"")!==String(H?.eventId||"")),H].sort((D,Y)=>Number(D?.sequence||0)-Number(Y?.sequence||0)).slice(-100),E=H?.type==="trace-stats-updated"&&UZ(H?.payload?.stats)?[H.payload.stats,...ut(B.stats).filter((D)=>String(D?.scopeId||"")!==String(H.payload.stats.scopeId||""))].slice(0,100):B.stats;return{...B,events:C,stats:E}})}catch(H){_({status:"warn",message:zl(H,"SSE 事件解析失败"),lastEventAt:new Date().toISOString()})}},V=()=>{_((P)=>({...P,status:"warn",message:"SSE reconnecting"}))};return p.addEventListener("hello",O),p.addEventListener("task-updated",Z),p.addEventListener("queue-updated",Z),p.addEventListener("trace-step-created",Z),p.addEventListener("trace-stats-snapshot",Z),p.addEventListener("trace-stats-updated",Z),p.addEventListener("trace-error",Z),p.onerror=V,()=>p.close()},[f?.id,r,A]),!f)return $l(T5,{title:"OA Event Flow 未登记",text:"请在 config.json 的 microservices 中登记 id=oa-event-flow"});let j=mZ(f),N=wZ(f),U=i.diagnostics||{},w=i.health||{},G=U.eventCount??w.eventCount,J=U.traceStatsCount??w.traceStatsCount,Q=U.latestSequence??w.latestSequence,m=U.pipelineBridge||w.pipelineBridge||{},q=ut(U.eventTypes).slice(0,8);return $l("div",{className:"oa-event-flow-page","data-testid":"oa-event-flow-page"},$l(lA,{title:"OA Event Flow 控制台",eyebrow:"Unified OA Event Bus + Stats Projection",loading:i.loading,actions:$l("div",{className:"panel-actions"},$l("button",{type:"button",className:"ghost-btn",onClick:F,disabled:i.loading,"data-testid":"oa-event-flow-refresh"},i.loading?"刷新中":"刷新"),$l(Z1,{title:"OA Event Flow Service",data:f,onOpen:u,testId:"raw-oa-event-flow-service"}))},$l("div",{className:"oa-flow-hero"},$l("div",null,$l("div",{className:"node-version-line"},$l(rA,{status:w?.ok||j.providerStatus==="online"?"online":"warn"},w?.ok?"HEALTH OK":j.providerStatus||"unknown"),$l(rA,{status:c.status},c.status.toUpperCase()),$l("span",null,N.public?"公网暴露":"仅 UniDesk frontend 代理访问")),$l("p",{className:"muted paragraph"},"独立事件流微服务统一承载 Code Queue 与 Pipeline 的事件发布、tag 订阅、事件表审计和 Trace/STEP 统计投影。")),$l("div",{className:"oa-flow-signal"},$l("span",null,"stream"),$l("strong",null,c.message||"--"),$l("code",null,c.lastEventAt?iu(new Date(c.lastEventAt)):"waiting"))),$l(el,{error:i.error,wide:!0})),$l("div",{className:"oa-flow-metrics"},$l(O1,{label:"事件总量",value:dr(G),hint:`latest seq ${dr(Q)}`,tone:"ok"}),$l(O1,{label:"Trace Stats",value:dr(J),hint:"oa_trace_stats 投影"}),$l(O1,{label:"SSE Clients",value:dr(w?.sseClientCount??ut(U.sseClients).length),hint:c.message||"tag subscription"}),$l(O1,{label:"Pipeline Bridge",value:m?.enabled?dr(m?.insertedCount):"OFF",hint:m?.lastError||m?.lastFinishedAt||`${m?.mode||"snapshot"} service:pipeline`}),$l(O1,{label:"DB",value:w?.databaseReady||U.databaseReady?"READY":"WAIT",hint:w?.databaseLastError||U.databaseLastError||"PostgreSQL persisted"})),$l(lA,{title:"标签订阅",eyebrow:i.refreshedAt?`Updated ${iu(i.refreshedAt)}`:"Tag Pub/Sub"},$l("div",{className:"oa-filter-bar"},$l("label",null,$l("span",null,"tags"),$l("input",{value:n,onChange:(W)=>t(W.target.value),placeholder:"service:code-queue, trace","data-testid":"oa-event-flow-tag-filter"})),$l("div",{className:"oa-filter-presets"},$l("button",{type:"button",className:"ghost-btn",onClick:()=>t("service:code-queue")},"Code Queue"),$l("button",{type:"button",className:"ghost-btn",onClick:()=>t("service:pipeline")},"Pipeline"),$l("button",{type:"button",className:"ghost-btn",onClick:()=>t("trace")},"Trace"),$l("button",{type:"button",className:"ghost-btn",onClick:()=>t("")},"All")),$l("code",null,A||"all events")),$l("div",{className:"oa-type-strip"},q.length===0?$l("span",{className:"muted"},"等待事件类型统计"):q.map((W)=>$l("span",{key:W.type,className:"data-chip"},`${W.type} ${dr(W.count)}`)))),$l("div",{className:"oa-flow-grid"},$l(lA,{title:"事件表",eyebrow:"oa_events persisted log",className:"oa-flow-wide",loading:i.loading,actions:$l(Z1,{title:"OA Event Query",data:{events:i.events,diagnostics:U},onOpen:u,testId:"raw-oa-events"})},$l(TZ,{events:i.events,onRaw:u})),$l(lA,{title:"统计中心",eyebrow:"oa_trace_stats read model",className:"oa-flow-wide",loading:i.loading,actions:$l(Z1,{title:"OA Trace Stats",data:i.stats,onOpen:u,testId:"raw-oa-trace-stats"})},$l(KZ,{stats:i.stats,onRaw:u}))))}var $i=Ml(Ju(),1);var il=Ml(Ym(),1),_l=Ml(Ju(),1);function bu(l){if(typeof l==="string"||typeof l==="number")return""+l;let u="";if(Array.isArray(l)){for(let r=0,f;r{}};function Pm(){for(var l=0,u=arguments.length,r={},f;l=0)f=r.slice(n+1),r=r.slice(0,n);if(r&&!u.hasOwnProperty(r))throw Error("unknown type: "+r);return{type:r,name:f}})}tA.prototype=Pm.prototype={constructor:tA,on:function(l,u){var r=this._,f=DZ(l+"",r),n,t=-1,i=f.length;if(arguments.length<2){while(++t0)for(var r=Array(n),f=0,n,t;f=0&&(u=l.slice(0,r))!=="xmlns")l=l.slice(r+1);return K5.hasOwnProperty(u)?{space:K5[u],local:l}:l}function E5(l){let u;while(u=l.sourceEvent)l=u;return l}function Er(l,u){if(l=E5(l),u===void 0)u=l.currentTarget;if(u){var r=u.ownerSVGElement||u;if(r.createSVGPoint){var f=r.createSVGPoint();return f.x=l.clientX,f.y=l.clientY,f=f.matrixTransform(u.getScreenCTM().inverse()),[f.x,f.y]}if(u.getBoundingClientRect){var n=u.getBoundingClientRect();return[l.clientX-n.left-u.clientLeft,l.clientY-n.top-u.clientTop]}}return[l.pageX,l.pageY]}function SZ(){}function at(l){return l==null?SZ:function(){return this.querySelector(l)}}function p5(l){if(typeof l!=="function")l=at(l);for(var u=this._groups,r=u.length,f=Array(r),n=0;n=m)m=Q+1;while(!(W=G[m])&&++m=0;)if(i=f[n]){if(t&&i.compareDocumentPosition(t)^4)t.parentNode.insertBefore(i,t);t=i}return this}function h5(l){if(!l)l=kZ;function u(F,j){return F&&j?l(F.__data__,j.__data__):!F-!j}for(var r=this._groups,f=r.length,n=Array(f),t=0;tu?1:l>=u?0:NaN}function M5(){var l=arguments[0];return arguments[0]=this,l.apply(null,arguments),this}function s5(){return Array.from(this)}function R5(){for(var l=this._groups,u=0,r=l.length;u1?this.each((u==null?uH:typeof u==="function"?fH:rH)(l,u,r==null?"":r)):ot(this.node(),l)}function ot(l,u){return l.style.getPropertyValue(u)||D1(l).getComputedStyle(l,null).getPropertyValue(u)}function nH(l){return function(){delete this[l]}}function tH(l,u){return function(){this[l]=u}}function iH(l,u){return function(){var r=u.apply(this,arguments);if(r==null)delete this[l];else this[l]=r}}function I5(l,u){return arguments.length>1?this.each((u==null?nH:typeof u==="function"?iH:tH)(l,u)):this.node()[l]}function Cm(l){return l.trim().split(/^|\s+/)}function a5(l){return l.classList||new hm(l)}function hm(l){this._node=l,this._names=Cm(l.getAttribute("class")||"")}hm.prototype={add:function(l){var u=this._names.indexOf(l);if(u<0)this._names.push(l),this._node.setAttribute("class",this._names.join(" "))},remove:function(l){var u=this._names.indexOf(l);if(u>=0)this._names.splice(u,1),this._node.setAttribute("class",this._names.join(" "))},contains:function(l){return this._names.indexOf(l)>=0}};function Mm(l,u){var r=a5(l),f=-1,n=u.length;while(++f=0)r=u.slice(f+1),u=u.slice(0,f);return{type:u,name:r}})}function EH(l){return function(){var u=this.__on;if(!u)return;for(var r=0,f=-1,n=u.length,t;r()=>l;function X1(l,{sourceEvent:u,subject:r,target:f,identifier:n,active:t,x:i,y,dx:c,dy:_,dispatch:A}){Object.defineProperties(this,{type:{value:l,enumerable:!0,configurable:!0},sourceEvent:{value:u,enumerable:!0,configurable:!0},subject:{value:r,enumerable:!0,configurable:!0},target:{value:f,enumerable:!0,configurable:!0},identifier:{value:n,enumerable:!0,configurable:!0},active:{value:t,enumerable:!0,configurable:!0},x:{value:i,enumerable:!0,configurable:!0},y:{value:y,enumerable:!0,configurable:!0},dx:{value:c,enumerable:!0,configurable:!0},dy:{value:_,enumerable:!0,configurable:!0},_:{value:A}})}X1.prototype.on=function(){var l=this._.on.apply(this._,arguments);return l===this._?this:l};function PH(l){return!l.ctrlKey&&!l.button}function CH(){return this.parentNode}function hH(l,u){return u==null?{x:l.x,y:l.y}:u}function MH(){return navigator.maxTouchPoints||"ontouchstart"in this}function P1(){var l=PH,u=CH,r=hH,f=MH,n={},t=Ii("start","drag","end"),i=0,y,c,_,A,F=0;function j(q){q.on("mousedown.drag",N).filter(f).on("touchstart.drag",G).on("touchmove.drag",J,bm).on("touchend.drag touchcancel.drag",Q).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function N(q,W){if(A||!l.call(this,q,W))return;var p=m(this,u.call(this,q,W),q,W,"mouse");if(!p)return;tr(q.view).on("mousemove.drag",U,ai).on("mouseup.drag",w,ai),Gy(q.view),cA(q),_=!1,y=q.clientX,c=q.clientY,p("start",q)}function U(q){if(ft(q),!_){var W=q.clientX-y,p=q.clientY-c;_=W*W+p*p>F}n.mouse("drag",q)}function w(q){tr(q.view).on("mousemove.drag mouseup.drag",null),S1(q.view,_),ft(q),n.mouse("end",q)}function G(q,W){if(!l.call(this,q,W))return;var p=q.changedTouches,O=u.call(this,q,W),Z=p.length,V,P;for(V=0;V>8&15|u>>4&240,u>>4&15|u&240,(u&15)<<4|u&15,1):r===8?$A(u>>24&255,u>>16&255,u>>8&255,(u&255)/255):r===4?$A(u>>12&15|u>>8&240,u>>8&15|u>>4&240,u>>4&15|u&240,((u&15)<<4|u&15)/255):null):(u=RH.exec(l))?new er(u[1],u[2],u[3],1):(u=xH.exec(l))?new er(u[1]*255/100,u[2]*255/100,u[3]*255/100,1):(u=bH.exec(l))?$A(u[1],u[2],u[3],u[4]):(u=vH.exec(l))?$A(u[1]*255/100,u[2]*255/100,u[3]*255/100,u[4]):(u=gH.exec(l))?dm(u[1],u[2]/100,u[3]/100,1):(u=kH.exec(l))?dm(u[1],u[2]/100,u[3]/100,u[4]):vm.hasOwnProperty(l)?Im(vm[l]):l==="transparent"?new er(NaN,NaN,NaN,0):null}function Im(l){return new er(l>>16&255,l>>8&255,l&255,1)}function $A(l,u,r,f){if(f<=0)l=u=r=NaN;return new er(l,u,r,f)}function oH(l){if(!(l instanceof s1))l=nn(l);if(!l)return new er;return l=l.rgb(),new er(l.r,l.g,l.b,l.opacity)}function Ty(l,u,r,f){return arguments.length===1?oH(l):new er(l,u,r,f==null?1:f)}function er(l,u,r,f){this.r=+l,this.g=+u,this.b=+r,this.opacity=+f}C1(er,Ty,A9(s1,{brighter(l){return l=l==null?AA:Math.pow(AA,l),new er(this.r*l,this.g*l,this.b*l,this.opacity)},darker(l){return l=l==null?h1:Math.pow(h1,l),new er(this.r*l,this.g*l,this.b*l,this.opacity)},rgb(){return this},clamp(){return new er(di(this.r),di(this.g),di(this.b),FA(this.opacity))},displayable(){return-0.5<=this.r&&this.r<255.5&&(-0.5<=this.g&&this.g<255.5)&&(-0.5<=this.b&&this.b<255.5)&&(0<=this.opacity&&this.opacity<=1)},hex:am,formatHex:am,formatHex8:dH,formatRgb:om,toString:om}));function am(){return`#${oi(this.r)}${oi(this.g)}${oi(this.b)}`}function dH(){return`#${oi(this.r)}${oi(this.g)}${oi(this.b)}${oi((isNaN(this.opacity)?1:this.opacity)*255)}`}function om(){let l=FA(this.opacity);return`${l===1?"rgb(":"rgba("}${di(this.r)}, ${di(this.g)}, ${di(this.b)}${l===1?")":`, ${l})`}`}function FA(l){return isNaN(l)?1:Math.max(0,Math.min(1,l))}function di(l){return Math.max(0,Math.min(255,Math.round(l)||0))}function oi(l){return l=di(l),(l<16?"0":"")+l.toString(16)}function dm(l,u,r,f){if(f<=0)l=u=r=NaN;else if(r<=0||r>=1)l=u=NaN;else if(u<=0)l=NaN;return new fn(l,u,r,f)}function lw(l){if(l instanceof fn)return new fn(l.h,l.s,l.l,l.opacity);if(!(l instanceof s1))l=nn(l);if(!l)return new fn;if(l instanceof fn)return l;l=l.rgb();var u=l.r/255,r=l.g/255,f=l.b/255,n=Math.min(u,r,f),t=Math.max(u,r,f),i=NaN,y=t-n,c=(t+n)/2;if(y){if(u===t)i=(r-f)/y+(r0&&c<1?0:i;return new fn(i,y,c,l.opacity)}function uw(l,u,r,f){return arguments.length===1?lw(l):new fn(l,u,r,f==null?1:f)}function fn(l,u,r,f){this.h=+l,this.s=+u,this.l=+r,this.opacity=+f}C1(fn,uw,A9(s1,{brighter(l){return l=l==null?AA:Math.pow(AA,l),new fn(this.h,this.s,this.l*l,this.opacity)},darker(l){return l=l==null?h1:Math.pow(h1,l),new fn(this.h,this.s,this.l*l,this.opacity)},rgb(){var l=this.h%360+(this.h<0)*360,u=isNaN(l)||isNaN(this.s)?0:this.s,r=this.l,f=r+(r<0.5?r:1-r)*u,n=2*r-f;return new er(F9(l>=240?l-240:l+120,n,f),F9(l,n,f),F9(l<120?l+240:l-120,n,f),this.opacity)},clamp(){return new fn(em(this.h),_A(this.s),_A(this.l),FA(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&(0<=this.l&&this.l<=1)&&(0<=this.opacity&&this.opacity<=1)},formatHsl(){let l=FA(this.opacity);return`${l===1?"hsl(":"hsla("}${em(this.h)}, ${_A(this.s)*100}%, ${_A(this.l)*100}%${l===1?")":`, ${l})`}`}}));function em(l){return l=(l||0)%360,l<0?l+360:l}function _A(l){return Math.max(0,Math.min(1,l||0))}function F9(l,u,r){return(l<60?u+(r-u)*l/60:l<180?r:l<240?u+(r-u)*(240-l)/60:u)*255}function j9(l,u,r,f,n){var t=l*l,i=t*l;return((1-3*l+3*t-i)*u+(4-6*t+3*i)*r+(1+3*l+3*t-3*i)*f+i*n)/6}function N9(l){var u=l.length-1;return function(r){var f=r<=0?r=0:r>=1?(r=1,u-1):Math.floor(r*u),n=l[f],t=l[f+1],i=f>0?l[f-1]:2*n-t,y=f()=>l;function lB(l,u){return function(r){return l+r*u}}function uB(l,u,r){return l=Math.pow(l,r),u=Math.pow(u,r)-l,r=1/r,function(f){return Math.pow(l+f*u,r)}}function rw(l){return(l=+l)===1?NA:function(u,r){return r-u?uB(u,r,l):R1(isNaN(u)?r:u)}}function NA(l,u){var r=u-l;return r?lB(l,r):R1(isNaN(l)?u:l)}var ei=function l(u){var r=rw(u);function f(n,t){var i=r((n=Ty(n)).r,(t=Ty(t)).r),y=r(n.g,t.g),c=r(n.b,t.b),_=NA(n.opacity,t.opacity);return function(A){return n.r=i(A),n.g=y(A),n.b=c(A),n.opacity=_(A),n+""}}return f.gamma=l,f}(1);function fw(l){return function(u){var r=u.length,f=Array(r),n=Array(r),t=Array(r),i,y;for(i=0;ir)if(t=u.slice(r,t),y[i])y[i]+=t;else y[++i]=t;if((f=f[0])===(n=n[0]))if(y[i])y[i]+=n;else y[++i]=n;else y[++i]=null,c.push({i,x:pr(f,n)});r=w9.lastIndex}if(r180)A+=360;else if(A-_>180)_+=360;j.push({i:F.push(n(F)+"rotate(",null,f)-2,x:pr(_,A)})}else if(A)F.push(n(F)+"rotate("+A+f)}function y(_,A,F,j){if(_!==A)j.push({i:F.push(n(F)+"skewX(",null,f)-2,x:pr(_,A)});else if(A)F.push(n(F)+"skewX("+A+f)}function c(_,A,F,j,N,U){if(_!==F||A!==j){var w=N.push(n(N)+"scale(",null,",",null,")");U.push({i:w-4,x:pr(_,F)},{i:w-2,x:pr(A,j)})}else if(F!==1||j!==1)N.push(n(N)+"scale("+F+","+j+")")}return function(_,A){var F=[],j=[];return _=l(_),A=l(A),t(_.translateX,_.translateY,A.translateX,A.translateY,F,j),i(_.rotate,A.rotate,F,j),y(_.skewX,A.skewX,F,j),c(_.scaleX,_.scaleY,A.scaleX,A.scaleY,F,j),_=A=null,function(N){var U=-1,w=j.length,G;while(++U=0)l._call.call(void 0,u);l=l._next}--Ey}function Nw(){u0=(wA=g1.now())+qA,Ey=b1=0;try{Qw()}finally{Ey=0,WB(),u0=0}}function GB(){var l=g1.now(),u=l-wA;if(u>Jw)qA-=u,wA=l}function WB(){var l,u=mA,r,f=1/0;while(u)if(u._call){if(f>u._time)f=u._time;l=u,u=u._next}else r=u._next,u._next=null,u=l?l._next=r:mA=r;v1=l,W9(f)}function W9(l){if(Ey)return;if(b1)b1=clearTimeout(b1);var u=l-u0;if(u>24){if(l<1/0)b1=setTimeout(Nw,l-g1.now()-qA);if(x1)x1=clearInterval(x1)}else{if(!x1)wA=g1.now(),x1=setInterval(GB,Jw);Ey=1,Uw(Nw)}}function a1(l,u,r){var f=new k1;return u=u==null?0:+u,f.restart((n)=>{f.stop(),l(n+u)},u,r),f}var KB=Ii("start","end","cancel","interrupt"),EB=[],qw=0,mw=1,WA=2,GA=3,ww=4,TA=5,o1=6;function nt(l,u,r,f,n,t){var i=l.__transition;if(!i)l.__transition={};else if(r in i)return;pB(l,r,{name:u,index:f,group:n,on:KB,tween:EB,time:t.time,delay:t.delay,duration:t.duration,ease:t.ease,timer:null,state:qw})}function d1(l,u){var r=ir(l,u);if(r.state>qw)throw Error("too late; already scheduled");return r}function Ur(l,u){var r=ir(l,u);if(r.state>GA)throw Error("too late; already running");return r}function ir(l,u){var r=l.__transition;if(!r||!(r=r[u]))throw Error("transition not found");return r}function pB(l,u,r){var f=l.__transition,n;f[u]=r,r.timer=LA(t,0,r.time);function t(_){if(r.state=mw,r.timer.restart(i,r.delay,r.time),r.delay<=_)i(_-r.delay)}function i(_){var A,F,j,N;if(r.state!==mw)return c();for(A in f){if(N=f[A],N.name!==r.name)continue;if(N.state===GA)return a1(i);if(N.state===ww)N.state=o1,N.timer.stop(),N.on.call("interrupt",l,l.__data__,N.index,N.group),delete f[A];else if(+AWA&&f.state=0)u=u.slice(0,r);return!u||u==="start"})}function gB(l,u,r){var f,n,t=vB(u)?d1:Ur;return function(){var i=t(this,l),y=i.on;if(y!==f)(n=(f=y).copy()).on(u,r);i.on=n}}function V9(l,u){var r=this._id;return arguments.length<2?ir(this.node(),r).on.on(l):this.each(gB(r,l,u))}function kB(l){return function(){var u=this.parentNode;for(var r in this.__transition)if(+r!==l)return;if(u)u.removeChild(this)}}function S9(){return this.on("end.remove",kB(this._id))}function Y9(l){var u=this._name,r=this._id;if(typeof l!=="function")l=at(l);for(var f=this._groups,n=f.length,t=Array(n),i=0;i()=>l;function v9(l,{sourceEvent:u,target:r,transform:f,dispatch:n}){Object.defineProperties(this,{type:{value:l,enumerable:!0,configurable:!0},sourceEvent:{value:u,enumerable:!0,configurable:!0},target:{value:r,enumerable:!0,configurable:!0},transform:{value:f,enumerable:!0,configurable:!0},_:{value:n}})}function tn(l,u,r){this.k=l,this.x=u,this.y=r}tn.prototype={constructor:tn,scale:function(l){return l===1?this:new tn(this.k*l,this.x,this.y)},translate:function(l,u){return l===0&u===0?this:new tn(this.k,this.x+this.k*l,this.y+this.k*u)},apply:function(l){return[l[0]*this.k+this.x,l[1]*this.k+this.y]},applyX:function(l){return l*this.k+this.x},applyY:function(l){return l*this.k+this.y},invert:function(l){return[(l[0]-this.x)/this.k,(l[1]-this.y)/this.k]},invertX:function(l){return(l-this.x)/this.k},invertY:function(l){return(l-this.y)/this.k},rescaleX:function(l){return l.copy().domain(l.range().map(this.invertX,this).map(l.invert,l))},rescaleY:function(l){return l.copy().domain(l.range().map(this.invertY,this).map(l.invert,l))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var r0=new tn(1,0,0);u$.prototype=tn.prototype;function u$(l){while(!l.__zoom)if(!(l=l.parentNode))return r0;return l.__zoom}function SA(l){l.stopImmediatePropagation()}function f0(l){l.preventDefault(),l.stopImmediatePropagation()}function _D(l){return(!l.ctrlKey||l.type==="wheel")&&!l.button}function AD(){var l=this;if(l instanceof SVGElement){if(l=l.ownerSVGElement||l,l.hasAttribute("viewBox"))return l=l.viewBox.baseVal,[[l.x,l.y],[l.x+l.width,l.y+l.height]];return[[0,0],[l.width.baseVal.value,l.height.baseVal.value]]}return[[0,0],[l.clientWidth,l.clientHeight]]}function Ww(){return this.__zoom||r0}function FD(l){return-l.deltaY*(l.deltaMode===1?0.05:l.deltaMode?1:0.002)*(l.ctrlKey?10:1)}function jD(){return navigator.maxTouchPoints||"ontouchstart"in this}function ND(l,u,r){var f=l.invertX(u[0][0])-r[0][0],n=l.invertX(u[1][0])-r[1][0],t=l.invertY(u[0][1])-r[0][1],i=l.invertY(u[1][1])-r[1][1];return l.translate(n>f?(f+n)/2:Math.min(0,f)||Math.max(0,n),i>t?(t+i)/2:Math.min(0,t)||Math.max(0,i))}function r$(){var l=_D,u=AD,r=ND,f=FD,n=jD,t=[0,1/0],i=[[-1/0,-1/0],[1/0,1/0]],y=250,c=l0,_=Ii("start","zoom","end"),A,F,j,N=500,U=150,w=0,G=10;function J(E){E.property("__zoom",Ww).on("wheel.zoom",Z,{passive:!1}).on("mousedown.zoom",V).on("dblclick.zoom",P).filter(n).on("touchstart.zoom",H).on("touchmove.zoom",B).on("touchend.zoom touchcancel.zoom",C).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}J.transform=function(E,D,Y,v){var K=E.selection?E.selection():E;if(K.property("__zoom",Ww),E!==K)W(E,D,Y,v);else K.interrupt().each(function(){p(this,arguments).event(v).start().zoom(null,typeof D==="function"?D.apply(this,arguments):D).end()})},J.scaleBy=function(E,D,Y,v){J.scaleTo(E,function(){var K=this.__zoom.k,X=typeof D==="function"?D.apply(this,arguments):D;return K*X},Y,v)},J.scaleTo=function(E,D,Y,v){J.transform(E,function(){var K=u.apply(this,arguments),X=this.__zoom,I=Y==null?q(K):typeof Y==="function"?Y.apply(this,arguments):Y,o=X.invert(I),fl=typeof D==="function"?D.apply(this,arguments):D;return r(m(Q(X,fl),I,o),K,i)},Y,v)},J.translateBy=function(E,D,Y,v){J.transform(E,function(){return r(this.__zoom.translate(typeof D==="function"?D.apply(this,arguments):D,typeof Y==="function"?Y.apply(this,arguments):Y),u.apply(this,arguments),i)},null,v)},J.translateTo=function(E,D,Y,v,K){J.transform(E,function(){var X=u.apply(this,arguments),I=this.__zoom,o=v==null?q(X):typeof v==="function"?v.apply(this,arguments):v;return r(r0.translate(o[0],o[1]).scale(I.k).translate(typeof D==="function"?-D.apply(this,arguments):-D,typeof Y==="function"?-Y.apply(this,arguments):-Y),X,i)},v,K)};function Q(E,D){return D=Math.max(t[0],Math.min(t[1],D)),D===E.k?E:new tn(D,E.x,E.y)}function m(E,D,Y){var v=D[0]-Y[0]*E.k,K=D[1]-Y[1]*E.k;return v===E.x&&K===E.y?E:new tn(E.k,v,K)}function q(E){return[(+E[0][0]+ +E[1][0])/2,(+E[0][1]+ +E[1][1])/2]}function W(E,D,Y,v){E.on("start.zoom",function(){p(this,arguments).event(v).start()}).on("interrupt.zoom end.zoom",function(){p(this,arguments).event(v).end()}).tween("zoom",function(){var K=this,X=arguments,I=p(K,X).event(v),o=u.apply(K,X),fl=Y==null?q(o):typeof Y==="function"?Y.apply(K,X):Y,yl=Math.max(o[1][0]-o[0][0],o[1][1]-o[0][1]),h=K.__zoom,s=typeof D==="function"?D.apply(K,X):D,ul=c(h.invert(fl).concat(yl/h.k),s.invert(fl).concat(yl/s.k));return function(tl){if(tl===1)tl=s;else{var Al=ul(tl),Kl=yl/Al[2];tl=new tn(Kl,fl[0]-Al[0]*Kl,fl[1]-Al[1]*Kl)}I.zoom(null,tl)}})}function p(E,D,Y){return!Y&&E.__zooming||new O(E,D)}function O(E,D){this.that=E,this.args=D,this.active=0,this.sourceEvent=null,this.extent=u.apply(E,D),this.taps=0}O.prototype={event:function(E){if(E)this.sourceEvent=E;return this},start:function(){if(++this.active===1)this.that.__zooming=this,this.emit("start");return this},zoom:function(E,D){if(this.mouse&&E!=="mouse")this.mouse[1]=D.invert(this.mouse[0]);if(this.touch0&&E!=="touch")this.touch0[1]=D.invert(this.touch0[0]);if(this.touch1&&E!=="touch")this.touch1[1]=D.invert(this.touch1[0]);return this.that.__zoom=D,this.emit("zoom"),this},end:function(){if(--this.active===0)delete this.that.__zooming,this.emit("end");return this},emit:function(E){var D=tr(this.that).datum();_.call(E,this.that,new v9(E,{sourceEvent:this.sourceEvent,target:J,type:E,transform:this.that.__zoom,dispatch:_}),D)}};function Z(E,...D){if(!l.apply(this,arguments))return;var Y=p(this,D).event(E),v=this.__zoom,K=Math.max(t[0],Math.min(t[1],v.k*Math.pow(2,f.apply(this,arguments)))),X=Er(E);if(Y.wheel){if(Y.mouse[0][0]!==X[0]||Y.mouse[0][1]!==X[1])Y.mouse[1]=v.invert(Y.mouse[0]=X);clearTimeout(Y.wheel)}else if(v.k===K)return;else Y.mouse=[X,v.invert(X)],dt(this),Y.start();f0(E),Y.wheel=setTimeout(I,U),Y.zoom("mouse",r(m(Q(v,K),Y.mouse[0],Y.mouse[1]),Y.extent,i));function I(){Y.wheel=null,Y.end()}}function V(E,...D){if(j||!l.apply(this,arguments))return;var Y=E.currentTarget,v=p(this,D,!0).event(E),K=tr(E.view).on("mousemove.zoom",fl,!0).on("mouseup.zoom",yl,!0),X=Er(E,Y),I=E.clientX,o=E.clientY;Gy(E.view),SA(E),v.mouse=[X,this.__zoom.invert(X)],dt(this),v.start();function fl(h){if(f0(h),!v.moved){var s=h.clientX-I,ul=h.clientY-o;v.moved=s*s+ul*ul>w}v.event(h).zoom("mouse",r(m(v.that.__zoom,v.mouse[0]=Er(h,Y),v.mouse[1]),v.extent,i))}function yl(h){K.on("mousemove.zoom mouseup.zoom",null),S1(h.view,v.moved),f0(h),v.event(h).end()}}function P(E,...D){if(!l.apply(this,arguments))return;var Y=this.__zoom,v=Er(E.changedTouches?E.changedTouches[0]:E,this),K=Y.invert(v),X=Y.k*(E.shiftKey?0.5:2),I=r(m(Q(Y,X),v,K),u.apply(this,D),i);if(f0(E),y>0)tr(this).transition().duration(y).call(W,I,v,E);else tr(this).call(J.transform,I,v,E)}function H(E,...D){if(!l.apply(this,arguments))return;var Y=E.touches,v=Y.length,K=p(this,D,E.changedTouches.length===v).event(E),X,I,o,fl;SA(E);for(I=0;I"[React Flow]: Seems like you have not used zustand provider as an ancestor. Help: https://reactflow.dev/error#001",error002:()=>"It looks like you've created a new nodeTypes or edgeTypes object. If this wasn't on purpose please define the nodeTypes/edgeTypes outside of the component or memoize them.",error003:(l)=>`Node type "${l}" not found. Using fallback type "default".`,error004:()=>"The React Flow parent container needs a width and a height to render the graph.",error005:()=>"Only child nodes can use a parent extent.",error006:()=>"Can't create edge. An edge needs a source and a target.",error007:(l)=>`The old edge with id=${l} does not exist.`,error009:(l)=>`Marker type "${l}" doesn't exist.`,error008:(l,{id:u,sourceHandle:r,targetHandle:f})=>`Couldn't create edge for ${l} handle id: "${l==="source"?r:f}", edge id: ${u}.`,error010:()=>"Handle: No node id found. Make sure to only use a Handle inside a custom Node.",error011:(l)=>`Edge type "${l}" not found. Using fallback type "default".`,error012:(l)=>`Node with id "${l}" does not exist, it may have been removed. This can happen when a node is deleted before the "onNodeClick" handler is called.`,error013:(l="react")=>`It seems that you haven't loaded the styles. Please import '@xyflow/${l}/dist/style.css' or base.css to make sure everything is working properly.`,error014:()=>"useNodeConnections: No node ID found. Call useNodeConnections inside a custom Node or provide a node ID.",error015:()=>"It seems that you are trying to drag a node that is not initialized. Please use onNodesChange as explained in the docs."},By=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],o9=["Enter"," ","Escape"],d9={"node.a11yDescription.default":"Press enter or space to select a node. Press delete to remove it and escape to cancel.","node.a11yDescription.keyboardDisabled":"Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.","node.a11yDescription.ariaLiveMessage":({direction:l,x:u,y:r})=>`Moved selected node ${l}. New position, x: ${u}, y: ${r}`,"edge.a11yDescription.default":"Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.","controls.ariaLabel":"Control Panel","controls.zoomIn.ariaLabel":"Zoom In","controls.zoomOut.ariaLabel":"Zoom Out","controls.fitView.ariaLabel":"Fit View","controls.interactive.ariaLabel":"Toggle Interactivity","minimap.ariaLabel":"Mini Map","handle.ariaLabel":"Handle"},ui;(function(l){l.Strict="strict",l.Loose="loose"})(ui||(ui={}));var it;(function(l){l.Free="free",l.Vertical="vertical",l.Horizontal="horizontal"})(it||(it={}));var n0;(function(l){l.Partial="partial",l.Full="full"})(n0||(n0={}));var e9={inProgress:!1,isValid:null,from:null,fromHandle:null,fromPosition:null,fromNode:null,to:null,toHandle:null,toPosition:null,toNode:null,pointer:null},pn;(function(l){l.Bezier="default",l.Straight="straight",l.Step="step",l.SmoothStep="smoothstep",l.SimpleBezier="simplebezier"})(pn||(pn={}));var ri;(function(l){l.Arrow="arrow",l.ArrowClosed="arrowclosed"})(ri||(ri={}));var Ol;(function(l){l.Left="left",l.Top="top",l.Right="right",l.Bottom="bottom"})(Ol||(Ol={}));var Tw={[Ol.Left]:Ol.Right,[Ol.Right]:Ol.Left,[Ol.Top]:Ol.Bottom,[Ol.Bottom]:Ol.Top};function lF(l){return l===null?null:l?"valid":"invalid"}var uF=(l)=>("id"in l)&&("source"in l)&&("target"in l),Xw=(l)=>("id"in l)&&("position"in l)&&!("source"in l)&&!("target"in l),rF=(l)=>("id"in l)&&("internals"in l)&&!("source"in l)&&!("target"in l);var t$=(l,u=[0,0])=>{let{width:r,height:f}=zn(l),n=l.origin??u,t=r*n[0],i=f*n[1];return{x:l.position.x-t,y:l.position.y-i}},fF=(l,u={nodeOrigin:[0,0]})=>{if(l.length===0)return{x:0,y:0,width:0,height:0};let r=l.reduce((f,n)=>{let t=typeof n==="string",i=!u.nodeLookup&&!t?n:void 0;if(u.nodeLookup)i=t?u.nodeLookup.get(n):!rF(n)?u.nodeLookup.get(n.id):n;let y=i?PA(i,u.nodeOrigin):{x:0,y:0,x2:0,y2:0};return hA(f,y)},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return MA(r)},Dy=(l,u={})=>{let r={x:1/0,y:1/0,x2:-1/0,y2:-1/0},f=!1;return l.forEach((n)=>{if(u.filter===void 0||u.filter(n))r=hA(r,PA(n)),f=!0}),f?MA(r):{x:0,y:0,width:0,height:0}},CA=(l,u,[r,f,n]=[0,0,1],t=!1,i=!1)=>{let y={...Yy(u,[r,f,n]),width:u.width/n,height:u.height/n},c=[];for(let _ of l.values()){let{measured:A,selectable:F=!0,hidden:j=!1}=_;if(i&&!F||j)continue;let N=A.width??_.width??_.initialWidth??null,U=A.height??_.height??_.initialHeight??null,w=Vy(y,i0(_)),G=(N??0)*(U??0),J=t&&w>0;if(!_.internals.handleBounds||J||w>=G||_.dragging)c.push(_)}return c},Pw=(l,u)=>{let r=new Set;return l.forEach((f)=>{r.add(f.id)}),u.filter((f)=>r.has(f.source)||r.has(f.target))};function JD(l,u){let r=new Map,f=u?.nodes?new Set(u.nodes.map((n)=>n.id)):null;return l.forEach((n)=>{if(n.measured.width&&n.measured.height&&(u?.includeHiddenNodes||!n.hidden)&&(!f||f.has(n.id)))r.set(n.id,n)}),r}async function Cw({nodes:l,width:u,height:r,panZoom:f,minZoom:n,maxZoom:t},i){if(l.size===0)return Promise.resolve(!0);let y=JD(l,i),c=Dy(y),_=i$(c,u,r,i?.minZoom??n,i?.maxZoom??t,i?.padding??0.1);return await f.setViewport(_,{duration:i?.duration,ease:i?.ease,interpolate:i?.interpolate}),Promise.resolve(!0)}function nF({nodeId:l,nextPosition:u,nodeLookup:r,nodeOrigin:f=[0,0],nodeExtent:n,onError:t}){let i=r.get(l),y=i.parentId?r.get(i.parentId):void 0,{x:c,y:_}=y?y.internals.positionAbsolute:{x:0,y:0},A=i.origin??f,F=i.extent||n;if(i.extent==="parent"&&!i.expandParent)if(!y)t?.("005",mf.error005());else{let N=y.measured.width,U=y.measured.height;if(N&&U)F=[[c,_],[c+N,_+U]]}else if(y&&Hy(i.extent))F=[[i.extent[0][0]+c,i.extent[0][1]+_],[i.extent[1][0]+c,i.extent[1][1]+_]];let j=Hy(F)?t0(u,F,i.measured):u;if(i.measured.width===void 0||i.measured.height===void 0)t?.("015",mf.error015());return{position:{x:j.x-c+(i.measured.width??0)*A[0],y:j.y-_+(i.measured.height??0)*A[1]},positionAbsolute:j}}async function hw({nodesToRemove:l=[],edgesToRemove:u=[],nodes:r,edges:f,onBeforeDelete:n}){let t=new Set(l.map((j)=>j.id)),i=[];for(let j of r){if(j.deletable===!1)continue;let N=t.has(j.id),U=!N&&j.parentId&&i.find((w)=>w.id===j.parentId);if(N||U)i.push(j)}let y=new Set(u.map((j)=>j.id)),c=f.filter((j)=>j.deletable!==!1),A=Pw(i,c);for(let j of c)if(y.has(j.id)&&!A.find((U)=>U.id===j.id))A.push(j);if(!n)return{edges:A,nodes:i};let F=await n({nodes:i,edges:A});if(typeof F==="boolean")return F?{edges:A,nodes:i}:{edges:[],nodes:[]};return F}var Zy=(l,u=0,r=1)=>Math.min(Math.max(l,u),r),t0=(l={x:0,y:0},u,r)=>({x:Zy(l.x,u[0][0],u[1][0]-(r?.width??0)),y:Zy(l.y,u[0][1],u[1][1]-(r?.height??0))});function Mw(l,u,r){let{width:f,height:n}=zn(r),{x:t,y:i}=r.internals.positionAbsolute;return t0(l,[[t,i],[t+f,i+n]],u)}var Kw=(l,u,r)=>{if(lr)return-Zy(Math.abs(l-r),1,u)/u;return 0},sw=(l,u,r=15,f=40)=>{let n=Kw(l.x,f,u.width-f)*r,t=Kw(l.y,f,u.height-f)*r;return[n,t]},hA=(l,u)=>({x:Math.min(l.x,u.x),y:Math.min(l.y,u.y),x2:Math.max(l.x2,u.x2),y2:Math.max(l.y2,u.y2)}),a9=({x:l,y:u,width:r,height:f})=>({x:l,y:u,x2:l+r,y2:u+f}),MA=({x:l,y:u,x2:r,y2:f})=>({x:l,y:u,width:r-l,height:f-u}),i0=(l,u=[0,0])=>{let{x:r,y:f}=rF(l)?l.internals.positionAbsolute:t$(l,u);return{x:r,y:f,width:l.measured?.width??l.width??l.initialWidth??0,height:l.measured?.height??l.height??l.initialHeight??0}},PA=(l,u=[0,0])=>{let{x:r,y:f}=rF(l)?l.internals.positionAbsolute:t$(l,u);return{x:r,y:f,x2:r+(l.measured?.width??l.width??l.initialWidth??0),y2:f+(l.measured?.height??l.height??l.initialHeight??0)}},tF=(l,u)=>MA(hA(a9(l),a9(u))),Vy=(l,u)=>{let r=Math.max(0,Math.min(l.x+l.width,u.x+u.width)-Math.max(l.x,u.x)),f=Math.max(0,Math.min(l.y+l.height,u.y+u.height)-Math.max(l.y,u.y));return Math.ceil(r*f)},iF=(l)=>Vf(l.width)&&Vf(l.height)&&Vf(l.x)&&Vf(l.y),Vf=(l)=>!isNaN(l)&&isFinite(l),yF=(l,u)=>{},Sy=(l,u=[1,1])=>{return{x:u[0]*Math.round(l.x/u[0]),y:u[1]*Math.round(l.y/u[1])}},Yy=({x:l,y:u},[r,f,n],t=!1,i=[1,1])=>{let y={x:(l-r)/n,y:(u-f)/n};return t?Sy(y,i):y},n$=({x:l,y:u},[r,f,n])=>{return{x:l*n+r,y:u*n+f}};function zy(l,u){if(typeof l==="number")return Math.floor((u-u/(1+l))*0.5);if(typeof l==="string"&&l.endsWith("px")){let r=parseFloat(l);if(!Number.isNaN(r))return Math.floor(r)}if(typeof l==="string"&&l.endsWith("%")){let r=parseFloat(l);if(!Number.isNaN(r))return Math.floor(u*r*0.01)}return console.error(`[React Flow] The padding value "${l}" is invalid. Please provide a number or a string with a valid unit (px or %).`),0}function UD(l,u,r){if(typeof l==="string"||typeof l==="number"){let f=zy(l,r),n=zy(l,u);return{top:f,right:n,bottom:f,left:n,x:n*2,y:f*2}}if(typeof l==="object"){let f=zy(l.top??l.y??0,r),n=zy(l.bottom??l.y??0,r),t=zy(l.left??l.x??0,u),i=zy(l.right??l.x??0,u);return{top:f,right:i,bottom:n,left:t,x:t+i,y:f+n}}return{top:0,right:0,bottom:0,left:0,x:0,y:0}}function QD(l,u,r,f,n,t){let{x:i,y}=n$(l,[u,r,f]),{x:c,y:_}=n$({x:l.x+l.width,y:l.y+l.height},[u,r,f]),A=n-c,F=t-_;return{left:Math.floor(i),top:Math.floor(y),right:Math.floor(A),bottom:Math.floor(F)}}var i$=(l,u,r,f,n,t)=>{let i=UD(t,u,r),y=(u-i.x)/l.width,c=(r-i.y)/l.height,_=Math.min(y,c),A=Zy(_,f,n),F=l.x+l.width/2,j=l.y+l.height/2,N=u/2-F*A,U=r/2-j*A,w=QD(l,N,U,A,u,r),G={left:Math.min(w.left-i.left,0),top:Math.min(w.top-i.top,0),right:Math.min(w.right-i.right,0),bottom:Math.min(w.bottom-i.bottom,0)};return{x:N-G.left+G.right,y:U-G.top+G.bottom,zoom:A}},Xy=()=>typeof navigator<"u"&&navigator?.userAgent?.indexOf("Mac")>=0;function Hy(l){return l!==void 0&&l!==null&&l!=="parent"}function zn(l){return{width:l.measured?.width??l.width??l.initialWidth??0,height:l.measured?.height??l.height??l.initialHeight??0}}function cF(l){return(l.measured?.width??l.width??l.initialWidth)!==void 0&&(l.measured?.height??l.height??l.initialHeight)!==void 0}function $F(l,u={width:0,height:0},r,f,n){let t={...l},i=f.get(r);if(i){let y=i.origin||n;t.x+=i.internals.positionAbsolute.x-(u.width??0)*y[0],t.y+=i.internals.positionAbsolute.y-(u.height??0)*y[1]}return t}function _F(l,u){if(l.size!==u.size)return!1;for(let r of l)if(!u.has(r))return!1;return!0}function Rw(){let l,u;return{promise:new Promise((f,n)=>{l=f,u=n}),resolve:l,reject:u}}function xw(l){return{...d9,...l||{}}}function f$(l,{snapGrid:u=[0,0],snapToGrid:r=!1,transform:f,containerBounds:n}){let{x:t,y:i}=Sf(l),y=Yy({x:t-(n?.left??0),y:i-(n?.top??0)},f),{x:c,y:_}=r?Sy(y,u):y;return{xSnapped:c,ySnapped:_,...y}}var sA=(l)=>({width:l.offsetWidth,height:l.offsetHeight}),AF=(l)=>l?.getRootNode?.()||window?.document,mD=["INPUT","SELECT","TEXTAREA"];function FF(l){let u=l.composedPath?.()?.[0]||l.target;if(u?.nodeType!==1)return!1;return mD.includes(u.nodeName)||u.hasAttribute("contenteditable")||!!u.closest(".nokey")}var jF=(l)=>("clientX"in l),Sf=(l,u)=>{let r=jF(l),f=r?l.clientX:l.touches?.[0].clientX,n=r?l.clientY:l.touches?.[0].clientY;return{x:f-(u?.left??0),y:n-(u?.top??0)}},Ew=(l,u,r,f,n)=>{let t=u.querySelectorAll(`.${l}`);if(!t||!t.length)return null;return Array.from(t).map((i)=>{let y=i.getBoundingClientRect();return{id:i.getAttribute("data-handleid"),type:l,nodeId:n,position:i.getAttribute("data-handlepos"),x:(y.left-r.left)/f,y:(y.top-r.top)/f,...sA(i)}})};function RA({sourceX:l,sourceY:u,targetX:r,targetY:f,sourceControlX:n,sourceControlY:t,targetControlX:i,targetControlY:y}){let c=l*0.125+n*0.375+i*0.375+r*0.125,_=u*0.125+t*0.375+y*0.375+f*0.125,A=Math.abs(c-l),F=Math.abs(_-u);return[c,_,A,F]}function YA(l,u){if(l>=0)return 0.5*l;return u*25*Math.sqrt(-l)}function pw({pos:l,x1:u,y1:r,x2:f,y2:n,c:t}){switch(l){case Ol.Left:return[u-YA(u-f,t),r];case Ol.Right:return[u+YA(f-u,t),r];case Ol.Top:return[u,r-YA(r-n,t)];case Ol.Bottom:return[u,r+YA(n-r,t)]}}function xA({sourceX:l,sourceY:u,sourcePosition:r=Ol.Bottom,targetX:f,targetY:n,targetPosition:t=Ol.Top,curvature:i=0.25}){let[y,c]=pw({pos:r,x1:l,y1:u,x2:f,y2:n,c:i}),[_,A]=pw({pos:t,x1:f,y1:n,x2:l,y2:u,c:i}),[F,j,N,U]=RA({sourceX:l,sourceY:u,targetX:f,targetY:n,sourceControlX:y,sourceControlY:c,targetControlX:_,targetControlY:A});return[`M${l},${u} C${y},${c} ${_},${A} ${f},${n}`,F,j,N,U]}function NF({sourceX:l,sourceY:u,targetX:r,targetY:f}){let n=Math.abs(r-l)/2,t=r0}var wD=({source:l,sourceHandle:u,target:r,targetHandle:f})=>`xy-edge__${l}${u||""}-${r}${f||""}`,qD=(l,u)=>{return u.some((r)=>r.source===l.source&&r.target===l.target&&(r.sourceHandle===l.sourceHandle||!r.sourceHandle&&!l.sourceHandle)&&(r.targetHandle===l.targetHandle||!r.targetHandle&&!l.targetHandle))},JF=(l,u,r={})=>{if(!l.source||!l.target)return yF("006",mf.error006()),u;let f=r.getEdgeId||wD,n;if(uF(l))n={...l};else n={...l,id:f(l)};if(qD(n,u))return u;if(n.sourceHandle===null)delete n.sourceHandle;if(n.targetHandle===null)delete n.targetHandle;return u.concat(n)};function bA({sourceX:l,sourceY:u,targetX:r,targetY:f}){let[n,t,i,y]=NF({sourceX:l,sourceY:u,targetX:r,targetY:f});return[`M ${l},${u}L ${r},${f}`,n,t,i,y]}var zw={[Ol.Left]:{x:-1,y:0},[Ol.Right]:{x:1,y:0},[Ol.Top]:{x:0,y:-1},[Ol.Bottom]:{x:0,y:1}},LD=({source:l,sourcePosition:u=Ol.Bottom,target:r})=>{if(u===Ol.Left||u===Ol.Right)return l.xMath.sqrt(Math.pow(u.x-l.x,2)+Math.pow(u.y-l.y,2));function GD({source:l,sourcePosition:u=Ol.Bottom,target:r,targetPosition:f=Ol.Top,center:n,offset:t,stepPosition:i}){let y=zw[u],c=zw[f],_={x:l.x+y.x*t,y:l.y+y.y*t},A={x:r.x+c.x*t,y:r.y+c.y*t},F=LD({source:_,sourcePosition:u,target:A}),j=F.x!==0?"x":"y",N=F[j],U=[],w,G,J={x:0,y:0},Q={x:0,y:0},[,,m,q]=NF({sourceX:l.x,sourceY:l.y,targetX:r.x,targetY:r.y});if(y[j]*c[j]===-1){if(j==="x")w=n.x??_.x+(A.x-_.x)*i,G=n.y??(_.y+A.y)/2;else w=n.x??(_.x+A.x)/2,G=n.y??_.y+(A.y-_.y)*i;let Z=[{x:w,y:_.y},{x:w,y:A.y}],V=[{x:_.x,y:G},{x:A.x,y:G}];if(y[j]===N)U=j==="x"?Z:V;else U=j==="x"?V:Z}else{let Z=[{x:_.x,y:A.y}],V=[{x:A.x,y:_.y}];if(j==="x")U=y.x===N?V:Z;else U=y.y===N?Z:V;if(u===f){let E=Math.abs(l[j]-r[j]);if(E<=t){let D=Math.min(t-1,t-E);if(y[j]===N)J[j]=(_[j]>l[j]?-1:1)*D;else Q[j]=(A[j]>r[j]?-1:1)*D}}if(u!==f){let E=j==="x"?"y":"x",D=y[j]===c[E],Y=_[E]>A[E],v=_[E]=C)w=(P.x+H.x)/2,G=U[0].y;else w=U[0].x,G=(P.y+H.y)/2}let W={x:_.x+J.x,y:_.y+J.y},p={x:A.x+Q.x,y:A.y+Q.y};return[[l,...W.x!==U[0].x||W.y!==U[0].y?[W]:[],...U,...p.x!==U[U.length-1].x||p.y!==U[U.length-1].y?[p]:[],r],w,G,m,q]}function WD(l,u,r,f){let n=Math.min(Ow(l,u)/2,Ow(u,r)/2,f),{x:t,y:i}=u;if(l.x===t&&t===r.x||l.y===i&&i===r.y)return`L${t} ${i}`;if(l.y===i){let _=l.xr.id===u))||null}function vA(l,u){if(!l)return"";if(typeof l==="string")return l;return`${u?`${u}__`:""}${Object.keys(l).sort().map((f)=>`${f}=${l[f]}`).join("&")}`}function kw(l,{id:u,defaultColor:r,defaultMarkerStart:f,defaultMarkerEnd:n}){let t=new Set;return l.reduce((i,y)=>{return[y.markerStart||f,y.markerEnd||n].forEach((c)=>{if(c&&typeof c==="object"){let _=vA(c,u);if(!t.has(_))i.push({id:_,color:c.color||r,...c}),t.add(_)}}),i},[]).sort((i,y)=>i.id.localeCompare(y.id))}var Iw=1000,TD=10,UF={nodeOrigin:[0,0],nodeExtent:By,elevateNodesOnSelect:!0,zIndexMode:"basic",defaults:{}},KD={...UF,checkEquality:!0};function QF(l,u){let r={...l};for(let f in u)if(u[f]!==void 0)r[f]=u[f];return r}function aw(l,u,r){let f=QF(UF,r);for(let n of l.values())if(n.parentId)wF(n,l,u,f);else{let t=t$(n,f.nodeOrigin),i=Hy(n.extent)?n.extent:f.nodeExtent,y=t0(t,i,zn(n));n.internals.positionAbsolute=y}}function ED(l,u){if(!l.handles)return!l.measured?void 0:u?.internals.handleBounds;let r=[],f=[];for(let n of l.handles){let t={id:n.id,width:n.width??1,height:n.height??1,nodeId:l.id,x:n.x,y:n.y,position:n.position,type:n.type};if(n.type==="source")r.push(t);else if(n.type==="target")f.push(t)}return{source:r,target:f}}function mF(l){return l==="manual"}function gA(l,u,r,f={}){let n=QF(KD,f),t={i:0},i=new Map(u),y=n?.elevateNodesOnSelect&&!mF(n.zIndexMode)?Iw:0,c=l.length>0,_=!1;u.clear(),r.clear();for(let A of l){let F=i.get(A.id);if(n.checkEquality&&A===F?.internals.userNode)u.set(A.id,F);else{let j=t$(A,n.nodeOrigin),N=Hy(A.extent)?A.extent:n.nodeExtent,U=t0(j,N,zn(A));F={...n.defaults,...A,measured:{width:A.measured?.width,height:A.measured?.height},internals:{positionAbsolute:U,handleBounds:ED(A,F),z:ow(A,y,n.zIndexMode),userNode:A}},u.set(A.id,F)}if((F.measured===void 0||F.measured.width===void 0||F.measured.height===void 0)&&!F.hidden)c=!1;if(A.parentId)wF(F,u,r,f,t);_||=A.selected??!1}return{nodesInitialized:c,hasSelectedNodes:_}}function pD(l,u){if(!l.parentId)return;let r=u.get(l.parentId);if(r)r.set(l.id,l);else u.set(l.parentId,new Map([[l.id,l]]))}function wF(l,u,r,f,n){let{elevateNodesOnSelect:t,nodeOrigin:i,nodeExtent:y,zIndexMode:c}=QF(UF,f),_=l.parentId,A=u.get(_);if(!A){console.warn(`Parent node ${_} not found. Please make sure that parent nodes are in front of their child nodes in the nodes array.`);return}if(pD(l,r),n&&!A.parentId&&A.internals.rootParentIndex===void 0&&c==="auto")A.internals.rootParentIndex=++n.i,A.internals.z=A.internals.z+n.i*TD;if(n&&A.internals.rootParentIndex!==void 0)n.i=A.internals.rootParentIndex;let F=t&&!mF(c)?Iw:0,{x:j,y:N,z:U}=zD(l,A,i,y,F,c),{positionAbsolute:w}=l.internals,G=j!==w.x||N!==w.y;if(G||U!==l.internals.z)u.set(l.id,{...l,internals:{...l.internals,positionAbsolute:G?{x:j,y:N}:w,z:U}})}function ow(l,u,r){let f=Vf(l.zIndex)?l.zIndex:0;if(mF(r))return f;return f+(l.selected?u:0)}function zD(l,u,r,f,n,t){let{x:i,y}=u.internals.positionAbsolute,c=zn(l),_=t$(l,r),A=Hy(l.extent)?t0(_,l.extent,c):_,F=t0({x:i+A.x,y:y+A.y},f,c);if(l.extent==="parent")F=Mw(F,c,u);let j=ow(l,n,t),N=u.internals.z??0;return{x:F.x,y:F.y,z:N>=j?N+1:j}}function kA(l,u,r,f=[0,0]){let n=[],t=new Map;for(let i of l){let y=u.get(i.parentId);if(!y)continue;let c=t.get(i.parentId)?.expandedRect??i0(y),_=tF(c,i.rect);t.set(i.parentId,{expandedRect:_,parent:y})}if(t.size>0)t.forEach(({expandedRect:i,parent:y},c)=>{let _=y.internals.positionAbsolute,A=zn(y),F=y.origin??f,j=i.x<_.x?Math.round(Math.abs(_.x-i.x)):0,N=i.y<_.y?Math.round(Math.abs(_.y-i.y)):0,U=Math.max(A.width,Math.round(i.width)),w=Math.max(A.height,Math.round(i.height)),G=(U-A.width)*F[0],J=(w-A.height)*F[1];if(j>0||N>0||G||J)n.push({id:c,type:"position",position:{x:y.position.x-j+G,y:y.position.y-N+J}}),r.get(c)?.forEach((Q)=>{if(!l.some((m)=>m.id===Q.id))n.push({id:Q.id,type:"position",position:{x:Q.position.x+j,y:Q.position.y+N}})});if(A.width0){let N=kA(j,u,r,n);_.push(...N)}return{changes:_,updatedInternals:c}}async function ew({delta:l,panZoom:u,transform:r,translateExtent:f,width:n,height:t}){if(!u||!l.x&&!l.y)return Promise.resolve(!1);let i=await u.setViewportConstrained({x:r[0]+l.x,y:r[1]+l.y,zoom:r[2]},[[0,0],[n,t]],f),y=!!i&&(i.x!==r[0]||i.y!==r[1]||i.k!==r[2]);return Promise.resolve(y)}function Dw(l,u,r,f,n,t){let i=n,y=f.get(i)||new Map;f.set(i,y.set(r,u)),i=`${n}-${l}`;let c=f.get(i)||new Map;if(f.set(i,c.set(r,u)),t){i=`${n}-${l}-${t}`;let _=f.get(i)||new Map;f.set(i,_.set(r,u))}}function qF(l,u,r){l.clear(),u.clear();for(let f of r){let{source:n,target:t,sourceHandle:i=null,targetHandle:y=null}=f,c={edgeId:f.id,source:n,target:t,sourceHandle:i,targetHandle:y},_=`${n}-${i}--${t}-${y}`,A=`${t}-${y}--${n}-${i}`;Dw("source",c,A,l,n,i),Dw("target",c,_,l,t,y),u.set(f.id,f)}}function lq(l,u){if(!l.parentId)return!1;let r=u.get(l.parentId);if(!r)return!1;if(r.selected)return!0;return lq(r,u)}function Vw(l,u,r){let f=l;do{if(f?.matches?.(u))return!0;if(f===r)return!1;f=f?.parentElement}while(f);return!1}function OD(l,u,r,f){let n=new Map;for(let[t,i]of l)if((i.selected||i.id===f)&&(!i.parentId||!lq(i,l))&&(i.draggable||u&&typeof i.draggable>"u")){let y=l.get(t);if(y)n.set(t,{id:t,position:y.position||{x:0,y:0},distance:{x:r.x-y.internals.positionAbsolute.x,y:r.y-y.internals.positionAbsolute.y},extent:y.extent,parentId:y.parentId,origin:y.origin,expandParent:y.expandParent,internals:{positionAbsolute:y.internals.positionAbsolute||{x:0,y:0}},measured:{width:y.measured.width??0,height:y.measured.height??0}})}return n}function g9({nodeId:l,dragItems:u,nodeLookup:r,dragging:f=!0}){let n=[];for(let[i,y]of u){let c=r.get(i)?.internals.userNode;if(c)n.push({...c,position:y.position,dragging:f})}if(!l)return[n[0],n];let t=r.get(l)?.internals.userNode;return[!t?n[0]:{...t,position:u.get(l)?.position||t.position,dragging:f},n]}function ZD({dragItems:l,snapGrid:u,x:r,y:f}){let n=l.values().next().value;if(!n)return null;let t={x:r-n.distance.x,y:f-n.distance.y},i=Sy(t,u);return{x:i.x-t.x,y:i.y-t.y}}function uq({onNodeMouseDown:l,getStoreItems:u,onDragStart:r,onDrag:f,onDragStop:n}){let t={x:null,y:null},i=0,y=new Map,c=!1,_={x:0,y:0},A=null,F=!1,j=null,N=!1,U=!1,w=null;function G({noDragClassName:Q,handleSelector:m,domNode:q,isSelectable:W,nodeId:p,nodeClickDistance:O=0}){j=tr(q);function Z({x:B,y:C}){let{nodeLookup:E,nodeExtent:D,snapGrid:Y,snapToGrid:v,nodeOrigin:K,onNodeDrag:X,onSelectionDrag:I,onError:o,updateNodePositions:fl}=u();t={x:B,y:C};let yl=!1,h=y.size>1,s=h&&D?a9(Dy(y)):null,ul=h&&v?ZD({dragItems:y,snapGrid:Y,x:B,y:C}):null;for(let[tl,Al]of y){if(!E.has(tl))continue;let Kl={x:B-Al.distance.x,y:C-Al.distance.y};if(v)Kl=ul?{x:Math.round(Kl.x+ul.x),y:Math.round(Kl.y+ul.y)}:Sy(Kl,Y);let wl=null;if(h&&D&&!Al.extent&&s){let{positionAbsolute:d}=Al.internals,nl=d.x-s.x+D[0][0],k=d.x+Al.measured.width-s.x2+D[1][0],g=d.y-s.y+D[0][1],cl=d.y+Al.measured.height-s.y2+D[1][1];wl=[[nl,g],[k,cl]]}let{position:El,positionAbsolute:M}=nF({nodeId:tl,nextPosition:Kl,nodeLookup:E,nodeExtent:wl?wl:D,nodeOrigin:K,onError:o});yl=yl||Al.position.x!==El.x||Al.position.y!==El.y,Al.position=El,Al.internals.positionAbsolute=M}if(U=U||yl,!yl)return;if(fl(y,!0),w&&(f||X||!p&&I)){let[tl,Al]=g9({nodeId:p,dragItems:y,nodeLookup:E});if(f?.(w,y,tl,Al),X?.(w,tl,Al),!p)I?.(w,Al)}}async function V(){if(!A)return;let{transform:B,panBy:C,autoPanSpeed:E,autoPanOnNodeDrag:D}=u();if(!D){c=!1,cancelAnimationFrame(i);return}let[Y,v]=sw(_,A,E);if(Y!==0||v!==0){if(t.x=(t.x??0)-Y/B[2],t.y=(t.y??0)-v/B[2],await C({x:Y,y:v}))Z(t)}i=requestAnimationFrame(V)}function P(B){let{nodeLookup:C,multiSelectionActive:E,nodesDraggable:D,transform:Y,snapGrid:v,snapToGrid:K,selectNodesOnDrag:X,onNodeDragStart:I,onSelectionDragStart:o,unselectNodesAndEdges:fl}=u();if(F=!0,(!X||!W)&&!E&&p){if(!C.get(p)?.selected)fl()}if(W&&X&&p)l?.(p);let yl=f$(B.sourceEvent,{transform:Y,snapGrid:v,snapToGrid:K,containerBounds:A});if(t=yl,y=OD(C,D,yl,p),y.size>0&&(r||I||!p&&o)){let[h,s]=g9({nodeId:p,dragItems:y,nodeLookup:C});if(r?.(B.sourceEvent,y,h,s),I?.(B.sourceEvent,h,s),!p)o?.(B.sourceEvent,s)}}let H=P1().clickDistance(O).on("start",(B)=>{let{domNode:C,nodeDragThreshold:E,transform:D,snapGrid:Y,snapToGrid:v}=u();if(A=C?.getBoundingClientRect()||null,N=!1,U=!1,w=B.sourceEvent,E===0)P(B);t=f$(B.sourceEvent,{transform:D,snapGrid:Y,snapToGrid:v,containerBounds:A}),_=Sf(B.sourceEvent,A)}).on("drag",(B)=>{let{autoPanOnNodeDrag:C,transform:E,snapGrid:D,snapToGrid:Y,nodeDragThreshold:v,nodeLookup:K}=u(),X=f$(B.sourceEvent,{transform:E,snapGrid:D,snapToGrid:Y,containerBounds:A});if(w=B.sourceEvent,B.sourceEvent.type==="touchmove"&&B.sourceEvent.touches.length>1||p&&!K.has(p))N=!0;if(N)return;if(!c&&C&&F)c=!0,V();if(!F){let I=Sf(B.sourceEvent,A),o=I.x-_.x,fl=I.y-_.y;if(Math.sqrt(o*o+fl*fl)>v)P(B)}if((t.x!==X.xSnapped||t.y!==X.ySnapped)&&y&&F)_=Sf(B.sourceEvent,A),Z(X)}).on("end",(B)=>{if(!F||N)return;if(c=!1,F=!1,cancelAnimationFrame(i),y.size>0){let{nodeLookup:C,updateNodePositions:E,onNodeDragStop:D,onSelectionDragStop:Y}=u();if(U)E(y,!1),U=!1;if(n||D||!p&&Y){let[v,K]=g9({nodeId:p,dragItems:y,nodeLookup:C,dragging:!1});if(n?.(B.sourceEvent,y,v,K),D?.(B.sourceEvent,v,K),!p)Y?.(B.sourceEvent,K)}}}).filter((B)=>{let C=B.target;return!B.button&&(!Q||!Vw(C,`.${Q}`,q))&&(!m||Vw(C,m,q))});j.call(H)}function J(){j?.on(".drag",null)}return{update:G,destroy:J}}function HD(l,u,r){let f=[],n={x:l.x-r,y:l.y-r,width:r*2,height:r*2};for(let t of u.values())if(Vy(n,i0(t))>0)f.push(t);return f}var BD=250;function DD(l,u,r,f){let n=[],t=1/0,i=HD(l,r,u+BD);for(let y of i){let c=[...y.internals.handleBounds?.source??[],...y.internals.handleBounds?.target??[]];for(let _ of c){if(f.nodeId===_.nodeId&&f.type===_.type&&f.id===_.id)continue;let{x:A,y:F}=fi(y,_,_.position,!0),j=Math.sqrt(Math.pow(A-l.x,2)+Math.pow(F-l.y,2));if(j>u)continue;if(j1){let y=f.type==="source"?"target":"source";return n.find((c)=>c.type===y)??n[0]}return n[0]}function rq(l,u,r,f,n,t=!1){let i=f.get(l);if(!i)return null;let y=n==="strict"?i.internals.handleBounds?.[u]:[...i.internals.handleBounds?.source??[],...i.internals.handleBounds?.target??[]],c=(r?y?.find((_)=>_.id===r):y?.[0])??null;return c&&t?{...c,...fi(i,c,c.position,!0)}:c}function fq(l,u){if(l)return l;else if(u?.classList.contains("target"))return"target";else if(u?.classList.contains("source"))return"source";return null}function VD(l,u){let r=null;if(u)r=!0;else if(l&&!u)r=!1;return r}var nq=()=>!0;function SD(l,{connectionMode:u,connectionRadius:r,handleId:f,nodeId:n,edgeUpdaterType:t,isTarget:i,domNode:y,nodeLookup:c,lib:_,autoPanOnConnect:A,flowId:F,panBy:j,cancelConnection:N,onConnectStart:U,onConnect:w,onConnectEnd:G,isValidConnection:J=nq,onReconnectEnd:Q,updateConnection:m,getTransform:q,getFromHandle:W,autoPanSpeed:p,dragThreshold:O=1,handleDomNode:Z}){let V=AF(l.target),P=0,H,{x:B,y:C}=Sf(l),E=fq(t,Z),D=y?.getBoundingClientRect(),Y=!1;if(!D||!E)return;let v=rq(n,E,f,c,u);if(!v)return;let K=Sf(l,D),X=!1,I=null,o=!1,fl=null;function yl(){if(!A||!D)return;let[El,M]=sw(K,D,p);j({x:El,y:M}),P=requestAnimationFrame(yl)}let h={...v,nodeId:n,type:E,position:v.position},s=c.get(n),tl={inProgress:!0,isValid:null,from:fi(s,h,Ol.Left,!0),fromHandle:h,fromPosition:h.position,fromNode:s,to:K,toHandle:null,toPosition:Tw[h.position],toNode:null,pointer:K};function Al(){Y=!0,m(tl),U?.(l,{nodeId:n,handleId:f,handleType:E})}if(O===0)Al();function Kl(El){if(!Y){let{x:cl,y:pl}=Sf(El),Hl=cl-B,bl=pl-C;if(!(Hl*Hl+bl*bl>O*O))return;Al()}if(!W()||!h){wl(El);return}let M=q();if(K=Sf(El,D),H=DD(Yy(K,M,!1,[1,1]),r,c,h),!X)yl(),X=!0;let d=tq(El,{handle:H,connectionMode:u,fromNodeId:n,fromHandleId:f,fromType:i?"target":"source",isValidConnection:J,doc:V,lib:_,flowId:F,nodeLookup:c});fl=d.handleDomNode,I=d.connection,o=VD(!!H,d.isValid);let nl=c.get(n),k=nl?fi(nl,h,Ol.Left,!0):tl.from,g={...tl,from:k,isValid:o,to:d.toHandle&&o?n$({x:d.toHandle.x,y:d.toHandle.y},M):K,toHandle:d.toHandle,toPosition:o&&d.toHandle?d.toHandle.position:Tw[h.position],toNode:d.toHandle?c.get(d.toHandle.nodeId):null,pointer:K};m(g),tl=g}function wl(El){if("touches"in El&&El.touches.length>0)return;if(Y){if((H||fl)&&I&&o)w?.(I);let{inProgress:M,...d}=tl,nl={...d,toPosition:tl.toHandle?tl.toPosition:null};if(G?.(El,nl),t)Q?.(El,nl)}N(),cancelAnimationFrame(P),X=!1,o=!1,I=null,fl=null,V.removeEventListener("mousemove",Kl),V.removeEventListener("mouseup",wl),V.removeEventListener("touchmove",Kl),V.removeEventListener("touchend",wl)}V.addEventListener("mousemove",Kl),V.addEventListener("mouseup",wl),V.addEventListener("touchmove",Kl),V.addEventListener("touchend",wl)}function tq(l,{handle:u,connectionMode:r,fromNodeId:f,fromHandleId:n,fromType:t,doc:i,lib:y,flowId:c,isValidConnection:_=nq,nodeLookup:A}){let F=t==="target",j=u?i.querySelector(`.${y}-flow__handle[data-id="${c}-${u?.nodeId}-${u?.id}-${u?.type}"]`):null,{x:N,y:U}=Sf(l),w=i.elementFromPoint(N,U),G=w?.classList.contains(`${y}-flow__handle`)?w:j,J={handleDomNode:G,isValid:!1,connection:null,toHandle:null};if(G){let Q=fq(void 0,G),m=G.getAttribute("data-nodeid"),q=G.getAttribute("data-handleid"),W=G.classList.contains("connectable"),p=G.classList.contains("connectableend");if(!m||!Q)return J;let O={source:F?m:f,sourceHandle:F?q:n,target:F?f:m,targetHandle:F?n:q};J.connection=O;let V=W&&p&&(r===ui.Strict?F&&Q==="source"||!F&&Q==="target":m!==f||q!==n);J.isValid=V&&_(O),J.toHandle=rq(m,Q,q,A,r,!0)}return J}var IA={onPointerDown:SD,isValid:tq};function iq({domNode:l,panZoom:u,getTransform:r,getViewScale:f}){let n=tr(l);function t({translateExtent:y,width:c,height:_,zoomStep:A=1,pannable:F=!0,zoomable:j=!0,inversePan:N=!1}){let U=(m)=>{if(m.sourceEvent.type!=="wheel"||!u)return;let q=r(),W=m.sourceEvent.ctrlKey&&Xy()?10:1,p=-m.sourceEvent.deltaY*(m.sourceEvent.deltaMode===1?0.05:m.sourceEvent.deltaMode?1:0.002)*A,O=q[2]*Math.pow(2,p*W);u.scaleTo(O)},w=[0,0],G=(m)=>{if(m.sourceEvent.type==="mousedown"||m.sourceEvent.type==="touchstart")w=[m.sourceEvent.clientX??m.sourceEvent.touches[0].clientX,m.sourceEvent.clientY??m.sourceEvent.touches[0].clientY]},J=(m)=>{let q=r();if(m.sourceEvent.type!=="mousemove"&&m.sourceEvent.type!=="touchmove"||!u)return;let W=[m.sourceEvent.clientX??m.sourceEvent.touches[0].clientX,m.sourceEvent.clientY??m.sourceEvent.touches[0].clientY],p=[W[0]-w[0],W[1]-w[1]];w=W;let O=f()*Math.max(q[2],Math.log(q[2]))*(N?-1:1),Z={x:q[0]-p[0]*O,y:q[1]-p[1]*O},V=[[0,0],[c,_]];u.setViewportConstrained({x:Z.x,y:Z.y,zoom:q[2]},V,y)},Q=r$().on("start",G).on("zoom",F?J:null).on("zoom.wheel",j?U:null);n.call(Q,{})}function i(){n.on("zoom",null)}return{update:t,destroy:i,pointer:Er}}var aA=(l)=>({x:l.x,y:l.y,zoom:l.k}),k9=({x:l,y:u,zoom:r})=>r0.translate(l,u).scale(r),Oy=(l,u)=>l.target.closest(`.${u}`),yq=(l,u)=>u===2&&Array.isArray(l)&&l.includes(2),YD=(l)=>((l*=2)<=1?l*l*l:(l-=2)*l*l+2)/2,I9=(l,u=0,r=YD,f=()=>{})=>{let n=typeof u==="number"&&u>0;if(!n)f();return n?l.transition().duration(u).ease(r).on("end",f):l},cq=(l)=>{let u=l.ctrlKey&&Xy()?10:1;return-l.deltaY*(l.deltaMode===1?0.05:l.deltaMode?1:0.002)*u};function XD({zoomPanValues:l,noWheelClassName:u,d3Selection:r,d3Zoom:f,panOnScrollMode:n,panOnScrollSpeed:t,zoomOnPinch:i,onPanZoomStart:y,onPanZoom:c,onPanZoomEnd:_}){return(A)=>{if(Oy(A,u)){if(A.ctrlKey)A.preventDefault();return!1}A.preventDefault(),A.stopImmediatePropagation();let F=r.property("__zoom").k||1;if(A.ctrlKey&&i){let G=Er(A),J=cq(A),Q=F*Math.pow(2,J);f.scaleTo(r,Q,G,A);return}let j=A.deltaMode===1?20:1,N=n===it.Vertical?0:A.deltaX*j,U=n===it.Horizontal?0:A.deltaY*j;if(!Xy()&&A.shiftKey&&n!==it.Vertical)N=A.deltaY*j,U=0;f.translateBy(r,-(N/F)*t,-(U/F)*t,{internal:!0});let w=aA(r.property("__zoom"));if(clearTimeout(l.panScrollTimeout),!l.isPanScrolling)l.isPanScrolling=!0,y?.(A,w);else c?.(A,w),l.panScrollTimeout=setTimeout(()=>{_?.(A,w),l.isPanScrolling=!1},150)}}function PD({noWheelClassName:l,preventScrolling:u,d3ZoomHandler:r}){return function(f,n){let t=f.type==="wheel",i=!u&&t&&!f.ctrlKey,y=Oy(f,l);if(f.ctrlKey&&t&&y)f.preventDefault();if(i||y)return null;f.preventDefault(),r.call(this,f,n)}}function CD({zoomPanValues:l,onDraggingChange:u,onPanZoomStart:r}){return(f)=>{if(f.sourceEvent?.internal)return;let n=aA(f.transform);if(l.mouseButton=f.sourceEvent?.button||0,l.isZoomingOrPanning=!0,l.prevViewport=n,f.sourceEvent?.type==="mousedown")u(!0);if(r)r?.(f.sourceEvent,n)}}function hD({zoomPanValues:l,panOnDrag:u,onPaneContextMenu:r,onTransformChange:f,onPanZoom:n}){return(t)=>{if(l.usedRightMouseButton=!!(r&&yq(u,l.mouseButton??0)),!t.sourceEvent?.sync)f([t.transform.x,t.transform.y,t.transform.k]);if(n&&!t.sourceEvent?.internal)n?.(t.sourceEvent,aA(t.transform))}}function MD({zoomPanValues:l,panOnDrag:u,panOnScroll:r,onDraggingChange:f,onPanZoomEnd:n,onPaneContextMenu:t}){return(i)=>{if(i.sourceEvent?.internal)return;if(l.isZoomingOrPanning=!1,t&&yq(u,l.mouseButton??0)&&!l.usedRightMouseButton&&i.sourceEvent)t(i.sourceEvent);if(l.usedRightMouseButton=!1,f(!1),n){let y=aA(i.transform);l.prevViewport=y,clearTimeout(l.timerId),l.timerId=setTimeout(()=>{n?.(i.sourceEvent,y)},r?150:0)}}}function sD({zoomActivationKeyPressed:l,zoomOnScroll:u,zoomOnPinch:r,panOnDrag:f,panOnScroll:n,zoomOnDoubleClick:t,userSelectionActive:i,noWheelClassName:y,noPanClassName:c,lib:_,connectionInProgress:A}){return(F)=>{let j=l||u,N=r&&F.ctrlKey,U=F.type==="wheel";if(F.button===1&&F.type==="mousedown"&&(Oy(F,`${_}-flow__node`)||Oy(F,`${_}-flow__edge`)))return!0;if(!f&&!j&&!n&&!t&&!r)return!1;if(i)return!1;if(A&&!U)return!1;if(Oy(F,y)&&U)return!1;if(Oy(F,c)&&(!U||n&&U&&!l))return!1;if(!r&&F.ctrlKey&&U)return!1;if(!r&&F.type==="touchstart"&&F.touches?.length>1)return F.preventDefault(),!1;if(!j&&!n&&!N&&U)return!1;if(!f&&(F.type==="mousedown"||F.type==="touchstart"))return!1;if(Array.isArray(f)&&!f.includes(F.button)&&F.type==="mousedown")return!1;let w=Array.isArray(f)&&f.includes(F.button)||!F.button||F.button<=1;return(!F.ctrlKey||U)&&w}}function $q({domNode:l,minZoom:u,maxZoom:r,translateExtent:f,viewport:n,onPanZoom:t,onPanZoomStart:i,onPanZoomEnd:y,onDraggingChange:c}){let _={isZoomingOrPanning:!1,usedRightMouseButton:!1,prevViewport:{x:0,y:0,zoom:0},mouseButton:0,timerId:void 0,panScrollTimeout:void 0,isPanScrolling:!1},A=l.getBoundingClientRect(),F=r$().scaleExtent([u,r]).translateExtent(f),j=tr(l).call(F);Q({x:n.x,y:n.y,zoom:Zy(n.zoom,u,r)},[[0,0],[A.width,A.height]],f);let N=j.on("wheel.zoom"),U=j.on("dblclick.zoom");F.wheelDelta(cq);function w(H,B){if(j)return new Promise((C)=>{F?.interpolate(B?.interpolate==="linear"?En:l0).transform(I9(j,B?.duration,B?.ease,()=>C(!0)),H)});return Promise.resolve(!1)}function G({noWheelClassName:H,noPanClassName:B,onPaneContextMenu:C,userSelectionActive:E,panOnScroll:D,panOnDrag:Y,panOnScrollMode:v,panOnScrollSpeed:K,preventScrolling:X,zoomOnPinch:I,zoomOnScroll:o,zoomOnDoubleClick:fl,zoomActivationKeyPressed:yl,lib:h,onTransformChange:s,connectionInProgress:ul,paneClickDistance:tl,selectionOnDrag:Al}){if(E&&!_.isZoomingOrPanning)J();let Kl=D&&!yl&&!E;F.clickDistance(Al?1/0:!Vf(tl)||tl<0?0:tl);let wl=Kl?XD({zoomPanValues:_,noWheelClassName:H,d3Selection:j,d3Zoom:F,panOnScrollMode:v,panOnScrollSpeed:K,zoomOnPinch:I,onPanZoomStart:i,onPanZoom:t,onPanZoomEnd:y}):PD({noWheelClassName:H,preventScrolling:X,d3ZoomHandler:N});if(j.on("wheel.zoom",wl,{passive:!1}),!E){let M=CD({zoomPanValues:_,onDraggingChange:c,onPanZoomStart:i});F.on("start",M);let d=hD({zoomPanValues:_,panOnDrag:Y,onPaneContextMenu:!!C,onPanZoom:t,onTransformChange:s});F.on("zoom",d);let nl=MD({zoomPanValues:_,panOnDrag:Y,panOnScroll:D,onPaneContextMenu:C,onPanZoomEnd:y,onDraggingChange:c});F.on("end",nl)}let El=sD({zoomActivationKeyPressed:yl,panOnDrag:Y,zoomOnScroll:o,panOnScroll:D,zoomOnDoubleClick:fl,zoomOnPinch:I,userSelectionActive:E,noPanClassName:B,noWheelClassName:H,lib:h,connectionInProgress:ul});if(F.filter(El),fl)j.on("dblclick.zoom",U);else j.on("dblclick.zoom",null)}function J(){F.on("zoom",null)}async function Q(H,B,C){let E=k9(H),D=F?.constrain()(E,B,C);if(D)await w(D);return new Promise((Y)=>Y(D))}async function m(H,B){let C=k9(H);return await w(C,B),new Promise((E)=>E(C))}function q(H){if(j){let B=k9(H),C=j.property("__zoom");if(C.k!==H.zoom||C.x!==H.x||C.y!==H.y)F?.transform(j,B,null,{sync:!0})}}function W(){let H=j?u$(j.node()):{x:0,y:0,k:1};return{x:H.x,y:H.y,zoom:H.k}}function p(H,B){if(j)return new Promise((C)=>{F?.interpolate(B?.interpolate==="linear"?En:l0).scaleTo(I9(j,B?.duration,B?.ease,()=>C(!0)),H)});return Promise.resolve(!1)}function O(H,B){if(j)return new Promise((C)=>{F?.interpolate(B?.interpolate==="linear"?En:l0).scaleBy(I9(j,B?.duration,B?.ease,()=>C(!0)),H)});return Promise.resolve(!1)}function Z(H){F?.scaleExtent(H)}function V(H){F?.translateExtent(H)}function P(H){let B=!Vf(H)||H<0?0:H;F?.clickDistance(B)}return{update:G,destroy:J,setViewport:m,setViewportConstrained:Q,getViewport:W,scaleTo:p,scaleBy:O,setScaleExtent:Z,setTranslateExtent:V,syncViewport:q,setClickDistance:P}}var ni;(function(l){l.Line="line",l.Handle="handle"})(ni||(ni={}));function RD({width:l,prevWidth:u,height:r,prevHeight:f,affectsX:n,affectsY:t}){let i=l-u,y=r-f,c=[i>0?1:i<0?-1:0,y>0?1:y<0?-1:0];if(i&&n)c[0]=c[0]*-1;if(y&&t)c[1]=c[1]*-1;return c}function Sw(l){let u=l.includes("right")||l.includes("left"),r=l.includes("bottom")||l.includes("top"),f=l.includes("left"),n=l.includes("top");return{isHorizontal:u,isVertical:r,affectsX:f,affectsY:n}}function et(l,u){return Math.max(0,u-l)}function li(l,u){return Math.max(0,l-u)}function XA(l,u,r){return Math.max(0,u-l,l-r)}function Yw(l,u){return l?!u:u}function xD(l,u,r,f,n,t,i,y){let{affectsX:c,affectsY:_}=u,{isHorizontal:A,isVertical:F}=u,j=A&&F,{xSnapped:N,ySnapped:U}=r,{minWidth:w,maxWidth:G,minHeight:J,maxHeight:Q}=f,{x:m,y:q,width:W,height:p,aspectRatio:O}=l,Z=Math.floor(A?N-l.pointerX:0),V=Math.floor(F?U-l.pointerY:0),P=W+(c?-Z:Z),H=p+(_?-V:V),B=-t[0]*W,C=-t[1]*p,E=XA(P,w,G),D=XA(H,J,Q);if(i){let K=0,X=0;if(c&&Z<0)K=et(m+Z+B,i[0][0]);else if(!c&&Z>0)K=li(m+P+B,i[1][0]);if(_&&V<0)X=et(q+V+C,i[0][1]);else if(!_&&V>0)X=li(q+H+C,i[1][1]);E=Math.max(E,K),D=Math.max(D,X)}if(y){let K=0,X=0;if(c&&Z>0)K=li(m+Z,y[0][0]);else if(!c&&Z<0)K=et(m+P,y[1][0]);if(_&&V>0)X=li(q+V,y[0][1]);else if(!_&&V<0)X=et(q+H,y[1][1]);E=Math.max(E,K),D=Math.max(D,X)}if(n){if(A){let K=XA(P/O,J,Q)*O;if(E=Math.max(E,K),i){let X=0;if(!c&&!_||c&&!_&&j)X=li(q+C+P/O,i[1][1])*O;else X=et(q+C+(c?Z:-Z)/O,i[0][1])*O;E=Math.max(E,X)}if(y){let X=0;if(!c&&!_||c&&!_&&j)X=et(q+P/O,y[1][1])*O;else X=li(q+(c?Z:-Z)/O,y[0][1])*O;E=Math.max(E,X)}}if(F){let K=XA(H*O,w,G)/O;if(D=Math.max(D,K),i){let X=0;if(!c&&!_||_&&!c&&j)X=li(m+H*O+B,i[1][0])/O;else X=et(m+(_?V:-V)*O+B,i[0][0])/O;D=Math.max(D,X)}if(y){let X=0;if(!c&&!_||_&&!c&&j)X=et(m+H*O,y[1][0])/O;else X=li(m+(_?V:-V)*O,y[0][0])/O;D=Math.max(D,X)}}}if(V=V+(V<0?D:-D),Z=Z+(Z<0?E:-E),n)if(j)if(P>H*O)V=(Yw(c,_)?-Z:Z)/O;else Z=(Yw(c,_)?-V:V)*O;else if(A)V=Z/O,_=c;else Z=V*O,c=_;let Y=c?m+Z:m,v=_?q+V:q;return{width:W+(c?-Z:Z),height:p+(_?-V:V),x:t[0]*Z*(!c?1:-1)+Y,y:t[1]*V*(!_?1:-1)+v}}var _q={width:0,height:0,x:0,y:0},bD={..._q,pointerX:0,pointerY:0,aspectRatio:1};function vD(l){return[[0,0],[l.measured.width,l.measured.height]]}function gD(l,u,r){let f=u.position.x+l.position.x,n=u.position.y+l.position.y,t=l.measured.width??0,i=l.measured.height??0,y=r[0]*t,c=r[1]*i;return[[f-y,n-c],[f+t-y,n+i-c]]}function Aq({domNode:l,nodeId:u,getStoreItems:r,onChange:f,onEnd:n}){let t=tr(l),i={controlDirection:Sw("bottom-right"),boundaries:{minWidth:0,minHeight:0,maxWidth:Number.MAX_VALUE,maxHeight:Number.MAX_VALUE},resizeDirection:void 0,keepAspectRatio:!1};function y({controlPosition:_,boundaries:A,keepAspectRatio:F,resizeDirection:j,onResizeStart:N,onResize:U,onResizeEnd:w,shouldResize:G}){let J={..._q},Q={...bD};i={boundaries:A,resizeDirection:j,keepAspectRatio:F,controlDirection:Sw(_)};let m=void 0,q=null,W=[],p=void 0,O=void 0,Z=void 0,V=!1,P=P1().on("start",(H)=>{let{nodeLookup:B,transform:C,snapGrid:E,snapToGrid:D,nodeOrigin:Y,paneDomNode:v}=r();if(m=B.get(u),!m)return;q=v?.getBoundingClientRect()??null;let{xSnapped:K,ySnapped:X}=f$(H.sourceEvent,{transform:C,snapGrid:E,snapToGrid:D,containerBounds:q});if(J={width:m.measured.width??0,height:m.measured.height??0,x:m.position.x??0,y:m.position.y??0},Q={...J,pointerX:K,pointerY:X,aspectRatio:J.width/J.height},p=void 0,m.parentId&&(m.extent==="parent"||m.expandParent))p=B.get(m.parentId),O=p&&m.extent==="parent"?vD(p):void 0;W=[],Z=void 0;for(let[I,o]of B)if(o.parentId===u){if(W.push({id:I,position:{...o.position},extent:o.extent}),o.extent==="parent"||o.expandParent){let fl=gD(o,m,o.origin??Y);if(Z)Z=[[Math.min(fl[0][0],Z[0][0]),Math.min(fl[0][1],Z[0][1])],[Math.max(fl[1][0],Z[1][0]),Math.max(fl[1][1],Z[1][1])]];else Z=fl}}N?.(H,{...J})}).on("drag",(H)=>{let{transform:B,snapGrid:C,snapToGrid:E,nodeOrigin:D}=r(),Y=f$(H.sourceEvent,{transform:B,snapGrid:C,snapToGrid:E,containerBounds:q}),v=[];if(!m)return;let{x:K,y:X,width:I,height:o}=J,fl={},yl=m.origin??D,{width:h,height:s,x:ul,y:tl}=xD(Q,i.controlDirection,Y,i.boundaries,i.keepAspectRatio,yl,O,Z),Al=h!==I,Kl=s!==o,wl=ul!==K&&Al,El=tl!==X&&Kl;if(!wl&&!El&&!Al&&!Kl)return;if(wl||El||yl[0]===1||yl[1]===1){if(fl.x=wl?ul:J.x,fl.y=El?tl:J.y,J.x=fl.x,J.y=fl.y,W.length>0){let k=ul-K,g=tl-X;for(let cl of W)cl.position={x:cl.position.x-k+yl[0]*(h-I),y:cl.position.y-g+yl[1]*(s-o)},v.push(cl)}}if(Al||Kl)fl.width=Al&&(!i.resizeDirection||i.resizeDirection==="horizontal")?h:J.width,fl.height=Kl&&(!i.resizeDirection||i.resizeDirection==="vertical")?s:J.height,J.width=fl.width,J.height=fl.height;if(p&&m.expandParent){let k=yl[0]*(fl.width??0);if(fl.x&&fl.x{if(!V)return;w?.(H,{...J}),n?.({...J}),V=!1});t.call(P)}function c(){t.on(".drag",null)}return{update:y,destroy:c}}var Wq=Ml(Ju(),1),Tq=Ml(wq(),1);var qq=(l)=>{let u,r=new Set,f=(A,F)=>{let j=typeof A==="function"?A(u):A;if(!Object.is(j,u)){let N=u;u=(F!=null?F:typeof j!=="object"||j===null)?j:Object.assign({},u,j),r.forEach((U)=>U(u,N))}},n=()=>u,c={setState:f,getState:n,getInitialState:()=>_,subscribe:(A)=>{return r.add(A),()=>r.delete(A)},destroy:()=>{r.clear()}},_=u=l(f,n,c);return c},Lq=(l)=>l?qq(l):qq;var{useDebugValue:AV}=Wq.default,{useSyncExternalStoreWithSelector:FV}=Tq.default,jV=(l)=>l;function GF(l,u=jV,r){let f=FV(l.subscribe,l.getState,l.getServerState||l.getInitialState,u,r);return AV(f),f}var Gq=(l,u)=>{let r=Lq(l),f=(n,t=u)=>GF(r,n,t);return Object.assign(f,r),f},Kq=(l,u)=>l?Gq(l,u):Gq;function zu(l,u){if(Object.is(l,u))return!0;if(typeof l!=="object"||l===null||typeof u!=="object"||u===null)return!1;if(l instanceof Map&&u instanceof Map){if(l.size!==u.size)return!1;for(let[f,n]of l)if(!Object.is(n,u.get(f)))return!1;return!0}if(l instanceof Set&&u instanceof Set){if(l.size!==u.size)return!1;for(let f of l)if(!u.has(f))return!1;return!0}let r=Object.keys(l);if(r.length!==Object.keys(u).length)return!1;for(let f of r)if(!Object.prototype.hasOwnProperty.call(u,f)||!Object.is(l[f],u[f]))return!1;return!0}var NV=Ml(U2(),1),u8=_l.createContext(null),JV=u8.Provider,Iq=mf.error001();function $u(l,u){let r=_l.useContext(u8);if(r===null)throw Error(Iq);return GF(r,l,u)}function Vu(){let l=_l.useContext(u8);if(l===null)throw Error(Iq);return _l.useMemo(()=>({getState:l.getState,setState:l.setState,subscribe:l.subscribe}),[l])}var Eq={display:"none"},UV={position:"absolute",width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0px, 0px, 0px, 0px)",clipPath:"inset(100%)"},aq="react-flow__node-desc",oq="react-flow__edge-desc",QV="react-flow__aria-live",mV=(l)=>l.ariaLiveMessage,wV=(l)=>l.ariaLabelConfig;function qV({rfId:l}){let u=$u(mV);return il.jsx("div",{id:`${QV}-${l}`,"aria-live":"assertive","aria-atomic":"true",style:UV,children:u})}function LV({rfId:l,disableKeyboardA11y:u}){let r=$u(wV);return il.jsxs(il.Fragment,{children:[il.jsx("div",{id:`${aq}-${l}`,style:Eq,children:u?r["node.a11yDescription.default"]:r["node.a11yDescription.keyboardDisabled"]}),il.jsx("div",{id:`${oq}-${l}`,style:Eq,children:r["edge.a11yDescription.default"]}),!u&&il.jsx(qV,{rfId:l})]})}var r8=_l.forwardRef(({position:l="top-left",children:u,className:r,style:f,...n},t)=>{let i=`${l}`.split("-");return il.jsx("div",{className:bu(["react-flow__panel",r,...i]),style:f,ref:t,...n,children:u})});r8.displayName="Panel";function GV({proOptions:l,position:u="bottom-right"}){if(l?.hideAttribution)return null;return il.jsx(r8,{position:u,className:"react-flow__attribution","data-message":"Please only hide this attribution when you are subscribed to React Flow Pro: https://pro.reactflow.dev",children:il.jsx("a",{href:"https://reactflow.dev",target:"_blank",rel:"noopener noreferrer","aria-label":"React Flow attribution",children:"React Flow"})})}var WV=(l)=>{let u=[],r=[];for(let[,f]of l.nodeLookup)if(f.selected)u.push(f.internals.userNode);for(let[,f]of l.edgeLookup)if(f.selected)r.push(f);return{selectedNodes:u,selectedEdges:r}},dA=(l)=>l.id;function TV(l,u){return zu(l.selectedNodes.map(dA),u.selectedNodes.map(dA))&&zu(l.selectedEdges.map(dA),u.selectedEdges.map(dA))}function KV({onSelectionChange:l}){let u=Vu(),{selectedNodes:r,selectedEdges:f}=$u(WV,TV);return _l.useEffect(()=>{let n={nodes:r,edges:f};l?.(n),u.getState().onSelectionChangeHandlers.forEach((t)=>t(n))},[r,f,l]),null}var EV=(l)=>!!l.onSelectionChangeHandlers;function pV({onSelectionChange:l}){let u=$u(EV);if(l||u)return il.jsx(KV,{onSelectionChange:l});return null}var KF=typeof window<"u"?_l.useLayoutEffect:_l.useEffect,dq=[0,0],zV={x:0,y:0,zoom:1},OV=["nodes","edges","defaultNodes","defaultEdges","onConnect","onConnectStart","onConnectEnd","onClickConnectStart","onClickConnectEnd","nodesDraggable","autoPanOnNodeFocus","nodesConnectable","nodesFocusable","edgesFocusable","edgesReconnectable","elevateNodesOnSelect","elevateEdgesOnSelect","minZoom","maxZoom","nodeExtent","onNodesChange","onEdgesChange","elementsSelectable","connectionMode","snapGrid","snapToGrid","translateExtent","connectOnClick","defaultEdgeOptions","fitView","fitViewOptions","onNodesDelete","onEdgesDelete","onDelete","onNodeDrag","onNodeDragStart","onNodeDragStop","onSelectionDrag","onSelectionDragStart","onSelectionDragStop","onMoveStart","onMove","onMoveEnd","noPanClassName","nodeOrigin","autoPanOnConnect","autoPanOnNodeDrag","onError","connectionRadius","isValidConnection","selectNodesOnDrag","nodeDragThreshold","connectionDragThreshold","onBeforeDelete","debug","autoPanSpeed","ariaLabelConfig","zIndexMode"],pq=[...OV,"rfId"],ZV=(l)=>({setNodes:l.setNodes,setEdges:l.setEdges,setMinZoom:l.setMinZoom,setMaxZoom:l.setMaxZoom,setTranslateExtent:l.setTranslateExtent,setNodeExtent:l.setNodeExtent,reset:l.reset,setDefaultNodesAndEdges:l.setDefaultNodesAndEdges}),zq={translateExtent:By,nodeOrigin:dq,minZoom:0.5,maxZoom:2,elementsSelectable:!0,noPanClassName:"nopan",rfId:"1"};function HV(l){let{setNodes:u,setEdges:r,setMinZoom:f,setMaxZoom:n,setTranslateExtent:t,setNodeExtent:i,reset:y,setDefaultNodesAndEdges:c}=$u(ZV,zu),_=Vu();KF(()=>{return c(l.defaultNodes,l.defaultEdges),()=>{A.current=zq,y()}},[]);let A=_l.useRef(zq);return KF(()=>{for(let F of pq){let j=l[F],N=A.current[F];if(j===N)continue;if(typeof l[F]>"u")continue;if(F==="nodes")u(j);else if(F==="edges")r(j);else if(F==="minZoom")f(j);else if(F==="maxZoom")n(j);else if(F==="translateExtent")t(j);else if(F==="nodeExtent")i(j);else if(F==="ariaLabelConfig")_.setState({ariaLabelConfig:xw(j)});else if(F==="fitView")_.setState({fitViewQueued:j});else if(F==="fitViewOptions")_.setState({fitViewOptions:j});else _.setState({[F]:j})}A.current=l},pq.map((F)=>l[F])),null}function Oq(){if(typeof window>"u"||!window.matchMedia)return null;return window.matchMedia("(prefers-color-scheme: dark)")}function BV(l){let[u,r]=_l.useState(l==="system"?null:l);return _l.useEffect(()=>{if(l!=="system"){r(l);return}let f=Oq(),n=()=>r(f?.matches?"dark":"light");return n(),f?.addEventListener("change",n),()=>{f?.removeEventListener("change",n)}},[l]),u!==null?u:Oq()?.matches?"dark":"light"}var Zq=typeof document<"u"?document:null;function c$(l=null,u={target:Zq,actInsideInputWithModifier:!0}){let[r,f]=_l.useState(!1),n=_l.useRef(!1),t=_l.useRef(new Set([])),[i,y]=_l.useMemo(()=>{if(l!==null){let _=(Array.isArray(l)?l:[l]).filter((F)=>typeof F==="string").map((F)=>F.replace("+",` +`;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("+",` `).replace(` `,` +`).split(` -`)),A=_.reduce((F,j)=>F.concat(...j),[]);return[_,A]}return[[],[]]},[l]);return _l.useEffect(()=>{let c=u?.target??Zq,_=u?.actInsideInputWithModifier??!0;if(l!==null){let A=(N)=>{if(n.current=N.ctrlKey||N.metaKey||N.shiftKey||N.altKey,(!n.current||n.current&&!_)&&FF(N))return!1;let w=Bq(N.code,y);if(t.current.add(N[w]),Hq(i,t.current,!1)){let G=N.composedPath?.()?.[0]||N.target,J=G?.nodeName==="BUTTON"||G?.nodeName==="A";if(u.preventDefault!==!1&&(n.current||!J))N.preventDefault();f(!0)}},F=(N)=>{let U=Bq(N.code,y);if(Hq(i,t.current,!0))f(!1),t.current.clear();else t.current.delete(N[U]);if(N.key==="Meta")t.current.clear();n.current=!1},j=()=>{t.current.clear(),f(!1)};return c?.addEventListener("keydown",A),c?.addEventListener("keyup",F),window.addEventListener("blur",j),window.addEventListener("contextmenu",j),()=>{c?.removeEventListener("keydown",A),c?.removeEventListener("keyup",F),window.removeEventListener("blur",j),window.removeEventListener("contextmenu",j)}}},[l,f]),r}function Hq(l,u,r){return l.filter((f)=>r||f.length===u.size).some((f)=>f.every((n)=>u.has(n)))}function Bq(l,u){return u.includes(l)?"code":"key"}var DV=()=>{let l=Vu();return _l.useMemo(()=>{return{zoomIn:(u)=>{let{panZoom:r}=l.getState();return r?r.scaleBy(1.2,u):Promise.resolve(!1)},zoomOut:(u)=>{let{panZoom:r}=l.getState();return r?r.scaleBy(0.8333333333333334,u):Promise.resolve(!1)},zoomTo:(u,r)=>{let{panZoom:f}=l.getState();return f?f.scaleTo(u,r):Promise.resolve(!1)},getZoom:()=>l.getState().transform[2],setViewport:async(u,r)=>{let{transform:[f,n,t],panZoom:i}=l.getState();if(!i)return Promise.resolve(!1);return await i.setViewport({x:u.x??f,y:u.y??n,zoom:u.zoom??t},r),Promise.resolve(!0)},getViewport:()=>{let[u,r,f]=l.getState().transform;return{x:u,y:r,zoom:f}},setCenter:async(u,r,f)=>{return l.getState().setCenter(u,r,f)},fitBounds:async(u,r)=>{let{width:f,height:n,minZoom:t,maxZoom:i,panZoom:y}=l.getState(),c=i$(u,f,n,t,i,r?.padding??0.1);if(!y)return Promise.resolve(!1);return await y.setViewport(c,{duration:r?.duration,ease:r?.ease,interpolate:r?.interpolate}),Promise.resolve(!0)},screenToFlowPosition:(u,r={})=>{let{transform:f,snapGrid:n,snapToGrid:t,domNode:i}=l.getState();if(!i)return u;let{x:y,y:c}=i.getBoundingClientRect(),_={x:u.x-y,y:u.y-c},A=r.snapGrid??n,F=r.snapToGrid??t;return Yy(_,f,F,A)},flowToScreenPosition:(u)=>{let{transform:r,domNode:f}=l.getState();if(!f)return u;let{x:n,y:t}=f.getBoundingClientRect(),i=n$(u,r);return{x:i.x+n,y:i.y+t}}}},[])};function eq(l,u){let r=[],f=new Map,n=[];for(let t of l)if(t.type==="add"){n.push(t);continue}else if(t.type==="remove"||t.type==="replace")f.set(t.id,[t]);else{let i=f.get(t.id);if(i)i.push(t);else f.set(t.id,[t])}for(let t of u){let i=f.get(t.id);if(!i){r.push(t);continue}if(i[0].type==="remove")continue;if(i[0].type==="replace"){r.push({...i[0].item});continue}let y={...t};for(let c of i)VV(c,y);r.push(y)}if(n.length)n.forEach((t)=>{if(t.index!==void 0)r.splice(t.index,0,{...t.item});else r.push({...t.item})});return r}function VV(l,u){switch(l.type){case"select":{u.selected=l.selected;break}case"position":{if(typeof l.position<"u")u.position=l.position;if(typeof l.dragging<"u")u.dragging=l.dragging;break}case"dimensions":{if(typeof l.dimensions<"u"){if(u.measured={...l.dimensions},l.setAttributes){if(l.setAttributes===!0||l.setAttributes==="width")u.width=l.dimensions.width;if(l.setAttributes===!0||l.setAttributes==="height")u.height=l.dimensions.height}}if(typeof l.resizing==="boolean")u.resizing=l.resizing;break}}}function SV(l,u){return eq(l,u)}function YV(l,u){return eq(l,u)}function y0(l,u){return{id:l,type:"select",selected:u}}function Cy(l,u=new Set,r=!1){let f=[];for(let[n,t]of l){let i=u.has(n);if(!(t.selected===void 0&&!i)&&t.selected!==i){if(r)t.selected=i;f.push(y0(t.id,i))}}return f}function Dq({items:l=[],lookup:u}){let r=[],f=new Map(l.map((n)=>[n.id,n]));for(let[n,t]of l.entries()){let i=u.get(t.id),y=i?.internals?.userNode??i;if(y!==void 0&&y!==t)r.push({id:t.id,item:t,type:"replace"});if(y===void 0)r.push({item:t,type:"add",index:n})}for(let[n]of u)if(f.get(n)===void 0)r.push({id:n,type:"remove"});return r}function Vq(l){return{id:l.id,type:"remove"}}var Sq=(l)=>Xw(l),XV=(l)=>uF(l);function lL(l){return _l.forwardRef(l)}function Yq(l){let[u,r]=_l.useState(BigInt(0)),[f]=_l.useState(()=>PV(()=>r((n)=>n+BigInt(1))));return KF(()=>{let n=f.get();if(n.length)l(n),f.reset()},[u]),f}function PV(l){let u=[];return{get:()=>u,reset:()=>{u=[]},push:(r)=>{u.push(r),l()}}}var uL=_l.createContext(null);function CV({children:l}){let u=Vu(),r=_l.useCallback((y)=>{let{nodes:c=[],setNodes:_,hasDefaultNodes:A,onNodesChange:F,nodeLookup:j,fitViewQueued:N,onNodesChangeMiddlewareMap:U}=u.getState(),w=c;for(let J of y)w=typeof J==="function"?J(w):J;let G=Dq({items:w,lookup:j});for(let J of U.values())G=J(G);if(A)_(w);if(G.length>0)F?.(G);else if(N)window.requestAnimationFrame(()=>{let{fitViewQueued:J,nodes:Q,setNodes:m}=u.getState();if(J)m(Q)})},[]),f=Yq(r),n=_l.useCallback((y)=>{let{edges:c=[],setEdges:_,hasDefaultEdges:A,onEdgesChange:F,edgeLookup:j}=u.getState(),N=c;for(let U of y)N=typeof U==="function"?U(N):U;if(A)_(N);else if(F)F(Dq({items:N,lookup:j}))},[]),t=Yq(n),i=_l.useMemo(()=>({nodeQueue:f,edgeQueue:t}),[]);return il.jsx(uL.Provider,{value:i,children:l})}function hV(){let l=_l.useContext(uL);if(!l)throw Error("useBatchContext must be used within a BatchProvider");return l}var MV=(l)=>!!l.panZoom;function pF(){let l=DV(),u=Vu(),r=hV(),f=$u(MV),n=_l.useMemo(()=>{let t=(F)=>u.getState().nodeLookup.get(F),i=(F)=>{r.nodeQueue.push(F)},y=(F)=>{r.edgeQueue.push(F)},c=(F)=>{let{nodeLookup:j,nodeOrigin:N}=u.getState(),U=Sq(F)?F:j.get(F.id),w=U.parentId?$F(U.position,U.measured,U.parentId,j,N):U.position,G={...U,position:w,width:U.measured?.width??U.width,height:U.measured?.height??U.height};return i0(G)},_=(F,j,N={replace:!1})=>{i((U)=>U.map((w)=>{if(w.id===F){let G=typeof j==="function"?j(w):j;return N.replace&&Sq(G)?G:{...w,...G}}return w}))},A=(F,j,N={replace:!1})=>{y((U)=>U.map((w)=>{if(w.id===F){let G=typeof j==="function"?j(w):j;return N.replace&&XV(G)?G:{...w,...G}}return w}))};return{getNodes:()=>u.getState().nodes.map((F)=>({...F})),getNode:(F)=>t(F)?.internals.userNode,getInternalNode:t,getEdges:()=>{let{edges:F=[]}=u.getState();return F.map((j)=>({...j}))},getEdge:(F)=>u.getState().edgeLookup.get(F),setNodes:i,setEdges:y,addNodes:(F)=>{let j=Array.isArray(F)?F:[F];r.nodeQueue.push((N)=>[...N,...j])},addEdges:(F)=>{let j=Array.isArray(F)?F:[F];r.edgeQueue.push((N)=>[...N,...j])},toObject:()=>{let{nodes:F=[],edges:j=[],transform:N}=u.getState(),[U,w,G]=N;return{nodes:F.map((J)=>({...J})),edges:j.map((J)=>({...J})),viewport:{x:U,y:w,zoom:G}}},deleteElements:async({nodes:F=[],edges:j=[]})=>{let{nodes:N,edges:U,onNodesDelete:w,onEdgesDelete:G,triggerNodeChanges:J,triggerEdgeChanges:Q,onDelete:m,onBeforeDelete:q}=u.getState(),{nodes:W,edges:p}=await hw({nodesToRemove:F,edgesToRemove:j,nodes:N,edges:U,onBeforeDelete:q}),O=p.length>0,Z=W.length>0;if(O){let V=p.map(Vq);G?.(p),Q(V)}if(Z){let V=W.map(Vq);w?.(W),J(V)}if(Z||O)m?.({nodes:W,edges:p});return{deletedNodes:W,deletedEdges:p}},getIntersectingNodes:(F,j=!0,N)=>{let U=iF(F),w=U?F:c(F),G=N!==void 0;if(!w)return[];return(N||u.getState().nodes).filter((J)=>{let Q=u.getState().nodeLookup.get(J.id);if(Q&&!U&&(J.id===F.id||!Q.internals.positionAbsolute))return!1;let m=i0(G?J:Q),q=Vy(m,w);return j&&q>0||q>=m.width*m.height||q>=w.width*w.height})},isNodeIntersecting:(F,j,N=!0)=>{let w=iF(F)?F:c(F);if(!w)return!1;let G=Vy(w,j);return N&&G>0||G>=j.width*j.height||G>=w.width*w.height},updateNode:_,updateNodeData:(F,j,N={replace:!1})=>{_(F,(U)=>{let w=typeof j==="function"?j(U):j;return N.replace?{...U,data:w}:{...U,data:{...U.data,...w}}},N)},updateEdge:A,updateEdgeData:(F,j,N={replace:!1})=>{A(F,(U)=>{let w=typeof j==="function"?j(U):j;return N.replace?{...U,data:w}:{...U,data:{...U.data,...w}}},N)},getNodesBounds:(F)=>{let{nodeLookup:j,nodeOrigin:N}=u.getState();return fF(F,{nodeLookup:j,nodeOrigin:N})},getHandleConnections:({type:F,id:j,nodeId:N})=>Array.from(u.getState().connectionLookup.get(`${N}-${F}${j?`-${j}`:""}`)?.values()??[]),getNodeConnections:({type:F,handleId:j,nodeId:N})=>Array.from(u.getState().connectionLookup.get(`${N}${F?j?`-${F}-${j}`:`-${F}`:""}`)?.values()??[]),fitView:async(F)=>{let j=u.getState().fitViewResolver??Rw();return u.setState({fitViewQueued:!0,fitViewOptions:F,fitViewResolver:j}),r.nodeQueue.push((N)=>[...N]),j.promise}}},[]);return _l.useMemo(()=>{return{...n,...l,viewportInitialized:f}},[f])}var Xq=(l)=>l.selected,sV=typeof window<"u"?window:void 0;function RV({deleteKeyCode:l,multiSelectionKeyCode:u}){let r=Vu(),{deleteElements:f}=pF(),n=c$(l,{actInsideInputWithModifier:!1}),t=c$(u,{target:sV});_l.useEffect(()=>{if(n){let{edges:i,nodes:y}=r.getState();f({nodes:y.filter(Xq),edges:i.filter(Xq)}),r.setState({nodesSelectionActive:!1})}},[n]),_l.useEffect(()=>{r.setState({multiSelectionActive:t})},[t])}function xV(l){let u=Vu();_l.useEffect(()=>{let r=()=>{if(!l.current||!(l.current.checkVisibility?.()??!0))return!1;let f=sA(l.current);if(f.height===0||f.width===0)u.getState().onError?.("004",mf.error004());u.setState({width:f.width||500,height:f.height||500})};if(l.current){r(),window.addEventListener("resize",r);let f=new ResizeObserver(()=>r());return f.observe(l.current),()=>{if(window.removeEventListener("resize",r),f&&l.current)f.unobserve(l.current)}}},[])}var f8={position:"absolute",width:"100%",height:"100%",top:0,left:0},bV=(l)=>({userSelectionActive:l.userSelectionActive,lib:l.lib,connectionInProgress:l.connection.inProgress});function vV({onPaneContextMenu:l,zoomOnScroll:u=!0,zoomOnPinch:r=!0,panOnScroll:f=!1,panOnScrollSpeed:n=0.5,panOnScrollMode:t=it.Free,zoomOnDoubleClick:i=!0,panOnDrag:y=!0,defaultViewport:c,translateExtent:_,minZoom:A,maxZoom:F,zoomActivationKeyCode:j,preventScrolling:N=!0,children:U,noWheelClassName:w,noPanClassName:G,onViewportChange:J,isControlledViewport:Q,paneClickDistance:m,selectionOnDrag:q}){let W=Vu(),p=_l.useRef(null),{userSelectionActive:O,lib:Z,connectionInProgress:V}=$u(bV,zu),P=c$(j),H=_l.useRef();xV(p);let B=_l.useCallback((C)=>{if(J?.({x:C[0],y:C[1],zoom:C[2]}),!Q)W.setState({transform:C})},[J,Q]);return _l.useEffect(()=>{if(p.current){H.current=$q({domNode:p.current,minZoom:A,maxZoom:F,translateExtent:_,viewport:c,onDraggingChange:(Y)=>W.setState((v)=>v.paneDragging===Y?v:{paneDragging:Y}),onPanZoomStart:(Y,v)=>{let{onViewportChangeStart:K,onMoveStart:X}=W.getState();X?.(Y,v),K?.(v)},onPanZoom:(Y,v)=>{let{onViewportChange:K,onMove:X}=W.getState();X?.(Y,v),K?.(v)},onPanZoomEnd:(Y,v)=>{let{onViewportChangeEnd:K,onMoveEnd:X}=W.getState();X?.(Y,v),K?.(v)}});let{x:C,y:E,zoom:D}=H.current.getViewport();return W.setState({panZoom:H.current,transform:[C,E,D],domNode:p.current.closest(".react-flow")}),()=>{H.current?.destroy()}}},[]),_l.useEffect(()=>{H.current?.update({onPaneContextMenu:l,zoomOnScroll:u,zoomOnPinch:r,panOnScroll:f,panOnScrollSpeed:n,panOnScrollMode:t,zoomOnDoubleClick:i,panOnDrag:y,zoomActivationKeyPressed:P,preventScrolling:N,noPanClassName:G,userSelectionActive:O,noWheelClassName:w,lib:Z,onTransformChange:B,connectionInProgress:V,selectionOnDrag:q,paneClickDistance:m})},[l,u,r,f,n,t,i,y,P,N,G,O,w,Z,B,V,q,m]),il.jsx("div",{className:"react-flow__renderer",ref:p,style:f8,children:U})}var gV=(l)=>({userSelectionActive:l.userSelectionActive,userSelectionRect:l.userSelectionRect});function kV(){let{userSelectionActive:l,userSelectionRect:u}=$u(gV,zu);if(!(l&&u))return null;return il.jsx("div",{className:"react-flow__selection react-flow__container",style:{width:u.width,height:u.height,transform:`translate(${u.x}px, ${u.y}px)`}})}var WF=(l,u)=>{return(r)=>{if(r.target!==u.current)return;l?.(r)}},IV=(l)=>({userSelectionActive:l.userSelectionActive,elementsSelectable:l.elementsSelectable,connectionInProgress:l.connection.inProgress,dragging:l.paneDragging});function aV({isSelecting:l,selectionKeyPressed:u,selectionMode:r=n0.Full,panOnDrag:f,paneClickDistance:n,selectionOnDrag:t,onSelectionStart:i,onSelectionEnd:y,onPaneClick:c,onPaneContextMenu:_,onPaneScroll:A,onPaneMouseEnter:F,onPaneMouseMove:j,onPaneMouseLeave:N,children:U}){let w=Vu(),{userSelectionActive:G,elementsSelectable:J,dragging:Q,connectionInProgress:m}=$u(IV,zu),q=J&&(l||G),W=_l.useRef(null),p=_l.useRef(),O=_l.useRef(new Set),Z=_l.useRef(new Set),V=_l.useRef(!1),P=(K)=>{if(V.current||m){V.current=!1;return}c?.(K),w.getState().resetSelectedElements(),w.setState({nodesSelectionActive:!1})},H=(K)=>{if(Array.isArray(f)&&f?.includes(2)){K.preventDefault();return}_?.(K)},B=A?(K)=>A(K):void 0,C=(K)=>{if(V.current)K.stopPropagation(),V.current=!1},E=(K)=>{let{domNode:X}=w.getState();if(p.current=X?.getBoundingClientRect(),!p.current)return;let I=K.target===W.current;if(!I&&!!K.target.closest(".nokey")||!l||!(t&&I||u)||K.button!==0||!K.isPrimary)return;K.target?.setPointerCapture?.(K.pointerId),V.current=!1;let{x:yl,y:h}=Sf(K.nativeEvent,p.current);if(w.setState({userSelectionRect:{width:0,height:0,startX:yl,startY:h,x:yl,y:h}}),!I)K.stopPropagation(),K.preventDefault()},D=(K)=>{let{userSelectionRect:X,transform:I,nodeLookup:o,edgeLookup:fl,connectionLookup:yl,triggerNodeChanges:h,triggerEdgeChanges:s,defaultEdgeOptions:ul,resetSelectedElements:tl}=w.getState();if(!p.current||!X)return;let{x:Al,y:Kl}=Sf(K.nativeEvent,p.current),{startX:wl,startY:El}=X;if(!V.current){let g=u?0:n;if(Math.hypot(Al-wl,Kl-El)<=g)return;tl(),i?.(K)}V.current=!0;let M={startX:wl,startY:El,x:Alg.id)),Z.current=new Set;let k=ul?.selectable??!0;for(let g of O.current){let cl=yl.get(g);if(!cl)continue;for(let{edgeId:pl}of cl.values()){let Hl=fl.get(pl);if(Hl&&(Hl.selectable??k))Z.current.add(pl)}}if(!_F(d,O.current)){let g=Cy(o,O.current,!0);h(g)}if(!_F(nl,Z.current)){let g=Cy(fl,Z.current);s(g)}w.setState({userSelectionRect:M,userSelectionActive:!0,nodesSelectionActive:!1})},Y=(K)=>{if(K.button!==0)return;if(K.target?.releasePointerCapture?.(K.pointerId),!G&&K.target===W.current&&w.getState().userSelectionRect)P?.(K);if(w.setState({userSelectionActive:!1,userSelectionRect:null}),V.current)y?.(K),w.setState({nodesSelectionActive:O.current.size>0})},v=f===!0||Array.isArray(f)&&f.includes(0);return il.jsxs("div",{className:bu(["react-flow__pane",{draggable:v,dragging:Q,selection:l}]),onClick:q?void 0:WF(P,W),onContextMenu:WF(H,W),onWheel:WF(B,W),onPointerEnter:q?void 0:F,onPointerMove:q?D:j,onPointerUp:q?Y:void 0,onPointerDownCapture:q?E:void 0,onClickCapture:q?C:void 0,onPointerLeave:N,ref:W,style:f8,children:[U,il.jsx(kV,{})]})}function EF({id:l,store:u,unselect:r=!1,nodeRef:f}){let{addSelectedNodes:n,unselectNodesAndEdges:t,multiSelectionActive:i,nodeLookup:y,onError:c}=u.getState(),_=y.get(l);if(!_){c?.("012",mf.error012(l));return}if(u.setState({nodesSelectionActive:!1}),!_.selected)n([l]);else if(r||_.selected&&i)t({nodes:[_],edges:[]}),requestAnimationFrame(()=>f?.current?.blur())}function rL({nodeRef:l,disabled:u=!1,noDragClassName:r,handleSelector:f,nodeId:n,isSelectable:t,nodeClickDistance:i}){let y=Vu(),[c,_]=_l.useState(!1),A=_l.useRef();return _l.useEffect(()=>{A.current=uq({getStoreItems:()=>y.getState(),onNodeMouseDown:(F)=>{EF({id:F,store:y,nodeRef:l})},onDragStart:()=>{_(!0)},onDragStop:()=>{_(!1)}})},[]),_l.useEffect(()=>{if(u||!l.current||!A.current)return;return A.current.update({noDragClassName:r,handleSelector:f,domNode:l.current,isSelectable:t,nodeId:n,nodeClickDistance:i}),()=>{A.current?.destroy()}},[r,f,u,t,l,n,i]),c}var oV=(l)=>(u)=>u.selected&&(u.draggable||l&&typeof u.draggable>"u");function fL(){let l=Vu();return _l.useCallback((r)=>{let{nodeExtent:f,snapToGrid:n,snapGrid:t,nodesDraggable:i,onError:y,updateNodePositions:c,nodeLookup:_,nodeOrigin:A}=l.getState(),F=new Map,j=oV(i),N=n?t[0]:5,U=n?t[1]:5,w=r.direction.x*N*r.factor,G=r.direction.y*U*r.factor;for(let[,J]of _){if(!j(J))continue;let Q={x:J.internals.positionAbsolute.x+w,y:J.internals.positionAbsolute.y+G};if(n)Q=Sy(Q,t);let{position:m,positionAbsolute:q}=nF({nodeId:J.id,nextPosition:Q,nodeLookup:_,nodeExtent:f,nodeOrigin:A,onError:y});J.position=m,J.internals.positionAbsolute=q,F.set(J.id,J)}c(F)},[])}var zF=_l.createContext(null),dV=zF.Provider;zF.Consumer;var nL=()=>{return _l.useContext(zF)},eV=(l)=>({connectOnClick:l.connectOnClick,noPanClassName:l.noPanClassName,rfId:l.rfId}),lS=(l,u,r)=>(f)=>{let{connectionClickStartHandle:n,connectionMode:t,connection:i}=f,{fromHandle:y,toHandle:c,isValid:_}=i,A=c?.nodeId===l&&c?.id===u&&c?.type===r;return{connectingFrom:y?.nodeId===l&&y?.id===u&&y?.type===r,connectingTo:A,clickConnecting:n?.nodeId===l&&n?.id===u&&n?.type===r,isPossibleEndHandle:t===ui.Strict?y?.type!==r:l!==y?.nodeId||u!==y?.id,connectionInProcess:!!y,clickConnectionInProcess:!!n,valid:A&&_}};function uS({type:l="source",position:u=Ol.Top,isValidConnection:r,isConnectable:f=!0,isConnectableStart:n=!0,isConnectableEnd:t=!0,id:i,onConnect:y,children:c,className:_,onMouseDown:A,onTouchStart:F,...j},N){let U=i||null,w=l==="target",G=Vu(),J=nL(),{connectOnClick:Q,noPanClassName:m,rfId:q}=$u(eV,zu),{connectingFrom:W,connectingTo:p,clickConnecting:O,isPossibleEndHandle:Z,connectionInProcess:V,clickConnectionInProcess:P,valid:H}=$u(lS(J,U,l),zu);if(!J)G.getState().onError?.("010",mf.error010());let B=(D)=>{let{defaultEdgeOptions:Y,onConnect:v,hasDefaultEdges:K}=G.getState(),X={...Y,...D};if(K){let{edges:I,setEdges:o}=G.getState();o(JF(X,I))}v?.(X),y?.(X)},C=(D)=>{if(!J)return;let Y=jF(D.nativeEvent);if(n&&(Y&&D.button===0||!Y)){let v=G.getState();IA.onPointerDown(D.nativeEvent,{handleDomNode:D.currentTarget,autoPanOnConnect:v.autoPanOnConnect,connectionMode:v.connectionMode,connectionRadius:v.connectionRadius,domNode:v.domNode,nodeLookup:v.nodeLookup,lib:v.lib,isTarget:w,handleId:U,nodeId:J,flowId:v.rfId,panBy:v.panBy,cancelConnection:v.cancelConnection,onConnectStart:v.onConnectStart,onConnectEnd:(...K)=>G.getState().onConnectEnd?.(...K),updateConnection:v.updateConnection,onConnect:B,isValidConnection:r||((...K)=>G.getState().isValidConnection?.(...K)??!0),getTransform:()=>G.getState().transform,getFromHandle:()=>G.getState().connection.fromHandle,autoPanSpeed:v.autoPanSpeed,dragThreshold:v.connectionDragThreshold})}if(Y)A?.(D);else F?.(D)},E=(D)=>{let{onClickConnectStart:Y,onClickConnectEnd:v,connectionClickStartHandle:K,connectionMode:X,isValidConnection:I,lib:o,rfId:fl,nodeLookup:yl,connection:h}=G.getState();if(!J||!K&&!n)return;if(!K){Y?.(D.nativeEvent,{nodeId:J,handleId:U,handleType:l}),G.setState({connectionClickStartHandle:{nodeId:J,type:l,id:U}});return}let s=AF(D.target),ul=r||I,{connection:tl,isValid:Al}=IA.isValid(D.nativeEvent,{handle:{nodeId:J,id:U,type:l},connectionMode:X,fromNodeId:K.nodeId,fromHandleId:K.id||null,fromType:K.type,isValidConnection:ul,flowId:fl,doc:s,lib:o,nodeLookup:yl});if(Al&&tl)B(tl);let Kl=structuredClone(h);delete Kl.inProgress,Kl.toPosition=Kl.toHandle?Kl.toHandle.position:null,v?.(D,Kl),G.setState({connectionClickStartHandle:null})};return il.jsx("div",{"data-handleid":U,"data-nodeid":J,"data-handlepos":u,"data-id":`${q}-${J}-${U}-${l}`,className:bu(["react-flow__handle",`react-flow__handle-${u}`,"nodrag",m,_,{source:!w,target:w,connectable:f,connectablestart:n,connectableend:t,clickconnecting:O,connectingfrom:W,connectingto:p,valid:H,connectionindicator:f&&(!V||Z)&&(V||P?t:n)}]),onMouseDown:C,onTouchStart:C,onClick:Q?E:void 0,ref:N,...j,children:c})}var c0=_l.memo(lL(uS));function rS({data:l,isConnectable:u,sourcePosition:r=Ol.Bottom}){return il.jsxs(il.Fragment,{children:[l?.label,il.jsx(c0,{type:"source",position:r,isConnectable:u})]})}function fS({data:l,isConnectable:u,targetPosition:r=Ol.Top,sourcePosition:f=Ol.Bottom}){return il.jsxs(il.Fragment,{children:[il.jsx(c0,{type:"target",position:r,isConnectable:u}),l?.label,il.jsx(c0,{type:"source",position:f,isConnectable:u})]})}function nS(){return null}function tS({data:l,isConnectable:u,targetPosition:r=Ol.Top}){return il.jsxs(il.Fragment,{children:[il.jsx(c0,{type:"target",position:r,isConnectable:u}),l?.label]})}var l8={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}},Pq={input:rS,default:fS,output:tS,group:nS};function iS(l){if(l.internals.handleBounds===void 0)return{width:l.width??l.initialWidth??l.style?.width,height:l.height??l.initialHeight??l.style?.height};return{width:l.width??l.style?.width,height:l.height??l.style?.height}}var yS=(l)=>{let{width:u,height:r,x:f,y:n}=Dy(l.nodeLookup,{filter:(t)=>!!t.selected});return{width:Vf(u)?u:null,height:Vf(r)?r:null,userSelectionActive:l.userSelectionActive,transformString:`translate(${l.transform[0]}px,${l.transform[1]}px) scale(${l.transform[2]}) translate(${f}px,${n}px)`}};function cS({onSelectionContextMenu:l,noPanClassName:u,disableKeyboardA11y:r}){let f=Vu(),{width:n,height:t,transformString:i,userSelectionActive:y}=$u(yS,zu),c=fL(),_=_l.useRef(null);_l.useEffect(()=>{if(!r)_.current?.focus({preventScroll:!0})},[r]);let A=!y&&n!==null&&t!==null;if(rL({nodeRef:_,disabled:!A}),!A)return null;let F=l?(N)=>{let U=f.getState().nodes.filter((w)=>w.selected);l(N,U)}:void 0,j=(N)=>{if(Object.prototype.hasOwnProperty.call(l8,N.key))N.preventDefault(),c({direction:l8[N.key],factor:N.shiftKey?4:1})};return il.jsx("div",{className:bu(["react-flow__nodesselection","react-flow__container",u]),style:{transform:i},children:il.jsx("div",{ref:_,className:"react-flow__nodesselection-rect",onContextMenu:F,tabIndex:r?void 0:-1,onKeyDown:r?void 0:j,style:{width:n,height:t}})})}var Cq=typeof window<"u"?window:void 0,$S=(l)=>{return{nodesSelectionActive:l.nodesSelectionActive,userSelectionActive:l.userSelectionActive}};function tL({children:l,onPaneClick:u,onPaneMouseEnter:r,onPaneMouseMove:f,onPaneMouseLeave:n,onPaneContextMenu:t,onPaneScroll:i,paneClickDistance:y,deleteKeyCode:c,selectionKeyCode:_,selectionOnDrag:A,selectionMode:F,onSelectionStart:j,onSelectionEnd:N,multiSelectionKeyCode:U,panActivationKeyCode:w,zoomActivationKeyCode:G,elementsSelectable:J,zoomOnScroll:Q,zoomOnPinch:m,panOnScroll:q,panOnScrollSpeed:W,panOnScrollMode:p,zoomOnDoubleClick:O,panOnDrag:Z,defaultViewport:V,translateExtent:P,minZoom:H,maxZoom:B,preventScrolling:C,onSelectionContextMenu:E,noWheelClassName:D,noPanClassName:Y,disableKeyboardA11y:v,onViewportChange:K,isControlledViewport:X}){let{nodesSelectionActive:I,userSelectionActive:o}=$u($S,zu),fl=c$(_,{target:Cq}),yl=c$(w,{target:Cq}),h=yl||Z,s=yl||q,ul=A&&h!==!0,tl=fl||o||ul;return RV({deleteKeyCode:c,multiSelectionKeyCode:U}),il.jsx(vV,{onPaneContextMenu:t,elementsSelectable:J,zoomOnScroll:Q,zoomOnPinch:m,panOnScroll:s,panOnScrollSpeed:W,panOnScrollMode:p,zoomOnDoubleClick:O,panOnDrag:!fl&&h,defaultViewport:V,translateExtent:P,minZoom:H,maxZoom:B,zoomActivationKeyCode:G,preventScrolling:C,noWheelClassName:D,noPanClassName:Y,onViewportChange:K,isControlledViewport:X,paneClickDistance:y,selectionOnDrag:ul,children:il.jsxs(aV,{onSelectionStart:j,onSelectionEnd:N,onPaneClick:u,onPaneMouseEnter:r,onPaneMouseMove:f,onPaneMouseLeave:n,onPaneContextMenu:t,onPaneScroll:i,panOnDrag:h,isSelecting:!!tl,selectionMode:F,selectionKeyPressed:fl,paneClickDistance:y,selectionOnDrag:ul,children:[l,I&&il.jsx(cS,{onSelectionContextMenu:E,noPanClassName:Y,disableKeyboardA11y:v})]})})}tL.displayName="FlowRenderer";var _S=_l.memo(tL),AS=(l)=>(u)=>{return l?CA(u.nodeLookup,{x:0,y:0,width:u.width,height:u.height},u.transform,!0).map((r)=>r.id):Array.from(u.nodeLookup.keys())};function FS(l){return $u(_l.useCallback(AS(l),[l]),zu)}var jS=(l)=>l.updateNodeInternals;function NS(){let l=$u(jS),[u]=_l.useState(()=>{if(typeof ResizeObserver>"u")return null;return new ResizeObserver((r)=>{let f=new Map;r.forEach((n)=>{let t=n.target.getAttribute("data-id");f.set(t,{id:t,nodeElement:n.target,force:!0})}),l(f)})});return _l.useEffect(()=>{return()=>{u?.disconnect()}},[u]),u}function JS({node:l,nodeType:u,hasDimensions:r,resizeObserver:f}){let n=Vu(),t=_l.useRef(null),i=_l.useRef(null),y=_l.useRef(l.sourcePosition),c=_l.useRef(l.targetPosition),_=_l.useRef(u),A=r&&!!l.internals.handleBounds;return _l.useEffect(()=>{if(t.current&&!l.hidden&&(!A||i.current!==t.current)){if(i.current)f?.unobserve(i.current);f?.observe(t.current),i.current=t.current}},[A,l.hidden]),_l.useEffect(()=>{return()=>{if(i.current)f?.unobserve(i.current),i.current=null}},[]),_l.useEffect(()=>{if(t.current){let F=_.current!==u,j=y.current!==l.sourcePosition,N=c.current!==l.targetPosition;if(F||j||N)_.current=u,y.current=l.sourcePosition,c.current=l.targetPosition,n.getState().updateNodeInternals(new Map([[l.id,{id:l.id,nodeElement:t.current,force:!0}]]))}},[l.id,u,l.sourcePosition,l.targetPosition]),t}function US({id:l,onClick:u,onMouseEnter:r,onMouseMove:f,onMouseLeave:n,onContextMenu:t,onDoubleClick:i,nodesDraggable:y,elementsSelectable:c,nodesConnectable:_,nodesFocusable:A,resizeObserver:F,noDragClassName:j,noPanClassName:N,disableKeyboardA11y:U,rfId:w,nodeTypes:G,nodeClickDistance:J,onError:Q}){let{node:m,internals:q,isParent:W}=$u((Al)=>{let Kl=Al.nodeLookup.get(l),wl=Al.parentLookup.has(l);return{node:Kl,internals:Kl.internals,isParent:wl}},zu),p=m.type||"default",O=G?.[p]||Pq[p];if(O===void 0)Q?.("003",mf.error003(p)),p="default",O=G?.default||Pq.default;let Z=!!(m.draggable||y&&typeof m.draggable>"u"),V=!!(m.selectable||c&&typeof m.selectable>"u"),P=!!(m.connectable||_&&typeof m.connectable>"u"),H=!!(m.focusable||A&&typeof m.focusable>"u"),B=Vu(),C=cF(m),E=JS({node:m,nodeType:p,hasDimensions:C,resizeObserver:F}),D=rL({nodeRef:E,disabled:m.hidden||!Z,noDragClassName:j,handleSelector:m.dragHandle,nodeId:l,isSelectable:V,nodeClickDistance:J}),Y=fL();if(m.hidden)return null;let v=zn(m),K=iS(m),X=V||Z||u||r||f||n,I=r?(Al)=>r(Al,{...q.userNode}):void 0,o=f?(Al)=>f(Al,{...q.userNode}):void 0,fl=n?(Al)=>n(Al,{...q.userNode}):void 0,yl=t?(Al)=>t(Al,{...q.userNode}):void 0,h=i?(Al)=>i(Al,{...q.userNode}):void 0,s=(Al)=>{let{selectNodesOnDrag:Kl,nodeDragThreshold:wl}=B.getState();if(V&&(!Kl||!Z||wl>0))EF({id:l,store:B,nodeRef:E});if(u)u(Al,{...q.userNode})},ul=(Al)=>{if(FF(Al.nativeEvent)||U)return;if(o9.includes(Al.key)&&V){let Kl=Al.key==="Escape";EF({id:l,store:B,unselect:Kl,nodeRef:E})}else if(Z&&m.selected&&Object.prototype.hasOwnProperty.call(l8,Al.key)){Al.preventDefault();let{ariaLabelConfig:Kl}=B.getState();B.setState({ariaLiveMessage:Kl["node.a11yDescription.ariaLiveMessage"]({direction:Al.key.replace("Arrow","").toLowerCase(),x:~~q.positionAbsolute.x,y:~~q.positionAbsolute.y})}),Y({direction:l8[Al.key],factor:Al.shiftKey?4:1})}},tl=()=>{if(U||!E.current?.matches(":focus-visible"))return;let{transform:Al,width:Kl,height:wl,autoPanOnNodeFocus:El,setCenter:M}=B.getState();if(!El)return;if(!(CA(new Map([[l,m]]),{x:0,y:0,width:Kl,height:wl},Al,!0).length>0))M(m.position.x+v.width/2,m.position.y+v.height/2,{zoom:Al[2]})};return il.jsx("div",{className:bu(["react-flow__node",`react-flow__node-${p}`,{[N]:Z},m.className,{selected:m.selected,selectable:V,parent:W,draggable:Z,dragging:D}]),ref:E,style:{zIndex:q.z,transform:`translate(${q.positionAbsolute.x}px,${q.positionAbsolute.y}px)`,pointerEvents:X?"all":"none",visibility:C?"visible":"hidden",...m.style,...K},"data-id":l,"data-testid":`rf__node-${l}`,onMouseEnter:I,onMouseMove:o,onMouseLeave:fl,onContextMenu:yl,onClick:s,onDoubleClick:h,onKeyDown:H?ul:void 0,tabIndex:H?0:void 0,onFocus:H?tl:void 0,role:m.ariaRole??(H?"group":void 0),"aria-roledescription":"node","aria-describedby":U?void 0:`${aq}-${w}`,"aria-label":m.ariaLabel,...m.domAttributes,children:il.jsx(dV,{value:l,children:il.jsx(O,{id:l,data:m.data,type:p,positionAbsoluteX:q.positionAbsolute.x,positionAbsoluteY:q.positionAbsolute.y,selected:m.selected??!1,selectable:V,draggable:Z,deletable:m.deletable??!0,isConnectable:P,sourcePosition:m.sourcePosition,targetPosition:m.targetPosition,dragging:D,dragHandle:m.dragHandle,zIndex:q.z,parentId:m.parentId,...v})})})}var QS=_l.memo(US),mS=(l)=>({nodesDraggable:l.nodesDraggable,nodesConnectable:l.nodesConnectable,nodesFocusable:l.nodesFocusable,elementsSelectable:l.elementsSelectable,onError:l.onError});function iL(l){let{nodesDraggable:u,nodesConnectable:r,nodesFocusable:f,elementsSelectable:n,onError:t}=$u(mS,zu),i=FS(l.onlyRenderVisibleElements),y=NS();return il.jsx("div",{className:"react-flow__nodes",style:f8,children:i.map((c)=>{return il.jsx(QS,{id:c,nodeTypes:l.nodeTypes,nodeExtent:l.nodeExtent,onClick:l.onNodeClick,onMouseEnter:l.onNodeMouseEnter,onMouseMove:l.onNodeMouseMove,onMouseLeave:l.onNodeMouseLeave,onContextMenu:l.onNodeContextMenu,onDoubleClick:l.onNodeDoubleClick,noDragClassName:l.noDragClassName,noPanClassName:l.noPanClassName,rfId:l.rfId,disableKeyboardA11y:l.disableKeyboardA11y,resizeObserver:y,nodesDraggable:u,nodesConnectable:r,nodesFocusable:f,elementsSelectable:n,nodeClickDistance:l.nodeClickDistance,onError:t},c)})})}iL.displayName="NodeRenderer";var wS=_l.memo(iL);function qS(l){return $u(_l.useCallback((r)=>{if(!l)return r.edges.map((n)=>n.id);let f=[];if(r.width&&r.height)for(let n of r.edges){let t=r.nodeLookup.get(n.source),i=r.nodeLookup.get(n.target);if(t&&i&&vw({sourceNode:t,targetNode:i,width:r.width,height:r.height,transform:r.transform}))f.push(n.id)}return f},[l]),zu)}var LS=({color:l="none",strokeWidth:u=1})=>{let r={strokeWidth:u,...l&&{stroke:l}};return il.jsx("polyline",{className:"arrow",style:r,strokeLinecap:"round",fill:"none",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4"})},GS=({color:l="none",strokeWidth:u=1})=>{let r={strokeWidth:u,...l&&{stroke:l,fill:l}};return il.jsx("polyline",{className:"arrowclosed",style:r,strokeLinecap:"round",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4 -5,-4"})},hq={[ri.Arrow]:LS,[ri.ArrowClosed]:GS};function WS(l){let u=Vu();return _l.useMemo(()=>{if(!Object.prototype.hasOwnProperty.call(hq,l))return u.getState().onError?.("009",mf.error009(l)),null;return hq[l]},[l])}var TS=({id:l,type:u,color:r,width:f=12.5,height:n=12.5,markerUnits:t="strokeWidth",strokeWidth:i,orient:y="auto-start-reverse"})=>{let c=WS(u);if(!c)return null;return il.jsx("marker",{className:"react-flow__arrowhead",id:l,markerWidth:`${f}`,markerHeight:`${n}`,viewBox:"-10 -10 20 20",markerUnits:t,orient:y,refX:"0",refY:"0",children:il.jsx(c,{color:r,strokeWidth:i})})},yL=({defaultColor:l,rfId:u})=>{let r=$u((t)=>t.edges),f=$u((t)=>t.defaultEdgeOptions),n=_l.useMemo(()=>{return kw(r,{id:u,defaultColor:l,defaultMarkerStart:f?.markerStart,defaultMarkerEnd:f?.markerEnd})},[r,f,u,l]);if(!n.length)return null;return il.jsx("svg",{className:"react-flow__marker","aria-hidden":"true",children:il.jsx("defs",{children:n.map((t)=>il.jsx(TS,{id:t.id,type:t.type,color:t.color,width:t.width,height:t.height,markerUnits:t.markerUnits,strokeWidth:t.strokeWidth,orient:t.orient},t.id))})})};yL.displayName="MarkerDefinitions";var KS=_l.memo(yL);function cL({x:l,y:u,label:r,labelStyle:f,labelShowBg:n=!0,labelBgStyle:t,labelBgPadding:i=[2,4],labelBgBorderRadius:y=2,children:c,className:_,...A}){let[F,j]=_l.useState({x:1,y:0,width:0,height:0}),N=bu(["react-flow__edge-textwrapper",_]),U=_l.useRef(null);if(_l.useEffect(()=>{if(U.current){let w=U.current.getBBox();j({x:w.x,y:w.y,width:w.width,height:w.height})}},[r]),!r)return null;return il.jsxs("g",{transform:`translate(${l-F.width/2} ${u-F.height/2})`,className:N,visibility:F.width?"visible":"hidden",...A,children:[n&&il.jsx("rect",{width:F.width+2*i[0],x:-i[0],y:-i[1],height:F.height+2*i[1],className:"react-flow__edge-textbg",style:t,rx:y,ry:y}),il.jsx("text",{className:"react-flow__edge-text",y:F.height/2,dy:"0.3em",ref:U,style:f,children:r}),c]})}cL.displayName="EdgeText";var ES=_l.memo(cL);function hy({path:l,labelX:u,labelY:r,label:f,labelStyle:n,labelShowBg:t,labelBgStyle:i,labelBgPadding:y,labelBgBorderRadius:c,interactionWidth:_=20,...A}){return il.jsxs(il.Fragment,{children:[il.jsx("path",{...A,d:l,fill:"none",className:bu(["react-flow__edge-path",A.className])}),_?il.jsx("path",{d:l,fill:"none",strokeOpacity:0,strokeWidth:_,className:"react-flow__edge-interaction"}):null,f&&Vf(u)&&Vf(r)?il.jsx(ES,{x:u,y:r,label:f,labelStyle:n,labelShowBg:t,labelBgStyle:i,labelBgPadding:y,labelBgBorderRadius:c}):null]})}function Mq({pos:l,x1:u,y1:r,x2:f,y2:n}){if(l===Ol.Left||l===Ol.Right)return[0.5*(u+f),r];return[u,0.5*(r+n)]}function $L({sourceX:l,sourceY:u,sourcePosition:r=Ol.Bottom,targetX:f,targetY:n,targetPosition:t=Ol.Top}){let[i,y]=Mq({pos:r,x1:l,y1:u,x2:f,y2:n}),[c,_]=Mq({pos:t,x1:f,y1:n,x2:l,y2:u}),[A,F,j,N]=RA({sourceX:l,sourceY:u,targetX:f,targetY:n,sourceControlX:i,sourceControlY:y,targetControlX:c,targetControlY:_});return[`M${l},${u} C${i},${y} ${c},${_} ${f},${n}`,A,F,j,N]}function _L(l){return _l.memo(({id:u,sourceX:r,sourceY:f,targetX:n,targetY:t,sourcePosition:i,targetPosition:y,label:c,labelStyle:_,labelShowBg:A,labelBgStyle:F,labelBgPadding:j,labelBgBorderRadius:N,style:U,markerEnd:w,markerStart:G,interactionWidth:J})=>{let[Q,m,q]=$L({sourceX:r,sourceY:f,sourcePosition:i,targetX:n,targetY:t,targetPosition:y}),W=l.isInternal?void 0:u;return il.jsx(hy,{id:W,path:Q,labelX:m,labelY:q,label:c,labelStyle:_,labelShowBg:A,labelBgStyle:F,labelBgPadding:j,labelBgBorderRadius:N,style:U,markerEnd:w,markerStart:G,interactionWidth:J})})}var pS=_L({isInternal:!1}),AL=_L({isInternal:!0});pS.displayName="SimpleBezierEdge";AL.displayName="SimpleBezierEdgeInternal";function FL(l){return _l.memo(({id:u,sourceX:r,sourceY:f,targetX:n,targetY:t,label:i,labelStyle:y,labelShowBg:c,labelBgStyle:_,labelBgPadding:A,labelBgBorderRadius:F,style:j,sourcePosition:N=Ol.Bottom,targetPosition:U=Ol.Top,markerEnd:w,markerStart:G,pathOptions:J,interactionWidth:Q})=>{let[m,q,W]=y$({sourceX:r,sourceY:f,sourcePosition:N,targetX:n,targetY:t,targetPosition:U,borderRadius:J?.borderRadius,offset:J?.offset,stepPosition:J?.stepPosition}),p=l.isInternal?void 0:u;return il.jsx(hy,{id:p,path:m,labelX:q,labelY:W,label:i,labelStyle:y,labelShowBg:c,labelBgStyle:_,labelBgPadding:A,labelBgBorderRadius:F,style:j,markerEnd:w,markerStart:G,interactionWidth:Q})})}var jL=FL({isInternal:!1}),NL=FL({isInternal:!0});jL.displayName="SmoothStepEdge";NL.displayName="SmoothStepEdgeInternal";function JL(l){return _l.memo(({id:u,...r})=>{let f=l.isInternal?void 0:u;return il.jsx(jL,{...r,id:f,pathOptions:_l.useMemo(()=>({borderRadius:0,offset:r.pathOptions?.offset}),[r.pathOptions?.offset])})})}var zS=JL({isInternal:!1}),UL=JL({isInternal:!0});zS.displayName="StepEdge";UL.displayName="StepEdgeInternal";function QL(l){return _l.memo(({id:u,sourceX:r,sourceY:f,targetX:n,targetY:t,label:i,labelStyle:y,labelShowBg:c,labelBgStyle:_,labelBgPadding:A,labelBgBorderRadius:F,style:j,markerEnd:N,markerStart:U,interactionWidth:w})=>{let[G,J,Q]=bA({sourceX:r,sourceY:f,targetX:n,targetY:t}),m=l.isInternal?void 0:u;return il.jsx(hy,{id:m,path:G,labelX:J,labelY:Q,label:i,labelStyle:y,labelShowBg:c,labelBgStyle:_,labelBgPadding:A,labelBgBorderRadius:F,style:j,markerEnd:N,markerStart:U,interactionWidth:w})})}var OS=QL({isInternal:!1}),mL=QL({isInternal:!0});OS.displayName="StraightEdge";mL.displayName="StraightEdgeInternal";function wL(l){return _l.memo(({id:u,sourceX:r,sourceY:f,targetX:n,targetY:t,sourcePosition:i=Ol.Bottom,targetPosition:y=Ol.Top,label:c,labelStyle:_,labelShowBg:A,labelBgStyle:F,labelBgPadding:j,labelBgBorderRadius:N,style:U,markerEnd:w,markerStart:G,pathOptions:J,interactionWidth:Q})=>{let[m,q,W]=xA({sourceX:r,sourceY:f,sourcePosition:i,targetX:n,targetY:t,targetPosition:y,curvature:J?.curvature}),p=l.isInternal?void 0:u;return il.jsx(hy,{id:p,path:m,labelX:q,labelY:W,label:c,labelStyle:_,labelShowBg:A,labelBgStyle:F,labelBgPadding:j,labelBgBorderRadius:N,style:U,markerEnd:w,markerStart:G,interactionWidth:Q})})}var ZS=wL({isInternal:!1}),qL=wL({isInternal:!0});ZS.displayName="BezierEdge";qL.displayName="BezierEdgeInternal";var sq={default:qL,straight:mL,step:UL,smoothstep:NL,simplebezier:AL},Rq={sourceX:null,sourceY:null,targetX:null,targetY:null,sourcePosition:null,targetPosition:null},HS=(l,u,r)=>{if(r===Ol.Left)return l-u;if(r===Ol.Right)return l+u;return l},BS=(l,u,r)=>{if(r===Ol.Top)return l-u;if(r===Ol.Bottom)return l+u;return l},xq="react-flow__edgeupdater";function bq({position:l,centerX:u,centerY:r,radius:f=10,onMouseDown:n,onMouseEnter:t,onMouseOut:i,type:y}){return il.jsx("circle",{onMouseDown:n,onMouseEnter:t,onMouseOut:i,className:bu([xq,`${xq}-${y}`]),cx:HS(u,f,l),cy:BS(r,f,l),r:f,stroke:"transparent",fill:"transparent"})}function DS({isReconnectable:l,reconnectRadius:u,edge:r,sourceX:f,sourceY:n,targetX:t,targetY:i,sourcePosition:y,targetPosition:c,onReconnect:_,onReconnectStart:A,onReconnectEnd:F,setReconnecting:j,setUpdateHover:N}){let U=Vu(),w=(q,W)=>{if(q.button!==0)return;let{autoPanOnConnect:p,domNode:O,connectionMode:Z,connectionRadius:V,lib:P,onConnectStart:H,cancelConnection:B,nodeLookup:C,rfId:E,panBy:D,updateConnection:Y}=U.getState(),v=W.type==="target",K=(o,fl)=>{j(!1),F?.(o,r,W.type,fl)},X=(o)=>_?.(r,o),I=(o,fl)=>{j(!0),A?.(q,r,W.type),H?.(o,fl)};IA.onPointerDown(q.nativeEvent,{autoPanOnConnect:p,connectionMode:Z,connectionRadius:V,domNode:O,handleId:W.id,nodeId:W.nodeId,nodeLookup:C,isTarget:v,edgeUpdaterType:W.type,lib:P,flowId:E,cancelConnection:B,panBy:D,isValidConnection:(...o)=>U.getState().isValidConnection?.(...o)??!0,onConnect:X,onConnectStart:I,onConnectEnd:(...o)=>U.getState().onConnectEnd?.(...o),onReconnectEnd:K,updateConnection:Y,getTransform:()=>U.getState().transform,getFromHandle:()=>U.getState().connection.fromHandle,dragThreshold:U.getState().connectionDragThreshold,handleDomNode:q.currentTarget})},G=(q)=>w(q,{nodeId:r.target,id:r.targetHandle??null,type:"target"}),J=(q)=>w(q,{nodeId:r.source,id:r.sourceHandle??null,type:"source"}),Q=()=>N(!0),m=()=>N(!1);return il.jsxs(il.Fragment,{children:[(l===!0||l==="source")&&il.jsx(bq,{position:y,centerX:f,centerY:n,radius:u,onMouseDown:G,onMouseEnter:Q,onMouseOut:m,type:"source"}),(l===!0||l==="target")&&il.jsx(bq,{position:c,centerX:t,centerY:i,radius:u,onMouseDown:J,onMouseEnter:Q,onMouseOut:m,type:"target"})]})}function VS({id:l,edgesFocusable:u,edgesReconnectable:r,elementsSelectable:f,onClick:n,onDoubleClick:t,onContextMenu:i,onMouseEnter:y,onMouseMove:c,onMouseLeave:_,reconnectRadius:A,onReconnect:F,onReconnectStart:j,onReconnectEnd:N,rfId:U,edgeTypes:w,noPanClassName:G,onError:J,disableKeyboardA11y:Q}){let m=$u((M)=>M.edgeLookup.get(l)),q=$u((M)=>M.defaultEdgeOptions);m=q?{...q,...m}:m;let W=m.type||"default",p=w?.[W]||sq[W];if(p===void 0)J?.("011",mf.error011(W)),W="default",p=w?.default||sq.default;let O=!!(m.focusable||u&&typeof m.focusable>"u"),Z=typeof F<"u"&&(m.reconnectable||r&&typeof m.reconnectable>"u"),V=!!(m.selectable||f&&typeof m.selectable>"u"),P=_l.useRef(null),[H,B]=_l.useState(!1),[C,E]=_l.useState(!1),D=Vu(),{zIndex:Y,sourceX:v,sourceY:K,targetX:X,targetY:I,sourcePosition:o,targetPosition:fl}=$u(_l.useCallback((M)=>{let d=M.nodeLookup.get(m.source),nl=M.nodeLookup.get(m.target);if(!d||!nl)return{zIndex:m.zIndex,...Rq};let k=gw({id:l,sourceNode:d,targetNode:nl,sourceHandle:m.sourceHandle||null,targetHandle:m.targetHandle||null,connectionMode:M.connectionMode,onError:J});return{zIndex:bw({selected:m.selected,zIndex:m.zIndex,sourceNode:d,targetNode:nl,elevateOnSelect:M.elevateEdgesOnSelect,zIndexMode:M.zIndexMode}),...k||Rq}},[m.source,m.target,m.sourceHandle,m.targetHandle,m.selected,m.zIndex]),zu),yl=_l.useMemo(()=>m.markerStart?`url('#${vA(m.markerStart,U)}')`:void 0,[m.markerStart,U]),h=_l.useMemo(()=>m.markerEnd?`url('#${vA(m.markerEnd,U)}')`:void 0,[m.markerEnd,U]);if(m.hidden||v===null||K===null||X===null||I===null)return null;let s=(M)=>{let{addSelectedEdges:d,unselectNodesAndEdges:nl,multiSelectionActive:k}=D.getState();if(V)if(D.setState({nodesSelectionActive:!1}),m.selected&&k)nl({nodes:[],edges:[m]}),P.current?.blur();else d([l]);if(n)n(M,m)},ul=t?(M)=>{t(M,{...m})}:void 0,tl=i?(M)=>{i(M,{...m})}:void 0,Al=y?(M)=>{y(M,{...m})}:void 0,Kl=c?(M)=>{c(M,{...m})}:void 0,wl=_?(M)=>{_(M,{...m})}:void 0,El=(M)=>{if(!Q&&o9.includes(M.key)&&V){let{unselectNodesAndEdges:d,addSelectedEdges:nl}=D.getState();if(M.key==="Escape")P.current?.blur(),d({edges:[m]});else nl([l])}};return il.jsx("svg",{style:{zIndex:Y},children:il.jsxs("g",{className:bu(["react-flow__edge",`react-flow__edge-${W}`,m.className,G,{selected:m.selected,animated:m.animated,inactive:!V&&!n,updating:H,selectable:V}]),onClick:s,onDoubleClick:ul,onContextMenu:tl,onMouseEnter:Al,onMouseMove:Kl,onMouseLeave:wl,onKeyDown:O?El:void 0,tabIndex:O?0:void 0,role:m.ariaRole??(O?"group":"img"),"aria-roledescription":"edge","data-id":l,"data-testid":`rf__edge-${l}`,"aria-label":m.ariaLabel===null?void 0:m.ariaLabel||`Edge from ${m.source} to ${m.target}`,"aria-describedby":O?`${oq}-${U}`:void 0,ref:P,...m.domAttributes,children:[!C&&il.jsx(p,{id:l,source:m.source,target:m.target,type:m.type,selected:m.selected,animated:m.animated,selectable:V,deletable:m.deletable??!0,label:m.label,labelStyle:m.labelStyle,labelShowBg:m.labelShowBg,labelBgStyle:m.labelBgStyle,labelBgPadding:m.labelBgPadding,labelBgBorderRadius:m.labelBgBorderRadius,sourceX:v,sourceY:K,targetX:X,targetY:I,sourcePosition:o,targetPosition:fl,data:m.data,style:m.style,sourceHandleId:m.sourceHandle,targetHandleId:m.targetHandle,markerStart:yl,markerEnd:h,pathOptions:"pathOptions"in m?m.pathOptions:void 0,interactionWidth:m.interactionWidth}),Z&&il.jsx(DS,{edge:m,isReconnectable:Z,reconnectRadius:A,onReconnect:F,onReconnectStart:j,onReconnectEnd:N,sourceX:v,sourceY:K,targetX:X,targetY:I,sourcePosition:o,targetPosition:fl,setUpdateHover:B,setReconnecting:E})]})})}var SS=_l.memo(VS),YS=(l)=>({edgesFocusable:l.edgesFocusable,edgesReconnectable:l.edgesReconnectable,elementsSelectable:l.elementsSelectable,connectionMode:l.connectionMode,onError:l.onError});function LL({defaultMarkerColor:l,onlyRenderVisibleElements:u,rfId:r,edgeTypes:f,noPanClassName:n,onReconnect:t,onEdgeContextMenu:i,onEdgeMouseEnter:y,onEdgeMouseMove:c,onEdgeMouseLeave:_,onEdgeClick:A,reconnectRadius:F,onEdgeDoubleClick:j,onReconnectStart:N,onReconnectEnd:U,disableKeyboardA11y:w}){let{edgesFocusable:G,edgesReconnectable:J,elementsSelectable:Q,onError:m}=$u(YS,zu),q=qS(u);return il.jsxs("div",{className:"react-flow__edges",children:[il.jsx(KS,{defaultColor:l,rfId:r}),q.map((W)=>{return il.jsx(SS,{id:W,edgesFocusable:G,edgesReconnectable:J,elementsSelectable:Q,noPanClassName:n,onReconnect:t,onContextMenu:i,onMouseEnter:y,onMouseMove:c,onMouseLeave:_,onClick:A,reconnectRadius:F,onDoubleClick:j,onReconnectStart:N,onReconnectEnd:U,rfId:r,onError:m,edgeTypes:f,disableKeyboardA11y:w},W)})]})}LL.displayName="EdgeRenderer";var XS=_l.memo(LL),PS=(l)=>`translate(${l.transform[0]}px,${l.transform[1]}px) scale(${l.transform[2]})`;function CS({children:l}){let u=$u(PS);return il.jsx("div",{className:"react-flow__viewport xyflow__viewport react-flow__container",style:{transform:u},children:l})}function hS(l){let u=pF(),r=_l.useRef(!1);_l.useEffect(()=>{if(!r.current&&u.viewportInitialized&&l)setTimeout(()=>l(u),1),r.current=!0},[l,u.viewportInitialized])}var MS=(l)=>l.panZoom?.syncViewport;function sS(l){let u=$u(MS),r=Vu();return _l.useEffect(()=>{if(l)u?.(l),r.setState({transform:[l.x,l.y,l.zoom]})},[l,u]),null}function vq(l){return l.connection.inProgress?{...l.connection,to:Yy(l.connection.to,l.transform)}:{...l.connection}}function RS(l){if(l)return(r)=>{let f=vq(r);return l(f)};return vq}function xS(l){let u=RS(l);return $u(u,zu)}var bS=(l)=>({nodesConnectable:l.nodesConnectable,isValid:l.connection.isValid,inProgress:l.connection.inProgress,width:l.width,height:l.height});function vS({containerStyle:l,style:u,type:r,component:f}){let{nodesConnectable:n,width:t,height:i,isValid:y,inProgress:c}=$u(bS,zu);if(!(t&&n&&c))return null;return il.jsx("svg",{style:l,width:t,height:i,className:"react-flow__connectionline react-flow__container",children:il.jsx("g",{className:bu(["react-flow__connection",lF(y)]),children:il.jsx(GL,{style:u,type:r,CustomComponent:f,isValid:y})})})}var GL=({style:l,type:u=pn.Bezier,CustomComponent:r,isValid:f})=>{let{inProgress:n,from:t,fromNode:i,fromHandle:y,fromPosition:c,to:_,toNode:A,toHandle:F,toPosition:j,pointer:N}=xS();if(!n)return;if(r)return il.jsx(r,{connectionLineType:u,connectionLineStyle:l,fromNode:i,fromHandle:y,fromX:t.x,fromY:t.y,toX:_.x,toY:_.y,fromPosition:c,toPosition:j,connectionStatus:lF(f),toNode:A,toHandle:F,pointer:N});let U="",w={sourceX:t.x,sourceY:t.y,sourcePosition:c,targetX:_.x,targetY:_.y,targetPosition:j};switch(u){case pn.Bezier:[U]=xA(w);break;case pn.SimpleBezier:[U]=$L(w);break;case pn.Step:[U]=y$({...w,borderRadius:0});break;case pn.SmoothStep:[U]=y$(w);break;default:[U]=bA(w)}return il.jsx("path",{d:U,fill:"none",className:"react-flow__connection-path",style:l})};GL.displayName="ConnectionLine";var gS={};function gq(l=gS){let u=_l.useRef(l),r=Vu();_l.useEffect(()=>{},[l])}function kS(){let l=Vu(),u=_l.useRef(!1);_l.useEffect(()=>{},[])}function WL({nodeTypes:l,edgeTypes:u,onInit:r,onNodeClick:f,onEdgeClick:n,onNodeDoubleClick:t,onEdgeDoubleClick:i,onNodeMouseEnter:y,onNodeMouseMove:c,onNodeMouseLeave:_,onNodeContextMenu:A,onSelectionContextMenu:F,onSelectionStart:j,onSelectionEnd:N,connectionLineType:U,connectionLineStyle:w,connectionLineComponent:G,connectionLineContainerStyle:J,selectionKeyCode:Q,selectionOnDrag:m,selectionMode:q,multiSelectionKeyCode:W,panActivationKeyCode:p,zoomActivationKeyCode:O,deleteKeyCode:Z,onlyRenderVisibleElements:V,elementsSelectable:P,defaultViewport:H,translateExtent:B,minZoom:C,maxZoom:E,preventScrolling:D,defaultMarkerColor:Y,zoomOnScroll:v,zoomOnPinch:K,panOnScroll:X,panOnScrollSpeed:I,panOnScrollMode:o,zoomOnDoubleClick:fl,panOnDrag:yl,onPaneClick:h,onPaneMouseEnter:s,onPaneMouseMove:ul,onPaneMouseLeave:tl,onPaneScroll:Al,onPaneContextMenu:Kl,paneClickDistance:wl,nodeClickDistance:El,onEdgeContextMenu:M,onEdgeMouseEnter:d,onEdgeMouseMove:nl,onEdgeMouseLeave:k,reconnectRadius:g,onReconnect:cl,onReconnectStart:pl,onReconnectEnd:Hl,noDragClassName:bl,noWheelClassName:_u,noPanClassName:tu,disableKeyboardA11y:Nu,nodeExtent:gl,rfId:zr,viewport:nf,onViewportChange:lr}){return gq(l),gq(u),kS(),hS(r),sS(nf),il.jsx(_S,{onPaneClick:h,onPaneMouseEnter:s,onPaneMouseMove:ul,onPaneMouseLeave:tl,onPaneContextMenu:Kl,onPaneScroll:Al,paneClickDistance:wl,deleteKeyCode:Z,selectionKeyCode:Q,selectionOnDrag:m,selectionMode:q,onSelectionStart:j,onSelectionEnd:N,multiSelectionKeyCode:W,panActivationKeyCode:p,zoomActivationKeyCode:O,elementsSelectable:P,zoomOnScroll:v,zoomOnPinch:K,zoomOnDoubleClick:fl,panOnScroll:X,panOnScrollSpeed:I,panOnScrollMode:o,panOnDrag:yl,defaultViewport:H,translateExtent:B,minZoom:C,maxZoom:E,onSelectionContextMenu:F,preventScrolling:D,noDragClassName:bl,noWheelClassName:_u,noPanClassName:tu,disableKeyboardA11y:Nu,onViewportChange:lr,isControlledViewport:!!nf,children:il.jsxs(CS,{children:[il.jsx(XS,{edgeTypes:u,onEdgeClick:n,onEdgeDoubleClick:i,onReconnect:cl,onReconnectStart:pl,onReconnectEnd:Hl,onlyRenderVisibleElements:V,onEdgeContextMenu:M,onEdgeMouseEnter:d,onEdgeMouseMove:nl,onEdgeMouseLeave:k,reconnectRadius:g,defaultMarkerColor:Y,noPanClassName:tu,disableKeyboardA11y:Nu,rfId:zr}),il.jsx(vS,{style:w,type:U,component:G,containerStyle:J}),il.jsx("div",{className:"react-flow__edgelabel-renderer"}),il.jsx(wS,{nodeTypes:l,onNodeClick:f,onNodeDoubleClick:t,onNodeMouseEnter:y,onNodeMouseMove:c,onNodeMouseLeave:_,onNodeContextMenu:A,nodeClickDistance:El,onlyRenderVisibleElements:V,noPanClassName:tu,noDragClassName:bl,disableKeyboardA11y:Nu,nodeExtent:gl,rfId:zr}),il.jsx("div",{className:"react-flow__viewport-portal"})]})})}WL.displayName="GraphView";var IS=_l.memo(WL),kq=({nodes:l,edges:u,defaultNodes:r,defaultEdges:f,width:n,height:t,fitView:i,fitViewOptions:y,minZoom:c=0.5,maxZoom:_=2,nodeOrigin:A,nodeExtent:F,zIndexMode:j="basic"}={})=>{let N=new Map,U=new Map,w=new Map,G=new Map,J=f??u??[],Q=r??l??[],m=A??[0,0],q=F??By;qF(w,G,J);let{nodesInitialized:W}=gA(Q,N,U,{nodeOrigin:m,nodeExtent:q,zIndexMode:j}),p=[0,0,1];if(i&&n&&t){let O=Dy(N,{filter:(H)=>!!((H.width||H.initialWidth)&&(H.height||H.initialHeight))}),{x:Z,y:V,zoom:P}=i$(O,n,t,c,_,y?.padding??0.1);p=[Z,V,P]}return{rfId:"1",width:n??0,height:t??0,transform:p,nodes:Q,nodesInitialized:W,nodeLookup:N,parentLookup:U,edges:J,edgeLookup:G,connectionLookup:w,onNodesChange:null,onEdgesChange:null,hasDefaultNodes:r!==void 0,hasDefaultEdges:f!==void 0,panZoom:null,minZoom:c,maxZoom:_,translateExtent:By,nodeExtent:q,nodesSelectionActive:!1,userSelectionActive:!1,userSelectionRect:null,connectionMode:ui.Strict,domNode:null,paneDragging:!1,noPanClassName:"nopan",nodeOrigin:m,nodeDragThreshold:1,connectionDragThreshold:1,snapGrid:[15,15],snapToGrid:!1,nodesDraggable:!0,nodesConnectable:!0,nodesFocusable:!0,edgesFocusable:!0,edgesReconnectable:!0,elementsSelectable:!0,elevateNodesOnSelect:!0,elevateEdgesOnSelect:!0,selectNodesOnDrag:!0,multiSelectionActive:!1,fitViewQueued:i??!1,fitViewOptions:y,fitViewResolver:null,connection:{...e9},connectionClickStartHandle:null,connectOnClick:!0,ariaLiveMessage:"",autoPanOnConnect:!0,autoPanOnNodeDrag:!0,autoPanOnNodeFocus:!0,autoPanSpeed:15,connectionRadius:20,onError:yF,isValidConnection:void 0,onSelectionChangeHandlers:[],lib:"react",debug:!1,ariaLabelConfig:d9,zIndexMode:j,onNodesChangeMiddlewareMap:new Map,onEdgesChangeMiddlewareMap:new Map}},aS=({nodes:l,edges:u,defaultNodes:r,defaultEdges:f,width:n,height:t,fitView:i,fitViewOptions:y,minZoom:c,maxZoom:_,nodeOrigin:A,nodeExtent:F,zIndexMode:j})=>Kq((N,U)=>{async function w(){let{nodeLookup:G,panZoom:J,fitViewOptions:Q,fitViewResolver:m,width:q,height:W,minZoom:p,maxZoom:O}=U();if(!J)return;await Cw({nodes:G,width:q,height:W,panZoom:J,minZoom:p,maxZoom:O},Q),m?.resolve(!0),N({fitViewResolver:null})}return{...kq({nodes:l,edges:u,width:n,height:t,fitView:i,fitViewOptions:y,minZoom:c,maxZoom:_,nodeOrigin:A,nodeExtent:F,defaultNodes:r,defaultEdges:f,zIndexMode:j}),setNodes:(G)=>{let{nodeLookup:J,parentLookup:Q,nodeOrigin:m,elevateNodesOnSelect:q,fitViewQueued:W,zIndexMode:p,nodesSelectionActive:O}=U(),{nodesInitialized:Z,hasSelectedNodes:V}=gA(G,J,Q,{nodeOrigin:m,nodeExtent:F,elevateNodesOnSelect:q,checkEquality:!0,zIndexMode:p}),P=O&&V;if(W&&Z)w(),N({nodes:G,nodesInitialized:Z,fitViewQueued:!1,fitViewOptions:void 0,nodesSelectionActive:P});else N({nodes:G,nodesInitialized:Z,nodesSelectionActive:P})},setEdges:(G)=>{let{connectionLookup:J,edgeLookup:Q}=U();qF(J,Q,G),N({edges:G})},setDefaultNodesAndEdges:(G,J)=>{if(G){let{setNodes:Q}=U();Q(G),N({hasDefaultNodes:!0})}if(J){let{setEdges:Q}=U();Q(J),N({hasDefaultEdges:!0})}},updateNodeInternals:(G)=>{let{triggerNodeChanges:J,nodeLookup:Q,parentLookup:m,domNode:q,nodeOrigin:W,nodeExtent:p,debug:O,fitViewQueued:Z,zIndexMode:V}=U(),{changes:P,updatedInternals:H}=dw(G,Q,m,q,W,p,V);if(!H)return;if(aw(Q,m,{nodeOrigin:W,nodeExtent:p,zIndexMode:V}),Z)w(),N({fitViewQueued:!1,fitViewOptions:void 0});else N({});if(P?.length>0){if(O)console.log("React Flow: trigger node changes",P);J?.(P)}},updateNodePositions:(G,J=!1)=>{let Q=[],m=[],{nodeLookup:q,triggerNodeChanges:W,connection:p,updateConnection:O,onNodesChangeMiddlewareMap:Z}=U();for(let[V,P]of G){let H=q.get(V),B=!!(H?.expandParent&&H?.parentId&&P?.position),C={id:V,type:"position",position:B?{x:Math.max(0,P.position.x),y:Math.max(0,P.position.y)}:P.position,dragging:J};if(H&&p.inProgress&&p.fromNode.id===H.id){let E=fi(H,p.fromHandle,Ol.Left,!0);O({...p,from:E})}if(B&&H.parentId)Q.push({id:V,parentId:H.parentId,rect:{...P.internals.positionAbsolute,width:P.measured.width??0,height:P.measured.height??0}});m.push(C)}if(Q.length>0){let{parentLookup:V,nodeOrigin:P}=U(),H=kA(Q,q,V,P);m.push(...H)}for(let V of Z.values())m=V(m);W(m)},triggerNodeChanges:(G)=>{let{onNodesChange:J,setNodes:Q,nodes:m,hasDefaultNodes:q,debug:W}=U();if(G?.length){if(q){let p=SV(G,m);Q(p)}if(W)console.log("React Flow: trigger node changes",G);J?.(G)}},triggerEdgeChanges:(G)=>{let{onEdgesChange:J,setEdges:Q,edges:m,hasDefaultEdges:q,debug:W}=U();if(G?.length){if(q){let p=YV(G,m);Q(p)}if(W)console.log("React Flow: trigger edge changes",G);J?.(G)}},addSelectedNodes:(G)=>{let{multiSelectionActive:J,edgeLookup:Q,nodeLookup:m,triggerNodeChanges:q,triggerEdgeChanges:W}=U();if(J){let p=G.map((O)=>y0(O,!0));q(p);return}q(Cy(m,new Set([...G]),!0)),W(Cy(Q))},addSelectedEdges:(G)=>{let{multiSelectionActive:J,edgeLookup:Q,nodeLookup:m,triggerNodeChanges:q,triggerEdgeChanges:W}=U();if(J){let p=G.map((O)=>y0(O,!0));W(p);return}W(Cy(Q,new Set([...G]))),q(Cy(m,new Set,!0))},unselectNodesAndEdges:({nodes:G,edges:J}={})=>{let{edges:Q,nodes:m,nodeLookup:q,triggerNodeChanges:W,triggerEdgeChanges:p}=U(),O=G?G:m,Z=J?J:Q,V=[];for(let H of O){if(!H.selected)continue;let B=q.get(H.id);if(B)B.selected=!1;V.push(y0(H.id,!1))}let P=[];for(let H of Z){if(!H.selected)continue;P.push(y0(H.id,!1))}W(V),p(P)},setMinZoom:(G)=>{let{panZoom:J,maxZoom:Q}=U();J?.setScaleExtent([G,Q]),N({minZoom:G})},setMaxZoom:(G)=>{let{panZoom:J,minZoom:Q}=U();J?.setScaleExtent([Q,G]),N({maxZoom:G})},setTranslateExtent:(G)=>{U().panZoom?.setTranslateExtent(G),N({translateExtent:G})},resetSelectedElements:()=>{let{edges:G,nodes:J,triggerNodeChanges:Q,triggerEdgeChanges:m,elementsSelectable:q}=U();if(!q)return;let W=J.reduce((O,Z)=>Z.selected?[...O,y0(Z.id,!1)]:O,[]),p=G.reduce((O,Z)=>Z.selected?[...O,y0(Z.id,!1)]:O,[]);Q(W),m(p)},setNodeExtent:(G)=>{let{nodes:J,nodeLookup:Q,parentLookup:m,nodeOrigin:q,elevateNodesOnSelect:W,nodeExtent:p,zIndexMode:O}=U();if(G[0][0]===p[0][0]&&G[0][1]===p[0][1]&&G[1][0]===p[1][0]&&G[1][1]===p[1][1])return;gA(J,Q,m,{nodeOrigin:q,nodeExtent:G,elevateNodesOnSelect:W,checkEquality:!1,zIndexMode:O}),N({nodeExtent:G})},panBy:(G)=>{let{transform:J,width:Q,height:m,panZoom:q,translateExtent:W}=U();return ew({delta:G,panZoom:q,transform:J,translateExtent:W,width:Q,height:m})},setCenter:async(G,J,Q)=>{let{width:m,height:q,maxZoom:W,panZoom:p}=U();if(!p)return Promise.resolve(!1);let O=typeof Q?.zoom<"u"?Q.zoom:W;return await p.setViewport({x:m/2-G*O,y:q/2-J*O,zoom:O},{duration:Q?.duration,ease:Q?.ease,interpolate:Q?.interpolate}),Promise.resolve(!0)},cancelConnection:()=>{N({connection:{...e9}})},updateConnection:(G)=>{N({connection:G})},reset:()=>N({...kq()})}},Object.is);function oS({initialNodes:l,initialEdges:u,defaultNodes:r,defaultEdges:f,initialWidth:n,initialHeight:t,initialMinZoom:i,initialMaxZoom:y,initialFitViewOptions:c,fitView:_,nodeOrigin:A,nodeExtent:F,zIndexMode:j,children:N}){let[U]=_l.useState(()=>aS({nodes:l,edges:u,defaultNodes:r,defaultEdges:f,width:n,height:t,fitView:_,minZoom:i,maxZoom:y,fitViewOptions:c,nodeOrigin:A,nodeExtent:F,zIndexMode:j}));return il.jsx(JV,{value:U,children:il.jsx(CV,{children:N})})}function dS({children:l,nodes:u,edges:r,defaultNodes:f,defaultEdges:n,width:t,height:i,fitView:y,fitViewOptions:c,minZoom:_,maxZoom:A,nodeOrigin:F,nodeExtent:j,zIndexMode:N}){if(_l.useContext(u8))return il.jsx(il.Fragment,{children:l});return il.jsx(oS,{initialNodes:u,initialEdges:r,defaultNodes:f,defaultEdges:n,initialWidth:t,initialHeight:i,fitView:y,initialFitViewOptions:c,initialMinZoom:_,initialMaxZoom:A,nodeOrigin:F,nodeExtent:j,zIndexMode:N,children:l})}var eS={width:"100%",height:"100%",overflow:"hidden",position:"relative",zIndex:0};function lY({nodes:l,edges:u,defaultNodes:r,defaultEdges:f,className:n,nodeTypes:t,edgeTypes:i,onNodeClick:y,onEdgeClick:c,onInit:_,onMove:A,onMoveStart:F,onMoveEnd:j,onConnect:N,onConnectStart:U,onConnectEnd:w,onClickConnectStart:G,onClickConnectEnd:J,onNodeMouseEnter:Q,onNodeMouseMove:m,onNodeMouseLeave:q,onNodeContextMenu:W,onNodeDoubleClick:p,onNodeDragStart:O,onNodeDrag:Z,onNodeDragStop:V,onNodesDelete:P,onEdgesDelete:H,onDelete:B,onSelectionChange:C,onSelectionDragStart:E,onSelectionDrag:D,onSelectionDragStop:Y,onSelectionContextMenu:v,onSelectionStart:K,onSelectionEnd:X,onBeforeDelete:I,connectionMode:o,connectionLineType:fl=pn.Bezier,connectionLineStyle:yl,connectionLineComponent:h,connectionLineContainerStyle:s,deleteKeyCode:ul="Backspace",selectionKeyCode:tl="Shift",selectionOnDrag:Al=!1,selectionMode:Kl=n0.Full,panActivationKeyCode:wl="Space",multiSelectionKeyCode:El=Xy()?"Meta":"Control",zoomActivationKeyCode:M=Xy()?"Meta":"Control",snapToGrid:d,snapGrid:nl,onlyRenderVisibleElements:k=!1,selectNodesOnDrag:g,nodesDraggable:cl,autoPanOnNodeFocus:pl,nodesConnectable:Hl,nodesFocusable:bl,nodeOrigin:_u=dq,edgesFocusable:tu,edgesReconnectable:Nu,elementsSelectable:gl=!0,defaultViewport:zr=zV,minZoom:nf=0.5,maxZoom:lr=2,translateExtent:tf=By,preventScrolling:Or=!0,nodeExtent:Nl,defaultMarkerColor:al="#b1b1b7",zoomOnScroll:gu=!0,zoomOnPinch:hl=!0,panOnScroll:yr=!1,panOnScrollSpeed:Zr=0.5,panOnScrollMode:cr=it.Free,zoomOnDoubleClick:ku=!0,panOnDrag:Gf=!0,onPaneClick:Vn,onPaneMouseEnter:Rr,onPaneMouseMove:ay,onPaneMouseLeave:_t,onPaneScroll:At,onPaneContextMenu:e,paneClickDistance:Dl=1,nodeClickDistance:Cl=0,children:lu,onReconnect:mu,onReconnectStart:au,onReconnectEnd:yu,onEdgeContextMenu:ur,onEdgeDoubleClick:Sn,onEdgeMouseEnter:Z8,onEdgeMouseMove:oy,onEdgeMouseLeave:dy,reconnectRadius:Tu=10,onNodesChange:K$,onEdgesChange:H8,noDragClassName:ju="nodrag",noWheelClassName:wj="nowheel",noPanClassName:Su="nopan",fitView:mr,fitViewOptions:A0,connectOnClick:E$,attributionPosition:ey,proOptions:p$,defaultEdgeOptions:lc,elevateNodesOnSelect:z$=!0,elevateEdgesOnSelect:O$=!1,disableKeyboardA11y:Ft=!1,autoPanOnConnect:F0,autoPanOnNodeDrag:j0,autoPanSpeed:xr,connectionRadius:Wf,isValidConnection:Z$,onError:N0,style:uc,id:rc,nodeDragThreshold:$n,connectionDragThreshold:H$,viewport:Ou,onViewportChange:B8,width:D8,height:B$,colorMode:hf="light",debug:Ui,onScroll:jt,ariaLabelConfig:J0,zIndexMode:Nt="basic",...fc},qj){let Yn=rc||"1",Lj=BV(hf),D$=_l.useCallback((V$)=>{V$.currentTarget.scrollTo({top:0,left:0,behavior:"instant"}),jt?.(V$)},[jt]);return il.jsx("div",{"data-testid":"rf__wrapper",...fc,onScroll:D$,style:{...uc,...eS},ref:qj,className:bu(["react-flow",n,Lj]),id:rc,role:"application",children:il.jsxs(dS,{nodes:l,edges:u,width:D8,height:B$,fitView:mr,fitViewOptions:A0,minZoom:nf,maxZoom:lr,nodeOrigin:_u,nodeExtent:Nl,zIndexMode:Nt,children:[il.jsx(HV,{nodes:l,edges:u,defaultNodes:r,defaultEdges:f,onConnect:N,onConnectStart:U,onConnectEnd:w,onClickConnectStart:G,onClickConnectEnd:J,nodesDraggable:cl,autoPanOnNodeFocus:pl,nodesConnectable:Hl,nodesFocusable:bl,edgesFocusable:tu,edgesReconnectable:Nu,elementsSelectable:gl,elevateNodesOnSelect:z$,elevateEdgesOnSelect:O$,minZoom:nf,maxZoom:lr,nodeExtent:Nl,onNodesChange:K$,onEdgesChange:H8,snapToGrid:d,snapGrid:nl,connectionMode:o,translateExtent:tf,connectOnClick:E$,defaultEdgeOptions:lc,fitView:mr,fitViewOptions:A0,onNodesDelete:P,onEdgesDelete:H,onDelete:B,onNodeDragStart:O,onNodeDrag:Z,onNodeDragStop:V,onSelectionDrag:D,onSelectionDragStart:E,onSelectionDragStop:Y,onMove:A,onMoveStart:F,onMoveEnd:j,noPanClassName:Su,nodeOrigin:_u,rfId:Yn,autoPanOnConnect:F0,autoPanOnNodeDrag:j0,autoPanSpeed:xr,onError:N0,connectionRadius:Wf,isValidConnection:Z$,selectNodesOnDrag:g,nodeDragThreshold:$n,connectionDragThreshold:H$,onBeforeDelete:I,debug:Ui,ariaLabelConfig:J0,zIndexMode:Nt}),il.jsx(IS,{onInit:_,onNodeClick:y,onEdgeClick:c,onNodeMouseEnter:Q,onNodeMouseMove:m,onNodeMouseLeave:q,onNodeContextMenu:W,onNodeDoubleClick:p,nodeTypes:t,edgeTypes:i,connectionLineType:fl,connectionLineStyle:yl,connectionLineComponent:h,connectionLineContainerStyle:s,selectionKeyCode:tl,selectionOnDrag:Al,selectionMode:Kl,deleteKeyCode:ul,multiSelectionKeyCode:El,panActivationKeyCode:wl,zoomActivationKeyCode:M,onlyRenderVisibleElements:k,defaultViewport:zr,translateExtent:tf,minZoom:nf,maxZoom:lr,preventScrolling:Or,zoomOnScroll:gu,zoomOnPinch:hl,zoomOnDoubleClick:ku,panOnScroll:yr,panOnScrollSpeed:Zr,panOnScrollMode:cr,panOnDrag:Gf,onPaneClick:Vn,onPaneMouseEnter:Rr,onPaneMouseMove:ay,onPaneMouseLeave:_t,onPaneScroll:At,onPaneContextMenu:e,paneClickDistance:Dl,nodeClickDistance:Cl,onSelectionContextMenu:v,onSelectionStart:K,onSelectionEnd:X,onReconnect:mu,onReconnectStart:au,onReconnectEnd:yu,onEdgeContextMenu:ur,onEdgeDoubleClick:Sn,onEdgeMouseEnter:Z8,onEdgeMouseMove:oy,onEdgeMouseLeave:dy,reconnectRadius:Tu,defaultMarkerColor:al,noDragClassName:ju,noWheelClassName:wj,noPanClassName:Su,rfId:Yn,disableKeyboardA11y:Ft,nodeExtent:Nl,viewport:Ou,onViewportChange:B8}),il.jsx(pV,{onSelectionChange:C}),lu,il.jsx(GV,{proOptions:p$,position:ey}),il.jsx(LV,{rfId:Yn,disableKeyboardA11y:Ft})]})})}var TL=lL(lY);var tg=mf.error014();function uY({dimensions:l,lineWidth:u,variant:r,className:f}){return il.jsx("path",{strokeWidth:u,d:`M${l[0]/2} 0 V${l[1]} M0 ${l[1]/2} H${l[0]}`,className:bu(["react-flow__background-pattern",r,f])})}function rY({radius:l,className:u}){return il.jsx("circle",{cx:l,cy:l,r:l,className:bu(["react-flow__background-pattern","dots",u])})}var ti;(function(l){l.Lines="lines",l.Dots="dots",l.Cross="cross"})(ti||(ti={}));var fY={[ti.Dots]:1,[ti.Lines]:1,[ti.Cross]:6},nY=(l)=>({transform:l.transform,patternId:`pattern-${l.rfId}`});function KL({id:l,variant:u=ti.Dots,gap:r=20,size:f,lineWidth:n=1,offset:t=0,color:i,bgColor:y,style:c,className:_,patternClassName:A}){let F=_l.useRef(null),{transform:j,patternId:N}=$u(nY,zu),U=f||fY[u],w=u===ti.Dots,G=u===ti.Cross,J=Array.isArray(r)?r:[r,r],Q=[J[0]*j[2]||1,J[1]*j[2]||1],m=U*j[2],q=Array.isArray(t)?t:[t,t],W=G?[m,m]:Q,p=[q[0]*j[2]||1+W[0]/2,q[1]*j[2]||1+W[1]/2],O=`${N}${l?l:""}`;return il.jsxs("svg",{className:bu(["react-flow__background",_]),style:{...c,...f8,"--xy-background-color-props":y,"--xy-background-pattern-color-props":i},ref:F,"data-testid":"rf__background",children:[il.jsx("pattern",{id:O,x:j[0]%Q[0],y:j[1]%Q[1],width:Q[0],height:Q[1],patternUnits:"userSpaceOnUse",patternTransform:`translate(-${p[0]},-${p[1]})`,children:w?il.jsx(rY,{radius:m/2,className:A}):il.jsx(uY,{dimensions:W,lineWidth:n,variant:u,className:A})}),il.jsx("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:`url(#${O})`})]})}KL.displayName="Background";var EL=_l.memo(KL);function tY(){return il.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",children:il.jsx("path",{d:"M32 18.133H18.133V32h-4.266V18.133H0v-4.266h13.867V0h4.266v13.867H32z"})})}function iY(){return il.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 5",children:il.jsx("path",{d:"M0 0h32v4.2H0z"})})}function yY(){return il.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 30",children:il.jsx("path",{d:"M3.692 4.63c0-.53.4-.938.939-.938h5.215V0H4.708C2.13 0 0 2.054 0 4.63v5.216h3.692V4.631zM27.354 0h-5.2v3.692h5.17c.53 0 .984.4.984.939v5.215H32V4.631A4.624 4.624 0 0027.354 0zm.954 24.83c0 .532-.4.94-.939.94h-5.215v3.768h5.215c2.577 0 4.631-2.13 4.631-4.707v-5.139h-3.692v5.139zm-23.677.94c-.531 0-.939-.4-.939-.94v-5.138H0v5.139c0 2.577 2.13 4.707 4.708 4.707h5.138V25.77H4.631z"})})}function cY(){return il.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:il.jsx("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0 8 0 4.571 3.429 4.571 7.619v3.048H3.048A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047zm4.724-13.866H7.467V7.619c0-2.59 2.133-4.724 4.723-4.724 2.591 0 4.724 2.133 4.724 4.724v3.048z"})})}function $Y(){return il.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:il.jsx("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0c-4.114 1.828-1.37 2.133.305 2.438 1.676.305 4.42 2.59 4.42 5.181v3.048H3.047A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047z"})})}function eA({children:l,className:u,...r}){return il.jsx("button",{type:"button",className:bu(["react-flow__controls-button",u]),...r,children:l})}var _Y=(l)=>({isInteractive:l.nodesDraggable||l.nodesConnectable||l.elementsSelectable,minZoomReached:l.transform[2]<=l.minZoom,maxZoomReached:l.transform[2]>=l.maxZoom,ariaLabelConfig:l.ariaLabelConfig});function pL({style:l,showZoom:u=!0,showFitView:r=!0,showInteractive:f=!0,fitViewOptions:n,onZoomIn:t,onZoomOut:i,onFitView:y,onInteractiveChange:c,className:_,children:A,position:F="bottom-left",orientation:j="vertical","aria-label":N}){let U=Vu(),{isInteractive:w,minZoomReached:G,maxZoomReached:J,ariaLabelConfig:Q}=$u(_Y,zu),{zoomIn:m,zoomOut:q,fitView:W}=pF(),p=()=>{m(),t?.()},O=()=>{q(),i?.()},Z=()=>{W(n),y?.()},V=()=>{U.setState({nodesDraggable:!w,nodesConnectable:!w,elementsSelectable:!w}),c?.(!w)};return il.jsxs(r8,{className:bu(["react-flow__controls",j==="horizontal"?"horizontal":"vertical",_]),position:F,style:l,"data-testid":"rf__controls","aria-label":N??Q["controls.ariaLabel"],children:[u&&il.jsxs(il.Fragment,{children:[il.jsx(eA,{onClick:p,className:"react-flow__controls-zoomin",title:Q["controls.zoomIn.ariaLabel"],"aria-label":Q["controls.zoomIn.ariaLabel"],disabled:J,children:il.jsx(tY,{})}),il.jsx(eA,{onClick:O,className:"react-flow__controls-zoomout",title:Q["controls.zoomOut.ariaLabel"],"aria-label":Q["controls.zoomOut.ariaLabel"],disabled:G,children:il.jsx(iY,{})})]}),r&&il.jsx(eA,{className:"react-flow__controls-fitview",onClick:Z,title:Q["controls.fitView.ariaLabel"],"aria-label":Q["controls.fitView.ariaLabel"],children:il.jsx(yY,{})}),f&&il.jsx(eA,{className:"react-flow__controls-interactive",onClick:V,title:Q["controls.interactive.ariaLabel"],"aria-label":Q["controls.interactive.ariaLabel"],children:w?il.jsx($Y,{}):il.jsx(cY,{})}),A]})}pL.displayName="Controls";var zL=_l.memo(pL);function AY({id:l,x:u,y:r,width:f,height:n,style:t,color:i,strokeColor:y,strokeWidth:c,className:_,borderRadius:A,shapeRendering:F,selected:j,onClick:N}){let{background:U,backgroundColor:w}=t||{},G=i||U||w;return il.jsx("rect",{className:bu(["react-flow__minimap-node",{selected:j},_]),x:u,y:r,rx:A,ry:A,width:f,height:n,style:{fill:G,stroke:y,strokeWidth:c},shapeRendering:F,onClick:N?(J)=>N(J,l):void 0})}var FY=_l.memo(AY),jY=(l)=>l.nodes.map((u)=>u.id),TF=(l)=>l instanceof Function?l:()=>l;function NY({nodeStrokeColor:l,nodeColor:u,nodeClassName:r="",nodeBorderRadius:f=5,nodeStrokeWidth:n,nodeComponent:t=FY,onClick:i}){let y=$u(jY,zu),c=TF(u),_=TF(l),A=TF(r),F=typeof window>"u"||!!window.chrome?"crispEdges":"geometricPrecision";return il.jsx(il.Fragment,{children:y.map((j)=>il.jsx(UY,{id:j,nodeColorFunc:c,nodeStrokeColorFunc:_,nodeClassNameFunc:A,nodeBorderRadius:f,nodeStrokeWidth:n,NodeComponent:t,onClick:i,shapeRendering:F},j))})}function JY({id:l,nodeColorFunc:u,nodeStrokeColorFunc:r,nodeClassNameFunc:f,nodeBorderRadius:n,nodeStrokeWidth:t,shapeRendering:i,NodeComponent:y,onClick:c}){let{node:_,x:A,y:F,width:j,height:N}=$u((U)=>{let w=U.nodeLookup.get(l);if(!w)return{node:void 0,x:0,y:0,width:0,height:0};let G=w.internals.userNode,{x:J,y:Q}=w.internals.positionAbsolute,{width:m,height:q}=zn(G);return{node:G,x:J,y:Q,width:m,height:q}},zu);if(!_||_.hidden||!cF(_))return null;return il.jsx(y,{x:A,y:F,width:j,height:N,style:_.style,selected:!!_.selected,className:f(_),color:u(_),borderRadius:n,strokeColor:r(_),strokeWidth:t,shapeRendering:i,onClick:c,id:_.id})}var UY=_l.memo(JY),QY=_l.memo(NY),mY=200,wY=150,qY=(l)=>!l.hidden,LY=(l)=>{let u={x:-l.transform[0]/l.transform[2],y:-l.transform[1]/l.transform[2],width:l.width/l.transform[2],height:l.height/l.transform[2]};return{viewBB:u,boundingRect:l.nodeLookup.size>0?tF(Dy(l.nodeLookup,{filter:qY}),u):u,rfId:l.rfId,panZoom:l.panZoom,translateExtent:l.translateExtent,flowWidth:l.width,flowHeight:l.height,ariaLabelConfig:l.ariaLabelConfig}},GY="react-flow__minimap-desc";function OL({style:l,className:u,nodeStrokeColor:r,nodeColor:f,nodeClassName:n="",nodeBorderRadius:t=5,nodeStrokeWidth:i,nodeComponent:y,bgColor:c,maskColor:_,maskStrokeColor:A,maskStrokeWidth:F,position:j="bottom-right",onClick:N,onNodeClick:U,pannable:w=!1,zoomable:G=!1,ariaLabel:J,inversePan:Q,zoomStep:m=1,offsetScale:q=5}){let W=Vu(),p=_l.useRef(null),{boundingRect:O,viewBB:Z,rfId:V,panZoom:P,translateExtent:H,flowWidth:B,flowHeight:C,ariaLabelConfig:E}=$u(LY,zu),D=l?.width??mY,Y=l?.height??wY,v=O.width/D,K=O.height/Y,X=Math.max(v,K),I=X*D,o=X*Y,fl=q*X,yl=O.x-(I-O.width)/2-fl,h=O.y-(o-O.height)/2-fl,s=I+fl*2,ul=o+fl*2,tl=`${GY}-${V}`,Al=_l.useRef(0),Kl=_l.useRef();Al.current=X,_l.useEffect(()=>{if(p.current&&P)return Kl.current=iq({domNode:p.current,panZoom:P,getTransform:()=>W.getState().transform,getViewScale:()=>Al.current}),()=>{Kl.current?.destroy()}},[P]),_l.useEffect(()=>{Kl.current?.update({translateExtent:H,width:B,height:C,inversePan:Q,pannable:w,zoomStep:m,zoomable:G})},[w,G,Q,m,H,B,C]);let wl=N?(d)=>{let[nl,k]=Kl.current?.pointer(d)||[0,0];N(d,{x:nl,y:k})}:void 0,El=U?_l.useCallback((d,nl)=>{let k=W.getState().nodeLookup.get(nl).internals.userNode;U(d,k)},[]):void 0,M=J??E["minimap.ariaLabel"];return il.jsx(r8,{position:j,style:{...l,"--xy-minimap-background-color-props":typeof c==="string"?c:void 0,"--xy-minimap-mask-background-color-props":typeof _==="string"?_:void 0,"--xy-minimap-mask-stroke-color-props":typeof A==="string"?A:void 0,"--xy-minimap-mask-stroke-width-props":typeof F==="number"?F*X:void 0,"--xy-minimap-node-background-color-props":typeof f==="string"?f:void 0,"--xy-minimap-node-stroke-color-props":typeof r==="string"?r:void 0,"--xy-minimap-node-stroke-width-props":typeof i==="number"?i:void 0},className:bu(["react-flow__minimap",u]),"data-testid":"rf__minimap",children:il.jsxs("svg",{width:D,height:Y,viewBox:`${yl} ${h} ${s} ${ul}`,className:"react-flow__minimap-svg",role:"img","aria-labelledby":tl,ref:p,onClick:wl,children:[M&&il.jsx("title",{id:tl,children:M}),il.jsx(QY,{onClick:El,nodeColor:f,nodeStrokeColor:r,nodeBorderRadius:t,nodeClassName:n,nodeStrokeWidth:i,nodeComponent:y}),il.jsx("path",{className:"react-flow__minimap-mask",d:`M${yl-fl},${h-fl}h${s+fl*2}v${ul+fl*2}h${-s-fl*2}z - M${Z.x},${Z.y}h${Z.width}v${Z.height}h${-Z.width}z`,fillRule:"evenodd",pointerEvents:"none"})]})})}OL.displayName="MiniMap";var ig=_l.memo(OL),WY=(l)=>(u)=>l?`${Math.max(1/u.transform[2],1)}`:void 0,TY={[ni.Line]:"right",[ni.Handle]:"bottom-right"};function KY({nodeId:l,position:u,variant:r=ni.Handle,className:f,style:n=void 0,children:t,color:i,minWidth:y=10,minHeight:c=10,maxWidth:_=Number.MAX_VALUE,maxHeight:A=Number.MAX_VALUE,keepAspectRatio:F=!1,resizeDirection:j,autoScale:N=!0,shouldResize:U,onResizeStart:w,onResize:G,onResizeEnd:J}){let Q=nL(),m=typeof l==="string"?l:Q,q=Vu(),W=_l.useRef(null),p=r===ni.Handle,O=$u(_l.useCallback(WY(p&&N),[p,N]),zu),Z=_l.useRef(null),V=u??TY[r];_l.useEffect(()=>{if(!W.current||!m)return;if(!Z.current)Z.current=Aq({domNode:W.current,nodeId:m,getStoreItems:()=>{let{nodeLookup:H,transform:B,snapGrid:C,snapToGrid:E,nodeOrigin:D,domNode:Y}=q.getState();return{nodeLookup:H,transform:B,snapGrid:C,snapToGrid:E,nodeOrigin:D,paneDomNode:Y}},onChange:(H,B)=>{let{triggerNodeChanges:C,nodeLookup:E,parentLookup:D,nodeOrigin:Y}=q.getState(),v=[],K={x:H.x,y:H.y},X=E.get(m);if(X&&X.expandParent&&X.parentId){let I=X.origin??Y,o=H.width??X.measured.width??0,fl=H.height??X.measured.height??0,yl={id:X.id,parentId:X.parentId,rect:{width:o,height:fl,...$F({x:H.x??X.position.x,y:H.y??X.position.y},{width:o,height:fl},X.parentId,E,I)}},h=kA([yl],E,D,Y);v.push(...h),K.x=H.x?Math.max(I[0]*o,H.x):void 0,K.y=H.y?Math.max(I[1]*fl,H.y):void 0}if(K.x!==void 0&&K.y!==void 0){let I={id:m,type:"position",position:{...K}};v.push(I)}if(H.width!==void 0&&H.height!==void 0){let o={id:m,type:"dimensions",resizing:!0,setAttributes:!j?!0:j==="horizontal"?"width":"height",dimensions:{width:H.width,height:H.height}};v.push(o)}for(let I of B){let o={...I,type:"position"};v.push(o)}C(v)},onEnd:({width:H,height:B})=>{let C={id:m,type:"dimensions",resizing:!1,dimensions:{width:H,height:B}};q.getState().triggerNodeChanges([C])}});return Z.current.update({controlPosition:V,boundaries:{minWidth:y,minHeight:c,maxWidth:_,maxHeight:A},keepAspectRatio:F,resizeDirection:j,onResizeStart:w,onResize:G,onResizeEnd:J,shouldResize:U}),()=>{Z.current?.destroy()}},[V,y,c,_,A,F,w,G,J,U]);let P=V.split("-");return il.jsx("div",{className:bu(["react-flow__resize-control","nodrag",...P,r,f]),ref:W,style:{...n,scale:O,...i&&{[p?"backgroundColor":"borderColor"]:i}},children:t})}var yg=_l.memo(KY);var T=$i.default.createElement,{useEffect:Hn}=$i.default,lf=$i.default.useState,ci=$i.default.useRef,N$=[{id:"in-left",side:"left",position:Ol.Left,style:{top:"50%"}},{id:"in-top-left",side:"top",slot:"left",slotIndex:-1,position:Ol.Top,style:{left:"28%"}},{id:"in-top-mid",side:"top",slot:"mid",slotIndex:0,position:Ol.Top,style:{left:"50%"}},{id:"in-top-right",side:"top",slot:"right",slotIndex:1,position:Ol.Top,style:{left:"72%"}},{id:"in-bottom-left",side:"bottom",slot:"left",slotIndex:-1,position:Ol.Bottom,style:{left:"28%"}},{id:"in-bottom-mid",side:"bottom",slot:"mid",slotIndex:0,position:Ol.Bottom,style:{left:"50%"}},{id:"in-bottom-right",side:"bottom",slot:"right",slotIndex:1,position:Ol.Bottom,style:{left:"72%"}}],A$=[{id:"out-right",position:Ol.Right,style:{top:"50%"}}],ZL=["#4eb7a8","#d7a13a","#69aee8","#e0835f","#b7d86b","#d98bd2","#5fc6bf"],sy=236,Ry=88,HL=15000,EY=10,OF=96,On=72,ZF=64,BL=12;function n8(){return typeof document>"u"||document.visibilityState!=="hidden"}function DL(l,u){let r=Number.parseFloat(String(l||""));return Number.isFinite(r)?r/100:u}function pY(l,u,r){let f=String(l.side||"");if(f!=="top"&&f!=="bottom")return 0;let n=Number(l.slotIndex||0),t=f==="top"?"in-top-mid":"in-bottom-mid",i=u.get(l.id)||0,y=u.get(t)||0;if(n===0)return y===0?-26:28+i*74;let c=r===0?Math.abs(n)*2:Math.sign(r)===Math.sign(n)?-3:3;if(y>0&&i===0)return-14+c;return 8+i*74+c}function t8(l){let u=l.filter((t,i)=>{let y=l[i-1];return!y||Math.abs(y.x-t.x)>0.5||Math.abs(y.y-t.y)>0.5});if(u.length<2)return"";let r=`M ${u[0].x},${u[0].y}`,f=u[0];for(let t=1;t0.5||Math.abs(j.y-f.y)>0.5)r+=` L ${j.x},${j.y}`;r+=` Q ${y.x},${y.y} ${N.x},${N.y}`,f=N}let n=u[u.length-1];return`${r} L ${n.x},${n.y}`}function oL(l,u,r,f,n,t,i=""){let y=r>=l,c=Math.max(1,Math.abs(r-l)),_=Math.abs(f-u),A=Math.max(34,Math.min(118,c*0.26)),F=Math.min(280,Math.abs(t));if(y&&n===Ol.Left&&F<4&&_<28&&c<420)return`M ${l},${u} C ${l+A},${u} ${r-A},${f} ${r},${f}`;if(y&&n===Ol.Left&&(i==="direct-forward-left"||c<=260&&_<=210)){let J=Math.max(42,Math.min(140,c*0.48)),Q=Math.max(-28,Math.min(28,t*0.18));return`M ${l},${u} C ${l+J},${u+Q} ${r-J},${f} ${r},${f}`}if(y){let J=l+A;if(n===Ol.Top||n===Ol.Bottom){let q=n===Ol.Top?-1:1,W=f+q*(54+F*0.42);return t8([{x:l,y:u},{x:J,y:u},{x:J+Math.min(120,c*0.18),y:W},{x:r,y:W},{x:r,y:f+q*34},{x:r,y:f}])}let Q=r-A,m=(u+f)/2+t;return t8([{x:l,y:u},{x:J,y:u},{x:J+Math.min(110,c*0.16),y:m},{x:Q-Math.min(90,c*0.12),y:m},{x:Q,y:f},{x:r,y:f}])}let U=n===Ol.Bottom?1:n===Ol.Top?-1:t>=0?1:-1,w=Math.max(l,r)+92+Math.min(180,F*0.52),G=U<0?Math.min(u,f)-84-F*0.62:Math.max(u,f)+84+F*0.62;if(n===Ol.Top||n===Ol.Bottom)return t8([{x:l,y:u},{x:l+A,y:u},{x:w,y:G},{x:r,y:G},{x:r,y:f+U*38},{x:r,y:f}]);return t8([{x:l,y:u},{x:l+A,y:u},{x:w,y:G},{x:r-A,y:G},{x:r-A,y:f},{x:r,y:f}])}function zY({data:l}){return T("div",{className:"pipeline-flow-node-body"},N$.map((u)=>T(c0,{key:u.id,id:u.id,type:"target",position:u.position,isConnectable:!1,className:`pipeline-flow-handle input ${u.side} slot-${u.slot||"mid"}`,style:u.style})),A$.map((u)=>T(c0,{key:u.id,id:u.id,type:"source",position:u.position,isConnectable:!1,className:"pipeline-flow-handle output right",style:u.style})),l?.label)}function OY({id:l,sourceX:u,sourceY:r,targetX:f,targetY:n,targetPosition:t,markerEnd:i,markerStart:y,style:c,data:_}){let A=Number(_?.laneOffset||0),F=oL(u,r,f,n,t,A,String(_?.routeMode||""));return T(hy,{id:l,path:F,markerEnd:i,markerStart:y,style:c,interactionWidth:28})}var ZY={pipelineCurve:OY},HY={pipelineNode:zY};function $8(l){if(!l)return"--";let u=new Date(l);if(Number.isNaN(u.getTime()))return"--";return iu(u)}function Xf(l){let u=Number(l);if(!Number.isFinite(u)||u<0)return"--";let r=Math.round(u/1000);if(r<60)return`${r}s`;if(r<3600)return`${Math.floor(r/60)}m ${r%60}s`;return`${Math.floor(r/3600)}h ${Math.floor(r%3600/60)}m`}function HF(l){let u=Number(l);if(!Number.isFinite(u))return"--";return u.toLocaleString("zh-CN")}function VL(l){let u=Number(l);if(!Number.isFinite(u))return"--";return`${Math.round(Math.max(0,Math.min(1,u))*100)}%`}function Xl(l){return typeof l==="object"&&l!==null&&!Array.isArray(l)}function Sl(l){return Array.isArray(l)?l:[]}function dl(l){if(!l)return null;let u=new Date(l);return Number.isNaN(u.getTime())?null:u.getTime()}function J$(l){return Number.isFinite(Number(l))?new Date(Number(l)).toISOString():""}function m$(...l){for(let u of l){let r=dl(u);if(r!==null)return new Date(r).toISOString()}return""}function vF(...l){let u=l.map(dl).filter((r)=>r!==null);return u.length>0?new Date(Math.max(...u)).toISOString():""}function gF(l){return["succeeded","failed","skipped","cancelled","canceled","completed"].includes(String(l||"").toLowerCase())}function dL(l){let u=uG(l).toLowerCase();return["running","active","in-progress","in_progress"].includes(u)}function SL(l,u="status"){return l.reduce((r,f)=>{let n=String(f?.[u]||"unknown").toLowerCase();return r[n]=(r[n]||0)+1,r},{})}function eL(l){if(!l||typeof l!=="string")return null;try{let u=JSON.parse(l);return Xl(u)?u:null}catch{return null}}function BF(l){let u=l.map(eL).filter((t)=>Boolean(t)),r=u.flatMap((t)=>[t.timestamp,t.createdAt,t.updatedAt]).filter(Boolean),f=vF(...r),n=Array.from(new Set(u.map((t)=>String(t.event||t.action||t.type||"")).filter(Boolean))).slice(0,3);return{total:l.length,parsed:u.length,lastAt:f,eventKinds:n}}function _8(l){if(l===null||l===void 0)return"--";if(typeof l==="boolean")return l?"是":"否";if(typeof l==="number")return String(l);if(typeof l==="string")return l.length>80?`${l.slice(0,77)}...`:l;if(Array.isArray(l))return`${l.length} 项`;if(typeof l==="object")return`${Object.keys(l).length} 字段`;return String(l)}function lG(l,u=280){if(l===null||l===void 0)return"";let f=(typeof l==="string"?l:String(l)).replace(/\r\n/gu,` -`).trim();return f.length>u?`${f.slice(0,Math.max(0,u-1))}...`:f}function uG(l){if(typeof l==="string")return l;if(Xl(l))return String(l.status||l.state||l.phase||"unknown");return"unknown"}function BY(l){return l.filter((u)=>u&&u.value!==void 0&&u.value!==null&&String(u.value)!=="")}function PF({items:l}){let u=BY(Sl(l));return T("div",{className:"pipeline-kv-grid"},u.map((r)=>T("span",{key:r.label},T("b",null,r.label),T("span",null,r.value))))}function kF({items:l}){let u=Sl(l).map((r)=>String(r||"")).filter(Boolean);if(u.length===0)return null;return T("div",{className:"pipeline-chip-row"},u.map((r,f)=>T("span",{key:`${f}-${r}`},r)))}function CF(l,u){let r=String(u?.procedureRunId||""),f=Sl(l?.procedureRuns);return f.find((n)=>String(Pf(n))===r)||f.at(-1)||null}function DY(l,u){let r=String(u||"");if(!r)return null;return Sl(l?.procedureRuns).find((f)=>Pf(f)===r)||null}function DF(l){return Sl(l?.attempts).length}function YL(l){return Sl(l?.attempts).reduce((u,r)=>u+Q8(r).length,0)}function Q8(l){return Sl(l?.opencodeMessages?.steps).filter(Xl)}function rG(l){let u=String(l?.status||"").toLowerCase();if(["error","failed","failure"].includes(u))return"failed";if(["completed","succeeded","success"].includes(u))return"succeeded";if(["running","started","in_progress"].includes(u))return"running";return"unknown"}function VY(l,u){let r=MF(l.map((t)=>t?.agent)).slice(0,3),f=MF(l.map((t)=>t?.model)).slice(0,3),n=u.length<=2?u.map((t)=>`session ${t}`):[`sessions ${u.length}`,...u.slice(0,2).map((t)=>`session ${t}`)];return[...r.map((t)=>`agent ${t}`),...f.map((t)=>`model ${t}`),...n]}function F$(l,u=0){return String(l?.messageId||l?.index||"")||`step-${u}`}function SY({steps:l,sessionIds:u,sessionFacts:r,matchedStepKey:f}){let n=Sl(l),t=n.findIndex((G,J)=>F$(G,J)===f),i=t>=0?n[t]:null,y=n.flatMap((G)=>[dl(G?.createdAt),dl(G?.completedAt)]).filter((G)=>G!==null),c=y.length>0?Math.min(...y):null,_=y.length>0?Math.max(...y):null,A=c!==null&&_!==null?Math.max(0,_-c):null,F=n.reduce((G,J)=>G+Sl(J?.parts).filter((Q)=>String(Q?.type||"").toLowerCase()==="tool").length,0),j=n.reduce((G,J)=>G+Sl(J?.parts).filter((Q)=>["text","reasoning"].includes(String(Q?.type||"").toLowerCase())).length,0),N=n.reduce((G,J)=>G+Sl(J?.parts).filter((Q)=>String(Q?.type||"").toLowerCase()==="tool"&&rG(Q)==="failed").length,0),U=[`${n.length} steps`,`${u.length} sessions`,`${j} messages`,`${F} tools`,A!==null?`duration ${Xf(A)}`:"",N>0?`${N} failed tools`:""].filter(Boolean),w=i?[`Step ${i?.index??t+1}`,String(i?.role||"role --"),i?.model?`model ${i.model}`:"",i?.finish?`finish ${i.finish}`:"",i?.durationMs!==void 0&&i?.durationMs!==null?`duration ${Xf(i.durationMs)}`:""].filter(Boolean):[];return T("section",{className:"pipeline-trace-timeline","data-testid":"pipeline-step-timeline"},T("div",{className:"pipeline-trace-head"},T("div",null,T("b",null,"OpenCode Trace"),T("span",null,"Trace 使用 Code Queue 统一样式展示完整 agent loop;Pipeline 旧 step/message/tool 卡片样式已废弃。")),T("div",{className:"pipeline-trace-session-head","data-testid":"pipeline-step-timeline-session"},T("span",null,U.join(" / ")||"Trace"),r.length>0?T(kF,{items:r}):null)),i?T("div",{className:"pipeline-trace-focus","data-testid":"pipeline-trace-matched-step"},T("span",{className:"codex-output-channel"},"Matched"),T("strong",null,`Gantt selection -> ${w.join(" / ")}`),T("time",null,`${$8(i?.createdAt)} -> ${$8(i?.completedAt)}`)):null,T(w3,{port:iQ,input:n,className:"codex-transcript pipeline-trace",testId:"pipeline-opencode-step-trace",emptyText:"暂无 OpenCode Trace 输出",keepRecentToolCalls:3}))}function hF(l){return Sl(l).flatMap((u)=>{if(Xl(u))return[u];let r=eL(u);return r?[r]:[]})}function yn(l){return String(l?.event||l?.action||l?.requestedAction||l?.type||"").toLowerCase()}function My(l){return m$(l?.timestamp,l?.createdAt,l?.updatedAt,l?.startedAt,l?.finishedAt)}function YY(l){return dl(My(l))}function m8(l){return String(l?.attempt||l?.id||"")}function MF(l){let u=new Set,r=[];for(let f of l){let n=String(f||"");if(!n||u.has(n))continue;u.add(n),r.push(n)}return r}function XL(l){switch(String(l||"").toLowerCase()){case"monitor":return"monitor";case"webui":return"webui";case"cli":return"cli";case"system":return"runner";default:return String(l||"--")}}function $0(l){return String(l?.requestedAction||l?.action||"").toLowerCase()}function j$(l){switch($0(l)){case"guide":return"引导";case"modify":return"修改";case"approve":return"审核通过";case"restart":return"重启";case"redo":return"重做";default:return String(l?.requestedAction||l?.action||"控制")}}function PL(l){switch(yn(l)){case"initial-prompt-delivered":return"初始 prompt";case"append-prompt-delivered":return"追加 prompt";case"append-prompt-queued":return"追加 prompt 已排队";case"monitor-prompt-delivered":return"Monitor prompt";case"node-long-running-observation":return"长任务观察";case"node-finished":return"节点完成";case"oa-policy-downstream-evaluated":return"OA 下游策略";case"control-command-queued":return`${j$(l)} 已发起`;case"control-command-applied":return`${j$(l)} 已生效`;case"control-command-ignored":return`${j$(l)} 已忽略`;default:return String(l?.event||l?.action||l?.requestedAction||"event")}}function CL(l){return lG(l?.promptPreview||l?.reasonPreview||l?.prompt||l?.reason||"",240)}function XY(l){let u=String(l?.prompt||""),r=String(l?.reason||l?.restartReason||""),f=u?"":String(l?.promptPreview||""),n=r?"":String(l?.reasonPreview||"");return[u||f?{label:u?"prompt":"prompt preview",value:u||f}:null,r||n?{label:r?"reason":"reason preview",value:r||n}:null,Sl(l?.resetNodeIds).length>0?{label:"reset nodes",value:Sl(l.resetNodeIds).join(", ")}:null,Sl(l?.runningResetNodeIds).length>0?{label:"interrupted running nodes",value:Sl(l.runningResetNodeIds).join(", ")}:null,Sl(l?.interruptedProcedureRunIds).length>0?{label:"interrupted procedures",value:Sl(l.interruptedProcedureRunIds).join(", ")}:null,l?.interruptedProcedureRunId?{label:"interrupted procedure",value:String(l.interruptedProcedureRunId)}:null].filter(Boolean)}function VF(l){let u=Q8(l),r=u.map((c)=>dl(c?.createdAt)).filter((c)=>c!==null),f=u.map((c)=>dl(c?.completedAt)??dl(c?.createdAt)).filter((c)=>c!==null),n=hF(l?.controlEventRecords).map((c)=>YY(c)).filter((c)=>c!==null),t=Sl(l?.assistantOutputs).map((c)=>dl(c?.updatedAt)).filter((c)=>c!==null),i=r[0]??n[0]??t[0]??null,y=f.at(-1)??n.at(-1)??t.at(-1)??i;return{startMs:i,endMs:y}}function PY(l,u,r,f,n=""){let t=Sl(l?.procedureRuns).filter((y)=>w8(y,u)===r);if(t.length===0)return null;if(n){let y=t.find((c)=>Pf(c)===n);if(y)return y}if(f===null)return t.at(-1)||null;let i=t.find((y)=>{let c=dl(i8(y,l)),_=dl(y8(y,l))??c;return c!==null&&_!==null&&f>=c-1000&&f<=_+1000});if(i)return i;return t.slice().sort((y,c)=>{let _=dl(i8(y,l))??f,A=dl(y8(y,l))??_,F=dl(i8(c,l))??f,j=dl(y8(c,l))??F,N=Math.min(Math.abs(_-f),Math.abs(A-f)),U=Math.min(Math.abs(F-f),Math.abs(j-f));return N-U})[0]||null}function fG(l,u){let r=Sl(l?.attempts).filter(Xl);if(r.length===0)return null;let f=String(u?.attempt||"");if(f){let i=r.find((y)=>m8(y)===f);if(i)return i}let n=Number.isFinite(Number(u?.ms))?Number(u.ms):null;if(n===null)return r.at(-1)||null;let t=r.find((i)=>{let y=VF(i);return Number.isFinite(y.startMs)&&Number.isFinite(y.endMs)&&n>=Number(y.startMs)-1000&&n<=Number(y.endMs)+1000});if(t)return t;return r.slice().sort((i,y)=>{let c=VF(i),_=VF(y),A=Math.min(Math.abs(Number(c.startMs??n)-n),Math.abs(Number(c.endMs??n)-n)),F=Math.min(Math.abs(Number(_.startMs??n)-n),Math.abs(Number(_.endMs??n)-n));return A-F})[0]||r.at(-1)||null}function nG(l,u){let r=Q8(l);if(r.length===0)return{step:null,stepIndex:-1,stepKey:""};if(u===null){let t=r[0];return{step:t,stepIndex:0,stepKey:F$(t,0)}}for(let t=0;t=y-1000&&u<=c+1000)return{step:i,stepIndex:t,stepKey:F$(i,t)}}let f=r.findIndex((t)=>{let i=dl(t?.createdAt)??dl(t?.completedAt);return i!==null&&i>=u});if(f>=0){let t=r[f];return{step:t,stepIndex:f,stepKey:F$(t,f)}}let n=Math.max(0,r.length-1);return{step:r[n],stepIndex:n,stepKey:F$(r[n],n)}}function CY(l,u){let r=String(u?.runId||l?.runId||"");if(String(u?.mode||"")==="interval"){let _=u?.interval||{},A=CF(l,_)||_.raw||{};return{mode:"interval",runId:r,interval:_,marker:null,nodeId:String(_?.nodeId||w8(A,r)||""),procedure:A,attempt:null,matchedStep:null,matchedStepIndex:-1,matchedStepKey:""}}let f=Xl(u?.marker)?u.marker:{},n=Number.isFinite(Number(f?.ms))?Number(f.ms):null,t=String(f?.nodeId||""),i=t?PY(l,r,t,n,String(f?.procedureRunId||"")):null,y=i?fG(i,f):null,c=y?nG(y,n):{step:null,stepIndex:-1,stepKey:""};return{mode:"event",runId:r,interval:null,marker:f,nodeId:t,procedure:i,attempt:y,matchedStep:c.step,matchedStepIndex:c.stepIndex,matchedStepKey:c.stepKey}}function hY({procedure:l,matchedStepKey:u="",matchedAttemptId:r=""}){let f=Sl(l?.attempts);if(f.length===0)return T(qf,{title:"暂无 attempt 详情",text:"当前 procedure 还没有可展示的 attempt / OpenCode Trace;若刚点击甘特线,请等待 node 详情抓取完成。"});return f.map((n,t)=>{let i=n?.opencodeMessages||{},y=Q8(n),c=Sl(i.sessionIds).map((j)=>String(j)).filter(Boolean),_=VY(y,c),A=m8(n)||`attempt-${t+1}`,F=y.reduce((j,N)=>j+Sl(N?.parts).filter((U)=>String(U?.type||"").toLowerCase()==="tool"&&rG(U)==="failed").length,0);return T("article",{key:A,className:`pipeline-attempt-card ${r===A?"matched":""}`},T("div",{className:"pipeline-attempt-head"},T("div",null,T("strong",null,A),T("span",null,i.source||"opencode")),T("div",{className:"pipeline-attempt-badges"},T("span",null,`${y.length} steps`),T("span",null,`${i.toolCallCount??"--"} tools`),F>0?T("span",{className:"danger"},`${F} failed`):null)),T(PF,{items:[{label:"messages",value:i.messageCount??"--"},{label:"steps",value:i.stepCount??"--"},{label:"tools",value:i.toolCallCount??"--"},{label:"updated",value:Ll(i.updatedAt)},{label:"sessions",value:c.join(", ")||"--"}]}),y.length===0?T("p",{className:"muted paragraph"},"当前 attempt 尚未返回 OpenCode Trace;请确认 D601 pipeline-control 已重建并重新抓取。"):T(SY,{steps:y,sessionIds:c,sessionFacts:_,matchedStepKey:u}))})}function SF(l,u){return`${l}::${u}`}function A8(l,u,r){if(!Xl(l))return null;return String(l.runId||"")===u&&String(l.nodeId||"")===r?l:null}function MY(l,u){let r=Xl(l)?l:{};if(!Xl(u))return r;let f=Sl(u.attempts),n=Sl(r.attempts);return{...r,...u,attempts:f.length>0?f:n}}function sY(l,u,r,f){if(!A8(u,r,f))return l;let n=Sl(u.procedureRuns),t=Xl(l)?l:{};return{...t,...u,controlEvents:Sl(u.controlEvents).length>0?u.controlEvents:t.controlEvents,procedureRuns:n.length>0?n:t.procedureRuns}}function RY({selection:l,runDetails:u,nodeDetails:r,nodeDetailsState:f,onRaw:n,onCollapse:t}){if(!l?.mode)return T("aside",{className:"pipeline-gantt-detail-panel empty","data-testid":"pipeline-gantt-detail-panel"},T("div",{className:"pipeline-gantt-detail-head"},T("div",null,T("span",{className:"panel-eyebrow"},"Gantt Detail"),T(nu,{title:"未选择元素",level:3})),T("button",{type:"button",className:"ghost-btn mini",onClick:t,"data-testid":"pipeline-gantt-sidebar-collapse"},"收起")),T(qf,{title:"选择一条执行线或一个控制点",text:"点击甘特图中的 node 执行线、prompt 点或控制点,在这里查看结构化过程和 OpenCode step。"}));let i=String(l?.runId||""),y=String(l?.interval?.nodeId||l?.marker?.nodeId||""),c=u?.runId===i?u.details:null,_=A8(r,i,y),A=String(f?.runId||"")===i&&String(f?.nodeId||"")===y,F=sY(c,_,i,y),j=(String(u?.runId||"")!==i||Boolean(u?.loading))&&!F,N=String(u?.runId||"")===i?String(u?.error||""):"",U=A?String(f?.error||""):"",w=F?CY(F,l):null,G=w?.interval||l?.interval||null,J=w?.marker||l?.marker||null,Q=String(G?.procedureRunId||J?.procedureRunId||""),m=_?DY(_,Q)||CF(_,G||{procedureRunId:Q}):null,q=w?.procedure||(F?CF(F,G||{procedureRunId:Q}):null)||G?.raw||{};if(m&&(DF(q)===0||YL(m)>=YL(q)))q=MY(q,m);let W=w?.attempt||null,p=String(w?.matchedStepKey||"");if(!W&&J&&DF(q)>0)W=fG(q,J),p=String(nG(W,Number.isFinite(Number(J?.ms))?Number(J.ms):null).stepKey||"");let O=m8(W),Z=DF(q)>0,V=A&&Boolean(f?.loading)&&!Z,P=Boolean(j||V),H=[Z?"":N,U].filter(Boolean).join(" / "),B=A&&f?.fetchedAt?f.fetchedAt:u?.fetchedAt,C=uG(q?.status||G?.status||J?.status||J?.event),E=l?.mode==="event"?J?.label||PL(J?.raw||J)||"event":w?.nodeId||G?.nodeId||"node",D=J?XY(J?.raw||J):[],Y=J?[yn(J?.raw||J)?`event ${yn(J?.raw||J)}`:"",J?.promptEvent?`prompt ${J.promptEvent}`:"",J?.action?`action ${J.action}`:"",J?.sourceKind?`source ${XL(J.sourceKind)}`:"",J?.sourceNodeId?`from ${J.sourceNodeId}`:"",J?.targetNodeId?`to ${J.targetNodeId}`:"",J?.snapReason?`draw ${J.snapReason}`:""].filter(Boolean):[];return T("aside",{className:"pipeline-gantt-detail-panel","data-testid":"pipeline-gantt-detail-panel"},T("div",{className:"pipeline-gantt-detail-head"},T("div",null,T("span",{className:"panel-eyebrow"},l?.mode==="event"?"Gantt Event Detail":"Gantt Line Detail"),T(nu,{title:E,level:3,loading:P})),T("div",{className:"pipeline-gantt-detail-head-actions"},T(_i,{status:C},C),T("button",{type:"button",className:"ghost-btn mini",onClick:t,"data-testid":"pipeline-gantt-sidebar-collapse"},"收起"))),J?T("article",{className:"pipeline-event-card"},T("div",{className:"pipeline-event-card-head"},T("strong",null,J?.label||PL(J?.raw||J)),T(kF,{items:Y})),T(PF,{items:[{label:"event time",value:Ll(J?.timestampIso||J?.timestamp||"--")},J?.snapped?{label:"drawn time",value:Ll(J?.renderedTimestampIso||J?.ms)}:null,{label:"node",value:J?.nodeId||"--"},{label:"procedure",value:J?.procedureRunId||Pf(q)||"--"},{label:"attempt",value:J?.attempt||O||"--"},{label:"source kind",value:J?.sourceKind?XL(J.sourceKind):"--"},{label:"source node",value:J?.sourceNodeId||"--"},{label:"target node",value:J?.targetNodeId||"--"},{label:"command",value:J?.commandId||J?.eventId||"--"},J?.snapReason?{label:"placement",value:J.snapReason}:null]}),D.length>0?T("div",{className:"pipeline-event-blocks"},D.map((v,K)=>T("section",{key:`${v.label}-${K}`,className:"pipeline-event-text-block"},T("b",null,v.label),T("p",null,v.value)))):null,CL(J?.raw||J)?T("p",{className:"pipeline-text-preview"},CL(J?.raw||J)):null):null,T(PF,{items:[{label:"epoch",value:i||G?.runId||"--"},{label:"node",value:w?.nodeId||G?.nodeId||J?.nodeId||"--"},{label:"procedure",value:G?.procedureRunId||J?.procedureRunId||Pf(q)||"--"},{label:"started",value:Ll(G?.startedAt||q?.startedAt)},{label:"finished",value:Ll(G?.finishedAt||q?.finishedAt)},{label:"duration",value:Xf(G?.durationMs||q?.durationMs)},{label:"fetched",value:B?iu(B):"--"},w?.matchedStep?{label:"matched step",value:`Step ${w.matchedStep.index??w.matchedStepIndex+1}`}:null]}),T(el,{error:H}),T("div",{className:"pipeline-gantt-detail-actions"},T(cn,{title:`Procedure ${G?.procedureRunId||J?.procedureRunId||w?.nodeId||"node"}`,data:q,onOpen:n,testId:"raw-pipeline-gantt-procedure"}),J?T(cn,{title:`Pipeline event ${J?.id||J?.commandId||J?.eventId||w?.nodeId||"event"}`,data:J?.raw||J,onOpen:n,testId:"raw-pipeline-gantt-event"}):null,F?T(cn,{title:`Pipeline run ${i||"--"}`,data:F,onOpen:n,testId:"raw-pipeline-gantt-node-details"}):null),!P&&!Pf(q)&&!J?T(qf,{title:"暂无过程详情",text:"当前选择还没有可匹配的 procedure 运行记录。"}):null,!P&&Pf(q)?T(hY,{procedure:q,matchedStepKey:p,matchedAttemptId:O}):null)}function xY({value:l}){let r=String(l||"--").split(/([_-])/u);return T($i.default.Fragment,null,r.map((f,n)=>f==="-"||f==="_"?T($i.default.Fragment,{key:n},f,T("wbr",null)):T($i.default.Fragment,{key:n},f)))}async function ii(l,u={}){return Tl(l,{invalidJsonPrefix:"Pipeline 返回了无效 JSON",...u})}function _i({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return T("span",{className:`status-badge ${r}`},u||l||"unknown")}function sr({label:l,value:u,hint:r,tone:f}){return T("article",{className:`metric-card ${f||""}`},T("div",{className:"metric-label"},l),T("div",{className:"metric-value"},u),T("div",{className:"metric-hint"},r))}function Zn({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return T("section",{className:`panel ${n||""}`},T("div",{className:"panel-head"},T("div",null,u?T("p",{className:"panel-eyebrow"},u):null,T(nu,{title:l,loading:t})),r?T("div",{className:"panel-actions"},r):null),T("div",{className:"panel-body"},f))}function cn({title:l,data:u,onOpen:r,testId:f}){return T("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function Yf({title:l,subtitle:u,facts:r,data:f,onRaw:n,testId:t}){let i=Sl(r).map((y)=>String(y||"")).filter(Boolean);return T("article",{className:"pipeline-evidence-row"},T("div",{className:"pipeline-evidence-main"},T("strong",null,l),u?T("span",null,u):null),T("div",{className:"pipeline-evidence-facts"},i.map((y,c)=>T("span",{key:`${c}-${y.slice(0,16)}`},y))),f!==void 0?T(cn,{title:l,data:f,onOpen:n,testId:t}):null)}function qf({title:l,text:u}){return T("div",{className:"empty-state"},T("strong",null,l),T("span",null,u))}function bY(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function vY(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function gY(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function kY(l){return{components:Array.isArray(l?.registry?.components)?l.registry.components:[],pipelines:Array.isArray(l?.pipelines)?l.pipelines:[],runs:Array.isArray(l?.runs)?l.runs:[]}}function hL(l,u,r){let f=l?._unidesk?.arrayLimits?.[u],n=Number(f?.originalLength);return Number.isFinite(n)?n:r}function tG(l){if(!l||typeof l!=="object"||Array.isArray(l))return"--";return`${l.componentClass||"--"}/${l.id||"--"}`}function F8(l){if(!l||typeof l!=="object"||Array.isArray(l))return"";let u=String(l.componentClass||"").trim(),r=String(l.id||"").trim();return u&&r?`${u}/${r}`:""}function IF(l){return l?.config&&typeof l.config==="object"&&!Array.isArray(l.config)?l.config:{}}function iG(l){let u=IF(l),r=Array.isArray(u.nodes)?u.nodes:Array.isArray(l?.nodes)?l.nodes:[],f=new Map;for(let i of r){let y=String(i?.id||i?.nodeId||"");if(y)f.set(y,{...i,id:y})}let n=aF(l),t=(i)=>{if(i&&!f.has(i))f.set(i,{id:i})};for(let i of oF(l))U$(i).forEach(t);for(let i of n)t(String(i?.from||i?.source||"")),t(String(i?.to||i?.target||""));return Array.from(f.values())}function aF(l){let u=IF(l);return Array.isArray(u.edges)?u.edges:Array.isArray(l?.edges)?l.edges:[]}function oF(l){let u=IF(l);return Array.isArray(u.topologicalBatches)?u.topologicalBatches:Array.isArray(l?.topologicalBatches)?l.topologicalBatches:[]}function IY(l){let u=new Map;for(let r of l){let f=F8(r);if(f)u.set(f,r);let n=Array.isArray(r?.refs)?r.refs:[];for(let t of n){let i=F8(t);if(i)u.set(i,r)}}return u}function ML(l,u){let r=u.get(F8(l?.componentRef));if(r)return r;let f=F8({componentClass:l?.kind,id:l?.id});return f?u.get(f)||null:null}function sL(l,u){let r=yG(l,u);return String(r?.status||"pending")}function yG(l,u){return(Array.isArray(l?.nodes)?l.nodes:[]).find((f)=>f?.nodeId===u||f?.id===u)||null}function aY(l){return l.reduce((u,r)=>{let f=String(r?.status||"unknown").toLowerCase();return u[f]=(u[f]||0)+1,u},{})}function oY(l){if(Array.isArray(l?.scorers))return l.scorers.filter(Xl);if(Array.isArray(l?.summary?.scorers))return l.summary.scorers.filter(Xl);if(Array.isArray(l?.artifact?.summary?.scorers))return l.artifact.summary.scorers.filter(Xl);return[]}function dY(l){if(Xl(l?.run))return l.run;if(Xl(l?.runSummary))return l.runSummary;return null}function eY(l,u){if(!Xl(l)&&!Xl(u))return null;if(!Xl(l))return u;if(!Xl(u))return l;return{...l,...u,request:Xl(l.request)||Xl(u.request)?{...Xl(l.request)?l.request:{},...Xl(u.request)?u.request:{}}:u.request??l.request,artifact:Xl(l.artifact)||Xl(u.artifact)?{...Xl(l.artifact)?l.artifact:{},...Xl(u.artifact)?u.artifact:{}}:u.artifact??l.artifact,summary:Xl(l.summary)||Xl(u.summary)?{...Xl(l.summary)?l.summary:{},...Xl(u.summary)?u.summary:{}}:u.summary??l.summary}}function j8(l){let u=oY(l),r=u.find((A)=>Xl(A?.score))||u[0]||null,f=Xl(r?.score)?r.score:{},n=Number(f.passed),t=Number(f.total),i=Number(f.ratio),y=Number.isFinite(i)?i:Number.isFinite(n)&&Number.isFinite(t)&&t>0?n/t:null,c=y===null?null:Math.round(Math.max(0,Math.min(100,y<=1?y*100:y))),_=String(f.text||(Number.isFinite(n)&&Number.isFinite(t)?`${n}/${t}`:""));return{scorer:r,scorers:u,score:f,passed:Number.isFinite(n)?n:null,total:Number.isFinite(t)?t:null,percent:c,text:_}}function sF(l){let u=j8(l);return u.text||(u.scorers.length>0?String(u.scorer?.status||"pending"):"--")}function dF(l){let u=j8(l);if(u.total>0&&u.passed===u.total)return"succeeded";if(u.total>0&&u.passed>0)return"running";if(u.scorers.length>0)return"failed";return"pending"}function lX(l){return Array.isArray(l?.items)?l.items.filter(Xl):[]}function uX({run:l}){let u=sF(l);return T("span",{className:`pipeline-score-badge ${dF(l)}`},`score ${u}`)}function rX({run:l,onRaw:u}){let f=j8(l).scorers;if(!l)return T(qf,{title:"暂无评分",text:"选择一个 epoch 后会显示 scorer 结果。"});if(f.length===0)return T("div",{className:"pipeline-score-empty"},T("strong",null,"评分器等待中"),T("span",null,"DAG 完成后,Pipeline control backend 会把 scorer summary 追加到 run artifact,并通过 UniDesk 显示。"));return T("div",{className:"pipeline-score-board","data-testid":"pipeline-score-board"},f.map((n,t)=>{let i=j8({scorers:[n]}),y=lX(n),c=i.percent??0;return T("article",{key:`${n.scorerId||n.component||t}`,className:`pipeline-score-card ${dF({scorers:[n]})}`},T("div",{className:"pipeline-score-head"},T("div",null,T("span",null,n.scorerId||n.component||"scorer"),T("strong",null,i.text||n.status||"--")),T(_i,{status:n.status||"unknown"},n.status||"unknown")),T("div",{className:"pipeline-score-meter","aria-label":`score ${c}%`},T("span",{style:{width:`${c}%`}})),T("div",{className:"pipeline-score-facts"},T("span",null,`${c}%`),T("span",null,n.component||"--"),T("span",null,n.applicationCheckoutRef||"--")),y.length>0?T("div",{className:"pipeline-score-items"},y.map((_)=>T("span",{key:`${_.id||_.filter}`,className:`pipeline-score-item ${String(_.status||"").toLowerCase()}`,title:`${_.filter||"--"} / ran=${_.ran??"?"}`},T("b",null,_.id||"--"),T("small",null,_.status||"--")))):T("p",{className:"muted paragraph"},"当前 scorer 尚未返回 item 级结果。"),n.error?T("p",{className:"pipeline-score-error"},lG(n.error,360)):null,T("div",{className:"panel-actions inline-actions"},T(cn,{title:`Scorer ${n.scorerId||t}`,data:n,onOpen:u,testId:"raw-pipeline-score"})))}))}function fX(l){let u=l.reduce((r,f)=>{let n=String(f?.componentClass||"unknown");return r[n]=(r[n]||0)+1,r},{});return Object.entries(u).map(([r,f])=>({name:r,count:Number(f)})).sort((r,f)=>f.count-r.count||r.name.localeCompare(f.name))}function U$(l){if(Array.isArray(l))return l.map((u)=>typeof u==="string"?u:String(u?.id||u?.nodeId||"")).filter(Boolean);if(Array.isArray(l?.nodes))return U$(l.nodes);if(Array.isArray(l?.nodeIds))return U$(l.nodeIds);return[]}function nX(l){return Xl(l?.instanceInputs?.monitor)?l.instanceInputs.monitor:{}}function cG(l,u){if(String(l?.kind||"").toLowerCase()!=="procedure")return!1;let r=nX(l);if(l?.instanceInputs?.monitorMode===!0||r.enabled===!0)return!0;let f=tG(l?.componentRef);return String(u?.id||u?.config?.id||f||"").toLowerCase().includes("monitor")}function tX(l){return l.filter((u)=>cG(u)).map((u)=>String(u?.id||"")).filter(Boolean)}function iX(l,u){if(u.length===0)return l;let r=new Set(u),f=u.filter((n)=>l.includes(n));if(f.length===0)return l;return[...f,...l.filter((n)=>!r.has(n))]}function yX(l,u){if(u.length===0)return l;let r=new Set(u),f=u.filter((t)=>l.some((i)=>i.includes(t)));if(f.length===0)return l;let n=l.map((t)=>t.filter((i)=>!r.has(i))).filter((t)=>t.length>0);return[f,...n]}function cX(l,u,r){let n=oF(l).map(U$).filter((j)=>j.length>0);if(n.length>0)return n;let t=u.map((j)=>String(j?.id||"")).filter(Boolean),i=new Set(t),y=new Map(t.map((j)=>[j,0])),c=new Map(t.map((j)=>[j,[]]));for(let j of r){let N=String(j?.from||j?.source||""),U=String(j?.to||j?.target||"");if(!i.has(N)||!i.has(U))continue;c.get(N)?.push(U),y.set(U,(y.get(U)||0)+1)}let _=new Map,A=t.filter((j)=>(y.get(j)||0)===0);for(let j of A)_.set(j,0);while(A.length>0){let j=A.shift(),N=(_.get(j)||0)+1;for(let U of c.get(j)||[])if(y.set(U,Math.max(0,(y.get(U)||0)-1)),_.set(U,Math.max(_.get(U)||0,N)),(y.get(U)||0)===0)A.push(U)}t.forEach((j)=>{if(!_.has(j))_.set(j,0)});let F=Math.max(0,...Array.from(_.values()));return Array.from({length:F+1},(j,N)=>t.filter((U)=>_.get(U)===N)).filter((j)=>j.length>0)}function $X(l,u,r){let n=oF(l).map(U$).filter((y)=>y.length>0),t=n.length>0?n.flatMap((y)=>y):(()=>{let y=u.map((w)=>String(w?.id||"")).filter(Boolean),c=new Set(y),_=r.filter((w)=>String(w?.edgeType||"").toLowerCase()!=="rework"),A=new Map(y.map((w)=>[w,0])),F=new Map(y.map((w)=>[w,[]]));for(let w of _){let G=String(w?.from||w?.source||""),J=String(w?.to||w?.target||"");if(!c.has(G)||!c.has(J))continue;F.get(G)?.push(J),A.set(J,(A.get(J)||0)+1)}let j=new Map,N=y.filter((w)=>(A.get(w)||0)===0);for(let w of N)j.set(w,0);while(N.length>0){let w=N.shift(),G=(j.get(w)||0)+1;for(let J of F.get(w)||[])if(A.set(J,Math.max(0,(A.get(J)||0)-1)),j.set(J,Math.max(j.get(J)||0,G)),(A.get(J)||0)===0)N.push(J)}y.forEach((w)=>{if(!j.has(w))j.set(w,0)});let U=Math.max(0,...Array.from(j.values()));return Array.from({length:U+1},(w,G)=>y.filter((J)=>j.get(J)===G)).flatMap((w)=>w)})(),i=new Set(t);for(let y of u){let c=String(y?.id||"");if(!c||i.has(c))continue;t.push(c),i.add(c)}return iX(t,tX(u))}function $$(l){return`${l.source}->${l.target}-${l.index}`}function RL(l,u,r){let f=iG(l),n=aF(l),t=IY(r),i=new Map(f.map((C)=>[String(C?.id||""),C])),y=f.filter((C)=>cG(C,ML(C,t))).map((C)=>String(C?.id||"")).filter(Boolean),c=yX(cX(l,f,n),y),_=[],A=new Map,F=330,j=122;c.forEach((C,E)=>{let D=C.length*122;C.forEach((Y,v)=>{let K=i.get(Y)||{id:Y},X=ML(K,t),I=sL(u,Y).toLowerCase(),o=String(K.kind||X?.componentClass||"node").toLowerCase(),fl=tG(K.componentRef||X),yl=String(X?.config?.version||X?.version||""),h=String(X?.config?.description||X?.description||""),s=v*122-Math.floor(D/2);A.set(Y,{column:E,row:v,y:s}),_.push({id:Y,type:"pipelineNode",position:{x:E*330,y:s},data:{exportLabel:{id:Y,kind:o,componentRef:fl,componentVersion:yl,componentDescription:h,status:I},label:T("div",{className:"flow-node-label"},T("strong",null,Y),T("span",null,o),T("code",{title:h||fl},yl?`${fl}@${yl}`:fl),T(_i,{status:I},I))},className:`pipeline-flow-node ${o} ${I}`})})});let N=n.flatMap((C,E)=>{let D=String(C?.from||C?.source||""),Y=String(C?.to||C?.target||"");if(!i.has(D)||!i.has(Y))return[];return[{source:D,target:Y,index:E,condition:C?.condition,edgeType:C?.edgeType}]}),U=N.reduce((C,E)=>C.set(E.source,(C.get(E.source)||0)+1),new Map),w=N.reduce((C,E)=>C.set(E.target,(C.get(E.target)||0)+1),new Map),G=N.reduce((C,E)=>{let D=`${E.source}->${E.target}`;return C.set(D,(C.get(D)||0)+1)},new Map),J=new Map,Q=new Map,m=new Map,q=new Map,W=new Map,p=new Map,O=N.reduce((C,E)=>{let D=A.get(E.source),Y=A.get(E.target),v=(Y?.column||0)-(D?.column||0);if(v<=0||String(E.edgeType||"").toLowerCase()==="rework"||v!==1)return C;let X=`${E.source}->column:${Y?.column??""}`,I=C.get(X)||[];return I.push(E),C.set(X,I),C},new Map);for(let C of O.values()){if(C.length<2)continue;C.slice().sort((E,D)=>{let Y=A.get(E.target),v=A.get(D.target);return(Y?.y||0)-(v?.y||0)||E.index-D.index}).forEach((E,D,Y)=>{p.set($$(E),{slot:D-(Y.length-1)/2,count:Y.length})})}[...N].sort((C,E)=>{let D=A.get(C.source),Y=A.get(C.target),v=A.get(E.source),K=A.get(E.target),X=Math.abs((Y?.column||0)-(D?.column||0))*330+Math.abs((Y?.y||0)-(D?.y||0)),I=Math.abs((K?.column||0)-(v?.column||0))*330+Math.abs((K?.y||0)-(v?.y||0));return X-I||C.index-E.index}).forEach((C)=>{let E=A.get(C.source)||{column:0,row:0,y:0},D=A.get(C.target)||{column:0,row:0,y:0},Y=D.column-E.column,v=Math.max(0,Y),K=Y<=0||String(C.edgeType||"").toLowerCase()==="rework",X=E.y-D.y,I=w.get(C.target)||1,o=p.has($$(C)),fl=!K&&v<=1&&(o||I===1),yl=W.get(C.target)||new Map;W.set(C.target,yl);let h=N$.slice().sort((s,ul)=>{let tl=(El)=>{let M=String(El.side),d=0;if(K){if(M==="left")d+=86;if(M==="top")d+=D.y<=0?-22:12;if(M==="bottom")d+=D.y>=0?-22:12;if(Math.abs(D.y)<12&&M!=="left")d+=C.index%2===0?M==="top"?-6:6:M==="bottom"?-6:6;return d}if(fl){if(M==="left")d-=o?72:44;if(M!=="left")d+=o?72:44;return d+Math.abs(X)*0.02}if(M==="left")d+=v<=1?0:24;if(M==="top")d+=X<-36?-18:42;if(M==="bottom")d+=X>36?-18:42;if(v<=1&&Math.abs(X)<=82&&M!=="left")d+=38;if(v>1&&M!=="left")d-=10;return d},Al=E.y-D.y,Kl=Al!==0?Al:C.index%2===0?-1:1,wl=(El)=>{let M=yl.get(El.id)||0;return tl(El)+M*64+pY(El,yl,Kl)};return wl(s)-wl(ul)||String(s.id).localeCompare(String(ul.id))})[0];yl.set(h.id,(yl.get(h.id)||0)+1),q.set($$(C),h)});let V=N.map((C)=>{let E=sL(u,C.target).toLowerCase(),D=`${C.source}->${C.target}`,Y=J.get(C.source)||0,v=Q.get(C.target)||0,K=m.get(D)||0;J.set(C.source,Y+1),Q.set(C.target,v+1),m.set(D,K+1);let X=Y-((U.get(C.source)||1)-1)/2,I=v-((w.get(C.target)||1)-1)/2,o=K-((G.get(D)||1)-1)/2,fl=A.get(C.source),yl=A.get(C.target),h=(yl?.column||0)-(fl?.column||0),s=Math.max(1,Math.abs(h)),ul=h<=0||String(C.edgeType||"").toLowerCase()==="rework",tl=Math.abs((yl?.y||0)-(fl?.y||0)),Al=p.get($$(C)),Kl=!ul&&h===1&&(w.get(C.target)||0)>1,wl=Al?Al.slot:o*2+X+I*0.45,El=wl===0?C.index%2===0?-1:1:Math.sign(wl),M=q.get($$(C))||N$[1],d=M.side==="top"?-1:M.side==="bottom"?1:El,nl=ul||s>1||tl>96||Math.abs(wl)>0.2||M.side!=="left",k=ul?118+s*18:22+s*16,g=M.side==="left"?0:28,cl=nl?Math.max(-280,Math.min(280,d*Math.min(180,k+g+tl*0.22)+wl*28)):0,pl=Math.max(0,Math.min(A$.length-1,Math.round(X+(A$.length-1)/2))),Hl=A$[pl]||A$[1],bl=E==="succeeded"?"var(--accent-2)":E==="running"?"var(--accent)":E==="failed"?"var(--danger)":"rgba(129, 147, 159, 0.78)",_u=fl?.column||0,tu=yl?.column||0,Nu=cl===0?0:Math.sign(cl),gl=ul?`feedback:${_u}->${tu}:${Nu}`:Al?`fanout:${_u}->${tu}:${C.source}`:Kl?`fanin:${_u}->${tu}:${C.target}`:M.side!=="left"||s>1?`corridor:${_u}->${tu}:${M.side}:${Nu}:${Math.round(Math.abs(cl)/56)}`:"";return{id:`${C.source}->${C.target}-${C.index}`,source:C.source,target:C.target,sourceHandle:Hl.id,targetHandle:M.id,type:"pipelineCurve",zIndex:12,animated:E==="running",data:{baseEdgeColor:bl,laneOffset:cl,routeMode:Al&&M.side==="left"?"direct-forward-left":"",targetSide:M.side,isFeedback:ul,overlapGroup:gl},targetStatus:E}}),P=V.reduce((C,E)=>{let D=String(E.data?.overlapGroup||"");return D?C.set(D,(C.get(D)||0)+1):C},new Map),H=new Map,B=V.map((C)=>{let E=String(C.targetStatus||"pending"),D={...C};delete D.targetStatus;let Y=String(C.data?.overlapGroup||""),v=Y?P.get(Y)||0:0,K=v>1?H.get(Y)||0:-1;if(v>1)H.set(Y,K+1);let X=K>=0?ZL[K%ZL.length]:String(C.data.baseEdgeColor),I={stroke:X};if(C.data.isFeedback)I.strokeDasharray="9 7";return{...D,data:{...C.data,edgeColor:X,overlapSlot:K,overlapCount:v},style:I,markerEnd:{type:ri.ArrowClosed,color:X},className:`pipeline-flow-edge ${E} ${C.data.isFeedback?"feedback":""} ${K>=0?"overlap-colored":""}`}});return{nodes:_,edges:B}}function uf(l){return String(l??"").replace(/&/g,"&").replace(//g,">").replace(/"/g,""")}function xL(l){let u=String(l||"");if(u.includes("--accent-2"))return"#4eb7a8";if(u.includes("--accent"))return"#d7a13a";if(u.includes("--danger"))return"#cf6a54";return u.startsWith("#")?u:"#81939f"}function N8(l){return`arrow-${l.replace(/[^a-zA-Z0-9_-]+/g,"")}`}function $G(l,u="pipeline"){return String(l||u).replace(/[^a-zA-Z0-9_-]+/g,"-").replace(/^-|-$/g,"")||u}function bL(l,u){let r=l.position.x,f=l.position.y,n=N$.find((t)=>t.id===u);if(n?.side==="top")return{x:r+sy*DL(n.style?.left,0.5),y:f,position:Ol.Top};if(n?.side==="bottom")return{x:r+sy*DL(n.style?.left,0.5),y:f+Ry,position:Ol.Bottom};return{x:r,y:f+Ry/2,position:Ol.Left}}function _X(l){return{x:l.position.x+sy,y:l.position.y+Ry/2}}function AX(l,u){let r=Math.min(...l.nodes.map((w)=>w.position.x),0)-220,f=Math.min(...l.nodes.map((w)=>w.position.y),0)-220,n=Math.max(...l.nodes.map((w)=>w.position.x+sy),1)+220,t=Math.max(...l.nodes.map((w)=>w.position.y+Ry),1)+220,i=Math.ceil(n-r),y=Math.ceil(t-f),c=new Map(l.nodes.map((w)=>[w.id,w])),_=l.edges.map((w)=>xL(w.data?.edgeColor||w.style?.stroke)),F=Array.from(new Set(["#4eb7a8","#d7a13a","#cf6a54","#81939f",..._])).map((w)=>``).join(""),j=l.edges.flatMap((w)=>{let G=c.get(w.source),J=c.get(w.target);if(!G||!J)return[];let Q=_X(G),m=bL(J,String(w.targetHandle||"in-left")),q=oL(Q.x,Q.y,m.x,m.y,m.position,Number(w.data?.laneOffset||0),String(w.data?.routeMode||"")),W=xL(w.data?.edgeColor||w.style?.stroke),p=w.data?.isFeedback?' stroke-dasharray="9 7"':"";return``}).join(` -`),N=l.nodes.map((w)=>{let G=w.data?.exportLabel||{},J=String(G.status||"pending").toLowerCase(),Q=J==="succeeded"?"#4eb7a8":J==="running"?"#d7a13a":J==="failed"?"#cf6a54":"#81939f",m=w.position.x,q=w.position.y,W=N$.map((p)=>{let O=bL(w,p.id);if(p.side==="top"||p.side==="bottom")return``;return``}).join(` +`)),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(` `);return` - - ${W} - - ${uf(G.id||w.id)} - ${uf(G.kind||"node")} - ${uf(G.componentRef||"--")} - ${uf(J)} + + ${Z} + + ${$0(w.id||L.id)} + ${$0(w.kind||"node")} + ${$0(w.componentRef||"--")} + ${$0(W)} `}).join(` -`);return{svg:` - ${F} +`);return{svg:` + ${Q} - ${uf(u)} - ${N}${j} - `,width:i,height:y}}function FX(l){let u=String(l||"").toLowerCase();if(u==="succeeded"||u==="completed")return"#4eb7a8";if(u==="failed")return"#cf6a54";if(dL(u))return"#69aee8";return"#d7a13a"}function jX(l){let u=String(l?.kind||""),r=String(l?.tone||l?.status||"").toLowerCase();if(u==="prompt"&&r==="initial")return"#d7a13a";if(u==="prompt"&&r==="monitor")return"#69aee8";if(u==="prompt")return"#4eb7a8";if(r==="modify")return"#e0b95a";if(r==="approve"||r==="guide"||r==="monitor")return"#4eb7a8";if(r==="restart"||r==="redo")return"#d7a13a";if(r==="ignored")return"#81939f";if(r==="webui")return"#69aee8";if(r==="cli")return"#d7a13a";return"#a7bac5"}function vL(l){let u=String(l?.sourceKind||"").toLowerCase(),r=String(l?.action||"").toLowerCase(),f=String(l?.status||"").toLowerCase();if(r==="observe"||f==="observation"||u==="monitor")return"#4eb7a8";if(u==="webui")return"#69aee8";if(u==="cli")return"#d7a13a";if(f.includes("ignored"))return"#81939f";return"#8aa0ad"}function NX(l,u,r){let f=jX(l),n=String(l?.kind||"");if(n==="control-source")return``;if(n==="control-target"){let i=String(l?.tone||"").toLowerCase()==="approve"?"rgba(78,183,168,0.22)":"#081118";return``}return``}function JX(l){let u=Sl(l.visibleNodeIds).map((K)=>String(K||"")).filter(Boolean),r=Sl(l.intervals).filter(Xl),f=Sl(l.markers).filter(Xl),n=Sl(l.arrows).filter(Xl),t=Sl(l.ticks).filter(Xl),i=Xl(l.bounds)?l.bounds:{},y=Xl(l.backendLayout)?l.backendLayout:null,c=Math.max(240,Math.round(Number(l.chartHeight||360))),_=Math.max(On,108),A=128,F=24,j=58,N=56,U=128+Math.max(1,u.length)*_,w=Math.max(760,U+48),G=114+c+24,J=24,Q=58,m=114,q=(K)=>152+K*_,W=(K)=>q(K)+_/2,p=Sl(l.meta).map((K)=>String(K||"")).filter(Boolean).slice(0,4).join(" · "),O=new Map(f.map((K)=>[String(K.id||""),K])),V=Array.from(new Set(["#4eb7a8","#69aee8","#d7a13a","#cf6a54","#8aa0ad",...n.map(vL)])).map((K)=>``).join(""),P=t.map((K)=>{let X=114+QG(K,i,c,y);return` - - ${uf(Ll(K.ms))} - +${uf(Xf(Number(K.offsetMs??Number(K.ms)-Number(i.startMs))))} + ${$0(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` + + ${$0(Hu(O.ms))} + +${$0(k0(Number(O.offsetMs??Number(O.ms)-Number(_.startMs))))} `}).join(` -`),H=['','TIME',...u.map((K,X)=>{let I=q(X),o=K.length>18?`${K.slice(0,16)}…`:K;return` - - ${uf(o)} - node ${X+1} +`),Y=['','TIME',...l.map((O,C)=>{let g=z(C),a=O.length>18?`${O.slice(0,16)}…`:O;return` + + ${$0(a)} + node ${C+1} `})].join(` -`),B=u.map((K,X)=>{return``}).join(` -`),C=r.map((K)=>{let X=u.indexOf(String(K.nodeId||""));if(X<0)return"";let I=114+U8(K,i,c,y),o=Math.max(2,UG(K,i,c,y)),fl=FX(K.status),yl=W(X)-3.5,h=K.live?``:"",s=o>=28?`${uf(String(K.status||"working"))} - ${uf(Xf(K.durationMs))}`:"";return` - - ${h} - ${s} +`),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` + + ${R} + ${x} `}).join(` -`),E=f.map((K)=>{let X=u.indexOf(String(K.nodeId||""));if(X<0)return"";let I=114+wf(K,i,c,y);return NX(K,W(X),I)}).join(` -`),D=n.map((K)=>{let X=O.get(String(K.targetMarkerId||""));if(!X)return"";let I=O.get(String(K.sourceMarkerId||"")),o=String(I?.nodeId||K.sourceNodeId||""),fl=String(X.nodeId||K.targetNodeId||""),yl=u.indexOf(o),h=u.indexOf(fl);if(yl<0||h<0)return"";let s=W(yl)-24-128,ul=W(h)-24-128,tl=xy(y)?hu(K.sourceY??K.y1)??(I?wf(I,i,c,y):wf(X,i,c,y)):I?wf(I,i,c,y):wf(X,i,c,y),Al=xy(y)?hu(K.targetY??K.y2)??wf(X,i,c,y):wf(X,i,c,y),Kl=vL(K),wl=String(K.action||"").toLowerCase()==="observe"?"3 4":"6 5",El=uf(mG(s,tl,ul,Al));return` - `}).join(` -`),Y=u.length===0?'No visible Gantt nodes':"";return{svg:` - ${V} +`),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:` + ${S} - - ${uf(l.title||"Pipeline Epoch Gantt")} - ${uf(p)} - ${H} - - ${B} - ${P} - ${C} - ${D} - ${E} + + ${$0(u.title||"Pipeline Epoch Gantt")} + ${$0(T)} ${Y} - `,width:w,height:G}}function J8(l,u){let r=URL.createObjectURL(l),f=document.createElement("a");f.href=r,f.download=u,f.click(),setTimeout(()=>URL.revokeObjectURL(r),1000)}async function _G(l,u){let r=$G(u,"pipeline"),{svg:f,width:n,height:t}=AX(l,u),i=new Blob([f],{type:"image/svg+xml;charset=utf-8"}),y=URL.createObjectURL(i);try{let c=new Image;await new Promise((j,N)=>{c.onload=()=>j(),c.onerror=()=>N(Error("svg image load failed")),c.src=y});let _=document.createElement("canvas");_.width=n,_.height=t;let A=_.getContext("2d");if(!A)throw Error("canvas unavailable");A.drawImage(c,0,0);let F=await new Promise((j)=>_.toBlob(j,"image/png"));if(!F)throw Error("png export failed");J8(F,`${r}.png`)}catch{J8(i,`${r}.svg`)}finally{URL.revokeObjectURL(y)}}async function UX(l){let u=$G(String(l?.title||"pipeline-gantt"),"pipeline-gantt"),{svg:r,width:f,height:n}=JX(l),t=new Blob([r],{type:"image/svg+xml;charset=utf-8"}),i=URL.createObjectURL(t);try{let y=new Image;await new Promise((F,j)=>{y.onload=()=>F(),y.onerror=()=>j(Error("gantt svg image load failed")),y.src=i});let c=document.createElement("canvas");c.width=f,c.height=n;let _=c.getContext("2d");if(!_)throw Error("canvas unavailable");_.drawImage(y,0,0);let A=await new Promise((F)=>c.toBlob(F,"image/png"));if(!A)throw Error("gantt png export failed");J8(A,`${u}.png`)}catch{J8(t,`${u}.svg`)}finally{URL.revokeObjectURL(i)}}async function QX(l){for(let u of l){if(u.flow.nodes.length===0)continue;await _G(u.flow,u.title),await new Promise((r)=>setTimeout(r,750))}}function gL(l,u){return l.find((r)=>String(r?.pipelineId||"")===u)||null}function kL(l){return dl(l?.startedAt)??dl(l?.artifact?.startedAt)??dl(l?.request?.createdAt)??dl(l?.updatedAt)??0}function mX(l,u){return l.filter((r)=>String(r?.pipelineId||"")===u).slice().sort((r,f)=>kL(r)-kL(f)||String(r?.runId||"").localeCompare(String(f?.runId||"")))}function RF(l,u){let r=String(u?.runId||""),f=l.findIndex((i)=>String(i?.runId||"")===r),n=f>=0?f+1:l.length,t=String(u?.status||"--");return`Epoch ${n} / ${r||"--"} / ${t}`}function Pf(l){return String(l?.procedureRunId||l?.runId||"")}function w8(l,u){let r=String(l?.nodeId||l?.request?.nodeId||"");if(r)return r;let f=Pf(l),n=`${u}__`;if(f.startsWith(n))return f.slice(n.length).replace(/__\d+$/u,"");return""}function i8(l,u){let r=Xl(l?.artifact)?l.artifact:{},f=Xl(l?.request)?l.request:{};return m$(l?.startedAt,r.startedAt,f.createdAt,f.startedAt,l?.createdAt,l?.updatedAt,u?.startedAt,u?.request?.createdAt)}function y8(l,u){let r=String(l?.status?.status||l?.artifact?.status||l?.status||"").toLowerCase(),f=Xl(l?.artifact)?l.artifact:{},n=gF(r);return m$(l?.finishedAt,f.finishedAt,l?.completedAt,n?l?.updatedAt:void 0,n?f.updatedAt:void 0,n?u?.updatedAt:void 0)}function AG(l,u,r=Date.now()){let f=String(l?.runId||""),n=new Set(u.map((t)=>String(t?.id||"")).filter(Boolean));return Sl(l?.procedureRuns).flatMap((t)=>{let i=w8(t,f);if(!i)return[];let y=String(t?.status?.status||t?.artifact?.status||t?.status||"unknown").toLowerCase(),c=i8(t,l),_=dl(c);if(_===null)return[];let A=y8(t,l),F=dl(A)??(gF(y)?dl(t?.updatedAt)??_+1000:r),j=Math.max(_+1000,F);return[{nodeId:i,knownNode:n.has(i),procedureRunId:Pf(t),status:y,startMs:_,endMs:j,startedAt:J$(_),finishedAt:J$(j),durationMs:j-_,runId:f,raw:t}]}).sort((t,i)=>t.startMs-i.startMs||t.endMs-i.endMs||t.nodeId.localeCompare(i.nodeId))}function wX(l,u,r=[]){let f=u.map((A)=>Number(A.startMs)).filter(Number.isFinite),n=u.map((A)=>Number(A.endMs)).filter(Number.isFinite);for(let A of r){let F=hu(A?.eventMs??A?.ms);if(F!==null)f.push(F),n.push(F)}let t=dl(l?.startedAt)??dl(l?.artifact?.startedAt)??dl(l?.request?.createdAt),i=dl(l?.finishedAt)??dl(l?.artifact?.finishedAt)??dl(l?.updatedAt);if(t!==null)f.push(t);if(i!==null)n.push(i);let y=Date.now(),c=f.length>0?Math.min(...f):y-60000,_=Math.max(c+60000,n.length>0?Math.max(...n):y);return{startMs:c,endMs:_,durationMs:_-c}}var c8=12,FG=20,xF=100,qX=!1;function Ai(l){let u=Number(l);if(!Number.isFinite(u))return 0;return Math.max(0,Math.min(100,Math.round(u*100)/100))}function LX(l){let u=Math.max(c8,Number(l||c8)),r=Math.log(u/c8)/Math.log(FG);return Ai(r*100)}var Q$=LX(xF);function eF(l){let u=Ai(l)/100,r=c8*Math.pow(FG,u),f=u<0.24?"全局":u<0.64?"均衡":"细节";return{value:Ai(u*100),pxPerMinute:r,label:f}}function YF(l){let u=Math.round(Number(l));return Math.abs(u-xF)<=1?xF:u}function GX(l,u=Q$){let r=Math.max(1,Number(l.durationMs||0)/60000),f=eF(u);return Math.round(Math.max(360,Math.min(7200,r*Number(f.pxPerMinute||48))))}function WX(l,u=7){let r=Math.max(1,Number(l.endMs||0)-Number(l.startMs||0));return Array.from({length:u},(f,n)=>{let t=u===1?0:n/(u-1);return{ms:Number(l.startMs)+r*t,percent:t*100}})}function TX(l,u){let r=Math.max(1,Number(u.endMs)-Number(u.startMs));return Math.max(0,Math.min(100,(l-Number(u.startMs))/r*100))}function hu(l){let u=Number(l);return Number.isFinite(u)?u:null}function lj(l){return dL(l?.status)&&!gF(l?.status)}function jG(l,u,r,f){let n=Math.max(1,r-u),t=Math.max(0,Math.min(1,(l-u)/n));return Number((t*f).toFixed(3))}function IL(l,u){if(!u)return null;let r=hu(u?.startMs),f=hu(u?.endMs),n=hu(u?.chartHeight);if(r===null||f===null||n===null)return null;return jG(l,r,f,n)}function NG(l,u){let r=hu(l?.rawStartMs??l?.startMs)??hu(l?.startMs)??u,f=hu(l?.endMs)??r+1000;if(!lj(l))return Math.max(r+1000,f);return Math.max(r+1000,f,u)}function KX(l,u,r,f){let n=hu(l?.startMs)??f-60000,t=hu(l?.endMs)??f,i=r.reduce((U,w)=>Math.max(U,NG(w,f)),t),y=Math.max(n+60000,t,i),c=Math.max(1,y-n),_={startMs:n,endMs:y,durationMs:c},A=GX(_,u),F=eF(u),j=Math.max(5,Math.min(18,Math.round(A/150))),N=WX(_,j).map((U)=>{let w=Number(U.ms),G=jG(w,n,y,A);return{...U,y:G,timestamp:J$(w),offsetMs:w-n}});return{source:"frontend-y",startMs:n,endMs:y,durationMs:c,chartHeight:A,scale:Ai(u),normalizedScale:Number((Ai(u)/100).toFixed(3)),pxPerMinute:Number(Number(F.pxPerMinute||0).toFixed(3)),ticks:N}}function EX(l,u,r){if(!lj(l))return l;let f=hu(l?.rawStartMs??l?.startMs)??hu(l?.startMs)??r,n=NG(l,r),t=IL(f,u),i=IL(n,u),y=hu(t??l?.y1??l?.startY)??0,c=hu(i??l?.y2??l?.endY)??y+10,_=Math.max(24,c-y);return{...l,live:!0,startMs:f,endMs:n,durationMs:Math.max(1000,n-f),finishedAt:J$(n),y1:y,y2:c,startY:y,endY:c,height:_}}function uj(l,u,r){return TX(l,u)/100*r}function xy(l){return Boolean(l&&String(l?.source||"")!=="frontend-y")}function JG(l,u,r,f,n){if(xy(f))for(let i of n){let y=hu(l?.[i]);if(y!==null)return y}let t=hu(l?.ms??l?.eventMs??l?.startMs);return uj(t??Number(u.startMs),u,r)}function U8(l,u,r,f){return JG(l,u,r,f,["y1","startY"])}function bF(l,u,r,f){if(xy(f)){let t=hu(l?.y2??l?.endY);if(t!==null)return t}let n=hu(l?.endMs)??Number(u.endMs);return uj(n,u,r)}function UG(l,u,r,f){if(xy(f)){let t=hu(l?.height);if(t!==null)return Math.max(1,t)}let n=l?.live?24:10;return Math.max(n,bF(l,u,r,f)-U8(l,u,r,f))}function wf(l,u,r,f){return JG(l,u,r,f,["y","timeAxisY"])}function QG(l,u,r,f){if(xy(f)||String(f?.source||"")==="frontend-y"){let i=hu(l?.y);if(i!==null)return i}let n=hu(l?.percent);if(n!==null)return n/100*r;let t=hu(l?.ms)??Number(u.startMs);return uj(t,u,r)}function pX(l){let u=String(l?.promptEvent||l?.raw?.promptEvent||l?.event||"").toLowerCase();if(!["node-long-running-observation","node-finished"].includes(u))return"";let r=String(l?.sourceNodeId||l?.raw?.sourceNodeId||l?.raw?.detail?.nodeId||""),f=String(l?.nodeId||l?.targetNodeId||"");return r&&r!==f?r:""}function zX(l,u){let r=new Set(u.map((n)=>[String(n.sourceNodeId||""),String(n.targetNodeId||""),String(n.targetMarkerId||""),String(n.action||"")].join(":"))),f=[...u];for(let n of l){let t=pX(n),i=String(n?.nodeId||""),y=String(n?.id||"");if(!t||!i||!y)continue;let c=[t,i,y,"observe"].join(":");if(r.has(c))continue;r.add(c),f.push({id:`observation-arrow:${y}:${t}:${i}`,commandId:String(n?.commandId||n?.eventId||y),sourceNodeId:t,targetNodeId:i,sourceMarkerId:"",targetMarkerId:y,sourceKind:"monitor",action:"observe",status:"observation"})}return{markers:l,arrows:f}}function OX(l){let u=yn(l),r=String(l?.promptEvent||"");if(u==="initial-prompt-delivered")return"initial";if(r==="node-finished"||r==="node-long-running-observation"||r.startsWith("monitor-"))return"monitor";if(u==="monitor-prompt-delivered"||String(l?.sourceKind||"").toLowerCase()==="monitor")return"monitor";return"append"}function ZX(l){return Sl(l?.tags||l?.raw?.tags).map((u)=>String(u||"")).filter(Boolean)}function HX(l){let u=yn(l),r=String(l?.promptEvent||"");if(u==="initial-prompt-delivered")return"初始 prompt";if(r==="node-long-running-observation")return"长任务观察";if(r==="node-finished")return ZX(l).includes("monitor.audit")?"节点完成 / OA 审核":"节点完成";if(r==="monitor-interval")return"Monitor observation";if(r==="monitor-start")return"Monitor start";if(r==="monitor-stop")return"Monitor stop";if(u==="monitor-prompt-delivered")return"Monitor prompt";if(u==="append-prompt-queued")return"追加 prompt 已排队";return"追加 prompt"}function aL(l){let u=yn(l);if(u==="control-command-applied")return 3;if(u==="control-command-ignored")return 2;if(u==="control-command-queued")return 1;return 0}function BX(l,u){let r=String(l?.commandId||"");if(r)return`command:${r}`;return["control-event",My(l)||m$(l?.createdAt,l?.timestamp)||`index-${u}`,String(l?.sourceKind||""),String(l?.sourceNodeId||""),String(l?.targetNodeId||""),$0(l)].join(":")}function DX(l){return MF([l?.targetNodeId,...Sl(l?.resetNodeIds)])}function VX(l,u){let r=j$(l),f=yn(l),n=String(l?.targetNodeId||""),t=Boolean(n)&&u!==n;if(f==="control-command-applied")return t?`${r} 波及`:`${r} 生效`;if(f==="control-command-ignored")return`${r} 忽略`;if(f==="control-command-queued")return`${r} 已发起`;return t?`${r} 波及`:r}function SX(l){if(yn(l)==="control-command-ignored")return"ignored";let r=$0(l);if(r==="restart"||r==="redo")return"restart";if(r==="modify")return"modify";if(r==="approve")return"approve";if(r==="guide")return"guide";return"pending"}function YX(l){let u=String(l?.sourceKind||"").toLowerCase();if(u==="monitor")return"monitor";if(u==="webui")return"webui";if(u==="cli")return"cli";return"system"}function XX(l,u,r,f){let n=l.filter((_)=>String(_.nodeId||"")===u).sort((_,A)=>Number(_.startMs)-Number(A.startMs)),t=n.find((_)=>r>=Number(_.startMs)-1000&&r<=Number(_.endMs)+1000);if(t)return{ms:r,onInterval:!0,snapReason:"inside-interval",procedureRunId:String(t.procedureRunId||"")};let i=$0(f),y=n.slice().reverse().find((_)=>Number(_.endMs)<=r+1000);if(y&&i==="approve")return{ms:Number(y.endMs),onInterval:!0,snapReason:"previous-interval-end",procedureRunId:String(y.procedureRunId||"")};let c=n.find((_)=>Number(_.startMs)>=r-1000);if(c&&["guide","modify","restart","redo"].includes(i))return{ms:Number(c.startMs),onInterval:!0,snapReason:"next-interval-start",procedureRunId:String(c.procedureRunId||"")};return{ms:r,onInterval:!1,snapReason:"event-time",procedureRunId:String(f?.procedureRunId||"")}}function mG(l,u,r,f){let n=Math.hypot(r-l,f-u),t=n>BL?BL:0,i=t>0?r-(r-l)/n*t:r,y=t>0?f-(f-u)/n*t:f,c=i-l,_=Math.max(16,Math.min(42,Math.abs(c)*0.45+12)),A=c===0?1:Math.sign(c);return`M ${l},${u} C ${l+A*_},${u} ${i-A*_},${y} ${i},${y}`}function PX(l,u){let r=String(l?.runId||u?.runId||""),f=AG({...Xl(u)?u:{},...Xl(l)?l:{},runId:r,procedureRuns:Sl(l?.procedureRuns).length>0?l.procedureRuns:u?.procedureRuns},[]),n=[],t=[],i=[],y=new Set,c=new Map,_=(j,N)=>{if(!j.nodeId||!Number.isFinite(Number(j.ms)))return;if(y.has(j.id))return;y.add(j.id),N.push(j)};for(let j of Sl(l?.procedureRuns)){let N=w8(j,r),U=Pf(j);if(!N)continue;for(let w of Sl(j?.attempts)){let G=m8(w);for(let J of hF(w?.controlEventRecords)){let Q=yn(J);if(!["initial-prompt-delivered","append-prompt-delivered","monitor-prompt-delivered"].includes(Q))continue;let m=My(J),q=dl(m);if(q===null)continue;let W=String(J?.eventId||"");_({id:`prompt:${W||`${U}:${G}:${Q}:${q}`}`,runId:r,nodeId:N,procedureRunId:U,attempt:G,kind:"prompt",tone:OX(J),status:"delivered",label:HX(J),ms:q,timestampIso:m,sourceKind:String(J?.sourceKind||""),sourceNodeId:String(J?.sourceNodeId||""),targetNodeId:N,action:"",eventId:W,commandId:String(J?.commandId||""),raw:J},n)}}}let A=new Map;hF(l?.controlEvents).forEach((j,N)=>{let U=BX(j,N),w=A.get(U)||{key:U,events:[]};w.events.push(j),A.set(U,w)});for(let j of A.values()){let N=Sl(j.events).slice().sort((H,B)=>aL(B)-aL(H)),U=Sl(j.events).find((H)=>yn(H)==="control-command-queued")||null,w=N[0]||U;if(!U&&!w)continue;let G=String(U?.sourceNodeId||w?.sourceNodeId||""),J=String(U?.sourceKind||w?.sourceKind||""),Q=My(U)||My(w)||m$(U?.createdAt,w?.createdAt),m=dl(Q),q=String(w?.commandId||U?.commandId||j.key),W=(yn(w)||"control-command-queued").replace(/^control-command-/u,""),p="";if(G&&m!==null)p=`control-source:${q}:${G}`,c.set(q,p),_({id:p,runId:r,nodeId:G,procedureRunId:String(U?.procedureRunId||w?.procedureRunId||""),attempt:"",kind:"control-source",tone:YX(U||w),status:W,label:`${j$(U||w)} 发起`,ms:m,timestampIso:Q,action:$0(U||w),sourceKind:J,sourceNodeId:G,targetNodeId:String(w?.targetNodeId||U?.targetNodeId||""),commandId:q,raw:U||w},t);let O=w||U,Z=My(O)||Q,V=dl(Z);if(V===null)continue;let P=DX(O);for(let H of P){let B=XX(f,H,V,O),C=`control-target:${q}:${H}`;if(_({id:C,runId:r,nodeId:H,procedureRunId:B.procedureRunId,attempt:"",kind:"control-target",tone:SX(O),status:W,label:VX(O,H),ms:B.ms,eventMs:V,onInterval:B.onInterval,snapReason:B.snapReason,snapped:Number(B.ms)!==V,timestampIso:Z,renderedTimestampIso:J$(Number(B.ms)),action:$0(O),sourceKind:J,sourceNodeId:G,targetNodeId:H,commandId:q,raw:O},t),p&&G&&G!==H)i.push({id:`control-arrow:${q}:${G}:${H}`,commandId:q,sourceNodeId:G,targetNodeId:H,sourceMarkerId:p,targetMarkerId:C,sourceKind:J,action:$0(O),status:W})}}let F=[...n,...t].sort((j,N)=>Number(j.ms)-Number(N.ms)||String(j.nodeId).localeCompare(String(N.nodeId))||String(j.id).localeCompare(String(N.id)));return{...zX(F,i),sourceMarkerByCommand:c}}function CX({details:l,selectedNodeId:u,selectedNodeRuntime:r,control:f,onRaw:n}){if(!l)return T("span",{className:"muted"},"点击“抓取过程”读取 node 运行材料;主界面只显示结构化摘要,完整内容需点开原始 JSON。");let t=Sl(l.procedureRuns),i=t.at(-1)||{},y=Sl(i.attempts),c=y.at(-1)||{},_=Sl(i.workerLogTail),A=Sl(c.controlEventsTail),F=Sl(c.controlPromptsTail),j=Sl(c.monitorPromptsTail),N=BF(A),U=BF(F),w=BF(j),G=c.opencodeMessages||{};return T("div",{className:"pipeline-evidence-list compact"},T(Yf,{title:"Node runtime",subtitle:u||"--",facts:[`status ${r?.status||"pending"}`,`attempts ${r?.attempts??y.length}`,`procedure ${r?.currentProcedureRunId||Pf(i)||"--"}`,f.fetchedAt?`fetched ${iu(f.fetchedAt)}`:"not fetched"],data:l.node||l,onRaw:n,testId:"raw-pipeline-node-runtime"}),T(Yf,{title:"Procedure runs",subtitle:`${t.length} groups`,facts:[`latest ${i.status?.status||i.status||"--"}`,`steps ${Sl(i.recentSteps).length}`,`duration ${Xf(dl(i.finishedAt)&&dl(i.startedAt)?Number(dl(i.finishedAt))-Number(dl(i.startedAt)):i.durationMs)}`],data:t,onRaw:n,testId:"raw-pipeline-node-procedures"}),T(Yf,{title:"OpenCode messages",subtitle:String(G.exists?"available":"not indexed"),facts:[`messages ${_8(G.messageCount)}`,`size ${_8(G.size)}`,`updated ${Ll(G.updatedAt)}`],data:G,onRaw:n,testId:"raw-pipeline-node-messages"}),T(Yf,{title:"Control prompts",subtitle:"manual / monitor append queues",facts:[`manual tail ${U.total}`,`monitor tail ${w.total}`,`last ${Ll(vF(U.lastAt,w.lastAt))}`],data:{controlPromptsTail:F,monitorPromptsTail:j},onRaw:n,testId:"raw-pipeline-node-prompts"}),T(Yf,{title:"Control events",subtitle:N.eventKinds.length>0?N.eventKinds.join(", "):"event tail",facts:[`tail ${N.total}`,`parsed ${N.parsed}`,`last ${Ll(N.lastAt)}`],data:A,onRaw:n,testId:"raw-pipeline-node-events"}),T(Yf,{title:"Worker log",subtitle:"tail is hidden on main canvas",facts:[`tail ${_.length} lines`,"raw only via button",`procedure ${Pf(i)||"--"}`],data:_,onRaw:n,testId:"raw-pipeline-node-worker-log"}))}function hX({activeRun:l,onRaw:u}){if(!l)return T(qf,{title:"暂无运行材料",text:"没有 Pipeline epoch 时不会展示运行材料索引。"});let r=Sl(l.nodes),f=Sl(l.procedureRuns),n=Sl(l.submissions),t=Sl(l.workerLogTail),i=SL(r),y=SL(f),c=f.filter((A)=>String(A?.status||"").toLowerCase()==="failed"),_=vF(...f.flatMap((A)=>[A.updatedAt,A.finishedAt,A.startedAt]));return T("div",{className:"pipeline-evidence-list"},T(Yf,{title:"Epoch overview",subtitle:l.runId||"--",facts:[`pipeline ${l.pipelineId||"--"}`,`status ${l.status||"--"}`,`started ${Ll(l.startedAt)}`,`updated ${Ll(l.updatedAt)}`],data:l,onRaw:u,testId:"raw-pipeline-run"}),T(Yf,{title:"Node states",subtitle:`${r.length} nodes`,facts:[`running ${i.running||0}`,`succeeded ${i.succeeded||0}`,`failed ${i.failed||0}`,`pending ${i.pending||0}`],data:r,onRaw:u,testId:"raw-pipeline-run-nodes"}),T(Yf,{title:"Procedure run index",subtitle:`${f.length} procedure records`,facts:[`succeeded ${y.succeeded||0}`,`failed ${y.failed||0}`,`latest ${Ll(_)}`,`errors ${c.length}`],data:f,onRaw:u,testId:"raw-pipeline-run-procedures"}),T(Yf,{title:"OA submissions",subtitle:`${n.length} submission files`,facts:[`records ${n.length}`,`task ${_8(l.task)}`,"raw grouped by run"],data:n,onRaw:u,testId:"raw-pipeline-run-submissions"}),T(Yf,{title:"Worker log tail",subtitle:"hidden from main interface",facts:[`tail ${t.length} lines`,"display raw only after click",`updated ${Ll(l.updatedAt)}`],data:t,onRaw:u,testId:"raw-pipeline-run-worker-log"}))}function MX({diagnostics:l,onRaw:u}){let r=Sl(l?.runs).filter(Xl),f=Sl(l?.forbiddenResiduals),n=Xl(l?.guarantees)?l.guarantees:{},t=l?.hasNeutralNodeFinishedEvidence===!0&&l?.hasNoAuditPolicyEvidence===!0&&l?.hasAuditPolicyEvidence===!0,i=l?.ok===!0&&t&&f.length===0,y=r[0]||null,c=[{label:"中性完成事实",ok:n.neutralNodeFinished===!0,hint:"node-finished 不携带流程策略"},{label:"Config 策略判定",ok:n.auditPolicyFromConfig===!0,hint:"OA backend 读取当前 epoch 配置"},{label:"控制命令来自 OA",ok:n.runnerConsumesControlCommandsFromOaEvents===!0,hint:"runner 只消费 OA control.command"},{label:"无独立审核事件",ok:n.noIndependentAuditRequestEvent===!0,hint:"审核由 node-finished + policy 派生"},{label:"无批次门禁",ok:n.noBatchFinishedControlGate===!0,hint:"下游启动由每个 node 完成驱动"}];return T("div",{className:"pipeline-oa-panel","data-testid":"pipeline-oa-event-flow-panel"},T("div",{className:"metric-grid compact"},T(sr,{label:"OA Flow",value:i?"100%":"--",hint:String(l?.mode||"waiting diagnostics"),tone:i?"ok":"warn"}),T(sr,{label:"禁止残留",value:f.length,hint:f.length===0?"source scan clean":"needs cleanup",tone:f.length===0?"ok":"warn"}),T(sr,{label:"No-audit",value:l?.hasNoAuditPolicyEvidence?"OK":"--",hint:"OA 下游策略证据",tone:l?.hasNoAuditPolicyEvidence?"ok":"warn"}),T(sr,{label:"Monitor 审核",value:l?.hasAuditPolicyEvidence?"OK":"--",hint:"OA 控制事件闭环",tone:l?.hasAuditPolicyEvidence?"ok":"warn"})),T("div",{className:"pipeline-oa-guarantees"},c.map((_)=>T("article",{key:_.label,className:`pipeline-oa-guarantee ${_.ok?"ok":"warn"}`},T(_i,{status:_.ok?"online":"warn"},_.ok?"OK":"MISS"),T("div",null,T("strong",null,_.label),T("span",null,_.hint))))),T("div",{className:"pipeline-evidence-list compact"},r.slice(0,6).map((_)=>T(Yf,{key:_.runId,title:String(_.runId||"--"),subtitle:[Number(_.monitorAuditNodeFinishedCount||0)>0?"monitor audit":"",Number(_.noAuditPolicyCount||0)>0?"no-audit policy":""].filter(Boolean).join(" / ")||"event evidence",facts:[`events ${_.eventCount||0}`,`node-finished ${_.nodeFinishedCount||0}`,`policy-in-detail ${_.nodeFinishedWithPolicyCount||0}`,`queued ${_.controlQueuedCount||0}`,`applied ${_.controlAppliedCount||0}`],data:_,onRaw:u,testId:`raw-pipeline-oa-run-${String(_.runId||"run").replace(/[^a-zA-Z0-9_.-]+/g,"-")}`}))),y?T("p",{className:"muted paragraph"},`最新证据 ${y.runId}: ${y.nodeFinishedCount||0} 个 node-finished,${y.controlAppliedCount||0} 个控制结果。`):T(qf,{title:"暂无 OA 事件流证据",text:"等待 Pipeline backend 暴露 diagnostics。"}),l?T("div",{className:"panel-actions inline-actions"},T(cn,{title:"Pipeline OA Event Flow Diagnostics",data:l,onOpen:u,testId:"raw-pipeline-oa-event-flow"})):null)}function sX({quota:l,onRaw:u}){let r=Xl(l?.summary)?l.summary:{},f=Xl(l?.target)?l.target:{},n=Xl(l?.cache)?l.cache:{},t=l?.ok===!0,i=String(l?.modelId||r.modelName||f.modelName||"MiniMax-M2.7"),y=r.totalCount??f.currentIntervalTotalCount,c=r.usageCount??f.currentIntervalUsageCount,_=r.remainingCount??f.currentIntervalRemainingCount,A=r.remainingRatio??(Number.isFinite(Number(y))&&Number(y)>0&&Number.isFinite(Number(_))?Number(_)/Number(y):void 0),F=r.usageRatio??(Number.isFinite(Number(y))&&Number(y)>0&&Number.isFinite(Number(c))?Number(c)/Number(y):void 0),j=r.resetAt||f.endAt,N=r.remainsMs??f.remainsMs,U=Number(_),w=!t||Number.isFinite(U)&&U<=0?"warn":"ok",G=[t?`endpoint ${l?.endpoint||"--"}`:"quota unavailable",`fetched ${$8(l?.fetchedAt)}`,n.hit?`cache ${Xf(n.ageMs)}`:"live quota"];return T("div",{className:"pipeline-minimax-quota-panel","data-testid":"pipeline-minimax-quota-panel"},T("div",{className:"metric-grid compact"},T(sr,{label:"MiniMax",value:t?i:"--",hint:l?.modelComponent||l?.error||"model/minimax-m27",tone:w}),T(sr,{label:"当前窗口",value:`${HF(c)}/${HF(y)}`,hint:`已用 ${VL(F)}`,tone:w}),T(sr,{label:"剩余额度",value:HF(_),hint:`剩余 ${VL(A)}`,tone:w}),T(sr,{label:"重置时间",value:$8(j),hint:N!==void 0?`约 ${Xf(N)}`:Ll(j),tone:w})),T(kF,{items:G}),t?T("p",{className:"muted paragraph"},`MiniMax 限额来自 D601 Pipeline 后端实时查询;当前模型匹配 ${r.modelName||f.modelName||i}。`):T(el,{error:l?.error||"MiniMax 限额查询失败"}),l?T("div",{className:"panel-actions inline-actions"},T(cn,{title:"Pipeline MiniMax Quota",data:l,onOpen:u,testId:"raw-pipeline-minimax-quota"})):null)}function RX({epochs:l,activeRun:u,activePipeline:r,pipelineNodes:f,pipelineEdges:n,runDetails:t,nodeDetails:i,nodeDetailsState:y,ganttScale:c=Q$,onGanttScaleChange:_,onRunChange:A,onIntervalSelect:F,onMarkerSelect:j,selection:N,detailOpen:U,onDetailOpenChange:w,onRaw:G}){let[J,Q]=lf(qX),[m,q]=lf({startY:0,endY:0,startMs:0,endMs:0}),[W,p]=lf(Date.now()),O=ci(null),Z=String(u?.runId||""),V=Boolean(U),P=(Nl)=>{if(typeof w==="function")w(Nl)},H=Ai(c??Q$),B=String(t?.runId||"")===Z?t?.details:null,C=B?{...Xl(u)?u:{},...Xl(B)?B:{},runId:Z,procedureRuns:Sl(B?.procedureRuns).length>0?B.procedureRuns:u?.procedureRuns}:u,E=AG(C,f,W),D=B?PX(B,C):{markers:[],arrows:[]},Y=Sl(D.markers),v=wX(C,E,Y),K=KX(v,H,E,W),X=String(K.source||"frontend-y"),I=E.map((Nl)=>EX(Nl,K,W)),o={startMs:Number(K.startMs),endMs:Number(K.endMs),durationMs:Math.max(1,Number(K.durationMs??Number(K.endMs)-Number(K.startMs)))},fl=eF(H),yl={...fl,pxPerMinute:Number(K.pxPerMinute??fl.pxPerMinute)},h=Math.round(Number(K.chartHeight||360)),s=E.some(lj);Hn(()=>{if(!Z||!s)return;let Nl=window.setInterval(()=>p(Date.now()),1000);return()=>window.clearInterval(Nl)},[Z,s]);let ul=$X(r,f,Array.isArray(n)?n:[]),tl=f.map((Nl)=>String(Nl?.id||"")).filter(Boolean),Al=I.map((Nl)=>String(Nl.nodeId||"")).filter(Boolean),Kl=Y.map((Nl)=>String(Nl.nodeId||"")).filter(Boolean),wl=Array.from(new Set([...ul,...tl,...Al,...Kl])),El={startY:0,endY:h,startMs:Number(o.startMs),endMs:Number(o.endMs)},M=Number(m?.endY||0)>0?m:El,d=(Nl)=>{return U8(Nl,o,h,K)<=Number(M.endY)&&bF(Nl,o,h,K)>=Number(M.startY)},nl=(Nl)=>{let al=wf(Nl,o,h,K);return al>=Number(M.startY)&&al<=Number(M.endY)},k=new Set(wl.filter((Nl)=>I.some((al)=>al.nodeId===Nl&&d(al))||Y.some((al)=>al.nodeId===Nl&&nl(al)))),g=J?wl.filter((Nl)=>k.has(Nl)):wl,cl=`${OF}px ${g.length>0?g.map(()=>`${On}px`).join(" "):"minmax(160px, 1fr)"}`,pl=Sl(K.ticks).filter(Xl),Hl=String(N?.mode==="interval"?N?.interval?.procedureRunId||"":""),bl=String(N?.mode==="event"?N?.marker?.id||"":""),_u=()=>{let Nl=O.current;if(!Nl){q(El);return}let al=Math.max(0,Nl.scrollTop-ZF),gu=Math.max(120,Nl.clientHeight-ZF),hl=Math.min(h,al+gu),yr={startY:al,endY:hl,startMs:Number(o.startMs),endMs:Number(o.endMs)},Zr=Math.max(0,Math.min(1,al/h)),cr=Math.max(Zr,Math.min(1,hl/h)),ku=Math.max(1,Number(o.endMs)-Number(o.startMs));yr.startMs=Number(o.startMs)+ku*Zr,yr.endMs=Number(o.startMs)+ku*cr,q(yr)};Hn(()=>{let Nl=O.current,al=window.setTimeout(_u,0);return Nl?.addEventListener("scroll",_u),window.addEventListener("resize",_u),()=>{window.clearTimeout(al),Nl?.removeEventListener("scroll",_u),window.removeEventListener("resize",_u)}},[Z,o.startMs,o.endMs,h]);let tu=Math.max(0,wl.length-g.length),Nu=new Set(Y.filter((Nl)=>g.includes(String(Nl.nodeId||""))&&nl(Nl)).map((Nl)=>String(Nl.id))),gl=new Map(Y.map((Nl)=>[String(Nl.id),Nl])),zr=Sl(D.arrows).filter((Nl)=>{if(!Nu.has(String(Nl.targetMarkerId||"")))return!1;if(String(Nl.action||"")==="observe")return g.includes(String(Nl.sourceNodeId||""));return Nu.has(String(Nl.sourceMarkerId||""))}),nf=OF+Math.max(1,g.length)*On,lr=(Nl)=>{let al=Ai(Nl.target.value);if(typeof _==="function")_(al);window.setTimeout(_u,0)},tf=()=>UX({title:`${r?.id||"pipeline"}-${Z||"epoch"}-gantt`,meta:[`run ${Z||"--"}`,`${Ll(o.startMs)} -> ${Ll(o.endMs)}`,`duration ${Xf(o.durationMs)}`,`${yl.label} / ${YF(yl.pxPerMinute)} px/min`,`${g.length}/${wl.length} nodes`,`${Y.length} markers`],visibleNodeIds:g,intervals:I,markers:Y.filter((Nl)=>g.includes(String(Nl.nodeId||""))),arrows:zr,ticks:pl,bounds:o,chartHeight:h,backendLayout:K}),Or=Xl(B?.gantt?.diagnostics)?B.gantt.diagnostics:null;return T(Zn,{title:"Epoch 甘特图",eyebrow:`${r?.id||"pipeline"} / ${l.length} epochs`,className:"pipeline-wide-panel",loading:t?.loading,actions:T("div",{className:"pipeline-gantt-actions"},T("select",{value:Z,disabled:l.length===0,onChange:(Nl)=>A(Nl.target.value),"data-testid":"pipeline-epoch-select"},l.map((Nl)=>T("option",{key:Nl.runId,value:Nl.runId},RF(l,Nl)))),T("label",{className:"pipeline-gantt-toggle"},T("input",{type:"checkbox","data-testid":"pipeline-gantt-auto-hide-idle",checked:J,onChange:(Nl)=>{Q(Boolean(Nl.target.checked)),window.setTimeout(_u,0)}}),T("span",null,"自动隐藏空闲列")),T("label",{className:"pipeline-gantt-scale"},T("span",null,T("b",null,"时间尺度"),T("em",{"data-testid":"pipeline-gantt-scale-label"},`${yl.label} · ${YF(yl.pxPerMinute)} px/min`)),T("input",{type:"range",min:0,max:100,step:0.01,value:H,onChange:lr,"aria-label":"调整甘特图时间尺度","data-testid":"pipeline-gantt-time-scale"}),T("small",null,T("span",null,"全局"),T("span",null,"细节"))),u?T("button",{type:"button",className:"ghost-btn",onClick:tf,disabled:g.length===0,"data-testid":"pipeline-export-gantt"},"导出甘特图"):null,u?T(cn,{title:`Pipeline Epoch ${u.runId}`,data:u,onOpen:G,testId:"raw-pipeline-epoch-gantt"}):null)},!u?T(qf,{title:"暂无 Epoch",text:"当前 pipeline 还没有完整运行记录。"}):I.length===0?T(qf,{title:"暂无时间区间",text:"等待 D601 Pipeline backend 在 procedure summary 中返回 startedAt / finishedAt。"}):T("div",{className:"pipeline-gantt-wrap"},T("div",{className:`pipeline-gantt-detail-layout ${V?"detail-open":"detail-collapsed"}`,"data-testid":"pipeline-gantt-detail-layout","data-sidebar-open":V?"true":"false"},T("div",{className:"pipeline-gantt-main"},T("div",{className:"pipeline-gantt-main-head"},T("div",{className:"pipeline-gantt-meta"},T("span",null,`time ${Ll(o.startMs)} -> ${Ll(o.endMs)}`),T("span",null,`duration ${Xf(o.durationMs)}`),T("span",null,`scale ${yl.label} / ${YF(yl.pxPerMinute)} px/min`),T("span",null,`layout ${X}`),Or?T("span",null,`align ${Or.timeAxisAlignmentOk===!1?"check":"ok"}`):null,T("span",null,`visible ${g.length}/${wl.length} nodes`),B?T("span",null,`markers ${Y.length}`):null,J&&tu>0?T("span",null,`hidden idle ${tu}`):null),!V?T("button",{type:"button",className:"pipeline-sidecar-tab right",disabled:!N?.mode,onClick:()=>P(!0),"data-testid":"pipeline-gantt-sidebar-toggle"},N?.mode?"展开详情":"点击甘特图元素展开详情"):null),T("div",{className:"pipeline-gantt-viewport",ref:O,"data-testid":"pipeline-epoch-gantt","data-pipeline-id":r?.id||"","data-run-id":Z,"data-layout-source":X,"data-start-ms":String(o.startMs),"data-end-ms":String(o.endMs),"data-chart-height":String(h)},T("div",{className:"pipeline-gantt-board",style:{gridTemplateColumns:cl,minWidth:`${nf}px`}},T("div",{className:"pipeline-gantt-head time"},"Time"),g.length===0?T("div",{className:"pipeline-gantt-head empty"},"当前时间窗无工作节点"):g.map((Nl)=>T("div",{key:`head-${Nl}`,className:"pipeline-gantt-head node",title:Nl,"data-testid":"pipeline-gantt-head-node","data-node-id":Nl},T(xY,{value:Nl}))),T("div",{className:"pipeline-gantt-time-axis",style:{height:`${h}px`}},pl.map((Nl)=>{let al=QG(Nl,o,h,K);return T("div",{key:`tick-${Nl.ms}-${al}`,className:"pipeline-gantt-tick",style:{top:`${al}px`},"data-testid":"pipeline-gantt-tick","data-ms":String(Nl.ms),"data-y":String(al)},T("b",null,Ll(Nl.ms)),T("span",null,`+${Xf(Number(Nl.offsetMs??Number(Nl.ms)-Number(o.startMs)))}`))})),g.length>0?T("svg",{className:"pipeline-gantt-arrow-layer",width:g.length*On,height:h,viewBox:`0 0 ${g.length*On} ${h}`,style:{left:`${OF}px`,top:`${ZF}px`,width:`${g.length*On}px`,height:`${h}px`},"aria-hidden":"true"},T("defs",null,T("marker",{id:"pipeline-gantt-arrowhead",viewBox:"0 0 10 10",refX:9,refY:5,markerWidth:6,markerHeight:6,orient:"auto-start-reverse"},T("path",{d:"M 0 0 L 10 5 L 0 10 z",fill:"context-stroke"}))),zr.map((Nl)=>{let al=gl.get(String(Nl.targetMarkerId||""));if(!al)return null;let gu=gl.get(String(Nl.sourceMarkerId||"")),hl=String(gu?.nodeId||Nl.sourceNodeId||""),yr=g.indexOf(hl),Zr=g.indexOf(String(al.nodeId||""));if(yr<0||Zr<0)return null;let cr=yr*On+On/2,ku=Zr*On+On/2,Gf=gu?wf(gu,o,h,K):wf(al,o,h,K),Vn=wf(al,o,h,K);return T("path",{key:Nl.id,className:`pipeline-gantt-arrow ${String(Nl.sourceKind||"").toLowerCase()} ${String(Nl.status||"").toLowerCase()} ${String(Nl.action||"").toLowerCase()}`,d:mG(cr,Gf,ku,Vn),markerEnd:"url(#pipeline-gantt-arrowhead)","data-testid":String(Nl.action||"")==="observe"?"pipeline-gantt-observation-arrow":"pipeline-gantt-arrow","data-source-node-id":String(Nl.sourceNodeId||""),"data-target-node-id":String(Nl.targetNodeId||""),"data-target-marker-id":String(Nl.targetMarkerId||""),"data-action":String(Nl.action||""),"data-source-y":String(Gf),"data-target-y":String(Vn)})})):null,g.length===0?T("div",{className:"pipeline-gantt-empty-col",style:{height:`${h}px`}},"滚动到有活动的时间段后,相关 node 列会自动出现。"):g.map((Nl)=>{let al=I.filter((hl)=>hl.nodeId===Nl),gu=Y.filter((hl)=>String(hl.nodeId||"")===Nl);return T("div",{key:`col-${Nl}`,className:"pipeline-gantt-node-col",style:{height:`${h}px`}},al.map((hl)=>{let yr=U8(hl,o,h,K),Zr=bF(hl,o,h,K),cr=UG(hl,o,h,K),ku=String(hl.procedureRunId||`${Nl}-${hl.startMs}`);return T("button",{key:ku,type:"button",className:`pipeline-gantt-bar ${hl.status} ${hl.live?"live":""} ${Hl===ku?"selected":""}`,style:{top:`${yr}px`,height:`${cr}px`},title:`${Nl} ${hl.status} ${Ll(hl.startedAt||hl.startMs)} -> ${Ll(hl.finishedAt||hl.endMs)}`,onClick:()=>F(hl),"data-testid":"pipeline-gantt-line","data-node-id":Nl,"data-procedure-run-id":String(hl.procedureRunId||""),"data-status":String(hl.status||""),"data-live":hl.live?"true":"false","data-start-ms":String(hl.startMs||""),"data-end-ms":String(hl.endMs||""),"data-y1":String(yr),"data-y2":String(Zr),"data-natural-height":String(Math.max(0,Zr-yr))},T("strong",null,hl.status||"working"),T("span",null,Xf(hl.durationMs)))}),gu.map((hl)=>T("button",{key:hl.id,type:"button",className:`pipeline-gantt-marker ${hl.kind} ${hl.tone||""} ${hl.status||""} ${bl===String(hl.id)?"selected":""}`,style:{top:`${wf(hl,o,h,K)}px`},title:`${hl.label||"event"} / ${Ll(hl.timestampIso||hl.timestamp||hl.ms)}`,onClick:()=>j(hl),"data-testid":hl.kind==="prompt"?"pipeline-gantt-prompt-marker":"pipeline-gantt-control-marker","data-marker-id":String(hl.id||""),"data-ms":String(hl.ms??hl.eventMs??""),"data-y":String(wf(hl,o,h,K))})))})))),V?T(RY,{selection:N,runDetails:t,nodeDetails:i,nodeDetailsState:y,onRaw:G,onCollapse:()=>P(!1)}):null)))}function yt(){return{loading:!1,actionLoading:"",error:"",message:"",details:null,fetchedAt:null,appendPrompt:"",guidePrompt:"",modifyPrompt:"",approveReason:"",redoReason:""}}function yi(){return{mode:"",runId:"",interval:null,marker:null}}function XF(){return{runId:"",loading:!1,error:"",details:null,fetchedAt:null}}function _$(l,u){return`${l}/microservices/pipeline/proxy${u}`}function xX({activeRun:l,pipelineRuns:u,selectedRunId:r,onRunChange:f,selectedNodeId:n,selectedNodeConfig:t,selectedNodeRuntime:i,control:y,onControlChange:c,onFetch:_,onAction:A,onRaw:F,onCollapse:j}){let N=String(l?.runId||""),U=String(i?.status||"pending"),w=!N||!n||y.loading||Boolean(y.actionLoading),G=(Q)=>(m)=>c({[Q]:m.target.value,error:"",message:""}),J=u.length>0?u:l?[l]:[];return T("aside",{className:"pipeline-node-control","data-testid":"pipeline-node-control"},T("div",{className:"pipeline-node-control-head"},T("div",null,T("p",{className:"panel-eyebrow"},"Manual Node Control"),T(nu,{title:n||"点击控制图中的 node",level:3,loading:y.loading||Boolean(y.actionLoading)})),T("div",{className:"pipeline-node-control-head-actions"},n?T(_i,{status:U},U):T(_i,{status:"pending"},"idle"),T("button",{type:"button",className:"ghost-btn mini",onClick:j,"data-testid":"pipeline-node-sidebar-collapse"},"收起"))),T("div",{className:"pipeline-control-runbar"},T("label",null,T("span",null,"目标 run"),T("select",{value:N||r,disabled:J.length===0,onChange:(Q)=>f(Q.target.value),"data-testid":"pipeline-node-run-select"},J.map((Q)=>T("option",{key:Q.runId,value:Q.runId},`${Q.runId||"--"} / ${Q.status||"--"}`)))),T("button",{type:"button",className:"ghost-btn",disabled:w,onClick:_,"data-testid":"pipeline-node-fetch"},y.loading?"抓取中":"抓取过程"),y.details?T(cn,{title:`Pipeline Node ${n}`,data:y.details,onOpen:F,testId:"raw-pipeline-node-control"}):null),T("div",{className:"pipeline-control-meta"},T("span",null,T("b",null,"kind"),String(t?.kind||"--")),T("span",null,T("b",null,"procedure"),String(i?.currentProcedureRunId||"--")),T("span",null,T("b",null,"attempts"),String(i?.attempts??"--")),T("span",null,T("b",null,"updated"),Ll(l?.updatedAt))),!n?T(qf,{title:"未选择 node",text:"点击 React Flow 控制图中的任意 node 后,可抓取执行过程、追加 prompt、下发引导、增量修改、审核通过或重做。"}):null,T(el,{error:y.error,wide:!0}),T("div",{className:"pipeline-control-actions"},T("label",null,T("span",null,"实时追加 prompt(仅 running node)"),T("textarea",{value:y.appendPrompt,onChange:G("appendPrompt"),placeholder:"让当前执行中的 agent 继续、补充检查或调整当前步骤...",rows:4,disabled:!n,"data-testid":"pipeline-node-append-input"}),T("button",{type:"button",className:"primary-btn compact",disabled:w||!String(y.appendPrompt||"").trim(),onClick:()=>A("append"),"data-testid":"pipeline-node-append-button"},y.actionLoading==="append"?"追加中":"追加到运行中 node")),T("label",null,T("span",null,"下次尝试引导 prompt"),T("textarea",{value:y.guidePrompt,onChange:G("guidePrompt"),placeholder:"给该 node 下一次 attempt 的执行提示;不会立即打断当前 session。",rows:4,disabled:!n,"data-testid":"pipeline-node-guide-input"}),T("button",{type:"button",className:"ghost-btn compact",disabled:w||!String(y.guidePrompt||"").trim(),onClick:()=>A("guide"),"data-testid":"pipeline-node-guide-button"},y.actionLoading==="guide"?"下发中":"下发 guide")),T("label",null,T("span",null,"完成后增量修改 prompt"),T("textarea",{value:y.modifyPrompt,onChange:G("modifyPrompt"),placeholder:"在该 node 已完成结果基础上追加修改要求;runner 会重跑目标 node,并保留同 node 既有 OA 输出作为上下文。",rows:4,disabled:!n,"data-testid":"pipeline-node-modify-input"}),T("button",{type:"button",className:"ghost-btn compact",disabled:w||!String(y.modifyPrompt||"").trim(),onClick:()=>A("modify"),"data-testid":"pipeline-node-modify-button"},y.actionLoading==="modify"?"排队中":"增量修改 node")),T("label",null,T("span",null,"Monitor 审核通过原因"),T("textarea",{value:y.approveReason,onChange:G("approveReason"),placeholder:"当流程配置开启 monitor 审核时,记录审核通过原因并释放后续 node。",rows:3,disabled:!n,"data-testid":"pipeline-node-approve-input"}),T("button",{type:"button",className:"primary-btn compact",disabled:w||!String(y.approveReason||"").trim(),onClick:()=>A("approve"),"data-testid":"pipeline-node-approve-button"},y.actionLoading==="approve"?"提交中":"审核通过")),T("label",null,T("span",null,"重做 / restart 原因"),T("textarea",{value:y.redoReason,onChange:G("redoReason"),placeholder:"说明为什么需要重做;runner 会重置目标 node 以及非 rework 下游 node。",rows:4,disabled:!n,"data-testid":"pipeline-node-redo-input"}),T("button",{type:"button",className:"danger-btn compact",disabled:w||!String(y.redoReason||"").trim(),onClick:()=>A("redo"),"data-testid":"pipeline-node-redo-button"},y.actionLoading==="redo"?"排队中":"重做 node"))),T("div",{className:"pipeline-control-evidence"},T("strong",null,"Node 过程索引"),T(CX,{details:y.details,selectedNodeId:n,selectedNodeRuntime:i,control:y,onRaw:F})))}function wG({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((e)=>e.id==="pipeline")||null,[n,t]=lf({loading:!1,error:"",health:null,snapshot:null,oaDiagnostics:null,minimaxQuota:null,refreshedAt:null}),[i,y]=lf(""),[c,_]=lf(""),[A,F]=lf(""),[j,N]=lf(yt()),[U,w]=lf({}),[G,J]=lf(yi()),[Q,m]=lf(XF()),[q,W]=lf(Q$),[p,O]=lf(!1),[Z,V]=lf(!1),P=ci(0),{addNotification:H}=Xr(),B=ci(!1),C=ci(0),E=ci(""),D=ci({}),Y=ci(""),v=ci("");async function K(e={}){let Dl=e.silent===!0;if(!f)return;if(B.current)return;B.current=!0;let Cl=P.current+1;if(P.current=Cl,!Dl)t((lu)=>({...lu,loading:!0,error:""}));try{let lu=`__unideskArrayLimit=registry.components:80,runs:${EY}`,[mu,au,yu]=await Promise.all([ii(`${r}/microservices/pipeline/proxy/api/snapshot?${lu}`,{cache:"no-store"}),ii(`${r}/microservices/pipeline/proxy/api/oa-event-flow/diagnostics`,{cache:"no-store"}).catch((Sn)=>({ok:!1,error:zl(Sn,"OA event flow diagnostics failed")})),ii(`${r}/microservices/pipeline/proxy/api/model-quota/minimax`,{cache:"no-store"}).catch((Sn)=>({ok:!1,error:zl(Sn,"MiniMax quota failed")}))]);if(Cl!==P.current)return;let ur={ok:mu?.ok!==!1,service:"pipeline-v2-control snapshot"};t({loading:!1,error:"",health:ur,snapshot:mu,oaDiagnostics:au,minimaxQuota:yu,refreshedAt:new Date})}catch(lu){if(Cl!==P.current)return;t((mu)=>({...mu,loading:!1,error:zl(lu,"Pipeline 加载失败")}))}finally{B.current=!1}}Hn(()=>{if(K(),!f)return;let e=()=>{if(n8())K({silent:!0})},Dl=window.setInterval(()=>{e()},HL),Cl=()=>{if(n8())e()};return document.addEventListener("visibilitychange",Cl),()=>{window.clearInterval(Dl),document.removeEventListener("visibilitychange",Cl)}},[f?.id,f?.runtime?.providerStatus,r]);let X=bY(f),I=gY(f),o=vY(f),fl=n.snapshot||{},yl=n.oaDiagnostics||null,h=n.minimaxQuota||null,{components:s,pipelines:ul,runs:tl}=kY(fl),Al=String(tl[0]?.pipelineId||""),Kl=(Al?ul.find((e)=>String(e.id||"")===Al):null)||ul[0]||{},wl=ul.find((e)=>String(e.id||"")===i)||Kl,El=String(wl.id||""),M=iG(wl),d=aF(wl),nl=gL(tl,El),k=mX(tl,El),g=k.find((e)=>String(e?.runId||"")===c)||nl,cl=String(Q.runId||"")===String(g?.runId||"")?dY(Q.details):null,pl=eY(g,cl),Hl=String(pl?.runId||""),bl=M.find((e)=>String(e?.id||"")===A)||null,_u=A?yG(pl,A):null,tu=aY(tl),Nu=fX(s),gl=Number(n.health?.components)||hL(fl,"registry.components",s.length),zr=hL(fl,"runs",tl.length),nf=RL(wl,pl,s),lr={nodes:nf.nodes.map((e)=>e.id===A?{...e,selected:!0,className:`${e.className||""} selected-control-node`}:e),edges:nf.edges},tf=ul.map((e)=>{let Dl=String(e.id||"pipeline"),Cl=gL(tl,Dl);return{title:`${Dl}-${Cl?.runId||"snapshot"}`,flow:RL(e,Cl,s)}}),Or=String(G?.runId||Hl||""),Nl=String(G?.interval?.nodeId||G?.marker?.nodeId||""),al=Or&&Nl?U[SF(Or,Nl)]||null:null,gu=A8(j.details,Or,Nl),hl=A8(al?.details,Or,Nl)||gu,yr=Or&&Nl?{...Xl(al)?al:{},runId:Or,nodeId:Nl,details:hl,loading:Boolean(al?.loading)||!hl&&Boolean(j.loading)&&A===Nl,error:String(al?.error||""),fetchedAt:al?.fetchedAt||(gu?j.fetchedAt:null)}:null,Zr=k.map((e)=>String(e?.runId||"")).filter(Boolean).join("|"),cr=M.map((e)=>String(e?.id||"")).filter(Boolean).join("|");Hn(()=>{Y.current=A},[A]),Hn(()=>{v.current=Hl},[Hl]),Hn(()=>{if(!c||Zr.split("|").includes(c))return;_("")},[c,Zr]),Hn(()=>{if(!A||cr.split("|").includes(A))return;F(""),N(yt()),J(yi()),O(!1),V(!1)},[A,cr]),Hn(()=>{if(!A)O(!1)},[A]),Hn(()=>{if(!G.mode)V(!1)},[G.mode]);async function ku(e=Hl,Dl={}){if(!e){m(XF());return}let Cl=Ai(Dl.scale??q??Q$),lu=`${e}:timeline`;if(E.current===lu)return;E.current=lu;let mu=Dl.silent===!0,au=C.current+1;C.current=au,m((yu)=>({runId:e,scale:Cl,loading:!mu||String(yu.runId||"")!==e||!yu.details,error:"",details:mu&&yu.runId===e?yu.details:yu.runId===e?yu.details:null,fetchedAt:yu.runId===e?yu.fetchedAt:null}));try{let[yu,ur]=await Promise.all([ii(_$(r,`/api/node-control/runs/${encodeURIComponent(e)}?tail=160&view=timeline`),{cache:"no-store",strictJson:!0}),ii(_$(r,`/api/runs/${encodeURIComponent(e)}`),{cache:"no-store"}).catch((Sn)=>({ok:!1,runSummaryError:zl(Sn,"抓取评分失败")}))]);if(au!==C.current)return;m({runId:e,scale:Cl,loading:!1,error:"",details:{...yu,run:Xl(ur?.run)?ur.run:void 0,runSummaryError:ur?.runSummaryError},fetchedAt:new Date})}catch(yu){if(au!==C.current)return;m((ur)=>({runId:e,scale:Cl,loading:!1,error:zl(yu,"抓取 epoch 执行过程失败"),details:ur.runId===e?ur.details:null,fetchedAt:ur.runId===e?ur.fetchedAt:null}))}finally{if(E.current===lu)E.current=""}}function Gf(e,Dl,Cl){let lu=SF(e,Dl);w((mu)=>{let au={...mu,[lu]:{...Xl(mu?.[lu])?mu[lu]:{},runId:e,nodeId:Dl,...Cl}},yu=Object.keys(au);if(yu.length>32)for(let ur of yu.slice(0,yu.length-32))delete au[ur];return au})}async function Vn(e,Dl){if(!e||!Dl)return;let Cl=SF(e,Dl),lu=Number(D.current?.[Cl]||0)+1;D.current={...D.current,[Cl]:lu},Gf(e,Dl,{loading:!0,error:""});try{let mu=await ii(_$(r,`/api/node-control/runs/${encodeURIComponent(e)}/nodes/${encodeURIComponent(Dl)}?tail=160`),{cache:"no-store",strictJson:!0});if(Number(D.current?.[Cl]||0)!==lu)return;let au=new Date;if(Gf(e,Dl,{loading:!1,details:mu,fetchedAt:au,error:""}),Y.current===Dl&&v.current===e)N((yu)=>({...yu,loading:!1,details:mu,fetchedAt:au,error:""}))}catch(mu){if(Number(D.current?.[Cl]||0)!==lu)return;Gf(e,Dl,{loading:!1,error:zl(mu,"抓取 Gantt node 详情失败")})}}Hn(()=>{if(!Hl){m(XF());return}ku(Hl);let e=()=>{if(n8())ku(Hl,{silent:!0})},Dl=window.setInterval(()=>{e()},HL),Cl=()=>{if(n8())e()};return document.addEventListener("visibilitychange",Cl),()=>{window.clearInterval(Dl),document.removeEventListener("visibilitychange",Cl)}},[Hl,r]);async function Rr(e=Hl,Dl=A){if(!e||!Dl){N((Cl)=>({...Cl,error:"请先选择 run 和 node",message:""}));return}N((Cl)=>({...Cl,loading:!0,error:"",message:""}));try{let Cl=await ii(_$(r,`/api/node-control/runs/${encodeURIComponent(e)}/nodes/${encodeURIComponent(Dl)}?tail=160`),{cache:"no-store",strictJson:!0}),lu=new Date;N((mu)=>({...mu,loading:!1,details:Cl,fetchedAt:lu,error:""})),Gf(e,Dl,{loading:!1,details:Cl,fetchedAt:lu,error:""})}catch(Cl){N((lu)=>({...lu,loading:!1,error:zl(Cl,"抓取 node 执行过程失败")}))}}async function ay(e){let Dl=String(e?.runId||Hl||""),Cl=String(e?.nodeId||"");if(J({mode:"interval",runId:Dl,interval:e,marker:null}),V(!0),!Dl||!Cl)return;if(Dl!==Hl)_(Dl);F(Cl),N(yt()),ku(Dl,{silent:!0}),Vn(Dl,Cl)}async function _t(e){let Dl=String(e?.runId||Hl||""),Cl=String(e?.nodeId||"");if(J({mode:"event",runId:Dl,interval:null,marker:e}),V(!0),!Dl)return;if(Dl!==Hl)_(Dl);if(ku(Dl,{silent:!0}),!Cl)return;F(Cl),N(yt()),Vn(Dl,Cl)}async function At(e){if(!Hl||!A){N((lu)=>({...lu,error:"请先选择 run 和 node",message:""}));return}let Dl=e==="append"?"prompts":e,Cl=e==="append"?j.appendPrompt:e==="guide"?j.guidePrompt:e==="modify"?j.modifyPrompt:e==="approve"?j.approveReason:j.redoReason;if(!String(Cl||"").trim()){N((lu)=>({...lu,error:"操作内容不能为空",message:""}));return}N((lu)=>({...lu,actionLoading:e,error:"",message:""}));try{let lu=e==="redo"||e==="approve"?{reason:Cl,source:"unidesk-frontend",sourceKind:"webui"}:{prompt:Cl,source:"unidesk-frontend",sourceKind:"webui"},mu=await ii(_$(r,`/api/node-control/runs/${encodeURIComponent(Hl)}/nodes/${encodeURIComponent(A)}/${Dl}`),{method:"POST",body:JSON.stringify(lu)});if(N((yu)=>({...yu,actionLoading:"",details:mu,fetchedAt:new Date,appendPrompt:e==="append"?"":yu.appendPrompt,guidePrompt:e==="guide"?"":yu.guidePrompt,modifyPrompt:e==="modify"?"":yu.modifyPrompt,approveReason:e==="approve"?"":yu.approveReason,redoReason:e==="redo"?"":yu.redoReason,message:e==="append"?"已追加到运行中 node":e==="guide"?"已下发 guide,等待 runner 处理":e==="modify"?"已排队增量修改命令":e==="approve"?"已提交审核通过决策":"已排队重做命令"})),H("success",e==="append"?"已追加到运行中 node":e==="guide"?"已下发 guide,等待 runner 处理":e==="modify"?"已排队增量修改命令":e==="approve"?"已提交审核通过决策":"已排队重做命令"),await Rr(Hl,A),await ku(Hl,{silent:!0}),e!=="append")await K()}catch(lu){N((mu)=>({...mu,actionLoading:"",error:zl(lu,"node 控制操作失败")}))}}if(!f)return T(qf,{title:"Pipeline 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=pipeline"});return T("div",{className:"pipeline-page","data-testid":"pipeline-page"},T(Zn,{title:"Pipeline v2 工作台",eyebrow:"D601 Snapshot 用户服务",loading:n.loading,actions:T("div",{className:"panel-actions"},T("button",{type:"button",className:"ghost-btn",onClick:K,disabled:n.loading,"data-testid":"pipeline-refresh-button"},n.loading?"刷新中":"刷新"),T(cn,{title:"Pipeline 用户服务",data:f,onOpen:u,testId:"raw-pipeline-service"}))},T("div",{className:"pipeline-hero"},T("div",null,T("div",{className:"node-version-line"},T(_i,{status:X.providerStatus==="online"?"online":"warn"},X.providerStatus||"unknown"),T("span",null,f.providerId),T("span",null,o.public?"公网暴露":"仅 UniDesk frontend 代理访问")),T("p",{className:"muted paragraph"},f.description)),T("div",{className:"microservice-ref-card"},T("span",null,"Repo"),T("strong",null,I.url||"--"),T("code",null,I.commitId||"--")),T("div",{className:"microservice-ref-card"},T("span",null,"D601 Docker"),T("strong",null,`${o.nodeBindHost||"--"}:${o.nodePort||"--"}`),T("code",null,`${I.composeFile||"--"} / ${I.composeService||"--"}`))),T(el,{error:n.error,wide:!0})),T("div",{className:"pipeline-grid"},T(Zn,{title:"控制图",eyebrow:`${wl.id||"pipeline"} / run ${pl?.status||"--"}`,className:"pipeline-wide-panel",loading:n.loading,actions:T("div",{className:"pipeline-toolbar"},T("select",{value:El,disabled:ul.length===0,onChange:(e)=>{y(e.target.value),_(""),F(""),N(yt()),J(yi()),O(!1),V(!1)},"data-testid":"pipeline-select"},ul.map((e)=>T("option",{key:e.id,value:e.id},e.id||e.key))),T("select",{value:Hl,disabled:k.length===0,onChange:(e)=>{if(_(e.target.value),N(yt()),J(yi()),O(!1),V(!1),A)Rr(e.target.value,A)},"data-testid":"pipeline-run-select"},k.map((e)=>T("option",{key:e.runId,value:e.runId},RF(k,e)))),T("button",{type:"button",className:"ghost-btn",disabled:lr.nodes.length===0,onClick:()=>_G(lr,`${wl.id||"pipeline"}-${pl?.runId||"snapshot"}`),"data-testid":"pipeline-export-graph"},"导出渲染图"),T("button",{type:"button",className:"ghost-btn",disabled:tf.every((e)=>e.flow.nodes.length===0),onClick:()=>QX(tf),"data-testid":"pipeline-export-all-graphs"},"批量导出"))},M.length===0?T(qf,{title:"暂无控制图",text:"等待 D601 pipeline backend 返回 config.nodes / config.edges"}):T("div",{className:`pipeline-control-shell ${p?"detail-open":"detail-collapsed"}`,"data-testid":"pipeline-control-shell","data-sidebar-open":p?"true":"false"},T("div",{className:"pipeline-flow-frame","data-testid":"pipeline-react-flow"},T(TL,{nodes:lr.nodes,edges:lr.edges,nodeTypes:HY,edgeTypes:ZY,fitView:!0,fitViewOptions:{padding:0.18},nodesDraggable:!1,nodesConnectable:!1,elementsSelectable:!0,minZoom:0.25,maxZoom:1.4,proOptions:{hideAttribution:!0},onNodeClick:(e,Dl)=>{let Cl=String(Dl.id);if(F(Cl),N(yt()),O(!0),Hl)Rr(Hl,Cl)}},T(EL,{gap:22,size:1,color:"rgba(215, 161, 58, 0.24)"}),T(zL,{showInteractive:!1})),!p?T("button",{type:"button",className:"pipeline-sidecar-tab right",disabled:!A,onClick:()=>O(!0),"data-testid":"pipeline-node-sidebar-toggle"},A?"展开 node 控制":"点击 node 展开控制"):null),p?T(xX,{activeRun:pl,pipelineRuns:k,selectedRunId:c,onRunChange:(e)=>{if(_(e),N(yt()),J(yi()),A)Rr(e,A)},selectedNodeId:A,selectedNodeConfig:bl,selectedNodeRuntime:_u,control:j,onControlChange:(e)=>N((Dl)=>({...Dl,...e})),onFetch:()=>Rr(),onAction:At,onRaw:u,onCollapse:()=>O(!1)}):null),T("div",{className:"pipeline-flow-summary"},T("span",null,`${lr.nodes.length} nodes`),T("span",null,`${lr.edges.length} edges`),T("span",null,`${ul.length} pipelines`),T("span",null,`source config+components(${s.length})`),T("span",null,`run ${pl?.runId||"--"}`),T("span",null,`score ${sF(pl)}`),T("span",null,A?`selected ${A}`:"click node to control"))),T(RX,{epochs:k,activeRun:pl,activePipeline:wl,pipelineNodes:M,pipelineEdges:d,selection:G,detailOpen:Z,onDetailOpenChange:V,runDetails:Q,nodeDetails:hl,nodeDetailsState:yr,ganttScale:q,onGanttScaleChange:W,onIntervalSelect:ay,onMarkerSelect:_t,onRunChange:(e)=>{if(_(e),N(yt()),J(yi()),V(!1),A)Rr(e,A)},onRaw:u}),T(Zn,{title:"观测指标",eyebrow:n.refreshedAt?`Updated ${iu(n.refreshedAt)}`:"Snapshot",loading:n.loading},T("div",{className:"metric-grid"},T(sr,{label:"Health",value:n.health?.ok?"OK":"--",hint:n.health?.service||"D601 /health",tone:n.health?.ok?"ok":"warn"}),T(sr,{label:"组件",value:gl,hint:"components registry",tone:fl?.registry?.ok===!1?"warn":"ok"}),T(sr,{label:"Pipeline",value:ul.length,hint:`${M.length} nodes / ${d.length} edges`}),T(sr,{label:"运行记录",value:zr,hint:`${tu.succeeded||0} succeeded / ${tu.running||0} running`}),T(sr,{label:"OA 记录",value:Array.isArray(nl?.submissions)?nl.submissions.length:0,hint:nl?.runId||"latest run"}),T(sr,{label:"Procedure",value:Array.isArray(nl?.procedureRuns)?nl.procedureRuns.length:0,hint:nl?.status||"no run"}),T(sr,{label:"Score",value:sF(pl),hint:pl?.runId||"selected epoch",tone:dF(pl)})),T("div",{className:"panel-actions inline-actions"},T(cn,{title:"Pipeline Snapshot",data:fl,onOpen:u,testId:"raw-pipeline-snapshot"}))),T(Zn,{title:"评分器",eyebrow:pl?.runId||"selected epoch",loading:n.loading},T(rX,{run:pl,onRaw:u})),T(Zn,{title:"MiniMax 限额",eyebrow:"model/minimax-m27 quota",loading:n.loading},T(sX,{quota:h,onRaw:u})),T(Zn,{title:"OA 事件流",eyebrow:"100% event-driven diagnostics",className:"pipeline-wide-panel",loading:n.loading},T(MX,{diagnostics:yl,onRaw:u})),T(Zn,{title:"组件矩阵",eyebrow:`${Nu.length} classes`,loading:n.loading},Nu.length===0?T(qf,{title:"暂无组件",text:"等待 D601 pipeline backend 返回 registry.components"}):T("div",{className:"component-strata"},Nu.map((e)=>T("article",{key:e.name,className:"component-stratum"},T("span",null,e.name),T("strong",null,e.count)))),T("div",{className:"pipeline-component-list"},s.slice(0,12).map((e)=>T("span",{key:e.key,className:"data-chip"},T("b",null,e.componentClass||"--"),T("span",null,e.id||e.key||"--"))))),T(Zn,{title:"Epoch 列表",eyebrow:`${k.length}/${zr} preview`,loading:n.loading},k.length===0?T(qf,{title:"暂无运行记录",text:"当前 pipeline 在 .state/pipeline-runs 中还没有 epoch。"}):T("div",{className:"pipeline-run-list"},k.map((e)=>{let Dl=String(e?.runId||"")===Hl?pl:e;return T("article",{key:e.runId,className:`pipeline-run-card ${String(e.runId||"")===Hl?"active":""}`,role:"button",tabIndex:0,onClick:()=>{_(String(e.runId||"")),J(yi())},onKeyDown:(Cl)=>{if(Cl.key==="Enter"||Cl.key===" ")_(String(e.runId||"")),J(yi())}},T("div",{className:"node-card-head"},T("strong",null,RF(k,e)),T(_i,{status:e.status},e.status||"--")),T("div",{className:"docker-meta compact"},T("span",null,Dl?.pipelineId||"--"),T("span",null,`nodes ${Array.isArray(Dl?.nodes)?Dl.nodes.length:0}`),T("span",null,`oa ${Array.isArray(Dl?.submissions)?Dl.submissions.length:0}`),T("span",null,`procedures ${Array.isArray(Dl?.procedureRuns)?Dl.procedureRuns.length:0}`),T(uX,{run:Dl})),T("p",{className:"muted paragraph"},_8(Dl?.task)),T("span",{className:"pipeline-run-time"},Ll(Dl?.updatedAt)))}))),T(Zn,{title:"运行材料索引",eyebrow:pl?.runId||"selected epoch",className:"pipeline-wide-panel",loading:n.loading},T(hX,{activeRun:pl,onRaw:u}))))}var G8=Ml(Ju(),1);var Fl=G8.default.createElement,{useEffect:bX}=G8.default,q8=G8.default.useState,rj={id:"",sequenceNo:"",contractNo:"",name:"",currentStatus:"",pending:"",paymentStatus:"",notes:""};function vX({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return Fl("span",{className:`status-badge ${r}`},u||l||"unknown")}function L8({label:l,value:u,hint:r,tone:f}){return Fl("article",{className:`metric-card ${f||""}`},Fl("div",{className:"metric-label"},l),Fl("div",{className:"metric-value"},u),Fl("div",{className:"metric-hint"},r))}function fj({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return Fl("section",{className:`panel ${n||""}`},Fl("div",{className:"panel-head"},Fl("div",null,u?Fl("p",{className:"panel-eyebrow"},u):null,Fl(nu,{title:l,loading:t})),r?Fl("div",{className:"panel-actions"},r):null),Fl("div",{className:"panel-body"},f))}function qG({title:l,data:u,onOpen:r,testId:f}){return Fl("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function LG({title:l,text:u}){return Fl("div",{className:"empty-state"},Fl("strong",null,l),Fl("span",null,u))}function gX(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function kX(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function IX(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function by(l,u){return`${l}/microservices/project-manager/proxy${u}`}function aX(l){return{id:String(l.id||""),sequenceNo:l.sequenceNo===null||l.sequenceNo===void 0?"":String(l.sequenceNo),contractNo:String(l.contractNo||""),name:String(l.name||""),currentStatus:String(l.currentStatus||""),pending:String(l.pending||""),paymentStatus:String(l.paymentStatus||""),notes:String(l.notes||"")}}function oX(l){return{sequenceNo:l.sequenceNo===""?null:Number(l.sequenceNo),contractNo:String(l.contractNo||"").trim(),name:String(l.name||"").trim(),currentStatus:String(l.currentStatus||"").trim(),pending:String(l.pending||"").trim(),paymentStatus:String(l.paymentStatus||"").trim(),paymentRatio:String(l.paymentStatus||"").trim(),notes:String(l.notes||"").trim()}}function nj(l){return String(l||"item").replace(/[^A-Za-z0-9_-]+/g,"-")}function dX(l){let u=new Uint8Array(l),r="",f=32768;for(let n=0;nFl("tr",{key:n.id,className:u===n.id?"active-row":"","data-testid":`project-manager-row-${nj(n.id)}`},Fl("td",null,n.sequenceNo??"--"),Fl("td",null,Fl("strong",null,n.contractNo||"--"),Fl("code",null,n.id||"--")),Fl("td",null,Fl("strong",null,n.name||"--"),Fl("span",{className:"muted block"},n.sourceFile||"--")),Fl("td",null,n.currentStatus||"--"),Fl("td",null,Fl("span",{className:"preline"},n.pending||"--")),Fl("td",null,Fl(vX,{status:Number(n.paymentRatio||0)>=1?"online":"warn"},n.paymentStatus||"--")),Fl("td",null,n.notes||"--"),Fl("td",null,Fl("div",{className:"inline-actions"},Fl("button",{type:"button",className:"ghost-btn",onClick:()=>r(n),"data-testid":`project-manager-edit-${nj(n.id)}`},"编辑"),Fl(qG,{title:`Project ${n.contractNo||n.id}`,data:n,onOpen:f,testId:`raw-project-${nj(n.id)}`}))))))))}function GG({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((Z)=>Z.id==="project-manager")||null,[n,t]=q8({loading:!1,saving:!1,importing:!1,exporting:!1,error:"",notice:"",health:null,list:null,refreshedAt:null}),[i,y]=q8({...rj}),[c,_]=q8(""),[A,F]=q8("all"),{addNotification:j}=Xr();async function N(Z=c,V=A){if(!f)return;t((P)=>({...P,loading:!0,error:""}));try{let P=new URLSearchParams({pageSize:"200",status:V});if(Z.trim())P.set("q",Z.trim());let[H,B]=await Promise.all([Tl(`${r}/microservices/project-manager/health`),Tl(by(r,`/api/projects?${P.toString()}`))]);t((C)=>({...C,loading:!1,health:H,list:B,refreshedAt:new Date,error:""}))}catch(P){t((H)=>({...H,loading:!1,error:zl(P,"Project Manager 加载失败")}))}}bX(()=>{N()},[f?.id,f?.runtime?.providerStatus]);async function U(Z){Z.preventDefault(),t((V)=>({...V,saving:!0,error:"",notice:""}));try{let V=oX(i);if(i.id)await Tl(by(r,`/api/projects/${encodeURIComponent(i.id)}`),{method:"PUT",body:JSON.stringify(V)});else await Tl(by(r,"/api/projects"),{method:"POST",body:JSON.stringify(V)});let P=i.id?"项目已更新":"项目已创建";t((H)=>({...H,saving:!1,notice:P})),j("success",P),await N()}catch(V){t((P)=>({...P,saving:!1,error:zl(V,"保存项目失败")}))}}async function w(){if(!i.id)return;if(!window.confirm(`删除项目 ${i.contractNo||i.name||i.id} ?`))return;t((Z)=>({...Z,saving:!0,error:"",notice:""}));try{await Tl(by(r,`/api/projects/${encodeURIComponent(i.id)}`),{method:"DELETE"}),y({...rj});let Z="项目已删除";t((V)=>({...V,saving:!1,notice:Z})),j("success",Z),await N()}catch(Z){t((V)=>({...V,saving:!1,error:zl(Z,"删除项目失败")}))}}async function G(Z){let V=Z.target.files?.[0];if(!V)return;t((P)=>({...P,importing:!0,error:"",notice:""}));try{let P=dX(await V.arrayBuffer()),B=`Excel 已导入 ${(await Tl(by(r,"/api/import/excel"),{method:"POST",body:JSON.stringify({fileName:V.name,contentBase64:P,replace:!1})})).imported||0} 条项目`;t((C)=>({...C,importing:!1,notice:B})),j("success",B),Z.target.value="",await N()}catch(P){t((H)=>({...H,importing:!1,error:zl(P,"Excel 导入失败")}))}}async function J(){t((Z)=>({...Z,exporting:!0,error:""}));try{let Z=await KU(by(r,"/api/projects/export.xlsx")),V=URL.createObjectURL(Z),P=document.createElement("a");P.href=V,P.download=`project-manager-${f7()}.xlsx`,document.body.appendChild(P),P.click(),P.remove(),URL.revokeObjectURL(V),t((H)=>({...H,exporting:!1,notice:"Excel 已导出"}))}catch(Z){t((V)=>({...V,exporting:!1,error:zl(Z,"Excel 导出失败")}))}}if(!f)return Fl(LG,{title:"Project Manager 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=project-manager"});let Q=gX(f),m=IX(f),q=kX(f),W=Array.isArray(n.list?.projects)?n.list.projects:[],p=n.list?.summary||{},O=n.health||{};return Fl("div",{className:"project-manager-page","data-testid":"project-manager-page"},Fl(fj,{title:"项目管理工作台",eyebrow:"Main Server PostgreSQL 用户服务",loading:n.loading||n.exporting,actions:Fl("div",{className:"panel-actions"},Fl("button",{type:"button",className:"ghost-btn",disabled:n.loading,onClick:()=>N(),"data-testid":"project-manager-refresh-button"},n.loading?"刷新中":"刷新"),Fl("button",{type:"button",className:"ghost-btn",disabled:n.exporting,onClick:J,"data-testid":"project-manager-export-button"},n.exporting?"导出中":"导出 Excel"),Fl(qG,{title:"Project Manager 用户服务",data:f,onOpen:u,testId:"raw-project-manager-service"}))},Fl("div",{className:"project-manager-hero"},Fl(L8,{label:"项目总数",value:p.total??W.length,hint:`PG 表 ${O.storage?.table||"project_manager_projects"}`,tone:"ok"}),Fl(L8,{label:"进行中",value:p.active??"--",hint:"当前状态未完全完成"}),Fl(L8,{label:"已完成",value:p.completed??"--",hint:"按 完成 关键字统计",tone:"ok"}),Fl(L8,{label:"未全款",value:p.unpaid??"--",hint:"付款比例 < 1",tone:Number(p.unpaid||0)>0?"warn":"ok"})),Fl(el,{error:n.error}),n.notice?Fl("div",{className:"form-success"},n.notice):null),Fl("div",{className:"project-manager-hero"},Fl("div",{className:"microservice-ref-card"},Fl("span",null,"Repo"),Fl("strong",null,m.url||"--"),Fl("code",null,m.commitId||"--")),Fl("div",{className:"microservice-ref-card"},Fl("span",null,"Main Server Docker"),Fl("strong",null,`${q.nodeBindHost||"--"}:${q.nodePort||"--"}`),Fl("code",null,`${m.composeService||"--"} / ${m.containerName||"--"}`)),Fl("div",{className:"microservice-ref-card"},Fl("span",null,"Runtime"),Fl("strong",null,Q.providerName||f.providerId),Fl("code",null,`Health ${O.ok?"OK":"--"} / ${n.refreshedAt?iu(n.refreshedAt):"--"}`)),Fl("div",{className:"microservice-ref-card"},Fl("span",null,"Import Source"),Fl("strong",null,"D601 WeChat Excel"),Fl("code",null,"合作项目列表_I_20260309.xlsx"))),Fl("div",{className:"project-manager-layout"},Fl(fj,{title:"项目清单",eyebrow:"CRUD + Excel Export",loading:n.loading||n.importing||n.exporting,actions:Fl("div",{className:"inline-actions project-manager-filters"},Fl("input",{value:c,onChange:(Z)=>_(Z.target.value),placeholder:"搜索合同号 / 项目名称 / 状态","data-testid":"project-manager-search"}),Fl("select",{value:A,onChange:(Z)=>{F(Z.target.value),N(c,Z.target.value)},"data-testid":"project-manager-status-filter"},Fl("option",{value:"all"},"全部"),Fl("option",{value:"active"},"进行中"),Fl("option",{value:"completed"},"已完成"),Fl("option",{value:"unpaid"},"未全款")),Fl("button",{type:"button",className:"ghost-btn",onClick:()=>N(c,A)},"筛选"))},Fl(eX,{projects:W,activeId:i.id,onSelect:(Z)=>y(aX(Z)),onRaw:u})),Fl(fj,{title:i.id?"编辑项目":"新建项目",eyebrow:"PostgreSQL Write Path",loading:n.saving||n.importing},Fl("form",{className:"stack-form project-manager-form",onSubmit:U,"data-testid":"project-manager-form"},i.id?Fl("label",null,"项目 ID",Fl("input",{value:i.id,disabled:!0})):null,Fl("label",null,"序号",Fl("input",{type:"number",value:i.sequenceNo,onChange:(Z)=>y((V)=>({...V,sequenceNo:Z.target.value}))})),Fl("label",null,"合同号",Fl("input",{value:i.contractNo,onChange:(Z)=>y((V)=>({...V,contractNo:Z.target.value})),required:!0})),Fl("label",null,"项目名称",Fl("input",{value:i.name,onChange:(Z)=>y((V)=>({...V,name:Z.target.value})),required:!0})),Fl("label",null,"当前状况",Fl("textarea",{value:i.currentStatus,onChange:(Z)=>y((V)=>({...V,currentStatus:Z.target.value}))})),Fl("label",null,"待完成",Fl("textarea",{value:i.pending,onChange:(Z)=>y((V)=>({...V,pending:Z.target.value}))})),Fl("label",null,"付款情况",Fl("input",{value:i.paymentStatus,onChange:(Z)=>y((V)=>({...V,paymentStatus:Z.target.value})),placeholder:"例如 1 / 0.5 / 50%"})),Fl("label",null,"其它",Fl("input",{value:i.notes,onChange:(Z)=>y((V)=>({...V,notes:Z.target.value}))})),Fl("div",{className:"inline-actions"},Fl("button",{type:"submit",className:"primary-btn",disabled:n.saving,"data-testid":"project-manager-save-button"},n.saving?"保存中":i.id?"保存修改":"创建项目"),Fl("button",{type:"button",className:"ghost-btn",onClick:()=>y({...rj})},"清空"),i.id?Fl("button",{type:"button",className:"danger-btn",disabled:n.saving,onClick:w,"data-testid":"project-manager-delete-button"},"删除"):null)),Fl("div",{className:"project-manager-import"},Fl("p",{className:"muted paragraph"},"浏览器只访问 UniDesk frontend;后端通过同源用户服务代理写入主 PostgreSQL,不暴露 4233 公网端口。"),Fl("label",{className:"file-import"},n.importing?"导入中...":"导入 Excel",Fl("input",{type:"file",accept:".xlsx",onChange:G,disabled:n.importing,"data-testid":"project-manager-import-input"}))))))}var K8=Ml(Ju(),1);var Jl=K8.default.createElement,{useEffect:lP}=K8.default,rf=K8.default.useState;function uP({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return Jl("span",{className:`status-badge ${r}`},u||l||"unknown")}function W8({label:l,value:u,hint:r,tone:f}){return Jl("article",{className:`metric-card ${f||""}`},Jl("div",{className:"metric-label"},l),Jl("div",{className:"metric-value"},u),Jl("div",{className:"metric-hint"},r))}function tj({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return Jl("section",{className:`panel ${n||""}`},Jl("div",{className:"panel-head"},Jl("div",null,u?Jl("p",{className:"panel-eyebrow"},u):null,Jl(nu,{title:l,loading:t})),r?Jl("div",{className:"panel-actions"},r):null),Jl("div",{className:"panel-body"},f))}function WG({title:l,data:u,onOpen:r,testId:f}){return Jl("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r(l,u)},"查看原始JSON")}function T8({title:l,text:u}){return Jl("div",{className:"empty-state"},Jl("strong",null,l),Jl("span",null,u))}function rP(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function fP(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function nP(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function KG(l){return String(l).replace(/[^a-zA-Z0-9_-]/g,"_")}function tP(l){if(!Number.isFinite(l))return"--";return`${l.toFixed(1)}%`}function vy(l,u){return`${l}/microservices/todo-note/proxy${u}`}function EG(l){return l.reduce((u,r)=>{let f=EG(Array.isArray(r.children)?r.children:[]),n=Boolean(r.completed);return{total:u.total+1+f.total,completed:u.completed+(n?1:0)+f.completed,active:u.active+(n?0:1)+f.active}},{total:0,completed:0,active:0})}function yj(l,u){let r=u==="all"||(u==="completed"?Boolean(l.completed):!l.completed),f=Array.isArray(l.children)?l.children:[];return r||f.some((n)=>yj(n,u))}function TG(l){return Array.isArray(l?.instances)?l.instances:[]}function ij(l,u){for(let r of l){if(r?.id===u)return Array.isArray(r.children)?r.children:[];let f=ij(Array.isArray(r?.children)?r.children:[],u);if(f.length>0)return f}return[]}function pG({microservices:l,onRaw:u,apiBaseUrl:r="/api"}){let f=l.find((g)=>g.id==="todo-note")||null,[n,t]=rf(null),[i,y]=rf(null),[c,_]=rf(""),[A,F]=rf(null),[j,N]=rf("all"),[U,w]=rf(13),[G,J]=rf(""),[Q,m]=rf(""),[q,W]=rf(""),[p,O]=rf(""),[Z,V]=rf(""),[P,H]=rf(!1),[B,C]=rf(""),[E,D]=rf(null),Y=TG(i),v=EG(Array.isArray(A?.todos)?A.todos:[]),K=f?rP(f):{},X=f?nP(f):{},I=f?fP(f):{};async function o(g=c){let[cl,pl]=await Promise.all([Tl(`${r}/microservices/todo-note/health`),Tl(vy(r,"/api/instances"))]);t(cl),y(pl);let Hl=TG(pl),bl=Hl.some((_u)=>_u.id===g)?g:Hl[0]?.id||"";return _(bl),bl}async function fl(g=c){if(!g){F(null);return}let cl=await Tl(vy(r,`/api/instances/${encodeURIComponent(g)}`));F(cl)}async function yl(g=c){if(!f)return;H(!0),C("");try{let cl=await o(g);await fl(cl),D(new Date)}catch(cl){C(zl(cl,"Todo Note 加载失败"))}finally{H(!1)}}async function h(g){if(!c)return null;C("");try{let cl=await Tl(vy(r,`/api/instances/${encodeURIComponent(c)}/actions`),{method:"POST",body:JSON.stringify({action:g})});return F(cl),await o(c),cl}catch(cl){return C(zl(cl,"Todo 操作失败")),null}}async function s(g){g.preventDefault();let cl=G.trim();if(!cl)return;H(!0),C("");try{let pl=await Tl(vy(r,"/api/instances"),{method:"POST",body:JSON.stringify({name:cl})});J(""),await yl(pl.id)}catch(pl){C(zl(pl,"创建清单失败"))}finally{H(!1)}}async function ul(g){if(!window.confirm("确认删除这个 Todo Note 清单?"))return;H(!0),C("");try{await Tl(vy(r,`/api/instances/${encodeURIComponent(g)}`),{method:"DELETE"}),await yl(c===g?"":c)}catch(cl){C(zl(cl,"删除清单失败"))}finally{H(!1)}}async function tl(g){g.preventDefault();let cl=Q.trim();if(!cl)return;m(""),await h({type:"addTodo",title:cl})}async function Al(g){if(!c)return;C("");try{let cl=await Tl(vy(r,`/api/instances/${encodeURIComponent(c)}/${g}`),{method:"POST",body:JSON.stringify({})});F(cl),await o(c)}catch(cl){C(zl(cl,`${g} 失败`))}}function Kl(g){W(g.id),O(String(g.title||""))}async function wl(g){let cl=p.trim();if(W(""),O(""),cl)await h({type:"updateTodoTitle",todoId:g,title:cl})}async function El(g){let pl=window.prompt("新增子任务标题")?.trim();if(!pl)return;let Hl=ij(Array.isArray(A?.todos)?A.todos:[],g),bl=new Set(Hl.map((gl)=>gl.id)),_u=await h({type:"addTodo",title:pl,parentId:g,targetIndex:0});if(!_u)return;let tu=ij(Array.isArray(_u?.todos)?_u.todos:[],g),Nu=tu.find((gl)=>!bl.has(gl.id));if(Nu&&tu[0]?.id!==Nu.id)await h({type:"moveTodo",todoId:Nu.id,targetParentId:g,targetIndex:0})}async function M(g,cl){if(!Z)return;let pl={type:"moveTodo",todoId:Z,targetIndex:cl};if(g)pl.targetParentId=g;V(""),await h(pl)}if(lP(()=>{yl()},[f?.id,f?.runtime?.providerStatus]),!f)return Jl(T8,{title:"Todo Note 未登记",text:"请在 config.json 的 microservices 中登记用户服务 id=todo-note"});let d=Y.find((g)=>g.id===c)||null,nl=Array.isArray(A?.todos)?A.todos:[],k=nl.map((g,cl)=>({todo:g,index:cl})).filter((g)=>yj(g.todo,j));return Jl("div",{className:"todo-note-page","data-testid":"todo-note-page"},Jl(tj,{title:"Todo Note 工作台",eyebrow:"Main Server 用户服务",loading:P,actions:Jl("div",{className:"panel-actions"},Jl("button",{type:"button",className:"ghost-btn",disabled:P,onClick:()=>yl(c),"data-testid":"todo-note-refresh-button"},P?"刷新中":"刷新"),Jl(WG,{title:"Todo Note 用户服务",data:f,onOpen:u,testId:"raw-todo-note-service"}))},Jl("div",{className:"todo-note-hero"},Jl("div",null,Jl("div",{className:"node-version-line"},Jl(uP,{status:K.providerStatus==="online"?"online":"warn"},K.providerStatus||"unknown"),Jl("span",null,f.providerId),Jl("span",null,I.public?"公网暴露":"仅 UniDesk frontend 代理访问"),Jl("span",null,n?.ok?"Health OK":"Health --")),Jl("p",{className:"muted paragraph"},f.description)),Jl("div",{className:"microservice-ref-card"},Jl("span",null,"Repo"),Jl("strong",null,X.url||"--"),Jl("code",null,X.commitId||"--")),Jl("div",{className:"microservice-ref-card"},Jl("span",null,"Main Server Docker"),Jl("strong",null,`${I.nodeBindHost||"--"}:${I.nodePort||"--"}`),Jl("code",null,`${X.composeService||"--"} / ${X.containerName||"--"}`))),Jl(el,{error:B,wide:!0})),Jl("div",{className:"todo-note-layout"},Jl(tj,{title:"清单",eyebrow:`${Y.length} Instances`,className:"todo-list-panel",loading:P},Jl("form",{className:"todo-create-list",onSubmit:s},Jl("input",{placeholder:"新清单名称",value:G,onChange:(g)=>J(g.target.value),"aria-label":"新清单名称"}),Jl("button",{type:"submit",className:"ghost-btn",disabled:P||!G.trim()},"创建")),Y.length===0?Jl(T8,{title:"暂无清单",text:"迁移或创建清单后会出现在这里"}):Jl("div",{className:"todo-instance-list"},Y.map((g)=>Jl("button",{key:g.id,type:"button",className:`todo-instance-row ${c===g.id?"active":""}`,onClick:()=>{_(g.id),fl(g.id)},"data-testid":`todo-instance-${KG(g.id)}`},Jl("strong",null,g.name),Jl("span",null,`${g.completedCount??0}/${g.todoCount??0} 完成`),Jl("code",null,g.id))))),Jl("div",{className:"todo-main-stack"},Jl(tj,{title:d?.name||"待选择清单",eyebrow:E?`Updated ${iu(E)}`:"Todo Tree",loading:P,actions:A?Jl("div",{className:"panel-actions"},Jl("button",{type:"button",className:"ghost-btn",onClick:()=>h({type:"renameInstance",name:window.prompt("清单新名称",A.name)||A.name})},"重命名"),Jl("button",{type:"button",className:"ghost-btn danger",onClick:()=>ul(c)},"删除清单"),Jl(WG,{title:`Todo Instance ${c}`,data:A,onOpen:u,testId:"raw-todo-instance"})):null},!A?Jl(T8,{title:"未选择清单",text:"左侧选择一个 Todo Note 清单"}):Jl("div",{className:"todo-workbench",style:{"--todo-font-size":`${U}px`}},Jl("div",{className:"todo-toolbar"},Jl("form",{className:"todo-add-form",onSubmit:tl},Jl("input",{placeholder:"新增根任务",value:Q,onChange:(g)=>m(g.target.value),"aria-label":"新增根任务"}),Jl("button",{type:"submit",className:"ghost-btn",disabled:!Q.trim()},"新增")),Jl("div",{className:"todo-filter-strip"},["all","active","completed"].map((g)=>Jl("button",{key:g,type:"button",className:`todo-filter ${j===g?"active":""}`,onClick:()=>N(g)},g==="all"?"全部":g==="active"?"未完成":"已完成"))),Jl("div",{className:"todo-toolbar-actions"},Jl("button",{type:"button",className:"ghost-btn",onClick:()=>h({type:"setAllTodosExpanded",expanded:!0})},"全部展开"),Jl("button",{type:"button",className:"ghost-btn",onClick:()=>h({type:"setAllTodosExpanded",expanded:!1})},"全部收起"),Jl("button",{type:"button",className:"ghost-btn",onClick:()=>Al("undo")},"撤销"),Jl("button",{type:"button",className:"ghost-btn",onClick:()=>Al("redo")},"重做"),Jl("label",{className:"todo-font-control"},"字号",Jl("input",{type:"range",min:11,max:18,value:U,onChange:(g)=>w(Number(g.target.value))})))),Jl("div",{className:"todo-stats-grid"},Jl(W8,{label:"总任务",value:v.total,hint:`${Y.length} lists`}),Jl(W8,{label:"已完成",value:v.completed,hint:`${tP(v.total?v.completed/v.total*100:0)}`,tone:"ok"}),Jl(W8,{label:"未完成",value:v.active,hint:j==="active"?"当前筛选":"active tasks",tone:v.active>0?"warn":"ok"}),Jl(W8,{label:"历史指针",value:A.historyPointer??0,hint:"undo / redo"})),Jl("div",{className:"todo-root-drop",onDragOver:(g)=>g.preventDefault(),onDrop:(g)=>{g.preventDefault(),M(null,nl.length)}},"拖到这里可移为根任务末尾"),Jl("div",{className:"todo-tree","data-testid":"todo-note-tree"},k.length===0?Jl(T8,{title:"没有匹配任务",text:"调整筛选或新增任务"}):k.map(({todo:g,index:cl})=>Jl(zG,{key:g.id,todo:g,depth:0,parentId:null,index:cl,siblingCount:nl.length,filter:j,editingId:q,editingTitle:p,setEditingTitle:O,beginEdit:Kl,saveEdit:wl,applyTodoAction:h,addChild:El,dragTodoId:Z,setDragTodoId:V,dropTodo:M}))))))))}function zG(l){let{todo:u,depth:r,parentId:f,index:n,siblingCount:t,filter:i,editingId:y,editingTitle:c,setEditingTitle:_,beginEdit:A,saveEdit:F,applyTodoAction:j,addChild:N,dragTodoId:U,setDragTodoId:w,dropTodo:G}=l,J=Array.isArray(u.children)?u.children:[],Q=J.map((W,p)=>({child:W,childIndex:p})).filter((W)=>yj(W.child,i)),m=y===u.id,q=f||null;return Jl("div",{className:"todo-row-wrap"},Jl("article",{className:`todo-row ${u.completed?"completed":""} ${U===u.id?"dragging":""}`,style:{"--todo-depth":r},draggable:!0,onDragStart:(W)=>{w(u.id),W.dataTransfer.effectAllowed="move"},onDragOver:(W)=>W.preventDefault(),onDrop:(W)=>{W.preventDefault(),G(u.id,J.length)},"data-testid":`todo-row-${KG(u.id)}`},Jl("button",{type:"button",className:"todo-expand",disabled:J.length===0,onClick:()=>j({type:"toggleTodoExpanded",todoId:u.id})},J.length===0?"·":u.expanded?"▾":"▸"),Jl("input",{type:"checkbox",checked:Boolean(u.completed),onChange:()=>j({type:"toggleTodoCompleted",todoId:u.id}),"aria-label":`完成 ${u.title}`}),Jl("div",{className:"todo-title-cell",onDoubleClick:()=>A(u)},m?Jl("div",{className:"todo-edit-inline"},Jl("input",{value:c,autoFocus:!0,onChange:(W)=>_(W.target.value),onKeyDown:(W)=>{if(W.key==="Enter")F(u.id);if(W.key==="Escape")A({id:"",title:""})}}),Jl("button",{type:"button",className:"ghost-btn",onClick:()=>F(u.id)},"保存")):Jl("strong",null,u.title||"Untitled"),Jl("div",{className:"todo-meta-line"},Jl("span",null,`子项 ${J.length}`),Jl("span",null,`更新 ${Ll(u.updatedAt)}`),u.reminderAt?Jl("span",{className:"todo-reminder"},`提醒 ${Ll(u.reminderAt)}`):Jl("span",null,"无提醒"))),Jl("input",{className:"todo-reminder-input",type:"datetime-local",value:l6(u.reminderAt),onChange:(W)=>j({type:"setTodoReminder",todoId:u.id,reminderAt:n7(W.target.value)})}),Jl("div",{className:"todo-row-actions"},Jl("button",{type:"button",className:"ghost-btn",onClick:()=>A(u)},"编辑"),Jl("button",{type:"button",className:"ghost-btn",onClick:()=>N(u.id)},"子项"),Jl("button",{type:"button",className:"ghost-btn",disabled:n<=0,onClick:()=>j({type:"moveTodo",todoId:u.id,...q?{targetParentId:q}:{},targetIndex:n-1})},"上移"),Jl("button",{type:"button",className:"ghost-btn",disabled:n<=0,onClick:()=>j({type:"moveTodo",todoId:u.id,...q?{targetParentId:q}:{},targetIndex:0})},"置顶"),Jl("button",{type:"button",className:"ghost-btn",disabled:n>=t-1,onClick:()=>j({type:"moveTodo",todoId:u.id,...q?{targetParentId:q}:{},targetIndex:n+1})},"下移"),Jl("button",{type:"button",className:"ghost-btn",disabled:!f,onClick:()=>j({type:"moveTodo",todoId:u.id,targetIndex:9999})},"提升"),Jl("button",{type:"button",className:"ghost-btn danger",onClick:()=>j({type:"deleteTodo",todoId:u.id})},"删除"))),u.expanded&&Q.length>0?Jl("div",{className:"todo-children"},Q.map(({child:W,childIndex:p})=>Jl(zG,{key:W.id,todo:W,depth:r+1,parentId:u.id,index:p,siblingCount:J.length,filter:i,editingId:y,editingTitle:c,setEditingTitle:_,beginEdit:A,saveEdit:F,applyTodoAction:j,addChild:N,dragTodoId:U,setDragTodoId:w,dropTodo:G}))):null)}var OG=Ml(Ju(),1),Fi=OG.default.createElement;function ZG({title:l,items:u,actions:r,className:f,testId:n}){let t=Array.isArray(u)?u:[];return Fi("section",{className:`top-status-bar ${f||""}`,"data-testid":n},Fi("div",{className:"top-status-main"},l?Fi("strong",{className:"top-status-title"},l):null,Fi("div",{className:"top-status-chips"},t.map((i,y)=>Fi("span",{key:i?.key||`${i?.label||"status"}-${y}`,className:`top-status-chip ${i?.tone||""}`,"data-testid":i?.testId},i?.label?Fi("b",null,i.label):null,Fi("span",null,i?.value??"--"))))),r?Fi("div",{className:"top-status-actions"},r):null)}var w$=Ml(Ju(),1);var ql=w$.default.createElement,{useEffect:iP,useMemo:yP}=w$.default,cP=w$.default.useState;function HG({status:l,children:u,title:r}){let f=String(l||"unknown").toLowerCase();return ql("span",{className:`status-badge ${f}`,title:r},u||l||"unknown")}function E8({label:l,value:u,hint:r,tone:f}){return ql("article",{className:`metric-card ${f||""}`},ql("div",{className:"metric-label"},l),ql("div",{className:"metric-value"},u),ql("div",{className:"metric-hint"},r))}function cj({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){return ql("section",{className:`panel ${n||""}`},ql("div",{className:"panel-head"},ql("div",null,u?ql("p",{className:"panel-eyebrow"},u):null,ql(nu,{title:l,loading:t})),r?ql("div",{className:"panel-actions"},r):null),ql("div",{className:"panel-body"},f))}function BG({title:l,data:u,onOpen:r,testId:f}){return ql("button",{type:"button",className:"ghost-btn","data-testid":f,onClick:()=>r?.(l,u)},"查看原始JSON")}function $j({title:l,text:u}){return ql("div",{className:"empty-state"},ql("strong",null,l),ql("span",null,u))}function gy(l){return Array.isArray(l)?l:[]}function _j(l){return l&&typeof l==="object"&&!Array.isArray(l)?l:{}}function $P(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function _P(l,u){return`${l}/microservices/k3sctl-adapter/proxy${u}`}function AP(l){return l.find((u)=>String(u?.id||"")==="k3sctl-adapter")||null}function FP(l){if(l?.healthy===!0)return"online";if(String(l?.role||"")==="standby")return"warn";return"failed"}function jP(l){return l?.healthy===!0?"online":"failed"}function NP(l){if(l===!0)return"YES";if(l===!1)return"NO";return"--"}function JP(l){return Array.from(new Set(l.flatMap((u)=>gy(u?.expectedNodeIds).map((r)=>String(r))))).filter(Boolean).sort()}function UP(l){let u=l.find((r)=>r?.id==="code-queue")||l[0];return String(u?.activeInstanceId||"--")}function QP(l){return ql("article",{key:l?.id||l?.nodeId,className:"k3s-instance-card"},ql("div",{className:"node-card-head"},ql("strong",null,l?.nodeId||l?.id||"--"),ql(HG,{status:FP(l)},l?.healthy?"HEALTHY":"DEGRADED")),ql("div",{className:"k3s-instance-role"},ql("span",null,String(l?.role||"worker").toUpperCase()),ql("code",null,l?.id||"--")),ql("dl",{className:"k3s-kv"},ql("dt",null,"Base URL"),ql("dd",null,ql("code",null,l?.baseUrl||"--")),ql("dt",null,"Proxy"),ql("dd",null,l?.proxyMode||"--"),ql("dt",null,"Health"),ql("dd",null,`${l?.upstreamStatus??"--"} / ${l?.status||"unknown"}`),ql("dt",null,"Checked"),ql("dd",null,Ll(l?.checkedAt))))}function mP(l,u){let r=gy(l?.instances),f=_j(l?.active);return ql(cj,{key:l?.id||"service",title:l?.id||"managed-service",eyebrow:`${l?.namespace||"unidesk"} / k3s managed service`,className:"k3s-service-panel",actions:ql(BG,{title:`k3s service ${l?.id||""}`,data:l,onOpen:u,testId:`raw-k3s-service-${l?.id||"unknown"}`})},ql("div",{className:"k3s-service-summary"},ql("div",null,ql("span",null,"状态"),ql(HG,{status:jP(l)},l?.status||"unknown")),ql("div",null,ql("span",null,"Active"),ql("strong",null,l?.activeInstanceId||"--")),ql("div",null,ql("span",null,"Single Writer"),ql("strong",null,NP(l?.singleWriter))),ql("div",null,ql("span",null,"Active Health"),ql("strong",null,f?.upstreamStatus??"--"))),r.length===0?ql($j,{title:"暂无 k3s 实例",text:"adapter 没有返回该服务的 endpoint 列表"}):ql("div",{className:"k3s-instance-grid"},r.map(QP)))}function DG({microservices:l,onRaw:u,apiBaseUrl:r,onNavigate:f}){let n=AP(Array.isArray(l)?l:[]),t=$P(n),[i,y]=cP({loading:!1,error:"",data:null,refreshedAt:null});async function c(){y((Q)=>({...Q,loading:!0,error:""}));try{let Q=await Tl(_P(r,"/api/control-plane"));y({loading:!1,error:"",data:Q,refreshedAt:new Date})}catch(Q){y((m)=>({...m,loading:!1,error:zl(Q,"加载 k3s 控制平面失败")}))}}iP(()=>{c()},[r]);let _=yP(()=>gy(i.data?.services),[i.data]),A=JP(_),F=_.filter((Q)=>Q?.healthy===!0).length,j=_.reduce((Q,m)=>Q+gy(m?.instances).length,0),N=_.reduce((Q,m)=>Q+gy(m?.instances).filter((q)=>q?.healthy===!0).length,0),U=UP(_),w=_j(i.data?.kubectl),G=_j(i.data?.kubeApiProxy),J=gy(i.data?.manifestPaths).map((Q)=>String(Q));if(!n)return ql($j,{title:"k3sctl-adapter 未登记",text:"请在 config.json 的 microservices 中登记 id=k3sctl-adapter,并通过该微服务连接 k3s 控制平面。"});return ql("div",{className:"k3s-page","data-testid":"k3sctl-page"},ql(cj,{title:"k3s Control Plane",eyebrow:"Managed by k3sctl-adapter",className:"k3s-hero-panel",loading:i.loading,actions:ql(w$.default.Fragment,null,ql("button",{type:"button",className:"ghost-btn",onClick:c,disabled:i.loading,"data-testid":"k3s-refresh-button"},i.loading?"刷新中":"刷新"),f?ql("button",{type:"button",className:"ghost-btn",onClick:()=>f("apps","code-queue"),"data-testid":"k3s-open-code-queue"},"打开 Code Queue"):null,ql(BG,{title:"k3sctl-adapter microservice",data:n,onOpen:u,testId:"raw-k3s-adapter"}))},ql("div",{className:"k3s-hero"},ql("div",{className:"k3s-orb","aria-hidden":"true"},ql("span",null,"k3s")),ql("div",{className:"k3s-hero-copy"},ql("p",{className:"eyebrow"},"D601 native control plane"),ql("h2",null,"UniDesk 只管理 adapter;业务微服务交给 k3s 标准服务路由"),ql("p",{className:"muted paragraph"},"Code Queue 的前端/API 请求进入 k3sctl-adapter,再由 adapter 转发到 k3s active service。provider-gateway 只用于维护 adapter 和节点诊断,不再直接管理 Code Queue 容器。"),ql("div",{className:"k3s-route-strip"},ql("span",null,"NO FALLBACK"),ql("code",null,i.data?.runtimePath||"frontend -> backend-core -> k3sctl-adapter")))),ql("div",{className:"metric-grid"},ql(E8,{label:"控制面",value:i.data?.clusterId||"D601",hint:`adapter ${t.providerStatus||"unknown"}`,tone:t.providerStatus==="online"?"ok":"warn"}),ql(E8,{label:"代管服务",value:_.length,hint:`${F}/${_.length||0} healthy`,tone:F===_.length&&_.length>0?"ok":"warn"}),ql(E8,{label:"节点",value:A.join(" / ")||"--",hint:"expected k3s nodes"}),ql(E8,{label:"实例",value:`${N}/${j}`,hint:`active ${U}`,tone:N===j&&j>0?"ok":"warn"})),ql("div",{className:"k3s-control-plane-grid"},ql("article",{className:"k3s-control-plane-card"},ql("span",null,"service proxy"),ql("strong",null,G.configured===!0?"K8S API PROXY":"PROXY DEGRADED"),ql("p",null,G.configured===!0?`${G.mode||"kubernetes-api-service-proxy"} via ${G.connectHost||"--"}`:"adapter 必须通过 k8s API service proxy 访问业务服务,不回退到业务容器直连。")),ql("article",{className:"k3s-control-plane-card"},ql("span",null,"manifests"),ql("strong",null,J.length||"--"),ql("p",null,J.join(" / ")||"未配置 manifest")),ql("article",{className:"k3s-control-plane-card"},ql("span",null,"cluster snapshot"),ql("strong",null,w.enabled===!0?w.ok===!0?"KUBECTL OK":"KUBECTL DEGRADED":"API ONLY"),ql("p",null,w.enabled===!0?`nodes ${w.nodeCount??"--"}`:"控制面页面以 adapter 返回的 k8s service proxy 状态为准;kubectl 只作为可选快照。"))),i.error?ql(el,{error:i.error}):null,i.refreshedAt?ql("p",{className:"muted paragraph"},`最近刷新 ${iu(i.refreshedAt)}`):null),_.length===0?ql(cj,{title:"代管服务",eyebrow:"k3s services",loading:i.loading},ql($j,{title:"暂无 k3s 服务",text:"等待 k3sctl-adapter 返回 /api/services;Code Queue 应显示 D601 scheduler/read/write 服务实例。"})):_.map((Q)=>mP(Q,u)))}var q$=Ml(Ju(),1);var du=q$.default.createElement;function VG({onClose:l}){let{notifications:u,removeNotification:r,clearNotifications:f}=Xr(),n=q$.default.useRef(null);if(q$.default.useEffect(()=>{let t=(i)=>{if(n.current&&!n.current.contains(i.target))l()};return document.addEventListener("mousedown",t),()=>document.removeEventListener("mousedown",t)},[l]),u.length===0)return du("div",{className:"notification-popup",ref:n},du("div",{className:"notification-popup-header"},du("span",null,"通知"),du("button",{className:"notification-popup-close",onClick:l},"×")),du("div",{className:"notification-popup-empty"},"暂无通知"));return du("div",{className:"notification-popup",ref:n},du("div",{className:"notification-popup-header"},du("span",null,`通知 (${u.length})`),du("div",{className:"notification-popup-actions"},du("button",{className:"notification-popup-clear",onClick:f},"清空"),du("button",{className:"notification-popup-close",onClick:l},"×"))),du("div",{className:"notification-popup-list"},u.slice().reverse().map((t)=>du("div",{key:t.id,className:`notification-item ${t.type}`},du("span",{className:"notification-item-icon"},t.type==="success"?"✓":"×"),du("span",{className:"notification-item-message"},t.message),du("button",{className:"notification-item-dismiss",onClick:()=>r(t.id)},"×")))))}function SG({notification:l}){let{removeNotification:u}=Xr();return q$.default.useEffect(()=>{let r=setTimeout(()=>{u(l.id)},3000);return()=>clearTimeout(r)},[l.id,u]),du("div",{className:`notification-banner ${l.type}`,role:"alert"},du("span",{className:"notification-banner-icon"},l.type==="success"?"✓":"×"),du("span",{className:"notification-banner-message"},l.message),du("button",{className:"notification-banner-dismiss",onClick:()=>u(l.id)},"×"))}function kG(l,u){let r=document.getElementById("root")?.getAttribute(l);if(!r)return u;try{let f=JSON.parse(r);return typeof f==="object"&&f!==null&&!Array.isArray(f)?f:u}catch{return u}}var vl=kG("data-config",{apiBaseUrl:"/api",authUsername:"admin"}),YG=vl.environment&&typeof vl.environment==="object"?vl.environment:{},wP=kG("data-codex-overview",null),$=Ni.default.createElement,{useEffect:Bn,useMemo:W$}=Ni.default,Il=Ni.default.useState,Nj=Ni.default.createContext(!1),Cf=zm(d3),qP={id:"code-queue",name:"Code Queue",providerId:"D601",description:"Code Queue",repository:{containerName:"k3s:code-queue"},backend:{nodeBaseUrl:"k3s://code-queue",nodeBindHost:"k3s://unidesk/code-queue",nodePort:4222,proxyMode:"k3sctl-adapter-http",public:!1},deployment:{mode:"k3sctl-managed",adapterServiceId:"k3sctl-adapter",k3sServiceId:"code-queue"},runtime:{orchestrator:"k3sctl",providerStatus:"loading",providerName:"D601"}};function XG(){return typeof document>"u"||document.visibilityState!=="hidden"}function IG(l){return l?.environment==="dev"||l?.namespace==="unidesk-dev"}function LP(l){let u=typeof l==="string"?l:"";return u.length>=7?u.slice(0,7):u||"unknown"}function GP(l,u){if(l==="ops"&&u==="status")return 5000;if(l==="nodes"&&u==="monitor")return 5000;if(l==="tasks"&&(u==="dispatch"||u==="scheduled"||u==="pending"))return 5000;if(l==="nodes"||l==="ops")return 1e4;if(l==="apps")return 15000;if(l==="tasks")return 15000;return 30000}async function WP(l){if(!l?._summaryOnly||!l?.id)return l;return(await Tl(`${vl.apiBaseUrl}/tasks/${encodeURIComponent(String(l.id))}`))?.task||l}function T$(l){return l?._summaryOnly?{...l,_loadRaw:()=>WP(l)}:l}function ct(l){if(!Number.isFinite(l))return"--";let u=Math.max(0,l);if(u===0)return"0s";if(u<0.01)return"<0.01s";if(u<0.1)return`${u.toFixed(2)}s`;if(u<1)return`${u.toFixed(1)}s`;if(u<10&&!Number.isInteger(u))return`${u.toFixed(1)}s`;if(u<60)return`${Math.round(u)}s`;let r=Math.floor(u);if(r<3600)return`${Math.floor(r/60)}m ${r%60}s`;return`${Math.floor(r/3600)}h ${Math.floor(r%3600/60)}m`}function Lf(l){let u=Number(l);if(!Number.isFinite(u))return"--";if(u<1)return`${Math.max(0,u).toFixed(1)}ms`;if(u<10)return`${u.toFixed(1)}ms`;if(u<1000)return`${Math.round(u)}ms`;return ct(u/1000)}function Qr(l){let u=Number(l);if(!Number.isFinite(u)||u<=0)return"--";let r=["B","KB","MB","GB","TB"],f=u,n=0;while(f>=1024&&n0)return r[f]}return"任务失败但 provider 未返回明确原因"}function _0(l){if(l===null||l===void 0)return"--";if(typeof l==="boolean")return l?"是":"否";if(typeof l==="number")return String(l);if(typeof l==="string")return l.length>80?`${l.slice(0,77)}...`:l;if(Array.isArray(l))return`${l.length} 项`;if(typeof l==="object")return`${Object.keys(l).length} 字段`;return String(l)}function KP(l,u){let r=l.replace(/[-_\s]/g,"").toLowerCase(),f=r==="ts"||r.endsWith("at")||r.endsWith("timestamp")||r.endsWith("heartbeat");if((typeof u==="string"||typeof u==="number")&&f){let n=Ll(u);if(n!=="--")return n}if(l==="bodyText"&&typeof u==="string")return`${/^\s*[{[]/.test(u)?"JSON":"HTTP"} body ${u.length} chars`;return _0(u)}function dG(l){if(!l||typeof l!=="object"||Array.isArray(l))return[];return Object.entries(l)}function ff(l){return String(l).replace(/[^a-zA-Z0-9_-]/g,"_")}function Uj(l,u){return l&&typeof l==="object"&&!Array.isArray(l)?l[u]:void 0}function z8(l,u,r="未知"){let f=Uj(l?.labels,u);return typeof f==="string"&&f.length>0?f:r}function eG(l){return z8(l,"providerGatewayVersion")}function G$(l){return z8(l,"providerGatewayUpgradePolicy")}function PG(l){return z8(l,"providerGatewayStartedAt","")}function lW(l){let u=Uj(l?.labels,"unideskCapabilities");if(typeof u==="string")return u.split(",").map((r)=>r.trim()).filter(Boolean);return Array.isArray(u)?u.filter((r)=>typeof r==="string"):[]}function uW(l,u){return lW(l).includes(u)}function CG(l,u){let r=Uj(l?.labels,u);return r===!0||r==="true"||r==="1"}function EP(l){if(!uW(l,"host.ssh"))return{tone:"fail",label:"不可用",detail:"未声明 host.ssh"};if(!CG(l,"hostSshConfigured"))return{tone:"warn",label:"未配置",detail:"缺少 SSH 环境变量"};if(!CG(l,"hostSshKeyPresent"))return{tone:"warn",label:"缺 key",detail:"私钥未挂载"};return{tone:"ok",label:"可用",detail:z8(l,"hostSshTarget","host.ssh ready")}}function pP(l){if(!uW(l,"provider.upgrade"))return{tone:"fail",label:"不可用",detail:"未声明 provider.upgrade"};let u=G$(l);if(u!=="always-enabled")return{tone:"warn",label:"待确认",detail:`策略 ${u}`};return{tone:"ok",label:"可用",detail:"always-enabled"}}function Qj(l){let u=typeof l==="string"&&l.length>0?l:"未知";if(u==="未知")return"版本未知";return u.startsWith("v")?u:`v${u}`}function rW(l){return l?.payload&&typeof l.payload==="object"&&!Array.isArray(l.payload)?l.payload:{}}function O8(l){return l?.result&&typeof l.result==="object"&&!Array.isArray(l.result)?l.result:{}}function p8(l){let u=rW(l),r=O8(l);return(u.mode??r.mode)==="schedule"?"schedule":"plan"}function zP(l){let u=rW(l).source;return typeof u==="string"&&u.length>0?u:"unknown"}function OP(l){let u=O8(l),r=u.plan&&typeof u.plan==="object"&&!Array.isArray(u.plan)?u.plan:{},f=u.policy??r.policy;return typeof f==="string"&&f.length>0?f:"--"}function fW(l){let u=O8(l),r=u.plan&&typeof u.plan==="object"&&!Array.isArray(u.plan)?u.plan:{},f=u.targetProviderGatewayVersion??u.providerGatewayVersion??r.targetProviderGatewayVersion??r.providerGatewayVersion;return typeof f==="string"&&f.length>0?Qj(f):"版本未知"}function nW(l){if(String(l?.status||"").toLowerCase()==="failed")return oG(l);if(Iy(l))return"等待 provider 回传升级终态";let r=O8(l);if(typeof r.updaterContainerId==="string"&&r.updaterContainerId.length>0)return`updater ${r.updaterContainerId.slice(0,18)}`;if(typeof r.message==="string"&&r.message.length>0)return r.message;if(r.plan)return"升级计划已生成";return"无升级结果摘要"}function tW(l,u){return l.filter((r)=>r?.providerId===u&&r?.command==="provider.upgrade").sort((r,f)=>(Dn(f.updatedAt)??0)-(Dn(r.updatedAt)??0))}function ZP(l){return l.find((u)=>p8(u)==="schedule")||l[0]||null}function iW(l){return l?.runtime&&typeof l.runtime==="object"&&!Array.isArray(l.runtime)?l.runtime:{}}function hG(l){return l?.backend&&typeof l.backend==="object"&&!Array.isArray(l.backend)?l.backend:{}}function HP(l){return l?.repository&&typeof l.repository==="object"&&!Array.isArray(l.repository)?l.repository:{}}function Wu({status:l,children:u}){let r=String(l||"unknown").toLowerCase();return $("span",{className:`status-badge ${r}`},u||l||"unknown")}function Qu({label:l,value:u,hint:r,tone:f,onClick:n,testId:t}){let i=typeof n==="function";return $("article",{className:`metric-card ${f||""} ${i?"clickable":""}`,role:i?"button":void 0,tabIndex:i?0:void 0,"data-testid":t,onClick:n,onKeyDown:i?(y)=>{if(y.key==="Enter"||y.key===" ")y.preventDefault(),n()}:void 0},$("div",{className:"metric-label"},l),$("div",{className:"metric-value"},u),$("div",{className:"metric-hint"},r))}function ru({title:l,eyebrow:u,actions:r,children:f,className:n,loading:t}){let i=Ni.default.useContext(Nj),y=Boolean(t)||i;return $("section",{className:`panel ${n||""}`},$("div",{className:"panel-head"},$("div",null,u?$("p",{className:"panel-eyebrow"},u):null,$(nu,{title:l,loading:y})),r?$("div",{className:"panel-actions"},r):null),$("div",{className:"panel-body"},f))}function eu({title:l,data:u,onOpen:r,testId:f}){let[n,t]=Il(!1),i=u&&typeof u==="object"&&typeof u._loadRaw==="function"?u._loadRaw:null;async function y(){if(!i){r(l,u);return}t(!0);try{r(l,await i())}catch(c){r(l,{ok:!1,error:zl(c,"读取原始 JSON 失败"),fallback:u})}finally{t(!1)}}return $("button",{type:"button",className:"ghost-btn","data-testid":f,disabled:n,onClick:()=>void y()},n?"读取中":"查看原始JSON")}function BP({raw:l,onClose:u}){if(!l)return null;return $("div",{className:"modal-backdrop",role:"presentation"},$("section",{className:"raw-dialog",role:"dialog","aria-modal":"true","aria-label":l.title},$("div",{className:"raw-dialog-head"},$("h2",null,l.title),$("button",{type:"button",className:"ghost-btn",onClick:u},"关闭")),$("pre",{className:"raw-json","data-testid":"raw-json"},JSON.stringify(l.data,null,2))))}function yW({labels:l,limit:u=8}){let r=dG(l).slice(0,u);if(r.length===0)return $("span",{className:"muted"},"无标签");return $("div",{className:"chip-row"},r.map(([f,n])=>$("span",{key:f,className:"data-chip"},$("b",null,f),$("span",null,_0(n)))))}function ky({node:l}){let u=eG(l);return $("span",{className:`version-chip ${u==="未知"?"unknown":""}`,"data-testid":`gateway-version-${ff(l?.providerId||"unknown")}`},Qj(u))}function MG({title:l,state:u,testId:r}){return $("span",{className:`capability-badge ${u.tone}`,title:u.detail,"data-testid":r},$("b",null,l),$("strong",null,u.label),$("small",null,u.detail))}function mj({node:l}){let u=ff(l?.providerId||"unknown");return $("div",{className:"node-availability-strip"},$(MG,{title:"SSH 透传",state:EP(l),testId:`ssh-availability-${u}`}),$(MG,{title:"远程更新",state:pP(l),testId:`upgrade-availability-${u}`}))}function Ji({data:l,empty:u="无数据"}){if(l===null||l===void 0)return $("span",{className:"muted"},u);if(typeof l!=="object")return $("span",{className:"summary-value"},_0(l));if(Array.isArray(l))return $("span",{className:"summary-value"},`${l.length} 项列表`);let r=Object.entries(l).slice(0,5);if(r.length===0)return $("span",{className:"muted"},u);return $("div",{className:"summary-grid"},r.map(([f,n])=>$("span",{key:f,className:"summary-item"},$("b",null,f),$("span",null,KP(f,n)))))}function wu({title:l,text:u}){return $("div",{className:"empty-state"},$("strong",null,l),$("span",null,u))}function DP({onLogin:l}){let[u,r]=Il(vl.authUsername||"admin"),[f,n]=Il(""),[t,i]=Il(""),[y,c]=Il(!1);async function _(A){A.preventDefault(),c(!0),i("");try{let F=await Tl("/login",{method:"POST",body:JSON.stringify({username:u,password:f})});l(F)}catch(F){i(zl(F,"登录失败"))}finally{c(!1)}}return $("main",{className:"login-screen","data-testid":"login-screen"},$("section",{className:"login-card"},$("div",{className:"login-brand"},$("span",{className:"brand-mark"},"UD"),$("div",null,$("h1",null,"UniDesk"),$("p",null,"Control Plane Login"))),$("form",{className:"login-form",onSubmit:_},$("label",null,"账号",$("input",{name:"username",autoComplete:"username",value:u,onChange:(A)=>r(A.target.value)})),$("label",null,"密码",$("input",{name:"password",type:"password",autoComplete:"current-password",value:f,onChange:(A)=>n(A.target.value)})),$(el,{error:t}),$("button",{type:"submit",disabled:y},y?"登录中":"登录")),$("div",{className:"login-note"},"默认账号由 config.json 注入;公网入口只暴露前端登录面。")))}function VP({connection:l,lastRefresh:u,onRefresh:r,onLogout:f,session:n,clock:t,activeStatusItems:i=[],onNotificationToggle:y,unreadCount:c=0,environment:_={}}){let A=IG(_),F=[...A?[{key:"environment",label:"环境",value:`${_.namespace||"unidesk-dev"}`,tone:"warn"}]:[],{key:"core",label:"核心",value:l.text,tone:l.ok?"ok":"fail",testId:"conn-text"},...Array.isArray(i)?i:[],{key:"refresh",label:"刷新",value:u?iu(u):"未刷新"},{key:"clock",label:x$,value:iu(t)},{key:"user",label:"用户",value:n?.user?.username||"--",tone:"user"}];return $("header",{className:"topbar"},$("div",null,$("p",{className:"eyebrow"},"Distributed Work Platform"),$("h1",null,"UniDesk 控制平面"),A?$("div",{className:"dev-env-ribbon","data-testid":"dev-environment-ribbon"},$("b",null,"DEV"),$("span",null,_.namespace||"unidesk-dev"),$("span",null,_.deployRef||"origin/master:deploy.json#environments.dev"),$("span",null,LP(_.commit||_.requestedCommit))):null),$(ZG,{className:"global-top-status",title:"状态",items:F,actions:[$("button",{key:"notification",type:"button",className:`notification-icon-btn ${c>0?"has-unread":""}`,onClick:y,"aria-label":"通知"},"\uD83D\uDD14",c>0?$("span",{key:"badge",className:"notification-badge"},c>99?"99+":c):null),$("button",{key:"refresh",type:"button",className:"ghost-btn",onClick:r},"刷新"),$("button",{key:"logout",type:"button",className:"ghost-btn danger",onClick:f},"退出")]}))}function SP(l){return!l.defaultPrevented&&l.button===0&&!l.metaKey&&!l.altKey&&!l.ctrlKey&&!l.shiftKey&&l.currentTarget.target!=="_blank"}function cW({moduleId:l,tabId:u,className:r,active:f=!1,title:n,testId:t,onNavigate:i,children:y}){let c=e3(Cf,l,u);return $("a",{href:c,role:"button",className:r,title:n,"aria-current":f?"page":void 0,"data-testid":t,"data-route":c,onClick:(_)=>{if(!SP(_))return;_.preventDefault(),i(l,u)}},y)}function YP({activeModule:l,activeTabs:u,onNavigate:r,collapsed:f,onToggle:n}){return $("aside",{className:`rail ${f?"collapsed":""}`,"aria-label":"主模块"},$("div",{className:"brand"},$("span",{className:"brand-mark"},"UD"),$("span",{className:"brand-text"},"UniDesk"),$("button",{type:"button",className:"rail-toggle",onClick:n,"aria-label":f?"展开左侧边栏":"收起左侧边栏","data-testid":"rail-toggle"},f?"»":"«")),d3.map((t)=>{let i=u[t.id]||z1[t.id]||t.tabs[0]?.id||"";return $(cW,{key:t.id,moduleId:t.id,tabId:i,className:`module ${l===t.id?"active":""}`,active:l===t.id,title:t.label,onNavigate:r},$("span",{className:"module-code"},t.code),$("span",null,t.label))}))}function XP({module:l,activeTab:u,onNavigate:r}){return $("nav",{className:"tabs","aria-label":`${l.label} 子功能`},l.tabs.map((f)=>$(cW,{key:f.id,moduleId:l.id,tabId:f.id,className:`tab ${u===f.id?"active":""}`,active:u===f.id,onNavigate:r},f.label)))}function PP({data:l,onRaw:u,onNavigate:r}){let f=l.overview||{},n=l.nodes.filter((N)=>N.status==="online"),t=l.pendingTasks||l.tasks.filter(Iy),i=f.pendingTaskCount??t.length,y=l.tasks.slice(0,5),c=f.pgdata||{},_=f.microserviceAvailability||{},A=xl(_.totalCount),F=xl(_.healthyCount),j=xl(_.unhealthyCount);return $("div",{className:"page-grid overview-grid","data-testid":"overview-page"},$(ru,{title:"核心指标",eyebrow:"Control"},$("div",{className:"metric-grid"},$(Qu,{label:"数据库",value:f.dbReady?"READY":"WAIT",hint:"PostgreSQL internal network",tone:f.dbReady?"ok":"warn"}),$(Qu,{label:"PGDATA",value:Qr(c.databaseBytes),hint:`${c.volumeName||"unidesk_pgdata_10gb"} / ${c.databasePretty||"--"} / budget ${c.volumeSize||"--"}`,tone:"ok",testId:"pgdata-usage-card"}),$(Qu,{label:"在线节点",value:f.onlineNodeCount??0,hint:`${f.nodeCount??0} registered`,tone:"ok"}),$(Qu,{label:"WebSocket",value:f.activeSocketCount??0,hint:"Provider ingress sockets"}),$(Qu,{label:"用户服务可用",value:A>0?`${F}/${A}`:"--",hint:A>0?`healthyCount ${F} · unhealthyCount ${j}`:"strict /health probes",tone:A>0&&j===0?"ok":"warn",testId:"microservice-availability-card"}),$(Qu,{label:"待处理任务",value:i,hint:i>0?"点击查看具体任务":`timeout ${ct(Math.floor((f.taskPendingTimeoutMs??0)/1000))}`,tone:i>0?"warn":"ok",onClick:()=>r("tasks","pending"),testId:"pending-task-card"}))),$(ru,{title:"本机 Provider",eyebrow:"Self Connected"},n.length===0?$(wu,{title:"暂无在线节点",text:"provider-gateway 未完成自接入"}):$("div",{className:"node-card-list"},n.slice(0,4).map((N)=>$(CP,{key:N.providerId,node:N,onRaw:u})))),$(ru,{title:"待处理任务明细",eyebrow:`${i} Pending`,actions:$("button",{type:"button",className:"ghost-btn",onClick:()=>r("tasks","pending"),"data-testid":"pending-task-detail-link"},"进入任务调度")},t.length===0?$(wu,{title:"当前无待处理",text:"queued / dispatched / running 超时后会自动转为 failed,避免总览长期卡住"}):$("div",{className:"compact-list"},t.slice(0,5).map((N)=>$(bG,{key:N.id,task:N,onRaw:u})))),$(ru,{title:"最近任务",eyebrow:"Dispatch"},y.length===0?$(wu,{title:"暂无任务",text:"可以在任务调度模块发起 docker.ps 或 echo"}):$("div",{className:"compact-list"},y.map((N)=>$(bG,{key:N.id,task:N,onRaw:u})))))}function CP({node:l,onRaw:u}){return $("article",{className:"node-card"},$("div",{className:"node-card-head"},$("div",null,$("strong",null,l.name),$("code",null,l.providerId)),$(Wu,{status:l.status})),$("div",{className:"node-version-line"},$(ky,{node:l}),$("span",null,`升级策略 ${G$(l)}`)),$(mj,{node:l}),$(yW,{labels:l.labels,limit:6}),$("div",{className:"node-card-foot"},$("span",null,`心跳 ${Ll(l.lastHeartbeat)}`),$(eu,{title:`Provider ${l.providerId}`,data:l,onOpen:u,testId:`raw-node-${ff(l.providerId)}`})))}function hP({events:l,onRaw:u}){return $(ru,{title:"事件摘要",eyebrow:"Latest 100"},l.length===0?$(wu,{title:"暂无事件",text:"Provider 注册、心跳超时和任务状态会写入事件流"}):$("div",{className:"table-wrap"},$("table",null,$("thead",null,$("tr",null,$("th",null,"ID"),$("th",null,"类型"),$("th",null,"来源"),$("th",null,"摘要"),$("th",null,"时间"),$("th",null,"操作"))),$("tbody",null,l.map((r)=>$("tr",{key:r.id},$("td",null,$("code",null,r.id)),$("td",null,$(Wu,{status:r.type},r.type)),$("td",null,$("code",null,r.source)),$("td",null,$(Ji,{data:r.payload})),$("td",null,Ll(r.createdAt)),$("td",null,$(eu,{title:`Event ${r.id}`,data:r,onOpen:u}))))))))}function MP({logs:l,onRaw:u}){return $(ru,{title:"服务日志",eyebrow:"Core Recent"},l.length===0?$(wu,{title:"暂无日志",text:"backend-core 内存日志会在请求和 provider 事件后出现"}):$("div",{className:"log-list"},l.slice(-80).reverse().map((r,f)=>$("article",{key:f,className:`log-row ${r.level||"info"}`},$("span",null,Ll(r.ts)),$("b",null,r.level||"info"),$("strong",null,r.message||"log"),$(Ji,{data:r.data,empty:"无附加字段"}),$(eu,{title:`Log ${r.message||f}`,data:r,onOpen:u})))))}function sP({nodes:l,onRaw:u}){return $(ru,{title:"节点清单",eyebrow:`${l.length} Providers`},l.length===0?$(wu,{title:"暂无 Provider 节点",text:"确认 provider-gateway 已连接 provider ingress"}):$("div",{className:"table-wrap"},$("table",{className:"node-list-table"},$("thead",null,$("tr",null,$("th",null,"状态"),$("th",null,"Provider"),$("th",null,"网关版本"),$("th",null,"运维可用性"),$("th",null,"资源标签"),$("th",null,"连接时间"),$("th",null,"最后心跳"),$("th",null,"操作"))),$("tbody",null,l.map((r)=>$("tr",{key:r.providerId},$("td",null,$(Wu,{status:r.status})),$("td",null,$("strong",null,r.name),$("code",null,r.providerId)),$("td",null,$("div",{className:"gateway-cell"},$(ky,{node:r}),$("span",null,G$(r)))),$("td",null,$(mj,{node:r})),$("td",null,$(yW,{labels:r.labels,limit:5})),$("td",null,Ll(r.connectedAt)),$("td",null,Ll(r.lastHeartbeat)),$("td",null,$(eu,{title:`Provider ${r.providerId}`,data:r,onOpen:u,testId:`raw-node-table-${ff(r.providerId)}`}))))))))}function RP({nodes:l}){let u=W$(()=>{let r=[];for(let f of l)for(let[n,t]of dG(f.labels))r.push({providerId:f.providerId,name:f.name,key:n,value:t});return r},[l]);return $(ru,{title:"资源标签",eyebrow:"Structured Labels"},u.length===0?$(wu,{title:"暂无标签",text:"provider-gateway 注册消息会同步资源标签"}):$("div",{className:"label-matrix"},u.map((r)=>$("article",{key:`${r.providerId}-${r.key}`,className:"label-card"},$("span",null,r.key),$("strong",null,_0(r.value)),$("code",null,r.providerId)))))}function xP({nodes:l}){return $(ru,{title:"心跳状态",eyebrow:"Provider Liveness"},l.length===0?$(wu,{title:"无心跳",text:"等待 provider 注册和 heartbeat"}):$("div",{className:"heartbeat-list"},l.map((u)=>$("article",{key:u.providerId,className:"heartbeat-row"},$("span",{className:`pulse ${u.status}`}),$("div",null,$("strong",null,u.name),$("code",null,u.providerId)),$("div",null,$("span",null,"connected"),$("b",null,Ll(u.connectedAt))),$("div",null,$("span",null,"last heartbeat"),$("b",null,Ll(u.lastHeartbeat)))))))}function bP({nodes:l,systemStatuses:u,tasks:r,onRaw:f,refresh:n}){let[t,i]=Il(""),y=W$(()=>l.map((w)=>{let G=u.find((J)=>J.providerId===w.providerId);return{...w,systemCurrent:G?.current||null,systemHistory:G?.history||[],systemUpdatedAt:G?.updatedAt||null}}),[l,u]),c=y.find((w)=>w.providerId===t)||y[0]||null;if(Bn(()=>{if(!t&&y[0])i(y[0].providerId)},[y.length,t]),!c)return $(wu,{title:"暂无资源监控",text:"等待 provider 上报 CPU、内存和硬盘指标"});let _=c.systemCurrent,A=c.systemHistory||[],F=_?.cpu||{},j=_?.memory||{},N=_?.disk||{},U=A.length>0?A:_?[{at:_.collectedAt,cpuPercent:xl(F.percent),memoryPercent:xl(j.percent),diskPercent:xl(N.percent)}]:[];return $("div",{className:"monitor-page","data-testid":"node-monitor-page"},$("div",{className:"docker-node-strip"},y.map((w)=>$("button",{key:w.providerId,type:"button",className:`docker-node-tile ${c.providerId===w.providerId?"active":""}`,onClick:()=>i(w.providerId)},$("span",{className:`pulse ${w.status}`}),$("strong",null,w.name),$("code",null,w.providerId),$("span",null,w.systemCurrent?`CPU ${ji(w.systemCurrent.cpu?.percent)} / MEM ${ji(w.systemCurrent.memory?.percent)}`:"等待指标")))),$("div",{className:"monitor-layout"},$(ru,{title:"任务管理器视图",eyebrow:c.name,className:"monitor-main-panel",actions:_?$(eu,{title:`System ${c.providerId}`,data:{current:_,history:A},onOpen:f}):null},!_?$(wu,{title:"系统指标未上报",text:"provider-gateway 会周期性采集 /proc 与 df,并保存历史曲线"}):$("div",null,$("div",{className:"monitor-hero"},$("div",null,$("p",{className:"panel-eyebrow"},"Node Performance"),$("h3",null,c.name),$("div",{className:"docker-meta"},$("span",null,`${F.cores||0} CPU cores`),$("span",null,`load ${xl(F.load1).toFixed(2)} / ${xl(F.load5).toFixed(2)} / ${xl(F.load15).toFixed(2)}`),$("span",null,`memory actual ${Qr(j.usedBytes)} / ${Qr(j.totalBytes)}`),$("span",null,`disk ${Qr(N.usedBytes)} / ${Qr(N.totalBytes)}`))),$(Wu,{status:_.ok?"online":"warn"},_.ok?"METRICS READY":"METRICS DEGRADED")),$("div",{className:"monitor-chart-grid"},$(Fj,{title:"CPU",metricKey:"cpuPercent",current:F.percent,points:U,detail:`${F.cores||0} cores / load ${xl(F.load1).toFixed(2)}`,tone:"cpu",testId:"metric-chart-cpu"}),$(Fj,{title:"Memory",metricKey:"memoryPercent",current:j.percent,points:U,detail:`${Qr(j.usedBytes)} actual / ${Qr(j.cacheBytes)} cache excluded`,tone:"memory",testId:"metric-chart-memory"}),$(Fj,{title:"Disk",metricKey:"diskPercent",current:N.percent,points:U,detail:`${N.path||"/"} mounted ${N.mount||"--"}`,tone:"disk",testId:"metric-chart-disk"})),$("div",{className:"monitor-summary-grid"},$(Qu,{label:"CPU 当前",value:ji(F.percent),hint:`history ${U.length} samples`,tone:"ok"}),$(Qu,{label:"实际内存",value:Qr(j.usedBytes),hint:`${ji(j.percent)} 不含缓存`}),$(Qu,{label:"硬盘已用",value:Qr(N.usedBytes),hint:ji(N.percent)}),$(Qu,{label:"更新时间",value:Ll(c.systemUpdatedAt||_.collectedAt),hint:c.providerId})),$(vP,{current:_,onRaw:f}))),$("div",{className:"monitor-side-stack"},$(lC,{provider:c,refresh:n,onRaw:f}),$(uC,{provider:c,tasks:r,onRaw:f,limit:5}),$(ru,{title:"采样说明",eyebrow:"Retention"},$("div",{className:"monitor-note-list"},$("article",null,$("b",null,"CPU"),$("span",null,"从 /proc/stat 计算相邻采样差值,首个采样用 load/cores 近似")),$("article",null,$("b",null,"Memory"),$("span",null,"实际内存 = MemTotal - MemFree - Buffers - Cached - SReclaimable + Shmem,不把 page cache / buffer 计入占用")),$("article",null,$("b",null,"Disk"),$("span",null,"使用 df -PB1 对配置路径采样,默认监控根文件系统")),$("article",null,$("b",null,"Process"),$("span",null,"从 /proc/[pid] 采集进程 CPU、实际内存 PSS、RSS、线程数和磁盘 I/O 速率;PSS 不重复计算共享内存,表格默认按内存占用降序")))))))}function $W(l){return xl(l.memoryBytes,xl(l.pssBytes,xl(l.rssBytes)))}function sG(l,u){if(u==="memory")return $W(l);if(u==="cpu")return xl(l.cpuPercent);if(u==="disk")return xl(l.readBytesPerSecond)+xl(l.writeBytesPerSecond);if(u==="pid")return xl(l.pid);if(u==="threads")return xl(l.threads);if(u==="runtime")return xl(l.elapsedSeconds);if(u==="user")return String(l.user||"");return String(l.name||l.command||"")}function RG({value:l,label:u,tone:r}){let f=Math.max(1,Math.min(100,xl(l)));return $("div",{className:`process-meter ${r||""}`},$("span",{style:{width:`${f}%`}}),$("b",null,u))}function vP({current:l,onRaw:u}){let[r,f]=Il({key:"memory",direction:"desc"}),n=Ni.default.useContext(Nj),t=l?.processSummary&&typeof l.processSummary==="object"?l.processSummary:{},i=Array.isArray(l?.processes)?l.processes:[],y=String(t.memoryMode||""),c=y.includes("pss_smaps_rollup")?"PSS":y==="rss_minus_shared_fallback"?"RSS-shared":"RSS fallback",_=W$(()=>{let F=r.direction==="asc"?1:-1;return[...i].sort((j,N)=>{let U=sG(j,r.key),w=sG(N,r.key);if(typeof U==="string"||typeof w==="string")return String(U).localeCompare(String(w),"zh-CN")*F;return(U-w)*F||xl(j.pid)-xl(N.pid)})},[i,r.key,r.direction]),A=(F,j)=>{let N=r.key===j,U=N?r.direction==="asc"?"ascending":"descending":"none";return $("th",{"aria-sort":U},$("button",{type:"button",className:`process-sort-button ${N?"active":""}`,"data-testid":`process-sort-${j}`,onClick:()=>f((w)=>({key:j,direction:w.key===j&&w.direction==="desc"?"asc":"desc"}))},F,$("span",null,N?r.direction==="desc"?"↓":"↑":"↕")))};return $("section",{className:"process-resource-panel","data-testid":"process-resource-panel"},$("div",{className:"process-resource-head"},$("div",null,$("p",{className:"panel-eyebrow"},"Windows Resource Monitor Style"),$(nu,{title:"进程资源占用",level:3,loading:n})),$("div",{className:"process-resource-actions"},$("span",{className:"data-chip"},"默认按内存排序"),$("span",{className:"data-chip"},`内存口径 ${c}`),$("span",{className:"data-chip"},`${xl(t.visible,_.length)} / ${xl(t.total,_.length)} 进程`),$(eu,{title:"Process Resource Snapshot",data:{processSummary:t,processes:i},onOpen:u,testId:"raw-process-resources"}))),_.length===0?$(wu,{title:"暂无进程资源数据",text:"等待 provider-gateway 上报 /proc/[pid] 采样;旧版 provider 需要先升级到支持进程资源表的版本"}):$("div",{className:"process-table-wrap"},$("table",{className:"process-resource-table","data-testid":"process-resource-table"},$("thead",null,$("tr",null,A("进程","name"),A("PID","pid"),A("用户","user"),$("th",null,"状态"),A("CPU","cpu"),A("内存","memory"),$("th",null,"PSS / RSS"),A("磁盘 I/O","disk"),A("线程","threads"),A("运行时长","runtime"))),$("tbody",null,_.map((F)=>{let j=xl(F.readBytesPerSecond)+xl(F.writeBytesPerSecond),N=$W(F);return $("tr",{key:`${F.pid}-${F.startedAt}`,"data-testid":`process-row-${ff(F.pid)}`,"data-memory-bytes":String(N),"data-cpu-percent":String(xl(F.cpuPercent)),"data-disk-bps":String(j),"data-pid":String(xl(F.pid))},$("td",null,$("div",{className:"process-name-cell"},$("strong",null,F.name||"--"),$("span",{className:"process-command"},F.command||"--"))),$("td",null,$("code",null,F.pid||"--")),$("td",null,F.user||`uid:${F.uid??"--"}`),$("td",null,$("span",{className:`process-state state-${ff(F.state||"unknown")}`},F.state||"?")),$("td",null,$(RG,{value:F.cpuPercent,label:TP(F.cpuPercent),tone:"cpu"})),$("td",null,$(RG,{value:F.memoryPercent,label:ji(F.memoryPercent),tone:"memory"})),$("td",null,$("div",{className:"process-io-cell"},$("strong",null,Qr(N)),$("span",null,`RSS ${Qr(F.rssBytes)}`))),$("td",null,$("div",{className:"process-io-cell"},$("strong",null,Aj(j)),$("span",null,`R ${Aj(F.readBytesPerSecond)} / W ${Aj(F.writeBytesPerSecond)}`))),$("td",null,F.threads||0),$("td",null,ct(xl(F.elapsedSeconds))))})))))}function Fj({title:l,metricKey:u,current:r,points:f,detail:n,tone:t,testId:i}){let y=f.map((j)=>Math.max(0,Math.min(100,xl(j[u])))),c=y.length>1?y:[y[0]||0,y[0]||0],_=c.length<=1?100:100/(c.length-1),A=c.map((j,N)=>`${(N*_).toFixed(2)},${(46-j*0.42).toFixed(2)}`).join(" "),F=`0,48 ${A} 100,48`;return $("article",{className:`metric-chart ${t}`,"data-testid":i},$("div",{className:"metric-chart-head"},$("div",null,$("span",null,l),$("strong",null,ji(r))),$("code",null,`${f.length} pts`)),$("svg",{viewBox:"0 0 100 48",preserveAspectRatio:"none",role:"img","aria-label":`${l} usage curve`},$("polygon",{points:F}),$("polyline",{points:A}),$("line",{x1:"0",x2:"100",y1:"24",y2:"24"})),$("div",{className:"metric-chart-foot"},$("span",null,"0%"),$("span",null,n),$("span",null,"100%")))}function $t(l){return Array.isArray(l)?l:[]}function gP(l){let u=$t(l?.core?.requests?.componentSummary);return[...$t(l?.frontend?.requests?.componentSummary),...u].sort((f,n)=>xl(n.requestCount)-xl(f.requestCount))}function kP(l){let u=$t(l?.core?.operations?.summary);return[...$t(l?.frontend?.operations?.summary),...u].sort((f,n)=>xl(n.count)-xl(f.count))}function IP(l){let u=$t(l?.core?.requests?.recentFailures).map((f)=>({source:"backend",...f}));return[...$t(l?.frontend?.requests?.recentFailures).map((f)=>({source:"frontend",...f})),...u].sort((f,n)=>(Dn(n.at)??0)-(Dn(f.at)??0)).slice(0,20)}function aP(l){let u=$t(l?.core?.operations?.recentSlowOperations);return[...$t(l?.frontend?.operations?.recentSlowOperations),...u].sort((f,n)=>xl(n.durationMs)-xl(f.durationMs)).slice(0,20)}function oP(l){let u=performance.memory,r=Number(u?.usedJSHeapSize);if(Number.isFinite(r)&&r>0)return r;let f=Number(l?.appBundleBytes);if(Number.isFinite(f)&&f>0)return f;return xl(l?.process?.heapUsedBytes)}function dP({points:l}){let u=$t(l),r=u.map((j)=>xl(j.mb)),f=Math.max(1,...r),n=Math.max(0,Math.min(...r,0)),t=Math.max(1,f-n),i=u.length>1?u:[...u,...u],y=i.length<=1?100:100/(i.length-1),c=i.map((j,N)=>{let U=xl(j.mb);return`${(N*y).toFixed(2)},${(48-(U-n)/t*42).toFixed(2)}`}).join(" "),_=`0,50 ${c} 100,50`,A=u.at(-1),F=u[0];return $("article",{className:"performance-memory-card","data-testid":"performance-memory-chart"},$("div",{className:"performance-memory-head"},$("strong",null,`Bwebui: ${A?`${xl(A.mb).toFixed(1)}MB`:"--"}`),$("span",null,u.length>0?`${u.length} samples`:"等待采样")),$("svg",{viewBox:"0 0 100 50",preserveAspectRatio:"none",role:"img","aria-label":"Bwebui memory trend"},$("polygon",{points:_}),$("polyline",{points:c}),$("line",{x1:"0",x2:"100",y1:"25",y2:"25"})),$("div",{className:"performance-axis-row"},$("span",null,F?iu(new Date(F.at)):"--"),$("span",null,"时间"),$("span",null,A?iu(new Date(A.at)):"--")),$("div",{className:"performance-axis-row"},$("span",null,`${n.toFixed(1)}`),$("span",null,"(MB)"),$("span",null,`${f.toFixed(1)}`)))}function eP({onRaw:l}){let[u,r]=Il({core:null,frontend:null}),[f,n]=Il([]),[t,i]=Il(""),[y,c]=Il(!1),[_,A]=Il(null),[F,j]=Il(!1);async function N(){c(!0),i("");try{let[B,C]=await Promise.all([Tl(`${vl.apiBaseUrl}/performance`,{cache:"no-store"}),Tl(`${vl.apiBaseUrl}/frontend-performance`,{cache:"no-store"})]);r({core:B,frontend:C});let E=oP(C);n((D)=>[...D,{at:new Date().toISOString(),mb:E/1048576}].slice(-80))}catch(B){i(zl(B,"性能指标加载失败"))}finally{c(!1)}}Bn(()=>{N();let B=setInterval(()=>void N(),5000);return()=>clearInterval(B)},[]);async function U(){j(!0),i(""),A(null);try{let B=await Tl(`${vl.apiBaseUrl}/code-queue-load-test`,{method:"POST",body:JSON.stringify({targetMs:1000,timeoutMs:90000,url:vl.frontendPublicUrl||window.location.origin})});A(B),N()}catch(B){i(zl(B,"Code Queue Playwright 测量失败"))}finally{j(!1)}}let w=gP(u),G=IP(u),J=kP(u),Q=aP(u),m=u.core?.process||{},q=u.frontend?.process||{},W=u.core?.database?.codeQueueStorage||{},p=xl(W.total),O=_?.result||{},Z=xl(O.wallMs,NaN),V=xl(O.networkIdleMs,NaN),P=O.withinTarget===!0,H=F?"running":_===null?"idle":_.measurementOk===!0?P?"passed":"slow":"failed";return $("div",{className:"performance-page","data-testid":"performance-page"},$("div",{className:"performance-hero"},$("div",null,$("p",{className:"panel-eyebrow"},"Unified Performance"),$(nu,{title:"性能面板",loading:y||F}),$("p",null,"按组件统计 HTTP 请求、失败率、P95 延迟,并汇总 backend/frontend 内部操作耗时。")),$("div",{className:"inline-actions"},$("button",{type:"button",className:"ghost-btn",onClick:()=>void U(),disabled:F,"data-testid":"code-queue-load-test-button"},F?"测试中...":"测试 Code Queue 加载"),$("button",{type:"button",className:"ghost-btn",onClick:()=>void N(),disabled:y,"data-testid":"performance-refresh-button"},y?"刷新中":"刷新"),$(eu,{title:"Performance Snapshot",data:u,onOpen:l,testId:"raw-performance"}))),$(el,{error:t}),$("div",{className:"performance-top-grid"},$(dP,{points:f}),$("div",{className:"performance-metric-stack"},$(Qu,{label:"backend RSS",value:Qr(m.rssBytes),hint:`heap ${Qr(m.heapUsedBytes)}`}),$(Qu,{label:"frontend RSS",value:Qr(q.rssBytes),hint:`bundle ${Qr(u.frontend?.appBundleBytes)}`}),$(Qu,{label:"Codex PG 任务",value:p||"--",hint:W.ok?"unidesk_code_queue_tasks":"等待表初始化",tone:W.ok?"ok":"warn"}),$(Qu,{label:"请求样本",value:xl(u.core?.requests?.sampleCount)+xl(u.frontend?.requests?.sampleCount),hint:"rolling window 3000"}))),$(ru,{title:"Code Queue 加载基准",eyebrow:"Playwright / target <1s",className:"codex-load-test-panel",loading:F,actions:$("div",{className:"panel-actions"},$("button",{type:"button",className:"primary-btn",onClick:()=>void U(),disabled:F,"data-testid":"code-queue-load-test-panel-button"},F?"正在运行 Playwright...":"手动触发测试"),_?$(eu,{title:"Code Queue Load Test",data:_,onOpen:l,testId:"raw-code-queue-load-test"}):null)},$("div",{className:"codex-load-test-grid","data-testid":"code-queue-load-test-result"},$(Qu,{label:"总耗时",value:F?"运行中":Number.isFinite(Z)?Lf(Z):"--",hint:_===null?"点击按钮启动远端 Playwright":`目标 ${Lf(O.targetMs||1000)} / ${O.url||"Code Queue"}`,tone:H==="passed"?"ok":H==="failed"||H==="slow"?"warn":""}),$(Qu,{label:"判定",value:F?"RUNNING":H==="passed"?"PASS <1s":H==="slow"?"SLOW":H==="failed"?"FAILED":"--",hint:_?.measurementOk===!1?String(_.error||O.error||"measurement failed").slice(0,120):"导航开始 -> DOMContentLoaded -> data-load-state=complete",tone:H==="passed"?"ok":H==="idle"||H==="running"?"":"fail"}),$(Qu,{label:"Network idle",value:Number.isFinite(V)?Lf(V):"--",hint:`DOMContentLoaded ${Lf(O.domContentLoadedMs)} / ${O.networkIdleReached===!1?"未在 5s 内空闲":"已空闲"}`,tone:Number.isFinite(V)&&V<=1000?"ok":"warn"}),$(Qu,{label:"组件耗时",value:Number.isFinite(xl(O.componentLoadMs,NaN))?Lf(O.componentLoadMs):"--",hint:`queue ${Lf(O.queueMs)} / detail ${Lf(O.detailMs)}`,tone:xl(O.componentLoadMs)>1000?"warn":"ok"}),$(Qu,{label:"Trace 规模",value:Number.isFinite(xl(O.transcriptRows,NaN))?String(O.transcriptRows):"--",hint:`${O.visibleTaskCount??0} visible tasks / ${O.partial?"preview":"complete"}`})),F?$("div",{className:"performance-empty-line"},"正在通过 main-server Host SSH 启动 Playwright,完成后会显示 wall time、组件耗时和最慢 API。"):null,_&&Array.isArray(O.slowestApi)&&O.slowestApi.length>0?$("div",{className:"table-wrap performance-table-wrap compact codex-load-api-table"},$("table",{className:"performance-table"},$("thead",null,$("tr",null,["API","状态","耗时"].map((B)=>$("th",{key:B},B)))),$("tbody",null,O.slowestApi.slice(0,5).map((B,C)=>$("tr",{key:`${B.url}-${C}`},$("td",null,$("code",null,B.url)),$("td",null,B.status),$("td",null,Lf(B.durationMs))))))):null),$("div",{className:"performance-grid"},$(ru,{title:"组件汇总",eyebrow:"Requests",loading:y},w.length===0?$(wu,{title:"暂无请求样本",text:"刷新几次或打开页面后会自动形成组件统计"}):$("div",{className:"table-wrap performance-table-wrap"},$("table",{className:"performance-table"},$("thead",null,$("tr",null,["组件","请求数","失败数","失败率","平均延迟","P95"].map((B)=>$("th",{key:B},B)))),$("tbody",null,w.map((B)=>$("tr",{key:B.component},$("td",null,$("code",null,B.component)),$("td",null,B.requestCount),$("td",null,B.failureCount),$("td",null,ji(xl(B.failureRate)*100)),$("td",null,Lf(B.averageLatencyMs)),$("td",null,Lf(B.p95LatencyMs)))))))),$(ru,{title:"最近失败请求",eyebrow:"Failures",loading:y},G.length===0?$("div",{className:"performance-empty-line"},"最近没有失败请求"):$("div",{className:"table-wrap performance-table-wrap compact"},$("table",{className:"performance-table"},$("thead",null,$("tr",null,["时间","来源","组件","状态","路径"].map((B)=>$("th",{key:B},B)))),$("tbody",null,G.map((B,C)=>$("tr",{key:`${B.at}-${C}`},$("td",null,Ll(B.at)),$("td",null,B.source),$("td",null,$("code",null,B.component)),$("td",null,$(Wu,{status:"failed"},B.status)),$("td",null,$("code",null,B.path)))))))),$(ru,{title:"内部操作汇总",eyebrow:"Operations",loading:y},J.length===0?$(wu,{title:"暂无内部操作样本",text:"API 查询和代理请求会自动记录内部操作耗时"}):$("div",{className:"table-wrap performance-table-wrap"},$("table",{className:"performance-table"},$("thead",null,$("tr",null,["服务","操作","次数","平均延迟","P95"].map((B)=>$("th",{key:B},B)))),$("tbody",null,J.map((B)=>$("tr",{key:`${B.service}-${B.operation}`},$("td",null,B.service),$("td",null,$("code",null,B.operation)),$("td",null,B.count),$("td",null,Lf(B.averageLatencyMs)),$("td",null,Lf(B.p95LatencyMs)))))))),$(ru,{title:"最近慢操作",eyebrow:"Slowest",loading:y},Q.length===0?$(wu,{title:"暂无慢操作",text:"后端会记录最近窗口内耗时最高的内部操作"}):$("div",{className:"table-wrap performance-table-wrap"},$("table",{className:"performance-table"},$("thead",null,$("tr",null,["时间","操作","耗时","结果","细节"].map((B)=>$("th",{key:B},B)))),$("tbody",null,Q.map((B,C)=>$("tr",{key:`${B.at}-${B.operation}-${C}`},$("td",null,Ll(B.at)),$("td",null,$("code",null,B.operation)),$("td",null,Lf(B.durationMs)),$("td",null,B.ok?"成功":"失败"),$("td",null,B.detail||"-")))))))))}function lC({provider:l,refresh:u,onRaw:r}){let[f,n]=Il(""),[t,i]=Il(null),[y,c]=Il("");async function _(A){n(A),c("");try{let F=await Tl(`${vl.apiBaseUrl}/dispatch`,{method:"POST",body:JSON.stringify({providerId:l.providerId,command:"provider.upgrade",payload:{mode:A,source:"frontend-resource-monitor",requestedAt:new Date().toISOString()}})});i({mode:A,...F}),await u()}catch(F){c(zl(F,"升级命令下发失败"))}finally{n("")}}return $(ru,{title:"Provider Gateway 升级",eyebrow:"Remote Control",loading:Boolean(f)},$("div",{className:"upgrade-control","data-testid":"provider-upgrade-control"},$("p",null,"通过 UniDesk WebSocket 向当前计算节点下发 provider.upgrade;预检只生成升级计划,执行升级会调度节点本地 updater 容器。"),$("div",{className:"upgrade-target-line"},$("span",null,"指定 Provider"),$("code",null,l.providerId),$(ky,{node:l})),$("div",{className:"upgrade-actions"},$("button",{type:"button",className:"ghost-btn",disabled:Boolean(f),onClick:()=>_("plan"),"data-testid":"upgrade-plan-button"},f==="plan"?"预检中":"预检升级"),$("button",{type:"button",className:"ghost-btn danger",disabled:Boolean(f),onClick:()=>_("schedule"),"data-testid":"upgrade-schedule-button"},f==="schedule"?"调度中":"执行升级")),$(el,{error:y}),t?$("div",{className:"upgrade-result"},$(Wu,{status:t.status||"queued"},t.status||"queued"),$("span",null,`${t.mode==="schedule"?"执行升级":"预检升级"} 已下发`),$("span",null,`指定版本 ${Qj(eG(l))}`),$("code",null,t.taskId||"--"),$(eu,{title:"Provider Upgrade Dispatch",data:t,onOpen:r})):$("span",{className:"muted"},"升级任务结果会进入任务历史;执行升级可能导致 provider 短暂重连。")))}function _W({records:l,onRaw:u,compact:r=!1}){if(l.length===0)return $(wu,{title:"暂无远程更新记录",text:"该节点还没有 provider.upgrade 任务;执行预检或升级后会在这里形成结构化记录"});return $("div",{className:`upgrade-record-table-wrap table-wrap ${r?"compact":""}`},$("table",{className:"upgrade-record-table"},$("thead",null,$("tr",null,$("th",null,"状态"),$("th",null,"模式"),$("th",null,"任务"),$("th",null,"来源"),$("th",null,"耗时"),$("th",null,"策略"),$("th",null,"Gateway 版本"),$("th",null,"结果记录"),$("th",null,"更新时间"),$("th",null,"操作"))),$("tbody",null,l.map((f)=>$("tr",{key:f.id,"data-testid":`gateway-upgrade-record-${ff(f.id)}`},$("td",null,$(Wu,{status:f.status})),$("td",null,$("span",{className:`mode-chip ${p8(f)}`},p8(f)==="schedule"?"执行升级":"预检")),$("td",null,$("strong",null,"provider.upgrade"),$("code",null,f.id)),$("td",null,zP(f)),$("td",null,$(FW,{task:f})),$("td",null,OP(f)),$("td",null,$("span",{className:"version-chip"},fW(f))),$("td",null,$("span",{className:`upgrade-outcome ${String(f.status||"").toLowerCase()}`},nW(f))),$("td",null,Ll(f.updatedAt)),$("td",null,$(eu,{title:`Provider Upgrade Task ${f.id}`,data:T$(f),onOpen:u})))))))}function uC({provider:l,tasks:u,onRaw:r,limit:f=5}){let n=tW(u,l.providerId).slice(0,f);return $(ru,{title:"远程更新记录",eyebrow:l.providerId,actions:$(ky,{node:l}),className:"provider-upgrade-records-panel"},$("div",{"data-testid":`provider-upgrade-records-${ff(l.providerId)}`},$(_W,{records:n,onRaw:r,compact:!0})))}function rC({nodes:l,tasks:u,onRaw:r}){let f=W$(()=>l.map((t)=>{let i=tW(u,t.providerId);return{node:t,records:i,latest:ZP(i),capabilities:lW(t)}}),[l,u]),n=f.reduce((t,i)=>t+i.records.length,0);return $("div",{className:"gateway-page","data-testid":"gateway-version-page"},$(ru,{title:"Provider Gateway 版本",eyebrow:`${l.length} Providers / ${n} 更新记录`},l.length===0?$(wu,{title:"暂无 Provider 节点",text:"等待 provider-gateway 注册后显示版本号和升级记录"}):$("div",{className:"table-wrap gateway-version-table-wrap"},$("table",{className:"gateway-version-table"},$("thead",null,$("tr",null,$("th",null,"状态"),$("th",null,"Provider"),$("th",null,"Gateway 版本"),$("th",null,"升级策略"),$("th",null,"运维可用性"),$("th",null,"运行时间"),$("th",null,"能力"),$("th",null,"最近远程更新"),$("th",null,"操作"))),$("tbody",null,f.map((t)=>$("tr",{key:t.node.providerId},$("td",null,$(Wu,{status:t.node.status})),$("td",null,$("strong",null,t.node.name),$("code",null,t.node.providerId)),$("td",null,$(ky,{node:t.node})),$("td",null,G$(t.node)),$("td",null,$(mj,{node:t.node})),$("td",null,PG(t.node)?Ll(PG(t.node)):"待新版上报"),$("td",null,$("div",{className:"capability-row"},t.capabilities.length===0?$("span",{className:"muted"},"未声明"):t.capabilities.slice(0,5).map((i)=>$("span",{key:i,className:"data-chip"},i)))),$("td",null,t.latest?$("div",{className:"latest-upgrade-cell"},$(Wu,{status:t.latest.status}),$("span",null,`${p8(t.latest)==="schedule"?"执行升级":"预检"} / ${Ll(t.latest.updatedAt)}`),$("small",null,`Gateway ${fW(t.latest)}`),$("small",null,nW(t.latest))):$("span",{className:"muted"},"暂无记录")),$("td",null,$(eu,{title:`Provider ${t.node.providerId}`,data:t.node,onOpen:r})))))))),$(ru,{title:"远程更新记录",eyebrow:"Structured provider.upgrade records"},l.length===0?$(wu,{title:"暂无记录",text:"没有 provider 节点时不会生成远程更新记录"}):$("div",{className:"gateway-record-grid"},f.map((t)=>$("article",{key:t.node.providerId,className:"gateway-record-card","data-testid":`gateway-records-${ff(t.node.providerId)}`},$("div",{className:"gateway-record-head"},$("div",null,$("strong",null,t.node.name),$("code",null,t.node.providerId)),$(ky,{node:t.node})),$("div",{className:"gateway-record-meta"},$("span",null,`心跳 ${Ll(t.node.lastHeartbeat)}`),$("span",null,`策略 ${G$(t.node)}`),$("span",null,`${t.records.length} 条记录`)),$(_W,{records:t.records.slice(0,8),onRaw:r,compact:!0}))))))}function fC(l){if(l==="running")return"online";if(l==="paused"||l==="restarting")return"warn";if(l==="exited"||l==="dead")return"offline";return"internal"}function AW(l){return/^[a-f0-9]{48,64}$/i.test(l)}function L$(l){let u=String(l?.name||""),r=String(l?.labels||"");return u==="unidesk_pgdata_10gb"||r.includes("com.docker.compose.volume=unidesk_pgdata_10gb")||u.toLowerCase().includes("pgdata")}function xG(l){let u=String(l?.name||""),r=String(l?.labels||"");if(L$(l))return 0;if(r.includes("com.docker.compose.project=unidesk"))return 1;if(!AW(u))return 2;return 3}function nC(l){return[...l].sort((u,r)=>{let f=xG(u)-xG(r);if(f!==0)return f;return String(u.name||"").localeCompare(String(r.name||""))})}function tC({nodes:l,dockerStatuses:u,onRaw:r}){let[f,n]=Il(""),t=W$(()=>l.map((Q)=>{let m=u.find((q)=>q.providerId===Q.providerId);return{...Q,dockerStatus:m?.dockerStatus||null,dockerUpdatedAt:m?.updatedAt||null}}),[l,u]),i=t.find((Q)=>Q.providerId===f)||t[0]||null;if(Bn(()=>{if(!f&&t[0])n(t[0].providerId)},[t.length,f]),!i)return $(wu,{title:"暂无 Docker 节点",text:"等待 provider 上报 Docker daemon 状态"});let y=i.dockerStatus,c=i.providerId==="main-server",_=y?.counts||{},A=y?.daemon||{},F=y?.containers||[],j=y?.images||[],N=nC(y?.volumes||[]),U=c?N.find(L$):null,w=y?.networks||[],G=F.filter((Q)=>Q.state==="running"),J=F.filter((Q)=>Q.state!=="running");return $("div",{className:"docker-page","data-testid":"docker-status-page"},$("div",{className:"docker-node-strip"},t.map((Q)=>$("button",{key:Q.providerId,type:"button",className:`docker-node-tile ${i.providerId===Q.providerId?"active":""}`,onClick:()=>n(Q.providerId)},$("span",{className:`pulse ${Q.status}`}),$("strong",null,Q.name),$("code",null,Q.providerId),$("span",null,Q.dockerStatus?`Docker ${Q.dockerStatus.ok?"ready":"degraded"}`:"等待上报")))),$("div",{className:"docker-layout"},$(ru,{title:"Docker Desktop 视图",eyebrow:i.name,className:"docker-main-panel",actions:y?$(eu,{title:`Docker ${i.providerId}`,data:y,onOpen:r}):null},!y?$(wu,{title:"Docker 状态未上报",text:"provider-gateway 会在连接后周期性采集 docker info / ps / images / volume / network"}):$("div",null,$("div",{className:"docker-hero"},$("div",null,$("p",{className:"panel-eyebrow"},"Daemon"),$("h3",null,A.name||i.providerId),$("div",{className:"docker-meta"},$("span",null,A.serverVersion?`Engine ${A.serverVersion}`:"Engine --"),$("span",null,A.operatingSystem||"OS --"),$("span",null,A.architecture||"arch --"),$("span",null,`${A.cpus||0} CPU / ${Qr(A.memoryBytes)}`))),$(Wu,{status:y.ok?"online":"warn"},y.ok?"Docker Ready":"Docker Degraded")),$("div",{className:"docker-metrics"},$(Qu,{label:"Containers",value:_.containers??F.length,hint:`${_.running??G.length} running / ${_.stopped??J.length} stopped`,tone:"ok"}),$(Qu,{label:"Images",value:_.images??j.length,hint:`${_.daemonImages??_.images??j.length} daemon images`}),$(Qu,{label:"Volumes",value:_.volumes??N.length,hint:c?U?"database volume visible":"database volume missing":"node local volumes",tone:U?"ok":""}),$(Qu,{label:"Networks",value:_.networks??w.length,hint:A.driver?`driver ${A.driver}`:"docker networks"})),c?$(iC,{volume:U,volumeCount:N.length}):null,$("div",{className:"docker-section-head"},$("h3",null,"Containers"),$("span",null,`updated ${Ll(i.dockerUpdatedAt||y.collectedAt)}`)),$("div",{className:"docker-container-table table-wrap","data-testid":"docker-container-table"},$("table",null,$("thead",null,$("tr",null,$("th",null,"状态"),$("th",null,"容器"),$("th",null,"镜像"),$("th",null,"端口"),$("th",null,"运行时间"),$("th",null,"重启策略"),$("th",null,"PID"),$("th",null,"大小"))),$("tbody",null,F.length===0?$("tr",null,$("td",{colSpan:8},"暂无容器")):F.map((Q)=>$("tr",{key:`${Q.id}-${Q.name}`},$("td",null,$(Wu,{status:fC(Q.state)},Q.state||"unknown")),$("td",null,$("strong",null,Q.name||"--"),$("code",null,Q.id||"--")),$("td",null,Q.image||"--"),$("td",null,Q.ports||$("span",{className:"muted"},"未发布")),$("td",null,Q.runningFor||Q.status||"--"),$("td",null,Q.restartPolicy?$(Wu,{status:Q.restartPolicy==="always"?"online":"warn"},Q.restartPolicy):"--"),$("td",null,Q.pidMode?$("code",null,Q.pidMode):"--"),$("td",null,Q.size||"--")))))))),$("div",{className:"docker-side-stack"},$(jj,{title:"Images",items:j,render:(Q)=>$("article",{key:`${Q.id}-${Q.repository}`,className:"docker-side-row"},$("strong",null,`${Q.repository}:${Q.tag}`),$("span",null,Q.size||"--"),$("code",null,Q.id||"--"))}),$(jj,{title:"Volumes",items:N,limit:N.length,render:(Q)=>$("article",{key:Q.name,className:`docker-side-row volume-row ${c&&L$(Q)?"database-volume":""}`,"data-testid":c&&L$(Q)?"database-volume-row":void 0},$("strong",null,Q.name),$("span",null,c&&L$(Q)?"PostgreSQL":AW(String(Q.name||""))?"anonymous":"named"),$("code",null,Q.mountpoint||Q.driver||Q.scope||"--"))}),$(jj,{title:"Networks",items:w,render:(Q)=>$("article",{key:Q.id||Q.name,className:"docker-side-row"},$("strong",null,Q.name),$("span",null,Q.driver||"--"),$("code",null,Q.id||"--"))}))))}function iC({volume:l,volumeCount:u}){return $("section",{className:`docker-volume-focus ${l?"ready":"missing"}`,"data-testid":"database-volume-card"},$("div",{className:"volume-focus-head"},$("span",{className:"panel-eyebrow"},"Database Named Volume"),$(Wu,{status:l?"online":"warn"},l?"FOUND":"MISSING")),l?$("div",{className:"volume-focus-body"},$("strong",null,l.name),$("span",null,"PostgreSQL data volume for unidesk-database"),$("div",{className:"volume-route"},$("code",null,l.mountpoint||"/var/lib/docker/volumes/unidesk_pgdata_10gb/_data"),$("span",null,"->"),$("code",null,"unidesk-database:/var/lib/postgresql/data")),$("div",{className:"docker-meta compact"},$("span",null,`driver ${l.driver||"--"}`),$("span",null,`scope ${l.scope||"--"}`),$("span",null,`${u} volumes reported`))):$("div",{className:"volume-focus-body"},$("strong",null,"unidesk_pgdata_10gb"),$("span",null,"当前 Docker 快照没有发现数据库命名卷;请检查 provider-gateway 的 Docker volume 上报。")))}function jj({title:l,items:u,render:r,limit:f}){let n=u.slice(0,f??12),t=Math.max(0,u.length-n.length);return $(ru,{title:l,eyebrow:`${u.length} items`,className:"docker-side-panel"},u.length===0?$(wu,{title:`暂无 ${l}`,text:"等待 Docker 状态采集"}):$("div",{className:"docker-side-list"},n.map(r),t>0?$("div",{className:"docker-side-more"},`+ ${t} more`):null))}function yC({microservices:l,onRaw:u,onNavigate:r}){let f=l.filter((n)=>hG(n).public===!1);return $("div",{className:"microservice-page","data-testid":"microservice-catalog-page"},$(ru,{title:"用户服务目录",eyebrow:"Provider Mounted User Services"},$("div",{className:"metric-grid"},$(Qu,{label:"服务总数",value:l.length,hint:"config.json 用户服务登记"}),$(Qu,{label:"私有后端",value:f.length,hint:"不直接暴露公网",tone:"ok"}),$(Qu,{label:"D601 服务",value:l.filter((n)=>n.providerId==="D601").length,hint:"compute-node docker"}),$(Qu,{label:"集成前端",value:l.filter((n)=>n.frontend?.integrated).length,hint:"UniDesk React 页面"}))),$(ru,{title:"服务映射",eyebrow:"Repo Reference + Runtime"},l.length===0?$(wu,{title:"暂无用户服务",text:"在 config.json 的 microservices 中登记用户服务的 provider、仓库引用和后端映射"}):$("div",{className:"table-wrap"},$("table",{className:"microservice-table"},$("thead",null,$("tr",null,$("th",null,"服务"),$("th",null,"Provider"),$("th",null,"代码引用"),$("th",null,"Docker 引用"),$("th",null,"后端映射"),$("th",null,"开发入口"),$("th",null,"运行态"),$("th",null,"操作"))),$("tbody",null,l.map((n)=>{let t=iW(n),i=HP(n),y=hG(n),c=t.availability||{},_=c.status||(t.providerStatus==="online"?"unknown":"unhealthy");return $("tr",{key:n.id,"data-testid":`microservice-row-${ff(n.id)}`},$("td",null,$("strong",null,n.name),$("code",null,n.id)),$("td",null,$("strong",null,t.providerName||n.providerId),$("code",null,n.providerId)),$("td",null,$("span",null,i.url||"--"),$("code",null,i.commitId||"--")),$("td",null,$("span",null,i.composeFile||"--"),$("code",null,`${i.composeService||"--"} / ${i.containerName||"--"}`)),$("td",null,$(Wu,{status:y.public?"warn":"online"},y.public?"public":"private"),$("code",null,`${y.nodeBindHost||"--"}:${y.nodePort||"--"} -> ${y.proxyMode||"--"}`)),$("td",null,$("span",null,n.development?.sshPassthrough?"SSH 透传":"未配置"),$("code",null,n.development?.worktreePath||"--")),$("td",null,$(Wu,{status:_==="healthy"?"online":_==="unknown"?"warn":"failed"},_),$("span",null,c.reason||t.providerStatus||"unknown"),$(Ji,{data:t.container,empty:"容器快照未上报"})),$("td",null,$("div",{className:"microservice-actions"},n.id==="findjob"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","findjob"),"data-testid":"open-findjob-button"},"打开"):null,n.id==="pipeline"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","pipeline"),"data-testid":"open-pipeline-button"},"打开"):null,n.id==="todo-note"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","todo-note"),"data-testid":"open-todo-note-button"},"打开"):null,n.id==="met-nonlinear"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","met-nonlinear"),"data-testid":"open-met-nonlinear-button"},"打开"):null,n.id==="claudeqq"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","claudeqq"),"data-testid":"open-claudeqq-button"},"打开"):null,n.id==="baidu-netdisk"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","baidu-netdisk"),"data-testid":"open-baidu-netdisk-button"},"打开"):null,n.id==="oa-event-flow"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","oa-event-flow"),"data-testid":"open-oa-event-flow-button"},"打开"):null,n.id==="k3sctl-adapter"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","k3sctl"),"data-testid":"open-k3sctl-button"},"打开"):null,n.id==="code-queue"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","code-queue"),"data-testid":"open-code-queue-button"},"打开"):null,n.id==="mdtodo"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","mdtodo"),"data-testid":"open-mdtodo-button"},"打开"):null,n.id==="decision-center"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","decision-center"),"data-testid":"open-decision-center-button"},"打开"):null,n.id==="project-manager"?$("button",{type:"button",className:"ghost-btn",onClick:()=>r("apps","project-manager"),"data-testid":"open-project-manager-button"},"打开"):null,$(eu,{title:`用户服务 ${n.id}`,data:n,onOpen:u}))))}))))))}function cC({nodes:l,onDispatched:u,onRaw:r}){let f=l.filter((H)=>H.status==="online"),[n,t]=Il(f[0]?.providerId||l[0]?.providerId||""),[i,y]=Il("docker.ps"),[c,_]=Il("frontend"),[A,F]=Il("operator-check"),[j,N]=Il("normal"),[U,w]=Il(!1),[G,J]=Il(""),[Q,m]=Il(!1),[q,W]=Il(null),[p,O]=Il("");Bn(()=>{if(!n&&(f[0]?.providerId||l[0]?.providerId))t(f[0]?.providerId||l[0].providerId)},[l.length,f.length,n]);function Z(){return{source:c,note:A,priority:j}}function V(){J(JSON.stringify(Z(),null,2)),w(!0)}async function P(H){H.preventDefault(),m(!0),O("");try{let B=U?JSON.parse(G||"{}"):Z(),C=await Tl(`${vl.apiBaseUrl}/dispatch`,{method:"POST",body:JSON.stringify({providerId:n,command:i,payload:B})});W(C),await u()}catch(B){O(zl(B,"下发失败"))}finally{m(!1)}}return $("div",{className:"page-grid dispatch-grid"},$(ru,{title:"下发任务",eyebrow:"Real WebSocket Dispatch"},$("form",{className:"dispatch-form",onSubmit:P},$("label",null,"Provider",$("select",{value:n,onChange:(H)=>t(H.target.value)},l.map((H)=>$("option",{key:H.providerId,value:H.providerId},`${H.name} / ${H.providerId}`)))),$("label",null,"Command",$("select",{value:i,onChange:(H)=>y(H.target.value)},$("option",{value:"docker.ps"},"docker.ps"),$("option",{value:"host.ssh"},"host.ssh"),$("option",{value:"microservice.http"},"microservice.http"),$("option",{value:"echo"},"echo"))),$("label",null,"来源",$("input",{value:c,onChange:(H)=>_(H.target.value)})),$("label",null,"备注",$("input",{value:A,onChange:(H)=>F(H.target.value)})),$("label",null,"优先级",$("select",{value:j,onChange:(H)=>N(H.target.value)},$("option",{value:"normal"},"normal"),$("option",{value:"low"},"low"),$("option",{value:"urgent"},"urgent"))),$("div",{className:"dispatch-actions"},$("button",{type:"button",className:"ghost-btn",onClick:V},"查看原始JSON"),$("button",{type:"submit",disabled:Q||!n},Q?"下发中":"下发任务")),U?$("label",{className:"raw-editor-label"},"高级 Payload",$("textarea",{className:"raw-editor",value:G,onChange:(H)=>J(H.target.value)})):null,$(el,{error:p,wide:!0}))),$(ru,{title:"下发结果",eyebrow:"Response"},q?$("div",{className:"result-card"},$(Wu,{status:q.status||"queued"},q.status||"queued"),$("dl",null,$("dt",null,"Task ID"),$("dd",null,$("code",null,q.taskId||"--")),$("dt",null,"Provider 在线"),$("dd",null,_0(q.providerOnline))),$(eu,{title:"Dispatch Response",data:q,onOpen:r})):$(wu,{title:"等待操作",text:"任务响应会以结构化结果卡展示"})))}function bG({task:l,onRaw:u}){return $("article",{className:"compact-row"},$(Wu,{status:l.status}),$("div",null,$("strong",null,l.command),$("code",null,l.id)),$("span",null,Iy(l)?`已等待 ${Jj(l.updatedAt)}`:`耗时 ${ct(aG(l)??0)}`),$(eu,{title:`Task ${l.id}`,data:T$(l),onOpen:u}))}function FW({task:l}){let u=aG(l),r=Iy(l);return $("div",{className:"task-duration"},$("strong",null,u===null?"--":ct(u)),$("span",null,r?`已运行 / 创建 ${Ll(l.createdAt)}`:`创建 ${Ll(l.createdAt)}`))}function $C({task:l}){let u=String(l?.status||"").toLowerCase(),r=l?.result,f=r&&typeof r==="object"&&!Array.isArray(r)?r:{},t=["exitCode","code","signal","timeoutMs","previousStatus","mode"].filter((i)=>f[i]!==void 0&&f[i]!==null);if(u==="failed"){let i=oG(l);return $("div",{className:"task-diagnostic failed"},$("b",null,"失败原因"),$("span",{className:"diagnostic-reason"},_0(i)),t.length>0?$("div",{className:"diagnostic-meta"},t.map((y)=>$("span",{key:y,className:"data-chip"},$("b",null,y),$("span",null,_0(f[y]))))):null)}if(Iy(l))return $("div",{className:"task-diagnostic warn"},$("b",null,"等待终态"),$("span",null,`最后更新 ${Jj(l.updatedAt)} 前`));return $("div",{className:"task-diagnostic ok"},$("b",null,"完成摘要"),$(Ji,{data:r,empty:"无执行输出"}))}function _C({tasks:l,onRaw:u}){let r=l.filter(Iy);return $("div",{"data-testid":"pending-task-page"},$(ru,{title:"待处理任务",eyebrow:`${r.length} Pending`},r.length===0?$(wu,{title:"当前无待处理任务",text:"queued / dispatched / running 会在超时后自动转为 failed;历史记录仍可在任务历史中查看"}):$("div",{className:"table-wrap","data-testid":"pending-task-table"},$("table",null,$("thead",null,$("tr",null,$("th",null,"状态"),$("th",null,"任务"),$("th",null,"Provider"),$("th",null,"已等待"),$("th",null,"载荷摘要"),$("th",null,"操作"))),$("tbody",null,r.map((f)=>$("tr",{key:f.id},$("td",null,$(Wu,{status:f.status})),$("td",null,$("strong",null,f.command),$("code",null,f.id)),$("td",null,$("code",null,f.providerId)),$("td",null,Jj(f.updatedAt)),$("td",null,$(Ji,{data:f.payload})),$("td",null,$(eu,{title:`Pending Task ${f.id}`,data:T$(f),onOpen:u})))))))))}function AC({tasks:l,onRaw:u}){return $("div",{"data-testid":"task-history-page"},$(ru,{title:"任务历史",eyebrow:`${l.length} Tasks`},l.length===0?$(wu,{title:"暂无任务",text:"下发任务后会在这里看到生命周期"}):$("div",{className:"table-wrap"},$("table",{className:"task-history-table"},$("thead",null,$("tr",null,$("th",null,"状态"),$("th",null,"任务"),$("th",null,"Provider"),$("th",null,"任务耗时"),$("th",null,"载荷摘要"),$("th",null,"诊断信息"),$("th",null,"更新时间"),$("th",null,"操作"))),$("tbody",null,l.map((r)=>$("tr",{key:r.id,"data-testid":`task-row-${ff(r.id)}`},$("td",null,$(Wu,{status:r.status})),$("td",null,$("strong",null,r.command),$("code",null,r.id)),$("td",null,$("code",null,r.providerId)),$("td",null,$(FW,{task:r})),$("td",null,$(Ji,{data:r.payload})),$("td",null,$($C,{task:r})),$("td",null,Ll(r.updatedAt)),$("td",null,$(eu,{title:`Task ${r.id}`,data:T$(r),onOpen:u})))))))))}function FC({tasks:l,onRaw:u}){let r=l.filter((f)=>["succeeded","failed"].includes(f.status));return $(ru,{title:"执行结果",eyebrow:"Finished Tasks"},r.length===0?$(wu,{title:"暂无结果",text:"任务完成后展示 provider 返回的结构化摘要"}):$("div",{className:"result-grid"},r.map((f)=>$("article",{key:f.id,className:"result-card"},$("div",{className:"node-card-head"},$("strong",null,f.command),$(Wu,{status:f.status})),$("code",null,f.id),$(Ji,{data:f.result,empty:"无执行输出"}),$(eu,{title:`Task Result ${f.id}`,data:T$(f),onOpen:u})))))}function jC(l){if(!l||typeof l!=="object")return"--";if(l.type==="interval")return`每 ${ct(Number(l.everySeconds||0))}`;return`每天 ${l.timeOfDay||"03:00"} UTC`}function NC(l){if(!l||typeof l!=="object")return"--";if(l.type==="pgdata_backup")return`PGDATA -> ${l.remoteBaseDir||"/SERVER_DATA/UNIDESK_PG_DATA"}`;if(l.type==="dispatch")return`${l.providerId||"--"} / ${l.command||"--"}`;return String(l.type||"--")}function JC(l){let u=String(l||"").toLowerCase();if(u==="succeeded")return"online";if(u==="failed")return"failed";if(u==="running"||u==="queued")return"warn";return u}function UC(l){let u=Number(l?.durationMs);if(Number.isFinite(u)&&u>=0)return ct(u/1000);let r=Dn(l?.startedAt||l?.createdAt);if(r===null)return"--";let n=Dn(l?.finishedAt)??Date.now();return ct(Math.max(0,(n-r)/1000))}function vG(l){return{id:"unidesk-pgdata-baidu-daily",name:"PGDATA daily Baidu Netdisk backup",description:"Daily PostgreSQL physical base backup uploaded to Baidu Netdisk /SERVER_DATA with monthly rotation.",enabled:!0,timeOfDay:"03:30",actionType:"pgdata_backup",providerId:l[0]?.providerId||"main-server",command:"echo",payloadJson:JSON.stringify({source:"scheduled-task",message:"hello from scheduler"},null,2),remoteBaseDir:"/SERVER_DATA/UNIDESK_PG_DATA",stagingSubdir:"server-data/unidesk-pg-data",timeoutMs:"3600000"}}function QC({schedules:l,scheduleRuns:u,nodes:r,refresh:f,onRaw:n}){let[t,i]=Il(vG(r||[])),[y,c]=Il(!1),[_,A]=Il(""),[F,j]=Il(""),N=[...u||[]].sort((q,W)=>(Dn(W.updatedAt)??0)-(Dn(q.updatedAt)??0));function U(q,W){i((p)=>({...p,[q]:W}))}function w(q){let W=q?.action||{};i({id:q?.id||"",name:q?.name||"",description:q?.description||"",enabled:q?.enabled!==!1,timeOfDay:q?.schedule?.timeOfDay||"03:30",actionType:W.type||"dispatch",providerId:W.providerId||r[0]?.providerId||"main-server",command:W.command||"echo",payloadJson:JSON.stringify(W.payload||{source:"scheduled-task"},null,2),remoteBaseDir:W.remoteBaseDir||"/SERVER_DATA/UNIDESK_PG_DATA",stagingSubdir:W.stagingSubdir||"server-data/unidesk-pg-data",timeoutMs:String(W.timeoutMs||3600000)}),j(`正在编辑 ${q?.id||""}`)}function G(){let q={id:t.id,name:t.name,description:t.description,enabled:t.enabled,concurrencyPolicy:"skip",schedule:{type:"daily",timeOfDay:t.timeOfDay,timezone:"Etc/UTC"}};if(t.actionType==="pgdata_backup")return{...q,action:{type:"pgdata_backup",volumeName:"unidesk_pgdata_10gb",remoteBaseDir:t.remoteBaseDir,stagingSubdir:t.stagingSubdir,timeoutMs:Number(t.timeoutMs)||3600000,cleanupLocal:!0}};return{...q,action:{type:"dispatch",providerId:t.providerId,command:t.command,payload:JSON.parse(t.payloadJson||"{}"),timeoutMs:Number(t.timeoutMs)||600000}}}async function J(q){q.preventDefault(),c(!0),A(""),j("");try{let W=G(),p=encodeURIComponent(String(W.id));await Tl(`${vl.apiBaseUrl}/schedules/${p}`,{method:"PUT",body:JSON.stringify(W)}),j("定时任务已保存"),await f()}catch(W){A(zl(W,"保存定时任务失败"))}finally{c(!1)}}async function Q(q){if(!q?.id)return;c(!0),A(""),j("");try{await Tl(`${vl.apiBaseUrl}/schedules/${encodeURIComponent(q.id)}`,{method:"DELETE"}),j(`已删除 ${q.id}`),await f()}catch(W){A(zl(W,"删除定时任务失败"))}finally{c(!1)}}async function m(q){if(!q?.id)return;c(!0),A(""),j("");try{let W=await Tl(`${vl.apiBaseUrl}/schedules/${encodeURIComponent(q.id)}/run`,{method:"POST",body:"{}"});j(`已触发 ${q.id} / ${W?.run?.id||"run"}`),await f()}catch(W){A(zl(W,"触发定时任务失败"))}finally{c(!1)}}return $("div",{className:"page-grid scheduled-task-page","data-testid":"scheduled-task-page"},$(ru,{title:"定时任务",eyebrow:`${(l||[]).length} Schedules`},(l||[]).length===0?$(wu,{title:"暂无定时任务",text:"创建 daily / dispatch / PGDATA backup 任务后会在这里展示下一次执行时间和最近结果"}):$("div",{className:"schedule-card-grid"},(l||[]).map((q)=>$("article",{key:q.id,className:"schedule-card","data-testid":`schedule-row-${ff(q.id)}`},$("div",{className:"node-card-head"},$("strong",null,q.name||q.id),$(Wu,{status:q.enabled?"online":"warn"},q.enabled?"enabled":"disabled")),$("code",null,q.id),$("dl",null,$("dt",null,"计划"),$("dd",null,jC(q.schedule)),$("dt",null,"动作"),$("dd",null,NC(q.action)),$("dt",null,"下次执行"),$("dd",null,Ll(q.nextRunAt)),$("dt",null,"最近执行"),$("dd",null,q.lastRunAt?`${Ll(q.lastRunAt)} / ${q.lastRunId||"--"}`:"--")),$("div",{className:"dispatch-actions"},$("button",{type:"button",className:"ghost-btn",disabled:y,onClick:()=>w(q)},"编辑"),$("button",{type:"button",className:"ghost-btn",disabled:y,onClick:()=>m(q),"data-testid":`schedule-run-${ff(q.id)}`},"手动触发"),$("button",{type:"button",className:"ghost-btn danger",disabled:y,onClick:()=>Q(q)},"删除"),$(eu,{title:`Schedule ${q.id}`,data:q,onOpen:n})))))),$(ru,{title:t.id?"配置定时任务":"新建定时任务",eyebrow:"CRUD"},$("form",{className:"dispatch-form schedule-form",onSubmit:J},$("label",null,"ID",$("input",{value:t.id,onChange:(q)=>U("id",q.target.value)})),$("label",null,"名称",$("input",{value:t.name,onChange:(q)=>U("name",q.target.value)})),$("label",null,"每日执行时间 UTC",$("input",{value:t.timeOfDay,placeholder:"03:30",onChange:(q)=>U("timeOfDay",q.target.value)})),$("label",null,"启用",$("select",{value:t.enabled?"true":"false",onChange:(q)=>U("enabled",q.target.value==="true")},$("option",{value:"true"},"enabled"),$("option",{value:"false"},"disabled"))),$("label",null,"动作类型",$("select",{value:t.actionType,onChange:(q)=>U("actionType",q.target.value)},$("option",{value:"pgdata_backup"},"PGDATA 备份到百度网盘"),$("option",{value:"dispatch"},"Provider Dispatch"))),t.actionType==="pgdata_backup"?[$("label",{key:"remote"},"网盘根目录",$("input",{value:t.remoteBaseDir,onChange:(q)=>U("remoteBaseDir",q.target.value)})),$("label",{key:"staging"},"本地 staging 子目录",$("input",{value:t.stagingSubdir,onChange:(q)=>U("stagingSubdir",q.target.value)}))]:[$("label",{key:"provider"},"Provider",$("select",{value:t.providerId,onChange:(q)=>U("providerId",q.target.value)},(r||[]).map((q)=>$("option",{key:q.providerId,value:q.providerId},`${q.name} / ${q.providerId}`)))),$("label",{key:"command"},"Command",$("select",{value:t.command,onChange:(q)=>U("command",q.target.value)},$("option",{value:"echo"},"echo"),$("option",{value:"docker.ps"},"docker.ps"),$("option",{value:"host.ssh"},"host.ssh"),$("option",{value:"microservice.http"},"microservice.http"))),$("label",{key:"payload",className:"raw-editor-label"},"Payload JSON",$("textarea",{className:"raw-editor",value:t.payloadJson,onChange:(q)=>U("payloadJson",q.target.value)}))],$("label",null,"超时 ms",$("input",{value:t.timeoutMs,onChange:(q)=>U("timeoutMs",q.target.value)})),$("label",{className:"raw-editor-label"},"描述",$("textarea",{className:"raw-editor compact",value:t.description,onChange:(q)=>U("description",q.target.value)})),$("div",{className:"dispatch-actions"},$("button",{type:"button",className:"ghost-btn",disabled:y,onClick:()=>i(vG(r||[]))},"重置"),$("button",{type:"submit",disabled:y||!t.id},y?"保存中":"保存任务")),F?$("p",{className:"muted paragraph"},F):null,$(el,{error:_,wide:!0}))),$(ru,{title:"历史执行记录",eyebrow:`${N.length} Runs`},N.length===0?$(wu,{title:"暂无执行记录",text:"定时触发或手动触发后会生成 run history"}):$("div",{className:"table-wrap"},$("table",{className:"task-history-table schedule-run-table"},$("thead",null,$("tr",null,$("th",null,"状态"),$("th",null,"任务"),$("th",null,"触发"),$("th",null,"耗时"),$("th",null,"结果摘要"),$("th",null,"更新时间"),$("th",null,"操作"))),$("tbody",null,N.map((q)=>$("tr",{key:q.id,"data-testid":`schedule-run-row-${ff(q.id)}`},$("td",null,$(Wu,{status:JC(q.status)},q.status)),$("td",null,$("strong",null,q.scheduleId),$("code",null,q.id),q.taskId?$("code",null,q.taskId):null),$("td",null,q.trigger||"--"),$("td",null,UC(q)),$("td",null,$(Ji,{data:q.result||q.error,empty:"无结果"})),$("td",null,Ll(q.updatedAt)),$("td",null,$(eu,{title:`Schedule Run ${q.id}`,data:q,onOpen:n})))))))))}function mC({data:l}){let u=l.overview||{};return $("div",{className:"page-grid topology-grid"},$(ru,{title:"公开入口",eyebrow:"Public"},$("div",{className:"endpoint-list"},$("article",null,$("b",null,"Frontend"),$("span",null,vl.frontendPublicUrl||window.location.origin),$(Wu,{status:"online"},"public")),$("article",null,$("b",null,"Provider Ingress"),$("span",null,vl.providerIngressPublicUrl||"ws://public/ws/provider"),$(Wu,{status:"online"},"public")))),$(ru,{title:"内部服务",eyebrow:"Docker Network Only"},$("div",{className:"endpoint-list"},$("article",null,$("b",null,"backend-core API"),$("span",null,"http://backend-core:8080"),$(Wu,{status:"internal"},"internal")),$("article",null,$("b",null,"database"),$("span",null,"postgres://database:5432/unidesk"),$(Wu,{status:"internal"},"internal")))),$(ru,{title:"运行态",eyebrow:"Runtime"},$("div",{className:"metric-grid"},$(Qu,{label:"DB Ready",value:u.dbReady?"YES":"NO",hint:"internal health"}),$(Qu,{label:"Online Nodes",value:u.onlineNodeCount??0,hint:"provider-gateway self-link"}))))}function wC({session:l}){return $(ru,{title:"认证策略",eyebrow:"Frontend Login"},$("div",{className:"policy-grid"},$("article",null,$("span",null,"默认账号"),$("strong",null,vl.authUsername||"admin")),$("article",null,$("span",null,"当前会话"),$("strong",null,l?.user?.username||"--")),$("article",null,$("span",null,"Session TTL"),$("strong",null,`${vl.sessionTtlSeconds||0}s`)),$("article",null,$("span",null,"API 访问"),$("strong",null,"同源 Cookie 保护"))),$("p",{className:"muted paragraph"},"浏览器只访问 frontend 同源接口;frontend 容器使用 Docker 内网代理 backend-core API。"))}function qC(){return $(ru,{title:"安全边界",eyebrow:"Exposure Rule"},$("div",{className:"security-board"},$("article",{className:"allow"},$("b",null,"允许公网"),$("span",null,"frontend 登录入口"),$("span",null,"provider ingress WebSocket/health")),$("article",{className:"deny"},$("b",null,"禁止公网"),$("span",null,"backend-core REST API"),$("span",null,"PostgreSQL database")),$("article",null,$("b",null,"数据库卷"),$("span",null,"named volume unidesk_pgdata_10gb"),$("span",null,"CLI stop/start 不删除数据卷"))))}function LC({activeModule:l,activeTab:u,data:r,session:f,refresh:n,onRaw:t,onNavigate:i}){if(l==="ops"&&u==="status")return $(PP,{data:r,onRaw:t,onNavigate:i});if(l==="ops"&&u==="performance")return $(eP,{onRaw:t});if(l==="ops"&&u==="events")return $(hP,{events:r.events,onRaw:t});if(l==="ops"&&u==="logs")return $(MP,{logs:r.logs,onRaw:t});if(l==="nodes"&&u==="list")return $(sP,{nodes:r.nodes,onRaw:t});if(l==="nodes"&&u==="monitor")return $(bP,{nodes:r.nodes,systemStatuses:r.systemStatuses,tasks:r.tasks,onRaw:t,refresh:n});if(l==="nodes"&&u==="docker")return $(tC,{nodes:r.nodes,dockerStatuses:r.dockerStatuses,onRaw:t});if(l==="nodes"&&u==="gateway")return $(rC,{nodes:r.nodes,tasks:r.tasks,onRaw:t});if(l==="nodes"&&u==="labels")return $(RP,{nodes:r.nodes});if(l==="nodes"&&u==="heartbeats")return $(xP,{nodes:r.nodes});if(l==="tasks"&&u==="dispatch")return $(cC,{nodes:r.nodes,onDispatched:n,onRaw:t});if(l==="tasks"&&u==="scheduled")return $(QC,{schedules:r.schedules,scheduleRuns:r.scheduleRuns,nodes:r.nodes,refresh:n,onRaw:t});if(l==="tasks"&&u==="pending")return $(_C,{tasks:r.pendingTasks,onRaw:t});if(l==="tasks"&&u==="history")return $(AC,{tasks:r.tasks,onRaw:t});if(l==="tasks"&&u==="results")return $(FC,{tasks:r.tasks,onRaw:t});if(l==="apps"&&u==="catalog")return $(yC,{microservices:r.microservices,onRaw:t,onNavigate:i});if(l==="apps"&&u==="todo-note")return $(pG,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="findjob")return $(Um,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="pipeline")return $(wG,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="met-nonlinear")return $(Lm,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="claudeqq")return $(DU,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="baidu-netdisk")return $(ZU,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="filebrowser")return $(Jm,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="oa-event-flow")return $(Bm,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="k3sctl")return $(DG,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl,onNavigate:i});if(l==="apps"&&u==="code-queue")return $(um,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl,initialTasksData:wP});if(l==="apps"&&u==="mdtodo")return $(Km,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="decision-center")return $($m,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="apps"&&u==="project-manager")return $(GG,{microservices:r.microservices,onRaw:t,apiBaseUrl:vl.apiBaseUrl});if(l==="config"&&u==="topology")return $(mC,{data:r});if(l==="config"&&u==="auth")return $(wC,{session:f});if(l==="config"&&u==="security")return $(qC);return $(wu,{title:"未找到页面",text:"请选择左侧主模块和顶部子功能标签"})}function GC({session:l,onLogout:u}){let r=G5(Cf,window.location.pathname),[f,n]=Il(r.moduleId),[t,i]=Il({...z1,[r.moduleId]:r.tabId}),[y,c]=Il({overview:null,nodes:[],systemStatuses:[],dockerStatuses:[],microservices:[],events:[],tasks:[],pendingTasks:[],schedules:[],scheduleRuns:[],logs:[]}),[_,A]=Il({ok:!1,text:"连接中"}),[F,j]=Il(null),[N,U]=Il(new Date),[w,G]=Il(null),[J,Q]=Il(!1),[m,q]=Il(!1),W=Ni.default.useRef(!1),p=Cf.moduleById[f]||Cf.modules[0],O=t[f]||z1[f]||p.tabs[0].id,Z=Array.isArray(y.microservices)?y.microservices:[],V=Z.length===0&&f==="apps"&&O==="code-queue"?[qP]:Z,P=V===Z?y:{...y,microservices:V},H=f==="apps"?V.find((h)=>String(h?.id||"")===(O==="k3sctl"?"k3sctl-adapter":O)):null,B=H?iW(H):{},C=p.tabs.find((h)=>h.id===O)?.label||O,E=H?[{key:"microservice",label:"用户服务",value:`${C} ${B.providerStatus==="online"?"在线":B.providerStatus||"未知"}`,tone:B.providerStatus==="online"?"ok":"warn",testId:"active-microservice-status"}]:[];async function D(){if(W.current)return;W.current=!0,q(!0);try{let h=[],s=(wl,El)=>{h.push([wl,Tl(El)])},ul=f==="ops"&&O==="status",tl=ul||f==="config"&&O==="topology",Al=ul||f==="nodes"||f==="tasks"&&(O==="dispatch"||O==="scheduled"),Kl=f==="apps"&&O!=="code-queue";if(tl)s("overview",`${vl.apiBaseUrl}/overview`);if(Al)s("nodes",`${vl.apiBaseUrl}/nodes`);if(f==="nodes"&&O==="monitor")s("systemStatuses",`${vl.apiBaseUrl}/nodes/system-status?limit=60`),s("tasks",`${vl.apiBaseUrl}/tasks?limit=120&summary=1`);else if(f==="nodes"&&O==="docker")s("dockerStatuses",`${vl.apiBaseUrl}/nodes/docker-status`);else if(f==="nodes"&&O==="gateway")s("tasks",`${vl.apiBaseUrl}/tasks?limit=300&summary=1`);else if(f==="tasks"&&O==="scheduled")s("schedules",`${vl.apiBaseUrl}/schedules?limit=100`),s("scheduleRuns",`${vl.apiBaseUrl}/schedules/runs?limit=100`);else if(f==="tasks"&&O==="pending")s("pendingTasks",`${vl.apiBaseUrl}/tasks?status=pending&limit=100&summary=1`);else if(f==="tasks"&&(O==="history"||O==="results"))s("tasks",`${vl.apiBaseUrl}/tasks?limit=300&summary=1`);else if(ul)s("tasks",`${vl.apiBaseUrl}/tasks?limit=8&lite=1`),s("pendingTasks",`${vl.apiBaseUrl}/tasks?status=pending&limit=20&lite=1`);if(Kl)s("microservices",`${vl.apiBaseUrl}/microservices`);if(f==="ops"&&O==="events")s("events",`${vl.apiBaseUrl}/events?limit=100`);if(f==="ops"&&O==="logs")s("logs","/logs?limit=100");await Promise.all(h.map(async([wl,El])=>{let M=await El,d={};if(wl==="overview")d.overview=M;if(wl==="nodes")d.nodes=M.nodes||[];if(wl==="systemStatuses")d.systemStatuses=M.systemStatuses||[];if(wl==="dockerStatuses")d.dockerStatuses=M.dockerStatuses||[];if(wl==="microservices")d.microservices=M.microservices||[];if(wl==="events")d.events=M.events||[];if(wl==="tasks")d.tasks=M.tasks||[];if(wl==="pendingTasks")d.pendingTasks=M.tasks||[];if(wl==="schedules")d.schedules=M.schedules||[];if(wl==="scheduleRuns")d.scheduleRuns=M.runs||[];if(wl==="logs")d.logs=M.logs||[];c((nl)=>({...nl,...d}))})),A({ok:!0,text:"核心在线"}),j(new Date)}catch(h){if(A({ok:!1,text:zl(h,"连接失败")}),h.status===401)u(!1)}finally{W.current=!1,q(!1)}}Bn(()=>{let h=()=>{if(!XG())return;D()};h();let s=setInterval(h,GP(f,O)),ul=()=>{if(XG())h()};return document.addEventListener("visibilitychange",ul),()=>{clearInterval(s),document.removeEventListener("visibilitychange",ul)}},[f,O]),Bn(()=>{let h=setInterval(()=>U(new Date),1000);return()=>clearInterval(h)},[]),Bn(()=>{let h=Om(Cf,window.location.pathname);if(h&&window.location.pathname!==h)window.history.replaceState(null,"",h)},[]),Bn(()=>{let h=()=>{let s=G5(Cf,window.location.pathname);n(s.moduleId),i((ul)=>({...ul,[s.moduleId]:s.tabId})),G(null)};return window.addEventListener("popstate",h),()=>window.removeEventListener("popstate",h)},[]),Bn(()=>{window.scrollTo({top:0,left:0,behavior:"auto"})},[f,O]);function Y(h,s,ul="push"){let tl=Cf.moduleById[h]?h:Cf.fallbackTarget.moduleId,Al=Cf.moduleById[tl]?.tabs.some((wl)=>wl.id===s)?s:z1[tl]||Cf.moduleById[tl]?.tabs[0]?.id||Cf.fallbackTarget.tabId;n(tl),i((wl)=>({...wl,[tl]:Al}));let Kl=e3(Cf,tl,Al);if(window.location.pathname!==Kl){let wl=ul==="replace"?"replaceState":"pushState";window.history[wl](null,"",Kl)}}function v(h,s){G({title:h,data:s})}let[K,X]=Il(!1),{unreadCount:I,notifications:o}=Xr(),fl=o.length>0?o[o.length-1]:null,yl=IG(YG);return $("div",{className:`shell ${J?"rail-collapsed":""} ${yl?"dev-shell":""}`,"data-testid":"app-shell"},$(YP,{activeModule:f,activeTabs:t,onNavigate:Y,collapsed:J,onToggle:()=>Q((h)=>!h)}),$("main",{className:"workspace"},$(VP,{connection:_,lastRefresh:F,onRefresh:D,onLogout:()=>u(!0),session:l,clock:N,activeStatusItems:E,onNotificationToggle:()=>X((h)=>!h),unreadCount:I,environment:YG}),$(XP,{module:p,activeTab:O,onNavigate:Y}),$(Nj.Provider,{value:m},$(LC,{activeModule:f,activeTab:O,data:P,session:l,refresh:D,onRaw:v,onNavigate:Y}))),$(BP,{raw:w,onClose:()=>G(null)}),fl&&$(SG,{key:fl.id,notification:fl}),K&&$(VG,{onClose:()=>X(!1)}))}function WC(){let[l,u]=Il(!0),[r,f]=Il(null);async function n(){u(!0);try{let i=await Tl("/api/session");f(i.authenticated?i:null)}catch{f(null)}finally{u(!1)}}async function t(i){if(i)try{await Tl("/logout",{method:"POST"})}catch{}f(null)}if(Bn(()=>{n()},[]),l)return $("main",{className:"loading-screen"},$("div",{className:"brand-mark"},"UD"),$("span",null,"加载会话"));if(!r)return $(DP,{onLogin:f});return $(OU,null,$(GC,{session:r,onLogout:t}))}var jW=document.getElementById("root");if(jW===null)throw Error("root element not found");gG.createRoot(jW).render($(WC));})(); + + ${t} + ${p} + ${m} + ${D} + ${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));})(); diff --git a/src/components/frontend/public/style.css b/src/components/frontend/public/style.css index 8bb64ec3..cbe47120 100644 --- a/src/components/frontend/public/style.css +++ b/src/components/frontend/public/style.css @@ -1456,6 +1456,68 @@ input:focus, select:focus, textarea:focus { border-color: var(--accent-2); } display: grid; gap: 10px; } +.hwlab-page { + grid-template-columns: 1fr; +} +.hwlab-page .panel-body { + display: grid; + gap: 10px; +} +.hwlab-hero { + display: grid; + grid-template-columns: minmax(0, 1.2fr) minmax(240px, 0.8fr); + gap: 10px; + align-items: stretch; +} +.hwlab-hero-copy { + display: grid; + gap: 4px; + min-width: 0; +} +.hwlab-hero-copy h2 { + font-size: 22px; + letter-spacing: 0.06em; + text-transform: uppercase; +} +.hwlab-hero-copy .paragraph { + max-width: 60ch; +} +.hwlab-actions { + display: flex; + flex-wrap: wrap; + gap: 8px; + align-items: start; + align-content: start; +} +.hwlab-actions .ghost-btn, +.hwlab-actions .primary-btn { + width: max-content; +} +.hwlab-entry-list { + grid-template-columns: 1fr; +} +.hwlab-entry-card { + display: grid; + gap: 4px; + min-width: 0; + padding: 8px; + border: 1px solid var(--line-soft); + background: var(--panel-3); +} +.hwlab-entry-card b { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.hwlab-entry-card span { + color: var(--muted); +} +.hwlab-entry-actions { + margin-top: 6px; +} +.hwlab-url { + word-break: break-all; +} .microservice-actions, .inline-actions { display: flex; flex-wrap: wrap; diff --git a/src/components/frontend/src/app.tsx b/src/components/frontend/src/app.tsx index e88c63c9..7739ed11 100644 --- a/src/components/frontend/src/app.tsx +++ b/src/components/frontend/src/app.tsx @@ -7,6 +7,7 @@ import { CodeQueuePage } from "./code-queue"; import { DecisionCenterPage } from "./decision-center"; import { FileBrowserPage } from "./filebrowser"; import { FindJobPage } from "./findjob"; +import { HWLAB_URL, HwlabPage } from "./hwlab"; import { MetNonlinearPage } from "./met-nonlinear"; import { MdtodoPage } from "./mdtodo"; import { canonicalizeKnownRoute, createRouteRegistry, DEFAULT_ACTIVE_TABS, MODULES, pathForTarget, resolveRouteTarget } from "./navigation"; @@ -1654,6 +1655,31 @@ function MicroserviceCatalogPage({ microservices, onRaw, onNavigate }: AnyRecord h(MetricCard, { label: "集成前端", value: microservices.filter((service: any) => service.frontend?.integrated).length, hint: "UniDesk React 页面" }), ), ), + h(Panel, { title: "外部静态入口", eyebrow: "External Link" }, + h("div", { className: "endpoint-list hwlab-entry-list" }, + h("article", { className: "hwlab-entry-card", "data-testid": "hwlab-entry-card" }, + h("b", null, "HWLAB"), + h("span", null, HWLAB_URL), + h("span", null, "external static link"), + h("div", { className: "microservice-actions hwlab-entry-actions" }, + h("button", { + type: "button", + className: "ghost-btn", + "data-testid": "hwlab-open-current-from-catalog", + onClick: () => window.location.assign(HWLAB_URL), + }, "当前窗口"), + h("a", { + className: "ghost-btn", + href: HWLAB_URL, + target: "_blank", + rel: "noreferrer", + "data-testid": "hwlab-open-new-from-catalog", + }, "新窗口"), + ), + ), + ), + h("p", { className: "muted paragraph" }, "该入口仅用于外部静态跳转,不会进入 microservice health、proxy 或运行态探测。"), + ), h(Panel, { title: "服务映射", eyebrow: "Repo Reference + Runtime" }, microservices.length === 0 ? h(EmptyState, { title: "暂无用户服务", text: "在 config.json 的 microservices 中登记用户服务的 provider、仓库引用和后端映射" }) : h("div", { className: "table-wrap" }, h("table", { className: "microservice-table" }, @@ -2189,6 +2215,7 @@ function WorkArea({ activeModule, activeTab, data, session, refresh, onRaw, onNa if (activeModule === "tasks" && activeTab === "history") return h(TaskHistoryPage, { tasks: data.tasks, onRaw }); if (activeModule === "tasks" && activeTab === "results") return h(TaskResultsPage, { tasks: data.tasks, onRaw }); if (activeModule === "apps" && activeTab === "catalog") return h(MicroserviceCatalogPage, { microservices: data.microservices, onRaw, onNavigate }); + if (activeModule === "apps" && activeTab === "hwlab") return h(HwlabPage, {}); if (activeModule === "apps" && activeTab === "todo-note") return h(TodoNotePage, { microservices: data.microservices, onRaw, apiBaseUrl: cfg.apiBaseUrl }); if (activeModule === "apps" && activeTab === "findjob") return h(FindJobPage, { microservices: data.microservices, onRaw, apiBaseUrl: cfg.apiBaseUrl }); if (activeModule === "apps" && activeTab === "pipeline") return h(PipelinePage, { microservices: data.microservices, onRaw, apiBaseUrl: cfg.apiBaseUrl }); diff --git a/src/components/frontend/src/hwlab.tsx b/src/components/frontend/src/hwlab.tsx new file mode 100644 index 00000000..b5d2e42a --- /dev/null +++ b/src/components/frontend/src/hwlab.tsx @@ -0,0 +1,103 @@ +import React from "react"; +import { LoadingTitle } from "./loading-indicator"; + +type AnyRecord = Record; + +const h = React.createElement; + +export const HWLAB_URL = "http://74.48.78.17:6666"; + +function StatusBadge({ status, children }: AnyRecord) { + const normalized = String(status || "unknown").toLowerCase(); + return h("span", { className: `status-badge ${normalized}` }, children || status || "unknown"); +} + +function Panel({ title, eyebrow, actions, children, className }: AnyRecord) { + return h("section", { className: `panel ${className || ""}` }, + h("div", { className: "panel-head" }, + h("div", null, + eyebrow ? h("p", { className: "panel-eyebrow" }, eyebrow) : null, + h(LoadingTitle, { title, loading: false }), + ), + actions ? h("div", { className: "panel-actions" }, actions) : null, + ), + h("div", { className: "panel-body" }, children), + ); +} + +function EmptyState({ title, text }: AnyRecord) { + return h("div", { className: "empty-state" }, h("strong", null, title), h("span", null, text)); +} + +function ActionLink({ href, children, testId, primary = false }: AnyRecord) { + return h("a", { + className: primary ? "primary-btn compact" : "ghost-btn compact", + href, + target: "_blank", + rel: "noreferrer", + "data-testid": testId, + }, children); +} + +function ActionButton({ onClick, children, testId, primary = false }: AnyRecord) { + return h("button", { + type: "button", + className: primary ? "primary-btn compact" : "ghost-btn compact", + onClick, + "data-testid": testId, + }, children); +} + +export function HwlabPage(): any { + return h("div", { className: "microservice-page hwlab-page", "data-testid": "hwlab-page" }, + h(Panel, { + title: "HWLAB", + eyebrow: "External Static Entry", + actions: h("span", { className: "panel-link-badge" }, + h(StatusBadge, { status: "external" }, "external"), + ), + }, + h("div", { className: "hwlab-hero" }, + h("div", { className: "hwlab-hero-copy" }, + h("p", { className: "panel-eyebrow" }, "Static Link"), + h("h2", null, "HWLAB"), + h("p", { className: "muted paragraph" }, "这是一个外部静态入口,不经过 UniDesk 后端代理,不纳入 microservice health。"), + ), + h("div", { className: "hwlab-actions" }, + h(ActionButton, { + primary: true, + testId: "hwlab-open-current", + onClick: () => window.location.assign(HWLAB_URL), + }, "当前窗口打开"), + h(ActionLink, { href: HWLAB_URL, testId: "hwlab-open-new" }, "新窗口打开"), + ), + ), + h("div", { className: "metric-grid hwlab-metrics" }, + h("article", { className: "metric-card" }, + h("div", { className: "metric-label" }, "入口类型"), + h("div", { className: "metric-value" }, "external"), + h("div", { className: "metric-hint" }, "static link only"), + ), + h("article", { className: "metric-card" }, + h("div", { className: "metric-label" }, "目标 URL"), + h("div", { className: "metric-value hwlab-url" }, HWLAB_URL), + h("div", { className: "metric-hint" }, "fixed destination"), + ), + h("article", { className: "metric-card" }, + h("div", { className: "metric-label" }, "后端依赖"), + h("div", { className: "metric-value" }, "none"), + h("div", { className: "metric-hint" }, "no proxy / no health"), + ), + h("article", { className: "metric-card" }, + h("div", { className: "metric-label" }, "打开方式"), + h("div", { className: "metric-value" }, "current or new tab"), + h("div", { className: "metric-hint" }, "same style as catalog"), + ), + ), + h(EmptyState, { + title: "外部入口说明", + text: "HWLAB 只作为静态跳转目标展示在前端,不会登记到用户服务 health、proxy 或运行态数据中。", + }), + ), + ); +} diff --git a/src/components/frontend/src/navigation.ts b/src/components/frontend/src/navigation.ts index 28110df6..8ceadffd 100644 --- a/src/components/frontend/src/navigation.ts +++ b/src/components/frontend/src/navigation.ts @@ -62,6 +62,7 @@ export const MODULES: UniDeskModuleDefinition[] = [ ] }, { 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" },